Merge "Revert "Removed useless JobQueue return values""
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Wed, 16 Apr 2014 17:50:07 +0000 (17:50 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Wed, 16 Apr 2014 17:50:07 +0000 (17:50 +0000)
1968 files changed:
.gitignore
.jshintignore
.jshintrc
CREDITS
HISTORY
RELEASE-NOTES-1.23
RELEASE-NOTES-1.24 [new file with mode: 0644]
docs/hooks.txt
docs/kss/Makefile [new file with mode: 0644]
docs/kss/README.txt [new file with mode: 0644]
docs/kss/package.json [new file with mode: 0644]
docs/kss/scripts/nodecheck.sh [new file with mode: 0755]
docs/kss/styleguide-template/index.html [new file with mode: 0644]
docs/kss/styleguide-template/public/kss.less [new file with mode: 0644]
docs/kss/styleguide-template/public/less.js [new file with mode: 0644]
img_auth.php
includes/AutoLoader.php
includes/Block.php
includes/CategoryPage.php
includes/CategoryViewer.php
includes/Collation.php
includes/DefaultSettings.php
includes/EditPage.php
includes/Export.php
includes/FileDeleteForm.php
includes/GlobalFunctions.php
includes/Html.php
includes/HtmlFormatter.php
includes/HttpFunctions.php
includes/Linker.php
includes/MagicWord.php
includes/Message.php
includes/MimeMagic.php
includes/OutputPage.php
includes/PHPVersionError.php
includes/Preferences.php
includes/PrefixSearch.php
includes/Setup.php
includes/Skin.php
includes/SkinTemplate.php
includes/Status.php
includes/Title.php
includes/TitleArray.php
includes/TitleArrayFromResult.php
includes/UserArray.php
includes/UserArrayFromResult.php
includes/WebResponse.php
includes/Wiki.php
includes/WikiFilePage.php
includes/WikiPage.php
includes/Xml.php
includes/ZhConversion.php
includes/actions/Action.php
includes/actions/CachedAction.php
includes/actions/CreditsAction.php
includes/actions/FormAction.php
includes/actions/FormlessAction.php
includes/actions/HistoryAction.php
includes/actions/InfoAction.php
includes/actions/RawAction.php
includes/actions/WatchAction.php
includes/api/ApiBase.php
includes/api/ApiFeedRecentChanges.php
includes/api/ApiHelp.php
includes/api/ApiMove.php
includes/api/ApiOpenSearch.php
includes/api/ApiQuery.php
includes/api/ApiQueryAllImages.php
includes/api/ApiQueryBlocks.php
includes/api/ApiQueryCategoryMembers.php
includes/api/ApiQueryDeletedrevs.php
includes/api/ApiQueryLogEvents.php
includes/api/ApiQueryPrefixSearch.php [new file with mode: 0644]
includes/api/ApiQueryProtectedTitles.php
includes/api/ApiQueryRandom.php
includes/api/ApiQueryRecentChanges.php
includes/api/ApiQuerySiteinfo.php
includes/api/ApiQueryUserContributions.php
includes/api/ApiQueryWatchlist.php
includes/changes/ChangesList.php
includes/changes/EnhancedChangesList.php
includes/changes/RCCacheEntry.php
includes/changes/RCCacheEntryFactory.php
includes/changes/RecentChange.php
includes/clientpool/RedisConnectionPool.php
includes/composer/ComposerHookHandler.php
includes/content/AbstractContent.php
includes/content/Content.php
includes/content/WikitextContent.php
includes/context/ContextSource.php
includes/context/IContextSource.php
includes/context/RequestContext.php
includes/dao/DBAccessBase.php
includes/db/Database.php
includes/db/DatabaseMssql.php
includes/db/DatabaseOracle.php
includes/db/LBFactory.php
includes/deferred/LinksUpdate.php
includes/deferred/SqlDataUpdate.php
includes/diff/DiffFormatter.php
includes/diff/DifferenceEngine.php
includes/exception/HttpError.php
includes/exception/MWException.php
includes/exception/MWExceptionHandler.php
includes/externalstore/ExternalStore.php
includes/externalstore/ExternalStoreDB.php
includes/externalstore/ExternalStoreMedium.php
includes/filebackend/FileBackend.php
includes/filebackend/FileBackendMultiWrite.php
includes/filebackend/filejournal/FileJournal.php
includes/filerepo/ForeignAPIRepo.php
includes/filerepo/file/File.php
includes/filerepo/file/LocalFile.php
includes/gallery/ImageGalleryBase.php
includes/htmlform/HTMLCheckField.php
includes/htmlform/HTMLMultiSelectField.php
includes/htmlform/HTMLSelectAndOtherField.php
includes/htmlform/HTMLSelectOrOtherField.php
includes/installer/CliInstaller.php
includes/installer/DatabaseUpdater.php
includes/installer/MysqlInstaller.php
includes/installer/PostgresInstaller.php
includes/installer/WebInstaller.php
includes/installer/WebInstallerOutput.php
includes/installer/WebInstallerPage.php
includes/installer/i18n/af.json
includes/installer/i18n/aln.json
includes/installer/i18n/am.json
includes/installer/i18n/an.json
includes/installer/i18n/ang.json
includes/installer/i18n/ar.json
includes/installer/i18n/arc.json
includes/installer/i18n/ary.json
includes/installer/i18n/arz.json
includes/installer/i18n/as.json
includes/installer/i18n/ast.json
includes/installer/i18n/avk.json
includes/installer/i18n/az.json
includes/installer/i18n/ba.json
includes/installer/i18n/bar.json
includes/installer/i18n/bcc.json
includes/installer/i18n/bcl.json
includes/installer/i18n/be-tarask.json
includes/installer/i18n/be.json
includes/installer/i18n/bg.json
includes/installer/i18n/bjn.json
includes/installer/i18n/bn.json
includes/installer/i18n/bpy.json
includes/installer/i18n/br.json
includes/installer/i18n/bs.json
includes/installer/i18n/ca.json
includes/installer/i18n/ce.json
includes/installer/i18n/ceb.json
includes/installer/i18n/ckb.json
includes/installer/i18n/cps.json
includes/installer/i18n/crh-cyrl.json
includes/installer/i18n/crh-latn.json
includes/installer/i18n/cs.json
includes/installer/i18n/csb.json
includes/installer/i18n/cu.json
includes/installer/i18n/cv.json
includes/installer/i18n/cy.json
includes/installer/i18n/da.json
includes/installer/i18n/de-formal.json
includes/installer/i18n/de.json
includes/installer/i18n/diq.json
includes/installer/i18n/dsb.json
includes/installer/i18n/dtp.json
includes/installer/i18n/el.json
includes/installer/i18n/en-gb.json
includes/installer/i18n/en.json
includes/installer/i18n/eo.json
includes/installer/i18n/es-formal.json
includes/installer/i18n/es.json
includes/installer/i18n/et.json
includes/installer/i18n/eu.json
includes/installer/i18n/ext.json
includes/installer/i18n/fa.json
includes/installer/i18n/fi.json
includes/installer/i18n/fo.json
includes/installer/i18n/fr.json
includes/installer/i18n/frc.json
includes/installer/i18n/frp.json
includes/installer/i18n/frr.json
includes/installer/i18n/fur.json
includes/installer/i18n/fy.json
includes/installer/i18n/ga.json
includes/installer/i18n/gag.json
includes/installer/i18n/gan-hans.json
includes/installer/i18n/gan-hant.json
includes/installer/i18n/gd.json
includes/installer/i18n/gl.json
includes/installer/i18n/gom-latn.json
includes/installer/i18n/grc.json
includes/installer/i18n/gsw.json
includes/installer/i18n/gu.json
includes/installer/i18n/gv.json
includes/installer/i18n/hak.json
includes/installer/i18n/haw.json
includes/installer/i18n/he.json
includes/installer/i18n/hi.json
includes/installer/i18n/hif-latn.json
includes/installer/i18n/hil.json
includes/installer/i18n/hr.json
includes/installer/i18n/hsb.json
includes/installer/i18n/ht.json
includes/installer/i18n/hu-formal.json
includes/installer/i18n/hu.json
includes/installer/i18n/hy.json
includes/installer/i18n/ia.json
includes/installer/i18n/id.json
includes/installer/i18n/ie.json
includes/installer/i18n/ig.json
includes/installer/i18n/ilo.json
includes/installer/i18n/io.json
includes/installer/i18n/is.json
includes/installer/i18n/it.json
includes/installer/i18n/ja.json
includes/installer/i18n/jam.json
includes/installer/i18n/jut.json
includes/installer/i18n/jv.json
includes/installer/i18n/ka.json
includes/installer/i18n/kaa.json
includes/installer/i18n/kbd-cyrl.json
includes/installer/i18n/khw.json
includes/installer/i18n/kiu.json
includes/installer/i18n/kk-arab.json
includes/installer/i18n/kk-cyrl.json
includes/installer/i18n/kk-latn.json
includes/installer/i18n/km.json
includes/installer/i18n/kn.json
includes/installer/i18n/ko.json
includes/installer/i18n/krc.json
includes/installer/i18n/ksh.json
includes/installer/i18n/ku-latn.json
includes/installer/i18n/lad.json
includes/installer/i18n/lb.json
includes/installer/i18n/lfn.json
includes/installer/i18n/lg.json
includes/installer/i18n/li.json
includes/installer/i18n/lo.json
includes/installer/i18n/lt.json
includes/installer/i18n/lv.json
includes/installer/i18n/lzh.json
includes/installer/i18n/lzz.json
includes/installer/i18n/mai.json
includes/installer/i18n/mdf.json
includes/installer/i18n/mg.json
includes/installer/i18n/mhr.json
includes/installer/i18n/min.json
includes/installer/i18n/mk.json
includes/installer/i18n/ml.json
includes/installer/i18n/mn.json
includes/installer/i18n/mr.json
includes/installer/i18n/ms.json
includes/installer/i18n/mt.json
includes/installer/i18n/my.json
includes/installer/i18n/myv.json
includes/installer/i18n/mzn.json
includes/installer/i18n/nah.json
includes/installer/i18n/nan.json
includes/installer/i18n/nb.json
includes/installer/i18n/nds-nl.json
includes/installer/i18n/nds.json
includes/installer/i18n/ne.json
includes/installer/i18n/nl-informal.json
includes/installer/i18n/nl.json
includes/installer/i18n/nn.json
includes/installer/i18n/no.json
includes/installer/i18n/oc.json
includes/installer/i18n/or.json
includes/installer/i18n/os.json
includes/installer/i18n/pa.json
includes/installer/i18n/pam.json
includes/installer/i18n/pcd.json
includes/installer/i18n/pdc.json
includes/installer/i18n/pl.json
includes/installer/i18n/pms.json
includes/installer/i18n/pnt.json
includes/installer/i18n/prg.json
includes/installer/i18n/ps.json
includes/installer/i18n/pt-br.json
includes/installer/i18n/pt.json
includes/installer/i18n/qqq.json
includes/installer/i18n/qu.json
includes/installer/i18n/rgn.json
includes/installer/i18n/rm.json
includes/installer/i18n/ro.json
includes/installer/i18n/roa-tara.json
includes/installer/i18n/ru.json
includes/installer/i18n/rue.json
includes/installer/i18n/sa.json
includes/installer/i18n/sah.json
includes/installer/i18n/sc.json
includes/installer/i18n/scn.json
includes/installer/i18n/sco.json
includes/installer/i18n/sdc.json
includes/installer/i18n/sei.json
includes/installer/i18n/sh.json
includes/installer/i18n/shi.json
includes/installer/i18n/si.json
includes/installer/i18n/sk.json
includes/installer/i18n/sl.json
includes/installer/i18n/sli.json
includes/installer/i18n/so.json
includes/installer/i18n/sq.json
includes/installer/i18n/sr-ec.json
includes/installer/i18n/sr-el.json
includes/installer/i18n/srn.json
includes/installer/i18n/ss.json
includes/installer/i18n/stq.json
includes/installer/i18n/su.json
includes/installer/i18n/sv.json
includes/installer/i18n/sw.json
includes/installer/i18n/szl.json
includes/installer/i18n/ta.json
includes/installer/i18n/tcy.json
includes/installer/i18n/te.json
includes/installer/i18n/tet.json
includes/installer/i18n/tg-cyrl.json
includes/installer/i18n/tg-latn.json
includes/installer/i18n/th.json
includes/installer/i18n/tk.json
includes/installer/i18n/tl.json
includes/installer/i18n/tly.json
includes/installer/i18n/tr.json
includes/installer/i18n/tt-cyrl.json
includes/installer/i18n/tt-latn.json
includes/installer/i18n/udm.json
includes/installer/i18n/ug-arab.json
includes/installer/i18n/uk.json
includes/installer/i18n/ur.json
includes/installer/i18n/uz.json
includes/installer/i18n/vec.json
includes/installer/i18n/vep.json
includes/installer/i18n/vi.json
includes/installer/i18n/vo.json
includes/installer/i18n/vro.json
includes/installer/i18n/wa.json
includes/installer/i18n/war.json
includes/installer/i18n/wo.json
includes/installer/i18n/wuu.json
includes/installer/i18n/xal.json
includes/installer/i18n/yi.json
includes/installer/i18n/yo.json
includes/installer/i18n/yue.json
includes/installer/i18n/zea.json
includes/installer/i18n/zh-hans.json
includes/installer/i18n/zh-hant.json
includes/installer/i18n/zh-hk.json
includes/installer/i18n/zh-tw.json
includes/jobqueue/JobQueue.php
includes/jobqueue/JobQueueDB.php
includes/jobqueue/JobQueueGroup.php
includes/jobqueue/JobQueueRedis.php
includes/jobqueue/jobs/AssembleUploadChunksJob.php
includes/jobqueue/jobs/HTMLCacheUpdateJob.php
includes/jobqueue/jobs/PublishStashedFileJob.php
includes/json/FormatJson.php
includes/libs/MultiHttpClient.php
includes/logging/DeleteLogFormatter.php
includes/logging/LogFormatter.php
includes/logging/LogPage.php
includes/logging/LogPager.php
includes/media/Bitmap_ClientOnly.php
includes/media/DjVu.php
includes/media/Exif.php
includes/media/GIF.php
includes/objectcache/MemcachedBagOStuff.php
includes/objectcache/MemcachedClient.php
includes/parser/CacheTime.php
includes/parser/CoreParserFunctions.php
includes/parser/DateFormatter.php
includes/parser/Parser.php
includes/parser/ParserCache.php
includes/parser/ParserOptions.php
includes/parser/Preprocessor_Hash.php
includes/parser/StripState.php
includes/poolcounter/PoolCounterRedis.php
includes/profiler/Profiler.php
includes/profiler/ProfilerMwprof.php
includes/profiler/ProfilerSimple.php [deleted file]
includes/profiler/ProfilerSimpleDB.php [new file with mode: 0644]
includes/profiler/ProfilerSimpleText.php
includes/profiler/ProfilerSimpleTrace.php
includes/profiler/ProfilerSimpleUDP.php
includes/rcfeed/RCFeedEngine.php
includes/resourceloader/ResourceLoader.php
includes/resourceloader/ResourceLoaderStartUpModule.php
includes/revisiondelete/RevisionDeleteUser.php
includes/revisiondelete/RevisionDeleter.php
includes/search/SearchEngine.php
includes/site/SiteSQLStore.php
includes/specialpage/ChangesListSpecialPage.php
includes/specialpage/FormSpecialPage.php
includes/specialpage/SpecialPage.php
includes/specials/SpecialActiveusers.php
includes/specials/SpecialAllpages.php
includes/specials/SpecialBlock.php
includes/specials/SpecialContributions.php
includes/specials/SpecialEmailuser.php
includes/specials/SpecialImport.php
includes/specials/SpecialListgrouprights.php
includes/specials/SpecialPrefixindex.php
includes/specials/SpecialProtectedpages.php
includes/specials/SpecialRecentchanges.php
includes/specials/SpecialRecentchangeslinked.php
includes/specials/SpecialRunJobs.php
includes/specials/SpecialSearch.php
includes/specials/SpecialUserrights.php
includes/specials/SpecialVersion.php
includes/specials/SpecialWatchlist.php
includes/title/TitleValue.php
includes/upload/UploadStash.php
includes/utils/UIDGenerator.php
languages/ConverterRule.php [new file with mode: 0644]
languages/Language.php
languages/LanguageConverter.php
languages/classes/LanguageSr.php
languages/i18n/ace.json
languages/i18n/af.json
languages/i18n/aln.json
languages/i18n/am.json
languages/i18n/an.json
languages/i18n/anp.json
languages/i18n/ar.json
languages/i18n/arc.json
languages/i18n/arz.json
languages/i18n/as.json
languages/i18n/ast.json
languages/i18n/avk.json
languages/i18n/az.json
languages/i18n/azb.json
languages/i18n/ba.json
languages/i18n/bar.json
languages/i18n/bbc-latn.json
languages/i18n/bcc.json
languages/i18n/bcl.json
languages/i18n/be-tarask.json
languages/i18n/be.json
languages/i18n/bg.json
languages/i18n/bjn.json
languages/i18n/bn.json
languages/i18n/bpy.json
languages/i18n/bqi.json
languages/i18n/br.json
languages/i18n/brh.json
languages/i18n/bs.json
languages/i18n/bug.json
languages/i18n/bxr.json
languages/i18n/ca.json
languages/i18n/cdo.json
languages/i18n/ce.json
languages/i18n/ckb.json
languages/i18n/co.json
languages/i18n/crh-cyrl.json
languages/i18n/crh-latn.json
languages/i18n/cs.json
languages/i18n/csb.json
languages/i18n/cy.json
languages/i18n/da.json
languages/i18n/de.json
languages/i18n/diq.json
languages/i18n/dsb.json
languages/i18n/dz.json
languages/i18n/egl.json
languages/i18n/el.json
languages/i18n/eml.json
languages/i18n/en.json
languages/i18n/eo.json
languages/i18n/es.json
languages/i18n/et.json
languages/i18n/eu.json
languages/i18n/ext.json
languages/i18n/fa.json
languages/i18n/ff.json
languages/i18n/fi.json
languages/i18n/fit.json
languages/i18n/fo.json
languages/i18n/fr.json
languages/i18n/frc.json
languages/i18n/frp.json
languages/i18n/frr.json
languages/i18n/fur.json
languages/i18n/fy.json
languages/i18n/ga.json
languages/i18n/gan-hans.json
languages/i18n/gan-hant.json
languages/i18n/gd.json
languages/i18n/gl.json
languages/i18n/gom-latn.json
languages/i18n/got.json
languages/i18n/gsw.json
languages/i18n/gu.json
languages/i18n/ha.json
languages/i18n/hak.json
languages/i18n/haw.json
languages/i18n/he.json
languages/i18n/hi.json
languages/i18n/hif-latn.json
languages/i18n/hr.json
languages/i18n/hsb.json
languages/i18n/hu.json
languages/i18n/hy.json
languages/i18n/ia.json
languages/i18n/id.json
languages/i18n/ik.json
languages/i18n/ilo.json
languages/i18n/io.json
languages/i18n/is.json
languages/i18n/it.json
languages/i18n/ja.json
languages/i18n/jbo.json
languages/i18n/jut.json
languages/i18n/jv.json
languages/i18n/ka.json
languages/i18n/kaa.json
languages/i18n/kab.json
languages/i18n/kg.json
languages/i18n/kiu.json
languages/i18n/kk-arab.json
languages/i18n/kk-cyrl.json
languages/i18n/kk-latn.json
languages/i18n/kl.json
languages/i18n/ko.json
languages/i18n/koi.json
languages/i18n/krc.json
languages/i18n/kri.json
languages/i18n/ksh.json
languages/i18n/la.json
languages/i18n/lb.json
languages/i18n/lez.json
languages/i18n/lg.json
languages/i18n/li.json
languages/i18n/liv.json
languages/i18n/loz.json
languages/i18n/lrc.json
languages/i18n/lt.json
languages/i18n/lv.json
languages/i18n/lzh.json
languages/i18n/lzz.json
languages/i18n/mai.json
languages/i18n/mdf.json
languages/i18n/mg.json
languages/i18n/min.json
languages/i18n/mk.json
languages/i18n/ml.json
languages/i18n/mn.json
languages/i18n/mo.json
languages/i18n/mrj.json
languages/i18n/ms.json
languages/i18n/mt.json
languages/i18n/na.json
languages/i18n/nan.json
languages/i18n/nb.json
languages/i18n/nds-nl.json
languages/i18n/nds.json
languages/i18n/ne.json
languages/i18n/new.json
languages/i18n/niu.json
languages/i18n/nl.json
languages/i18n/nn.json
languages/i18n/nov.json
languages/i18n/nv.json
languages/i18n/oc.json
languages/i18n/or.json
languages/i18n/pag.json
languages/i18n/pap.json
languages/i18n/pdt.json
languages/i18n/pih.json
languages/i18n/pl.json
languages/i18n/pms.json
languages/i18n/pnb.json
languages/i18n/prg.json
languages/i18n/ps.json
languages/i18n/pt-br.json
languages/i18n/pt.json
languages/i18n/qqq.json
languages/i18n/qu.json
languages/i18n/rgn.json
languages/i18n/rif.json
languages/i18n/rm.json
languages/i18n/rmy.json
languages/i18n/ro.json
languages/i18n/roa-tara.json
languages/i18n/ru.json
languages/i18n/rue.json
languages/i18n/rup.json
languages/i18n/ruq-cyrl.json
languages/i18n/ruq-latn.json
languages/i18n/sa.json
languages/i18n/sah.json
languages/i18n/scn.json
languages/i18n/sco.json
languages/i18n/sd.json
languages/i18n/sdc.json
languages/i18n/sg.json
languages/i18n/sh.json
languages/i18n/si.json
languages/i18n/sk.json
languages/i18n/sl.json
languages/i18n/sli.json
languages/i18n/sma.json
languages/i18n/so.json
languages/i18n/sq.json
languages/i18n/sr-ec.json
languages/i18n/sr-el.json
languages/i18n/ss.json
languages/i18n/stq.json
languages/i18n/sv.json
languages/i18n/sw.json
languages/i18n/szl.json
languages/i18n/ta.json
languages/i18n/te.json
languages/i18n/tg-cyrl.json
languages/i18n/tg-latn.json
languages/i18n/th.json
languages/i18n/tk.json
languages/i18n/tl.json
languages/i18n/tr.json
languages/i18n/tt-cyrl.json
languages/i18n/tt-latn.json
languages/i18n/udm.json
languages/i18n/ug-arab.json
languages/i18n/uk.json
languages/i18n/uz.json
languages/i18n/vec.json
languages/i18n/vi.json
languages/i18n/vo.json
languages/i18n/vro.json
languages/i18n/wa.json
languages/i18n/war.json
languages/i18n/yi.json
languages/i18n/yo.json
languages/i18n/yue.json
languages/i18n/za.json
languages/i18n/zh-cn.json [deleted file]
languages/i18n/zh-hans.json
languages/i18n/zh-hant.json
languages/i18n/zu.json
languages/messages/MessagesAr.php
languages/messages/MessagesEn.php
languages/messages/MessagesOr.php
languages/messages/MessagesPl.php
languages/utils/CLDRPluralRuleConverter.php [new file with mode: 0644]
languages/utils/CLDRPluralRuleConverter_Expression.php [new file with mode: 0644]
languages/utils/CLDRPluralRuleConverter_Fragment.php [new file with mode: 0644]
languages/utils/CLDRPluralRuleConverter_Operator.php [new file with mode: 0644]
languages/utils/CLDRPluralRuleError.php [new file with mode: 0644]
languages/utils/CLDRPluralRuleEvaluator.php
languages/utils/CLDRPluralRuleEvaluator_Range.php [new file with mode: 0644]
maintenance/benchmarks/bench_delete_truncate.php
maintenance/jsduck/CustomTags.rb [new file with mode: 0644]
maintenance/jsduck/config.json
maintenance/language/messages.inc
maintenance/language/zhtable/tradphrases.manual
maintenance/mwjsduck-gen
maintenance/resetUserTokens.php
maintenance/resources/update-oojs.sh [new file with mode: 0755]
maintenance/runJobs.php
resources/Makefile [deleted file]
resources/README.txt [deleted file]
resources/Resources.php
resources/jquery.chosen/LICENSE [deleted file]
resources/jquery.chosen/chosen-sprite.png [deleted file]
resources/jquery.chosen/chosen-sprite@2x.png [deleted file]
resources/jquery.chosen/chosen.css [deleted file]
resources/jquery.chosen/chosen.jquery.js [deleted file]
resources/jquery.effects/jquery.effects.blind.js [deleted file]
resources/jquery.effects/jquery.effects.bounce.js [deleted file]
resources/jquery.effects/jquery.effects.clip.js [deleted file]
resources/jquery.effects/jquery.effects.core.js [deleted file]
resources/jquery.effects/jquery.effects.drop.js [deleted file]
resources/jquery.effects/jquery.effects.explode.js [deleted file]
resources/jquery.effects/jquery.effects.fade.js [deleted file]
resources/jquery.effects/jquery.effects.fold.js [deleted file]
resources/jquery.effects/jquery.effects.highlight.js [deleted file]
resources/jquery.effects/jquery.effects.pulsate.js [deleted file]
resources/jquery.effects/jquery.effects.scale.js [deleted file]
resources/jquery.effects/jquery.effects.shake.js [deleted file]
resources/jquery.effects/jquery.effects.slide.js [deleted file]
resources/jquery.effects/jquery.effects.transfer.js [deleted file]
resources/jquery.tipsy/images/tipsy.png [deleted file]
resources/jquery.tipsy/jquery.tipsy.css [deleted file]
resources/jquery.tipsy/jquery.tipsy.js [deleted file]
resources/jquery.ui/i18n/jquery.ui.datepicker-af.js [deleted file]
resources/jquery.ui/i18n/jquery.ui.datepicker-ar.js [deleted file]
resources/jquery.ui/i18n/jquery.ui.datepicker-az.js [deleted file]
resources/jquery.ui/i18n/jquery.ui.datepicker-bg.js [deleted file]
resources/jquery.ui/i18n/jquery.ui.datepicker-bs.js [deleted file]
resources/jquery.ui/i18n/jquery.ui.datepicker-ca.js [deleted file]
resources/jquery.ui/i18n/jquery.ui.datepicker-cs.js [deleted file]
resources/jquery.ui/i18n/jquery.ui.datepicker-da.js [deleted file]
resources/jquery.ui/i18n/jquery.ui.datepicker-de.js [deleted file]
resources/jquery.ui/i18n/jquery.ui.datepicker-el.js [deleted file]
resources/jquery.ui/i18n/jquery.ui.datepicker-en-GB.js [deleted file]
resources/jquery.ui/i18n/jquery.ui.datepicker-eo.js [deleted file]
resources/jquery.ui/i18n/jquery.ui.datepicker-es.js [deleted file]
resources/jquery.ui/i18n/jquery.ui.datepicker-et.js [deleted file]
resources/jquery.ui/i18n/jquery.ui.datepicker-eu.js [deleted file]
resources/jquery.ui/i18n/jquery.ui.datepicker-fa.js [deleted file]
resources/jquery.ui/i18n/jquery.ui.datepicker-fi.js [deleted file]
resources/jquery.ui/i18n/jquery.ui.datepicker-fo.js [deleted file]
resources/jquery.ui/i18n/jquery.ui.datepicker-fr.js [deleted file]
resources/jquery.ui/i18n/jquery.ui.datepicker-gl.js [deleted file]
resources/jquery.ui/i18n/jquery.ui.datepicker-he.js [deleted file]
resources/jquery.ui/i18n/jquery.ui.datepicker-hi.js [deleted file]
resources/jquery.ui/i18n/jquery.ui.datepicker-hr.js [deleted file]
resources/jquery.ui/i18n/jquery.ui.datepicker-hu.js [deleted file]
resources/jquery.ui/i18n/jquery.ui.datepicker-hy.js [deleted file]
resources/jquery.ui/i18n/jquery.ui.datepicker-id.js [deleted file]
resources/jquery.ui/i18n/jquery.ui.datepicker-is.js [deleted file]
resources/jquery.ui/i18n/jquery.ui.datepicker-it.js [deleted file]
resources/jquery.ui/i18n/jquery.ui.datepicker-ja.js [deleted file]
resources/jquery.ui/i18n/jquery.ui.datepicker-ka.js [deleted file]
resources/jquery.ui/i18n/jquery.ui.datepicker-kk.js [deleted file]
resources/jquery.ui/i18n/jquery.ui.datepicker-km.js [deleted file]
resources/jquery.ui/i18n/jquery.ui.datepicker-ko.js [deleted file]
resources/jquery.ui/i18n/jquery.ui.datepicker-lb.js [deleted file]
resources/jquery.ui/i18n/jquery.ui.datepicker-lt.js [deleted file]
resources/jquery.ui/i18n/jquery.ui.datepicker-lv.js [deleted file]
resources/jquery.ui/i18n/jquery.ui.datepicker-mk.js [deleted file]
resources/jquery.ui/i18n/jquery.ui.datepicker-ml.js [deleted file]
resources/jquery.ui/i18n/jquery.ui.datepicker-ms.js [deleted file]
resources/jquery.ui/i18n/jquery.ui.datepicker-nl.js [deleted file]
resources/jquery.ui/i18n/jquery.ui.datepicker-no.js [deleted file]
resources/jquery.ui/i18n/jquery.ui.datepicker-pl.js [deleted file]
resources/jquery.ui/i18n/jquery.ui.datepicker-pt-BR.js [deleted file]
resources/jquery.ui/i18n/jquery.ui.datepicker-pt.js [deleted file]
resources/jquery.ui/i18n/jquery.ui.datepicker-rm.js [deleted file]
resources/jquery.ui/i18n/jquery.ui.datepicker-ro.js [deleted file]
resources/jquery.ui/i18n/jquery.ui.datepicker-ru.js [deleted file]
resources/jquery.ui/i18n/jquery.ui.datepicker-sk.js [deleted file]
resources/jquery.ui/i18n/jquery.ui.datepicker-sl.js [deleted file]
resources/jquery.ui/i18n/jquery.ui.datepicker-sq.js [deleted file]
resources/jquery.ui/i18n/jquery.ui.datepicker-sr-SR.js [deleted file]
resources/jquery.ui/i18n/jquery.ui.datepicker-sr.js [deleted file]
resources/jquery.ui/i18n/jquery.ui.datepicker-sv.js [deleted file]
resources/jquery.ui/i18n/jquery.ui.datepicker-ta.js [deleted file]
resources/jquery.ui/i18n/jquery.ui.datepicker-th.js [deleted file]
resources/jquery.ui/i18n/jquery.ui.datepicker-tr.js [deleted file]
resources/jquery.ui/i18n/jquery.ui.datepicker-uk.js [deleted file]
resources/jquery.ui/i18n/jquery.ui.datepicker-vi.js [deleted file]
resources/jquery.ui/i18n/jquery.ui.datepicker-zh-CN.js [deleted file]
resources/jquery.ui/i18n/jquery.ui.datepicker-zh-HK.js [deleted file]
resources/jquery.ui/i18n/jquery.ui.datepicker-zh-TW.js [deleted file]
resources/jquery.ui/jquery.ui.accordion.js [deleted file]
resources/jquery.ui/jquery.ui.autocomplete.js [deleted file]
resources/jquery.ui/jquery.ui.button.js [deleted file]
resources/jquery.ui/jquery.ui.core.js [deleted file]
resources/jquery.ui/jquery.ui.datepicker.js [deleted file]
resources/jquery.ui/jquery.ui.dialog.js [deleted file]
resources/jquery.ui/jquery.ui.draggable.js [deleted file]
resources/jquery.ui/jquery.ui.droppable.js [deleted file]
resources/jquery.ui/jquery.ui.mouse.js [deleted file]
resources/jquery.ui/jquery.ui.position.js [deleted file]
resources/jquery.ui/jquery.ui.progressbar.js [deleted file]
resources/jquery.ui/jquery.ui.resizable.js [deleted file]
resources/jquery.ui/jquery.ui.selectable.js [deleted file]
resources/jquery.ui/jquery.ui.slider.js [deleted file]
resources/jquery.ui/jquery.ui.sortable.js [deleted file]
resources/jquery.ui/jquery.ui.tabs.js [deleted file]
resources/jquery.ui/jquery.ui.widget.js [deleted file]
resources/jquery.ui/themes/default/images/ui-bg_flat_0_aaaaaa_40x100.png [deleted file]
resources/jquery.ui/themes/default/images/ui-bg_flat_75_ffffff_40x100.png [deleted file]
resources/jquery.ui/themes/default/images/ui-bg_glass_55_fbf9ee_1x400.png [deleted file]
resources/jquery.ui/themes/default/images/ui-bg_glass_65_ffffff_1x400.png [deleted file]
resources/jquery.ui/themes/default/images/ui-bg_glass_75_dadada_1x400.png [deleted file]
resources/jquery.ui/themes/default/images/ui-bg_glass_75_e6e6e6_1x400.png [deleted file]
resources/jquery.ui/themes/default/images/ui-bg_glass_95_fef1ec_1x400.png [deleted file]
resources/jquery.ui/themes/default/images/ui-bg_highlight-soft_75_cccccc_1x100.png [deleted file]
resources/jquery.ui/themes/default/images/ui-icons_222222_256x240.png [deleted file]
resources/jquery.ui/themes/default/images/ui-icons_2e83ff_256x240.png [deleted file]
resources/jquery.ui/themes/default/images/ui-icons_454545_256x240.png [deleted file]
resources/jquery.ui/themes/default/images/ui-icons_888888_256x240.png [deleted file]
resources/jquery.ui/themes/default/images/ui-icons_cd0a0a_256x240.png [deleted file]
resources/jquery.ui/themes/default/jquery.ui.accordion.css [deleted file]
resources/jquery.ui/themes/default/jquery.ui.autocomplete.css [deleted file]
resources/jquery.ui/themes/default/jquery.ui.button.css [deleted file]
resources/jquery.ui/themes/default/jquery.ui.core.css [deleted file]
resources/jquery.ui/themes/default/jquery.ui.datepicker.css [deleted file]
resources/jquery.ui/themes/default/jquery.ui.dialog.css [deleted file]
resources/jquery.ui/themes/default/jquery.ui.progressbar.css [deleted file]
resources/jquery.ui/themes/default/jquery.ui.resizable.css [deleted file]
resources/jquery.ui/themes/default/jquery.ui.selectable.css [deleted file]
resources/jquery.ui/themes/default/jquery.ui.slider.css [deleted file]
resources/jquery.ui/themes/default/jquery.ui.tabs.css [deleted file]
resources/jquery.ui/themes/default/jquery.ui.theme.css [deleted file]
resources/jquery.ui/themes/vector/images/close.png [deleted file]
resources/jquery.ui/themes/vector/images/titlebar-fade.png [deleted file]
resources/jquery.ui/themes/vector/images/ui-anim_basic_16x16.gif [deleted file]
resources/jquery.ui/themes/vector/images/ui-bg_flat_15_cd0a0a_40x100.png [deleted file]
resources/jquery.ui/themes/vector/images/ui-bg_flat_70_000000_40x100.png [deleted file]
resources/jquery.ui/themes/vector/images/ui-bg_highlight-hard_100_f2f5f7_1x100.png [deleted file]
resources/jquery.ui/themes/vector/images/ui-bg_highlight-hard_80_d7ebf9_1x100.png [deleted file]
resources/jquery.ui/themes/vector/images/ui-bg_highlight-soft_100_e4f1fb_1x100.png [deleted file]
resources/jquery.ui/themes/vector/images/ui-bg_highlight-soft_100_ffffff_1x100.png [deleted file]
resources/jquery.ui/themes/vector/images/ui-bg_highlight-soft_25_ffef8f_1x100.png [deleted file]
resources/jquery.ui/themes/vector/images/ui-bg_inset-hard_100_f0f0f0_1x100.png [deleted file]
resources/jquery.ui/themes/vector/images/ui-icons_2694e8_256x240.png [deleted file]
resources/jquery.ui/themes/vector/images/ui-icons_2e83ff_256x240.png [deleted file]
resources/jquery.ui/themes/vector/images/ui-icons_3d80b3_256x240.png [deleted file]
resources/jquery.ui/themes/vector/images/ui-icons_666666_256x240.png [deleted file]
resources/jquery.ui/themes/vector/images/ui-icons_72a7cf_256x240.png [deleted file]
resources/jquery.ui/themes/vector/images/ui-icons_ffffff_256x240.png [deleted file]
resources/jquery.ui/themes/vector/jquery.ui.accordion.css [deleted file]
resources/jquery.ui/themes/vector/jquery.ui.autocomplete.css [deleted file]
resources/jquery.ui/themes/vector/jquery.ui.button.css [deleted file]
resources/jquery.ui/themes/vector/jquery.ui.core.css [deleted file]
resources/jquery.ui/themes/vector/jquery.ui.datepicker.css [deleted file]
resources/jquery.ui/themes/vector/jquery.ui.dialog.css [deleted file]
resources/jquery.ui/themes/vector/jquery.ui.progressbar.css [deleted file]
resources/jquery.ui/themes/vector/jquery.ui.resizable.css [deleted file]
resources/jquery.ui/themes/vector/jquery.ui.selectable.css [deleted file]
resources/jquery.ui/themes/vector/jquery.ui.slider.css [deleted file]
resources/jquery.ui/themes/vector/jquery.ui.tabs.css [deleted file]
resources/jquery.ui/themes/vector/jquery.ui.theme.css [deleted file]
resources/jquery/images/jquery.arrowSteps.divider-ltr.png [deleted file]
resources/jquery/images/jquery.arrowSteps.divider-rtl.png [deleted file]
resources/jquery/images/jquery.arrowSteps.head-ltr.png [deleted file]
resources/jquery/images/jquery.arrowSteps.head-rtl.png [deleted file]
resources/jquery/images/jquery.arrowSteps.tail-ltr.png [deleted file]
resources/jquery/images/jquery.arrowSteps.tail-rtl.png [deleted file]
resources/jquery/images/marker.png [deleted file]
resources/jquery/images/mask.png [deleted file]
resources/jquery/images/sort_both.gif [deleted file]
resources/jquery/images/sort_down.gif [deleted file]
resources/jquery/images/sort_none.gif [deleted file]
resources/jquery/images/sort_up.gif [deleted file]
resources/jquery/images/spinner-large.gif [deleted file]
resources/jquery/images/spinner.gif [deleted file]
resources/jquery/images/wheel.png [deleted file]
resources/jquery/jquery.appear.js [deleted file]
resources/jquery/jquery.arrowSteps.css [deleted file]
resources/jquery/jquery.arrowSteps.js [deleted file]
resources/jquery/jquery.async.js [deleted file]
resources/jquery/jquery.autoEllipsis.js [deleted file]
resources/jquery/jquery.ba-throttle-debounce.js [deleted file]
resources/jquery/jquery.badge.css [deleted file]
resources/jquery/jquery.badge.js [deleted file]
resources/jquery/jquery.byteLength.js [deleted file]
resources/jquery/jquery.byteLimit.js [deleted file]
resources/jquery/jquery.checkboxShiftClick.js [deleted file]
resources/jquery/jquery.client.js [deleted file]
resources/jquery/jquery.color.js [deleted file]
resources/jquery/jquery.colorUtil.js [deleted file]
resources/jquery/jquery.cookie.js [deleted file]
resources/jquery/jquery.cycle.all.js [deleted file]
resources/jquery/jquery.delayedBind.js [deleted file]
resources/jquery/jquery.expandableField.js [deleted file]
resources/jquery/jquery.farbtastic.css [deleted file]
resources/jquery/jquery.farbtastic.js [deleted file]
resources/jquery/jquery.footHovzer.css [deleted file]
resources/jquery/jquery.footHovzer.js [deleted file]
resources/jquery/jquery.form.js [deleted file]
resources/jquery/jquery.fullscreen.js [deleted file]
resources/jquery/jquery.getAttrs.js [deleted file]
resources/jquery/jquery.hidpi.js [deleted file]
resources/jquery/jquery.highlightText.js [deleted file]
resources/jquery/jquery.hoverIntent.js [deleted file]
resources/jquery/jquery.jStorage.js [deleted file]
resources/jquery/jquery.js [deleted file]
resources/jquery/jquery.json.js [deleted file]
resources/jquery/jquery.localize.js [deleted file]
resources/jquery/jquery.makeCollapsible.css [deleted file]
resources/jquery/jquery.makeCollapsible.js [deleted file]
resources/jquery/jquery.mockjax.js [deleted file]
resources/jquery/jquery.mw-jump.js [deleted file]
resources/jquery/jquery.mwExtension.js [deleted file]
resources/jquery/jquery.placeholder.js [deleted file]
resources/jquery/jquery.qunit.completenessTest.js [deleted file]
resources/jquery/jquery.qunit.css [deleted file]
resources/jquery/jquery.qunit.js [deleted file]
resources/jquery/jquery.spinner.css [deleted file]
resources/jquery/jquery.spinner.js [deleted file]
resources/jquery/jquery.suggestions.css [deleted file]
resources/jquery/jquery.suggestions.js [deleted file]
resources/jquery/jquery.tabIndex.js [deleted file]
resources/jquery/jquery.tablesorter.css [deleted file]
resources/jquery/jquery.tablesorter.js [deleted file]
resources/jquery/jquery.textSelection.js [deleted file]
resources/jquery/jquery.validate.js [deleted file]
resources/jquery/jquery.xmldom.js [deleted file]
resources/lib/jquery.chosen/LICENSE [new file with mode: 0644]
resources/lib/jquery.chosen/chosen-sprite.png [new file with mode: 0644]
resources/lib/jquery.chosen/chosen-sprite@2x.png [new file with mode: 0644]
resources/lib/jquery.chosen/chosen.css [new file with mode: 0644]
resources/lib/jquery.chosen/chosen.jquery.js [new file with mode: 0644]
resources/lib/jquery.effects/jquery.effects.blind.js [new file with mode: 0644]
resources/lib/jquery.effects/jquery.effects.bounce.js [new file with mode: 0644]
resources/lib/jquery.effects/jquery.effects.clip.js [new file with mode: 0644]
resources/lib/jquery.effects/jquery.effects.core.js [new file with mode: 0644]
resources/lib/jquery.effects/jquery.effects.drop.js [new file with mode: 0644]
resources/lib/jquery.effects/jquery.effects.explode.js [new file with mode: 0644]
resources/lib/jquery.effects/jquery.effects.fade.js [new file with mode: 0644]
resources/lib/jquery.effects/jquery.effects.fold.js [new file with mode: 0644]
resources/lib/jquery.effects/jquery.effects.highlight.js [new file with mode: 0644]
resources/lib/jquery.effects/jquery.effects.pulsate.js [new file with mode: 0644]
resources/lib/jquery.effects/jquery.effects.scale.js [new file with mode: 0644]
resources/lib/jquery.effects/jquery.effects.shake.js [new file with mode: 0644]
resources/lib/jquery.effects/jquery.effects.slide.js [new file with mode: 0644]
resources/lib/jquery.effects/jquery.effects.transfer.js [new file with mode: 0644]
resources/lib/jquery.ui/i18n/jquery.ui.datepicker-af.js [new file with mode: 0644]
resources/lib/jquery.ui/i18n/jquery.ui.datepicker-ar.js [new file with mode: 0644]
resources/lib/jquery.ui/i18n/jquery.ui.datepicker-az.js [new file with mode: 0644]
resources/lib/jquery.ui/i18n/jquery.ui.datepicker-bg.js [new file with mode: 0644]
resources/lib/jquery.ui/i18n/jquery.ui.datepicker-bs.js [new file with mode: 0644]
resources/lib/jquery.ui/i18n/jquery.ui.datepicker-ca.js [new file with mode: 0644]
resources/lib/jquery.ui/i18n/jquery.ui.datepicker-cs.js [new file with mode: 0644]
resources/lib/jquery.ui/i18n/jquery.ui.datepicker-da.js [new file with mode: 0644]
resources/lib/jquery.ui/i18n/jquery.ui.datepicker-de.js [new file with mode: 0644]
resources/lib/jquery.ui/i18n/jquery.ui.datepicker-el.js [new file with mode: 0644]
resources/lib/jquery.ui/i18n/jquery.ui.datepicker-en-GB.js [new file with mode: 0644]
resources/lib/jquery.ui/i18n/jquery.ui.datepicker-eo.js [new file with mode: 0644]
resources/lib/jquery.ui/i18n/jquery.ui.datepicker-es.js [new file with mode: 0644]
resources/lib/jquery.ui/i18n/jquery.ui.datepicker-et.js [new file with mode: 0644]
resources/lib/jquery.ui/i18n/jquery.ui.datepicker-eu.js [new file with mode: 0644]
resources/lib/jquery.ui/i18n/jquery.ui.datepicker-fa.js [new file with mode: 0644]
resources/lib/jquery.ui/i18n/jquery.ui.datepicker-fi.js [new file with mode: 0644]
resources/lib/jquery.ui/i18n/jquery.ui.datepicker-fo.js [new file with mode: 0644]
resources/lib/jquery.ui/i18n/jquery.ui.datepicker-fr.js [new file with mode: 0644]
resources/lib/jquery.ui/i18n/jquery.ui.datepicker-gl.js [new file with mode: 0644]
resources/lib/jquery.ui/i18n/jquery.ui.datepicker-he.js [new file with mode: 0644]
resources/lib/jquery.ui/i18n/jquery.ui.datepicker-hi.js [new file with mode: 0644]
resources/lib/jquery.ui/i18n/jquery.ui.datepicker-hr.js [new file with mode: 0644]
resources/lib/jquery.ui/i18n/jquery.ui.datepicker-hu.js [new file with mode: 0644]
resources/lib/jquery.ui/i18n/jquery.ui.datepicker-hy.js [new file with mode: 0644]
resources/lib/jquery.ui/i18n/jquery.ui.datepicker-id.js [new file with mode: 0644]
resources/lib/jquery.ui/i18n/jquery.ui.datepicker-is.js [new file with mode: 0644]
resources/lib/jquery.ui/i18n/jquery.ui.datepicker-it.js [new file with mode: 0644]
resources/lib/jquery.ui/i18n/jquery.ui.datepicker-ja.js [new file with mode: 0644]
resources/lib/jquery.ui/i18n/jquery.ui.datepicker-ka.js [new file with mode: 0644]
resources/lib/jquery.ui/i18n/jquery.ui.datepicker-kk.js [new file with mode: 0644]
resources/lib/jquery.ui/i18n/jquery.ui.datepicker-km.js [new file with mode: 0644]
resources/lib/jquery.ui/i18n/jquery.ui.datepicker-ko.js [new file with mode: 0644]
resources/lib/jquery.ui/i18n/jquery.ui.datepicker-lb.js [new file with mode: 0644]
resources/lib/jquery.ui/i18n/jquery.ui.datepicker-lt.js [new file with mode: 0644]
resources/lib/jquery.ui/i18n/jquery.ui.datepicker-lv.js [new file with mode: 0644]
resources/lib/jquery.ui/i18n/jquery.ui.datepicker-mk.js [new file with mode: 0644]
resources/lib/jquery.ui/i18n/jquery.ui.datepicker-ml.js [new file with mode: 0644]
resources/lib/jquery.ui/i18n/jquery.ui.datepicker-ms.js [new file with mode: 0644]
resources/lib/jquery.ui/i18n/jquery.ui.datepicker-nl.js [new file with mode: 0644]
resources/lib/jquery.ui/i18n/jquery.ui.datepicker-no.js [new file with mode: 0644]
resources/lib/jquery.ui/i18n/jquery.ui.datepicker-pl.js [new file with mode: 0644]
resources/lib/jquery.ui/i18n/jquery.ui.datepicker-pt-BR.js [new file with mode: 0644]
resources/lib/jquery.ui/i18n/jquery.ui.datepicker-pt.js [new file with mode: 0644]
resources/lib/jquery.ui/i18n/jquery.ui.datepicker-rm.js [new file with mode: 0644]
resources/lib/jquery.ui/i18n/jquery.ui.datepicker-ro.js [new file with mode: 0644]
resources/lib/jquery.ui/i18n/jquery.ui.datepicker-ru.js [new file with mode: 0644]
resources/lib/jquery.ui/i18n/jquery.ui.datepicker-sk.js [new file with mode: 0644]
resources/lib/jquery.ui/i18n/jquery.ui.datepicker-sl.js [new file with mode: 0644]
resources/lib/jquery.ui/i18n/jquery.ui.datepicker-sq.js [new file with mode: 0644]
resources/lib/jquery.ui/i18n/jquery.ui.datepicker-sr-SR.js [new file with mode: 0644]
resources/lib/jquery.ui/i18n/jquery.ui.datepicker-sr.js [new file with mode: 0644]
resources/lib/jquery.ui/i18n/jquery.ui.datepicker-sv.js [new file with mode: 0644]
resources/lib/jquery.ui/i18n/jquery.ui.datepicker-ta.js [new file with mode: 0644]
resources/lib/jquery.ui/i18n/jquery.ui.datepicker-th.js [new file with mode: 0644]
resources/lib/jquery.ui/i18n/jquery.ui.datepicker-tr.js [new file with mode: 0644]
resources/lib/jquery.ui/i18n/jquery.ui.datepicker-uk.js [new file with mode: 0644]
resources/lib/jquery.ui/i18n/jquery.ui.datepicker-vi.js [new file with mode: 0644]
resources/lib/jquery.ui/i18n/jquery.ui.datepicker-zh-CN.js [new file with mode: 0644]
resources/lib/jquery.ui/i18n/jquery.ui.datepicker-zh-HK.js [new file with mode: 0644]
resources/lib/jquery.ui/i18n/jquery.ui.datepicker-zh-TW.js [new file with mode: 0644]
resources/lib/jquery.ui/jquery.ui.accordion.js [new file with mode: 0644]
resources/lib/jquery.ui/jquery.ui.autocomplete.js [new file with mode: 0644]
resources/lib/jquery.ui/jquery.ui.button.js [new file with mode: 0644]
resources/lib/jquery.ui/jquery.ui.core.js [new file with mode: 0644]
resources/lib/jquery.ui/jquery.ui.datepicker.js [new file with mode: 0644]
resources/lib/jquery.ui/jquery.ui.dialog.js [new file with mode: 0644]
resources/lib/jquery.ui/jquery.ui.draggable.js [new file with mode: 0644]
resources/lib/jquery.ui/jquery.ui.droppable.js [new file with mode: 0644]
resources/lib/jquery.ui/jquery.ui.mouse.js [new file with mode: 0644]
resources/lib/jquery.ui/jquery.ui.position.js [new file with mode: 0644]
resources/lib/jquery.ui/jquery.ui.progressbar.js [new file with mode: 0644]
resources/lib/jquery.ui/jquery.ui.resizable.js [new file with mode: 0644]
resources/lib/jquery.ui/jquery.ui.selectable.js [new file with mode: 0644]
resources/lib/jquery.ui/jquery.ui.slider.js [new file with mode: 0644]
resources/lib/jquery.ui/jquery.ui.sortable.js [new file with mode: 0644]
resources/lib/jquery.ui/jquery.ui.tabs.js [new file with mode: 0644]
resources/lib/jquery.ui/jquery.ui.widget.js [new file with mode: 0644]
resources/lib/jquery.ui/themes/default/images/ui-bg_flat_0_aaaaaa_40x100.png [new file with mode: 0644]
resources/lib/jquery.ui/themes/default/images/ui-bg_flat_75_ffffff_40x100.png [new file with mode: 0644]
resources/lib/jquery.ui/themes/default/images/ui-bg_glass_55_fbf9ee_1x400.png [new file with mode: 0644]
resources/lib/jquery.ui/themes/default/images/ui-bg_glass_65_ffffff_1x400.png [new file with mode: 0644]
resources/lib/jquery.ui/themes/default/images/ui-bg_glass_75_dadada_1x400.png [new file with mode: 0644]
resources/lib/jquery.ui/themes/default/images/ui-bg_glass_75_e6e6e6_1x400.png [new file with mode: 0644]
resources/lib/jquery.ui/themes/default/images/ui-bg_glass_95_fef1ec_1x400.png [new file with mode: 0644]
resources/lib/jquery.ui/themes/default/images/ui-bg_highlight-soft_75_cccccc_1x100.png [new file with mode: 0644]
resources/lib/jquery.ui/themes/default/images/ui-icons_222222_256x240.png [new file with mode: 0644]
resources/lib/jquery.ui/themes/default/images/ui-icons_2e83ff_256x240.png [new file with mode: 0644]
resources/lib/jquery.ui/themes/default/images/ui-icons_454545_256x240.png [new file with mode: 0644]
resources/lib/jquery.ui/themes/default/images/ui-icons_888888_256x240.png [new file with mode: 0644]
resources/lib/jquery.ui/themes/default/images/ui-icons_cd0a0a_256x240.png [new file with mode: 0644]
resources/lib/jquery.ui/themes/default/jquery.ui.accordion.css [new file with mode: 0644]
resources/lib/jquery.ui/themes/default/jquery.ui.autocomplete.css [new file with mode: 0644]
resources/lib/jquery.ui/themes/default/jquery.ui.button.css [new file with mode: 0644]
resources/lib/jquery.ui/themes/default/jquery.ui.core.css [new file with mode: 0644]
resources/lib/jquery.ui/themes/default/jquery.ui.datepicker.css [new file with mode: 0644]
resources/lib/jquery.ui/themes/default/jquery.ui.dialog.css [new file with mode: 0644]
resources/lib/jquery.ui/themes/default/jquery.ui.progressbar.css [new file with mode: 0644]
resources/lib/jquery.ui/themes/default/jquery.ui.resizable.css [new file with mode: 0644]
resources/lib/jquery.ui/themes/default/jquery.ui.selectable.css [new file with mode: 0644]
resources/lib/jquery.ui/themes/default/jquery.ui.slider.css [new file with mode: 0644]
resources/lib/jquery.ui/themes/default/jquery.ui.tabs.css [new file with mode: 0644]
resources/lib/jquery.ui/themes/default/jquery.ui.theme.css [new file with mode: 0644]
resources/lib/jquery/jquery.appear.js [new file with mode: 0644]
resources/lib/jquery/jquery.async.js [new file with mode: 0644]
resources/lib/jquery/jquery.ba-throttle-debounce.js [new file with mode: 0644]
resources/lib/jquery/jquery.cookie.js [new file with mode: 0644]
resources/lib/jquery/jquery.cycle.all.js [new file with mode: 0644]
resources/lib/jquery/jquery.form.js [new file with mode: 0644]
resources/lib/jquery/jquery.fullscreen.js [new file with mode: 0644]
resources/lib/jquery/jquery.hoverIntent.js [new file with mode: 0644]
resources/lib/jquery/jquery.jStorage.js [new file with mode: 0644]
resources/lib/jquery/jquery.js [new file with mode: 0644]
resources/lib/jquery/jquery.json.js [new file with mode: 0644]
resources/lib/jquery/jquery.mockjax.js [new file with mode: 0644]
resources/lib/jquery/jquery.qunit.css [new file with mode: 0644]
resources/lib/jquery/jquery.qunit.js [new file with mode: 0644]
resources/lib/jquery/jquery.validate.js [new file with mode: 0644]
resources/lib/jquery/jquery.xmldom.js [new file with mode: 0644]
resources/lib/moment/LICENSE [new file with mode: 0644]
resources/lib/moment/lang/ar-ma.js [new file with mode: 0644]
resources/lib/moment/lang/ar.js [new file with mode: 0644]
resources/lib/moment/lang/bg.js [new file with mode: 0644]
resources/lib/moment/lang/br.js [new file with mode: 0644]
resources/lib/moment/lang/bs.js [new file with mode: 0644]
resources/lib/moment/lang/ca.js [new file with mode: 0644]
resources/lib/moment/lang/cs.js [new file with mode: 0644]
resources/lib/moment/lang/cv.js [new file with mode: 0644]
resources/lib/moment/lang/cy.js [new file with mode: 0644]
resources/lib/moment/lang/da.js [new file with mode: 0644]
resources/lib/moment/lang/de.js [new file with mode: 0644]
resources/lib/moment/lang/el.js [new file with mode: 0644]
resources/lib/moment/lang/en-au.js [new file with mode: 0644]
resources/lib/moment/lang/en-ca.js [new file with mode: 0644]
resources/lib/moment/lang/en-gb.js [new file with mode: 0644]
resources/lib/moment/lang/eo.js [new file with mode: 0644]
resources/lib/moment/lang/es.js [new file with mode: 0644]
resources/lib/moment/lang/et.js [new file with mode: 0644]
resources/lib/moment/lang/eu.js [new file with mode: 0644]
resources/lib/moment/lang/fa.js [new file with mode: 0644]
resources/lib/moment/lang/fi.js [new file with mode: 0644]
resources/lib/moment/lang/fo.js [new file with mode: 0644]
resources/lib/moment/lang/fr-ca.js [new file with mode: 0644]
resources/lib/moment/lang/fr.js [new file with mode: 0644]
resources/lib/moment/lang/gl.js [new file with mode: 0644]
resources/lib/moment/lang/he.js [new file with mode: 0644]
resources/lib/moment/lang/hi.js [new file with mode: 0644]
resources/lib/moment/lang/hr.js [new file with mode: 0644]
resources/lib/moment/lang/hu.js [new file with mode: 0644]
resources/lib/moment/lang/hy-am.js [new file with mode: 0644]
resources/lib/moment/lang/id.js [new file with mode: 0644]
resources/lib/moment/lang/is.js [new file with mode: 0644]
resources/lib/moment/lang/it.js [new file with mode: 0644]
resources/lib/moment/lang/ja.js [new file with mode: 0644]
resources/lib/moment/lang/ka.js [new file with mode: 0644]
resources/lib/moment/lang/ko.js [new file with mode: 0644]
resources/lib/moment/lang/lb.js [new file with mode: 0644]
resources/lib/moment/lang/lt.js [new file with mode: 0644]
resources/lib/moment/lang/lv.js [new file with mode: 0644]
resources/lib/moment/lang/mk.js [new file with mode: 0644]
resources/lib/moment/lang/ml.js [new file with mode: 0644]
resources/lib/moment/lang/mr.js [new file with mode: 0644]
resources/lib/moment/lang/ms-my.js [new file with mode: 0644]
resources/lib/moment/lang/nb.js [new file with mode: 0644]
resources/lib/moment/lang/ne.js [new file with mode: 0644]
resources/lib/moment/lang/nl.js [new file with mode: 0644]
resources/lib/moment/lang/nn.js [new file with mode: 0644]
resources/lib/moment/lang/pl.js [new file with mode: 0644]
resources/lib/moment/lang/pt-br.js [new file with mode: 0644]
resources/lib/moment/lang/pt.js [new file with mode: 0644]
resources/lib/moment/lang/ro.js [new file with mode: 0644]
resources/lib/moment/lang/rs.js [new file with mode: 0644]
resources/lib/moment/lang/ru.js [new file with mode: 0644]
resources/lib/moment/lang/sk.js [new file with mode: 0644]
resources/lib/moment/lang/sl.js [new file with mode: 0644]
resources/lib/moment/lang/sq.js [new file with mode: 0644]
resources/lib/moment/lang/sv.js [new file with mode: 0644]
resources/lib/moment/lang/ta.js [new file with mode: 0644]
resources/lib/moment/lang/th.js [new file with mode: 0644]
resources/lib/moment/lang/tl-ph.js [new file with mode: 0644]
resources/lib/moment/lang/tr.js [new file with mode: 0644]
resources/lib/moment/lang/tzm-la.js [new file with mode: 0644]
resources/lib/moment/lang/tzm.js [new file with mode: 0644]
resources/lib/moment/lang/uk.js [new file with mode: 0644]
resources/lib/moment/lang/uz.js [new file with mode: 0644]
resources/lib/moment/lang/vn.js [new file with mode: 0644]
resources/lib/moment/lang/zh-cn.js [new file with mode: 0644]
resources/lib/moment/lang/zh-tw.js [new file with mode: 0644]
resources/lib/moment/moment.js [new file with mode: 0644]
resources/lib/oojs-ui/i18n/ace.json [new file with mode: 0644]
resources/lib/oojs-ui/i18n/af.json [new file with mode: 0644]
resources/lib/oojs-ui/i18n/am.json [new file with mode: 0644]
resources/lib/oojs-ui/i18n/ar.json [new file with mode: 0644]
resources/lib/oojs-ui/i18n/arc.json [new file with mode: 0644]
resources/lib/oojs-ui/i18n/ast.json [new file with mode: 0644]
resources/lib/oojs-ui/i18n/az.json [new file with mode: 0644]
resources/lib/oojs-ui/i18n/ba.json [new file with mode: 0644]
resources/lib/oojs-ui/i18n/bcl.json [new file with mode: 0644]
resources/lib/oojs-ui/i18n/be-tarask.json [new file with mode: 0644]
resources/lib/oojs-ui/i18n/be.json [new file with mode: 0644]
resources/lib/oojs-ui/i18n/bg.json [new file with mode: 0644]
resources/lib/oojs-ui/i18n/bn.json [new file with mode: 0644]
resources/lib/oojs-ui/i18n/br.json [new file with mode: 0644]
resources/lib/oojs-ui/i18n/bs.json [new file with mode: 0644]
resources/lib/oojs-ui/i18n/ca.json [new file with mode: 0644]
resources/lib/oojs-ui/i18n/ce.json [new file with mode: 0644]
resources/lib/oojs-ui/i18n/ckb.json [new file with mode: 0644]
resources/lib/oojs-ui/i18n/co.json [new file with mode: 0644]
resources/lib/oojs-ui/i18n/cs.json [new file with mode: 0644]
resources/lib/oojs-ui/i18n/cu.json [new file with mode: 0644]
resources/lib/oojs-ui/i18n/cy.json [new file with mode: 0644]
resources/lib/oojs-ui/i18n/da.json [new file with mode: 0644]
resources/lib/oojs-ui/i18n/de.json [new file with mode: 0644]
resources/lib/oojs-ui/i18n/diq.json [new file with mode: 0644]
resources/lib/oojs-ui/i18n/dsb.json [new file with mode: 0644]
resources/lib/oojs-ui/i18n/el.json [new file with mode: 0644]
resources/lib/oojs-ui/i18n/eml.json [new file with mode: 0644]
resources/lib/oojs-ui/i18n/en.json [new file with mode: 0644]
resources/lib/oojs-ui/i18n/eo.json [new file with mode: 0644]
resources/lib/oojs-ui/i18n/es.json [new file with mode: 0644]
resources/lib/oojs-ui/i18n/et.json [new file with mode: 0644]
resources/lib/oojs-ui/i18n/eu.json [new file with mode: 0644]
resources/lib/oojs-ui/i18n/fa.json [new file with mode: 0644]
resources/lib/oojs-ui/i18n/fi.json [new file with mode: 0644]
resources/lib/oojs-ui/i18n/fo.json [new file with mode: 0644]
resources/lib/oojs-ui/i18n/fr.json [new file with mode: 0644]
resources/lib/oojs-ui/i18n/frr.json [new file with mode: 0644]
resources/lib/oojs-ui/i18n/fur.json [new file with mode: 0644]
resources/lib/oojs-ui/i18n/gl.json [new file with mode: 0644]
resources/lib/oojs-ui/i18n/gu.json [new file with mode: 0644]
resources/lib/oojs-ui/i18n/he.json [new file with mode: 0644]
resources/lib/oojs-ui/i18n/hi.json [new file with mode: 0644]
resources/lib/oojs-ui/i18n/hr.json [new file with mode: 0644]
resources/lib/oojs-ui/i18n/hsb.json [new file with mode: 0644]
resources/lib/oojs-ui/i18n/hu.json [new file with mode: 0644]
resources/lib/oojs-ui/i18n/hy.json [new file with mode: 0644]
resources/lib/oojs-ui/i18n/ia.json [new file with mode: 0644]
resources/lib/oojs-ui/i18n/id.json [new file with mode: 0644]
resources/lib/oojs-ui/i18n/ie.json [new file with mode: 0644]
resources/lib/oojs-ui/i18n/ilo.json [new file with mode: 0644]
resources/lib/oojs-ui/i18n/is.json [new file with mode: 0644]
resources/lib/oojs-ui/i18n/it.json [new file with mode: 0644]
resources/lib/oojs-ui/i18n/ja.json [new file with mode: 0644]
resources/lib/oojs-ui/i18n/jv.json [new file with mode: 0644]
resources/lib/oojs-ui/i18n/ka.json [new file with mode: 0644]
resources/lib/oojs-ui/i18n/kk-cyrl.json [new file with mode: 0644]
resources/lib/oojs-ui/i18n/km.json [new file with mode: 0644]
resources/lib/oojs-ui/i18n/kn.json [new file with mode: 0644]
resources/lib/oojs-ui/i18n/ko.json [new file with mode: 0644]
resources/lib/oojs-ui/i18n/krc.json [new file with mode: 0644]
resources/lib/oojs-ui/i18n/kw.json [new file with mode: 0644]
resources/lib/oojs-ui/i18n/ky.json [new file with mode: 0644]
resources/lib/oojs-ui/i18n/lb.json [new file with mode: 0644]
resources/lib/oojs-ui/i18n/lmo.json [new file with mode: 0644]
resources/lib/oojs-ui/i18n/lt.json [new file with mode: 0644]
resources/lib/oojs-ui/i18n/lv.json [new file with mode: 0644]
resources/lib/oojs-ui/i18n/mg.json [new file with mode: 0644]
resources/lib/oojs-ui/i18n/min.json [new file with mode: 0644]
resources/lib/oojs-ui/i18n/mk.json [new file with mode: 0644]
resources/lib/oojs-ui/i18n/ml.json [new file with mode: 0644]
resources/lib/oojs-ui/i18n/mr.json [new file with mode: 0644]
resources/lib/oojs-ui/i18n/ms.json [new file with mode: 0644]
resources/lib/oojs-ui/i18n/nap.json [new file with mode: 0644]
resources/lib/oojs-ui/i18n/nb.json [new file with mode: 0644]
resources/lib/oojs-ui/i18n/nds-nl.json [new file with mode: 0644]
resources/lib/oojs-ui/i18n/nds.json [new file with mode: 0644]
resources/lib/oojs-ui/i18n/ne.json [new file with mode: 0644]
resources/lib/oojs-ui/i18n/nl.json [new file with mode: 0644]
resources/lib/oojs-ui/i18n/nn.json [new file with mode: 0644]
resources/lib/oojs-ui/i18n/om.json [new file with mode: 0644]
resources/lib/oojs-ui/i18n/or.json [new file with mode: 0644]
resources/lib/oojs-ui/i18n/pa.json [new file with mode: 0644]
resources/lib/oojs-ui/i18n/pfl.json [new file with mode: 0644]
resources/lib/oojs-ui/i18n/pl.json [new file with mode: 0644]
resources/lib/oojs-ui/i18n/pms.json [new file with mode: 0644]
resources/lib/oojs-ui/i18n/ps.json [new file with mode: 0644]
resources/lib/oojs-ui/i18n/pt-br.json [new file with mode: 0644]
resources/lib/oojs-ui/i18n/pt.json [new file with mode: 0644]
resources/lib/oojs-ui/i18n/qqq.json [new file with mode: 0644]
resources/lib/oojs-ui/i18n/qu.json [new file with mode: 0644]
resources/lib/oojs-ui/i18n/ro.json [new file with mode: 0644]
resources/lib/oojs-ui/i18n/roa-tara.json [new file with mode: 0644]
resources/lib/oojs-ui/i18n/ru.json [new file with mode: 0644]
resources/lib/oojs-ui/i18n/sah.json [new file with mode: 0644]
resources/lib/oojs-ui/i18n/scn.json [new file with mode: 0644]
resources/lib/oojs-ui/i18n/sco.json [new file with mode: 0644]
resources/lib/oojs-ui/i18n/sh.json [new file with mode: 0644]
resources/lib/oojs-ui/i18n/si.json [new file with mode: 0644]
resources/lib/oojs-ui/i18n/sk.json [new file with mode: 0644]
resources/lib/oojs-ui/i18n/sl.json [new file with mode: 0644]
resources/lib/oojs-ui/i18n/sq.json [new file with mode: 0644]
resources/lib/oojs-ui/i18n/sr-ec.json [new file with mode: 0644]
resources/lib/oojs-ui/i18n/sv.json [new file with mode: 0644]
resources/lib/oojs-ui/i18n/sw.json [new file with mode: 0644]
resources/lib/oojs-ui/i18n/ta.json [new file with mode: 0644]
resources/lib/oojs-ui/i18n/te.json [new file with mode: 0644]
resources/lib/oojs-ui/i18n/th.json [new file with mode: 0644]
resources/lib/oojs-ui/i18n/tl.json [new file with mode: 0644]
resources/lib/oojs-ui/i18n/tr.json [new file with mode: 0644]
resources/lib/oojs-ui/i18n/tt-cyrl.json [new file with mode: 0644]
resources/lib/oojs-ui/i18n/ug-arab.json [new file with mode: 0644]
resources/lib/oojs-ui/i18n/uk.json [new file with mode: 0644]
resources/lib/oojs-ui/i18n/uz.json [new file with mode: 0644]
resources/lib/oojs-ui/i18n/vec.json [new file with mode: 0644]
resources/lib/oojs-ui/i18n/vi.json [new file with mode: 0644]
resources/lib/oojs-ui/i18n/vo.json [new file with mode: 0644]
resources/lib/oojs-ui/i18n/wuu.json [new file with mode: 0644]
resources/lib/oojs-ui/i18n/yi.json [new file with mode: 0644]
resources/lib/oojs-ui/i18n/yo.json [new file with mode: 0644]
resources/lib/oojs-ui/i18n/zh-hans.json [new file with mode: 0644]
resources/lib/oojs-ui/i18n/zh-hant.json [new file with mode: 0644]
resources/lib/oojs-ui/images/fade-down.png [new file with mode: 0644]
resources/lib/oojs-ui/images/fade-up.png [new file with mode: 0644]
resources/lib/oojs-ui/images/icons/accept.png [new file with mode: 0644]
resources/lib/oojs-ui/images/icons/accept.svg [new file with mode: 0644]
resources/lib/oojs-ui/images/icons/add-item.png [new file with mode: 0644]
resources/lib/oojs-ui/images/icons/add-item.svg [new file with mode: 0644]
resources/lib/oojs-ui/images/icons/advanced.png [new file with mode: 0644]
resources/lib/oojs-ui/images/icons/advanced.svg [new file with mode: 0644]
resources/lib/oojs-ui/images/icons/alert.png [new file with mode: 0644]
resources/lib/oojs-ui/images/icons/alert.svg [new file with mode: 0644]
resources/lib/oojs-ui/images/icons/arched-arrow-ltr.png [new file with mode: 0644]
resources/lib/oojs-ui/images/icons/arched-arrow-ltr.svg [new file with mode: 0644]
resources/lib/oojs-ui/images/icons/arched-arrow-rtl.png [new file with mode: 0644]
resources/lib/oojs-ui/images/icons/arched-arrow-rtl.svg [new file with mode: 0644]
resources/lib/oojs-ui/images/icons/check.png [new file with mode: 0644]
resources/lib/oojs-ui/images/icons/check.svg [new file with mode: 0644]
resources/lib/oojs-ui/images/icons/clear.png [new file with mode: 0644]
resources/lib/oojs-ui/images/icons/clear.svg [new file with mode: 0644]
resources/lib/oojs-ui/images/icons/close.png [new file with mode: 0644]
resources/lib/oojs-ui/images/icons/close.svg [new file with mode: 0644]
resources/lib/oojs-ui/images/icons/code.png [new file with mode: 0644]
resources/lib/oojs-ui/images/icons/code.svg [new file with mode: 0644]
resources/lib/oojs-ui/images/icons/collapse.png [new file with mode: 0644]
resources/lib/oojs-ui/images/icons/collapse.svg [new file with mode: 0644]
resources/lib/oojs-ui/images/icons/comment.png [new file with mode: 0644]
resources/lib/oojs-ui/images/icons/comment.svg [new file with mode: 0644]
resources/lib/oojs-ui/images/icons/expand.png [new file with mode: 0644]
resources/lib/oojs-ui/images/icons/expand.svg [new file with mode: 0644]
resources/lib/oojs-ui/images/icons/help.png [new file with mode: 0644]
resources/lib/oojs-ui/images/icons/help.svg [new file with mode: 0644]
resources/lib/oojs-ui/images/icons/history.png [new file with mode: 0644]
resources/lib/oojs-ui/images/icons/history.svg [new file with mode: 0644]
resources/lib/oojs-ui/images/icons/link.png [new file with mode: 0644]
resources/lib/oojs-ui/images/icons/link.svg [new file with mode: 0644]
resources/lib/oojs-ui/images/icons/menu.png [new file with mode: 0644]
resources/lib/oojs-ui/images/icons/menu.svg [new file with mode: 0644]
resources/lib/oojs-ui/images/icons/move-ltr.png [new file with mode: 0644]
resources/lib/oojs-ui/images/icons/move-ltr.svg [new file with mode: 0644]
resources/lib/oojs-ui/images/icons/move-rtl.png [new file with mode: 0644]
resources/lib/oojs-ui/images/icons/move-rtl.svg [new file with mode: 0644]
resources/lib/oojs-ui/images/icons/picture.png [new file with mode: 0644]
resources/lib/oojs-ui/images/icons/picture.svg [new file with mode: 0644]
resources/lib/oojs-ui/images/icons/remove-item.png [new file with mode: 0644]
resources/lib/oojs-ui/images/icons/remove-item.svg [new file with mode: 0644]
resources/lib/oojs-ui/images/icons/remove.png [new file with mode: 0644]
resources/lib/oojs-ui/images/icons/remove.svg [new file with mode: 0644]
resources/lib/oojs-ui/images/icons/search.png [new file with mode: 0644]
resources/lib/oojs-ui/images/icons/search.svg [new file with mode: 0644]
resources/lib/oojs-ui/images/icons/settings.png [new file with mode: 0644]
resources/lib/oojs-ui/images/icons/settings.svg [new file with mode: 0644]
resources/lib/oojs-ui/images/icons/tag.png [new file with mode: 0644]
resources/lib/oojs-ui/images/icons/tag.svg [new file with mode: 0644]
resources/lib/oojs-ui/images/icons/window.png [new file with mode: 0644]
resources/lib/oojs-ui/images/icons/window.svg [new file with mode: 0644]
resources/lib/oojs-ui/images/indicators/down.png [new file with mode: 0644]
resources/lib/oojs-ui/images/indicators/down.svg [new file with mode: 0644]
resources/lib/oojs-ui/images/indicators/required.png [new file with mode: 0644]
resources/lib/oojs-ui/images/indicators/required.svg [new file with mode: 0644]
resources/lib/oojs-ui/images/indicators/up.png [new file with mode: 0644]
resources/lib/oojs-ui/images/indicators/up.svg [new file with mode: 0644]
resources/lib/oojs-ui/images/tail.svg [new file with mode: 0644]
resources/lib/oojs-ui/images/textures/pending.gif [new file with mode: 0644]
resources/lib/oojs-ui/images/textures/transparency.png [new file with mode: 0644]
resources/lib/oojs-ui/images/toolbar-shadow.png [new file with mode: 0644]
resources/lib/oojs-ui/oojs-ui-agora.css [new file with mode: 0644]
resources/lib/oojs-ui/oojs-ui-apex.css [new file with mode: 0644]
resources/lib/oojs-ui/oojs-ui.js [new file with mode: 0644]
resources/lib/oojs-ui/oojs-ui.svg.css [new file with mode: 0644]
resources/lib/oojs-ui/update-oojs-ui.sh [new file with mode: 0755]
resources/lib/oojs/oojs.js [new file with mode: 0644]
resources/lib/sinonjs/sinon-1.9.0.js [new file with mode: 0644]
resources/lib/sinonjs/sinon-ie-1.9.0.js [new file with mode: 0644]
resources/mediawiki.action/images/green-checkmark.png [deleted file]
resources/mediawiki.action/mediawiki.action.edit.collapsibleFooter.css [deleted file]
resources/mediawiki.action/mediawiki.action.edit.collapsibleFooter.js [deleted file]
resources/mediawiki.action/mediawiki.action.edit.editWarning.js [deleted file]
resources/mediawiki.action/mediawiki.action.edit.js [deleted file]
resources/mediawiki.action/mediawiki.action.edit.preview.js [deleted file]
resources/mediawiki.action/mediawiki.action.edit.styles.css [deleted file]
resources/mediawiki.action/mediawiki.action.history.diff.css [deleted file]
resources/mediawiki.action/mediawiki.action.history.js [deleted file]
resources/mediawiki.action/mediawiki.action.view.dblClickEdit.js [deleted file]
resources/mediawiki.action/mediawiki.action.view.metadata.js [deleted file]
resources/mediawiki.action/mediawiki.action.view.postEdit.css [deleted file]
resources/mediawiki.action/mediawiki.action.view.postEdit.js [deleted file]
resources/mediawiki.action/mediawiki.action.view.redirectToFragment.js [deleted file]
resources/mediawiki.action/mediawiki.action.view.rightClickEdit.js [deleted file]
resources/mediawiki.api/mediawiki.api.category.js [deleted file]
resources/mediawiki.api/mediawiki.api.edit.js [deleted file]
resources/mediawiki.api/mediawiki.api.js [deleted file]
resources/mediawiki.api/mediawiki.api.login.js [deleted file]
resources/mediawiki.api/mediawiki.api.parse.js [deleted file]
resources/mediawiki.api/mediawiki.api.watch.js [deleted file]
resources/mediawiki.language/languages/bs.js [deleted file]
resources/mediawiki.language/languages/dsb.js [deleted file]
resources/mediawiki.language/languages/fi.js [deleted file]
resources/mediawiki.language/languages/ga.js [deleted file]
resources/mediawiki.language/languages/he.js [deleted file]
resources/mediawiki.language/languages/hsb.js [deleted file]
resources/mediawiki.language/languages/hu.js [deleted file]
resources/mediawiki.language/languages/hy.js [deleted file]
resources/mediawiki.language/languages/la.js [deleted file]
resources/mediawiki.language/languages/os.js [deleted file]
resources/mediawiki.language/languages/ru.js [deleted file]
resources/mediawiki.language/languages/sl.js [deleted file]
resources/mediawiki.language/languages/uk.js [deleted file]
resources/mediawiki.language/mediawiki.cldr.js [deleted file]
resources/mediawiki.language/mediawiki.language.init.js [deleted file]
resources/mediawiki.language/mediawiki.language.js [deleted file]
resources/mediawiki.language/mediawiki.language.months.js [deleted file]
resources/mediawiki.language/mediawiki.language.numbers.js [deleted file]
resources/mediawiki.less/mediawiki.mixins.animation.less [deleted file]
resources/mediawiki.less/mediawiki.mixins.less [deleted file]
resources/mediawiki.less/mediawiki.mixins.rotation.less [deleted file]
resources/mediawiki.libs/CLDRPluralRuleParser.js [deleted file]
resources/mediawiki.libs/mediawiki.libs.jpegmeta.js [deleted file]
resources/mediawiki.page/mediawiki.page.gallery.js [deleted file]
resources/mediawiki.page/mediawiki.page.image.pagination.js [deleted file]
resources/mediawiki.page/mediawiki.page.patrol.ajax.js [deleted file]
resources/mediawiki.page/mediawiki.page.ready.js [deleted file]
resources/mediawiki.page/mediawiki.page.startup.js [deleted file]
resources/mediawiki.page/mediawiki.page.watch.ajax.js [deleted file]
resources/mediawiki.special/images/glyph-people-large.png [deleted file]
resources/mediawiki.special/images/icon-contributors.png [deleted file]
resources/mediawiki.special/images/icon-edits.png [deleted file]
resources/mediawiki.special/images/icon-lock.png [deleted file]
resources/mediawiki.special/images/icon-pages.png [deleted file]
resources/mediawiki.special/mediawiki.special.block.css [deleted file]
resources/mediawiki.special/mediawiki.special.block.js [deleted file]
resources/mediawiki.special/mediawiki.special.changeemail.css [deleted file]
resources/mediawiki.special/mediawiki.special.changeemail.js [deleted file]
resources/mediawiki.special/mediawiki.special.changeslist.css [deleted file]
resources/mediawiki.special/mediawiki.special.changeslist.enhanced.css [deleted file]
resources/mediawiki.special/mediawiki.special.changeslist.legend.css [deleted file]
resources/mediawiki.special/mediawiki.special.changeslist.legend.js [deleted file]
resources/mediawiki.special/mediawiki.special.css [deleted file]
resources/mediawiki.special/mediawiki.special.javaScriptTest.js [deleted file]
resources/mediawiki.special/mediawiki.special.js [deleted file]
resources/mediawiki.special/mediawiki.special.movePage.js [deleted file]
resources/mediawiki.special/mediawiki.special.pagesWithProp.css [deleted file]
resources/mediawiki.special/mediawiki.special.preferences.css [deleted file]
resources/mediawiki.special/mediawiki.special.preferences.js [deleted file]
resources/mediawiki.special/mediawiki.special.recentchanges.js [deleted file]
resources/mediawiki.special/mediawiki.special.search.css [deleted file]
resources/mediawiki.special/mediawiki.special.search.js [deleted file]
resources/mediawiki.special/mediawiki.special.undelete.js [deleted file]
resources/mediawiki.special/mediawiki.special.upload.js [deleted file]
resources/mediawiki.special/mediawiki.special.userlogin.common.css [deleted file]
resources/mediawiki.special/mediawiki.special.userlogin.common.js [deleted file]
resources/mediawiki.special/mediawiki.special.userlogin.login.css [deleted file]
resources/mediawiki.special/mediawiki.special.userlogin.signup.css [deleted file]
resources/mediawiki.special/mediawiki.special.userlogin.signup.js [deleted file]
resources/mediawiki.special/mediawiki.special.version.css [deleted file]
resources/mediawiki.ui/components/default/buttons.less [deleted file]
resources/mediawiki.ui/components/default/forms.less [deleted file]
resources/mediawiki.ui/components/utilities.less [deleted file]
resources/mediawiki.ui/components/vector/buttons.less [deleted file]
resources/mediawiki.ui/components/vector/containers.less [deleted file]
resources/mediawiki.ui/components/vector/forms.less [deleted file]
resources/mediawiki.ui/default.less [deleted file]
resources/mediawiki.ui/mixins/effects.less [deleted file]
resources/mediawiki.ui/mixins/forms.less [deleted file]
resources/mediawiki.ui/mixins/type.less [deleted file]
resources/mediawiki.ui/mixins/utilities.less [deleted file]
resources/mediawiki.ui/settings/colors.less [deleted file]
resources/mediawiki.ui/settings/typography.less [deleted file]
resources/mediawiki.ui/styleguide.md [deleted file]
resources/mediawiki.ui/vector.less [deleted file]
resources/mediawiki/images/arrow-collapsed-ltr.png [deleted file]
resources/mediawiki/images/arrow-collapsed-ltr.svg [deleted file]
resources/mediawiki/images/arrow-collapsed-rtl.png [deleted file]
resources/mediawiki/images/arrow-collapsed-rtl.svg [deleted file]
resources/mediawiki/images/arrow-expanded.png [deleted file]
resources/mediawiki/images/arrow-expanded.svg [deleted file]
resources/mediawiki/mediawiki.Title.js [deleted file]
resources/mediawiki/mediawiki.Uri.js [deleted file]
resources/mediawiki/mediawiki.debug.init.js [deleted file]
resources/mediawiki/mediawiki.debug.js [deleted file]
resources/mediawiki/mediawiki.debug.less [deleted file]
resources/mediawiki/mediawiki.debug.profile.css [deleted file]
resources/mediawiki/mediawiki.debug.profile.js [deleted file]
resources/mediawiki/mediawiki.feedback.css [deleted file]
resources/mediawiki/mediawiki.feedback.js [deleted file]
resources/mediawiki/mediawiki.feedback.spinner.gif [deleted file]
resources/mediawiki/mediawiki.hidpi.js [deleted file]
resources/mediawiki/mediawiki.hlist.css [deleted file]
resources/mediawiki/mediawiki.hlist.js [deleted file]
resources/mediawiki/mediawiki.htmlform.js [deleted file]
resources/mediawiki/mediawiki.icon.less [deleted file]
resources/mediawiki/mediawiki.inspect.js [deleted file]
resources/mediawiki/mediawiki.jqueryMsg.js [deleted file]
resources/mediawiki/mediawiki.jqueryMsg.peg [deleted file]
resources/mediawiki/mediawiki.js [deleted file]
resources/mediawiki/mediawiki.log.js [deleted file]
resources/mediawiki/mediawiki.notification.css [deleted file]
resources/mediawiki/mediawiki.notification.hideForPrint.css [deleted file]
resources/mediawiki/mediawiki.notification.js [deleted file]
resources/mediawiki/mediawiki.notify.js [deleted file]
resources/mediawiki/mediawiki.searchSuggest.css [deleted file]
resources/mediawiki/mediawiki.searchSuggest.js [deleted file]
resources/mediawiki/mediawiki.toc.js [deleted file]
resources/mediawiki/mediawiki.user.js [deleted file]
resources/mediawiki/mediawiki.util.js [deleted file]
resources/moment/LICENSE [deleted file]
resources/moment/lang/ar-ma.js [deleted file]
resources/moment/lang/ar.js [deleted file]
resources/moment/lang/bg.js [deleted file]
resources/moment/lang/br.js [deleted file]
resources/moment/lang/bs.js [deleted file]
resources/moment/lang/ca.js [deleted file]
resources/moment/lang/cs.js [deleted file]
resources/moment/lang/cv.js [deleted file]
resources/moment/lang/cy.js [deleted file]
resources/moment/lang/da.js [deleted file]
resources/moment/lang/de.js [deleted file]
resources/moment/lang/el.js [deleted file]
resources/moment/lang/en-au.js [deleted file]
resources/moment/lang/en-ca.js [deleted file]
resources/moment/lang/en-gb.js [deleted file]
resources/moment/lang/eo.js [deleted file]
resources/moment/lang/es.js [deleted file]
resources/moment/lang/et.js [deleted file]
resources/moment/lang/eu.js [deleted file]
resources/moment/lang/fa.js [deleted file]
resources/moment/lang/fi.js [deleted file]
resources/moment/lang/fo.js [deleted file]
resources/moment/lang/fr-ca.js [deleted file]
resources/moment/lang/fr.js [deleted file]
resources/moment/lang/gl.js [deleted file]
resources/moment/lang/he.js [deleted file]
resources/moment/lang/hi.js [deleted file]
resources/moment/lang/hr.js [deleted file]
resources/moment/lang/hu.js [deleted file]
resources/moment/lang/hy-am.js [deleted file]
resources/moment/lang/id.js [deleted file]
resources/moment/lang/is.js [deleted file]
resources/moment/lang/it.js [deleted file]
resources/moment/lang/ja.js [deleted file]
resources/moment/lang/ka.js [deleted file]
resources/moment/lang/ko.js [deleted file]
resources/moment/lang/lb.js [deleted file]
resources/moment/lang/lt.js [deleted file]
resources/moment/lang/lv.js [deleted file]
resources/moment/lang/mk.js [deleted file]
resources/moment/lang/ml.js [deleted file]
resources/moment/lang/mr.js [deleted file]
resources/moment/lang/ms-my.js [deleted file]
resources/moment/lang/nb.js [deleted file]
resources/moment/lang/ne.js [deleted file]
resources/moment/lang/nl.js [deleted file]
resources/moment/lang/nn.js [deleted file]
resources/moment/lang/pl.js [deleted file]
resources/moment/lang/pt-br.js [deleted file]
resources/moment/lang/pt.js [deleted file]
resources/moment/lang/ro.js [deleted file]
resources/moment/lang/rs.js [deleted file]
resources/moment/lang/ru.js [deleted file]
resources/moment/lang/sk.js [deleted file]
resources/moment/lang/sl.js [deleted file]
resources/moment/lang/sq.js [deleted file]
resources/moment/lang/sv.js [deleted file]
resources/moment/lang/ta.js [deleted file]
resources/moment/lang/th.js [deleted file]
resources/moment/lang/tl-ph.js [deleted file]
resources/moment/lang/tr.js [deleted file]
resources/moment/lang/tzm-la.js [deleted file]
resources/moment/lang/tzm.js [deleted file]
resources/moment/lang/uk.js [deleted file]
resources/moment/lang/uz.js [deleted file]
resources/moment/lang/vn.js [deleted file]
resources/moment/lang/zh-cn.js [deleted file]
resources/moment/lang/zh-tw.js [deleted file]
resources/moment/moment.js [deleted file]
resources/oojs-ui/i18n/ace.json [deleted file]
resources/oojs-ui/i18n/af.json [deleted file]
resources/oojs-ui/i18n/am.json [deleted file]
resources/oojs-ui/i18n/ar.json [deleted file]
resources/oojs-ui/i18n/arc.json [deleted file]
resources/oojs-ui/i18n/ast.json [deleted file]
resources/oojs-ui/i18n/az.json [deleted file]
resources/oojs-ui/i18n/ba.json [deleted file]
resources/oojs-ui/i18n/bcl.json [deleted file]
resources/oojs-ui/i18n/be-tarask.json [deleted file]
resources/oojs-ui/i18n/be.json [deleted file]
resources/oojs-ui/i18n/bg.json [deleted file]
resources/oojs-ui/i18n/bn.json [deleted file]
resources/oojs-ui/i18n/br.json [deleted file]
resources/oojs-ui/i18n/bs.json [deleted file]
resources/oojs-ui/i18n/ca.json [deleted file]
resources/oojs-ui/i18n/ce.json [deleted file]
resources/oojs-ui/i18n/ckb.json [deleted file]
resources/oojs-ui/i18n/co.json [deleted file]
resources/oojs-ui/i18n/cs.json [deleted file]
resources/oojs-ui/i18n/cu.json [deleted file]
resources/oojs-ui/i18n/cy.json [deleted file]
resources/oojs-ui/i18n/da.json [deleted file]
resources/oojs-ui/i18n/de.json [deleted file]
resources/oojs-ui/i18n/diq.json [deleted file]
resources/oojs-ui/i18n/dsb.json [deleted file]
resources/oojs-ui/i18n/el.json [deleted file]
resources/oojs-ui/i18n/eml.json [deleted file]
resources/oojs-ui/i18n/en.json [deleted file]
resources/oojs-ui/i18n/eo.json [deleted file]
resources/oojs-ui/i18n/es.json [deleted file]
resources/oojs-ui/i18n/et.json [deleted file]
resources/oojs-ui/i18n/eu.json [deleted file]
resources/oojs-ui/i18n/fa.json [deleted file]
resources/oojs-ui/i18n/fi.json [deleted file]
resources/oojs-ui/i18n/fo.json [deleted file]
resources/oojs-ui/i18n/fr.json [deleted file]
resources/oojs-ui/i18n/frr.json [deleted file]
resources/oojs-ui/i18n/fur.json [deleted file]
resources/oojs-ui/i18n/gl.json [deleted file]
resources/oojs-ui/i18n/gu.json [deleted file]
resources/oojs-ui/i18n/he.json [deleted file]
resources/oojs-ui/i18n/hi.json [deleted file]
resources/oojs-ui/i18n/hr.json [deleted file]
resources/oojs-ui/i18n/hsb.json [deleted file]
resources/oojs-ui/i18n/hu.json [deleted file]
resources/oojs-ui/i18n/hy.json [deleted file]
resources/oojs-ui/i18n/ia.json [deleted file]
resources/oojs-ui/i18n/id.json [deleted file]
resources/oojs-ui/i18n/ie.json [deleted file]
resources/oojs-ui/i18n/ilo.json [deleted file]
resources/oojs-ui/i18n/is.json [deleted file]
resources/oojs-ui/i18n/it.json [deleted file]
resources/oojs-ui/i18n/ja.json [deleted file]
resources/oojs-ui/i18n/jv.json [deleted file]
resources/oojs-ui/i18n/ka.json [deleted file]
resources/oojs-ui/i18n/kk-cyrl.json [deleted file]
resources/oojs-ui/i18n/km.json [deleted file]
resources/oojs-ui/i18n/kn.json [deleted file]
resources/oojs-ui/i18n/ko.json [deleted file]
resources/oojs-ui/i18n/krc.json [deleted file]
resources/oojs-ui/i18n/kw.json [deleted file]
resources/oojs-ui/i18n/ky.json [deleted file]
resources/oojs-ui/i18n/lb.json [deleted file]
resources/oojs-ui/i18n/lmo.json [deleted file]
resources/oojs-ui/i18n/lt.json [deleted file]
resources/oojs-ui/i18n/lv.json [deleted file]
resources/oojs-ui/i18n/mg.json [deleted file]
resources/oojs-ui/i18n/min.json [deleted file]
resources/oojs-ui/i18n/mk.json [deleted file]
resources/oojs-ui/i18n/ml.json [deleted file]
resources/oojs-ui/i18n/mr.json [deleted file]
resources/oojs-ui/i18n/ms.json [deleted file]
resources/oojs-ui/i18n/nap.json [deleted file]
resources/oojs-ui/i18n/nb.json [deleted file]
resources/oojs-ui/i18n/nds-nl.json [deleted file]
resources/oojs-ui/i18n/nds.json [deleted file]
resources/oojs-ui/i18n/ne.json [deleted file]
resources/oojs-ui/i18n/nl.json [deleted file]
resources/oojs-ui/i18n/nn.json [deleted file]
resources/oojs-ui/i18n/om.json [deleted file]
resources/oojs-ui/i18n/or.json [deleted file]
resources/oojs-ui/i18n/pa.json [deleted file]
resources/oojs-ui/i18n/pfl.json [deleted file]
resources/oojs-ui/i18n/pl.json [deleted file]
resources/oojs-ui/i18n/pms.json [deleted file]
resources/oojs-ui/i18n/ps.json [deleted file]
resources/oojs-ui/i18n/pt-br.json [deleted file]
resources/oojs-ui/i18n/pt.json [deleted file]
resources/oojs-ui/i18n/qqq.json [deleted file]
resources/oojs-ui/i18n/qu.json [deleted file]
resources/oojs-ui/i18n/ro.json [deleted file]
resources/oojs-ui/i18n/roa-tara.json [deleted file]
resources/oojs-ui/i18n/ru.json [deleted file]
resources/oojs-ui/i18n/sah.json [deleted file]
resources/oojs-ui/i18n/scn.json [deleted file]
resources/oojs-ui/i18n/sco.json [deleted file]
resources/oojs-ui/i18n/sh.json [deleted file]
resources/oojs-ui/i18n/si.json [deleted file]
resources/oojs-ui/i18n/sk.json [deleted file]
resources/oojs-ui/i18n/sl.json [deleted file]
resources/oojs-ui/i18n/sq.json [deleted file]
resources/oojs-ui/i18n/sr-ec.json [deleted file]
resources/oojs-ui/i18n/sv.json [deleted file]
resources/oojs-ui/i18n/sw.json [deleted file]
resources/oojs-ui/i18n/ta.json [deleted file]
resources/oojs-ui/i18n/te.json [deleted file]
resources/oojs-ui/i18n/th.json [deleted file]
resources/oojs-ui/i18n/tl.json [deleted file]
resources/oojs-ui/i18n/tr.json [deleted file]
resources/oojs-ui/i18n/tt-cyrl.json [deleted file]
resources/oojs-ui/i18n/ug-arab.json [deleted file]
resources/oojs-ui/i18n/uk.json [deleted file]
resources/oojs-ui/i18n/uz.json [deleted file]
resources/oojs-ui/i18n/vec.json [deleted file]
resources/oojs-ui/i18n/vi.json [deleted file]
resources/oojs-ui/i18n/vo.json [deleted file]
resources/oojs-ui/i18n/wuu.json [deleted file]
resources/oojs-ui/i18n/yi.json [deleted file]
resources/oojs-ui/i18n/yo.json [deleted file]
resources/oojs-ui/i18n/zh-hans.json [deleted file]
resources/oojs-ui/i18n/zh-hant.json [deleted file]
resources/oojs-ui/i18n/zh-hk.json [deleted file]
resources/oojs-ui/i18n/zh-tw.json [deleted file]
resources/oojs-ui/images/fade-down.png [deleted file]
resources/oojs-ui/images/fade-up.png [deleted file]
resources/oojs-ui/images/icons/accept.png [deleted file]
resources/oojs-ui/images/icons/accept.svg [deleted file]
resources/oojs-ui/images/icons/add-item.png [deleted file]
resources/oojs-ui/images/icons/add-item.svg [deleted file]
resources/oojs-ui/images/icons/advanced.png [deleted file]
resources/oojs-ui/images/icons/advanced.svg [deleted file]
resources/oojs-ui/images/icons/alert.png [deleted file]
resources/oojs-ui/images/icons/alert.svg [deleted file]
resources/oojs-ui/images/icons/arched-arrow-ltr.png [deleted file]
resources/oojs-ui/images/icons/arched-arrow-ltr.svg [deleted file]
resources/oojs-ui/images/icons/arched-arrow-rtl.png [deleted file]
resources/oojs-ui/images/icons/arched-arrow-rtl.svg [deleted file]
resources/oojs-ui/images/icons/check.png [deleted file]
resources/oojs-ui/images/icons/check.svg [deleted file]
resources/oojs-ui/images/icons/clear.png [deleted file]
resources/oojs-ui/images/icons/clear.svg [deleted file]
resources/oojs-ui/images/icons/close.png [deleted file]
resources/oojs-ui/images/icons/close.svg [deleted file]
resources/oojs-ui/images/icons/code.png [deleted file]
resources/oojs-ui/images/icons/code.svg [deleted file]
resources/oojs-ui/images/icons/collapse.png [deleted file]
resources/oojs-ui/images/icons/collapse.svg [deleted file]
resources/oojs-ui/images/icons/comment.png [deleted file]
resources/oojs-ui/images/icons/comment.svg [deleted file]
resources/oojs-ui/images/icons/expand.png [deleted file]
resources/oojs-ui/images/icons/expand.svg [deleted file]
resources/oojs-ui/images/icons/help.png [deleted file]
resources/oojs-ui/images/icons/help.svg [deleted file]
resources/oojs-ui/images/icons/history.png [deleted file]
resources/oojs-ui/images/icons/history.svg [deleted file]
resources/oojs-ui/images/icons/link.png [deleted file]
resources/oojs-ui/images/icons/link.svg [deleted file]
resources/oojs-ui/images/icons/menu.png [deleted file]
resources/oojs-ui/images/icons/menu.svg [deleted file]
resources/oojs-ui/images/icons/move-ltr.png [deleted file]
resources/oojs-ui/images/icons/move-ltr.svg [deleted file]
resources/oojs-ui/images/icons/move-rtl.png [deleted file]
resources/oojs-ui/images/icons/move-rtl.svg [deleted file]
resources/oojs-ui/images/icons/picture.png [deleted file]
resources/oojs-ui/images/icons/picture.svg [deleted file]
resources/oojs-ui/images/icons/remove-item.png [deleted file]
resources/oojs-ui/images/icons/remove-item.svg [deleted file]
resources/oojs-ui/images/icons/remove.png [deleted file]
resources/oojs-ui/images/icons/remove.svg [deleted file]
resources/oojs-ui/images/icons/search.png [deleted file]
resources/oojs-ui/images/icons/search.svg [deleted file]
resources/oojs-ui/images/icons/settings.png [deleted file]
resources/oojs-ui/images/icons/settings.svg [deleted file]
resources/oojs-ui/images/icons/tag.png [deleted file]
resources/oojs-ui/images/icons/tag.svg [deleted file]
resources/oojs-ui/images/icons/window.png [deleted file]
resources/oojs-ui/images/icons/window.svg [deleted file]
resources/oojs-ui/images/indicators/down.png [deleted file]
resources/oojs-ui/images/indicators/down.svg [deleted file]
resources/oojs-ui/images/indicators/required.png [deleted file]
resources/oojs-ui/images/indicators/required.svg [deleted file]
resources/oojs-ui/images/indicators/up.png [deleted file]
resources/oojs-ui/images/indicators/up.svg [deleted file]
resources/oojs-ui/images/tail.svg [deleted file]
resources/oojs-ui/images/textures/pending.gif [deleted file]
resources/oojs-ui/images/textures/transparency.png [deleted file]
resources/oojs-ui/images/toolbar-shadow.png [deleted file]
resources/oojs-ui/oojs-ui-agora.css [deleted file]
resources/oojs-ui/oojs-ui-apex.css [deleted file]
resources/oojs-ui/oojs-ui.js [deleted file]
resources/oojs-ui/oojs-ui.svg.css [deleted file]
resources/oojs-ui/update-oojs-ui.sh [deleted file]
resources/oojs/oojs.js [deleted file]
resources/oojs/update-oojs.sh [deleted file]
resources/package.json [deleted file]
resources/scripts/nodecheck.sh [deleted file]
resources/sinonjs/sinon-1.9.0.js [deleted file]
resources/sinonjs/sinon-ie-1.9.0.js [deleted file]
resources/src/jquery.tipsy/images/tipsy.png [new file with mode: 0644]
resources/src/jquery.tipsy/jquery.tipsy.css [new file with mode: 0644]
resources/src/jquery.tipsy/jquery.tipsy.js [new file with mode: 0644]
resources/src/jquery.ui-themes/vector/images/close.png [new file with mode: 0644]
resources/src/jquery.ui-themes/vector/images/titlebar-fade.png [new file with mode: 0644]
resources/src/jquery.ui-themes/vector/images/ui-anim_basic_16x16.gif [new file with mode: 0644]
resources/src/jquery.ui-themes/vector/images/ui-bg_flat_15_cd0a0a_40x100.png [new file with mode: 0644]
resources/src/jquery.ui-themes/vector/images/ui-bg_flat_70_000000_40x100.png [new file with mode: 0644]
resources/src/jquery.ui-themes/vector/images/ui-bg_highlight-hard_100_f2f5f7_1x100.png [new file with mode: 0644]
resources/src/jquery.ui-themes/vector/images/ui-bg_highlight-hard_80_d7ebf9_1x100.png [new file with mode: 0644]
resources/src/jquery.ui-themes/vector/images/ui-bg_highlight-soft_100_e4f1fb_1x100.png [new file with mode: 0644]
resources/src/jquery.ui-themes/vector/images/ui-bg_highlight-soft_100_ffffff_1x100.png [new file with mode: 0644]
resources/src/jquery.ui-themes/vector/images/ui-bg_highlight-soft_25_ffef8f_1x100.png [new file with mode: 0644]
resources/src/jquery.ui-themes/vector/images/ui-bg_inset-hard_100_f0f0f0_1x100.png [new file with mode: 0644]
resources/src/jquery.ui-themes/vector/images/ui-icons_2694e8_256x240.png [new file with mode: 0644]
resources/src/jquery.ui-themes/vector/images/ui-icons_2e83ff_256x240.png [new file with mode: 0644]
resources/src/jquery.ui-themes/vector/images/ui-icons_3d80b3_256x240.png [new file with mode: 0644]
resources/src/jquery.ui-themes/vector/images/ui-icons_666666_256x240.png [new file with mode: 0644]
resources/src/jquery.ui-themes/vector/images/ui-icons_72a7cf_256x240.png [new file with mode: 0644]
resources/src/jquery.ui-themes/vector/images/ui-icons_ffffff_256x240.png [new file with mode: 0644]
resources/src/jquery.ui-themes/vector/jquery.ui.accordion.css [new file with mode: 0644]
resources/src/jquery.ui-themes/vector/jquery.ui.autocomplete.css [new file with mode: 0644]
resources/src/jquery.ui-themes/vector/jquery.ui.button.css [new file with mode: 0644]
resources/src/jquery.ui-themes/vector/jquery.ui.core.css [new file with mode: 0644]
resources/src/jquery.ui-themes/vector/jquery.ui.datepicker.css [new file with mode: 0644]
resources/src/jquery.ui-themes/vector/jquery.ui.dialog.css [new file with mode: 0644]
resources/src/jquery.ui-themes/vector/jquery.ui.progressbar.css [new file with mode: 0644]
resources/src/jquery.ui-themes/vector/jquery.ui.resizable.css [new file with mode: 0644]
resources/src/jquery.ui-themes/vector/jquery.ui.selectable.css [new file with mode: 0644]
resources/src/jquery.ui-themes/vector/jquery.ui.slider.css [new file with mode: 0644]
resources/src/jquery.ui-themes/vector/jquery.ui.tabs.css [new file with mode: 0644]
resources/src/jquery.ui-themes/vector/jquery.ui.theme.css [new file with mode: 0644]
resources/src/jquery/images/jquery.arrowSteps.divider-ltr.png [new file with mode: 0644]
resources/src/jquery/images/jquery.arrowSteps.divider-rtl.png [new file with mode: 0644]
resources/src/jquery/images/jquery.arrowSteps.head-ltr.png [new file with mode: 0644]
resources/src/jquery/images/jquery.arrowSteps.head-rtl.png [new file with mode: 0644]
resources/src/jquery/images/jquery.arrowSteps.tail-ltr.png [new file with mode: 0644]
resources/src/jquery/images/jquery.arrowSteps.tail-rtl.png [new file with mode: 0644]
resources/src/jquery/images/marker.png [new file with mode: 0644]
resources/src/jquery/images/mask.png [new file with mode: 0644]
resources/src/jquery/images/sort_both.gif [new file with mode: 0644]
resources/src/jquery/images/sort_down.gif [new file with mode: 0644]
resources/src/jquery/images/sort_none.gif [new file with mode: 0644]
resources/src/jquery/images/sort_up.gif [new file with mode: 0644]
resources/src/jquery/images/spinner-large.gif [new file with mode: 0644]
resources/src/jquery/images/spinner.gif [new file with mode: 0644]
resources/src/jquery/images/wheel.png [new file with mode: 0644]
resources/src/jquery/jquery.arrowSteps.css [new file with mode: 0644]
resources/src/jquery/jquery.arrowSteps.js [new file with mode: 0644]
resources/src/jquery/jquery.autoEllipsis.js [new file with mode: 0644]
resources/src/jquery/jquery.badge.css [new file with mode: 0644]
resources/src/jquery/jquery.badge.js [new file with mode: 0644]
resources/src/jquery/jquery.byteLength.js [new file with mode: 0644]
resources/src/jquery/jquery.byteLimit.js [new file with mode: 0644]
resources/src/jquery/jquery.checkboxShiftClick.js [new file with mode: 0644]
resources/src/jquery/jquery.client.js [new file with mode: 0644]
resources/src/jquery/jquery.color.js [new file with mode: 0644]
resources/src/jquery/jquery.colorUtil.js [new file with mode: 0644]
resources/src/jquery/jquery.expandableField.js [new file with mode: 0644]
resources/src/jquery/jquery.farbtastic.css [new file with mode: 0644]
resources/src/jquery/jquery.farbtastic.js [new file with mode: 0644]
resources/src/jquery/jquery.footHovzer.css [new file with mode: 0644]
resources/src/jquery/jquery.footHovzer.js [new file with mode: 0644]
resources/src/jquery/jquery.getAttrs.js [new file with mode: 0644]
resources/src/jquery/jquery.hidpi.js [new file with mode: 0644]
resources/src/jquery/jquery.highlightText.js [new file with mode: 0644]
resources/src/jquery/jquery.localize.js [new file with mode: 0644]
resources/src/jquery/jquery.makeCollapsible.css [new file with mode: 0644]
resources/src/jquery/jquery.makeCollapsible.js [new file with mode: 0644]
resources/src/jquery/jquery.mw-jump.js [new file with mode: 0644]
resources/src/jquery/jquery.mwExtension.js [new file with mode: 0644]
resources/src/jquery/jquery.placeholder.js [new file with mode: 0644]
resources/src/jquery/jquery.qunit.completenessTest.js [new file with mode: 0644]
resources/src/jquery/jquery.spinner.css [new file with mode: 0644]
resources/src/jquery/jquery.spinner.js [new file with mode: 0644]
resources/src/jquery/jquery.suggestions.css [new file with mode: 0644]
resources/src/jquery/jquery.suggestions.js [new file with mode: 0644]
resources/src/jquery/jquery.tabIndex.js [new file with mode: 0644]
resources/src/jquery/jquery.tablesorter.css [new file with mode: 0644]
resources/src/jquery/jquery.tablesorter.js [new file with mode: 0644]
resources/src/jquery/jquery.textSelection.js [new file with mode: 0644]
resources/src/mediawiki.action/images/green-checkmark.png [new file with mode: 0644]
resources/src/mediawiki.action/mediawiki.action.edit.collapsibleFooter.css [new file with mode: 0644]
resources/src/mediawiki.action/mediawiki.action.edit.collapsibleFooter.js [new file with mode: 0644]
resources/src/mediawiki.action/mediawiki.action.edit.editWarning.js [new file with mode: 0644]
resources/src/mediawiki.action/mediawiki.action.edit.js [new file with mode: 0644]
resources/src/mediawiki.action/mediawiki.action.edit.preview.js [new file with mode: 0644]
resources/src/mediawiki.action/mediawiki.action.edit.styles.css [new file with mode: 0644]
resources/src/mediawiki.action/mediawiki.action.history.diff.css [new file with mode: 0644]
resources/src/mediawiki.action/mediawiki.action.history.js [new file with mode: 0644]
resources/src/mediawiki.action/mediawiki.action.view.dblClickEdit.js [new file with mode: 0644]
resources/src/mediawiki.action/mediawiki.action.view.metadata.js [new file with mode: 0644]
resources/src/mediawiki.action/mediawiki.action.view.postEdit.css [new file with mode: 0644]
resources/src/mediawiki.action/mediawiki.action.view.postEdit.js [new file with mode: 0644]
resources/src/mediawiki.action/mediawiki.action.view.redirectToFragment.js [new file with mode: 0644]
resources/src/mediawiki.action/mediawiki.action.view.rightClickEdit.js [new file with mode: 0644]
resources/src/mediawiki.api/mediawiki.api.category.js [new file with mode: 0644]
resources/src/mediawiki.api/mediawiki.api.edit.js [new file with mode: 0644]
resources/src/mediawiki.api/mediawiki.api.js [new file with mode: 0644]
resources/src/mediawiki.api/mediawiki.api.login.js [new file with mode: 0644]
resources/src/mediawiki.api/mediawiki.api.parse.js [new file with mode: 0644]
resources/src/mediawiki.api/mediawiki.api.watch.js [new file with mode: 0644]
resources/src/mediawiki.language/languages/bs.js [new file with mode: 0644]
resources/src/mediawiki.language/languages/dsb.js [new file with mode: 0644]
resources/src/mediawiki.language/languages/fi.js [new file with mode: 0644]
resources/src/mediawiki.language/languages/ga.js [new file with mode: 0644]
resources/src/mediawiki.language/languages/he.js [new file with mode: 0644]
resources/src/mediawiki.language/languages/hsb.js [new file with mode: 0644]
resources/src/mediawiki.language/languages/hu.js [new file with mode: 0644]
resources/src/mediawiki.language/languages/hy.js [new file with mode: 0644]
resources/src/mediawiki.language/languages/la.js [new file with mode: 0644]
resources/src/mediawiki.language/languages/os.js [new file with mode: 0644]
resources/src/mediawiki.language/languages/ru.js [new file with mode: 0644]
resources/src/mediawiki.language/languages/sl.js [new file with mode: 0644]
resources/src/mediawiki.language/languages/uk.js [new file with mode: 0644]
resources/src/mediawiki.language/mediawiki.cldr.js [new file with mode: 0644]
resources/src/mediawiki.language/mediawiki.language.init.js [new file with mode: 0644]
resources/src/mediawiki.language/mediawiki.language.js [new file with mode: 0644]
resources/src/mediawiki.language/mediawiki.language.months.js [new file with mode: 0644]
resources/src/mediawiki.language/mediawiki.language.numbers.js [new file with mode: 0644]
resources/src/mediawiki.less/mediawiki.mixins.animation.less [new file with mode: 0644]
resources/src/mediawiki.less/mediawiki.mixins.less [new file with mode: 0644]
resources/src/mediawiki.less/mediawiki.mixins.rotation.less [new file with mode: 0644]
resources/src/mediawiki.libs/CLDRPluralRuleParser.js [new file with mode: 0644]
resources/src/mediawiki.libs/mediawiki.libs.jpegmeta.js [new file with mode: 0644]
resources/src/mediawiki.page/mediawiki.page.gallery.js [new file with mode: 0644]
resources/src/mediawiki.page/mediawiki.page.image.pagination.js [new file with mode: 0644]
resources/src/mediawiki.page/mediawiki.page.patrol.ajax.js [new file with mode: 0644]
resources/src/mediawiki.page/mediawiki.page.ready.js [new file with mode: 0644]
resources/src/mediawiki.page/mediawiki.page.startup.js [new file with mode: 0644]
resources/src/mediawiki.page/mediawiki.page.watch.ajax.js [new file with mode: 0644]
resources/src/mediawiki.special/images/glyph-people-large.png [new file with mode: 0644]
resources/src/mediawiki.special/images/icon-contributors.png [new file with mode: 0644]
resources/src/mediawiki.special/images/icon-edits.png [new file with mode: 0644]
resources/src/mediawiki.special/images/icon-lock.png [new file with mode: 0644]
resources/src/mediawiki.special/images/icon-pages.png [new file with mode: 0644]
resources/src/mediawiki.special/mediawiki.special.block.css [new file with mode: 0644]
resources/src/mediawiki.special/mediawiki.special.block.js [new file with mode: 0644]
resources/src/mediawiki.special/mediawiki.special.changeemail.css [new file with mode: 0644]
resources/src/mediawiki.special/mediawiki.special.changeemail.js [new file with mode: 0644]
resources/src/mediawiki.special/mediawiki.special.changeslist.css [new file with mode: 0644]
resources/src/mediawiki.special/mediawiki.special.changeslist.enhanced.css [new file with mode: 0644]
resources/src/mediawiki.special/mediawiki.special.changeslist.legend.css [new file with mode: 0644]
resources/src/mediawiki.special/mediawiki.special.changeslist.legend.js [new file with mode: 0644]
resources/src/mediawiki.special/mediawiki.special.css [new file with mode: 0644]
resources/src/mediawiki.special/mediawiki.special.javaScriptTest.js [new file with mode: 0644]
resources/src/mediawiki.special/mediawiki.special.js [new file with mode: 0644]
resources/src/mediawiki.special/mediawiki.special.movePage.js [new file with mode: 0644]
resources/src/mediawiki.special/mediawiki.special.pagesWithProp.css [new file with mode: 0644]
resources/src/mediawiki.special/mediawiki.special.preferences.css [new file with mode: 0644]
resources/src/mediawiki.special/mediawiki.special.preferences.js [new file with mode: 0644]
resources/src/mediawiki.special/mediawiki.special.recentchanges.js [new file with mode: 0644]
resources/src/mediawiki.special/mediawiki.special.search.css [new file with mode: 0644]
resources/src/mediawiki.special/mediawiki.special.search.js [new file with mode: 0644]
resources/src/mediawiki.special/mediawiki.special.undelete.js [new file with mode: 0644]
resources/src/mediawiki.special/mediawiki.special.upload.js [new file with mode: 0644]
resources/src/mediawiki.special/mediawiki.special.userlogin.common.css [new file with mode: 0644]
resources/src/mediawiki.special/mediawiki.special.userlogin.common.js [new file with mode: 0644]
resources/src/mediawiki.special/mediawiki.special.userlogin.login.css [new file with mode: 0644]
resources/src/mediawiki.special/mediawiki.special.userlogin.signup.css [new file with mode: 0644]
resources/src/mediawiki.special/mediawiki.special.userlogin.signup.js [new file with mode: 0644]
resources/src/mediawiki.special/mediawiki.special.version.css [new file with mode: 0644]
resources/src/mediawiki.ui/components/default/buttons.less [new file with mode: 0644]
resources/src/mediawiki.ui/components/default/forms.less [new file with mode: 0644]
resources/src/mediawiki.ui/components/utilities.less [new file with mode: 0644]
resources/src/mediawiki.ui/components/vector/buttons.less [new file with mode: 0644]
resources/src/mediawiki.ui/components/vector/containers.less [new file with mode: 0644]
resources/src/mediawiki.ui/components/vector/forms.less [new file with mode: 0644]
resources/src/mediawiki.ui/default.less [new file with mode: 0644]
resources/src/mediawiki.ui/mixins/effects.less [new file with mode: 0644]
resources/src/mediawiki.ui/mixins/forms.less [new file with mode: 0644]
resources/src/mediawiki.ui/mixins/type.less [new file with mode: 0644]
resources/src/mediawiki.ui/mixins/utilities.less [new file with mode: 0644]
resources/src/mediawiki.ui/settings/colors.less [new file with mode: 0644]
resources/src/mediawiki.ui/settings/typography.less [new file with mode: 0644]
resources/src/mediawiki.ui/styleguide.md [new file with mode: 0644]
resources/src/mediawiki.ui/vector.less [new file with mode: 0644]
resources/src/mediawiki/images/arrow-collapsed-ltr.png [new file with mode: 0644]
resources/src/mediawiki/images/arrow-collapsed-ltr.svg [new file with mode: 0644]
resources/src/mediawiki/images/arrow-collapsed-rtl.png [new file with mode: 0644]
resources/src/mediawiki/images/arrow-collapsed-rtl.svg [new file with mode: 0644]
resources/src/mediawiki/images/arrow-expanded.png [new file with mode: 0644]
resources/src/mediawiki/images/arrow-expanded.svg [new file with mode: 0644]
resources/src/mediawiki/mediawiki.Title.js [new file with mode: 0644]
resources/src/mediawiki/mediawiki.Uri.js [new file with mode: 0644]
resources/src/mediawiki/mediawiki.debug.init.js [new file with mode: 0644]
resources/src/mediawiki/mediawiki.debug.js [new file with mode: 0644]
resources/src/mediawiki/mediawiki.debug.less [new file with mode: 0644]
resources/src/mediawiki/mediawiki.debug.profile.css [new file with mode: 0644]
resources/src/mediawiki/mediawiki.debug.profile.js [new file with mode: 0644]
resources/src/mediawiki/mediawiki.feedback.css [new file with mode: 0644]
resources/src/mediawiki/mediawiki.feedback.js [new file with mode: 0644]
resources/src/mediawiki/mediawiki.feedback.spinner.gif [new file with mode: 0644]
resources/src/mediawiki/mediawiki.hidpi.js [new file with mode: 0644]
resources/src/mediawiki/mediawiki.hlist.css [new file with mode: 0644]
resources/src/mediawiki/mediawiki.hlist.js [new file with mode: 0644]
resources/src/mediawiki/mediawiki.htmlform.js [new file with mode: 0644]
resources/src/mediawiki/mediawiki.icon.less [new file with mode: 0644]
resources/src/mediawiki/mediawiki.inspect.js [new file with mode: 0644]
resources/src/mediawiki/mediawiki.jqueryMsg.js [new file with mode: 0644]
resources/src/mediawiki/mediawiki.jqueryMsg.peg [new file with mode: 0644]
resources/src/mediawiki/mediawiki.js [new file with mode: 0644]
resources/src/mediawiki/mediawiki.log.js [new file with mode: 0644]
resources/src/mediawiki/mediawiki.notification.css [new file with mode: 0644]
resources/src/mediawiki/mediawiki.notification.hideForPrint.css [new file with mode: 0644]
resources/src/mediawiki/mediawiki.notification.js [new file with mode: 0644]
resources/src/mediawiki/mediawiki.notify.js [new file with mode: 0644]
resources/src/mediawiki/mediawiki.searchSuggest.css [new file with mode: 0644]
resources/src/mediawiki/mediawiki.searchSuggest.js [new file with mode: 0644]
resources/src/mediawiki/mediawiki.toc.js [new file with mode: 0644]
resources/src/mediawiki/mediawiki.user.js [new file with mode: 0644]
resources/src/mediawiki/mediawiki.util.js [new file with mode: 0644]
resources/src/startup.js [new file with mode: 0644]
resources/startup.js [deleted file]
resources/styleguide-template/index.html [deleted file]
resources/styleguide-template/public/kss.less [deleted file]
resources/styleguide-template/public/less.js [deleted file]
skins/common/IEFixes.js
skins/common/commonElements.css
skins/common/images/button_math.png [deleted file]
skins/common/images/feed-icon.svg
skins/common/images/question.svg
skins/common/shared.css
skins/common/wikibits.js
skins/vector/components/common.less
skins/vector/components/externalLinks.less
skins/vector/images/arrow-collapsed-ltr.svg
skins/vector/images/arrow-collapsed-rtl.svg
skins/vector/images/arrow-down-focus-icon.svg
skins/vector/images/arrow-down-icon.svg
skins/vector/images/arrow-expanded.svg
skins/vector/images/audio-icon.png [deleted file]
skins/vector/images/audio-icon.svg [deleted file]
skins/vector/images/document-icon.png [deleted file]
skins/vector/images/document-icon.svg [deleted file]
skins/vector/images/external-link-ltr-icon.svg
skins/vector/images/external-link-rtl-icon.svg
skins/vector/images/file-icon.png [deleted file]
skins/vector/images/file-icon.svg [deleted file]
skins/vector/images/lock-icon.png [deleted file]
skins/vector/images/lock-icon.svg [deleted file]
skins/vector/images/mail-icon.png [deleted file]
skins/vector/images/mail-icon.svg [deleted file]
skins/vector/images/news-icon.png [deleted file]
skins/vector/images/news-icon.svg [deleted file]
skins/vector/images/search-ltr.svg
skins/vector/images/search-rtl.svg
skins/vector/images/talk-icon.png [deleted file]
skins/vector/images/talk-icon.svg [deleted file]
skins/vector/images/unwatch-icon-hl.svg
skins/vector/images/unwatch-icon.svg
skins/vector/images/user-icon.svg
skins/vector/images/video-icon.png [deleted file]
skins/vector/images/video-icon.svg [deleted file]
skins/vector/images/watch-icon-hl.svg
skins/vector/images/watch-icon-loading.svg
skins/vector/images/watch-icon.svg
skins/vector/variables.less
tests/frontend/package.json
tests/parser/parserTests.txt
tests/phpunit/MediaWikiPHPUnitTestListener.php
tests/phpunit/includes/GlobalFunctions/GlobalTest.php
tests/phpunit/includes/MessageTest.php
tests/phpunit/includes/RevisionTest.php
tests/phpunit/includes/TitleTest.php
tests/phpunit/includes/api/RandomImageGenerator.php
tests/phpunit/includes/content/ContentHandlerTest.php
tests/phpunit/includes/json/FormatJsonTest.php
tests/phpunit/includes/title/MediaWikiPageLinkRendererTest.php [new file with mode: 0644]
tests/phpunit/includes/title/MediaWikiTitleCodecTest.php [new file with mode: 0644]
tests/phpunit/includes/title/TitleValueTest.php [new file with mode: 0644]
tests/phpunit/includes/utils/UIDGeneratorTest.php
tests/phpunit/phpunit.php
tests/phpunit/structure/ResourcesTest.php
tests/qunit/QUnitTestResources.php
tests/qunit/data/testrunner.js
tests/qunit/suites/resources/mediawiki.api/mediawiki.api.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.Title.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.Uri.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.jqueryMsg.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.test.js
tests/qunit/suites/resources/startup.test.js
thumb.php

index c7d6f66..0351cf5 100644 (file)
@@ -48,7 +48,7 @@ node_modules/
 /composer.json
 
 # MediaWiki UI documentation
-resources/mediawiki.ui/docs
+/docs/kss/static
 
 # Operating systems
 ## Mac OS X
index 627f7ab..494890c 100644 (file)
@@ -1,39 +1,13 @@
 # Generated documentation
-docs/html/**
-docs/js/**
-resources/mediawiki.ui/docs/**
-
-# kss template for mediawiki ui documentation
-resources/styleguide-template/**
+docs/**
 
 # third-party libs
 extensions/**
 node_modules/**
-resources/jquery/jquery.appear.js
-resources/jquery/jquery.async.js
-resources/jquery/jquery.ba-throttle-debounce.js
-resources/jquery/jquery.cookie.js
-resources/jquery/jquery.cycle.all.js
-resources/jquery/jquery.farbtastic.js
-resources/jquery/jquery.form.js
-resources/jquery/jquery.fullscreen.js
-resources/jquery/jquery.hoverIntent.js
-resources/jquery/jquery.js
-resources/jquery/jquery.json.js
-resources/jquery/jquery.jStorage.js
-resources/jquery/jquery.mockjax.js
-resources/jquery/jquery.qunit.js
-resources/jquery/jquery.validate.js
-resources/jquery/jquery.xmldom.js
-resources/jquery.chosen/chosen.jquery.js
-resources/jquery.effects/**
-resources/jquery.tipsy/**
-resources/jquery.ui/**
-resources/mediawiki.libs/**
-resources/moment/**
-resources/oojs-ui/**
-resources/oojs/**
-resources/sinonjs/**
+resources/lib/**
+resources/src/jquery.tipsy/**
+resources/src/jquery/jquery.farbtastic.js
+resources/src/mediawiki.libs/**
 tests/frontend/node_modules/**
 
 # github.com/jshint/jshint/issues/729
index 9d6c4d2..4eec7a0 100644 (file)
--- a/.jshintrc
+++ b/.jshintrc
@@ -3,6 +3,7 @@
 
        // Enforcing
        "eqeqeq": true,
+       "es3": true,
        "latedef": true,
        "noarg": true,
        "nonew": true,
diff --git a/CREDITS b/CREDITS
index 6e28d6d..cf222a0 100644 (file)
--- a/CREDITS
+++ b/CREDITS
@@ -1,6 +1,6 @@
 {{int:version-credits-summary}}
 <!--
-MediaWiki 1.23 is a collaborative project released under the
+MediaWiki 1.24 is a collaborative project released under the
 GNU General Public License v2. We would like to recognize the
 following names for their contribution to the product.
 -->
diff --git a/HISTORY b/HISTORY
index b2705f1..12532db 100644 (file)
--- a/HISTORY
+++ b/HISTORY
@@ -1,4 +1,4 @@
-Change notes from older releases. For current info see RELEASE-NOTES-1.23.
+Change notes from older releases. For current info see RELEASE-NOTES-1.24.
 
 == MediaWiki 1.22 ==
 
index d430a4d..2d7dfe9 100644 (file)
@@ -11,7 +11,9 @@ production.
 === Configuration changes in 1.23 ===
 * When $wgJobRunRate is higher that zero, jobs are now executed via an
   asynchronous HTTP request to a MediaWiki entry point. This may require
-  increasing the number of server worker threads.
+  increasing the number of server worker threads. $wgRunJobsAsync has been
+  added to disable this feature if needed, falling back to executing the job
+  on the same process but making the execution synchronously.
 * $wgDebugLogGroups values may be set to an associative array with a
   'destination' key specifying the log destination. The array may also contain
   a 'sample' key with a positive integer value N indicating that the log group
@@ -54,6 +56,7 @@ production.
 * $wgLicenseTerms has been removed as it was unused.
 * $wgProfileOnly is now deprecated; set the log file in
   $wgDebugLogGroups['profileoutput'] to replace it.
+* $wgMaxBacklinksInvalidate was removed; use $wgJobBackoffThrottling instead
 
 === New features in 1.23 ===
 * ResourceLoader can utilize the Web Storage API to cache modules client-side.
@@ -136,12 +139,19 @@ production.
   installer has been updated to use it.
 * Changes to content typography (fonts, line-height, etc.). See
   https://www.mediawiki.org/wiki/Typography_refresh for further information.
+* The Vector skin's visual treatment of external links has been simplified to a
+  single icon (from nine). This should not affect local rules unless they were
+  re-using these icons, which have now been deleted.
 * ResourceLoader: mw.loader.using() now implements a Promise interface.
 * Add new hook ChangesListInitRows accessed via ChangesList::initChangesListRows.
   If called by the ChangesList consumer this gives extensions a chance to batch
   process the result set prior to rendering.
 * A PoolCounterRedis class was added which can be make use of in $wgPoolCounterConf.
   This requires at least one Redis 2.6+ server.
+* $wgProfileToDatabase was removed. Set $wgProfiler to ProfilerSimpleDB
+  in StartProfiler.php instead of using this.
+* (bug 63444) Made it possible to change the indent string (default: 4 spaces)
+  used by FormatJson::encode().
 
 === Bug fixes in 1.23 ===
 * (bug 41759) The "updated since last visit" markers (on history pages, recent
@@ -240,6 +250,10 @@ production.
 * (bug 42026) Deprecated uctoponly in favor of ucshow=top.
 * list=search no longer has a "srredirects" parameter. Redirects are now
   included in all searches.
+* Added list=prefixsearch that works like action=opensearch but can be used as
+  a generator.
+* (bug 24782) Various modules will now use unique continuation parameters.
+* (bug 63249) Cache RecentChanges Atom feed in varnish for 15 seconds.
 
 === Languages updated in 1.23 ===
 
@@ -326,6 +340,16 @@ changes to languages because of Bugzilla reports.
 * Special:Search no longer has an "include redirects" option on the advanced
   tab. Redirects are now included in all searches.
 * mediawiki.api.category's getCategories() 'async' parameter was deprecated.
+* The locations of resources have been split between upstream libraries, now in
+  resources/lib/, local libaries in resources/src/, and local forks of upstream
+  libraries, also in resources/src/.
+* BREAKING CHANGE: The automatically-generated function closure with which
+  ResourceLoader wraps all modules' JavaScript code now binds the identifier
+  names 'jQuery' and '$' to the jQuery object of the version of jQuery that is
+  bundled with MediaWiki. If you bind these names to other objects in global
+  scope (like Zepto.js or document.querySelectorAll, for example) you will need
+  to use different names to or re-bind them at the top of each
+  ResourceLoader-loaded module.
 
 ==== Removed classes ====
 * FakeMemCachedClient (deprecated in 1.18)
diff --git a/RELEASE-NOTES-1.24 b/RELEASE-NOTES-1.24
new file mode 100644 (file)
index 0000000..0e7fbe6
--- /dev/null
@@ -0,0 +1,96 @@
+Security reminder: MediaWiki does not require PHP's register_globals. If you
+have it on, turn it '''off''' if you can.
+
+== MediaWiki 1.24 ==
+
+THIS IS NOT A RELEASE YET
+
+MediaWiki 1.24 is an alpha-quality branch and is not recommended for use in
+production.
+
+=== Configuration changes in 1.24 ===
+
+=== New features in 1.24 ===
+
+=== Bug fixes in 1.24 ===
+* (bug 62258) A bug was fixed in File::getUnscaledThumb when a height
+  restriction was present in the parameters.  Images with both the "frame"
+  option and a size specification set will now always ignore the provided
+  size and display an unscaled image, as the documentation has always
+  claimed it would.
+
+=== Web API changes in 1.24 ===
+
+=== Languages updated in 1.24 ===
+
+MediaWiki supports over 350 languages. Many localisations are updated
+regularly. Below only new and removed languages are listed, as well as
+changes to languages because of Bugzilla reports.
+
+=== Other changes in 1.24 ===
+* The deprecated jquery.delayedBind ResourceLoader module was removed.
+
+== Compatibility ==
+
+MediaWiki 1.24 requires PHP 5.3.2 or later.
+
+MySQL is the recommended DBMS. PostgreSQL or SQLite can also be used, but
+support for them is somewhat less mature. There is experimental support for
+Oracle and Microsoft SQL Server.
+
+The supported versions are:
+
+* MySQL 5.0.2 or later
+* PostgreSQL 8.3 or later
+* SQLite 3.3.7 or later
+* Oracle 9.0.1 or later
+* Microsoft SQL Server 2005 (9.00.1399)
+
+== Upgrading ==
+
+1.24 has several database changes since 1.22, and will not work without schema
+updates. Note that due to changes to some very large tables like the revision
+table, the schema update may take quite long (minutes on a medium sized site,
+many hours on a large site).
+
+If upgrading from before 1.11, and you are using a wiki as a commons
+repository, make sure that it is updated as well. Otherwise, errors may arise
+due to database schema changes.
+
+If upgrading from before 1.7, you may want to run refreshLinks.php to ensure
+new database fields are filled with data.
+
+If you are upgrading from MediaWiki 1.4.x or earlier, you should upgrade to
+1.5 first. The upgrade script maintenance/upgrade1_5.php has been removed
+with MediaWiki 1.21.
+
+Don't forget to always back up your database before upgrading!
+
+See the file UPGRADE for more detailed upgrade instructions.
+
+For notes on 1.21.x and older releases, see HISTORY.
+
+== Online documentation ==
+
+Documentation for both end-users and site administrators is available on
+MediaWiki.org, and is covered under the GNU Free Documentation License (except
+for pages that explicitly state that their contents are in the public domain):
+
+       https://www.mediawiki.org/wiki/Documentation
+
+== Mailing list ==
+
+A mailing list is available for MediaWiki user support and discussion:
+
+       https://lists.wikimedia.org/mailman/listinfo/mediawiki-l
+
+A low-traffic announcements-only list is also available:
+
+       https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce
+
+It's highly recommended that you sign up for one of these lists if you're
+going to run a public MediaWiki, so you can be notified of security fixes.
+
+== IRC help ==
+
+There's usually someone online in #mediawiki on irc.freenode.net.
index ff1d6a1..668cc06 100644 (file)
@@ -844,6 +844,21 @@ $changesList: ChangesList instance
 $rows: The data that will be rendered. May be a ResultWrapper instance or
   an array.
 
+'ChangesListSpecialPageFilters': Called after building form options on pages inheriting from ChangesListSpecialPage (in core: RecentChanges, RecentChangesLinked and Watchlist).
+$special: ChangesListSpecialPage instance
+&$filters: associative array of filter definitions. The keys are the HTML
+  name/URL parameters. Each key maps to an associative array with a 'msg'
+  (message key) and a 'default' value.
+
+'ChangesListSpecialPageQuery': Called when building SQL query on pages inheriting from ChangesListSpecialPage (in core: RecentChanges, RecentChangesLinked and Watchlist).
+$name: name of the special page, e.g. 'Watchlist'
+&$tables: array of tables to be queried
+&$fields: array of columns to select
+&$conds: array of WHERE conditionals for query
+&$query_options: array of options for the database request
+&$join_conds: join conditions for the tables
+$opts: FormOptions for this request
+
 'Collation::factory': Called if $wgCategoryCollation is an unknown collation.
 $collationName: Name of the collation in question
 &$collationObject: Null. Replace with a subclass of the Collation class that
@@ -1010,6 +1025,12 @@ yourself. Alternatively, modifying $error and returning true will cause the
 contents of $error to be echoed at the top of the edit form as wikitext.
 Return true without altering $error to allow the edit to proceed.
 
+'EditPage::showReadOnlyForm:initial: similar to EditPage::showEditForm:initial
+but for the readonly 'view source' variant of the edit form.
+$editor: EditPage instance (object)
+&$out: an OutputPage instance to write to
+return value is ignored (should alway return true)
+
 'EditPage::showStandardInputs:options': allows injection of form fields into
 the editOptions area
 $editor: EditPage instance (object)
@@ -2369,7 +2390,7 @@ use this to change some selection criteria or substitute a different title.
   result from the normal query
 
 'SpecialRecentChangesFilters': Called after building form options at
-RecentChanges.
+RecentChanges. Deprecated, use ChangesListSpecialPageFilters instead.
 $special: the special page object
 &$filters: associative array of filter definitions. The keys are the HTML
   name/URL parameters. Each key maps to an associative array with a 'msg'
@@ -2381,7 +2402,8 @@ SpecialRecentChanges.
 $opts: FormOptions for this request
 
 'SpecialRecentChangesQuery': Called when building SQL query for
-SpecialRecentChanges and SpecialRecentChangesLinked.
+SpecialRecentChanges and SpecialRecentChangesLinked. Deprecated, use
+ChangesListSpecialPageQuery instead.
 &$conds: array of WHERE conditionals for query
 &$tables: array of tables to be queried
 &$join_conds: join conditions for the tables
@@ -2471,12 +2493,14 @@ $wgVersion: Current $wgVersion for you to use
 &$versionUrl: Raw url to link to (eg: release notes)
 
 'SpecialWatchlistFilters': Called after building form options at Watchlist.
+Deprecated, use ChangesListSpecialPageFilters instead.
 $special: the special page object
 &$filters: associative array of filter definitions. The keys are the HTML
   name/URL parameters. Each key maps to an associative array with a 'msg'
   (message key) and a 'default' value.
 
 'SpecialWatchlistQuery': Called when building sql query for SpecialWatchlist.
+Deprecated, use ChangesListSpecialPageQuery instead.
 &$conds: array of WHERE conditionals for query
 &$tables: array of tables to be queried
 &$join_conds: join conditions for the tables
diff --git a/docs/kss/Makefile b/docs/kss/Makefile
new file mode 100644 (file)
index 0000000..fee82cb
--- /dev/null
@@ -0,0 +1,19 @@
+MEDIAWIKI_LOAD_URL ?= http://localhost/w/load.php
+
+kss: nodecheck
+# FIXME: Use more up-to-date Ruby version
+
+# Generates CSS of mediawiki.ui and mediawiki.ui.button using ResourceLoader, then applies it to the
+# KSS style guide
+       $(eval KSS_RL_TMP := $(shell mktemp /tmp/tmp.XXXXXXXXXX))
+       @curl -sG "${MEDIAWIKI_LOAD_URL}?modules=mediawiki.ui|mediawiki.ui.button&only=styles" > $(KSS_RL_TMP)
+       @node_modules/.bin/kss-node ../../resources/src/mediawiki.ui static/ --css $(KSS_RL_TMP) -t styleguide-template
+       @rm $(KSS_RL_TMP)
+
+kssopen: kss
+       @echo Opening the generated style guide...
+       @command -v xdg-open >/dev/null 2>&1 || { open ${PWD}/static/index.html; exit 0; }
+       @xdg-open ${PWD}/static/index.html
+
+nodecheck:
+       @scripts/nodecheck.sh
diff --git a/docs/kss/README.txt b/docs/kss/README.txt
new file mode 100644 (file)
index 0000000..d91bf2a
--- /dev/null
@@ -0,0 +1,4 @@
+The Makefile, package.json, scripts, styleguide-template, and
+mediawiki.ui/styleguide.md files and directories in here support the automatic
+generation of CSS documentation from the source LESS files using kss for
+node.js, https://github.com/kneath/kss
diff --git a/docs/kss/package.json b/docs/kss/package.json
new file mode 100644 (file)
index 0000000..70cebd2
--- /dev/null
@@ -0,0 +1,13 @@
+{
+       "name": "mediawiki-ui-dependencies",
+       "description": "Node.js dependencies used for KSS generation",
+       "version": "0.0.1",
+       "dependencies": {
+               "kss": ">=0.3.7"
+       },
+       "repository" : {
+               "type" : "git",
+               "url" : "https://gerrit.wikimedia.org/r/p/mediawiki/core.git"
+       }
+
+}
diff --git a/docs/kss/scripts/nodecheck.sh b/docs/kss/scripts/nodecheck.sh
new file mode 100755 (executable)
index 0000000..3ee0f83
--- /dev/null
@@ -0,0 +1,8 @@
+#!/usr/bin/env bash
+if command -v npm > /dev/null ; then
+  npm install
+else
+  echo "You need to install Node.JS!"
+  echo "See http://nodejs.org/"
+  exit 1
+fi
diff --git a/docs/kss/styleguide-template/index.html b/docs/kss/styleguide-template/index.html
new file mode 100644 (file)
index 0000000..99f3e4f
--- /dev/null
@@ -0,0 +1,60 @@
+<!DOCTYPE html>
+<html class="no-js" lang="en">
+<head>
+       <meta charset="utf-8">
+       <title>MediaWiki Living Styleguide</title>
+       <meta name="description" content="">
+       <meta name="generator" content="kss-node" />
+       <meta name="viewport" content="width=device-width">
+       <link rel="stylesheet" href="public/kss.css">
+       <link rel="stylesheet" href="public/style.css">
+</head>
+<body><div id="kss-wrapper">
+       <header id="kss-header">
+               <hgroup><h1>MediaWiki Living Styleguide</h1></hgroup>
+       </header>
+       <nav class="content">
+               <ul>
+               <li><a href="index.html">0.0: Overview</a></li>
+               {{#eachRoot}}
+               <li>
+                       <a href="section-{{reference}}.html">{{reference}}.0: {{header}}</a>
+               </li>
+               {{/eachRoot}}
+               </ul>
+       </nav>
+       <article>
+               {{#if overview}}
+                       {{html overview}}
+               {{else}}
+                       {{#eachSection rootNumber}}
+                               {{#whenDepth 1}}
+                                       <h1>{{ reference }}.0 - {{ header }}</h1>
+                               {{else}}
+                                       {{#whenDepth 2}}
+                                       <h2>{{ reference }} - {{ header }}</h2>
+                                       {{/whenDepth}}
+                                       {{#whenDepth 3}}
+                                       <h3>{{ reference }} - {{ header }}</h3>
+                                       {{/whenDepth}}
+                               {{/whenDepth}}
+                               {{#ifAny markup modifiers}}
+                                               <div>{{html description}}</div>
+                                               <strong>Default styling</strong><br>
+                                               {{modifierMarkup}}
+                                               {{#eachModifier}}
+                                               {{html description}}<br>
+                                               <p>{{name}}</p>
+                                               {{modifierMarkup}}
+                                               {{/eachModifier}}
+                                               <pre class="prettyprint lang-html">{{markup}}</pre>
+                               {{else}}
+                                               {{#if description}}
+                                                       {{html description}}
+                                               {{/if}}
+                               {{/ifAny}}
+                       {{/eachSection}}
+               {{/if}}
+       </article>
+</div></body>
+</html>
diff --git a/docs/kss/styleguide-template/public/kss.less b/docs/kss/styleguide-template/public/kss.less
new file mode 100644 (file)
index 0000000..431303d
--- /dev/null
@@ -0,0 +1,24 @@
+header {
+       padding: .8em 16px 0;
+}
+
+nav {
+       float: left;
+       width: 200px;
+}
+
+article {
+       margin-left: 250px;
+}
+
+.content.kss-no-margin {
+       margin: 0;
+}
+
+// FIXME: Remove when typography module in mediawiki-ui
+body {
+       font-family: "Nimbus Sans L", "Liberation Sans", "Helvetica Neue", "Helvetica", "Arial", sans-serif;
+}
+h1,h2,h3,h4,h5 {
+       font-family: "DejaVu Serif", Georgia, serif;
+}
diff --git a/docs/kss/styleguide-template/public/less.js b/docs/kss/styleguide-template/public/less.js
new file mode 100644 (file)
index 0000000..89b7637
--- /dev/null
@@ -0,0 +1,9 @@
+//
+// LESS - Leaner CSS v1.2.1
+// http://lesscss.org
+// 
+// Copyright (c) 2009-2011, Alexis Sellier
+// Licensed under the Apache 2.0 License.
+//
+(function(a,b){function c(b){return a.less[b.split("/")[1]]}function m(){var a=document.getElementsByTagName("style");for(var b=0;b<a.length;b++)a[b].type.match(k)&&(new d.Parser).parse(a[b].innerHTML||"",function(c,d){var e=d.toCSS(),f=a[b];f.type="text/css",f.styleSheet?f.styleSheet.cssText=e:f.innerHTML=e})}function n(a,b){for(var c=0;c<d.sheets.length;c++)o(d.sheets[c],a,b,d.sheets.length-(c+1))}function o(b,c,e,f){var g=a.location.href.replace(/[#?].*$/,""),i=b.href.replace(/\?.*$/,""),j=h&&h.getItem(i),k=h&&h.getItem(i+":timestamp"),l={css:j,timestamp:k};/^(https?|file):/.test(i)||(i.charAt(0)=="/"?i=a.location.protocol+"//"+a.location.host+i:i=g.slice(0,g.lastIndexOf("/")+1)+i);var m=i.match(/([^\/]+)$/)[1];s(b.href,b.type,function(a,g){if(!e&&l&&g&&(new Date(g)).valueOf()===(new Date(l.timestamp)).valueOf())r(l.css,b),c(null,b,{local:!0,remaining:f});else try{(new d.Parser({optimization:d.optimization,paths:[i.replace(/[\w\.-]+$/,"")],mime:b.type,filename:m})).parse(a,function(d,e){if(d)return w(d,i);try{c(d,e,a,b,{local:!1,lastModified:g,remaining:f}),u(document.getElementById("less-error-message:"+q(i)))}catch(d){w(d,i)}})}catch(h){w(h,i)}},function(a,b){throw new Error("Couldn't load "+b+" ("+a+")")})}function q(a){return a.replace(/^[a-z]+:\/\/?[^\/]+/,"").replace(/^\//,"").replace(/\?.*$/,"").replace(/\.[^\.\/]+$/,"").replace(/[^\.\w-]+/g,"-").replace(/\./g,":")}function r(a,b,c){var d,e=b.href?b.href.replace(/\?.*$/,""):"",f="less:"+(b.title||q(e));(d=document.getElementById(f))===null&&(d=document.createElement("style"),d.type="text/css",d.media=b.media||"screen",d.id=f,document.getElementsByTagName("head")[0].appendChild(d));if(d.styleSheet)try{d.styleSheet.cssText=a}catch(g){throw new Error("Couldn't reassign styleSheet.cssText.")}else(function(a){d.childNodes.length>0?d.firstChild.nodeValue!==a.nodeValue&&d.replaceChild(a,d.firstChild):d.appendChild(a)})(document.createTextNode(a));c&&h&&(v("saving "+e+" to cache."),h.setItem(e,a),h.setItem(e+":timestamp",c))}function s(a,b,c,e){function i(b,c,d){b.status>=200&&b.status<300?c(b.responseText,b.getResponseHeader("Last-Modified")):typeof d=="function"&&d(b.status,a)}var f=t(),h=g?!1:d.async;typeof f.overrideMimeType=="function"&&f.overrideMimeType("text/css"),f.open("GET",a,h),f.setRequestHeader("Accept",b||"text/x-less, text/css; q=0.9, */*; q=0.5"),f.send(null),g?f.status===0||f.status>=200&&f.status<300?c(f.responseText):e(f.status,a):h?f.onreadystatechange=function(){f.readyState==4&&i(f,c,e)}:i(f,c,e)}function t(){if(a.XMLHttpRequest)return new XMLHttpRequest;try{return new ActiveXObject("MSXML2.XMLHTTP.3.0")}catch(b){return v("browser doesn't support AJAX."),null}}function u(a){return a&&a.parentNode.removeChild(a)}function v(a){d.env=="development"&&typeof console!="undefined"&&console.log("less: "+a)}function w(a,b){var c="less-error-message:"+q(b),e='<li><label>{line}</label><pre class="{class}">{content}</pre></li>',f=document.createElement("div"),g,h,i=[],j=a.filename||b;f.id=c,f.className="less-error-message",h="<h3>"+(a.message||"There is an error in your .less file")+"</h3>"+'<p>in <a href="'+j+'">'+j+"</a> ";var k=function(a,b,c){a.extract[b]&&i.push(e.replace(/\{line\}/,parseInt(a.line)+(b-1)).replace(/\{class\}/,c).replace(/\{content\}/,a.extract[b]))};a.stack?h+="<br/>"+a.stack.split("\n").slice(1).join("<br/>"):a.extract&&(k(a,0,""),k(a,1,"line"),k(a,2,""),h+="on line "+a.line+", column "+(a.column+1)+":</p>"+"<ul>"+i.join("")+"</ul>"),f.innerHTML=h,r([".less-error-message ul, .less-error-message li {","list-style-type: none;","margin-right: 15px;","padding: 4px 0;","margin: 0;","}",".less-error-message label {","font-size: 12px;","margin-right: 15px;","padding: 4px 0;","color: #cc7777;","}",".less-error-message pre {","color: #dd6666;","padding: 4px 0;","margin: 0;","display: inline-block;","}",".less-error-message pre.line {","color: #ff0000;","}",".less-error-message h3 {","font-size: 20px;","font-weight: bold;","padding: 15px 0 5px 0;","margin: 0;","}",".less-error-message a {","color: #10a","}",".less-error-message .error {","color: red;","font-weight: bold;","padding-bottom: 2px;","border-bottom: 1px dashed red;","}"].join("\n"),{title:"error-message"}),f.style.cssText=["font-family: Arial, sans-serif","border: 1px solid #e00","background-color: #eee","border-radius: 5px","-webkit-border-radius: 5px","-moz-border-radius: 5px","color: #e00","padding: 15px","margin-bottom: 15px"].join(";"),d.env=="development"&&(g=setInterval(function(){document.body&&(document.getElementById(c)?document.body.replaceChild(f,document.getElementById(c)):document.body.insertBefore(f,document.body.firstChild),clearInterval(g))},10))}Array.isArray||(Array.isArray=function(a){return Object.prototype.toString.call(a)==="[object Array]"||a instanceof Array}),Array.prototype.forEach||(Array.prototype.forEach=function(a,b){var c=this.length>>>0;for(var d=0;d<c;d++)d in this&&a.call(b,this[d],d,this)}),Array.prototype.map||(Array.prototype.map=function(a){var b=this.length>>>0,c=new Array(b),d=arguments[1];for(var e=0;e<b;e++)e in this&&(c[e]=a.call(d,this[e],e,this));return c}),Array.prototype.filter||(Array.prototype.filter=function(a){var b=[],c=arguments[1];for(var d=0;d<this.length;d++)a.call(c,this[d])&&b.push(this[d]);return b}),Array.prototype.reduce||(Array.prototype.reduce=function(a){var b=this.length>>>0,c=0;if(b===0&&arguments.length===1)throw new TypeError;if(arguments.length>=2)var d=arguments[1];else do{if(c in this){d=this[c++];break}if(++c>=b)throw new TypeError}while(!0);for(;c<b;c++)c in this&&(d=a.call(null,d,this[c],c,this));return d}),Array.prototype.indexOf||(Array.prototype.indexOf=function(a){var b=this.length,c=arguments[1]||0;if(!b)return-1;if(c>=b)return-1;c<0&&(c+=b);for(;c<b;c++){if(!Object.prototype.hasOwnProperty.call(this,c))continue;if(a===this[c])return c}return-1}),Object.keys||(Object.keys=function(a){var b=[];for(var c in a)Object.prototype.hasOwnProperty.call(a,c)&&b.push(c);return b}),String.prototype.trim||(String.prototype.trim=function(){return String(this).replace(/^\s\s*/,"").replace(/\s\s*$/,"")});var d,f;typeof environment=="object"&&{}.toString.call(environment)==="[object Environment]"?(typeof a=="undefined"?d={}:d=a.less={},f=d.tree={},d.mode="rhino"):typeof a=="undefined"?(d=exports,f=c("./tree"),d.mode="node"):(typeof a.less=="undefined"&&(a.less={}),d=a.less,f=a.less.tree={},d.mode="browser"),d.Parser=function(b){function t(){j=m[i],k=h,n=h}function u(){m[i]=j,h=k,n=h}function v(){h>n&&(m[i]=m[i].slice(h-n),n=h)}function w(a){var b,c,d,e,f,j,k,l;if(a instanceof Function)return a.call(o.parsers);if(typeof a=="string")b=g.charAt(h)===a?a:null,d=1,v();else{v();if(!(b=a.exec(m[i])))return null;d=b[0].length}if(b){l=h+=d,j=h+m[i].length-d;while(h<j){e=g.charCodeAt(h);if(e!==32&&e!==10&&e!==9)break;h++}return m[i]=m[i].slice(d+(h-l)),n=h,m[i].length===0&&i<m.length-1&&i++,typeof b=="string"?b:b.length===1?b[0]:b}}function x(a,b){var c=w(a);if(!!c)return c;y(b||(typeof a=="string"?"expected '"+a+"' got '"+g.charAt(h)+"'":"unexpected token"))}function y(a,b){throw{index:h,type:b||"Syntax",message:a}}function z(a){return typeof a=="string"?g.charAt(h)===a:a.test(m[i])?!0:!1}function A(a,b){return a.filename&&b.filename&&a.filename!==b.filename?o.imports.contents[a.filename]:g}function B(a,b){for(var c=a,d=-1;c>=0&&b.charAt(c)!=="\n";c--)d++;return{line:typeof a=="number"?(b.slice(0,a).match(/\n/g)||"").length:null,column:d}}function C(a,b){var c=A(a,b),d=B(a.index,c),e=d.line,f=d.column,g=c.split("\n");this.type=a.type||"Syntax",this.message=a.message,this.filename=a.filename||b.filename,this.index=a.index,this.line=typeof e=="number"?e+1:null,this.callLine=a.call&&B(a.call,c)+1,this.callExtract=g[B(a.call,c)],this.stack=a.stack,this.column=f,this.extract=[g[e-1],g[e],g[e+1]]}var g,h,i,j,k,l,m,n,o,q=this,r=function(){},s=this.imports={paths:b&&b.paths||[],queue:[],files:{},contents:{},mime:b&&b.mime,error:null,push:function(a,c){var e=this;this.queue.push(a),d.Parser.importer(a,this.paths,function(b,d,f){e.queue.splice(e.queue.indexOf(a),1),e.files[a]=d,e.contents[a]=f,b&&!e.error&&(e.error=b),c(b,d),e.queue.length===0&&r()},b)}};return this.env=b=b||{},this.optimization="optimization"in this.env?this.env.optimization:1,this.env.filename=this.env.filename||null,o={imports:s,parse:function(a,e){var j,k,p,q,s,t,u=[],v,x=null;h=i=n=l=0,m=[],g=a.replace(/\r\n/g,"\n"),m=function(a){var c=0,d=/[^"'`\{\}\/\(\)]+/g,e=/\/\*(?:[^*]|\*+[^\/*])*\*+\/|\/\/.*/g,f=0,h,i=a[0],j,k;for(var l=0,m,n;l<g.length;l++){d.lastIndex=l,(h=d.exec(g))&&h.index===l&&(l+=h[0].length,i.push(h[0])),m=g.charAt(l),e.lastIndex=l,!k&&!j&&m==="/"&&(n=g.charAt(l+1),(n==="/"||n==="*")&&(h=e.exec(g))&&h.index===l&&(l+=h[0].length,i.push(h[0]),m=g.charAt(l)));if(m==="{"&&!k&&!j)f++,i.push(m);else if(m==="}"&&!k&&!j)f--,i.push(m),a[++c]=i=[];else if(m==="("&&!k&&!j)i.push(m),j=!0;else if(m===")"&&!k&&j)i.push(m),j=!1;else{if(m==='"'||m==="'"||m==="`")k?k=k===m?!1:k:k=m;i.push(m)}}if(f>0)throw{type:"Syntax",message:"Missing closing `}`",filename:b.filename};return a.map(function(a){return a.join("")})}([[]]);try{j=new f.Ruleset([],w(this.parsers.primary)),j.root=!0}catch(y){return e(new C(y,b))}j.toCSS=function(a){var e,g,h;return function(e,g){var h=[],i;e=e||{},typeof g=="object"&&!Array.isArray(g)&&(g=Object.keys(g).map(function(a){var b=g[a];return b instanceof f.Value||(b instanceof f.Expression||(b=new f.Expression([b])),b=new f.Value([b])),new f.Rule("@"+a,b,!1,0)}),h=[new f.Ruleset(null,g)]);try{var j=a.call(this,{frames:h}).toCSS([],{compress:e.compress||!1})}catch(k){throw new C(k,b)}if(i=o.imports.error)throw i instanceof C?i:new C(i,b);return e.yuicompress&&d.mode==="node"?c("./cssmin").compressor.cssmin(j):e.compress?j.replace(/(\s)+/g,"$1"):j}}(j.eval);if(h<g.length-1){h=l,t=g.split("\n"),s=(g.slice(0,h).match(/\n/g)||"").length+1;for(var z=h,A=-1;z>=0&&g.charAt(z)!=="\n";z--)A++;x={type:"Parse",message:"Syntax Error on line "+s,index:h,filename:b.filename,line:s,column:A,extract:[t[s-2],t[s-1],t[s]]}}this.imports.queue.length>0?r=function(){e(x,j)}:e(x,j)},parsers:{primary:function(){var a,b=[];while((a=w(this.mixin.definition)||w(this.rule)||w(this.ruleset)||w(this.mixin.call)||w(this.comment)||w(this.directive))||w(/^[\s\n]+/))a&&b.push(a);return b},comment:function(){var a;if(g.charAt(h)!=="/")return;if(g.charAt(h+1)==="/")return new f.Comment(w(/^\/\/.*/),!0);if(a=w(/^\/\*(?:[^*]|\*+[^\/*])*\*+\/\n?/))return new f.Comment(a)},entities:{quoted:function(){var a,b=h,c;g.charAt(b)==="~"&&(b++,c=!0);if(g.charAt(b)!=='"'&&g.charAt(b)!=="'")return;c&&w("~");if(a=w(/^"((?:[^"\\\r\n]|\\.)*)"|'((?:[^'\\\r\n]|\\.)*)'/))return new f.Quoted(a[0],a[1]||a[2],c)},keyword:function(){var a;if(a=w(/^[_A-Za-z-][_A-Za-z0-9-]*/))return f.colors.hasOwnProperty(a)?new f.Color(f.colors[a].slice(1)):new f.Keyword(a)},call:function(){var a,c,d=h;if(!(a=/^([\w-]+|%|progid:[\w\.]+)\(/.exec(m[i])))return;a=a[1].toLowerCase();if(a==="url")return null;h+=a.length;if(a==="alpha")return w(this.alpha);w("("),c=w(this.entities.arguments);if(!w(")"))return;if(a)return new f.Call(a,c,d,b.filename)},arguments:function(){var a=[],b;while(b=w(this.entities.assignment)||w(this.expression)){a.push(b);if(!w(","))break}return a},literal:function(){return w(this.entities.dimension)||w(this.entities.color)||w(this.entities.quoted)},assignment:function(){var a,b;if((a=w(/^\w+(?=\s?=)/i))&&w("=")&&(b=w(this.entity)))return new f.Assignment(a,b)},url:function(){var a;if(g.charAt(h)!=="u"||!w(/^url\(/))return;return a=w(this.entities.quoted)||w(this.entities.variable)||w(this.entities.dataURI)||w(/^[-\w%@$\/.&=:;#+?~]+/)||"",x(")"),new f.URL(a.value||a.data||a instanceof f.Variable?a:new f.Anonymous(a),s.paths)},dataURI:function(){var a;if(w(/^data:/)){a={},a.mime=w(/^[^\/]+\/[^,;)]+/)||"",a.charset=w(/^;\s*charset=[^,;)]+/)||"",a.base64=w(/^;\s*base64/)||"",a.data=w(/^,\s*[^)]+/);if(a.data)return a}},variable:function(){var a,c=h;if(g.charAt(h)==="@"&&(a=w(/^@@?[\w-]+/)))return new f.Variable(a,c,b.filename)},color:function(){var a;if(g.charAt(h)==="#"&&(a=w(/^#([a-fA-F0-9]{6}|[a-fA-F0-9]{3})/)))return new f.Color(a[1])},dimension:function(){var a,b=g.charCodeAt(h);if(b>57||b<45||b===47)return;if(a=w(/^(-?\d*\.?\d+)(px|%|em|rem|pc|ex|in|deg|s|ms|pt|cm|mm|rad|grad|turn)?/))return new f.Dimension(a[1],a[2])},javascript:function(){var a,b=h,c;g.charAt(b)==="~"&&(b++,c=!0);if(g.charAt(b)!=="`")return;c&&w("~");if(a=w(/^`([^`]*)`/))return new f.JavaScript(a[1],h,c)}},variable:function(){var a;if(g.charAt(h)==="@"&&(a=w(/^(@[\w-]+)\s*:/)))return a[1]},shorthand:function(){var a,b;if(!z(/^[@\w.%-]+\/[@\w.-]+/))return;if((a=w(this.entity))&&w("/")&&(b=w(this.entity)))return new f.Shorthand(a,b)},mixin:{call:function(){var a=[],c,d,e,i=h,j=g.charAt(h),k=!1;if(j!=="."&&j!=="#")return;while(c=w(/^[#.](?:[\w-]|\\(?:[a-fA-F0-9]{1,6} ?|[^a-fA-F0-9]))+/))a.push(new f.Element(d,c,h)),d=w(">");w("(")&&(e=w(this.entities.arguments))&&w(")"),w(this.important)&&(k=!0);if(a.length>0&&(w(";")||z("}")))return new f.mixin.Call(a,e,i,b.filename,k)},definition:function(){var a,b=[],c,d,e,i,j;if(g.charAt(h)!=="."&&g.charAt(h)!=="#"||z(/^[^{]*(;|})/))return;t();if(c=w(/^([#.](?:[\w-]|\\(?:[a-fA-F0-9]{1,6} ?|[^a-fA-F0-9]))+)\s*\(/)){a=c[1];while(e=w(this.entities.variable)||w(this.entities.literal)||w(this.entities.keyword)){e instanceof f.Variable?w(":")?(i=x(this.expression,"expected expression"),b.push({name:e.name,value:i})):b.push({name:e.name}):b.push({value:e});if(!w(","))break}x(")"),w(/^when/)&&(j=x(this.conditions,"expected condition")),d=w(this.block);if(d)return new f.mixin.Definition(a,b,d,j);u()}}},entity:function(){return w(this.entities.literal)||w(this.entities.variable)||w(this.entities.url)||w(this.entities.call)||w(this.entities.keyword)||w(this.entities.javascript)||w(this.comment)},end:function(){return w(";")||z("}")},alpha:function(){var a;if(!w(/^\(opacity=/i))return;if(a=w(/^\d+/)||w(this.entities.variable))return x(")"),new f.Alpha(a)},element:function(){var a,b,c,d;c=w(this.combinator),a=w(/^(?:\d+\.\d+|\d+)%/)||w(/^(?:[.#]?|:*)(?:[\w-]|\\(?:[a-fA-F0-9]{1,6} ?|[^a-fA-F0-9]))+/)||w("*")||w(this.attribute)||w(/^\([^)@]+\)/),a||w("(")&&(d=w(this.entities.variable))&&w(")")&&(a=new f.Paren(d));if(a)return new f.Element(c,a,h);if(c.value&&c.value.charAt(0)==="&")return new f.Element(c,null,h)},combinator:function(){var a,b=g.charAt(h);if(b===">"||b==="+"||b==="~"){h++;while(g.charAt(h)===" ")h++;return new f.Combinator(b)}if(b==="&"){a="&",h++,g.charAt(h)===" "&&(a="& ");while(g.charAt(h)===" ")h++;return new f.Combinator(a)}if(b===":"&&g.charAt(h+1)===":"){h+=2;while(g.charAt(h)===" ")h++;return new f.Combinator("::")}return g.charAt(h-1)===" "?new f.Combinator(" "):new f.Combinator(null)},selector:function(){var a,b,c=[],d,e;while(b=w(this.element)){d=g.charAt(h),c.push(b);if(d==="{"||d==="}"||d===";"||d===",")break}if(c.length>0)return new f.Selector(c)},tag:function(){return w(/^[a-zA-Z][a-zA-Z-]*[0-9]?/)||w("*")},attribute:function(){var a="",b,c,d;if(!w("["))return;if(b=w(/^[a-zA-Z-]+/)||w(this.entities.quoted))(d=w(/^[|~*$^]?=/))&&(c=w(this.entities.quoted)||w(/^[\w-]+/))?a=[b,d,c.toCSS?c.toCSS():c].join(""):a=b;if(!w("]"))return;if(a)return"["+a+"]"},block:function(){var a;if(w("{")&&(a=w(this.primary))&&w("}"))return a},ruleset:function(){var a=[],b,c,d;t();while(b=w(this.selector)){a.push(b),w(this.comment);if(!w(","))break;w(this.comment)}if(a.length>0&&(c=w(this.block)))return new f.Ruleset(a,c);l=h,u()},rule:function(){var a,b,c=g.charAt(h),d,e;t();if(c==="."||c==="#"||c==="&")return;if(a=w(this.variable)||w(this.property)){a.charAt(0)!="@"&&(e=/^([^@+\/'"*`(;{}-]*);/.exec(m[i]))?(h+=e[0].length-1,b=new f.Anonymous(e[1])):a==="font"?b=w(this.font):b=w(this.value),d=w(this.important);if(b&&w(this.end))return new f.Rule(a,b,d,k);l=h,u()}},"import":function(){var a,b,c=h;if(w(/^@import\s+/)&&(a=w(this.entities.quoted)||w(this.entities.url))){b=w(this.mediaFeatures);if(w(";"))return new f.Import(a,s,b,c)}},mediaFeature:function(){var a=[];do if(e=w(this.entities.keyword))a.push(e);else if(w("(")){p=w(this.property),e=w(this.entity);if(!w(")"))return null;if(p&&e)a.push(new f.Paren(new f.Rule(p,e,null,h,!0)));else{if(!e)return null;a.push(new f.Paren(e))}}while(e);if(a.length>0)return new f.Expression(a)},mediaFeatures:function(){var a,b=[];while(a=w(this.mediaFeature)){b.push(a);if(!w(","))break}return b.length>0?b:null},media:function(){var a;if(w(/^@media/)){a=w(this.mediaFeatures);if(rules=w(this.block))return new f.Directive("@media",rules,a)}},directive:function(){var a,b,c,d,e,i;if(g.charAt(h)!=="@")return;if(b=w(this["import"])||w(this.media))return b;if(a=w(/^@page|@keyframes/)||w(/^@(?:-webkit-|-moz-|-o-|-ms-)[a-z0-9-]+/)){d=(w(/^[^{]+/)||"").trim();if(c=w(this.block))return new f.Directive(a+" "+d,c)}else if(a=w(/^@[-a-z]+/))if(a==="@font-face"){if(c=w(this.block))return new f.Directive(a,c)}else if((b=w(this.entity))&&w(";"))return new f.Directive(a,b)},font:function(){var a=[],b=[],c,d,e,g;while(g=w(this.shorthand)||w(this.entity))b.push(g);a.push(new f.Expression(b));if(w(","))while(g=w(this.expression)){a.push(g);if(!w(","))break}return new f.Value(a)},value:function(){var a,b=[],c;while(a=w(this.expression)){b.push(a);if(!w(","))break}if(b.length>0)return new f.Value(b)},important:function(){if(g.charAt(h)==="!")return w(/^! *important/)},sub:function(){var a;if(w("(")&&(a=w(this.expression))&&w(")"))return a},multiplication:function(){var a,b,c,d;if(a=w(this.operand)){while(!z(/^\/\*/)&&(c=w("/")||w("*"))&&(b=w(this.operand)))d=new f.Operation(c,[d||a,b]);return d||a}},addition:function(){var a,b,c,d;if(a=w(this.multiplication)){while((c=w(/^[-+]\s+/)||g.charAt(h-1)!=" "&&(w("+")||w("-")))&&(b=w(this.multiplication)))d=new f.Operation(c,[d||a,b]);return d||a}},conditions:function(){var a,b,c=h,d;if(a=w(this.condition)){while(w(",")&&(b=w(this.condition)))d=new f.Condition("or",d||a,b,c);return d||a}},condition:function(){var a,b,c,d,e=h,g=!1;w(/^not/)&&(g=!0),x("(");if(a=w(this.addition)||w(this.entities.keyword)||w(this.entities.quoted))return(d=w(/^(?:>=|=<|[<=>])/))?(b=w(this.addition)||w(this.entities.keyword)||w(this.entities.quoted))?c=new f.Condition(d,a,b,e,g):y("expected expression"):c=new f.Condition("=",a,new f.Keyword("true"),e,g),x(")"),w(/^and/)?new f.Condition("and",c,w(this.condition)):c},operand:function(){var a,b=g.charAt(h+1);g.charAt(h)==="-"&&(b==="@"||b==="(")&&(a=w("-"));var c=w(this.sub)||w(this.entities.dimension)||w(this.entities.color)||w(this.entities.variable)||w(this.entities.call);return a?new f.Operation("*",[new f.Dimension(-1),c]):c},expression:function(){var a,b,c=[],d;while(a=w(this.addition)||w(this.entity))c.push(a);if(c.length>0)return new f.Expression(c)},property:function(){var a;if(a=w(/^(\*?-?[-a-z_0-9]+)\s*:/))return a[1]}}}};if(d.mode==="browser"||d.mode==="rhino")d.Parser.importer=function(a,b,c,d){a.charAt(0)!=="/"&&b.length>0&&(a=b[0]+a),o({href:a,title:a,type:d.mime},c,!0)};(function(a){function b(b){return a.functions.hsla(b.h,b.s,b.l,b.a)}function c(b){if(b instanceof a.Dimension)return parseFloat(b.unit=="%"?b.value/100:b.value);if(typeof b=="number")return b;throw{error:"RuntimeError",message:"color functions take numbers as parameters"}}function d(a){return Math.min(1,Math.max(0,a))}a.functions={rgb:function(a,b,c){return this.rgba(a,b,c,1)},rgba:function(b,d,e,f){var g=[b,d,e].map(function(a){return c(a)}),f=c(f);return new a.Color(g,f)},hsl:function(a,b,c){return this.hsla(a,b,c,1)},hsla:function(a,b,d,e){function h(a){return a=a<0?a+1:a>1?a-1:a,a*6<1?g+(f-g)*a*6:a*2<1?f:a*3<2?g+(f-g)*(2/3-a)*6:g}a=c(a)%360/360,b=c(b),d=c(d),e=c(e);var f=d<=.5?d*(b+1):d+b-d*b,g=d*2-f;return this.rgba(h(a+1/3)*255,h(a)*255,h(a-1/3)*255,e)},hue:function(b){return new a.Dimension(Math.round(b.toHSL().h))},saturation:function(b){return new a.Dimension(Math.round(b.toHSL().s*100),"%")},lightness:function(b){return new a.Dimension(Math.round(b.toHSL().l*100),"%")},alpha:function(b){return new a.Dimension(b.toHSL().a)},saturate:function(a,c){var e=a.toHSL();return e.s+=c.value/100,e.s=d(e.s),b(e)},desaturate:function(a,c){var e=a.toHSL();return e.s-=c.value/100,e.s=d(e.s),b(e)},lighten:function(a,c){var e=a.toHSL();return e.l+=c.value/100,e.l=d(e.l),b(e)},darken:function(a,c){var e=a.toHSL();return e.l-=c.value/100,e.l=d(e.l),b(e)},fadein:function(a,c){var e=a.toHSL();return e.a+=c.value/100,e.a=d(e.a),b(e)},fadeout:function(a,c){var e=a.toHSL();return e.a-=c.value/100,e.a=d(e.a),b(e)},fade:function(a,c){var e=a.toHSL();return e.a=c.value/100,e.a=d(e.a),b(e)},spin:function(a,c){var d=a.toHSL(),e=(d.h+c.value)%360;return d.h=e<0?360+e:e,b(d)},mix:function(b,c,d){var e=d.value/100,f=e*2-1,g=b.toHSL().a-c.toHSL().a,h=((f*g==-1?f:(f+g)/(1+f*g))+1)/2,i=1-h,j=[b.rgb[0]*h+c.rgb[0]*i,b.rgb[1]*h+c.rgb[1]*i,b.rgb[2]*h+c.rgb[2]*i],k=b.alpha*e+c.alpha*(1-e);return new a.Color(j,k)},greyscale:function(b){return this.desaturate(b,new a.Dimension(100))},e:function(b){return new a.Anonymous(b instanceof a.JavaScript?b.evaluated:b)},escape:function(b){return new a.Anonymous(encodeURI(b.value).replace(/=/g,"%3D").replace(/:/g,"%3A").replace(/#/g,"%23").replace(/;/g,"%3B").replace(/\(/g,"%28").replace(/\)/g,"%29"))},"%":function(b){var c=Array.prototype.slice.call(arguments,1),d=b.value;for(var e=0;e<c.length;e++)d=d.replace(/%[sda]/i,function(a){var b=a.match(/s/i)?c[e].value:c[e].toCSS();return a.match(/[A-Z]$/)?encodeURIComponent(b):b});return d=d.replace(/%%/g,"%"),new a.Quoted('"'+d+'"',d)},round:function(a){return this._math("round",a)},ceil:function(a){return this._math("ceil",a)},floor:function(a){return this._math("floor",a)},_math:function(b,d){if(d instanceof a.Dimension)return new a.Dimension(Math[b](c(d)),d.unit);if(typeof d=="number")return Math[b](d);throw{type:"Argument",message:"argument must be a number"}},argb:function(b){return new a.Anonymous(b.toARGB())},percentage:function(b){return new a.Dimension(b.value*100,"%")},color:function(b){if(b instanceof a.Quoted)return new a.Color(b.value.slice(1));throw{type:"Argument",message:"argument must be a string"}},iscolor:function(b){return this._isa(b,a.Color)},isnumber:function(b){return this._isa(b,a.Dimension)},isstring:function(b){return this._isa(b,a.Quoted)},iskeyword:function(b){return this._isa(b,a.Keyword)},isurl:function(b){return this._isa(b,a.URL)},ispixel:function(b){return b instanceof a.Dimension&&b.unit==="px"?a.True:a.False},ispercentage:function(b){return b instanceof a.Dimension&&b.unit==="%"?a.True:a.False},isem:function(b){return b instanceof a.Dimension&&b.unit==="em"?a.True:a.False},_isa:function(b,c){return b instanceof c?a.True:a.False}}})(c("./tree")),function(a){a.colors={aliceblue:"#f0f8ff",antiquewhite:"#faebd7",aqua:"#00ffff",aquamarine:"#7fffd4",azure:"#f0ffff",beige:"#f5f5dc",bisque:"#ffe4c4",black:"#000000",blanchedalmond:"#ffebcd",blue:"#0000ff",blueviolet:"#8a2be2",brown:"#a52a2a",burlywood:"#deb887",cadetblue:"#5f9ea0",chartreuse:"#7fff00",chocolate:"#d2691e",coral:"#ff7f50",cornflowerblue:"#6495ed",cornsilk:"#fff8dc",crimson:"#dc143c",cyan:"#00ffff",darkblue:"#00008b",darkcyan:"#008b8b",darkgoldenrod:"#b8860b",darkgray:"#a9a9a9",darkgrey:"#a9a9a9",darkgreen:"#006400",darkkhaki:"#bdb76b",darkmagenta:"#8b008b",darkolivegreen:"#556b2f",darkorange:"#ff8c00",darkorchid:"#9932cc",darkred:"#8b0000",darksalmon:"#e9967a",darkseagreen:"#8fbc8f",darkslateblue:"#483d8b",darkslategray:"#2f4f4f",darkslategrey:"#2f4f4f",darkturquoise:"#00ced1",darkviolet:"#9400d3",deeppink:"#ff1493",deepskyblue:"#00bfff",dimgray:"#696969",dimgrey:"#696969",dodgerblue:"#1e90ff",firebrick:"#b22222",floralwhite:"#fffaf0",forestgreen:"#228b22",fuchsia:"#ff00ff",gainsboro:"#dcdcdc",ghostwhite:"#f8f8ff",gold:"#ffd700",goldenrod:"#daa520",gray:"#808080",grey:"#808080",green:"#008000",greenyellow:"#adff2f",honeydew:"#f0fff0",hotpink:"#ff69b4",indianred:"#cd5c5c",indigo:"#4b0082",ivory:"#fffff0",khaki:"#f0e68c",lavender:"#e6e6fa",lavenderblush:"#fff0f5",lawngreen:"#7cfc00",lemonchiffon:"#fffacd",lightblue:"#add8e6",lightcoral:"#f08080",lightcyan:"#e0ffff",lightgoldenrodyellow:"#fafad2",lightgray:"#d3d3d3",lightgrey:"#d3d3d3",lightgreen:"#90ee90",lightpink:"#ffb6c1",lightsalmon:"#ffa07a",lightseagreen:"#20b2aa",lightskyblue:"#87cefa",lightslategray:"#778899",lightslategrey:"#778899",lightsteelblue:"#b0c4de",lightyellow:"#ffffe0",lime:"#00ff00",limegreen:"#32cd32",linen:"#faf0e6",magenta:"#ff00ff",maroon:"#800000",mediumaquamarine:"#66cdaa",mediumblue:"#0000cd",mediumorchid:"#ba55d3",mediumpurple:"#9370d8",mediumseagreen:"#3cb371",mediumslateblue:"#7b68ee",mediumspringgreen:"#00fa9a",mediumturquoise:"#48d1cc",mediumvioletred:"#c71585",midnightblue:"#191970",mintcream:"#f5fffa",mistyrose:"#ffe4e1",moccasin:"#ffe4b5",navajowhite:"#ffdead",navy:"#000080",oldlace:"#fdf5e6",olive:"#808000",olivedrab:"#6b8e23",orange:"#ffa500",orangered:"#ff4500",orchid:"#da70d6",palegoldenrod:"#eee8aa",palegreen:"#98fb98",paleturquoise:"#afeeee",palevioletred:"#d87093",papayawhip:"#ffefd5",peachpuff:"#ffdab9",peru:"#cd853f",pink:"#ffc0cb",plum:"#dda0dd",powderblue:"#b0e0e6",purple:"#800080",red:"#ff0000",rosybrown:"#bc8f8f",royalblue:"#4169e1",saddlebrown:"#8b4513",salmon:"#fa8072",sandybrown:"#f4a460",seagreen:"#2e8b57",seashell:"#fff5ee",sienna:"#a0522d",silver:"#c0c0c0",skyblue:"#87ceeb",slateblue:"#6a5acd",slategray:"#708090",slategrey:"#708090",snow:"#fffafa",springgreen:"#00ff7f",steelblue:"#4682b4",tan:"#d2b48c",teal:"#008080",thistle:"#d8bfd8",tomato:"#ff6347",turquoise:"#40e0d0",violet:"#ee82ee",wheat:"#f5deb3",white:"#ffffff",whitesmoke:"#f5f5f5",yellow:"#ffff00",yellowgreen:"#9acd32"}}(c("./tree")),function(a){a.Alpha=function(a){this.value=a},a.Alpha.prototype={toCSS:function(){return"alpha(opacity="+(this.value.toCSS?this.value.toCSS():this.value)+")"},eval:function(a){return this.value.eval&&(this.value=this.value.eval(a)),this}}}(c("../tree")),function(a){a.Anonymous=function(a){this.value=a.value||a},a.Anonymous.prototype={toCSS:function(){return this.value},eval:function(){return this}}}(c("../tree")),function(a){a.Assignment=function(a,b){this.key=a,this.value=b},a.Assignment.prototype={toCSS:function(){return this.key+"="+(this.value.toCSS?this.value.toCSS():this.value)},eval:function(a){return this.value.eval&&(this.value=this.value.eval(a)),this}}}(c("../tree")),function(a){a.Call=function(a,b,c,d){this.name=a,this.args=b,this.index=c,this.filename=d},a.Call.prototype={eval:function(b){var c=this.args.map(function(a){return a.eval(b)});if(!(this.name in a.functions))return new a.Anonymous(this.name+"("+c.map(function(a){return a.toCSS()}).join(", ")+")");try{return a.functions[this.name].apply(a.functions,c)}catch(d){throw{type:d.type||"Runtime",message:"error evaluating function `"+this.name+"`"+(d.message?": "+d.message:""),index:this.index,filename:this.filename}}},toCSS:function(a){return this.eval(a).toCSS()}}}(c("../tree")),function(a){a.Color=function(a,b){Array.isArray(a)?this.rgb=a:a.length==6?this.rgb=a.match(/.{2}/g).map(function(a){return parseInt(a,16)}):this.rgb=a.split("").map(function(a){return parseInt(a+a,16)}),this.alpha=typeof b=="number"?b:1},a.Color.prototype={eval:function(){return this},toCSS:function(){return this.alpha<1?"rgba("+this.rgb.map(function(a){return Math.round(a)}).concat(this.alpha).join(", ")+")":"#"+this.rgb.map(function(a){return a=Math.round(a),a=(a>255?255:a<0?0:a).toString(16),a.length===1?"0"+a:a}).join("")},operate:function(b,c){var d=[];c instanceof a.Color||(c=c.toColor());for(var e=0;e<3;e++)d[e]=a.operate(b,this.rgb[e],c.rgb[e]);return new a.Color(d,this.alpha+c.alpha)},toHSL:function(){var a=this.rgb[0]/255,b=this.rgb[1]/255,c=this.rgb[2]/255,d=this.alpha,e=Math.max(a,b,c),f=Math.min(a,b,c),g,h,i=(e+f)/2,j=e-f;if(e===f)g=h=0;else{h=i>.5?j/(2-e-f):j/(e+f);switch(e){case a:g=(b-c)/j+(b<c?6:0);break;case b:g=(c-a)/j+2;break;case c:g=(a-b)/j+4}g/=6}return{h:g*360,s:h,l:i,a:d}},toARGB:function(){var a=[Math.round(this.alpha*255)].concat(this.rgb);return"#"+a.map(function(a){return a=Math.round(a),a=(a>255?255:a<0?0:a).toString(16),a.length===1?"0"+a:a}).join("")}}}(c("../tree")),function(a){a.Comment=function(a,b){this.value=a,this.silent=!!b},a.Comment.prototype={toCSS:function(a){return a.compress?"":this.value},eval:function(){return this}}}(c("../tree")),function(a){a.Condition=function(a,b,c,d,e){this.op=a.trim(),this.lvalue=b,this.rvalue=c,this.index=d,this.negate=e},a.Condition.prototype.eval=function(a){var b=this.lvalue.eval(a),c=this.rvalue.eval(a),d=this.index,e,e=function(a){switch(a){case"and":return b&&c;case"or":return b||c;default:if(b.compare)e=b.compare(c);else{if(!c.compare)throw{type:"Type",message:"Unable to perform comparison",index:d};e=c.compare(b)}switch(e){case-1:return a==="<"||a==="=<";case 0:return a==="="||a===">="||a==="=<";case 1:return a===">"||a===">="}}}(this.op);return this.negate?!e:e}}(c("../tree")),function(a){a.Dimension=function(a,b){this.value=parseFloat(a),this.unit=b||null},a.Dimension.prototype={eval:function(){return this},toColor:function(){return new a.Color([this.value,this.value,this.value])},toCSS:function(){var a=this.value+this.unit;return a},operate:function(b,c){return new a.Dimension(a.operate(b,this.value,c.value),this.unit||c.unit)},compare:function(b){return b instanceof a.Dimension?b.value>this.value?-1:b.value<this.value?1:0:-1}}}(c("../tree")),function(a){a.Directive=function(b,c,d){this.name=b,this.features=d&&new a.Value(d),Array.isArray(c)?(this.ruleset=new a.Ruleset([],c),this.ruleset.allowImports=!0):this.value=c},a.Directive.prototype={toCSS:function(a,b){var c=this.features?" "+this.features.toCSS(b):"";return this.ruleset?(this.ruleset.root=!0,this.name+c+(b.compress?"{":" {\n  ")+this.ruleset.toCSS(a,b).trim().replace(/\n/g,"\n  ")+(b.compress?"}":"\n}\n")):this.name+" "+this.value.toCSS()+";\n"},eval:function(a){return this.features=this.features&&this.features.eval(a),a.frames.unshift(this),this.ruleset=this.ruleset&&this.ruleset.eval(a),a.frames.shift(),this},variable:function(b){return a.Ruleset.prototype.variable.call(this.ruleset,b)},find:function(){return a.Ruleset.prototype.find.apply(this.ruleset,arguments)},rulesets:function(){return a.Ruleset.prototype.rulesets.apply(this.ruleset)}}}(c("../tree")),function(a){a.Element=function(b,c,d){this.combinator=b instanceof a.Combinator?b:new a.Combinator(b),typeof c=="string"?this.value=c.trim():c?this.value=c:this.value="",this.index=d},a.Element.prototype.eval=function(b){return new a.Element(this.combinator,this.value.eval?this.value.eval(b):this.value,this.index)},a.Element.prototype.toCSS=function(a){return this.combinator.toCSS(a||{})+(this.value.toCSS?this.value.toCSS(a):this.value)},a.Combinator=function(a){a===" "?this.value=" ":a==="& "?this.value="& ":this.value=a?a.trim():""},a.Combinator.prototype.toCSS=function(a){return{"":""," ":" ","&":"","& ":" ",":":" :","::":"::","+":a.compress?"+":" + ","~":a.compress?"~":" ~ ",">":a.compress?">":" > "}[this.value]}}(c("../tree")),function(a){a.Expression=function(a){this.value=a},a.Expression.prototype={eval:function(b){return this.value.length>1?new a.Expression(this.value.map(function(a){return a.eval(b)})):this.value.length===1?this.value[0].eval(b):this},toCSS:function(a){return this.value.map(function(b){return b.toCSS?b.toCSS(a):""}).join(" ")}}}(c("../tree")),function(a){a.Import=function(b,c,d,e){var f=this;this.index=e,this._path=b,this.features=d&&new a.Value(d),b instanceof a.Quoted?this.path=/\.(le?|c)ss(\?.*)?$/.test(b.value)?b.value:b.value+".less":this.path=b.value.value||b.value,this.css=/css(\?.*)?$/.test(this.path),this.css||c.push(this.path,function(b,c){b&&(b.index=e),f.root=c||new a.Ruleset([],[])})},a.Import.prototype={toCSS:function(a){var b=this.features?" "+this.features.toCSS(a):"";return this.css?"@import "+this._path.toCSS()+b+";\n":""},eval:function(b){var c,d=this.features&&this.features.eval(b);if(this.css)return this;c=new a.Ruleset([],this.root.rules.slice(0));for(var e=0;e<c.rules.length;e++)c.rules[e]instanceof a.Import&&Array.prototype.splice.apply(c.rules,[e,1].concat(c.rules[e].eval(b)));return this.features?new a.Directive("@media",c.rules,this.features.value):c.rules}}}(c("../tree")),function(a){a.JavaScript=function(a,b,c){this.escaped=c,this.expression=a,this.index=b},a.JavaScript.prototype={eval:function(b){var c,d=this,e={},f=this.expression.replace(/@\{([\w-]+)\}/g,function(c,e){return a.jsify((new a.Variable("@"+e,d.index)).eval(b))});try{f=new Function("return ("+f+")")}catch(g){throw{message:"JavaScript evaluation error: `"+
+f+"`",index:this.index}}for(var h in b.frames[0].variables())e[h.slice(1)]={value:b.frames[0].variables()[h].value,toJS:function(){return this.value.eval(b).toCSS()}};try{c=f.call(e)}catch(g){throw{message:"JavaScript evaluation error: '"+g.name+": "+g.message+"'",index:this.index}}return typeof c=="string"?new a.Quoted('"'+c+'"',c,this.escaped,this.index):Array.isArray(c)?new a.Anonymous(c.join(", ")):new a.Anonymous(c)}}}(c("../tree")),function(a){a.Keyword=function(a){this.value=a},a.Keyword.prototype={eval:function(){return this},toCSS:function(){return this.value},compare:function(b){return b instanceof a.Keyword?b.value===this.value?0:1:-1}},a.True=new a.Keyword("true"),a.False=new a.Keyword("false")}(c("../tree")),function(a){a.mixin={},a.mixin.Call=function(b,c,d,e,f){this.selector=new a.Selector(b),this.arguments=c,this.index=d,this.filename=e,this.important=f},a.mixin.Call.prototype={eval:function(a){var b,c,d=[],e=!1;for(var f=0;f<a.frames.length;f++)if((b=a.frames[f].find(this.selector)).length>0){c=this.arguments&&this.arguments.map(function(b){return b.eval(a)});for(var g=0;g<b.length;g++)if(b[g].match(c,a))try{Array.prototype.push.apply(d,b[g].eval(a,this.arguments,this.important).rules),e=!0}catch(h){throw{message:h.message,index:h.index,filename:this.filename,stack:h.stack,call:this.index}}if(e)return d;throw{type:"Runtime",message:"No matching definition was found for `"+this.selector.toCSS().trim()+"("+this.arguments.map(function(a){return a.toCSS()}).join(", ")+")`",index:this.index,filename:this.filename}}throw{type:"Name",message:this.selector.toCSS().trim()+" is undefined",index:this.index,filename:this.filename}}},a.mixin.Definition=function(b,c,d,e){this.name=b,this.selectors=[new a.Selector([new a.Element(null,b)])],this.params=c,this.condition=e,this.arity=c.length,this.rules=d,this._lookups={},this.required=c.reduce(function(a,b){return!b.name||b.name&&!b.value?a+1:a},0),this.parent=a.Ruleset.prototype,this.frames=[]},a.mixin.Definition.prototype={toCSS:function(){return""},variable:function(a){return this.parent.variable.call(this,a)},variables:function(){return this.parent.variables.call(this)},find:function(){return this.parent.find.apply(this,arguments)},rulesets:function(){return this.parent.rulesets.apply(this)},evalParams:function(b,c){var d=new a.Ruleset(null,[]);for(var e=0,f;e<this.params.length;e++)if(this.params[e].name){if(!(f=c&&c[e]||this.params[e].value))throw{type:"Runtime",message:"wrong number of arguments for "+this.name+" ("+c.length+" for "+this.arity+")"};d.rules.unshift(new a.Rule(this.params[e].name,f.eval(b)))}return d},eval:function(b,c,d){var e=this.evalParams(b,c),f,g=[],h;for(var i=0;i<Math.max(this.params.length,c&&c.length);i++)g.push(c[i]||this.params[i].value);return e.rules.unshift(new a.Rule("@arguments",(new a.Expression(g)).eval(b))),h=d?this.rules.map(function(b){return new a.Rule(b.name,b.value,"!important",b.index)}):this.rules.slice(0),(new a.Ruleset(null,h)).eval({frames:[this,e].concat(this.frames,b.frames)})},match:function(a,b){var c=a&&a.length||0,d,e;if(c<this.required)return!1;if(this.required>0&&c>this.params.length)return!1;if(this.condition&&!this.condition.eval({frames:[this.evalParams(b,a)].concat(b.frames)}))return!1;d=Math.min(c,this.arity);for(var f=0;f<d;f++)if(!this.params[f].name&&a[f].eval(b).toCSS()!=this.params[f].value.eval(b).toCSS())return!1;return!0}}}(c("../tree")),function(a){a.Operation=function(a,b){this.op=a.trim(),this.operands=b},a.Operation.prototype.eval=function(b){var c=this.operands[0].eval(b),d=this.operands[1].eval(b),e;if(c instanceof a.Dimension&&d instanceof a.Color){if(this.op!=="*"&&this.op!=="+")throw{name:"OperationError",message:"Can't substract or divide a color from a number"};e=d,d=c,c=e}return c.operate(this.op,d)},a.operate=function(a,b,c){switch(a){case"+":return b+c;case"-":return b-c;case"*":return b*c;case"/":return b/c}}}(c("../tree")),function(a){a.Paren=function(a){this.value=a},a.Paren.prototype={toCSS:function(a){return"("+this.value.toCSS(a)+")"},eval:function(b){return new a.Paren(this.value.eval(b))}}}(c("../tree")),function(a){a.Quoted=function(a,b,c,d){this.escaped=c,this.value=b||"",this.quote=a.charAt(0),this.index=d},a.Quoted.prototype={toCSS:function(){return this.escaped?this.value:this.quote+this.value+this.quote},eval:function(b){var c=this,d=this.value.replace(/`([^`]+)`/g,function(d,e){return(new a.JavaScript(e,c.index,!0)).eval(b).value}).replace(/@\{([\w-]+)\}/g,function(d,e){var f=(new a.Variable("@"+e,c.index)).eval(b);return"value"in f?f.value:f.toCSS()});return new a.Quoted(this.quote+d+this.quote,d,this.escaped,this.index)}}}(c("../tree")),function(a){a.Rule=function(b,c,d,e,f){this.name=b,this.value=c instanceof a.Value?c:new a.Value([c]),this.important=d?" "+d.trim():"",this.index=e,this.inline=f||!1,b.charAt(0)==="@"?this.variable=!0:this.variable=!1},a.Rule.prototype.toCSS=function(a){return this.variable?"":this.name+(a.compress?":":": ")+this.value.toCSS(a)+this.important+(this.inline?"":";")},a.Rule.prototype.eval=function(b){return new a.Rule(this.name,this.value.eval(b),this.important,this.index,this.inline)},a.Shorthand=function(a,b){this.a=a,this.b=b},a.Shorthand.prototype={toCSS:function(a){return this.a.toCSS(a)+"/"+this.b.toCSS(a)},eval:function(){return this}}}(c("../tree")),function(a){a.Ruleset=function(a,b){this.selectors=a,this.rules=b,this._lookups={}},a.Ruleset.prototype={eval:function(b){var c=this.selectors&&this.selectors.map(function(a){return a.eval(b)}),d=new a.Ruleset(c,this.rules.slice(0));d.root=this.root,d.allowImports=this.allowImports,b.frames.unshift(d);if(d.root||d.allowImports)for(var e=0;e<d.rules.length;e++)d.rules[e]instanceof a.Import&&Array.prototype.splice.apply(d.rules,[e,1].concat(d.rules[e].eval(b)));for(var e=0;e<d.rules.length;e++)d.rules[e]instanceof a.mixin.Definition&&(d.rules[e].frames=b.frames.slice(0));for(var e=0;e<d.rules.length;e++)d.rules[e]instanceof a.mixin.Call&&Array.prototype.splice.apply(d.rules,[e,1].concat(d.rules[e].eval(b)));for(var e=0,f;e<d.rules.length;e++)f=d.rules[e],f instanceof a.mixin.Definition||(d.rules[e]=f.eval?f.eval(b):f);return b.frames.shift(),d},match:function(a){return!a||a.length===0},variables:function(){return this._variables?this._variables:this._variables=this.rules.reduce(function(b,c){return c instanceof a.Rule&&c.variable===!0&&(b[c.name]=c),b},{})},variable:function(a){return this.variables()[a]},rulesets:function(){return this._rulesets?this._rulesets:this._rulesets=this.rules.filter(function(b){return b instanceof a.Ruleset||b instanceof a.mixin.Definition})},find:function(b,c){c=c||this;var d=[],e,f,g=b.toCSS();return g in this._lookups?this._lookups[g]:(this.rulesets().forEach(function(e){if(e!==c)for(var g=0;g<e.selectors.length;g++)if(f=b.match(e.selectors[g])){b.elements.length>e.selectors[g].elements.length?Array.prototype.push.apply(d,e.find(new a.Selector(b.elements.slice(1)),c)):d.push(e);break}}),this._lookups[g]=d)},toCSS:function(b,c){var d=[],e=[],f=[],g=[],h,i;this.root||(b.length===0?g=this.selectors.map(function(a){return[a]}):this.joinSelectors(g,b,this.selectors));for(var j=0;j<this.rules.length;j++)i=this.rules[j],i.rules||i instanceof a.Directive?f.push(i.toCSS(g,c)):i instanceof a.Comment?i.silent||(this.root?f.push(i.toCSS(c)):e.push(i.toCSS(c))):i.toCSS&&!i.variable?e.push(i.toCSS(c)):i.value&&!i.variable&&e.push(i.value.toString());return f=f.join(""),this.root?d.push(e.join(c.compress?"":"\n")):e.length>0&&(h=g.map(function(a){return a.map(function(a){return a.toCSS(c)}).join("").trim()}).join(c.compress?",":g.length>3?",\n":", "),d.push(h,(c.compress?"{":" {\n  ")+e.join(c.compress?"":"\n  ")+(c.compress?"}":"\n}\n"))),d.push(f),d.join("")+(c.compress?"\n":"")},joinSelectors:function(a,b,c){for(var d=0;d<c.length;d++)this.joinSelector(a,b,c[d])},joinSelector:function(b,c,d){var e=[],f=[],g=[],h=[],i=!1,j;for(var k=0;k<d.elements.length;k++)j=d.elements[k],j.combinator.value.charAt(0)==="&"&&(i=!0),i?h.push(j):g.push(j);i||(h=g,g=[]),g.length>0&&e.push(new a.Selector(g)),h.length>0&&f.push(new a.Selector(h));for(var l=0;l<c.length;l++)b.push(e.concat(c[l]).concat(f))}}}(c("../tree")),function(a){a.Selector=function(a){this.elements=a,this.elements[0].combinator.value===""&&(this.elements[0].combinator.value=" ")},a.Selector.prototype.match=function(a){var b=this.elements.length,c=a.elements.length,d=Math.min(b,c);if(b<c)return!1;for(var e=0;e<d;e++)if(this.elements[e].value!==a.elements[e].value)return!1;return!0},a.Selector.prototype.eval=function(b){return new a.Selector(this.elements.map(function(a){return a.eval(b)}))},a.Selector.prototype.toCSS=function(a){return this._css?this._css:this._css=this.elements.map(function(b){return typeof b=="string"?" "+b.trim():b.toCSS(a)}).join("")}}(c("../tree")),function(b){b.URL=function(b,c){b.data?this.attrs=b:(typeof a!="undefined"&&!/^(?:https?:\/\/|file:\/\/|data:|\/)/.test(b.value)&&c.length>0&&(b.value=c[0]+(b.value.charAt(0)==="/"?b.value.slice(1):b.value)),this.value=b,this.paths=c)},b.URL.prototype={toCSS:function(){return"url("+(this.attrs?"data:"+this.attrs.mime+this.attrs.charset+this.attrs.base64+this.attrs.data:this.value.toCSS())+")"},eval:function(a){return this.attrs?this:new b.URL(this.value.eval(a),this.paths)}}}(c("../tree")),function(a){a.Value=function(a){this.value=a,this.is="value"},a.Value.prototype={eval:function(b){return this.value.length===1?this.value[0].eval(b):new a.Value(this.value.map(function(a){return a.eval(b)}))},toCSS:function(a){return this.value.map(function(b){return b.toCSS(a)}).join(a.compress?",":", ")}}}(c("../tree")),function(a){a.Variable=function(a,b,c){this.name=a,this.index=b,this.file=c},a.Variable.prototype={eval:function(b){var c,d,e=this.name;e.indexOf("@@")==0&&(e="@"+(new a.Variable(e.slice(1))).eval(b).value);if(c=a.find(b.frames,function(a){if(d=a.variable(e))return d.value.eval(b)}))return c;throw{type:"Name",message:"variable "+e+" is undefined",filename:this.file,index:this.index}}}}(c("../tree")),function(a){a.find=function(a,b){for(var c=0,d;c<a.length;c++)if(d=b.call(a,a[c]))return d;return null},a.jsify=function(a){return Array.isArray(a.value)&&a.value.length>1?"["+a.value.map(function(a){return a.toCSS(!1)}).join(", ")+"]":a.toCSS(!1)}}(c("./tree"));var g=location.protocol==="file:"||location.protocol==="chrome:"||location.protocol==="chrome-extension:"||location.protocol==="resource:";d.env=d.env||(location.hostname=="127.0.0.1"||location.hostname=="0.0.0.0"||location.hostname=="localhost"||location.port.length>0||g?"development":"production"),d.async=!1,d.poll=d.poll||(g?1e3:1500),d.watch=function(){return this.watchMode=!0},d.unwatch=function(){return this.watchMode=!1},d.env==="development"?(d.optimization=0,/!watch/.test(location.hash)&&d.watch(),d.watchTimer=setInterval(function(){d.watchMode&&n(function(a,b,c,d,e){b&&r(b.toCSS(),d,e.lastModified)})},d.poll)):d.optimization=3;var h;try{h=typeof a.localStorage=="undefined"?null:a.localStorage}catch(i){h=null}var j=document.getElementsByTagName("link"),k=/^text\/(x-)?less$/;d.sheets=[];for(var l=0;l<j.length;l++)(j[l].rel==="stylesheet/less"||j[l].rel.match(/stylesheet/)&&j[l].type.match(k))&&d.sheets.push(j[l]);d.refresh=function(a){var b,c;b=c=new Date,n(function(a,d,e,f,g){g.local?v("loading "+f.href+" from cache."):(v("parsed "+f.href+" successfully."),r(d.toCSS(),f,g.lastModified)),v("css for "+f.href+" generated in "+(new Date-c)+"ms"),g.remaining===0&&v("css generated in "+(new Date-b)+"ms"),c=new Date},a),m()},d.refreshStyles=m,d.refresh(d.env==="development")})(window);
\ No newline at end of file
index a0976af..e139227 100644 (file)
@@ -163,8 +163,8 @@ function wfImageAuthMain() {
  * Issue a standard HTTP 403 Forbidden header ($msg1-a message index, not a message) and an
  * error message ($msg2, also a message index), (both required) then end the script
  * subsequent arguments to $msg2 will be passed as parameters only for replacing in $msg2
- * @param $msg1
- * @param $msg2
+ * @param string $msg1
+ * @param string $msg2
  */
 function wfForbidden( $msg1, $msg2 ) {
        global $wgImgAuthDetails;
index b7d7d8c..923c8d1 100644 (file)
@@ -45,7 +45,6 @@ $wgAutoloadLocalClasses = array(
        'CategoryPage' => 'includes/CategoryPage.php',
        'CategoryViewer' => 'includes/CategoryViewer.php',
        'ChangesFeed' => 'includes/ChangesFeed.php',
-       'ChangesListSpecialPage' => 'includes/specialpage/ChangesListSpecialPage.php',
        'ChangeTags' => 'includes/ChangeTags.php',
        'ChannelFeed' => 'includes/Feed.php',
        'Collation' => 'includes/Collation.php',
@@ -80,7 +79,6 @@ $wgAutoloadLocalClasses = array(
        'FileDeleteForm' => 'includes/FileDeleteForm.php',
        'ForkController' => 'includes/ForkController.php',
        'FormOptions' => 'includes/FormOptions.php',
-       'FormSpecialPage' => 'includes/specialpage/FormSpecialPage.php',
        'GitInfo' => 'includes/GitInfo.php',
        'HistoryBlob' => 'includes/HistoryBlob.php',
        'HistoryBlobCurStub' => 'includes/HistoryBlob.php',
@@ -120,7 +118,6 @@ $wgAutoloadLocalClasses = array(
        'ImageQueryPage' => 'includes/ImageQueryPage.php',
        'ImportStreamSource' => 'includes/Import.php',
        'ImportStringSource' => 'includes/Import.php',
-       'IncludableSpecialPage' => 'includes/specialpage/IncludableSpecialPage.php',
        'IndexPager' => 'includes/Pager.php',
        'Interwiki' => 'includes/interwiki/Interwiki.php',
        'LCStore' => 'includes/cache/LocalisationCache.php',
@@ -168,8 +165,6 @@ $wgAutoloadLocalClasses = array(
        'QueryPage' => 'includes/QueryPage.php',
        'QuickTemplate' => 'includes/SkinTemplate.php',
        'RawMessage' => 'includes/Message.php',
-       'RedirectSpecialArticle' => 'includes/specialpage/RedirectSpecialPage.php',
-       'RedirectSpecialPage' => 'includes/specialpage/RedirectSpecialPage.php',
        'ReverseChronologicalPager' => 'includes/Pager.php',
        'RevisionItem' => 'includes/RevisionList.php',
        'RevisionItemBase' => 'includes/RevisionList.php',
@@ -183,22 +178,12 @@ $wgAutoloadLocalClasses = array(
        'SiteStatsInit' => 'includes/SiteStats.php',
        'Skin' => 'includes/Skin.php',
        'SkinTemplate' => 'includes/SkinTemplate.php',
-       'SpecialCreateAccount' => 'includes/specials/SpecialCreateAccount.php',
-       'SpecialListAdmins' => 'includes/specials/SpecialListusers.php',
-       'SpecialListBots' => 'includes/specials/SpecialListusers.php',
-       'SpecialMycontributions' => 'includes/specials/SpecialMyRedirectPages.php',
-       'SpecialMypage' => 'includes/specials/SpecialMyRedirectPages.php',
-       'SpecialMytalk' => 'includes/specials/SpecialMyRedirectPages.php',
-       'SpecialMyuploads' => 'includes/specials/SpecialMyRedirectPages.php',
-       'SpecialAllMyUploads' => 'includes/specials/SpecialMyRedirectPages.php',
-       'SpecialPage' => 'includes/specialpage/SpecialPage.php',
-       'SpecialPageFactory' => 'includes/specialpage/SpecialPageFactory.php',
-       'SpecialRedirectToSpecial' => 'includes/specialpage/RedirectSpecialPage.php',
        'SquidPurgeClient' => 'includes/SquidPurgeClient.php',
        'SquidPurgeClientPool' => 'includes/SquidPurgeClient.php',
        'StatCounter' => 'includes/StatCounter.php',
        'Status' => 'includes/Status.php',
        'StreamFile' => 'includes/StreamFile.php',
+       'StringPrefixSearch' => 'includes/PrefixSearch.php',
        'StubContLang' => 'includes/StubObject.php',
        'StubObject' => 'includes/StubObject.php',
        'StubUserLang' => 'includes/StubObject.php',
@@ -208,7 +193,7 @@ $wgAutoloadLocalClasses = array(
        'Title' => 'includes/Title.php',
        'TitleArray' => 'includes/TitleArray.php',
        'TitleArrayFromResult' => 'includes/TitleArrayFromResult.php',
-       'UnlistedSpecialPage' => 'includes/specialpage/UnlistedSpecialPage.php',
+       'TitlePrefixSearch' => 'includes/PrefixSearch.php',
        'UploadSourceAdapter' => 'includes/Import.php',
        'UppercaseCollation' => 'includes/Collation.php',
        'User' => 'includes/User.php',
@@ -343,6 +328,7 @@ $wgAutoloadLocalClasses = array(
        'ApiQueryPageProps' => 'includes/api/ApiQueryPageProps.php',
        'ApiQueryPagesWithProp' => 'includes/api/ApiQueryPagesWithProp.php',
        'ApiQueryPagePropNames' => 'includes/api/ApiQueryPagePropNames.php',
+       'ApiQueryPrefixSearch' => 'includes/api/ApiQueryPrefixSearch.php',
        'ApiQueryProtectedTitles' => 'includes/api/ApiQueryProtectedTitles.php',
        'ApiQueryQueryPage' => 'includes/api/ApiQueryQueryPage.php',
        'ApiQueryRandom' => 'includes/api/ApiQueryRandom.php',
@@ -845,7 +831,7 @@ $wgAutoloadLocalClasses = array(
        # includes/profiler
        'Profiler' => 'includes/profiler/Profiler.php',
        'ProfilerMwprof' => 'includes/profiler/ProfilerMwprof.php',
-       'ProfilerSimple' => 'includes/profiler/ProfilerSimple.php',
+       'ProfilerSimpleDB' => 'includes/profiler/ProfilerSimpleDB.php',
        'ProfilerSimpleText' => 'includes/profiler/ProfilerSimpleText.php',
        'ProfilerSimpleTrace' => 'includes/profiler/ProfilerSimpleTrace.php',
        'ProfilerSimpleUDP' => 'includes/profiler/ProfilerSimpleUDP.php',
@@ -930,6 +916,17 @@ $wgAutoloadLocalClasses = array(
        'Sites' => 'includes/site/SiteSQLStore.php',
        'SiteStore' => 'includes/site/SiteStore.php',
 
+       # includes/specialpage
+       'ChangesListSpecialPage' => 'includes/specialpage/ChangesListSpecialPage.php',
+       'FormSpecialPage' => 'includes/specialpage/FormSpecialPage.php',
+       'IncludableSpecialPage' => 'includes/specialpage/IncludableSpecialPage.php',
+       'RedirectSpecialArticle' => 'includes/specialpage/RedirectSpecialPage.php',
+       'RedirectSpecialPage' => 'includes/specialpage/RedirectSpecialPage.php',
+       'SpecialPage' => 'includes/specialpage/SpecialPage.php',
+       'SpecialPageFactory' => 'includes/specialpage/SpecialPageFactory.php',
+       'SpecialRedirectToSpecial' => 'includes/specialpage/RedirectSpecialPage.php',
+       'UnlistedSpecialPage' => 'includes/specialpage/UnlistedSpecialPage.php',
+
        # includes/specials
        'ActiveUsersPager' => 'includes/specials/SpecialActiveusers.php',
        'AllmessagesTablePager' => 'includes/specials/SpecialAllmessages.php',
@@ -978,6 +975,7 @@ $wgAutoloadLocalClasses = array(
        'ShortPagesPage' => 'includes/specials/SpecialShortpages.php',
        'SpecialActiveUsers' => 'includes/specials/SpecialActiveusers.php',
        'SpecialAllmessages' => 'includes/specials/SpecialAllmessages.php',
+       'SpecialAllMyUploads' => 'includes/specials/SpecialMyRedirectPages.php',
        'SpecialAllpages' => 'includes/specials/SpecialAllpages.php',
        'SpecialBlankpage' => 'includes/specials/SpecialBlankpage.php',
        'SpecialBlock' => 'includes/specials/SpecialBlock.php',
@@ -989,6 +987,7 @@ $wgAutoloadLocalClasses = array(
        'SpecialChangePassword' => 'includes/specials/SpecialChangePassword.php',
        'SpecialComparePages' => 'includes/specials/SpecialComparePages.php',
        'SpecialContributions' => 'includes/specials/SpecialContributions.php',
+       'SpecialCreateAccount' => 'includes/specials/SpecialCreateAccount.php',
        'SpecialDiff' => 'includes/specials/SpecialDiff.php',
        'SpecialEditWatchlist' => 'includes/specials/SpecialEditWatchlist.php',
        'SpecialEmailUser' => 'includes/specials/SpecialEmailuser.php',
@@ -997,12 +996,18 @@ $wgAutoloadLocalClasses = array(
        'SpecialFilepath' => 'includes/specials/SpecialFilepath.php',
        'SpecialImport' => 'includes/specials/SpecialImport.php',
        'SpecialJavaScriptTest' => 'includes/specials/SpecialJavaScriptTest.php',
+       'SpecialListAdmins' => 'includes/specials/SpecialListusers.php',
+       'SpecialListBots' => 'includes/specials/SpecialListusers.php',
        'SpecialListFiles' => 'includes/specials/SpecialListfiles.php',
        'SpecialListGroupRights' => 'includes/specials/SpecialListgrouprights.php',
        'SpecialListUsers' => 'includes/specials/SpecialListusers.php',
        'SpecialLockdb' => 'includes/specials/SpecialLockdb.php',
        'SpecialLog' => 'includes/specials/SpecialLog.php',
        'SpecialMergeHistory' => 'includes/specials/SpecialMergeHistory.php',
+       'SpecialMycontributions' => 'includes/specials/SpecialMyRedirectPages.php',
+       'SpecialMypage' => 'includes/specials/SpecialMyRedirectPages.php',
+       'SpecialMytalk' => 'includes/specials/SpecialMyRedirectPages.php',
+       'SpecialMyuploads' => 'includes/specials/SpecialMyRedirectPages.php',
        'SpecialNewFiles' => 'includes/specials/SpecialNewimages.php',
        'SpecialNewpages' => 'includes/specials/SpecialNewpages.php',
        'SpecialPasswordReset' => 'includes/specials/SpecialPasswordReset.php',
@@ -1116,17 +1121,17 @@ $wgAutoloadLocalClasses = array(
        'ZipDirectoryReaderError' => 'includes/utils/ZipDirectoryReader.php',
 
        # languages
-       'ConverterRule' => 'languages/LanguageConverter.php',
+       'ConverterRule' => 'languages/ConverterRule.php',
        'FakeConverter' => 'languages/Language.php',
        'Language' => 'languages/Language.php',
        'LanguageConverter' => 'languages/LanguageConverter.php',
-       'CLDRPluralRuleConverter' => 'languages/utils/CLDRPluralRuleEvaluator.php',
-       'CLDRPluralRuleConverter_Expression' => 'languages/utils/CLDRPluralRuleEvaluator.php',
-       'CLDRPluralRuleConverter_Fragment' => 'languages/utils/CLDRPluralRuleEvaluator.php',
-       'CLDRPluralRuleConverter_Operator' => 'languages/utils/CLDRPluralRuleEvaluator.php',
+       'CLDRPluralRuleConverter' => 'languages/utils/CLDRPluralRuleConverter.php',
+       'CLDRPluralRuleConverter_Expression' => 'languages/utils/CLDRPluralRuleConverter_Expression.php',
+       'CLDRPluralRuleConverter_Fragment' => 'languages/utils/CLDRPluralRuleConverter_Fragment.php',
+       'CLDRPluralRuleConverter_Operator' => 'languages/utils/CLDRPluralRuleConverter_Operator.php',
        'CLDRPluralRuleEvaluator' => 'languages/utils/CLDRPluralRuleEvaluator.php',
-       'CLDRPluralRuleEvaluator_Range' => 'languages/utils/CLDRPluralRuleEvaluator.php',
-       'CLDRPluralRuleError' => 'languages/utils/CLDRPluralRuleEvaluator.php',
+       'CLDRPluralRuleEvaluator_Range' => 'languages/utils/CLDRPluralRuleEvaluator_Range.php',
+       'CLDRPluralRuleError' => 'languages/utils/CLDRPluralRuleError.php',
 
        # maintenance
        'BackupDumper' => 'maintenance/backup.inc',
index 95a8386..a3d3691 100644 (file)
@@ -31,22 +31,22 @@ class Block {
                $mCreateAccount,
                $mParentBlockId;
 
-       /// @var User|String
+       /** @var User|String */
        protected $target;
 
-       // @var Integer Hack for foreign blocking (CentralAuth)
+       /** @var Integer Hack for foreign blocking (CentralAuth) */
        protected $forcedTargetID;
 
-       /// @var Block::TYPE_ constant.  Can only be USER, IP or RANGE internally
+       /** @var Integer Block::TYPE_ constant. Can only be USER, IP or RANGE internally */
        protected $type;
 
-       /// @var User
+       /** @var User */
        protected $blocker;
 
-       /// @var Bool
+       /** @var Bool */
        protected $isHardblock = true;
 
-       /// @var Bool
+       /** @var Bool */
        protected $isAutoblocking = true;
 
        # TYPE constants
@@ -312,7 +312,7 @@ class Block {
        /**
         * Get the component of an IP address which is certain to be the same between an IP
         * address and a rangeblock containing that IP address.
-        * @param  $hex String Hexadecimal IP representation
+        * @param $hex String Hexadecimal IP representation
         * @return String
         */
        protected static function getIpFragment( $hex ) {
@@ -362,7 +362,7 @@ class Block {
 
        /**
         * Create a new Block object from a database row
-        * @param  $row ResultWrapper row from the ipblocks table
+        * @param $row ResultWrapper row from the ipblocks table
         * @return Block
         */
        public static function newFromRow( $row ) {
@@ -862,7 +862,7 @@ class Block {
        /**
         * Get/set whether the Block is a hardblock (affects logged-in users on a given IP/range
         * @param $x Bool
-        * @return  Bool
+        * @return Bool
         */
        public function isHardblock( $x = null ) {
                wfSetVar( $this->isHardblock, $x );
index ba71aa0..9abc6a8 100644 (file)
@@ -30,7 +30,7 @@ class CategoryPage extends Article {
        protected $mCategoryViewerClass = 'CategoryViewer';
 
        /**
-        * @param $title Title
+        * @param Title $title
         * @return WikiCategoryPage
         */
        protected function newPage( Title $title ) {
@@ -40,7 +40,7 @@ class CategoryPage extends Article {
 
        /**
         * Constructor from a page id
-        * @param int $id article ID to load
+        * @param int $id Article ID to load
         * @return CategoryPage|null
         */
        public static function newFromID( $id ) {
index 183c5f2..7f213c3 100644 (file)
@@ -449,7 +449,7 @@ class CategoryViewer extends ContextSource {
         * of the output.
         *
         * @param string $type 'page', 'subcat', or 'file'
-        * @return String: HTML output, possibly empty if there are no other pages
+        * @return string HTML output, possibly empty if there are no other pages
         */
        private function getSectionPagingLinks( $type ) {
                if ( isset( $this->until[$type] ) && $this->until[$type] !== null ) {
@@ -628,8 +628,8 @@ class CategoryViewer extends ContextSource {
         * Takes a title, and adds the fragment identifier that
         * corresponds to the correct segment of the category.
         *
-        * @param Title $title: The title (usually $this->title)
-        * @param string $section: Which section
+        * @param Title $title The title (usually $this->title)
+        * @param string $section Which section
         * @throws MWException
         * @return Title
         */
@@ -661,7 +661,7 @@ class CategoryViewer extends ContextSource {
         * @param int $rescnt The number of items returned by our database query.
         * @param int $dbcnt The number of items according to the category table.
         * @param string $type 'subcat', 'article', or 'file'
-        * @return string: A message giving the number of items, to output to HTML.
+        * @return string A message giving the number of items, to output to HTML.
         */
        private function getCountMessage( $rescnt, $dbcnt, $type ) {
                // There are three cases:
index 987f3a7..88e15b3 100644 (file)
@@ -36,7 +36,7 @@ abstract class Collation {
 
        /**
         * @throws MWException
-        * @param $collationName string
+        * @param string $collationName
         * @return Collation
         */
        static function factory( $collationName ) {
index bb5d26d..663098f 100644 (file)
@@ -70,7 +70,7 @@ $wgConfigClass = 'GlobalConfig';
  * MediaWiki version number
  * @since 1.2
  */
-$wgVersion = '1.23alpha';
+$wgVersion = '1.24alpha';
 
 /**
  * Name of the site. It must be changed in LocalSettings.php
@@ -3362,7 +3362,7 @@ $wgResourceLoaderLESSFunctions = array(
  * @since 1.22
  */
 $wgResourceLoaderLESSImportPaths = array(
-       "$IP/resources/mediawiki.less/",
+       "$IP/resources/src/mediawiki.less/",
        "$IP/skins/vector/",
 );
 
@@ -5092,18 +5092,6 @@ $wgProfileLimit = 0.0;
  */
 $wgProfileOnly = false;
 
-/**
- * Log sums from profiling into "profiling" table in db.
- *
- * You have to create a 'profiling' table in your database before using
- * this feature.  Run set $wgProfileToDatabase to true in
- * LocalSettings.php and run maintenance/update.php or otherwise
- * manually add patch-profiling.sql to your database.
- *
- * To enable profiling, edit StartProfiler.php
- */
-$wgProfileToDatabase = false;
-
 /**
  * If true, print a raw call tree instead of per-function report
  */
@@ -5637,6 +5625,10 @@ $wgRC2UDPOmitBots = false;
  *   * 'formatter' -- the class name (implementing RCFeedFormatter) which will
  *     produce the text to send.
  *   * 'omit_bots' -- whether the bot edits should be in the feed
+ *   * 'omit_anon' -- whether anonymous edits should be in the feed
+ *   * 'omit_user' -- whether edits by registered users should be in the feed
+ *   * 'omit_minor' -- whether minor edits should be in the feed
+ *   * 'omit_patrolled' -- whether patrolled edits should be in the feed
  *  The IRC-specific options are:
  *   * 'add_interwiki_prefix' -- whether the titles should be prefixed with
  *     the first entry in the $wgLocalInterwikis array (or the value of
@@ -6028,7 +6020,7 @@ $wgExtensionMessagesFiles = array();
  */
 $wgMessagesDirs = array(
        'core' => "$IP/languages/i18n",
-       'oojs-ui' => "$IP/resources/oojs-ui/i18n",
+       'oojs-ui' => "$IP/resources/lib/oojs-ui/i18n",
 );
 
 /**
@@ -6207,6 +6199,7 @@ $wgJobTypesExcludedFromDefaultQueue = array( 'AssembleUploadChunks', 'PublishSta
  * on each job runner process. The meaning of "work items" varies per job,
  * but typically would be something like "pages to update". A single job
  * may have a variable number of work items, as is the case with batch jobs.
+ * This is used by runJobs.php and not jobs run via $wgJobRunRate.
  * These settings should be global to all wikis.
  */
 $wgJobBackoffThrottling = array();
@@ -6917,6 +6910,14 @@ $wgHTTPConnectTimeout = 5e0;
  */
 $wgJobRunRate = 1;
 
+/**
+ * When $wgJobRunRate > 0, try to run jobs asynchronously, spawning a new process
+ * to handle the job execution, instead of blocking the request until the job
+ * execution finishes.
+ * @since 1.23
+ */
+$wgRunJobsAsync = true;
+
 /**
  * Number of rows to update per job
  */
@@ -6927,15 +6928,6 @@ $wgUpdateRowsPerJob = 500;
  */
 $wgUpdateRowsPerQuery = 100;
 
-/**
- * Do not purge all the pages that use a page when it is edited
- * if there are more than this many such pages. This is used to
- * avoid invalidating a large portion of the squid/parser cache.
- *
- * This setting should factor in any squid/parser cache expiry settings.
- */
-$wgMaxBacklinksInvalidate = false;
-
 /** @} */ # End job queue }
 
 /************************************************************************//**
index f57fc60..d0bd7c7 100644 (file)
@@ -511,6 +511,8 @@ class EditPage {
                        throw new PermissionsError( $action, $permErrors );
                }
 
+               wfRunHooks( 'EditPage::showReadOnlyForm:initial', array( $this, &$wgOut ) );
+
                $wgOut->setRobotPolicy( 'noindex,nofollow' );
                $wgOut->setPageTitle( wfMessage( 'viewsource-title', $this->getContextTitle()->getPrefixedText() ) );
                $wgOut->addBacklinkSubtitle( $this->getContextTitle() );
@@ -910,14 +912,15 @@ class EditPage {
                                $preload = $wgRequest->getVal( 'preload',
                                        // Custom preload text for new sections
                                        $this->section === 'new' ? 'MediaWiki:addsection-preload' : '' );
+                               $params = $wgRequest->getArray( 'preloadparams', array() );
 
-                               $content = $this->getPreloadedContent( $preload );
+                               $content = $this->getPreloadedContent( $preload, $params );
                        }
                // For existing pages, get text based on "undo" or section parameters.
                } else {
                        if ( $this->section != '' ) {
                                // Get section edit text (returns $def_text for invalid sections)
-                               $orig = $this->getOriginalContent();
+                               $orig = $this->getOriginalContent( $wgUser );
                                $content = $orig ? $orig->getSection( $this->section ) : null;
 
                                if ( !$content ) {
@@ -999,7 +1002,7 @@ class EditPage {
                                }
 
                                if ( $content === false ) {
-                                       $content = $this->getOriginalContent();
+                                       $content = $this->getOriginalContent( $wgUser );
                                }
                        }
                }
@@ -1020,9 +1023,10 @@ class EditPage {
         * 'missing-revision' message.
         *
         * @since 1.19
+        * @param User $user The user to get the revision for
         * @return Content|null
         */
-       private function getOriginalContent() {
+       private function getOriginalContent( User $user ) {
                if ( $this->section == 'new' ) {
                        return $this->getCurrentContent();
                }
@@ -1035,7 +1039,7 @@ class EditPage {
 
                        return $handler->makeEmptyContent();
                }
-               $content = $revision->getContent();
+               $content = $revision->getContent( Revision::FOR_THIS_USER, $user );
                return $content;
        }
 
@@ -1116,12 +1120,13 @@ class EditPage {
         * an earlier setPreloadText() or by loading the given page.
         *
         * @param string $preload representing the title to preload from.
+        * @param Array $params Parameters to use (interface-message style) in the preloaded text
         *
         * @return Content
         *
         * @since 1.21
         */
-       protected function getPreloadedContent( $preload ) {
+       protected function getPreloadedContent( $preload, $params = array() ) {
                global $wgUser;
 
                if ( !empty( $this->mPreloadContent ) ) {
@@ -1175,7 +1180,7 @@ class EditPage {
                        $content = $converted;
                }
 
-               return $content->preloadTransform( $title, $parserOptions );
+               return $content->preloadTransform( $title, $parserOptions, $params );
        }
 
        /**
@@ -1341,8 +1346,8 @@ class EditPage {
         * Run hooks that can filter edits just before they get saved.
         *
         * @param Content $content the Content to filter.
-        * @param Status  $status for reporting the outcome to the caller
-        * @param User    $user the user performing the edit
+        * @param Status $status For reporting the outcome to the caller
+        * @param User $user The user performing the edit
         *
         * @return bool
         */
@@ -1734,7 +1739,7 @@ class EditPage {
                                        return $status;
                                }
                        } elseif ( !$this->allowBlankSummary
-                               && !$content->equals( $this->getOriginalContent() )
+                               && !$content->equals( $this->getOriginalContent( $wgUser ) )
                                && !$content->isRedirect()
                                && md5( $this->summary ) == $this->autoSumm
                        ) {
@@ -2603,11 +2608,11 @@ class EditPage {
        }
 
        /**
-        * @param $isSubjectPreview Boolean: true if this is the section subject/title
-        *                          up top, or false if this is the comment summary
-        *                          down below the textarea
+        * @param bool $isSubjectPreview true if this is the section subject/title
+        *   up top, or false if this is the comment summary
+        *   down below the textarea
         * @param string $summary The text of the summary to display
-        * @return String
+        * @return string
         */
        protected function showSummaryInput( $isSubjectPreview, $summary = "" ) {
                global $wgOut, $wgContLang;
@@ -2629,11 +2634,11 @@ class EditPage {
        }
 
        /**
-        * @param $isSubjectPreview Boolean: true if this is the section subject/title
-        *                          up top, or false if this is the comment summary
-        *                          down below the textarea
+        * @param bool $isSubjectPreview true if this is the section subject/title
+        *   up top, or false if this is the comment summary
+        *   down below the textarea
         * @param string $summary the text of the summary to display
-        * @return String
+        * @return string
         */
        protected function getSummaryPreview( $isSubjectPreview, $summary = "" ) {
                // avoid spaces in preview, gets always trimmed on save
@@ -3417,15 +3422,6 @@ HTML
                                'tip'    => wfMessage( 'media_tip' )->text(),
                                'key'    => 'M'
                        ) : false,
-                       class_exists( 'MathRenderer' ) ? array(
-                               'image'  => $wgLang->getImageFile( 'button-math' ),
-                               'id'     => 'mw-editbutton-math',
-                               'open'   => "<math>",
-                               'close'  => "</math>",
-                               'sample' => wfMessage( 'math_sample' )->text(),
-                               'tip'    => wfMessage( 'math_tip' )->text(),
-                               'key'    => 'C'
-                       ) : false,
                        array(
                                'image'  => $wgLang->getImageFile( 'button-nowiki' ),
                                'id'     => 'mw-editbutton-nowiki',
index 4c0eb30..2844a06 100644 (file)
@@ -73,15 +73,14 @@ class WikiExporter {
         * make additional queries to pull source data while the
         * main query is still running.
         *
-        * @param $db DatabaseBase
-        * @param $history Mixed: one of WikiExporter::FULL, WikiExporter::CURRENT,
-        *                 WikiExporter::RANGE or WikiExporter::STABLE,
-        *                 or an associative array:
-        *                   offset: non-inclusive offset at which to start the query
-        *                   limit: maximum number of rows to return
-        *                   dir: "asc" or "desc" timestamp order
-        * @param int $buffer one of WikiExporter::BUFFER or WikiExporter::STREAM
-        * @param int $text one of WikiExporter::TEXT or WikiExporter::STUB
+        * @param DatabaseBase $db
+        * @param int|array $history One of WikiExporter::FULL, WikiExporter::CURRENT,
+        *   WikiExporter::RANGE or WikiExporter::STABLE, or an associative array:
+        *   - offset: non-inclusive offset at which to start the query
+        *   - limit: maximum number of rows to return
+        *   - dir: "asc" or "desc" timestamp order
+        * @param int $buffer One of WikiExporter::BUFFER or WikiExporter::STREAM
+        * @param int $text One of WikiExporter::TEXT or WikiExporter::STUB
         */
        function __construct( $db, $history = WikiExporter::CURRENT,
                        $buffer = WikiExporter::BUFFER, $text = WikiExporter::TEXT ) {
@@ -127,8 +126,8 @@ class WikiExporter {
         * Dumps a series of page and revision records for those pages
         * in the database falling within the page_id range given.
         * @param int $start inclusive lower limit (this id is included)
-        * @param $end   Int: Exclusive upper limit (this id is not included)
-        *                   If 0, no upper limit.
+        * @param int $end Exclusive upper limit (this id is not included)
+        *   If 0, no upper limit.
         */
        public function pagesByRange( $start, $end ) {
                $condition = 'page_id >= ' . intval( $start );
@@ -142,8 +141,8 @@ class WikiExporter {
         * Dumps a series of page and revision records for those pages
         * in the database with revisions falling within the rev_id range given.
         * @param int $start inclusive lower limit (this id is included)
-        * @param $end   Int: Exclusive upper limit (this id is not included)
-        *                   If 0, no upper limit.
+        * @param int $end Exclusive upper limit (this id is not included)
+        *   If 0, no upper limit.
         */
        public function revsByRange( $start, $end ) {
                $condition = 'rev_id >= ' . intval( $start );
index 65d82b8..444d26f 100644 (file)
@@ -48,7 +48,7 @@ class FileDeleteForm {
        /**
         * Constructor
         *
-        * @param $file File object we're deleting
+        * @param File $file File object we're deleting
         */
        public function __construct( $file ) {
                $this->title = $file->getTitle();
@@ -132,12 +132,12 @@ class FileDeleteForm {
        /**
         * Really delete the file
         *
-        * @param $title Title object
-        * @param File $file: file object
-        * @param string $oldimage archive name
-        * @param string $reason reason of the deletion
-        * @param $suppress Boolean: whether to mark all deleted versions as restricted
-        * @param $user User object performing the request
+        * @param Title $title
+        * @param File $file
+        * @param string $oldimage Archive name
+        * @param string $reason Reason of the deletion
+        * @param bool $suppress Whether to mark all deleted versions as restricted
+        * @param User $user User object performing the request
         * @throws MWException
         * @return bool|Status
         */
index 5174b32..c900306 100644 (file)
@@ -1817,19 +1817,23 @@ function wfHostname() {
 }
 
 /**
- * Returns a HTML comment with the elapsed time since request.
- * This method has no side effects.
+ * Returns a script tag that stores the amount of time it took MediaWiki to
+ * handle the request in milliseconds as 'wgBackendResponseTime'.
+ *
+ * If $wgShowHostnames is true, the script will also set 'wgHostname' to the
+ * hostname of the server handling the request.
  *
  * @return string
  */
 function wfReportTime() {
        global $wgRequestTime, $wgShowHostnames;
 
-       $elapsed = microtime( true ) - $wgRequestTime;
-
-       return $wgShowHostnames
-               ? sprintf( '<!-- Served by %s in %01.3f secs. -->', wfHostname(), $elapsed )
-               : sprintf( '<!-- Served in %01.3f secs. -->', $elapsed );
+       $responseTime = round( ( microtime( true ) - $wgRequestTime ) * 1000 );
+       $reportVars = array( 'wgBackendResponseTime' => $responseTime );
+       if ( $wgShowHostnames ) {
+               $reportVars[ 'wgHostname' ] = wfHostname();
+       }
+       return Skin::makeVariablesScript( $reportVars );
 }
 
 /**
@@ -2877,15 +2881,6 @@ function wfShellExec( $cmd, &$retval = null, $environ = array(),
        if ( $useLogPipe ) {
                $desc[3] = array( 'pipe', 'w' );
        }
-
-       # TODO/FIXME: This is a bad hack to workaround an HHVM bug that prevents
-       # proc_open() from opening stdin/stdout, so use /dev/null *for now*
-       # See bug 56597 / https://github.com/facebook/hhvm/issues/1247 for more info
-       if ( wfIsHHVM() ) {
-               $desc[0] = array( 'file', '/dev/null', 'r' );
-               $desc[2] = array( 'file', '/dev/null', 'w' );
-       }
-
        $pipes = null;
        $proc = proc_open( $cmd, $desc, $pipes );
        if ( !$proc ) {
index c4fc29a..b1d4f00 100644 (file)
@@ -635,10 +635,10 @@ class Html {
         * Convenience function to produce an "<input>" element.  This supports the
         * new HTML5 input types and attributes.
         *
-        * @param $name    string name attribute
-        * @param $value   mixed  value attribute
-        * @param $type    string type attribute
-        * @param array $attribs  Associative array of miscellaneous extra
+        * @param string $name Name attribute
+        * @param array $value Value attribute
+        * @param string $type Type attribute
+        * @param array $attribs Associative array of miscellaneous extra
         *   attributes, passed to Html::element()
         * @return string Raw HTML
         */
@@ -653,9 +653,9 @@ class Html {
        /**
         * Convenience function to produce an input element with type=hidden
         *
-        * @param $name    string name attribute
-        * @param $value   string value attribute
-        * @param array $attribs  Associative array of miscellaneous extra
+        * @param string $name Name attribute
+        * @param string $value Value attribute
+        * @param array $attribs Associative array of miscellaneous extra
         *   attributes, passed to Html::element()
         * @return string Raw HTML
         */
@@ -669,9 +669,9 @@ class Html {
         * This supports leaving out the cols= and rows= which Xml requires and are
         * required by HTML4/XHTML but not required by HTML5.
         *
-        * @param $name    string name attribute
-        * @param $value   string value attribute
-        * @param array $attribs  Associative array of miscellaneous extra
+        * @param string $name Name attribute
+        * @param string $value Value attribute
+        * @param array $attribs Associative array of miscellaneous extra
         *   attributes, passed to Html::element()
         * @return string Raw HTML
         */
@@ -693,7 +693,7 @@ class Html {
        /**
         * Build a drop-down box for selecting a namespace
         *
-        * @param $params array:
+        * @param array $params Params to set.
         * - selected: [optional] Id of namespace which should be pre-selected
         * - all: [optional] Value of item for "all namespaces". If null or unset, no "<option>" is generated to select all namespaces
         * - label: text for label to add before the field
@@ -794,9 +794,9 @@ class Html {
         * Constructs the opening html-tag with necessary doctypes depending on
         * global variables.
         *
-        * @param array $attribs  Associative array of miscellaneous extra
+        * @param array $attribs Associative array of miscellaneous extra
         *   attributes, passed to Html::element() of html tag.
-        * @return string  Raw HTML
+        * @return string Raw HTML
         */
        public static function htmlHeader( $attribs = array() ) {
                $ret = '';
@@ -840,8 +840,8 @@ class Html {
        /**
         * Determines if the given mime type is xml.
         *
-        * @param $mimetype    string MimeType
-        * @return Boolean
+        * @param string $mimetype MimeType
+        * @return bool
         */
        public static function isXmlMimeType( $mimetype ) {
                # http://www.whatwg.org/html/infrastructure.html#xml-mime-type
index c06fbbc..a72fd59 100644 (file)
@@ -34,7 +34,7 @@ class HtmlFormatter {
        /**
         * Constructor
         *
-        * @param string $html: Text to process
+        * @param string $html Text to process
         */
        public function __construct( $html ) {
                $this->html = $html;
@@ -51,15 +51,15 @@ class HtmlFormatter {
 
        /**
         * Override this in descendant class to modify HTML after it has been converted from DOM tree
-        * @param string $html: HTML to process
-        * @return string: Processed HTML
+        * @param string $html HTML to process
+        * @return string Processed HTML
         */
        protected function onHtmlReady( $html ) {
                return $html;
        }
 
        /**
-        * @return DOMDocument: DOM to manipulate
+        * @return DOMDocument DOM to manipulate
         */
        public function getDoc() {
                if ( !$this->doc ) {
@@ -101,7 +101,7 @@ class HtmlFormatter {
         *   .<class>
         *   #<id>
         *
-        * @param Array|string $selectors: Selector(s) of stuff to remove
+        * @param array|string $selectors Selector(s) of stuff to remove
         */
        public function remove( $selectors ) {
                $this->itemsToRemove = array_merge( $this->itemsToRemove, (array)$selectors );
@@ -114,7 +114,7 @@ class HtmlFormatter {
         * Note this interface may fail in surprising unexpected ways due to usage of regexes,
         * so should not be relied on for HTML markup security measures.
         *
-        * @param Array|string $elements: Name(s) of tag(s) to flatten
+        * @param array|string $elements Name(s) of tag(s) to flatten
         */
        public function flatten( $elements ) {
                $this->elementsToFlatten = array_merge( $this->elementsToFlatten, (array)$elements );
@@ -247,8 +247,8 @@ class HtmlFormatter {
        /**
         * Performs final transformations and returns resulting HTML
         *
-        * @param DOMElement|string|null $element: ID of element to get HTML from or false to get it from the whole tree
-        * @return string: Processed HTML
+        * @param DOMElement|string|null $element ID of element to get HTML from or false to get it from the whole tree
+        * @return string Processed HTML
         */
        public function getText( $element = null ) {
                wfProfileIn( __METHOD__ );
@@ -294,10 +294,10 @@ class HtmlFormatter {
        }
 
        /**
-        * @param $selector: CSS selector to parse
-        * @param $type
-        * @param $rawName
-        * @return bool: Whether the selector was successfully recognised
+        * @param string $selector CSS selector to parse
+        * @param string $type
+        * @param string $rawName
+        * @return bool Whether the selector was successfully recognised
         */
        protected function parseSelector( $selector, &$type, &$rawName ) {
                if ( strpos( $selector, '.' ) === 0 ) {
index 274d4a7..1fd437e 100644 (file)
@@ -205,7 +205,7 @@ class MWHttpRequest {
        protected $followRedirects = false;
 
        /**
-        * @var  CookieJar
+        * @var CookieJar
         */
        protected $cookieJar;
 
index 033926a..534ad4d 100644 (file)
@@ -93,9 +93,9 @@ class Linker {
         * link, given the Title object for the page we want to link to.
         *
         * @param $nt Title
-        * @param string $unused unused
-        * @param string $class the contents of the class attribute, default none
-        * @param $title Mixed: optional (unescaped) string to use in the title
+        * @param string $unused Unused
+        * @param string $class The contents of the class attribute, default none
+        * @param string|bool $title Optional (unescaped) string to use in the title
         *   attribute; if false, default to the name of the page we're linking to
         * @return string
         */
@@ -130,9 +130,9 @@ class Linker {
        /**
         * Return the CSS colour of a known link
         *
-        * @param $t Title object
-        * @param $threshold Integer: user defined threshold
-        * @return String: CSS class
+        * @param Title $t
+        * @param int $threshold User defined threshold
+        * @return string CSS class
         */
        public static function getLinkColour( $t, $threshold ) {
                $colour = '';
@@ -162,21 +162,21 @@ class Linker {
         *
         * @since 1.18 Method exists since 1.16 as non-static, made static in 1.18.
         *
-        * @param $target        Title  Can currently only be a Title, but this may
+        * @param Title $target Can currently only be a Title, but this may
         *   change to support Images, literal URLs, etc.
-        * @param $html          string The HTML contents of the <a> element, i.e.,
+        * @param string $html The HTML contents of the <a> element, i.e.,
         *   the link text.  This is raw HTML and will not be escaped.  If null,
         *   defaults to the prefixed text of the Title; or if the Title is just a
         *   fragment, the contents of the fragment.
-        * @param array $customAttribs  A key => value array of extra HTML attributes,
+        * @param array $customAttribs A key => value array of extra HTML attributes,
         *   such as title and class.  (href is ignored.)  Classes will be
         *   merged with the default classes, while other attributes will replace
         *   default attributes.  All passed attribute values will be HTML-escaped.
         *   A false attribute value means to suppress that attribute.
-        * @param $query         array  The query string to append to the URL
+        * @param array $query The query string to append to the URL
         *   you're linking to, in key => value array form.  Query keys and values
         *   will be URL-encoded.
-        * @param string|array $options  String or array of strings:
+        * @param string|array $options String or array of strings:
         *     'known': Page is known to exist, so don't check if it does.
         *     'broken': Page is known not to exist, so don't check if it does.
         *     'noclasses': Don't add any classes automatically (includes "new",
@@ -528,13 +528,13 @@ class Linker {
         *          link-target     Value for the target attribute, only with link-url
         *          no-link         Boolean, suppress description link
         *
-        * @param array $handlerParams associative array of media handler parameters, to be passed
+        * @param array $handlerParams Associative array of media handler parameters, to be passed
         *       to transform(). Typical keys are "width" and "page".
-        * @param string $time timestamp of the file, set as false for current
-        * @param string $query query params for desc url
-        * @param $widthOption: Used by the parser to remember the user preference thumbnailsize
+        * @param string $time Timestamp of the file, set as false for current
+        * @param string $query Query params for desc url
+        * @param int|null $widthOption Used by the parser to remember the user preference thumbnailsize
         * @since 1.20
-        * @return String: HTML for an image, with links, wrappers, etc.
+        * @return string HTML for an image, with links, wrappers, etc.
         */
        public static function makeImageLink( /*Parser*/ $parser, Title $title, $file, $frameParams = array(),
                $handlerParams = array(), $time = false, $query = "", $widthOption = null
@@ -742,7 +742,7 @@ class Linker {
 
        /**
         * @param $title Title
-        * @param  $file File
+        * @param $file File
         * @param array $frameParams
         * @param array $handlerParams
         * @param bool $time
@@ -902,13 +902,13 @@ class Linker {
        /**
         * Make a "broken" link to an image
         *
-        * @param $title Title object
+        * @param Title $title
         * @param string $label link label (plain text)
         * @param string $query query string
-        * @param $unused1 Unused parameter kept for b/c
-        * @param $unused2 Unused parameter kept for b/c
-        * @param $time Boolean: a file of a certain timestamp was requested
-        * @return String
+        * @param string $unused1 Unused parameter kept for b/c
+        * @param string $unused2 Unused parameter kept for b/c
+        * @param bool $time a file of a certain timestamp was requested
+        * @return string
         */
        public static function makeBrokenImageLinkObj( $title, $label = '', $query = '', $unused1 = '', $unused2 = '', $time = false ) {
                global $wgEnableUploads, $wgUploadMissingFileUrl, $wgUploadNavigationUrl;
@@ -945,9 +945,9 @@ class Linker {
        /**
         * Get the URL to upload a certain file
         *
-        * @param $destFile Title object of the file to upload
-        * @param string $query urlencoded query string to prepend
-        * @return String: urlencoded URL
+        * @param Title $destFile Title object of the file to upload
+        * @param string $query Urlencoded query string to prepend
+        * @return string Urlencoded URL
         */
        protected static function getUploadUrl( $destFile, $query = '' ) {
                global $wgUploadMissingFileUrl, $wgUploadNavigationUrl;
@@ -969,10 +969,10 @@ class Linker {
        /**
         * Create a direct link to a given uploaded file.
         *
-        * @param $title Title object.
-        * @param string $html pre-sanitized HTML
+        * @param Title $title
+        * @param string $html Pre-sanitized HTML
         * @param string $time MW timestamp of file creation time
-        * @return String: HTML
+        * @return string HTML
         */
        public static function makeMediaLinkObj( $title, $html = '', $time = false ) {
                $img = wfFindFile( $title, array( 'time' => $time ) );
@@ -983,10 +983,10 @@ class Linker {
         * Create a direct link to a given uploaded file.
         * This will make a broken link if $file is false.
         *
-        * @param $title Title object.
-        * @param $file File|bool mixed File object or false
-        * @param string $html pre-sanitized HTML
-        * @return String: HTML
+        * @param Title $title
+        * @param File|bool $file File object or false
+        * @param string $html Pre-sanitized HTML
+        * @return string HTML
         *
         * @todo Handle invalid or missing images better.
         */
@@ -1024,11 +1024,11 @@ class Linker {
        /**
         * Make an external link
         * @param string $url URL to link to
-        * @param string $text text of link
-        * @param $escape Boolean: do we escape the link text?
-        * @param string $linktype type of external link. Gets added to the classes
-        * @param array $attribs of extra attributes to <a>
-        * @param $title Title|null Title object used for title specific link attributes
+        * @param string $text Text of link
+        * @param bool $escape Do we escape the link text?
+        * @param string $linktype Type of external link. Gets added to the classes
+        * @param array $attribs Array of extra attributes to <a>
+        * @param Title|null $title Title object used for title specific link attributes
         * @return string
         */
        public static function makeExternalLink( $url, $text, $escape = true, $linktype = '', $attribs = array(), $title = null ) {
@@ -1063,10 +1063,10 @@ class Linker {
 
        /**
         * Make user link (or user contributions for unregistered users)
-        * @param $userId   Integer: user id in database.
-        * @param string $userName user name in database.
-        * @param string $altUserName text to display instead of the user name (optional)
-        * @return String: HTML fragment
+        * @param int $userId User id in database.
+        * @param string $userName User name in database.
+        * @param string $altUserName Text to display instead of the user name (optional)
+        * @return string HTML fragment
         * @since 1.19 Method exists for a long time. $altUserName was added in 1.19.
         */
        public static function userLink( $userId, $userName, $altUserName = false ) {
@@ -1089,13 +1089,13 @@ class Linker {
        /**
         * Generate standard user tool links (talk, contributions, block link, etc.)
         *
-        * @param $userId Integer: user identifier
-        * @param string $userText user name or IP address
-        * @param $redContribsWhenNoEdits Boolean: should the contributions link be
-        *        red if the user has no edits?
-        * @param $flags Integer: customisation flags (e.g. Linker::TOOL_LINKS_NOBLOCK and Linker::TOOL_LINKS_EMAIL)
-        * @param $edits Integer: user edit count (optional, for performance)
-        * @return String: HTML fragment
+        * @param int $userId User identifier
+        * @param string $userText User name or IP address
+        * @param bool $redContribsWhenNoEdits Should the contributions link be
+        *   red if the user has no edits?
+        * @param int $flags Customisation flags (e.g. Linker::TOOL_LINKS_NOBLOCK and Linker::TOOL_LINKS_EMAIL)
+        * @param int $edits User edit count (optional, for performance)
+        * @return string HTML fragment
         */
        public static function userToolLinks(
                $userId, $userText, $redContribsWhenNoEdits = false, $flags = 0, $edits = null
@@ -1147,19 +1147,19 @@ class Linker {
 
        /**
         * Alias for userToolLinks( $userId, $userText, true );
-        * @param $userId Integer: user identifier
-        * @param string $userText user name or IP address
-        * @param $edits Integer: user edit count (optional, for performance)
-        * @return String
+        * @param int $userId User identifier
+        * @param string $userText User name or IP address
+        * @param int $edits User edit count (optional, for performance)
+        * @return string
         */
        public static function userToolLinksRedContribs( $userId, $userText, $edits = null ) {
                return self::userToolLinks( $userId, $userText, true, 0, $edits );
        }
 
        /**
-        * @param $userId Integer: user id in database.
-        * @param string $userText user name in database.
-        * @return String: HTML fragment with user talk link
+        * @param int $userId User id in database.
+        * @param string $userText User name in database.
+        * @return string HTML fragment with user talk link
         */
        public static function userTalkLink( $userId, $userText ) {
                $userTalkPage = Title::makeTitle( NS_USER_TALK, $userText );
@@ -1168,9 +1168,9 @@ class Linker {
        }
 
        /**
-        * @param $userId Integer: userid
-        * @param string $userText user name in database.
-        * @return String: HTML fragment with block link
+        * @param int $userId Userid
+        * @param string $userText User name in database.
+        * @return string HTML fragment with block link
         */
        public static function blockLink( $userId, $userText ) {
                $blockPage = SpecialPage::getTitleFor( 'Block', $userText );
@@ -1179,9 +1179,9 @@ class Linker {
        }
 
        /**
-        * @param $userId Integer: userid
-        * @param string $userText user name in database.
-        * @return String: HTML fragment with e-mail user link
+        * @param int $userId Userid
+        * @param string $userText User name in database.
+        * @return string HTML fragment with e-mail user link
         */
        public static function emailLink( $userId, $userText ) {
                $emailPage = SpecialPage::getTitleFor( 'Emailuser', $userText );
@@ -1191,9 +1191,9 @@ class Linker {
 
        /**
         * Generate a user link if the current user is allowed to view it
-        * @param $rev Revision object.
-        * @param $isPublic Boolean: show only if all users can see it
-        * @return String: HTML fragment
+        * @param Revision $rev
+        * @param bool $isPublic Show only if all users can see it
+        * @return String HTML fragment
         */
        public static function revUserLink( $rev, $isPublic = false ) {
                if ( $rev->isDeleted( Revision::DELETED_USER ) && $isPublic ) {
@@ -1212,8 +1212,8 @@ class Linker {
 
        /**
         * Generate a user tool link cluster if the current user is allowed to view it
-        * @param $rev Revision object.
-        * @param $isPublic Boolean: show only if all users can see it
+        * @param Revision $rev
+        * @param bool $isPublic Show only if all users can see it
         * @return string HTML
         */
        public static function revUserTools( $rev, $isPublic = false ) {
@@ -1246,9 +1246,9 @@ class Linker {
         * Since you can't set a default parameter for a reference, I've turned it
         * temporarily to a value pass. Should be adjusted further. --brion
         *
-        * @param $comment String
-        * @param $title Mixed: Title object (to generate link to the section in autocomment) or null
-        * @param $local Boolean: whether section links should refer to local page
+        * @param string $comment
+        * @param Title|null $title Title object (to generate link to the section in autocomment) or null
+        * @param bool $local Whether section links should refer to local page
         * @return mixed|String
         */
        public static function formatComment( $comment, $title = null, $local = false ) {
@@ -1281,10 +1281,10 @@ class Linker {
         * add a separator where needed and format the comment itself with CSS
         * Called by Linker::formatComment.
         *
-        * @param string $comment comment text
-        * @param $title Title|null An optional title object used to links to sections
-        * @param $local Boolean: whether section links should refer to local page
-        * @return String: formatted comment
+        * @param string $comment Comment text
+        * @param Title|null $title An optional title object used to links to sections
+        * @param bool $local Whether section links should refer to local page
+        * @return string Formatted comment
         */
        private static function formatAutocomments( $comment, $title = null, $local = false ) {
                // Bah!
@@ -1365,10 +1365,10 @@ class Linker {
         * is ignored
         *
         * @todo FIXME: Doesn't handle sub-links as in image thumb texts like the main parser
-        * @param string $comment text to format links in
-        * @param $title Title|null An optional title object used to links to sections
-        * @param $local Boolean: whether section links should refer to local page
-        * @return String
+        * @param string $comment Text to format links in
+        * @param Title|null $title An optional title object used to links to sections
+        * @param bool $local Whether section links should refer to local page
+        * @return string
         */
        public static function formatLinksInComment( $comment, $title = null, $local = false ) {
                self::$commentContextTitle = $title;
@@ -1467,8 +1467,8 @@ class Linker {
 
        /**
         * @param $contextTitle Title
-        * @param  $target
-        * @param  $text
+        * @param $target
+        * @param $text
         * @return string
         */
        public static function normalizeSubpageLink( $contextTitle, $target, &$text ) {
@@ -1547,9 +1547,9 @@ class Linker {
         * Wrap a comment in standard punctuation and formatting if
         * it's non-empty, otherwise return empty string.
         *
-        * @param $comment String
-        * @param $title Mixed: Title object (to generate link to section in autocomment) or null
-        * @param $local Boolean: whether section links should refer to local page
+        * @param string $comment
+        * @param Title|null $title Title object (to generate link to section in autocomment) or null
+        * @param bool $local Whether section links should refer to local page
         *
         * @return string
         */
@@ -1570,10 +1570,10 @@ class Linker {
         * Wrap and format the given revision's comment block, if the current
         * user is allowed to view it.
         *
-        * @param $rev Revision object
-        * @param $local Boolean: whether section links should refer to local page
-        * @param $isPublic Boolean: show only if all users can see it
-        * @return String: HTML fragment
+        * @param Revision $rev
+        * @param bool $local Whether section links should refer to local page
+        * @param bool $isPublic Show only if all users can see it
+        * @return string HTML fragment
         */
        public static function revComment( Revision $rev, $local = false, $isPublic = false ) {
                if ( $rev->getRawComment() == "" ) {
@@ -1654,9 +1654,9 @@ class Linker {
        /**
         * Wraps the TOC in a table and provides the hide/collapse javascript.
         *
-        * @param string $toc html of the Table Of Contents
-        * @param $lang String|Language|false: Language for the toc title, defaults to user language
-        * @return String: full html of the TOC
+        * @param string $toc Html of the Table Of Contents
+        * @param string|Language|false $lang Language for the toc title, defaults to user language
+        * @return string Full html of the TOC
         */
        public static function tocList( $toc, $lang = false ) {
                $lang = wfGetLangObj( $lang );
@@ -1673,7 +1673,7 @@ class Linker {
         * Currently unused.
         *
         * @param array $tree Return value of ParserOutput::getSections()
-        * @return String: HTML fragment
+        * @return string HTML fragment
         */
        public static function generateTOC( $tree ) {
                $toc = '';
@@ -1700,17 +1700,17 @@ class Linker {
        /**
         * Create a headline for content
         *
-        * @param $level Integer: the level of the headline (1-6)
-        * @param string $attribs any attributes for the headline, starting with
-        *                 a space and ending with '>'
-        *                 This *must* be at least '>' for no attribs
+        * @param int $level The level of the headline (1-6)
+        * @param string $attribs Any attributes for the headline, starting with
+        *   a space and ending with '>'
+        *   This *must* be at least '>' for no attribs
         * @param string $anchor the anchor to give the headline (the bit after the #)
         * @param string $html html for the text of the header
         * @param string $link HTML to add for the section edit link
-        * @param $legacyAnchor Mixed: a second, optional anchor to give for
+        * @param bool|string $legacyAnchor a second, optional anchor to give for
         *   backward compatibility (false to omit)
         *
-        * @return String: HTML headline
+        * @return string HTML headline
         */
        public static function makeHeadline( $level, $attribs, $anchor, $html, $link, $legacyAnchor = false ) {
                $ret = "<h$level$attribs"
@@ -1853,10 +1853,10 @@ class Linker {
        /**
         * Build a raw rollback link, useful for collections of "tool" links
         *
-        * @param $rev Revision object
-        * @param $context IContextSource context to use or null for the main context.
-        * @param $editCount integer Number of edits that would be reverted
-        * @return String: HTML fragment
+        * @param Revision $rev
+        * @param IContextSource|null $context Context to use or null for the main context.
+        * @param int $editCount Number of edits that would be reverted
+        * @return string HTML fragment
         */
        public static function buildRollbackLink( $rev, IContextSource $context = null, $editCount = false ) {
                global $wgShowRollbackEditCount, $wgMiserMode;
@@ -1931,7 +1931,7 @@ class Linker {
         * @param bool $preview Whether this is for a preview
         * @param bool $section Whether this is for a section edit
         * @param Title|Message|string|null $more An escaped link for "More..." of the templates
-        * @return String: HTML output
+        * @return string HTML output
         */
        public static function formatTemplates( $templates, $preview = false, $section = false, $more = null ) {
                global $wgLang;
@@ -2022,9 +2022,9 @@ class Linker {
        /**
         * Returns HTML for the "hidden categories on this page" list.
         *
-        * @param array $hiddencats of hidden categories from Article::getHiddenCategories
-        * or similar
-        * @return String: HTML output
+        * @param array $hiddencats Array of hidden categories from Article::getHiddenCategories
+        *   or similar
+        * @return String HTML output
         */
        public static function formatHiddenCategories( $hiddencats ) {
                wfProfileIn( __METHOD__ );
@@ -2063,10 +2063,10 @@ class Linker {
         * isn't always, because sometimes the accesskey needs to go on a different
         * element than the id, for reverse-compatibility, etc.)
         *
-        * @param string $name id of the element, minus prefixes.
-        * @param $options Mixed: null or the string 'withaccess' to add an access-
+        * @param string $name Id of the element, minus prefixes.
+        * @param string|null $options null or the string 'withaccess' to add an access-
         *   key hint
-        * @return String: contents of the title attribute (which you must HTML-
+        * @return string Contents of the title attribute (which you must HTML-
         *   escape), or false for no title attribute
         */
        public static function titleAttrib( $name, $options = null ) {
@@ -2110,8 +2110,8 @@ class Linker {
         * the id but isn't always, because sometimes the accesskey needs to go on
         * a different element than the id, for reverse-compatibility, etc.)
         *
-        * @param string $name id of the element, minus prefixes.
-        * @return String: contents of the accesskey attribute (which you must HTML-
+        * @param string $name Id of the element, minus prefixes.
+        * @return string Contents of the accesskey attribute (which you must HTML-
         *   escape), or false for no accesskey attribute
         */
        public static function accesskey( $name ) {
@@ -2186,11 +2186,11 @@ class Linker {
        /**
         * Creates a (show/hide) link for deleting revisions/log entries
         *
-        * @param array $query query parameters to be passed to link()
-        * @param $restricted Boolean: set to true to use a "<strong>" instead of a "<span>"
-        * @param $delete Boolean: set to true to use (show/hide) rather than (show)
+        * @param array $query Query parameters to be passed to link()
+        * @param bool $restricted Set to true to use a "<strong>" instead of a "<span>"
+        * @param bool $delete Set to true to use (show/hide) rather than (show)
         *
-        * @return String: HTML "<a>" link to Special:Revisiondelete, wrapped in a
+        * @return string HTML "<a>" link to Special:Revisiondelete, wrapped in a
         * span to allow for customization of appearance with CSS
         */
        public static function revDeleteLink( $query = array(), $restricted = false, $delete = true ) {
@@ -2205,7 +2205,7 @@ class Linker {
        /**
         * Creates a dead (show/hide) link for deleting revisions/log entries
         *
-        * @param $delete Boolean: set to true to use (show/hide) rather than (show)
+        * @param bool $delete Set to true to use (show/hide) rather than (show)
         *
         * @return string HTML text wrapped in a span to allow for customization
         * of appearance with CSS
@@ -2226,13 +2226,12 @@ class Linker {
         * call this lots of times, pre-fill the link cache with a LinkBatch, otherwise each
         * call to this will result in a DB query.
         *
-        * @param $nt     Title: the title object to make the link from, e.g. from
-        *                      Title::newFromText.
-        * @param $text  String: link text
+        * @param Title $nt The title object to make the link from, e.g. from Title::newFromText.
+        * @param string $text Link text
         * @param string $query optional query part
         * @param string $trail optional trail. Alphabetic characters at the start of this string will
-        *                      be included in the link text. Other characters will be appended after
-        *                      the end of the link.
+        *   be included in the link text. Other characters will be appended after
+        *   the end of the link.
         * @param string $prefix optional prefix. As trail, only before instead of after.
         * @return string
         */
@@ -2259,14 +2258,14 @@ class Linker {
         * it doesn't have to do a database query. It's also valid for interwiki titles and special
         * pages.
         *
-        * @param $title  Title object of target page
-        * @param $text   String: text to replace the title
-        * @param $query  String: link target
-        * @param $trail  String: text after link
-        * @param string $prefix text before link text
-        * @param string $aprops extra attributes to the a-element
-        * @param $style  String: style to apply - if empty, use getInternalLinkAttributesObj instead
-        * @return string the a-element
+        * @param Title $title Title object of target page
+        * @param string $text Text to replace the title
+        * @param string $query Link target
+        * @param string $trail Text after link
+        * @param string $prefix Text before link text
+        * @param string $aprops Extra attributes to the a-element
+        * @param string $style Style to apply - if empty, use getInternalLinkAttributesObj instead
+        * @return string The a-element
         */
        static function makeKnownLinkObj(
                $title, $text = '', $query = '', $trail = '', $prefix = '', $aprops = '', $style = ''
index 377d406..e301cea 100644 (file)
@@ -512,7 +512,7 @@ class MagicWord {
        }
 
        /**
-        * @param  $text
+        * @param $text
         * @return bool
         */
        function matchStartAndRemove( &$text ) {
index d0ce482..f46c872 100644 (file)
@@ -545,6 +545,7 @@ class Message {
                                . "passed a String or Language object; $type given"
                        );
                }
+               $this->message = null;
                $this->interface = false;
                return $this;
        }
@@ -565,8 +566,7 @@ class Message {
                }
 
                global $wgContLang;
-               $this->interface = false;
-               $this->language = $wgContLang;
+               $this->inLanguage( $wgContLang );
                return $this;
        }
 
index e3b8577..b5c0c7d 100644 (file)
@@ -536,9 +536,9 @@ class MimeMagic {
         * based formats like OPC/ODF files).
         *
         * @param string $file the file to check
-        * @param $ext Mixed: the file extension, or true (default) to extract it from the filename.
-        *             Set it to false to ignore the extension. DEPRECATED! Set to false, use
-        *             improveTypeFromExtension($mime, $ext) later to improve mime type.
+        * @param string|bool $ext The file extension, or true (default) to extract it from the filename.
+        *   Set it to false to ignore the extension. DEPRECATED! Set to false, use
+        *   improveTypeFromExtension($mime, $ext) later to improve mime type.
         *
         * @return string the mime type of $file
         */
@@ -744,11 +744,11 @@ class MimeMagic {
         * header data.  Currently works for OpenDocument and OpenXML types...
         * If can't tell, returns 'application/zip'.
         *
-        * @param string $header some reasonably-sized chunk of file header
-        * @param $tail   String: the tail of the file
-        * @param $ext Mixed: the file extension, or true to extract it from the filename.
-        *             Set it to false (default) to ignore the extension. DEPRECATED! Set to false,
-        *             use improveTypeFromExtension($mime, $ext) later to improve mime type.
+        * @param string $header Some reasonably-sized chunk of file header
+        * @param string|null $tail The tail of the file
+        * @param string|bool $ext The file extension, or true to extract it from the filename.
+        *   Set it to false (default) to ignore the extension. DEPRECATED! Set to false,
+        *   use improveTypeFromExtension($mime, $ext) later to improve mime type.
         *
         * @return string
         */
@@ -850,10 +850,10 @@ class MimeMagic {
         * mime type if the file is an image. If no mime type can be determined,
         * this function returns 'unknown/unknown'.
         *
-        * @param string $file the file to check
-        * @param $ext Mixed: the file extension, or true (default) to extract it from the filename.
-        *             Set it to false to ignore the extension. DEPRECATED! Set to false, use
-        *             improveTypeFromExtension($mime, $ext) later to improve mime type.
+        * @param string $file The file to check
+        * @param string|bool $ext The file extension, or true (default) to extract it from the filename.
+        *   Set it to false to ignore the extension. DEPRECATED! Set to false, use
+        *   improveTypeFromExtension($mime, $ext) later to improve mime type.
         *
         * @return string the mime type of $file
         */
index 8542904..052ab34 100644 (file)
@@ -252,17 +252,17 @@ class OutputPage extends ContextSource {
        private $mProperties = array();
 
        /**
-        * @var string|null: ResourceLoader target for load.php links. If null, will be omitted
+        * @var string|null ResourceLoader target for load.php links. If null, will be omitted
         */
        private $mTarget = null;
 
        /**
-        * @var bool: Whether parser output should contain table of contents
+        * @var bool Whether parser output should contain table of contents
         */
        private $mEnableTOC = true;
 
        /**
-        * @var bool: Whether parser output should contain section edit links
+        * @var bool Whether parser output should contain section edit links
         */
        private $mEnableSectionEditLinks = true;
 
@@ -295,7 +295,7 @@ class OutputPage extends ContextSource {
        /**
         * Get the URL to redirect to, or an empty string if not redirect URL set
         *
-        * @return String
+        * @return string
         */
        public function getRedirect() {
                return $this->mRedirect;
@@ -304,7 +304,7 @@ class OutputPage extends ContextSource {
        /**
         * Set the HTTP status code to send with the output.
         *
-        * @param $statusCode Integer
+        * @param int $statusCode
         */
        public function setStatusCode( $statusCode ) {
                $this->mStatusCode = $statusCode;
@@ -355,7 +355,7 @@ class OutputPage extends ContextSource {
        /**
         * Get the value of the "rel" attribute for metadata links
         *
-        * @return String
+        * @return string
         */
        public function getMetadataAttribute() {
                # note: buggy CC software only reads first "meta" link
@@ -392,7 +392,7 @@ class OutputPage extends ContextSource {
        /**
         * Get all styles added by extensions
         *
-        * @return Array
+        * @return array
         */
        function getExtStyle() {
                return $this->mExtStyles;
@@ -431,7 +431,7 @@ class OutputPage extends ContextSource {
        /**
         * Get all registered JS and CSS tags for the header.
         *
-        * @return String
+        * @return string
         */
        function getScript() {
                return $this->mScripts . $this->getHeadItems();
@@ -440,10 +440,10 @@ class OutputPage extends ContextSource {
        /**
         * Filter an array of modules to remove insufficiently trustworthy members, and modules
         * which are no longer registered (eg a page is cached before an extension is disabled)
-        * @param $modules Array
-        * @param string $position if not null, only return modules with this position
-        * @param $type string
-        * @return Array
+        * @param array $modules
+        * @param string|null $position if not null, only return modules with this position
+        * @param string $type
+        * @return array
         */
        protected function filterModules( $modules, $position = null, $type = ResourceLoaderModule::TYPE_COMBINED ) {
                $resourceLoader = $this->getResourceLoader();
@@ -464,10 +464,10 @@ class OutputPage extends ContextSource {
        /**
         * Get the list of modules to include on this page
         *
-        * @param bool $filter whether to filter out insufficiently trustworthy modules
-        * @param string $position if not null, only return modules with this position
-        * @param $param string
-        * @return Array of module names
+        * @param bool $filter Whether to filter out insufficiently trustworthy modules
+        * @param string|null $position If not null, only return modules with this position
+        * @param string $param
+        * @return array Array of module names
         */
        public function getModules( $filter = false, $position = null, $param = 'mModules' ) {
                $modules = array_values( array_unique( $this->$param ) );
@@ -481,7 +481,7 @@ class OutputPage extends ContextSource {
         * through this function will be loaded by the resource loader when the
         * page loads.
         *
-        * @param $modules Mixed: module name (string) or array of module names
+        * @param string|array $modules Module name (string) or array of module names
         */
        public function addModules( $modules ) {
                $this->mModules = array_merge( $this->mModules, (array)$modules );
@@ -490,10 +490,10 @@ class OutputPage extends ContextSource {
        /**
         * Get the list of module JS to include on this page
         *
-        * @param $filter
-        * @param $position
+        * @param bool $filter
+        * @param string|null $position
         *
-        * @return array of module names
+        * @return array Array of module names
         */
        public function getModuleScripts( $filter = false, $position = null ) {
                return $this->getModules( $filter, $position, 'mModuleScripts' );
@@ -504,7 +504,7 @@ class OutputPage extends ContextSource {
         * scripts added through this function will be loaded by the resource loader when
         * the page loads.
         *
-        * @param $modules Mixed: module name (string) or array of module names
+        * @param string|array $modules Module name (string) or array of module names
         */
        public function addModuleScripts( $modules ) {
                $this->mModuleScripts = array_merge( $this->mModuleScripts, (array)$modules );
@@ -513,10 +513,10 @@ class OutputPage extends ContextSource {
        /**
         * Get the list of module CSS to include on this page
         *
-        * @param $filter
-        * @param $position
+        * @param bool $filter
+        * @param string|null $position
         *
-        * @return Array of module names
+        * @return array Array of module names
         */
        public function getModuleStyles( $filter = false, $position = null ) {
                return $this->getModules( $filter, $position, 'mModuleStyles' );
@@ -529,7 +529,7 @@ class OutputPage extends ContextSource {
         * tags, rather than as a combined Javascript and CSS package. Thus, they will
         * load when JavaScript is disabled (unless CSS also happens to be disabled).
         *
-        * @param $modules Mixed: module name (string) or array of module names
+        * @param string|array $modules Module name (string) or array of module names
         */
        public function addModuleStyles( $modules ) {
                $this->mModuleStyles = array_merge( $this->mModuleStyles, (array)$modules );
@@ -538,10 +538,10 @@ class OutputPage extends ContextSource {
        /**
         * Get the list of module messages to include on this page
         *
-        * @param $filter
-        * @param $position
+        * @param bool $filter
+        * @param string|null $position
         *
-        * @return Array of module names
+        * @return array Array of module names
         */
        public function getModuleMessages( $filter = false, $position = null ) {
                return $this->getModules( $filter, $position, 'mModuleMessages' );
@@ -552,14 +552,14 @@ class OutputPage extends ContextSource {
         * Module messages added through this function will be loaded by the resource
         * loader when the page loads.
         *
-        * @param $modules Mixed: module name (string) or array of module names
+        * @param string|array $modules Module name (string) or array of module names
         */
        public function addModuleMessages( $modules ) {
                $this->mModuleMessages = array_merge( $this->mModuleMessages, (array)$modules );
        }
 
        /**
-        * @return null|string: ResourceLoader target
+        * @return null|string ResourceLoader target
         */
        public function getTarget() {
                return $this->mTarget;
@@ -568,7 +568,7 @@ class OutputPage extends ContextSource {
        /**
         * Sets ResourceLoader target for load.php links. If null, will be omitted
         *
-        * @param $target string|null
+        * @param string|null $target
         */
        public function setTarget( $target ) {
                $this->mTarget = $target;
@@ -577,7 +577,7 @@ class OutputPage extends ContextSource {
        /**
         * Get an array of head items
         *
-        * @return Array
+        * @return array
         */
        function getHeadItemsArray() {
                return $this->mHeadItems;
@@ -586,7 +586,7 @@ class OutputPage extends ContextSource {
        /**
         * Get all header items in a string
         *
-        * @return String
+        * @return string
         */
        function getHeadItems() {
                $s = '';
@@ -609,8 +609,8 @@ class OutputPage extends ContextSource {
        /**
         * Check if the header item $name is already set
         *
-        * @param string $name item name
-        * @return Boolean
+        * @param string $name Item name
+        * @return bool
         */
        public function hasHeadItem( $name ) {
                return isset( $this->mHeadItems[$name] );
@@ -630,7 +630,7 @@ class OutputPage extends ContextSource {
         * without any skin, sidebar, etc.
         * Used e.g. when calling with "action=render".
         *
-        * @param $only Boolean: whether to output only the body of the article
+        * @param bool $only Whether to output only the body of the article
         */
        public function setArticleBodyOnly( $only ) {
                $this->mArticleBodyOnly = $only;
@@ -639,7 +639,7 @@ class OutputPage extends ContextSource {
        /**
         * Return whether the output will contain only the body of the article
         *
-        * @return Boolean
+        * @return bool
         */
        public function getArticleBodyOnly() {
                return $this->mArticleBodyOnly;
@@ -660,8 +660,8 @@ class OutputPage extends ContextSource {
         * Get an additional output property
         * @since 1.21
         *
-        * @param $name
-        * @return mixed: Property value or null if not found
+        * @param string $name
+        * @return mixed Property value or null if not found
         */
        public function getProperty( $name ) {
                if ( isset( $this->mProperties[$name] ) ) {
@@ -678,9 +678,9 @@ class OutputPage extends ContextSource {
         *
         * Side effect: sets mLastModified for Last-Modified header
         *
-        * @param $timestamp string
+        * @param string $timestamp
         *
-        * @return Boolean: true if cache-ok headers was sent.
+        * @return bool True if cache-ok headers was sent.
         */
        public function checkLastModified( $timestamp ) {
                global $wgCachePages, $wgCacheEpoch, $wgUseSquid, $wgSquidMaxage;
@@ -833,7 +833,7 @@ class OutputPage extends ContextSource {
        /**
         * Get the value of the "action text"
         *
-        * @return String
+        * @return string
         */
        public function getPageTitleActionText() {
                if ( isset( $this->mPageTitleActionText ) ) {
@@ -846,7 +846,7 @@ class OutputPage extends ContextSource {
         * "HTML title" means the contents of "<title>".
         * It is stored as plain, unescaped text and will be run through htmlspecialchars in the skin file.
         *
-        * @param $name string
+        * @param string $name
         */
        public function setHTMLTitle( $name ) {
                if ( $name instanceof Message ) {
@@ -859,7 +859,7 @@ class OutputPage extends ContextSource {
        /**
         * Return the "HTML title", i.e. the content of the "<title>" tag.
         *
-        * @return String
+        * @return string
         */
        public function getHTMLTitle() {
                return $this->mHTMLtitle;
@@ -868,7 +868,7 @@ class OutputPage extends ContextSource {
        /**
         * Set $mRedirectedFrom, the Title of the page which redirected us to the current page.
         *
-        * @param $t Title
+        * @param Title $t
         */
        public function setRedirectedFrom( $t ) {
                $this->mRedirectedFrom = $t;
@@ -880,7 +880,7 @@ class OutputPage extends ContextSource {
         * This function automatically sets \<title\> to the same content as \<h1\> but with all tags removed.
         * Bad tags that were escaped in \<h1\> will still be escaped in \<title\>, and good tags like \<i\> will be dropped entirely.
         *
-        * @param $name string|Message
+        * @param string|Message $name
         */
        public function setPageTitle( $name ) {
                if ( $name instanceof Message ) {
@@ -902,7 +902,7 @@ class OutputPage extends ContextSource {
        /**
         * Return the "page title", i.e. the content of the \<h1\> tag.
         *
-        * @return String
+        * @return string
         */
        public function getPageTitle() {
                return $this->mPagetitle;
@@ -911,7 +911,7 @@ class OutputPage extends ContextSource {
        /**
         * Set the Title object to use
         *
-        * @param $t Title object
+        * @param Title $t
         */
        public function setTitle( Title $t ) {
                $this->getContext()->setTitle( $t );
@@ -953,7 +953,7 @@ class OutputPage extends ContextSource {
        /**
         * Add a subtitle containing a backlink to a page
         *
-        * @param $title Title to link to
+        * @param Title $title Title to link to
         */
        public function addBacklinkSubtitle( Title $title ) {
                $query = array();
@@ -973,7 +973,7 @@ class OutputPage extends ContextSource {
        /**
         * Get the subtitle
         *
-        * @return String
+        * @return string
         */
        public function getSubtitle() {
                return implode( "<br />\n\t\t\t\t", $this->mSubtitle );
@@ -990,7 +990,7 @@ class OutputPage extends ContextSource {
        /**
         * Return whether the page is "printable"
         *
-        * @return Boolean
+        * @return bool
         */
        public function isPrintable() {
                return $this->mPrintable;
@@ -1006,7 +1006,7 @@ class OutputPage extends ContextSource {
        /**
         * Return whether the output will be completely disabled
         *
-        * @return Boolean
+        * @return bool
         */
        public function isDisabled() {
                return $this->mDoNothing;
@@ -1015,7 +1015,7 @@ class OutputPage extends ContextSource {
        /**
         * Show an "add new section" link?
         *
-        * @return Boolean
+        * @return bool
         */
        public function showNewSectionLink() {
                return $this->mNewSectionLink;
@@ -1024,7 +1024,7 @@ class OutputPage extends ContextSource {
        /**
         * Forcibly hide the new section link?
         *
-        * @return Boolean
+        * @return bool
         */
        public function forceHideNewSectionLink() {
                return $this->mHideNewSectionLink;
@@ -1036,7 +1036,7 @@ class OutputPage extends ContextSource {
         * for the new version
         * @see addFeedLink()
         *
-        * @param $show Boolean: true: add default feeds, false: remove all feeds
+        * @param bool $show true: add default feeds, false: remove all feeds
         */
        public function setSyndicated( $show = true ) {
                if ( $show ) {
@@ -1085,7 +1085,7 @@ class OutputPage extends ContextSource {
 
        /**
         * Should we output feed links for this page?
-        * @return Boolean
+        * @return bool
         */
        public function isSyndicated() {
                return count( $this->mFeedLinks ) > 0;
@@ -1113,7 +1113,7 @@ class OutputPage extends ContextSource {
         * corresponding article on the wiki
         * Setting true will cause the change "article related" toggle to true
         *
-        * @param $v Boolean
+        * @param bool $v
         */
        public function setArticleFlag( $v ) {
                $this->mIsarticle = $v;
@@ -1126,7 +1126,7 @@ class OutputPage extends ContextSource {
         * Return whether the content displayed page is related to the source of
         * the corresponding article on the wiki
         *
-        * @return Boolean
+        * @return bool
         */
        public function isArticle() {
                return $this->mIsarticle;
@@ -1136,7 +1136,7 @@ class OutputPage extends ContextSource {
         * Set whether this page is related an article on the wiki
         * Setting false will cause the change of "article flag" toggle to false
         *
-        * @param $v Boolean
+        * @param bool $v
         */
        public function setArticleRelated( $v ) {
                $this->mIsArticleRelated = $v;
@@ -1148,7 +1148,7 @@ class OutputPage extends ContextSource {
        /**
         * Return whether this page is related an article on the wiki
         *
-        * @return Boolean
+        * @return bool
         */
        public function isArticleRelated() {
                return $this->mIsArticleRelated;
@@ -1177,7 +1177,7 @@ class OutputPage extends ContextSource {
        /**
         * Get the list of language links
         *
-        * @return Array of Interwiki Prefixed (non DB key) Titles (e.g. 'fr:Test page')
+        * @return array Array of Interwiki Prefixed (non DB key) Titles (e.g. 'fr:Test page')
         */
        public function getLanguageLinks() {
                return $this->mLanguageLinks;
@@ -1260,7 +1260,7 @@ class OutputPage extends ContextSource {
         * hidden categories) and $link a HTML fragment with a link to the category
         * page
         *
-        * @return Array
+        * @return array
         */
        public function getCategoryLinks() {
                return $this->mCategoryLinks;
@@ -1269,7 +1269,7 @@ class OutputPage extends ContextSource {
        /**
         * Get the list of category names this page belongs to
         *
-        * @return Array of strings
+        * @return array Array of strings
         */
        public function getCategories() {
                return $this->mCategories;
@@ -1290,7 +1290,7 @@ class OutputPage extends ContextSource {
         * Return whether user JavaScript is allowed for this page
         * @deprecated since 1.18 Load modules with ResourceLoader, and origin and
         *     trustworthiness is identified and enforced automagically.
-        * @return Boolean
+        * @return bool
         */
        public function isUserJsAllowed() {
                wfDeprecated( __METHOD__, '1.18' );
@@ -1301,7 +1301,7 @@ class OutputPage extends ContextSource {
         * Show what level of JavaScript / CSS untrustworthiness is allowed on this page
         * @see ResourceLoaderModule::$origin
         * @param string $type ResourceLoaderModule TYPE_ constant
-        * @return Int ResourceLoaderModule ORIGIN_ class constant
+        * @return int ResourceLoaderModule ORIGIN_ class constant
         */
        public function getAllowedModules( $type ) {
                if ( $type == ResourceLoaderModule::TYPE_COMBINED ) {
@@ -1315,8 +1315,8 @@ class OutputPage extends ContextSource {
 
        /**
         * Set the highest level of CSS/JS untrustworthiness allowed
-        * @param  $type String ResourceLoaderModule TYPE_ constant
-        * @param  $level Int ResourceLoaderModule class constant
+        * @param string $type ResourceLoaderModule TYPE_ constant
+        * @param int $level ResourceLoaderModule class constant
         */
        public function setAllowedModules( $type, $level ) {
                $this->mAllowedModules[$type] = $level;
@@ -1324,8 +1324,8 @@ class OutputPage extends ContextSource {
 
        /**
         * As for setAllowedModules(), but don't inadvertently make the page more accessible
-        * @param  $type String
-        * @param  $level Int ResourceLoaderModule class constant
+        * @param string $type
+        * @param int $level ResourceLoaderModule class constant
         */
        public function reduceAllowedModules( $type, $level ) {
                $this->mAllowedModules[$type] = min( $this->getAllowedModules( $type ), $level );
@@ -1354,9 +1354,9 @@ class OutputPage extends ContextSource {
         *
         * @since 1.19
         *
-        * @param $element string
-        * @param $attribs array
-        * @param $contents string
+        * @param string $element
+        * @param array $attribs
+        * @param string $contents
         */
        public function addElement( $element, $attribs = array(), $contents = '' ) {
                $this->addHTML( Html::element( $element, $attribs, $contents ) );
@@ -1372,7 +1372,7 @@ class OutputPage extends ContextSource {
        /**
         * Get the body HTML
         *
-        * @return String: HTML
+        * @return string HTML
         */
        public function getHTML() {
                return $this->mBodytext;
@@ -1381,9 +1381,9 @@ class OutputPage extends ContextSource {
        /**
         * Get/set the ParserOptions object to use for wikitext parsing
         *
-        * @param $options ParserOptions|null either the ParserOption to use or null to only get the
-        *                 current ParserOption object
-        * @return ParserOptions object
+        * @param ParserOptions|null $options Either the ParserOption to use or null to only get the
+        *   current ParserOption object
+        * @return ParserOptions
         */
        public function parserOptions( $options = null ) {
                if ( !$this->mParserOptions ) {
@@ -1397,8 +1397,8 @@ class OutputPage extends ContextSource {
         * Set the revision ID which will be seen by the wiki text parser
         * for things such as embedded {{REVISIONID}} variable use.
         *
-        * @param $revid Mixed: an positive integer, or null
-        * @return Mixed: previous value
+        * @param int|null $revid An positive integer, or null
+        * @return mixed Previous value
         */
        public function setRevisionId( $revid ) {
                $val = is_null( $revid ) ? null : intval( $revid );
@@ -1408,7 +1408,7 @@ class OutputPage extends ContextSource {
        /**
         * Get the displayed revision ID
         *
-        * @return Integer
+        * @return int
         */
        public function getRevisionId() {
                return $this->mRevisionId;
@@ -1418,8 +1418,8 @@ class OutputPage extends ContextSource {
         * Set the timestamp of the revision which will be displayed. This is used
         * to avoid a extra DB call in Skin::lastModified().
         *
-        * @param $timestamp Mixed: string, or null
-        * @return Mixed: previous value
+        * @param string|null $timestamp
+        * @return mixed Previous value
         */
        public function setRevisionTimestamp( $timestamp ) {
                return wfSetVar( $this->mRevisionTimestamp, $timestamp );
@@ -1429,7 +1429,7 @@ class OutputPage extends ContextSource {
         * Get the timestamp of displayed revision.
         * This will be null if not filled by setRevisionTimestamp().
         *
-        * @return String or null
+        * @return string|null
         */
        public function getRevisionTimestamp() {
                return $this->mRevisionTimestamp;
@@ -1438,8 +1438,8 @@ class OutputPage extends ContextSource {
        /**
         * Set the displayed file version
         *
-        * @param $file File|bool
-        * @return Mixed: previous value
+        * @param File|bool $file
+        * @return mixed Previous value
         */
        public function setFileVersion( $file ) {
                $val = null;
@@ -1452,7 +1452,7 @@ class OutputPage extends ContextSource {
        /**
         * Get the displayed file version
         *
-        * @return Array|null ('time' => MW timestamp, 'sha1' => sha1)
+        * @return array|null ('time' => MW timestamp, 'sha1' => sha1)
         */
        public function getFileVersion() {
                return $this->mFileVersion;
@@ -1461,7 +1461,7 @@ class OutputPage extends ContextSource {
        /**
         * Get the templates used on this page
         *
-        * @return Array (namespace => dbKey => revId)
+        * @return array (namespace => dbKey => revId)
         * @since 1.18
         */
        public function getTemplateIds() {
@@ -1471,7 +1471,7 @@ class OutputPage extends ContextSource {
        /**
         * Get the files used on this page
         *
-        * @return Array (dbKey => array('time' => MW timestamp or null, 'sha1' => sha1 or ''))
+        * @return array (dbKey => array('time' => MW timestamp or null, 'sha1' => sha1 or ''))
         * @since 1.18
         */
        public function getFileSearchOptions() {
@@ -1482,9 +1482,9 @@ class OutputPage extends ContextSource {
         * Convert wikitext to HTML and add it to the buffer
         * Default assumes that the current page title will be used.
         *
-        * @param $text String
-        * @param $linestart Boolean: is this the start of a line?
-        * @param $interface Boolean: is this text in the user interface language?
+        * @param string $text
+        * @param bool $linestart Is this the start of a line?
+        * @param bool $interface Is this text in the user interface language?
         */
        public function addWikiText( $text, $linestart = true, $interface = true ) {
                $title = $this->getTitle(); // Work around E_STRICT
@@ -1497,9 +1497,9 @@ class OutputPage extends ContextSource {
        /**
         * Add wikitext with a custom Title object
         *
-        * @param string $text wikitext
-        * @param $title Title object
-        * @param $linestart Boolean: is this the start of a line?
+        * @param string $text Wikitext
+        * @param Title $title
+        * @param bool $linestart Is this the start of a line?
         */
        public function addWikiTextWithTitle( $text, &$title, $linestart = true ) {
                $this->addWikiTextTitle( $text, $title, $linestart );
@@ -1508,9 +1508,9 @@ class OutputPage extends ContextSource {
        /**
         * Add wikitext with a custom Title object and tidy enabled.
         *
-        * @param string $text wikitext
-        * @param $title Title object
-        * @param $linestart Boolean: is this the start of a line?
+        * @param string $text Wikitext
+        * @param Title $title
+        * @param bool $linestart Is this the start of a line?
         */
        function addWikiTextTitleTidy( $text, &$title, $linestart = true ) {
                $this->addWikiTextTitle( $text, $title, $linestart, true );
@@ -1519,8 +1519,8 @@ class OutputPage extends ContextSource {
        /**
         * Add wikitext with tidy enabled
         *
-        * @param string $text wikitext
-        * @param $linestart Boolean: is this the start of a line?
+        * @param string $text Wikitext
+        * @param bool $linestart Is this the start of a line?
         */
        public function addWikiTextTidy( $text, $linestart = true ) {
                $title = $this->getTitle();
@@ -1530,12 +1530,12 @@ class OutputPage extends ContextSource {
        /**
         * Add wikitext with a custom Title object
         *
-        * @param string $text wikitext
-        * @param $title Title object
-        * @param $linestart Boolean: is this the start of a line?
-        * @param $tidy Boolean: whether to use tidy
-        * @param $interface Boolean: whether it is an interface message
-        *                                                              (for example disables conversion)
+        * @param string $text Wikitext
+        * @param Title $title
+        * @param bool $linestart Is this the start of a line?
+        * @param bool $tidy Whether to use tidy
+        * @param bool $interface Whether it is an interface message
+        *   (for example disables conversion)
         */
        public function addWikiTextTitle( $text, Title $title, $linestart, $tidy = false, $interface = false ) {
                global $wgParser;
@@ -1561,7 +1561,7 @@ class OutputPage extends ContextSource {
        /**
         * Add a ParserOutput object, but without Html
         *
-        * @param $parserOutput ParserOutput object
+        * @param ParserOutput $parserOutput
         */
        public function addParserOutputNoText( &$parserOutput ) {
                $this->mLanguageLinks += $parserOutput->getLanguageLinks();
@@ -1613,7 +1613,7 @@ class OutputPage extends ContextSource {
        /**
         * Add a ParserOutput object
         *
-        * @param $parserOutput ParserOutput
+        * @param ParserOutput $parserOutput
         */
        function addParserOutput( &$parserOutput ) {
                $this->addParserOutputNoText( $parserOutput );
@@ -1631,7 +1631,7 @@ class OutputPage extends ContextSource {
        /**
         * Add the output of a QuickTemplate to the output buffer
         *
-        * @param $template QuickTemplate
+        * @param QuickTemplate $template
         */
        public function addTemplate( &$template ) {
                $this->addHTML( $template->getHTML() );
@@ -1640,16 +1640,14 @@ class OutputPage extends ContextSource {
        /**
         * Parse wikitext and return the HTML.
         *
-        * @param $text String
-        * @param $linestart Boolean: is this the start of a line?
-        * @param $interface Boolean: use interface language ($wgLang instead of
-        *                   $wgContLang) while parsing language sensitive magic
-        *                   words like GRAMMAR and PLURAL. This also disables
-        *                   LanguageConverter.
-        * @param $language  Language object: target language object, will override
-        *                   $interface
+        * @param string $text
+        * @param bool $linestart Is this the start of a line?
+        * @param bool $interface Use interface language ($wgLang instead of
+        *   $wgContLang) while parsing language sensitive magic words like GRAMMAR and PLURAL.
+        *   This also disables LanguageConverter.
+        * @param Language $language Target language object, will override $interface
         * @throws MWException
-        * @return String: HTML
+        * @return string HTML
         */
        public function parse( $text, $linestart = true, $interface = false, $language = null ) {
                global $wgParser;
@@ -1684,12 +1682,12 @@ class OutputPage extends ContextSource {
        /**
         * Parse wikitext, strip paragraphs, and return the HTML.
         *
-        * @param $text String
-        * @param $linestart Boolean: is this the start of a line?
-        * @param $interface Boolean: use interface language ($wgLang instead of
-        *                   $wgContLang) while parsing language sensitive magic
-        *                   words like GRAMMAR and PLURAL
-        * @return String: HTML
+        * @param string $text
+        * @param bool $linestart Is this the start of a line?
+        * @param bool $interface Use interface language ($wgLang instead of
+        *   $wgContLang) while parsing language sensitive magic
+        *   words like GRAMMAR and PLURAL
+        * @return string HTML
         */
        public function parseInline( $text, $linestart = true, $interface = false ) {
                $parsed = $this->parse( $text, $linestart, $interface );
@@ -1705,7 +1703,7 @@ class OutputPage extends ContextSource {
        /**
         * Set the value of the "s-maxage" part of the "Cache-control" HTTP header
         *
-        * @param $maxage Integer: maximum cache time on the Squid, in seconds.
+        * @param int $maxage Maximum cache time on the Squid, in seconds.
         */
        public function setSquidMaxage( $maxage ) {
                $this->mSquidMaxage = $maxage;
@@ -1714,7 +1712,7 @@ class OutputPage extends ContextSource {
        /**
         * Use enableClientCache(false) to force it to send nocache headers
         *
-        * @param $state bool
+        * @param bool $state
         *
         * @return bool
         */
@@ -1725,7 +1723,7 @@ class OutputPage extends ContextSource {
        /**
         * Get the list of cookies that will influence on the cache
         *
-        * @return Array
+        * @return array
         */
        function getCacheVaryCookies() {
                global $wgCookiePrefix, $wgCacheVaryCookies;
@@ -1749,7 +1747,7 @@ class OutputPage extends ContextSource {
         * Check if the request has a cache-varying cookie header
         * If it does, it's very important that we don't allow public caching
         *
-        * @return Boolean
+        * @return bool
         */
        function haveCacheVaryCookies() {
                $cookieHeader = $this->getRequest()->getHeader( 'cookie' );
@@ -1772,7 +1770,7 @@ class OutputPage extends ContextSource {
         * Add an HTTP header that will influence on the cache
         *
         * @param string $header header name
-        * @param $option Array|null
+        * @param array|null $option
         * @todo FIXME: Document the $option parameter; it appears to be for
         *        X-Vary-Options but what format is acceptable?
         */
@@ -1793,7 +1791,7 @@ class OutputPage extends ContextSource {
         * Return a Vary: header on which to vary caches. Based on the keys of $mVaryHeader,
         * such as Accept-Encoding or Cookie
         *
-        * @return String
+        * @return string
         */
        public function getVaryHeader() {
                return 'Vary: ' . join( ', ', array_keys( $this->mVaryHeader ) );
@@ -1802,7 +1800,7 @@ class OutputPage extends ContextSource {
        /**
         * Get a complete X-Vary-Options header
         *
-        * @return String
+        * @return string
         */
        public function getXVO() {
                $cvCookies = $this->getCacheVaryCookies();
@@ -1866,7 +1864,7 @@ class OutputPage extends ContextSource {
         * This is the default for special pages. If you display a CSRF-protected
         * form on an ordinary view page, then you need to call this function.
         *
-        * @param $enable bool
+        * @param bool $enable
         */
        public function preventClickjacking( $enable = true ) {
                $this->mPreventClickjacking = $enable;
@@ -1969,9 +1967,8 @@ class OutputPage extends ContextSource {
        /**
         * Get the message associated with the HTTP response code $code
         *
-        * @param $code Integer: status code
-        * @return String or null: message or null if $code is not in the list of
-        *         messages
+        * @param int $code Status code
+        * @return string|null Message or null if $code is not in the list of messages
         *
         * @deprecated since 1.18 Use HttpStatus::getMessage() instead.
         */
@@ -2147,9 +2144,9 @@ class OutputPage extends ContextSource {
         * showErrorPage( 'titlemsg', $messageObject );
         * showErrorPage( $titleMessageObject, $messageObject );
         *
-        * @param $title Mixed: message key (string) for page title, or a Message object
-        * @param $msg Mixed: message key (string) for page text, or a Message object
-        * @param array $params message parameters; ignored if $msg is a Message object
+        * @param string|Message $title Message key (string) for page title, or a Message object
+        * @param string|Message $msg Message key (string) for page text, or a Message object
+        * @param array $params Message parameters; ignored if $msg is a Message object
         */
        public function showErrorPage( $title, $msg, $params = array() ) {
                if ( !$title instanceof Message ) {
@@ -2246,7 +2243,7 @@ class OutputPage extends ContextSource {
         * Display an error page indicating that a given version of MediaWiki is
         * required to use it
         *
-        * @param $version Mixed: the version of MediaWiki needed to use the page
+        * @param mixed $version The version of MediaWiki needed to use the page
         */
        public function versionRequired( $version ) {
                $this->prepareErrorPage( $this->msg( 'versionrequired', $version ) );
@@ -2277,9 +2274,9 @@ class OutputPage extends ContextSource {
        /**
         * Format a list of error messages
         *
-        * @param array $errors of arrays returned by Title::getUserPermissionsErrors
-        * @param string $action action that was denied or null if unknown
-        * @return String: the wikitext error-messages, formatted into a list.
+        * @param array $errors Array of arrays returned by Title::getUserPermissionsErrors
+        * @param string $action Action that was denied or null if unknown
+        * @return string The wikitext error-messages, formatted into a list.
         */
        public function formatPermissionsErrorMessage( $errors, $action = null ) {
                if ( $action == null ) {
@@ -2326,10 +2323,10 @@ class OutputPage extends ContextSource {
         *
         * @todo Needs to be split into multiple functions.
         *
-        * @param $source    String: source code to show (or null).
-        * @param $protected Boolean: is this a permissions error?
-        * @param $reasons   Array: list of reasons for this error, as returned by Title::getUserPermissionsErrors().
-        * @param $action    String: action that was denied or null if unknown
+        * @param string $source Source code to show (or null).
+        * @param bool $protected Is this a permissions error?
+        * @param array $reasons List of reasons for this error, as returned by Title::getUserPermissionsErrors().
+        * @param string $action Action that was denied or null if unknown
         * @throws ReadOnlyError
         */
        public function readOnlyPage( $source = null, $protected = false, $reasons = array(), $action = null ) {
@@ -2403,7 +2400,7 @@ $templates
         * then the warning is a bit more obvious. If the lag is
         * lower than $wgSlaveLagWarning, then no warning is shown.
         *
-        * @param $lag Integer: slave lag
+        * @param int $lag Slave lag
         */
        public function showLagWarning( $lag ) {
                global $wgSlaveLagWarning, $wgSlaveLagCritical;
@@ -2445,10 +2442,10 @@ $templates
        /**
         * Add a "return to" link pointing to a specified title
         *
-        * @param $title Title to link
-        * @param array $query query string parameters
-        * @param string $text text of the link (input is not escaped)
-        * @param $options Options array to pass to Linker
+        * @param Title $title Title to link
+        * @param array $query Query string parameters
+        * @param string $text Text of the link (input is not escaped)
+        * @param array $options Options array to pass to Linker
         */
        public function addReturnTo( $title, $query = array(), $text = null, $options = array() ) {
                $link = $this->msg( 'returnto' )->rawParams(
@@ -2460,9 +2457,9 @@ $templates
         * Add a "return to" link pointing to a specified title,
         * or the title indicated in the request, or else the main page
         *
-        * @param $unused
-        * @param $returnto Title or String to return to
-        * @param string $returntoquery query string for the return to link
+        * @param mixed $unused
+        * @param Title|string $returnto Title or String to return to
+        * @param string $returntoquery Query string for the return to link
         */
        public function returnToMain( $unused = null, $returnto = null, $returntoquery = null ) {
                if ( $returnto == null ) {
@@ -2490,9 +2487,9 @@ $templates
        }
 
        /**
-        * @param $sk Skin The given Skin
-        * @param $includeStyle Boolean: unused
-        * @return String: The doctype, opening "<html>", and head element.
+        * @param Skin $sk The given Skin
+        * @param bool $includeStyle Unused
+        * @return string The doctype, opening "<html>", and head element.
         */
        public function headElement( Skin $sk, $includeStyle = true ) {
                global $wgContLang, $wgMimeType;
@@ -2530,12 +2527,15 @@ $templates
                // jQuery can work correctly.
                $ret .= Html::element( 'meta', array( 'http-equiv' => 'X-UA-Compatible', 'content' => 'IE=EDGE' ) ) . "\n";
 
-               $ret .= implode( "\n", array(
-                       $this->getHeadLinks(),
-                       $this->buildCssLinks(),
-                       $this->getHeadScripts(),
+               $ret .= (
+                       $this->getHeadLinks() .
+                       "\n" .
+                       $this->buildCssLinks() .
+                       // No newline after buildCssLinks since makeResourceLoaderLink did that already
+                       $this->getHeadScripts() .
+                       "\n" .
                        $this->getHeadItems()
-               ) );
+               );
 
                $closeHead = Html::closeElement( 'head' );
                if ( $closeHead ) {
@@ -2586,22 +2586,28 @@ $templates
 
        /**
         * TODO: Document
-        * @param $modules Array/string with the module name(s)
+        * @param array|string $modules One or more module names
         * @param string $only ResourceLoaderModule TYPE_ class constant
-        * @param $useESI boolean
-        * @param array $extraQuery with extra query parameters to add to each request. array( param => value )
-        * @param $loadCall boolean If true, output an (asynchronous) mw.loader.load() call rather than a "<script src='...'>" tag
-        * @return string html "<script>" and "<style>" tags
+        * @param bool $useESI
+        * @param array $extraQuery Array with extra query parameters to add to each request. array( param => value )
+        * @param bool $loadCall If true, output an (asynchronous) mw.loader.load() call rather than a "<script src='...'>" tag
+        * @return string The html "<script>", "<link>" and "<style>" tags
         */
        protected function makeResourceLoaderLink( $modules, $only, $useESI = false, array $extraQuery = array(), $loadCall = false ) {
                global $wgResourceLoaderUseESI;
 
                $modules = (array)$modules;
 
+               $links = array(
+                       'html' => '',
+                       'states' => array(),
+               );
+
                if ( !count( $modules ) ) {
-                       return '';
+                       return $links;
                }
 
+
                if ( count( $modules ) > 1 ) {
                        // Remove duplicate module requests
                        $modules = array_unique( $modules );
@@ -2610,13 +2616,15 @@ $templates
 
                        if ( ResourceLoader::inDebugMode() ) {
                                // Recursively call us for every item
-                               $links = '';
                                foreach ( $modules as $name ) {
-                                       $links .= $this->makeResourceLoaderLink( $name, $only, $useESI );
+                                       $link = $this->makeResourceLoaderLink( $name, $only, $useESI );
+                                       $links['html'] .= $link['html'];
+                                       $links['states'] += $link['states'];
                                }
                                return $links;
                        }
                }
+
                if ( !is_null( $this->mTarget ) ) {
                        $extraQuery['target'] = $this->mTarget;
                }
@@ -2644,7 +2652,6 @@ $templates
                        $groups[$group][$name] = $module;
                }
 
-               $links = '';
                foreach ( $groups as $group => $grpModules ) {
                        // Special handling for user-specific groups
                        $user = null;
@@ -2667,25 +2674,20 @@ $templates
                                $extraQuery
                        );
                        $context = new ResourceLoaderContext( $resourceLoader, new FauxRequest( $query ) );
+
                        // Extract modules that know they're empty
-                       $emptyModules = array();
                        foreach ( $grpModules as $key => $module ) {
+                               // Inline empty modules: since they're empty, just mark them as 'ready' (bug 46857)
+                               // If we're only getting the styles, we don't need to do anything for empty modules.
                                if ( $module->isKnownEmpty( $context ) ) {
-                                       $emptyModules[$key] = 'ready';
                                        unset( $grpModules[$key] );
+                                       if ( $only !== ResourceLoaderModule::TYPE_STYLES ) {
+                                               $links['states'][$key] = 'ready';
+                                       }
                                }
                        }
-                       // Inline empty modules: since they're empty, just mark them as 'ready'
-                       if ( count( $emptyModules ) > 0 && $only !== ResourceLoaderModule::TYPE_STYLES ) {
-                               // If we're only getting the styles, we don't need to do anything for empty modules.
-                               $links .= Html::inlineScript(
-                                               ResourceLoader::makeLoaderConditionalScript(
-                                                               ResourceLoader::makeLoaderStateScript( $emptyModules )
-                                               )
-                               ) . "\n";
-                       }
 
-                       // If there are no modules left, skip this group
+                       // If there are no non-empty modules, skip this group
                        if ( count( $grpModules ) === 0 ) {
                                continue;
                        }
@@ -2696,19 +2698,20 @@ $templates
                        // properly use them as dependencies (bug 30914)
                        if ( $group === 'private' ) {
                                if ( $only == ResourceLoaderModule::TYPE_STYLES ) {
-                                       $links .= Html::inlineStyle(
+                                       $links['html'] .= Html::inlineStyle(
                                                $resourceLoader->makeModuleResponse( $context, $grpModules )
                                        );
                                } else {
-                                       $links .= Html::inlineScript(
+                                       $links['html'] .= Html::inlineScript(
                                                ResourceLoader::makeLoaderConditionalScript(
                                                        $resourceLoader->makeModuleResponse( $context, $grpModules )
                                                )
                                        );
                                }
-                               $links .= "\n";
+                               $links['html'] .= "\n";
                                continue;
                        }
+
                        // Special handling for the user group; because users might change their stuff
                        // on-wiki like user pages, or user preferences; we need to find the highest
                        // timestamp of these user-changeable modules so we can ensure cache misses on change
@@ -2756,32 +2759,71 @@ $templates
                                        );
                                } else {
                                        $link = Html::linkedScript( $url );
+
+                                       // For modules requested directly in the html via <link> or <script>,
+                                       // tell mw.loader they are being loading to prevent duplicate requests.
+                                       foreach ( $grpModules as $key => $module ) {
+                                               // Don't output state=loading for the startup module..
+                                               if ( $key !== 'startup' ) {
+                                                       $links['states'][$key] = 'loading';
+                                               }
+                                       }
                                }
                        }
 
                        if ( $group == 'noscript' ) {
-                               $links .= Html::rawElement( 'noscript', array(), $link ) . "\n";
+                               $links['html'] .= Html::rawElement( 'noscript', array(), $link ) . "\n";
                        } else {
-                               $links .= $link . "\n";
+                               $links['html'] .= $link . "\n";
                        }
                }
+
                return $links;
        }
 
+       /**
+        * Build html output from an array of links from makeResourceLoaderLink.
+        * @param array $links
+        * @return string HTML
+        */
+       protected static function getHtmlFromLoaderLinks( Array $links ) {
+               $html = '';
+               $states = array();
+               foreach ( $links as $link ) {
+                       if ( !is_array( $link ) ) {
+                               $html .= $link;
+                       } else {
+                               $html .= $link['html'];
+                               $states += $link['states'];
+                       }
+               }
+
+               if ( count( $states ) ) {
+                       $html = Html::inlineScript(
+                               ResourceLoader::makeLoaderConditionalScript(
+                                       ResourceLoader::makeLoaderStateScript( $states )
+                               )
+                       ) . "\n" . $html;
+               }
+
+               return $html;
+       }
+
        /**
         * JS stuff to put in the "<head>". This is the startup module, config
         * vars and modules marked with position 'top'
         *
-        * @return String: HTML fragment
+        * @return string HTML fragment
         */
        function getHeadScripts() {
                global $wgResourceLoaderExperimentalAsyncLoading;
 
                // Startup - this will immediately load jquery and mediawiki modules
-               $scripts = $this->makeResourceLoaderLink( 'startup', ResourceLoaderModule::TYPE_SCRIPTS, true );
+               $links = array();
+               $links[] = $this->makeResourceLoaderLink( 'startup', ResourceLoaderModule::TYPE_SCRIPTS, true );
 
                // Load config before anything else
-               $scripts .= Html::inlineScript(
+               $links[] = Html::inlineScript(
                        ResourceLoader::makeLoaderConditionalScript(
                                ResourceLoader::makeConfigSetScript( $this->getJSVars() )
                        )
@@ -2791,18 +2833,18 @@ $templates
                // This needs to be TYPE_COMBINED so these modules are properly wrapped
                // in mw.loader.implement() calls and deferred until mw.user is available
                $embedScripts = array( 'user.options', 'user.tokens' );
-               $scripts .= $this->makeResourceLoaderLink( $embedScripts, ResourceLoaderModule::TYPE_COMBINED );
+               $links[] = $this->makeResourceLoaderLink( $embedScripts, ResourceLoaderModule::TYPE_COMBINED );
 
-               // Script and Messages "only" requests marked for top inclusion
+               // Scripts and messages "only" requests marked for top inclusion
                // Messages should go first
-               $scripts .= $this->makeResourceLoaderLink( $this->getModuleMessages( true, 'top' ), ResourceLoaderModule::TYPE_MESSAGES );
-               $scripts .= $this->makeResourceLoaderLink( $this->getModuleScripts( true, 'top' ), ResourceLoaderModule::TYPE_SCRIPTS );
+               $links[] = $this->makeResourceLoaderLink( $this->getModuleMessages( true, 'top' ), ResourceLoaderModule::TYPE_MESSAGES );
+               $links[] = $this->makeResourceLoaderLink( $this->getModuleScripts( true, 'top' ), ResourceLoaderModule::TYPE_SCRIPTS );
 
                // Modules requests - let the client calculate dependencies and batch requests as it likes
                // Only load modules that have marked themselves for loading at the top
                $modules = $this->getModules( true, 'top' );
                if ( $modules ) {
-                       $scripts .= Html::inlineScript(
+                       $links[] = Html::inlineScript(
                                ResourceLoader::makeLoaderConditionalScript(
                                        Xml::encodeJsCall( 'mw.loader.load', array( $modules ) )
                                )
@@ -2810,32 +2852,33 @@ $templates
                }
 
                if ( $wgResourceLoaderExperimentalAsyncLoading ) {
-                       $scripts .= $this->getScriptsForBottomQueue( true );
+                       $links[] = $this->getScriptsForBottomQueue( true );
                }
 
-               return $scripts;
+               return self::getHtmlFromLoaderLinks( $links );
        }
 
        /**
         * JS stuff to put at the 'bottom', which can either be the bottom of the "<body>"
         * or the bottom of the "<head>" depending on $wgResourceLoaderExperimentalAsyncLoading:
         * modules marked with position 'bottom', legacy scripts ($this->mScripts),
-        * user preferences, site JS and user JS
+        * user preferences, site JS and user JS.
         *
-        * @param $inHead boolean If true, this HTML goes into the "<head>", if false it goes into the "<body>"
+        * @param bool $inHead If true, this HTML goes into the "<head>", if false it goes into the "<body>"
         * @return string
         */
        function getScriptsForBottomQueue( $inHead ) {
                global $wgUseSiteJs, $wgAllowUserJs;
 
-               // Script and Messages "only" requests marked for bottom inclusion
+               // Scripts and messages "only" requests marked for bottom inclusion
                // If we're in the <head>, use load() calls rather than <script src="..."> tags
                // Messages should go first
-               $scripts = $this->makeResourceLoaderLink( $this->getModuleMessages( true, 'bottom' ),
+               $links = array();
+               $links[] = $this->makeResourceLoaderLink( $this->getModuleMessages( true, 'bottom' ),
                        ResourceLoaderModule::TYPE_MESSAGES, /* $useESI = */ false, /* $extraQuery = */ array(),
                        /* $loadCall = */ $inHead
                );
-               $scripts .= $this->makeResourceLoaderLink( $this->getModuleScripts( true, 'bottom' ),
+               $links[] = $this->makeResourceLoaderLink( $this->getModuleScripts( true, 'bottom' ),
                        ResourceLoaderModule::TYPE_SCRIPTS, /* $useESI = */ false, /* $extraQuery = */ array(),
                        /* $loadCall = */ $inHead
                );
@@ -2844,7 +2887,7 @@ $templates
                // Only load modules that have marked themselves for loading at the bottom
                $modules = $this->getModules( true, 'bottom' );
                if ( $modules ) {
-                       $scripts .= Html::inlineScript(
+                       $links[] = Html::inlineScript(
                                ResourceLoader::makeLoaderConditionalScript(
                                        Xml::encodeJsCall( 'mw.loader.load', array( $modules, null, true ) )
                                )
@@ -2852,88 +2895,40 @@ $templates
                }
 
                // Legacy Scripts
-               $scripts .= "\n" . $this->mScripts;
-
-               $defaultModules = array();
+               $links[] = "\n" . $this->mScripts;
 
                // Add site JS if enabled
-               if ( $wgUseSiteJs ) {
-                       $scripts .= $this->makeResourceLoaderLink( 'site', ResourceLoaderModule::TYPE_SCRIPTS,
-                               /* $useESI = */ false, /* $extraQuery = */ array(), /* $loadCall = */ $inHead
-                       );
-                       $defaultModules['site'] = 'loading';
-               } else {
-                       // Site module is empty, save request by marking ready in advance (bug 46857)
-                       $defaultModules['site'] = 'ready';
-               }
+               $links[] = $this->makeResourceLoaderLink( 'site', ResourceLoaderModule::TYPE_SCRIPTS,
+                       /* $useESI = */ false, /* $extraQuery = */ array(), /* $loadCall = */ $inHead
+               );
 
                // Add user JS if enabled
-               if ( $wgAllowUserJs ) {
-                       if ( $this->getUser()->isLoggedIn() ) {
-                               if ( $this->getTitle() && $this->getTitle()->isJsSubpage() && $this->userCanPreview() ) {
-                                       # XXX: additional security check/prompt?
-                                       // We're on a preview of a JS subpage
-                                       // Exclude this page from the user module in case it's in there (bug 26283)
-                                       $scripts .= $this->makeResourceLoaderLink( 'user', ResourceLoaderModule::TYPE_SCRIPTS, false,
-                                               array( 'excludepage' => $this->getTitle()->getPrefixedDBkey() ), $inHead
-                                       );
-                                       // Load the previewed JS
-                                       $scripts .= Html::inlineScript( "\n" . $this->getRequest()->getText( 'wpTextbox1' ) . "\n" ) . "\n";
-                                       // FIXME: If the user is previewing, say, ./vector.js, his ./common.js will be loaded
-                                       // asynchronously and may arrive *after* the inline script here. So the previewed code
-                                       // may execute before ./common.js runs. Normally, ./common.js runs before ./vector.js...
-                               } else {
-                                       // Include the user module normally, i.e., raw to avoid it being wrapped in a closure.
-                                       $scripts .= $this->makeResourceLoaderLink( 'user', ResourceLoaderModule::TYPE_SCRIPTS,
-                                               /* $useESI = */ false, /* $extraQuery = */ array(), /* $loadCall = */ $inHead
-                                       );
-                               }
-                               $defaultModules['user'] = 'loading';
-                       } else {
-                               // Non-logged-in users have an empty user module.
-                               // Save request by marking ready in advance (bug 46857)
-                               $defaultModules['user'] = 'ready';
-                       }
+               if ( $wgAllowUserJs && $this->getUser()->isLoggedIn() && $this->getTitle() && $this->getTitle()->isJsSubpage() && $this->userCanPreview() ) {
+                       # XXX: additional security check/prompt?
+                       // We're on a preview of a JS subpage
+                       // Exclude this page from the user module in case it's in there (bug 26283)
+                       $links[] = $this->makeResourceLoaderLink( 'user', ResourceLoaderModule::TYPE_SCRIPTS, false,
+                               array( 'excludepage' => $this->getTitle()->getPrefixedDBkey() ), $inHead
+                       );
+                       // Load the previewed JS
+                       $links[] = Html::inlineScript( "\n" . $this->getRequest()->getText( 'wpTextbox1' ) . "\n" ) . "\n";
+
+                       // FIXME: If the user is previewing, say, ./vector.js, his ./common.js will be loaded
+                       // asynchronously and may arrive *after* the inline script here. So the previewed code
+                       // may execute before ./common.js runs. Normally, ./common.js runs before ./vector.js...
                } else {
-                       // User modules are disabled on this wiki.
-                       // Save request by marking ready in advance (bug 46857)
-                       $defaultModules['user'] = 'ready';
+                       // Include the user module normally, i.e., raw to avoid it being wrapped in a closure.
+                       $links[] = $this->makeResourceLoaderLink( 'user', ResourceLoaderModule::TYPE_SCRIPTS,
+                               /* $useESI = */ false, /* $extraQuery = */ array(), /* $loadCall = */ $inHead
+                       );
                }
 
                // Group JS is only enabled if site JS is enabled.
-               if ( $wgUseSiteJs ) {
-                       if ( $this->getUser()->isLoggedIn() ) {
-                               $scripts .= $this->makeResourceLoaderLink( 'user.groups', ResourceLoaderModule::TYPE_COMBINED,
-                                       /* $useESI = */ false, /* $extraQuery = */ array(), /* $loadCall = */ $inHead
-                               );
-                               $defaultModules['user.groups'] = 'loading';
-                       } else {
-                               // Non-logged-in users have no user.groups module.
-                               // Save request by marking ready in advance (bug 46857)
-                               $defaultModules['user.groups'] = 'ready';
-                       }
-               } else {
-                       // Site (and group JS) disabled
-                       $defaultModules['user.groups'] = 'ready';
-               }
+               $links[] = $this->makeResourceLoaderLink( 'user.groups', ResourceLoaderModule::TYPE_COMBINED,
+                       /* $useESI = */ false, /* $extraQuery = */ array(), /* $loadCall = */ $inHead
+               );
 
-               $loaderInit = '';
-               if ( $inHead ) {
-                       // We generate loader calls anyway, so no need to fix the client-side loader's state to 'loading'.
-                       foreach ( $defaultModules as $m => $state ) {
-                               if ( $state == 'loading' ) {
-                                       unset( $defaultModules[$m] );
-                               }
-                       }
-               }
-               if ( count( $defaultModules ) > 0 ) {
-                       $loaderInit = Html::inlineScript(
-                               ResourceLoader::makeLoaderConditionalScript(
-                                       ResourceLoader::makeLoaderStateScript( $defaultModules )
-                               )
-                       ) . "\n";
-               }
-               return $loaderInit . $scripts;
+               return self::getHtmlFromLoaderLinks( $links );
        }
 
        /**
@@ -2959,7 +2954,7 @@ $templates
        /**
         * Get the javascript config vars to include on this page
         *
-        * @return Array of javascript config vars
+        * @return array Array of javascript config vars
         * @since 1.23
         */
        public function getJsConfigVars() {
@@ -2967,10 +2962,10 @@ $templates
        }
 
        /**
-        * Add one or more variables to be set in mw.config in JavaScript.
+        * Add one or more variables to be set in mw.config in JavaScript
         *
-        * @param $keys {String|Array} Key or array of key/value pairs.
-        * @param $value {Mixed} [optional] Value of the configuration variable.
+        * @param string|array $keys Key or array of key/value pairs
+        * @param mixed $value [optional] Value of the configuration variable
         */
        public function addJsConfigVars( $keys, $value = null ) {
                if ( is_array( $keys ) ) {
@@ -3350,10 +3345,10 @@ $templates
        /**
         * Generate a "<link rel/>" for a feed.
         *
-        * @param string $type feed type
+        * @param string $type Feed type
         * @param string $url URL to the feed
-        * @param string $text value of the "title" attribute
-        * @return String: HTML fragment
+        * @param string $text Value of the "title" attribute
+        * @return string HTML fragment
         */
        private function feedLink( $type, $url, $text ) {
                return Html::element( 'link', array(
@@ -3391,7 +3386,7 @@ $templates
 
        /**
         * Adds inline CSS styles
-        * @param $style_css Mixed: inline CSS
+        * @param mixed $style_css Inline CSS
         * @param string $flip Set to 'flip' to flip the CSS if needed
         */
        public function addInlineStyle( $style_css, $flip = 'noflip' ) {
@@ -3399,7 +3394,7 @@ $templates
                        # If wanted, and the interface is right-to-left, flip the CSS
                        $style_css = CSSJanus::transform( $style_css, true, false );
                }
-               $this->mInlineStyles .= Html::inlineStyle( $style_css );
+               $this->mInlineStyles .= Html::inlineStyle( $style_css ) . "\n";
        }
 
        /**
@@ -3414,49 +3409,43 @@ $templates
                $this->getSkin()->setupSkinUserCss( $this );
 
                // Add ResourceLoader styles
-               // Split the styles into four groups
+               // Split the styles into these groups
                $styles = array( 'other' => array(), 'user' => array(), 'site' => array(), 'private' => array(), 'noscript' => array() );
+               $links = array();
                $otherTags = ''; // Tags to append after the normal <link> tags
                $resourceLoader = $this->getResourceLoader();
 
                $moduleStyles = $this->getModuleStyles();
 
                // Per-site custom styles
-               if ( $wgUseSiteCss ) {
-                       $moduleStyles[] = 'site';
-                       $moduleStyles[] = 'noscript';
-                       if ( $this->getUser()->isLoggedIn() ) {
-                               $moduleStyles[] = 'user.groups';
-                       }
-               }
+               $moduleStyles[] = 'site';
+               $moduleStyles[] = 'noscript';
+               $moduleStyles[] = 'user.groups';
 
                // Per-user custom styles
-               if ( $wgAllowUserCss ) {
-                       if ( $this->getTitle()->isCssSubpage() && $this->userCanPreview() ) {
-                               // We're on a preview of a CSS subpage
-                               // Exclude this page from the user module in case it's in there (bug 26283)
-                               $otherTags .= $this->makeResourceLoaderLink( 'user', ResourceLoaderModule::TYPE_STYLES, false,
-                                       array( 'excludepage' => $this->getTitle()->getPrefixedDBkey() )
-                               );
-
-                               // Load the previewed CSS
-                               // If needed, Janus it first. This is user-supplied CSS, so it's
-                               // assumed to be right for the content language directionality.
-                               $previewedCSS = $this->getRequest()->getText( 'wpTextbox1' );
-                               if ( $this->getLanguage()->getDir() !== $wgContLang->getDir() ) {
-                                       $previewedCSS = CSSJanus::transform( $previewedCSS, true, false );
-                               }
-                               $otherTags .= Html::inlineStyle( $previewedCSS );
-                       } else {
-                               // Load the user styles normally
-                               $moduleStyles[] = 'user';
+               if ( $wgAllowUserCss && $this->getTitle()->isCssSubpage() && $this->userCanPreview() ) {
+                       // We're on a preview of a CSS subpage
+                       // Exclude this page from the user module in case it's in there (bug 26283)
+                       $link = $this->makeResourceLoaderLink( 'user', ResourceLoaderModule::TYPE_STYLES, false,
+                               array( 'excludepage' => $this->getTitle()->getPrefixedDBkey() )
+                       );
+                       $otherTags .= $link['html'];
+
+                       // Load the previewed CSS
+                       // If needed, Janus it first. This is user-supplied CSS, so it's
+                       // assumed to be right for the content language directionality.
+                       $previewedCSS = $this->getRequest()->getText( 'wpTextbox1' );
+                       if ( $this->getLanguage()->getDir() !== $wgContLang->getDir() ) {
+                               $previewedCSS = CSSJanus::transform( $previewedCSS, true, false );
                        }
+                       $otherTags .= Html::inlineStyle( $previewedCSS ) . "\n";
+               } else {
+                       // Load the user styles normally
+                       $moduleStyles[] = 'user';
                }
 
                // Per-user preference styles
-               if ( $wgAllowUserCssPrefs ) {
-                       $moduleStyles[] = 'user.cssprefs';
-               }
+               $moduleStyles[] = 'user.cssprefs';
 
                foreach ( $moduleStyles as $name ) {
                        $module = $resourceLoader->getModule( $name );
@@ -3464,38 +3453,37 @@ $templates
                                continue;
                        }
                        $group = $module->getGroup();
-                       // Modules in groups named "other" or anything different than "user", "site" or "private"
+                       // Modules in groups different than the ones listed on top (see $styles assignment)
                        // will be placed in the "other" group
-                       $styles[isset( $styles[$group] ) ? $group : 'other'][] = $name;
+                       $styles[ isset( $styles[$group] ) ? $group : 'other' ][] = $name;
                }
 
                // We want site, private and user styles to override dynamically added styles from modules, but we want
                // dynamically added styles to override statically added styles from other modules. So the order
                // has to be other, dynamic, site, private, user
                // Add statically added styles for other modules
-               $ret = $this->makeResourceLoaderLink( $styles['other'], ResourceLoaderModule::TYPE_STYLES );
+               $links[] = $this->makeResourceLoaderLink( $styles['other'], ResourceLoaderModule::TYPE_STYLES );
                // Add normal styles added through addStyle()/addInlineStyle() here
-               $ret .= implode( "\n", $this->buildCssLinksArray() ) . $this->mInlineStyles;
+               $links[] = implode( "\n", $this->buildCssLinksArray() ) . $this->mInlineStyles;
                // Add marker tag to mark the place where the client-side loader should inject dynamic styles
                // We use a <meta> tag with a made-up name for this because that's valid HTML
-               $ret .= Html::element( 'meta', array( 'name' => 'ResourceLoaderDynamicStyles', 'content' => '' ) ) . "\n";
+               $links[] = Html::element( 'meta', array( 'name' => 'ResourceLoaderDynamicStyles', 'content' => '' ) ) . "\n";
 
                // Add site, private and user styles
                // 'private' at present only contains user.options, so put that before 'user'
                // Any future private modules will likely have a similar user-specific character
                foreach ( array( 'site', 'noscript', 'private', 'user' ) as $group ) {
-                       $ret .= $this->makeResourceLoaderLink( $styles[$group],
-                                       ResourceLoaderModule::TYPE_STYLES
+                       $links[] = $this->makeResourceLoaderLink( $styles[$group],
+                               ResourceLoaderModule::TYPE_STYLES
                        );
                }
 
                // Add stuff in $otherTags (previewed user CSS if applicable)
-               $ret .= $otherTags;
-               return $ret;
+               return self::getHtmlFromLoaderLinks( $links ) . $otherTags;
        }
 
        /**
-        * @return Array
+        * @return array
         */
        public function buildCssLinksArray() {
                $links = array();
@@ -3519,9 +3507,8 @@ $templates
         * Generate \<link\> tags for stylesheets
         *
         * @param string $style URL to the file
-        * @param array $options option, can contain 'condition', 'dir', 'media'
-        *                 keys
-        * @return String: HTML fragment
+        * @param array $options Option, can contain 'condition', 'dir', 'media' keys
+        * @return string HTML fragment
         */
        protected function styleLink( $style, $options ) {
                if ( isset( $options['dir'] ) ) {
@@ -3560,8 +3547,8 @@ $templates
        /**
         * Transform "media" attribute based on request parameters
         *
-        * @param string $media current value of the "media" attribute
-        * @return String: modified value of the "media" attribute, or null to skip
+        * @param string $media Current value of the "media" attribute
+        * @return string Modified value of the "media" attribute, or null to skip
         * this stylesheet
         */
        public static function transformCssMedia( $media ) {
@@ -3617,8 +3604,8 @@ $templates
         * Like addWikiMsg() except the parameters are taken as an array
         * instead of a variable argument list.
         *
-        * @param $name string
-        * @param $args array
+        * @param string $name
+        * @param array $args
         */
        public function addWikiMsgArray( $name, $args ) {
                $this->addHTML( $this->msg( $name, $args )->parseAsBlock() );
@@ -3645,7 +3632,7 @@ $templates
         *
         * The newline after opening div is needed in some wikitext. See bug 19226.
         *
-        * @param $wrap string
+        * @param string $wrap
         */
        public function wrapWikiMsg( $wrap /*, ...*/ ) {
                $msgSpecs = func_get_args();
@@ -3676,8 +3663,8 @@ $templates
         * Include jQuery core. Use this to avoid loading it multiple times
         * before we get a usable script loader.
         *
-        * @param array $modules list of jQuery modules which should be loaded
-        * @return Array: the list of modules which were not loaded.
+        * @param array $modules List of jQuery modules which should be loaded
+        * @return array The list of modules which were not loaded.
         * @since 1.16
         * @deprecated since 1.17
         */
index 60aa33c..9b5373b 100644 (file)
@@ -38,7 +38,7 @@
  * version are hardcoded here
  */
 function wfPHPVersionError( $type ) {
-       $mwVersion = '1.23';
+       $mwVersion = '1.24';
        $minimumVersionPHP = '5.3.2';
 
        $phpVersion = phpversion();
index 2d1529d..1825cce 100644 (file)
@@ -84,8 +84,8 @@ class Preferences {
 
                self::profilePreferences( $user, $context, $defaultPreferences );
                self::skinPreferences( $user, $context, $defaultPreferences );
-               self::filesPreferences( $user, $context, $defaultPreferences );
                self::datetimePreferences( $user, $context, $defaultPreferences );
+               self::filesPreferences( $user, $context, $defaultPreferences );
                self::renderingPreferences( $user, $context, $defaultPreferences );
                self::editingPreferences( $user, $context, $defaultPreferences );
                self::rcPreferences( $user, $context, $defaultPreferences );
@@ -309,7 +309,7 @@ class Preferences {
                                'section' => 'personal/info',
                        );
                }
-               // Only show preferhttps if secure login is turned on
+               // Only show prefershttps if secure login is turned on
                if ( $wgSecureLogin && wfCanIPUseHTTPS( $context->getRequest()->getIP() ) ) {
                        $defaultPreferences['prefershttps'] = array(
                                'type' => 'toggle',
@@ -648,7 +648,7 @@ class Preferences {
                                'type' => 'radio',
                                'options' => $dateOptions,
                                'label' => '&#160;',
-                               'section' => 'datetime/dateformat',
+                               'section' => 'rendering/dateformat',
                        );
                }
 
@@ -665,7 +665,7 @@ class Preferences {
                        'raw' => 1,
                        'label-message' => 'servertime',
                        'default' => $nowserver,
-                       'section' => 'datetime/timeoffset',
+                       'section' => 'rendering/timeoffset',
                );
 
                $defaultPreferences['nowlocal'] = array(
@@ -673,7 +673,7 @@ class Preferences {
                        'raw' => 1,
                        'label-message' => 'localtime',
                        'default' => $nowlocal,
-                       'section' => 'datetime/timeoffset',
+                       'section' => 'rendering/timeoffset',
                );
 
                // Grab existing pref.
@@ -703,7 +703,7 @@ class Preferences {
                        'options' => $tzOptions,
                        'default' => $tzSetting,
                        'size' => 20,
-                       'section' => 'datetime/timeoffset',
+                       'section' => 'rendering/timeoffset',
                );
        }
 
@@ -1065,9 +1065,8 @@ class Preferences {
                $mptitle = Title::newMainPage();
                $previewtext = $context->msg( 'skin-preview' )->text();
 
-               # Only show members of Skin::getSkinNames() rather than
-               # $skinNames (skins is all skin names from Language.php)
-               $validSkinNames = Skin::getUsableSkins();
+               # Only show skins that aren't disabled in $wgSkipSkins
+               $validSkinNames = Skin::getAllowedSkins();
 
                # Sort by UI skin name. First though need to update validSkinNames as sometimes
                # the skinkey & UI skinname differ (e.g. "standard" skinkey is "Classic" in the UI).
index 780cae5..a9179eb 100644 (file)
  *
  * @ingroup Search
  */
-class PrefixSearch {
+abstract class PrefixSearch {
        /**
         * Do a prefix search of titles and return a list of matching page names.
+        * @deprecated: Since 1.23, use TitlePrefixSearch or StringPrefixSearch classes
         *
         * @param $search String
         * @param $limit Integer
@@ -36,11 +37,24 @@ class PrefixSearch {
         * @return Array of strings
         */
        public static function titleSearch( $search, $limit, $namespaces = array() ) {
+               $prefixSearch = new StringPrefixSearch;
+               return $prefixSearch->search( $search, $limit, $namespaces );
+       }
+
+       /**
+        * Do a prefix search of titles and return a list of matching page names.
+        *
+        * @param $search String
+        * @param $limit Integer
+        * @param array $namespaces used if query is not explicitly prefixed
+        * @return Array of strings or Title objects
+        */
+       public function search( $search, $limit, $namespaces = array() ) {
                $search = trim( $search );
                if ( $search == '' ) {
                        return array(); // Return empty result
                }
-               $namespaces = self::validateNamespaces( $namespaces );
+               $namespaces = $this->validateNamespaces( $namespaces );
 
                // Find a Title which is not an interwiki and is in NS_MAIN
                $title = Title::newFromText( $search );
@@ -49,7 +63,7 @@ class PrefixSearch {
                        if ( $ns[0] == NS_MAIN ) {
                                $ns = $namespaces; // no explicit prefix, use default namespaces
                        }
-                       return self::searchBackend(
+                       return $this->searchBackend(
                                $ns, $title->getText(), $limit );
                }
 
@@ -57,14 +71,68 @@ class PrefixSearch {
                $title = Title::newFromText( $search . 'Dummy' );
                if ( $title && $title->getText() == 'Dummy'
                        && $title->getNamespace() != NS_MAIN
-                       && !$title->isExternal() ) {
-                       return self::searchBackend(
-                               array( $title->getNamespace() ), '', $limit );
+                       && !$title->isExternal() )
+               {
+                       $namespaces = array( $title->getNamespace() );
+                       $search = '';
                }
 
-               return self::searchBackend( $namespaces, $search, $limit );
+               return $this->searchBackend( $namespaces, $search, $limit );
+       }
+
+       /**
+        * Do a prefix search for all possible variants of the prefix
+        * @param $search String
+        * @param $limit Integer
+        * @param array $namespaces
+        *
+        * @return array
+        */
+       public function searchWithVariants( $search, $limit, array $namespaces ) {
+               wfProfileIn( __METHOD__ );
+               $searches = $this->search( $search, $limit, $namespaces );
+
+               // if the content language has variants, try to retrieve fallback results
+               $fallbackLimit = $limit - count( $searches );
+               if ( $fallbackLimit > 0 ) {
+                       global $wgContLang;
+
+                       $fallbackSearches = $wgContLang->autoConvertToAllVariants( $search );
+                       $fallbackSearches = array_diff( array_unique( $fallbackSearches ), array( $search ) );
+
+                       foreach ( $fallbackSearches as $fbs ) {
+                               $fallbackSearchResult = $this->search( $fbs, $fallbackLimit, $namespaces );
+                               $searches = array_merge( $searches, $fallbackSearchResult );
+                               $fallbackLimit -= count( $fallbackSearchResult );
+
+                               if ( $fallbackLimit == 0 ) {
+                                       break;
+                               }
+                       }
+               }
+               wfProfileOut( __METHOD__ );
+               return $searches;
        }
 
+       /**
+        * When implemented in a descendant class, receives an array of Title objects and returns
+        * either an unmodified array or an array of strings corresponding to titles passed to it.
+        *
+        * @param array $titles
+        * @return array
+        */
+       protected abstract function titles( array $titles );
+
+       /**
+        * When implemented in a descendant class, receives an array of titles as strings and returns
+        * either an unmodified array or an array of Title objects corresponding to strings received.
+        *
+        * @param array $strings
+        *
+        * @return array
+        */
+       protected abstract function strings( array $strings );
+
        /**
         * Do a prefix search of titles and return a list of matching page names.
         * @param $namespaces Array
@@ -72,20 +140,20 @@ class PrefixSearch {
         * @param $limit Integer
         * @return Array of strings
         */
-       protected static function searchBackend( $namespaces, $search, $limit ) {
+       protected function searchBackend( $namespaces, $search, $limit ) {
                if ( count( $namespaces ) == 1 ) {
                        $ns = $namespaces[0];
                        if ( $ns == NS_MEDIA ) {
                                $namespaces = array( NS_FILE );
                        } elseif ( $ns == NS_SPECIAL ) {
-                               return self::specialSearch( $search, $limit );
+                               return $this->titles( $this->specialSearch( $search, $limit ) );
                        }
                }
                $srchres = array();
                if ( wfRunHooks( 'PrefixSearchBackend', array( $namespaces, $search, $limit, &$srchres ) ) ) {
-                       return self::defaultSearchBackend( $namespaces, $search, $limit );
+                       return $this->titles( $this->defaultSearchBackend( $namespaces, $search, $limit ) );
                }
-               return $srchres;
+               return $this->strings( $srchres );
        }
 
        /**
@@ -95,7 +163,7 @@ class PrefixSearch {
         * @param $limit Integer: max number of items to return
         * @return Array
         */
-       protected static function specialSearch( $search, $limit ) {
+       protected function specialSearch( $search, $limit ) {
                global $wgContLang;
 
                # normalize searchKey, so aliases with spaces can be found - bug 25675
@@ -124,13 +192,11 @@ class PrefixSearch {
                $srchres = array();
                foreach ( $keys as $pageKey => $page ) {
                        if ( $searchKey === '' || strpos( $pageKey, $searchKey ) === 0 ) {
-                               wfSuppressWarnings();
                                // bug 27671: Don't use SpecialPage::getTitleFor() here because it
                                // localizes its input leading to searches for e.g. Special:All
                                // returning Spezial:MediaWiki-Systemnachrichten and returning
                                // Spezial:Alle_Seiten twice when $wgLanguageCode == 'de'
-                               $srchres[] = Title::makeTitleSafe( NS_SPECIAL, $page )->getPrefixedText();
-                               wfRestoreWarnings();
+                               $srchres[] = Title::makeTitleSafe( NS_SPECIAL, $page );
                        }
 
                        if ( count( $srchres ) >= $limit ) {
@@ -150,38 +216,30 @@ class PrefixSearch {
         * @param array $namespaces namespaces to search in
         * @param string $search term
         * @param $limit Integer: max number of items to return
-        * @return Array of title strings
+        * @return Array of Title objects
         */
-       protected static function defaultSearchBackend( $namespaces, $search, $limit ) {
+       protected function defaultSearchBackend( $namespaces, $search, $limit ) {
                $ns = array_shift( $namespaces ); // support only one namespace
                if ( in_array( NS_MAIN, $namespaces ) ) {
                        $ns = NS_MAIN; // if searching on many always default to main
                }
 
-               // Prepare nested request
-               $req = new FauxRequest( array(
-                       'action' => 'query',
-                       'list' => 'allpages',
-                       'apnamespace' => $ns,
-                       'aplimit' => $limit,
-                       'apprefix' => $search
-               ));
-
-               // Execute
-               $module = new ApiMain( $req );
-               $module->execute();
-
-               // Get resulting data
-               $data = $module->getResultData();
-
-               // Reformat useful data for future printing by JSON engine
+               $t = Title::newFromText( $search, $ns );
+               $prefix = $t ? $t->getDBkey() : '';
+               $dbr = wfGetDB( DB_SLAVE );
+               $res = $dbr->select( 'page',
+                       array( 'page_id', 'page_namespace', 'page_title' ),
+                       array(
+                               'page_namespace' => $ns,
+                               'page_title ' . $dbr->buildLike( $prefix, $dbr->anyString() )
+                       ),
+                       __METHOD__,
+                       array( 'LIMIT' => $limit, 'ORDER BY' => 'page_title' )
+               );
                $srchres = array();
-               foreach ( (array)$data['query']['allpages'] as $pageinfo ) {
-                       // Note: this data will no be printable by the xml engine
-                       // because it does not support lists of unnamed items
-                       $srchres[] = $pageinfo['title'];
+               foreach ( $res as $row ) {
+                       $srchres[] = Title::newFromRow( $row );
                }
-
                return $srchres;
        }
 
@@ -191,7 +249,7 @@ class PrefixSearch {
         * @param $namespaces Array
         * @return Array (default: contains only NS_MAIN)
         */
-       protected static function validateNamespaces( $namespaces ) {
+       protected function validateNamespaces( $namespaces ) {
                global $wgContLang;
 
                // We will look at each given namespace against wgContLang namespaces
@@ -211,3 +269,37 @@ class PrefixSearch {
                return array( NS_MAIN );
        }
 }
+
+/**
+ * Performs prefix search, returning Title objects
+ * @ingroup Search
+ */
+class TitlePrefixSearch extends PrefixSearch {
+
+       protected function titles( array $titles ) {
+               return $titles;
+       }
+
+       protected function strings( array $strings ) {
+               $titles = array_map( 'Title::newFromText', $strings );
+               $lb = new LinkBatch( $titles );
+               $lb->setCaller( __METHOD__ );
+               $lb->execute();
+               return $titles;
+       }
+}
+
+/**
+ * Performs prefix search, returning strings
+ * @ingroup Search
+ */
+class StringPrefixSearch extends PrefixSearch {
+
+       protected function titles( array $titles ) {
+               return array_map( function( Title $t ) { return $t->getPrefixedText(); }, $titles );
+       }
+
+       protected function strings( array $strings ) {
+               return $strings;
+       }
+}
index 20c6021..b155f90 100644 (file)
@@ -1,6 +1,10 @@
 <?php
 /**
- * Include most things that's need to customize the site.
+ * Include most things that are needed to make %MediaWiki work.
+ *
+ * This file is included by WebStart.php and doMaintenance.php so that both
+ * web and maintenance scripts share a final set up phase to include necessary
+ * files and create global object variables.
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -28,12 +32,6 @@ if ( !defined( 'MEDIAWIKI' ) ) {
        exit( 1 );
 }
 
-# The main wiki script and things like database
-# conversion and maintenance scripts all share a
-# common setup of including lots of classes and
-# setting up a few globals.
-#
-
 $fname = 'Setup.php';
 wfProfileIn( $fname );
 wfProfileIn( $fname . '-defaults' );
@@ -61,8 +59,8 @@ if ( $wgArticlePath === false ) {
 }
 
 if ( !empty( $wgActionPaths ) && !isset( $wgActionPaths['view'] ) ) {
-       # 'view' is assumed the default action path everywhere in the code
-       # but is rarely filled in $wgActionPaths
+       // 'view' is assumed the default action path everywhere in the code
+       // but is rarely filled in $wgActionPaths
        $wgActionPaths['view'] = $wgArticlePath;
 }
 
@@ -249,9 +247,9 @@ foreach ( $wgForeignFileRepos as &$repo ) {
 unset( $repo ); // no global pollution; destroy reference
 
 if ( $wgRCFilterByAge ) {
-       # # Trim down $wgRCLinkDays so that it only lists links which are valid
-       # # as determined by $wgRCMaxAge.
-       # # Note that we allow 1 link higher than the max for things like 56 days but a 60 day link.
+       // Trim down $wgRCLinkDays so that it only lists links which are valid
+       // as determined by $wgRCMaxAge.
+       // Note that we allow 1 link higher than the max for things like 56 days but a 60 day link.
        sort( $wgRCLinkDays );
        for ( $i = 0; $i < count( $wgRCLinkDays ); $i++ ) {
                if ( $wgRCLinkDays[$i] >= $wgRCMaxAge / ( 3600 * 24 ) ) {
@@ -269,7 +267,7 @@ if ( $wgLocalInterwiki ) {
        array_unshift( $wgLocalInterwikis, $wgLocalInterwiki );
 }
 
-# Set default shared prefix
+// Set default shared prefix
 if ( $wgSharedPrefix === false ) {
        $wgSharedPrefix = $wgDBprefix;
 }
@@ -328,31 +326,31 @@ if ( is_array( $wgExtraNamespaces ) ) {
        $wgCanonicalNamespaceNames = $wgCanonicalNamespaceNames + $wgExtraNamespaces;
 }
 
-# These are now the same, always
-# To determine the user language, use $wgLang->getCode()
+// These are now the same, always
+// To determine the user language, use $wgLang->getCode()
 $wgContLanguageCode = $wgLanguageCode;
 
-# Easy to forget to falsify $wgShowIPinHeader for static caches.
-# If file cache or squid cache is on, just disable this (DWIMD).
-# Do the same for $wgDebugToolbar.
+// Easy to forget to falsify $wgShowIPinHeader for static caches.
+// If file cache or squid cache is on, just disable this (DWIMD).
+// Do the same for $wgDebugToolbar.
 if ( $wgUseFileCache || $wgUseSquid ) {
        $wgShowIPinHeader = false;
        $wgDebugToolbar = false;
 }
 
-# Doesn't make sense to have if disabled.
+// Doesn't make sense to have if disabled.
 if ( !$wgEnotifMinorEdits ) {
        $wgHiddenPrefs[] = 'enotifminoredits';
 }
 
-# We always output HTML5 since 1.22, overriding these is no longer supported
-# we set them here for extensions that depend on its value.
+// We always output HTML5 since 1.22, overriding these is no longer supported
+// we set them here for extensions that depend on its value.
 $wgHtml5 = true;
 $wgXhtmlDefaultNamespace = 'http://www.w3.org/1999/xhtml';
 $wgJsMimeType = 'text/javascript';
 
 if ( !$wgHtml5Version && $wgAllowRdfaAttributes ) {
-       # see http://www.w3.org/TR/rdfa-in-html/#document-conformance
+       // see http://www.w3.org/TR/rdfa-in-html/#document-conformance
        if ( $wgMimeType == 'application/xhtml+xml' ) {
                $wgHtml5Version = 'XHTML+RDFa 1.0';
        } else {
@@ -360,7 +358,7 @@ if ( !$wgHtml5Version && $wgAllowRdfaAttributes ) {
        }
 }
 
-# Blacklisted file extensions shouldn't appear on the "allowed" list
+// Blacklisted file extensions shouldn't appear on the "allowed" list
 $wgFileExtensions = array_values( array_diff ( $wgFileExtensions, $wgFileBlacklist ) );
 
 if ( $wgArticleCountMethod === null ) {
@@ -372,7 +370,7 @@ if ( $wgInvalidateCacheOnLocalSettingsChange ) {
 }
 
 if ( $wgNewUserLog ) {
-       # Add a new log type
+       // Add a new log type
        $wgLogTypes[] = 'newusers';
        $wgLogNames['newusers'] = 'newuserlogpage';
        $wgLogHeaders['newusers'] = 'newuserlogpagetext';
@@ -427,8 +425,8 @@ if ( $wgSecureLogin && substr( $wgServer, 0, 2 ) !== '//' ) {
        wfWarn( 'Secure login was enabled on a server that only supports HTTP or HTTPS. Disabling secure login.' );
 }
 
-# Now that GlobalFunctions is loaded, set defaults that depend
-# on it.
+// Now that GlobalFunctions is loaded, set defaults that depend
+// on it.
 if ( $wgTmpDirectory === false ) {
        wfProfileIn( $fname . '-tempDir' );
        $wgTmpDirectory = wfTempDir();
@@ -469,7 +467,7 @@ if ( $wgProfileOnly ) {
 wfProfileOut( $fname . '-defaults2' );
 wfProfileIn( $fname . '-misc1' );
 
-# Raise the memory limit if it's too low
+// Raise the memory limit if it's too low
 wfMemoryLimit();
 
 /**
@@ -488,13 +486,13 @@ if ( is_null( $wgLocalTZoffset ) ) {
        $wgLocalTZoffset = date( 'Z' ) / 60;
 }
 
-# Useful debug output
+// Useful debug output
 if ( $wgCommandLineMode ) {
        $wgRequest = new FauxRequest( array() );
 
        wfDebug( "\n\nStart command line script $self\n" );
 } else {
-       # Can't stub this one, it sets up $_GET and $_REQUEST in its constructor
+       // Can't stub this one, it sets up $_GET and $_REQUEST in its constructor
        $wgRequest = new WebRequest;
 
        $debug = "\n\nStart request {$wgRequest->getMethod()} {$wgRequest->getRequestURL()}\n";
@@ -523,12 +521,12 @@ wfDebugLog( 'caches', 'main: ' . get_class( $wgMemc ) .
 
 wfProfileOut( $fname . '-memcached' );
 
-# # Most of the config is out, some might want to run hooks here.
+// Most of the config is out, some might want to run hooks here.
 wfRunHooks( 'SetupAfterCache' );
 
 wfProfileIn( $fname . '-session' );
 
-# If session.auto_start is there, we can't touch session name
+// If session.auto_start is there, we can't touch session name
 if ( !wfIniGetBool( 'session.auto_start' ) ) {
        session_name( $wgSessionName ? $wgSessionName : $wgCookiePrefix . '_session' );
 }
@@ -551,7 +549,7 @@ $wgContLang->initContLang();
 
 // Now that variant lists may be available...
 $wgRequest->interpolateTitle();
-$wgUser = RequestContext::getMain()->getUser(); # BackCompat
+$wgUser = RequestContext::getMain()->getUser(); // BackCompat
 
 /**
  * @var $wgLang Language
@@ -561,7 +559,7 @@ $wgLang = new StubUserLang;
 /**
  * @var OutputPage
  */
-$wgOut = RequestContext::getMain()->getOutput(); # BackCompat
+$wgOut = RequestContext::getMain()->getOutput(); // BackCompat
 
 /**
  * @var $wgParser Parser
@@ -581,12 +579,12 @@ $wgDeferredUpdateList = array();
 wfProfileOut( $fname . '-globals' );
 wfProfileIn( $fname . '-extensions' );
 
-# Extension setup functions for extensions other than skins
-# Entries should be added to this variable during the inclusion
-# of the extension file. This allows the extension to perform
-# any necessary initialisation in the fully initialised environment
+// Extension setup functions for extensions other than skins
+// Entries should be added to this variable during the inclusion
+// of the extension file. This allows the extension to perform
+// any necessary initialisation in the fully initialised environment
 foreach ( $wgExtensionFunctions as $func ) {
-       # Allow closures in PHP 5.3+
+       // Allow closures in PHP 5.3+
        if ( is_object( $func ) && $func instanceof Closure ) {
                $profName = $fname . '-extensions-closure';
        } elseif ( is_array( $func ) ) {
index 38c3623..d4608ff 100644 (file)
@@ -92,9 +92,10 @@ abstract class Skin extends ContextSource {
         * Fetch the list of user-selectable skins in regards to $wgSkipSkins.
         * Useful for Special:Preferences and other places where you
         * only want to show skins users _can_ use.
-        * @return array of strings
+        * @return string[]
+        * @since 1.23
         */
-       public static function getUsableSkins() {
+       public static function getAllowedSkins() {
                global $wgSkipSkins;
 
                $allowedSkins = self::getSkinNames();
@@ -106,6 +107,15 @@ abstract class Skin extends ContextSource {
                return $allowedSkins;
        }
 
+       /**
+        * @deprecated since 1.23, use getAllowedSkins
+        * @return string[]
+        */
+       public static function getUsableSkins() {
+               wfDeprecated( __METHOD__, '1.23' );
+               return self::getAllowedSkins();
+       }
+
        /**
         * Normalize a skin preference value to a form that can be loaded.
         * If a skin can't be found, it will fall back to the configured
@@ -1573,14 +1583,14 @@ abstract class Skin extends ContextSource {
         * Create a section edit link.  This supersedes editSectionLink() and
         * editSectionLinkForOther().
         *
-        * @param $nt      Title  The title being linked to (may not be the same as
+        * @param $nt Title  The title being linked to (may not be the same as
         *   the current page, if the section is included from a template)
         * @param string $section The designation of the section being pointed to,
         *   to be included in the link, like "&section=$section"
         * @param string $tooltip The tooltip to use for the link: will be escaped
         *   and wrapped in the 'editsectionhint' message
-        * @param $lang    string Language code
-        * @return         string HTML to use for edit link
+        * @param $lang string Language code
+        * @return string HTML to use for edit link
         */
        public function doEditSectionLink( Title $nt, $section, $tooltip = null, $lang = false ) {
                // HTML generated here should probably have userlangattributes
index 5073913..f359a1c 100644 (file)
@@ -944,8 +944,11 @@ class SkinTemplate extends Skin {
                        $content_navigation['namespaces'][$talkId]['context'] = 'talk';
 
                        if ( $userCanRead ) {
+                               $isForeignFile = $title->inNamespace( NS_FILE ) && $this->canUseWikiPage() &&
+                                       $this->getWikiPage() instanceof WikiFilePage && !$this->getWikiPage()->isLocal();
+
                                // Adds view view link
-                               if ( $title->exists() ) {
+                               if ( $title->exists() || $isForeignFile ) {
                                        $content_navigation['views']['view'] = $this->tabAction(
                                                $isTalk ? $talkPage : $subjectPage,
                                                array( "$skname-view-view", 'view' ),
@@ -955,6 +958,19 @@ class SkinTemplate extends Skin {
                                        $content_navigation['views']['view']['redundant'] = true;
                                }
 
+                               // If it is a non-local file, show a link to the file in its own repository
+                               if ( $isForeignFile ) {
+                                       $file = $this->getWikiPage()->getFile();
+                                       $content_navigation['views']['view-foreign'] = array(
+                                               'class' => '',
+                                               'text' => wfMessageFallback( "$skname-view-foreign", 'view-foreign' )->
+                                                       setContext( $this->getContext() )->
+                                                       params( $file->getRepo()->getDisplayName() )->text(),
+                                               'href' => $file->getDescriptionUrl(),
+                                               'primary' => false,
+                                       );
+                               }
+
                                wfProfileIn( __METHOD__ . '-edit' );
 
                                // Checks if user can edit the current page if it exists or create it otherwise
@@ -969,13 +985,16 @@ class SkinTemplate extends Skin {
                                                && ( ( $isTalk && $this->isRevisionCurrent() ) || $out->showNewSectionLink() );
                                        $section = $request->getVal( 'section' );
 
-                                       $msgKey = $title->exists() || ( $title->getNamespace() == NS_MEDIAWIKI && $title->getDefaultMessageText() !== false ) ?
-                                               'edit' : 'create';
+                                       if ( $title->exists() || ( $title->getNamespace() == NS_MEDIAWIKI && $title->getDefaultMessageText() !== false ) ) {
+                                               $msgKey = $isForeignFile ? 'edit-local' : 'edit';
+                                       } else {
+                                               $msgKey = $isForeignFile ? 'create-local' : 'create';
+                                       }
                                        $content_navigation['views']['edit'] = array(
                                                'class' => ( $isEditing && ( $section !== 'new' || !$showNewSection ) ? 'selected' : '' ) . $isTalkClass,
                                                'text' => wfMessageFallback( "$skname-view-$msgKey", $msgKey )->setContext( $this->getContext() )->text(),
                                                'href' => $title->getLocalURL( $this->editUrlOptions() ),
-                                               'primary' => true, // don't collapse this in vector
+                                               'primary' => !$isForeignFile, // don't collapse this in vector
                                        );
 
                                        // section link
index 795fd45..3573f4a 100644 (file)
@@ -41,7 +41,7 @@ class Status {
        /** @var bool */
        public $ok = true;
 
-       /** @var mixed  */
+       /** @var mixed */
        public $value;
 
        /** Counters for batch operations */
@@ -52,7 +52,7 @@ class Status {
        public $failCount = 0;
 
        /** Array to indicate which items of the batch operations were successful */
-       /** @var array  */
+       /** @var array */
        public $success = array();
 
        /** @var array */
@@ -90,8 +90,8 @@ class Status {
        /**
         * Change operation result
         *
-        * @param $ok Boolean: whether the operation completed
-        * @param $value Mixed
+        * @param bool $ok Whether the operation completed
+        * @param mixed $value
         */
        public function setResult( $ok, $value = null ) {
                $this->ok = $ok;
@@ -326,8 +326,8 @@ class Status {
        /**
         * Merge another status object into this one
         *
-        * @param $other Status Other Status object
-        * @param $overwriteValue Boolean: whether to override the "value" member
+        * @param Status $other Other Status object
+        * @param bool $overwriteValue Whether to override the "value" member
         */
        public function merge( $other, $overwriteValue = false ) {
                $this->errors = array_merge( $this->errors, $other->errors );
@@ -427,8 +427,8 @@ class Status {
         * Note, due to the lack of tools for comparing Message objects, this
         * function will not work when using a Message object as the search parameter.
         *
-        * @param $source Message|String: Message key or object to search for
-        * @param $dest Message|String: Replacement message key or object
+        * @param Message|string $source Message key or object to search for
+        * @param Message|string $dest Replacement message key or object
         * @return bool Return true if the replacement was done, false otherwise.
         */
        public function replaceMessage( $source, $dest ) {
index 995deeb..31e5868 100644 (file)
@@ -4341,9 +4341,10 @@ class Title {
         *
         * @param int|Revision $old Old revision or rev ID (first before range)
         * @param int|Revision $new New revision or rev ID (first after range)
+        * @param int|null $max Limit of Revisions to count, will be incremented to detect truncations
         * @return Int Number of revisions between these revisions.
         */
-       public function countRevisionsBetween( $old, $new ) {
+       public function countRevisionsBetween( $old, $new, $max = null ) {
                if ( !( $old instanceof Revision ) ) {
                        $old = Revision::newFromTitle( $this, (int)$old );
                }
@@ -4354,14 +4355,21 @@ class Title {
                        return 0; // nothing to compare
                }
                $dbr = wfGetDB( DB_SLAVE );
-               return (int)$dbr->selectField( 'revision', 'count(*)',
-                       array(
-                               'rev_page' => $this->getArticleID(),
-                               'rev_timestamp > ' . $dbr->addQuotes( $dbr->timestamp( $old->getTimestamp() ) ),
-                               'rev_timestamp < ' . $dbr->addQuotes( $dbr->timestamp( $new->getTimestamp() ) )
-                       ),
-                       __METHOD__
+               $conds = array(
+                       'rev_page' => $this->getArticleID(),
+                       'rev_timestamp > ' . $dbr->addQuotes( $dbr->timestamp( $old->getTimestamp() ) ),
+                       'rev_timestamp < ' . $dbr->addQuotes( $dbr->timestamp( $new->getTimestamp() ) )
                );
+               if ( $max !== null ) {
+                       $res = $dbr->select( 'revision', '1',
+                               $conds,
+                               __METHOD__,
+                               array( 'LIMIT' => $max + 1 ) // extra to detect truncation
+                       );
+                       return $res->numRows();
+               } else {
+                       return (int)$dbr->selectField( 'revision', 'count(*)', $conds, __METHOD__ );
+               }
        }
 
        /**
@@ -4916,7 +4924,7 @@ class Title {
         * they will already be wrapped in paragraphs.
         *
         * @since 1.21
-        * @param int oldid Revision ID that's being edited
+        * @param int $oldid Revision ID that's being edited
         * @return Array
         */
        public function getEditNotices( $oldid = 0 ) {
index eac9211..b67d9f4 100644 (file)
@@ -30,7 +30,7 @@
  */
 abstract class TitleArray implements Iterator {
        /**
-        * @param $res ResultWrapper A SQL result including at least page_namespace and
+        * @param ResultWrapper $res A SQL result including at least page_namespace and
         *   page_title -- also can have page_id, page_len, page_is_redirect,
         *   page_latest (if those will be used).  See Title::newFromRow.
         * @return TitleArrayFromResult
@@ -47,7 +47,7 @@ abstract class TitleArray implements Iterator {
        }
 
        /**
-        * @param $res ResultWrapper
+        * @param ResultWrapper $res
         * @return TitleArrayFromResult
         */
        protected static function newFromResult_internal( $res ) {
index b4a553f..4fcb2eb 100644 (file)
@@ -39,7 +39,7 @@ class TitleArrayFromResult extends TitleArray implements Countable {
        }
 
        /**
-        * @param $row ResultWrapper
+        * @param bool|ResultWrapper $row
         * @return void
         */
        protected function setCurrent( $row ) {
index 51fb154..7da6582 100644 (file)
@@ -22,7 +22,7 @@
 
 abstract class UserArray implements Iterator {
        /**
-        * @param $res ResultWrapper
+        * @param ResultWrapper $res
         * @return UserArrayFromResult
         */
        static function newFromResult( $res ) {
@@ -37,7 +37,7 @@ abstract class UserArray implements Iterator {
        }
 
        /**
-        * @param $ids array
+        * @param array $ids
         * @return UserArrayFromResult
         */
        static function newFromIDs( $ids ) {
@@ -57,7 +57,7 @@ abstract class UserArray implements Iterator {
        }
 
        /**
-        * @param $res
+        * @param ResultWrapper $res
         * @return UserArrayFromResult
         */
        protected static function newFromResult_internal( $res ) {
index 5d5859d..0012b44 100644 (file)
@@ -29,7 +29,7 @@ class UserArrayFromResult extends UserArray implements Countable {
        var $key, $current;
 
        /**
-        * @param $res ResultWrapper
+        * @param ResultWrapper $res
         */
        function __construct( $res ) {
                $this->res = $res;
@@ -38,7 +38,7 @@ class UserArrayFromResult extends UserArray implements Countable {
        }
 
        /**
-        * @param  $row
+        * @param bool|stdClass $row
         * @return void
         */
        protected function setCurrent( $row ) {
index a3dadd0..75efce5 100644 (file)
 class WebResponse {
 
        /**
-        * Output a HTTP header, wrapper for PHP's
-        * header()
+        * Output a HTTP header, wrapper for PHP's header()
         * @param string $string header to output
         * @param bool $replace replace current similar header
-        * @param $http_response_code null|int Forces the HTTP response code to the specified value.
+        * @param null|int $http_response_code Forces the HTTP response code to the specified value.
         */
        public function header( $string, $replace = true, $http_response_code = null ) {
                header( $string, $replace, $http_response_code );
@@ -126,7 +125,7 @@ class FauxResponse extends WebResponse {
         * Stores a HTTP header
         * @param string $string header to output
         * @param bool $replace replace current similar header
-        * @param $http_response_code null|int Forces the HTTP response code to the specified value.
+        * @param null|int $http_response_code Forces the HTTP response code to the specified value.
         */
        public function header( $string, $replace = true, $http_response_code = null ) {
                if ( substr( $string, 0, 5 ) == 'HTTP/' ) {
@@ -163,7 +162,7 @@ class FauxResponse extends WebResponse {
        /**
         * Get the HTTP response code, null if not set
         *
-        * @return Int or null
+        * @return int|null
         */
        public function getStatusCode() {
                return $this->code;
@@ -182,7 +181,7 @@ class FauxResponse extends WebResponse {
        }
 
        /**
-        * @param $name string
+        * @param string $name
         * @return string
         */
        public function getcookie( $name ) {
index 6cf718c..297041b 100644 (file)
@@ -444,7 +444,15 @@ class MediaWiki {
        public function run() {
                try {
                        $this->checkMaxLag();
-                       $this->main();
+                       try {
+                               $this->main();
+                       } catch ( ErrorPageError $e ) {
+                               // Bug 62091: while exceptions are convenient to bubble up GUI errors,
+                               // they are not internal application faults. As with normal requests, this
+                               // should commit, print the output, do deferred updates, jobs, and profiling.
+                               wfGetLBFactory()->commitMasterChanges();
+                               $e->report(); // display the GUI error
+                       }
                        if ( function_exists( 'fastcgi_finish_request' ) ) {
                                fastcgi_finish_request();
                        }
@@ -624,7 +632,7 @@ class MediaWiki {
         * the socket once it's done.
         */
        protected function triggerJobs() {
-               global $wgJobRunRate, $wgServer;
+               global $wgJobRunRate, $wgServer, $wgRunJobsAsync;
 
                if ( $wgJobRunRate <= 0 || wfReadOnly() ) {
                        return;
@@ -644,6 +652,22 @@ class MediaWiki {
                        $n = intval( $wgJobRunRate );
                }
 
+               if ( !$wgRunJobsAsync ) {
+                       // If running jobs asynchronously has been disabled, run the job here
+                       // while the user waits
+                       SpecialRunJobs::executeJobs( $n );
+                       return;
+               }
+
+               try {
+                       if ( !JobQueueGroup::singleton()->queuesHaveJobs( JobQueueGroup::TYPE_DEFAULT ) ) {
+                               return; // do not send request if there are probably no jobs
+                       }
+               } catch ( JobQueueError $e ) {
+                       MWExceptionHandler::logException( $e );
+                       return; // do not make the site unavailable
+               }
+
                $query = array( 'title' => 'Special:RunJobs',
                        'tasks' => 'jobs', 'maxjobs' => $n, 'sigexpiry' => time() + 5 );
                $query['signature'] = SpecialRunJobs::getQuerySignature( $query );
index 3e8a1ce..44f0599 100644 (file)
@@ -47,7 +47,7 @@ class WikiFilePage extends WikiPage {
        }
 
        /**
-        * @param $file File:
+        * @param File $file
         */
        public function setFile( $file ) {
                $this->mFile = $file;
index 18409b0..a5d66df 100644 (file)
@@ -1812,56 +1812,62 @@ class WikiPage implements Page, IDBAccessObject {
                                }
 
                                $dbw->begin( __METHOD__ );
+                               try {
 
-                               $prepStatus = $content->prepareSave( $this, $flags, $baseRevId, $user );
-                               $status->merge( $prepStatus );
+                                       $prepStatus = $content->prepareSave( $this, $flags, $baseRevId, $user );
+                                       $status->merge( $prepStatus );
 
-                               if ( !$status->isOK() ) {
-                                       $dbw->rollback( __METHOD__ );
+                                       if ( !$status->isOK() ) {
+                                               $dbw->rollback( __METHOD__ );
 
-                                       wfProfileOut( __METHOD__ );
-                                       return $status;
-                               }
+                                               wfProfileOut( __METHOD__ );
+                                               return $status;
+                                       }
+                                       $revisionId = $revision->insertOn( $dbw );
 
-                               $revisionId = $revision->insertOn( $dbw );
+                                       // Update page
+                                       //
+                                       // Note that we use $this->mLatest instead of fetching a value from the master DB
+                                       // during the course of this function. This makes sure that EditPage can detect
+                                       // edit conflicts reliably, either by $ok here, or by $article->getTimestamp()
+                                       // before this function is called. A previous function used a separate query, this
+                                       // creates a window where concurrent edits can cause an ignored edit conflict.
+                                       $ok = $this->updateRevisionOn( $dbw, $revision, $oldid, $oldIsRedirect );
 
-                               // Update page
-                               //
-                               // Note that we use $this->mLatest instead of fetching a value from the master DB
-                               // during the course of this function. This makes sure that EditPage can detect
-                               // edit conflicts reliably, either by $ok here, or by $article->getTimestamp()
-                               // before this function is called. A previous function used a separate query, this
-                               // creates a window where concurrent edits can cause an ignored edit conflict.
-                               $ok = $this->updateRevisionOn( $dbw, $revision, $oldid, $oldIsRedirect );
+                                       if ( !$ok ) {
+                                               // Belated edit conflict! Run away!!
+                                               $status->fatal( 'edit-conflict' );
 
-                               if ( !$ok ) {
-                                       // Belated edit conflict! Run away!!
-                                       $status->fatal( 'edit-conflict' );
+                                               $dbw->rollback( __METHOD__ );
 
-                                       $dbw->rollback( __METHOD__ );
-
-                                       wfProfileOut( __METHOD__ );
-                                       return $status;
-                               }
+                                               wfProfileOut( __METHOD__ );
+                                               return $status;
+                                       }
 
-                               wfRunHooks( 'NewRevisionFromEditComplete', array( $this, $revision, $baseRevId, $user ) );
-                               // Update recentchanges
-                               if ( !( $flags & EDIT_SUPPRESS_RC ) ) {
-                                       // Mark as patrolled if the user can do so
-                                       $patrolled = $wgUseRCPatrol && !count(
+                                       wfRunHooks( 'NewRevisionFromEditComplete', array( $this, $revision, $baseRevId, $user ) );
+                                       // Update recentchanges
+                                       if ( !( $flags & EDIT_SUPPRESS_RC ) ) {
+                                               // Mark as patrolled if the user can do so
+                                               $patrolled = $wgUseRCPatrol && !count(
                                                $this->mTitle->getUserPermissionsErrors( 'autopatrol', $user ) );
-                                       // Add RC row to the DB
-                                       $rc = RecentChange::notifyEdit( $now, $this->mTitle, $isminor, $user, $summary,
-                                               $oldid, $this->getTimestamp(), $bot, '', $oldsize, $newsize,
-                                               $revisionId, $patrolled
-                                       );
+                                               // Add RC row to the DB
+                                               $rc = RecentChange::notifyEdit( $now, $this->mTitle, $isminor, $user, $summary,
+                                                       $oldid, $this->getTimestamp(), $bot, '', $oldsize, $newsize,
+                                                       $revisionId, $patrolled
+                                               );
 
-                                       // Log auto-patrolled edits
-                                       if ( $patrolled ) {
-                                               PatrolLog::record( $rc, true, $user );
+                                               // Log auto-patrolled edits
+                                               if ( $patrolled ) {
+                                                       PatrolLog::record( $rc, true, $user );
+                                               }
                                        }
+                                       $user->incEditCount();
+                               } catch ( MWException $e ) {
+                                       $dbw->rollback( __METHOD__ );
+                                       // Question: Would it perhaps be better if this method turned all
+                                       // exceptions into $status's?
+                                       throw $e;
                                }
-                               $user->incEditCount();
                                $dbw->commit( __METHOD__ );
                        } else {
                                // Bug 32948: revision ID must be set to page {{REVISIONID}} and
@@ -1891,74 +1897,80 @@ class WikiPage implements Page, IDBAccessObject {
                        $status->value['new'] = true;
 
                        $dbw->begin( __METHOD__ );
+                       try {
 
-                       $prepStatus = $content->prepareSave( $this, $flags, $baseRevId, $user );
-                       $status->merge( $prepStatus );
+                               $prepStatus = $content->prepareSave( $this, $flags, $baseRevId, $user );
+                               $status->merge( $prepStatus );
 
-                       if ( !$status->isOK() ) {
-                               $dbw->rollback( __METHOD__ );
+                               if ( !$status->isOK() ) {
+                                       $dbw->rollback( __METHOD__ );
 
-                               wfProfileOut( __METHOD__ );
-                               return $status;
-                       }
+                                       wfProfileOut( __METHOD__ );
+                                       return $status;
+                               }
 
-                       $status->merge( $prepStatus );
+                               $status->merge( $prepStatus );
 
-                       // Add the page record; stake our claim on this title!
-                       // This will return false if the article already exists
-                       $newid = $this->insertOn( $dbw );
+                               // Add the page record; stake our claim on this title!
+                               // This will return false if the article already exists
+                               $newid = $this->insertOn( $dbw );
 
-                       if ( $newid === false ) {
-                               $dbw->rollback( __METHOD__ );
-                               $status->fatal( 'edit-already-exists' );
+                               if ( $newid === false ) {
+                                       $dbw->rollback( __METHOD__ );
+                                       $status->fatal( 'edit-already-exists' );
 
-                               wfProfileOut( __METHOD__ );
-                               return $status;
-                       }
+                                       wfProfileOut( __METHOD__ );
+                                       return $status;
+                               }
 
-                       // Save the revision text...
-                       $revision = new Revision( array(
-                               'page'       => $newid,
-                               'title'      => $this->getTitle(), // for determining the default content model
-                               'comment'    => $summary,
-                               'minor_edit' => $isminor,
-                               'text'       => $serialized,
-                               'len'        => $newsize,
-                               'user'       => $user->getId(),
-                               'user_text'  => $user->getName(),
-                               'timestamp'  => $now,
-                               'content_model' => $content->getModel(),
-                               'content_format' => $serialisation_format,
-                       ) );
-                       $revisionId = $revision->insertOn( $dbw );
+                               // Save the revision text...
+                               $revision = new Revision( array(
+                                       'page'       => $newid,
+                                       'title'      => $this->getTitle(), // for determining the default content model
+                                       'comment'    => $summary,
+                                       'minor_edit' => $isminor,
+                                       'text'       => $serialized,
+                                       'len'        => $newsize,
+                                       'user'       => $user->getId(),
+                                       'user_text'  => $user->getName(),
+                                       'timestamp'  => $now,
+                                       'content_model' => $content->getModel(),
+                                       'content_format' => $serialisation_format,
+                               ) );
+                               $revisionId = $revision->insertOn( $dbw );
 
-                       // Bug 37225: use accessor to get the text as Revision may trim it
-                       $content = $revision->getContent(); // sanity; get normalized version
+                               // Bug 37225: use accessor to get the text as Revision may trim it
+                               $content = $revision->getContent(); // sanity; get normalized version
 
-                       if ( $content ) {
-                               $newsize = $content->getSize();
-                       }
+                               if ( $content ) {
+                                       $newsize = $content->getSize();
+                               }
 
-                       // Update the page record with revision data
-                       $this->updateRevisionOn( $dbw, $revision, 0 );
+                               // Update the page record with revision data
+                               $this->updateRevisionOn( $dbw, $revision, 0 );
 
-                       wfRunHooks( 'NewRevisionFromEditComplete', array( $this, $revision, false, $user ) );
+                               wfRunHooks( 'NewRevisionFromEditComplete', array( $this, $revision, false, $user ) );
 
-                       // Update recentchanges
-                       if ( !( $flags & EDIT_SUPPRESS_RC ) ) {
-                               // Mark as patrolled if the user can do so
-                               $patrolled = ( $wgUseRCPatrol || $wgUseNPPatrol ) && !count(
-                                       $this->mTitle->getUserPermissionsErrors( 'autopatrol', $user ) );
-                               // Add RC row to the DB
-                               $rc = RecentChange::notifyNew( $now, $this->mTitle, $isminor, $user, $summary, $bot,
-                                       '', $newsize, $revisionId, $patrolled );
+                               // Update recentchanges
+                               if ( !( $flags & EDIT_SUPPRESS_RC ) ) {
+                                       // Mark as patrolled if the user can do so
+                                       $patrolled = ( $wgUseRCPatrol || $wgUseNPPatrol ) && !count(
+                                               $this->mTitle->getUserPermissionsErrors( 'autopatrol', $user ) );
+                                       // Add RC row to the DB
+                                       $rc = RecentChange::notifyNew( $now, $this->mTitle, $isminor, $user, $summary, $bot,
+                                               '', $newsize, $revisionId, $patrolled );
 
-                               // Log auto-patrolled edits
-                               if ( $patrolled ) {
-                                       PatrolLog::record( $rc, true, $user );
+                                       // Log auto-patrolled edits
+                                       if ( $patrolled ) {
+                                               PatrolLog::record( $rc, true, $user );
+                                       }
                                }
+                               $user->incEditCount();
+
+                       } catch ( MWException $e ) {
+                               $dbw->rollback( __METHOD__ );
+                               throw $e;
                        }
-                       $user->incEditCount();
                        $dbw->commit( __METHOD__ );
 
                        // Update links, etc.
index 45441fd..3b82c64 100644 (file)
@@ -901,7 +901,7 @@ class XmlSelect {
         * label => value
         * label => ( label => value, label => value )
         *
-        * @param  $options
+        * @param $options
         */
        public function addOptions( $options ) {
                $this->options[] = $options;
@@ -912,7 +912,7 @@ class XmlSelect {
         * label => value
         * label => ( label => value, label => value )
         *
-        * @param  $options
+        * @param $options
         * @param bool $default
         * @return string
         */
index 3067b1a..651b114 100644 (file)
@@ -3198,8 +3198,8 @@ $zh2Hant = array(
 '不干她' => '不干她',
 '不干它' => '不干它',
 '不干我' => '不干我',
-'不干扰' => '不干擾',
 '不干擾' => '不干擾',
+'不干扰' => '不干擾',
 '不干涉' => '不干涉',
 '不干牠' => '不干牠',
 '不干犯' => '不干犯',
@@ -3220,12 +3220,13 @@ $zh2Hant = array(
 '不负所托' => '不負所托',
 '不通吊庆' => '不通弔慶',
 '不丑' => '不醜',
-'不采聲' => '不采聲',
 '不采声' => '不采聲',
+'不采聲' => '不采聲',
 '不锈钢' => '不鏽鋼',
 '不食干腊' => '不食乾腊',
 '不斗' => '不鬥',
 '丑三' => '丑三',
+'丑婆子' => '丑婆子',
 '丑年' => '丑年',
 '丑日' => '丑日',
 '丑旦' => '丑旦',
@@ -3263,21 +3264,23 @@ $zh2Hant = array(
 '中签' => '中籤',
 '中美发表' => '中美發表',
 '中药' => '中藥',
+'中西合并' => '中西合併',
 '中风后' => '中風後',
-'丰仪' => '丰儀',
 '丰儀' => '丰儀',
+'丰仪' => '丰儀',
 '丰南' => '丰南',
 '丰台' => '丰台',
 '丰姿' => '丰姿',
 '丰容' => '丰容',
+'丰度' => '丰度',
 '丰情' => '丰情',
 '丰标' => '丰標',
-'丰标不凡' => '丰標不凡',
 '丰標不凡' => '丰標不凡',
+'丰标不凡' => '丰標不凡',
 '丰神' => '丰神',
 '丰茸' => '丰茸',
 '丰采' => '丰采',
-'丰é\9fµ' => '丰é\9fµ',
+'丰é\9fµ' => '丰é\9f»',
 '丰韻' => '丰韻',
 '丸药' => '丸藥',
 '丹药' => '丹藥',
@@ -3309,17 +3312,15 @@ $zh2Hant = array(
 '九扎' => '九紮',
 '九只' => '九隻',
 '九余' => '九餘',
-'九龍表行' => '九龍表行',
 '九龙表行' => '九龍表行',
+'九龍表行' => '九龍表行',
 '也克制' => '也剋制',
 '也斗了胆' => '也斗了膽',
-'干上' => '乾上',
 '干干' => '乾乾',
 '干干儿的' => '乾乾兒的',
 '干干净净' => '乾乾淨淨',
-'干了' => '乾了',
 '干井' => '乾井',
-'干个' => '乾個',
+'干个够' => '乾個夠',
 '干儿' => '乾兒',
 '干冰' => '乾冰',
 '干冷' => '乾冷',
@@ -3356,12 +3357,10 @@ $zh2Hant = array(
 '干巴' => '乾巴',
 '干式' => '乾式',
 '干弟' => '乾弟',
-'干得' => '乾得',
 '干急' => '乾急',
 '干性' => '乾性',
 '干打雷' => '乾打雷',
 '干折' => '乾折',
-'干掉' => '乾掉',
 '干撂台' => '乾撂台',
 '干撇下' => '乾撇下',
 '干擦' => '乾擦',
@@ -3447,8 +3446,8 @@ $zh2Hant = array(
 '干衣' => '乾衣',
 '干裂' => '乾裂',
 '干亲' => '乾親',
-'乾象曆' => '乾象曆',
 '乾象历' => '乾象曆',
+'乾象曆' => '乾象曆',
 '干贝' => '乾貝',
 '干货' => '乾貨',
 '干躁' => '乾躁',
@@ -3497,8 +3496,8 @@ $zh2Hant = array(
 '二缶钟惑' => '二缶鐘惑',
 '二老板' => '二老板',
 '二虎相斗' => '二虎相鬥',
-'二里頭' => '二里頭',
 '二里头' => '二里頭',
+'二里頭' => '二里頭',
 '二只' => '二隻',
 '二余' => '二餘',
 '于丹' => '于丹',
@@ -3510,10 +3509,10 @@ $zh2Hant = array(
 '于伟国' => '于偉國',
 '于偉國' => '于偉國',
 '于光新' => '于光新',
-'于光远' => '于光遠',
 '于光遠' => '于光遠',
-'äº\8eå\85\8b\85°å¤\9aå\8e¿' => 'äº\8eå\85\8b\98­å¤\9a縣',
+'äº\8eå\85\89è¿\9c' => 'äº\8eå\85\89é\81 ',
 '于克-蘭多縣' => '于克-蘭多縣',
+'于克-兰多县' => '于克-蘭多縣',
 '于克勒' => '于克勒',
 '于再清' => '于再清',
 '于冕' => '于冕',
@@ -3530,8 +3529,8 @@ $zh2Hant = array(
 '于吉' => '于吉',
 '于和伟' => '于和偉',
 '于品海' => '于品海',
-'于國楨' => '于國楨',
 '于国桢' => '于國楨',
+'于國楨' => '于國楨',
 '于国治' => '于國治',
 '于國治' => '于國治',
 '于坚' => '于堅',
@@ -3540,15 +3539,15 @@ $zh2Hant = array(
 '于大宝' => '于大寶',
 '于天仁' => '于天仁',
 '于天龙' => '于天龍',
-'于奇庫杜克' => '于奇庫杜克',
 '于奇库杜克' => '于奇庫杜克',
+'于奇庫杜克' => '于奇庫杜克',
 '于姓' => '于姓',
 '于娜' => '于娜',
 '于娟' => '于娟',
 '于子千' => '于子千',
 '于孔兼' => '于孔兼',
-'于学忠' => '于學忠',
 '于學忠' => '于學忠',
+'于学忠' => '于學忠',
 '于家堡' => '于家堡',
 '于寘' => '于寘',
 '于小伟' => '于小偉',
@@ -3559,16 +3558,16 @@ $zh2Hant = array(
 '于山' => '于山',
 '于山国' => '于山國',
 '于山國' => '于山國',
-'于帅' => '于帥',
 '于帥' => '于帥',
+'于帅' => '于帥',
 '于幼軍' => '于幼軍',
 '于幼军' => '于幼軍',
 '于康震' => '于康震',
-'于广洲' => '于廣洲',
 '于廣洲' => '于廣洲',
+'于广洲' => '于廣洲',
 '于式枚' => '于式枚',
-'于从濂' => '于從濂',
 '于從濂' => '于從濂',
+'于从濂' => '于從濂',
 '于德海' => '于德海',
 '于志宁' => '于志寧',
 '于志寧' => '于志寧',
@@ -3576,8 +3575,8 @@ $zh2Hant = array(
 '于思' => '于思',
 '于慎行' => '于慎行',
 '于慧' => '于慧',
-'于成龍' => '于成龍',
 '于成龙' => '于成龍',
+'于成龍' => '于成龍',
 '于振' => '于振',
 '于振武' => '于振武',
 '于敏' => '于敏',
@@ -3588,13 +3587,13 @@ $zh2Hant = array(
 '于斯納爾斯貝里' => '于斯納爾斯貝里',
 '于斯达尔' => '于斯達爾',
 '于斯達爾' => '于斯達爾',
-'于明濤' => '于明濤',
 '于明涛' => '于明濤',
+'于明濤' => '于明濤',
 '于是之' => '于是之',
 '于晨楠' => '于晨楠',
 '于晴' => '于晴',
-'于会泳' => '于會泳',
 '于會泳' => '于會泳',
+'于会泳' => '于會泳',
 '于根伟' => '于根偉',
 '于根偉' => '于根偉',
 '于格' => '于格',
@@ -3602,8 +3601,8 @@ $zh2Hant = array(
 '于枫' => '于楓',
 '于荣光' => '于榮光',
 '于樂' => '于樂',
-'于樹潔' => '于樹潔',
 '于树洁' => '于樹潔',
+'于樹潔' => '于樹潔',
 '于欣' => '于欣',
 '于欣源' => '于欣源',
 '于正升' => '于正昇',
@@ -3620,10 +3619,10 @@ $zh2Hant = array(
 '于浩威' => '于浩威',
 '于海' => '于海',
 '于海洋' => '于海洋',
-'于湘蘭' => '于湘蘭',
 '于湘兰' => '于湘蘭',
-'äº\8eæ±\89è¶\85' => 'äº\8eæ¼¢è¶\85',
+'äº\8eæ¹\98è\98­' => 'äº\8eæ¹\98è\98­',
 '于漢超' => '于漢超',
+'于汉超' => '于漢超',
 '于澄' => '于澄',
 '于泽尔' => '于澤爾',
 '于澤爾' => '于澤爾',
@@ -3632,8 +3631,8 @@ $zh2Hant = array(
 '于熙珍' => '于熙珍',
 '于爾岑' => '于爾岑',
 '于尔岑' => '于爾岑',
-'于尔根' => '于爾根',
 '于爾根' => '于爾根',
+'于尔根' => '于爾根',
 '于尔里克' => '于爾里克',
 '于爾里克' => '于爾里克',
 '于特森' => '于特森',
@@ -3646,8 +3645,8 @@ $zh2Hant = array(
 '于美人' => '于美人',
 '于耘婕' => '于耘婕',
 '于若木' => '于若木',
-'于荫霖' => '于蔭霖',
 '于蔭霖' => '于蔭霖',
+'于荫霖' => '于蔭霖',
 '于衡' => '于衡',
 '于西翰' => '于西翰',
 '于謙' => '于謙',
@@ -3655,20 +3654,20 @@ $zh2Hant = array(
 '于谨' => '于謹',
 '于貝爾' => '于貝爾',
 '于贝尔' => '于貝爾',
-'于贈' => '于贈',
 '于赠' => '于贈',
+'于贈' => '于贈',
 '于越' => '于越',
 '于军' => '于軍',
 '于軍' => '于軍',
 '于道泉' => '于道泉',
-'于遠偉' => '于遠偉',
 '于远伟' => '于遠偉',
-'äº\8eé\83½å\8e¿' => 'äº\8eé\83½ç¸£',
+'äº\8eé\81 å\81\89' => 'äº\8eé\81 å\81\89',
 '于都縣' => '于都縣',
+'于都县' => '于都縣',
 '于里察' => '于里察',
 '于阗' => '于闐',
-'于双戈' => '于雙戈',
 '于雙戈' => '于雙戈',
+'于双戈' => '于雙戈',
 '于云鹤' => '于雲鶴',
 '于震' => '于震',
 '于震寰' => '于震寰',
@@ -3681,17 +3680,17 @@ $zh2Hant = array(
 '于风政' => '于風政',
 '于風政' => '于風政',
 '于飞' => '于飛',
-'于飛島' => '于飛島',
 '于飞岛' => '于飛島',
+'于飛島' => '于飛島',
 '于余曲折' => '于餘曲折',
 '于鬯' => '于鬯',
 '于魁智' => '于魁智',
-'于鳳桐' => '于鳳桐',
 '于凤桐' => '于鳳桐',
+'于鳳桐' => '于鳳桐',
 '于凤至' => '于鳳至',
 '于鳳至' => '于鳳至',
-'于默奧' => '于默奧',
 '于默奥' => '于默奧',
+'于默奧' => '于默奧',
 '云乎' => '云乎',
 '云云' => '云云',
 '云何' => '云何',
@@ -3771,8 +3770,8 @@ $zh2Hant = array(
 '件钟' => '件鐘',
 '任何表演' => '任何表演',
 '任何表示' => '任何表示',
-'任何表达' => '任何表達',
 '任何表達' => '任何表達',
+'任何表达' => '任何表達',
 '任何表' => '任何錶',
 '任何钟' => '任何鐘',
 '任何钟表' => '任何鐘錶',
@@ -3984,8 +3983,8 @@ $zh2Hant = array(
 '占过' => '佔過',
 '占道' => '佔道',
 '占零' => '佔零',
-'占领' => '佔領',
 '占領' => '佔領',
+'占领' => '佔領',
 '占头' => '佔頭',
 '占头筹' => '佔頭籌',
 '占饭' => '佔飯',
@@ -4055,8 +4054,8 @@ $zh2Hant = array(
 '占y' => '佔y',
 '占z' => '佔z',
 '何杰' => '何杰',
-'余三勝' => '余三勝',
 '余三胜' => '余三勝',
+'余三勝' => '余三勝',
 '余光中' => '余光中',
 '余光生' => '余光生',
 '余力為' => '余力為',
@@ -4084,7 +4083,7 @@ $zh2Hant = array(
 '并到' => '併到',
 '并合' => '併合',
 '并名' => '併名',
-'并吞' => '併吞',
+'并吞下' => '併吞下',
 '并拢' => '併攏',
 '并案' => '併案',
 '并流' => '併流',
@@ -4246,8 +4245,8 @@ $zh2Hant = array(
 '凶横' => '兇橫',
 '凶殘' => '兇殘',
 '凶残' => '兇殘',
-'凶杀' => '兇殺',
 '凶殺' => '兇殺',
+'凶杀' => '兇殺',
 '凶犯' => '兇犯',
 '凶狠' => '兇狠',
 '凶猛' => '兇猛',
@@ -4264,8 +4263,8 @@ $zh2Hant = array(
 '党太尉' => '党太尉',
 '党怀英' => '党懷英',
 '党进' => '党進',
-'党项' => '党項',
 '党項' => '党項',
+'党项' => '党項',
 '内制' => '內製',
 '内面包' => '內面包',
 '内面包的' => '內面包的',
@@ -4353,8 +4352,8 @@ $zh2Hant = array(
 '准不准我' => '准不准我',
 '准不准许' => '准不准許',
 '准不准谁' => '准不准誰',
-'准保护' => '准保護',
 '准保護' => '准保護',
+'准保护' => '准保護',
 '准保释' => '准保釋',
 '准保釋' => '准保釋',
 '凌蒙初' => '凌濛初',
@@ -4410,8 +4409,8 @@ $zh2Hant = array(
 '划子' => '划子',
 '划得来' => '划得來',
 '划拳' => '划拳',
-'划槳' => '划槳',
 '划桨' => '划槳',
+'划槳' => '划槳',
 '划水' => '划水',
 '划算' => '划算',
 '划船' => '划船',
@@ -4438,6 +4437,7 @@ $zh2Hant = array(
 '利于' => '利於',
 '利欲熏心' => '利欲熏心',
 '刮来刮去' => '刮來刮去',
+'刮着' => '刮著',
 '刮起来' => '刮起來',
 '刮风下雪倒便宜' => '刮風下雪倒便宜',
 '刮胡' => '刮鬍',
@@ -4485,8 +4485,8 @@ $zh2Hant = array(
 '划入' => '劃入',
 '划为' => '劃為',
 '剧药' => '劇藥',
-'劉佳怜' => '劉佳怜',
 '刘佳怜' => '劉佳怜',
+'劉佳怜' => '劉佳怜',
 '刘克庄' => '劉克莊',
 '刘芸后' => '劉芸后',
 '力克制' => '力剋制',
@@ -4542,12 +4542,12 @@ $zh2Hant = array(
 '十出' => '十齣',
 '千个' => '千個',
 '千只可' => '千只可',
-'千只够' => '千只夠',
 '千只夠' => '千只夠',
+'千只够' => '千只夠',
 '千只怕' => '千只怕',
 '千只能' => '千只能',
-'千只足夠' => '千只足夠',
 '千只足够' => '千只足夠',
+'千只足夠' => '千只足夠',
 '千周后' => '千周後',
 '千多只' => '千多隻',
 '千天后' => '千天後',
@@ -4625,8 +4625,8 @@ $zh2Hant = array(
 '口里' => '口裡',
 '口试' => '口試',
 '口钟' => '口鐘',
-'古書云' => '古書云',
 '古书云' => '古書云',
+'古書云' => '古書云',
 '古柯咸' => '古柯鹹',
 '古柯碱' => '古柯鹼',
 '古朴' => '古樸',
@@ -4647,10 +4647,10 @@ $zh2Hant = array(
 '只要功夫深,铁杵磨成锈花针' => '只要功夫深,鐵杵磨成鏽花針',
 '只身上已' => '只身上已',
 '只身上有' => '只身上有',
-'只身上没' => '只身上沒',
 '只身上沒' => '只身上沒',
-'å\8fªèº«ä¸\8aæ\97 ' => 'å\8fªèº«ä¸\8aç\84¡',
+'å\8fªèº«ä¸\8a没' => 'å\8fªèº«ä¸\8aæ²\92',
 '只身上無' => '只身上無',
+'只身上无' => '只身上無',
 '只身上的' => '只身上的',
 '只身世' => '只身世',
 '只身份' => '只身份',
@@ -4665,8 +4665,8 @@ $zh2Hant = array(
 '只身旁' => '只身旁',
 '只身材' => '只身材',
 '只身段' => '只身段',
-'只身為' => '只身為',
 '只身为' => '只身為',
+'只身為' => '只身為',
 '只身边' => '只身邊',
 '只身邊' => '只身邊',
 '只身首' => '只身首',
@@ -4712,8 +4712,8 @@ $zh2Hant = array(
 '各辟' => '各闢',
 '各类钟' => '各類鐘',
 '合伙人' => '合伙人',
-'合并' => '合併',
 '合伙' => '合夥',
+'合并' => '合并',
 '合府上' => '合府上',
 '合采' => '合採',
 '合历' => '合曆',
@@ -4751,10 +4751,10 @@ $zh2Hant = array(
 '后丰' => '后豐',
 '后豐' => '后豐',
 '后里' => '后里',
-'后髮FK型星' => '后髮FK型星',
 '后发FK型星' => '后髮FK型星',
-'后发座' => '后髮座',
+'后髮FK型星' => '后髮FK型星',
 '后髮座' => '后髮座',
+'后发座' => '后髮座',
 '后发星系团' => '后髮星系團',
 '后髮星系團' => '后髮星系團',
 '吐哺捉发' => '吐哺捉髮',
@@ -4771,8 +4771,8 @@ $zh2Hant = array(
 '吹发' => '吹髮',
 '吹胡' => '吹鬍',
 '吾为之范我驰驱' => '吾爲之範我馳驅',
-'呂后' => '呂后',
 '吕后' => '呂后',
+'呂后' => '呂后',
 '呆呆傻傻' => '呆呆傻傻',
 '呆呆挣挣' => '呆呆掙掙',
 '呆呆獸' => '呆呆獸',
@@ -4788,8 +4788,8 @@ $zh2Hant = array(
 '周后' => '周后',
 '周四' => '周四',
 '周历' => '周曆',
-'周杰倫' => '周杰倫',
 '周杰伦' => '周杰倫',
+'周杰倫' => '周杰倫',
 '周历史' => '周歷史',
 '周庄王' => '周莊王',
 '周游' => '周遊',
@@ -4883,6 +4883,7 @@ $zh2Hant = array(
 '回历史' => '回歷史',
 '回丝' => '回絲',
 '回着' => '回著',
+'回荡' => '回蕩',
 '回游' => '回遊',
 '回阳荡气' => '回陽蕩氣',
 '因于' => '因於',
@@ -4944,9 +4945,9 @@ $zh2Hant = array(
 '埋头寻钟' => '埋頭尋鐘',
 '埋头寻钟表' => '埋頭尋鐘錶',
 '城里' => '城裡',
-'埔里社抚垦局' => '埔裏社撫墾局',
-'埔裏社撫墾局' => '埔裏社撫墾局',
 '埔裡社撫墾局' => '埔裏社撫墾局',
+'埔裏社撫墾局' => '埔裏社撫墾局',
+'埔里社抚垦局' => '埔裏社撫墾局',
 '基干' => '基幹',
 '基于' => '基於',
 '基准' => '基準',
@@ -4973,8 +4974,8 @@ $zh2Hant = array(
 '壶里' => '壺裡',
 '壸范' => '壼範',
 '寿面' => '壽麵',
-'夏于喬' => '夏于喬',
 '夏于乔' => '夏于喬',
+'夏于喬' => '夏于喬',
 '夏天里' => '夏天裡',
 '夏日里' => '夏日裡',
 '夏历' => '夏曆',
@@ -5014,6 +5015,7 @@ $zh2Hant = array(
 '伙同' => '夥同',
 '伙众' => '夥眾',
 '伙计' => '夥計',
+'大丑' => '大丑',
 '大伙儿' => '大伙兒',
 '大只可' => '大只可',
 '大只在' => '大只在',
@@ -5048,7 +5050,6 @@ $zh2Hant = array(
 '大言非夸' => '大言非夸',
 '大赞' => '大讚',
 '大周折' => '大週摺',
-'大丑' => '大醜',
 '大金发苔' => '大金髮苔',
 '大钟' => '大鐘',
 '大只' => '大隻',
@@ -5208,8 +5209,8 @@ $zh2Hant = array(
 '宽松' => '寬鬆',
 '寮采' => '寮寀',
 '宝山庄' => '寶山庄',
-'宝历' => '寶曆',
 '寶曆' => '寶曆',
+'宝历' => '寶曆',
 '宝历史' => '寶歷史',
 '宝庄' => '寶莊',
 '宝里宝气' => '寶裡寶氣',
@@ -5364,20 +5365,23 @@ $zh2Hant = array(
 '年谷' => '年穀',
 '年里' => '年裡',
 '并力' => '并力',
+'并吞' => '并吞',
 '并州' => '并州',
 '并日而食' => '并日而食',
 '并迭' => '并迭',
 '幸免于难' => '幸免於難',
 '幸于' => '幸於',
 '幸运胡' => '幸運鬍',
+'干上' => '幹上',
 '干下去' => '幹下去',
 '干不了' => '幹不了',
 '干不成' => '幹不成',
+'干了' => '幹了',
 '干事' => '幹事',
 '干些' => '幹些',
 '干人' => '幹人',
 '干什么' => '幹什麼',
-'干个够' => '幹個夠',
+'干个' => '幹個',
 '干劲' => '幹勁',
 '干劲冲天' => '幹勁沖天',
 '干吏' => '幹吏',
@@ -5389,9 +5393,10 @@ $zh2Hant = array(
 '干完' => '幹完',
 '干家' => '幹家',
 '干将' => '幹將',
-'干得了' => '幹得了',
+'干得' => '幹得',
 '干性油' => '幹性油',
 '干才' => '幹才',
+'干掉' => '幹掉',
 '干探' => '幹探',
 '干校' => '幹校',
 '干活' => '幹活',
@@ -5404,8 +5409,8 @@ $zh2Hant = array(
 '干略' => '幹略',
 '干当' => '幹當',
 '干的停当' => '幹的停當',
-'干細胞' => '幹細胞',
 '干细胞' => '幹細胞',
+'干細胞' => '幹細胞',
 '干线' => '幹線',
 '干练' => '幹練',
 '干缺' => '幹缺',
@@ -5437,8 +5442,8 @@ $zh2Hant = array(
 '府干政' => '府干政',
 '府干涉' => '府干涉',
 '府干犯' => '府干犯',
-'府干预' => '府干預',
 '府干預' => '府干預',
+'府干预' => '府干預',
 '府干' => '府幹',
 '座钟' => '座鐘',
 '康庄大道' => '康庄大道',
@@ -5746,8 +5751,8 @@ $zh2Hant = array(
 '忠人之托' => '忠人之托',
 '忠仆' => '忠僕',
 '忠于' => '忠於',
+'快干' => '快乾',
 '快克制' => '快剋制',
-'快干' => '快幹',
 '快快当当' => '快快當當',
 '快冲' => '快衝',
 '怎么' => '怎麼',
@@ -5855,8 +5860,8 @@ $zh2Hant = array(
 '所占算' => '所占算',
 '所托' => '所託',
 '扁拟谷盗虫' => '扁擬穀盜蟲',
-'手冢治虫' => '手塚治虫',
 '手塚治虫' => '手塚治虫',
+'手冢治虫' => '手塚治虫',
 '手折' => '手摺',
 '手表态' => '手表態',
 '手表明' => '手表明',
@@ -5867,8 +5872,8 @@ $zh2Hant = array(
 '手表达' => '手表達',
 '手表露' => '手表露',
 '手表面' => '手表面',
-'手里' => '手裏',
 '手里剑' => '手裏劍',
+'手里' => '手裡',
 '手表' => '手錶',
 '手松' => '手鬆',
 '才克制' => '才剋制',
@@ -6313,9 +6318,9 @@ $zh2Hant = array(
 '于国' => '於國',
 '于坏' => '於坏',
 '于垂' => '於垂',
-'於夫羅' => '於夫羅',
 '于夫罗' => '於夫羅',
 '於夫罗' => '於夫羅',
+'於夫羅' => '於夫羅',
 '于她' => '於她',
 '于好' => '於好',
 '于始' => '於始',
@@ -6493,8 +6498,8 @@ $zh2Hant = array(
 '会上签订' => '會上簽訂',
 '会占' => '會佔',
 '会占卜' => '會占卜',
-'會干擾' => '會干擾',
 '会干扰' => '會干擾',
+'會干擾' => '會干擾',
 '会干' => '會幹',
 '会吊' => '會弔',
 '会里' => '會裡',
@@ -6631,8 +6636,8 @@ $zh2Hant = array(
 '棺材里' => '棺材裡',
 '植发' => '植髮',
 '椰枣干' => '椰棗乾',
-'杨雅筑' => '楊雅筑',
 '楊雅筑' => '楊雅筑',
+'杨雅筑' => '楊雅筑',
 '楚庄问鼎' => '楚莊問鼎',
 '楚庄王' => '楚莊王',
 '楚庄绝缨' => '楚莊絕纓',
@@ -6657,8 +6662,8 @@ $zh2Hant = array(
 '模范14棒' => '模范14棒',
 '模范21棒' => '模范21棒',
 '模范七棒' => '模范七棒',
-'模范三軍' => '模范三軍',
 '模范三军' => '模范三軍',
+'模范三軍' => '模范三軍',
 '模范棒棒堂' => '模范棒棒堂',
 '模制' => '模製',
 '样范' => '樣範',
@@ -6818,8 +6823,8 @@ $zh2Hant = array(
 '洒濯' => '洒濯',
 '洒然' => '洒然',
 '洒脱' => '洒脫',
-'洗练' => '洗鍊',
 '洗炼' => '洗鍊',
+'洗练' => '洗鍊',
 '洗发' => '洗髮',
 '洛钟东应' => '洛鐘東應',
 '泄欲' => '洩慾',
@@ -6856,18 +6861,18 @@ $zh2Hant = array(
 '涂序瑄' => '涂序瑄',
 '涂敏恒' => '涂敏恆',
 '涂敏恆' => '涂敏恆',
-'涂泽民' => '涂澤民',
 '涂澤民' => '涂澤民',
+'涂泽民' => '涂澤民',
 '涂绍煃' => '涂紹煃',
 '涂羽卿' => '涂羽卿',
-'涂谨申' => '涂謹申',
 '涂謹申' => '涂謹申',
+'涂谨申' => '涂謹申',
 '涂逢年' => '涂逢年',
 '涂醒哲' => '涂醒哲',
 '涂長望' => '涂長望',
 '涂长望' => '涂長望',
-'涂鴻欽' => '涂鴻欽',
 '涂鸿钦' => '涂鴻欽',
+'涂鴻欽' => '涂鴻欽',
 '消炎药' => '消炎藥',
 '消肿药' => '消腫藥',
 '液晶表' => '液晶錶',
@@ -6898,7 +6903,6 @@ $zh2Hant = array(
 '渠冲' => '渠衝',
 '测试' => '測試',
 '港制' => '港製',
-'游荡' => '游蕩',
 '游离' => '游離',
 '浑朴' => '渾樸',
 '浑个' => '渾箇',
@@ -6999,6 +7003,7 @@ $zh2Hant = array(
 '蒙汜' => '濛汜',
 '蒙蒙细雨' => '濛濛細雨',
 '蒙雾' => '濛霧',
+'蒙松雨' => '濛鬆雨',
 '蒙鸿' => '濛鴻',
 '滨田里佳子' => '濱田里佳子',
 '泻药' => '瀉藥',
@@ -7239,8 +7244,8 @@ $zh2Hant = array(
 '发签' => '發籤',
 '发庄' => '發莊',
 '发着' => '發著',
-'發表' => '發表',
 '发表' => '發表',
+'發表' => '發表',
 '发松' => '發鬆',
 '发面' => '發麵',
 '白干' => '白乾',
@@ -7258,8 +7263,8 @@ $zh2Hant = array(
 '白霉' => '白黴',
 '百个' => '百個',
 '百只可' => '百只可',
-'百只够' => '百只夠',
 '百只夠' => '百只夠',
+'百只够' => '百只夠',
 '百只怕' => '百只怕',
 '百只足够' => '百只足夠',
 '百只足夠' => '百只足夠',
@@ -7356,7 +7361,6 @@ $zh2Hant = array(
 '瞳蒙' => '瞳矇',
 '蒙事' => '矇事',
 '蒙昧无知' => '矇昧無知',
-'蒙松雨' => '矇松雨',
 '蒙混' => '矇混',
 '蒙瞍' => '矇瞍',
 '蒙眬' => '矇矓',
@@ -7542,15 +7546,15 @@ $zh2Hant = array(
 '筑前' => '筑前',
 '筑北' => '筑北',
 '筑州' => '筑州',
-'筑后' => '筑後',
 '筑後' => '筑後',
+'筑后' => '筑後',
 '筑波' => '筑波',
 '筑紫' => '筑紫',
 '筑肥' => '筑肥',
 '筑西' => '筑西',
 '筑邦' => '筑邦',
-'筑阳' => '筑陽',
 '筑陽' => '筑陽',
+'筑阳' => '筑陽',
 '答复' => '答覆',
 '答覆' => '答覆',
 '筵几' => '筵几',
@@ -7574,6 +7578,7 @@ $zh2Hant = array(
 '管人吊脚儿事' => '管人弔腳兒事',
 '管制法' => '管制法',
 '管干' => '管幹',
+'箱里' => '箱裡',
 '节欲' => '節慾',
 '节余' => '節餘',
 '范例' => '範例',
@@ -7692,8 +7697,8 @@ $zh2Hant = array(
 '丝发' => '絲髮',
 '绑扎' => '綁紮',
 '綑扎' => '綑紮',
-'經有云' => '經有云',
 '经有云' => '經有云',
+'經有云' => '經有云',
 '绿发' => '綠髮',
 '绸缎庄' => '綢緞莊',
 '维系' => '維繫',
@@ -7951,8 +7956,8 @@ $zh2Hant = array(
 '舰只' => '艦隻',
 '良药' => '良藥',
 '色欲' => '色慾',
-'艳后' => '艷后',
 '艷后' => '艷后',
+'艳后' => '艷后',
 '艸木丰丰' => '艸木丰丰',
 '芍药' => '芍藥',
 '芒果干' => '芒果乾',
@@ -7977,16 +7982,16 @@ $zh2Hant = array(
 '茂都淀' => '茂都澱',
 '范文同' => '范文同',
 '范文正公' => '范文正公',
-'范文澜' => '范文瀾',
 '范文瀾' => '范文瀾',
+'范文澜' => '范文瀾',
 '范文照' => '范文照',
 '范文程' => '范文程',
 '范文芳' => '范文芳',
 '范文藤' => '范文藤',
 '范文虎' => '范文虎',
 '范登堡' => '范登堡',
-'范賢惠' => '范賢惠',
 '范贤惠' => '范賢惠',
+'范賢惠' => '范賢惠',
 '茶几' => '茶几',
 '茶庄' => '茶莊',
 '茶余' => '茶餘',
@@ -8031,8 +8036,8 @@ $zh2Hant = array(
 '华严钟' => '華嚴鐘',
 '华发' => '華髮',
 '菸碱' => '菸鹼',
-'万一只' => '萬一只',
 '萬一只' => '萬一只',
+'万一只' => '萬一只',
 '万个' => '萬個',
 '万周后' => '萬周後',
 '万多只' => '萬多隻',
@@ -8534,8 +8539,8 @@ $zh2Hant = array(
 '诱奸' => '誘姦',
 '语云' => '語云',
 '语汇' => '語彙',
-'語有云' => '語有云',
 '语有云' => '語有云',
+'語有云' => '語有云',
 '诚征' => '誠徵',
 '诚朴' => '誠樸',
 '诬蔑' => '誣衊',
@@ -8596,7 +8601,6 @@ $zh2Hant = array(
 '豆腐干' => '豆腐乾',
 '竖着' => '豎著',
 '竖起脊梁' => '豎起脊梁',
-'丰度' => '豐度',
 '丰滨' => '豐濱',
 '丰滨乡' => '豐濱鄉',
 '象征' => '象徵',
@@ -8606,17 +8610,17 @@ $zh2Hant = array(
 '贵价' => '貴价',
 '贵干' => '貴幹',
 '贵征' => '貴徵',
-'买凶' => '買兇',
 '買凶' => '買兇',
+'买凶' => '買兇',
 '买断发' => '買斷發',
 '费占' => '費佔',
 '贻范' => '貽範',
 '资金占用' => '資金占用',
-'賈后' => '賈后',
 '贾后' => '賈后',
+'賈后' => '賈后',
 '赏赞' => '賞讚',
-'賢后' => '賢后',
 '贤后' => '賢后',
+'賢后' => '賢后',
 '卖断发' => '賣斷發',
 '卖呆' => '賣獃',
 '质朴' => '質樸',
@@ -8664,10 +8668,10 @@ $zh2Hant = array(
 '较于' => '較於',
 '挽曲' => '輓曲',
 '挽歌' => '輓歌',
-'挽联' => '輓聯',
 '挽聯' => '輓聯',
-'æ\8c½è¯\8d' => 'è¼\93è©\9e',
+'æ\8c½è\81\94' => 'è¼\93è\81¯',
 '挽詞' => '輓詞',
+'挽词' => '輓詞',
 '挽诗' => '輓詩',
 '挽詩' => '輓詩',
 '轻于' => '輕於',
@@ -8710,7 +8714,6 @@ $zh2Hant = array(
 '回绕' => '迴繞',
 '回翔' => '迴翔',
 '回肠' => '迴腸',
-'回荡' => '迴蕩',
 '回诵' => '迴誦',
 '回路' => '迴路',
 '回转' => '迴轉',
@@ -8801,6 +8804,7 @@ $zh2Hant = array(
 '游河' => '遊河',
 '游猎' => '遊獵',
 '游玩' => '遊玩',
+'游荡' => '遊盪',
 '游目骋怀' => '遊目騁懷',
 '游程' => '遊程',
 '游丝' => '遊絲',
@@ -8872,10 +8876,10 @@ $zh2Hant = array(
 '部落发' => '部落發',
 '郭后' => '郭后',
 '都于' => '都於',
-'乡愿' => '鄉愿',
 '鄉愿' => '鄉愿',
-'郑凯云' => '鄭凱云',
+'乡愿' => '鄉愿',
 '鄭凱云' => '鄭凱云',
+'郑凯云' => '鄭凱云',
 '郑庄公' => '鄭莊公',
 '配制饲料' => '配制飼料',
 '配合着' => '配合著',
@@ -8909,7 +8913,6 @@ $zh2Hant = array(
 '丑女' => '醜女',
 '丑女效颦' => '醜女效顰',
 '丑奴儿' => '醜奴兒',
-'丑婆子' => '醜婆子',
 '丑妇' => '醜婦',
 '丑媳' => '醜媳',
 '丑媳妇' => '醜媳婦',
@@ -8951,8 +8954,8 @@ $zh2Hant = array(
 '酿制' => '釀製',
 '衅钟' => '釁鐘',
 '采石之役' => '采石之役',
-'采石之戰' => '采石之戰',
 '采石之战' => '采石之戰',
+'采石之戰' => '采石之戰',
 '采石磯' => '采石磯',
 '采石矶' => '采石磯',
 '釉药' => '釉藥',
@@ -9322,10 +9325,10 @@ $zh2Hant = array(
 '音声如钟' => '音聲如鐘',
 '韶山冲' => '韶山沖',
 '响钟' => '響鐘',
-'页面' => '頁面',
 '頁面' => '頁面',
-'顶å¤\9a' => 'é \82å¤\9a',
+'页é\9d¢' => 'é \81é\9d¢',
 '頂多' => '頂多',
+'顶多' => '頂多',
 '项庄' => '項莊',
 '顺于' => '順於',
 '顺钟向' => '順鐘向',
@@ -9347,8 +9350,8 @@ $zh2Hant = array(
 '颜范' => '顏範',
 '颠干倒坤' => '顛乾倒坤',
 '颠覆' => '顛覆',
-'顛顛仆仆' => '顛顛仆仆',
 '颠颠仆仆' => '顛顛仆仆',
+'顛顛仆仆' => '顛顛仆仆',
 '颤栗' => '顫慄',
 '显示表' => '顯示錶',
 '显示钟' => '顯示鐘',
@@ -9363,15 +9366,14 @@ $zh2Hant = array(
 '风范' => '風範',
 '风里' => '風裡',
 '风起云涌' => '風起雲湧',
-'風采' => '風采',
 '风采' => '風采',
+'風采' => '風采',
 '台风' => '颱風',
 '台风后' => '颱風後',
 '刮了' => '颳了',
 '刮倒' => '颳倒',
 '刮去' => '颳去',
 '刮得' => '颳得',
-'刮着' => '颳著',
 '刮走' => '颳走',
 '刮起' => '颳起',
 '刮雪' => '颳雪',
@@ -9538,16 +9540,16 @@ $zh2Hant = array(
 '香干' => '香乾',
 '香山庄' => '香山庄',
 '马干' => '馬乾',
-'馬占山' => '馬占山',
 '马占山' => '馬占山',
+'馬占山' => '馬占山',
 '马杆' => '馬杆',
-'马格里布' => '馬格里布',
 '馬格里布' => '馬格里布',
+'马格里布' => '馬格里布',
 '马表' => '馬錶',
 '驻扎' => '駐紮',
 '骀荡' => '駘蕩',
-'騰格里' => '騰格里',
 '腾格里' => '騰格里',
+'騰格里' => '騰格里',
 '腾冲' => '騰衝',
 '惊赞' => '驚讚',
 '惊钟' => '驚鐘',
@@ -9733,7 +9735,6 @@ $zh2Hant = array(
 '斗而铸锥' => '鬥而鑄錐',
 '斗脚' => '鬥腳',
 '斗舰' => '鬥艦',
-'斗艳' => '鬥艷',
 '斗茶' => '鬥茶',
 '斗草' => '鬥草',
 '斗叶儿' => '鬥葉兒',
@@ -9741,6 +9742,7 @@ $zh2Hant = array(
 '斗着' => '鬥著',
 '斗蟋蟀' => '鬥蟋蟀',
 '斗话' => '鬥話',
+'斗艳' => '鬥豔',
 '斗起' => '鬥起',
 '斗趣' => '鬥趣',
 '斗闲气' => '鬥閑氣',
@@ -9913,11 +9915,11 @@ $zh2Hant = array(
 '黄历' => '黃曆',
 '黄曲霉' => '黃曲霉',
 '黄历史' => '黃歷史',
-'黄诗杰' => '黃詩杰',
 '黃詩杰' => '黃詩杰',
+'黄诗杰' => '黃詩杰',
 '黄金表' => '黃金表',
-'黄钰筑' => '黃鈺筑',
 '黃鈺筑' => '黃鈺筑',
+'黄钰筑' => '黃鈺筑',
 '黄钟' => '黃鐘',
 '黄发' => '黃髮',
 '黄曲毒素' => '黃麴毒素',
@@ -13243,8 +13245,8 @@ $zh2Hans = array(
 '乘著述' => '乘著述',
 '乾一坛' => '乾一坛',
 '乾一壇' => '乾一坛',
-'乾一組' => '乾一组',
 '乾一组' => '乾一组',
+'乾一組' => '乾一组',
 '乾上乾下' => '乾上乾下',
 '乾為天' => '乾为天',
 '乾為陽' => '乾为阳',
@@ -13264,10 +13266,10 @@ $zh2Hans = array(
 '乾岡' => '乾冈',
 '乾劉' => '乾刘',
 '乾刘' => '乾刘',
-'乾刚' => '乾刚',
 '乾剛' => '乾刚',
-'ä¹¾å\8a¡' => 'ä¹¾å\8a¡',
+'ä¹¾å\88\9a' => 'ä¹¾å\88\9a',
 '乾務' => '乾务',
+'乾务' => '乾务',
 '乾化' => '乾化',
 '乾卦' => '乾卦',
 '乾县' => '乾县',
@@ -13319,12 +13321,12 @@ $zh2Hans = array(
 '乾景' => '乾景',
 '乾晷' => '乾晷',
 '乾曜' => '乾曜',
-'乾構' => '乾构',
 '乾构' => '乾构',
-'ä¹¾æ\9e¢' => 'ä¹¾æ\9e¢',
+'ä¹¾æ§\8b' => 'ä¹¾æ\9e\84',
 '乾樞' => '乾枢',
-'ä¹¾æ£\9f' => 'ä¹¾æ \8b',
+'ä¹¾æ\9e¢' => 'ä¹¾æ\9e¢',
 '乾栋' => '乾栋',
+'乾棟' => '乾栋',
 '乾步' => '乾步',
 '乾氏' => '乾氏',
 '乾沓和' => '乾沓和',
@@ -13334,8 +13336,8 @@ $zh2Hans = array(
 '乾清宮' => '乾清宫',
 '乾清宫' => '乾清宫',
 '乾渥' => '乾渥',
-'乾灵' => '乾灵',
 '乾靈' => '乾灵',
+'乾灵' => '乾灵',
 '乾男' => '乾男',
 '乾皋' => '乾皋',
 '乾盛世' => '乾盛世',
@@ -13354,19 +13356,19 @@ $zh2Hans = array(
 '乾红' => '乾红',
 '乾綱' => '乾纲',
 '乾纲' => '乾纲',
-'乾紐' => '乾纽',
 '乾纽' => '乾纽',
+'乾紐' => '乾纽',
 '乾絡' => '乾络',
 '乾络' => '乾络',
 '乾統' => '乾统',
 '乾统' => '乾统',
 '乾維' => '乾维',
 '乾维' => '乾维',
-'乾罗' => '乾罗',
 '乾羅' => '乾罗',
+'乾罗' => '乾罗',
 '乾花' => '乾花',
-'乾荫' => '乾荫',
 '乾蔭' => '乾荫',
+'乾荫' => '乾荫',
 '乾行' => '乾行',
 '乾衡' => '乾衡',
 '乾覆' => '乾覆',
@@ -13375,19 +13377,19 @@ $zh2Hans = array(
 '乾象历' => '乾象历',
 '乾贞' => '乾贞',
 '乾貞' => '乾贞',
-'乾贶' => '乾贶',
 '乾貺' => '乾贶',
+'乾贶' => '乾贶',
 '乾车' => '乾车',
 '乾車' => '乾车',
-'乾轴' => '乾轴',
 '乾軸' => '乾轴',
+'乾轴' => '乾轴',
 '乾通' => '乾通',
 '乾造' => '乾造',
 '乾道' => '乾道',
 '乾鑒' => '乾鉴',
 '乾鉴' => '乾鉴',
-'乾鈞' => '乾钧',
 '乾钧' => '乾钧',
+'乾鈞' => '乾钧',
 '乾闼' => '乾闼',
 '乾闥' => '乾闼',
 '乾陀' => '乾陀',
@@ -13396,8 +13398,8 @@ $zh2Hans = array(
 '乾音' => '乾音',
 '乾顾' => '乾顾',
 '乾顧' => '乾顾',
-'乾風' => '乾风',
 '乾风' => '乾风',
+'乾風' => '乾风',
 '乾首' => '乾首',
 '乾馬' => '乾马',
 '乾马' => '乾马',
@@ -13405,8 +13407,8 @@ $zh2Hans = array(
 '乾鹄' => '乾鹄',
 '乾鵲' => '乾鹊',
 '乾鹊' => '乾鹊',
-'乾龙' => '乾龙',
 '乾龍' => '乾龙',
+'乾龙' => '乾龙',
 '乾,健也' => '乾,健也',
 '乾,天也' => '乾,天也',
 '爭著' => '争着',
@@ -13419,14 +13421,14 @@ $zh2Hans = array(
 '爭著述' => '争著述',
 '五箇山' => '五箇山',
 '亮著' => '亮着',
-'亮著書' => '亮著书',
 '亮著书' => '亮著书',
+'亮著書' => '亮著书',
 '亮著作' => '亮著作',
 '亮著名' => '亮著名',
 '亮著錄' => '亮著录',
 '亮著录' => '亮著录',
-'亮著稱' => '亮著称',
 '亮著称' => '亮著称',
+'亮著稱' => '亮著称',
 '亮著者' => '亮著者',
 '亮著述' => '亮著述',
 '仗著' => '仗着',
@@ -13441,12 +13443,12 @@ $zh2Hans = array(
 '仗著者' => '仗著者',
 '仗著述' => '仗著述',
 '代表著' => '代表着',
-'代表著书' => '代表著书',
 '代表著書' => '代表著书',
+'代表著书' => '代表著书',
 '代表著作' => '代表著作',
 '代表著名' => '代表著名',
-'代表著录' => '代表著录',
 '代表著錄' => '代表著录',
+'代表著录' => '代表著录',
 '代表著称' => '代表著称',
 '代表著稱' => '代表著称',
 '代表著者' => '代表著者',
@@ -13470,13 +13472,13 @@ $zh2Hans = array(
 '伴著名' => '伴著名',
 '伴著录' => '伴著录',
 '伴著錄' => '伴著录',
-'伴著称' => '伴著称',
 '伴著稱' => '伴著称',
+'伴著称' => '伴著称',
 '伴著者' => '伴著者',
 '伴著述' => '伴著述',
 '低著' => '低着',
-'低著书' => '低著书',
 '低著書' => '低著书',
+'低著书' => '低著书',
 '低著作' => '低著作',
 '低著名' => '低著名',
 '低著录' => '低著录',
@@ -13492,8 +13494,8 @@ $zh2Hans = array(
 '住著名' => '住著名',
 '住著錄' => '住著录',
 '住著录' => '住著录',
-'住著稱' => '住著称',
 '住著称' => '住著称',
+'住著稱' => '住著称',
 '住著者' => '住著者',
 '住著述' => '住著述',
 '佛頭著糞' => '佛头著粪',
@@ -13514,8 +13516,8 @@ $zh2Hans = array(
 '保障著名' => '保障著名',
 '保障著錄' => '保障著录',
 '保障著录' => '保障著录',
-'保障著称' => '保障著称',
 '保障著稱' => '保障著称',
+'保障著称' => '保障著称',
 '保障著者' => '保障著者',
 '保障著述' => '保障著述',
 '信著' => '信着',
@@ -13525,8 +13527,8 @@ $zh2Hans = array(
 '信著名' => '信著名',
 '信著录' => '信著录',
 '信著錄' => '信著录',
-'信著稱' => '信著称',
 '信著称' => '信著称',
+'信著稱' => '信著称',
 '信著者' => '信著者',
 '信著述' => '信著述',
 '修鍊' => '修炼',
@@ -13536,10 +13538,10 @@ $zh2Hans = array(
 '候著书' => '候著书',
 '候著作' => '候著作',
 '候著名' => '候著名',
-'候著錄' => '候著录',
 '候著录' => '候著录',
-'候著称' => '候著称',
+'候著錄' => '候著录',
 '候著稱' => '候著称',
+'候著称' => '候著称',
 '候著者' => '候著者',
 '候著述' => '候著述',
 '藉助' => '借助',
@@ -13549,28 +13551,28 @@ $zh2Hans = array(
 '藉機' => '借机',
 '藉此' => '借此',
 '藉由' => '借由',
-'藉著' => '借着',
 '借著' => '借着',
 '藉着' => '借着',
+'藉著' => '借着',
 '藉端' => '借端',
-'借著书' => '借著书',
 '借著書' => '借著书',
+'借著书' => '借著书',
 '借著作' => '借著作',
 '借著名' => '借著名',
 '借著录' => '借著录',
 '借著錄' => '借著录',
-'借著稱' => '借著称',
 '借著称' => '借著称',
+'借著稱' => '借著称',
 '借著者' => '借著者',
 '借著述' => '借著述',
 '藉詞' => '借词',
 '做著' => '做着',
-'做著书' => '做著书',
 '做著書' => '做著书',
+'做著书' => '做著书',
 '做著作' => '做著作',
 '做著名' => '做著名',
-'做著录' => '做著录',
 '做著錄' => '做著录',
+'做著录' => '做著录',
 '做著稱' => '做著称',
 '做著称' => '做著称',
 '做著者' => '做著者',
@@ -13582,8 +13584,8 @@ $zh2Hans = array(
 '偷著名' => '偷著名',
 '偷著錄' => '偷著录',
 '偷著录' => '偷著录',
-'偷著称' => '偷著称',
 '偷著稱' => '偷著称',
+'偷著称' => '偷著称',
 '偷著者' => '偷著者',
 '偷著述' => '偷著述',
 '傢俬' => '傢俬',
@@ -13608,25 +13610,25 @@ $zh2Hans = array(
 '關著者' => '关著者',
 '關著述' => '关著述',
 '冀著' => '冀着',
-'冀著书' => '冀著书',
 '冀著書' => '冀著书',
+'冀著书' => '冀著书',
 '冀著作' => '冀著作',
 '冀著名' => '冀著名',
-'冀著录' => '冀著录',
 '冀著錄' => '冀著录',
+'冀著录' => '冀著录',
 '冀著稱' => '冀著称',
 '冀著称' => '冀著称',
 '冀著者' => '冀著者',
 '冀著述' => '冀著述',
 '冒著' => '冒着',
-'冒著書' => '冒著书',
 '冒著书' => '冒著书',
+'冒著書' => '冒著书',
 '冒著作' => '冒著作',
 '冒著名' => '冒著名',
 '冒著录' => '冒著录',
 '冒著錄' => '冒著录',
-'冒著称' => '冒著称',
 '冒著稱' => '冒著称',
+'冒著称' => '冒著称',
 '冒著者' => '冒著者',
 '冒著述' => '冒著述',
 '寫著' => '写着',
@@ -13651,10 +13653,10 @@ $zh2Hans = array(
 '制著書' => '制著书',
 '制著作' => '制著作',
 '制著名' => '制著名',
-'制著录' => '制著录',
 '制著錄' => '制著录',
-'制著稱' => '制著称',
+'制著录' => '制著录',
 '制著称' => '制著称',
+'制著稱' => '制著称',
 '制著者' => '制著者',
 '制著述' => '制著述',
 '刻著' => '刻着',
@@ -13685,14 +13687,14 @@ $zh2Hans = array(
 '動著者' => '动著者',
 '動著述' => '动著述',
 '努力著' => '努力着',
-'努力著书' => '努力著书',
 '努力著書' => '努力著书',
+'努力著书' => '努力著书',
 '努力著作' => '努力著作',
 '努力著名' => '努力著名',
-'努力著录' => '努力著录',
 '努力著錄' => '努力著录',
-'努力著稱' => '努力著称',
+'努力著录' => '努力著录',
 '努力著称' => '努力著称',
+'努力著稱' => '努力著称',
 '努力著者' => '努力著者',
 '努力著述' => '努力著述',
 '努著' => '努着',
@@ -13708,14 +13710,14 @@ $zh2Hans = array(
 '努著述' => '努著述',
 '卓著' => '卓著',
 '印著' => '印着',
-'印著書' => '印著书',
 '印著书' => '印著书',
+'印著書' => '印著书',
 '印著作' => '印著作',
 '印著名' => '印著名',
-'印著錄' => '印著录',
 '印著录' => '印著录',
-'印著稱' => '印著称',
+'印著錄' => '印著录',
 '印著称' => '印著称',
+'印著稱' => '印著称',
 '印著者' => '印著者',
 '印著述' => '印著述',
 '卷舌' => '卷舌',
@@ -13729,12 +13731,12 @@ $zh2Hans = array(
 '壓著述' => '压著述',
 '原著' => '原著',
 '去著' => '去着',
-'去著書' => '去著书',
 '去著书' => '去著书',
+'去著書' => '去著书',
 '去著作' => '去著作',
 '去著名' => '去著名',
-'去著錄' => '去著录',
 '去著录' => '去著录',
+'去著錄' => '去著录',
 '去著稱' => '去著称',
 '去著称' => '去著称',
 '去著者' => '去著者',
@@ -13742,12 +13744,12 @@ $zh2Hans = array(
 '反反覆覆' => '反反复复',
 '反覆' => '反复',
 '受著' => '受着',
-'受著书' => '受著书',
 '受著書' => '受著书',
+'受著书' => '受著书',
 '受著作' => '受著作',
 '受著名' => '受著名',
-'受著录' => '受著录',
 '受著錄' => '受著录',
+'受著录' => '受著录',
 '受著稱' => '受著称',
 '受著称' => '受著称',
 '受著者' => '受著者',
@@ -13761,12 +13763,12 @@ $zh2Hans = array(
 '變著者' => '变著者',
 '變著述' => '变著述',
 '叫著' => '叫着',
-'叫著書' => '叫著书',
 '叫著书' => '叫著书',
+'叫著書' => '叫著书',
 '叫著作' => '叫著作',
 '叫著名' => '叫著名',
-'叫著錄' => '叫著录',
 '叫著录' => '叫著录',
+'叫著錄' => '叫著录',
 '叫著称' => '叫著称',
 '叫著稱' => '叫著称',
 '叫著者' => '叫著者',
@@ -13791,8 +13793,8 @@ $zh2Hans = array(
 '向著者' => '向著者',
 '向著述' => '向著述',
 '含著' => '含着',
-'含著书' => '含著书',
 '含著書' => '含著书',
+'含著书' => '含著书',
 '含著作' => '含著作',
 '含著名' => '含著名',
 '含著錄' => '含著录',
@@ -13811,8 +13813,8 @@ $zh2Hans = array(
 '聽著稱' => '听著称',
 '聽著者' => '听著者',
 '聽著述' => '听著述',
-'吳其濬' => '吴其濬',
 '吴其濬' => '吴其濬',
+'吳其濬' => '吴其濬',
 '吹著' => '吹着',
 '吹著書' => '吹著书',
 '吹著书' => '吹著书',
@@ -13826,12 +13828,12 @@ $zh2Hans = array(
 '吹著述' => '吹著述',
 '周易乾' => '周易乾',
 '味著' => '味着',
-'味著書' => '味著书',
 '味著书' => '味著书',
+'味著書' => '味著书',
 '味著作' => '味著作',
 '味著名' => '味著名',
-'味著錄' => '味著录',
 '味著录' => '味著录',
+'味著錄' => '味著录',
 '味著称' => '味著称',
 '味著稱' => '味著称',
 '味著者' => '味著者',
@@ -13847,12 +13849,12 @@ $zh2Hans = array(
 '響著述' => '响著述',
 '哪吒' => '哪吒',
 '哭著' => '哭着',
-'哭著书' => '哭著书',
 '哭著書' => '哭著书',
+'哭著书' => '哭著书',
 '哭著作' => '哭著作',
 '哭著名' => '哭著名',
-'哭著录' => '哭著录',
 '哭著錄' => '哭著录',
+'哭著录' => '哭著录',
 '哭著稱' => '哭著称',
 '哭著称' => '哭著称',
 '哭著者' => '哭著者',
@@ -13864,17 +13866,17 @@ $zh2Hans = array(
 '唱著名' => '唱著名',
 '唱著录' => '唱著录',
 '唱著錄' => '唱著录',
-'唱著稱' => '唱著称',
 '唱著称' => '唱著称',
+'唱著稱' => '唱著称',
 '唱著者' => '唱著者',
 '唱著述' => '唱著述',
 '喝著' => '喝着',
-'喝著書' => '喝著书',
 '喝著书' => '喝著书',
+'喝著書' => '喝著书',
 '喝著作' => '喝著作',
 '喝著名' => '喝著名',
-'喝著錄' => '喝著录',
 '喝著录' => '喝著录',
+'喝著錄' => '喝著录',
 '喝著稱' => '喝著称',
 '喝著称' => '喝著称',
 '喝著者' => '喝著者',
@@ -13883,12 +13885,12 @@ $zh2Hans = array(
 '嗅得著' => '嗅得着',
 '嗅著' => '嗅着',
 '嚷著' => '嚷着',
-'嚷著书' => '嚷著书',
 '嚷著書' => '嚷著书',
+'嚷著书' => '嚷著书',
 '嚷著作' => '嚷著作',
 '嚷著名' => '嚷著名',
-'嚷著录' => '嚷著录',
 '嚷著錄' => '嚷著录',
+'嚷著录' => '嚷著录',
 '嚷著称' => '嚷著称',
 '嚷著稱' => '嚷著称',
 '嚷著者' => '嚷著者',
@@ -13897,19 +13899,19 @@ $zh2Hans = array(
 '因著' => '因着',
 '因著〈' => '因著〈',
 '因著《' => '因著《',
-'因著书' => '因著书',
 '因著書' => '因著书',
+'因著书' => '因著书',
 '因著作' => '因著作',
 '因著名' => '因著名',
-'因著录' => '因著录',
 '因著錄' => '因著录',
-'因著称' => '因著称',
+'因著录' => '因著录',
 '因著稱' => '因著称',
+'因著称' => '因著称',
 '因著者' => '因著者',
 '因著述' => '因著述',
 '困著' => '困着',
-'困著书' => '困著书',
 '困著書' => '困著书',
+'困著书' => '困著书',
 '困著作' => '困著作',
 '困著名' => '困著名',
 '困著錄' => '困著录',
@@ -13928,8 +13930,8 @@ $zh2Hans = array(
 '圍著述' => '围著述',
 '土著' => '土著',
 '在著' => '在着',
-'在著书' => '在著书',
 '在著書' => '在著书',
+'在著书' => '在著书',
 '在著作' => '在著作',
 '在著名' => '在著名',
 '在著錄' => '在著录',
@@ -13939,12 +13941,12 @@ $zh2Hans = array(
 '在著者' => '在著者',
 '在著述' => '在著述',
 '坐著' => '坐着',
-'坐著書' => '坐著书',
 '坐著书' => '坐著书',
+'坐著書' => '坐著书',
 '坐著作' => '坐著作',
 '坐著名' => '坐著名',
-'坐著錄' => '坐著录',
 '坐著录' => '坐著录',
+'坐著錄' => '坐著录',
 '坐著称' => '坐著称',
 '坐著稱' => '坐著称',
 '坐著者' => '坐著者',
@@ -13960,8 +13962,8 @@ $zh2Hans = array(
 '備著述' => '备著述',
 '覆查' => '复查',
 '覆核' => '复核',
-'天道為乾' => '天道为乾',
 '天道为乾' => '天道为乾',
+'天道為乾' => '天道为乾',
 '太閤' => '太阁',
 '夾著' => '夹着',
 '夾著書' => '夹著书',
@@ -13976,8 +13978,8 @@ $zh2Hans = array(
 '字乾生' => '字乾生',
 '存摺' => '存摺',
 '孤著' => '孤着',
-'孤著書' => '孤著书',
 '孤著书' => '孤著书',
+'孤著書' => '孤著书',
 '孤著作' => '孤著作',
 '孤著名' => '孤著名',
 '孤著錄' => '孤著录',
@@ -13995,8 +13997,8 @@ $zh2Hans = array(
 '學著者' => '学著者',
 '學著述' => '学著述',
 '守著' => '守着',
-'守著书' => '守著书',
 '守著書' => '守著书',
+'守著书' => '守著书',
 '守著作' => '守著作',
 '守著名' => '守著名',
 '守著录' => '守著录',
@@ -14036,12 +14038,12 @@ $zh2Hans = array(
 '將軍抽車' => '将军抽車',
 '尼乾陀' => '尼乾陀',
 '展著' => '展着',
-'展著书' => '展著书',
 '展著書' => '展著书',
+'展著书' => '展著书',
 '展著作' => '展著作',
 '展著名' => '展著名',
-'展著录' => '展著录',
 '展著錄' => '展著录',
+'展著录' => '展著录',
 '展著稱' => '展著称',
 '展著称' => '展著称',
 '展著者' => '展著者',
@@ -14068,50 +14070,50 @@ $zh2Hans = array(
 '乾乾脆脆' => '干干脆脆',
 '乾泉水' => '干泉水',
 '幹著' => '干着',
-'幺二三' => '幺二三',
 '么二三' => '幺二三',
-'幺元' => '幺元',
+'幺二三' => '幺二三',
 '么元' => '幺元',
+'幺元' => '幺元',
 '幺鳳' => '幺凤',
 '么鳳' => '幺凤',
-'幺半群' => '幺半群',
 '么半群' => '幺半群',
-'幺å\8e®' => '幺å\8e®',
+'幺å\8d\8a群' => '幺å\8d\8a群',
 '幺廝' => '幺厮',
+'幺厮' => '幺厮',
 '幺叔' => '幺叔',
 '么叔' => '幺叔',
-'幺媽' => '幺妈',
 '么媽' => '幺妈',
+'幺媽' => '幺妈',
 '么妹' => '幺妹',
 '幺妹' => '幺妹',
 '么姓' => '幺姓',
 '幺姓' => '幺姓',
-'幺姨' => '幺姨',
 '么姨' => '幺姨',
+'幺姨' => '幺姨',
+'么娘' => '幺娘',
+'么孃' => '幺娘',
 '幺娘' => '幺娘',
 '幺孃' => '幺娘',
-'么孃' => '幺娘',
-'么娘' => '幺娘',
 '幺小' => '幺小',
 '么小' => '幺小',
-'么氏' => '幺氏',
 '幺氏' => '幺氏',
-'幺爸' => '幺爸',
+'么氏' => '幺氏',
 '么爸' => '幺爸',
-'么爹' => '幺爹',
+'幺爸' => '幺爸',
 '幺爹' => '幺爹',
-'幺篇' => '幺篇',
+'么爹' => '幺爹',
 '么篇' => '幺篇',
+'幺篇' => '幺篇',
 '么舅' => '幺舅',
 '幺舅' => '幺舅',
 '么蛾子' => '幺蛾子',
 '幺蛾子' => '幺蛾子',
-'幺謙' => '幺谦',
 '么謙' => '幺谦',
+'幺謙' => '幺谦',
 '幺麽' => '幺麽',
 '么麼' => '幺麽',
-'么麼小丑' => '幺麽小丑',
 '幺麽小丑' => '幺麽小丑',
+'么麼小丑' => '幺麽小丑',
 '庇護著' => '庇护着',
 '應著' => '应着',
 '應著書' => '应著书',
@@ -14123,12 +14125,12 @@ $zh2Hans = array(
 '應著述' => '应著述',
 '康乾' => '康乾',
 '康著' => '康着',
-'康著書' => '康著书',
 '康著书' => '康著书',
+'康著書' => '康著书',
 '康著作' => '康著作',
 '康著名' => '康著名',
-'康著錄' => '康著录',
 '康著录' => '康著录',
+'康著錄' => '康著录',
 '康著称' => '康著称',
 '康著稱' => '康著称',
 '康著者' => '康著者',
@@ -14141,8 +14143,8 @@ $zh2Hans = array(
 '開著稱' => '开著称',
 '開著者' => '开著者',
 '開著述' => '开著述',
-'张法乾' => '张法乾',
 '張法乾' => '张法乾',
+'张法乾' => '张法乾',
 '當著' => '当着',
 '當著書' => '当著书',
 '當著作' => '当著作',
@@ -14166,8 +14168,8 @@ $zh2Hans = array(
 '待著述' => '待著述',
 '後姓' => '後姓',
 '得著' => '得着',
-'得著书' => '得著书',
 '得著書' => '得著书',
+'得著书' => '得著书',
 '得著作' => '得著作',
 '得著名' => '得著名',
 '得著錄' => '得著录',
@@ -14177,12 +14179,12 @@ $zh2Hans = array(
 '得著者' => '得著者',
 '得著述' => '得著述',
 '循著' => '循着',
-'循著書' => '循著书',
 '循著书' => '循著书',
+'循著書' => '循著书',
 '循著作' => '循著作',
 '循著名' => '循著名',
-'循著錄' => '循著录',
 '循著录' => '循著录',
+'循著錄' => '循著录',
 '循著称' => '循著称',
 '循著稱' => '循著称',
 '循著者' => '循著者',
@@ -14194,13 +14196,13 @@ $zh2Hans = array(
 '心著名' => '心著名',
 '心著录' => '心著录',
 '心著錄' => '心著录',
-'心著称' => '心著称',
 '心著稱' => '心著称',
+'心著称' => '心著称',
 '心著者' => '心著者',
 '心著述' => '心著述',
 '忍著' => '忍着',
-'忍著書' => '忍著书',
 '忍著书' => '忍著书',
+'忍著書' => '忍著书',
 '忍著作' => '忍著作',
 '忍著名' => '忍著名',
 '忍著录' => '忍著录',
@@ -14210,23 +14212,23 @@ $zh2Hans = array(
 '忍著者' => '忍著者',
 '忍著述' => '忍著述',
 '志著' => '志着',
-'志著书' => '志著书',
 '志著書' => '志著书',
+'志著书' => '志著书',
 '志著作' => '志著作',
 '志著名' => '志著名',
-'志著录' => '志著录',
 '志著錄' => '志著录',
-'志著稱' => '志著称',
+'志著录' => '志著录',
 '志著称' => '志著称',
+'志著稱' => '志著称',
 '志著者' => '志著者',
 '志著述' => '志著述',
 '忙著' => '忙着',
-'忙著書' => '忙著书',
 '忙著书' => '忙著书',
+'忙著書' => '忙著书',
 '忙著作' => '忙著作',
 '忙著名' => '忙著名',
-'忙著錄' => '忙著录',
 '忙著录' => '忙著录',
+'忙著錄' => '忙著录',
 '忙著称' => '忙著称',
 '忙著稱' => '忙著称',
 '忙著者' => '忙著者',
@@ -14240,25 +14242,25 @@ $zh2Hans = array(
 '懷著者' => '怀著者',
 '懷著述' => '怀著述',
 '急著' => '急着',
-'急著書' => '急著书',
 '急著书' => '急著书',
+'急著書' => '急著书',
 '急著作' => '急著作',
 '急著名' => '急著名',
-'急著錄' => '急著录',
 '急著录' => '急著录',
+'急著錄' => '急著录',
 '急著称' => '急著称',
 '急著稱' => '急著称',
 '急著者' => '急著者',
 '急著述' => '急著述',
 '性著' => '性着',
-'性著書' => '性著书',
 '性著书' => '性著书',
+'性著書' => '性著书',
 '性著作' => '性著作',
 '性著名' => '性著名',
-'性著錄' => '性著录',
 '性著录' => '性著录',
-'性著稱' => '性著称',
+'性著錄' => '性著录',
 '性著称' => '性著称',
+'性著稱' => '性著称',
 '性著者' => '性著者',
 '性著述' => '性著述',
 '戀著' => '恋着',
@@ -14277,8 +14279,8 @@ $zh2Hans = array(
 '悠著名' => '悠著名',
 '悠著錄' => '悠著录',
 '悠著录' => '悠著录',
-'悠著稱' => '悠著称',
 '悠著称' => '悠著称',
+'悠著稱' => '悠著称',
 '悠著者' => '悠著者',
 '悠著述' => '悠著述',
 '慣著' => '惯着',
@@ -14290,14 +14292,14 @@ $zh2Hans = array(
 '慣著者' => '惯著者',
 '慣著述' => '惯著述',
 '想著' => '想着',
-'想著书' => '想著书',
 '想著書' => '想著书',
+'想著书' => '想著书',
 '想著作' => '想著作',
 '想著名' => '想著名',
-'想著录' => '想著录',
 '想著錄' => '想著录',
-'想著稱' => '想著称',
+'想著录' => '想著录',
 '想著称' => '想著称',
+'想著稱' => '想著称',
 '想著者' => '想著者',
 '想著述' => '想著述',
 '戰著' => '战着',
@@ -14309,12 +14311,12 @@ $zh2Hans = array(
 '戰著者' => '战著者',
 '戰著述' => '战著述',
 '戴著' => '戴着',
-'戴著书' => '戴著书',
 '戴著書' => '戴著书',
+'戴著书' => '戴著书',
 '戴著作' => '戴著作',
 '戴著名' => '戴著名',
-'戴著录' => '戴著录',
 '戴著錄' => '戴著录',
+'戴著录' => '戴著录',
 '戴著稱' => '戴著称',
 '戴著称' => '戴著称',
 '戴著者' => '戴著者',
@@ -14326,17 +14328,17 @@ $zh2Hans = array(
 '扎著名' => '扎著名',
 '扎著錄' => '扎著录',
 '扎著录' => '扎著录',
-'扎著稱' => '扎著称',
 '扎著称' => '扎著称',
+'扎著稱' => '扎著称',
 '扎著者' => '扎著者',
 '扎著述' => '扎著述',
 '打著' => '打着',
-'打著书' => '打著书',
 '打著書' => '打著书',
+'打著书' => '打著书',
 '打著作' => '打著作',
 '打著名' => '打著名',
-'打著录' => '打著录',
 '打著錄' => '打著录',
+'打著录' => '打著录',
 '打著称' => '打著称',
 '打著稱' => '打著称',
 '打著者' => '打著者',
@@ -14361,8 +14363,8 @@ $zh2Hans = array(
 '抓著名' => '抓著名',
 '抓著录' => '抓著录',
 '抓著錄' => '抓著录',
-'抓著稱' => '抓著称',
 '抓著称' => '抓著称',
+'抓著稱' => '抓著称',
 '抓著者' => '抓著者',
 '抓著述' => '抓著述',
 '護著' => '护着',
@@ -14378,17 +14380,17 @@ $zh2Hans = array(
 '披著書' => '披著书',
 '披著作' => '披著作',
 '披著名' => '披著名',
-'披著錄' => '披著录',
 '披著录' => '披著录',
-'披著称' => '披著称',
+'披著錄' => '披著录',
 '披著稱' => '披著称',
+'披著称' => '披著称',
 '披著者' => '披著者',
 '披著述' => '披著述',
 '抬著' => '抬着',
 '抬著作' => '抬著作',
 '抬著名' => '抬著名',
-'抬著錄' => '抬著录',
 '抬著录' => '抬著录',
+'抬著錄' => '抬著录',
 '抬著稱' => '抬著称',
 '抬著称' => '抬著称',
 '抬著者' => '抬著者',
@@ -14398,8 +14400,8 @@ $zh2Hans = array(
 '抱著名' => '抱著名',
 '抱著录' => '抱著录',
 '抱著錄' => '抱著录',
-'抱著称' => '抱著称',
 '抱著稱' => '抱著称',
+'抱著称' => '抱著称',
 '抱著者' => '抱著者',
 '抱著述' => '抱著述',
 '拉著' => '拉着',
@@ -14409,8 +14411,8 @@ $zh2Hans = array(
 '拉著名' => '拉著名',
 '拉著录' => '拉著录',
 '拉著錄' => '拉著录',
-'拉著稱' => '拉著称',
 '拉著称' => '拉著称',
+'拉著稱' => '拉著称',
 '拉著者' => '拉著者',
 '拉著述' => '拉著述',
 '拉鍊' => '拉链',
@@ -14439,8 +14441,8 @@ $zh2Hans = array(
 '拼著' => '拼着',
 '拼著作' => '拼著作',
 '拼著名' => '拼著名',
-'拼著錄' => '拼著录',
 '拼著录' => '拼著录',
+'拼著錄' => '拼著录',
 '拼著稱' => '拼著称',
 '拼著称' => '拼著称',
 '拼著者' => '拼著者',
@@ -14448,10 +14450,10 @@ $zh2Hans = array(
 '拿著' => '拿着',
 '拿著作' => '拿著作',
 '拿著名' => '拿著名',
-'拿著錄' => '拿著录',
 '拿著录' => '拿著录',
-'拿著稱' => '拿著称',
+'拿著錄' => '拿著录',
 '拿著称' => '拿著称',
+'拿著稱' => '拿著称',
 '拿著者' => '拿著者',
 '拿著述' => '拿著述',
 '持著' => '持着',
@@ -14468,8 +14470,8 @@ $zh2Hans = array(
 '挑著名' => '挑著名',
 '挑著錄' => '挑著录',
 '挑著录' => '挑著录',
-'挑著稱' => '挑著称',
 '挑著称' => '挑著称',
+'挑著稱' => '挑著称',
 '挑著者' => '挑著者',
 '挑著述' => '挑著述',
 '擋著' => '挡着',
@@ -14506,10 +14508,10 @@ $zh2Hans = array(
 '捆著' => '捆着',
 '捆著作' => '捆著作',
 '捆著名' => '捆著名',
-'捆著录' => '捆著录',
 '捆著錄' => '捆著录',
-'捆著稱' => '捆著称',
+'捆著录' => '捆著录',
 '捆著称' => '捆著称',
+'捆著稱' => '捆著称',
 '捆著者' => '捆著者',
 '捆著述' => '捆著述',
 '據著' => '据着',
@@ -14523,10 +14525,10 @@ $zh2Hans = array(
 '掖著' => '掖着',
 '掖著作' => '掖著作',
 '掖著名' => '掖著名',
-'掖著录' => '掖著录',
 '掖著錄' => '掖著录',
-'掖著称' => '掖著称',
+'掖著录' => '掖著录',
 '掖著稱' => '掖著称',
+'掖著称' => '掖著称',
 '掖著者' => '掖著者',
 '掖著述' => '掖著述',
 '接著' => '接着',
@@ -14539,14 +14541,14 @@ $zh2Hans = array(
 '接著者' => '接著者',
 '接著述' => '接著述',
 '揉著' => '揉着',
-'揉著書' => '揉著书',
 '揉著书' => '揉著书',
+'揉著書' => '揉著书',
 '揉著作' => '揉著作',
 '揉著名' => '揉著名',
-'揉著錄' => '揉著录',
 '揉著录' => '揉著录',
-'揉著稱' => '揉著称',
+'揉著錄' => '揉著录',
 '揉著称' => '揉著称',
+'揉著稱' => '揉著称',
 '揉著者' => '揉著者',
 '揉著述' => '揉著述',
 '提著' => '提着',
@@ -14574,14 +14576,14 @@ $zh2Hans = array(
 '擺著述' => '摆著述',
 '撰著' => '撰著',
 '撼著' => '撼着',
-'撼著书' => '撼著书',
 '撼著書' => '撼著书',
+'撼著书' => '撼著书',
 '撼著作' => '撼著作',
 '撼著名' => '撼著名',
-'撼著录' => '撼著录',
 '撼著錄' => '撼著录',
-'撼著稱' => '撼著称',
+'撼著录' => '撼著录',
 '撼著称' => '撼著称',
+'撼著稱' => '撼著称',
 '撼著者' => '撼著者',
 '撼著述' => '撼著述',
 '敞著' => '敞着',
@@ -14589,8 +14591,8 @@ $zh2Hans = array(
 '敞著名' => '敞著名',
 '敞著錄' => '敞著录',
 '敞著录' => '敞著录',
-'敞著称' => '敞著称',
 '敞著稱' => '敞著称',
+'敞著称' => '敞著称',
 '敞著者' => '敞著者',
 '敞著述' => '敞著述',
 '數著' => '数着',
@@ -14616,10 +14618,10 @@ $zh2Hans = array(
 '斥著书' => '斥著书',
 '斥著作' => '斥著作',
 '斥著名' => '斥著名',
-'斥著录' => '斥著录',
 '斥著錄' => '斥著录',
-'斥著称' => '斥著称',
+'斥著录' => '斥著录',
 '斥著稱' => '斥著称',
+'斥著称' => '斥著称',
 '斥著者' => '斥著者',
 '斥著述' => '斥著述',
 '新著' => '新著',
@@ -14638,8 +14640,8 @@ $zh2Hans = array(
 '於志賀' => '於志贺',
 '於志贺' => '於志贺',
 '於戲' => '於戏',
-'於梨华' => '於梨华',
 '於梨華' => '於梨华',
+'於梨华' => '於梨华',
 '於氏' => '於氏',
 '於潛縣' => '於潜县',
 '於潜县' => '於潜县',
@@ -14647,34 +14649,34 @@ $zh2Hans = array(
 '於菟' => '於菟',
 '於賢德' => '於贤德',
 '於除鞬' => '於除鞬',
-'旋乾轉坤' => '旋乾转坤',
 '旋乾转坤' => '旋乾转坤',
+'旋乾轉坤' => '旋乾转坤',
 '曠若發矇' => '旷若发矇',
 '昂著' => '昂着',
 '昂著书' => '昂著书',
 '昂著書' => '昂著书',
 '昂著作' => '昂著作',
 '昂著名' => '昂著名',
-'昂著录' => '昂著录',
 '昂著錄' => '昂著录',
+'昂著录' => '昂著录',
 '昂著稱' => '昂著称',
 '昂著称' => '昂著称',
 '昂著者' => '昂著者',
 '昂著述' => '昂著述',
 '易·乾' => '易·乾',
-'易经·乾' => '易经·乾',
 '易經·乾' => '易经·乾',
+'易经·乾' => '易经·乾',
 '易經乾' => '易经乾',
 '易经乾' => '易经乾',
 '映著' => '映着',
-'映著书' => '映著书',
 '映著書' => '映著书',
+'映著书' => '映著书',
 '映著作' => '映著作',
 '映著名' => '映著名',
-'映著录' => '映著录',
 '映著錄' => '映著录',
-'映著称' => '映著称',
+'映著录' => '映著录',
 '映著稱' => '映著称',
+'映著称' => '映著称',
 '映著者' => '映著者',
 '映著述' => '映著述',
 '昭著' => '昭著',
@@ -14683,15 +14685,15 @@ $zh2Hans = array(
 '晃著' => '晃着',
 '晃著作' => '晃著作',
 '晃著名' => '晃著名',
-'晃著录' => '晃著录',
 '晃著錄' => '晃著录',
-'晃著稱' => '晃著称',
+'晃著录' => '晃著录',
 '晃著称' => '晃著称',
+'晃著稱' => '晃著称',
 '晃著者' => '晃著者',
 '晃著述' => '晃著述',
 '暗著' => '暗着',
-'暗著書' => '暗著书',
 '暗著书' => '暗著书',
+'暗著書' => '暗著书',
 '暗著作' => '暗著作',
 '暗著名' => '暗著名',
 '暗著錄' => '暗著录',
@@ -14705,17 +14707,17 @@ $zh2Hans = array(
 '有著书' => '有著书',
 '有著作' => '有著作',
 '有著名' => '有著名',
-'有著录' => '有著录',
 '有著錄' => '有著录',
-'有著稱' => '有著称',
+'有著录' => '有著录',
 '有著称' => '有著称',
+'有著稱' => '有著称',
 '有著者' => '有著者',
 '有著述' => '有著述',
 '望著' => '望着',
 '望著作' => '望著作',
 '望著名' => '望著名',
-'望著錄' => '望著录',
 '望著录' => '望著录',
+'望著錄' => '望著录',
 '望著稱' => '望著称',
 '望著称' => '望著称',
 '望著者' => '望著者',
@@ -14724,21 +14726,21 @@ $zh2Hans = array(
 '朝著' => '朝着',
 '朝著作' => '朝著作',
 '朝著名' => '朝著名',
-'朝著錄' => '朝著录',
 '朝著录' => '朝著录',
-'朝著称' => '朝著称',
+'朝著錄' => '朝著录',
 '朝著稱' => '朝著称',
+'朝著称' => '朝著称',
 '朝著者' => '朝著者',
 '朝著述' => '朝著述',
 '本著' => '本着',
-'本著書' => '本著书',
 '本著书' => '本著书',
+'本著書' => '本著书',
 '本著作' => '本著作',
 '本著名' => '本著名',
-'本著錄' => '本著录',
 '本著录' => '本著录',
-'本著称' => '本著称',
+'本著錄' => '本著录',
 '本著稱' => '本著称',
+'本著称' => '本著称',
 '本著者' => '本著者',
 '本著述' => '本著述',
 '朴於宇同' => '朴於宇同',
@@ -14759,8 +14761,8 @@ $zh2Hans = array(
 '雜著者' => '杂著者',
 '雜著述' => '杂著述',
 '李乾德' => '李乾德',
-'李乾顺' => '李乾顺',
 '李乾順' => '李乾顺',
+'李乾顺' => '李乾顺',
 '李澤鉅' => '李泽钜',
 '來著' => '来着',
 '來著書' => '来著书',
@@ -14776,8 +14778,8 @@ $zh2Hans = array(
 '枕著名' => '枕著名',
 '枕著錄' => '枕著录',
 '枕著录' => '枕著录',
-'枕著称' => '枕著称',
 '枕著稱' => '枕著称',
+'枕著称' => '枕著称',
 '枕著者' => '枕著者',
 '枕著述' => '枕著述',
 '柳詒徵' => '柳诒徵',
@@ -14849,17 +14851,17 @@ $zh2Hans = array(
 '活著名' => '活著名',
 '活著录' => '活著录',
 '活著錄' => '活著录',
-'活著称' => '活著称',
 '活著稱' => '活著称',
+'活著称' => '活著称',
 '活著者' => '活著者',
 '活著述' => '活著述',
 '流著' => '流着',
-'流著書' => '流著书',
 '流著书' => '流著书',
+'流著書' => '流著书',
 '流著作' => '流著作',
 '流著名' => '流著名',
-'流著錄' => '流著录',
 '流著录' => '流著录',
+'流著錄' => '流著录',
 '流著稱' => '流著称',
 '流著称' => '流著称',
 '流著者' => '流著者',
@@ -14872,8 +14874,8 @@ $zh2Hans = array(
 '浮著名' => '浮著名',
 '浮著录' => '浮著录',
 '浮著錄' => '浮著录',
-'浮著称' => '浮著称',
 '浮著稱' => '浮著称',
+'浮著称' => '浮著称',
 '浮著者' => '浮著者',
 '浮著述' => '浮著述',
 '潤著' => '润着',
@@ -14889,10 +14891,10 @@ $zh2Hans = array(
 '涵著書' => '涵著书',
 '涵著作' => '涵著作',
 '涵著名' => '涵著名',
-'涵著錄' => '涵著录',
 '涵著录' => '涵著录',
-'涵著称' => '涵著称',
+'涵著錄' => '涵著录',
 '涵著稱' => '涵著称',
+'涵著称' => '涵著称',
 '涵著者' => '涵著者',
 '涵著述' => '涵著述',
 '渴著' => '渴着',
@@ -14902,8 +14904,8 @@ $zh2Hans = array(
 '渴著名' => '渴著名',
 '渴著录' => '渴著录',
 '渴著錄' => '渴著录',
-'渴著稱' => '渴著称',
 '渴著称' => '渴著称',
+'渴著稱' => '渴著称',
 '渴著者' => '渴著者',
 '渴著述' => '渴著述',
 '溢著' => '溢着',
@@ -14924,8 +14926,8 @@ $zh2Hans = array(
 '演著名' => '演著名',
 '演著录' => '演著录',
 '演著錄' => '演著录',
-'演著称' => '演著称',
 '演著稱' => '演著称',
+'演著称' => '演著称',
 '演著者' => '演著者',
 '演著述' => '演著述',
 '漫著' => '漫着',
@@ -14933,8 +14935,8 @@ $zh2Hans = array(
 '漫著书' => '漫著书',
 '漫著作' => '漫著作',
 '漫著名' => '漫著名',
-'漫著錄' => '漫著录',
 '漫著录' => '漫著录',
+'漫著錄' => '漫著录',
 '漫著称' => '漫著称',
 '漫著稱' => '漫著称',
 '漫著者' => '漫著者',
@@ -14954,14 +14956,14 @@ $zh2Hans = array(
 '燒著者' => '烧著者',
 '燒著述' => '烧著述',
 '照著' => '照着',
-'照著書' => '照著书',
 '照著书' => '照著书',
+'照著書' => '照著书',
 '照著作' => '照著作',
 '照著名' => '照著名',
-'照著錄' => '照著录',
 '照著录' => '照著录',
-'照著稱' => '照著称',
+'照著錄' => '照著录',
 '照著称' => '照著称',
+'照著稱' => '照著称',
 '照著者' => '照著者',
 '照著述' => '照著述',
 '愛護著' => '爱护着',
@@ -14995,8 +14997,8 @@ $zh2Hans = array(
 '猜著書' => '猜着书',
 '猜著作' => '猜著作',
 '猜著名' => '猜著名',
-'猜著录' => '猜著录',
 '猜著錄' => '猜著录',
+'猜著录' => '猜著录',
 '猜著称' => '猜著称',
 '猜著稱' => '猜著称',
 '猜著者' => '猜著者',
@@ -15008,8 +15010,8 @@ $zh2Hans = array(
 '甜著书' => '甜著书',
 '甜著作' => '甜著作',
 '甜著名' => '甜著名',
-'甜著錄' => '甜著录',
 '甜著录' => '甜著录',
+'甜著錄' => '甜著录',
 '甜著稱' => '甜著称',
 '甜著称' => '甜著称',
 '甜著者' => '甜著者',
@@ -15027,12 +15029,12 @@ $zh2Hans = array(
 '用著稱' => '用著称',
 '用著者' => '用著者',
 '用著述' => '用著述',
-'男為乾' => '男为乾',
-'男爲乾' => '男为乾',
 '男为乾' => '男为乾',
+'男爲乾' => '男为乾',
+'男為乾' => '男为乾',
 '男性為乾' => '男性为乾',
-'男性为乾' => '男性为乾',
 '男性爲乾' => '男性为乾',
+'男性为乾' => '男性为乾',
 '留著' => '留着',
 '留著書' => '留着书',
 '留著作' => '留著作',
@@ -15064,12 +15066,12 @@ $zh2Hans = array(
 '皺著者' => '皱著者',
 '皺著述' => '皱著述',
 '盛著' => '盛着',
-'盛著書' => '盛著书',
 '盛著书' => '盛著书',
+'盛著書' => '盛著书',
 '盛著作' => '盛著作',
 '盛著名' => '盛著名',
-'盛著录' => '盛著录',
 '盛著錄' => '盛著录',
+'盛著录' => '盛著录',
 '盛著稱' => '盛著称',
 '盛著称' => '盛著称',
 '盛著者' => '盛著者',
@@ -15085,14 +15087,14 @@ $zh2Hans = array(
 '盯著者' => '盯著者',
 '盯著述' => '盯著述',
 '盾著' => '盾着',
-'盾著书' => '盾著书',
 '盾著書' => '盾著书',
+'盾著书' => '盾著书',
 '盾著作' => '盾著作',
 '盾著名' => '盾著名',
-'盾著录' => '盾著录',
 '盾著錄' => '盾著录',
-'盾著称' => '盾著称',
+'盾著录' => '盾著录',
 '盾著稱' => '盾著称',
+'盾著称' => '盾著称',
 '盾著者' => '盾著者',
 '盾著述' => '盾著述',
 '看不著' => '看不着',
@@ -15103,8 +15105,8 @@ $zh2Hans = array(
 '看著名' => '看著名',
 '看著录' => '看著录',
 '看著錄' => '看著录',
-'看著称' => '看著称',
 '看著稱' => '看著称',
+'看著称' => '看著称',
 '看著者' => '看著者',
 '看著述' => '看著述',
 '著業' => '着业',
@@ -15212,14 +15214,14 @@ $zh2Hans = array(
 '睡不著' => '睡不着',
 '睡得著' => '睡得着',
 '睡著' => '睡着',
-'睡著书' => '睡著书',
 '睡著書' => '睡著书',
+'睡著书' => '睡著书',
 '睡著作' => '睡著作',
 '睡著名' => '睡著名',
-'睡著录' => '睡著录',
 '睡著錄' => '睡著录',
-'睡著稱' => '睡著称',
+'睡著录' => '睡著录',
 '睡著称' => '睡著称',
+'睡著稱' => '睡著称',
 '睡著者' => '睡著者',
 '睡著述' => '睡著述',
 '睹微知著' => '睹微知著',
@@ -15247,8 +15249,8 @@ $zh2Hans = array(
 '瞪著书' => '瞪著书',
 '瞪著作' => '瞪著作',
 '瞪著名' => '瞪著名',
-'瞪著录' => '瞪著录',
 '瞪著錄' => '瞪著录',
+'瞪著录' => '瞪著录',
 '瞪著称' => '瞪著称',
 '瞪著稱' => '瞪著称',
 '瞪著者' => '瞪著者',
@@ -15261,10 +15263,10 @@ $zh2Hans = array(
 '福著書' => '福著书',
 '福著作' => '福著作',
 '福著名' => '福著名',
-'福著录' => '福著录',
 '福著錄' => '福著录',
-'福著称' => '福著称',
+'福著录' => '福著录',
 '福著稱' => '福著称',
+'福著称' => '福著称',
 '福著者' => '福著者',
 '福著述' => '福著述',
 '穀梁' => '穀梁',
@@ -15275,17 +15277,17 @@ $zh2Hans = array(
 '空著名' => '空著名',
 '空著录' => '空著录',
 '空著錄' => '空著录',
-'空著稱' => '空著称',
 '空著称' => '空著称',
+'空著稱' => '空著称',
 '空著者' => '空著者',
 '空著述' => '空著述',
 '穿著' => '穿着',
-'穿著書' => '穿著书',
 '穿著书' => '穿著书',
+'穿著書' => '穿著书',
 '穿著作' => '穿著作',
 '穿著名' => '穿著名',
-'穿著錄' => '穿著录',
 '穿著录' => '穿著录',
+'穿著錄' => '穿著录',
 '穿著称' => '穿著称',
 '穿著稱' => '穿著称',
 '穿著者' => '穿著者',
@@ -15299,14 +15301,14 @@ $zh2Hans = array(
 '豎著者' => '竖著者',
 '豎著述' => '竖著述',
 '站著' => '站着',
-'站著書' => '站著书',
 '站著书' => '站著书',
+'站著書' => '站著书',
 '站著作' => '站著作',
 '站著名' => '站著名',
-'站著录' => '站著录',
 '站著錄' => '站著录',
-'站著稱' => '站著称',
+'站著录' => '站著录',
 '站著称' => '站著称',
+'站著稱' => '站著称',
 '站著者' => '站著者',
 '站著述' => '站著述',
 '笑著' => '笑着',
@@ -15316,8 +15318,8 @@ $zh2Hans = array(
 '笑著名' => '笑著名',
 '笑著录' => '笑著录',
 '笑著錄' => '笑著录',
-'笑著稱' => '笑著称',
 '笑著称' => '笑著称',
+'笑著稱' => '笑著称',
 '笑著者' => '笑著者',
 '笑著述' => '笑著述',
 '答覆' => '答复',
@@ -15328,8 +15330,8 @@ $zh2Hans = array(
 '管著名' => '管著名',
 '管著录' => '管著录',
 '管著錄' => '管著录',
-'管著称' => '管著称',
 '管著稱' => '管著称',
+'管著称' => '管著称',
 '管著者' => '管著者',
 '管著述' => '管著述',
 '米澤瑠美' => '米泽瑠美',
@@ -15362,34 +15364,34 @@ $zh2Hans = array(
 '纏著者' => '缠著者',
 '纏著述' => '缠著述',
 '罩著' => '罩着',
-'罩著書' => '罩著书',
 '罩著书' => '罩著书',
+'罩著書' => '罩著书',
 '罩著作' => '罩著作',
 '罩著名' => '罩著名',
-'罩著录' => '罩著录',
 '罩著錄' => '罩著录',
-'罩著稱' => '罩著称',
+'罩著录' => '罩著录',
 '罩著称' => '罩著称',
+'罩著稱' => '罩著称',
 '罩著者' => '罩著者',
 '罩著述' => '罩著述',
 '美著' => '美着',
-'美著書' => '美著书',
 '美著书' => '美著书',
+'美著書' => '美著书',
 '美著作' => '美著作',
 '美著名' => '美著名',
-'美著錄' => '美著录',
 '美著录' => '美著录',
+'美著錄' => '美著录',
 '美著稱' => '美著称',
 '美著称' => '美著称',
 '美著者' => '美著者',
 '美著述' => '美著述',
 '耀著' => '耀着',
-'耀著书' => '耀著书',
 '耀著書' => '耀著书',
+'耀著书' => '耀著书',
 '耀著作' => '耀著作',
 '耀著名' => '耀著名',
-'耀著录' => '耀著录',
 '耀著錄' => '耀著录',
+'耀著录' => '耀著录',
 '耀著称' => '耀著称',
 '耀著稱' => '耀著称',
 '耀著者' => '耀著者',
@@ -15415,8 +15417,8 @@ $zh2Hans = array(
 '背著名' => '背著名',
 '背著录' => '背著录',
 '背著錄' => '背著录',
-'背著稱' => '背著称',
 '背著称' => '背著称',
+'背著稱' => '背著称',
 '背著者' => '背著者',
 '背著述' => '背著述',
 '膠著' => '胶着',
@@ -15436,18 +15438,18 @@ $zh2Hans = array(
 '藝著者' => '艺著者',
 '藝著述' => '艺著述',
 '苦著' => '苦着',
-'苦著書' => '苦著书',
 '苦著书' => '苦著书',
+'苦著書' => '苦著书',
 '苦著作' => '苦著作',
 '苦著名' => '苦著名',
-'苦著錄' => '苦著录',
 '苦著录' => '苦著录',
-'苦著称' => '苦著称',
+'苦著錄' => '苦著录',
 '苦著稱' => '苦著称',
+'苦著称' => '苦著称',
 '苦著者' => '苦著者',
 '苦著述' => '苦著述',
-'薴烯' => '苧烯',
 '苧烯' => '苧烯',
+'薴烯' => '苧烯',
 '獲著' => '获着',
 '獲著書' => '获著书',
 '獲著作' => '获著作',
@@ -15465,8 +15467,8 @@ $zh2Hans = array(
 '落著名' => '落著名',
 '落著录' => '落著录',
 '落著錄' => '落著录',
-'落著称' => '落著称',
 '落著稱' => '落著称',
+'落著称' => '落著称',
 '落著者' => '落著者',
 '落著述' => '落著述',
 '著書' => '著书',
@@ -15483,14 +15485,14 @@ $zh2Hans = array(
 '蒙汗葯' => '蒙汗药',
 '蒙著' => '蒙着',
 '蒙葯' => '蒙药',
-'蒙著书' => '蒙著书',
 '蒙著書' => '蒙著书',
+'蒙著书' => '蒙著书',
 '蒙著作' => '蒙著作',
 '蒙著名' => '蒙著名',
 '蒙著录' => '蒙著录',
 '蒙著錄' => '蒙著录',
-'蒙著称' => '蒙著称',
 '蒙著稱' => '蒙著称',
+'蒙著称' => '蒙著称',
 '蒙著者' => '蒙著者',
 '蒙著述' => '蒙著述',
 '藏著' => '藏着',
@@ -15500,19 +15502,19 @@ $zh2Hans = array(
 '藏著名' => '藏著名',
 '藏著錄' => '藏著录',
 '藏著录' => '藏著录',
-'藏著稱' => '藏著称',
 '藏著称' => '藏著称',
+'藏著稱' => '藏著称',
 '藏著者' => '藏著者',
 '藏著述' => '藏著述',
 '蘸著' => '蘸着',
-'蘸著书' => '蘸著书',
 '蘸著書' => '蘸著书',
+'蘸著书' => '蘸著书',
 '蘸著作' => '蘸著作',
 '蘸著名' => '蘸著名',
 '蘸著录' => '蘸著录',
 '蘸著錄' => '蘸著录',
-'蘸著称' => '蘸著称',
 '蘸著稱' => '蘸著称',
+'蘸著称' => '蘸著称',
 '蘸著者' => '蘸著者',
 '蘸著述' => '蘸著述',
 '行著' => '行着',
@@ -15520,19 +15522,19 @@ $zh2Hans = array(
 '行著書' => '行著书',
 '行著作' => '行著作',
 '行著名' => '行著名',
-'行著錄' => '行著录',
 '行著录' => '行著录',
-'行著称' => '行著称',
+'行著錄' => '行著录',
 '行著稱' => '行著称',
+'行著称' => '行著称',
 '行著者' => '行著者',
 '行著述' => '行著述',
 '衣著' => '衣着',
-'衣著書' => '衣著书',
 '衣著书' => '衣著书',
+'衣著書' => '衣著书',
 '衣著作' => '衣著作',
 '衣著名' => '衣著名',
-'衣著錄' => '衣著录',
 '衣著录' => '衣著录',
+'衣著錄' => '衣著录',
 '衣著稱' => '衣著称',
 '衣著称' => '衣著称',
 '衣著者' => '衣著者',
@@ -15546,14 +15548,14 @@ $zh2Hans = array(
 '裝著者' => '装著者',
 '裝著述' => '装著述',
 '裹著' => '裹着',
-'裹著书' => '裹著书',
 '裹著書' => '裹著书',
+'裹著书' => '裹著书',
 '裹著作' => '裹著作',
 '裹著名' => '裹著名',
 '裹著录' => '裹著录',
 '裹著錄' => '裹著录',
-'裹著稱' => '裹著称',
 '裹著称' => '裹著称',
+'裹著稱' => '裹著称',
 '裹著者' => '裹著者',
 '裹著述' => '裹著述',
 '覆蓋' => '覆蓋',
@@ -15602,8 +15604,8 @@ $zh2Hans = array(
 '豫著名' => '豫著名',
 '豫著录' => '豫著录',
 '豫著錄' => '豫著录',
-'豫著稱' => '豫著称',
 '豫著称' => '豫著称',
+'豫著稱' => '豫著称',
 '豫著者' => '豫著者',
 '豫著述' => '豫著述',
 '貞著' => '贞着',
@@ -15615,14 +15617,14 @@ $zh2Hans = array(
 '貞著者' => '贞著者',
 '貞著述' => '贞著述',
 '走著' => '走着',
-'走著书' => '走著书',
 '走著書' => '走著书',
+'走著书' => '走著书',
 '走著作' => '走著作',
 '走著名' => '走著名',
-'走著录' => '走著录',
 '走著錄' => '走著录',
-'走著称' => '走著称',
+'走著录' => '走著录',
 '走著稱' => '走著称',
+'走著称' => '走著称',
 '走著者' => '走著者',
 '走著述' => '走著述',
 '趕著' => '赶着',
@@ -15638,8 +15640,8 @@ $zh2Hans = array(
 '趴著书' => '趴著书',
 '趴著作' => '趴著作',
 '趴著名' => '趴著名',
-'趴著錄' => '趴著录',
 '趴著录' => '趴著录',
+'趴著錄' => '趴著录',
 '趴著称' => '趴著称',
 '趴著稱' => '趴著称',
 '趴著者' => '趴著者',
@@ -15657,8 +15659,8 @@ $zh2Hans = array(
 '跑著书' => '跑著书',
 '跑著作' => '跑著作',
 '跑著名' => '跑著名',
-'跑著錄' => '跑著录',
 '跑著录' => '跑著录',
+'跑著錄' => '跑著录',
 '跑著稱' => '跑著称',
 '跑著称' => '跑著称',
 '跑著者' => '跑著者',
@@ -15670,28 +15672,28 @@ $zh2Hans = array(
 '跟著名' => '跟著名',
 '跟著录' => '跟著录',
 '跟著錄' => '跟著录',
-'跟著稱' => '跟著称',
 '跟著称' => '跟著称',
+'跟著稱' => '跟著称',
 '跟著者' => '跟著者',
 '跟著述' => '跟著述',
 '跪著' => '跪着',
-'跪著书' => '跪著书',
 '跪著書' => '跪著书',
+'跪著书' => '跪著书',
 '跪著作' => '跪著作',
 '跪著名' => '跪著名',
-'跪著录' => '跪著录',
 '跪著錄' => '跪著录',
+'跪著录' => '跪著录',
 '跪著稱' => '跪著称',
 '跪著称' => '跪著称',
 '跪著者' => '跪著者',
 '跪著述' => '跪著述',
 '跳著' => '跳着',
-'跳著書' => '跳著书',
 '跳著书' => '跳著书',
+'跳著書' => '跳著书',
 '跳著作' => '跳著作',
 '跳著名' => '跳著名',
-'跳著錄' => '跳著录',
 '跳著录' => '跳著录',
+'跳著錄' => '跳著录',
 '跳著称' => '跳著称',
 '跳著稱' => '跳著称',
 '跳著者' => '跳著者',
@@ -15704,13 +15706,13 @@ $zh2Hans = array(
 '踏著名' => '踏著名',
 '踏著錄' => '踏著录',
 '踏著录' => '踏著录',
-'踏著稱' => '踏著称',
 '踏著称' => '踏著称',
+'踏著稱' => '踏著称',
 '踏著者' => '踏著者',
 '踏著述' => '踏著述',
 '踩著' => '踩着',
-'踩著書' => '踩著书',
 '踩著书' => '踩著书',
+'踩著書' => '踩著书',
 '踩著作' => '踩著作',
 '踩著名' => '踩著名',
 '踩著录' => '踩著录',
@@ -15720,12 +15722,12 @@ $zh2Hans = array(
 '踩著者' => '踩著者',
 '踩著述' => '踩著述',
 '身著' => '身着',
-'身著書' => '身著书',
 '身著书' => '身著书',
+'身著書' => '身著书',
 '身著作' => '身著作',
 '身著名' => '身著名',
-'身著錄' => '身著录',
 '身著录' => '身著录',
+'身著錄' => '身著录',
 '身著稱' => '身著称',
 '身著称' => '身著称',
 '身著者' => '身著者',
@@ -15737,8 +15739,8 @@ $zh2Hans = array(
 '躺著名' => '躺著名',
 '躺著錄' => '躺著录',
 '躺著录' => '躺著录',
-'躺著稱' => '躺著称',
 '躺著称' => '躺著称',
+'躺著稱' => '躺著称',
 '躺著者' => '躺著者',
 '躺著述' => '躺著述',
 '轉著' => '转着',
@@ -15787,34 +15789,34 @@ $zh2Hans = array(
 '連著述' => '连著述',
 '迫著' => '迫着',
 '追著' => '追着',
-'追著书' => '追著书',
 '追著書' => '追著书',
+'追著书' => '追著书',
 '追著作' => '追著作',
 '追著名' => '追著名',
-'追著录' => '追著录',
 '追著錄' => '追著录',
+'追著录' => '追著录',
 '追著称' => '追著称',
 '追著稱' => '追著称',
 '追著者' => '追著者',
 '追著述' => '追著述',
 '逆著' => '逆着',
-'逆著书' => '逆著书',
 '逆著書' => '逆著书',
+'逆著书' => '逆著书',
 '逆著作' => '逆著作',
 '逆著名' => '逆著名',
-'逆著录' => '逆著录',
 '逆著錄' => '逆著录',
-'逆著稱' => '逆著称',
+'逆著录' => '逆著录',
 '逆著称' => '逆著称',
+'逆著稱' => '逆著称',
 '逆著者' => '逆著者',
 '逆著述' => '逆著述',
 '逼著' => '逼着',
-'逼著书' => '逼著书',
 '逼著書' => '逼著书',
+'逼著书' => '逼著书',
 '逼著作' => '逼著作',
 '逼著名' => '逼著名',
-'逼著录' => '逼著录',
 '逼著錄' => '逼著录',
+'逼著录' => '逼著录',
 '逼著称' => '逼著称',
 '逼著稱' => '逼著称',
 '逼著者' => '逼著者',
@@ -15840,8 +15842,8 @@ $zh2Hans = array(
 '配著名' => '配著名',
 '配著錄' => '配著录',
 '配著录' => '配著录',
-'配著称' => '配著称',
 '配著稱' => '配著称',
+'配著称' => '配著称',
 '配著者' => '配著者',
 '配著述' => '配著述',
 '釀著' => '酿着',
@@ -15852,14 +15854,14 @@ $zh2Hans = array(
 '釀著稱' => '酿著称',
 '釀著者' => '酿著者',
 '釀著述' => '酿著述',
-'醯壶' => '醯壶',
 '醯壺' => '醯壶',
+'醯壶' => '醯壶',
 '醯醬' => '醯酱',
 '醯酱' => '醯酱',
 '醯醋' => '醯醋',
 '醯醢' => '醯醢',
-'醯雞' => '醯鸡',
 '醯鸡' => '醯鸡',
+'醯雞' => '醯鸡',
 '重覆' => '重复',
 '金鍊' => '金链',
 '鐵鍊' => '铁链',
@@ -15901,8 +15903,8 @@ $zh2Hans = array(
 '聞得著' => '闻得着',
 '聞著' => '闻着',
 '阳为乾' => '阳为乾',
-'陽為乾' => '阳为乾',
 '陽爲乾' => '阳为乾',
+'陽為乾' => '阳为乾',
 '阿部正瞭' => '阿部正瞭',
 '附著' => '附着',
 '附睪' => '附睾',
@@ -15910,36 +15912,36 @@ $zh2Hans = array(
 '附著書' => '附著书',
 '附著作' => '附著作',
 '附著名' => '附著名',
-'附著录' => '附著录',
 '附著錄' => '附著录',
+'附著录' => '附著录',
 '附著称' => '附著称',
 '附著稱' => '附著称',
 '附著者' => '附著者',
 '附著述' => '附著述',
-'陳乾生' => '陈乾生',
 '陈乾生' => '陈乾生',
-'陳公乾生' => '陈公乾生',
+'陳乾生' => '陈乾生',
 '陈公乾生' => '陈公乾生',
+'陳公乾生' => '陈公乾生',
 '陋著' => '陋着',
-'陋著书' => '陋著书',
 '陋著書' => '陋著书',
+'陋著书' => '陋著书',
 '陋著作' => '陋著作',
 '陋著名' => '陋著名',
-'陋著录' => '陋著录',
 '陋著錄' => '陋著录',
-'陋著稱' => '陋著称',
+'陋著录' => '陋著录',
 '陋著称' => '陋著称',
+'陋著稱' => '陋著称',
 '陋著者' => '陋著者',
 '陋著述' => '陋著述',
 '陪著' => '陪着',
-'陪著書' => '陪著书',
 '陪著书' => '陪著书',
+'陪著書' => '陪著书',
 '陪著作' => '陪著作',
 '陪著名' => '陪著名',
-'陪著錄' => '陪著录',
 '陪著录' => '陪著录',
-'陪著稱' => '陪著称',
+'陪著錄' => '陪著录',
 '陪著称' => '陪著称',
+'陪著稱' => '陪著称',
 '陪著者' => '陪著者',
 '陪著述' => '陪著述',
 '陳堵' => '陳堵',
@@ -15953,26 +15955,26 @@ $zh2Hans = array(
 '隨著者' => '随著者',
 '隨著述' => '随著述',
 '隔著' => '隔着',
-'隔著書' => '隔著书',
 '隔著书' => '隔著书',
+'隔著書' => '隔著书',
 '隔著作' => '隔著作',
 '隔著名' => '隔著名',
-'隔著錄' => '隔著录',
 '隔著录' => '隔著录',
+'隔著錄' => '隔著录',
 '隔著称' => '隔著称',
 '隔著稱' => '隔著称',
 '隔著者' => '隔著者',
 '隔著述' => '隔著述',
 '隱睪' => '隱睾',
 '雅著' => '雅着',
-'雅著書' => '雅著书',
 '雅著书' => '雅著书',
+'雅著書' => '雅著书',
 '雅著作' => '雅著作',
 '雅著名' => '雅著名',
-'雅著錄' => '雅著录',
 '雅著录' => '雅著录',
-'雅著稱' => '雅著称',
+'雅著錄' => '雅著录',
 '雅著称' => '雅著称',
+'雅著稱' => '雅著称',
 '雅著者' => '雅著者',
 '雅著述' => '雅著述',
 '雍乾' => '雍乾',
@@ -15981,8 +15983,8 @@ $zh2Hans = array(
 '靠著名' => '靠著名',
 '靠著錄' => '靠著录',
 '靠著录' => '靠著录',
-'靠著称' => '靠著称',
 '靠著稱' => '靠著称',
+'靠著称' => '靠著称',
 '靠著者' => '靠著者',
 '靠著述' => '靠著述',
 '頂著' => '顶着',
@@ -16063,8 +16065,8 @@ $zh2Hans = array(
 '高著者' => '高著者',
 '高著述' => '高著述',
 '髭著' => '髭着',
-'髭著書' => '髭著书',
 '髭著书' => '髭著书',
+'髭著書' => '髭著书',
 '髭著作' => '髭著作',
 '髭著名' => '髭著名',
 '髭著錄' => '髭著录',
@@ -16078,17 +16080,17 @@ $zh2Hans = array(
 '魏徵' => '魏徵',
 '魚乾乾' => '鱼干干',
 '麯崇裕' => '麯崇裕',
-'麴义' => '麴义',
 '麴義' => '麴义',
+'麴义' => '麴义',
 '麴英' => '麴英',
 '麽氏' => '麽氏',
-'麼麼' => '麽麽',
 '麽麽' => '麽麽',
+'麼麼' => '麽麽',
 '黄润乾' => '黄润乾',
 '黃潤乾' => '黄润乾',
 '黏著' => '黏着',
-'黏著書' => '黏著书',
 '黏著书' => '黏著书',
+'黏著書' => '黏著书',
 '黏著作' => '黏著作',
 '黏著名' => '黏著名',
 '黏著录' => '黏著录',
@@ -16104,23 +16106,23 @@ $zh2TW = array(
 '”' => '」',
 '‘' => '『',
 '’' => '』',
-'三极管' => '三極體',
 '三極管' => '三極體',
+'三极管' => '三極體',
 '世界裏' => '世界裡',
 '中文裏' => '中文裡',
 '串行' => '串列',
 '串列加速器' => '串列加速器',
 '以太网' => '乙太網',
 '奶酪' => '乳酪',
-'二极管' => '二極體',
 '二極管' => '二極體',
+'二极管' => '二極體',
 '交互式' => '互動式',
 '阿塞拜疆' => '亞塞拜然',
 '人工智能' => '人工智慧',
 '接口' => '介面',
 '服务器' => '伺服器',
-'字节' => '位元組',
 '字節' => '位元組',
+'字节' => '位元組',
 '作品裏' => '作品裡',
 '信道' => '信道',
 '优先级' => '優先順序',
@@ -16135,20 +16137,20 @@ $zh2TW = array(
 '冬日裏' => '冬日裡',
 '凉菜' => '冷盤',
 '冷菜' => '冷盤',
-'兇器' => '凶器',
 '凶器' => '凶器',
-'å\85\87å¾\92' => 'å\87¶å¾\92',
+'å\85\87å\99¨' => 'å\87¶å\99¨',
 '凶徒' => '凶徒',
+'兇徒' => '凶徒',
 '兇手' => '凶手',
 '凶手' => '凶手',
-'凶案' => '凶案',
 '兇案' => '凶案',
-'å\85\87æ®\98' => 'å\87¶æ®\98',
+'å\87¶æ¡\88' => 'å\87¶æ¡\88',
 '凶殘' => '凶殘',
+'兇殘' => '凶殘',
 '凶残' => '凶殘',
 '兇殺' => '凶殺',
-'凶殺' => '凶殺',
 '凶杀' => '凶殺',
+'凶殺' => '凶殺',
 '打印' => '列印',
 '列支敦士登' => '列支敦斯登',
 '剪彩' => '剪綵',
@@ -16158,10 +16160,10 @@ $zh2TW = array(
 '特立尼達和多巴哥' => '千里達托貝哥',
 '特立尼达和托巴哥' => '千里達托貝哥',
 '半角' => '半形',
-'卡塔尔' => '卡達',
 '卡塔爾' => '卡達',
-'打印机' => '印表機',
+'卡塔尔' => '卡達',
 '打印機' => '印表機',
+'打印机' => '印表機',
 '厄立特里亚' => '厄利垂亞',
 '厄立特里亞' => '厄利垂亞',
 '厄瓜多尔' => '厄瓜多',
@@ -16176,17 +16178,17 @@ $zh2TW = array(
 '哈萨克斯坦' => '哈薩克',
 '哥斯達黎加' => '哥斯大黎加',
 '哥斯达黎加' => '哥斯大黎加',
-'格鲁吉亚' => '喬治亞',
 '格魯吉亞' => '喬治亞',
-'佐治亞' => '喬治亞',
+'格鲁吉亚' => '喬治亞',
 '佐治亚' => '喬治亞',
+'佐治亞' => '喬治亞',
 '嘴裏' => '嘴裡',
 '土库曼斯坦' => '土庫曼',
 '薯仔' => '土豆',
 '土豆網' => '土豆網',
 '土豆网' => '土豆網',
-'坦桑尼亞' => '坦尚尼亞',
 '坦桑尼亚' => '坦尚尼亞',
+'坦桑尼亞' => '坦尚尼亞',
 '端口' => '埠',
 '塔吉克斯坦' => '塔吉克',
 '塞舌尔' => '塞席爾',
@@ -16201,63 +16203,63 @@ $zh2TW = array(
 '多明尼加國' => '多米尼克',
 '穿梭機' => '太空梭',
 '航天飞机' => '太空梭',
-'尼日利亞' => '奈及利亞',
 '尼日利亚' => '奈及利亞',
+'尼日利亞' => '奈及利亞',
 '字符' => '字元',
 '字号' => '字型大小',
 '字库' => '字型檔',
 '字符集' => '字符集',
 '存盘' => '存檔',
 '學裏' => '學裡',
-'安提瓜和巴布达' => '安地卡及巴布達',
 '安提瓜和巴布達' => '安地卡及巴布達',
+'安提瓜和巴布达' => '安地卡及巴布達',
 '宋元' => '宋元',
 '洪都拉斯' => '宏都拉斯',
 '寻址' => '定址',
 '寒假裏' => '寒假裡',
 '宽带' => '寬頻',
-'老挝' => '寮國',
 '老撾' => '寮國',
+'老挝' => '寮國',
 '打门' => '射門',
 '專輯裏' => '專輯裡',
-'赞比亚' => '尚比亞',
 '贊比亞' => '尚比亞',
-'尼日尔' => '尼日',
+'赞比亚' => '尚比亞',
 '尼日爾' => '尼日',
+'尼日尔' => '尼日',
 '山洞裏' => '山洞裡',
 '巴布亞新畿內亞' => '巴布亞紐幾內亞',
 '巴布亚新几内亚' => '巴布亞紐幾內亞',
 '巴巴多斯' => '巴貝多',
 '布基纳法索' => '布吉納法索',
 '布基納法索' => '布吉納法索',
-'布殊' => '布希',
 '布什' => '布希',
+'布殊' => '布希',
 '帕劳' => '帛琉',
 '例程' => '常式',
-'平治之亂' => '平治之亂',
 '平治之乱' => '平治之亂',
+'平治之亂' => '平治之亂',
 '年代裏' => '年代裡',
-'幾內亞比紹' => '幾內亞比索',
 '几内亚比绍' => '幾內亞比索',
+'幾內亞比紹' => '幾內亞比索',
 '彩带' => '彩帶',
 '彩排' => '彩排',
 '彩楼' => '彩樓',
 '彩牌楼' => '彩牌樓',
-'复苏' => '復甦',
 '復蘇' => '復甦',
+'复苏' => '復甦',
 '心裏' => '心裡',
-'闪存' => '快閃記憶體',
 '快闪存储器' => '快閃記憶體',
+'闪存' => '快閃記憶體',
 '想象' => '想像',
 '传感' => '感測',
 '习用' => '慣用',
 '戏彩娱亲' => '戲綵娛親',
 '戲裏' => '戲裡',
-'手电' => '手電筒',
 '手电筒' => '手電筒',
+'手电' => '手電筒',
 '括号' => '括弧',
-'拿破仑' => '拿破崙',
 '拿破侖' => '拿破崙',
+'拿破仑' => '拿破崙',
 '積架' => '捷豹',
 '扫瞄仪' => '掃瞄器',
 '挂钩' => '掛鉤',
@@ -16267,12 +16269,12 @@ $zh2TW = array(
 '桌球' => '撞球',
 '便携式' => '攜帶型',
 '故事裏' => '故事裡',
-'調制解調器' => '數據機',
 '调制解调器' => '數據機',
-'斯洛文尼亚' => '斯洛維尼亞',
+'調制解調器' => '數據機',
 '斯洛文尼亞' => '斯洛維尼亞',
-'æ\96°ç´\80å\85\83' => 'æ\96°ç´\80å\85\83',
+'æ\96¯æ´\9bæ\96\87å°¼äº\9a' => 'æ\96¯æ´\9b維尼äº\9e',
 '新纪元' => '新紀元',
+'新紀元' => '新紀元',
 '日子裏' => '日子裡',
 '春假裏' => '春假裡',
 '春天裏' => '春天裡',
@@ -16284,13 +16286,13 @@ $zh2TW = array(
 '乍得' => '查德',
 '克林頓' => '柯林頓',
 '克林顿' => '柯林頓',
-'格林纳达' => '格瑞那達',
 '格林納達' => '格瑞那達',
+'格林纳达' => '格瑞那達',
 '凡高' => '梵谷',
 '森林裏' => '森林裡',
 '棺材裏' => '棺材裡',
-'榴莲' => '榴槤',
 '榴蓮' => '榴槤',
+'榴莲' => '榴槤',
 '仿真' => '模擬',
 '毛里裘斯' => '模里西斯',
 '毛里求斯' => '模里西斯',
@@ -16301,15 +16303,15 @@ $zh2TW = array(
 '元音' => '母音',
 '永历' => '永曆',
 '文莱' => '汶萊',
-'沙地阿拉伯' => '沙烏地阿拉伯',
 '沙特阿拉伯' => '沙烏地阿拉伯',
-'æ³¢æ\96¯å°¼äº\9aå\92\8cé»\91å¡\9eå\93¥ç»´é\82£' => '波士尼äº\9e赫å¡\9eå\93¥ç¶­ç´\8d',
+'æ²\99å\9c°é\98¿æ\8b\89伯' => 'æ²\99ç\83\8få\9c°é\98¿æ\8b\89伯',
 '波斯尼亞黑塞哥維那' => '波士尼亞赫塞哥維納',
-'博茨瓦納' => '波札那',
+'波斯尼亚和黑塞哥维那' => '波士尼亞赫塞哥維納',
 '博茨瓦纳' => '波札那',
+'博茨瓦納' => '波札那',
 '流程控制' => '流程控制',
-'侯賽因' => '海珊',
 '侯赛因' => '海珊',
+'侯賽因' => '海珊',
 '深淵裏' => '深淵裡',
 '光标' => '游標',
 '鼠标' => '滑鼠',
@@ -16318,18 +16320,18 @@ $zh2TW = array(
 '词组' => '片語',
 '獄裏' => '獄裡',
 '塞拉利昂' => '獅子山',
-'危地馬拉' => '瓜地馬拉',
 '危地马拉' => '瓜地馬拉',
+'危地馬拉' => '瓜地馬拉',
 '冈比亚' => '甘比亞',
 '岡比亞' => '甘比亞',
 '疑兇' => '疑凶',
 '疑凶' => '疑凶',
 '百科裏' => '百科裡',
 '皮裏陽秋' => '皮裡陽秋',
-'卢旺达' => '盧安達',
 '盧旺達' => '盧安達',
-'真兇' => '真凶',
+'卢旺达' => '盧安達',
 '真凶' => '真凶',
+'真兇' => '真凶',
 '眼睛裏' => '眼睛裡',
 '硅片' => '矽片',
 '硅谷' => '矽谷',
@@ -16347,43 +16349,43 @@ $zh2TW = array(
 '蹦极跳' => '笨豬跳',
 '绑紧跳' => '笨豬跳',
 '等于' => '等於',
-'短信' => '簡訊',
 '短訊' => '簡訊',
+'短信' => '簡訊',
 '系列裏' => '系列裡',
 '新西蘭' => '紐西蘭',
 '新西兰' => '紐西蘭',
-'所羅門群島' => '索羅門群島',
 '所罗门群岛' => '索羅門群島',
-'索马里' => '索馬利亞',
+'所羅門群島' => '索羅門群島',
 '索馬里' => '索馬利亞',
+'索马里' => '索馬利亞',
 '结彩' => '結綵',
 '佛得角' => '維德角',
 '網絡' => '網路',
 '网络' => '網路',
-'因特网' => '網際網路',
 '互聯網' => '網際網路',
+'因特网' => '網際網路',
 '彩球' => '綵球',
 '彩绸' => '綵綢',
 '彩线' => '綵線',
 '彩船' => '綵船',
 '彩衣' => '綵衣',
 '綫' => '線',
-'緝兇' => '緝凶',
 '缉凶' => '緝凶',
+'緝兇' => '緝凶',
 '緝凶' => '緝凶',
 '意大利' => '義大利',
 '老字号' => '老字號',
 '圣基茨和尼维斯' => '聖克里斯多福及尼維斯',
 '聖吉斯納域斯' => '聖克里斯多福及尼維斯',
-'圣文森特和格林纳丁斯' => '聖文森及格瑞那丁',
 '聖文森特和格林納丁斯' => '聖文森及格瑞那丁',
+'圣文森特和格林纳丁斯' => '聖文森及格瑞那丁',
 '圣卢西亚' => '聖露西亞',
 '聖盧西亞' => '聖露西亞',
 '圣马力诺' => '聖馬利諾',
 '聖馬力諾' => '聖馬利諾',
 '肚裏' => '肚裡',
-'肯雅' => '肯亞',
 '肯尼亚' => '肯亞',
+'肯雅' => '肯亞',
 '航天大学' => '航天大學',
 '苦裏' => '苦裡',
 '毛里塔尼亚' => '茅利塔尼亞',
@@ -16392,8 +16394,8 @@ $zh2TW = array(
 '万历' => '萬曆',
 '瓦努阿图' => '萬那杜',
 '瓦努阿圖' => '萬那杜',
-'也門' => '葉門',
 '也门' => '葉門',
+'也門' => '葉門',
 '着' => '著',
 '科摩羅' => '葛摩',
 '科摩罗' => '葛摩',
@@ -16402,19 +16404,19 @@ $zh2TW = array(
 '圭亚那' => '蓋亞那',
 '火锅盖帽' => '蓋火鍋',
 '苏里南' => '蘇利南',
-'行兇' => '行凶',
 '行凶' => '行凶',
+'行兇' => '行凶',
+'行凶后' => '行凶後',
 '行兇後' => '行凶後',
 '行凶後' => '行凶後',
-'行凶后' => '行凶後',
-'移动电话' => '行動電話',
 '流動電話' => '行動電話',
+'移动电话' => '行動電話',
 '行程控制' => '行程控制',
 '衞' => '衛',
 '卫生' => '衛生',
 '衞生' => '衛生',
-'埃塞俄比亞' => '衣索比亞',
 '埃塞俄比亚' => '衣索比亞',
+'埃塞俄比亞' => '衣索比亞',
 '裏勾外連' => '裡勾外連',
 '裏面' => '裡面',
 '分辨率' => '解析度',
@@ -16425,39 +16427,39 @@ $zh2TW = array(
 '瑙魯' => '諾魯',
 '变量' => '變數',
 '科特迪瓦' => '象牙海岸',
-'贝宁' => '貝南',
 '貝寧' => '貝南',
+'贝宁' => '貝南',
 '伯利茲' => '貝里斯',
 '伯利兹' => '貝里斯',
 '買兇' => '買凶',
-'買凶' => '買凶',
 '买凶' => '買凶',
+'買凶' => '買凶',
 '数据库' => '資料庫',
 '信息论' => '資訊理論',
 '奔驰' => '賓士',
 '平治' => '賓士',
 '利比里亚' => '賴比瑞亞',
 '利比里亞' => '賴比瑞亞',
-'莱索托' => '賴索托',
 '萊索托' => '賴索托',
+'莱索托' => '賴索托',
 '软驱' => '軟碟機',
-'软件' => '軟體',
 '軟件' => '軟體',
+'软件' => '軟體',
 '加载' => '載入',
-'津巴布韋' => '辛巴威',
 '津巴布韦' => '辛巴威',
+'津巴布韋' => '辛巴威',
 '词汇' => '辭彙',
-'加納' => '迦納',
 '加纳' => '迦納',
-'追兇' => '追凶',
+'加納' => '迦納',
 '追凶' => '追凶',
+'追兇' => '追凶',
 '這裏' => '這裡',
+'逞凶鬥狠' => '逞凶鬥狠',
 '逞兇鬥狠' => '逞凶鬥狠',
 '逞凶斗狠' => '逞凶鬥狠',
-'逞凶鬥狠' => '逞凶鬥狠',
 '即食麵' => '速食麵',
-'快速面' => '速食麵',
 '方便面' => '速食麵',
+'快速面' => '速食麵',
 '连字号' => '連字號',
 '进制' => '進位',
 '入球' => '進球',
@@ -16473,8 +16475,8 @@ $zh2TW = array(
 '鈎心鬥角' => '鉤心鬥角',
 '锎' => '鉲',
 '写保护' => '防寫',
-'阿拉伯聯合酋長國' => '阿拉伯聯合大公國',
 '阿拉伯联合酋长国' => '阿拉伯聯合大公國',
+'阿拉伯聯合酋長國' => '阿拉伯聯合大公國',
 '噪声' => '雜訊',
 '脱机' => '離線',
 '雪裏紅' => '雪裡紅',
@@ -16484,8 +16486,8 @@ $zh2TW = array(
 '异步' => '非同步',
 '声卡' => '音效卡',
 '缺省' => '預設',
-'頒佈' => '頒布',
 '颁布' => '頒布',
+'頒佈' => '頒布',
 '領域裏' => '領域裡',
 '头球' => '頭槌',
 '粒入球' => '顆進球',
@@ -16503,30 +16505,30 @@ $zh2TW = array(
 );
 
 $zh2HK = array(
-'505线' => '505綫',
 '505線' => '505綫',
-'507线' => '507綫',
+'505线' => '505綫',
 '507線' => '507綫',
-'610线' => '610綫',
+'507线' => '507綫',
 '610線' => '610綫',
+'610线' => '610綫',
 '614P線' => '614P綫',
 '614P线' => '614P綫',
-'614線' => '614綫',
 '614线' => '614綫',
+'614線' => '614綫',
 '615P線' => '615P綫',
 '615P线' => '615P綫',
 '615线' => '615綫',
 '615線' => '615綫',
-'705線' => '705綫',
 '705线' => '705綫',
-'706線' => '706綫',
+'705線' => '705綫',
 '706线' => '706綫',
+'706線' => '706綫',
 '751P線' => '751P綫',
 '751P线' => '751P綫',
-'751线' => '751綫',
 '751線' => '751綫',
-'761P線' => '761P綫',
+'751线' => '751綫',
 '761P线' => '761P綫',
+'761P線' => '761P綫',
 '“' => '「',
 '”' => '」',
 '‘' => '『',
@@ -16551,8 +16553,8 @@ $zh2HK = array(
 '乘著錄' => '乘著錄',
 '葉門' => '也門',
 '二極體' => '二極管',
-'因特网' => '互聯網',
 '網際網路' => '互聯網',
+'因特网' => '互聯網',
 '亮著' => '亮着',
 '亮著作' => '亮著作',
 '亮著名' => '亮著名',
@@ -16606,8 +16608,8 @@ $zh2HK = array(
 '住著述' => '住著述',
 '住著錄' => '住著錄',
 '維德角' => '佛得角',
-'作品里' => '作品裏',
 '作品裡' => '作品裏',
+'作品里' => '作品裏',
 '來著' => '來着',
 '來著作' => '來著作',
 '來著名' => '來著名',
@@ -16763,8 +16765,8 @@ $zh2HK = array(
 '動著者' => '動著者',
 '動著述' => '動著述',
 '動著錄' => '動著錄',
-'北環線' => '北環綫',
 '北环线' => '北環綫',
+'北環線' => '北環綫',
 '医院里' => '医院裏',
 '波札那' => '博茨瓦納',
 '珍妮弗·卡普里亚蒂' => '卡佩雅蒂',
@@ -16777,13 +16779,13 @@ $zh2HK = array(
 '印著述' => '印著述',
 '印著錄' => '印著錄',
 '瓜地馬拉' => '危地馬拉',
+'泡麵' => '即食麵',
 '方便面' => '即食麵',
-'速食麵' => '即食麵',
 '快速面' => '即食麵',
-'麵' => '即食麵',
+'速食麵' => '即食麵',
 '厄瓜多' => '厄瓜多爾',
-'厄瓜多尔' => '厄瓜多爾',
 '厄瓜多爾' => '厄瓜多爾',
+'厄瓜多尔' => '厄瓜多爾',
 '厄利垂亞' => '厄立特里亞',
 '去著' => '去着',
 '去著作' => '去著作',
@@ -16932,8 +16934,8 @@ $zh2HK = array(
 '坐著述' => '坐著述',
 '坐著錄' => '坐著錄',
 '坦尚尼亞' => '坦桑尼亞',
-'衣索比亞' => '埃塞俄比亞',
 '衣索匹亞' => '埃塞俄比亞',
+'衣索比亞' => '埃塞俄比亞',
 '吉里巴斯' => '基里巴斯',
 '塞普勒斯' => '塞浦路斯',
 '塞席爾' => '塞舌爾',
@@ -16945,10 +16947,10 @@ $zh2HK = array(
 '壓著者' => '壓著者',
 '壓著述' => '壓著述',
 '壓著錄' => '壓著錄',
-'夏天裡' => '夏天裏',
 '夏天里' => '夏天裏',
-'夏日裡' => '夏日裏',
+'夏天裡' => '夏天裏',
 '夏日里' => '夏日裏',
+'夏日裡' => '夏日裏',
 '夢著' => '夢着',
 '夢著作' => '夢著作',
 '夢著名' => '夢著名',
@@ -17002,8 +17004,8 @@ $zh2HK = array(
 '定著述' => '定著述',
 '定著錄' => '定著錄',
 '沃尓沃' => '富豪',
-'寒假里' => '寒假裏',
 '寒假裡' => '寒假裏',
+'寒假里' => '寒假裏',
 '寫著' => '寫着',
 '寫著作' => '寫著作',
 '寫著名' => '寫著名',
@@ -17012,10 +17014,10 @@ $zh2HK = array(
 '寫著者' => '寫著者',
 '寫著述' => '寫著述',
 '寫著錄' => '寫著錄',
-'將軍澳線' => '將軍澳綫',
 '将军澳线' => '將軍澳綫',
-'å°\88輯裡' => 'å°\88輯è£\8f',
+'å°\87è»\8dæ¾³ç·\9a' => 'å°\87è»\8d澳綫',
 '专辑里' => '專輯裏',
+'專輯裡' => '專輯裏',
 '尋著' => '尋着',
 '尋著作' => '尋著作',
 '尋著名' => '尋著名',
@@ -17032,12 +17034,12 @@ $zh2HK = array(
 '對著者' => '對著者',
 '對著述' => '對著述',
 '對著錄' => '對著錄',
-'尼日利亞' => '尼日利亞',
-'尼日利亚' => '尼日利亞',
 '奈及利亞' => '尼日利亞',
-'尼日' => '尼日爾',
-'尼日爾' => '尼日爾',
+'尼日利亚' => '尼日利亞',
+'尼日利亞' => '尼日利亞',
 '尼日尔' => '尼日爾',
+'尼日爾' => '尼日爾',
+'尼日' => '尼日爾',
 '展著' => '展着',
 '展著作' => '展著作',
 '展著名' => '展著名',
@@ -17080,8 +17082,8 @@ $zh2HK = array(
 '賓士' => '平治',
 '年代里' => '年代裏',
 '年代裡' => '年代裏',
-'干着' => '幹着',
 '幹著' => '幹着',
+'干着' => '幹着',
 '幾內亞比索' => '幾內亞比紹',
 '康著' => '康着',
 '康著作' => '康著作',
@@ -17124,8 +17126,8 @@ $zh2HK = array(
 '心著者' => '心著者',
 '心著述' => '心著述',
 '心著錄' => '心著錄',
-'心里' => '心裏',
 '心裡' => '心裏',
+'心里' => '心裏',
 '忍著' => '忍着',
 '忍著作' => '忍著作',
 '忍著名' => '忍著名',
@@ -17232,10 +17234,10 @@ $zh2HK = array(
 '戰著者' => '戰著者',
 '戰著述' => '戰著述',
 '戰著錄' => '戰著錄',
-'戏里' => '戲裏',
 '戲裡' => '戲裏',
-'狄安娜' => '戴安娜',
+'戏里' => '戲裏',
 '黛安娜' => '戴安娜',
+'狄安娜' => '戴安娜',
 '戴著' => '戴着',
 '戴著作' => '戴著作',
 '戴著名' => '戴著名',
@@ -17468,8 +17470,8 @@ $zh2HK = array(
 '斯洛維尼亞' => '斯洛文尼亞',
 '新著龍虎門' => '新著龍虎門',
 '紐西蘭' => '新西蘭',
-'日子裡' => '日子裏',
 '日子里' => '日子裏',
+'日子裡' => '日子裏',
 '昂著' => '昂着',
 '昂著作' => '昂著作',
 '昂著名' => '昂著名',
@@ -17486,12 +17488,12 @@ $zh2HK = array(
 '映著者' => '映著者',
 '映著述' => '映著述',
 '映著錄' => '映著錄',
-'春假裡' => '春假裏',
 '春假里' => '春假裏',
-'æ\98¥å¤©é\87\8c' => 'æ\98¥å¤©裏',
+'æ\98¥å\81\87裡' => 'æ\98¥å\81\87裏',
 '春天裡' => '春天裏',
-'春日里' => '春日裏',
+'春天里' => '春天裏',
 '春日裡' => '春日裏',
+'春日里' => '春日裏',
 '时间里' => '時間裏',
 '時間裡' => '時間裏',
 '晃著' => '晃着',
@@ -17501,8 +17503,8 @@ $zh2HK = array(
 '晃著者' => '晃著者',
 '晃著述' => '晃著述',
 '晃著錄' => '晃著錄',
-'暑假裡' => '暑假裏',
 '暑假里' => '暑假裏',
+'暑假裡' => '暑假裏',
 '暗著' => '暗着',
 '暗著作' => '暗著作',
 '暗著名' => '暗著名',
@@ -17546,8 +17548,8 @@ $zh2HK = array(
 '村子裡' => '村子裏',
 '东涌线' => '東涌綫',
 '東涌線' => '東涌綫',
-'东铁线' => '東鐵綫',
 '東鐵線' => '東鐵綫',
+'东铁线' => '東鐵綫',
 '枕著' => '枕着',
 '枕著作' => '枕著作',
 '枕著名' => '枕著名',
@@ -17565,8 +17567,8 @@ $zh2HK = array(
 '梳著者' => '梳著者',
 '梳著述' => '梳著述',
 '梳著錄' => '梳著錄',
-'森林里' => '森林裏',
 '森林裡' => '森林裏',
+'森林里' => '森林裏',
 '棺材裡' => '棺材裏',
 '棺材里' => '棺材裏',
 '榴蓮' => '榴槤',
@@ -17581,8 +17583,8 @@ $zh2HK = array(
 '樂著錄' => '樂著錄',
 '寶獅' => '標致',
 '標誌著' => '標誌着',
-'机场快线' => '機場快綫',
 '機場快線' => '機場快綫',
+'机场快线' => '機場快綫',
 '機器人' => '機械人',
 '机器人' => '機械人',
 '历史里' => '歷史裏',
@@ -17615,12 +17617,12 @@ $zh2HK = array(
 '沉著者' => '沉著者',
 '沉著述' => '沉著述',
 '沉著錄' => '沉著錄',
-'沙中線' => '沙中綫',
 '沙中线' => '沙中綫',
+'沙中線' => '沙中綫',
 '沙地阿拉伯' => '沙特阿拉伯',
 '沙烏地阿拉伯' => '沙特阿拉伯',
-'沙田至中环线' => '沙田至中環綫',
 '沙田至中環線' => '沙田至中環綫',
+'沙田至中环线' => '沙田至中環綫',
 '马拉特·萨芬' => '沙芬',
 '沿著' => '沿着',
 '沿著作' => '沿著作',
@@ -17641,8 +17643,8 @@ $zh2HK = array(
 '活著者' => '活著者',
 '活著述' => '活著述',
 '活著錄' => '活著錄',
-'移动电话' => '流動電話',
 '行動電話' => '流動電話',
+'移动电话' => '流動電話',
 '流著' => '流着',
 '流著作' => '流著作',
 '流著名' => '流著名',
@@ -17724,10 +17726,10 @@ $zh2HK = array(
 '无线剧集' => '無綫劇集',
 '無線收費' => '無綫收費',
 '无线收费' => '無綫收費',
-'無線節目' => '無綫節目',
 '无线节目' => '無綫節目',
-'無線電視' => '無綫電視',
+'無線節目' => '無綫節目',
 '无线电视' => '無綫電視',
+'無線電視' => '無綫電視',
 '菸' => '煙',
 '照著' => '照着',
 '照著作' => '照著作',
@@ -17780,8 +17782,8 @@ $zh2HK = array(
 '猜著者' => '猜著者',
 '猜著述' => '猜著述',
 '猜著錄' => '猜著錄',
-'獄裡' => '獄裏',
 '狱里' => '獄裏',
+'獄裡' => '獄裏',
 '獨著' => '獨着',
 '獨著作' => '獨著作',
 '獨著名' => '獨著名',
@@ -17844,12 +17846,12 @@ $zh2HK = array(
 '疑著錄' => '疑著錄',
 '发布' => '發佈',
 '發布' => '發佈',
-'百科里' => '百科裏',
 '百科裡' => '百科裏',
+'百科里' => '百科裏',
 '計程車' => '的士',
 '出租车' => '的士',
-'皮裡陽秋' => '皮裏陽秋',
 '皮里阳秋' => '皮裏陽秋',
+'皮裡陽秋' => '皮裏陽秋',
 '皺著' => '皺着',
 '皺著作' => '皺著作',
 '皺著名' => '皺著名',
@@ -17959,8 +17961,8 @@ $zh2HK = array(
 '瞪著錄' => '瞪著錄',
 '簡訊' => '短訊',
 '短信' => '短訊',
-'硬體' => '硬件',
 '硬件' => '硬件',
+'硬體' => '硬件',
 '福斯' => '福士',
 '福著' => '福着',
 '福著作' => '福著作',
@@ -17970,12 +17972,12 @@ $zh2HK = array(
 '福著者' => '福著者',
 '福著述' => '福著述',
 '福著錄' => '福著錄',
-'秋假里' => '秋假裏',
 '秋假裡' => '秋假裏',
-'ç§\8b天é\87\8c' => 'ç§\8b天裏',
+'ç§\8bå\81\87é\87\8c' => 'ç§\8bå\81\87裏',
 '秋天裡' => '秋天裏',
-'秋日裡' => '秋日裏',
+'秋天里' => '秋天裏',
 '秋日里' => '秋日裏',
+'秋日裡' => '秋日裏',
 '葛摩' => '科摩羅',
 '捷豹' => '積架',
 '空著' => '空着',
@@ -17986,8 +17988,8 @@ $zh2HK = array(
 '空著者' => '空著者',
 '空著述' => '空著述',
 '空著錄' => '空著錄',
-'航天飞机' => '穿梭機',
 '太空梭' => '穿梭機',
+'航天飞机' => '穿梭機',
 '穿著' => '穿着',
 '穿著作' => '穿著作',
 '穿著名' => '穿著名',
@@ -18099,8 +18101,8 @@ $zh2HK = array(
 '考著者' => '考著者',
 '考著述' => '考著述',
 '考著錄' => '考著錄',
-'聖克里斯多福及尼維斯' => '聖吉斯納域斯',
 '圣基茨和尼维斯' => '聖吉斯納域斯',
+'聖克里斯多福及尼維斯' => '聖吉斯納域斯',
 '聖文森及格瑞那丁' => '聖文森特和格林納丁斯',
 '聖露西亞' => '聖盧西亞',
 '聖馬利諾' => '聖馬力諾',
@@ -18116,8 +18118,8 @@ $zh2HK = array(
 '聽著錄' => '聽著錄',
 '肚里' => '肚裏',
 '肚裡' => '肚裏',
-'肯亞' => '肯雅',
 '肯尼亚' => '肯雅',
+'肯亞' => '肯雅',
 '背著' => '背着',
 '背著作' => '背著作',
 '背著名' => '背著名',
@@ -18161,8 +18163,8 @@ $zh2HK = array(
 '苦著錄' => '苦著錄',
 '苦里' => '苦裏',
 '苦裡' => '苦裏',
-'荃灣線' => '荃灣綫',
 '荃湾线' => '荃灣綫',
+'荃灣線' => '荃灣綫',
 '莫三比克' => '莫桑比克',
 '賴索托' => '萊索托',
 '馬自達' => '萬事得',
@@ -18228,8 +18230,8 @@ $zh2HK = array(
 '衣著錄' => '衣著錄',
 '裡勾外連' => '裏勾外連',
 '里勾外连' => '裏勾外連',
-'裡面' => '裏面',
 '里面' => '裏面',
+'裡面' => '裏面',
 '裝著' => '裝着',
 '裝著作' => '裝著作',
 '裝著名' => '裝著名',
@@ -18246,8 +18248,8 @@ $zh2HK = array(
 '裹著者' => '裹著者',
 '裹著述' => '裹著述',
 '裹著錄' => '裹著錄',
-'西鐵線' => '西鐵綫',
 '西铁线' => '西鐵綫',
+'西鐵線' => '西鐵綫',
 '見著' => '見着',
 '見著作' => '見著作',
 '見著名' => '見著名',
@@ -18441,8 +18443,8 @@ $zh2HK = array(
 '辦著錄' => '辦著錄',
 '近角聪信' => '近角聰信',
 '近角聰信' => '近角聰信',
-'迪士尼線' => '迪士尼綫',
 '迪士尼线' => '迪士尼綫',
+'迪士尼線' => '迪士尼綫',
 '迫著' => '迫着',
 '追著' => '追着',
 '追著作' => '追著作',
@@ -18526,8 +18528,8 @@ $zh2HK = array(
 '醯醢' => '醯醢',
 '醯醬' => '醯醬',
 '醯酱' => '醯醬',
-'醯雞' => '醯雞',
 '醯鸡' => '醯雞',
+'醯雞' => '醯雞',
 '釀著' => '釀着',
 '釀著作' => '釀著作',
 '釀著名' => '釀著名',
@@ -18640,15 +18642,15 @@ $zh2HK = array(
 '雜著述' => '雜著述',
 '雜著錄' => '雜著錄',
 '冰淇淋' => '雪糕',
-'雪裡紅' => '雪裏紅',
 '雪里红' => '雪裏紅',
+'雪裡紅' => '雪裏紅',
 '雪裡蕻' => '雪裏蕻',
 '雪里蕻' => '雪裏蕻',
 '靠著' => '靠着',
 '靠著作' => '靠著作',
 '靠著名' => '靠著名',
-'靠著称' => '靠著稱',
 '靠著稱' => '靠著稱',
+'靠著称' => '靠著稱',
 '靠著者' => '靠著者',
 '靠著述' => '靠著述',
 '靠著錄' => '靠著錄',
@@ -18677,10 +18679,10 @@ $zh2HK = array(
 '順著者' => '順著者',
 '順著述' => '順著述',
 '順著錄' => '順著錄',
-'颁布' => '頒佈',
 '頒布' => '頒佈',
-'é¢\86å\9f\9fé\87\8c' => 'é \98å\9f\9fè£\8f',
+'é¢\81å¸\83' => 'é \92ä½\88',
 '領域裡' => '領域裏',
+'领域里' => '領域裏',
 '領著' => '領着',
 '領著作' => '領著作',
 '領著名' => '領著名',
@@ -18697,8 +18699,8 @@ $zh2HK = array(
 '飄著者' => '飄著者',
 '飄著述' => '飄著述',
 '飄著錄' => '飄著錄',
-'馆里' => '館裏',
 '館裡' => '館裏',
+'馆里' => '館裏',
 '馬爾地夫' => '馬爾代夫',
 '馬利共和國' => '馬里共和國',
 '土豆' => '馬鈴薯',
@@ -18776,8 +18778,8 @@ $zh2HK = array(
 '點著者' => '點著者',
 '點著述' => '點著述',
 '點著錄' => '點著錄',
-'点里' => '點裏',
 '點裡' => '點裏',
+'点里' => '點裏',
 );
 
 $zh2CN = array(
@@ -18803,8 +18805,8 @@ $zh2CN = array(
 '互聯網' => '互联网',
 '互動式' => '交互式',
 '人工智慧' => '人工智能',
-'甚麼' => '什么',
 '甚麽' => '什么',
+'甚麼' => '什么',
 '乙太網' => '以太网',
 '優先順序' => '优先级',
 '感測' => '传感',
@@ -18849,16 +18851,16 @@ $zh2CN = array(
 '华乐街' => '华乐街',
 '波札那' => '博茨瓦纳',
 '盧安達' => '卢旺达',
-'衛生' => '卫生',
 '衞生' => '卫生',
+'衛生' => '卫生',
 '瓜地馬拉' => '危地马拉',
 '厄瓜多' => '厄瓜多尔',
-'厄瓜多尔' => '厄瓜多尔',
 '厄瓜多爾' => '厄瓜多尔',
+'厄瓜多尔' => '厄瓜多尔',
 '厄利垂亞' => '厄立特里亚',
 '變數' => '变量',
-'桌球' => '台球',
 '撞球' => '台球',
+'桌球' => '台球',
 '吉布地' => '吉布提',
 '哈薩克' => '哈萨克斯坦',
 '哥斯大黎加' => '哥斯达黎加',
@@ -18867,8 +18869,8 @@ $zh2CN = array(
 '吐瓦魯' => '图瓦卢',
 '土庫曼' => '土库曼斯坦',
 '聖露西亞' => '圣卢西亚',
-'聖克里斯多福及尼維斯' => '圣基茨和尼维斯',
 '聖吉斯納域斯' => '圣基茨和尼维斯',
+'聖克里斯多福及尼維斯' => '圣基茨和尼维斯',
 '聖文森及格瑞那丁' => '圣文森特和格林纳丁斯',
 '聖馬利諾' => '圣马力诺',
 '蓋亞那' => '圭亚那',
@@ -18888,11 +18890,11 @@ $zh2CN = array(
 '福斯' => '大众',
 '大衛碧咸' => '大卫·贝克汉姆',
 '頭槌' => '头球',
-'平治' => '奔驰',
 '賓士' => '奔驰',
+'平治' => '奔驰',
 '忌廉' => '奶油',
-'字元會' => '字元会',
 '字元会' => '字元会',
+'字元會' => '字元会',
 '字元濟' => '字元济',
 '字元济' => '字元济',
 '字型大小' => '字号',
@@ -18900,18 +18902,18 @@ $zh2CN = array(
 '欄位' => '字段',
 '字母' => '字母',
 '字元' => '字符',
-'位元組' => '字节',
 '字節' => '字节',
+'位元組' => '字节',
 '存檔' => '存盘',
 '安地卡及巴布達' => '安提瓜和巴布达',
 '巨集' => '宏',
 '寬頻' => '宽带',
 '定址' => '寻址',
+'奈及利亞' => '尼日利亚',
 '尼日利亞' => '尼日利亚',
 '尼日利亚' => '尼日利亚',
-'奈及利亞' => '尼日利亚',
-'尼日尔' => '尼日尔',
 '尼日爾' => '尼日尔',
+'尼日尔' => '尼日尔',
 '章節附註' => '尾注',
 '區域網' => '局域网',
 '巴貝多' => '巴巴多斯',
@@ -18925,8 +18927,8 @@ $zh2CN = array(
 '蒲隆地' => '布隆迪',
 '希特拉' => '希特勒',
 '帛琉' => '帕劳',
-'平治之亂' => '平治之乱',
 '平治之乱' => '平治之乱',
+'平治之亂' => '平治之乱',
 '非同步' => '异步',
 '迴圈' => '循环',
 '快閃記憶體' => '快闪存储器',
@@ -18937,8 +18939,8 @@ $zh2CN = array(
 '索羅門群島' => '所罗门群岛',
 '打印' => '打印',
 '列印' => '打印',
-'打印機' => '打印机',
 '印表機' => '打印机',
+'打印機' => '打印机',
 '射門' => '打门',
 '掃瞄器' => '扫瞄仪',
 '括弧' => '括号',
@@ -18952,12 +18954,12 @@ $zh2CN = array(
 '斯洛維尼亞' => '斯洛文尼亚',
 '紐西蘭' => '新西兰',
 '即食麵' => '方便面',
-'速食麵' => '方便面',
 '快速面' => '方便面',
 '泡麵' => '方便面',
+'速食麵' => '方便面',
 '伺服器' => '服务器',
-'機器人' => '机器人',
 '機械人' => '机器人',
+'機器人' => '机器人',
 '許可權' => '权限',
 '寶獅' => '标志',
 '格瑞那達' => '格林纳达',
@@ -18986,16 +18988,16 @@ $zh2CN = array(
 '狗隻' => '犬只',
 '卡佩雅蒂' => '珍妮弗·卡普里亚蒂',
 '諾魯' => '瑙鲁',
-'溫納圖' => '瓦努阿图',
 '萬那杜' => '瓦努阿图',
+'溫納圖' => '瓦努阿图',
 '碟片' => '盘片',
-'簡訊' => '短信',
 '短訊' => '短信',
-'ç\9f½å¡µ' => 'ç\9f½å°\98',
+'ç°¡è¨\8a' => 'ç\9f­ä¿¡',
 '矽尘' => '矽尘',
+'矽塵' => '矽尘',
 '矽肺' => '矽肺',
-'矽鋼' => '矽钢',
 '矽钢' => '矽钢',
+'矽鋼' => '矽钢',
 '矽' => '硅',
 '矽片' => '硅片',
 '矽谷' => '硅谷',
@@ -19005,8 +19007,8 @@ $zh2CN = array(
 '磁軌' => '磁道',
 '葛摩' => '科摩罗',
 '象牙海岸' => '科特迪瓦',
-'流動電話' => '移动电话',
 '行動電話' => '移动电话',
+'流動電話' => '移动电话',
 '程式控制' => '程控',
 '突尼西亞' => '突尼斯',
 '谐星' => '笑星',
@@ -19018,11 +19020,11 @@ $zh2CN = array(
 '網路' => '网络',
 '網絡' => '网络',
 '寮國' => '老挝',
-'肯亞' => '肯尼亚',
 '肯雅' => '肯尼亚',
+'肯亞' => '肯尼亚',
 '單車' => '自行车',
-'穿梭機' => '航天飞机',
 '太空梭' => '航天飞机',
+'穿梭機' => '航天飞机',
 '節慶' => '节日',
 '晶元' => '芯片',
 '晶片' => '芯片',
@@ -19038,8 +19040,8 @@ $zh2CN = array(
 '尚比亞' => '赞比亚',
 '绑紧跳' => '蹦极跳',
 '笨豬跳' => '蹦极跳',
-'軟件' => '软件',
 '軟體' => '软件',
+'軟件' => '软件',
 '軟碟機' => '软驱',
 '米高奧雲' => '迈克尔·欧文',
 '舒麥加' => '迈克尔·舒马赫',
@@ -19069,15 +19071,15 @@ $zh2SG = array(
 '民乐' => '华乐',
 '夜校' => '夜学',
 '房价' => '屋价',
-'麵' => '快速面',
+'即食麵' => '快速面',
 '速食麵' => '快速面',
+'泡麵' => '快速面',
 '方便面' => '快速面',
-'即食麵' => '快速面',
-'散紙' => '散钱',
 '零钱' => '散钱',
+'散紙' => '散钱',
 '榴莲' => '榴梿',
 '榴蓮' => '榴梿',
-'蹦极跳' => '绑紧跳',
 '笨豬跳' => '绑紧跳',
+'蹦极跳' => '绑紧跳',
 '笑星' => '谐星',
 );
index 07a5c24..8fb104d 100644 (file)
@@ -50,15 +50,15 @@ abstract class Action {
 
        /**
         * The fields used to create the HTMLForm
-        * @var Array $fields
+        * @var array $fields
         */
        protected $fields;
 
        /**
         * Get the Action subclass which should be used to handle this action, false if
         * the action is disabled, or null if it's not recognised
-        * @param $action String
-        * @param $overrides Array
+        * @param string $action
+        * @param array $overrides
         * @return bool|null|string|callable
         */
        final private static function getClass( $action, array $overrides ) {
@@ -82,10 +82,10 @@ abstract class Action {
 
        /**
         * Get an appropriate Action subclass for the given action
-        * @param $action String
-        * @param $page Page
-        * @param $context IContextSource
-        * @return Action|bool|null false if the action is disabled, null
+        * @param string $action
+        * @param Page $page
+        * @param IContextSource $context
+        * @return Action|bool|null False if the action is disabled, null
         *     if it is not recognised
         */
        final public static function factory( $action, Page $page, IContextSource $context = null ) {
@@ -109,8 +109,8 @@ abstract class Action {
         * $wgActions will be replaced by "nosuchaction".
         *
         * @since 1.19
-        * @param $context IContextSource
-        * @return string: action name
+        * @param IContextSource $context
+        * @return string Action name
         */
        final public static function getActionName( IContextSource $context ) {
                global $wgActions;
@@ -153,8 +153,8 @@ abstract class Action {
        /**
         * Check if a given action is recognised, even if it's disabled
         *
-        * @param string $name name of an action
-        * @return Bool
+        * @param string $name Name of an action
+        * @return bool
         */
        final public static function exists( $name ) {
                return self::getClass( $name, array() ) !== null;
@@ -245,7 +245,7 @@ abstract class Action {
         * Get a Message object with context set
         * Parameters are the same as wfMessage()
         *
-        * @return Message object
+        * @return Message
         */
        final public function msg() {
                $params = func_get_args();
@@ -257,8 +257,8 @@ abstract class Action {
         *
         * Only public since 1.21
         *
-        * @param $page Page
-        * @param $context IContextSource
+        * @param Page $page
+        * @param IContextSource $context
         */
        public function __construct( Page $page, IContextSource $context = null ) {
                if ( $context === null ) {
@@ -273,14 +273,14 @@ abstract class Action {
 
        /**
         * Return the name of the action this object responds to
-        * @return String lowercase
+        * @return string Lowercase name
         */
        abstract public function getName();
 
        /**
         * Get the permission required to perform this action.  Often, but not always,
         * the same as the action name
-        * @return String|null
+        * @return string|null
         */
        public function getRestriction() {
                return null;
@@ -291,7 +291,7 @@ abstract class Action {
         * overridden by sub-classes with more complicated permissions schemes.  Failures here
         * must throw subclasses of ErrorPageError
         *
-        * @param $user User: the user to check, or null to use the context user
+        * @param User $user The user to check, or null to use the context user
         * @throws UserBlockedError|ReadOnlyError|PermissionsError
         * @return bool True on success
         */
@@ -320,7 +320,7 @@ abstract class Action {
 
        /**
         * Whether this action requires the wiki not to be locked
-        * @return Bool
+        * @return bool
         */
        public function requiresWrite() {
                return true;
@@ -328,7 +328,7 @@ abstract class Action {
 
        /**
         * Whether this action can still be executed by a blocked user
-        * @return Bool
+        * @return bool
         */
        public function requiresUnblock() {
                return true;
@@ -349,7 +349,7 @@ abstract class Action {
        /**
         * Returns the name that goes in the \<h1\> page title
         *
-        * @return String
+        * @return string
         */
        protected function getPageTitle() {
                return $this->getTitle()->getPrefixedText();
@@ -358,7 +358,7 @@ abstract class Action {
        /**
         * Returns the description that goes below the \<h1\> tag
         *
-        * @return String
+        * @return string
         */
        protected function getDescription() {
                return $this->msg( strtolower( $this->getName() ) )->escaped();
@@ -374,7 +374,7 @@ abstract class Action {
 
        /**
         * Execute the action in a silent fashion: do not display anything or release any errors.
-        * @return Bool whether execution was successful
+        * @return bool whether execution was successful
         */
        abstract public function execute();
 }
index 186ad46..32efc68 100644 (file)
@@ -58,7 +58,7 @@ abstract class CachedAction extends FormlessAction implements ICacheHelper {
         * If the cache is enabled or not.
         *
         * @since 1.20
-        * @var boolean
+        * @var bool
         */
        protected $cacheEnabled = true;
 
@@ -66,7 +66,7 @@ abstract class CachedAction extends FormlessAction implements ICacheHelper {
         * Sets if the cache should be enabled or not.
         *
         * @since 1.20
-        * @param boolean $cacheEnabled
+        * @param bool $cacheEnabled
         */
        public function setCacheEnabled( $cacheEnabled ) {
                $this->cacheHelper->setCacheEnabled( $cacheEnabled );
@@ -78,8 +78,8 @@ abstract class CachedAction extends FormlessAction implements ICacheHelper {
         *
         * @since 1.20
         *
-        * @param integer|null $cacheExpiry Sets the cache expiry, either ttl in seconds or unix timestamp.
-        * @param boolean|null $cacheEnabled Sets if the cache should be enabled or not.
+        * @param int|null $cacheExpiry Sets the cache expiry, either ttl in seconds or unix timestamp.
+        * @param bool|null $cacheEnabled Sets if the cache should be enabled or not.
         */
        public function startCache( $cacheExpiry = null, $cacheEnabled = null ) {
                $this->cacheHelper = new CacheHelper();
@@ -153,7 +153,7 @@ abstract class CachedAction extends FormlessAction implements ICacheHelper {
         *
         * @since 1.20
         *
-        * @param integer $cacheExpiry
+        * @param int $cacheExpiry
         */
        public function setExpiry( $cacheExpiry ) {
                $this->cacheHelper->setExpiry( $cacheExpiry );
@@ -179,7 +179,7 @@ abstract class CachedAction extends FormlessAction implements ICacheHelper {
         *
         * @since 1.20
         *
-        * @param boolean $hasCached
+        * @param bool $hasCached
         */
        public function onCacheInitialized( $hasCached ) {
                if ( $hasCached ) {
index 97c1605..2bb1be4 100644 (file)
@@ -39,7 +39,7 @@ class CreditsAction extends FormlessAction {
        /**
         * This is largely cadged from PageHistory::history
         *
-        * @return String HTML
+        * @return string HTML
         */
        public function onView() {
                wfProfileIn( __METHOD__ );
@@ -58,9 +58,9 @@ class CreditsAction extends FormlessAction {
        /**
         * Get a list of contributors
         *
-        * @param int $cnt maximum list of contributors to show
-        * @param bool $showIfMax whether to contributors if there more than $cnt
-        * @return String: html
+        * @param int $cnt Maximum list of contributors to show
+        * @param bool $showIfMax Whether to contributors if there more than $cnt
+        * @return string html
         */
        public function getCredits( $cnt, $showIfMax = true ) {
                wfProfileIn( __METHOD__ );
@@ -81,7 +81,7 @@ class CreditsAction extends FormlessAction {
        /**
         * Get the last author with the last modification time
         * @param Page $page
-        * @return String HTML
+        * @return string HTML
         */
        protected function getAuthor( Page $page ) {
                $user = User::newFromName( $page->getUserText(), false );
@@ -102,9 +102,9 @@ class CreditsAction extends FormlessAction {
 
        /**
         * Get a list of contributors of $article
-        * @param int $cnt maximum list of contributors to show
-        * @param bool $showIfMax whether to contributors if there more than $cnt
-        * @return String: html
+        * @param int $cnt Maximum list of contributors to show
+        * @param bool $showIfMax Whether to contributors if there more than $cnt
+        * @return string html
         */
        protected function getContributors( $cnt, $showIfMax ) {
                global $wgHiddenPrefs;
@@ -188,8 +188,8 @@ class CreditsAction extends FormlessAction {
 
        /**
         * Get a link to $user's user page
-        * @param $user User object
-        * @return String: html
+        * @param User $user
+        * @return string Html
         */
        protected function link( User $user ) {
                global $wgHiddenPrefs;
@@ -208,8 +208,8 @@ class CreditsAction extends FormlessAction {
 
        /**
         * Get a link to $user's user page
-        * @param $user User object
-        * @return String: html
+        * @param User $user
+        * @return string Html
         */
        protected function userLink( User $user ) {
                $link = $this->link( $user );
@@ -227,7 +227,7 @@ class CreditsAction extends FormlessAction {
 
        /**
         * Get a link to action=credits of $article page
-        * @return String: HTML link
+        * @return string HTML link
         */
        protected function othersLink() {
                return Linker::linkKnown(
index 974ee94..7477d11 100644 (file)
@@ -30,13 +30,13 @@ abstract class FormAction extends Action {
 
        /**
         * Get an HTMLForm descriptor array
-        * @return Array
+        * @return array
         */
        abstract protected function getFormFields();
 
        /**
         * Add pre- or post-text to the form
-        * @return String HTML which will be sent to $form->addPreText()
+        * @return string HTML which will be sent to $form->addPreText()
         */
        protected function preText() {
                return '';
@@ -51,7 +51,7 @@ abstract class FormAction extends Action {
 
        /**
         * Play with the HTMLForm if you need to more substantially
-        * @param $form HTMLForm
+        * @param HTMLForm $form
         */
        protected function alterForm( HTMLForm $form ) {
        }
@@ -91,8 +91,8 @@ abstract class FormAction extends Action {
         * Process the form on POST submission.  If you return false from getFormFields(),
         * this will obviously never be reached.  If you don't want to do anything with the
         * form, just return false here
-        * @param  $data Array
-        * @return Bool|Array true for success, false for didn't-try, array of errors on failure
+        * @param array $data
+        * @return bool|array True for success, false for didn't-try, array of errors on failure
         */
        abstract public function onSubmit( $data );
 
@@ -125,8 +125,8 @@ abstract class FormAction extends Action {
        /**
         * @see Action::execute()
         *
-        * @param $data array|null
-        * @param $captureErrors bool
+        * @param array|null $data
+        * @param bool $captureErrors
         * @throws ErrorPageError|Exception
         * @return bool
         */
index 6cab4d1..0039838 100644 (file)
@@ -30,7 +30,7 @@ abstract class FormlessAction extends Action {
 
        /**
         * Show something on GET request.
-        * @return String|null will be added to the HTMLForm if present, or just added to the
+        * @return string|null Will be added to the HTMLForm if present, or just added to the
         *     output if not.  Return null to not add anything
         */
        abstract public function onView();
@@ -44,7 +44,7 @@ abstract class FormlessAction extends Action {
        }
 
        /**
-        * @param $data Array
+        * @param array $data
         * @return bool
         */
        public function onSubmit( $data ) {
@@ -70,10 +70,10 @@ abstract class FormlessAction extends Action {
        /**
         * Execute the action silently, not giving any output.  Since these actions don't have
         * forms, they probably won't have any data, but some (eg rollback) may do
-        * @param array $data values that would normally be in the GET request
-        * @param bool $captureErrors whether to catch exceptions and just return false
+        * @param array $data Values that would normally be in the GET request
+        * @param bool $captureErrors Whether to catch exceptions and just return false
         * @throws ErrorPageError|Exception
-        * @return Bool whether execution was successful
+        * @return bool Whether execution was successful
         */
        public function execute( array $data = null, $captureErrors = true ) {
                try {
index 8e800f9..f1e3c26 100644 (file)
@@ -212,9 +212,9 @@ class HistoryAction extends FormlessAction {
         * direction. This is now only used by the feeds. It was previously
         * used by the main UI but that's now handled by the pager.
         *
-        * @param $limit Integer: the limit number of revisions to get
-        * @param $offset Integer
-        * @param $direction Integer: either HistoryPage::DIR_PREV or HistoryPage::DIR_NEXT
+        * @param int $limit The limit number of revisions to get
+        * @param int $offset
+        * @param int $direction Either HistoryPage::DIR_PREV or HistoryPage::DIR_NEXT
         * @return ResultWrapper
         */
        function fetchRevisions( $limit, $offset, $direction ) {
@@ -303,7 +303,7 @@ class HistoryAction extends FormlessAction {
         * Borrows Recent Changes' feed generation functions for formatting;
         * includes a diff to the previous revision (if any).
         *
-        * @param $row Object: database row
+        * @param stdClass|array $row database row
         * @return FeedItem
         */
        function feedItem( $row ) {
@@ -541,9 +541,9 @@ class HistoryPager extends ReverseChronologicalPager {
        /**
         * Creates a submit button
         *
-        * @param string $message text of the submit button, will be escaped
-        * @param array $attributes attributes
-        * @return String: HTML output for the submit button
+        * @param string $message Text of the submit button, will be escaped
+        * @param array $attributes Attributes
+        * @return string HTML output for the submit button
         */
        function submitButton( $message, $attributes = array() ) {
                # Disable submit button if history has 1 revision only
@@ -726,8 +726,8 @@ class HistoryPager extends ReverseChronologicalPager {
        /**
         * Create a link to view this revision of the page
         *
-        * @param $rev Revision
-        * @return String
+        * @param Revision $rev
+        * @return string
         */
        function revLink( $rev ) {
                $date = $this->getLanguage()->userTimeAndDate( $rev->getTimestamp(), $this->getUser() );
@@ -752,9 +752,9 @@ class HistoryPager extends ReverseChronologicalPager {
        /**
         * Create a diff-to-current link for this revision for this page
         *
-        * @param $rev Revision
-        * @param $latest Boolean: this is the latest revision of the page?
-        * @return String
+        * @param Revision $rev
+        * @param bool $latest This is the latest revision of the page?
+        * @return string
         */
        function curLink( $rev, $latest ) {
                $cur = $this->historyPage->message['cur'];
@@ -776,9 +776,9 @@ class HistoryPager extends ReverseChronologicalPager {
        /**
         * Create a diff-to-previous link for this revision for this page.
         *
-        * @param $prevRev Revision: the previous revision
-        * @param $next Mixed: the newer revision
-        * @return String
+        * @param Revision $prevRev The previous revision
+        * @param mixed $next The newer revision
+        * @return string
         */
        function lastLink( $prevRev, $next ) {
                $last = $this->historyPage->message['last'];
@@ -818,10 +818,10 @@ class HistoryPager extends ReverseChronologicalPager {
        /**
         * Create radio buttons for page history
         *
-        * @param $rev Revision object
-        * @param $firstInList Boolean: is this version the first one?
+        * @param Revision $rev
+        * @param bool $firstInList Is this version the first one?
         *
-        * @return String: HTML output for the radio buttons
+        * @return string HTML output for the radio buttons
         */
        function diffButtons( $rev, $firstInList ) {
                if ( $this->getNumRows() > 1 ) {
index 63f3151..06e3667 100644 (file)
@@ -33,7 +33,7 @@ class InfoAction extends FormlessAction {
        /**
         * Returns the name of the action this object responds to.
         *
-        * @return string lowercase
+        * @return string Lowercase name
         */
        public function getName() {
                return 'info';
@@ -763,7 +763,7 @@ class InfoAction extends FormlessAction {
 
        /**
         * Get a list of contributors of $article
-        * @return string: html
+        * @return string Html
         */
        protected function getContributors() {
                global $wgHiddenPrefs;
index b753407..1b72662 100644 (file)
@@ -125,7 +125,7 @@ class RawAction extends FormlessAction {
         * Get the text that should be returned, or false if the page or revision
         * was not found.
         *
-        * @return String|Bool
+        * @return string|bool
         */
        public function getRawText() {
                global $wgParser;
@@ -198,7 +198,7 @@ class RawAction extends FormlessAction {
        /**
         * Get the ID of the revision that should used to get the text.
         *
-        * @return Integer
+        * @return int
         */
        public function getOldId() {
                $oldid = $this->getRequest()->getInt( 'oldid' );
@@ -230,7 +230,7 @@ class RawAction extends FormlessAction {
        /**
         * Get the content type to use for the response
         *
-        * @return String
+        * @return string
         */
        public function getContentType() {
                $ctype = $this->getRequest()->getVal( 'ctype' );
index e1b5d52..2c7502e 100644 (file)
@@ -82,7 +82,14 @@ class WatchAction extends FormAction {
        protected function checkCanExecute( User $user ) {
                // Must be logged in
                if ( $user->isAnon() ) {
-                       throw new ErrorPageError( 'watchnologin', 'watchnologintext' );
+                       $loginreqlink = Linker::linkKnown(
+                               SpecialPage::getTitleFor( 'Userlogin' ),
+                               $this->msg( 'loginreqlink' )->escaped(),
+                               array(),
+                               array( 'returnto' => $this->getPageTitle(), 'returntoquery' => 'action=' . $this->getName() )
+                       );
+                       $reasonMsg = $this->msg( 'watchlistanontext' )->rawParams( $loginreqlink );
+                       throw new UserNotLoggedIn( $reasonMsg, 'watchnologin' );
                }
 
                return parent::checkCanExecute( $user );
index 72b1f88..fc1bfd1 100644 (file)
@@ -896,7 +896,7 @@ abstract class ApiBase extends ContextSource {
        /**
         * Callback function used in requireOnlyOneParameter to check whether required parameters are set
         *
-        * @param  $x object Parameter to check is not null/false
+        * @param $x object Parameter to check is not null/false
         * @return bool
         */
        private function parameterNotEmpty( $x ) {
@@ -1322,8 +1322,8 @@ abstract class ApiBase extends ContextSource {
        /**
         * Adds a warning to the output, else dies
         *
-        * @param  $msg String Message to show as a warning, or error message if dying
-        * @param  $enforceLimits Boolean Whether this is an enforce (die)
+        * @param $msg String Message to show as a warning, or error message if dying
+        * @param $enforceLimits Boolean Whether this is an enforce (die)
         */
        private function warnOrDie( $msg, $enforceLimits = false ) {
                if ( $enforceLimits ) {
index f1c1bf3..a2641ee 100644 (file)
@@ -52,6 +52,12 @@ class ApiFeedRecentChanges extends ApiBase {
                        $this->dieUsage( 'Invalid subscription feed type', 'feed-invalid' );
                }
 
+               $this->getMain()->setCacheMode( 'public' );
+               if ( !$this->getMain()->getParameter( 'smaxage' ) ) {
+                       // bug 63249: This page gets hit a lot, cache at least 15 seconds.
+                       $this->getMain()->setCacheMaxAge( 15 );
+               }
+
                $feedFormat = $this->params['feedformat'];
                $specialClass = $this->params['target'] !== null
                        ? 'SpecialRecentchangeslinked'
@@ -80,6 +86,10 @@ class ApiFeedRecentChanges extends ApiBase {
        public function getFeedObject( $feedFormat, $specialClass ) {
                if ( $specialClass === 'SpecialRecentchangeslinked' ) {
                        $title = Title::newFromText( $this->params['target'] );
+                       if ( !$title ) {
+                               $this->dieUsageMsg( array( 'invalidtitle', $this->params['target'] ) );
+                       }
+
                        $feed = new ChangesFeed( $feedFormat, false );
                        $feedObj = $feed->getFeedObject(
                                $this->msg( 'recentchangeslinked-title', $title->getPrefixedText() )
index e584d0d..ed64cd5 100644 (file)
@@ -107,8 +107,8 @@ class ApiHelp extends ApiBase {
        }
 
        /**
-        * @param  $module ApiBase
-        * @param  $type String What type of request is this? e.g. action, query, list, prop, meta, format
+        * @param $module ApiBase
+        * @param $type String What type of request is this? e.g. action, query, list, prop, meta, format
         * @return string
         */
        private function buildModuleHelp( $module, $type ) {
index 10b655f..1190781 100644 (file)
@@ -148,8 +148,8 @@ class ApiMove extends ApiBase {
        /**
         * @param Title $fromTitle
         * @param Title $toTitle
-        * @param  $reason
-        * @param  $noredirect
+        * @param $reason
+        * @param $noredirect
         * @return array
         */
        public function moveSubpages( $fromTitle, $toTitle, $reason, $noredirect ) {
index f2bf754..68b62af 100644 (file)
@@ -60,28 +60,8 @@ class ApiOpenSearch extends ApiBase {
                        $this->getMain()->setCacheMaxAge( $wgSearchSuggestCacheExpiry );
                        $this->getMain()->setCacheMode( 'public' );
 
-                       $searches = PrefixSearch::titleSearch( $search, $limit,
-                               $namespaces );
-
-                       // if the content language has variants, try to retrieve fallback results
-                       $fallbackLimit = $limit - count( $searches );
-                       if ( $fallbackLimit > 0 ) {
-                               global $wgContLang;
-
-                               $fallbackSearches = $wgContLang->autoConvertToAllVariants( $search );
-                               $fallbackSearches = array_diff( array_unique( $fallbackSearches ), array( $search ) );
-
-                               foreach ( $fallbackSearches as $fbs ) {
-                                       $fallbackSearchResult = PrefixSearch::titleSearch( $fbs, $fallbackLimit,
-                                               $namespaces );
-                                       $searches = array_merge( $searches, $fallbackSearchResult );
-                                       $fallbackLimit -= count( $fallbackSearchResult );
-
-                                       if ( $fallbackLimit == 0 ) {
-                                               break;
-                                       }
-                               }
-                       }
+                       $searcher = new StringPrefixSearch;
+                       $searches = $searcher->searchWithVariants( $search, $limit, $namespaces );
                }
                // Set top level elements
                $result = $this->getResult();
index c6ae611..0a95fba 100644 (file)
@@ -86,6 +86,7 @@ class ApiQuery extends ApiBase {
                'logevents' => 'ApiQueryLogEvents',
                'pageswithprop' => 'ApiQueryPagesWithProp',
                'pagepropnames' => 'ApiQueryPagePropNames',
+               'prefixsearch' => 'ApiQueryPrefixSearch',
                'protectedtitles' => 'ApiQueryProtectedTitles',
                'querypage' => 'ApiQueryQueryPage',
                'random' => 'ApiQueryRandom',
index 6e2c31f..229c07e 100644 (file)
@@ -168,6 +168,20 @@ class ApiQueryAllImages extends ApiQueryGeneratorBase {
                                $params['start'],
                                $params['end']
                        );
+                       // Include in ORDER BY for uniqueness
+                       $this->addWhereRange( 'img_name', $ascendingOrder ? 'newer' : 'older', null, null );
+
+                       if ( !is_null( $params['continue'] ) ) {
+                               $cont = explode( '|', $params['continue'] );
+                               $this->dieContinueUsageIf( count( $cont ) != 2 );
+                               $op = ( $ascendingOrder ? '>' : '<' );
+                               $continueTimestamp = $db->addQuotes( $db->timestamp( $cont[0] ) );
+                               $continueName = $db->addQuotes( $cont[1] );
+                               $this->addWhere( "img_timestamp $op $continueTimestamp OR " .
+                                       "(img_timestamp = $continueTimestamp AND " .
+                                       "img_name $op= $continueName)"
+                               );
+                       }
 
                        // Image filters
                        if ( !is_null( $params['user'] ) ) {
@@ -254,7 +268,7 @@ class ApiQueryAllImages extends ApiQueryGeneratorBase {
                                if ( $params['sort'] == 'name' ) {
                                        $this->setContinueEnumParameter( 'continue', $row->img_name );
                                } else {
-                                       $this->setContinueEnumParameter( 'start', wfTimestamp( TS_ISO_8601, $row->img_timestamp ) );
+                                       $this->setContinueEnumParameter( 'continue', "$row->img_timestamp|$row->img_name" );
                                }
                                break;
                        }
@@ -270,7 +284,7 @@ class ApiQueryAllImages extends ApiQueryGeneratorBase {
                                        if ( $params['sort'] == 'name' ) {
                                                $this->setContinueEnumParameter( 'continue', $row->img_name );
                                        } else {
-                                               $this->setContinueEnumParameter( 'start', wfTimestamp( TS_ISO_8601, $row->img_timestamp ) );
+                                               $this->setContinueEnumParameter( 'continue', "$row->img_timestamp|$row->img_name" );
                                        }
                                        break;
                                }
index 6cc0183..cfca140 100644 (file)
@@ -43,6 +43,7 @@ class ApiQueryBlocks extends ApiQueryBase {
        public function execute() {
                global $wgContLang;
 
+               $db = $this->getDB();
                $params = $this->extractRequestParams();
                $this->requireMaxOneParameter( $params, 'users', 'ip' );
 
@@ -61,9 +62,8 @@ class ApiQueryBlocks extends ApiQueryBase {
                $result = $this->getResult();
 
                $this->addTables( 'ipblocks' );
-               $this->addFields( 'ipb_auto' );
+               $this->addFields( array( 'ipb_auto', 'ipb_id' ) );
 
-               $this->addFieldsIf( 'ipb_id', $fld_id );
                $this->addFieldsIf( array( 'ipb_address', 'ipb_user' ), $fld_user || $fld_userid );
                $this->addFieldsIf( 'ipb_by_text', $fld_by );
                $this->addFieldsIf( 'ipb_by', $fld_byid );
@@ -82,8 +82,21 @@ class ApiQueryBlocks extends ApiQueryBase {
                        $params['start'],
                        $params['end']
                );
-
-               $db = $this->getDB();
+               // Include in ORDER BY for uniqueness
+               $this->addWhereRange( 'ipb_id', $params['dir'], null, null );
+
+               if ( !is_null( $params['continue'] ) ) {
+                       $cont = explode( '|', $params['continue'] );
+                       $this->dieContinueUsageIf( count( $cont ) != 2 );
+                       $op = ( $params['dir'] == 'newer' ? '>' : '<' );
+                       $continueTimestamp = $db->addQuotes( $db->timestamp( $cont[0] ) );
+                       $continueId = (int)$cont[1];
+                       $this->dieContinueUsageIf( $continueId != $cont[1] );
+                       $this->addWhere( "ipb_timestamp $op $continueTimestamp OR " .
+                               "(ipb_timestamp = $continueTimestamp AND " .
+                               "ipb_id $op= $continueId)"
+                       );
+               }
 
                if ( isset( $params['ids'] ) ) {
                        $this->addWhereFld( 'ipb_id', $params['ids'] );
@@ -176,7 +189,7 @@ class ApiQueryBlocks extends ApiQueryBase {
                foreach ( $res as $row ) {
                        if ( ++$count > $params['limit'] ) {
                                // We've had enough
-                               $this->setContinueEnumParameter( 'start', wfTimestamp( TS_ISO_8601, $row->ipb_timestamp ) );
+                               $this->setContinueEnumParameter( 'continue', "$row->ipb_timestamp|$row->ipb_id" );
                                break;
                        }
                        $block = array();
@@ -234,7 +247,7 @@ class ApiQueryBlocks extends ApiQueryBase {
                        }
                        $fit = $result->addValue( array( 'query', $this->getModuleName() ), null, $block );
                        if ( !$fit ) {
-                               $this->setContinueEnumParameter( 'start', wfTimestamp( TS_ISO_8601, $row->ipb_timestamp ) );
+                               $this->setContinueEnumParameter( 'continue', "$row->ipb_timestamp|$row->ipb_id" );
                                break;
                        }
                }
@@ -313,6 +326,7 @@ class ApiQueryBlocks extends ApiQueryBase {
                                ),
                                ApiBase::PARAM_ISMULTI => true
                        ),
+                       'continue' => null,
                );
        }
 
@@ -350,6 +364,7 @@ class ApiQueryBlocks extends ApiQueryBase {
                                'Show only items that meet this criteria.',
                                "For example, to see only indefinite blocks on IPs, set {$p}show=ip|!temp"
                        ),
+                       'continue' => 'When more results are available, use this to continue',
                );
        }
 
index 4e942d6..424770f 100644 (file)
@@ -101,6 +101,22 @@ class ApiQueryCategoryMembers extends ApiQueryGeneratorBase {
                                $dir,
                                $params['start'],
                                $params['end'] );
+                       // Include in ORDER BY for uniqueness
+                       $this->addWhereRange( 'cl_from', $dir, null, null );
+
+                       if ( !is_null( $params['continue'] ) ) {
+                               $cont = explode( '|', $params['continue'] );
+                               $this->dieContinueUsageIf( count( $cont ) != 2 );
+                               $op = ( $dir === 'newer' ? '>' : '<' );
+                               $db = $this->getDB();
+                               $continueTimestamp = $db->addQuotes( $db->timestamp( $cont[0] ) );
+                               $continueFrom = (int)$cont[1];
+                               $this->dieContinueUsageIf( $continueFrom != $cont[1] );
+                               $this->addWhere( "cl_timestamp $op $continueTimestamp OR " .
+                                       "(cl_timestamp = $continueTimestamp AND " .
+                                       "cl_from $op= $continueFrom)"
+                               );
+                       }
 
                        $this->addOption( 'USE INDEX', 'cl_timestamp' );
                } else {
@@ -186,7 +202,7 @@ class ApiQueryCategoryMembers extends ApiQueryGeneratorBase {
                                // @todo Security issue - if the user has no right to view next
                                // title, it will still be shown
                                if ( $params['sort'] == 'timestamp' ) {
-                                       $this->setContinueEnumParameter( 'start', wfTimestamp( TS_ISO_8601, $row->cl_timestamp ) );
+                                       $this->setContinueEnumParameter( 'continue', "$row->cl_timestamp|$row->cl_from" );
                                } else {
                                        $sortkey = bin2hex( $row->cl_sortkey );
                                        $this->setContinueEnumParameter( 'continue',
@@ -229,7 +245,7 @@ class ApiQueryCategoryMembers extends ApiQueryGeneratorBase {
                                        null, $vals );
                                if ( !$fit ) {
                                        if ( $params['sort'] == 'timestamp' ) {
-                                               $this->setContinueEnumParameter( 'start', wfTimestamp( TS_ISO_8601, $row->cl_timestamp ) );
+                                               $this->setContinueEnumParameter( 'continue', "$row->cl_timestamp|$row->cl_from" );
                                        } else {
                                                $sortkey = bin2hex( $row->cl_sortkey );
                                                $this->setContinueEnumParameter( 'continue',
index f738c50..2ca93f5 100644 (file)
@@ -106,7 +106,7 @@ class ApiQueryDeletedrevs extends ApiQueryBase {
                }
 
                $this->addTables( 'archive' );
-               $this->addFields( array( 'ar_title', 'ar_namespace', 'ar_timestamp', 'ar_deleted' ) );
+               $this->addFields( array( 'ar_title', 'ar_namespace', 'ar_timestamp', 'ar_deleted', 'ar_id' ) );
 
                $this->addFieldsIf( 'ar_parent_id', $fld_parentid );
                $this->addFieldsIf( 'ar_rev_id', $fld_revid );
@@ -214,19 +214,33 @@ class ApiQueryDeletedrevs extends ApiQueryBase {
                        }
                }
 
-               if ( !is_null( $params['continue'] ) && ( $mode == 'all' || $mode == 'revs' ) ) {
+               if ( !is_null( $params['continue'] ) ) {
                        $cont = explode( '|', $params['continue'] );
-                       $this->dieContinueUsageIf( count( $cont ) != 3 );
-                       $ns = intval( $cont[0] );
-                       $this->dieContinueUsageIf( strval( $ns ) !== $cont[0] );
-                       $title = $db->addQuotes( $cont[1] );
-                       $ts = $db->addQuotes( $db->timestamp( $cont[2] ) );
                        $op = ( $dir == 'newer' ? '>' : '<' );
-                       $this->addWhere( "ar_namespace $op $ns OR " .
-                               "(ar_namespace = $ns AND " .
-                               "(ar_title $op $title OR " .
-                               "(ar_title = $title AND " .
-                               "ar_timestamp $op= $ts)))" );
+                       if ( $mode == 'all' || $mode == 'revs' ) {
+                               $this->dieContinueUsageIf( count( $cont ) != 4 );
+                               $ns = intval( $cont[0] );
+                               $this->dieContinueUsageIf( strval( $ns ) !== $cont[0] );
+                               $title = $db->addQuotes( $cont[1] );
+                               $ts = $db->addQuotes( $db->timestamp( $cont[2] ) );
+                               $ar_id = (int)$cont[3];
+                               $this->dieContinueUsageIf( strval( $ar_id ) !== $cont[3] );
+                               $this->addWhere( "ar_namespace $op $ns OR " .
+                                       "(ar_namespace = $ns AND " .
+                                       "(ar_title $op $title OR " .
+                                       "(ar_title = $title AND " .
+                                       "(ar_timestamp $op $ts OR " .
+                                       "(ar_timestamp = $ts AND " .
+                                       "ar_id $op= $ar_id)))))" );
+                       } else {
+                               $this->dieContinueUsageIf( count( $cont ) != 2 );
+                               $ts = $db->addQuotes( $db->timestamp( $cont[0] ) );
+                               $ar_id = (int)$cont[1];
+                               $this->dieContinueUsageIf( strval( $ar_id ) !== $cont[1] );
+                               $this->addWhere( "ar_timestamp $op $ts OR " .
+                                       "(ar_timestamp = $ts AND " .
+                                       "ar_id $op= $ar_id)" );
+                       }
                }
 
                $this->addOption( 'LIMIT', $limit + 1 );
@@ -236,12 +250,14 @@ class ApiQueryDeletedrevs extends ApiQueryBase {
                );
                if ( $mode == 'all' ) {
                        if ( $params['unique'] ) {
+                               // @todo Does this work on non-MySQL?
                                $this->addOption( 'GROUP BY', 'ar_title' );
                        } else {
                                $sort = ( $dir == 'newer' ? '' : ' DESC' );
                                $this->addOption( 'ORDER BY', array(
                                        'ar_title' . $sort,
-                                       'ar_timestamp' . $sort
+                                       'ar_timestamp' . $sort,
+                                       'ar_id' . $sort,
                                ) );
                        }
                } else {
@@ -251,6 +267,8 @@ class ApiQueryDeletedrevs extends ApiQueryBase {
                                $this->addWhereRange( 'ar_title', $dir, null, null );
                        }
                        $this->addTimestampWhereRange( 'ar_timestamp', $dir, $params['start'], $params['end'] );
+                       // Include in ORDER BY for uniqueness
+                       $this->addWhereRange( 'ar_id', $dir, null, null );
                }
                $res = $this->select( __METHOD__ );
                $pageMap = array(); // Maps ns&title to (fake) pageid
@@ -260,10 +278,11 @@ class ApiQueryDeletedrevs extends ApiQueryBase {
                        if ( ++$count > $limit ) {
                                // We've had enough
                                if ( $mode == 'all' || $mode == 'revs' ) {
-                                       $this->setContinueEnumParameter( 'continue', intval( $row->ar_namespace ) . '|' .
-                                               $row->ar_title . '|' . $row->ar_timestamp );
+                                       $this->setContinueEnumParameter( 'continue',
+                                               "$row->ar_namespace|$row->ar_title|$row->ar_timestamp|$row->ar_id"
+                                       );
                                } else {
-                                       $this->setContinueEnumParameter( 'start', wfTimestamp( TS_ISO_8601, $row->ar_timestamp ) );
+                                       $this->setContinueEnumParameter( 'continue', "$row->ar_timestamp|$row->ar_id" );
                                }
                                break;
                        }
@@ -371,10 +390,11 @@ class ApiQueryDeletedrevs extends ApiQueryBase {
                        }
                        if ( !$fit ) {
                                if ( $mode == 'all' || $mode == 'revs' ) {
-                                       $this->setContinueEnumParameter( 'continue', intval( $row->ar_namespace ) . '|' .
-                                               $row->ar_title . '|' . $row->ar_timestamp );
+                                       $this->setContinueEnumParameter( 'continue',
+                                               "$row->ar_namespace|$row->ar_title|$row->ar_timestamp|$row->ar_id"
+                                       );
                                } else {
-                                       $this->setContinueEnumParameter( 'start', wfTimestamp( TS_ISO_8601, $row->ar_timestamp ) );
+                                       $this->setContinueEnumParameter( 'continue', "$row->ar_timestamp|$row->ar_id" );
                                }
                                break;
                        }
@@ -468,7 +488,7 @@ class ApiQueryDeletedrevs extends ApiQueryBase {
                        'namespace' => 'Only list pages in this namespace (3)',
                        'user' => 'Only list revisions by this user',
                        'excludeuser' => 'Don\'t list revisions by this user',
-                       'continue' => 'When more results are available, use this to continue (1, 3)',
+                       'continue' => 'When more results are available, use this to continue',
                        'unique' => 'List only one revision for each page (3)',
                        'tag' => 'Only list revisions tagged with this tag',
                );
@@ -494,8 +514,8 @@ class ApiQueryDeletedrevs extends ApiQueryBase {
                        'Operates in three modes:',
                        ' 1) List deleted revisions for the given title(s), sorted by timestamp.',
                        ' 2) List deleted contributions for the given user, sorted by timestamp (no titles specified).',
-                       " 3) List all deleted revisions in the given namespace, sorted by title and timestamp',
-                       '    (no titles specified, {$p}user not set).",
+                       ' 3) List all deleted revisions in the given namespace, sorted by title and timestamp',
+                       "    (no titles specified, {$p}user not set).",
                        'Certain parameters only apply to some modes and are ignored in others.',
                        'For instance, a parameter marked (1) only applies to mode 1 and is ignored in modes 2 and 3.',
                );
index b607ca5..ee7fbc0 100644 (file)
@@ -73,13 +73,14 @@ class ApiQueryLogEvents extends ApiQueryBase {
                                        'log_title=page_title' ) ) ) );
 
                $this->addFields( array(
+                       'log_id',
                        'log_type',
                        'log_action',
                        'log_timestamp',
                        'log_deleted',
                ) );
 
-               $this->addFieldsIf( array( 'log_id', 'page_id' ), $this->fld_ids );
+               $this->addFieldsIf( 'page_id', $this->fld_ids );
                $this->addFieldsIf( array( 'log_user', 'log_user_text', 'user_name' ), $this->fld_user );
                $this->addFieldsIf( 'log_user', $this->fld_userid );
                $this->addFieldsIf(
@@ -135,6 +136,21 @@ class ApiQueryLogEvents extends ApiQueryBase {
                        $params['start'],
                        $params['end']
                );
+               // Include in ORDER BY for uniqueness
+               $this->addWhereRange( 'log_id', $params['dir'], null, null );
+
+               if ( !is_null( $params['continue'] ) ) {
+                       $cont = explode( '|', $params['continue'] );
+                       $this->dieContinueUsageIf( count( $cont ) != 2 );
+                       $op = ( $params['dir'] === 'newer' ? '>' : '<' );
+                       $continueTimestamp = $db->addQuotes( $db->timestamp( $cont[0] ) );
+                       $continueId = (int)$cont[1];
+                       $this->dieContinueUsageIf( $continueId != $cont[1] );
+                       $this->addWhere( "log_timestamp $op $continueTimestamp OR " .
+                               "(log_timestamp = $continueTimestamp AND " .
+                               "log_id $op= $continueId)"
+                       );
+               }
 
                $limit = $params['limit'];
                $this->addOption( 'LIMIT', $limit + 1 );
@@ -202,7 +218,7 @@ class ApiQueryLogEvents extends ApiQueryBase {
                        if ( ++$count > $limit ) {
                                // We've reached the one extra which shows that there are
                                // additional pages to be had. Stop here...
-                               $this->setContinueEnumParameter( 'start', wfTimestamp( TS_ISO_8601, $row->log_timestamp ) );
+                               $this->setContinueEnumParameter( 'continue', "$row->log_timestamp|$row->log_id" );
                                break;
                        }
 
@@ -212,7 +228,7 @@ class ApiQueryLogEvents extends ApiQueryBase {
                        }
                        $fit = $result->addValue( array( 'query', $this->getModuleName() ), null, $vals );
                        if ( !$fit ) {
-                               $this->setContinueEnumParameter( 'start', wfTimestamp( TS_ISO_8601, $row->log_timestamp ) );
+                               $this->setContinueEnumParameter( 'continue', "$row->log_timestamp|$row->log_id" );
                                break;
                        }
                }
@@ -497,7 +513,8 @@ class ApiQueryLogEvents extends ApiQueryBase {
                                ApiBase::PARAM_MIN => 1,
                                ApiBase::PARAM_MAX => ApiBase::LIMIT_BIG1,
                                ApiBase::PARAM_MAX2 => ApiBase::LIMIT_BIG2
-                       )
+                       ),
+                       'continue' => null,
                );
        }
 
@@ -531,6 +548,7 @@ class ApiQueryLogEvents extends ApiQueryBase {
                        'prefix' => 'Filter entries that start with this prefix. Disabled in Miser Mode',
                        'limit' => 'How many total event entries to return',
                        'tag' => 'Only list event entries tagged with this tag',
+                       'continue' => 'When more results are available, use this to continue',
                );
        }
 
diff --git a/includes/api/ApiQueryPrefixSearch.php b/includes/api/ApiQueryPrefixSearch.php
new file mode 100644 (file)
index 0000000..dfe0eec
--- /dev/null
@@ -0,0 +1,124 @@
+<?php
+/**
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @since 1.23
+ */
+
+/**
+ * @ingroup API
+ */
+class ApiQueryPrefixSearch extends ApiQueryGeneratorBase {
+       public function __construct( $query, $moduleName ) {
+               parent::__construct( $query, $moduleName, 'ps' );
+       }
+
+       public function execute() {
+               $this->run();
+       }
+
+       public function executeGenerator( $resultPageSet ) {
+               $this->run( $resultPageSet );
+       }
+
+       /**
+        * @param $resultPageSet ApiPageSet
+        */
+       private function run( $resultPageSet = null ) {
+               $params = $this->extractRequestParams();
+               $search = $params['search'];
+               $limit = $params['limit'];
+               $namespaces = $params['namespace'];
+
+               $searcher = new TitlePrefixSearch;
+               $titles = $searcher->searchWithVariants( $search, $limit, $namespaces );
+               if ( $resultPageSet ) {
+                       $resultPageSet->populateFromTitles( $titles );
+               } else {
+                       $result = $this->getResult();
+                       foreach ( $titles as $title ) {
+                               if ( !$limit-- ) {
+                                       break;
+                               }
+                               $vals = array(
+                                       'ns' => intval( $title->getNamespace() ),
+                                       'title' => $title->getPrefixedText(),
+                               );
+                               if ( $title->isSpecialPage() ) {
+                                       $vals['special'] = '';
+                               } else {
+                                       $vals['pageid'] = intval( $title->getArticleId() );
+                               }
+                               $fit = $result->addValue( array( 'query', $this->getModuleName() ), null, $vals );
+                               if ( !$fit ) {
+                                       break;
+                               }
+                       }
+                       $result->setIndexedTagName_internal(
+                               array( 'query', $this->getModuleName() ), $this->getModulePrefix()
+                       );
+               }
+       }
+
+       public function getCacheMode( $params ) {
+               return 'public';
+       }
+
+       public function getAllowedParams() {
+                       return array(
+                               'search' => array(
+                                       ApiBase::PARAM_TYPE => 'string',
+                                       ApiBase::PARAM_REQUIRED => true,
+                               ),
+                               'namespace' => array(
+                                       ApiBase::PARAM_DFLT => NS_MAIN,
+                                       ApiBase::PARAM_TYPE => 'namespace',
+                                       ApiBase::PARAM_ISMULTI => true,
+                               ),
+                               'limit' => array(
+                                       ApiBase::PARAM_DFLT => 10,
+                                       ApiBase::PARAM_TYPE => 'limit',
+                                       ApiBase::PARAM_MIN => 1,
+                                       ApiBase::PARAM_MAX => 100, // Non-standard value for compatibility
+                                                                  // with action=opensearch
+                                       ApiBase::PARAM_MAX2 => 200,
+                               ),
+                       );
+       }
+
+       public function getParamDescription() {
+               return array(
+                       'search' => 'Search string',
+                       'limit' => 'Maximum amount of results to return',
+                       'namespace' => 'Namespaces to search',
+               );
+       }
+
+       public function getDescription() {
+               return 'Perform a prefix search for page titles';
+       }
+
+       public function getExamples() {
+               return array(
+                       'api.php?action=query&list=prefixsearch&pssearch=meaning',
+               );
+       }
+
+       public function getHelpUrls() {
+               return 'https://www.mediawiki.org/wiki/API:Prefixsearch';
+       }
+}
index 9cdd6b9..6cf7ff3 100644 (file)
@@ -63,6 +63,27 @@ class ApiQueryProtectedTitles extends ApiQueryGeneratorBase {
                $this->addWhereFld( 'pt_namespace', $params['namespace'] );
                $this->addWhereFld( 'pt_create_perm', $params['level'] );
 
+               // Include in ORDER BY for uniqueness
+               $this->addWhereRange( 'pt_namespace', $params['dir'], null, null );
+               $this->addWhereRange( 'pt_title', $params['dir'], null, null );
+
+               if ( !is_null( $params['continue'] ) ) {
+                       $cont = explode( '|', $params['continue'] );
+                       $this->dieContinueUsageIf( count( $cont ) != 3 );
+                       $op = ( $params['dir'] === 'newer' ? '>' : '<' );
+                       $db = $this->getDB();
+                       $continueTimestamp = $db->addQuotes( $db->timestamp( $cont[0] ) );
+                       $continueNs = (int)$cont[1];
+                       $this->dieContinueUsageIf( $continueNs != $cont[1] );
+                       $continueTitle = $db->addQuotes( $cont[2] );
+                       $this->addWhere( "pt_timestamp $op $continueTimestamp OR " .
+                               "(pt_timestamp = $continueTimestamp AND " .
+                               "(pt_namespace $op $continueNs OR " .
+                               "(pt_namespace = $continueNs AND " .
+                               "pt_title $op= $continueTitle)))"
+                       );
+               }
+
                if ( isset( $prop['user'] ) ) {
                        $this->addTables( 'user' );
                        $this->addFields( 'user_name' );
@@ -83,7 +104,9 @@ class ApiQueryProtectedTitles extends ApiQueryGeneratorBase {
                        if ( ++$count > $params['limit'] ) {
                                // We've reached the one extra which shows that there are
                                // additional pages to be had. Stop here...
-                               $this->setContinueEnumParameter( 'start', wfTimestamp( TS_ISO_8601, $row->pt_timestamp ) );
+                               $this->setContinueEnumParameter( 'continue',
+                                       "$row->pt_timestamp|$row->pt_namespace|$row->pt_title"
+                               );
                                break;
                        }
 
@@ -122,8 +145,9 @@ class ApiQueryProtectedTitles extends ApiQueryGeneratorBase {
 
                                $fit = $result->addValue( array( 'query', $this->getModuleName() ), null, $vals );
                                if ( !$fit ) {
-                                       $this->setContinueEnumParameter( 'start',
-                                               wfTimestamp( TS_ISO_8601, $row->pt_timestamp ) );
+                                       $this->setContinueEnumParameter( 'continue',
+                                               "$row->pt_timestamp|$row->pt_namespace|$row->pt_title"
+                                       );
                                        break;
                                }
                        } else {
@@ -195,6 +219,7 @@ class ApiQueryProtectedTitles extends ApiQueryGeneratorBase {
                                        'level'
                                )
                        ),
+                       'continue' => null,
                );
        }
 
@@ -216,6 +241,7 @@ class ApiQueryProtectedTitles extends ApiQueryGeneratorBase {
                                ' level          - Adds the protection level',
                        ),
                        'level' => 'Only list titles with these protection levels',
+                       'continue' => 'When more results are available, use this to continue',
                );
        }
 
index 5f85e0e..ad26cce 100644 (file)
@@ -46,11 +46,11 @@ class ApiQueryRandom extends ApiQueryGeneratorBase {
        }
 
        /**
-        * @param  $randstr
-        * @param  $limit
-        * @param  $namespace
+        * @param $randstr
+        * @param $limit
+        * @param $namespace
         * @param $resultPageSet ApiPageSet
-        * @param  $redirect
+        * @param $redirect
         * @return void
         */
        protected function prepareQuery( $randstr, $limit, $namespace, &$resultPageSet, $redirect ) {
index 0284916..80352f2 100644 (file)
@@ -69,8 +69,8 @@ class ApiQueryRecentChanges extends ApiQueryGeneratorBase {
        }
 
        /**
-        * @param  $pageid
-        * @param  $title
+        * @param $pageid
+        * @param $title
         * @param $rc RecentChange (optional)
         * @return bool|string
         */
@@ -152,15 +152,12 @@ class ApiQueryRecentChanges extends ApiQueryGeneratorBase {
 
                if ( !is_null( $params['continue'] ) ) {
                        $cont = explode( '|', $params['continue'] );
-                       if ( count( $cont ) != 2 ) {
-                               $this->dieUsage( 'Invalid continue param. You should pass the ' .
-                                       'original value returned by the previous query', '_badcontinue' );
-                       }
-
-                       $timestamp = $this->getDB()->addQuotes( wfTimestamp( TS_MW, $cont[0] ) );
+                       $this->dieContinueUsageIf( count( $cont ) != 2 );
+                       $db = $this->getDB();
+                       $timestamp = $db->addQuotes( $db->timestamp( $cont[0] ) );
                        $id = intval( $cont[1] );
+                       $this->dieContinueUsageIf( $id != $cont[1] );
                        $op = $params['dir'] === 'older' ? '<' : '>';
-
                        $this->addWhere(
                                "rc_timestamp $op $timestamp OR " .
                                "(rc_timestamp = $timestamp AND " .
@@ -254,6 +251,7 @@ class ApiQueryRecentChanges extends ApiQueryGeneratorBase {
 
                /* Add the fields we're concerned with to our query. */
                $this->addFields( array(
+                       'rc_id',
                        'rc_timestamp',
                        'rc_namespace',
                        'rc_title',
@@ -277,7 +275,6 @@ class ApiQueryRecentChanges extends ApiQueryGeneratorBase {
                                );
                        }
 
-                       $this->addFields( 'rc_id' );
                        /* Add fields to our query if they are specified as a needed parameter. */
                        $this->addFieldsIf( array( 'rc_this_oldid', 'rc_last_oldid' ), $this->fld_ids );
                        $this->addFieldsIf( 'rc_comment', $this->fld_comment || $this->fld_parsedcomment );
@@ -371,10 +368,7 @@ class ApiQueryRecentChanges extends ApiQueryGeneratorBase {
                        if ( ++$count > $params['limit'] ) {
                                // We've reached the one extra which shows that there are
                                // additional pages to be had. Stop here...
-                               $this->setContinueEnumParameter(
-                                       'continue',
-                                       wfTimestamp( TS_ISO_8601, $row->rc_timestamp ) . '|' . $row->rc_id
-                               );
+                               $this->setContinueEnumParameter( 'continue', "$row->rc_timestamp|$row->rc_id" );
                                break;
                        }
 
@@ -388,10 +382,7 @@ class ApiQueryRecentChanges extends ApiQueryGeneratorBase {
                                }
                                $fit = $result->addValue( array( 'query', $this->getModuleName() ), null, $vals );
                                if ( !$fit ) {
-                                       $this->setContinueEnumParameter(
-                                               'continue',
-                                               wfTimestamp( TS_ISO_8601, $row->rc_timestamp ) . '|' . $row->rc_id
-                                       );
+                                       $this->setContinueEnumParameter( 'continue', "$row->rc_timestamp|$row->rc_id" );
                                        break;
                                }
                        } else {
index 1cd8d98..b7796ee 100644 (file)
@@ -656,12 +656,12 @@ class ApiQuerySiteinfo extends ApiQueryBase {
 
        public function appendSkins( $property ) {
                $data = array();
-               $usable = Skin::getUsableSkins();
+               $allowed = Skin::getAllowedSkins();
                $default = Skin::normalizeKey( 'default' );
                foreach ( Skin::getSkinNames() as $name => $displayName ) {
                        $skin = array( 'code' => $name );
                        ApiResult::setContent( $skin, $displayName );
-                       if ( !isset( $usable[$name] ) ) {
+                       if ( !isset( $allowed[$name] ) ) {
                                $skin['unusable'] = '';
                        }
                        if ( $name === $default ) {
index b58a951..e9fec43 100644 (file)
@@ -108,22 +108,14 @@ class ApiQueryContributions extends ApiQueryBase {
                        if ( ++$count > $limit ) {
                                // We've reached the one extra which shows that there are
                                // additional pages to be had. Stop here...
-                               if ( $this->multiUserMode ) {
-                                       $this->setContinueEnumParameter( 'continue', $this->continueStr( $row ) );
-                               } else {
-                                       $this->setContinueEnumParameter( 'start', wfTimestamp( TS_ISO_8601, $row->rev_timestamp ) );
-                               }
+                               $this->setContinueEnumParameter( 'continue', $this->continueStr( $row ) );
                                break;
                        }
 
                        $vals = $this->extractRowInfo( $row );
                        $fit = $this->getResult()->addValue( array( 'query', $this->getModuleName() ), null, $vals );
                        if ( !$fit ) {
-                               if ( $this->multiUserMode ) {
-                                       $this->setContinueEnumParameter( 'continue', $this->continueStr( $row ) );
-                               } else {
-                                       $this->setContinueEnumParameter( 'start', wfTimestamp( TS_ISO_8601, $row->rev_timestamp ) );
-                               }
+                               $this->setContinueEnumParameter( 'continue', $this->continueStr( $row ) );
                                break;
                        }
                }
@@ -167,18 +159,34 @@ class ApiQueryContributions extends ApiQueryBase {
                $this->addWhere( 'page_id=rev_page' );
 
                // Handle continue parameter
-               if ( $this->multiUserMode && !is_null( $this->params['continue'] ) ) {
+               if ( !is_null( $this->params['continue'] ) ) {
                        $continue = explode( '|', $this->params['continue'] );
-                       $this->dieContinueUsageIf( count( $continue ) != 2 );
                        $db = $this->getDB();
-                       $encUser = $db->addQuotes( $continue[0] );
-                       $encTS = $db->addQuotes( $db->timestamp( $continue[1] ) );
+                       if ( $this->multiUserMode ) {
+                               $this->dieContinueUsageIf( count( $continue ) != 3 );
+                               $encUser = $db->addQuotes( array_shift( $continue ) );
+                       } else {
+                               $this->dieContinueUsageIf( count( $continue ) != 2 );
+                       }
+                       $encTS = $db->addQuotes( $db->timestamp( $continue[0] ) );
+                       $encId = (int)$continue[1];
+                       $this->dieContinueUsageIf( $encId != $continue[1] );
                        $op = ( $this->params['dir'] == 'older' ? '<' : '>' );
-                       $this->addWhere(
-                               "rev_user_text $op $encUser OR " .
-                               "(rev_user_text = $encUser AND " .
-                               "rev_timestamp $op= $encTS)"
-                       );
+                       if ( $this->multiUserMode ) {
+                               $this->addWhere(
+                                       "rev_user_text $op $encUser OR " .
+                                       "(rev_user_text = $encUser AND " .
+                                       "(rev_timestamp $op $encTS OR " .
+                                       "(rev_timestamp = $encTS AND " .
+                                       "rev_id $op= $encId)))"
+                               );
+                       } else {
+                               $this->addWhere(
+                                       "rev_timestamp $op $encTS OR " .
+                                       "(rev_timestamp = $encTS AND " .
+                                       "rev_id $op= $encId)"
+                               );
+                       }
                }
 
                // Don't include any revisions where we're not supposed to be able to
@@ -209,6 +217,9 @@ class ApiQueryContributions extends ApiQueryBase {
                }
                $this->addTimestampWhereRange( 'rev_timestamp',
                        $this->params['dir'], $this->params['start'], $this->params['end'] );
+               // Include in ORDER BY for uniqueness
+               $this->addWhereRange( 'rev_id', $this->params['dir'], null, null );
+
                $this->addWhereFld( 'page_namespace', $this->params['namespace'] );
 
                $show = $this->params['show'];
@@ -242,6 +253,7 @@ class ApiQueryContributions extends ApiQueryBase {
                // ns+title checks if the user has access rights for this page
                // user_text is necessary if multiple users were specified
                $this->addFields( array(
+                       'rev_id',
                        'rev_timestamp',
                        'page_namespace',
                        'page_title',
@@ -284,7 +296,6 @@ class ApiQueryContributions extends ApiQueryBase {
 
                $this->addTables( $tables );
                $this->addFieldsIf( 'rev_page', $this->fld_ids );
-               $this->addFieldsIf( 'rev_id', $this->fld_ids || $this->fld_flags );
                $this->addFieldsIf( 'page_latest', $this->fld_flags );
                // $this->addFieldsIf( 'rev_text_id', $this->fld_ids ); // Should this field be exposed?
                $this->addFieldsIf( 'rev_comment', $this->fld_comment || $this->fld_parsedcomment );
@@ -424,8 +435,11 @@ class ApiQueryContributions extends ApiQueryBase {
        }
 
        private function continueStr( $row ) {
-               return $row->rev_user_text . '|' .
-                       wfTimestamp( TS_ISO_8601, $row->rev_timestamp );
+               if ( $this->multiUserMode ) {
+                       return "$row->rev_user_text|$row->rev_timestamp|$row->rev_id";
+               } else {
+                       return "$row->rev_timestamp|$row->rev_id";
+               }
        }
 
        public function getCacheMode( $params ) {
index 6baa87d..2e1ce6c 100644 (file)
@@ -86,6 +86,7 @@ class ApiQueryWatchlist extends ApiQueryGeneratorBase {
                }
 
                $this->addFields( array(
+                       'rc_id',
                        'rc_namespace',
                        'rc_title',
                        'rc_timestamp',
@@ -135,6 +136,22 @@ class ApiQueryWatchlist extends ApiQueryGeneratorBase {
 
                $this->addTimestampWhereRange( 'rc_timestamp', $params['dir'],
                        $params['start'], $params['end'] );
+               // Include in ORDER BY for uniqueness
+               $this->addWhereRange( 'rc_id', $params['dir'], null, null );
+
+               if ( !is_null( $params['continue'] ) ) {
+                       $cont = explode( '|', $params['continue'] );
+                       $this->dieContinueUsageIf( count( $cont ) != 2 );
+                       $op = ( $params['dir'] === 'newer' ? '>' : '<' );
+                       $continueTimestamp = $db->addQuotes( $db->timestamp( $cont[0] ) );
+                       $continueId = (int)$cont[1];
+                       $this->dieContinueUsageIf( $continueId != $cont[1] );
+                       $this->addWhere( "rc_timestamp $op $continueTimestamp OR " .
+                               "(rc_timestamp = $continueTimestamp AND " .
+                               "rc_id $op= $continueId)"
+                       );
+               }
+
                $this->addWhereFld( 'wl_namespace', $params['namespace'] );
 
                if ( !$params['allrev'] ) {
@@ -236,10 +253,7 @@ class ApiQueryWatchlist extends ApiQueryGeneratorBase {
                        if ( ++$count > $params['limit'] ) {
                                // We've reached the one extra which shows that there are
                                // additional pages to be had. Stop here...
-                               $this->setContinueEnumParameter(
-                                       'start',
-                                       wfTimestamp( TS_ISO_8601, $row->rc_timestamp )
-                               );
+                               $this->setContinueEnumParameter( 'continue', "$row->rc_timestamp|$row->rc_id" );
                                break;
                        }
 
@@ -247,8 +261,7 @@ class ApiQueryWatchlist extends ApiQueryGeneratorBase {
                                $vals = $this->extractRowInfo( $row );
                                $fit = $this->getResult()->addValue( array( 'query', $this->getModuleName() ), null, $vals );
                                if ( !$fit ) {
-                                       $this->setContinueEnumParameter( 'start',
-                                               wfTimestamp( TS_ISO_8601, $row->rc_timestamp ) );
+                                       $this->setContinueEnumParameter( 'continue', "$row->rc_timestamp|$row->rc_id" );
                                        break;
                                }
                        } else {
@@ -544,6 +557,7 @@ class ApiQueryWatchlist extends ApiQueryGeneratorBase {
                        'token' => array(
                                ApiBase::PARAM_TYPE => 'string'
                        ),
+                       'continue' => null,
                );
        }
 
@@ -588,6 +602,7 @@ class ApiQueryWatchlist extends ApiQueryGeneratorBase {
                        'owner' => 'The name of the user whose watchlist you\'d like to access',
                        'token' => 'Give a security token (settable in preferences) to ' .
                                'allow access to another user\'s watchlist',
+                       'continue' => 'When more results are available, use this to continue',
                );
        }
 
index 99b60bb..69e1e9e 100644 (file)
@@ -57,7 +57,7 @@ class ChangesList extends ContextSource {
         * Some users might want to use an enhanced list format, for instance
         *
         * @param IContextSource $context
-        * @return ChangesList derivative
+        * @return ChangesList
         */
        public static function newFromContext( IContextSource $context ) {
                $user = $context->getUser();
@@ -74,14 +74,14 @@ class ChangesList extends ContextSource {
 
        /**
         * Sets the list to use a "<li class='watchlist-(namespace)-(page)'>" tag
-        * @param $value Boolean
+        * @param bool $value
         */
        public function setWatchlistDivs( $value = true ) {
                $this->watchlist = $value;
        }
 
        /**
-        * @return bool true when setWatchlistDivs has been called
+        * @return bool True when setWatchlistDivs has been called
         * @since 1.23
         */
        public function isWatchlist() {
@@ -106,7 +106,7 @@ class ChangesList extends ContextSource {
        /**
         * Returns the appropriate flags for new page, minor change and patrolling
         * @param array $flags Associative array of 'flag' => Bool
-        * @param string $nothing to use for empty space
+        * @param string $nothing To use for empty space
         * @return string
         */
        public function recentChangesFlags( $flags, $nothing = '&#160;' ) {
@@ -236,8 +236,8 @@ class ChangesList extends ContextSource {
        /**
         * Format the character difference of one or several changes.
         *
-        * @param $old RecentChange
-        * @param $new RecentChange last change to use, if not provided, $old will be used
+        * @param RecentChange $old
+        * @param RecentChange $new Last change to use, if not provided, $old will be used
         * @return string HTML fragment
         */
        public function formatCharacterDifference( RecentChange $old, RecentChange $new = null ) {
@@ -258,7 +258,7 @@ class ChangesList extends ContextSource {
 
        /**
         * Returns text for the end of RC
-        * @return String
+        * @return string
         */
        public function endRecentChangesList() {
                $out = $this->rclistOpen ? "</ul>\n" : '';
@@ -269,7 +269,7 @@ class ChangesList extends ContextSource {
 
        /**
         * @param string $s HTML to update
-        * @param $rc_timestamp mixed
+        * @param mixed $rc_timestamp
         */
        public function insertDateHeader( &$s, $rc_timestamp ) {
                # Make date header if necessary
@@ -286,8 +286,8 @@ class ChangesList extends ContextSource {
 
        /**
         * @param string $s HTML to update
-        * @param $title Title
-        * @param $logtype string
+        * @param Title $title
+        * @param string $logtype
         */
        public function insertLog( &$s, $title, $logtype ) {
                $page = new LogPage( $logtype );
@@ -297,8 +297,8 @@ class ChangesList extends ContextSource {
 
        /**
         * @param string $s HTML to update
-        * @param $rc RecentChange
-        * @param $unpatrolled
+        * @param RecentChange $rc
+        * @param bool $unpatrolled
         */
        public function insertDiffHist( &$s, &$rc, $unpatrolled ) {
                # Diff link
@@ -338,9 +338,9 @@ class ChangesList extends ContextSource {
 
        /**
         * @param string $s HTML to update
-        * @param $rc RecentChange
-        * @param $unpatrolled
-        * @param $watched
+        * @param RecentChange $rc
+        * @param bool $unpatrolled
+        * @param bool $watched
         */
        public function insertArticleLink( &$s, &$rc, $unpatrolled, $watched ) {
                $params = array();
@@ -369,7 +369,7 @@ class ChangesList extends ContextSource {
         * Get the timestamp from $rc formatted with current user's settings
         * and a separator
         *
-        * @param $rc RecentChange
+        * @param RecentChange $rc
         * @return string HTML fragment
         */
        public function getTimestamp( $rc ) {
@@ -385,7 +385,7 @@ class ChangesList extends ContextSource {
         * Insert time timestamp string from $rc into $s
         *
         * @param string $s HTML to update
-        * @param $rc RecentChange
+        * @param RecentChange $rc
         */
        public function insertTimestamp( &$s, $rc ) {
                $s .= $this->getTimestamp( $rc );
@@ -394,8 +394,8 @@ class ChangesList extends ContextSource {
        /**
         * Insert links to user page, user talk page and eventually a blocking link
         *
-        * @param &$s String HTML to update
-        * @param &$rc RecentChange
+        * @param string &$s HTML to update
+        * @param RecentChange &$rc
         */
        public function insertUserRelatedLinks( &$s, &$rc ) {
                if ( $this->isDeleted( $rc, Revision::DELETED_USER ) ) {
@@ -411,7 +411,7 @@ class ChangesList extends ContextSource {
        /**
         * Insert a formatted action
         *
-        * @param $rc RecentChange
+        * @param RecentChange $rc
         * @return string
         */
        public function insertLogEntry( $rc ) {
@@ -425,7 +425,7 @@ class ChangesList extends ContextSource {
 
        /**
         * Insert a formatted comment
-        * @param $rc RecentChange
+        * @param RecentChange $rc
         * @return string
         */
        public function insertComment( $rc ) {
@@ -445,7 +445,7 @@ class ChangesList extends ContextSource {
         * Check whether to enable recent changes patrol features
         *
         * @deprecated since 1.22
-        * @return Boolean
+        * @return bool
         */
        public static function usePatrol() {
                global $wgUser;
@@ -501,8 +501,8 @@ class ChangesList extends ContextSource {
        }
 
        /**
-        * @param $link string
-        * @param $watched bool
+        * @param string $link
+        * @param bool $watched
         * @return string
         */
        protected function maybeWatchedLink( $link, $watched = false ) {
@@ -515,8 +515,8 @@ class ChangesList extends ContextSource {
 
        /** Inserts a rollback link
         *
-        * @param $s string
-        * @param $rc RecentChange
+        * @param string $s
+        * @param RecentChange $rc
         */
        public function insertRollback( &$s, &$rc ) {
                if ( $rc->mAttribs['rc_type'] == RC_EDIT
@@ -542,9 +542,9 @@ class ChangesList extends ContextSource {
        }
 
        /**
-        * @param $s string
-        * @param $rc RecentChange
-        * @param $classes
+        * @param string $s
+        * @param RecentChange $rc
+        * @param array $classes
         */
        public function insertTags( &$s, &$rc, &$classes ) {
                if ( empty( $rc->mAttribs['ts_tags'] ) ) {
index feb6d7b..6c42601 100644 (file)
@@ -107,9 +107,20 @@ class EnhancedChangesList extends ChangesList {
                }
 
                $cacheEntry = $this->cacheEntryFactory->newFromRecentChange( $baseRC, $watched );
+               $this->addCacheEntry( $cacheEntry );
 
-               # Put accumulated information into the cache, for later display
-               # Page moves go on their own line
+               wfProfileOut( __METHOD__ );
+
+               return $ret;
+       }
+
+       /**
+        * Put accumulated information into the cache, for later display.
+        * Page moves go on their own line.
+        *
+        * @param RCCacheEntry $cacheEntry
+        */
+       protected function addCacheEntry( RCCacheEntry $cacheEntry ) {
                $title = $cacheEntry->getTitle();
                $secureName = $title->getPrefixedDBkey();
 
@@ -132,10 +143,6 @@ class EnhancedChangesList extends ChangesList {
 
                        array_push( $this->rc_cache[$secureName], $cacheEntry );
                }
-
-               wfProfileOut( __METHOD__ );
-
-               return $ret;
        }
 
        /**
index 07a9409..d9cafbc 100644 (file)
@@ -30,7 +30,7 @@ class RCCacheEntry extends RecentChange {
        public $watched;
 
        /**
-        * @param $rc RecentChange
+        * @param RecentChange $rc
         * @return RCCacheEntry
         */
        static function newFromParent( $rc ) {
index 3e289cf..25a572b 100644 (file)
@@ -39,7 +39,7 @@ class RCCacheEntryFactory {
 
        /**
         * @param RecentChange $baseRC
-        * @param boolean $watched
+        * @param bool $watched
         *
         * @return RCCacheEntry
         */
@@ -83,7 +83,7 @@ class RCCacheEntryFactory {
         * @param RecentChange $cacheEntry
         * @param User $user
         *
-        * @return boolean
+        * @return bool
         */
        private function showDiffLinks( RecentChange $cacheEntry, User $user ) {
                return ChangesList::userCan( $cacheEntry, Revision::DELETED_TEXT, $user );
@@ -163,7 +163,7 @@ class RCCacheEntryFactory {
 
        /**
         * @param RecentChange $cacheEntry
-        * @param boolean $showDiffLinks
+        * @param bool $showDiffLinks
         * @param int $counter
         *
         * @return string
@@ -198,7 +198,7 @@ class RCCacheEntryFactory {
 
        /**
         * @param RecentChange $cacheEntry
-        * @param boolean $showDiffLinks
+        * @param bool $showDiffLinks
         * @param int $counter
         *
         * @return string
@@ -222,7 +222,7 @@ class RCCacheEntryFactory {
 
        /**
         * @param RecentChange $cacheEntry
-        * @param boolean $showDiffLinks
+        * @param bool $showDiffLinks
         *
         * @return string
         */
index 072aa12..4827047 100644 (file)
@@ -92,7 +92,7 @@ class RecentChange {
        # Factory methods
 
        /**
-        * @param $row
+        * @param mixed $row
         * @return RecentChange
         */
        public static function newFromRow( $row ) {
@@ -105,7 +105,7 @@ class RecentChange {
        /**
         * No uses left in Gerrit on 2013-11-19.
         * @deprecated in 1.22
-        * @param $row
+        * @param mixed $row
         * @return RecentChange
         */
        public static function newFromCurRow( $row ) {
@@ -131,9 +131,9 @@ class RecentChange {
        /**
         * Find the first recent change matching some specific conditions
         *
-        * @param array $conds of conditions
-        * @param $fname Mixed: override the method name in profiling/logs
-        * @param $options Array Query options
+        * @param array $conds Array of conditions
+        * @param mixed $fname Override the method name in profiling/logs
+        * @param array $options Query options
         * @return RecentChange
         */
        public static function newFromConds( $conds, $fname = __METHOD__, $options = array() ) {
@@ -183,21 +183,20 @@ class RecentChange {
        # Accessors
 
        /**
-        * @param $attribs array
+        * @param array $attribs
         */
        public function setAttribs( $attribs ) {
                $this->mAttribs = $attribs;
        }
 
        /**
-        * @param $extra array
+        * @param array $extra
         */
        public function setExtra( $extra ) {
                $this->mExtra = $extra;
        }
 
        /**
-        *
         * @return Title
         */
        public function &getTitle() {
@@ -227,7 +226,7 @@ class RecentChange {
 
        /**
         * Writes the data in this object to the database
-        * @param $noudp bool
+        * @param bool $noudp
         */
        public function save( $noudp = false ) {
                global $wgPutIPinRC, $wgUseEnotif, $wgShowUpdatedMarker, $wgContLang;
@@ -331,11 +330,23 @@ class RecentChange {
        public function notifyRCFeeds() {
                global $wgRCFeeds;
 
+               $performer = $this->getPerformer();
+
                foreach ( $wgRCFeeds as $feed ) {
-                       $omitBots = isset( $feed['omit_bots'] ) ? $feed['omit_bots'] : false;
+                       $feed += array(
+                               'omit_bots' => false,
+                               'omit_anon' => false,
+                               'omit_user' => false,
+                               'omit_minor' => false,
+                               'omit_patrolled' => false,
+                       );
 
                        if (
-                               ( $omitBots && $this->mAttribs['rc_bot'] ) ||
+                               ( $feed['omit_bots'] && $this->mAttribs['rc_bot'] ) ||
+                               ( $feed['omit_anon'] && $performer->isAnon() ) ||
+                               ( $feed['omit_user'] && !$performer->isAnon() ) ||
+                               ( $feed['omit_minor'] && $this->mAttribs['rc_minor'] ) ||
+                               ( $feed['omit_patrolled'] && $this->mAttribs['rc_patrolled'] ) ||
                                $this->mAttribs['rc_type'] == RC_EXTERNAL
                        ) {
                                continue;
@@ -391,9 +402,9 @@ class RecentChange {
        /**
         * Mark a given change as patrolled
         *
-        * @param $change Mixed: RecentChange or corresponding rc_id
-        * @param $auto Boolean: for automatic patrol
-        * @return Array See doMarkPatrolled(), or null if $change is not an existing rc_id
+        * @param RecentChange|int $change RecentChange or corresponding rc_id
+        * @param bool $auto For automatic patrol
+        * @return array See doMarkPatrolled(), or null if $change is not an existing rc_id
         */
        public static function markPatrolled( $change, $auto = false ) {
                global $wgUser;
@@ -414,9 +425,9 @@ class RecentChange {
         *
         * NOTE: Can also return 'rcpatroldisabled', 'hookaborted' and
         * 'markedaspatrollederror-noautopatrol' as errors
-        * @param $user User object doing the action
-        * @param $auto Boolean: for automatic patrol
-        * @return array of permissions errors, see Title::getUserPermissionsErrors()
+        * @param User $user User object doing the action
+        * @param bool $auto For automatic patrol
+        * @return array Array of permissions errors, see Title::getUserPermissionsErrors()
         */
        public function doMarkPatrolled( User $user, $auto = false ) {
                global $wgUseRCPatrol, $wgUseNPPatrol;
@@ -457,7 +468,7 @@ class RecentChange {
 
        /**
         * Mark this RecentChange patrolled, without error checking
-        * @return Integer: number of affected rows
+        * @return int Number of affected rows
         */
        public function reallyMarkPatrolled() {
                $dbw = wfGetDB( DB_MASTER );
@@ -481,19 +492,19 @@ class RecentChange {
        /**
         * Makes an entry in the database corresponding to an edit
         *
-        * @param $timestamp
-        * @param $title Title
-        * @param $minor
-        * @param $user User
-        * @param $comment
-        * @param $oldId
-        * @param $lastTimestamp
-        * @param $bot
-        * @param $ip string
-        * @param $oldSize int
-        * @param $newSize int
-        * @param $newId int
-        * @param $patrol int
+        * @param string $timestamp
+        * @param Title $title
+        * @param bool $minor
+        * @param User $user
+        * @param string $comment
+        * @param int $oldId
+        * @param string $lastTimestamp
+        * @param bool $bot
+        * @param string $ip
+        * @param int $oldSize
+        * @param int $newSize
+        * @param int $newId
+        * @param int $patrol
         * @return RecentChange
         */
        public static function notifyEdit( $timestamp, &$title, $minor, &$user, $comment, $oldId,
@@ -543,16 +554,16 @@ class RecentChange {
         * Makes an entry in the database corresponding to page creation
         * Note: the title object must be loaded with the new id using resetArticleID()
         *
-        * @param $timestamp
-        * @param $title Title
-        * @param $minor
-        * @param $user User
-        * @param $comment
-        * @param $bot
-        * @param $ip string
-        * @param $size int
-        * @param $newId int
-        * @param $patrol int
+        * @param string $timestamp
+        * @param Title $title
+        * @param bool $minor
+        * @param User $user
+        * @param string $comment
+        * @param bool $bot
+        * @param string $ip
+        * @param int $size
+        * @param int $newId
+        * @param int $patrol
         * @return RecentChange
         */
        public static function notifyNew( $timestamp, &$title, $minor, &$user, $comment, $bot,
@@ -599,18 +610,18 @@ class RecentChange {
        }
 
        /**
-        * @param $timestamp
-        * @param $title
-        * @param $user
-        * @param $actionComment
-        * @param $ip string
-        * @param $type
-        * @param $action
-        * @param $target
-        * @param $logComment
-        * @param $params
-        * @param $newId int
-        * @param $actionCommentIRC string
+        * @param string $timestamp
+        * @param Title $title
+        * @param User $user
+        * @param string $actionComment
+        * @param string $ip
+        * @param string $type
+        * @param string $action
+        * @param Title $target
+        * @param string $logComment
+        * @param string $params
+        * @param int $newId
+        * @param string $actionCommentIRC
         * @return bool
         */
        public static function notifyLog( $timestamp, &$title, &$user, $actionComment, $ip, $type,
@@ -630,18 +641,18 @@ class RecentChange {
        }
 
        /**
-        * @param $timestamp
-        * @param $title Title
-        * @param $user User
-        * @param $actionComment
-        * @param $ip string
-        * @param $type
-        * @param $action
-        * @param $target Title
-        * @param $logComment
-        * @param $params
-        * @param $newId int
-        * @param $actionCommentIRC string
+        * @param string $timestamp
+        * @param Title $title
+        * @param User $user
+        * @param string $actionComment
+        * @param string $ip
+        * @param string $type
+        * @param string $action
+        * @param Title $target
+        * @param string $logComment
+        * @param string $params
+        * @param int $newId
+        * @param string $actionCommentIRC
         * @return RecentChange
         */
        public static function newLogEntry( $timestamp, &$title, &$user, $actionComment, $ip,
@@ -712,7 +723,7 @@ class RecentChange {
        /**
         * Initialises the members of this object from a mysql row object
         *
-        * @param $row
+        * @param mixed $row
         */
        public function loadFromRow( $row ) {
                $this->mAttribs = get_object_vars( $row );
@@ -724,7 +735,7 @@ class RecentChange {
         * Makes a pseudo-RC entry from a cur row
         *
         * @deprecated in 1.22
-        * @param $row
+        * @param mixed $row
         */
        public function loadFromCurRow( $row ) {
                wfDeprecated( __METHOD__, '1.22' );
@@ -776,7 +787,7 @@ class RecentChange {
        /**
         * Gets the end part of the diff URL associated with this object
         * Blank if no diff link should be displayed
-        * @param $forceCur
+        * @param bool $forceCur
         * @return string
         */
        public function diffLinkTrail( $forceCur ) {
@@ -798,8 +809,8 @@ class RecentChange {
        /**
         * Returns the change size (HTML).
         * The lengths can be given optionally.
-        * @param $old int
-        * @param $new int
+        * @param int $old
+        * @param int $new
         * @return string
         */
        public function getCharacterDifference( $old = 0, $new = 0 ) {
@@ -861,8 +872,8 @@ class RecentChange {
         * as the recentchanges table might not be cleared out regularly (so older entries might exist)
         * or rows which will be deleted soon shouldn't be included.
         *
-        * @param $timestamp mixed MWTimestamp compatible timestamp
-        * @param $tolerance integer Tolerance in seconds
+        * @param mixed $timestamp MWTimestamp compatible timestamp
+        * @param int $tolerance Tolerance in seconds
         * @return bool
         */
        public static function isInRCLifespan( $timestamp, $tolerance = 0 ) {
index 5db814d..c21b113 100644 (file)
@@ -48,7 +48,7 @@ class RedisConnectionPool {
        protected $password;
        /** @var bool Whether connections persist */
        protected $persistent;
-       /** @var integer Serializer to use (Redis::SERIALIZER_*) */
+       /** @var int Serializer to use (Redis::SERIALIZER_*) */
        protected $serializer;
        /** @} */
 
@@ -408,7 +408,7 @@ class RedisConnRef {
        /**
         * @param string $script
         * @param array $params
-        * @param integer $numKeys
+        * @param int $numKeys
         * @return mixed
         * @throws RedisException
         */
@@ -421,7 +421,7 @@ class RedisConnRef {
                $conn->clearLastError();
                $res = $conn->evalSha( $sha1, $params, $numKeys );
                // If we got a permission error reply that means that (a) we are not in
-               // multi()/pipeline() and (b) some connection problem likely occured. If
+               // multi()/pipeline() and (b) some connection problem likely occurred. If
                // the password the client gave was just wrong, an exception should have
                // been thrown back in getConnection() previously.
                if ( preg_match( '/^ERR operation not permitted\b/', $conn->getLastError() ) ) {
index 6c310fd..2587b1d 100644 (file)
@@ -3,8 +3,8 @@
 use Composer\Package\Package;
 use Composer\Script\Event;
 
-$GLOBALS['IP'] = __DIR__ . '/../';
-require_once '../AutoLoader.php';
+$GLOBALS['IP'] = __DIR__ . '/../../';
+require_once __DIR__ . '/../AutoLoader.php';
 
 /**
  * @licence GNU GPL v2+
index f2f0c9d..77d3542 100644 (file)
@@ -375,7 +375,7 @@ abstract class AbstractContent implements Content {
         *
         * @see Content::preloadTransform
         */
-       public function preloadTransform( Title $title, ParserOptions $popts ) {
+       public function preloadTransform( Title $title, ParserOptions $popts, $params = array() ) {
                return $this;
        }
 
index 075635d..18110ef 100644 (file)
@@ -98,7 +98,7 @@ interface Content {
         *
         * @since 1.21
         *
-        * @return String The model id
+        * @return string The model id
         */
        public function getModel();
 
@@ -122,7 +122,7 @@ interface Content {
         *
         * @since 1.21
         *
-        * @return String
+        * @return string
         */
        public function getDefaultFormat();
 
@@ -232,7 +232,7 @@ interface Content {
         *
         * @since 1.21
         *
-        * @return Content. A copy of this object
+        * @return Content A copy of this object
         */
        public function copy();
 
@@ -437,10 +437,11 @@ interface Content {
         *
         * @param Title $title
         * @param ParserOptions $parserOptions
+        * @param array $params
         *
         * @return Content
         */
-       public function preloadTransform( Title $title, ParserOptions $parserOptions );
+       public function preloadTransform( Title $title, ParserOptions $parserOptions, $params = array() );
 
        /**
         * Prepare Content for saving. Called before Content is saved by WikiPage::doEditContent() and in
index 605222e..13ef1b9 100644 (file)
@@ -154,14 +154,15 @@ class WikitextContent extends TextContent {
         *
         * @param Title $title
         * @param ParserOptions $popts
+        * @param array $params
         *
         * @return Content
         */
-       public function preloadTransform( Title $title, ParserOptions $popts ) {
+       public function preloadTransform( Title $title, ParserOptions $popts, $params = array() ) {
                global $wgParser;
 
                $text = $this->getNativeData();
-               $plt = $wgParser->getPreloadText( $text, $title, $popts );
+               $plt = $wgParser->getPreloadText( $text, $title, $popts, $params );
 
                return new WikitextContent( $plt );
        }
index 9bc416d..9e55059 100644 (file)
@@ -183,7 +183,7 @@ abstract class ContextSource implements IContextSource {
         * Export the resolved user IP, HTTP headers, user ID, and session ID.
         * The result will be reasonably sized to allow for serialization.
         *
-        * @return Array
+        * @return array
         * @since 1.21
         */
        public function exportSession() {
index eb51372..f892b02 100644 (file)
@@ -118,7 +118,7 @@ interface IContextSource {
         * Export the resolved user IP, HTTP headers, user ID, and session ID.
         * The result will be reasonably sized to allow for serialization.
         *
-        * @return Array
+        * @return array
         * @since 1.21
         */
        public function exportSession();
index aabdd9d..6f27a7a 100644 (file)
@@ -204,7 +204,7 @@ class RequestContext implements IContextSource {
        }
 
        /**
-        * @param $o OutputPage
+        * @param OutputPage $o
         */
        public function setOutput( OutputPage $o ) {
                $this->output = $o;
@@ -436,7 +436,7 @@ class RequestContext implements IContextSource {
         * Export the resolved user IP, HTTP headers, user ID, and session ID.
         * The result will be reasonably sized to allow for serialization.
         *
-        * @return Array
+        * @return array
         * @since 1.21
         */
        public function exportSession() {
index 2a0fde3..3909faa 100644 (file)
@@ -29,7 +29,7 @@
  */
 abstract class DBAccessBase implements IDBAccessObject {
        /**
-        * @var String|bool $wiki The target wiki's name. This must be an ID
+        * @var string|bool $wiki The target wiki's name. This must be an ID
         * that LBFactory can understand.
         */
        protected $wiki = false;
@@ -68,7 +68,7 @@ abstract class DBAccessBase implements IDBAccessObject {
         *
         * @since 1.21
         *
-        * @param DatabaseBase $db the database connection to release.
+        * @param DatabaseBase $db The database connection to release.
         */
        protected function releaseConnection( DatabaseBase $db ) {
                if ( $this->wiki !== false ) {
index 52a3298..9254bb4 100644 (file)
@@ -630,8 +630,8 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
        public function setFlag( $flag ) {
                global $wgDebugDBTransactions;
                $this->mFlags |= $flag;
-               if ( ( $flag & DBO_TRX ) & $wgDebugDBTransactions ) {
-                       wfDebug( "Implicit transactions are now disabled.\n" );
+               if ( ( $flag & DBO_TRX ) && $wgDebugDBTransactions ) {
+                       wfDebug( "Implicit transactions are now enabled.\n" );
                }
        }
 
index 50b7158..faed996 100644 (file)
@@ -164,8 +164,7 @@ class DatabaseMssql extends DatabaseBase {
         * @throws DBUnexpectedError
         */
        protected function doQuery( $sql ) {
-               global $wgDebugDumpSql;
-               if ( $wgDebugDumpSql ) {
+               if ( $this->debug() ) {
                        wfDebug( "SQL: [$sql]\n" );
                }
                $this->offset = 0;
index 6e0490d..0d13433 100644 (file)
@@ -1133,8 +1133,8 @@ class DatabaseOracle extends DatabaseBase {
 
        /**
         * @throws DBUnexpectedError
-        * @param  string $table
-        * @param  string $field
+        * @param string $table
+        * @param string $field
         * @return ORAField
         */
        function fieldInfo( $table, $field ) {
index fcce870..eca9564 100644 (file)
@@ -243,7 +243,10 @@ class LBFactorySimple extends LBFactory {
                        global $wgDBserver, $wgDBuser, $wgDBpassword, $wgDBname, $wgDBtype, $wgDebugDumpSql;
                        global $wgDBssl, $wgDBcompress;
 
-                       $flags = ( $wgDebugDumpSql ? DBO_DEBUG : 0 ) | DBO_DEFAULT;
+                       $flags = DBO_DEFAULT;
+                       if ( $wgDebugDumpSql ) {
+                               $flags |= DBO_DEBUG;
+                       }
                        if ( $wgDBssl ) {
                                $flags |= DBO_SSL;
                        }
index 79232e5..abd44fd 100644 (file)
@@ -269,7 +269,7 @@ class LinksUpdate extends SqlDataUpdate {
        }
 
        /**
-        * @param $cats
+        * @param array $cats
         */
        function invalidateCategories( $cats ) {
                $this->invalidatePages( NS_CATEGORY, array_keys( $cats ) );
@@ -288,7 +288,7 @@ class LinksUpdate extends SqlDataUpdate {
        }
 
        /**
-        * @param $images
+        * @param array $images
         */
        function invalidateImageDescriptions( $images ) {
                $this->invalidatePages( NS_FILE, array_keys( $images ) );
@@ -329,7 +329,7 @@ class LinksUpdate extends SqlDataUpdate {
                                $toField = $prefix . '_to';
                        }
                        if ( count( $deletions ) ) {
-                               $where[] = "$toField IN (" . $this->mDb->makeList( array_keys( $deletions ) ) . ')';
+                               $where[$toField] = array_keys( $deletions );
                        } else {
                                $where = false;
                        }
@@ -432,7 +432,7 @@ class LinksUpdate extends SqlDataUpdate {
        /**
         * Get an array of category insertions
         *
-        * @param array $existing mapping existing category names to sort keys. If both
+        * @param array $existing Mapping existing category names to sort keys. If both
         * match a link in $this, the link will be omitted from the output
         *
         * @return array
@@ -477,7 +477,7 @@ class LinksUpdate extends SqlDataUpdate {
        /**
         * Get an array of interlanguage link insertions
         *
-        * @param array $existing mapping existing language codes to titles
+        * @param array $existing Mapping existing language codes to titles
         *
         * @return array
         */
@@ -769,7 +769,7 @@ class LinksUpdate extends SqlDataUpdate {
        /**
         * Get an array of existing categories, with the name in the key and sort key in the value.
         *
-        * @return array of property names and values
+        * @return array Array of property names and values
         */
        private function getExistingProperties() {
                $res = $this->mDb->select( 'page_props', array( 'pp_propname', 'pp_value' ),
@@ -831,7 +831,7 @@ class LinksUpdate extends SqlDataUpdate {
        /**
         * Fetch page links added by this LinksUpdate.  Only available after the update is complete.
         * @since 1.22
-        * @return null|array of Titles
+        * @return null|array Array of Titles
         */
        public function getAddedLinks() {
                if ( $this->linkInsertions === null ) {
@@ -848,7 +848,7 @@ class LinksUpdate extends SqlDataUpdate {
        /**
         * Fetch page links removed by this LinksUpdate.  Only available after the update is complete.
         * @since 1.22
-        * @return null|array of Titles
+        * @return null|array Array of Titles
         */
        public function getRemovedLinks() {
                if ( $this->linkDeletions === null ) {
index 09d18c4..121af04 100644 (file)
@@ -40,7 +40,7 @@ abstract class SqlDataUpdate extends DataUpdate {
        /** @var bool Whether a transaction is open on this object (internal use only!) */
        private $mHasTransaction;
 
-       /** @var  bool Whether this update should be wrapped in a transaction */
+       /** @var bool Whether this update should be wrapped in a transaction */
        protected $mUseTransaction;
 
        /**
index d8a9ba3..40df0d7 100644 (file)
@@ -52,7 +52,7 @@ abstract class DiffFormatter {
        /**
         * Format a diff.
         *
-        * @param Diff $diff A Diff object.
+        * @param Diff $diff
         *
         * @return string The formatted output.
         */
@@ -125,7 +125,7 @@ abstract class DiffFormatter {
         * @param int $xlen
         * @param int $ybeg
         * @param int $ylen
-        * @param $edits
+        * @param array $edits
         *
         * @throws MWException If the edit type is not known.
         */
index 414b9f8..dd3f351 100644 (file)
@@ -53,16 +53,16 @@ class DifferenceEngine extends ContextSource {
        /** @var Language */
        protected $mDiffLang;
 
-       /** @var  Title */
+       /** @var Title */
        public $mOldPage;
 
-       /** @var  Title */
+       /** @var Title */
        public $mNewPage;
 
        /** @var Revision */
        public $mOldRev;
 
-       /** @var  Revision */
+       /** @var Revision */
        public $mNewRev;
 
        /** @var bool Have the revisions IDs been loaded */
@@ -84,7 +84,7 @@ class DifferenceEngine extends ContextSource {
         */
        public $enableDebugComment = false;
 
-       /** @var bool  If true, line X is not displayed when X is 1, for example
+       /** @var bool If true, line X is not displayed when X is 1, for example
         *    to increase readability and conserve space with many small diffs.
         */
        protected $mReducedLineNumbers = false;
@@ -970,8 +970,10 @@ class DifferenceEngine extends ContextSource {
                        $newRev = $this->mNewRev;
                }
 
-               $nEdits = $this->mNewPage->countRevisionsBetween( $oldRev, $newRev );
-               if ( $nEdits > 0 ) {
+               // Sanity: don't show the notice if too many rows must be scanned
+               // @TODO: show some special message for that case
+               $nEdits = $this->mNewPage->countRevisionsBetween( $oldRev, $newRev, 1000 );
+               if ( $nEdits > 0 && $nEdits <= 1000 ) {
                        $limit = 100; // use diff-multi-manyusers if too many users
                        $users = $this->mNewPage->getAuthorsBetween( $oldRev, $newRev, $limit );
                        $numUsers = count( $users );
index f955f06..6ab6e03 100644 (file)
@@ -31,9 +31,9 @@ class HttpError extends MWException {
        /**
         * Constructor
         *
-        * @param $httpCode Integer: HTTP status code to send to the client
-        * @param string|Message $content content of the message
-        * @param string|Message $header content of the header (\<title\> and \<h1\>)
+        * @param int $httpCode HTTP status code to send to the client
+        * @param string|Message $content Content of the message
+        * @param string|Message $header Content of the header (\<title\> and \<h1\>)
         */
        public function __construct( $httpCode, $content, $header = null ) {
                parent::__construct( $content );
index 136fb89..2b8cb00 100644 (file)
@@ -40,7 +40,7 @@ class MWException extends Exception {
         * Whether to log this exception in the exception debug log.
         *
         * @since 1.23
-        * @return boolean
+        * @return bool
         */
        public function isLoggable() {
                return true;
@@ -66,9 +66,9 @@ class MWException extends Exception {
        /**
         * Run hook to allow extensions to modify the text of the exception
         *
-        * @param string $name class name of the exception
-        * @param array $args arguments to pass to the callback functions
-        * @return string|null string to output or null if any hook has been called
+        * @param string $name Class name of the exception
+        * @param array $args Arguments to pass to the callback functions
+        * @return string|null String to output or null if any hook has been called
         */
        public function runHooks( $name, $args = array() ) {
                global $wgExceptionHooks;
@@ -107,11 +107,11 @@ class MWException extends Exception {
        /**
         * Get a message from i18n
         *
-        * @param string $key message name
-        * @param string $fallback default message if the message cache can't be
+        * @param string $key Message name
+        * @param string $fallback Default message if the message cache can't be
         *                  called by the exception
         * The function also has other parameters that are arguments for the message
-        * @return string message with arguments replaced
+        * @return string Message with arguments replaced
         */
        public function msg( $key, $fallback /*[, params...] */ ) {
                $args = array_slice( func_get_args(), 2 );
@@ -128,7 +128,7 @@ class MWException extends Exception {
         * backtrace to the error, otherwise show a message to ask to set it to true
         * to show that information.
         *
-        * @return string html to output
+        * @return string Html to output
         */
        public function getHTML() {
                global $wgShowExceptionDetails;
index 8c7f05c..71917e1 100644 (file)
@@ -32,6 +32,7 @@ class MWExceptionHandler {
 
        /**
         * Report an exception to the user
+        * @param Exception $e
         */
        protected static function report( Exception $e ) {
                global $wgShowExceptionDetails;
@@ -130,6 +131,7 @@ class MWExceptionHandler {
         *   } catch ( Exception $e ) {
         *       echo $e->__toString();
         *   }
+        * @param Exception $e
         */
        public static function handle( $e ) {
                global $wgFullyInitialised;
@@ -313,7 +315,7 @@ class MWExceptionHandler {
         * @param Exception $e
         * @param bool $pretty Add non-significant whitespace to improve readability (default: false).
         * @param int $escaping Bitfield consisting of FormatJson::.*_OK class constants.
-        * @return string|bool: JSON string if successful; false upon failure
+        * @return string|bool JSON string if successful; false upon failure
         */
        public static function jsonSerializeException( Exception $e, $pretty = false, $escaping = 0 ) {
                global $wgLogExceptionBacktrace;
index 9e9d976..9e09b22 100644 (file)
@@ -131,7 +131,7 @@ class ExternalStore {
         * class itself as a parameter.
         *
         * @param string $url A partial external store URL ("<store type>://<location>")
-        * @param $data string
+        * @param string $data
         * @param array $params Associative array of ExternalStoreMedium parameters
         * @return string|bool The URL of the stored data item, or false on error
         * @throws MWException
@@ -218,8 +218,8 @@ class ExternalStore {
        }
 
        /**
-        * @param $data string
-        * @param $wiki string
+        * @param string $data
+        * @param string $wiki
         * @return string|bool The URL of the stored data item, or false on error
         * @throws MWException
         */
index 9de81e0..5774a24 100644 (file)
@@ -106,8 +106,8 @@ class ExternalStoreDB extends ExternalStoreMedium {
        /**
         * Get a LoadBalancer for the specified cluster
         *
-        * @param string $cluster cluster name
-        * @return LoadBalancer object
+        * @param string $cluster Cluster name
+        * @return LoadBalancer
         */
        function getLoadBalancer( $cluster ) {
                $wiki = isset( $this->params['wiki'] ) ? $this->params['wiki'] : false;
@@ -118,8 +118,8 @@ class ExternalStoreDB extends ExternalStoreMedium {
        /**
         * Get a slave database connection for the specified cluster
         *
-        * @param string $cluster cluster name
-        * @return DatabaseBase object
+        * @param string $cluster Cluster name
+        * @return DatabaseBase
         */
        function getSlave( $cluster ) {
                global $wgDefaultExternalStore;
@@ -140,8 +140,8 @@ class ExternalStoreDB extends ExternalStoreMedium {
        /**
         * Get a master database connection for the specified cluster
         *
-        * @param string $cluster cluster name
-        * @return DatabaseBase object
+        * @param string $cluster Cluster name
+        * @return DatabaseBase
         */
        function getMaster( $cluster ) {
                $wiki = isset( $this->params['wiki'] ) ? $this->params['wiki'] : false;
@@ -153,8 +153,8 @@ class ExternalStoreDB extends ExternalStoreMedium {
        /**
         * Get the 'blobs' table name for this database
         *
-        * @param $db DatabaseBase
-        * @return String: table name ('blobs' by default)
+        * @param DatabaseBase $db
+        * @return string Table name ('blobs' by default)
         */
        function getTable( $db ) {
                $table = $db->getLBInfo( 'blobs table' );
@@ -169,9 +169,9 @@ class ExternalStoreDB extends ExternalStoreMedium {
         * Fetch a blob item out of the database; a cache of the last-loaded
         * blob will be kept so that multiple loads out of a multi-item blob
         * can avoid redundant database access and decompression.
-        * @param $cluster
-        * @param $id
-        * @param $itemID
+        * @param string $cluster
+        * @param string $id
+        * @param string $itemID
         * @return mixed
         * @private
         */
index a526df6..e9c34a4 100644 (file)
@@ -29,7 +29,7 @@
  * @since 1.21
  */
 abstract class ExternalStoreMedium {
-       /** @var Array */
+       /** @var array */
        protected $params = array();
 
        /**
@@ -71,8 +71,8 @@ abstract class ExternalStoreMedium {
        /**
         * Insert a data item into a given location
         *
-        * @param string $location the location name
-        * @param string $data the data item
+        * @param string $location The location name
+        * @param string $data The data item
         * @return string|bool The URL of the stored data item, or false on error
         * @throws MWException
         */
index 716ab6e..c759725 100644 (file)
@@ -1196,8 +1196,7 @@ abstract class FileBackend {
         *
         * @param array $paths Storage paths
         */
-       public function preloadCache( array $paths ) {
-       }
+       abstract public function preloadCache( array $paths );
 
        /**
         * Invalidate any in-process file stat and property cache.
@@ -1207,8 +1206,7 @@ abstract class FileBackend {
         *
         * @param array $paths Storage paths (optional)
         */
-       public function clearCache( array $paths = null ) {
-       }
+       abstract public function clearCache( array $paths = null );
 
        /**
         * Preload file stat information (concurrently if possible) into in-process cache.
index f00ef65..c39bbaf 100644 (file)
@@ -662,8 +662,14 @@ class FileBackendMultiWrite extends FileBackend {
                }
        }
 
+       public function preloadCache( array $paths ) {
+               $realPaths = $this->substPaths( $paths, $this->backends[$this->masterIndex] );
+               $this->backends[$this->masterIndex]->preloadCache( $realPaths );
+       }
+
        public function preloadFileStat( array $params ) {
-               $this->backends[$this->masterIndex]->preloadFileStat( $params );
+               $realParams = $this->substOpPaths( $params, $this->backends[$this->masterIndex] );
+               $this->backends[$this->masterIndex]->preloadFileStat( $realParams );
        }
 
        public function getScopedLocksForOps( array $ops, Status $status ) {
index 3ab9f5d..0464e03 100644 (file)
@@ -36,7 +36,7 @@
  * @since 1.20
  */
 abstract class FileJournal {
-       /** @var  string */
+       /** @var string */
        protected $backend;
 
        /** @var int */
index 4e48932..35ac60f 100644 (file)
@@ -252,8 +252,9 @@ class ForeignAPIRepo extends FileRepo {
         * @param string $name
         * @param int $width
         * @param int $height
-        * @param null $result
+        * @param array $result Out parameter that will be changed by the function.
         * @param string $otherParams
+        *
         * @return bool
         */
        function getThumbUrl( $name, $width = -1, $height = -1, &$result = null, $otherParams = '' ) {
index edf574f..21ff65c 100644 (file)
@@ -842,6 +842,8 @@ abstract class File {
                        return $this->iconThumb();
                }
                $hp['width'] = $width;
+               // be sure to ignore any height specification as well (bug 62258)
+               unset( $hp['height'] );
 
                return $this->transform( $hp );
        }
index 7a9e617..eb55e82 100644 (file)
@@ -1399,6 +1399,12 @@ class LocalFile extends File {
                #       to after $wikiPage->doEdit has been called.
                $dbw->commit( __METHOD__ );
 
+               # Save to memcache.
+               # We shall not saveToCache before the commit since otherwise
+               # in case of a rollback there is an usable file from memcached
+               # which in fact doesn't really exist (bug 24978)
+               $this->saveToCache();
+
                if ( $exists ) {
                        # Invalidate the cache for the description page
                        $descTitle->invalidateCache();
@@ -1431,11 +1437,6 @@ class LocalFile extends File {
 
                wfProfileOut( __METHOD__ . '-edit' );
 
-               # Save to cache and purge the squid
-               # We shall not saveToCache before the commit since otherwise
-               # in case of a rollback there is an usable file from memcached
-               # which in fact doesn't really exist (bug 24978)
-               $this->saveToCache();
 
                if ( $reupload ) {
                        # Delete old thumbnails
@@ -1989,7 +1990,7 @@ class LocalFileDeleteBatch {
                        $res = $dbw->select(
                                'oldimage',
                                array( 'oi_archive_name', 'oi_sha1' ),
-                               'oi_archive_name IN (' . $dbw->makeList( array_keys( $oldRels ) ) . ')',
+                               array( 'oi_archive_name' => array_keys( $oldRels ) ),
                                __METHOD__
                        );
 
@@ -2090,7 +2091,7 @@ class LocalFileDeleteBatch {
                        $concat = $dbw->buildConcat( array( "oi_sha1", $encExt ) );
                        $where = array(
                                'oi_name' => $this->file->getName(),
-                               'oi_archive_name IN (' . $dbw->makeList( array_keys( $oldRels ) ) . ')' );
+                               'oi_archive_name' => array_keys( $oldRels ) );
                        $dbw->insertSelect( 'filearchive', 'oldimage',
                                array(
                                        'fa_storage_group' => $encGroup,
@@ -2153,7 +2154,7 @@ class LocalFileDeleteBatch {
                        $res = $dbw->select( 'oldimage',
                                array( 'oi_archive_name' ),
                                array( 'oi_name' => $this->file->getName(),
-                                       'oi_archive_name IN (' . $dbw->makeList( array_keys( $oldRels ) ) . ')',
+                                       'oi_archive_name' => array_keys( $oldRels ),
                                        $dbw->bitAnd( 'oi_deleted', File::DELETED_FILE ) => File::DELETED_FILE ),
                                __METHOD__ );
 
@@ -2320,7 +2321,7 @@ class LocalFileRestoreBatch {
                $conditions = array( 'fa_name' => $this->file->getName() );
 
                if ( !$this->all ) {
-                       $conditions[] = 'fa_id IN (' . $dbw->makeList( $this->ids ) . ')';
+                       $conditions['fa_id'] = $this->ids;
                }
 
                $result = $dbw->select(
@@ -2505,7 +2506,7 @@ class LocalFileRestoreBatch {
 
                if ( $deleteIds ) {
                        $dbw->delete( 'filearchive',
-                               array( 'fa_id IN (' . $dbw->makeList( $deleteIds ) . ')' ),
+                               array( 'fa_id' => $deleteIds ),
                                __METHOD__ );
                }
 
index d2e4689..42e8c03 100644 (file)
@@ -69,7 +69,7 @@ abstract class ImageGalleryBase extends ContextSource {
         * Get a new image gallery. This is the method other callers
         * should use to get a gallery.
         *
-        * @param string|bool $mode Mode to use. False to use the default.
+        * @param string|bool $mode Mode to use. False to use the default
         * @throws MWException
         */
        static function factory( $mode = false ) {
@@ -130,7 +130,7 @@ abstract class ImageGalleryBase extends ContextSource {
         * @note This also triggers using the page's target
         *  language instead of the user language.
         *
-        * @param $parser Parser
+        * @param Parser $parser
         */
        function setParser( $parser ) {
                $this->mParser = $parser;
@@ -200,7 +200,7 @@ abstract class ImageGalleryBase extends ContextSource {
         * to allow extensions to add additional parameters to
         * <gallery> parser tag.
         *
-        * @param array $options Attributes of gallery tag.
+        * @param array $options Attributes of gallery tag
         */
        public function setAdditionalOptions( $options ) {
        }
@@ -265,7 +265,7 @@ abstract class ImageGalleryBase extends ContextSource {
         * Enable/Disable showing of the file size of an image in the gallery.
         * Enabled by default.
         *
-        * @param bool $f Set to false to disable.
+        * @param bool $f Set to false to disable
         */
        function setShowBytes( $f ) {
                $this->mShowBytes = (bool)$f;
@@ -275,7 +275,7 @@ abstract class ImageGalleryBase extends ContextSource {
         * Enable/Disable showing of the filename of an image in the gallery.
         * Enabled by default.
         *
-        * @param bool $f Set to false to disable.
+        * @param bool $f Set to false to disable
         */
        function setShowFilename( $f ) {
                $this->mShowFilename = (bool)$f;
index 237fa32..7baab66 100644 (file)
@@ -50,7 +50,7 @@ class HTMLCheckField extends HTMLFormField {
        }
 
        /**
-        * @param  $request WebRequest
+        * @param $request WebRequest
         *
         * @return String
         */
index 3cf3188..f802771 100644 (file)
@@ -70,7 +70,7 @@ class HTMLMultiSelectField extends HTMLFormField implements HTMLNestedFilterable
        }
 
        /**
-        * @param  $request WebRequest
+        * @param $request WebRequest
         *
         * @return String
         */
index 564927f..bb42d53 100644 (file)
@@ -16,7 +16,7 @@ class HTMLSelectAndOtherField extends HTMLSelectField {
                } elseif ( array_key_exists( 'other-message', $params ) ) {
                        $params['other'] = wfMessage( $params['other-message'] )->plain();
                } else {
-                       $params['other'] = null;
+                       $params['other'] = wfMessage( 'htmlform-selectorother-other' )->plain();
                }
 
                parent::__construct( $params );
@@ -60,7 +60,7 @@ class HTMLSelectAndOtherField extends HTMLSelectField {
        }
 
        /**
-        * @param  $request WebRequest
+        * @param $request WebRequest
         *
         * @return Array("<overall message>","<select value>","<text field value>")
         */
index e8bcb5b..21f3b77 100644 (file)
@@ -62,7 +62,7 @@ class HTMLSelectOrOtherField extends HTMLTextField {
        }
 
        /**
-        * @param  $request WebRequest
+        * @param $request WebRequest
         *
         * @return String
         */
index f944fbe..2eaf1fb 100644 (file)
@@ -138,7 +138,8 @@ class CliInstaller extends Installer {
 
        public function startStage( $step ) {
                // Messages: config-install-database, config-install-tables, config-install-interwiki,
-               // config-install-stats, config-install-keys, config-install-sysop, config-install-mainpage
+               // config-install-stats, config-install-keys, config-install-sysop, config-install-mainpage,
+               // config-install-extensions
                $this->showMessage( "config-install-$step" );
        }
 
index 3f2e2cb..5223cd3 100644 (file)
@@ -155,10 +155,11 @@ abstract class DatabaseUpdater {
        }
 
        /**
-        * @throws MWException
         * @param DatabaseBase $db
         * @param bool $shared
-        * @param null $maintenance
+        * @param Maintenance $maintenance
+        *
+        * @throws MWException
         * @return DatabaseUpdater
         */
        public static function newForDB( &$db, $shared = false, $maintenance = null ) {
index 2d43324..4c72528 100644 (file)
@@ -100,7 +100,9 @@ class MysqlInstaller extends DatabaseInstaller {
 
        public function submitConnectForm() {
                // Get variables from the request.
-               $newValues = $this->setVarsFromRequest( array( 'wgDBserver', 'wgDBname', 'wgDBprefix' ) );
+               $newValues = $this->setVarsFromRequest( array(
+                       'wgDBserver', 'wgDBname', 'wgDBprefix', '_InstallUser', '_InstallPassword'
+               ) );
 
                // Validate them.
                $status = Status::newGood();
@@ -115,6 +117,12 @@ class MysqlInstaller extends DatabaseInstaller {
                if ( !preg_match( '/^[a-z0-9_-]*$/i', $newValues['wgDBprefix'] ) ) {
                        $status->fatal( 'config-invalid-db-prefix', $newValues['wgDBprefix'] );
                }
+               if ( !strlen( $newValues['_InstallUser'] ) ) {
+                       $status->fatal( 'config-db-username-empty' );
+               }
+               if (!strlen( $newValues['_InstallPassword'] ) ) {
+                       $status->fatal( 'config-db-password-empty', $newValues['_InstallUser'] );
+               }
                if ( !$status->isOK() ) {
                        return $status;
                }
index 2cf4156..780431a 100644 (file)
@@ -83,8 +83,10 @@ class PostgresInstaller extends DatabaseInstaller {
 
        function submitConnectForm() {
                // Get variables from the request
-               $newValues = $this->setVarsFromRequest( array( 'wgDBserver', 'wgDBport',
-                       'wgDBname', 'wgDBmwschema' ) );
+               $newValues = $this->setVarsFromRequest( array(
+                       'wgDBserver', 'wgDBport','wgDBname', 'wgDBmwschema',
+                       '_InstallUser', '_InstallPassword'
+               ) );
 
                // Validate them
                $status = Status::newGood();
@@ -96,6 +98,12 @@ class PostgresInstaller extends DatabaseInstaller {
                if ( !preg_match( '/^[a-zA-Z0-9_]*$/', $newValues['wgDBmwschema'] ) ) {
                        $status->fatal( 'config-invalid-schema', $newValues['wgDBmwschema'] );
                }
+               if ( !strlen( $newValues['_InstallUser'] ) ) {
+                       $status->fatal( 'config-db-username-empty' );
+               }
+               if ( !strlen( $newValues['_InstallPassword'] ) ) {
+                       $status->fatal( 'config-db-password-empty', $newValues['_InstallUser'] );
+               }
 
                // Submit user box
                if ( $status->isOK() ) {
index 79fdc99..42672ca 100644 (file)
@@ -44,13 +44,14 @@ class WebInstaller extends Installer {
        /**
         * Cached session array.
         *
-        * @var array
+        * @var array[]
         */
        protected $session;
 
        /**
         * Captured PHP error text. Temporary.
-        * @var array
+        *
+        * @var string[]
         */
        protected $phpErrors;
 
@@ -61,7 +62,8 @@ class WebInstaller extends Installer {
         *    * Add it to this WebInstaller::$pageSequence property
         *    * Add a "config-page-<name>" message
         *    * Add a "WebInstaller_<name>" class
-        * @var array
+        *
+        * @var string[]
         */
        public $pageSequence = array(
                'Language',
@@ -78,7 +80,8 @@ class WebInstaller extends Installer {
 
        /**
         * Out of sequence pages, selectable by the user at any time.
-        * @var array
+        *
+        * @var string[]
         */
        protected $otherPages = array(
                'Restart',
@@ -91,7 +94,8 @@ class WebInstaller extends Installer {
        /**
         * Array of pages which have declared that they have been submitted, have validated
         * their input, and need no further processing.
-        * @var array
+        *
+        * @var bool[]
         */
        protected $happyPages;
 
@@ -99,24 +103,28 @@ class WebInstaller extends Installer {
         * List of "skipped" pages. These are pages that will automatically continue
         * to the next page on any GET request. To avoid breaking the "back" button,
         * they need to be skipped during a back operation.
-        * @var array
+        *
+        * @var bool[]
         */
        protected $skippedPages;
 
        /**
         * Flag indicating that session data may have been lost.
+        *
         * @var bool
         */
        public $showSessionWarning = false;
 
        /**
         * Numeric index of the page we're on
+        *
         * @var int
         */
        protected $tabIndex = 1;
 
        /**
         * Name of the page we're on
+        *
         * @var string
         */
        protected $currentPageName;
@@ -140,9 +148,9 @@ class WebInstaller extends Installer {
        /**
         * Main entry point.
         *
-        * @param array $session initial session array
+        * @param array[] $session initial session array
         *
-        * @return array New session array
+        * @return array[] New session array
         */
        public function execute( array $session ) {
                $this->session = $session;
@@ -396,7 +404,8 @@ class WebInstaller extends Installer {
 
        /**
         * Temporary error handler for session start debugging.
-        * @param $errno
+        *
+        * @param int $errno Unused
         * @param string $errstr
         */
        public function errorHandler( $errno, $errstr ) {
@@ -406,7 +415,7 @@ class WebInstaller extends Installer {
        /**
         * Clean up from execute()
         *
-        * @return array
+        * @return array[]
         */
        public function finish() {
                $this->output->output();
@@ -430,7 +439,8 @@ class WebInstaller extends Installer {
        /**
         * Get a URL for submission back to the same script.
         *
-        * @param array $query
+        * @param string[] $query
+        *
         * @return string
         */
        public function getUrl( $query = array() ) {
@@ -461,8 +471,9 @@ class WebInstaller extends Installer {
         * Get a session variable.
         *
         * @param string $name
-        * @param $default
-        * @return null
+        * @param array $default
+        *
+        * @return array
         */
        public function getSession( $name, $default = null ) {
                if ( !isset( $this->session[$name] ) ) {
@@ -474,6 +485,7 @@ class WebInstaller extends Installer {
 
        /**
         * Set a session variable.
+        *
         * @param string $name Key for the variable
         * @param mixed $value
         */
@@ -483,6 +495,7 @@ class WebInstaller extends Installer {
 
        /**
         * Get the next tabindex attribute value.
+        *
         * @return int
         */
        public function nextTabIndex() {
@@ -770,7 +783,7 @@ class WebInstaller extends Installer {
        /**
         * Get a labelled text box to configure a variable.
         *
-        * @param array $params
+        * @param mixed[] $params
         *    Parameters are:
         *      var:         The variable to be configured (required)
         *      label:       The message name for the label (required)
@@ -817,7 +830,7 @@ class WebInstaller extends Installer {
        /**
         * Get a labelled textarea to configure a variable
         *
-        * @param array $params
+        * @param mixed[] $params
         *    Parameters are:
         *      var:         The variable to be configured (required)
         *      label:       The message name for the label (required)
@@ -866,7 +879,7 @@ class WebInstaller extends Installer {
         * Get a labelled password box to configure a variable.
         *
         * Implements password hiding
-        * @param array $params
+        * @param mixed[] $params
         *    Parameters are:
         *      var:         The variable to be configured (required)
         *      label:       The message name for the label (required)
@@ -895,7 +908,7 @@ class WebInstaller extends Installer {
        /**
         * Get a labelled checkbox to configure a boolean variable.
         *
-        * @param array $params
+        * @param mixed[] $params
         *    Parameters are:
         *      var:         The variable to be configured (required)
         *      label:       The message name for the label (required)
@@ -946,7 +959,7 @@ class WebInstaller extends Installer {
        /**
         * Get a set of labelled radio buttons.
         *
-        * @param array $params
+        * @param mixed[] $params
         *    Parameters are:
         *      var:             The variable to be configured (required)
         *      label:           The message name for the label (required)
@@ -1033,10 +1046,10 @@ class WebInstaller extends Installer {
         * Assumes that variables containing "password" in the name are (potentially
         * fake) passwords.
         *
-        * @param array $varNames
+        * @param string[] $varNames
         * @param string $prefix The prefix added to variables to obtain form names
         *
-        * @return array
+        * @return string[]
         */
        public function setVarsFromRequest( $varNames, $prefix = 'config_' ) {
                $newValues = array();
@@ -1063,7 +1076,8 @@ class WebInstaller extends Installer {
        /**
         * Helper for Installer::docLink()
         *
-        * @param $page
+        * @param string $page
+        *
         * @return string
         */
        protected function getDocUrl( $page ) {
@@ -1079,9 +1093,10 @@ class WebInstaller extends Installer {
        /**
         * Extension tag hook for a documentation link.
         *
-        * @param $linkText
-        * @param $attribs
-        * @param $parser
+        * @param string $linkText
+        * @param string[] $attribs
+        * @param Parser $parser Unused
+        *
         * @return string
         */
        public function docLink( $linkText, $attribs, $parser ) {
@@ -1095,9 +1110,10 @@ class WebInstaller extends Installer {
        /**
         * Helper for "Download LocalSettings" link on WebInstall_Complete
         *
-        * @param $text
-        * @param $attribs
-        * @param $parser
+        * @param string $text Unused
+        * @param string[] $attribs Unused
+        * @param Parser $parser Unused
+        *
         * @return string Html for download link
         */
        public function downloadLinkHook( $text, $attribs, $parser ) {
@@ -1138,7 +1154,11 @@ class WebInstaller extends Installer {
                return parent::envCheckPath();
        }
 
+       /**
+        * @return String
+        */
        protected function envGetDefaultServer() {
                return WebRequest::detectServer();
        }
+
 }
index e05a3d4..7a7f125 100644 (file)
@@ -33,6 +33,7 @@
  * @since 1.17
  */
 class WebInstallerOutput {
+
        /**
         * The WebInstaller object this WebInstallerOutput is used by.
         *
@@ -52,6 +53,9 @@ class WebInstallerOutput {
         */
        private $headerDone = false;
 
+       /**
+        * @var string
+        */
        public $redirectTarget;
 
        /**
@@ -69,27 +73,39 @@ class WebInstallerOutput {
        private $useShortHeader = false;
 
        /**
-        * Constructor.
-        *
-        * @param $parent WebInstaller
+        * @param WebInstaller $parent
         */
        public function __construct( WebInstaller $parent ) {
                $this->parent = $parent;
        }
 
+       /**
+        * @param string $html
+        */
        public function addHTML( $html ) {
                $this->contents .= $html;
                $this->flush();
        }
 
+       /**
+        * @param string $text
+        */
        public function addWikiText( $text ) {
                $this->addHTML( $this->parent->parse( $text ) );
        }
 
+       /**
+        * @param string $html
+        */
        public function addHTMLNoFlush( $html ) {
                $this->contents .= $html;
        }
 
+       /**
+        * @param string $url
+        *
+        * @throws MWException
+        */
        public function redirect( $url ) {
                if ( $this->headerDone ) {
                        throw new MWException( __METHOD__ . ' called after sending headers' );
@@ -110,6 +126,7 @@ class WebInstallerOutput {
         *   and not properly handling such details as media types in module definitions.
         *
         * @param string $dir 'ltr' or 'rtl'
+        *
         * @return String
         */
        public function getCSS( $dir ) {
@@ -192,6 +209,7 @@ class WebInstallerOutput {
 
        /**
         * "<link>" to index.php?css=foobar for the "<head>"
+        *
         * @return String
         */
        private function getCssUrl() {
@@ -236,7 +254,7 @@ class WebInstallerOutput {
        }
 
        /**
-        * @return array
+        * @return string[]
         */
        public function getHeadAttribs() {
                return array(
@@ -247,6 +265,7 @@ class WebInstallerOutput {
 
        /**
         * Get whether the header has been output
+        *
         * @return bool
         */
        public function headerDone() {
@@ -341,7 +360,11 @@ class WebInstallerOutput {
                echo wfMessage( 'config-title', $wgVersion )->escaped();
        }
 
+       /**
+        * @return string
+        */
        public function getJQuery() {
-               return Html::linkedScript( "../resources/jquery/jquery.js" );
+               return Html::linkedScript( "../resources/src/jquery/jquery.js" );
        }
+
 }
index 4bc6cad..3b3473b 100644 (file)
@@ -36,12 +36,13 @@ abstract class WebInstallerPage {
         */
        public $parent;
 
+       /**
+        * @return string
+        */
        abstract public function execute();
 
        /**
-        * Constructor.
-        *
-        * @param $parent WebInstaller
+        * @param WebInstaller $parent
         */
        public function __construct( WebInstaller $parent ) {
                $this->parent = $parent;
@@ -51,12 +52,16 @@ abstract class WebInstallerPage {
         * Is this a slow-running page in the installer? If so, WebInstaller will
         * set_time_limit(0) before calling execute(). Right now this only applies
         * to Install and Upgrade pages
-        * @return bool
+        *
+        * @return bool Always false in this default implementation.
         */
        public function isSlow() {
                return false;
        }
 
+       /**
+        * @param string $html
+        */
        public function addHTML( $html ) {
                $this->parent->output->addHTML( $html );
        }
@@ -124,18 +129,33 @@ abstract class WebInstallerPage {
                $this->addHTML( $s );
        }
 
+       /**
+        * @return string
+        */
        public function getName() {
                return str_replace( 'WebInstaller_', '', get_class( $this ) );
        }
 
+       /**
+        * @return string
+        */
        protected function getId() {
                return array_search( $this->getName(), $this->parent->pageSequence );
        }
 
+       /**
+        * @param string $var
+        *
+        * @return mixed
+        */
        public function getVar( $var ) {
                return $this->parent->getVar( $var );
        }
 
+       /**
+        * @param string $name
+        * @param mixed $value
+        */
        public function setVar( $name, $value ) {
                $this->parent->setVar( $name, $value );
        }
@@ -175,16 +195,21 @@ abstract class WebInstallerPage {
        }
 
        /**
-        * Opposite to startLiveBox()
+        * Opposite to WebInstallerPage::startLiveBox
         */
        protected function endLiveBox() {
                $this->addHTML( '</textarea></div>
 <script>jQuery( "#config-spinner" ).hide()</script>' );
                $this->parent->output->flush();
        }
+
 }
 
 class WebInstaller_Language extends WebInstallerPage {
+
+       /**
+        * @return string|null
+        */
        public function execute() {
                global $wgLang;
                $r = $this->parent->request;
@@ -244,15 +269,18 @@ class WebInstaller_Language extends WebInstallerPage {
                                $this->parent->getHelpBox( 'config-wiki-language-help' ) );
                $this->addHTML( $s );
                $this->endForm( 'continue', false );
+
+               return null;
        }
 
        /**
         * Get a "<select>" for selecting languages.
         *
-        * @param $name
-        * @param $label
-        * @param $selectedCode
-        * @param $helpHtml string
+        * @param string $name
+        * @param string $label
+        * @param string $selectedCode
+        * @param string $helpHtml
+        *
         * @return string
         */
        public function getLanguageSelector( $name, $label, $selectedCode, $helpHtml = '' ) {
@@ -275,9 +303,14 @@ class WebInstaller_Language extends WebInstallerPage {
 
                return $this->parent->label( $label, $name, $s );
        }
+
 }
 
 class WebInstaller_ExistingWiki extends WebInstallerPage {
+
+       /**
+        * @return string
+        */
        public function execute() {
                // If there is no LocalSettings.php, continue to the installer welcome page
                $vars = Installer::getExistingLocalSettings();
@@ -366,6 +399,12 @@ class WebInstaller_ExistingWiki extends WebInstallerPage {
                $this->endForm( 'continue' );
        }
 
+       /**
+        * @param string[] $names
+        * @param mixed[] $vars
+        *
+        * @return Status
+        */
        protected function importVariables( $names, $vars ) {
                $status = Status::newGood();
                foreach ( $names as $name ) {
@@ -380,7 +419,9 @@ class WebInstaller_ExistingWiki extends WebInstallerPage {
 
        /**
         * Initiate an upgrade of the existing database
-        * @param array $vars Variables from LocalSettings.php
+        *
+        * @param mixed[] $vars Variables from LocalSettings.php
+        *
         * @return Status
         */
        protected function handleExistingUpgrade( $vars ) {
@@ -426,10 +467,14 @@ class WebInstaller_ExistingWiki extends WebInstallerPage {
 
                return $status;
        }
+
 }
 
 class WebInstaller_Welcome extends WebInstallerPage {
 
+       /**
+        * @return string
+        */
        public function execute() {
                if ( $this->parent->request->wasPosted() ) {
                        if ( $this->getVar( '_Environment' ) ) {
@@ -451,11 +496,13 @@ class WebInstaller_Welcome extends WebInstallerPage {
 
                return '';
        }
+
 }
 
 class WebInstaller_DBConnect extends WebInstallerPage {
+
        /**
-        * @return string|void When string, "skip" or "continue"
+        * @return string|null When string, "skip" or "continue"
         */
        public function execute() {
                if ( $this->getVar( '_ExistingDBSettings' ) ) {
@@ -529,8 +576,13 @@ class WebInstaller_DBConnect extends WebInstallerPage {
 
                $this->addHTML( $this->parent->label( 'config-db-type', false, $types ) . $settings );
                $this->endForm();
+
+               return null;
        }
 
+       /**
+        * @return Status
+        */
        public function submit() {
                $r = $this->parent->request;
                $type = $r->getVal( 'DBType' );
@@ -545,13 +597,21 @@ class WebInstaller_DBConnect extends WebInstallerPage {
 
                return $installer->submitConnectForm();
        }
+
 }
 
 class WebInstaller_Upgrade extends WebInstallerPage {
+
+       /**
+        * @return bool Always true.
+        */
        public function isSlow() {
                return true;
        }
 
+       /**
+        * @return string|null
+        */
        public function execute() {
                if ( $this->getVar( '_UpgradeDone' ) ) {
                        // Allow regeneration of LocalSettings.php, unless we are working
@@ -603,6 +663,8 @@ class WebInstaller_Upgrade extends WebInstallerPage {
                $this->addHTML( $this->parent->getInfoBox(
                        wfMessage( 'config-can-upgrade', $GLOBALS['wgVersion'] )->plain() ) );
                $this->endForm();
+
+               return null;
        }
 
        public function showDoneMessage() {
@@ -626,10 +688,14 @@ class WebInstaller_Upgrade extends WebInstallerPage {
                $this->parent->restoreLinkPopups();
                $this->endForm( $regenerate ? 'regenerate' : false, false );
        }
+
 }
 
 class WebInstaller_DBSettings extends WebInstallerPage {
 
+       /**
+        * @return string|null
+        */
        public function execute() {
                $installer = $this->parent->getDBInstaller( $this->getVar( 'wgDBtype' ) );
 
@@ -653,11 +719,17 @@ class WebInstaller_DBSettings extends WebInstallerPage {
                $this->startForm();
                $this->addHTML( $form );
                $this->endForm();
+
+               return null;
        }
+
 }
 
 class WebInstaller_Name extends WebInstallerPage {
 
+       /**
+        * @return string
+        */
        public function execute() {
                $r = $this->parent->request;
                if ( $r->wasPosted() ) {
@@ -751,6 +823,9 @@ class WebInstaller_Name extends WebInstallerPage {
                return 'output';
        }
 
+       /**
+        * @return bool
+        */
        public function submit() {
                $retVal = true;
                $this->parent->setVarsFromRequest( array( 'wgSitename', '_NamespaceType',
@@ -863,9 +938,14 @@ class WebInstaller_Name extends WebInstallerPage {
 
                return $retVal;
        }
+
 }
 
 class WebInstaller_Options extends WebInstallerPage {
+
+       /**
+        * @return string|null
+        */
        public function execute() {
                if ( $this->getVar( '_SkipOptional' ) == 'skip' ) {
                        return 'skip';
@@ -1049,6 +1129,8 @@ class WebInstaller_Options extends WebInstallerPage {
                        $this->getFieldSetEnd()
                );
                $this->endForm();
+
+               return null;
        }
 
        /**
@@ -1077,6 +1159,9 @@ class WebInstaller_Options extends WebInstallerPage {
                return $iframeUrl;
        }
 
+       /**
+        * @return string
+        */
        public function getCCChooser() {
                $iframeAttribs = array(
                        'class' => 'config-cc-iframe',
@@ -1098,6 +1183,9 @@ class WebInstaller_Options extends WebInstallerPage {
                        "</div>\n";
        }
 
+       /**
+        * @return string
+        */
        public function getCCDoneBox() {
                $js = "parent.document.getElementById('config-cc-wrapper').style.height = '$1';";
                // If you change this height, also change it in config.css
@@ -1137,6 +1225,9 @@ class WebInstaller_Options extends WebInstallerPage {
                $this->addHTML( $this->getCCDoneBox() );
        }
 
+       /**
+        * @return bool
+        */
        public function submit() {
                $this->parent->setVarsFromRequest( array( '_RightsProfile', '_LicenseCode',
                        'wgEnableEmail', 'wgPasswordSender', 'wgEnableUploads', 'wgLogo',
@@ -1144,8 +1235,7 @@ class WebInstaller_Options extends WebInstallerPage {
                        'wgEmailAuthentication', 'wgMainCacheType', '_MemCachedServers',
                        'wgUseInstantCommons' ) );
 
-               if ( !in_array( $this->getVar( '_RightsProfile' ),
-                       array_keys( $this->parent->rightsProfiles ) )
+               if ( !array_key_exists( $this->getVar( '_RightsProfile' ), $this->parent->rightsProfiles )
                ) {
                        reset( $this->parent->rightsProfiles );
                        $this->setVar( '_RightsProfile', key( $this->parent->rightsProfiles ) );
@@ -1158,7 +1248,7 @@ class WebInstaller_Options extends WebInstallerPage {
 
                                return false;
                        }
-               } elseif ( in_array( $code, array_keys( $this->parent->licenses ) ) ) {
+               } elseif ( array_key_exists( $code, $this->parent->licenses ) ) {
                        // Messages:
                        // config-license-cc-by, config-license-cc-by-sa, config-license-cc-by-nc-sa,
                        // config-license-cc-0, config-license-pd, config-license-gfdl, config-license-none,
@@ -1217,13 +1307,21 @@ class WebInstaller_Options extends WebInstallerPage {
 
                return true;
        }
+
 }
 
 class WebInstaller_Install extends WebInstallerPage {
+
+       /**
+        * @return bool Always true.
+        */
        public function isSlow() {
                return true;
        }
 
+       /**
+        * @return string|bool
+        */
        public function execute() {
                if ( $this->getVar( '_UpgradeDone' ) ) {
                        return 'skip';
@@ -1252,6 +1350,9 @@ class WebInstaller_Install extends WebInstallerPage {
                return true;
        }
 
+       /**
+        * @param string $step
+        */
        public function startStage( $step ) {
                // Messages: config-install-database, config-install-tables, config-install-interwiki,
                // config-install-stats, config-install-keys, config-install-sysop, config-install-mainpage
@@ -1264,8 +1365,8 @@ class WebInstaller_Install extends WebInstallerPage {
        }
 
        /**
-        * @param $step
-        * @param $status Status
+        * @param string $step
+        * @param Status $status
         */
        public function endStage( $step, $status ) {
                if ( $step == 'extension-tables' ) {
@@ -1281,9 +1382,11 @@ class WebInstaller_Install extends WebInstallerPage {
                        $this->parent->showStatusBox( $status );
                }
        }
+
 }
 
 class WebInstaller_Complete extends WebInstallerPage {
+
        public function execute() {
                // Pop up a dialog box, to make it difficult for the user to forget
                // to download the file
@@ -1317,10 +1420,14 @@ class WebInstaller_Complete extends WebInstallerPage {
                $this->parent->restoreLinkPopups();
                $this->endForm( false, false );
        }
+
 }
 
 class WebInstaller_Restart extends WebInstallerPage {
 
+       /**
+        * @return string|null
+        */
        public function execute() {
                $r = $this->parent->request;
                if ( $r->wasPosted() ) {
@@ -1336,11 +1443,17 @@ class WebInstaller_Restart extends WebInstallerPage {
                $s = $this->parent->getWarningBox( wfMessage( 'config-help-restart' )->plain() );
                $this->addHTML( $s );
                $this->endForm( 'restart' );
+
+               return null;
        }
+
 }
 
 abstract class WebInstaller_Document extends WebInstallerPage {
 
+       /**
+        * @return string
+        */
        abstract protected function getFileName();
 
        public function execute() {
@@ -1351,6 +1464,9 @@ abstract class WebInstaller_Document extends WebInstallerPage {
                $this->endForm( false );
        }
 
+       /**
+        * @return string
+        */
        public function getFileContents() {
                $file = __DIR__ . '/../../' . $this->getFileName();
                if ( !file_exists( $file ) ) {
@@ -1359,15 +1475,26 @@ abstract class WebInstaller_Document extends WebInstallerPage {
 
                return file_get_contents( $file );
        }
+
 }
 
 class WebInstaller_Readme extends WebInstaller_Document {
+
+       /**
+        * @return string
+        */
        protected function getFileName() {
                return 'README';
        }
+
 }
 
 class WebInstaller_ReleaseNotes extends WebInstaller_Document {
+
+       /**
+        * @throws MWException
+        * @return string
+        */
        protected function getFileName() {
                global $wgVersion;
 
@@ -1377,16 +1504,27 @@ class WebInstaller_ReleaseNotes extends WebInstaller_Document {
 
                return 'RELEASE-NOTES-' . $result[1] . '.' . $result[2];
        }
+
 }
 
 class WebInstaller_UpgradeDoc extends WebInstaller_Document {
+
+       /**
+        * @return string
+        */
        protected function getFileName() {
                return 'UPGRADE';
        }
+
 }
 
 class WebInstaller_Copying extends WebInstaller_Document {
+
+       /**
+        * @return string
+        */
        protected function getFileName() {
                return 'COPYING';
        }
+
 }
index 95831f4..8b97925 100644 (file)
@@ -1,7 +1,8 @@
 {
     "@metadata": {
         "authors": [
-            "Naudefj"
+            "Naudefj",
+            "Winstonza"
         ]
     },
     "config-desc": "Die Installasieprogram vir MediaWiki",
     "config-ns-other": "Ander (spesifiseer)",
     "config-ns-other-default": "MyWiki",
     "config-admin-box": "Administrateur se gebruiker",
-    "config-admin-name": "U naam:",
+    "config-admin-name": "U gebruikersnaam:",
     "config-admin-password": "Wagwoord:",
     "config-admin-password-confirm": "Wagwoord weer:",
     "config-admin-password-blank": "Verskaf 'n wagwoord vir die administrateur in.",
-    "config-admin-password-same": "Die wagwoord mag nie dieselfde as die gebruikersnaam wees nie.",
     "config-admin-password-mismatch": "Die twee wagwoorde wat u ingetik het stem nie ooreen nie.",
     "config-admin-email": "E-posadres:",
     "config-optional-continue": "Vra my meer vrae.",
     "config-license-pd": "Publieke Domein",
     "config-license-cc-choose": "Kies 'n Creative Commons-lisensie",
     "config-email-settings": "E-posinstellings",
+    "config-email-user": "Laat e-pos tussen gebruikers toe",
+    "config-email-user-help": "Stel alle gebruikers in staat om aan mekaar e-pos te stuur indien dit so in hul voorkeure aangedui is.",
+    "config-email-usertalk": "Laat kennisgewings op gebruikersbesprekingsblad toe.",
+    "config-email-auth": "Laat e-pos-verifikasie toe",
     "config-email-sender": "E-posadres vir antwoorde:",
     "config-upload-settings": "Oplaai van beelde en lêer",
     "config-upload-enable": "Aktiveer die oplaai van lêers",
     "config-help": "hulp",
     "mainpagetext": "'''MediaWiki is suksesvol geïnstalleer.'''",
     "mainpagedocfooter": "Konsulteer '''[//meta.wikimedia.org/wiki/Help:Contents User's Guide]''' vir inligting oor hoe om die wikisagteware te gebruik.\n\n== Hoe om te Begin ==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Configuration settings list]\n* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]"
-}
\ No newline at end of file
+}
index 16dbe0a..d863ef2 100644 (file)
@@ -6,4 +6,4 @@
     },
     "mainpagetext": "'''MediaWiki software u instalue me sukses.'''",
     "mainpagedocfooter": "Për mâ shumë informata rreth përdorimit të softwareit wiki, ju lutem shikoni [//meta.wikimedia.org/wiki/Help:Contents dokumentacionin].\n\n\n== Për fillim ==\n\n* [//www.mediawiki.org/wiki/Help:Configuration_settings Konfigurimi i MediaWikit]\n* [//www.mediawiki.org/wiki/Help:FAQ Pyetjet e shpeshta rreth MediaWikit]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Njoftime rreth MediaWikit]"
-}
\ No newline at end of file
+}
index 2c79fab..cca7253 100644 (file)
@@ -1,7 +1,5 @@
 {
-    "@metadata": {
-        "authors": []
-    },
+    "@metadata": [],
     "mainpagetext": "'''MediaWiki በትክክል ማስገባቱ ተከናወነ።'''",
     "mainpagedocfooter": "ስለ ዊኪ ሶፍትዌር ጥቅም ለመረዳት፣ [//meta.wikimedia.org/wiki/Help:Contents User's Guide] ያንብቡ።\n\n== ለመጀመር ==\n\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Configuration settings list]\n* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]"
-}
\ No newline at end of file
+}
index 90f5d5d..50b7a01 100644 (file)
@@ -6,4 +6,4 @@
     },
     "mainpagetext": "'''O programa MediaWiki s'ha instalato correctament.'''",
     "mainpagedocfooter": "Consulta a [//meta.wikimedia.org/wiki/Help:Contents Guía d'usuario] ta mirar información sobre cómo usar o software wiki.\n\n== Ta prencipiar ==\n\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Lista de caracteristicas confegurables]\n* [//www.mediawiki.org/wiki/Manual:FAQ Preguntas cutianas sobre MediaWiki (FAQ)]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lista de correu sobre ta anuncios de MediaWiki]"
-}
\ No newline at end of file
+}
index a7ecaeb..c63883e 100644 (file)
@@ -6,4 +6,4 @@
     },
     "mainpagetext": "'''MediaWiki hafaþ geworden spēdige inseted.'''",
     "mainpagedocfooter": "Þeahta þone [//meta.wikimedia.org/wiki/Help:Contents Brūcenda Lǣdend]  on helpe mid þǣre nytte of ƿikisōftƿare.\n\n== Beȝinnunȝ ==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Onfæstnunȝa ȝesetednessa ȝetæl]\n* [//www.mediawiki.org/wiki/Manual:FAQ Ȝetæl oft ascodra ascunȝa ymb MediaǷiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Ǣrendunȝȝetæl nīƿra MediaǷiki forþsendnessa]"
-}
\ No newline at end of file
+}
index c7e3914..98077b9 100644 (file)
@@ -4,16 +4,48 @@
             "Meno25",
             "Mido",
             "OsamaK",
-            "روخو"
+            "روخو",
+            "Claw eg"
         ]
     },
     "config-desc": "مثبت لميدياويكي",
     "config-title": "تثبيت ميدياويكي $1",
     "config-information": "معلومات",
+    "config-localsettings-upgrade": "<code>LocalSettings.php</code> قد تم كشف ملف.\nلترقية هذا التنصيب، رجاء أدخل قيمة <code>$wgUpgradeKey</code> في الصندوق أدناه.\nستجده في <code>LocalSettings.php</code>.",
+    "config-localsettings-cli-upgrade": "<code>LocalSettings.php</code> قد تم كشف ملف.\nلترقية هذا التنصيب، رجاء قم بتفعيل <code>update.php</code> عوضًا عن ذلك",
+    "config-localsettings-key": "مفتاح ترقية:",
+    "config-localsettings-badkey": "المفتاح الذي قدمته غير صحيح.",
+    "config-upgrade-key-missing": "تنصيب موجود للميدياويكي قد تم اكتشافه.\nلترقية هذا التنصيب، الرجاء وضع السطر أسفل <code>LocalSettings.php</code> الخاصة بك:\n\n$1",
+    "config-localsettings-incomplete": "صفحة <code>LocalSettings.php</code> يبدو أنها ناقصة.\nالمتغير $1 لم يتم تعيينه.\nالرجاء تغيير <code>LocalSettings.php</code> لكي يتم تعيين المتغير، ثم اضغط على \"{{int:Config-continue}}\".",
+    "config-localsettings-connection-error": "تمت مصادفة خطأ أثناء الاتصال بقاعدة البيانات باستخدام الإعدادات المحددة في <code>LocalSettings.php</code> أو <code>AdminSettings.php</code>. الرجاء إصلاح هذه الإعدادات وحاول مجددًا.\n\n$1",
+    "config-session-error": "خطأ في بدء الجلسة: $1",
+    "config-session-expired": "يبدو أن بيانات جلستك قد انتهت صلاحيتها.\nالجلسات مكونة مدى الحياة من $1.\nيمكنك زيادة هذه بتعيين <code>session.gc_maxlifetime</code> في php.ini.\nأعد تشغيل عميل التثبيت.",
+    "config-no-session": "بيانات جلستك قد ضاعت!\nتحقق من php.ini للتأكد أن <code>session.save_path</code> تم تعيينه كدليل مناسب.",
+    "config-your-language": "لغتك:",
+    "config-your-language-help": "حدد لغة لاستخدامها أثناء عملية التثبيت.",
+    "config-wiki-language": "لغة ويكي:",
+    "config-wiki-language-help": "قم بتحديد اللغة التي ستُكتب بها الويكي غالبًا.",
     "config-back": "→ ارجع",
     "config-continue": "استمر ←",
     "config-page-language": "اللغة",
+    "config-page-welcome": "مرحبًا في ميدياويكي!",
+    "config-page-dbconnect": "الاتصال بقاعدة البيانات",
+    "config-page-upgrade": "قم بترقية التثبيت الموجود",
+    "config-page-dbsettings": "إعدادات قاعدة البيانات",
     "config-page-name": "الاسم",
+    "config-page-options": "خيارات",
+    "config-page-install": "تنصيب",
+    "config-page-complete": "اكتمل!",
+    "config-page-restart": "قم بإعادة تشغيل التثبيت",
+    "config-page-readme": "اقرأني",
+    "config-page-releasenotes": "ملاحظات الإصدار",
+    "config-page-copying": "نسخ",
+    "config-page-upgradedoc": "ترقية",
+    "config-page-existingwiki": "ويكي موجودة",
+    "config-help-restart": "هل تريد إزالة البيانات المحفوظة التي قد قمت بإدخالها وإعادة تشغيل عملية التثبيت؟",
+    "config-restart": "نعم، إعادة التشغيل",
+    "config-env-php": "بي إتش بي $1 مثبت.",
+    "config-env-php-toolow": "بي إتش بي $1 مثبت.\nومع ذلك، يتطلب ميدياويكي بي إتش بي $2 أو أعلى.",
     "config-db-username": "اسم مستخدم قاعدة البيانات:",
     "config-db-password": "كلمة سر قاعدة البيانات:",
     "config-db-port": "منفذ قاعدة البيانات:",
@@ -24,4 +56,4 @@
     "config-admin-email": "عنوان البريد الإلكتروني:",
     "mainpagetext": "'''تم تثبيت ميدياويكي بنجاح.'''",
     "mainpagedocfooter": "استشر [//meta.wikimedia.org/wiki/Help:Contents دليل المستخدم] لمعلومات حول استخدام برنامج الويكي.\n\n== البداية ==\n\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings قائمة إعدادات الضبط]\n* [//www.mediawiki.org/wiki/Manual:FAQ أسئلة متكررة حول ميدياويكي]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce القائمة البريدية الخاصة بإصدار ميدياويكي]"
-}
\ No newline at end of file
+}
index e109ca1..bb1614f 100644 (file)
     "config-page-install": "ܢܨܘܒ",
     "config-ns-other-default": "ܘܝܩܝ ܕܝܠܝ",
     "config-admin-box": "ܚܘܫܒܢܐ ܕܡܕܒܪܢܐ",
-    "config-admin-name": "ܫܡܐ ܕܝܠܟ:",
+    "config-admin-name": "Ü«Ü¡Ü\90 Ü\95Ü\9fÜ\86Ü\9bÜ\86ܡܦܠÜ\9aÜ¢Ü\90 Ü\95Ü\9dÜ Ü\9f:",
     "config-admin-password": "ܡܠܬܐ ܕܥܠܠܐ:",
     "config-admin-password-confirm": "ܡܠܬܐ ܕܥܠܠܐ ܙܒܢܬܐ ܐܚܪܬܐ:",
     "config-admin-email": "ܡܘܢܥܐ ܕܒܝܠܕܪܐ ܐܠܩܛܪܘܢܝܐ:",
     "config-profile-private": "ܘܝܩܝ ܦܪܨܘܦܝܐ",
     "config-email-settings": "ܛܘܝܒ̈ܐ ܕܒܝܠܕܪܐ ܐܠܩܛܪܘܢܝܐ"
-}
\ No newline at end of file
+}
index 9437127..2faa967 100644 (file)
@@ -6,4 +6,4 @@
     },
     "mainpagetext": "'''MediaWiki ṫ'instala be najaḫ.'''",
     "mainpagedocfooter": "Ila bġiṫiw meĝlomaṫ ĥrin baċ ṫesṫeĝmlo had l-lojisyél siro ċofo [//meta.wikimedia.org/wiki/Aide:Contenu Gid dyal l-mosṫeĥdim]\n\n== L-bdaya mĝa MediaWiki ==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Lista dyal l-paramétraṫ dyal l-konfigurasyon]\n* [//www.mediawiki.org/wiki/Manual:FAQ/fr FAQ fe MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lista dyal l-modakaraṫ ĝla versyonaṫ jdad dyal MediaWiki]"
-}
\ No newline at end of file
+}
index e0f7319..b8aaefe 100644 (file)
@@ -1,7 +1,18 @@
 {
     "@metadata": {
-        "authors": []
+        "authors": [
+            "Ghaly"
+        ]
     },
+    "config-your-language": "اللغه بتاعتك:",
+    "config-your-language-help": " إختار لغة البرنامج بتاعتك:",
+    "config-wiki-language": " ويكى لانجواج :",
+    "config-back": "→ ارجع",
+    "config-continue": "استمر",
+    "config-page-language": "اللغه",
+    "config-page-welcome": "اهلا ف ميديا ويكى",
+    "config-page-name": "الاسم:",
+    "config-page-install": "تركيب",
     "mainpagetext": "''' ميدياويكى اتنزلت بنجاح.'''",
     "mainpagedocfooter": "اسال [//meta.wikimedia.org/wiki/Help:Contents دليل اليوزر] للمعلومات حوالين استخدام برنامج الويكى.\n\n== البداية ==\n\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings لستة اعدادات الضبط]\n* [//www.mediawiki.org/wiki/Manual:FAQ أسئلة بتكرر حوالين الميدياويكى]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce لستة الايميلات بتاعة اعلانات الميدياويكى]"
-}
\ No newline at end of file
+}
index 3af200f..bab96ac 100644 (file)
@@ -7,4 +7,4 @@
     },
     "mainpagetext": "'''মিডিয়াৱিকি সফলভাবে ইন্সটল কৰা হ'ল ।'''",
     "mainpagedocfooter": "ৱিকি চ'ফটৱেৰ কেনেকৈ ব্যৱহাৰ কৰিব [//meta.wikimedia.org/wiki/Help:Contents সদস্যৰ সহায়িকা] চাওঁক ।\n\n== আৰম্ভণি কৰিবলৈ ==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Configuration settings list]\n* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]"
-}
\ No newline at end of file
+}
index 56be311..b7609c4 100644 (file)
     "config-localsettings-badkey": "La clave que dio ye incorreuta.",
     "config-upgrade-key-missing": "Deteutose una instalación esistente de MediaWiki.\nP'anovar esta instalación, ponga la llinia siguiente al final del ficheru <code>LocalSettings.php</code>:\n\n$1",
     "config-localsettings-incomplete": "Paez que'l ficheru <code>LocalSettings.php</code> esistente ta incompletu.\nLa variable $1 nun ta definida.\nCamude'l ficheru <code>LocalSettings.php</code> pa qu'esta variable quede definida y calque \"{{int:Config-continue}}\".",
-    "config-localsettings-connection-error": "Alcontrose un error al conectar cola base de datos usando la configuración especificada en <code>LocalSettings.php</code> o <code>AdminSettings.php</code>. Corrixa esta configuración y vuelva a intentalo.\n\n$1",
+    "config-localsettings-connection-error": "Alcontróse un error al conectar cola base de datos usando la configuración especificada en <code>LocalSettings.php</code>. Corrixa esta configuración y vuelva a intentalo.\n\n$1",
+    "config-session-error": "Error al aniciar sesión: $1",
+    "config-session-expired": "Paez que caducaron los sos datos de sesión.\nLes sesiones tan configuraes pa tener una duración de $1.\nPue incrementar esto configurando <code>session.gc_maxlifetime</code> en php.ini.\nReanicie'l procesu d'instalación.",
+    "config-no-session": "¡Perdiéronse los sos datos de sesión!\nCompruebe php.ini y asegúrese de qu'en <code>session.save_path</code> ta definíu un direutoriu correutu.",
     "config-your-language": "La so llingua:",
     "config-your-language-help": "Seleicione la llingua a emplegar nel procesu d'instalación.",
     "config-wiki-language": "Llingua de la wiki:",
     "config-page-copying": "Copiar",
     "config-page-upgradedoc": "Anovando",
     "config-page-existingwiki": "Wiki esistente",
+    "config-help-restart": "¿Quier llimpiar tolos datos guardaos qu'escribió y reaniciar el procesu d'instalación?",
+    "config-restart": "Sí, reanicialu",
+    "config-welcome": "=== Comprobaciones del entornu ===\nAgora van facese unes comprobaciones básiques para ver si l'entornu ye afayadizu pa la instalación de MediaWiki.\nAlcuérdese d'incluir esta información si necesita encontu pa completar la instalación.",
+    "config-copyright": "=== Drechos d'autor y condiciones d'usu ===\n\n$1\n\nEsti programa ye software llibre; pue redistribuilu y/o camudalu baxo les condiciones de la llicencia pública xeneral GNU tal como la publica la Free Software Foundation; versión 2 o (como prefiera) cualquier versión posterior.\n\nEsti programa distribúise cola esperanza de que pueda ser útil, pero '''ensin garantía denguna'''; nin siquiera la garantía implícita de '''comercialidá''' o '''adautación a un fin determináu'''.\nVea la Llicencia pública xeneral GNU pa más detalles.\n\nHabría de tener recibío <doclink href=Copying>una copia de la llicencia pública xeneral GNU</doclink> xunto con esti programa; sinón, escriba a la Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA, o [http://www.gnu.org/copyleft/gpl.html lléala en llinia].",
+    "config-sidebar": "* [//www.mediawiki.org/wiki/MediaWiki/gl Páxina principal de MediaWiki]\n* [//www.mediawiki.org/wiki/Help:Contents Guía del usuariu]\n* [//www.mediawiki.org/wiki/Manual:Contents Guía del alministrador]\n* [//www.mediawiki.org/wiki/Manual:FAQ Entrugues frecuentes]\n----\n* <doclink href=Readme>Lléame</doclink>\n* <doclink href=ReleaseNotes>Notes de llanzamientu</doclink>\n* <doclink href=Copying>Copia</doclink>\n* <doclink href=UpgradeDoc>Anovamientu</doclink>",
+    "config-env-good": "Comprobóse l'entornu.\nPue instalar MediaWiki.",
+    "config-env-bad": "Comprobóse l'entornu.\nNun pue instalar MediaWiki.",
+    "config-env-php": "PHP $1 ta instaláu.",
+    "config-env-php-toolow": "PHP $1 ta instaláu.\nSicasí, MediaWiki necesita PHP $2 o superior.",
+    "config-unicode-using-utf8": "Usando utf8_normalize.so de Brion Vibber pa la normalización Unicode.",
+    "config-unicode-using-intl": "Usando la [http://pecl.php.net/intl estensión intl PECL] pa la normalización Unicode.",
+    "config-unicode-pure-php-warning": "'''Avisu:''' La [http://pecl.php.net/intl estensión intl PECL] nun ta disponible pa xestionar la normalización Unicode; volviendo a la implementación lenta en PHP puru.\nSi xestiona un sitiu con un tráficu altu, tendría de lleer una migaya sobro la [//www.mediawiki.org/wiki/Unicode_normalization_considerations normalización Unicode].",
+    "config-unicode-update-warning": "'''Avisu:''' La versión instalada del envoltoriu de normalización Unicode usa una versión antigua de la biblioteca [http://site.icu-project.org/ de los proyeutos ICU].\nTendría [//www.mediawiki.org/wiki/Unicode_normalization_considerations d'anovala] si ye importante pa vusté usar Unicode.",
+    "config-no-db": "¡Nun pudo alcontrase un controlador de base de datos afayadizu! Necesita instalar un controlador de base de datos pa PHP.\nTienen sofitu los tipos de base de datos siguientes: $1.\n\nSi compiló PHP vusté mesmu, reconfigúrelu con un cliente de base de datos activáu, por exemplu, usando <code>./configure --with-mysqli</code>.\nSi instaló PHP dende un paquete de Debian o Ubuntu, necesita instalar tamién,por exemplu, el paquete <code>php5-mysql</code>.",
+    "config-outdated-sqlite": "'''Avisu:''' tien SQLite $1, que ye inferior a la versión mínima necesaria $2. SQLite nun tará disponible.",
+    "config-no-fts3": "'''Avisu:''' SQLite ta compiláu ensin el [//sqlite.org/fts3.html módulu FTS3]; les funciones de gueta nun tarán disponibles nesti sistema.",
+    "config-register-globals": "'''Avisu: La opción de PHP <code>[http://php.net/register_globals register_globals]</code> ta activada.'''\n'''Desactívela si ye posible.'''\nMediaWiki funcionará, pero'l so sirvidor queda albentestate ente posibles vulnerabilidaes de seguridá.",
+    "config-site-name": "Nome de la wiki:",
+    "config-site-name-help": "Esto apaecerá na barra de títulos del navegador y en dellos sitios más.",
+    "config-site-name-blank": "Escriba un nome pal sitiu.",
+    "config-project-namespace": "Espaciu de nomes del proyeutu:",
+    "config-ns-generic": "Proyeutu",
+    "config-ns-site-name": "Igual que'l nome de la wiki: $1",
+    "config-ns-other": "Otru (especificar)",
+    "config-ns-other-default": "MioWiki",
     "config-download-localsettings": "Descargar <code>LocalSettings.php</code>",
     "config-help": "Ayuda",
     "config-nofile": "Nun pudo atopase'l ficheru \"$1\". ¿Desaniciose?",
     "mainpagetext": "'''MediaWiki instalóse correchamente.'''",
     "mainpagedocfooter": "Visita la [//meta.wikimedia.org/wiki/Help:Contents Guía del usuariu] pa saber cómo usar esti software wiki.\n\n== Empecipiando ==\n\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Llista de les opciones de configuración]\n* [//www.mediawiki.org/wiki/Manual:FAQ FAQ de MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Llista de corréu de les ediciones de MediaWiki]\n* [//www.mediawiki.org/wiki/Localisation#Translation_resources Llocaliza MediaWiki na to llingua]"
-}
\ No newline at end of file
+}
index 7e3a0c3..407bb89 100644 (file)
@@ -1,6 +1,4 @@
 {
-    "@metadata": {
-        "authors": []
-    },
+    "@metadata": [],
     "mainpagetext": "'''MediaWiki inkeyen talpeyot.'''"
-}
\ No newline at end of file
+}
index 63b9c4c..49e19a8 100644 (file)
@@ -3,9 +3,12 @@
         "authors": [
             "Cekli829",
             "Vago",
-            "Wertuose"
+            "Wertuose",
+            "Khan27"
         ]
     },
+    "config-desc": "MediaWiki yükləyicisi",
+    "config-information": "Məlumat",
     "config-back": "← Geri",
     "config-continue": "Davam et →",
     "config-page-language": "Dil",
@@ -23,7 +26,8 @@
     "config-admin-name": "Sizin adınız:",
     "config-admin-password": "Parol:",
     "config-admin-email": "E-poçt ünvanı",
+    "config-license-pd": "İctimai istifadə",
     "config-help": "kömək",
     "mainpagetext": "'''MediaWiki müvəffəqiyyətlə quraşdırıldı.'''",
     "mainpagedocfooter": "Bu vikinin istifadəsi ilə bağlı məlumat almaq üçün [//meta.wikimedia.org/wiki/Help:Contents İstifadəçi məlumat səhifəsinə] baxın.\n\n== Faydalı keçidlər ==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Tənzimləmələrin siyahısı]\n* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki haqqında tez-tez soruşulan suallar]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki e-poçt siyahısı]"
-}
\ No newline at end of file
+}
index d07dabf..e4a5bc1 100644 (file)
@@ -6,4 +6,4 @@
     },
     "mainpagetext": "«MediaWiki» уңышлы рәүештә ҡоролдо.",
     "mainpagedocfooter": "Был вики менән эшләү тураһында мәғлүмәтте [//meta.wikimedia.org/wiki/Ярҙам:Белешмә ошонда] табып була.\n\n== Файҙалы сығанаҡтар ==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Көйләүҙәр исемлеге (инг.)];\n* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki тураһында йыш бирелгән һорауҙар һәм яуаптар (инг.)];\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki-ның яңы версиялары тураһында хәбәрҙәр алып тороу]."
-}
\ No newline at end of file
+}
index 5eb5e2f..51dfa6b 100644 (file)
@@ -6,4 +6,4 @@
     },
     "mainpagetext": "'''MediaWiki is erfoigreich installird worn.'''",
     "mainpagedocfooter": "A Hüf zur da Benützung und Konfigurazion voh da Wiki-Software findst auf [//meta.wikimedia.org/wiki/Help:Contents Benützerhåndbuach].\n\n== Starthüfe ==\n\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Listen voh de Konfigurazionsvariaablen]\n* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki-FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Mailinglisten voh de neichen MediaWiki-Versionen]"
-}
\ No newline at end of file
+}
index 1b4f44a..ad33ff5 100644 (file)
@@ -1,7 +1,5 @@
 {
-    "@metadata": {
-        "authors": []
-    },
+    "@metadata": [],
     "mainpagetext": "'''مدیا وی کی گون موفقیت نصب بوت.'''",
     "mainpagedocfooter": "مشورت کنیت گون  [//meta.wikimedia.org/wiki/Help:Contents User's Guide] په گشیترین اطلاعات په استفاده چه برنامه ویکی.\n\n== شروع بیت ==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Configuration settings list]\n* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]"
-}
\ No newline at end of file
+}
index 640cb22..8727b18 100644 (file)
@@ -1,7 +1,37 @@
 {
     "@metadata": {
-        "authors": []
+        "authors": [
+            "Geopoet"
+        ]
     },
+    "config-desc": "An tagapagkaag para sa MediaWiki",
+    "config-title": "MediaWiki $1 na pagkakaag",
+    "config-information": "Impormasyon",
+    "config-localsettings-key": "Ipag-angat an susi:",
+    "config-localsettings-badkey": "The susi na saimong pinagtao bakong tama.",
+    "config-your-language": "An Saimong lengguwahe:",
+    "config-wiki-language": "Lengguwahe sa Wiki:",
+    "config-back": "← Ibuwelta",
+    "config-continue": "Ipadagos →",
+    "config-page-language": "Lengguwahe",
+    "config-page-welcome": "Maogmang pag-abot sa MediaWiki!",
+    "config-page-dbsettings": "Mga panuytoy nin datos-sarayan",
+    "config-page-name": "Pangaran",
+    "config-page-options": "Mga Pagpipilian",
+    "config-page-install": "Kaagon",
+    "config-page-complete": "Kumpleto!",
+    "config-page-restart": "Poonan otro an pagkakaag",
+    "config-page-readme": "Basaha ako",
+    "config-page-releasenotes": "Buhian an mga katalaanan",
+    "config-page-copying": "Pinagkokopya",
+    "config-page-upgradedoc": "Ipinagpapalangkaw",
+    "config-page-existingwiki": "Eksistidong wiki",
+    "config-restart": "Iyo, pakipoon kaini otro",
+    "config-db-wiki-settings": "Bistohon ining wiki",
+    "config-db-name": "Pangaran kan datos-sarayan:",
+    "config-db-username": "Ngaran-paragamit nin datos-sarayan:",
+    "config-db-password": "Pasa-taramon nin datos-sarayan:",
+    "config-db-password-empty": "Pakilaog nin sarong pasa-taramon para sa baguhong paragamit nin datos-sarayan: $1.\nMantang ini posibleng makamukna nin mga paragamit na mayong mga pasa-taramon, bako po ining segurado.",
     "mainpagetext": "'''Instalado na an MediaWiki.'''",
     "mainpagedocfooter": "Konsultarón tabì an [//meta.wikimedia.org/wiki/Help:Contents User's Guide] para sa impormasyon sa paggamit nin progama kaining wiki.\n\n== Pagpopoon ==\n\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Configuration settings list]\n* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]"
-}
\ No newline at end of file
+}
index 911c3c2..4d2bbbf 100644 (file)
@@ -5,19 +5,20 @@
             "Jim-by",
             "Wizardist",
             "Zedlik",
-            "아라"
+            "아라",
+            "Red Winged Duck"
         ]
     },
     "config-desc": "Праграма ўсталяваньня MediaWiki",
     "config-title": "Усталяваньне MediaWiki $1",
     "config-information": "Інфармацыя",
-    "config-localsettings-upgrade": "Ð\92Ñ\8bÑ\8fÑ\9eленÑ\8b Ñ\84айл <code>LocalSettings.php</code>.\nÐ\9aаб Ð°Ð±Ð½Ð°Ð²Ñ\96Ñ\86Ñ\8c Ð³Ñ\8dÑ\82ае Ñ\83сталяваньне, калі ласка, увядзіце значэньне <code>$wgUpgradeKey</code> у полі ніжэй.\nЯго можна знайсьці ў <code>LocalSettings.php</code>.",
+    "config-localsettings-upgrade": "Ð\92Ñ\8bÑ\8fÑ\9eленÑ\8b Ñ\84айл <code>LocalSettings.php</code>.\nÐ\9aаб Ð°Ð±Ð½Ð°Ð²Ñ\96Ñ\86Ñ\8c Ð³Ñ\8dÑ\82ае Ñ\9eсталяваньне, калі ласка, увядзіце значэньне <code>$wgUpgradeKey</code> у полі ніжэй.\nЯго можна знайсьці ў <code>LocalSettings.php</code>.",
     "config-localsettings-cli-upgrade": "Быў знойдзены файл <code>LocalSettings.php</code>.\nКаб зьмяніць гэтае ўсталяваньне, калі ласка, запусьціце <code>update.php</code>",
     "config-localsettings-key": "Ключ паляпшэньня:",
-    "config-localsettings-badkey": "Пададзены Вамі ключ зьяўляецца няслушным",
-    "config-upgrade-key-missing": "Ð\92Ñ\8bÑ\8fÑ\9eленае Ñ\96Ñ\81нÑ\83Ñ\8eÑ\87ае Ñ\9eÑ\81Ñ\82алÑ\8fванÑ\8cне MediaWiki.\nКаб абнавіць гэтае ўсталяваньне, калі ласка, устаўце наступны радок у канец Вашага <code>LocalSettings.php</code>:\n\n$1",
-    "config-localsettings-incomplete": "Выглядае, што існуючы <code>LocalSettings.php</code> зьяўляецца няпоўным.\nНе ўстаноўленая пераменная $1.\nКалі ласка, зьмяніце <code>LocalSettings.php</code> так, каб была ўстаноўленая гэтая пераменная, і націсьніце «{{int:Config-continue}}».",
-    "config-localsettings-connection-error": "Адбылася памылка падчас злучэньня з базай зьвестак з выкарыстаньнем наладаў, пазначаных у <code>LocalSettings.php</code> ці <code>AdminSettings.php</code>. Калі ласка, выпраўце гэтыя налады і паспрабуйце зноў.\n\n$1",
+    "config-localsettings-badkey": "Пададзены Вамі ключ зьяўляецца няслушным.",
+    "config-upgrade-key-missing": "Ð\97нойдзена Ñ\9eÑ\81Ñ\82алÑ\8fванаÑ\8f MediaWiki.\nКаб абнавіць гэтае ўсталяваньне, калі ласка, устаўце наступны радок у канец Вашага <code>LocalSettings.php</code>:\n\n$1",
+    "config-localsettings-incomplete": "Выглядае, што актуальны <code>LocalSettings.php</code> зьяўляецца няпоўным.\nНе зададзеная зьменная $1.\nКалі ласка, зьмяніце <code>LocalSettings.php</code> так, каб прысутнічала гэтая зьменная, і націсьніце «{{int:Config-continue}}».",
+    "config-localsettings-connection-error": "Адбылася памылка падчас злучэньня з базай зьвестак з выкарыстаньнем наладаў, пазначаных у <code>LocalSettings.php</code>. Калі ласка, выпраўце гэтыя налады і паспрабуйце яшчэ раз.\n\n$1",
     "config-session-error": "Памылка стварэньня сэсіі: $1",
     "config-session-expired": "Скончыўся тэрмін дзеяньня зьвестак сэсіі.\nСэсія мае абмежаваны тэрмін у $1.\nВы можаце павялічыць яго, зьмяніўшы парамэтар <code>session.gc_maxlifetime</code> у php.ini.\nПеразапусьціце праграму ўсталяваньня.",
     "config-no-session": "Зьвесткі сэсіі згубленыя!\nПраверце php.ini і ўпэўніцеся, што ўстаноўлены слушны шлях у <code>session.save_path</code>.",
@@ -44,7 +45,7 @@
     "config-page-existingwiki": "Існуючая вікі",
     "config-help-restart": "Ці жадаеце выдаліць усе ўведзеныя зьвесткі і пачаць працэс усталяваньня зноў?",
     "config-restart": "Так, пачаць зноў",
-    "config-welcome": "== Ð\9fÑ\80авеÑ\80ка Ð°Ñ\81Ñ\8fÑ\80одзÑ\8cдзÑ\8f ==\nÐ\9fÑ\80авеÑ\80ка Ð¿Ð°Ñ\82Ñ\80Ñ\8dбнаÑ\8f Ð´Ð»Ñ\8f Ð·Ð°Ð¿Ñ\8dÑ\9eнÑ\96ванÑ\8cнÑ\8f, Ñ\88Ñ\82о Ð³Ñ\8dÑ\82ае Ð°Ñ\81Ñ\8fÑ\80одзÑ\8cдзе Ñ\81лÑ\83Ñ\88нае Ð´Ð»Ñ\8f Ñ\9eÑ\81Ñ\82алÑ\8fванÑ\8cнÑ\8f MediaWiki.\nÐ\92ам Ð¿Ð°Ñ\82Ñ\80Ñ\8dбна Ð±Ñ\83дзе Ð¿Ð°Ð´Ð°Ñ\86Ñ\8c Ñ\83Ñ\81е Ð²Ñ\8bнÑ\96кÑ\96 Ð¿Ñ\80авеÑ\80кÑ\96, ÐºÐ°Ð»Ñ\96 Ñ\81паÑ\82Ñ\80Ñ\8dбÑ\96Ñ\86Ñ\86а Ð´Ð°Ð¿Ð°Ð¼Ð¾Ð³Ð° Ð¿Ð°Ð´Ñ\87аÑ\81 Ñ\83сталяваньня.",
+    "config-welcome": "== Ð\9fÑ\80авеÑ\80ка Ð°Ñ\81Ñ\8fÑ\80одзÑ\8cдзÑ\8f ==\nÐ\97аÑ\80аз Ð±Ñ\83дÑ\83Ñ\86Ñ\8c Ð¿Ñ\80аведзенÑ\8bÑ\8f Ð¿Ñ\80авеÑ\80кÑ\96 Ð´Ð»Ñ\8f Ð·Ð°Ð¿Ñ\8dÑ\9eнÑ\96ванÑ\8cнÑ\8f, Ñ\88Ñ\82о Ð³Ñ\8dÑ\82ае Ð°Ñ\81Ñ\8fÑ\80одзÑ\8cдзе Ð°Ð´Ð¿Ð°Ð²ÐµÐ´Ð½Ð°Ðµ Ð´Ð»Ñ\8f Ñ\9eÑ\81Ñ\82алÑ\8fванÑ\8cнÑ\8f MediaWiki.\nÐ\9dе Ð·Ð°Ð±Ñ\83дзÑ\8cÑ\86е Ð´Ð°Ð»Ñ\83Ñ\87Ñ\8bÑ\86Ñ\8c Ð³Ñ\8dÑ\82Ñ\83Ñ\8e Ñ\96нÑ\84аÑ\80маÑ\86Ñ\8bÑ\8e, ÐºÐ°Ð»Ñ\96 Ð²Ð°Ð¼ Ñ\81паÑ\82Ñ\80Ñ\8dбÑ\96Ñ\86Ñ\86а Ð´Ð°Ð¿Ð°Ð¼Ð¾Ð³Ð° Ð´Ð»Ñ\8f Ð·Ð°Ð²Ñ\8fÑ\80Ñ\88Ñ\8dнÑ\8cнÑ\8f Ñ\9eсталяваньня.",
     "config-copyright": "== Аўтарскае права і ўмовы ==\n\n$1\n\nThis program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.\n\nThis program is distributed in the hope that it will be useful, but '''without any warranty'''; without even the implied warranty of '''merchantability''' or '''fitness for a particular purpose'''.\nSee the GNU General Public License for more details.\n\nYou should have received <doclink href=Copying>a copy of the GNU General Public License</doclink> along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. or [http://www.gnu.org/copyleft/gpl.html read it online].",
     "config-sidebar": "* [//www.mediawiki.org Хатняя старонка MediaWiki]\n* [//www.mediawiki.org/wiki/Help:Contents Даведка для ўдзельнікаў]\n* [//www.mediawiki.org/wiki/Manual:Contents Даведка для адміністратараў]\n* [//www.mediawiki.org/wiki/Manual:FAQ Адказы на частыя пытаньні]\n----\n* <doclink href=Readme>Прачытайце</doclink>\n* <doclink href=ReleaseNotes>Паляпшэньні ў вэрсіі</doclink>\n* <doclink href=Copying>Капіяваньне</doclink>\n* <doclink href=UpgradeDoc>Абнаўленьне</doclink>",
     "config-env-good": "Асяродзьдзе было праверанае.\nВы можаце ўсталёўваць MediaWiki.",
     "config-unicode-using-intl": "Выкарыстоўваецца [http://pecl.php.net/intl intl пашырэньне з PECL] для Unicode-нармалізацыі",
     "config-unicode-pure-php-warning": "'''Папярэджаньне''': [http://pecl.php.net/intl Пашырэньне intl з PECL] — ня слушнае для Unicode-нармалізацыі, цяпер выкарыстоўваецца марудная PHP-рэалізацыя.\nКалі ў Вас сайт з высокай наведваемасьцю, раім пачытаць пра [//www.mediawiki.org/wiki/Unicode_normalization_considerations Unicode-нармалізацыю].",
     "config-unicode-update-warning": "'''Папярэджаньне''': усталяваная вэрсія бібліятэкі для Unicode-нармалізацыі выкарыстоўвае састарэлую вэрсію бібліятэкі з [http://site.icu-project.org/ праекту ICU].\nРаім [//www.mediawiki.org/wiki/Unicode_normalization_considerations абнавіць], калі ваш сайт будзе працаваць зь Unicode.",
-    "config-no-db": "Немагчыма знайсьці адпаведны драйвэр базы зьвестак. Вам неабходна ўсталяваць драйвэр базы зьвестак для PHP.\nПадтрымліваюцца наступныя тыпы базаў зьвестак: $1.\n\nКалі вы выкарыстоўваеце агульны хостынг, запытайцеся ў свайго хостынг-правайдэра наконт усталяваньня патрабуемага драйвэру базы зьвестак.\nКалі Вы кампілявалі PHP самастойна, пераканфігуруйце і сабярыце яго з дазволеным кліентам базаў зьвестак, напрыклад, <code>./configure --with-mysql</code>.\nКалі Вы ўсталёўвалі PHP з пакетаў Debian ці Ubuntu, то Вам трэба ўсталяваць дадаткова модуль <code>php5-mysql</code>.",
+    "config-no-db": "Немагчыма знайсьці адпаведны драйвэр базы зьвестак. Вам неабходна ўсталяваць драйвэр базы зьвестак для PHP.\nПадтрымліваюцца наступныя тыпы базаў зьвестак: $1.\n\nКалі вы скампілявалі PHP самастойна, зьмяніце канфігурацыю, каб уключыць кліента базы зьвестак, напрыклад, з дапамогай <code>./configure --with-mysqli</code>.\nКалі вы ўсталявалі PHP з пакунку Debian або Ubuntu, тады вам трэба таксама ўсталяваць, напрыклад, пакунак <code>php5-mysql</code>.",
     "config-outdated-sqlite": "'''Папярэджаньне''': усталяваны SQLite $1, у той час, калі мінімальная сумяшчальная вэрсія — $2. SQLite ня будзе даступны.",
     "config-no-fts3": "'''Папярэджаньне''': SQLite створаны без модуля [//sqlite.org/fts3.html FTS3], для гэтага ўнутранага інтэрфэйсу ня будзе даступная магчымасьць пошуку.",
     "config-register-globals": "'''Папярэджаньне: уключаная опцыя PHP <code>[http://php.net/register_globals register_globals]</code>.'''\n'''Адключыце яе, калі можаце.'''\nMediaWiki будзе працаваць, але гэта панізіць узровень бясьпекі сэрвэра.",
     "config-magic-quotes-runtime": "'''Фатальная памылка: уключаная опцыя PHP [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-runtime magic_quotes_runtime]!'''\nГэтая опцыя псуе ўводны паток зьвестак непрадказальным чынам.\nПрацяг усталяваньня альбо выкарыстаньне MediaWiki без адключэньня гэтай опцыі немагчымыя.",
     "config-magic-quotes-sybase": "'''Фатальная памылка: рэжым [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-sybase magic_quotes_sybase] уключаны!'''\nГэты рэжым шкодзіць уваходныя зьвесткі непрадказальным чынам.\nПрацяг усталяваньня альбо выкарыстаньне MediaWiki немагчымыя, пакуль рэжым ня будзе выключаны.",
     "config-mbstring": "'''Фатальная памылка: рэжым [http://www.php.net/manual/en/ref.info.php#mbstring.overload mbstring.func_overload] уключаны!'''\nГэты рэжым выклікае памылкі і можа шкодзіць зьвесткі непрадказальным чынам.\nПрацяг усталяваньня альбо выкарыстаньне MediaWiki немагчымыя, пакуль рэжым ня будзе выключаны.",
-    "config-ze1": "'''Фатальная памылка: рэжым [http://www.php.net/manual/en/ini.core.php zend.ze1_compatibility_mode] уключаны!'''\nГэтая рэжым стварае вялікія праблемы ў працы MediaWiki.\nПрацяг усталяваньня альбо выкарыстаньне MediaWiki немагчымыя, пакуль рэжым ня будзе выключаны.",
     "config-safe-mode": "'''Папярэджаньне:''' [http://www.php.net/features.safe-mode бясьпечны рэжым] PHP уключаны.\nГэта можа выклікаць праблемы, галоўным чынам падчас загрузак файлаў і ў падтрымцы <code>math</code>.",
     "config-xml-bad": "Ня знойдзены модуль XML для PHP.\nMediaWiki патрэбныя функцыі з гэтага модулю, таму MediaWiki ня будзе працаваць у гэтай канфігурацыі.\nКалі Вы выкарыстоўваеце Mandrake, усталюйце пакет php-xml.",
-    "config-pcre": "Ня знойдзены модуль падтрымкі PCRE.\nMediaWiki для працы патрабуюцца функцыі рэгулярных выразаў у стылі Perl.",
+    "config-pcre-old": "<strong>Крытычная памылка:</strong> патрэбны PCRE вэрсіі $1 або пазьнейшай.\nPHP-файл, які выконваецца, зьвязаны з PCRE вэрсіі $2.\n[https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/PCRE Больш інфармацыі].",
     "config-pcre-no-utf8": "'''Фатальная памылка''': модуль PCRE для PHP скампіляваны без падтрымкі PCRE_UTF8.\nMediaWiki патрабуе падтрымкі UTF-8 для слушнай працы.",
     "config-memory-raised": "Абмежаваньне на даступную для PHP памяць <code>memory_limit</code> было падвышанае з $1 да $2.",
     "config-memory-bad": "'''Папярэджаньне:''' памер PHP <code>memory_limit</code> складае $1.\nВерагодна, гэта вельмі мала.\nУсталяваньне можа быць няўдалым!",
     "config-ctype": "'''Фатальная памылка''': PHP мусіць быць скампіляваны з падтрымкай [http://www.php.net/manual/en/ctype.installation.php пашырэньня Ctype].",
+    "config-json": "<strong>Крытычная памылка:</strong> PHP быў скампіляваны без падтрымкі JSON.\nВы павінныя ўсталяваць або пашырэньне PHP JSON, або пашырэньне [http://pecl.php.net/package/jsonc PECL jsonc] перад усталёўкай MediaWiki.\n* Пашырэньне PHP уваходзіць у Red Hat Enterprise Linux (CentOS) 5 і 6, пры гэтым павінна быць падключана ў <code>/etc/php.ini</code> або <code>/etc/php.d/json.ini</code>.\n* Некаторыя дыстрыбутывы Linux, выдадзеныя пасьля траўня 2013 году, ня маюць пашырэньня PHP, замест яго пакуюць пашырэньне PECL як <code>php5-json</code> або <code>php-pecl-jsonc</code>.",
     "config-xcache": "[http://xcache.lighttpd.net/ XCache] усталяваны",
     "config-apc": "[http://www.php.net/apc APC] усталяваны",
     "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache] усталяваны",
     "config-gd": "GD падтрымліваецца ўбудавана.\nПасьля ўключэньня загрузак будзе ўключанае маштабаваньне выяваў.",
     "config-no-scaling": "Ні GD, ні ImageMagick ня знойдзеныя.\nМаштабаваньне выяваў будзе адключанае.",
     "config-no-uri": "'''Памылка:''' Не магчыма вызначыць цяперашні URI.\nУсталяваньне спыненае.",
-    "config-no-cli-uri": "'''Папярэджаньне''': Не пазначаны --scriptpath, па змоўчваньні выкарыстоўваецца: <code>$1</code>.",
+    "config-no-cli-uri": "'''Папярэджаньне''': Не пазначаны <code>--scriptpath</code>, па змоўчваньні выкарыстоўваецца: <code>$1</code>.",
     "config-using-server": "Выкарыстоўваецца назва сэрвэра «<nowiki>$1</nowiki>».",
     "config-using-uri": "Выкарыстоўваецца URL-спасылка сэрвэра «<nowiki>$1$2</nowiki>».",
     "config-uploads-not-safe": "'''Папярэджаньне:''' дырэкторыя для загрузак па змоўчваньні <code>$1</code> уразьлівая да выкананьня адвольнага коду.\nХоць MediaWiki і правярае ўсе файлы перад захаваньнем, вельмі рэкамэндуецца [//www.mediawiki.org/wiki/Manual:Security#Upload_security закрыць гэтую ўразьлівасьць] перад уключэньнем магчымасьці загрузкі файлаў.",
     "config-no-cli-uploads-check": "'''Папярэджаньне:''' Вашая дырэкторыя для загрузак па змоўчваньні (<code>$1</code>), не правераная на ўразьлівасьць да выкананьня адвольных скрыптоў падчас усталяваньня CLI.\n.",
-    "config-brokenlibxml": "У Вашай сыстэме ўсталяваныя PHP і libxml2 зь несумяшчальнымі вэрсіямі, што можа прывесьці да пашкоджаньня зьвестак MediaWiki і іншых ўэб-дастасаваньняў.\nАбнавіце PHP да вэрсіі 5.2.9 ці болей позьняй, а libxml2 да 2.7.3 ці болей позьняй ([//bugs.php.net/bug.php?id=45996 паведамленьне пра памылку на сайце PHP]).\nУсталяваньне перарванае.",
-    "config-using531": "PHP $1 не сумяшчальнае з MediaWiki з-за памылкі ў перадачы парамэтраў па ўказальніку да <code>__call()</code>.\nАбнавіце PHP да вэрсіі 5.3.2 ці болей позьняй, ці адкаціце да вэрсіі 5.3.0 каб гэта выправіць.\nУсталяваньне перарванае.",
-    "config-suhosin-max-value-length": "Suhosin усталяваны і абмяжоўвае <code>даўжыню</code> парамэтра GET да $1 {{PLURAL:$1|байта|байтаў}}.\nResourceLoader, складнік MediaWiki, будзе абходзіць гэтае абмежаваньне, што, адаб’ецца на прадукцыйнасьці.\nКалі магчыма, варта ўсталяваць у <code>php.ini</code> <code>suhosin.get.max_value_length</code> роўным 1024 ці больш, а таксама вызначыць тое ж значэньне для <code>$wgResourceLoaderMaxQueryLength</code> у LocalSettings.php.",
+    "config-brokenlibxml": "У Вашай сыстэме ўсталяваныя PHP і libxml2 зь несумяшчальнымі вэрсіямі, што можа прывесьці да пашкоджаньня зьвестак MediaWiki і іншых вэб-дастасаваньняў.\nАбнавіце libxml2 да вэрсіі 2.7.3 ці больш позьняй ([https://bugs.php.net/bug.php?id=45996 паведамленьне пра памылку на сайце PHP]).\nУсталяваньне перарванае.",
+    "config-suhosin-max-value-length": "Suhosin усталяваны і абмяжоўвае <code>даўжыню</code> парамэтру GET да $1 {{PLURAL:$1|1=байта|байтаў}}.\nResourceLoader, складнік MediaWiki, будзе абходзіць гэтае абмежаваньне, што адаб’ецца на прадукцыйнасьці.\nКалі магчыма, варта ўсталяваць у <code>php.ini</code> значэньне <code>suhosin.get.max_value_length</code> роўным 1024 ці больш, а таксама вызначыць тое ж значэньне для <code>$wgResourceLoaderMaxQueryLength</code> у <code>LocalSettings.php</code>.",
     "config-db-type": "Тып базы зьвестак:",
     "config-db-host": "Хост базы зьвестак:",
     "config-db-host-help": "Калі сэрвэр Вашай базы зьвестак знаходзіцца на іншым сэрвэры, увядзіце тут імя хоста ці IP-адрас.\n\nКалі Вы карыстаецеся shared-хостынгам, Ваш хостынг-правайдэр мусіць даць Вам слушнае імя хоста базы зьвестак у сваёй дакумэнтацыі.\n\nКалі Вы усталёўваеце сэрвэр Windows з выкарыстаньнем MySQL, выкарыстаньне «localhost» можа не працаваць для назвы сэрвэра. У гэтым выпадку паспрабуйце пазначыць «127.0.0.1»  для лякальнага IP-адраса.\n\nКалі Вы выкарыстоўваеце PostgreSQL, пакіньце поле пустым, каб далучыцца праз Unix-сокет.",
     "config-db-username": "Імя карыстальніка базы зьвестак:",
     "config-db-password": "Пароль базы зьвестак:",
     "config-db-password-empty": "Калі ласка, увядзіце пароль для новага карыстальніка базы зьвестак: $1.\nМагчыма стварыць карыстальніка без паролю, але гэта небясьпечна.",
+    "config-db-username-empty": "Вы мусіце ўвесьці значэньне парамэтру «{{int:config-db-username}}»",
     "config-db-install-username": "Увядзіце імя карыстальніка, якое будзе выкарыстоўвацца для злучэньня з базай зьвестак падчас усталяваньня. Гэта не назва рахунку MediaWiki; гэта імя карыстальніка Вашай базы зьвестак.",
     "config-db-install-password": "Увядзіце пароль, які будзе выкарыстоўвацца для злучэньня з базай зьвестак падчас усталяваньня. Гэта не пароль рахунку MediaWiki; гэта пароль Вашай базы зьвестак.",
     "config-db-install-help": "Увядзіце імя карыстальніка і пароль, якія будуць выкарыстаныя для далучэньня да базы зьвестак падчас працэсу ўсталяваньня.",
     "config-sqlite-dir-help": "SQLite захоўвае ўсе зьвесткі ў адзіным файле.\n\nПададзеная Вамі дырэкторыя павінна быць даступнай да запісу вэб-сэрвэрам падчас усталяваньня.\n\nЯна '''ня''' мусіць быць даступнай праз Сеціва, вось чаму мы не захоўваем яе ў адным месцы з файламі PHP.\n\nПраграма ўсталяваньня дадаткова створыць файл <code>.htaccess</code>, але калі ён не выкарыстоўваецца, хто заўгодна зможа атрымаць зьвесткі з базы зьвестак.\nГэта ўключае як прыватныя зьвесткі ўдзельнікаў (адрасы электроннай пошты, хэшы пароляў), гэтак і выдаленыя вэрсіі старонак і іншыя зьвесткі, доступ да якіх маецца абмежаваны.\n\nПадумайце над тым, каб зьмяшчаць базу зьвестак у іншым месцы, напрыклад у <code>/var/lib/mediawiki/yourwiki</code>.",
     "config-oracle-def-ts": "Прастора табліцаў па змоўчваньні:",
     "config-oracle-temp-ts": "Часовая прастора табліцаў:",
-    "config-type-mysql": "MySQL",
+    "config-type-mysql": "MySQL (або сумяшчальная)",
     "config-type-postgres": "PostgreSQL",
     "config-type-sqlite": "SQLite",
     "config-type-oracle": "Oracle",
+    "config-type-mssql": "Microsoft SQL Server",
     "config-support-info": "MediaWiki падтрымлівае наступныя сыстэмы базаў зьвестак:\n\n$1\n\nКалі Вы ня бачыце сыстэму базаў зьвестак, якую Вы спрабуеце выкарыстоўваць ў сьпісе ніжэй, перайдзіце па спасылцы інструкцыі, якая знаходзіцца ніжэй, каб уключыць падтрымку.",
-    "config-support-mysql": "* $1 зьяўляецца галоўнай мэтай MediaWiki і падтрымліваецца лепей за ўсё ([http://www.php.net/manual/en/mysql.installation.php як кампіляваць PHP з падтрымкай MySQL])",
-    "config-support-postgres": "* $1 — вядомая сыстэма базы зьвестак з адкрытым кодам, якая зьяўляецца альтэрнатывай MySQL ([http://www.php.net/manual/en/pgsql.installation.php як кампіляваць PHP з падтрымкай PostgreSQL]). Яна можа ўтрымліваць дробныя памылкі, і не рэкамэндуецца выкарыстоўваць яе для працуючых праектаў.",
-    "config-support-sqlite": "* $1 — невялікая сыстэма базы зьвестак, якая мае вельмі добрую падтрымку. ([http://www.php.net/manual/en/pdo.installation.php як кампіляваць PHP з падтрымкай SQLite], выкарыстоўвае PDO)",
-    "config-support-oracle": "* $1 зьяўляецца камэрцыйнай прафэсійнай базай зьвестак. ([http://www.php.net/manual/en/oci8.installation.php Як скампіляваць PHP з падтрымкай OCI8])",
+    "config-dbsupport-mysql": "* [{{int:version-db-mysql-url}} MySQL] зьяўляецца галоўнай мэтай MediaWiki і падтрымліваецца лепей за ўсё. MediaWiki таксама працуе з [{{int:version-db-mariadb-url}} MariaDB] і [{{int:version-db-percona-url}} Percona Server], якія сумяшчальныя з MySQL. ([http://www.php.net/manual/en/mysqli.installation.php Як скампіляваць PHP з падтрымкай MySQL])",
+    "config-dbsupport-postgres": "* [{{int:version-db-postgres-url}} PostgreSQL] — папулярная сыстэма базы зьвестак з адкрытым кодам, якая зьяўляецца альтэрнатывай MySQL. Яна можа ўтрымліваць дробныя памылкі, і не рэкамэндуецца выкарыстоўваць яе для працуючых праектаў. ([http://www.php.net/manual/en/pgsql.installation.php Як кампіляваць PHP з падтрымкай PostgreSQL])",
+    "config-dbsupport-sqlite": "* [{{int:version-db-sqlite-url}} SQLite] — невялікая сыстэма базы зьвестак, якая мае вельмі добрую падтрымку. ([http://www.php.net/manual/en/pdo.installation.php Як кампіляваць PHP з падтрымкай SQLite], выкарыстоўвае PDO)",
+    "config-dbsupport-oracle": "* [{{int:version-db-oracle-url}} Oracle] зьяўляецца камэрцыйнай прафэсійнай базай зьвестак. ([http://www.php.net/manual/en/oci8.installation.php Як скампіляваць PHP з падтрымкай OCI8])",
+    "config-dbsupport-mssql": "* [{{int:version-db-mssql-url}} Microsoft SQL Server] — камэрцыйная база зьвестак для Windows. ([http://www.php.net/manual/en/sqlsrv.installation.php Як скампіляваць PHP з падтрымкай SQLSRV])",
     "config-header-mysql": "Налады MySQL",
     "config-header-postgres": "Налады PostgreSQL",
     "config-header-sqlite": "Налады SQLite",
     "config-header-oracle": "Налады Oracle",
+    "config-header-mssql": "Налады Microsoft SQL Server",
     "config-invalid-db-type": "Няслушны тып базы зьвестак",
-    "config-missing-db-name": "Ð\92Ñ\8b Ð¿Ð°Ð²Ñ\96ннÑ\8b Ñ\9eвеÑ\81Ñ\8cÑ\86Ñ\96 Ð·Ð½Ð°Ñ\87Ñ\8dнÑ\8cне Ð¿Ð°Ñ\80амÑ\8dÑ\82Ñ\80Ñ\83 Â«Ð\86мÑ\8f Ð±Ð°Ð·Ñ\8b Ð·Ñ\8cвеÑ\81Ñ\82ак»",
-    "config-missing-db-host": "Ð\92Ñ\8b Ð¿Ð°Ð²Ñ\96ннÑ\8b Ñ\9eвеÑ\81Ñ\8cÑ\86Ñ\96 Ð·Ð½Ð°Ñ\87Ñ\8dнÑ\8cне Ð¿Ð°Ñ\80амÑ\8dÑ\82Ñ\80Ñ\83 Â«Ð¥Ð¾Ñ\81Ñ\82 Ð±Ð°Ð·Ñ\8b Ð·Ñ\8cвеÑ\81Ñ\82ак»",
-    "config-missing-db-server-oracle": "Ð\92Ñ\8b Ð¿Ð°Ð²Ñ\96ннÑ\8b Ñ\9eвеÑ\81Ñ\8cÑ\86Ñ\96 Ð·Ð½Ð°Ñ\87Ñ\8dнÑ\8cне Ð¿Ð°Ñ\80амÑ\8dÑ\82Ñ\80Ñ\83 Â«TNS Ð±Ð°Ð·Ñ\8b Ð·Ñ\8cвеÑ\81Ñ\82ак»",
-    "config-invalid-db-server-oracle": "Ð\9dÑ\8fÑ\81лÑ\83Ñ\88нае TNS Ð±Ð°Ð·Ñ\8b Ð·Ñ\8cвеÑ\81Ñ\82ак Â«$1».\nÐ\9dазва Ð¼Ð¾Ð¶Ð° Ñ\9eÑ\82Ñ\80Ñ\8bмлÑ\96ваÑ\86Ñ\8c Ñ\82олÑ\8cкÑ\96 ASCII-лÑ\96Ñ\82аÑ\80Ñ\8b (a-z, A-Z), Ð»Ñ\96Ñ\87бÑ\8b (0-9), Ñ\81Ñ\8bмбалÑ\96 Ð¿Ð°Ð´ÐºÑ\80Ñ\8dÑ\81Ñ\8cлÑ\96ванÑ\8cнÑ\8f(_) Ñ\96 ÐºÑ\80опкÑ\96 (.).",
+    "config-missing-db-name": "Ð\92Ñ\8b Ð¼Ñ\83Ñ\81Ñ\96Ñ\86е Ñ\9eвеÑ\81Ñ\8cÑ\86Ñ\96 Ð·Ð½Ð°Ñ\87Ñ\8dнÑ\8cне Ð¿Ð°Ñ\80амÑ\8dÑ\82Ñ\80Ñ\83 Â«{{int:config-db-name}}».",
+    "config-missing-db-host": "Ð\92Ñ\8b Ð¼Ñ\83Ñ\81Ñ\96Ñ\86е Ñ\9eвеÑ\81Ñ\8cÑ\86Ñ\96 Ð·Ð½Ð°Ñ\87Ñ\8dнÑ\8cне Ð¿Ð°Ñ\80амÑ\8dÑ\82Ñ\80Ñ\83 Â«{{int:config-db-host}}».",
+    "config-missing-db-server-oracle": "Ð\92Ñ\8b Ð¼Ñ\83Ñ\81Ñ\96Ñ\86е Ñ\9eвеÑ\81Ñ\8cÑ\86Ñ\96 Ð·Ð½Ð°Ñ\87Ñ\8dнÑ\8cне Ð¿Ð°Ñ\80амÑ\8dÑ\82Ñ\80Ñ\83 Â«{{int:config-db-host-oracle}}».",
+    "config-invalid-db-server-oracle": "Ð\9dÑ\8fÑ\81лÑ\83Ñ\88нае TNS Ð±Ð°Ð·Ñ\8b Ð·Ñ\8cвеÑ\81Ñ\82ак Â«$1».\nÐ\92Ñ\8bкаÑ\80Ñ\8bÑ\81Ñ\82оÑ\9eвайÑ\86е Ð°Ð±Ð¾ Â«TNS Name», Ð°Ð±Ð¾ Ñ\80адок Â«Easy Connect» ([http://docs.oracle.com/cd/E11882_01/network.112/e10836/naming.htm Ð\9cÑ\8dÑ\82адÑ\8b Ð½Ð°Ð¹Ð¼ÐµÐ½Ñ\8cнÑ\8f Oracle])",
     "config-invalid-db-name": "Няслушная назва базы зьвестак «$1».\nНазва можа ўтрымліваць толькі ASCII-літары (a-z, A-Z), лічбы (0-9), сымбалі падкрэсьліваньня(_) і працяжнікі (-).",
     "config-invalid-db-prefix": "Няслушны прэфікс базы зьвестак «$1».\nЁн можа зьмяшчаць толькі ASCII-літары (a-z, A-Z), лічбы (0-9), сымбалі падкрэсьліваньня (_) і працяжнікі (-).",
     "config-connection-error": "$1.\n\nПраверце хост, імя карыстальніка і пароль ніжэй і паспрабуйце зноў.",
     "config-db-sys-create-oracle": "Праграма ўсталяваньня падтрымлівае толькі выкарыстаньне рахунку SYSDBA для стварэньня новага рахунку.",
     "config-db-sys-user-exists-oracle": "Рахунак карыстальніка «$1» ужо існуе. SYSDBA можа выкарыстоўвацца толькі для стварэньня новых рахункаў!",
     "config-postgres-old": "Патрабуецца PostgreSQL $1 ці навейшая, усталяваная вэрсія $2.",
+    "config-mssql-old": "Патрабуецца Microsoft SQL Server вэрсіі $1 ці больш позьняй. У вас усталяваная вэрсія $2.",
     "config-sqlite-name-help": "Выберыце назву, якая будзе ідэнтыфікаваць Вашую вікі.\nНе выкарыстоўвайце прагалы ці злучкі.\nНазва будзе выкарыстоўвацца ў назьве файла зьвестак SQLite.",
     "config-sqlite-parent-unwritable-group": "Немагчыма стварыць дырэкторыю зьвестак <code><nowiki>$1</nowiki></code>, таму што бацькоўская дырэкторыя <code><nowiki>$2</nowiki></code> абароненая ад запісаў вэб-сэрвэра.\n\nПраграма ўсталяваньня вызначыла карыстальніка, які запусьціў вэб-сэрвэр.\nДазвольце запісы ў дырэкторыю <code><nowiki>$3</nowiki></code> для працягу.\nУ сыстэме Unix/Linux зрабіце:\n\n<pre>cd $2\nmkdir $3\nchgrp $4 $3\nchmod g+w $3</pre>",
     "config-sqlite-parent-unwritable-nogroup": "Немагчыма стварыць дырэкторыю зьвестак <code><nowiki>$1</nowiki></code>, таму што бацькоўская дырэкторыя <code><nowiki>$2</nowiki></code> абароненая ад запісаў вэб-сэрвэра.\n\nПраграма ўсталяваньня вызначыла карыстальніка, які запусьціў вэб-сэрвэр.\nДазвольце яму (і іншым) запісы ў дырэкторыю <code><nowiki>$3</nowiki></code> для працягу.\nУ сыстэме Unix/Linux зрабіце:\n\n<pre>cd $2\nmkdir $3\nchmod a+w $3</pre>",
     "config-mysql-innodb": "InnoDB",
     "config-mysql-myisam": "MyISAM",
     "config-mysql-myisam-dep": "'''Папярэджаньне''': Вы выбралі MyISAM у якасьці рухавіка для захоўваньня зьвестак у MySQL, які не рэкамэндуецца да выкарыстаньня з MediaWiki па прычынах:\n* кепская падтрымка паралельнай апрацоўкі з-за таблічных блякаваньняў;\n* большая імавернасьць пашкоджаньня зьвестак у параўнаньні зь іншымі рухавікамі;\n* код MediaWiki не ва ўсіх выпадках улічвае асаблівасьці MyISAM.\n\nКалі Ваш MySQL-сэрвэр падтрымлівае InnoDB, вельмі рэкамэндуецца выкарыстаньне менавіта гэтага рухавіка.\nКалі MySQL-сэрвэр не падтрымлівае InnoDB, пэўна, настаў час абнавіць яго.",
+    "config-mysql-only-myisam-dep": "<strong>Папярэджаньне:</strong> MyISAM — адзіная даступная сыстэма захоўваньня зьвестак для MySQL на гэтым кампутары, яна не рэкамэндуецца для ўжываньня з MediaWiki, таму што:\n* слаба падтрымлівае паралельнасьць праз блякаваньне табліцаў\n* больш за іншыя сыстэмы схільная да пашкоджаньняў\n* кодавая база MediaWiki не заўсёды належна апрацоўвае MyISAM\n\nВашае ўсталяваньне MySQL не падтрымлівае InnoDB, магчыма, час для абнаўленьня.",
     "config-mysql-engine-help": "'''InnoDB''' — звычайна найбольш слушны варыянт, таму што добра падтрымлівае паралелізм.\n\n'''MyISAM''' можа быць хутчэйшай у вікі з адным удзельнікам, ці толькі для чытаньня.\nБазы зьвестак на MyISAM вядомыя тым, што ў іх зьвесткі шкодзяцца нашмат часьцей за InnoDB.",
     "config-mysql-charset": "Кадаваньне базы зьвестак:",
     "config-mysql-binary": "Двайковае",
     "config-mysql-utf8": "UTF-8",
     "config-mysql-charset-help": "У '''двайковым рэжыме''', MediaWiki захоўвае тэкст у кадаваньні UTF-8 у базе зьвестак у двайковых палях.\nГэта болей эфэктыўна за рэжым MySQL UTF-8, і дазваляе Вам выкарыстоўваць увесь дыяпазон сымбаляў Unicode.\n\nУ '''рэжыме UTF-8''', MySQL ведае, якая табліцы сымбаляў выкарыстоўваецца ў Вашых зьвестках, і можа адпаведна прадстаўляць і канвэртаваць іх, але гэта не дазволіць Вам захоўваць сымбалі па-за межамі [//en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes Базавага шматмоўнага дыяпазону].",
+    "config-mssql-auth": "Тып аўтэнтыфікацыі:",
+    "config-mssql-install-auth": "Абярыце тып аўтэнтыфікацыі, які будзе выкарыстаны для злучэньня з базай зьвестак падчас працэсу ўсталяваньня.\nКалі вы абярэце «{{int:config-mssql-windowsauth}}», будуць выкарыстаныя ўліковыя зьвесткі карыстальніка, пад якім працуе вэб-сэрвэр.",
     "config-site-name": "Назва вікі:",
     "config-site-name-help": "Назва будзе паказвацца ў загалоўку браўзэра і ў некаторых іншых месцах.",
     "config-site-name-blank": "Увядзіце назву сайта.",
     "config-ns-invalid": "Пададзеная няслушная прастора назваў «<nowiki>$1</nowiki>».\nПадайце іншую прастору назваў праекту.",
     "config-ns-conflict": "Пазначаная прастора назваў «<nowiki>$1</nowiki>» канфліктуе з прасторай назваў MediaWiki па змоўчваньні.\nПазначце іншую прастору назваў праекту.",
     "config-admin-box": "Рахунак адміністратара",
-    "config-admin-name": "Вашае імя:",
+    "config-admin-name": "Вашае імя карыстальніка:",
     "config-admin-password": "Пароль:",
     "config-admin-password-confirm": "Пароль яшчэ раз:",
     "config-admin-help": "Увядзіце тут Вашае імя ўдзельніка, напрыклад «Янка Кавалевіч».\nГэтае імя будзе выкарыстоўвацца для ўваходу ў вікі.",
     "config-admin-name-blank": "Увядзіце імя адміністратара.",
     "config-admin-name-invalid": "Пададзенае няслушнае імя ўдзельніка «<nowiki>$1</nowiki>».\nПадайце іншае імя ўдзельніка.",
     "config-admin-password-blank": "Увядзіце пароль рахунку адміністратара.",
-    "config-admin-password-same": "Пароль ня можа быць аднолькавым зь іменем удзельніка.",
     "config-admin-password-mismatch": "Уведзеныя Вамі паролі не супадаюць.",
     "config-admin-email": "Адрас электроннай пошты:",
     "config-admin-email-help": "Увядзіце тут адрас электроннай пошты, каб атрымліваць электронныя лісты ад іншых удзельнікаў вікі, скідваць Ваш пароль і атрымліваць абвешчаньні пра зьмены старонак, якія знаходзяцца ў Вашым сьпісе назіраньня. Вы можаце пакінуць гэтае поле пустым.",
     "config-profile-no-anon": "Патрэбнае стварэньне рахунку",
     "config-profile-fishbowl": "Толькі для аўтарызаваных рэдактараў",
     "config-profile-private": "Прыватная вікі",
-    "config-profile-help": "Вікі працуюць лепей, калі Вы дазваляеце як мага большай колькасьці людзей рэдагаваць яе.\nУ MediaWiki вельмі лёгка праглядаць апошнія зьмены і выпраўляць любыя пашкоджаньні зробленыя недасьведчанымі ўдзельнікамі альбо вандаламі.\n\nТым ня менш, многія лічаць, што MediaWiki можа быць карыснай ў шматлікіх іншых ролях, і часта вельмі нялёгка растлумачыць усім перавагі выкарыстаньня тэхналёгіяў вікі.\nТаму Вы маеце выбар.\n\n'''{{int:config-profile-wiki}}''' дазваляе рэдагаваць усім, нават без уваходу ў сыстэму.\nВікі з '''{{int:config-profile-no-anon}}''' дазваляе дадатковую адказнасьць, але можа адштурхнуць некаторых патэнцыйных удзельнікаў.\n\nСцэнар '''{{int:config-profile-fishbowl}}''' дазваляе рэдагаваць зацьверджаным удзельнікам, але ўсе могуць праглядаць старонкі іх гісторыю.\n'''{{int:config-profile-private}}''' дазваляе праглядаць і рэдагаваць старонкі толькі зацьверджаным удзельнікам.\n\nБольш складаныя правы ўдзельнікаў даступныя пасьля ўсталяваньня, глядзіце [//www.mediawiki.org/wiki/Manual:User_rights адпаведную старонку дакумэнтацыі].",
+    "config-profile-help": "Вікі працуюць лепей, калі Вы дазваляеце як мага большай колькасьці людзей рэдагаваць яе.\nУ MediaWiki вельмі лёгка праглядаць апошнія зьмены і выпраўляць любыя памылкі зробленыя недасьведчанымі ўдзельнікамі альбо вандаламі.\n\nТым ня менш, многія лічаць, што MediaWiki можа быць карыснай у шматлікіх іншых ролях, і часта вельмі нялёгка растлумачыць усім перавагі выкарыстаньня тэхналёгіяў вікі.\nТаму Вы маеце выбар.\n\n<strong>{{int:config-profile-wiki}}</strong> дазваляе рэдагаваць усім, нават без уваходу ў сыстэму.\nВікі з <strong>{{int:config-profile-no-anon}}</strong> дазваляе дадатковую адказнасьць, але можа адштурхнуць некаторых патэнцыйных удзельнікаў.\n\nСцэнар <strong>{{int:config-profile-fishbowl}}</strong> дазваляе рэдагаваць зацьверджаным удзельнікам, але ўсе могуць праглядаць старонкі іх гісторыю.\n<strong>{{int:config-profile-private}}</strong> дазваляе праглядаць і рэдагаваць старонкі толькі зацьверджаным удзельнікам.\n\nБольш складаныя правы ўдзельнікаў даступныя пасьля ўсталяваньня, глядзіце [//www.mediawiki.org/wiki/Manual:User_rights адпаведную старонку дакумэнтацыі].",
     "config-license": "Аўтарскія правы і ліцэнзія:",
     "config-license-none": "Без інфармацыі пра ліцэнзію",
     "config-license-cc-by-sa": "Creative Commons Attribution Share Alike",
     "config-upload-deleted": "Дырэкторыя для выдаленых файлаў:",
     "config-upload-deleted-help": "Выберыце дырэкторыю, у якой будуць захоўвацца выдаленыя файлы.\nУ ідэальным выпадку, яна не павінна мець доступу з Інтэрнэту.",
     "config-logo": "URL-адрас лягатыпу:",
-    "config-logo-help": "Ð\90Ñ\84аÑ\80мленÑ\8cне MediaWiki Ð¿Ð° Ð·Ð¼Ð¾Ñ\9eÑ\87ванÑ\8cнÑ\96 Ñ\83клÑ\8eÑ\87ае Ð¿Ñ\80аÑ\81Ñ\82оÑ\80Ñ\83 Ð´Ð»Ñ\8f Ð»Ñ\8fгаÑ\82Ñ\8bпÑ\83 Ð¿Ð°Ð¼ÐµÑ\80ам 135Ã\97160 Ð¿Ñ\96кÑ\81Ñ\8dлÑ\8fÑ\9e Ñ\83 Ð²ÐµÑ\80Ñ\85нÑ\96м Ð»ÐµÐ²Ñ\8bм ÐºÑ\83Ñ\86е.\nÐ\97агÑ\80Ñ\83зÑ\96Ñ\86е Ð²Ñ\8bÑ\8fвÑ\83 Ð°Ð´Ð¿Ð°Ð²ÐµÐ´Ð½Ð°Ð³Ð° Ð¿Ð°Ð¼ÐµÑ\80Ñ\83 Ñ\96 Ñ\83вÑ\8fдзÑ\96Ñ\86е Ñ\82Ñ\83Ñ\82 URL-адÑ\80аÑ\81.\n\nКалі Вы не жадаеце мець ніякага лягатыпу, пакіньце поле пустым.",
+    "config-logo-help": "Ð\90Ñ\84аÑ\80мленÑ\8cне MediaWiki Ð¿Ð° Ð·Ð¼Ð¾Ñ\9eÑ\87ванÑ\8cнÑ\96 Ñ\9eклÑ\8eÑ\87ае Ð¿Ñ\80аÑ\81Ñ\82оÑ\80Ñ\83 Ð´Ð»Ñ\8f Ð»Ñ\8fгаÑ\82Ñ\8bпÑ\83 Ð¿Ð°Ð¼ÐµÑ\80ам 135Ã\97160 Ð¿Ñ\96кÑ\81Ñ\8dлÑ\8fÑ\9e Ñ\83 Ð²ÐµÑ\80Ñ\85нÑ\96м Ð»ÐµÐ²Ñ\8bм ÐºÑ\83Ñ\86е.\nÐ\97агÑ\80Ñ\83зÑ\96Ñ\86е Ð²Ñ\8bÑ\8fвÑ\83 Ð°Ð´Ð¿Ð°Ð²ÐµÐ´Ð½Ð°Ð³Ð° Ð¿Ð°Ð¼ÐµÑ\80Ñ\83 Ñ\96 Ñ\9eвÑ\8fдзÑ\96Ñ\86е Ñ\82Ñ\83Ñ\82 URL-адÑ\80аÑ\81.\n\nÐ\92Ñ\8b Ð¼Ð¾Ð¶Ð°Ñ\86е Ñ\9eжÑ\8bÑ\86Ñ\8c <code>$wgStylePath</code> Ð°Ð±Ð¾ <code>$wgScriptPath</code>, ÐºÐ°Ð»Ñ\96 Ð²Ð°Ñ\88 Ð»Ñ\8fгаÑ\82Ñ\8bп Ð·Ð½Ð°Ñ\85одзÑ\96Ñ\86Ñ\86а Ð°Ð´Ð½Ð¾Ñ\81на Ð³Ñ\8dÑ\82Ñ\8bÑ\85 Ñ\88лÑ\8fÑ\85оÑ\9e.\n\nКалі Вы не жадаеце мець ніякага лягатыпу, пакіньце поле пустым.",
     "config-instantcommons": "Дазволіць Instant Commons",
     "config-instantcommons-help": "[//www.mediawiki.org/wiki/InstantCommons Instant Commons] — магчымасьць, якая дазваляе вікі выкарыстоўваць выявы, гукі і іншыя мэдыя, якія знаходзяцца на сайце [//commons.wikimedia.org/ Wikimedia Commons].\nКаб гэта зрабіць, MediaWiki патрабуе доступу да Інтэрнэту.\n\nКаб даведацца болей пра гэтую магчымасьць, уключаючы інструкцыю пра тое, як яе ўстанавіць ў любой вікі, акрамя Wikimedia Commons, глядзіце [//mediawiki.org/wiki/Manual:$wgForeignFileRepos дакумэнтацыю].",
     "config-cc-error": "Выбар ліцэнзіі Creative Commons ня даў вынікаў.\nУвядзіце назву ліцэнзіі ўручную.",
     "config-extensions": "Пашырэньні",
     "config-extensions-help": "Пашырэньні пададзеныя вышэй, былі знойдзеныя ў Вашай дырэкторыі <code>./extensions</code>.\n\nЯны могуць патрабаваць дадатковых наладаў, але іх можна ўключыць зараз",
     "config-install-alreadydone": "'''Папярэджаньне:''' здаецца, што Вы ўжо ўсталёўвалі MediaWiki і спрабуеце зрабіць гэтай зноў.\nКалі ласка, перайдзіце на наступную старонку.",
-    "config-install-begin": "Пасьля націску кнопкі «{{int:config-continue}}» пачнецца ўсталяваньне MediaWiki.\nКалі Вы жадаеце што-небудзь зьмяніць, націсьніце кнопку «Вярнуцца».",
+    "config-install-begin": "Пасьля націску кнопкі «{{int:config-continue}}» пачнецца ўсталяваньне MediaWiki.\nКалі Вы жадаеце што-небудзь зьмяніць, націсьніце кнопку «{{int:config-back}}».",
     "config-install-step-done": "зроблена",
     "config-install-step-failed": "не атрымалася",
     "config-install-extensions": "Уключаючы пашырэньні",
     "config-install-interwiki-exists": "'''Папярэджаньне''': выглядае, што табліца інтэрвікі ўжо запоўненая.\nСьпіс па змоўчваньні прапушчаны.",
     "config-install-stats": "Ініцыялізацыі статыстыкі",
     "config-install-keys": "Стварэньне сакрэтных ключоў",
-    "config-insecure-keys": "'''Папярэджаньне:''' {{PLURAL:$2|Ключ бясьпекі $1 створаны|Ключы бясьпекі $1 створаныя}} падчас усталяваньня, не зьяўляюцца поўнасьцю бясьпечнымі. Рэкамэндуецца зьмяніць {{PLURAL:$2|яго ўручную|іх уручную}}.",
+    "config-insecure-keys": "<strong>Папярэджаньне:</strong> {{PLURAL:$2|1=Ключ бясьпекі $1 створаны|Ключы бясьпекі $1 створаныя}} падчас усталяваньня, {{PLURAL:$2|1=не зьяўляецца паўнасьцю бясьпечным|не зьяўляюцца поўнасьцю бясьпечнымі}}. Рэкамэндуецца зьмяніць {{PLURAL:$2|1=яго ўручную|іх уручную}}.",
     "config-install-sysop": "Стварэньне рахунку адміністратара",
     "config-install-subscribe-fail": "Немагчыма падпісацца на «mediawiki-announce»: $1",
     "config-install-subscribe-notpossible": "cURL не ўсталяваны, allow_url_fopen недаступны.",
     "config-help": "дапамога",
     "config-nofile": "Файл «$1» ня знойдзены. Ці быў ён выдалены?",
     "mainpagetext": "'''MediaWiki пасьпяхова ўсталяваная.'''",
-    "mainpagedocfooter": "Глядзіце [//meta.wikimedia.org/wiki/Help:Contents дапаможнік карыстальніка] для атрыманьня інфармацыі па карыстаньні вікі-праграмамі.\n\n== З чаго пачаць ==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Сьпіс парамэтраў канфігурацыі]\n* [//www.mediawiki.org/wiki/Manual:FAQ Частыя пытаньні MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Рассылка паведамленьняў пра зьяўленьне новых вэрсіяў MediaWiki]"
-}
\ No newline at end of file
+    "mainpagedocfooter": "Глядзіце [//meta.wikimedia.org/wiki/Help:Contents дапаможнік карыстальніка] для атрыманьня інфармацыі па карыстаньні вікі-праграмамі.\n\n== З чаго пачаць ==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Сьпіс парамэтраў канфігурацыі]\n* [//www.mediawiki.org/wiki/Manual:FAQ Частыя пытаньні MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Рассылка паведамленьняў пра зьяўленьне новых вэрсіяў MediaWiki]\n* [//www.mediawiki.org/wiki/Localisation#Translation_resources Пераклад MediaWiki на вашую мову]"
+}
index 99222c6..1289f83 100644 (file)
@@ -1,7 +1,5 @@
 {
-    "@metadata": {
-        "authors": []
-    },
+    "@metadata": [],
     "mainpagetext": "'''MediaWiki паспяхова ўсталяваная.'''",
     "mainpagedocfooter": "Гл. [//meta.wikimedia.org/wiki/Help:Contents Дапаможнік карыстальніка (англ.)] па далейшыя звесткі аб карыстанні вікі-праграмамі.\n\n== З чаго пачаць ==\n\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Пералік параметраў канфігурацыі (англ.)]\n* [//www.mediawiki.org/wiki/Manual:FAQ ЧАПЫ MediaWiki (англ.)]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Ліставанне аб выпусках MediaWiki (англ.)]"
-}
\ No newline at end of file
+}
index 601a2f4..cdd509c 100644 (file)
@@ -14,7 +14,7 @@
     "config-localsettings-badkey": "Предоставеният ключ е неправилен.",
     "config-upgrade-key-missing": "Беше открита съществуваща инсталация на МедияУики.\nЗа надграждане на съществуващата инсталация, необходимо е да се постави следният ред в края на файла <code>LocalSettings.php</code>:\n\n$1",
     "config-localsettings-incomplete": "Съществуващият файл <code>LocalSettings.php</code> изглежда непълен.\nПроменливата $1 не е зададена.\nНеобходимо е да се редактира файлът <code>LocalSettings.php</code> и да се зададе променливата, след което да се натисне „{{int:Config-continue}}“.",
-    "config-localsettings-connection-error": "Ð\92Ñ\8aзникна Ð³Ñ\80еÑ\88ка Ð¿Ñ\80и Ñ\81вÑ\8aÑ\80зване Ñ\81 Ð±Ð°Ð·Ð°Ñ\82а Ð¾Ñ\82 Ð´Ð°Ð½Ð½Ð¸ Ñ\87Ñ\80ез Ð´Ð°Ð½Ð½Ð¸Ñ\82е, Ð¿Ð¾Ñ\81оÑ\87ени Ð² <code>LocalSettings.php</code> Ð¸Ð»Ð¸ <code>AdminSettings.php</code>. Ð\9dеобÑ\85одимо Ðµ Ð´Ð° Ñ\81е ÐºÐ¾Ñ\80игиÑ\80аÑ\82 Ñ\82ези Ð½Ð°Ñ\81Ñ\82Ñ\80ойки Ð¿Ñ\80еди Ð¿Ð¾Ð²Ñ\82оÑ\80ен Ð¾Ð¿Ð¸Ñ\82 Ð·Ð° Ñ\81вÑ\8aÑ\80зване.\n\n$1",
+    "config-localsettings-connection-error": "Ð\92Ñ\8aзникна Ð³Ñ\80еÑ\88ка Ð¿Ñ\80и Ñ\81вÑ\8aÑ\80зване Ñ\81 Ð±Ð°Ð·Ð°Ñ\82а Ð´Ð°Ð½Ð½Ð¸ Ñ\87Ñ\80ез Ð¿Ð¾Ñ\81оÑ\87ениÑ\82е Ð½Ð°Ñ\81Ñ\82Ñ\80ойки Ð² <code>LocalSettings.php</code>. Ð\9fÑ\80еди Ñ\81ледваÑ\89 Ð¾Ð¿Ð¸Ñ\82 Ð·Ð° Ñ\81вÑ\8aÑ\80зване, Ð½ÐµÐ¾Ð±Ñ\85одимо Ðµ Ð½Ð°Ñ\81Ñ\82Ñ\80ойкиÑ\82е Ð´Ð° Ð±Ñ\8aдаÑ\82 ÐºÐ¾Ñ\80игиÑ\80ани.\n\n$1",
     "config-session-error": "Грешка при създаване на сесия: $1",
     "config-session-expired": "Срокът на валидност на данните от сесията са изтекли.\nПродължителността на сесиите е настроена на $1.\nТова може да бъде увеличено чрез настройване на <code>session.gc_maxlifetime</code> в php.ini.\nНеобходимо е рестартиране на инсталационния процес.",
     "config-no-session": "Данните за сесията бяха загубени!\nПроверете вашия php.ini и се уверете, че на <code>session.save_path</code> е настроена подходящата директория.",
@@ -41,7 +41,7 @@
     "config-page-existingwiki": "Съществуващо уики",
     "config-help-restart": "Необходимо е потвърждение за изтриване на всички въведени и съхранени данни и започване отначало на процеса по инсталация.",
     "config-restart": "Да, започване отначало",
-    "config-welcome": "=== Ð\9fÑ\80овеÑ\80ка Ð½Ð° Ñ\81Ñ\80едаÑ\82а ===\nÐ\98звÑ\8aÑ\80Ñ\88ени Ð±Ñ\8fÑ\85а Ð¾Ñ\81новни Ð¿Ñ\80овеÑ\80ки, Ð·Ð° Ð´Ð° Ñ\81е Ð¿Ñ\80овеÑ\80и дали средата е подходяща за инсталиране на МедияУики.\nАко е необходима помощ по време на инсталацията, резултатите от направените проверки трябва също да бъдат предоставени.",
+    "config-welcome": "=== Ð\9fÑ\80овеÑ\80ка Ð½Ð° Ñ\81Ñ\80едаÑ\82а ===\nЩе Ð±Ñ\8aдаÑ\82 Ð¸Ð·Ð²Ñ\8aÑ\80Ñ\88ени Ð¾Ñ\81новни Ð¿Ñ\80овеÑ\80ки, ÐºÐ¾Ð¸Ñ\82о Ð´Ð° Ñ\83Ñ\81Ñ\82ановÑ\8fÑ\82 дали средата е подходяща за инсталиране на МедияУики.\nАко е необходима помощ по време на инсталацията, резултатите от направените проверки трябва също да бъдат предоставени.",
     "config-copyright": "=== Авторски права и Условия ===\n\n$1\n\nТази програма е свободен софтуер, който може да се променя и/или разпространява според Общия публичен лиценз на GNU, както е публикуван от Free Software Foundation във версия на Лиценза 2 или по-късна версия.\n\nТази програма се разпространява с надеждата, че ще е полезна, но '''без каквито и да е гаранции'''; без дори косвена гаранция за '''продаваемост''' или '''прогодност за конкретна употреба'''.\nЗа повече подробности се препоръчва преглеждането на Общия публичен лиценз на GNU.\n\nКъм програмата трябва да е приложено <doclink href=Copying>копие на Общия публичен лиценз на GNU</doclink>; ако не, можете да пишете на Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. или да [http://www.gnu.org/copyleft/gpl.html го прочетете онлайн].",
     "config-sidebar": "* [//www.mediawiki.org Сайт на МедияУики]\n* [//www.mediawiki.org/wiki/Help:Contents Наръчник на потребителя]\n* [//www.mediawiki.org/wiki/Manual:Contents Наръчник на администратора]\n* [//www.mediawiki.org/wiki/Manual:FAQ ЧЗВ]\n----\n* <doclink href=Readme>Документация</doclink>\n* <doclink href=ReleaseNotes>Бележки за версията</doclink>\n* <doclink href=Copying>Авторски права</doclink>\n* <doclink href=UpgradeDoc>Обновяване</doclink>",
     "config-env-good": "Средата беше проверена.\nИнсталирането на МедияУики е възможно.",
     "config-unicode-pure-php-warning": "'''Предупреждение''': [http://pecl.php.net/intl Разширението intl PECL] не е налично за справяне с нормализацията на Уникод, превключване към по-бавното изпълнение на чист PHP.\nАко сайтът е с голям трафик, препоръчително е запознаването с [//www.mediawiki.org/wiki/Unicode_normalization_considerations нормализацията на Уникод].",
     "config-unicode-update-warning": "'''Предупреждение''': Инсталираната версия на Обвивката за нормализация на Unicode използва по-старата версия на библиотеката на [http://site.icu-project.org/ проекта ICU].\nНеобходимо е да [//www.mediawiki.org/wiki/Unicode_normalization_considerations инсталирате по-нова верия], в случай че сте загрижени за използването на Unicode.",
     "config-no-db": "Не може да бъде открит подходящ драйвер за база от данни! Необходимо е да се инсталира драйвер за база от данни за PHP.\nПоддържат се следните типове базни от данни: $1.\n\nАко използвате споделен хостинг, помолете доставчика на услугата да инсталира подходящ драйвер за база от данни.\nАко сами сте компилирали PHP, преконфигурирайте го с включен клиент за база от данни, например чрез използване на <code>./configure --with-mysql</code>.\nАко сте инсталирали PHP от пакет за Debian или Убунту, необходимо е, също така, да инсталирате и модула php5-mysql.",
+    "config-outdated-sqlite": "<strong>Предупреждение:</strong> имате инсталиран SQLite  $1, а минималната допустима версия е $2. SQLite ще бъде недостъпна за ползване.",
     "config-no-fts3": "'''Предупреждение''': SQLite е компилирана без [//sqlite.org/fts3.html модула FTS3], затова възможностите за търсене няма да са достъпни.",
     "config-register-globals": "'''Предупреждение: Настройката на PHP <code>[http://php.net/register_globals register_globals]</code> е включена.'''\n'''При възможност е препоръчително тя да бъде изключена.'''\nМедияУики ще работи, но сървърът е изложен на евентуални пропуски в сигурността.",
     "config-magic-quotes-runtime": "'''Фатално: [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-runtime magic_quotes_runtime] е активирана!'''\nТова може да повреди непредвидимо въвеждането на данните.\nИнсталацията на МедияУики е невъзможна докато тази настройка не бъде изключена.",
     "config-magic-quotes-sybase": "'''Фатално: [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-sybase magic_quotes_sybase] е активирана!'''\nТова може да повреди непредвидимо въвеждането на данните.\nИнсталацията на МедияУики е невъзможна докато тази настройка не бъде изключена.",
     "config-mbstring": "'''Фатално: [http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload] е активирана!'''\nТова може да повреди непредвидимо въвеждането на данните.\nИнсталацията на МедияУики е невъзможна докато тази настройка не бъде изключена.",
-    "config-ze1": "'''Фатално: [http://www.php.net/manual/en/ini.core.php zend.ze1_compatibility_mode] е активирана!'''\nТази настройка причинява ужасни грешки в МедияУики.\nНевъзможно е инсталирането и използването на МедияУики докато тази настройка не бъде изключена.",
     "config-safe-mode": "'''Предупреждение:''' PHP работи в [http://www.php.net/features.safe-mode безопасен режим].\nТова може да създаде проблеми, особено ако качването на файлове е разрешено, както и при поддръжката на <code>math</code>.",
     "config-xml-bad": "Липсва XML модулът на PHP.\nМедияУики се нуждае от някои функции от този модул и няма да работи при наличната конфигурация.\nПри Mandrake, необходимо е да се инсталира пакетът php-xml.",
-    "config-pcre": "Липсва модулът PCRE.\nЗа да работи, МедияУики изисква съвместими с Perl функии за регилярни изрази.",
     "config-pcre-no-utf8": "'''Фатално''': Модулът PCRE на PHP изглежда е компилиран без поддръжка на PCRE_UTF8.\nЗа да функционира правилно, МедияУики изисква поддръжка на UTF-8.",
     "config-memory-raised": "<code>memory_limit</code> на PHP е $1, увеличаване до $2.",
     "config-memory-bad": "'''Предупреждение:''' <code>memory_limit</code> на PHP е $1.\nСтойността вероятно е твърде ниска.\nВъзможно е инсталацията да се провали!",
@@ -79,7 +78,6 @@
     "config-using-uri": "Използване на сървърния адрес (URL) \"<nowiki>$1$2</nowiki>\".",
     "config-uploads-not-safe": "'''Предупреждение:''' Папката по подразбиране за качване <code>$1</code> е уязвима от изпълнение на зловредни скриптове.\nВъпреки че МедияУики извършва проверка за заплахи в сигурността на всички качени файлове, силно препоръчително е да се [//www.mediawiki.org/wiki/Manual:Security#Upload_security затвори тази уязвимост в сигурността] преди разрешаване за качване на файлове.",
     "config-brokenlibxml": "Вашата система използа комбинация от версии на PHP и libxml2, които са с много грешки и могат да причинят скрити повреди на данните в МедияУики или други уеб приложения.\nНеобходимо е обновяване до PHP 5.2.9 или по-нова версия и libxml2 2.7.3 или по-нова версия ([//bugs.php.net/bug.php?id=45996 докладвана грешка при PHP]).\nИнсталацията беше прекратена.",
-    "config-using531": "МедияУики не може да се използва с PHP $1 заради проблем с референтните параметри за <code>__call()</code>.\nЗа разрешаване на този проблем е необходимо да се обнови до PHP 5.3.2 или по-нова версия или да се инсталира по-стара версия, напр. PHP 5.3.0.\nИнсталацията беше прекратена.",
     "config-suhosin-max-value-length": "Suhosin е инсталиран и ограничава дължината на параметъра GET на $1 байта. Компонентът на МедияУики ResourceLoader ще може да пренебрегне частично това ограничение, но това ще намали производителността. По възможност е препоръчително да се настрои <code>suhosin.get.max_value_length</code> на 1024 или по-голяма стойност в <code>php.ini</code> и в LocalSettings.php да се настрои <code>$wgResourceLoaderMaxQueryLength</code> със същата стойност.",
     "config-db-type": "Тип на базата от данни:",
     "config-db-host": "Хост на базата от данни:",
     "config-pg-test-error": "Невъзможно свързване с базата данни '''$1''': $2",
     "config-sqlite-dir": "Директория за данни на SQLite:",
     "config-sqlite-dir-help": "SQLite съхранява всички данни в един файл.\n\nПо време на инсталацията уеб сървърът трябва да има права за писане в посочената директория.\n\nТя '''не трябва''' да е достъпна през уеб, затова не е там, където са PHP файловете.\n\nИнсталаторът ще съхрани заедно с нея файл <code>.htaccess</code>, но ако този метод пропадне, някой може да придобие даостъп до суровите данни от базата от данни.\nТова включва сурови данни за потребителите (адреси за е-поща, хеширани пароли), както и изтрити версии на страници и друга чувствителна и с ограничен достъп информация от и за уикито.\n\nБазата от данни е препоръчително да се разположи на друго място, например в <code>/var/lib/mediawiki/yourwiki</code>.",
+    "config-type-mysql": "MySQL (или съвместима)",
+    "config-type-mssql": "Microsoft SQL Сървър",
     "config-support-info": "МедияУики поддържа следните системи за бази от данни:\n\n$1\n\nАко не виждате желаната за използване система в списъка по-долу, следвайте инструкциите за активиране на поддръжка по-горе.",
-    "config-support-mysql": "* $1 е най-добре поддържаната система за база от данни, с най-добра поддръжка от МедияУики ([http://www.php.net/manual/en/mysql.installation.php Как се компилира PHP с поддръжка на MySQL])",
-    "config-support-postgres": "* $1 е популярна система за бази от данни с отворен изходен код, която е алтернатива на MySQL ([http://www.php.net/manual/en/pgsql.installation.php как се компилира PHP с поддръжка на PostgreSQL]). Възможно е все още да има грешки, затова не се препоръчва да се използва в общодостъпна среда.",
-    "config-support-sqlite": "* $1 е лека система за база от данни, която е много добре поддържана. ([http://www.php.net/manual/en/pdo.installation.php Как се компилира PHP с поддръжка на SQLite], използва PDO)",
-    "config-support-oracle": "* $1 е комерсиална корпоративна база от данни. ([http://www.php.net/manual/en/oci8.installation.php Как се компилира PHP с поддръжка на OCI8])",
+    "config-dbsupport-mysql": "* $1 е най-добре поддържаната система за база от данни, с най-добра поддръжка от МедияУики ([http://www.php.net/manual/en/mysql.installation.php Как се компилира PHP с поддръжка на MySQL])",
+    "config-dbsupport-postgres": "* $1 е популярна система за бази от данни с отворен изходен код, която е алтернатива на MySQL ([http://www.php.net/manual/en/pgsql.installation.php как се компилира PHP с поддръжка на PostgreSQL]). Възможно е все още да има грешки, затова не се препоръчва да се използва в общодостъпна среда.",
+    "config-dbsupport-sqlite": "* $1 е лека система за база от данни, която е много добре поддържана. ([http://www.php.net/manual/en/pdo.installation.php Как се компилира PHP с поддръжка на SQLite], използва PDO)",
+    "config-dbsupport-oracle": "* [{{int:version-db-oracle-url}} Oracle] е комерсиална корпоративна база от данни. ([http://www.php.net/manual/en/oci8.installation.php Как се компилира PHP с поддръжка на OCI8])",
     "config-header-mysql": "Настройки за MySQL",
     "config-header-postgres": "Настройки за PostgreSQL",
     "config-header-sqlite": "Настройки за SQLite",
     "config-header-oracle": "Настройки за Oracle",
+    "config-header-mssql": "Настройки за Microsoft SQL Сървър",
     "config-invalid-db-type": "Невалиден тип база от данни",
     "config-missing-db-name": "Необходимо е да се въведе стойност за \"Име на базата от данни\"",
     "config-missing-db-host": "Необходимо е да се въведе стойност за \"Хост на базата от данни\"",
     "config-admin-name-blank": "Необходимо е да бъде въведено потребителско име на администратора.",
     "config-admin-name-invalid": "Посоченото потребителско име \"<nowiki>$1</nowiki>\" е невалидно.\nНеобходимо е да се посочи друго.",
     "config-admin-password-blank": "Неовходимо е да се въведе парола за администраторската сметка.",
-    "config-admin-password-same": "Паролата не трябва да е същата като потребителското име.",
     "config-admin-password-mismatch": "Двете въведени пароли не съвпадат.",
     "config-admin-email": "Адрес за електронна поща:",
     "config-admin-email-help": "Въвеждането на адрес за е-поща позволява получаване на е-писма от другите потребители на уикито, възстановяване на изгубена или забравена парола, оповестяване при промени в страниците от списъка за наблюдение. Това поле може да бъде оставено празно.",
     "config-profile-no-anon": "Необходимо е създаване на сметка",
     "config-profile-fishbowl": "Само одобрени редактори",
     "config-profile-private": "Затворено уики",
-    "config-profile-help": "Уикитата функционират най-добре, когато позволяват на възможно най-много хора да ги редактират.\nВ МедияУики лесно се преглеждат последните промени и се възстановяват пораженип от недобронамерени потребители.\n\nВъпреки това мнозина смятат МедияУики за полезен софтуер по различни начини и често е трудно да се убедят всички от предимствата на уики модела.\nЗатова се предоставя възможност за избор.\n\nУикитата от типа '''{{int:config-profile-wiki}}''' позволяват на всички потребители да редактират, дори и без регистрация.\nУикитата от типа '''{{int:config-profile-no-anon}}''' позволяват достъп до страниците и редактирането им само след създаване на потребителска сметка.\n\nУики, което е '''{{int:config-profile-fishbowl}}''' позволява на всички да преглеждат страниците, но само предварително одобрени редактори могат да редактират съдържанието.\nВ '''{{int:config-profile-private}}''' само предварително одобрени потребители могат да четат и редактират съдържанието.\n\nДетайлно обяснение на конфигурациите на потребителските права е достъпно след инсталацията в [//www.mediawiki.org/wiki/Manual:User_rights Наръчника за потребителски права].",
+    "config-profile-help": "Уикитата функционират най-добре, когато позволяват на възможно най-много хора да ги редактират.\nВ МедияУики лесно се преглеждат последните промени и се възстановяват поражения от недобронамерени потребители.\n\nВъпреки това мнозина смятат МедияУики за полезен софтуер по различни начини и често е трудно да се убедят всички от предимствата на уики модела.\nЗатова се предоставя възможност за избор.\n\nУикитата от типа '''{{int:config-profile-wiki}}''' позволяват на всички потребители да редактират, дори и без регистрация.\nУикитата от типа '''{{int:config-profile-no-anon}}''' позволяват достъп до страниците и редактирането им само след създаване на потребителска сметка.\n\nУики, което е '''{{int:config-profile-fishbowl}}''' позволява на всички да преглеждат страниците, но само предварително одобрени редактори могат да редактират съдържанието.\nВ '''{{int:config-profile-private}}''' само предварително одобрени потребители могат да четат и редактират съдържанието.\n\nДетайлно обяснение на конфигурациите на потребителските права е достъпно след инсталацията в [//www.mediawiki.org/wiki/Manual:User_rights Наръчника за потребителски права].",
     "config-license": "Авторски права и лиценз:",
     "config-license-none": "Без лиценз",
     "config-license-cc-by-sa": "Криейтив Комънс Признание-Споделяне на споделеното",
     "config-upload-deleted": "Директория за изтритите файлове:",
     "config-upload-deleted-help": "Избиране на директория, в която ще се складират изтритите файлове.\nВ най-добрия случай тя не трябва да е достъпна през уеб.",
     "config-logo": "Адрес на логото:",
-    "config-logo-help": "Обликът по подразбиране на МедияУики вклчва място с размери 135х160 пиксела за лого над страничното меню.\nАко има наличен файл с подходящ размер, неговият адрес може да бъде посочен тук.\n\nАко не е необходимо лого, полето може да се остави празно.",
+    "config-logo-help": "Ð\9eбликÑ\8aÑ\82 Ð¿Ð¾ Ð¿Ð¾Ð´Ñ\80азбиÑ\80ане Ð½Ð° Ð\9cедиÑ\8fУики Ð²ÐºÐ»Ñ\87ва Ð¼Ñ\8fÑ\81Ñ\82о Ñ\81 Ñ\80азмеÑ\80и 135Ñ\85160 Ð¿Ð¸ÐºÑ\81ела Ð·Ð° Ð»Ð¾Ð³Ð¾ Ð½Ð°Ð´ Ñ\81Ñ\82Ñ\80аниÑ\87ноÑ\82о Ð¼ÐµÐ½Ñ\8e.\nÐ\90ко Ð¸Ð¼Ð° Ð½Ð°Ð»Ð¸Ñ\87ен Ñ\84айл Ñ\81 Ð¿Ð¾Ð´Ñ\85одÑ\8fÑ\89 Ñ\80азмеÑ\80, Ð½ÐµÐ³Ð¾Ð²Ð¸Ñ\8fÑ\82 Ð°Ð´Ñ\80еÑ\81 Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ð±Ñ\8aде Ð¿Ð¾Ñ\81оÑ\87ен Ñ\82Ñ\83к.\n\nÐ\9cоже Ð´Ð° Ñ\81е Ð¸Ð·Ð¿Ð¾Ð»Ð·Ð²Ð° <code>$wgStylePath</code> Ð¸Ð»Ð¸ <code>$wgScriptPath</code> Ð°ÐºÐ¾ Ð»Ð¾Ð³Ð¾Ñ\82о Ðµ Ð¾Ñ\82ноÑ\81иÑ\82елно ÐºÑ\8aм Ñ\82ези Ð¿Ñ\8aÑ\82иÑ\89а.\n\nÐ\90ко Ð½Ðµ Ðµ Ð½ÐµÐ¾Ð±Ñ\85одимо Ð»Ð¾Ð³Ð¾, Ð¿Ð¾Ð»ÐµÑ\82о Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ñ\81е Ð¾Ñ\81Ñ\82ави Ð¿Ñ\80азно.",
     "config-instantcommons": "Включване на Instant Commons",
     "config-instantcommons-help": "[//www.mediawiki.org/wiki/InstantCommons Instant Commons] е функционалност, която позволява на уикитата да използват картинки, звуци и друга медиа от сайта на Уикимедия [//commons.wikimedia.org/ Общомедия].\nЗа да е възможно това, МедияУики изисква достъп до Интернет.\n\nПовече информация за тази функционалност, както и инструкции за настройване за други уикита, различни от Общомедия, е налична в [//mediawiki.org/wiki/Manual:$wgForeignFileRepos наръчника].",
     "config-cc-error": "Избирането на лиценз на Криейтив Комънс не даде резултат.\nНеобходимо е името на лиценза да бъде въведено ръчно.",
     "config-install-schema": "Създаване на схема",
     "config-install-pg-schema-not-exist": "PostgreSQL схемата не съществува",
     "config-install-pg-schema-failed": "Създаването на таблиците пропадна.\nНеобходимо е потребител \"$1\" да има права за писане в схемата \"$2\".",
+    "config-install-pg-commit": "Извършване на промени",
     "config-install-pg-plpgsql": "Проверяване за езика PL/pgSQL",
     "config-pg-no-plpgsql": "Необходимо е да се инсталира езикът PL/pgSQL в базата от данни $1",
     "config-pg-no-create-privs": "Посочената сметка за инсталацията не притежава достатъчно права за създаване на сметка.",
     "config-download-localsettings": "Изтегляне на <code>LocalSettings.php</code>",
     "config-help": "помощ",
     "config-nofile": "Файлът „$1“ не може да бъде открит. Да не е бил изтрит?",
+    "config-extension-link": "Знаете ли, че това уики поддържа [//www.mediawiki.org/wiki/Manual:Extensions разширения]?\n\nМожете да разгледате [//www.mediawiki.org/wiki/Category:Extensions_by_category разширенията по категория] или [//www.mediawiki.org/wiki/Extension_Matrix Матрицата на разширенията] за пълен списък на разширенията.",
     "mainpagetext": "'''Уикито беше успешно инсталирано.'''",
     "mainpagedocfooter": "Разгледайте [//meta.wikimedia.org/wiki/Help:Contents ръководството] за подробна информация относно използването на уики софтуера.\n\n== Първи стъпки ==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Настройки за конфигуриране]\n* [//www.mediawiki.org/wiki/Manual:FAQ ЧЗВ за МедияУики]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Пощенски списък относно нови версии на МедияУики]\n* [//www.mediawiki.org/wiki/Localisation#Translation_resources Локализиране на МедияУики]"
-}
\ No newline at end of file
+}
index 49e56c1..e36fc9c 100644 (file)
@@ -7,4 +7,4 @@
     },
     "mainpagetext": "'''MediaWiki sudah tapasang awan sukses'''.",
     "mainpagedocfooter": "Carii panjalasan [//meta.wikimedia.org/wiki/Help:Contents Panduan Pamuruk] gasan mamuruk parangkat lunak wiki\n\n== Gasan bamula ==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Daptar konpigurasi setélan]\n* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki nang rancak ditakunakan]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki rilis milis]"
-}
\ No newline at end of file
+}
index ef2da60..0ab074f 100644 (file)
@@ -2,7 +2,8 @@
     "@metadata": {
         "authors": [
             "Bellayet",
-            "Wikitanvir"
+            "Wikitanvir",
+            "Aftab1995"
         ]
     },
     "config-desc": "মিডিয়াউইকির জন্য ইন্সটলার",
@@ -57,6 +58,7 @@
     "config-mysql-charset": "ডেটাবেজের অক্ষর সেট",
     "config-mysql-binary": "বাইনারি",
     "config-mysql-utf8": "ইউটিএফ-৮",
+    "config-mssql-windowsauth": "উইন্ডোজ প্রমাণীকরণ",
     "config-site-name": "উইকির নাম:",
     "config-site-name-blank": "একটি সাইটের নাম প্রবেশ করান।",
     "config-project-namespace": "প্রকল্প নামস্থান:",
     "config-ns-other": "অন্যান্য (নির্দিষ্ট করুন)",
     "config-ns-other-default": "মাইউইকি",
     "config-admin-box": "প্রশাসক অ্যাকাউন্ট",
-    "config-admin-name": "আপনার নাম:",
+    "config-admin-name": "à¦\86পনার à¦¬à§\8dযবহারà¦\95ারà§\80 à¦¨à¦¾à¦®:",
     "config-admin-password": "শব্দচাবি:",
     "config-admin-password-confirm": "শব্দচাবি আবারও প্রবেশ করান:",
     "config-admin-name-blank": "একটি প্রশাসক ব্যবহারকারী নাম প্রবেশ করান",
     "config-admin-password-blank": "প্রশাসক অ্যাকাউন্টের জন্য পাসওয়ার্ড প্রবেশ করান।",
-    "config-admin-password-same": "পাসওয়ার্ড অবশ্যই ব্যবহারকারী নামের অনুরুপ হওয়া চলবে না।",
     "config-admin-password-mismatch": "আপনি যে দুটি শব্দচাবি দিয়েছেন তারা পরস্পর মেলেনি।",
     "config-admin-email": "ইমেইল ঠিকানা:",
     "config-optional-continue": "আরও প্রশ্ন জিজ্ঞেস করুন।",
     "config-optional-skip": "আমি ইতিমধ্যেই বিরক্ত হয়ে গেছি, উইকিটি ইন্সটল করো।",
     "config-profile": "ব্যবহারকারী অধিকার প্রোফাইল:",
-    "config-profile-wiki": "à¦\97তানà§\81à¦\97তিà¦\95 উইকি",
+    "config-profile-wiki": "à¦\89নà§\8dমà§\81à¦\95à§\8dত উইকি",
     "config-profile-no-anon": "অ্যাকাউন্ট তৈরি করা বাধ্যতামূলক",
     "config-profile-fishbowl": "শুধুমাত্র নির্ধারিত সম্পাদকদের  জন্যই",
     "config-profile-private": "ব্যক্তিগত উইকি",
@@ -84,7 +85,7 @@
     "config-license-none": "কোনো লাইসেন্স ফুটার নেই",
     "config-license-cc-by-sa": "ক্রিয়েটিভ কমন্স অ্যাট্রিবিউশন শেয়ার অ্যালাইক",
     "config-license-cc-by-nc-sa": "ক্রিয়েটিভ কমন্স অ্যাট্রিবিউশন নন-কমার্শিয়াল শেয়ার অ্যালাইক",
-    "config-license-cc-0": "ক্রিয়েটিভ কমন্স জিরো",
+    "config-license-cc-0": "ক্রিয়েটিভ কমন্স জিরো (পাবলিক ডোমেইন)",
     "config-license-pd": "পাবলিক ডোমেইন",
     "config-license-cc-choose": "একটি স্বনির্ধারিত ক্রিয়েটিভ কমন্স লাইসেন্ট নির্বাচন করুন",
     "config-email-settings": "ই-মেইল সেটিংস",
     "config-help": "সাহায্য",
     "mainpagetext": "'''মিডিয়াউইকি সফলভাবে ইন্সটল করা হয়েছে।'''",
     "mainpagedocfooter": "কী ভাবে উইকি সফটওয়্যারটি ব্যবহারকার করবেন, তা জানতে [//meta.wikimedia.org/wiki/Help:Contents ব্যবহারকারী সহায়িকা] দেখুন।\n\n== কোথা থেকে শুরু করবেন ==\n\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings কনফিগারেশন সেটিংস তালিকা]\n* [//www.mediawiki.org/wiki/Manual:FAQ প্রশ্নোত্তরে মিডিয়াউইকি]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce মিডিয়াউইকি রিলিজের মেইলিং লিস্ট]"
-}
\ No newline at end of file
+}
index af0b4c0..67a7c26 100644 (file)
@@ -1,7 +1,5 @@
 {
-    "@metadata": {
-        "authors": []
-    },
+    "@metadata": [],
     "mainpagetext": "'''মিডিয়াউইকি হবাবালা ইয়া ইন্সটল ইল.'''",
     "mainpagedocfooter": "উইকি সফটৱ্যার এহান আতানির বারে দরকার ইলে [//meta.wikimedia.org/wiki/Help:Contents আতাকুরার গাইড]হানর পাঙলাক নেগা।\n\n== অকরানিহান ==\n\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings কনফিগারেশন সেটিংর তালিকাহান]\n* [//www.mediawiki.org/wiki/Manual:FAQ মিডিয়া উইকি আঙলাক]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce মিডিয়া উইকির ফঙপার বারে মেইলর তালিকাহান]"
-}
\ No newline at end of file
+}
index eac799b..0855c0e 100644 (file)
@@ -17,7 +17,7 @@
     "config-localsettings-badkey": "Direizh eo an alc'hwez merket ganeoc'h",
     "config-upgrade-key-missing": "Kavet ez eus bet ur staliadur kent eus MediaWiki.\nEvit hizivaat ar staliadur-se, ouzhpennit al linenn da-heul e traoñ ho restr <code>LocalSettings.php</code>:\n\n$1",
     "config-localsettings-incomplete": "Diglok e seblant bezañ ar restr <code>LocalSettings.php</code> zo anezhi dija.\nAn argemmenn $1 n'eo ket termenet.\nKemmit <code>LocalSettings.php</code> evit ma vo termenet an argemmenn-se, ha klikit war « {{int:Config-continue}} ».",
-    "config-localsettings-connection-error": "C'hoarvezet ez eus ur fazi en ur gevreañ ouzh an diaz roadennoù oc'h implijout an arventennoù diferet e <code>LocalSettings.php</code> pe <code>AdminSettings.php</code>. Reizhit an arventennoù-se hag esaeit en-dro.\n\n$1",
+    "config-localsettings-connection-error": "C'hoarvezet ez eus ur fazi en ur gevreañ ouzh an diaz roadennoù oc'h implijout an arventennoù diferet e <code>LocalSettings.php</code>. Reizhit an arventennoù-se hag esaeit en-dro.\n\n$1",
     "config-session-error": "Fazi e-ser loc'hañ an dalc'h : $1",
     "config-session-expired": "Kloz eo an dalc'h evit doare.\nKefluniet eo an dalc'hoù evit padout $1.\nKreskiñ ar pad-mañ a c'hallit dre e arventenniñ <code>session.gc_maxlifetime</code> e php.ini.\nAdgrogit gant ar staliadur.",
     "config-no-session": "Kolle teo bet roadennoù ho talc'h !\nGwiriit ar restr php.ini ha bezit sur emañ staliet <code>session.save_path</code> en ur c'havlec'h a zere.",
@@ -44,7 +44,7 @@
     "config-page-existingwiki": "Wiki zo anezhañ dija",
     "config-help-restart": "Ha c'hoant hoc'h eus da ziverkañ an holl roadennoù hoc'h eus ebarzhet ha da adlañsañ an argerzh staliañ ?",
     "config-restart": "Ya, adloc'hañ anezhañ",
-    "config-welcome": "=== Gwiriadennoù a denn d'an endro ===\nRekis eo un nebeud gwiriadennoù diazez da welet hag azas eo an endro evit gallout staliañ MediaWiki.\nDleout a rafec'h merkañ disoc'hoù ar gwiriadennoù-se m'hoc'h eus ezhomm skoazell e-pad ar staliadenn.",
+    "config-welcome": "=== Gwiriadennoù a denn d'an endro ===\nRekis eo un nebeud gwiriadennoù diazez da welet hag azas eo an endro evit gallout staliañ MediaWiki.\nHo pet soñj merkañ disoc'hoù ar gwiriadennoù-se m'ho pez ezhomm skoazell e-pad ar staliadenn.",
     "config-copyright": "=== Gwiriañ aozer ha Termenoù implijout ===\n\n$1\n\nUr meziant frank eo ar programm-mañ; gallout a rit skignañ anezhañ ha/pe kemmañ anezhañ dindan termenoù ar GNU Aotre-implijout Foran Hollek evel m'emañ embannet gant Diazezadur ar Meziantoù Frank; pe diouzh stumm 2 an aotre-implijout, pe (evel mar karit) diouzh ne vern pe stumm nevesoc'h.\n\nIngalet eo ar programm gant ar spi e vo talvoudus met n'eus '''tamm gwarant ebet'''; hep zoken gwarant empleg ar '''varc'hadusted''' pe an '''azaster ouzh ur pal bennak'''. Gwelet ar GNU Aotre-Implijout Foran Hollek evit muioc'h a ditouroù.\n\nSañset oc'h bezañ resevet <doclink href=Copying>un eilskrid eus ar GNU Aotre-implijout Foran Hollek</doclink> a-gevret gant ar programm-mañ; ma n'hoc'h eus ket, skrivit da Diazezadur ar Meziantoù Frank/Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, SUA pe [http://www.gnu.org/licenses/old-licenses/gpl-2.0.html lennit anezhañ enlinenn].",
     "config-sidebar": "* [//www.mediawiki.org MediaWiki degemer]\n* [//www.mediawiki.org/wiki/Help:Contents Sturlevr an implijerien]\n* [//www.mediawiki.org/wiki/Manual:Contents Sturlevr ar verourien]\n* [//www.mediawiki.org/wiki/Manual:FAQ FAG]\n----\n* <doclink href=Readme>Lennit-me</doclink>\n* <doclink href=ReleaseNotes>Notennoù embann</doclink>\n* <doclink href=Copying>Oc'h eilañ</doclink>\n* <doclink href=UpgradeDoc>O hizivaat</doclink>",
     "config-env-good": "Gwiriet eo bet an endro.\nGallout a rit staliañ MediaWiki.",
     "config-magic-quotes-runtime": "'''Fazi groñs : gweredekaet eo [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-runtime magic_quotes_runtime] !'''\nBreinañ a ra an dibarzh-mañ ar roadennoù en ur mod dic'hortoz.\nN'hallit ket staliañ pe ober gant MediaWiki e-keit ha m'eo gweredekaet an dibarzh-se.",
     "config-magic-quotes-sybase": "'''Fazi groñs : gweredekaet eo [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-sybase magic_quotes_sybase] !'''\nBreinañ a ra an dibarzh-mañ ar roadennoù en ur mod dic'hortoz.\nN'hallit ket staliañ pe ober gant MediaWiki e-keit ha m'eo gweredekaet an dibarzh-se.",
     "config-mbstring": "'''Fazi groñs : gweredekaet eo [http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload] !'''\nDegas a ra an dibarzh-mañ fazioù ha gallout a ra breinañ ar roadennoù en ur mod dic'hortoz.\nN'hallit ket staliañ pe ober gant MediaWiki e-keit ha m'eo gweredekaet an dibarzh-se.",
-    "config-ze1": "'''Fazi diremed : [http://www.php.net/manual/en/ini.core.php zend.ze1_compatibility_mod] zo gweredekaet !'''\nAn dibarzh-mañ zo kaoz da zrein euzhus gant MediaWiki.\nNe c'hallit ket staliañ nag implijout MediaWiki keit ha m'eo gweredekaet an dibarzh-mañ.",
     "config-safe-mode": "'''Diwallit :''' Gweredekaet eo [http://www.php.net/features.safe-mode mod surentez] PHP.\nKudennoù a c'hall sevel abalamour da gement-se, dreist-holl ma pellgargit restroù ha ma skorit <code>math</code>.",
     "config-xml-bad": "Mankout a ra modulenn XML PHP.\nEzhomm en deus MediaWiki eus arc'hwelioù zo eus ar vodulenn-se ha ne'z aio ket en-dro gant ar c'hefluniadur zo.\nM'emaoc'h gant Mandrake, stailhit pakad php-xml.",
-    "config-pcre": "Evit doare e vank ar vodulenn skorañ PCRE.\nEvit mont en-dro plaen en deus ezhomm MediaWiki eus an arc'hwelioù jediñ reoliek kenglotus gant Perl.",
     "config-pcre-no-utf8": "'''Fazi groñs ''': evit doare eo bet kempunet modulenn PCRE PHP hep ar skor PCRE_UTF8.\nEzhomm en deus MediaWiki eus UTF-8 evit mont plaen en-dro.",
     "config-memory-raised": "<code>memory_limit</code> ar PHP zo $1, kemmet e $2.",
     "config-memory-bad": "'''Diwallit :''' Da $1 emañ arventenn <code>memory_limit</code> PHP.\nRe izel eo moarvat.\nMarteze e c'hwito ar staliadenn !",
+    "config-ctype": "<strong>Fazi grevus :</strong> PHP a rank bezañ kempunet gant ar skor evit an [http://www.php.net/manual/en/ctype.installation.php astenn Ctype].",
     "config-xcache": "Staliet eo [http://xcache.lighttpd.net/ XCache]",
     "config-apc": "Staliet eo [http://www.php.net/apc APC]",
     "config-wincache": "Staliet eo [http://www.iis.net/download/WinCacheForPhp WinCache]",
     "config-gd": "Kavet eo bet al levraoueg c'hrafek GD enframmet.\nGweredekaet e vo ar bihanaat skeudennoù ma vez gweredekaet an enporzhiañ restroù.",
     "config-no-scaling": "N'eus ket bet gallet kavout al levraoueg GD pe ImageMagick.\nDiweredekaet e vo ar bihanaat skeudennoù.",
     "config-no-uri": "'''Fazi :''' N'eus ket tu da anavezout URI ar skript red.\nStaliadur nullet.",
+    "config-using-server": "Oc'h implijout an anv servijer \"<nowiki>$1</nowiki>\".",
+    "config-using-uri": "Oc'h implijout ar servijour URL \"<nowiki>$1$2</nowiki>\".",
     "config-uploads-not-safe": "'''Diwallit :'''Bresk eo ho kavlec'h pellgargañ dre ziouer <code>$1</code> rak gallout a ra erounit ne vern pe skript.\nha pa vefe gwiriet gant MediaWiki an holl restroù pellgarget eo erbedet-groñs da [//www.mediawiki.org/wiki/Manual:Security#Upload_security serriñ ar breskter surentez-mañ] a-rao gweredekaat ar pellgargañ.",
-    "config-brokenlibxml": "Ur meskad stummoù PHP ha libxml2 dreinek a vez implijet gant ho reizhiad. Gallout a ra breinañ ar roadennoù e MediaWiki hag en arloadoù web all.\nHizivait da PHP 5.2.9 pe nevesoc'h ha libxml2 2.7.3 pe nevesoc'h ([//bugs.php.net/bug.php?id=45996 draet renablet gant PHP]).\nStaliadur paouezet.",
-    "config-using531": "N'haller ket implijout MediaWiki gant PHP $1 abalamour d'un draen a zegas trubuilh en arventennoù kaset en ur ober dave da <code>__call()</code>.\nHizivait ho reizhiad gant PHP 5.3.2 pe nevesoc'h, pe distroit da PHP 5.3.0 evit renkañ an dra-se.\nStaliadur paouezet.",
+    "config-brokenlibxml": "Ur meskad stummoù PHP ha libxml2 dreinek a vez implijet gant ho reizhiad. Gallout a ra breinañ ar roadennoù e MediaWiki hag en arloadoù web all.\nHizivait da libxml2 2.7.3 pe nevesoc'h ([//bugs.php.net/bug.php?id=45996 draen renablet gant PHP]).\nStaliadur c'hwitet.",
     "config-db-type": "Doare an diaz roadennoù :",
     "config-db-host": "Anv implijer an diaz roadennoù :",
-    "config-db-host-help": "M'emañ ho servijer roadennoù war ur servijer disheñvel, merkit amañ an anv ostiz pe ar chomlec'h IP.\n\nMa rit gant un herberc'hiañ kenrannet, e tlefe ho herberc'hier bezañ pourchaset deoc'h un anv ostiz reizh en teulioù titouriñ.\n\nM'emaoc'h o staliañ ur servijer Windows ha ma rit gant MySQL, marteze ne'z aio ket en-dro \"localhost\" evel anv servijer. Ma ne dro ket, klaskit ober gant \"127.0.0.1\" da chomlec'h IP lechel.",
+    "config-db-host-help": "M'emañ ho servijer roadennoù war ur servijer disheñvel, merkit amañ anv an ostiz pe ar chomlec'h IP.\n\nMa rit gant un herberc'hiañ kenrannet, e tlefe ho herberc'hier bezañ pourchaset deoc'h an anv ostiz reizh en teulioù titouriñ.\n\nM'emaoc'h o staliañ ur servijer Windows ha ma rit gant MySQL, marteze ne'z aio ket en-dro \"localhost\" evel anv servijer. Ma ne dro ket, klaskit ober gant \"127.0.0.1\" da chomlec'h IP lechel.",
     "config-db-host-oracle": "TNS an diaz roadennoù :",
     "config-db-wiki-settings": "Anavezout ar wiki-mañ",
     "config-db-name": "Anv an diaz roadennoù :",
     "config-sqlite-dir": "Kavlec'h roadennoù SQLite :",
     "config-oracle-def-ts": "Esaouenn stokañ (\"tablespace\") dre ziouer :",
     "config-oracle-temp-ts": "Esaouenn stokañ (''tablespace'') da c'hortoz :",
-    "config-type-mysql": "MySQL",
+    "config-type-mysql": "MySQL (pe kenglotus)",
     "config-type-postgres": "PostgreSQL",
     "config-type-sqlite": "SQLite",
     "config-type-oracle": "Oracle",
+    "config-type-mssql": "Microsoft SQL Server",
     "config-support-info": "Skoret eo ar reizhiadoù diaz titouroù da-heul gant MediaWiki :\n\n$1\n\nMa ne welit ket amañ dindan ar reizhiad diaz titouroù a fell deoc'h ober ganti, heuilhit an titouroù a-us (s.o. al liammoù) evit gweredekaat ar skorañ.",
-    "config-support-mysql": "* $1 eo an dibab kentañ evit MediaWiki hag an hini skoret ar gwellañ ([http://www.php.net/manual/en/mysql.installation.php penaos kempunañ PHP gant skor MySQL])",
-    "config-support-postgres": "* Ur reizhiad diaz titouroù brudet ha digor eo $1. Gallout a ra ober evit MySQL ([http://www.php.net/manual/en/pgsql.installation.php Penaos kempunañ PHP gant skor PostgreSQL]). Gallout a ra bezañ un nebeud drein bihan enni ha n'eo ket erbedet he implijout en un endro produiñ.",
-    "config-support-sqlite": "* $1 zo ur reizhiad diaz titouroù skañv skoret eus ar c'hentañ. ([http://www.php.net/manual/en/pdo.installation.php Penaos kempunañ PHP gant skor SQLite], implijout a ra PDO)",
-    "config-support-oracle": "* $1 zo un diaz titouroù kenwerzhel. ([http://www.php.net/manual/en/oci8.installation.php Penaos kempunañ PHP gant skor OCI8])",
+    "config-dbsupport-mysql": "* $1 eo an dibab kentañ evit MediaWiki hag an hini skoret ar gwellañ ([http://www.php.net/manual/en/mysql.installation.php penaos kempunañ PHP gant skor MySQL])",
+    "config-dbsupport-postgres": "* Ur reizhiad diaz titouroù brudet ha digor eo $1. Gallout a ra ober evit MySQL ([http://www.php.net/manual/en/pgsql.installation.php Penaos kempunañ PHP gant skor PostgreSQL]). Gallout a ra bezañ un nebeud drein bihan enni ha n'eo ket erbedet he implijout en un endro produiñ.",
+    "config-dbsupport-sqlite": "* $1 zo ur reizhiad diaz titouroù skañv skoret eus ar c'hentañ. ([http://www.php.net/manual/en/pdo.installation.php Penaos kempunañ PHP gant skor SQLite], implijout a ra PDO)",
+    "config-dbsupport-oracle": "* $1 zo un diaz titouroù kenwerzhel. ([http://www.php.net/manual/en/oci8.installation.php Penaos kempunañ PHP gant skor OCI8])",
     "config-header-mysql": "Arventennoù MySQL",
     "config-header-postgres": "Arventennoù PostgreSQL",
     "config-header-sqlite": "Arventennoù SQLite",
     "config-header-oracle": "Arventennoù Oracle",
+    "config-header-mssql": "Arventennoù Microsoft SQL Server",
     "config-invalid-db-type": "Direizh eo ar seurt diaz roadennoù",
     "config-missing-db-name": "Ret eo deoc'h merkañ un dalvoudenn evit \"Anv an diaz titouroù\"",
     "config-missing-db-host": "Ret eo deoc'h merkañ un dalvoudenn evit \"Ostiz an diaz titouroù\"",
     "config-db-sys-create-oracle": "N'anavez ar stalier nemet ar c'hontoù SYSDBA evit krouiñ kontoù nevez.",
     "config-db-sys-user-exists-oracle": "Bez' ez eus eus ar gont \"$1\" c'hoazh. N'haller ober gant SYSDBA nemet evit krouiñ kontoù nevez !",
     "config-postgres-old": "Rekis eo PostgreSQL $1 pe ur stumm nevesoc'h; ober a rit gant $2.",
+    "config-mssql-old": "Stumm $1 Microsoft SQL Server, pe unan nevesoc'h, zo rekis. Ganeoc'h emañ ar stumm $2.",
     "config-sqlite-name-help": "Dibabit un anv dibar d'ho wiki.\nArabat ober gant esaouennoù pe barrennigoù-stagañ.\nImplijet e vo evit ar restr roadennoù SQLite.",
     "config-sqlite-mkdir-error": "Ur fazi zo bet e-ser krouiñ ar c'havlec'h roadennoù \"$1\".\nGwiriañ al lec'hiadur ha klask en-dro.",
     "config-sqlite-dir-unwritable": "Dibosupl skrivañ er c'havlec'h \"$1\".\nCheñchit ar aotreoù evit ma c'hallfe ar servijer web skrivañ ennañ ha klaskit en-dro.",
     "config-mysql-charset": "Strobad arouezennoù an diaz roadennoù :",
     "config-mysql-binary": "Binarel",
     "config-mysql-utf8": "UTF-8",
+    "config-mssql-auth": "Seut anaoudadur :",
+    "config-mssql-sqlauth": "Anaoudadur SQL Server",
+    "config-mssql-windowsauth": "Anaoudadur Windows",
     "config-site-name": "Anv ar wiki :",
     "config-site-name-help": "Dont a raio war wel e barrenn ditl ar merdeer hag e meur a lec'h all c'hoazh.",
     "config-site-name-blank": "Lakait anv ul lec'hienn .",
     "config-ns-invalid": "Direizh eo an esaouenn anv \"<nowiki>$1</nowiki>\" spisaet.\nMerkit un esaouenn anv disheñvel evit ar raktres.",
     "config-ns-conflict": "Tabut zo etre an esaouenn anv spisaet \"<nowiki>$1</nowiki>\" hag un esaouenn anv dre ziouer eus MediaWiki.\nSpisait un anv raktres esaouenn anv all.",
     "config-admin-box": "Kont merour",
-    "config-admin-name": "Hoc'h anv :",
+    "config-admin-name": "Hoc'h anv-implijer :",
     "config-admin-password": "Ger-tremen :",
     "config-admin-password-confirm": "Adskrivañ ar ger-tremen :",
     "config-admin-help": "Merkit hoc'h anv implijer amañ, da skouer \"Yann Vlog\".\nHemañ eo an anv a implijot evit kevreañ d'ar wiki-mañ.",
     "config-admin-name-blank": "Lakait anv ur merour.",
     "config-admin-name-invalid": "Direizh eo an anv implijer spisaet \"<nowiki>$1</nowiki>\".\nMerkit un anv implijer all.",
     "config-admin-password-blank": "Reiñ ur ger-tremen evit kont ar merour.",
-    "config-admin-password-same": "Ne c'hall ket ar ger-tremen bezañ heñvel ouzh anv ar gont.",
     "config-admin-password-mismatch": "Ne glot ket ar gerioù-tremen hoc'h eus merket an eil gant egile.",
     "config-admin-email": "Chomlec'h postel :",
     "config-admin-email-help": "Merkit ur chomlec'h postel amañ evit gallout resev posteloù a-berzh implijerien all eus ar wiki, adderaouekaat ho ker-tremen ha bezañ kelaouet eus ar c'hemmoù degaset d'ar pajennoù zo en ho roll evezhiañ. Gallout a rit lezel ar vaezienn-mañ goullo.",
     "config-install-user-alreadyexists": "An implijer \"$1\" zo anezhañ dija",
     "config-install-user-create-failed": "Fazi e-ser krouiñ an implijer \"$1\" : $2",
     "config-install-user-grant-failed": "N'eus ket bet gallet reiñ an aotre d'an implijer \"$1\" : $2",
+    "config-install-user-missing": "N'eus ket eus an implijer \"$1\"",
+    "config-install-user-missing-create": "N'eus ket eus an implijer \"$1\".\nMa fell deoc'h krouiñ anezhañ, klikit war ar voest \"krouiñ ur gont\" amañ dindan.",
     "config-install-tables": "Krouiñ taolennoù",
+    "config-install-tables-exist": "<strong>Kemenn :</strong> An taolennoù MediaWiki zo anezho dija war a seblant.\nN'eo ket bet graet ar grouidigezh.",
     "config-install-tables-failed": "'''Fazi :''' c'hwitet eo krouidigezh an daolenn gant ar fazi-mañ : $1",
     "config-install-interwiki": "O leuniañ dre ziouer an daolenn etrewiki",
     "config-install-interwiki-list": "Ne c'haller ket kavout ar restr <code>interwiki.list</code>.",
     "config-install-keys": "Genel an alc'hwezioù kuzh",
     "config-install-sysop": "Krouidigezh kont ar merour",
     "config-install-subscribe-fail": "N'haller ket koumanantiñ da mediawiki-announce : $1",
+    "config-install-subscribe-notpossible": "cURL n'eo ket staliet ha ne c'haller ket ober gant allow_url_fopen.",
     "config-install-mainpage": "O krouiñ ar bajenn bennañ gant un endalc'had dre ziouer",
     "config-install-extension-tables": "O krouiñ taolennoù evit an astennoù gweredekaet",
     "config-install-mainpage-failed": "Ne c'haller ket ensoc'hañ ar bajenn bennañ: $1",
     "config-nofile": "N'eus ket bet gallet kavout ar restr \"$1\". Daoust ha dilamet eo bet ?",
     "mainpagetext": "'''Meziant MediaWiki staliet.'''",
     "mainpagedocfooter": "Sellit ouzh [//meta.wikimedia.org/wiki/Help:Contents Sturlevr an implijerien] evit gouzout hiroc'h war an doare da implijout ar meziant wiki.\n\n== Kregiñ ganti ==\n\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Roll an arventennoù kefluniañ]\n* [//www.mediawiki.org/wiki/Manual:FAQ FAG MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Roll ar c'haozeadennoù diwar-benn dasparzhoù MediaWiki]\n* [//www.mediawiki.org/wiki/Localisation#Translation_resources Lec'hiañ MediaWiki en ho yezh"
-}
\ No newline at end of file
+}
index f876673..e0b37b8 100644 (file)
@@ -56,4 +56,4 @@
     "config-admin-password": "Šifra:",
     "mainpagetext": "'''MediaViki softver is uspješno instaliran.'''",
     "mainpagedocfooter": "Kontaktirajte [//meta.wikimedia.org/wiki/Help:Contents uputstva za korisnike] za informacije o upotrebi wiki programa.\n\n== Početak ==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Lista postavki]\n* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki najčešće postavljana pitanja]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lista E-Mail adresa MediaWiki]"
-}
\ No newline at end of file
+}
index 9270e07..56a8adc 100644 (file)
     "@metadata": {
         "authors": [
             "Pitort",
-            "පසිඳු කාවින්ද"
+            "පසිඳු කාවින්ද",
+            "Kippelboy",
+            "Toniher"
         ]
     },
+    "config-desc": "L'instal·lador del MediaWiki",
+    "config-title": "Instal·lació del MediaWiki $1",
+    "config-information": "Informació",
+    "config-localsettings-upgrade": "S'ha detectat un fitxer <code>LocalSettings.php</code>. \nPer tal d'actualitzar la instal·lació, introduïu el valor de <code>$wgUpgradeKey</code> en el quadre a continuació. El trobareu a <code>LocalSettings.php</code>.",
+    "config-localsettings-cli-upgrade": "S'ha detectat un fitxer <code>LocalSettings.php</code>.\nPer tal d'actualitzar la instal·lació, executeu <code>update.php</code>.",
+    "config-localsettings-key": "Clau d'actualització:",
+    "config-localsettings-badkey": "La clau que heu proporcionat no és correcta.",
+    "config-upgrade-key-missing": "S'ha detectat una instal·lació ja existent del MediaWiki.\nPer actualitzar-la, poseu la línia següent al final de <code>LocalSettings.php</code>:\n\n$1",
+    "config-localsettings-incomplete": "El <code>LocalSettings.php</code> que hi ha sembla incomplet.\nLa variable $1 no està definida.\nCanvieu <code>LocalSettings.php</code> perquè la variable estigui definida i feu clic a «{{int:Config-continue}}».",
+    "config-localsettings-connection-error": "S'ha trobat un error en connectar-se amb la base de dades fent servir els paràmetres especificats a <code>LocalSettings.php</code> o <code>AdminSettings.php</code>. Corregiu aquests paràmetres i torneu-ho a provar.\n\n$1",
+    "config-session-error": "Error en iniciar la sessió: $1",
+    "config-your-language": "La vostra llengua:",
+    "config-your-language-help": "Seleccioneu la llengua que s'utilitzarà durant el procés d'instal·lació.",
+    "config-wiki-language": "Llengua del wiki:",
+    "config-wiki-language-help": "Seleccioneu la llengua principal del wiki.",
+    "config-back": "← Enrere",
+    "config-continue": "Continua →",
     "config-page-language": "Llengua",
+    "config-page-welcome": "Us donem la benvinguda al MediaWiki!",
+    "config-page-dbconnect": "Connecta a la base de dades",
+    "config-page-upgrade": "Actualitza una instal·lació ja existent",
+    "config-page-dbsettings": "Paràmetres de la base de dades",
     "config-page-name": "Nom",
+    "config-page-options": "Opcions",
+    "config-page-install": "Instal·la",
+    "config-page-complete": "S'ha completat!",
+    "config-page-restart": "Reinicia la instal·lació",
+    "config-page-readme": "Llegeix-me",
+    "config-page-releasenotes": "Notes de la versió",
+    "config-page-copying": "S'està copiant",
+    "config-page-upgradedoc": "S'està actualitzant",
+    "config-page-existingwiki": "Wiki ja existent",
+    "config-help-restart": "Voleu esborrar totes les dades que heu introduït i tornar a començar el procés d'instal·lació?",
+    "config-restart": "Sí, torna a començar",
+    "config-welcome": "=== Comprovacions de l'entorn ===\nS'efectuaran comprovacions bàsiques per veure si l'entorn és adequat per a la instal·lació del MediaWiki.\nRecordeu d'incloure aquesta informació si heu de demanar ajuda sobre com completar la instal·lació.",
+    "config-env-good": "S'ha comprovat l'entorn.\nPodeu instal·lar el MediaWiki.",
+    "config-env-bad": "S'ha comprovat l'entorn.\nNo podeu instal·lar el MediaWiki.",
+    "config-env-php": "El PHP $1 està instal·lat.",
+    "config-env-php-toolow": "El PHP $1 està instal·lat.\nMalauradament, el MediaWiki necessita el PHP $2 o superior.",
+    "config-diff3-bad": "No s'ha trobat el GNU diff3.",
+    "config-git": "S'ha trobat el programari de control de versions Git: <code>$1</code>.",
+    "config-git-bad": "No s'ha trobat el programari de control de versions Git.",
+    "config-no-uri": "'''Error:''' No s'ha pogut determinar l'URI actual. S'ha interromput la instal·lació.",
+    "config-no-cli-uri": "'''Avís:''' No s'ha especificat un <code>--scriptpath</code>. S'utilitza el valor per defecte: <code>$1</code>.",
+    "config-using-server": "S'utilitza el nom del servidor «<nowiki>$1</nowiki>».",
+    "config-using-uri": "S'utilitza l'URL del servidor «<nowiki>$1$2</nowiki>».",
+    "config-db-type": "Tipus de base de dades:",
+    "config-db-host": "Servidor de la base de dades:",
+    "config-db-wiki-settings": "Identifica aquest wiki",
+    "config-db-name": "Nom de la base de dades:",
+    "config-db-name-help": "Trieu un nom que identifiqui el wiki.\nNo ha de contenir espais.\n\nSi esteu fent servir un hostatge web compartit, el vostre proveïdor us proporcionarà un nom específic per a la base de dades o us permetrà crear base de dades des d'un tauler de control.",
+    "config-db-name-oracle": "Esquema de la base de dades:",
+    "config-db-install-account": "Compte d'usuari per a la instal·lació",
+    "config-db-username": "Nom d'usuari de la base de dades:",
+    "config-db-password": "Contrasenya de la base de dades:",
+    "config-db-username-empty": "Heu d'introduir un valor per a «{{int:config-db-username}}»",
+    "config-db-account-lock": "Utilitzeu el mateix nom d'usuari i contrasenya durant una operació normal",
+    "config-db-wiki-account": "Compte d'usuari per al funcionament normal",
+    "config-db-wiki-help": "Introduïu el nom d'usuari i la contrasenya que s'utilitzarà per connectar-se a la base de dades durant l'operació normal del wiki.\nSi el compte no existeix, i el compte d'instal·lació té prou privilegis, es crearà aquest compte d'usuari amb els privilegis mínims necessaris per operar el wiki.",
+    "config-db-prefix": "Prefix de la base de dades:",
+    "config-db-prefix-help": "Si heu de compartir una base de dades entre diversos wikis, o entre el MediaWiki i una altra aplicació web, podeu afegir un prefix al tots els noms de taula per tal d'evitar conflictes.\nNo utilitzeu espais.\n\nAquest camp acostuma a quedar en blanc.",
+    "config-db-charset": "Joc de caràcters de la base de dades",
+    "config-charset-mysql5-binary": "Binari de MySQL 4.1/5.0",
     "config-charset-mysql5": "MySQL 4.1/5.0 UTF-8",
+    "config-db-port": "Port de la base de dades:",
+    "config-db-schema": "Esquema per a MediaWiki:",
+    "config-db-schema-help": "Aquest esquema normalment ja serveix.\nNomés canvieu-lo si sabeu què us feu.",
+    "config-pg-test-error": "No es pot connectar a la base de dades '''$1''': $2",
+    "config-sqlite-dir": "Directori de dades de l'SQLite",
+    "config-oracle-def-ts": "Espai de taules per defecte:",
+    "config-oracle-temp-ts": "Espai de taules temporal:",
+    "config-type-mysql": "MySQL (o compatible)",
+    "config-type-mssql": "Microsoft SQL Server",
+    "config-header-mysql": "Paràmetres de MySQL",
+    "config-invalid-db-type": "Tipus de base de dades no vàlid",
+    "config-missing-db-name": "Heu d'introduir un valor per al «nom de la base de dades»",
+    "config-missing-db-host": "Heu d'introduir un valor per al «servidor de la base de dades»",
+    "config-sqlite-readonly": "El fitxer <code>$1</code> no es pot escriure.",
+    "config-sqlite-cant-create-db": "No s'ha pogut crear el fitxer de base de dades <code>$1</code>.",
+    "config-upgrade-done-no-regenerate": "S'ha completat l'actualització.\n\nJa podeu [$1 començar a utilitzar el wiki].",
+    "config-regenerate": "Torna a generar el LocalSettings.php →",
+    "config-show-table-status": "La consulta <code>SHOW TABLE STATUS</code> ha fallat!",
+    "config-db-web-account": "Compte de la base de dades per a l'accés web",
+    "config-db-web-account-same": "Utilitza el mateix compte que a la instal·lació",
+    "config-db-web-create": "Crea el compte si no existeix encara",
+    "config-db-web-no-create-privs": "El compte que heu especificat a la instal·lació no té suficients privilegis per crear un compte. El compte que especifiqueu aquí ja ha d'existir.",
+    "config-mysql-engine": "Motor d'emmagatzemament:",
     "config-mysql-innodb": "InnoDB",
     "config-mysql-myisam": "MyISAM",
+    "config-mysql-binary": "Binari",
     "config-mysql-utf8": "UTF-8",
+    "config-mssql-auth": "Tipus d'autenticació:",
+    "config-site-name": "Nom del wiki:",
+    "config-site-name-blank": "Introduïu un nom per al lloc.",
+    "config-project-namespace": "Espai de noms del projecte:",
     "config-ns-generic": "Projecte",
+    "config-ns-site-name": "El mateix que el nom del wiki: $1",
+    "config-ns-other": "Un altre (especifiqueu-lo)",
+    "config-ns-other-default": "MonWiki",
+    "config-admin-box": "Compte de l'administrador",
+    "config-admin-name": "El vostre nom d'usuari:",
     "config-admin-password": "Contrasenya:",
+    "config-admin-password-confirm": "Repetiu la contrasenya:",
+    "config-admin-help": "Introduïu el vostre nom d'usuari preferit, per exemple «Pep Bloggs».\nAquest és el nom que fareu servir per iniciar una sessió al wiki.",
+    "config-admin-name-blank": "Introduïu un nom d'usuari d'administrador.",
+    "config-admin-name-invalid": "El nom d'usuari especificat «<nowiki>$1</nowiki>» no és vàlid.\nEspecifiqueu un nom d'usuari diferent.",
+    "config-admin-password-blank": "Introduïu una contrasenya per al compte d'administrador.",
+    "config-admin-password-mismatch": "Les dues contrasenyes que heu introduït no coincideixen.",
+    "config-admin-email": "Adreça electrònica:",
+    "config-admin-error-bademail": "Heu introduït una adreça electrònica no vàlida.",
+    "config-almost-done": "Gairebé ja heu acabat!\nPodeu ometre el que queda de la configuració i procedir amb la instal·lació del wiki.",
+    "config-optional-continue": "Fes-me més preguntes.",
+    "config-optional-skip": "Ja estic avorrit. Simplement instal·leu el wiki.",
+    "config-profile": "Perfil de permisos d'usuari:",
     "config-profile-wiki": "Wiki públic",
+    "config-profile-no-anon": "Cal la creació d'un compte",
+    "config-profile-fishbowl": "Només editors autoritzats",
     "config-profile-private": "Wiki privat",
+    "config-license": "Copyright i llicència:",
+    "config-license-none": "Sense llicència al peu de pàgina",
     "config-license-pd": "Domini públic",
+    "config-email-settings": "Paràmetres del correu electrònic",
+    "config-email-user": "Habilita el correu electrònic usuari-a-usuari",
+    "config-email-user-help": "Permet que tots els usuaris puguin enviar-se correu si ho han habilitat a les preferències.",
+    "config-email-usertalk": "Habilita la notificació a la pàgina de discussió de l'usuari",
+    "config-email-watchlist": "Habilita la notificació de la llista de seguiment",
+    "config-email-watchlist-help": "Permet als usuaris rebre notificacions de les pàgines que segueixen si ho han habilitat a les preferències.",
+    "config-email-auth": "Habilita l'autenticació per correu electrònic",
+    "config-email-sender": "Adreça electrònica de retorn:",
+    "config-upload-settings": "Imatges i càrregues de fitxers",
+    "config-upload-enable": "Habilita la càrrega de fitxers",
     "config-upload-deleted": "Directori pels arxius suprimits:",
+    "config-logo": "URL del logo:",
+    "config-instantcommons": "Habilita Instant Commons",
+    "config-cc-again": "Torneu-ho a triar...",
+    "config-cc-not-chosen": "Trieu quina llicència Creative Commons voleu i feu clic a «procedeix».",
     "config-advanced-settings": "Configuració avançada",
+    "config-cache-options": "Configuració per a la memòria cau dels objectes:",
+    "config-memcached-servers": "Servidors de Memcache:",
     "config-extensions": "Extensions",
-    "mainpagetext": "'''El programari del MediaWiki s'ha instaŀlat correctament.'''",
-    "mainpagedocfooter": "Consulteu la [//meta.wikimedia.org/wiki/Help:Contents Guia d'Usuari] per a més informació sobre com utilitzar-lo.\n\n== Per a començar ==\n\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Llista de característiques configurables]\n* [//www.mediawiki.org/wiki/Manual:FAQ PMF del MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Llista de correu (''listserv'') per a anuncis del MediaWiki]"
-}
\ No newline at end of file
+    "config-install-step-done": "fet",
+    "config-install-step-failed": "ha fallat",
+    "config-install-extensions": "S'estan incloent les extensions",
+    "config-install-database": "S'està configurant la base de dades",
+    "config-install-schema": "S'està creant l'esquema",
+    "config-install-pg-commit": "S'estan trametent els canvis",
+    "config-install-user": "S'està creant l'usuari de la base de dades",
+    "config-install-user-alreadyexists": "L'usuari «$1» ja existeix",
+    "config-install-user-create-failed": "La creació de l'usuari «$1» ha fallat: $2",
+    "config-install-user-missing": "L'usuari «$1» especificat no existeix.",
+    "config-install-user-missing-create": "L'usuari «$1» especificat no existeix.\nFeu clic a la casella «Crea un compte» a continuació si voleu crear-lo.",
+    "config-install-tables": "S'estan creant les taules",
+    "config-install-tables-exist": "'''Avís:''' sembla que les taules del MediaWiki tables ja existeixen. Se n'omet la creació.",
+    "config-install-tables-failed": "'''Error:''' la creació de la taula ha fallat amb l'error següent: $1",
+    "config-install-interwiki": "S'està emplenant la taula per defecte d'interwiki",
+    "config-install-interwiki-list": "No s'ha pogut llegir el fitxer <code>interwiki.list</code>.",
+    "config-install-interwiki-exists": "'''Avís:''' La taula d'interwiki sembla que ja té entrades. S'omet la llista per defecte.",
+    "config-install-stats": "S'estan inicialitzant les estadístiques",
+    "config-install-keys": "S'estan generant les claus secretes",
+    "config-install-sysop": "S'està creant un compte d'usuari d'administrador",
+    "config-install-subscribe-fail": "No s'ha pogut subscriure a mediawiki-announce: $1",
+    "config-install-mainpage": "S'està creant la pàgina principal amb el contingut per defecte",
+    "config-install-extension-tables": "S'estan creant taules de les extensions habilitades",
+    "config-install-mainpage-failed": "No s'ha pogut inserir la pàgina principal: $1",
+    "config-download-localsettings": "Baixa <code>LocalSettings.php</code>",
+    "config-help": "ajuda",
+    "config-nofile": "No s'ha pogut trobar el fitxer «$1». S'ha suprimit?",
+    "mainpagetext": "'''El MediaWiki s'ha instal·lat correctament.'''",
+    "mainpagedocfooter": "Consulteu la [//meta.wikimedia.org/wiki/Help:Contents Guia d'Usuari] per a més informació sobre com utilitzar-lo.\n\n== Per a començar ==\n\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Llista de característiques configurables]\n* [//www.mediawiki.org/wiki/Manual:FAQ PMF del MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Llista de correu (''listserv'') per a anuncis del MediaWiki]\n* [//www.mediawiki.org/wiki/Localisation#Translation_resources Traduïu MediaWiki en la vostra llengua]"
+}
index 944f52b..2653922 100644 (file)
@@ -5,16 +5,77 @@
             "Умар"
         ]
     },
+    "config-desc": "MediaWiki инсталлятор",
+    "config-title": "ХӀоттор MediaWiki $1",
+    "config-information": "Хаам",
+    "config-localsettings-key": "Карлаяккхаран догӀа:",
+    "config-localsettings-badkey": "Ахьа яздина нийса доцу догӀа",
     "config-your-language": "Хьан мотт:",
+    "config-back": "← Юха",
     "config-continue": "Кхин дӀа →",
     "config-page-language": "Мотт",
+    "config-page-welcome": "Марша догӀийла MediaWiki чу!",
     "config-page-name": "ЦӀе",
+    "config-page-options": "Параметраш",
+    "config-page-install": "ХӀоттор",
+    "config-page-complete": "Кийчча ю!",
+    "config-page-restart": "Юху доладе дӀахӀоттор",
+    "config-page-readme": "Еша со",
+    "config-page-releasenotes": "Версех лаьцна хаам",
+    "config-page-copying": "Лицензи",
+    "config-page-upgradedoc": "Карлаяккхар",
+    "config-page-existingwiki": "Йолуш йолу вики",
+    "config-copyright": "=== Авторан бакъонаш а хьал а ===\n\n$1\nMediaWiki ю маьрша программин латораг, шу йиш ю фондас арахецна йолу GNU General Public License лицензица и яржо я хийца а.\n\nMediaWiki яржош ю и шуна пайдане хир яц те аьлла, амма цхьа юкъарахилар доцуш. Хь. кхин. лицензи мадарра GNU General Public License .\n\nШоьга кхача езаш яра [{{SERVER}}{{SCRIPTPATH}}/COPYING копи GNU General Public License] хӀокху программица, кхаьчна яцахь язъе Free Software Foundation, Inc., адрес тӀе: 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA я [//www.gnu.org/licenses/old-licenses/gpl-2.0.html еша и онлайнехь].",
     "config-no-fts3": "'''Тергам бе''': SQLite гулйина хуттург йоцуш [//sqlite.org/fts3.html FTS3] — лахар болхбеш хир дац оцу бухца.",
+    "config-no-cli-uri": "'''ДӀахьедар''': <code>--scriptpath</code> параметр язйина яц, иза Ӏад йитарца лелош ю: <code>$1</code> .",
+    "config-db-name": "Хаамийн базан цӀе:",
+    "config-db-charset": "Базан хаамийн символийн гулам",
+    "config-charset-mysql5-binary": "MySQL 4.1/5.0 бинаран",
+    "config-charset-mysql5": "MySQL 4.1/5.0 UTF-8",
+    "config-type-mssql": "Microsoft SQL Server",
+    "config-header-mssql": "Microsoft SQL Server параметраш",
+    "config-invalid-db-type": "Хаамийн базан нийса йоцу тайп",
+    "config-invalid-db-server-oracle": "Хаамийн базан «$1» нийса йоцу TNS.\nЛелае «TNS Name», я могӀа «Easy Connect» ([http://docs.oracle.com/cd/E11882_01/network.112/e10836/naming.htm ЦӀераш техкаран кеп Oracle])",
+    "config-mysql-utf8": "UTF-8",
+    "config-mssql-auth": "Аутентификацин тайп:",
     "config-site-name": "Викин цӀе:",
     "config-site-name-blank": "Язъе сайтан цӀе.",
+    "config-project-namespace": "ЦӀерийн ана проектан:",
+    "config-ns-generic": "Проект",
+    "config-admin-password-confirm": "Кхин цӀа пароль:",
+    "config-profile-wiki": "Елин вики",
+    "config-profile-no-anon": "ДӀаяздар кхолла деза",
+    "config-profile-fishbowl": "ДӀаяздарш долу тадархошна бен",
+    "config-profile-private": "ДӀачӀаьгӀна вики",
     "config-license": "Авторан бакъонаш а лицензи а:",
+    "config-license-cc-by-sa": "Creative Commons Attribution Share Alike",
+    "config-license-cc-by": "Creative Commons Attribution",
+    "config-license-cc-by-nc-sa": "Creative Commons Attribution Non-Commercial Share Alike",
+    "config-license-cc-0": "Creative Commons Zero (юкъаралин рицӀкъ)",
+    "config-license-gfdl": "GNU Free Documentation License 1.3 я кхин хьалха хиларг",
     "config-license-pd": "Юкъараллин хьал",
+    "config-license-cc-choose": "Харжа цхьа лицензи Creative Commons",
+    "config-email-settings": "Электронан почта нисяр",
+    "config-enable-email": "Латае дӀайохьуьйту e-mail",
+    "config-upload-deleted": "ДӀаяхна файлийн директори:",
+    "config-cc-again": "Хьаржа кхин цӀа…",
+    "config-install-user": "Декъашхочун хаамийн база кхоллар",
+    "config-install-user-alreadyexists": "Декъашхо «$1» хӀинцале волуш ву",
+    "config-install-user-create-failed": "Декъашхо «$1» кхолла цаделира: $2",
+    "config-install-user-grant-failed": "Декъашхочун «$1» бакъонаш яларан гӀалат: $2",
+    "config-install-user-missing": "Билгалвина декъашхо «$1» вац.",
+    "config-install-tables": "Таблицаш кхоллар",
+    "config-install-tables-exist": "'''ДӀахьедар''': MediaWiki таблицаш, йолуш хила там бу.\nЮха кхоллар чекхдалийтар.",
+    "config-install-tables-failed": "'''ГӀалат''': Таблица кхолла таро яц гӀалат бахьнехь: $1",
+    "config-install-interwiki-list": "Файл <code>interwiki.list</code> каро цаелира.",
+    "config-install-stats": "Инициализацин статистика",
+    "config-install-keys": "Къайлаха долу догӀанаш кхоллар",
+    "config-install-sysop": "Куьйгалхочун дӀаяздар кхоллар",
+    "config-install-subscribe-notpossible": "cURL дӀахӀоттийна яц я тӀекхочехь яц опци allow_url_fopen.",
+    "config-install-mainpage-failed": "Коьрта агӀо йилла цатарло: $1",
+    "config-download-localsettings": "Чуяккха <code>LocalSettings.php</code>",
     "config-help": "гӀо",
+    "config-nofile": "Файл \"$1\" каро цаелира. И дӀаяьккхина ярий?",
     "mainpagetext": "'''Вики-белха гlирс «MediaWiki» кхочуш дика дlахlоттийна.'''",
     "mainpagedocfooter": "Викийца болх бан хаамаш карор бу хlокху чохь [//meta.wikimedia.org/wiki/%D0%9F%D0%BE%D0%BC%D0%BE%D1%89%D1%8C:%D0%A1%D0%BE%D0%B4%D0%B5%D1%80%D0%B6%D0%B0%D0%BD%D0%B8%D0%B5 нисвохааман куьйгаллица].\n\n== Цхьаболу пайде гlирсаш ==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Гlирс нисбан тарлушболу могlам];\n* [//www.mediawiki.org/wiki/Manual:FAQ Сих сиха лушдолу хаттарш а жоьпаш оцу MediaWiki];\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Хаам бохьуьйту араяларца башхонца керла MediaWiki]."
-}
\ No newline at end of file
+}
index 8d4f46a..c82aa6d 100644 (file)
@@ -1,7 +1,5 @@
 {
-    "@metadata": {
-        "authors": []
-    },
+    "@metadata": [],
     "mainpagetext": "'''Malamposon ang pag-instalar sa MediaWiki.'''",
     "mainpagedocfooter": "Konsultaha ang [//meta.wikimedia.org/wiki/Help:Contents Giya sa mga gumagamit] alang sa impormasyon unsaon paggamit niining wiki nga software.\n\n== Pagsugod ==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Listahan sa mga setting sa kompigurasyon]\n* [//www.mediawiki.org/wiki/Manual:FAQ FAQ sa MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce  Mailing list sa mga release sa MediaWiki]"
-}
\ No newline at end of file
+}
index 9319178..76b65da 100644 (file)
@@ -6,6 +6,8 @@
             "Muhammed taha"
         ]
     },
+    "config-information": "زانیاری",
+    "config-your-language": "زمانەکەت:",
     "config-wiki-language": "زمانی ویکی:",
     "config-back": "→ گەڕانەوە",
     "config-continue": "بەردەوامبوون ←",
     "config-restart": "بەڵێ، دەستی پێ بکەرەوە",
     "config-env-php": "PHP $1 دابەزێندرا.",
     "config-env-php-toolow": "PHP $1 دابەزێندرا.\nھەرچۆنێک بێت میدیاویکی پێویستی بە PHP $2 یان بەرزتر ھەیە.",
+    "config-db-name": "ناوی بنکەدراوە:",
+    "config-db-username": "ناوی بەکارھێنەری بنکەدراوە:",
+    "config-db-password": "تێپەڕوشەی بنکەدراوە",
+    "config-site-name": "ناوی ویکی:",
+    "config-ns-generic": "پرۆژە",
+    "config-admin-password": "تێپەڕوشە:",
+    "config-admin-email": "ناونیشانی ئیمەیل:",
+    "config-install-step-done": "کرا",
+    "config-help": "یارمەتی",
     "mainpagetext": "'''میدیاویکی بە سەرکەوتوویی دامەزرا.'''",
     "mainpagedocfooter": "لە [//meta.wikimedia.org/wiki/Help:Contents ڕێنوێنیی بەکارھێنەران] بۆ زانیاری سەبارەت بە بەکارھێنانی نەرمامێری ویکی کەڵک وەربگرە.\n\n== دەستپێکردن ==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings پێرستی ڕێکخستنەکانی شێوەپێدان]\n* [//www.mediawiki.org/wiki/Manual:FAQ پرسیارە دووپاتکراوەکانی میدیاویکی (MediaWiki FAQ)]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce پێرستی ئیمەیلی وەشانەکانی میدیاویکی]\n* [//www.mediawiki.org/wiki/Localisation#Translation_resources خۆماڵیکردنی ویکیمیدیا بۆ زمانەکەت]"
-}
\ No newline at end of file
+}
index 6b2a372..cd942e7 100644 (file)
@@ -6,4 +6,4 @@
     },
     "mainpagetext": "'''Madalag-on nga na-install ang MediaWiki.'''",
     "mainpagedocfooter": "Kunsultahon ang [//meta.wikimedia.org/wiki/Help:Pagtuytoy sa Manug-usar] para sa impormasyon sa paggamit sang wiki nga \"software\".\n\n==Pag-umpisa==\n\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Lista sang mga setting sang konpigurayon]\n* [//www.mediawiki.org/wiki/Manual:FAQ Mga perme napangkot sa MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lista sang mga ginapadal-an sang sulat sang MediaWiki]"
-}
\ No newline at end of file
+}
index 738cdb1..6e019e4 100644 (file)
@@ -1,7 +1,5 @@
 {
-    "@metadata": {
-        "authors": []
-    },
+    "@metadata": [],
     "mainpagetext": "'''MediaWiki мувафакъиетнен къурулды.'''",
     "mainpagedocfooter": "Бу викининъ ёл-ёругъыны [//meta.wikimedia.org/wiki/Help:Contents User's Guide къулланыджы къылавузындан] огренип оласынъыз.\n\n== Базы файдалы сайтлар ==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Олуджы сазламалар джедвели];\n* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki боюнджа сыкъ берильген суаллернен джеваплар];\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki-нинъ янъы версияларынынъ чыкъувындан хабер йиберюв]."
-}
\ No newline at end of file
+}
index b0dcc1f..34ab041 100644 (file)
@@ -1,7 +1,5 @@
 {
-    "@metadata": {
-        "authors": []
-    },
+    "@metadata": [],
     "mainpagetext": "'''MediaWiki muvafaqiyetnen quruldı.'''",
     "mainpagedocfooter": "Bu vikiniñ yol-yoruğını [//meta.wikimedia.org/wiki/Help:Contents User's Guide qullanıcı qılavuzından] ögrenip olasıñız.\n\n== Bazı faydalı saytlar ==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Olucı sazlamalar cedveli];\n* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki boyunca sıq berilgen suallernen cevaplar];\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki-niñ yañı versiyalarınıñ çıquvından haber yiberüv]."
-}
\ No newline at end of file
+}
index 939581e..23760f0 100644 (file)
@@ -4,7 +4,9 @@
             "Danny B.",
             "Jezevec",
             "Mormegil",
-            "아라"
+            "아라",
+            "Matěj Grabovský",
+            "Paxt"
         ]
     },
     "config-desc": "Instalační program pro MediaWiki",
@@ -16,7 +18,7 @@
     "config-localsettings-badkey": "Zadaný klíč je nesprávný.",
     "config-upgrade-key-missing": "Byla detekována existující instalace MediaWiki.\nPokud ji chcete aktualizovat, přidejte následující řádku na konec souboru <code>LocalSettings.php</code>:\n\n$1",
     "config-localsettings-incomplete": "Existující soubor <code>LocalSettings.php</code> vypadá neúplný.\nNení nastavena proměnná $1.\nUpravte soubor <code>LocalSettings.php</code> tak, aby tuto proměnnou obsahoval, a klikněte na „{{int:Config-continue}}“.",
-    "config-localsettings-connection-error": "Při připojování k databázi s využitím nastavení uvedených v <code>LocalSettings.php</code> nebo <code>AdminSettings.php</code> došlo k chybě. Opravte tato nastavení a zkuste to znovu.\n\n$1",
+    "config-localsettings-connection-error": "Při připojování k databázi s využitím nastavení uvedených v <code>LocalSettings.php</code> došlo k chybě. Opravte tato nastavení a zkuste to znovu.\n\n$1",
     "config-session-error": "Nepodařilo se inicializovat relaci: $1",
     "config-session-expired": "Platnost dat vašeho sezení patrně vypršela.\nSezení má nastavenu životnost $1.\nProdloužit ji můžete nastavením <code>session.gc_maxlifetime</code> v php.ini.\nSpusťte instalační proces od začátku.",
     "config-no-session": "Data vašeho sezení se ztratila!\nZkontrolujte svůj soubor php.ini a ujistěte se, že <code>session.save_path</code> je nastaveno na odpovídající adresář.",
     "config-unicode-using-intl": "Pro normalizaci Unicode se používá [http://pecl.php.net/intl PECL rozšíření intl].",
     "config-unicode-pure-php-warning": "'''Upozornění''': Není dostupné [http://pecl.php.net/intl PECL rozšíření intl] pro normalizaci Unicode, bude se využívat pomalá implementace v čistém PHP.\nPokud provozujete wiki s velkým provozem, měli byste si přečíst něco o [//www.mediawiki.org/wiki/Unicode_normalization_considerations normalizaci Unicode].",
     "config-unicode-update-warning": "'''Upozornění''': Nainstalovaná verze vrstvy pro normalizaci Unicode používá starší verzi knihovny [http://site.icu-project.org/ projektu ICU].\nPokud vám aspoň trochu záleží na používání Unicode, měli byste [//www.mediawiki.org/wiki/Unicode_normalization_considerations ji aktualizovat].",
-    "config-no-db": "Nepodařilo se nalézt vhodný databázový ovladač! Musíte do PHP nainstalovat databázový ovladač.\nJsou podporovány následující typy databází: $1.\n\nPokud jste na sdíleném hostingu, požádejte svého poskytovale o instalaci vhodného databázového ovladače.\nPokud jste si PHP přeložili sami, překonfigurujte ho se zapnutým databázovým klientem, například pomocí <code>./configure --with-mysql</code>.\nPokud jste PHP nainstalovali z balíčku Debian či Ubuntu, potřebujete nainstalovat také modul php5-mysql.",
+    "config-no-db": "Nepodařilo se nalézt vhodný databázový ovladač! Musíte do PHP nainstalovat databázový ovladač.\nJsou podporovány následující typy databází: $1.\n\nPokud jste si PHP přeložili sami, překonfigurujte ho se zapnutým databázovým klientem, například pomocí <code>./configure --with-mysql</code>.\nPokud jste PHP nainstalovali z balíčku Debian či Ubuntu, potřebujete nainstalovat také modul php5-mysql.",
     "config-outdated-sqlite": "'''Upozornění''': Máte SQLite $1, které je starší než minimálně vyžadovaná verze $2. SQLite nebude dostupné.",
     "config-no-fts3": "'''Upozornění''': SQLite bylo přeloženo bez [//sqlite.org/fts3.html modulu FTS3], funkce pro vyhledávání zde nebudou dostupné.",
     "config-register-globals": "'''Upozornění: Je zapnuta PHP volba <code>[http://php.net/register_globals register_globals]</code>.'''\n'''Pokud můžete, vypněte ji.'''\nMediaWiki bude fungovat, ale váš server je vystaven potenciálním bezpečnostním hrozbám.",
     "config-magic-quotes-runtime": "'''Kritická chyba: Je zapnuto [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-runtime magic_quotes_runtime]!'''\nToto nastavení nepředvídatelně poškozuje vstupní data.\nMediaWiki nelze nainstalovat ani používat, dokud není toto nastavení vypnuto.",
     "config-magic-quotes-sybase": "'''Kritická chyba: Je zapnuto [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-sybase magic_quotes_sybase]!'''\nToto nastavení nepředvídatelně poškozuje vstupní data.\nMediaWiki nelze nainstalovat ani používat, dokud není toto nastavení vypnuto.",
     "config-mbstring": "'''Kritická chyba: Je zapnuto [http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload]!'''\nToto nastavení způsobuje chyby a může nepředvídatelně poškozovat vstupní data.\nMediaWiki nelze nainstalovat ani používat, dokud není toto nastavení vypnuto.",
-    "config-ze1": "'''Kritická chyba: Je zapnut [http://www.php.net/manual/en/ini.core.php zend.ze1_compatibility_mode]!'''\nToto nastavení způsobuje s MediaWiki příšerné chyby.\nMediaWiki nelze nainstalovat ani používat, dokud není toto nastavení vypnuto.",
     "config-safe-mode": "'''Upozornění:''' Je aktivní [http://www.php.net/features.safe-mode bezpečný režim] PHP.\nMůže způsobovat potíže, zejména při použití načítání souborů a podpory <code>math</code>.",
     "config-xml-bad": "Chybí XML modul pro PHP.\nMediaWiki potřebuje funkce v tomto modulu a v této konfiguraci nebude fungovat.\nPokud běžíte na Mandrake, nainstalujte balíček php-xml.",
-    "config-pcre": "Zdá se, že modul s podporou PCRE chybí.\nMediaWiki ke své činnosti potřebuje funkce pro Perl-kompatibilní regulární výrazy.",
+    "config-pcre-old": "'''Kritická chyba:''' Je vyžadováno PCRE verze $1 nebo novější.\nVaše binárka PHP obsahuje PCRE $2.\n[https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/PCRE Více informací.]",
     "config-pcre-no-utf8": "'''Kritická chyba''': PHP modul PCRE byl zřejmě přeložen bez podpory PCRE_UTF8.\nMediaWiki vyžaduje ke správné funkci podporu UTF-8.",
     "config-memory-raised": "<code>memory_limit</code> v PHP byl nastaven na $1, zvýšen na $2.",
     "config-memory-bad": "'''Upozornění:''' <code>memory_limit</code> je v PHP nastaven na $1.\nTo je pravděpodobně příliš málo.\nInstalace může selhat!",
     "config-gd": "Nalezena vestavěná grafická knihovna GD.\nPokud povolíte načítání souborů, bude zapnuto vytváření náhledů.",
     "config-no-scaling": "Nebyla nalezena knihovna GD ani ImageMagick.\nVytváření náhledů bude vypnuto.",
     "config-no-uri": "'''Chyba:''' Nepodařilo se určit aktuální URI.\nInstalace přerušena.",
-    "config-no-cli-uri": "'''Upozornění''': Nebylo uvedeno --scriptpath, používá se implicitní hodnota: <code>$1</code>.",
+    "config-no-cli-uri": "<strong>Upozornění</strong>: Nebylo uvedeno <code>--scriptpath</code>, používá se implicitní hodnota: <code>$1</code>.",
     "config-using-server": "Použito jméno serveru „<nowiki>$1</nowiki>“.",
     "config-using-uri": "Použito URL serveru „<nowiki>$1$2</nowiki>“.",
     "config-uploads-not-safe": "'''Upozornění:''' Váš implicitní adresář pro načítání souborů <code>$1</code> umožňuje provádění libovolných skriptů.\nPřestože MediaWiki všechny načítané soubory kontroluje proti bezpečnostním hrozbám, je důrazně doporučeno [//www.mediawiki.org/wiki/Manual:Security#Upload_security tuto bezpečnostní díru zacelit] před povolením načítání souborů.",
     "config-no-cli-uploads-check": "'''Upozornění:''' Váš implicitní adresář pro načítané soubory (<code>$1</code>) se při instalaci z příkazového řádku nekontroluje na bezpečnostní hrozbu provádění libovolných skriptů.",
-    "config-brokenlibxml": "Váš systém obsahuje kombinaci verzí PHP a libxml2, která je chybná a může v MediaWiki a dalších webových aplikacích způsobovat skryté poškozování dat.\nAktualizujte na PHP 5.2.9 nebo novější a libxml2 2.7.3 nebo novější ([//bugs.php.net/bug.php?id=45996 chyba evidovaná u PHP]).\nInstalace přerušena.",
-    "config-using531": "MediaWiki nelze používat na PHP $1 kvůli chybě při předávání parametrů odkazem do <code>__call()</code>.\nPro vyřešení upgradujte na PHP 5.3.2 nebo vyšší nebo downgradujte na PHP 5.3.0.\nInstalace přerušena.",
+    "config-brokenlibxml": "Váš systém obsahuje kombinaci verzí PHP a libxml2, která je chybná a může v MediaWiki a dalších webových aplikacích způsobovat skryté poškozování dat.\nAktualizujte na libxml2 2.7.3 nebo novější ([https://bugs.php.net/bug.php?id=45996 chyba evidovaná u PHP]).\nInstalace přerušena.",
     "config-suhosin-max-value-length": "Je nainstalován Suhosin, který omezuje délku parametrů GET na $1 bajtů.\nKomponenta ResourceLoader z MediaWiki dokáže s tímto omezením pracovat, ale sníží to výkon.\nPokud to je alespoň trochu možné, měli byste v <code>php.ini</code> nastavit <code>suhosin.get.max_value_length</code> na 1024 nebo vyšší a na stejnou hodnotu nastavit v <code>LocalSettings.php</code> proměnnou <code>$wgResourceLoaderMaxQueryLength</code>.",
     "config-db-type": "Typ databáze:",
     "config-db-host": "Databázový server:",
     "config-db-username": "Databázové uživatelské jméno:",
     "config-db-password": "Databázové heslo:",
     "config-db-password-empty": "Zadejte heslo pro nového databázového uživatele: $1.\nPřestože může jít zakládat nové uživatele i bez hesel, není to bezpečné.",
+    "config-db-username-empty": "Musíte zadat hodnotu pro „{{int:config-db-username}}“",
     "config-db-install-username": "Zadejte uživatelské jméno, které se použije pro připojení k databázi v průběhu instalace.\nToto není jméno uživatelského účtu MediaWiki; toto je uživatelské jméno k vaší databázi.",
     "config-db-install-password": "Zadejte heslo, které se použije pro připojení k databázi v průběhu instalace.\nToto není heslo uživatelského účtu MediaWiki; toto je heslo k vaší databázi.",
     "config-db-install-help": "Zadejte uživatelské jméno a heslo, které se použijí pro připojení k databázi v průběhu instalace.",
     "config-sqlite-dir-help": "SQLite ukládá veškerá data v jediném souboru.\n\nZadaný adresář musí být v průběhu instalace být přístupný pro zápis.\n\n'''Neměl by''' být dostupný z webu, proto ho nedáváme tam, kde jsou vaše PHP soubory.\n\nInstalátor do adresáře přidá soubor <code>.htaccess</code>, ale pokud to selže, mohl by někdo získat přístup k vaší holé databázi.\nTo zahrnuje syrová uživatelská data (e-mailové adresy, hašovaná hesla), jako i smazané revize a další data s omezeným přístupem z vaší wiki.\n\nZvažte umístění databáze někam zcela jinam, například do <code>/var/lib/mediawiki/mojewiki</code>.",
     "config-oracle-def-ts": "Implicitní tabulkový prostor:",
     "config-oracle-temp-ts": "Dočasný tabulkový prostor:",
-    "config-type-mysql": "MySQL",
+    "config-type-mysql": "MySQL (nebo kompatibilní)",
     "config-type-postgres": "PostgreSQL",
     "config-type-sqlite": "SQLite",
     "config-type-oracle": "Věštba",
+    "config-type-mssql": "Microsoft SQL Server",
     "config-support-info": "MediaWiki podporuje následující databázové systémy:\n\n$1\n\nPokud v nabídce níže nevidíte databázový systém, který chcete použít, musíte pro zapnutí podpory následovat instrukce odkázané výše.",
-    "config-support-mysql": "* $1 je pro MediaWiki hlavní platformou a je podporováno nejlépe ([http://www.php.net/manual/en/mysql.installation.php jak zkompilovat PHP s podporou MySQL])",
-    "config-support-postgres": "* $1 je populární open-source databázový systém používaný jako alternativa k MySQL ([http://www.php.net/manual/en/pgsql.installation.php jak přeložit PHP s podporou PostgreSQL]). Mohou se vyskytnout ještě nějaké menší chyby, použití v produkčním prostředí se nedoporučuje.",
-    "config-support-sqlite": "* $1 je velmi dobře podporovaný lehký databázový systém. ([http://www.php.net/manual/en/pdo.installation.php Jak přeložit PHP s podporou SQLite], používá PDO)",
-    "config-support-oracle": "* $1 je komerční podniková databáze. ([http://www.php.net/manual/en/oci8.installation.php Jak přeložit PHP s podporou OCI8])",
+    "config-dbsupport-mysql": "* [{{int:version-db-mysql-url}} MySQL] je pro MediaWiki hlavní platformou a je podporováno nejlépe. MediaWiki pracuje také s [{{int:version-db-mariadb-url}} MariaDB] a [{{int:version-db-percona-url}} Percona Server], které jsou s MySQL kompatibilní. ([http://www.php.net/manual/en/mysql.installation.php Jak zkompilovat PHP s podporou MySQL])",
+    "config-dbsupport-postgres": "* [{{int:version-db-postgres-url}} PostgreSQL] je populární otevřený databázový systém používaný jako alternativa k MySQL. Mohou se vyskytnout ještě nějaké menší chyby, použití ve výrobním prostředí se nedoporučuje.  ([http://www.php.net/manual/en/pgsql.installation.php Jak přeložit PHP s podporou PostgreSQL])",
+    "config-dbsupport-sqlite": "* [{{int:version-db-sqlite-url}} SQLite] je velmi dobře podporovaný odlehčený databázový systém. ([http://www.php.net/manual/en/pdo.installation.php Jak přeložit PHP s podporou SQLite], používá PDO)",
+    "config-dbsupport-oracle": "* [{{int:version-db-oracle-url}} Oracle] je komerční podniková databáze. ([http://www.php.net/manual/en/oci8.installation.php Jak přeložit PHP s podporou OCI8])",
+    "config-dbsupport-mssql": "* [{{int:version-db-mssql-url}} Microsoft SQL Server] je komerční podniková databáze pro Windows. ([http://www.php.net/manual/en/sqlsrv.installation.php Jak přeložit PHP s podporou SQLSRV])",
     "config-header-mysql": "Nastavení MySQL",
     "config-header-postgres": "Nastavení PostgreSQL",
     "config-header-sqlite": "Nastavení SQLite",
     "config-header-oracle": "Nastavení Oracle",
+    "config-header-mssql": "Nastavení Microsoft SQL Serveru",
     "config-invalid-db-type": "Chybný typ databáze",
-    "config-missing-db-name": "Musíte zadat hodnotu pro „Jméno databáze“",
-    "config-missing-db-host": "Musíte zadat hodnotu pro „Databázový server“",
-    "config-missing-db-server-oracle": "Musíte zadat hodnotu pro „Databázové TNS“",
+    "config-missing-db-name": "Musíte zadat hodnotu pro „{{int:config-db-name}}“",
+    "config-missing-db-host": "Musíte zadat hodnotu pro „{{int:config-db-host}}“",
+    "config-missing-db-server-oracle": "Musíte zadat hodnotu pro „{{int:config-db-host-oracle}}“",
     "config-invalid-db-server-oracle": "Chybné databázové TNS „$1“.\nPoužívejte buď „TNS Name“ nebo „Easy Connect“ (vizte [http://docs.oracle.com/cd/E11882_01/network.112/e10836/naming.htm Oracle Naming Methods]).",
     "config-invalid-db-name": "Chybné jméno databáze „$1“.\nPoužívejte pouze ASCII písmena (a-z, A-Z), čísla (0-9), podtržítko (_) a spojovník (-).",
     "config-invalid-db-prefix": "Chybný databázový prefix „$1“.\nPoužívejte pouze ASCII písmena (a-z, A-Z), čísla (0-9), podtržítko (_) a spojovník (-).",
     "config-db-sys-create-oracle": "Instalátor podporuje zakládání nového účtu pouze prostřednictvím účtu SYSDBA.",
     "config-db-sys-user-exists-oracle": "Uživatelský účet „$1“ již existuje. SYSDBA lze použít pouze pro založení nového účtu!",
     "config-postgres-old": "Je vyžadován PostgreSQL $1 nebo novější, vy máte $2.",
+    "config-mssql-old": "Je vyžadován Microsoft SQL Server $1 nebo novější. Vy máte $2.",
     "config-sqlite-name-help": "Zvolte jméno, které označuje vaši wiki.\nNepoužívejte mezery a spojovníky.\nPoužije se jako název souboru s daty SQLite.",
     "config-sqlite-parent-unwritable-group": "Nelze vytvořit datový adresář <code><nowiki>$1</nowiki></code>, protože do nadřazeného adresáře <code><nowiki>$2</nowiki></code> nemá webový server právo zapisovat.\n\nInstalátor zjistil uživatele, pod kterým váš webový server běží.\nAbyste mohli pokračovat, umožněte mu zapisovat do adresáře <code><nowiki>$3</nowiki></code>.\nNa systémech Unix/Linux proveďte:\n\n<pre>cd $2\nmkdir $3\nchgrp $4 $3\nchmod g+w $3</pre>",
     "config-sqlite-parent-unwritable-nogroup": "Nelze vytvořit datový adresář <code><nowiki>$1</nowiki></code>, protože do nadřazeného adresáře <code><nowiki>$2</nowiki></code> nemá webový server právo zapisovat.\n\nInstalátoru se nepodařilo zjistit uživatele, pod kterým váš webový server běží.\nAbyste mohli pokračovat, umožněte zápis do <code><nowiki>$3</nowiki></code> všem uživatelům.\nNa systémech Unix/Linux proveďte:\n\n<pre>cd $2\nmkdir $3\nchmod a+w $3</pre>",
     "config-mysql-innodb": "InnoDB",
     "config-mysql-myisam": "MyISAM",
     "config-mysql-myisam-dep": "'''Upozornění''': Jako typ úložiště pro MySQL jste zvolili MyISAM, které není pro použití v MediaWiki doporučeno, neboť:\n* stěží podporuje současný přístup kvůli zamykání tabulek,\n* je náchylnější na poškození dat než jiná úložiště,\n* kód MediaWiki nepodporuje MyISAM vždy tak dobře, jak by měl.\n\nPokud vaše instalace MySQL podporuje InnoDB, důrazně doporučujeme použít spíše to.\nPokud vaše instalace MySQL InnoDB nepodporuje, možná je čas na aktualizaci.",
-    "config-mysql-only-myisam-dep": "'''Upozornění:''' Jediným dostupným formátem dat pro MySQL je MyISAM, který se k užití pro MediaWiki nedoporučuje, protože:\n* téměř nepodporuje současný přístup kvůli zamykání tabulek,\n* oproti jiným formátům je náchylnější k poškození,\n* kód MediaWiki nepodporuje MyISAM tak dobře, jak by bylo potřeba.\n\nVaše instalace MySQL nepodporuje InnoDB, možná je na čase upgradovat.",
+    "config-mysql-only-myisam-dep": "'''Upozornění:''' Jediným dostupným úložištěm dat pro MySQL je MyISAM, který se k užití s MediaWiki nedoporučuje, neboť:\n* téměř nepodporuje paralelní přístup kvůli zamykání tabulek,\n* oproti jiným formátům je náchylnější k poškození,\n* MediaWiki nepodporuje MyISAM tak dobře, jak by bylo třeba.\n\nVaše instalace MySQL nepodporuje InnoDB, možná je na čase upgradovat.",
     "config-mysql-engine-help": "'''InnoDB''' je téměř vždy nejlepší volba, neboť má dobrou podporu současného přístupu.\n\n'''MyISAM''' může být rychlejší u instalací pro jednoho uživatele nebo jen pro čtení.\nDatabáze MyISAM bývají poškozeny častěji než databáze InnoDB.",
     "config-mysql-charset": "Znaková sada databáze:",
     "config-mysql-binary": "Binární",
     "config-mysql-utf8": "UTF-8",
     "config-mysql-charset-help": "V '''binárním režimu''' ukládá MediaWiki text v UTF-8 do databáze v binárních sloupcích.\nTo je výkonnější než UTF-8 režim MySQL a umožňuje využít plný rozsah znaků Unicode.\n\nV '''režimu UTF-8''' bude MySQL znát znakovou sadu vašich dat a může je příslušně zobrazovat a převádět, ale neumožní vám uložit znaky mimo [//en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes Basic Multilingual Plane].",
+    "config-mssql-auth": "Typ autentizace:",
+    "config-mssql-install-auth": "Zvolte si typ autentizace, který se bude používat pro připojení k databázi v průběhu instalace.\nPokud zvolíte možnost „{{int:config-mssql-windowsauth}}“, použijí se přihlašovací údaje uživatele, pod kterým běží webový server.",
+    "config-mssql-web-auth": "Zvolte si typ autentizace, který se bude používat pro připojení k databázi za běžného provozu wiki.\nPokud zvolíte možnost „{{int:config-mssql-windowsauth}}“, použijí se přihlašovací údaje uživatele, pod kterým běží webový server.",
+    "config-mssql-sqlauth": "Autentizace SQL serveru",
+    "config-mssql-windowsauth": "Windows autentizace",
     "config-site-name": "Název wiki:",
     "config-site-name-help": "Bude se zobrazovat v titulku prohlížeče a na dalších místech.",
     "config-site-name-blank": "Zadejte název serveru.",
     "config-ns-invalid": "Uvedený jmenný prostor „<nowiki>$1</nowiki>“ je neplatný.\nZadejte jiný jmenný prostor projektu.",
     "config-ns-conflict": "Uvedený jmenný prostor „<nowiki>$1</nowiki>“ koliduje se standardním jmenným prostorem MediaWiki.\nZadejte jiný jmenný prostor projektu.",
     "config-admin-box": "Správcovský účet",
-    "config-admin-name": "Vaše jméno:",
+    "config-admin-name": "Vaše uživatelské jméno:",
     "config-admin-password": "Heslo:",
     "config-admin-password-confirm": "Heslo ještě jednou:",
     "config-admin-help": "Zde zadejte své požadované uživatelské jméno, například „Pepa Novák“.\nTímto jménem se budete do wiki hlásit.",
     "config-admin-name-blank": "Zadejte uživatelské jméno správce.",
     "config-admin-name-invalid": "Uvedené uživatelské jméno „<nowiki>$1</nowiki>“ není platné.\nZadejte jiné uživatelské jméno.",
     "config-admin-password-blank": "Zadejte heslo ke správcovskému účtu.",
-    "config-admin-password-same": "Heslo nesmí být stejné jako uživatelské jméno.",
     "config-admin-password-mismatch": "Uvedená hesla se neshodují.",
     "config-admin-email": "E-mailová adresa:",
     "config-admin-email-help": "Zde zadejte e-mailovou adresu, která vám umožní přijímat e-maily od ostatních uživatelů wiki, získat nové heslo a přijímat notifikace o změnách sledovaných stránek. Tohle pole můžete nechat prázdné.",
     "config-extension-link": "Věděli jste, že vaše wiki podporuje [//www.mediawiki.org/wiki/Manual:Extensions rozšíření]?\n\nMůžete procházet [//www.mediawiki.org/wiki/Category:Extensions_by_category rozšíření po kategoriích] nebo si prohlédnout [//www.mediawiki.org/wiki/Extension_Matrix Matici rozšíření] obsahující úplný seznam.",
     "mainpagetext": "'''MediaWiki byla úspěšně nainstalována.'''",
     "mainpagedocfooter": "[//meta.wikimedia.org/wiki/Help:Contents Uživatelská příručka] vám napoví, jak MediaWiki používat.\n\n== Začínáme ==\n\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Nastavení konfigurace]\n* [//www.mediawiki.org/wiki/Manual:FAQ Často kladené otázky o MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce E-mailová konference oznámení MediaWiki]\n* [//www.mediawiki.org/wiki/Localisation#Translation_resources Překlad MediaWiki do vašeho jazyka]"
-}
\ No newline at end of file
+}
index 024b3d8..50c9165 100644 (file)
@@ -1,6 +1,4 @@
 {
-    "@metadata": {
-        "authors": []
-    },
+    "@metadata": [],
     "mainpagetext": "'''MediaWiki òsta zainstalowónô.'''"
-}
\ No newline at end of file
+}
index a5b1c21..6db8475 100644 (file)
@@ -7,4 +7,4 @@
     "config-page-language": "ѩꙁꙑкъ",
     "config-page-name": "имѧ",
     "config-help": "помощь"
-}
\ No newline at end of file
+}
index bdb08c2..2021cfe 100644 (file)
@@ -1,7 +1,5 @@
 {
-    "@metadata": {
-        "authors": []
-    },
+    "@metadata": [],
     "mainpagetext": "'''«MediaWiki» вики-движока лартасси ăнăçлă вĕçленчĕ.'''",
     "mainpagedocfooter": "Ку википе ĕçлеме пулăшакан информацине [//meta.wikimedia.org/wiki/%D0%9F%D0%BE%D0%BC%D0%BE%D1%89%D1%8C:%D0%A1%D0%BE%D0%B4%D0%B5%D1%80%D0%B6%D0%B0%D0%BD%D0%B8%D0%B5 усăç руководствинче] тупма пултаратăр.\n\n== Пулăшма пултарĕç ==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Ĕнерлевсен списокĕ];\n* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki тăрăх час-часах ыйтакан ыйтусемпе хуравсем];\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki çĕнĕ верси тухнине пĕлтерекен рассылка]."
-}
\ No newline at end of file
+}
index 5bfbb21..505d924 100644 (file)
@@ -2,9 +2,11 @@
     "@metadata": {
         "authors": [
             "Lloffiwr",
-            "Xxglennxx"
+            "Xxglennxx",
+            "Robin Owain"
         ]
     },
+    "config-desc": "Y gosodwr ar gyfer MediaWiki",
     "mainpagetext": "'''Wedi llwyddo gosod meddalwedd MediaWiki yma'''",
     "mainpagedocfooter": "Ceir cymorth (yn Saesneg) ar ddefnyddio meddalwedd wici yn y [//meta.wikimedia.org/wiki/Help:Contents Canllaw Defnyddwyr] ar wefan Wikimedia.\n\n==Cychwyn arni==\n\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Rhestr osodiadau wrth gyflunio]\n* [//www.mediawiki.org/wiki/Manual:FAQ Cwestiynau poblogaidd ar MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Rhestr postio datganiadau MediaWiki]\n* [//www.mediawiki.org/wiki/Localisation#Translation_resources Cyfieithu MediaWici i'ch iaith chi]"
-}
\ No newline at end of file
+}
index 45f6a79..03118e2 100644 (file)
@@ -1,9 +1,24 @@
 {
     "@metadata": {
         "authors": [
-            "Peter Alberti"
+            "Peter Alberti",
+            "Christian List",
+            "Tjernobyl"
         ]
     },
+    "config-page-language": "Sprog",
+    "config-page-welcome": "Velkommen til MediaWiki!",
+    "config-page-dbconnect": "Forbind til database",
+    "config-page-upgrade": "Opgrader eksisterende installation",
+    "config-page-dbsettings": "Databaseindstillinger",
+    "config-page-name": "Navn",
+    "config-page-options": "Indstillinger",
+    "config-page-install": "Installer",
+    "config-header-mysql": "MySQL-indstillinger",
+    "config-header-postgres": "PostgreSQL-indstillinger",
+    "config-header-sqlite": "SQLite-indstillinger",
+    "config-header-oracle": "Oracle-indstillinger",
+    "config-invalid-db-type": "Ugyldig databasetype",
     "mainpagetext": "'''MediaWiki er nu installeret.'''",
-    "mainpagedocfooter": "Se [//meta.wikimedia.org/wiki/Help:Contents brugervejledningen] for oplysninger om brugen af wikiprogrammellet.\n\n== At komme i gang ==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Listen over opsætningsmuligheder]\n* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki ofte stillede spørgsmål]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Postliste angående udgivelser af MediaWiki]"
-}
\ No newline at end of file
+    "mainpagedocfooter": "Se [//meta.wikimedia.org/wiki/Help:Contents brugervejledningen] for oplysninger om brugen af wikiprogrammellet.\n\n== At komme i gang ==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Listen over opsætningsmuligheder]\n* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki ofte stillede spørgsmål]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Postliste angående udgivelser af MediaWiki]\n* [//www.mediawiki.org/wiki/Localisation#Translation_resources Oversæt MediaWiki til dit sprog]"
+}
index 8a48010..391bc08 100644 (file)
@@ -1,8 +1,12 @@
 {
     "@metadata": {
         "authors": [
-            "MichaelFrey"
+            "MichaelFrey",
+            "Kghbln",
+            "Umherirrender"
         ]
     },
-    "mainpagedocfooter": "Hilfe zur Benutzung und Konfiguration der Wiki-Software finden Sie im [//meta.wikimedia.org/wiki/Help:Contents Benutzerhandbuch].\n\n== Starthilfen ==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Liste der Konfigurationsvariablen]\n* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki-FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Mailingliste neuer MediaWiki-Versionen]"
-}
\ No newline at end of file
+    "config-welcome": "=== Prüfung der Installationsumgebung ===\nDie Basisprüfungen werden jetzt durchgeführt, um festzustellen, ob die Installationsumgebung für MediaWiki geeignet ist.\nNotieren Sie diese Informationen und geben Sie sie an, sofern Sie Hilfe beim Installieren benötigen.",
+    "config-extension-link": "Wussten Sie, dass Ihr Wiki die Nutzung von [//www.mediawiki.org/wiki/Manual:Extensions Erweiterungen] unterstützt?\n\nSie können [//www.mediawiki.org/wiki/Category:Extensions_by_category Erweiterungen nach Kategorie] durchsuchen oder die [//www.mediawiki.org/wiki/Extension_Matrix Matrix der Erweiterungen] ansehen, um eine Übersicht zu verfügbaren Erweiterungen zu erhalten.",
+    "mainpagedocfooter": "Hilfe zur Benutzung und Konfiguration der Wiki-Software finden Sie im [//meta.wikimedia.org/wiki/Help:Contents Benutzerhandbuch].\n\n== Starthilfen ==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Liste der Konfigurationsvariablen]\n* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki-FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Mailingliste neuer MediaWiki-Versionen]\n* [//www.mediawiki.org/wiki/Localisation#Translation_resources Lokalisieren Sie MediaWiki für Ihre Sprache]"
+}
index 2924c82..afc3d71 100644 (file)
             "The Evil IP address",
             "Umherirrender",
             "Wikinaut",
-            "아라"
+            "아라",
+            "Se4598",
+            "Suriyaa Kudo"
         ]
     },
     "config-desc": "Das MediaWiki-Installationsprogramm",
     "config-title": "Installation von MediaWiki $1",
     "config-information": "Informationen",
     "config-localsettings-upgrade": "Eine Datei <code>LocalSettings.php</code> wurde gefunden.\nUm die vorhandene Installation aktualisieren zu können, muss der Wert des Parameters <code>$wgUpgradeKey</code> im folgenden Eingabefeld angegeben werden.\nDer Parameterwert befindet sich in der Datei <code>LocalSettings.php</code>.",
-    "config-localsettings-cli-upgrade": "Eine Datei <code><code>LocalSettings.php</code></code> wurde gefunden.\nUm die vorhandene Installation zu aktualisieren, muss die Datei <code>update.php</code> ausgeführt werden.",
+    "config-localsettings-cli-upgrade": "Eine Datei <code>LocalSettings.php</code> wurde gefunden.\nUm die vorhandene Installation zu aktualisieren, muss die Datei <code>update.php</code> ausgeführt werden.",
     "config-localsettings-key": "Aktualisierungsschlüssel:",
     "config-localsettings-badkey": "Der angegebene Aktualisierungsschlüssel ist falsch.",
     "config-upgrade-key-missing": "Eine MediaWiki-Installation wurde gefunden.\nUm die vorhandene Installation aktualisieren zu können, muss die unten angegebene Codezeile in die Datei <code>LocalSettings.php</code> an deren Ende eingefügt werden:\n\n$1",
     "config-localsettings-incomplete": "Die vorhandene Datei <code>LocalSettings.php</code> scheint unvollständig zu sein.\nDie Variable <code>$1</code> wurde nicht definiert.\nDie Datei <code>LocalSettings.php</code> muss entsprechend geändert werden, so dass sie definiert ist. Klicke danach auf „{{int:Config-continue}}“.",
-    "config-localsettings-connection-error": "Beim Verbindungsversuch zur Datenbank ist, unter Verwendung der in den Dateien <code>LocalSettings.php</code> oder <code>AdminSettings.php</code> hinterlegten Einstellungen, ein Fehler aufgetreten. Diese Einstellungen müssen korrigiert werden. Danach kann ein erneuter Versuch unternommen werden.\n\n$1",
+    "config-localsettings-connection-error": "Beim Verbindungsversuch zur Datenbank ist, unter Verwendung der in der Datei <code>LocalSettings.php</code> hinterlegten Einstellungen, ein Fehler aufgetreten. Diese Einstellungen müssen korrigiert werden. Danach kann ein erneuter Versuch unternommen werden.\n\n$1",
     "config-session-error": "Fehler beim Starten der Sitzung: $1",
     "config-session-expired": "Die Sitzungsdaten scheinen abgelaufen zu sein.\nSitzungen sind für einen Zeitraum von $1 konfiguriert.\nDieser kann durch Anhebung des Parameters <code>session.gc_maxlifetime</code> in der Datei <code>php.ini</code> erhöht werden.\nDen Installationsvorgang erneut starten.",
     "config-no-session": "Die Sitzungsdaten sind verloren gegangen!\nDie Datei <code>php.ini</code> muss geprüft und es muss dabei sichergestellt werden, dass der Parameter <code>session.save_path</code> auf das richtige Verzeichnis verweist.",
     "config-page-existingwiki": "Vorhandenes Wiki",
     "config-help-restart": "Sollen alle bereits eingegebenen Daten gelöscht und der Installationsvorgang erneut gestartet werden?",
     "config-restart": "Ja, erneut starten",
-    "config-welcome": "=== Prüfung der Installationsumgebung ===\nDie Basisprüfungen werden jetzt durchgeführt, um festzustellen, ob die Installationsumgebung für die Installation von MediaWiki geeignet ist.\nNimm diese Information auf, falls du Unterstützung bei der Vervollständigung der Installation benötigst.",
+    "config-welcome": "=== Prüfung der Installationsumgebung ===\nDie Basisprüfungen werden jetzt durchgeführt, um festzustellen, ob die Installationsumgebung für MediaWiki geeignet ist.\nNotiere diese Informationen und gib sie an, sofern du Hilfe beim Installieren benötigst.",
     "config-copyright": "=== Lizenz und Nutzungsbedingungen ===\n\n$1\n\nDieses Programm ist freie Software, d. h. es kann, gemäß den Bedingungen der von der Free Software Foundation veröffentlichten ''GNU General Public License'', weiterverteilt und/oder modifiziert werden. Dabei kann die Version 2, oder nach eigenem Ermessen, jede neuere Version der Lizenz verwendet werden.\n\nDieses Programm wird in der Hoffnung verteilt, dass es nützlich sein wird, allerdings '''ohne jegliche Garantie''' und sogar ohne die implizierte Garantie einer '''Marktgängigkeit''' oder '''Eignung für einen bestimmten Zweck'''. Hierzu sind weitere Hinweise in der ''GNU General Public License'' enthalten.\n\nEine <doclink href=Copying>Kopie der GNU General Public License</doclink> sollte zusammen mit diesem Programm verteilt worden sein. Sofern dies nicht der Fall war, kann eine Kopie bei der Free Software Foundation Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA, schriftlich angefordert oder auf deren Website [http://www.gnu.org/copyleft/gpl.html online gelesen] werden.",
     "config-sidebar": "* [//www.mediawiki.org/wiki/MediaWiki/de Website von MediaWiki]\n* [//www.mediawiki.org/wiki/Help:Contents/de Benutzeranleitung]\n* [//www.mediawiki.org/wiki/Manual:Contents/de Administratorenanleitung]\n* [//www.mediawiki.org/wiki/Manual:FAQ/de Häufig gestellte Fragen]\n----\n* <doclink href=Readme>Lies mich</doclink>\n* <doclink href=ReleaseNotes>Versionsinformationen</doclink>\n* <doclink href=Copying>Lizenzbestimmungen</doclink>\n* <doclink href=UpgradeDoc>Aktualisierung</doclink>",
     "config-env-good": "Die Installationsumgebung wurde geprüft.\nMediaWiki kann installiert werden.",
     "config-env-bad": "Die Installationsumgebung wurde geprüft.\nMediaWiki kann nicht installiert werden.",
-    "config-env-php": "PHP $1 ist installiert.",
+    "config-env-php": "Die Skriptsprache „PHP“ ($1) ist installiert.",
     "config-env-php-toolow": "PHP $1 ist installiert.\nAllerdings benötigt MediaWiki PHP $2 oder höher.",
     "config-unicode-using-utf8": "Zur Unicode-Normalisierung wird Brion Vibbers <code>utf8_normalize.so</code> eingesetzt.",
     "config-unicode-using-intl": "Zur  Unicode-Normalisierung wird die [http://pecl.php.net/intl PECL-Erweiterung intl] eingesetzt.",
     "config-unicode-pure-php-warning": "'''Warnung:''' Die [http://pecl.php.net/intl PECL-Erweiterung intl] ist für die Unicode-Normalisierung nicht verfügbar, so dass stattdessen die langsame pure-PHP-Implementierung genutzt wird.\nSofern eine Website mit großer Benutzeranzahl betrieben wird, sollten weitere Informationen auf der Webseite [//www.mediawiki.org/wiki/Unicode_normalization_considerations Unicode-Normalisierung (en)] gelesen werden.",
     "config-unicode-update-warning": "'''Warnung:''' Die installierte Version des Unicode-Normalisierungswrappers nutzt einer ältere Version der Bibliothek des [http://site.icu-project.org/ ICU-Projekts].\nDiese sollte [//www.mediawiki.org/wiki/Unicode_normalization_considerations aktualisiert] werden, sofern auf die Verwendung von Unicode Wert gelegt wird.",
-    "config-no-db": "Es konnte kein adäquater Datenbanktreiber gefunden werden. Es muss daher ein Datenbanktreiber für PHP installiert werden.\nDie folgenden Datenbanksysteme werden unterstützt: $1\n\nSofern ein gemeinschaftlich genutzter Server für das Hosting verwendet wird, muss der Hoster gefragt werden einen adäquaten Datenbanktreiber zu installieren.\nSofern PHP selbst kompiliert wurde, muss es mit es neu konfiguriert werden, wobei der Datenbankclient zu aktivierten ist. Hierzu kann beispielsweise <code>./configure --with-mysql</code> ausgeführt werden.\nSofern PHP über die Paketverwaltung einer Debian- oder Ubuntu-Installation installiert wurde, muss das „php5-mysql“-Paket nachinstalliert werden.",
+    "config-no-db": "Es konnte kein adäquater Datenbanktreiber gefunden werden. Es muss daher ein Datenbanktreiber für PHP installiert werden.\nDie folgenden Datenbanksysteme werden unterstützt: $1\n\nWenn du PHP selbst kompiliert hast, konfiguriere es erneut mit einem aktivierten Datenbankclient, zum Beispiel durch Verwendung von <code>./configure --with-mysqli</code>.\nWenn du PHP von einem Debian- oder Ubuntu-Paket installiert hast, dann musst du auch beispielsweise das <code>php5-mysql</code>-Paket installieren.",
     "config-outdated-sqlite": "'''Warnung:''' SQLite $1 ist installiert. Allerdings benötigt MediaWiki SQLite $2 oder höher. SQLite wird daher nicht verfügbar sein.",
     "config-no-fts3": "'''Warnung:''' SQLite wurde ohne das [//sqlite.org/fts3.html FTS3-Modul] kompiliert, so dass keine Suchfunktionen für dieses Datenbanksystem zur Verfügung stehen werden.",
     "config-register-globals": "'''Warnung: Der Parameter <code>[http://php.net/register_globals register_globals]</code> von PHP ist aktiviert.'''\n'''Sie sollte deaktiviert werden, sofern dies möglich ist.'''\nDie MediaWiki-Installation wird zwar laufen, wobei aber der Server für potentielle Sicherheitsprobleme anfällig ist.",
     "config-magic-quotes-runtime": "'''Fataler Fehler: Der Parameter <code>[http://www.php.net/manual/de/function.set-magic-quotes-runtime.php set_magic_quotes_runtime]</code> von PHP ist aktiviert!'''\nDiese Einstellung führt zu unvorhersehbaren Problemen bei der Dateneingabe.\nMediaWiki kann nicht installiert werden, solange dieser Parameter nicht deaktiviert wurde.",
-    "config-magic-quotes-sybase": "'''Fataler Fehler: Der Parameter <code>[http://www.php.net/manual/de/sybase.configuration.php#ini.magic-quotes-sybase magic_quotes_sybase]</code> von PHP ist aktiviert!'''\nDiese Einstellung führt zu unvorhersehbaren Problemen bei der Dateneingabe.\nMediaWiki kann nicht installiert werden, solange dieser Parameter nicht deaktiviert wurde.",
+    "config-magic-quotes-sybase": "<strong>Fataler Fehler: Der Parameter <code>[http://www.php.net/manual/de/sybase.configuration.php#ini.magic-quotes-sybase magic_quotes_sybase]</code> von PHP ist aktiviert!</strong>\nDiese Einstellung führt zu unvorhersehbaren Problemen bei der Dateneingabe.\nMediaWiki kann nicht installiert werden, solange dieser Parameter nicht deaktiviert wurde.",
     "config-mbstring": "'''Fataler Fehler: Der Parameter <code>[http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload]</code> von PHP ist aktiviert!'''\nDiese Einstellung verursacht Fehler und führt zu unvorhersehbaren Problemen bei der Dateneingabe.\nMediaWiki kann nicht installiert werden, solange dieser Parameter nicht deaktiviert wurde.",
-    "config-ze1": "'''Fataler Fehler: Der Parameter <code>[http://www.php.net/manual/de/ini.core.php zend.ze1_compatibility_mode]</code> von PHP ist aktiviert!'''\nDiese Einstellung führt zu großen Fehlern bei MediaWiki.\nMediaWiki kann nicht installiert werden, solange dieser Parameter nicht deaktiviert wurde.",
     "config-safe-mode": "'''Warnung:''' Der Funktion <code>[http://www.php.net/features.safe-mode Safe Mode]</code> von PHP ist aktiviert.\nDies kann zu Problemen führen, insbesondere wenn das Hochladen von Dateien möglich sein, bzw. der Auszeichner <code>math</code> genutzt werden soll.",
     "config-xml-bad": "Das XML-Modul von PHP fehlt.\nMediaWiki benötigt Funktionen, die dieses Modul bereitstellt und wird in der bestehenden Konfiguration nicht funktionieren.\nSofern Mandriva genutzt wird, muss noch das „php-xml“-Paket installiert werden.",
-    "config-pcre": "Das PHP-Modul für die PCRE-Unterstützung wurde nicht gefunden.\nMediaWiki benötigt allerdings perl-kompatible reguläre Ausdrücke, um lauffähig zu sein.",
+    "config-pcre-old": "<strong>Fataler Fehler:</strong> PCRE $1 oder neuer ist erforderlich!\nDie vorhandene PHP-Binärdatei ist mit PCRE $2 verknüpft.\n[https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/PCRE Weitere Informationen].",
     "config-pcre-no-utf8": "'''Fataler Fehler:''' Das PHP-Modul PCRE scheint ohne PCRE_UTF8-Unterstützung kompiliert worden zu sein.\nMediaWiki benötigt die UTF-8-Unterstützung, um fehlerfrei lauffähig zu sein.",
     "config-memory-raised": "Der PHP-Parameter <code>memory_limit</code> betrug $1 und wurde auf $2 erhöht.",
     "config-memory-bad": "'''Warnung:''' Der PHP-Parameter <code>memory_limit</code> beträgt $1.\nDieser Wert ist wahrscheinlich zu niedrig.\nDer Installationsvorgang könnte daher scheitern!",
     "config-ctype": "'''Fataler Fehler:''' PHP muss mit Unterstützung für das [http://www.php.net/manual/de/ctype.installation.php Modul ctype] kompiliert werden.",
-    "config-json": "'''Fatal:''' PHP wurde ohne JSON-Support kompiliert.\nDu musst entweder die PHP-JSON- oder die [http://pecl.php.net/package/jsonc PECL-jsonc]-Erweiterung installieren, bevor du MediaWiki installierst.\n* Die PHP-Erweiterung ist in Red Hat Enterprise Linux (CentOS) 5 und 6 enthalten, muss jedoch in <code>/etc/php.ini</code> oder <code>/etc/php.d/json.ini</code> aktiviert werden.\n* Einige Linux-Distributionen, die nach Mai 2013 veröffentlicht wurden, lassen die PHP-Erweiterung weg, stattdessen wird die PECL-Erweiterung als <code>php5-json</code> oder <code>php-pecl-jsonc</code> mitgeliefert.",
+    "config-json": "<strong>Fataler Fehler:</strong> PHP wurde ohne Unterstützung für JSON kompiliert.\nVor der Installation von MediaWiki muss entweder die PHP-JSON- oder die [http://pecl.php.net/package/jsonc PECL-jsonc]-Erweiterung installieren werden.\n* Die PHP-Erweiterung ist in Red Hat Enterprise Linux (CentOS) 5 und 6 enthalten, muss jedoch in <code>/etc/php.ini</code> oder <code>/etc/php.d/json.ini</code> aktiviert werden.\n* Einige Linux-Distributionen, die nach Mai 2013 veröffentlicht wurden, nutzen nicht mehr die PHP-Erweiterung, sondern stattdessen die PECL-Erweiterung als <code>php5-json</code> oder <code>php-pecl-jsonc</code>.",
     "config-xcache": "[http://xcache.lighttpd.net/ XCache] ist installiert",
     "config-apc": "[http://www.php.net/apc APC] ist installiert",
     "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache] ist installiert",
     "config-no-cache": "'''Warnung:''' [http://www.php.net/apc APC], [http://xcache.lighttpd.net/ XCache] oder [http://www.iis.net/download/WinCacheForPhp WinCache] wurden nicht gefunden.\nDas Objektcaching kann daher nicht aktiviert werden.",
     "config-mod-security": "'''Warnung:''' Auf dem Webserver wurde [http://modsecurity.org/ ModSecurity] aktiviert. Sofern falsch konfiguriert, kann dies zu Problemen mit MediaWiki sowie anderer Software auf dem Server führen und es Benutzern ermöglichen beliebige Inhalte im Wiki einzustellen.\nFür weitere Informationen empfehlen wir die [http://modsecurity.org/documentation/ Dokumentation zu ModSecurity] oder den Kontakt zum Hoster, sofern Fehler auftreten.",
     "config-diff3-bad": "GNU diff3 wurde nicht gefunden.",
-    "config-git": "Die Git-Versionsverwaltungssoftware wurde gefunden: <code>$1</code>.",
-    "config-git-bad": "Die Git-Versionsverwaltungssoftware wurde nicht gefunden.",
-    "config-imagemagick": "ImageMagick wurde gefunden: <code>$1</code>.\nMiniaturansichten von Bildern werden möglich sein, sobald das Hochladen von Dateien aktiviert wurde.",
+    "config-git": "Die Versionsverwaltungssoftware „Git“ wurde gefunden: <code>$1</code>.",
+    "config-git-bad": "Die Versionsverwaltungssoftware „Git“ wurde nicht gefunden.",
+    "config-imagemagick": "Die Bildverarbeitungssoftware „ImageMagick“ wurde gefunden: <code>$1</code>.\nMiniaturansichten von Bildern werden möglich sein, sobald das Hochladen von Dateien aktiviert wurde.",
     "config-gd": "Die im System integrierte GD-Grafikbibliothek wurde gefunden.\nMiniaturansichten von Bildern werden möglich sein, sobald das Hochladen von Dateien aktiviert wurde.",
     "config-no-scaling": "Weder die GD-Grafikbibliothek noch ImageMagick wurden gefunden.\nMiniaturansichten von Bildern sind daher nicht möglich.",
     "config-no-uri": "'''Fehler:''' Die aktuelle URL konnte nicht ermittelt werden.\nDer Installationsvorgang wurde daher abgebrochen.",
-    "config-no-cli-uri": "'''Warnung''': Es wurde kein Pfad zum Skipt (--scriptpath) angegeben. Daher wird der Standardpfad genutzt: <code>$1</code>.",
+    "config-no-cli-uri": "'''Warnung''': Es wurde kein Pfad zum Skipt (<code>--scriptpath</code>) angegeben. Daher wird der Standardpfad genutzt: <code>$1</code>.",
     "config-using-server": "Der Servername „<nowiki>$1</nowiki>“ wird verwendet.",
     "config-using-uri": "Die Server-URL „<nowiki>$1$2</nowiki>“ wird verwendet.",
     "config-uploads-not-safe": "'''Warnung:''' Das Standardverzeichnis für hochgeladene Dateien <code>$1</code> ist für die willkürliche Ausführung von Skripten anfällig.\nObwohl MediaWiki die hochgeladenen Dateien auf Sicherheitsrisiken überprüft, wird dennoch dringend empfohlen diese [//www.mediawiki.org/wiki/Manual:Security#Upload_security Sicherheitslücke] zu schließen, bevor das Hochladen von Dateien aktiviert wird.",
     "config-no-cli-uploads-check": "'''Warnung''': Das Standardverzeichnis für hochgeladene Dateien (<code>$1</code>) wird, während der Installation über die Kommandozeile, nicht auf Sicherheitsanfälligkeiten hinsichtlich willkürlicher Skriptausführungen geprüft.",
-    "config-brokenlibxml": "Das System nutzt eine Kombination aus PHP- und libxml2-Versionen, die fehleranfällig ist und versteckte Datenfehler bei MediaWiki und anderen Webanwendungen verursachen kann.\nPHP muss auf Version 5.2.9 oder später sowie libxml2 auf die Version 2.7.3 oder später aktualisiert werden, um das Problem zu lösen. Installationsabbruch ([//bugs.php.net/bug.php?id=45996 siehe hierzu die Fehlermeldung bei PHP]).",
-    "config-using531": "MediaWiki kann nicht zusammen mit PHP $1 verwendet werden. Grund hierfür ist ein Fehler im Zusammenhang mit den Verweisparametern zu <code>__call()</code>.\nPHP muss auf Version 5.3.2 oder höher oder 5.3.0 oder niedriger aktualisiert werden, um das Problem zu beheben.\nDie Installation wurde abgebrochen.",
+    "config-brokenlibxml": "Das System nutzt eine Kombination aus PHP- und libxml2-Versionen, die fehleranfällig ist und versteckte Datenfehler bei MediaWiki und anderen Webanwendungen verursachen kann.\nAktualisiere auf libxml2 2.7.3 oder später, um das Problem zu lösen. Installationsabbruch ([https://bugs.php.net/bug.php?id=45996 siehe hierzu die Fehlermeldung bei PHP]).",
     "config-suhosin-max-value-length": "Suhosin ist installiert und beschränkt die Länge des GET-Parameters auf $1 Bytes.\nDer ResouceLoader von MediaWiki wird zwar unter diesen Bedingungen funktionieren, allerdings nur mit verminderter Leistungsfähigkeit.\nSofern möglich sollte der Parameter <code>suhosin.get.max_value_length</code> in der Datei <code>php.ini</code> auf 1024 oder höher festgelegt werden.\nGleichzeitig muss der Parameter <code>$wgResourceLoaderMaxQueryLength</code> in der Datei <code>LocalSettings.php</code> auf den selben Wert eingestellt werden.",
     "config-db-type": "Datenbanksystem:",
     "config-db-host": "Datenbankserver:",
     "config-db-username": "Name des Datenbankbenutzers:",
     "config-db-password": "Passwort des Datenbankbenutzers:",
     "config-db-password-empty": "Bitte ein Passwort für den neuen Datenbankbenutzer angeben: $1\nObzwar es möglich ist Datenbankbenutzer ohne Passwort anzulegen, so ist dies aber nicht sicher.",
+    "config-db-username-empty": "Du musst einen Wert für „{{int:config-db-username}}“ eingeben",
     "config-db-install-username": "Den Benutzernamen angeben, der für die Verbindung mit der Datenbank während des Installationsvorgangs genutzt werden soll. Es handelt sich dabei nicht um den Benutzernamen für das MediaWiki-Konto, sondern um den Benutzernamen der vorgesehenen Datenbank.",
     "config-db-install-password": "Das Passwort angeben, das für die Verbindung mit der Datenbank während des Installationsvorgangs genutzt werden soll. Es handelt sich dabei nicht um das Passwort für das MediaWiki-Konto, sondern um das Passwort der vorgesehenen Datenbank.",
     "config-db-install-help": "Benutzername und Passwort, die während des Installationsvorgangs, für die Verbindung mit der Datenbank, genutzt werden sollen, sind nun anzugeben.",
     "config-sqlite-dir-help": "SQLite speichert alle Daten in einer einzigen Datei.\n\nDas für sie vorgesehene Verzeichnis muss während des Installationsvorgangs beschreibbar sein.\n\nEs sollte '''nicht''' über das Web zugänglich sein, was der Grund ist, warum die Datei nicht dort abgelegt wird, wo sich die PHP-Dateien befinden.\n\nDas Installationsprogramm wird mit der Datei zusammen eine zusätzliche <code>.htaccess</code>-Datei erstellen. Sofern dies scheitert, können Dritte auf die Datendatei zugreifen.\nDies umfasst die Nutzerdaten (E-Mail-Adressen, Passwörter, etc.) wie auch gelöschte Seitenversionen und andere vertrauliche Daten, die im Wiki gespeichert sind.\n\nEs ist daher zu erwägen, die Datendatei an gänzlich anderer Stelle abzulegen, beispielsweise im Verzeichnis <code>./var/lib/mediawiki/yourwiki</code>.",
     "config-oracle-def-ts": "Standardtabellenraum:",
     "config-oracle-temp-ts": "Temporärer Tabellenraum:",
-    "config-type-mysql": "MySQL",
+    "config-type-mysql": "MySQL (oder kompatible Datenbanksysteme)",
     "config-type-postgres": "PostgreSQL",
     "config-type-sqlite": "SQLite",
     "config-type-oracle": "Oracle",
+    "config-type-mssql": "Microsoft SQL Server",
     "config-support-info": "MediaWiki unterstützt die folgenden Datenbanksysteme:\n\n$1\n\nSofern nicht das Datenbanksystem angezeigt wird, das verwendet werden soll, gibt es oben einen Link zur Anleitung mit Informationen, wie dieses aktiviert werden kann.",
-    "config-support-mysql": "* $1 ist das von MediaWiki primär unterstützte Datenbanksystem ([http://www.php.net/manual/en/mysql.installation.php Anleitung zur Kompilierung von PHP mit MySQL-Unterstützung (en)])",
-    "config-support-postgres": "* $1 ist ein beliebtes Open-Source-Datenbanksystem und eine Alternative zu MySQL ([http://www.php.net/manual/de/pgsql.installation.php Anleitung zur Kompilierung von PHP mit PostgreSQL-Unterstützung]). Es gibt allerdings einige kleinere Implementierungsfehler, so dass von der Nutzung in einer Produktivumgebung abgeraten wird.",
-    "config-support-sqlite": "* $1 ist ein verschlanktes Datenbanksystem, das auch gut unterstützt wird ([http://www.php.net/manual/de/pdo.installation.php Anleitung zur Kompilierung von PHP mit SQLite-Unterstützung], verwendet PHP Data Objects (PDO))",
-    "config-support-oracle": "* $1 ist eine kommerzielle Unternehmensdatenbank ([http://www.php.net/manual/en/oci8.installation.php Anleitung zur Kompilierung von PHP mit OCI8-Unterstützung (en)])",
+    "config-dbsupport-mysql": "* [{{int:version-db-mysql-url}} MySQL] ist das von MediaWiki primär unterstützte Datenbanksystem. MediaWiki funktioniert auch mit [{{int:version-db-mariadb-url}} MariaDB] und [{{int:version-db-percona-url}} Percona Server], die MySQL-kompatibel sind. ([http://www.php.net/manual/en/mysqli.installation.php Anleitung zur Kompilierung von PHP mit MySQL-Unterstützung] [englische Sprache])",
+    "config-dbsupport-postgres": "* [{{int:version-db-postgres-url}} PostgreSQL] ist ein beliebtes Open-Source-Datenbanksystem und eine Alternative zu MySQL. Es gibt allerdings einige kleinere Implementierungsfehler, so dass von der Nutzung in einer Produktivumgebung abgeraten wird. ([http://www.php.net/manual/de/pgsql.installation.php Anleitung zur Kompilierung von PHP mit PostgreSQL-Unterstützung])",
+    "config-dbsupport-sqlite": "* [{{int:version-db-sqlite-url}} SQLite] ist ein verschlanktes Datenbanksystem, das auch gut unterstützt wird ([http://www.php.net/manual/de/pdo.installation.php Anleitung zur Kompilierung von PHP mit SQLite-Unterstützung], verwendet PHP Data Objects (PDO))",
+    "config-dbsupport-oracle": "* [{{int:version-db-oracle-url}} Oracle] ist eine kommerzielle Unternehmensdatenbank ([http://www.php.net/manual/en/oci8.installation.php Anleitung zur Kompilierung von PHP mit OCI8-Unterstützung (en)])",
+    "config-dbsupport-mssql": "* [{{int:version-db-mssql-url}} Microsoft SQL Server] ist eine gewerbliche Unternehmensdatenbank für Windows. ([http://www.php.net/manual/de/sqlsrv.installation.php Anleitung zur Kompilierung von PHP mithilfe SQLSRV-Unterstützung])",
     "config-header-mysql": "MySQL-Einstellungen",
     "config-header-postgres": "PostgreSQL-Einstellungen",
     "config-header-sqlite": "SQLite-Einstellungen",
     "config-header-oracle": "Oracle-Einstellungen",
+    "config-header-mssql": "Einstellungen von Microsoft SQL Server",
     "config-invalid-db-type": "Unzulässiges Datenbanksystem",
-    "config-missing-db-name": "Bei „Datenbankname“ muss ein Wert angegeben werden.",
-    "config-missing-db-host": "Bei „Datenbankhost“ muss ein Wert angegeben werden.",
-    "config-missing-db-server-oracle": "Für das „Datenbank-TNS“ muss ein Wert eingegeben werden",
+    "config-missing-db-name": "Bei „{{int:config-db-name}}“ muss ein Wert angegeben werden.",
+    "config-missing-db-host": "Bei „{{int:config-db-host}}“ muss ein Wert angegeben werden.",
+    "config-missing-db-server-oracle": "Für „{{int:config-db-host-oracle}}“ muss ein Wert eingegeben werden.",
     "config-invalid-db-server-oracle": "Ungültiges Datenbank-TNS „$1“.\nEntweder „TNS Name“ oder eine „Easy Connect“-Zeichenfolge verwenden ([http://docs.oracle.com/cd/E11882_01/network.112/e10836/naming.htm Oracle-Benennungsmethoden])",
     "config-invalid-db-name": "Ungültiger Datenbankname „$1“.\nEs dürfen nur ASCII-codierte Buchstaben (a-z, A-Z), Zahlen (0-9), Unter- (_) sowie Bindestriche (-) verwendet werden.",
     "config-invalid-db-prefix": "Ungültiger Datenbanktabellenpräfix „$1“.\nEs dürfen nur ASCII-codierte Buchstaben (a-z, A-Z), Zahlen (0-9), Unter- (_) sowie Bindestriche (-) verwendet werden.",
     "config-db-sys-create-oracle": "Das Installationsprogramm unterstützt nur die Verwendung eines Datenbankbenutzerkontos mit SYSDBA-Berechtigung zum Anlegen eines neuen Datenbankbenutzerkontos.",
     "config-db-sys-user-exists-oracle": "Das Datenbankbenutzerkonto „$1“ ist bereits vorhanden. Ein Datenbankbenutzerkontos mit SYSDBA-Berechtigung kann nur zum Anlegen eines neuen Datenbankbenutzerkontos genutzt werden.",
     "config-postgres-old": "PostgreSQL $1 oder höher wird benötigt. PostgreSQL $2 ist momentan vorhanden.",
+    "config-mssql-old": "Es wird Microsoft SQL Server $1 oder später benötigt. Deine Version ist $2.",
     "config-sqlite-name-help": "Bitten einen Namen angeben, mit dem das Wiki identifiziert werden kann.\nDabei bitte keine Leerzeichen oder Bindestriche verwenden.\nDieser Name wird für die SQLite-Datendateinamen genutzt.",
     "config-sqlite-parent-unwritable-group": "Das Datenverzeichnis <code><nowiki>$1</nowiki></code> kann nicht erzeugt werden, da das übergeordnete Verzeichnis <code><nowiki>$2</nowiki></code> nicht für den Webserver beschreibbar ist.\n\nDas Installationsprogramm konnte den Benutzer bestimmen, mit dem Webserver ausgeführt wird.\nSchreibzugriff auf das <code><nowiki>$3</nowiki></code>-Verzeichnis muss für diesen ermöglicht werden, um den Installationsvorgang fortsetzen zu können.\n\nAuf einem Unix- oder Linux-System:\n<pre>cd $2\nmkdir $3\nchgrp $4 $3\nchmod g+w $3</pre>",
     "config-sqlite-parent-unwritable-nogroup": "Das Datenverzeichnis <code><nowiki>$1</nowiki></code> kann nicht erzeugt werden, da das übergeordnete Verzeichnis <code><nowiki>$2</nowiki></code> nicht für den Webserver beschreibbar ist.\n\nDas Installationsprogramm konnte den Benutzer bestimmen, mit dem Webserver ausgeführt wird.\nSchreibzugriff auf das <code><nowiki>$3</nowiki></code>-Verzeichnis muss global für diesen und andere Benutzer ermöglicht werden, um den Installationsvorgang fortsetzen zu können.\n\nAuf einem Unix- oder Linux-System:\n<pre>cd $2\nmkdir $3\nchmod a+w $3</pre>",
     "config-sqlite-mkdir-error": "Fehler beim Erstellen des Datenverzeichnisses „$1“.\n\nBitte den Speicherort überprüfen und es danach erneut versuchen.",
-    "config-sqlite-dir-unwritable": "Das Verzeichnis „$1“  ist nicht beschreibbar.\nBitte die Zugriffsberechtigungen so ändern, dass dieses Verzeichnis für den Webserver beschreibbar ist und es danach erneut versuchen.",
+    "config-sqlite-dir-unwritable": "Das Verzeichnis „$1“ ist nicht beschreibbar.\nBitte die Zugriffsberechtigungen so ändern, dass dieses Verzeichnis für den Webserver beschreibbar ist und es danach erneut versuchen.",
     "config-sqlite-connection-error": "$1.\n\nBitte unten angegebenes Datenverzeichnis sowie den Datenbanknamen überprüfen und es danach erneut versuchen.",
     "config-sqlite-readonly": "Die Datei <code>$1</code> ist nicht beschreibbar.",
     "config-sqlite-cant-create-db": "Die Datenbankdatei <code>$1</code> konnte nicht erzeugt werden.",
     "config-mysql-innodb": "InnoDB",
     "config-mysql-myisam": "MyISAM",
     "config-mysql-myisam-dep": "'''Warnung:''' Es wurde MyISAM als Speicher-Engine für MySQL ausgewählt, die aus folgenden Gründen nicht für den Einsatz mit MediaWiki empfohlen ist:\n* Sie unterstützt aufgrund von Tabellensperrungen kaum die nebenläufige Ausführung von Aktionen.\n* Sie ist anfälliger für Datenprobleme.\n* Sie wird von MediaWiki nicht immer adäquat unterstützt.\n\nSofern die vorhandene MySQL-Installation die Speicher-Engine InnoDB unterstützt, wird deren Verwendung eindringlich empfohlen.\nSofern sie sie nicht unterstützt, sollte eine entsprechende Aktualisierung nunmehr Erwägung gezogen werden.",
-    "config-mysql-only-myisam-dep": "'''Warnung:''' MyISAM ist die einzige verfügbare Speicher-Engine für MySQL, die nicht für die Verwendung mit MediaWiki empfohlen wird, da sie\n* aufgrund von Tabellensperrungen kaum die nebenläufige Ausführung von Aktionen unterstützt,\n* anfälliger für Datenprobleme ist und\n* von MediaWiki nicht immer adäquat unterstützt wird.\n\nDeine MySQL-Installation unterstützt nicht InnoDB. Eventuell muss eine Aktualisierung durchgeführt werden.",
+    "config-mysql-only-myisam-dep": "'''Warnung:''' MyISAM ist die einzige verfügbare Speicher-Engine für MySQL auf diesem Rechner, und dies wird nicht für die Verwendung mit MediaWiki empfohlen, da sie\n* aufgrund von Tabellensperrungen kaum die nebenläufige Ausführung von Aktionen unterstützt,\n* anfälliger für Datenprobleme ist und\n* von MediaWiki nicht immer adäquat unterstützt wird.\n\nDeine MySQL-Installation unterstützt nicht InnoDB. Eventuell muss eine Aktualisierung durchgeführt werden.",
     "config-mysql-engine-help": "'''InnoDB''' ist fast immer die bessere Wahl, da es gleichzeitige Zugriffe gut unterstützt.\n\n'''MyISAM''' ist in Einzelnutzerumgebungen sowie bei schreibgeschützten Wikis schneller.\nBei MyISAM-Datenbanken treten tendenziell häufiger Fehler auf als bei InnoDB-Datenbanken.",
     "config-mysql-charset": "Datenbankzeichensatz:",
     "config-mysql-binary": "binär",
     "config-mysql-utf8": "UTF-8",
     "config-mysql-charset-help": "Im '''binären Modus''' speichert MediaWiki UTF-8 Texte in der Datenbank in binär kodierte Datenfelder.\nDies ist effizienter als der UTF-8-Modus von MySQL und ermöglicht so die Verwendung jeglicher Unicode-Zeichen.\n\nIm '''UTF-8-Modus''' wird MySQL den Zeichensatz der Daten erkennen und sie richtig anzeigen und konvertieren,\nallerdings können keine Zeichen außerhalb des [//de.wikipedia.org/wiki/Basic_Multilingual_Plane#Gliederung_in_Ebenen_und_Bl.C3.B6cke ''Basic Multilingual Plane'' (BMP)] gespeichert werden.",
+    "config-mssql-auth": "Authentifikationstyp:",
+    "config-mssql-install-auth": "Wähle den Authentifikationstyp aus, der zur Verbindung mit der Datenbank während des Installationsprozesses verwendet wird.\nFalls du „{{int:config-mssql-windowsauth}}“ auswählst, werden die Anmeldeinformationen eines beliebigen Benutzers verwendet, der den Webserver ausführt.",
+    "config-mssql-web-auth": "Wähle den Authentifikationstyp aus, der vom Webserver zur Verbindung mit dem Datenbankserver während des gewöhnlichen Betriebs des Wikis verwendet wird.\nFalls du „{{int:config-mssql-windowsauth}}“ auswählst, werden die Anmeldeinformationen eines beliebigen Benutzers verwendet, der den Webserver ausführt.",
+    "config-mssql-sqlauth": "SQL-Server-Authentifikation",
+    "config-mssql-windowsauth": "Windows-Authentifikation",
     "config-site-name": "Name des Wikis:",
     "config-site-name-help": "Er wird in der Titelleiste des Browsers, wie auch verschiedenen anderen Stellen, genutzt.",
     "config-site-name-blank": "Den Namen des Wikis angeben.",
     "config-ns-invalid": "Der angegebene Namensraum „<nowiki>$1</nowiki>“ ist ungültig.\nBitte einen abweichenden Projektnamensraum angeben.",
     "config-ns-conflict": "Der angegebene Namensraum „<nowiki>$1</nowiki>“ verursacht Problem mit dem Standardnamensraum von MediaWiki.\nBitte einen abweichenden Projektnamensraum angeben.",
     "config-admin-box": "Administratorkonto",
-    "config-admin-name": "Name:",
+    "config-admin-name": "Dein Benutzername:",
     "config-admin-password": "Passwort:",
     "config-admin-password-confirm": "Passwort wiederholen:",
     "config-admin-help": "Bitte den bevorzugten Benutzernamen angeben, beispielsweise „Knut Wuchtig“.\nDies ist der Name, der benötigt wird, um sich im Wiki anzumelden.",
     "config-admin-name-blank": "Bitte den Benutzernamen für den Administratoren angeben.",
     "config-admin-name-invalid": "Der angegebene Benutzername „<nowiki>$1</nowiki>“ ist ungültig.\nBitte einen abweichenden Benutzernamen angeben.",
     "config-admin-password-blank": "Bitte das Passwort für das Administratorkonto angeben.",
-    "config-admin-password-same": "Das Passwort darf nicht mit dem Benutzernamen übereinstimmen.",
     "config-admin-password-mismatch": "Die beiden Passwörter stimmen nicht überein.",
     "config-admin-email": "E-Mail-Adresse:",
     "config-admin-email-help": "Bitte hier eine E-Mail-Adresse angeben, die den E-Mail-Empfang von anderen Benutzern des Wikis, das Zurücksetzen des Passwortes sowie Benachrichtigungen zu Änderungen an beobachteten Seiten ermöglicht. Diese Feld kann leer gelassen werden.",
     "config-admin-error-user": "Es ist beim Erstellen des Administrators mit dem Namen „<nowiki>$1</nowiki>“ ein interner Fehler aufgetreten.",
     "config-admin-error-password": "Es ist beim Setzen des Passworts für den Administrator „<nowiki>$1</nowiki>“ ein interner Fehler aufgetreten: <pre>$2</pre>",
-    "config-admin-error-bademail": "Es wurde eine ungültige E-Mail-Adresse angegeben",
+    "config-admin-error-bademail": "Es wurde eine ungültige E-Mail-Adresse angegeben.",
     "config-subscribe": "Bitte die Mailingliste [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Mitteilungen zu Versionsveröffentlichungen] abonnieren.",
     "config-subscribe-help": "Es handelt sich hierbei um eine Mailingliste mit wenigen Aussendungen, die für Mitteilungen zu Versionsveröffentlichungen, einschließlich wichtiger Sicherheitsveröffentlichungen, genutzt wird.\nDiese Mailingliste sollte abonniert werden. Zudem sollte die MediaWiki-Installation stets aktualisiert werden, sobald eine neue Programmversion veröffentlicht wurde.",
     "config-subscribe-noemail": "Beim Abonnieren der Mailingliste mit Mitteilungen zu Versionsveröffentlichungen wurde keine E-Mail-Adresse angegeben.\nBitte eine E-Mail-Adresse angeben, sofern die Mailingliste abonniert werden soll.",
     "config-profile-help": "Wikis sind am nützlichsten, wenn so viele Menschen als möglich Bearbeitungen vornehmen können.\nMit MediaWiki ist es einfach die letzten Änderungen nachzuvollziehen und unbrauchbare Bearbeitungen, beispielsweise von unbedarften oder böswilligen Benutzern, rückgängig zu machen.\n\nAllerdings finden etliche Menschen Wikis auch mit anderen Bearbeitungskonzepten sinnvoll. Manchmal ist es zudem nicht einfach alle Beteiligten von den Vorteilen des „Wiki-Prinzips” zu überzeugen. Darum ist diese Auswahl möglich.\n\nDas Modell „'''{{int:config-profile-wiki}}'''“ ermöglicht es jedermann, sogar ohne über ein Benutzerkonto zu verfügen, Bearbeitungen vorzunehmen.\nEin Wiki bei dem die '''{{int:config-profile-no-anon}}''' ist, fordert von den Benutzern eine höhere Verantwortung für ihre Bearbeitungen ein, könnte allerdings Personen abschrecken, die nur gelegentlich Bearbeitungen vornehmen wollen. Ein Wiki für '''{{int:config-profile-fishbowl}}''' gestattet es nur bestimmten Benutzern, Bearbeitungen vorzunehmen. Allerdings kann dabei die Allgemeinheit die Seiten immer noch betrachten und Änderungen nachvollziehen. Ein '''{{int:config-profile-private}}''' gestattet es nur ausgewählten Benutzern, Seiten zu betrachten sowie zu bearbeiten.\n\nKomplexere Konzepte zur Zugriffssteuerung können erst nach abgeschlossenem Installationsvorgang eingerichtet werden. Hierzu gibt es weitere Informationen auf der Website mit der [//www.mediawiki.org/wiki/Manual:User_rights entsprechenden Anleitung].",
     "config-license": "Lizenz:",
     "config-license-none": "Keine Lizenzangabe in der Fußzeile",
-    "config-license-cc-by-sa": "Creative Commons „Namensnennung, Weitergabe unter gleichen Bedingungen“",
-    "config-license-cc-by": "Creative Commons „Namensnennung“",
-    "config-license-cc-by-nc-sa": "Creative Commons „Namensnennung, nicht kommerziell, Weitergabe unter gleichen Bedingungen“",
-    "config-license-cc-0": "Creative Commons „Zero“ (Gemeinfreiheit)",
+    "config-license-cc-by-sa": "''Creative Commons'' „Namensnennung – Weitergabe unter gleichen Bedingungen“",
+    "config-license-cc-by": "''Creative Commons'' „Namensnennung“",
+    "config-license-cc-by-nc-sa": "''Creative Commons'' „Namensnennung, nicht kommerziell – Weitergabe unter gleichen Bedingungen“",
+    "config-license-cc-0": "''Creative Commons'' „Zero“ (Gemeinfreiheit)",
     "config-license-gfdl": "GNU-Lizenz für freie Dokumentation 1.3 oder höher",
     "config-license-pd": "Gemeinfreiheit",
     "config-license-cc-choose": "Eine benutzerdefinierte Creative-Commons-Lizenz auswählen",
-    "config-license-help": "Viele öffentliche Wikis publizieren alle Beiträge unter einer [http://freedomdefined.org/Definition/De freien Lizenz].\nDies trägt dazu bei ein Gefühl von Gemeinschaft zu schaffen und ermutigt zu längerfristiger Mitarbeit.\nDahingegen ist im Allgemeinen eine freie Lizenz auf geschlossenen Wikis nicht notwendig.\n\nSofern man Texte aus der Wikipedia verwenden möchte und umgekehrt, sollte die Creative Commons-Lizenz „Namensnennung, Weitergabe unter gleichen Bedingungen“ gewählt werden.\n\nDie Wikipedia nutzte vormals die GNU-Lizenz für freie Dokumentation (GFDL).\nDie GFDL ist eine gültige Lizenz, die allerdings schwer zu verstehen ist.\nEs ist zudem schwierig gemäß dieser Lizenz lizenzierte Inhalten wiederzuverwenden.",
+    "config-license-help": "Viele öffentliche Wikis publizieren alle Beiträge unter einer [http://freedomdefined.org/Definition/De freien Lizenz.]\nDies trägt dazu bei, ein Gefühl von Gemeinschaft zu schaffen, und ermutigt zu längerfristiger Mitarbeit.\nHingegen ist im Allgemeinen eine freie Lizenz auf geschlossenen Wikis nicht notwendig.\n\nSofern man Texte aus der Wikipedia verwenden möchte und umgekehrt, sollte die ''Creative-Commons''-Lizenz „Namensnennung – Weitergabe unter gleichen Bedingungen“ gewählt werden.\n\nDie Wikipedia nutzte vormals die GNU-Lizenz für freie Dokumentation (GFDL).\nDie GFDL ist eine gültige Lizenz, die allerdings schwer zu verstehen ist.\nEs ist zudem schwierig, gemäß dieser Lizenz lizenzierte Inhalte wiederzuverwenden.",
     "config-email-settings": "E-Mail-Einstellungen",
     "config-enable-email": "Ausgehende E-Mails ermöglichen",
     "config-enable-email-help": "Sofern die E-Mail-Funktionen genutzt werden sollen, müssen die entsprechenden [http://www.php.net/manual/en/mail.configuration.php PHP-E-Mail-Einstellungen] richtig konfiguriert werden.\nFür den Fall, dass die E-Mail-Funktionen nicht benötigt werden, können sie hier deaktiviert werden.",
     "config-download-localsettings": "<code>LocalSettings.php</code> herunterladen",
     "config-help": "Hilfe",
     "config-nofile": "Die Datei „$1“ konnte nicht gefunden werden. Wurde sie gelöscht?",
-    "config-extension-link": "Wusstest du, dass dein Wiki [//www.mediawiki.org/wiki/Manual:Extensions Erweiterungen] unterstützt?\n\nDu kannst [//www.mediawiki.org/wiki/Category:Extensions_by_category Erweiterungen nach Kategorie] durchsuchen oder die [//www.mediawiki.org/wiki/Extension_Matrix Erweiterungstabelle] ansehen, um eine volle Erweiterungsliste zu erhalten.",
+    "config-extension-link": "Wusstest du, dass dein Wiki die Nutzung von [//www.mediawiki.org/wiki/Manual:Extensions Erweiterungen] unterstützt?\n\nDu kannst [//www.mediawiki.org/wiki/Category:Extensions_by_category Erweiterungen nach Kategorie] durchsuchen oder die [//www.mediawiki.org/wiki/Extension_Matrix Matrix der Erweiterungen] ansehen, um eine Übersicht zu verfügbaren Erweiterungen zu erhalten.",
     "mainpagetext": "'''MediaWiki wurde erfolgreich installiert.'''",
     "mainpagedocfooter": "Hilfe zur Benutzung und Konfiguration der Wiki-Software findest du im [//meta.wikimedia.org/wiki/Help:Contents Benutzerhandbuch].\n\n== Starthilfen ==\n\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Liste der Konfigurationsvariablen]\n* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki-FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Mailingliste neuer MediaWiki-Versionen]\n* [//www.mediawiki.org/wiki/Localisation#Translation_resources Lokalisiere MediaWiki für deine Sprache]"
-}
\ No newline at end of file
+}
index 78daf1d..d9249a4 100644 (file)
@@ -2,11 +2,14 @@
     "@metadata": {
         "authors": [
             "Erdemaslancan",
-            "Mirzali"
+            "Mirzali",
+            "Marmase"
         ]
     },
+    "config-desc": "Qandé MediaWiki sazi",
     "config-title": "MediaWiki $1 sazkerdış",
     "config-information": "Melumat",
+    "config-localsettings-key": "Kesay berzkerdin:",
     "config-your-language": "Zıwanê şıma:",
     "config-wiki-language": "Wiki zıwan:",
     "config-back": "← Peyser",
     "config-charset-mysql5-binary": "MySQL 4.1/5.0 dılet",
     "config-charset-mysql5": "MySQL 4.1/5.0 UTF-8",
     "config-db-port": "Portê database:",
-    "config-header-mysql": "Sazkardışê MySQL",
+    "config-header-mysql": "Eyarê MySQL",
     "config-mysql-innodb": "InnoDB",
     "config-mysql-myisam": "MyISAM",
     "config-mysql-binary": "Dılet",
     "config-mysql-utf8": "UTF-8",
     "config-site-name": "Namey wiki:",
+    "config-site-name-blank": "Yew nameyê sita cıkewe.",
+    "config-project-namespace": "Wareyê nameyê procey:",
     "config-ns-generic": "Proce",
     "config-ns-other": "Zewbi (keyfiyo)",
     "config-ns-other-default": "MyWiki",
     "config-admin-box": "Hesabê Administratori",
-    "config-admin-name": "Namey şıma:",
+    "config-admin-name": "Namey  karberdé to:",
     "config-admin-password": "Parola:",
     "config-admin-password-confirm": "Fına parola:",
     "config-admin-email": "Adresa e-postey:",
+    "config-profile-wiki": "Wiki Ak",
     "config-profile-private": "Bexse wiki",
+    "config-license": "Heqa telifi û lisans:",
     "config-license-cc-by-sa": "Creative Commons Attribution Share Alike",
     "config-license-cc-by": "Creative Commons Attribution",
     "config-license-cc-by-nc-sa": "Creative Commons Attribution Non-Commercial Share Alike",
     "config-license-pd": "Malê Şari",
+    "config-email-settings": "Sazê e-posta",
+    "config-logo": "URL'ey Logoy:",
     "config-extensions": "Olekeni",
+    "config-install-step-done": "qeyd ke",
+    "config-install-step-failed": "nêbı",
+    "config-install-schema": "Şema dek",
+    "config-install-pg-commit": "Vırnayışa cemaati",
+    "config-install-tables": "Tabloy dek",
     "config-help": "peşti",
     "mainpagetext": "'''MediaWiki vıst ra ser, vıraziya.'''",
-    "mainpagedocfooter": "Seba gurenayış u eyarkerdışê Wiki-Softwarey [//meta.wikimedia.org/wiki/Help:Contents İdarê karberi] de mıracaet ke.\n\n== Yardımê Sıftekerdışi ==\n\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Lista eyaranê vıraştışi]\n* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki de ÇZP]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki ra lista serbest-dayışê postey]"
-}
\ No newline at end of file
+    "mainpagedocfooter": "Qandé ğebtiyayışi u sazkerdeışi Wiki-Softwarey [//meta.wikimedia.org/wiki/Help:Contents İdarê karberi] de mıracaet ke.\n\n== Destega sergendi ==\n\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Lista eyaranê vıraştışi]\n* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki de ÇZP]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki ra lista serbest-dayışê postey]\n* [//www.mediawiki.org/wiki/Localisation#Translation_resources Zıwandé şıma de Lokal MediaWiki]"
+}
index da8bd44..7a55a99 100644 (file)
@@ -6,4 +6,4 @@
     },
     "mainpagetext": "'''MediaWiki jo se wuspěšnje instalěrowało.'''",
     "mainpagedocfooter": "Pomoc pśi wužywanju softwary wiki namakajoš pód [//meta.wikimedia.org/wiki/Help:Contents User's Guide].\n\nPomoc pśi wužywanju softwary wiki namakajoš pód [//meta.wikimedia.org/wiki/Help:Contents User's Guide].\n\n== Na zachopjenje ==\n\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Konfiguracija lisćiny połoženjow]\n* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki FAQ (pšašanja a wótegrona)]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lisćina e-mailowych nakładow MediaWiki]\n* [//www.mediawiki.org/wiki/Localisation#Translation_resources MediaWiki za twóju rěc lokalizěrowaś]"
-}
\ No newline at end of file
+}
index 2280a90..d93a56c 100644 (file)
@@ -6,4 +6,4 @@
     },
     "mainpagetext": "'''Nopongo no do popodokot ot ModiaWiki.'''",
     "mainpagedocfooter": "Rujuko hilo [//meta.wikimedia.org/wiki/Help:Contents Ponudukan Momomoguno] kokomoi koilaan do momoguno posusuang-suangon wiki.\n\n== Kopotimpuunan ==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Lis papatantu nuludan]\n* [//www.mediawiki.org/wiki/Manual:FAQ Ponguhatan Koinsoruan om Simbar ModiaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lis pininsuratan pinolabus do ModiaWiki]"
-}
\ No newline at end of file
+}
index c88b749..81ded36 100644 (file)
@@ -3,28 +3,39 @@
         "authors": [
             "Glavkos",
             "Protnet",
-            "ZaDiak"
+            "ZaDiak",
+            "Astralnet"
         ]
     },
     "config-desc": "Το πρόγραμμα εγκατάστασης για το MediaWiki",
     "config-title": "Εγκατάσταση MediaWiki $1",
     "config-information": "Πληροφορίες",
+    "config-localsettings-badkey": "Το κλειδί που δώσατε είναι εσφαλμένο.",
     "config-your-language": "Η γλώσσα σας:",
     "config-wiki-language": "Γλώσσα του wiki:",
     "config-back": "← Πίσω",
     "config-continue": "Συνέχεια →",
     "config-page-language": "Γλώσσα",
     "config-page-welcome": "Καλώς ήλθατε στο MediaWiki!",
+    "config-page-dbconnect": "Σύνδεση με βάση δεδομένων",
+    "config-page-upgrade": "Αναβάθμιση υπάρχουσας εγκατάστασης",
+    "config-page-dbsettings": "Ρυθμίσεις της βάσης δεδομένων",
     "config-page-name": "Όνομα",
     "config-page-options": "Επιλογές",
     "config-page-install": "Εγκατάσταση",
     "config-page-complete": "Ολοκληρώθηκε!",
     "config-page-restart": "Επανεκκίνηση εγκατάστασης",
+    "config-page-readme": "Διαβάστε με",
+    "config-page-releasenotes": "Σημειώσεις έκδοσης",
     "config-page-copying": "Αντιγραφή",
     "config-page-upgradedoc": "Αναβάθμιση",
     "config-page-existingwiki": "Υπάρχον βίκι",
+    "config-help-restart": "Θέλετε να καταργήσετε όλα τα αποθηκευμένα δεδομένα που έχετε εισάγει και να επανεκκινήσετε τη διαδικασία εγκατάστασης;",
     "config-restart": "Ναι, κάντε επανεκκίνηση",
+    "config-env-good": "Το περιβάλλον έχει ελεγχθεί.\nΜπορείτε να εγκαταστήσετε το MediaWiki.",
+    "config-env-bad": "Το περιβάλλον έχει ελεγχθεί.\nΔεν μπορείτε να εγκαταστήσετε το MediaWiki.",
     "config-env-php": "H PHP $1 είναι εγκατεστημένη.",
+    "config-env-php-toolow": "PHP  $1 εγκαταστάθηκε.\nΩστόσο, το MediaWiki απαιτεί PHP  $2  ή μεταγενέστερη έκδοση.",
     "config-db-type": "Τύπος βάσης δεδομένων:",
     "config-db-host": "Φιλοξενία βάσης δεδομένων:",
     "config-db-wiki-settings": "Αναγνώριση αυτού του βίκι",
@@ -46,7 +57,7 @@
     "config-ns-site-name": "Ίδιο με το όνομα του wiki: $1",
     "config-ns-other": "Άλλο (προσδιορίστε)",
     "config-admin-box": "Λογαριασμός διαχειριστή",
-    "config-admin-name": "Το Ï\8cνομά σας:",
+    "config-admin-name": "Το Ï\8cνομα Ï\87Ï\81ήÏ\83Ï\84η σας:",
     "config-admin-password": "Κωδικός πρόσβασης:",
     "config-admin-password-confirm": "Επανάληψη κωδικού πρόσβασης:",
     "config-admin-email": "Διεύθυνση ηλεκτρονικού ταχυδρομείου:",
@@ -65,4 +76,4 @@
     "config-help": "βοήθεια",
     "mainpagetext": "'''To λογισμικό MediaWiki εγκαταστάθηκε με επιτυχία.'''",
     "mainpagedocfooter": "Περισσότερες πληροφορίες σχετικά με τη χρήση και με τη ρύθμιση παραμέτρων θα βρείτε στους συνδέσμους: [//meta.wikimedia.org/wiki/MediaWiki_localisation Οδηγίες για τροποποίηση του περιβάλλοντος εργασίας] και [//meta.wikimedia.org/wiki/MediaWiki_User%27s_Guide Εγχειρίδιο χρήστη]."
-}
\ No newline at end of file
+}
index 2f836ca..1f23c3d 100644 (file)
@@ -4,11 +4,19 @@
             "Shirayuki"
         ]
     },
+    "config-copyright": "=== Copyright and Terms ===\n\n$1\n\nThis program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public Licence as published by the Free Software Foundation; either version 2 of the Licence, or (at your option) any later version.\n\nThis program is distributed in the hope that it will be useful, but '''without any warranty'''; without even the implied warranty of '''merchantability''' or '''fitness for a particular purpose'''.\nSee the GNU General Public Licence for more details.\n\nYou should have received <doclink href=Copying>a copy of the GNU General Public Licence</doclink> along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. or [http://www.gnu.org/copyleft/gpl.html read it online].",
     "config-unicode-using-utf8": "Using Brion Vibber's utf8_normalize.so for Unicode normalisation.",
     "config-unicode-using-intl": "Using the [http://pecl.php.net/intl intl PECL extension] for Unicode normalisation.",
     "config-unicode-pure-php-warning": "'''Warning:''' The [http://pecl.php.net/intl intl PECL extension] is not available to handle Unicode normalisation, falling back to slow pure-PHP implementation.\nIf you run a high-traffic site, you should read a little on [//www.mediawiki.org/wiki/Unicode_normalization_considerations Unicode normalisation].",
     "config-unicode-update-warning": "'''Warning:''' The installed version of the Unicode normalisation wrapper uses an older version of [http://site.icu-project.org/ the ICU project's] library.\nYou should [//www.mediawiki.org/wiki/Unicode_normalization_considerations upgrade] if you are at all concerned about using Unicode.",
     "config-unknown-collation": "'''Warning:''' Database is using unrecognised collation.",
     "config-profile-fishbowl": "Authorised editors only",
+    "config-license": "Copyright and licence:",
+    "config-license-none": "No licence footer",
+    "config-license-gfdl": "GNU Free Documentation Licence 1.3 or later",
+    "config-license-cc-choose": "Select a custom Creative Commons licence",
+    "config-license-help": "Many public wikis put all contributions under a [http://freedomdefined.org/Definition free licence].\nThis helps to create a sense of community ownership and encourages long-term contribution.\nIt is not generally necessary for a private or corporate wiki.\n\nIf you want to be able to use text from Wikipedia, and you want Wikipedia to be able to accept text copied from your wiki, you should choose '''Creative Commons Attribution Share Alike'''.\n\nWikipedia previously used the GNU Free Documentation Licence.\nThe GFDL is a valid licence, but it is difficult to understand.\nIt is also difficult to reuse content licenced under the GFDL.",
+    "config-cc-error": "The Creative Commons licence chooser gave no result.\nEnter the licence name manually.",
+    "config-cc-not-chosen": "Choose which Creative Commons licence you want and click \"proceed\".",
     "config-install-stats": "Initialising statistics"
-}
\ No newline at end of file
+}
index 45149c5..de27766 100644 (file)
@@ -76,7 +76,7 @@
     "config-gd": "Found GD graphics library built-in.\nImage thumbnailing will be enabled if you enable uploads.",
     "config-no-scaling": "Could not find GD library or ImageMagick.\nImage thumbnailing will be disabled.",
     "config-no-uri": "<strong>Error:</strong> Could not determine the current URI.\nInstallation aborted.",
-    "config-no-cli-uri": "<strong>Warning:</strong> No --scriptpath specified, using default: <code>$1</code>.",
+    "config-no-cli-uri": "<strong>Warning:</strong> No <code>--scriptpath</code> specified, using default: <code>$1</code>.",
     "config-using-server": "Using server name \"<nowiki>$1</nowiki>\".",
     "config-using-uri": "Using server URL \"<nowiki>$1$2</nowiki>\".",
     "config-uploads-not-safe": "<strong>Warning:</strong> Your default directory for uploads <code>$1</code> is vulnerable to arbitrary scripts execution.\nAlthough MediaWiki checks all uploaded files for security threats, it is highly recommended to [//www.mediawiki.org/wiki/Manual:Security#Upload_security close this security vulnerability] before enabling uploads.",
@@ -97,6 +97,7 @@
     "config-db-username": "Database username:",
     "config-db-password": "Database password:",
     "config-db-password-empty": "Please enter a password for the new database user: $1.\nWhile it may be possible to create users with no passwords, it is not secure.",
+    "config-db-username-empty": "You must enter a value for \"{{int:config-db-username}}\"",
     "config-db-install-username": "Enter the username that will be used to connect to the database during the installation process.\nThis is not the username of the MediaWiki account; this is the username for your database.",
     "config-db-install-password": "Enter the password that will be used to connect to the database during the installation process.\nThis is not the password for the MediaWiki account; this is the password for your database.",
     "config-db-install-help": "Enter the username and password that will be used to connect to the database during the installation process.",
     "config-header-sqlite": "SQLite settings",
     "config-header-oracle": "Oracle settings",
     "config-header-mssql": "Microsoft SQL Server settings",
-    "config-invalid-db-type": "Invalid database type",
-    "config-missing-db-name": "You must enter a value for \"Database name\"",
-    "config-missing-db-host": "You must enter a value for \"Database host\"",
-    "config-missing-db-server-oracle": "You must enter a value for \"Database TNS\"",
-    "config-invalid-db-server-oracle": "Invalid database TNS \"$1\".\nUse either \"TNS Name\" or an \"Easy Connect\" string ([http://docs.oracle.com/cd/E11882_01/network.112/e10836/naming.htm Oracle Naming Methods])",
+    "config-invalid-db-type": "Invalid database type.",
+    "config-missing-db-name": "You must enter a value for \"{{int:config-db-name}}\".",
+    "config-missing-db-host": "You must enter a value for \"{{int:config-db-host}}\".",
+    "config-missing-db-server-oracle": "You must enter a value for \"{{int:config-db-host-oracle}}\".",
+    "config-invalid-db-server-oracle": "Invalid database TNS \"$1\".\nUse either \"TNS Name\" or an \"Easy Connect\" string ([http://docs.oracle.com/cd/E11882_01/network.112/e10836/naming.htm Oracle Naming Methods]).",
     "config-invalid-db-name": "Invalid database name \"$1\".\nUse only ASCII letters (a-z, A-Z), numbers (0-9), underscores (_) and hyphens (-).",
     "config-invalid-db-prefix": "Invalid database prefix \"$1\".\nUse only ASCII letters (a-z, A-Z), numbers (0-9), underscores (_) and hyphens (-).",
     "config-connection-error": "$1.\n\nCheck the host, username and password and try again.",
     "config-extension-link": "Did you know that your wiki supports [//www.mediawiki.org/wiki/Manual:Extensions extensions]?\n\nYou can browse [//www.mediawiki.org/wiki/Category:Extensions_by_category extensions by category] or the [//www.mediawiki.org/wiki/Extension_Matrix Extension Matrix] to see the full list of extensions.",
     "mainpagetext": "<strong>MediaWiki has been successfully installed.</strong>",
     "mainpagedocfooter": "Consult the [//meta.wikimedia.org/wiki/Help:Contents User's Guide] for information on using the wiki software.\n\n== Getting started ==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Configuration settings list]\n* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]\n* [//www.mediawiki.org/wiki/Localisation#Translation_resources Localise MediaWiki for your language]"
-}
\ No newline at end of file
+}
index baeed82..569bebe 100644 (file)
@@ -2,19 +2,44 @@
     "@metadata": {
         "authors": [
             "Airon90",
-            "Yekrats"
+            "Yekrats",
+            "KuboF"
         ]
     },
+    "config-desc": "Instalilo de MediaWiki",
+    "config-title": "Instalado de MediaWiki $1",
+    "config-information": "Informo",
+    "config-localsettings-badkey": "Provizita ŝlosilo estas malĝusta.",
     "config-your-language": "Via lingvo:",
     "config-your-language-help": "Elekti lingvon uzi dum la instalada procezo.",
     "config-wiki-language": "Lingvo de la vikio:",
     "config-wiki-language-help": "Elekti la ĉefe skribotan lingvon de la vikio.",
+    "config-back": "← Reen",
+    "config-continue": "Daŭrigi →",
+    "config-page-language": "Lingvo",
     "config-page-welcome": "Bonvenon al MediaWiki!",
+    "config-page-dbconnect": "Konekto al datumbazo",
     "config-page-dbsettings": "Agordoj de la datumbazo",
     "config-page-name": "Nomo",
     "config-page-options": "Agordoj",
     "config-page-install": "Instali",
     "config-page-complete": "Farita!",
+    "config-page-restart": "Restarti instaladon",
+    "config-page-readme": "Legu min",
+    "config-page-releasenotes": "Eldonaj notoj",
+    "config-page-existingwiki": "Ekzistanta vikio",
+    "config-restart": "Jes, restarti ĝin",
+    "config-env-good": "La medio estis kontrolita.\nVi povas instali MediaWiki.",
+    "config-env-bad": "La medio estis kontrolita.\nNe eblas instali MediaWiki.",
+    "config-env-php": "PHP $1 estas instalita.",
+    "config-env-php-toolow": "PHP $1 estas instalita.\nTamen, MediaWiki bezonas PHP $2 aŭ pli novan.",
+    "config-xcache": "[http://xcache.lighttpd.net/ XCache] estas instalita.",
+    "config-apc": "[http://www.php.net/apc APC] estas instalita",
+    "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache] estas instalita",
+    "config-diff3-bad": "GNU diff3 ne estis trovita.",
+    "config-db-type": "Tipo de datumbazo:",
+    "config-charset-mysql5": "MySQL 4.1/5.0 UTF-8",
+    "config-type-mysql": "MySQL (aŭ kongrua)",
     "mainpagetext": "'''MediaWiki estis sukcese instalita.'''",
-    "mainpagedocfooter": "Konsultu la [//meta.wikimedia.org/wiki/MediaWiki_User%27s_Guide User's Guide] por informo pri uzado de vikia programaro.\n\n==Kiel komenci==\n\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Listo de konfiguraĵoj] (angla)\n* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki Oftaj Demandoj] (angla)\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki dissendolisto pri anoncoj] (angla)"
-}
\ No newline at end of file
+    "mainpagedocfooter": "Konsultu la [//meta.wikimedia.org/wiki/MediaWiki_User%27s_Guide Gvidilon por uzantoj de MediaWiki] por informoj pri uzado de vikia programaro.\n\n==Kiel komenci==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Listo de konfiguraĵoj] (angle)\n* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki Oftaj Demandoj] (angle)\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Anonco-dissendolisto pri MediaWiki] (angle)\n* [//www.mediawiki.org/wiki/Localisation#Translation_resources Preklad MediaWiki do tvojho jazyka]"
+}
index 12a94c7..c061ff5 100644 (file)
@@ -5,4 +5,4 @@
         ]
     },
     "mainpagedocfooter": "Consulte usted la [//meta.wikimedia.org/wiki/Ayuda:Contenido Guía de usuario] para obtener información sobre el uso del software wiki.\n\n== Empezando ==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Lista de ajustes de configuración]\n* [//www.mediawiki.org/wiki/Manual:FAQ/es FAQ de MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lista de correo de anuncios de distribución de MediaWiki]"
-}
\ No newline at end of file
+}
index acf0f02..f908735 100644 (file)
             "Sanbec",
             "Translationista",
             "Vivaelcelta",
-            "아라"
+            "아라",
+            "Amire80",
+            "Benfutbol10",
+            "Carlitosag",
+            "Chocolate con galleta",
+            "Csbotero",
+            "Sporeunai"
         ]
     },
-    "config-desc": "El instalador para MediaWiki",
-    "config-title": "MediaWiki $1 instalación",
+    "config-desc": "El instalador de MediaWiki",
+    "config-title": "Instalación de MediaWiki $1",
     "config-information": "Información",
     "config-localsettings-upgrade": "Se ha encontrado un archivo <code>LocalSettings.php</code>.\nPara actualizar esta instalación, por favor ingresa el valor de <code>$wgUpgradeKey</code> en el cuadro de abajo.\nLo encontrarás en <code>LocalSettings.php</code>.",
     "config-localsettings-cli-upgrade": "Se ha detectado un archivo <code>LocalSettings.php</code>.\nPara actualizar la instalación, vuelva a ejecutar <code>update.php</code>",
@@ -24,8 +30,8 @@
     "config-localsettings-badkey": "La clave proporcionada es incorrecta.",
     "config-upgrade-key-missing": "Se ha detectado una instalación existente de MediaWiki.\nPara actualizar la instalación, por favor, ponga la siguiente línea al final de su archivo <code>LocalSettings.php</code>:\n\n$1",
     "config-localsettings-incomplete": "El archivo <code>LocalSettings.php</code> existente parece estar incompleto.\nLa variable $1 no está definida.\nCambie el archivo <code>LocalSettings.php</code> para que esta variable quede establecida y haga clic en \"{{int:Config-continue}}\".",
-    "config-localsettings-connection-error": "Se detectó un error al conectarse a la base de datos utilizando la configuración especificada en los archivos <code>LocalSettings.php</code> o <code>AdminSettings.php</code>. Corrija estas opciones y vuelva a intentarlo.\n\n$1",
-    "config-session-error": "Error comenzando sesión: $1",
+    "config-localsettings-connection-error": "Se ha producido un error al conectar a la base de datos utilizando la configuración especificada en <code>LocalSettings.php</code> . Por favor arreglar estos ajustes e inténtelo de nuevo.\n\n$1",
+    "config-session-error": "Error al iniciar la sesión: $1",
     "config-session-expired": "Tus datos de sesión parecen haber expirado.\nLas sesiones están configuradas por una duración de $1.\nPuedes incrementar esto configurando <code>session.gc_maxlifetime</code> en php.ini.\nReiniciar el proceso de instalación.",
     "config-no-session": "Se han perdido los datos de sesión.\nVerifica tu php.ini y comprueba que <code>session.save_path</code> está establecido en un directorio apropiado.",
     "config-your-language": "Tu idioma:",
     "config-back": "← Atrás",
     "config-continue": "Continuar →",
     "config-page-language": "Idioma",
-    "config-page-welcome": "Bienvenido a MediaWiki!",
+    "config-page-welcome": "Te damos la bienvenida a MediaWiki.",
     "config-page-dbconnect": "Conectar a la base de datos",
     "config-page-upgrade": "Actualizar instalación existente",
     "config-page-dbsettings": "Configuración de la base de datos",
     "config-page-name": "Nombre",
     "config-page-options": "Opciones",
     "config-page-install": "Instalar",
-    "config-page-complete": "Completo!",
+    "config-page-complete": "Hecho.",
     "config-page-restart": "Reiniciar instalación",
     "config-page-readme": "Léeme",
     "config-page-releasenotes": "Notas de la versión",
@@ -51,7 +57,7 @@
     "config-page-existingwiki": "Wiki existente",
     "config-help-restart": "¿Deseas borrar todos los datos que has ingresado hasta ahora y reiniciar el proceso de instalación desde el principio?",
     "config-restart": "Sí, reiniciarlo",
-    "config-welcome": "=== Comprobación del entorno ===\nSe realiza comprobaciones básicas para ver si el entorno es adecuado para la instalación de MediaWiki.\nDeberás suministrar los resultados de tales comprobaciones si necesitas ayuda durante la instalación.",
+    "config-welcome": "=== Comprobación del entorno ===\nAhora se van a realizar comprobaciones básicas para ver si el entorno es adecuado para la instalación de MediaWiki.\nRecuerda suministrar los resultados de tales comprobaciones si necesitas ayuda para completar la instalación.",
     "config-copyright": "=== Derechos de autor y Términos de uso ===\n\n$1\n\nEste programa es software libre; puedes redistribuirlo y/o modificarlo en los términos de la Licencia Pública General de GNU, tal como aparece publicada por la Fundación para el Software Libre, tanto la versión 2 de la Licencia, como cualquier versión posterior (según prefiera).\n\nEste programa es distribuido en la esperanza de que sea útil, pero '''sin cualquier garantía'''; inclusive, sin la garantía implícita de la '''posibilidad de ser comercializado''' o de '''idoneidad para cualquier finalidad específica'''.\nConsulte la licencia *GNU General *Public *License para más detalles.\n\nEn conjunto con este programa debe haber recibido <doclink href=Copying>una copia de la Licencia Pública General de GNU</doclink>; si no la recibió, pídala por escrito a Fundación para el Software Libre, Inc., 51 Franklin Street, Fifth Floor, Boston, ME La 02110-1301, USA o [http://www.gnu.org/copyleft/gpl.html léala en internet].",
     "config-sidebar": "* [//www.mediawiki.org Página principal de MediaWiki]\n* [//www.mediawiki.org/wiki/Help:Contents Guía del usuario]\n* [//www.mediawiki.org/wiki/Manual:Contents Guía del administrador]\n* [//www.mediawiki.org/wiki/Manual:FAQ Preguntas frecuentes]\n----\n* <doclink href=Readme>Léeme</doclink>\n* <doclink href=ReleaseNotes>Notas de la versión</doclink>\n* <doclink href=Copying>Copia</doclink>\n* <doclink href=UpgradeDoc>Actualización</doclink>",
     "config-env-good": "El entorno ha sido comprobado.\nPuedes instalar MediaWiki.",
     "config-unicode-using-intl": "Usando la [http://pecl.php.net/intl extensión intl PECL] para la normalización Unicode.",
     "config-unicode-pure-php-warning": "'''Advertencia''': La [http://pecl.php.net/intl extensión intl] no está disponible para efectuar la normalización Unicode. Utilizando la implementación más lenta en PHP.\nSi tu web tiene mucho tráfico, te recomendamos leer acerca de la [//www.mediawiki.org/wiki/Unicode_normalization_considerations normalización Unicode].",
     "config-unicode-update-warning": "'''Warning''': La versión instalada del contenedor de normalización Unicode usa una versión anterior de la biblioteca del [http://site.icu-project.org/ proyecto ICU].\nDeberás [//www.mediawiki.org/wiki/Unicode_normalization_considerations actualizar] si realmente deseas usar Unicode.",
-    "config-no-db": "No fue posible encontrar un controlador adecuado para la base de datos! Necesitas instalar un controlador de base de datos para PHP.\nLas siguientes bases de datos son soportadas: $1.\nSi estás en alojamiento compartido, pregunta a tu proveedor el instalar un controlador de base de datos adecuado.\nSi estás compilando PHP por ti mismo, reconfigúralo con un cliente de base de datos disponible, por ejemplo usando <code>./configure --with-mysql</code>.\nSi instalaste PHP de un paquete Debian o Ubuntu, entonces también necesitas instalar el módulo php5-mysql.",
+    "config-no-db": "¡No fue posible encontrar un controlador adecuado para la base de datos! Necesitas instalar un controlador de base de datos para PHP.\nLos siguientes sistemas gestores de bases de datos están soportados: $1.\n\nSi compilaste PHP tú mismo, debes reconfigurarlo habilitando un cliente de base de datos, por ejemplo, usando <code>./configure --with-mysqli</code>.\nSi instalaste PHP desde un paquete Debian o Ubuntu, entonces también necesitas instalar, por ejemplo, el paquete <code>php5-mysql</code>.",
     "config-outdated-sqlite": "''' Advertencia ''': tiene la versión SQLite $1, que es inferior a la mínima versión requerida: $2 . SQLite no estará disponible.",
     "config-no-fts3": "'''Advertencia''': SQLite está compilado sin el [//sqlite.org/fts3.html módulo FTS3]. Las funcionalidades de búsqueda no estarán disponibles en esta instalación.",
     "config-register-globals": "'''Advertencia: La opción de <code>[http://php.net/register_globals register_globals]</code> de PHP está habilitada.'''\n'''Desactívela si puede.'''\nMediaWiki funcionará, pero tu servidor quedará expuesto a vulnerabilidades de seguridad potenciales.",
     "config-magic-quotes-runtime": "'''Fatal: ¡[http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-runtime magic_quotes_runtime] está activada!'''\nEsta opción causa la imprevisible corrupción de la entrada de datos.\nNo puedes instalar o utilizar MediaWiki a menos que esta opción esté inhabilitada.",
     "config-magic-quotes-sybase": "'''Fatal: ¡[http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-sybase magic_quotes_sybase] está activada!'''\nEsta opción causa la imprevisible corrupción de la entrada de datos.\nNo puedes instalar o utilizar MediaWiki a menos que esta opción esté inhabilitada.",
     "config-mbstring": "'''Fatal: La opción [http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload] está activada!'''\nEsta opción causa errores y puede corromper los datos de una forma imprevisible.\nNo se puede instalar o usar MediaWiki a menos que esta opción sea desactivada.",
-    "config-ze1": "'''Fatal: ¡La opción [http://www.php.net/manual/en/ini.core.php zend.ze1_compatibility_mode] está activada!'''\nEsta opción causa problemas significativos en MediaWiki.\nNo se puede instalar o usar MediaWiki a menos que esta opción sea desactivada.",
     "config-safe-mode": "'''Advertencia:''' El [http://www.php.net/features.safe-mode modo seguro] de PHP está activado.\nEste modo puede causar problemas, especialmente en la carga de archivosy en compatibilidad con <code>math</code>.",
     "config-xml-bad": "Falta el módulo XML de PHP.\nMediaWiki necesita funciones en este módulo y no funcionará con esta configuración.\nSi está ejecutando Mandrake, instale el paquete php-xml.",
-    "config-pcre": "Parece faltar el módulo de compatibilidad PCRE.\nMediaWiki necesita que las funciones de expresiones regulares compatibles con Perl estén funcionando.",
+    "config-pcre-old": "'''Fatal:''' Se requiere PCRE $1 o posterior.\nSu PHP binario está enlazado con PCRE $2.\n[https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/PCRE Más información].",
     "config-pcre-no-utf8": "'''Error fatal ''': Parece que el módulo PCRE de PHP fue compilado sin el soporte PCRE_UTF8.\nMediaWiki requiere compatibilidad con UTF-8 para funcionar correctamente.",
     "config-memory-raised": "el parámetro <code>memory_limit</code> de PHP es $1, aumentada a $2.",
     "config-memory-bad": "'''Advertencia:''' El parámetro <code>memory_limit</code> de PHP es $1.\nProbablemente este valor es demasiado bajo.\n¡La instalación podrá fallar!",
-    "config-ctype": "'''Fatal''': PHP debe ser compilado con soporte para la [http://www.php.net/manual/en/ctype.installation.php extensión Ctype].",
+    "config-ctype": "'''Fatal''': Se necesita compilar PHP con compatibilidad para la [http://www.php.net/manual/en/ctype.installation.php extensión Ctype].",
+    "config-json": "'''Fatal:''' PHP fue compilado sin soporte para JSON.\nDebes instalar la extensión JSON o la extensión [http://pecl.php.net/package/jsonc PECL jsonc] antes de instalar MediaWiki.\n* La extensión PHP se incluye en Red Hat Enterprise Linux (CentOS) 5 y 6, aunque debe habilitarse en <code>/etc/php.ini</code> o <code>/etc/php.d/json.ini</code>.\n* Algunas distribuciones Linux liberadas después de mayo del 2013 omiten la extensión PHP, y en su lugar disponen de la extensión PECL en el paquete <code>php5-json</code> o <code>php-pecl-jsonc</code>.",
     "config-xcache": "[http://xcache.lighttpd.net/ XCache] está instalado",
     "config-apc": "[http://www.php.net/apc APC] está instalado",
     "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache] está instalado",
     "config-no-cache": "'''Advertencia:''' No pudo encontrarse [http://www.php.net/apc APC], [http://xcache.lighttpd.net/ XCache] o [http://www.iis.net/download/WinCacheForPhp WinCache].\nEl caché de objetos no está habilitado.",
     "config-mod-security": "''' Advertencia ''': Su servidor web tiene [http://modsecurity.org/ mod_security] habilitado. Si la configuración es incorrecta, puede causar problemas a MediaWiki u otro software que permita a los usuarios publicar contenido arbitrarios.\nConsulte la [http://modsecurity.org/documentation/ documentación de mod_security] o contacte con el soporte de su servidor (''host'') si encuentra errores aleatorios.",
     "config-diff3-bad": "GNU diff3 no se encuentra.",
+    "config-git": "Se encontró el ''software'' de control de versiones Git: <code>$1</code>.",
     "config-git-bad": "No se encontró el software de control de versiones Git.",
     "config-imagemagick": "ImageMagick encontrado: <code>$1</code>.\nLa miniaturización de imágenes se habilitará si habilitas las cargas.",
     "config-gd": "Se ha encontrado una biblioteca de gráficos GD integrada.\nLa miniaturización de imágenes se habilitará si habilitas las subidas.",
     "config-no-scaling": "No se ha encontrado ninguma biblioteca GD o ImageMagik.\nSe inhabilitará la miniaturización de imágenes.",
-    "config-no-uri": "'''Error:''' No se pudo determinar el URI actual.\nInstalación abortada.",
-    "config-no-cli-uri": "''' Advertencia ''': No se ha especificado ningún --scriptpath, por defecto, se usará: <code>$1</code> .",
+    "config-no-uri": "'''Error:''' No se pudo determinar el URI actual.\nSe interrumpió la instalación.",
+    "config-no-cli-uri": "''' Advertencia ''': No se ha especificado ningún <code>--scriptpath</code>, por defecto se usará: <code>$1</code> .",
     "config-using-server": "Utilizando el nombre de servidor \"<nowiki>$1</nowiki>\".",
     "config-using-uri": "Utilizando la dirección URL del servidor \"<nowiki>$1$2</nowiki>\".",
     "config-uploads-not-safe": "'''Atención:''' Su directorio por defecto para las cargas, <code>$1</code>, es vulnerable a la ejecución de scripts arbitrarios.\nAunque MediaWiki comprueba todos los archivos cargados por si hubiese amenazas de seguridad, es altamente recomendable [//www.mediawiki.org/wiki/Manual:Security#Upload_security cerrar esta vulnerabilidad de seguridad] antes de activar las cargas.",
     "config-no-cli-uploads-check": "'''Atención:''' Su directorio predeterminado para cargas (<code>$1</code>) no está comprobado para la vulnerabilidad\n de ejecución arbitraria de comandos script durante la instalación de CLI.",
-    "config-brokenlibxml": "El sistema tiene una combinación de versiones de PHP y de libxml2 que puede ser problemática y puede causar daños en datos ocultos de MediaWiki y otras aplicaciones web\nActualizar a PHP 5.2.9 o posterior y a libxml2 2.7.3 o posterior ([//bugs.php.net/bug.php?id=45996 bug presentado con PHP]).\nInstalación anulada.",
-    "config-using531": "MediaWiki no puede utilizarse con PHP $1 debido a un error con los parámetros de referencia para <code>__call()</code> .\nActualice el sistema a PHP 5.3.2 o superior, o vuelva a la versión PHP 5.3.0 para resolver este problema.\nInstalación anulada.",
+    "config-brokenlibxml": "El sistema tiene una combinación de versiones de PHP y de libxml2 que es poco confiable y puede provocar corrupción oculta en los datos de MediaWiki y otras aplicaciones web.\nActualizar a PHP 5.2.9 o posterior y a libxml2 2.7.3 o posterior ([//bugs.php.net/bug.php?id=45996 bug reportado con PHP]).\nInstalación abortada.",
     "config-suhosin-max-value-length": "Suhosin está instalado y limita el parámetro <code>length</code> GET a $1 bytes.\nEl componente ResourceLoader (gestor de recursos) de MediaWiki trabajará en este límite, pero eso perjudicará el rendimiento.\nSi es posible, deberías establecer <code>suhosin.get.max_value_length</code> en el valor 1024 o superior en <code>php.ini</code> y establecer <code>$wgResourceLoaderMaxQueryLength</code> en el mismo valor en <code>php.ini</code>.",
     "config-db-type": "Tipo de base de datos",
     "config-db-host": "Servidor de la base de datos:",
     "config-db-username": "Nombre de usuario de base de datos:",
     "config-db-password": "contraseña de base de datos:",
     "config-db-password-empty": "Introduzca una contraseña para el nuevo usuario de base de datos:  $1.\nAunque es posible crear usuarios sin contraseña, esto no es seguro.",
+    "config-db-username-empty": "Debe introducir un valor para \"{{int:config-db-username}}\"",
     "config-db-install-username": "Introduzca el nombre de usuario que se utilizará para conectarse a la base de datos durante el proceso de instalación.\nEste no es el nombre de usuario de la cuenta de MediaWiki; Este es el nombre de usuario para la base de datos.",
     "config-db-install-password": "Introduzca la contraseña que se utilizará para conectarse a la base de datos durante el proceso de instalación.\nEsta no es la contraseña para la cuenta de MediaWiki; esta es la contraseña para la base de datos.",
     "config-db-install-help": "Ingresar el nombre de usuario y la contraseña que será usada para conectar a la base de datos durante el proceso de instalación.",
     "config-db-account-lock": "Usar el mismo nombre de usuario y contraseña durante operación normal",
     "config-db-wiki-account": "Usar cuenta para operación normal",
     "config-db-wiki-help": "Introduce el nombre de usuario y la contraseña que serán usados para acceder a la base de datos durante la operación normal del wiki.\nSi esta cuenta no existe y la cuenta de instalación tiene suficientes privilegios, se creará esta cuenta de usuario con los privilegios mínimos necesarios para la operación normal del wiki.",
-    "config-db-prefix": "Prefijo para las tablas de la base de datos:",
+    "config-db-prefix": "Prefijo de tablas de base de datos:",
     "config-db-prefix-help": "Si necesita compartir una base de datos entre múltiples wikis, o entre MediaWiki y otra aplicación web, puede optar por agregar un prefijo a todos los nombres de tabla para evitar conflictos.\nNo utilice espacios.\n\nNormalmente se deja este campo vacío.",
     "config-db-charset": "Conjunto de caracteres de la base de datos",
     "config-charset-mysql5-binary": "MySQL 4.1/5.0 binario",
     "config-sqlite-dir-help": "SQLite almacena todos los datos en un único archivo.\n\nEl directorio que proporcione debe ser escribible por el servidor Web durante la instalación.\n\n'''No''' debería ser accesible a través de Internet, por eso no vamos a ponerlo en el sitio donde están los archivos PHP.\n\nEl instalador escribirá un archivo <code>.htaccess</code> junto con él, pero si falla alguien podría tener acceso a la base de datos en bloque.\nEso incluye los datos de usuario en bloque (direcciones de correo electrónico, las contraseñas con hash) así como revisiones eliminadas y otros datos restringidos del wiki.\n\nConsidere la posibilidad de poner la base de datos en algún otro sitio, por ejemplo en <code>/var/lib/mediawiki/yourwiki</code> .",
     "config-oracle-def-ts": "Espacio de tablas por defecto:",
     "config-oracle-temp-ts": "Espacio de tablas temporal:",
-    "config-type-mysql": "MySQL",
+    "config-type-mysql": "MySQL (o compatible)",
     "config-type-postgres": "PostgreSQL",
     "config-type-sqlite": "SQLite",
     "config-type-oracle": "Oracle",
+    "config-type-mssql": "Microsoft SQL Server",
     "config-support-info": "MediaWiki es compatible con los siguientes sistemas de bases de datos:\n\n$1\n\nSi no encuentras en el listado el sistema de base de datos que estás intentando utilizar, sigue las instrucciones vinculadas arriba para habilitar la compatibilidad.",
-    "config-support-mysql": "* $1 es la base de datos mayoritaria para MediaWiki y la que goza de mayor compatibilidad ([http://www.php.net/manual/es/mysql.installation.php cómo compilar PHP con compatibilidad MySQL])",
-    "config-support-postgres": "$1 es un popular sistema de base de datos de código abierto, alternativa a MySQL. ([http://www.php.net/manual/es/pgsql.installation.php cómo compilar PHP con compatibilidad PostgreSQL]). Puede haber algunos defectos menores destacables, y no es recomendable para uso en un entorno de producción.",
-    "config-support-sqlite": "* $1 es una base de datos ligera con gran compatibilidad con MediaWiki ([http://www.php.net/manual/es/pdo.installation.php cómo compilar PHP con compatibilidad SQLite usando PDO]).",
-    "config-support-oracle": "* $1 es una base de datos comercial a nivel empresarial ([http://www.php.net/manual/es/oci8.installation.php cómo compilar PHP con compatibilidad con OCI8])",
+    "config-dbsupport-mysql": "* [{{int:version-db-mysql-url}} MySQL] es la base de datos mayoritaria para MediaWiki y la que goza de mayor compatibilidad. MediaWiki también funciona con [{{int:version-db-mariadb-url}} MariaDB] y [{{int:version-db-percona-url}} Percona Server], que son compatibles con MySQL. ([http://www.php.net/manual/es/mysql.installation.php Cómo compilar PHP con compatibilidad MySQL])",
+    "config-dbsupport-postgres": "[{{int:version-db-postgres-url}} PostgreSQL] es un sistema de base de datos popular de código abierto, alternativa a MySQL. Pueden haber algunos fallos menores destacables, y no es recomendable para su uso en un entorno de producción. ([http://www.php.net/manual/es/pgsql.installation.php Cómo compilar PHP con compatibilidad PostgreSQL]).",
+    "config-dbsupport-sqlite": "* [{{int:version-db-sqlite-url}} SQLite] es un sistema de base de datos ligero con gran compatibilidad con MediaWiki. ([http://www.php.net/manual/es/pdo.installation.php Cómo compilar PHP con compatibilidad SQLite], usando PDO)",
+    "config-dbsupport-oracle": "* [{{int:version-db-oracle-url}} Oracle] es una base de datos comercial a nivel empresarial. ([http://www.php.net/manual/es/oci8.installation.php Cómo compilar PHP con compatibilidad con OCI8])",
+    "config-dbsupport-mssql": "* [{{int:version-db-oracle-url}} Oracle] es una base de datos comercial a nivel empresarial. ([http://www.php.net/manual/es/oci8.installation.php Cómo compilar PHP con compatibilidad con OCI8])",
     "config-header-mysql": "Configuración de MySQL",
     "config-header-postgres": "Configuración de PostgreSQL",
     "config-header-sqlite": "Configuración de SQLite",
     "config-header-oracle": "Configuración de Oracle",
-    "config-invalid-db-type": "Tipo de base de datos inválida",
-    "config-missing-db-name": "Debes introducir un valor para \"Nombre de la base de datos\"",
-    "config-missing-db-host": "Debe introducir un valor para \"Servidor (host) de base de datos\"",
-    "config-missing-db-server-oracle": "Debe introducir un valor para \"TNS de la base de datos\"",
-    "config-invalid-db-server-oracle": "El TNS de la base de datos, \"$1\", es inválido.Use sólo carateres ASCII: letras (a-z, A-Z), números (0-9), guiones bajos (_) y guiones (-).Usa sólo caracteres ASCII: letras (a-z, A-Z), dígitos (0-9), guiones bajos (_) y puntos (.).",
+    "config-header-mssql": "Configuración de Microsoft SQL Server",
+    "config-invalid-db-type": "El tipo de base de datos no es válido",
+    "config-missing-db-name": "Debe introducir un valor para \"{{int:config-db-nombre}}\".",
+    "config-missing-db-host": "Debe introducir un valor para \"{{int:config-db-host}}\".",
+    "config-missing-db-server-oracle": "Debe introducir un valor para \"{{int:config-db-host-oracle}}\".",
+    "config-invalid-db-server-oracle": "El TNS de la base de datos «$1» es inválido.\nDebes usar un \"TNS Name\" o una cadena \"Easy Connect\" ([http://docs.oracle.com/cd/E11882_01/network.112/e10836/naming.htm Nomenclatura de Oracle]).",
     "config-invalid-db-name": "El nombre de la base de datos \"$1\"  es inválido.\nUsa sólo caracteres ASCII: letras (a-z, A-Z), números (0-9), guiones bajos (_)y guiones (-).",
     "config-invalid-db-prefix": "El prefijo de la base de datos \"$1\"  es inválido.\nUse sólo carateres ASCII: letras (a-z, A-Z), números (0-9), guiones bajos (_) y guiones (-).",
     "config-connection-error": "$1.\n\nVerifique el servidor, el nombre de usuario y la contraseña, e intente de nuevo.",
     "config-db-sys-create-oracle": "El instalador sólo admite el empleo de cuentas SYSDBA como método para crear una cuenta nueva.",
     "config-db-sys-user-exists-oracle": "La cuenta de usuario \"$1\" ya existe. ¡SYSDBA sólo puede utilizarse para crear una nueva cuenta!",
     "config-postgres-old": "Se necesita PostgreSQL $1 o una versión más reciente; tienes la versión $2.",
+    "config-mssql-old": "Microsoft SQL Server  $1  o posterior es necesario. Tienes  $2 .",
     "config-sqlite-name-help": "Elige el nombre que identificará tu wiki.\nNo uses espacios o guiones.\nEste nombre será usado como nombre del archivo de datos de SQLite.",
     "config-sqlite-parent-unwritable-group": "No se puede crear el directorio de datos <code><nowiki>$1</nowiki></code> , porque el directorio padre <code><nowiki>$2</nowiki></code> no es accesible en escritura por el servidor Web.\n\nEl instalador ha determinado el usuario cuyo servidor Web se está ejecutando.\nConceda permisos de escritura en el directorio <code><nowiki>$3</nowiki></code> para continuar.\nEn un sistema Unix/Linux haga:\n\n<pre>cd $2\nmkdir $3\nchgrp $4 $3\nchmod g+w $3</pre>",
     "config-sqlite-parent-unwritable-nogroup": "No se puede crear el directorio de datos <code><nowiki>$1</nowiki></code> , porque el directorio padre <code><nowiki>$2</nowiki></code> no es accesible en escritura por el servidor Web.\n\nEl programa de instalación no pudo determinar el usuario que se ejecuta en el servidor Web\nConceda permisos de escritura en el directorio <code><nowiki>$3</nowiki></code> para continuar.\nEn un sistema Unix/Linux haga:\n\n<pre>cd $2\nmkdir $3\nchmod a+w $3</pre>",
     "config-mysql-innodb": "InnoDB",
     "config-mysql-myisam": "MyISAM",
     "config-mysql-myisam-dep": "'''Atención''': Ha seleccionado MyISAM como motor de almacenamiento de MySQL, el cual no está recomendado para su uso con MediaWiki, porque:\n * apenas soporta accesos simultáneos debido al bloqueo de tablas\n * es más propenso a la corrupción que otros motores\n * el código MediaWiki no siempre controla MyISAM como debiera\n\nSi su instalación de MySQL soporta InnoDB, es muy recomendable que lo elija en su lugar.\nSi la instalación de MySQL no admite InnoDB, quizás es el momento de una actualización.",
+    "config-mysql-only-myisam-dep": "'''Advertencia:''' Solo se ha encontrado el motor de almacenamiento MyISAM para MySQL en esta máquina, y no se recomienda su uso con MediaWiki, porque:\n* apenas soporta concurrencia debido a los bloqueos de tablas\n* es más propenso a sufrir corrupción de datos que otros motores\n* el código MediaWiki no siempre maneja MyISAM como debería\n\nTu instalación de MySQL no soporta InnoDB, quizá vaya siendo hora de actualizarla.",
     "config-mysql-engine-help": "'''InnoDB''' es casi siempre la mejor opción, dado que soporta bien los accesos simultáneos.\n\n'''MyISAM''' es más rápido en instalaciones de usuario único o de sólo lectura.\nLas bases de datos MyISAM tienden a corromperse más a menudo que las bases de datos InnoDB.",
     "config-mysql-charset": "Conjunto de caracteres de la base de datos:",
     "config-mysql-binary": "Binario",
     "config-mysql-utf8": "UTF-8",
     "config-mysql-charset-help": "En '''modo binario''', MediaWiki almacena texto UTF-8 para la base de datos en campos binarios.\nEsto es más eficiente que el modo UTF-8 de MySQL y le permite utilizar la gama completa de caracteres Unicode.\n\nEn '''modo UTF-8''', MySQL sabrá qué conjunto de caracteres emplean sus datos y puede presentarlos y convertirlos adecuadamente, pero no le permitirá almacenar caracteres por encima del [//en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes plano multilingüe básico].",
+    "config-mssql-auth": "Tipo de autentificación:",
+    "config-mssql-install-auth": "Seleccione el tipo de autenticación que se utilizará para conectarse a la base de datos durante el proceso de instalación.\nSi selecciona \"{{int:config-mssql-windowsauth}}\", las credenciales del usuario que sea cual sea el servidor Web se ejecuta como será utilizado.",
+    "config-mssql-web-auth": "Seleccione el tipo de autenticación que utilizará el servidor web para conectarse al servidor de base de datos, durante el funcionamiento normal de la wiki.\nSi selecciona \"{{int:config-mssql-windowsauth}}\", las credenciales del usuario que sea cual sea el servidor Web se ejecuta como será utilizado.",
+    "config-mssql-sqlauth": "Autenticación de SQL Server",
+    "config-mssql-windowsauth": "Autentificación de Windows",
     "config-site-name": "Nombre del wiki:",
     "config-site-name-help": "Esto aparecerá en la barra de título del navegador y en varios otros lugares.",
     "config-site-name-blank": "Ingresar un nombre de sitio.",
     "config-ns-invalid": "El espacio de nombre especificado \"<nowiki>$1</nowiki>\" no es válido.\nEspecifica un espacio de nombre de proyecto diferente.",
     "config-ns-conflict": "El espacio de nombres especificado \"<nowiki>$1</nowiki>\" entra en conflicto con un espacio de nombres predeterminado de MediaWiki.\nEspecifique un espacio de nombres de proyecto diferente.",
     "config-admin-box": "Cuenta de administrador",
-    "config-admin-name": "Su nombre:",
+    "config-admin-name": "Tu nombre de usuario:",
     "config-admin-password": "Contraseña:",
     "config-admin-password-confirm": "Repita la contraseña:",
     "config-admin-help": "Escribe aquí el nombre de usuario que desees, como por ejemplo \"Pedro Bloggs\".\nEste es el nombre que usarás para entrar al wiki.",
     "config-admin-name-blank": "Introduce un nombre de usuario de administrador.",
     "config-admin-name-invalid": "El nombre de usuario especificado \"<nowiki>$1</nowiki>\" no es válido.\nEspecifique un nombre de usuario diferente.",
     "config-admin-password-blank": "Introduzca una contraseña para la cuenta de administrador.",
-    "config-admin-password-same": "La contraseña no debe ser la misma que el nombre de usuario.",
     "config-admin-password-mismatch": "Las dos contraseñas que ingresaste no coinciden.",
     "config-admin-email": "Dirección de correo electrónico:",
     "config-admin-email-help": "Introduce aquí un correo electrónico que te permita recibir mensajes de otros usuarios del wiki, vuelve a configurar tu contraseña y recibe notificaciones de cambios realizados a tus páginas vigiladas. Puedes dejar este campo vacío.",
     "config-profile-no-anon": "Creación de cuenta requerida",
     "config-profile-fishbowl": "Sólo editores autorizados",
     "config-profile-private": "Wiki privado",
-    "config-profile-help": "Los wikis funcionan mejor cuando dejas que los edite tanta gente como sea posible.\nEn MediaWiki, es fácil revisar los cambios recientes y revertir los daños realizados por usuarios malintencionados o novatos.\nSin embargo, muchos han encontrado que MediaWiki es útil para una amplia variedad de funciones, y a veces no es fácil convencer a todos de los beneficios de la forma wiki.\nPor lo tanto tienes la elección.\n\nUn '''{{int:config-profile-wiki}}''' permite que cualquiera pueda editar, sin siquiera iniciar sesión.\nUn wiki con '''{{int:config-profile-no-anon}}''' ofrece rendición de cuentas adicional, pero puede disuadir a colaboradores.\n\nEl escenario '''{{int:config-profile-fishbowl}}''' permite editar a los usuarios autorizados, pero el público puede ver las páginas, incluyendo el historial.\nUn '''{{int:config-profile-private}}''' sólo permite ver páginas a los usuarios autorizados, el mismo grupo al que le está permitido editar.\n\nConfiguraciones más complejas de derechos de usuario están disponibles después de la instalación, consulte [//www.mediawiki.org/wiki/Manual:User_rights esta entrada en el manual].",
+    "config-profile-help": "Los wikis funcionan mejor cuando dejas que los edite tanta gente como sea posible.\nEn MediaWiki, es fácil revisar los cambios recientes y revertir los daños realizados por usuarios malintencionados o novatos.\nSin embargo, muchos han encontrado que MediaWiki es útil para una amplia variedad de funciones, y a veces no es fácil convencer a todos de los beneficios de la forma wiki.\nPor lo tanto tienes la elección.\n\nEl modelo '''{{int:config-profile-wiki}}''' permite que cualquiera pueda editar, sin siquiera iniciar sesión.\nUn wiki con '''{{int:config-profile-no-anon}}''' ofrece rendición de cuentas adicional, pero puede disuadir a colaboradores.\n\nEl modelo '''{{int:config-profile-fishbowl}}''' permite editar a los usuarios autorizados, pero el público puede ver las páginas, incluyendo el historial.\nUn '''{{int:config-profile-private}}''' sólo permite ver páginas a los usuarios autorizados, el mismo grupo al que le está permitido editar.\n\nConfiguraciones más complejas de derechos de usuario están disponibles después de la instalación, consulte [//www.mediawiki.org/wiki/Manual:User_rights esta entrada en el manual].",
     "config-license": "Copyright and licencia:",
     "config-license-none": "Pie sin licencia",
     "config-license-cc-by-sa": "Creative Commons Reconocimiento Compartir Igual",
     "config-upload-deleted": "*Directorio para los archivos eliminados:",
     "config-upload-deleted-help": "Elige un directorio en el que guardar los archivos eliminados.\nLo ideal es una carpeta no accesible desde la red.",
     "config-logo": "URL del logo :",
-    "config-logo-help": "La apariencia por defecto de MediaWiki incluye espacio para un logotipo de 135x160 píxeles encima del menú de la barra lateral.\nCargue una imagen de tamaño adecuado e introduzca la dirección URL aquí.\n\nSi no desea un logotipo, deje esta casilla en blanco.",
+    "config-logo-help": "La apariencia por defecto de MediaWiki incluye espacio para un logotipo de 135x160 píxeles encima del menú de la barra lateral.\nCargua una imagen de tamaño adecuado e introduce la dirección URL aquí.\n\nPuedes usar <code>$wgStylePath</code> o <code>$wgScriptPath</code> si tu logotipo es relativo a esas rutas.\n\nSi no deseas un logotipo, deja esta casilla en blanco.",
     "config-instantcommons": "Habilitar Instant Commons",
     "config-instantcommons-help": "[//www.mediawiki.org/wiki/InstantCommons Instant Commons] es una característica que permite que los wikis puedan utilizar imágenes, sonidos y otros archivos multimedia que se encuentran en el sitio [//commons.wikimedia.org/ Wikimedia Commons].\nPara ello, MediaWiki requiere acceso a Internet.\n\nPara obtener más información sobre esta función, incluidas las instrucciones sobre cómo configurarlo para otras wikis distintas de Wikimedia Commons, consulte [//mediawiki.org/wiki/Manual:$wgForeignFileRepos el manual].",
     "config-cc-error": "El selector de licencia de Creative Commons no dio resultado.\nEscribe el nombre de la licencia manualmente.",
     "config-extensions": "Extensiones",
     "config-extensions-help": "Se ha detectado en tu directorio <code>./extensions</code>  las extensiones listadas arriba.\n\nPuede que necesiten configuraciones adicionales, pero puedes habilitarlas ahora.",
     "config-install-alreadydone": "'''Aviso:''' Parece que ya habías instalado MediaWiki y estás intentando instalarlo nuevamente.\nPasa a la próxima página, por favor.",
-    "config-install-begin": "Pulsando \"{{int:config-continue}}\", se iniciará la instalación de MediaWiki.\nSi todavía desea realizar algún cambio, pulse atrás.",
+    "config-install-begin": "Al pulsar en «{{int:config-continue}}» comenzará el proceso de instalación de MediaWiki.\nSi quieres realizar algún cambio, pulsa en «{{int:config-back}}».",
     "config-install-step-done": "hecho",
     "config-install-step-failed": "falló",
     "config-install-extensions": "Extensiones inclusive",
     "config-download-localsettings": "Descargar archivo <code>LocalSettings.php</code>",
     "config-help": "Ayuda",
     "config-nofile": "El archivo \"$1\" no se pudo encontrar. ¿Se ha eliminado?",
+    "config-extension-link": "¿Sabías que tu wiki soporta [//www.mediawiki.org/wiki/Manual:Extensions extensiones]?\n\nPuedes navegar las [//www.mediawiki.org/wiki/Category:Extensions_by_category extensiones por categoría] o la [//www.mediawiki.org/wiki/Extension_Matrix matriz de extensiones] para ver la lista completa de extensiones.",
     "mainpagetext": "'''MediaWiki ha sido instalado con éxito.'''",
     "mainpagedocfooter": "Consulta la [//meta.wikimedia.org/wiki/Ayuda:Guía del usuario de contenidos] para obtener información sobre el uso del software wiki.\n\n== Empezando ==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Lista de ajustes de configuración]\n* [//www.mediawiki.org/wiki/Manual:FAQ/es FAQ de MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lista de correo de anuncios de distribución de MediaWiki]\n* [//www.mediawiki.org/wiki/Localisation#Translation_resources Regionalizar MediaWiki para tu idioma]"
-}
\ No newline at end of file
+}
index 710e218..0733e51 100644 (file)
@@ -41,7 +41,6 @@
     "config-admin-password-confirm": "Parool uuesti:",
     "config-admin-name-blank": "Sisesta administraatori kasutajanimi.",
     "config-admin-password-blank": "Sisesta administraatorikonto parool.",
-    "config-admin-password-same": "Parool ei tohi kattuda kasutajanimega.",
     "config-admin-password-mismatch": "Sisestatud kaks parooli ei lange kokku.",
     "config-admin-email": "E-posti aadress:",
     "config-admin-error-bademail": "Sisestasid vigase e-posti aadressi.",
@@ -64,4 +63,4 @@
     "config-help": "abi",
     "mainpagetext": "'''MediaWiki tarkvara on edukalt paigaldatud.'''",
     "mainpagedocfooter": "Vikitarkvara kasutamise kohta leiad lisateavet [//meta.wikimedia.org/wiki/Help:Contents juhendist].\n\n== Alustamine ==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Häälestussätete loend]\n* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki KKK]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki versiooniuuenduste postiloend]\n* [//www.mediawiki.org/wiki/Localisation#Translation_resources MediaWiki lokaliseerimine]"
-}
\ No newline at end of file
+}
index a0033bd..7b18731 100644 (file)
@@ -2,7 +2,8 @@
     "@metadata": {
         "authors": [
             "An13sa",
-            "පසිඳු කාවින්ද"
+            "පසිඳු කාවින්ද",
+            "Subi"
         ]
     },
     "config-desc": "MediaWiki instalatzailea",
     "config-ns-other": "Bestelakoa (zehaztu)",
     "config-ns-other-default": "MyWiki",
     "config-admin-box": "Administratzaile kontua",
-    "config-admin-name": "Zure izena:",
+    "config-admin-name": "Zure erabiltzaile-izena:",
     "config-admin-password": "Pasahitza:",
     "config-admin-password-confirm": "Pasahitza berriz:",
+    "config-admin-password-mismatch": "Sartutako bi pasahitzak ez datoz bat.",
     "config-admin-email": "E-posta helbidea:",
-    "config-profile-wiki": "Wiki tradizionala",
+    "config-profile-wiki": "Wikia ireki",
     "config-profile-private": "Wiki pribatua",
     "config-license": "Copyright eta lizentzia:",
     "config-license-pd": "Domeinu Askea",
@@ -73,4 +75,4 @@
     "config-help": "Laguntza",
     "mainpagetext": "'''MediaWiki arrakastaz instalatu da.'''",
     "mainpagedocfooter": "Ikus [//meta.wikimedia.org/wiki/Help:Contents Erabiltzaile Gida] wiki softwarea erabiltzen hasteko informazio gehiagorako.\n\n== Nola hasi ==\n\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Konfigurazio balioen zerrenda]\n* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki FAQ (Maiz egindako galderak)]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWikiren argitalpenen posta zerrenda]"
-}
\ No newline at end of file
+}
index 9e0af3d..89d6ca4 100644 (file)
@@ -1,7 +1,5 @@
 {
-    "@metadata": {
-        "authors": []
-    },
+    "@metadata": [],
     "mainpagetext": "'''MeyaGüiqui s'á istalau satihatoriamenti.'''",
     "mainpagedocfooter": "Consurta la [//meta.wikimedia.org/wiki/Help:Contents User's Guide] pa sabel mas al tentu el huncionamientu el software güiqui.\n\n== Esminciandu ==\n\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Configuration settings list]\n* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]"
-}
\ No newline at end of file
+}
index b469b79..f06af43 100644 (file)
 {
     "@metadata": {
         "authors": [
-            "Mjbmr"
+            "Mjbmr",
+            "Armin1392",
+            "Ebraminio",
+            "Omidh",
+            "Pouyana",
+            "Reza1615"
         ]
     },
     "config-desc": "نصب کنندهٔ ویکی‌مدیا",
     "config-title": "نصب ویکی‌مدیا $1",
     "config-information": "اطلاعات",
+    "config-localsettings-upgrade": "یک پرونده <code>LocalSettings.php</code> شناسایی شده‌است.\nبرای ارتقاء این نصب لطفاً مقدار <code>$wgUpgradeKey</code> در جعبه زیر وارد کنید.\nشما می‌توانید آن را در <code>LocalSettings.php</code> پیدا کنید.",
+    "config-localsettings-cli-upgrade": "یک پرونده <code>LocalSettings.php</code> شناسایی شده است.\nبرای ارتقاء این نصب، لطفاً <code>update.php</code> را اجرا کنید.",
     "config-localsettings-key": "کلید ارتقا:",
+    "config-localsettings-badkey": "کلیدی که شما ارائه کردید نادرست است.",
+    "config-upgrade-key-missing": "نصب موجود مدیاویکی شناسایی شده‌است.\nبرای بروزرسانی این نصب، لطفاً خط زیر را در آخر کد \nقرار دادن به نصب ارتقاء داده شده، به خط زیر لطفاً در پایین خود را <code>LocalSettings.php</code> قرار دهید:\n\n$1",
+    "config-localsettings-incomplete": "وجود <code>LocalSettings.php</code> به نظر ناقص می‌رسد.\nمتغیر $1 تنظیم نشده‌است.\nبرای اینکه این متغیر تنظیم شود لطفاً <code>LocalSettings.php</code> را تغییر دهید، و \"{{int:Config-continue}}\" را کلیک کنید.",
+    "config-localsettings-connection-error": "هنگام اتصال به پایگاه اطلاعاتی که ازتنظیمات مشخص شده در<code>LocalSettings.php</code> استفاده می‌کند، خطایی رخ داد. لطفاً این تنظیمات را نصب کنید و دوباره تلاش کنید.\n$1",
+    "config-session-error": "خطا در شروع جلسه $1",
+    "config-session-expired": "به نظر می‌رسد اطلاعات جلسهٔ شما منقضی شده‌است.\nجلسات برای مادام العمر $1 پیکربندی شده‌اند.\nشما می‌توانید این پیکربندی را با تنظیم <code>session.gc_maxlifetime</code> در php.ini افزایش دهید.\nروند نصب را دوباره شروع کنید.",
+    "config-no-session": "اطلاعات دورهٔ شما از دست رفته‌ است!\nphp.ini خود را بررسی کنید و مطمئن شوید <code>session.save_path</code> برای یک فهرست مناسب تنظیم شده‌است.",
     "config-your-language": "زبان شما:",
+    "config-your-language-help": "یک زبان را برای استفاده در طی روند نصب انتخاب کنید.",
     "config-wiki-language": "زبان ویکی:",
+    "config-wiki-language-help": "زبانی را انتخاب کنید که ویکی بیشتر در آن نوشته خواهد شد.",
     "config-back": "→ بازگشت",
     "config-continue": "ادامه ←",
     "config-page-language": "زبان",
     "config-page-welcome": "به مدیاویکی خوش آمدید!",
     "config-page-dbconnect": "اتصال به پایگاه داده",
+    "config-page-upgrade": "نصب موجود را ارتقاء دهید.",
+    "config-page-dbsettings": "تنظیمات پایگاه اطلاعاتی",
     "config-page-name": "نام",
     "config-page-options": "گزینه‌ها",
     "config-page-install": "نصب",
     "config-page-complete": "کامل!",
+    "config-page-restart": "نصب را دوباره شروع کنید",
     "config-page-readme": "مرا بخوان",
     "config-page-releasenotes": "یادداشت‌های انتشار",
     "config-page-copying": "تکثیر",
     "config-page-upgradedoc": "ارتقا",
     "config-page-existingwiki": "ویکی موجود",
+    "config-help-restart": "آیا می‌خواهید همهٔ اطلاعات ذخیره شده‌ای که وارد کرده‌اید را پاک کنید و دوباره روند نصب را شروع کنید؟",
     "config-restart": "بله ، آن دوباره راه اندازی کن",
+    "config-welcome": "===بررسی‌های محیطی===\nبرای فهمیدن اینکه این محیط برای نصب مدیاویکی مناسب است، اکنون بررسی‌های اساسی انجام خواهد‌شد.\nاگر به دنبال پشتیبانی در چگونگی تکمیل نصب هستید،به یاد داشته باشید این اطلاعات را بگنجانید.",
+    "config-copyright": "===حق چاپ و شرایط===\n$1\nاین برنامه،نرم‌افزاری آزاد است;شما می‌توانید این برنامه را دوباره توزیع کنید و/یا تحت شرایط مجوز عمومی کلی جی‌ان‌یو که توسط بنیاد نرم‌افزار آزاد منتشر شده،اصلاح کنید;یا نسخهٔ 2 مجوز، یا (به انتخاب خود) هر نسخهٔ پس از این.\nاین برنامه به امید اینکه مفید واقع‌ شود توزیع شده‌است،اما '''بدون هیچ ضمانتی'''; حتی بدون اشارهٔ ضمانتی از '''قابلیت عرضه''' یا ''' صلاحیت برای یک هدف خاص'''.\nبرای جزئیات بیشتر مجوز عمومی کلی جی‌ان‌یو را مشاهده کنید.\nشما باید <doclink href=Copying> یک چاپ ازمجوز عمومی کلی </doclink> همراه این برنامه دریافت کنید; اگر دریافت نکردید،به بنیاد نرم‌افزار آزاد بنویسید،Inc.،خیابان فرانکلین۵۱،طبقه پنجم،بوستون، MA۰۲۱۱۰-۱۳۰،آمریکا،یا [http://www.gnu.org/copyleft/gpl.html read it online].",
     "config-sidebar": "* [//www.mediawiki.org صفحهٔ اصلی مدیاویکی]\n* [//www.mediawiki.org/wiki/Help:Contents راهنمای کاربر]\n* [//www.mediawiki.org/wiki/Manual:Contents راهنمای مدیر]\n* [//www.mediawiki.org/wiki/Manual:FAQ پرسش‌های رایج]\n----\n* <doclink href=Readme>مرا بخوان</doclink>\n* <doclink href=ReleaseNotes>یادداشت‌های انتشار</doclink>\n* <doclink href=Copying>نسخه برداری</doclink>\n* <doclink href=UpgradeDoc>ارتقا</doclink>",
-    "config-env-php": "پی‌اچ‌پی $1 نصب شده است.",
+    "config-env-good": "محیط بررسی شده‌است.\nشما می‌توانید مدیاویکی را نصب کنید.",
+    "config-env-bad": "محیط بررسی شده‌است.\nشما نمی‌توانید مدیاویکی را نصب کنید.",
+    "config-env-php": "پی‌اچ‌پی $1 نصب شده‌است.",
     "config-env-php-toolow": "پی‌اچ‌پی $1 نصب شده است.\nدر هر صورت، مدیاویکی نیاز به پی‌اچ‌پی نسخهٔ $2 یا بالاتر دارد.",
+    "config-unicode-using-utf8": "برای یونیکد عادی از Brion Vibber's utf8_normalize.so استفاده کنید.",
+    "config-unicode-using-intl": "برای یونیکد عادی از [http://pecl.php.net/intl intl PECL extension] استفاده کنید.",
+    "config-unicode-pure-php-warning": "'''هشدار:''' [http://pecl.php.net/intl intl PECL extension] برای کنترل یونیکد عادی در دسترس نیست،اجرای کاملاً آهسته به تعویق می‌افتد.\nاگر شما یک سایت پر‌ ترافیک را اجرا می‌کنید، باید کمی [//www.mediawiki.org/wiki/Unicode_normalization_considerations Unicode normalization] را بخوانید.",
+    "config-unicode-update-warning": "'''هشدار:''' نسخهٔ نصب شدهٔ پوشهٔ یونیکد عادی از ورژن قدیمی‌تر کتابخانه [http://site.icu-project.org/ the ICU project's] استفاده می‌کند.\nاگر کلاً علاقه‌مند به استفاده از یونیکد هستید باید [//www.mediawiki.org/wiki/Unicode_normalization_considerations upgrade].",
+    "config-no-db": "درایور پایگاه اطلاعاتی مناسب پیدا نشد! شما لازم دارید یک درایور پایگاه اطلاعاتی  برای پی‌اچ‌پی نصب کنید.انواع پایگاه اطلاعاتی زیر پشتیبانی شده‌اند:$1.\nاگر شما در گروه اشتراک‌گذاری هستید، از تهیه کنندهٔ گروه خود برای نصب یک درایور پایگاه اطلاعاتی مناسب سوأل کنید.\nاگر خود، پی‌اچ‌پی را تهیه کرده‌اید، با یک پردازشگر فعال دوباره پیکربندی کنید، برای مثال از <code>./configure --with-mysql</code> استفاده کنید.\nاگر پی‌اچ‌پی را از یک بستهٔ دبیان یا آبونتو نصب کرده‌اید، بنابراین لازم دارید بخش php5-mysql را نصب کنید.",
+    "config-outdated-sqlite": "''' هشدار:''' شما اس‌کیولایت $1 دارید، که پایین‌تر از حداقل نسخهٔ $2 مورد نیاز است.اس‌کیولایت در دسترس نخواهد بود.",
+    "config-no-fts3": "'''هشدار:''' اس‌کیولایت بدون [//sqlite.org/fts3.html FTS3 module] تهیه شده‌است ، جستجوی ویژگی‌ها در این بخش پیشین در دسترس نخواهد‌بود.",
+    "config-register-globals": "'''هشدار:''' گزینهٔ  PHP's <code>[http://php.net/register_globals register_globals]</code> فعال شده‌است.'''\n''' اگر می‌توانید غیر فعالش کنید.'''\nمدیاویکی کار خواهد‌کرد، اما سرور شما در معرض آسیب‌پذیری‌های امنیتی ممکن قرار دارد.",
+    "config-magic-quotes-runtime": "'''مخرب: [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-runtime magic_quotes_runtime] فعال است.\nاین گزینه اطلاعات داده شده به رایانه را به طور غیر‌قابل پیش‌بینی از بین می‌برد.\nشما نمی‌توانید مدیاویکی را نصب یا استفاده کنید مگر اینکه این گزینه غیر‌فعال باشد.",
+    "config-magic-quotes-sybase": "'''مخرب: [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-sybase magic_quotes_sybase] فعال است.\nاین گزینه اطلاعات داده شده به رایانه را به طور غیر‌قابل پیش‌بینی از بین می‌برد.\nشما نمی‌توانید مدیاویکی را نصب یا استفاده کنید مگر اینکه این گزینه غیر‌فعال باشد.",
+    "config-mbstring": "''' مخرب:[http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload] فعال است.\nاین گزینه باعث ایجاد خطا می‌شود و ممکن است اطلاعات را به طور غیر‌قابل پیش‌بینی از بین ببرد.\nشما نمی‌توانید مدیاویکی را نصب یا استفاده کنید مگر اینکه این گزینه غیر‌فعال باشد.",
+    "config-safe-mode": "'''هشدار:'''  PHP's [http://www.php.net/features.safe-mode safe mode] فعال است.\nممکن است باعث ایجاد مشکلاتی شود، مخصوصاً اگر از ارسال پرونده استفاده شود و <code>math</code> پشتیبانی شود.",
+    "config-xml-bad": "ماژول اکس‌ام‌ال پی‌اچ‌پی کار نمی‌کند.\nمدیاویکی نیازمند عملیاتی در این ماژول است و در این پیکربندی کار نخواهد‌کرد.\nاگر مان‌دریک را اجرا می‌کنید, بستهٔ نرم افزاری پی‌اچ‌پی-ایکس‌ام‌ال را نصب کنید.",
+    "config-pcre-old": "''' خطای اساسی:'' ' PCRE  $1  یا بعدا مورد نیاز است.\nکد باینری پی‌اچ‌پی‌تان با PCRE  $2 پیوند دارد.\n[https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/PCRE اطلاعات بیشتر].",
+    "config-pcre-no-utf8": "'''مخرب:''' به‌ نظر می‌رسد ماژول پی‌سی‌آرایی پی‌اچ‌پی بدون پشتیبانی پی‌سی‌آرایی_یو‌تی‌اف۸ تهیه شده‌است.\nمدیاویکی برای درست عمل کردن نیازمند پشتیبانی یوتی‌اف-۸ است.",
+    "config-memory-raised": "PHP's <code>memory_limit</code>, نسخهٔ $1 است، به نسخهٔ $2 ارتقاء داده شده‌است.",
+    "config-memory-bad": "'''هشدار:''' PHP's <code>memory_limit</code> نسخهٔ $1 است.\nاین ممکن است خیلی پایین باشد.\nممکن است نصب با مشکل رو‌به‌رو شود.",
+    "config-ctype": "'''مخرب:''' پی‌اچ‌پی باید با پشتیبانی برای [http://www.php.net/manual/en/ctype.installation.php Ctype extension] تهیه شده‌باشد.",
+    "config-json": "'''مخرب:''' پی‌اچ‌پی بدون پشتیبانی جِی‌اس‌اُ‌ان تهیه شده‌بود.\nشما باید قبل از نصب مدیاویکی یا بسط  جِی‌اس‌اُ‌ان پی‌اچ‌پی یا بسط [http://pecl.php.net/package/jsonc PECL jsonc] را نصب کنید.\n* بسط پی‌اچ‌پی شامل لینوکس اینترپرایز رد هت (سِنت‌اُاِس) 5 یا 6 است، هرچند باید در <code>/etc/php.ini</code> یا <code>/etc/php.d/json.ini</code> فعال باشد.\n*  به‌جای بسته‌بندی کردن بسط پی‌ایی‌سی‌اِل مانند <code>php5-json</code> یا <code>php-pecl-jsonc</code>، توزیع‌های برخی لینوکس پس از ماه می ۲۰۱۳ با حذف بسط پی‌اچ‌پی افزایش پیدا کرد.",
+    "config-xcache": "[http://xcache.lighttpd.net/ XCache] نصب شده‌است.",
+    "config-apc": "[http://www.php.net/apc APC] نصب شده‌است.",
+    "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache] نصب شده‌است.",
+    "config-no-cache": "'''هشدار:''' [http://www.php.net/apc APC],[http://xcache.lighttpd.net/ XCache] یا [http://www.iis.net/download/WinCacheForPhp WinCache] را نتوانست پیدا کند.\nذخیره شی فعال نیست.",
+    "config-mod-security": "'''هشدار:''' وب سرور شما [http://modsecurity.org/ mod_security] فعال است.اگر اشتباه پیکربندی شده‌‌ باشد،می تواند باعث ایجاد مشکلاتی برای مدیاویکی یا دیگر نرم‌افزاری شود که به کاربران اجازه می‌دهد پیام دلخواه ارسال کنند.\nبه [http://modsecurity.org/documentation/ mod_security documentation] مراجعه کنید یا اگر با خطاهای اتفاقی مواجه شدید با پشتیبانی میزبان خود در تماس باشید.",
+    "config-diff3-bad": "جی‌ان‌یو دیف۳ پیدا نشد.",
+    "config-git": "نسخهٔ کنترل نرم‌افزار جیت پیدا شد:<code>$1</code>.",
+    "config-git-bad": "نسخه نرم‌افزار کنترل جیت پیدا نشد.",
+    "config-imagemagick": "ایمیج‌مجیک پیدا شد: <code>$1</code>.\nاگر ارسال‌ها را فعال کنید،تصویر کوچک فعال خواهد‌شد.",
+    "config-gd": "گرافیک‌های جی‌دی ساخته‌‌ شده در کتابخانه پیدا شد.\nاگر ارسال‌ها را فعال کنید تصویر کوچک فعال خواهد‌شد.",
+    "config-no-scaling": "کتابخانهٔ جی‌دی یا ایمیج‌مجیک نتوانست پیدا شود.\nتصویر کوچک غیر‌فعال خواهد‌شد.",
+    "config-no-uri": "'''خطا:''' یوآرآی فعلی را نتوانست مشخص کند.\nنصب نافرجام ماند.",
+    "config-no-cli-uri": "<strong>هشدار:</strong> هیچ اسکریپت‌پتی تعیین نشده، از پیش‌فرض استفاده کنید:\n<code>$1</code>.",
+    "config-using-server": "از اسم سرور \"<nowiki>$1</nowiki>\" استفاده کنید.",
+    "config-using-uri": "از اسم سرور \"<nowiki>$1$2</nowiki>\" استفاده کنید.",
+    "config-uploads-not-safe": "'''هشدار:''' فهرست پیش‌فرض ارسال‌های <code>$1</code> شما برای اجرای متون دلخواه آسیب‌پذیر است.\nاگرچه مدیاویکی همهٔ پوشه‌های ارسال‌ شده را برای خطرات امنیتی بررسی می‌کند، پیش از فعال‌سازی ارسال‌ها، بسیار به [//www.mediawiki.org/wiki/Manual:Security#Upload_security close this security vulnerability] توصیه شده‌است.",
+    "config-no-cli-uploads-check": "'''هشدار:''' فهرست پیش‌فرض ارسال‌های شما (<code>$1</code>) برای آسیب‌پذیری اجرای متن دلخواه در طول نصب سی‌ال آی بررسی نشده‌است.",
+    "config-brokenlibxml": "دستگاه شما دارای تلفیقی از نسخه‌های پی‌اچ‌پی و لیبکسمل۲ است که ناقص است و می‌تواند دلیل از بین رفتن اطلاعات مخفی در مدیاویکی و دیگر برنامه‌های کاربردی شبکه باشد.\nارتقاء به لیبکسمل۲  ۲.۷.۳ یا بالاتر ([//bugs.php.net/bug.php?id=45996 bug filed with PHP]) ارتفاء دهید.\nنصب نافرجام ماند.",
+    "config-suhosin-max-value-length": "سوهُسین نصب شده‌است و پارامتر جت <code>length</code> را به $1 بایت محدود می‌کند.\n قسمت بارکنندهٔ منبع مدیاویکی پیرامون این محدوده کار خواهد‌کرد، اما عملکرد آن را پایین می‌آورد. اگر به هیچ وجه ممکن نیست، باید <code>suhosin.get.max_value_length</code> را به ۱۰۲۴ یا بالاتر در <code>php.ini</code> تنظیم کنید، و \n<code>$wgResourceLoaderMaxQueryLength</code> را به مقدار مشابه در <code>LocalSettings.php</code> تنظیم کنید.",
     "config-db-type": "نوع پایگاه اطلاعات:",
     "config-db-host": "میزبان پایگاه اطلاعات:",
+    "config-db-host-help": "اگر سرور پایگاه اطلاعاتی شما در سرور دیگری است، نام گروه و آدرس آی‌پی را اینجا وارد کنید.\nاگر از گروه شبکهٔ اشتراک گذاری استفاده می‌کنید، تهیه‌کنندهٔ گروه‌تان باید نام گروه صحیح در اسنادومدارک را به شما بدهد.\nاگر در حال نصب یک سرور ویندوز هستید و از مای‌اس‌کیو‌ال استفاده می‌کنید، ممکن است استفاده از \"گروه داخلی\" برای نام سرور کار نکند.اگر کار نکرد، \"۱۲۷.۰.۰.۱\" را برای آدرس آی‌پی داخلی امتحان کنید.\nاگر از پستگِرِاس‌کیوال استفاده می‌کنید،برای اتصال از طریق یک سوکت یونیکس این زمینه را خالی رها کنید.",
+    "config-db-host-oracle": "پایگاه اطلاعاتی تی‌ان‌اس:",
+    "config-db-host-oracle-help": "یک [http://download.oracle.com/docs/cd/B28359_01/network.111/b28317/tnsnames.htm Local Connect Name] معتبر وارد کنید؛ پوشهٔ tnsnames.ora باید برای این نصب نمایان باشد.<br /> اگر از کتابخانه‌های پردازشگر ۱۰جی یا جدیدتر استفاده می‌کنید،همچنین می‌توانید از روش نامبردهٔ [http://download.oracle.com/docs/cd/E11882_01/network.112/e10836/naming.htm Easy Connect] استفاده کنید.",
+    "config-db-wiki-settings": "این ویکی را شناسایی کنید.",
+    "config-db-name": "نام پایگاه اطلاعاتی:",
+    "config-db-name-help": "نامی را انتخاب کنید که ویکی شما را شناسایی کند.\nنباید شامل فاصله باشد.\nاگر از گروه شبکهٔ اشتراک‌گذاری استفاده می‌کنید، تهیه‌کنندهٔ گروهتان یا باید به شما نام یک پایگاه اطلاعاتی مشخص برای استفاده بدهد یا برای ایجاد پایگاه‌های اطلاعاتی از طریق یک کنترل پنل به شما اجازه بدهد.",
+    "config-db-name-oracle": "طرح کلی پایگاه اطلاعاتی:",
+    "config-db-account-oracle-warn": "برای نصب برنامهٔ اوراکل به‌عنوان پایگاه اطلاعاتی در بخش گذشته،سه سناریو پشتیبانی شده است:\nاگر مایل به ایجاد حساب پایگاه اطلاعاتی به عنوان بخشی از روند نصب هستید، لطفاً یک حساب با نقش اس‌وای‌اس‌دی‌بی‌ای به عنوان حساب پایگاه اطلاعاتی برای نصب تهیه کنید و اعتبارنامه‌های مطلوبی را برای حساب دردسترس شبکه تعیین کنید، به عبارتی دیگر یا می‌توانید حساب دردسترس شبکه را به طور دستی ایجاد کنید و تنها آن حساب را تهیه کنید (اگر مستلزم مجوزهایی برای ایجاد موضوعات طرح کلی باشد) یا دو حساب دیگر تهیه کنید،یکی با ایجاد مزایا و یک حساب محدود برای دسترسی شبکه.\nمتنی برای ایجاد یک حساب با مزایای لازم بنویسید که می‌تواند در فهرست\"نگهداری/برنامهٔ اوراکل\" این نصب یافت شود. به یاد داشته باشید که استفاده از یک حساب محدود،همهٔ قابلیت‌های نگهداری با حساب پیش‌فرض را غیرفعال خواهد کرد.",
+    "config-db-install-account": "حساب کاربری برای نصب",
     "config-db-username": "نام کاربری پایگاه اطلاعات:",
-    "config-db-password": "کلمه عبور پایگاه اطلاعات:",
+    "config-db-password": "گذرواژه پایگاه داده‌ها:",
+    "config-db-password-empty": "لطفاً یک رمز عبور برای کاربر جدید پایگاه اطلا‌عاتی وارد کنید: $1\nدر صورتی که ممکن است کاربران بدون رمز عبور به وجود آیند،امن نیست.",
+    "config-db-username-empty": "شما باید یک مقدار برای \"نام کاربری پایگاه اطلاعاتی\" وارد کنید",
+    "config-db-install-username": "نام کاربری را وارد کنید که برای اتصال به پایگاه اطلاعاتی در طول روند نصب استفاده خواهد‌شد.\nاین نام کاربری حساب مدیاویکی نیست; نام کاربری برای پایگاه اطلاعاتی شما است.",
+    "config-db-install-password": "رمز عبوری را وارد کنید که برای اتصال به پایگاه اطلاعاتی در طول روند نصب استفاده خواهد‌شد.\nاین رمز عبور برای حساب مدیاویکی نیست;رمز عبور برای پایگاه اطلاعاتی شما است.",
+    "config-db-install-help": "نام کاربری و رمز عبوری را وارد کنید که برای اتصال به پایگاه اطلاعاتی در طول روند نصب استفاده خواهد‌ٰشد.",
+    "config-db-account-lock": "در طی عملیات عادی از نام کاربری و رمز عبور یکسان استفاده کنید",
+    "config-db-wiki-account": "حساب کاربری برای عملیات عادی",
+    "config-db-wiki-help": "نام کاربری و رمز عبوری را وارد کنید که برای اتصال به پایگاه اطلاعاتی در طی عملیات عادی ویکی استفاده خواهید‌کرد.\nاگر حساب وجود ندارد، و نصب حساب مزایای کافی را داراست، این حساب کاربر با حداقل مزایای مورد نیاز برای عمل کردن ویکی به‌وجود خواهد‌آمد.",
+    "config-db-prefix": "جدول پیشوند پایگاه اطلاعاتی",
+    "config-db-prefix-help": "اگر نیاز دارید یک اطلاعات پایگاهی را بین چندین ویکی یا بین مدیاویکی و برنامهٔ کاربردی وب دیگری به اشتراک بگذارید،مجاز به انتخاب برای اضافه کردن یک پیشوند به همهٔ  نام‌های جدول برای جلوگیری از اختلاف‌ها هستید.\nاز فاصله‌ها استفاده نکنید.\nاغلب این زمینه خالی مانده‌است.",
+    "config-db-charset": "مجموعه‌ٔ خصوصیات پایگاه اطلاعاتی",
+    "config-charset-mysql5-binary": "می‌اسکیوئل ۴.۱/۵.۰ باینری",
+    "config-charset-mysql5": "می‌اسکیوئل ۴.۱/۵.۰ یوتی‌اف-۸",
+    "config-charset-mysql4": "یوتی‌اف-۸ سازگار قدیمی مای‌اس‌کیو‌ال ۴.۰",
+    "config-charset-help": "'''هشدار:''' اگر از '''یوتی‌اف-۸ سازگار قدیمی''' در مای‌اس‌کیو‌ال ۴.۱+ استفاده می‌کنید، و متعاقباً پایگاه اطلاعاتی با <code>mysqldump</code> پشتیبانی می‌شود، ممکن است همهٔ علامت‌های غیر ای‌اس‌سی‌آی‌آی بزرگ را نابود کند، پشتیبانی شما را به طور غیر قابل برگشتی از بین ببرد!\nدر '''روش دو واحدی'''، مدیاویکی متن یوتی‌اف-۸ را به پایگاه اطلاعاتی در زمینه‌های دو واحدی ذخیره می‌کند.\nاین روش کارآمدتر از روش یوتی‌اف-۸ مای‌اس‌کیو‌ال است، و به شما اجازه می دهد که از همهٔ محدودهٔ علائم یونیکد استفاده کنید.\nدر '''روش یوتی‌اف-۸'''، مای‌اس‌کیو‌ال باخبر خواهدبود چه علامتی اطلاعات شما را در آن تنظیم می‌کند، و می‌تواند ارائه کند و به طور صحیح تبدیل کند، اما به شما اجازه نخواهد داد که علائم بالای [//en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes Basic Multilingual Plane] را ذخیره کنید.",
     "config-mysql-old": "مای‌اس‌کیو‌ال نسخهٔ $1 و یا بالاتر نیاز است، شما نسخهٔ $2 را دارید.",
     "config-db-port": "درگاه پایگاه‌داده:",
+    "config-db-schema": "طرح کلی برای مدیاویکی:",
+    "config-db-schema-help": "طرح کلی اغلب بی‌نقص خواهد بود.\nاگر می‌دانید نیاز دارید که تغییرش دهید،آن را تغییر دهید.",
+    "config-pg-test-error": "نمی‌توان به پایگاه اطلاعاتی '''$1''' وصل شد: $2",
+    "config-sqlite-dir": "فهرست اطلاعات اس‌کیو‌لایت:",
+    "config-sqlite-dir-help": "اس‌کیولایت همهٔ اطلاعات را در یک پوشهٔ جداگانه ذخیره می‌کند.\nفهرستی را که به وجود‌ آوردید باید در طی نصب به‌ وسیلهٔ وب‌سرور قابل نوشتن باشد.\nنباید از طریق وب در دسترس باشد،به همین دلیل ما آن را در جایی که پوشه‌های پی‌اچ‌پی شما هست، قرار نمی‌دهیم.\nنصب کننده یک پوشهٔ <code>.htaccess</code> همراه آن خواهدآورد،اما اگر این کار را انجام ندهد،کسی می‌تواند به پایگاه اطلاعاتی شما دسترسی پیدا کند.\nاطلاعات خام کاربر شامل (آدرس‌های رایانامه،علامت‌‌ها با شماره‌های رمز عبور) به خوبی پاک کردن تغییرات و دیگر اطلاعات محرمانه در ویکی.\nقرار دادن پایگاه اطلاعاتی باهم را در جایی دیگر در نظر بگیرید، برای مثال در <code>/var/lib/mediawiki/yourwiki</code>.",
+    "config-oracle-def-ts": "جدول پیش فرض:",
+    "config-oracle-temp-ts": "جدول موقت:",
+    "config-type-mysql": "مای‌اس‌کیو‌ال (یا سازگار)",
+    "config-type-mssql": "سرور مایکروسافت اس‌کیو‌ال",
+    "config-support-info": "مدیاویکی سامانه‌های پایگاه اطلاعاتی زیر را حمایت می‌کند:\n$1\nاگر متوجه سامانه پایگاه اطلاعاتی که سعی دارید از فهرست زیر استفاده کنید، نمی‌شوید، بنابراین دستورالعمل‌های مرتبط در بالا را برای فعال‌کردن پشتیبانی دنبال کنید.",
+    "config-dbsupport-mysql": "*[{{int:version-db-mysql-url}} MySQL] مهم‌ترین هدف برای مدیاویکی است و بهترین پشتیبانی. مدیاویکی همچنین کار می‌کند با [{{int:version-db-mariadb-url}} MariaDB] و [{{int:version-db-percona-url}} Percona Server] که با MySQL سازگار هستند.([http://www.php.net/manual/en/mysqli.installation.php چگونه php را با MySQL کامپایل کنیم])",
+    "config-dbsupport-postgres": "* [{{int:version-db-postgres-url}} PostgreSQL] یک منبع آزاد پر‌طرفدار دستگاه پایگاه اطلاعاتی به عنوان یک غیرمتعارف برای مای‌اس‌کیوال است.ممکن است عیوب بارز مختصری باشد، و برای استفاده در یک محیط تولیدی توصیه نمی‌شود.([http://www.php.net/manual/en/pgsql.installation.php how to compile PHP with PostgreSQL support])",
+    "config-dbsupport-sqlite": "*[{{int:version-db-sqlite-url}} اس‌کیولایت] یک سامانه پایگاه اطلاعاتی کم حجمی است که بسیار خوب پشتیبانی شده‌است.\n([http://www.php.net/manual/en/pdo.installation.php چگونگی کامپایل پی‌اچ‌پی با اس‌کیولایت]، از PDO استفاده می‌کند)",
+    "config-dbsupport-oracle": "* [{{int:version-db-oracle-url}} Oracle] یک پایگاه اطلاعاتی کار تبلیغاتی است.\n([http://www.php.net/manual/en/oci8.installation.php How to compile PHP with OCI8 support])",
+    "config-dbsupport-mssql": "* [{{int:version-db-mssql-url}} Microsoft SQL Server] یک پایگاه اطلاعاتی موسسهٔ تبلیغاتی برای وینذوز است. ([http://www.php.net/manual/en/sqlsrv.installation.php How to compile PHP with SQLSRV support])",
     "config-header-mysql": "تنظیمات مای‌اس‌کیو‌ال",
+    "config-header-postgres": "تنظیمات پست‌گر‌اس‌کیو‌ال",
+    "config-header-sqlite": "تنظیمات اس‌کیو‌لایت",
+    "config-header-oracle": "تنظیمات اوراکل",
+    "config-header-mssql": "تنظیمات سرور مایکرپسافت اس‌کیو‌ال",
+    "config-invalid-db-type": "نوع پایگاه اطلاعاتی نامعتبر",
+    "config-missing-db-name": "شما باید یک مقدار برای \"نام پایگاه اطلاعاتی\" وارد کنید",
+    "config-missing-db-host": "شما باید یک مقدار برای \"گروه پایگاه اطلاعاتی\" وارد کنید",
+    "config-missing-db-server-oracle": "شما باید یک مقدار برای \"تی‌ان‌اس پایگاه اطلاعاتی\" وارد کنید",
+    "config-invalid-db-server-oracle": "تی‌ان‌اس پایگاه اطلاعاتی $1 نامعتبر.\nیا از \"نام تی‌ان‌اس\" یا یک سلسله \"ارتباط آسان\" ([http://docs.oracle.com/cd/E11882_01/network.112/e10836/naming.htm Oracle Naming Methods]) استفاده کنید.",
+    "config-invalid-db-name": "نام پایگاه اطلاعاتی نامعتبر \"$1\".\nفقط حروف اِی‌اس‌سی‌آی‌آی بزرگ (اِی-زدکوچک،اِی-زد بزرگ)،اعداد (۰-۹)،آندرلاین (_) و خط تیره کوتاه (-) استفاده کنید.",
+    "config-invalid-db-prefix": "پیشوند پایگاه اطلاعاتی نامعتبر \"$1\".\nفقط حروف اِی‌اس‌سی‌آی‌آی بزرگ (اِی-زدکوچک،اِی-زد بزرگ)،اعداد (۰-۹)،آندرلاین (_) و خط تیره کوتاه (-) استفاده کنید.",
     "config-connection-error": "$1.\n\nمیزبان، نام کاربری و گذرواژه را بررسی کنید و دوباره امتحان کنید.",
+    "config-invalid-schema": "طرح‌کلی برای مدیاویکی نامعتبر \"$1\".\nفقط حروف اِی‌اس‌سی‌آی‌آی بزرگ (اِی-زدکوچک،اِی-زد بزرگ)،اعداد (۰-۹)،آندرلاین (_) و خط تیره کوتاه (-) استفاده کنید.",
+    "config-db-sys-create-oracle": "نصب‌کننده تنها از استفادهٔ یک حساب اس‌وای‌اس‌دی‌بی‌اِی برای ایجاد یک حساب جدید حمایت می‌کند.",
+    "config-db-sys-user-exists-oracle": "حساب کاربری \"$1\" در‌حال‌حاضر وجود دارد.تنها اس‌وای‌اس‌دی‌بی‌اِی می‌تواند برای ایجاد یک حساب جدید استفاده شود!",
+    "config-postgres-old": "پستگِرِاس‌کیو‌ال نسخهٔ $1 یا بالاتر لازم است. شما نسخهٔ $2 را دارید.",
+    "config-mssql-old": "سرور مایکروسافت اس‌کیو‌ال $1 یا اخیر آن لازم است. شما $2 را دارید.",
+    "config-sqlite-name-help": "نامی را انتخاب کنید که ویکی شما را شناسایی می‌کند.\nاز فاصله‌ها یا خط‌های تیره کوتاه استفاده نکنید.\nاین برای نام پوشهٔ اطلاعات اس‌کیولایت استفاده خواهد‌شد.",
+    "config-sqlite-parent-unwritable-group": "فهرست اطلاعات <code><nowiki>$1</nowiki></code> نمی‌تواند ایجاد شود، چون فهرست منشأ <code><nowiki>$2</nowiki></code> توسط سرور شبکه قابل نوشتن نیست.\nنصب کننده، کاربری را که سرور شبکه شما را اجرا می‌کند، مشخص کرده‌است.\nبرای ادامه دادن،فهرستی قابل نوشتن <code><nowiki>$3</nowiki></code> توسط آن ایجاد کنید.\nدر یک سامانه یونیکس/لینوکس انجام می‌دهد:\n<pre>cd $2\nmkdir $3\nchgrp $4 $3\nchmod g+w $3</pre>",
+    "config-sqlite-parent-unwritable-nogroup": "فهرست اطلاعات <code><nowiki>$1</nowiki></code> نمی‌تواند ایجاد شود، چون فهرست منشأ <code><nowiki>$2</nowiki></code> توسط کارساز شبکه قابل نوشتن نیست.\nنصب کننده، کاربری را که سرور شبکه شما را اجرا می‌کند، نتوانست مشخص کند.\nفهرست کلی قابل نوشتن <code><nowiki>$3</nowiki></code> توسط آن (و دیگران!) برای ادامه دادن،ایجاد کنید.\nدر یک سامانه یونیکس/لینوکس انجام می‌دهد:\n<pre>cd $2\nmkdir $3\nchmod a+w $3</pre>",
+    "config-sqlite-mkdir-error": "خطا در ایجاد فهرست اطلاعات \"$1\".\nمکان حافظهٔ رایانه را بررسی کنید و دوباره سعی کنید.",
+    "config-sqlite-dir-unwritable": "قادر نبودن در نوشتن فهرست \"$1\".\nمجوز‌هایی را که وب‌سرور می‌تواند برای آن مطرح کند را تغییر دهید، و دوباره سعی کنید.",
+    "config-sqlite-connection-error": "$1\nفهرست اطلا‌عات‌ و نام پایگاه اطلا‌عاتی زیر را بررسی کنید و دوباره سعی کنید.",
+    "config-sqlite-readonly": "پوشهٔ <code>$1</code> قابل نوشتن نیست.",
+    "config-sqlite-cant-create-db": "پوشه‌ٔ پایگاه اطلا‌عاتی <code>$1</code>نتوانست ایجاد شود.",
+    "config-sqlite-fts3-downgrade": "پی‌اچ‌پی، پشتیبانی اف‌تی‌اس۳ کار نمی‌کند، کاهش جدول‌ها",
+    "config-can-upgrade": "جدول‌های مدیاویکی در این پایگاه اطلاعاتی وجود دارند.\nبرای ارتقاء دادن آنها به مدیاویکی $1، '''ادامه''' را کلیک کنید.",
+    "config-upgrade-done": "تکمیل ارتقاء.\nاکنون شما می‌توانید [$1 start using your wiki].\nاگر می‌خواهید پوشهٔ <code>LocalSettings.php</code> را احیا کنید،دکمهٔ زیر را کلیک کنید.\nاین ''' توصیه نمی‌شود ''' مگر اینکه با ویکی خود مشکل داشته باشید.",
+    "config-upgrade-done-no-regenerate": "ارتقاء کامل شد.\nاکنون شما می‌توانید [$1 start using your wiki].",
+    "config-regenerate": "بازسازی LocalSettings.php ←",
+    "config-show-table-status": "سوأل <code>SHOW TABLE STATUS</code> مردود شد!",
+    "config-unknown-collation": "'''هشدار:''' پایگاه اطلاعاتی درحال استفاده از صفحه‌بندی ناشناخته.",
+    "config-db-web-account": "حساب پایگاه اطلاعاتی برای دسترسی وب",
+    "config-db-web-help": "در طی عملیات عادی ویکی،نام کاربری و رمز عبوری را انتخاب کنیدکه وب سرور برای اتصال به سرور پایگاه اطلاعاتی استفاده کنید.",
+    "config-db-web-account-same": "هنگام نصب از حساب یکسان استفاده کنید",
+    "config-db-web-create": "اگر در حال‌حاضر وجود ندارد،حساب ایجاد کنید",
+    "config-db-web-no-create-privs": "حسابی که شما برای نصب تعیین کردید،مزایای کافی برای ایجاد یک حساب را ندارد.\nحسابی که شما اینجا تعیین کرده‌اید باید در حال حاضر وجود داشته باشد.",
+    "config-mysql-engine": "موتور ذخیره سازی:",
+    "config-mysql-innodb": "اینودی‌بی",
+    "config-mysql-myisam": "می‌ای‌سم",
+    "config-mysql-myisam-dep": "'''هشدار:''' شما مای‌آی‌اس‌ای‌ام را به عنوان موتور ذخیره برای مای‌آی‌اس‌ای‌ام انتخاب کرده‌اید، که برای استفاده با مدیاویکی توصیه نمی‌شود زیرا:\n* به‌علت قفل شدن جدول اجمالاً به طور همزمان پشتیبانی می کند\n* بیشتر از دیگر موتورها برای از بین‌ رفتن مستعد است.\n* مبنای رمز مدیاویکی همیشه مای‌آی‌اس‌ای‌ام را همان طور که باید باشد،کنترل نمی‌کند\nاگر نصب مای‌اس‌کیو‌ال شما اینودی‌بی را پشتیبانی می‌کند،بسیار توصیه می‌شود  که در عوض ،آن را انتخاب کنید.\nاگر نصب مای‌اس‌کیو‌ال شما، اینودی‌بی را پشتیبانی نمی‌کند، ممکن است زمان ارتقاء رسیده باشد.",
+    "config-mysql-only-myisam-dep": "'''هشدار:''' مای‌آی‌اس‌ای‌ام تنها موتور ذخیره‌سازی اطلاعات برای مای‌اس‌کیو‌ال در این دستگاه است، و برای استفاده با مدیاویکی توصیه نمی‌شود، زیرا:\n* به‌علت قفل شدن جدول اجمالاً به طور همزمان پشتیبانی می کند\n* بیشتر از دیگر موتورها برای از بین‌ رفتن مستعد است.\n* مبنای رمز مدیاویکی همیشه مای‌آی‌اس‌ای‌ام را همان طور که باید باشد،کنترل نمی‌کند\nنصب مای‌اس‌کیو‌ال شما اینودی‌بی را پشتیبانی نمی‌کند،ممکن است زمان یک ارتقاء رسیده باشد.",
+    "config-mysql-engine-help": "'''اینودی‌بی''' تقریباً همیشه بهترین گزینه است،زیرا پشتیبانی همزمان خوبی دارد.\n'''مای‌آی‌اس‌ای‌ام''' ممکن است در نصب‌های کاربر جداگانه یا فقط خواندنی سریع‌تر باشد.\nپایگاه‌های اطلاعاتی مای‌آی‌اس‌ای‌ام اغلب بیشتر از پایگاه‌های اطلاعاتی اینودی‌بی مستعد ازبین رفتن هستند.",
+    "config-mysql-charset": "مجموعه‌ٔ خصوصیات پایگاه اطلاعاتی:",
     "config-mysql-binary": "دودویی",
     "config-mysql-utf8": "UTF-8",
+    "config-mysql-charset-help": "در حالت باینری مدیاویکی متن را به صورت  UTF-8 در پایگاه داده باینری ذخیره می‌کند.\nاین روش بسیار به صرفه‌تر از حالت  UTF-8 برای MySQL هست و به شما اجازهٔ استفاده از همه بازهٔ نویسه‌های یونیکد را می دهد.\n\nدر حالت UTF-8 برنامه MySQL به شما اجازه می‌دهد که کدام نویسه‌ها در داده‌های شما باشند و اجازهٔ تبدیل و حضور آنها را به صورت مطلوبی می‌دهد ولی به شما اجازهٔ ذخیرهٔ نویسه‌های بالای [//en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes نقشه ابتدائی چندزبانی] را می‌دهد.",
+    "config-mssql-auth": "نوع تأیید:",
+    "config-mssql-install-auth": "نوع تأییدی را که برای اتصال به پایگاه اطلاعاتی حین فرآیند نصب مورد استفاده قرار گیرد را انتخاب کنید.\nاگر \"{{int:config-mssql-windowsauth}}\" را انتخاب می‌کنید، اعتبارات هرآنچه کاربر وب سرور به عنوان آن  مورد استفاده قرار می‌دهد مورد استفاده قرار خواهد گرفت.",
+    "config-mssql-web-auth": "نوع تأییدی را که کارساز وب به‌وسیلهٔ آن برای کارهای معمولی به پایگاه اطلاعاتی متصل خواهد شد را انتخاب کنید.\nاگر «{{int:config-mssql-windowsauth}}» را انتخاب می‌کنید، اعتبارات هرآنچه کاربر وب سرور به عنوان آن  مورد استفاده قرار می‌دهد مورد استفاده قرار خواهد گرفت.",
+    "config-mssql-sqlauth": "تأیید سرور اس‌کیوال",
+    "config-mssql-windowsauth": "تأیید ویندوز",
     "config-site-name": "نام ویکی:",
+    "config-site-name-help": "این در نوار عنوان مرورگر و در دیگر جاهای مختلف ظاهر خواهد‌شد.",
     "config-site-name-blank": "نام تارنما را وارد کنید.",
     "config-project-namespace": "فضای نام پروژه:",
     "config-ns-generic": "پروژه",
+    "config-ns-site-name": "مشابه نام ویکی: $1",
+    "config-ns-other": "دیگر ( تعیین کنید)",
     "config-ns-other-default": "ویکی‌من",
-    "config-admin-box": "حساب مدیر سیستم",
-    "config-admin-name": "نام شما:",
-    "config-admin-password": "کلمه عبور:",
-    "config-admin-password-confirm": "دوباره کلمه عبور:",
-    "config-admin-email": "پست الکترونیکی شما:",
+    "config-project-namespace-help": "مثال‌های ویکی‌پدیا. بسیاری از ویکی‌ها سیاست‌هایشان را در فضای نام غیر پروژه ذخیره می‌کنند.\n\nهمه عنوان‌های صفحات در این فضای نام توسط پیشوند متفاوت جدا می‌شوند که شما می‌توانید اینجا مشخص کنید.\nمعمولاً این پیشوند برگرفته از نام ویکی هستند ولی نمی تواند حروف سجاوندی در نام آن باشد مانند \"#\" یا \":\".",
+    "config-ns-invalid": "فضای نامی تعیین شدهٔ \"<nowiki>$1</nowiki>\" نامعتبر است.\nیک برنامهٔ فضای نامی دیگری را تعیین کنید.",
+    "config-ns-conflict": "فضای نامی تعیین شدهٔ \"<nowiki>$1</nowiki>\" با یک فضای نامی پیش‌فرض مدیاویکی مغایرت دارد.\nیک برنامهٔ فضای نامی دیگری را تعیین کنید.",
+    "config-admin-box": "حساب مدیر سامانه",
+    "config-admin-name": "نام کاربری شما:",
+    "config-admin-password": "گذرواژه:",
+    "config-admin-password-confirm": "دوباره گذرواژه:",
+    "config-admin-help": "نام کاربری مورد علاقهٔ خود را اینجا وارد کنید، برای مثال \" جو بلاگز \".\nاین نامی است که شما برای ورود به ویکی استفاده خواهید‌کرد.",
+    "config-admin-name-blank": "نام کاربری سرپرست را وارد کنید.",
+    "config-admin-name-invalid": "نام کاربری تعیین شدهٔ \"<nowiki>$1</nowiki>\" نامعتبر است.\nیک نام کاربری دیگر تعیین کنید.",
+    "config-admin-password-blank": "برای حساب سرپرست یک رمز عبور وارد کنید.",
+    "config-admin-password-mismatch": "دو رمز عبوری که وارد کرده‌اید با هم مطابقت ندارند.",
+    "config-admin-email": "رایانامهٔ شما:",
+    "config-admin-email-help": "یک آدرس رایانامه برای اجازهٔ دریافت رایانامه از دیگر کاربران ویکی،اینجا وارد کنید، رمز عبور خود را دوباره تنظیم کنید، و از تغییرات صفحه در فهرست پیگیریها مطلع باشید.می‌توانید این زمینه را خالی بگذارید.",
+    "config-admin-error-user": "خطای داخلی هنگام ایجاد یک مدیر با نام \"<nowiki>$1</nowiki>\".",
+    "config-admin-error-password": "خطای داخلی هنگام تنظیم یک رمز عبور برای مدیر \"<nowiki>$1</nowiki>\": <pre>$2</pre>",
+    "config-admin-error-bademail": "شما آدرس رایانامهٔ نامعتبر وارد کرده‌اید.",
+    "config-subscribe": "عضویت در [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce release announcements mailing list].",
+    "config-subscribe-help": "این یک میلینگ لیست کم حجم است که برای اطلاع‌رسانی کاربرد دارد و شامل اطلاعیه‌های امنیتی می‌شود.\nشما باید در آن ثبت نام کنید و زمانی که نسخهٔ جدید مدیاویکی ارائه شد آن را به‌روز نمائید.",
+    "config-subscribe-noemail": "شما بدون ثبت رایانامه‌تان قصد داشتید در فهرست پستی ثبت‌نام کنید.\nاگر قصد ثبت‌نام دارید لطفاً رایانامه‌ای مشخص کنید.",
+    "config-almost-done": "شما تقریباً عملیات را کامل کرده‌اید.\nاکنون می‌توانید پیکربندی باقیمانده را نخوانده رها کنید و درحال‌حاضر ویکی را نصب کنید.",
+    "config-optional-continue": "سوال‌های بیشتری از من بپرسید.",
+    "config-optional-skip": "درحال‌حاضر خسته‌ام،سریعاً ویکی را نصب کنید.",
+    "config-profile": "شرح‌حال حقوق کاربر:",
+    "config-profile-wiki": "بازکردن ویکی",
+    "config-profile-no-anon": "ساخت کاربری مورد نیاز است",
+    "config-profile-fishbowl": "فقط کاربر تأیید شده",
     "config-profile-private": "ویکی خصوصی",
+    "config-profile-help": "زمانی ویکی درست کار می کند که شما اجازه دهید تعداد زیادی از مردم آن را ویرایش کنند.\nدر مدیاویکی امکان مشاهدهٔ تغییرات اخیر و واگردانی ویرایش‌های خرابکاری به آسانی وجود دارد.\n\nبا وجودی که مدیا ویکی منافع بسیاری برای مردم دارد ولی متقاعد کردن خیلی از مردم درباره روش کار ویکی‌ها کار آسانی نیست.\n\nدر نتیجه شما دو انتخاب دارید.\n\n'''{{int:config-profile-wiki}}''' به همه کاربرها اجازهٔ ویرایش می دهد حتی بدون ثبت‌نام.\n\nیک ویکی که دارای '''{{int:config-profile-no-anon}}''' باشد امکانات کاربری بیشتری ارائه می‌دهد ولی امکان دارد ویرایشگران عادی را نگران کند.\n\nسناریوی '''{{int:config-profile-fishbowl}}''' به کاربرها اجازهٔ ویرایش می دهد ولی همه می توانند متن و تاریخچه را ببیند.\n\n'''{{int:config-profile-private}}''' فقط به کاربران اجازهٔ مشاهدهٔ مطالب را می‌دهد و فقط آنها می توانند ویرایش کنند.\n\nدسترسی‌های بیشتر کاربری بعد از نصب در [//www.mediawiki.org/wiki/Manual:User_rights راهنماهای مرتبط] موجود است.",
     "config-license": "حق تکثیر و مجوز:",
     "config-license-none": "بدون پاورقی مجوز",
+    "config-license-cc-by-sa": "اشتراک گذاری یکجور استناد رایج سازنده",
+    "config-license-cc-by": "استناد رایج سازنده",
+    "config-license-cc-by-nc-sa": "اشتراک گذاری یکجور استناد رایج سازندهٔ غیر تجاری",
+    "config-license-cc-0": "مبداء عوام سازنده (حیطهٔ عمومی)",
+    "config-license-gfdl": "مجوز اسنادومدارک آزاد جی‌ان‌یو ۱.۳ یا بالاتر",
     "config-license-pd": "دامنه عمومی",
     "config-license-cc-choose": "انتخاب یک مجوز سفارشی عوام خلاق",
-    "config-email-settings": "تنظیمات پست الکترونیکی",
-    "config-upload-enable": "فعال سازی بارگذاری پرونده",
+    "config-license-help": "بسیاری از وبگاه‌ها ویرایش‌های ها را با  [http://freedomdefined.org/Definition اجازه‌نامهٔ آزاد] منتشر می‌کنند.\nاین کار به داشتن حس مالکیت جمعی کمک می‌کند و ویرایش‌های طولانی مدت را اشاعه می‌دهد.\nاین برای ویکی‌های خصوصی یا سازمانی الزامی نیست.\n\nاگر شما می‌خواهید از متون ویکی‌پدیا استفاده کنید، یا اینکه به ویکی‌پدیا اجازه دهید از متون شما استفاده کند باید متون خود را با '''Creative Commons Attribution Share Alike''' منتشر کنید.\n\nویکی‌پدیا در گذشته از اجازه‌نامهٔ داده‌های آزاد گنو استفاده می‌کرد.\nاین اجازه‌نامه مورد قبول است، ولی فهم آن آسان نیست.\nهمچنین استفادهٔ دوباره از متون تحت اجازه‌نامهٔ داده‌های آزاد گنو به سختی انجام می‌گیرد.",
+    "config-email-settings": "تنظیمات رایانامه",
+    "config-enable-email": "فعال‌سازی رایانامهٔ خروجی",
+    "config-enable-email-help": "اگر برای کار کردن رایانامه می‌خواهید [http://www.php.net/manual/en/mail.configuration.php PHP's mail settings] نیازمند پیکربندی صحیح است.\nاگر هیچ ویژگی رایانامه را نمی‌خواهید، می‌توانید آنها را اینجا غیر‌فعال کنید.",
+    "config-email-user": "فعال‌کردن رایانامهٔ کاربر به کاربر",
+    "config-email-user-help": "به همهٔ کاربرانی که ارسال رایانامه را در اولویت‌های خود فعال کرده‌اند،اجازه خواهد داده‌شد که رایانامه خود را به یکدیگر ارسال کنند.",
+    "config-email-usertalk": "فعال‌کردن اطلاع‌رسانی صفحهٔ بحث کاربر",
+    "config-email-usertalk-help": "به همهٔ کاربرانی که دریافت اطلاعیه را در اولویت‌های خود فعال کرده‌اند،اجازه خواهد داده‌شد که اطلاعیه‌ها را در صفحهٔ تغییر گفت‌وگوی کاربر دریافت کنند.",
+    "config-email-watchlist": "فعال‌کردن اطلاع‌رسانی فهرست پیگیری‌ها",
+    "config-email-watchlist-help": "به همهٔ کاربرانی که مشاهدهٔ صفحه را در اولویت‌های خود فعال کرده‌اند،اجازه خواهد داده‌شد که اطلاعیه‌های در رابطه با صفحات مشاهده شده را دریافت کنند.",
+    "config-email-auth": "فعال‌کردن تأیید اعتبار رایانامه",
+    "config-email-auth-help": "اگر این مورد را فعال کنید، کاربران باید رایانامه خود را با استفاده از پیوند تأییدهٔ که به رایانامه‌یشان فرستاده می‌شود، تأیید کنند. \nدر این صورت تنها رایانامه‌هایی که تأیید شده‌باشند، می‌توانند از سامانه در هنگام تغییرات رایانامه دریافت کنند.\nبرای ویکی‌هایی که به صورت عمومی استفاده می‌شوند، فعال‌کردن این گزینه پیشنهاد می‌شود.",
+    "config-email-sender": "بازگشت به رایانامه:",
+    "config-email-sender-help": "آدرس رایانامه‌ای را وارد کنید که هنگام مراجعت آدرس به رایانامهٔ خارجی استفاده می‌شود.\nبه جایی که پیام‌ها برگشت داده می‌شوند، فرستاده خواهد‌شد.\nبسیاری از سرورهای پستی حداقل به بخش نام عمومی معتبر نیاز دارند.",
+    "config-upload-settings": "بارگذاری‌های پرونده و تصویر",
+    "config-upload-enable": "فعال‌سازی بارگذاری پرونده",
+    "config-upload-help": "بارگذاری پرونده بصورت بالقوه می‌تواند کارساز شما در معرض خطرات امنیتی قرار بدهد. برای کسب اطلاعات بیشتر لطفاً [//www.mediawiki.org/wiki/Manual:Security قسمت امنیتی] را مطالعه کنید.\n\nبرای اجازه‌دادن به بارگذاری پرونده‌ها٬ حالت زیر مجموعه <code>images</code> در پوشه ریشه مدیاویکی را تغییر دهید که کارسازهای وب قادر به نوشتن بر روی آن باشند. سپس این قابلیت را فعال کنید.",
+    "config-upload-deleted": "فهرست برای پوشه‌های حذف شده:",
+    "config-upload-deleted-help": "فهرستی برای بایگانی کردن پوشه‌های حذف شده انتخاب کنید.\nبه طور مطلوب،از شبکه نباید در دسترس باشد.",
     "config-logo": "نشانی نامواره:",
+    "config-logo-help": "پوستهٔ پیش‌فرض مدیاویکی شامل مکانی برای یک آرم ۱۳۵x۱۶۰ پیکسلی بالای منوی نوارکناری است.\nیک عکس با اندازهٔ مناسب ارسال کنید، و یوآرال را اینجا وارد کنید.\nاگر آرم شما با آن راه‌ها مزتبط است،می‌توانید از <code>$wgStylePath</code> یا <code>$wgScriptPath</code> استفاده کنید.\nاگر آرم نمی‌خواهید، این جعبه را خالی رها کنید.",
+    "config-instantcommons": "فعال‌کردن فوری کامنز",
+    "config-instantcommons-help": "[//www.mediawiki.org/ ویکی و InstantCommons ویکی‌انبار فوری] یک ویژگی‌است که به شما اجازه می‌دهد تا تصاویر، صداها یا سایر رسانه‌های یافته شده بر روی [//commons.wikimedia.org/ انبار ویکی مدیا] را استفاده کنید.\n\nبرای استفاده از این ویژگی مدیاویکی نیازمند دسترسی به اینترنت است.\n\nبرای کسب اطلاعات بیشتر درباره این ویژگی٬ شامل دستورالعمل‌های برای چگونگی نصب آن برای سایر ویکی‌های بجز ویکی‌انبار لطفاً از  [//mediawiki.org/wiki/Manual:$wgForeignFileRepos the نصب دستی] استفاده کنید.",
+    "config-cc-error": "مجوز چوزر عوام سازنده بی‌نتیجه ماند.\nنام مجوز را دستی وارد کنید.",
+    "config-cc-again": "انتخاب دوباره...",
+    "config-cc-not-chosen": "مجوز عوام سازنده‌ای را که می‌خواهید انتخاب کنید و \"ادامه\" را کلیک کنید.",
+    "config-advanced-settings": "تنظیمات پیشرفته",
+    "config-cache-options": "تنظیمات برای ذخیره شی:",
+    "config-cache-help": "کش شی برای بهتر شدن سرعت مدیا ویکی، از طریق کش کردن داده‌های با بیشترین استفاده انجام می‌گیرد.\nوبگاه‌های متوسط تا بزرگ به انجام این کار شدیدا توصیه می‌شوند، در عین حال وبگاه‌های کوچک نیز می‌توانند از مزایای ایم مورد بهره ببرند.",
+    "config-cache-none": "بدون ذخیره (هیچ کارآمدی پاک نشده‌است، اما ممکن است سرعت در سایت‌های بزرگتر ویکی تأثیر داشته باشد)",
+    "config-cache-accel": "ذخیرهٔ موضوع پی‌اچ‌پی (ای‌پی‌سی، ایکس‌کیچ یا وین‌کیچ)",
+    "config-cache-memcached": "از ممکچد (که نیازمند تنظیمات اضافی و پیکربندی) استفاده کنید",
+    "config-memcached-servers": "سرورهای دریافت حافظه:",
+    "config-memcached-help": "فهرست آدرس‌های آی‌پی برای استفاده از ممکچد.\nباید هر یک خط را تعیین کند و درگاه مورد استفاده را تعیین کند.برای مثال: \n۱۲۷.۰.۰.۱:۱۱۲۱۱\n۱۹۲.۱۶۸.۱.۲۵:۱۲۳۴",
+    "config-memcache-needservers": "شما ممکچد را به عنوان نوع ذخیرهٔ خود انتخاب کرده‌اید اما هیچ سروری تعیین نشده‌.",
+    "config-memcache-badip": "آدرس آی‌پی نامعتبر برای مِمکَچد وارد کرده‌اید: $1.",
+    "config-memcache-noport": "شما درگاهی برای استفاده از سرور ممکچد تعیین نکرده بودید: $1\nاگر از درگاه مطلع نیستید، پیش‌فرض ۱۱۲۱۱ است.",
+    "config-memcache-badport": "اعداد درگاه ممکچد باید بین $1 و $2 باشد.",
     "config-extensions": "افزونه‌ها",
+    "config-extensions-help": "لیست وسیع بالا در فهرست <code>./extensions</code> شما یافت شد.\nممکن است نیازمند پیکربندی اضافه باشند، اما اکنون می‌توانید آنها را فعال کنید.",
+    "config-install-alreadydone": "'''هشدار:''' به نظر می‌رسد در حال حاضر شما مدیاویکی را نصب کرده‌اید و دوباره سعی میکنید آن را نصب کنید.\nلطفاً به صفحهٔ بعدی بروید.",
+    "config-install-begin": "با فشاردادن \"{{int:config-continue}}\"، نصب مدیاویکی را آغاز خواهید‌کرد.\nاگر هنوز می‌خواهید تغییرات ایجاد کنید، \"{{int:config-back}}\" را فشار دهید.",
     "config-install-step-done": "انجام شد",
     "config-install-step-failed": "ناموفق بود",
+    "config-install-extensions": "افزونه‌های مشمول",
+    "config-install-database": "نصب پایگاه داده",
+    "config-install-schema": "ایجاد طرح کلی",
+    "config-install-pg-schema-not-exist": "طرح کلی PostgreSQL وجود ندارد.",
+    "config-install-pg-schema-failed": "ایجاد جدول‌ها با شکست روبه‌رو شد.\nمطمئن شوید که کاربر \"$1\" می‌تواند طرح کلی \"$2\" را بنویسد.",
+    "config-install-pg-commit": "ارسال تغییرات",
+    "config-install-pg-plpgsql": "بررسی زبان پی‌ال/پی‌جی‌اس‌کیو‌ال",
+    "config-pg-no-plpgsql": "شما ملزم به نصب زبان پی‌ال/پی‌جی‌اس‌کیو‌ال در پایگاه اطلاعاتی $1 هستید",
+    "config-pg-no-create-privs": "حسابی که شما برای نصب تعیین کردید، مزایای کافی برای ایجاد یک حساب را ندارد.",
+    "config-pg-not-in-role": "حسابی که شما برای کاربر وب مشخص نموده‌اید در حال حاضر موجود است.\nحسابی که شما مشخص نموده‌اید جزو گروه کاربران سوپریوزر نیست و همچین عضو نقش کار وب نیست بنابراین قادر به ایجاد اشیایی تحت مالکیت کاربر وب نیست.\n\nجداول در مدیاویکی همکنون باید تحت مالکیت کاربر وب در بیاییند. لطفاً حساب کاربری وب دیگری را معین کنید و یا بر روی «برگشت» کلیک و کاربری با صحت امتیاز مناسب برای نصب انتخاب کنید.",
+    "config-install-user": "ایجاد بانک اطلاعاتی کاربر",
+    "config-install-user-alreadyexists": "کاربر \"$1\" در حال حاضر موجود است",
+    "config-install-user-create-failed": "ایجاد کاربر \"$1\" انجام نشد:$2",
+    "config-install-user-grant-failed": "اعطای مجوز به کاربر \"$1\" با شکست روبه‌رو شد: $2",
+    "config-install-user-missing": "کاربر تعیین شدهٔ \"$1\" وجود ندارد.",
+    "config-install-user-missing-create": "کاربر تعیین شدهٔ \"$1\" وجود ندارد.\nاگر می‌خواهید حساب ایجاد کنید،لطفاً جعبهٔ بررسی \"ایجاد حساب\" را کلیک کنید.",
+    "config-install-tables": "ایجاد جداول",
+    "config-install-tables-exist": "'''هشدار:''' جداول مدیاویکی به نظر می‌رسد در حال حاضر وجود دارد.\nصرف نظر از ایجاد.",
+    "config-install-tables-failed": "'''خطا:''' ایجاد جدول با خطای زیر به شکست مواجه شد: $1",
+    "config-install-interwiki": "قرار دادن پیش‌فرض جدول ویکی داخلی",
+    "config-install-interwiki-list": "پوشهٔ <code>interwiki.list</code> نتوانست خوانده شود.",
+    "config-install-interwiki-exists": "'''هشدار:''' به نظر می‌رسد جدول ویکی داخلی در حال حاضر دارای مقداری اطلاعات است.\nنادیده گرفتن فهرست پیش‌فرض.",
+    "config-install-stats": "شروع آمار",
+    "config-install-keys": "تولید کلیدهای مخفی",
+    "config-insecure-keys": "'''هشدار:''' {{PLURAL:$2|کلید امن|کلیدهای امن}} ($1) در طی نصب  کاملاً ایمن {{PLURAL:$2|نیست|نیستند}}. تغییر دستی {{PLURAL:$2|آن|آنها}} را در نظر بگیرید.",
+    "config-install-sysop": "ایجاد حساب کاربری مدیر",
+    "config-install-subscribe-fail": "قادر تصدیق اعلام مدیاویکی نیست:$1",
+    "config-install-subscribe-notpossible": "سی‌یوآر‌ال نصب نشده‌است و allow_url_fopen در دسترس نیست.",
+    "config-install-mainpage": "ایجاد صفحهٔ اصلی با محتوای پیش‌فرض",
+    "config-install-extension-tables": "ایجاد جداول برای افزونه‌های فعال",
+    "config-install-mainpage-failed": "قادر به درج صفحهٔ اصلی نمی‌باشد:$1",
+    "config-install-done": "'''تبریک!'''\nبا موفقیت مدیاویکی را نصب کردید.\nبرنامه نصب‌کننده پرونده <code>LocalSettings.php</code> را درست کرد.\nکه شامل تمام تنظیمات می‌باشد.\n\nشما نیاز به دریافت آن دارید و آن را در پایهٔ نصب ویکی قرار دهید (همان پوشهٔ index.php). دریافت باید به صورت خودکار شروع شده‌باشد.\n\nاگر دریافت شروع نشد یا اگر آن را لغو کردید با کلیک روی پیوند زیر می‌توانید آن را دریافت کنید:\n\n$3\n\n'''توجه داشته باشید:''' اگر این را الآن انجام ندهید، این پرونده تولیدشده در صورتی که نصب را بدون دریافت آن تمام کردید بعداً در اختیار شما قرار نخواهد گرفت.\n\nوقتی انجام شد شما می‌توانید '''[$2 وارد ویکی شوید]'''.",
+    "config-download-localsettings": "دریافت <code>LocalSettings.php</code>",
     "config-help": "راهنما",
+    "config-nofile": "پروندهٔ «$1» یافت نشد. آیا حذف شده‌است؟",
+    "config-extension-link": "آیا می‌دانستید که ویکی شما [//www.mediawiki.org/wiki/Manual:Extensions extensions] را پشتیبانی می‌کند؟\nشما می‌توانید [//www.mediawiki.org/wiki/Category:Extensions_by_category extensions by category] یا [//www.mediawiki.org/wiki/Extension_Matrix Extension Matrix] را برای دیدن همهٔ فهرست وسیع،جسته‌وگریخته بخوانید.",
     "mainpagetext": "'''نرم‌افزار ویکی با موفقیت نصب شد.'''",
-    "mainpagedocfooter": "از [//meta.wikimedia.org/wiki/Help:Contents راهنمای کاربران]\nبرای استفاده از نرم‌افزار ویکی کمک بگیرید.\n\n== آغاز به کار ==\n\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings تنظیم پیکربندی]\n* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki پرسش‌های متداول]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce فهرست پست الکترونیکی نسخه‌های مدیاویکی]"
-}
\ No newline at end of file
+    "mainpagedocfooter": "از [//meta.wikimedia.org/wiki/Help:Contents راهنمای کاربران]\nبرای استفاده از نرم‌افزار ویکی کمک بگیرید.\n\n== آغاز به کار ==\n\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings تنظیم پیکربندی]\n* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki پرسش‌های متداول]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce فهرست ارسال نسخه‌های مدیاویکی]\n* [//www.mediawiki.org/wiki/Localisation#Translation_resources Localise مدیاویکی برای زبان شما]"
+}
index 149313a..132c9df 100644 (file)
@@ -9,7 +9,9 @@
             "Silvonen",
             "Str4nd",
             "VezonThunder",
-            "아라"
+            "아라",
+            "Elseweyr",
+            "Lliehu"
         ]
     },
     "config-desc": "MediaWiki-asennin",
@@ -21,7 +23,7 @@
     "config-localsettings-badkey": "Antamasi avain on virheellinen.",
     "config-upgrade-key-missing": "Havaittiin aiempi MediaWiki-asennus.\nPäivittääksesi tämän asennuksen lisää <code>LocalSettings.php</code>-tiedostosi loppuun seuraava rivi:\n\n$1",
     "config-localsettings-incomplete": "Nykyinen <code>LocalSettings.php</code>-tiedosto näyttää olevan puutteellinen.\nMuuttujaa $1 ei ole asetettu.\nMuuta <code>LocalSettings.php</code>-tiedostoa siten, että muuttuja on asetettu ja napsauta »{{int:Config-continue}}».",
-    "config-localsettings-connection-error": "Virhe yhdistettäessä tietokantaan käyttäen tiedostossa <code>LocalSettings.php</code> tai <code>AdminSettings.php</code> määritettyjä asetuksia. Korjaa asetukset ja yritä uudelleen.\n\n$1",
+    "config-localsettings-connection-error": "Yhteyden muodostaminen tietokantaan epäonnistui tiedostossa <code>LocalSettings.php</code> olevien asetusten takia. Korjaa asetukset ja yritä uudelleen.\n\n$1",
     "config-session-error": "Istunnon aloittaminen epäonnistui: $1",
     "config-session-expired": "Istuntotietosi näyttävät olevan vanhentuneita.\nIstuntojen elinajaksi on määritelty $1.\nVoit muuttaa tätä asetusta vaihtamalla kohtaa <code>session.gc_maxlifetime</code> php.ini-tiedostossa.\nKäynnistä asennusprosessi uudelleen.",
     "config-no-session": "Istuntosi tiedot menetettiin!\nTarkista php.ini-tiedostosi ja varmista, että <code>session.save_path</code> on asetettu sopivaan kansioon.",
@@ -48,7 +50,7 @@
     "config-page-existingwiki": "Aikaisempi asennus",
     "config-help-restart": "Haluatko poistaa kaikki annetut tiedot ja aloittaa asennuksen alusta?",
     "config-restart": "Kyllä",
-    "config-welcome": "=== Ympäristön tarkistukset ===\nVarmistetaan MediaWikin asennettavuus tähän ympäristöön.\nSinun pitäisi antaa näiden tarkistusten tulokset, jos tarvitset apua asennuksen aikana.",
+    "config-welcome": "=== Ympäristön tarkistukset ===\nVarmistetaan MediaWikin asennettavuus tähän ympäristöön.\nMuista antaa nämä tiedot, jos tarvitset apua asennuksen aikana.",
     "config-sidebar": "* [//www.mediawiki.org MediaWikin kotisivu]\n* [//www.mediawiki.org/wiki/Help:Contents Käyttöopas]\n* [//www.mediawiki.org/wiki/Manual:Contents Hallintaopas]\n* [//www.mediawiki.org/wiki/Manual:FAQ UKK]\n----\n* <doclink href=Readme>Lue minut</doclink>\n* <doclink href=ReleaseNotes>Julkaisutiedot</doclink>\n* <doclink href=Copying>Kopiointi</doclink>\n* <doclink href=UpgradeDoc>Päivittäminen</doclink>",
     "config-env-good": "Asennusympäristö on tarkastettu.\nVoit asentaa MediaWikin.",
     "config-env-bad": "Asennusympäristö on tarkastettu.\nEt voi asentaa MediaWikiä.",
@@ -56,7 +58,6 @@
     "config-env-php-toolow": "PHP $1 on asennettu.\nMediaWiki vaatii PHP:n version $2 tai uudemman.",
     "config-no-db": "Sopivaa tietokanta-ajuria ei löytynyt! Sinun täytyy asentaa tietokanta-ajurit PHP:lle.\nSeuraavat tietokantatyypit ovat tuettuja: $1.",
     "config-safe-mode": "'''Varoitus:''' PHP:n [http://www.php.net/features.safe-mode safe mode] -tila on aktiivinen.\nSe voi aiheuttaa ongelmia erityisesti tiedostojen tallentamisen ja matemaattisten kaavojen kanssa.",
-    "config-pcre": "PCRE-tukimoduuli puuttuu.\nMediaWiki vaatii toimiakseen Perl-yhteensopivat säännölliset lausekkeet.",
     "config-memory-bad": "'''Varoitus:''' PHP:n <code>memory_limit</code> on $1.\nTämä on luultavasti liian alhainen.\nAsennus saattaa epäonnistua!",
     "config-xcache": "[http://xcache.lighttpd.net/ XCache] on asennettu",
     "config-apc": "[http://www.php.net/apc APC] on asennettu.",
@@ -64,6 +65,7 @@
     "config-diff3-bad": "GNU diff3:a ei löytynyt.",
     "config-db-type": "Tietokannan tyyppi",
     "config-db-host": "Tietokantapalvelin",
+    "config-db-wiki-settings": "Identifioi tämä wiki",
     "config-db-name": "Tietokannan nimi",
     "config-db-username": "Tietokannan käyttäjätunnus",
     "config-db-password": "Tietokannan salasana",
@@ -75,7 +77,7 @@
     "config-charset-mysql5": "MySQL 4.1/5.0, UTF-8",
     "config-charset-mysql4": "MySQL 4.0, taaksepäin yhteensopiva UTF-8",
     "config-mysql-old": "MediaWiki tarvitsee MySQL:n version $1 tai uudemman. Nykyinen versio on $2.",
-    "config-type-mysql": "MySQL",
+    "config-type-mysql": "MySQL (tai yhteensopiva)",
     "config-type-postgres": "PostgreSQL",
     "config-type-sqlite": "SQLite",
     "config-type-oracle": "Oracle",
     "config-ns-generic": "Projekti",
     "config-ns-site-name": "Sama kuin wikin nimi: $1",
     "config-ns-other": "Muu (määritä)",
-    "config-admin-name": "Nimesi",
+    "config-admin-name": "Käyttäjänimesi:",
     "config-admin-password": "Salasana",
     "config-admin-password-confirm": "Salasana uudelleen",
     "config-admin-name-blank": "Anna ylläpitäjän käyttäjänimi.",
     "config-help": "ohje",
     "mainpagetext": "'''MediaWiki on onnistuneesti asennettu.'''",
     "mainpagedocfooter": "Lisätietoja käytöstä on sivulla [//meta.wikimedia.org/wiki/Help:Contents User's Guide].\n\n=== Lisäohjeita ===\n\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Asetusten teko-ohjeita]\n* [//www.mediawiki.org/wiki/Manual:FAQ MediaWikin FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Sähköpostilista, jolla tiedotetaan MediaWikin uusista versioista]\n\n=== Asetukset ===\n\nTarkista, että alla olevat taivutusmuodot ovat oikein. Jos eivät, tee tarvittavat muutokset tiedostoon LocalSettings.php seuraavasti:\n $wgGrammarForms['fi']['genitive']['{{SITENAME}}'] = '...';\n $wgGrammarForms['fi']['partitive']['{{SITENAME}}'] = '...';\n $wgGrammarForms['fi']['elative']['{{SITENAME}}'] = '...';\n $wgGrammarForms['fi']['inessive']['{{SITENAME}}'] = '...';\n $wgGrammarForms['fi']['illative']['{{SITENAME}}'] = '...';\nTaivutusmuodot: {{GRAMMAR:genitive|{{SITENAME}}}} (yön) – {{GRAMMAR:partitive|{{SITENAME}}}} (yötä) – {{GRAMMAR:elative|{{SITENAME}}}} (yöstä) – {{GRAMMAR:inessive|{{SITENAME}}}} (yössä) – {{GRAMMAR:illative|{{SITENAME}}}} (yöhön)."
-}
\ No newline at end of file
+}
index 30aa2c6..b1cfaad 100644 (file)
@@ -1,6 +1,40 @@
 {
     "@metadata": {
-        "authors": []
+        "authors": [
+            "EileenSanda"
+        ]
     },
+    "config-desc": "Innstallasjónsforrit til MediaWiki",
+    "config-title": "Innstallering av MediaWiki $1",
+    "config-information": "Kunning",
+    "config-localsettings-upgrade": "Ein <code>LocalSettings.php</code> fíla er funnin.\nFyri at uppstiga hesa innstallasjón, vinarliga skriva hetta virði <code>$wgUpgradeKey</code> í teigin niðanfyri.\nTú finnur tað í <code>LocalSettings.php</code>.",
+    "config-localsettings-cli-upgrade": "Ein <code>LocalSettings.php</code> fíla er funnin.\nFyri at uppstiga hesa innstallasjónina, vinarliga koyr <code>update.php</code> ístaðin",
+    "config-localsettings-key": "Uppstiganarlykil:",
+    "config-localsettings-badkey": "Lykilin ið tú skrivaði er skeivur.",
+    "config-upgrade-key-missing": "Ein núverandi installasjón av MediaWiki er funnin.\nFyri at uppstiga hesa installasjónina, vinarliga set hesa linjuna niðast í tinari <code>LocalSettings.php</code>-fílu:\n\n$1",
+    "config-your-language": "Títt mál:",
+    "config-your-language-help": "Vel eitt mál, sum tú ynskir at nýta meðan tú installerar.",
+    "config-wiki-language": "Wikimál:",
+    "config-wiki-language-help": "Vel tað málið, ið wiki'in fyrst og fremst verður skrivað á.",
+    "config-back": "← Aftur",
+    "config-continue": "Halt fram →",
+    "config-page-language": "Mál",
+    "config-page-welcome": "Vælkomin til MediaWiki!",
+    "config-page-dbconnect": "Fá samband við dátugrunnin",
+    "config-page-upgrade": "Dagfør verandi installasjón",
+    "config-page-dbsettings": "Innstillingar fyri dátugrunnin",
+    "config-page-name": "Navn",
+    "config-page-options": "Møguleikar",
+    "config-page-install": "Innstallera",
+    "config-page-complete": "Liðugt!",
+    "config-page-restart": "Byrja umaftur at installera",
+    "config-page-readme": "Les meg",
+    "config-page-copying": "Avritan",
+    "config-page-upgradedoc": "Dagføring/uppgradering",
+    "config-page-existingwiki": "Verandi wiki",
+    "config-help-restart": "Ynskir tú at sletta øll goymd dáta sum tú hevur skrivað og byrja umaftur at installera?",
+    "config-restart": "Ja, byrja umaftur",
+    "config-env-php": "PHP $1 er innstallerað.",
+    "config-env-php-toolow": "PHP $1 er installerað.\nMen, MediaWiki krevur PHP $2 ella hægri.",
     "mainpagetext": "'''Innlegging av Wiki-ritbúnaði væleydnað.'''"
-}
\ No newline at end of file
+}
index 2c1793b..7b8910c 100644 (file)
@@ -17,7 +17,8 @@
             "Verdy p",
             "Wyz",
             "Yumeki",
-            "아라"
+            "아라",
+            "Maxim21"
         ]
     },
     "config-desc": "Le programme d’installation de MediaWiki",
     "config-localsettings-upgrade": "Un fichier <code>LocalSettings.php</code> a été détecté.\nPour mettre à jour cette installation, veuillez saisir la valeur de <code>$wgUpgradeKey</code> dans le champ ci-dessous.\nVous la trouverez dans <code>LocalSettings.php</code>.",
     "config-localsettings-cli-upgrade": "Un fichier <code>LocalSettings.php</code> a été détecté.\nPour mettre à niveau cette installation, veuillez exécuter <code>update.php</code>",
     "config-localsettings-key": "Clé de mise à jour :",
-    "config-localsettings-badkey": "La clé que vous avez fournie est incorrecte",
+    "config-localsettings-badkey": "La clé que vous avez fournie est incorrecte.",
     "config-upgrade-key-missing": "Une installation existante de MediaWiki a été détectée.\n\nPour mettre à jour cette installation, veuillez ajouter la ligne suivante à la fin de votre fichier <code>LocalSettings.php</code>\n\n$1",
     "config-localsettings-incomplete": "Le fichier <code>LocalSettings.php</code> existant semble être incomplet.\nLa variable $1 n’est pas définie.\nVeuillez modifier <code>LocalSettings.php</code> de sorte que cette variable soit définie, puis cliquer sur « {{int:Config-continue}} ».",
-    "config-localsettings-connection-error": "Une erreur est survenue lors de la connexion à la base de données en utilisant la configuration spécifiée dans <code>LocalSettings.php</code> ou <code>AdminSettings.php</code>. Veuillez corriger cette configuration puis réessayer.\n\n$1",
+    "config-localsettings-connection-error": "Une erreur est survenue lors de la connexion à la base de données en utilisant la configuration spécifiée dans <code>LocalSettings.php</code>. Veuillez corriger cette configuration puis réessayer.\n\n$1",
     "config-session-error": "Erreur lors du démarrage de la session : $1",
-    "config-session-expired": "Les données de votre session semblent avoir expiré.\nLes sessions sont configurées pour une durée de $1.\nVous pouvez l'augmenter en configurant <code>session.gc_maxlifetime</code> dans le fichier php.ini.\nRedémarrer le processus d'installation.",
+    "config-session-expired": "Les données de votre session semblent avoir expiré.\nLes sessions sont configurées pour une durée de $1.\nVous pouvez l'augmenter en configurant <code>session.gc_maxlifetime</code> dans le fichier php.ini.\nRedémarrer le processus d'installation.",
     "config-no-session": "Les données de votre session ont été perdues !\nVérifiez votre fichier php.ini et assurez-vous que <code>session.save_path</code> contient le chemin d’un répertoire approprié.",
     "config-your-language": "Votre langue :",
     "config-your-language-help": "Sélectionnez la langue à utiliser pendant le processus d'installation.",
@@ -41,7 +42,7 @@
     "config-continue": "Continuer →",
     "config-page-language": "Langue",
     "config-page-welcome": "Bienvenue sur MediaWiki !",
-    "config-page-dbconnect": "Se connecter à la base de données",
+    "config-page-dbconnect": "Connexion à la base de données",
     "config-page-upgrade": "Mettre à jour l’installation existante",
     "config-page-dbsettings": "Paramètres de la base de données",
     "config-page-name": "Nom",
     "config-help-restart": "Voulez-vous effacer toutes les données enregistrées que vous avez entrées et relancer le processus d'installation ?",
     "config-restart": "Oui, le relancer",
     "config-welcome": "=== Vérifications liées à l’environnement ===\nDes vérifications de base vont maintenant être effectuées pour voir si cet environnement est adapté à l’installation de MediaWiki.\nRappelez-vous d’inclure ces informations si vous recherchez de l’aide sur la manière de terminer l’installation.",
-    "config-copyright": "=== Droit d'auteur et conditions ===\n\n$1\n\nCe programme est un logiciel libre : vous pouvez le redistribuer et/ou le modifier selon les termes de la Licence Publique Générale GNU telle que publiée par la Free Software Foundation (version 2 de la Licence, ou, à votre choix, toute version ultérieure).\n\nCe programme est distribué dans l’espoir qu’il sera utile, mais '''sans aucune garantie''' : sans même les garanties implicites de '''commerciabilité''' ou d’'''adéquation à un usage particulier'''.\nVoir la Licence Publique Générale GNU pour plus de détails.\n\nVous devriez avoir reçu <doclink href=Copying>une copie de la Licence Publique Générale GNU</doclink> avec ce programme ; dans le cas contraire, écrivez à la Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. ou [http://www.gnu.org/copyleft/gpl.html lisez-le en ligne].",
+    "config-copyright": "=== Droit d'auteur et conditions ===\n\n$1\n\nCe programme est un logiciel libre : vous pouvez le redistribuer et/ou le modifier selon les termes de la Licence Publique Générale GNU telle que publiée par la Free Software Foundation (version 2 de la Licence, ou, à votre choix, toute version ultérieure).\n\nCe programme est distribué dans l’espoir qu’il sera utile, mais '''sans aucune garantie''' : sans même les garanties implicites de '''commerciabilité''' ou d’'''adéquation à un usage particulier'''.\nVoir la Licence Publique Générale GNU pour plus de détails.\n\nVous devriez avoir reçu <doclink href=Copying>une copie de la Licence Publique Générale GNU</doclink> avec ce programme ; dans le cas contraire, écrivez à la Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. ou [http://www.gnu.org/copyleft/gpl.html lisez-la en ligne].",
     "config-sidebar": "* [//www.mediawiki.org Accueil MediaWiki]\n* [//www.mediawiki.org/wiki/Help:Contents Guide de l’utilisateur]\n* [//www.mediawiki.org/wiki/Manual:Contents Guide de l’administrateur]\n* [//www.mediawiki.org/wiki/Manual:FAQ FAQ]\n----\n* <doclink href=Readme>Lisez-moi</doclink>\n* <doclink href=ReleaseNotes>Notes de publication</doclink>\n* <doclink href=Copying>Copie</doclink>\n* <doclink href=UpgradeDoc>Mise à jour</doclink>",
     "config-env-good": "L’environnement a été vérifié.\nVous pouvez installer MediaWiki.",
     "config-env-bad": "L’environnement a été vérifié.\nVous ne pouvez pas installer MediaWiki.",
     "config-env-php": "PHP $1 est installé.",
-    "config-env-php-toolow": "PHP $1 est installé.\nCependant, MediaWiki requiert PHP $2 ou plus haut.",
+    "config-env-php-toolow": "PHP $1 est installé.\nCependant, MediaWiki requiert PHP $2 ou supérieur.",
     "config-unicode-using-utf8": "Utilisation de utf8_normalize.so par Brion Vibber pour la normalisation Unicode.",
     "config-unicode-using-intl": "Utilisation de [http://pecl.php.net/intl l'extension PECL intl] pour la normalisation Unicode.",
-    "config-unicode-pure-php-warning": "'''Attention''': L'[http://pecl.php.net/intl extension PECL intl] n'est pas disponible pour la normalisation d’Unicode, retour à la version lente implémentée en PHP.\nSi votre site web sera très fréquenté, vous devriez lire ceci : [//www.mediawiki.org/wiki/Unicode_normalization_considerations ''Unicode normalization''] (en anglais).",
+    "config-unicode-pure-php-warning": "<strong>Attention</strong> : L'[http://pecl.php.net/intl extension PECL intl] n'est pas disponible pour la normalisation d’Unicode, retour à la version lente implémentée en PHP.\nSi votre site web sera très fréquenté, vous devriez lire ceci : [//www.mediawiki.org/wiki/Unicode_normalization_considerations ''Unicode normalization''] (en anglais).",
     "config-unicode-update-warning": "'''Attention''': La version installée du ''wrapper'' de normalisation Unicode utilise une vieille version de la [http://site.icu-project.org/ bibliothèque logicielle ''ICU Project''].\nVous devriez faire une [//www.mediawiki.org/wiki/Unicode_normalization_considerations mise à jour] (texte en anglais) si l'usage d'Unicode vous semble important.",
-    "config-no-db": "Impossible de trouver un pilote de base de données approprié ! Vous devez installer un pilote pour PHP. Ces types de bases de données sont reconnus : $1.\n\nSi vous êtes sur un site partagé, demandez à votre hébergeur d'installer un pilote de base de données approprié. Si vous avez compilé PHP, le configurer avec client de base de données activé, par exemple en insérant la directive <code>./configure --with-mysql</code>.\n\nSi vous avez installé PHP d'une distribution Debian ou Ubuntu, vous devez aussi installer le module <code>php5-mysql</code>.",
+    "config-no-db": "Impossible de trouver un pilote de base de données approprié ! Vous devez installer un pilote de base de données pour PHP. Les types de bases de données suivants sont reconnus : $1.\n\nSi vous avez compilé PHP vous-même, reconfigurez-le avec un client de base de données activé, par exemple en utilisant <code>./configure --with-mysqli</code>. Si vous avez installé PHP depuis un paquet Debian ou Ubuntu, alors vous devrez aussi installer, par exemple, le paquet <code>php5-mysql</code>.",
     "config-outdated-sqlite": "'''Attention''': vous avez SQLite $1, qui est inférieur à la version minimale requise $2. SQLite sera indisponible.",
     "config-no-fts3": "'''Attention :''' SQLite est compilé sans le module [//sqlite.org/fts3.html FTS3] ; les fonctions de recherche ne seront pas disponibles sur ce moteur.",
     "config-register-globals": "'''Attention : l'option <code>[http://php.net/register_globals register_globals]</code> de PHP est activée.'''\n'''Désactivez-la si vous le pouvez.'''\nMediaWiki fonctionnera, mais votre serveur sera exposé à de potentielles failles de sécurité.",
     "config-magic-quotes-runtime": "'''Erreur fatale : [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-runtime magic_quotes_runtime] est activé !'''\nCette option corrompt les données de manière imprévisible.\nVous ne pouvez pas installer ou utiliser MediaWiki tant que cette option est activée.",
     "config-magic-quotes-sybase": "'''Erreur fatale : [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-sybase magic_quotes_sybasee] est activé !'''\nCette option corrompt les données de manière imprévisible.\nVous ne pouvez pas installer ou utiliser MediaWiki tant que cette option est activée.",
     "config-mbstring": "'''Erreur fatale : [http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload] est activé !'''\nCette option provoque des erreurs et peut corrompre les données de manière imprévisible.\nVous ne pouvez pas installer ou utiliser MediaWiki tant que cette option est activée.",
-    "config-ze1": "'''Erreur fatale : [http://www.php.net/manual/en/ini.core.php zend.ze1_compatibility_mod] est activé !'''\nCette option provoque des bugs horribles avec MediaWiki.\nVous ne pouvez pas installer ou utiliser MediaWiki tant que cette option est activée.",
     "config-safe-mode": "'''Attention : le « [http://www.php.net/features.safe-mode safe mode] » est activé !'''\nCeci peut causer des problèmes, en particulier si vous utilisez le téléversement de fichiers et le support de <code>math</code>.",
     "config-xml-bad": "Le module XML de PHP est manquant.\nMediaWiki requiert des fonctions de ce module et ne fonctionnera pas avec cette configuration.\nSi vous êtes sous Mandrake, installez le paquet php-xml.",
-    "config-pcre": "Le module de support PCRE semble manquer.\nMediaWiki requiert les fonctions d’expressions rationnelles compatibles avec Perl.",
+    "config-pcre-old": "'''Fatal :''' PCRE $1 ou ultérieur est nécessaire.\nVotre binaire PHP est lié avec PCRE $2.\n[https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/Plus d’information sur PCRE].",
     "config-pcre-no-utf8": "'''Erreur fatale''': Le module PCRE de PHP semble être compilé sans le support PCRE_UTF8.\nMédiaWiki nécessite la gestion d’UTF-8 pour fonctionner correctement.",
     "config-memory-raised": "Le paramètre <code>memory_limit</code> de PHP était à $1, porté à $2.",
     "config-memory-bad": "'''Attention :''' Le paramètre <code>memory_limit</code> de PHP est à $1.\nCette valeur est probablement trop faible.\nIl est possible que l’installation échoue !",
     "config-gd": "La bibliothèque graphique GD intégrée a été trouvée.\nLa miniaturisation d'images sera activée si vous activez le téléversement de fichiers.",
     "config-no-scaling": "Impossible de trouver la bibliothèque GD ou ImageMagick.\nLa miniaturisation d'images sera désactivé.",
     "config-no-uri": "'''Erreur :''' Impossible de déterminer l'URI du script actuel.\nInstallation avortée.",
-    "config-no-cli-uri": "'''Attention''': Aucun --scriptpath n'a été spécifié; <code>$1</code> sera utilisé par défaut",
+    "config-no-cli-uri": "'''Attention''': Aucun <code>--scriptpath</code> n'a été spécifié; <code>$1</code> sera utilisé par défaut",
     "config-using-server": "Utilisation du nom de serveur \"<nowiki>$1</nowiki>\".",
     "config-using-uri": "Utilisation de l'URL de serveur \"<nowiki>$1$2</nowiki>\".",
     "config-uploads-not-safe": "'''Attention:''' Votre répertoire par défaut pour les téléchargements, <code>$1</code>, est vulnérable, car il peut exécuter n'importe quel script.\nBien que MediaWiki vérifie tous les fichiers téléchargés, il est fortement recommandé de [//www.mediawiki.org/wiki/Manual:Security#Upload_security fermer cette vulnérabilité de sécurité] (texte en anglais) avant d'activer les téléchargements.",
     "config-no-cli-uploads-check": "'''Attention:''' Votre répertoire par défaut pour les imports(<code>$1</code>) n'est pas contrôlé concernant la vulnérabilité d'exécution de scripts arbitraires lors de l'installation CLI.",
-    "config-brokenlibxml": "Votre système utilise une combinaison de versions de PHP et libxml2 qui est boguée et peut engendrer des corruptions cachées de données dans MediaWiki et d’autres applications web.\nVeuillez mettre à jour votre système vers PHP 5.2.9 ou plus récent et libxml2 2.7.3 ou plus récent ([//bugs.php.net/bug.php?id=45996 bogue déposé auprès de PHP]).\nInstallation interrompue.",
-    "config-using531": "MediaWiki ne peut pas être utilisé avec PHP $1 à cause d’un bogue affectant les paramètres passés par référence à <code>__call()</code>.\nVeuillez mettre à jour votre système vers PHP 5.3.2 ou plus récent ou revenir à PHP 5.3.0 pour résoudre ce problème.\nInstallation interrompue.",
+    "config-brokenlibxml": "Votre système utilise une combinaison de versions de PHP et libxml2 qui est boguée et peut engendrer des corruptions cachées de données dans MediaWiki et d’autres applications web.\nVeuillez mettre à jour votre système vers libxml2 2.7.3 ou plus récent ([https://bugs.php.net/bug.php?id=45996 bogue déposé auprès de PHP]).\nInstallation interrompue.",
     "config-suhosin-max-value-length": "Suhosin est installé et limite la <code>longueur</code> du paramètre GET à $1 octets.\nLe composant ResourceLoader de MediaWiki va répondre en respectant cette limite, mais ses performances seront dégradées. Si possible, vous devriez définir <code>suhosin.get.max_value_length</code> à 1024 ou plus dans le fichier <code>php.ini</code>, et fixer <code>$wgResourceLoaderMaxQueryLength</code> à la même valeur dans <code>LocalSettings.php</code>.",
     "config-db-type": "Type de base de données :",
     "config-db-host": "Nom d’hôte de la base de données :",
     "config-db-username": "Nom d’utilisateur de la base de données :",
     "config-db-password": "Mot de passe de la base de données :",
     "config-db-password-empty": "Veuillez entrer un mot de passe pour le nouvel compte de la base de données : $1.\nBien qu'il soit possible de créer un compte sans mot de passe, ce n'est pas recommandé pour des questions de sécurité.",
+    "config-db-username-empty": "Vous devez entrer une valeur pour « {{int:config-db-username}} ».",
     "config-db-install-username": "Entrez le nom d’utilisateur qui sera utilisé pour se connecter à la base de données pendant le processus d'installation. Il ne s’agit pas du nom d’utilisateur du compte MediaWiki, mais du nom d’utilisateur pour votre base de données.",
     "config-db-install-password": "Entrez le mot de passe qui sera utilisé pour se connecter à la base de données pendant le processus d'installation. Il ne s’agit pas du mot de passe du compte MediaWiki, mais du mot de passe pour votre base de données.",
     "config-db-install-help": "Entrez le nom d'utilisateur et le mot de passe qui seront utilisés pour se connecter à la base de données pendant le processus d'installation.",
     "config-charset-help": "'''Attention:''' Si vous utilisez ''backwards-compatible UTF-8'' sur MySQL 4.1+, et ensuite sauvegardez la base de données avec <code>mysqldump</code>, cela peut détruire tous les caractères non-ASCII, ce qui rend inutilisable vos copies de sauvegarde de façon irréversible !\n\nEn ''mode binaire'', MediaWiki stocke le texte UTF-8 dans des champs binaires de la base de données. C'est plus efficace que le ''mode UTF-8'' de MySQL, et vous permet d'utiliser toute la gamme des caractères Unicode.\nEn ''mode UTF-8'', MySQL connaîtra le jeu de caractères de vos données et pourra présenter et convertir les données de manière appropriée, mais il ne vous laissera pas stocker les caractères au-dessus du [//en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes plan multilingue de base] (en anglais).",
     "config-mysql-old": "MySQL $1 ou version ultérieure est requis, vous avez $2.",
     "config-db-port": "Port de la base de données :",
-    "config-db-schema": "Schéma pour MediaWiki",
+    "config-db-schema": "Schéma pour MediaWiki :",
     "config-db-schema-help": "Les schémas ci-dessus sont généralement corrects.\nNe les changez que si vous êtes sûr que c'est nécessaire.",
     "config-pg-test-error": "Impossible de se connecter à la base de données '''$1''' : $2",
     "config-sqlite-dir": "Dossier des données SQLite :",
     "config-sqlite-dir-help": "SQLite stocke toutes les données dans un fichier unique.\n\nLe répertoire que vous inscrivez doit être accessible en écriture par le serveur lors de l'installation.\n\nIl '''ne faut pas''' qu'il soit accessible via le web, c'est pourquoi il n'est pas à l'endroit où vos fichiers PHP sont.\n\nL'installateur écrira un fichier <code>.htaccess</code> en même temps, mais s'il y a échec, quelqu'un peut accéder à votre base de données.\nCela comprend les données des utilisateurs (adresses de courriel, mots de passe hachés) ainsi que des révisions supprimées et d'autres données confidentielles du wiki.\n\nEnvisagez de placer la base de données ailleurs, par exemple dans <code>/var/lib/mediawiki/yourwiki</code>.",
     "config-oracle-def-ts": "Espace de stockage (''tablespace'') par défaut :",
     "config-oracle-temp-ts": "Espace de stockage (''tablespace'') temporaire :",
-    "config-type-mysql": "MySQL",
+    "config-type-mysql": "MySQL (ou compatible)",
     "config-type-postgres": "PostgreSQL",
     "config-type-sqlite": "SQLite",
     "config-type-oracle": "Oracle",
+    "config-type-mssql": "Microsoft SQL Server",
     "config-support-info": "MediaWiki supporte ces systèmes de bases de données :\n\n$1\n\nSi vous ne voyez pas le système de base de données que vous essayez d'utiliser ci-dessous, alors suivez les instructions ci-dessus (voir liens) pour activer le support.",
-    "config-support-mysql": "* $1 est le premier choix pour MediaWiki et est mieux pris en charge ([http://www.php.net/manual/en/mysql.installation.php how to compile PHP with MySQL support])",
-    "config-support-postgres": "* $1 est un système de base de données populaire et ''open source'' qui peut être une alternative à MySQL ([http://www.php.net/manual/en/pgsql.installation.php how to compile PHP with PostgreSQL support]). Il peut contenir quelques bogues mineurs et n'est pas recommandé dans un environnement de production.",
-    "config-support-sqlite": "* $1 est un système de base de données léger qui est bien supporté. ([http://www.php.net/manual/en/pdo.installation.php How to compile PHP with SQLite support], utilise PDO)",
-    "config-support-oracle": "* $1 est un système commercial de gestion de base de données d’entreprise. ([http://www.php.net/manual/en/oci8.installation.php Comment compiler PHP avec le support OCI8])",
+    "config-dbsupport-mysql": "* [{{int:version-db-mysql-url}} MySQL] est le premier choix pour MediaWiki et est le mieux pris en charge. MediaWiki fonctionne aussi avec [{{int:version-db-mariadb-url}} MariaDB] et [{{int:version-db-percona-url}} Percona Server], qui sont compatibles avec MySQL. ([http://www.php.net/manual/en/mysqli.installation.php Comment compiler PHP avec le support MySQL])",
+    "config-dbsupport-postgres": "* [{{int:version-db-postgres-url}} PostgreSQL] est un système de base de données populaire et ''open source'' qui peut être une alternative à MySQL. Son support peut contenir quelques bogues mineurs et n'est pas recommandé dans un environnement de production.  ([http://www.php.net/manual/en/pgsql.installation.php Comment compiler PHP avec le support de PostgreSQL])",
+    "config-dbsupport-sqlite": "* [{{int:version-db-sqlite-url}} SQLite] est un système de base de données léger bien supporté. ([http://www.php.net/manual/en/pdo.installation.php Comment compiler PHP avec le support de SQLite], en utilisant PDO)",
+    "config-dbsupport-oracle": "* [{{int:version-db-oracle-url}} Oracle] est un système commercial de gestion de base de données d’entreprise. ([http://www.php.net/manual/en/oci8.installation.php Comment compiler PHP avec le support OCI8])",
+    "config-dbsupport-mssql": "* [{{int:version-db-mssql-url}} Microsoft SQL Server] est une base de données commerciale d’entreprise pour Windows. ([http://www.php.net/manual/en/sqlsrv.installation.php Comment compiler PHP avec le support de SQLSRV])",
     "config-header-mysql": "Paramètres de MySQL",
     "config-header-postgres": "Paramètres de PostgreSQL",
     "config-header-sqlite": "Paramètres de SQLite",
     "config-header-oracle": "Paramètres d’Oracle",
+    "config-header-mssql": "Paramètres de Microsoft SQL Server",
     "config-invalid-db-type": "Type de base de données non valide",
-    "config-missing-db-name": "Vous devez saisir une valeur pour « Nom de la base de données »",
-    "config-missing-db-host": "Vous devez entrer une valeur pour « l'hôte de la base de données »",
-    "config-missing-db-server-oracle": "Vous devez saisir une valeur pour le « Nom TNS de la base de données »",
+    "config-missing-db-name": "Vous devez entrer une valeur pour « {{int:config-db-name}} ».",
+    "config-missing-db-host": "Vous devez entrer une valeur pour « {{int:config-db-host}} ».",
+    "config-missing-db-server-oracle": "Vous devez entrer une valeur pour « {{int:config-db-host-oracle}} ».",
     "config-invalid-db-server-oracle": "Le nom TNS de la base de données (« $1 ») est invalide.\nUtilisez uniquement la chaîne \"TNS Name\" ou \"Easy Connect\" ([http://docs.oracle.com/cd/E11882_01/network.112/e10836/naming.htm Méthodes de nommage Oracle])",
     "config-invalid-db-name": "Nom de la base de données invalide (« $1 »).\nIl ne peut contenir que des lettres latines (a-z, A-Z), des chiffres (0-9), des caractères de soulignement (_) et des tirets (-).",
     "config-invalid-db-prefix": "Préfixe de la base de données non valide « $1 ».\nIl ne peut contenir que des lettres latines (a-z, A-Z), des chiffres (0-9), des caractères de soulignement (_) et des tirets (-).",
     "config-db-sys-create-oracle": "L'installateur ne reconnaît que les compte SYSDBA lors de la création d'un nouveau compte.",
     "config-db-sys-user-exists-oracle": "Le compte « $1 » existe déjà. Un SYSDBA peut seulement servir à créer un nouveau compte.",
     "config-postgres-old": "PostgreSQL $1 ou version ultérieure est requis, vous avez $2.",
+    "config-mssql-old": "Microsoft SQL Server version $1 ou supérieur est requis. Vous avez la version $2.",
     "config-sqlite-name-help": "Choisir un nom qui identifie votre wiki.\nNe pas utiliser des espaces ou des traits d'union.\nIl sera utilisé pour le fichier de données SQLite.",
     "config-sqlite-parent-unwritable-group": "Impossible de créer le répertoire de données <nowiki><code>$1</code></nowiki>, parce que le répertoire parent <nowiki><code>$2</code></nowiki> n'est pas accessible en écriture par le serveur Web.\n\nL'utilisateur du serveur web est connu.\nRendre le répertoire <nowiki><code>$3</code></nowiki> accessible en écriture pour continuer.\nSur un système UNIX/Linux, saisir :\n\n<pre>cd $2\nmkdir $3\nchgrp $4 $3\nchmod g+w $3</pre>",
     "config-sqlite-parent-unwritable-nogroup": "Impossible de créer le répertoire de données <nowiki><code>$1</code></nowiki>, parce que le répertoire parent <nowiki><code>$2</code></nowiki> n'est pas accessible en écriture par le serveur Web.\n\nL'utilisateur du serveur web est inconnu.\nRendre le répertoire <nowiki><code>$3</code></nowiki> globalement accessible en écriture pour continuer.\nSur un système UNIX/Linux, saisir :\n\n<pre>cd $2\nmkdir $3\nchmod a+w $3</pre>",
     "config-mysql-innodb": "InnoDB",
     "config-mysql-myisam": "MyISAM",
     "config-mysql-myisam-dep": "''' Avertissement ''': vous avez sélectionné MyISAM comme moteur de stockage pour MySQL, ce qui n'est pas recommandé pour une utilisation avec MediaWiki, parce que:\n * il supporte à peine la simultanéité en raison de verrouillage de table\n * il est plus sujet à la corruption que les autres moteurs\n * le codebase MediaWiki ne gère pas toujours MyISAM comme il se doit\nSi votre installation MySQL supporte InnoDB, il est fortement recommandé que vous le choisissez plutôt. Si votre installation MySQL ne supporte pas les tables InnoDB, il est peut-être temps de faire une mise à niveau.",
-    "config-mysql-only-myisam-dep": "'''Attention :''' MyISAM est le seul moteur de stockage disponible pour MySQL qui ne soit pas recommandé pour une utilsiation avec MédiaWiki, car :\n* il supporte très peu les accès concurrents à cause du verrouillage des tables\n* il est plus sujet à corruption que les autres moteurs\n* le code de base de MédiaWiki ne gère pas toujours MyISAM comme il faudrait\n\nVotre installation MySQL ne supporte pas InnoDB ; il est peut-être temps de la mettre à jour.",
+    "config-mysql-only-myisam-dep": "'''Attention :''' MyISAM est le seul moteur de stockage disponible pour MySQL sur cette machine, et cela n’est pas recommandé pour une utilisation avec MédiaWiki, car :\n* il supporte très peu les accès concurrents à cause du verrouillage des tables\n* il est plus sujet à corruption que les autres moteurs\n* le code de base de MédiaWiki ne gère pas toujours MyISAM comme il faudrait\n\nVotre installation MySQL ne supporte pas InnoDB ; il est peut-être temps de la mettre à jour.",
     "config-mysql-engine-help": "'''InnoDB''' est presque toujours la meilleure option, car il supporte bien l'[http://fr.wikipedia.org/wiki/Ordonnancement_dans_les_syst%C3%A8mes_d%27exploitation ordonnancement].\n\n'''MyISAM''' peut être plus rapide dans les installations monoposte ou en lecture seule. Les bases de données MyISAM ont tendance à se corrompre plus souvent que celles d'InnoDB.",
     "config-mysql-charset": "Jeu de caractères de la base de données :",
     "config-mysql-binary": "Binaire",
     "config-mysql-utf8": "UTF-8",
     "config-mysql-charset-help": "En ''mode binaire'', MediaWiki stocke le texte au format UTF-8 dans la base de données. C'est plus efficace que le ''UTF-8 mode'' de MySQL, et vous permet d'utiliser toute la gamme des caractères Unicode.\n\nEn ''mode binaire'', MediaWiki stocke le texte UTF-8 dans des champs binaires de la base de données. C'est plus efficace que le ''mode UTF-8'' de MySQL, et vous permet d'utiliser toute la gamme des caractères Unicode.\nEn ''mode UTF-8'', MySQL connaîtra le jeu de caractères de vos données et pourra présenter et convertir les données de manière appropriée, mais il ne vous laissera pas stocker les caractères au-dessus du [//en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes plan multilingue de base] (en anglais).",
+    "config-mssql-auth": "Type d’authentification :",
+    "config-mssql-install-auth": "Sélectionner le type d’authentification qui sera utilisé pour se connecter à la base de données pendant le processus d’installation.\nSi vous sélectionnez « {{int:config-mssql-windowsauth}} », les informations d’identification de l’utilisateur faisant tourner le serveur seront utilisées.",
+    "config-mssql-web-auth": "Sélectionner le type d’authentification que le serveur web utilisera pour se connecter au serveur de base de données lors des opérations habituelles du wiki.\nSi vous sélectionnez « {{int:config-mssql-windowsauth}} », les informations d’identification de l’utilisateur sous lequel tourne le serveur web seront utilisées.",
+    "config-mssql-sqlauth": "Authentification de SQL Server",
+    "config-mssql-windowsauth": "Authentification Windows",
     "config-site-name": "Nom du wiki :",
     "config-site-name-help": "Il apparaîtra dans la barre de titre du navigateur et en divers autres endroits.",
     "config-site-name-blank": "Entrez un nom de site.",
     "config-ns-invalid": "L'espace de noms spécifié « <nowiki>$1</nowiki> » n'est pas valide.\nSpécifiez un espace de noms pour le projet.",
     "config-ns-conflict": "L'espace de noms spécifié « <nowiki>$1</nowiki> » est en conflit avec un espace de noms par défaut de MediaWiki.\nChoisir un autre espace de noms.",
     "config-admin-box": "Compte administrateur",
-    "config-admin-name": "Votre nom :",
+    "config-admin-name": "Votre nom d’utilisateur :",
     "config-admin-password": "Mot de passe :",
     "config-admin-password-confirm": "Saisir à nouveau le mot de passe :",
     "config-admin-help": "Entrez votre nom d'utilisateur préféré ici, par exemple « Jean Blogue ».\nC'est le nom que vous utiliserez pour vous connecter au wiki.",
     "config-admin-name-blank": "Entrez un nom d'administrateur.",
     "config-admin-name-invalid": "Le nom d'utilisateur spécifié « <nowiki>$1</nowiki> » n'est pas valide.\nIndiquez un nom d'utilisateur différent.",
     "config-admin-password-blank": "Entrez un mot de passe pour le compte administrateur.",
-    "config-admin-password-same": "Le mot de passe doit être différent du nom d'utilisateur.",
     "config-admin-password-mismatch": "Les deux mots de passe que vous avez saisis ne correspondent pas.",
     "config-admin-email": "Adresse de courriel :",
     "config-admin-email-help": "Entrez une adresse de courriel ici pour vous permettre de recevoir des courriels d'autres utilisateurs du wiki, réinitialiser votre mot de passe, et être informé des modifications apportées aux pages de votre liste de suivi. Vous pouvez laisser ce champ vide.",
     "config-install-subscribe-notpossible": "cURL n’est pas installé et allow_url_fopen n’est pas disponible.",
     "config-install-mainpage": "Création de la page principale avec un contenu par défaut",
     "config-install-extension-tables": "Création de tables pour les extensions activées",
-    "config-install-mainpage-failed": "Impossible d’insérer la page principale: $1",
+    "config-install-mainpage-failed": "Impossible d’insérer la page principale : $1",
     "config-install-done": "'''Félicitations!'''\nVous avez réussi à installer MediaWiki.\n\nLe programme d'installation a généré <code>LocalSettings.php</code>, un fichier qui contient tous les paramètres de configuration.\n\nSi le téléchargement n'a pas été offert, ou que vous l'avez annulé, vous pouvez démarrer à nouveau le téléchargement en cliquant ce lien :\n\n$3\n\n'''Note''': Si vous ne le faites pas maintenant, ce fichier de configuration généré ne sera pas disponible plus tard si vous quittez l'installation sans le télécharger.\n\nLorsque c'est fait, vous pouvez '''[$2 accéder à votre wiki]'''.",
     "config-download-localsettings": "Télécharger <code>LocalSettings.php</code>",
     "config-help": "aide",
     "config-nofile": "Le fichier « $1 » est introuvable. A-t-il été supprimé ?",
     "config-extension-link": "Saviez-vous que votre wiki supporte [//www.mediawiki.org/wiki/Manual:Extensions des extensions] ?\n\nVous pouvez consulter les [//www.mediawiki.org/wiki/Category:Extensions_by_category extensions par catégorie] ou la [//www.mediawiki.org/wiki/Extension_Matrix Matrice des extensions] pourvoir la liste complète des extensions.",
-    "mainpagetext": "'''MediaWiki a été installé avec succès.'''",
+    "mainpagetext": "<strong>MediaWiki a été installé avec succès.</strong>",
     "mainpagedocfooter": "Consultez le [//meta.wikimedia.org/wiki/Aide:Contenu Guide de l’utilisateur] pour plus d’informations sur l’utilisation de ce logiciel de wiki.\n\n== Pour démarrer ==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Liste des paramètres de configuration]\n* [//www.mediawiki.org/wiki/Manual:FAQ/fr FAQ sur MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Liste de discussion sur les distributions de MediaWiki]\n* [//www.mediawiki.org/wiki/Localisation#Translation_resources Adaptez MediaWiki dans votre langue]"
-}
\ No newline at end of file
+}
index c80bb4b..96dd622 100644 (file)
@@ -1,7 +1,5 @@
 {
-    "@metadata": {
-        "authors": []
-    },
+    "@metadata": [],
     "mainpagetext": "'''Vous avez bien installé MediaWiki.'''",
     "mainpagedocfooter": "Lisez la [//meta.wikimedia.org/wiki/Help:Contents Guide des Useurs] pour apprendre à user le wiki software.\n\n== Pour Commencer ==\n\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Réglage]\n* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki: Questions Souvent Posées]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki Liste à Malle]"
-}
\ No newline at end of file
+}
index 48b014e..19781aa 100644 (file)
     "config-help": "éde",
     "mainpagetext": "'''MediaWiki at étâ enstalâ avouéc reusséta.'''",
     "mainpagedocfooter": "Vêde lo [//meta.wikimedia.org/wiki/Aide:Contenu guido d’usanciér] por més d’enformacions sur l’usâjo de la programeria vouiqui.\n\n== Emmodar avouéc MediaWiki ==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Lista des paramètres de configuracion]\n* [//www.mediawiki.org/wiki/Manual:FAQ/fr FDQ sur MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lista de discussion sur les distribucions de MediaWiki]"
-}
\ No newline at end of file
+}
index 88ccbcd..cb71bdf 100644 (file)
@@ -5,6 +5,6 @@
             "Pyt"
         ]
     },
-    "mainpagetext": "'''MediaWiki wörd ma erfolch instaliird.'''",
+    "mainpagetext": "'''Det instaliarin faan MediaWiki hää loket.'''",
     "mainpagedocfooter": "Consult the [//meta.wikimedia.org/wiki/Help:Contents User's Guide] for information on using the wiki software.\n\n== Getting started ==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Configuration settings list]\n* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]\n* [//www.mediawiki.org/wiki/Localisation#Translation_resources Localise MediaWiki for your language]"
-}
\ No newline at end of file
+}
index 79cd43c..83239e7 100644 (file)
@@ -1,6 +1,15 @@
 {
     "@metadata": {
-        "authors": []
+        "authors": [
+            "Tocaibon"
+        ]
     },
+    "config-desc": "Program di instalazion di Mediawiki",
+    "config-title": "Instalazion MediaWiki $1",
+    "config-information": "Informazions",
+    "config-localsettings-upgrade": "Al è stât cjatât un file <code>LocalSettings.php</code>.\nPar inzornâ cheste instalazion, si à di inserî il valôr di <code>$wgUpgradeKey</code> inte casele sot.\nIl valôr lu si cjate in <code>LocalSettings.php</code>.",
+    "config-localsettings-cli-upgrade": "Al è stât cjatât un file <code>LocalSettings.php</code>.\nPar inzornâ cheste instalazion, si à di eseguî  <code>update.php</code>.",
+    "config-localsettings-key": "Clâf di inzornament.",
+    "config-localsettings-badkey": "La Clâf metude no jê juste",
     "mainpagetext": "'''MediaWiki e je stade instalade cun sucès.'''"
-}
\ No newline at end of file
+}
index 34734c1..55ee746 100644 (file)
@@ -1,7 +1,5 @@
 {
-    "@metadata": {
-        "authors": []
-    },
+    "@metadata": [],
     "mainpagetext": "'''MediaWiki-program goed ynstallearre.'''",
     "mainpagedocfooter": "Rieplachtsje de [//meta.wikimedia.org/wiki/Help:Ynhâldsopjefte hantlieding] foar ynformaasje oer it gebrûk fan 'e wikisoftware.\n\n== Mear help oer Mediawiki ==\n\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings List mei ynstellings]\n* [//www.mediawiki.org/wiki/Manual:FAQ Faak stelde fragen (FAQ)]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Mailinglist foar oankundigings fan nije ferzjes]"
-}
\ No newline at end of file
+}
index 51f931a..0e99ff1 100644 (file)
@@ -10,4 +10,4 @@
     "config-help": "Cuidiú",
     "mainpagetext": "'''D'éirigh le suiteáil MediaWiki.'''",
     "mainpagedocfooter": "Féach ar [//meta.wikimedia.org/wiki/MediaWiki_localisation doiciméid um conas an chomhéadán a athrú]\nagus an [//meta.wikimedia.org/wiki/MediaWiki_User%27s_Guide Lámhleabhar úsáideora] chun cabhair úsáide agus fíoraíochta a fháil."
-}
\ No newline at end of file
+}
index 9967905..c1c0e33 100644 (file)
@@ -1,7 +1,5 @@
 {
-    "@metadata": {
-        "authors": []
-    },
+    "@metadata": [],
     "mainpagetext": "'''MediaWiki başarılan kuruldu.'''",
     "mainpagedocfooter": "Vikilän iş uurunda bilgi almaa için [//meta.wikimedia.org/wiki/Help:Contents User's Guide] sayfasına bakınız\n\n== Eni başlayanlar için ==\n\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Configuration settings list]\n* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]"
-}
\ No newline at end of file
+}
index 25e89ea..713e742 100644 (file)
@@ -1,7 +1,5 @@
 {
-    "@metadata": {
-        "authors": []
-    },
+    "@metadata": [],
     "mainpagetext": "'''安装正MediaWiki喽。'''",
     "mainpagedocfooter": "参看[//meta.wikimedia.org/wiki/Help:Contents 用户指南]里头会话到啷用wiki软件\n\n== 开始使用 ==\n\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings MediaWiki 配置设定列表]\n* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki 平常问题解答]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki 发布email清单]"
-}
\ No newline at end of file
+}
index 2924deb..5dc970a 100644 (file)
@@ -6,4 +6,4 @@
     },
     "mainpagetext": "'''安裝正MediaWiki哩。'''",
     "mainpagedocfooter": "參看[//meta.wikimedia.org/wiki/Help:Contents 用戶指南]裡頭會話到啷用wiki軟件\n\n== 開始使用 ==\n\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings MediaWiki 配置設定列表]\n* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki 平常問題解答]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki 發佈email清單]"
-}
\ No newline at end of file
+}
index 0fbe2fe..ec6ba29 100644 (file)
@@ -6,4 +6,4 @@
     },
     "mainpagetext": "'''Chaidh MediaWiki a stàladh gu soirbheachail.'''",
     "mainpagedocfooter": "Cuir sùil air [//meta.wikimedia.org/wiki/Help:Contents treòir nan cleachdaichean] airson fiosrachadh mu chleachdadh a' bhathar-bhog wiki.\n\n== Toiseach tòiseachaidh ==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Liosta suidheachadh nan roghainnean]\n* [//www.mediawiki.org/wiki/Manual:FAQ CÀBHA MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Liosta puist nan sgaoilidhean MediaWiki]\n* [//www.mediawiki.org/wiki/Localisation#Translation_resources Cuir do chànan air MediaWiki]"
-}
\ No newline at end of file
+}
index fe51f70..1c98939 100644 (file)
@@ -3,7 +3,8 @@
         "authors": [
             "Elisardojm",
             "Toliño",
-            "아라"
+            "아라",
+            "Vivaelcelta"
         ]
     },
     "config-desc": "O programa de instalación de MediaWiki",
@@ -15,7 +16,7 @@
     "config-localsettings-badkey": "A clave dada é incorrecta",
     "config-upgrade-key-missing": "Detectouse unha instalación existente de MediaWiki.\nPara actualizar esta instalación, inclúa esta liña ao final do ficheiro <code>LocalSettings.php</code>:\n\n$1",
     "config-localsettings-incomplete": "Semella que o ficheiro <code>LocalSettings.php</code> existente está incompleto.\nA variable $1 non está establecida.\nModifique o ficheiro <code>LocalSettings.php</code> de xeito que a variable quede establecida e prema en \"{{int:Config-continue}}\".",
-    "config-localsettings-connection-error": "Atopouse un erro ao conectar coa base de datos empregando a configuración especificada no ficheiro <code>LocalSettings.php</code> ou no ficheiro <code>AdminSettings.php</code>. Corrixa esta configuración e inténteo de novo.\n\n$1",
+    "config-localsettings-connection-error": "Atopouse un erro ao conectar coa base de datos empregando a configuración especificada no ficheiro <code>LocalSettings.php</code>. Corrixa esta configuración e inténteo de novo.\n\n$1",
     "config-session-error": "Erro ao iniciar a sesión: $1",
     "config-session-expired": "Semella que os seus datos da sesión caducaron.\nAs sesións están configuradas para unha duración de $1.\nPode incrementar isto fixando <code>session.gc_maxlifetime</code> en php.ini.\nReinicie o proceso de instalación.",
     "config-no-session": "Perdéronse os datos da súa sesión!\nComprobe o seu php.ini e asegúrese de que en <code>session.save_path</code> está definido un directorio correcto.",
     "config-unicode-using-intl": "Usando a [http://pecl.php.net/intl extensión intl PECL] para a normalización Unicode.",
     "config-unicode-pure-php-warning": "'''Atención:''' A [http://pecl.php.net/intl extensión intl PECL] non está dispoñible para manexar a normalización Unicode; volvendo á implementación lenta de PHP puro.\nSe o seu sitio posúe un alto tráfico de visitantes, debería ler un chisco sobre a [//www.mediawiki.org/wiki/Unicode_normalization_considerations normalización Unicode].",
     "config-unicode-update-warning": "'''Atención:''' A versión instalada da envoltura de normalización Unicode emprega unha versión vella da biblioteca [http://site.icu-project.org/ do proxecto ICU].\nDebería [//www.mediawiki.org/wiki/Unicode_normalization_considerations actualizar] se o uso de Unicode é importante para vostede.",
-    "config-no-db": "Non se puido atopar un controlador axeitado para a base de datos! Necesita instalar un controlador de base de datos para PHP.\nOs tipos de base de datos admitidos son os seguintes: $1.\n\nSe está nun aloxamento compartido, pregunte ao seu provedor de hospedaxe para instalar un controlador de base de datos axeitado.\nSe compilou o PHP vostede mesmo, reconfigúreo activando un cliente de base de datos, por exemplo, usando <code>./configure --with-mysql</code>.\nSe instalou o PHP desde un paquete Debian ou Ubuntu, entón tamén necesita instalar o módulo php5-mysql.",
+    "config-no-db": "Non se puido atopar un controlador axeitado para a base de datos! Necesita instalar un controlador de base de datos para PHP.\nOs tipos de base de datos admitidos son os seguintes: $1.\n\nSe compilou o PHP vostede mesmo, reconfigúreo activando un cliente de base de datos, por exemplo, usando <code>./configure --with-mysql</code>.\nSe instalou o PHP desde un paquete Debian ou Ubuntu, entón tamén necesita instalar, por exemplo, o módulo <code>php5-mysql</code>.",
     "config-outdated-sqlite": "'''Atención:''' Ten o SQLite $1, que é inferior á versión mínima necesaria: $2. O SQLite non estará dispoñible.",
     "config-no-fts3": "'''Atención:''' O SQLite está compilado sen o [//sqlite.org/fts3.html módulo FTS3]; as características de procura non estarán dispoñibles nesta instalación.",
     "config-register-globals": "'''Atención: A opción PHP <code>[http://php.net/register_globals register_globals]</code> está activada.'''\n'''Desactívea se pode.'''\nMediaWiki funcionará, pero o seu servidor está exposto a potenciais vulnerabilidades de seguridade.",
     "config-magic-quotes-runtime": "'''Erro fatal: [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-runtime magic_quotes_runtime] está activado!'''\nEsta opción corrompe os datos de entrada de xeito imprevisible.\nNon pode instalar ou empregar MediaWiki a menos que esta opción estea desactivada.",
     "config-magic-quotes-sybase": "'''Erro fatal: [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-sybase magic_quotes_sybase] está activado!'''\nEsta opción corrompe os datos de entrada de xeito imprevisible.\nNon pode instalar ou empregar MediaWiki a menos que esta opción estea desactivada.",
     "config-mbstring": "'''Erro fatal: [http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload] está activado!'''\nEsta opción causa erros e pode corromper os datos de xeito imprevisible.\nNon pode instalar ou empregar MediaWiki a menos que esta opción estea desactivada.",
-    "config-ze1": "'''Erro fatal: [http://www.php.net/manual/en/ini.core.php zend.ze1_compatibility_mode] está activado!'''\nEsta opción causa erros horribles en MediaWiki.\nNon pode instalar ou empregar MediaWiki a menos que esta opción estea desactivada.",
     "config-safe-mode": "'''Atención:''' O [http://www.php.net/features.safe-mode safe mode] do PHP está activado.\nIsto pode causar problemas, particularmente se emprega cargas de ficheiros e soporte de <code>math</code>.",
     "config-xml-bad": "Falta o módulo XML do PHP.\nMediaWiki necesita funcións neste módulo e non funcionará con esta configuración.\nSe está executando o Mandrake, instale o paquete php-xml.",
-    "config-pcre": "Semella que falta o módulo de soporte PCRE.\nMediaWiki necesita que funcionen as expresións regulares compatibles co Perl.",
+    "config-pcre-old": "<strong>Erro fatal:</strong> Necesítase PCRE $1 ou posterior.\nO seu PHP binario está ligado con PCRE $2.\n[https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/PCRE Máis información].",
     "config-pcre-no-utf8": "'''Erro fatal:''' Semella que o módulo PCRE do PHP foi compilado sen o soporte PCRE_UTF8.\nMediaWiki necesita soporte UTF-8 para funcionar correctamente.",
     "config-memory-raised": "O parámetro <code>memory_limit</code> do PHP é $1. Aumentado a $2.",
     "config-memory-bad": "'''Atención:''' O parámetro <code>memory_limit</code> do PHP é $1.\nProbablemente é un valor baixo de máis.\nA instalación pode fallar!",
     "config-gd": "Atopouse a biblioteca gráfica GD integrada.\nAs miniaturas de imaxes estarán dispoñibles se activa as cargas.",
     "config-no-scaling": "Non se puido atopar a biblioteca GD ou ImageMagick.\nAs miniaturas de imaxes estarán desactivadas.",
     "config-no-uri": "'''Erro:''' Non se puido determinar o URI actual.\nInstalación abortada.",
-    "config-no-cli-uri": "'''Aviso:''' Non se especificou ningún --scriptpath; por defecto, usarase: <code>$1</code>.",
+    "config-no-cli-uri": "'''Aviso:''' Non se especificou ningún <code>--scriptpath</code>; por defecto, usarase: <code>$1</code>.",
     "config-using-server": "Usando o nome do servidor \"<nowiki>$1</nowiki>\".",
     "config-using-uri": "Usando o URL do servidor \"<nowiki>$1$2</nowiki>\".",
     "config-uploads-not-safe": "'''Atención:''' O seu directorio por defecto para as cargas, <code>$1</code>, é vulnerable a execucións arbitrarias de escrituras.\nAínda que MediaWiki comproba todos os ficheiros cargados por se houbese ameazas de seguridade, é amplamente recomendable [//www.mediawiki.org/wiki/Manual:Security#Upload_security pechar esta vulnerabilidade de seguridade] antes de activar as cargas.",
     "config-no-cli-uploads-check": "'''Atención:''' Durante a instalación CLI, o seu directorio por defecto para as cargas, <code>$1</code>, non se comproba fronte a posibles vulnerabilidades de execucións arbitrarias de escrituras.",
-    "config-brokenlibxml": "O seu sistema ten unha combinación de versións de PHP e libxml2 que pode ser problemático e causar corrupción de datos en MediaWiki e outras aplicacións web.\nActualice o sistema á versión 5.2.9 ou posterior do PHP e á 2.7.3 ou posterior de libxml2 ([//bugs.php.net/bug.php?id=45996 erro presentado co PHP]).\nInstalación abortada.",
-    "config-using531": "O PHP $1 non é compatible con MediaWiki debido a un erro que afecta aos parámetros de referencia de <code>__call()</code>.\nActualice o sistema á versión 5.3.2 ou posterior do PHP ou volva á versión 5.3.0 do PHP para arranxar o problema.\nInstalación abortada.",
+    "config-brokenlibxml": "O seu sistema ten unha combinación de versións de PHP e libxml2 que pode ser problemático e causar corrupción de datos en MediaWiki e outras aplicacións web.\nActualice o sistema á versión 2.7.3 ou posterior de libxml2 ([https://bugs.php.net/bug.php?id=45996 erro presentado co PHP]).\nInstalación abortada.",
     "config-suhosin-max-value-length": "Suhosin está instalado e limita o parámetro GET <code>length</code> a $1 bytes.\nO compoñente ResourceLoader (xestor de recursos) de MediaWiki traballa neste límite, pero este prexudica o rendemento.\nSe é posible, debería establecer <code>suhosin.get.max_value_length</code> no valor 1024 ou superior en <code>php.ini</code> e establecer <code>$wgResourceLoaderMaxQueryLength</code> no mesmo valor en <code>LocalSettings.php</code>.",
     "config-db-type": "Tipo de base de datos:",
     "config-db-host": "Servidor da base de datos:",
     "config-db-username": "Nome de usuario da base de datos:",
     "config-db-password": "Contrasinal da base de datos:",
     "config-db-password-empty": "Introduza un contrasinal para o novo usuario da base de datos: $1.\nMalia que é posible crear usuarios sen contrasinal, esta práctica non é segura.",
+    "config-db-username-empty": "Debe escribir un valor \"Nome de usuario da base de datos\"",
     "config-db-install-username": "Escriba o nome de usuario que empregará para conectarse á base de datos durante o proceso de instalación. Este non é o nome de usuario da conta de MediaWiki, trátase do nome de usuario para a súa base de datos.",
     "config-db-install-password": "Escriba o contrasinal que empregará para conectarse á base de datos durante o proceso de instalación. Este non é o contrasinal da conta de MediaWiki, trátase do contrasinal para a súa base de datos.",
     "config-db-install-help": "Introduza o nome de usuario e contrasinal que se usará para conectar á base de datos durante o proceso de instalación.",
     "config-charset-mysql5": "MySQL 4.1/5.0 UTF-8",
     "config-charset-mysql4": "MySQL 4.0 retrocompatible UTF-8",
     "config-charset-help": "'''Atención:''' Se emprega '''backwards-compatible UTF-8''' no MySQL 4.1+ e posteriormente realiza unha copia de seguridade da base de datos con <code>mysqldump</code>, pode destruír todos os caracteres que non sexan ASCII, corrompendo de xeito irreversible as súas copias!\n\nNo '''modo binario''', MediaWiki almacena texto UTF-8 na base de datos en campos binarios.\nIsto é máis eficaz ca o modo UTF-8 de MySQL e permítelle usar o rango completo de caracteres Unicode.\nNo '''modo UTF-8''', MySQL saberá o xogo de caracteres dos seus datos e pode presentar e converter os datos de maneira axeitada,\npero non lle deixará gardar caracteres por riba do [//en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes plan multilingüe básico].",
-    "config-mysql-old": "Necesítase MySQL $1 ou posterior; ten a versión $2.",
+    "config-mysql-old": "Necesítase MySQL $1 ou posterior. Vostede ten a versión $2.",
     "config-db-port": "Porto da base de datos:",
     "config-db-schema": "Esquema para MediaWiki",
     "config-db-schema-help": "O normal é que este esquema sexa correcto.\nCámbieo soamente se sabe que é necesario.",
     "config-sqlite-dir-help": "SQLite recolle todos os datos nun ficheiro único.\n\nO servidor web debe ter permisos sobre o directorio para que poida escribir nel durante a instalación.\n\nAdemais, o servidor '''non''' debe ser accesible a través da web, motivo polo que non está no mesmo lugar ca os ficheiros PHP.\n\nAsemade, o programa de instalación escribirá un ficheiro <code>.htaccess</code>, pero se erra alguén pode obter acceso á súa base de datos.\nIsto inclúe datos de usuario (enderezos de correo electrónico, contrasinais codificados), así como revisións borradas e outros datos restrinxidos no wiki.\n\nConsidere poñer a base de datos nun só lugar, por exemplo en <code>/var/lib/mediawiki/oseuwiki</code>.",
     "config-oracle-def-ts": "Espazo de táboas por defecto:",
     "config-oracle-temp-ts": "Espazo de táboas temporal:",
-    "config-type-mysql": "MySQL",
+    "config-type-mysql": "MySQL (ou compatible)",
     "config-type-postgres": "PostgreSQL",
     "config-type-sqlite": "SQLite",
     "config-type-oracle": "Oracle",
+    "config-type-mssql": "Microsoft SQL Server",
     "config-support-info": "MediaWiki soporta os seguintes sistemas de bases de datos:\n\n$1\n\nSe non ve listado a continuación o sistema de base de datos que intenta usar, siga as instrucións ligadas enriba para activar o soporte.",
-    "config-support-mysql": "* $1 é o obxectivo principal para MediaWiki e está mellor soportado ([http://www.php.net/manual/en/mysql.installation.php como compilar o PHP con soporte MySQL])",
-    "config-support-postgres": "* $1 é un sistema de base de datos popular e de código aberto como alternativa a MySQL ([http://www.php.net/manual/en/pgsql.installation.php como compilar o PHP con soporte PostgreSQL]). É posible que haxa algúns pequenos erros e non se recomenda o seu uso nunha contorna de produción.",
-    "config-support-sqlite": "* $1 é un sistema de base de datos lixeiro moi ben soportado. ([http://www.php.net/manual/en/pdo.installation.php Como compilar o PHP con soporte SQLite], emprega PDO)",
-    "config-support-oracle": "* $1 é un sistema comercial de xestión de base de datos de empresa. ([http://www.php.net/manual/en/oci8.installation.php Como compilar o PHP con soporte OCI8])",
+    "config-dbsupport-mysql": "* [{{int:version-db-mysql-url}} MySQL] é o obxectivo principal para MediaWiki e está mellor soportado. MediaWiki tamén funciona con [{{int:version-db-mariadb-url}} MariaDB] e [{{int:version-db-percona-url}} Percona Server], que son compatibles con MySQL. ([http://www.php.net/manual/en/mysqli.installation.php  Como compilar PHP con compatibilidade MySQL])",
+    "config-dbsupport-postgres": "* [{{int:version-db-postgres-url}} PostgreSQL] é un sistema de base de datos popular e de código aberto como alternativa a MySQL. É posible que haxa algúns pequenos erros e non se recomenda o seu uso nunha contorna de produción. ([http://www.php.net/manual/en/pgsql.installation.php Como compilar PHP con compatibilidade PostgreSQL])",
+    "config-dbsupport-sqlite": "* [{{int:version-db-sqlite-url}} SQLite] é un sistema de base de datos lixeiro moi ben soportado. ([http://www.php.net/manual/en/pdo.installation.php Como compilar o PHP con soporte SQLite], emprega PDO)",
+    "config-dbsupport-oracle": "* [{{int:version-db-oracle-url}} Oracle] é un sistema comercial de xestión de base de datos de nivel empresarial. ([http://www.php.net/manual/en/oci8.installation.php Como compilar o PHP con compatibilidade OCI8])",
+    "config-dbsupport-mssql": "* [{{int:version-db-mssql-url}} Microsoft SQL Server] é un sistema comercial de xestión de base de datos de nivel empresarial para Windows. ([http://www.php.net/manual/en/sqlsrv.installation.php Como compilar o PHP con compatibilidade SQLSRV])",
     "config-header-mysql": "Configuración do MySQL",
     "config-header-postgres": "Configuración do PostgreSQL",
     "config-header-sqlite": "Configuración do SQLite",
     "config-header-oracle": "Configuración do Oracle",
+    "config-header-mssql": "Configuración de Microsoft SQL Server",
     "config-invalid-db-type": "Tipo de base de datos incorrecto",
     "config-missing-db-name": "Debe escribir un valor \"Nome da base de datos\"",
     "config-missing-db-host": "Debe escribir un valor \"Servidor da base de datos\"",
     "config-invalid-schema": "O esquema de MediaWiki, \"$1\", é incorrecto.\nSó pode conter letras ASCII (a-z, A-Z), números (0-9) e guións baixos (_).",
     "config-db-sys-create-oracle": "O programa de instalación soamente soporta o emprego de contas SYSDBA como método para crear unha nova conta.",
     "config-db-sys-user-exists-oracle": "A conta de usuario \"$1\" xa existe. SYSDBA soamente se pode empregar para a creación dunha nova conta!",
-    "config-postgres-old": "Necesítase PostgreSQL $1 ou posterior; ten a versión $2.",
+    "config-postgres-old": "Necesítase PostgreSQL $1 ou posterior. Vostede ten a versión $2.",
+    "config-mssql-old": "Necesítase Microsoft SQL Server $1 ou posterior. Vostede ten a versión $2.",
     "config-sqlite-name-help": "Escolla un nome que identifique o seu wiki.\nNon utilice espazos ou guións.\nEste nome será utilizado para o ficheiro de datos SQLite.",
     "config-sqlite-parent-unwritable-group": "Non se puido crear o directorio de datos <code><nowiki>$1</nowiki></code>, porque o servidor web non pode escribir no directorio pai <code><nowiki>$2</nowiki></code>.\n\nO programa de instalación determinou o usuario que executa o seu servidor web.\nPara continuar, faga que se poida escribir no directorio <code><nowiki>$3</nowiki></code>.\nNun sistema Unix/Linux cómpre realizar:\n\n<pre>cd $2\nmkdir $3\nchgrp $4 $3\nchmod g+w $3</pre>",
     "config-sqlite-parent-unwritable-nogroup": "Non se puido crear o directorio de datos <code><nowiki>$1</nowiki></code>, porque o servidor web non pode escribir no directorio pai <code><nowiki>$2</nowiki></code>.\n\nO programa de instalación non puido determinar o usuario que executa o seu servidor web.\nPara continuar, faga que se poida escribir globalmente no directorio <code><nowiki>$3</nowiki></code>.\nNun sistema Unix/Linux cómpre realizar:\n\n<pre>cd $2\nmkdir $3\nchmod a+w $3</pre>",
     "config-mysql-innodb": "InnoDB",
     "config-mysql-myisam": "MyISAM",
     "config-mysql-myisam-dep": "'''Atención:''' Seleccionou MyISAM como o motor de almacenamento para MySQL, unha combinación non recomendada para MediaWiki, porque:\n* practicamente non soporta os accesos simultáneos debido ao bloqueo de táboas\n* é máis propenso a corromperse ca outros motores\n* o código base de MediaWiki non sempre manexa o MyISAM como debera\n\nSe a súa instalación MySQL soporta InnoDB, recoméndase elixilo no canto de MyISAM.\nSe a súa instalación MySQL non soporta InnoDB, quizais sexa boa idea realizar unha actualización.",
-    "config-mysql-only-myisam-dep": "'''Atención:''' MyISAM é o único motor de almacenamento para MySQL, unha combinación non recomendada para MediaWiki, porque:\n* practicamente non soporta os accesos simultáneos debido ao bloqueo de táboas\n* é máis propenso a corromperse ca outros motores\n* o código base de MediaWiki non sempre manexa o MyISAM como debera\n\nA súa instalación MySQL non soporta InnoDB, quizais sexa boa idea realizar unha actualización.",
+    "config-mysql-only-myisam-dep": "'''Atención:''' MyISAM é o único motor de almacenamento para MySQL nesta máquina, unha combinación non recomendada para MediaWiki, porque:\n* practicamente non soporta os accesos simultáneos debido ao bloqueo de táboas\n* é máis propenso a corromperse ca outros motores\n* o código base de MediaWiki non sempre manexa o MyISAM como debera\n\nA súa instalación MySQL non soporta InnoDB, quizais sexa boa idea realizar unha actualización.",
     "config-mysql-engine-help": "'''InnoDB''' é case sempre a mellor opción, dado que soporta ben os accesos simultáneos.\n\n'''MyISAM''' é máis rápido en instalacións de usuario único e de só lectura.\nAs bases de datos MyISAM tenden a se corromper máis a miúdo ca as bases de datos InnoDB.",
     "config-mysql-charset": "Conxunto de caracteres da base de datos:",
     "config-mysql-binary": "Binario",
     "config-mysql-utf8": "UTF-8",
     "config-mysql-charset-help": "No '''modo binario''', MediaWiki almacena texto UTF-8 na base de datos en campos binarios.\nIsto é máis eficaz ca o modo UTF-8 de MySQL e permítelle usar o rango completo de caracteres Unicode.\n\nNo '''modo UTF-8''', MySQL saberá o xogo de caracteres dos seus datos e pode presentar e converter os datos de maneira axeitada,\npero non lle deixará gardar caracteres por riba do [//en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes plan multilingüe básico].",
+    "config-mssql-auth": "Tipo de autenticación:",
+    "config-mssql-install-auth": "Seleccione o tipo de autenticación que se utilizará para conectarse á base de datos durante o proceso de instalación.\nSe selecciona \"{{int:config-mssql-windowsauth}}\", usaranse as credenciais do usuario co que se está a executar o servidor web.",
+    "config-mssql-web-auth": "Seleccione o tipo de autenticación que utilizará o servidor web para conectarse ao servidor da base de datos durante o funcionamiento normal do wiki.\nSe selecciona \"{{int:config-mssql-windowsauth}}\", usaranse as credenciais do usuario co que se está a executar o servidor web.",
+    "config-mssql-sqlauth": "Autenticación de SQL Server",
+    "config-mssql-windowsauth": "Autenticación de Windows",
     "config-site-name": "Nome do wiki:",
     "config-site-name-help": "Isto aparecerá na barra de títulos do navegador e noutros lugares.",
     "config-site-name-blank": "Escriba o nome do sitio.",
     "config-ns-invalid": "O espazo de nomes especificado, \"<nowiki>$1</nowiki>\", é incorrecto.\nEspecifique un espazo de nomes do proxecto diferente.",
     "config-ns-conflict": "O espazo de nomes especificado, \"<nowiki>$1</nowiki>\", entra en conflito co espazo de nomes MediaWiki por defecto.\nEspecifique un espazo de nomes do proxecto diferente.",
     "config-admin-box": "Conta de administrador",
-    "config-admin-name": "O seu nome:",
+    "config-admin-name": "O seu nome de usuario:",
     "config-admin-password": "Contrasinal:",
     "config-admin-password-confirm": "Repita o contrasinal:",
     "config-admin-help": "Escriba o nome de usuario que queira aquí, por exemplo, \"Joe Bloggs\".\nEste é o nome que usará para acceder ao sistema do wiki.",
     "config-admin-name-blank": "Escriba un nome de usuario para o administrador.",
     "config-admin-name-invalid": "O nome de usuario especificado, \"<nowiki>$1</nowiki>\", é incorrecto.\nEspecifique un nome de usuario diferente.",
     "config-admin-password-blank": "Escriba un contrasinal para a conta de administrador.",
-    "config-admin-password-same": "O contrasinal debe diferir do nome de usuario.",
     "config-admin-password-mismatch": "Os contrasinais non coinciden.",
     "config-admin-email": "Enderezo de correo electrónico:",
     "config-admin-email-help": "Escriba aquí un enderezo de correo electrónico para que poida recibir mensaxes doutros usuarios a través do wiki, restablecer o contrasinal e ser notificado das modificacións feitas nas páxinas presentes na súa lista de vixilancia. Pode deixar este campo en branco.",
     "config-profile-fishbowl": "Só os editores autorizados",
     "config-profile-private": "Wiki privado",
     "config-profile-help": "Os wikis funcionan mellor canta máis xente os edite.\nEn MediaWiki, é doado revisar os cambios recentes e reverter calquera dano feito por usuarios novatos ou con malas intencións.\nPorén, moita xente atopa MediaWiki útil nunha ampla variedade de papeis, e ás veces non é fácil convencer a todos dos beneficios que leva consigo o estilo wiki.\nVostede decide.\n\nO modelo '''{{int:config-profile-wiki}}''' permite a edición por parte de calquera, mesmo sen rexistro.\nA opción '''{{int:config-profile-no-anon}}''' proporciona un control maior, pero pode desalentar os colaboradores casuais.\n\nO escenario '''{{int:config-profile-fishbowl}}''' restrinxe a edición aos usuarios aprobados, pero o público pode ollar as páxinas, incluíndo os historiais.\nO tipo '''{{int:config-profile-private}}''' só deixa que os usuarios aprobados vexan e editen as páxinas.\n\nHai dispoñibles configuracións de dereitos de usuario máis complexas despois da instalación; bótelle un ollo a [//www.mediawiki.org/wiki/Manual:User_rights esta entrada no manual].",
-    "config-license": "Dereitos de autor e licenza:",
+    "config-license": "Dereitos de autoría e licenza:",
     "config-license-none": "Sen licenza ao pé",
     "config-license-cc-by-sa": "Creative Commons recoñecemento compartir igual",
     "config-license-cc-by": "Creative Commons recoñecemento",
     "config-extension-link": "Sabía que o seu wiki soporta [//www.mediawiki.org/wiki/Manual:Extensions extensións]?\n\nPode explorar as [//www.mediawiki.org/wiki/Category:Extensions_by_category extensións por categoría] ou a [//www.mediawiki.org/wiki/Extension_Matrix matriz de extensións] para ollar a lista completa de extensións.",
     "mainpagetext": "'''MediaWiki instalouse correctamente.'''",
     "mainpagedocfooter": "Consulte a [//meta.wikimedia.org/wiki/Help:Contents guía de usuario] para obter máis información sobre como usar o software wiki.\n\n== Primeiros pasos ==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Lista das opcións de configuración]\n* [//www.mediawiki.org/wiki/Manual:FAQ Preguntas máis frecuentes sobre MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lista de correo dos lanzamentos de MediaWiki]\n* [//www.mediawiki.org/wiki/Localisation#Translation_resources Localice MediaWiki á súa lingua]"
-}
\ No newline at end of file
+}
index 31c7322..4eabffe 100644 (file)
@@ -4,5 +4,6 @@
             "The Discoverer"
         ]
     },
-    "config-page-language": "Bhas"
-}
\ No newline at end of file
+    "config-page-language": "Bhas",
+    "mainpagedocfooter": "Wiki software uzar korpache mahiti khatir [//meta.wikimedia.org/wiki/Help:Contents Vapurpeanchi Hath-pustok] polloi\n\n== Suru kortana ==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Configuracaoanchi suchi]\n* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki babtint zaite pavtti vicharlele proxn]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki che novem ank bhair sorta tedna email dhadpachi suchi]\n* [//www.mediawiki.org/wiki/Localisation#Translation_resources MediaWiki tujea bhasen toiar kor]"
+}
index abe9756..bd7552a 100644 (file)
@@ -8,4 +8,4 @@
     "config-page-language": "Γλῶττα",
     "mainpagetext": "'''Ἡ ἐγκατάστασις τῆς MediaWiki ἦν ἐπιτυχής'''",
     "mainpagedocfooter": "Βουλευθήσεσθε τὰς [//meta.wikimedia.org/wiki/Help:Contents βουλὰς τοῖς Χρωμένοις] ἵνα πληροφορηθῇτε περὶ τοῦ βίκιλογισμικοῦ.\n\n== Ἄρξασθε ==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Διαλογή παραμέτρων διαμορφώσεως]\n* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki: τὰ πολλάκις αἰτηθέντα]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Διαλογή διαλέξεων ἐπὶ τῶν διανομῶν τῆς MediaWiki]"
-}
\ No newline at end of file
+}
index dbfa550..4bfb7de 100644 (file)
     "config-magic-quotes-runtime": "'''Fatal: Dr Parameter <code>[http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-runtime magic_quotes_runtime]</code> vu PHP isch aktiviert!'''\nDie Yystellig fiert zue nit vorhärsähbare Probläm bi dr Datenyygab.\nMediaWiki cha nit inschtalliert wäre, solang dää Parameter nit deaktiviert woren isch.",
     "config-magic-quotes-sybase": "'''Fatal: Dr Parameter <code>[http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-sybase magic_quotes_sybase]</code> vu PHP isch aktiviert!'''\nDie Yystellig fiert zue nit vorhärsähbare Probläm bi dr Datenyygab.\nMediaWiki cha nit inschtalliert wäre, solang dää Parameter nit deaktiviert woren isch.",
     "config-mbstring": "'''Fatal: Dr Parameter <code>[http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload]</code> vu PHP isch aktiviert!'''\nDie Yystellig verursacht Fähler un fiert zue nit vorhärsähbare Probläm bi dr Datenyygab.\nMediaWiki cha nit inschtalliert wäre, solang dää Parameter nit deaktiviert woren isch.",
-    "config-ze1": "'''Fatal: Dr Parameter <code>[http://www.php.net/manual/en/ini.core.php zend.ze1_compatibility_mode]</code> vu PHP isch aktiviert!'''\nDie Yystellig fiert zue große Fähler bi MediaWiki.\nMediaWiki cha nit inschtalliert wäre, solang dää Parameter nit deaktiviert woren isch.",
     "config-safe-mode": "'''Warnig:''' D Funktion <code>[http://www.php.net/features.safe-mode Safe Mode]</code> vu PHP isch aktiviert.\nDes cha zue Probläm fiere, vor allem wänn s Uffelade vu Dateie soll megli syy bzw. dr Uuszeichner <code>math</code> soll brucht wäre.",
     "config-xml-bad": "S XML-Modul vu PHP fählt.\nMediaWiki brucht Funktione, wu au des Modul z Verfiegig stellt, un funktioniert in däre Konfiguration nit.\nWänn Mandriva brucht wird, mueß no s „php-xml“-Paket inschtalliert wäre.",
-    "config-pcre": "S PHP-Modul fir d PCRE-Unterstitzig isch nit gfunde wore.\nMediaWiki brucht aber perl-kompatibli reguläri Uusdruck zum lauffähig syy.",
     "config-pcre-no-utf8": "'''Fatale Fähler: S PHP-Modul PCRE isch schyns ohni PCRE_UTF8-Unterstitzig kompiliert wore.'''\nMediaWiki brucht d UTF-8-Unterstitzi zum fählerfrej lauffähig syy.",
     "config-memory-raised": "Dr PHP-Parameter <code>memory_limit</code> lyt bi $1 un isch uf $2 uffegsetzt wore.",
     "config-memory-bad": "'''Warnig:''' Dr PHP-Parameter <code>memory_limit</code> lyt bi $1.\nDää Wärt isch wahrschyns z nider.\nDr Inschtallationsvorgang chennt wäge däm fählschlaa!",
@@ -67,4 +65,4 @@
     "config-help": "Hilf",
     "mainpagetext": "'''MediaWiki isch erfolgrich inschtalliert worre.'''",
     "mainpagedocfooter": "Lueg uf d [//meta.wikimedia.org/wiki/MediaWiki_localisation Dokumentation fir d Aapassig vu dr Benutzeroberflächi] un s [//meta.wikimedia.org/wiki/Help:Contents Benutzerhandbuech] fir d Hilf iber d Benutzig un s Yystelle."
-}
\ No newline at end of file
+}
index 0046040..2a0f1b9 100644 (file)
@@ -2,9 +2,44 @@
     "@metadata": {
         "authors": [
             "Ashok modhvadia",
-            "Dineshjk"
+            "Dineshjk",
+            "KartikMistry"
         ]
     },
+    "config-desc": "મીડિઆવિકિ માટે સ્થાપક",
+    "config-title": "મીડિઆવિકિ $1 સ્થાપન",
+    "config-information": "માહિતી",
+    "config-localsettings-badkey": "તમે આપેલી કળ ખોટી છે.",
+    "config-your-language": "તમારી ભાષા:",
+    "config-wiki-language": "વિકિ ભાષા:",
+    "config-back": "← પાછળ",
+    "config-continue": "ચાલુ રાખો →",
+    "config-page-language": "ભાષા",
+    "config-page-welcome": "મિડિઆવિકિમાં તમારું સ્વાગત છે!",
+    "config-page-dbsettings": "ડેટાબેઝ ગોઠવણીઓ",
+    "config-page-name": "નામ",
+    "config-page-options": "વિકલ્પો",
+    "config-page-install": "સ્થાપિત કરો",
+    "config-page-complete": "સમાપ્ત!",
+    "config-page-restart": "સ્થાપન ફરી શરુ કરો",
+    "config-page-readme": "મને વાંચો",
+    "config-db-type": "ડેટાબેઝ પ્રકાર:",
+    "config-db-host": "ડેટાબેઝ હોસ્ટ:",
+    "config-db-name": "ડેટાબેઝ નામ:",
+    "config-db-name-oracle": "ડેટાબેઝ સ્કિમા:",
+    "config-db-username": "ડેટાબેઝ સભ્યનામ:",
+    "config-db-password": "ડેટાબેઝ પાસવર્ડ:",
+    "config-db-port": "ડેટાબેઝ પોર્ટ:",
+    "config-site-name": "વિકિનું નામ:",
+    "config-admin-name": "તમારું સભ્યનામ:",
+    "config-admin-password": "પાસવર્ડ:",
+    "config-admin-password-confirm": "પાસવર્ડ ફરીથી:",
+    "config-admin-email": "ઇમેલ સરનામું:",
+    "config-profile-private": "અંગત વિકિ",
+    "config-email-settings": "ઇમેલ ગોઠવણીઓ",
+    "config-install-step-done": "પૂર્ણ",
+    "config-install-step-failed": "નિષ્ફળ",
+    "config-help": "મદદ",
     "mainpagetext": "'''મિડીયાવિકિ સફળતાપૂર્વક ઇન્સટોલ થયું છે.'''",
     "mainpagedocfooter": "વિકિ સોફ્ટવેર વાપરવાની માહીતિ માટે [//meta.wikimedia.org/wiki/Help:Contents સભ્ય માર્ગદર્શિકા] જુઓ.\n\n== શરૂઆતના તબક્કે ==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings કોનફીગ્યુરેશન સેટીંગ્સની યાદી]\n* [//www.mediawiki.org/wiki/Manual:FAQ વારંવાર પુછાતા પ્રશ્નો]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce મિડીયાવિકિ રીલીઝ મેઇલીંગ લીસ્ટ]\n* [//www.mediawiki.org/wiki/Localisation#Translation_resources Localise MediaWiki for your language]"
-}
\ No newline at end of file
+}
index 8658931..b1d027a 100644 (file)
@@ -1,6 +1,4 @@
 {
-    "@metadata": {
-        "authors": []
-    },
+    "@metadata": [],
     "mainpagetext": "'''Ta MediaWiki currit stiagh nish.'''"
-}
\ No newline at end of file
+}
index 02f55cf..6d2ac4d 100644 (file)
@@ -1,7 +1,5 @@
 {
-    "@metadata": {
-        "authors": []
-    },
+    "@metadata": [],
     "mainpagetext": "'''Yí-kîn sṳ̀n-kûng ôn-chông MediaWiki.'''",
     "mainpagedocfooter": "chhiáng fóng-mun [//meta.wikimedia.org/wiki/Help:Contents Yung-fu sú-chhak] yî-khi̍p sṳ́-yung chhṳ́ wiki ngiôn-khien ke sin-sit!\n\n== Ngi̍p-mùn  ==\n\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings MediaWiki Phi-chṳ sat-thin chhîn-tân]\n* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki Phìn-sòng mun-thì kié-tap]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki fat-phu email chhîn-tân]"
-}
\ No newline at end of file
+}
index f4e740e..7f9935a 100644 (file)
@@ -1,6 +1,55 @@
 {
     "@metadata": {
-        "authors": []
+        "authors": [
+            "Kolonahe"
+        ]
     },
+    "config-desc": "Ka polokalamu hoʻonoho no MekiaWiki",
+    "config-title": "Ka hoʻonoho MekiaWiki $1",
+    "config-information": "ʻIke",
+    "config-localsettings-key": "Pihi hoʻopuka hou:",
+    "config-localsettings-badkey": "Hewa ka pihi.",
+    "config-your-language": "Kāu ʻōlelo:",
+    "config-your-language-help": "E koho i kekahi ʻōlelo no ka hoʻohana ʻana ma loko o ka hana hoʻonohona.",
+    "config-wiki-language": "ʻŌlelo Wiki:",
+    "config-wiki-language-help": "E koho i ka ʻōlelo e kākau pinepine ʻia i ka wiki.",
+    "config-back": "← Kele hope",
+    "config-continue": "Holomua →",
+    "config-page-language": "ʻŌlelo",
+    "config-page-welcome": "E welina mai e MikiaWiki!",
+    "config-page-dbconnect": "E hoʻokuʻi i ka hōkeo ʻikepili",
+    "config-page-upgrade": "Hoʻopuka hou i ka hoʻonohona nei",
+    "config-page-dbsettings": "Makemake hōkeo ʻikepili",
+    "config-page-name": "Inoa",
+    "config-page-options": "Nā Koho",
+    "config-page-install": "Hoʻonoho",
+    "config-page-complete": "Pau hana!",
+    "config-page-restart": "Hōʻano hou i ka hoʻonohona",
+    "config-page-readme": "Heluhelu iaʻu",
+    "config-page-releasenotes": "Noka hāʻawi",
+    "config-page-copying": "Kope",
+    "config-page-upgradedoc": "Ka Hoʻopuka ʻana",
+    "config-page-existingwiki": "Ka wiki nei",
+    "config-restart": "ʻAe, e hōʻano hou",
+    "config-db-type": "ʻAno hōkeo ʻikepili:",
+    "config-db-name": "Inoa hōkeo ʻikepili",
+    "config-db-username": "Inoa hōkeo ʻikepili:",
+    "config-db-password": "ʻŌlelo hūnā hōkeo ʻikepili",
+    "config-mysql-binary": "Baineli",
+    "config-mysql-utf8": "UTF-8",
+    "config-site-name": "Inoa wiki:",
+    "config-project-namespace": "Lewainoa papahana:",
+    "config-ns-generic": "Papahana",
+    "config-ns-other-default": "KaʻuWiki",
+    "config-admin-box": "Moʻokāki kahu",
+    "config-admin-name": "Kāu inoa mea hoʻohana:",
+    "config-admin-password": "ʻŌlelo hūnā:",
+    "config-admin-password-confirm": "Kikokiko hou i kā ʻŌlelo hūnā:",
+    "config-admin-name-blank": "E kikokiko i kekahi inoa mea hoʻohana kahu.",
+    "config-profile-private": "Wiki pilikino",
+    "config-cc-again": "Koho hou...",
+    "config-install-step-done": "pau hana",
+    "config-help": "kōkua",
+    "config-nofile": "Loaʻa ʻole ka waihona \"$1.\" Ua holoi paha ʻia?",
     "mainpagetext": "'''Ua pono ka ho‘ouka ‘ana o MediaWiki.'''"
-}
\ No newline at end of file
+}
index 6350052..719e790 100644 (file)
@@ -4,23 +4,25 @@
             "Amire80",
             "YaronSh",
             "ערן",
-            "아라"
+            "아라",
+            "Inkbug",
+            "Yona b"
         ]
     },
     "config-desc": "תכנית ההתקנה של מדיה־ויקי",
     "config-title": "התקנת מדיה־ויקי $1",
-    "config-information": "פר×\98×\99×\9d",
+    "config-information": "×\9e×\99×\93×¢",
     "config-localsettings-upgrade": "זוהה קובץ <code>LocalSettings.php</code>.\nכדי לשדרג את ההתקנה הזאת, נא להקליד את הערך של <code>$wgUpgradeKey</code> בתיבה להלן.\nאפשר למצוא אותו בקובץ <code>LocalSettings.php</code>.",
-    "config-localsettings-cli-upgrade": "×\96×\95×\94×\94 ×§×\95×\91×¥ <code>LocalSettings.php</code>.\n×\9b×\93×\99 ×\9cש×\93ר×\92 ×\90ת ×\94×\94תקנ×\94 ×\94×\96×\90ת, ×\94ר×\99צ×\95 ×\90ת <code>update.php</code> ×\95×\9c×\90 ×\90ת ×\94ק×\95×\91×¥ הזה.",
+    "config-localsettings-cli-upgrade": "×\96×\95×\94×\94 ×§×\95×\91×¥ <code>LocalSettings.php</code>.\n×\9b×\93×\99 ×\9cש×\93ר×\92 ×\90ת ×\94×\94תקנ×\94 ×\94×\96×\90ת, ×\99ש ×\9c×\94ר×\99×¥ ×\90ת <code>update.php</code> ×\95×\9c×\90 ×\90ת ×\94ת×\94×\9c×\99×\9a הזה.",
     "config-localsettings-key": "מפתח השדרוג:",
-    "config-localsettings-badkey": "המפתח שהקלדתם שגוי",
-    "config-upgrade-key-missing": "×\96×\95×\94ת×\94 ×\94תקנ×\94 ×§×\99×\99×\9eת ×©×\9c ×\9e×\93×\99×\94Ö¾×\95×\99ק×\99.\n×\9b×\93×\99 ×\9cש×\93ר×\92 ×\90ת ×\94×\94תקנ×\94 ×\94×\96×\90ת, ×\90× ×\90 ×\9bת×\91×\95 ×\90ת ×\94ש×\95ר×\94 ×\94×\91×\90 ×\91ת×\97ת×\99ת ×§×\95×\91×¥ <code>LocalSettings.php</code> ×©×\9c×\9b×\9d:\n\n$1",
-    "config-localsettings-incomplete": "נר×\90×\94 ×©×§×\95×\91×¥ <code>LocalSettings.php</code> ×\94ק×\99×\99×\9d ×\90×\99× ×\95 ×©×\9c×\9d.\n×\94×\9eשתנ×\94 $1 ×\90×\99× ×\95 ×\9e×\95×\92×\93ר.\n× ×\95 ×\9cשנ×\95ת ×\90ת ×§×\95×\91×¥ <code>LocalSettings.php</code> ×©×\9c×\9b×\9d כך שהמשתנה הזה יהיה מוגדר וללחוץ \"{{int:Config-continue}}\".",
-    "config-localsettings-connection-error": "אירעה שגיאה בעת חיבור למסד נתונים עם הגדרות ב־<code>LocalSettings.php</code> או ב־<code>AdminSettings.php</code>. נא לתקן את ההגדרות האלו ולנסות שוב.\n\n$1",
+    "config-localsettings-badkey": "המפתח שהקלדת שגוי.",
+    "config-upgrade-key-missing": "×\96×\95×\94ת×\94 ×\94תקנ×\94 ×§×\99×\99×\9eת ×©×\9c ×\9e×\93×\99×\94Ö¾×\95×\99ק×\99.\n×\9b×\93×\99 ×\9cש×\93ר×\92 ×\90ת ×\94×\94תקנ×\94 ×\94×\96×\90ת, ×\99ש ×\9c×\9bת×\95×\91 ×\90ת ×\94ש×\95ר×\94 ×\94×\91×\90 ×\91ת×\97ת×\99ת ×§×\95×\91×¥ <code>LocalSettings.php</code> ×©×\9c×\9a:\n\n$1",
+    "config-localsettings-incomplete": "נר×\90×\94 ×©×§×\95×\91×¥ <code>LocalSettings.php</code> ×\94ק×\99×\99×\9d ×\90×\99× ×\95 ×©×\9c×\9d.\n×\94×\9eשתנ×\94 $1 ×\90×\99× ×\95 ×\9e×\95×\92×\93ר.\n× ×\90 ×\9cשנ×\95ת ×\90ת ×\94ק×\95×\91×¥ <code>LocalSettings.php</code> כך שהמשתנה הזה יהיה מוגדר וללחוץ \"{{int:Config-continue}}\".",
+    "config-localsettings-connection-error": "אירעה שגיאה בעת חיבור למסד נתונים עם הגדרות ב־<code>LocalSettings.php</code>. נא לתקן את ההגדרות האלו ולנסות שוב.\n\n$1",
     "config-session-error": "שגיאה באתחול שיחה: $1",
     "config-session-expired": "נראה שנתוני השיחה שלכם פגו.\nהשיחות מוגדרות להיות תקפות לזמן של $1.\nאפשר להגדיל את זה ב־<code>session.gc_maxlifetime</code> בקובץ php.ini.\nיש להתחיל מחדש את תהליך ההתקנה.",
     "config-no-session": "נתוני השיחה שלכם אבדו!\nיש לבדוק את קובץ php.ini שלכם ולוודא שתיקייה נכונה מוגדרת ב־<code>session.save_path</code>.",
-    "config-your-language": "×\94שפ×\94 ×©×\9c×\9b×\9d:",
+    "config-your-language": "×\94שפ×\94 ×©×\9c×\9a:",
     "config-your-language-help": "נא לבחור את השפה שתשמש במהלך ההתקנה.",
     "config-wiki-language": "שפת הוויקי:",
     "config-wiki-language-help": "נא לבחור את השפה העיקרית שבה ייכתב ויקי זה.",
     "config-page-existingwiki": "ויקי קיים",
     "config-help-restart": "האם ברצונך לנקות את כל הנתונים שהזנת ולהתחיל מחדש את תהליך ההתקנה?",
     "config-restart": "כן, להפעיל מחדש",
-    "config-welcome": "=== ×\91×\93×\99ק×\95ת ×¡×\91×\99×\91×\94 ===\n×\91×\93×\99ק×\95ת ×\91ס×\99ס×\99×\95ת ×\9eת×\91צע×\95ת ×\9b×\93×\99 ×\9c×\91×\93×\95ק ×©×\94ס×\91×\99×\91×\94 ×\9eת×\90×\99×\9e×\94 ×\9c×\94תקנת ×\9e×\93×\99×\94Ö¾×\95×\99ק×\99.\n×\99ש ×\9cתת ×\90ת ×ª×\95צ×\90×\95ת ×\94×\91×\93×\99ק×\95ת ×\94×\90×\9c×\95 ×\90×\9d ×ª×\96×\93קק×\95 ×\9c×¢×\96ר×\94 ×\91×\96×\9e×\9f ההתקנה.",
-    "config-copyright": "=== זכויות יוצרים ותנאים ===\n\n$1\n\nתכנית זו היא תכנה חופשית; באפשרותך להפיצה מחדש ו/או לשנות אותה על פי תנאי הרישיון הציבורי הכללי של GNU כפי שפורסם על ידי קרן התכנה החופשית; בין אם גרסה 2 של הרישיון, ובין אם (לפי בחירתך) כל גרסה מאוחרת שלו.\n\nתכנית זו מופצת בתקווה שתהיה מועילה, אבל '''בלא אחריות כלשהי'''; ואפילו ללא האחריות המשתמעת בדבר '''מסחריותה''' או '''התאמתה למטרה '''מסוימת'''. לפרטים נוספים, ניתן לעיין ברישיון הציבורי הכללי של GNU.\n\nלתכנית זו אמור היה להיות מצורף <doclink href=Copying>עותק של הרישיון הציבורי הכללי של GNU</doclink>; אם לא, עליך לכתוב ל־Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, , MA 02111-1307, USA. או [http://www.gnu.org/copyleft/gpl.html לקרוא אותו דרך האינטרנט].",
-    "config-sidebar": "* [//www.mediawiki.org אתר הבית של מדיה־ויקי]\n* [//www.mediawiki.org/wiki/Help:Contents המדריך למשתמשים]\n* [//www.mediawiki.org/wiki/Manual:Contents המדריך למנהלים]\n* [//www.mediawiki.org/wiki/Manual:FAQ שו״ת]\n----\n* <doclink href=Readme>קרא אותי</doclink>\n* <doclink href=ReleaseNotes>הערות גרסה</doclink>\n* <doclink href=Copying>העתקה</doclink>\n* <doclink href=UpgradeDoc>שדרוג</doclink>",
+    "config-welcome": "=== ×\91×\93×\99ק×\95ת ×¡×\91×\99×\91×\94 ===\n×\91×\93×\99ק×\95ת ×\91ס×\99ס×\99×\95ת ×ª×ª×\91צענ×\94 ×¢×\9bש×\99×\95 ×\9b×\93×\99 ×\9cר×\90×\95ת ×\90×\9d ×\94ס×\91×\99×\91×\94 ×\94×\96×\90ת ×\9eת×\90×\99×\9e×\94 ×\9c×\94תקנת ×\9e×\93×\99×\94Ö¾×\95×\99ק×\99.\n× ×\90 ×\9c×\96×\9b×\95ר ×\9c×\9b×\9c×\95×\9c ×\90ת ×\94×\9e×\99×\93×¢ ×\94×\96×\94 ×\91עת ×\91קשת ×ª×\9e×\99×\9b×\94 ×¢×\9d ×\94ש×\9c×\9eת ההתקנה.",
+    "config-copyright": "=== זכויות יוצרים ותנאים ===\n\n$1\n\nתכנית זו היא תכנה חופשית; באפשרותך להפיצה מחדש ו/או לשנות אותה על פי תנאי הרישיון הציבורי הכללי של GNU כפי שפורסם על ידי קרן התכנה החופשית; בין אם גרסה 2 של הרישיון, ובין אם (לפי בחירתך) כל גרסה מאוחרת שלו.\n\nתכנית זו מופצת בתקווה שתהיה מועילה, אבל '''בלא אחריות כלשהי'''; ואפילו ללא האחריות המשתמעת בדבר '''מסחריותה''' או '''התאמתה למטרה '''מסוימת'''. לפרטים נוספים, ניתן לעיין ברישיון הציבורי הכללי של GNU.\n\nלתכנית זו אמור היה להיות מצורף <doclink href=Copying>עותק של הרישיון הציבורי הכללי של GNU</doclink>; אם לא קיבלת אותו, אפשר לכתוב ל־Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA או [http://www.gnu.org/copyleft/gpl.html לקרוא אותו דרך האינטרנט].",
+    "config-sidebar": "* [//www.mediawiki.org אתר הבית של מדיה־ויקי]\n* [//www.mediawiki.org/wiki/Help:Contents המדריך למשתמש]\n* [//www.mediawiki.org/wiki/Manual:Contents המדריך למנהל]\n* [//www.mediawiki.org/wiki/Manual:FAQ שו״ת]\n----\n* <doclink href=Readme>קרא אותי</doclink>\n* <doclink href=ReleaseNotes>הערות גרסה</doclink>\n* <doclink href=Copying>העתקה</doclink>\n* <doclink href=UpgradeDoc>שדרוג</doclink>",
     "config-env-good": "הסביבה שלכם נבדקה.\nאפשר להתקין מדיה־ויקי.",
     "config-env-bad": "הסביבה שלכם נבדקה.\nאי־אפשר להתקין מדיה־ויקי.",
     "config-env-php": "מותקנת <span dir=\"ltr\">PHP $1</span>.",
     "config-env-php-toolow": "מותקנת <span dir=\"ltr\">PHP $1</span>.\nלמדיה־ויקי נדרשת <span dir=\"ltr\">PHP $2</span> או גרסה גבוהה יותר.",
-    "config-unicode-using-utf8": "משתמש ב־normalize.so של בריון ויבר לנרמול יוניקוד.",
-    "config-unicode-using-intl": "משתמש בהרחבת [http://pecl.php.net/intl הרחבת intl PECL] לנרמול יוניקוד",
+    "config-unicode-using-utf8": "משתמש ב־utf8_normalize.so של בריון ויבר לנרמול יוניקוד.",
+    "config-unicode-using-intl": "משתמש ב[http://pecl.php.net/intl הרחבת intl PECL] לנרמול יוניקוד.",
     "config-unicode-pure-php-warning": "'''אזהרה''': [http://pecl.php.net/intl הרחבת intl PECL] אינה זמינה לטיפול בנרמול יוניקוד. משתמש ביישום PHP טהור ואטי יותר.\nאם זהו אתר בעל תעבורה גבוהה, כדאי לקרוא את המסמך הבא: [//www.mediawiki.org/wiki/Unicode_normalization_considerations Unicode normalization].",
-    "config-unicode-update-warning": "'''×\90×\96×\94ר×\94''': ×\94×\92רס×\94 ×\94×\9e×\95תקנת ×©×\9c ×\9e×¢×\98פת × ×¨×\9e×\95×\9c ×\99×\95× ×\99ק×\95×\93 ×\9eשת×\9eשת ×\91×\92רס×\94 ×\99שנ×\94 ×©×\9c ×\94ספר×\99×\99×\94 ×©×\9c [http://site.icu-project.org/ ×¤×¨×\95×\99ק×\98 ICU].\n×\9b×\93×\90×\99 [//www.mediawiki.org/wiki/Unicode_normalization_considerations ×\9c×¢×\93×\9b×\9f] ×\90×\9d ×\97ש×\95×\91 ×\9c×\9b×\9d ×\94×\98×\99פ×\95×\9c ×\91×\99×\95× ×\99ק×\95×\93.",
-    "config-no-db": "×\9c×\90 × ×\9eצ×\90 ×\93ר×\99×\99×\91ר ×\9eס×\93 × ×ª×\95× ×\99×\9d ×\9eת×\90×\99×\9d. ×\99ש ×\9c×\94תק×\99×\9f ×\93ר×\99×\99×\91ר ×\9eס×\93 × ×ª×\95× ×\99×\9d ×\9cÖ¾PHP.\nנת×\9e×\9b×\99×\9d ×\94ס×\95×\92×\99×\9d ×\94×\91×\90×\99×\9d ×©×\9c ×\9eס×\93×\99 × ×ª×\95× ×\99×\9d: $1.\n\n×\90×\9d ×\90ת×\9d ×\9eשת×\9eש×\99×\9d ×\91×\90×\99ר×\95×\97 ×\9eש×\95תף, ×\91קש×\95 ×\9eספק ×\94×\90×\99ר×\95×\97 ×©×\9c×\9b×\9d ×\9c×\94תק×\99×\9f ×\93ר×\99×\99×\91ר ×\9eס×\93 × ×ª×\95× ×\99×\9d ×\9eת×\90×\99×\9d.\n×\90×\9d ×§Ö´×\9eפ×\9cת×\9d ×\90ת PHP ×\91עצ×\9e×\9b×\9d, ×\94×\92×\93×\99ר×\95 ×\90×\95ת×\95 ×\9e×\97×\93ש ×\95×\94פע×\99×\9c×\95 ×\90ת ×\9cק×\95×\97 ×\9eס×\93 × ×ª×\95× ×\99×\9d, ×\9c×\9eש×\9c ×\91×\90×\9eצע×\95ת <code dir=\"ltr\">./configure --with-mysql</code>.\n×\90×\9d ×\94תקנת×\9d ×\90ת PHP ×\9b×\97×\91×\99×\9c×\94 ×©×\9c ×\93×\91×\99×\90×\9f ×\90×\95 ×©×\9c ×\90×\95×\91×\95× ×\98×\95, ×\99ש ×\9c×\94תק×\99×\9f ×\90ת ×\94×\9e×\95×\93×\95×\9c php5-mysql.",
-    "config-outdated-sqlite": "'''אזהרה''': במערכת מתוקן SQLite $1. גרסה זו לא נתמכת ולשימוש ב SQLite נדרשת גרסה $2 ומעלה. מסיבה זו האפשרות SQLite לא מאופשרת.",
+    "config-unicode-update-warning": "'''×\90×\96×\94ר×\94''': ×\94×\92רס×\94 ×\94×\9e×\95תקנת ×©×\9c ×\9e×¢×\98פת × ×¨×\9e×\95×\9c ×\99×\95× ×\99ק×\95×\93 ×\9eשת×\9eשת ×\91×\92רס×\94 ×\99שנ×\94 ×©×\9c ×\94ספר×\99×\99×\94 ×©×\9c [http://site.icu-project.org/ ×¤×¨×\95×\99ק×\98 ICU].\n×\9b×\93×\90×\99 [//www.mediawiki.org/wiki/Unicode_normalization_considerations ×\9c×¢×\93×\9b×\9f] ×\90×\9d ×\94×\98×\99פ×\95×\9c ×\91×\99×\95× ×\99ק×\95×\93 ×\97ש×\95×\91 ×\9c×\9a.",
+    "config-no-db": "×\9c×\90 × ×\9eצ×\90 ×\93ר×\99×\99×\91ר ×\9eס×\93 × ×ª×\95× ×\99×\9d ×\9eת×\90×\99×\9d. ×\99ש ×\9c×\94תק×\99×\9f ×\93ר×\99×\99×\91ר ×\9eס×\93 × ×ª×\95× ×\99×\9d ×\9cÖ¾PHP.\nנת×\9e×\9b×\99×\9d ×\94ס×\95×\92×\99×\9d ×\94×\91×\90×\99×\9d ×©×\9c ×\9eס×\93×\99 × ×ª×\95× ×\99×\9d: $1.\n\n×\90×\9d ×§Ö´×\9eפ×\9cת ×\90ת PHP ×\91עצ×\9e×\9a, ×\99ש ×\9c×\94×\92×\93×\99ר ×\90×\95ת×\95 ×\9e×\97×\93ש ×\95×\9c×\94פע×\99×\9c ×\90ת ×\9cק×\95×\97 ×\9eס×\93 × ×ª×\95× ×\99×\9d, ×\9c×\9eש×\9c ×\91×\90×\9eצע×\95ת <code dir=\"ltr\">./configure --with-mysqli</code>.\n×\90×\9d ×\94תקנת ×\90ת PHP ×\9e×\97×\91×\99×\9c×\94 ×©×\9c ×\93×\91×\99×\90×\9f ×\90×\95 ×©×\9c ×\90×\95×\91×\95× ×\98×\95, ×\99ש ×\9c×\94תק×\99×\9f, ×\9c×\9eש×\9c, ×\92×\9d ×\90ת ×\94×\9e×\95×\93×\95×\9c <code dir=\"ltr\">php5-mysql</code>.",
+    "config-outdated-sqlite": "'''אזהרה''': במערכת מתוקן SQLite $1. גרסה זו לא נתמכת ולשימוש ב־SQLite נדרשת גרסה $2 לפחות. SQLlite לא יהיה זמין.",
     "config-no-fts3": "'''אזהרה''': SQLite מקומפל ללא [//sqlite.org/fts3.html מודול FTS]. יכולות חיפוש לא יהיו זמינות בהתקנה הזאת.",
-    "config-register-globals": "'''×\90×\96×\94ר×\94: ×\94×\90פשר×\95ת <code>[http://php.net/register_globals register_globals]</code> ×©×\9c PHP ×\9e×\95פע×\9cת.'''\n'''×\9b×\91×\95 ×\90×\95ת×\94 ×\90×\9d ×\90ת×\9d ×\99×\9b×\95×\9c×\99×\9d.'''\n×\9e×\93×\99×\94Ö¾×\95×\99ק×\99 ×ª×¢×\91×\95×\93, ×\90×\91×\9c ×\94שרת ×©×\9c×\9b×\9d חשוף לפגיעות אבטחה.",
-    "config-magic-quotes-runtime": "'''שגיאה סופנית: האפשרות [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-runtime magic_quotes_runtime] פעילה!'''\nהאפשרות הזאת מעוותת את נתוני הקלט באופן בלתי־צפוי.\nלא ניתן להתקין את מדיה־ויקי אלא אם האפשרות הזאת תכובה.",
+    "config-register-globals": "'''×\90×\96×\94ר×\94: ×\94×\90פשר×\95ת <code>[http://php.net/register_globals register_globals]</code> ×©×\9c PHP ×\9e×\95פע×\9cת.'''\n'''×\9b×\91×\95 ×\90×\95ת×\94 ×\90×\9d ×\96×\94 ×\90פשר×\99.'''\n×\9e×\93×\99×\94Ö¾×\95×\99ק×\99 ×ª×¢×\91×\95×\93, ×\90×\91×\9c ×\94שרת ×©×\9c×\9a חשוף לפגיעות אבטחה.",
+    "config-magic-quotes-runtime": "<strong>שגיאה סופנית: האפשרות [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-runtime magic_quotes_runtime] פעילה!</strong>\nהאפשרות הזאת מעוותת את נתוני הקלט באופן בלתי־צפוי.\nלא ניתן להתקין את מדיה־ויקי אלא אם האפשרות הזאת תכובה.",
     "config-magic-quotes-sybase": "'''שגיאה סופנית''': האפשרות [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-sybase magic_quotes_sybase] פעילה!'''\nהאפשרות הזאת מעוותת את נתוני הקלט באופן בלתי־צפוי.\nלא ניתן להתקין את מדיה־ויקי או להשתמש בה אלא אם האפשרות הזאת תכובה.",
     "config-mbstring": "'''שגיאה סופנית''': האפשרות [http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload] פעילה!'''\nהאפשרות הזאת גורמת לשגיאות ומעוותת את נתוני הקלט באופן בלתי־צפוי.\nלא ניתן להתקין את מדיה־ויקי או להשתמש בה אלא אם האפשרות הזאת תכובה.",
-    "config-ze1": "'''שגיאה סופנית''': האפשרות [http://www.php.net/manual/en/ini.core.php zend.ze1_compatibility_mode] פעילה!'''\nהאפשרות הזאת גורמת לתקלות מזעזעות במדיה־ויקי.\nלא ניתן להתקין את מדיה־ויקי או להשתמש בה אלא אם האפשרות הזאת תכובה.",
     "config-safe-mode": "'''אזהרה:''' האפשרות [http://www.php.net/features.safe-mode safe mode] של PHP פעילה.\nהיא יכולה לגרום לבעיות, במיוחד אם אתם משתמשים בהעלאת קבצים או ב־<code>math</code>.",
     "config-xml-bad": "מודול XML של PHP חסר.\nמדיה־ויקי דורשת פונקציות של המודול ולא תעבוד עם הגדרות כאלו.\nאם מערכת ההפעלה שלהם היא Mandrake, התקינו את החבילה php-xml.",
-    "config-pcre": "נראה שחסרה תמיכה במודול PCRE.\nכדי שמדיה־ויקי תעבוד, נדרשת תמיכה בביטויים רגולריים תואמי Perl.",
+    "config-pcre-old": "<strong>שגיאה סופנית:</strong> חובה להתקין PCRE מגרסה $1 או גרסה חדשה יותר.\nקובץ הרצת ה־PHP שלך מקושר עם PCRE מגרסה $2.\n[https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/PCRE מידע נוסף].",
     "config-pcre-no-utf8": "'''שגיאה סופנית''': נראה שמודול PCRE של PHP מקומפל ללא תמיכה ב־PCRE_UTF8.\nמדיה־ויקי דורשת תמיכה ב־UTF-8 לפעילות נכונה.",
     "config-memory-raised": "ערך האפשרות <code>memory_limit</code> של PHP הוא $1, הועלה ל־$2.",
     "config-memory-bad": "'''אזהרה:''' ערך האפשרות <code>memory_limit</code> של PHP הוא $1.\nזה כנראה נמוך מדי.\nההתקנה עשויה להיכשל!",
-    "config-ctype": "'''שגיאה סופנית''': נדרשת גרסת PHP שתומכת בהרחבה [http://www.php.net/manual/en/ctype.installation.php Ctype].",
+    "config-ctype": "<strong>שגיאה סופנית</strong>: נדרשת גרסת PHP שתומכת בהרחבה [http://www.php.net/manual/en/ctype.installation.php Ctype].",
+    "config-json": "'''שגיאה סופנית:''' PHP קומפל ללא תמיכה ב־JSON.\nיש להתקין את ההרחהב JSON ב־PHP או את ההרחבה [http://pecl.php.net/package/jsonc PECL jsonc] לפני התקנת מדיה־ויקי.\n* ההרחבה ל־PHP כלולה ב־Red Hat Enterprise Linux (ו־CentOS), אך יש להפעיל אותה ב־<code dir=\"ltr\">/etc/php.ini</code> או ב־<code dir=\"ltr\">/etc/php.d/json.ini</code>.",
     "config-xcache": "[http://xcache.lighttpd.net/ XCache] מותקן",
     "config-apc": "[http://www.php.net/apc APC] מותקן",
     "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache] מותקן",
     "config-no-cache": "'''אזהרה:''' אחת מהתוכנות הבאות לא נמצאה: [http://www.php.net/apc APC]&rlm;, [http://xcache.lighttpd.net/ XCache] או [http://www.iis.net/download/WinCacheForPhp WinCache].\nמטמון עצמים לא מופעל.",
-    "config-mod-security": "'''×\90×\96×\94ר×\94''': ×\91שרת ×\94×\95×\95×\91 ×©×\9c×\9b×\9d ×\9e×\95פע×\9c [http://modsecurity.org/ mod_security]. ×\90×\9d ×\94×\95×\90 ×\9c×\90 ×\9e×\95×\92×\93ר ×\98×\95×\91, ×\96×\94 ×\99×\9b×\95×\9c ×\9c×\92ר×\95×\9d ×\9c×\91×¢×\99×\95ת ×\91×\9e×\93×\99×\94Ö¾×\95×\99ק×\99 ×\95×\91ת×\9b× ×\94 ×\90×\97רת ×©×\9e×\90פשרת ×\9c×\9eשת×\9eש×\99×\9d ×\9cש×\9c×\95×\97 ×ª×\95×\9b×\9f ×©×¨×\99ר×\95ת×\99.\nקר×\90×\95 ×\90ת [http://modsecurity.org/documentation/ ×\94ת×\99×¢×\95×\93 ×©×\9c mod_security] ×\90×\95 ×¦×¨×\95 ×§×©×¨ ×¢×\9d ×\90נש×\99 ×\94ת×\9e×\99×\9b×\94 ×©×\9c ×©×\99ר×\95ת×\99 ×\94×\90×\99ר×\95×\97 ×©×\9c×\9b×\9d ×\90×\9d ×\90ת×\9d × ×ª×§×\9c×\99×\9d ×\91שגיאות אקראיות.",
+    "config-mod-security": "'''×\90×\96×\94ר×\94''': ×\91שרת ×\94×\95×\95×\91 ×©×\9c×\9a ×\9e×\95פע×\9c [http://modsecurity.org/ mod_security]. ×\90×\9d ×\94×\95×\90 ×\9c×\90 ×\9e×\95×\92×\93ר ×\98×\95×\91, ×\96×\94 ×\99×\9b×\95×\9c ×\9c×\92ר×\95×\9d ×\9c×\91×¢×\99×\95ת ×\91×\9e×\93×\99×\94Ö¾×\95×\99ק×\99 ×\95×\91ת×\9b× ×\94 ×\90×\97רת ×©×\9e×\90פשרת ×\9c×\9eשת×\9eש×\99×\9d ×\9cש×\9c×\95×\97 ×ª×\95×\9b×\9f ×©×¨×\99ר×\95ת×\99.\n×\99ש ×\9cקר×\95×\90 ×\90ת [http://modsecurity.org/documentation/ ×\94ת×\99×¢×\95×\93 ×©×\9c mod_security] ×\90×\95 ×\9c×\99צ×\95ר ×§×©×¨ ×¢×\9d ×\90נש×\99 ×\94ת×\9e×\99×\9b×\94 ×©×\9c ×©×\99ר×\95ת×\99 ×\94×\90×\99ר×\95×\97 ×©×\9c×\9b×\9d ×\90×\9d ×\9e×\95פ×\99×¢×\95ת ×\9c×\9a שגיאות אקראיות.",
     "config-diff3-bad": "GNU diff3 לא נמצא.",
-    "config-imagemagick": "נמצא ImageMagick&rlm;: <code dir=\"ltr\">$1</code>.\nמזעור תמונות יופעל, אם תפעילו את האפשרות להעלות קבצים.",
-    "config-gd": "נמצאה ספריית הגרפיקה GD המובנית.\nמזעור תמונות יופעל, אם תפעילו את האפשרות להעלות קבצים.",
+    "config-git": "נמצאה Git, תכנת בקרת התצורה: <code dir=\"ltr\">$1</code>.",
+    "config-git-bad": "תכנת בקרת התצורה Git לא נמצאה.",
+    "config-imagemagick": "נמצא ImageMagick&rlm;: <code dir=\"ltr\">$1</code>.\nמזעור תמונות יופעל אם תופעל האפשרות להעלות קבצים.",
+    "config-gd": "נמצאה ספריית הגרפיקה GD המובנית.\nמזעור תמונות יופעל אם תופעל האפשרות להעלות קבצים.",
     "config-no-scaling": "ספריית GD או ImageMagick לא נמצאו.\nמזעור תמונות לא יופעל.",
     "config-no-uri": "'''שגיאה:''' אי־אפשר לזהות את הכתובת הנוכחית.\nההתקנה בוטלה.",
-    "config-no-cli-uri": "אזהרה: לא הוגדר <span dir=\"ltr\">--scriptpath</span>, משתמש בבררת המחדל: <code dir=\"ltr\">$1</code>.",
+    "config-no-cli-uri": "אזהרה: לא הוגדר <span dir=\"ltr\"><code>--scriptpath</code></span>, משתמש בבררת המחדל: <code dir=\"ltr\">$1</code>.",
     "config-using-server": "שם השרת בשימוש: \"<nowiki>$1</nowiki>\".",
     "config-using-uri": "נעשה שימוש בכתובת השרת \"<nowiki>$1$2</nowiki>\".",
-    "config-uploads-not-safe": "'''×\90×\96×\94ר×\94:''' ×ª×\99ק×\99×\99ת ×\94×\94×¢×\9c×\90×\95ת ×\94×\94ת×\97×\9cת×\99ת <code>$1</code> ×\97ש×\95פ×\94 ×\9c×\94רצת ×¡×§×¨×\99פ×\98×\99×\9d ×©×¨×\99ר×\95ת×\99×\99×\9d.\n×\9e×\93×\99×\94Ö¾×\95×\99ק×\99 ×\91×\95×\93קת ×\90ת ×\9b×\9c ×\94ק×\91צ×\99×\9d ×\94×\9e×\95Ö¼×¢×\9c×\99×\9d ×\9c×\90×\99×\95×\9e×\99 ×\90×\91×\98×\97×\94, ×\9e×\95×\9e×\9c×¥ ×\9e×\90×\95×\93 ×\9c×\9e× ×\95×¢ ×\90ת [//www.mediawiki.org/wiki/Manual:Security#Upload_security ×¤×¨×¦×ª ×\94×\90×\91×\98×\97×\94] ×\94×\96×\90ת ×\9cפנ×\99 ×©×\90ת×\9d ×\9eפע×\99×\9c×\99×\9d ×\90ת ההעלאות.",
+    "config-uploads-not-safe": "'''×\90×\96×\94ר×\94:''' ×ª×\99ק×\99×\99ת ×\94×\94×¢×\9c×\90×\95ת ×\94×\94ת×\97×\9cת×\99ת <code>$1</code> ×\97ש×\95פ×\94 ×\9c×\94רצת ×¡×§×¨×\99פ×\98×\99×\9d ×©×¨×\99ר×\95ת×\99×\99×\9d.\n×\90×£ ×©×\9e×\93×\99×\94Ö¾×\95×\99ק×\99 ×\91×\95×\93קת ×\90ת ×\9b×\9c ×\94ק×\91צ×\99×\9d ×\94×\9e×\95Ö¼×¢×\9c×\99×\9d ×\9c×\90×\99×\95×\9e×\99 ×\90×\91×\98×\97×\94, ×\9e×\95×\9e×\9c×¥ ×\9e×\90×\95×\93 ×\9c×\9e× ×\95×¢ ×\90ת [//www.mediawiki.org/wiki/Manual:Security#Upload_security ×¤×¨×¦×ª ×\94×\90×\91×\98×\97×\94] ×\94×\96×\90ת ×\9cפנ×\99 ×\94פע×\9cת ההעלאות.",
     "config-no-cli-uploads-check": "'''אזהרה:''' תיקיית בררת המחדל להעלאות (<code>$1</code>) לא נבדקת לפגיעוּת להרצת תסריטים אקראיים בזמן התקנה דרך CLI.",
-    "config-brokenlibxml": "במערכת שלכם יש שילוב של גרסאות של PHP ושל libxml2 שחשוף לבאגים ויכול לגרום לעיוות נתונים נסתר במדיה־ויקי וביישומי רשת אחרים.\nשדרגו ל־PHP 5.2.9 או לגרסה חדשה יותר ול־libxml2 2.7.3 או גרסה חדשה יותר ([//bugs.php.net/bug.php?id=45996 באג מתויק ב־PHP]).\nההתקנה בוטלה.",
-    "config-using531": "אי־אפשר להשתמש במדיה־ויקי עם <span dir=\"ltr\">PHP $1</span> בגלל באג בפרמטרים של הפניות (reference parameters) ל־<code dir=\"ltr\">__call()</code>.\nשדרגו ל־PHP 5.3.2 או לגרסה גבוהה יותר כדי לתקן את זה ([//bugs.php.net/bug.php?id=50394 bug filed with PHP]) או שַנמכו ל־PHP 5.3.0 כדי לפתור את הבעיה הזאת.\nההתקנה בוטלה.",
+    "config-brokenlibxml": "במערכת שלך יש שילוב של גרסאות של PHP ושל libxml2 שחשוף לבאגים ויכול לגרום לעיוות נתונים נסתר במדיה־ויקי וביישומי רשת אחרים.\nיש לשדרג ל־libxml2 2.7.3 או גרסה חדשה יותר ([https://bugs.php.net/bug.php?id=45996 באג מתויק ב־PHP]).\nההתקנה נעצרה.",
     "config-suhosin-max-value-length": "מותקן פה Suhosin והוא מגביל את אורך פרמטר GET ל־$1 בתים. רכיב ResourceLoader של מדיה־ויקי יעקוף את המגלבה הזאת, אבל זה יפגע בביצועים. אם זה בכלל אפשרי, כדאי לתקן את הערך של <code>suhosin.get.max_value_length</code> ל־1024 או יותר בקובץ <code>php.ini</code> ולהגדיר את ‎<code>$wgResourceLoaderMaxQueryLength</code> לאותו הערך בקובץ LocalSettings.php.",
     "config-db-type": "סוג מסד הנתונים:",
     "config-db-host": "שרת מסד הנתונים:",
-    "config-db-host-help": "×\90×\9d ×©×¨×ª ×\9eס×\93 ×\94נת×\95× ×\99×\9d ×©×\9c×\9b×\9d × ×\9eצ×\90 ×¢×\9c ×©×¨×ª ×\90×\97ר, ×\94ק×\9c×\99×\93×\95 ×\90ת ×©×\9d ×\94×\9e×\97ש×\91 ×\90×\95 ×\90ת ×\9bת×\95×\91ת ×\94Ö¾IP ×\9b×\90×\9f.\n\n×\90×\9d ×\90ת×\9d ×\9eשת×\9eש×\99×\9d ×\91×\90×\99ר×\95×\97 ×\9eש×\95תף, ×¡×¤×§ ×\94×\90×\99ר×\95×\97 ×©×\9c×\9b×\9d ×\90×\9e×\95ר ×\9cתת ×\9c×\9b×\9d ×\90ת ×©×\9d ×\94שרת ×\94× ×\9b×\95×\9f ×\91×\9eס×\9e×\9b×\99×\9d.\n\n×\90×\9d ×\90ת×\9d ×\9eתק×\99× ×\99×\9d ×\91שרת Windows ×\95×\9eשת×\9eש×\99×\9d ×\91Ö¾MySQL, ×\94ש×\99×\9e×\95ש ×\91Ö¾localhost ×¢×©×\95×\99 ×\9c×\90 ×\9c×¢×\91×\95×\93. ×\90×\9d ×\94×\95×\90 ×\9c×\90 ×¢×\95×\91×\93, × ×¡×\95 ×\90ת \"127.0.0.1\" ×\91ת×\95ר ×\9bת×\95×\91ת ×\94Ö¾IP ×\94×\9eק×\95×\9e×\99ת.\n\n×\90×\9d ×\90ת×\9d ×\9eשת×\9eש×\99×\9d ×\91Ö¾PostgreSQL, תשאירו את השדה הזה ריק כדי להתחבר דרך שקע יוניקס.",
+    "config-db-host-help": "×\90×\9d ×©×¨×ª ×\9eס×\93 ×\94נת×\95× ×\99×\9d ×©×\9c×\9a × ×\9eצ×\90 ×¢×\9c ×©×¨×ª ×\90×\97ר, ×\99ש ×\9c×\94ק×\9c×\99×\93 ×\90ת ×©×\9d ×\94×\9e×\97ש×\91 ×\90×\95 ×\90ת ×\9bת×\95×\91ת ×\94Ö¾IP ×\9b×\90×\9f.\n\n×\90×\9d ×\96×\94 ×\90×\99ר×\95×\97 ×\9eש×\95תף, ×¡×¤×§ ×\94×\90×\99ר×\95×\97 ×©×\9c×\9b×\9d ×\90×\9e×\95ר ×\9cתת ×\9c×\9a ×\90ת ×©×\9d ×\94שרת ×\94× ×\9b×\95×\9f ×\91×\9eס×\9e×\9b×\99×\9d.\n\n×\90×\9d ×\96×\95×\94×\99 ×\94תקנ×\94 ×\91שרת Windows ×©×\9eשת×\9eשת ×\91Ö¾MySQL, ×\94ש×\99×\9e×\95ש ×\91Ö¾localhost ×¢×©×\95×\99 ×\9c×\90 ×\9c×¢×\91×\95×\93. ×\90×\9d ×\94×\95×\90 ×\9c×\90 ×¢×\95×\91×\93, ×\99ש ×\9cנס×\95ת ×\90ת \"127.0.0.1\" ×\91ת×\95ר ×\9bת×\95×\91ת ×\94Ö¾IP ×\94×\9eק×\95×\9e×\99ת.\n\n×\90×\9d ×\96×\94 PostgreSQL, תשאירו את השדה הזה ריק כדי להתחבר דרך שקע יוניקס.",
     "config-db-host-oracle": "TNS של מסד הנתונים:",
-    "config-db-host-oracle-help": "×\94ק×\9c×\99×\93×\95 [http://download.oracle.com/docs/cd/B28359_01/network.111/b28317/tnsnames.htm ×©×\9d ×\97×\99×\91×\95ר ×\9eק×\95×\9e×\99 (Local Connect Name)] ×ª×§×\99×\9f; ×\94ק×\95×\91×¥ tnsnames.ora ×¦×¨×\99×\9a ×\9c×\94×\99×\95ת ×\96×\9e×\99×\9f ×\9c×\94תקנ×\94 ×\94×\96×\90ת.<br />\n×\90×\9d ×\90ת×\9d ×\9eשת×\9eש×\99×\9d ×\91Ö¾client libraries 10g ×\90×\95 ×\91×\92רס×\94 ×\97×\93ש×\94 ×\99×\95תר, ×\90ת×\9d ×\99×\9b×\95×\9c×\99×\9d ×\92×\9d ×\9c×\94שת×\9eש בשיטת מתן השמות [http://download.oracle.com/docs/cd/E11882_01/network.112/e10836/naming.htm Easy Connect].",
+    "config-db-host-oracle-help": "×\99ש ×\9c×\94ק×\9c×\99×\93 [http://download.oracle.com/docs/cd/B28359_01/network.111/b28317/tnsnames.htm ×©×\9d ×\97×\99×\91×\95ר ×\9eק×\95×\9e×\99 (Local Connect Name)] ×ª×§×\99×\9f; ×\94ק×\95×\91×¥ tnsnames.ora ×¦×¨×\99×\9a ×\9c×\94×\99×\95ת ×\96×\9e×\99×\9f ×\9c×\94תקנ×\94 ×\94×\96×\90ת.<br />\n×\90×\9d ×\99ש ×¤×\94 ×\91Ö¾client libraries 10g ×\90×\95 ×\91×\92רס×\94 ×\97×\93ש×\94 ×\99×\95תר, ×\90פשר ×\9c×\94שת×\9eש ×\92×\9d בשיטת מתן השמות [http://download.oracle.com/docs/cd/E11882_01/network.112/e10836/naming.htm Easy Connect].",
     "config-db-wiki-settings": "זיהוי ויקי זה",
     "config-db-name": "שם מסד הנתונים:",
-    "config-db-name-help": "×\91×\97ר×\95 ×©×\9d ×©×\9e×\96×\94×\94 ×\90ת ×\94×\95×\95×\99ק×\99 ×©×\9c×\9b×\9d.\n×\9c×\90 ×¦×¨×\99×\9b×\99×\9d ×\9c×\94×\99×\95ת ×\91×\95 ×¨×\95×\95×\97×\99×\9d.\n\n×\90×\9d ×\90ת×\9d משתמשים באירוח משותף, ספק האירוח שלכם ייתן לכם שם מסד נתונים מסוים שתוכלו להשתמש בו או יאפשר לכם ליצור מסד נתונים דרך לוח בקרה.",
+    "config-db-name-help": "× ×\90 ×\9c×\91×\97×\95ר ×©×\9d ×©×\9e×\96×\94×\94 ×\90ת ×\94×\95×\95×\99ק×\99 ×©×\9c×\9b×\9d.\n×\9c×\90 ×¦×¨×\99×\9b×\99×\9d ×\9c×\94×\99×\95ת ×\91×\95 ×¨×\95×\95×\97×\99×\9d.\n\n×\90×\9d ×\96×\94×\95 משתמשים באירוח משותף, ספק האירוח שלכם ייתן לכם שם מסד נתונים מסוים שתוכלו להשתמש בו או יאפשר לכם ליצור מסד נתונים דרך לוח בקרה.",
     "config-db-name-oracle": "סכמה של מסד נתונים:",
-    "config-db-account-oracle-warn": "ק×\99×\99×\9e×\99×\9d ×©×\9c×\95ש×\94 ×ª×¨×\97×\99ש×\99×\9d × ×ª×\9e×\9b×\99×\9d ×¢×\91×\95ר ×\94תקנת ×\90×\95רק×\9c ×\91ת×\95ר ×\9eס×\93 ×\94נת×\95× ×\99×\9d:\n\n×\90×\9d ×\90ת×\9d ×¨×\95צ×\99×\9d ×\9c×\99צ×\95ר ×\97ש×\91×\95×\9f ×\9eס×\93 × ×ª×\95× ×\99×\9d ×\9b×\97×\9cק ×\9eת×\94×\9c×\99×\9a ×\94×\94תקנ×\94, × ×\90 ×\9cספק ×\97ש×\91×\95×\9f ×\91×¢×\9c ×ª×¤×§×\99×\93 SYSDBA ×\91ת×\95ר ×\97ש×\91×\95×\9f ×\9eס×\93 ×\94נת×\95× ×\99×\9d ×¢×\91×\95ר ×\94×\94תקנ×\94 ×\95×\9cצ×\99×\99×\9f ×\90ת ×\94×\90×\99ש×\95ר×\99×\9d ×\94×\9e×\91×\95קש×\99×\9d ×¢×\91×\95ר ×\97ש×\91×\95×\9f ×\94×\92×\99ש×\94 ×\9c×\90×\99× ×\98רנ×\98, ×\90×\97רת × ×\99ת×\9f ×\9c×\99צ×\95ר ×\91×\90×\95פ×\9f ×\99×\93× ×\99 ×\90ת ×\97ש×\91×\95×\9f ×\94×\92×\99ש×\94 ×\9c×\90×\99× ×\98רנ×\98, ×\95×\9cספק ×\97ש×\91×\95×\9f ×\96×\94 ×\91×\9c×\91×\93 (×\90×\9d ×\99ש ×\9c×\95 ×\94×\94רש×\90×\95ת ×\94×\93ר×\95ש×\95ת ×\9c×\99צ×\99רת ×¢×¦×\9e×\99 ×¡×\9b×\9e×\94) ×\90×\95 ×\9cספק ×©× ×\99 ×\97ש×\91×\95× ×\95ת ×©×\95× ×\99×\9d, ×\90×\97×\93 ×¢×\9d ×\94רש×\90×\95ת ×\99צ×\99ר×\94 ×\95×\90×\97×\93 ×\9e×\95×\92×\91×\9cת ×¢×\91×\95ר ×\92×\99ש×\94 ×\9c×\90×\99× ×\98רנ×\98.\n\nסקר×\99פ×\98 ×\9c×\99צ×\99רת ×\97ש×\91×\95×\9f ×¢×\9d ×\94×\94רש×\90×\95ת ×\94× ×\93רש×\95ת × ×\99ת×\9f ×\9c×\9eצ×\95×\90 ×\91ת×\99ק×\99×\99×\94 \"<span dir=\"ltr\">maintenance/oracle/</span>\" ×©×\9c ×\94×\94תקנ×\94 ×\96×\95. ×\96×\9bר×\95 כי שימוש בחשבון מוגבל יגרום להשבתת כל יכולות תחזוקה עם חשבון בררת המחדל.",
+    "config-db-account-oracle-warn": "ק×\99×\99×\9e×\99×\9d ×©×\9c×\95ש×\94 ×ª×¨×\97×\99ש×\99×\9d × ×ª×\9e×\9b×\99×\9d ×¢×\91×\95ר ×\94תקנת ×\90×\95רק×\9c ×\91ת×\95ר ×\9eס×\93 ×\94נת×\95× ×\99×\9d:\n\n×\90×\9d ×\94רצ×\95× ×\9a ×\9c×\99צ×\95ר ×\97ש×\91×\95×\9f ×\9eס×\93 × ×ª×\95× ×\99×\9d ×\9b×\97×\9cק ×\9eת×\94×\9c×\99×\9a ×\94×\94תקנ×\94, × ×\90 ×\9cספק ×\97ש×\91×\95×\9f ×\91×¢×\9c ×ª×¤×§×\99×\93 SYSDBA ×\91ת×\95ר ×\97ש×\91×\95×\9f ×\9eס×\93 ×\94נת×\95× ×\99×\9d ×¢×\91×\95ר ×\94×\94תקנ×\94 ×\95×\9cצ×\99×\99×\9f ×\90ת ×\94×\90×\99ש×\95ר×\99×\9d ×\94×\9e×\91×\95קש×\99×\9d ×¢×\91×\95ר ×\97ש×\91×\95×\9f ×\94×\92×\99ש×\94 ×\9c×\90×\99× ×\98רנ×\98, ×\90×\97רת × ×\99ת×\9f ×\9c×\99צ×\95ר ×\91×\90×\95פ×\9f ×\99×\93× ×\99 ×\90ת ×\97ש×\91×\95×\9f ×\94×\92×\99ש×\94 ×\9c×\90×\99× ×\98רנ×\98, ×\95×\9cספק ×\97ש×\91×\95×\9f ×\96×\94 ×\91×\9c×\91×\93 (×\90×\9d ×\99ש ×\9c×\95 ×\94×\94רש×\90×\95ת ×\94×\93ר×\95ש×\95ת ×\9c×\99צ×\99רת ×¢×¦×\9e×\99 ×¡×\9b×\9e×\94) ×\90×\95 ×\9cספק ×©× ×\99 ×\97ש×\91×\95× ×\95ת ×©×\95× ×\99×\9d, ×\90×\97×\93 ×¢×\9d ×\94רש×\90×\95ת ×\99צ×\99ר×\94 ×\95×\90×\97×\93 ×\9e×\95×\92×\91×\9cת ×¢×\91×\95ר ×\92×\99ש×\94 ×\9c×\90×\99× ×\98רנ×\98.\n\nסקר×\99פ×\98 ×\9c×\99צ×\99רת ×\97ש×\91×\95×\9f ×¢×\9d ×\94×\94רש×\90×\95ת ×\94× ×\93רש×\95ת × ×\99ת×\9f ×\9c×\9eצ×\95×\90 ×\91ת×\99ק×\99×\99×\94 \"<span dir=\"ltr\">maintenance/oracle/</span>\" ×©×\9c ×\94×\94תקנ×\94 ×\96×\95. × ×\90 ×\9c×\96×\9b×\95ר כי שימוש בחשבון מוגבל יגרום להשבתת כל יכולות תחזוקה עם חשבון בררת המחדל.",
     "config-db-install-account": "חשבון משתמש להתקנה",
     "config-db-username": "שם המשתמש במסד הנתונים:",
     "config-db-password": "הססמה במסד הנתונים:",
     "config-db-password-empty": "נא להזין ססמה למשתמש מסד הנתונים החדש: $1.\nאף־על־פי שאפשר ליצור חשבונות ללא ססמה, זה לא מאובטח.",
-    "config-db-install-username": "הכניסו שם משתמש שישמש אתכם לחיבור למסד נתונים במהלך ההתקנה.\nזהו לא שם משתמש לחשבון במדיה־ויקי; זהו שם משתמש בשרת מסד נתונים.",
-    "config-db-install-password": "הקלידו ססמה שתשמש אתכם לצורך חיבור למסד נתונים במהלך ההתקנה.\nזוהי לא ססמה של חשבון במדיה־ויקי; זוהי ססמה לשרת מסד נתונים.",
-    "config-db-install-help": "הקלידו את שם המשתמש ואת הססמה להתחברות למסד הנתונים במהלך ההתקנה.",
+    "config-db-username-empty": "יש להזין ערך עבור \"{{int:config-db-username}}\".",
+    "config-db-install-username": "יש להכניס שם משתמש שישמש לחיבור למסד נתונים במהלך ההתקנה.\nזהו לא שם משתמש לחשבון במדיה־ויקי; זהו שם משתמש בשרת מסד נתונים.",
+    "config-db-install-password": "יש להקליד ססמה שתשמש אותך לצורך חיבור למסד נתונים במהלך ההתקנה.\nזוהי לא ססמה של חשבון במדיה־ויקי; זוהי ססמה לשרת מסד נתונים.",
+    "config-db-install-help": "יש להקליד את שם המשתמש ואת הססמה להתחברות למסד הנתונים במהלך ההתקנה.",
     "config-db-account-lock": "להשתמש באותו שם המשתמש ובאותה ססמה בזמן הפעלה רגילה",
     "config-db-wiki-account": "חשבון משתמש להפעלה רגילה",
     "config-db-wiki-help": "הקלידו את שם המשתמש והססמה לחיבור למסד הנתונים במהלך פעילות רגילה של הוויקי.\nאם החשבון אינו קיים ולחשבון שבו מתבצעת ההתקנה יש הרשאות מספיקות, החשבון הזה ייווצר עם ההרשאות המזעריות הנחוצות להפעלת הוויקי.",
     "config-db-prefix": "תחילית לטבלאות של מסד נתונים (database table prefix):",
-    "config-db-prefix-help": "×\90×\9d ×\90ת×\9d ×¦×¨×\99×\9b×\99×\9d ×\9cשתף ×\9eס×\93 × ×ª×\95× ×\99×\9d ×\90×\97×\93 ×\91×\99×\9f ×\90תר×\99 ×\95×\99ק×\99 ×©×\95× ×\99×\9d ×\90×\95 ×\91×\99×\9f ×\9e×\93×\99×\94Ö¾×\95×\99ק×\99 ×\95×\99×\99ש×\95×\9d ×\95×\91 ×\90×\97ר, ×ª×\95×\9b×\9c×\95 ×\9c×\91×\97×\95ר ×\9c×\94×\95ס×\99×£ ×ª×\97×\99×\9c×\99ת ×\95×\9b×\9c ×©×\9e×\95ת ×\94×\98×\91×\9c×\90×\95ת ×\9b×\93×\99 ×\9c×\94×\99×\9e× ×¢ ×\9e×\94תנ×\92ש×\95×\99×\95ת.\n×\90×\9c ×ª×©×ª×\9eש×\95 ברווחים.\n\nהשדה הזה בדרך כלל אמור להיות ריק.",
+    "config-db-prefix-help": "×\90×\9d × ×\97×\95×¥ ×\9c×\9a ×\9cשתף ×\9eס×\93 × ×ª×\95× ×\99×\9d ×\90×\97×\93 ×\91×\99×\9f ×\90תר×\99 ×\95×\99ק×\99 ×©×\95× ×\99×\9d ×\90×\95 ×\91×\99×\9f ×\9e×\93×\99×\94Ö¾×\95×\99ק×\99 ×\95×\99×\99ש×\95×\9d ×\95×\91 ×\90×\97ר, ×\90פשר ×\9c×\91×\97×\95ר ×\9c×\94×\95ס×\99×£ ×ª×\97×\99×\9c×\99ת ×\9c×\9b×\9c ×©×\9e×\95ת ×\94×\98×\91×\9c×\90×\95ת ×\9b×\93×\99 ×\9c×\94×\99×\9e× ×¢ ×\9e×\94תנ×\92ש×\95×\99×\95ת.\n×\90×\99×\9f ×\9c×\94שת×\9eש ברווחים.\n\nהשדה הזה בדרך כלל אמור להיות ריק.",
     "config-db-charset": "קבוצת התווים (character set) של מסד הנתונים",
     "config-charset-mysql5-binary": "MySQL 4.1/5.0 binary",
     "config-charset-mysql5": "MySQL 4.1/5.0 UTF-8",
     "config-charset-mysql4": "MySQL 4.0 backwards-compatible UTF-8",
-    "config-charset-help": "'''×\90×\96×\94ר×\94:''' ×\90×\9d ×\90ת×\9d ×\9eשת×\9eש×\99×\9d ×\91Ö¾'''backwards-compatible UTF-8''' ×\91Ö¾<span dir=\"ltr\">MySQL 4.1+</span>, ×\95×\9e×\92×\91×\99×\9d ×\90ת ×\9eס×\93 ×\94נת×\95× ×\99×\9d ×\91×\90×\9eצע×\95ת <code>mysqldump</code>, ×\96×\94 ×\99×\9b×\95×\9c ×\9c×\94ר×\95ס ×\90ת ×\9b×\9c ×ª×\95×\95×\99 ×\94Ö¾ASCII ×\95×\99×\94ר×\95ס ×\91×\90×\95פ×\9f ×\91×\9cת×\99Ö¾×\94פ×\99×\9a ×\90ת ×\94×\92×\99×\91×\95×\99×\99×\9d ×©×\9c×\9b×\9d!\n\n×\91'''×\9eצ×\91 ×\91×\99נר×\99''' (binary mode) ×\9e×\93×\99×\94Ö¾×\95×\99ק×\99 ×©×\95×\9eרת ×\98קס×\98 UTF-8 ×\91×\9eס×\93 ×\94נת×\95× ×\99×\9d ×\91ש×\93×\95ת ×\91×\99נר×\99×\99×\9d.\n×\96×\94 ×\99×¢×\99×\9c ×\99×\95תר ×\9e×\9eצ×\91 UTF-8 ×©×\9c MySQL ×\95×\9e×\90פשר ×\9c×\9b×\9d ×\9c×\94שת×\9eש ×\91×\9b×\9c ×\94×\98×\95×\95×\97 ×©×\9c ×ª×\95×\95×\99 ×\99×\95× ×\99ק×\95×\93.\n×\91'''×\9eצ×\91 UTF-8'''&rlm; (UTF-8 mode)&rlm; MySQL ×\99Öµ×\93Ö·×¢ ×\9e×\94 ×§×\91×\95צת ×\94ת×\95×\95×\99×\9d (character set) ×©×\9c ×\94×\98קס×\98 ×©×\9c×\9b×\9d ×\95×\99צ×\99×\92 ×\95×\99×\9e×\99ר ×\90×\95ת×\95 ×\91×\94ת×\90×\9d, ×\90×\91×\9c ×\9c×\90 ×\99×\90פשר ×\9c×\9b×\9d לשמור תווים שאינם נמצאים בטווח הרב־לשוני הבסיסי ([//en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes Basic Multilingual Plane]).",
+    "config-charset-help": "'''×\90×\96×\94ר×\94:''' ×©×\99×\9e×\95ש ×\91Ö¾'''backwards-compatible UTF-8''' ×\91Ö¾<span dir=\"ltr\">MySQL 4.1+</span>, ×\95×\92×\99×\91×\95×\99 ×©×\9c ×\9eס×\93 ×\94נת×\95× ×\99×\9d ×\91×\90×\9eצע×\95ת <code>mysqldump</code> ×\91×\9eצ×\91 ×\9b×\96×\94 ×\99×\9b×\95×\9c ×\9c×\94ר×\95ס ×\90ת ×\9b×\9c ×\94ת×\95×\95×\99×\9d ×©×\90×\99× ×\9d ASCII ×\95×\9cק×\9cק×\9c ×\91×\90×\95פ×\9f ×\91×\9cת×\99Ö¾×\94פ×\99×\9a ×\90ת ×\94×\92×\99×\91×\95×\99×\99×\9d ×©×\9c×\9a!\n\n×\91'''×\9eצ×\91 ×\91×\99נר×\99''' (binary mode) ×\9e×\93×\99×\94Ö¾×\95×\99ק×\99 ×©×\95×\9eרת ×\98קס×\98 UTF-8 ×\91×\9eס×\93 ×\94נת×\95× ×\99×\9d ×\91ש×\93×\95ת ×\91×\99נר×\99×\99×\9d.\n×\96×\94 ×\99×¢×\99×\9c ×\99×\95תר ×\9e×\9eצ×\91 UTF-8 ×©×\9c MySQL ×\95×\9e×\90פשר ×\9c×\9a ×\9c×\94שת×\9eש ×\91×\9b×\9c ×\94×\98×\95×\95×\97 ×©×\9c ×ª×\95×\95×\99 ×\99×\95× ×\99ק×\95×\93.\n×\91'''×\9eצ×\91 UTF-8'''&rlm; (UTF-8 mode)&rlm; MySQL ×\99Öµ×\93Ö·×¢ ×\9e×\94 ×§×\99×\93×\95×\93 ×\94ת×\95×\95×\99×\9d (character set) ×©×\9c ×\94×\98קס×\98 ×©×\9c×\9a ×\95×\99צ×\99×\92 ×\95×\99×\9e×\99ר ×\90×\95ת×\95 ×\91×\94ת×\90×\9d, ×\90×\91×\9c ×\9c×\90 ×\99×\90פשר ×\9c×\9a לשמור תווים שאינם נמצאים בטווח הרב־לשוני הבסיסי ([//en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes Basic Multilingual Plane]).",
     "config-mysql-old": "נדרשת גרסה <span dir=\"ltr\">$1</span> של MySQL או גרסה חדשה יותר. הגרסה הנוכחית שלכם היא $2.",
     "config-db-port": "פִּתְחַת מסד הנתונים (database port):",
-    "config-db-schema": "סכמה למדיה־ויקי",
-    "config-db-schema-help": "×\94סְ×\9bÖµ×\9eÖ¸×\94 ×\94×\91×\90×\94 ×\91×\93ר×\9a ×\9b×\9c×\9c ×\9eת×\90×\99×\9e×\94.\nשנ×\95 ×\90×\95ת×\94 ×¨×§ ×\90×\9d ×\90ת×\9d ×\99×\95×\93×¢×\99×\9d ×©×\90ת×\9d ×\97×\99×\99×\91×\99×\9d.",
+    "config-db-schema": "סכמה למדיה־ויקי:",
+    "config-db-schema-help": "×\94סְ×\9bÖµ×\9eÖ¸×\94 ×\94×\91×\90×\94 ×\91×\93ר×\9a ×\9b×\9c×\9c ×\9eת×\90×\99×\9e×\94.\n×\99ש ×\9cשנ×\95ת ×\90×\95ת×\94 ×¨×§ ×\90×\9d ×\90×\9d ×\96×\94 ×\9e×\9eש × ×\97×\95×¥.",
     "config-pg-test-error": "ההתחברות למסד הנתונים '''$1''' לא מצליחה: $2",
     "config-sqlite-dir": "תיקיית נתונים (data directory) של SQLite:",
-    "config-sqlite-dir-help": "SQLite ×©×\95×\9eר ×\90ת ×\9b×\9c ×\94נת×\95× ×\99×\9d ×\91ק×\95×\91×¥ ×\90×\97×\93.\n\n×\9cשרת ×\94×\95×\95×\91 ×¦×¨×\99×\9b×\94 ×\9c×\94×\99×\95ת ×\94רש×\90×\94 ×\9c×\9bת×\95×\91 ×\9cת×\99ק×\99×\99×\94 ×©×\90ת×\9d ×\9e×\92×\93×\99ר×\99×\9d.\n\n×\94×\99×\90 ×\9c×\90 ×¦×¨×\99×\9b×\94 × ×\92×\99ש×\94 ×\9c×\9b×\95×\9c×\9d ×\93ר×\9a ×\94×\90×\99× ×\98רנ×\98 â\80\93 ×\91×\92×\9c×\9c ×\96×\94 ×\90×\99× × ×\95 ×©×\9e×\99×\9d ×\90×\95ת×\94 ×\91×\90×\95ת×\95 ×\9eק×\95×\9d ×¢×\9d ×§×\95×\91צ×\99 ×\94Ö¾PHP.\n\nת×\95×\9bנת ×\94×\94תקנ×\94 ×ª×\9bת×\95×\91 ×§×\95×\91×¥ <code dir=\"ltr\">.htaccess</code> ×\99×\97×\93 ×\90ִת×\95, ×\90×\91×\9c ×\90×\9d ×\96×\94 ×\99×\99×\9bש×\9c, ×\9e×\99ש×\94×\95 ×\99×\95×\9b×\9c ×\9c×\94ש×\99×\92 ×\92×\99ש×\94 ×\9c×\9eס×\93 ×\94נת×\95× ×\99×\9d ×©×\9c×\9b×\9dשם נמצא מידע מפורש של משתמשים (כתובות דוא״ל, ססמאות מגובבות) וגם גרסאות מחוקות של דפים ומידע מוגבל אחר.\n\nכדאי לשקול לשים את מסד הנתונים במקום אחר לגמרי, למשל ב־<code dir=\"ltr\">/var/lib/mediawiki/yourwik</code>.",
+    "config-sqlite-dir-help": "SQLite ×©×\95×\9eר ×\90ת ×\9b×\9c ×\94נת×\95× ×\99×\9d ×\91ק×\95×\91×¥ ×\90×\97×\93.\n\n×\9cשרת ×\94×\95×\95×\91 ×¦×¨×\99×\9b×\94 ×\9c×\94×\99×\95ת ×\94רש×\90×\94 ×\9c×\9bת×\95×\91 ×\9cת×\99ק×\99×\99×\94 ×©×\9e×\95×\92×\93רת ×\9b×\90×\9f.\n\n×\94×\99×\90 ×\9c×\90 ×¦×¨×\99×\9b×\94 × ×\92×\99ש×\94 ×\9c×\9b×\95×\9c×\9d ×\93ר×\9a ×\94×\90×\99× ×\98רנ×\98 â\80\93 ×\91×\92×\9c×\9c ×\96×\94 ×\90×\99× × ×\95 ×©×\9e×\99×\9d ×\90×\95ת×\94 ×\91×\90×\95ת×\95 ×\9eק×\95×\9d ×¢×\9d ×§×\95×\91צ×\99 ×\94Ö¾PHP.\n\nת×\95×\9bנת ×\94×\94תקנ×\94 ×ª×\9bת×\95×\91 ×§×\95×\91×¥ <code dir=\"ltr\">.htaccess</code> ×\99×\97×\93 ×\90ִת×\95, ×\90×\91×\9c ×\90×\9d ×\96×\94 ×\99×\99×\9bש×\9c, ×\9e×\99ש×\94×\95 ×\99×\95×\9b×\9c ×\9c×\94ש×\99×\92 ×\92×\99ש×\94 ×\9c×\9eס×\93 ×\94נת×\95× ×\99×\9d ×©×\9c×\9b×\9d.\nשם נמצא מידע מפורש של משתמשים (כתובות דוא״ל, ססמאות מגובבות) וגם גרסאות מחוקות של דפים ומידע מוגבל אחר.\n\nכדאי לשקול לשים את מסד הנתונים במקום אחר לגמרי, למשל ב־<code dir=\"ltr\">/var/lib/mediawiki/yourwik</code>.",
     "config-oracle-def-ts": "מרחב טבלאות לפי בררת מחדל (default tablespace):",
     "config-oracle-temp-ts": "מרחב טבלאות זמני (temporary tablespace):",
-    "config-support-info": "מדיה־ויקי תומכת במערכות מסדי הנתונים הבאות:\n\n$1\n\nאם אינכם רואים את מסד הנתונים שלכם ברשימה, עקבו אחר ההוראות המקושרות לעיל כדי להפעיל את התמיכה.",
-    "config-support-mysql": "* $1 הוא היעד העיקרי עבור מדיה־ויקי ולו התמיכה הטובה ביותר (ר׳ [http://www.php.net/manual/en/mysql.installation.php how to compile PHP with MySQL support])",
-    "config-support-postgres": "$1 הוא מסד נתונים נפוץ בקוד פתוח והוא נפוץ בתור חלופה ל־MySQL (ר׳ [http://www.php.net/manual/en/pgsql.installation.php how to compile PHP with PostgreSQL support]). ייתכן שיש בתצורה הזאת באגים מסוימים והיא לא מומלצת לסביבות מבצעיות.",
-    "config-support-sqlite": "* $1 הוא מסד נתונים קליל עם תמיכה טובה מאוד. (ר׳ [http://www.php.net/manual/en/pdo.installation.php How to compile PHP with SQLite support], משתמש ב־PDO)",
-    "config-support-oracle": "* $1 הוא מסד נתונים עסקי מסחרי. (ר׳ [http://www.php.net/manual/en/oci8.installation.php How to compile PHP with OCI8 support])",
+    "config-type-mysql": "MySQL (או תואם)",
+    "config-type-mssql": "Microsoft SQL Server",
+    "config-support-info": "מדיה־ויקי תומכת במערכות מסדי הנתונים הבאות:\n\n$1\n\nאם אינך רואה את מסד הנתונים שלך ברשימה, יש לעקוב אחר ההוראות המקושרות לעיל כדי להפעיל את התמיכה.",
+    "config-dbsupport-mysql": "* [{{int:version-db-mysql-url}} MySQL] הוא היעד העיקרי עבור מדיה־ויקי ולו התמיכה הטובה ביותר. מדיה־ויקי עובדת גם עם [{{int:version-db-mariadb-url}} MariaDB] ועם [{{int:version-db-percona-url}} Percona Server], שתואמים ל־MySQL. (ר׳ [http://www.php.net/manual/en/mysql.installation.php how to compile PHP with MySQL support])",
+    "config-dbsupport-postgres": "* [{{int:version-db-postgres-url}} PostgreSQL] הוא מסד נתונים נפוץ בקוד פתוח והוא נפוץ בתור חלופה ל־MySQL. ייתכן שיש בתצורה הזאת באגים מסוימים והיא לא מומלצת לסביבות מבצעיות. (ר׳ [http://www.php.net/manual/en/pgsql.installation.php how to compile PHP with PostgreSQL support]).",
+    "config-dbsupport-sqlite": "* [{{int:version-db-sqlite-url}} SQLite] הוא מסד נתונים קליל עם תמיכה טובה מאוד. (ר׳ [http://www.php.net/manual/en/pdo.installation.php How to compile PHP with SQLite support], משתמש ב־PDO)",
+    "config-dbsupport-oracle": "* [{{int:version-db-oracle-url}} Oracle] הוא מסד נתונים עסקי מסחרי. (ר׳ [http://www.php.net/manual/en/oci8.installation.php How to compile PHP with OCI8 support])",
+    "config-dbsupport-mssql": "* [{{int:version-db-mssql-url}} Microsoft SQL Server] הוא מסד נתונים עסקי מסחרי לחלונות. ([http://www.php.net/manual/en/sqlsrv.installation.php How to compile PHP with SQLSRV support])",
     "config-header-mysql": "הגדרות MySQL",
     "config-header-postgres": "הגדרות PostgreSQL",
     "config-header-sqlite": "הגדרות SQLite",
     "config-header-oracle": "הגדרות Oracle",
+    "config-header-mssql": "הגדרות Microsoft SQL Server",
     "config-invalid-db-type": "סוג מסד הנתונים שגוי",
-    "config-missing-db-name": "×¢×\9c×\99×\9a ×\9c×\94×\96×\99×\9f ×¢×¨×\9a ×¢×\91×\95ר \"ש×\9d ×\9eס×\93 ×\94נת×\95× ×\99×\9d\"",
-    "config-missing-db-host": "יש להכניס ערך לשדה \"שרת מסד הנתונים\"",
-    "config-missing-db-server-oracle": "יש להכניס ערך לשדה \"TNS של מסד הנתונים\"",
-    "config-invalid-db-server-oracle": "\"$1\" ×\94×\95×\90 TNS ×\91×\9cת×\99 ×ª×§×\99×\9f.\n×\99ש ×\9c×\94שת×\9eש ×¨×§ ×\91×\90×\95ת×\99×\95ת ASCII&rlm; (a ×¢×\93 z&rlm;, A ×¢×\93 Z), ×¡Ö°×¤Ö¸×¨×\95ֹת (0 ×¢×\93 9), ×§×\95×\95×\99×\9d ×ª×\97ת×\99×\99×\9d (_) ×\95נק×\95×\93×\95ת (.).",
-    "config-invalid-db-name": "\"$1\" הוא שם מסד נתונים בלתי תקין.\nיש להשתמש רק באותיות ASCII&rlm; (a עד z&rlm;, A עד Z), סְפָרוֹת (0 עד 9), קווים תחתיים (_) ומינוסים (-).",
+    "config-missing-db-name": "×\99ש ×\9c×\94×\96×\99×\9f ×¢×¨×\9a ×¢×\91×\95ר \"{{int:config-db-name}}\".",
+    "config-missing-db-host": "יש להכניס ערך לשדה \"{{int:config-db-host}}\".",
+    "config-missing-db-server-oracle": "יש להכניס ערך לשדה \"{{int:config-db-host-oracle}}\".",
+    "config-invalid-db-server-oracle": "\"$1\" ×\94×\95×\90 TNS ×\9eס×\93־נת×\95× ×\99×\9d ×\91×\9cת×\99Ö¾â\80\8fתק×\99×\9f.\n×\99ש ×\9c×\94שת×\9eש ×\91Ö¾\"TNS name\" ×\90×\95 ×\91×\9e×\97ר×\95×\96ת \"Easy Connect\" (ר' [http://docs.oracle.com/cd/E11882_01/network.112/e10836/naming.htm Oracle Naming Methods])",
+    "config-invalid-db-name": "\"$1\" הוא שם מסד נתונים בלתי־תקין.\nיש להשתמש רק באותיות ASCII&rlm; (a עד z&rlm;, A עד Z), סְפָרוֹת (0 עד 9), קווים תחתיים (_) ומינוסים (-).",
     "config-invalid-db-prefix": "\"$1\" היא תחילית מסד נתונים בלתי תקינה.\nיש להשתמש רק באותיות ASCII&rlm; (a עד z&rlm;, A עד Z), סְפָרוֹת (0 עד 9), קווים תחתיים (_) ומינוסים (-).",
-    "config-connection-error": "<div dir=\"ltr\">$1.</div>\n\n×\91×\93ק×\95 ×\90ת ×©×\9d ×\94שרת, ×\90ת ×©×\9d ×\94×\9eשת×\9eש ×\95×\90ת ×\94סס×\9e×\94 ×\91×\98×\95פס ×\9c×\94×\9c×\9f ×\95נס×\95 שוב.",
+    "config-connection-error": "<div dir=\"ltr\">$1.</div>\n\n×\99ש ×\9c×\91×\93×\95ק ×\90ת ×©×\9d ×\94שרת, ×\90ת ×©×\9d ×\94×\9eשת×\9eש ×\95×\90ת ×\94סס×\9e×\94 ×\91×\98×\95פס ×\9c×\94×\9c×\9f ×\95×\9cנס×\95ת שוב.",
     "config-invalid-schema": "\"$1\" היא סכמה לא תקינה עבור מדיה־ויקי.\nיש להשתמש רק באותיות ASCII&rlm; (a עד z&rlm;, A עד Z), סְפָרוֹת (0 עד 9) וקווים תחתיים (_).",
     "config-db-sys-create-oracle": "תוכנית ההתקנה תומכת רק בשימוש בחשבון SYSDBA ליצירת חשבון חדש.",
     "config-db-sys-user-exists-oracle": "חשבון המשתמש \"$1\" כבר קיים. SYSDBA יכול לשמש רק ליצירת חשבון חדש!",
     "config-postgres-old": "נדרש PostgreSQL $1 או גרסה חדשה יותר, הגרסה הנוכחית שלכם היא $2.",
-    "config-sqlite-name-help": "בחרו בשם שמזהה את הוויקי שלכם.\nאל תשתמשו ברווחים או במינוסים.\nזה יהיה שם קובץ הנתונים ל־SQLite.",
-    "config-sqlite-parent-unwritable-group": "לא ניתן ליצור את תיקיית הנתונים <code><nowiki>$1</nowiki></code>, כי לשָׁרַת הווב אין הרשאות לכתוב לתיקיית האם <code><nowiki>$2</nowiki></code> .\n\nתוכנת ההתקנה זיהתה את החשבון שתחתיו רץ שרת הווב שלכם.\nאפשרו לשָׁרַת הווב לכתוב לתיקייה <code><nowiki>$3</nowiki></code>.\nבמערכת Unix/Linux כִתבו:\n\n<div dir=\"ltr\"><pre>cd $2\nmkdir $3\nchgrp $4 $3\nchmod g+w $3</pre></div>",
-    "config-sqlite-parent-unwritable-nogroup": "לא ניתן ליצור את תיקיית הנתונים <code><nowiki>$1</nowiki></code>, כי לשָׁרַת הווב אין הרשאות לכתוב לתיקיית האם <code><nowiki>$2</nowiki></code> .\n\nתוכנת ההתקנה לא זיהתה את החשבון שתחתיו רץ שרת הווב שלכם.\nאפשרו לכל החשבונות לכתוב לתיקייה <code><nowiki>$3</nowiki></code> כדי להמשיך.\nבמערכת Unix/Linux כִתבו:\n\n<div dir=\"ltr\"><pre>cd $2\nmkdir $3\nchmod a+w $3</pre></div>",
+    "config-mssql-old": "חובה להשתמש ב־Microsoft SQL Server מגרסה $1 או גרסה חדשה יותר. הגרסה שלך היא $2.",
+    "config-sqlite-name-help": "יש לבחור בשם שמזהה את הוויקי שלכם.\nאין להשתמש ברווחים או במינוסים.\nזה יהיה שם קובץ הנתונים ל־SQLite.",
+    "config-sqlite-parent-unwritable-group": "לא ניתן ליצור את תיקיית הנתונים <code><nowiki>$1</nowiki></code>, כי לשָׁרַת הווב אין הרשאות לכתוב לתיקיית האם <code><nowiki>$2</nowiki></code> .\n\nתוכנת ההתקנה זיהתה את החשבון שתחתיו רץ שרת הווב שלכם.\nיש לאפשר לשָׁרַת הווב לכתוב לתיקייה <code><nowiki>$3</nowiki></code>.\nבמערכת Unix/Linux יש לכתוב:\n\n<div dir=\"ltr\"><pre>cd $2\nmkdir $3\nchgrp $4 $3\nchmod g+w $3</pre></div>",
+    "config-sqlite-parent-unwritable-nogroup": "לא ניתן ליצור את תיקיית הנתונים <code><nowiki>$1</nowiki></code>, כי לשָׁרַת הווב אין הרשאות לכתוב לתיקיית האם <code><nowiki>$2</nowiki></code>.\n\nתוכנת ההתקנה לא זיהתה את החשבון שתחתיו רץ שרת הווב שלכם.\nיש לאפשר לכל החשבונות לכתוב לתיקייה <code><nowiki>$3</nowiki></code> כדי להמשיך.\nבמערכת Unix/Linux יש לכתוב:\n\n<div dir=\"ltr\"><pre>cd $2\nmkdir $3\nchmod a+w $3</pre></div>",
     "config-sqlite-mkdir-error": "אירעה שגיאה בעת יצירת תיקיית הנתונים \"$1\".\nנא לבדוק את המיקום ולנסות שוב.",
-    "config-sqlite-dir-unwritable": "×\90×\99Ö¾×\90פשר ×\9c×\9bת×\95×\91 ×\9cת×\99ק×\99×\99×\94 \"$1\".\nשנ×\95 ×\90ת ×\94×\94רש×\90×\95ת ×©×\9c×\94 ×\9b×\9a ×©×©×¨×ª ×\94×\95×\95×\91 ×\99×\95×\9b×\9c ×\9c×\9bת×\95×\91 ×\90×\9c×\99×\94 ×\95נס×\95 שוב.",
-    "config-sqlite-connection-error": "$1.\n\n×\91Ö´×\93ק×\95 ×\90ת ×ª×\99ק×\99×\99ת ×\94נת×\95× ×\99×\9d ×\90ת ×©×\9d ×\9eסת ×\94נת×\95× ×\99×\9d ×\9c×\94×\9c×\9f ×\95נס×\95 שוב.",
+    "config-sqlite-dir-unwritable": "×\90×\99Ö¾×\90פשר ×\9c×\9bת×\95×\91 ×\9cת×\99ק×\99×\99×\94 \"$1\".\n×\99ש ×\9cשנ×\95ת ×\90ת ×\94×\94רש×\90×\95ת ×©×\9c×\94 ×\9b×\9a ×©×©×¨×ª ×\94×\95×\95×\91 ×\99×\95×\9b×\9c ×\9c×\9bת×\95×\91 ×\90×\9c×\99×\94 ×\95×\9cנס×\95ת שוב.",
+    "config-sqlite-connection-error": "$1.\n\n×\99ש ×\9c×\91×\93×\95ק ×\90ת ×ª×\99ק×\99×\99ת ×\94נת×\95× ×\99×\9d ×\90ת ×©×\9d ×\9eס×\93 ×\94נת×\95× ×\99×\9d ×\9c×\94×\9c×\9f ×\95×\9cנס×\95ת שוב.",
     "config-sqlite-readonly": "לא ניתן לכתוב אל הקובץ <code>$1</code>.",
     "config-sqlite-cant-create-db": "לא ניתן ליצור את קובץ מסד הנתונים <code>$1</code>.",
     "config-sqlite-fts3-downgrade": "ב־PHP חסרה תמיכה ב־FTS3, יבתצע שנמוך טבלאות",
-    "config-can-upgrade": "×\99ש ×\98×\91×\9c×\90×\95ת ×\9e×\93×\99×\94Ö¾×\95×\99ק×\99 ×\91×\9eס×\93 ×\94נת×\95× ×\99×\9d.\n×\9b×\93×\99 ×\9cש×\93ר×\92 ×\90×\95ת×\9f ×\9c×\9e×\93×\99×\94Ö¾×\95×\99ק×\99 $1, ×\9c×\97צ×\95 '''המשך'''.",
-    "config-upgrade-done": "×\94ש×\93ר×\95×\92 ×\94×\95ש×\9c×\9d.\n\n×¢×\9bש×\99×\95 ×\90פשר [$1 ×\9c×\94שת×\9eש ×\91×\95×\95×\99ק×\99 ×©×\9c×\9b×\9d].\n\n×\90×\9d ×ª×¨×¦×\95 ×\9c×\99צ×\95ר ×\9e×\97×\93ש ×\90ת ×§×\95×\91×¥ ×\94Ö¾<code>LocalSettings.php</code> ×©×\9c×\9b×\9d, ×\9c×\97צ×\95 ×¢×\9c ×\94×\9bפת×\95ר ×\9c×\94×\9c×\9f.\n×\96×\94 '''×\9c×\90 ×\9e×\95×\9e×\9c×¥''', ×\90×\9c×\90 ×\90×\9d ×\9b×\9f ×\99ש ×\9c×\9b×\9d בעיות עם הוויקי שלכם.",
-    "config-upgrade-done-no-regenerate": "×\94ש×\93ר×\95×\92 ×\94×\95ש×\9c×\9d.\n\n×¢×\9bש×\99×\95 ×\90פשר [$1 ×\9c×\94ת×\97×\99×\9c ×\9c×\94שת×\9eש ×\91×\95×\95×\99ק×\99 ×©×\9c×\9b×\9d].",
+    "config-can-upgrade": "×\99ש ×\98×\91×\9c×\90×\95ת ×\9e×\93×\99×\94Ö¾×\95×\99ק×\99 ×\91×\9eס×\93 ×\94נת×\95× ×\99×\9d.\n×\9b×\93×\99 ×\9cש×\93ר×\92 ×\90×\95ת×\9f ×\9c×\9e×\93×\99×\94Ö¾×\95×\99ק×\99 $1, ×\99ש ×\9c×\9c×\97×\95×¥ ×¢×\9c '''המשך'''.",
+    "config-upgrade-done": "×\94ש×\93ר×\95×\92 ×\94×\95ש×\9c×\9d.\n\n×¢×\9bש×\99×\95 ×\90פשר [$1 ×\9c×\94שת×\9eש ×\91×\95×\95×\99ק×\99 ×©×\9c×\9a].\n\n×\90×\9d ×\91רצ×\95× ×\9a ×\9c×\99צ×\95ר ×\9e×\97×\93ש ×\90ת ×§×\95×\91×¥ ×\94Ö¾<code>LocalSettings.php</code> ×©×\9c×\9a, ×\99ש ×\9c×\9c×\97×\95×¥ ×¢×\9c ×\94×\9bפת×\95ר ×\9c×\94×\9c×\9f.\n×\96×\94 '''×\9c×\90 ×\9e×\95×\9e×\9c×¥''', ×\90×\9c×\90 ×\90×\9d ×\9b×\9f ×\99ש ×\9c×\9a בעיות עם הוויקי שלכם.",
+    "config-upgrade-done-no-regenerate": "×\94ש×\93ר×\95×\92 ×\94×\95ש×\9c×\9d.\n\n×¢×\9bש×\99×\95 ×\90פשר [$1 ×\9c×\94ת×\97×\99×\9c ×\9c×\94שת×\9eש ×\91×\95×\95×\99ק×\99 ×©×\9c×\9a].",
     "config-regenerate": "לחולל מחדש את LocalSettings.php ←",
     "config-show-table-status": "שאילתת <code>SHOW TABLE STATUS</code> נכשלה!",
     "config-unknown-collation": "'''אזהרה:''' מסד הנתונים משתמש בשיטת מיון שאינה מוּכּרת.",
     "config-db-web-help": "לבחור את שם המשתמש ואת הססמה ששרת הווב ישתמש בו להתחברות לשרת מסד הנתונים בזמן פעילות רגילה של הוויקי.",
     "config-db-web-account-same": "להשתמש באותו חשבון כמו עבור ההתקנה",
     "config-db-web-create": "ליצור חשבון אם הוא אינו קיים כבר.",
-    "config-db-web-no-create-privs": "לחשבון שהקלדתם להתקנה אין מספיק הרשאות ליצירת חשבות.\nהחשבון שאתם מקלידים כאן צריך להיות קיים.",
-    "config-mysql-engine": "×\9e× ×\92× ×\95×\9f האחסון:",
+    "config-db-web-no-create-privs": "לחשבון שהקלדת להתקנה אין מספיק הרשאות ליצירת חשבון.\nהחשבון שאתם מקלידים כאן צריך להיות קיים.",
+    "config-mysql-engine": "×\9e× ×\95×¢ האחסון:",
     "config-mysql-innodb": "InnoDB",
     "config-mysql-myisam": "MyISAM",
     "config-mysql-myisam-dep": "'''אזהרה''': בחרתם ב־MyISAM בתור מנוע אחסון של MySQL, וזה לא מומלץ מהסיבות הבאות:\n* המנוע הזה בקושי תומך בעיבוד מקבילי בגלל נעילת טבלאות\n* הוא פחות עמיד בפני אובדן מידע ממנועים אחרים\n* הקוד של מדיה־ויקי לא תמיד מטפל ב־MyISAM כפי שצריך\n\nאם התקנת MySQL שלכם תומכת ב־InnoDB, מומלץ מאוד שתבחרו באפשרות הזאת.\nאם התקנת MySQL שלכם אינה תומכת ב־InnoDB, אולי זה הזמן לשקול לשדרג אותה.",
-    "config-mysql-engine-help": "'''InnoDB''' הוא כמעט תמיד האפשרות הטובה ביותר, כי במנוע הזה יש תמיכה טובה ביותר בעיבוד מקבילי.\n\n'''MyISAM''' עשוי להיות בהתקנות שמיועדות למשתמש אחד ולהתקנות לקריאה בלבד.\nמסדי נתונים עם MyISAM נוטים להיהרס לעתים קרובות יותר מאשר מסדי נתונים עם InnoDB.",
-    "config-mysql-charset": "ערכת הקידוד של מסד הנתונים:",
+    "config-mysql-only-myisam-dep": "'''אזהרה:''' MyISAM הוא מנוע האחסון היחיד שזמין ל־MySQL במכונה הזאת, וזה לא מומלץ לשימוש עם מדיה־ויקי, כי:\n* הוא כמעט שאינו תומך בחיבורים מרובים בגלל נעילת טבלאות\n* הוא פגיע יותר לקלקול ממנועים אחרים\n* הקוד של מדיה־ויקי לא תמיד מטפל ב־MyISAM כפי שצריך\n\nהתקנת MySQL אינה תומכת ב־InnoDB, ואולי הגיע הזמן לשדרג אותה.",
+    "config-mysql-engine-help": "'''InnoDB''' היא כמעט תמיד האפשרות הטובה ביותר, כי במנוע הזה יש תמיכה טובה ביותר בעיבוד מקבילי.\n\n'''MyISAM''' עשוי להיות בהתקנות שמיועדות למשתמש אחד ולהתקנות לקריאה בלבד.\nמסדי נתונים עם MyISAM נוטים להיהרס לעתים קרובות יותר מאשר מסדי נתונים עם InnoDB.",
+    "config-mysql-charset": "קידוד התווים של מסד הנתונים:",
     "config-mysql-binary": "בינרי",
     "config-mysql-utf8": "UTF-8",
-    "config-mysql-charset-help": "ב'''מצב בינרי''' (binary mode) מדיה־ויקי שומרת טקסט UTF-8 במסד הנתונים בשדות בינריים.\nזה יעיל יותר ממצב UTF-8 של MySQL ומאפשר לכם להשתמש בכל הטווח של תווי יוניקוד.\n\nב'''מצב UTF-8'''&rlm; (UTF-8 mode)&rlm; MySQL יֵדַע מה קבוצת התווים (character set) של הטקסט שלכם ויציג וימיר אותו בהתאם, אבל לא יאפשר לכם לשמור תווים שאינם נמצאים בטווח הרב־לשוני הבסיסי ([//en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes Basic Multilingual Plane]).",
+    "config-mysql-charset-help": "ב'''מצב בינרי''' (binary mode) מדיה־ויקי שומרת טקסט UTF-8 במסד הנתונים בשדות בינריים.\nזה יעיל יותר ממצב UTF-8 של MySQL ומאפשר לכם להשתמש בכל הטווח של תווי יוניקוד.\n\nב'''מצב UTF-8'''&rlm; (UTF-8 mode)&rlm; MySQL יֵדַע מה קידוד התווים (character set) של הטקסט שלכם ויציג וימיר אותו בהתאם, אבל לא יאפשר לכם לשמור תווים שאינם נמצאים בטווח הרב־לשוני הבסיסי ([//en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes Basic Multilingual Plane]).",
+    "config-mssql-auth": "סוג אימות:",
+    "config-mssql-install-auth": "נא לבחור את סוג האימות שישמש להתחברות למסד הנתונים בזמן תהליך ההתקנה. בחירה ב־\"{{int:config-mssql-windowsauth}}\" תשתמש בהרשאות של החשבון שמריץ את השרת הנוכחי.",
+    "config-mssql-web-auth": "נא לבחור את סוג האימות שישמש את השרת להתחברות למסד הנתונים בזמן הריצה הרגילה של הוויקי.\nבחירה ב־\"{{int:config-mssql-windowsauth}}\" תשתמש בהרשאות של החשבון שמריץ את השרת הנוכחי.",
+    "config-mssql-sqlauth": "SQL Server Authentication",
+    "config-mssql-windowsauth": "Windows Authentication",
     "config-site-name": "שם הוויקי:",
     "config-site-name-help": "זה יופיע בשורת הכותרת של הדפדפן ובמקומות רבים אחרים.",
     "config-site-name-blank": "נא להזין שם לאתר.",
     "config-ns-site-name": "זהה לשם הוויקי: $1",
     "config-ns-other": "אחר (לציין)",
     "config-ns-other-default": "הוויקי שלי",
-    "config-project-namespace-help": "×\91×\94ת×\90×\9d ×\9c×\93×\95×\92×\9e×\94 ×©×\9c ×\95×\99ק×\99פ×\93×\99×\94, ×\90תר×\99 ×\95×\99ק×\99 ×¨×\91×\99×\9d ×©×\95×\9eר×\99×\9d ×¢×\9c ×\93פ×\99 ×\94×\9e×\93×\99× ×\99×\95ת ×©×\9c×\94×\9d ×\91נפר×\93 ×\9e×\93פ×\99 ×\94ת×\95×\9b×\9f ×©×\9c×\94×\9d ×\91\"'''×\9eר×\97×\91 ×\94ש×\9e×\95ת ×©×\9c ×\94×\9e×\99×\96×\9d'''\" (\"'''project namespace'''\").\n×\9b×\9c ×©×\9e×\95ת ×\94×\93פ×\99×\9d ×\91×\9eר×\97×\91 ×\94ש×\9e×\95ת ×\94×\96×\94 ×\9eת×\97×\99×\9c×\99×\9d ×\91ת×\97×\99×\9c×\99ת ×\9eס×\95×\99×\9eת ×©×\90ת×\9d ×\99×\9b×\95×\9c×\99×\9d ×\9c×\94×\92×\93×\99ר ×\9b×\90×\9f.\n×\91×\90×\95פ×\9f ×\9eס×\95רת×\99 התחילית הזאת מבוססת על שם הוויקי, והיא אינה יכולה להכיל תווי פיסוק כגון \"#\" או \":\".",
-    "config-ns-invalid": "×\9eר×\97×\91 ×\94ש×\9e×\95ת \"<nowiki>$1</nowiki>\" ×\90×\99× ×\95 ×ª×§×\99×\9f.\n×\94ק×\9c×\99×\93×\95 שם אחר למרחב השמות של המיזם.",
-    "config-ns-conflict": "מרחב השמות שהגדרתם \"<nowiki>$1</nowiki>\" מתנגש עם מרחב שמות מובנה של מדיה־ויקי.\nהגדירו מרחב שמות מיזם שונה.",
+    "config-project-namespace-help": "×\91×\94ת×\90×\9d ×\9c×\93×\95×\92×\9e×\94 ×©×\9c ×\95×\99ק×\99פ×\93×\99×\94, ×\90תר×\99 ×\95×\99ק×\99 ×¨×\91×\99×\9d ×©×\95×\9eר×\99×\9d ×¢×\9c ×\93פ×\99 ×\94×\9e×\93×\99× ×\99×\95ת ×©×\9c×\94×\9d ×\91נפר×\93 ×\9e×\93פ×\99 ×\94ת×\95×\9b×\9f ×©×\9c×\94×\9d ×\91\"'''×\9eר×\97×\91 ×\94ש×\9e×\95ת ×©×\9c ×\94×\9e×\99×\96×\9d'''\" (\"'''project namespace'''\").\n×\9b×\9c ×©×\9e×\95ת ×\94×\93פ×\99×\9d ×\91×\9eר×\97×\91 ×\94ש×\9e×\95ת ×\94×\96×\94 ×\9eת×\97×\99×\9c×\99×\9d ×\91ת×\97×\99×\9c×\99ת ×\9eס×\95×\99×\9eת ×©×\90פשר ×\9c×\94×\92×\93×\99ר ×\9b×\90×\9f.\n×\91×\93ר×\9a ×\9b×\9c×\9c התחילית הזאת מבוססת על שם הוויקי, והיא אינה יכולה להכיל תווי פיסוק כגון \"#\" או \":\".",
+    "config-ns-invalid": "×\9eר×\97×\91 ×\94ש×\9e×\95ת \"<nowiki>$1</nowiki>\" ×\90×\99× ×\95 ×ª×§×\99×\9f.\n×\99ש ×\9c×\94ק×\9c×\99×\93 שם אחר למרחב השמות של המיזם.",
+    "config-ns-conflict": "מרחב השמות שהגדרת \"<nowiki>$1</nowiki>\" מתנגש עם מרחב שמות מובנה של מדיה־ויקי.\nהגדירו מרחב שמות מיזם שונה.",
     "config-admin-box": "חשבון מפעיל",
-    "config-admin-name": "ש×\9e×\9b×\9d:",
+    "config-admin-name": "ש×\9d ×\94×\9eשת×\9eש ×©×\9c×\9a:",
     "config-admin-password": "ססמה:",
     "config-admin-password-confirm": "הססמה שוב:",
-    "config-admin-help": "×\94ק×\9c×\99×\93×\95 ×\9b×\90×\9f ×\90ת ×©×\9d ×\94×\9eשת×\9eש, ×\9c×\9eש×\9c \"שק×\93 ×\9c×\95×\99\" ×\90×\95 \"Joe Bloggs\".\n×\96×\94 ×\94ש×\9d ×©×\99ש×\9eש ×\90ת×\9b×\9d כדי להיכנס לוויקי.",
+    "config-admin-help": "×\94ק×\9c×\99×\93×\95 ×\9b×\90×\9f ×\90ת ×©×\9d ×\94×\9eשת×\9eש, ×\9c×\9eש×\9c \"שק×\93 ×\9c×\95×\99\" ×\90×\95 \"Joe Bloggs\".\n×\96×\94 ×\94ש×\9d ×©×\99ש×\9eש ×\90×\95ת×\9a כדי להיכנס לוויקי.",
     "config-admin-name-blank": "נא להזין את שם המשתמש של המפעיל.",
-    "config-admin-name-invalid": "ש×\9d ×\94×\9eשת×\9eש ×©×\94×\95ק×\9c×\93 \"<nowiki>$1</nowiki>\" ×\90×\99× ×\95 ×ª×§×\99×\9f.\n×\94ק×\9c×\99×\93×\95 שם משתמש אחר.",
+    "config-admin-name-invalid": "ש×\9d ×\94×\9eשת×\9eש ×©×\94×\95ק×\9c×\93 \"<nowiki>$1</nowiki>\" ×\90×\99× ×\95 ×ª×§×\99×\9f.\n×\99ש ×\9c×\94ק×\9c×\99×\93 שם משתמש אחר.",
     "config-admin-password-blank": "הקלידו ססמה לחשבון המפעיל.",
-    "config-admin-password-same": "הססמה לא יכולה להיות זהה לשם המשתמש.",
     "config-admin-password-mismatch": "שתי הססמאות שהוזנו אינן מתאימות.",
     "config-admin-email": "כתובת הדוא״ל:",
-    "config-admin-email-help": "×\94ק×\9c×\99×\93×\95 ×\9bת×\95×\91ת ×\93×\95×\90×´×\9c ×©×ª×\90פשר ×\9c×\9b×\9d ×\9cק×\91×\9c ×\9e×\9bת×\91×\99×\9d ×\9e×\9eשת×\9eש×\99×\9d ×\90×\97ר×\99×\9d ×\91×\95×\95×\99ק×\99, ×\9c×\90ת×\97×\9c ×\90ת ×\94סס×\9e×\94, ×\95×\9cק×\91×\9c ×\94×\95×\93×¢×\95ת ×¢×\9c ×©×\99× ×\95×\99×\99×\9d ×\91×\93פ×\99×\9d ×\91רש×\99×\9eת ×\94×\9eעק×\91 ×©×\9c×\9b×\9d. אפשר להשאיר את השדה הזה ריק.",
+    "config-admin-email-help": "×\99ש ×\9c×\94ק×\9c×\99×\93 ×\9bת×\95×\91ת ×\93×\95×\90×´×\9c ×\9b×\93×\99 ×©×ª×\94×\99×\94 ×\90פשר×\95ת ×\9cק×\91×\9c ×\9e×\9bת×\91×\99×\9d ×\9e×\9eשת×\9eש×\99×\9d ×\90×\97ר×\99×\9d ×\91×\95×\95×\99ק×\99, ×\9c×\90ת×\97×\9c ×\90ת ×\94סס×\9e×\94, ×\95×\9cק×\91×\9c ×\94×\95×\93×¢×\95ת ×¢×\9c ×©×\99× ×\95×\99×\99×\9d ×\91×\93פ×\99×\9d ×\91רש×\99×\9eת ×\94×\9eעק×\91. אפשר להשאיר את השדה הזה ריק.",
     "config-admin-error-user": "שגיאה פנימית ביצירת מפעיל בשם \"<nowiki>$1</nowiki>\".",
     "config-admin-error-password": "שגיאה פנימית בהגדרת ססמה עבור המפעיל \"<nowiki>$1</nowiki>\"&rlm;: <pre>$2</pre>",
-    "config-admin-error-bademail": "הכנסתם כתובת דוא״ל לא תקינה.",
+    "config-admin-error-bademail": "הכנסת כתובת דוא״ל לא תקינה.",
     "config-subscribe": "להירשם ל[https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce רשימת התפוצה עם הודעות על גרסאות חדשות].",
     "config-subscribe-help": "זוהי רשימת תפוצה עם הודעות מעטות שמשמשת להודעות על הוצאת גרסאות, כולל עדכוני אבטחה חשובים.\nמומלץ להירשם אליה ולעדכן את מדיה־ויקי כאשר יוצאות גרסאות חדשות.",
-    "config-subscribe-noemail": "ניסיתם להירשם לרשימת תפוצה של הודעות בלי לתת כתובת דוא\"ל.\nנא לתת כתובת דוא\"ל אם אתם רוצים להירשם לרשימת התפוצה.",
-    "config-almost-done": "כמעט סיימתם!\nאפשר לדלג על שאר ההגדרות ולהתקין את הוויקי כבר עכשיו.",
+    "config-subscribe-noemail": "ניסית להירשם לרשימת תפוצה של הודעות בלי לתת כתובת דוא\"ל.\nנא לתת כתובת דוא\"ל אם ברצונך להירשם לרשימת התפוצה.",
+    "config-almost-done": "כמעט סיימת!\nאפשר לדלג על שאר ההגדרות ולהתקין את הוויקי כבר עכשיו.",
     "config-optional-continue": "הצגת שאלות נוספות.",
     "config-optional-skip": "משעמם לי, תתקינו לי כבר את הוויקי הזה.",
     "config-profile": "תסריט הרשאות משתמשים:",
-    "config-profile-wiki": "×\95×\99ק×\99 ×¤×\99ת×\95×\97",
+    "config-profile-wiki": "ויקי פתוח",
     "config-profile-no-anon": "נדרשת יצירת חשבון",
     "config-profile-fishbowl": "עורכים מורשים בלבד",
     "config-profile-private": "ויקי פרטי",
-    "config-profile-help": "×\90תר×\99 ×\95×\99ק×\99 ×¢×\95×\91×\93×\99×\9d ×\94×\9b×\99 ×\98×\95×\91 ×\9b×\90שר ×\90ת×\9d ×\9e×\90פשר×\99×\9d ×\9c×\9b×\9e×\94 ×©×\99×\95תר ×\90נש×\99×\9d ×\9cער×\95×\9a ×\90×\95ת×\9d.\n×\91×\9e×\93×\99×\94Ö¾×\95×\99ק×\99 ×§×\9c ×\9cסק×\95ר ×\90ת ×\94ש×\99× ×\95×\99×\99×\9d ×\94×\90×\97ר×\95× ×\99×\9d ×\95×\9cש×\97×\96ר ×\9b×\9c × ×\96ק ×©×¢×\95ש×\99×\9d ×\9eשת×\9eש×\99×\9d ×ª×\9e×\99×\9e×\99×\9d ×\90×\95 ×\9eש×\97×\99ת×\99×\9d.\n\n×¢×\9d ×\96×\90ת, ×\90נש×\99×\9d ×©×\95× ×\99×\9d ×\9eצ×\90×\95 ×\9c×\9e×\93×\99×\94Ö¾×\95×\99ק×\99 ×©×\99×\9e×\95ש×\99×\9d ×\9e×\92×\95Ö¼×\95× ×\99×\9d ×\95×\9cעת×\99×\9d ×\9c×\90 ×§×\9c ×\9cש×\9b× ×¢ ×\90ת ×\9b×\95×\9c×\9d ×\91×\99תר×\95× ×\95ת ×©×\9c \"×\93ר×\9a ×\94×\95×\95×\99ק×\99\" ×\94×\9eס×\95רת×\99ת. ×\95×\9c×\9b×\9f ×\99ש ×\9c×\9b×\9d בררה.\n\nבאתר מסוג '''{{int:config-profile-wiki}}''' – לכולם יש הרשאה לערוך, אפילו בלי להיכנס לחשבון.\nבאתר וויקי מסוג '''{{int:config-profile-no-anon}}''' יש ביטחון גדול יותר, אבל הגדרה כזאת יכולה להרתיע תורמים מזדמנים.\n\nבתסריט '''{{int:config-profile-fishbowl}}''' רק משתמשים שקיבלו אישור יכולים לערוך, אבל כל הגולשים יכולים לקרוא את הדפים ואת גרסאותיהם הקודמות.\nב'''{{int:config-profile-private}}''' רק משתמשים שקיבלו אישור יכולים לקרוא ולערוך דפים.\n\nהגדרות מורכבות של הרשאות אפשריות אחרי ההתקנה, ר׳ את [//www.mediawiki.org/wiki/Manual:User_rights הפרק על הנושא הזה בספר ההדרכה].",
+    "config-profile-help": "×\90תר×\99 ×\95×\99ק×\99 ×¢×\95×\91×\93×\99×\9d ×\94×\9b×\99 ×\98×\95×\91 ×\9b×\90שר ×\94×\9d ×\9e×\90פשר×\99×\9d ×\9c×\9b×\9e×\94 ×©×\99×\95תר ×\90נש×\99×\9d ×\9cער×\95×\9a ×\90×\95ת×\9d.\n×\91×\9e×\93×\99×\94Ö¾×\95×\99ק×\99 ×§×\9c ×\9cסק×\95ר ×\90ת ×\94ש×\99× ×\95×\99×\99×\9d ×\94×\90×\97ר×\95× ×\99×\9d ×\95×\9cש×\97×\96ר ×\9b×\9c × ×\96ק ×©×¢×\95ש×\99×\9d ×\9eשת×\9eש×\99×\9d ×ª×\9e×\99×\9e×\99×\9d ×\90×\95 ×\9eש×\97×\99ת×\99×\9d.\n\n×¢×\9d ×\96×\90ת, ×\90נש×\99×\9d ×©×\95× ×\99×\9d ×\9eצ×\90×\95 ×\9c×\9e×\93×\99×\94Ö¾×\95×\99ק×\99 ×©×\99×\9e×\95ש×\99×\9d ×\9e×\92×\95Ö¼×\95× ×\99×\9d ×\95×\9cעת×\99×\9d ×\9c×\90 ×§×\9c ×\9cש×\9b× ×¢ ×\90ת ×\9b×\95×\9c×\9d ×\91×\99תר×\95× ×\95ת ×©×\9c \"×\93ר×\9a ×\94×\95×\95×\99ק×\99\" ×\94×\9eס×\95רת×\99ת. ×\95×\9c×\9b×\9f ×\99ש ×\9c×\9a בררה.\n\nבאתר מסוג '''{{int:config-profile-wiki}}''' – לכולם יש הרשאה לערוך, אפילו בלי להיכנס לחשבון.\nבאתר וויקי מסוג '''{{int:config-profile-no-anon}}''' יש ביטחון גדול יותר, אבל הגדרה כזאת יכולה להרתיע תורמים מזדמנים.\n\nבתסריט '''{{int:config-profile-fishbowl}}''' רק משתמשים שקיבלו אישור יכולים לערוך, אבל כל הגולשים יכולים לקרוא את הדפים ואת גרסאותיהם הקודמות.\nב'''{{int:config-profile-private}}''' רק משתמשים שקיבלו אישור יכולים לקרוא ולערוך דפים.\n\nהגדרות מורכבות של הרשאות אפשריות אחרי ההתקנה, ר׳ את [//www.mediawiki.org/wiki/Manual:User_rights הפרק על הנושא הזה בספר ההדרכה].",
     "config-license": "זכויות יוצרים ורישיון:",
     "config-license-none": "ללא כותרת תחתית עם רישיון",
     "config-license-cc-by-sa": "קריאייטיב קומונז–ייחוס–שיתוף זהה",
     "config-license-cc-0": "קריאייטיב קומונז אפס (נחלת הכלל)",
     "config-license-gfdl": "רישיון חופשי למסמכים של גנו גרסה 1.3 או חדשה יותר",
     "config-license-pd": "נחלת הכלל",
-    "config-license-cc-choose": "×\91×\97ר×\95 רישיון קריאייטיב קומונז מותאם אישית",
-    "config-license-help": "אתרי ויקי ציבוריים רבים מפרסמים את כל התרומות תחת [http://freedomdefined.org/Definition רישיון חופשי].\nזה עוזר ליצור תחושה של בעלות קהילתית ומעודד תרומה לאורך זמן.\nזה בדרך כלל לא נחוץ לאתר ויקי פרטי או בחברה מסחרית.\n\nאם אתם רוצים אפשרות להשתמש בטקסט מוויקיפדיה ואתם רוצים שוויקיפדיה תוכל לקבל עותקים של טקסטים מהוויקי שלכם, כדאי לכם לבחור ב'''רישיון קריאייטיב קומונז ייחוס–שיתוף זהה''' (CC BY-SA).\n\nויקיפדיה השתמשה בעבר ברישיון החופשי למסמכים של גנו (GNU FDL או GFDL).\nהוא עדיין רישיון תקין, אבל קשה להבנה.\nכמו־כן, קשה לעשות שימוש חוזר ביצירות שפורסמו לפי GFDL.",
+    "config-license-cc-choose": "×\91×\97×\99רת רישיון קריאייטיב קומונז מותאם אישית",
+    "config-license-help": "אתרי ויקי ציבוריים רבים מפרסמים את כל התרומות [http://freedomdefined.org/Definition ברישיון חופשי].\nזה עוזר ליצור תחושה של בעלות קהילתית ומעודד תרומה לאורך זמן.\nזה בדרך כלל לא נחוץ לאתר ויקי פרטי או אתר של חברה מסחרית.\n\nאם האפשרות להשתמש בטקסט מוויקיפדיה והאפשרות שוויקיפדיה תוכל תקבל עותקים של טקסטים מהוויקי שלך חשובות לך, כדאי לבחור ב'''רישיון קריאייטיב קומונז ייחוס–שיתוף זהה''' (CC BY-SA).\n\nויקיפדיה השתמשה בעבר ברישיון החופשי למסמכים של גנו (GNU FDL או GFDL).\nהוא עדיין רישיון תקין, אבל קשה להבנה.\nכמו־כן, קשה לעשות שימוש חוזר ביצירות שפורסמו לפי GFDL.",
     "config-email-settings": "הגדרות דוא״ל",
     "config-enable-email": "להפעיל דוא״ל יוצא",
     "config-enable-email-help": "אם אתם רוצים שדוא״ל יעבוד, [http://www.php.net/manual/en/mail.configuration.php אפשרויות הדוא״ל של PHP] צריכות להיות מוגדרות נכון.\nאם אינכם רוצים להפעיל שום אפשרויות דוא״ל, כבו אותן כאן ועכשיו.",
     "config-upload-deleted": "תיקיית לקבצים שנמחקו:",
     "config-upload-deleted-help": "בחרו את התיקייה לארכוב קבצים מחוקים.\nכדאי שזה לא יהיה נגיש לכל העולם דרך הרשת.",
     "config-logo": "כתובת הסמל:",
-    "config-logo-help": "המראה ההתחלתי של מדיה־ויקי מכיל מקום לסמל של 135 על 160 פיקסלים בפינה העליונה מעל תפריט הצד.\nיש להעלות תמונה בגודל מתאים ולהכניס את הכתובת כאן.\n\nאם אינכם רוצים סמל, השאירו את התיבה הזאת ריקה.",
+    "config-logo-help": "×\94×\9eר×\90×\94 ×\94×\94ת×\97×\9cת×\99 ×©×\9c ×\9e×\93×\99×\94Ö¾×\95×\99ק×\99 ×\9e×\9b×\99×\9c ×\9eק×\95×\9d ×\9cס×\9e×\9c ×©×\9c 135 ×¢×\9c 160 ×¤×\99קס×\9c×\99×\9d ×\91פ×\99× ×\94 ×\94×¢×\9c×\99×\95× ×\94 ×\9e×¢×\9c ×ª×¤×¨×\99×\98 ×\94צ×\93.\n×\99ש ×\9c×\94×¢×\9c×\95ת ×ª×\9e×\95× ×\94 ×\91×\92×\95×\93×\9c ×\9eת×\90×\99×\9d ×\95×\9c×\94×\9b× ×\99ס ×\90ת ×\94×\9bת×\95×\91ת ×\9b×\90×\9f.\n\n×\91×\90פשר×\95ת×\9a ×\9c×\94שת×\9eש ×\91Ö¾<code dir=\"ltr\">$wgStylePath</code> ×\90×\95 ×\91Ö¾<code dir=\"ltr\">$wgScriptPath</code> ×\90×\9d ×\94ס×\9e×\9c ×©×\9c×\9a × ×\9eצ×\90 ×\91×\9eק×\95×\9d ×\99×\97ס×\99 ×\9cנת×\99×\91×\99×\9d ×\94×\90×\9c×\94.\n\n×\90×\9d ×\90×\99× ×\9b×\9d ×¨×\95צ×\99×\9d ×¡×\9e×\9c, ×\94ש×\90×\99ר×\95 ×\90ת ×\94ת×\99×\91×\94 ×\94×\96×\90ת ×¨×\99ק×\94.",
     "config-instantcommons": "להפעיל את Instant Commons",
     "config-instantcommons-help": "[//www.mediawiki.org/wiki/InstantCommons Instant Commons] היא תכונה שמאפשרת לאתרי ויקי להשתמש בתמונות, בצלילים ובמדיה אחרת שנמצאת באתר [//commons.wikimedia.org/ ויקישיתוף] (Wikimedia Commons).\nכדי לעשות את זה, מדיה־ויקי צריך לגשת לאינטרנט.\n\nלמידע נוסף על התכונה הזאת, כולל הוראות איך להפעיל את זה לאתרי ויקי שאינם ויקישיתוף, ר׳ [//mediawiki.org/wiki/Manual:$wgForeignFileRepos את ספר ההדרכה].",
     "config-cc-error": "בורר רישיונות קריאייטיב קומונז לא החזיר שום תוצאה.\nהקלידו את שם הרישיון ידנית.",
     "config-memcached-servers": "שרתי Memcached:",
     "config-memcached-help": "רשימת כתובות IP ש־Memcached ישתמש בהן.\nיש לרשום כתובת אחת בכל שורה ולציין את הפִּתְחָה (port), למשל:\n 127.0.0.1:11211\n 192.168.1.25:1234",
     "config-memcache-needservers": "בחרת ב־Memcached בתתור סוג המטמון שלכם, אבל לא הגדרתם שום שרת.",
-    "config-memcache-badip": "×\94ק×\9c×\93ת×\9d ×\9bת×\95×\91ת IP ×\91×\9cת×\99 ×ª×§×\99× ×\94 ×\9cÖ¾Memcached&lrm;: $1.",
+    "config-memcache-badip": "×\9bת×\95×\91ת ×\94Ö¾IP ×©×\94ק×\9c×\93ת ×¢×\91×\95ר Memcached ×\91×\9cת×\99־תק×\99× ×\94: $1.",
     "config-memcache-noport": "לא הגדרתם פתחה לשימוש שרת Memcached&rlm;: $1.\nאם אינכם יודעים את מספר הפתחה, בררת המחדל היא 11211.",
     "config-memcache-badport": "מספרי פתחה של Memcached צריכים להיות בין $1 ל־$2",
     "config-extensions": "הרחבות",
     "config-extensions-help": "ההרחבות ברשימה לעיל התגלו בתיקיית <span dir=\"ltr\"><code>./extensions</code></span> שלכם.\n\nייתכן שזה ידרוש הגדרות נוספות, אבל תוכלו להפעיל אותן עכשיו.",
     "config-install-alreadydone": "'''אזהרה:''' נראה שכבר התקנתם את מדיה־ויקי ואתם מנסים להתקין אותה שוב.\nאנה התקדמו לדף הבא.",
-    "config-install-begin": "כשתלחצו על \"{{int:config-continue}}\", תתחילו את ההתקנה של מדיה־ויקי.\nאם אתם עדיין רוצים לשנות משהו, לחצו על \"{{int:config-back}}\"",
+    "config-install-begin": "כשתלחצו על \"{{int:config-continue}}\", תתחילו את ההתקנה של מדיה־ויקי.\nאם אתם עדיין רוצים לשנות משהו, לחצו על \"{{int:config-back}}\".",
     "config-install-step-done": "בוצע",
     "config-install-step-failed": "נכשל",
     "config-install-extensions": "כולל הרחבות",
     "config-install-tables-failed": "'''שגיאה:''' יצירת הטבלה נכשלה עם השגיאה הבאה: $1",
     "config-install-interwiki": "אכלוס טבלת בינוויקי התחלתית",
     "config-install-interwiki-list": "קריאת הקובץ <code>interwiki.list</code> לא הצליחה.",
-    "config-install-interwiki-exists": "'''אזהרה:''': נראה שבטבלת הבינוויקי כבר יש רשומות.\nמדלג על הרשומה ההתחלתית.",
+    "config-install-interwiki-exists": "'''אזהרה:''' נראה שבטבלת הבינוויקי כבר יש רשומות.\nמדלג על הרשומה ההתחלתית.",
     "config-install-stats": "אתחול סטטיסטיקות",
     "config-install-keys": "יצירת מפתחות סודיים",
     "config-insecure-keys": "'''אזהרה''': {{PLURAL:$2|מפתח|מפתחות}} אבטחה ($1) {{PLURAL:$2|שנוצר|שנוצרו}} במהלך ההתקנה {{PLURAL:$2|אינו בטוח|אינם בטוחים}} מספיק. מומלץ לשקול לשנות {{PLURAL:$2|אותו|אותם}} ידנית.",
     "config-install-sysop": "יצירת חשבון מפעיל",
     "config-install-subscribe-fail": "הרישום ל־mediawiki-announce לא הצליח: $1",
     "config-install-subscribe-notpossible": "cURL אינה מותקנת ו־allow_url_fopen אינה זמינה.",
-    "config-install-mainpage": "יצירת דף ראשי עם תוכן התחלתי.",
+    "config-install-mainpage": "יצירת דף ראשי עם תוכן התחלתי",
     "config-install-extension-tables": "יצירת טבלאות להרחבות מופעלות",
     "config-install-mainpage-failed": "לא הצליחה הכנסת דף ראשי: $1.",
     "config-install-done": "'''מזל טוב!'''\nהתקנתם בהצלחה את מדיה־ויקי.\n\nתוכנת ההתקנה יצרה את הקובץ <code>LocalSettings.php</code>.\nהוא מכיל את כל ההגדרות שלכם.\n\nתצטרכו להוריד אותו ולשים אותו בבסיס ההתקנה של הוויקי שלכם (אותה התיקייה שבה נמצא הקובץ index.php). ההורדה הייתה אמורה להתחיל באופן אוטומטי.\n\nאם ההורדה לא התחילה, או אם ביטלתם אותה, אפשר להתחיל אותה מחדש בלחיצה על הקישור הבא:\n\n$3\n\n'''שימו לב''': אם לא תעשו זאת עכשיו, קובץ ההגדרות המחוּלל לא יהיה זמין לכם שוב.\n\nאחרי שתעשו את זה, תוכלו '''[$2 להיכנס לוויקי שלכם]'''.",
     "config-download-localsettings": "הורדת <code>LocalSettings.php</code>",
     "config-help": "עזרה",
     "config-nofile": "הקובץ \"$1\" לא נמצא. האם הוא נמחק?",
+    "config-extension-link": "הידעת שמדיה־ויקי תומכת ב־[//www.mediawiki.org/wiki/Manual:Extensions הרחבות]?\n\nבאפשרותך לעיין ב־[//www.mediawiki.org/wiki/Category:Extensions_by_category הרחבות לפי קטגוריה] או ב־[//www.mediawiki.org/wiki/Extension_Matrix מטריצת ההרחבות] לרשימה מלאה של הרחבות.",
     "mainpagetext": "'''תוכנת מדיה־ויקי הותקנה בהצלחה.'''",
     "mainpagedocfooter": "היעזרו ב[//meta.wikimedia.org/wiki/Help:Contents מדריך למשתמש] למידע על שימוש בתוכנת הוויקי.\n\n== קישורים שימושיים ==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings רשימת ההגדרות]\n* [//www.mediawiki.org/wiki/Manual:FAQ שאלות ותשובות על מדיה־ויקי]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce רשימת התפוצה על השקת גרסאות]\n* [//www.mediawiki.org/wiki/Localisation#Translation_resources תרגום מדיה־ויקי לשפה שלך]"
 }
index 44e2183..1c5f718 100644 (file)
@@ -1,7 +1,49 @@
 {
     "@metadata": {
-        "authors": []
+        "authors": [
+            "Smtchahal",
+            "Vivek Rai"
+        ]
     },
+    "config-information": "जानकारी",
+    "config-localsettings-badkey": "आपकी दी गई कुंजी ग़लत है।",
+    "config-your-language": "आपकी भाषा:",
+    "config-wiki-language": "विकी भाषा:",
+    "config-back": "← वापस",
+    "config-continue": "आगे बढ़ें →",
+    "config-page-language": "भाषा",
+    "config-page-welcome": "मीडियाविकी पर आपका स्वागत है!",
+    "config-page-dbconnect": "डेटाबेस से जुड़ें",
+    "config-page-name": "नाम",
+    "config-page-options": "विकल्प",
+    "config-page-install": "स्थापित करें",
+    "config-page-complete": "पूर्ण!",
+    "config-page-restart": "स्थापना को पुनरारंभ करें",
+    "config-page-readme": "मुझे पढ़ें",
+    "config-page-existingwiki": "मौजूदा विकि",
+    "config-restart": "हाँ, इसे पुनः आरंभ करें",
+    "config-env-php": "PHP $1 स्थापित किया गया है।",
+    "config-env-php-toolow": "PHP $1 स्थापित किया गया है।\nतथापि, मीडियाविकि PHP $2 या उच्चतर की आवश्यकता है।",
+    "config-mssql-auth": "प्रमाणन प्रकार:",
+    "config-mssql-sqlauth": "SQL सर्वर प्रमाणन",
+    "config-site-name": "विकि का नाम:",
+    "config-project-namespace": "प्रकल्प नामस्थान:",
+    "config-ns-generic": "प्रकल्प",
+    "config-ns-other": "अन्य (निर्दिष्ट करें)",
+    "config-ns-other-default": "मेरा विकि",
+    "config-admin-password": "कूटशब्द:",
+    "config-admin-password-confirm": "फिर से कूटशब्द:",
+    "config-admin-email": "ईमेल पता:",
+    "config-optional-continue": "मुझसे और सवाल पूछें।",
+    "config-optional-skip": "मैं पहले से ही ऊब चुका हूँ, बस विकि स्थापित करें।",
+    "config-profile-wiki": "खुला विकि",
+    "config-profile-no-anon": "खाता बनाने की आवश्यकता",
+    "config-profile-fishbowl": "केवल प्रमाषित संपादक ही",
+    "config-profile-private": "निजी विकि",
+    "config-email-watchlist": "ध्यानसूची अधिसूचना को सक्षम करें",
+    "config-extensions": "एक्सटेंशन",
+    "config-help": "सहायता",
+    "config-nofile": "फ़ाइल \"$1\" नहीं पाई जा सकी। क्या इसे हटा दिया गया है?",
     "mainpagetext": "'''मीडियाविकिका इन्स्टॉलेशन पूरा हो गया हैं ।'''",
     "mainpagedocfooter": "विकि सॉफ्टवेयरके इस्तेमाल के लिये [//meta.wikimedia.org/wiki/Help:Contents उपयोगकर्ता गाईड] देखें ।\n\n== शुरुवात करें ==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings कॉन्फिगरेशन सेटींगकी सूची]\n* [//www.mediawiki.org/wiki/Manual:FAQ मीडियाविकिके बारे में प्राय: पूछे जाने वाले सवाल]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce मीडियाविकि मेलिंग लिस्ट]"
-}
\ No newline at end of file
+}
index 9db833b..70cc44e 100644 (file)
@@ -6,4 +6,4 @@
     },
     "mainpagetext": "'''MediaWiki ke safalta se install kar dewa gais hai.'''",
     "mainpagedocfooter": "Wiki software ke use kare ke aur jaankari ke khatir [//meta.wikimedia.org/wiki/Help:Contents User's Guide] ke dekho.\n\n== Getting started ==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Configuration settings list]\n* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]"
-}
\ No newline at end of file
+}
index 8822f9b..b745591 100644 (file)
@@ -6,4 +6,4 @@
     },
     "mainpagetext": "'''Ang MediaWiki madinalag-on nga na-instala.'''",
     "mainpagedocfooter": " Magkonsulta sa [//meta.wikimedia.org/wiki/Help:Contents User's Guide] para sa mga impormasyon sa paggamit sang wiki nga software.\n\n== Pag-umpisa ==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Lista sang mga konpigorasyon sang pagkay-o]\n* [//www.mediawiki.org/wiki/Manual:FAQ Mga Masami Pamangkoton sa MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lista sang mga ginapadal-an sang sulat kon may paguha-on nga MediaWiki]"
-}
\ No newline at end of file
+}
index 6b14f7a..1a17a61 100644 (file)
@@ -1,7 +1,5 @@
 {
-    "@metadata": {
-        "authors": []
-    },
+    "@metadata": [],
     "mainpagetext": "'''Softver MediaWiki je uspješno instaliran.'''",
     "mainpagedocfooter": "Pogledajte [//meta.wikimedia.org/wiki/MediaWiki_localisation dokumentaciju o prilagodbi sučelja]\ni [//meta.wikimedia.org/wiki/MediaWiki_User%27s_Guide Vodič za suradnike] za pomoć pri uporabi i podešavanju."
-}
\ No newline at end of file
+}
index f6e557f..2a40574 100644 (file)
@@ -14,7 +14,7 @@
     "config-localsettings-badkey": "Kluč, kotryž sy podał, je wopak",
     "config-upgrade-key-missing": "Eksistowaca instalacija MediaWiki je so wotkryła.\nZo by tutu instalaciju aktualizował, staj prošu slědowacu linku deleka w dataji <code>LocalSettings.php</code>:\n\n$1",
     "config-localsettings-incomplete": "Zda so, zo eksistwoaca dataja <code>LocalSettings.php</code> je njedospołna.\nWariabla $1 njeje nastajena.\nProšu změń dataju <code>LocalSettings.php</code>, zo by so tuta wariabla nastajiła a klikń na \"{{int:Config-continue}}\".",
-    "config-localsettings-connection-error": "Při zwjazowanju z datowej banku z pomocu nastajenjow podatych w <code>LocalSettings.php</code> abo <code>AdminSettings.php</code> je zmylk wustupił. Prošu skoriguj tute nastajenja a spytaj hišće raz.\n\n$1",
+    "config-localsettings-connection-error": "Při zwjazowanju z datowej banku z pomocu nastajenjow podatych w <code>LocalSettings.php</code> je zmylk wustupił. Prošu skoriguj tute nastajenja a spytaj hišće raz.\n\n$1",
     "config-session-error": "Zmylk při startowanju posedźenja: $1",
     "config-session-expired": "Zda so, zo twoje posedźenske daty su spadnjene.\nPosedźenja su za čas žiwjenja $1 skonfigurowane.\nMóžeš jón přez nastajenje <code>session.gc_maxlifetime</code> w php.ini powyšić.\nStartuj instalaciski proces znowa.",
     "config-no-session": "Twoje posedźenske daty su so zhubili!\nSkontroluj swój php.ini a zawěsć, zo <code>session.save_path</code> je na prawy zapis nastajeny.",
     "config-env-php-toolow": "PHP $1 je instalowany.\nAle MediaWiki wužaduje sej PHP $2 abo wyši.",
     "config-unicode-using-utf8": "Za normalizaciju Unicode so utf8_normalize.so Briona Vibbera wužiwa.",
     "config-unicode-using-intl": "Za normalizaciju Unicode so [http://pecl.php.net/intl PECL-rozšěrjenje intl] wužiwa.",
-    "config-no-db": "Njeda so přihódny ćěrjak datoweje banki namakać! Dyrbiš ćěrjak datoweje banki za PHP instalować.\nSlědowace typy datoweje banki so podpěruja: $1.\n\nJeli wužiwaš zhromadnje wužiwany serwer, proš swojeho poskićowarja, zo by přihódny ćěrjak datoweje banki instalował.\nJeli sy PHP sam kompilował, konfiguruj jón znowa z aktiwizowanym programom datoweje banki, na přikład z pomocu <code>./configure --with-mysql</code>.\nJeli sy PHP z Debianoweho abo Ubuntuoweho paketa instalował, dyrbiš tež modul php5-mysql instalować.",
+    "config-no-db": "Njeda so přihódny ćěrjak datoweje banki namakać! Dyrbiš ćěrjak datoweje banki za PHP instalować.\nSlědowace typy datoweje banki so podpěruja: $1.\n\nJeli sy PHP sam kompilował, konfiguruj jón znowa z aktiwizowanym programom datoweje banki, na přikład z pomocu <code>./configure --with-mysqli</code>.\nJeli sy PHP z Debianoweho abo Ubuntuoweho paketa instalował, dyrbiš tež paket <code>php5-mysql</code> instalować.",
     "config-outdated-sqlite": "'''Warnowanje''': maš SQLite $1, kotryž je starši hač minimalna trěbna wersija $2. SQLite njebudźe k dispoziciji stać.",
     "config-no-fts3": "'''Warnowanje''': SQLite je so bjez [//sqlite.org/fts3.html FTS3-modula] kompilował, pytanske funkcije njebudu k dispoziciji stać.",
     "config-register-globals": "'''Warnowanje: Funkcija <code>[http://php.net/register_globals register_globals]</code> PHP je zmóžnjena.'''\n'''Znjemóžń ju, jeli móžeš.'''\nMediaWiki budźe fungować, ale twój serwer je potencielnym wěstotnym njedostatkam wustajeny.",
-    "config-ze1": "'''Chutny zmylk: [http://www.php.net/manual/en/ini.core.php zend.ze1_compatibility_mode] je aktiwny!'''\nTuta opcija zawinuje grawěrowace zmylki při MediaWiki.\nNjemóžeš MediaWiki instalować abo wužiwać, chibazo tuta opcija je znjemóžnjena.",
     "config-safe-mode": "'''Warnowanje:''' [http://www.php.net/features.safe-mode wěsty modus] PHP je aktiwny.\nTo móže problemy zawinować, předewšěm, jeli so datajowe nahraća a podpěra <code>math</code> wužiwaja.",
     "config-xml-bad": "XML-modul za PHP faluje.\nMediaWiki trjeba funkcije w tutym modulu a njebudźe w tutej konfiguraciji fungować.\nJeli wužiwaš Mandrake, instaluj paket php-xml.",
-    "config-pcre": "Zda so, zo modul za PCRE-podpěru faluje.\nMediaWiki trjeba z Perl kompatibelne funkcije za regularne wurazy, zo by fungował.",
     "config-pcre-no-utf8": "'''Ćežki zmylk''': Zda so, zo PCRE-modul za PHP ma so bjez PCRE_UTF8-podpěry kompilować.\nMediaWiki trjeba UTF-8-podpěru, zo by korektnje fungował.",
     "config-memory-raised": "PHP-parameter <code>memory_limit</code> je $1, je so na hódnotu $2 zwyšił.",
     "config-memory-bad": "'''Warnowanje:''' PHP-parameter <code>memory_limit</code> ma hódnotu $1,\nTo je najskerje přeniske.\nInstalacija móhła so njeporadźić!",
@@ -65,7 +63,7 @@
     "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache] je instalowany",
     "config-diff3-bad": "GNU diff3 njenamakany.",
     "config-no-uri": "'''Zmylk:''' Aktualny URI njeda so postajić.\nInstalacija bu přetorhnjena.",
-    "config-no-cli-uri": "'''Warnowanje''': Žana skriptowa šćežka (--scriptpath) podata, standard so wužiwa: <code>$1</code>.",
+    "config-no-cli-uri": "'''Warnowanje''': Žana skriptowa šćežka (<code>--scriptpath</code>) podata, standard so wužiwa: <code>$1</code>.",
     "config-using-server": "Serwerowe mjeno \"<nowiki>$1</nowiki>\" so wužiwa.",
     "config-using-uri": "Serwerowy URL \"<nowiki>$1$2</nowiki>\" so wužiwa.",
     "config-db-type": "Typ datoweje banki:",
     "config-sqlite-dir": "Zapis SQLite-datow:",
     "config-oracle-def-ts": "Standardny tabelowy rum:",
     "config-oracle-temp-ts": "Nachwilny tabelowy rum:",
-    "config-type-mysql": "MySQL",
+    "config-type-mysql": "MySQL (abo kompatibelny)",
     "config-type-postgres": "PostgreSQL",
     "config-type-sqlite": "SQLite",
     "config-type-oracle": "Oracle",
-    "config-support-mysql": "* $1 je primarny cil za MediaWiki a podpěruje so najlěpje ([http://www.php.net/manual/en/mysql.installation.php Nawod ke kompilowanju  PHP z  MySQL-podpěru])",
-    "config-support-postgres": "* $1 je popularny system datoweje banki zjawneho žórła jako alternatiwa k MySQL ([http://www.php.net/manual/en/pgsql.installation.php nawod za kompilowanje PHP z podpěru PostgreSQL]). Móhło hišće někotre zmylki eksistować, a njeporuča so jón w produktiwnej wokolinje wužiwać.",
-    "config-support-oracle": "* $1 je komercielna předewzaćelska datowa banka. ([http://www.php.net/manual/en/oci8.installation.php Nawod za kompilowanje PHP z OCI8-podpěru])",
+    "config-dbsupport-mysql": "* [{{int:version-db-mysql-url}} MySQL] je primarny cil za MediaWiki a podpěruje so najlěpje. MediaWiki funguje tež z [{{int:version-db-mariadb-url}} MariaDB] a [{{int:version-db-percona-url}} Percona Server], kotrejž stej kompatibelnej z MySQL. ([http://www.php.net/manual/en/mysqli.installation.php Nawod ke kompilowanju  PHP z  MySQL-podpěru])",
+    "config-dbsupport-postgres": "* [{{int:version-db-postgres-url}} PostgreSQL] je popularny system datoweje banki zjawneho žórła jako alternatiwa k MySQL. Móhło hišće někotre zmylki eksistować, a njeporuča so jón w produktiwnej wokolinje wužiwać. ([http://www.php.net/manual/en/pgsql.installation.php Nawod za kompilowanje PHP z podpěru PostgreSQL])",
+    "config-dbsupport-oracle": "* [{{int:version-db-oracle-url}} Oracle] je komercielna předewzaćelska datowa banka. ([http://www.php.net/manual/en/oci8.installation.php Nawod za kompilowanje PHP z OCI8-podpěru])",
     "config-header-mysql": "Nastajenja MySQL",
     "config-header-postgres": "Nastajenja PostgreSQL",
     "config-header-sqlite": "Nastajenja SQLite",
     "config-missing-db-name": "Dyrbiš hódnotu za \"Mjeno datoweje banki\" zapodać",
     "config-missing-db-host": "Dyrbiš hódnotu za \"Database host\" zapodać",
     "config-missing-db-server-oracle": "Dyrbiš hódnotu za \"Database TNS\" zapodać",
-    "config-invalid-db-server-oracle": "Njepłaćiwa datowa banka TNS \"$1\".\nWužij jenož pismiki ASCII (a-z, A-Z), ličby (0-9), podsmužki (_) a dypki (.).",
+    "config-invalid-db-server-oracle": "Njepłaćiwa datowa banka TNS \"$1\".\nWužij pak \"TNS Name\" pak znamješkowy rjećazk \"Easy Connect\" ([http://docs.oracle.com/cd/E11882_01/network.112/e10836/naming.htm Oracle - pomjenowanske metody])",
     "config-invalid-db-name": "Njepłaćiwe mjeno \"$1\" datoweje banki.\nWužij jenož pismiki ASCII (a-z, A-Z), ličby (0-9),a podsmužki (_) a wjazawki (-).",
     "config-invalid-db-prefix": "Njepłaćiwy prefiks \"$1\" datoweje banki.\nWužij jenož pismiki ASCII (a-z, A-Z), ličby (0-9), podsmužki (_) a wjazawki (-).",
     "config-connection-error": "$1.\n\nSkontroluj serwer, wužiwarske a hesło a spytaj hišće raz.",
     "config-ns-invalid": "Podaty mjenowy rum \"<nowiki>$1</nowiki>\" je njepłaćiwy.\nPodaj druhi projektowy mjenowy rum.",
     "config-ns-conflict": "Podaty mjenowy rum \"<nowiki>$1</nowiki>\" je w konflikće ze standardnym mjenjowym rumom MediaWiki.\nPodaj druhi projektowy mjenowy rum.",
     "config-admin-box": "Administratorowe konto",
-    "config-admin-name": "Twoje mjeno:",
+    "config-admin-name": "Twoje wužiwarske mjeno:",
     "config-admin-password": "Hesło:",
     "config-admin-password-confirm": "Hesło wospjetować:",
     "config-admin-help": "Zapodaj swoje preferowane wužiwarske mjeno, na přikład \"Jurij Serb\".\nTo je mjeno, kotrež budźeš wužiwać, zo by so do wikija přizjewił.",
     "config-admin-name-blank": "Zapodaj administratorowe wužiwarske mjeno.",
     "config-admin-name-invalid": "Podate wužiwarske mjeno \"<nowiki>$1</nowiki>\" je njepłaćiwe.\nPodaj druhe wužiwarske mjeno.",
     "config-admin-password-blank": "Zapodaj hesło za administratorowe konto.",
-    "config-admin-password-same": "Hesło dyrbi so wot wužiwarskeho mjena rozeznać.",
     "config-admin-password-mismatch": "Wobě hesle, kotrejž sy zapodał, njejstej jenakej.",
     "config-admin-email": "E-mejlowa adresa:",
     "config-admin-email-help": "Zapodaj tu e-mejlowu adresu, zo by přijimanje e-mejlow wot druhich wužiwarjow w tutym wikiju zmóžnił, swoje hesło wróćo stajił a zdźělenki wo změnach na swojich wobkedźbowanych stronach  dostał. Móžeš polo prózdne wostajić.",
     "config-nofile": "Dataja \"$1\" njeje so namakała. Je so zhašała?",
     "mainpagetext": "'''MediaWiki bu wuspěšnje instalowany.'''",
     "mainpagedocfooter": "Prošu hlej [//meta.wikimedia.org/wiki/Help:Contents dokumentaciju] za informacije wo wužiwanju softwary.\n\n== Za nowačkow ==\n\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Wo nastajenjach]\n* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]\n* [//www.mediawiki.org/wiki/Localisation#Translation_resources MediaWiki za twoju rěč lokalizować]"
-}
\ No newline at end of file
+}
index 30e4e6b..ea75ad0 100644 (file)
@@ -6,4 +6,4 @@
     },
     "mainpagetext": "'''MedyaWiki byen enstale l.'''",
     "mainpagedocfooter": "Konsilte [//meta.wikimedia.org/wiki/Help:Konteni Gid Itilizatè] pou enfòmasyon sou kijan pou w itilize logisyèl wiki a.\n\n== Kijan pou kòmanse ==\n\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Lis paramèt yo pou konfigirasyon]\n* [//www.mediawiki.org/wiki/Manyèl:FAQ MediaWiki FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lis diskisyon ki parèt sou MediaWiki]"
-}
\ No newline at end of file
+}
index 733a0f9..6353200 100644 (file)
@@ -2,10 +2,11 @@
     "@metadata": {
         "authors": [
             "Dani",
-            "Glanthor Reviol"
+            "Glanthor Reviol",
+            "Tacsipacsi"
         ]
     },
-    "config-localsettings-upgrade": "'''Figyelmeztetés''': már létezik a <code>LocalSettings.php</code> fájl.\nA szoftver frissíthető.\nAdja meg a <code>$wgUpgradeKey</code>-ben található kulcsot a beviteli mezőben",
+    "config-localsettings-upgrade": "Már létezik a <code>LocalSettings.php</code> fájl.\nA telepített szoftver frissítéséhez írja be az alábbi mezőbe a <code>$wgUpgradeKey</code> beállítás értékét, melyet a <code>LocalSettings.php</code> nevű fájlban találhat meg.",
     "config-session-expired": "Úgy tűnik, hogy a munkamenetadatok lejártak.\nA munkamenetek élettartama a következőre van beállítva: $1.\nAz érték növelhető a php.ini <code>session.gc_maxlifetime</code> beállításának módosításával.\nIndítsa újra a telepítési folyamatot.",
     "config-no-session": "Elvesztek a munkamenetadatok!\nEllenőrizze, hogy a php.ini-ben a <code>session.save_path</code> beállítás a megfelelő könyvtárra mutat-e.",
     "config-your-language-help": "Válassza ki a telepítési folyamat során használandó nyelvet.",
     "config-page-welcome": "Üdvözli a MediaWiki!",
     "config-help-restart": "Szeretné törölni az eddig megadott összes adatot és újraindítani a telepítési folyamatot?",
     "config-welcome": "=== Környezet ellenőrzése ===\nAlapvető ellenőrzés, ami megmondja, hogy a környezet alkalmas-e a MediaWiki számára.\nHa probléma merülne fel a telepítés során, meg kell adnia mások számára az alább megjelenő információkat.",
-    "config-unicode-pure-php-warning": "'''Figyelmeztetés''': Az [http://pecl.php.net/intl intl PECL kiterjesztés] nem érhető el Unicode normalizáláshoz.\nHa nagy látogatottságú oldalt üzemeltet, itt találhat információkat [//www.mediawiki.org/wiki/Unicode_normalization_considerations a témáról].",
+    "config-unicode-pure-php-warning": "<strong>Figyelmeztetés:</strong> Az [http://pecl.php.net/intl intl PECL kiterjesztés] nem érhető el Unicode normalizáláshoz, helyette a lassú, PHP alapú implementáció lesz használva.\nHa nagy látogatottságú oldalt üzemeltet, itt találhat információkat [http://www.mediawiki.org/wiki/Unicode_normalization_considerations a témáról].",
     "config-register-globals": "'''Figyelmeztetés: A PHP <code>[http://php.net/register_globals register_globals]</code> beállítása engedélyezve van.'''\n'''Tiltsa le, ha van rá lehetősége.'''\nA MediaWiki működőképes a beállítás használata mellett, de a szerver biztonsági kockázatnak lesz kitéve.",
     "config-imagemagick": "Az ImageMagick megtalálható a rendszeren: <code>$1</code>.\nA bélyegképek készítése engedélyezve lesz, ha engedélyezi a feltöltéseket.",
-    "config-db-name-help": "Válassza ki a wikije azonosítására használt nevet.\nNem tartalmazhat szóközt vagy kötőjelet.\n\nHa megosztott webtárhelyet használ, a szolgáltatója vagy egy konkrét adatbázisnevet ad önnek használatra, vagy létrehozhat egyet a vezérlőpulton keresztül.",
+    "config-db-name-help": "Válassza ki a wikije azonosítására használt nevet.\nNem tartalmazhat szóközt.\n\nHa megosztott webtárhelyet használ, a szolgáltatója vagy egy konkrét adatbázisnevet ad önnek használatra, vagy létrehozhat egyet a vezérlőpulton keresztül.",
     "config-db-install-help": "Adja meg a felhasználónevet és jelszót, amivel a telepítő csatlakozhat az adatbázishoz.",
     "config-db-wiki-help": "Adja meg azt a felhasználónevet és jelszót, amivel a wiki fog csatlakozni az adatbázishoz működés közben.\nHa a fiók nem létezik és a telepítést végző fiók rendelkezik megfelelő jogosultsággal, egy új fiók készül a megadott a névvel, azon minimális jogosultságkörrel, ami a wiki működéséhez szükséges.",
     "config-charset-help": "'''Figyelmezetés:''' Ha a '''visszafelé kompatibilis UTF-8''' beállítást használja MySQL 4.1 vagy újabb verziók esetén, és utána a <code>mysqldump</code> programmal készít róla biztonsági másolatot, az tönkreteheti az összes nem ASCII-karaktert, visszafordíthatatlanul károsítva a másolatokban tárolt adatokat!\n\n'''Bináris''' módban a MediaWiki az UTF-8-ban kódolt szöveget bináris mezőkben tárolja az adatbázisban.\nEz sokkal hatékonyabb a MySQL UTF-8-módjától, és lehetővé teszi, hogy a teljes Unicode-karakterkészletet használja.\n'''UTF-8-módban''' MySQL tudja, hogy milyen karakterkészlettel van kódolva az adat, megfelelően van megjelenítve és konvertálva, de\nnem használhatja a [//en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes Basic Multilingual Plane] feletti karaktereket.",
@@ -28,5 +29,5 @@
     "config-admin-password-blank": "Adja meg az adminisztrátori fiók jelszavát!",
     "config-instantcommons-help": "Az [//www.mediawiki.org/wiki/InstantCommons Instant Commons] lehetővé teszi, hogy a wikin használhassák a [//commons.wikimedia.org/ Wikimedia Commons] oldalon található képeket, hangokat és más médiafájlokat.\nA használatához a MediaWikinek internethozzáférésre van szüksége.\n\nA funkcióról és hogy hogyan állítható be más wikik esetén [//mediawiki.org/wiki/Manual:$wgForeignFileRepos a kézikönyvben] találhat további információkat.",
     "config-install-done": "'''Gratulálunk!'''\nSikeresen telepítette a MediaWikit.\n\nA telepítő készített egy <code>LocalSettings.php</code> fájlt.\nEz tartalmazza az összes beállítást.\n\n[$1 Le kell töltenie], és el kell helyeznie a MediaWiki telepítési könyvtárába (az a könyvtár, ahol az index.php van).\n'''Megjegyzés''': Ha ezt most nem teszi meg, és kilép, a generált fájl nem lesz elérhető a későbbiekben.\n\nHa ezzel készen van, '''[$2 beléphet a wikibe]'''.",
-    "mainpagedocfooter": "Ha segítségre van szüksége a wikiszoftver használatához, akkor keresse fel a [//meta.wikimedia.org/wiki/Help:Contents User's Guide] oldalt.\n\n== Alapok (angol nyelven) ==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Beállítások listája]\n* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki GyIK]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki-kiadások levelezőlistája]"
-}
\ No newline at end of file
+    "mainpagedocfooter": "Ha segítségre van szüksége a wikiszoftver használatához, akkor keresse fel a [//meta.wikimedia.org/wiki/Help:Contents User's Guide] oldalt.\n\n== Alapok (angol nyelven) ==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Beállítások listája]\n* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki GyIK]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki-kiadások levelezőlistája]\n* [//www.mediawiki.org/wiki/Localisation#Translation_resources A MediaWiki fordítása a saját nyelvére]"
+}
index 0447d17..b0141b1 100644 (file)
@@ -3,7 +3,10 @@
         "authors": [
             "Dani",
             "Glanthor Reviol",
-            "아라"
+            "아라",
+            "Dj",
+            "Misibacsi",
+            "Tacsipacsi"
         ]
     },
     "config-desc": "A MediaWiki telepítője",
@@ -15,7 +18,7 @@
     "config-localsettings-badkey": "A megadott kulcs érvénytelen.",
     "config-upgrade-key-missing": "A telepítő a MediaWiki meglévő példányát észlelte.\nA telepített rendszer frissítéséhez helyezd el az alábbi sort a <code>LocalSettings.php</code> végére:\n\n$1",
     "config-localsettings-incomplete": "A meglévő <code>LocalSettings.php</code> hiányosnak tűnik.\nA(z) $1 változó értéke nincs beállítva.\nMódosítsd a <code>LocalSettings.php</code> fájlt úgy, hogy ez a változó be legyen állítva, majd kattints a „{{int:Config-continue}}” gombra.",
-    "config-localsettings-connection-error": "Nem sikerült csatlakozni az adatbázishoz a <code>LocalSettings.php</code>-ben vagy az <code>AdminSettings.php</code>-ben megadott adatokkal. Ellenőrizd a beállításokat, majd próbáld újra.\n\n$1",
+    "config-localsettings-connection-error": "Nem sikerült csatlakozni az adatbázishoz a <code>LocalSettings.php</code>-ben megadott adatokkal. Ellenőrizd a beállításokat, majd próbáld újra.\n\n$1",
     "config-session-error": "Nem sikerült elindítani a munkamenetet: $1",
     "config-session-expired": "Úgy tűnik, hogy a munkamenetadatok lejártak.\nA munkamenetek élettartama a következőre van beállítva: $1.\nAz érték növelhető a php.ini <code>session.gc_maxlifetime</code> beállításának módosításával.\nIndítsd újra a telepítési folyamatot.",
     "config-no-session": "Elvesztek a munkamenetadatok!\nEllenőrizd, hogy a php.ini-ben a <code>session.save_path</code> a megfelelő könyvtárra mutat-e.",
@@ -42,7 +45,7 @@
     "config-page-existingwiki": "Létező wiki",
     "config-help-restart": "Szeretnéd törölni az eddig megadott összes adatot és újraindítani a telepítési folyamatot?",
     "config-restart": "Igen, újraindítás",
-    "config-welcome": "=== A környezet ellenőrzése ===\nNéhány alapvető ellenőrzés lett végrehajtva, ami meghatározza, hogy ez a környezet alkalmas-e a MediaWiki telepítésére.\nHa telepítéssel kapcsolatos segítségre van szükséged, add meg ezen ellenőrzések eredményét.",
+    "config-welcome": "=== A környezet ellenőrzése ===\nNéhány alapvető ellenőrzés kerül végrehajtásra, hogy kiderüljön ,hogy ez a környezet alkalmas-e a MediaWiki telepítésére.\nHa telepítéssel kapcsolatos segítségre van szükséged, add meg ezen ellenőrzések eredményét.",
     "config-copyright": "=== Licenc és feltételek ===\n\n$1\n\nEz a program szabad szoftver; terjeszthető illetve módosítható a Free Software Foundation által kiadott GNU General Public License dokumentumában leírtak; akár a licenc 2-es, akár (tetszőleges) későbbi változata szerint.\n\nEz a program abban a reményben kerül közreadásra, hogy hasznos lesz, de minden egyéb '''garancia nélkül''', az '''eladhatóságra''' vagy '''valamely célra való alkalmazhatóságra''' való származtatott garanciát is beleértve. További részleteket a GNU General Public License tartalmaz.\n\nA felhasználónak a programmal együtt meg kell kapnia a <doclink href=Copying>GNU General Public License egy példányát</doclink>; ha mégsem kapta meg, akkor írjon a Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. címre, vagy [http://www.gnu.org/copyleft/gpl.html tekintse meg online].",
     "config-sidebar": "* [//www.mediawiki.org A MediaWiki honlapja]\n* [//www.mediawiki.org/wiki/Help:Contents Felhasználói kézikönyv]\n* [//www.mediawiki.org/wiki/Manual:Contents Útmutató adminisztrátoroknak]\n* [//www.mediawiki.org/wiki/Manual:FAQ GyIK]\n----\n* <doclink href=Readme>Ismertető</doclink>\n* <doclink href=ReleaseNotes>Kiadási megjegyzések</doclink>\n* <doclink href=Copying>Másolás</doclink>\n* <doclink href=UpgradeDoc>Frissítés</doclink>",
     "config-env-good": "A környezet ellenőrzése befejeződött.\nA MediaWiki telepíthető.",
     "config-unicode-using-intl": "A rendszer Unicode normalizálására az [http://pecl.php.net/intl intl PECL kiterjesztést] használja.",
     "config-unicode-pure-php-warning": "'''Figyelmeztetés''': Az Unicode normalizáláshoz szükséges [http://pecl.php.net/intl intl PECL kiterjesztés] nem érhető el, helyette a lassú, PHP alapú implementáció lesz használva.\nHa nagy látogatottságú oldalt üzemeltetsz, itt találhatsz további információkat [//www.mediawiki.org/wiki/Unicode_normalization_considerations a témáról].",
     "config-unicode-update-warning": "'''Figyelmeztetés''': Az Unicode normalizáláshoz szükséges burkolókönyvtár [http://site.icu-project.org/ ICU projekt] függvénykönyvtárának régebbi változatát használja.\nHa ügyelni kívánsz a Unicode használatára, fontold meg a [//www.mediawiki.org/wiki/Unicode_normalization_considerations frissítését].",
-    "config-no-db": "Nem sikerült egyetlen használható adatbázis-illesztőprogramot sem találni.  Telepítened kell egyet a PHP-hez.\nA következő adatbázistípusok támogatottak: $1.\n\nHa megosztott tárhelyszolgáltatást használsz, kérd meg a szolgáltatódat, hogy telepítsen egy megfelelő illesztőprogramot.\nHa a PHP-t magad fordítottad, konfiguráld újra úgy, hogy engedélyezve legyen egy adatbáziskliens, pl. a <code>./configure --with-mysql</code> parancs használatával.\nHa a PHP-t Debian vagy Ubuntu csomaggal telepítetted, akkor szükséged lesz a php5-mysql modulra is.",
+    "config-no-db": "Nem sikerült egyetlen használható adatbázis-illesztőprogramot sem találni.  Telepítened kell egyet a PHP-hez.\nA következő adatbázistípusok támogatottak: $1.\n\nHa a PHP-t magad fordítottad, konfiguráld újra úgy, hogy engedélyezve legyen egy adatbáziskliens, pl. a <code>./configure --with-mysql</code> parancs használatával.\nHa a PHP-t Debian vagy Ubuntu csomaggal telepítetted, akkor szükséged lesz a php5-mysql modulra is.",
     "config-no-fts3": "'''Figyelmeztetés''': Az SQLite [//sqlite.org/fts3.html FTS3 modul] nélkül lett fordítva, a keresési funkciók nem fognak működni ezen a rendszeren.",
     "config-register-globals": "'''Figyelmeztetés: A PHP <code>[http://php.net/register_globals register_globals]</code> beállítása engedélyezve van.'''\n'''Tiltsd le, ha van rá lehetőséged.'''\nA MediaWiki működőképes a beállítás használata mellett, de a szerver biztonsági kockázatnak lesz kitéve.",
     "config-magic-quotes-runtime": "'''Kritikus hiba: a [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-runtime magic_quotes_runtime] aktív!'''\nEz a beállítás kiszámíthatatlan károkat okoz a bevitt adatokban.\nA MediaWiki csak akkor telepíthető, ha ki van kapcsolva.",
     "config-magic-quotes-sybase": "'''Kritikus hiba: a [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-runtime magic_quotes_sybase] aktív!'''\nEz a beállítás kiszámíthatatlan károkat okoz a bevitt adatokban.\nA MediaWiki csak akkor telepíthető, ha ki van kapcsolva.",
     "config-mbstring": "'''Kritikus hiba: az [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-runtime mbstring.func_overload] aktív!'''\nEz a beállítás hibákat okoz és kiszámíthatatlanul károsíthatja bevitt adatokat.\nA MediaWiki csak akkor telepíthető, ha ki van kapcsolva.",
-    "config-ze1": "'''Kritikus hiba: a [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-runtime magic_quotes_sybase] aktív!'''\nEz a beállítás borzalmas hibákat okoz a MediaWiki futása során.\nA MediaWiki csak akkor telepíthető, ha ki van kapcsolva.",
     "config-safe-mode": "'''Figyelmeztetés:''' A PHP [http://www.php.net/features.safe-mode safe mode]-ja be van kapcsolva.\nProblémákat okozhat, különösen a fájlfeltöltéseknél és a <code>math</code>-támogatás használatánál.",
     "config-xml-bad": "A PHP XML-modulja hiányzik.\nEgyes MediaWiki-funkciók, melyek ezt a modult igénylik, nem fognak működni ilyen beállítások mellett.\nHa Madrake-et futtatsz, telepítsd a php-xml csomagot.",
-    "config-pcre": "Úgy tűnik, hogy a PCRE támogató modul hiányzik.\nA MediaWikinek Perl-kompatibilis reguláriskifejezés-függvényekre van szüksége a működéshez.",
+    "config-pcre-old": "<strong>Kritikus hiba:</strong> PCRE $1 vagy későbbi szükséges.\nA Te PHP binárisod PCRE $2-vel lett linkelve.\n[https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/PCRE További információ].",
     "config-pcre-no-utf8": "'''Kritikus hiba''': Úgy tűnik, hogy a PHP PRCE modulja PRCE_UTF8 támogatás nélkül lett fordítva.\nA MediaWikinek UTF-8-támogatásra van szüksége a helyes működéshez.",
     "config-memory-raised": "A PHP <code>memory_limit</code> beállításának értéke: $1. Meg lett növelve a következő értékre: $2.",
     "config-memory-bad": "'''Figyelmeztetés:''' A PHP <code>memory_limit</code> beállításának értéke $1.\nEz az érték valószínűleg túl kevés, a telepítés sikertelen lehet.",
+    "config-ctype": "<strong>Kritikus hiba:</strong> A PHP-t [http://www.php.net/manual/en/ctype.installation.php Ctype kiterjesztés] támogatással kell fordítani.",
     "config-xcache": "Az [http://xcache.lighttpd.net/ XCache] telepítve van",
     "config-apc": "Az [http://www.php.net/apc APC] telepítve van",
     "config-wincache": "A [http://www.iis.net/download/WinCacheForPhp WinCache] telepítve van",
     "config-using-server": "A következő szervernév használata: „<nowiki>$1</nowiki>”.",
     "config-using-uri": "A következő szerver URL-cím használata: „<nowiki>$1$2</nowiki>”.",
     "config-uploads-not-safe": "'''Figyelmeztetés:''' a feltöltésekhez használt alapértelmezett könyvtárban (<code>$1</code>) tetszőleges külső szkript futtatható.\nHabár a MediaWiki ellenőrzi a feltöltött fájlokat az efféle biztonsági veszélyek megtalálása érdekében, a feltöltés engedélyezése előtt erősen ajánlott a [//www.mediawiki.org/wiki/Manual:Security#Upload_security a sérülékenység megszüntetése].",
-    "config-brokenlibxml": "A rendszereden a PHP és libxml2 verziók olyan kombinációja található meg, ami hibásan működik, és észrevehetetlen adatkárosodást okoz a MediaWikiben és más webalkalmazásokban.\nFrissíts a PHP 5.2.9-es vagy újabb, valamint a libxml2 2.7.3 vgy újabb verziójára ([//bugs.php.net/bug.php?id=45996 A hiba bejelentése a PHP-nél]).\nTelepítés megszakítva.",
-    "config-using531": "A MediaWiki nem használható a PHP $1-es verziójával, mert hiba van a <code>__call()</code> függvénynek átadott referenciaparaméterekkel.\nA probléma kiküszöböléséhez frissíts a PHP 5.3.2-es verziójára, vagy használd a korábbi, 5.3.0-ásat.\nTelepítés megszakítva.",
+    "config-brokenlibxml": "A rendszereden a PHP és libxml2 verziók olyan kombinációja található meg, ami hibásan működik, és észrevehetetlen adatkárosodást okoz a MediaWikiben és más webalkalmazásokban.\nFrissíts a libxml2 2.7.3 vgy újabb verziójára ([https://bugs.php.net/bug.php?id=45996 A hiba bejelentése a PHP-nél]).\nTelepítés megszakítva.",
     "config-suhosin-max-value-length": "A Suhosin telepítve van, és a GET paraméter hosszát $1 bájtra korlátozza. A MediaWiki erőforrásbetöltő összetevője megkerüli a problémát, de így csökkenni fog a teljesítmény. Ha lehetséges, állítsd be a <code>suhosin.get.max_value_length</code> értékét legalább 1024-re a <code>php.ini</code>ben, és állítsd be a <code>$wgResourceLoaderMaxQueryLength</code> változót ugyanerre az értékre a LocalSettings.php-ben.",
     "config-db-type": "Adatbázis típusa:",
     "config-db-host": "Adatbázis hosztneve:",
-    "config-db-host-help": "Ha az adatbázisszerver másik szerveren található, add meg a hosztnevét vagy az IP-címét.\n\nHa megosztott webtárhelyet használsz, a szolgáltató dokumentációjában megtalálható a helyes hosztnév.\n\nHa Windows-alapú szerverre telepítesz, és MySQL-t használsz, a „localhost” nem biztos, hogy működni fog. Ha így van, próbáld meg a „127.0.0.1” helyi IP-cím használatát.",
+    "config-db-host-help": "Ha az adatbázisszerver másik szerveren található, add meg a hosztnevét vagy az IP-címét.\n\nHa megosztott webtárhelyet használsz, a szolgáltató dokumentációjában megtalálható a helyes hosztnév.\n\nHa Windows-alapú szerverre telepítesz, és MySQL-t használsz, a „localhost” nem biztos, hogy működni fog. Ha így van, próbáld meg a „127.0.0.1” helyi IP-cím használatát.\n\nHa PostgreSQL-t használsz, hagyd ezt a mezőt üresen a Unix-socketon keresztül történő csatlakozáshoz.",
     "config-db-host-oracle": "Adatbázis TNS:",
     "config-db-wiki-settings": "A wiki azonosítása",
     "config-db-name": "Adatbázisnév:",
     "config-sqlite-dir-help": "Az SQLite minden adatot egyetlen fájlban tárol.\n\nA megadott könyvtárban írási jogosultsággal kell rendelkeznie a webszervernek.\n\n'''Nem''' szabad elérhetőnek lennie weben keresztül, ezért nem rakjuk oda, ahol a PHP-fájljaid vannak.\n\nA telepítő készít egy <code>.htaccess</code> fájlt az adatbázis mellé, azonban ha valamilyen okból nem sikerül, akkor akárki hozzáférhet a teljes adatbázisodhoz. Ez a felhasználók adatai (e-mail címek, jelszók hashei) mellett a törölt változatokat és más, korlátozott hozzáférésű információkat is tartalmaz.\n\nFontold meg az adatbázis más helyre történő elhelyezését, például a <code>/var/lib/mediawiki/tewikid</code> könyvtárba.",
     "config-oracle-def-ts": "Alapértelmezett táblatér:",
     "config-oracle-temp-ts": "Ideiglenes táblatér:",
+    "config-type-mysql": "MySQL (vagy kompatibilis)",
+    "config-type-mssql": "Microsoft SQL Szerver",
     "config-support-info": "A MediaWiki a következő adatbázisrendszereket támogatja:\n\n$1\n\nHa az alábbi listán nem találod azt a rendszert, melyet használni szeretnél, a fenti linken található instrukciókat követve engedélyezheted a támogatását.",
-    "config-support-mysql": "* A $1 a MediaWiki elsődleges célpontja, így a legjobban támogatott ([http://www.php.net/manual/en/mysql.installation.php Hogyan fordítható a PHP MySQL-támogatással])",
-    "config-support-postgres": "* A $1 népszerű, nyílt forráskódú adatbázisrendszer, a MySQL alternatívája ([http://www.php.net/manual/en/pgsql.installation.php Hogyan fordítható a PHP PostgreSQL-támogatással]). Több apró, javítatlan hiba is előfordulhat, így nem ajánlott éles környezetben használni.",
-    "config-support-sqlite": "* Az $1 egy könnyű, nagyon jól támogatott adatbázisrendszer. ([http://www.php.net/manual/en/pdo.installation.php Hogyan fordítható a PHP SQLite-támogatással], PDO-t használ)",
-    "config-support-oracle": "* Az $1 kereskedelmi, vállalati adatbázisrendszer. ([http://www.php.net/manual/en/oci8.installation.php Hogyan fordítható a PHP OCI8-támogatással])",
+    "config-dbsupport-mysql": "* A [{{int:version-db-mysql-url}} MySQL] a MediaWiki elsődleges célpontja, így a legjobban támogatott. A MediaWiki elfut [{{int:version-db-mariadb-url}} MariaDB-n] és [{{int:version-db-percona-url}} Percona Serveren] is, mivel ezek MySQL-kompatibilisek. ([http://www.php.net/manual/en/mysql.installation.php Hogyan fordítható a PHP MySQL-támogatással])",
+    "config-dbsupport-postgres": "* A [{{int:version-db-postgres-url}} PostgreSQL] népszerű, nyílt forráskódú adatbázisrendszer, a MySQL alternatívája ([http://www.php.net/manual/en/pgsql.installation.php Hogyan fordítható a PHP PostgreSQL-támogatással]). Több apró, javítatlan hiba is előfordulhat, így nem ajánlott éles környezetben használni. ([http://www.php.net/manual/en/pgsql.installation.php Hogyan fordítható a PHP PostgreSQL-támogatással])",
+    "config-dbsupport-sqlite": "* Az [{{int:version-db-sqlite-url}} SQLite] egy könnyű, nagyon jól támogatott adatbázisrendszer. ([http://www.php.net/manual/en/pdo.installation.php Hogyan fordítható a PHP SQLite-támogatással], PDO-t használ)",
+    "config-dbsupport-oracle": "* Az [{{int:version-db-oracle-url}} Oracle] kereskedelmi, vállalati adatbázisrendszer. ([http://www.php.net/manual/en/oci8.installation.php Hogyan fordítható a PHP OCI8-támogatással])",
     "config-header-mysql": "MySQL-beállítások",
     "config-header-postgres": "PostgreSQL-beállítások",
     "config-header-sqlite": "SQLite-beállítások",
     "config-header-oracle": "Oracle-beállítások",
+    "config-header-mssql": "Microsoft SQL Server beállítások",
     "config-invalid-db-type": "Érvénytelen adatbázistípus",
-    "config-missing-db-name": "Meg kell adnod az „Adatbázisnév” értékét",
-    "config-missing-db-host": "Meg kell adnod az „Adatbázis hosztneve” értékét",
-    "config-missing-db-server-oracle": "Meg kell adnod az „Adatbázis TNS” értékét",
+    "config-missing-db-name": "Meg kell adnod a(z) „{{int:config-db-name}}” értékét.",
+    "config-missing-db-host": "Meg kell adnod az „{{int:config-db-host}}” értékét.",
+    "config-missing-db-server-oracle": "Meg kell adnod az „{{int:config-db-host-oracle}}” értékét.",
     "config-invalid-db-server-oracle": "Érvénytelen adatbázis TNS: „$1”\nCsak ASCII betűk (a-z, A-Z), számok (0-9), alulvonás (_) és pont (.) használható.",
     "config-invalid-db-name": "Érvénytelen adatbázisnév: „$1”.\nCsak ASCII-karakterek (a-z, A-Z), számok (0-9), alulvonás (_) és kötőjel (-) használható.",
     "config-invalid-db-prefix": "Érvénytelen adatbázisnév-előtag: „$1”.\nCsak ASCII-karakterek (a-z, A-Z), számok (0-9), alulvonás (_) és kötőjel (-) használható.",
     "config-db-sys-create-oracle": "A telepítő csak a SYSDBA fiókkal tud új felhasználói fiókot létrehozni.",
     "config-db-sys-user-exists-oracle": "Már létezik „$1” nevű felhasználói fiók. A SYSDBA csak új fiók létrehozására használható!",
     "config-postgres-old": "A PostgreSQL $1 vagy újabb verziója szükséges, a rendszeren $2 van.",
+    "config-mssql-old": "Microsoft SQL Server $1 vagy későbbi szükséges. Te verziód: $2.",
     "config-sqlite-name-help": "Válassz egy nevet a wiki azonosítására.\nNe tartalmazzon szóközt vagy kötőjelet.\nEz lesz az SQLite-adatfájl neve.",
     "config-sqlite-parent-unwritable-group": "Nem hozható létre a(z) <code><nowiki>$1</nowiki></code> adatkönyvtár, mert a szülőkönyvtárba (<code><nowiki>$2</nowiki></code>) nem írhat a webszerver.\n\nA telepítő megállapította, hogy mely felhasználó futtatja a webszervert.\nA folytatáshoz tedd írhatóvá a(z) <code><nowiki>$3</nowiki></code> könyvtárat.\nUnix/Linux rendszeren tedd a következőt:\n\n<pre>cd $2\nmkdir $3\nchgrp $4 $3\nchmod g+w $3</pre>",
     "config-sqlite-parent-unwritable-nogroup": "Nem lehet létrehozni az adatok tárolásához szükséges <code><nowiki>$1</nowiki></code> könyvtárat, mert a webszerver nem írhat a szülőkönyvtárba (<code><nowiki>$2</nowiki></code>).\n\nA telepítő nem tudta megállapíteni, hogy melyik felhasználói fiókon fut a webszerver.\nA folytatáshoz tedd írhatóvá ezen fiók (és más fiókok!) számára a következő könyvtárat: <code><nowiki>$3</nowiki></code>.\nUnix/Linux rendszereken tedd a következőt:\n\n<pre>cd $2\nmkdir $3\nchmod a+w $3</pre>",
     "config-mysql-binary": "Bináris",
     "config-mysql-utf8": "UTF-8",
     "config-mysql-charset-help": "'''Bináris módban''' a MediaWiki az UTF-8-as szövegeket bináris mezőkben tárolja az adatbázisban.\nEz sokkal hatékonyabb a MySQL UTF-8-as módjánál, és lehetővé teszi a teljes Unicode-karakterkészlet használatát.\n\n'''UTF-8-as módban''' a MySQL tudni fogja,hogy az adatok milyen karakterkészlettel rendelkeznek, és megfelelően átalakítja őket, azonban nem tárolhatóak olyan karakterek, melyek a [//en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes Basic Multilingual Plane] felett vannak.",
+    "config-mssql-auth": "Hitelesítés típusa:",
+    "config-mssql-sqlauth": "SQL Server hitelesítés",
+    "config-mssql-windowsauth": "Windows hitelesítés",
     "config-site-name": "A wiki neve:",
     "config-site-name-help": "A böngésző címsorában és még számos más helyen jelenik meg.",
     "config-site-name-blank": "Add meg az oldal nevét.",
     "config-admin-name-blank": "Add meg az adminisztrátor felhasználónevét!",
     "config-admin-name-invalid": "A megadott felhasználónév (<nowiki>$1</nowiki>) érvénytelen.\nAdj meg egy másik felhasználónevet.",
     "config-admin-password-blank": "Add meg az adminisztrátori fiók jelszavát!",
-    "config-admin-password-same": "A jelszó nem lehet ugyanaz, mint a felhasználónév.",
     "config-admin-password-mismatch": "A megadott jelszavak nem egyeznek.",
     "config-admin-email": "E-mail cím:",
     "config-admin-email-help": "Add meg az e-mail címedet, hogy más felhasználók küldhessenek e-maileket a wikin keresztül, új jelszót tudj kérni, és értesülhess a figyelőlistádon lévő lapokon történt változásokról. Üresen is hagyhatod ezt a mezőt.",
     "config-optional-continue": "További információk megadása.",
     "config-optional-skip": "Épp elég volt, települjön a wiki!",
     "config-profile": "Felhasználói jogosultságok profilja:",
-    "config-profile-wiki": "Hagyományos wiki",
+    "config-profile-wiki": "Wiki megnyitása",
     "config-profile-no-anon": "Felhasználói fiók létrehozása szükséges",
     "config-profile-fishbowl": "Csak engedélyezett szerkesztők",
     "config-profile-private": "Privát wiki",
-    "config-profile-help": "A wikik akkor működnek a legjobban, ha minél több felhasználó számára engedélyezett a szerkesztés.\nA MediaWikiben könnyű ellenőrizni a legutóbbi változtatásokat,és visszaállítani a naiv vagy káros felhasználók által okozott károkat.\n\nA MediaWiki azonban számos helyzetben hasznos lehet, és néha nem könnyű mindenkit meggyőzni a wiki előnyeiről.\nVálaszthatsz!\n\n'''{{int:config-profile-wiki}}kben''' bárki szerkeszthet, akár bejelentkezés nélkül is. A '''{{int:config-profile-no-anon}}''' beállítás további biztonságot nyújt, azonban elijesztheti az alkalmi szerkesztőket.\n\nLehetőség van arra is, hogy '''{{lc:{{int:config-profile-fishbowl}}}}''' módosíthassák a lapokat, de a nyilvánosság ekkor megtekintheti a lapokat és azok laptörténetét is. '''{{int:config-profile-private}}''' esetén csak az engedélyezett szerkesztők tekinthetik meg a lapokat, és ugyanez a csoport szerkeszthet.\n\nTelepítés után jóval összetettebb jogosultságrendszer állítható össze, további információ a [//www.mediawiki.org/wiki/Manual:User_rights kézikönyv kapcsolódó bejegyzésében].",
+    "config-profile-help": "A wikik akkor működnek a legjobban, ha minél több felhasználó számára engedélyezett a szerkesztés.\nA MediaWikiben könnyű ellenőrizni a legutóbbi változtatásokat,és visszaállítani a naiv vagy káros felhasználók által okozott károkat.\n\nA MediaWiki azonban számos helyzetben hasznos lehet, és néha nem könnyű mindenkit meggyőzni a wiki előnyeiről.\nVálaszthatsz!\n\n<strong>{{int:config-profile-wiki}}kben</strong> bárki szerkeszthet, akár bejelentkezés nélkül is. A <strong>{{int:config-profile-no-anon}}</strong> beállítás további biztonságot nyújt, azonban elijesztheti az alkalmi szerkesztőket.\n\nLehetőség van arra is, hogy <strong>{{lc:{{int:config-profile-fishbowl}}}}</strong> módosíthassák a lapokat, de a nyilvánosság ekkor megtekintheti a lapokat és azok laptörténetét is. <strong>{{int:config-profile-private}}</strong> esetén csak az engedélyezett szerkesztők tekinthetik meg a lapokat, és ugyanez a csoport szerkeszthet.\n\nTelepítés után jóval összetettebb jogosultságrendszer állítható össze, további információ a [//www.mediawiki.org/wiki/Manual:User_rights kézikönyv kapcsolódó bejegyzésében].",
     "config-license": "Szerzői jog és licenc:",
     "config-license-none": "Nincs licencjelzés",
     "config-license-cc-by-sa": "Creative Commons Nevezd meg! - Így add tovább!",
     "config-upload-deleted": "Törölt fájlok könyvtára:",
     "config-upload-deleted-help": "Válaszd ki azt a könyvtárat, ahol a törölt fájlok lesznek archiválva.\nNormális esetben ennek nem szabad elérhetőnek lennie az internetről.",
     "config-logo": "A logó URL-címe:",
-    "config-logo-help": "A MediaWiki alapértelmezett felülete helyet ad egy 135×160 pixeles logónak a bal felső sarokban.\nTölts fel egy megfelelő méretű képet, majd írd be ide az URL-címét!\n\nHa nem szeretnél logót használni, egyszerűen hagyd üresen a mezőt.",
+    "config-logo-help": "A MediaWiki alapértelmezett felülete helyet ad egy 135×160 pixeles logónak a bal felső sarokban.\nTölts fel egy megfelelő méretű képet, majd írd be ide az URL-címét!\n\nHasználhatsz  <code>$wgStylePath</code>-t vagy <code>$wgScriptPath</code>-t, ha más méretű a logód.\n\nHa nem szeretnél logót használni, egyszerűen hagyd üresen a mezőt.",
     "config-instantcommons": "Instant Commons engedélyezése",
     "config-instantcommons-help": "Az [//www.mediawiki.org/wiki/InstantCommons Instant Commons] lehetővé teszi, hogy a wikin használhassák a [//commons.wikimedia.org/ Wikimedia Commons] oldalon található képeket, hangokat és más médiafájlokat.\nA használatához a MediaWikinek internethozzáférésre van szüksége.\n\nA funkcióról és hogy hogyan állítható be más wikik esetén [//mediawiki.org/wiki/Manual:$wgForeignFileRepos a kézikönyvben] találhatsz további információkat.",
     "config-cc-error": "A Creative Commons-licencválasztó nem tért vissza eredménnyel.\nAdd meg kézzel a licencet.",
     "config-extensions": "Kiterjesztések",
     "config-extensions-help": "A fent felsorolt kiterjesztések találhatóak meg az <code>./extensions</code> könyvtárban.\n\nLehetséges, hogy további beállításra lesz szükség hozzájuk, de már most engedélyezheted őket.",
     "config-install-alreadydone": "'''Figyelmeztetés:''' Úgy tűnik, hogy a MediaWiki telepítve van, és te ismét megpróbálod telepíteni.\nFolytasd a következő oldalon.",
-    "config-install-begin": "A „{{int:config-continue}}” gomb megnyomása elindítja a MediaWiki telepítését.\nHa szeretnél módosítani a beállításokon, kattints a vissza gombra.",
+    "config-install-begin": "A „{{int:config-continue}}” gomb megnyomása elindítja a MediaWiki telepítését.\nHa szeretnél módosítani a beállításokon, kattints a \"{{int:config-back}}\" gombra.",
     "config-install-step-done": "kész",
     "config-install-step-failed": "sikertelen",
     "config-install-extensions": "Kiterjesztések beillesztése",
     "config-install-done": "'''Gratulálunk!'''\nA MediaWiki telepítése sikeresen befejeződött.\n\nA telepítő elkészítette a <code>LocalSettings.php</code> fájlt, amely tartalmazza az összes beállítást.\n\nEzt le kell tölteni, majd elhelyezni a wiki telepítési könyvtárába (az a könyvtár, ahol az index.php is található).\n\nA letöltés automatikusan elindul. Ha mégsem indulna el, vagy megszakítottad, az alábbi linkre kattintva újra letöltheted:\n\n$3\n\n'''Megjegyzés''': Ha ezt most nem teszed meg, és kilépsz a telepítésből, az elkészített konfigurációs fájlt nem tudod elérni a későbbiekben.\n\nHa végeztél a fájl elhelyezésével, '''[$2 beléphetsz a wikibe]'''.",
     "config-download-localsettings": "<code>LocalSettings.php</code> letöltése",
     "config-help": "segítség",
+    "config-nofile": "\"$1\" fájl nem található. Törölve lett?",
     "mainpagetext": "'''A MediaWiki telepítése sikeresen befejeződött.'''",
-    "mainpagedocfooter": "Ha segítségre van szükséged a wikiszoftver használatához, akkor keresd fel a [//meta.wikimedia.org/wiki/Help:Contents User's Guide] oldalt.\n\n== Alapok (angol nyelven) ==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Beállítások listája]\n* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki GyIK]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki-kiadások levelezőlistája]"
-}
\ No newline at end of file
+    "mainpagedocfooter": "Ha segítségre van szükséged a wikiszoftver használatához, akkor keresd fel a [//meta.wikimedia.org/wiki/Help:Contents User's Guide] oldalt.\n\n== Alapok (angol nyelven) ==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Beállítások listája]\n* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki GyIK]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki-kiadások levelezőlistája]\n* [//www.mediawiki.org/wiki/Localisation#Translation_resources A MediaWiki fordítása a saját nyelvedre]"
+}
index 568c15e..37e0db9 100644 (file)
@@ -1,7 +1,5 @@
 {
-    "@metadata": {
-        "authors": []
-    },
+    "@metadata": [],
     "mainpagetext": "'''«MediaWiki» ծրագիրը հաջողությամբ տեղադրվեց։'''",
     "mainpagedocfooter": "Այցելեք [//meta.wikimedia.org/wiki/Help:Contents User's Guide]՝ վիքի ծրագրային ապահովման օգտագործման մասին տեղեկությունների համար։\n\n== Որոշ օգտակար ռեսուրսներ ==\n\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Configuration settings list]\n* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]"
-}
\ No newline at end of file
+}
index edb7014..c4e2465 100644 (file)
@@ -41,7 +41,7 @@
     "config-page-existingwiki": "Wiki existente",
     "config-help-restart": "Vole tu rader tote le datos salveguardate que tu ha entrate e reinitiar le processo de installation?",
     "config-restart": "Si, reinitia lo",
-    "config-welcome": "=== Verificationes del ambiente ===\nVerificationes de base es exequite pro determinar si iste ambiente es apte pro le installation de MediaWiki.\nTu deberea indicar le resultatos de iste verificationes si tu ha besonio de adjuta durante le installation.",
+    "config-welcome": "=== Verificationes del ambiente ===\nVerificationes de base essera ora exequite pro determinar si iste ambiente es apte pro le installation de MediaWiki.\nNon oblida de includer iste information si tu cerca adjuta pro completar le installation.",
     "config-copyright": "=== Copyright and Terms ===\n\n$1\n\nIste programma es software libere; vos pote redistribuer lo e/o modificar lo sub le conditiones del Licentia Public General de GNU publicate per le Free Software Foundation; version 2 del Licentia, o (a vostre option) qualcunque version posterior.\n\nIste programma es distribuite in le sperantia que illo sia utile, ma '''sin garantia''', sin mesmo le implicite garantia de '''commercialisation''' o '''aptitude pro un proposito particular'''.\nVide le Licentia Public General de GNU pro plus detalios.\n\nVos deberea haber recipite <doclink href=Copying>un exemplar del Licentia Public General de GNU</doclink> con iste programma; si non, scribe al Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA, o [http://www.gnu.org/copyleft/gpl.html lege lo in linea].",
     "config-sidebar": "* [//www.mediawiki.org Pagina principal de MediaWiki]\n* [//www.mediawiki.org/wiki/Help:Contents Guida pro usatores]\n* [//www.mediawiki.org/wiki/Manual:Contents Guida pro administratores]\n* [//www.mediawiki.org/wiki/Manual:FAQ FAQ]\n----\n* <doclink href=Readme>Lege me</doclink>\n* <doclink href=ReleaseNotes>Notas de iste version</doclink>\n* <doclink href=Copying>Conditiones de copia</doclink>\n* <doclink href=UpgradeDoc>Actualisation</doclink>",
     "config-env-good": "Le ambiente ha essite verificate.\nTu pote installar MediaWiki.",
     "config-unicode-using-intl": "Le [http://pecl.php.net/intl extension PECL intl] es usate pro le normalisation Unicode.",
     "config-unicode-pure-php-warning": "'''Aviso''': Le [http://pecl.php.net/intl extension PECL intl] non es disponibile pro exequer le normalisation Unicode; le systema recurre al implementation lente in PHP pur.\nSi tu sito ha un alte volumine de traffico, tu deberea informar te un poco super le [//www.mediawiki.org/wiki/Unicode_normalization_considerations normalisation Unicode].",
     "config-unicode-update-warning": "'''Aviso''': Le version installate del bibliotheca inveloppante pro normalisation Unicode usa un version ancian del bibliotheca del [http://site.icu-project.org/ projecto ICU].\nTu deberea [//www.mediawiki.org/wiki/Unicode_normalization_considerations actualisar lo] si le uso de Unicode importa a te.",
-    "config-no-db": "Non poteva trovar un driver appropriate pro le base de datos! Es necessari installar un driver de base de datos pro PHP.\nLe sequente typos de base de datos es supportate: $1.\n\nSi tu sito usa un servitor dividite (shared hosting), demanda a tu providitor de installar un driver de base de datos appropriate.\nSi tu compilava PHP tu mesme, reconfigura lo con un cliente de base de datos activate, per exemplo usante <code>./configure --with-mysql</code>.\nSi tu installava PHP ex un pacchetto Debian o Ubuntu, tu debe installar equalmente le modulo php5-mysql.",
+    "config-no-db": "Non poteva trovar un driver appropriate pro le base de datos! Es necessari installar un driver de base de datos pro PHP.\nLe sequente typos de base de datos es supportate: $1.\n\nSi tu compilava PHP tu mesme, reconfigura lo con un cliente de base de datos activate, per exemplo usante <code>./configure --with-mysqli</code>.\nSi tu installava PHP ex un pacchetto Debian o Ubuntu, tu debe installar equalmente, per exemplo, le modulo <code>php5-mysql</code>.",
     "config-outdated-sqlite": "'''Attention''': tu ha SQLite $1, que es inferior al version minimal requirite, $2. SQLite essera indisponibile.",
     "config-no-fts3": "'''Attention''': SQLite es compilate sin [//sqlite.org/fts3.html modulo FTS3]; functionalitate de recerca non essera disponibile in iste back-end.",
     "config-register-globals": "'''Attention: le option <code>[http://php.net/register_globals register_globals]</code> de PHP es activate.'''\n'''Disactiva lo si tu pote.'''\nMediaWiki functionara, ma tu servitor es exponite a potential vulnerabilitates de securitate.",
     "config-magic-quotes-runtime": "'''Fatal: [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-runtime magic_quotes_runtime] es active!'''\nIste option corrumpe le entrata de datos imprevisibilemente.\nTu non pote installar o usar MediaWiki si iste option non es disactivate.",
     "config-magic-quotes-sybase": "'''Fatal: [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-sybase magic_quotes_sybase] es active!'''\nIste option corrumpe le entrata de datos imprevisibilemente.\nTu non pote installar o usar MediaWiki si iste option non es disactivate.",
     "config-mbstring": "'''Fatal: [http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload] es active!'''\nIste option causa errores e pote corrumper datos imprevisibilemente.\nTu non pote installar o usar MediaWiki si iste option non es disactivate.",
-    "config-ze1": "'''Fatal: [http://www.php.net/manual/en/ini.core.php zend.ze1_compatibility_mode] es active!'''\nIste option causa horribile defectos con MediaWiki.\nTu non pote installar o usar MediaWiki si iste option non es disactivate.",
     "config-safe-mode": "'''Aviso:''' Le [http://www.php.net/features.safe-mode modo secur] de PHP es active.\nIsto pote causar problemas, particularmente si es usate le incargamento de files e le supporto de <code>math</code>.",
     "config-xml-bad": "Le modulo XML de PHP es mancante.\nMediaWiki require functiones de iste modulo e non functionara in iste configuration.\nSi tu usa Mandrake, installa le pacchetto php-xml.",
-    "config-pcre": "Le modulo de supporto PCRE pare esser mancante.\nMediaWiki require le functiones de expression regular compatibile con Perl pro poter functionar.",
+    "config-pcre-old": "<strong>Fatal:</strong> PCRE $1 o plus tarde es necessari.\nTu binario de PHP binary es ligate con PCRE $2.\n[https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/PCRE Plus information].",
     "config-pcre-no-utf8": "'''Fatal''': Le modulo PCRE de PHP pare haber essite compilate sin supporto de PCRE_UTF8.\nMediaWiki require supporto de UTF-8 pro functionar correctemente.",
     "config-memory-raised": "Le <code>memory_limit</code> de PHP es $1, elevate a $2.",
     "config-memory-bad": "'''Aviso:''' Le <code>memory_limit</code> de PHP es $1.\nIsto es probabilemente troppo basse.\nLe installation pote faller!",
     "config-ctype": "'''Fatal''': PHP debe esser compilate con supporto pro le [http://www.php.net/manual/en/ctype.installation.php extension Ctype].",
+    "config-json": "'''Fatal:''' PHP ha essite compilate sin supporto de JSON.\nTu debe installar le extension JSON de PHP o le extension [http://pecl.php.net/package/jsonc PECL jsonc] extension ante de installar MediaWiki.\n* Le extension de PHP es includite in Red Hat Enterprise Linux (CentOS) 5 e 6, ma debe esser activate in <code>/etc/php.ini</code> o <code>/etc/php.d/json.ini</code>.\n* Alcun distributiones de Linux liberate post maio 2013 omitte iste extension de PHP, forniente in su loco le extension PECL como <code>php5-json</code> o <code>php-pecl-jsonc</code>.",
     "config-xcache": "[http://xcache.lighttpd.net/ XCache] es installate",
     "config-apc": "[http://www.php.net/apc APC] es installate",
     "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache] es installate",
     "config-no-cache": "'''Aviso:''' Non poteva trovar [http://www.php.net/apc APC], [http://xcache.lighttpd.net/ XCache] o [http://www.iis.net/download/WinCacheForPhp WinCache].\nLe cache de objectos non es activate.",
     "config-mod-security": "'''Attention''': [http://modsecurity.org/ mod_security] es active in tu servitor web. Si mal configurate, isto pote causar problemas pro MediaWiki o altere software que permitte al usatores de publicar contento arbitrari.\nConsulta le [http://modsecurity.org/documentation/ documentation de mod_security] o contacta le servicio de adjuta de tu host si tu incontra estranie errores.",
     "config-diff3-bad": "GNU diff3 non trovate.",
+    "config-git": "Systema de controlo de version Git trovate: <code>$1</code>",
+    "config-git-bad": "Systema de controlo de version Git non trovate.",
     "config-imagemagick": "ImageMagick trovate: <code>$1</code>.\nLe miniaturas de imagines essera activate si tu activa le incargamento de files.",
     "config-gd": "Le bibliotheca graphic GD se trova integrate in le systema.\nLe miniaturas de imagines essera activate si tu activa le incargamento de files.",
     "config-no-scaling": "Non poteva trovar le bibliotheca GD ni ImageMagick.\nLe miniaturas de imagines essera disactivate.",
     "config-no-uri": "'''Error:''' Non poteva determinar le URI actual.\nInstallation abortate.",
-    "config-no-cli-uri": "'''Attention''': Cammino al script (--scriptpath) non specificate. Le predefinition es usate: <code>$1</code>.",
+    "config-no-cli-uri": "'''Attention''': Cammino al script (<code>--scriptpath</code>) non specificate. Le predefinition es usate: <code>$1</code>.",
     "config-using-server": "Es usate le nomine de servitor \"<nowiki>$1</nowiki>\".",
     "config-using-uri": "Le URL de servitor \"<nowiki>$1$2</nowiki>\" es usate.",
     "config-uploads-not-safe": "'''Aviso:''' Le directorio predefinite pro files incargate <code>$1</code> es vulnerabile al execution arbitrari de scripts.\nBen que MediaWiki verifica tote le files incargate contra le menacias de securitate, il es altemente recommendate [//www.mediawiki.org/wiki/Manual:Security#Upload_security remediar iste vulnerabilitate de securitate] ante de activar le incargamento de files.",
     "config-no-cli-uploads-check": "'''Attention:''' Le directorio predefinite pro files incargate (<code>$1</code>) non es verificate contra le vulnerabilitate\nal execution arbitrari de scripts durante le installation de CLI.",
-    "config-brokenlibxml": "Vostre systema ha un combination de versiones de PHP e libxml2 que es defectuose e pote causar corruption celate de datos in MediaWiki e altere applicationes web.\nActualisa a PHP 5.2.9 o plus recente e libxml2 2.7.3 o plus recente ([//bugs.php.net/bug.php?id=45996 problema reportate presso PHP]).\nInstallation abortate.",
-    "config-using531": "MediaWiki non pote esser usate con PHP $1 a causa de un defecto concernente parametros de referentia a <code>__call()</code>.\nActualisa a PHP 5.3.2 o plus recente, o retrograda a PHP 5.3.0 pro remediar isto.\nInstallation abortate.",
+    "config-brokenlibxml": "Vostre systema ha un combination de versiones de PHP e libxml2 que es defectuose e pote causar corruption celate de datos in MediaWiki e altere applicationes web.\nActualisa a libxml2 2.7.3 o plus recente ([https://bugs.php.net/bug.php?id=45996 problema reportate presso PHP]).\nInstallation abortate.",
     "config-suhosin-max-value-length": "Suhosin es installate e limita parametro <code>length</code> de GET a $1 bytes.\nLe componente ResourceLoader de MediaWiki va contornar iste limite, ma isto prejudicara le rendimento.\nSi possibile, tu deberea mitter <code>suhosin.get.max_value_length</code> a 1024 o superior in <code>php.ini</code>, e mitter <code>$wgResourceLoaderMaxQueryLength</code> al mesme valor in <code>LocalSettings.php</code>.",
     "config-db-type": "Typo de base de datos:",
     "config-db-host": "Servitor de base de datos:",
     "config-sqlite-dir-help": "SQLite immagazina tote le datos in un sol file.\n\nLe directorio que tu forni debe permitter le accesso de scriptura al servitor web durante le installation.\n\nIllo '''non''' debe esser accessibile via web. Pro isto, nos non lo pone ubi tu files PHP es.\n\nLe installator scribera un file <code>.htaccess</code> insimul a illo, ma si isto falli, alcuno pote ganiar accesso directe a tu base de datos.\nIsto include le crude datos de usator (adresses de e-mail, contrasignos codificate) assi como versiones delite e altere datos restringite super le wiki.\n\nConsidera poner le base de datos in un loco completemente differente, per exemplo in <code>/var/lib/mediawiki/yourwiki</code>.",
     "config-oracle-def-ts": "Spatio de tabellas predefinite:",
     "config-oracle-temp-ts": "Spatio de tabellas temporari:",
-    "config-type-mysql": "MySQL",
+    "config-type-mysql": "MySQL (o compatibile)",
     "config-type-postgres": "PostgreSQL",
     "config-type-sqlite": "SQLite",
     "config-type-oracle": "Oracle",
+    "config-type-mssql": "Microsoft SQL Server",
     "config-support-info": "MediaWiki supporta le sequente systemas de base de datos:\n\n$1\n\nSi tu non vide hic infra le systema de base de datos que tu tenta usar, alora seque le instructiones ligate hic supra pro activar le supporto.",
-    "config-support-mysql": "* $1 es le systema primari pro MediaWiki e le melio supportate ([http://www.php.net/manual/en/mysql.installation.php como compilar PHP con supporto de MySQL])",
-    "config-support-postgres": "* $1 es un systema de base de datos popular e open source, alternativa a MySQL ([http://www.php.net/manual/en/pgsql.installation.php como compilar PHP con supporto de PostgreSQL]). Es possibile que resta alcun minor defectos non resolvite, dunque illo non es recommendate pro uso in un ambiente de production.",
-    "config-support-sqlite": "* $1 es un systema de base de datos legier que es multo ben supportate. ([http://www.php.net/manual/en/pdo.installation.php Como compilar PHP con supporto de SQLite], usa PDO)",
-    "config-support-oracle": "* $1 es un banca de datos commercial pro interprisas. ([http://www.php.net/manual/en/oci8.installation.php Como compilar PHP con supporto de OCI8])",
+    "config-dbsupport-mysql": "* [{{int:version-db-mysql-url}} MySQL] es le systema primari pro MediaWiki e le melio supportate. MediaWiki functiona anque con [{{int:version-db-mariadb-url}} MariaDB] e con [{{int:version-db-percona-url}} Percona Server], le quales es compatibile con MySQL. ([http://www.php.net/manual/en/mysqli.installation.php Como compilar PHP con supporto de MySQL])",
+    "config-dbsupport-postgres": "* [{{int:version-db-postgres-url}} PostgreSQL] es un systema de base de datos popular e open source, alternativa a MySQL. Es possibile que resta alcun minor defectos non resolvite, dunque illo non es recommendate pro uso in un ambiente de production. ([http://www.php.net/manual/en/pgsql.installation.php Como compilar PHP con supporto de PostgreSQL])",
+    "config-dbsupport-sqlite": "* [{{int:version-db-sqlite-url}} SQLite] es un systema de base de datos legier que es multo ben supportate. ([http://www.php.net/manual/en/pdo.installation.php Como compilar PHP con supporto de SQLite], usa PDO)",
+    "config-dbsupport-oracle": "* [{{int:version-db-oracle-url}} Oracle] es un banca de datos commercial pro interprisas. ([http://www.php.net/manual/en/oci8.installation.php Como compilar PHP con supporto de OCI8])",
+    "config-dbsupport-mssql": "* [{{int:version-db-mssql-url}} Microsoft SQL Server] es un base de datos de interprisa commercial pro Windows. ([http://www.php.net/manual/en/sqlsrv.installation.php Como compilar PHP con supporto de SQLSRV])",
     "config-header-mysql": "Configuration de MySQL",
     "config-header-postgres": "Configuration de PostgreSQL",
     "config-header-sqlite": "Configuration de SQLite",
     "config-header-oracle": "Configuration de Oracle",
+    "config-header-mssql": "Configuration de Microsoft SQL Server",
     "config-invalid-db-type": "Typo de base de datos invalide",
     "config-missing-db-name": "Tu debe entrar un valor pro \"Nomine de base de datos\"",
     "config-missing-db-host": "Tu debe entrar un valor pro \"Host del base de datos\"",
     "config-db-sys-create-oracle": "Le installator supporta solmente le uso de un conto SYSDBA pro le creation de un nove conto.",
     "config-db-sys-user-exists-oracle": "Le conto de usator \"$1\" ja existe. SYSDBA pote solmente esser usate pro le creation de un nove conto!",
     "config-postgres-old": "PostgreSQL $1 o plus recente es requirite, tu ha $2.",
+    "config-mssql-old": "Microsoft SQL Server $1 o plus recente es necessari. Tu ha $2.",
     "config-sqlite-name-help": "Selige un nomine que identifica tu wiki.\nNon usar spatios o tractos de union.\nIsto essera usate pro le nomine del file de datos de SQLite.",
     "config-sqlite-parent-unwritable-group": "Impossibile crear le directorio de datos <code><nowiki>$1</nowiki></code>, proque le directorio superjacente <code><nowiki>$2</nowiki></code> non concede le accesso de scriptura al servitor web.\n\nLe installator ha determinate le usator sub que le servitor web es executate.\nConcede le accesso de scriptura in le directorio <code><nowiki>$3</nowiki></code> a iste usator pro continuar.\nIn un systema Unix/Linux:\n\n<pre>cd $2\nmkdir $3\nchgrp $4 $3\nchmod g+w $3</pre>",
     "config-sqlite-parent-unwritable-nogroup": "Impossibile crear le directorio de datos <code><nowiki>$1</nowiki></code>, proque le directorio superjacente <code><nowiki>$2</nowiki></code> non concede le accesso de scriptura al servitor web.\n\nLe installator non poteva determinar le usator sub que le servitor web es executate.\nConcede le accesso de scriptura in le directorio <code><nowiki>$3</nowiki></code> a iste usator (e alteres!) pro continuar.\nIn un systema Unix/Linux:\n\n<pre>cd $2\nmkdir $3\nchmod a+w $3</pre>",
     "config-mysql-innodb": "InnoDB",
     "config-mysql-myisam": "MyISAM",
     "config-mysql-myisam-dep": "* '''Attention:''' Tu ha seligite MyISAM como motor de immagazinage pro MySQL, lo que non es recommendate pro uso con MediaWiki, perque:\n* illo a pena supporta le processamento simultanee a causa del blocada le tabulas\n* illo es plus susceptibile al corruption que altere motores\n* le base de codice de MediaWiki non sempre manea MyISAM como illo deberea\n\nSi tu installation de MySQL supporta InnoDB, es multo recommendate que tu selige iste in su loco.\nSi tu installation de MySQL non supporta InnoDB, forsan isto es un bon occasion pro actualisar lo.",
+    "config-mysql-only-myisam-dep": "'''Attention:''' MyISAM es le unic motor de immagazinage disponibile pro MySQL in iste machina, ma isto non es recommendate pro le uso con MediaWiki, perque:\n* a pena supporto le accesso simultanee a causa del blocage de tabellas\n* es plus propense a corrumper se que altere motores\n* le codice base de MediaWiki non sempre gere MyISAM como deberea\n\nTu installation de MySQL non supporta InnoDB; forsan il es tempore de actualisar lo.",
     "config-mysql-engine-help": "'''InnoDB''' es quasi sempre le melior option, post que illo ha bon supporto pro simultaneitate.\n\n'''MyISAM''' pote esser plus rapide in installationes a usator singule o a lectura solmente.\nLe bases de datos MyISAM tende a esser corrumpite plus frequentemente que le base de datos InnoDB.",
     "config-mysql-charset": "Codification de characteres in le base de datos:",
     "config-mysql-binary": "Binari",
     "config-mysql-utf8": "UTF-8",
     "config-mysql-charset-help": "In '''modo binari''', MediaWiki immagazina le texto UTF-8 in le base de datos in campos binari.\nIsto es plus efficiente que le modo UTF-8 de MySQL, e permitte usar le rango complete de characteres Unicode.\n\nIn '''modo UTF-8''', MySQL cognoscera le codification de characteres usate pro tu dats, e pote presentar e converter lo appropriatemente, ma illo non permittera immagazinar characteres supra le [//en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes Plano Multilingue Basic].",
+    "config-mssql-auth": "Typo de authentication:",
+    "config-mssql-install-auth": "Selige le typo de authentication que essera usate pro connecter al base de datos durante le processo de installation.\nSi tu selige \"Authentication per Windows\", le credentiales del usator que executa le servitor web essera usate.",
+    "config-mssql-web-auth": "Selige le typo de authentication que le servitor web usara pro connecter al base de datos durante le operation ordinari del wiki.\nSi tu selige \"Authentication per Windows\", le credentiales del usator que executa le servitor web essera usate.",
+    "config-mssql-sqlauth": "Authentication per SQL Server",
+    "config-mssql-windowsauth": "Authentication per Windows",
     "config-site-name": "Nomine del wiki:",
     "config-site-name-help": "Isto apparera in le barra de titulo del navigator e in varie altere locos.",
     "config-site-name-blank": "Entra un nomine de sito.",
     "config-ns-invalid": "Le spatio de nomines specificate \"<nowiki>$1</nowiki>\" es invalide.\nSpecifica un altere spatio de nomines de projecto.",
     "config-ns-conflict": "Le spatio de nomines specificate \"<nowiki>$1</nowiki>\" conflige con un spatio de nomines predefinite de MediaWiki.\nSpecifica un altere spatio de nomines pro le projecto.",
     "config-admin-box": "Conto de administrator",
-    "config-admin-name": "Tu nomine:",
+    "config-admin-name": "Tu nomine de usator:",
     "config-admin-password": "Contrasigno:",
     "config-admin-password-confirm": "Repete contrasigno:",
     "config-admin-help": "Entra hic tu nomine de usator preferite, per exemplo \"Julio Cesare\".\nIsto es le nomine que tu usara pro aperir session in le wiki.",
     "config-admin-name-blank": "Entra un nomine de usator pro administrator.",
     "config-admin-name-invalid": "Le nomine de usator specificate \"<nowiki>$1</nowiki>\" es invalide.\nSpecifica un altere nomine de usator.",
     "config-admin-password-blank": "Entra un contrasigno pro le conto de administrator.",
-    "config-admin-password-same": "Le contrasigno non pote esser le mesme que le nomine de usator.",
     "config-admin-password-mismatch": "Le duo contrasignos que tu scribeva non es identic.",
     "config-admin-email": "Adresse de e-mail:",
     "config-admin-email-help": "Entra un adresse de e-mail hic pro permitter le reception de e-mail ab altere usatores del wiki, pro poter reinitialisar tu contrasigno, e pro reciper notification de cambios a paginas in tu observatorio. Iste campo pote esser lassate vacue.",
     "config-download-localsettings": "Discargar <code>LocalSettings.php</code>",
     "config-help": "adjuta",
     "config-nofile": "Le file \"$1\" non poteva esser trovate. Ha illo essite delite?",
+    "config-extension-link": "Sapeva tu que tu wiki supporta [//www.mediawiki.org/wiki/Manual:Extensions extensiones]?\n\nTu pote explorar le [//www.mediawiki.org/wiki/Category:Extensions_by_category extensiones per category] o le [//www.mediawiki.org/wiki/Extension_Matrix matrice de extensiones] pro vider le lista complete de extensiones.",
     "mainpagetext": "'''MediaWiki ha essite installate con successo.'''",
     "mainpagedocfooter": "Consulta le [//meta.wikimedia.org/wiki/Help:Contents Guida del usator] pro informationes super le uso del software wiki.\n\n== Pro initiar ==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Lista de configurationes]\n* [//www.mediawiki.org/wiki/Manual:FAQ FAQ a proposito de MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lista de diffusion pro annuncios de nove versiones de MediaWiki]\n* [//www.mediawiki.org/wiki/Localisation#Translation_resources Traducer MediaWiki in tu lingua]"
-}
\ No newline at end of file
+}
index a2d7623..7f99171 100644 (file)
     "config-magic-quotes-runtime": "'''Fatal: [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-runtime magic_quotes_runtime] aktif!'''\nPilihan ini dapat merusak masukan data secara tidak terduga.\nAnda tidak dapat menginstal atau menggunakan MediaWiki kecuali pilihan ini dinonaktifkan.",
     "config-magic-quotes-sybase": "'''Fatal: [http://www.php.net/manual/en/ref.info.php#ini.magic_quotes_sybase magic_quotes_sybase] aktif!'''\nPilihan ini dapat merusak masukan data secara tidak terduga.\nAnda tidak dapat menginstal atau menggunakan MediaWiki kecuali pilihan ini dinonaktifkan.",
     "config-mbstring": "'''Fatal: [http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload] aktif!'' '\nPilihan ini dapat menyebabkan kesalahan dan kerusakan data yang tidak terduga.\nAnda tidak dapat menginstal atau menggunakan MediaWiki kecuali pilihan ini dinonaktifkan.",
-    "config-ze1": "'''Fatal: [http://www.php.net/manual/en/ini.core.php zend.ze1_compatibility_mode] aktif!'''\nPilihan ini dapat menyebabkan bug yang mengerikan pada MediaWiki.\nAnda tidak dapat menginstal atau menggunakan MediaWiki kecuali pilihan ini dinonaktifkan.",
     "config-safe-mode": "''' Peringatan:''' [http://www.php.net/features.safe-mode Mode aman] PHP aktif.\nHal ini akan menyebabkan masalah, terutama jika menggunakan pengunggahan berkas dan dukungan <code>math</code>.",
     "config-xml-bad": "Modul XML PHP hilang.\nMediaWiki membutuhkan fungsi dalam modul ini dan tidak akan bekerja dalam konfigurasi ini.\nJika Anda menggunakan Mandrake, instal paket php-xml.",
-    "config-pcre": "Modul pendukung PCRE tampaknya hilang.\nMediaWiki memerlukan fungsi persamaan reguler kompatibel Perl untuk bekerja.",
     "config-pcre-no-utf8": "'''Fatal''': Modul PCRE PHP tampaknya dikompilasi tanpa dukungan PCRE_UTF8.\nMediaWiki memerlukan dukungan UTF-8 untuk berfungsi dengan benar.",
     "config-memory-raised": "<code>memory_limit</code> PHP adalah $1, dinaikkan ke $2.",
     "config-memory-bad": "'''Peringatan:''' <code>memory_limit</code> PHP adalah $1.\nIni terlalu rendah.\nInstalasi terancam gagal!",
@@ -79,7 +77,6 @@
     "config-no-uri": "'''Kesalahan:''' URI saat ini tidak dapat ditentukan.\nInstalasi dibatalkan.",
     "config-uploads-not-safe": "'''Peringatan:''' Direktori bawaan pengunggahan <code>$1</code> Anda rentan terhadap eksekusi skrip yang sewenang-wenang.\nMeskipun MediaWiki memeriksa semua berkas unggahan untuk ancaman keamanan, sangat dianjurkan untuk [//www.mediawiki.org/wiki/Manual:Security#Upload_security menutup kerentanan keamanan ini] sebelum mengaktifkan pengunggahan.",
     "config-brokenlibxml": "Sistem Anda memiliki kombinasi versi PHP dan libxml2 yang memiliki bug dan dapat menyebabkan kerusakan data tersembunyi pada MediaWiki dan aplikasi web lain.\nMutakhirkan ke PHP 5.2.9 atau yang lebih baru dan libxml2 2.7.3 atau yang lebih baru ([//bugs.php.net/bug.php?id=45996 arsip bug di PHP]).\nInstalasi dibatalkan.",
-    "config-using531": "MediaWiki tidak dapat dijalankan dengan PHP $1 karena bug yang melibatkan parameter referensi untuk <code>__call()</code> .\nTingkatkan ke PHP 5.3.2 atau lebih baru, atau turunkan ke PHP versi 5.3.0 untuk menyelesaikan hal ini.\nInstalasi dibatalkan.",
     "config-suhosin-max-value-length": "Suhosin terpasang dan membatasi panjang parameter GET sebesar $1 bita. Komponen ResourceLoader MediaWiki akan mengatasi batasan ini, tapi penanganannya akan menurunkan kinerja. Jika memungkinkan, Anda sebaiknya menetapkan nilai <code>suhosin.get.max_value_length</code> menjadi 1024 atau lebih tinggi dalam <code>php.ini</code> dan menyetel <code>$wgResourceLoaderMaxQueryLength</code> dengan nilai yang sama dalam LocalSettings.php.",
     "config-db-type": "Jenis basis data:",
     "config-db-host": "Inang basis data:",
     "config-type-sqlite": "SQLite",
     "config-type-oracle": "Oracle",
     "config-support-info": "MediaWiki mendukung sistem basis data berikut:\n\n$1\n\nJika Anda tidak melihat sistem basis data yang Anda gunakan tercantum di bawah ini, ikuti petunjuk terkait di atas untuk mengaktifkan dukungan.",
-    "config-support-mysql": "* $1 adalah target utama MediaWiki dan memiliki dukungan terbaik ([http://www.php.net/manual/en/mysql.installation.php cara mengompilasi PHP dengan dukungan MySQL])",
-    "config-support-postgres": "* $1 adalah sistem basis data sumber terbuka populer sebagai alternatif untuk MySQL ([http://www.php.net/manual/en/pgsql.installation.php cara mengompilasi PHP dengan dukungan PostgreSQL]). Mungkin ada beberapa bug terbuka dan alternatif ini tidak direkomendasikan untuk dipakai dalam lingkungan produksi.",
-    "config-support-sqlite": "* $1 adalah sistem basis data yang ringan yang sangat baik dukungannya. ([http://www.php.net/manual/en/pdo.installation.php cara mengompilasi PHP dengan dukungan SQLite], menggunakan PDO)",
-    "config-support-oracle": "* $1 adalah basis data komersial untuka perusahaan. ([http://www.php.net/manual/en/oci8.installation.php cara mengompilasi PHP dengan dukungan OCI8])",
+    "config-dbsupport-mysql": "* $1 adalah target utama MediaWiki dan memiliki dukungan terbaik ([http://www.php.net/manual/en/mysql.installation.php cara mengompilasi PHP dengan dukungan MySQL])",
+    "config-dbsupport-postgres": "* $1 adalah sistem basis data sumber terbuka populer sebagai alternatif untuk MySQL ([http://www.php.net/manual/en/pgsql.installation.php cara mengompilasi PHP dengan dukungan PostgreSQL]). Mungkin ada beberapa bug terbuka dan alternatif ini tidak direkomendasikan untuk dipakai dalam lingkungan produksi.",
+    "config-dbsupport-sqlite": "* $1 adalah sistem basis data yang ringan yang sangat baik dukungannya. ([http://www.php.net/manual/en/pdo.installation.php cara mengompilasi PHP dengan dukungan SQLite], menggunakan PDO)",
+    "config-dbsupport-oracle": "* $1 adalah basis data komersial untuka perusahaan. ([http://www.php.net/manual/en/oci8.installation.php cara mengompilasi PHP dengan dukungan OCI8])",
     "config-header-mysql": "Pengaturan MySQL",
     "config-header-postgres": "Pengaturan PostgreSQL",
     "config-header-sqlite": "Pengaturan SQLite",
     "config-admin-name-blank": "Masukkan nama pengguna pengurus.",
     "config-admin-name-invalid": "Nama pengguna \"<nowiki>$1</nowiki>\" yang diberikan tidak sah.\nBerikan nama pengguna lain.",
     "config-admin-password-blank": "Masukkan kata sandi untuk akun pengurus.",
-    "config-admin-password-same": "Kata sandi harus tidak sama seperti nama pengguna.",
     "config-admin-password-mismatch": "Dua kata sandi yang Anda masukkan tidak cocok.",
     "config-admin-email": "Alamat surel:",
     "config-admin-email-help": "Masukkan alamat surel untuk memungkinkan Anda menerima surel dari pengguna lain, menyetel ulang sandi, dan mendapat pemberitahuan tentang perubahan atas daftar pantauan Anda. Anda dapat mengosongkan bidang ini.",
     "config-nofile": "Berkas \"$1\" tidak dapat ditemukan. Mungkin sudah dihapus?",
     "mainpagetext": "'''MediaWiki telah terpasang dengan sukses'''.",
     "mainpagedocfooter": "Silakan baca [//www.mediawiki.org/wiki/Help:Contents/id Panduan Pengguna] untuk cara penggunaan perangkat lunak wiki ini.\n\n== Memulai penggunaan ==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings/id Daftar pengaturan konfigurasi]\n* [//www.mediawiki.org/wiki/Manual:FAQ/id Daftar pertanyaan yang sering diajukan mengenai MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Milis rilis MediaWiki]\n* [//www.mediawiki.org/wiki/Localisation#Translation_resources Terjemahkan MediaWiki ke bahasa Anda]"
-}
\ No newline at end of file
+}
index 6b2f9ba..1e33640 100644 (file)
@@ -1,6 +1,4 @@
 {
-    "@metadata": {
-        "authors": []
-    },
+    "@metadata": [],
     "mainpagetext": "'''Software del wiki installat con successe.'''"
-}
\ No newline at end of file
+}
index 253d8a3..1a24e78 100644 (file)
@@ -14,4 +14,4 @@
     "config-admin-password-confirm": "Okwúngáfè mgbe ozor:",
     "mainpagetext": "'''MediaWiki a banyélé nke oma.'''",
     "mainpagedocfooter": "Gbàkpó [//meta.wikimedia.org/wiki/Help:Contents Ǹdù Ọ'bànifé] màkà ụmá màkà Í jí ngwa nsónùsòrò bu wiki.\n\n== I bídó ==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Ndétu ndósé ihe]\n* [//www.mediawiki.org/wiki/Manual:FAQ FAQ MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce wéfù ndétu nke ozi MediaWiki]"
-}
\ No newline at end of file
+}
index 9ad0c99..acd79fc 100644 (file)
@@ -1,6 +1,4 @@
 {
-    "@metadata": {
-        "authors": []
-    },
+    "@metadata": [],
     "mainpagetext": "'''Sibaballigi a nainstolar ti MediaWiki.'''"
-}
\ No newline at end of file
+}
index fe5c494..f6e7f03 100644 (file)
@@ -6,4 +6,4 @@
     },
     "mainpagetext": "'''MediaWiki instalesis sucese.'''",
     "mainpagedocfooter": "Videz la [//meta.wikimedia.org/wiki/Help:Contents Guidilo por Uzanti] por informo pri uzar la wiki programo.\n\n== Komencar ==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Listo di ''Configuration setting'']\n* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki OQQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki nova versioni posto-listo]"
-}
\ No newline at end of file
+}
index 1c3f99a..0299246 100644 (file)
@@ -1,7 +1,5 @@
 {
-    "@metadata": {
-        "authors": []
-    },
+    "@metadata": [],
     "mainpagetext": "'''Uppsetning á MediaWiki heppnaðist.'''",
     "mainpagedocfooter": "Ráðfærðu þig við [//meta.wikimedia.org/wiki/Help:Contents Notandahandbókina] fyrir frekari upplýsingar um notkun wiki-hugbúnaðarins.\n\n== Fyrir byrjendur ==\n\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Listi yfir uppsetningarstillingar]\n* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki Algengar spurningar MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Póstlisti MediaWiki-útgáfa]"
-}
\ No newline at end of file
+}
index bf679e3..b2aaada 100644 (file)
@@ -6,7 +6,8 @@
             "F. Cosoleto",
             "Gianfranco",
             "Karika",
-            "아라"
+            "아라",
+            "Lucas2"
         ]
     },
     "config-desc": "Il programma di installazione per MediaWiki",
@@ -18,7 +19,7 @@
     "config-localsettings-badkey": "La chiave che hai fornito non è corretta.",
     "config-upgrade-key-missing": "È stata rilevata un'installazione esistente di MediaWiki.\nPer aggiornare questa installazione, si prega di inserire la seguente riga nella parte inferiore del tuo <code>LocalSettings.php</code>:\n\n$1",
     "config-localsettings-incomplete": "Il file <code>LocalSettings.php</code> esistente sembra essere incompleto.\nLa variabile $1 non è impostata.\nCambia <code>LocalSettings.php</code> in modo che questa variabile sia impostata e fai clic su \"{{int:Config-continue}}\".",
-    "config-localsettings-connection-error": "Si è verificato un errore durante la connessione al database utilizzando le impostazioni specificate in <code>LocalSettings.php</code> o <code>AdminSettings.php</code>. Si prega di correggere queste impostazioni e riprovare.\n\n$1",
+    "config-localsettings-connection-error": "Si è verificato un errore durante la connessione al database utilizzando le impostazioni specificate in <code>LocalSettings.php</code>. Si prega di correggere queste impostazioni e riprovare.\n\n$1",
     "config-session-error": "Errore nell'avvio della sessione: $1",
     "config-session-expired": "I dati della sessione sembrano essere scaduti.\nLe sessioni sono configurate per una durata di $1.\nPuoi aumentarla impostando <code>session.gc_maxlifetime</code> nel file php.ini.\nRiavvia il processo di installazione.",
     "config-no-session": "I dati della sessione sono andati persi!\nControlla il tuo file php.ini ed assicurati che <code>session.save_path</code> è impostato su una directory appropriata.",
     "config-page-restart": "Riavvio installazione",
     "config-page-readme": "Leggimi",
     "config-page-releasenotes": "Note di versione",
+    "config-page-copying": "Copia",
     "config-page-upgradedoc": "Aggiornamento",
     "config-page-existingwiki": "Wiki esistenti",
     "config-help-restart": "Vuoi cancellare tutti i dati salvati che hai inserito e riavviare il processo di installazione?",
     "config-restart": "Sì, riavvia",
     "config-welcome": "=== Controllo dell'ambiente ===\nSaranno eseguiti controlli di base per vedere se questo ambiente è adatto per l'installazione di MediaWiki.\nRicordati di includere queste informazioni se chiedi assistenza su come completare l'installazione.",
+    "config-copyright": "=== Copyright e termini ===\n\n$1\n\nQuesto programma è un software libero; puoi redistribuirlo e/o modificarlo secondo i termini della GNU General Public License, come pubblicata dalla Free Software Foundation; o la versione 2 della Licenza o (a propria scelta) qualunque versione successiva.\n\nQuesto programma è distribuito nella speranza che sia utile, ma SENZA ALCUNA GARANZIA; senza neppure la garanzia implicita di NEGOZIABILITÀ o di APPLICABILITÀ PER UN PARTICOLARE SCOPO.\nSi veda la GNU General Public License per maggiori dettagli.\n\nQuesto programma deve essere distribuito assieme ad <doclink href=Copying>una copia della GNU General Public License</doclink>; in caso contrario, se ne può ottenere una scrivendo alla Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA oppure [http://www.gnu.org/copyleft/gpl.html leggerla in rete].",
     "config-sidebar": "* [//www.mediawiki.org Pagina principale MediaWiki]\n* [//www.mediawiki.org/wiki/Aiuto:Guida ai contenuti per utenti]\n* [//www.mediawiki.org/wiki/Manuale:Guida ai contenuti per admin]\n* [//www.mediawiki.org/wiki/Manuale:FAQ FAQ]\n----\n* <doclink href=Readme>Leggimi</doclink>\n* <doclink href=ReleaseNotes>Note di versione</doclink>\n* <doclink href=Copying>Copie</doclink>\n* <doclink href=UpgradeDoc>Aggiornamenti</doclink>",
     "config-env-good": "L'ambiente è stato controllato.\nÈ possibile installare MediaWiki.",
     "config-env-bad": "L'ambiente è stato controllato.\nNon è possibile installare MediaWiki.",
     "config-env-php": "PHP $1 è installato.",
     "config-env-php-toolow": "PHP $1 è installato.\nTuttavia, MediaWiki richiede PHP $2 o superiore.",
+    "config-unicode-using-utf8": "Usa Brion Vibber's utf8_normalize.so per la normalizzazione Unicode.",
+    "config-unicode-using-intl": "Usa [http://pecl.php.net/intl l'estensione PECL intl] per la normalizzazione Unicode.",
+    "config-unicode-pure-php-warning": "'''Attenzione:''' [http://pecl.php.net/intl l'estensione PECL intl] non è disponibile per gestire la normalizzazione Unicode, così si usa la lenta implementazione in puro PHP.\nSe esegui un sito ad alto traffico, dovresti leggere alcune considerazioni sulla [//www.mediawiki.org/wiki/Unicode_normalization_considerations normalizzazione Unicode].",
+    "config-unicode-update-warning": "'''Attenzione:''' La versione installata del gestore per la normalizzazione Unicode usa una vecchia versione della libreria [http://site.icu-project.org/ del progetto ICU].\nDovresti [//www.mediawiki.org/wiki/Unicode_normalization_considerations aggiornare] se ti interessa usare l'Unicode.",
+    "config-no-db": "Impossibile trovare un driver adatto per il database! È necessario installare un driver per PHP.\nI seguenti formati di database sono supportati: $1.\n\nSe compili PHP autonomamente, riconfiguralo attivando un client database, per esempio utilizzando <code>./configure --with-mysqli</code>.\nQualora avessi installato PHP per mezzo di un pacchetto Debian o Ubuntu, allora devi installare anche il pacchetto <code>php5-mysql</code>.",
     "config-outdated-sqlite": "'''Attenzione''': è presente SQLite $1 mentre è richiesta la versione $2, SQLite non sarà disponibile.",
     "config-no-fts3": "'''Attenzione''': SQLite è compilato senza il [//sqlite.org/fts3.html modulo FTS3], le funzionalità di ricerca non saranno disponibili su questo backend.",
+    "config-register-globals": "'''Attenzione: le variabili PHP <code>[http://php.net/register_globals register globals]</code> sono attivate.'''\n'''Disattivale se possibile.''' MediaWiki funzionerà, ma il server sarà esposto a potenziali vulnerabilità di sicurezza.",
+    "config-magic-quotes-runtime": "'''Errore: [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-runtime magic_quotes_runtime] è attivato!''' Questa opzione interferisce in modo imprevedibile con l'inserimento dei dati. Non è possibile installare o utilizzare MediaWiki a meno che questa opzione non sia disabilitata.",
+    "config-magic-quotes-sybase": "'''Errore: [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-sybase magic_quotes_sybase] è attivato!''' Questa opzione interferisce in modo imprevedibile con l'inserimento dei dati. Non è possibile installare o utilizzare MediaWiki a meno che questa opzione non sia disabilitata.",
+    "config-mbstring": "'''Errore: [http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload] è attivato!''' Questa opzione causa errori e può interferire in modo imprevedibile coi dati. Non è possibile installare o utilizzare MediaWiki a meno che questa opzione non sia disabilitata.",
+    "config-safe-mode": "'''Attenzione:''' [http://www.php.net/features.safe-mode safe mode] è attivato!\nQuesta opzione potrebbe causare problemi, in particolare nel caricamento di documenti e nel supporto delle funzioni <code>math</code>.",
     "config-xml-bad": "Il modulo XML di PHP è mancante.\nMediaWIki necessita di funzioni presenti in questo modulo e non funzionerà con la configurazione corrente.\nSe si sta eseguendo Mandrake, installare il paccketto php-xml.",
-    "config-pcre": "Il modulo per il supporto PCRE sembra essere mancante.\nMediaWiki necessita di questo modulo per funzinare, che fornisce funzioni per le espressioni regolari Perl-compatibili.",
+    "config-pcre-old": "<strong>Errore fatale:</strong> si richiede PCRE  $1 o successivo.\nIl tuo file binario PHP è collegato con PCRE $2.\n[https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/Maggiori informazioni su PCRE].",
     "config-pcre-no-utf8": "'''Errore''': Il modulo PCRE di PHP sembra essere stato compilato senza il supporto PCRE_UTF8, ma MediaWiki lo richiede per funzionare correttamente.",
     "config-memory-raised": "Il valore <code>memory_limit</code> di PHP è $1, aumentato a $2.",
     "config-memory-bad": "''Attenzione:''' Il valore di <code>memory_limit</code> di PHP è $1.\nProbabilmente è troppo basso.\nL'installazione potrebbe non riuscire!",
     "config-ctype": "'''Errore''': PHP deve essere compilato con il supporto per l'[http://www.php.net/manual/it/ctype.installation.php estensione Ctype].",
+    "config-json": "'''Errore:''' PHP è stato compilato senza il supporto per JSON. E' necessario installare l'estensione PHP per JSON o l'estensione [http://pecl.php.net/package/jsonc PECL jsonc] prima di installare MediaWiki.\n* L'estensione PHP è inclusa in Red Hat Enterprise Linux (CentOS) 5 e 6, ma deve essere abilitata in <code>/etc/php.ini</code> o <code>/etc/php.d/json.ini</code>.\n* Alcune distribuzioni di Linux pubblicate dopo il maggio 2013 omettono l'estensione PHP, e al posto utilizzano l'estensione PECL come <code>php5-json</code> o <code>php-pecl-jsonc</code>",
     "config-xcache": "[http://xcache.lighttpd.net/ XCache] è installato",
     "config-apc": "[http://www.php.net/apc APC] è installato",
     "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache] è installato",
     "config-no-cache": "'''Attenzione:''' [http://www.php.net/apc APC], [http://xcache.lighttpd.net/ XCache] o [http://www.iis.net/download/WinCacheForPhp WinCache] non sono stati trovati.\nLa caching degli oggetti non è attivata.",
+    "config-mod-security": "<strong>Attenzione:</strong> Il tuo server web ha il [http://modsecurity.org/ mod_security] abilitato. Se non correttamente configurato, può creare problemi a MediaWiki o ad altro software che permette agli utenti di pubblicare contenuto.\nFai riferimento alla [http://modsecurity.org/documentation/ documentazione sul mod_security] o contatta il supporto tecnico del tuo provider di hosting se si verificano errori.",
     "config-diff3-bad": "GNU diff3 non trovato.",
     "config-git": "Trovato software di controllo della versione Git: <code>$1</code>.",
     "config-git-bad": "Software di controllo della versione Git non trovato.",
     "config-gd": "Trovata la GD Graphics Library built-in.\nLe miniature delle immagini saranno presenti se gli upload vengono abilitati.",
     "config-no-scaling": "Impossibile trovare GD library o ImageMagick.\nLe miniature delle immagini saranno disabilitate.",
     "config-no-uri": "'''Errore:''' Impossibile determinare l'URI attuale.\nInstallazione interrotta.",
-    "config-no-cli-uri": "'''Attenzione''': --scriptpath non specificato, si utilizza il valore predefinito: <code>$1</code>.",
+    "config-no-cli-uri": "'''Attenzione''': <code>--scriptpath</code> non specificato, si utilizza il valore predefinito: <code>$1</code>.",
     "config-using-server": "Nome server in uso \"<nowiki>$1</nowiki>\".",
     "config-using-uri": "URL del server in uso \"<nowiki>$1$2</nowiki>\".",
-    "config-brokenlibxml": "Il tuo sistema ha una combinazione di versioni di PHP e libxml2 che è difettosa e che può provocare un danneggiamento non visibile di dati in MediaWiki ed in altre applicazioni per il web.\nAggiorna a PHP 5.2.9 o successivo, ed a libxml2 2.7.3 o successivo ([//bugs.php.net/bug.php?id=45996 il bug è studiato dal lato PHP]).\nInstallazione interrotta.",
-    "config-using531": "MediaWiki non può essere usato con il PHP $1 a causa di un bug che coinvolge i parametri di riferimento a <code>__call()</code>.\nAggiorna a PHP 5.3.2 o superiore, o fai un downgrade tornando a PHP 5.3.0 per risolvere il problema.\nInstallazione interrotta.",
+    "config-brokenlibxml": "Il tuo sistema ha una combinazione di versioni di PHP e libxml2 che è difettosa e che può provocare un danneggiamento non visibile di dati in MediaWiki ed in altre applicazioni per il web.\nAggiorna a libxml2 2.7.3 o successivo ([https://bugs.php.net/bug.php?id=45996 il bug è studiato dal lato PHP]).\nInstallazione interrotta.",
     "config-db-type": "Tipo di database:",
     "config-db-host": "Host del database:",
     "config-db-host-help": "Se il server del tuo database è su un server diverso, immetti qui il nome dell'host o il suo indirizzo IP.\n\nSe stai utilizzando un web hosting condiviso, il tuo hosting provider dovrebbe fornirti il nome host corretto nella sua documentazione.\n\nSe stai installando su un server Windows con uso di MySQL, l'uso di \"localhost\" potrebbe non funzionare correttamente come nome del server. In caso di problemi, prova a impostare \"127.0.0.1\" come indirizzo IP locale.\n\nSe usi PostgreSQL, lascia questo campo vuoto per consentire di connettersi tramite un socket Unix.",
     "config-db-username": "Nome utente del database:",
     "config-db-password": "Password del database:",
     "config-db-password-empty": "Inserire una password per il nuovo utente del database: $1.\nAnche se può essere possibile creare utenti senza password, questo non è sicuro.",
+    "config-db-username-empty": "È necessario immettere un valore per \"Nome utente del database\"",
     "config-db-install-username": "Inserisci il nome utente che verrà utilizzato per connettersi al database durante il processo di installazione.\nQuesto non è il nome utente dell'account MediaWiki; ma quello per il tuo database.",
     "config-db-install-password": "Inserisci la password che verrà utilizzato per connettersi al database durante il processo di installazione.\nQuesta non è la password dell'account MediaWiki; ma quella per il tuo database.",
     "config-db-install-help": "Inserire il nome utente e la password che verranno usate per la connessione al database durante il processo d'installazione.",
     "config-db-schema-help": "Questo schema in genere andrà bene.\nDa cambiare solamente se si è sicuri di averne bisogno.",
     "config-pg-test-error": "Impossibile connettersi al database '''$1''': $2",
     "config-sqlite-dir": "Directory data di SQLite:",
+    "config-sqlite-dir-help": "SQLite memorizza tutti i dati in un unico file.\n\nLa directory che indicherai deve essere scrivibile dal server web durante l'installazione.\n\nDovrebbe essere <strong>non accessibile via web</strong>, è per questo che non la stiamo mettendo dove ci sono i file PHP.\n\nL'installatore scriverà insieme ad essa un file <code>.htaccess</code>, ma se il tentativo fallisse qualcuno potrebbe avere accesso al database grezzo.\nQuesto include dati utente grezzi (indirizzi, password cifrate) così come revisioni eliminate e altri dati ad accesso limitato del wiki.\n\nConsidera l'opportunità di sistemare allo stesso tempo il database da qualche altra parte, per esempio in <code>/var/lib/mediawiki/tuowiki</code>.",
     "config-oracle-def-ts": "Tablespace di default:",
     "config-oracle-temp-ts": "Tablespace temporaneo:",
+    "config-type-mysql": "MySQL (o compatibile)",
+    "config-type-mssql": "Microsoft SQL Server",
     "config-support-info": "MediaWiki supporta i seguenti sistemi di database:\n\n$1\n\nSe fra quelli elencati qui sotto non vedi il sistema di database che vorresti utilizzare, seguire le istruzioni linkate sopra per abilitare il supporto.",
-    "config-support-mysql": "* $1 è la configurazione preferibile per MediaWiki ed è quella meglio supportata ([http://www.php.net/manual/en/mysql.installation.php come compilare PHP con supporto MySQL])",
+    "config-dbsupport-mysql": "* [{{int:version-db-mysql-url}} MySQL] è la configurazione preferibile per MediaWiki ed è quella meglio supportata. MediaWiki funziona anche con [{{int:version-db-mariadb-url}} MariaDB] e [{{int:version-db-percona-url}} Percona Server], che sono compatibili con MySQL.([http://www.php.net/manual/en/mysqli.installation.php Come compilare PHP con supporto MySQL])",
     "config-header-mysql": "Impostazioni MySQL",
     "config-header-postgres": "Impostazioni PostgreSQL",
     "config-header-sqlite": "Impostazioni SQLite",
     "config-header-oracle": "Impostazioni Oracle",
+    "config-header-mssql": "Impostazioni di Microsoft SQL Server",
     "config-invalid-db-type": "Tipo di database non valido",
     "config-missing-db-name": "È necessario immettere un valore per \"Nome del database\"",
     "config-missing-db-host": "È necessario immettere un valore per \"Host del database\"",
     "config-invalid-db-name": "Nome di database \"$1\" non valido.\nUtilizza soltanto caratteri ASCII come lettere (a-z, A-Z), numeri (0-9), sottolineatura (_) e trattini (-).",
     "config-invalid-db-prefix": "Prefisso database \"$1\" non valido.\nUtilizza soltanto caratteri ASCII come lettere (a-z, A-Z), numeri (0-9), sottolineatura (_) e trattini (-).",
     "config-connection-error": "$1.\n\nControlla host, nome utente e password e prova ancora.",
+    "config-invalid-schema": "Schema MediaWiki \"$1\" non valido.\nUsa solo lettere ASCII (a-z, A-Z), numeri (0-9) e caratteri di sottolineatura (_).",
     "config-db-sys-create-oracle": "Il programma di installazione supporta solo l'utilizzo di un account SYSDBA per la creazione di un nuovo account.",
     "config-db-sys-user-exists-oracle": "L'account utente \"$1\" esiste già. SYSDBA può essere usato solo per la creazione di un nuovo account!",
     "config-postgres-old": "PostgreSQL $1 o una versione successiva è necessaria, rilevata la $2.",
+    "config-mssql-old": "Si richiede Microsoft SQL Server $1 o successivo. Tu hai la versione $2.",
     "config-sqlite-name-help": "Scegli un nome che identifichi il tuo wiki.\nNon utilizzare spazi o trattini.\nQuesto servirà per il nome del file di dati SQLite.",
     "config-sqlite-mkdir-error": "Errore durante la creazione della directory dati \"$1\".\nControlla la posizione e riprova.",
     "config-sqlite-dir-unwritable": "Impossibile scrivere nella directory \"$1\".\nModifica le autorizzazioni in modo che il webserver possa scrivere in essa e riprova.",
     "config-mysql-charset": "Set di caratteri del database:",
     "config-mysql-binary": "Binario",
     "config-mysql-utf8": "UTF-8",
+    "config-mssql-auth": "Tipo di autenticazione:",
+    "config-mssql-sqlauth": "Autenticazione di SQL Server",
+    "config-mssql-windowsauth": "Autenticazione di Windows",
     "config-site-name": "Nome del wiki:",
     "config-site-name-help": "Questo verrà visualizzato nella barra del titolo del browser e in vari altri posti.",
     "config-site-name-blank": "Inserisci il nome del sito.",
     "config-ns-other": "Altro (specificare)",
     "config-ns-other-default": "MyWiki",
     "config-admin-box": "Account amministratore",
-    "config-admin-name": "Tuo nome:",
+    "config-admin-name": "Il tuo nome utente:",
     "config-admin-password": "Password:",
     "config-admin-password-confirm": "Ripeti la password:",
     "config-admin-help": "Inserisci il tuo nome utente scelto qui, ad esempio \"Mario Rossi\".\nQuesto è il nome che userai per accedere al wiki.",
     "config-admin-name-blank": "Inserisci un nome utente per l'amministratore.",
     "config-admin-name-invalid": "Il nome utente specificato \"<nowiki>$1</nowiki>\" non è valido.\nSpecificare un nome utente diverso.",
     "config-admin-password-blank": "Inserisci una password per l'account di amministratore.",
-    "config-admin-password-same": "La password non deve essere uguale al nome utente.",
     "config-admin-password-mismatch": "Le password inserite non coincidono tra loro.",
     "config-admin-email": "Indirizzo e-mail:",
+    "config-admin-email-help": "Inserisci qui un indirizzo email per poter ricevere email dagli altri utenti del wiki, reimpostare la tua password, ed essere informato delle modifiche apportate alle pagine tuoi osservati speciali. Se non ti interessa, puoi lasciare vuoto questo campo.",
+    "config-admin-error-user": "Errore interno durante la creazione di un amministratore con il nome \"<nowiki>$1</nowiki>\".",
+    "config-admin-error-password": "Errore interno durante l'impostazione di una password per amministratore \"<nowiki>$1</nowiki>\": <pre>$2</pre>",
     "config-admin-error-bademail": "È stato inserito un indirizzo email non valido.",
+    "config-subscribe": "Sottoscrivi la [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce mailing list degli annunci di rilasci].",
     "config-subscribe-help": "Si tratta di una mailing list a basso traffico dedicata agli annunci di nuove versioni, compresi importanti segnalazioni riguardanti la sicurezza.\nÈ consigliato iscriversi e aggiornare la proprio installazione di MediaWiki quando una nuova versione viene resa pubblica.",
     "config-subscribe-noemail": "Hai provato ad iscriverti alla mailing list dedicata agli annunci delle nuove versioni senza fornire un indirizzo email.\nInserire un indirizzo email se si desidera effettuare l'iscrizione alla mailing list.",
     "config-almost-done": "Hai quasi finito!\nAdesso puoi saltare la rimanente parte della configurazione e semplicemente installare la wiki.",
     "config-email-settings": "Impostazioni email",
     "config-enable-email": "Abilita la posta elettronica in uscita",
     "config-email-user": "Abilita invio email fra utenti",
+    "config-email-user-help": "Consente a tutti gli utenti di inviarsi a vicenda email, se lo hanno abilitato nelle loro preferenze.",
     "config-email-usertalk": "Abilita le notifiche per le pagine di discussione utente",
+    "config-email-usertalk-help": "Consente agli utenti di ricevere notifiche per le modifiche delle loro pagine di discussione, se lo hanno abilitato nelle loro preferenze.",
     "config-email-watchlist": "Abilita le notifiche per gli osservati speciali",
+    "config-email-watchlist-help": "Consente agli utenti di ricevere notifiche per pagine tra gli osservati speciali, se lo hanno abilitato nelle loro preferenze.",
     "config-email-auth": "Abilita autenticazione via email",
     "config-email-sender": "Indirizzo email di ritorno:",
     "config-upload-settings": "Caricamenti di immagini e file",
     "config-upload-enable": "Consentire il caricamento di file",
     "config-upload-deleted": "Directory per i file cancellati:",
+    "config-upload-deleted-help": "Scegli una directory in cui archiviare i file cancellati.\nIdealmente, questa non dovrebbe essere accessibile dal web.",
     "config-logo": "URL del logo:",
+    "config-logo-help": "La skin predefinita di MediaWiki include lo spazio per un logo di 135 x 160 pixel sopra il menu laterale.\nCarica un'immagine di dimensioni appropriate e inserisci l'URL qui.\n\nÈ possibile utilizzare <code>$wgStylePath</code> o <code>$wgScriptPath</code> se il logo è relativo a tali percorsi.\n\nSe non si desidera un logo, lascia vuota questa casella.",
     "config-instantcommons": "Abilita Instant Commons",
+    "config-cc-error": "Il selettore di licenze Creative Commons non ha dato alcun risultato.\nInserisci manualmente il nome della licenza.",
     "config-cc-again": "Seleziona di nuovo...",
     "config-cc-not-chosen": "Scegliere quale licenza Creative Commons si desidera e cliccare su \"procedi\".",
     "config-advanced-settings": "Configurazione avanzata",
+    "config-cache-options": "Impostazioni per la cache di oggetti:",
+    "config-cache-help": "La memorizzazione di oggetti nella cache è utilizzata per migliorare la velocità di MediaWiki attraverso l'allocazione nella cache dei dati utilizzati di frequente.\nPer siti di dimensioni medie e grandi, è caldamente consigliato attivare la cache, ma anche per piccoli siti se ne vedranno i benefici.",
+    "config-cache-none": "Nessuna memorizzazione in cache (nessuna funzionalità viene impedita, ma sui siti wiki più grandi la velocità potrebbe risentirne)",
+    "config-cache-accel": "Mettere in cache oggetti PHP (APC, XCache o WinCache)",
+    "config-cache-memcached": "Usa Memcached (richiede ulteriori attività di installazione e configurazione)",
     "config-memcached-servers": "Server di memcached:",
+    "config-memcached-help": "Elenco di indirizzi IP da utilizzare per Memcached.\nDovresti specificarne uno per riga e indicare la porta da utilizzare. Per esempio:\n 127.0.0.1:11211\n 192.168.1.25:1234",
     "config-memcache-needservers": "È stato selezionato il tipo di caching Memcached, ma non è stato impostato alcun server.",
     "config-memcache-badip": "È stato inserito un indirizzo IP non valido per Memcached: $1.",
+    "config-memcache-noport": "Non è stata specificata una porta da utilizzare per il server Memcached: $1.\nSe non sai qual'è la porta, il valore di default è 11211.",
     "config-memcache-badport": "I numeri di porta per memcached dovrebbero essere tra $1 e $2.",
     "config-extensions": "Estensioni",
+    "config-extensions-help": "Le estensioni elencate sopra sono state rilevate nella tua directory <code>./extensions</code>.\n\nQueste potrebbero richiedere ulteriore configurazione, ma è possibile attivarle ora",
+    "config-install-alreadydone": "'''Attenzione:''' sembra che hai già installato MediaWiki e stai tentando di installarlo nuovamente.\nProcedi alla pagina successiva.",
+    "config-install-begin": "Premendo \"{{int:config-continue}}\", si avvierà l'installazione di MediaWiki.\nSe prima desideri apportare altre modifiche, premi \"{{int:config-back}}\".",
     "config-install-step-done": "fatto",
     "config-install-step-failed": "non riuscito",
+    "config-install-extensions": "Comprese le estensioni",
     "config-install-database": "Configurazione database",
     "config-install-schema": "Creazione dello schema",
+    "config-install-pg-schema-not-exist": "Lo schema PostgreSQL non esiste.",
+    "config-install-pg-schema-failed": "Creazione tabelle non riuscita.\nAssicurati che l'utente \"$1\" può scrivere nello schema \"$2\".",
+    "config-install-pg-commit": "Applica le modifiche",
+    "config-install-pg-plpgsql": "Controllo il linguaggio PL/pgSQL",
+    "config-pg-no-plpgsql": "È necessario installare il linguaggio PL/pgSQL nel database $1",
+    "config-pg-no-create-privs": "L'account indicato per l'installazione non dispone dei permessi necessari per creare un'utenza.",
     "config-install-user": "Creazione di utente del database",
     "config-install-user-alreadyexists": "L'utente \"$1\" è già presente",
     "config-install-user-create-failed": "Creazione dell'utente \"$1\" non riuscita: $2",
+    "config-install-user-grant-failed": "Errore durante la concessione delle autorizzazione all'utente \"$1\": $2",
     "config-install-user-missing": "L'utente indicato \"$1\" non esiste.",
     "config-install-tables": "Creazione tabelle",
+    "config-install-tables-exist": "'''Attenzione:''' sembra che le tabelle di MediaWiki esistono già.\nSalto la creazione.",
     "config-install-tables-failed": "'''Errore''': La creazione della tabella non è riuscita: $1",
     "config-install-interwiki": "Riempimento della tabella interwiki predefinita",
     "config-install-interwiki-list": "Impossibile leggere il file <code>interwiki.list</code>.",
+    "config-install-interwiki-exists": "'''Attenzione:''' la tabella interwiki sembra che contiene già elementi.\nSalto l'elenco predefinito.",
     "config-install-stats": "Inizializzazione delle statistiche",
     "config-install-keys": "Generazione delle chiavi segrete",
+    "config-insecure-keys": "'''Attenzione:''' {{PLURAL:$2|Una chiave sicura|Delle chiavi sicure}} ($1) {{PLURAL:$2|generata|generate}} durante l'installazione non {{PLURAL:$2|è|sono}} completamente {{PLURAL:$2|sicura|sicure}}. Considera di {{PLURAL:$2|cambiarla|cambiarle}} manualmente.",
     "config-install-sysop": "Creazione dell'account utente per l'amministratore",
     "config-install-subscribe-fail": "Impossibile sottoscrivere mediawiki-announce: $1",
     "config-install-subscribe-notpossible": "cURL non è installato e allow_url_fopen non è disponibile.",
     "config-nofile": "Il file \"$1\" non può essere trovato. È stato eliminato?",
     "mainpagetext": "'''Installazione di MediaWiki completata correttamente.'''",
     "mainpagedocfooter": "Consultare la [//meta.wikimedia.org/wiki/Aiuto:Sommario Guida utente] per maggiori informazioni sull'uso di questo software wiki.\n\n== Per iniziare ==\nI seguenti collegamenti sono in lingua inglese:\n\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Impostazioni di configurazione]\n* [//www.mediawiki.org/wiki/Manual:FAQ Domande frequenti su MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Mailing list annunci MediaWiki]\n* [//www.mediawiki.org/wiki/Localisation#Translation_resources Localizza MediaWiki nella tua lingua]"
-}
\ No newline at end of file
+}
index 8c868ee..e3cdb94 100644 (file)
@@ -23,7 +23,7 @@
     "config-localsettings-badkey": "与えられたキーが間違っています",
     "config-upgrade-key-missing": "MediaWiki が既にインストールされていることを検出しました。\nインストールされているものをアップグレードするために、以下の行を <code>LocalSettings.php</code> の末尾に挿入してください:\n\n$1",
     "config-localsettings-incomplete": "既存の <code>LocalSettings.php</code> の内容は不完全のようです。\n変数 $1 が設定されていません。\n<code>LocalSettings.php</code> 内でこの変数を設定して、「{{int:Config-continue}}」をクリックしてください。",
-    "config-localsettings-connection-error": "<code>LocalSettings.php</code> ã\81¾ã\81\9fã\81¯ <code>AdminSettings.php</code> ã\81§æ\8c\87å®\9aã\81\97ã\81\9f設å®\9aã\82\92使ç\94¨ã\81\97ã\81¦ã\83\87ã\83¼ã\82¿ã\83\99ã\83¼ã\82¹ã\81«æ\8e¥ç¶\9aã\81\99ã\82\8bé\9a\9bã\81«ã\82¨ã\83©ã\83¼ã\81\8cç\99ºç\94\9fã\81\97ã\81¾ã\81\97ã\81\9fã\80\82\n設å®\9aã\82\92修正ã\81\97ã\81¦ã\81\8bã\82\89å\86\8d度試ã\81\97ã\81¦ã\81\8fã\81 ã\81\95ã\81\84ã\80\82\n\n$1",
+    "config-localsettings-connection-error": "<code>LocalSettings.php</code> で指定した設定を使用してデータベースに接続する際にエラーが発生しました。\n設定を修正してから再度試してください。\n\n$1",
     "config-session-error": "セッションの開始エラー: $1",
     "config-session-expired": "セッションの有効期限が切れたようです。\nセッションの有効期間は$1に設定されています。\nphp.iniの<code>session.gc_maxlifetime</code>を設定することで、この問題を改善できます。\nインストール作業を再起動させてください。",
     "config-no-session": "セッションのデータが消失しました!\nphp.ini 内で <code>session.save_path</code> が適切なディレクトリに設定されていることを確認してください。",
     "config-page-restart": "インストールを再起動",
     "config-page-readme": "お読みください",
     "config-page-releasenotes": "リリースノート",
-    "config-page-copying": "コピー",
+    "config-page-copying": "複製",
     "config-page-upgradedoc": "アップグレード",
     "config-page-existingwiki": "既存のウィキ",
     "config-help-restart": "入力した保存データをすべて消去して、インストール作業を再起動しますか?",
     "config-restart": "はい、再起動します",
     "config-welcome": "=== 環境の確認 ===\n基本的な確認では、現在の環境が MediaWiki のインストールに適しているかを確認します。\nインストール方法について助けが必要になった場合は、必ずこの確認結果を添えてください。",
-    "config-copyright": "=== 著作権および規約 ===\n$1\n\nこの作品はフリーソフトウェアです。あなたは、フリーソフトウェア財団の発行するGNU一般公衆利用許諾書 (GNU General Public License) (バージョン2、またはそれ以降のライセンス) の規約に基づき、このライブラリを再配布および改変できます。\n\nこの作品は、有用であることを期待して配布されていますが、商用あるいは特定の目的に適するかどうかも含めて、暗黙的にも、一切保証されません。\n詳しくは、GNU一般公衆利用許諾書をご覧ください。\n\nあなたはこのプログラムと共に、<doclink href=Copying>GNU一般公衆利用許諾契約書の複製</doclink>を一部受け取ったはずです。受け取っていない場合は、フリーソフトウェア財団 (宛先は the Free Software Foundation, Inc., 59Temple Place, Suite 330, Boston, MA 02111-1307 USA) まで請求してください。",
+    "config-copyright": "=== 著作権および規約 ===\n$1\n\nこの作品はフリーソフトウェアです。あなたは、フリーソフトウェア財団の発行する GNU 一般公衆利用許諾書 (GNU General Public License) (バージョン 2、またはそれ以降のライセンス) の規約に基づき、このライブラリを再配布および改変できます。\n\nこの作品は、有用であることを期待して配布されていますが、<strong>商用または特定の目的に適するかどうか</strong>も含めて、暗黙的にも、<strong>一切保証されません</strong>。\n詳しくは、 GNU 一般公衆利用許諾書をご覧ください。\n\nあなたはこのプログラムと共に、<doclink href=Copying>GNU 一般公衆利用許諾契約書の複製</doclink>を受け取ったはずです。受け取っていない場合は、フリーソフトウェア財団 (宛先は the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA) まで請求するか、または[http://www.gnu.org/copyleft/gpl.html オンラインでお読みください]。",
     "config-sidebar": "* [//www.mediawiki.org MediaWikiのホーム]\n* [//www.mediawiki.org/wiki/Help:Contents 利用者向け案内]\n* [//www.mediawiki.org/wiki/Manual:Contents 管理者向け案内]\n* [//www.mediawiki.org/wiki/Manual:FAQ FAQ]\n----\n* <doclink href=Readme>お読みください</doclink>\n* <doclink href=ReleaseNotes>リリースノート</doclink>\n* <doclink href=Copying>コピー</doclink>\n* <doclink href=UpgradeDoc>アップグレード</doclink>",
-    "config-env-good": "ç\92°å¢\83ã\81®ç¢ºèª\8dã\81\8cçµ\82ã\82\8fã\82\8aã\81¾ã\81\97ã\81\9fã\80\82\nMediaWikiをインストールできます。",
-    "config-env-bad": "ç\92°å¢\83ã\81®ç¢ºèª\8dã\81\8cçµ\82ã\82\8fã\82\8aã\81¾ã\81\97ã\81\9fã\80\82\nMediaWikiのインストールはできません。",
+    "config-env-good": "ç\92°å¢\83ã\82\92確èª\8dã\81\97ã\81¾ã\81\97ã\81\9fã\80\82\nMediaWiki をインストールできます。",
+    "config-env-bad": "ç\92°å¢\83ã\82\92確èª\8dã\81\97ã\81¾ã\81\97ã\81\9fã\80\82\nMediaWiki のインストールはできません。",
     "config-env-php": "PHP $1がインストールされています。",
     "config-env-php-toolow": "PHP $1 がインストールされています。\nしかし、MediaWikiには PHP $2 以上が必要です。",
     "config-unicode-using-utf8": "Unicode正規化に、Brion Vibberのutf8_normalize.soを使用。",
     "config-unicode-using-intl": "Unicode正規化に[http://pecl.php.net/intl intl PECL 拡張機能]を使用。",
-    "config-unicode-pure-php-warning": "'''警告:''' Unicode 正規化の処理に [http://pecl.php.net/intl intl PECL 拡張機能]を利用できないため、処理が遅いピュア PHP の実装を代わりに使用しています。\n高トラフィックのサイトを運営する場合は、[//www.mediawiki.org/wiki/Unicode_normalization_considerations Unicode 正規化]をお読みください。",
-    "config-unicode-update-warning": "'''警告:''' インストールされているバージョンの Unicode 正規化ラッパーは、[http://site.icu-project.org/ ICU プロジェクト]のライブラリの古いバージョンを使用しています。\nUnicode を少しでも利用する可能性がある場合は、[//www.mediawiki.org/wiki/Unicode_normalization_considerations アップグレード]してください。",
-    "config-no-db": "適切なデータベース ドライバーが見つかりませんでした! PHP にデータベース ドライバーをインストールする必要があります。\n以下の種類のデータベースに対応しています: $1\n\n共有サーバーを使用している場合は、適切なデータベース ドライバーのインストールを、サーバーの管理者に依頼してください。\nPHP を自分でコンパイルした場合は、例えば <code>./configure --with-mysql</code> を実行して、データベース クライアントを使用できるように再設定してください。\nDebian または Ubuntu のパッケージから PHP をインストールした場合は、php5-mysql モジュールもインストールする必要があります。",
-    "config-outdated-sqlite": "'''警告:''' あなたは SQLite $1 を使用していますが、最低限必要なバージョン $2 より古いバージョンです。SQLite は利用できません。",
-    "config-no-fts3": "'''警告:''' SQLite は [//sqlite.org/fts3.html FTS3] モジュールなしでコンパイルされており、このバックエンドでは検索機能は利用できなくなります。",
-    "config-register-globals": "'''警告: PHP の <code>[http://php.net/register_globals register_globals]</code> オプションが有効になっています。'''\n'''可能なら無効化してください。'''\nMediaWiki は動作しますが、サーバーの潜在的なセキュリティ脆弱性が露呈されます。",
-    "config-magic-quotes-runtime": "'''致命的エラー: [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-runtime magic_quotes_runtime] が動作しています!'''\nこのオプションは、予期せずデータ入力を破壊します。\nこのオプションを無効化しない限り、MediaWiki のインストールや使用はできません。",
-    "config-magic-quotes-sybase": "'''致命的エラー: [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-sybase magic_quotes_sybase] が動作しています!'''\nこのオプションは、予期せずデータ入力を破壊します。\nこのオプションを無効化しない限り、MediaWiki のインストールや使用はできません。",
-    "config-mbstring": "'''致命的エラー: [http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload] が動作しています!'''\nこのオプションは、エラーを引き起こし、予期せずデータを破壊するおそれがあります。\nこのオプションを無効化しない限り、MediaWiki のインストールや使用はできません。",
-    "config-ze1": "'''致命的エラー: [http://www.php.net/manual/en/ini.core.php zend.ze1_compatibility_mode] が動作しています!'''\nこのオプションは、MediaWiki において深刻なバグを引き起こします。\nこのオプションを無効化しない限り、MediaWiki のインストールや使用はできません。",
-    "config-safe-mode": "'''警告:''' PHPの[http://www.php.net/features.safe-mode セーフモード]が有効になっています。\n特に、ファイルのアップロードや<code>math</code>機能で、問題が発生するおそれがあります。",
+    "config-unicode-pure-php-warning": "<strong>警告:</strong> Unicode 正規化の処理に [http://pecl.php.net/intl intl PECL 拡張機能]を利用できないため、処理が遅いピュア PHP の実装を代わりに使用しています。\n高トラフィックのサイトを運営する場合は、[//www.mediawiki.org/wiki/Unicode_normalization_considerations Unicode 正規化]をお読みください。",
+    "config-unicode-update-warning": "<strong>警告:</strong> インストールされているバージョンの Unicode 正規化ラッパーは、[http://site.icu-project.org/ ICU プロジェクト]のライブラリの古いバージョンを使用しています。\nUnicode を少しでも利用する可能性がある場合は、[//www.mediawiki.org/wiki/Unicode_normalization_considerations アップグレード]してください。",
+    "config-no-db": "適切なデータベース ドライバーが見つかりませんでした! PHP にデータベース ドライバーをインストールする必要があります。\n以下の種類のデータベースに対応しています: $1\n\nPHP を自分でコンパイルした場合は、例えば <code>./configure --with-mysqli</code> を実行して、データベース クライアントを使用できるように再設定してください。\nDebian または Ubuntu のパッケージから PHP をインストールした場合は、モジュール (例: <code>php5-mysql</code>) もインストールする必要があります。",
+    "config-outdated-sqlite": "<strong>警告:</strong> あなたは SQLite $1 を使用していますが、最低限必要なバージョン $2 より古いバージョンです。SQLite は利用できません。",
+    "config-no-fts3": "<strong>警告:</strong> SQLite は [//sqlite.org/fts3.html FTS3] モジュールなしでコンパイルされており、このバックエンドでは検索機能は利用できなくなります。",
+    "config-register-globals": "<strong>警告: PHP の <code>[http://php.net/register_globals register_globals]</code> オプションが有効になっています。\n可能なら無効化してください。</strong>\nMediaWiki は動作しますが、サーバーの潜在的なセキュリティ脆弱性が露呈されます。",
+    "config-magic-quotes-runtime": "<strong>致命的エラー: [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-runtime magic_quotes_runtime] が動作しています!</strong>\nこのオプションは、予期せずデータ入力を破壊します。\nこのオプションを無効化しない限り、MediaWiki のインストールや使用はできません。",
+    "config-magic-quotes-sybase": "<strong>致命的エラー: [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-sybase magic_quotes_sybase] が動作しています!</strong>\nこのオプションは、予期せずデータ入力を破壊します。\nこのオプションを無効化しない限り、MediaWiki のインストールや使用はできません。",
+    "config-mbstring": "<strong>致命的エラー: [http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload] が動作しています!</strong>\nこのオプションは、エラーを引き起こし、予期せずデータを破壊するおそれがあります。\nこのオプションを無効化しない限り、MediaWiki のインストールや使用はできません。",
+    "config-safe-mode": "<strong>警告:</strong> PHPの[http://www.php.net/features.safe-mode セーフモード]が有効になっています。\n特に、ファイルのアップロードや<code>math</code>機能で、問題が発生するおそれがあります。",
     "config-xml-bad": "PHPのXMLモジュールが不足しています。\nMediaWikiは、このモジュールの関数を必要としているため、この構成では動作しません。\nMandrakeを実行している場合、php-xmlパッケージをインストールしてください。",
-    "config-pcre": "PCREをサポートしているモジュールが不足しているようです。\nMediaWikiは、Perl互換の正規表現関数の動作が必要です。",
-    "config-pcre-no-utf8": "'''致命的エラー:''' PHP の PCRE が PCRE_UTF8 対応なしでコンパイルされているようです。\nMediaWiki を正しく動作させるには、UTF-8 対応が必要です。",
+    "config-pcre-old": "<strong>致命的エラー:</strong> PCRE $1 以降が必要です。\nご使用中の PHP のバイナリは PCRE $2 とリンクされています。\n[https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/PCRE 詳細情報]",
+    "config-pcre-no-utf8": "<strong>致命的エラー:</strong> PHP の PCRE が PCRE_UTF8 対応なしでコンパイルされているようです。\nMediaWiki を正しく動作させるには、UTF-8 対応が必要です。",
     "config-memory-raised": "PHPの<code>memory_limit</code>は$1で、$2に引き上げられました。",
-    "config-memory-bad": "'''警告:''' PHPの<code>memory_limit</code>に$1に設定されています。\nこの値はおそらく小さすぎます。\nインストールが失敗するおそれがあります!",
+    "config-memory-bad": "<strong>警告:</strong> PHPの<code>memory_limit</code>に$1に設定されています。\nこの値はおそらく小さすぎます。\nインストールが失敗するおそれがあります!",
+    "config-ctype": "<strong>致命的エラー:</strong> PHP は [http://www.php.net/manual/en/ctype.installation.php Ctype 拡張モジュール]のサポート付きでコンパイルされている必要があります。",
+    "config-json": "<strong>致命的エラー:</strong> PHP は JSON サポートなしでコンパイルされています。\nPHP に JSON 拡張モジュールまたは [http://pecl.php.net/package/jsonc PECL jsonc] 拡張モジュールをインストールしてから、MediaWiki をインストールしてください。\n* Red Hat Enterprise Linux (CentOS) 5 および 6には PHP の拡張機能が含まれているため、<code>/etc/php.ini</code> または <code>/etc/php.d/json.ini</code> から有効にしてください。\n* 2013年5月以降にリリースされた一部の Linux ディストリビューションでは、PHP 拡張モジュールの代わりに、<code>php5-json</code> または <code>php-pecl-jsonc</code> として PECL が同梱されています。",
     "config-xcache": "[http://xcache.lighttpd.net/ XCache] がインストール済み",
     "config-apc": "[http://www.php.net/apc APC] がインストール済み",
     "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache] がインストール済み",
-    "config-no-cache": "'''警告:''' [http://www.php.net/apc APC]、[http://xcache.lighttpd.net/ XCache]、[http://www.iis.net/download/WinCacheForPhp WinCache] のいずれも見つかりませんでした。\nオブジェクトのキャッシュは有効化されません。",
+    "config-no-cache": "<strong>警告:</strong> [http://www.php.net/apc APC]、[http://xcache.lighttpd.net/ XCache]、[http://www.iis.net/download/WinCacheForPhp WinCache] のいずれも見つかりませんでした。\nオブジェクトのキャッシュは有効化されません。",
+    "config-mod-security": "<strong>警告:</strong> あなたのウェブサーバーでは [http://modsecurity.org/ mod_security] が有効になっています。正しく構成されていない場合は、MediaWiki や利用者にコンテンツの投稿を許可するその他のソフトウェアに問題が発生する場合があります。\n[http://modsecurity.org/documentation/ mod_security の説明文書]を確認するか、ランダムなエラーが発生した場合はあなたのホストのサポートにお問い合わせください。",
     "config-diff3-bad": "GNU diff3 が見つかりません。",
     "config-git": "バージョン管理ソフトウェア Git が見つかりました: <code>$1</code>",
     "config-git-bad": "バージョン管理ソフトウェア Git が見つかりません。",
     "config-imagemagick": "ImageMagickが見つかりました: <code>$1</code>。\nアップロードが有効であれば、画像のサムネイルを利用できます。",
     "config-gd": "GD画像ライブラリが内蔵されていることが確認されました。\nアップロードが有効なら、画像のサムネイルが利用できます。",
     "config-no-scaling": "GDライブラリもImageMagickも見つかりませんでした。\n画像のサムネイル生成は無効になります。",
-    "config-no-uri": "'''エラー:''' 現在のURIを決定できませんでした。\nインストールは中止されました。",
-    "config-no-cli-uri": "'''警告:''' --scriptpath が指定されていないため、既定値 <code>$1</code> を使用します。",
+    "config-no-uri": "<strong>エラー:</strong> 現在のURIを決定できませんでした。\nインストールは中止されました。",
+    "config-no-cli-uri": "<strong>警告:</strong> <code>--scriptpath</code> が指定されていないため、既定値 <code>$1</code> を使用します。",
     "config-using-server": "サーバー名「<nowiki>$1</nowiki>」を使用しています。",
     "config-using-uri": "サーバー URL「<nowiki>$1$2</nowiki>」を使用しています。",
-    "config-uploads-not-safe": "'''警告:''' アップロードの既定ディレクトリ <code>$1</code> に、任意のスクリプト実行に関する脆弱性があります。\nMediaWiki はアップロードされたファイルのセキュリティ上の脅威を確認しますが、アップロードを有効化する前に、[//www.mediawiki.org/wiki/Manual:Security#Upload_security このセキュリティ上の脆弱性を解決する]ことを強く推奨します。",
-    "config-brokenlibxml": "このシステムで使われているPHPとlibxml2のバージョンのこの組み合わせにはバグがあります。具体的には、MediaWikiやその他のウェブアプリケーションでhiddenデータが破損する可能性があります。\nPHPを5.2.9かそれ以降のバージョンに、libxml2を2.7.3かそれ以降のバージョンにアップグレードしてください([//bugs.php.net/bug.php?id=45996 PHPでのバグ情報])。\nインストールを終了します。",
-    "config-using531": "PHP$1は<code>__call()</code>の引数参照に関するバグのため、MediaWikiと互換性がありません。\nPHP5.3.2以降に更新するか、この([//bugs.php.net/bug.php?id=50394 PHPに提出されたバグ])を修正するためにPHP5.3.0へ戻してください。\nインストールは中止されました。",
+    "config-uploads-not-safe": "<strong>警告:</strong> アップロードの既定ディレクトリ <code>$1</code> に、任意のスクリプト実行に関する脆弱性があります。\nMediaWiki はアップロードされたファイルのセキュリティ上の脅威を確認しますが、アップロードを有効化する前に、[//www.mediawiki.org/wiki/Manual:Security#Upload_security このセキュリティ上の脆弱性を解決する]ことを強く推奨します。",
+    "config-brokenlibxml": "このシステムで使われているPHPとlibxml2のバージョンのこの組み合わせにはバグがあります。具体的には、MediaWikiやその他のウェブアプリケーションでhiddenデータが破損する可能性があります。\nlibxml2を2.7.3以降のバージョンにアップグレードしてください([//bugs.php.net/bug.php?id=45996 PHPでのバグ情報])。\nインストールを終了します。",
     "config-suhosin-max-value-length": "Suhosin がインストールされており、GET パラメーターの <code>length</code> を $1 バイトに制限しています。\nMediaWiki の ResourceLoader コンポーネントはこの制限を回避しますが、パフォーマンスは低下します。\n可能な限り、<code>php.ini</code> で <code>suhosin.get.max_value_length</code> を 1024 以上に設定し、同じ値を <code>LocalSettings.php</code> 内で <code>$wgResourceLoaderMaxQueryLength</code> に設定してください。",
     "config-db-type": "データベースの種類:",
     "config-db-host": "データベースのホスト:",
     "config-db-username": "データベースのユーザー名:",
     "config-db-password": "データベースのパスワード:",
     "config-db-password-empty": "新しいデータベースの利用者名 $1 のパスワードを入力してください。\nパスワードを設定せずにユーザーを作成できる場合もありますが、安全ではありません。",
+    "config-db-username-empty": "「{{int:config-db-username}}」を入力してください",
     "config-db-install-username": "インストール中にデータベースへの接続で使用するユーザー名を入力してください。\nこれは MediaWiki アカウントの利用者名のことではありません。あなたのデータベースでのユーザー名です。",
     "config-db-install-password": "インストール中にデータベースへの接続で使用するパスワードを入力してください。\nこれは MediaWiki アカウントのパスワードのことではありません。あなたのデータベースでのパスワードです。",
     "config-db-install-help": "インストール作業中にデータベースに接続するための利用者名とパスワードを入力してください。",
     "config-charset-mysql5-binary": "MySQL 4.1/5.0 バイナリ",
     "config-charset-mysql5": "MySQL 4.1/5.0 UTF-8",
     "config-charset-mysql4": "MySQL 4.0 後方互換 UTF-8",
-    "config-charset-help": "'''警告:''' MySQL 4.1+ で'''後方互換 UTF-8''' を使用している状態で、<code>mysqldump</code> でデータベースをバックアップすると、すべての非 ASCII 文字が破壊されてしまい、バックアップが不可逆的に破損してしまいます!\n\n'''バイナリ モード'''では、MediaWiki は、UTF-8 テキストをデータベースのバイナリ フィールドに格納します。\nこれは、MySQL の UTF-8 モードより効率的で、Unicode 文字の全範囲を利用できるようになります。\n'''UTF-8 モード'''では、MySQL は、データ内で使用している文字集合を知っているため、適切に表現や変換ができますが、\n[//ja.wikipedia.org/wiki/%E5%9F%BA%E6%9C%AC%E5%A4%9A%E8%A8%80%E8%AA%9E%E9%9D%A2 基本多言語面]の外にある文字を格納できません。",
+    "config-charset-help": "<strong>警告:</strong> MySQL 4.1+ で<strong>後方互換 UTF-8</strong> を使用している状態で、<code>mysqldump</code> でデータベースをバックアップすると、すべての非 ASCII 文字が破壊されてしまい、バックアップが不可逆的に破損してしまいます!\n\n<strong>バイナリ モード</strong>では、MediaWiki は、UTF-8 テキストをデータベースのバイナリ フィールドに格納します。\nこれは、MySQL の UTF-8 モードより効率的で、Unicode 文字の全範囲を利用できるようになります。\n<strong>UTF-8 モード</strong>では、MySQL は、データ内で使用している文字集合を知っているため、適切に表現や変換ができますが、\n[//ja.wikipedia.org/wiki/%E5%9F%BA%E6%9C%AC%E5%A4%9A%E8%A8%80%E8%AA%9E%E9%9D%A2 基本多言語面]の外にある文字を格納できません。",
     "config-mysql-old": "MySQL $1 以降が必要です。ご使用中の MySQL は $2 です。",
     "config-db-port": "データベースのポート:",
     "config-db-schema": "MediaWiki のスキーマ:",
     "config-db-schema-help": "通常はこのスキーマで問題ありません。\n必要な場合のみ変更してください。",
-    "config-pg-test-error": "データベース '''$1''' に接続できません: $2",
+    "config-pg-test-error": "データベース <strong>$1</strong> に接続できません: $2",
     "config-sqlite-dir": "SQLite データ ディレクトリ:",
-    "config-sqlite-dir-help": "SQLite は単一のファイル内にすべてのデータを格納しています。\n\n指定したディレクトリは、インストール時にウェブ サーバーが書き込めるようにしておく必要があります。\n\nこのディレクトリはウェブからアクセス'''不可能'''である必要があります。PHP ファイルがある場所には配置できないのはこのためです。\n\nインストーラーは <code>.htaccess</code> ファイルにも書き込みます。しかし、これが失敗した場合は、誰かが生のデータベースにアクセスできてしまいます。\nデータベースは、生のデータ (メールアドレス、パスワードのハッシュ値) の他、削除された版、その他ウィキ上の制限されているデータを含んでいます。\n\n例えば <code>/var/lib/mediawiki/yourwiki</code> のように、別の場所にデータベースを配置することを検討してください。",
+    "config-sqlite-dir-help": "SQLite は単一のファイル内にすべてのデータを格納しています。\n\n指定したディレクトリは、インストール時にウェブ サーバーが書き込めるようにしておく必要があります。\n\nこのディレクトリはウェブからアクセス<strong>不可能</strong>である必要があります。PHP ファイルがある場所には配置できないのはこのためです。\n\nインストーラーは <code>.htaccess</code> ファイルにも書き込みます。しかし、これが失敗した場合は、誰かが生のデータベースにアクセスできてしまいます。\nデータベースは、生のデータ (メールアドレス、パスワードのハッシュ値) の他、削除された版、その他ウィキ上の制限されているデータを含んでいます。\n\n例えば <code>/var/lib/mediawiki/yourwiki</code> のように、別の場所にデータベースを配置することを検討してください。",
     "config-oracle-def-ts": "既定のテーブル領域:",
     "config-oracle-temp-ts": "一時的なテーブル領域:",
-    "config-type-mysql": "MySQL",
+    "config-type-mysql": "MySQL(または互換製品)",
     "config-type-postgres": "PostgreSQL",
     "config-type-sqlite": "SQLite",
     "config-type-oracle": "Oracle",
     "config-support-info": "MediaWiki は以下のデータベース システムに対応しています:\n\n$1\n\n使用しようとしているデータベース システムが下記の一覧にない場合は、上記リンク先の手順に従ってインストールしてください。",
-    "config-support-mysql": "* $1はMediaWikiの主要な対象であり、最もサポートされています ([http://www.php.net/manual/en/mysql.installation.php MySQLに対応したPHPをコンパイルする方法])",
-    "config-support-postgres": "* $1は、MySQLの代替として人気があるオープンソースのデータベースシステムです ([http://www.php.net/manual/en/pgsql.installation.php PostgreSQLに対応したPHPをコンパイルする方法])",
-    "config-support-sqlite": "* $1は、良くサポートされている、軽量データベースシステムです。([http://www.php.net/manual/ja/pdo.installation.php SQLiteに対応したPHPをコンパイルする方法]、PDOを使用)",
-    "config-support-oracle": "* $1は商業企業のデータベースです。([http://www.php.net/manual/en/oci8.installation.php OCI8サポートなPHPをコンパイルする方法])",
+    "config-dbsupport-mysql": "* [{{int:version-db-mysql-url}} MySQL]はMediaWikiの主要な対象であり、最もよくサポートされています。MediaWikiはMySQLと互換性のある[{{int:version-db-mariadb-url}} MariaDB]、[{{int:version-db-percona-url}} Percona Server]でも動きます。 ([http://www.php.net/manual/ja/mysqli.installation.php PHPをMySQLサポート付きでコンパイルする方法])",
+    "config-dbsupport-postgres": "* [{{int:version-db-postgres-url}} PostgreSQL] は、MySQLの代替として人気があるオープンソースのデータベースシステムです。細部の未解消バグがある場合があるため、プロダクション環境での使用は推奨されません。 ([http://www.php.net/manual/en/pgsql.installation.php PHPをPostgreSQLサポート付きでコンパイルする方法])",
+    "config-dbsupport-sqlite": "* [{{int:version-db-sqlite-url}} SQLite]は、良くサポートされている、軽量データベースシステムです。([http://www.php.net/manual/ja/pdo.installation.php SQLiteに対応したPHPをコンパイルする方法]、PDOを使用)",
+    "config-dbsupport-oracle": "* [{{int:version-db-oracle-url}} Oracle]は商業企業のデータベースです。([http://www.php.net/manual/en/oci8.installation.php OCI8サポートなPHPをコンパイルする方法])",
+    "config-dbsupport-mssql": "* [{{int:version-db-mssql-url}} Microsoft SQL Server]は商業企業のWindows用データベースです。([http://www.php.net/manual/en/sqlsrv.installation.php SQLSRVサポートなPHPをコンパイルする方法])",
     "config-header-mysql": "MySQL の設定",
     "config-header-postgres": "PostgreSQL の設定",
     "config-header-sqlite": "SQLite の設定",
     "config-header-oracle": "Oracle の設定",
-    "config-invalid-db-type": "無効なデータベースの種類",
-    "config-missing-db-name": "「データベース名」を入力してください",
-    "config-missing-db-host": "「データベースのホスト」を入力してください",
-    "config-missing-db-server-oracle": "「データベース TNS」の値を入力してください",
-    "config-invalid-db-server-oracle": "「$1」は無効なデータベース TNS です。\n「TNS 名」「Easy Connect」文字列のいずれかを使用してください ([http://docs.oracle.com/cd/E11882_01/network.112/e10836/naming.htm Oracle ネーミング メソッド])",
+    "config-header-mssql": "Microsoft SQL Server の設定",
+    "config-invalid-db-type": "データベースの種類が無効です。",
+    "config-missing-db-name": "「{{int:config-db-name}}」を入力してください",
+    "config-missing-db-host": "「{{int:config-db-host}}」を入力してください。",
+    "config-missing-db-server-oracle": "「{{int:config-db-host-oracle}}」の値を入力してください",
+    "config-invalid-db-server-oracle": "「$1」は無効なデータベース TNS です。\n「TNS 名」「Easy Connect」文字列のいずれかを使用してください ([http://docs.oracle.com/cd/E11882_01/network.112/e10836/naming.htm Oracle ネーミング メソッド])。",
     "config-invalid-db-name": "「$1」は無効なデータベース名です。\n半角の英数字 (a-z、A-Z、0-9)、アンダースコア (_)、ハイフン (-) のみを使用してください。",
     "config-invalid-db-prefix": "「$1」は無効なデータベース接頭辞です。\n半角の英数字 (a-z、A-Z、0-9)、アンダースコア (_)、ハイフン (-) のみを使用してください。",
     "config-connection-error": "$1。\n\n以下のホスト名、ユーザー名、パスワードを確認してから再度試してください。",
     "config-invalid-schema": "「$1」は MediaWiki のスキーマとして無効です。\n半角の英数字 (a-z、A-Z、0-9)、アンダースコア (_) のみを使用してください。",
+    "config-db-sys-user-exists-oracle": "利用者アカウント「$1」は既に存在します。SYSDBA は新しいアカウントの作成のみに使用できます!",
     "config-postgres-old": "PostgreSQL $1 以降が必要です。ご使用中の PostgreSQL は $2 です。",
+    "config-mssql-old": "Microsoft SQL Server $1 以降が必要です。ご使用中の Microsoft SQL Server は $2 です。",
     "config-sqlite-name-help": "あなたのウェキと同一性のある名前を選んでください。\n空白およびハイフンは使用しないでください。\nSQLiteのデータファイル名として使用されます。",
     "config-sqlite-parent-unwritable-group": "データ ディレクトリ <code><nowiki>$1</nowiki></code> を作成できません。ウェブ サーバーは親ディレクトリ <code><nowiki>$2</nowiki></code> に書き込めませんでした。\n\nインストーラーは、ウェブ サーバーの実行ユーザーを特定しました。\n続行するには、ディレクトリ <code><nowiki>$3</nowiki></code> に書き込めるようにしてください。\nUnix または Linux であれば、以下を実行してください:\n\n<pre>cd $2\nmkdir $3\nchgrp $4 $3\nchmod g+w $3</pre>",
     "config-sqlite-parent-unwritable-nogroup": "データ ディレクトリ <code><nowiki>$1</nowiki></code> を作成できません。ウェブ サーバーは、親ディレクトリ <code><nowiki>$2</nowiki></code> に書き込めませんでした。\n\nインストーラーは、ウェブ サーバーの実行ユーザーを特定できませんでした。\n続行するには、ディレクトリ <code><nowiki>$3</nowiki></code> に、ウェブ サーバー (と、あらゆる人々!) がグローバルに書き込めるようにしてください。\nUnix または Linux では、以下を実行してください:\n\n<pre>cd $2\nmkdir $3\nchmod a+w $3</pre>",
     "config-sqlite-readonly": "ファイル <code>$1</code> に書き込めません。",
     "config-sqlite-cant-create-db": "データベース ファイル <code>$1</code> を作成できませんでした。",
     "config-sqlite-fts3-downgrade": "PHP が FTS3 に対応していないため、テーブルをダウングレードしています",
-    "config-can-upgrade": "このデータベースには MediaWiki テーブルがあります。\nこれらのテーブルを MediaWiki $1 にアップグレードするには、「続行」をクリックしてください。",
-    "config-upgrade-done": "更新は完了しました。\n\n[$1 ウィキを使い始める]ことができます。\n\n<code>LocalSettings.php</code> ファイルを再生成したい場合は、下のボタンを押してください。\nウィキに問題がある場合を除き、再生成は'''推奨されません'''。",
+    "config-can-upgrade": "このデータベースには MediaWiki テーブルがあります。\nこれらのテーブルを MediaWiki $1 にアップグレードするには、<strong>続行</strong>をクリックしてください。",
+    "config-upgrade-done": "更新は完了しました。\n\n[$1 ウィキを使い始める]ことができます。\n\n<code>LocalSettings.php</code> ファイルを再生成したい場合は、下のボタンを押してください。\nウィキに問題がある場合を除き、再生成は<strong>推奨されません</strong>。",
     "config-upgrade-done-no-regenerate": "アップグレードが完了しました。\n\n[$1 ウィキの使用を開始]することができます。",
     "config-regenerate": "LocalSettings.php を再生成→",
     "config-show-table-status": "<code>SHOW TABLE STATUS</code> クエリが失敗しました!",
-    "config-unknown-collation": "'''警告:''' データベースは認識されない照合を使用しています。",
+    "config-unknown-collation": "<strong>警告:</strong> データベースは認識されない照合を使用しています。",
     "config-db-web-account": "ウェブアクセスのためのデータベースアカウント",
     "config-db-web-help": "ウィキの通常の操作の際に、ウェブ サーバーがデータベース サーバーに接続できるように、ユーザー名とパスワードを指定してください。",
     "config-db-web-account-same": "インストール作業と同じアカウントを使用する",
     "config-mysql-engine": "ストレージ エンジン:",
     "config-mysql-innodb": "InnoDB",
     "config-mysql-myisam": "MyISAM",
-    "config-mysql-engine-help": "'''InnoDB'''は、並行処理のサポートに優れているので、ほとんどの場合において最良の選択肢です。\n\n'''MyISAM'''は、利用者が1人の場合、あるいは読み込み専用でインストールする場合に、より処理が早くなるでしょう。\nただし、MyISAMのデータベースは、InnoDBより高頻度で破損する傾向があります。",
+    "config-mysql-engine-help": "<strong>InnoDB</strong>は、並行処理のサポートに優れているので、ほとんどの場合において最良の選択肢です。\n\n<strong>MyISAM</strong>は、利用者が1人の場合、あるいは読み込み専用でインストールする場合に、より処理が早くなるでしょう。\nただし、MyISAMのデータベースは、InnoDBより高頻度で破損する傾向があります。",
     "config-mysql-charset": "データベースの文字セット:",
     "config-mysql-binary": "バイナリ",
     "config-mysql-utf8": "UTF-8",
-    "config-mysql-charset-help": "'''バイナリ モード'''では、MediaWiki は、UTF-8 テキストをデータベースのバイナリ フィールドに格納します。\nこれは、MySQL の UTF-8 モードより効率的で、Unicode 文字の全範囲を利用できるようになります。\n\n'''UTF-8 モード'''では、MySQL は、データ内で使用している文字集合を知っているため、適切に表現や変換ができますが、\n[//ja.wikipedia.org/wiki/%E5%9F%BA%E6%9C%AC%E5%A4%9A%E8%A8%80%E8%AA%9E%E9%9D%A2 基本多言語面]の外にある文字を格納できません。",
+    "config-mysql-charset-help": "<strong>バイナリ モード</strong>では、MediaWiki は、UTF-8 テキストをデータベースのバイナリ フィールドに格納します。\nこれは、MySQL の UTF-8 モードより効率的で、Unicode 文字の全範囲を利用できるようになります。\n\n<strong>UTF-8 モード</strong>では、MySQL は、データ内で使用している文字集合を知っているため、適切に表現や変換ができますが、\n[//ja.wikipedia.org/wiki/%E5%9F%BA%E6%9C%AC%E5%A4%9A%E8%A8%80%E8%AA%9E%E9%9D%A2 基本多言語面]の外にある文字を格納できません。",
+    "config-mssql-auth": "認証の種類:",
+    "config-mssql-install-auth": "インストール過程でデータベースに接続するために使用する認証の種類を選択してください。\n「{{int:config-mssql-windowsauth}}」を選択した場合、ウェブサーバーを実行しているユーザーの認証情報が使用されます。",
+    "config-mssql-web-auth": "ウィキの通常の操作の際にウェブサーバーがデータベースサーバーに接続するために使用する認証の種類を選択してください。\n「{{int:config-mssql-windowsauth}}」を選択した場合、ウェブサーバーを実行しているユーザーの認証情報が使用されます。",
+    "config-mssql-sqlauth": "SQL Server 認証",
+    "config-mssql-windowsauth": "Windows 認証",
     "config-site-name": "ウィキ名:",
     "config-site-name-help": "この事象はブラウザーのタイトルバーと他のさまざまな場所に現れる。",
     "config-site-name-blank": "サイト名を入力してください。",
     "config-project-namespace-help": "ウィキペディアの例に従い、多くのウィキは、コンテンツのページとは分離したポリシーページを「'''プロジェクトの名前空間'''」に持っています。\nこの名前空間内のページのページ名はすべて特定の接頭辞で始まります。それをここで指定できます。\n通常、この接頭辞はウィキ名に基づきますが、「#」や「:」のような区切り文字を含めることはできません。",
     "config-ns-invalid": "指定した名前空間「<nowiki>$1</nowiki>」は無効です。\n別のプロジェクト名前空間を指定してください。",
     "config-admin-box": "管理アカウント",
-    "config-admin-name": "å\90\8då\89\8d:",
+    "config-admin-name": "å\88©ç\94¨è\80\85å\90\8d:",
     "config-admin-password": "パスワード:",
     "config-admin-password-confirm": "パスワードの再入力:",
     "config-admin-help": "希望するユーザー名をここに入力してください (例:「Joe Bloggs」)。\nこの名前でこのウィキにログインすることになります。",
     "config-admin-name-blank": "管理者のユーザー名を入力してください。",
     "config-admin-name-invalid": "指定したユーザー名「<nowiki>$1</nowiki>」は無効です。\n別のユーザー名を指定してください。",
     "config-admin-password-blank": "管理者アカウントのパスワードを入力してください。",
-    "config-admin-password-same": "ユーザー名と同じパスワードは使用できません。",
     "config-admin-password-mismatch": "入力された2つのパスワードが一致しません。",
     "config-admin-email": "メールアドレス:",
     "config-admin-email-help": "メールアドレスを入力してください。他の利用者からのメールの受け取り、パスワードのリセット、ウォッチリストに登録したページの更新通知に使用します。空欄のままにすることもできます。",
     "config-profile-no-anon": "アカウントの作成が必要",
     "config-profile-fishbowl": "承認された編集者のみ",
     "config-profile-private": "非公開ウィキ",
-    "config-profile-help": "ウィキは、できるだけ多くの人が編集できるようにすると最も優れた働きをします。\nMediaWikiでは、最近の更新を確認しやすく、神経質な、または悪意を持った利用者からの損害を簡単に差し戻せます。\n\nしかし一方で、MediaWikiは、さらにさまざまな形態での利用も優れていると言われています。また、時には、すべての人にウィキ手法の利点を説得させるのは容易ではないかもしれません。\nそこで、選択肢があります。\n\n「'''{{int:config-profile-wiki}}'''」モデルでは、ログインしなくても、誰でも編集できます。\n「'''{{int:config-profile-no-anon}}'''」なウィキでは、各編集に対してより強い説明責任を付与しますが、気軽な投稿を阻害するかもしれません。\n\n「'''{{int:config-profile-fishbowl}}'''」シナリオでは、承認された利用者のみが編集でき、一般の人はページ (とその履歴) を閲覧できます。\n「'''{{int:config-profile-private}}'''」では、承認された利用者のみがページを閲覧でき、そのグループが編集できます。\n\nより複雑な利用者権限の設定は、インストール後に設定できます。詳細は[//www.mediawiki.org/wiki/Manual:User_rights 関連するマニュアル]をご覧ください。",
+    "config-profile-help": "ウィキは、できるだけ多くの人が編集できるようにすると最も優れた働きをします。\nMediaWikiでは、最近の更新を確認しやすく、神経質な、または悪意を持った利用者からの損害を簡単に差し戻せます。\n\nしかし一方で、MediaWikiは、さらにさまざまな形態での利用も優れていると言われています。また、時には、すべての人にウィキ手法の利点を説得させるのは容易ではないかもしれません。\nそこで、選択肢があります。\n\n「<strong>{{int:config-profile-wiki}}</strong>」モデルでは、ログインしなくても、誰でも編集できます。\n「<strong>{{int:config-profile-no-anon}}</strong>」なウィキでは、各編集に対してより強い説明責任を付与しますが、気軽な投稿を阻害するかもしれません。\n\n「<strong>{{int:config-profile-fishbowl}}</strong>」シナリオでは、承認された利用者のみが編集でき、一般の人はページ (とその履歴) を閲覧できます。\n「<strong>{{int:config-profile-private}}</strong>」では、承認された利用者のみがページを閲覧でき、そのグループが編集できます。\n\nより複雑な利用者権限の設定は、インストール後に設定できます。詳細は[//www.mediawiki.org/wiki/Manual:User_rights 関連するマニュアル]をご覧ください。",
     "config-license": "著作権とライセンス:",
     "config-license-none": "ライセンスのフッターを付けない",
     "config-license-cc-by-sa": "クリエイティブ・コモンズ 表示-継承",
     "config-license-cc-by": "クリエイティブ・コモンズ 表示",
     "config-license-cc-by-nc-sa": "クリエイティブ・コモンズ 表示-非営利-継承",
+    "config-license-cc-0": "クリエイティブ・コモンズ・ゼロ(パブリックドメイン)",
     "config-license-gfdl": "GNU フリー文書利用許諾契約書 1.3 以降",
     "config-license-pd": "パブリック・ドメイン",
     "config-license-cc-choose": "その他のクリエイティブ・コモンズ・ライセンスを選択する",
-    "config-license-help": "多くの公開ウィキでは、すべての寄稿物が[http://freedomdefined.org/Definition フリーライセンス]のもとに置かれています。\nこうすることにより、コミュニティによる共有の感覚が生まれ、長期的な寄稿が促されます。\n私的ウィキや企業のウィキでは、通常、フリーライセンスにする必要はありません。\n\nウィキペディアにあるテキストをあなたのウィキで利用し、逆にあなたのウィキにあるテキストをウィキペディアに複製することを許可したい場合には、'''クリエイティブ・コモンズ 表示-継承'''を選択するべきです。\n\nウィキペディアは以前、GNUフリー文書利用許諾契約書(GFDL)を使用していました。\nGFDLは有効なライセンスですが、内容を理解するのは困難です。\nまた、GFDLのもとに置かれているコンテンツの再利用も困難です。",
+    "config-license-help": "多くの公開ウィキでは、すべての寄稿物が[http://freedomdefined.org/Definition フリーライセンス]のもとに置かれています。\nこうすることにより、コミュニティによる共有の感覚が生まれ、長期的な寄稿が促されます。\n私的ウィキや企業のウィキでは、通常、フリーライセンスにする必要はありません。\n\nウィキペディアにあるテキストをあなたのウィキで利用し、逆にあなたのウィキにあるテキストをウィキペディアに複製することを許可したい場合には、<strong>クリエイティブ・コモンズ 表示-継承</strong>を選択するべきです。\n\nウィキペディアは以前、GNUフリー文書利用許諾契約書(GFDL)を使用していました。\nGFDLは有効なライセンスですが、内容を理解するのは困難です。\nまた、GFDLのもとに置かれているコンテンツの再利用も困難です。",
     "config-email-settings": "メールの設定",
     "config-enable-email": "メール送信を有効にする",
     "config-enable-email-help": "メールを使用したい場合は、[http://www.php.net/manual/en/mail.configuration.php PHP のメール設定]が正しく設定されている必要があります。\nメールの機能を使用しない場合は、ここで無効にすることができます。",
     "config-email-watchlist": "ウォッチリストの通知を有効にする",
     "config-email-watchlist-help": "利用者が設定で有効にしている場合、閲覧されたページに関する通知を受け取ることを許可する。",
     "config-email-auth": "メールの認証を有効にする",
-    "config-email-auth-help": "この選択肢を有効にすると、利用者がメールアドレスを設定あるいは変更したときに送信されるリンクにより、そのアドレスを確認しなければならなくなります。\n認証済みのアドレスだけが、他の利用者からのメールや、変更通知のメールを受け取ることができます。\n公開ウィキでは、メール機能による潜在的な不正利用の防止のため、この選択肢を設定することが'''推奨'''されます。",
+    "config-email-auth-help": "この選択肢を有効にすると、利用者がメールアドレスを設定あるいは変更したときに送信されるリンクにより、そのアドレスを確認しなければならなくなります。\n認証済みのアドレスだけが、他の利用者からのメールや、変更通知のメールを受け取ることができます。\n公開ウィキでは、メール機能による潜在的な不正利用の防止のため、この選択肢を設定することが<strong>推奨</strong>されます。",
     "config-email-sender": "返信先メールアドレス:",
     "config-email-sender-help": "送信メールで返信先として使用するメールアドレスを入力してください。\nこのアドレスは、宛先不明の場合の通知の宛先になります。\n多くのメールサーバーでは、少なくともドメイン名部分は有効である必要があります。",
     "config-upload-settings": "画像およびファイルのアップロード",
     "config-memcache-noport": "Memcached サーバー $1 で使用するポート番号を指定していません。\nポート番号が分からない場合、既定値は 11211 です。",
     "config-memcache-badport": "Memcached のポート番号は $1 から $2 の範囲にしてください。",
     "config-extensions": "拡張機能",
-    "config-extensions-help": "<code>./extensions</code>ディレクトリ内で、上記リストの拡張機能が発見されました。\n\nこれらは更に多くの設定を要求するかもしれませんが、今これらを有効にすることができます。",
-    "config-install-alreadydone": "'''警告:''' 既にMediaWikiがインストール済みで、再びインストールし直そうとしています。\n次のページへ進んでください。",
+    "config-extensions-help": "<code>./extensions</code> ディレクトリ内で、上に列挙した拡張機能を検出しました。\n\nこれらの拡張機能には追加の設定が必要な場合がありますが、今すぐ有効化できます。",
+    "config-install-alreadydone": "<strong>警告:</strong> 既にMediaWikiがインストール済みで、再びインストールし直そうとしています。\n次のページへ進んでください。",
     "config-install-begin": "「{{int:config-continue}}」を押すと、MediaWiki のインストールを開始できます。\n変更したい設定がある場合は、「{{int:config-back}}」を押してください。",
     "config-install-step-done": "実行",
     "config-install-step-failed": "失敗した",
     "config-install-user-missing": "指定したユーザー「$1」は存在しません。",
     "config-install-user-missing-create": "指定したユーザー「$1」は存在しません。\nアカウントを作成する場合は、下の「アカウント作成」をクリックしてください。",
     "config-install-tables": "テーブルの作成",
-    "config-install-tables-exist": "'''警告:''' MediaWiki テーブルは既に存在するようです。\n作成を省略します。",
-    "config-install-tables-failed": "'''エラー:''' テーブルの作成が、以下のエラーにより失敗しました: $1",
+    "config-install-tables-exist": "<strong>警告:</strong> MediaWiki テーブルは既に存在するようです。\n作成を省略します。",
+    "config-install-tables-failed": "<strong>エラー:</strong> テーブルの作成が、以下のエラーにより失敗しました: $1",
     "config-install-interwiki": "既定のウィキ間テーブルの導入",
     "config-install-interwiki-list": "ファイル <code>interwiki.list</code> から読み取れませんでした。",
-    "config-install-interwiki-exists": "'''警告:''' ウィキ間テーブルは既に登録されているようです。\n既定のテーブルを無視します。",
+    "config-install-interwiki-exists": "<strong>警告:</strong> ウィキ間テーブルは既に登録されているようです。\n既定のテーブルを無視します。",
     "config-install-stats": "統計情報の初期化",
     "config-install-keys": "秘密鍵の生成",
     "config-install-sysop": "管理者のアカウントの作成",
     "config-install-mainpage": "メインページを既定の内容で作成",
     "config-install-mainpage-failed": "メインページを挿入できませんでした: $1",
-    "config-install-done": "'''おめでとうございます!'''\nMediaWikiのインストールに成功しました。\n\n<code>LocalSettings.php</code>ファイルが生成されました。\nこのファイルはすべての設定を含んでいます。\n\nこれをダウンロードして、ウィキをインストールした基準ディレクトリ (index.phpと同じディレクトリ) に設置する必要があります。ダウンロードは自動的に開始されるはずです。\n\nダウンロードが開始されていない場合、またはダウンロードをキャンセルした場合は、下記のリンクをクリックしてダウンロードを再開できます:\n\n$3\n\n'''注意:''' この生成された設定ファイルをダウンロードせずにインストールを終了すると、このファイルは利用できなくなります。\n\n上記の作業が完了すると、'''[$2 ウィキに入る]'''ことができます。",
+    "config-install-done": "<strong>おめでとうございます!</strong>\nMediaWikiのインストールに成功しました。\n\n<code>LocalSettings.php</code>ファイルが生成されました。\nこのファイルはすべての設定を含んでいます。\n\nこれをダウンロードして、ウィキをインストールした基準ディレクトリ (index.phpと同じディレクトリ) に設置する必要があります。ダウンロードは自動的に開始されるはずです。\n\nダウンロードが開始されていない場合、またはダウンロードをキャンセルした場合は、下記のリンクをクリックしてダウンロードを再開できます:\n\n$3\n\n<strong>注意:</strong> この生成された設定ファイルをダウンロードせずにインストールを終了すると、このファイルは利用できなくなります。\n\n上記の作業が完了すると、<strong>[$2 ウィキに入る]</strong>ことができます。",
     "config-download-localsettings": "<code>LocalSettings.php</code> をダウンロード",
     "config-help": "ヘルプ",
     "config-nofile": "ファイル「$1」が見つかりませんでした。削除された可能性があります。",
-    "mainpagetext": "'''MediaWiki のインストールに成功しました。'''",
+    "mainpagetext": "<strong>MediaWiki のインストールに成功しました。</strong>",
     "mainpagedocfooter": "ウィキソフトウェアの使い方に関する情報は[//meta.wikimedia.org/wiki/Help:Contents 利用者案内]を参照してください。\n\n== はじめましょう ==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings/ja 設定の一覧]\n* [//www.mediawiki.org/wiki/Manual:FAQ/ja MediaWiki よくある質問と回答]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki リリース情報メーリングリスト]\n* [//www.mediawiki.org/wiki/Localisation/ja MediaWiki のあなたの言語へのローカライズ]"
-}
\ No newline at end of file
+}
index 0dc7b24..a3ecb15 100644 (file)
@@ -6,4 +6,4 @@
     },
     "mainpagetext": "'''MediaWiki don instaal soksesful.'''",
     "mainpagedocfooter": "Kansolt di [//meta.wikimedia.org/wiki/Help:Contents User's Guide] fi infamieshan ou fi yuuz di wiki saafwier.\n\n== Taatop ==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Configuration settings list]\n* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]"
-}
\ No newline at end of file
+}
index 2b44373..9f587de 100644 (file)
@@ -6,4 +6,4 @@
     },
     "mainpagetext": "'''MediaWiki er nu installeret.'''",
     "mainpagedocfooter": "Se vores engelskspråĝede [//meta.wikimedia.org/wiki/MediaWiki_localisation dokumentåsje tilpasnenge'm åf æ brugergrænseflade] og [//meta.wikimedia.org/wiki/MediaWiki_User%27s_Guide æ brugervejlednenge] før åplysnenger åpsætnenge'm og anvendelse."
-}
\ No newline at end of file
+}
index 2c2c5df..5d64e23 100644 (file)
@@ -1,7 +1,5 @@
 {
-    "@metadata": {
-        "authors": []
-    },
+    "@metadata": [],
     "mainpagetext": "'''Prangkat empuk wiki wis suksès dipasang.'''",
     "mainpagedocfooter": "Mangga maca [//meta.wikimedia.org/wiki/Help:Contents User's Guide] kanggo katrangan luwih langkung prakara panggunan prangkat empuk wiki\n== Miwiti panggunan  ==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Daftar pangaturan préférènsi]\n* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Milis rilis MediaWiki]"
-}
\ No newline at end of file
+}
index 26d9c4d..7ca5762 100644 (file)
@@ -49,7 +49,7 @@
     "config-ns-other": "სხვა (მიუთითეთ)",
     "config-ns-other-default": "ჩემი ვიკი",
     "config-admin-box": "ადმინისტრატორის ანგარიში",
-    "config-admin-name": "თქვენი სახელი:",
+    "config-admin-name": "á\83\97á\83¥á\83\95á\83\94á\83\9cá\83\98 á\83\9bá\83\9dá\83\9bá\83®á\83\9bá\83\90á\83 á\83\94á\83\91á\83\9aá\83\98á\83¡ á\83¡á\83\90á\83®á\83\94á\83\9aá\83\98:",
     "config-admin-password": "პაროლი:",
     "config-admin-password-confirm": "პაროლი ხელმეორედ:",
     "config-admin-name-blank": "შეიყვანეთ ადმინისტრატორის მომხმარებლის სახელი.",
@@ -79,4 +79,4 @@
     "config-help": "დახმარება",
     "mainpagetext": "'''მედიავიკი წარმატებით ჩაიტვირთა.'''",
     "mainpagedocfooter": "ვიკი პროგრამის გამოყენების ინფორმაციისთვის იხილეთ [//meta.wikimedia.org/wiki/Help:Contents მომხმარებლის მეგზური].\n\n== დაწყება ==\n\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings კონფიგურაციის მაჩვენებლების სია]\n* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce მედიავიკის გამოცემის დაგზავნის სია]\n* [//www.mediawiki.org/wiki/Localisation#Translation_resources მედიავიკის ლოკალიზება თქვენ ენაზე]"
-}
\ No newline at end of file
+}
index 7130f61..967087b 100644 (file)
@@ -1,7 +1,5 @@
 {
-    "@metadata": {
-        "authors": []
-    },
+    "@metadata": [],
     "mainpagetext": "'''MediaWiki tabıslı ornatıldı.'''",
     "mainpagedocfooter": "Wiki bag'darlamasın qollanıw haqqındag'i mag'lıwmat usın [//meta.wikimedia.org/wiki/Help:Contents Paydalanıwshılar qollanbasınan] ken'es alın'.\n\n== Baslaw ushın ==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Konfiguratsiya sazlaw dizimi]\n* [//www.mediawiki.org/wiki/Manual:FAQ MediaWikidin' Ko'p Soralatug'ın Sorawları]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki haqqında xat tarqatıw dizimi]"
-}
\ No newline at end of file
+}
index 2ed0349..e298e78 100644 (file)
@@ -6,4 +6,4 @@
     },
     "mainpagetext": "'''«MediaWiki» узыншу хэгъува.'''",
     "mainpagedocfooter": "Мы виким и лэжьыгъэ хъыбархэр здэбгъуэтыфынур [//meta.wikimedia.org/wiki/%D0%9F%D0%BE%D0%BC%D0%BE%D1%89%D1%8C:%D0%A1%D0%BE%D0%B4%D0%B5%D1%80%D0%B6%D0%B0%D0%BD%D0%B8%D0%B5 дэӀэпыкъуэгъу тхылъым].\n\n\n== Къыщхьэпэгъуэ хъуфынухэр ==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Зэгъэзэхуэгъуэ гуэрэхэм я тхылъ];\n* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki-м упщӀэ нахъыбу ятхэмрэ я жэуапхэмрэ];\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki-м и версиэ щӀэуэ къэжахэм я къэӀохугъуэ]."
-}
\ No newline at end of file
+}
index 16e34d5..279b9d4 100644 (file)
@@ -5,4 +5,4 @@
         ]
     },
     "mainpagetext": "'''میڈیاوکیو کامیابیو سورا چالو کورونو بیتی شیر۔.'''"
-}
\ No newline at end of file
+}
index 01f0bfe..2c1064a 100644 (file)
@@ -6,4 +6,4 @@
     },
     "mainpagetext": "'''MediaWiki fist ra ser, vıraziya.'''",
     "mainpagedocfooter": "Serba melumatê gurenaena ''wiki software''i [//meta.wikimedia.org/wiki/Help:Contents İdarê karberi] de mıracaet ke.\n\n== Gamê verêni ==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Lista ayarunê vırastene]\n* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki de ÇZP]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki ra lista serbest-daena postey]"
-}
\ No newline at end of file
+}
index c111678..1ee69bb 100644 (file)
@@ -1,7 +1,5 @@
 {
-    "@metadata": {
-        "authors": []
-    },
+    "@metadata": [],
     "mainpagetext": "'''مەدىياۋىيكىي بۋماسى ٴساتتى ورناتىلدى.'''",
     "mainpagedocfooter": "ۋىيكىي باعدارلامالىق جاساقتاماسىن قالاي قولداناتىن اقپاراتى ٴۇشىن [//meta.wikimedia.org/wiki/Help:Contents پايدالانۋشىلىق نۇسقاۋلارىنان] كەڭەس الىڭىز.\n\n== باستاۋ ٴۇشىن ==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings باپتالىم قالاۋلارىنىڭ ٴتىزىمى]\n* [//www.mediawiki.org/wiki/Manual:FAQ مەدىياۋىيكىيدىڭ جىيى قويىلعان ساۋالدارى]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce مەدىياۋىيكىي شىعۋ تۋرالى حات تاراتۋ ٴتىزىمى]"
-}
\ No newline at end of file
+}
index 9b0f94f..769344f 100644 (file)
@@ -1,7 +1,5 @@
 {
-    "@metadata": {
-        "authors": []
-    },
+    "@metadata": [],
     "mainpagetext": "'''МедиаУики бумасы сәтті орнатылды.'''",
     "mainpagedocfooter": "Уики бағдарламалық жасақтамасын қалай қолданатын ақпараты үшін [//meta.wikimedia.org/wiki/Help:Contents Пайдаланушылық нұсқауларынан] кеңес алыңыз.\n\n== Бастау үшін ==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Бапталым қалауларының тізімі]\n* [//www.mediawiki.org/wiki/Manual:FAQ МедиаУикидің Жиы Қойылған Сауалдары]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce МедиаУики шығу туралы хат тарату тізімі]"
-}
\ No newline at end of file
+}
index 21cc1ee..bf1a9e8 100644 (file)
@@ -1,7 +1,5 @@
 {
-    "@metadata": {
-        "authors": []
-    },
+    "@metadata": [],
     "mainpagetext": "'''MedïaWïkï bwması sätti ornatıldı.'''",
     "mainpagedocfooter": "Wïkï bağdarlamalıq jasaqtamasın qalaý qoldanatın aqparatı üşin [//meta.wikimedia.org/wiki/Help:Contents Paýdalanwşılıq nusqawlarınan] keñes alıñız.\n\n== Bastaw üşin ==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Baptalım qalawlarınıñ tizimi]\n* [//www.mediawiki.org/wiki/Manual:FAQ MedïaWïkïdiñ Jïı Qoýılğan Sawaldarı]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MedïaWïkï şığw twralı xat taratw tizimi]"
-}
\ No newline at end of file
+}
index 9f06065..74499b3 100644 (file)
@@ -2,9 +2,14 @@
     "@metadata": {
         "authors": [
             "Thearith",
-            "គីមស៊្រុន"
+            "គីមស៊្រុន",
+            "Sovichet"
         ]
     },
+    "config-desc": "កម្មវិធី​ដំឡើង​សម្រាប់ MediaWiki",
+    "config-title": "ការ​ដំឡើង MediaWiki $1",
+    "config-information": "ព័ត៌មាន",
+    "config-localsettings-badkey": "អ្នក​បាន​ផ្ដល់​សោ​មិន​ត្រឹម​ត្រូវ។",
     "config-your-language": "ភាសារបស់អ្នក៖",
     "config-your-language-help": "ជ្រើសយកភាសាដើម្បីប្រើក្នុងពេលតំលើង។",
     "config-wiki-language": "ភាសាវិគី៖",
@@ -14,6 +19,7 @@
     "config-page-language": "ភាសា",
     "config-page-welcome": "មេឌាវិគីសូមស្វាគមន៍!",
     "config-page-dbconnect": "ភ្ជាប់ទៅមូលដ្ឋានទិន្នន័យ",
+    "config-page-dbsettings": "ការកំណត់​មូលដ្ឋាន​ទិន្នន័យ",
     "config-page-name": "ឈ្មោះ",
     "config-page-options": "ជំរើស",
     "config-page-install": "តំលើង",
@@ -21,5 +27,5 @@
     "config-page-restart": "តំលើងឡើងវិញ",
     "config-help": "ជំនួយ",
     "mainpagetext": "'''មេឌាវិគីត្រូវបានដំឡើងសំរេចហើយ​។'''",
-    "mainpagedocfooter": "សូមពិនិត្យមើល [//meta.wikimedia.org/wiki/ជំនួយ​៖ ខ្លឹមសារ​ណែនាំ​ប្រើប្រាស់]សម្រាប់​ព័ត៌មាន​​បន្ថែមចំពោះ​ការប្រើប្រាស់ ផ្នែកទន់វិគី​។\n\n== ចាប់ផ្ដើមជាមួយមេឌាវិគី ==\n\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings បញ្ជីកំណត់ទម្រង់]\n* [//www.mediawiki.org/wiki/Manual:FAQ/km សំណួរញឹកញាប់​មេឌាវិគី]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce បញ្ជី​ពិភាក្សា​ការផ្សព្វផ្សាយ​របស់​មេឌាវិគី]"
-}
\ No newline at end of file
+    "mainpagedocfooter": "សូមពិនិត្យមើល [//meta.wikimedia.org/wiki/ជំនួយ​៖ ខ្លឹមសារ​ណែនាំ​ប្រើប្រាស់]សម្រាប់​ព័ត៌មាន​​បន្ថែមអំពី​ការប្រើប្រាស់សូហ្វវែរវិគី​។\n\n== ការចាប់ផ្ដើម ==\n\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings បញ្ជីការកំណត់នានា]\n* [//www.mediawiki.org/wiki/Manual:FAQ/km សំណួរញឹកញាប់​ក្នុងមេឌាវិគី]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce បញ្ជី​អ៊ីមែលផ្សព្វផ្សាយ​របស់​មេឌាវិគី]\n* [//www.mediawiki.org/wiki/Localisation#Translation_resources ការប្រែសម្រួលមេឌាវិគីសម្រាប់ភាសារបស់អ្នក]"
+}
index 69cc7a6..6601973 100644 (file)
@@ -1,7 +1,5 @@
 {
-    "@metadata": {
-        "authors": []
-    },
+    "@metadata": [],
     "mainpagetext": "'''ವಿಕಿ ತಂತ್ರಾಂಶವನ್ನು ಯಶಸ್ವಿಯಾಗಿ ಅನುಸ್ಥಾಪಿಸಲಾಯಿತು.'''",
     "mainpagedocfooter": "ವಿಕಿ ತಂತ್ರಾಂಶವನ್ನು ಬಳಸುವ ಬಗ್ಗೆ ಮಾಹಿತಿಗೆ [//meta.wikimedia.org/wiki/Help:Contents ಬಳಕೆದಾರರಿಗೆ ನಿರ್ದೇಶನ ಪುಟ] ನೋಡಿ.\n\n== ಪ್ರಾರಂಭಿಸುವುದು ==\n\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Configuration settings list]\n* [//www.mediawiki.org/wiki/Manual:FAQ ಮೀಡಿಯವಿಕಿ FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]"
-}
\ No newline at end of file
+}
index c01c793..3f7bd17 100644 (file)
@@ -2,21 +2,23 @@
     "@metadata": {
         "authors": [
             "Kwj2772",
-            "아라"
+            "아라",
+            "Hym411",
+            "Priviet"
         ]
     },
     "config-desc": "미디어위키 설치 프로그램",
-    "config-title": "MediaWiki $1 설치",
+    "config-title": "미디어위키 $1 설치",
     "config-information": "정보",
-    "config-localsettings-upgrade": "<code>LocalSettings.php</code> 파일을 감지했습니다.\n이 설치를 업그레이드하려면 아래 상자에 <code>$wgUpgradeKey</code>의 값을 입력하세요.\n<code>LocalSettings.php</code>에 찾을 수 있습니다.",
+    "config-localsettings-upgrade": "<code>LocalSettings.php</code> 파일을 감지했습니다.\n이 설치를 업그레이드하려면 아래 상자에 <code>$wgUpgradeKey</code>의 값을 입력하세요.\n<code>LocalSettings.php</code>에 찾을 수 있습니다.",
     "config-localsettings-cli-upgrade": "<code>LocalSettings.php</code> 파일을 감지했습니다.\n이 설치를 업그레이드하려면 <code>update.php</code>를 대신 실행하세요",
     "config-localsettings-key": "업그레이드 키:",
-    "config-localsettings-badkey": "ì \9cê³µ한 키가 잘못되었습니다.",
-    "config-upgrade-key-missing": "미ë\94\94ì\96´ì\9c\84í\82¤ì\9d\98 ê¸°ì¡´ ì\84¤ì¹\98ê°\80 ê°\90ì§\80ë\90\98ì\97\88ì\8aµë\8b\88ë\8b¤.\nì\9d´ ì\84¤ì¹\98를 ì\97\85ê·¸ë \88ì\9d´ë\93\9cí\95\98려면 <code>LocalSettings.php</code>ì\9d\98 ì\95\84ë\9e\98ì\97\90 ë\8b¤ì\9d\8c ì¤\84ì\9d\84 ë\84£ì\9c¼ì\84¸ì\9a\94:\n\n$1",
+    "config-localsettings-badkey": "ì\9e\85ë ¥한 키가 잘못되었습니다.",
+    "config-upgrade-key-missing": "기존ì\97\90 ì\84¤ì¹\98 í\96\88ë\8d\98 ë¯¸ë\94\94ì\96´ì\9c\84í\82¤ë¥¼ ê°\90ì§\80í\96\88ì\8aµë\8b\88ë\8b¤.\nì\9d´ ì\84¤ì¹\98를 ì\97\85ê·¸ë \88ì\9d´ë\93\9cí\95\98려면 <code>LocalSettings.php</code>ì\9d\98 ì\95\84ë\9e\98ì\97\90 ë\8b¤ì\9d\8c ì¤\84ì\9d\84 ë\84£ì\9c¼ì\84¸ì\9a\94:\n\n$1",
     "config-localsettings-incomplete": "기존 <code>LocalSettings.php</code>가 완전하지 않은 것 같습니다.\n$1 변수가 설정되어 있지 않습니다.\n이 변수가 설정되도록 <code>LocalSettings.php</code>를 바꾸고 \"{{int:Config-continue}}\"을 클릭하세요.",
-    "config-localsettings-connection-error": "<code>LocalSettings.php</code> ë\98\90ë\8a\94 <code>AdminSettings.php</code>ì\97\90 ì§\80ì \95í\95\9c ì\84¤ì \95ì\9d\84 ì\82¬ì\9a©í\95\98ì\97¬ ë\8d°ì\9d´í\84°ë² ì\9d´ì\8a¤ì\97\90 ì\97°ê²°í\95  ë\95\8c ì\98¤ë¥\98ê°\80 ë°\9cì\83\9dí\96\88ì\8aµë\8b\88ë\8b¤. ì\9d´ë\9f¬í\95\9c ì\84¤ì \95ì\9d\84 ì\88\98ì \95í\95\98ê³  ë\8b¤ì\8b\9c ì\8b\9cë\8f\84í\95\98ì\84¸ì\9a\94.\n\n$1",
+    "config-localsettings-connection-error": "<code>LocalSettings.php</code>ì\97\90 ì§\80ì \95í\95\9c ì\84¤ì \95ì\9d\84 ì\82¬ì\9a©í\95\98ì\97¬ ë\8d°ì\9d´í\84°ë² ì\9d´ì\8a¤ì\97\90 ì\97°ê²°í\95  ë\95\8c ì\98¤ë¥\98ê°\80 ë°\9cì\83\9dí\96\88ì\8aµë\8b\88ë\8b¤. ì\9d´ë\9f¬í\95\9c ì\84¤ì \95ì\9d\84 ê³ ì¹\98ê³  ë\8b¤ì\8b\9c ì\8b\9cë\8f\84í\95\98ì\84¸ì\9a\94.\n\n$1",
     "config-session-error": "세션 시작 오류: $1",
-    "config-session-expired": "ì\84¸ì\85\98 ë\8d°ì\9d´í\84°ê°\80 ë§\8cë£\8cë\90\9c ê²\83 ê°\99ì\8aµë\8b\88ë\8b¤.\nì\84¸ì\85\98ì\9d\80 $1ì\9d\98 ì\9e\91ë\8f\99 ì\8b\9cê°\84 ë\8f\99ì\95\88 êµ¬ì\84±ë\90©ë\8b\88ë\8b¤.\nphp.iniì\97\90 ì\9e\88ë\8a\94 <code>session.gc_maxlifetime</code>ì\97\90ì\84\9c ì\84¤ì \95í\95´ ì\9d´ë¥¼ ì¦\9dê°\80ì\8b\9cí\82¬ ì\88\98 ì\9e\88ì\8aµë\8b\88ë\8b¤.\nì\84¤ì¹\98 ê³¼ì \95ì\9d\84 ë\8b¤ì\8b\9c ì\8b\9cì\9e\91í\95©ë\8b\88ë\8b¤.",
+    "config-session-expired": "ì\84¸ì\85\98 ë\8d°ì\9d´í\84°ê°\80 ë§\8cë£\8cë\90\9c ê²\83 ê°\99ì\8aµë\8b\88ë\8b¤.\nì\84¸ì\85\98ì\9d\80 $1ì\9d\98 ì\9e\91ë\8f\99 ì\8b\9cê°\84 ë\8f\99ì\95\88 êµ¬ì\84±ë\90©ë\8b\88ë\8b¤.\nphp.iniì\97\90 ì\9e\88ë\8a\94 <code>session.gc_maxlifetime</code>ì\97\90ì\84\9c ì\84¤ì \95í\95´ ì\9d´ë¥¼ ì¦\9dê°\80ì\8b\9cí\82¬ ì\88\98 ì\9e\88ì\8aµë\8b\88ë\8b¤.\nì\84¤ì¹\98 ê³¼ì \95ì\9d\84 ë\8b¤ì\8b\9c ì\8b\9cì\9e\91í\95\98ì\84¸ì\9a\94.",
     "config-no-session": "세션 데이터가 없어졌습니다!\nphp.ini를 확인하고 <code>session.save_path</code>가 적절한 디렉토리로 설정되어 있는지 확인하세요.",
     "config-your-language": "설치 언어:",
     "config-your-language-help": "설치 과정에서 사용할 언어를 선택하세요.",
@@ -35,7 +37,7 @@
     "config-page-complete": "완료!",
     "config-page-restart": "설치 다시 시작",
     "config-page-readme": "읽어보기",
-    "config-page-releasenotes": "ë°°í\8f¬ 노트",
+    "config-page-releasenotes": "릴리ì\8a¤ 노트",
     "config-page-copying": "전문",
     "config-page-upgradedoc": "업그레이드하기",
     "config-page-existingwiki": "기존 위키",
     "config-restart": "예, 다시 시작합니다",
     "config-welcome": "=== 사용 환경 검사 ===\n기본 검사는 지금 이 환경이 미디어위키 설치에 적합한지 수행합니다.\n설치를 완료하는 방법에 대한 지원을 찾는다면 이 정보를 포함해야 하는 것을 기억하세요.",
     "config-copyright": "=== 저작권 및 이용 약관 ===\n\n$1\n\n이 프로그램은 자유 소프트웨어입니다. 당신은 자유 소프트웨어 재단이 발표한 GNU 일반 공중 사용 허가서 버전 2나 그 이후 버전에 따라 이 프로그램을 재배포하거나 수정할 수 있습니다.\n\n이 프로그램이 유용하게 사용될 수 있기를 바라지만 '''상용으로 사용'''되거나 '''특정 목적에 맞을 것'''이라는 것을 '''보증하지 않습니다'''.\n자세한 내용은 GNU 일반 공중 사용 허가서를 참고하십시오.\n\n당신은 이 프로그램을 통해 <doclink href=Copying>GNU 일반 공중 사용 허가서 전문</doclink>을 받았습니다. 그렇지 않다면, Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA로 편지를 보내주시거나 [http://www.gnu.org/copyleft/gpl.html 온라인으로 읽어보시기] 바랍니다.",
-    "config-sidebar": "* [//www.mediawiki.org ë¯¸ë\94\94ì\96´ì\9c\84í\82¤ í\99\88]\n* [//www.mediawiki.org/wiki/Help:Contents ì\82¬ì\9a©ì\9e\90 ê°\80ì\9d´ë\93\9c]\n* [//www.mediawiki.org/wiki/Manual:Contents ê´\80리ì\9e\90 ê°\80ì\9d´ë\93\9c]\n* [//www.mediawiki.org/wiki/Manual:FAQ FAQ]\n----\n* <doclink href=Readme>ì\9d½ì\96´ë³´ê¸°</doclink>\n* <doclink href=ReleaseNotes>ë°°í\8f¬ 노트</doclink>\n* <doclink href=Copying>전문</doclink>\n* <doclink href=UpgradeDoc>업그레이드하기</doclink>",
+    "config-sidebar": "* [//www.mediawiki.org ë¯¸ë\94\94ì\96´ì\9c\84í\82¤ í\99\88]\n* [//www.mediawiki.org/wiki/Help:Contents ì\82¬ì\9a©ì\9e\90 ê°\80ì\9d´ë\93\9c]\n* [//www.mediawiki.org/wiki/Manual:Contents ê´\80리ì\9e\90 ê°\80ì\9d´ë\93\9c]\n* [//www.mediawiki.org/wiki/Manual:FAQ FAQ]\n----\n* <doclink href=Readme>ì\9d½ì\96´ë³´ê¸°</doclink>\n* <doclink href=ReleaseNotes>릴리ì\8a¤ 노트</doclink>\n* <doclink href=Copying>전문</doclink>\n* <doclink href=UpgradeDoc>업그레이드하기</doclink>",
     "config-env-good": "환경이 확인되었습니다.\n미디어위키를 설치할 수 있습니다.",
     "config-env-bad": "환경이 확인되었습니다.\n미디어위키를 설치할 수 없습니다.",
     "config-env-php": "PHP $1(이)가 설치되었습니다.",
     "config-env-php-toolow": "PHP $1(이)가 설치되었습니다.\n하지만 미디어위키는 PHP $2 이상이 필요합니다.",
     "config-unicode-using-utf8": "유니코드 정규화에 Brion Vibber의 utf8_normalize.so를 사용합니다.",
     "config-unicode-using-intl": "유니코드 정규화에 [http://pecl.php.net/intl intl PECL 확장 기능]을 사용합니다.",
-    "config-unicode-pure-php-warning": "'''경고''': 유니코드 정규화를 처리할 [http://pecl.php.net/intl intl PECL 확장 기능]을 사용할 수 없기 때문에 느린 순수한 PHP 구현을 대신 사용합니다.\n높은 트래픽 사이트에서 실행하려면 [//www.mediawiki.org/wiki/Unicode_normalization_considerations 유니코드 정규화]를 읽어보시기 바랍니다.",
+    "config-unicode-pure-php-warning": "'''경고''': 유니코드 정규화를 처리할 [http://pecl.php.net/intl intl PECL 확장 기능]을 사용할 수 없기 때문에 느린 pure-PHP 구현을 대신 사용합니다.\n트래픽이 높은 사이트에서 실행하시려면 [//www.mediawiki.org/wiki/Unicode_normalization_considerations 유니코드 정규화]를 읽어보시기 바랍니다.",
     "config-unicode-update-warning": "'''경고''': 유니코드 정규화 래퍼의 설치된 버전은 [http://site.icu-project.org/ ICU 프로젝트]의 라이브러리의 이전 버전을 사용합니다.\n만약 유니코드를 사용하는 것에 대해 우려가 된다면 [//www.mediawiki.org/wiki/Unicode_normalization_considerations 업그레이드]해야합니다.",
-    "config-no-db": "ì \81ì \88í\95\9c ë\8d°ì\9d´í\84°ë² ì\9d´ì\8a¤ ë\93\9cë\9d¼ì\9d´ë²\84를 ì°¾ì\9d\84 ì\88\98 ì\97\86ì\8aµë\8b\88ë\8b¤! PHPì\97\90 ë\8d°ì\9d´í\84°ë² ì\9d´ì\8a¤ ë\93\9cë\9d¼ì\9d´ë²\84를 ì\84¤ì¹\98í\95´ì\95¼ í\95©ë\8b\88ë\8b¤.\në\8b¤ì\9d\8c ë\8d°ì\9d´í\84°ë² ì\9d´ì\8a¤ ì\9c í\98\95ì\9d\84 ì§\80ì\9b\90í\95©ë\8b\88ë\8b¤ : $1.\n\nê³µì\9c í\95\98ë\8a\94 í\98¸ì\8a¤í\8c\85ì\9d\84 ì\82¬ì\9a©í\95\98ê³  ì\9e\88ë\8b¤ë©´ ì \81ì \88í\95\9c ë\8d°ì\9d´í\84°ë² ì\9d´ì\8a¤ ë\93\9cë\9d¼ì\9d´ë²\84를 ì\84¤ì¹\98í\95\98ë\8f\84ë¡\9d í\98¸ì\8a¤í\8c\85 ì \9cê³µ ì\97\85ì²´ì\97\90 ë¬¸ì\9d\98í\95\98ì\84¸ì\9a\94.\nPHP를 ì§\81ì \91 ì»´í\8c\8cì\9d¼í\96\88ë\8b¤ë©´ ì\98\88를 ë\93¤ì\96´ <code>./configure --with-mysql</code>ì\9d\84 ì\82¬ì\9a©í\95\98ì\97¬ ë\8d°ì\9d´í\84°ë² ì\9d´ì\8a¤ í\81´ë\9d¼ì\9d´ì\96¸í\8a¸ë¥¼ í\99\9cì\84±í\99\94í\95\98ë\8f\84ë¡\9d ë\8b¤ì\8b\9c ì\84¤ì \95í\95\98ì\84¸ì\9a\94.\në\8d°ë¹\84ì\95\88ì\9d´ë\82\98 ì\9a°ë¶\84í\8a¸ í\8c¨í\82¤ì§\80ì\97\90ì\84\9c PHP를 ì\84¤ì¹\98í\96\88ë\8b¤ë©´ php-mysql 모듈도 설치해야 합니다.",
-    "config-outdated-sqlite": "'''경고''': SQLite 필요한 최소 $2 버전보다 낮은 $1(이)가 있습니다. SQLite는 사용할 수 없습니다.",
-    "config-no-fts3": "'''경고''': SQLiteë\8a\94 [//sqlite.org/fts3.html FTS3 ëª¨ë\93\88] ì\97\86ì\9d´ ì»´í\8c\8cì\9d¼ë\90\98ì\96´, 검색 기능은 백엔드에 사용할 수 없습니다.",
+    "config-no-db": "ì \81ì \88í\95\9c ë\8d°ì\9d´í\84°ë² ì\9d´ì\8a¤ ë\93\9cë\9d¼ì\9d´ë²\84를 ì°¾ì\9d\84 ì\88\98 ì\97\86ì\8aµë\8b\88ë\8b¤! PHPì\9a© ë\8d°ì\9d´í\84°ë² ì\9d´ì\8a¤ ë\93\9cë\9d¼ì\9d´ë²\84를 ì\84¤ì¹\98í\95´ì\95¼ í\95©ë\8b\88ë\8b¤.\në\8b¤ì\9d\8c ë\8d°ì\9d´í\84°ë² ì\9d´ì\8a¤ ì\9c í\98\95ì\9d\84 ì§\80ì\9b\90í\95©ë\8b\88ë\8b¤: $1.\n\nPHP를 ì§\81ì \91 ì»´í\8c\8cì\9d¼í\96\88ë\8b¤ë©´, ì\98\88를 ë\93¤ì\96´ <code>./configure --with-mysql</code>ì\9d\84 ì\82¬ì\9a©í\95\98ì\97¬, ë\8d°ì\9d´í\84°ë² ì\9d´ì\8a¤ í\81´ë\9d¼ì\9d´ì\96¸í\8a¸ë¥¼ í\99\9cì\84±í\99\94í\95\98ë\8f\84ë¡\9d ë\8b¤ì\8b\9c ì\84¤ì \95í\95\98ì\84¸ì\9a\94.\në\8d°ë¹\84ì\95\88ì\9d´ë\82\98 ì\9a°ë¶\84í\88¬ í\8c¨í\82¤ì§\80ì\97\90ì\84\9c PHP를 ì\84¤ì¹\98í\96\88ë\8b¤ë©´ <code>php5-mysql</code> 모듈도 설치해야 합니다.",
+    "config-outdated-sqlite": "'''경고''': 최소인 $2 버전보다 낮은 SQLite $1(이)가 있습니다. SQLite를 사용할 수 없습니다.",
+    "config-no-fts3": "'''경고''': SQLite를 [//sqlite.org/fts3.html FTS3 ëª¨ë\93\88] ì\97\86ì\9d´ ì»´í\8c\8cì\9d¼í\95\98ë©°, 검색 기능은 백엔드에 사용할 수 없습니다.",
     "config-register-globals": "'''경고: PHP의 <code>[http://php.net/register_globals register_globals]</code> 옵션이 활성화되어 있습니다.'''\n'''가능하면 이를 비활성화하십시오.'''\n미디어위키는 작동하지만 서버에 잠재적인 보안 취약점이 노출됩니다.",
-    "config-magic-quotes-runtime": "'''치명: [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-runtime magic_quotes_runtime]이 활성합니다!'''\n이 옵션은 데이터를 입력하는 데 예기치 않는 손상이 일어납니다.\n이 옵션을 비활성화하지 않는 한 미디어위키를 설치하고 사용할 수 없습니다.",
-    "config-magic-quotes-sybase": "'''치명: [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-sybase magic_quotes_sybase]이 활성합니다!'''\n이 옵션은 데이터를 입력하는 데 예기치 않는 손상이 일어납니다.\n이 옵션을 비활성화하지 않는 한 미디어위키를 설치하고 사용할 수 없습니다.",
-    "config-mbstring": "'''치명: [http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload]이 활성합니다!'''\n이 옵션은 오류가 발생하고 데이터를 입력하는 데 예기치 않는 손상이 일어날 수 있습니다.\n이 옵션을 비활성화하지 않는 한 미디어위키를 설치하고 사용할 수 없습니다.",
-    "config-ze1": "'''치명: [http://www.php.net/manual/en/ini.core.php zend.ze1_compatibility_mode]이 활성합니다!'''\n이 옵션은 미디어위키에 심간한 버그를 일으킵니다.\n이 옵션을 비활성화하지 않는 한 미디어위키를 설치하고 사용할 수 없습니다.",
-    "config-safe-mode": "'''경고:''' [http://www.php.net/features.safe-mode 안전 모드]이 활성합니다!\n특히 파일을 올리거나 <code>math</code>를 지원하는 데 문제가 발생할 수 있습니다.",
+    "config-magic-quotes-runtime": "'''치명: [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-runtime magic_quotes_runtime]이 활성화됩니다!'''\n이 옵션은 데이터를 입력하는 데 예기치 않는 손상이 일으킵니다.\n이 옵션을 비활성화하지 않는 한 미디어위키를 설치하고 사용할 수 없습니다.",
+    "config-magic-quotes-sybase": "'''치명: [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-sybase magic_quotes_sybase]이 활성화됩니다!'''\n이 옵션은 데이터를 입력하는 데 예기치 않는 손상을 일으킵니다.\n이 옵션을 비활성화하지 않는 한 미디어위키를 설치하고 사용할 수 없습니다.",
+    "config-mbstring": "'''치명: [http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload]이 활성화됩니다!'''\n이 옵션은 오류가 발생하고 데이터를 입력하는 데 예기치 않는 손상을 일으킬 수 있습니다.\n이 옵션을 비활성화하지 않는 한 미디어위키를 설치하고 사용할 수 없습니다.",
+    "config-safe-mode": "'''경고:''' [http://www.php.net/features.safe-mode 안전 모드]가 활성화됩니다!\n특히 파일을 올리거나 <code>math</code>를 지원하는 데 문제가 발생할 수 있습니다.",
     "config-xml-bad": "PHP의 XML 모듈이 없습니다.\n미디어위키는 이 모듈의 기능이 필요하며 이 설정에서는 작동하지 않습니다.\nMandrake를 실행하고 있다면 php-xml 패키지를 설치하세요.",
-    "config-pcre": "PCRE 지원 모듈이 없는 것 같습니다.\n미디어위키는 Perl 호환 정규 표현식을 작동시켜야 합니다.",
-    "config-pcre-no-utf8": "'''치명''': PHP의 PCRE 모듈은 RCRE_UTF8 지원 없이 컴파일된 것 같습니다.\n미디어위키가 제대로 작동하려면 UTF-8 지원이 필요합니다.",
-    "config-memory-raised": "PHPì\9d\98 <code>memory_limit</code>ë\8a\94 $1ì\9d´ë©° $2(ì\9c¼)ë¡\9c ë\8a\98리ì\84¸ì\9a\94.",
+    "config-pcre-old": "'''치명적인 오류:''' PCRE $1 또는 이후의 것들이 필요합니다. 당신의 PHP 바이너리는 PCRE $2와 연결되어 있습니다. [https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/PCRE 더 많은 정보].",
+    "config-pcre-no-utf8": "'''치명''': PHP의 PCRE 모듈은 RCRE_UTF8 지원 없이 컴파일된 것 같습니다.\n미디어위키가 제대로 작동하려면 UTF-8을 지원해야 합니다.",
+    "config-memory-raised": "PHPì\9d\98 <code>memory_limit</code>ë\8a\94 $1ì\9d´ë©° $2(ì\9c¼)ë¡\9c ë\8a\98ë ¸ì\8aµë\8b\88ë\8b¤.",
     "config-memory-bad": "'''경고:''' PHP의 <code>memory_limit</code>는 $1입니다.\n아마도 너무 낮은 것 같습니다.\n설치가 실패할 수 있습니다!",
-    "config-ctype": "'''치명''': PHP는 [http://www.php.net/manual/en/ctype.installation.php Ctype 확장 기능]에 대해 지원하여 컴파일해야 합니다.",
+    "config-ctype": "'''치명''': PHP는 [http://www.php.net/manual/en/ctype.installation.php Ctype 확장 기능]을 지원하도록 하여 컴파일해야 합니다.",
+    "config-json": "'''치명:''' PHP가 JSON 지원이 없이 컴파일되었습니다.\n미디어위키를 설치하기 전에 PHP JSON 확장 기능이나 [http://pecl.php.net/package/jsonc PECL jsonc] 확장 기능 중 하나를 설치해야 합니다.\n* PHP 확장 기능은 Red Hat Enterprise Linux (CentOS) 5와 6에 포함되어 있지만, <code>/etc/php.ini</code>나 <code>/etc/php.d/json.ini</code>에서 활성화해야 합니다.\n* 2013년 5월 이후에 출시된 일부 리눅스 배포판은 PHP 확장 기능이 생략된 대신, <code>php5-json</code>이나 <code>php-pecl-jsonc</code>로 PECL 확장 기능이 포장되어 있습니다.",
     "config-xcache": "[http://xcache.lighttpd.net/ XCache]가 설치되었습니다",
     "config-apc": "[http://www.php.net/apc APC]가 설치되었습니다",
     "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache]가 설치되었습니다",
     "config-no-cache": "'''경고:''' [http://www.php.net/apc APC], [http://xcache.lighttpd.net/ XCache] 또는 [http://www.iis.net/download/WinCacheForPhp WinCache]를 찾을 수 없습니다.\n개체 캐싱을 활성화하지 않습니다.",
-    "config-mod-security": "'''경고''': 웹 서버에 [http://modsecurity.org/ mod_security]가 허용되었습니다. 잘못 설정된 경우 미디어위키나 사용자가 임의의 콘텐츠를 게시할 수 있는 다른 소프트웨어에 대한 문제를 일으킬 수 있습니다.\n[http://modsecurity.org/documentation/ mod_security] 문서를 참고하거나 임의의 오류가 발생할 경우 호스트의 지원 요청에 문의하십시오.",
+    "config-mod-security": "'''경고''': 웹 서버에 [http://modsecurity.org/ mod_security]가 허용되었습니다. 잘못 설정된 경우 미디어위키나 사용자가 임의의 내용을 게시할 수 있는 다른 소프트웨어에 대한 문제를 일으킬 수 있습니다.\n[http://modsecurity.org/documentation/ mod_security] 문서를 참고하거나 임의의 오류가 발생할 경우 호스트의 지원 요청에 문의하십시오.",
     "config-diff3-bad": "GNU diff3를 찾을 수 없습니다.",
     "config-git": "Git 버전 관리 소프트웨어를 찾았습니다: <code>$1</code>.",
     "config-git-bad": "Git 버전 관리 소프트웨어를 찾을 수 없습니다.",
     "config-gd": "내장된 GD 그래픽 라이브러리를 찾았습니다.\n올리기를 활성화할 경우 그림 섬네일이 활성화됩니다.",
     "config-no-scaling": "GD 라이브러리나 ImageMagick를 찾을 수 없습니다.\n그림 섬네일이 비활성화됩니다.",
     "config-no-uri": "'''오류:''' 현재 URI를 확인할 수 없습니다.\n설치가 중단되었습니다.",
-    "config-no-cli-uri": "'''경고''': 기본값을 사용하여 --scriptpath를 지정하지 않았습니다: <code>$1</code>.",
+    "config-no-cli-uri": "'''경고''': 기본 값을 사용하여 <code>--scriptpath</code>를 지정하지 않았습니다: <code>$1</code>.",
     "config-using-server": "\"<nowiki>$1</nowiki>\"(을)를 서버 이름으로 사용합니다.",
     "config-using-uri": "\"<nowiki>$1$2</nowiki>\"(을)를 서버 URL로 사용합니다.",
-    "config-uploads-not-safe": "'''경고:''' 올리기에 대한 기본 디렉터리(<code>$1</code>)는 임의의 스크립트 실행에 취약합니다.\n미디어위키는 보안 위협에 대한 모든 올린 파일을 검사하지만, 올리기를 활성화하기 전에 [//www.mediawiki.org/wiki/Manual:Security#Upload_security 이 보안 취약점을 해결할 것]을 매우 권장합니다.",
-    "config-no-cli-uploads-check": "'''경고:''' 올리기에 대한 기본 디렉터리(<code>$1</code>)는 CLI를 설치하는 동안 임의의 스크립트 실행에 대한 취약점에 대해 검사되지 않습니다.",
-    "config-brokenlibxml": "시스템에 버그가 있는 PHP와 libxml2의 조합이 있으며 미디어위키나 다른 웹 어플리케이션에 숨겨진 데이터 손상을 일으킬 수 있습니다.\nPHP 5.2.9 이후와 libxml2 2.7.3 이후로 업그레이드하세요. ([//bugs.php.net/bug.php?id=45996 PHP에 제기한 버그])\n설치가 중단되었습니다.",
-    "config-using531": "미디어위키는 <code>__call()</code>을 참고로 매개 변수를 포함하는 버그로 인해 PHP $1(와)과 함께 사용할 수 없습니다.\n문제를 해결하려면 PHP 5.3.2 이상로 업그레이드하거나 PHP 5.3.0으로 다운그레이드를 하세요.\n설치가 중단되었습니다.",
-    "config-suhosin-max-value-length": "수호신(Suhosin)이 설치되었고 $1 바이트로 GET 매개 변수인 <code>length</code>를 제한하고 있습니다.\n미디어위키의 ResourceLoader 구성 요소는 이 제한을 해결하지만 성능이 저하됩니다.\n가능하면 <code>php.ini</code>의 <code>suhosin.get.max_value_length</code>에 1024 이상으로 설정하고 <code>LocalSettings.php</code>의 <code>$wgResourceLoaderMaxQueryLength</code>에 같은 값을 설정해야 합니다.",
+    "config-uploads-not-safe": "'''경고:''' 올리기에 대한 기본 디렉터리(<code>$1</code>)는 임의의 스크립트 실행에 취약합니다.\n미디어위키는 보안 위협 때문에 모든 올려진 파일을 검사하지만, 올리기를 활성화하기 전에 [//www.mediawiki.org/wiki/Manual:Security#Upload_security 이 보안 취약점을 해결할 것]을 매우 권장합니다.",
+    "config-no-cli-uploads-check": "'''경고:''' 올리기를 위한 기본 디렉터리(<code>$1</code>)는 CLI를 설치하는 동안 임의의 스크립트 실행에 대한 취약점에 대해 검사되지 않습니다.",
+    "config-brokenlibxml": "시스템에 버그가 있는 PHP와 libxml2의 조합이 있으며 미디어위키나 다른 웹 어플리케이션에 숨겨진 데이터 손상을 일으킬 수 있습니다.\nlibxml2 2.7.3 이후 버전으로 업그레이드하세요. ([https://bugs.php.net/bug.php?id=45996 PHP에 제기한 버그])\n설치가 중단되었습니다.",
+    "config-suhosin-max-value-length": "수호신(Suhosin)이 설치되고 $1 바이트로 GET 매개 변수 <code>length</code>를 제한하고 있습니다.\n미디어위키의 ResourceLoader 구성 요소는 이 제한을 회피하지만 성능이 저하됩니다.\n가능하면 <code>php.ini</code>의 <code>suhosin.get.max_value_length</code>를 1024 이상으로 설정하고 <code>LocalSettings.php</code>의 <code>$wgResourceLoaderMaxQueryLength</code>를 같은 값으로 설정해야 합니다.",
     "config-db-type": "데이터베이스 종류:",
     "config-db-host": "데이터베이스 호스트:",
-    "config-db-host-help": "데이터베이스 서버가 다른 서버에 있으면 여기에 호스트 이름이나 IP 주소를 입력하세요.\n\n공유하는 웹 호스팅을 사용하고 있으면 호스팅 제공 업체는 호스트 이름을 설명하고 있을 것입니다.\n\n윈도 서버에 설치하고 MySQL을 사용하면 \"localhost\"는 서버 이름으로 작동하지 않을 수 있습니다. 그렇게 된다면 로컬 IP 주소로 \"127.0.0.1\"를 시도하세요.\n\nPostgreSQL을 사용하면 유닉스 소켓을 통해 연결되도록 입력란을 비워두세요.",
+    "config-db-host-help": "데이터베이스 서버가 다른 서버에 있으면 여기에 호스트 이름이나 IP 주소를 입력하세요.\n\n공유하는 웹 호스팅을 사용하고 있으면 호스팅 제공 업체는 정확한 호스트 이름을 설명하고 있을 것입니다.\n\n윈도 서버에 설치하고 MySQL을 사용하면 \"localhost\"가 해당 서버 이름으로는 작동하지 않을 수 있습니다. 그렇게 된다면 로컬 IP 주소로 \"127.0.0.1\"을 시도하세요.\n\nPostgreSQL을 사용하면 유닉스 소켓을 통해 연결되도록 입력란을 비워두세요.",
     "config-db-host-oracle": "데이터베이스 TNS:",
-    "config-db-host-oracle-help": "올바른 [http://download.oracle.com/docs/cd/B28359_01/network.111/b28317/tnsnames.htm 로컬 연결 이름]을 입력하세요. tnsnames.ora 파일이 이 설치에 보여야 합니다.<br />10g 이후의 클라이언트 라이브러리를 사용하는 경우 [http://download.oracle.com/docs/cd/E11882_01/network.112/e10836/naming.htm 쉬운 연결] 네이밍 메소드도 사용할 수 있습니다.",
+    "config-db-host-oracle-help": "올바른 [http://download.oracle.com/docs/cd/B28359_01/network.111/b28317/tnsnames.htm 로컬 연결 이름]을 입력하세요. tnsnames.ora 파일이 이 설치 위치에서 참조할 수 있는 곳에 있어야 합니다.<br />10g 이후의 클라이언트 라이브러리를 사용하는 경우 [http://download.oracle.com/docs/cd/E11882_01/network.112/e10836/naming.htm 쉬운 연결] 네이밍 메서드도 사용할 수 있습니다.",
     "config-db-wiki-settings": "이 위키 식별",
     "config-db-name": "데이터베이스 이름:",
-    "config-db-name-help": "위키를 식별하기 위한 이름을 선택하세요.\n공백이 없어야 합니다.\n\n공유하는 웹 호스팅 사용하면 호스팅 제공 업체가 특정 데이터베이스 이름을 제공하거나 ê´\80리 í\8c¨ë\84\90ì\97\90ì\84\9c ë\8d°ì\9d´í\84°ë² ì\9d´ì\8a¤ë¥¼ ë§\8cë\93¤ ì\88\98 ì\9e\88ì\8aµë\8b\88ë\8b¤.",
+    "config-db-name-help": "위키를 식별하기 위한 이름을 선택하세요.\n공백이 없어야 합니다.\n\n공유하는 웹 호스팅 사용하면 호스팅 제공 업체가 특정 데이터베이스 이름을 제공하거나 ì \9cì\96´í\8c\90ì\97\90ì\84\9c ë\8d°ì\9d´í\84°ë² ì\9d´ì\8a¤ë¥¼ ë§\8cë\93¤ ì\88\98 ì\9e\88ì\8aµë\8b\88ë\8b¤.",
     "config-db-name-oracle": "데이터베이스 스키마:",
-    "config-db-account-oracle-warn": "데이터베이스 백엔드로 오라클을 설치하기 위해 지원하는 세 가지 시나리오가 있습니다:\n\n설치 과정의 일부로 데이터베이스 계정을 만들려면 설치를 위해 데이터베이스 계정으로 SYSDBA 역할을 가진 계정을 제공하고 웹 접근 계정에 대해 원하는 자격 증명을 지정하세요, 그렇지 않으면 수동으로 웹 접근 계정을 만들 수 있으며 (필요한 경우 권한 스키마 개체를 만들어야 합니다) 또는 다른 계정 두 개를 만들고 권한을 가진 하나의 웹 접근을 위한 제한된 하나를 제공할 수 있습니다.\n\n필요한 권한을 가진 계정을 만드는 스크립트는 이 설치의 \"maintenance/oracle/\" 디렉토리에서 찾을 수 있습니다. 제한된 계정을 사용하면 기본 계정으로 모든 관리 기능을 비활성화할 것을 유의하십시오.",
+    "config-db-account-oracle-warn": "데이터베이스 백엔드로 오라클을 설치하기 위해 지원하는 세 가지 시나리오가 있습니다:\n\n설치 과정의 일부로 데이터베이스 계정을 만들려면 설치를 위해 데이터베이스 계정으로 SYSDBA 역할을 가진 계정을 제공하고 웹 접근 계정에 대해 원하는 자격 증명을 지정하세요, 그렇지 않으면 수동으로 웹 접근 계정을 만들 수 있으며 (스키마 개체를 만들 권한이 필요한 경우) 또는 생성 권한으 가진 계정과 웹 접근이 제한된 계정의 두 가지 다른 계정을 제공할 수도 있습니다\n\n필요한 권한을 가진 계정을 만드는 스크립트는 이 설치 위치의 \"maintenance/oracle/\" 디렉터리에서 찾을 수 있습니다. 제한된 계정을 사용하면 기본 계정의 모든 유지 관리 기능이 비활성화된다는 점에 유의하십시오.",
     "config-db-install-account": "설치를 위한 사용자 계정",
     "config-db-username": "데이터베이스 사용자 이름:",
     "config-db-password": "데이터베이스 비밀번호:",
     "config-db-password-empty": "새 데이터베이스 사용자의 비밀번호를 입력하세요: $1.\n비밀번호 없이 사용자를 만들 수도 있지만 안전하지 않습니다.",
-    "config-db-install-username": "설치 과정 중에 데이터베이스에 연결할 때 사용할 사용자 이름을 입력하세요.\n미디어위키 계정의 사용자 이름이 아닌 데이터베이스에 대한 사용자 이름입니다.",
-    "config-db-install-password": "설치 과정 중에 데이터베이스에 연결할 때 사용할 비밀번호을 입력하세요.\n미디어위키 계정의 비밀번호가 아닌 데이터베이스에 대한 비밀번호입니다.",
+    "config-db-install-username": "설치 과정 도중 데이터베이스에 연결할 때 사용할 사용자 이름을 입력하세요.\n미디어위키 계정의 사용자 이름이 아닌 데이터베이스의 사용자 이름입니다.",
+    "config-db-install-password": "설치 과정 도중 데이터베이스에 연결할 때 사용할 비밀번호을 입력하세요.\n미디어위키 계정의 비밀번호가 아닌 데이터베이스의 비밀번호입니다.",
     "config-db-install-help": "설치 과정 중에 데이터베이스에 연결할 때 사용할 사용자 이름과 비밀번호를 입력하세요.",
     "config-db-account-lock": "정상적으로 작동하는 동안 같은 사용자 이름과 비밀번호를 사용함",
     "config-db-wiki-account": "정상적인 작동을 위한 사용자 계정",
-    "config-db-wiki-help": "정상적인 위키 작업 동안 데이터베이스에 연결하는 데 사용할 사용자 이름과 비밀 번호를 입력하세요.\n계정이 존재하지 않고 설치 계정에 충분한 권한이 있는 경우 이 사용자 계정은 위키를 작동하는 데 필요한 최소 권한으로 만들어집니다.",
+    "config-db-wiki-help": "정상적인 위키 작업 동안 데이터베이스에 연결하는 데 사용할 사용자 이름과 비밀번호를 입력하세요.\n계정이 존재하지 않고 설치 계정에 충분한 권한이 있는 경우 이 사용자 계정은 위키를 작동하는 데 필요한 최소 권한으로 만들어집니다.",
     "config-db-prefix": "데이터베이스 테이블 접두어:",
-    "config-db-prefix-help": "ì\97¬ë\9f¬ ì\9c\84í\82¤ ì\82¬ì\9d´ ë\98\90ë\8a\94 ë¯¸ë\94\94ì\96´ì\9c\84í\82¤ì\99\80 ë\8b¤ë¥¸ ì\9b¹ ì\9d\91ì\9a© í\94\84ë¡\9cê·¸ë\9e¨ ì\82¬ì\9d´ì\97\90ì\84\9c í\95\98ë\82\98ì\9d\98 ë\8d°ì\9d´í\84°ë² ì\9d´ì\8a¤ë¥¼ ê³µì\9c í\95´ì\95¼ í\95\98ë\8a\94 ê²½ì\9a°, ì¶©ë\8f\8cì\9d\84 í\94¼í\95\98기 ì\9c\84í\95´ ëª¨ë\93  í\85\8cì\9d´ë¸\94 ì\9d´ë¦\84ì\97\90 ì \91ë\91\90ì\96´ë¥¼ ì¶\94ê°\80í\95\98ë\8f\84ë¡\9d ì\84 í\83\9dí\95  ì\88\98 ì\9e\88ì\8aµë\8b\88ë\8b¤.\n공백ì\9d\84 ì\82¬ì\9a©í\95\98ì§\80 ë§\88ì\84¸ì\9a\94.\n\nì\9d´ í\95\84ë\93\9cë\8a\94 ì\9d¼ë°\98ì \81ì\9c¼ë¡\9c ë¹\84ì\96´있습니다.",
+    "config-db-prefix-help": "ì\97¬ë\9f¬ ì\9c\84í\82¤ ì\82¬ì\9d´ ë\98\90ë\8a\94 ë¯¸ë\94\94ì\96´ì\9c\84í\82¤ì\99\80 ë\8b¤ë¥¸ ì\9b¹ ì\95 í\94\8c리ì¼\80ì\9d´ì\85\98 ì\82¬ì\9d´ì\97\90 í\95\98ë\82\98ì\9d\98 ë\8d°ì\9d´í\84°ë² ì\9d´ì\8a¤ë¥¼ ê³µì\9c í\95´ì\95¼ í\95\98ë\8a\94 ê²½ì\9a°, ì¶©ë\8f\8cì\9d\84 í\94¼í\95\98기 ì\9c\84í\95´ ëª¨ë\93  í\85\8cì\9d´ë¸\94 ì\9d´ë¦\84ì\97\90 ì \91ë\91\90ì\96´ë¥¼ ì¶\94ê°\80í\95\98ë\8f\84ë¡\9d ì\84 í\83\9dí\95  ì\88\98 ì\9e\88ì\8aµë\8b\88ë\8b¤.\n공백ì\9d\84 ì\82¬ì\9a©í\95\98ì§\80 ë§\88ì\84¸ì\9a\94.\n\nì\9d´ í\95\84ë\93\9cë\8a\94 ì\9d¼ë°\98ì \81ì\9c¼ë¡\9c ë¹\84ì\96´ 있습니다.",
     "config-db-charset": "데이터베이스 문자 집합",
     "config-charset-mysql5-binary": "MySQL 4.1/5.0 바이너리",
     "config-charset-mysql5": "MySQL 4.1/5.0 UTF-8",
     "config-charset-mysql4": "MySQL 4.0 UTF-8 하위 호환성",
-    "config-charset-help": "'''경고:''' MySQL 4.1에서 '''UTF-8 하위 호환성'''을 사용하고 나서 <code>mysqldump</code>로 데이터베이스에 백업한다면 모든 ASCII가 아닌 문자를 파괴하고 손상한 백업을 되돌릴 수 없습니다!\n\n'''바이너리 모드'''에서는 미디어위키는 바이너리 필드의 데이터베이스에 UTF-8 텍스트를 저장합니다.\nMySQL의 UTF-8 모드를 보다 더 효율적이고 유니코드 문자의 전체 범위를 사용할 수 있습니다.\n'''UTF-8 모드'''에서는 MySQL은 데이터를 설정하는 문자 집합을 알고 있기 때문에 적절하게 표현하고 변환할 수 있지만\n[//ko.wikipedia.org/wiki/%EC%9C%A0%EB%8B%88%EC%BD%94%EB%93%9C_%ED%8F%89%EB%A9%B4#.EA.B8.B0.EB.B3.B8_.EB.8B.A4.EA.B5.AD.EC.96.B4_.ED.8F.89.EB.A9.B4 기본 다국어 평면] 밖의 문자를 저장할 수 없습니다.",
+    "config-charset-help": "'''경고:''' MySQL 4.1에서 '''하위 호환 가능 UTF-8'''을 사용하고 나서 <code>mysqldump</code>로 데이터베이스를 백업하면 ASCII가 아닌 모든 문자를 파괴하고 손상된 백업을 되돌릴 수 없습니다!\n\n'''바이너리 모드'''에서 미디어위키는 바이너리 필드의 데이터베이스에 UTF-8 텍스트를 저장합니다.\nMySQL의 UTF-8 모드를 보다 더 효율적이고 유니코드 문자의 전체 범위를 사용할 수 있습니다.\n'''UTF-8 모드'''에서는 MySQL이 데이터를 사용하는 문자 집합을 알고 있기 때문에 적절하게 표현하고 변환할 수 있지만\n[//ko.wikipedia.org/wiki/%EC%9C%A0%EB%8B%88%EC%BD%94%EB%93%9C_%ED%8F%89%EB%A9%B4#.EA.B8.B0.EB.B3.B8_.EB.8B.A4.EA.B5.AD.EC.96.B4_.ED.8F.89.EB.A9.B4 기본 다국어 평면] 밖에 있는 문자를 저장할 수 없습니다.",
     "config-mysql-old": "MySQL $1 이상이 필요하나 $2(이)가 있습니다.",
     "config-db-port": "데이터베이스 포트:",
     "config-db-schema": "미디어위키에 대한 스키마:",
     "config-db-schema-help": "보통 이 스키마는 문제가 없습니다.\n필요한 경우에만 바꾸세요.",
     "config-pg-test-error": "'''$1''' 데이터베이스에 연결할 수 없습니다: $2",
     "config-sqlite-dir": "SQLite 데이터 디렉터리:",
-    "config-sqlite-dir-help": "SQLiteë\8a\94 í\95\98ë\82\98ì\9d\98 í\8c\8cì\9d¼ì\97\90 ëª¨ë\93  ë\8d°ì\9d´í\84°ë¥¼ ì \80ì\9e¥í\95©ë\8b\88ë\8b¤.\n\nì \9cê³µí\95\98ë\8a\94 ë\94\94ë \89í\86 ë¦¬ë\8a\94 ì\84¤ì¹\98í\95\98ë\8a\94 ë\8f\99ì\95\88 ì\9b¹ ì\84\9cë²\84ê°\80 ì\93¸ ì\88\98 ì\9e\88ì\96´ì\95¼ í\95©ë\8b\88ë\8b¤.\n\nì\9d´ ë\94\94ë \89í\86 ë¦¬ë\8a\94 ì\9b¹ì\9d\84 í\86µí\95´ ì \91ê·¼í\95  ì\88\98 '''ì\97\86ì\96´ì\95¼''' í\95\98ë\8a\94ë\8d° PHP í\8c\8cì\9d¼ì\9d´ ì\9e\88ë\8a\94 ê³³ì\97\90 ë\84£ì\9d\84 ì\88\98 ì\97\86ë\8a\94 ê²\83ì\9d\80 ì\9d´ ë\95\8c문ì\9e\85ë\8b\88ë\8b¤.\n\nì\84¤ì¹\98 í\94\84ë¡\9cê·¸ë\9e¨ì\9d\80 <code>.htaccess</code> í\8c\8cì\9d¼ì\9d\84 ì\9e\91ì\84±í\95\98ì§\80ë§\8c ì\9d´ê²\83ì\9d´ ì\8b¤í\8c¨í\95\98ë©´ ë\88\84êµ°ê°\80ê°\80 ì\9b\90본 ë\8d°ì\9d´í\84°ë² ì\9d´ì\8a¤ì\97\90 ì \91ê·¼í\95  ì\88\98 ì\9e\88ì\8aµë\8b\88ë\8b¤.\në\8d°ì\9d´í\84°ë² ì\9d´ì\8a¤ë\8a\94 ì\9b\90본 ì\82¬ì\9a©ì\9e\90 ë\8d°ì\9d´í\84°(ì\9d´ë©\94ì\9d¼ ì£¼ì\86\8c, í\95´ì\8b\9cí\95\9c ë¹\84ë°\80ë²\88í\98¸) 뿐만 아니라 삭제된 판과 위키의 다른 제한된 데이터를 포함합니다.\n\n예를 들어 <code>/var/lib/mediawiki/yourwiki</code>와 같이 다른 곳에 데이터베이스를 넣는 것이 좋습니다.",
+    "config-sqlite-dir-help": "SQLiteë\8a\94 í\95\98ë\82\98ì\9d\98 í\8c\8cì\9d¼ì\97\90 ëª¨ë\93  ë\8d°ì\9d´í\84°ë¥¼ ì \80ì\9e¥í\95©ë\8b\88ë\8b¤.\n\nì\9e\85ë ¥í\95\9c ë\94\94ë \89í\86 ë¦¬ë\8a\94 ì\84¤ì¹\98í\95\98ë\8a\94 ë\8f\99ì\95\88 ì\9b¹ ì\84\9cë²\84ê°\80 ì\93¸ ì\88\98 ì\9e\88ì\96´ì\95¼ í\95©ë\8b\88ë\8b¤.\n\nì\9d´ ë\94\94ë \89í\86 ë¦¬ë\8a\94 ì\9b¹ì\9d\84 í\86µí\95´ ì \91ê·¼í\95  ì\88\98 '''ì\97\86ì\96´ì\95¼''' í\95\98ë\8a\94ë\8d°, PHP í\8c\8cì\9d¼ì\9d´ ì\9e\88ë\8a\94 ê³³ì\97\90 ë\84£ì\9d\84 ì\88\98 ì\97\86ë\8a\94 ê²\83ì\9d\80 ì\9d´ ë\95\8c문ì\9e\85ë\8b\88ë\8b¤.\n\nì\84¤ì¹\98 í\94\84ë¡\9cê·¸ë\9e¨ì\9d\80 <code>.htaccess</code> í\8c\8cì\9d¼ì\9d\84 ì\9e\91ì\84±í\95\98ì§\80ë§\8c, ì\9d´ê²\83ì\9d´ ì\8b¤í\8c¨í\95\98ë©´ ë\88\84êµ°ê°\80ê°\80 ì\9b\90본 ë\8d°ì\9d´í\84°ë² ì\9d´ì\8a¤ì\97\90 ì \91ê·¼í\95  ì\88\98 ì\9e\88ì\8aµë\8b\88ë\8b¤.\në\8d°ì\9d´í\84°ë² ì\9d´ì\8a¤ë\8a\94 ì\9b\90본 ì\82¬ì\9a©ì\9e\90 ë\8d°ì\9d´í\84°(ì\9d´ë©\94ì\9d¼ ì£¼ì\86\8c, í\95´ì\8b\9cí\95\9c ë¹\84ë°\80ë²\88í\98¸)뿐만 아니라 삭제된 판과 위키의 다른 제한된 데이터를 포함합니다.\n\n예를 들어 <code>/var/lib/mediawiki/yourwiki</code>와 같이 다른 곳에 데이터베이스를 넣는 것이 좋습니다.",
     "config-oracle-def-ts": "기본 테이블공간:",
     "config-oracle-temp-ts": "임시 테이블공간:",
+    "config-type-mysql": "MySQL (또는 호환되는 데이터베이스 시스템)",
     "config-type-oracle": "Oracle",
+    "config-type-mssql": "마이크로소프트 SQL 서버",
     "config-support-info": "미디어위키는 다음의 데이터베이스 시스템을 지원합니다:\n\n$1\n\n데이터베이스 시스템이 표시되지 않을 때 아래에 나열된 다음 지원을 활성화하려면 위의 링크된 지시에 따라 설치해볼 수 있습니다.",
-    "config-support-mysql": "* $1은 미디어위키의 기본 대상으로 가장 잘 지원합니다. ([http://www.php.net/manual/en/mysql.installation.php MySQL을 지원하여 PHP를 컴파일하는 방법])",
-    "config-support-postgres": "* $1은 MySQL의 대안으로 인기 있는 오픈 소스 데이터베이스 시스템입니다. ([http://www.php.net/manual/en/pgsql.installation.php PostgreSQL을 지원하여 PHP를 컴파일하는 방법]) 몇가지 사소한 해결하지 못한 버그가 있을 수 있으며, 이를 제작 환경에서 사용하지 않는 것이 좋습니다.",
-    "config-support-sqlite": "* $1는 매우 잘 지원하는 가벼운 데이터베이스 시스템입니다. ([http://www.php.net/manual/en/pdo.installation.php SQLite를 지원하여 PHP를 컴파일하는 방법], PDO 사용)",
-    "config-support-oracle": "* $1은 상용 엔터프라이스 데이터베이스입니다. ([http://www.php.net/manual/en/oci8.installation.php OCI8을 지원하여 PHP를 컴파일하는 방법])",
+    "config-dbsupport-mysql": "* [{{int:version-db-mysql-url}} MySQL]은 미디어위키의 기본 대상이며 가장 잘 지원됩니다. 미디어위키는 또한 MySQL와 호환되는 [{{int:version-db-mariadb-url}} MariaDB]와 [{{int:version-db-percona-url}} Percona 서버]에서도 작동합니다. \n\n([http://www.php.net/manual/en/mysql.installation.php MySQL을 지원하여 PHP를 컴파일하는 방법])",
+    "config-dbsupport-postgres": "* [{{int:version-db-postgres-url}} PostgreSQL]은 MySQL의 대안으로서 인기 있는 오픈 소스 데이터베이스 시스템입니다. ([http://www.php.net/manual/en/pgsql.installation.php PostgreSQL을 지원하여 PHP를 컴파일하는 방법]) 몇 가지 해결하지 못한 사소한 버그가 있을 수 있으며, 이를 제작 환경에서 사용하지 않는 것이 좋습니다.",
+    "config-dbsupport-sqlite": "*  [{{int:version-db-sqlite-url}} SQLite]는 매우 잘 지원되고 가벼운 데이터베이스 시스템입니다. ([http://www.php.net/manual/en/pdo.installation.php SQLite를 지원하여 PHP를 컴파일하는 방법], PDO 사용)",
+    "config-dbsupport-oracle": "*  [{{int:version-db-oracle-url}} 오라클]은 상용 엔터프라이스 데이터베이스입니다. ([http://www.php.net/manual/en/oci8.installation.php OCI8을 지원하여 PHP를 컴파일하는 방법])",
+    "config-dbsupport-mssql": "* [{{int:version-db-mssql-url}} 마이크로소프트 SQL 서버]는 윈도용 상용 기업 데이터베이스입니다.([http://www.php.net/manual/en/sqlsrv.installation.php SQLSRV 지원으로 PHP를 컴파일하는 방법])",
     "config-header-mysql": "MySQL 설정",
     "config-header-postgres": "PostgreSQL 설정",
     "config-header-sqlite": "SQLite 설정",
     "config-header-oracle": "Oracle 설정",
+    "config-header-mssql": "마이크로소프트 SQL 서버 설정",
     "config-invalid-db-type": "잘못된 데이터베이스 종류",
     "config-missing-db-name": "\"데이터베이스 이름\"에 대한 값을 입력해야 합니다",
     "config-missing-db-host": "\"데이터베이스 호스트\"에 대한 값을 입력해야 합니다",
     "config-missing-db-server-oracle": "\"데이터베이스 TNS\"에 대한 값을 입력해야 합니다",
-    "config-invalid-db-server-oracle": "\"$1\" 데이터베이스 TNS가 잘못됐습니다.\n\"TNS Name\"이나 \"Easy Connect\" 문자열 중 하나를 사용하세요 ([http://docs.oracle.com/cd/E11882_01/network.112/e10836/naming.htm Oracle 네이밍 메서드])",
+    "config-invalid-db-server-oracle": "\"$1\" 데이터베이스 TNS가 잘못됐습니다.\n\"TNS Name\"이나 \"Easy Connect\" 문자열 중 하나를 사용하세요 ([http://docs.oracle.com/cd/E11882_01/network.112/e10836/naming.htm 오라클 네이밍 메서드])",
     "config-invalid-db-name": "\"$1\" 데이터베이스 이름이 잘못되었습니다.\nASCII 글자 (a-z, A-Z), 숫자 (0-9), 밑줄 (_)과 하이픈 (-)만 사용하세요.",
     "config-invalid-db-prefix": "\"$1\" 데이터베이스 접두어가 잘못됐습니다.\nASCII 글자 (a-z, A-Z), 숫자 (0-9), 밑줄 (_)과 하이픈 (-)만 사용하세요.",
     "config-connection-error": "$1.\n\n호스트, 계정 이름과 비밀번호를 확인하고 다시 시도하세요.",
     "config-db-sys-create-oracle": "설치 프로그램은 새 계정을 만들기 위한 SYSDBA 계정만을 지원합니다.",
     "config-db-sys-user-exists-oracle": "\"$1\" 사용자 계정이 이미 존재합니다. SYSDBA는 새 계정을 만드는 데에만 사용할 수 있습니다!",
     "config-postgres-old": "PostgreSQL $1 이상이 필요하나 $2(이)가 있습니다.",
+    "config-mssql-old": "마이크로소프트 SQL 서버 $1 이상의 버전이 필요합니다. 현재 버전은 $2입니다.",
     "config-sqlite-name-help": "위키를 식별하기 위한 이름을 선택하세요.\n공백이나 하이픈을 사용하지 마십시오.\nSQLite 데이터 파일 이름에 사용됩니다.",
-    "config-sqlite-parent-unwritable-group": "<code><nowiki>$1</nowiki></code> 데이터 디렉토리를 만들 수 없으며 웹 서버는 <code><nowiki>$2</nowiki></code> 상위 디렉토리에 쓸 수 없기 때문입니다.\n\n설치 프로그램은 웹 서버로 실행중인 사용자를 지정할 수 없습니다.\n계속하려면 웹 서버가 쓸 수 있는 <code><nowiki>$3</nowiki></code> 디렉토리를 만드세요.\n유닉스/리눅스 시스템에서의 수행:\n\n<pre>cd $2\nmkdir $3\nchgrp $4 $3\nchmod g+w $3</pre>",
-    "config-sqlite-parent-unwritable-nogroup": "<code><nowiki>$1</nowiki></code> 데이터 디렉토리를 만들 수 없으며 웹 서버는 <code><nowiki>$2</nowiki></code> 상위 디렉토리에 쓸 수 없기 때문입니다.\n\n설치 프로그램은 웹 서버로 실행중인 사용자를 지정할 수 없습니다.\n계속하려면 웹 서버(와 기타!)가 전역으로 쓸 수 있는 <code><nowiki>$3</nowiki></code> 디렉토리를 만드세요.\n유닉스/리눅스 시스템에서의 수행:\n\n<pre>cd $2\nmkdir $3\nchmod a+w $3</pre>",
-    "config-sqlite-mkdir-error": "\"$1\" ë\8d°ì\9d´í\84° ë\94\94ë \89í\86 ë¦¬ë¥¼ ë§\8cë\93\9cë\8a\94 ì¤\91 ì\98¤ë¥\98ê°\80 ë\82¬습니다.\n경로를 확인하고 다시 시도하세요.",
+    "config-sqlite-parent-unwritable-group": "<code><nowiki>$1</nowiki></code> 데이터 디렉토리를 만들 수 없으며, 이는 웹 서버는 상위 디렉토리인 <code><nowiki>$2</nowiki></code>에 쓸 수 없기 때문입니다.\n\n설치 프로그램은 웹 서버로 실행 중인 사용자를 지정할 수 없습니다.\n계속하려면 웹 서버가 쓸 수 있는 <code><nowiki>$3</nowiki></code> 디렉토리를 만드세요.\n유닉스/리눅스 시스템에서의 수행:\n\n<pre>cd $2\nmkdir $3\nchgrp $4 $3\nchmod g+w $3</pre>",
+    "config-sqlite-parent-unwritable-nogroup": "<code><nowiki>$1</nowiki></code> 데이터 디렉토리를 만들 수 없으며, 이는 웹 서버가 상위 디렉토리인 <code><nowiki>$2</nowiki></code>에 쓸 수 없기 때문입니다.\n\n설치 프로그램은 웹 서버로 실행 중인 사용자를 지정할 수 없습니다.\n계속하려면 웹 서버(와 그 외 서버!)가 전역으로 쓸 수 있는 <code><nowiki>$3</nowiki></code> 디렉토리를 만드세요.\n유닉스/리눅스 시스템에서의 수행:\n\n<pre>cd $2\nmkdir $3\nchmod a+w $3</pre>",
+    "config-sqlite-mkdir-error": "\"$1\" ë\8d°ì\9d´í\84° ë\94\94ë \89í\84°ë¦¬ë¥¼ ë§\8cë\93\9cë\8a\94 ë\8f\84ì¤\91 ì\98¤ë¥\98ê°\80 ë°\9cì\83\9dí\96\88습니다.\n경로를 확인하고 다시 시도하세요.",
     "config-sqlite-dir-unwritable": "\"$1\" 디렉토리에 쓸 수 없습니다.\n웹 서버를 쓸 수 있도록 권한을 바꾸고 다시 시도하세요.",
     "config-sqlite-connection-error": "$1.\n\n호스트, 계정 이름과 비밀번호를 확인하고 다시 시도하세요.",
     "config-sqlite-readonly": "<code>$1</code> 파일은 쓸 수 없습니다.",
     "config-sqlite-cant-create-db": "<code>$1</code> 데이터베이스 파일을 만들 수 없습니다.",
-    "config-sqlite-fts3-downgrade": "PHPê°\80 FTS3 ì§\80ì\9b\90ì\9d´ ì\97\86ì\96´ì¡\8cì\8aµë\8b\88ë\8b¤. í\85\8cì\9d´ë¸\94ì\9d\84 ë\8b¤ì\9a´ê·¸ë \88ì\9d´ë\93\9cí\95\98ì\84¸ì\9a\94.",
+    "config-sqlite-fts3-downgrade": "PHPê°\80 FTS3 ì§\80ì\9b\90ì\9d´ ì\97\86ì\96´ì¡\8cì\8aµë\8b\88ë\8b¤. í\85\8cì\9d´ë¸\94ì\9d\84 ë\8b¤ì\9a´ê·¸ë \88ì\9d´ë\93\9cí\95©ë\8b\88ë\8b¤",
     "config-can-upgrade": "이 데이터베이스에 미디어위키 테이블이 있습니다.\n미디어위키 $1(으)로 업그레이드하려면 '''계속'''을 클릭하세요.",
-    "config-upgrade-done": "ì\97\85ê·¸ë \88ì\9d´ë\93\9cê°\80 ì\99\84ë£\8cë\90\98ì\97\88ì\8aµë\8b\88ë\8b¤.\n\nì\9d´ì \9c [$1 ì\9c\84í\82¤ë¥¼ ì\8b\9cì\9e\91\95  ì\88\98 ì\9e\88ì\8aµë\8b\88ë\8b¤.\n\në§\8cì\95½ <code>LocalSettings.php</code> í\8c\8cì\9d¼ì\9d\84 ë\8b¤ì\8b\9c ë§\8cë\93¤ê¸°ë¥¼ ì\9b\90í\95\98면 아래의 버튼을 클릭하세요.\n위키에 문제가 있지 않는 한 '''권장하지 않습니다'''.",
+    "config-upgrade-done": "ì\97\85ê·¸ë \88ì\9d´ë\93\9cê°\80 ì\99\84ë£\8cë\90\98ì\97\88ì\8aµë\8b\88ë\8b¤.\n\nì\9d´ì \9c [$1 ì\9c\84í\82¤ë¥¼ ì\8b\9cì\9e\91\95  ì\88\98 ì\9e\88ì\8aµë\8b\88ë\8b¤.\n\në§\8cì\95½ <code>LocalSettings.php</code> í\8c\8cì\9d¼ì\9d\84 ë\8b¤ì\8b\9c ë§\8cë\93¤ê³  ì\8b¶ë\8b¤면 아래의 버튼을 클릭하세요.\n위키에 문제가 있지 않는 한 '''권장하지 않습니다'''.",
     "config-upgrade-done-no-regenerate": "업그레이드가 완료되었습니다.\n\n이제 [$1 위키를 시작]할 수 있습니다.",
-    "config-regenerate": "LocalSettings.php 다시 만들기 →",
+    "config-regenerate": "LocalSettings.php 다시 생성 →",
     "config-show-table-status": "<code>SHOW TABLE STATUS</code> 쿼리를 실패했습니다!",
     "config-unknown-collation": "'''경고:''' 데이터베이스가 인식하지 않는 정렬을 사용하고 있습니다.",
     "config-db-web-account": "웹 접근을 위한 데이터베이스 계정",
-    "config-db-web-help": "위키의 일반적인 작업 중에 데이터베이스 서버에 연결하는 데 사용할 웹 서버에 대한 계정 이름과 비밀번호를 선택하세요.",
+    "config-db-web-help": "위키의 일반적인 작업을 수행하는 동안 데이터베이스 서버에 연결하는 데 사용할 웹 서버의 계정 이름과 비밀번호를 선택하세요.",
     "config-db-web-account-same": "설치를 위해 같은 계정 사용",
     "config-db-web-create": "이 계정이 아직 존재하지 않을 경우 계정 만들기",
-    "config-db-web-no-create-privs": "ì\84¤ì¹\98를 ì\9c\84í\95´ ì§\80ì \95í\95\9c ê³\84ì \95ì\9d\80 계정을 만들 수 있는 충분한 권한이 없습니다.\n여기서 지정한 계정은 이미 존재해야 합니다.",
-    "config-mysql-engine": "ì\8a¤í\86 ë¦¬ì§\80 엔진:",
+    "config-db-web-no-create-privs": "ì\84¤ì¹\98를 ì\9c\84í\95´ ì§\80ì \95í\95\9c ê³\84ì \95ì\9d´ 계정을 만들 수 있는 충분한 권한이 없습니다.\n여기서 지정한 계정은 이미 존재해야 합니다.",
+    "config-mysql-engine": "ì \80ì\9e¥ì\86\8c 엔진:",
     "config-mysql-innodb": "InnoDB",
     "config-mysql-myisam": "MyISAM",
-    "config-mysql-myisam-dep": "'''경고''': 미디어위키에 사용하지 않는 것이 좋은 MySQL에 대한 스토리지 엔진으로 MyISAM을 선택하였습니다. 이유는:\n* 테이블 잠금에 의해 간신히 동시성을 지원합니다\n* 다른 엔진보다 손상하는 경향이 있습니다\n* 미디어위키 코드베이스가 항상 정상적으로 MyISAM을 처리하지 않습니다\n\nMySQL 설치가 InnoDB를 지원한다면, 그 선택 대신에 InnoDB를 선택할 것을 매우 권장합니다.\nMySQL 설치가 InnoDB를 지원하지 않는다면, 아마도 업그레이드를 할 시간입니다.",
-    "config-mysql-only-myisam-dep": "'''경고''': 미디어위키에 사용하지 않는 것이 좋은 MySQL에 대한 유일하게 사용할 수 있는 스토리지 엔진입니다. 이유는:\n* 테이블 잠금에 의해 간신히 동시성을 지원합니다\n* 다른 엔진보다 손상하는 경향이 있습니다\n* 미디어위키 코드베이스가 항상 정상적으로 MyISAM을 처리하지 않습니다\n\nMySQL 설치가 InnoDB를 지원하지 않으며, 아마도 업그레이드를 할 시간입니다.",
-    "config-mysql-engine-help": "'''InnoDB'''는 동시적인 지원에 좋기 때문에 대부분 최고의 옵션입니다.\n\n'''MyISAM'''은 단일 사용자 또는 읽기 전용 설치에 빠를 수 있습니다.\nMyISAM 데이터베이스는 InnoDB 데이터베이스보다 더 자주 손실될 수 있습니다.",
+    "config-mysql-myisam-dep": "'''경고''': MySQL을 위한 저장소 엔진으로 MyISAM을 선택하였습니다. MyISAM을 미디어위키에 사용하는 것은 좋지 않습니다.  이유는:\n* 테이블 잠금 때문에 동시 실행을 지원하지 않습니다\n* 다른 엔진보다 더 손상되는 경향이 있습니다\n* 미디어위키 코드베이스가 항상 정상적으로 MyISAM을 처리하지 않습니다\n\nMySQL이 InnoDB를 지원한다면, InnoDB를 선택할 것을 매우 권장합니다.\nMySQL이 InnoDB를 지원하지 않는다면, 업그레이드를 하시는 편이 좋습니다.",
+    "config-mysql-only-myisam-dep": "'''경고''': MyISAM은 이 기계에  유일하게 사용할 수 있는 MySQL용 저장소 엔진이며, 미디어위키에 사용하는 것은 좋지 않습니다. 이유는:\n* 테이블 잠금 때문에 동시 실행을 지원하지 않습니다\n* 다른 엔진보다 더 손상시키는 경향이 있습니다\n* 미디어위키 코드베이스가 항상 정상적으로 MyISAM을 처리하지 않습니다\n\n당신의 MySQL은 InnoDB를 지원하지 않으며, 업그레이드를 하는 것이 좋습니다.",
+    "config-mysql-engine-help": "'''InnoDB'''는 동시 실행 지원이 우수하기 때문에 대부분의 경우 최고의 옵션입니다.\n\n'''MyISAM'''은 단일 사용자나 읽기 전용 설치에서 더 빠를 수 있습니다.\nMyISAM 데이터베이스는 InnoDB 데이터베이스보다 더 자주 손실될 수 있습니다.",
     "config-mysql-charset": "데이터베이스 문자 집합:",
     "config-mysql-binary": "바이너리",
     "config-mysql-utf8": "UTF-8",
-    "config-mysql-charset-help": "'''바이너리 모드'''에서는 미디어위키는 바이너리 필드의 데이터베이스에 UTF-8 텍스트를 저장합니다.\nMySQL의 UTF-8 모드를 보다 더 효율적이고 유니코드 문자의 전체 범위를 사용할 수 있습니다.\n'''UTF-8 모드'''에서는 MySQL은 데이터를 설정하는 문자 집합을 알고 있기 때문에 적절하게 표현하고 변환할 수 있지만\n[//ko.wikipedia.org/wiki/%EC%9C%A0%EB%8B%88%EC%BD%94%EB%93%9C_%ED%8F%89%EB%A9%B4#.EA.B8.B0.EB.B3.B8_.EB.8B.A4.EA.B5.AD.EC.96.B4_.ED.8F.89.EB.A9.B4 기본 다국어 평면] 밖의 문자를 저장할 수 없습니다.",
+    "config-mysql-charset-help": "'''바이너리 모드'''에서 미디어위키는 바이너리 필드의 데이터베이스에 UTF-8 텍스트를 저장합니다.\nMySQL의 UTF-8 모드보다 더 효율적이고, 유니코드 문자의 전체 범위를 사용할 수 있습니다.\n'''UTF-8 모드'''에서는 MySQL이 데이터를 사용하는 문자 집합을 알고 있기 때문에 적절하게 표현하고 변환할 수 있지만\n[//ko.wikipedia.org/wiki/%EC%9C%A0%EB%8B%88%EC%BD%94%EB%93%9C_%ED%8F%89%EB%A9%B4#.EA.B8.B0.EB.B3.B8_.EB.8B.A4.EA.B5.AD.EC.96.B4_.ED.8F.89.EB.A9.B4 기본 다국어 평면] 밖에 있는 문자를 저장할 수 없습니다.",
+    "config-mssql-auth": "인증 형식:",
+    "config-mssql-install-auth": "설치 과정 중 데이터베이스에 연결하는 데 사용할 인증 형식을 선택하세요.\n\"{{int:config-mssql-windowsauth}}\"을 선택하시면 웹서버를 실행 중인 아무 사용자의 자격 증명이 사용됩니다.",
+    "config-mssql-web-auth": "위키가 일반적인 작업을 수행하는 동안 데이터베이스 서버에 연결하는 데 사용할 인증 형식을 선택하세요.\n\n\"{{int:config-mssql-windowsauth}}\"을 선택하시면 웹서버를 실행 중인 아무 사용자의 자격 증명이 사용됩니다.",
+    "config-mssql-sqlauth": "SQL 서버 인증",
+    "config-mssql-windowsauth": "Windows 인증",
     "config-site-name": "위키 이름:",
     "config-site-name-help": "브라우저 제목 표시줄과 다른 여러 곳에 나타납니다.",
     "config-site-name-blank": "사이트 이름을 입력하세요.",
     "config-ns-site-name": "위키 이름과 같은 이름: $1",
     "config-ns-other": "기타 (지정)",
     "config-ns-other-default": "내위키",
-    "config-project-namespace-help": "위키백과의 예를 따라서, 많은 위키는 \"'''프로젝트 이름공간'''\"에 그들의 콘텐츠 페이지에서 그들의 정책 페이지는 별도로 보관합니다.\n이 이름공간에 있는 모든 페이지의 제목은 여기서 지정할 수 있는 특정 접두어로 시작합니다.\n보통 이 접두어는 위키의 이름에서 파생되지만, \"#\" 또는 \":\"와 같은 특수 문자를 포함할 수 없습니다.",
+    "config-project-namespace-help": "위키백과의 예에 따르면, 많은 위키는 정책 문서를 일반 문서와는 별도로 \"'''프로젝트 이름공간'''\"에 보관합니다.\n이 이름공간에 있는 모든 문서의 제목은 여기서 지정할 수 있는 특정 접두어로 시작합니다.\n보통 이 접두어는 위키의 이름에서 파생되지만, \"#\" 또는 \":\"와 같은 특수 문자를 포함할 수 없습니다.",
     "config-ns-invalid": "특정 \"<nowiki>$1</nowiki>\" 이름공간이 잘못되었습니다.\n다른 프로젝트 이름공간을 지정하세요.",
     "config-ns-conflict": "특정 \"<nowiki>$1</nowiki>\" 이름공간이 기본 미디어위키 이름공간과 충돌합니다.\n다른 프로젝트 이름공간을 지정하세요.",
     "config-admin-box": "관리자 계정",
-    "config-admin-name": "사용자 이름:",
+    "config-admin-name": "내 사용자 이름:",
     "config-admin-password": "비밀번호:",
     "config-admin-password-confirm": "비밀번호 확인:",
     "config-admin-help": "\"홍길동\"과 같이 여기에 원하는 사용자 이름을 입력하세요.\n위키에 로그인하는 데 사용되는 이름입니다.",
     "config-admin-name-blank": "관리자의 사용자 이름을 입력하세요.",
     "config-admin-name-invalid": "특정 \"<nowiki>$1</nowiki>\" 사용자 이름이 잘못되었습니다.\n다른 사용자 이름을 지정하세요.",
     "config-admin-password-blank": "관리자 계정의 비밀번호를 입력하세요.",
-    "config-admin-password-same": "비밀번호는 사용자 이름과 같아서는 안 됩니다.",
     "config-admin-password-mismatch": "입력한 비밀번호 두 개가 일치하지 않습니다.",
     "config-admin-email": "이메일 주소:",
-    "config-admin-email-help": "ì\9c\84í\82¤ì\9d\98 ë\8b¤ë¥¸ ì\82¬ì\9a©ì\9e\90ë¡\9cë¶\80í\84° ì\9d´ë©\94ì\9d¼ì\9d\84 ì \84ë\8b¬ë°\9bê±°ë\82\98 ë¹\84ë°\80ë²\88í\98¸ë¥¼ ì\9e¬ì\84¤ì \95í\95\98ê³  ì£¼ì\8b\9c문ì\84\9c ëª©ë¡\9dì\97\90 ë\8c\80í\95\9c ë°\94ë\80\9c ì\95\8c림ì\9d\84 ë°\9b기 ì\9c\84í\95´ ì\97¬ê¸°ì\97\90 ì\9d´ë©\94ì\9d¼ ì£¼ì\86\8c를 ì\9e\85ë ¥í\95\98세요. 이 필드를 비워 둘 수 있습니다.",
+    "config-admin-email-help": "ì\97¬ê¸°ì\97\90 ì\9d´ë©\94ì\9d¼ ì£¼ì\86\8c를 ì\9e\85ë ¥í\95\98ì\97¬ ì\9c\84í\82¤ì\9d\98 ë\8b¤ë¥¸ ì\82¬ì\9a©ì\9e\90ë¡\9cë¶\80í\84° ì\9d´ë©\94ì\9d¼ì\9d\84 ì \84ë\8b¬ë°\9bê±°ë\82\98 ë¹\84ë°\80ë²\88í\98¸ë¥¼ ì\9e¬ì\84¤ì \95í\95\98ê³  ì£¼ì\8b\9c문ì\84\9c ëª©ë¡\9dì\97\90 ë\8c\80í\95\9c ë°\94ë\80\9c ì\95\8c림ì\9d\84 ë°\9bì\9c¼세요. 이 필드를 비워 둘 수 있습니다.",
     "config-admin-error-user": "\"<nowiki>$1</nowiki>\" 이름의 관리자를 만드는 중 내부 오류가 발생했습니다.",
     "config-admin-error-password": "\"<nowiki>$1</nowiki>\" 관리자의 비밀번호를 설정하는 중 내부 오류가 발생했습니다: <pre>$2</pre>",
     "config-admin-error-bademail": "이메일 주소를 잘못 입력하였습니다.",
-    "config-subscribe": "[https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce ë°°í\8f¬ ë°\9cí\91\9c ë©\94ì\9d¼ë§\81 ë¦¬ì\8a¤í\8a¸]ì\97\90 ê°\80ì\9e\85í\95©ë\8b\88ë\8b¤.",
-    "config-subscribe-help": "ì¤\91ì\9a\94í\95\9c ë³´ì\95\88 ì\95\8c림ì\9d\84 í\8f¬í\95¨í\95\9c ë°°í\8f¬ ì\95\8c림ì\97\90 ë\8c\80í\95´ ì\82¬ì\9a©ë\90\98ë\8a\94 ë¡\9cì\9a° ë³¼ë¥¨ ë©\94ì\9d¼ë§\81 ë¦¬ì\8a¤í\8a¸ì\9e\85ë\8b\88ë\8b¤.\nì\9d´ ë¦¬ì\8a¤í\8a¸ë¥¼ êµ¬ë\8f\85í\95\98ê³  ë\82\98ì\84\9c ì\83\88 ë²\84ì \84ì\9d´ ë\82\98ì\98¬ ë\95\8c ë¯¸ë\94\94ì\96´ì\9c\84í\82¤ ì\84¤ì¹\98를 ì\97\85ë\8d°ì\9d´í\8a¸í\95\98ì\8b­ì\8b\9cì\98¤.",
-    "config-subscribe-noemail": "ì\9d´ë©\94ì\9d¼ ì£¼ì\86\8c를 ì \9cê³µí\95\98ì§\80 ì\95\8aê³  ë°°í\8f¬ ë°\9cí\91\9c ë©\94ì\9d¼ë§\81 ë¦¬ì\8a¤í\8a¸ì\97\90 ê°\80ì\9e\85í\95\98ë ¤ í\95©ë\8b\88ë\8b¤.\në©\94ì\9d¼ë§\81 ë¦¬ì\8a¤í\8a¸ì\97\90 ê°\80ì\9e\85í\95\98ê³ ì\9e\90 í\95  ê²½ì\9a° ì\9d´ë©\94ì\9d¼ ì£¼ì\86\8c를 ì \9cê³µ하세요.",
+    "config-subscribe": "[https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce ë¦´ë¦¬ì\8a¤ ë°\9cí\91\9c ë©\94ì\9d¼ë§\81 ë¦¬ì\8a¤í\8a¸]를 êµ¬ë\8f\85í\95©ë\8b\88ë\8b¤.",
+    "config-subscribe-help": "ì¤\91ì\9a\94í\95\9c ë³´ì\95\88 ì\95\8c림ì\9d\84 í\8f¬í\95¨í\95\9c ë¦´ë¦¬ì\8a¤ ì\95\8c림ì\97\90 ì\82¬ì\9a©ë\90\98ë\8a\94 ì \80ì\9a©ë\9f\89 ë©\94ì\9d¼ë§\81 ë¦¬ì\8a¤í\8a¸ì\9e\85ë\8b\88ë\8b¤.\nì\9d´ ë¦¬ì\8a¤í\8a¸ë¥¼ êµ¬ë\8f\85í\95\98ê³  ì\83\88 ë²\84ì \84ì\9d´ ë\82\98ì\98¬ ë\95\8c ë¯¸ë\94\94ì\96´ì\9c\84í\82¤ ì\84¤ì¹\98를 ì\97\85ë\8d°ì\9d´í\8a¸í\95´ì\95¼ í\95©ë\8b\88ë\8b¤.",
+    "config-subscribe-noemail": "ì\9d´ë©\94ì\9d¼ ì£¼ì\86\8c를 ì\9e\85ë ¥í\95\98ì§\80 ì\95\8aê³  ë¦´ë¦¬ì\8a¤ ë°\9cí\91\9c ë©\94ì\9d¼ë§\81 ë¦¬ì\8a¤í\8a¸ì\97\90 ê°\80ì\9e\85í\95\98ë ¤ í\95©ë\8b\88ë\8b¤.\në©\94ì\9d¼ë§\81 ë¦¬ì\8a¤í\8a¸ì\97\90 ê°\80ì\9e\85í\95\98ê³ ì\9e\90 í\95  ê²½ì\9a° ì\9d´ë©\94ì\9d¼ ì£¼ì\86\8c를 ì\9e\85ë ¥하세요.",
     "config-almost-done": "거의 다 완료했습니다!\n이제 남은 설정을 생략하고 지금 바로 위키를 설치할 수 있습니다.",
     "config-optional-continue": "더 많은 질문을 물어보세요.",
     "config-optional-skip": "지겨워요, 그냥 위키를 설치할래요.",
     "config-profile-no-anon": "계정 만들기 필요",
     "config-profile-fishbowl": "승인된 편집자만",
     "config-profile-private": "비공개 위키",
-    "config-profile-help": "위키는 많은 사람들이 가능한 한 편집할 수 있도록 하면 가장 뛰어난 역할을 합니다.\n미디어위키에서는 최근 바뀜을 검토하기 쉽고, 선하거나 악의적인 사용자의 어떠한 손실을 되돌리는 것이 쉽습니다.\n\n그러나 많은 사람이 미디어위키는 다양한 역할로 유용하지만, 때로는 모든 사람에게 위키 방식의 장점을 설득하기 쉽지 않을 지도 모릅니다.\n그래서 선택할 수 있습니다.\n\n'''{{int:config-profile-wiki}}''' 모델은 로그인하지 않고도 누구나 편집할 수 있습니다.\n'''{{int:config-profile-no-anon}}'''인 위키는 각 편집에 추가적으로 강한 책임을 제공하지만, 부담 없는 기여를 저해할 수도 있습니다.\n\n'''{{int:config-profile-fishbowl}}''' 시나리오는 승인된 사용자만 편집할 수 있지만, 대중은 역사를 포함하여 문서를 볼 수 있습니다.\n'''{{int:config-profile-private}}'''는 승인된 사용자만 문서를 볼 수 있으며 해당 그룹을 편집할 수 있습니다.\n\n더 복잡한 사용자 권한을 설정은 설치한 후 사용할 수 있으며 [//www.mediawiki.org/wiki/Manual:User_rights 관련 설명서 항목]을 참고하세요.",
+    "config-profile-help": "위키는 가능한 많은 사람들이 편집할 수 있도록 할 때 가장 뛰어난 역할을 합니다.\n미디어위키에서는 최근 바뀜을 검토하기 쉽고, 미숙하거나 악의적인 사용자의 어떠한 손실을 되돌리는 것이 쉽습니다.\n\n그러나 많은 사람이 미디어위키가 다양한 역할을 수행하는 데 유용하다는 것을 알고 있지만, 때로는 모든 사람에게 위키 방식의 장점을 설득하기 쉽지 않을 지도 모릅니다.\n그래서 선택할 수 있습니다.\n\n'''{{int:config-profile-wiki}}''' 모델은 로그인하지 않고도 누구나 편집할 수 있습니다.\n'''{{int:config-profile-no-anon}}'''인 위키에서는 편집자에게 추가적인 책임을 부여하지만, 부담 없는 기여를 저해할 수도 있습니다.\n\n'''{{int:config-profile-fishbowl}}''' 시나리오에서는 승인된 사용자만 편집할 수 있지만, 일반 사용자도 문서(문서 역사 포함)는 볼 수 있습니다.\n'''{{int:config-profile-private}}'''는 승인된 사용자만 문서를 볼 수 있으며, 승인된 사용자 그룹이 편집할 수 있습니다.\n\n더 복잡한 사용자 권한 설정은 설치한 후 사용할 수 있으며 [//www.mediawiki.org/wiki/Manual:User_rights 관련 설명서 항목]을 참고하세요.",
     "config-license": "저작권 및 라이선스:",
     "config-license-none": "라이선스 바닥글 없음",
     "config-license-cc-by-sa": "크리에이티브 커먼즈 저작자표시-동일조건변경허락",
     "config-license-gfdl": "GNU 자유 문서 사용 허가서 1.3 이상",
     "config-license-pd": "퍼블릭 도메인",
     "config-license-cc-choose": "다른 크리에이티브 커먼즈 라이선스 선택",
-    "config-license-help": "ë§\8eì\9d\80 ê³µê°\9c ì\9c\84í\82¤ë\8a\94 ëª¨ë\93  ê¸°ì\97¬ë¥¼ [http://freedomdefined.org/Definition ì\9e\90ì\9c  ë\9d¼ì\9d´ì\84 ì\8a¤]ì\97\90 ë\94°ë\9d¼ ë\84£ì\8aµë\8b\88ë\8b¤.\nì\9d´ë \87ê²\8c í\95\98ë©´ ì»¤ë®¤ë\8b\88í\8b° ì\86\8cì\9c ê¶\8cì\9d\98 ì\9d´í\95´ë¥¼ í\95  ì\88\98 ì\9e\88ë\8f\84ë¡\9d í\95\98ê³  ì\9e¥ê¸°ì \81ì\9d¸ ê¸°ì\97¬ë¥¼ ì\9e¥ë ¤í\95©ë\8b\88ë\8b¤.\nì\9d¼ë°\98ì \81ì\9c¼ë¡\9c ê°\9cì\9d¸ ë\98\90ë\8a\94 í\9a\8cì\82¬ ì\9c\84í\82¤ì\97\90 ë\8c\80í\95´ì\84\9cë\8a\94 í\95\84ì\9a\94í\95\98ì§\80 ì\95\8aì\8aµë\8b\88ë\8b¤.\n\nì\9c\84í\82¤ë°±ê³¼ì\9d\98 í\85\8dì\8a¤í\8a¸ë¥¼ ì\82¬ì\9a©í\95  ì\88\98 ì\9e\88ë\8f\84ë¡\9d í\95\98ê³  ì\9c\84í\82¤ë°±ê³¼ê°\80 ì\9c\84í\82¤ì\97\90ì\84\9c ë³µì\82¬í\95\9c í\85\8dì\8a¤í\8a¸ë¥¼ ì\82¬ì\9a©í\95  ì\88\98 ì\9e\88ë\8f\84ë¡\9d ì\9b\90í\95\9cë\8b¤ë©´ '''í\81¬ë¦¬ì\97\90ì\9d´í\8b°ë¸\8c ì»¤ë¨¼ì¦\88 ì \80ì\9e\91ì\9e\90í\91\9cì\8b\9c\8f\99ì\9d¼ì¡°ê±´ë³\80ê²½í\97\88ë\9d½'''ì\9c¼ë¡\9c ì\84 í\83\9dí\95´ì\95¼ í\95©ë\8b\88ë\8b¤.\n\nì\9c\84í\82¤ë°±ê³¼ë\8a\94 ì\9d´ì \84ì\97\90 GNU ì\9e\90ì\9c  ë¬¸ì\84\9c ì\82¬ì\9a© í\97\88ê°\80ì\84\9c를 사용했습니다.\nGFDL은 유효한 라이선스이지만 내용을 이해하기 어렵습니다.\nGFDL에 따라 사용이 허가된 내용을 재사용하는 것도 어렵습니다.",
+    "config-license-help": "ë§\8eì\9d\80 ê³µê°\9c ì\9c\84í\82¤ë\8a\94 ëª¨ë\93  ê¸°ì\97¬ë¥¼ [http://freedomdefined.org/Definition ì\9e\90ì\9c  ë\9d¼ì\9d´ì\84 ì\8a¤]ì\97\90 ë\94°ë¥´ë\8f\84ë¡\9d í\95©ë\8b\88ë\8b¤.\nì\9d´ë \87ê²\8c í\95\98ë©´ ì»¤ë®¤ë\8b\88í\8b°ì\97\90 ë\8c\80í\95\9c ì\86\8cì\9c ê¶\8cì\9d\84 ì\9d´í\95´í\95  ì\88\98 ì\9e\88ë\8f\84ë¡\9d í\95\98ê³  ì\9e¥ê¸°ì \81ì\9d¸ ê¸°ì\97¬ë¥¼ ì\9e¥ë ¤í\95©ë\8b\88ë\8b¤.\nì\9d¼ë°\98ì \81ì\9c¼ë¡\9c ê°\9cì\9d¸ ë\98\90ë\8a\94 í\9a\8cì\82¬ ì\9c\84í\82¤ì\97\90ê²\8cë\8a\94 í\95\84ì\9a\94í\95\98ì§\80 ì\95\8aì\8aµë\8b\88ë\8b¤.\n\nì\9c\84í\82¤ë°±ê³¼ì\9d\98 í\85\8dì\8a¤í\8a¸ë¥¼ ì\82¬ì\9a©í\95  ì\88\98 ì\9e\88ë\8f\84ë¡\9d í\95\98ê³  ì\9c\84í\82¤ë°±ê³¼ê°\80 ì\9c\84í\82¤ì\97\90ì\84\9c ë³µì\82¬í\95\9c í\85\8dì\8a¤í\8a¸ë¥¼ ì\82¬ì\9a©í\95  ì\88\98 ì\9e\88ë\8f\84ë¡\9d ì\9b\90í\95\9cë\8b¤ë©´ '''í\81¬ë¦¬ì\97\90ì\9d´í\8b°ë¸\8c ì»¤ë¨¼ì¦\88 ì \80ì\9e\91ì\9e\90í\91\9cì\8b\9c\8f\99ì\9d¼ì¡°ê±´ë³\80ê²½í\97\88ë\9d½'''ì\9c¼ë¡\9c ì\84 í\83\9dí\95´ì\95¼ í\95©ë\8b\88ë\8b¤.\n\nì\9c\84í\82¤ë°±ê³¼ë\8a\94 ì\9d´ì \84ì\97\90 GNU ì\9e\90ì\9c  ë¬¸ì\84\9c ì\82¬ì\9a© í\97\88ê°\80ì\84\9c(GFDL)를 사용했습니다.\nGFDL은 유효한 라이선스이지만 내용을 이해하기 어렵습니다.\nGFDL에 따라 사용이 허가된 내용을 재사용하는 것도 어렵습니다.",
     "config-email-settings": "이메일 설정",
     "config-enable-email": "발신 이메일 활성화",
     "config-enable-email-help": "이메일을 작동하려면 [http://www.php.net/manual/en/mail.configuration.php PHP의 메일 설정]을 올바르게 설정해야 합니다.\n이메일 기능을 사용하지 않으려면 이를 비활성화할 수 있습니다.",
     "config-email-watchlist": "주시문서 목록 알림 활성화",
     "config-email-watchlist-help": "환경 설정에서 활성화한 경우 사용자가 주시한 문서에 대한 알림을 받도록 활성화합니다.",
     "config-email-auth": "이메일 인증 활성화",
-    "config-email-auth-help": "이 설정이 활성화되어 있으면 사용자는 이메일 주소를 설정하거나 바꿀 때마다 링크를 사용하여 이메일 주소를 확인해야 합니다.\n인증된 이메일 주소만 다른 사용자로부터의 이메일이나 바뀜 알림 이메일을 받을 수 있습니다.\n이메일 기능의 남용 가능성이 있기 때문에 이 옵션을 설정하는 것은 공개 위키에서 '''권장'''합니다.",
+    "config-email-auth-help": "이 설정이 활성화되어 있으면 사용자는 이메일 주소를 설정하거나 바꿀 때마다 링크를 사용하여 이메일 주소를 확인해야 합니다.\n인증된 이메일 주소만 다른 사용자로부터의 이메일이나 바뀜 알림 이메일을 받을 수 있습니다.\n이메일 기능의 남용 가능성이 있기 때문에 공개 위키에서는 이 옵션을 설정할 것을 '''권장'''합니다.",
     "config-email-sender": "반송 이메일 주소",
     "config-email-sender-help": "발신한 이메일에 대한 반송 주소로 사용할 이메일 주소를 입력하세요.\n반송할 때 보내는 주소입니다.\n대부분의 메일 서버는 적어도 도메인 이름 부분은 유효합니다.",
     "config-upload-settings": "그림과 파일 올리기",
     "config-upload-deleted-help": "삭제된 파일을 보관할 디렉토리를 선택하세요.\n이상적으로 웹에서 접근할 수 없게 해야 합니다.",
     "config-logo": "로고 URL:",
     "config-logo-help": "미디어위키의 기본 스킨은 사이드바 메뉴 위에 135×160 픽셀의 로고의 공간을 포함하고 있습니다.\n적당한 크기로 그림을 올리고 여기에 URL을 입력하세요.\n\n로고가 상대적인 경로에 있으면 <code>$wgStylePath</code>나 <code>$wgScriptPath</code>를 사용할 수 있습니다.\n\n로고 사용을 원하지 않으면 이 상자를 비우세요.",
-    "config-instantcommons": "인스턴트 공용 활성화",
-    "config-instantcommons-help": "[//www.mediawiki.org/wiki/InstantCommons 인스턴트 공용]은 [//commons.wikimedia.org/ 위키미디어 공용] 사이트에서 찾을 수 있는 그림, 소리 및 다른 미디어를 위키에서 사용할 수 있도록 하는 기능입니다.\n이렇게 하려면 미디어위키가 인터넷에 접근해야합니다.\n\n위키미디어 공용 외에 기타 위키를 설정하는 방법에 대한 지침을 포함한 기능에 대한 자세한 내용은 [//mediawiki.org/wiki/Manual:$wgForeignFileRepos 매뉴얼]을 참고하세요.",
+    "config-instantcommons": "인스턴트 공용 기능 활성화",
+    "config-instantcommons-help": "[//www.mediawiki.org/wiki/InstantCommons 인스턴트 공용]은 [//commons.wikimedia.org/ 위키미디어 공용] 사이트에서 찾을 수 있는 그림, 소리 및 다른 미디어를 위키에서 사용할 수 있도록 하는 기능입니다.\n이렇게 하려면 미디어위키가 인터넷에 접근해야합니다.\n\n위키미디어 공용 외에 기타 위키를 설정하는 방법에 대한 지침을 포함한, 기능에 대한 자세한 내용은 [//mediawiki.org/wiki/Manual:$wgForeignFileRepos 매뉴얼]을 참고하세요.",
     "config-cc-error": "크리에이티브 커먼즈 라이선스 선택기에 결과가 없습니다.\n수동으로 라이선스 이름을 입력하세요.",
     "config-cc-again": "다시 선택...",
     "config-cc-not-chosen": "원하는 크리에이티브 커먼즈 라이선스를 선택하고 \"진행\"을 클릭하세요.",
     "config-advanced-settings": "고급 설정",
     "config-cache-options": "개체 캐싱을 위한 설정:",
-    "config-cache-help": "개체 캐싱은 자주 사용하는 데이터를 캐싱하여 미디어위키의 속도를 개선하는 데 사용합니다.\n큰 사이트의 규모에는 이를 많이 사용하도록 권장하고 있으며, 소규모 사이트들도 물론 이익을 볼 수 있습니다.",
-    "config-cache-none": "ìº\90ì\8b\9cí\95\98ì§\80 ì\95\8aì\9d\8c (기ë\8a¥ì \81ì\9c¼ë¡\9cë\8a\94 ì\82­ì \9cë\90\98ì§\80 ì\95\8aì§\80ë§\8c í\81° ì\9c\84í\82¤ ì\82¬ì\9d´í\8a¸ì\97\90 ì\86\8dë\8f\84ì\97\90 영향을 받을 수 있습니다)",
+    "config-cache-help": "개체 캐싱은 자주 사용하는 데이터를 캐싱하여 미디어위키의 속도를 개선하는 데 사용합니다.\n큰 규모의 사이트는 이를 많이 사용하도록 권장하고 있으며, 소규모 사이트들도 물론 혜택을 볼 수 있습니다.",
+    "config-cache-none": "ìº\90ì\8b\9cí\95\98ì§\80 ì\95\8aì\9d\8c (기ë\8a¥ì\9d´ ì\82­ì \9cë\90\98ì§\80ë\8a\94 ì\95\8aì§\80ë§\8c í\81° ì\9c\84í\82¤ ì\82¬ì\9d´í\8a¸ì\97\90 ì\86\8dë\8f\84ê°\80 영향을 받을 수 있습니다)",
     "config-cache-accel": "PHP 개체 캐싱 (APC, XCache 또는 WinCache)",
     "config-cache-memcached": "Memcached 사용 (추가적인 설치와 설정이 필요합니다)",
     "config-memcached-servers": "Memcached 서버:",
-    "config-memcached-help": "Memcached의 사용하기 위한 IP 주소 목록입니다.\n한 줄에 하나씩 사용할 포트를 지정해야 합니다. 예를 들어 :\n 127.0.0.1:11211\n 192.168.1.25:1234",
+    "config-memcached-help": "Memcached의 사용하기 위한 IP 주소 목록입니다.\n한 줄에 하나씩 사용할 포트를 지정해야 합니다. 예를 들어:\n 127.0.0.1:11211\n 192.168.1.25:1234",
     "config-memcache-needservers": "캐시 종류로 Memcached를 선택했지만 어떠한 서버도 지정하지 않았습니다.",
     "config-memcache-badip": "Memcached에 대해 잘못된 IP 주소를 입력했습니다: $1.",
-    "config-memcache-noport": "Memcached 서버에 사용할 포트를 지정하지 않았습니다: $1.\n포트를 모를 경우 기본값은 11211입니다.",
+    "config-memcache-noport": "Memcached 서버에 사용할 포트를 지정하지 않았습니다: $1.\n포트를 모를 경우 기본 값은 11211입니다.",
     "config-memcache-badport": "Memcached 포트 번호는 $1(와)과 $2 사이여야 합니다.",
     "config-extensions": "확장 기능",
     "config-extensions-help": "위에 나열된 확장 기능이 <code>./extensions</code>에서 발견되었습니다.\n\n추가적인 설정이 필요할 수 있습니다만 지금 활성화시킬 수 있습니다.",
-    "config-install-alreadydone": "'''경고:''' 이미 미디어위키를 설치했고 다시 설치하려고 합니다.\n다음 페이지ì\97\90ì\84\9c ì§\84í\96\89í\95\98ì\84¸ì\9a\94.",
+    "config-install-alreadydone": "'''경고:''' 이미 미디어위키를 설치했고 다시 설치하려고 합니다.\n다음 페이지ë¡\9c ì§\84í\96\89í\95\98ì\84¸ì\9a\94.",
     "config-install-begin": "\"{{int:config-continue}}\"을 누르면 미디어위키의 설치를 시작합니다.\n그래도 바꾸는 것을 원한다면 \"{{int:config-back}}\"를 누르세요.",
     "config-install-step-done": "완료",
     "config-install-step-failed": "실패",
     "config-install-pg-plpgsql": "PL/pgSQL 언어에 대해 확인하는 중",
     "config-pg-no-plpgsql": "$1 데이터베이스에 PL/pgSQL 언어를 설치해야 합니다",
     "config-pg-no-create-privs": "설치를 위한 지정한 계정에 계정을 만드는 데 충분한 권한이 없습니다,",
-    "config-pg-not-in-role": "웹 사용자ì\97\90 ë\8c\80í\95´ ì§\80ì \95í\95\9c ê³\84ì \95ì\9d´ ì\9d´ë¯¸ ì¡´ì\9e¬í\95©ë\8b\88ë\8b¤.\nì\84¤ì¹\98ì\97\90 ë\8c\80í\95\9c ì§\80ì \95í\95\9c ì\82¬ì\9a©ì\9e\90ë\8a\94 ì\8a\88í\8d¼ ì\82¬ì\9a©ì\9e\90ê°\80 ì\95\84ë\8b\88ê³ , ê·¸ê²\83ì\9d\80 ì\9b¹ ì\82¬ì\9a©ì\9e\90ì\9d\98 ì\97­í\95 ì\9d\98 êµ¬ì\84±ì\9b\90ì\9d´ ì\95\84ë\8b\88ë©°, ê·¸ë\9e\98ì\84\9c ì\9b¹ ì\82¬ì\9a©ì\9e\90ê°\80 ì\86\8cì\9c í\95\9c ê°\9c체를 ë§\8cë\93¤ ì\88\98 ì\97\86ì\8aµë\8b\88ë\8b¤.\n\ní\98\84ì\9e¬ ë¯¸ë\94\94ì\96´ì\9c\84í\82¤ë\8a\94 í\85\8cì\9d´ë¸\94ì\9d\84 ì\9b¹ ì\82¬ì\9a©ì\9e\90ê°\80 ì\86\8cì\9c í\95´ì\95¼ í\95©ë\8b\88ë\8b¤. ë\8b¤ë¥¸ ì\9b¹ ê³\84ì \95 ì\9d´ë¦\84ì\9d\84 ì§\80ì \95í\95\98ê±°ë\82\98 \"ë\92¤ë¡\9c\"를 í\81´ë¦­í\95\98ê³  ì \81ì \88í\95\9c ê¶\8cí\95\9cì\9d\98 ì\84¤ì¹\98í\95  ì\82¬ì\9a©ì\9e\90를 ì§\80ì \95í\95\98ì\84¸ì\9a\94.",
+    "config-pg-not-in-role": "웹 사용자ë¡\9c ì§\80ì \95í\95\9c ê³\84ì \95ì\9d´ ì\9d´ë¯¸ ì¡´ì\9e¬í\95©ë\8b\88ë\8b¤.\nì\84¤ì¹\98를 ì\9c\84í\95´ ì§\80ì \95í\95\9c ì\82¬ì\9a©ì\9e\90ë\8a\94 ì\8a\88í\8d¼ ì\82¬ì\9a©ì\9e\90ì\99\80 ì\9b¹ ì\82¬ì\9a©ì\9e\90ì\9d\98 ì\97­í\95  êµ¬ì\84±ì\9b\90ì\9d´ ì\95\84ë\8b\88ë¯\80ë¡\9c ì\9b¹ ì\82¬ì\9a©ì\9e\90ê°\80 ì\86\8cì\9c í\95\9c ê°\9c체를 ë§\8cë\93¤ ì\88\98 ì\97\86ì\8aµë\8b\88ë\8b¤.\n\ní\98\84ì\9e¬ ë¯¸ë\94\94ì\96´ì\9c\84í\82¤ë\8a\94 í\85\8cì\9d´ë¸\94ì\9d\84 ì\9b¹ ì\82¬ì\9a©ì\9e\90ê°\80 ì\86\8cì\9c í\95´ì\95¼ í\95©ë\8b\88ë\8b¤. ë\8b¤ë¥¸ ì\9b¹ ê³\84ì \95 ì\9d´ë¦\84ì\9d\84 ì§\80ì \95í\95\98ê±°ë\82\98 \"ë\92¤ë¡\9c\"를 í\81´ë¦­í\95\98ê³  ì \81ì \88í\95\9c ê¶\8cí\95\9cì\9d\98 ì\84¤ì¹\98í\95  ì\82¬ì\9a©ì\9e\90를 ì§\80ì \95í\95\98ì\84¸ì\9a\94.",
     "config-install-user": "데이터베이스 사용자를 만드는 중",
     "config-install-user-alreadyexists": "\"$1\" 사용자가 이미 존재합니다",
-    "config-install-user-create-failed": "\"$1\" 사용자 만드는  실패: $2",
+    "config-install-user-create-failed": "\"$1\" 사용자 만드는  실패: $2",
     "config-install-user-grant-failed": "\"$1\" 사용자에 대한 권한 부여 실패: $2",
     "config-install-user-missing": "지정한 \"$1\" 사용자가 존재하지 않습니다.",
-    "config-install-user-missing-create": "ì§\80ì \95ë\90\9c \"$1\" ì\82¬ì\9a©ì\9e\90ê°\80 ì¡´ì\9e¬í\95\98ì§\80 ì\95\8aì\8aµë\8b\88ë\8b¤.\nì\9d´ë¥¼ ë§\8cë\93\9cë\8a\94 ê²\83ì\9d\84 ì\9b\90í\95\98면 아래의 \"계정 만들기\" 확인 상자를 클릭하세요.",
+    "config-install-user-missing-create": "ì§\80ì \95ë\90\9c \"$1\" ì\82¬ì\9a©ì\9e\90ê°\80 ì¡´ì\9e¬í\95\98ì§\80 ì\95\8aì\8aµë\8b\88ë\8b¤.\nì\82¬ì\9a©ì\9e\90를 ë§\8cë\93\9cë ¤면 아래의 \"계정 만들기\" 확인 상자를 클릭하세요.",
     "config-install-tables": "테이블을 만드는 중",
     "config-install-tables-exist": "'''경고''': 미디어위키 테이블이 이미 있는 것 같습니다.\n테이블 만들기를 생략합니다.",
-    "config-install-tables-failed": "'''오류''': 다음 오류와 함께 테이블 만들기에 실패했습니다: $1",
+    "config-install-tables-failed": "'''오류''': 다음 오류로 인해 테이블 만들기에 실패했습니다: $1",
     "config-install-interwiki": "기본 인터위키 테이블을 채우는 중",
     "config-install-interwiki-list": "<code>interwiki.list</code> 파일을 불러올 수 없습니다.",
-    "config-install-interwiki-exists": "'''경고''': ì\9d¸í\84°ì\9c\84í\82¤ í\85\8cì\9d´ë¸\94ì\9d´ ì\9d´ë¯¸ í\95­ëª©ì\9d\84 ê°\96ê³  ì\9e\88ë\8a\94 ê²\83 ê°\99ì\8aµë\8b\88ë\8b¤.\n기본 ëª©ë¡\9dì\9c¼ë¡\9c ë\84\98ì\96´ê°\91니다.",
+    "config-install-interwiki-exists": "'''경고''': ì\9d¸í\84°ì\9c\84í\82¤ í\85\8cì\9d´ë¸\94ì\9d´ ì\9d´ë¯¸ í\95­ëª©ì\9d\84 ê°\96ê³  ì\9e\88ë\8a\94 ê²\83 ê°\99ì\8aµë\8b\88ë\8b¤.\n기본 ëª©ë¡\9dì\9d\84 ê±´ë\84\88ë\9c\81니다.",
     "config-install-stats": "통계를 초기화하는 중",
     "config-install-keys": "보안 키를 만드는 중",
-    "config-insecure-keys": "'''경고:''' ì\84¤ì¹\98 ì¤\91ì\97\90 ì\83\9dì\84±í\95\9c {{PLURAL:$2|ë³´ì\95\88 í\82¤}} ($1)를 ì\84¤ì¹\98í\95\98ë\8a\94 ë\8f\99ì\95\88 ì\99\84ì \84í\9e\88 ì\95\88ì \84í\95\98ì§\80 {{PLURAL:$2|ì\95\8aì\8aµë\8b\88ë\8b¤}}. ì§\81ì \91 ë°\94꾸기를 고려하세요.",
+    "config-insecure-keys": "'''경고:''' ì\84¤ì¹\98 ì¤\91ì\97\90 ì\83\9dì\84±í\95\9c {{PLURAL:$2|ë³´ì\95\88 í\82¤}} ($1)ë\8a\94 ì\99\84ì \84í\9e\88 ì\95\88ì \84í\95\98ì§\80 {{PLURAL:$2|ì\95\8aì\8aµë\8b\88ë\8b¤}}. ì§\81ì \91 ë°\94꾸ë\8a\94 ê²\83ì\9d\84 고려하세요.",
     "config-install-sysop": "관리자 사용자 계정을 만드는 중",
-    "config-install-subscribe-fail": "미디어위키 발표를 구독할 수 없습니다: $1",
+    "config-install-subscribe-fail": "미디어위키 알림을 구독할 수 없습니다: $1",
     "config-install-subscribe-notpossible": "cURL이 설치되지 않았고 allow_url_fopen를 사용할 수 없습니다.",
-    "config-install-mainpage": "기본 콘텐츠로 대문을 만드는 중",
+    "config-install-mainpage": "기본 내용으로 대문을 만드는 중",
     "config-install-extension-tables": "활성화된 확장 기능을 위한 테이블을 만드는 중",
     "config-install-mainpage-failed": "대문을 삽입할 수 없습니다: $1",
     "config-install-done": "'''축하합니다!'''\n미디어위키가 성공적으로 설치되었습니다.\n\n설치 프로그램이 <code>LocalSettings.php</code> 파일을 만들었습니다.\n모든 설정이 포함되어 있습니다.\n\n파일을 다운로드하여 위키 설치의 거점에 넣어야 합니다. (index.php와 같은 디렉터리) 다운로드가 자동으로 시작됩니다.\n\n다운로드가 제공되지 않을 경우나 그것을 취소한 경우에는 아래의 링크를 클릭하여 다운로드를 다시 시작할 수 있습니다:\n\n$3\n\n'''참고:''' 이 생성한 설정 파일을 다운로드하지 않고 설치를 끝내면 이 파일은 나중에 사용할 수 없습니다.\n\n완료되었으면 '''[$2 위키에 들어갈 수 있습니다]'''.",
     "config-nofile": "\"$1\" 파일을 찾을 수 없습니다. 이미 삭제되었나요?",
     "config-extension-link": "당신의 위키가 [//www.mediawiki.org/wiki/Manual:Extensions 확장 기능]을 지원한다는 것을 알고 계십니까?\n\n전체 확장 기능의 목록을 확인하려면 [//www.mediawiki.org/wiki/Category:Extensions_by_category 분류별 확장 기능]이나 [//www.mediawiki.org/wiki/Extension_Matrix 확장 기능 표]를 찾아보실 수 있습니다.",
     "mainpagetext": "'''미디어위키가 성공적으로 설치되었습니다.'''",
-    "mainpagedocfooter": "[//meta.wikimedia.org/wiki/Help:Contents 이곳]에서 위키 소프트웨어에 대한 정보를 얻을 수 있습니다.\n\n== 시작하기 ==\n\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings 설정하기 목록]\n* [//www.mediawiki.org/wiki/Manual:FAQ 미디어위키 FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce 미디어위키 발표 메일링 리스트]\n* [//www.mediawiki.org/wiki/Localisation#Translation_resources 내 언어로 미디어위키 지역화]"
-}
\ No newline at end of file
+    "mainpagedocfooter": "[//meta.wikimedia.org/wiki/Help:Contents 이곳]에서 위키 소프트웨어에 대한 정보를 얻을 수 있습니다.\n\n== 시작하기 ==\n\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings 설정하기 목록]\n* [//www.mediawiki.org/wiki/Manual:FAQ 미디어위키 FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce 미디어위키 릴리스 메일링 리스트]\n* [//www.mediawiki.org/wiki/Localisation#Translation_resources 내 언어로 미디어위키 지역화]"
+}
index 320ae4b..dfd5ae8 100644 (file)
@@ -4,6 +4,26 @@
             "Iltever"
         ]
     },
+    "config-desc": "MediaWiki инсталлятор",
+    "config-title": "MediaWiki $1 инсталляциясы",
+    "config-information": "Информация",
+    "config-localsettings-key": "Джангыртыу ачхыч:",
+    "config-session-error": "Сессияны башланыу халат: $1",
+    "config-your-language": "Тилигиз:",
+    "config-wiki-language": "Викини тили:",
+    "config-back": "← Артха",
+    "config-continue": "Баргъаны →",
+    "config-page-language": "Тил",
+    "config-db-host-oracle": "Билгиле базаны TNS'и:",
+    "config-db-wiki-settings": "Бу Викини идентификациясы",
+    "config-db-name": "Билгиле базаны аты:",
+    "config-mysql-innodb": "InnoDB",
+    "config-mysql-myisam": "MyISAM",
+    "config-mysql-binary": "Экили",
+    "config-mysql-utf8": "UTF-8",
+    "config-ns-generic": "Проект",
+    "config-ns-other-default": "MyWiki",
+    "config-profile-private": "Джабыкъ вики",
     "mainpagetext": "'''«MediaWiki» тыйыншлы салынды.'''",
     "mainpagedocfooter": "Бу вики бла къалай ишлерге ангылатхан информацияны [//meta.wikimedia.org/wiki/Help:Contents_User's_Guide къошулуучугъа юретиуде] табаргъа боллукъду.\n\n== Файдалы ресурсла ==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings тюрлендириулени списогу (ингил.)];\n* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki-ни юсюнден кёб берилген соруула];\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki-ни джангы версиясыны чыкъгъанын билдириу письмола]."
-}
\ No newline at end of file
+}
index 7c08745..5b46637 100644 (file)
@@ -42,8 +42,8 @@
     "config-page-existingwiki": "Mer han ald e Wiki!",
     "config-help-restart": "Wells De all Ding enjejovve Sachee fottjeschmesse han, un dä janze Vörjang vun fürre aan neu aanfange?",
     "config-restart": "Joh, neu aanfange!",
-    "config-welcome": "=== Ömjevong Prööfe ===\nMer maache en Aanzal jrundlääje Prövunge, öm erus ze fenge, ov di Ömjevong heh paß, för Mediawiki opzesäze.\nWann de Hölp bem Opsäze bruchs, donn wigger ssare, wat erus kohm, wat heh shteiht.",
-    "config-copyright": "=== Urhävverrääsch un Lizänzbedengunge ===\n\n$1\n\nDat  Projramm heh es frei, mer kann et wiggerjävve un verdeijle un och verändere ungger dä Bedengunge vun de  GNU <i lang=\"en\">General Public License</i> (Alljemeine öffentlesche Lizänz) wi se vun de <i lang=\"en\">Free Software Foundation</i> (de Shteftung för frei Projramme) veröffentlesch woode es. Dobei kanns De Der de Version 2 vun dä Lizanz ußsöhke, udder jeede Version donoh, wi et Der jefällt.\n\nDat Projramm weed wigger jejovve met dä Hoffnung, dat et jät nöz, ävver '''ohne Jarrantie''', sujaa ohne de onußjeshproche Jarantie, '''verkoufbaa''' ze sin, udder '''för öhnds_ene beshtemmpte Zweck ze bruche''' ze sin.\nLiß de GNU <i lang=\"en\">General Public License</i> sellver, öm mieh ze erfahre.\n\nDo sullts en <doclink href=Copying>Kopie vun dä alljemene öffentlesche Lizänz vun dä GNU</doclink> (<i lang=\"en\">GNU General Public License</i>) zosamme met heh däm Projramm krääje han. Wann dat nit esu es, schrief aan de <i lang=\"en\">Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA</i>. udder [http://www.gnu.org/copyleft/gpl.html liß se online övver et Internet].",
+    "config-welcome": "=== Ömjevong Pröhfe ===\nMer maache en Aanzahl jrundlääje Pröhvunge, öm erus ze fenge, ov di Ömjävvong heh paß för Mediawiki opzesäze.\nWann de Hölp bem Opsäze hölls, saach wigger, wat heh erus kohm, alsu wat heh schteiht.",
+    "config-copyright": "=== Urhävverrääsch un Lizänzbedengunge ===\n\n$1\n\nDat  Projramm heh es frei, mer kann et wiggerjävve un verdeijle un och verändere onger dä Bedengunge vun de  GNU <i lang=\"en\">General Public License</i> (Alljemeine öffentlesche Lizänz) wi se vun de <i lang=\"en\">Free Software Foundation</i> (de Schteftung för frei Projramme) veröffentlesch woode es. Dobei kanns De Der de Version 2 vun dä Lizanz ußsöhke, udder jeede Version donoh, wi et Der jefällt.\n\nDat Projramm weed wigger jejovve met dä Hoffnung, dat et jät nöz, ävver <strong>der ohne Jarrantie</strong>, sujaa der ohne de onußjeshproche Jarantie, <strong>verkoufbaa</strong> ze sin, udder <strong>för öhnds_ene beshtemmpte Zweck ze bruche</strong> ze sin.\nLiß de GNU <i lang=\"en\">General Public License</i> sellver, öm mieh ze erfahre.\n\nDo sullts en <doclink href=Copying>Kopie vun dä alljemene öffentlesche Lizänz vun dä GNU</doclink> (<i lang=\"en\">GNU General Public License</i>) zosamme met heh däm Projramm krääje han. Wann dat nit esu es, schrief aan de <i lang=\"en\">Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA</i>, udder [http://www.gnu.org/copyleft/gpl.html liß se online övver et Internet].",
     "config-sidebar": "* [//www.mediawiki.org MediaWiki sing Hompäjdsch]\n* [//www.mediawiki.org/wiki/Help:Contents Handbooch för Aanwender]\n* [//www.mediawiki.org/wiki/Manual:Contents Handbooch för Administratore un Wiki_Köbesse]\n* [//www.mediawiki.org/wiki/Manual:FAQ Öff jeshtallte Froore met Antwoote]\n----\n* <doclink href=Readme>Liß Mesch! (<i lang=\"en\">Read me</i>)</doclink>\n* <doclink href=ReleaseNotes><i lang=\"en\">Release notes</i> Övver heh di Projrammversion</doclink>\n* <doclink href=Copying><i lang=\"en\">Copying</i> — Lizänzbeshtemmunge</doclink>\n* <doclink href=UpgradeDoc><i lang=\"en\">Upgrading</i> — Ob en neu Projrammversion jonn</doclink>",
     "config-env-good": "De Ömjävung es jeprööf.\nDo kanns MediaWiki opsäze.",
     "config-env-bad": "De Ömjävung es jeprööf.\nDo kanns MediaWiki nit opsäze.",
     "config-unicode-using-intl": "För et <i lang=\"en\">Unicode</i>-Nommaliseere dom_mer dä [http://pecl.php.net/intl Zohsaz <code lang=\"en\">intl</code> uss em <code lang=\"en\">PECL</code>] nämme.",
     "config-unicode-pure-php-warning": "'''Opjepaß:''' Mer kunnte dä [http://pecl.php.net/intl Zohsaz <code lang=\"en\">intl</code> uss em <code lang=\"en\">PECL</code>] för et <i lang=\"en\">Unicode</i>-Nommaliseere nit fenge. Dröm nämme mer dat eijfache, ävver ärsh lahme, <i lang=\"en\">PHP</i>-Projrammshtöck doför.\nFör jruuße Wikis met vill Metmaachere doht Üsch die Sigg övver et [//www.mediawiki.org/wiki/Unicode_normalization_considerations <i lang=\"en\">Unicode</i>-Nommaliseere] (es op Änglesch) aanloore.",
     "config-unicode-update-warning": "'''Opjepaß:''' Dat Projramm för der <i lang=\"en\">Unicode</i> zo normaliseere boud em Momang op en  ählter Version vun dä Bibliothek vum [http://site.icu-project.org/ ICU-Projäk] op.\nDoht di [//www.mediawiki.org/wiki/Unicode_normalization_considerations op der neuste Shtand bränge], wann auf dat Wiki em Äänz <i lang=\"en\">Unicode</i> bruche sull.",
-    "config-no-db": "Mer kunnte kei zopaß Daatebangk-Driiverprojamm fenge.\nMer bruche e Daatebangk-Driiverprojamm för PHP. Dat moß enjeresht wääde.\nMer künne met heh dä Daatebangke ömjonn: $1.\n\nWann De nit om eijene Rääshner bes, moß De Dinge <i lang=\"en\">provider</i> bedde, dat hä Der ene zopaß Driiver enresht.\nWann de PHP sellver övversaz häs, donn e Zohjangsprjramm för en Daatebangk enbenge, för e Beishpell met: <code  lang=\"en\">./configure --with-mysql</code> op ene <i lang=\"en\">command shell</i>.\nWann De PHP uss enem <i lang=\"en\">Debian</i> udder <i lang=\"en\">Ubuntu</i> Pakätt enjeresht häs, moß De dann och noch et <code lang=\"en\">php5-mysql</code> op Dinge Räschner bränge.",
+    "config-no-db": "Mer kunnte kei zopaß Daatebangk-Driiverprojamm fenge.\nMer bruche e Daatebangk-Driiverprojamm för PHP. Dat moß enjeresht wääde.\nMer künne met heh dä Daatebangke ömjonn: $1.\n\nWann De nit om eijene Rääshner bes, moß De Dinge <i lang=\"en\">provider</i> bedde, dat hä Der ene zopaß Driiver enresht.\nWann de PHP sellver övversaz häs, donn e Zohjangsprojramm för en Daatebangk enbenge, för e Beishpell met: <code  lang=\"en\">./configure --with-mysql</code>.\nWann De PHP uss enem <i lang=\"en\">Debian</i> udder <i lang=\"en\">Ubuntu</i> Pakätt enjeresht häs, moß De dann och noch et <code lang=\"en\">php5-mysql</code> op Dinge Räschner bränge.",
     "config-outdated-sqlite": "'''Opjepaß:''' <i lang=\"en\">SQLite</i> $1 es enschtaleert. Avver MediaWiki bruch <i lang=\"en\">SQLite</i> $2 udder hühter. <i lang=\"en\">SQLite</i> kann dröm nit enjesaz wääde.",
     "config-no-fts3": "'''Opjepaß:''' De Projramme vum <i lang=\"en\">SQLite</i> sin der ohne et [//sqlite.org/fts3.html FTS3-Modul] övversaz, dröm wääde de Funxjohne för et Söhke fähle.",
     "config-register-globals": "'''Opjepaß:''' dem PHP singe Schallder <code lang=\"en\">[http://php.net/register_globals register_globals]</code> es enjeschalldt.\n'''Donn dä ußmaache, wann De kann.'''\nMediaWiki löp och esu, dä künnt ävver Sesherheitslöcke opmaache, di mer noch nit jefonge un eruß jemaat hät.",
     "config-magic-quotes-runtime": "'''Dä!''' Dem PHP singe Schallder <code lang=\"en\">[http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-runtime magic_quotes_runtime]</code> es enjeschalldt.\nDä määt enjejovve Daate kapott, un doh draan kam_mer dann nix mieh repareere.\nDomet kam_mer MediaWiki nit ennreeshte un och nit loufe lohße.\nDat heiß, mer moß en affschallde, söns jeiht nix.",
     "config-magic-quotes-sybase": "'''Dä!''' Dem PHP singe Schallder <code lang=\"en\">[http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-sybase magic_quotes_sybase]</code> es enjeschalldt.\nDä määt enjejovve Daate kapott, un doh draan kam_mer dann nix mieh repareere.\nDomet kam_mer MediaWiki nit ennreeshte un och nit loufe lohße.\nDat heiß, mer moß en affschallde, söns jeiht nix.",
     "config-mbstring": "'''Dä!''' Dem PHP singe Schallder <code lang=\"en\">[http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload]</code> es enjeschalldt.\nDat sorresch för Fähler un kann enjejovve Daate esu kapott maach, dat doh draan nix mieh ze repareere es.\nDomet kam_mer MediaWiki nit ennreeshte un och nit loufe lohße.\nDat heiß, mer moß en affschallde, söns jeiht nix.",
-    "config-ze1": "'''Dä!''' Dem PHP singe Schallder <code lang=\"en\">[http://www.php.net/manual/en/ini.core.php zend.ze1_compatibility_mode]</code> es enjeschalldt.\nDat sorresch för schräcklejje Fähler em MediaWiki.\nDat kam_mer domet nit ennreeshte un och nit loufe lohße.\nDat heiß, mer moß en affschallde, söns jeiht nix.",
     "config-safe-mode": "'''Opjepaß:''' Dem PHP singe <code lang=\"en\">[http://www.php.net/features.safe-mode safe mode]</code> es aanjeschalldt. Dat kann Ärjer maache, besönders beim Datteie Huhlaade bei de Ongershtözung för <code lang=\"en\">math</code>-Befähle.",
     "config-xml-bad": "Dem PHP sing XML-Modul es nit ze fenge.\nMediaWiki bruch Funxjohne en däm Modul un deiht et esu nit.\nWann De <i lang=\"en\">Mandrake</i> aam loufehäs, donn dat Pakätt <code lang=\"en\">php-xml</code> enstalleere.",
-    "config-pcre": "Dem PHP sing Modul för <i lang=\"en\">PCRE</i> schingk ze fähle.\nMediaWiki deiht et nit der ohne de Funxjohne för de rejolähre Ußdrök vun dä Zoot, wi <i lang=\"en\">Perl</i> se kännt.",
+    "config-pcre-old": "<strong>Fähler:</strong> PCRE $1 udder neuer es nüüdesch.\nPHP es jäz ävver met PCRE $2 zesamme jebonge.\n[https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/PCRE Mieh dohzoh].",
     "config-pcre-no-utf8": "'''Dä:''' Et PHP-Modul <i lang=\"en\">PCRE</i> schingk ohne de <i lang=\"en\">PCRE_UTF8</i>-Aandeile övversaz ze sin.\nMediaWiki bruch dä UTF-8-Krohm ävver, öm ohne Fähler loufe ze künne.",
     "config-memory-raised": "Der jrühzte zohjelasse Shpeisherbedarf vum PHP, et <code lang=\"en\">memory_limit</code>, shtund op $1 un es op $2 erop jesaz woode.",
     "config-memory-bad": "'''Opjepaß:''' Dem PHP singe Parameeter <code lang=\"en\">memory_limit</code> es $1.\nDat es wall ze winnisch.\nEt Enreeschte kunnt doh draan kappott jon!",
     "config-ctype": "'''Fähler:''' <i lang=\"en\">PHP</i> moß met dä Ongerschtözong för der [http://www.php.net/manual/en/ctype.installation.php <code lang=\"en\">Ctype</code> Zohsaz] övversaz woode sin.",
+    "config-json": "'''Dä!:''' PHP wood der ohne <i lang=\"en\" xml:lang=\"en\">JSON</i> övversaz.\nJäz moß de äntweeder dä PHP-<i lang=\"en\" xml:lang=\"en\">JSON</i>-Zohsaz enschtallere udder der <i lang=\"en\" xml:lang=\"en\">[http://pecl.php.net/package/jsonc PECL jsonc]</i>-Zohsaz, ih dat de MedijaWikki enschtallere kanns.\n* Dä PHP-Zohsaz es em <i lang=\"en\" xml:lang=\"en\">Red Hat Enterprise Linux (CentOS)</i> 5 un 6 änthallde, moß ävver en de <code lang=\"en\" xml:lang=\"en\">/etc/php.ini</code> udder <code lang=\"en\" xml:lang=\"en\">/etc/php.d/json.ini</code> enjeschalldt wääde.\n* E paa Linux Destrebuzjohne lohß zigg_em Mai 2013 dä PHP-Zohsaz fott un packe doför der PECL-Zohsaz als <code lang=\"en\" xml:lang=\"en\">php5-json</code> udder <code lang=\"en\" xml:lang=\"en\">php-pecl-jsonc</code> med ein.",
     "config-xcache": "Dä <code lang=\"en\">[http://xcache.lighttpd.net/ XCache]</code> es ennjeresht.",
     "config-apc": "Dä <code lang=\"en\">[http://www.php.net/apc APC]</code> es ennjeresht.",
     "config-wincache": "Dä <code lang=\"en\">[http://www.iis.net/download/WinCacheForPhp WinCache]</code> es ennjeresht.",
     "config-gd": "Mer han de ennjeboute GD-Jrafik-Projramm-Biblijotheek jefonge.\nEt Ömrääschne en Minni-Beldsche weed müjjelesch sin, wann De et Belder Huhlaade zohlöhß.",
     "config-no-scaling": "Mer han weeder de GD-Jrafik-Projramm-Biblijotheek, noch <i lang=\"en\">ImageMagick</i> jefonge.\nEt Ömrääschne en Minni-Beldsche weed ußjeschalldt.",
     "config-no-uri": "'''Fähler:''' Mer kunnte der aktoälle <i lang=\"en\">URI</i> nit erusfenge.\nEt Enreeschte es domet heh aam Engk.",
-    "config-no-cli-uri": "'''Opjepaß''': <code lang=\"en\">--scriptpath</code> es nit aanjejovve, mer nämme der Schtandatt: <code>$1</code>.",
+    "config-no-cli-uri": "'''Opjepaß''': <code lang=\"en\"><code>--scriptpath</code></code> es nit aanjejovve, mer nämme der Schtandatt: <code>$1</code>.",
     "config-using-server": "Mer nämmen dem ẞööver singe Name: „<nowiki>$1</nowiki>“.",
     "config-using-uri": "Mer nämmen dem ẞööver singe <i lang=\"en\">URL</i>: „<nowiki>$1$2</nowiki>“.",
     "config-uploads-not-safe": "'''Opjepaß:''' Uß däm jewöhnlijje Verzeichnes för de huhjelaade Datteie, dat es <code>$1</code>, künnte öhnzwällsche Skrepte un Projramme ußjeföhrt wääde. Och wann MediaWiki de huhjelaade Datteie prööf, dat kein bekannte Risike dren sin, sullt mer doch dat [//www.mediawiki.org/wiki/Manual:Security#Upload_security Sesherheitsloch] zoh maache, ih dat mer et Dattei Huhlaade zohlöht.",
     "config-no-cli-uploads-check": "'''Opjepaß''': <code>$1</code> es dat Schtandatt-Verzeijschneß för et Datteije-Huhlaade. Beim Opsäze met <abbr lang=\"en\" title=\"Call Level Interface\">CLI</abbr> donn mer ävver nit övverpröhve, dat dat jeschöz es dojääje, dat Skrepte vun doh loufe künne, di mer nit loufe han well.",
-    "config-brokenlibxml": "Op Dingem Rääschner loufe Versione vun PHP un <code lang=\"en\">libxml2</code> zosamme, di ävver nit zosamme paßße, un de Daate em MediaWiki un ander Web_Aanwändunge [//bugs.php.net/bug.php?id=45996 bug kapott maache].\nJangk op PHP 5.2.9 udder dohnoh un op <code lang=\"en\">libxml2</code> 2.7.3 udder dohnoh.\nHeh jeihd et nit wigger.",
-    "config-using531": "MediaWiki läuf nit met PHP $1 zosamme wääje enem [//bugs.php.net/bug.php?id=50394 Fähler em Zosammehang met Parrameetere för <code lang=\"en\">__call()</code>].\nJangk op de Version 5.3.2 vum <i lang=\"en\">PHP</i> ov dohnoh, udder op de Version 5.3.0 udder dovöör, öm dat Problem ze ömjonn.\nHeh jeiht et nit wigger.",
+    "config-brokenlibxml": "Op Dingem Rääschner loufe Versione vun PHP un <code lang=\"en\">libxml2</code> zosamme, di ävver nit zosamme paßße, un onbimärk de Daate em MediaWiki un ander Web_Aanwändunge [//bugs.php.net/bug.php?id=45996 bug kapott maache].\nJangk op <code lang=\"en\">libxml2</code> 2.7.3 udder dohnoh.\nHeh jeihd et nit wigger.",
     "config-suhosin-max-value-length": "<i lang=\"en\">Suhosin</i> es enschtalleet. Dröm kann ene <code lang=\"en\">GET</code>-Parrameeter nit övver {{PLURAL:$1|ei Byte|$1 Bytes|noll Byte}} lang wääde. Dem MediaWiki singe <i lang=\"en\">ResourceLoader</i> kütt doh zwa drömeröm, ävver dat bräms. Wann müjelesch, doht <code lang=\"en\">suhosin.get.max_value_length</code> en dä Dattei <code lang=\"en\">php.ini</code> op 1024 Bytes udder drövver enschtälle, un dann moß <code lang=\"en\">$wgResourceLoaderMaxQueryLength</code> en dä Dattei <code lang=\"en\">LocalSettings.php</code> op däsälve Wäät jesaz wääde.",
     "config-db-type": "De Zoot Daatebangk:",
     "config-db-host": "Dä Name vun däm Rääschner met dä Daatebangk:",
     "config-db-wiki-help": "Jiv ene Name un e Paßwoot aan, för dä Aanwender för dä Zohjref op de Daatebangk, wann et wiki nommaal aam Loufe es.\nWan et dä Name en der Daatebangk noch it jit, un dä Aanwender för dä Zohjref op de Daatebangk beim Enshtalleere\njenooch Beräschtijunge hät, läät dä heh dä Aanwender en der Daatebangk aan un jidd_em di Rääschde, di dä nüüdesch hät, ävver nit mieh.",
     "config-db-prefix": "Vörsaz för de Name vun de Tabälle en de Daatebangk:",
     "config-db-prefix-help": "Wann ein Daatebangk för mieh wi ein Wiki udder e Wiki uns söns jät zosamme jebruch weed, dann kam_mer noch jet vör de Tabälle ier Name säze. Esu ene Vörsaz sull dubblte Tabällename vermeide hälfe.\nDonn kein Zwescheräum enjävve!\n\nJewöhnlesch bliev dat Feld heh ävver läddesch.",
-    "config-db-charset": "Dä Daatebangk iere Zeishesaz",
+    "config-db-charset": "Dä Daatebangk iere Zeischesaz",
     "config-charset-mysql5-binary": "MySQL (4.1 udder 5.0) binär",
     "config-charset-mysql5": "MySQL (4.1 udder 5.0) UTF-8",
     "config-charset-mysql4": "MySQL 4.0 röckwääts kompatibel UTF-8",
-    "config-charset-help": "''' Opjepaß:'''\nWann De et '''röckwääts kompatibel UTF-8 Fommaat''' nemmps, met dem <i lang=\"en\">MySQL</i> singe Version4.1 udder hüüter, dann künnt dat all di Zeishe kappott maache, die nit em <i lang=\"en\" title=\"American Standard Code for Information Interchange\">ASCII</i> sen, un domet all ding Sesherungskopieje kapott maache, wat mer nieh mieh retuur krijje kann.\n\nBeim Shpeishere em '''binäre Fomaat''' deiht MediaWiki de Täxte, di em UTF-8 Fommaat kumme, en dä Daatebangk en binär kodeerte Daatefälder faßhallde.\nDat es flöcker un spaasaamer wi et UTF-8 Fommaat vum <i lang=\"en\">MySQL</i> un määd et müjjelesch, all un jeedes <i lang=\"en\">Unicode</i>-Zeishe met faßzehallde.\n\nBeim Shpeishere em '''UTF-8 Fomaat''' deiht et <i lang=\"en\">MySQL</i> der Zeishesaz un de Kodeerung vun dä Daate känne, un kann se akeraat aanzeije un ömwandelle,\nallerdengs künne kein Zeishe ußerhalv vum [//de.wikipedia.org/wiki/Basic_Multilingual_Plane#Gliederung_in_Ebenen_und_Bl.C3.B6cke jrundlääje Knubbel för vill Shprooche (<i lang=\"en\">Basic Multilingual Plane — BMP</i>)] afjeshpeishert wääde.",
+    "config-charset-help": "<strong>Opjepaß:</strong>\nWann De et <strong>röckwääts kompatibel UTF-8 Fommaat</strong> nemmps, met dem <i lang=\"en\">MySQL</i> singe Version4.1 udder hüüter, dann künnt dat all di Zeische kappott maache, die nit em <i lang=\"en\" title=\"American Standard Code for Information Interchange\">ASCII</i> sen, un domet all ding Sescherungskopieje kapott maache, wat mer nieh mieh retuur krijje kann.\n\nBeim Schpeischere em <strong>binäre Fomaat</strong> deiht MediaWiki de Täx, dä em UTF-8 Fommaat küdd, en dä Daatebangk en binär kodeerte Daatefälder faßhallde.\nDat es flöcker un spaasaamer wi et UTF-8 Fommaat vum <i lang=\"en\">MySQL</i> un määd et müjjelesch, all un jeedes <i lang=\"en\">Unicode</i>-Zeische met faßzehallde.\n\nBeim Schpeischere em <strong>UTF-8 Fomaat</strong> deiht et <i lang=\"en\">MySQL</i> der Zeischesaz un de Kodeerung vun dä Daate känne, un kann se akeraat aanzeije un ömwandelle,\nallerdengs künne kein Zeische ußerhalv vum [//de.wikipedia.org/wiki/Basic_Multilingual_Plane#Gliederung_in_Ebenen_und_Bl.C3.B6cke jrundlääje Knubbel för vill Schprooche (<i lang=\"en\">Basic Multilingual Plane — BMP</i>)] afjeschpeischert wääde.",
     "config-mysql-old": "Mer bruche <i lang=\"en\">MySQL</i> $1 udder neuer. Em Momang es <i lang=\"en\">MySQL</i> $2 aam Loufe.",
     "config-db-port": "De Pooz-Nommer (<i lang=\"en\">port</i>) för de Daatebangk:",
     "config-db-schema": "Et Schema en de Datebangk för MediaWiki:",
     "config-sqlite-dir-help": "<i lang=\"en\">SQLite</i> hät all sing Daate zosamme en en einzel Dattei.\n\nEn dat Verzeishneß, wat De aanjiß, moß dat Web_ẞööver_Projramm beim Opsäze eren schriive dörrve.\n\nDat Verzeishneß sullt '''nit''' övver et Web zohjänglesch sin, dröm dom_mer et nit dohen, woh de <i lang=\"en\">PHP</i>-Datteije sin.\n\nMer donn beim Opsäze zwa uß Vöörssh en <code lang=\"en\">.htaccess</code> Dattei dobei, ävver wann di nit werrek, künnte Lück vun ußerhallef aan Ding Daatebangk_Dattei eraan kumme.\nDoh shtonn Saache dren, wi de Addräße för de Metmaacher ier <i lang=\"en\">e-mail</i> un de verschlößelte Paßwööter un de vershtoche un de fottjeschmeße Sigge un ander Saache ussem Wiki, di mer nit öffentlesch maache darref.\n\nDonn Ding Daatebangk et beß janz woh anders hen, noh <code lang=\"en\">/var/lib/mediawiki/''wikiname''</code> för e Beishpell.",
     "config-oracle-def-ts": "Tabälleroum för der Shtandattjebruch:",
     "config-oracle-temp-ts": "Tabälleroum för der Jebruch zweschedorsh:",
-    "config-type-mysql": "<i lang=\"en\">MySQL</i>",
+    "config-type-mysql": "<i lang=\"en\">MySQL</i> (udder en jlischwääteje)",
     "config-type-postgres": "<i lang=\"en\">PostgreSQL</i>",
     "config-type-sqlite": "<i lang=\"en\">SQLite</i>",
     "config-type-oracle": "<i lang=\"en\">Oracle</i>",
+    "config-type-mssql": "Dä <i lang=\"en\" xml:lang=\"en\">SQL</i>-ẞööver vun <i lang=\"en\" xml:lang=\"en\">Microsoft</i>",
     "config-support-info": "MediaWiki kann met heh dä Daatebangk_Süßteeme zosamme jonn:\n\n$1\n\nWann dat Daatebangk_Süßteem, wat De nämme wells, onge nit dobei es, dann donn desch aan di Aanleidonge hallde, di bovve verlengk sen, öm et op Dingem ẞööver singem Süßteem müjjelesh ze maache, se aan et Loufe ze krijje.",
-    "config-support-mysql": "* <i lang=\"en\">$1</i> es dat vum MediaWiki et eets ongershtöz Daatebangksüßteem ([http://www.php.net/manual/de/mysql.installation.php Aanleidung för et Övversäze un Enreeschte von PHP met <i lang=\"en\">MySQL</i> dobei, op Deutsch])",
-    "config-support-postgres": "* <i lang=\"en\">$1</i> es e bikannt Daatebangksüßteem met offe Quälltäxde, un en och en Wahl nävve <i lang=\"en\">MySQL</i> ([http://www.php.net/manual/de/pgsql.installation.php Aanleidung för et Övversäze un Enreeschte von PHP met <i lang=\"en\">PostgreSQL</i> dobei, op Deutsch]) Et sinn_er ävver paa klein Fählershe bekannt, um kunne dat em Momang för et reschtijje Werke nit emfähle.",
-    "config-support-sqlite": "* <i lang=\"en\">$1</i> es e eijfach Daatebangksüßteem, wat joot ongershtöz weed. ([http://www.php.net/manual/de/pdo.installation.php Aanleidong för et Övversäze un Enreeschte von PHP met <i lang=\"en\">SQLite</i> dobei, op Deutsch])",
-    "config-support-oracle": "* <i lang=\"en\">$1</i> es e jeschäfflesch Daatebangksüßteem för Ferme. ([http://www.php.net/manual/de/oci8.installation.php Aanleidong för et Övversäze un Enreeschte von PHP met <i lang=\"en\">OCI8</i> dobei, op Deutsch])",
+    "config-dbsupport-mysql": "* <i lang=\"en\" xml:lang=\"en\">[{{int:version-db-mysql-url}} MySQL]</i> es dat vum MediaWiki et eets un et bäß ongerschtöz Daatebangksüßtehm. Et leuf ävver och met <i lang=\"en\" xml:lang=\"en\">[{{int:version-db-mariadb-url}} MariaDB]</i> un <i lang=\"en\" xml:lang=\"en\">[{{int:version-db-percona-url}} Percona Server]</i>. Di sin kumpatihbel mem <i lang=\"en\" xml:lang=\"en\">MySQL</i>. ([http://www.php.net/manual/de/mysql.installation.php Aanleidung för et Övversäze un Enreeschte von PHP met <i lang=\"en\">MySQL</i> dobei, op Deutsch])",
+    "config-dbsupport-postgres": "* <i lang=\"en\">[{{int:version-db-postgres-url}} PostgreSQL]</i> es e bikannt Daatebangksüßtehm met offe Quälltäxde, un ed es och en Wahl nävve <i lang=\"en\">MySQL</i>. Et sinn_er ävver paa klein Fählersche bekannt, um mer künne et em Momang för et reschtijje Werke nit ämfähle. ([http://www.php.net/manual/de/pgsql.installation.php Aanleidung för et Övversäze un Enreeschte von PHP met <i lang=\"en\">PostgreSQL</i> dobei, op Deutsch])",
+    "config-dbsupport-sqlite": "* <i lang=\"en\">[{{int:version-db-sqlite-url}} SQLite]</i> es e eijfach Daatebangksüßtehm, wat joot en Schoß jehallde weed. ([http://www.php.net/manual/de/pdo.installation.php Aanleidong för et Övversäze un Enreeschte von PHP met <i lang=\"en\">SQLite</i> dobei, op Deutsch])",
+    "config-dbsupport-oracle": "* <i lang=\"en\">[{{int:version-db-oracle-url}} Oracle]</i> es e jeschäfflesch Daatebangksüßtehm för Ferme. ([http://www.php.net/manual/de/oci8.installation.php Aanleidong för et Övversäze un Enreeschte von PHP met <i lang=\"en\" xml:lang=\"en\">OCI8</i> dobei, op Deutsch])",
+    "config-dbsupport-mssql": "* Dä <i lang=\"en\" xml:lang=\"en\">[{{int:version-db-mssql-url}} Microsoft SQL Server]</i> es e jeschäfflesch Daatebangksüßtehm för Rääschner met <i lang=\"en\" xml:lang=\"en\">Windows</i>. ([http://www.php.net/manual/de/sqlsrv.installation.php Aanleidong för et Övversäze un Enreeschte von PHP met <i lang=\"en\" xml:lang=\"en\">SQLSRV </i> dobei, op Deutsch])",
     "config-header-mysql": "De Enshtällunge för de <i lang=\"en\">MySQL</i> Daatebangk",
     "config-header-postgres": "De Enshtällunge för de <i lang=\"en\">PostgreSQL</i> Daatebangk",
     "config-header-sqlite": "De Enshtällunge för de <i lang=\"en\">SQLite</i> Daatebangk",
     "config-header-oracle": "De Enshtällunge för de <i lang=\"en\">Oracle</i> Daatebangk",
+    "config-header-mssql": "Enschtällonge för der <i lang=\"en\" xml:lang=\"en\">SQL</i>-ẞööver vun <i lang=\"en\" xml:lang=\"en\">Microsoft</i>",
     "config-invalid-db-type": "Dat es en onjöltijje Zoot Daatebangk.",
     "config-missing-db-name": "Do moß jät enjävve för dä Name vun dä Daatebangk.",
     "config-missing-db-host": "Do moß jät enjävve för dä Name vun däm Rääschner met dä Daatebangk.",
     "config-missing-db-server-oracle": "Do moß jät enjävve för dä Daatebangk ier <i lang=\"en\" title=\"Transparent Network Substrate\">TNS</i>.",
-    "config-invalid-db-server-oracle": "Dä Daatebangk ier <i lang=\"en\" title=\"Transparent Network Substrate\">TNS</i> kann nit „$1“ sin, dat es esu nit jöltesch.\nDöh dörve bloß <i lang=\"en\" title=\"American Standard Code for Information Interchange\">ASCII</i> Boochshtaabe (a-z, A-Z), Zahle (0-9), Ongerstreshe (_), un Punkte (.) dren vörkumme.",
+    "config-invalid-db-server-oracle": "Dä Daatebangk ier <i lang=\"en\" title=\"Transparent Network Substrate\">TNS</i> kann nit „$1“ sin, dat es esu nit jöltesch.\nNemm en „TNS-Nahme“ udder ene „<i lang=\"en\" xml:lang=\"en\">Easy-Connect</i>“-<i lang=\"en\" xml:lang=\"en\">Easy-Connect</i>String</i>(Lor noh dädohwähje noh de <i lang=\"en\" xml:lang=\"en\">[http://docs.oracle.com/cd/E11882_01/network.112/e10836/naming.htm Oracle Naming Methods]</i>)",
     "config-invalid-db-name": "Dä Daatebangk iere Name kann nit „$1“ sin, dä es esu nit jöltesch.\nDöh dörve bloß <i lang=\"en\" title=\"American Standard Code for Information Interchange\">ASCII</i> Boochshtaabe (a-z, A-Z), Zahle (0-9), Ongerstresh (_), un Bendeshtresh (-) dren vörkumme.",
     "config-invalid-db-prefix": "Dä Vörsaz för de Name vun de Tabälle en de Daatebangk kann nit „$1“ sin, dä es esu nit jöltesch.\nDöh dörve bloß <i lang=\"en\" title=\"American Standard Code for Information Interchange\">ASCII</i> Boochshtaabe (a-z, A-Z), Zahle (0-9), Ongerstreshe (_), un Bendeshtreshe (-) dren vörkumme.",
     "config-connection-error": "$1.\n\nDonn de Name för dä Rääschner, vun däm Aanwender för dä Zohjref op de Daatebangk, un et Paßwoot prööfe, repareere, un dann versöhg et norr_ens.",
     "config-db-sys-create-oracle": "Dat Projramm för MediaWiki opzesäze kann bloß <i lang=\"en\">SYSDBA</i> bruche för ene neue Zohjang zor Daatebangk enzereeschte!",
     "config-db-sys-user-exists-oracle": "Dä Aanwender „$1“ för dä Zohjref op de Daatebangk jidd_et ald. <i lang=\"en\">SYSDBA</i> kam_mer bloß bruche, för ene neue Zohjang enzereeschte!",
     "config-postgres-old": "Mer bruche <i lang=\"en\">PostgreSQL</i> $1 udder neuer. Em Momang es <i lang=\"en\">PostgreSQL</i> $2 aam Loufe.",
+    "config-mssql-old": "Dä <i lang=\"en\" xml:lang=\"en\">SQL</i>-ẞööver vun <i lang=\"en\" xml:lang=\"en\">Microsoft</i>   aff de Väsjohn $1 es nüüdesch. Heh es bloß d Väsjohn $2 ze fenge.",
     "config-sqlite-name-help": "Söhk enen Name uß, dä Ding Wiki beschrief.\nDonn kein Bendeschresch un Zweschräum en däm Name bruche.\nDä Name weed för der Dateiname för de <i lang=\"en\">SQLite</i> Daatebangk jenumme.",
     "config-sqlite-parent-unwritable-group": "Mer kunnte dat Verzeischneß för de Daate, <code lang=\"en\"><nowiki>$1</nowiki></code>, nit enreeschte, weil dat Projramm fö dä Web_ẞööver en dat Verzeischneß doh drövver, <code><nowiki>$2</nowiki></code>, nix erin donn darref.\n\nMer han dä Name vun däm Zohjang op et Süßteem eruß jefonge, onger dämm dat Web_ẞööver_Projramm läuf. Jez moß De bloß doför sorrje, dat dä en dat Verzeischneß  <code><nowiki>$3</nowiki></code> schrieve kann, öm heh wigger maache ze künne.\nOb enem Süßteem met <i lang=\"en\">Unix</i>- oder <i lang=\"en\">Linux</i> jeiht dat esu:\n<pre>cd $2\nmkdir $3\nchgrp $4 $3\nchmod g+w $3</pre>",
     "config-sqlite-parent-unwritable-nogroup": "Mer kunnte dat Verzeischneß för de Daate, <code lang=\"en\"><nowiki>$1</nowiki></code>, nit enreeschte, weil dat Projramm fö dä Web_ẞööver en dat Verzeischneß doh drövver, <code><nowiki>$2</nowiki></code>, nix erin donn darref.\n\nMer han dä Name vun däm Zohjang op et Süßteem nit eruß fenge künne, onger dämm dat Web_ẞööver_Projramm läuf. Jez moß De bloß doför sorrje, dat dä en dat Verzeischneß  <code><nowiki>$3</nowiki></code> schrieve kann, öm heh wigger maache ze künne. Wann De dä Name och nit weiß, maach, dat jeeder_ein doh schrieve kann.\nOb enem Süßteem met <i lang=\"en\">Unix</i>- oder <i lang=\"en\">Linux</i> jeiht dat esu:\n<pre>cd $2\nmkdir $3\nchmod a+w $3</pre>",
     "config-sqlite-cant-create-db": "Mer kunnte di Dattei <code lang=\"en\">$1</code> för de Daatebangk nit aanlääje.",
     "config-sqlite-fts3-downgrade": "Dat PHP heh hät kein Ongershtözong för FTS3, dröm donn mer de Daatebangktabälle eronger shtoofe.",
     "config-can-upgrade": "Et sinn-er ald Daatebangktabelle vum MediaWiki en dä Daatebangk.\nÖm di op der Shtand vum MediaWiki $1 ze bränge, donn jäz op „{{int:config-continue}}“ klecke.",
-    "config-upgrade-done": "Alles es jäz om neue Shtand.\n\nMer kann dat Wiki jäz [$1 bruche].\n\nWann De Ding Dattei <code lang=\"en\">LocalSettings.php</code> neu schrieve wells, donn onge op dä Knopp klicke.\nDat dom_mer ävver '''nit vörschlonn'''em Jääjedeil, ußer, wann et Probleme mem Wiki jitt.",
+    "config-upgrade-done": "Alles es jäz om neue Schtand.\n\nMer kann dat Wiki jäz [$1 bruche].\n\nWann De Ding Dattei <code lang=\"en\">LocalSettings.php</code> neu schrieve wells, donn onge op dä Knopp kleke.\nDat dom_mer ävver '''nit vörschlonn''' — em Jääjedeil — ußer, wann et Problehme mem Wiki jitt.",
     "config-upgrade-done-no-regenerate": "Alles es jäz om neue Shtand.\n\nMer kann dat Wiki jäz [$1 bruche].",
     "config-regenerate": "Donn de Dattei <code lang=\"en\">LocalSettings.php</code> neu opsäze →",
     "config-show-table-status": "Et Kommando <code lang=\"en\"><code>SHOW TABLE STATUS</code></code> aan de Daatebangk es donävve jejange!",
     "config-mysql-innodb": "InnoDB",
     "config-mysql-myisam": "MyISAM",
     "config-mysql-myisam-dep": "'''Opjepaß:''' <i lang=\"en\">MyISAM</i> es als Speicher för <i lang=\"en\">MySQL</i> nit besönders joot för et Zosammeschpell met MediaWiki zo bruche:\n* Dorj_et kumplätte Sperre vun Tabälle, künne koum ens Saache parrallel en dä Daatebangk jedonn wääde.\n* Dat Fomaat es anfällesch för Probleme met de Daate.\n* Et weed vun MediaWiki nit ėmmer zopaß ongerschtöz.\n\nWann Ding <i lang=\"en\">MySQL</i> et Schpeischere en <i lang=\"en\">InnoDB</i>-Datteije ongerschtöze deiht, dom_mer dat nohdröcklesch ämfähle.\nKann dä ẞööver dat nit, künnd et joode jelääjeheit sin, dä ens op der neuste Schtand ze bränge.",
-    "config-mysql-only-myisam-dep": "'''Opjepaß:''' <i lang=\"en\">MyISAM</i> es de einzeje Zoot Speischerprojramm för <i lang=\"en\">MySQL</i>, di nit för MediaWiki ze ämfähle es, weil:\n* wääje dem Schpärre vun jannze Tabälle sin koum paralleele Axjuhne en dä Daatebangk möjjelesch,\n* et es aanfällesch för Probleeme met de Daate es, un\n* et weed vun MediaWiki nit emmer jood ongerschtöz.\n\nDing Enschtallazjuhn vum <i lang=\"en\">MySQL</i> kann nit met <i lang=\"en\">InnoDB</i> ömjonn.\nWi wöhr et met ener neuere väsjohn vum <i lang=\"en\">MySQL</i>?",
+    "config-mysql-only-myisam-dep": "'''Opjepaß:''' <i lang=\"en\" xml:lang=\"en\">MyISAM</i> es de einzeje Zoot Schpeischerprojramm för <i lang=\"en\" xml:lang=\"en\">MySQL</i> op dä Maschiin. Di es nit för MediaWiki ze ämfähle es, weil:\n* wääje dem Schpärre vun jannze Tabälle sin koum paralleele Axjuhne en dä Daatebangk möjjelesch,\n* ed es aanfällesch för Probleeme met de Daate es, un\n* et weed vun MediaWiki nit emmer jood ongerschtöz.\n\nDing Enschtallazjuhn vum <i lang=\"en\" xml:lang=\"en\">MySQL</i> kann nit met <i lang=\"en\" xml:lang=\"en\">InnoDB</i> ömjonn.\nWi wöhr et med ene neuere Väsjohn vum <i lang=\"en\" xml:lang=\"en\">MySQL</i>?",
     "config-mysql-engine-help": "'''InnoDB''' es fö jewöhnlesch et beß, weil vill Zohjreffe op eijmohl joot ongershtöz wääde.\n\n'''MyISAM''' es flöcker op Rääschnere met bloß einem Minsch draan, un bei Wikis, di mer bloß lässe un nit schrieeve kann.\nMyISAM-Daatebangke han em Schnett mieh Fähler un jon flöcker kappott, wi InnoDB-Daatebangke.",
-    "config-mysql-charset": "Dä Daatebangk iere Zeishesaz:",
+    "config-mysql-charset": "Dä Daatebangk iere Zeischesaz:",
     "config-mysql-binary": "binär",
     "config-mysql-utf8": "UTF-8",
-    "config-mysql-charset-help": "Beim Shpeishere em '''binäre Fomaat''' deiht MediaWiki de Täxte, di em UTF-8 Fommaat kumme, en dä Daatebangk en binär kodeerte Daatefälder faßhallde.\nDat es flöcker un spaasaamer wi et UTF-8 Fommaat vum <i lang=\"en\">MySQL</i> un määd et müjjelesch, all un jeedes <i lang=\"en\">Unicode</i>-Zeishe met faßzehallde.\n\nBeim Shpeishere em '''UTF-8 Fomaat''' deiht et <i lang=\"en\">MySQL</i> der Zeishesaz un de Kodeerung vun dä Daate känne, un kann se akeraat aanzeije un ömwandelle,\nallerdengs künne kein Zeishe ußerhalv vum [//de.wikipedia.org/wiki/Basic_Multilingual_Plane#Gliederung_in_Ebenen_und_Bl.C3.B6cke jrundlääje Knubbel för vill Shprooche (<i lang=\"en\">Basic Multilingual Plane — BMP</i>)] afjeshpeishert wääde.",
+    "config-mysql-charset-help": "Beim Schpeishere em <strong>binäre Fomaat</strong> deiht MediaWiki Täxt, dä em UTF-8 Fommaat kütt, en dä Daatebangk en binär kodeerte Daatefälder faßhallde.\nDat es flöcker un spaasaamer wi et UTF-8 Fommaat vum <i lang=\"en\">MySQL</i> un määd et müjjelesch, all un jeedes <i lang=\"en\">Unicode</i>-Zeische met faßzehallde.\n\nBeim Schpeishere em <strong>UTF-8 Fomaat<strong> deiht et <i lang=\"en\">MySQL</i> der Zeischesaz un de Kodeerung vun dä Daate känne, un kann se akeraat aanzeije un ömwandelle,\nallerdengs künne kein Zeische ußerhalv vum [//de.wikipedia.org/wiki/Basic_Multilingual_Plane#Gliederung_in_Ebenen_und_Bl.C3.B6cke jrundlääje Knubbel för vill Schprooche (<i lang=\"en\">Basic Multilingual Plane — BMP</i>)] afjeschpeischert wääde.",
+    "config-mssql-auth": "De Zoot Aanmäldong:",
+    "config-mssql-install-auth": "Söhk us, wi dat Aanmälde aan dä Daatebangk vor sesch jonn sull för de Enschtallazjuhn.\nWann De <em>{{int:Config-mssql-windowsauth}}</em> nemms, weed jenumme, met wat emmer dä Wäbßööver aam loufe es.",
+    "config-mssql-web-auth": "Söhk us, wi dat Aanmälde aan dä Daatebangk vor sesch jonn sull för de nommaale Ärbeid vum Wiki.\nWann De <em>{{int:Config-mssql-windowsauth}}</em> nemms, weed jenumme, met wat emmer dä Wäbßööver aam loufe es.",
+    "config-mssql-sqlauth": "De Aanmäldong bemm <i lang=\"en\" xml:lang=\"en\">SQL</i>-ẞööver vun <i lang=\"en\" xml:lang=\"en\">Microsoft</i>",
+    "config-mssql-windowsauth": "De Annmäldong bemm <i lang=\"en\" xml:lang=\"en\">Windows</i>",
     "config-site-name": "Däm Wiki singe Name:",
-    "config-site-name-help": "Dä douch em Tittel vun de Brauserfinstere un aan ätlije andere Shtälle op.",
+    "config-site-name-help": "Dä douch em Tettel vun de Brauserfinstere un aan ätlije andere Schtälle op.",
     "config-site-name-blank": "Donn ene Name för di Sait aanjävve.",
     "config-project-namespace": "Dä Name för et Appachtemang övver et Projäk:",
     "config-ns-generic": "Projäk",
     "config-ns-invalid": "Dat aanjejovve Appachtemang „<nowiki>$1</nowiki>“ es nit jöltesch.\nNemm ene andere Name för däm Wiki sing eije Appachtemang.",
     "config-ns-conflict": "Dat aanjejovve Appachtemang „<nowiki>$1</nowiki>“ kütt ald als Standatt-Appachtemang em MediaWiki vör.\nNemm ene andere Name för däm Wiki sing eije Appachtemang.",
     "config-admin-box": "Der Zohjang för der eezte Wiki_Köbes",
-    "config-admin-name": "Metmaacher_Name:",
+    "config-admin-name": "Dinge Metmaacher_Name:",
     "config-admin-password": "Et Paßwoot:",
     "config-admin-password-confirm": "Norrens dat Paßwoot:",
     "config-admin-help": "Jif Dinge leevste Name als Metmaacher för Desch aan, för e Beishpell „Schmitzens Pitter“\n— Dat weed dä Name wääde, met dämm De Desch enlogge deihs.",
     "config-admin-name-blank": "Jiv ene Metmaacher_Name en för dä Wiki-Köbes.",
     "config-admin-name-invalid": "„<nowiki>$1</nowiki>“ es keine jöltijje Metmaacher_Name.\nJiv ene joode Name en!",
     "config-admin-password-blank": "Do mos_e Paßwoot för dä Wiki_Köbes aanjävve!",
-    "config-admin-password-same": "Dat Paßwoot un dä Name dörve nit ejaal sin!",
     "config-admin-password-mismatch": "Di Paßwööter sin ongerscheidlesh!",
     "config-admin-email": "Addräß för de <i lang=\"en\">e-mail</i>:",
     "config-admin-email-help": "Jiv heh di Adräß för de <i lang=\"en\">e-mail</i> aan, woh De <i lang=\"en\">e-mail</i> vun ander Metmaacher uss_em Wiki hen krijje wells, di et Der müjjelesh määt, Ding Paßwoot automatetsch truusche ze lohße, un woh Nohreeshte övver veränderte Sigge op Dinge Oppaßleß hen jescheck wääde sulle.\nDe kanns dat Fäld ävver och läddesch lohße.",
     "config-help": "Hölp",
     "config-nofile": "De Dattei „$1“ ham_mer nit jefonge. Es di fottjeschmeße?",
     "config-extension-link": "Häs De jewoß, dat et Wiki [//www.mediawiki.org/wiki/Manual:Extensions Zohsazprojramme] hann kann?\n\nDo kanns [//www.mediawiki.org/wiki/Category:Extensions_by_category Zohsazprojramme noh Saachjroppe] söhke udder en de [//www.mediawiki.org/wiki/Extension_Matrix Tabäll met de Zohsazprojramme] kike, öm de kumplätte Leß met de Zohsazprojramme ze krijje.",
-    "mainpagetext": "'''MediaWiki es jetz enstalleet.'''",
-    "mainpagedocfooter": "Luur en et (änglesche) [//meta.wikimedia.org/wiki/Help:Contents Handbooch] wann De wesse wells wie de Wiki-Soffwär jebruch un bedeent wääde moß.\n\n== För dä Aanfang ==\nDat es och all op Änglesch:\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Configuration settings list]\n* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]\n* [//www.mediawiki.org/wiki/Localisation#Translation_resources Donn MediaWiki op Ding Schprooch aanpaße]"
-}
\ No newline at end of file
+    "mainpagetext": "'''MediaWiki es jäz enschtalleht.'''",
+    "mainpagedocfooter": "Luur en et (änglesche) [//meta.wikimedia.org/wiki/Help:Contents Handbooch] wann De wesse wells wie de Wiki-Soffwär jebruch un bedeent wääde moß.\n\nLuur en et (änglesche) [//meta.wikimedia.org/wiki/Help:Contents Handbooch] wann De weße wells wi de Wiki-Soffwähr jebruch un bedehnt wääde moß.\n\n== För der Aanfang ==\nDat es och all op Änglesch:\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Configuration settings list]\n* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]\n* [//www.mediawiki.org/wiki/Localisation#Translation_resources Donn MediaWiki op Ding Schprohch aanpaße]"
+}
index 30a01f4..d548e02 100644 (file)
@@ -14,4 +14,4 @@
     "config-help": "alîkarî",
     "mainpagetext": "'''MediaWiki serketî hate çêkirin.'''",
     "mainpagedocfooter": "Alîkarî ji bo bikaranîn û guherandin yê datayê Wîkî tu di bin [//meta.wikimedia.org/wiki/Help:Contents pirtûka alîkarîyê ji bikarhêneran] da dikarê bibînê.\n\n== Alîkarî ji bo destpêkê ==\n\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Lîsteya varîyablên konfîgûrasîyonê]\n* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lîsteya e-nameyên versyonên nuh yê MediaWiki]"
-}
\ No newline at end of file
+}
index 3bae636..ae6205a 100644 (file)
@@ -6,4 +6,4 @@
     },
     "mainpagetext": "'''MedyaViki ya se kureó con reuxitá.'''",
     "mainpagedocfooter": "Konsulta la [//meta.wikimedia.org/wiki/Ayudo:Contenido Guía de usador] para tomar enformasyones encima de como usar el lojikal viki.\n\n== En Empeçando ==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings La lista de los arreglamientos de la konfiggurasyón]\n* [//www.mediawiki.org/wiki/Manual:FAQ/lad DDS de MedyaViki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce La lista de las letrales (e-mail) de MedyaViki]"
-}
\ No newline at end of file
+}
index 8aa3866..fa54836 100644 (file)
@@ -13,7 +13,7 @@
     "config-localsettings-cli-upgrade": "E Fichier <code>LocalSettings.php</code> gouf fonnt.\nFir dës Installatioun z'aktuaéliséieren start w.e.g. <code>update.php</code>",
     "config-localsettings-key": "Aktualisatiounsschlëssel:",
     "config-localsettings-badkey": "De Schlëssel deen Dir aginn hutt ass net korrekt",
-    "config-localsettings-incomplete": "De Fichier <code>LocalSettings.php</code> schéngt net komplett ze sinn.\nD'Variabel $1 ass net definéiert.\nÄnnert w.e.g. de Fichier <code>LocalSettings.php</code> esou datt déi Variabel definéiert ass a klickt op \"{{int:Config-continue}}\".",
+    "config-localsettings-incomplete": "De Fichier <code>LocalSettings.php</code> schéngt net komplett ze sinn.\nD'Variabel $1 ass net definéiert.\nÄnnert w.e.g. de Fichier <code>LocalSettings.php</code> sou datt déi Variabel definéiert ass a klickt op \"{{int:Config-continue}}\".",
     "config-session-error": "Feeler beim Starte vun der Sessioun: $1",
     "config-no-session": "D'Donnéeë vun ärer Sessioun si verluergaangen!\nKuckt Är php.ini no a vergewëssert Iech datt <code>session.save_path</code>  op adequate REpertoire agestallt ass.",
     "config-your-language": "Är Sprooch",
@@ -23,7 +23,7 @@
     "config-back": "← Zréck",
     "config-continue": "Weider →",
     "config-page-language": "Sprooch",
-    "config-page-welcome": "Wëllkomm bäi MediaWiki!",
+    "config-page-welcome": "Wëllkomm bei MediaWiki!",
     "config-page-dbconnect": "Mat der Datebank verbannen",
     "config-page-upgrade": "Eng Installatioun déi besteet aktualiséieren",
     "config-page-dbsettings": "Astellunge vun der Datebank",
     "config-env-php": "PHP $1 ass installéiert.",
     "config-env-php-toolow": "PHP $1 ass installéiert.\nAwer MediaWiki brauch PHP $2 oder méi héich.",
     "config-unicode-using-utf8": "Fir d'Unicode-Normalisatioun gëtt dem Brion Vibber säin <code>utf8_normalize.so</code> benotzt.",
-    "config-no-db": "Et konnt kee passenden Datebank-Driver fonnt ginn! Dir musst een Datebank-Driver fir PHP installéieren.\nDës Datebank-Type ginn ënnerstëtzt: $1.\n\nWann Dir op engem gesharte Server sidd, da frot Ären Hosting-Provider fir de passenden Datebank-Driver z'installéieren.\nWann Dir PHP selwer compiléiert hutt, da reconfiguréiert en mat dem ageschalten Datebank-Client, zum Beispill an deem Dir <code>./configure --with-mysql</code> benotzt.\nWann Dir PHP vun engem Debian oder Ubuntu Package aus installéiert hutt, da musst Dir och den php5-mysql Modul installéieren.",
+    "config-no-db": "Et konnt kee passenden Datebank-Driver fonnt ginn! Dir musst een Datebank-Driver fir PHP installéieren.\nDës Datebank-Type ginn ënnerstëtzt: $1.\n\nWann Dir PHP selwer compiléiert hutt, da rekonfiguréiert en mat dem ageschalten Datebank-Client, zum Beispill an deem Dir <code>./configure --with-mysql</code> benotzt.\nWann Dir PHP vun engem Debian oder Ubuntu Package aus installéiert hutt, da musst Dir och den php5-mysql Modul installéieren.",
     "config-outdated-sqlite": "'''Warnung:''' SQLite $1 ass installéiert. Allerdengs brauch MediaWiki SQLite $2 oder méi nei. SQLite ass dofir net disponibel.",
     "config-memory-bad": "'''Opgepasst:''' De Parameter <code>memory_limit</code> vu PHP ass $1.\nDat ass wahrscheinlech ze niddreg.\nD'Installatioun kéint net funktionéieren.",
     "config-xcache": "[http://xcache.lighttpd.net/ XCache] ass installéiert",
     "config-apc": "[http://www.php.net/apc APC] ass installéiert",
     "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache] ass installéiert",
     "config-diff3-bad": "GNU diff3 gouf net fonnt.",
+    "config-git": "D'Software Git fir d'Kontroll vu Versioune gouf fonnt: <code>$1</code>.",
     "config-no-uri": "'''Feeler:''' Déi aktuell URI konnt net festgestallt ginn.\nInstallatioun ofgebrach.",
     "config-using-server": "De Servernumm \"<nowiki>$1</nowiki>\" gëtt benotzt.",
     "config-using-uri": "D'Server URL  \"<nowiki>$1$2</nowiki>\" gëtt benotzt.",
@@ -65,6 +66,7 @@
     "config-db-install-account": "Benotzerkont fir d'Installatioun",
     "config-db-username": "Datebank-Benotzernumm:",
     "config-db-password": "Passwuert vun der Datebank:",
+    "config-db-username-empty": "Dir musst e Wäert fir \"{{int:config-db-username}}\" aginn",
     "config-db-install-help": "Gitt de Benotzernumm an Passwuert an dat wàhrend der Installatioun benotzt gëtt fir sech mat der Datebank ze verbannen.",
     "config-db-account-lock": "De selwechte Benotzernumm a Passwuert fir déi normal Operatioune benotzen",
     "config-db-wiki-account": "Benotzerkont fir normal Operatiounen",
     "config-sqlite-dir": "Repertoire vun den SQLite-Donnéeën",
     "config-oracle-def-ts": "Standard 'tablespace':",
     "config-oracle-temp-ts": "Temporären 'tablespace':",
-    "config-type-mysql": "MySQL",
+    "config-type-mysql": "MySQL (oder kompatibel)",
     "config-type-postgres": "PostgreSQL",
     "config-type-sqlite": "SQLite",
     "config-type-oracle": "Oracle",
+    "config-type-mssql": "Microsoft SQL Server",
+    "config-dbsupport-postgres": "* [{{int:version-db-postgres-url}} PostgreSQL] ass e beléiften Open-Source-Datebanksystem an eng Alternativ zu MySQL. Et gëtt awer e puer kleng Implementatiounsfeeler, dofir gëtt vun der Notzung an engem Produktivsystem ofgeroden. ([http://www.php.net/manual/de/pgsql.installation.php Uleedung fir d'Kompilatoun vu PHP mat PostgreSQL-Ënnerstëtzung])",
+    "config-dbsupport-oracle": "* [{{int:version-db-oracle-url}} Oracle] ass eng kommerziell Datebank-Software. ([http://www.php.net/manual/en/oci8.installation.php How to compile PHP mat OCI8 Ënnerstëtzung])",
+    "config-dbsupport-mssql": "* [{{int:version-db-mssql-url}} Microsoft SQL Server] ass eng kommerziell Datebank-Software fir Windows. ([http://www.php.net/manual/en/sqlsrv.installation.php Wéi PHP mat SQLSRV Ënnerstëtzung kompiléieren])",
     "config-header-mysql": "MySQL-Astellungen",
     "config-header-postgres": "PostgreSQL-Astellungen",
     "config-header-sqlite": "SQLite-Astellungen",
     "config-header-oracle": "Oracle-Astellungen",
+    "config-header-mssql": "Microsoft SQL Server Astellungen",
     "config-invalid-db-type": "Net valabelen Datebank-Typ",
-    "config-missing-db-name": "Dir musst en Numm fir de Wäert \"Numm vun der Datebank\" uginn",
-    "config-missing-db-host": "Dir musst e Wäert fir \"Database host\" uginn",
-    "config-missing-db-server-oracle": "Dir musst e Wäert fir \"Datebank-TNS\" uginn",
+    "config-missing-db-name": "Dir musst e Wäert fir \"{{int:config-db-name}}\" aginn",
+    "config-missing-db-host": "Dir musst e Wäert fir \"{{int:config-db-host}}\" aginn.",
+    "config-missing-db-server-oracle": "Dir musst e Wäert fir \"{{int:config-db-host-oracle}}\" aginn",
     "config-db-sys-user-exists-oracle": "De Benotzerkont \"$1\" gëtt et schonn. SYSDBA kann nëmme benotzt gi fir en neie Benotzerkont opzemaachen.",
     "config-postgres-old": "PostgreSQL $1 oder eng méi nei Versioun gëtt gebraucht, Dir hutt $2.",
+    "config-mssql-old": "Microsoft SQL Server $1 oder eng méi rezent Versioun gëtt gebraucht. Dir hutt d'Versioun $2.",
     "config-sqlite-name-help": "Sicht en Numm deen Är wiki identifizéiert.\nBenotzt keng Espacen a Bindestrécher.\nE gëtt fir den Numm vum SQLite Date-Fichier benotzt.",
     "config-sqlite-readonly": "An de Fichier <code>$1</code> Kann net geschriwwe ginn.",
     "config-sqlite-cant-create-db": "Den Datebank-Fichier <code>$1</code> konnt net ugeluecht ginn.",
+    "config-can-upgrade": "Et si MediaWiki Tabellen an dëser Datebank.\nFir se op MediaWiki $1 z'aktualiséiere klickt op <strong>Virufueren</strong>.",
     "config-upgrade-done-no-regenerate": "D'Aktualisatioun ass ofgeschloss.\n\nDir kënnt elo [$1 ufänken Är Wiki ze benotzen]",
     "config-regenerate": "LocalSettings.php regeneréieren →",
     "config-db-web-account": "Datebankkont fir den Accès iwwer de Web",
     "config-mysql-myisam": "MyISAM",
     "config-mysql-binary": "binär",
     "config-mysql-utf8": "UTF-8",
+    "config-mssql-auth": "Typ vun der Authentifikatioun:",
+    "config-mssql-sqlauth": "SOL-Server-Authentifikatioun",
+    "config-mssql-windowsauth": "Windows-Authentifikatioun",
     "config-site-name": "Numm vun der Wiki:",
     "config-site-name-help": "Dësen daucht an der Titelleescht vum Browser an op verschiddenen anere Plazen op.",
     "config-site-name-blank": "Gitt den Numm vum Site un.",
     "config-ns-other": "Anerer (spezifizéieren)",
     "config-ns-other-default": "MyWiki",
     "config-admin-box": "Administrateurs-Kont",
-    "config-admin-name": "Ären Numm:",
+    "config-admin-name": "Äre Benotzernumm:",
     "config-admin-password": "Passwuert:",
     "config-admin-password-confirm": "Passwuert confirméieren:",
     "config-admin-help": "Gitt w.e.g. Äre gewënschte Benotzernumm hei an, zum Beispill \"Jang Muller\".\nDësen Numm gëtt da gebraucht fir sech an d'Wiki anzeloggen.",
     "config-admin-name-blank": "Gitt e Benotzernumm fir den Administrateur an.",
     "config-admin-name-invalid": "De spezifizéierte Benotzernumm \"<nowiki>$1</nowiki>\" ass net valabel.\nSpezifizéiert en anere Benotzernumm.",
     "config-admin-password-blank": "Gitt e Passwuert fir den Adminstateur-Kont an.",
-    "config-admin-password-same": "D'Passwuert däerf net dat selwecht si wéi de Benotzernumm.",
     "config-admin-password-mismatch": "Déi zwee Passwierder Déi Dir aginn hutt stëmmen net iwwereneen.",
     "config-admin-email": "E-Mail-Adress:",
     "config-admin-error-user": "Interne Feeler beim uleeë vun engem Administrateur mam Numm \"<nowiki>$1</nowiki>\".",
     "config-profile-private": "Privat Wiki",
     "config-license": "Copyright a Lizenz:",
     "config-license-none": "Keng Lizenz ënnen op der Säit",
+    "config-license-cc-by": "Creative Commons Attribution",
+    "config-license-gfdl": "GNU-Lizenz fir Fräi Dokumentatioun 1.3 oder méi rezent",
     "config-license-pd": "Ëffentlechen Domaine",
+    "config-license-cc-choose": "Eng personaliséiert Creative Common Lizenz eraussichen",
     "config-email-settings": "E-Mail-Astellungen",
     "config-enable-email": "E-Mailen déi no bausse ginn aschalten",
     "config-email-user": "Benotzer-op-Benotzer E-Mail aschalten",
-    "config-email-usertalk": "Benoriichtege bäi Ännerung vun der Benotzerdiskussiounssäit aschalten",
+    "config-email-usertalk": "Benoriichtege bei Ännerung vun der Benotzerdiskussiounssäit aschalten",
     "config-email-watchlist": "Benoriichtigung vun der Iwwerwaachungslëscht aschalten",
+    "config-email-watchlist-help": "Erlaabt et de Benotzer fir Notifikatioune vun hiren iwwerwaachte Säiten ze kréie wa si dat an hiren Astellungen aktivéiert hunn.",
     "config-email-auth": "E-Mail-Authentifizéierung aschalten",
     "config-email-sender": "E-Mailadress fir Äntwerten:",
     "config-upload-settings": "Eropgeluede Biller a Fichieren",
     "config-install-step-failed": "huet net funktionéiert",
     "config-install-extensions": "Mat den Ereiderungen",
     "config-install-database": "Datebank gëtt installéiert",
+    "config-install-pg-commit": "Ännerungen applizéieren",
     "config-install-pg-plpgsql": "No der Sprooch PL/pgSQL sichen",
     "config-pg-no-plpgsql": "Fir d'Datebank $1 muss d'Datebanksprooch PL/pgSQL installéiert ginn",
     "config-install-user": "Datebank Benotzer uleeën",
     "config-download-localsettings": "<code>LocalSettings.php</code> eroflueden",
     "config-help": "Hëllef",
     "config-nofile": "De Fichier \"$1\" gouf net fonnt. Gouf e geläscht?",
-    "mainpagetext": "'''MediaWiki gouf installéiert.'''",
+    "mainpagetext": "<strong>MediaWiki gouf installéiert.</strong>",
     "mainpagedocfooter": "Kuckt w.e.g. [//meta.wikimedia.org/wiki/Help:Contents d'Benotzerhandbuch] fir Informatiounen iwwer de Gebruach vun der Wiki Software.\n\n== Fir  unzefänken ==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Hëllef bei der Konfiguratioun]\n* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki-FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Mailinglëscht vun neie MediaWiki-Versiounen]\n* [//www.mediawiki.org/wiki/Localisation#Translation_resources Lokaliséiert MediaWiki fir Är Sprooch]"
-}
\ No newline at end of file
+}
index cd00514..3f53880 100644 (file)
@@ -1,7 +1,5 @@
 {
-    "@metadata": {
-        "authors": []
-    },
+    "@metadata": [],
     "mainpagetext": "'''MediaWiki es aora instalada.'''",
     "mainpagedocfooter": "Atenda la [//meta.wikimedia.org/wiki/Help:Contents Gida per Usores] per informa supra la usa de la programa de vici.\n\n== Comensa ==\n\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Lista de ajustas de la desinia]\n* [//www.mediawiki.org/wiki/Manual:FAQ Demandas comun de MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lista per receta anunsias de novas supra MediaWiki]"
-}
\ No newline at end of file
+}
index 85b3f80..82dd71e 100644 (file)
@@ -6,4 +6,4 @@
     },
     "mainpagetext": "MediaWiki kati ewangidwa ku sisitemu yo",
     "mainpagedocfooter": "Okuyiga ku nkozesa ya sofutiweya owa wiki, kebera [//meta.wikimedia.org/wiki/Help:Contents Okulagirira Abakozesa].\n\n== Amagezi agakuyamba okutandika ==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Lukalala lw'eby'enteekateeka yo]\n* [//www.mediawiki.org/wiki/Manual:FAQ Ebiter'okubuuzibwa ku MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Wewandise ofunenga amawulire aga email ag'ebifa ku MediaWiki]"
-}
\ No newline at end of file
+}
index 524067f..c5f7344 100644 (file)
@@ -1,7 +1,5 @@
 {
-    "@metadata": {
-        "authors": []
-    },
+    "@metadata": [],
     "mainpagetext": "'''MediaWiki software succesvol geïnsjtalleerd.'''",
     "mainpagedocfooter": "Raodpleeg de [//meta.wikimedia.org/wiki/NL_Help:Inhoudsopgave handjleiding] veur informatie euver 't gebroek van de wikisoftware.\n\n== Mieë hölp ==\n\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Lies mit instellinge]\n* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki VGV (FAQ)]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki mailinglies veur nuuj versies]"
-}
\ No newline at end of file
+}
index 4cb70cc..3502f88 100644 (file)
@@ -1,6 +1,4 @@
 {
-    "@metadata": {
-        "authors": []
-    },
+    "@metadata": [],
     "mainpagetext": "'''ຕິດຕັ້ງມີເດຍວິກິນີ້ສຳເລັດແລ້ວ.'''"
-}
\ No newline at end of file
+}
index 85618b0..15c4fe3 100644 (file)
@@ -8,6 +8,8 @@
     "config-desc": "MediaWiki diegimas",
     "config-title": "MediaWiki $1 diegimas",
     "config-information": "Informacija",
+    "config-localsettings-key": "Naujinimo raktas:",
+    "config-localsettings-badkey": "Raktą, kurį pateikėte yra neteisingas.",
     "config-your-language": "Jūsų kalba:",
     "config-wiki-language": "Viki kalba:",
     "config-back": "← Atgal",
@@ -24,6 +26,7 @@
     "config-page-readme": "Perskaityk manę",
     "config-page-copying": "Kopijuojama",
     "config-page-upgradedoc": "Atnaujinama",
+    "config-page-existingwiki": "Esamas wiki",
     "config-restart": "Taip, paleiskite jį iš naujo",
     "config-env-php": "PHP $1 yra įdiegtas.",
     "config-env-php-toolow": "PHP $1 įdiegta.\nTačiau, MediaWiki reikia PHP $2 ar naujesnės.",
     "config-db-host": "Duomenų bazės serveris:",
     "config-db-name": "Duomenų bazės pavadinimas:",
     "config-db-name-oracle": "Duomenų bazės schema:",
+    "config-db-install-account": "Vartotojo paskyra diegimui",
     "config-db-username": "Duomenų bazės vartotojo vardas:",
     "config-db-password": "Duomenų bazės slaptažodis:",
     "config-charset-mysql5": "MySQL 4.1/5.0 UTF-8",
     "config-db-port": "Duomenų bazės prievadas:",
     "config-db-schema": "MediaWiki schema:",
+    "config-type-mssql": "Microsoft SQL serveris",
     "config-header-mysql": "MySQL nustatymai",
     "config-header-postgres": "PostgreSQL nustatymai",
     "config-header-sqlite": "SQLite nustatymai",
     "config-header-oracle": "Oracle nustatymai",
+    "config-invalid-db-type": "Neteisingas duomenų bazės tipas",
     "config-mysql-innodb": "InnoDB",
     "config-mysql-myisam": "MyISAM",
     "config-mysql-utf8": "UTF-8",
+    "config-mssql-windowsauth": "Windows autentifikavimas",
     "config-site-name": "Viki pavadinimas:",
     "config-site-name-blank": "Įveskite svetainės pavadinimą.",
     "config-project-namespace": "Projekto pavadinimas:",
@@ -55,7 +62,6 @@
     "config-admin-password-confirm": "Slaptažodis dar kartą:",
     "config-admin-name-blank": "Įveskite administratoriaus vartotojo vardą.",
     "config-admin-password-blank": "Įvesti administratoriaus paskyros slaptažodį.",
-    "config-admin-password-same": "Slaptažodis turi būti ne toks pat, kaip vartotojo vardas.",
     "config-admin-password-mismatch": "Įvesti slaptažodžiai nesutampa.",
     "config-admin-email": "El. pašto adresas:",
     "config-optional-continue": "Paklausti daugiau klausimų.",
@@ -80,4 +86,4 @@
     "config-help": "pagalba",
     "mainpagetext": "'''MediaWiki sėkmingai įdiegta.'''",
     "mainpagedocfooter": "Informacijos apie wiki programinės įrangos naudojimą, ieškokite [//meta.wikimedia.org/wiki/Help:Contents žinyne].\n\n== Pradžiai ==\n\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Konfigūracijos nustatymų sąrašas]\n* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki DUK]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki pranešimai paštu apie naujas versijas]"
-}
\ No newline at end of file
+}
index 529a148..4bc9c09 100644 (file)
@@ -1,9 +1,13 @@
 {
     "@metadata": {
         "authors": [
-            "GreenZeb"
+            "GreenZeb",
+            "Papuass"
         ]
     },
+    "config-information": "Informācija",
+    "config-your-language": "Jūsu valoda:",
+    "config-wiki-language": "Wiki valoda:",
     "config-back": "← Atpakaļ",
     "config-continue": "Turpināt →",
     "config-page-language": "Valoda",
     "config-page-restart": "Pārstartēt instalāciju",
     "config-page-readme": "Lasīt mani",
     "config-page-releasenotes": "Informācija par laidienu",
+    "config-db-charset": "Datubāzes rakstzīmju kopa",
+    "config-charset-mysql5-binary": "MySQL 4.1/5.0 binārs",
+    "config-charset-mysql5": "MySQL 4.1/5.0 UTF-8",
+    "config-charset-mysql4": "MySQL 4.0 atpakaļsaderīgs UTF-8",
+    "config-db-port": "Datubāzes ports:",
+    "config-db-schema": "MediaWiki shēma:",
+    "config-db-schema-help": "Šī shēma derēs vairumā gadījumu.\nMainiet to tikai, ja zināt, ka tas nepieciešams.",
+    "config-type-mysql": "MySQL (vai saderīga)",
+    "config-header-mysql": "MySQL iestatījumi",
+    "config-header-postgres": "PostgreSQL iestatījumi",
+    "config-header-sqlite": "SQLite iestatījumi",
+    "config-header-oracle": "Oracle iestatījumi",
+    "config-header-mssql": "Microsoft SQL servera iestatījumi",
+    "config-mysql-innodb": "InnoDB",
+    "config-mysql-myisam": "MyISAM",
     "mainpagetext": "'''MediaWiki veiksmīgi ieinstalēts'''",
     "mainpagedocfooter": "Izlasi [//meta.wikimedia.org/wiki/Help:Contents Lietotāja pamācību], lai iegūtu vairāk informācijas par Wiki programmatūras lietošanu.\n\n== Pirmie soļi ==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Konfigurācijas iespēju saraksts]\n* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki J&A]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Parakstīties uz paziņojumiem par jaunām MediaWiki versijām]"
-}
\ No newline at end of file
+}
index cf85646..d8ea932 100644 (file)
@@ -1,7 +1,5 @@
 {
-    "@metadata": {
-        "authors": []
-    },
+    "@metadata": [],
     "mainpagetext": "'''共筆臺已立'''",
     "mainpagedocfooter": "欲識維基,見[//meta.wikimedia.org/wiki/Help:Contents User's Guide]\n\n== 始 ==\n\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Configuration settings list]\n* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]"
-}
\ No newline at end of file
+}
index 4163035..744c07a 100644 (file)
@@ -6,4 +6,4 @@
     },
     "mainpagetext": "'''Mediawiki dido k'ai ik'idu.'''",
     "mainpagedocfooter": "Vik'i şeni muç'o ixmarinen ya mutxanepe oguru şeni [//meta.wikimedia.org/wiki/Help:Contents oxmaruşi rexberis] o3'k'edit.\n\n== Ağani na gyoç’k’u maxmarepe ==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Ok'iduşi ayarepeşi liste]\n* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki P'anda Na-k'itxu K'itxalape]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki e-mailepeşiş liste]"
-}
\ No newline at end of file
+}
index 771b6fa..0862614 100644 (file)
@@ -6,4 +6,4 @@
     },
     "mainpagetext": "'''मीडियाविकी नीक जकाँ प्रस्थापित भेल।'''",
     "mainpagedocfooter": "सम्पर्क करू [//meta.wikimedia.org/wiki/Help:Contents User's Guide] विकी तंत्रांशक प्रयोगक जानकारी लेल।\n\n==प्रारम्भ कोना करी==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Configuration settings list]\n* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]"
-}
\ No newline at end of file
+}
index 12ed5c5..b8dd349 100644 (file)
@@ -1,7 +1,5 @@
 {
-    "@metadata": {
-        "authors": []
-    },
+    "@metadata": [],
     "mainpagetext": "'''МедиаВикить арафтозь лац.'''",
     "mainpagedocfooter": "Ванк [//meta.wikimedia.org/wiki/Help:Contents Ветямовал Тиинди] тяса ули кода содамс Вики програпнень эрявикснень колга.\n\n== Эрявикс сюлмафксне ==\n\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Васьфневи арафнематнень кярькссь]\n* [//www.mediawiki.org/wiki/Manual:FAQ МедиаВикить Сидеста Кеподеви Кизефксне]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce МедиаВикить од верзиятнень колга кулянь пачфтема]"
-}
\ No newline at end of file
+}
index 789474c..b79c3b0 100644 (file)
@@ -4,6 +4,12 @@
             "Jagwar"
         ]
     },
+    "config-desc": "Fandaharana mametraka an'i MediaWiki",
+    "config-title": "Fametrahana an'i MediaWiki $1",
+    "config-information": "Fampahalalana",
+    "config-localsettings-upgrade": "Hita ny <code>LocalSettings.php</code>.\nMba hanavao ity fametrahana ity, atsofohy ny sandan'i <code>$wgUpgradeKey</code> amin'ny saha eo ambany.\nHo hitanao eo amin'i <code>LocalSettings.php</code> ilay izy.",
+    "config-localsettings-key": "Lakile fanavaozana:",
+    "config-localsettings-badkey": "Diso ilay lakile fanavaozana natsofokao.",
     "config-session-error": "Hadisoana teo am-panombohana ny fidirana : $1",
     "config-your-language": "Ny fiteninao :",
     "config-wiki-language": "Fiteny ho ampiasain'ny wiki :",
     "config-page-welcome": "Tonga soa eto amin'i MediaWiki !",
     "config-page-dbconnect": "Hiditra eo amin'i banky angona",
     "config-page-name": "Anarana",
+    "config-page-options": "Safidy",
+    "config-page-install": "Apetraka",
+    "config-page-complete": "Tapitra!",
+    "config-page-restart": "Hamerina ny fametrahana",
     "config-page-readme": "Vakio aho",
+    "config-page-releasenotes": "Resaka mikasika ilay versiona",
     "config-page-copying": "Hala-tahaka",
     "config-page-upgradedoc": "Fanavaozina",
     "config-page-existingwiki": "Wiki efa misy",
@@ -50,4 +61,4 @@
     "config-help": "fanoroana",
     "mainpagetext": "'''Tafajoro soa aman-tsara ny rindrankajy Wiki.'''",
     "mainpagedocfooter": "Vangio ny [//meta.wikimedia.org/wiki/Aide:Contenu Fanoroana ho an'ny mpampiasa] ra te hitady fanoroana momba ny fampiasan'ity rindrankajy ity.\n\n== Hanomboka amin'ny MediaWiki ==\n\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Lisitra ny paramètre de configuration]\n* [//www.mediawiki.org/wiki/Manual:FAQ/fr FAQ momba ny MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Resaka momba ny fizaràn'ny MediaWiki]"
-}
\ No newline at end of file
+}
index ee25ee9..d1c8264 100644 (file)
@@ -1,6 +1,4 @@
 {
-    "@metadata": {
-        "authors": []
-    },
+    "@metadata": [],
     "mainpagetext": "'''MediaWiki сай шындыме.'''"
-}
\ No newline at end of file
+}
index bde2fc5..8968190 100644 (file)
@@ -7,4 +7,4 @@
     },
     "mainpagetext": "'''MediaWiki alah tapasang jo sukses'''.",
     "mainpagedocfooter": "Konsultasian [//meta.wikimedia.org/wiki/Help:Contents/min Panduan Panggunoan] untuak informasi caro panggunoan parangkaik lunak wiki.\n\n== Mamulai panggunoan ==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings/id Daftar pangaturan konfigurasi]\n* [//www.mediawiki.org/wiki/Manual:FAQ/id Daftar patanyoan nan acok diajukan manganai MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Milis rilis MediaWiki]\n* [//www.mediawiki.org/wiki/Localisation#Translation_resources Palokalan MediaWiki untuak bahaso Sanak]"
-}
\ No newline at end of file
+}
index d5aa56f..1eaca6a 100644 (file)
@@ -5,21 +5,21 @@
             "아라"
         ]
     },
-    "config-desc": "Ð\98нÑ\81Ñ\82алаÑ\82оÑ\80 на МедијаВики",
-    "config-title": "Ð\98нÑ\81Ñ\82алаÑ\82оÑ\80 на МедијаВики $1",
+    "config-desc": "Ð\92оÑ\81поÑ\81Ñ\82авÑ\83ваÑ\87оÑ\82 на МедијаВики",
+    "config-title": "Ð\92оÑ\81поÑ\81Ñ\82авка на МедијаВики $1",
     "config-information": "Информации",
     "config-localsettings-upgrade": "Востановена е податотека <code>LocalSettings.php</code>.\nЗа да ја надградите инсталцијава, внесете ја вредноста на <code>$wgUpgradeKey</code> во полето подолу.\nТоа е го најдете во <code>LocalSettings.php</code>.",
-    "config-localsettings-cli-upgrade": "УÑ\82вÑ\80дено Ðµ Ð¿Ñ\80иÑ\81Ñ\83Ñ\81Ñ\82воÑ\82о Ð½Ð° Ð¿Ð¾Ð´Ð°Ñ\82оÑ\82екаÑ\82а â\80\9e<code>LocalSettings.php</code>â\80\9c.\nÐ\97а Ð´Ð° Ñ\98а Ð½Ð°Ð´Ð³Ñ\80адиÑ\82е Ð¸Ð½Ñ\81Ñ\82алаÑ\86иÑ\98ата, пуштете ја „<code>update.php</code>“ наместо горенаведената.",
+    "config-localsettings-cli-upgrade": "УÑ\82вÑ\80дено Ðµ Ð¿Ñ\80иÑ\81Ñ\83Ñ\81Ñ\82воÑ\82о Ð½Ð° Ð¿Ð¾Ð´Ð°Ñ\82оÑ\82екаÑ\82а â\80\9e<code>LocalSettings.php</code>â\80\9c.\nÐ\97а Ð´Ð° Ñ\98а Ð½Ð°Ð´Ð³Ñ\80адиÑ\82е Ð²Ð¾Ñ\81поÑ\81Ñ\82авката, пуштете ја „<code>update.php</code>“ наместо горенаведената.",
     "config-localsettings-key": "Надградбен клуч:",
     "config-localsettings-badkey": "Клучот што го наведовте е погрешен",
-    "config-upgrade-key-missing": "Ð\92оÑ\81Ñ\82ановена Ðµ Ð¿Ð¾Ñ\81Ñ\82оеÑ\87ка Ð¸Ð½Ñ\81Ñ\82алаÑ\86иÑ\98а на МедијаВики.\nЗа да ја надградите, вметнете го следниов ред на дното од вашата страница <code>LocalSettings.php</code>:\n\n$1",
+    "config-upgrade-key-missing": "Ð\92оÑ\81Ñ\82ановена Ðµ Ð¿Ð¾Ñ\81Ñ\82оеÑ\87ка Ð²Ð¾Ñ\81поÑ\81Ñ\82авка на МедијаВики.\nЗа да ја надградите, вметнете го следниов ред на дното од вашата страница <code>LocalSettings.php</code>:\n\n$1",
     "config-localsettings-incomplete": "Постоечката страница <code>LocalSettings.php</code> е нецелосна.\nНе е поставена променливата $1.\nИзменете ја страницата <code>LocalSettings.php</code> така што ќе ѝ зададете вредност на променливата, па стиснете на „{{int:Config-continue}}“.",
-    "config-localsettings-connection-error": "Се појави грешка при поврзувањето со базата користејќи ги поставките назначени во <code>LocalSettings.php</code> или <code>AdminSettings.php</code>. Исправете ги овие поставки и обидете се повторно.\n\n$1",
+    "config-localsettings-connection-error": "Се појави грешка при поврзувањето со базата користејќи ги поставките назначени во <code>LocalSettings.php</code>. Исправете ги овие поставки и обидете се повторно.\n\n$1",
     "config-session-error": "Грешка при започнување на сесијата: $1",
-    "config-session-expired": "Ð\92аÑ\88иÑ\82е Ñ\81еÑ\81иÑ\81ки Ð¿Ð¾Ð´Ð°Ñ\82оÑ\86и Ð¸Ñ\81Ñ\82екоа.\nÐ\9fоÑ\81Ñ\82авкиÑ\82е Ð½Ð° Ñ\81еÑ\81ииÑ\82е Ñ\82Ñ\80ааÑ\82 $1.\nÐ\9dивниоÑ\82 Ñ\80ок Ð¼Ð¾Ð¶ÐµÑ\82е Ð´Ð° Ð³Ð¾ Ð·Ð³Ð¾Ð»ÐµÐ¼Ð¸Ñ\82е Ñ\81о Ð·Ð°Ð´Ð°Ð²Ð°Ñ\9aе Ð½Ð° <code>session.gc_maxlifetime</code> Ð²Ð¾ php.ini.\nÐ\9fоÑ\87неÑ\82е Ñ\98а Ð¸Ð½Ñ\81Ñ\82алаÑ\86иÑ\98ата одново.",
+    "config-session-expired": "Ð\92аÑ\88иÑ\82е Ñ\81еÑ\81иÑ\81ки Ð¿Ð¾Ð´Ð°Ñ\82оÑ\86и Ð¸Ñ\81Ñ\82екоа.\nÐ\9fоÑ\81Ñ\82авкиÑ\82е Ð½Ð° Ñ\81еÑ\81ииÑ\82е Ñ\82Ñ\80ааÑ\82 $1.\nÐ\9dивниоÑ\82 Ñ\80ок Ð¼Ð¾Ð¶ÐµÑ\82е Ð´Ð° Ð³Ð¾ Ð·Ð³Ð¾Ð»ÐµÐ¼Ð¸Ñ\82е Ñ\81о Ð·Ð°Ð´Ð°Ð²Ð°Ñ\9aе Ð½Ð° <code>session.gc_maxlifetime</code> Ð²Ð¾ php.ini.\nÐ\9fоÑ\87неÑ\82е Ñ\98а Ð²Ð¾Ñ\81поÑ\81Ñ\82авката одново.",
     "config-no-session": "Вашите сесиски податоци се изгубени!\nПогледајте во php.ini дали <code>session.save_path</code> е поставен во правилна папка.",
     "config-your-language": "Вашиот јазик:",
-    "config-your-language-help": "Ð\9eдбеÑ\80еÑ\82е Ð½Ð° ÐºÐ¾Ñ\98 Ñ\98азик Ð´Ð° Ñ\81е Ð¾Ð´Ð²Ð¸Ð²Ð° Ð¸Ð½Ñ\81Ñ\82алаÑ\86иÑ\98ата.",
+    "config-your-language-help": "Ð\9eдбеÑ\80еÑ\82е Ð½Ð° ÐºÐ¾Ñ\98 Ñ\98азик Ð´Ð° Ñ\81е Ð¾Ð´Ð²Ð¸Ð²Ð° Ð²Ð¾Ñ\81поÑ\81Ñ\82авката.",
     "config-wiki-language": "Јазик на викито:",
     "config-wiki-language-help": "Одберете на кој јазик ќе бидат содржините на викито.",
     "config-back": "← Назад",
     "config-page-language": "Јазик",
     "config-page-welcome": "Добредојдовте на МедијаВики!",
     "config-page-dbconnect": "Поврзување со базата",
-    "config-page-upgrade": "Ð\9dадгÑ\80адба Ð½Ð° Ð¿Ð¾Ñ\81Ñ\82оеÑ\87каÑ\82а Ð¸Ð½Ñ\81Ñ\82алаÑ\86иÑ\98а",
+    "config-page-upgrade": "Ð\9dадгÑ\80адба Ð½Ð° Ð¿Ð¾Ñ\81Ñ\82оеÑ\87каÑ\82а Ð²Ð¾Ñ\81поÑ\81Ñ\82авка",
     "config-page-dbsettings": "Нагодувања на базата",
     "config-page-name": "Назив",
     "config-page-options": "Поставки",
-    "config-page-install": "Ð\98нÑ\81Ñ\82алиÑ\80аÑ\98",
+    "config-page-install": "Ð\92оÑ\81поÑ\81Ñ\82ави",
     "config-page-complete": "Готово!",
-    "config-page-restart": "Ð\9fÑ\83Ñ\88Ñ\82и Ñ\98а Ð¸Ð½Ñ\81Ñ\82алаÑ\86иÑ\98ата одново",
+    "config-page-restart": "Ð\9fÑ\83Ñ\88Ñ\82и Ñ\98а Ð²Ð¾Ñ\81поÑ\81Ñ\82авката одново",
     "config-page-readme": "Прочитај ме",
     "config-page-releasenotes": "Белешки за изданието",
     "config-page-copying": "Копирање",
     "config-page-upgradedoc": "Надградба",
     "config-page-existingwiki": "Постоечко вики",
-    "config-help-restart": "Ð\94али Ñ\81акаÑ\82е Ð´Ð° Ð³Ð¸ Ð¸Ñ\81Ñ\87иÑ\81Ñ\82иÑ\82е Ñ\81иÑ\82е Ð·Ð°Ñ\87Ñ\83вани Ð¿Ð¾Ð´Ð°Ñ\82оÑ\86и Ñ\88Ñ\82о Ð³Ð¸ Ð²Ð½ÐµÑ\81овÑ\82е Ð¸ Ð´Ð° Ñ\98а Ð·Ð°Ð¿Ð¾Ñ\87неÑ\82е Ð¸Ð½Ñ\81Ñ\82алаÑ\86иÑ\98ата одново?",
+    "config-help-restart": "Ð\94али Ñ\81акаÑ\82е Ð´Ð° Ð³Ð¸ Ð¸Ñ\81Ñ\87иÑ\81Ñ\82иÑ\82е Ñ\81иÑ\82е Ð·Ð°Ñ\87Ñ\83вани Ð¿Ð¾Ð´Ð°Ñ\82оÑ\86и Ñ\88Ñ\82о Ð³Ð¸ Ð²Ð½ÐµÑ\81овÑ\82е Ð¸ Ð´Ð° Ñ\98а Ð·Ð°Ð¿Ð¾Ñ\87неÑ\82е Ð²Ð¾Ñ\81поÑ\81Ñ\82авката одново?",
     "config-restart": "Да, почни одново",
-    "config-welcome": "=== Ð\9fÑ\80овеÑ\80ки Ð½Ð° Ð¾ÐºÐ¾Ð»Ð¸Ð½Ð°Ñ\82а ===\nСега Ñ\9cе Ñ\81е Ð¸Ð·Ð²Ñ\80Ñ\88име Ð¾Ñ\81новни Ð¿Ñ\80овеÑ\80ки Ð·Ð° Ð´Ð° Ñ\81е Ð²Ð¾Ñ\81Ñ\82анови Ð´Ð°Ð»Ð¸ Ð¾ÐºÐ¾Ð»Ð¸Ð½Ð°Ñ\82а Ðµ Ð¿Ð¾Ð³Ð¾Ð´Ð½Ð° Ð·Ð° Ð¸Ð½Ñ\81Ñ\82алиÑ\80аÑ\9aе Ð½Ð° Ð\9cедиÑ\98аÐ\92ики. Ð\9dе Ð·Ð°Ð±Ð¾Ñ\80аваÑ\98Ñ\82е Ð´Ð° Ð³Ð¸ Ð¿Ñ\80иложиÑ\82е Ð¾Ð²Ð¸Ðµ Ð¸Ð½Ñ\84оÑ\80маÑ\86ии Ð°ÐºÐ¾ Ð±Ð°Ñ\80аÑ\82е Ð¿Ð¾Ð¼Ð¾Ñ\88 Ñ\81о Ð´Ð¾Ð²Ñ\80Ñ\88Ñ\83ваÑ\9aе Ð½Ð° Ð¸Ð½Ñ\81Ñ\82алаÑ\86иÑ\98ата.",
+    "config-welcome": "=== Ð\9fÑ\80овеÑ\80ки Ð½Ð° Ð¾ÐºÐ¾Ð»Ð¸Ð½Ð°Ñ\82а ===\nСега Ñ\9cе Ñ\81е Ð¸Ð·Ð²Ñ\80Ñ\88име Ð¾Ñ\81новни Ð¿Ñ\80овеÑ\80ки Ð·Ð° Ð´Ð° Ñ\81е Ð²Ð¾Ñ\81Ñ\82анови Ð´Ð°Ð»Ð¸ Ð¾ÐºÐ¾Ð»Ð¸Ð½Ð°Ñ\82а Ðµ Ð¿Ð¾Ð³Ð¾Ð´Ð½Ð° Ð·Ð° Ð²Ð¾Ñ\81поÑ\81Ñ\82авкa Ð½Ð° Ð\9cедиÑ\98аÐ\92ики. Ð\9dе Ð·Ð°Ð±Ð¾Ñ\80аваÑ\98Ñ\82е Ð´Ð° Ð³Ð¸ Ð¿Ñ\80иложиÑ\82е Ð¾Ð²Ð¸Ðµ Ð¸Ð½Ñ\84оÑ\80маÑ\86ии Ð°ÐºÐ¾ Ð±Ð°Ñ\80аÑ\82е Ð¿Ð¾Ð¼Ð¾Ñ\88 Ñ\81о Ð´Ð¾Ð²Ñ\80Ñ\88Ñ\83ваÑ\9aе Ð½Ð° Ð²Ð¾Ñ\81поÑ\81Ñ\82авката.",
     "config-copyright": "=== Авторски права и услови ===\n\n$1\n\nОва е слободна програмска опрема (free software); можете да го редистрибуирате и/или менувате согласно условите на ГНУ-овата општа јавна лиценца (GNU General Public License) на Фондацијата за слободна програмска опрема (Free Software Foundation); верзија 2 или било која понова верзија на лиценцата (по ваш избор).\n\nОвој програм се нуди со надеж дека ќе биде корисен, но '''без никаква гаранција'''; дури ни подразбраната гаранција за '''продажна способност''' или '''погодност за определена цел'''.\nПовеќе информации ќе најдете во текстот на ГНУ-овата општа јавна лиценца.\n\nБи требало да имате добиено <doclink href=Copying>примерок од ГНУ-овата општа јавна лиценца</doclink> заедно со програмов; ако немате добиено, тогаш пишете ни на Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. или [http://www.gnu.org/copyleft/gpl.html прочитајте ја тука].",
     "config-sidebar": "* [//www.mediawiki.org Домашна страница на МедијаВики]\n* [//www.mediawiki.org/wiki/Help:Contents Водич за корисници]\n* [//www.mediawiki.org/wiki/Manual:Contents Водич за администратори]\n* [//www.mediawiki.org/wiki/Manual:FAQ ЧПП]\n----\n* <doclink href=Readme>Прочитај ме</doclink>\n* <doclink href=ReleaseNotes>Белешки за изданието</doclink>\n* <doclink href=Copying>Копирање</doclink>\n* <doclink href=UpgradeDoc>Надградување</doclink>",
-    "config-env-good": "Ð\9eколинаÑ\82а Ðµ Ð¿Ñ\80овеÑ\80ена.\nÐ\9cожеÑ\82е Ð´Ð° Ð³Ð¾ Ð¸Ð½Ñ\81Ñ\82алиÑ\80ате МедијаВики.",
-    "config-env-bad": "Ð\9eколинаÑ\82а Ðµ Ð¿Ñ\80овеÑ\80ена.\nÐ\9dе Ð¼Ð¾Ð¶ÐµÑ\82е Ð´Ð° Ð³Ð¾ Ð¸Ð½Ñ\81Ñ\82алиÑ\80ате МедијаВики.",
-    "config-env-php": "PHP $1 Ðµ Ð¸Ð½Ñ\81Ñ\82алиÑ\80ан.",
-    "config-env-php-toolow": "PHP $1 Ðµ Ð¸Ð½Ñ\81Ñ\82алиÑ\80ан.\nМеѓутоа, МедијаВики бара PHP $2 или поново.",
+    "config-env-good": "Ð\9eколинаÑ\82а Ðµ Ð¿Ñ\80овеÑ\80ена.\nÐ\9cожеÑ\82е Ð´Ð° Ð³Ð¾ Ð²Ð¾Ñ\81поÑ\81Ñ\82авите МедијаВики.",
+    "config-env-bad": "Ð\9eколинаÑ\82а Ðµ Ð¿Ñ\80овеÑ\80ена.\nÐ\9dе Ð¼Ð¾Ð¶ÐµÑ\82е Ð´Ð° Ð³Ð¾ Ð²Ð¾Ñ\81поÑ\81Ñ\82авите МедијаВики.",
+    "config-env-php": "PHP $1 Ðµ Ð²Ð¾Ñ\81поÑ\81Ñ\82авен.",
+    "config-env-php-toolow": "PHP $1 Ðµ Ð²Ð¾Ñ\81поÑ\81Ñ\82авен.\nМеѓутоа, МедијаВики бара PHP $2 или поново.",
     "config-unicode-using-utf8": "Со utf8_normalize.so за уникодна нормализација од Брајон Вибер (Brion Vibber).",
     "config-unicode-using-intl": "Со додатокот [http://pecl.php.net/intl intl PECL] за уникодна нормализација.",
     "config-unicode-pure-php-warning": "'''Предупредување''': Додатокот [http://pecl.php.net/intl intl PECL] не е достапен за врши уникодна нормализација, враќајќи се на бавна примена на чист PHP.\n\nАко имате високопрометно мрежно место, тогаш ќе треба да прочитате повеќе за [//www.mediawiki.org/wiki/Unicode_normalization_considerations уникодната нормализација].",
-    "config-unicode-update-warning": "'''Предупредување''': Инсталираната верзија на обвивката за уникодна нормализација користи постара верзија на библиотеката на [http://site.icu-project.org/ проектот ICU].\nЗа да користите Уникод, ќе треба да направите [//www.mediawiki.org/wiki/Unicode_normalization_considerations надградба].",
-    "config-no-db": "Ð\9dе Ð¼Ð¾Ð¶ÐµÐ² Ð´Ð° Ð¿Ñ\80онаÑ\98дам Ñ\81оодвеÑ\82ен Ð´Ð²Ð¸Ð³Ð°Ñ\82ел Ð·Ð° Ð±Ð°Ð·Ð°Ñ\82а Ð½Ð° Ð¿Ð¾Ð´Ð°Ñ\82оÑ\86и! Ð\8cе Ñ\82Ñ\80еба Ð´Ð° Ð¸Ð½Ñ\81Ñ\82алиÑ\80аÑ\82е Ð´Ð²Ð¸Ð³Ð°Ñ\82ел Ð·Ð° Ð±Ð°Ð·Ð°Ñ\82а Ð½Ð° Ð¿Ð¾Ð´Ð°Ñ\82оÑ\86и Ð·Ð° PHP.\nÐ\9fоддÑ\80жани Ñ\81е Ñ\81ледниве Ñ\82ипови Ð½Ð° Ð±Ð°Ð·Ð¸ $1.\n\nÐ\90ко Ñ\81Ñ\82е Ð½Ð° Ð·Ð°ÐµÐ´Ð½Ð¸Ñ\87ко (Ñ\81поделено) Ð²Ð´Ð¾Ð¼Ñ\83ваÑ\9aе, Ð¿Ð¾Ð±Ð°Ñ\80аÑ\98Ñ\82е Ð¼Ñ\83 Ð½Ð° Ð²Ð´Ð¾Ð¼Ð¸Ñ\82елоÑ\82 Ð´Ð° Ð¸Ð½Ñ\81Ñ\82алиÑ\80а Ñ\81оодвеÑ\82ен Ð´Ð²Ð¸Ð³Ð°Ñ\82ел Ð·Ð° Ð±Ð°Ð·Ð°Ñ\82а.\nÐ\90ко Ð²Ð¸Ðµ Ñ\81амиÑ\82е Ð³Ð¾ Ñ\81оÑ\81Ñ\82авивÑ\82е Ð¾Ð²Ð° PHP, Ñ\81менеÑ\82е Ð³Ð¸ Ð¿Ð¾Ñ\81Ñ\82авкиÑ\82е Ñ\82ака Ñ\88Ñ\82о Ñ\9cе Ð¾Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð¸Ñ\82е ÐºÐ»Ð¸ÐµÐ½Ñ\82 Ð½Ð° Ð±Ð°Ð·Ð°Ñ\82а - Ð½Ð° Ð¿Ñ\80. Ñ\81о ÐºÐ¾Ð´Ð¾Ñ\82 <code>./configure --with-mysql</code>.\nÐ\90ко Ð¸Ð½Ñ\81Ñ\82алиÑ\80авÑ\82е PHP Ð¾Ð´ Ð¿Ð°ÐºÐµÑ\82 Ð½Ð° Debian Ð¸Ð»Ð¸ Ubuntu, Ñ\82огаÑ\88 Ñ\9cе Ñ\82Ñ\80еба Ð´Ð° Ð³Ð¾ Ð¸Ð½Ñ\81Ñ\82алиÑ\80аÑ\82е Ð¸ Ð¼Ð¾Ð´Ñ\83лоÑ\82 php5-mysql.",
+    "config-unicode-update-warning": "'''Предупредување:''' Воспоставената верзија на обвивката за уникодна нормализација користи постара верзија на библиотеката на [http://site.icu-project.org/ проектот ICU].\nЗа да користите Уникод, ќе треба да направите [//www.mediawiki.org/wiki/Unicode_normalization_considerations надградба].",
+    "config-no-db": "Ð\9dе Ð¼Ð¾Ð¶ÐµÐ² Ð´Ð° Ð½Ð°Ñ\98дам Ñ\81оодвеÑ\82ен Ð´Ð²Ð¸Ð³Ð°Ñ\82ел Ð·Ð° Ð±Ð°Ð·Ð°Ñ\82а Ð½Ð° Ð¿Ð¾Ð´Ð°Ñ\82оÑ\86и! Ð\8cе Ñ\82Ñ\80еба Ð´Ð° Ð²Ð¾Ñ\81поÑ\81Ñ\82авиÑ\82е Ð´Ð²Ð¸Ð³Ð°Ñ\82ел Ð·Ð° PHP-база.\nÐ\9fоддÑ\80жани Ñ\81е Ñ\81ледниве Ð²Ð¸Ð´Ð¾Ð²Ð¸ Ð±Ð°Ð·Ð¸: $1.\n\nÐ\94околкÑ\83 Ñ\81амиÑ\82е Ð³Ð¾ Ñ\81Ñ\80оÑ\87ивÑ\82е Ð¾Ð²Ð¾Ñ\98 PHP, Ð¾Ð²Ð¾Ð·Ð¼Ð¾Ð¶ÐµÑ\82е Ð³Ð¾ Ð±Ð°Ð·Ð½Ð¸Ð¾Ñ\82 ÐºÐ»Ð¸ÐµÐ½Ñ\82 Ð²Ð¾ Ð¿Ð¾Ñ\81Ñ\82авкиÑ\82е â\80\94 Ð½Ð° Ð¿Ñ\80. Ñ\81о <code>./configure --with-mysqli</code>.\nÐ\90ко Ð¾Ð²Ð¾Ñ\98 PHP Ð³Ð¾ Ð²Ð¾Ñ\81поÑ\81Ñ\82авиÑ\82е Ð¾Ð´ Ð¿Ð°ÐºÐµÑ\82 Ð½Ð° Debian Ð¸Ð»Ð¸ Ubuntu, Ñ\82огаÑ\88 Ñ\9cе Ñ\82Ñ\80еба Ð¸Ñ\81Ñ\82о Ñ\82ака Ð´Ð° Ð³Ð¾ Ð²Ð¾Ñ\81поÑ\81Ñ\82авиÑ\82е, Ð½Ð° Ð¿Ñ\80., Ð¿Ð°ÐºÐµÑ\82оÑ\82 <code>php5-mysql</code>.",
     "config-outdated-sqlite": "'''Предупредување''': имате SQLite $1. Најстарата допуштена верзија е $2. Затоа, SQLite ќе биде недостапен.",
     "config-no-fts3": "'''Предупредување''': SQLite iе составен без модулот [//sqlite.org/fts3.html FTS3] - за оваа база нема да има можност за пребарување.",
     "config-register-globals": "'''Предупредување: Можноста <code>[http://php.net/register_globals register_globals]</code> за PHP е овозможена.'''\n'''Оневозможете ја ако е можно.'''\nМедијаВики ќе работи, но опслужувачот ви е изложен на безбедносни ризици.",
-    "config-magic-quotes-runtime": "'''Кобно: [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-runtime magic_quotes_runtime] е активно!'''\nОваа можност непредвидливо го расипува вносот на податоци.\nОваа можност мора да е исклучена. Во спротивно нема да можете да го инсталирате и користите МедијаВики.",
-    "config-magic-quotes-sybase": "'''Кобно: [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-sybase magic_quotes_sybase] е активно!'''\nОваа можност непредвидливо го расипува вносот на податоци.\nОваа можност мора да е исклучена. Во спротивно нема да можете да го инсталирате и користите МедијаВики.",
-    "config-mbstring": "'''Кобно: [http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload] е активно!'''\nОваа можност предизвикува грешки и може непредвидиво да го расипува вносот на податоци.\nОваа можност мора да е исклучена. Во спротивно нема да можете да го инсталирате и користите МедијаВики.",
-    "config-ze1": "'''Кобно: [http://www.php.net/manual/en/ini.core.php zend.ze1_compatibility_mode] е активно!'''\nОваа можност предизвикува ужасни грешки во МедијаВики.\nОваа можност мора да е исклучена. Во спротивно нема да можете да го инсталирате и користите МедијаВики.",
+    "config-magic-quotes-runtime": "'''Кобно: [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-runtime magic_quotes_runtime] е активно!'''\nОваа можност непредвидливо го расипува вносот на податоци.\nОваа можност мора да е исклучена. Во спротивно нема да можете да го воспоставите и користите МедијаВики.",
+    "config-magic-quotes-sybase": "'''Кобно: [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-sybase magic_quotes_sybase] е активно!'''\nОваа можност непредвидливо го расипува вносот на податоци.\nОваа можност мора да е исклучена. Во спротивно нема да можете да го воспоставите и користите МедијаВики.",
+    "config-mbstring": "'''Кобно: [http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload] е активно!'''\nОваа можност предизвикува грешки и може непредвидиво да го расипува вносот на податоци.\nОваа можност мора да е исклучена. Во спротивно нема да можете да го воспоставите и користите МедијаВики.",
     "config-safe-mode": "'''Предупредување:''' [http://www.php.net/features.safe-mode безбедниот режим] на PHP е активен.\nОва може да предизвика проблеми, особено ако користите подигања и поддршка за <code>math</code>.",
-    "config-xml-bad": "XML-модÑ\83лоÑ\82 Ð·Ð° PHP Ð½ÐµÐ´Ð¾Ñ\81Ñ\82аÑ\81Ñ\83ва.\nÐ\9cедиÑ\98аÐ\92ики Ð¸Ð¼Ð° Ð¿Ð¾Ñ\82Ñ\80еба Ð¾Ð´ Ñ\84Ñ\83нкÑ\86ии Ð²Ð¾ Ð¾Ð²Ð¾Ñ\98 Ð¼Ð¾Ð´Ñ\83л Ð¸ Ð½ÐµÐ¼Ð° Ð´Ð° Ñ\80абоÑ\82и Ñ\81о Ð¾Ð²Ð¸Ðµ Ð¿Ð¾Ñ\81Ñ\82авки.\nÐ\90ко Ñ\80абоÑ\82иÑ\82е Ñ\81о Mandrake, Ð¸Ð½Ñ\81Ñ\82алиÑ\80аÑ\98Ñ\82е Ð³Ð¾ php-xml Ð¿Ð°ÐºÐµÑ\82оÑ\82.",
-    "config-pcre": "Недостасува модулот за поддршка на PCRE.\nМедијаВики не може да работи без функции за регуларни изрази соодветни на Perl.",
+    "config-xml-bad": "XML-модÑ\83лоÑ\82 Ð·Ð° PHP Ð½ÐµÐ´Ð¾Ñ\81Ñ\82аÑ\81Ñ\83ва.\nÐ\9cедиÑ\98аÐ\92ики Ð¸Ð¼Ð° Ð¿Ð¾Ñ\82Ñ\80еба Ð¾Ð´ Ñ\84Ñ\83нкÑ\86ии Ð²Ð¾ Ð¾Ð²Ð¾Ñ\98 Ð¼Ð¾Ð´Ñ\83л Ð¸ Ð½ÐµÐ¼Ð° Ð´Ð° Ñ\80абоÑ\82и Ñ\81о Ð¾Ð²Ð¸Ðµ Ð¿Ð¾Ñ\81Ñ\82авки.\nÐ\90ко Ñ\80абоÑ\82иÑ\82е Ñ\81о Mandrake, Ð²Ð¾Ñ\81поÑ\81Ñ\82авеÑ\82е Ð³Ð¾ Ð¿Ð°ÐºÐµÑ\82оÑ\82 php-xml.",
+    "config-pcre-old": "'''Кобно:''' Се бара PCRE $1 или понова верзија.\nВашиот PHP-бинарен е сврзан со PCRE $2.\n[https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/PCRE Повеќе информации].",
     "config-pcre-no-utf8": "'''Фатално''': PCRE-модулот на PHP е составен без поддршка за PCRE_UTF8.\nМедијаВики бара поддршка за UTF-8 за да може да работи правилно.",
     "config-memory-raised": "<code>memory_limit</code> за PHP изнесува $1, зголемен на $2.",
-    "config-memory-bad": "'''Ð\9fÑ\80едÑ\83пÑ\80едÑ\83ваÑ\9aе:''' <code>memory_limit</code> Ð·Ð° PHP Ð¸Ð·Ð½ÐµÑ\81Ñ\83ва $1.\nÐ\9eва Ðµ Ð²ÐµÑ\80оÑ\98аÑ\82но Ð¿Ñ\80емалкÑ\83.\nÐ\98нÑ\81Ñ\82алаÑ\86иÑ\98ата може да не успее!",
+    "config-memory-bad": "'''Ð\9fÑ\80едÑ\83пÑ\80едÑ\83ваÑ\9aе:''' <code>memory_limit</code> Ð·Ð° PHP Ð¸Ð·Ð½ÐµÑ\81Ñ\83ва $1.\nÐ\9eва Ðµ Ð²ÐµÑ\80оÑ\98аÑ\82но Ð¿Ñ\80емалкÑ\83.\nÐ\92оÑ\81поÑ\81Ñ\82авката може да не успее!",
     "config-ctype": "'''Фатална грешка''': PHP мора да се состави со поддршка за [http://www.php.net/manual/en/ctype.installation.php додатокот Ctype].",
-    "config-json": "'''Ð\9aобно:''' PHP Ð±ÐµÑ\88е Ñ\81Ñ\80оÑ\87ен Ð±ÐµÐ· Ð¿Ð¾Ð´Ð´Ñ\80Ñ\88ка Ð¾Ð´ JSON.\nÐ\8cе Ð¼Ð¾Ñ\80а Ð´Ð° Ð³Ð¾ Ð¸Ð½Ñ\81Ñ\82алиÑ\80аÑ\82е Ð´Ð¾Ð´Ð°Ñ\82окоÑ\82 Ð·Ð° JSON Ð²Ð¾ PHP, Ð¸Ð»Ð¸ Ð´Ð¾Ð´Ð°Ñ\82окоÑ\82 [http://pecl.php.net/package/jsonc PECL jsonc] Ð¿Ñ\80ед Ð´Ð° Ð³Ð¾ Ð¸Ð½Ñ\81Ñ\82алиÑ\80ате МедијаВики.\n* Додатокот за PHP е вклучен во верзиите 5 и 6 на Linux (од Red Hat Enterprise) (CentOS), но мора да се активира во <code>/etc/php.ini</code> или <code>/etc/php.d/json.ini</code>.\n* Некои варијанти на Linux излезени по мај 2013 г. не го содржат додатокот за PHP, туку го пакуваат додатокот PECL како <code>php5-json</code> или <code>php-pecl-jsonc</code>.",
-    "config-xcache": "[http://xcache.lighttpd.net/ XCache] Ðµ Ð¸Ð½Ñ\81Ñ\82алиÑ\80ан",
-    "config-apc": "[http://www.php.net/apc APC] Ðµ Ð¸Ð½Ñ\81Ñ\82алиÑ\80ан",
-    "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache] Ðµ Ð¸Ð½Ñ\81Ñ\82алиÑ\80ан",
-    "config-no-cache": "'''Предупредување:''' Не можев да го најдам [http://www.php.net/apc APC], [http://xcache.lighttpd.net/ XCache] или [http://www.iis.net/download/WinCacheForPhp WinCache].\nКеширањето на објекти не е овозможено.",
+    "config-json": "'''Ð\9aобно:''' PHP Ð±ÐµÑ\88е Ñ\81Ñ\80оÑ\87ен Ð±ÐµÐ· Ð¿Ð¾Ð´Ð´Ñ\80Ñ\88ка Ð¾Ð´ JSON.\nÐ\8cе Ð¼Ð¾Ñ\80а Ð´Ð° Ð³Ð¾ Ð²Ð¾Ñ\81поÑ\81Ñ\82авиÑ\82е Ð´Ð¾Ð´Ð°Ñ\82окоÑ\82 Ð·Ð° JSON Ð²Ð¾ PHP, Ð¸Ð»Ð¸ Ð´Ð¾Ð´Ð°Ñ\82окоÑ\82 [http://pecl.php.net/package/jsonc PECL jsonc] Ð¿Ñ\80ед Ð´Ð° Ð³Ð¾ Ð²Ð¾Ñ\81поÑ\81Ñ\82авите МедијаВики.\n* Додатокот за PHP е вклучен во верзиите 5 и 6 на Linux (од Red Hat Enterprise) (CentOS), но мора да се активира во <code>/etc/php.ini</code> или <code>/etc/php.d/json.ini</code>.\n* Некои варијанти на Linux излезени по мај 2013 г. не го содржат додатокот за PHP, туку го пакуваат додатокот PECL како <code>php5-json</code> или <code>php-pecl-jsonc</code>.",
+    "config-xcache": "[http://xcache.lighttpd.net/ XCache] Ðµ Ð²Ð¾Ñ\81поÑ\81Ñ\82авен",
+    "config-apc": "[http://www.php.net/apc APC] Ðµ Ð²Ð¾Ñ\81поÑ\81Ñ\82авен",
+    "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache] Ðµ Ð²Ð¾Ñ\81поÑ\81Ñ\82авен",
+    "config-no-cache": "<strong>Предупредување:</strong> Не можев да го најдам [http://www.php.net/apc APC], [http://xcache.lighttpd.net/ XCache] или [http://www.iis.net/download/WinCacheForPhp WinCache].\nМеѓускладирањето на објекти не е овозможено.",
     "config-mod-security": "'''Предупредување''': на вашиот опслужувач има овозможено [http://modsecurity.org/ mod_security]. Ако не е поставено како што треба, ова може да предизвика проблеми кај МедијаВики и други програми што им овозможуваат на корисниците да објавуваат произволни содржини.\nПогледнете ја [http://modsecurity.org/documentation/ mod_security документацијата] или обратете се кај домаќинот ако наидете на случајни грешки.",
     "config-diff3-bad": "GNU diff3 не е пронајден.",
     "config-git": "Го пронајдов Git програмот за контрола на верзии: <code>$1</code>.",
     "config-imagemagick": "Пронајден е ImageMagick: <code>$1</code>.\nАко овозможите подигање, тогаш ќе биде овозможена минијатуризација на сликите.",
     "config-gd": "Утврдив дека има вградена GD графичка библиотека.\nАко овозможите подигање, тогаш ќе биде овозможена минијатураизација на сликите.",
     "config-no-scaling": "Не можев да пронајдам GD-библиотека или ImageMagick.\nМинијатуризацијата на сликите ќе биде оневозможена.",
-    "config-no-uri": "'''Ð\93Ñ\80еÑ\88ка:''' Ð\9dе Ð¼Ð¾Ð¶ÐµÐ² Ð´Ð° Ð³Ð¾ Ñ\83Ñ\82вÑ\80дам Ñ\82ековниоÑ\82 URI.\nÐ\98нÑ\81Ñ\82алаÑ\86иÑ\98ата е откажана.",
-    "config-no-cli-uri": "'''Предупредување''': Нема наведено --scriptpath. Ќе се користи основниот: <code>$1</code>.",
+    "config-no-uri": "'''Ð\93Ñ\80еÑ\88ка:''' Ð\9dе Ð¼Ð¾Ð¶ÐµÐ² Ð´Ð° Ð³Ð¾ Ñ\83Ñ\82вÑ\80дам Ñ\82ековниоÑ\82 URI.\nÐ\92оÑ\81поÑ\81Ñ\82авката е откажана.",
+    "config-no-cli-uri": "'''Предупредување''': Нема наведено <code>--scriptpath</code>. Ќе се користи основниот: <code>$1</code>.",
     "config-using-server": "Користите опслужувач под името „<nowiki>$1</nowiki>“.",
     "config-using-uri": "Користите опслужувач со URL-адреса „<nowiki>$1$2</nowiki>“.",
     "config-uploads-not-safe": "'''Предупредување:''' Вашата матична папка за подигање <code>$1</code> е подложна на извршување (пуштање) на произволни скрипти.\nИако МедијаВики врши безбедносни проверки на сите подигнати податотеки, ве советуваме [//www.mediawiki.org/wiki/Manual:Security#Upload_security да ја затворите оваа безбедносна дупка] пред да овозможите подигање.",
-    "config-no-cli-uploads-check": "'''Предупредување:''' Вашата основна папка за подигања (<code>$1</code>) не е проверена дали е подложна\nпроизволно извршување на скрипти во текот на инсталацијата на посредникот на повикувачко ниво (CLI).",
-    "config-brokenlibxml": "Вашиот систем има комбинација од PHP и libxml2 верзии и затоа има грешки и може да предизвика скриено расипување на податоците кај МедијаВики и други мрежни програми.\nНадградете го на PHP 5.2.9 и libxml2 2.7.3 или нивни понови верзии! ПРЕКИНУВАМ ([//bugs.php.net/bug.php?id=45996 грешката е заведена во PHP]).",
-    "config-using531": "МедијаВики не може да се користи со PHP $1 поради грешка кај упатните параметри за <code>__call()</code>.\nЗа да го решите проблемот, надградете го на PHP 5.3.2 или понова верзија, или пак користете го постариот PHP 5.3.0.",
-    "config-suhosin-max-value-length": "Suhosin е инсталиран и ја ограничува должината на параметарот GET на $1 бајти. Делот ResourceLoader на МедијаВики ќе ја заобиколува ова граница, но со тоа ќе се влоши делотворноста. Ако е воопшто можно, на <code>suhosin.get.max_value_length</code> треба да го наместите на 1024 или повеќе во <code>php.ini</code>, и да му ја зададете истата вредност на <code>$wgResourceLoaderMaxQueryLength</code> во <code>LocalSettings.php</code>.",
+    "config-no-cli-uploads-check": "'''Предупредување:''' Вашата основна папка за подигања (<code>$1</code>) не е проверена дали е подложна\nпроизволно извршување на скрипти во текот на воспоставката на посредникот на повикувачко ниво (CLI).",
+    "config-brokenlibxml": "Вашиот систем има комбинација од PHP и libxml2 верзии и затоа има грешки и може да предизвика скриено расипување на податоците кај МедијаВики и други мрежни програми.\nНадградете го на libxml2 2.7.3 или нивни понови верзии! ([https://bugs.php.net/bug.php?id=45996 грешката е заведена во PHP]). Воспоставката е откажана.",
+    "config-suhosin-max-value-length": "Suhosin е воспоставен и ја ограничува должината на параметарот GET на $1 бајти. Делот ResourceLoader на МедијаВики ќе ја заобиколува ова граница, но со тоа ќе се влоши делотворноста. Ако е воопшто можно, на <code>suhosin.get.max_value_length</code> треба да го наместите на 1024 или повеќе во <code>php.ini</code>, и да му ја зададете истата вредност на <code>$wgResourceLoaderMaxQueryLength</code> во <code>LocalSettings.php</code>.",
     "config-db-type": "Тип на база:",
     "config-db-host": "Домаќин на базата:",
-    "config-db-host-help": "Ð\90ко Ð²Ð°Ñ\88аÑ\82а Ð±Ð°Ð·Ð° Ðµ Ð½Ð° Ð´Ñ\80Ñ\83г Ð¾Ð¿Ñ\81лÑ\83жÑ\83ваÑ\87, Ñ\82огаÑ\88 Ñ\82Ñ\83ка Ð²Ð½ÐµÑ\81еÑ\82е Ð³Ð¾ Ð¸Ð¼ÐµÑ\82о Ð½Ð° Ð´Ð¾Ð¼Ð°Ñ\9cиноÑ\82 Ð¸Ð»Ð¸ IP-адÑ\80еÑ\81аÑ\82а.\n\nÐ\90ко ÐºÐ¾Ñ\80иÑ\81Ñ\82иÑ\82е Ð·Ð°ÐµÐ´Ð½Ð¸Ñ\87ко (Ñ\81поделено) Ð²Ð´Ð¾Ð¼Ñ\83ваÑ\9aе, Ñ\82огаÑ\88 Ð²Ð°Ñ\88иоÑ\82 Ð²Ð´Ð¾Ð¼Ð¸Ñ\82ел Ñ\82Ñ\80еба Ð´Ð° Ð³Ð¾ Ð½Ð°Ð²ÐµÐ´Ðµ Ñ\82оÑ\87ноÑ\82о Ð¸Ð¼Ðµ Ð½Ð° Ð´Ð¾Ð¼Ð°Ñ\9cиноÑ\82 Ð²Ð¾ Ð½ÐµÐ³Ð¾Ð²Ð°Ñ\82а Ð´Ð¾ÐºÑ\83менÑ\82аÑ\86иÑ\98а.\n\nÐ\90ко Ð¸Ð½Ñ\81Ñ\82алиÑ\80ате на опслужувач на Windows и користите MySQL, можноста „localhost“ може да не функционира за опслужувачкото име. Во тој случај, обидете се со внесување на „127.0.0.1“ како локална IP-адреса.\n\nАко користите PostgreSQL, оставете го полево празно за да се поврзете преку Unix-приклучок.",
+    "config-db-host-help": "Ð\90ко Ð²Ð°Ñ\88аÑ\82а Ð±Ð°Ð·Ð° Ðµ Ð½Ð° Ð´Ñ\80Ñ\83г Ð¾Ð¿Ñ\81лÑ\83жÑ\83ваÑ\87, Ñ\82огаÑ\88 Ñ\82Ñ\83ка Ð²Ð½ÐµÑ\81еÑ\82е Ð³Ð¾ Ð¸Ð¼ÐµÑ\82о Ð½Ð° Ð´Ð¾Ð¼Ð°Ñ\9cиноÑ\82 Ð¸Ð»Ð¸ IP-адÑ\80еÑ\81аÑ\82а.\n\nÐ\90ко ÐºÐ¾Ñ\80иÑ\81Ñ\82иÑ\82е Ð·Ð°ÐµÐ´Ð½Ð¸Ñ\87ко (Ñ\81поделено) Ð²Ð´Ð¾Ð¼Ñ\83ваÑ\9aе, Ñ\82огаÑ\88 Ð²Ð°Ñ\88иоÑ\82 Ð²Ð´Ð¾Ð¼Ð¸Ñ\82ел Ñ\82Ñ\80еба Ð´Ð° Ð³Ð¾ Ð½Ð°Ð²ÐµÐ´Ðµ Ñ\82оÑ\87ноÑ\82о Ð¸Ð¼Ðµ Ð½Ð° Ð´Ð¾Ð¼Ð°Ñ\9cиноÑ\82 Ð²Ð¾ Ð½ÐµÐ³Ð¾Ð²Ð°Ñ\82а Ð´Ð¾ÐºÑ\83менÑ\82аÑ\86иÑ\98а.\n\nÐ\90ко Ð²Ð¾Ñ\81поÑ\81Ñ\82авÑ\83вате на опслужувач на Windows и користите MySQL, можноста „localhost“ може да не функционира за опслужувачкото име. Во тој случај, обидете се со внесување на „127.0.0.1“ како локална IP-адреса.\n\nАко користите PostgreSQL, оставете го полево празно за да се поврзете преку Unix-приклучок.",
     "config-db-host-oracle": "TNS на базата:",
-    "config-db-host-oracle-help": "Ð\92неÑ\81еÑ\82е Ð²Ð°Ð¶ÐµÑ\87ко [http://download.oracle.com/docs/cd/B28359_01/network.111/b28317/tnsnames.htm Ð»Ð¾ÐºÐ°Ð»Ð½Ð¾ Ð¸Ð¼Ðµ Ð·Ð° Ð¿Ð¾Ð²Ñ\80зÑ\83ваÑ\9aе]. Ð\9dа Ð¾Ð²Ð°Ð° Ð¸Ð½Ñ\81Ñ\82алаÑ\86иÑ\98а мора да ѝ биде видлива податотеката tnsnames.ora.<br />Ако користите клиентски библиотеки 10g или понови, тогаш можете да го користите и методот на иметнување на [http://download.oracle.com/docs/cd/E11882_01/network.112/e10836/naming.htm Easy Connect].",
+    "config-db-host-oracle-help": "Ð\92неÑ\81еÑ\82е Ð²Ð°Ð¶ÐµÑ\87ко [http://download.oracle.com/docs/cd/B28359_01/network.111/b28317/tnsnames.htm Ð»Ð¾ÐºÐ°Ð»Ð½Ð¾ Ð¸Ð¼Ðµ Ð·Ð° Ð¿Ð¾Ð²Ñ\80зÑ\83ваÑ\9aе]. Ð\9dа Ð¾Ð²Ð°Ð° Ð²Ð¾Ñ\81поÑ\81Ñ\82авка мора да ѝ биде видлива податотеката tnsnames.ora.<br />Ако користите клиентски библиотеки 10g или понови, тогаш можете да го користите и методот на иметнување на [http://download.oracle.com/docs/cd/E11882_01/network.112/e10836/naming.htm Easy Connect].",
     "config-db-wiki-settings": "Идентификувај го викиво",
     "config-db-name": "Име на базата:",
     "config-db-name-help": "Одберете име што ќе го претставува вашето вики.\nИмето не смее да содржи празни места.\n\nАко користите заедничко (споделено) вдомување, тогаш вашиот вдомител ќе ви даде конкретно име на база за користење, или пак ќе ви даде да создавате бази преку контролната табла.",
     "config-db-name-oracle": "Шема на базата:",
-    "config-db-account-oracle-warn": "Ð\9fоÑ\81Ñ\82оÑ\98аÑ\82 Ñ\82Ñ\80и Ð¿Ð¾Ð´Ð´Ñ\80жани Ñ\81Ñ\86енаÑ\80иÑ\98а Ð·Ð° Ð¸Ð½Ñ\81Ñ\82алиÑ\80аÑ\9aе Ð½Ð° Oracle ÐºÐ°ÐºÐ¾ Ð±Ð°Ð·ÐµÐ½ Ñ\83Ñ\81лÑ\83жник:\n\nÐ\90ко Ñ\81акаÑ\82е Ð´Ð° Ñ\81оздадеÑ\82е Ñ\81меÑ\82ка Ð½Ð° Ð±Ð°Ð·Ð°Ñ\82а ÐºÐ°ÐºÐ¾ Ð´ÐµÐ» Ð¾Ð´ Ð¿Ð¾Ñ\81Ñ\82апкаÑ\82а Ð·Ð° Ð¸Ð½Ñ\81Ñ\82алаÑ\86иÑ\98а, Ð½Ð°Ð²ÐµÐ´ÐµÑ\82е Ñ\81меÑ\82ка Ñ\81о SYSDBA-Ñ\83лога ÐºÐ°ÐºÐ¾ Ñ\81меÑ\82ка Ð·Ð° Ð±Ð°Ð·Ð°Ñ\82а Ñ\88Ñ\82о Ñ\9cе Ñ\81е Ð¸Ð½Ñ\81Ñ\82алиÑ\80а Ð¸ Ð½Ð°Ð²ÐµÐ´ÐµÑ\82е Ð³Ð¸ Ñ\81аканиÑ\82е Ð¿Ð¾Ð´Ð°Ñ\82оÑ\86и Ð·Ð° Ñ\81меÑ\82каÑ\82а Ð·Ð° Ð¼Ñ\80ежен Ð¿Ñ\80иÑ\81Ñ\82ап. Ð\92о Ð´Ñ\80Ñ\83г Ñ\81лÑ\83Ñ\87аÑ\98, Ð¼Ð¾Ð¶ÐµÑ\82е Ð´Ð° Ñ\81оздадеÑ\82е Ñ\81меÑ\82ка Ð·Ð° Ð¼Ñ\80ежен Ð¿Ñ\80иÑ\81Ñ\82ап Ñ\80аÑ\87но Ð¸ Ð´Ð° Ñ\98а Ð½Ð°Ð²ÐµÐ´ÐµÑ\82е Ñ\81амо Ñ\82аа Ñ\81меÑ\82ка (ако Ð¸Ð¼Ð° Ð´Ð¾Ð·Ð²Ð¾Ð»Ð¸ Ð·Ð° Ñ\81оздаваÑ\9aе Ð½Ð° Ñ\88емаÑ\82Ñ\81ки Ð¾Ð±Ñ\98екÑ\82и) Ð¸Ð»Ð¸ Ð¿Ð°Ðº Ð´Ð° Ð½Ð°Ð²ÐµÐ´ÐµÑ\82е Ð´Ð²Ðµ Ñ\80азлиÑ\87ни Ñ\81меÑ\82ки, ÐµÐ´Ð½Ð° Ñ\81о Ð¿Ñ\80ивилегии Ð·Ð° Ñ\81оздаваÑ\9aе, Ð° Ð´Ñ\80Ñ\83га (огÑ\80аниÑ\87ена) Ð·Ð° Ð¼Ñ\80ежен Ð¿Ñ\80иÑ\81Ñ\82ап.\n\nСкÑ\80ипÑ\82аÑ\82а Ð·Ð° Ñ\81оздаваÑ\9aе Ñ\81меÑ\82ка Ñ\81о Ð·Ð°Ð´Ð¾Ð»Ð¶Ð¸Ñ\82елни Ð¿Ñ\80ивилегии Ñ\9cе Ñ\98а Ð½Ð°Ñ\98деÑ\82е Ð²Ð¾ Ð¿Ð°Ð¿ÐºÐ°Ñ\82а â\80\9emaintenance/oracle/â\80\9c Ð¾Ð´ Ð¾Ð²Ð°Ð° Ð¸Ð½Ñ\81Ñ\82алаÑ\86иÑ\98а. Имајте на ум дека ако користите ограничена сметка ќе ги оневозможите сите функции за одржување со основната сметка.",
-    "config-db-install-account": "Ð\9aоÑ\80иÑ\81ниÑ\87ка Ñ\81меÑ\82а Ð·Ð° Ð¸Ð½Ñ\81Ñ\82алаÑ\86иÑ\98а",
+    "config-db-account-oracle-warn": "Ð\9fоÑ\81Ñ\82оÑ\98аÑ\82 Ñ\82Ñ\80и Ð¿Ð¾Ð´Ð´Ñ\80жани Ñ\81Ñ\86енаÑ\80иÑ\98а Ð·Ð° Ð²Ð¾Ñ\81поÑ\81Ñ\82авка Ð½Ð° Oracle ÐºÐ°ÐºÐ¾ Ð±Ð°Ð·ÐµÐ½ Ñ\83Ñ\81лÑ\83жник:\n\nÐ\90ко Ñ\81акаÑ\82е Ð´Ð° Ñ\81оздадеÑ\82е Ñ\81меÑ\82ка Ð½Ð° Ð±Ð°Ð·Ð°Ñ\82а ÐºÐ°ÐºÐ¾ Ð´ÐµÐ» Ð¾Ð´ Ð¿Ð¾Ñ\81Ñ\82апкаÑ\82а Ð·Ð° Ð²Ð¾Ñ\81поÑ\81Ñ\82авка, Ð½Ð°Ð²ÐµÐ´ÐµÑ\82е Ñ\81меÑ\82ка Ñ\81о SYSDBA-Ñ\83лога ÐºÐ°ÐºÐ¾ Ñ\81меÑ\82ка Ð·Ð° Ð±Ð°Ð·Ð°Ñ\82а Ñ\88Ñ\82о Ñ\9cе Ñ\81е Ð²Ð¾Ñ\81поÑ\81Ñ\82ави Ð¸ Ð½Ð°Ð²ÐµÐ´ÐµÑ\82е Ð³Ð¸ Ñ\81аканиÑ\82е Ð¿Ð¾Ð´Ð°Ñ\82оÑ\86и Ð·Ð° Ñ\81меÑ\82каÑ\82а Ð·Ð° Ð¼Ñ\80ежен Ð¿Ñ\80иÑ\81Ñ\82ап. Ð\92о Ð´Ñ\80Ñ\83г Ñ\81лÑ\83Ñ\87аÑ\98, Ð¼Ð¾Ð¶ÐµÑ\82е Ð´Ð° Ñ\81оздадеÑ\82е Ñ\81меÑ\82ка Ð·Ð° Ð¼Ñ\80ежен Ð¿Ñ\80иÑ\81Ñ\82ап Ñ\80аÑ\87но Ð¸ Ð´Ð° Ñ\98а Ð½Ð°Ð²ÐµÐ´ÐµÑ\82е Ñ\81амо Ñ\82аа Ñ\81меÑ\82ка (ако Ð¸Ð¼Ð° Ð´Ð¾Ð·Ð²Ð¾Ð»Ð¸ Ð·Ð° Ñ\81оздаваÑ\9aе Ð½Ð° Ñ\88емаÑ\82Ñ\81ки Ð¾Ð±Ñ\98екÑ\82и) Ð¸Ð»Ð¸ Ð¿Ð°Ðº Ð´Ð° Ð½Ð°Ð²ÐµÐ´ÐµÑ\82е Ð´Ð²Ðµ Ñ\80азлиÑ\87ни Ñ\81меÑ\82ки, ÐµÐ´Ð½Ð° Ñ\81о Ð¿Ñ\80ивилегии Ð·Ð° Ñ\81оздаваÑ\9aе, Ð° Ð´Ñ\80Ñ\83га (огÑ\80аниÑ\87ена) Ð·Ð° Ð¼Ñ\80ежен Ð¿Ñ\80иÑ\81Ñ\82ап.\n\nСкÑ\80ипÑ\82аÑ\82а Ð·Ð° Ñ\81оздаваÑ\9aе Ñ\81меÑ\82ка Ñ\81о Ð·Ð°Ð´Ð¾Ð»Ð¶Ð¸Ñ\82елни Ð¿Ñ\80ивилегии Ñ\9cе Ñ\98а Ð½Ð°Ñ\98деÑ\82е Ð²Ð¾ Ð¿Ð°Ð¿ÐºÐ°Ñ\82а â\80\9emaintenance/oracle/â\80\9c Ð¾Ð´ Ð¾Ð²Ð°Ð° Ð²Ð¾Ñ\81поÑ\81Ñ\82авка. Имајте на ум дека ако користите ограничена сметка ќе ги оневозможите сите функции за одржување со основната сметка.",
+    "config-db-install-account": "Ð\9aоÑ\80иÑ\81ниÑ\87ка Ñ\81меÑ\82а Ð·Ð° Ð²Ð¾Ñ\81поÑ\81Ñ\82авка",
     "config-db-username": "Корисничко име за базата:",
     "config-db-password": "Лозинка за базата:",
     "config-db-password-empty": "Внесете лозинка за новиот корисник на базата: $1.\nИако може да се создаваат корисници без лозинка, тоа не е безбедно.",
-    "config-db-install-username": "Внесете корисничко име што ќе се користи за поврзување со базата во текот на инсталацијата. Ова не е корисничкото име од сметката на МедијаВики, туку посебно корисничко име за вашата база на податоци.",
-    "config-db-install-password": "Внесете клозинка што ќе се користи за поврзување со базата во текот на инсталацијата. Ова не е лозинката од сметката на МедијаВики, туку посебна лозинка за вашата база на податоци.",
-    "config-db-install-help": "Внесете го корисничкото име и лозинката што ќе се користи за поврзување со базата на податоци во текот на инсталацијата.",
+    "config-db-username-empty": "Мора да внесете вредност за „{{int:config-db-username}}“.",
+    "config-db-install-username": "Внесете корисничко име што ќе се користи за поврзување со базата во текот на воспоставката. Ова не е корисничкото име од сметката на МедијаВики, туку посебно корисничко име за вашата база на податоци.",
+    "config-db-install-password": "Внесете клозинка што ќе се користи за поврзување со базата во текот на воспоставката. Ова не е лозинката од сметката на МедијаВики, туку посебна лозинка за вашата база на податоци.",
+    "config-db-install-help": "Внесете го корисничкото име и лозинката што ќе се користи за поврзување со базата на податоци во текот на воспоставката.",
     "config-db-account-lock": "Користи го истото корисничко име и лозинка за редовна работа",
     "config-db-wiki-account": "Корисничко име за редовна работа",
     "config-db-wiki-help": "Внесете корисничко име и лозинка што ќе се користат за поврзување со базата на податоци во текот на редовната работа со викито.\nАко сметката не постои, а инсталационата сметка има доволно привилегии, тогаш оваа корисничка сметка ќе биде создадена со минималните привилегии потребни за работа со викито.",
     "config-db-schema-help": "Оваа шема обично по правило ќе работи нормално.\nСменете ја само ако знаете дека треба да се смени.",
     "config-pg-test-error": "Не можам да се поврзам со базата '''$1''': $2",
     "config-sqlite-dir": "Папка на SQLite-податоци:",
-    "config-sqlite-dir-help": "SQLite Ð³Ð¸ Ñ\81кладиÑ\80а Ñ\81иÑ\82е Ð¿Ð¾Ð´Ð°Ñ\82оÑ\86и Ð²Ð¾ ÐµÐ´Ð½Ð° Ð¿Ð¾Ð´Ð°Ñ\82оÑ\82ека.\n\nÐ\9fапкаÑ\82а Ñ\88Ñ\82о Ñ\9cе Ñ\98а Ð½Ð°Ð²ÐµÐ´ÐµÑ\82е Ð¼Ð¾Ñ\80а Ð´Ð° Ðµ Ð·Ð°Ð¿Ð¸Ñ\81лива Ð¾Ð´ Ð¼Ñ\80ежниоÑ\82 Ð¾Ð¿Ñ\81лÑ\83жÑ\83ваÑ\87 Ð²Ð¾ Ñ\82екоÑ\82 Ð½Ð° Ð¸Ð½Ñ\81Ñ\82алаÑ\86иÑ\98аÑ\82а.\n\nТаа '''не''' Ñ\81мее Ð´Ð° Ð±Ð¸Ð´Ðµ Ð´Ð¾Ñ\81Ñ\82апна Ð¿Ñ\80екÑ\83 Ð¸Ð½Ñ\82еÑ\80неÑ\82, Ð¸ Ð·Ð°Ñ\82оа Ð½Ðµ Ñ\98а Ñ\81Ñ\82аваме ÐºÐ°Ñ\98Ñ\88Ñ\82о Ð²Ð¸ Ñ\81е Ð½Ð°Ð¾Ñ\93ааÑ\82 PHP-подаÑ\82оÑ\82екиÑ\82е.\n\nÐ\98нÑ\81Ñ\82алаÑ\82оÑ\80оÑ\82 Ð²Ð¾ÐµÐ´Ð½Ð¾ Ñ\9cе Ñ\81оздаде Ð¿Ð¾Ð´Ð°Ñ\82оÑ\82ека <code>.htaccess</code>, Ð½Ð¾ Ð°ÐºÐ¾ Ñ\82аа Ð½Ðµ Ñ\84Ñ\83нкÑ\86иониÑ\80а ÐºÐ°ÐºÐ¾ Ñ\88Ñ\82о Ñ\82Ñ\80еба, Ñ\82огаÑ\88 Ð½ÐµÐºÐ¾Ñ\98 Ñ\9cе Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ð²Ð¸ Ð²Ð»ÐµÐ·Ðµ Ð²Ð¾ Ð²Ð°Ñ\88аÑ\82а Ð½ÐµÐ¾Ð±Ñ\80абоÑ\82ена (Ñ\81иÑ\80ова) Ð±Ð°Ð·Ð° Ð½Ð° Ð¿Ð¾Ð´Ð°Ñ\82оÑ\86и.\nТÑ\83ка Ñ\81паÑ\93ааÑ\82 Ð½ÐµÐ¾Ð±Ñ\80абоÑ\82ени ÐºÐ¾Ñ\80иÑ\81ниÑ\87ки Ð¿Ð¾Ð´Ð°Ñ\82оÑ\86и (е-поÑ\88Ñ\82енÑ\81ки Ð°Ð´Ñ\80еÑ\81и, Ñ\85еÑ\88иÑ\80ани Ð»Ð¾Ð·Ð¸Ð½ÐºÐ¸) ÐºÐ°ÐºÐ¾ Ð¸ Ð¸Ð·Ð±Ñ\80иÑ\88ани Ñ\80евизии и други податоци за викито до кои се има ограничен пристап.\n\nСе препорачува целата база да ја сместите некаде, како на пр. <code>/var/lib/mediawiki/вашетовики</code>.",
+    "config-sqlite-dir-help": "SQLite Ð³Ð¸ Ñ\81кладиÑ\80а Ñ\81иÑ\82е Ð¿Ð¾Ð´Ð°Ñ\82оÑ\86и Ð²Ð¾ ÐµÐ´Ð½Ð° Ð¿Ð¾Ð´Ð°Ñ\82оÑ\82ека.\n\nÐ\9fапкаÑ\82а Ñ\88Ñ\82о Ñ\9cе Ñ\98а Ð½Ð°Ð²ÐµÐ´ÐµÑ\82е Ð¼Ð¾Ñ\80а Ð´Ð° Ðµ Ð·Ð°Ð¿Ð¸Ñ\81лива Ð¾Ð´ Ð¼Ñ\80ежниоÑ\82 Ð¾Ð¿Ñ\81лÑ\83жÑ\83ваÑ\87 Ð²Ð¾ Ñ\82екоÑ\82 Ð½Ð° Ð²Ð¾Ñ\81поÑ\81Ñ\82авкаÑ\82а.\n\nТаа '''не''' Ñ\81мее Ð´Ð° Ð±Ð¸Ð´Ðµ Ð´Ð¾Ñ\81Ñ\82апна Ð¿Ñ\80екÑ\83 Ñ\81емÑ\80ежÑ\98еÑ\82о, Ð¸ Ð·Ð°Ñ\82оа Ð½Ðµ Ñ\98а Ñ\81Ñ\82аваме ÐºÐ°Ñ\98Ñ\88Ñ\82о Ð²Ð¸ Ñ\81е Ð½Ð°Ð¾Ñ\93ааÑ\82 PHP-подаÑ\82оÑ\82екиÑ\82е.\n\nÐ\92оÑ\81поÑ\81Ñ\82авÑ\83ваÑ\87оÑ\82 Ð²Ð¾ÐµÐ´Ð½Ð¾ Ñ\9cе Ñ\81оздаде Ð¿Ð¾Ð´Ð°Ñ\82оÑ\82ека <code>.htaccess</code>, Ð½Ð¾ Ð°ÐºÐ¾ Ñ\82аа Ð½Ðµ Ñ\84Ñ\83нкÑ\86иониÑ\80а ÐºÐ°ÐºÐ¾ Ñ\88Ñ\82о Ñ\82Ñ\80еба, Ñ\82огаÑ\88 Ð½ÐµÐºÐ¾Ñ\98 Ñ\9cе Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ð²Ð¸ Ð²Ð»ÐµÐ·Ðµ Ð²Ð¾ Ð²Ð°Ñ\88аÑ\82а Ð½ÐµÐ¾Ð±Ñ\80абоÑ\82ена (Ñ\81иÑ\80ова) Ð±Ð°Ð·Ð° Ð½Ð° Ð¿Ð¾Ð´Ð°Ñ\82оÑ\86и.\nТÑ\83ка Ñ\81паÑ\93ааÑ\82 Ð½ÐµÐ¾Ð±Ñ\80абоÑ\82ени ÐºÐ¾Ñ\80иÑ\81ниÑ\87ки Ð¿Ð¾Ð´Ð°Ñ\82оÑ\86и (е-поÑ\88Ñ\82енÑ\81ки Ð°Ð´Ñ\80еÑ\81и, Ñ\85еÑ\88иÑ\80ани Ð»Ð¾Ð·Ð¸Ð½ÐºÐ¸) ÐºÐ°ÐºÐ¾ Ð¸ Ð¸Ð·Ð±Ñ\80иÑ\88ани Ð¿Ñ\80еÑ\80абоÑ\82ки и други податоци за викито до кои се има ограничен пристап.\n\nСе препорачува целата база да ја сместите некаде, како на пр. <code>/var/lib/mediawiki/вашетовики</code>.",
     "config-oracle-def-ts": "Стандарден таблеарен простор:",
     "config-oracle-temp-ts": "Привремен табеларен простор:",
-    "config-type-mysql": "MySQL",
+    "config-type-mysql": "MySQL (или складно)",
     "config-type-postgres": "PostgreSQL",
     "config-type-sqlite": "SQLite",
     "config-type-oracle": "Oracle",
+    "config-type-mssql": "Microsoft SQL Server",
     "config-support-info": "МедијаВики ги поддржува следниве системи на бази на податоци:\n\n$1\n\nАко системот што сакате да го користите не е наведен подолу, тогаш проследете ја горенаведената врска со инструкции за да овозможите поддршка за тој систем.",
-    "config-support-mysql": "* $1 е главната цел на МедијаВики и најдобро се поддржува ([http://www.php.net/manual/en/mysql.installation.php како се составува PHP со поддршка за MySQL])",
-    "config-support-postgres": "* $1 е популарен систем на бази на податоци со отворен код кој претставува алтернатива на MySQL ([http://www.php.net/manual/en/pgsql.installation.php како да составите PHP со поддршка за PostgreSQL]). Може сè уште да има некои грешки. па затоа не се препорачува за употреба во производна средина.",
-    "config-support-sqlite": "* $1 е лесен систем за бази на податоци кој е многу добро поддржан. ([http://www.php.net/manual/en/pdo.installation.php Како да составите PHP со поддршка за SQLite], користи PDO)",
-    "config-support-oracle": "* $1 е база на податоци на комерцијално претпријатие. ([http://www.php.net/manual/en/oci8.installation.php Како да составите PHP со поддршка за OCI8])",
+    "config-dbsupport-mysql": "* [{{int:version-db-mysql-url}} MySQL] е главната цел на МедијаВики и најдобро е поддржан. МедијаВики работи и со [{{int:version-db-mariadb-url}} MariaDB] и [{{int:version-db-percona-url}} Percona], кои се складни со MySQL. ([http://www.php.net/manual/en/mysqli.installation.php Како да срочите PHP со поддршка за MySQL])",
+    "config-dbsupport-postgres": "* [{{int:version-db-postgres-url}} PostgreSQL] е популарен систем на бази на податоци со отворен код кој претставува алтернатива на MySQL ([http://www.php.net/manual/en/pgsql.installation.php како да составите PHP со поддршка за PostgreSQL]). Може сè уште да има некои грешки. па затоа не се препорачува за употреба во производна средина. ([http://www.php.net/manual/en/pgsql.installation.php Како да срочите PHP со поддршка за PostgreSQL])",
+    "config-dbsupport-sqlite": "* [{{int:version-db-sqlite-url}} SQLite] е лесен систем за бази на податоци кој е многу добро поддржан. ([http://www.php.net/manual/en/pdo.installation.php Како да составите PHP со поддршка за SQLite], користи PDO)",
+    "config-dbsupport-oracle": "* [{{int:version-db-oracle-url}} Oracle] е база на податоци на комерцијално претпријатие. ([http://www.php.net/manual/en/oci8.installation.php Како да составите PHP со поддршка за OCI8])",
+    "config-dbsupport-mssql": "* [{{int:version-db-mssql-url}} Microsoft SQL Server]  е база на податоци на комерцијално претпријатиe за Windows ([http://www.php.net/manual/en/sqlsrv.installation.php How to compile PHP with SQLSRV поддршка])",
     "config-header-mysql": "Нагодувања на MySQL",
     "config-header-postgres": "Нагодувања на PostgreSQL",
     "config-header-sqlite": "Нагодувања на SQLite",
     "config-header-oracle": "Нагодувања на Oracle",
+    "config-header-mssql": "Нагодувања за Microsoft SQL Server",
     "config-invalid-db-type": "Неважечки тип на база",
-    "config-missing-db-name": "Мора да внесете значење за параметарот „Име на базата“",
-    "config-missing-db-host": "Мора да внесете вредност за „Домаќин на базата на податоци“",
-    "config-missing-db-server-oracle": "Мора да внесете вредност за „TNS на базата“",
+    "config-missing-db-name": "Мора да внесете значење за параметарот „{{int:config-db-name}}“.",
+    "config-missing-db-host": "Мора да внесете вредност за „{{int:config-db-host}}“.",
+    "config-missing-db-server-oracle": "Мора да внесете вредност за „{{int:config-db-host-oracle}}“.",
     "config-invalid-db-server-oracle": "Неважечки TNS „$1“.\nКористете или „TNS Name“ или низата „Easy Connect“ ([http://docs.oracle.com/cd/E11882_01/network.112/e10836/naming.htm Методи на именување за Oracle])",
     "config-invalid-db-name": "Неважечко име на базата „$1“.\nКористете само ASCII-букви (a-z, A-Z), бројки (0-9), долни црти (_) и цртички (-).",
     "config-invalid-db-prefix": "Неважечки префикс за базата „$1“.\nКористете само ASCII-букви (a-z, A-Z), бројки (0-9), долни црти (_) и цртички (-).",
     "config-connection-error": "$1.\n\nПроверете го долунаведениот домаќин, корисничко име и лозинка и обидете се повторно.",
     "config-invalid-schema": "Неважечка шема за МедијаВики „$1“.\nКористете само букви, бројки и долни црти.",
-    "config-db-sys-create-oracle": "Ð\98нÑ\81Ñ\82алаÑ\82оÑ\80от поддржува само употреба на SYSDBA-сметка за создавање на нова сметка.",
+    "config-db-sys-create-oracle": "Ð\92оÑ\81поÑ\81Ñ\82авÑ\83ваÑ\87от поддржува само употреба на SYSDBA-сметка за создавање на нова сметка.",
     "config-db-sys-user-exists-oracle": "Корисничката сметка „$1“ веќе постои. SYSDBA служи само за создавање на нова сметка!",
     "config-postgres-old": "Се бара PostgreSQL $1 или поново, а вие имате $2.",
+    "config-mssql-old": "Се бара Microsoft SQL Server $1 или понова верзија. Вие имате $2.",
     "config-sqlite-name-help": "Одберете име кое ќе го претставува вашето вики.\nНе користете празни простори и црти.\nОва ќе се користи за податотечното име на SQLite-податоците.",
-    "config-sqlite-parent-unwritable-group": "Ð\9dе Ð¼Ð¾Ð¶Ð°Ð¼ Ð´Ð° Ñ\98а Ñ\81оздадам Ð¿Ð°Ð¿ÐºÐ°Ñ\82а <code><nowiki>$1</nowiki></code> Ð±Ð¸Ð´ÐµÑ\98Ñ\9cи Ð¼Ñ\80ежниоÑ\82 Ð¾Ð¿Ñ\81лÑ\83жÑ\83ваÑ\87 Ð½Ðµ Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ð·Ð°Ð¿Ð¸Ñ\88е Ð²Ð¾ Ð¼Ð°Ñ\82иÑ\87наÑ\82а Ð¿Ð°Ð¿ÐºÐ° <code><nowiki>$2</nowiki></code>.\n\nÐ\98нÑ\81Ñ\82алаÑ\82оÑ\80от го утврди корисникот под кој работи вашиот мрежен опслужувач.\nЗа да продолжите, наместете да може да запишува во папката <code><nowiki>$3</nowiki></code>.\nНа Unix/Linux систем направете го следново:\n\n<pre>cd $2\nmkdir $3\nchgrp $4 $3\nchmod g+w $3</pre>",
-    "config-sqlite-parent-unwritable-nogroup": "Ð\9dе Ð¼Ð¾Ð¶Ð°Ð¼ Ð´Ð° Ñ\98а Ñ\81оздадам Ð¿Ð°Ð¿ÐºÐ°Ñ\82а <code><nowiki>$1</nowiki></code> Ð±Ð¸Ð´ÐµÑ\98Ñ\9cи Ð¼Ñ\80ежниоÑ\82 Ð¾Ð¿Ñ\81лÑ\83жÑ\83ваÑ\87 Ð½Ðµ Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ð·Ð°Ð¿Ð¸Ñ\88е Ð²Ð¾ Ð¼Ð°Ñ\82иÑ\87наÑ\82а Ð¿Ð°Ð¿ÐºÐ° <code><nowiki>$2</nowiki></code>.\n\nÐ\98нÑ\81Ñ\82алаÑ\82оÑ\80от не можеше го утврди корисникот под кој работи вашиот мрежен опслужувач.\nЗа да продолжите, наместете тој (и други!) да може глобално да запишува во папката <code><nowiki>$3</nowiki></code>\nНа Unix/Linux систем направете го следново:\n\n<pre>cd $2\nmkdir $3\nchmod a+w $3</pre>",
+    "config-sqlite-parent-unwritable-group": "Ð\9dе Ð¼Ð¾Ð¶Ð°Ð¼ Ð´Ð° Ñ\98а Ñ\81оздадам Ð¿Ð°Ð¿ÐºÐ°Ñ\82а <code><nowiki>$1</nowiki></code> Ð±Ð¸Ð´ÐµÑ\98Ñ\9cи Ð¼Ñ\80ежниоÑ\82 Ð¾Ð¿Ñ\81лÑ\83жÑ\83ваÑ\87 Ð½Ðµ Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ð·Ð°Ð¿Ð¸Ñ\88е Ð²Ð¾ Ð¼Ð°Ñ\82иÑ\87наÑ\82а Ð¿Ð°Ð¿ÐºÐ° <code><nowiki>$2</nowiki></code>.\n\nÐ\92оÑ\81поÑ\81Ñ\82авÑ\83ваÑ\87от го утврди корисникот под кој работи вашиот мрежен опслужувач.\nЗа да продолжите, наместете да може да запишува во папката <code><nowiki>$3</nowiki></code>.\nНа Unix/Linux систем направете го следново:\n\n<pre>cd $2\nmkdir $3\nchgrp $4 $3\nchmod g+w $3</pre>",
+    "config-sqlite-parent-unwritable-nogroup": "Ð\9dе Ð¼Ð¾Ð¶Ð°Ð¼ Ð´Ð° Ñ\98а Ñ\81оздадам Ð¿Ð°Ð¿ÐºÐ°Ñ\82а <code><nowiki>$1</nowiki></code> Ð±Ð¸Ð´ÐµÑ\98Ñ\9cи Ð¼Ñ\80ежниоÑ\82 Ð¾Ð¿Ñ\81лÑ\83жÑ\83ваÑ\87 Ð½Ðµ Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ð·Ð°Ð¿Ð¸Ñ\88е Ð²Ð¾ Ð¼Ð°Ñ\82иÑ\87наÑ\82а Ð¿Ð°Ð¿ÐºÐ° <code><nowiki>$2</nowiki></code>.\n\nÐ\92оÑ\81поÑ\81Ñ\82авÑ\83ваÑ\87от не можеше го утврди корисникот под кој работи вашиот мрежен опслужувач.\nЗа да продолжите, наместете тој (и други!) да може глобално да запишува во папката <code><nowiki>$3</nowiki></code>\nНа Unix/Linux систем направете го следново:\n\n<pre>cd $2\nmkdir $3\nchmod a+w $3</pre>",
     "config-sqlite-mkdir-error": "Грешка при создавањето на податочната папка „$1“.\nПроверете каде се наоѓа и обидете се повторно.",
     "config-sqlite-dir-unwritable": "Не можам да запишам во папката „$1“.\nВо дозволите за неа, овозможете му на мрежниот опслужувач да запишува во неа и обидете се повторно.",
     "config-sqlite-connection-error": "$1.\n\nПроверете ја податочната папка и името на базата, и обидете се повторно.",
     "config-sqlite-readonly": "Податотеката <code>$1</code> е незапислива.",
     "config-sqlite-cant-create-db": "Не можев да ја создадам податотеката <code>$1</code> за базата.",
     "config-sqlite-fts3-downgrade": "PHP нема поддршка за FTS3 — ја поништувам надградбата за табелите",
-    "config-can-upgrade": "Во оваа база има табели на МедијаВики.\nЗа да ги надградите на МедијаВики $1, кликнете на '''Продолжи'''.",
-    "config-upgrade-done": "Надградбата заврши.\n\nСега можете да [$1 почнете да го користите вашето вики].\n\nАко сакате да ја пресоздадете вашата податотека <code>LocalSettings.php</code>, тогаш кликнете на копчето подолу.\nОва '''не се препорачува''' освен во случај на проблеми со викито.",
+    "config-can-upgrade": "Во оваа база има табели на МедијаВики.\nЗа да ги надградите на МедијаВики $1, стиснете на '''Продолжи'''.",
+    "config-upgrade-done": "Надградбата заврши.\n\nСега можете да [$1 почнете да го користите вашето вики].\n\nАко сакате да ја пресоздадете вашата податотека <code>LocalSettings.php</code>, тогаш стиснете на копчето подолу.\nОва '''не се препорачува''' освен во случај на проблеми со викито.",
     "config-upgrade-done-no-regenerate": "Надградбата заврши.\n\nСега можете да [$1 почнете да го користите викито].",
     "config-regenerate": "Пресоздај LocalSettings.php →",
     "config-show-table-status": "Барањето <code>SHOW TABLE STATUS</code> не успеа!",
     "config-unknown-collation": "'''Предупредување:''' Базата корисни непрепознаена упатна споредба.",
     "config-db-web-account": "Сметка на базата за мрежен пристап",
     "config-db-web-help": "Одберете корисничко име и лозинка што ќе ги користи мрежниот опслужувач за поврзување со опслужувачот на базта на податоци во текот на редовната работа со викито.",
-    "config-db-web-account-same": "Ð\9aоÑ\80иÑ\81Ñ\82и Ñ\98а Ð¸Ñ\81Ñ\82аÑ\82а Ñ\81меÑ\82ка Ð¾Ð´ Ð¸Ð½Ñ\81Ñ\82алаÑ\86иÑ\98ата",
+    "config-db-web-account-same": "Ð\9aоÑ\80иÑ\81Ñ\82и Ñ\98а Ð¸Ñ\81Ñ\82аÑ\82а Ñ\81меÑ\82ка Ð¾Ð´ Ð²Ð¾Ñ\81поÑ\81Ñ\82авката",
     "config-db-web-create": "Создај ја сметката ако веќе не постои",
-    "config-db-web-no-create-privs": "СмеÑ\82каÑ\82а Ñ\88Ñ\82о Ñ\98а Ð½Ð°Ð·Ð½Ð°Ñ\87ивÑ\82е Ð·Ð° Ð¸Ð½Ñ\81Ñ\82алаÑ\86иÑ\98а нема доволно привилегии за да може да создаде сметка.\nТука мора да назначите постоечка сметка.",
+    "config-db-web-no-create-privs": "СмеÑ\82каÑ\82а Ñ\88Ñ\82о Ñ\98а Ð½Ð°Ð·Ð½Ð°Ñ\87ивÑ\82е Ð·Ð° Ð²Ð¾Ñ\81поÑ\81Ñ\82авка нема доволно привилегии за да може да создаде сметка.\nТука мора да назначите постоечка сметка.",
     "config-mysql-engine": "Складишен погон:",
     "config-mysql-innodb": "InnoDB",
     "config-mysql-myisam": "MyISAM",
-    "config-mysql-myisam-dep": "'''Предупредување''': Го одбравте MyISAM како складишен погон за MySQL. Но тој не се препорачува за МедијаВики бидејќи:\n* одвај поддржува едновременост поради заклучување на табелите\n* поподложен на расипување од другите погони\n* кодната база на МедијаВики не секогаш може да работи со MyISAM како што треба\n\nАко вашата инсталација на MySQL поддржува InnoDB, тогаш сериозно препорачуваме да го користите него наместо MyISAM.\nАко вашата инсталација на MySQL не поддржува InnoDB, веројатно дошло време за надградба.",
-    "config-mysql-only-myisam-dep": "'''Предупредување:''' MyISAM е единствениот достапен складишен погон за MySQL, што не се препорачува за употреба со МедијаВики, бидејќи:\n* речиси не поддржува истовремено извршување на задачите поради заклучувањето на табелите\n* поподложен е на расипувања од другите погони\n* кодната база на МедијаВИки не секогаш работи исправно со MyISAM\nВашата инсталација на MySQL не поддржува InnoDB. Можеби е време да ја надградите.",
-    "config-mysql-engine-help": "'''InnoDB''' Ñ\80еÑ\87иÑ\81и Ñ\81екогаÑ\88 Ðµ Ð½Ð°Ñ\98добаÑ\80 Ð¸Ð·Ð±Ð¾Ñ\80, Ð±Ð¸Ð´ÐµÑ\98Ñ\9cи Ð¸Ð¼Ð° Ð´Ð¾Ð±Ñ\80а Ð¿Ð¾Ð´Ð´Ñ\80Ñ\88ка Ð·Ð° ÐµÐ´Ð½Ð¾Ð²Ñ\80еменоÑ\81Ñ\82.\n\n'''MyISAM''' Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ðµ Ð¿Ð¾Ð±Ñ\80з ÐºÐ°Ñ\98 Ð¸Ð½Ñ\81Ñ\82алаÑ\86ииÑ\82е Ð½Ð°Ð¼ÐµÐ½ÐµÑ\82и Ð·Ð° Ñ\81амо ÐµÐ´ÐµÐ½ ÐºÐ¾Ñ\80иÑ\81ник Ð¸Ð»Ð¸ Ð½ÐµÐ·Ð°Ð¿Ð¸Ñ\81ни Ð¸Ð½Ñ\81Ñ\82алаÑ\86ии (само читање).\nБазите на податоци од MyISAM почесто се расипуваат од базите на InnoDB.",
+    "config-mysql-myisam-dep": "'''Предупредување:''' Го одбравте MyISAM како складишен погон за MySQL. Но тој не се препорачува за МедијаВики бидејќи:\n* одвај поддржува едновременост поради заклучување на табелите\n* поподложен на расипување од другите погони\n* кодната база на МедијаВики не секогаш може да работи со MyISAM како што треба\n\nАко вашата воспоставка на MySQL поддржува InnoDB, тогаш сериозно препорачуваме да го користите него наместо MyISAM.\nАко вашата воспоставка на MySQL не поддржува InnoDB, веројатно дошло време за надградба.",
+    "config-mysql-only-myisam-dep": "'''Предупредување:''' MyISAM е единствениот достапен складишен погон за MySQL на оваа машина, а ова не се препорачува за употреба со МедијаВики, бидејќи:\n* речиси не поддржува истовремено извршување на задачите поради заклучувањето на табелите\n* поподложен е на расипувања од другите погони\n* кодната база на МедијаВИки не секогаш работи исправно со MyISAM\nВашата воспоставка на MySQL не поддржува InnoDB. Можеби е време да ја надградите.",
+    "config-mysql-engine-help": "'''InnoDB''' Ñ\80еÑ\87иÑ\81и Ñ\81екогаÑ\88 Ðµ Ð½Ð°Ñ\98добаÑ\80 Ð¸Ð·Ð±Ð¾Ñ\80, Ð±Ð¸Ð´ÐµÑ\98Ñ\9cи Ð¸Ð¼Ð° Ð´Ð¾Ð±Ñ\80а Ð¿Ð¾Ð´Ð´Ñ\80Ñ\88ка Ð·Ð° ÐµÐ´Ð½Ð¾Ð²Ñ\80еменоÑ\81Ñ\82.\n\n'''MyISAM''' Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ðµ Ð¿Ð¾Ð±Ñ\80з ÐºÐ°Ñ\98 Ð²Ð¾Ñ\81поÑ\81Ñ\82авкиÑ\82е Ð½Ð°Ð¼ÐµÐ½ÐµÑ\82и Ð·Ð° Ñ\81амо ÐµÐ´ÐµÐ½ ÐºÐ¾Ñ\80иÑ\81ник Ð¸Ð»Ð¸ Ð½ÐµÐ·Ð°Ð¿Ð¸Ñ\81ни Ð²Ð¾Ñ\81поÑ\81Ñ\82авки (само читање).\nБазите на податоци од MyISAM почесто се расипуваат од базите на InnoDB.",
     "config-mysql-charset": "Збир знаци за базата:",
     "config-mysql-binary": "Бинарен",
     "config-mysql-utf8": "UTF-8",
     "config-mysql-charset-help": "Во '''бинарен режим''', во базата на податоци МедијаВики складира UTF-8 текст во бинарни полиња.\nОва е поефикасно отколку  TF-8 режимот на MySQL, и ви овозможува да ја користите целата палета на уникодни знаци.\n\nВо '''UTF-8 режим''', MySQL ќе знае на кој збир знаци припаѓаат вашите податоци, и може соодветно да ги претстави и претвори, но нема да ви дозволи да складиратезнаци над [//en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes Основната повеќејазична рамнина].",
+    "config-mssql-auth": "Тип на заверка:",
+    "config-mssql-install-auth": "Изберете го типот на заверка што ќе се користи за поврзување со базата на податоци во текот на воспоставката.\nАко изберете „{{int:config-mssql-windowsauth}}“, ќе се користат најавните податоци или корисникот како кој работи мрежниот опслужувач.",
+    "config-mssql-web-auth": "Изберете го типот на заверка што мрежниот послужувач ќе го користи за поврзување со опслужувачот на базата во текот на редовната работа на викито.\nАко изберете „{{int:config-mssql-windowsauth}}“, ќе се користат најавните податоци или корисникот како кој работи мрежниот опслужувач.",
+    "config-mssql-sqlauth": "Заверка за SQL Server",
+    "config-mssql-windowsauth": "Заверка за Windows",
     "config-site-name": "Име на викито:",
     "config-site-name-help": "Ова ќе се појавува во заглавната лента на прелистувачот и на разни други места.",
     "config-site-name-blank": "Внесете име на мрежното место.",
     "config-ns-invalid": "Назначениот именски простор „<nowiki>$1</nowiki>“ е неважечки.\nНазначете друг проектен именски простор.",
     "config-ns-conflict": "Наведениот именски простор „<nowiki>$1</nowiki>“ се коси со основниот именски простор на МедијаВики.\nНаведете друг именски простор за проектот.",
     "config-admin-box": "Администратоска сметка",
-    "config-admin-name": "Вашето име:",
+    "config-admin-name": "Ð\92аÑ\88еÑ\82о ÐºÐ¾Ñ\80иÑ\81ниÑ\87ко Ð¸Ð¼Ðµ:",
     "config-admin-password": "Лозинка:",
     "config-admin-password-confirm": "Пак лозинката:",
     "config-admin-help": "Тука внесете го вашето корисничко име, на пр. „Петар Петровски“.\nОва име ќесе користи за најава во викито.",
     "config-admin-name-blank": "Внесете администраторско корисничко име.",
     "config-admin-name-invalid": "Назначенотго корисничко име „<nowiki>$1</nowiki>“ е неважечко.\nНазначете друго.",
     "config-admin-password-blank": "Внесете лозинка за администраторската сметка",
-    "config-admin-password-same": "Лозинката не може да биде иста со корисничкото име.",
     "config-admin-password-mismatch": "Лозинките што ги внесовте не се совпаѓаат.",
     "config-admin-email": "Е-поштенска адреса:",
     "config-admin-email-help": "Тука внесете е-поштенска адреса за да можете да добивате е-пошта од други корисници на викито, да ја менувате лозинката, и да бидете известувани за промени во страниците на вашиот список на набљудувања. Можете и да го оставите празно.",
     "config-admin-error-password": "Се појави внатрешна грешка при задавање на лозинката за администраторот „<nowiki>$1</nowiki>“: <pre>$2</pre>",
     "config-admin-error-bademail": "Внесовте неважечка е-поштенска адреса",
     "config-subscribe": "Претплатете се на [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce release поштенскиот список за известувања].",
-    "config-subscribe-help": "Ð\9eва Ðµ Ð½Ð¸Ñ\81копÑ\80омеÑ\82ен Ð¿Ð¾Ñ\88Ñ\82енÑ\81ки Ñ\81пиÑ\81ок ÐºÐ¾Ñ\98 Ñ\81е ÐºÐ¾Ñ\80иÑ\81Ñ\82и Ð·Ð° Ñ\81оопÑ\88Ñ\82Ñ\83ваÑ\9aа Ð²Ð¾ Ð²Ñ\80Ñ\81ка Ñ\81о Ð¸Ð·Ð´Ð°Ð½Ð¸Ñ\98а, Ð²ÐºÐ»Ñ\83Ñ\87Ñ\83ваÑ\98Ñ\9cи Ð²Ð°Ð¶Ð½Ð¸ Ð±ÐµÐ·Ð±ÐµÐ´Ð½Ð¾Ñ\81ни Ñ\81оопÑ\88Ñ\82ениÑ\98а.\nТÑ\80еба Ð´Ð° Ñ\81е Ð¿Ñ\80еÑ\82плаÑ\82иÑ\82е Ð¸ Ð´Ð° Ñ\98а Ð½Ð°Ð´Ð³Ñ\80адÑ\83ваÑ\82е Ð²Ð°Ñ\88аÑ\82а Ð¸Ð½Ñ\81Ñ\82алаÑ\86иÑ\98а на МедијаВики кога излегуваат нови верзии.",
+    "config-subscribe-help": "Ð\9eва Ðµ Ð½Ð¸Ñ\81копÑ\80омеÑ\82ен Ð¿Ð¾Ñ\88Ñ\82енÑ\81ки Ñ\81пиÑ\81ок ÐºÐ¾Ñ\98 Ñ\81е ÐºÐ¾Ñ\80иÑ\81Ñ\82и Ð·Ð° Ñ\81оопÑ\88Ñ\82Ñ\83ваÑ\9aа Ð²Ð¾ Ð²Ñ\80Ñ\81ка Ñ\81о Ð¸Ð·Ð´Ð°Ð½Ð¸Ñ\98а, Ð²ÐºÐ»Ñ\83Ñ\87Ñ\83ваÑ\98Ñ\9cи Ð²Ð°Ð¶Ð½Ð¸ Ð±ÐµÐ·Ð±ÐµÐ´Ð½Ð¾Ñ\81ни Ñ\81оопÑ\88Ñ\82ениÑ\98а.\nТÑ\80еба Ð´Ð° Ñ\81е Ð¿Ñ\80еÑ\82плаÑ\82иÑ\82е Ð¸ Ð´Ð° Ñ\98а Ð½Ð°Ð´Ð³Ñ\80адÑ\83ваÑ\82е Ð²Ð°Ñ\88аÑ\82а Ð²Ð¾Ñ\81поÑ\81Ñ\82авка на МедијаВики кога излегуваат нови верзии.",
     "config-subscribe-noemail": "Се обидовте да се претплатите на поштенскиот список со известувања за нови изданија без да наведете е-пошта.\nНаведете е-поштенска адреса ако сакате да се претплатите на списокот.",
-    "config-almost-done": "УÑ\88Ñ\82е Ð¼Ð°Ð»ÐºÑ\83 Ñ\81Ñ\82е Ð³Ð¾Ñ\82ови!\nСега Ð¼Ð¾Ð¶ÐµÑ\82е Ð´Ð° Ð³Ð¸ Ð¿Ñ\80еÑ\81кокнеÑ\82е Ð¿Ñ\80еоÑ\81Ñ\82анаÑ\82иÑ\82е Ð¿Ð¾Ñ\81Ñ\82авÑ\83ваÑ\9aа Ð¸ Ð²ÐµÐ´Ð½Ð°Ñ\88 Ð´Ð° Ð³Ð¾ Ð¸Ð½Ñ\81Ñ\82алиÑ\80ате викито.",
+    "config-almost-done": "УÑ\88Ñ\82е Ð¼Ð°Ð»ÐºÑ\83 Ñ\81Ñ\82е Ð³Ð¾Ñ\82ови!\nСега Ð¼Ð¾Ð¶ÐµÑ\82е Ð´Ð° Ð³Ð¸ Ð¿Ñ\80еÑ\81кокнеÑ\82е Ð¿Ñ\80еоÑ\81Ñ\82анаÑ\82иÑ\82е Ð¿Ð¾Ñ\81Ñ\82авÑ\83ваÑ\9aа Ð¸ Ð²ÐµÐ´Ð½Ð°Ñ\88 Ð´Ð° Ð³Ð¾ Ð²Ð¾Ñ\81поÑ\81Ñ\82авите викито.",
     "config-optional-continue": "Постави ми повеќе прашања.",
-    "config-optional-skip": "Ð\92еÑ\9cе Ð¼Ð¸ Ð·Ð´Ð¾Ñ\81ади, Ð´Ð°Ñ\98 Ñ\81амо Ð¸Ð½Ñ\81Ñ\82алиÑ\80аÑ\98 го викито.",
+    "config-optional-skip": "Ð\92еÑ\9cе Ð¼Ð¸ Ð·Ð´Ð¾Ñ\81ади, Ð´Ð°Ñ\98 Ñ\81амо Ð²Ð¾Ñ\81поÑ\81Ñ\82ави го викито.",
     "config-profile": "Профил на кориснички права:",
     "config-profile-wiki": "Отворено вики",
     "config-profile-no-anon": "Задолжително отворање сметка",
     "config-profile-fishbowl": "Само овластени уредници",
-    "config-profile-private": "Ð\9fÑ\80иваÑ\82но вики",
-    "config-profile-help": "Ð\92икиÑ\98аÑ\82а Ñ\84Ñ\83нкÑ\86иониÑ\80ааÑ\82 Ð½Ð°Ñ\98добÑ\80о ÐºÐ¾Ð³Ð° Ð¸Ð¼Ð°Ð°Ñ\82 Ñ\88Ñ\82о Ð¿Ð¾Ð²ÐµÑ\9cе Ñ\83Ñ\80едниÑ\86и.\nÐ\92о Ð\9cедиÑ\98аÐ\92ики Ð»ÐµÑ\81но Ñ\81е Ð¿Ñ\80овеÑ\80Ñ\83вааÑ\82 Ñ\81коÑ\80еÑ\88ниÑ\82е Ð¿Ñ\80омени, Ð¸ Ð»ÐµÑ\81но Ñ\81е Ð¸Ñ\81пÑ\80ава (Ñ\82еÑ\85ниÑ\87ки: â\80\9eвÑ\80аÑ\9cаâ\80\9c) Ñ\88Ñ\82еÑ\82аÑ\82а Ð½Ð°Ð¿Ñ\80авена Ð¾Ð´ Ð½ÐµÑ\83паÑ\82ени Ð¸Ð»Ð¸ Ð·Ð»Ð¾Ð½Ð°Ð¼ÐµÑ\80ни ÐºÐ¾Ñ\80иÑ\81ниÑ\86и.\n\nÐ\9cногÑ\83мина Ð¸Ð¼Ð°Ð°Ñ\82 Ð½Ð°Ñ\98дено Ð½Ð°Ñ\98Ñ\80азлиÑ\87ни Ð¿Ð¾Ð»ÐµÐ·Ð½Ð¸ Ð¿Ñ\80имени Ð·Ð° Ð\9cедиÑ\98аÐ\92ики, Ð½Ð¾ Ð¿Ð¾Ð½ÐµÐºÐ¾Ð³Ð°Ñ\88 Ð½Ðµ Ðµ Ð»ÐµÑ\81но Ð´Ð° Ñ\83бедиÑ\82е Ð½ÐµÐºÐ¾Ð³Ð¾ Ð²Ð¾ Ð¿Ñ\80едноÑ\81Ñ\82иÑ\82е Ð½Ð° Ð²Ð¸ÐºÐ¸-конÑ\86епÑ\82оÑ\82.\nÐ\97наÑ\87и Ð¸Ð¼Ð°Ñ\82е Ð¸Ð·Ð±Ð¾Ñ\80.\n\n'''{{int:config-profile-wiki}}''' â\80\94 Ð¼Ð¾Ð´ÐµÐ» Ñ\81поÑ\80ед ÐºÐ¾Ñ\98 Ñ\81екоÑ\98 Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ñ\83Ñ\80едÑ\83ва, Ð´Ñ\83Ñ\80и Ð¸ Ð±ÐµÐ· Ð½Ð°Ñ\98авÑ\83ваÑ\9aе.\nÐ\90ко Ð¸Ð¼Ð°Ñ\82е Ð²Ð¸ÐºÐ¸ Ñ\81о '''задолжиÑ\82елно Ð¾Ñ\82воÑ\80аÑ\9aе Ð½Ð° Ñ\81меÑ\82ка''', Ñ\82огаÑ\88 Ð´Ð¾Ð±Ð¸Ð²Ð°Ñ\82е Ð¿Ð¾Ð²ÐµÑ\9cе ÐºÐ¾Ð½Ñ\82Ñ\80ола, Ð½Ð¾ Ð¾Ð²Ð° Ð¼Ð¾Ð¶Ðµ Ð´Ð°Ð³Ð¸ Ð¾Ð´Ð²Ñ\80аÑ\82и Ñ\81понÑ\82аниÑ\82е Ñ\83Ñ\87еÑ\81ниÑ\86и.\n\n'''{{int:config-profile-fishbowl}}''' â\80\94 Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ñ\83Ñ\80едÑ\83вааÑ\82 Ñ\81амо Ñ\83Ñ\80едниÑ\86и Ñ\88Ñ\82о Ð¸Ð¼Ð°Ð°Ñ\82 Ð´Ð¾Ð±Ð¸ÐµÐ½Ð¾ Ð´Ð¾Ð·Ð²Ð¾Ð»Ð° Ð·Ð° Ñ\82оа, Ð½Ð¾ Ñ\98авноÑ\81Ñ\82а Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ð³Ð¸ Ð³Ð»ÐµÐ´Ð° Ñ\81Ñ\82Ñ\80аниÑ\86иÑ\82е, Ð²ÐºÐ»Ñ\83Ñ\87Ñ\83ваÑ\98Ñ\9cи Ñ\98а Ð½Ð¸Ð²Ð½Ð°Ñ\82а Ð¸Ñ\81Ñ\82оÑ\80иÑ\98а.\n'''{{int:config-profile-private}}''' â\80\94 Ñ\81Ñ\82Ñ\80аниÑ\86иÑ\82е Ñ\81е Ð²Ð¸Ð´Ð»Ð¸Ð²Ð¸ Ð¸ Ñ\83Ñ\80едливи Ñ\81амо Ð·Ð° Ð¾Ð²Ð»Ð°Ñ\81Ñ\82ени ÐºÐ¾Ñ\80иÑ\81ниÑ\86и.\n\nÐ\9fо Ð¸Ð½Ñ\81Ñ\82алаÑ\86иÑ\98ата имате на избор и посложени кориснички права и поставки. Погледајте во [//www.mediawiki.org/wiki/Manual:User_rights прирачникот].",
+    "config-profile-private": "Ð\9bиÑ\87но вики",
+    "config-profile-help": "Ð\92икиÑ\98аÑ\82а Ñ\84Ñ\83нкÑ\86иониÑ\80ааÑ\82 Ð½Ð°Ñ\98добÑ\80о ÐºÐ¾Ð³Ð° Ð¸Ð¼Ð°Ð°Ñ\82 Ñ\88Ñ\82о Ð¿Ð¾Ð²ÐµÑ\9cе Ñ\83Ñ\80едниÑ\86и.\nÐ\92о Ð\9cедиÑ\98аÐ\92ики Ð»ÐµÑ\81но Ñ\81е Ð¿Ñ\80овеÑ\80Ñ\83вааÑ\82 Ñ\81коÑ\80еÑ\88ниÑ\82е Ð¿Ñ\80омени, Ð¸ Ð»ÐµÑ\81но Ñ\81е Ð¸Ñ\81пÑ\80ава (Ñ\82еÑ\85ниÑ\87ки: â\80\9eвÑ\80аÑ\9cаâ\80\9c) Ñ\88Ñ\82еÑ\82аÑ\82а Ð½Ð°Ð¿Ñ\80авена Ð¾Ð´ Ð½ÐµÑ\83паÑ\82ени Ð¸Ð»Ð¸ Ð·Ð»Ð¾Ð½Ð°Ð¼ÐµÑ\80ни ÐºÐ¾Ñ\80иÑ\81ниÑ\86и.\n\nÐ\9cногÑ\83мина Ð¸Ð¼Ð°Ð°Ñ\82 Ð½Ð°Ñ\98дено Ð½Ð°Ñ\98Ñ\80азлиÑ\87ни Ð¿Ð¾Ð»ÐµÐ·Ð½Ð¸ Ð¿Ñ\80имени Ð·Ð° Ð\9cедиÑ\98аÐ\92ики, Ð½Ð¾ Ð¿Ð¾Ð½ÐµÐºÐ¾Ð³Ð°Ñ\88 Ð½Ðµ Ðµ Ð»ÐµÑ\81но Ð´Ð° Ñ\83бедиÑ\82е Ð½ÐµÐºÐ¾Ð³Ð¾ Ð²Ð¾ Ð¿Ñ\80едноÑ\81Ñ\82иÑ\82е Ð½Ð° Ð²Ð¸ÐºÐ¸-конÑ\86епÑ\82оÑ\82.\nÐ\97наÑ\87и Ð¸Ð¼Ð°Ñ\82е Ð¸Ð·Ð±Ð¾Ñ\80.\n\n'''{{int:config-profile-wiki}}''' â\80\94 Ð¼Ð¾Ð´ÐµÐ» Ñ\81поÑ\80ед ÐºÐ¾Ñ\98 Ñ\81екоÑ\98 Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ñ\83Ñ\80едÑ\83ва, Ð´Ñ\83Ñ\80и Ð¸ Ð±ÐµÐ· Ð½Ð°Ñ\98авÑ\83ваÑ\9aе.\nÐ\90ко Ð¸Ð¼Ð°Ñ\82е Ð²Ð¸ÐºÐ¸ Ñ\81о '''задолжиÑ\82елно Ð¾Ñ\82воÑ\80аÑ\9aе Ð½Ð° Ñ\81меÑ\82ка''', Ñ\82огаÑ\88 Ð´Ð¾Ð±Ð¸Ð²Ð°Ñ\82е Ð¿Ð¾Ð²ÐµÑ\9cе ÐºÐ¾Ð½Ñ\82Ñ\80ола, Ð½Ð¾ Ð¾Ð²Ð° Ð¼Ð¾Ð¶Ðµ Ð´Ð°Ð³Ð¸ Ð¾Ð´Ð²Ñ\80аÑ\82и Ñ\81понÑ\82аниÑ\82е Ñ\83Ñ\87еÑ\81ниÑ\86и.\n\n'''{{int:config-profile-fishbowl}}''' â\80\94 Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ñ\83Ñ\80едÑ\83вааÑ\82 Ñ\81амо Ñ\83Ñ\80едниÑ\86и Ñ\88Ñ\82о Ð¸Ð¼Ð°Ð°Ñ\82 Ð´Ð¾Ð±Ð¸ÐµÐ½Ð¾ Ð´Ð¾Ð·Ð²Ð¾Ð»Ð° Ð·Ð° Ñ\82оа, Ð½Ð¾ Ñ\98авноÑ\81Ñ\82а Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ð³Ð¸ Ð³Ð»ÐµÐ´Ð° Ñ\81Ñ\82Ñ\80аниÑ\86иÑ\82е, Ð²ÐºÐ»Ñ\83Ñ\87Ñ\83ваÑ\98Ñ\9cи Ñ\98а Ð½Ð¸Ð²Ð½Ð°Ñ\82а Ð¸Ñ\81Ñ\82оÑ\80иÑ\98а.\n'''{{int:config-profile-private}}''' â\80\94 Ñ\81Ñ\82Ñ\80аниÑ\86иÑ\82е Ñ\81е Ð²Ð¸Ð´Ð»Ð¸Ð²Ð¸ Ð¸ Ñ\83Ñ\80едливи Ñ\81амо Ð·Ð° Ð¾Ð²Ð»Ð°Ñ\81Ñ\82ени ÐºÐ¾Ñ\80иÑ\81ниÑ\86и.\n\nÐ\9fо Ð²Ð¾Ñ\81поÑ\81Ñ\82авката имате на избор и посложени кориснички права и поставки. Погледајте во [//www.mediawiki.org/wiki/Manual:User_rights прирачникот].",
     "config-license": "Авторски права и лиценца:",
     "config-license-none": "Без подножје за лиценца",
     "config-license-cc-by-sa": "Криејтив комонс НаведиИзвор СподелиПодИстиУслови",
     "config-upload-enable": "Овозможи подигање на податотеки",
     "config-upload-help": "Подигањето на податотеки потенцијално го изложуваат вашиот опслужувач на безбедносни ризици.\nЗа повеќе информации, прочитајте го [//www.mediawiki.org/wiki/Manual:Security поглавието за безбедност] во прирачникот.\n\nЗа да овозможите подигање на податотеки, сменете го режимот на потпапката <code>images</code> во основната папка на МедијаВики, за да му овозможите на мрежниот опслужувач да запишува во неа.\nПотоа овозможете ја оваа функција.",
     "config-upload-deleted": "Папка за избришаните податотеки:",
-    "config-upload-deleted-help": "Одберете во која папка да се архивираат избришаните податотеки.\nНајдобро би било ако таа не е достапна преку интернет.",
+    "config-upload-deleted-help": "Одберете во која папка да се архивираат избришаните податотеки.\nНајдобро би било ако таа не е достапна преку семрежјето.",
     "config-logo": "URL за логото:",
     "config-logo-help": "Матичното руво на МедијаВики има простор за лого од 135x160 пиксели над страничната лента.\n\nМожете да употребите <code>$wgStylePath</code> или <code>$wgScriptPath</code> ако вашето лого е релативно на тие патеки.\n\nАко не сакате да имате лого, тогаш оставете го ова поле празно.",
     "config-instantcommons": "Овозможи Instant Commons",
-    "config-instantcommons-help": "[//www.mediawiki.org/wiki/InstantCommons Instant Commons] Ðµ Ñ\84Ñ\83нкÑ\86иÑ\98а ÐºÐ¾Ñ\98а Ð¸Ð¼ Ð¾Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ñ\83ва Ð½Ð° Ð²Ð¸ÐºÐ¸Ñ\98аÑ\82а Ð´Ð° ÐºÐ¾Ñ\80иÑ\81Ñ\82аÑ\82 Ñ\81лики, Ð·Ð²Ñ\83Ñ\87ни Ð·Ð°Ð¿Ð¸Ñ\81и Ð¸ Ð´Ñ\80Ñ\83ги Ð¼Ñ\83лÑ\82имедиÑ\98ални Ñ\81одÑ\80жини Ð¾Ð´ [//commons.wikimedia.org/ Ð\97аедниÑ\87каÑ\82а Ð Ð¸Ð·Ð½Ð¸Ñ\86а].\nÐ\97а Ð´Ð° Ð¼Ð¾Ð¶Ðµ Ð¾Ð²Ð° Ð´Ð° Ñ\80абоÑ\82и, Ð\9cедиÑ\98аÐ\92ики Ð±Ð°Ñ\80а Ð¿Ñ\80иÑ\81Ñ\82ап Ð´Ð¾ Ð¸Ð½Ñ\82еÑ\80неÑ\82.\n\nЗа повеќе информации за оваа функција и напатствија за нејзино поставување на вики (сите други освен Ризницата), коносултирајте го [//mediawiki.org/wiki/Manual:$wgForeignFileRepos прирачникот].",
+    "config-instantcommons-help": "[//www.mediawiki.org/wiki/InstantCommons Instant Commons] Ðµ Ñ\84Ñ\83нкÑ\86иÑ\98а ÐºÐ¾Ñ\98а Ð¸Ð¼ Ð¾Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ñ\83ва Ð½Ð° Ð²Ð¸ÐºÐ¸Ñ\98аÑ\82а Ð´Ð° ÐºÐ¾Ñ\80иÑ\81Ñ\82аÑ\82 Ñ\81лики, Ð·Ð²Ñ\83Ñ\87ни Ð·Ð°Ð¿Ð¸Ñ\81и Ð¸ Ð´Ñ\80Ñ\83ги Ð¼Ñ\83лÑ\82имедиÑ\98ални Ñ\81одÑ\80жини Ð¾Ð´ [//commons.wikimedia.org/ Ð Ð¸Ð·Ð½Ð¸Ñ\86аÑ\82а].\nÐ\97а Ð´Ð° Ð¼Ð¾Ð¶Ðµ Ð¾Ð²Ð° Ð´Ð° Ñ\80абоÑ\82и, Ð\9cедиÑ\98аÐ\92ики Ð±Ð°Ñ\80а Ð¿Ñ\80иÑ\81Ñ\82ап Ð´Ð¾ Ñ\81емÑ\80ежÑ\98еÑ\82о.\n\nЗа повеќе информации за оваа функција и напатствија за нејзино поставување на вики (сите други освен Ризницата), коносултирајте го [//mediawiki.org/wiki/Manual:$wgForeignFileRepos прирачникот].",
     "config-cc-error": "Изборникот на лиценци од Криејтив комонс не даде резултати.\nВнесете го името на лиценцата рачно.",
     "config-cc-again": "Одберете повторно...",
     "config-cc-not-chosen": "Одберете ја саканата лиценца од Криејтив комонс и стиснете на „продолжи“.",
     "config-advanced-settings": "Напредни нагодувања",
-    "config-cache-options": "Ð\9dагодÑ\83ваÑ\9aа Ð·Ð° ÐºÐµÑ\88ирање на објекти:",
-    "config-cache-help": "Ð\9aеÑ\88иÑ\80аÑ\9aеÑ\82о Ð½Ð° Ð¾Ð±Ñ\98екÑ\82и Ñ\81е ÐºÐ¾Ñ\80иÑ\81Ñ\82и Ð·Ð° Ð·Ð³Ð¾Ð»ÐµÐ¼Ñ\83ваÑ\9aе Ð½Ð° Ð±Ñ\80зинаÑ\82а Ð½Ð° Ð\9cедиÑ\98аÐ\92ики Ñ\81о ÐºÐµÑ\88ирање на често употребуваните податоци.\nОва многу се препорачува на средни до големи викија, но од тоа ќе имаат полза и малите викија.",
-    "config-cache-none": "Ð\91ез ÐºÐµÑ\88ирање (не се остранува ниедна функција, но може да влијае на брзината кај поголеми викија)",
-    "config-cache-accel": "Ð\9aеÑ\88ирање на PHP-објекти (APC, XCache или WinCache)",
+    "config-cache-options": "Ð\9dагодÑ\83ваÑ\9aа Ð·Ð° Ð¼ÐµÑ\93Ñ\83Ñ\81кладирање на објекти:",
+    "config-cache-help": "Ð\9cеÑ\93Ñ\83Ñ\81кладиÑ\80аÑ\9aеÑ\82о Ð½Ð° Ð¾Ð±Ñ\98екÑ\82и Ñ\81е ÐºÐ¾Ñ\80иÑ\81Ñ\82и Ð·Ð° Ð·Ð³Ð¾Ð»ÐµÐ¼Ñ\83ваÑ\9aе Ð½Ð° Ð±Ñ\80зинаÑ\82а Ð½Ð° Ð\9cедиÑ\98аÐ\92ики Ñ\81о Ð¼ÐµÑ\93Ñ\83Ñ\81кладирање на често употребуваните податоци.\nОва многу се препорачува на средни до големи викија, но од тоа ќе имаат полза и малите викија.",
+    "config-cache-none": "Ð\91ез Ð¼ÐµÑ\93Ñ\83Ñ\81кладирање (не се остранува ниедна функција, но може да влијае на брзината кај поголеми викија)",
+    "config-cache-accel": "Ð\9cеÑ\93Ñ\83Ñ\81кладирање на PHP-објекти (APC, XCache или WinCache)",
     "config-cache-memcached": "Користи Memcached (бара дополнително поставување и нагодување)",
     "config-memcached-servers": "Memcached-опслужувачи:",
     "config-memcached-help": "Список на IP-адреси за употреба во Memcached.\nТреба да се наведе по една во секој ред, како и портата што ќе се користи. На пример:\n 127.0.0.1:11211\n 192.168.1.25:1234",
-    "config-memcache-needservers": "Го одбравте Memcached како ваш ваш тип на скришно памтење (кеш), но не наведовте опслужувач(и)",
+    "config-memcache-needservers": "Го одбравте Memcached како ваш тип на меѓусклад (кеш), но не наведовте ниеден опслужувач.",
     "config-memcache-badip": "Внесовте неважечка IP-адреса за Memcached: $1",
     "config-memcache-noport": "Не ја наведовте портата за опслужувачот на Memcached: $1.\nАко не знаете која порта треба да се користи, основната е 11211",
     "config-memcache-badport": "Бројките за портата на Memcached треба да бидат помеѓу $1 и $2",
     "config-extensions": "Додатоци",
     "config-extensions-help": "Во вашата папка <code>./extensions</code> беа востановени горенаведените додатоци.\n\nЗа ова може да треба дополнително нагодување, но можете да ги овозможите сега",
-    "config-install-alreadydone": "'''Ð\9fÑ\80едÑ\83пÑ\80едÑ\83ваÑ\9aе:''' Ð\98згледа Ð´ÐµÐºÐ° Ð²ÐµÑ\9cе Ð³Ð¾ Ð¸Ð¼Ð°Ñ\82е Ð¸Ð½Ñ\81Ñ\82алиÑ\80ано Ð\9cедиÑ\98аÐ\92ики Ð¸ Ñ\81ега Ñ\81акаÑ\82е Ð´Ð° Ð³Ð¾ Ð¸Ð½Ñ\81Ñ\82алиÑ\80ате повторно.\nПродолжете на следната страница.",
-    "config-install-begin": "СÑ\82иÑ\81каÑ\98Ñ\9cи Ð½Ð° â\80\9e{{int:config-continue}}â\80\9c Ñ\9cе Ñ\98а Ð·Ð°Ð¿Ð¾Ñ\87неÑ\82е Ð¸Ð½Ñ\81Ñ\82алаÑ\86иÑ\98ата на МедијаВики.\nАко сакате да направите измени во досегашното, стиснете на „{{int:config-back}}“.",
+    "config-install-alreadydone": "'''Ð\9fÑ\80едÑ\83пÑ\80едÑ\83ваÑ\9aе:''' Ð\98згледа Ð´ÐµÐºÐ° Ð²ÐµÑ\9cе Ð³Ð¾ Ð¸Ð¼Ð°Ñ\82е Ð²Ð¾Ñ\81поÑ\81Ñ\82авено Ð\9cедиÑ\98аÐ\92ики Ð¸ Ñ\81ега Ñ\81акаÑ\82е Ð´Ð° Ð³Ð¾ Ð²Ð¾Ñ\81поÑ\81Ñ\82авите повторно.\nПродолжете на следната страница.",
+    "config-install-begin": "СÑ\82иÑ\81каÑ\98Ñ\9cи Ð½Ð° â\80\9e{{int:config-continue}}â\80\9c Ñ\9cе Ñ\98а Ð·Ð°Ð¿Ð¾Ñ\87неÑ\82е Ð²Ð¾Ñ\81поÑ\81Ñ\82авката на МедијаВики.\nАко сакате да направите измени во досегашното, стиснете на „{{int:config-back}}“.",
     "config-install-step-done": "готово",
     "config-install-step-failed": "не успеа",
     "config-install-extensions": "Вклучувам додатоци",
     "config-install-pg-schema-failed": "Создавањето натабелите не успеа.\nПроверете дали корисникот „$1“ може да запишува во шемата „$2“.",
     "config-install-pg-commit": "Спроведување на промени",
     "config-install-pg-plpgsql": "Проверувам јазик PL/pgSQL",
-    "config-pg-no-plpgsql": "Ð\8cе Ñ\82Ñ\80еба Ð´Ð° Ð³Ð¾ Ð¸Ð½Ñ\81Ñ\82алиÑ\80ате јазикот PL/pgSQL во базата $1",
-    "config-pg-no-create-privs": "СмеÑ\82каÑ\82а Ñ\88Ñ\82о Ñ\98а Ð½Ð°Ð²ÐµÐ´Ð¾Ð²Ñ\82е Ð·Ð° Ð¸Ð½Ñ\81Ñ\82алаÑ\86иÑ\98ата нема доволно привилегии за да создаде друга сметка.",
-    "config-pg-not-in-role": "СмеÑ\82каÑ\82а Ñ\88Ñ\82о Ñ\98а Ð½Ð°Ð²ÐµÐ´Ð¾Ð²Ñ\82е Ð·Ð° Ð¼Ñ\80ежниоÑ\82 ÐºÐ¾Ñ\80иÑ\81ник Ð²ÐµÑ\9cе Ð¿Ð¾Ñ\81Ñ\82ои.\nСмеÑ\82каÑ\82а Ñ\88Ñ\82о Ñ\98а Ð½Ð°Ð²ÐµÐ´Ð¾Ð²Ñ\82е Ð·Ð° Ð¸Ð½Ñ\81Ñ\82алаÑ\86иÑ\98а не е суперкорисник и не ѝ припаѓа на улогата на мрежниот корисник, па затоа не може да создава објекти во негова  сопственост.\n\nМедијаВики налага дека табелите мора да се во сопственост на мрежниот корисник. Наведете друга мрежна сметка, или стиснете на „назад“ и наведете соодветно привилегиран корисник за инталацијата.",
+    "config-pg-no-plpgsql": "Ð\8cе Ñ\82Ñ\80еба Ð´Ð° Ð³Ð¾ Ð²Ð¾Ñ\81поÑ\81Ñ\82авите јазикот PL/pgSQL во базата $1",
+    "config-pg-no-create-privs": "СмеÑ\82каÑ\82а Ñ\88Ñ\82о Ñ\98а Ð½Ð°Ð²ÐµÐ´Ð¾Ð²Ñ\82е Ð·Ð° Ð²Ð¾Ñ\81поÑ\81Ñ\82авката нема доволно привилегии за да создаде друга сметка.",
+    "config-pg-not-in-role": "СмеÑ\82каÑ\82а Ñ\88Ñ\82о Ñ\98а Ð½Ð°Ð²ÐµÐ´Ð¾Ð²Ñ\82е Ð·Ð° Ð¼Ñ\80ежниоÑ\82 ÐºÐ¾Ñ\80иÑ\81ник Ð²ÐµÑ\9cе Ð¿Ð¾Ñ\81Ñ\82ои.\nСмеÑ\82каÑ\82а Ñ\88Ñ\82о Ñ\98а Ð½Ð°Ð²ÐµÐ´Ð¾Ð²Ñ\82е Ð·Ð° Ð²Ð¾Ñ\81поÑ\81Ñ\82авка не е суперкорисник и не ѝ припаѓа на улогата на мрежниот корисник, па затоа не може да создава објекти во негова  сопственост.\n\nМедијаВики налага дека табелите мора да се во сопственост на мрежниот корисник. Наведете друга мрежна сметка, или стиснете на „назад“ и наведете соодветно привилегиран корисник за инталацијата.",
     "config-install-user": "Создавам корисник за базата",
     "config-install-user-alreadyexists": "Корисникот „$1“ веќе постои",
     "config-install-user-create-failed": "Создавањето на корисникот „$1“ не успеа: $2",
     "config-install-interwiki-exists": "'''Предупредување''': Табелата со интервикија веќе содржи ставки.\nГо прескокнувам основно-зададениот список.",
     "config-install-stats": "Ги подготвувам статистиките",
     "config-install-keys": "Создавање на тајни клучеви",
-    "config-insecure-keys": "'''Ð\9fÑ\80едÑ\83пÑ\80едÑ\83ваÑ\9aе:''' {{PLURAL:$2|Ð\91езбедноÑ\81ниоÑ\82 ÐºÐ»Ñ\83Ñ\87 $1 Ñ\81оздаден Ð²Ð¾ Ñ\82екоÑ\82 Ð½Ð° Ð¸Ð½Ñ\81Ñ\82алаÑ\86иÑ\98аÑ\82а Ð½Ðµ Ðµ Ñ\81оÑ\81ем Ð±ÐµÐ·Ð±ÐµÐ´ÐµÐ½|Ð\91езбедноÑ\81ниÑ\82е ÐºÐ»Ñ\83Ñ\87еви $1 Ñ\81оздадени Ð²Ð¾ Ñ\82екоÑ\82 Ð½Ð° Ð¸Ð½Ñ\81Ñ\82алаÑ\86иÑ\98ата не се сосем безбедни}}. Ви препорачуваме да {{PLURAL:$2|го|ги}} смените рачно.",
+    "config-insecure-keys": "'''Ð\9fÑ\80едÑ\83пÑ\80едÑ\83ваÑ\9aе:''' {{PLURAL:$2|Ð\91езбедноÑ\81ниоÑ\82 ÐºÐ»Ñ\83Ñ\87 $1 Ñ\81оздаден Ð²Ð¾ Ñ\82екоÑ\82 Ð½Ð° Ð²Ð¾Ñ\81поÑ\81Ñ\82авкаÑ\82а Ð½Ðµ Ðµ Ñ\81оÑ\81ем Ð±ÐµÐ·Ð±ÐµÐ´ÐµÐ½|Ð\91езбедноÑ\81ниÑ\82е ÐºÐ»Ñ\83Ñ\87еви $1 Ñ\81оздадени Ð²Ð¾ Ñ\82екоÑ\82 Ð½Ð° Ð²Ð¾Ñ\81поÑ\81Ñ\82авката не се сосем безбедни}}. Ви препорачуваме да {{PLURAL:$2|го|ги}} смените рачно.",
     "config-install-sysop": "Создавање на администраторска корисничка сметка",
     "config-install-subscribe-fail": "Не можам да ве претплатам на известувањето mediawiki-announce: $1",
-    "config-install-subscribe-notpossible": "cURL Ð½Ðµ Ðµ Ð¸Ð½Ñ\81Ñ\82алиÑ\80ан, а allow_url_fopen не е достапно.",
+    "config-install-subscribe-notpossible": "cURL Ð½Ðµ Ðµ Ð²Ð¾Ñ\81поÑ\81Ñ\82авен, а allow_url_fopen не е достапно.",
     "config-install-mainpage": "Создавам главна страница со стандардна содржина",
     "config-install-extension-tables": "Изработка на табели за овозможени додатоци",
     "config-install-mainpage-failed": "Не можев да вметнам главна страница: $1",
-    "config-install-done": "'''ЧеÑ\81Ñ\82иÑ\82аме!'''\nУÑ\81пеÑ\88но Ð³Ð¾ Ð¸Ð½Ñ\81Ñ\82алиÑ\80авÑ\82е Ð\9cедиÑ\98аÐ\92ики.\n\nÐ\98нÑ\81Ñ\82алаÑ\82оÑ\80оÑ\82 Ñ\81оздаде Ð¿Ð¾Ð´Ð°Ñ\82оÑ\82ека <code>LocalSettings.php</code>.\nТамÑ\83 Ñ\81е Ñ\81одÑ\80жаÑ\82 Ñ\81иÑ\82е Ð²Ð°Ñ\88и Ð½Ð°Ð³Ð¾Ð´Ñ\83ваÑ\9aа.\n\nÐ\8cе Ñ\82Ñ\80еба Ð´Ð° Ñ\98а Ð¿Ñ\80еземеÑ\82е Ð¸ Ð´Ð° Ñ\98а Ñ\81Ñ\82авиÑ\82е Ð²Ð¾ Ð¾Ñ\81новаÑ\82а Ð½Ð° Ð¸Ð½Ñ\81Ñ\82алаÑ\86иÑ\98ата (истата папка во која се наоѓа index.php). Преземањето треба да е започнато автоматски.\n\nАко не ви е понудено преземање, или пак ако сте го откажале, можете да го почнете одново стискајќи на следнава врска:\n\n$3\n\n'''Напомена''': Ако ова не го направите сега, податотеката со поставки повеќе нема да биде на достапна.\n\nОткога ќе завршите со тоа, можете да '''[$2 влезете на вашето вики]'''.",
+    "config-install-done": "'''ЧеÑ\81Ñ\82иÑ\82аме!'''\nУÑ\81пеÑ\88но Ð³Ð¾ Ð²Ð¾Ñ\81поÑ\81Ñ\82авивÑ\82е Ð\9cедиÑ\98аÐ\92ики.\n\nÐ\92оÑ\81поÑ\81Ñ\82авÑ\83ваÑ\87оÑ\82 Ñ\81оздаде Ð¿Ð¾Ð´Ð°Ñ\82оÑ\82ека <code>LocalSettings.php</code>.\nТамÑ\83 Ñ\81е Ñ\81одÑ\80жаÑ\82 Ñ\81иÑ\82е Ð²Ð°Ñ\88и Ð½Ð°Ð³Ð¾Ð´Ñ\83ваÑ\9aа.\n\nÐ\8cе Ñ\82Ñ\80еба Ð´Ð° Ñ\98а Ð¿Ñ\80еземеÑ\82е Ð¸ Ð´Ð° Ñ\98а Ñ\81Ñ\82авиÑ\82е Ð²Ð¾ Ð¾Ñ\81новаÑ\82а Ð½Ð° Ð²Ð¾Ñ\81поÑ\81Ñ\82авката (истата папка во која се наоѓа index.php). Преземањето треба да е започнато автоматски.\n\nАко не ви е понудено преземање, или пак ако сте го откажале, можете да го почнете одново стискајќи на следнава врска:\n\n$3\n\n'''Напомена''': Ако ова не го направите сега, податотеката со поставки повеќе нема да биде на достапна.\n\nОткога ќе завршите со тоа, можете да '''[$2 влезете на вашето вики]'''.",
     "config-download-localsettings": "Преземи го <code>LocalSettings.php</code>",
     "config-help": "помош",
     "config-nofile": "Податотеката „$1“ не е пронајдена. Да не е избришана?",
     "config-extension-link": "Дали сте знаеле дека вашето вики поддржува [//www.mediawiki.org/wiki/Manual:Extensions додатоци]?\n\nМожете да ги прелистате [//www.mediawiki.org/wiki/Category:Extensions_by_category по категории] или да ја посетите [//www.mediawiki.org/wiki/Extension_Matrix матрицата], каде ќе најдете полн список на додатоци.",
-    "mainpagetext": "'''Ð\9cедиÑ\98аÐ\92ики Ðµ Ñ\83Ñ\81пеÑ\88но Ð¸Ð½Ñ\81Ñ\82алиÑ\80ан.'''",
+    "mainpagetext": "'''Ð\9cедиÑ\98аÐ\92ики Ðµ Ñ\83Ñ\81пеÑ\88но Ð²Ð¾Ñ\81поÑ\81Ñ\82авен.'''",
     "mainpagedocfooter": "Погледнете го [//meta.wikimedia.org/wiki/Help:Contents Упатството за корисници] за подетални иформации како се користи вики-програмот.\n\n==Од каде да почнете==\n* [//meta.wikimedia.org/wiki/Manual:Configuration_settings Список на нагодувања]\n* [//meta.wikimedia.org/wiki/Manual:FAQ ЧПП (често поставувани прашања) за МедијаВики].\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Поштенски список на МедијаВики за нови верзии]\n* [//www.mediawiki.org/wiki/Localisation#Translation_resources Локализирајте го МедијаВики на вашиот јазик]"
-}
\ No newline at end of file
+}
index 05f43c6..7e32e2e 100644 (file)
@@ -72,7 +72,6 @@
     "config-admin-name-blank": "ഒരു കാര്യനിർവാഹക ഉപയോക്തൃനാമം നൽകുക.",
     "config-admin-name-invalid": "നൽകിയിട്ടുള്ള ഉപയോക്തൃനാമം \"<nowiki>$1</nowiki>\" അസാധുവാണ്.\nമറ്റൊരു ഉപയോക്തൃനാമം നൽകുക.",
     "config-admin-password-blank": "കാര്യനിർവാഹക അംഗത്വത്തിനുള്ള രഹസ്യവാക്ക് നൽകുക.",
-    "config-admin-password-same": "രഹസ്യവാക്കും ഉപയോക്തൃനാമവും ഒന്നാകരുത്.",
     "config-admin-password-mismatch": "താങ്കൾ നൽകിയ രഹസ്യവാക്കുകൾ രണ്ടും തമ്മിൽ യോജിക്കുന്നില്ല.",
     "config-admin-email": "ഇമെയിൽ വിലാസം:",
     "config-admin-error-user": "\"<nowiki>$1</nowiki>\" എന്ന പേരിലുള്ള കാര്യനിർവഹണ അംഗത്വ നിർമ്മിതിയ്ക്കിടെ ആന്തരികമായ പിഴവുണ്ടായി.",
     "config-install-done": "'''അഭിനന്ദനങ്ങൾ!'''\nതാങ്കൾ വിജയകരമായി മീഡിയവിക്കി സജ്ജീകരിച്ചിരിക്കുന്നു.\n\nഇൻസ്റ്റോളർ താങ്കളുടെ എല്ലാ ക്രമീകരണങ്ങളുമടങ്ങുന്ന <code>LocalSettings.php</code> ഫയൽ സൃഷ്ടിച്ചിട്ടുണ്ട്.\n\nപ്രസ്തുത പ്രമാണം ഡൗൺലോഡ് ചെയ്ത് താങ്കളുടെ വിക്കി സജ്ജീകരണത്തിന്റെ അടിസ്ഥാന ഡയറക്റ്ററിയിൽ ഇടേണ്ടതാണ് (index.php കിടക്കുന്ന അതേ ഡയറക്റ്ററിയിൽ). ഡൗൺലോഡിങ്ങ് സ്വയം ആരംഭിക്കുന്നതാണ്. ഡൗൺലോഡിങ്ങ് സ്വയം തുടങ്ങാതിരിക്കുകയോ, താങ്കൾ റദ്ദാക്കുകയോ ചെയ്ത പക്ഷം താഴെ കാണുന്ന കണ്ണിയിൽ ഞെക്കുക:\n$3\n\n'''ശ്രദ്ധിക്കുക''': താങ്കൾ ഇപ്പോൾ ചെയ്തില്ലെങ്കിൽ, ഫയൽ എടുക്കാതെ ഇൻസ്റ്റലേഷൻ പ്രക്രിയയിൽ നിന്ന് പുറത്തിറങ്ങിയാൽ, സൃഷ്ടിക്കപ്പെട്ട ക്രമീകരണങ്ങളടങ്ങുന്ന പ്രമാണം പിന്നീട് ലഭ്യമായിരിക്കില്ല.\n\nമുകളിൽ പറഞ്ഞ പ്രകാരം ചെയ്തു കഴിഞ്ഞാൽ, താങ്കൾക്ക് '''[$2 വിക്കിയിൽ പ്രവേശിക്കാവുന്നതാണ്]'''.",
     "mainpagetext": "'''മീഡിയവിക്കി വിജയകരമായി സജ്ജീകരിച്ചിരിക്കുന്നു.'''",
     "mainpagedocfooter": "വിക്കി സോഫ്റ്റ്‌വെയർ ഉപയോഗിക്കുന്നതിനെ കുറിച്ചുള്ള വിശദാംശങ്ങൾക്ക്  [//meta.wikimedia.org/wiki/Help:Contents സോഫ്റ്റ്‌വെയർ സഹായി] കാണുക.\n\n== പ്രാരംഭസഹായികൾ ==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings ക്രമീകരണങ്ങളുടെ പട്ടിക]\n* [//www.mediawiki.org/wiki/Manual:FAQ മീഡിയവിക്കി പതിവുചോദ്യങ്ങൾ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce മീഡിയവിക്കി പ്രകാശന മെയിലിങ് ലിസ്റ്റ്]"
-}
\ No newline at end of file
+}
index 091cea6..8b299c6 100644 (file)
@@ -7,4 +7,4 @@
     "config-page-language": "Хэл",
     "mainpagetext": "'''МедиаВики амжилттай суулаа.'''",
     "mainpagedocfooter": "Вики программыг хэрэглэх талаар заавар авахын тулд [//meta.wikimedia.org/wiki/Help:Contents хэрэглэгчийн гарын авлага]-г үзнэ үү.\n\n== Эхлэх ==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Тохиргоо]\n* [//www.mediawiki.org/wiki/Manual:FAQ МедиаВикигийн тогтмол тавигддаг асуултууд]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce МедиаВикигийн мэдээний мэйл явуулах жагсаалт]"
-}
\ No newline at end of file
+}
index a1ed0d9..e83dc13 100644 (file)
@@ -1,7 +1,62 @@
 {
     "@metadata": {
-        "authors": []
+        "authors": [
+            "V.narsikar"
+        ]
     },
+    "config-information": "माहिती",
+    "config-localsettings-key": "दर्जोन्नती कळ:",
+    "config-localsettings-badkey": "आपण दिलेली कळ चुकीची आहे.",
+    "config-session-error": "सत्र सुरू करण्यात त्रूटी:$1",
+    "config-your-language": "आपली भाषा:",
+    "config-your-language-help": "उभारणी प्रक्रियेत वापरावयाची भाषा निवडा.",
+    "config-wiki-language": "विकी भाषा:",
+    "config-back": "← परत",
+    "config-continue": "चालू ठेवा →",
+    "config-page-language": "भाषा",
+    "config-page-welcome": "मिडियाविकीवर स्वागत आहे!",
+    "config-page-upgrade": "सध्याच्या उभारणीची(इन्स्टॉलेशन) दर्जोन्नती करा",
+    "config-page-name": "नाव",
+    "config-page-options": "पर्याय",
+    "config-page-install": "उभारा(इन्स्टॉल)",
+    "config-page-complete": "पूर्ण!",
+    "config-page-readme": "हे वाचा",
+    "config-page-releasenotes": "विमोचन टिप्पण्या",
+    "config-page-existingwiki": "साध्याचा विकि",
+    "config-pg-test-error": "विदागाराशी अनुबंधन करता येत नाही <strong>$1</strong>: $2",
+    "config-type-mssql": "मायक्रोसॉफ्ट एसक्युएल सर्व्हर",
+    "config-header-mssql": "मायक्रोसॉफ्ट एसक्युएल सर्व्हर मांडणावळ",
+    "config-mssql-old": "मायक्रोसॉफ्ट एसक्युएल सर्व्हर $1 किंवा त्यानंतरची आवृत्ती हवी. आपणापाशी $2 आहे.",
+    "config-mssql-auth": "अधिप्रमाणन प्रकार:",
+    "config-mssql-install-auth": "उभारणीच्या(इन्स्टॉलेशन) प्रक्रियेदरम्यान,'अधिप्रमाणन प्रकार'( ऑथेंटीकेशन टाईप) निवडा, ज्याचा वापर डाटाबेसशी अनुबंधनात करण्यात येईल.जर आपण \"विंडोज ऑथेंटीकेशन\" निवडले तर,ज्याकोणत्याही सदस्याची अधिकारपत्रे(क्रेडेंटियल्स) वेबसर्व्हरवर सुरू असतील,तशीच वापरल्या जातील.",
+    "config-mssql-web-auth": "या विकिचे सामन्य चालनादरम्यान,'अधिप्रमाणन प्रकार'( ऑथेंटीकेशन टाईप) निवडा, ज्याचा वापर डाटाबेसशी अनुबंधनात करण्यात येईल.जर आपण \"विंडोज ऑथेंटीकेशन\" निवडले तर,ज्याकोणत्याही सदस्याची अधिकारपत्रे(क्रेडेंटियल्स) वेबसर्व्हरवर सुरू असतील,तशीच वापरल्या जातील.",
+    "config-mssql-sqlauth": "एसक्युएल सर्व्हर अधिप्रमाणन",
+    "config-mssql-windowsauth": "विंडोजचे अधिप्रमाणन",
+    "config-site-name": "विकिचे नाव:",
+    "config-site-name-blank": "संकेतस्थळाचे नाव टाका.",
+    "config-project-namespace": "प्रकल्प नामविश्व:",
+    "config-ns-generic": "प्रकल्प",
+    "config-admin-name": "आपले सदस्यनाव:",
+    "config-admin-password": "परवलीचा शब्द:",
+    "config-admin-password-confirm": "परवलीचा शब्द पुन्हा टाका:",
+    "config-admin-email": "विपत्र पत्ता:",
+    "config-admin-error-bademail": "आपण अवैध विपत्रपत्ता टाकला आहे.",
+    "config-profile-no-anon": "खाते तयार करणे आवश्यक",
+    "config-profile-fishbowl": "फक्त प्रमाणित संपादक",
+    "config-profile-private": "खाजगी विकि",
+    "config-license": "प्रताधिकार व परवाना",
+    "config-email-user": "सदस्य ते सदस्य विपत्र पाठविणे सक्षम करा",
+    "config-email-usertalk": "सदस्य चर्चा पान अधिसूचना सक्षम करा",
+    "config-email-watchlist": "निरीक्षणसूची अधिसूचना सक्षम करा",
+    "config-email-sender": "प्रत्युत्तराचा विपत्रपत्ता:",
+    "config-upload-settings": "संचिका अपभारणे",
+    "config-upload-enable": "संचिका अपभारणे सक्षम करा",
+    "config-extensions": "विस्तारके",
+    "config-install-step-done": "झाले",
+    "config-install-extensions": "विस्तारके अंतर्भूत करून",
+    "config-install-tables": "सारण्या बनवित आहे",
+    "config-install-tables-failed": "<strong>त्रूटी:</strong>खालील त्रूटीमुळे सारणी बनविणे अयशस्वी:$1",
+    "config-help": "साहाय्य",
     "mainpagetext": "'''मीडियाविकीचे इन्स्टॉलेशन पूर्ण.'''",
     "mainpagedocfooter": "विकी सॉफ्टवेअर वापरण्याकरिता [//meta.wikimedia.org/wiki/Help:Contents यूजर गाईड] पहा.\n\n== सुरुवात ==\n\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings कॉन्फिगरेशन सेटींगची यादी]\n* [//www.mediawiki.org/wiki/Manual:FAQ मीडियाविकी नेहमी विचारले जाणारे प्रश्न]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce मीडियाविकि मेलिंग लिस्ट]"
-}
\ No newline at end of file
+}
index 88beae9..8189971 100644 (file)
@@ -2,15 +2,23 @@
     "@metadata": {
         "authors": [
             "Anakmalaysia",
-            "Pizza1016"
+            "Pizza1016",
+            "SNN95"
         ]
     },
     "config-desc": "Pemasang MediaWiki",
     "config-title": "Pasangan MediaWiki $1",
     "config-information": "Maklumat",
+    "config-localsettings-upgrade": "Fail <code>LocalSettings.php</code> telah dikesan.\nUntuk menaik taraf pemasangan, sila masukkan nilai <code>$wgUpgradeKey</code> dalam kotak di bawah.\nAnda akan menjumpainya di <code>LocalSettings.php</code> .",
+    "config-localsettings-cli-upgrade": "Fail <code>LocalSettings.php</code> telah dikesan.\nUntuk menaik taraf pemasangan, sila jalankan <code>update.php</code> sebaliknya",
     "config-localsettings-key": "Kunci naik taraf:",
     "config-localsettings-badkey": "Kunci yang anda berikan tidak betul.",
+    "config-upgrade-key-missing": "Pemasangan yang sedia ada MediaWiki telah dikesan.\nUntuk menaik taraf pemasangan, Sila letakkan baris berikut di bahagian bawah <code>LocalSettings.php</code> anda:\n\n$1",
+    "config-localsettings-incomplete": "<code>LocalSettings.php</code> sedia ada nampaknya tidak lengkap.\nPemboleh ubah $1 tidak disetkan.\nSila tukar <code>LocalSettings.php</code> supaya pemboleh ubah ini disetkan, dan klik \"{{int:Config-terus}}\".",
+    "config-localsettings-connection-error": "Ralat berlaku semasa semasa menyambung ke dalam pangkalan data yang menggunakan seting yang dinyatakan dalam <code>LocalSettings.php</code> atau <code>AdminSettings.php</code>. Sila betulkan tetapan ini dan cuba lagi.\n\n$1",
     "config-session-error": "Ralat ketika memulakan sesi: $1",
+    "config-session-expired": "Data sesi anda seolah-olah telah tamat tempoh.\nSesi dikonfigurasi untuk seumur hidup sebanyak $1.\nAnda boleh menambah ini dengan menetapkan <code>session.gc_maxlifetime</code> di php.ini.\nMemulakan semula proses pemasangan.",
+    "config-no-session": "Data sesi anda telah hilang!\nSemak php.ini anda dan pastikan <code>session.save_path</code> disetkan kepada satu direktori yang sesuai.",
     "config-your-language": "Bahasa anda:",
     "config-your-language-help": "Pilihkan bahasa untuk digunakan dalam proses pemasangan ini.",
     "config-wiki-language": "Bahasa wiki:",
     "config-page-copying": "Sedang menyalin",
     "config-page-upgradedoc": "Sedang menaik taraf",
     "config-page-existingwiki": "Wiki sedia ada",
+    "config-help-restart": "Adakah anda ingin untuk membersihkan semua data yang disimpan yang anda telah masukkan dan memulakan semula proses pemasangan?",
+    "config-restart": "Ya, mula semula",
+    "config-welcome": "=== Pemeriksaan persekitaran ===\nPemeriksaan asas kini boleh dilakukan untuk melihat jika persekitaran ini adalah sesuai untuk pemasangan MediaWiki.\nIngat untuk memasukkan maklumat ini jika anda mahukan sokongan tentang bagaimana untuk menyelesaikan pemasangan.",
+    "config-copyright": "=== Hakcipta dan terma ===\n\n$1\n\nProgram ini merupakan perisian bebas; anda boleh mengedarkannya semula dan/atau mengubahsuainya di bawah syarat-syarat Lesen Awam GNU seperti yang diterbitkan oleh Yayasan Perisian Bebas; sama ada versi 2 Lesen ini atau (mengikut pilihan anda) mana-mana versi selepas ini.\n\nProgram ini diedarkan dengan harapan bahawa ia akan menjadi berguna, tetapi '''tanpa sebarang waranti'''; tanpa jaminan yang tersirat '''kebolehdagangan''' atau '''kesesuaian untuk tujuan tertentu'''.\nLihat Lesen Awam GNU untuk maklumat lanjut.\n\nAnda perlu terima <doclink href=Copying> satu salinan Lesen Awam GNU </ doclink> bersama-sama dengan program ini, jika tidak, menulis surat kepada Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA, atau [http://www.gnu.org/copyleft/gpl.html membacanya dalam talian].",
+    "config-sidebar": "* [//www.mediawiki.org Laman utama MediaWiki]\n* [//www.mediawiki.org/wiki/Help:Contents Panduan Pengguna]\n* [//www.mediawiki.org/wiki/Manual:Contents Panduan Pentadbir]\n* [//www.mediawiki.org/wiki/Manual:FAQ Soalan lazim]\n----\n* <doclink href=Readme>Baca saya</doclink>\n* <doclink href=ReleaseNotes>Nota keluaran</doclink>\n* <doclink href=Copying>Menyalin</doclink>\n* <doclink href=UpgradeDoc>Menaik taraf</doclink>",
+    "config-env-good": "Persekitaran telah diperiksa.\nAnda boleh memasang MediaWiki.",
+    "config-env-bad": "Persekitaran telah diperiksa. \nAnda tidak boleh memasang MediaWiki.",
     "config-env-php": "PHP $1 dipasang.",
     "config-env-php-toolow": "PHP $1 dipasang.\nBagaimanapun, MediaWiki memerlukan PHP $2 ke atas.",
     "config-unicode-using-utf8": "utf8_normalize.so oleh Brion Vibber digunakan untuk penormalan Unicode.",
     "config-unicode-using-intl": "[http://pecl.php.net/intl Sambungan intl PECL] digunakan untuk penormalan Unicode.",
+    "config-unicode-update-warning": "<strong>Amaran:</strong> Versi pembalut penormalan Unicode yang terpasang menggunakan perpustakaan [http://site.icu-project.org/ projek ICU] dalam versi yang lampau.\nAnda harus [//www.mediawiki.org/wiki/Unicode_normalization_considerations menaik taraf] jika Unicode penting bagi anda.",
+    "config-no-fts3": "<strong>Amaran:</strong> SQLite disusun tanpa [//sqlite.org/fts3.html modil FTS3], maka ciri-ciri pencarian tidak akan disediakan pada backend ini.",
+    "config-register-globals": "<strong>Amaran: Pilihan <code>[http://php.net/register_globals register_globals]</code> PHP dihidupkan.\nMatikannya jika boleh.</strong>\nMediaWiki boleh digunakan, tetapi pelayan anda akan terdedah kepada kemungkinan kerentanan keselamatan.",
+    "config-mbstring": "<strong>Amaran keras: [http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload] sedang aktif!</strong>\nOpsyen ini menyebabkan ralat dan mungkin mencemari data secara tanpa diduga.\nAnda tidak boleh memasang atau menggunakan MediaWiki melainkan opsyen ini dinyahdayakan.",
+    "config-pcre-old": "<strong>Amaran keras:</strong> PCRE $1 ke atas diperlukan.\nBinari PHP anda berpaut dengan PCRE $2.\n[https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/PCRE Keterangan lanjut].",
+    "config-memory-bad": "<strong>Amaran:</strong> <code>memory_limit</code> (Had memori) PHP adalah $1.\nIni mungkin terlalu rendah.\nPemasangan mungkin akan gagal!",
+    "config-ctype": "<strong>Amaran keras:</strong> PHP mesti disusun dengan sokongan untuk [http://www.php.net/manual/en/ctype.installation.php sambungan Ctype].",
+    "config-no-cli-uri": "<strong>Amaran:</strong> Tiada <code>--scriptpath</code> dinyatakan, maka digunakannya yang asali: <code>$1</code>.",
+    "config-no-cli-uploads-check": "<strong>Amaran:</strong> Direktori asali anda untuk muat naikan (<code>$1</code>) belum diperiksa untuk kerentanan\nkepada pelaksanaan skrip yang menyeleweng sewaktu pemasangan CLI.",
     "config-db-charset": "Peranggu aksara pangkalan data",
+    "config-pg-test-error": "Tidak boleh bersambung dengan pangkalan data <strong>$1</strong>: $2",
     "config-header-mysql": "Keutamaan MySQL",
     "config-header-postgres": "Keutamaan PostgreSQL",
     "config-header-sqlite": "Keutamaan SQLite",
     "config-header-oracle": "Keutamaan Oracle",
     "config-invalid-db-type": "Jenis pangkalan data tidak sah",
+    "config-can-upgrade": "Terdapat jadual MediaWiki dalam pangkalan data ini. Untuk menaik tarafnya kepada MediaWiki $1, klik <strong>Teruskan</strong>.",
+    "config-unknown-collation": "<strong>Amaran:</strong> Pangkalan data sedang menggunakan kolasi yang tidak dikenali.",
     "config-db-web-account-same": "Gunakan akaun yang sama seperti dalam pemasangan",
     "config-db-web-create": "Ciptakan akaun jika belum wujud",
     "config-mysql-engine": "Enjin storan:",
     "config-mysql-innodb": "InnoDB",
     "config-mysql-myisam": "MyISAM",
+    "config-mysql-only-myisam-dep": "<strong>Amaran:</strong> MyISAM adalah satu-satunya enjin storan yang terdapat untuk MySQL di mesin ini, dan penggunaannya dengan MediaWiki tidak digalakkan kerana:\n* ia tidak menyokong keserempakan (''concurrency'') disebabkan penguncian jadual\n* ia lebih terdedah kepada korupsi daripada enjin-enjin lain\n* pangkalan kod MediaWiki tidak sentiasa mengendalikan MyISAM seperti yang diharapkan\n\nPemasangan MySQL anda tidak menyokong InnoDB. Mungkin tiba masanya untuk naik taraf.",
     "config-mysql-charset": "Peranggu aksara pangkalan data:",
     "config-mysql-binary": "Perduaan",
     "config-mysql-utf8": "UTF-8",
     "config-install-step-done": "siap",
     "config-install-step-failed": "gagal",
     "config-install-user-alreadyexists": "Pengguna \"$1\" sudah wujud",
+    "config-install-tables-exist": "<strong>Amaran:</strong> Nampaknya sudah terdapat jadual MediaWiki. Penciptaan dilangkau.",
+    "config-install-interwiki-exists": "<strong>Amaran:</strong> Jadual antara wiki nampaknya sudah ada entri. Senarai asali dilangkau.",
+    "config-insecure-keys": "<strong>Amaran:</strong> {{PLURAL:$2|Kunci keselamatan|Kunci-kunci keselamatan}} ($1) yang dihasilkan sewaktu pemasangan itu {{PLURAL:$2|adalah}} tidak selamat sepenuhnya. Oleh itu, {{PLURAL:$2|ia}} wajar ditukar secara manual.",
     "config-help": "bantuan",
     "mainpagetext": "'''MediaWiki telah berjaya dipasang.'''",
     "mainpagedocfooter": "Sila rujuk [//meta.wikimedia.org/wiki/Help:Contents Panduan Penggunaan] untuk maklumat mengenai penggunaan perisian wiki ini.\n\n== Permulaan ==\n\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Senarai tetapan konfigurasi]\n* [//www.mediawiki.org/wiki/Manual:FAQ Soalan Lazim MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Senarai surat keluaran MediaWiki]\n* [//www.mediawiki.org/wiki/Localisation#Translation_resources Terjemahkan MediaWiki ke dalam bahasa anda]"
-}
\ No newline at end of file
+}
index 2aedc5d..fc145ce 100644 (file)
@@ -61,7 +61,6 @@
     "config-admin-name-blank": "Daħħal isem tal-utent għall-amministratur.",
     "config-admin-name-invalid": "L-isem tal-utent speċifikat \"<nowiki>$1</nowiki>\" huwa ħażin.\nSpeċifika isem tal-utent differenti.",
     "config-admin-password-blank": "Daħħal password għall-kont tal-amministratur.",
-    "config-admin-password-same": "Il-password ma tistax tkun l-istess bħall-isem tal-utent.",
     "config-admin-password-mismatch": "Il-passwords li daħħalt ma jaqblux.",
     "config-admin-email": "Indirizz elettroniku:",
     "config-admin-error-bademail": "Daħħalt indirizz elettroniku ħażin.",
@@ -86,4 +85,4 @@
     "config-nofile": "Il-fajl \"$1\" ma setax jinstab. Dan ġie mħassar?",
     "mainpagetext": "'''MediaWiki ġie installat b'suċċess.'''",
     "mainpagedocfooter": "Ikkonsulta l-[//meta.wikimedia.org/wiki/Help:Contents Gwida għall-utenti] sabiex tikseb iktar informazzjoni dwar kif tuża' s-softwer tal-wiki.\n\n== Biex tibda ==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Lista ta' preferenzi għall-konfigurazzjoni]\n* [//www.mediawiki.org/wiki/Manual:FAQ Mistoqsijiet rikorrenti fuq il-MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Il-lista tal-posta tħabbar 'l MediaWiki]"
-}
\ No newline at end of file
+}
index 0ffbf17..f25564a 100644 (file)
@@ -5,4 +5,4 @@
         ]
     },
     "mainpagetext": "'''မီဒီယာဝီကီကို အောင်မြင်စွာ သွင်းပြီးပါပြီ။'''"
-}
\ No newline at end of file
+}
index 792c4ef..2338270 100644 (file)
@@ -7,10 +7,10 @@
     "config-page-language": "Кель",
     "config-page-name": "Лемезэ",
     "config-page-readme": "Ловномак",
-    "config-admin-name": "Ð\9bемеÑ\82Ñ\8c:",
+    "config-admin-name": "СовамовалоÑ\82:",
     "config-admin-password": "Совамо валот:",
     "config-admin-password-confirm": "Совамо валот одов:",
     "config-admin-email": "Е-сёрма паргот:",
     "config-install-step-done": "теезь",
     "mainpagetext": "'''МедияВикинь тевс аравтомазо парсте лиссь.'''"
-}
\ No newline at end of file
+}
index b24592d..06b0470 100644 (file)
@@ -5,4 +5,4 @@
         ]
     },
     "config-help": "راهنما"
-}
\ No newline at end of file
+}
index 7a7a6d3..baf177c 100644 (file)
@@ -1,6 +1,4 @@
 {
-    "@metadata": {
-        "authors": []
-    },
+    "@metadata": [],
     "mainpagetext": "'''MediaHuiqui cualli ōmotlahtlāli.'''"
-}
\ No newline at end of file
+}
index 8ffe289..18716eb 100644 (file)
@@ -4,6 +4,43 @@
             "Ianbu"
         ]
     },
+    "config-desc": "MediaWiki的安裝程式",
+    "config-title": "MediaWiki $1的安裝",
+    "config-information": "資訊",
+    "config-localsettings-upgrade": "有一个<code>LocalSettings.php</code>檔案佇咧。若欲升級,請佇下面的框內底拍<code>$wgUpgradeKey</code>的內容。你會使佇<code>LocalSettings.php</code>內底揣著彼項。",
+    "config-localsettings-cli-upgrade": "有一个<code>LocalSettings.php</code>檔案。若欲升級,請直接執行<code>update.php</code>。",
+    "config-localsettings-key": "升級的密碼:",
+    "config-localsettings-badkey": "你提供的密碼無正確。",
+    "config-upgrade-key-missing": "已經有一个MediaWiki矣。若要升級,請共下面這逝加去<code>LocalSettings.php</code>的下跤:\n\n$1",
+    "config-localsettings-incomplete": "這馬的<code>LocalSettings.php</code>可能無齊全,因為無設變量$1。請佇<code>LocalSettings.php</code>設彼个變量,並且揤「{{int:Config-continue}}」。",
+    "config-localsettings-connection-error": "An error was encountered when connecting to the database 用<code>LocalSettings.php</code>的設定去連接資料庫的時陣有一个錯誤發生,請改遮的設定了,才閣試。\n\n$1",
+    "config-session-error": "連線開始了的錯誤:$1",
+    "config-session-expired": "你連線資料已經過時矣,連線的使用期限是設做$1。你會使改共php.ini的<code>session.gc_maxlifetime</code>改較長,並且重新安裝動作。",
+    "config-no-session": "你連線的資料已經無去矣,看你的php.ini,並且確定<code>session.save_path</code>是正確的目錄。",
+    "config-your-language": "你的話語:",
+    "config-your-language-help": "選一个安裝過程時欲用的話語",
+    "config-wiki-language": "Wiki話語",
+    "config-wiki-language-help": "選一个Wiki大部份用的話",
+    "config-back": "← 倒退",
+    "config-continue": "繼續 →",
+    "config-page-language": "話語",
+    "config-page-welcome": "歡迎來MediaWiki!",
+    "config-page-dbconnect": "連接去資料庫",
+    "config-page-upgrade": "共這馬的安裝升級",
+    "config-page-dbsettings": "資料庫的設定",
+    "config-page-name": "名稱",
+    "config-page-options": "選項",
+    "config-page-install": "安裝",
+    "config-page-complete": "完成",
+    "config-page-restart": "重裝",
+    "config-page-readme": "讀我",
+    "config-page-releasenotes": "發布的說明",
+    "config-page-copying": "複製",
+    "config-page-upgradedoc": "升級",
+    "config-page-existingwiki": "已經裝的Wiki",
+    "config-help-restart": "你敢欲共你拍的佮保存的資料攏清掉,並且重開始安裝的動作?",
+    "config-restart": "是,重來",
+    "config-welcome": "=== 環境檢測 ===\n這馬欲做基本的檢測,看環境是毋是適合裝 MediaWiki。\n若你愛有支援,才裝會起來,請共遮的資訊記起來。",
     "mainpagetext": "'''MediaWiki已經裝好矣。'''",
     "mainpagedocfooter": "請查看[//meta.wikimedia.org/wiki/Help:Contents 用者說明書]的資料通使用wiki 軟體\n\n== 入門 ==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings 配置的設定]\n* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki時常問答]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki的公布列單]"
-}
\ No newline at end of file
+}
index d243baf..33c0b2a 100644 (file)
@@ -3,7 +3,8 @@
         "authors": [
             "Event",
             "Nghtwlkr",
-            "아라"
+            "아라",
+            "Danmichaelo"
         ]
     },
     "config-desc": "Installasjonsprogrammet for MediaWiki",
     "config-unicode-using-intl": "Bruker [http://pecl.php.net/intl intl PECL-utvidelsen] for Unicode-normalisering.",
     "config-unicode-pure-php-warning": "'''Advarsel''': [http://pecl.php.net/intl intl PECL-utvidelsen] er ikke tilgjengelig for å håndtere Unicode-normaliseringen, faller tilbake til en langsommere ren-PHP-implementasjon.\nOm du kjører et nettsted med høy trafikk bør du lese litt om [//www.mediawiki.org/wiki/Unicode_normalization_considerations Unicode-normalisering].",
     "config-unicode-update-warning": "'''Advarsel''': Den installerte versjonen av Unicode-normalisereren bruker en eldre versjon av [http://site.icu-project.org/ ICU-prosjektets] bibliotek.\nDu bør [//www.mediawiki.org/wiki/Unicode_normalization_considerations oppgradere] om du er bekymret for å bruke Unicode.",
-    "config-no-db": "Fant ikke en passende databasedriver! Du må installere en databasedriver for PHP.\nFølgende databasetyper er støttet: $1\n\nOm du er på delt vertsskap, spør din vertsleverandør om å installere en passende databasedriver.\nOm du kompilerte PHP selv, rekonfigirer den med en aktivert databaseklient, for eksempel ved å bruke <code>./configure --with-mysql</code>.\nOm du installerte PHP fra en Debian- eller Ubuntu-pakke må du også installere modulen php5-mysql.",
+    "config-no-db": "Fant ingen passende databasedriver! Du må installere en databasedriver for PHP.\nFølgende databasetyper støttes: $1\n\nOm du kompilerte PHP selv, rekonfigurer den med en aktivert databaseklient, for eksempel ved å bruke <code>./configure --with-mysql</code>.\nOm du installerte PHP fra en Debian- eller Ubuntu-pakke, må du også installere for eksempel <code>php5-mysql</code>-pakken.",
     "config-outdated-sqlite": "'''Advarsel''': Du har SQLite $1, som er en eldre versjon enn minimumskravet SQLite $2. SQLite vil ikke være tilgjengelig.",
     "config-no-fts3": "'''Advarsel''': SQLite er kompilert uten [//sqlite.org/fts3.html FTS3-modulen], søkefunksjoner vil ikke være tilgjengelig på dette bakstykket.",
     "config-register-globals": "'''Advarsel: PHPs <code>[http://php.net/register_globals register_globals]</code>-alternativ er aktivert.'''\n'''Deaktiver det om du kan.'''\nMediaWiki vil fungere, men tjeneren din er utsatt for potensielle sikkerhetssårbarheter.",
     "config-magic-quotes-runtime": "'''Kritisk: [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-runtime magic_quotes_runtime] er aktiv!'''\nDette alternativet ødelegger inndata på en uforutsigbar måte.\nDu kan ikke installere eller bruke MediaWiki med mindre dette alternativet deaktiveres.",
     "config-magic-quotes-sybase": "'''Kritisk: [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-sybase magic_quotes_sybase] er aktiv!'''\nDette alternativet ødelegger inndata på en uforutsigbar måte.\nDu kan ikke installere eller bruke MediaWiki med mindre dette alternativet deaktiveres.",
     "config-mbstring": "'''Kritisk: [http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload] er aktiv!'''\nDette alternativet fører til feil og kan ødelegge data på en uforutsigbar måte.\nDu kan ikke installere eller bruke MediaWiki med mindre dette alternativet deaktiveres.",
-    "config-ze1": "'''Kritisk: [http://www.php.net/manual/en/ini.core.php zend.ze1_compatibility_mode] er aktiv!'''\nDette alternativet fører til horrible feil med MediaWiki.\nDu kan ikke installere eller bruke MediaWiki med mindre dette alternativet deaktiveres.",
     "config-safe-mode": "'''Advarsel:''' PHPs [http://www.php.net/features.safe-mode safe mode] er aktiv.\nDet kan føre til problem, spesielt hvis du bruker støtte for filopplastinger og <code>math</code>.",
     "config-xml-bad": "PHPs XML-modul mangler.\nMediaWiki krever funksjonene i denne modulen og vil ikke virke i denne konfigurasjonen.\nHvis du kjører Mandrak, installer pakken php-xml.",
-    "config-pcre": "PCRE-støttemodulen ser ut til å mangle.\nMediaWiki krever funksjonene for de Perl-kompatible regulære uttrykkene for å virke.",
+    "config-pcre-old": "'''Alvorlig:''' PCRE $1 eller senere kreves.\nDin PHP-kode er lenket med PCRE $2.\n[https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/PCRE Nærmere informasjon].",
     "config-pcre-no-utf8": "'''Fatal''': PHPs PCRE modul ser ut til å være kompilert uten PCRE_UTF8-støtte.\nMediaWiki krever UTF-8-støtte for å fungere riktig.",
     "config-memory-raised": "PHPs <code>memory_limit</code> er $1, økt til $2.",
     "config-memory-bad": "'''Advarsel:''' PHPs <code>memory_limit</code> er $1.\nDette er sannsynligvis for lavt.\nInstallasjonen kan mislykkes!",
     "config-ctype": "'''Fatal feil''': PHP må kompileres med støtte for [http://www.php.net/manual/en/ctype.installation.php Ctype-utvidelsen].",
+    "config-json": "'''Alvorlig:''' PHP ble kompilert uten JSON-støtte.\nDu må installere enten PHP JSON-utvidelsen eller [http://pecl.php.net/package/jsonc PECL jsonc]-utvidelsen før du installere MediaWiki.\n* PHP-utvidelsen inngår i Red Hat Enterprise Linux (CentOS) 5 and 6, men må aktiveres i <code>/etc/php.ini</code> eller <code>/etc/php.d/json.ini</code>.\n* Noen Linux-distribusjoner sluppet etter mai 2013 har ikke med PHP-utvidelsen, men har i stedet med PECL-utvidelsen <code>php5-json</code> eller <code>php-pecl-jsonc</code>.",
     "config-xcache": "[http://xcache.lighttpd.net/ XCache] er innstallert",
     "config-apc": "[http://www.php.net/apc APC] er innstallert",
     "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache] er installert",
     "config-no-cache": "'''Advarsel:''' Kunne ikke finne [http://www.php.net/apc APC], [http://xcache.lighttpd.net/ XCache] eller [http://www.iis.net/download/WinCacheForPhp WinCache].\nObjekthurtiglagring er ikke aktivert.",
     "config-mod-security": "'''Advarsel''': Din web-tjener har [http://modsecurity.org/ mod_security] påslått. Hvis denne er feilinnstilt, kan det gi problemer for MediaWiki eller annen programvare som tillater brukere å poste vilkårlig innhold.\nSjekk [http://modsecurity.org/documentation/ mod_security-dokumentasjonen] eller ta kontakt med din nettleverandør hvis du opplever tilfeldige feil.",
     "config-diff3-bad": "GNU diff3 ikke funnet.",
+    "config-git": "Har funnet Git version control software: <code>$1</code>.",
+    "config-git-bad": "Git version control software ble ikke funnet.",
     "config-imagemagick": "Fant ImageMagick: <code>$1</code>.\nBildeminiatyrisering vil aktiveres om du aktiverer opplastinger.",
     "config-gd": "Fant innebygd GD-grafikkbibliotek.\nBildeminiatyrisering vil aktiveres om du aktiverer opplastinger.",
     "config-no-scaling": "Kunne ikke finne GD-bibliotek eller ImageMagick.\nBildeminiatyrisering vil være deaktivert.",
     "config-no-uri": "'''Feil:''' Kunne ikke bestemme gjeldende URI.\nInstallasjon avbrutt.",
-    "config-no-cli-uri": "'''Advarsel''': Ingen --scriptpath er angitt; bruker standard: <code>$1</code>.",
+    "config-no-cli-uri": "'''Advarsel''': Ingen <code>--scriptpath</code> er angitt; bruker standard: <code>$1</code>.",
     "config-using-server": "Bruker servernavnet  \"<nowiki>$1</nowiki>\".",
     "config-using-uri": "Bruker server-URL \"<nowiki>$1$2</nowiki>\".",
     "config-uploads-not-safe": "'''Advarsel:''' Din standardmappe for opplastinger <code>$1</code> er sårbar for kjøring av vilkårlige skript.\nSelv om MediaWiki sjekker alle opplastede filer for sikkerhetstrusler er det sterkt anbefalt å [//www.mediawiki.org/wiki/Manual:Security#Upload_security lukke denne sikkerhetssårbarheten] før du aktiverer opplastinger.",
     "config-no-cli-uploads-check": "'''Advarsel:''' Din standard-katalog for opplastinger (<code>$1</code>) er ikke kontrollert for sårbarhet overfor vilkårlig skript-kjøring under CLI-installasjonen.",
-    "config-brokenlibxml": "Ditt system har en kombinasjon av PHP- og libxml2-versjoner som er feilaktige og kan forårsake skjult dataødeleggelse i MediaWiki og andre web-applikasjoner.\nOppgrader til PHP 5.2.9 eller nyere og libxml 2 2.7.3 eller nyere ([//bugs.php.net/bug.php?id=45996 Feil-liste for PHP]).\nInstallasjon abortert.",
-    "config-using531": "MediaWiki kan ikke brukes med PHP $1 på grunn av en feil med referanseparametere til <code>__call()</code>.\nOppgrader til PHP 5.3.2 eller høyere, eller nedgrader til PHP 5.3.0 for å løse dette.\nInstallasjonen avbrutt.",
-    "config-suhosin-max-value-length": "Suhosin er installert og begrenser GET-parameterlengder til $1 bytes. MediaWiki's ResourceLoader-komponent klarer å komme rundt denne begrensningen, med med redusert ytelse. På mulig bør du sette <code>suhosin.get.max_value_length</code> til minst 1024 i <code>php.ini</code>, og sette <code>$wgResourceLoaderMaxQueryLength</code> til samme verdi i LocalSettings.php.",
+    "config-brokenlibxml": "Ditt system bruker en kombinasjon av PHP- og libxml2-versjoner som har feil og kan forårsake skjult dataødeleggelse i MediaWiki og andre web-applikasjoner.\nOppgrader til libxml2 2.7.3 eller nyere ([https://bugs.php.net/bug.php?id=45996 Feil-liste for PHP]).\nInstalleringen ble abortert.",
+    "config-suhosin-max-value-length": "Suhosin er installert og begrenser GET-parameterlengder til $1 bytes. MediaWiki sin ResourceLoader-komponent klarer å komme rundt denne begrensningen, men med redusert ytelse. Om mulig bør du sette <code>suhosin.get.max_value_length</code> til minst 1024 i <code>php.ini</code>, og sette <code>$wgResourceLoaderMaxQueryLength</code> til samme verdi i <code>LocalSettings.php</code>.",
     "config-db-type": "Databasetype:",
     "config-db-host": "Databasevert:",
     "config-db-host-help": "Hvis databasen kjører på en annen tjenermaskin, skriv inn vertsnavnet eller IP-adressen her.\n\nHvis du bruker et webhotell, vil du kunne be om aktuelt vertsnavn fra din leverandør.\n\nHvis du installerer på en Windowstjener og bruker MySQL, kan det hende at «localhost» ikke brukes som tjenernavn. Hvis så er tilfelle, prøv «127.0.0.1» som lokal IP-adresse.\n\nHvis du bruker PostgreSQL, la dette feltet være blankt slik at koplingen gjøres via en \"Unix socket\".",
     "config-sqlite-dir-help": "SQLite lagrer alle data i en enkelt fil.\n\nMappen du oppgir må være skrivbar for nettjeneren under installasjonen.\n\nDen bør '''ikke''' være tilgjengelig fra nettet, dette er grunnen til at vi ikke legger det der PHP-filene dine er.\n\nInstallasjonsprogrammet vil skrive en <code>.htaccess</code>-fil sammen med det, men om det mislykkes kan noen få tilgang til din råe database. Dette inkluderer rå brukerdata (e-postadresser, hashede passord) samt slettede revisjoner og andre begrensede data på wikien.\n\nVurder å plassere databasen et helt annet sted, for eksempel i <code>/var/lib/mediawiki/yourwiki</code>.",
     "config-oracle-def-ts": "Standard tabellrom:",
     "config-oracle-temp-ts": "Midlertidig tabellrom:",
-    "config-type-mysql": "MySQL",
+    "config-type-mysql": "MySQL (eller kompatibelt)",
     "config-type-postgres": "PostgreSQL",
     "config-type-sqlite": "SQLite",
     "config-type-oracle": "Oracle",
+    "config-type-mssql": "Microsoft SQLServer",
     "config-support-info": "MediaWiki støtter følgende databasesystem:\n\n$1\n\nHvis du ikke ser databasesystemet du prøver å bruke i listen nedenfor, følg instruksjonene det er lenket til over for å aktivere støtte.",
-    "config-support-mysql": "* $1 er det primære målet for MediaWiki og er best støttet ([http://www.php.net/manual/en/mysql.installation.php hvordan kompilere PHP med MySQL-støtte])",
-    "config-support-postgres": "* $1 er et populært åpen kildekode-databasesystem som er et alternativ til MySQL ([http://www.php.net/manual/en/pgsql.installation.php hvordan kompilere PHP med PostgreSQL-støtte]). Det kan være noen små utestående feil og det anbefales ikke for bruk i et produksjonsmiljø.",
-    "config-support-sqlite": "* $1 er et lettvekts-databasesystem som er veldig godt støttet. ([http://www.php.net/manual/en/pdo.installation.php hvordan kompilere PHP med SQLite-støtte], bruker PDO)",
-    "config-support-oracle": "* $1 er en kommersiell bedriftsdatabase. ([http://www.php.net/manual/en/oci8.installation.php Hvordan kompilere PHP med OCI8-støtte])",
+    "config-dbsupport-mysql": "* [{{int:version-db-mysql-url}} MySQL] er den prefererte databasen for MediaWiki og er derfor best støttet.  MediaWiki fungerer også med [{{int:version-db-mariadb-url}} MariaDB] og [{{int:version-db-percona-url}} Percona Server], som begge er MySQL-kompatible. ([http://www.php.net/manual/en/mysqli.installation.php Hvordan kompilere med PHP med MySQL-støtte])",
+    "config-dbsupport-postgres": "* [{{int:version-db-postgres-url}} PostgreSQL] er et populært åpen kildekode-databasesystem og et alternativ til MySQL. Det kan ha noen små utestående feil og det anbefales derfor ikke for bruk i et produksjonsmiljø. ([http://www.php.net/manual/en/pgsql.installation.php Hvordan kompilere PHP med PostgreSQL-støtte])",
+    "config-dbsupport-sqlite": "* [{{int:version-db-sqlite-url}} SQLite] er et lettvekts-databasesystem som har veldig god støtte. ([http://www.php.net/manual/en/pdo.installation.php Hvordan kompilere PHP med SQLite-støtte], bruker PDO)",
+    "config-dbsupport-oracle": "* [{{int:version-db-oracle-url}} Oracle] er en kommersiell database for bedrifter. ([http://www.php.net/manual/en/oci8.installation.php Hvordan kompilere PHP med OCI8-støtte])",
+    "config-dbsupport-mssql": "* [{{int:version-db-mssql-url}} Microsoft SQLServer] er en kommersiell enterprise-database for Windows. ([http://www.php.net/manual/en/sqlsrv.installation.php Hvordan kompilere PHP med SQLSRV-støtte])",
     "config-header-mysql": "MySQL-innstillinger",
     "config-header-postgres": "PostgreSQL-innstillinger",
     "config-header-sqlite": "SQLite-innstillinger",
     "config-header-oracle": "Oracle-innstillinger",
+    "config-header-mssql": "Microsoft SQLServer-innstillinger",
     "config-invalid-db-type": "Ugyldig databasetype",
     "config-missing-db-name": "Du må skrive inn en verdi for «Databasenavn»",
     "config-missing-db-host": "Du må skrive inn en verdi for «Databasevert»",
     "config-missing-db-server-oracle": "Du må skrive inn en verdi for «Database TNS»",
-    "config-invalid-db-server-oracle": "Ugyldig database-TNS «$1».\nBruk bare ASCII-bokstaver (a-z, A-Z), tall (0-9) og undestreker (_) og punktum (.).",
+    "config-invalid-db-server-oracle": "Ugyldig database-TNS «$1».\nBruk enten \"TNS Name\" eller en \"Easy Connect\"-streng ([http://docs.oracle.com/cd/E11882_01/network.112/e10836/naming.htm Oracle Naming Methods])",
     "config-invalid-db-name": "Ugyldig databasenavn «$1».\nBruk bare ASCII-bokstaver (a-z, A-Z), tall (0-9), undestreker (_) og bindestreker (-).",
     "config-invalid-db-prefix": "Ugyldig databaseprefiks «$1».\nBruk bare ASCII-bokstaver (a-z, A-Z), tall (0-9), undestreker (_) og bindestreker (-).",
     "config-connection-error": "$1.\n\nSjekk verten, brukernavnet og passordet nedenfor og prøv igjen.",
     "config-db-sys-create-oracle": "Installasjonsprogrammet støtter kun bruk av en SYSDBA-konto for opprettelse av en ny konto.",
     "config-db-sys-user-exists-oracle": "Brukerkontoen «$1» finnes allerede. SYSDBA kan kun brukes for oppretting av nye kontoer!",
     "config-postgres-old": "PostgreSQL $1 eller senere kreves, du har $2.",
+    "config-mssql-old": "Microsoft SQLServer $1 eller senere kreves. Du har $2.",
     "config-sqlite-name-help": "Velg et navn som identifiserer wikien din.\nIkke bruk mellomrom eller bindestreker.\nDette vil bli brukt til SQLite-datafilnavnet.",
     "config-sqlite-parent-unwritable-group": "Kan ikke opprette datamappen <code><nowiki>$1</nowiki></code> fordi foreldremappen <code><nowiki>$2</nowiki></code> ikke er skrivbar for nettjeneren.\n\nInstallasjonsprogrammet har bestemt brukeren nettjeneren din kjører som.\nGjør <code><nowiki>$3</nowiki></code>-mappen skrivbar for denne for å fortsette.\nPå et Unix/Linux-system, gjør:\n\n<pre>cd $2\nmkdir $3\nchgrp $4 $3\nchmod g+w $3</pre>",
     "config-sqlite-parent-unwritable-nogroup": "Kan ikke opprette datamappen <code><nowiki>$1</nowiki></code> fordi foreldremappen <code><nowiki>$2</nowiki></code> ikke er skrivbar for nettjeneren.\n\nInstallasjonsprogrammet kunne ikke bestemme brukeren nettjeneren din kjører som.\nGjør <code><nowiki>$3</nowiki></code>-mappen globalt skrivbar for denne (og andre!) for å fortsette.\nPå et Unix/Linux-system, gjør:\n\n<pre>cd $2\nmkdir $3\nchmod a+w $3</pre>",
     "config-mysql-engine": "Lagringsmotor:",
     "config-mysql-innodb": "InnoDB",
     "config-mysql-myisam": "MyISAM",
+    "config-mysql-myisam-dep": "'''Advarsel:''' Du har valgt MyISAM som lagringsmotor for MySQL, noe som ikke er anbefalt for bruk med MediaWiki, fordi:\n* den knapt støtter samtidighet pga. tabell-låsing\n* den har større tilbøyelighet for å bli korrupt enn andre motorer\n* MediaWiki-koden håndterer ikke alltid MyISAM som den burde\n\nHvis din MySQL-installasjon støtter InnoDB, er det sterkt å anbefale at du i stedet velger den.\nHvis din MySQL-installasjon ikke støtter InnoDB, kan det være på tide med en oppgradering.",
+    "config-mysql-only-myisam-dep": "'''Advarsel:''' MyISAM er den eneste tilgjengelig lagringsmotoren for MySQL på denne maskinen, og det er ikke anbefalt brukt for MediaWiki, fordi:\n* den knapt støtter samtidighet pga. tabell-låsing\n* den har større tilbøyelighet for å bli korrupt enn andre motorer\n* MediaWiki-koden håndterer ikke alltid MyISAM som den burde\n\nHvis din MySQL-installasjon ikke støtter InnoDB, kan det være på tide med en oppgradering.",
     "config-mysql-engine-help": "'''InnoDB''' er nesten alltid det beste alternativet siden den har god støtte for samtidighet («concurrency»).\n\n'''MyISAM''' kan være raskere i enbruker- eller les-bare-installasjoner.\nMyISAM-databaser har en tendens til å bli ødelagt oftere enn InnoDB-databaser.",
     "config-mysql-charset": "Databasetegnsett:",
     "config-mysql-binary": "Binær",
     "config-mysql-utf8": "UTF-8",
     "config-mysql-charset-help": "I '''binary mode''' lagrer MediaWiki UTF-8 tekst til databasen i binærfelt.\nDette er mer effektivt enn MySQLs UTF-8 modus og tillater deg å bruke hele spekteret av Unicode-tegn.\n\nI '''UTF-8 mode''' vil MySQL vite hvilket tegnsett dataene dine er i og kan presentere og konvertere det på en riktig måte,\nmen det vil ikke la deg lagre tegn over «[//en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes the Basic Multilingual Plane]».",
+    "config-mssql-auth": "Autentiseringstype:",
+    "config-mssql-install-auth": "Valg autentiseringstypen som skal brukes for å koble til databasen under installeringsprosessen. Hvis du velger «{{int:config-mssql-windowsauth}}», vil påloggingsinformasjonen for brukeren som kjører webtjeneren blir brukt.",
+    "config-mssql-web-auth": "Velg autentiseringstype som webtjeneren vil bruke for å koble til databasetjeneren under normal kjøring av wikien.\nHvis du velger «{{int:config-mssql-windowsauth}}», vil påloggingsinformasjonen til brukeren som kjører webtjeneren blir brukt.",
+    "config-mssql-sqlauth": "SQLServer-autentisering",
+    "config-mssql-windowsauth": "Windows-autentisering",
     "config-site-name": "Navn på wiki:",
     "config-site-name-help": "Dette vil vises i tittellinjen i nettleseren og diverse andre steder.",
     "config-site-name-blank": "Skriv inn et nettstedsnavn.",
     "config-admin-name-blank": "Skriv inn et administratorbrukernavn.",
     "config-admin-name-invalid": "Det angitte brukernavnet «<nowiki>$1</nowiki>» er ugyldig.\nAngi et annet brukernavn.",
     "config-admin-password-blank": "Skriv inn et passord for administratorkontoen.",
-    "config-admin-password-same": "Passordet skal ikke være det samme som brukernavnet.",
     "config-admin-password-mismatch": "De to passordene du skrev inn samsvarte ikke.",
     "config-admin-email": "E-postadresse:",
     "config-admin-email-help": "Skriv inn en e-postadresse her for at du skal kunne motta e-post fra andre brukere på wikien, tilbakestille passordet ditt, og bli varslet om endringer på sider på overvåkningslisten din. Du kan la dette feltet stå tomt.",
     "config-admin-error-bademail": "Du har skrevet inn en ugyldig e-postadresse.",
     "config-subscribe": "Abonner på [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce e-postlisten for utgivelsesannonseringer].",
     "config-subscribe-help": "Dette er en lav-volums e-postliste brukt til utgivelsesannonseringer, herunder viktige sikkerhetsannonseringer.\nDu bør abonnere på den og oppdatere MediaWikiinstallasjonen din når nye versjoner kommer ut.",
+    "config-subscribe-noemail": "Du prøvde å abonnere på epost-meldinger om nye versjoner uten å oppgi en epost-adresse. Vær vennlig å oppgi en epost-adresse om du ønsker dette abonnementet.",
     "config-almost-done": "Du er nesten ferdig!\nDu kan hoppe over de resterende konfigurasjonene og installere wikien nå.",
     "config-optional-continue": "Spør meg flere spørsmål.",
     "config-optional-skip": "Jeg er lei, bare installer wikien.",
     "config-profile": "Brukerrettighetsprofil:",
-    "config-profile-wiki": "Tradisjonell wiki",
+    "config-profile-wiki": "Åpen wiki",
     "config-profile-no-anon": "Kontoopprettelse påkrevd",
     "config-profile-fishbowl": "Kun autoriserte bidragsytere",
     "config-profile-private": "Privat wiki",
-    "config-profile-help": "Wikier fungerer best når du lar så mange mennesker som mulig redigere den.\nI MediaWiki er det lett å revidere siste endringer og tilbakestille eventuell skade som er gjort av naive eller ondsinnede brukere.\n\nImidlertid har mange funnet at MediaWiki er nyttig i mange roller, og av og til er det ikke lett å overbevise alle om fordelene med wikimåten.\nSå du har valget.\n\nEn '''{{int:config-profile-wiki}}''' tillater alle å redigere, selv uten å logge inn.\nEn wiki med '''{{int:config-profile-no-anon}}''' tilbyr ekstra ansvarlighet, men kan avskrekke tilfeldige bidragsytere.\n\n'''{{int:config-profile-fishbowl}}'''-scenariet tillater godkjente brukere å redigere, mens publikum kan se sider, og også historikken.\nEn '''{{int:config-profile-private}}''' tillater kun godkjente brukere å se sider, den samme gruppen som får lov til å redigere dem.\n\nMer komplekse konfigurasjoner av brukerrettigheter er tilgjengelig etter installasjon, se det [//www.mediawiki.org/wiki/Manual:User_rights relevante manualavsnittet].",
+    "config-profile-help": "Wikier fungerer best om du lar så mange mennesker som mulig redigere den.\nI MediaWiki er det enkelt å se på de siste endringene og tilbakestille eventuell skade som er gjort av naive eller ondsinnede brukere.\n\nImidlertid har mange funnet at MediaWiki er nyttig for mange formål, og av og til er det ikke lett å overbevise alle om fordelene med wiki-funksjonaliteten.\nSå du har valget.\n\nEn '''{{int:config-profile-wiki}}''' tillater enhver å redigere, selv uten å logge inn.\nEn wiki med '''{{int:config-profile-no-anon}}''' tilbyr ekstra ansvarlighet, men kan avskrekke tilfeldige bidragsytere.\n\n'''{{int:config-profile-fishbowl}}'''-scenariet tillater godkjente brukere å redigere, mens publikum kan se sider, og også historikken.\nEn '''{{int:config-profile-private}}''' tillater kun godkjente brukere å se sider, der den samme gruppen også får lov til å redigere dem.\n\nMer komplekse konfigurasjoner av brukerrettigheter er tilgjengelige etter installasjonen, se [//www.mediawiki.org/wiki/Manual:User_rights relevant avsnitt i brukerbeskrivelsen].",
     "config-license": "Opphavsrett og lisens:",
     "config-license-none": "Ingen lisensbunntekst",
     "config-license-cc-by-sa": "Creative Commons Navngivelse Del på samme vilkår",
     "config-license-cc-by": "Creative Commons Attribution",
     "config-license-cc-by-nc-sa": "Creative Commons Navngivelse Ikke-kommersiell Del på samme vilkår",
-    "config-license-cc-0": "Creative Commons Zero",
+    "config-license-cc-0": "Creative Commons Zero (tilgjengelig for alle)",
+    "config-license-gfdl": "GNU Free Documentation License 1.3 eller senere",
     "config-license-pd": "Offentlig rom",
     "config-license-cc-choose": "Velg en egendefinert Creative Commons-lisens",
+    "config-license-help": "Mange åpne wikier legger alle bidrag under en [http://freedomdefined.org/Definition gratislisens].\nDette gir en følelse av felleseie og stimulerer til langvarige bidrag.\nDette er normalt unødvendig for en privat eller virksomhetsbegrenset wiki.\n\nHvis du ønsker å kunne bruke tekst fra Wikipedia, og at Wikipedia skal kunne ta i mot tekst kopiert fra din wiki, bør du velge '''Creative Commons Attribution Share Alike'''.\n\nWikipedia brukte tidligere GNU Free Documentation License.\nGFDL er en grei lisens, med vanskelig å forstå.\nDet er også vanskelig å gjenbruke innhold lisensiert under GFDL.",
     "config-email-settings": "E-postinnstillinger",
     "config-enable-email": "Aktiver utgående e-post",
     "config-enable-email-help": "Hvis du vil at e-post skal virke må [http://www.php.net/manual/en/mail.configuration.php PHPs e-postinnstillinger] bli konfigurert riktig.\nHvis du ikke ønsker noen e-postfunksjoner kan du deaktivere dem her.",
     "config-upload-deleted": "Mappe for slettede filer:",
     "config-upload-deleted-help": "Velg en mappe for å arkivere slettede filer.\nIdeelt burde ikke denne være tilgjengelig for nettet.",
     "config-logo": "Logo-URL:",
-    "config-logo-help": "MediaWikis standarddrakt inkluderer plass til en 135x160 pikslers logo i øvre venstre hjørne.\nLast opp et bilde i passende størrelse og skriv inn nettadressen her.\n\nHvis du ikke ønsker en logo, la denne boksen være tom.",
+    "config-logo-help": "MediaWikis standarddrakt har satt av plass til en 135x160 pikslers logo i øvre venstre hjørne av sidepanelet.\nLast opp et bilde i passende størrelse og skriv inn nettadressen her.\n\nDu kan bruke code>$wgStylePath</code> eller <code>$wgScriptPath</code> hvis logoen er relativ til disse stiene.\n\nHvis du ikke ønsker noen logo, la boksen være tom.",
     "config-instantcommons": "Aktiver Instant Commons",
     "config-instantcommons-help": "[//www.mediawiki.org/wiki/InstantCommons Instant Commons] er en funksjon som gjør det mulig for wikier å bruke bilder, lyder og andre media funnet på nettstedet [//commons.wikimedia.org/ Wikimedia Commons].\nFor å gjøre dette krever MediaWiki tilgang til internett.\n\nFor mer informasjon om denne funksjonen, inklusive instruksjoner om hvordan man setter opp dette for andre wikier enn Wikimedia Commons, konsulter [//mediawiki.org/wiki/Manual:$wgForeignFileRepos manualen].",
+    "config-cc-error": "Lisensvelgeren for Creative Commons ga ikke noe resultat.\nLegg inn lisensnavnet manuelt.",
     "config-cc-again": "Velg igjen...",
     "config-cc-not-chosen": "Velg hvilken Creative Commons-lisens du ønsker og klikk «fortsett».",
     "config-advanced-settings": "Avansert konfigurasjon",
+    "config-cache-options": "Innstillinger for objekt-mellomlagring:",
+    "config-cache-help": "Objekt-mellomlagring brukes for å forbedre hastigheten for MediaWiki. Ofte forekommende data lagres for gjenbruk.\nMiddels til store nettsteder bør absolutt aktivisere mellomlagring, med også små nettsteder kan ha nytte av dette.",
+    "config-cache-none": "Ingen mellomlagring (ingen funksjonalitet mistes, men hastigheten kan bli dårlig for store wikier-nettsteder)",
+    "config-cache-accel": "Mellomlagring av PHP-objekter (APC, XCache or WinCache)",
+    "config-cache-memcached": "Bruk Memcached (krever tilleggsoppsett og -konfigurering)",
+    "config-memcached-servers": "Memcached-servere:",
+    "config-memcached-help": "Liste av IP-adresser for bruk fra Memcached.\nDet bør angis en per linje sammen med porten som brukes. For eksempel:\n 127.0.0.1:11211\n 192.168.1.25:1234",
+    "config-memcache-needservers": "Du valgte Memcached som din mellomlagringstype, men anga ingen servere.",
+    "config-memcache-badip": "Du har lagt inn en ugyldig IP-adresse for Memcached: $1.",
+    "config-memcache-noport": "Du spesifiserte ingen port til å bruke for Memcached-server: $1.\nHvis du ikke kjenner porten, så er stardard 11211.",
+    "config-memcache-badport": "Memcached-port-numrene må være mellom $1 og $2.",
     "config-extensions": "Utvidelser",
+    "config-extensions-help": "Utvidelsene listet over ble oppdaget i din <code>./extensions</code>-folder.\n\nDisse kan trenge ekstra konfigurering, men du kan aktivisere dem nå.",
+    "config-install-alreadydone": "'''Advarsel:''' Det ser ut til at allerede har installert MediaWiki og prøver å installere denne må nytt.\nVær vennlig å fortsette til neste side.",
+    "config-install-begin": "Ved å trykke \"{{int:config-continue}}\", starter du installeringen av MediaWiki.\nHvis du først ønsker å endre på noe, trykk\"{{int:config-back}}\".",
     "config-install-step-done": "ferdig",
     "config-install-step-failed": "mislyktes",
     "config-install-extensions": "Inkludert utvidelser",
     "config-install-database": "Setter opp database",
+    "config-install-schema": "Opprette \"schema\"",
+    "config-install-pg-schema-not-exist": "PostgreSQL \"schema\" finnes ikke.",
+    "config-install-pg-schema-failed": "Opprettelse av tabell var mislykket.\nPass på at bruker \"$1\" kan skrive til schema \"$2\".",
+    "config-install-pg-commit": "Beslutte endringer",
+    "config-install-pg-plpgsql": "Sjekk om språket er PL/pgSQL",
+    "config-pg-no-plpgsql": "Du må installere språket PL/pgSQL i database $1",
+    "config-pg-no-create-privs": "Brukerkontoen du anga for installering har ikke nok privilegier for å opprette annen brukerkonto.",
+    "config-pg-not-in-role": "Brukerkontoen du anga for web-brukeren finnes allerede.\nBrukerkontoen du anga for installering er ikke superbruker og er ikke medlem av webbrukerens rolle, så den kan ikke opprette objekter eid av webbrukeren.\n\nMediaWiki krever nå at tabellen eies av webbrukeren. Vær vennlig å angi en annen webbrukerkonto, eller klikk \"tilbake\" og angi en installeringsbruker med nødvendige privilegier.",
     "config-install-user": "Oppretter databasebruker",
     "config-install-user-alreadyexists": "Brukeren «$1» finnes allerede",
     "config-install-user-create-failed": "Opprettelse av brukeren «$1» mislyktes: $2",
     "config-install-user-grant-failed": "Å gi tillatelse til brukeren «$1» mislyktes: $2",
+    "config-install-user-missing": "Den angitte brukeren \"$1\" finnes ikke.",
+    "config-install-user-missing-create": "Den angitte brukeren \"$1\" finnes ikke.\nVær vennlig å klikke i avkrysningsboksen \"opprett konto\" under hvis du ønsker å opprette denne.",
     "config-install-tables": "Oppretter tabeller",
+    "config-install-tables-exist": "'''Advarsel:''' MediaWiki-tabellen ser ut til å finnes allerede.\nHopper derfor over opprettelsen.",
+    "config-install-tables-failed": "<strong>Feil:</strong> Opprettelsen av tabellen feilet med følgende melding: $1",
+    "config-install-interwiki": "Populerer standard interwiki-tabell",
+    "config-install-interwiki-list": "Det var ikke mulig å lese filen <code>interwiki.list</code>.",
+    "config-install-interwiki-exists": "<strong>Advarsel:</strong> Interwiki-tabellen ser allerede ut til å ha innhold.\nLegger derfor ikke inn standardlisten.",
+    "config-install-stats": "Initialiserer statisikk",
+    "config-install-keys": "Genererer hemmelige nøkler",
+    "config-insecure-keys": "<strong>Advarsel:</strong> {{PLURAL:$2|En sikker nøkkel|Sikre nøkler}} ($1) generert under installeringen er ikke helt {{PLURAL:$2|trygg|trygge}}. Vurder å endre {{PLURAL:$2|den|dem}} manuelt.",
+    "config-install-sysop": "Oppretter brukerkonto for administrator",
+    "config-install-subscribe-fail": "Ikke mulig å abonnere på mediawiki-announce: $1",
+    "config-install-subscribe-notpossible": "cURL er ikke installert og allow_url_fopen er ikke tilgjengelig.",
+    "config-install-mainpage": "Oppretter hovedside med standard innhold",
+    "config-install-extension-tables": "Oppretter tabeller for aktiviserte utvidelser",
     "config-install-mainpage-failed": "Kunne ikke sette inn hovedside: $1",
+    "config-install-done": "<strong>Gratulrerer!</strong>\nDu har lykkes i å installere MediaWiki.\n\nInstallasjonsprogrammet har generert en <code>LocalSettings.php</code>-fil.\nDen inneholder alle dine konfigureringer.\n\nDu må laste den ned og legge den på hovedfolderen for din wiki-installasjon (der index.php ligger). Nedlastingen skulle ha startet automatisk.\n\nHvis ingen nedlasting ble tilbudt, eller du avbrøt den, kan du få den i gang ved å klikke på lenken under:\n\n$3\n\n<strong>OBS:</strong> Hvis du ikke gjør dette nå, vil den genererte konfigurasjonsfilen ikke være tilgjengelig for deg senere.\n\nNår dette er gjort, kan du <strong>[$2 gå inn i wikien]</strong>.",
     "config-download-localsettings": "Last ned <code>LocalSettings.php</code>",
     "config-help": "hjelp",
     "config-nofile": "Filen \"$1\" ble ikke funnet. Kan den være blitt slettet?",
+    "config-extension-link": "Visste du at wikien din kan brukes sammen med en mengde [//www.mediawiki.org/wiki/Manual:Extensions utvidelser]?\n\nDu kan sjekke gjennom [//www.mediawiki.org/wiki/Category:Extensions_by_category utvidelser per kategori] eller [//www.mediawiki.org/wiki/Extension_Matrix utvidelsesmatrisen] for å se den komplette listen av utvidelser.",
     "mainpagetext": "'''MediaWiki-programvaren er nå installert.'''",
-    "mainpagedocfooter": "Se [//meta.wikimedia.org/wiki/Help:Contents brukerveiledningen] for informasjon om hvordan du bruker wiki-programvaren.\n\n==Å starte==\n*[//www.mediawiki.org/wiki/Manual:Configuration_settings Oppsettsliste]\n*[//www.mediawiki.org/wiki/Manual:FAQ Ofte stilte spørsmål]\n*[https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki e-postliste]"
-}
\ No newline at end of file
+    "mainpagedocfooter": "Sjekk [//meta.wikimedia.org/wiki/Help:Contents brukerveiledningen] for å få informasjon om hvordan du bruker wiki-programvaren.\n\n==Hvordan komme igang==\n*[//www.mediawiki.org/wiki/Manual:Configuration_settings Innstillingsliste]\n*[//www.mediawiki.org/wiki/Manual:FAQ Ofte stilte spørsmål om MediaWiki]\n*[https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki e-postliste]\n* [//www.mediawiki.org/wiki/Localisation#Translation_resources Tilpass MediaWiki for ditt språk]"
+}
index 8970d66..bd5fc2f 100644 (file)
@@ -6,4 +6,4 @@
     },
     "mainpagetext": "'''’t Installeren van de MediaWiki programmatuur is succesvol.'''",
     "mainpagedocfooter": "Bekiek de [//meta.wikimedia.org/wiki/Help:Contents haandleiding] veur informasie over t gebruuk van de wikiprogrammatuur.\n\n== Meer hulpe ==\n* [//www.mediawiki.org/wiki/Help:Configuration_settings Lieste mit instellingen]\n* [//www.mediawiki.org/wiki/Help:FAQ MediaWiki-vragen die vake esteld wörden]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki-postlieste veur nieje versies]\n* [//www.mediawiki.org/wiki/Localisation#Translation_resources Maak MediaWiki beschikbaor in joew taal]"
-}
\ No newline at end of file
+}
index e6878e6..1f8e6d0 100644 (file)
@@ -11,4 +11,4 @@
     "config-help": "Hülp",
     "mainpagetext": "'''De MediaWiki-Software is mit Spood installeert worrn.'''",
     "mainpagedocfooter": "Kiek de [//meta.wikimedia.org/wiki/MediaWiki_localisation Dokumentatschoon för dat Anpassen vun de Brukerböversiet]\nun dat [//meta.wikimedia.org/wiki/MediaWiki_User%27s_Guide Brukerhandbook] för Hülp to de Bruuk un Konfiguratschoon."
-}
\ No newline at end of file
+}
index dfeb32c..cc49821 100644 (file)
@@ -2,9 +2,17 @@
     "@metadata": {
         "authors": [
             "Bhawani Gautam",
-            "RajeshPandey"
+            "RajeshPandey",
+            "सरोज कुमार ढकाल"
         ]
     },
+    "config-page-name": "नाम",
+    "config-page-options": "विकल्पहरु",
+    "config-page-install": "स्थापना गर्ने",
+    "config-page-complete": "पूरा भयो !",
+    "config-page-restart": "स्थापना फेरि सुरु गर्ने",
+    "config-page-readme": "पढ्नुहोस्",
+    "config-page-releasenotes": "प्रकाशन टिप्पणी",
     "mainpagetext": "'''मीडिया सफलतापूर्वक कम्प्यूटरमा स्थापित भयो ।'''",
     "mainpagedocfooter": " विकी अनुप्रयोग कसरी प्रयोग गर्ने भन्ने जानकारीको लागि  [//meta.wikimedia.org/wiki/Help:Contents प्रयोगकर्ता सहायता] हेर्नुहोस्\n\n== सुरू गर्नको लागि  ==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings विन्यास सेटिङ्ग सूची]\n* [//www.mediawiki.org/wiki/Manual:FAQ मेडियाविकि सामान्य प्रश्नका उत्तरहरु]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce मेडियाविकि सुचना मेलिङ्ग सूची]"
-}
\ No newline at end of file
+}
index 0a5096c..6fa7c36 100644 (file)
@@ -22,7 +22,6 @@
     "config-magic-quotes-runtime": "'''Onherstelbare fout: [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-runtime magic_quotes_runtime] is actief!'''\nDeze instelling zorgt voor gegevenscorruptie.\nJe kunt MediaWiki niet installeren tenzij deze instelling is uitgeschakeld.",
     "config-magic-quotes-sybase": "'''Onherstelbare fout: [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-runtime magic_quotes_sybase] is actief!'''\nDeze instelling zorgt voor gegevenscorruptie.\nJe kunt MediaWiki niet installeren tenzij deze instelling is uitgeschakeld.",
     "config-mbstring": "'''Onherstelbare fout: [http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload] is actief!'''\nDeze instelling zorgt voor gegevenscorruptie.\nJe kunt MediaWiki niet installeren tenzij deze instelling is uitgeschakeld.",
-    "config-ze1": "'''Onherstelbare fout: [http://www.php.net/manual/en/ini.core.php zend.ze1_compatibility_mode] is actief!'''\nDeze instelling zorgt voor grote problemen in MediaWiki.\nJe kunt MediaWiki niet installeren tenzij deze instelling is uitgeschakeld.",
     "config-xml-bad": "De XML-module van PHP ontbreekt.\nMediaWiki heeft de functies van deze module nodig en werkt niet zonder deze module.\nAls je gebruik maakt van Mandrake, installeer dan het package php-xml.",
     "config-mod-security": "'''Waarschuwing:''' je webserver heeft de module [http://modsecurity.org/ mod_security] ingeschakeld. Als deze onjuist is ingesteld, kan dit problemen geven in combinatie met MediaWiki of andere software die gebruikers in staat stelt willekeurige inhoud te posten.\nLees de [http://modsecurity.org/documentation/ documentatie over mod_security] of neem contact op met de helpdesk van je provider als je tegen problemen aanloopt.",
     "config-imagemagick": "ImageMagick aangetroffen: <code>$1</code>.\nHet aanmaken van miniaturen van afbeeldingen wordt ingeschakeld als je uploaden inschakelt.",
@@ -34,7 +33,7 @@
     "config-db-host-oracle-help": "Voer een geldige [http://download.oracle.com/docs/cd/B28359_01/network.111/b28317/tnsnames.htm Local Connect Name] in; een tnsnames.ora-bestand moet zichtbaar zijn voor deze installatie.<br />Als je gebruik maakt van clientlibraries 10g of een latere versie, kan je ook gebruik maken van de naamgevingsmethode [http://download.oracle.com/docs/cd/E11882_01/network.112/e10836/naming.htm Easy Connect].",
     "config-db-name-help": "Kies een naam die je wiki identificeert.\nEr mogen geen spaties gebruikt worden.\nAls je gebruik maakt van gedeelde webhosting, dan hoort je provider ofwel jou een te gebruiken databasenaam gegeven te hebben, of je aangegeven te hebben hoe je databases kunt aanmaken.",
     "config-db-account-oracle-warn": "Er zijn drie ondersteunde scenario's voor het installeren van Oracle als databasebackend:\n\nAls je een databasegebruiker wilt aanmaken als onderdeel van het installatieproces, geef dan de gegevens op van een databasegebruiker in met de rol SYSDBA voor de installatie en voer de gewenste aanmeldgegevens in voor de gebruiker met webtoegang. Je kunt ook de gebruiker met webtoegang handmatig aanmaken en alleen van die gebruiker de aanmeldgegevens opgeven als deze de vereiste rechten heeft om schemaobjecten aan te maken. Als laatste is het mogelijk om aanmeldgegevens van twee verschillende gebruikers op te geven; een met de rechten om schemaobjecten aan te maken, en een met alleen webtoegang.\n\nEen script voor het aanmaken van een gebruiker met de vereiste rechten is te vinden in de map \"maintenance/oracle/\" van deze installatie. Onthoud dat het gebruiken van een gebruiker met beperkte rechten alle mogelijkheden om beheerscripts uit te voeren met de standaard gebruiker onmogelijk maakt.",
-    "config-db-prefix-help": "Als je een database moet gebruiken voor meerdere wiki's, of voor MediaWiki en een andere applicatie, dan kan je ervoor kiezen om een voorvoegsel toe te voegen aan de tabelnamen om conflicten te voorkomen.\nGebruik geen spaties.\n\nDit veld wordt meestal leeg gelaten.",
+    "config-db-prefix-help": "Als je een database moet gebruiken voor meerdere wiki's, of voor MediaWiki en een andere toepassing, dan kan je ervoor kiezen om een voorvoegsel toe te voegen aan de tabelnamen om conflicten te voorkomen.\nGebruik geen spaties.\n\nDit veld wordt meestal leeg gelaten.",
     "config-charset-help": "'''Waarschuwing:''' als je '''achterwaarts compatibel met UTF-8''' gebruikt met MySQL 4.1+ en een back-up van de database maakt met <code>mysqldump</code>, dan kunnen alle niet-ASCII-tekens in je back-ups onherstelbaar beschadigd raken.\n\nIn '''binaire modus''' slaat MediaWiki tekst in UTF-8 op in binaire databasevelden.\nDit is efficiënter dan de UTF-8-modus van MySQL en stelt je in staat de volledige reeks Unicode-tekens te gebruiken.\nIn '''UTF-8-modus''' kent MySQL de tekenset van je gegevens en kan de databaseserver ze juist weergeven en converteren.\nHet is dan niet mogelijk tekens op te slaan die de \"[//nl.wikipedia.org/wiki/Lijst_van_Unicode-subbereiken#Basic_Multilingual_Plane Basic Multilingual Plane]\" te boven gaan.",
     "config-mysql-old": "Je moet MySQL $1 of later gebruiken.\nJij gebruikt $2.",
     "config-db-schema-help": "Dit schema klopt meestal.\nWijzig het alleen als je weet dat dit nodig is.",
@@ -76,4 +75,4 @@
     "config-install-user-missing-create": "De opgegeven gebruiker \"$1\" bestaat niet.\nKlik op \"registreren\" onderaan als je de gebruiker wilt aanmaken.",
     "config-install-done": "'''Gefeliciteerd!'''\nJe hebt MediaWiki met geïnstalleerd.\n\nHet installatieprogramma heeft het bestand <code>LocalSettings.php</code> aangemaakt.\nDit bevat al je instellingen.\n\nJe moet het bestand downloaden en in de hoofdmap van uw wikiinstallatie plaatsten; in dezelfde map als index.php.\nDe download moet je automatisch zijn aangeboden.\n\nAls de download niet is aangeboden of als je de download hebt geannuleerd, dan kan je de download opnieuw starten door op de onderstaande koppeling te klikken:\n\n$3\n\n'''Let op''': als je dit niet nu doet, dan het is bestand als u later de installatieprocedure afsluit zonder het bestand te downloaden niet meer beschikbaar.\n\nNa het plaatsen van het bestand met instellingen kan je '''[$2 je wiki betreden]'''.",
     "mainpagedocfooter": "Raadpleeg de [//meta.wikimedia.org/wiki/NL_Help:Inhoudsopgave handleiding] voor informatie over het gebruik van de wikisoftware.\n\n== Meer hulp over MediaWiki ==\n\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Lijst met instellingen]\n* [//www.mediawiki.org/wiki/Manual:FAQ Veelgestelde vragen (FAQ)]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Mailinglijst voor aankondigingen van nieuwe versies]\n* [//www.mediawiki.org/wiki/Localisation#Translation_resources Maak MediaWiki beschikbaar in jouw taal]"
-}
\ No newline at end of file
+}
index 3f8367a..16aa9fb 100644 (file)
@@ -7,7 +7,10 @@
             "SPQRobin",
             "Siebrand",
             "Tjcool007",
-            "아라"
+            "아라",
+            "Arent",
+            "JurgenNL",
+            "Southparkfan"
         ]
     },
     "config-desc": "Het installatieprogramma voor MediaWiki",
@@ -19,8 +22,8 @@
     "config-localsettings-badkey": "De sleutel die u hebt opgegeven is onjuist",
     "config-upgrade-key-missing": "Er is een bestaande installatie van MediaWiki aangetroffen.\nPlaats de volgende regel onderaan uw <code>LocalSettings.php</code> om deze installatie bij te werken:\n\n$1",
     "config-localsettings-incomplete": "De bestaande inhoud van <code>LocalSettings.php</code> lijkt incompleet.\nDe variabele $1 is niet ingesteld.\nWijzig <code>LocalSettings.php</code> zodat deze variabele is ingesteld en klik op \"{{int:Config-continue}}\".",
-    "config-localsettings-connection-error": "Er is een fout opgetreden tijdens het verbinden van de database met de instellingen uit <code>LocalSettings.php</code> of <code>AdminSettings.php</code>. Los het probleem met de instellingen op en probeer het daarna opnieuw.\n\n$1",
-    "config-session-error": "Fout bij het begin van de sessie: $1",
+    "config-localsettings-connection-error": "Er is een fout opgetreden tijdens het verbinden met de database met de instellingen uit <code>LocalSettings.php</code>. Los het probleem met de instellingen op en probeer het daarna opnieuw.\n\n$1",
+    "config-session-error": "Fout bij het starten van sessie: $1",
     "config-session-expired": "Uw sessiegegevens zijn verlopen.\nSessies zijn ingesteld om een levensduur van $1 te hebben.\nU kunt deze wijzigen via de instelling <code>session.gc_maxlifetime</code> in php.ini.\nBegin het installatieproces opnieuw.",
     "config-no-session": "Uw sessiegegevens zijn verloren gegaan.\nControleer uw php.ini en zorg dat er een juiste map is ingesteld voor <code>session.save_path</code>.",
     "config-your-language": "Uw taal:",
@@ -46,7 +49,7 @@
     "config-page-existingwiki": "Bestaande wiki",
     "config-help-restart": "Wilt u alle opgeslagen gegevens die u hebt ingevoerd wissen en het installatieproces opnieuw starten?",
     "config-restart": "Ja, opnieuw starten",
-    "config-welcome": "=== Controle omgeving ===\nEr worden een aantal basiscontroles uitgevoerd met als doel vast te stellen of deze omgeving geschikt is voor een installatie van MediaWiki.\nAls u hulp nodig hebt bij de installatie, lever deze gegevens dan ook aan.",
+    "config-welcome": "=== Controle omgeving ===\nEr worden een aantal basiscontroles uitgevoerd met als doel vast te stellen of deze omgeving geschikt is voor een installatie van MediaWiki.\nLever deze gegevens dan ook aan indien u support vraagt bij de installatie.",
     "config-copyright": "=== Auteursrechten en voorwaarden ===\n\n$1\n\nDit programma is vrije software. U mag het verder verspreiden en/of aanpassen in overeenstemming met de voorwaarden van de GNU General Public License zoals uitgegeven door de Free Software Foundation; ofwel versie 2 van de Licentie of - naar uw keuze - enige latere versie.\n\nDit programma wordt verspreid in de hoop dat het nuttig is, maar '''zonder enige garantie''', zelfs zonder de impliciete garantie van '''verkoopbaarheid''' of '''geschiktheid voor een bepaald doel'''.\nZie de GNU General Public License voor meer informatie.\n\nSamen met dit programma hoort u een <doclink href=Copying>exemplaar van de GNU General Public License</doclink> ontvangen te hebben; zo niet, schrijf dan aan de Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, Verenigde Staten. Of [http://www.gnu.org/copyleft/gpl.html lees de licentie online].",
     "config-sidebar": "* [//www.mediawiki.org MediaWiki thuispagina]\n* [//www.mediawiki.org/wiki/Help:Contents Gebruikershandleiding] (Engelstalig)\n* [//www.mediawiki.org/wiki/Manual:Contents Beheerdershandleiding] (Engelstalig)\n* [//www.mediawiki.org/wiki/Manual:FAQ Veel gestelde vragen] (Engelstalig)\n----\n* <doclink href=Readme>Leesmij</doclink> (Engelstalig)\n* <doclink href=ReleaseNotes>Release notes</doclink> (Engelstalig)\n* <doclink href=Copying>Kopiëren</doclink> (Engelstalig)\n* <doclink href=UpgradeDoc>Versie bijwerken</doclink> (Engelstalig)",
     "config-env-good": "De omgeving is gecontroleerd.\nU kunt MediaWiki installeren.",
     "config-unicode-using-intl": "Voor Unicode-normalisatie wordt de [http://pecl.php.net/intl PECL-extensie intl] gebruikt.",
     "config-unicode-pure-php-warning": "'''Waarschuwing''': de [http://pecl.php.net/intl PECL-extensie intl] is niet beschikbaar om de Unicodenormalisatie af te handelen en daarom wordt de langzame PHP-implementatie gebruikt.\nAls u MediaWiki voor een website met veel verkeer installeert, lees u dan in over [//www.mediawiki.org/wiki/Unicode_normalization_considerations Unicodenormalisatie].",
     "config-unicode-update-warning": "'''Waarschuwing''': de geïnstalleerde versie van de Unicodenormalisatiewrapper maakt gebruik van een oudere versie van [http://site.icu-project.org/ de bibliotheek van het ICU-project].\nU moet [//www.mediawiki.org/wiki/Unicode_normalization_considerations bijwerken] als Unicode voor u van belang is.",
-    "config-no-db": "Het was niet mogelijk een geschikte databasedriver te vinden voor PHP.\nU moet een databasedriver installeren voor PHP.\nDe volgende databases worden ondersteund: $1.\n\nAls u op een gedeelde omgeving zit, vraag dan aan uw hostingprovider een geschikte databasedriver te installeren.\nAls u PHP zelf hebt gecompileerd, wijzig dan uw instellingen zodat een databasedriver wordt geactiveerd, bijvoorbeeld via <code>./configure --with-mysql</code>.\nAls u PHP hebt geïnstalleerd via een Debian- of Ubuntu-package, installeer dan ook de module php5-mysql.",
+    "config-no-db": "Het was niet mogelijk een geschikte databasedriver te vinden voor PHP. U moet een databasedriver installeren voor PHP.\nDe volgende databases worden ondersteund: $1.\n\nAls u een gedeelde omgeving gebruikt, vraag dan aan uw hostingprovider een geschikte databasedriver te installeren.\nAls u PHP zelf hebt gecompileerd, wijzig dan uw instellingen zodat een databasedriver wordt geactiveerd, bijvoorbeeld via <code>./configure --with-mysql</code>.\nAls u PHP hebt geïnstalleerd via een Debian- of Ubuntu-package, installeer dan ook de module php5-mysql.",
     "config-outdated-sqlite": "''' Waarschuwing:''' u gebruikt SQLite $1. SQLite is niet beschikbaar omdat de minimaal vereiste versie $2 is.",
-    "config-no-fts3": "'''Waarschuwing''': SQLite is gecompileerd zonder de module [//sqlite.org/fts3.html FTS3]; er zijn geen zoekfuncties niet beschikbaar.",
-    "config-register-globals": "'''Waarschuwing: de PHP-optie <code>[http://php.net/register_globals register_globals]</code> is ingeschakeld.'''\n'''Schakel deze uit als dat mogelijk is.'''\nMediaWiki kan ermee werken, maar uw server is dan meer kwetsbaar voor beveiligingslekken.",
-    "config-magic-quotes-runtime": "'''Onherstelbare fout: [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-runtime magic_quotes_runtime] is actief!'''\nDeze instelling zorgt voor gegevenscorruptie.\nU kunt MediaWiki niet installeren tenzij deze instelling is uitgeschakeld.",
-    "config-magic-quotes-sybase": "'''Onherstelbare fout: [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-runtime magic_quotes_sybase] is actief!'''\nDeze instelling zorgt voor gegevenscorruptie.\nU kunt MediaWiki niet installeren tenzij deze instelling is uitgeschakeld.",
-    "config-mbstring": "'''Onherstelbare fout: [http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload] is actief!'''\nDeze instelling zorgt voor gegevenscorruptie.\nU kunt MediaWiki niet installeren tenzij deze instelling is uitgeschakeld.",
-    "config-ze1": "'''Onherstelbare fout: [http://www.php.net/manual/en/ini.core.php zend.ze1_compatibility_mode] is actief!'''\nDeze instelling zorgt voor grote problemen in MediaWiki.\nU kunt MediaWiki niet installeren tenzij deze instelling is uitgeschakeld.",
+    "config-no-fts3": "'''Waarschuwing''': SQLite is gecompileerd zonder de module [//sqlite.org/fts3.html FTS3]; zoekfuncties zijn niet beschikbaar.",
+    "config-register-globals": "'''Waarschuwing: de PHP-optie <code>[http://php.net/register_globals register_globals]</code> is ingeschakeld.'''\n'''Schakel deze uit als dat mogelijk is.'''\nMediaWiki kan ermee werken, maar uw server is dan  kwetsbaarder voor eventuele beveiligingslekken.",
+    "config-magic-quotes-runtime": "'''Onherstelbare fout: [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-runtime magic_quotes_runtime] is actief!'''\nDeze instelling zorgt voor onvoorspelbare gegevenscorruptie.\nU kunt MediaWiki niet installeren tenzij deze instelling is uitgeschakeld.",
+    "config-magic-quotes-sybase": "'''Onherstelbare fout: [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-runtime magic_quotes_sybase] is actief!'''\nDeze instelling zorgt voor onvoorspelbare gegevenscorruptie.\nU kunt MediaWiki niet installeren tenzij deze instelling is uitgeschakeld.",
+    "config-mbstring": "'''Onherstelbare fout: [http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload] is actief!'''\nDeze instelling zorgt voor onvoorspelbare gegevenscorruptie.\nU kunt MediaWiki niet installeren tenzij deze instelling is uitgeschakeld.",
     "config-safe-mode": "'''Waarschuwing:'''\n'''PHP's [http://www.php.net/features.safe-mode veilige modus] is actief.'''\nDit kan problemen veroorzaken, vooral bij het uploaden van bestanden en ondersteuning van <code>math</code>.",
     "config-xml-bad": "De XML-module van PHP ontbreekt.\nMediaWiki heeft de functies van deze module nodig en werkt niet zonder deze module.\nAls u gebruik maakt van Mandrake, installeer dan het package php-xml.",
-    "config-pcre": "De ondersteuningsmodule PCRE lijkt te missen.\nMediaWiki vereist dat de met Perl compatibele reguliere expressies werken.",
+    "config-pcre-old": "'''Onherstelbare fout:''' PCRE $1 of een latere versie is vereist.\nUw uitvoerbare versie van PHP is gekoppeld met PCRE $2.\n[https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/PCRE Meer informatie].",
     "config-pcre-no-utf8": "'''Fataal:''' de module PRCE van PHP lijkt te zijn gecompileerd zonder ondersteuning voor PCRE_UTF8.\nMediaWiki heeft ondersteuning voor UTF-8 nodig om correct te kunnen werken.",
     "config-memory-raised": "PHP's <code>memory_limit</code> is $1 en is verhoogd tot $2.",
     "config-memory-bad": "'''Waarschuwing:''' PHP's <code>memory_limit</code> is $1.\nDit is waarschijnlijk te laag.\nDe installatie kan mislukken!",
     "config-ctype": "'''Fataal:''' PHP moet gecompileerd zijn met ondersteuning voor de [http://www.php.net/manual/en/ctype.installation.php extensie Ctype].",
+    "config-json": "'''Fatale fout:''' PHP is gecompileerd zonder ondersteuning voor JSON.\nU moet de PHP-extensie JSON installeren of de extensie [http://pecl.php.net/package/jsonc PECL jsonc] voordat u MediaWiki installeert.\n* De PHP-extensie is beschikbaar in Red Hat Enterprise Linux (CentOS) 5 en 6, maar moet ingeschakeld worden <code>/etc/php.ini</code> or <code>/etc/php.d/json.ini</code>.\n* Sommige Linuxdistributies die zijn uitgebracht na mei 2013 hebben de PHP-extensie niet, maar hebben een package voor de PECL-extensie als <code>php5-json</code> of <code>php-pecl-jsonc</code>.",
     "config-xcache": "[http://xcache.lighttpd.net/ XCache] is op dit moment geïnstalleerd",
     "config-apc": "[http://www.php.net/apc APC] is op dit moment geïnstalleerd",
     "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache] is op dit moment geïnstalleerd",
     "config-git-bad": "Geen git versiecontrolesoftware aangetroffen.",
     "config-imagemagick": "ImageMagick aangetroffen: <code>$1</code>.\nHet aanmaken van miniaturen van afbeeldingen wordt ingeschakeld als u uploaden inschakelt.",
     "config-gd": "Ingebouwde GD grafische bibliotheek aangetroffen.\nHet aanmaken van miniaturen van afbeeldingen wordt ingeschakeld als u uploaden inschakelt.",
-    "config-no-scaling": "De GD-bibliotheek en ImageMagick zijn niet aangetroffen.\nHet maken van miniaturen van afbeeldingen wordt uitgeschakeld.",
+    "config-no-scaling": "Noch de GD-bibliotheek noch ImageMagick zijn  aangetroffen.\nHet maken van miniaturen van afbeeldingen wordt uitgeschakeld.",
     "config-no-uri": "'''Fout:''' de huidige URI kon niet vastgesteld worden.\nDe installatie is afgebroken.",
-    "config-no-cli-uri": "'''Waarschuwing:''' de parameter ==scriptpath is niet opgegeven. De standaardwaarde wordt gebruikt: <code>$1</code>.",
+    "config-no-cli-uri": "'''Waarschuwing:''' de parameter <code>--scriptpath</code> is niet opgegeven. De standaardwaarde wordt gebruikt: <code>$1</code>.",
     "config-using-server": "De servernaam \"<nowiki>$1</nowiki>\" wordt gebruikt.",
     "config-using-uri": "De server-URL \"<nowiki>$1$2</nowiki>\" wordt gebruikt.",
     "config-uploads-not-safe": "'''Waarschuwing:''' uw uploadmap <code>$1</code> kan gebruikt worden voor het arbitrair uitvoeren van scripts.\nHoewel MediaWiki alle toegevoegde bestanden controleert op bedreigingen, is het zeer aan te bevelen het [//www.mediawiki.org/wiki/Manual:Security#Upload_security beveiligingslek te verhelpen] alvorens uploads in te schakelen.",
     "config-no-cli-uploads-check": "''Waarschuwing:'' uw standaardmap voor uploads (<code>$1</code>) wordt niet gecontroleerd op kwetsbaarheden voor het uitvoeren van willekeurige scripts gedurende de CLI-installatie.",
-    "config-brokenlibxml": "Uw systeem heeft een combinatie van PHP- en libxml2-versies geïnstalleerd die is foutgevoelig is en kan leiden tot onzichtbare beschadiging van gegevens in MediaWiki en andere webapplicaties.\nUpgrade naar PHP 5.2.9 of hoger en libxml2 2.7.3 of hoger([//bugs.php.net/bug.php?id=45996 bij PHP gerapporteerde fout]).\nDe installatie wordt afgebroken.",
-    "config-using531": "PHP $1 is niet compatibel met MediaWiki vanwege een fout met betrekking tot referentieparameters met <code>__call()</code>.\nWerk uw PHP bij naar PHP 5.3.2 of hoger of werk bij naar de lagere versie PHP 5.3.0 om dit op te lossen.\nDe installatie wordt afgebroken.",
+    "config-brokenlibxml": "Uw systeem heeft een combinatie van PHP- en libxml2-versies geïnstalleerd die is foutgevoelig is en kan leiden tot onzichtbare beschadiging van gegevens in MediaWiki en andere webapplicaties.\nUpgrade naar libxml2 2.7.3 of hoger([https://bugs.php.net/bug.php?id=45996 bij PHP gerapporteerde fout]).\nDe installatie wordt afgebroken.",
     "config-suhosin-max-value-length": "Suhosin is geïnstalleerd en beperkt de GET-parameter <code>length</code> tot $1 bytes.\nDe ResourceLoader van MediaWiki omzeilt deze beperking, maar dat is slecht voor de prestaties.\nAls het mogelijk is, moet u de waarde \"<code>suhosin.get.max_value_length</code>\" in <code>php.ini</code> instellen op 1024 of hoger en <code>$wgResourceLoaderMaxQueryLength</code> in LocalSettings.php op dezelfde waarde instellen.",
     "config-db-type": "Databasetype:",
     "config-db-host": "Databasehost:",
     "config-db-username": "Gebruikersnaam voor database:",
     "config-db-password": "Wachtwoord voor database:",
     "config-db-password-empty": "Voer een wachtwoord in voor de nieuwe databasegebruiker: $1.\nHoewel het wellicht mogelijk is gebruikers aan te maken zonder wachtwoord, is dit niet veilig.",
+    "config-db-username-empty": "U moet een waarde invoeren voor \"{{int:config-db-username}}\".",
     "config-db-install-username": "Voer de gebruikersnaam in die gebruikt moet worden om te verbinden met de database tijdens het installatieproces. Dit is niet de gebruikersnaam van de MediaWikigebruiker. Dit is de gebruikersnaam voor de database.",
     "config-db-install-password": "Voer het wachtwoord in dat gebruikt moet worden om te verbinden met de database tijdens het installatieproces. Dit is niet het wachtwoord van de MediaWikigebruiker. Dit is het wachtwoord voor de database.",
     "config-db-install-help": "Voer de gebruikersnaam en het wachtwoord in die worden gebruikt voor de databaseverbinding tijdens het installatieproces.",
     "config-db-wiki-account": "Gebruiker voor na de installatie",
     "config-db-wiki-help": "Voer de gebruikersnaam en het wachtwoord in die gebruikt worden om verbinding te maken met de database na de installatie.\nAls de gebruiker niet bestaat en de gebruiker die tijdens de installatie gebruikt wordt voldoende rechten heeft, wordt deze gebruiker aangemaakt met de minimaal benodigde rechten voor het laten werken van de wiki.",
     "config-db-prefix": "Databasetabelvoorvoegsel:",
-    "config-db-prefix-help": "Als u een database moet gebruiken voor meerdere wiki's, of voor MediaWiki en een andere applicatie, dan kunt u ervoor kiezen om een voorvoegsel toe te voegen aan de tabelnamen om conflicten te voorkomen.\nGebruik geen spaties.\n\nDit veld wordt meestal leeg gelaten.",
+    "config-db-prefix-help": "Als u een database moet gebruiken voor meerdere wiki's, of voor MediaWiki en een andere toepassing, dan kunt u ervoor kiezen om een voorvoegsel toe te voegen aan de tabelnamen om conflicten te voorkomen.\nGebruik geen spaties.\n\nDit veld wordt meestal leeg gelaten.",
     "config-db-charset": "Tekenset voor de database",
     "config-charset-mysql5-binary": "MySQL 4.1/5.0 binair",
     "config-charset-mysql5": "MySQL 4.1/5.0 UTF-8",
     "config-sqlite-dir-help": "SQLite slaat alle gegevens op in een enkel bestand.\n\nDe map die u opgeeft moet beschrijfbaar zijn voor de webserver tijdens de installatie.\n\nDeze mag '''niet toegankelijk''' zijn via het web en het bestand mag dus niet tussen de PHP-bestanden staan.\n\nHet installatieprogramma schrijft het bestand <code>.htaccess</code> weg met het databasebestand, maar als dat niet werkt kan iemand zich toegang tot het ruwe databasebestand verschaffen.\nOok de gebruikersgegevens (e-mailadressen, wachtwoordhashes) en verwijderde versies en overige gegevens met beperkte toegang via MediaWiki zijn dan onbeschermd.\n\nOverweeg om de database op een totaal andere plaats neer te zetten, bijvoorbeeld in <code>/var/lib/mediawiki/yourwiki</code>.",
     "config-oracle-def-ts": "Standaard tablespace:",
     "config-oracle-temp-ts": "Tijdelijke tablespace:",
-    "config-type-mysql": "MySQL",
+    "config-type-mysql": "MySQL (of compatibel)",
     "config-type-postgres": "PostgreSQL",
     "config-type-sqlite": "SQLite",
     "config-type-oracle": "Oracle",
+    "config-type-mssql": "Microsoft SQL Server",
     "config-support-info": "MediaWiki ondersteunt de volgende databasesystemen:\n\n$1\n\nAls u het databasesysteem dat u wilt gebruiken niet in de lijst terugvindt, volg dan de handleiding waarnaar hierboven wordt verwezen om ondersteuning toe te voegen.",
-    "config-support-mysql": "* $1 is het primaire databasesysteem voor voor MediaWiki en wordt het best ondersteund ([http://www.php.net/manual/en/mysql.installation.php hoe PHP gecompileerd moet zijn met ondersteuning voor MySQL])",
-    "config-support-postgres": "* $1 is een populair open source databasesysteem als alternatief voor MySQL ([http://www.php.net/manual/en/pgsql.installation.php hoe PHP gecompileerd moet zijn met ondersteuning voor PostgreSQL]). Het is mogelijk dat er een aantal bekende problemen zijn met MediaWiki in combinatie met deze database en daarom wordt PostgreSQL niet aanbevolen voor een productieomgeving.",
-    "config-support-sqlite": "* $1 is een zeer goed ondersteund lichtgewicht databasesysteem ([http://www.php.net/manual/en/pdo.installation.php hoe PHP gecompileerd zijn met ondersteuning voor SQLite]; gebruikt PDO)",
-    "config-support-oracle": "* $1 is een commerciële data voor grote bedrijven ([http://www.php.net/manual/en/oci8.installation.php PHP compileren met ondersteuning voor OCI8]).",
+    "config-dbsupport-mysql": "* [{{int:version-db-mysql-url}} MySQL] is de primaire database voor MediaWiki en wordt het best ondersteund. MediaWiki werkt ook met [{{int:version-db-mariadb-url}} MariaDB] en [{{int:version-db-percona-url}} Percona Server], die MySQL compatibel zijn. ([http://www.php.net/manual/en/mysqli.installation.php hoe PHP te compileren met MySQL ondersteuning])",
+    "config-dbsupport-postgres": "* [{{int:version-db-postgres-url}} PostgreSQL] is een populair open source databasesysteem als alternatief voor MySQL. Het is mogelijk dat er een aantal bekende kleinere problemen zijn met MediaWiki in combinatie met deze database en daarom wordt PostgreSQL niet aanbevolen voor een productieomgeving.([http://www.php.net/manual/en/pgsql.installation.php hoe PHP gecompileerd moet zijn met ondersteuning voor PostgreSQL]).",
+    "config-dbsupport-sqlite": "* [{{int:version-db-sqlite-url}} SQLite] is een zeer goed ondersteund lichtgewicht databasesysteem ([http://www.php.net/manual/en/pdo.installation.php hoe PHP gecompileerd zijn met ondersteuning voor SQLite]; gebruikt PDO)",
+    "config-dbsupport-oracle": "* [{{int:version-db-oracle-url}} Oracle] is een commerciële database voor grote bedrijven ([http://www.php.net/manual/en/oci8.installation.php PHP compileren met ondersteuning voor OCI8]).",
+    "config-dbsupport-mssql": "* [{{int:version-db-mssql-url}} Microsoft SQL Server] is een commerciële enterprisedatabase voor Windows. Zie ook [http://www.php.net/manual/en/sqlsrv.installation.php PHP compileren met ondersteuning voor SQLSRV].",
     "config-header-mysql": "MySQL-instellingen",
     "config-header-postgres": "PostgreSQL-instellingen",
     "config-header-sqlite": "SQLite-instellingen",
     "config-header-oracle": "Oracle-instellingen",
+    "config-header-mssql": "Instellingen voor Microsoft SQL Server",
     "config-invalid-db-type": "Ongeldig databasetype",
-    "config-missing-db-name": "U moet een waarde opgeven voor \"Databasenaam\"",
-    "config-missing-db-host": "U moet een waarde invoeren voor \"Databaseserver\"",
-    "config-missing-db-server-oracle": "U moet een waarde opgeven voor \"Database-TNS\"",
+    "config-missing-db-name": "U moet een waarde opgeven voor \"{{int:config-db-name}}\".",
+    "config-missing-db-host": "U moet een waarde invoeren voor \"{{int:config-db-host}}\".",
+    "config-missing-db-server-oracle": "U moet een waarde opgeven voor \"{{int:config-db-host-oracle}}\".",
     "config-invalid-db-server-oracle": "Ongeldige database-TNS \"$1\".\nGebruik \"TNS Names\" of een \"Easy Connect\" tekst ([http://docs.oracle.com/cd/E11882_01/network.112/e10836/naming.htm Oracle naamgevingsmethoden])",
     "config-invalid-db-name": "Ongeldige databasenaam \"$1\".\nGebruik alleen letters (a-z, A-Z), cijfers (0-9) en liggende streepjes (_) en streepjes (-).",
     "config-invalid-db-prefix": "Ongeldig databasevoorvoegsel \"$1\".\nGebruik alleen letters (a-z, A-Z), cijfers (0-9) en liggende streepjes (_) en streepjes (-).",
     "config-db-sys-create-oracle": "Het installatieprogramma biedt alleen de mogelijkheid een nieuwe gebruiker aan te maken met de SYSDBA-gebruiker.",
     "config-db-sys-user-exists-oracle": "De gebruiker \"$1\" bestaat al. SYSDBA kan alleen gebruikt worden voor het aanmaken van een nieuwe gebruiker!",
     "config-postgres-old": "PostgreSQL $1 of hoger is vereist.\nU gebruikt $2.",
+    "config-mssql-old": "Microsoft SQL Server $1 of hoger is vereist. U hebt  $2.",
     "config-sqlite-name-help": "Kies een naam die uw wiki identificeert.\nGebruik geen spaties of koppeltekens.\nDeze naam wordt gebruikt voor het gegevensbestand van SQLite.",
     "config-sqlite-parent-unwritable-group": "Het was niet mogelijk de gegevensmap <code><nowiki>$1</nowiki></code> te maken omdat in de bovenliggende map <code><nowiki>$2</nowiki></code> niet geschreven mag worden door de webserver.\n\nHet installatieprogramma heeft vast kunnen stellen onder welke gebruiker de webserver draait.\nMaak de map <code><nowiki>$3</nowiki></code> beschrijfbaar om door te kunnen gaan.\nVoer op een Linux-systeem de volgende opdrachten uit:\n\n<pre>cd $2\nmkdir $3\nchgrp $4 $3\nchmod g+w $3</pre>",
     "config-sqlite-parent-unwritable-nogroup": "Het was niet mogelijk de gegevensmap <code><nowiki>$1</nowiki></code> te maken omdat in de bovenliggende map <code><nowiki>$2</nowiki></code> niet geschreven mag worden door de webserver.\n\nHet installatieprogramma heeft niet vast kunnen stellen onder welke gebruiker de webserver draait.\nMaak de map <code><nowiki>$3</nowiki></code> beschrijfbaar voor de webserver (en anderen!) om door te kunnen gaan.\nVoer op een Linux-systeem de volgende opdrachten uit:\n\n<pre>cd $2\nmkdir $3\nchmod a+w $3</pre>",
     "config-mysql-innodb": "InnoDB",
     "config-mysql-myisam": "MyISAM",
     "config-mysql-myisam-dep": "'''Waarschuwing''': u hebt MyISAM geselecteerd als opslagengine voor MySQL. Dit is niet aan te raden voor MediaWiki omdat:\n* het nauwelijks ondersteuning biedt voor gebruik door meerdere gebruikers tegelijkertijd door het locken van tabellen;\n* het meer vatbaar is voor corruptie dan andere engines;\n* de code van MediaWiki niet alstijd omgaat met MyISAM zoals dat zou moeten.\n\nAls uw installatie van MySQL InnoDB ondersteunt, gebruik dat dan vooral.\nAls uw installatie van MySQL geen ondersteuning heeft voor InnoDB, denk dan na over upgraden.",
-    "config-mysql-only-myisam-dep": "'''Waarschuwing:''' MyISAM is enige beschikbare opslagmethode voor MySQL, en deze wordt niet aangeraden voor gebruik met MediaWiki, omdat:\n* er nauwelijks ondersteuning is voor meerdere gelijktijdige transacties omdat tabellen op slot gezet worden;\n* tabellen makkelijker stuk kunnen gaan;\n* de code van MediaWiki niet altijd op de juiste wijze omgaat met MyISAM.\n\nUw installatie van MySQL heeft geen ondersteuning voor InnoDB. We raden u aan om een meer recente versie te gebruiken.",
+    "config-mysql-only-myisam-dep": "'''Waarschuwing:''' MyISAM is enige beschikbare opslagmethode voor MySQL in deze omgeving, en deze wordt niet aangeraden voor gebruik met MediaWiki, omdat:\n* er nauwelijks ondersteuning is voor meerdere gelijktijdige transacties omdat tabellen op slot gezet worden;\n* tabellen makkelijker stuk kunnen gaan;\n* de code van MediaWiki niet altijd op de juiste wijze omgaat met MyISAM.\n\nUw installatie van MySQL heeft geen ondersteuning voor InnoDB. We raden u aan om een meer recente versie te gebruiken.",
     "config-mysql-engine-help": "'''InnoDB''' is vrijwel altijd de beste instelling, omdat deze goed omgaat met meerdere verzoeken tegelijkertijd.\n\n'''MyISAM''' is bij een zeer beperkt aantal gebruikers mogelijk sneller, of als de wiki alleen-lezen is.\nMyISAM-databases raken vaker corrupt dan InnoDB-databases.",
     "config-mysql-charset": "Tekenset voor de database:",
     "config-mysql-binary": "Binair",
     "config-mysql-utf8": "UTF-8",
     "config-mysql-charset-help": "In '''binaire modus''' slaat MediaWiki tekst in UTF-8 op in binaire databasevelden.\nDit is efficiënter dan de UTF-8-modus van MySQL en stelt u in staat de volledige reeks Unicodetekens te gebruiken.\n\nIn '''UTF-8-modus''' kent MySQL de tekenset van uw gegevens en kan de databaseserver ze juist weergeven en converteren.\nHet is dat niet mogelijk tekens op te slaan die de \"[//nl.wikipedia.org/wiki/Lijst_van_Unicode-subbereiken#Basic_Multilingual_Plane Basic Multilingual Plane]\" te boven gaan.",
+    "config-mssql-auth": "Authenticatietype:",
+    "config-mssql-install-auth": "Selecteer de authenticatiemethode die wordt gebruikt om met de database te verbinden tijdens het installatieproces.\nAls u \"{{int:config-mssql-windowsauth}}\" selecteert, dan worden de aanmeldgegevens van de gebruiker waaronder de webserver draait voor authenticatie gebruikt.",
+    "config-mssql-web-auth": "Selecteer de authenticatiemethode die de webserver gebruikt om met de database te verbinden tijdens het installatieproces.\nAls u \"{{int:config-mssql-windowsauth}}\" selecteert, dan worden de aanmeldgegevens van de gebruiker waaronder de webserver draait voor authenticatie gebruikt.",
+    "config-mssql-sqlauth": "SQL Server Authenticatie",
+    "config-mssql-windowsauth": "Windowsauthenticatie",
     "config-site-name": "Naam van de wiki:",
     "config-site-name-help": "Deze naam verschijnt in de titelbalk van browsers en op andere plaatsen.",
     "config-site-name-blank": "Geef een naam op voor de site.",
     "config-ns-invalid": "De opgegeven naamruimte \"<nowiki>$1</nowiki>\" is ongeldig.\nGeef een andere naamruimte op.",
     "config-ns-conflict": "De opgegeven naamruimte \"<nowiki>$1</nowiki>\" conflicteert met een standaard naamruimte in MediaWiki.\nGeef een andere naam op voor de projectnaamruimte.",
     "config-admin-box": "Beheerdersgebruiker",
-    "config-admin-name": "Uw naam:",
+    "config-admin-name": "Uw gebruikersnaam:",
     "config-admin-password": "Wachtwoord:",
     "config-admin-password-confirm": "Wachtwoord opnieuw:",
     "config-admin-help": "Voer de gebruikersnaam hier in, bijvoorbeeld \"Jan Jansen\".\nDit is de naam die wordt gebruikt om aan de melden bij de wiki.",
     "config-admin-name-blank": "Geef een gebruikersnaam op voor de beheerder.",
     "config-admin-name-invalid": "De opgegeven gebruikersnaam \"<nowiki>$1</nowiki>\" is ongeldig.\nKies een andere gebruikersnaam.",
     "config-admin-password-blank": "Voer een wachtwoord voor de beheerder in.",
-    "config-admin-password-same": "Het wachtwoord mag niet hetzelfde zijn als de gebruikersnaam.",
     "config-admin-password-mismatch": "De twee door u ingevoerde wachtwoorden komen niet overeen.",
     "config-admin-email": "E-mailadres:",
     "config-admin-email-help": "Voer hier een e-mailadres in om e-mail te kunnen ontvangen van andere gebruikers op de wiki, uw wachtwoord opnieuw in te kunnen stellen en op de hoogte te worden gehouden van wijzigingen van pagina's op uw volglijst. U kunt het veld leeg laten.",
     "config-subscribe-noemail": "U hebt geprobeerd zich te abonneren op de mailinglijst voor release-aankondigingen zonder een e-mailadres op te geven.\nGeef een e-mailadres op als u zich wilt abonneren op de mailinglijst.",
     "config-almost-done": "U bent bijna klaar!\nAls u wilt kunt u de overige instellingen overslaan en de wiki nu installeren.",
     "config-optional-continue": "Stel me meer vragen.",
-    "config-optional-skip": "Laat dat maar, installeer gewoon de wiki.",
+    "config-optional-skip": "Laat maar zitten, installeer gewoon de wiki.",
     "config-profile": "Gebruikersrechtenprofiel:",
     "config-profile-wiki": "Open wiki",
     "config-profile-no-anon": "Gebruiker aanmaken verplicht",
     "config-install-mainpage": "Hoofdpagina aanmaken met standaard inhoud",
     "config-install-extension-tables": "Tabellen voor ingeschakelde uitbreidingen worden aangemaakt",
     "config-install-mainpage-failed": "Het was niet mogelijk de hoofdpagina in te voegen: $1",
-    "config-install-done": "'''Gefeliciteerd!'''\nU hebt MediaWiki met geïnstalleerd.\n\nHet installatieprogramma heeft het bestand <code>LocalSettings.php</code> aangemaakt.\nDit bevat al uw instellingen.\n\nU moet het bestand downloaden en in de hoofdmap van uw wiki-installatie plaatsten; in dezelfde map als index.php.\nDe download moet u automatisch zijn aangeboden.\n\nAls de download niet is aangeboden of als u de download hebt geannuleerd, dan kunt u de download opnieuw starten door op de onderstaande koppeling te klikken:\n\n$3\n\n'''Let op''': als u dit niet nu doet, dan het is bestand als u later de installatieprocedure afsluit zonder het bestand te downloaden niet meer beschikbaar.\n\nNa het plaatsen van het bestand met instellingen kunt u '''[$2 uw wiki betreden]'''.",
+    "config-install-done": "'''Gefeliciteerd!'''\nU hebt MediaWiki met succes geïnstalleerd.\n\nHet installatieprogramma heeft het bestand <code>LocalSettings.php</code> aangemaakt.\nDit bevat al uw instellingen.\n\nU moet het bestand downloaden en in de hoofdmap van uw wiki-installatie plaatsten, in dezelfde map als index.php.\nDe download moet u automatisch zijn aangeboden.\n\nAls de download niet is aangeboden of als u de download hebt geannuleerd, dan kunt u de download opnieuw starten door op de onderstaande koppeling te klikken:\n\n$3\n\n'''Let op''': als u dit niet nu doet, dan is het bestand als u later de installatieprocedure afsluit zonder het bestand te downloaden niet meer beschikbaar.\n\nNa het plaatsen van het bestand met instellingen kunt u '''[$2 uw wiki gebruiken]'''.",
     "config-download-localsettings": "<code>LocalSettings.php</code> downloaden",
     "config-help": "hulp",
     "config-nofile": "Het bestand \"$1\" is niet gevonden. Is het verwijderd?",
-    "config-extension-link": "Weet u dat u [//www.mediawiki.org/wiki/Manual:Extensions uitbreidingen] kunt gebruiken voor uw wiki?\nU kunt [//www.mediawiki.org/wiki/Category:Extensions_by_category uitbreidingen op categorie] bekijken of ga naar de [//www.mediawiki.org/wiki/Extension_Matrix Uitbreidingenmatrix] om de volledige lijst met uitbreidingen te bekijken.",
+    "config-extension-link": "Weet u dat u [//www.mediawiki.org/wiki/Manual:Extensions uitbreidingen] kunt gebruiken voor uw wiki?\nU kunt [//www.mediawiki.org/wiki/Category:Extensions_by_category uitbreidingen op categorie] bekijken of ga naar de [//www.mediawiki.org/wiki/Extension_Matrix uitbreidingenmatrix] om de volledige lijst met uitbreidingen te bekijken.",
     "mainpagetext": "'''De installatie van MediaWiki is geslaagd.'''",
     "mainpagedocfooter": "Raadpleeg de [//meta.wikimedia.org/wiki/NL_Help:Inhoudsopgave handleiding] voor informatie over het gebruik van de wikisoftware.\n\n== Meer hulp over MediaWiki ==\n\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Lijst met instellingen]\n* [//www.mediawiki.org/wiki/Manual:FAQ Veelgestelde vragen (FAQ)]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Mailinglijst voor aankondigingen van nieuwe versies]\n* [//www.mediawiki.org/wiki/Localisation#Translation_resources Maak MediaWiki beschikbaar in uw taal]"
-}
\ No newline at end of file
+}
index 9940723..6744545 100644 (file)
@@ -38,4 +38,4 @@
     "config-logo": "Logo-URL:",
     "mainpagetext": "'''MediaWiki er no installert.'''",
     "mainpagedocfooter": "Sjå [//meta.wikimedia.org/wiki/Help:Contents brukarmanualen] for informasjon om bruk og oppsettshjelp for wikiprogramvara.\n\n==Kome i gang==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Liste over oppsettsinnstillingar]\n* [//www.mediawiki.org/wiki/Manual:FAQ Spørsmål og svar om MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce E-postliste med informasjon om nye MediaWiki-versjonar]"
-}
\ No newline at end of file
+}
index bb9e376..a8c9833 100644 (file)
@@ -1,6 +1,4 @@
 {
-    "@metadata": {
-        "authors": []
-    },
+    "@metadata": [],
     "mainpagetext": "'''MediaWiki-programvaren er nå installert.'''"
-}
\ No newline at end of file
+}
index f4f088d..bbfe3f2 100644 (file)
@@ -1,7 +1,8 @@
 {
     "@metadata": {
         "authors": [
-            "Cedric31"
+            "Cedric31",
+            "Jfblanc"
         ]
     },
     "config-desc": "Lo programa d’installacion de MediaWiki",
     "config-localsettings-badkey": "La clau qu'avètz provesida es incorrècta",
     "config-session-error": "Error al moment de l'aviada de la sesilha : $1",
     "config-your-language": "Vòstra lenga :",
+    "config-your-language-help": "Seleccionatz la lenga d'utilizar pendent lo processus d'installacion.",
     "config-wiki-language": "Lenga del wiki :",
+    "config-wiki-language-help": "Seleccionar la lenga dins la quala lo wiki serà principalament escrich.",
     "config-back": "← Retorn",
     "config-continue": "Contunhar →",
     "config-page-language": "Lenga",
     "config-page-welcome": "Benvenguda sus MediaWiki !",
     "config-page-dbconnect": "Se connectar a la banca de donadas",
+    "config-page-upgrade": "Metre a jorn l’installacion existenta",
     "config-page-dbsettings": "Paramètres de la banca de donadas",
     "config-page-name": "Nom",
     "config-page-options": "Opcions",
     "config-page-upgradedoc": "Mesa a jorn",
     "config-page-existingwiki": "Wiki existent",
     "config-restart": "Òc, lo reaviar",
+    "config-env-good": "L’environament es estat verificat.\nPodètz installar MediaWiki.",
+    "config-env-bad": "L’environament es estat verificat.\nPodètz pas installar MediaWiki.",
     "config-env-php": "PHP $1 es installat.",
+    "config-env-php-toolow": "PHP $1 es installat.\nPasmens, MediaWiki requerís PHP $2 o superior.",
+    "config-unicode-using-utf8": "Utilizacion de utf8_normalize.so per Brion Vibber per la normalizacion Unicode.",
+    "config-unicode-using-intl": "Utilizacion de [http://pecl.php.net/intl l'extension PECL intl] per la normalizacion Unicode.",
+    "config-memory-raised": "Lo paramètre <code>memory_limit</code> de PHP èra a $1, portat a $2.",
+    "config-xcache": "[http://xcache.lighttpd.net/ XCache] es installat",
+    "config-apc": "[http://www.php.net/apc APC] es installat",
+    "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache] es installat",
+    "config-diff3-bad": "GNU diff3 pas trobat.",
+    "config-git": "Logicial de contraròtle de version Git trobat : <code>$1</code>.",
+    "config-git-bad": "Logicial de contraròtle de version Git pas trobat.",
+    "config-imagemagick": "ImageMagick trobat : <code>$1</code>.\nLa miniaturizacion d'imatges serà activada se activatz lo telecargament de fichièrs.",
+    "config-gd": "La bibliotèca grafica GD integrada es estada trobada.\nLa miniaturizacion d'imatges serà activada se activatz lo telecargament de fichièrs.",
+    "config-using-server": "Utilizacion del nom de servidor \"<nowiki>$1</nowiki>\".",
+    "config-using-uri": "Utilizacion de l'URL de servidor \"<nowiki>$1$2</nowiki>\".",
+    "config-db-type": "Tipe de banca de donadas :",
+    "config-db-host": "Nom d’òste de la banca de donadas :",
     "config-db-host-oracle": "Nom TNS de la banca de donadas :",
     "config-db-wiki-settings": "Identificar aqueste wiki",
     "config-db-name": "Nom de la banca de donadas :",
     "config-db-install-account": "Compte d'utilizaire per l'installacion",
     "config-db-username": "Nom d'utilizaire de la banca de donadas :",
     "config-db-password": "Senhal de la banca de donadas :",
+    "config-db-username-empty": "Vos cal entrar una valor per « {{int:config-db-username}} ».",
+    "config-db-account-lock": "Utilizar lo meteis nom d'utilizaire e lo meteis senhal pendent lo foncionament abitual",
+    "config-db-wiki-account": "Compte d'utilizaire pel foncionament abitual",
+    "config-db-prefix": "Préfix de las taulas de la banca de donadas :",
+    "config-db-charset": "Jòc de caractèrs de la banca de donadas",
     "config-charset-mysql5-binary": "MySQL 4.1/5.0 binari",
     "config-charset-mysql5": "MySQL 4.1/5.0 UTF-8",
     "config-charset-mysql4": "MySQL 4.0 retrocompatible UTF-8",
+    "config-mysql-old": "MySQL $1 o version ulteriora es requesit, avètz $2.",
     "config-db-port": "Pòrt de la banca de donadas :",
     "config-db-schema": "Esquèma per MediaWiki",
+    "config-pg-test-error": "Impossible de se connectar a la banca de donadas '''$1''' : $2",
+    "config-sqlite-dir": "Dorsièr de las donadas SQLite :",
+    "config-oracle-def-ts": "Espaci d'emmagazinatge (''tablespace'') per defaut :",
+    "config-oracle-temp-ts": "Espaci d'emmagazinatge (''tablespace'') temporari :",
+    "config-type-mysql": "MySQL (o compatible)",
+    "config-type-mssql": "Microsoft SQL Server",
     "config-header-mysql": "Paramètres de MySQL",
     "config-header-postgres": "Paramètres de PostgreSQL",
     "config-header-sqlite": "Paramètres de SQLite",
     "config-header-oracle": "Paramètres d’Oracle",
+    "config-header-mssql": "Paramètres de Microsoft SQL Server",
+    "config-invalid-db-type": "Tipe de banca de donadas invalid",
+    "config-missing-db-name": "Vos cal entrar una valor per « {{int:config-db-name}} ».",
+    "config-missing-db-host": "Vos cal entrar una valor per « {{int:config-db-host}} ».",
+    "config-missing-db-server-oracle": "Vos cal entrar una valor per « {{int:config-db-oracle}} ».",
+    "config-postgres-old": "PostgreSQL $1 o version ulteriora es requesit, avètz $2.",
+    "config-sqlite-readonly": "Lo fichièr <code>$1</code> es pas accessible en escritura.",
+    "config-sqlite-cant-create-db": "Impossible de crear lo fichièr de banca de donadas <code>$1</code>.",
+    "config-regenerate": "Regenerar LocalSettings.php →",
+    "config-show-table-status": "Fracàs de la requèsta <code>SHOW TABLE STATUS</code> !",
+    "config-db-web-account": "Compte de la banca de donadas per l'accès Web",
+    "config-db-web-account-same": "Utilizatz lo meteis compte que per l'installacion",
+    "config-db-web-create": "Creatz lo compte se existís pas ja",
     "config-mysql-engine": "Motor d'emmagazinatge :",
     "config-mysql-innodb": "InnoDB",
     "config-mysql-myisam": "MyISAM",
+    "config-mysql-charset": "Jòc de caractèrs de la banca de donadas :",
     "config-mysql-binary": "Binari",
     "config-mysql-utf8": "UTF-8",
+    "config-mssql-auth": "Tipe d’autentificacion :",
+    "config-mssql-sqlauth": "Autentificacion de SQL Server",
+    "config-mssql-windowsauth": "Autentificacion Windows",
     "config-site-name": "Nom del wiki :",
+    "config-site-name-blank": "Entratz un nom de site.",
+    "config-project-namespace": "Espaci de noms del projècte :",
     "config-ns-generic": "Projècte",
+    "config-ns-site-name": "Meteis nom que lo wiki : $1",
+    "config-ns-other": "Autre (precisar)",
     "config-ns-other-default": "MonWiki",
-    "config-admin-name": "Vòstre nom :",
+    "config-admin-box": "Compte d'administrator",
+    "config-admin-name": "Vòstre nom d'utilizaire :",
     "config-admin-password": "Senhal :",
+    "config-admin-password-confirm": "Picatz lo senhal tornarmai :",
+    "config-admin-name-blank": "Entratz un nom d'administrator.",
+    "config-admin-password-blank": "Entratz un senhal pel compte d'administrator.",
+    "config-admin-password-mismatch": "Los dos senhals qu'avètz picats correspondon pas.",
+    "config-admin-email": "Adreça de corrièr electronic :",
+    "config-admin-error-user": "Error intèrna al moment de la creacion d'un administrator amb lo nom « <nowiki>$1</nowiki> ».",
+    "config-admin-error-bademail": "Avètz entrat una adreça de corrièr electronic invalida",
+    "config-optional-continue": "Me pausar mai de questions.",
+    "config-optional-skip": "N'ai pro, installar simplament lo wiki.",
+    "config-profile": "Perfil dels dreches d’utilizaires :",
+    "config-profile-wiki": "Wiki dobèrt",
+    "config-profile-no-anon": "Creacion de compte requesida",
+    "config-profile-fishbowl": "Editors autorizats solament",
+    "config-profile-private": "Wiki privat",
+    "config-license": "Dreches d'autor e licéncia :",
+    "config-license-none": "Pas cap de licéncia en bas de pagina",
+    "config-license-cc-by-sa": "Creative Commons atribucion partiment a l'identic",
+    "config-license-cc-by": "Creative Commons Atribucion",
+    "config-license-cc-by-nc-sa": "Creative Commons paternitat – non comercial – partiment a l’identic",
+    "config-license-cc-0": "Creative Commons Zero (domeni public)",
+    "config-license-gfdl": "GNU Free Documentation License 1.3 o ulteriora",
+    "config-license-pd": "Domeni public",
+    "config-license-cc-choose": "Seleccionar una licéncia Creative Commons personalizada",
+    "config-email-settings": "Paramètres de corrièr electronic",
+    "config-enable-email": "Activar los corrièls sortents",
+    "config-email-user": "Activar los corrièrs electronics d'utilizaire a utilizaire",
+    "config-email-usertalk": "Activar la notificacion de las paginas de discussion dels utilizaires",
+    "config-email-watchlist": "Activar la notificacion de la lista de seguiment",
+    "config-email-auth": "Activar l'autentificacion per corrièr electronic",
+    "config-email-sender": "Entrar una adreça electronica de retorn :",
+    "config-upload-settings": "Telecargament dels imatges e dels fichièrs",
+    "config-upload-enable": "Activar lo telecargament dels fichièrs",
+    "config-upload-deleted": "Repertòri pels fichièrs suprimits :",
+    "config-logo": "URL del lògo :",
+    "config-instantcommons": "Activar ''InstantCommons''",
+    "config-cc-again": "Causissètz tornarmai...",
+    "config-advanced-settings": "Configuracion avançada",
+    "config-cache-options": "Paramètres per la mesa en escondedor dels objèctes :",
+    "config-memcached-servers": "servidors per Memcached :",
+    "config-extensions": "Extensions",
+    "config-install-step-done": "fach",
+    "config-install-step-failed": "fracàs",
+    "config-install-extensions": "Inclusion de las extensions",
+    "config-install-database": "Creacion de la banca de donadas",
+    "config-install-schema": "Creacion d'esquèma",
+    "config-install-pg-commit": "Validacion de las modificacions",
+    "config-install-pg-plpgsql": "Verificacion del lengatge PL/pgSQL",
+    "config-install-user": "Creacion d'un utilizaire de la banca de donadas",
+    "config-install-tables": "Creacion de las taulas",
+    "config-install-stats": "Inicializacion de las estatisticas",
+    "config-install-sysop": "Creacion del compte administrator",
+    "config-install-mainpage-failed": "Impossible d’inserir la pagina principala : $1",
+    "config-download-localsettings": "Telecargar <code>LocalSettings.php</code>",
+    "config-help": "ajuda",
     "mainpagetext": "'''MediaWiki es estat installat amb succès.'''",
-    "mainpagedocfooter": "Consultatz lo [//meta.wikimedia.org/wiki/Ajuda:Contengut Guida de l'utilizaire] per mai d'entresenhas sus l'utilizacion d'aqueste logicial.\n\n== Començar amb MediaWiki ==\n\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Lista dels paramètres de configuracion]\n* [//www.mediawiki.org/wiki/Manual:FAQ/fr FAQ MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lista de discussions de las parucions de MediaWiki]"
-}
\ No newline at end of file
+    "mainpagedocfooter": "Consultatz lo [//meta.wikimedia.org/wiki/Ajuda:Contengut Guida de l'utilizaire] per mai d'entresenhas sus l'utilizacion d'aqueste logicial de wiki.\n\n== Per començar ==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Lista dels paramètres de configuracion]\n* [//www.mediawiki.org/wiki/Manual:FAQ/fr FAQ MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lista de discussions de las distribucions de MediaWiki]\n* [//www.mediawiki.org/wiki/Localisation#Translation_resources Adaptatz MediaWiki dins vòstra lenga]"
+}
index e945ace..702fe35 100644 (file)
@@ -10,4 +10,4 @@
     "config-page-welcome": "ମେଡିଆଉଇକିକୁ ଆପଣଙ୍କୁ ସ୍ଵାଗତ",
     "config-page-name": "ନାମ",
     "config-page-options": "ପସନ୍ଦସମୂହ"
-}
\ No newline at end of file
+}
index f8dc150..44df458 100644 (file)
@@ -6,4 +6,4 @@
     },
     "config-page-language": "Æвзаг",
     "mainpagetext": "'''Вики-скрипт «MediaWiki» æнтыстджынæй æвæрд æрцыд.'''"
-}
\ No newline at end of file
+}
index db646cb..c4f7d77 100644 (file)
@@ -1,6 +1,4 @@
 {
-    "@metadata": {
-        "authors": []
-    },
+    "@metadata": [],
     "mainpagetext": "'''ਮੀਡਿਆਵਿਕਿ ਠੀਕ ਤਰ੍ਹਾਂ ਇੰਸਟਾਲ ਹੋ ਗਿਆ ਹੈ।'''"
-}
\ No newline at end of file
+}
index 7383ed4..e0cf6a6 100644 (file)
@@ -1,7 +1,5 @@
 {
-    "@metadata": {
-        "authors": []
-    },
+    "@metadata": [],
     "mainpagetext": "'''Melaus ing pamipalyari ning MediaWiki.'''",
     "mainpagedocfooter": "Basan me ing [//meta.wikimedia.org/wiki/Help:Contents User's Guide] para king impormasiun keng pamangamit ning wiki software.\n\n== Pamagumpisa ==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Configuration settings list]\n* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]"
-}
\ No newline at end of file
+}
index 9927354..a678df4 100644 (file)
@@ -1,6 +1,4 @@
 {
-    "@metadata": {
-        "authors": []
-    },
+    "@metadata": [],
     "mainpagetext": "'''MediaWiki o té instalé aveuc victoère.'''"
-}
\ No newline at end of file
+}
index e653a6c..e341829 100644 (file)
@@ -10,4 +10,4 @@
     "config-install-step-done": "geduh",
     "config-help": "Hilf",
     "mainpagedocfooter": "Hilf fer's Yuuse unn Konfiguriere vun de Wiki-Software kansch finne im [//meta.wikimedia.org/wiki/Help:Contents Handbuch fer Yuuser].\n\n== Hilf zum Schtaerte ==\n\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Lischt vun Gnepp zum Konfiguriere]\n* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki-FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Eposchde-Lischt fer neie MediaWiki-Versione]"
-}
\ No newline at end of file
+}
index ecfaa43..f6228de 100644 (file)
             "Saper",
             "Sp5uhe",
             "Woytecr",
-            "아라"
+            "아라",
+            "Amire80",
+            "Jacenty359",
+            "Pan Cube",
+            "WTM"
         ]
     },
     "config-desc": "Instalator MediaWiki",
     "config-information": "Informacja",
     "config-localsettings-upgrade": "Plik <code>LocalSettings.php</code> istnieje.\nAby oprogramowanie zostało zaktualizowane musisz wstawić wartość <code>$wgUpgradeKey</code> w poniższe pole.\nOdnajdziesz ją w <code>LocalSettings.php</code>.",
     "config-localsettings-cli-upgrade": "Wykryto obecność pliku <code>LocalSettings.php</code>.\nAktualizację należy wykonać poprzez uruchomienie <code>update.php</code>",
-    "config-localsettings-key": "Klucz aktualizacji",
+    "config-localsettings-key": "Klucz aktualizacji:",
     "config-localsettings-badkey": "Podany klucz jest nieprawidłowy",
     "config-upgrade-key-missing": "Wykryto zainstalowane wcześniej MediaWiki.\nJeśli chcesz je zaktualizować dodaj na koniec pliku <code>LocalSettings.php</code> poniższą linię tekstu.\n\n$1",
     "config-localsettings-incomplete": "Istniejący plik <code>LocalSettings.php</code> wygląda na niekompletny.\nBrak wartości zmiennej $1.\nZmień plik <code>LocalSettings.php</code>, tak by zawierał deklarację wartości tej zmiennej, a następnie kliknij „{{int:Config-continue}}”.",
-    "config-localsettings-connection-error": "Wystąpił błąd podczas łączenia z bazą danych z wykorzystaniem danych z <code>LocalSettings.php</code> lub <code>AdminSettings.php</code>.\nPopraw ustawienia i spróbuj ponownie.\n\n$1",
+    "config-localsettings-connection-error": "Wystąpił błąd podczas łączenia z bazą danych używając ustawień podanych w <code>LocalSettings.php</code>\nNapraw te ustawienia i spróbuj ponownie.\n\n$1",
     "config-session-error": "Błąd uruchomienia sesji – $1",
     "config-session-expired": "Wygląda na to, że Twoja sesja wygasła.\nCzas życia sesji został skonfigurowany na $1.\nMożesz go wydłużyć zmieniając <code>session.gc_maxlifetime</code> w pliku php.ini.\nUruchom ponownie proces instalacji.",
     "config-no-session": "Dane sesji zostały utracone.\nSprawdź plik php.ini i upewnij się, że <code>session.save_path</code> wskazuje na odpowiedni katalog.",
-    "config-your-language": "Język",
+    "config-your-language": "Twój język:",
     "config-your-language-help": "Wybierz język używany podczas procesu instalacji.",
-    "config-wiki-language": "Język wiki",
-    "config-wiki-language-help": "Wybierz język, w którym będzie tworzona większość treści wiki",
+    "config-wiki-language": "Język wiki:",
+    "config-wiki-language-help": "Wybierz język, w którym będzie tworzona większość treści wiki.",
     "config-back": "← Wstecz",
     "config-continue": "Dalej →",
     "config-page-language": "Język",
     "config-unicode-using-intl": "Korzystanie z [http://pecl.php.net/intl rozszerzenia intl PECL] do normalizacji Unicode.",
     "config-unicode-pure-php-warning": "'''Uwaga!''' [http://pecl.php.net/intl Rozszerzenie intl PECL] do obsługi normalizacji Unicode nie jest dostępne. Użyta zostanie mało wydajna zwykła implementacja w PHP.\nJeśli prowadzisz stronę o dużym natężeniu ruchu, powinieneś zapoznać się z informacjami o [//www.mediawiki.org/wiki/Unicode_normalization_considerations normalizacji Unicode].",
     "config-unicode-update-warning": "'''Uwaga''' – zainstalowana wersja normalizacji Unicode korzysta z nieaktualnej biblioteki [http://site.icu-project.org/ projektu ICU].\nPowinieneś [//www.mediawiki.org/wiki/Unicode_normalization_considerations zrobić aktualizację] jeśli chcesz korzystać w pełni z Unicode.",
-    "config-no-db": "Nie można odnaleźÄ\87 wÅ\82\9bciwego sterownika bazy danych! Musisz zainstalowaÄ\87 sterownik bazy danych dla PHP.\nMożna użyÄ\87 nastÄ\99pujÄ\85cych typów baz danych: $1.\n\nJeżeli korzystasz ze wspóÅ\82dzielonego hostingu, zwróÄ\87 siÄ\99 do administratora o zainstalowanie odpowiedniego sterownika bazy danych.\nJeÅ\9bli skompilowaÅ\82\9b PHP samodzielnie, skonfiguruj je ponownie z wÅ\82Ä\85czonym klientem bazy danych, na przykÅ\82ad za pomocÄ\85 polecenia <code>./configure --with-mysql</code>.\nJeÅ\9bli zainstalowaÅ\82\9b PHP jako pakiet Debiana lub Ubuntu, musisz również zainstalowaÄ\87 moduÅ\82 php5-mysql.",
+    "config-no-db": "Nie można odnaleźÄ\87 wÅ\82\9bciwego sterownika bazy danych! Musisz zainstalowaÄ\87 sterownik bazy danych dla PHP.\nMożna użyÄ\87 nastÄ\99pujÄ\85cych typów baz danych: $1.\n\nJeÅ\9bli skompilowaÅ\82\9b PHP samodzielnie, skonfiguruj je ponownie z wÅ\82Ä\85czonym klientem bazy danych, na przykÅ\82ad za pomocÄ\85 polecenia <code>./configure --with-mysqli</code>.\nJeÅ\9bli zainstalowaÅ\82\9b PHP jako pakiet Debiana lub Ubuntu, musisz również zainstalowaÄ\87 np. moduÅ\82 <code>php5-mysql</code>.",
     "config-outdated-sqlite": "'''Ostrzeżenie''': masz SQLite  $1, która jest niższa od minimalnej wymaganej wersji  $2 . SQLite będzie niedostępne.",
     "config-no-fts3": "'''Uwaga''' – SQLite został skompilowany bez [//sqlite.org/fts3.html modułu FTS3] – funkcje wyszukiwania nie będą dostępne.",
     "config-register-globals": "'''Uwaga –  w konfiguracji PHP włączona jest opcja <code>[http://php.net/register_globals register_globals]</code>.'''\n'''Jeśli możesz, wyłącz ją.'''\nMediaWiki będzie działać, ale Twój serwer może być narażony potencjalnymi lukami w zabezpieczeniach.",
     "config-magic-quotes-runtime": "'''Błąd krytyczny – włączono [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-runtime magic_quotes_runtime]!'''\nTa opcja powoduje nieprzewidywalne uszkodzenia wprowadzanych danych.\nZainstalować lub korzystać z MediaWiki można pod warunkiem, że ta opcja jest wyłączona.",
     "config-magic-quotes-sybase": "'''Błąd krytyczny – włączono [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-sybase magic_quotes_sybase]!'''\nTa opcja powoduje nieprzewidywalne uszkodzenia wprowadzanych danych.\nZainstalować lub korzystać z MediaWiki można pod warunkiem, że ta opcja jest wyłączona.",
     "config-mbstring": "'''Błąd krytyczny – włączono [http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload]!'''\nTa opcja powoduje błędy i może wywołać nieprzewidywalne uszkodzenia wprowadzanych danych.\nZainstalować lub korzystać z MediaWiki można pod warunkiem, że ta opcja jest wyłączona.",
-    "config-ze1": "'''Błąd krytyczny – włączono [http://www.php.net/manual/en/ini.core.php zend.ze1_compatibility_mode]!'''\nTa opcja powoduje okropne błędy podczas korzystania z MediaWiki.\nZainstalować lub korzystać z MediaWiki można wyłącznie wtedy, gdy ta opcja jest wyłączona.",
     "config-safe-mode": "'''Ostrzeżenie''' – uaktywniono [http://www.php.net/features.safe-mode tryb awaryjny] PHP.\nOpcja ta może powodować problemy, szczególnie w przypadku korzystania z przesyłania plików i używania znacznika <code>math</code>.",
     "config-xml-bad": "Brak modułu XML dla PHP.\nMediaWiki wymaga funkcji z tego modułu i nie może działać w tej konfiguracji.\nJeśli korzystasz z Mandrake, zainstaluj pakiet php-xml.",
-    "config-pcre": "Wygląda na to, że brak modułu PCRE.\nMediaWiki do pracy wymaga funkcji obsługi wyrażeń regularnych kompatybilnej z Perlem.",
+    "config-pcre-old": "<strong>Błąd krytyczny:</strong> Wymagany jest PCRE w wersji $1 lub nowszej.\nTwój plik wykonywalny PHP jest powiązany z wersją PCRE $2.\n[https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/PCRE Więcej informacji].",
     "config-pcre-no-utf8": "'''Błąd krytyczny''' – wydaje się, że moduł PCRE w PHP został skompilowany bez wsparcia dla UTF‐8.\nMediaWiki wymaga wsparcia dla UTF‐8 do prawidłowego działania.",
     "config-memory-raised": "PHP <code>memory_limit</code> było ustawione na $1, zostanie zwiększone do $2.",
     "config-memory-bad": "'''Uwaga:''' PHP <code>memory_limit</code> jest ustawione na $1.\nTo jest prawdopodobnie zbyt mało.\nInstalacja może się nie udać!",
     "config-ctype": "''' Krytyczny ''': PHP musi być skompilowany z obsługą [http://www.php.net/manual/en/ctype.installation.php rozszerzenia Ctype].",
+    "config-json": "'''Błąd krytyczny:''' PHP skompilowano bez obsługa JSON.\nPrzed zainstalowaniem oprogramowania MediaWiki musisz zainstalować rozszerzenie PHP JSON albo rozszerzenie [http://pecl.php.net/package/jsonc PECL jsonc].\n* Rozszerzenie PHP jest zawarte w Red Hat Enterprise Linux (CentOS) 5 i 6, jednak musi zostać włączone w <code>/etc/php.ini</code> or <code>/etc/php.d/json.ini</code>.\n* Niektóre dystrybucje Linuksa, wydane po maju 2013, nie używają rozszerzenia PHP, lecz rozszerzenie PECL, jako <code>php5-json</code> lub <code>php-pecl-jsonc</code>.",
     "config-xcache": "[Http://trac.lighttpd.net/xcache/ XCache] jest zainstalowany",
     "config-apc": "[Http://www.php.net/apc APC] jest zainstalowany",
     "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache] jest zainstalowany",
     "config-git-bad": "Oprogramowanie systemu kontroli wersji Git nie zostało znalezione.",
     "config-imagemagick": "Mamy zainstalowany ImageMagick <code>$1</code>, dzięki czemu będzie można pomniejszać załadowane grafiki.",
     "config-gd": "Mamy wbudowaną bibliotekę graficzną GD, dzięki czemu będzie można pomniejszać załadowane grafiki.",
-    "config-no-scaling": "Nie można odnaleźć biblioteki GD lub ImageMagick. Nie będzie działać pomniejszanie załadowane grafiki.",
-    "config-no-uri": "'''Błąd.''' Nie można określić aktualnego URI.\nInstalacja została przerwana.",
-    "config-no-cli-uri": "''' Ostrzeżenie ''': nie wskazano --scriptpath,  użycie wartości domyślnej: <code>$1</code> .",
+    "config-no-scaling": "Nie odnaleziono biblioteki GD lub ImageMagick. Możliwość zmniejszania załadowywanych grafik zostanie wyłączona.",
+    "config-no-uri": "'''Błąd:''' Nie można określić aktualnego URI.\nInstalacja została przerwana.",
+    "config-no-cli-uri": "<strong>Ostrzeżenie:</strong> Nie wskazano <code>--scriptpath</code>, użycie wartości domyślnej: <code>$1</code>.",
     "config-using-server": "„<nowiki>$1</nowiki>“ jest adresem serwera, na którym instalowana jest wiki.",
     "config-using-uri": "Wiki będzie zainstalowana pod adresem \"<nowiki>$1$2</nowiki>\".",
     "config-uploads-not-safe": "'''Uwaga''' – domyślny katalog do którego zapisywane są przesyłane pliki <code>$1</code> jest podatny na wykonanie dowolnego skryptu.\nChociaż MediaWiki sprawdza wszystkie przesłane pliki pod kątem bezpieczeństwa, zaleca się jednak, aby [//www.mediawiki.org/wiki/Manual:Security#Upload_security zamknąć tę lukę w zabezpieczeniach] przed włączeniem przesyłania plików.",
     "config-no-cli-uploads-check": "'''Ostrzeżenie:''' Katalog domyślny przesyłanych plików ( <code>$1</code> ) nie jest sprawdzona względem luki\n wykonania dowolnego skryptu podczas instalacji CLI w zabezpieczeniach.",
-    "config-brokenlibxml": "Twój system jest kombinacją wersji PHP i libxml2, które zawierają błędy mogące powodować ukryte uszkodzenia danych w MediaWiki i innych aplikacjach sieci web.\nWykonaj aktualizację PHP do wersji 5.2.9 lub późniejszej oraz libxml2 do wersji 2.7.3 lub późniejszej ([//bugs.php.net/bug.php?id=45996 błąd w PHP]).\nInstalacja została przerwana.",
-    "config-using531": "MediaWiki nie może być używane z PHP $1 z powodu błędu dotyczącego referencyjnych argumentów funkcji <code>__call()</code>.\nUaktualnij do PHP 5.3.2 lub nowszego. Możesz również cofnąć wersję do PHP 5.3.0, aby naprawić ten błąd.\nInstalacja została przerwana.",
-    "config-suhosin-max-value-length": "Jest zainstalowany Suhosin i ogranicza długość parametru GET <code>length</code> do $1 bajtów. Komponent ResourceLoader w MediaWiki wykona obejście tego ograniczenia, ale kosztem wydajności.\nJeśli to możliwe, należy ustawić <code>suhosin.get.max_value_length</code> na 1024 lub wyżej w <code>php.ini</code> oraz ustawić <code>$wgResourceLoaderMaxQueryLength</code> w <code>LocalSettings.php</code> na tę samą wartość.",
-    "config-db-type": "Typ bazy danych",
-    "config-db-host": "Adres serwera bazy danych",
-    "config-db-host-help": "Jeśli serwer bazy danych jest na innej maszynie, wprowadź jej nazwę domenową lub adres IP.\n\nJeśli korzystasz ze współdzielonego hostingu, operator serwera powinien podać Ci prawidłową nazwę serwera w swojej dokumentacji.\n\nJeśli instalujesz oprogramowanie na serwerze Windowsowym i korzystasz z MySQL, użycie „localhost” może nie zadziałać jako nazwa hosta. Jeśli wystąpi ten problem użyj „127.0.0.1” jako lokalnego adresu IP.\n\nJeżeli korzystasz z PostgreSQL, pozostaw to pole puste, aby połączyć się poprzez gniazdo Unix‐a.",
+    "config-brokenlibxml": "Twój system jest kombinacją wersji PHP i libxml2, która zawiera błędy mogące powodować ukryte uszkodzenia danych w MediaWiki i innych aplikacjach sieci web.\nWykonaj aktualizację libxml2 do wersji 2.7.3 lub późniejszej ([https://bugs.php.net/bug.php?id=45996 bug filed with PHP]).\nInstalacja została przerwana.",
+    "config-suhosin-max-value-length": "Jest zainstalowany Suhosin i ogranicza długość parametru GET <code>length</code> do $1 bajtów. Komponent ResourceLoader w MediaWiki wykona obejście tego ograniczenia, ale kosztem wydajności.\nJeśli to możliwe, należy ustawić <code>suhosin.get.max_value_length</code> na 1024 lub więcej w <code>php.ini</code> oraz ustawić <code>$wgResourceLoaderMaxQueryLength</code> w <code>LocalSettings.php</code> na tę samą wartość.",
+    "config-db-type": "Typ bazy danych:",
+    "config-db-host": "Adres serwera bazy danych:",
+    "config-db-host-help": "Jeśli serwer bazy danych jest na innej maszynie, wprowadź jej nazwę domenową lub adres IP.\n\nJeśli korzystasz ze współdzielonego hostingu, operator serwera powinien podać Ci prawidłową nazwę serwera w swojej dokumentacji.\n\nJeśli instalujesz oprogramowanie na serwerze Windows i korzystasz z MySQL, użycie „localhost” może nie zadziałać jako nazwa hosta. Jeśli wystąpi ten problem, użyj „127.0.0.1” jako lokalnego adresu IP.\n\nJeżeli korzystasz z PostgreSQL, pozostaw to pole puste, aby połączyć się poprzez gniazdo Unixa.",
     "config-db-host-oracle": "Nazwa instancji bazy danych (TNS):",
     "config-db-host-oracle-help": "Wprowadź prawidłową [http://download.oracle.com/docs/cd/B28359_01/network.111/b28317/tnsnames.htm nazwę połączenia lokalnego]. Plik „tnsnames.ora” musi być widoczny dla instalatora.<br />Jeśli używasz biblioteki klienckiej 10g lub nowszej możesz również skorzystać z metody nazw [http://download.oracle.com/docs/cd/E11882_01/network.112/e10836/naming.htm łatwego łączenia].",
     "config-db-wiki-settings": "Zidentyfikuj tę wiki",
-    "config-db-name": "Nazwa bazy danych",
+    "config-db-name": "Nazwa bazy danych:",
     "config-db-name-help": "Wybierz nazwę, która zidentyfikuje Twoją wiki.\nNie może ona zawierać spacji.\n\nJeśli korzystasz ze współdzielonego hostingu, dostawca usługi hostingowej może wymagać użycia konkretnej nazwy bazy danych lub pozwalać na tworzenie baz danych za pośrednictwem panelu użytkownika.",
     "config-db-name-oracle": "Nazwa schematu bazy danych:",
     "config-db-account-oracle-warn": "Bazę danych Oracle można przygotować do pracy z MediaWiki na trzy sposoby:\n\nMożesz utworzyć konto użytkownika bazy danych podczas instalacji MediaWiki. Wówczas należy podać nazwę i hasło użytkownika z rolą SYSDBA w celu użycia go przez instalator do utworzenia nowe konta użytkownika, z którego korzystać będzie MediaWiki.\n\nMożesz również skorzystać z konta użytkownika bazy danych utworzonego bezpośrednio w Oracle i wówczas wystarczy podać tylko nazwę i hasło tego użytkownika. Konto z rolą SYSDBA nie będzie potrzebne, jednak konto użytkownika powinno mieć uprawnienia do utworzenia obiektów w schemacie bazy danych. Możesz też podać dwa konta - konto dla instalatora, z pomocą którego zostaną obiekty w schemacie bazy danych i drugie konto, z którego będzie MediaWiki korzystać będzie do pracy.\n\nW podkatalogu \"maintenance/oracle\" znajduje się skrypt do tworzenia konta użytkownika. Korzystanie z konta użytkownika z ograniczonymi uprawnieniami spowoduje wyłączenie funkcji związanych z aktualizacją oprogramowania MediaWiki.",
     "config-db-install-account": "Konto użytkownika dla instalatora",
-    "config-db-username": "Nazwa użytkownika bazy danych",
-    "config-db-password": "Hasło bazy danych",
+    "config-db-username": "Nazwa użytkownika bazy danych:",
+    "config-db-password": "Hasło bazy danych:",
     "config-db-password-empty": "Wprowadź hasło dla nowego użytkownika bazy danych: $1.\nChoć istnieje możliwość tworzenia użytkowników bez hasła, nie jest to bezpieczne.",
+    "config-db-username-empty": "Należy podać wartość parametru „Nazwa użytkownika bazy danych”",
     "config-db-install-username": "Wprowadź nazwę użytkownika, który będzie używany do łączenia się z bazą danych podczas procesu instalacji.\nNie jest to nazwa konta MediaWiki, a użytkownika bazy danych.",
     "config-db-install-password": "Wprowadź hasło, które będzie wykorzystywane do łączenia się z bazą danych w procesie instalacji.\nTo nie jest hasło konta MediaWiki, lecz hasło do bazy danych.",
     "config-db-install-help": "Podaj nazwę użytkownika i jego hasło, które zostaną użyte do połączenia z bazą danych w czasie procesu instalacji.",
     "config-db-account-lock": "Użyj tej samej nazwy użytkownika i hasła w czasie normalnej pracy.",
     "config-db-wiki-account": "Konto użytkownika do normalnej pracy",
     "config-db-wiki-help": "Wprowadź nazwę użytkownika i hasło, które będą używane do połączenia z bazą danych podczas normalnej pracy wiki.\nJeśli konto nie istnieje, a konto instalacji ma wystarczające uprawnienia, to zostanie utworzone konto użytkownika z minimalnymi uprawnieniami wymaganymi do działania wiki.",
-    "config-db-prefix": "Przedrostek tabel bazy danych",
+    "config-db-prefix": "Przedrostek tabel bazy danych:",
     "config-db-prefix-help": "Jeśli zachodzi potrzeba współdzielenia jednej bazy danych między wieloma wiki, lub między MediaWiki i inną aplikacją sieciową, można dodać przedrostek do wszystkich nazw tabel w celu uniknięcia konfliktów.\nNie należy używać spacji.\n\nTo pole zwykle pozostawiane jest puste.",
     "config-db-charset": "Zestaw znaków bazy danych",
     "config-charset-mysql5-binary": "MySQL 4.1/5.0 binarny",
     "config-charset-mysql4": "MySQL 4.0 kompatybilny wstecz UTF-8",
     "config-charset-help": "'''Ostrzeżenie:''' W przypadku użycia opcji '''UTF-8 zgodnego ze starszymi wersjami''' podczas korzystania z wersji MySQL nowszych niż 4.1 kopie zapasowe wykonane przy użyciu programu <code>mysqldump</code> będą bezużyteczne - wszystkie znaki inne niż ASCII zostaną zapisane nieprawidłowo.\n\nW '''trybie binarnym''', MediaWiki zapisuje tekst UTF-8 do bazy danych w polach binarnych.\nTo jest bardziej wydajne niż tryb UTF-8 w MySQL i pozwala na używanie pełnego zakresu znaków Unicode.\nW ''' trybie UTF-8''', MySQL będzie wiedzieć, w jakim zestawie znaków są dane i umożliwia ich prezentowanie i odpowiednią konwersję, ale nie pozwoli Ci przechowywać znaków spoza [//en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes podstawowej płaszczyzny wielojęzyczności].",
     "config-mysql-old": "Wymagany jest MySQL $1 lub nowszy; korzystasz z $2.",
-    "config-db-port": "Numer portu TCP dla połączeń do bazy danych",
-    "config-db-schema": "Nazwa schematu bazy danych, z którego ma korzystać MediaWiki",
+    "config-db-port": "Port bazy danych:",
+    "config-db-schema": "Nazwa schematu bazy danych, z którego ma korzystać MediaWiki:",
     "config-db-schema-help": "Zaproponowana nazwa schematu jest odpowiednia dla większości sytuacji i przeważnie nie trzeba jej zmieniać.",
     "config-pg-test-error": "Nie można połączyć się z bazą danych''' $1 ''': $2",
-    "config-sqlite-dir": "Katalog danych SQLite",
+    "config-sqlite-dir": "Katalog danych SQLite:",
     "config-sqlite-dir-help": "SQLite przechowuje wszystkie dane w pojedynczym pliku.\n\nWskazany katalog musi być dostępny do zapisu przez webserver podczas instalacji.\n\nPowinien '''nie''' być dostępny za z sieci web, dlatego nie umieszczamy ich tam, gdzie znajdują się pliki PHP.\n\nInstalator zapisze plik <code>.htaccess</code> obokniego, ale jeśli to zawiedzie, ktoś może uzyskać dostęp do nieprzetworzonej bazy danych.\nZawiera ona nieopracowane dane użytkownika (adresy e-mail, zahaszowane hasła) jak również usunięte wersje oraz inne dane o ograniczonym dostępie na wiki.\n\nWarto rozważyć umieszczenie w bazie danych zupełnie gdzie indziej, na przykład w <code>/var/lib/mediawiki/yourwiki</code> .",
-    "config-oracle-def-ts": "Domyślna przestrzeń tabel",
-    "config-oracle-temp-ts": "Przestrzeń tabel tymczasowych",
+    "config-oracle-def-ts": "Domyślna przestrzeń tabel:",
+    "config-oracle-temp-ts": "Przestrzeń tabel tymczasowych:",
+    "config-type-mysql": "MySQL (lub kompatybilna)",
+    "config-type-mssql": "Microsoft SQL Server",
     "config-support-info": "MediaWiki może współpracować z następującymi systemami baz danych:\n\n$1\n\nPoniżej wyświetlone są systemy baz danych gotowe do użycia. Jeżeli poniżej brakuje bazy danych, z której chcesz skorzystać, oznacza to, że brakuje odpowiedniego oprogramowania lub zostało ono niepoprawnie skonfigurowane. Powyżej znajdziesz odnośniki do dokumentacji, która pomoże w konfiguracji odpowiednich komponentów.",
-    "config-support-mysql": "* $1 jest bazą danych, na której rozwijane jest oprogramowanie MediaWiki. Ewentualne błędy w współpracy z bazą danych są odnajdowane i naprawiane dość szybko. ([http://www.php.net/manual/en/mysql.installation.php zobacz, jak skompilować PHP ze wsparciem dla MySQL])",
-    "config-support-postgres": "* $1 jest popularnym systemem baz danych, często stosowanym zamiast MySQL  ([http://www.php.net/manual/en/pgsql.installation.php Zobacz, jak skompilować PHP ze wsparciem dla PostgreSQL]). Z powodu możliwości wystąpienia drobnych błędów, nie jest zalecana do wymagających wdrożeń.",
-    "config-support-sqlite": "* $1 jest niewielkim systemem bazy danych, z którym MediaWiki bardzo dobrze współpracuje. ([http://www.php.net/manual/en/pdo.installation.php Jak skompilować PHP ze wsparciem dla SQLite], korzystając z PDO)",
-    "config-support-oracle": "* $1 jest komercyjną profesjonalną bazą danych. ([http://www.php.net/manual/en/oci8.installation.php Jak skompilować PHP ze wsparciem dla OCI8])",
+    "config-dbsupport-mysql": "* [{{int:version-db-mysql-url}} MySQL] jest bazą danych, na której rozwijane jest oprogramowanie MediaWiki. MediaWiki działa również z [{{int:version-db-mariadb-url}} MariaDB] i [{{int:version-db-percona-url}} Percona Server], które są zgodne z MySQL. ([http://www.php.net/manual/en/mysqli.installation.php Zobacz, jak skompilować PHP ze wsparciem dla MySQL])",
+    "config-dbsupport-postgres": "* [{{int:version-db-postgres-url}} PostgreSQL] jest popularnym systemem baz danych, często stosowanym zamiast MySQL. Z powodu możliwości wystąpienia drobnych błędów, nie jest zalecana do wymagających wdrożeń. ([http://www.php.net/manual/en/pgsql.installation.php Zobacz, jak skompilować PHP ze wsparciem dla PostgreSQL])",
+    "config-dbsupport-sqlite": "* [{{int:version-db-sqlite-url}} SQLite] jest niewielkim systemem bazy danych, z którym MediaWiki bardzo dobrze współpracuje. ([http://www.php.net/manual/en/pdo.installation.php Zobacz, jak skompilować PHP ze wsparciem dla SQLite], korzystając z PDO)",
+    "config-dbsupport-oracle": "* [{{int:version-db-oracle-url}} Oracle] jest komercyjną profesjonalną bazą danych. ([http://www.php.net/manual/en/oci8.installation.php Jak skompilować PHP ze wsparciem dla OCI8])",
+    "config-dbsupport-mssql": "* [{{int:version-db-mssql-url}} Microsoft SQL Server] jest komercyjną profesjonalną bazą danych. ([http://www.php.net/manual/pl/sqlsrv.installation.php Jak skompilować PHP ze wsparciem dla SQLSRV])",
     "config-header-mysql": "Ustawienia MySQL",
     "config-header-postgres": "Ustawienia PostgreSQL",
     "config-header-sqlite": "Ustawienia SQLite",
     "config-header-oracle": "Ustawienia Oracle",
+    "config-header-mssql": "Ustawienia Microsoft SQL Server",
     "config-invalid-db-type": "Nieprawidłowy typ bazy danych",
     "config-missing-db-name": "Należy wpisać wartość w polu „Nazwa bazy danych”",
     "config-missing-db-host": "Musisz wpisać wartość w polu „Serwer bazy danych”",
     "config-db-sys-create-oracle": "Instalator może wykorzystać wyłącznie konto SYSDBA do tworzenia nowych kont użytkowników.",
     "config-db-sys-user-exists-oracle": "Konto użytkownika „$1“ już istnieje. SYSDBA można użyć tylko do utworzenia nowego konta!",
     "config-postgres-old": "Korzystasz z wersji $2 oprogramowania PostgreSQL, a potrzebna jest wersja co najmniej $1.",
+    "config-mssql-old": "Wymagany jest Microsoft SQL Server w wersji $1 lub nowszej. Masz zainstalowaną wersję $2.",
     "config-sqlite-name-help": "Wybierz nazwę, która będzie identyfikować Twoją wiki.\nNie wolno używać spacji ani myślników.\nZostanie ona użyta jako nazwa pliku danych SQLite.",
     "config-sqlite-parent-unwritable-group": "Nie można utworzyć katalogu danych <code><nowiki>$1</nowiki></code> , ponieważ katalog nadrzędny <code><nowiki>$2</nowiki></code> nie jest dostępny do zapisu przez webserwer.\n\nInstalator nie może określić, jako kttóry użytkownik działa webserwer.\nZezwól by katalog <code><nowiki>$3</nowiki></code> był dostępny do zapisu przez niego, aby przejść dalej.\nW systemie Unix/Linux wykonaj:\n\n<pre>cd $2\nmkdir $3\nchgrp $4 $3\nchmod g+w $3</pre>",
     "config-sqlite-parent-unwritable-nogroup": "Nie można utworzyć katalogu danych <code><nowiki>$1</nowiki></code> , ponieważ katalog nadrzędny <code><nowiki>$2</nowiki></code> nie jest dostępny do zapisu przez webserwer.\n\nInstalator nie może określić, jako kttóry użytkownik działa webserwer.\nZezwól by katalog <code><nowiki>$3</nowiki></code> był globalnie modyfikowalny przez niego (i innych!) aby przejść dalej.\nW systemie Unix/Linux wykonaj:\n\n<pre>cd $2\nmkdir $3\nchmod a+w $3</pre>",
     "config-sqlite-fts3-downgrade": "Brak wsparcia FTS3 dla PHP. Tabele zostały cofnięte",
     "config-can-upgrade": "W bazie danych są już tabele MediaWiki.\nAby uaktualnić je do MediaWiki $1, kliknij '''Dalej'''.",
     "config-upgrade-done": "Uaktualnienie kompletne.\n\nMożna teraz [ $1  rozpocząć korzystanie z wiki].\n\nJeśli chcesz ponownie wygenerować plik <code>LocalSettings.php</code>, kliknij przycisk poniżej.\nJest to '''nie zalecane''', chyba że występują problemy z twoją wiki.",
-    "config-upgrade-done-no-regenerate": "Aktualizacja zakończona.\n\nMożesz wreszcie [$1 zacząć korzystać ze swojej wiki].",
+    "config-upgrade-done-no-regenerate": "Aktualizacja zakończona.\n\nMożesz teraz [$1 zacząć korzystać ze swojej wiki].",
     "config-regenerate": "Ponowne generowanie LocalSettings.php →",
     "config-show-table-status": "Zapytanie „<code>SHOW TABLE STATUS</code>” nie powiodło się!",
     "config-unknown-collation": "'''Uwaga''' – bazy danych używa nierozpoznanej metody porównywania.",
     "config-mysql-innodb": "InnoDB",
     "config-mysql-myisam": "MyISAM",
     "config-mysql-myisam-dep": "'''Ostrzeżenie''': wybrano MyISIAM jako silnik  składowania danych MySQL, co nie jest zalecane do użytku w MediaWiki, ponieważ:\n * ledwo obsługuje współbieżnośći ze względu na blokowanie tabel\n * jest bardziej podatna na uszkodzenie niż inne silniki\n * kod źródłowy MediaWiki nie zawsze obsługuje MyISAM tak, jak powinien\n\nJeśli instalacja MySQL obsługuje InnoDB, jest wysoce zalecane, by to je wybrać.\nJeśli instalacja MySQL nie obsługuje InnoDB, być może nadszedł czas na jej uaktualnienie.",
-    "config-mysql-only-myisam-dep": "'''Ostrzeżenie:''' MyISAM jest jedynym dostępnym mechanizmem składowania dla MySQL, który nie jest zalecany do używania z MediaWiki, ponieważ:\n* słabo obsługuje współbieżność z powodu blokowania tabel\n* jest bardziej skłonny do uszkodzeń niż inne silniki\n* kod MediaWiki nie zawsze traktuje MyISAM jak powinien\n\nTwoja instalacja MySQL nie obsługuje InnoDB, być może jest to czas na aktualizację.",
+    "config-mysql-only-myisam-dep": "'''Ostrzeżenie:''' MyISAM jest jedynym dostępnym na tym komputerze mechanizmem składowania dla MySQL, który jednak nie jest zalecany do używania z MediaWiki, ponieważ:\n* słabo obsługuje współbieżność z powodu blokowania tabel\n* jest bardziej skłonny do uszkodzeń niż inne silniki\n* kod MediaWiki nie zawsze traktuje MyISAM jak powinien\n\nTwoja instalacja MySQL nie obsługuje InnoDB, być może jest to czas na aktualizację.",
     "config-mysql-engine-help": "'''InnoDB''' jest prawie zawsze najlepszą opcją, ponieważ posiada dobrą obsługę współbieżności.\n\n'''MyISAM''' może być szybsze w instalacjach pojedynczego użytkownika lub tylko do odczytu.\nBazy danych MyISAM mają tendencję do ulegania uszkodzeniom częściej niż bazy InnoDB.",
-    "config-mysql-charset": "Zestaw znaków bazy danych",
+    "config-mysql-charset": "Zestaw znaków bazy danych:",
     "config-mysql-binary": "binarny",
     "config-mysql-utf8": "UTF‐8",
     "config-mysql-charset-help": "W '''trybie binarnym''', MediaWiki zapisuje tekst UTF-8 do bazy danych w polach binarnych.\nJest on bardziej wydajny niż tryb UTF-8 w MySQL i pozwala na używanie znaków pełnego zakresu Unicode.\n\nW '''trybie UTF-8''', MySQL będzie znać zestaw znaków w jakim zakodowano dane, można też przedstawić i przekonwertuj je odpowiednio, ale nie pozwoli Ci przechowywać znaków spoza [//en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes podstawowej płaszczyzny wielojęzyczności].",
-    "config-site-name": "Nazwa wiki",
+    "config-mssql-auth": "Typ uwierzytelniania:",
+    "config-mssql-sqlauth": "Uwierzytelnianie serwera SQL",
+    "config-mssql-windowsauth": "Autoryzacja Windows",
+    "config-site-name": "Nazwa wiki:",
     "config-site-name-help": "Ten napis pojawi się w pasku tytułowym przeglądarki oraz w różnych innych miejscach.",
     "config-site-name-blank": "Wprowadź nazwę witryny.",
-    "config-project-namespace": "Przestrzeń nazw projektu",
+    "config-project-namespace": "Przestrzeń nazw projektu:",
     "config-ns-generic": "Projekt",
-    "config-ns-site-name": "Taka sama jak nazwa wiki $1",
+    "config-ns-site-name": "Taka sama jak nazwa wiki: $1",
     "config-ns-other": "Inna (należy określić)",
     "config-ns-other-default": "MojaWiki",
     "config-project-namespace-help": "Według przykładu Wikipedii wiele wiki przechowuje swoje strony zasad oddzielnie od stron z zawartością, w \"'''przestrzeni nazw projektu'''\".\nWszystkie tytuły stron w tej przestrzeni nazw zaczynają się od pewnego przedrostka, który można tutaj określić.\nTradycyjnie ten przedrostek wywodzi się od nazwy wiki, ale nie może zawierać pewnych znaków przestankowych takich jak \"#\" lub \":\".",
     "config-ns-invalid": "Podana przestrzeń nazw „<nowiki>$1</nowiki>” jest nieprawidłowa.\nPodaj inną przestrzeń nazw projektu.",
     "config-ns-conflict": "Określona przestrzeń nazw \"<nowiki>$1</nowiki>\" powoduje konflikt z domyślną przestrzenią nazw MediaWiki.\nWskaż inną przestrzeń nazw projektu.",
     "config-admin-box": "Konto administratora",
-    "config-admin-name": "Administrator",
-    "config-admin-password": "Hasło",
-    "config-admin-password-confirm": "Hasło powtórnie",
+    "config-admin-name": "Twoja nazwa użytkownika:",
+    "config-admin-password": "Hasło:",
+    "config-admin-password-confirm": "Hasło powtórnie:",
     "config-admin-help": "Wprowadź preferowaną nazwę użytkownika, na przykład „Jan Kowalski”.\nTej nazwy będziesz używać do logowania się do wiki.",
     "config-admin-name-blank": "Wpisz nazwę użytkownika, który będzie administratorem.",
     "config-admin-name-invalid": "Podana nazwa użytkownika „<nowiki>$1</nowiki>” jest nieprawidłowa.\nPodaj inną nazwę.",
     "config-admin-password-blank": "Wprowadź hasło dla konta administratora.",
-    "config-admin-password-same": "Hasło nie może być takie samo jak nazwa użytkownika.",
     "config-admin-password-mismatch": "Wprowadzone dwa hasła różnią się między sobą.",
-    "config-admin-email": "Adres e‐mail",
+    "config-admin-email": "Adres e‐mail:",
     "config-admin-email-help": "Wpisz adres e‐mail, aby mieć możliwość odbierania e‐maili od innych użytkowników wiki, zresetowania hasła oraz otrzymywania powiadomień o zmianach na stronach z listy obserwowanych. Możesz pozostawić to pole niewypełnione.",
     "config-admin-error-user": "Błąd wewnętrzny podczas tworzenia konta administratora o nazwie „<nowiki>$1</nowiki>”.",
     "config-admin-error-password": "Wewnętrzny błąd podczas ustawiania hasła dla administratora „<nowiki>$1</nowiki>”: <pre>$2</pre>",
-    "config-admin-error-bademail": "Wpisałeś nieprawidłowy adres e‐mail",
+    "config-admin-error-bademail": "Wpisałeś nieprawidłowy adres e‐mail.",
     "config-subscribe": "Zapisz się na [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce listę pocztową z ogłoszeniami o nowych wersjach].",
     "config-subscribe-help": "Jest to lista o małej liczbie wiadomości, wykorzystywana do przesyłania informacji o udostępnieniu nowej wersji oraz istotnych sprawach dotyczących bezpieczeństwa.\nPowinieneś zapisać się na tę listę i aktualizować zainstalowane oprogramowanie MediaWiki gdy pojawia się nowa wersja.",
     "config-subscribe-noemail": "Próbowano subskrybować listę mailingową ogłoszeń wersji bez podania adresu e-mail.\nProszę podać adres e-mail, jeśli chcesz subskrybować listę wysyłkową.",
     "config-profile-fishbowl": "Wyłącznie zatwierdzeni edytorzy",
     "config-profile-private": "Prywatna wiki",
     "config-profile-help": "Strony typu wiki działają najlepiej, gdy pozwolisz je edytować tak wielu osobom, jak to możliwie.\nW MediaWiki, można łatwo sprawdzić ostatnie zmiany i wycofać szkody, które są spowodowane przez naiwnych lub złośliwych użytkowników.\n\nJednakże wielu uznało MediaWiki użytecznym w różnorodnych rolach, a czasami nie jest łatwo przekonać wszystkich do korzyści ze sposobu działania wiki. Masz więc wybór.\n\nUstawienie '''{{int:config-profile-wiki}}''' pozwala każdemu na edycję, nawet bez logowania się.\nWiki z '''{{int:config-profile-no-anon}}''' zawiera dodatkowe możliwości ale może powstrzymywać potencjalnych edytorów.\n\nScenariusz '''{{int:config-profile-fishbowl}}''' umożliwia zatwierdzonym użytkownikom edycję, ale wyświetlanie stron jest powszechnie dostępne, włącznie z historią.\nUstawienie '''{{int:config-profile-private}}'' ' pozwala na wyświetlanie stron tylko zatwierdzonym użytkownikom, ta sama grupa może je edytować.\n\nBardziej skomplikowane konfiguracje uprawnień użytkowników są dostępne po zakończeniu instalacji, zobacz [//www.mediawiki.org/wiki/Manual:User_rights odpowiednią część podręcznika].",
-    "config-license": "Prawa autorskie i licencja",
+    "config-license": "Prawa autorskie i licencja:",
     "config-license-none": "Brak stopki z licencją",
     "config-license-cc-by-sa": "Creative Commons – za uznaniem autora, na tych samych zasadach",
     "config-license-cc-by": "Creative Commons – za podaniem autora",
     "config-license-cc-by-nc-sa": "Creative Commons – za uznaniem autora, bez użycia komercyjnego, na tych samych zasadach",
-    "config-license-cc-0": "Creative Commons – zero (domena publiczna)",
+    "config-license-cc-0": "Creative Commons Zero (domena publiczna)",
     "config-license-gfdl": "GNU licencja wolnej dokumentacji 1.3 lub nowsza",
     "config-license-pd": "Domena publiczna",
     "config-license-cc-choose": "Wybierz własną licencję Creative Commons",
     "config-upload-help": "Przesyłanie plików potencjalnie wystawia serwer na zagrożenia.\nWięcej informacji na ten temat można znaleźć w [//www.mediawiki.org/wiki/Manual:Security sekcji zabezpieczeń] podręcznika.\n\nAby włączyć przesyłanie plików, zmień właściwości podkatalogu <code>images</code> katalogu głównego MediaWiki tak, aby serwer sieci web mógł zapisywać do niego.\nNastępnie włącz tę opcję.",
     "config-upload-deleted": "Katalog dla usuniętych plików",
     "config-upload-deleted-help": "Wybierz katalog, w którym będzie archiwum usuniętych plików.\nNajlepiej, aby nie był on dostępny z internetu.",
-    "config-logo": "Adres URL logo",
+    "config-logo": "Adres URL logo:",
     "config-logo-help": "Domyślny motyw MediaWiki zawiera miejsce na logo wielkości 135 x 160 pikseli powyżej menu na pasku bocznym.\nPrześlij obrazek o odpowiednim rozmiarze, a następnie wpisz jego URL tutaj.\n\nMożesz użyć <code>$wgStylePath</code> lub <code>$wgScriptPath</code> jeżeli twoje logo jest relatywne do tych ścieżek.\n\nJeśli nie chcesz logo, pozostaw to pole puste.",
     "config-instantcommons": "Włącz Instant Commons",
     "config-instantcommons-help": "[//www.mediawiki.org/wiki/InstantCommons Instant Commons] jest funkcją, która pozwala wiki używać obrazów, dźwięków i innych mediów znalezionych na  witrynie [//commons.wikimedia.org/ Wikimedia Commons].\nAby to zrobić, MediaWiki wymaga dostępu do internetu.\n\nAby uzyskać więcej informacji na temat tej funkcji, w tym instrukcje dotyczące sposobu ustawiania go na wiki innych niż Wikimedia Commons, sprawdź w [//mediawiki.org/wiki/Manual:$wgForeignFileRepos podręczniku].",
     "config-cc-again": "Wybierz jeszcze raz...",
     "config-cc-not-chosen": "Wybierz którą chcesz licencję Creative Commons i kliknij „Dalej”.",
     "config-advanced-settings": "Konfiguracja zaawansowana",
-    "config-cache-options": "Ustawienia buforowania obiektów",
+    "config-cache-options": "Ustawienia buforowania obiektów:",
     "config-cache-help": "Buforowanie obiekto jest używane aby przyspieszyć MediaWiki przez trzymanie w pamięci podręcznej często używanych danych.\nŚrednie oraz duże witryny są wysoce zachęcane by je włączyć, a małe witryny także dostrzegą korzyści.",
     "config-cache-none": "Brak buforowania (wszystkie funkcje będą działać, ale mogą wystąpić kłopoty z wydajnością na dużych witrynach wiki)",
     "config-cache-accel": "Buforowania obiektów PHP (APC, XCache lub WinCache)",
     "config-install-subscribe-notpossible": "cURL nie jest zainstalowany, więc allow_url_fopen nie jest dostępne.",
     "config-install-mainpage": "Tworzenie strony głównej z domyślną zawartością",
     "config-install-extension-tables": "Tworzenie tabel dla aktywnych rozszerzeń",
-    "config-install-mainpage-failed": "Nie udało się wstawić strony głównej – $1",
+    "config-install-mainpage-failed": "Nie udało się wstawić strony głównej: $1",
     "config-install-done": "'''Gratulacje!'''\nUdało Ci się zainstalować MediaWiki.\n\nInstalator wygenerował plik konfiguracyjny <code>LocalSettings.php</code>.\n\nMusisz go pobrać i umieścić w katalogu głównym Twojej instalacji wiki (tym samym katalogu co index.php). Pobieranie powinno zacząć się automatycznie.\n\nJeżeli pobieranie nie zostało zaproponowane lub jeśli użytkownik je anulował, można ponownie uruchomić pobranie klikając poniższe łącze:\n\n$3\n\n'''Uwaga''': Jeśli nie zrobisz tego teraz, wygenerowany plik konfiguracyjny nie będzie już dostępny po zakończeniu instalacji.\n\nPo załadowaniu pliku konfiguracyjnego możesz '''[$2 wejść na wiki]'''.",
     "config-download-localsettings": "Pobierz <code>LocalSettings.php</code>",
     "config-help": "pomoc",
     "config-extension-link": "Czy wiesz, że twoja wiki obsługuje [//www.mediawiki.org/wiki/Manual:Extensions/pl rozszerzenia]?\n\nMożesz przejrzeć [//www.mediawiki.org/wiki/Category:Extensions_by_category rozszerzenia według kategorii] lub [//www.mediawiki.org/wiki/Extension_Matrix Extension Matrix] aby zobaczyć pełną listę rozszerzeń.",
     "mainpagetext": "'''Instalacja MediaWiki powiodła się.'''",
     "mainpagedocfooter": "Zobacz [//meta.wikimedia.org/wiki/Help:Contents przewodnik użytkownika] w celu uzyskania informacji o działaniu oprogramowania wiki.\n\n== Na początek ==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings/pl Lista ustawień konfiguracyjnych]\n* [//www.mediawiki.org/wiki/Manual:FAQ/pl MediaWiki FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Komunikaty o nowych wersjach MediaWiki]\n* [//www.mediawiki.org/wiki/Localisation#Translation_resources Przetłumacz MediaWiki na swój język]"
-}
\ No newline at end of file
+}
index e112561..bebceee 100644 (file)
@@ -4,7 +4,8 @@
             "Borichèt",
             "Dragonòt",
             "Krinkle",
-            "아라"
+            "아라",
+            "Amire80"
         ]
     },
     "config-desc": "L'instalador për mediaWiki",
     "config-magic-quotes-runtime": "'''Fatal: [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-runtime magic_quotes_runtime] a l'é ativ!'''\nCosta opsion a danegia ij dat d'intrada an manera pa prevedìbil.\nA peul pa instalé o dovré MediaWiki se st'opsion a l'é pa disabilità.",
     "config-magic-quotes-sybase": "'''Fatal: [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-sybase magic_quotes_sybase] a l'é ativ!'''\nCosta opsion a danegia ij dat d'intrada an manera pa prevedìbil.\nA peul pa instalé o dovré MediaWiki se st'opsion a l'é pa disabilità.",
     "config-mbstring": "'''Fatal: [http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload] a l'é ativ!'''\nCosta opsion a càusa d'eror e a peul danegié ij dat d'intrada an manera pa prevedìbil.\nA peul pa instalé o dovré MediaWiki se st'opsion a l'é pa disabilità.",
-    "config-ze1": "'''Fatal: [http://www.php.net/manual/en/ini.core.php zend.ze1_compatibility_mode] a l'é ativ!'''\nCosta opsion a càusa dij bigat afros con MediaWiki.\nA peul pa instalé o dovré MediaWiki se st'opsion a l'é pa disabilità.",
     "config-safe-mode": "'''Avis:''' [http://www.php.net/features.safe-mode Safe mode] ëd PHP a l'é ativ.\nA peul causé ëd problema, dzortut s'as deuvro ël cariament d'archivi e ël manteniment ëd <code>math</code>.",
     "config-xml-bad": "Mòdul XML ed PHP mancant.\nMediaWiki a l'ha da manca dle funsion an sto mòdul e a travajërà pa an costa configurassion.\nS'a fa giré mandrake, ch'a instala ël pachet php-xml.",
-    "config-pcre": "A smija che ël mòdul d'apògg PCRE a sia mancant.\nMediaWiki a l'ha da manca dle funsion d'espression regolar Perl-compatìbij për marcé.",
     "config-pcre-no-utf8": "'''Fatal''': ël mòdul PCRE ëd PHP a smija esse compilà sensa l'apògg PCRE_UTF8.\nMediaWiki a ciama l'apògg d'UTF8 për marcé për da bin.",
     "config-memory-raised": "<code>memory_limit</code> ëd PHP a l'é $1, aussà a $2.",
     "config-memory-bad": "'''Avis:''' <code>memory_limit</code> ëd PHP a l'é $1.\nSossì a l'é probabilment tròp bass.\nL'instalassion a peul falì!",
     "config-gd": "Trovà la librarìa gràfica antëgrà GD.\nLa miniaturisassion ëd figure a sarà abilità s'a abìlita ij cariament.",
     "config-no-scaling": "As treuva pa la librarìa GD o ImageMagick.\nLa miniaturisassion ëd figure a sarà disabilità.",
     "config-no-uri": "'''Eror:''' As peul pa determiné l'URI corenta.\nInstalassion abortìa.",
-    "config-no-cli-uri": "'''Avis''': pa gnun --scriptpath specificà, a sarà dovrà ël predefinì: <code>$1</code>.",
+    "config-no-cli-uri": "'''Avis''': pa gnun <code>--scriptpath</code> specificà, a sarà dovrà ël predefinì: <code>$1</code>.",
     "config-using-server": "Utilisassion dël nòm ëd servent \"<nowiki>$1</nowiki>\".",
     "config-using-uri": "Utilisassion ëd l'anliura ëd servent «<nowiki>$1$2</nowiki>».",
     "config-uploads-not-safe": "'''Avis:''' Sò dossié stàndard për carié <code>$1</code> a l'é vulneràbil a l'esecussion ëd qualsëssìa senari.\nBele che MediaWiki a contròla j'aspet ëd sicurëssa ëd tùit j'archivi carià, a l'é motobin arcomandà ëd [//www.mediawiki.org/wiki/Manual:Security#Upload_security saré ës përtus ëd sicurëssa] prima d'abilité ij cariament.",
     "config-no-cli-uploads-check": "'''Avis:''' Toa cartela predefinìa për j-amportassion (<code>$1</code>) a l'é nen controlà a propòsit ëd la vulnerabilità\nd'esecussion ëd senari arbitrari durant l'istalassion CLI.",
     "config-brokenlibxml": "Sò sistema a l'ha na combinassion ëd version PHP e libxml2 che a l'ha dij bigat e a peul provoché la corussion ëd dat ëstërmà an MediaWiki e d'àutre aplicassion për l'aragnà.\nCh'a agiorna a PHP 5.2.9 o pi neuv e libxml2 2.7.3 o pi neuv ([//bugs.php.net/bug.php?id=45996 bug filed with PHP]).\nIstalassion abortìa.",
-    "config-using531": "MediaWiki a peul pa esse dovrà con PHP $1 a motiv d'un bigat ch'a ìmplica ij paràmetr d'arferiment a <code>__call()</code>.\nCh'a agiorna a PHP 5.3.2 o pi neuv, o ch'a torna andré a PHP 5.3.0 për arzòlve ës problema.\nIstalassion abortìa.",
     "config-suhosin-max-value-length": "Suhosin a l'é instalà e a lìmita la longheur dël paràmetr GET a $1 byte. Ël component ResourceLoader ëd MediaWiki a travajerà an rispetand ës lìmit, ma sòn a degraderà le prestassion. Se possìbil, a dovrìa amposté suhosin.get.max_value_lenght a 1024 o pi àut an <code>php.ini</code>, e amposté <code>$wgResourceLoaderMaxQueryLength</code> al midem valor an LocalSettings.php .",
     "config-db-type": "Sòrt ëd base ëd dàit:",
     "config-db-host": "Ospitant ëd la base ëd dàit:",
     "config-oracle-def-ts": "Spassi dla tàula dë stàndard:",
     "config-oracle-temp-ts": "Spassi dla tàula temporani:",
     "config-support-info": "MediaWiki a manten ij sistema ëd base ëd dàit sì-dapress:\n\n$1\n\nS'a vëd pa listà sì-sota ël sistema ëd base ëd dàit ch'a preuva a dovré, antlora va andaré a j'istrussion dl'anliura sì-dzora për abilité ël manteniment.",
-    "config-support-mysql": "* $1 e l'é l'obietiv primari për MediaWiki e a l'é mej mantnù ([http://www.php.net/manual/en/mysql.installation.php com compilé PHP con ël manteniment MySQL])",
-    "config-support-postgres": "* $1 e l'é un sistema ëd base ëd dàit popolar a sorgiss duverta com alternativa a MySQL ([http://www.php.net/manual/en/pgsql.installation.php com compilé PHP con ël manteniment ëd PostgreSQL]). A peulo ess-ie chèich cit bigat, e a l'é nen arcomandà ëd dovrelo an n'ambient ëd produssion.",
-    "config-support-sqlite": "* $1 e l'é un sistema ëd base ëd dàit leger che a l'é motobin bin mantnù ([http://www.php.net/manual/en/pdo.installation.php com compilé PHP con ël manteniment ëd SQLite], a deuvra PDO)",
-    "config-support-oracle": "* $1 a l'é na base ëd dàit comersial për j'amprèise. ([http://www.php.net/manual/en/oci8.installation.php Com compilé PHP con ël manteniment OCI8])",
+    "config-dbsupport-mysql": "* $1 e l'é l'obietiv primari për MediaWiki e a l'é mej mantnù ([http://www.php.net/manual/en/mysql.installation.php com compilé PHP con ël manteniment MySQL])",
+    "config-dbsupport-postgres": "* $1 e l'é un sistema ëd base ëd dàit popolar a sorgiss duverta com alternativa a MySQL ([http://www.php.net/manual/en/pgsql.installation.php com compilé PHP con ël manteniment ëd PostgreSQL]). A peulo ess-ie chèich cit bigat, e a l'é nen arcomandà ëd dovrelo an n'ambient ëd produssion.",
+    "config-dbsupport-sqlite": "* $1 e l'é un sistema ëd base ëd dàit leger che a l'é motobin bin mantnù ([http://www.php.net/manual/en/pdo.installation.php com compilé PHP con ël manteniment ëd SQLite], a deuvra PDO)",
+    "config-dbsupport-oracle": "* $1 a l'é na base ëd dàit comersial për j'amprèise. ([http://www.php.net/manual/en/oci8.installation.php Com compilé PHP con ël manteniment OCI8])",
     "config-header-mysql": "Ampostassion MySQL",
     "config-header-postgres": "Ampostassion PostgreSQL",
     "config-header-sqlite": "Ampostassion SQLite",
     "config-admin-name-blank": "Ch'a anserissa në stranòm d'aministrator.",
     "config-admin-name-invalid": "Ël nòm utent specificà \"<nowiki>$1</nowiki>\" a l'é pa bon.\nSpecìfica un nòm utent diferent.",
     "config-admin-password-blank": "Ch'a anserissa na ciav për ël cont d'aministrator.",
-    "config-admin-password-same": "La ciav a dev nen esse l'istessa ëd lë stranòm d'utent.",
     "config-admin-password-mismatch": "Le doe ciav che a l'ha scrivù a son diferente antra 'd lor.",
     "config-admin-email": "Adrëssa ëd pòsta eletrònica:",
     "config-admin-email-help": "Ch'a anserissa ambelessì n'adrëssa ëd pòsta eletrònica për përmëtt-je d'arsèive ëd mëssagi da d'àutri utent an sla wiki, riamposté soa ciav, e esse anformà dle modìfiche a le pàgine ch'a ten sot-euj. A peule lassé ës camp veuid.",
     "config-nofile": "L'archivi «$1» as treuva nen. A l'é stàit ëscancelà?",
     "mainpagetext": "'''MediaWiki a l'é staita anstalà a la përfession.'''",
     "mainpagedocfooter": "Che a varda la [//meta.wikimedia.org/wiki/Help:Contents User's Guide] për avèj dj'anformassion ant sël coma dovré ël programa dla wiki.\n\n== Për anandiesse a travajé ==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Lista dij paràmeter ëd configurassion]\n* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki Chestion frequente]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lista ëd discussion an sla distribussion ëd MediaWiki]\n* [//www.mediawiki.org/wiki/Localisation#Translation_resources Localisa MediaWiki për toa lenga]"
-}
\ No newline at end of file
+}
index d137156..4611709 100644 (file)
@@ -5,4 +5,4 @@
         ]
     },
     "mainpagetext": "'''To λογισμικόν MediaWiki εθέκεν.'''"
-}
\ No newline at end of file
+}
index 58c28fc..2237fd1 100644 (file)
@@ -6,4 +6,4 @@
     },
     "mainpagetext": "'''MediaWiki's instalaciōni izpalla.'''",
     "mainpagedocfooter": "Wīdais [//meta.wikimedia.org/wiki/Help:Contents przewodnik użytkownika] kāi gaūlai infōrmaciōnei ezze wiki prōgramijas tērpausnan.\n\n== En pagaūseņu ==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Configuration settings list]\n* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]"
-}
\ No newline at end of file
+}
index 62c5d39..a2e8cbb 100644 (file)
@@ -5,18 +5,30 @@
         ]
     },
     "config-information": "مالومات",
+    "config-localsettings-key": "کونجۍ نومهالول:",
+    "config-localsettings-badkey": "کومه کونجۍ مو چې ورکړه ناسمه ده.",
     "config-your-language": "ستاسې ژبه:",
     "config-wiki-language": "د ويکي ژبه:",
+    "config-back": "← پر شا تلل",
+    "config-continue": "پر مخ تلل →",
     "config-page-language": "ژبه",
     "config-page-welcome": "مېډياويکي ته ښه راغلاست!",
+    "config-page-dbconnect": "توکبنسټ سره اړيکه نيول",
+    "config-page-dbsettings": "د توکبنسټ امستنې",
     "config-page-name": "نوم",
     "config-page-options": "خوښنې",
     "config-page-install": "لگول",
     "config-page-complete": "بشپړ!",
+    "config-page-readme": "ما ولوله",
+    "config-page-copying": "لمېسنه",
+    "config-page-upgradedoc": "نومهالېدنه",
+    "config-page-existingwiki": "شته ويکي",
+    "config-restart": "هو، سر له نوي يې پيل کړه",
     "config-env-php": "د $1 PHP نصب شو.",
     "config-db-type": "د توکبنسټ ډول:",
     "config-db-host": "د توکبنسټ کوربه:",
     "config-db-host-oracle": "د توکبنسټ TNS:",
+    "config-db-wiki-settings": "دا ويکي پېژندل",
     "config-db-name": "د توکبنسټ نوم:",
     "config-db-username": "د توکبنسټ کارن-نوم:",
     "config-db-password": "د توکبنسټ پټنوم:",
     "config-site-name-blank": "د وېبځي نوم وليکۍ.",
     "config-project-namespace": "د پروژې نوم-تشيال:",
     "config-ns-generic": "پروژه",
+    "config-ns-other-default": "زما ويکي",
     "config-admin-box": "د پازوال گڼون",
-    "config-admin-name": "ستاسې نوم:",
+    "config-admin-name": "ستاسې کارن نوم:",
     "config-admin-password": "پټنوم:",
     "config-admin-password-confirm": "پټنوم يو ځل بيا:",
     "config-admin-email": "برېښليک پته:",
+    "config-optional-continue": "نورې پوښتنې راڅخه وپوښتئ.",
+    "config-profile": "د کارن رښتو پېژنليک:",
     "config-profile-wiki": "پرانيستې ويکي",
+    "config-profile-private": "شخصي ويکي",
     "config-license-pd": "ټولگړی شپول",
     "config-email-settings": "د برېښليک امستنې",
+    "config-email-user": "کارن تر کارن برېښليک چارنول",
     "config-install-step-done": "ترسره شو",
+    "config-install-user-alreadyexists": "د \"$1\" کارن له پخوا څخه شته",
     "config-install-tables": "لښتيالونه جوړول",
+    "config-download-localsettings": "ښکته کول <code>LocalSettings.php</code>",
     "config-help": "لارښود",
     "mainpagetext": "'''MediaWiki په برياليتوب سره نصب شو.'''",
     "mainpagedocfooter": "د ويکي ساوترې د کارولو د  مالوماتو په اړه [//meta.wikimedia.org/wiki/Help:Contents د کارن لارښود] سره سلا وکړۍ.\n\n== پيلول ==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings د امستنو د سازونې لړليک]\n* [//www.mediawiki.org/wiki/Manual:FAQ د ميډياويکي ډېرځليزې پوښتنې]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce د مېډياويکي د برېښليکونو لړليک]\n* [//www.mediawiki.org/wiki/Localisation#Translation_resources خپلې ژبې لپاره MediaWiki ځايتابول]"
-}
\ No newline at end of file
+}
index 8d7aec5..4b0f6be 100644 (file)
@@ -6,7 +6,12 @@
             "Gustavo",
             "Luckas",
             "Marcionunes",
-            "555"
+            "555",
+            "Amgauna",
+            "Anaclaudiaml",
+            "Cybermandrake",
+            "Fabsouza1",
+            "Rodrigo codignoli"
         ]
     },
     "config-desc": "O instalador do MediaWiki",
@@ -18,7 +23,7 @@
     "config-localsettings-badkey": "A chave fornecida está incorreta.",
     "config-upgrade-key-missing": "Foi detectada uma instalação existente do MediaWiki.\nPara atualizar esta instalação, insira a seguinte linha na parte inferior do seu <code>LocalSettings.php</code>:\n\n$1",
     "config-localsettings-incomplete": "O arquivo <code>LocalSettings.php</code> parece incompleto.\nA variável $1 não está definida.\nAltere seu <code>LocalSettings.php</code> com a definição dessa variável e clique em \"{{int:Config-continue}}\".",
-    "config-localsettings-connection-error": "Ocorreu um erro ao conectar ao banco de dados através das configurações presentes ou no <code>LocalSettings.php</code> ou no <code>AdminSettings.php</code>. Corrija essas configurações e tente novamente.\n\n$1",
+    "config-localsettings-connection-error": "Ocorreu um erro ao conectar ao banco de dados através das configurações presentes no arquivo <code>LocalSettings.php</code>. Por favor, corrija essas configurações e tente novamente.\n\n$1",
     "config-session-error": "Erro ao iniciar a sessão: $1",
     "config-session-expired": "Os seus dados de sessão parecem ter expirado.\nAs sessões estão configuradas para uma duração de $1.\nVocê pode aumentar esta duração configurando <code>session.gc_maxlifetime</code> no php.ini.\nReinicie o processo de instalação.",
     "config-no-session": "Os seus dados de sessão foram perdidos!\nVerifique o seu php.ini e certifique-se de que em <code>session.save_path</code> está definido um diretório apropriado.",
     "config-env-good": "O ambiente foi verificado.\nVocê pode instalar o MediaWiki.",
     "config-env-bad": "O ambiente foi verificado.\nVocê não pode instalar o MediaWiki.",
     "config-env-php": "O PHP $1 está instalado.",
+    "config-env-php-toolow": "PHP $1 está instalado.\nNo entanto, o MediaWiki requer PHP $2 ou superior.",
     "config-unicode-using-utf8": "Usando o utf8_normalize.so, de Brion Vibber, para a normalização Unicode.",
     "config-unicode-using-intl": "Usando a [http://pecl.php.net/intl extensão intl PECL] para a normalização Unicode.",
     "config-unicode-pure-php-warning": "'''Aviso''': A [http://pecl.php.net/intl extensão intl PECL] não está disponível para efetuar a normalização Unicode sendo usada, em seu lugar, a lenta implementação de PHP puro.\nSe o seu site tem um alto volume de tráfego, informe-se sobre a [//www.mediawiki.org/wiki/Unicode_normalization_considerations normalização Unicode].",
-    "config-no-db": "Não foi possível encontrar um driver de banco de dados adequado! É necessário instalar um driver de banco de dados para o PHP.\nSão suportados os seguintes tipos de bancos de dados: $1.\n\nSe estiver em uma hospedagem partilhada, peça à sua empresa de hospedagem para instalar um driver de banco de dados adequado.\nSe você mesmo tiver compilado o PHP, reconfigure-o com um cliente de banco de dados ativado usando, por exemplo, <code>./configure --with-mysql</code>.\nSe você instalou o PHP a partir de um pacote do Debian ou do Ubuntu, instale também o módulo php5-mysql.",
+    "config-unicode-update-warning": "\"Aviso:\" A versão instalada do wrapper Unicode usa uma versão mais antiga da biblioteca do : [//www.site.icu-project.org/projeto ICU].\nVocê devia [//www.mediawiki.org/wiki/Unicode_normalization_considerations upgrade] se você tem quaisquer procupações com o uso do Unicode",
+    "config-no-db": "Não foi possível encontrar um driver de banco de dados adequado! É necessário instalar um driver de banco de dados para o PHP.\nSão suportados os seguintes tipos de bancos de dados: $1.\n\nSe você mesmo tiver compilado o PHP, reconfigure-o com um cliente de banco de dados ativado usando, por exemplo <code>./configure --with-mysqli</code>.\nSe você instalou o PHP a partir de um pacote do Debian ou do Ubuntu, então será também necessário instalar, por exemplo, o pacote <code>php5-mysql</code>.",
+    "config-outdated-sqlite": "<strong>AVISO:</strong> você tem SQLite  $1 , que é menor do que a versão mínima necessária  $2 . SQLite não estará disponível.",
     "config-no-fts3": "' ' 'Aviso' ' ': O SQLite foi compilado sem o módulo [//sqlite.org/fts3.html FTS3]; as funcionalidades de pesquisa não estarão disponíveis nesta instalação.",
     "config-register-globals": "' ' 'Aviso: A opção <code>[http://php.net/register_globals register_globals]</code> do PHP está ativada.'''\n' ' 'Desative-a, se puder.'''\nO MediaWiki funcionará mesmo assim, mas o seu servidor ficará exposto a potenciais vulnerabilidades de segurança.",
+    "config-magic-quotes-runtime": "'''Fatal: A opção [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-runtime magic_quotes_runtime] está ativada!'''\nEsta opção causa corrupção dos dados de entrada, de uma forma imprevisível.\nNão pode instalar ou usar o MediaWiki a menos que esta opção seja desativada.",
+    "config-magic-quotes-sybase": "<strong>Fatal: A opção [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-sybase magic_quotes_sybase] está ativada!</strong>\nEsta opção corrompe os dados de entrada de forma imprevisível.\nNão pode instalar ou usar o MediaWiki a menos que esta opção seja desativada.",
+    "config-mbstring": "<strong>Fatal: A opção [http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload] está ativada!</strong>\nEsta opção causa erros e pode corromper os dados de forma imprevisível.\nNão pode instalar ou usar o MediaWiki a menos que esta opção seja desativada.",
+    "config-safe-mode": "<strong>Aviso:</strong> O [http://www.php.net/features.safe-mode safe mode] do PHP está ativo.\nEste modo pode causar problemas, especialmente no upload de arquivos e no suporte a <code>math</code>.",
+    "config-xml-bad": "O módulo XML do PHP está ausente.\nO MediaWiki necessita de funções deste módulo e não funcionará com esta configuração.\nSe está executando o Mandrake, instale o pacote php-xml.",
+    "config-pcre-old": "<strong>Fatal:</strong> É necessário o PCRE $1 ou versão posterior.\nO binário do seu PHP foi vinculado com o PCRE $2.\n[https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/PCRE Mais informações].",
+    "config-pcre-no-utf8": "<strong>Fatal:</strong> O módulo PCRE do PHP parece ser compilado sem suporte PCRE_UTF8.\nO MediaWiki requer suporte a UTF-8 para funcionar corretamente.",
+    "config-memory-raised": "A configuração <code>memory_limit</code> do PHP era $1; foi aumentada para $2.",
+    "config-memory-bad": "<strong>AVISO:</strong> A configuração <code>memory_limit</code> do PHP é $1.\nIsso provavelmente é muito baixo.\nA instalação pode falhar!",
+    "config-ctype": "<strong>Fatal:</strong> O PHP deve ser compilado com suporte para o [http://www.php.net/manual/en/ctype.installation.php extensão Ctype].",
+    "config-json": "<strong>Fatal:</strong> O PHP foi compilado sem suporte a JSON.\nVocê deve instalar a extensão PHP JSON ou a extensão [http://pecl.php.net/package/jsonc PECL jsonc] antes de instalar o MediaWiki.!N.* A extensão JSON do PHP já está incluída no Red Hat Enterprise Linux (CentOS) 5 e 6, mas deve ser habilitado no <code>/etc/php.ini</code> ou no <code>/etc/php.d/json.ini</code> .!N. * Algumas distribuições Linux lançadas após maio de 2013 omitem a extensão PHP, oferecendo em seu lugar a extensão PECL como parte do pacote <code>php5-json</code> ou do <code>php-pecl-jsonc</code> .",
+    "config-xcache": "[http://xcache.lighttpd.net/ XCache] está instalado",
+    "config-apc": "[http://www.php.net/apc APC] está instalado",
+    "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache] está instalado",
+    "config-no-cache": "<strong>AVISO:</strong> Não foi possível encontrar o [http://www.php.net/apc APC], [http://xcache.lighttpd.net/ XCache] ou [http://www.iis.net/download/WinCacheForPhp WinCache].\nO cache de objetos não está habilitado.",
+    "config-mod-security": "<strong>AVISO:</strong> Seu servidor web tem [http://modsecurity.org/ mod_security] habilitado. Se configurado incorretamente, pode causar problemas para o MediaWiki ou outro software que permite aos usuários postar conteúdo arbitrário.\nConsulte a [http://modsecurity.org/documentation/ documentação do mod_security] ou entre em contato com o suporte do seu host se você encontrar erros aleatórios.",
+    "config-diff3-bad": "O GNU diff3 não foi encontrado.",
+    "config-git": "Foi encontrado o software de controle de versão Git <code>$1</code>.",
+    "config-git-bad": "Não foi encontrado o software de controle de versão Git.",
+    "config-imagemagick": "ImageMagick encontrado: <code>$1</code> .\nRedimensionamento de imagem será ativado se você permitir uploads.",
+    "config-no-uri": "<strong>Error:</strong> Não foi possível determinar a URI atual. A instalação foi abortada.",
+    "config-using-server": "Utilizando o nome do servidor \"<nowiki>$1</nowiki>\".",
+    "config-using-uri": "Usando URL do servidor \"<nowiki>$1$2</nowiki>\".",
+    "config-db-type": "Tipo de base de dados:",
+    "config-db-host": "Servidor da base de dados:",
+    "config-db-host-help": "Se a sua base de dados está em um servidor diferente, digite o nome do hospedeiro ou o endereço IP aqui.\n\nSe você está utilizando um hospedeiro web compartilhado, o seu provedor de hospedagem deverá fornecer o nome do hospedeiro correto e a sua documentação.\n\nSe você está instalando em um servidor Windows e usando o MySQL, usar \"localhost\" não deverá funcionar para o nome de servidor. Se não funcionar, tente \"127.0.01\" para o endereço de IP local.\n\nSe você está usando PostgreSQL, deixe este campo em branco para se conectar através de um socket Unix.",
+    "config-db-host-oracle": "TNS da base de dados:",
+    "config-db-wiki-settings": "Identifique esta wiki",
+    "config-db-name": "Nome da base de dados:",
+    "config-db-name-help": "Escolha um nome que identifique a sua wiki.\nEle não deve conter espaços.\n\nSe você está utilizando um hospedeiro web compartilhado, o provedor de hospedagem lhe dará um nome especifico de base de dados para usar ou o deixará criar a partir do painel de controle.",
+    "config-db-name-oracle": "Esquema de base de dados:",
+    "config-db-install-account": "Conta de usuário para instalação",
+    "config-db-username": "Usuário de base de dados:",
+    "config-db-password": "Senha da base de dados:",
+    "config-db-password-empty": "Por favor digite uma senha para o novo usuário da base de dados: $1. Embora seja possível criar usuários sem senha, isto não é seguro.",
+    "config-db-install-username": "Digite o nome de usuário que será utilizado para conectar com a base de dados durante o processo de instalação.\nEste não é a conta de usuário do MediaWiki; este é o usuário da sua base de dados.",
+    "config-db-install-password": "Digite a senha que será utilizada para conectar com a base de dados durante o processo de instalação.\nEsta não é a senha de usuário da conta do MediaWiki; esta será a senha da sua base de dados.",
+    "config-db-install-help": "Digite o nome de usuário e a senha que será utilizada para conectar com a base de dados durante o processo de instalação.",
+    "config-db-prefix": "Prefixo da tabela de banco de dados:",
+    "config-db-prefix-help": "Se você precisar compartilhar a base de dados entre várias wikis, ou entre MediaWiki e uma outra aplicação web, você deve escolher adicionar um prefixo para todas as tabelas para evitar conflitos.\nNão utilize espaços.\n\nEste campo é habitualmente deixado em branco.",
+    "config-db-charset": "Conjunto de caracteres da base de dados",
     "config-charset-mysql5-binary": "MySQL 4.1/5.0 binary",
     "config-charset-mysql5": "MySQL 4.1/5.0 UTF-8",
+    "config-mysql-old": "MySQL $1 ou posterior é necessário. Você tem $2.",
+    "config-db-port": "Porta da base de dados:",
+    "config-db-schema": "Esquema para MediaWiki",
+    "config-db-schema-help": "Este esquema geralmente estará correto.\nSomente modifique se você souber que precisa disso.",
+    "config-pg-test-error": "Não foi possível se conectar com a base de dados <strong>$1</strong>: $2",
+    "config-sqlite-dir": "Diretório de dados do SQLite:",
+    "config-sqlite-dir-help": "SQLite armazena todos os dados em um único arquivo.\n\nO diretório que você forneceu deve permitir a escrita do servidor web durante a instalação.\n\nO diretório <strong>não</strong> deve ser acessível pela web, por isso não estamos colocando onde estão os seus arquivos PHP.\n\nO instalador escreverá um <code>.htaccess</code> arquivo, mas se isso falhar alguém poderá ganhar acesso em toda sua base de dados.\nIsso inclui dados dos usuários (endereço de email, senhas criptografadas) assim como todas revisões deletadas e outros dados restritos na wiki.\n\nConsidere colocar a base de dados em algum outro lugar, por exemplo <code>/var/lib/mediawiki/yourwiki</code>.",
+    "config-oracle-def-ts": "Espaço de tabela padrão:",
+    "config-oracle-temp-ts": "Espaço de tabela temporário:",
+    "config-type-mysql": "MySQL (ou compatível)",
+    "config-type-mssql": "Microsoft SQL Server",
+    "config-dbsupport-sqlite": "* [{{int:version-db-sqlite-url}} SQLite] é um sistema de banco de dados leve que é muito bem suportado. ([http://www.php.net/manual/en/pdo.installation.php como compilar o PHP com suporte a SQLite], usa DOP)",
+    "config-header-mysql": "Configurações MySQL",
+    "config-header-postgres": "Configurações PostgreSQL",
+    "config-header-sqlite": "Configurações SQLite",
+    "config-header-oracle": "Configurações Oracle",
+    "config-header-mssql": "Configurações Microsoft SQL Server",
+    "config-invalid-db-type": "Tipo de base de dados inválido",
+    "config-missing-db-name": "Você deve inserir um valor para \"Nome da base de dados\"",
+    "config-missing-db-host": "Você deve inserir um valor para \"Hospedeiro da base de dados\"",
+    "config-missing-db-server-oracle": "Você deve inserir um valor para \"Database TNS\"",
+    "config-connection-error": "$1\n\nVerifique o servidor hospedeiro, nome de usuário e senha e tente novamente.",
+    "config-db-sys-user-exists-oracle": "Conta de usuário $1 já existe. SYSDBA somente será utilizado para criação de uma nova conta!",
+    "config-postgres-old": "PostgreSQL $1 ou posterior é necessário. Você tem $2.",
+    "config-mssql-old": "Microsoft SQL Server $1 ou posterior é necessário.Você tem $2.",
+    "config-sqlite-name-help": "Escolha um nome que identifique a sua wiki.\nNão utilize espaços ou hifens.\nIsto será utilizado como nome de arquivo SQLite.",
+    "config-sqlite-mkdir-error": "Ocorreu um erro na criação do diretório de dados \"$1\".\nVerifique a localização e tente de novo.",
+    "config-sqlite-dir-unwritable": "Não foi possível escrever no diretório \"$1\".\nModifique as permissões então o servidor web poderá escrever no diretório, e tente novamente.",
+    "config-sqlite-connection-error": "$1\n\nVerifique o diretório de dados e nome da base de dados abaixo e tente novamente.",
+    "config-sqlite-readonly": "Não é possível escrever no arquivo <code>$1</code>.",
+    "config-sqlite-cant-create-db": "Não foi possível criar o arquivo da base de dados <code>$1</code>.",
+    "config-db-web-account": "Conta da base de dados para acesso web",
+    "config-db-web-help": "Escolha um nome de usuário e uma senha para que o servidor web use, para se conectar ao servidor da base de dados, durante o funcionamento normal da Wiki.",
+    "config-db-web-account-same": "Use a mesma conta usada na instalação",
+    "config-db-web-create": "Crie uma conta, se esta não existir ainda.",
+    "config-db-web-no-create-privs": "A conta que você especificou para a instalação não possui privilégios o bastante para criar uma conta.\nA conta que você especificou aqui já deve existir.",
+    "config-mysql-engine": "Mecanismo de armazenamento:",
     "config-mysql-innodb": "InnoDB",
     "config-mysql-myisam": "MyISAM",
+    "config-mysql-charset": "Conjunto de caracteres da base de dados:",
     "config-mysql-binary": "Binary",
     "config-mysql-utf8": "UTF-8",
+    "config-mssql-auth": "Tipo de autenticação:",
+    "config-mssql-sqlauth": "Autenticação do SQL Server",
+    "config-mssql-windowsauth": "Autenticação do Windows",
+    "config-site-name": "Nome da Wiki:",
+    "config-site-name-help": "Isto aparecerá na barra de títulos do navegador e em vários outros lugares.",
+    "config-site-name-blank": "Digite o nome do site.",
     "config-ns-generic": "Projeto",
+    "config-ns-site-name": "O mesmo que o nome da wiki: $1",
+    "config-ns-other": "Outro (especifique)",
+    "config-ns-other-default": "MinhaWiki",
+    "config-ns-invalid": "O nome de espaços especificados \"<nowiki>$1</nowiki>\" é inválido. Especifique um nome de espaços de projeto diferente.",
     "config-admin-box": "Conta de administrador",
-    "config-admin-name": "Seu nome:",
+    "config-admin-name": "Seu nome de usuário:",
     "config-admin-password": "Senha:",
+    "config-admin-password-confirm": "Repita a senha:",
+    "config-admin-help": "Digite o seu nome de usuário preferido aqui, por exemplo \"José Silveira\". Este será o nome que você usará para entrar na wiki.",
+    "config-admin-name-blank": "Digite um nome de usuário administrador.",
+    "config-admin-name-invalid": "O nome de usuário especificado \"<nowiki>$1</nowiki>\" é inválido.\nEspecifique um nome de usuário diferente.",
+    "config-admin-password-blank": "Digite uma senha para a conta de administrador.",
+    "config-admin-password-mismatch": "As duas senhas que você digitou não são iguais.",
+    "config-admin-email": "Endereço de email:",
+    "config-admin-email-help": "Digite aqui um endereço de email para permitir que você receba email de outros usuários na wiki, refaça a sua senha, e seja notificado das mudanças das páginas que você vigia. Você pode deixar esse campo vazio.",
+    "config-admin-error-user": "Erro interno ao criar um administrador com o nome \"<nowiki>$1</nowiki>\".",
+    "config-admin-error-password": "Erro interno ao configurar uma senha para o administrador \"<nowiki>$1</nowiki>\": <pre>$2</pre>",
+    "config-admin-error-bademail": "Você digitou um endereço de email inválido.",
+    "config-almost-done": "Você está quase terminando!\nVocê agora pode pular as configurações restantes e instalar a wiki agora mesmo.",
+    "config-optional-continue": "Faça-me mais perguntas.",
+    "config-optional-skip": "Já estou aborrecido, somente instale a wiki.",
+    "config-profile": "Perfil de permissões do usuário:",
+    "config-profile-wiki": "Wiki aberta",
+    "config-profile-no-anon": "Criação de conta exigida",
+    "config-profile-fishbowl": "Somente editores autorizados",
+    "config-profile-private": "Wiki privada",
+    "config-license": "Direitos autorais e licenças:",
+    "config-license-none": "Sem rodapé de licença",
+    "config-license-gfdl": "GNU documentação de licença livre 1.3 ou posterior",
     "config-license-pd": "Domínio público",
+    "config-license-cc-choose": "Selecione uma licença personalizada do Creative Commons",
+    "config-email-settings": "Configurações de email",
+    "config-enable-email-help": "Se você quer que o email funcione, estas  [http://www.php.net/manual/en/mail.configuration.php configurações de email PHP] precisam ser configuradas corretamente. \nSe você não quiser usar nenhuma das funcionalidades, você pode desabilitá-las aqui.",
+    "config-email-user": "Habilitação de email de usuário para usuário",
+    "config-email-user-help": "Permite que todos os usuários mandem email uns aos outros, se eles tiverem habilitado o envio em suas preferências.",
+    "config-email-usertalk": "Habilitação das notificações da página de discussão dos usuários",
+    "config-email-usertalk-help": "Permite que os usuários recebam as notificações quando suas páginas de discussão se modificarem, se eles tiverem habilitado as notificações em suas preferências.",
+    "config-email-watchlist": "Habilitação das notificações de vigilância",
+    "config-email-watchlist-help": "Permite que os usuários recebam as notificações sobre suas páginas vigiadas, se eles tiverem habilitado isto em suas preferências.",
+    "config-email-auth": "Autenticação de email habilitada",
+    "config-email-sender": "Endereço de email de resposta:",
+    "config-upload-settings": "Imagens e arquivos carregados",
+    "config-upload-enable": "Habilite o carregamento de arquivos",
+    "config-upload-deleted": "Diretório para arquivos excluídos:",
+    "config-upload-deleted-help": "Escolha um diretório no qual serão armazenados os arquivos excluídos. \nIdealmente, este não deveria ser acessível pela web.",
+    "config-logo": "URL do logotipo:",
     "config-logo-help": "Faça o upload de uma imagem de tamanho adequado e insira seu URL aqui.\n\nVocê pode usar <code>$wgStylePath</code> ou <code>$wgScriptPath</code> se o seu logotipo for associado a esses diretórios.",
+    "config-instantcommons": "Habilite o Instant Commons",
+    "config-cc-again": "Escolha novamente...",
     "config-advanced-settings": "Configuração avançada",
     "config-extensions": "Extensões",
     "config-install-step-done": "feito",
+    "config-install-database": "Criando base de dados",
+    "config-install-user-missing-create": "O usuário especificado \" $1 \" não existe.\nPor favor, clique na opção de \"criar conta\" abaixo se você deseja criá-lo.",
+    "config-install-tables": "Criando tabelas",
+    "config-install-tables-exist": "'''Aviso''': As tabelas do MediaWiki parecem já existir.\nA criação das tabelas será pulada.",
+    "config-install-keys": "Gerando senhas secretas",
+    "config-install-sysop": "Criando conta de usuário administrador",
+    "config-install-subscribe-notpossible": "cURL não está instalada e allow_url_fopen não está disponível.",
+    "config-install-mainpage": "Criando página principal com o conteúdo padrão",
+    "config-install-extension-tables": "Criando tabelas para extensões habilitadas",
+    "config-install-mainpage-failed": "Não foi possível inserir a página principal: $1",
+    "config-install-done": "'''Parabéns!'''\nVocê concluiu a instalação do MediaWiki.\n\nO instalador gerou um arquivo <code>LocalSettings.php</code>.\nEste arquivo contém todas as configurações que você fez.\n\nVocê precisa fazer o download desse arquivo e colocá-lo no diretório de raiz da sua instalação (o mesmo diretório onde está o arquivo <code>index.php</code>). Este download deve ter sido iniciado automaticamente.\n\nSe o download não foi iniciado, ou se ele foi cancelado, pode recomeçá-lo clicando o link abaixo:\n\n$3\n\n'''Nota''': Se não fizer isto agora, o arquivo que foi gerado não estará disponível depois que você sair do processo de instalação sem salvá-lo.\n\nDepois de terminar o passo anterior, pode '''[$2 entrar no wiki]'''.",
+    "config-download-localsettings": "Download <code>LocalSettings.php</code>",
     "config-help": "ajuda",
+    "config-nofile": "O arquivo \"$1\" não pode ser encontrado. Este arquivo foi apagado?",
+    "config-extension-link": "Você sabia que seu wiki suporta [//www.mediawiki.org/wiki/Manual:Extensions extensões]?\n\nVocê pode explorar as  [//www.mediawiki.org/wiki/Category:Extensions_by_category extensões por categoria] ou visitar a [//www.mediawiki.org/wiki/Extension_Matrix Matriz de Extensões] para ver a lista completa.",
     "mainpagetext": "'''MediaWiki instalado com sucesso.'''",
     "mainpagedocfooter": "Consulte o [//meta.wikimedia.org/wiki/Help:Contents Manual de Usuário] para informações de como usar o software wiki.\n\n== Começando ==\n\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Lista de opções de configuração]\n* [//www.mediawiki.org/wiki/Manual:FAQ FAQ do MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lista de discussão com avisos de novas versões do MediaWiki]\n* [//www.mediawiki.org/wiki/Localisation#Translation_resources Traduza o MediaWiki para seu idioma]"
-}
\ No newline at end of file
+}
index 2a5164e..0c4e344 100644 (file)
@@ -9,23 +9,26 @@
             "SandroHc",
             "Waldir",
             "아라",
-            "555"
+            "555",
+            "Fúlvio",
+            "Giro720",
+            "Imperadeiro98"
         ]
     },
     "config-desc": "O instalador do MediaWiki",
-    "config-title": "Instalação MediaWiki $1",
+    "config-title": "Instalação do MediaWiki $1",
     "config-information": "Informação",
-    "config-localsettings-upgrade": "Foi detectado um ficheiro <code>LocalSettings.php</code>.\nPara atualizar esta instalação, por favor introduza o valor de <code>$wgUpgradeKey</code> na caixa abaixo.\nEncontra este valor no <code>LocalSettings.php</code>.",
-    "config-localsettings-cli-upgrade": "Foi detectada a existência de um ficheiro <code>LocalSettings.php</code>.\nPara atualizar esta instalação execute o <code>update.php</code>, por favor.",
+    "config-localsettings-upgrade": "Foi detectado um ficheiro <code>LocalSettings.php</code>.\nPara atualizar esta instalação, por favor introduza o valor de <code>$wgUpgradeKey</code> na caixa abaixo.\nEncontra este valor em <code>LocalSettings.php</code>.",
+    "config-localsettings-cli-upgrade": "Foi detectado um ficheiro <code>LocalSettings.php</code>.\nPara atualizar esta instalação, execute o <code>update.php</code>, por favor",
     "config-localsettings-key": "Chave de atualização:",
     "config-localsettings-badkey": "A chave que forneceu está incorreta.",
     "config-upgrade-key-missing": "Foi detectada uma instalação existente do MediaWiki.\nPara atualizar esta instalação, por favor coloque a seguinte linha no final do seu <code>LocalSettings.php</code>:\n\n$1",
     "config-localsettings-incomplete": "O ficheiro <code>LocalSettings.php</code> existente parece estar incompleto.\nA variável $1 não está definida.\nPor favor defina esta variável no <code>LocalSettings.php</code> e clique \"{{int:Config-continue}}\".",
-    "config-localsettings-connection-error": "Ocorreu um erro ao ligar à base de dados usando as configurações especificadas no <code>LocalSettings.php</code> ou <code>AdminSettings.php</code>. Por favor corrija essas configurações e tente novamente.\n\n$1",
+    "config-localsettings-connection-error": "Ocorreu um erro ao ligar à base de dados usando as configurações especificadas no <code>LocalSettings.php</code>. Por favor corrija essas configurações e tente novamente.\n\n$1",
     "config-session-error": "Erro ao iniciar a sessão: $1",
     "config-session-expired": "Os seus dados de sessão parecem ter expirado.\nAs sessões estão configuradas para uma duração de $1.\nPode aumentar esta duração configurando <code>session.gc_maxlifetime</code> no php.ini.\nReinicie o processo de instalação.",
     "config-no-session": "Os seus dados de sessão foram perdidos!\nVerifique o seu php.ini e certifique-se de que em <code>session.save_path</code> está definido um diretório apropriado.",
-    "config-your-language": "A sua língua:",
+    "config-your-language": "O seu idioma:",
     "config-your-language-help": "Selecione a língua que será usada durante o processo de instalação.",
     "config-wiki-language": "Língua da wiki:",
     "config-wiki-language-help": "Selecione a língua que será predominante na wiki.",
     "config-unicode-using-intl": "A usar a [http://pecl.php.net/intl extensão intl PECL] para a normalização Unicode.",
     "config-unicode-pure-php-warning": "'''Aviso''': A [http://pecl.php.net/intl extensão intl PECL] não está disponível para efetuar a normalização Unicode. Irá recorrer-se à implementação em PHP puro, que é mais lenta.\nSe o seu site tem alto volume de tráfego, devia informar-se um pouco sobre a [//www.mediawiki.org/wiki/Unicode_normalization_considerations/pt normalização Unicode].",
     "config-unicode-update-warning": "'''Aviso''': A versão instalada do wrapper de normalização Unicode usa uma versão mais antiga da biblioteca do [http://site.icu-project.org/ projeto ICU].\nDevia [//www.mediawiki.org/wiki/Unicode_normalization_considerations atualizá-la] se tem quaisquer preocupações sobre o uso do Unicode.",
-    "config-no-db": "Não foi possível encontrar um controlador ''(driver)'' apropriado para a base de dados! Precisa de instalar um controlador para o PHP. São aceites os seguintes tipos de base de dados: $1.\n\nSe usa alojamento partilhado, peça ao fornecedor do alojamento para instalar um controlador apropriado.\nSe foi você quem compilou o PHP, reconfigure-o com um cliente de base de dados ativado; por exemplo, usando <code>./configure --with-mysql</code>.\nSe instalou o PHP a partir de um pacote Debian ou Ubuntu, então precisa de instalar também o módulo php5-mysql.",
+    "config-no-db": "Não foi possível encontrar um controlador ''(driver)'' apropriado da base de dados! Precisa de instalar um controlador da base de dados para o PHP. São aceites os seguintes tipos de base de dados: $1.\n\nSe fez a compilação do PHP, reconfigure-o com um cliente de base de dados ativado; por exemplo, usando <code>./configure --with-mysql</code>.\nSe instalou o PHP a partir de um pacote Debian ou Ubuntu, então precisa de instalar também, por exemplo, o pacote <code>php5-mysql</code>.",
     "config-outdated-sqlite": "'''Aviso''': Tem a versão $1 do SQLite, que é anterior à versão mínima necessária, a $2. O SQLite não estará disponível.",
     "config-no-fts3": "'''Aviso''': O SQLite foi compilado sem o módulo [//sqlite.org/fts3.html FTS3]; as funcionalidades de pesquisa não estarão disponíveis nesta instalação.",
     "config-register-globals": "'''Aviso: A opção <code>[http://php.net/register_globals register_globals]</code> do PHP está ativada.'''\n'''Desative-a, se puder.'''\nO MediaWiki funciona mesmo assim, mas o seu servidor está exposto a potenciais vulnerabilidades de segurança.",
     "config-magic-quotes-runtime": "'''Fatal: A opção [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-runtime magic_quotes_runtime] está ativada!'''\nEsta opção causa corrupção dos dados de entrada, de uma forma imprevisível.\nNão pode instalar ou usar o MediaWiki a menos que esta opção seja desativada.",
     "config-magic-quotes-sybase": "'''Fatal: A opção [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-sybase magic_quotes_sybase] está ativada!'''\nEsta opção causa corrupção dos dados de entrada, de uma forma imprevisível.\nNão pode instalar ou usar o MediaWiki a menos que esta opção seja desativada.",
     "config-mbstring": "'''Fatal: A opção [http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload] está ativada!'''\nEsta opção causa erros e pode corromper os dados de uma forma imprevisível.\nNão pode instalar ou usar o MediaWiki a menos que esta opção seja desativada.",
-    "config-ze1": "'''Fatal: A opção [http://www.php.net/manual/en/ini.core.php zend.ze1_compatibility_mode] está ativada!'''\nEsta opção causa problemas significativos no MediaWiki.\nNão pode instalar ou usar o MediaWiki a menos que esta opção seja desativada.",
     "config-safe-mode": "'''Aviso:''' O [http://www.php.net/features.safe-mode safe mode] do PHP está ativo.\nEste modo pode causar problemas, especialmente no upload de ficheiros e no suporte a <code>math</code>.",
     "config-xml-bad": "Falta o módulo XML do PHP.\nO MediaWiki necessita de funções deste módulo e não funcionará com esta configuração.\nSe está a executar o Mandrake, instale o pacote php-xml.",
-    "config-pcre": "Parece faltar o módulo de suporte PCRE.\nPara funcionar, o MediaWiki necessita das funções de expressões regulares compatíveis com Perl.",
+    "config-pcre-old": "<strong>Fatal:</strong> É necessário o PCRE $1 ou versão posterior.\nO <i>link</i> do seu binário PHP foi feito com o PCRE $2.\n[https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/PCRE Mais informações].",
     "config-pcre-no-utf8": "'''Fatal''': O módulo PCRE do PHP parece ter sido compilado sem suporte PCRE_UTF8.\nO MediaWiki necessita do suporte UTF-8 para funcionar corretamente.",
     "config-memory-raised": "A configuração <code>memory_limit</code> do PHP era $1; foi aumentada para $2.",
     "config-memory-bad": "'''Aviso:''' A configuração <code>memory_limit</code> do PHP é $1.\nIsto é provavelmente demasiado baixo.\nA instalação poderá falhar!",
     "config-ctype": "'''Fatal''': O PHP tem de ser compilado com suporte para a [http://www.php.net/manual/en/ctype.installation.php extensão Ctype].",
+    "config-json": "<strong>Fatal:</strong> O PHP foi compilado sem suporte de JSON.\nTem de instalar a extensão JSON do PHP (incluída no PHP 5.2 ou posterior) ou a extensão [http://pecl.php.net/package/jsonc PECL jsonc] antes de instalar o MediaWiki.\n* A extensão JSON do PHP está incluída nas distribuções 5 e 6 do Red Hat Enterprise Linux (CentOS), mas tem de ser ativada nos ficheiros <code>/etc/php.ini</code> ou <code>/etc/php.d/json.ini</code>.\n* Algumas distribuições do Linux posteriores a maio de 2013 omitem a extensão JSON do PHP e substituem-na pela extensão PECL chamando-lhe <code>php5-json</code> ou <code>php-pecl-jsonc</code>.",
     "config-xcache": "[http://xcache.lighttpd.net/ XCache] instalada",
     "config-apc": "[http://www.php.net/apc APC] instalada",
     "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache] instalada",
     "config-no-cache": "'''Aviso:''' Não foi possível encontrar: [http://www.php.net/apc APC], [http://xcache.lighttpd.net/ XCache], nem [http://www.iis.net/download/WinCacheForPhp WinCache].\nA cache de objetos não está ativada.",
     "config-mod-security": "'''Aviso''': O seu servidor de internet tem o [http://modsecurity.org/ mod_security] ativado. Se este estiver mal configurado, pode causar problemas ao MediaWiki ou a outros programas, permitindo que os utilizadores publiquem conteúdos arbitrários.\nConsulte a [http://modsecurity.org/documentation/ mod_security documentação] ou peça apoio ao fornecedor do alojamento do seu servidor se encontrar erros aleatórios.",
     "config-diff3-bad": "O GNU diff3 não foi encontrado.",
+    "config-git": "Foi encontrado o software de controlo de versões Git: <code>$1</code>.",
+    "config-git-bad": "Não foi encontrado o software de controlo de versões Git.",
     "config-imagemagick": "Foi encontrado o ImageMagick: <code>$1</code>.\nSe possibilitar uploads, a miniaturização de imagens será ativada.",
     "config-gd": "Foi encontrada a biblioteca gráfica GD.\nSe possibilitar uploads, a miniaturização de imagens será ativada.",
     "config-no-scaling": "Não foi encontrada a biblioteca gráfica GD nem o ImageMagick.\nA miniaturização de imagens será desativada.",
     "config-no-uri": "'''Erro:''' Não foi possível determinar a URI atual.\nA instalação foi abortada.",
-    "config-no-cli-uri": "'''Aviso''':  Não foi especificado um --scriptpath; por omissão, será usado: <code>$1</code>.",
+    "config-no-cli-uri": "'''Aviso''':  Não foi especificado um <code>--scriptpath</code>; por omissão, será usado: <code>$1</code>.",
     "config-using-server": "Será usado o nome do servidor \"<nowiki>$1</nowiki>\".",
     "config-using-uri": "Será usada a URL do servidor \"<nowiki>$1$2</nowiki>\".",
     "config-uploads-not-safe": "'''Aviso:''' O diretório por omissão para uploads <code>$1</code>, está vulnerável à execução arbitrária de scripts.\nEmbora o MediaWiki verifique a existência de ameaças de segurança em todos os ficheiros enviados, é altamente recomendado que [//www.mediawiki.org/wiki/Manual:Security#Upload_security vede esta vulnerabilidade de segurança] antes de possibilitar uploads.",
     "config-no-cli-uploads-check": "'''Aviso:''' O diretório por omissão para uploads, <code>$1</code>, não é verificado para determinar se é vulnerável à execução de código arbitrário durante a instalação por CLI (\"Command-line Interface\").",
-    "config-brokenlibxml": "O seu sistema tem uma combinação de versões de PHP e libxml2 conhecida por ser problemática, podendo causar corrupção de dados no MediaWiki e outras aplicações da internet.\nAtualize para o PHP versão 5.2.9 ou posterior e libxml2 versão 2.7.3 ou posterior ([//bugs.php.net/bug.php?id=45996 incidência reportada no PHP]).\nInstalação interrompida.",
-    "config-using531": "O MediaWiki não pode ser usado com o PHP $1 devido a um problema que envolve parâmetros de referência para <code>__call()</code>.\nPara resolver este problema, atualize o PHP para a versão 5.3.2 ou posterior, ou reverta-o para a 5.3.0.\nInstalação interrompida.",
-    "config-suhosin-max-value-length": "O Suhosin está instalado e limita a $1 bytes o comprimento do parâmetro GET. O componente ResourceLoader do MediaWiki pode tornear este limite, mas prejudicando o desempenho. Se lhe for possível, deve atribuir o valor 1024 ou maior ao parâmetro <code>suhosin.get.max_value_length</code> no ficheiro <code>php.ini</code>, e definir o mesmo valor para <code>$wgResourceLoaderMaxQueryLength</code> no ficheiro LocalSettings.php.",
+    "config-brokenlibxml": "O seu sistema tem uma combinação de versões do PHP e do libxml2 conhecida por ser problemática, podendo causar corrupção de dados no MediaWiki e noutras aplicações da internet.\nAtualize para a versão 2.7.3 ou posterior do libxml2 ([https://bugs.php.net/bug.php?id=45996 incidência reportada no PHP]).\nInstalação cancelada.",
+    "config-suhosin-max-value-length": "O Suhosin está instalado e limita o parâmetro GET <code>length</code> a $1 bytes.\nO componente ResourceLoader do MediaWiki consegue exceder este limite, mas prejudicando o desempenho.\nSe lhe for possível, deve atribuir ao parâmetro <code>suhosin.get.max_value_length</code> o valor 1024 ou maior no ficheiro <code>php.ini</code>, e definir o mesmo valor para <code>$wgResourceLoaderMaxQueryLength</code> no ficheiro LocalSettings.php.",
     "config-db-type": "Tipo da base de dados:",
     "config-db-host": "Servidor da base de dados:",
     "config-db-host-help": "Se a base de dados estiver num servidor separado, introduza aqui o nome ou o endereço IP desse servidor.\n\nSe estiver a usar um servidor partilhado, o fornecedor do alojamento deve fornecer o nome do servidor na documentação.\n\nSe está a fazer a instalação num servidor Windows com MySQL, usar como nome do servidor \"localhost\" poderá não funcionar. Se não funcionar, tente usar \"127.0.0.1\" como endereço IP local.\n\nSe estiver a usar PostgreSQL, deixe este campo em branco para fazer a ligação através de um socket Unix.",
     "config-db-username": "Nome do utilizador da base de dados:",
     "config-db-password": "Palavra-chave do utilizador da base de dados:",
     "config-db-password-empty": "Introduza a palavra-chave do novo utilizador da base de dados: $1.\nEmbora seja possível criar utilizadores sem palavra-chave, fazê-lo não é seguro.",
+    "config-db-username-empty": "Tem de introduzir um valor para \"{{int:config-db-username}}\"",
     "config-db-install-username": "Introduza o nome de utilizador que será usado para aceder à base de dados durante o processo de instalação. Este utilizador não é o do MediaWiki; é o utilizador da base de dados.",
     "config-db-install-password": "Introduza a palavra-chave do utilizador que será usado para aceder à base de dados durante o processo de instalação. Esta palavra-chave não é a do utilizador do MediaWiki; é a palavra-chave do utilizador da base de dados.",
     "config-db-install-help": "Introduza o nome de utilizador e a palavra-chave que serão usados para aceder à base de dados durante o processo de instalação.",
     "config-sqlite-dir-help": "O SQLite armazena todos os dados num único ficheiro.\n\nDurante a instalação, o servidor de internet precisa de ter permissão de escrita no diretório que especificar.\n\nEste diretório '''não''' deve poder ser acedido diretamente da internet, por isso está a ser colocado onde estão os seus ficheiros PHP.\n\nJuntamente com o diretório, o instalador irá criar um ficheiro <code>.htaccess</code>, mas se esta operação falhar é possível que alguém venha a ter acesso direto à base de dados.\nIsto inclui acesso aos dados dos utilizadores (endereços de correio eletrónico, palavras-chave encriptadas), às revisões eliminadas e a outros dados de acesso restrito na wiki.\n\nConsidere colocar a base de dados num local completamente diferente, como, por exemplo, em <code>/var/lib/mediawiki/asuawiki</code>.",
     "config-oracle-def-ts": "Tablespace padrão:",
     "config-oracle-temp-ts": "Tablespace temporário:",
-    "config-type-mysql": "MySQL",
+    "config-type-mysql": "MySQL (ou compatível)",
     "config-type-postgres": "PostgreSQL",
     "config-type-sqlite": "SQLite",
     "config-type-oracle": "Oracle",
+    "config-type-mssql": "Microsoft SQL Server",
     "config-support-info": "O MediaWiki suporta as seguintes plataformas de base de dados:\n\n$1\n\nSe a plataforma que pretende usar não está listada abaixo, siga as instruções nos links acima para ativar o suporte.",
-    "config-support-mysql": "* $1 é a plataforma primária do MediaWiki e a melhor suportada ([http://www.php.net/manual/en/mysql.installation.php como compilar PHP com suporte MySQL])",
-    "config-support-postgres": "* $1 é uma plataforma de base de dados comum, de fonte aberta, alternativa ao MySQL ([http://www.php.net/manual/en/pgsql.installation.php como compilar PHP com suporte PostgreSQL]). Poderão existir alguns pequenos problemas e não é recomendado o seu uso em ambientes de exploração/produção.",
-    "config-support-sqlite": "* $1 é uma plataforma de base de dados ligeira muito bem suportada. ([http://www.php.net/manual/en/pdo.installation.php Como compilar PHP com suporte SQLite], usa PDO)",
-    "config-support-oracle": "* $1 é uma base de dados de uma empresa comercial. ([http://www.php.net/manual/en/oci8.installation.php How to compile PHP with OCI8 support])",
+    "config-dbsupport-mysql": "* [{{int:version-db-mysql-url}} MySQL] é a plataforma primária do MediaWiki e é a melhor suportada. O MediaWiki também trabalha com [{{int:version-db-mariadb-url}} MariaDB] e [{{int:version-db-percona-url}} Percona Server], que são compatíveis com MySQL. ([http://www.php.net/manual/en/mysql.installation.php Como compilar PHP com suporte a MySQL])",
+    "config-dbsupport-postgres": "* O [{{int:version-db-postgres-url}} PostgreSQL] é uma plataforma popular de base de dados de fonte aberta, alternativa ao MySQL. Poderá conter pequenos defeitos e o seu uso em ambientes de exploração/produção não é recomendado. ([http://www.php.net/manual/en/pgsql.installation.php Como compilar o PHP com suporte PostgreSQL])",
+    "config-dbsupport-sqlite": "* O [{{int:version-db-sqlite-url}} SQLite] é uma plataforma de base de dados ligeira muito bem suportada. ([http://www.php.net/manual/en/pdo.installation.php Como compilar o PHP com suporte SQLite], usa PDO)",
+    "config-dbsupport-oracle": "* [{{int:version-db-oracle-url}} Oracle] é uma base de dados comercial para empresas. ([http://www.php.net/manual/en/oci8.installation.php Como compilar o PHP com suporte OCI8])",
+    "config-dbsupport-mssql": "* O [{{int:version-db-mssql-url}} Microsoft SQL Server] é uma base de dados comercial do Windows para empresas. ([http://www.php.net/manual/en/sqlsrv.installation.php Como compilar o PHP com suporte SQLSRV])",
     "config-header-mysql": "Definições MySQL",
     "config-header-postgres": "Definições PostgreSQL",
     "config-header-sqlite": "Definições SQLite",
     "config-header-oracle": "Definições Oracle",
+    "config-header-mssql": "Configurações do Microsoft SQL Server",
     "config-invalid-db-type": "O tipo de base de dados é inválido",
-    "config-missing-db-name": "Tem de introduzir um valor para \"Nome da base de dados\"",
-    "config-missing-db-host": "Tem de introduzir um valor para \"Servidor da base de dados\"",
-    "config-missing-db-server-oracle": "Tem de introduzir um valor para \"TNS da base de dados\"",
-    "config-invalid-db-server-oracle": "O TNS da base de dados, \"$1\", é inválido.\nUse só letras (a-z, A-Z), algarismos (0-9), sublinhados (_) e pontos (.) dos caracteres ASCII.",
+    "config-missing-db-name": "Tem de introduzir um valor para \"{{int:config-db-name}}\".",
+    "config-missing-db-host": "Tem de introduzir um valor para \"{{int:config-db-host}}\".",
+    "config-missing-db-server-oracle": "Tem de introduzir um valor para \"{{int:config-db-host-oracle}}\".",
+    "config-invalid-db-server-oracle": "O TNS da base de dados, \"$1\", é inválido.\nUse \"TNS Name\" ou o método \"Easy Connect\" ([http://docs.oracle.com/cd/E11882_01/network.112/e10836/naming.htm Métodos de Configuração da Conectividade em Oracle])",
     "config-invalid-db-name": "O nome da base de dados, \"$1\",  é inválido.\nUse só letras (a-z, A-Z), algarismos (0-9), sublinhados (_) e hífens (-) dos caracteres ASCII.",
     "config-invalid-db-prefix": "O prefixo da base de dados, \"$1\",  é inválido.\nUse só letras (a-z, A-Z), algarismos (0-9), sublinhados (_) e hífens (-) dos caracteres ASCII.",
     "config-connection-error": "$1.\n\nVerifique o servidor, o nome do utilizador e a palavra-chave abaixo e tente novamente.",
     "config-db-sys-create-oracle": "O instalador só permite criar uma conta nova usando uma conta SYSDBA.",
     "config-db-sys-user-exists-oracle": "A conta \"$1\" já existe. A conta SYSDBA só pode criar uma conta nova!",
     "config-postgres-old": "É necessário o PostgreSQL $1 ou posterior; tem a versão $2.",
+    "config-mssql-old": "É necessário o Microsoft SQL Server $1 ou posterior. Tem a versão $2.",
     "config-sqlite-name-help": "Escolha o nome que identificará a sua wiki.\nNão use espaços ou hífens.\nEste nome será usado como nome do ficheiro de dados do SQLite.",
     "config-sqlite-parent-unwritable-group": "Não é possível criar o diretório de dados <code><nowiki>$1</nowiki></code>, porque o servidor de internet não tem permissão de escrita no diretório que o contém <code><nowiki>$2</nowiki></code>.\n\nO instalador determinou em que nome de utilizador o seu servidor de internet está a correr.\nPara continuar, configure o diretório <code><nowiki>$3</nowiki></code> para poder ser escrito por este utilizador.\nPara fazê-lo em sistemas Unix ou Linux, use:\n\n<pre>cd $2\nmkdir $3\nchgrp $4 $3\nchmod g+w $3</pre>",
     "config-sqlite-parent-unwritable-nogroup": "Não é possível criar o diretório de dados <code><nowiki>$1</nowiki></code>, porque o servidor de internet não tem permissão de escrita no diretório que o contém <code><nowiki>$2</nowiki></code>.\n\nNão foi possível determinar em que nome de utilizador o seu servidor de internet está a correr.\nPara continuar, configure o diretório <code><nowiki>$3</nowiki></code> para que este possa ser globalmente escrito por esse utilizador (e por outros!).\nPara fazê-lo em sistemas Unix ou Linux, use:\n\n<pre>cd $2\nmkdir $3\nchmod a+w $3</pre>",
     "config-mysql-engine": "Motor de armazenamento:",
     "config-mysql-innodb": "InnoDB",
     "config-mysql-myisam": "MyISAM",
-    "config-mysql-myisam-dep": "'''Aviso''': Selecionou o MyISAM para motor de armazenamento do MySQL, uma combinação desaconselhada para usar com o MediaWiki porque:\n* praticamente não permite acessos simultâneos, devido aos bloqueios de tabelas\n* o MyISAM é mais suscetível a perdas da integridade dos dados do que outros motores\n* o código do MediaWiki não trabalha devidamente com o MyISAM\n\nSe a sua instalação do MySQL suporta InnoDB, é altamente recomendado que o escolha em vez do MyISAM.\nSe não suporta o InnoDB, talvez esta seja uma boa altura para fazer a atualização para a versão mais recente do MySQL.",
-    "config-mysql-engine-help": "'''InnoDB''' é quase sempre a melhor opção, porque suporta bem acessos simultâneos ''(concurrency)''.\n\n'''MyISAM''' pode ser mais rápido no modo de utilizador único ou em instalações somente para leitura.\nAs bases de dados MyISAM tendem a ficar corrompidas com maior frequência do que as bases de dados InnoDB.",
+    "config-mysql-myisam-dep": "<strong>Aviso:</strong>  Selecionou o MyISAM para motor de armazenamento do MySQL, uma combinação desaconselhada para usar com o MediaWiki porque:\n* praticamente não permite acessos simultâneos, porque bloqueia tabelas\n* o MyISAM é mais suscetível a perdas da integridade dos dados do que outros motores\n* o código do MediaWiki não trabalha devidamente com o MyISAM\n\nSe a sua instalação do MySQL suporta InnoDB, é altamente recomendado que o escolha em vez do MyISAM.\nSe não suporta o InnoDB, talvez seja uma boa altura para atualizá-la para a versão mais recente.",
+    "config-mysql-only-myisam-dep": "<strong>Aviso:</strong> O único motor de armazenamento para MySQL nesta máquina é o MyISAM e o seu uso com o MediaWiki não é recomendado porque:\n* praticamente não suporta acessos simultâneos, porque bloqueia tabelas\n* o MyISAM é mais suscetível a perdas da integridade dos dados do que outros motores\n* o código do MediaWiki não trabalha devidamente com o MyISAM\n\nA sua instalação MySQL não suporta InnoDB, talvez seja uma boa altura para atualizá-la para a versão mais recente.",
+    "config-mysql-engine-help": "<strong>InnoDB</strong> é quase sempre a melhor opção, porque suporta bem acessos simultâneos <i>(concurrency)</i>.\n\n<strong>MyISAM</strong> pode ser mais rápido no modo de utilizador único ou em instalações somente para leitura.\nAs bases de dados MyISAM tendem a perder integridade de dados com mais frequência do que as bases de dados InnoDB.",
     "config-mysql-charset": "Conjunto de caracteres da base de dados:",
     "config-mysql-binary": "Binary",
     "config-mysql-utf8": "UTF-8",
     "config-mysql-charset-help": "No modo '''binary''' (\"binário\"), o MediaWiki armazena o texto UTF-8 na base de dados em campos binários.\nIsto é mais eficiente do que o modo UTF-8 do MySQL e permite que sejam usados todos os caracteres Unicode.\n\nNo modo '''UTF-8''', o MySQL saberá em que conjunto de caracteres os seus dados estão e pode apresentá-los e convertê-los da forma mais adequada,\nmas não lhe permitirá armazenar caracteres acima do [//en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes Plano Multilingue Básico].",
+    "config-mssql-auth": "Tipo de autenticação:",
+    "config-mssql-install-auth": "Selecione o tipo de autenticação a usar para ligar à base de dados durante o processo de instalação.\nSe selecionar \"{{int:config-mssql-windowsauth}}\", serão usadas as credenciais do utilizador com que o servidor de Internet está a ser executado.",
+    "config-mssql-web-auth": "Selecione o tipo de autenticação que o servidor de Internet irá usar para se ligar ao servidor da base de dados durante a operação normal da wiki.\nSe selecionar \"{{int:config-mssql-windowsauth}}\", serão usadas as credenciais do utilizador com que o servidor de Internet está a ser executado.",
+    "config-mssql-sqlauth": "Autenticação do SQL Server",
+    "config-mssql-windowsauth": "Autenticação do Windows",
     "config-site-name": "Nome da wiki:",
     "config-site-name-help": "Este nome aparecerá no título da janela do seu browser e em vários outros sítios.",
     "config-site-name-blank": "Introduza o nome do site.",
     "config-ns-invalid": "O espaço nominal especificado \"<nowiki>$1</nowiki>\" é inválido.\nIntroduza um espaço nominal de projeto diferente.",
     "config-ns-conflict": "O espaço nominal que especificou, \"<nowiki>$1</nowiki>\", cria um conflito com um dos espaços nominais padrão do MediaWiki.\nEspecifique um espaço nominal do projeto diferente.",
     "config-admin-box": "Conta de administrador",
-    "config-admin-name": "O seu nome:",
+    "config-admin-name": "Seu nome de utilizador:",
     "config-admin-password": "Palavra-chave:",
     "config-admin-password-confirm": "Repita a palavra-chave:",
     "config-admin-help": "Introduza aqui o seu nome de utilizador preferido, por exemplo, \"João Beltrão\".\nEste é o nome que irá utilizar para entrar na wiki.",
     "config-admin-name-blank": "Introduza um nome de utilizador para administrador.",
     "config-admin-name-invalid": "O nome de utilizador especificado \"<nowiki>$1</nowiki>\" é inválido.\nIntroduza um nome de utilizador diferente.",
     "config-admin-password-blank": "Introduza uma palavra-chave para a conta de administrador.",
-    "config-admin-password-same": "A palavra-chave tem de ser diferente do nome de utilizador.",
     "config-admin-password-mismatch": "As duas palavras-chave que introduziu não coincidem.",
     "config-admin-email": "Correio electrónico:",
     "config-admin-email-help": "Introduza aqui um correio electrónico que lhe permita receber mensagens de outros utilizadores da wiki, reiniciar a sua palavra-chave e receber notificações de alterações às suas páginas vigiadas. Pode deixar o campo vazio.",
     "config-optional-continue": "Faz-me mais perguntas.",
     "config-optional-skip": "Já estou aborrecido, instala lá a wiki.",
     "config-profile": "Perfil de permissões:",
-    "config-profile-wiki": "Wiki tradicional",
+    "config-profile-wiki": "Wiki aberta",
     "config-profile-no-anon": "Criação de conta exigida",
     "config-profile-fishbowl": "Somente utilizadores autorizados",
     "config-profile-private": "Wiki privada",
     "config-extensions": "Extensões",
     "config-extensions-help": "Foi detectada a existência das extensões listadas acima, no seu diretório <code>./extensions</code>.\n\nEstas talvez necessitem de configurações adicionais, mas pode ativá-las agora",
     "config-install-alreadydone": "'''Aviso:''' Parece que já instalou o MediaWiki e está a tentar instalá-lo novamente.\nPasse para a próxima página, por favor.",
-    "config-install-begin": "Ao clicar \"{{int:config-continue}}\", vai iniciar a instalação do MediaWiki.\nSe quiser fazer mais alterações, clique Voltar.",
+    "config-install-begin": "Ao clicar \"{{int:config-continue}}\", vai iniciar a instalação do MediaWiki.\nSe quiser fazer mais alterações, clique \"{{int:config-back}}\".",
     "config-install-step-done": "terminado",
     "config-install-step-failed": "falhou",
     "config-install-extensions": "A incluir as extensões",
     "config-download-localsettings": "Download do <code>LocalSettings.php</code>",
     "config-help": "ajuda",
     "config-nofile": "Não foi possível encontrar o ficheiro \"$1\". Terá sido apagado?",
+    "config-extension-link": "Sabia que a sua wiki suporta [//www.mediawiki.org/wiki/Manual:Extensions extensões]?\n\nPode navegar as [//www.mediawiki.org/wiki/Category:Extensions_by_category extensões por categoria] ou a [//www.mediawiki.org/wiki/Extension_Matrix Matriz de Extensões] para ver a lista completa.",
     "mainpagetext": "'''MediaWiki instalado com sucesso.'''",
-    "mainpagedocfooter": "Consulte o [//meta.wikimedia.org/wiki/Help:Contents Guia de Utilizadores] para informações sobre o uso do software wiki.\n\n== Onde começar ==\n\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Lista de opções de configuração]\n* [//www.mediawiki.org/wiki/Manual:FAQ Perguntas e respostas frequentes sobre o MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Subscreva a lista de divulgação de novas versões do MediaWiki]"
-}
\ No newline at end of file
+    "mainpagedocfooter": "Consulte o [//meta.wikimedia.org/wiki/Help:Contents Guia de Utilizadores] para informações sobre o uso do software wiki.\n\n== Onde começar ==\n\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Lista de opções de configuração]\n* [//www.mediawiki.org/wiki/Manual:FAQ Perguntas e respostas frequentes sobre o MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Subscreva a lista de divulgação de novas versões do MediaWiki]\n* [//www.mediawiki.org/wiki/Localisation#Translation_resources Regionalize MediaWiki para seu idioma]"
+}
index 0663853..f4fd6c3 100644 (file)
@@ -16,7 +16,8 @@
             "Shirayuki",
             "Siebrand",
             "Umherirrender",
-            "Waldir"
+            "Waldir",
+            "Jdforrester"
         ]
     },
     "config-desc": "Short description of the installer.",
     "config-information": "{{Identical|Information}}",
     "config-localsettings-upgrade": "{{doc-important|Do not translate <code>LocalSettings.php</code> and <code>$wgUpgradeKey</code>.}}",
     "config-localsettings-cli-upgrade": "{{doc-important|Do not translate the <code>LocalSettings.php</code> and the <code>update.php</code> parts.}}",
+    "config-localsettings-key": "Label for the upgrade key that confirms a user upgrading through the web UI has access to LocalSettings.php. Details at https://www.mediawiki.org/wiki/Manual:Upgrading#Web_browser.",
+    "config-localsettings-badkey": "Error message when an incorrect upgrade key has been provided while trying to upgrade.",
     "config-upgrade-key-missing": "Used in info box. Parameters:\n* $1 - the upgrade key, enclosed in <code><nowiki><pre></nowikI></code> tag.",
     "config-localsettings-incomplete": "{{doc-important|Do not translate <code>LocalSettings.php</code> and <code><nowiki>{{int:Config-continue}}</nowiki><code>.}}\nParameters:\n* $1 - name of variable (any one of required variables or installer-specific global variables)",
     "config-localsettings-connection-error": "{{doc-important|Do not translate <code>LocalSettings.php</code>.}}\nUsed as error message. Parameters:\n* $1 - (probably empty string)",
     "config-session-error": "Parameters:\n* $1 is the error that was encountered with the session.",
     "config-session-expired": "Parameters:\n* $1 is the configured session lifetime.",
     "config-no-session": "{{doc-important|Do not translate <code>php.ini</code> and <code>session.save_path</code>.}}\nUsed as error message.",
+    "config-your-language": "Label in MediaWiki installer followed by a drop down where a user can select the language to use for the installer.",
+    "config-your-language-help": "Prompt for which language messages should be displayed in during the installation.",
+    "config-wiki-language": "Prompt for the language the wiki should be set to.",
+    "config-wiki-language-help": "Prompt for the language the wiki's content should be set to.",
     "config-back": "{{Identical|Back}}",
     "config-continue": "{{Identical|Continue}}",
     "config-page-language": "{{Identical|Language}}",
+    "config-page-welcome": "Page header in MediaWiki installer.",
+    "config-page-dbconnect": "Page header in MediaWiki installer.",
+    "config-page-upgrade": "Page header in MediaWiki installer.",
+    "config-page-dbsettings": "Page header in MediaWiki installer.",
     "config-page-name": "{{Identical|Name}}",
     "config-page-options": "{{Identical|Options}}",
     "config-page-install": "{{Identical|Install}}",
     "config-page-complete": "{{Identical|Complete}}",
+    "config-page-restart": "Page header in MediaWiki installer.",
+    "config-page-readme": "Page header in MediaWiki installer.",
     "config-page-releasenotes": "{{Identical|Release notes}}",
     "config-page-copying": "This is a link to the full GPL text",
+    "config-page-upgradedoc": "Page header in MediaWiki installer.",
+    "config-page-existingwiki": "Page header in MediaWiki installer.",
+    "config-help-restart": "Message in warning box in MediaWiki installer.",
     "config-restart": "Button text to confirm the installation procedure has to be restarted.",
+    "config-welcome": "Notice that the installer is about to check as to whether MediaWiki can be installed.",
     "config-copyright": "This message follows {{msg-mw|config-env-good}}.\n\nParameters:\n* $1 - copyright and author list",
     "config-sidebar": "Maximum width for words is 24 characters. Only visible part of the translation counts to this limit.",
+    "config-env-good": "See also:\n* {{msg-mw|Config-env-bad}}",
+    "config-env-bad": "See also:\n* {{msg-mw|Config-env-good}}",
     "config-env-php": "Parameters:\n* $1 - the version of PHP that has been installed\nSee also:\n* {{msg-mw|config-env-php-toolow}}",
     "config-env-php-toolow": "Parameters:\n* $1 - the version of PHP that has been installed\n* $2 - minimum PHP version number\nSee also:\n* {{msg-mw|config-env-php}}",
+    "config-unicode-using-utf8": "Status message in the MediaWiki installer environment checks.",
+    "config-unicode-using-intl": "Status message in the MediaWiki installer environment checks.",
     "config-unicode-pure-php-warning": "PECL is the name of a group producing standard pieces of software for PHP, and intl is the name of their library handling some aspects of internationalization.",
     "config-unicode-update-warning": "ICU is a body producing standard software tools for support of Unicode and other internationalization aspects. This message warns the system administrator installing MediaWiki that the server's software is not up-to-date and MediaWiki will have problems handling some characters.",
     "config-no-db": "{{doc-important|Do not translate \"<code>./configure --with-mysqli</code>\" and \"<code>php5-mysql</code>\".}}\nParameters:\n* $1 is comma separated list of database types supported by MediaWiki.",
     "config-outdated-sqlite": "Used as warning. Parameters:\n* $1 - the version of SQLite that has been installed\n* $2 - minimum version",
     "config-no-fts3": "A \"[[:wikipedia:Front and back ends|backend]]\" is a system or component that ordinary users don't interact with directly and don't need to know about, and that is responsible for a distinct task or service - for example, a storage back-end is a generic system for storing data which other applications can use. Possible alternatives for back-end are \"system\" or \"service\", or (depending on context and language) even leave it untranslated.",
+    "config-register-globals": "Status message in the MediaWiki installer environment checks.",
     "config-magic-quotes-runtime": "{{Related|Config-fatal}}",
     "config-magic-quotes-sybase": "{{Related|Config-fatal}}",
     "config-mbstring": "{{Related|Config-fatal}}",
-    "config-ze1": "{{Related|Config-fatal}}",
-    "config-pcre": "PCRE is an initialism for \"Perl-compatible regular expression\". Perl is programming language whose [[:w:regular expression|regular expression]] syntax is popular and used in other languages using a library called PCRE.",
+    "config-safe-mode": "Status message in the MediaWiki installer environment checks.",
+    "config-xml-bad": "Status message in the MediaWiki installer environment checks.",
     "config-pcre-old": "Parameters:\n* $1 - minimum PCRE version number\n* $2 - the installed version of [[wikipedia:PCRE|PCRE]]\n{{Related|Config-fatal}}",
     "config-pcre-no-utf8": "PCRE is a name of a programmers' library for supporting regular expressions. It can probably be translated without change.\n{{Related|Config-fatal}}",
     "config-memory-raised": "Parameters:\n* $1 is the configured <code>memory_limit</code>.\n* $2 is the value to which <code>memory_limit</code> was raised.",
     "config-memory-bad": "Parameters:\n* $1 is the configured <code>memory_limit</code>.",
-    "config-ctype": "Message if support for [http://www.php.net/manual/en/ctype.installation.php Ctype] is missing from PHP",
-    "config-json": "Message if support for [[wikipedia:JSON|JSON]] is missing from PHP.\n* \"[[wikipedia:Red Hat Enterprise Linux|Red Hat Enterprise Linux]]\" (RHEL) and \"[[wikipedia:CentOS|CentOS]]\" refer to two almost-identical Linux distributions. \"5 and 6\" refers to version 5 or 6 of either distribution. Because RHEL 7 likely will not include the PHP extension, do not translate as \"5 or newer\".\n* \"The [http://www.php.net/json PHP extension]\" is the JSON extension included with PHP 5.2 and newer.\n* \"The [http://pecl.php.net/package/jsonc PECL extension]\" is based on the PHP extension, though excludes code some distributions have found unacceptable (see [[bugzilla:47431]]).",
+    "config-ctype": "Message if support for [http://www.php.net/manual/en/ctype.installation.php Ctype] is missing from PHP.\n{{Related|Config-fatal}}",
+    "config-json": "Message if support for [[wikipedia:JSON|JSON]] is missing from PHP.\n* \"[[wikipedia:Red Hat Enterprise Linux|Red Hat Enterprise Linux]]\" (RHEL) and \"[[wikipedia:CentOS|CentOS]]\" refer to two almost-identical Linux distributions. \"5 and 6\" refers to version 5 or 6 of either distribution. Because RHEL 7 likely will not include the PHP extension, do not translate as \"5 or newer\".\n* \"The [http://www.php.net/json PHP extension]\" is the JSON extension included with PHP 5.2 and newer.\n* \"The [http://pecl.php.net/package/jsonc PECL extension]\" is based on the PHP extension, though excludes code some distributions have found unacceptable (see [[bugzilla:47431]]).\n{{Related|Config-fatal}}",
     "config-xcache": "Message indicates if this program is available",
     "config-apc": "Message indicates if this program is available",
     "config-wincache": "Message indicates if this program is available",
+    "config-no-cache": "Status message in the MediaWiki installer environment checks.",
+    "config-mod-security": "Status message in the MediaWiki installer environment checks.",
+    "config-diff3-bad": "Status message in the MediaWiki installer environment checks.",
     "config-git": "Message if Git version control software is available.\nParameter:\n* $1 is the <code>Git</code> executable file name.",
     "config-git-bad": "Message if Git version control software is not found.",
     "config-imagemagick": "$1 is ImageMagick's <code>convert</code> executable file name.\n\nAdd dir=\"ltr\" to the <nowiki><code></nowiki> for right-to-left languages.",
-    "config-no-cli-uri": "Parameters:\n* $1 is the default value for scriptpath.",
+    "config-gd": "Status message in the MediaWiki installer environment checks.",
+    "config-no-scaling": "Status message in the MediaWiki installer environment checks.",
+    "config-no-uri": "Status message in the MediaWiki installer environment checks.",
+    "config-no-cli-uri": "Parameters:\n* $1 is the default value for scriptpath.\n\nDo not translate <nowiki><code>--scriptpath</code></nowiki>",
     "config-using-server": "Used as a part of environment check result. Parameters:\n* $1 - default server name",
     "config-using-uri": "Used as a part of environment check result. Parameters:\n* $1 - server name\n* $2 - script path",
     "config-uploads-not-safe": "Used as a part of environment check result. Parameters:\n* $1 - name of directory for images: <code>$IP/images/</code>",
     "config-no-cli-uploads-check": "CLI = [[w:Command-line interface|command-line interface]] (i.e. the installer runs as a command-line script, not using HTML interface via an internet browser)",
-    "config-using531": "Used as error message. Parameters:\n* $1 - the version of PHP that has been installed",
+    "config-brokenlibxml": "Status message in the MediaWiki installer environment checks.",
     "config-suhosin-max-value-length": "{{doc-important|Do not translate \"length\", \"suhosin.get.max_value_length\", \"php.ini\", \"$wgResourceLoaderMaxQueryLength\" and \"LocalSettings.php\".}}\nMessage shown when PHP parameter <code>suhosin.get.max_value_length</code> is between 0 and 1023 (that max value is hard set in MediaWiki software).",
+    "config-db-type": "Field label in the MediaWiki installer followed by possible database types.",
+    "config-db-host": "Used as label.\n\nAlso used in {{msg-mw|Config-missing-db-host}}.",
     "config-db-host-help": "{{doc-singularthey}}",
-    "config-db-host-oracle": "TNS = [[:wikipedia:Transparent Network Substrate|Transparent Network Substrate]] (<== wikipedia link)",
+    "config-db-host-oracle": "TNS = [[w:Transparent Network Substrate]].\n\nUsed as label.\n\nAlso used in {{msg-mw|Config-missing-db-server-oracle}}.",
     "config-db-host-oracle-help": "See also:\n* {{msg-mw|Config-invalid-db-server-oracle}}",
     "config-db-wiki-settings": "This is more acurate: \"Enter identifying or distinguishing data for this wiki\" since a MySQL database can host tables of several wikis.",
+    "config-db-name": "Used as label.\n\nAlso used in {{msg-mw|Config-missing-db-name}}.\n{{Identical|Database name}}",
+    "config-db-name-help": "Help box text in the MediaWiki installer.",
+    "config-db-name-oracle": "Field label in the MediaWiki installer where an Oracle database schema can be specified.",
     "config-db-account-oracle-warn": "A \"[[:wikipedia:Front and back ends|backend]]\" is a system or component that ordinary users don't interact with directly and don't need to know about, and that is responsible for a distinct task or service - for example, a storage back-end is a generic system for storing data which other applications can use. Possible alternatives for back-end are \"system\" or \"service\", or (depending on context and language) even leave it untranslated.",
+    "config-db-install-account": "Legend in the MediaWiki installer for the section where database username and password have to be provided.",
+    "config-db-username": "Used as label.\n\nAlso used in {{msg-mw|Config-db-username-empty}}.",
+    "config-db-password": "Field label in the MediaWiki installer where database password has to be provided.",
     "config-db-password-empty": "Used as error message. Parameters:\n* $1 - database username",
+    "config-db-username-empty": "Used as error message. Shown when the database username is not entered by the user.\n\nRefers to {{msg-mw|Config-db-username}}.",
+    "config-db-install-username": "Help box text in the MediaWiki installer clarifying the requirement for database username.",
+    "config-db-install-password": "Help box text in the MediaWiki installer clarifying the requirement for database password.",
+    "config-db-install-help": "Help text in MediaWiki installer.",
     "config-db-account-lock": "It might be easier to translate ''normal operation'' as \"also after the installation process\"",
-    "config-mysql-old": "Used as error message. Parameters:\n* $1 - minimum version\n* $2 - the version of MySQL that has been installed",
-    "config-pg-test-error": "* $1 - database name\n* $2 - error message",
+    "config-db-wiki-account": "Fieldset label for database user information.",
+    "config-db-wiki-help": "Help text for database user information.",
+    "config-db-prefix": "Field label for database prefix (a piece of text that all tables for a MediaWiki instance are prefixed with).",
+    "config-db-prefix-help": "Help text for database prefix form field.",
+    "config-db-charset": "Fieldset label for MySQL database character set choice.",
+    "config-charset-mysql5-binary": "Option for MySQL database character set choice.",
+    "config-charset-mysql5": "Option for MySQL database character set choice.",
+    "config-charset-mysql4": "Option for MySQL database character set choice.",
+    "config-charset-help": "Help text for database character set.",
+    "config-mysql-old": "Used as error message. Parameters:\n* $1 - minimum version\n* $2 - the version of MySQL that has been installed\n{{Related|Config-old}}",
+    "config-db-port": "Field label in MediaWiki installer for database port.",
+    "config-db-schema": "Field label in MediaWiki installer for database schema.",
+    "config-db-schema-help": "Help text in MediaWiki installer for database schema.",
+    "config-pg-test-error": "Parameters:\n* $1 - database name\n* $2 - error message",
+    "config-sqlite-dir": "Field label for a folder location.",
     "config-sqlite-dir-help": "{{doc-important|Do not translate <code>.htaccess</code> and <code>/var/lib/mediawiki/yourwiki</code>.}}\nUsed in help box.",
+    "config-oracle-def-ts": "Field label for an Oracle default tablespace.",
+    "config-oracle-temp-ts": "Field label for an Oracle temporary tablespace.",
     "config-type-mysql": "\"Or compatible\" refers to several database systems that are compatible with MySQL, as explained in {{msg-mw|config-dbsupport-mysql}}, and thus also work with this choice of database type.",
     "config-type-postgres": "{{optional}}",
     "config-type-sqlite": "{{optional}}",
     "config-type-oracle": "{{optional}}",
     "config-type-mssql": "{{optional}}",
+    "config-support-info": "Parameters:\n* $1 - a list of DBMSs that MediaWiki supports, composed with config-dbsupport-* messages.\nSee also:\n* {{msg-mw|Config-dbsupport-mysql}}\n* {{msg-mw|Config-dbsupport-postgres}}\n* {{msg-mw|Config-dbsupport-oracle}}\n* {{msg-mw|Config-dbsupport-sqlite}}\n* {{msg-mw|Config-dbsupport-mssql}}",
+    "config-dbsupport-mysql": "Used in:\n* {{msg-mw|config-support-info}}\n{{Related|Config-dbsupport}}",
+    "config-dbsupport-postgres": "Used in:\n* {{msg-mw|config-support-info}}\n{{Related|Config-dbsupport}}",
+    "config-dbsupport-sqlite": "Used in:\n* {{msg-mw|config-support-info}}\n{{Related|Config-dbsupport}}",
+    "config-dbsupport-oracle": "Used in:\n* {{msg-mw|Config-support-info}}.\n{{Related|Config-dbsupport}}",
+    "config-dbsupport-mssql": "Used in:\n* {{msg-mw|Config-support-info}}\n{{Related|Config-dbsupport}}",
+    "config-header-mysql": "Header for MySQL database settings in the MediaWiki installer.",
+    "config-header-postgres": "Header for PostgreSQL database settings in the MediaWiki installer.",
+    "config-header-sqlite": "Header for SQLite database settings in the MediaWiki installer.",
+    "config-header-oracle": "Header for Oracle database settings in the MediaWiki installer.",
     "config-header-mssql": "Used as a section heading on the installer form, inside of a fieldset",
-    "config-support-info": "Parameters:\n* $1 - a list of DBMSs that MediaWiki supports, composed with config-dbsupport-* messages.",
-    "config-support-mysql": "Parameters:\n* $1 - a link to the MySQL home page having the anchor text \"MySQL\".",
-    "config-support-postgres": "Parameters:\n* $1 - a link to the PostgreSQL home page having the anchor text \"PostgreSQL\".",
-    "config-support-sqlite": "Parameters:\n* $1 - a link to the SQLite home page having the anchor text \"SQLite\".",
-    "config-support-oracle": "Parameters:\n* $1 - a link to the Oracle home page, the anchor text of which is \"Oracle\".",
-    "config-dbsupport-mysql": "Used in {{msg-mw|config-support-info}}.",
-    "config-dbsupport-postgres": "Used in {{msg-mw|config-support-info}}.",
-    "config-dbsupport-sqlite": "Used in {{msg-mw|config-support-info}}.",
-    "config-dbsupport-oracle": "Used in {{msg-mw|config-support-info}}.",
+    "config-invalid-db-type": "Error message in MediaWiki installer when an invalid database type has been provided.",
+    "config-missing-db-name": "Refers to {{msg-mw|Config-db-name}}.\n{{Related|Config-missing}}",
+    "config-missing-db-host": "Refers to {{msg-mw|Config-db-host}}.\n{{Related|Config-missing}}",
+    "config-missing-db-server-oracle": "Refers to {{msg-mw|Config-db-host-oracle}}.\n{{Related|Config-missing}}",
     "config-invalid-db-server-oracle": "Used as error message. Parameters:\n* $1 - database server name\nSee also:\n* {{msg-mw|Config-db-host-oracle-help}}",
-    "config-support-mssql": "Parameters:\n* $1 - a link to the Microsoft SQL Server home page, the anchor text of which is \"Microsoft SQL Server\".",
     "config-invalid-db-name": "Used as error message. Parameters:\n* $1 - database name\nSee also:\n* {{msg-mw|Config-invalid-db-prefix}}",
     "config-invalid-db-prefix": "Used as error message. Parameters:\n* $1 - database prefix\nSee also:\n* {{msg-mw|Config-invalid-db-name}}",
     "config-connection-error": "$1 is the external error from the database, such as \"DB connection error: Access denied for user 'dba'@'localhost' (using password: YES) (localhost).\"\n\nIf you're translating this message to a right-to-left language, consider writing <nowiki><div dir=\"ltr\">$1.</div></nowiki>. (When the bidi features for HTML5 will be implemented in the browsers, it will probably be a good idea to write it as <nowiki><div dir=\"auto\">$1.</div></nowiki>.)",
     "config-invalid-schema": "*$1 - schema name",
+    "config-db-sys-create-oracle": "Error message in the MediaWiki installer when Oracle is used as database and an incorrect user account type has been provided.",
     "config-db-sys-user-exists-oracle": "Used as error message. Parameters:\n* $1 - database username",
-    "config-postgres-old": "Used as error message. Used as warning. Parameters:\n* $1 - minimum version\n* $2 - the version of PostgreSQL that has been installed",
-    "config-mssql-old": "Used as an error message. Parameters:\n* $1 - minimum version\n* $2 - the version of Microsoft SQL Server that has been installed",
+    "config-postgres-old": "Used as error message. Used as warning. Parameters:\n* $1 - minimum version\n* $2 - the version of PostgreSQL that has been installed\n{{Related|Config-old}}",
+    "config-mssql-old": "Used as an error message. Parameters:\n* $1 - minimum version\n* $2 - the version of Microsoft SQL Server that has been installed\n{{Related|Config-old}}",
+    "config-sqlite-name-help": "Help text for the form field for the SQLite data file name.",
     "config-sqlite-parent-unwritable-group": "Used as SQLite error message. Parameters:\n* $1 - data directory\n* $2 - \"dirname\" part of $1\n* $3 - \"basename\" part of $1\n* $4 - web server's primary group name\nSee also:\n* {{msg-mw|Config-sqlite-parent-unwritable-nogroup}}",
     "config-sqlite-parent-unwritable-nogroup": "Used as SQLite error message. Parameters:\n* $1 - data directory\n* $2 - \"dirname\" part of $1\n* $3 - \"basename\" part of $1\nSee also:\n* {{msg-mw|Config-sqlite-parent-unwritable-group}}",
     "config-sqlite-mkdir-error": "Used as SQLite error message. Parameters:\n* $1 - data directory name",
     "config-sqlite-connection-error": "Used as SQLite error message. Parameters:\n* $1 - error message which SQLite server returned",
     "config-sqlite-readonly": "Used as SQLite error message. Parameters:\n* $1 - filename",
     "config-sqlite-cant-create-db": "Used as SQLite error message. Parameters:\n* $1 - filename",
-    "config-mssql-auth": "radio button label",
-    "config-mssql-install-auth": "Used as the help text for the \"Authentication type\" radio button when typing in database settings for installation",
-    "config-mssql-web-auth": "Used as the help text for the \"Authentication type\" radio button when typing in database settings for normal wiki usage",
-    "config-mssql-sqlauth": "Radio button",
-    "config-mssql-windowsauth": "Radio button. The official term is \"Integrated Windows Authentication\" but Microsoft itself uses \"Windows Authentication\" elsewhere in Microsoft SQL Server as a synonym.",
+    "config-sqlite-fts3-downgrade": "Status message in the MediaWiki installer when SQLite is used without the FTS3 module. The FTS3 feature allows users to create special tables with a built-in full-text index.",
     "config-can-upgrade": "Parameters:\n* $1 - Version or Revision indicator.",
     "config-upgrade-done": "Used as success message. Parameters:\n* $1 - full URL of index.php\nSee also:\n* {{msg-mw|config-upgrade-done-no-regenerate}}",
     "config-upgrade-done-no-regenerate": "Used as success message. Parameters:\n* $1 - full URL of index.php\nSee also:\n* {{msg-mw|config-upgrade-done}}",
     "config-regenerate": "This message appears in a button after LocalSettings.php is generated and downloaded at the end of the MediaWiki installation process.",
     "config-show-table-status": "{{doc-important|\"<code>SHOW TABLE STATUS</code>\" is a MySQL command. Do not translate this.}}",
+    "config-unknown-collation": "Warning messages in the MediaWiki installer for the database type MySQL when an unrecognised collation is used.",
+    "config-db-web-account": "Fieldset legend in MediaWiki installer",
+    "config-db-web-help": "Help text in MediaWiki installer.",
     "config-db-web-account-same": "checkbox label",
     "config-db-web-create": "checkbox label",
+    "config-db-web-no-create-privs": "Error message in the MediaWiki installer.",
+    "config-mysql-engine": "Field label for MySQL storage engine in the MediaWiki installer.",
+    "config-mysql-innodb": "Option for the MySQL storage engine in the MediaWiki installer.",
+    "config-mysql-myisam": "Option for the MySQL storage engine in the MediaWiki installer.",
+    "config-mysql-myisam-dep": "Warning message in the MediaWiki installer when MyISAM is chosen as MySQL storage engine.",
     "config-mysql-only-myisam-dep": "Used as warning message when mysql does not support the minimum suggested feature set.",
+    "config-mysql-engine-help": "Help text in MediaWiki installer with advice for picking a MySQL storage engine.",
+    "config-mysql-charset": "Field label for the MySQL character set in the MediaWiki installer.",
     "config-mysql-binary": "{{Identical|Binary}}",
+    "config-mysql-utf8": "Option for the MySQL character set in the MediaWiki installer.",
+    "config-mysql-charset-help": "Help text for the MySQL character set setting in the MediaWiki installer.",
+    "config-mssql-auth": "Radio button group label.\n\nFollowed by the following radio button labels:\n* {{msg-mw|Config-mssql-sqlauth}}\n* {{msg-mw|Config-mssql-windowsauth}}",
+    "config-mssql-install-auth": "Used as the help text for the \"Authentication type\" radio button when typing in database settings for installation.\n\nRefers to {{msg-mw|Config-mssql-windowsauth}}.\n\nSee also:\n* {{msg-mw|Config-mssql-web-auth}}",
+    "config-mssql-web-auth": "Used as the help text for the \"Authentication type\" radio button when typing in database settings for normal wiki usage.\n\nRefers to {{msg-mw|Config-mssql-windowsauth}}.\n\nSee also:\n* {{msg-mw|Config-mssql-install-auth}}",
+    "config-mssql-sqlauth": "Radio button.\n\n\"SQL Server\" refers to \"Microsoft SQL Server\".\n\nSee also:\n* {{msg-mw|Config-mssql-windowsauth}}",
+    "config-mssql-windowsauth": "Radio button. The official term is \"Integrated Windows Authentication\" but Microsoft itself uses \"Windows Authentication\" elsewhere in Microsoft SQL Server as a synonym.\n\nAlso used in:\n* {{msg-mw|Config-mssql-install-auth}}\n* {{msg-mw|Config-mssql-web-auth}}\n\nSee also:\n* {{msg-mw|Config-mssql-sqlauth}}",
+    "config-site-name": "Field label for the form field where a wiki name has to be entered.",
+    "config-site-name-help": "Help text for the form field where a wiki name has to be entered.",
+    "config-site-name-blank": "Error text in the MediaWiki installer when the site name is left empty.",
+    "config-project-namespace": "Field label for the form field where the name of the MediaWiki project namespace has to be entered.",
     "config-ns-generic": "Used as label for \"namespace type\" radio button.\n\nSee also:\n* {{msg-mw|Config-ns-site-name}}\n* {{msg-mw|Config-ns-other}}\n{{Identical|Project}}",
     "config-ns-site-name": "Used as label for \"namespace type\" radio button. Parameters:\n* $1 - wiki name\nSee also:\n* {{msg-mw|Config-ns-generic}}\n* {{msg-mw|Config-ns-other}}",
     "config-ns-other": "Used as label for \"namespace type\" radio button.\n\nThis message is followed by the input box which enables to '''specify''' a namespace name.\n\nSee also:\n* {{msg-mw|Config-ns-site-name}}\n* {{msg-mw|Config-ns-generic}}",
+    "config-ns-other-default": "Default value for the option of a different project namespace name in the MediaWiki installer.",
+    "config-project-namespace-help": "Help text for the MediaWiki project namespace setting.",
     "config-ns-invalid": "Used as error message. Parameters:\n* $1 - namespace name\nSee also:\n* {{msg-mw|Config-ns-conflict}}",
     "config-ns-conflict": "Used as error message. Parameters:\n* $1 - namespace name\nSee also:\n* {{msg-mw|Config-ns-invalid}}",
-    "config-admin-name": "{{Identical|Your name}}",
+    "config-admin-box": "Fieldset label for settings for the MediaWiki administrator account that is created by the MediaWiki installer.",
+    "config-admin-name": "{{Identical|Your username}}",
     "config-admin-password": "{{Identical|Password}}",
+    "config-admin-password-confirm": "{{Identical|Password again}}",
+    "config-admin-help": "Help text for the MediaWiki admin user creation form fields.",
+    "config-admin-name-blank": "Error message when no administrator username was provided.",
     "config-admin-name-invalid": "Used as error message. Parameters:\n* $1 - username of administrator",
+    "config-admin-password-blank": "Error message when no administrator password was provided.",
+    "config-admin-password-mismatch": "Error message when no two equal administrator passwords were provided.",
     "config-admin-email": "{{Identical|E-mail address}}",
+    "config-admin-email-help": "Help text for an administrator email address in the MediaWiki installer.",
     "config-admin-error-user": "Used as error message. Parameters:\n* $1 - username of administrator\nSee also:\n* {{msg-mw|Config-admin-error-password}}",
     "config-admin-error-password": "Used as error message. Parameters:\n* $1 - username of administrator\n* $2 - error message\nSee also:\n* {{msg-mw|Config-admin-error-user}}",
+    "config-admin-error-bademail": "Error text in the MediaWiki installer when an entered email address does not validate.",
     "config-subscribe": "Used as label for the installer checkbox",
     "config-subscribe-help": "\"Low-volume\" in this context means that there will be few e-mails to that mailing list per time period.",
+    "config-subscribe-noemail": "Error text in MediaWiki installer.",
+    "config-almost-done": "Status message in the MediaWiki installer.",
+    "config-optional-continue": "Option in the MediaWiki installer to make a more fine-tuned installation.",
+    "config-optional-skip": "Option in the MediaWiki installer to start executing the actual installation and stop asking questions.",
+    "config-profile": "Field label for the radio button list to pick a standard user rights profile.",
+    "config-profile-wiki": "Option for the radio button list to pick a standard user rights profile.",
+    "config-profile-no-anon": "Option for the radio button list to pick a standard user rights profile.",
+    "config-profile-fishbowl": "Option for the radio button list to pick a standard user rights profile.",
+    "config-profile-private": "Option for the radio button list to pick a standard user rights profile.",
     "config-profile-help": "Messages referenced:\n* {{msg-mw|config-profile-wiki}}\n* {{msg-mw|config-profile-no-anon}}\n* {{msg-mw|config-profile-fishbowl}}\n* {{msg-mw|config-profile-private}}",
+    "config-license": "Setting for the wiki content license in the MediaWiki installer.",
+    "config-license-none": "Option for the wiki content license in the MediaWiki installer.",
+    "config-license-cc-by-sa": "Option for the wiki content license in the MediaWiki installer.",
+    "config-license-cc-by": "Option for the wiki content license in the MediaWiki installer.",
+    "config-license-cc-by-nc-sa": "Option for the wiki content license in the MediaWiki installer.",
+    "config-license-cc-0": "Option for the wiki content license in the MediaWiki installer.",
+    "config-license-gfdl": "Option for the wiki content license in the MediaWiki installer.",
+    "config-license-pd": "{{Identical|Public domain}}",
+    "config-license-cc-choose": "Option for the wiki content license in the MediaWiki installer.",
+    "config-license-help": "Help text in MediaWiki installer for license selection.",
     "config-email-settings": "{{Identical|E-mail setting}}",
+    "config-enable-email": "Checkbox label in the MediaWiki installer to allow the wiki to send email to its users.",
+    "config-enable-email-help": "Help text in the MediaWiki installer to allow the wiki to send email to its users.",
     "config-email-user": "{{Identical|Enable user-to-user e-mail}}",
+    "config-email-user-help": "Label for user-to-user e-mailing option.",
+    "config-email-usertalk": "Label for user e-mailing notification option.",
+    "config-email-usertalk-help": "Description for user e-mailing notification option.",
+    "config-email-watchlist": "Label for user watchlist notification option.",
+    "config-email-watchlist-help": "Description for user watchlist notification option.",
+    "config-email-auth": "Label for user e-mail authentication requirement.",
+    "config-email-auth-help": "Description for user e-mail authentication requirement.",
+    "config-email-sender": "Prompt for the e-mail address from which the wiki's e-mails will be sent.",
+    "config-email-sender-help": "Explanation for the e-mail address from which the wiki's e-mails will be sent.",
+    "config-upload-settings": "Label for the file and image upload settings section.",
+    "config-upload-enable": "Label for the option to enable the file and image upload system.",
     "config-upload-help": "The word \"mode\" here refers to the access rights given to various user groups when attempting to create and store files and/or subdiretories in the said directory on the server. It also refers to the <code>mode</code> command used to maipulate said right mask under Unix, Linux, and similar operating systems. A less operating-system-centric translation is fine.",
+    "config-upload-deleted": "Prompt for the server directory into which deleted files should be moved.",
+    "config-upload-deleted-help": "Explanation for {{msg|config-upload-deleted}}.",
+    "config-logo": "Prompt for a link to the logo to use for the wiki.",
     "config-logo-help": "",
     "config-instantcommons": "Used as label for the checkbox.\n\nThe help message for this checkbox is:\n* {{msg-mw|Config-instantcommons-help}}",
     "config-instantcommons-help": "Used as help message for the checkbox which is labeled {{msg-mw|config-instantcommons}}.",
+    "config-cc-error": "Prompt to manually enter a license when the tool fails to match.",
+    "config-cc-again": "Prompt to re-try picking a Creative Commons license.",
     "config-cc-not-chosen": "{{doc-important|Do not translate the \"<code>proceed</code>\" part.}}\nThis message refers to a block of HTML being embedded into the installer page. It comes from the Creative Commons Web site. The block is in the English language. It is a scripted license chooser. When an individual license has been selected, it asks you to click \"proceed\" so as to return to the MediaWiki installer page.",
+    "config-advanced-settings": "Label for the advanced configuration settings page.",
+    "config-cache-options": "Prompt for the object caching options.",
+    "config-cache-help": "Explanation for what object caching is, next to {{msg|config-cache-options}}.",
+    "config-cache-none": "Label for the object caching disabled option.",
+    "config-cache-accel": "Label for the object caching via PHP option.",
+    "config-cache-memcached": "Label for the object caching via memcached option.",
     "config-memcached-servers": "{{doc-important|Do not translate \"memcached\".}}\n{{Identical|Memcached server}}",
+    "config-memcached-help": "Prompt for the object caching via Memcached option for the user to define server(s) to be used.",
+    "config-memcache-needservers": "Error message for the object caching via Memcached option when the user has failed to define servers at the above prompt.",
     "config-memcache-badip": "Used as error message. Parameters:\n* $1 - IP address for Memcached\nSee also:\n* {{msg-mw|Config-memcache-noport}}\n* {{msg-mw|Config-memcache-badport}}",
     "config-memcache-noport": "Used as error message. Parameters:\n* $1 - Memcached server name\nSee also:\n* {{msg-mw|Config-memcache-badip}}\n* {{msg-mw|Config-memcache-badport}}",
     "config-memcache-badport": "Used as error message. Parameters:\n* $1 - 1 (hard-coded)\n* $2 - 65535 (hard-coded)\nSee also:\n* {{msg-mw|Config-memcache-badip}}\n* {{msg-mw|Config-memcache-noport}}",
     "config-extensions": "{{Identical|Extension}}",
     "config-extensions-help": "{{doc-important|Do not translate <code>./extensions</code>.}}\nUsed in help box.",
+    "config-install-alreadydone": "Error message shown to users visiting the installer when the wiki appears to already be set up.",
+    "config-install-begin": "Prompt at the end of the initial configuration options screen before the wiki software is installed.",
     "config-install-step-done": "{{Identical|Done}}",
     "config-install-step-failed": "{{Identical|Failed}}",
+    "config-install-extensions": "Notice shown to the user during the install about progress when extensions are being installed.",
     "config-install-database": "*{{msg-mw|Config-install-database}}\n*{{msg-mw|Config-install-tables}}\n*{{msg-mw|Config-install-schema}}\n*{{msg-mw|Config-install-user}}\n*{{msg-mw|Config-install-interwiki}}\n*{{msg-mw|Config-install-stats}}\n*{{msg-mw|Config-install-keys}}\n*{{msg-mw|Config-install-sysop}}\n*{{msg-mw|Config-install-mainpage}}",
     "config-install-schema": "*{{msg-mw|Config-install-database}}\n*{{msg-mw|Config-install-tables}}\n*{{msg-mw|Config-install-schema}}\n*{{msg-mw|Config-install-user}}\n*{{msg-mw|Config-install-interwiki}}\n*{{msg-mw|Config-install-stats}}\n*{{msg-mw|Config-install-keys}}\n*{{msg-mw|Config-install-sysop}}\n*{{msg-mw|Config-install-mainpage}}",
+    "config-install-pg-schema-not-exist": "Error message shown to users picking PostgreSQL.",
     "config-install-pg-schema-failed": "Parameters:\n* $1 = database user name (usernames in the database are unrelated to wiki user names)\n* $2 =",
+    "config-install-pg-commit": "Notice shown to the user during the install about progress with PostgreSQL.",
+    "config-install-pg-plpgsql": "Notice shown to users using PL/pgSQL installation.",
     "config-pg-no-plpgsql": "Used as error message. Parameters:\n* $1 - database name",
+    "config-pg-no-create-privs": "Error shown to users using PL/pgSQL installation when the system account lacks the ability to install.",
+    "config-pg-not-in-role": "Error shown to users using PL/pgSQL installation when the system account lacks the ability to install.",
     "config-install-user": "Message indicates that the user is being created\n\nSee also:\n*{{msg-mw|Config-install-database}}\n*{{msg-mw|Config-install-tables}}\n*{{msg-mw|Config-install-schema}}\n*{{msg-mw|Config-install-user}}\n*{{msg-mw|Config-install-interwiki}}\n*{{msg-mw|Config-install-stats}}\n*{{msg-mw|Config-install-keys}}\n*{{msg-mw|Config-install-sysop}}\n*{{msg-mw|Config-install-mainpage}}",
     "config-install-user-alreadyexists": "Used as warning. Parameters:\n* $1 - database username",
     "config-install-user-create-failed": "Used as MySQL warning and as PostgreSQL error. Parameters:\n* $1 - database username\n* $2 - detailed warning/error message",
     "config-install-user-missing": "Used as PostgreSQL error message. Parameters:\n* $1 - database username\nSee also:\n* {{msg-mw|Config-install-user-missing-create}}",
     "config-install-user-missing-create": "Used as PostgreSQL error message. Parameters:\n* $1 - database username\nSee also:\n* {{msg-mw|Config-install-user-missing}}",
     "config-install-tables": "Message indicates that the tables are being created\n\nSee also:\n*{{msg-mw|Config-install-database}}\n*{{msg-mw|Config-install-tables}}\n*{{msg-mw|Config-install-schema}}\n*{{msg-mw|Config-install-user}}\n*{{msg-mw|Config-install-interwiki}}\n*{{msg-mw|Config-install-stats}}\n*{{msg-mw|Config-install-keys}}\n*{{msg-mw|Config-install-sysop}}\n*{{msg-mw|Config-install-mainpage}}",
+    "config-install-tables-exist": "Error notice during the installation saying that the database already seems set up for MediaWiki, so it's continuing without taking that step.",
     "config-install-tables-failed": "Used as PostgreSQL error message. Parameters:\n* $1 - detailed error message",
     "config-install-interwiki": "Message indicates that the interwikitables are being populated\n\nSee also:\n*{{msg-mw|Config-install-database}}\n*{{msg-mw|Config-install-tables}}\n*{{msg-mw|Config-install-schema}}\n*{{msg-mw|Config-install-user}}\n*{{msg-mw|Config-install-interwiki}}\n*{{msg-mw|Config-install-stats}}\n*{{msg-mw|Config-install-keys}}\n*{{msg-mw|Config-install-sysop}}\n*{{msg-mw|Config-install-mainpage}}",
     "config-install-interwiki-list": "{{doc-important|Do not translate <code>interwiki.list</code>.}}\nUsed as error message.",
+    "config-install-interwiki-exists": "Error notice during the installation saying that one of the database tables is already set up, so it's continuing without taking that step.",
     "config-install-stats": "*{{msg-mw|Config-install-database}}\n*{{msg-mw|Config-install-tables}}\n*{{msg-mw|Config-install-schema}}\n*{{msg-mw|Config-install-user}}\n*{{msg-mw|Config-install-interwiki}}\n*{{msg-mw|Config-install-stats}}\n*{{msg-mw|Config-install-keys}}\n*{{msg-mw|Config-install-sysop}}\n*{{msg-mw|Config-install-mainpage}}",
     "config-install-keys": "*{{msg-mw|Config-install-database}}\n*{{msg-mw|Config-install-tables}}\n*{{msg-mw|Config-install-schema}}\n*{{msg-mw|Config-install-user}}\n*{{msg-mw|Config-install-interwiki}}\n*{{msg-mw|Config-install-stats}}\n*{{msg-mw|Config-install-keys}}\n*{{msg-mw|Config-install-sysop}}\n*{{msg-mw|Config-install-mainpage}}",
     "config-insecure-keys": "Parameters:\n* $1 - A list of names of the secret keys that were generated.\n* $2 - the number of items in the list $1, to be used with PLURAL.",
     "config-install-sysop": "Message indicates that the administrator user account is being created\n\nSee also:\n*{{msg-mw|Config-install-database}}\n*{{msg-mw|Config-install-tables}}\n*{{msg-mw|Config-install-schema}}\n*{{msg-mw|Config-install-user}}\n*{{msg-mw|Config-install-interwiki}}\n*{{msg-mw|Config-install-stats}}\n*{{msg-mw|Config-install-keys}}\n*{{msg-mw|Config-install-sysop}}\n*{{msg-mw|Config-install-mainpage}}",
     "config-install-subscribe-fail": "{{doc-important|\"mediawiki-announce\" is the name of a mailing list and should not be translated.}}",
+    "config-install-subscribe-notpossible": "Error shown when automatically subscribing to the MediaWiki announcements mailing list fails.",
     "config-install-mainpage": "*{{msg-mw|Config-install-database}}\n*{{msg-mw|Config-install-tables}}\n*{{msg-mw|Config-install-schema}}\n*{{msg-mw|Config-install-user}}\n*{{msg-mw|Config-install-interwiki}}\n*{{msg-mw|Config-install-stats}}\n*{{msg-mw|Config-install-keys}}\n*{{msg-mw|Config-install-sysop}}\n*{{msg-mw|Config-install-mainpage}}",
+    "config-install-extension-tables": "Notice shown to the user during the install about progress.",
     "config-install-mainpage-failed": "Used as error message. Parameters:\n* $1 - detailed error message",
     "config-install-done": "Parameters:\n* $1 is the URL to LocalSettings download\n* $2 is a link to the wiki.\n* $3 is a download link with attached download icon. The config-download-localsettings message will be used as the link text.",
     "config-download-localsettings": "The link text used in the download link in config-install-done.",
     "config-extension-link": "Shown on last page of installation to inform about possible extensions.",
     "mainpagetext": "Along with {{msg-mw|mainpagedocfooter}}, the text you will see on the Main Page when your wiki is installed.",
     "mainpagedocfooter": "Along with {{msg-mw|mainpagetext}}, the text you will see on the Main Page when your wiki is installed.\nThis might be a good place to put information about <nowiki>{{GRAMMAR:}}</nowiki>. See [[{{NAMESPACE}}:{{BASEPAGENAME}}/fi]] for an example. For languages having grammatical distinctions and not having an appropriate <nowiki>{{GRAMMAR:}}</nowiki> software available, a suggestion to check and possibly amend the messages having <nowiki>{{SITENAME}}</nowiki> may be valuable. See [[{{NAMESPACE}}:{{BASEPAGENAME}}/ksh]] for an example."
-}
\ No newline at end of file
+}
index 186feb2..ef06874 100644 (file)
@@ -17,4 +17,4 @@
     "config-nofile": "\"$1\" sutiyuq willañiqiqa manam tarisqachu. Qullusqachu?",
     "mainpagetext": "'''MediaWiki nisqa llamp'u kaqqa aypaylla takyachisqañam.'''",
     "mainpagedocfooter": "Wiki llamp'u kaqmanta willasunaykipaqqa [//meta.wikimedia.org/wiki/Help:Contents Ruraqpaq yanapana] ''(User's Guide)'' sutiyuq p'anqata qhaway.\n\n== Qallarichkaspa ==\n\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Kunphigurasyun churanamanta sutisuyu]\n* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki nisqamanta pasaq tapuykuna]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki kachaykuy e-chaski sutisuyu]\n* [//www.mediawiki.org/wiki/Localisation#Translation_resources MediaWiki nisqata qampa rimaykiman t'ikray]"
-}
\ No newline at end of file
+}
index 7c3d7aa..4182774 100644 (file)
@@ -1,6 +1,4 @@
 {
-    "@metadata": {
-        "authors": []
-    },
+    "@metadata": [],
     "mainpagetext": "'''L'instalaziòn d'MediaWiki l'è andêda ben'''"
-}
\ No newline at end of file
+}
index c8f5dde..f2bdc0b 100644 (file)
@@ -6,4 +6,4 @@
     },
     "mainpagetext": "'''MediaWiki è vegnì installà cun success.'''",
     "mainpagedocfooter": "Consultai il [//meta.wikimedia.org/wiki/Help:Contents manual per utilisaders] per infurmaziuns davart l'utilisaziun da questa software da wiki.\n\n== Cumenzar ==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Glista da las opziuns per la configuraziun]\n* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Glista da mail da MediaWiki cun annunzias da novas versiuns]"
-}
\ No newline at end of file
+}
index a002c84..5bc2afd 100644 (file)
@@ -83,7 +83,6 @@
     "config-admin-password": "Parolă:",
     "config-admin-password-confirm": "Parola, din nou:",
     "config-admin-password-blank": "Introduceți o parolă pentru contul de administrator.",
-    "config-admin-password-same": "Parola trebuie să difere de numele de utilizator.",
     "config-admin-password-mismatch": "Cele două parole introduse nu corespund.",
     "config-admin-email": "Adresa de e-mail:",
     "config-admin-error-bademail": "Ați introdus o adresă de e-mail incorectă.",
     "config-help": "ajutor",
     "mainpagetext": "'''Programul Wiki a fost instalat cu succes.'''",
     "mainpagedocfooter": "Consultați [//meta.wikimedia.org/wiki/Help:Contents Ghidul utilizatorului (en)] pentru informații despre utilizarea software-ului wiki.\n\n== Primii pași ==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Lista parametrilor configurabili (en)]\n* [//www.mediawiki.org/wiki/Manual:FAQ Întrebări frecvente despre MediaWiki (en)]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lista de discuții a MediaWiki (en)]"
-}
\ No newline at end of file
+}
index 5ce04cb..05471cc 100644 (file)
@@ -53,4 +53,4 @@
     "config-help": "ajute",
     "mainpagetext": "'''MediaUicchi ha state 'nstallete.'''",
     "mainpagedocfooter": "Vè vide [//meta.wikimedia.org/wiki/Help:Contents User's Guide] pe l'mbormaziune sus a cumme s'ause 'u softuer wiki.\n\n== Pe accumenzà ==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Liste pe le configuraziune]\n* [//www.mediawiki.org/wiki/Manual:FAQ FAQ de MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Elenghe d'a poste de MediaUicchi]\n* [//www.mediawiki.org/wiki/Localisation#Translation_resources Localizzazzione de MediaUicchi pa lènga toje]"
-}
\ No newline at end of file
+}
index 6e79935..a4ca5cc 100644 (file)
     "config-unicode-using-intl": "Будет использовано [http://pecl.php.net/intl расширение «intl» для PECL] для нормализации Юникода.",
     "config-unicode-pure-php-warning": "'''Внимание!''': [http://pecl.php.net/intl расширение intl из PECL] недоступно для нормализации Юникода, будет использоваться медленная реализация на чистом PHP.\nЕсли ваш сайт работает под высокой нагрузкой, вам следует больше узнать о [//www.mediawiki.org/wiki/Unicode_normalization_considerations нормализации Юникода].",
     "config-unicode-update-warning": "'''Предупреждение''': установленная версия обёртки нормализации Юникода использует старую версию библиотеки [http://site.icu-project.org/ проекта ICU].\nВы должны [//www.mediawiki.org/wiki/Unicode_normalization_considerations обновить версию], если хотите полноценно использовать Юникод.",
-    "config-no-db": "Не найдено поддержки баз данных! Вам необходимо установить драйвера базы данных для PHP.\nПоддерживаются следующие базы данных: $1.\n\nЕсли вы используете виртуальный хостинг, обратитесь к своему хостинг-провайдеру с просьбой установить подходящий драйвер базы данных.\nЕсли вы скомпилировали PHP сами, сконфигурируйте его снова с включенным клиентом базы данных, например, с помощью <code>./configure --with-mysql</code>.\nЕсли вы установили PHP из пакетов Debian или Ubuntu, то вам также необходимо установить модуль php5-mysql.",
+    "config-no-db": "Не удалось найти подходящие драйвера баз данных! Вам необходимо установить драйвера базы данных для PHP.\nПоддерживаются следующие типы баз данных: $1.\nЕсли вы скомпилировали PHP сами, перенастройте его с включением клиента баз данных, например, с помощью <code>./configure --with-mysqli</code>.\nЕсли вы скомпилировали PHP сами, сконфигурируйте его снова с включенным клиентом базы данных, например, с помощью <code>./configure --with-mysql</code>.\nЕсли вы установили PHP из пакетов Debian или Ubuntu, то вам также необходимо установить, например, пакет <code>php5-mysql</code>.",
     "config-outdated-sqlite": "'''Предупреждение''': у Вас установлен SQLite  $1, версия которого ниже требуемой $2 . SQLite будет недоступен.",
     "config-no-fts3": "'''Внимание''': SQLite собран без модуля [//sqlite.org/fts3.html FTS3] — поиск не будет работать для этой базы данных.",
     "config-register-globals": "'''Внимание: PHP-опция <code>[http://php.net/register_globals register_globals]</code> включена.'''\n'''Отключите её, если это возможно.'''\nMediaWiki будет работать, но это снизит безопасность сервера и увеличит риск проникновения извне.",
-    "config-magic-quotes-runtime": "'''Проблема: включена опция PHP [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-runtime magic_quotes_runtime]!'''\nЭто приводит к непредсказуемой порче вводимых данных.\nУстановка и использование MediaWiki без выключения этой опции невозможно.",
+    "config-magic-quotes-runtime": "'''Проблема: включена опция PHP [http://www.php.net/manual/ru/function.magic-quotes-runtime.php magic_quotes_runtime]!'''\nЭто приводит к непредсказуемой порче вводимых данных.\nУстановка и использование MediaWiki без выключения этой опции невозможно.",
     "config-magic-quotes-sybase": "'''Проблема: включена опция PHP [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-sybase magic_quotes_sybase]!'''\nЭто приводит к непредсказуемой порче вводимых данных.\nУстановка и использование MediaWiki без выключения этой опции невозможно.",
     "config-mbstring": "'''Проблема: включена опция PHP [http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload]!'''\nЭто приводит к ошибкам и непредсказуемой порче вводимых данных.\nУстановка и использование MediaWiki без выключения этой опции невозможно.",
-    "config-ze1": "'''Проблема: включена опция PHP [http://www.php.net/manual/en/ini.core.php zend.ze1_compatibility_mode]!'''\nЭто приводит к катастрофическим сбоям в MediaWiki.\nУстановка и использование MediaWiki без выключения этой опции невозможно.",
     "config-safe-mode": "'''Предупреждение:''' PHP работает в [http://www.php.net/features.safe-mode «безопасном режиме»].\nЭто может привести к проблемам, особенно с загрузкой файлов и вставкой математических формул.",
     "config-xml-bad": "XML-модуль РНР отсутствует.\nMediaWiki не будет работать в этой конфигурации, так как требуется функционал этого модуля.\nЕсли вы работаете в Mandrake, установите PHP XML-пакет.",
-    "config-pcre": "Модуль поддержки PCRE не найден.\nДля работы MediaWiki требуется поддержка Perl-совместимых регулярных выражений.",
+    "config-pcre-old": "'''Фатальная ошибка:''' требуется PCRE версии $1 или более поздняя.\nВаш исполняемый файл PHP связан с PCRE версии $2.\n[https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/PCRE Подробнее].",
     "config-pcre-no-utf8": "'''Фатальная ошибка'''. Модуль PCRE для PHP, похоже, собран без поддержки PCRE_UTF8.\nMediaWiki требует поддержки UTF-8 для корректной работы.",
     "config-memory-raised": "Ограничение на доступную PHP память (<code>memory_limit</code>) поднято с $1 до $2.",
     "config-memory-bad": "'''Внимание:''' размер PHP <code>memory_limit</code> составляет $1.\nВероятно, этого слишком мало.\nУстановка может потерпеть неудачу!",
     "config-gd": "Найдена встроенная графическая библиотека GD.\nВозможность использования миниатюр изображений будет включена, если вы включите их загрузку.",
     "config-no-scaling": "Не удалось найти встроенную библиотеку GD или ImageMagick.\nВозможность использования миниатюр изображений будет отключена.",
     "config-no-uri": "'''Ошибка:''' Не могу определить текущий URI.\nУстановка прервана.",
-    "config-no-cli-uri": "'''Предупреждение''': нет задан параметр --scriptpath, используется по умолчанию: <code>$1</code> .",
+    "config-no-cli-uri": "'''Предупреждение''': нет задан параметр <code>--scriptpath</code>, используется по умолчанию: <code>$1</code> .",
     "config-using-server": "Используется имя сервера «<nowiki>$1</nowiki>».",
     "config-using-uri": "Используется имя сервера \"<nowiki>$1$2</nowiki>\".",
     "config-uploads-not-safe": "'''Внимание:''' директория, используемая по умолчанию для загрузок (<code>$1</code>) уязвима к выполнению произвольных скриптов.\nХотя MediaWiki проверяет все загружаемые файлы на наличие угроз, настоятельно рекомендуется [//www.mediawiki.org/wiki/Manual:Security#Upload_security закрыть данную уязвимость] перед включением загрузки файлов.",
     "config-no-cli-uploads-check": "'''Предупреждение:''' каталог для загрузки по умолчанию ( <code>$1</code> ) не проверялся на уязвимости\n на выполнение произвольного сценария во время установки CLI.",
-    "config-brokenlibxml": "В вашей системе имеется сочетание версий PHP и libxml2, могущее привести к скрытым повреждениям данных в MediaWiki и других веб-приложениях.\nОбновите PHP до версии 5.2.9 или старше и libxml2 до 2.7.3 или старше ([//bugs.php.net/bug.php?id=45996 сведения об ошибке]).\nУстановка прервана.",
-    "config-using531": "PHP $1 не совместим с MediaWiki из-за ошибки с параметрами-ссылками при вызовах <code>__call()</code>.\nОбновитесь до PHP 5.3.2 и выше, или откатитесь до PHP 5.3.0, чтобы избежать этой проблемы.\nУстановка прервана.",
+    "config-brokenlibxml": "В вашей системе имеется сочетание версий PHP и libxml2, которое может привести к скрытым повреждениям данных в MediaWiki и других веб-приложениях.\nОбновите libxml2 до версии 2.7.3 или старше ([https://bugs.php.net/bug.php?id=45996 сведения об ошибке]).\nУстановка прервана.",
     "config-suhosin-max-value-length": "Suhosin установлен и ограничивает параметр GET <code>length</code> до $1 байт. Компонент MediaWiki ResourceLoader будет обходить это ограничение, но это снизит производительность. Если это возможно, следует установить <code>suhosin.get.max_value_length</code> в значение 1024 или выше в <code>php.ini</code>, а также установить для <code>$wgResourceLoaderMaxQueryLength</code> такое же значение в LocalSettings.php.",
     "config-db-type": "Тип базы данных:",
     "config-db-host": "Хост базы данных:",
     "config-db-username": "Имя пользователя базы данных:",
     "config-db-password": "Пароль базы данных:",
     "config-db-password-empty": "Пожалуйста, введите пароль для нового пользователя базы данных «$1».\nХотя и возможно создание пользователей без паролей, это небезопасно.",
+    "config-db-username-empty": "Вы должны ввести значение параметра «{{int:config-db-username}}».",
     "config-db-install-username": "Введите имя пользователя, которое будет использоваться для подключения к базе данных в процессе установки.\nЭто не имя пользователя MediaWiki, это имя пользователя для базы данных.",
     "config-db-install-password": "Введите пароль, который будет использоваться для подключения к базе данных в процессе установки.\nЭто не пароль пользователя MediaWiki, это пароль для базы данных.",
     "config-db-install-help": "Введите имя пользователя и пароль, которые будут использоваться для подключения к базе данных во время процесса установки.",
     "config-sqlite-dir-help": "SQLite хранит все данные в одном файле.\n\nДиректория, которую вы должны указать, должна быть доступна для записи веб-сервером во время установки.\n\nОна '''не должна''' быть доступна через Интернет, поэтому не должна совпадать с той, где хранятся PHP файлы.\n\nУстановщик запишет в эту директорию файл <code>.htaccess</code>, но если это не сработает, кто-нибудь может получить доступ ко всей базе данных.\nВ этой базе находится в том числе и информация о пользователях (адреса электронной почты, хэши паролей), а также удалённые страницы и другие секретные данные о вики.\n\nПо возможности, расположите базу данных где-нибудь в стороне, например, в <code>/var/lib/mediawiki/yourwiki</code>.",
     "config-oracle-def-ts": "Пространство таблиц по умолчанию:",
     "config-oracle-temp-ts": "Временное пространство таблиц:",
-    "config-type-mysql": "MySQL",
+    "config-type-mysql": "MySQL (или совместимая)",
     "config-type-postgres": "PostgreSQL",
     "config-type-sqlite": "SQLite",
     "config-type-oracle": "Oracle",
+    "config-type-mssql": "Microsoft SQL Server",
     "config-support-info": "MediaWiki поддерживает следующие СУБД:\n\n$1\n\nЕсли вы не видите своей системы хранения данных в этом списке, следуйте инструкциям, на которые есть ссылка выше, чтобы получить поддержку.",
-    "config-support-mysql": "* $1 — основная база данных для MediaWiki, и лучше поддерживается ([http://www.php.net/manual/en/mysql.installation.php инструкция, как собрать PHP с поддержкой MySQL])",
-    "config-support-postgres": "* $1 — популярная открытая СУБД, альтернатива MySQL ([http://www.php.net/manual/en/pgsql.installation.php инструкция, как собрать PHP с поддержкой PostgreSQL]). Могут встречаться небольшие неисправленные ошибки, не рекомендуется для использования в рабочей системе.",
-    "config-support-sqlite": "* $1 — это легковесная система баз данных, имеющая очень хорошую поддержку. ([http://www.php.net/manual/en/pdo.installation.php инструкция, как собрать PHP с поддержкой SQLite], работающей посредством PDO)",
-    "config-support-oracle": "* $1 — это коммерческая база данных масштаба предприятия. ([http://www.php.net/manual/en/oci8.installation.php Как собрать PHP с поддержкой OCI8])",
+    "config-dbsupport-mysql": "* [{{int:version-db-mysql-url}} MySQL] — основная база данных для MediaWiki, которая поддерживается лучше всего. MediaWiki также работает с [{{int:version-db-mariadb-url}} MariaDB] и [{{int:version-db-percona-url}} Percona Server], которые являются MySQL-совместимым. ([http://www.php.net/manual/ru/mysql.installation.php инструкция, как собрать PHP с поддержкой MySQL])",
+    "config-dbsupport-postgres": "* [{{int:version-db-postgres-url}} PostgreSQL] — популярная открытая СУБД, альтернатива MySQL\nМогут встречаться небольшие неисправленные ошибки, не рекомендуется для использования в рабочей системе. ([http://www.php.net/manual/ru/pgsql.installation.php инструкция, как собрать PHP с поддержкой PostgreSQL]).",
+    "config-dbsupport-sqlite": "* [{{int:version-db-sqlite-url}} SQLite] — это легковесная система баз данных, имеющая очень хорошую поддержку. ([http://www.php.net/manual/ru/pdo.installation.php инструкция, как собрать PHP с поддержкой SQLite], работающей посредством PDO)",
+    "config-dbsupport-oracle": "* [{{int:version-db-oracle-url}} Oracle] — это коммерческая база данных масштаба предприятия. ([http://www.php.net/manual/ru/oci8.installation.php Как собрать PHP с поддержкой OCI8])",
+    "config-dbsupport-mssql": "* [{{int:version-db-mssql-url}} Microsoft SQL Server] — это коммерческое база данных база данных для Windows масштаба предприятия. ([http://www.php.net/manual/ru/sqlsrv.installation.php Как собрать PHP с поддержкой SQLSRV])",
     "config-header-mysql": "Настройки MySQL",
     "config-header-postgres": "Настройки PostgreSQL",
     "config-header-sqlite": "Настройки SQLite",
     "config-header-oracle": "Настройки Oracle",
+    "config-header-mssql": "Параметры Microsoft SQL Server",
     "config-invalid-db-type": "Неверный тип базы данных",
-    "config-missing-db-name": "Вы должны ввести значение параметра «Имя базы данных»",
-    "config-missing-db-host": "Необходимо ввести значение параметра «Сервер базы данных»",
-    "config-missing-db-server-oracle": "Вы должны заполнить поле «TNS базы данных»",
+    "config-missing-db-name": "Вы должны ввести значение «{{int:config-db-name}}».",
+    "config-missing-db-host": "Необходимо ввести значение параметра «{{int:config-db-host}}».",
+    "config-missing-db-server-oracle": "Вы должны заполнить поле «{{int:config-db-host-oracle}}»",
     "config-invalid-db-server-oracle": "Неверное TNS базы данных «$1».\nИспользуйте либо «TNS Name», либо строку «Easy Connect» ([http://docs.oracle.com/cd/E11882_01/network.112/e10836/naming.htm Методы наименования Oracle])",
     "config-invalid-db-name": "Неверное имя базы данных «$1».\nИспользуйте только ASCII-символы (a-z, A-Z), цифры (0-9), знак подчёркивания (_) и дефис(-).",
     "config-invalid-db-prefix": "Неверный префикс базы данных «$1».\nИспользуйте только буквы ASCII (a-z, A-Z), цифры (0-9), знак подчёркивания (_) и дефис (-).",
     "config-db-sys-create-oracle": "Программа установки поддерживает только использование SYSDBA для создания новой учётной записи.",
     "config-db-sys-user-exists-oracle": "Учётная запись «$1». SYSDBA может использоваться только для создания новой учётной записи!",
     "config-postgres-old": "Необходим PostgreSQL $1 или более поздняя версия. У вас установлен PostgreSQL $2.",
+    "config-mssql-old": "Требуется Microsoft SQL Server версии $1 или более поздней. У вас установлена версия $2.",
     "config-sqlite-name-help": "Выберите имя-идентификатор для вашей вики.\nНе используйте дефисы и пробелы.\nЭта строка будет использоваться в имени файла SQLite.",
     "config-sqlite-parent-unwritable-group": "Не удалось создать директорию данных <nowiki><code>$1</code></nowiki>, так как у веб-сервера нет прав записи в родительскую директорию <nowiki><code>$2</code></nowiki>.\n\nУстановщик определил пользователя, под которым работает веб-сервер.\nСделайте директорию <nowiki><code>$3</code></nowiki> доступной для записи и продолжите.\nВ Unix/Linux системе выполните:\n\n<pre>cd $2\nmkdir $3\nchgrp $4 $3\nchmod g+w $3</pre>",
     "config-sqlite-parent-unwritable-nogroup": "Не удалось создать директорию для данных <code><nowiki>$1</nowiki></code>, так как у веб-сервера нет прав на запись в родительскую директорию <code><nowiki>$2</nowiki></code>.\n\nПрограмма установки не смогла определить пользователя, под которым работает веб-сервер.\nДля продолжения сделайте каталог <code><nowiki>$3</nowiki></code> глобально доступным для записи серверу (и другим).\nВ Unix/Linux сделайте:\n\n<pre>cd $2\nmkdir $3\nchmod a+w $3</pre>",
     "config-mysql-innodb": "InnoDB",
     "config-mysql-myisam": "MyISAM",
     "config-mysql-myisam-dep": "''' Внимание.''' Вы выбрали механизм MyISAM для хранения данных MySQL. Он не рекомендуется к использованию по следующим причинам:\n* он слабо поддерживает параллелизм из-за табличных блокировок;\n* более склонен к потере данных, по сравнению с другими механизмами;\n* код MediaWiki не всегда учитывает особенности MyISAM должным образом.\n\nЕсли ваша установка MySQL поддерживает InnoDB, настоятельно рекомендуется выбрать этот механизм.\nЕсли ваша установка MySQL не поддерживает InnoDB, возможно, настало время обновиться.",
-    "config-mysql-only-myisam-dep": "'''Предупреждение:''' MyISAM является единственной доступной системой хранения данных для MySQL, которая, однако, не рекомендуется для использования с MediaWiki, потому что:\n * он слабо поддерживает параллелизм из-за блокировки таблиц\n * она больше других систем подвержена повреждению\n * кодовая база MediaWiki не всегда обрабатывает MyISAM так, как следует\n\nВаша MySQL не поддерживает InnoDB, так что, возможно, настало время для обновления.",
+    "config-mysql-only-myisam-dep": "'''Предупреждение:''' MyISAM является единственной доступной системой хранения данных для MySQL на этом компьютере, и она не рекомендуется для использования с MediaWiki, потому что:\n * он слабо поддерживает параллелизм из-за блокировки таблиц\n * она больше других систем подвержена повреждению\n * кодовая база MediaWiki не всегда обрабатывает MyISAM так, как следует\n\nВаша MySQL не поддерживает InnoDB, так что, возможно, настало время для обновления.",
     "config-mysql-engine-help": "'''InnoDB''' почти всегда предпочтительнее, так как он лучше справляется с параллельным доступом.\n\n'''MyISAM''' может оказаться быстрее для вики с одним пользователем или с минимальным количеством поступающих правок, однако базы данных на нём портятся чаще, чем на InnoDB.",
     "config-mysql-charset": "Набор символов (кодовая таблица) базы данных:",
     "config-mysql-binary": "Двоичный",
     "config-mysql-utf8": "UTF-8",
     "config-mysql-charset-help": "В '''двоичном режиме''' MediaWiki хранит UTF-8 текст в бинарных полях базы данных.\nЭто более эффективно, чем ''UTF-8 режим'' MySQL, и позволяет использовать полный набор символов Unicode.\n\nВ '''режиме UTF-8''' MySQL будет знать в какой кодировке находятся Ваши данные и может отображать и преобразовывать их соответствующим образом, но это не позволит вам хранить символы выше [//en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes Базовой Многоязыковой Плоскости].",
+    "config-mssql-auth": "Тип аутентификации:",
+    "config-mssql-install-auth": "Выберите тип проверки подлинности, который будет использоваться для подключения к базе данных во время процесса установки.\nЕсли вы выберите «{{int:config-mssql-windowsauth}}», будут использоваться учётные данные пользователя, под которым работает веб-сервер.",
+    "config-mssql-web-auth": "Выберите тип проверки подлинности, который веб-сервер будет использовать для подключения к серверу базы данных во время обычного функционирования вики.\nЕсли вы выберите «{{int:config-mssql-windowsauth}}», будут использоваться учётные данные пользователя, под которым работает веб-сервер.",
+    "config-mssql-sqlauth": "Проверка подлинности SQL Server",
+    "config-mssql-windowsauth": "Проверка подлинности Windows",
     "config-site-name": "Название вики:",
     "config-site-name-help": "Название будет отображаться в заголовке окна браузера и в некоторых других местах вики.",
     "config-site-name-blank": "Введите название сайта.",
     "config-ns-invalid": "Указанное пространство имён <nowiki>$1</nowiki> недопустимо.\nУкажите другое пространство имён проекта.",
     "config-ns-conflict": "Указанное пространство имён «<nowiki>$1</nowiki>» конфликтует со стандартным пространством имён MediaWiki.\nУкажите другое пространство имён проекта.",
     "config-admin-box": "Учётная запись администратора",
-    "config-admin-name": "Ð\98мÑ\8f:",
+    "config-admin-name": "Ð\92аÑ\88е Ð¸Ð¼Ñ\8f Ñ\83Ñ\87аÑ\81Ñ\82ника:",
     "config-admin-password": "Пароль:",
     "config-admin-password-confirm": "Пароль ещё раз:",
     "config-admin-help": "Введите ваше имя пользователя здесь, например, «Иван Иванов».\nЭто имя будет использоваться для входа в вики.",
     "config-admin-name-blank": "Введите имя пользователя администратора.",
     "config-admin-name-invalid": "Указанное имя пользователя «<nowiki>$1</nowiki>» недопустимо.\nУкажите другое имя пользователя.",
     "config-admin-password-blank": "Введите пароль для учётной записи администратора.",
-    "config-admin-password-same": "Пароль не должен быть таким же, как имя пользователя.",
     "config-admin-password-mismatch": "Введённые вами пароли не совпадают.",
     "config-admin-email": "Адрес электронной почты:",
     "config-admin-email-help": "Введите адрес электронной почты, чтобы получать сообщения от других пользователей вики, иметь возможность восстановить пароль, а также получать уведомления об изменениях страниц из списка наблюдения. Вы можете оставить это поле пустым.",
     "config-license-help": "Многие общедоступные вики разрешают использовать свои материалы на условиях [http://freedomdefined.org/Definition/Ru свободных лицензий].\nЭто помогает созданию чувства общности, стимулирует долгосрочное участие.\nНо в этом нет необходимости для частных или корпоративных вики.\n\nЕсли вы хотите использовать тексты из Википедии или хотите, что в Википедию можно было копировать тексты из вашей вики, вам следует выбрать '''Creative Commons Attribution Share Alike'''.\n\nВикипедия ранее использовала лицензию GNU Free Documentation License.\nGFDL может быть использована, но она сложна для понимания и осложняет повторное использование материалов.",
     "config-email-settings": "Настройки электронной почты",
     "config-enable-email": "Включить исходящие e-mail",
-    "config-enable-email-help": "Если вы хотите, чтобы электронная почта работала, необходимо выполнить [http://www.php.net/manual/en/mail.configuration.php соответствующие настройки PHP].\nЕсли вы не хотите использовать возможности электронной почты в вики, вы можете её отключить.",
+    "config-enable-email-help": "Если вы хотите, чтобы электронная почта работала, необходимо выполнить [http://www.php.net/manual/ru/mail.configuration.php соответствующие настройки PHP].\nЕсли вы не хотите использовать возможности электронной почты в вики, вы можете её отключить.",
     "config-email-user": "Включить электронную почту от участника к участнику",
     "config-email-user-help": "Разрешить всем пользователям отправлять друг другу электронные письма, если выставлена соответствующая настройка в профиле.",
     "config-email-usertalk": "Включить уведомления пользователей о сообщениях на их странице обсуждения",
     "config-install-interwiki-exists": "'''Предупреждение''': в интервики-таблице, кажется, уже есть записи.\nСоздание стандартного списка пропущено.",
     "config-install-stats": "Статистика инициализации",
     "config-install-keys": "Создание секретных ключей",
-    "config-insecure-keys": "'''Предупреждение.''' {{PLURAL:$2|Ключ безопасности $1, созданный во время установки, недостаточно надёжен|Ключи безопасности $1, созданные во время установки, недостаточно надёжны}}. Рассмотрите возможность {{PLURAL:$2|его|их}} изменения вручную.",
+    "config-insecure-keys": "'''Предупреждение.''' {{PLURAL:$2|1=Ключ безопасности $1, созданный во время установки, недостаточно надёжен|Ключи безопасности $1, созданные во время установки, недостаточно надёжны}}. Рассмотрите возможность {{PLURAL:$2|1=его|их}} изменения вручную.",
     "config-install-sysop": "Создание учётной записи администратора",
     "config-install-subscribe-fail": "Не удаётся подписаться на mediawiki-announce: $1",
     "config-install-subscribe-notpossible": "cURL не установлен и не доступна опция allow_url_fopen.",
     "config-extension-link": "Знаете ли вы, что ваш вики-проект поддерживает [//www.mediawiki.org/wiki/Manual:Extensions расширения]?\n\nВы можете просмотреть [//www.mediawiki.org/wiki/Category:Extensions_by_category расширения по категориям] или [//www.mediawiki.org/wiki/Extension_Matrix матрицу расширений], чтобы увидеть их полный список.",
     "mainpagetext": "'''Вики-движок «MediaWiki» успешно установлен.'''",
     "mainpagedocfooter": "Информацию по работе с этой вики можно найти в [//meta.wikimedia.org/wiki/%D0%9F%D0%BE%D0%BC%D0%BE%D1%89%D1%8C:%D0%A1%D0%BE%D0%B4%D0%B5%D1%80%D0%B6%D0%B0%D0%BD%D0%B8%D0%B5 справочном руководстве].\n\n== Некоторые полезные ресурсы ==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Список возможных настроек];\n* [//www.mediawiki.org/wiki/Manual:FAQ Часто задаваемые вопросы и ответы по MediaWiki];\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Рассылка уведомлений о выходе новых версий MediaWiki].\n* [//www.mediawiki.org/wiki/Localisation#Translation_resources Перевод MediaWiki на свой язык]"
-}
\ No newline at end of file
+}
index 92a1c38..79bfaf9 100644 (file)
@@ -6,4 +6,4 @@
     },
     "mainpagetext": "'''MediaWiki была успішно наіншталована.'''",
     "mainpagedocfooter": "[//meta.wikimedia.org/wiki/Help:Contents Мануял хоснователя] Вам порадить, як хосновати MediaWiki.\n\n== Про початок ==\n\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Наставлїня конфіґурації]\n* [//www.mediawiki.org/wiki/Manual:FAQ Часты вопросы о MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Розосыланя повідомлїнь про новы верзії MediaWiki]"
-}
\ No newline at end of file
+}
index 5ef4773..09cb043 100644 (file)
@@ -5,4 +5,4 @@
         ]
     },
     "mainpagetext": "मीडियाविकि तु सफलतया अन्तःस्थापितमस्ति"
-}
\ No newline at end of file
+}
index e12c769..55f6868 100644 (file)
@@ -1,7 +1,5 @@
 {
-    "@metadata": {
-        "authors": []
-    },
+    "@metadata": [],
     "mainpagetext": "'''«MediaWiki» сөпкө туруорулунна.'''",
     "mainpagedocfooter": "Биики программатын туһунан [//meta.wikimedia.org/wiki/Help:Contents справочникка] көрүөххүн сөп.\n\n== Саҕаланыыта ==\n\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Конфигурация уларытыытын параметрдара]\n* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki релизтарын почтовай испииһэгэ]"
-}
\ No newline at end of file
+}
index adf7b5d..4d0b341 100644 (file)
@@ -1,8 +1,12 @@
 {
     "@metadata": {
         "authors": [
-            "Andria"
+            "Andria",
+            "L2212"
         ]
     },
+    "config-page-language": "Limba",
+    "config-page-name": "Nùmene",
+    "config-page-options": "Preferèntzias",
     "mainpagetext": "'''MediaWiki est stadu installadu in modu currègidu.'''"
-}
\ No newline at end of file
+}
index fa92a40..e588b22 100644 (file)
@@ -1,7 +1,5 @@
 {
-    "@metadata": {
-        "authors": []
-    },
+    "@metadata": [],
     "mainpagetext": "'''Nstallazzioni di MediaWiki cumplitata currettamenti.'''",
     "mainpagedocfooter": "Pi favuri taliari [//meta.wikimedia.org/wiki/Help:Contents Guida utenti] pi aiutu supra l'usu e la cunfigurazzioni di stu software wiki.\n\n== P'accuminzari ==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Alencu di mpustazzioni di cunfigurazzioni]\n* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Mailing list dî rilassi di MediaWiki]"
-}
\ No newline at end of file
+}
index ddff751..e59a7bd 100644 (file)
@@ -1,7 +1,314 @@
 {
     "@metadata": {
-        "authors": []
+        "authors": [
+            "AmaryllisGardener",
+            "John Reid"
+        ]
     },
-    "mainpagetext": "'''MediaWiki haes been installit wi speed.'''",
-    "mainpagedocfooter": "Aks the [//meta.wikimedia.org/wiki/Help:Contents Uiser's Manual] for speirins aboot using the wiki saftware.\n\n== Gettin startit ==\n\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Configuration settins leet]\n* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki releese mailin leet]"
-}
\ No newline at end of file
+    "config-desc": "The installer fer MediaWiki",
+    "config-title": "MediaWiki $1 installation.",
+    "config-information": "Information",
+    "config-localsettings-upgrade": "Ae <code>LocalSettings.php</code> file haes been detectit.\nTae upgrade this installation, please enter the vailyie o <code>$wgUpgradeKey</code> in the kist ablo.\nYe'll fynd it in <code>LocalSettings.php</code>.",
+    "config-localsettings-cli-upgrade": "Ae <code>LocalSettings.php</code> file haes been detectit.\nTae upgrade this installation, please rin <code>update.php</code> insteid",
+    "config-localsettings-key": "The Upgrade key:",
+    "config-localsettings-badkey": "The key that ye gave is fause.",
+    "config-upgrade-key-missing": "Aen exeestin installation o MediaWiki haes been detectit.\nTae upgrade this installation, please pit the follaein line at the bottom o yer <code>LocalSettings.php</code>:\n\n$1",
+    "config-localsettings-incomplete": "The exeestin <code>LocalSettings.php</code> appears tae be oncompleate.\nThe $1 variable isna set.\nPlease chynge <code>LocalSettings.php</code> sae that this variable is set, n clap \"{{int:Config-continue}}\".",
+    "config-localsettings-connection-error": "Ae mistak wis encountered whan connectin til the database uisin the settins specified in <code>LocalSettings.php</code>. Please fix thir settins n try again.\n\n$1",
+    "config-session-error": "mistak in stertin session: $1",
+    "config-session-expired": "Yer session data seems tae'v expired.\nSessions ar configured fer ae lifetime o $1.\nYe can increase this bi settin <code>session.gc_maxlifetime</code> in php.ini.\nRestart the installation process.",
+    "config-no-session": "Yer session data wis tint!\nCheck yer php.ini an mak sair <code>session.save_path</code> is set til aen appropriate directerie.",
+    "config-your-language": "Yer leid:",
+    "config-your-language-help": "Select ae leid tae uise durin the installâtion process.",
+    "config-wiki-language": "Wiki leid:",
+    "config-wiki-language-help": "Select the leid that the wiki will predominantly be wrutten in.",
+    "config-back": "← Laist",
+    "config-continue": "Contînue →",
+    "config-page-language": "Leid",
+    "config-page-welcome": "Weelcome til MediaWiki!",
+    "config-page-dbconnect": "Connect til database",
+    "config-page-upgrade": "Upgrade exeestin installâtion",
+    "config-page-dbsettings": "Database settins",
+    "config-page-name": "Name,",
+    "config-page-options": "Opties",
+    "config-page-install": "Install,",
+    "config-page-complete": "Compleate!",
+    "config-page-restart": "Restart installâtion",
+    "config-page-readme": "Read me,",
+    "config-page-releasenotes": "Release nôtes",
+    "config-page-copying": "Copiein",
+    "config-page-upgradedoc": "Upgradin",
+    "config-page-existingwiki": "Exeestin wiki",
+    "config-help-restart": "Div ye wish tae clear aw hained data that ye'v entered n restairt the instawlation process?",
+    "config-restart": "Ai, restart it",
+    "config-welcome": "=== Environmêntal checks ===\nBasic checks will nou be performed tae see gif this environment is suitable fer MediaWiki installâtion.\nMynd tae inclæde this information gif ye seek heelp oan hou tae complete the installâtion.",
+    "config-copyright": "=== Copiericht n Terms ===\n\n$1\n\nThis program is free saffware; ye can redistreebute it n/or modifie it unner the terms o the GNU General Public License aes published bi the Free Software Foundation; either version 2 o the License, or (yer optie) onie later version.\n\nThis program is distributed in the hope that it will be uiseful, but <strong>wioot onie warrantie</strong>; wioot even the implied warrantie o <strong>merchantabeelity</strong> or <strong>fitness fer ae parteecular purpose</strong>.\nSee the GNU General Public License fer mair details.\n\nYe shid hae receeved <doclink href=Copying> ae copie o the GNU General Publeec License</doclink> alang wi this program; gif naw, write til the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA, or [http://www.gnu.org/copyleft/gpl.html read it online].",
+    "config-sidebar": "* [//www.mediawiki.org MediaWiki home]\n* [//www.mediawiki.org/wiki/Help:Contents User's Guide]\n* [//www.mediawiki.org/wiki/Manual:Contents Administrator's Guide]\n* [//www.mediawiki.org/wiki/Manual:FAQ FAQ]\n----\n* <doclink href=Readme>Read me</doclink>\n* <doclink href=ReleaseNotes>Release notes</doclink>\n* <doclink href=Copying>Copiein</doclink>\n* <doclink href=UpgradeDoc>Upgradin</doclink>",
+    "config-env-good": "The environment haes been checked.\nYe can install MediaWiki.",
+    "config-env-bad": "The environment haes been checked.\nYe canna install MediaWiki.",
+    "config-env-php": "PHP $1 is instâlled.",
+    "config-env-php-toolow": "PHP $1 is instâlled.\nHoue'er, MediaWiki requires PHP $2 or heier.",
+    "config-unicode-using-utf8": "Uising Brion Vibber's utf8_normalize.so fer Unicode normalization.",
+    "config-unicode-using-intl": "Uising the [http://pecl.php.net/intl intl PECL extension] fer Unicode normalization.",
+    "config-unicode-pure-php-warning": "<strong>Warnishment:</strong> The [http://pecl.php.net/intl intl PECL extension] isna available tae handle Unicode normalization, fawin back tae slow pure-PHP implementation.\nGif ye rin ae high-traffic site, ye shid read ae wee bit oan [//www.mediawiki.org/wiki/Unicode_normalization_considerations Unicode normalization].",
+    "config-unicode-update-warning": "<strong>Warnishment:</strong> The instawed version o the Unicode normalization wrapper uises aen aulder version o [http://site.icu-project.org/ the ICU project's] librie.\nYe shid [//www.mediawiki.org/wiki/Unicode_normalization_considerations upgrade] gif ye'r concerned aneat uisin Unicode.",
+    "config-no-db": "Coudna fynd ae suitable database driver! Ye need tae instaw ae database driver fer PHP.\nThe follaein database types ar supported: $1.\n\nGif ye compiled PHP yersel, reconfeegure it wi ae database client enabled, fer example, uising <code>./confeegure --wi-mysqli</code>.\nGif ye installed PHP fae ae Debian or Ubuntu package, than ye need tae instaw forby, fer example, the <code>php5-mysql</code> package.",
+    "config-outdated-sqlite": "<strong>Warnishment:</strong> ye have SQLite $1, this is lower than minimum required version $2. SQLite will be onavailable.",
+    "config-no-fts3": "<strong>Warnishment:</strong> SQLite is compiled wioot the [//sqlite.org/fts3.html FTS3 module], rake features will be onavailable oan this backend.",
+    "config-register-globals": "<strong>Warnishment: PHP's <code>[http://php.net/register_globals register_globals]</code> optie is enabled.\nDisable it gif ye can.</strong>\nMediaWiki will wark, but yer server is exposed til poteential securitie vulnerabeelities.",
+    "config-magic-quotes-runtime": "<strong>Fatal: [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-runtime magic_quotes_runtime] is active!'</strong>\nThis optie rots data input onpredictably.\nYe canna install or uise MediaWiki onless this optie is disabled.",
+    "config-magic-quotes-sybase": "<strong>Fatal: [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-sybase magic_quotes_sybase] is active!</strong>\nThis optie rots data input onpredictably.\nYe canna install or uise MediaWiki onless this optie is disabled.",
+    "config-mbstring": "<strong>Fatal: [http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload] is active!</strong>\nThis optie causes mistaks an can rot data onpredictably.\nYe canna install or uise MediaWiki onless this optie is disabled.",
+    "config-safe-mode": "<strong>Warnishment:</strong> PHP's [http://www.php.net/features.safe-mode safe mode] is acteeve.\nIt micht cause problems, parteecularlie gif uisin file uplaids n <code>math</code> support.",
+    "config-xml-bad": "PHP's XML module is missin.\nMediaWiki needs functions in this module n will naw wairk in this confeeguration.\nGif ye'r rinnin Mandrake, instaw the php-xml package.",
+    "config-pcre-old": "<strong>Fatal:</strong> PCRE $1 or later is required.\nYer PHP binary is link't wi PCRE $2.\n[https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/PCRE Mair informâtion].",
+    "config-pcre-no-utf8": "<strong>Fatal:</strong> PHP's PCRE module seems tae be compiled wioot PCRE_UTF8 support.\nMediaWiki requires UTF-8 support tae function correctly.",
+    "config-memory-raised": "PHP's <code>memerie_limit</code> is $1, raised til $2.",
+    "config-memory-bad": "<strong>Warnishment:</strong> PHP's <code>memerie_limit</code> is $1.\nThis is proably ower low.\nThe installation micht fail!",
+    "config-ctype": "<strong>Fatal:</strong> PHP maun be compiled wi support fer the [http://www.php.net/manual/en/ctype.installation.php Ctype extension].",
+    "config-json": "<strong>Fatal:</strong> PHP wis compiled wioot JSON support.\nYe maun instaw either the PHP JSON extension or the [http://pecl.php.net/package/jsonc PECL jsonc] extension afore instawin MediaWiki.\n* The PHP extension is incluided in Red Hat Enterprise Linux (CentOS) 5 n 6, thoogh it maun be enabled in <code>/etc/php.ini</code> or <code>/etc/php.d/json.ini</code>.\n* Some Linux distributions released efter Mey 2013 omit the PHP extension, instead packagin the PECL extension aes <code>php5-json</code> or <code>php-pecl-jsonc</code>.",
+    "config-xcache": "[http://xcache.lighttpd.net/ XCache] is installed.",
+    "config-apc": "[http://www.php.net/apc APC] is installed.",
+    "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache] is instawed.",
+    "config-no-cache": "<strong>Warnishment:</strong> Coudna fynd [http://www.php.net/apc APC], [http://xcache.lighttpd.net/ XCache] or [http://www.iis.net/download/WinCacheForPhp WinCache].\nObject cachin isna enabled.",
+    "config-mod-security": "<strong>Warnishment:</strong> Yer wab server haes [http://modsecurity.org/ mod_security] enabled. Gif misconfeegured, it can cause problems fer MediaWiki or ither saffware that allous uisers tae post arbitrie content.\nRefer til [http://modsecurity.org/documentation/ mod_security documentation] or contact yer host's support gif ye encounter random mistaks.",
+    "config-diff3-bad": "GNU diff3 naw foond.",
+    "config-git": "Foond the Git version control saffware: <code>$1</code>.",
+    "config-git-bad": "Git version control saffware no foond.",
+    "config-imagemagick": "Foond ImageMagick: <code>$1</code>.\nEemage thummnailin will be enabled gif ye enable uplaids.",
+    "config-gd": "Foond GD graphics librie biggit-in.\nEimage thumbnailing will be enabled gif ye enable uplaids.",
+    "config-no-scaling": "Coudna fynd GD librie or ImageMagick.\nEimage thumbnailing will be disabled.",
+    "config-no-uri": "<strong>Mistak:</strong> Coudna determine the current URI.\nInstallâtion aborted.",
+    "config-no-cli-uri": "<strong>Warnishment:</strong> Naw <code>--scriptpath</code> speceefied, uising defaut: <code>$1</code>.",
+    "config-using-server": "Uisin server name \"<nowiki>$1</nowiki>\".",
+    "config-using-uri": "Uisin server URL \"<nowiki>$1$2</nowiki>\".",
+    "config-uploads-not-safe": "<strong>Warnishment:</strong> Yer defaut directerie fer uplaids <code>$1</code> is vulnerable til arbitrie scripts execution.\nAathough MediaWiki checks aw uplaided files fer securitie threats, it is heily recommended tae [//www.mediawiki.org/wiki/Manual:Security#Upload_security close this security vulnerabeelitie] afore enablin uplaids.",
+    "config-no-cli-uploads-check": "<strong>Warnishment:</strong> Yer defaut directerie fer uplaids (<code>$1</code>) isna checkit fer vulnerabeelitie\ntae arbitrie script execution durin the CLI install.",
+    "config-brokenlibxml": "Yer system haes ae combinâtion o PHP n libxml2 versions that's buggie n can cause skauk't data rottin in MediaWiki n ither wab applicâtions.\nUpgrade til libxml2 2.7.3 or later ([https://bugs.php.net/bug.php?id=45996 bug filed with PHP]).\nInstallâtion aborted.",
+    "config-suhosin-max-value-length": "Suhosin is installed n limits the GET parameter <code>length</code> til $1 bytes.\nMediaWiki's ResoorceLaider component will wark aroonn this limit, but that will lawer performance.\nGif at aw possible, ye shid set <code>suhosin.get.max_value_length</code> til 1024 or heier in <code>php.ini</code>, n set <code>$wgResourceLoaderMaxQueryLength</code> til the same value in <code>LocalSettings.php</code>.",
+    "config-db-type": "Dâtabase type:",
+    "config-db-host": "Dâtabase host:",
+    "config-db-host-help": "Gif yer database server is oan ae different server, enter the host name or IP address here.\n\nGif ye'r uisin shaired wab hostin, yer hostin provider shid gie ye the richt host name in their documentation.\n\nGif ye'r installin oan ae Windows server n uisin MySQL, uisin \"localhost\" michtna wark fer the server name. Gif it disna, try \"127.0.0.1\" fer the local IP address.\n\nGif ye'r uisin PostgreSQL, lea this field blank tae connect bi wa o ae Unix socket.",
+    "config-db-host-oracle": "Dâtabase TNS:",
+    "config-db-host-oracle-help": "Enter ae valid [http://download.oracle.com/docs/cd/B28359_01/network.111/b28317/tnsnames.htm Local Connect Name]; ae tnsnames.ora file maun be veesible til this instawation. <br />Gif ye'r uisin client libries 10g or newer ye can uise forby the [http://download.oracle.com/docs/cd/E11882_01/network.112/e10836/naming.htm Easy Connect] namin methyd.",
+    "config-db-wiki-settings": "Identifie this wiki",
+    "config-db-name": "Dâtabase name:",
+    "config-db-name-help": "Chuise ae name that identifies yer wiki.\nIt shidna contain spaces.\n\nGif ye'r uisin shaired wab hoastin, yer hoastin provider will either gie ye ae speceefic database name tae uise or let ye mak databases bi waa o ae control panel.",
+    "config-db-name-oracle": "Dâtabase schema:",
+    "config-db-account-oracle-warn": "Thaur's three supportit scenaríos fer instawin Oracle aes ae database backend:\n\nGif ye wish tae cræft ae database accoont aes pairt o the instawation process, please supplie aen accoont wi SYSDBA role aes database accoont fer instawation n speceefie the desired creedentials fer the wab-access accoont, itherwise ye can eether cræft the wab-access accoont manuallie n supplie yinlie that accoont (gif it haes the needit permeessions tae cræft the schema objects) or supplie twa differant accoonts, yin wi cræft preevileges n ae restreectit yin fer wab access.\n\nScreept fer cræftin aen accoont wi the needit preevileges can be foond in the \"maintenance/oracle/\" directerie o this instawation. Keep in mynd that uisin ae restreectit accoont will disable aw maintenance capabileeties wi the defaut accoont.",
+    "config-db-install-account": "Uiser accoont fer installâtion",
+    "config-db-username": "Database uisername:",
+    "config-db-password": "Database passwaird:",
+    "config-db-password-empty": "Please enter ae passwaird fer the new database uiser: $1.\nWhile it micht be possible tae mak uisers wi naw passwairds, it's naw secure.",
+    "config-db-install-username": "Enter the uisername that will be uised tae connect til the database durin the installâtion process.\nThis isna the uisername o the MediaWiki accont; this is the uisername fr yer database.",
+    "config-db-install-password": "Enter the passwaird that will be uised tae connect til the database durin the installâtion process.\nThis isna the passwaird fer the MediaWiki accoont; this is the passwaird fer yer database.",
+    "config-db-install-help": "Enter the uisername an passwaird that will be uised tae connect til the database durin the installâtion process.",
+    "config-db-account-lock": "Uise the same uisername an passwaird durin normal operation",
+    "config-db-wiki-account": "Uiser accoont fer normal operâtion",
+    "config-db-wiki-help": "Enter the uisername n passwaird that will be uised tae connect til the database durin normal wiki operâtion.\nGif the accoont disna exeest, n the instawlation accoont haes suffeecient preevileges, this uiser accoont will be cræftit wi the least preevileges needed tae operate the wiki.",
+    "config-db-prefix": "Database buird prefix:",
+    "config-db-prefix-help": "Gif ye need tae shair yin database atween multiple wikis, or atween MediaWiki n anither wab appleecation, ye can chuise tae eik ae prefix til aw the buird names tae avoid confleects.\nDinna uise spaces.\n\nThis field is uisuallie left tuim.",
+    "config-db-charset": "Database chairacter set",
+    "config-charset-mysql5-binary": "MaSQL 4.1/5.0 binarie",
+    "config-charset-mysql5": "MaSQL 4.1/5.0 UTF-8",
+    "config-charset-mysql4": "MaSQL 4.0 backwairds-compatible UTF-8",
+    "config-charset-help": "<strong>Warnishment:</strong> Gif ye uise <strong>backwairds-compatible UTF-8</strong> oan MySQL 4.1+, n subsequentlie back up the database wi <code>mysqldump</code>, it micht destroy aw non-ASCII chairacters, onreversiblie rotin yer backups!\n\nIn <strong>binarie mode</strong>, MediaWiki stores UTF-8 tex til the database in binarie fields.\nThis is mair effeecient than MySQL's UTF-8 mode, n permits ye tae uise the ful range o Unicode chairacters.\nIn <strong>UTF-8 mode</strong>, MySQL will ken whit chairacter set yer data is in, n can present n convert it appropriatelie,\nbut it will naw lat ye store chairacters abuin the [//en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes Basic Multilingual Plane].",
+    "config-mysql-old": "MaSQL $1 or later is required. Ye hae $2.",
+    "config-db-port": "Dâtabase port:",
+    "config-db-schema": "Schema fer MediaWiki:",
+    "config-db-schema-help": "This schema will uisually be fine.\nyinly chynge it gif ye ken ye need tae.",
+    "config-pg-test-error": "Canna connect til database <strong>$1</strong>: $2",
+    "config-sqlite-dir": "SQLite data directerie:",
+    "config-sqlite-dir-help": "SQLite stores aw data in ae single file.\n\nThe directerie ye provide maun be writable bi the wabserver durin instawation.\n\nIt shid <strong>no</strong> be accessible bi waa o the wab, this is why we'r no puttin it whaur yer PHP files ar.\n\nThe instawer will write ae <code>.htaccess</code> file alang wi it, but gif that fails somebodie can gain access til yer raw database.\nThat incluides raw uiser data (wab-mail addresses, hashed passwairds) aes weel aes delytit reveesions n ither restreected data oan the wiki.\n\nConsider puttin the database some ither place awthegether, fer example in <code>/var/lib/mediawiki/yourwiki</code>.",
+    "config-oracle-def-ts": "Defaut buirdspace:",
+    "config-oracle-temp-ts": "Temperie buirdspace:",
+    "config-type-mysql": "MaSQL (or compâtible)",
+    "config-type-mssql": "Micræsaff SQL Server",
+    "config-support-info": "MediaWiki supports the follaein database systems:\n\n$1\n\nGif ye dinna see the database system ye'r tryin tae uise listed ablow, than follae the instructions linked abuin tae enable support.",
+    "config-dbsupport-mysql": "* [{{int:version-db-mysql-url}} MySQL] is the primarie tairget fer MediaWiki n is best supported. MediaWiki warks forby wi [{{int:version-db-mariadb-url}} MariaDB] n [{{int:version-db-percona-url}} Percona Server], thir ar MySQL compatible. ([http://www.php.net/manual/en/mysqli.installation.php Hou tae compile PHP wi MySQL support])",
+    "config-dbsupport-postgres": "* [{{int:version-db-postgres-url}} PostgreSQL] is ae popular apen soorce database system aes aen alternative til MySQL. Thaur micht be some wee bugs still hingin roond, n it's na recommendit fer uiss in ae production environment. ([http://www.php.net/manual/en/pgsql.installation.php Hou tae compile PHP wi PostgreSQL support])",
+    "config-dbsupport-sqlite": "* [{{int:version-db-sqlite-url}} SQLite] is ae lichtweicht database system that is ver weel supportit. ([http://www.php.net/manual/en/pdo.installation.php Hou tae compile PHP wi SQLite support], uises PDO)",
+    "config-dbsupport-oracle": "* [{{int:version-db-oracle-url}} Oracle] is ae commercial enterprise database. ([http://www.php.net/manual/en/oci8.installation.php Hou tae compile PHP wi OCI8 support])",
+    "config-dbsupport-mssql": "* [{{int:version-db-mssql-url}} Microsoft SQL Server] is ae commercial enterprise database fer Windows. ([http://www.php.net/manual/en/sqlsrv.installation.php Hou tae compile PHP wi SQLSRV support])",
+    "config-header-mysql": "MaSQL settins",
+    "config-header-postgres": "PostgreSQL settins",
+    "config-header-sqlite": "SQLite settins",
+    "config-header-oracle": "Oracle settins",
+    "config-header-mssql": "Microsoft SQL Server settings",
+    "config-invalid-db-type": "Onvalid database type",
+    "config-missing-db-name": "Ye maun enter ae value fer \"Database name\"",
+    "config-missing-db-host": "Ye maun enter ae value fer \"Database host\"",
+    "config-missing-db-server-oracle": "Ye mau enter ae value fer \"Database TNS\"",
+    "config-invalid-db-server-oracle": "Onvalid database TNS \"$1\".\nUise either \"TNS Name\" or aen \"Easy Connect\" string ([http://docs.oracle.com/cd/E11882_01/network.112/e10836/naming.htm Oracle Naming Methods])",
+    "config-invalid-db-name": "Onvalid database name \"$1\".\nUise yinly ASCII letters (a-z, A-Z), nummers (0-9), unnerscores (_) an hyphens (-).",
+    "config-invalid-db-prefix": "Onvalid database prefix \"$1\".\nUise yinly ASCII letters (a-z, A-Z), nummers (0-9), unnerscores (_) an hyphens (-).",
+    "config-connection-error": "$1.\n\nCheck the host, uisername n passwaird n gie it anither shot.",
+    "config-invalid-schema": "Onvalid schema fer MediaWiki \"$1\".\nUise yinly ASCII letters (a-z, A-Z), nummers (0-9) an unnerscores (_).",
+    "config-db-sys-create-oracle": "Installer yinly supports usin ae SYSDBA accoont fer makin ae new accoont.",
+    "config-db-sys-user-exists-oracle": "Uiser accoont \"$1\" awreadie exeests. SYSDBA can yinly be uised fer the makin o ae new accoont!",
+    "config-postgres-old": "PostgreSQL $1 or later is required. Ye hae $2.",
+    "config-mssql-old": "Microsoft SQL Server $1 or newer is needed. Ye hae $2.",
+    "config-sqlite-name-help": "Chuise ae name that identifies yer wiki.\nDinna uise spaces or hyphens.\nThis will be uised fer the SQLite data file name.",
+    "config-sqlite-parent-unwritable-group": "Canna mak the data directerie <code><nowiki>$1</nowiki></code>, cause the parent directerie <code><nowiki>$2</nowiki></code> isna writable bi the wabserver.\n\nThe installer haes determined the uiser yer wabserver is runnin aes.\nMak the <code><nowiki>$3</nowiki></code> directerie writable bi it tae continue.\nOan ae Unix/Linux system dae:\n\n<pre>cd $2\nmkdir $3\nchgrp $4 $3\nchmod g+w $3</pre>",
+    "config-sqlite-parent-unwritable-nogroup": "Canna cræft the data directerie <code><nowiki>$1</nowiki></code>, cause the pairent directerie <code><nowiki>$2</nowiki></code> isna writable bi the wabserver.\n\nThe instawer coudna determine the uiser yer wabserver is rinnin aes.\nMak the <code><nowiki>$3</nowiki></code> directerie globallie writable bi it (n ithers!) tae continue.\nOan ae Unix/Linux system dae:\n\n<pre>cd $2\nmkdir $3\nchmod a+w $3</pre>",
+    "config-sqlite-mkdir-error": "Mistak in cræftin the data directerie \"$1\".\nCheck the location n try again.",
+    "config-sqlite-dir-unwritable": "Onable tae write in the directerie \"$1\".\nChynge its permeessions sae that the wabserver can write in it, n gie it anither gae.",
+    "config-sqlite-connection-error": "$1.\n\nCheck the data directerie n database name ablo n try again.",
+    "config-sqlite-readonly": "The file <code>$1</code> isna writeable.",
+    "config-sqlite-cant-create-db": "Coudna make database file <code>$1</code>.",
+    "config-sqlite-fts3-downgrade": "PHP is missing FTS3 support, doongradin buirds",
+    "config-can-upgrade": "Thaur's MediaWiki buirds in this database.\nTae upgrade thaim til MediaWiki $1, clap <strong>Continue</strong>.",
+    "config-upgrade-done": "Upgrade compleate.\n\nYe can nou [$1 stert uising yer wiki].\n\nGif ye wish tae regenerate yer <code>LocalSettings.php</code> file, clap the button ablow.\nThis <strong> isna recommended</strong> onless ye'r haein problems wi yer wiki.",
+    "config-upgrade-done-no-regenerate": "Upgrade compleate.\n\nYe can nou [$1 stert uising yer wiki].",
+    "config-regenerate": "Regênerate LocalSettings.php →",
+    "config-show-table-status": "<code>SHAW BUIRD STATUS</code> speirin failed!",
+    "config-unknown-collation": "<strong>Warnishment:</strong> Database is uisin onrecognized collation.",
+    "config-db-web-account": "Database accoont fer wab access",
+    "config-db-web-help": "Select the uisername n passwaird that the wab server will uise tae connect til the database server, durin ordinair operation o the wiki.",
+    "config-db-web-account-same": "Uise the same accoont aes fer installation",
+    "config-db-web-create": "Cræft the accoont gif it disna awreadie exeest",
+    "config-db-web-no-create-privs": "The accoont that ye speceefied fer instawation disna hae enooch preevileges tae cræft aen accoont.\nThe accoont that ye speceefie here maun awreadie exeest.",
+    "config-mysql-engine": "Storage engine:",
+    "config-mysql-innodb": "InnoDB",
+    "config-mysql-myisam": "MyISAM",
+    "config-mysql-myisam-dep": "<strong>Warnishment:</strong> Ye'v selected MyISAM aes storage engine fer MySQL, this isna recommended fer uiss wi MediaWiki, cause:\n* it barelie supports concurrencie cause o buird lockin\n* it's mair prone til rot than ither engines\n* the MediaWiki codebase disna aye haunnle MyISAM aes it shid\n\nGif yer MySQL installâtion supports InnoDB, it is heilie recommended that ye chuise that instead.\nGif yer MySQL installâtion disna support InnoDB, than perhaps it's time fer aen upgrade.",
+    "config-mysql-only-myisam-dep": "<strong>Warnishment:</strong> MyISAM is the yinly available storage engine fer MySQL oan this machine, n this isna recommended fer uiss wi MediaWiki, cause:\n* it barelie supports concurrencie cause o buird lockin\n* it is mair prone til rot than ither engines\n* the MediaWiki codebase disna aye haunnle MyISAM aes it shid\n\nYer MySQL installâtion dina support InnoDB, perhaps it's time fer aen upgrade.",
+    "config-mysql-engine-help": "<strong>InnoDB</strong> is awmaist aye the best optie, aes it haes guid concurrencie support.\n\n<strong>MyISAM</strong> micht be faster in single-uiser or read-yinly installâtions.\nMyISAM databases tend tae rot mair aften than InnoDB databases.",
+    "config-mysql-charset": "Database chairacter set:",
+    "config-mysql-binary": "Binarie",
+    "config-mysql-utf8": "UTF-8",
+    "config-mysql-charset-help": "In <strong>binarie mode</strong>, MediaWiki stores UTF-8 tex til the database in binarie fields.\nThis is mair effeecient than MySQL's UTF-8 mode, n permits ye tae uise the ful range o Unicode chairacters.\n\nIn <strong>UTF-8 mode</strong>, MySQL will ken whit chairacter set yer data is in, n can present n convert it appropreeatelie, but it'll naw lat ye store chairacters abuin the [//en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes Basic Multilingual Plane].",
+    "config-mssql-auth": "Authentication type:",
+    "config-mssql-install-auth": "Select the authentication type that's tae be uised tae connect wi the database durin the installation process.\nGif ye select \"{{int:config-mssql-windowsauth}}\", the credeentials o whitever uiser the wabserver is rinnin aes will be uised.",
+    "config-mssql-web-auth": "Select the authentication type that the wab server will uise tae connect wi the database server, durin ordinair operation o the wiki.\nGif ye select \"{{int:config-mssql-winowsauth}}\", the credeentials o whitever uiser the wabserver is rinnin aes will be uised.",
+    "config-mssql-sqlauth": "SQL Server Authentication",
+    "config-mssql-windowsauth": "Windows Authentication",
+    "config-site-name": "Name o wiki:",
+    "config-site-name-help": "This will kyth in the title baur o the brouser n in varioos ither places.",
+    "config-site-name-blank": "Enter ae site name.",
+    "config-project-namespace": "Waurk namespace:",
+    "config-ns-generic": "Waurk",
+    "config-ns-site-name": "Same aes the wiki name: $1",
+    "config-ns-other": "Ither (speceefie)",
+    "config-ns-other-default": "MaWiki",
+    "config-project-namespace-help": "Follaein Wikipedia's example, moni wikis keep their policy pages separate fae thair content pages, in ae \"'''project namespace'''\".\nAw page titles in this namespace stert wi ae certain prefix, that ye can speceefie here.\nUisuallie, this prefix is derived fae the name o the wiki, but it canna contain punctuation chairacters sic like \"#\" or \":\".",
+    "config-ns-invalid": "The speceefied namespace \"<nowiki>$1</nowiki>\" is onvalid.\nSpeceefie ae different project namespace.",
+    "config-ns-conflict": "The speceefied namespace \"<nowiki>$1</nowiki>\" conflicts wi ae defaut MediaWiki namespace.\nSpeceefie ae different project namespace.",
+    "config-admin-box": "Admeenistrater accoont",
+    "config-admin-name": "Yer uisername:",
+    "config-admin-password": "Passwaird:",
+    "config-admin-password-confirm": "Passwaird again:",
+    "config-admin-help": "Enter yer preferred uisername here, fer example \"John Smith\".\nThis is the name ye'll uise tae log in til the wiki.",
+    "config-admin-name-blank": "Enter aen admeenistrater uisername.",
+    "config-admin-name-invalid": "The speceefied uisername \"<nowiki>$1</nowiki>\" is onvalid.\nSpeceefie ae different uisername.",
+    "config-admin-password-blank": "Enter ae passwaird fer the admeenistrater accoont.",
+    "config-admin-password-mismatch": "The twa passwairds ye entered dinna match.",
+    "config-admin-email": "Wab-mail address:",
+    "config-admin-email-help": "Enter ae wab-mail address here tae permit ye tae receive wab-mail fae ither uisers oan the wiki, reset yer passwaird, n be telt o chynges til pages oan yer watchleet. Ye can lea this field tuim.",
+    "config-admin-error-user": "Internal mistak whan makin aen admeen wi the name \"<nowiki>$1</nowiki>\".",
+    "config-admin-error-password": "Internal mistak whan settin ae passwaird fer the admeen \"<nowiki>$1</nowiki>\": <pre>$2</pre>",
+    "config-admin-error-bademail": "Ye'v entered aen onvalid wab-mail address.",
+    "config-subscribe": "Subscribe til the [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce release annooncements mailin leet].",
+    "config-subscribe-help": "This is ae low-volume mailin leet uised fer release annooncements, inclæding important securitie annooncements.\nYe shid subscribe til it an update yer MediaWiki installâtion whan new versions come oot.",
+    "config-subscribe-noemail": "Ye tried tae subscribe til the release annooncements mailin let wioot giein ae wab-mail address.\nPlease gei ae wab-mail address gif ye wish tae subscribe til the mailin leet.",
+    "config-almost-done": "Ye'r awmaist dun!\nYe can nou skip the remainin confeegurâtion n install the wiki stricht awa.",
+    "config-optional-continue": "Speir me mair speirins.",
+    "config-optional-skip": "Ah'm bored awreadie, jyst install the wiki.",
+    "config-profile": "Uiser richts profile:",
+    "config-profile-wiki": "Apen wiki",
+    "config-profile-no-anon": "Please mak aen accoont",
+    "config-profile-fishbowl": "Permited eiditors yinly",
+    "config-profile-private": "Private wiki",
+    "config-profile-help": "Wikis wark best whan ye lat aes monie fawk eedit thaim aes possible.\nIn MediaWiki, it's easie tae luik ower the recent chynges, n tae revert onie damage that's dun bi naeeve or maleecioos uisers.\n\nHouever, monie hae foond MediaWiki tae be uissful in ae wide varietie o roles, n sometimes it isna easie tae conveence awbodie o the beneefits o the wiki wa.\nSae ye hae the choice.\n\nThe <strong>{{int:config-profile-wiki}}</strong> model permits oniebdie tae eedit, wioot even loggin in.\nAe wiki wi <strong>{{int:config-profile-no-anon}}</strong> provides eextra accoontabeelitie, but micht deter casual contreebuters.\n\nThe <strong>{{int:config-profile-fishbowl}}</strong> scenario permits appruived uisers tae eedit, but the publeec can see the pages, incluidin histerie.\nA <strong>{{int:config-profile-private}}</strong> yinlie permits appruived uisers tae see pages, wi the same groop permited tae eedit.\n\nMair complex uiser richts confeegurations ar available efter instawation, see the [//www.mediawiki.org/wiki/Manual:User_rights relevant manual entrie].",
+    "config-license": "Copiericht n license:",
+    "config-license-none": "Nae license fiter",
+    "config-license-cc-by-sa": "Creative Commyns Attribution Share Alike",
+    "config-license-cc-by": "Creative Commyns Attribution",
+    "config-license-cc-by-nc-sa": "Creative Commyns Attribution No-Commercial Shair Alike",
+    "config-license-cc-0": "Creative Commyns Zero (Public Domain)",
+    "config-license-gfdl": "GNU Free Documentâtion License 1.3 or later",
+    "config-license-pd": "Public Domain",
+    "config-license-cc-choose": "Select ae custym Creative Commyns license",
+    "config-license-help": "Monie publeec wikis pit aw contreebutions unner ae [http://freedomdefined.org/Defineetion free license].\nThis heelps tae cræft ae sense o communitie ainership n encoorages lang-term contreebution.\nIt's naw generallie necessarie fer ae private or corporate wiki.\n\nGif ye wish tae be able tae uise tex fae Wikipedia, n ye want Wikipedia tae be able tae accept tex copied fae yer wiki, ye shid chuise <strong>Creative Commyns Attribution Shair Alike</strong>.\n\nWikipædia preeveeooslie uised the GNU Free Documentation License.\nThe GFDL is ae valid license, but it's difficult tae unnerstaunn.\nIt's difficult tae reuise content licensed unner the GFDL ava.",
+    "config-email-settings": "Wab-mail settins",
+    "config-enable-email": "Enable ootboond wab-mail",
+    "config-enable-email-help": "Gif ye want wab-mail tae wark, [http://www.php.net/manual/en/mail.configuration.php PHP's mail settins] need tae be confeegured jyst richt.\nGif ye dinna want oni wab-mail features, ye can disable theim here.",
+    "config-email-user": "Enable uiser-til-uiser wab-mail",
+    "config-email-user-help": "Permit aw uisers tae send each ither wab-mail gif they'v enabled it in their preferences.",
+    "config-email-usertalk": "Enable uiser tauk page notifeecâtion",
+    "config-email-usertalk-help": "Permit uisers tae receive notifeecâtions oan uiser tauk page chynges, gif they'v enabled it in their preferences.",
+    "config-email-watchlist": "Enable watchleet notifeecâtion",
+    "config-email-watchlist-help": "Permit uisers tae receive notifeecâtions aneat their watched pages gif they'v enabled it in their preferences.",
+    "config-email-auth": "Enable wab-mail authenticâtion",
+    "config-email-auth-help": "Gif this optie is enabled, uisers hae tae confirm their wab-mail address uising ae link sent til theim whanivir they set or chynge it.\nYinly authenticated wab-mail addresses can receive emails fae ither uisers or chynge notifeecâtion wab-mails.\nSettin this optiei is <strong>recommended</strong> fer public wikis cause o potential abuise o the wab-mail features.",
+    "config-email-sender": "Return wab-mail address:",
+    "config-email-sender-help": "Enter the wab-mail address tae uise aes the return address oan ootboond wab-mail.\nThis is whaur boonces will be sent.\nMonie mail servers need at least the domain name pairt tae be valid.",
+    "config-upload-settings": "Eemages n file uplaids",
+    "config-upload-enable": "Enable file uplaids",
+    "config-upload-help": "File uplaids potentiallie expose yer server til securitie risks.\nFer mair information, read the [//www.mediawiki.org/wiki/Manual:Security securitie section] in the manual.\n\nTae enable file uplaids, chynge the mode oan the <code>eemages</code> subdirecterie unner MediaWiki's ruit directerie sae that the wab server can write til it.\nThan enable this optie.",
+    "config-upload-deleted": "Directerie fer delytit files:",
+    "config-upload-deleted-help": "Chuise ae directerie tae archive delytit files in.\nIdeally, this shidna be accessible fae the wab.",
+    "config-logo": "Logo URL:",
+    "config-logo-help": "MediaWiki's defaut skin inclædes space fer ae 135x160 pixel logo abuin the sidebaur menu.\nUplaid aen eemage o the appropriate size, n enter the URL here.\n\nYe can uise <code>$wgStylePath</code> or <code>$wgScriptPath</code> gif yer logo is relative til thae paths.\n\nGif ye dinna want ae logo, lea this kist blank.",
+    "config-instantcommons": "Enable Instant Commyns",
+    "config-instantcommons-help": "[//www.mediawiki.org/wiki/InstantCommons Instant Commyns] is ae featur that permits wikis tae uise eemages, soonds n ither media foond oan the [//commons.wikimedia.org/ Wikimedia Commyns] site.\nIn order tae dae this, MediaWiki needs access til the Internet.\n\nFer mair information oan this featur, incluidin instructions oan hou tae set it up fer wikis ither than the Wikimedia Commyns, consult [//mediawiki.org/wiki/Manual:$wgForeignFileRepos the manual].",
+    "config-cc-error": "The Creative Commyns license chuiser gae naw result.\nEnter the license name manually.",
+    "config-cc-again": "Pick again...",
+    "config-cc-not-chosen": "Chuise whit Creative Commyns license ye want an clap oan \"proceed\".",
+    "config-advanced-settings": "Advanced confeegurâtion",
+    "config-cache-options": "Settins fer object cachin:",
+    "config-cache-help": "Object cachin is uised tae impruiv the speed o MediaWiki bi cachin frequentlie uised data.\nMedium til muckle sites ar heilie encooraged tae enable this, n wee sites will see benefits ava.",
+    "config-cache-none": "Naw caching (nae functionâlitie is remuived, but speed mmicht be impacted oan muckler wiki sites)",
+    "config-cache-accel": "PHP object cachin (APC, XCache or WinCache)",
+    "config-cache-memcached": "Uise Memcached (needs addeetional setup n confeegurâtion)",
+    "config-memcached-servers": "Memcached servers:",
+    "config-memcached-help": "Leet o IP addresses tae uise fer Memcached.\nShid speceefie yin per line n speceefie the port tae be uised. Fer example:\n 127.0.0.1:11211\n 192.168.1.25:1234",
+    "config-memcache-needservers": "Ye selected Memcached aes yer cache type but dinna speceefie oni servers.",
+    "config-memcache-badip": "Ye'v entered aen onvalid IP address fer Memcached: $1.",
+    "config-memcache-noport": "Ye didna speceefie ae port tae uise fer Memcached server: $1.\nGif ye dinna knaw the port, the defauut is 11211.",
+    "config-memcache-badport": "Memcached port nummers shid be atween $1 n $2.",
+    "config-extensions": "Extensions",
+    "config-extensions-help": "The extensions leetit abuin were detected in yer <code>./extensions</code> directerie.\n\nThey micht need addeetional confeeguration, but ye can enable thaim nou.",
+    "config-install-alreadydone": "<strong>Warnishment:</strong> Ye seem tae'v awreadie instawed MediaWiki n ar tryin tae instaw it again.\nPlease proceed til the nex page.",
+    "config-install-begin": "Bi pressin \"{{int:config-continue}}\", ye will begin the installation o MediaWiki.\nGif ye still wish tae mak chynges, press \"{{int:config-back}}\".",
+    "config-install-step-done": "dun",
+    "config-install-step-failed": "failed",
+    "config-install-extensions": "Inclædin extensions",
+    "config-install-database": "Settin up database",
+    "config-install-schema": "Makin schema",
+    "config-install-pg-schema-not-exist": "PostgreSQL schema disna exeest.",
+    "config-install-pg-schema-failed": "Buirds makin failed.\nMak sair that the uiser \"$1\" can write til the schema \"$2\".",
+    "config-install-pg-commit": "Committin chynges",
+    "config-install-pg-plpgsql": "Checkin fer lied PL/pgSQL",
+    "config-pg-no-plpgsql": "Ye need tae install the leid PL/pgSQL in the database $1",
+    "config-pg-no-create-privs": "The accoont ye speceefied fer installâtion disna hae enough preevileges tae mak aen accoont.",
+    "config-pg-not-in-role": "The accoont that ye speceefied fer the wab uiser awreadie exists.\nThe accoont that ye specefied fer installâtion isna ae suiperuiser an isna a memmer o the wab uiser's role, sae it is onable tae mak objects ained bi the wab uiser.\n\nMediaWiki currentlie requires that the buirds be ained bi the wab uiser. Please specefie anither wab accoont name, or clap \"back\" an speceefie ae suitablie preevileged install uiser.",
+    "config-install-user": "Makin database uiser",
+    "config-install-user-alreadyexists": "Uiser \"$1\" awreadie exists",
+    "config-install-user-create-failed": "Makin uiser \"$1\" failed: $2",
+    "config-install-user-grant-failed": "Grantin permission til uiser \"$1\" failed: $2",
+    "config-install-user-missing": "The speceefied uiser \"$1\" disna exeest.",
+    "config-install-user-missing-create": "The speceefied uiser \"$1\" disna exeest.\nPlease clap the \"cræft accoont\" checkkist ablo gif ye wish tae cræft it.",
+    "config-install-tables": "Makin buirds",
+    "config-install-tables-exist": "<strong>Warnishment:</strong> MediaWiki buirds awreadie seem tae exeest.\nSkippin the cræftin.",
+    "config-install-tables-failed": "<strong>Mistak:</strong> Buird cræftin failed wi the follaein mistak: $1",
+    "config-install-interwiki": "Populatin defaut interwiki buird",
+    "config-install-interwiki-list": "Coudna read file <code>interwiki.list</code>.",
+    "config-install-interwiki-exists": "<strong>Warnishment:</strong> The interwiki buird awreadie seems tae hae entries.\nSkippin defaut let.",
+    "config-install-stats": "Ineetializin stateestics",
+    "config-install-keys": "Generatin hidlins keys",
+    "config-insecure-keys": "<strong>Warnishment:</strong> {{PLURAL:$2|Ae secure key|Secure keys}} ($1) generated durin instawation {{PLURAL:$2|is|ar}} naw compleatelie safe. Consider chyngin {{PLURAL:$2|it|theim}} manuallie.",
+    "config-install-sysop": "Makin admeenistrâter uiser accoont",
+    "config-install-subscribe-fail": "Onable tae subscribe til mediawiki-announce: $1",
+    "config-install-subscribe-notpossible": "cURL isna instawed n allow_url_fopen isna available.",
+    "config-install-mainpage": "Cræftin main page wi defaut content",
+    "config-install-extension-tables": "Makin buirds fer enabled extensions",
+    "config-install-mainpage-failed": "Coudna insert main page: $1",
+    "config-install-done": "<strong>Congratulations!</strong>\nYe'v successfulie instawed MediaWiki.\n\nThe instawer haes generated ae <code>LocalSettings.php</code> file.\nIt contains aw yer confeeguration.\n\nYe'll need tae doonlaid it n pit it in the base o yer wiki instawation (the same directerie aes index.php). The doonlaid shid hae stairted autæmateeclie.\n\nGif the doonlaid wisna affered, or gif ye cancelled it, ye can restairt the doonlaid bi clapin oan the airtin ablo:\n\n$3\n\n<strong>Mynd:</strong> Gif ye dinna dae this the nou, this generated confeeguration file willna be available til ye laiter gif ye exit the instawation wioot doonlaidin it.\n\nWhan that haes been dun, ye can <strong>[$2 enter yer wiki]</strong>.",
+    "config-download-localsettings": "Dounlaid <code>LocalSettings.php</code>",
+    "config-help": "heelp",
+    "config-nofile": "File \"$1\" coudna be foond. Haes it been delytit?",
+    "config-extension-link": "Did ye ken that yer wiki supports [//www.mediawiki.org/wiki/Manual:Extensions extensions]?\n\nYe can brouse [//www.mediawiki.org/wiki/Category:Extensions_by_category extensions bi categorie] or the [//www.mediawiki.org/wiki/Extension_Matrix Extension Matrix] tae see the full leet o extensions.",
+    "mainpagetext": "<strong>MediaWiki haes been installit wi speed.</strong>",
+    "mainpagedocfooter": "Consult the [//meta.wikimedia.org/wiki/Help:Contents Uiser's Guide] fer informâtion oan uising the wiki saffware.\n\n== Gettin stairted ==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Confeegurâtion settins leet]\n* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailin leet]\n* [//www.mediawiki.org/wiki/Localisation#Translation_resources Localise MediaWiki fer yer leid]"
+}
index 8fb65a7..eac9d44 100644 (file)
@@ -1,7 +1,18 @@
 {
     "@metadata": {
-        "authors": []
+        "authors": [
+            "Jun Misugi"
+        ]
     },
+    "config-title": "Isthallazioni di MediaWiki $1",
+    "config-information": "Infuimmazioni",
+    "config-localsettings-key": "Ciabi di attuarizazioni",
+    "config-your-language": "Linga tòia",
+    "config-wiki-language": "Linga di la Vichi",
+    "config-back": "← Indareddu",
+    "config-continue": "Continuà →",
+    "config-page-language": "Linga",
+    "config-page-welcome": "Binvinuddi in MediaWiki!",
     "mainpagetext": "'''Isthallazioni di MediaWiki accabadda currentementi.'''",
     "mainpagedocfooter": "Cunsultha la [//meta.wikimedia.org/wiki/Aggiuddu:Summàriu Ghia utenti] pa maggiori infuimmazioni i l'usu di chisthu software wiki.\n\n== Pa ischuminzà ==\nLi sighenti cullegamenti so in linga ingrese:\n\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Impusthazioni di cunfigurazioni]\n* [//www.mediawiki.org/wiki/Manual:FAQ Prigonti friquenti i MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Mailing list annùnzii MediaWiki]"
-}
\ No newline at end of file
+}
index 3d46a56..ec5b736 100644 (file)
@@ -1,6 +1,4 @@
 {
-    "@metadata": {
-        "authors": []
-    },
+    "@metadata": [],
     "mainpagetext": "'''MediaWiki coccebj installöx successua zo mii.'''"
-}
\ No newline at end of file
+}
index c372fa4..176d91e 100644 (file)
@@ -6,4 +6,4 @@
     },
     "mainpagetext": "'''MediaWiki softver is uspješno instaliran.'''",
     "mainpagedocfooter": "Kontaktirajte [//meta.wikimedia.org/wiki/Help:Contents uputstva za korisnike] za informacije o upotrebi wiki programa.\n\n== Početak ==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Lista postavki]\n* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki najčešće postavljana pitanja]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lista E-Mail adresa MediaWiki]"
-}
\ No newline at end of file
+}
index 09bbf18..8d4688b 100644 (file)
@@ -6,4 +6,4 @@
     },
     "mainpagetext": "'''MediaWiki tǧizn (tsrbk) bla tamukrist.'''",
     "mainpagedocfooter": "Ẓr taǧttnn  [//meta.wikimedia.org/wiki/Aide:Contenu Guide de l’utilisateur] bac ad tawit inɣmisn yaḍn f manik sa tswwurt asɣẓan ad.\n\n== Izwir d MediaWiki ==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Umuɣ n iɣwwarn n usgadda ]\n* [//www.mediawiki.org/wiki/Manual:FAQ/fr Isqqsitn f MidyWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Umuɣ n imsgdaln f imbḍitn n MidyaWiki]"
-}
\ No newline at end of file
+}
index f4b1dc1..4493d5f 100644 (file)
@@ -2,7 +2,8 @@
     "@metadata": {
         "authors": [
             "Singhalawap",
-            "පසිඳු කාවින්ද"
+            "පසිඳු කාවින්ද",
+            "Sahan.ssw"
         ]
     },
     "config-desc": "මාධ්‍යවිකි සඳහා වූ ස්ථාපකය",
@@ -66,6 +67,7 @@
     "config-mysql-myisam": "MyISAM",
     "config-mysql-binary": "ද්විමය",
     "config-mysql-utf8": "UTF-8",
+    "config-mssql-windowsauth": "windows සහතික කිරීම.",
     "config-site-name": "විකියෙහි නම:",
     "config-site-name-blank": "අඩවි නාමයක් යොදන්න.",
     "config-project-namespace": "ව්‍යාපෘතියේ නාමඅවකාශය:",
     "config-ns-other": "වෙනත් (විශේෂණය කරන්න)",
     "config-ns-other-default": "මගේවිකිය",
     "config-admin-box": "පරිපාලක ගිණුම",
-    "config-admin-name": "à¶\94බà·\9a à¶±à¶¸:",
+    "config-admin-name": "à¶\94බà·\9a à¶´à¶»à·\92à·\81à·\93ලà¶\9a à¶±à·\8fමය:",
     "config-admin-password": "මුරපදය:",
     "config-admin-password-confirm": "මුරපදය නැවතත්:",
     "config-admin-name-blank": "පරිපාලක පරිශීලක නාමය යොදන්න.",
     "config-admin-password-blank": "පරිපාලක ගිණුම සඳහා මුරපදය යොදන්න.",
-    "config-admin-password-same": "මුරපදය හා පරිශීලක නාමය එක සමාන නොවිය යුතුය.",
     "config-admin-password-mismatch": "ඔබ ඇතුළු කල මුරපද දෙක නොගැලපේ.",
     "config-admin-email": "විද්‍යුත්-තැපැල් ලිපිනය:",
     "config-admin-error-bademail": "ඔබ විසින් වලංගු නොවන විද්‍යුත්-ලිපිනයක් යොදා ඇත.",
     "config-nofile": "\"$1\" ගොනුව සොයාගත නොහැක. එක මැකිලා ගියාවත්ද?",
     "mainpagetext": "'''මීඩියාවිකි සාර්ථක ලෙස ස්ථාපනය කරන ලදි.'''",
     "mainpagedocfooter": "විකි මෘදුකාංග භාවිතා කිරීම පිළිබඳ තොරතුරු සඳහා  [//meta.wikimedia.org/wiki/Help:Contents පරිශීලකයන් සඳහා නියමුව] හදාරන්න.\n\n== ඇරඹුම ==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings වින්‍යාස සැකසුම්]\n* [//www.mediawiki.org/wiki/Manual:FAQ මීඩියාවිකි නිති-විමසන-පැන]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce මීඩියාවිකි නිකුතුව තැපැල් ලැයිස්තුව]"
-}
\ No newline at end of file
+}
index d98409e..eb9aac7 100644 (file)
@@ -1,16 +1,60 @@
 {
     "@metadata": {
         "authors": [
-            "Kusavica"
+            "Kusavica",
+            "KuboF"
         ]
     },
+    "config-desc": "Inštalátor pre MediaWiki",
+    "config-title": "Inštalácia MediaWiki $1",
+    "config-information": "Informácie",
+    "config-localsettings-key": "Aktualizačný kľúč:",
+    "config-localsettings-badkey": "Zadaný kľúč je nesprávny.",
     "config-your-language": "Váš jazyk:",
+    "config-your-language-help": "Vyberte jazyk, ktorý chcete použiť počas inštalácie.",
     "config-wiki-language": "Wiki jazyk:",
+    "config-wiki-language-help": "Vyberte jazyk, v ktorom bude wiki napísaná.",
     "config-back": "← Späť",
     "config-continue": "Pokračovať →",
     "config-page-language": "Jazyk",
+    "config-page-welcome": "Vitajte na MediaWiki!",
+    "config-page-dbconnect": "Pripojiť sa k databáze",
+    "config-page-upgrade": "Aktualizovať existujúcu inštaláciu",
+    "config-page-dbsettings": "Nastavenie databázy",
+    "config-page-name": "Názov",
+    "config-page-options": "Možnosti",
+    "config-page-install": "Inštalovať",
+    "config-page-complete": "Dokončené",
+    "config-page-restart": "Reštartovať inštaláciu",
+    "config-page-readme": "Čítaj ma",
+    "config-page-releasenotes": "Poznámky k vydaniu",
+    "config-help-restart": "Chcete vymazať všetky uložené dáta, ktoré ste zadali a reštartovať proces inštalácie?",
+    "config-restart": "Áno, reštartovať",
+    "config-env-php": "PHP $1 je nainštalované.",
+    "config-env-php-toolow": "PHP $1 je nainštalované. Avšak, MediaWiki vyžaduje PHP $2 alebo vyššie.",
+    "config-missing-db-name": "Musíte zadať hodnotu pre \"{{int:config-db-name}}\".",
+    "config-missing-db-host": "Musíte zadať hodnotu pre \"{{int:config-db-host}}\".",
+    "config-missing-db-server-oracle": "Musíte zadať hodnotu pre \"{{int:config-db-host-oracle}}\".",
+    "config-admin-name": "Vaše používateľské meno:",
+    "config-admin-password": "Heslo:",
+    "config-admin-password-confirm": "Zopakuj heslo:",
+    "config-admin-name-blank": "Zadajte používateľské meno správcu.",
+    "config-admin-name-invalid": "Zadané používateľské meno \"<nowiki>$1</nowiki>\" je neplatné. \nZadajte iné meno.",
+    "config-admin-password-blank": "Zadajte heslo ku správcovskému účtu.",
+    "config-admin-password-mismatch": "Zadané heslá sa nezhodujú.",
+    "config-admin-email": "Emailová adresa:",
+    "config-admin-error-bademail": "Zadali ste neplatnú emailovú adresu.",
+    "config-optional-continue": "Opýtaj sa ma ďalšie otázky.",
+    "config-optional-skip": "Už ma to nudí, proste nainštaluj wiki.",
+    "config-profile-wiki": "Otvorená wiki",
+    "config-profile-private": "Súkromná wiki",
+    "config-email-settings": "Nastavenia e-mailu",
+    "config-install-user-alreadyexists": "Používateľ \"$1\" už existuje",
+    "config-install-tables-failed": "<strong>Chyba:</strong> Vytvorenie tabuľky zlyhalo s nasledujúcou chybou: $1",
     "config-download-localsettings": "Stiahnuť <code>LocalSettings.php</code>",
+    "config-help": "nápoveda",
     "config-nofile": "Súbor \"$1\" sa nenašiel. Bol zmazaný?",
+    "config-extension-link": "Vedeli ste, že vaša wiki podporuje [//www.mediawiki.org/wiki/Manual:Extensions rozšírenia]?\nMôžete hľadať rozšírenia [//www.mediawiki.org/wiki/Category:Extensions_by_category podľa kategórie] alebo si pozrite [//www.mediawiki.org/wiki/Extension_Matrix Extension Matrix] -  kompletný zoznam rozšírení.",
     "mainpagetext": "'''Softvér MediaWiki bol úspešne nainštalovaný.'''",
-    "mainpagedocfooter": "Informácie ako používať wiki softvér nájdete v [//meta.wikimedia.org/wiki/Help:Contents Používateľskej príručke].\n\n== Začíname ==\n\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Zoznam konfiguračných nastavení]\n* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce mailing list nových verzií MediaWiki]"
-}
\ No newline at end of file
+    "mainpagedocfooter": "Informácie ako používať wiki softvér nájdete v [//meta.wikimedia.org/wiki/Help:Contents Používateľskej príručke].\n\n== Začíname ==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Zoznam konfiguračných nastavení]\n* [//www.mediawiki.org/wiki/Manual:FAQ Časté otázky o MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce E-poštová konferencia oznámení o MediaWiki]\n* [//www.mediawiki.org/wiki/Localisation#Translation_resources Preklad MediaWiki do vášho jazyka]"
+}
index b5afd87..6b1e9c2 100644 (file)
     "config-ns-invalid": "Naveden imenski prostor »<nowiki>$1</nowiki>« ni veljaven.\nDoločite drug imenski prostor projekta.",
     "config-ns-conflict": "Naveden imenski prostor »<nowiki>$1</nowiki>« je v sporu s privzetim imenskim prostorom MediaWiki.\nDoločite drug imenski prostor projekta.",
     "config-admin-box": "Administratorski račun",
-    "config-admin-name": "Vaše ime:",
+    "config-admin-name": "Vaše uporabniško ime:",
     "config-admin-password": "Geslo:",
     "config-admin-password-confirm": "Geslo, ponovno:",
     "config-admin-help": "Tukaj vnesite želeno uporabniško ime, na primer »Janez Blog«.\nTo je ime, ki ga boste uporabljali za prijavo v wiki.",
     "config-admin-name-blank": "Vnesite uporabniško ime administratorja.",
     "config-admin-name-invalid": "Navedeno uporabniško ime »<nowiki>$1</nowiki>« ni veljavno.\nDoločite drugo uporabniško ime.",
     "config-admin-password-blank": "Vnesite geslo za administratorski račun.",
-    "config-admin-password-same": "Geslo ne sme biti enako kot uporabniško ime.",
     "config-admin-password-mismatch": "Vneseni gesli se ne ujemata.",
     "config-admin-email": "E-poštni naslov:",
     "config-admin-error-user": "Med ustvarjanjem administratorja »<nowiki>$1</nowiki>« je prišlo do notranje napake.",
     "config-help": "pomoč",
     "mainpagetext": "'''Programje MediaWiki je bilo uspešno nameščeno.'''",
     "mainpagedocfooter": "Oglejte si [//meta.wikimedia.org/wiki/Help:Contents Uporabniški priročnik] za informacije o uporabi programja wiki.\n\n== Kako začeti ==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Seznam konfiguracijskih nastavitev]\n* [//www.mediawiki.org/wiki/Manual:FAQ Poogsto zastavljena vprašanja MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Poštni seznam izdaj MediaWiki]\n* [//www.mediawiki.org/wiki/Localisation#Translation_resources Prevedite MediaWiki v svoj jezik]"
-}
\ No newline at end of file
+}
index 4f82151..f7c5131 100644 (file)
@@ -6,4 +6,4 @@
     },
     "mainpagetext": "'''MediaWiki wourde erfolgreich installiert.'''",
     "mainpagedocfooter": "Hilfe zur Benutzung und Konfiguration der Wiki-Software fendest du eim [//meta.wikimedia.org/wiki/Help:Contents Benutzerhandbichl].\n\n== Stoarthilfa ==\n\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Liste der Konfigurationsvariablen]\n* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki-FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Mailingliste neuer MediaWiki-Versionen]"
-}
\ No newline at end of file
+}
index 0344c5a..e664f74 100644 (file)
@@ -6,4 +6,4 @@
     },
     "mainpagetext": "'''MediaWiki Si fiican oo kuugu install gareeyay.'''",
     "mainpagedocfooter": "Meeshaan ka akhriso sidii aad u isticmaali leheed brogramka wiki [//meta.wikimedia.org/wiki/Help:Contents User's Guide]  .\n== Bilaaw ==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Configuration settings list]\n* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]"
-}
\ No newline at end of file
+}
index a9ef652..281b2c7 100644 (file)
@@ -1,7 +1,5 @@
 {
-    "@metadata": {
-        "authors": []
-    },
+    "@metadata": [],
     "mainpagetext": "'''MediaWiki software u instalua me sukses.'''",
     "mainpagedocfooter": "Për më shumë informata rreth përdorimit të softwerit wiki , ju lutem shikoni [//meta.wikimedia.org/wiki/Help:Contents dokumentacionin përkatës].\n\n== Sa për fillim==\n* [//www.mediawiki.org/wiki/Help:Configuration_settings Parazgjedhjet e MediaWiki-t]\n* [//www.mediawiki.org/wiki/Help:FAQ Pyetjet e shpeshta rreth MediaWiki-t]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Njoftime rreth MediaWiki-t]"
-}
\ No newline at end of file
+}
index 87a119a..b463926 100644 (file)
@@ -2,9 +2,13 @@
     "@metadata": {
         "authors": [
             "Rancher",
-            "Михајло Анђелковић"
+            "Михајло Анђелковић",
+            "Milicevic01"
         ]
     },
+    "config-desc": "Инсталација за Медијавики",
+    "config-title": "Инсталација Медијавикија $1",
+    "config-information": "Информације",
     "config-session-error": "Грешка при започињању сесије: $1",
     "config-session-expired": "Ваши подаци о сесији су истекли.\nСесије су подешене да трају $1.\nЊихов рок можете повећати постављањем <code>session.gc_maxlifetime</code> у php.ini.\nПоново покрените инсталацију.",
     "config-no-session": "Ваши подаци о сесији су изгубљени!\nПроверите Ваш php.ini и обезбедите да је <code>session.save_path</code> постављен на одговарајући директоријум.",
     "config-page-install": "Инсталирај",
     "config-page-complete": "Завршено!",
     "config-page-restart": "Поновно покретање инсталације",
+    "config-page-readme": "Прочитај ме",
+    "config-page-releasenotes": "Белешке издања",
     "config-page-copying": "Умножавање",
     "config-page-upgradedoc": "Надоградња",
     "config-page-existingwiki": "Постојећи вики",
     "config-help-restart": "Желите ли да обришете све сачуване податке које сте унели и поново покренете инсталацију?",
     "config-restart": "Да, покрени поново",
-    "config-type-mysql": "MySQL",
+    "config-env-php": "PHP $1 је инсталиран.",
+    "config-xcache": "[http://xcache.lighttpd.net/ XCache] је инсталиран",
+    "config-apc": "[http://www.php.net/apc APC] је инсталиран",
+    "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache] је инсталиран",
+    "config-db-type": "Тип базе података:",
+    "config-db-host": "Хост базе података",
+    "config-db-name": "Назив базе података:",
+    "config-type-mysql": "MySQL (или компактибилан)",
     "config-type-postgres": "PostgreSQL",
     "config-type-sqlite": "SQLite",
     "config-type-oracle": "Oracle",
+    "config-type-mssql": "Microsoft SQL Server",
+    "config-header-mysql": "MySQL подешавања",
+    "config-header-mssql": "Поставке Microsoft SQL Server-а",
+    "config-mssql-old": "Потребан је Microsoft SQL Server $1 или новији. Ви имате $2.",
+    "config-mysql-innodb": "InnoDB",
+    "config-mysql-myisam": "MyISAM",
+    "config-mysql-utf8": "UTF-8",
+    "config-mssql-auth": "Тип провере идентитета:",
+    "config-mssql-sqlauth": "Провера идентитета за SQL Server",
+    "config-mssql-windowsauth": "Провера идентитета Windows-а",
+    "config-admin-name": "Корисничко име:",
+    "config-admin-password": "Лозинка:",
+    "config-admin-email": "Адреса е-поште:",
+    "config-license": "Ауторска права и лиценца:",
+    "config-license-none": "Без заглавља са лиценцом",
+    "config-license-cc-by-sa": "Creative Commons Ауторство-Делити под истим условима (CC BY-SA)",
+    "config-license-cc-by": "Creative Commons Ауторство (CC BY)",
+    "config-license-cc-by-nc-sa": "Creative Commons Ауторство-Некомерцијално-Делити под истим условима (CC BY-NC-SA)",
+    "config-license-gfdl": "ГНУ-ова лиценца за слободну документацију верзија 1.3 или новија верзија",
+    "config-license-pd": "Јавно власништво",
     "mainpagetext": "'''Медијавики је успешно инсталиран.'''",
     "mainpagedocfooter": "Погледајте [//meta.wikimedia.org/wiki/Help:Contents кориснички водич] за коришћење програма.\n\n== Увод ==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Помоћ у вези са подешавањима]\n* [//www.mediawiki.org/wiki/Manual:FAQ Често постављена питања]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Дописна листа о издањима Медијавикија]"
-}
\ No newline at end of file
+}
index ef1c320..943c1de 100644 (file)
@@ -1,7 +1,5 @@
 {
-    "@metadata": {
-        "authors": []
-    },
+    "@metadata": [],
     "config-session-error": "Greška pri započinjanju sesije: $1",
     "config-session-expired": "Vaši podaci o sesiji su istekli.\nSesije su podešene da traju $1.\nNjihov rok možete povećati postavljanjem <code>session.gc_maxlifetime</code> u php.ini.\nPonovo pokrenite instalaciju.",
     "config-no-session": "Vaši podaci o sesiji su izgubljeni!\nProverite Vaš php.ini i obezbedite da je <code>session.save_path</code> postavljen na odgovarajući direktorijum.",
@@ -32,4 +30,4 @@
     "config-type-oracle": "Oracle",
     "mainpagetext": "'''MedijaViki je uspešno instaliran.'''",
     "mainpagedocfooter": "Molimo vidite [//meta.wikimedia.org/wiki/Help:Contents korisnički vodič] za informacije o upotrebi viki softvera.\n\n== Za početak ==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Pomoć u vezi sa podešavanjima]\n* [//www.mediawiki.org/wiki/Manual:FAQ Najčešće postavljena pitanja]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Mejling lista o izdanjima MedijaVikija]"
-}
\ No newline at end of file
+}
index a535dcb..bd74813 100644 (file)
@@ -1,7 +1,5 @@
 {
-    "@metadata": {
-        "authors": []
-    },
+    "@metadata": [],
     "mainpagetext": "'''MediaWiki seti kon bun.'''",
     "mainpagedocfooter": "Luku na ini a [//meta.wikimedia.org/wiki/Help:Yepi yepibuku] fu si fa fu kebrouki a wikisoftware.\n\n== Moro yepi ==\n\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Den seti]\n* [//www.mediawiki.org/wiki/Manual:FAQ Sani di ben aksi furu (FAQ)]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Boskopu grupu gi nyun meki]"
-}
\ No newline at end of file
+}
index ab02e91..4e0d09e 100644 (file)
@@ -1,6 +1,4 @@
 {
-    "@metadata": {
-        "authors": []
-    },
+    "@metadata": [],
     "mainpagetext": "'''i-MediaWiki seyifakeke ngalokuphelele.'''"
-}
\ No newline at end of file
+}
index abee1ef..90fc796 100644 (file)
@@ -6,4 +6,4 @@
     },
     "mainpagetext": "'''Ju MediaWiki Software wuude mäd Ärfoulch installierd.'''",
     "mainpagedocfooter": "Sjuch ju [//meta.wikimedia.org/wiki/MediaWiki_localization Dokumentation tou de Anpaasenge fon dän Benutseruurfläche] un dät [//meta.wikimedia.org/wiki/Help:Contents Benutserhondbouk] foar Hälpe tou ju Benutsenge un Konfiguration."
-}
\ No newline at end of file
+}
index 920e7ab..f978879 100644 (file)
@@ -1,7 +1,5 @@
 {
-    "@metadata": {
-        "authors": []
-    },
+    "@metadata": [],
     "mainpagetext": "'''''Software'' MediaWiki geus diinstal.'''",
     "mainpagedocfooter": "Mangga tingal ''[//meta.wikimedia.org/wiki/MediaWiki_localisation documentation on customizing the interface]'' jeung [//meta.wikimedia.org/wiki/MediaWiki_User%27s_Guide Tungtunan Pamaké] pikeun pitulung maké jeung konfigurasi."
-}
\ No newline at end of file
+}
index 48f9c68..988e3d9 100644 (file)
@@ -3,21 +3,27 @@
         "authors": [
             "Jopparn",
             "Skalman",
-            "WikiPhoenix"
+            "WikiPhoenix",
+            "Josve05a",
+            "Lokal Profil",
+            "Tobulos1"
         ]
     },
-    "config-desc": "Installationsprogram för MediaWiki",
+    "config-desc": "Installationsprogrammet för MediaWiki",
     "config-title": "Installation av MediaWiki $1",
     "config-information": "Information",
     "config-localsettings-upgrade": "A <code>LocalSettings.php</code>-fil har upptäckts.\nFör att uppgradera den här installationen, vänligen ange värdet för <code>$wgUpgradeKey</code> i rutan nedan.\nDu hittar den i <code>LocalSettings.php</code>.",
     "config-localsettings-cli-upgrade": "En <code>LocalSettings.php</code>-fil har upptäckts.\nFör att uppgradera denna installation, kör <code>update.php</code> istället",
     "config-localsettings-key": "Uppgraderingsnyckel:",
     "config-localsettings-badkey": "Nyckeln du angav är inkorrekt.",
-    "config-upgrade-key-missing": "En nuvarande installerade av MediaWiki har upptäckts.\nFör att uppgradera installationen, lägg till följande rad i slutet av din <code>LocalSettings.php</code>:\n\n$1",
-    "config-localsettings-incomplete": "De befintliga <code>LocalSettings.php</code> verkar vara ofullständig.\nVariabeln $1 är inte inställd.\nÄndra <code>LocalSettings.php</code> så att denna variabel är inställd och klicka på \"{{int:Config-continue}}\".",
+    "config-upgrade-key-missing": "En existerande installation av MediaWiki har upptäckts.\nFör att uppgradera installationen, lägg till följande rad i slutet av din <code>LocalSettings.php</code>:\n\n$1",
+    "config-localsettings-incomplete": "Den befintliga <code>LocalSettings.php</code> verkar vara ofullständig.\nVariabeln $1 är inte inställd.\nÄndra <code>LocalSettings.php</code> så att denna variabel är inställd och klicka på \"{{int:Config-continue}}\".",
+    "config-localsettings-connection-error": "Ett fel uppstod vid anslutning till databasen med inställningarna angivna i <code>LocalSettings.php</code>. Vänligen åtgärda dessa inställningar och försök igen.\n\n$1",
     "config-session-error": "Fel vid uppstart av session: $1",
+    "config-session-expired": "Dina sessionsdata verkar har gått ut.\nSessioner är konfigurerade för en livstid på $1.\nDu kan öka denna genom att ange <code>session.gc_maxlifetime</code> i php.ini.\nStarta om installationen.",
+    "config-no-session": "Din sessionsdata förlorades!\nKolla din php.ini och se till att <code>session.save_path</code> är inställd på en lämplig katalog.",
     "config-your-language": "Ditt språk:",
-    "config-your-language-help": "Välj ett språk som ska användas under installationen.",
+    "config-your-language-help": "Välj ett språk att använda under installationen.",
     "config-wiki-language": "Wikispråk:",
     "config-wiki-language-help": "Välj det språk som wikin främst kommer att skrivas i.",
     "config-back": "← Tillbaka",
     "config-page-copying": "Kopiering",
     "config-page-upgradedoc": "Uppgradering",
     "config-page-existingwiki": "Befintlig wiki",
-    "config-help-restart": "Vill du rensa all sparad data som du har skrivit in och starta om installationen?",
+    "config-help-restart": "Vill du rensa all sparad data som du har angivit och starta om installationen?",
     "config-restart": "Ja, starta om",
-    "config-sidebar": "* [//www.mediawiki.org MediaWikis hemsida]\n* [//www.mediawiki.org/wiki/Help:Contents Användarguide]\n* [//www.mediawiki.org/wiki/Manual:Contents Administratörguide]\n* [//www.mediawiki.org/wiki/Manual:FAQ Frågor och svar]\n----\n* <doclink href=Readme>Läs mig</doclink>\n* <doclink href=ReleaseNotes>Utgivningsanteckningar</doclink>\n* <doclink href=Copying>Kopiering</doclink>\n* <doclink href=UpgradeDoc>Uppgradering</doclink>",
+    "config-welcome": "=== Miljökontroller ===\nGrundläggande kontroller kommer nu att utföras för att se om denna miljö är lämplig för installation av MediaWiki.\nKom ihåg att ta med denna information om du söker stöd för hur du skall slutföra installationen.",
+    "config-copyright": "=== Upphovsrätt och Villkor ===\n\n$1\n\nDetta program är fri programvara; du kan vidaredistribuera den och/eller modifiera det enligt villkoren i GNU General Public License som publicerats av Free Software Foundation; antingen genom version 2 av licensen, eller (på ditt initiativ) någon senare version.\n\nDetta program är distribuerat i hopp om att det kommer att vara användbart, men '''utan någon garanti'''; utan att ens ha en underförstådd garanti om '''säljbarhet''' eller '''lämplighet för ett särskilt ändamål'''.\nSe GNU General Public License för mer detaljer.\n\nDu bör ha fått <doclink href=Copying>en kopia av GNU General Public License</doclink> tillsammans med detta program; om inte, skriv till Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA, eller [http://www.gnu.org/copyleft/gpl.html läs den online].",
+    "config-sidebar": "* [//www.mediawiki.org MediaWikis webbplats]\n* [//www.mediawiki.org/wiki/Help:Contents Användarguide]\n* [//www.mediawiki.org/wiki/Manual:Contents Administratörguide]\n* [//www.mediawiki.org/wiki/Manual:FAQ Frågor och svar]\n----\n* <doclink href=Readme>Läs mig</doclink>\n* <doclink href=ReleaseNotes>Utgivningsanteckningar</doclink>\n* <doclink href=Copying>Kopiering</doclink>\n* <doclink href=UpgradeDoc>Uppgradering</doclink>",
     "config-env-good": "Miljön har kontrollerats.\nDu kan installera MediaWiki.",
     "config-env-bad": "Miljön har kontrollerats.\nDu kan inte installera MediaWiki.",
-    "config-env-php": "PHP $1 är installerad.",
-    "config-env-php-toolow": "PHP $1 är installerad.\nMediaWiki kräver PHP $2 eller högre.",
+    "config-env-php": "PHP $1 är installerat.",
+    "config-env-php-toolow": "PHP $1 är installerat.\nMediaWiki kräver PHP $2 eller högre.",
+    "config-unicode-using-utf8": "Använder Brion Vibbers utf8_normalize.so för Unicode-normalisering.",
+    "config-unicode-using-intl": "Använder [http://pecl.php.net/intl intl PECL-tillägget] för Unicode-normalisering.",
+    "config-unicode-pure-php-warning": "'''Varning:''' [http://pecl.php.net/intl intl PECL-tillägget] är inte tillgängligt för att hantera Unicode-normalisering, faller tillbaka till en långsamt implementering i ren PHP.\nOm du driver en högtrafikerad webbplats bör du läsa lite om [//www.mediawiki.org/wiki/Unicode_normalization_considerations Unicode-normalisering].",
+    "config-unicode-update-warning": "'''Varning:''' Den installerade versionen av Unicode-normaliserings \"wrappern\" använder en äldre version av [http://site.icu-project.org/ ICU projektets] bibliotek.\nDu bör [//www.mediawiki.org/wiki/Unicode_normalization_considerations uppgradera] om är intresserad av att använda Unicode.",
+    "config-no-db": "Kunde inte hitta en lämplig databasdrivrutin! Du måste installera en databasdrivrutin för PHP.\nFöljande databastyper stöds: $1.\n\nI du själv kompilerat din PHP, konfigurera den med en databasklient aktiverad genom att t.ex. använda <code>./configure --with-mysqli</code>.\nOm du installerade PHP från ett Debian- eller Ubuntupaket måste du även installera, t.ex. <code>php5-mysql</code>-paketet.",
     "config-outdated-sqlite": "'''Varning:''' du har SQLite $1, vilket är lägre än minimikravet version $2. SQLite kommer inte att vara tillgänglig.",
-    "config-register-globals": "'''Varning: PHP:s <code>[http://php.net/register_globals register_globals]</code> tillval är aktiverat.'''\n'''Inaktivera den om du kan.'''\nMediaWiki kommer att fungera, men din server exponeras för potentiella säkerhetsluckor.",
-    "config-safe-mode": "''' Varning:''' PHP:s [http://www.php.net/features.safe-mode felsäkert läge] är aktivt.\nDet kan orsaka problem, särskilt om du använder filöverföringar och <code>math</code>-stöd.",
+    "config-no-fts3": "'''Varning:''' SQLite kompileras utan [//sqlite.org/fts3.html FTS3-modulen], sökfunktioner kommer att vara otillgängliga på denna backend.",
+    "config-register-globals": "'''Varning: PHP:s <code>[http://php.net/register_globals register_globals]</code>-tillval är aktiverat.'''\n'''Inaktivera den om du kan.'''\nMediaWiki kommer att fungera, men din server exponeras för potentiella säkerhetshål.",
+    "config-magic-quotes-runtime": "'''Kritiskt: [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-runtime magic_quotes_runtime] är aktiv!'''\nDetta alternativ korrumperar inmatad data oförutsägbart.\nDu kan inte installera eller använda MediaWiki om detta alternativ är aktiverat.",
+    "config-magic-quotes-sybase": "'''Kritiskt: [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-sybase magic_quotes_sybase] är aktiv!'''\nDetta alternativ korrumperar inmatad data oförutsägbart.\nDu kan inte installera eller använda MediaWiki om detta alternativ är aktiverat.",
+    "config-mbstring": "'''Kritiskt: [http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload] är aktiv!'''\nDetta alternativ orsakar fel och kan korrumpera data oförutsägbart.\nDu kan inte installera eller använda MediaWiki om detta alternativ är aktiverat.",
+    "config-safe-mode": "''' Varning:''' PHP:s [http://www.php.net/features.safe-mode felsäkra läge] är aktivt.\nDet kan orsaka problem, särskilt om du använder filuppladdningar och <code>math</code>-stöd.",
     "config-xml-bad": "PHP:s XML-modul saknas.\nMediaWiki kräver funktioner i denna modul och kommer inte att fungera i den här konfigurationen.\nOm du kör Mandrake, installera php-xml-paketet.",
-    "config-memory-raised": "PHPs <code>memory_limit</code> är $1, ökar till $2.",
+    "config-pcre-no-utf8": "'''Kritiskt:''' PHP:s PCRE-modul verkar vara kompilerat utan PCRE_UTF8-stöd.\nMediaWiki kräver stöd för UTF-8 för att fungera korrekt.",
+    "config-memory-raised": "PHPs <code>memory_limit</code> är $1, ökad till $2.",
     "config-memory-bad": "''' Varning:''' PHP:s <code>memory_limit</code> är $1.\nDetta är förmodligen för lågt.\nInstallationen kan misslyckas!",
-    "config-xcache": "[http://xcache.lighttpd.net/ XCache] är installerad",
-    "config-apc": "[http://www.php.net/apc APC] är installerad",
-    "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache] är installerad",
+    "config-ctype": "'''Kritiskt:''' PHP måste kompileras med stöd för [http://www.php.net/manual/en/ctype.installation.php Ctype-tillägget].",
+    "config-json": "'''Varning:''' PHP kompilerades utan JSON-stöd.\nDu måste antingen installera PHP JSON-tillägget eller [http://pecl.php.net/package/jsonc PECL jsonc]-tillägget före installationen av MediaWiki.\n* PHP-tillägget är inkluderat i Red Hat Enterprise Linux (CentOS) 5 och 6, men måste aktiveras i <code>/etc/php.ini</code> eller <code>/etc/php.d/json.ini</code>.\n* Vissa Linux-distributioner släppta efter maj 2013 har utelämnat PHP-tillägget och har istället inkluderat PECL-tillägget som <code>php5-json</code> eller <code>php-pecl-jsonc</code>.",
+    "config-xcache": "[http://xcache.lighttpd.net/ XCache] är installerat",
+    "config-apc": "[http://www.php.net/apc APC] är installerat",
+    "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache] är installerat",
+    "config-no-cache": "'''Varning:''' Kunde inte hitta [http://www.php.net/apc APC], [http://xcache.lighttpd.net/ XCache] eller [http://www.iis.net/download/WinCacheForPhp WinCache].\nCachelagring av objekt är inte aktiverat.",
+    "config-mod-security": "'''Varning:''' Din webbserver har [http://modsecurity.org/ mod_security] aktiverat. Om felaktigt konfigurerat kan den skapa problem för MediaWiki eller annan programvara som tillåter användaren att posta godtyckligt innehåll.\nTitta på [http://modsecurity.org/documentation/ mod_security-dokumentationen] eller kontakta din värd om du påträffar slumpmässiga fel.",
     "config-diff3-bad": "GNU diff3 hittades inte.",
-    "config-git-bad": "Git-versionen av kontrollmjukvaran hittades inte.",
+    "config-git": "Hittade Git-mjukvara för versionskontroll: <code>$1</code>.",
+    "config-git-bad": "Git-mjukvara för versionskontroll hittades inte.",
+    "config-imagemagick": "Hittade ImageMagick: <code>$1</code>.\nMiniatyrvisning av bilder kommer att aktiveras om du aktiverar uppladdningar.",
+    "config-gd": "Hittade ett integrerat GD-grafikbibliotek.\nMiniatyrvisning av bilder kommer att aktiveras om du aktiverar uppladdningar.",
+    "config-no-scaling": "Kunde inte hitta GD-biblioteket eller ImageMagick.\nMiniatyrvisning av bilder kommer att inaktiveras.Miniatyrvisning av bilder",
     "config-no-uri": "'''Fel:''' Kunde inte fastställa det nuvarande URI:et.\nInstallationen avbröts.",
-    "config-no-cli-uri": "'''Varning:''' inget --scriptpath är anget, med standarden: <code>$1</code> .",
+    "config-no-cli-uri": "'''Varning:''' Ingen <code>--scriptpath</code> är angiven, använder standarden: <code>$1</code> .",
     "config-using-server": "Använder servernamn \"<nowiki>$1</nowiki>\".",
     "config-using-uri": "Använder server-URL \"<nowiki>$1$2</nowiki>\".",
-    "config-no-cli-uploads-check": "'''Varning:''' Din standardkatalog för uppladdningar (<code>$1</code>) inte är kontrollerad för sårbarhet från godtyckliga skriptkörning under CLI-installationen.",
+    "config-uploads-not-safe": "'''Varning:''' Din standardkatalog för uppladdningar <code>$1</code> är sårbar för körning av godtyckliga skript.\nÄven om MediaWiki kontrollerar alla uppladdade filer för säkerhetshot är det ändå starkt rekommenderat att [//www.mediawiki.org/wiki/Manual:Security#Upload_security stänga detta säkerhetshål] innan du aktiverar uppladdningar.",
+    "config-no-cli-uploads-check": "'''Varning:''' Din standardkatalog för uppladdningar (<code>$1</code>) har inte kontrollerats för sårbarhet från körning av godtyckliga skript under CLI-installationen.",
+    "config-brokenlibxml": "Ditt system har en kombination av PHP och libxml2 som är buggigt och kan orsaka datakorruption i MediaWiki och andra webbprogram.\nUppgradera till libxml2 2.7.3 eller senare ([https//bugs.php.net/bug.php?id=45996 buggfil med PHP]).\nInstallationen avbröts.",
+    "config-suhosin-max-value-length": "Suhosin är installerat och begränsar GET-parametern <code>length</code> till $1 bytes.\nMediaWikis ResourceLoader-komponent kommer att arbeta runt denna begränsning, men det kommer att försämra prestandan.\nOm möjligt bör du sätta <code>suhosin.get.max_value_length</code> till 1024 eller högre i <code>php.ini</code>, och sätta <code>$wgResourceLoaderMaxQueryLength</code> till samma värde som i <code>LocalSettings.php</code>.",
     "config-db-type": "Databastyp:",
     "config-db-host": "Databasvärd:",
+    "config-db-host-help": "Om din databasserver är på en annan server, ange då värdnamnet eller IP-adressen här.\n\nOm du använder ett delat webbhotell, bör din leverantör ge dig rätt värdnamn i deras dokumentation.\n\nOm du installerar på en Windowsserver och använder MySQL, kanske \"localhost\" inte fungerar för servernamnet. Om det inte gör det försök med \"127.0.0.1\" som den lokala IP-adressen.\n\nOm du använder PostgreSQL, lämna detta fält blankt för att ansluta via en Unix-socket.",
+    "config-db-host-oracle": "Databas TNS:",
+    "config-db-host-oracle-help": "Ange ett giltigt [http://download.oracle.com/docs/cd/B28359_01/network.111/b28317/tnsnames.htm Local Connect Name]; en tnsnames.ora-fil måste vara synlig för denna installation.<br />Om du använder klientbibliotek 10g eller nyare kan du också använda [http://download.oracle.com/docs/cd/E11882_01/network.112/e10836/naming.htm Easy Connect] namngivningsmetoden.",
     "config-db-wiki-settings": "Identifiera denna wiki",
     "config-db-name": "Databasnamn:",
+    "config-db-name-help": "Välj ett namn som identifierar din wiki.\nDet bör inte innehålla mellanslag.\n\nOm du använder ett delat webbhotell kan de antingen ge dig ett särskilt databasnamn att använda eller så kan de låta dig skapa en databas via kontrollpanelen.",
     "config-db-name-oracle": "Databasschema:",
     "config-db-install-account": "Användarkonto för installation",
     "config-db-username": "Databas-användarnamn:",
     "config-db-password": "Databas-lösenord:",
     "config-db-password-empty": "Ange ett lösenord för den nya databasanvändaren: $1.\nÄven om det kan vara möjligt att skapa användare utan lösenord är det inte säkert.",
+    "config-db-username-empty": "Du måste ange ett värde för \"{{int:config-db-username}}\"",
+    "config-db-install-username": "Ange det användarnamn som ska används för att ansluta till databasen under installationsprocessen.\nDetta är inte användarnamnet för ditt MediaWiki-konto; detta är användarnamnet för din databas.",
+    "config-db-install-password": "Ange det lösenord som ska användas för att ansluta till databasen under installationsprocessen.\nDetta är inte lösenordet för ditt MediaWiki-konto; detta är lösenordet för din databas.",
+    "config-db-install-help": "Ange användarnamnet och lösenordet som kommer att användas för att ansluta till databasen under installationsprocessen.",
     "config-db-account-lock": "Använda samma användarnamn och lösenord under normal drift",
     "config-db-wiki-account": "Användarkonto för normal drift",
+    "config-db-wiki-help": "Ange det användarnamn och lösenorde som skall användas för att ansluta till databasen under normal wiki-drift. Om kontot inte existerar, och om installationskontot har tillräcklig behörighet, kommer detta användarkontot att skapas med de minimiprivilegier som krävs för att driva wikin.",
     "config-db-prefix": "Prefix för tabellerna i databasen:",
+    "config-db-prefix-help": "Om du behöver dela en databas mellan flera olika wikis, eller mellan MediaWiki och en annan webbapplikation, kan du välja att lägga till ett prefix till alla tabellnamn för att undvika konflikter.\nAnvänd inte mellanslag.\n\nDet här fältet lämnas vanligtvis tomt.",
+    "config-db-charset": "Databasteckensuppsättning:",
     "config-charset-mysql5-binary": "MySQL 4.1/5.0 binär",
     "config-charset-mysql5": "MySQL 4.1/5.0 UTF-8",
     "config-charset-mysql4": "MySQL 4.0 bakåtkompatibel UTF-8",
+    "config-charset-help": "'''Varning:''' Om du använder '''bakåtkompatibel UTF-8''' i MySQL 4.1+, och därefter säkerhetskopierar databasen med <code>mysqldump</code>, kan det förstöra alla icke-ASCII-tecken, vilket oåterkalleligt förstör dina säkerhetskopior!\n\nI '''binärt läge''' lagrar MediaWiki UTF-8-text till databasen i binära fält.\nDetta är mer effektivt än MySQLs UTF-8-läge, och tillåter dig att använda ett fullt utbud av Unicode-tecken.\nI '''UTF-8-läge''' kommer MySQL känna av vilken teckenuppsättning din data är i, och kan presentera och konvertera den på ett lämpligt sätt, men den kommer inte lagra tecken ovanför [//en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes Basic Multilingual Plane].",
+    "config-mysql-old": "MySQL $1 eller senare krävs. Du har $2.",
     "config-db-port": "Databasport:",
     "config-db-schema": "Schema för MediaWiki",
+    "config-db-schema-help": "Det här schemat blir oftast bra.\nÄndra det endast om du vet att du behöver.",
     "config-pg-test-error": "Kan inte ansluta till databas '''$1''': $2",
     "config-sqlite-dir": "SQLite data-katalog:",
+    "config-type-mysql": "MySQL (eller kompatibelt)",
+    "config-type-mssql": "Microsoft SQL Server",
+    "config-support-info": "MediaWiki stöder följande databassystem:\n\n$1\n\nOm du inte ser det databassystem som du försöker använda nedanstående, följ då instruktionerna länkade ovan för aktivera stöd för det.",
+    "config-dbsupport-mysql": "* [{{int:version-db-mysql-url}} MySQL] är det primära målet för MediaWiki och det stöds bäst. MediaWiki fungerar även med [{{int:version-db-mariadb-url}} MariaDB] och [{{int:version-db-percona-url}} Percona Server], som är kompatibla med MySQL. ([http://www.php.net/manual/en/mysqli.installation.php Hur man kompilerar PHP med stöd för MySQL])",
     "config-header-mysql": "MySQL-inställningar",
     "config-header-postgres": "PostgreSQL-inställningar",
     "config-header-sqlite": "SQLite-inställningar",
     "config-header-oracle": "Oracle-inställningar",
     "config-invalid-db-type": "Ogiltig databastyp",
-    "config-missing-db-name": "Du måste ange ett värde för \"Databasnamn\"",
-    "config-missing-db-host": "Du måste ange ett värde för \"Databasvärd\"",
-    "config-missing-db-server-oracle": "Du måste ange ett värde för \"Databas TNS\"",
+    "config-missing-db-name": "Du måste ange ett värde för \"{{int:config-db-name}}\".",
+    "config-missing-db-host": "Du måste ange ett värde för \"{{int:config-db-host}}\".",
+    "config-missing-db-server-oracle": "Du måste ange ett värde för \"{{int:config-db-host-oracle}}\".",
     "config-invalid-db-name": "\"$1\" är ett ogiltigt databasnamn.\nAnvänd bara ASCII-bokstäver (a-z, A-Z), siffror (0-9), understreck (_) och bindestreck (-).",
     "config-invalid-db-prefix": "\"$1\" är ett ogiltigt databasprefix.\nAnvänd bara ASCII-bokstäver (a-z, A-Z), siffror (0-9), understreck (_) och bindestreck (-).",
-    "config-connection-error": "$1.\n\nKontrollera värden, användarnamnet och lösenordet nedan och försök igen",
+    "config-connection-error": "$1.\n\nKontrollera värd, användarnamn och lösenord och försök igen.",
     "config-invalid-schema": "\"$1\" är ett ogiltigt schema för MediaWiki.\nAnvänd bara ASCII-bokstäver (a-z, A-Z), siffror (0-9), understreck (_) och bindestreck (-).",
-    "config-db-sys-create-oracle": "Installationsprogrammet stöder endast med ett SYSDBA-konto för att skapa ett nytt konto.",
+    "config-db-sys-create-oracle": "Installationsprogrammet stöder endast användningen av ett SYSDBA-konto för att skapa ett nytt konto.",
     "config-db-sys-user-exists-oracle": "Användarkontot \"$1\" finns redan. SYSDBA kan endast användas för att skapa ett nytt konto!",
     "config-postgres-old": "PostgreSQL $1 eller senare krävs, du har $2.",
+    "config-mssql-old": "Microsoft SQL-server $1 eller senare krävs. Du har $2.",
     "config-sqlite-name-help": "Välja ett namn som identifierar din wiki.\nAnvänd inte mellanslag eller bindestreck.\nDetta kommer att användas för SQLite-data filnamnet.",
+    "config-sqlite-mkdir-error": "Fel uppstod när datakatalogen \"$1\" skulle skapas.\nKontrollera platsen och försök igen.",
     "config-sqlite-readonly": "Filen <code>$1</code> är inte skrivbar.",
     "config-sqlite-cant-create-db": "Kunde inte skapa databasfilen <code>$1</code>.",
     "config-sqlite-fts3-downgrade": "PHP saknar stöd för FTS3, nedgraderar tabeller",
     "config-upgrade-done": "Uppgraderingen slutfördes.\n\nDu kan nu [$1 börja använda din wiki].\n\nOm du vill förnya din <code>LocalSettings.php</code>-fil, klicka på knappen nedan.\nDetta '''rekommenderas inte''' om du har problem med din wiki.",
     "config-upgrade-done-no-regenerate": "Uppgraderingen slutfördes.\n\nDu kan nu [$1 börja använda din wiki].",
     "config-regenerate": "Återskapa LocalSettings.php →",
+    "config-unknown-collation": "'''Varning:''' Databasen använder en okänd sortering.",
     "config-db-web-account": "Databaskonto för webbaccess",
+    "config-db-web-help": "Välj det användarnamn och lösenord som webbservern använder för att ansluta till databasservern, under ordinarie drift av wikin.",
     "config-db-web-account-same": "Använd samma konto som för installation",
     "config-db-web-create": "Skapa kontot om det inte redan finns",
+    "config-db-web-no-create-privs": "Det konto som du har angett för installation har inte tillräcklig behörighet för att skapa ett konto.\nDet konto du anger här måste redan finnas.",
     "config-mysql-engine": "Lagringsmotor:",
+    "config-mysql-innodb": "InnoDB",
+    "config-mysql-myisam": "MyISAM",
+    "config-mysql-myisam-dep": "'''Varning:''' Du har valt MyISAM som lagringsmotor för MySQL, vilket inte rekommenderas för användning med MediaWiki eftersom:\n* den knappt stöder samtidigt exekvering på grund av låsning av tabeller\n* den är mer benägen att korrumpera data än andra motorer\n* MediaWiki-kodbasen hanterar inte alltid MyISAM som den ska\n\nOm din MySQL-installation stöder InnoDB, är det starkt rekommenderat att du väljer det istället.\nOm din MySQL-installation inte stöder InnoDB, kanske det är dags för en uppgradering.",
+    "config-mysql-only-myisam-dep": "'''Varning:''' MyISAM är den enda tillgängliga lagringsmotorn för MySQL på denna maskin, och den är inte rekommenderad att använda med MediaWiki eftersom:\n* den knappt stöder samtidigt exekvering på grund av låsning av tabeller\n* den är mer benägen att korrumpera data än andra motorer\n* MediaWiki-kodbasen hanterar inte alltid MyISAM som den ska\n\nDin MySQL-installation stöder inte InnoDB, det kanske är dags för en uppgradering.",
+    "config-mysql-engine-help": "'''InnoDB''' är nästan alltid det bästa valet eftersom den har ett bra system för samtidiga arbeten.\n\n'''MyISAM''' kan vara snabbare i enanvändarläge eller skrivskyddade installationer.\nMyISAM-databaser tenderar att bli korrupta oftare än InnoDB-databaser.",
+    "config-mysql-charset": "Databasteckensuppsättning:",
     "config-mysql-binary": "Binär",
     "config-mysql-utf8": "UTF-8",
+    "config-mysql-charset-help": "I '''binärt läge''' lagrar MediaWiki UTF-8 text till databasen i binära fält.\nDetta är mer effektivt än MySQLs UTF-8-läge, och den tillåter dig att använda den fulla uppsättningen av Unicode-tecken.\n\nI '''UTF-8-läge''' vet MySQL vilket teckenuppsättning din data är i och kan presentera och konvertera den på ett lämpligt sätt, men den tillåter dig inte att lagra tecken över [//en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes Basic Multilingual Plane].",
+    "config-mssql-sqlauth": "SQL Server-autentisering",
+    "config-mssql-windowsauth": "Windows-autentisering",
     "config-site-name": "Namnet på wikin:",
-    "config-site-name-blank": "Ange ett sidnamn.",
+    "config-site-name-help": "Detta visas i titelfältet i webbläsaren och på flera andra platser.",
+    "config-site-name-blank": "Ange ett webbplatsnamn.",
+    "config-project-namespace": "Projektnamnrymd:",
     "config-ns-generic": "Projekt",
     "config-ns-site-name": "Samma som wikinamnet: $1",
     "config-ns-other": "Annan (specificera)",
-    "config-ns-invalid": "Den angivna namnrymden \"<nowiki>$1</nowiki>\" är ogiltig.\nAnge ett annat namnrymd för projektet.",
-    "config-ns-conflict": "Den angivna namnrymden \"<nowiki>$1</nowiki>\" står i konflikt med en standardnamnrymd för MediaWiki.\nAnge ett annat namnrymd för projektet.",
+    "config-ns-invalid": "Den angivna namnrymden \"<nowiki>$1</nowiki>\" är ogiltig.\nAnge en annan namnrymd för projektet.",
+    "config-ns-conflict": "Den angivna namnrymden \"<nowiki>$1</nowiki>\" står i konflikt med en standardnamnrymd för MediaWiki.\nAnge en annan namnrymd för projektet.",
     "config-admin-box": "Administratörskonto",
-    "config-admin-name": "Ditt namn:",
+    "config-admin-name": "Ditt användarnamn:",
     "config-admin-password": "Lösenord:",
     "config-admin-password-confirm": "Lösenord igen:",
-    "config-admin-help": "Skriv in ditt föredragna användarnamn här, t.ex. \"Joe Bloggs\".\nDetta är namnet du kommer att använda för att logga in på wikin.",
+    "config-admin-help": "Ange ditt önskade användarnamn här, t.ex. \"Sven Svensson\".\nDetta är namnet du kommer att använda för att logga in på wikin.",
     "config-admin-name-blank": "Ange ett användarnamn för administratörskontot.",
     "config-admin-name-invalid": "Det angivna användarnamnet \"<nowiki>$1</nowiki>\" är ogiltigt.\nAnge ett annat användarnamn.",
     "config-admin-password-blank": "Ange ett lösenord för administratörskontot.",
-    "config-admin-password-same": "Lösenordet får inte vara samma som användarnamnet.",
-    "config-admin-password-mismatch": "De två lösenord du uppgett överensstämmer inte med varandra.",
+    "config-admin-password-mismatch": "De två lösenord du angav överensstämmer inte med varandra.",
     "config-admin-email": "E-postadress:",
+    "config-admin-email-help": "Ange en e-postadress här så att du kan ta emot e-post från andra användare på wikin, för att återställa ditt lösenord och för att informeras om ändringar på sidor du bevakar. Du kan lämna fältet tomt.",
     "config-admin-error-user": "Internt fel när du skapar en administratör med namnet \"<nowiki>$1</nowiki>\".",
-    "config-admin-error-password": "Internt fel när du väljer ett lösenord för administratören \"<nowiki>$1</nowiki>\": <pre>$2</pre>",
-    "config-admin-error-bademail": "Du har angivit en felaktigt e-postadress.",
-    "config-subscribe": "Prenumerera på [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce e-postlistan för tillkännagivanden].",
-    "config-almost-done": "Du är nästan färdig!\nDu kan nu hoppa över återstående konfigurationer och installera wikin nu.",
+    "config-admin-error-password": "Internt fel lösenordet för administratören \"<nowiki>$1</nowiki>\" ställdes in: <pre>$2</pre>",
+    "config-admin-error-bademail": "Du har angivit en ogiltig e-postadress.",
+    "config-subscribe": "Prenumerera på [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce e-postlistan för kungörelser av nya versioner].",
+    "config-almost-done": "Du är nästan färdig!\nDu kan nu hoppa över återstående konfigurationer och installera wikin direkt.",
     "config-optional-continue": "Ställ fler frågor till mig.",
     "config-optional-skip": "Jag är redan uttråkad, bara installera wiki.",
     "config-profile-wiki": "Öppen wiki",
     "config-profile-private": "Privat wiki",
     "config-license": "Upphovsrätt och licens:",
     "config-license-none": "Ingen licenssidfot",
-    "config-license-cc-by-sa": "Creative Commons Erkännande Dela Lika",
+    "config-license-cc-by-sa": "Creative Commons Erkännande-DelaLika",
     "config-license-cc-by": "Creative Commons Erkännande",
-    "config-license-cc-by-nc-sa": "Creative Commons Erkännande Icke-Kommersiell Dela Lika",
-    "config-license-cc-0": "Creative Commons Zero (allmän egendom)",
+    "config-license-cc-by-nc-sa": "Creative Commons Erkännande-IckeKommersiell-DelaLika",
+    "config-license-cc-0": "Creative Commons Zero (Public Domain)",
     "config-license-gfdl": "GNU Free Documentation License 1.3 eller senare",
-    "config-license-pd": "Allmän egendom",
+    "config-license-pd": "Public Domain",
     "config-license-cc-choose": "Välj en anpassad Creative Commons-licens",
     "config-email-settings": "E-postinställningar",
     "config-enable-email": "Aktivera utgående e-post",
     "config-email-user": "Aktivera e-post mellan användare",
-    "config-email-user-help": "Tillåta alla användare att skicka mail till varandra om de har aktiverat det i deras preferenser.",
-    "config-email-usertalk": "Aktivera underrättelse för användardiskussionssidan",
+    "config-email-user-help": "Tillåta alla användare att skicka e-post till varandra om de har aktiverat det i sina inställningar.",
+    "config-email-usertalk": "Aktivera meddelanden för användardiskussionssidor",
     "config-email-watchlist": "Aktivera meddelanden för bevakningslistan",
     "config-email-auth": "Aktivera autentisering via e-post",
     "config-upload-settings": "Bild- och filuppladdningar",
-    "config-upload-enable": "Aktivera filöverföringar",
-    "config-upload-deleted": "Mapp för raderade filer:",
+    "config-upload-enable": "Aktivera filuppladdningar",
+    "config-upload-deleted": "Katalog för raderade filer:",
     "config-logo": "Logotyp-URL:",
+    "config-logo-help": "MediaWikis standardutseende innehåller ett mellanrum för en 135x160 bildpunkter stor logotyp ovanför sidofältsmenyn.\nLadda upp en bild med lämplig storlek och ange webbadressen här.\n\nDu kan använda <code>$wgStylePath</code> eller <code>$wgScriptPath</code> om din logotyp är relativ till dessa sökvägar.\n\nOm du inte vill ha en logotyp kan du lämna detta fält tomt.",
     "config-instantcommons": "Aktivera Instant Commons",
     "config-cc-error": "Creative Commons-licens-väljaren gav inget resultat.\nAnge licensnamnet manuellt.",
     "config-cc-again": "Välj igen...",
     "config-advanced-settings": "Avancerad konfiguration",
     "config-extensions": "Tillägg",
     "config-install-alreadydone": "''' Varning:''' Du verkar redan ha installerat MediaWiki och försöker installera det igen.\nVänligen fortsätt till nästa sida.",
-    "config-install-begin": "Genom att trycka på \"{{int:config-continue}}\", påbörjar du installationen av MediaWiki.\nOm du fortfarande vill göra ändringar trycker du på \"{{int:config-back}}\".",
+    "config-install-begin": "Genom att trycka på \"{{int:config-continue}}\", påbörjar du installationen av MediaWiki.\nOm du fortfarande vill göra ändringar tryck på \"{{int:config-back}}\".",
     "config-install-step-done": "klar",
     "config-install-step-failed": "misslyckades",
+    "config-install-extensions": "Inklusive tillägg",
     "config-install-database": "Konfigurerar databas",
     "config-install-schema": "Skapar schema",
+    "config-install-pg-schema-not-exist": "PostgreSQL-schemat finns inte.",
+    "config-install-pg-schema-failed": "Det gick inte att skapa tabeller.\nSe till att användaren \"$1\" kan skriva till schemat \"$2\".",
+    "config-install-pg-commit": "Begår ändringar",
+    "config-install-pg-plpgsql": "Kontroll för språket PL/pgSQL",
     "config-pg-no-plpgsql": "Du måste installera språket PL/pgSQL i databasen $1",
+    "config-pg-no-create-privs": "Det konto som du har angett för installationen har inte tillräcklig behörighet för att skapa ett konto.",
     "config-install-user": "Skapar databasanvändare",
     "config-install-user-alreadyexists": "Användaren \"$1\" finns redan",
     "config-install-user-create-failed": "Misslyckades att skapa användare \"$1\": $2",
     "config-install-user-missing": "Den angivna användaren \"$1\" existerar inte.",
     "config-install-user-missing-create": "Den angivna användaren \"$1\" existerar inte.\nVänligen klicka på kryssrutan \"skapa konto\" nedan om du vill skapa den.",
     "config-install-tables": "Skapar tabeller",
-    "config-install-tables-exist": "''' Varning:''' MediaWiki-tabeller verkar redan finnas.\nHoppar över skapandet.",
-    "config-install-tables-failed": "''' Fel:''' Skapandet av tabell misslyckades med följande fel: $1",
+    "config-install-tables-exist": "'''Varning:''' MediaWiki-tabeller verkar redan finnas.\nHoppar över skapandet.",
+    "config-install-tables-failed": "'''Fel:''' Skapandet av tabell misslyckades med följande fel: $1",
     "config-install-interwiki": "Lägger till standardtabell för interwiki",
     "config-install-interwiki-list": "Kunde inte läsa filen <code>interwiki.list</code>.",
     "config-install-stats": "Initierar statistik",
     "config-install-mainpage": "Skapa huvudsida med standardinnehåll",
     "config-install-extension-tables": "Skapar tabeller för aktiverade tillägg",
     "config-install-mainpage-failed": "Kunde inte infoga huvudsidan: $1",
-    "config-install-done": "'''Grattis!'''\nDu har installerat MediaWiki.\n\nInstallationsprogrammet har genererat filen <code>LocalSettings.php</code>.\nDet innehåller alla dina konfigurationer.\n\nDu kommer att behöva ladda ned den och placera den i botten av din wiki-installation (samma mapp som index.php). Nedladdningen borde ha startats automatiskt.\n\nOm ingen nedladdning erbjöds, eller om du har avbrutit det kan du starta om nedladdningen genom att klicka på länken nedan:\n\n$3\n\n'''OBS''': Om du inte gör detta nu, kommer denna genererade konfigurationsfil inte vara tillgänglig för dig senare om du avslutar installationen utan att ladda ned den.\n\nNär det är klart, kan du '''[$2 gå in på din wiki]'''.",
-    "config-download-localsettings": "Ladda ned <code>LocalSettings.php</code>",
+    "config-install-done": "'''Grattis!'''\nDu har installerat MediaWiki.\n\nInstallationsprogrammet har genererat filen <code>LocalSettings.php</code>.\nDet innehåller alla dina konfigurationer.\n\nDu kommer att behöva ladda ner den och placera den i roten för din wiki-installation (samma katalog som index.php). Nedladdningen borde ha startats automatiskt.\n\nOm ingen nedladdning erbjöds, eller om du har avbrutit det kan du starta om nedladdningen genom att klicka på länken nedan:\n\n$3\n\n'''OBS''': Om du inte gör detta nu, kommer denna genererade konfigurationsfil inte vara tillgänglig för dig senare om du avslutar installationen utan att ladda ned den.\n\nNär det är klart, kan du '''[$2 gå in på din wiki]'''.",
+    "config-download-localsettings": "Ladda ner <code>LocalSettings.php</code>",
     "config-help": "hjälp",
-    "config-nofile": "Filen \"$1\" kunde inte hittas. Har den tagits bort?",
+    "config-nofile": "Filen \"$1\" kunde inte hittas. Har den raderats?",
+    "config-extension-link": "Visste du att din wiki stödjer [//www.mediawiki.org/wiki/Manual:Extensions tillägg]?\n\nDu kan bläddra i [//www.mediawiki.org/wiki/Category:Extensions_by_category tillägg efter kategori] eller i [//www.mediawiki.org/wiki/Extension_Matrix tilläggsmatrisen] för att se hela listan över tillägg.",
     "mainpagetext": "'''MediaWiki har installerats utan problem.'''",
-    "mainpagedocfooter": "Information om hur wiki-programvaran används finns i [//meta.wikimedia.org/wiki/Help:Contents användarguiden].\n\n== Att komma igång ==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Lista över konfigurationsinställningar]\n* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mail list]\n* [//www.mediawiki.org/wiki/Localisation#Translation_resources Lokalisera MediaWiki för ditt språk]"
-}
\ No newline at end of file
+    "mainpagedocfooter": "Information om hur wiki-programvaran används finns i [//meta.wikimedia.org/wiki/Help:Contents användarguiden].\n\n== Att komma igång ==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Lista över konfigurationsinställningar]\n* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce E-postlista för nya versioner av MediaWiki]\n* [//www.mediawiki.org/wiki/Localisation#Translation_resources Lokalisera MediaWiki för ditt språk]"
+}
index 44dfedf..6c68ce7 100644 (file)
@@ -6,4 +6,4 @@
     },
     "mainpagetext": "'''MediaWiki imefanikiwa kuingizwa.'''",
     "mainpagedocfooter": "Shauriana na [//meta.wikimedia.org/wiki/Help:Contents Mwongozo wa Mtumiaji] kwa habari juu ya utumiaji wa bidhaa pepe ya wiki.\n\n== Msaada wa kianzio ==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Orodha ya mipangilio ya msingi]\n* [//www.mediawiki.org/wiki/Manual:FAQ FAQ ya MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Orodha ya utoaji wa habari za MediaWiki]"
-}
\ No newline at end of file
+}
index 1ecd8c5..0c4f05e 100644 (file)
@@ -6,4 +6,4 @@
     },
     "mainpagetext": "'''Sztalowańy MediaWiki śe udoło.'''",
     "mainpagedocfooter": "Uobezdrzij [//meta.wikimedia.org/wiki/Help:Contents przewodńik sprowjacza], kaj sům informacyje uo dźołańu uoprogramowańo MediaWiki.\n\n== Na sztart ==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Lista sztalowań konfiguracyje]\n* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Komuńikaty uo nowych wersyjach MediaWiki]"
-}
\ No newline at end of file
+}
index 6904e87..c60f1b0 100644 (file)
@@ -3,7 +3,8 @@
         "authors": [
             "Karthi.dr",
             "TRYPPN",
-            "மதனாஹரன்"
+            "மதனாஹரன்",
+            "Jayarathina"
         ]
     },
     "config-title": "மீடியாவிக்கி $1 நிறுவுதல்",
     "config-ns-generic": "திட்டம்",
     "config-ns-other": "ஏனையவை (குறிப்பிடவும்)",
     "config-admin-box": "நிருவாகி கணக்கு",
-    "config-admin-name": "தà®\99à¯\8dà®\95ளதà¯\81 பெயர்:",
+    "config-admin-name": "à®\89à®\99à¯\8dà®\95ளினà¯\8d à®ªà®¯à®©à®°à¯\8d பெயர்:",
     "config-admin-password": "கடவுச்சொல்:",
     "config-admin-password-confirm": "கடவுச்சொல் மறுமுறையும்:",
     "config-admin-name-blank": "நிருவாக அணுக்கம் உள்ள பயனர் பெயரை இடுக.",
     "config-admin-password-blank": "நிருவாகி கணக்குக்கு கடவுச்சொல் ஒன்றை உள்ளிடவும்.",
-    "config-admin-password-same": "பயனர் பெயரையே கடவுச்சொல்லாக வைத்துக் கொள்ள முடியாது.",
     "config-admin-password-mismatch": "நீங்கள் பதிந்த கடவுச்சொற்கள் ஒன்றுக்கொன்று பொருந்தவில்லை.",
     "config-admin-email": "மின்னஞ்சல் முகவரி:",
     "config-admin-error-bademail": "நீங்கள் செல்லாத ஒரு மின்னஞ்சல் முகவரியைத் தந்துள்ளீர்கள்.",
@@ -87,4 +87,4 @@
     "config-help": "உதவி",
     "mainpagetext": "'''விக்கி மென்பொருள் வெற்றிகரமாக உள்ளிடப்பட்டது.'''",
     "mainpagedocfooter": "விக்கி மென்பொருளைப் பயன்படுத்துவது தொடர்பாக [//meta.wikimedia.org/wiki/Help:Contents பயனர் வழிகாட்டியைப்] பார்க்க.\n\n== தொடக்கப்படிகள் ==\n\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings அமைப்புக்களை மாற்றம் செய்தல்]\n* [//www.mediawiki.org/wiki/Manual:FAQ மிடியாவிக்கி பொதுவான கேள்விகள்]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce மீடியாவிக்கி வெளியீடு மின்னஞ்சல் பட்டியல்]"
-}
\ No newline at end of file
+}
index cabe4e8..49864e4 100644 (file)
@@ -1,7 +1,5 @@
 {
-    "@metadata": {
-        "authors": []
-    },
+    "@metadata": [],
     "mainpagetext": "'''ಮೀಡಿಯವಿಕಿ ಯಶಸ್ವಿಯಾದ್ ಇನ್’ಸ್ಟಾಲ್ ಆಂಡ್.'''",
     "mainpagedocfooter": "ವಿಕಿ ತಂತ್ರಾಂಶನ್ ಉಪಗೋಗ ಮನ್ಪುನ ಬಗ್ಗೆ ಮಾಹಿತಿಗ್ [//meta.wikimedia.org/wiki/Help:Contents ಸದಸ್ಯೆರ್ನ ನಿರ್ದೇಶನ ಪುಟ] ತೂಲೆ.\n\n== ಎಂಚ ಶುರು ಮಲ್ಪುನಿ ==\n\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Configuration settings list]\n* [//www.mediawiki.org/wiki/Manual:FAQ ಮೀಡಿಯವಿಕಿ FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]"
-}
\ No newline at end of file
+}
index c916986..ae2a50c 100644 (file)
 {
     "@metadata": {
         "authors": [
-            "Veeven"
+            "Veeven",
+            "Chaduvari",
+            "Ravichandra"
         ]
     },
     "config-desc": "మీడియావికీ కొరకై స్థాపకి",
     "config-title": "మీడియావికీ $1స్థాపన",
     "config-information": "సమాచారం",
+    "config-localsettings-upgrade": "ఓ <code>LocalSettings.php</code> ఫైలు కనబడింది.\nఈ స్థాపనను ఉన్నతీకరించడానికి, కింద ఇచ్చిన పెట్టెలో <code>$wgUpgradeKey</code> యొక్క విలువను ఇవ్వండి.\nఅది <code>LocalSettings.php</code> లో ఉంటుంది.",
+    "config-localsettings-cli-upgrade": "ఓ <code>LocalSettings.php</code> ఫైలు కనబడింది.\nఈ స్థాపనను ఉన్నతీకరించడానికి, దాని బదులు <code>update.php</code> ను రన్ చెయ్యండి.",
+    "config-localsettings-key": "ఉన్నతీకరణ కీ:",
+    "config-localsettings-badkey": "మీరిచ్చిన కీ తప్పు.",
+    "config-upgrade-key-missing": "MediaWiki యొక్క ఒక స్థాపన కనబడింది.\nదాన్ని ఉన్నతీకరించడానికి, కింది లైనును <code>LocalSettings.php</code> లో అట్టడుగున ఉంచండి:\n\n$1",
+    "config-localsettings-incomplete": "ఇప్పటి <code>LocalSettings.php</code> అసంపూర్తిగా ఉన్నట్లుగా కనబడుతోంది.\n$1 చరరాశిని సెట్ చెయ్యలేదు.\nఈ చరరాశిని సెట్ చేస్తూ <code>LocalSettings.php</code> ను మార్చి, \"{{int:Config-continue}}\" ను నొక్కండి.",
+    "config-localsettings-connection-error": "<code>LocalSettings.php</code> లో ఇచ్చిన సెట్టింగులను వాడుతూ డేటాబేసుకు కనెక్టు కాబోతే, లోపం తలెత్తింది. ఈ సెట్టింగులను సరిచేసి మళ్ళీ ప్రయత్నించండి.\n\n$1",
+    "config-session-error": "సెషన్ను ప్రారంభించబోతే లోపం జరిగింది: $1",
+    "config-session-expired": "మీ సెషన్ డేటాకు కాలదోషం పట్టినట్లుంది.\nసెషన్ల జీవితకాలం $1 ఉండేలా అమర్చబడ్డాయి.\nphp.ini లో <code>session.gc_maxlifetime</code> ను మార్చి దీన్ని పెంచవచ్చు.\nస్థాపన పనిని తిరిగి మొదలుపెట్టండి.",
+    "config-no-session": "మీ సెషను డేటా పోయింది!\nphp.ini లో <code>session.save_path</code> సరైన డైరెక్టరీకి సెట్ చేసి ఉందో లేదో చూడండి.",
     "config-your-language": "మీ భాష:",
+    "config-your-language-help": "స్థాపన పనిలో వాడేందుకు ఓ భాషను ఎంచుకోండి.",
     "config-wiki-language": "వికీ భాష:",
+    "config-wiki-language-help": "వికీని ప్రధానంగా ఏ భాషలో రాయాలో ఎంచుకోండి.",
     "config-back": "← వెనక్కి",
     "config-continue": "కొనసాగించు →",
     "config-page-language": "భాష",
     "config-page-welcome": "మీడియావికీకి స్వాగతం!",
+    "config-page-dbconnect": "డేటాబేసుకు కనెక్టవు",
+    "config-page-upgrade": "ప్రస్తుత స్థాపనను ఉన్నతీకరించు",
     "config-page-dbsettings": "డాటాబేసు అమరికలు",
     "config-page-name": "పేరు",
     "config-page-options": "ఎంపికలు",
     "config-page-install": "స్థాపించు",
     "config-page-complete": "పూర్తయ్యింది!",
+    "config-page-restart": "స్థాపనను తిరిగి ప్రారంభించు",
     "config-page-readme": "నన్ను చదవండి",
     "config-page-releasenotes": "విడుదల విశేషాలు",
+    "config-page-copying": "కాపీ చేస్తున్నాం",
+    "config-page-upgradedoc": "ఉన్నతీకరిస్తున్నాం",
+    "config-page-existingwiki": "ప్రస్తుత వికీ",
+    "config-help-restart": "మీరు భద్రపరిచిన డేటా మొత్తాన్ని తీసివేసి స్థాపనను తిరిగి ప్రారంభించాలా?",
+    "config-restart": "ఔను, తిరిగి ప్రారంభించు",
+    "config-welcome": "=== పర్యావరణ పరీక్షలు ===\nఈ పర్యావరణం MediaWiki స్థాపనకు అనుకూలంగా ఉందో లేదో చూసే ప్రాథమిక పరీక్షలు ఇపుడు చేస్తాం.\nస్థాపనను ఎలా పూర్తి చెయ్యాలనే విషయమై మీకు సహాయం అడిగేటపుడు, ఈ సమాచారాన్ని ఇవ్వాలని గుర్తుంచుకోండి.",
+    "config-copyright": "=== కాపీహక్కు, నిబంధనలు===\n\n$1\n\nఇది ఉచిత సాఫ్ట్‌వేరు; ఫ్రీ సాఫ్ట్‌వేర్ ఫౌండేషన్ వారు ప్రచురించిన GNU జనరల్ పబ్లిక్ లైసెన్సును (2వ లేదా తరువాతి వర్షన్) అనుసరించి దీన్ని పంపిణీ చెయ్యవచ్చు లేదా మార్చుకోనూవచ్చు.\n\nదీని వలన ఉపయోగం ఉంటుందనే నమ్మకంతో ప్రచురింపబడింది. కానీ <strong>ఎటువంటి వారంటీ లేదు</strong>; <strong> వర్తకం చేయదగ్గ </strong>  లేదా <strong> ఒక అవసరానికి సరిపడే సామర్థ్యం</strong> ఉన్నదనే అంతరార్థ వారంటీ కూడా లేదు.\nమరిన్ని వివరాలకు GNU జనరల్ పబ్లిక్ లైసెన్స్ చూడండి.\n\nమీరు ఈ ప్రోగ్రాముతో పాటు <doclink href=Copying> GNU జనరల్ పబ్లిక్ లైసెన్స్ ప్రతిని </doclink> అందుకుని ఉండాలి; లేకపోతే, Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA కు జాబు రాయండి లేదా [http://www.gnu.org/copyleft/gpl.html ఆన్‌లైన్‌లో చదివండి].",
+    "config-sidebar": "* [//www.mediawiki.org MediaWiki మొదటిపేజీ]\n* [//www.mediawiki.org/wiki/Help:Contents వాడుకరుల మార్గదర్శి]\n* [//www.mediawiki.org/wiki/Manual:Contents అధికారుల మార్గదర్శి]\n* [//www.mediawiki.org/wiki/Manual:FAQ FAQ]\n----\n* <doclink href=Readme>చదవాల్సినవి</doclink>\n* <doclink href=ReleaseNotes>విడుదల గమనికలు</doclink>\n* <doclink href=Copying>కాపీ చెయ్యడం</doclink>\n* <doclink href=UpgradeDoc>ఉన్నతీకరించడం</doclink>",
+    "config-env-good": "పర్యావరణాన్ని పరీక్షించాం.\nఇక మీరు MediaWiki ని స్థాపించుకోవచ్చు.",
+    "config-env-bad": "పర్యావరణాన్ని పరీక్షించాం.\nమీరు MediaWiki ని స్థాపించలేరు.",
+    "config-env-php": "PHP $1 స్థాపించబడింది.",
+    "config-env-php-toolow": "PHP $1 స్థాపించబడింది.\nఅయితే, MediaWiki కి PHP $2 గానీ ఆ పైది గానీ కావాలి.",
+    "config-unicode-using-utf8": "యూనికోడు నార్మలైజేషన్ కోసం బ్రయాన్ విబర్ గారి utf8_normalize.so ను వాడుతున్నాం.",
+    "config-unicode-using-intl": "యూనికోడు నార్మలైజేషన్ కోసం [http://pecl.php.net/intl intl PECL పొడిగింత] ను వాడుతున్నాం.",
+    "config-outdated-sqlite": "<strong>హెచ్చరిక:</strong> మీ వద్ద SQLite $1 ఉంది. అదికావలసిన వెర్షను $2 కంటే దిగువది. SQLite అందుబాటులో ఉండదు.",
+    "config-memory-raised": "PHP యొక్క <code>memory_limit</code> $1, దాన్ని $2 కి పెంచాం.",
+    "config-memory-bad": "<strong>హెచ్చరిక:</strong> PHP యొక్క <code>memory_limit</code> $1.\nబహుశా ఇది మరీ తక్కువ.\nస్థాపన విఫలం కావచ్చు!",
+    "config-xcache": "[http://xcache.lighttpd.net/ XCache] స్థాపించబడింది",
+    "config-apc": "[http://www.php.net/apc APC] స్థాపించబడింది",
+    "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache] స్థాపించబడింది",
+    "config-diff3-bad": "GNU diff3 కనబడలేదు.",
+    "config-no-uri": "<strong>లోపం:</strong> ప్రస్తుత URI ఏమిటో నిర్ధారించలేకపోయాం.\nస్థాపన ఆగిపోయింది.",
+    "config-using-server": "సర్వరు పేరు \"<nowiki>$1</nowiki>\" ను వాడుతున్నాం.",
+    "config-using-uri": "సర్వరు URL \"<nowiki>$1$2</nowiki>\" ను వాడుతున్నాం.",
     "config-db-type": "డాటాబేసు రకం:",
+    "config-db-host": "డేటాబేసు హోస్టు:",
+    "config-db-host-help": "మీ డేటాబేసు సర్వరు వేరే సర్వరులో ఉంటే, దాని హోస్ట్ పేరు, ఐపీ చిరునామా ఇక్కడ ఇవ్వండి.\n\nమీరు షేర్‍డ్ వెబ్ హోస్టింగును వాడుతూంటే, మీ హోస్టింగు సేవను అందించేవారు తమ డాక్యుమెంటేషనులో సరైన హోస్ట్ పేరును ఇచ్చి ఉండాలి.\n\nమీరు విండోస్ సర్వరులో స్థాపిస్తూ, MySQL వాడుతూ ఉంటే, సర్వరు పేరుగా \"localhost\" పనిచెయ్యకపోవచ్చు. అపుడు, స్థానిక ఐపీ చిరునామాగా \"127.0.0.1\" వాడండి.\n\nమీరు PostgreSQL వాడుతూ ఉంటే, Unix సాకెట్ ద్వారా కనెక్టయేందుకు ఈ ఫీల్డును ఖాళీగా వదిలెయ్యండి.",
+    "config-db-host-oracle": "డేటాబేసు TNS:",
+    "config-db-wiki-settings": "ఈ వికీ గుర్తింపును ఇవ్వండి",
     "config-db-name": "డాటాబేసు పేరు:",
+    "config-db-name-help": "మీ వికీని సూచించే విధంగా ఓ పేరును ఎంచుకోండి.\nదానిలో స్పేసులు ఉండరాదు.\n\nమీరు షేర్‍డ్ వెబ్ హోస్టింగును వాడుతూంటే, మీకు హోస్టింగు సేవనందించేవారు మీకు ఓ డేటాబేసు పేరును గాని, లేదా కంట్రోలు ప్యానెలు ద్వారా ఓ డేటాబేసును సృష్టించుకునే వీలునుగానీ ఇస్తారు.",
+    "config-db-name-oracle": "డేటాబేసు స్కీమా:",
     "config-db-install-account": "స్థాపనకి వాడుకరి ఖాతా",
+    "config-db-username": "డేటాబేసు వాడుకరిపేరు:",
+    "config-db-password": "డేటాబేసు సంకేతపదం:",
+    "config-db-password-empty": "కొత్త డేటాబేసు వాడుకరి $1 కి ఓ సంకేతపదం ఇవ్వండి. \nసంకేతపదాలేమీ లేకుండా వాడుకరులను సృష్టించేవీలున్నప్పటికీ, అది సురక్షితం కాదు.",
+    "config-db-install-username": "స్థాపన దశలో డేటాబేసుకు కనెక్టయ్యేందుకు వాడే వాడుకరిపేరును ఇవ్వండి.\nఇది MediaWiki ఖాతా యొక్క వాడుకరిపేరు కాదు; మీ డేటాబేసు కోసం వాడుకరిపేరు.",
+    "config-db-install-password": "స్థాపన దశలో డేటాబేసుకు కనెక్టయ్యేందుకు వాడే సంకేతపదాన్ని ఇవ్వండి.\nఇది MediaWiki ఖాతా యొక్క సంకేతపదం కాదు; మీ డేటాబేసు కోసం సంకేతపదం.",
+    "config-db-install-help": "స్థాపన దశలో డేటాబేసుకు కనెక్టయ్యేందుకు వాడే వాడుకరిపేరు, సంకేతపదం ఇవ్వండి.",
+    "config-db-account-lock": "అదే వాడుకరిపేరును, సంకేతపదాన్ని మామూలు వాడుకలో కూడా వాడు",
+    "config-db-wiki-account": "మామూలు వాడుక కోసం వాడుకరి ఖాతా",
+    "config-db-wiki-help": "మామూలుగా వికీ పనిచేసేటపుడు వాడే డేటాబేసును కనెక్టయేందుకు వాడే వాడుకరిపేరును, సంకేతపదాన్నీ ఎంచుకోండి.\nఒకవేళ ఈ ఖాతా ఉనికిలో లేకపోతే, స్థాపన కోసం వాడుతున్న ఖాతాకు తగు విధమైన అనుమతులు ఉన్న పక్షంలో, ఈ ఖాతాను సృష్టిస్తాం. ఈ కొత్త ఖాతాకు వికీని నడిపేందుకు అవసరమైన అనుమతులను మాత్రం ఇస్తాం.",
+    "config-db-prefix": "డేటాబేసు టెబులు ఆదిపదం:",
+    "config-db-prefix-help": "ఒకటి కంటే ఎక్కువ వికీలను గానీ, లేదా మీడియావికీ తో పాటు మరో వెబ్ అప్లికేషన్ను గానీ ఒకే డేటాబేసు నుండి వాడదలిస్తే, టేబులు పేర్లకు ముందు ఓ ఆదిపదాన్ని (ప్రిఫిక్స్) ను ఎంచుకోండి. ఈ విధంగా పేర్ల ఘర్షణను నివారింవచ్చు. \nస్పేసులను వాడకండి.\n\nఈ ఫీల్డును సాధారణంగా ఖాళీగా ఉంచేస్తారు.",
+    "config-db-charset": "డేేటాబేసు కారెక్టరు సెట్",
+    "config-charset-mysql5-binary": "MySQL 4.1/5.0 బైనరీ",
     "config-charset-mysql5": "MySQL 4.1/5.0 UTF-8",
+    "config-charset-mysql4": "MySQL 4.0 backwards-compatible UTF-8",
+    "config-mysql-old": "MySQL $1 గానీ ఆ తరువాతిది గానీ కావాలి. మీకు $2 ఉంది.",
+    "config-db-port": "డేటాబేసు పోర్టు:",
+    "config-db-schema": "MediaWiki కొరకు స్కీమా:",
+    "config-db-schema-help": "మామూలుగా ఈ స్కీమా సరిపోతుంది.\nఅవసరమని మీకు తెలిస్తేనే మార్చండి.",
+    "config-pg-test-error": "డేటాబేసు <strong>$1</strong> కి కనెక్టు కాలేకపోయాం: $2",
+    "config-sqlite-dir": "SQLite డేటా డైరెక్టరీ:",
+    "config-oracle-def-ts": "డిఫాల్టు టేబుల్‍స్పేసు:",
+    "config-oracle-temp-ts": "తాత్కాలిక టేబుల్‍స్పేసు:",
+    "config-type-mysql": "MySQL (లేదా సరిపోయేది)",
+    "config-type-mssql": "Microsoft SQL Server",
+    "config-support-info": "MediaWiki కింది డేటాబేసు వ్యవస్థలకు అనుకూలిస్తుంది:\n\n$1\n\nమీరు వాడదలచిన డేటాబేసు వ్యవస్ కింది జాబితాలో లేకపోతే, పైన లింకు ద్వారా ఇచ్చిన సూచనలను పాటించి, అనుకూలతలను సాధించండి.",
+    "config-dbsupport-postgres": "* MySQL కు ప్రత్యామ్నాయంగా [{{int:version-db-postgres-url}} PostgreSQL] ప్రజామోదం పొందిన ఓపెన్‍సోర్సు డేటాబేసు వ్యవస్థ. దానిలో చిన్న చితకా లోపాలుండే అవకాశం ఉంది. అందుచేత దాన్ని ఉత్పాదక రంగంలో వాడవచ్చని చెప్పలేం.  ([http://www.php.net/manual/en/pgsql.installation.php How to compile PHP with PostgreSQL support])",
+    "config-dbsupport-sqlite": "* [{{int:version-db-sqlite-url}} SQLite] ఓ తేలికైన డేటాబేసు వ్యవస్థ. దానికి చక్కటి అనుకూలతలున్నాయి. ([http://www.php.net/manual/en/pdo.installation.php How to compile PHP with SQLite support], uses PDO)",
+    "config-dbsupport-oracle": "* [{{int:version-db-oracle-url}} Oracle] ఒక వాణిజ్యపరంగా సంస్థాగతంగా వాడదగ్గ డేటాబేసు. ([http://www.php.net/manual/en/oci8.installation.php How to compile PHP with OCI8 support])",
     "config-header-mysql": "MySQL అమరికలు",
     "config-header-postgres": "PostgreSQL అమరికలు",
     "config-header-sqlite": "SQLite అమరికలు",
     "config-header-oracle": "Oracle అమరికలు",
+    "config-header-mssql": "Microsoft SQL Server అమరికలు",
     "config-invalid-db-type": "తప్పుడు డాటాబేసు రకం",
+    "config-missing-db-name": "\"{{int:config-db-name}}\" ను తప్పకుండా ఇవ్వాలి",
+    "config-missing-db-host": "\"{{int:config-db-host}}\" ను తప్పకుండా ఇవ్వాలి",
+    "config-missing-db-server-oracle": "\"{{int:config-db-host-oracle}}\" ను తప్పకుండా ఇవ్వాలి",
+    "config-invalid-db-name": "డేటాబేసు పేరు సరైనది కాదు \"$1\".\nASCII అక్షరాలు (a-z, A-Z), అంకెలు (0-9), క్రీగీత (_) and హైఫన్ (-) లను మాత్రమే వాడాలి.",
+    "config-invalid-db-prefix": "డేటాబేసు ఆదిపదం (ప్రిఫిక్స్) సరైనది కాదు \"$1\".\nASCII అక్షరాలు (a-z, A-Z), అంకెలు (0-9), క్రీగీత (_) and హైఫన్ (-) లను మాత్రమే వాడాలి.",
     "config-connection-error": "$1.\n\nక్రింది హోస్టు, వాడుకరిపేరు మరియు సంకేతపదాలను ఒకసారి సరిచూసుకుని అప్పుడు ప్రయత్నించండి.",
+    "config-invalid-schema": "\"$1\" MediaWiki కోసం చెల్లని స్కీమా.\nASCII అక్షరాలు (a-z, A-Z), అంకెలు (0-9) క్రీగీత (_) లను మాత్రమే వాడాలి.",
+    "config-db-sys-user-exists-oracle": "వాడుకరి ఖాతా \"$1\" ఈసరికే ఉంది. కొత్త ఖాతాను సృష్టించేందుకు SYSDBA ను మాత్రమే వాడాలి!",
+    "config-postgres-old": "PostgreSQL $1 గానీ ఆ తరువాతిది గానీ అవసరం. మీకు $2 ఉంది.",
+    "config-mssql-old": "మైక్రోసాఫ్ట్ SQL సర్వర్ $1 లేదీ దాని తరువాతి వర్షన్ ఉండాలి. మీ దగ్గర $2 ఉంది.",
+    "config-sqlite-name-help": "మీ వికీని గుర్తించే పేరు ఒకదాన్ని ఎంచుకోండి.\nస్పేసులు గానీ, హైఫన్‍లు గానీ వాడకండి.\nదాన్ని SQLite డేటాఫైలు పేరు కోసంవాడతాం.",
+    "config-sqlite-mkdir-error": "డేటా డైరెక్టరీని సృష్టించడంలో లోపం \"$1\".\nస్థానాన్ని సరిచూసి మళ్ళీ ప్రయత్నించండి.",
+    "config-sqlite-connection-error": "$1.\n\nకింద ఉన్న డేటా డైరెక్టరీ, డేటాబేసు పేరును సరిచూసి మళ్ళీ ప్రయత్నించండి.",
+    "config-sqlite-readonly": "ఫైలు <code>$1</code> లో రాసే అనుమతి లేదు.",
+    "config-sqlite-cant-create-db": "డేటాబేసు ఫైలు <code>$1</code> సృష్టించలేకపోయాం.",
+    "config-upgrade-done-no-regenerate": ".ఉన్నతీకరణ పూర్తయింది.\n\nఇక మీరు [$1 మీ వికీలో పని మొదలుపెట్టవచ్చు].",
+    "config-regenerate": "LocalSettings.php ని తిరిగి సృజించు →",
+    "config-show-table-status": "<code>SHOW TABLE STATUS</code> క్వెరీ విఫలమైంది!",
+    "config-unknown-collation": "<strong>హెచ్చరిక:</strong> డేటాబేసు గుర్తింపులేని కొల్లేషన్ వాడుతున్నది.",
+    "config-db-web-account": "వెబ్ అందుబాటు కోసం డేటాబేసు ఖాతా",
+    "config-db-web-help": "మామూలుగా వికీని నడిపేటపుడు, వెబ్ సర్వరు డేటాబేసును కనెక్టయేందుకు వాడే వాడుకరిపేరు, సంకేతపదాలను ఎంచుకోండి.",
+    "config-db-web-account-same": "స్థాపనకు వాడిన ఖాతానే వాడు",
+    "config-db-web-create": "ఖాతా ఉనికిలో లేకపోతే, సృష్టించు",
+    "config-db-web-no-create-privs": "స్థాపన కోసం మీరిచ్చిన ఖాతాకు ఓ కొత్త ఖాతాను సృష్టించే అనుమతులు లేవు.\nఇక్కడ మీరిచ్చే ఖాతా తప్పనిసరిగా ఈసరికే ఉనికిలో ఉండాలి.",
+    "config-mysql-engine": "స్టోరేజీ ఇంజను:",
     "config-mysql-innodb": "InnoDB",
     "config-mysql-myisam": "MyISAM",
+    "config-mysql-charset": "డేటాబేసు కారెక్టరు సెట్:",
+    "config-mysql-binary": "బైనరీ",
     "config-mysql-utf8": "UTF-8",
+    "config-mssql-auth": "ఆథెంటికేషన్ రకం:",
+    "config-mssql-sqlauth": "SQL Server ఆథెంటికేషన్",
+    "config-mssql-windowsauth": "విండోస్ ఆథెంటికేషన్",
     "config-site-name": "వికీ యొక్క పేరు:",
+    "config-site-name-help": "ఇది బ్రౌజరు టిటిలుబారు లోను, అనేక ఇతర చోట్లా కనిపిస్తుంది.",
+    "config-site-name-blank": "ఓ సైటు పేరును ఇవ్వండి.",
+    "config-project-namespace": "ప్రాజెక్టు పేరుబరి:",
+    "config-ns-generic": "ప్రాజెక్టు",
+    "config-ns-site-name": "వికీ పేరే: $1",
     "config-ns-other": "ఇతర (ఇవ్వండి)",
     "config-ns-other-default": "నావికీ",
-    "config-admin-name": "మీ పేరు:",
+    "config-ns-invalid": "ఇచ్చిన పేరుబరి \"<nowiki>$1</nowiki>\" చెల్లనిది.\nవేరే ప్రాజెక్టు పేరుబరిని ఇవ్వండి.",
+    "config-ns-conflict": "ఇచ్చిన పేరుబరి \"<nowiki>$1</nowiki>\" డిఫాల్టు MediaWiki పేరుబరి ఒకదానితో ఘర్షిస్తోంది.\nవేరే ప్రాజెక్టు పేరుబరిని ఇవ్వండి.",
+    "config-admin-box": "నిర్వాహకుని ఖాతా",
+    "config-admin-name": "మీ వాడుకరి పేరు:",
     "config-admin-password": "సంకేతపదం:",
     "config-admin-password-confirm": "సంకేతపదం మళ్ళీ:",
+    "config-admin-name-blank": "ఓ నిర్వాహక వాడుకరిపేరును ఇవ్వండి",
+    "config-admin-name-invalid": "ఇచ్చిన వాడుకరిపేరు \"<nowiki>$1</nowiki>\" చెల్లనిది.\nవేరే వాడుకరిపేరును ఇవ్వండి.",
+    "config-admin-password-blank": "నిర్వాహక ఖాతాకు సంకేతపదం ఇవ్వండి.",
+    "config-admin-password-mismatch": "మీరిచ్చిన రెండు సంకేతపదాలు సరిపోలడం లేదు.",
     "config-admin-email": "ఈ-మెయిలు చిరునామా:",
+    "config-admin-error-user": "\"<nowiki>$1</nowiki>\" పేరుతో నిర్వాహకుణ్ణి సృష్టించబోతే అంతర్గత లోపం దొర్లింది.",
+    "config-admin-error-password": "నిర్వాహకుడు \"<nowiki>$1</nowiki>\" కు సంకేతపదాన్ని ఇవ్వబోతే అంతర్గత లోపం దొర్లింది: <pre>$2</pre>",
+    "config-admin-error-bademail": "మీరు చెల్లని ఈమెయిలు చిరునామా ఇచ్చారు.",
+    "config-subscribe": "[https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce విడుదల ప్రకటనల మెయిలింగు జాబితా] కు చందాదారులు కండి.",
+    "config-almost-done": "దాదాపు పూర్తైనట్లే!\nమిగతా కాన్ఫిగరేషన్ను దాటేసి, ఇప్పుడే వికీని స్థాపించుకోవచ్చు.",
     "config-optional-continue": "నన్ను మరిన్ని ప్రశ్నలు అడుగు.",
-    "config-profile-wiki": "సంప్రదాయ వికీ",
+    "config-optional-skip": "నాకు బోరు కొట్టేసింది, ఇక వికీని స్థాపించేయ్.",
+    "config-profile": "వాడుకరి హక్కుల ప్రవర:",
+    "config-profile-wiki": "వికీని తెరువు",
     "config-profile-no-anon": "ఖాతా సృష్టింపు తప్పనిసరి",
+    "config-profile-fishbowl": "అధీకృత వాడుకరులు మాత్రమే",
     "config-profile-private": "అంతరంగిక వికీ",
     "config-license": "కాపీహక్కులు మరియు లైసెన్సు:",
+    "config-license-none": "లైసెన్సు పాదపీఠిక వద్దు",
     "config-license-pd": "సార్వజనీనం",
     "config-email-settings": "ఈ-మెయిల్ అమరికలు",
+    "config-enable-email": "ఈమెయిళ్ళు పంపడాన్ని చేతనం చెయ్యి",
+    "config-email-user": "వాడుకరి-నుండి-వాడుకరికి ఈమెయిళ్ళని చేతనం చెయ్యి",
+    "config-email-user-help": "వాడుకరులంతా తమ తమ అభిరుచుల్లో సెట్ చేసుకుని ఉంటే, ప్రతి ఒక్కరూ ప్రతీ ఒక్కరికీ ఈమెయిళ్ళు పంపించుకునే వీలును కల్పించు.",
+    "config-email-usertalk": "వాడుకరి చర్చా పేజీ వార్తాహరిని చేతనం చెయ్యి",
+    "config-email-usertalk-help": "వాడుకరులు వారి ప్రాధాన్యతలలో చేతనం చేస్తే వారి వీక్షించే పేజీలు గురించి నోటిఫికేషన్లు అందుకోవడానికి అనుమతించు.",
+    "config-email-watchlist": "వీక్షణజాబితా నోటిఫికేషన్లను చేతనం చేయి",
+    "config-email-watchlist-help": "వాడుకరులు వారి ప్రాధాన్యతలలో చేతనం చేస్తే వారి వీక్షించే పేజీలు గురించి నోటిఫికేషన్లు అందుకోవడానికి అనుమతించు.",
+    "config-email-auth": "ఈమెయిల్ ప్రమాణీకరణను చేతనం చేయండి",
+    "config-email-auth-help": "దీన్ని ఎంచుకుంటే, వాడుకరులు ఈమెయిలు కొత్తగా ఇచ్చేటపుడు లేదా మార్చేటపుడు తమకు వచ్చిన లింకు నొక్కి తమ చిరునామాను నిర్ధారించాలి.\nనిర్ధారించిన ఈమెయిలు చిరునామాలు మాత్రమే ఇతర వాడుకరుల నుంచి, మార్పు నోటిఫికేషన్లు అందుకునే వీలుంది.\nబహిరంగ వికీలలో దీన్ని ఎంచుకోవడం <strong>ఉత్తమమైన</strong> పద్ధతి. ఎందుకంటే మీ ఈమెయిలును ఎవరూ దుర్వినియోగం చేయలేరు.",
+    "config-email-sender": "తిరుగు టపా చిరునామా:",
+    "config-upload-settings": "బొమ్మలు, ఫైళ్ళ ఎక్కింపులు",
+    "config-upload-enable": "ఫైళ్ళ ఎక్కింపును చేతనం చెయ్యి",
     "config-upload-deleted": "తొలగించిన దస్త్రాల కొరకు సంచయం:",
+    "config-upload-deleted-help": "తొలగించిన ఫైళ్ళను ఏ డైరెక్టరీలో అటకెక్కించాలో ఎంచుకోండి.\nఇది వెబ్‍లో అందుబాటులో లేకుండా ఉంటే మంచిది.,",
+    "config-logo": "లోగో URL:",
+    "config-instantcommons": "తక్షణ కామన్స్ ను చేతనం చెయ్యి",
+    "config-cc-again": "మళ్ళీ ఎంచుకోండి...",
+    "config-cc-not-chosen": "ఏ Creative Commons లైసెన్సు కావాలో ఎంచుకుని \"కొనసాగు\" ను నొక్కండి.",
     "config-advanced-settings": "ఉన్నత స్వరూపణం",
+    "config-cache-options": "ఆబ్జక్ట్ క్యాషింగ్ అమరికలు:",
+    "config-cache-help": "ఆబ్జక్ట్ క్యాషింగ్ అనేది తరచు వాడే డేటాను సిద్ధంగా ఉంచడం ద్వారా మీడియావికీ పనితీరును మెరుగుపరచడానికి ఉద్దేశించినది.\nమధ్యతరగతి నుంచి పెద్ద సైట్లలో దీనిని చేతనం చేయడాన్ని ప్రోత్సహిస్తున్నాం. అలాగే చిన్న సైట్లు కూడా దీన్నుంచి ప్రయోజనం పొందగలవు.",
+    "config-memcached-help": "Memcached కోసం వాడాల్సిన ఐపీ చిరునామాలు.\nవరస కొకటి రాయాలి. పోర్టును కూడా సూచించాలి. ఉదాహరణకు:\n 127.0.0.1:11211\n 192.168.1.25:1234",
+    "config-memcache-badip": "Memcached కోసం ఇచ్చిన ఐపీ చిరునామా చెల్లనిది: $1.",
+    "config-memcache-noport": "Memcached సర్వరు కోసం వాడేందుకు పోర్టును ఇవ్వలేదు: $1.\nమీకు పోర్టు తెలీనట్లైతే, డిఫాల్టు పోర్టు: 11211.",
+    "config-memcache-badport": "Memcached పోర్టు సఖ్యలు $1, $2 ల మధ్య ఉండాలి.",
+    "config-extensions": "పొడిగింతలు",
+    "config-extensions-help": "పైన చూపిన పొడిగింతలు మీ <code>./extensions</code> డైరెక్టరీలో ఉన్నాయి.\n\nవాటికి అదనంగా కాన్ఫిగరేషన్ అవసరం కావచ్చు. అయితే మీరు వాటిని చేతనం చెయ్యవచ్చు.",
+    "config-install-alreadydone": "<strong>హెచ్చరిక:</strong> మీరు ఈసరికే MediaWiki ని స్థాపించినట్లుగా అనిపిస్తోంది. మళ్ళీ స్థాపించే ప్రయత్నం చేస్తున్నట్లున్నారు.\nతరువాత పేజీకి వెళ్ళండి.",
+    "config-install-begin": "\"{{int:config-continue}}\" నొక్కి, MediaWiki స్థాపనను మొదలుపెట్టవచ్చు.\nఇంకా మార్పులు చెయ్యదలిస్తే, \"{{int:config-back}}\" నొక్కండి.",
     "config-install-step-done": "పూర్తయింది",
     "config-install-step-failed": "విఫలమైంది",
+    "config-install-extensions": "పొడిగింతలను చేరుస్తున్నాం",
+    "config-install-database": "డేటాబేసును స్థాపిస్తున్నాం",
+    "config-install-schema": "స్కీమాను సృష్టిస్తున్నాం",
+    "config-install-pg-schema-not-exist": "PostgreSQL స్కీమా లేదు.",
+    "config-install-pg-schema-failed": "టేబుళ్ళ సృష్టి విఫలమైంది.\nవాడుకరి \"$1\" కు స్కీమా \"$2\" లో రాసే అనుమతి ఉన్నదని నిర్ధారించుకోండి.",
+    "config-install-pg-commit": "మార్పులను నిర్ధారిస్తున్నాం",
+    "config-install-pg-plpgsql": "PL/pgSQL భాష కోసం పరీక్షిస్తున్నాం",
+    "config-pg-no-plpgsql": "డేటాబేసు $1 లో PL/pgSQL భాషను స్థాపించాల్సిన అవసరం ఉంది.",
+    "config-pg-no-create-privs": "స్థాపన కోసం మీరిచ్చిన ఖాతాకు, ఓ ఖాతా సృష్టించేందుకు అవసరమైన హక్కులు లేవు.",
+    "config-install-user": "డేటాబేసు వాడుకరిని సృష్టిస్తున్నాం",
+    "config-install-user-alreadyexists": "వాడుకరి \"$1\" ఈసరికే ఉన్నారు",
+    "config-install-user-create-failed": "వాడుకరి \"$1\" సృష్టించడం విఫలమైంది: $2",
+    "config-install-user-grant-failed": "వాడుకరి \"$1\" కి అనుమతి ప్రసాదించడం విఫలమైంది: $2",
+    "config-install-user-missing": "సూచించిన వాడుకరి \"$1\" ఉనికిలో లేరు.",
+    "config-install-user-missing-create": "మీరిచ్చిన వాడుకరి \"$1\" ఉనికిలో లేదు.\nదాన్ని సృష్టించదలిస్తే, కింద ఉన్న \"ఖాతాను సృష్టించు\" చెక్‍బాక్సును నొక్కండి.",
+    "config-install-tables": "టేబుళ్ళను సృష్టిస్తున్నాం",
+    "config-install-tables-exist": "<strong>హెచ్చరిక:</strong> MediaWiki టేబుళ్ళు ఈసరికే ఉన్నట్లుగా ఉన్నాయి.\nసృష్టించడాన్ని తప్పిస్తున్నాం.",
+    "config-install-tables-failed": "<strong>లోపం:</strong> టేబుల్ సృష్టి ఈ లోపంతో విఫలమైంది: $1",
+    "config-install-interwiki": "డిఫాల్టు అంతరవికీ టేబులులో డేటాను పెడుతున్నాం",
+    "config-install-interwiki-list": "<code>interwiki.list</code> ఫైలును చదవలేకపోయాం.",
+    "config-install-interwiki-exists": "<strong>హెచ్చరిక:</strong> అంతర్వికీ టేబుల్ లో ఈసరికే ఎంట్రీలున్నట్లుగా ఉన్నాయి.\nడిఫాల్టు జాబితాను దాటేస్తున్నాం.",
+    "config-install-stats": "గణాంకాలను తొలికరిస్తున్నాం (ఇనిషియలైజింగ్)",
+    "config-install-keys": "రహస్య కీలను సృష్టిస్తున్నాం",
+    "config-install-sysop": "అధికారి ఖాతా సృష్టిస్తున్నాము",
+    "config-install-mainpage": "డిఫాల్టు కంటెంటుతో మొదటిపేజీని సృష్టిస్తున్నాం",
+    "config-install-extension-tables": "చేతనం చేసిన పొడిగింతల కోసం టేబుళ్ళను సృష్టిస్తున్నాం",
+    "config-install-mainpage-failed": "మొదటిపేజీని చొప్పించలేకపోయాం: $1",
+    "config-download-localsettings": "<code>LocalSettings.php</code> దించు",
     "config-help": "సహాయం",
+    "config-nofile": "\"$1\" ఫైలు దొరకలేదు. దాన్ని గానీ తొలగించారా?",
     "mainpagetext": "'''మీడియా వికీని విజయవంతంగా ప్రతిష్టించాం.'''",
     "mainpagedocfooter": "వికీ సాఫ్టువేరును వాడటనికి కావలిసిన సమాచారం కోసం [//meta.wikimedia.org/wiki/Help:Contents వాడుకరుల గైడు]ను సందర్శించండి.\n\n== మొదలు పెట్టండి ==\n\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings మీడియావికీ పనితీరు, అమరిక మార్చుకునేందుకు వీలుకల్పించే చిహ్నాల జాబితా]\n* [//www.mediawiki.org/wiki/Manual:FAQ మీడియావికీపై తరుచుగా అడిగే ప్రశ్నలు]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce మీడియావికీ సాఫ్టువేరు కొత్త వెర్షను విడుదలల గురించి తెలిపే మెయిలింగు లిస్టు]"
-}
\ No newline at end of file
+}
index b2622bd..11d1acb 100644 (file)
@@ -6,4 +6,4 @@
     },
     "config-page-language": "Lian",
     "config-page-name": "Naran"
-}
\ No newline at end of file
+}
index d60885b..ab5d158 100644 (file)
@@ -1,7 +1,5 @@
 {
-    "@metadata": {
-        "authors": []
-    },
+    "@metadata": [],
     "mainpagetext": "'''Нармафзори МедиаВики бо муваффақият насб шуд.'''",
     "mainpagedocfooter": "Аз [//meta.wikimedia.org/wiki/Help:Contents Роҳнамои Корбарон] барои истифодаи нармафзори вики кӯмак бигиред.\n\n== Оғоз ба кор ==\n\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Феҳристи танзимоти пайгирбандӣ]\n* [//www.mediawiki.org/wiki/Manual:FAQ Пурсишҳои МедиаВики]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Феҳристи ройномаҳои нусхаҳои МедиаВики]"
-}
\ No newline at end of file
+}
index ca94e92..811051d 100644 (file)
@@ -6,4 +6,4 @@
     },
     "mainpagetext": "'''Narmafzori MediaViki bo muvaffaqijat nasb şud.'''",
     "mainpagedocfooter": "Az [//meta.wikimedia.org/wiki/Help:Contents Rohnamoi Korbaron] baroi istifodai narmafzori viki kūmak bigired.\n\n== Oƣoz ba kor ==\n\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Fehristi tanzimoti pajgirbandī]\n* [//www.mediawiki.org/wiki/Manual:FAQ Pursişhoi MediaViki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Fehristi rojnomahoi nusxahoi MediaViki]"
-}
\ No newline at end of file
+}
index 5b4dd80..400957f 100644 (file)
@@ -1,9 +1,10 @@
 {
     "@metadata": {
         "authors": [
-            "Korrawit"
+            "Korrawit",
+            "Horus"
         ]
     },
-    "mainpagetext": "'''ติดตั้งซอฟต์แวร์มีเดียวิกิเรียบร้อย'''",
+    "mainpagetext": "<strong>ติดตั้งมีเดียวิกิสำเร็จ</strong>",
     "mainpagedocfooter": "ศึกษา[//meta.wikimedia.org/wiki/Help:Contents คู่มือการใช้งาน] สำหรับเริ่มต้นใช้งานซอฟต์แวร์วิกิ\n\n== เริ่มต้น ==\n\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings รายการการปรับแต่งระบบ] (ภาษาอังกฤษ)\n* [//www.mediawiki.org/wiki/Manual:FAQ คำถามที่ถามบ่อยในมีเดียวิกิ] (ภาษาอังกฤษ)\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce เมลลิงลิสต์ของมีเดียวิกิ]"
-}
\ No newline at end of file
+}
index 4b0ddfc..37e2010 100644 (file)
@@ -6,4 +6,4 @@
     },
     "mainpagetext": "'''MediaWiki şowlulyk bilen guruldy.'''",
     "mainpagedocfooter": "Wiki programmasynyň ulanylyşy hakynda maglumat almak üçin [//meta.wikimedia.org/wiki/Help:Contents ulanyjy gollanmasyna] serediň.\n\n== Öwrenjeler ==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Konfigurasiýa sazlamalary]\n* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki SSS]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki e-poçta sanawy]"
-}
\ No newline at end of file
+}
index 93b0d8c..c28185b 100644 (file)
@@ -3,7 +3,9 @@
         "authors": [
             "AnakngAraw",
             "Sky Harbor",
-            "아라"
+            "아라",
+            "Amire80",
+            "Jojit fb"
         ]
     },
     "config-desc": "Ang tagapagluklok para sa MediaWiki",
     "config-magic-quotes-runtime": "'''Malubha: Masigla ang [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-runtime magic_quotes_runtime]!'''\nAng piniling ito ay hindi mahuhulaan na pipinsala sa lahok na dato.\nHindi mo maaaring iluklok o gamitin ang MediaWiki maliban na lamang kung hindi na gumagana ang pinili na ito.",
     "config-magic-quotes-sybase": "'''Malubha: Masigla ang [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-sybase magic_quotes_sybase]!'''\nHindi mahuhulaan na sinisira ng napiling ito ang lahok na dato.\nHindi mo maaaring iluklok o gamitin ang MediaWiki maliban na lamang kung hindi na pinagagana ang napiling ito.",
     "config-mbstring": "'''Malubha: Masigla ang [http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload]!'''\nAng napiling ito ay nagdurulot ng mga kamalian at maaaring sumira nang hindi nahuhulaan ang dato.\nHindi mo maaaring iluklok o gamitin ang MediaWiki maliban na lamang kung hindi na pinagagana ang napiling ito.",
-    "config-ze1": "'''Malubha: Masigla ang [http://www.php.net/manual/en/ini.core.php zend.ze1_compatibility_mode]!'''\nAng napiling ito ay nagsasanhi ng karima-rimarim na mga sira sa MediaWiki.\nHindi mo maaaring iluklok o gamitin ang MediaWiki maliban na lamang kung hindi na pinagagana ang napiling ito.",
     "config-safe-mode": "'''Babala:''' Masigla ang [http://www.php.net/features.safe-mode safe mode] ng PHP.\nMaaari itong magdulot ng mga suliranin, partikular na kung gumagamit ng mga ikinargang paitaas na talaksan at ng suporta sa <code>math</code>.",
     "config-xml-bad": "Nawawala ang modulong XML ng PHP.\nNangangailangan ang MediaWiki ng mga tungkulin sa loob ng modulong ito at hindi aandar sa loob ng ganitong pagkakaayos.\nKung pinapatakbo mo ang Mandrake, iluklok ang pakete ng php-xml.",
-    "config-pcre": "Tila nawawala ang modyul na pangsuporta ng PCRE.\nNangangailangan ang MediaWiki ng nakaukol sa Perl na mga tungkulin ng karaniwang pagsasaad upang gumana.",
     "config-pcre-no-utf8": "'''Malubha''': Tila tinipon ang modyul na PCRE ng PHP na wala ang suporta ng PCRE_UTF8.\nNangangailangan ang MediaWiki ng suporta ng UTF-8 upang maging tama ang pag-andar.",
     "config-memory-raised": "Ang <code>hangganan_ng_alaala</code> ng PHP ay $1, itinaas sa $2.",
     "config-memory-bad": "'''Babala:''' Ang <code>hangganan_ng_alaala</code> ng PHP ay $1.\nIto ay maaaring napakababa.\nMaaaring mabigo ang pagluluklok!",
@@ -84,7 +84,6 @@
     "config-uploads-not-safe": "'''Babala:''' Ang iyong likas na nakatakdang direktoryo para sa paitaas na mga pagkakarga na <code>$1</code> ay may kahinaan laban sa pagsasagawa ng mga panitiki na hindi makatwiran. Bagaman sinisiyasat ng MediaWiki ang lahat ng paitaas na naikargang mga talaksan para sa mga panganib na pangkatiwasayan, mataas na iminumungkahi na [//www.mediawiki.org/wiki/Manual:Security#Upload_security isara ang kahinaang ito na pangkatiwasayan] bago paganahin ang paitaas na mga pagkakarga.",
     "config-no-cli-uploads-check": "'''Babala:''' Ang iyong likas na nakatakdang direktoryo para sa paitaas na mga pagkakarga (<code>$1</code>) ay hindi nasuri para sa kahinaan laban sa pagsasagawa ng panitik na hindi makatwiran habang iniluluklok ang Ugnayang Mukha ng Guhit ng Kaataasan o Command-Line Interface (CLI).",
     "config-brokenlibxml": "Ang sistema mo ay mayroong isang pagsasama ng mga bersiyon ng PHP at libxml2 na maaaring masurot at maaaring makapagsanhi ng pagkasira ng datong nakakubli sa loob ng MediaWiki at iba pang mga aplikasyon ng sangkasaputan.\nMagtaas ng uri upang maging PHP 5.2.9 o mas lalong huli at libxml2 2.7.3 o mas lalong huli ([//bugs.php.net/bug.php?id=45996 isinalansan ang surot o ''bug'' na mayroong PHP]). Binigo ang pagluluklok.",
-    "config-using531": "Hindi maaaring gamitin ang MediaWiki na kapiling ang PHP na $1 dahil sa isang surot na kinasasangkutan ng mga parametrong pangsangguni sa <code>__call()</code>. Magtaas ng uri upang maging PHP 5.3.2 o mas mataas, o magbaba ng uri upang maging PHP 5.3.0 upang malutas ito. Binigo ang pagluluklok.",
     "config-suhosin-max-value-length": "Nakaluklok ang Suhosin at hinahanggahan ang haba ng parametro ng GET sa $1 mga byte. Ang sangkap na ResourceLoader ng MediaWiki ay gagana sa paligid ng hangganang ito, subalit pasasamain nito ang pagganap. Kung talagang maaari, dapat mong itakda ang <code>suhosin.get.max_value_length</code> upang maging 1024 o mas mataas sa loob ng <code>php.ini</code>, at itakda ang <code>$wgResourceLoaderMaxQueryLength</code> sa katulad na halaga sa loob ng LocalSettings.php.",
     "config-db-type": "Uri ng kalipunan ng datos:",
     "config-db-host": "Tagapagpasinaya ng kalipunan ng datos:",
     "config-db-account-oracle-warn": "Mayroong tatlong tinatangkilik na tagpo para sa pagluluklok ng Oracle bilang panlikurang hulihan ng kalipunan ng dato:\n\nKung nais mong lumikha ng akawnt ng kalipunan ng dato bilang bahagi ng proseso ng pagluluklok, paki magbigay ng isang akawnt na mayroong gampanin ng SYSDBA bilang akawnt ng kalipunan ng dato para sa pagluluklok at tukuyin ang ninanais na mga kredensiyal para sa akawnt ng pagpunta sa sangkasaputan, o di kaya ay maaaring kinakamay na lumikha ng akawnt ng pagpunta sa sangkasaputan at ibigay lamang ang akawnt na iyan (kung mayroong ito ng kinakailangang mga pahintulot upang malikha ang mga bagay na pampagpapanukala) o magbigay ng dalawang magkaibang mga akawnt, isang mayroong pribilehiyo ng paglikha at isang may pagbabawal para sa pagpunta sa sangkasaputan.\n\nAng panitik sa paglikha ng isang akawnt na mayroon ng kinakailangang mga pribilehiyo ay matatagpuan sa loob ng direktoryong \"maintenance/oracle/\" ng pagluluklok na ito. Pakatandaan na ang paggamit ng isang akawnt na may pagbabawal ay hindi magpapagana isa lahat ng mga kakayahang pampananatili sa piling ng likas na nakatakdang akawnt.",
     "config-db-install-account": "Akawnt ng tagagamit para sa pagluluklok",
     "config-db-username": "Pangalang pangtagagamit ng kalipunan ng dato:",
-    "config-db-password": "Hudyat sa kalipunan ng dato:",
+    "config-db-password": "Password sa kalipunan ng dato:",
     "config-db-password-empty": "Paki magpasok ng isang hudyat para sa bagong tagagamit ng kalipunan ng dato: $1.\nHabang maging maaari na makalikha ng mga tagagamit na walang mga hudyat, hindi ito ligtas.",
     "config-db-install-username": "Ipasok ang pangalan ng tagagamit na gagamitin upang kumabit sa kalipunan ng dato habang isinasagawa ang pagluluklok.\nHindi ito ang pangalan ng tagagamit ng akawnt ng MediaWiki; ito ang pangalan ng tagagamit para sa iyong kalipunan ng dato.",
-    "config-db-install-password": "Ipasok ang hudyat na gagamitin upang kumabit sa kalipunan ng dato habang isinasagawa ang pagluluklok.\nHindi ito ang hudyat para sa akawnt ng MediaWiki; ito ang hudyat para sa iyong kalipunan ng dato.",
+    "config-db-install-password": "Ipasok ang password na gagamitin upang maka-connect sa database habang isinasagawa ang pag-install.\nHindi ito ang password para sa akawnt ng MediaWiki; ito ang password para sa iyong database.",
     "config-db-install-help": "Ipasok ang pangalan ng tagagamit at hudyat na gagamitin upang umugnay sa kalipunan ng dato habang isinasagawa ang pagluluklok.",
-    "config-db-account-lock": "Gamitin ang gayun ding pangalan ng tagagamit at hudyat habang nasa normal na operasyon",
+    "config-db-account-lock": "Gamitin ang kaparehong pangalan at password habang nasa normal na operasyon",
     "config-db-wiki-account": "Akawnt ng tagagamit para sa pangkaraniwang pagpapaandar",
     "config-db-wiki-help": "Ipasok ang pangalan ng tagagamit at hudyat na gagamitin upang kumabit sa kalipunan ng dato habang nasa karaniwang pagtakbo ng wiki.\nKung hindi umiiral ang akawnt, at ang akawnt ng pagluluklok ay mayroong sapat na mga pribilehiyo, ang akawnt na ito ng tagagamit ay lilikhain na mayroong pinaka mababang mga pribilehiyo na kailangan upang mapatakbo ang wiki.",
     "config-db-prefix": "Unlapi ng talahanayan ng kalipunan ng dato:",
     "config-type-sqlite": "SQLite",
     "config-type-oracle": "Oracle",
     "config-support-info": "Sinusuportahan ng MediaWiki ang sumusunod na mga sistema ng kalipunan ng dato:\n\n$1\n\nKung hindi mo makita ang sistema ng kalipunan ng dato na sinusubukan mong gamitin na nakatala sa ibaba, kung gayon ay sundi ang mga tagubilin na nakakawing sa itaas upang mapagana ang suporta,",
-    "config-support-mysql": "* Ang $1 ay ang pangunahing puntirya para sa MediaWiki at ang pinaka sinusuportahan ([http://www.php.net/manual/en/mysql.installation.php paano magtipon ng PHP na mayroong suporta ng MySQL])",
-    "config-support-postgres": "* Ang $1 ay isang bantog na sistema ng kalipunan ng dato na bukas ang pinagmulan na panghalili sa MySQL ([http://www.php.net/manual/en/pgsql.installation.php paano magtipon ng PHP na mayroong suporta ng PostgreSQL]). Maaaring mayroong ilang hindi pangunahing mga surot na natitira pa, at hindi iminumungkahi para gamitin sa loob ng isang kapaligiran ng produksiyon.",
-    "config-support-sqlite": "Ang $1 ay isang magaan ang timbang na sistema ng kalipunan ng dato na sinusuportahan nang napaka mainam. ([http://www.php.net/manual/en/pdo.installation.php Paano magtipon ng PHP na mayroong suporta ng SQLite], gumagamit ng PDO)",
-    "config-support-oracle": "* Ang $1 ay isang kalipunan ng dato ng kasigasigang pangkalakal. ([http://www.php.net/manual/en/oci8.installation.php Paano magtipunan ng PHP na mayroong suporta ng OCI8])",
+    "config-dbsupport-mysql": "* Ang $1 ay ang pangunahing puntirya para sa MediaWiki at ang pinaka sinusuportahan ([http://www.php.net/manual/en/mysql.installation.php paano magtipon ng PHP na mayroong suporta ng MySQL])",
+    "config-dbsupport-postgres": "* Ang $1 ay isang bantog na sistema ng kalipunan ng dato na bukas ang pinagmulan na panghalili sa MySQL ([http://www.php.net/manual/en/pgsql.installation.php paano magtipon ng PHP na mayroong suporta ng PostgreSQL]). Maaaring mayroong ilang hindi pangunahing mga surot na natitira pa, at hindi iminumungkahi para gamitin sa loob ng isang kapaligiran ng produksiyon.",
+    "config-dbsupport-sqlite": "Ang $1 ay isang magaan ang timbang na sistema ng kalipunan ng dato na sinusuportahan nang napaka mainam. ([http://www.php.net/manual/en/pdo.installation.php Paano magtipon ng PHP na mayroong suporta ng SQLite], gumagamit ng PDO)",
+    "config-dbsupport-oracle": "* Ang $1 ay isang kalipunan ng dato ng kasigasigang pangkalakal. ([http://www.php.net/manual/en/oci8.installation.php Paano magtipunan ng PHP na mayroong suporta ng OCI8])",
     "config-header-mysql": "Mga katakdaan ng MySQL",
     "config-header-postgres": "Mga katakdaan ng PostgreSQL",
     "config-header-sqlite": "Mga katakdaan ng SQLite",
     "config-invalid-db-server-oracle": "Hindi katanggap-tanggap na pangalan ng TNSng kalipunan ng dato na \"$1\".\nGumamit lamang ng mga titik ng ASCII (a-z, A-Z), mga bilang (0-9), mga salungguhit (_) at mga tuldok (.).",
     "config-invalid-db-name": "Hindi tanggap na pangalan ng kalipunan ng dato na \"$1\".\nGumamit lamang ng mga titik ng ASCII (a-z, A-Z), mga bilang (0-9), mga salungguhit (_) at mga gitling (-).",
     "config-invalid-db-prefix": "Hindi tanggap na unlapi ng kalipunan ng dato na \"$1\".\nGamitin lamang ang mga titik na ASCII (a-z, A-Z), mga bilang (0-9), mga salungguhit (_) at mga gitling (-).",
-    "config-connection-error": "$1.\n\nSuriin ang punong-abala, pangalan ng tagagamit at hudyat na nasa ibaba at subukan ulit.",
+    "config-connection-error": "$1.\n\nSuriin ang host, pangalan at password na nasa ibaba at subukan ulit.",
     "config-invalid-schema": "Hindi katanggap-tanggap na panukala para sa \"$1\" ng MediaWiki.\nGumamit lamang ng mga titik ng ASCII (a-z, A-Z), mga bilang (0-9), at mga salungguhit (_).",
     "config-db-sys-create-oracle": "Ang panluklok ay tumatangkilik lamang sa paggamit ng isang akawnt ng SYSDBA para sa paglikha ng isang bagong akawnt.",
     "config-db-sys-user-exists-oracle": "Umiiral na ang akawnt ng tagagamit na \"$1\". Magagamit lamang ang SYSDBA para sa paglikha ng isang bagong akawnt!",
     "config-ns-conflict": "Ang tinukoy na puwang ng pangalan na \"<nowiki>$1</nowiki>\" ay sumasalungat sa isang likas na nakatakdang puwang ng pangalan ng MediaWiki.\nTumukoy ng isang ibang puwang ng pangalan ng proyekto.",
     "config-admin-box": "Akawnt ng tagapangasiwa",
     "config-admin-name": "Pangalan mo:",
-    "config-admin-password": "Hudyat:",
-    "config-admin-password-confirm": "Hudyat uli:",
+    "config-admin-password": "Password:",
+    "config-admin-password-confirm": "Password uli:",
     "config-admin-help": "Ipasok dito ang mas ninanais mong pangalan ng tagagamit, bilang halimbawa na ang \"Joe Bloggs\".\nIto ang pangalang gagamitin mo upang lumagdang papasok sa wiki.",
     "config-admin-name-blank": "Magpasok ng isang pangalan ng tagagamit na tagapangasiwa.",
     "config-admin-name-invalid": "Ang tinukoy na pangalan ng tagagamit na \"<nowiki>$1</nowiki>\" ay hindi tanggap.\nTumukoy ng ibang pangalan ng tagagamit.",
-    "config-admin-password-blank": "Magpasok ng isang hudyat para sa akawnt ng tagapangasiwa.",
-    "config-admin-password-same": "Ang hudyat ay hindi dapat na katulad ng pangalan ng tagagamit.",
-    "config-admin-password-mismatch": "Hindi magkatugma ang ipinasok mong dalawang mga hudyat.",
+    "config-admin-password-blank": "Magpasok ng isang password para sa akawnt ng tagapangasiwa.",
+    "config-admin-password-mismatch": "Hindi magkatugma ang ipinasok mong dalawang mga password.",
     "config-admin-email": "Tirahan ng e-liham:",
     "config-admin-email-help": "Magpasok dito ng isang tirahan ng e-liham upang mapahintulutan kang makatanggap ng e-liham mula sa iba pang mga tagagamit sa ibabaw ng wiki, itakdang muli ang hudyat mo, at mapabatiran ng mga pagbabago sa mga pahinang nasa ibabaw ng iyong tala ng mga binabantayan. Maiiwanan mo na walang laman ang hanay na ito.",
     "config-admin-error-user": "Panloob na kamalian kapag nililikha ang isang tagapangasiwa na may pangalang \"<nowiki>$1</nowiki>\".",
     "config-nofile": "Hindi matagpuan ang talaksang \"$1\". Binura na ba ito?",
     "mainpagetext": "'''Matagumpay na ininstala ang MediaWiki.'''",
     "mainpagedocfooter": "Silipin ang [//meta.wikimedia.org/wiki/Help:Contents Patnubay sa Tagagamit] (''\"User's Guide\"'') para sa kaalaman sa paggamit ng wiking ''software''.\n\n== Pagsisimula ==\n\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Tala ng mga nakatakdang kumpigurasyon]\n* [//www.mediawiki.org/wiki/Manual:FAQ Mga malimit itanong sa MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Tala ng mga pinadadalhan ng liham ng MediaWiki]"
-}
\ No newline at end of file
+}
index f8e1bcd..f6ec04d 100644 (file)
@@ -5,4 +5,4 @@
         ]
     },
     "config-page-options": "Кукон"
-}
\ No newline at end of file
+}
index ec5a6b0..b04ce40 100644 (file)
@@ -1,7 +1,193 @@
 {
     "@metadata": {
-        "authors": []
+        "authors": [
+            "Cagrix",
+            "Joseph",
+            "Rhinestorm",
+            "SiLveRLeaD",
+            "Trncmvsr"
+        ]
     },
+    "config-desc": "MediaWiki yükleyicisi",
+    "config-title": "MediaWiki $1 yüklemesi",
+    "config-information": "Bilgi",
+    "config-localsettings-upgrade": "Bir <code>LocalSettings.php</code> dosyası algılandı.\nBu kurulumu güncelleştirmek için, lütfen <code>$wgUpgradeKey</code> değerini aşağıdaki kutuya girin.\nBunu <code>LocalSettings.php</code> dosyasında bulabilirsiniz.",
+    "config-localsettings-cli-upgrade": "Bir <code>LocalSettings.php</code> dosyası algılandı.\nBu kurulumu güncelleştirmek için, lütfen <code>update.php</code> dosyasını çalıştırın.",
+    "config-localsettings-key": "Yükseltme anahtarı:",
+    "config-localsettings-badkey": "Sağladığınız anahtar doğru değil.",
+    "config-upgrade-key-missing": "Mevcut bir MediaWiki kurulumu algılandı.\nBu kurulumu güncelleştirmek için, lütfen aşağıdaki satırı <code>LocalSettings.php</code> dosyanızın en altına koyun:\n\n$1",
+    "config-localsettings-incomplete": "Mevcut <code>LocalSettings.php</code> eksik gibi görünüyor.\n $1  değişkeni ayarlanmamış.\nLütfen <code>LocalSettings.php</code> dosyasını değiştirin bu değişkenleri kuracak, ve tıklayın  \"{{int:Config-cuntinue}}\".",
+    "config-localsettings-connection-error": "<code>LocalSettings.php</code> ya da <code>AdminSettings.php</code> dosyasında belirtilen ayarları kullanarak veritabanına bağlanırken bir hatayla karşılaşıldı. Lütfen bu ayarları düzeltin ve yeniden deneyin.\n\n$1",
+    "config-session-error": "Oturum başlatılırken hata: $1",
+    "config-session-expired": "Oturum bilgilerinizin süresi bitmiş.\nOturumların süresi $1 kadardır.\nBu süreyi php.ini' deki <code>session.gc_maxlifetime</code> ayarla arttırabilirsiniz.\nKurulum işlemini yeniden başlatın.",
+    "config-no-session": "Oturum bilgileriniz silinmiş.\nphp.ini dosyanızı kontrol edin ve <code>session.save_path</code> ayarının uygun bir klasöre yönlendiğinden emin olun.",
+    "config-your-language": "Diliniz:",
+    "config-your-language-help": "Yükleme sürecinde kullanılacak bir dil seçin.",
+    "config-wiki-language": "Viki dili:",
+    "config-wiki-language-help": "Vikinin ağırlıklı olarak yazılacağı dili seçin.",
+    "config-back": "← Geri",
+    "config-continue": "Devam →",
+    "config-page-language": "Dil",
+    "config-page-welcome": "MediaWiki'ye hoş geldiniz!",
+    "config-page-dbconnect": "Veritabanına bağlan",
+    "config-page-upgrade": "Varolan yüklemeyi yükselt",
+    "config-page-dbsettings": "Veritabanı ayarları",
+    "config-page-name": "İsim",
+    "config-page-options": "Seçenekler",
+    "config-page-install": "Yükle",
+    "config-page-complete": "Tamamlandı!",
+    "config-page-restart": "Yüklemeyi yeniden başlat",
+    "config-page-readme": "Beni oku",
+    "config-page-releasenotes": "Sürüm notları",
+    "config-page-copying": "Kopyalama",
+    "config-page-upgradedoc": "Yükseltme",
+    "config-page-existingwiki": "Mevcut viki",
+    "config-help-restart": "Girişini yaptığınız tüm kayıtlı verileri silerek, yükleme işlemini yeniden başlatmak ister misiniz?",
+    "config-restart": "Evet, yeniden başlat",
+    "config-welcome": "===Ortam Kontrolleri===\nOrtamın Mediawiki kurulumuna uygun olup olmadığını anlamak için basit kontroller yapılacak.\nKurulumu nasıl tamamlayacağınız konusunda destek isterken bu bilgileri eklemeyi unutmayın.",
+    "config-copyright": "=== Telif Hakları ve Koşulları ===\n\n$1\n\nBu program ücretsiz bir yazılımdır; yeniden dağıtabilir veya Özgür Yazılım Kuruluşu tarafından yayınlanan (GNU) Genel Kamu Lisansı koşulları altında değiştirebilirsiniz; isterseniz ikinci lisans sürümünü veya (sizin seçeneğiniz) herhangi bir sonraki lisans sürümünü kullanabilirsiniz.\n\nBu program, faydalı olacağı umuduyla dağıtılmaktadır, ancak ''' herhangi bir garantisi yoktur '''; ''' uygunluk ''' veya ''' belirli bir amaca uygunluk ''' gibi dolaylı garantileri bile yoktur.\nDaha fazla ayrıntı için (GNU) Genel Kamu Lisansına bakınız.\n\nBu program ile birlikte <doclink href=\"Copying\">bir (GNU) Genel Kamu Lisansının bir kopyasını </doclink> almış olmanız gerekir; bu program (GNU) Genel Kamu Lisansı ile dağıtılmadıysa, Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, ABD adresine yazın veya [http://www.gnu.org/copyleft/gpl.html online olarak okuyun].",
+    "config-env-good": "Ortam kontrol edildi.\nMediaWiki'yi kurabilirsiniz.",
+    "config-env-bad": "Ortam kontrol edildi.\nMediaWiki'yi kuramazsınız.",
+    "config-env-php": "PHP $1 kurulu.",
+    "config-env-php-toolow": "PHP $1 kurulu.\nAncak, MediaWiki PHP $2 ya da daha yenisine ihtiyaç duyuyor.",
+    "config-unicode-using-utf8": "Unikod normalleştirmesi için Brion Vibber'in utf8_normalize.so kullanılıyor.",
+    "config-unicode-using-intl": "Unikod normalleştirmesi için [http://pecl.php.net/intl intl PECL uzantısı] kullanılıyor.",
+    "config-xml-bad": "PHP 'nin XML modülü eksik.\nMediaWiki bu modüldeki fonksiyonlara ihtiyaç duyar ve şimdiki kurulumda çalışmayacaktır.\nMandrake kullanıyorsanız php-xml paketini yükleyin.",
+    "config-pcre-old": "<strong>Ağır hata:</strong> PCRE $1 veya daha üst versiyon gerekli.\nSizin PHP kurulumunuz PCRE $2 ile bağlı.\n[https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/PCRE Daha fazla bilgi].",
+    "config-xcache": "[http://xcache.lighttpd.net/ XCache] kurulu",
+    "config-apc": "[http://www.php.net/apc APC] kurulu",
+    "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache] kurulu",
+    "config-no-cache": "'''Uyarı:''' [http://www.php.net/apc APC], [http://xcache.lighttpd.net/ XCache] ya da [http://www.iis.net/download/WinCacheForPhp WinCache] bulunamadı.\nNesne önbelleğe alma etkinleştirilmedi.",
+    "config-mod-security": "'''Uyarı:''' Web sunucunuz [http://modsecurity.org/ mod_security] etkin. Eğer yanlış yapılandırılmış ise, bu MediaWiki ve kullanıcılara isteğe bağlı içerik göndermesine izin veren diğer yazılımlar için sorun oluşturabilir.\nRastgele hatalar alırsanız [http://modsecurity.org/documentation/ mod_security belgelemesine] bakın ya da sunucunuzun desteğine başvurun.",
+    "config-diff3-bad": "GNU diff3 bulunamadı.",
+    "config-git": "Sürüm kontrol yazılımı Git bulundu: <code>$1</code>.",
+    "config-git-bad": "Sürüm kontrol yazılımı Git bulunamadı.",
+    "config-imagemagick": "ImageMagick bulundu: <code>$1</code>.\nEğer yüklemeleri etkinleştirirseniz, küçük resimler etkinleştirilecektir.",
+    "config-db-host": "Veritabanı sunucusu:",
+    "config-db-host-help": "Veritabanı sunucunuz farklı bir sunucu üzerinde ise, ana bilgisayar adını veya IP adresini buraya girin.\n\nPaylaşılan ağ barındırma hizmeti kullanıyorsanız, barındırma sağlayıcınız size doğru bir ana bilgisayar adını kendi belgelerinde vermiştir.\n\nEğer MySQL kullanan bir Windows sunucusuna yükleme yapıyorsanız, sunucu adı olarak \"localhost\" kullanırsanız çalışmayabilir. Çalışmazsa, yerel IP adresi için \"127.0.0.1\" deneyin.\n\nPostgreSQL kullanıyorsanız, bu alanı bir Unix soketi ile bağlanmak için boş bırakın.",
+    "config-db-wiki-settings": "Bu wikiyi tanımla",
+    "config-db-name": "Veritabanı adı:",
+    "config-db-name-oracle": "Veritabanı şeması:",
+    "config-db-install-account": "Yükleme için kullanıcı hesabı",
+    "config-db-username": "Veritabanı kullanıcı adı:",
+    "config-db-password": "Veritabanı parolası:",
+    "config-db-install-username": "Yükleme sırasında veritabanına bağlanmak için kullanılan kullanıcı adını girin.\nBu MediaWiki hesabının kullanıcı adı değildir; Bu veritabanın kullanıcı adıdır.",
+    "config-db-wiki-account": "Kullanıcı hesabı için normal işlem",
+    "config-db-prefix": "Veritabanı Tablo öneki:",
+    "config-db-charset": "Veritabanı karakter seti",
+    "config-charset-mysql5-binary": "MySQL 4.1/5.0 binary",
+    "config-charset-mysql5": "MySQL 4.1/5.0 UTF-8",
+    "config-charset-mysql4": "MySQL 4.0 geriye doğru uyumlu UTF-8",
+    "config-mysql-old": "MySQL  $1  veya daha yenisi gerekir. Sende bulunan  $2 .",
+    "config-db-port": "Veritabanı bağlantı noktası:",
+    "config-db-schema": "MediaWiki için şema:",
+    "config-pg-test-error": "Veritabanıyla bağlantı kurulamıyor ''' $1 ''':$2",
+    "config-sqlite-dir": "SQLite veri dizini",
+    "config-oracle-def-ts": "Varsayılan tablo alanı:",
+    "config-header-mysql": "MySQL ayarları",
+    "config-header-postgres": "PostgreSQL ayarları",
+    "config-header-sqlite": "SQLite ayarları",
+    "config-header-oracle": "Oracle ayarları",
+    "config-header-mssql": "Microsoft SQL Server ayarları",
+    "config-invalid-db-type": "Geçersiz veritabanı türü",
+    "config-missing-db-name": "\"Veritabanı adı\" için bir değer girmelisiniz",
+    "config-missing-db-host": "\"Veritabanı host\" için bir değer girmelisiniz",
+    "config-missing-db-server-oracle": "\"Veritabanının TNS\" için bir değer girmelisiniz",
+    "config-invalid-db-name": "Geçersiz veritabanı adı \" $1 \".\nSadece ASCII harf (a-z, A-Z), rakamların (0-9), alt çizgi (_) ve tire (-) kullanın.",
+    "config-connection-error": "$1.\n\nSunucuyu kontrol edin, kullanıcı adı ve parolayı denetleyin ve yeniden deneyin.",
+    "config-invalid-schema": "Geçersiz şema MediaWiki için \" $1 \".\nYalnızca ASCII harf (a-z, A-Z), rakamların (0-9) ve alt çizgi (_) kullanın.",
+    "config-db-sys-user-exists-oracle": "Kullanıcı hesabı \" $1 \" zaten var. SYSDBA sadece yeni bir hesap oluşturmak için kullanılabilir.",
+    "config-postgres-old": "PostgreSQL  $1  veya daha yenisi gerekir. Sende  $2 sürümü var.",
+    "config-sqlite-mkdir-error": "Veri dizini oluşturulurken bir hata oluştu \" $1 \".\nKonumu denetleyin ve yeniden deneyin.",
+    "config-sqlite-connection-error": "$1.\n\nVeri dizini ve veritabanı adını denetleyin ve yeniden deneyin.",
+    "config-sqlite-readonly": "Dosya <code>$1</code> yazılabilir değil.",
+    "config-sqlite-cant-create-db": "Veritabanı dosyası oluşturamadı <code>$1</code> .",
+    "config-regenerate": "LocalSettings.php yi yeniden oluştur →",
+    "config-show-table-status": "<code>SHOW TABLE STATUS</code>sorgu başarısız!",
+    "config-db-web-account-same": "Yükleme için aynı hesabı kullan",
+    "config-db-web-create": "Eğer oluşturulmuş hesap yoksa yeni hesap oluştur",
+    "config-mysql-engine": "Depolama motoru:",
+    "config-mysql-innodb": "InnoDB",
+    "config-mysql-myisam": "MyISAM",
+    "config-mysql-charset": "Veritabanı karakter seti",
+    "config-mysql-binary": "İkili",
+    "config-mysql-utf8": "UTF-8",
+    "config-mssql-auth": "Kimlik doğrulama türü:",
+    "config-mssql-sqlauth": "SQL Server kimlik doğrulaması",
+    "config-mssql-windowsauth": "Windows Kimlik Doğrulama",
+    "config-site-name": "Wiki adı:",
+    "config-site-name-blank": "Bir site adı girin.",
+    "config-project-namespace": "Proje isim alanı:",
+    "config-ns-generic": "Proje",
+    "config-ns-site-name": "Aynı wiki adı:$1",
+    "config-ns-other": "Diğer (belirtin)",
+    "config-ns-other-default": "MyWiki",
+    "config-ns-invalid": "Belirtilen ad \"<nowiki> $1 </nowiki>\" geçersiz.\nFarklı proje isim alanı belirtin.",
+    "config-ns-conflict": "Belirtilen ad \"<nowiki> $1 </nowiki>\" varsayılan MediaWiki ad alanı ile çakışıyor.\nFarklı proje isim alanı belirtin.",
+    "config-admin-box": "Yönetici hesabı",
+    "config-admin-name": "Kullanıcı adınız:",
+    "config-admin-password": "Şifre:",
+    "config-admin-password-confirm": "Şifre tekrar:",
+    "config-admin-name-blank": "Bir yönetici kullanıcı adını giriniz.",
+    "config-admin-name-invalid": "Belirtilen ad \"<nowiki> $1 </nowiki>\" geçersiz.\nFarklı bir kullanıcı adı belirtin.",
+    "config-admin-password-blank": "Yönetici hesabı için bir parola girin.",
+    "config-admin-password-mismatch": "Girdiğiniz şifreler birbirleriyle uyuşmuyor.",
+    "config-admin-email": "E-posta adresi:",
+    "config-admin-email-help": "Wiki'de diğer kullanıcılardan e-posta almak, parolanızı sıfırlamak ve sizin izlediğiniz sayfalarda yapılan değişikliklerin bildirilmesini sağlamak için e-posta adresinizi girin. Bu alanı boş bırakabilirsiniz.",
+    "config-admin-error-user": "Bir yönetici adı ile oluşturma sırasında iç hata \"<nowiki> $1 </nowiki>\".",
+    "config-admin-error-bademail": "Geçersiz e-posta adresi girdiniz.",
+    "config-almost-done": "Neredeyse bitti\nŞimdi kalan yapılandırmaları atlayın ve wikiyi şimdi yükleyin.",
+    "config-optional-continue": "Bana daha fazla soru sor.",
+    "config-optional-skip": "Şimdiden sıkıldım, sadece wikiyi yükle.",
+    "config-profile": "Kullanıcı hakları profili:",
+    "config-profile-wiki": "Açık wiki",
+    "config-profile-fishbowl": "Yalnızca yetkili editörler",
+    "config-profile-private": "Özel wiki",
+    "config-license": "Telif Hakkı ve Lisans",
+    "config-license-gfdl": "GNU Free Documentation License 1.3 veya üstü",
+    "config-license-pd": "Kamu Malı",
+    "config-license-cc-choose": "Özel bir Creative Commons lisansı seçin",
+    "config-email-settings": "E-posta ayarları",
+    "config-enable-email": "Giden e-posta etkinleştirme",
+    "config-email-user": "Kullanıcıdan kullanıcıya e-posta gönderimini etkinleştir",
+    "config-email-watchlist": "Watchlist bildirimini etkinleştirmek",
+    "config-email-auth": "E-posta kimlik doğrulamasını etkinleştir",
+    "config-email-sender": "E-posta adresini ayarlayın",
+    "config-upload-settings": "Resim ve dosya yükleme",
+    "config-upload-enable": "Dosya yüklemeyi etkinleştirin",
+    "config-upload-deleted": "Silinen dosyalar için dizin:",
+    "config-logo": "Logo URL'si:",
+    "config-cc-again": "Tekrar al...",
+    "config-cc-not-chosen": "Hangi Creative Commons lisansı istiyorum ve tıklayın \"proceed\" ı seçin.",
+    "config-advanced-settings": "Gelişmiş yapılandırma",
+    "config-memcached-servers": "Memcached sunucuları:",
+    "config-extensions": "Uzantılar",
+    "config-install-step-done": "Yapıldı",
+    "config-install-step-failed": "Başarısız",
+    "config-install-database": "Veritabanı ayarlama",
+    "config-install-schema": "Şema oluştur",
+    "config-install-pg-schema-not-exist": "PostgreSQL şema yok.",
+    "config-install-pg-commit": "Değişiklikleri yapılıyor",
+    "config-install-user": "Veritabanı kullanıcısı oluşturma",
+    "config-install-user-alreadyexists": "Kullanıcı \" $1 \" zaten var",
+    "config-install-user-create-failed": "Kullanıcı oluşturma \" $1 \" başarısız oldu:$2",
+    "config-install-user-missing": "Belirtilen kullanıcı \" $1 \" adlı biri yok.",
+    "config-install-user-missing-create": "Belirtilen kullanıcı \" $1 \" yok.\nOluşturmak istiyorsanız, lütfen aşağıdaki \"hesap oluştur\" onay kutusunu tıklatın.",
+    "config-install-tables": "Tabloları oluşturma",
+    "config-install-tables-exist": "''' Uyarı:'' ' MediaWiki tabloları zaten var gibi görünüyor.\nOluşturma atlanıyor.",
+    "config-install-tables-failed": "''' Hata:'' ' tablo oluşturma aşağıdaki hata ile başarısız oldu:$1",
+    "config-install-interwiki-list": "Dosya okunamadı <code>interwiki.list</code> .",
+    "config-install-interwiki-exists": "''' Uyarı:'' ' interwiki Tablo girdileri zaten görünüyor.\nVarsayılan liste atlanıyor.",
+    "config-install-stats": "İstatistik başlatılıyor",
+    "config-install-keys": "Gizli anahtar oluşturma",
+    "config-install-subscribe-notpossible": "cURL yüklü değil ve allow_url_fopen kullanılamaz.",
+    "config-install-mainpage": "Varsayılan içerik ile ana sayfa oluşturma",
+    "config-install-extension-tables": "Uzantılar için etkinleştirilmiş tablolar oluşturma",
+    "config-install-mainpage-failed": "Ana sayfa eklenemedi:$1",
+    "config-download-localsettings": "İndir <code>LocalSettings.php</code>",
+    "config-help": "Yardım",
+    "config-nofile": "\"$1\" dosyası bulunamadı. Silindi mi?",
+    "config-extension-link": "Vikinizin [//www.mediawiki.org/wiki/Manual:Extensions eklentileri] desteklediğini biliyor musunuz?\n\n[//www.mediawiki.org/wiki/Category:Extensions_by_category Eklentileri kategorilerine göre] inceleyebilir ya da tüm eklentilerin listesini görmek için [//www.mediawiki.org/wiki/Extension_Matrix Eklenti Matrisine] bakabilirsiniz.",
     "mainpagetext": "'''MediaWiki başarı ile kuruldu.'''",
     "mainpagedocfooter": "Viki yazılımının kullanımı hakkında bilgi almak için [//meta.wikimedia.org/wiki/Help:Contents kullanıcı rehberine] bakınız.\n\n== Yeni Başlayanlar ==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Yapılandırma ayarlarının listesi]\n* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki SSS]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki e-posta listesi]"
-}
\ No newline at end of file
+}
index c9f4fcd..34a711a 100644 (file)
@@ -6,4 +6,4 @@
     },
     "mainpagetext": "«MediaWiki» уңышлы куелды.",
     "mainpagedocfooter": "Бу вики турында мәгълүматны [//meta.wikimedia.org/wiki/Ярдәм:Эчтәлек биредә] табып була.\n\n== Кайбер файдалы ресурслар ==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Көйләнмәләр исемлеге (инг.)];\n* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki турында еш бирелгән сораулар һәм җаваплар (инг.)];\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki'ның яңа версияләре турында хәбәрләр яздырып алу]."
-}
\ No newline at end of file
+}
index 21d9590..9147dbd 100644 (file)
@@ -6,4 +6,4 @@
     },
     "mainpagetext": "«MediaWiki» uñışlı quyıldı.",
     "mainpagedocfooter": "Bu wiki turında mäğlümatnı [//meta.wikimedia.org/wiki/Yärdäm:Eçtälek biredä] tabıp bula.\n\n== Qayber faydalı resurslar ==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Köylänmälär isemlege (ing.)];\n* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki turında yış birelgän sorawlar häm cawaplar (ing.)];\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki'nıñ yaña versiäläre turında xäbärlär yazdırıp alu]."
-}
\ No newline at end of file
+}
index 28cd049..1b67470 100644 (file)
@@ -5,4 +5,4 @@
         ]
     },
     "mainpagetext": "'''MediaWiki движок азинлыко пуктэмын.'''"
-}
\ No newline at end of file
+}
index f7a8843..b49bd93 100644 (file)
@@ -6,4 +6,4 @@
     },
     "mainpagetext": "'''MediaWiki مۇۋەپپەقىيەتلىك قاچىلاندى.'''",
     "mainpagedocfooter": "[//meta.wikimedia.org/wiki/Help:Contents ئىشلەتكۈچى قوللانمىسى] نى زىيارەت قىلىپ wiki يۇمشاق دېتالىنى ئىشلىتىش ئۇچۇرىغا ئېرىشىڭ.\n\n== دەسلەپكى ساۋات ==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings سەپلىمە تەڭشەك تىزىملىكى]\n* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki كۆپ ئۇچرايدىغان مەسىلىلەرگە جاۋاب]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki تارقاتقان ئېلخەت تىزىملىكى]"
-}
\ No newline at end of file
+}
index dd96f35..c75d2b2 100644 (file)
@@ -9,7 +9,8 @@
             "Diemon.ukr",
             "Ата",
             "Тест",
-            "아라"
+            "아라",
+            "Amire80"
         ]
     },
     "config-desc": "Інсталятор MediaWiki",
@@ -21,7 +22,7 @@
     "config-localsettings-badkey": "Ви вказали неправильний ключ.",
     "config-upgrade-key-missing": "Виявлено наявну установку MediaWiki.\nДля оновлення цієї установки, будь ласка, вставте такий рядок в кінець вашого <code>LocalSettings.php</code>:\n$1",
     "config-localsettings-incomplete": "Існуючий файл <code>LocalSettings.php</code> виявився неповним.\nНе вказано змінну $1.\nБудь ласка, змініть <code>LocalSettings.php</code> так, щоб цю змінну було задано, і натисніть \"{{int:Config-continue}}\".",
-    "config-localsettings-connection-error": "Сталася помилка при підключення до бази даних з допомогою налаштувань на сторінці <code>LocalSettings.php</code> чи <code>AdminSettings.php</code>. Будь ласка, виплавте ці налаштування і спробуйте знову.\n\n$1",
+    "config-localsettings-connection-error": "Сталася помилка при підключення до бази даних з допомогою налаштувань на сторінці <code>LocalSettings.php</code>. Будь ласка, виправте ці налаштування і спробуйте знову.\n\n$1",
     "config-session-error": "Помилка початку сесії: $1",
     "config-session-expired": "Час Вашої сесії минув.\nЗадана тривалість сесії — $1.\nВи можете збільшити її, змінивши <code>session.gc_maxlifetime</code> у php.ini.\nПерезапустіть процес встановлення.",
     "config-no-session": "Дані сесії було втрачено!\nПеревірте Ваш php.ini і переконайтесь, що <code>session.save_path</code> встановлено у відповідну папку.",
     "config-unicode-using-intl": "Використовувати [http://pecl.php.net/intl міжнародне розширення PECL] для нормалізації Юнікоду.",
     "config-unicode-pure-php-warning": "'''Увага''': [http://pecl.php.net/intl міжнародне розширення PECL] не може провести нормалізацію Юнікоду.\nЯкщо ваш сайт має високий трафік, вам варто почитати про [//www.mediawiki.org/wiki/Unicode_normalization_considerations нормалізацію Юнікоду].",
     "config-unicode-update-warning": "'''Увага''': Встановлена версія обгортки нормалізації Юнікоду використовує стару версію бібліотеки [http://site.icu-project.org/ проекту ICU].\nВи маєте [//www.mediawiki.org/wiki/Unicode_normalization_considerations оновити версію], якщо плануєте повноцінно використовувати Юнікод.",
-    "config-no-db": "Не вдалося знайти відповідний драйвер бази даних! Вам необхідно встановити драйвер бази даних для PHP. Підтримуються такі типи баз даних: $1.\n\nЯкщо ви користуєтесь віртуальним хостингом, попросіть вашого хостинг-провайдера інсталювати відповідний драйвер бази даних.\nЯкщо ви скомпілювали PHP самостійно, переналаштуйте його з включенням клієнта бази даних, наприклад за допомогою <code>./configure --with-mysql</code>.\nЯкщо установлено PHP з пакетів Debian або Ubuntu, тоді ви також повинні встановити php5-mysql модуль.",
+    "config-no-db": "Не вдалося знайти відповідний драйвер бази даних! Вам необхідно встановити драйвер бази даних для PHP. Підтримуються такі типи баз даних: $1.\n\nЯкщо ви скомпілювали PHP самостійно, переналаштуйте його з включенням клієнта бази даних, наприклад за допомогою <code>./configure --with-mysqli</code>.\n\nЯкщо установлено PHP з пакетів Debian або Ubuntu, тоді ви також повинні встановити, наприклад, пакунок <code>php5-mysql</code>.",
     "config-outdated-sqlite": "'''Увага''': у Вас встановлена версія SQLite $1, а це нижче, ніж мінімально необхідна версія $2. SQLite буде недоступним.",
     "config-no-fts3": "'''Увага''': SQLite зібраний без [//sqlite.org/fts3.html модуля FTS3], функції пошуку не будуть працювати у цій системі.",
     "config-register-globals": "'''Увага: Опція PHP <code>[http://php.net/register_globals register_globals]</code> увімкнена.'''\n'''Вимкніть її, якщо це можливо.'''\nMediaWiki буде працювати, але Ваш сервер буде більш вразливим до потенційного проникнення зовні.",
     "config-magic-quotes-runtime": "'''Проблема: Опція PHP [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-runtime magic_quotes_runtime] увімкнена!'''\nЦя опція призводить до непередбачуваного пошкодження даних.\nВи не можете встановити і використовувати MediaWiki, поки не буде вимкнено цю опцію.",
     "config-magic-quotes-sybase": "'''Проблема: Опція PHP [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-sybase magic_quotes_sybase] увімкнена!'''\nЦя опція призводить до непередбачуваного пошкодження даних.\nВи не можете встановити і використовувати MediaWiki, поки не буде вимкнено цю опцію.",
     "config-mbstring": "'''Проблема: Опція PHP [http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload] увімкнена!'''\nЦя опція призводить до непередбачуваного пошкодження даних.\nВи не можете встановити і використовувати MediaWiki, поки не буде вимкнено цю опцію.",
-    "config-ze1": "'''Проблема: Опція PHP [http://www.php.net/manual/en/ini.core.php zend.ze1_compatibility_mode] увімкнена!'''\nЦя опція призводить до непередбачуваного пошкодження даних.\nВи не можете встановити і використовувати MediaWiki, поки не буде вимкнено цю опцію.",
     "config-safe-mode": "'''Увага:''' Опція PHP [http://www.php.net/features.safe-mode «безпечний режим»] увімкнена.\nЦе може спричинити проблеми, зокрема із завантаженням файлів та вставкою математичних формул.",
     "config-xml-bad": "XML-модуть PHP відсутній.\nMediaWiki необхідні його функції, без цього модуля вона працювати не буде.\nЯкщо Ви використовуєте Mandrake, встановіть php-xml пакет.",
-    "config-pcre": "Модуть підтримку PCRE не знайдено.\nДля роботи MediaWiki необхідна підтримка Perl-сумісних регулярних виразів.",
+    "config-pcre-old": "'''Фатальна помилка:''' потрібно PCRE версії $1 або пізнішої.\nВаш виконуваний файл PHP пов'язаний з PCRE версії $2.\n[https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/PCRE Подробиці].",
     "config-pcre-no-utf8": "'''Помилка''': PCRE-модуть PHP, вочевидь, було зібрано без підтримки PCRE_UTF8.\nMediaWiki вимагає підтримку UTF-8 для коректної роботи.",
     "config-memory-raised": "Обмеження пам'яті PHP (<code>memory_limit</code>) $1, піднято до $2.",
     "config-memory-bad": "'''Увага:''' Розмір пам'яті PHP (<code>memory_limit</code>) становить $1.\nІмовірно, це замало.\nВстановлення може не вдатись!",
     "config-gd": "Виявлено вбудовано графічну бібліотеку GD.\nБуде ввімкнуто відображення мініатюр, якщо ви дозволите завантаження файлів.",
     "config-no-scaling": "Не вдалося виявити бібліотеку GD чи ImageMagick.\nВідображення мініатюр буде вимкнено.",
     "config-no-uri": "'''Помилка:''' Не вдалося визначити поточний URI.\nВстановлення перервано.",
-    "config-no-cli-uri": "'''Увага''': Не задано параметр --scriptpath, використовується за замовчуванням: <code>$1</code>.",
+    "config-no-cli-uri": "'''Увага''': Не задано параметр <code>--scriptpath</code>, використовується за замовчуванням: <code>$1</code>.",
     "config-using-server": "Використовується ім'я сервера \"<nowiki>$1</nowiki>\".",
     "config-using-uri": "Використовується URL сервера \"<nowiki>$1$2</nowiki>\".",
     "config-uploads-not-safe": "'''Увага:''' Ваша типова папка для завантажень <code>$1</code> вразлива до виконання довільних скриптів.\nХоча MediaWiki перевіряє усі завантажені файли на наявність загроз, наполегливо рекомендується [//www.mediawiki.org/wiki/Manual:Security#Upload_security закрити дану вразливість] перед тим, як дозволяти завантаження файлів.",
     "config-no-cli-uploads-check": "'''Увага:''' Ваша типова папка для завантажень (<code>$1</code>) не перевірялась на вразливість до виконання довільних скриптів під час встановлення CLI.",
-    "config-brokenlibxml": "У Вашій системі невдале поєднання версій PHP і libxml2, яке може спричинити пошкодження прихованих даних у MediaWiki та інших веб-застосунках.\nОновіть PHP до версії 5.2.9 або пізнішої і libxml2 до 2.7.3 або пізнішої ([//bugs.php.net/bug.php?id=45996 відомості про помилку]).\nВстановлення перервано.",
-    "config-using531": "MediaWiki не можна використовувати разом з PHP $1 через помилку з параметрами-посиланнями <code>__call()</code>.\nОновіть PHP до версії 5.3.2 і вище або відкотіть до PHP 5.3.0 щоб уникнути цієї проблеми.\nВстановлення скасовано.",
+    "config-brokenlibxml": "У Вашій системі невдале поєднання версій PHP і libxml2, яке може спричинити пошкодження прихованих даних у MediaWiki та інших веб-застосунках.\nОновіть libxml2 до версії 2.7.3 або пізнішої  ([https://bugs.php.net/bug.php?id=45996 відомості про помилку]).\nВстановлення перервано.",
     "config-suhosin-max-value-length": "Suhosin встановлено і обмежує параметра GET  <code>length</code> до $1 байта. Компонент MediaWiki ResourceLoader буде обходити це обмеження, однак це зменшить продуктивність. Якщо це можливо, Вам варто встановити значення <code>suhosin.get.max_value_length</code> як 1024 і більше у <code>php.ini</code> і встановити таке ж значення <code>$wgResourceLoaderMaxQueryLength</code> у LocalSettings.php .",
     "config-db-type": "Тип бази даних:",
     "config-db-host": "Хост бази даних:",
     "config-db-username": "Ім'я користувача бази даних:",
     "config-db-password": "Пароль бази даних:",
     "config-db-password-empty": "Будь ласка, введіть пароль для нового користувача бази даних: $1.\nХоча можна створювати користувачів без паролів, це не є безпечним.",
+    "config-db-username-empty": "Ви повинні ввести значення для \"{{int:config-db username}}\"",
     "config-db-install-username": "Введіть ім'я користувача, яке буде використано для підключення до бази даних під час процесу встановлення.\nЦе не ім'я користувача облікового запису MediaWiki; це ім'я користувача для Вашої бази даних.",
     "config-db-install-password": "Введіть пароль, який буде використано для підключення до бази даних під час процесу встановлення.\nЦе не пароль облікового запису MediaWiki; це пароль для Вашої бази даних.",
     "config-db-install-help": "Введіть ім'я користувача і пароль, які буде використано для підключення до бази даних у процесі встановлення.",
     "config-sqlite-dir-help": "SQLite зберігає усі дані в єдиному файлі.\n\nПапка, яку Ви вказуєте, має бути доступна серверу для запису під час встановлення.\n\nВона '''не''' повинна бути доступна через інтернет, тому ми і не поміщуємо її туди, де Ваші файли PHP.\n\nІнсталятор пропише у неї файл <code>.htaccess</code>, але якщо це не спрацює, хтось може отримати доступ до Вашої вихідної бази даних, яка містить вихідні дані користувача (адреси електронної пошти, хеші паролів), а також видалені версії та інші обмежені дані на вікі.\n\nЗа можливості розташуйте базу даних десь окремо, наприклад в <code>/var/lib/mediawiki/yourwiki</code>.",
     "config-oracle-def-ts": "Простір таблиць за замовчуванням:",
     "config-oracle-temp-ts": "Тимчасовий простір таблиць:",
+    "config-type-mysql": "MySQL (або сумісний)",
+    "config-type-mssql": "Microsoft SQL Server",
     "config-support-info": "MediaWiki підтримує таки системи баз даних:\n\n$1\n\nЯкщо Ви не бачите серед перерахованих систему баз даних, яку використовуєте, виконайте вказівки, вказані вище, щоб увімкнути підтримку.",
-    "config-support-mysql": "* $1 є основною для MediaWiki і найкраще підтримується ([http://www.php.net/manual/en/mysql.installation.php як зібрати PHP з допомогою MySQL])",
-    "config-support-postgres": "* $1 — популярна відкрита СУБД, альтернатива MySQL ([http://www.php.net/manual/en/pgsql.installation.php як зібрати PHP з допомогою PostgreSQL]). Можуть зустрічатись деякі невеликі невиправлені помилки, не рекомендується використовувати у робочій системі.",
-    "config-support-sqlite": "* $1 — легка система баз даних, яка дуже добре підтримується. ([http://www.php.net/manual/en/pdo.installation.php Як зібрати PHP з допомогою SQLite], що використовує PDO)",
-    "config-support-oracle": "* $1 — комерційна база даних масштабу підприємства. ([http://www.php.net/manual/en/oci8.installation.php Як зібрати PHP з підтримкою OCI8])",
+    "config-dbsupport-mysql": "* [{{int:version-db-mysql-url}} MySQL] є основною для MediaWiki і найкраще підтримується.  MediaWiki також працює із [{{int:version-db-mariadb-url}} MariaDB] та [{{int:version-db-percona-url}} Percona Server], які сумісні з MySQL.  ([http://www.php.net/manual/en/mysqli.installation.php як зібрати PHP з допомогою MySQL])",
+    "config-dbsupport-postgres": "*  [{{int:version-db-postgres-url}} PostgreSQL] — популярна відкрита СУБД, альтернатива MySQL. Можуть зустрічатись деякі невеликі невиправлені помилки, не рекомендується використовувати у робочій системі.([http://www.php.net/manual/en/pgsql.installation.php як зібрати PHP з допомогою PostgreSQL]).",
+    "config-dbsupport-sqlite": "*  [{{int:version-db-sqlite-url}} SQLite] — легка система баз даних, яка дуже добре підтримується. ([http://www.php.net/manual/en/pdo.installation.php Як зібрати PHP з допомогою SQLite], що використовує PDO)",
+    "config-dbsupport-oracle": "*  [{{int:version-db-oracle-url}} Oracle] — комерційна база даних масштабу підприємства. ([http://www.php.net/manual/en/oci8.installation.php Як зібрати PHP з підтримкою OCI8])",
+    "config-dbsupport-mssql": "* [{{int:version-db-mssql-url}} Microsoft SQL Server] — це комерційна база даних для Windows масштабу підприємства. ([http://www.php.net/manual/ru/sqlsrv.installation.php Як зібрати PHP з підтримкою SQLSRV])",
     "config-header-mysql": "Налаштування MySQL",
     "config-header-postgres": "Налаштування PostgreSQL",
     "config-header-sqlite": "Налаштування SQLite",
     "config-header-oracle": "Налаштування Oracle",
+    "config-header-mssql": "Параметри Microsoft SQL Server",
     "config-invalid-db-type": "Невірний тип бази даних",
-    "config-missing-db-name": "Ви повинні ввести значення параметру «Ім'я бази даних»",
-    "config-missing-db-host": "Ви повинні ввести значення параметру «Хост бази даних»",
-    "config-missing-db-server-oracle": "Ви повинні ввести значення параметру «TNS бази даних»",
+    "config-missing-db-name": "Ви повинні ввести значення параметру  \"{{int:config-db-name}}\".",
+    "config-missing-db-host": "Ви повинні ввести значення параметру \"{{int:config-db-host}}\".",
+    "config-missing-db-server-oracle": "Ви повинні ввести значення параметру  \"{{int:config-db-host-oracle}}\".",
     "config-invalid-db-server-oracle": "Неприпустиме TNS бази даних \"$1\".\nВикористовуйте \"TNS Name\" або рядок \"Easy Connect\"  ([http://docs.oracle.com/cd/E11882_01/network.112/e10836/naming.htm Методи найменування Oracle])",
     "config-invalid-db-name": "Неприпустима назва бази даних \"$1\".\nВикористовуйте тільки ASCII букви (a-z, A-Z), цифри (0-9), знаки підкреслення (_) і дефіси (-).",
     "config-invalid-db-prefix": "Неприпустимий префікс бази даних \"$1\".\nВикористовуйте тільки ASCII букви (a-z, A-Z), цифри (0-9), знаки підкреслення (_) і дефіси (-).",
     "config-db-sys-create-oracle": "Інсталятор підтримує лише використання облікового запису SYSDBA для створення нового облікового запису.",
     "config-db-sys-user-exists-oracle": "Обліковий запис користувача \"$1\" уже існує. SYSDBA використовується лише для створення новий облікових записів!",
     "config-postgres-old": "Необхідна PostgreSQL $1 або пізніша, а у Вас $2.",
+    "config-mssql-old": "Вимагається Microsoft SQL Server версії $1 або більш  пізнішої. У вас установлена версія $2.",
     "config-sqlite-name-help": "Виберіть назву, що ідентифікує Вашу вікі.\nНе використовуйте пробіли і дефіси.\nЦе буде використовуватись у назві файлу даних SQLite.",
     "config-sqlite-parent-unwritable-group": "Не можна створити папку даних <code><nowiki>$1</nowiki></code>, оскільки батьківська папка <code><nowiki>$2</nowiki></code> не доступна веб-серверу для запису.\n\nІнсталятор виявив, під яким користувачем працює Ваш сервер.\nЗробіть папку <code><nowiki>$3</nowiki></code> доступною для запису, щоб продовжити.\nВ ОС Unix/Linux виконайте:\n\n<pre>cd $2\nmkdir $3\nchgrp $4 $3\nchmod g+w $3</pre>",
     "config-sqlite-parent-unwritable-nogroup": "Не можна створити папку даних <code><nowiki>$1</nowiki></code>, оскільки батьківська папка <code><nowiki>$2</nowiki></code> не доступна веб-серверу для запису.\n\nІнсталятор не зміг виявити, під яким користувачем працює Ваш сервер.\nЗробіть папку <code><nowiki>$3</nowiki></code> доступною для запису серверу (і всім!) глобально, щоб продовжити.\nВ ОС Unix/Linux виконайте:\n\n<pre>cd $2\nmkdir $3\nchmod a+w $3</pre>",
     "config-mysql-innodb": "InnoDB",
     "config-mysql-myisam": "MyISAM",
     "config-mysql-myisam-dep": "'''Увага''': Ви обрали MyISAM для зберігання даних MySQL, що не рекомендовано для роботи з MediaWiki, оскільки:\n* він слабко підтримує паралелізм через блокування таблиць\n* він більш схильний до ушкоджень, ніж інші двигуни\n* база коду MediaWiki не завжди працює з MyISAM так, як мала б.\n\nЯкщо Ваша інсталяція MySQL підтримує InnoDB, дуже рекомендується вибрати цей двигун.\nЯкщо Ваша інсталяція MySQL не підтримує InnoDB, можливо настав час її оновити.",
-    "config-mysql-only-myisam-dep": "\"'Зауваження:\"' MyISAM є єдиним механізмом для зберігання MySQL, який не рекомендується для використання з MediaWiki, оскільки:\n* слабо підтримує паралелізм через блокування таблиць\n* більш схильний до пошкоджень, ніж інші двигуни\n* код MediaWiki не завжди розглядає MyISAM, як повинен\n\nТвоє встановлення MySQL не підтримує InnoDB, можливо, потрібно оновити.",
+    "config-mysql-only-myisam-dep": "\"'Зауваження:\"' MyISAM є єдиним механізмом для зберігання MySQL на цій машині, який не рекомендується для використання з MediaWiki, оскільки:\n* слабо підтримує паралелізм через блокування таблиць\n* більш схильний до пошкоджень, ніж інші двигуни\n* код MediaWiki не завжди розглядає MyISAM, як повинен\n\nТвоє встановлення MySQL не підтримує InnoDB, можливо, потрібно оновити.",
     "config-mysql-engine-help": "'''InnoDB''' є завжди кращим вибором, оскільки краще підтримує паралельний доступ.\n\n'''MyISAM''' може бути швидшим для одного користувача або в інсталяціях read-only.\nБази даних MyISAM схильні псуватись частіше, ніж бази InnoDB.",
     "config-mysql-charset": "Кодування бази даних:",
     "config-mysql-binary": "Двійкове",
     "config-mysql-utf8": "UTF-8",
     "config-mysql-charset-help": "У '''бінарному режимі''' MediaWiki зберігає текст UTF-8 у базі даних з бінарними полями.\nЦе більш ефективно, ніж UTF-8 режим MySQL, і дозволяє використовувати увесь набір символів Юнікоду.\n\nУ '''режимі UTF-8''' MySQL буде знати, якого символу стосуються Ваші дані, і могтиме відображати та конвертувати їх належним чином, але не дозволятиме зберігати символи, що виходять за межі [//en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes Basic Multilingual Plane].",
+    "config-mssql-auth": "Тип автентифікації:",
+    "config-mssql-install-auth": "Виберіть тип перевірки автентичності, який буде використовуватися для підключення до бази даних під час процесу установки. \nЯкщо ви оберете \"{{int:config-mssql-windowsauth}}\", будуть використовуватися облікові дані користувача, під яким працює веб-сервер.",
+    "config-mssql-web-auth": "Виберіть тип перевірки автентичності, який веб-сервер буде використовувати для підключення до сервера бази даних під час звичайного функціонування вікі. \nЯкщо ви оберете \"{{int:config-mssql-windowsauth}}\", будуть використовуватися облікові дані користувача, під яким працює веб-сервер.",
+    "config-mssql-sqlauth": "Автентифікація сервера SQL",
+    "config-mssql-windowsauth": "Перевірка Достовірності Windows",
     "config-site-name": "Назва вікі:",
     "config-site-name-help": "Це буде відображатись у заголовку вікна браузера та у деяких інших місцях.",
     "config-site-name-blank": "Введіть назву сайту.",
     "config-ns-invalid": "Вказаний простір імен \"<nowiki>$1</nowiki>\" не припустимий.\nВкажіть інший простір імен проекту.",
     "config-ns-conflict": "Вказаний простір імен \"<nowiki>$1</nowiki>\" конфліктує зі стандартним простором імен MediaWiki.\nВкажіть інший простір імен проекту.",
     "config-admin-box": "Обліковий запис адміністратора",
-    "config-admin-name": "Ваше ім'я:",
+    "config-admin-name": "Ваше ім'я користувача:",
     "config-admin-password": "Пароль:",
     "config-admin-password-confirm": "Пароль ще раз:",
     "config-admin-help": "Введіть бажане ім'я користувача тут, наприклад \"Павло НЛО\".\nЦе ім'я ви будете використовувати про вході у вікі.",
     "config-admin-name-blank": "Введіть ім'я користувача адміністратора.",
     "config-admin-name-invalid": "Вказане ім'я користувача \"<nowiki>$1</nowiki>\" не припустиме.\nВкажіть інше ім'я користувача.",
     "config-admin-password-blank": "Введіть пароль до облікового запису адміністратора.",
-    "config-admin-password-same": "Пароль не може бути таким же, як ім'я користувача.",
     "config-admin-password-mismatch": "Два введені вами паролі не збігаються.",
     "config-admin-email": "Адреса електронної пошти:",
     "config-admin-email-help": "Введіть адресу електронної пошти, щоб мати змогу отримувати електронну пошту від інших користувачів у вікі, відновити пароль і отримувати повідомлення про зміни, внесені до сторінок у Вашому списку спостереження. Ви можете залишити це поле пустим.",
     "config-install-interwiki-exists": "'''Увага''': Таблиця інтервікі уже, здається, має записи.\nСтворення стандартного списку пропускається.",
     "config-install-stats": "Ініціалізація статистики",
     "config-install-keys": "Генерація секретних ключів",
-    "config-insecure-keys": "'''Увага:''' {{PLURAL:$2|Секретний ключ|Секретні ключі}} ($1), {{PLURAL:$2|згенерований в процесі встановлення, недостатньо надійний|згенеровані в процесі встановлення, недостатньо надійні}}. Розгляньте можливість {{PLURAL:$2|його|їх}} заміни вручку.",
+    "config-insecure-keys": "'''Увага:''' {{PLURAL:$2|1=Секретний ключ|Секретні ключі}} ($1), {{PLURAL:$2|1=згенерований в процесі встановлення, недостатньо надійний|згенеровані в процесі встановлення, недостатньо надійні}}. Розгляньте можливість {{PLURAL:$2|1=його|їх}} заміни вручну.",
     "config-install-sysop": "Створення облікового запису адміністратора",
     "config-install-subscribe-fail": "Не можливо підписатись на mediawiki-announce: $1",
     "config-install-subscribe-notpossible": "cURL не встановлено і опція allow_url_fopen не доступна.",
     "config-extension-link": "Чи знаєте ви, що ваше вікі підтримує [//www.mediawiki.org/wiki/Manual:Extensions розширення]?\n\nВи можете переглядати [//www.mediawiki.org/wiki/Category:Extensions_by_category розширення по категорії] або в [//www.mediawiki.org/wiki/Extension_Matrix матрицю розширень] щоб побачити повний список розширень.",
     "mainpagetext": "Програмне забезпечення «MediaWiki» успішно встановлене.",
     "mainpagedocfooter": "Інформацію про роботу з цією вікі можна знайти в [//meta.wikimedia.org/wiki/Help:Contents посібнику користувача].\n\n== Деякі корисні ресурси ==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Список налаштувань];\n* [//www.mediawiki.org/wiki/Manual:FAQ Часті питання з приводу MediaWiki];\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Розсилка повідомлень про появу нових версій MediaWiki];\n* [//www.mediawiki.org/wiki/Localisation#Translation_resources Локалізуйте MediaWiki своєю мовою]"
-}
\ No newline at end of file
+}
index 0837465..3798b0a 100644 (file)
@@ -31,4 +31,4 @@
     "config-install-sysop": "منتظم کے صارف کے اکاؤنٹ کی تشکیل",
     "config-install-mainpage": "پہلے سے طے شدہ مواد کے ساتھ سب سے کامیاب کی تشکیل",
     "mainpagetext": "'''میڈیاوکی کو کامیابی سے چالو کردیا گیا ہے۔.'''"
-}
\ No newline at end of file
+}
index f3f8f07..888695a 100644 (file)
@@ -7,4 +7,4 @@
     "config-admin-password-blank": "Administrator hisob yozuvi uchun maxfiy soʻz kiriting.",
     "mainpagetext": "'''MediaWiki muvaffaqiyatli o'rnatildi.'''",
     "mainpagedocfooter": "Wiki dasturini ishlatish haqida ma'lumot olish uchun  [//meta.wikimedia.org/wiki/Help:Contents Foydalanuvchi qo'llanmasi] sahifasiga murojaat qiling.\n\n== Dastlabki qadamlar ==\n\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Moslamalar ro'yxati]\n* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki haqida ko'p so'raladigan savollar]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki yangi versiyasi chiqqanda xabar berish ro'yxati]"
-}
\ No newline at end of file
+}
index 8031239..a368dd2 100644 (file)
@@ -6,4 +6,4 @@
     },
     "mainpagetext": "'''Instałasion de MediaWiki conpletà coretamente.'''",
     "mainpagedocfooter": "Varda ła [//meta.wikimedia.org/wiki/Aiuto:Sommario Guida utente] par majori informasion so l'uso de sto software wiki.\n\n== Par scumisiar ==\n\nI seguenti cołegamenti i xé en łengua inglese:\n\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Inpostasion de configurasion]\n* [//www.mediawiki.org/wiki/Manual:FAQ Domande frequenti so MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Mailing list anunsi MediaWiki]"
-}
\ No newline at end of file
+}
index 71fcf34..47e224e 100644 (file)
@@ -6,4 +6,4 @@
     },
     "mainpagetext": "'''MediaWiki-likutim om seižutadud jügedusita.'''",
     "mainpagedocfooter": "Kc. [//meta.wikimedia.org/wiki/Help:Kävutajan abukirj], miše sada informacijad wikin kävutamižes.\n\n== Erased tarbhaižed resursad ==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Järgendusiden nimikirjutez]\n* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce počtnimikirjutez]"
-}
\ No newline at end of file
+}
index 340b643..c18ac93 100644 (file)
 {
     "@metadata": {
         "authors": [
-            "පසිඳු කාවින්ද"
+            "පසිඳු කාවින්ද",
+            "Minh Nguyen",
+            "Withoutaname"
         ]
     },
+    "config-desc": "Trình cài đặt MediaWiki",
+    "config-title": "Cài đặt MediaWiki $1",
     "config-information": "Thông tin",
+    "config-localsettings-key": "Chìa khóa nâng cấp:",
+    "config-localsettings-badkey": "Bạn đã cung cấp một chìa khóa sai.",
+    "config-session-error": "Lỗi khi bắt đầu phiên làm việc: $1",
+    "config-your-language": "Ngôn ngữ của bạn:",
+    "config-your-language-help": "Chọn một ngôn ngữ để sử dụng trong quá trình cài đặt.",
+    "config-wiki-language": "Ngôn ngữ wiki:",
+    "config-wiki-language-help": "Chọn ngôn ngữ chủ yếu của nội dung trong wiki này.",
+    "config-back": "← Lùi",
+    "config-continue": "Tiếp →",
     "config-page-language": "Ngôn ngữ",
+    "config-page-welcome": "Chào mừng đến với MediaWiki!",
+    "config-page-dbconnect": "Kết nối với cơ sở dữ liệu",
+    "config-page-upgrade": "Nâng cấp một bản cài đặt có sẵn",
+    "config-page-dbsettings": "Thiết lập cơ sở dữ liệu",
     "config-page-name": "Tên",
     "config-page-options": "Tùy chọn",
+    "config-page-install": "Cài đặt",
+    "config-page-complete": "Xong rồi!",
+    "config-page-restart": "Bắt đầu cài đặt lại",
+    "config-page-readme": "Đọc trước",
+    "config-page-releasenotes": "Thông báo phát hành",
+    "config-page-copying": "Sao chép",
+    "config-page-upgradedoc": "Nâng cấp",
+    "config-page-existingwiki": "Wiki đã tồn tại",
+    "config-restart": "Có, khởi động lại nó",
+    "config-env-good": "Đã kiểm tra môi trường.\nBạn có thể cài đặt MediaWiki.",
+    "config-env-bad": "Đã kiểm tra môi trường.\nBạn không thể cài đặt MediaWiki.",
+    "config-env-php": "PHP $1 đã được cài đặt.",
+    "config-env-php-toolow": "PHP $1 đã được cài đặt.\nTuy nhiên, MediaWiki cần PHP $2 trở lên.",
+    "config-unicode-using-utf8": "Đang sử dụng utf8_normalize.so của Brion Vibber để chuẩn hóa văn bản Unicode.",
+    "config-unicode-using-intl": "Sẽ sử dụng [http://pecl.php.net/intl phần mở rộng PECL intl] để chuẩn hóa Unicode.",
+    "config-xcache": "[http://xcache.lighttpd.net/ XCache] đã được cài đặt",
+    "config-apc": "[http://www.php.net/apc APC] đã được cài đặt",
+    "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache] đã được cài đặt",
+    "config-diff3-bad": "Không tìm thấy GNU diff3.",
+    "config-git": "Đã tìm thấy phần mềm điều khiển phiên bản Git: <code>$1</code>.",
+    "config-git-bad": "Không tìm thấy phần mềm điều khiển phiên bản Git.",
+    "config-using-server": "Sẽ sử dụng tên máy chủ “<nowiki>$1</nowiki>”.",
+    "config-using-uri": "Sẽ sử dụng URL máy chủ “<nowiki>$1$2</nowiki>”.",
+    "config-db-type": "Kiểu cơ sở dữ liệu:",
+    "config-db-host": "Máy chủ của cơ sở dữ liệu:",
+    "config-db-host-oracle": "TNS cơ sở dữ liệu:",
+    "config-db-wiki-settings": "Dữ liệu để nhận ra wiki này",
+    "config-db-name": "Tên cơ sở dữ liệu:",
+    "config-db-name-oracle": "Giản đồ cơ sở dữ liệu:",
+    "config-db-install-account": "Tài khoản người dùng để cài đặt",
+    "config-db-username": "Tên người dùng cơ sở dữ liệu:",
+    "config-db-password": "Mật khẩu cơ sở dữ liệu:",
+    "config-db-wiki-account": "Tài khoản người dùng để hoạt động bình thường",
+    "config-db-prefix": "Tiền tố bảng cơ sở dữ liệu:",
+    "config-db-charset": "Bảng mã cơ sở dữ liệu",
+    "config-charset-mysql5-binary": "MySQL 4.1/5.0 nhị phân",
+    "config-charset-mysql5": "MySQL 4.1/5.0 UTF-8",
+    "config-charset-mysql4": "MySQL 4.0 UTF-8 tương thích ngược",
+    "config-mysql-old": "Cần MySQL $1 trở lên; bạn có $2.",
+    "config-db-port": "Cổng cơ sở dữ liệu:",
+    "config-db-schema": "Giản đồ cho MediaWiki:",
+    "config-pg-test-error": "Không thể kết nối với cơ sở dữ liệu '''$1''': $2",
+    "config-sqlite-dir": "Thư mục dữ liệu SQLite:",
+    "config-oracle-def-ts": "Không gian bảng mặc định:",
+    "config-oracle-temp-ts": "Không gian bảng tạm:",
+    "config-type-mysql": "MySQL (hoặc tương hợp)",
+    "config-type-mssql": "Microsoft SQL Server",
+    "config-header-mysql": "Thiết lập MySQL",
+    "config-header-postgres": "Thiết lập PostgreSQL",
+    "config-header-sqlite": "Thiết lập SQLite",
+    "config-header-oracle": "Thiết lập Oracle",
+    "config-header-mssql": "Thiết lập Microsoft SQL Server",
+    "config-invalid-db-type": "Loại cơ sở dữ liệu không hợp lệ",
+    "config-missing-db-name": "Bạn phải nhập một giá trị cho “Tên cơ sở dữ liệu”",
+    "config-missing-db-host": "Bạn phải nhập một giá trị cho “Máy chủ cơ sở dữ liệu”",
+    "config-missing-db-server-oracle": "Bạn phải nhập một giá trị cho “TNS cơ sở dữ liệu”",
+    "config-invalid-schema": "Giản đồ “$1” không hợp lệ cho MediaWiki.\nHãy chỉ sử dụng các chữ cái ASCII (a–z, A–Z), chữ số (0–9), và dấu gạch dưới (_).",
+    "config-postgres-old": "Cần PostgreSQL $1 trở lên; bạn có $2.",
+    "config-mssql-old": "Cần Microsoft SQL Server $1 trở lên. Bạn có $2.",
+    "config-sqlite-readonly": "Không thể ghi vào tập tin <code>$1</code>.",
+    "config-sqlite-cant-create-db": "Không thể tạo ra tập tin cơ sở dữ liệu <code>$1</code>.",
+    "config-regenerate": "Tạo lại LocalSettings.php →",
+    "config-show-table-status": "Truy vấn <code>SHOW TABLE STATUS</code> bị thất bại!",
+    "config-db-web-account": "Tài khoản cơ sở dữ liệu để truy cập Web",
+    "config-db-web-account-same": "Sử dụng lại tài khoản cài đặt",
+    "config-db-web-create": "Mở tài khoản nếu chưa tồn tại",
+    "config-mysql-engine": "Máy lưu trữ:",
+    "config-mysql-innodb": "InnoDB",
+    "config-mysql-myisam": "MyISAM",
+    "config-mysql-charset": "Bảng mã cơ sở dữ liệu:",
+    "config-mysql-binary": "Nhị phân",
+    "config-mysql-utf8": "UTF-8",
+    "config-mssql-auth": "Kiểu xác thực:",
+    "config-mssql-sqlauth": "Xác thực SQL Server",
+    "config-mssql-windowsauth": "Xác thực Windows",
+    "config-site-name": "Tên wiki:",
+    "config-site-name-blank": "Nhập tên của trang Web.",
+    "config-project-namespace": "Không gian tên dự án:",
     "config-ns-generic": "Dự án",
+    "config-ns-site-name": "Cùng với tên wiki: $1",
+    "config-ns-other": "Khác (định rõ)",
+    "config-ns-other-default": "WikiTôi",
+    "config-admin-box": "Tài khoản bảo quản viên",
+    "config-admin-name": "Tên người dùng của bạn:",
     "config-admin-password": "Mật khẩu:",
+    "config-admin-password-confirm": "Nhập lại mật khẩu:",
+    "config-admin-name-blank": "Nhập tên người dùng của bảo quản viên.",
+    "config-admin-password-blank": "Nhập mật khẩu của tài khoản bảo quản viên.",
+    "config-admin-password-mismatch": "Bạn đã nhập hai mật khẩu không khớp với nhau.",
     "config-admin-email": "Địa chỉ thư điện tử:",
+    "config-admin-error-bademail": "Bạn đã nhập một địa chỉ thư điện tử không hợp lệ.",
+    "config-subscribe": "Theo dõi [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce danh sách thư thông báo phát hành].",
+    "config-optional-continue": "Hỏi tôi về thêm chi tiết.",
+    "config-optional-skip": "Chán quá, cài đặt wiki rỗi.",
+    "config-profile": "Hồ sơ quyền người dùng:",
+    "config-profile-wiki": "Mở wiki",
+    "config-profile-no-anon": "Bắt buộc mở tài khoản",
+    "config-profile-private": "Wiki riêng tư",
+    "config-license": "Bản quyền và giấy phép:",
+    "config-license-none": "Không hiển thị giấy phép ở chân trang",
+    "config-license-cc-by-sa": "Creative Commons Ghi công–Chia sẻ tương tự",
+    "config-license-cc-by": "Creative Commons Ghi công",
+    "config-license-cc-by-nc-sa": "Creative Commons Ghi công–Phi thương mại–Chia sẻ tương tự",
+    "config-license-cc-0": "Creative Commons CC0 (phạm vi công cộng)",
+    "config-license-gfdl": "Giấy pháp Tài liệu Tự do GNU 1.3 trở lên",
+    "config-license-pd": "Phạm vi công cộng",
+    "config-license-cc-choose": "Chọn một giấy phép Creative Commons tùy biến",
+    "config-email-settings": "Thiết lập thư điện tử",
+    "config-enable-email": "Cho phép gửi thư điện tử đi",
+    "config-email-user": "Cho phép người dùng gửi thư điện tử cho người dùng khác",
+    "config-email-usertalk": "Gửi thư thông báo về tin nhắn mới",
+    "config-email-watchlist": "Gửi thư thông báo về bài theo dõi",
+    "config-email-auth": "Xác minh qua thư điện tử",
+    "config-email-sender": "Địa chỉ thư điện tử trả lại:",
+    "config-upload-settings": "Hình ảnh và tập tin tải lên",
+    "config-upload-enable": "Cho phép tải lên tập tin",
+    "config-upload-deleted": "Thư mục chứa các tập tin đã xóa:",
+    "config-logo": "URL biểu trưng:",
+    "config-instantcommons": "Kích hoạt Instant Commons",
+    "config-cc-again": "Chọn một lần nữa…",
+    "config-cc-not-chosen": "Chọn một giấy phép Creative Commons và bấm “Tiếp tục”.",
+    "config-advanced-settings": "Thiết lập nâng cao",
+    "config-cache-options": "Thiết lập bộ nhớ đệm đối tượng:",
+    "config-cache-accel": "Bộ nhớ đệm đối tượng PHP (APC, XCache, hoặc WinCache)",
+    "config-cache-memcached": "Sử dụng Memcached (cần thiết lập và cấu hình thêm)",
+    "config-memcached-servers": "Máy chủ Memcached:",
+    "config-memcache-needservers": "Bạn đã chọn Memcached là loại bộ nhớ đệm nhưng không định rõ máy chủ nào.",
+    "config-memcache-badip": "Bạn đã nhập một địa chỉ IP không hợp lệ cho Memcached: $1.",
+    "config-memcache-badport": "Số cổng Memcached phải từ $1 đến $2.",
+    "config-extensions": "Phần mở rộng",
+    "config-install-step-done": "hoàn tất",
+    "config-install-step-failed": "thất bại",
+    "config-install-extensions": "Đang bao gồm phần mở rộng",
+    "config-install-database": "Đang thiết lập cơ sở dữ liệu",
+    "config-install-schema": "Đang tạo giản đồ",
+    "config-install-pg-schema-not-exist": "Lược đồ PostgreSQL không tồn tại.",
+    "config-install-pg-schema-failed": "Thất bại khi tạo các bảng.\nHãy chắc chắn rằng người dùng “$1” có thể ghi vào giản đồ “$2”.",
+    "config-install-pg-plpgsql": "Tìm ngôn ngữ PL/pgSQL",
+    "config-pg-no-plpgsql": "Bạn cần phải cài đặt ngôn ngữ PL/pgSQL vào cơ sở dữ liệu $1",
+    "config-install-user": "Đang tạo người dùng trên cơ sở dữ liệu",
+    "config-install-user-alreadyexists": "Người dùng “$1” đã tồn tại",
+    "config-install-user-create-failed": "Thất bại khi tạo người dùng “$1”: $2",
+    "config-install-user-grant-failed": "Thất bại khi cấp quyền cho người dùng “$1”: $2",
+    "config-install-user-missing": "Người dùng chỉ định “$1” không tồn tại.",
+    "config-install-user-missing-create": "Người dùng chỉ định “$1” không tồn tại.\nKiểm hộp “mở tài khoản” ở dưới để tạo ra nó.",
+    "config-install-tables": "Đang tạo các bảng",
+    "config-install-tables-exist": "'''Cảnh báo:''' Các bảng MediaWiki hình như đã tồn tại.\nĐã bỏ qua việc tạo ra các bảng.",
+    "config-install-tables-failed": "'''Lỗi:''' Thất bại khi tạo các bảng với lỗi sau: $1",
+    "config-install-interwiki": "Đang xây dựng bảng liên wiki mặc định",
+    "config-install-interwiki-list": "Không thể đọc tập tin <code>interwiki.list</code>.",
+    "config-install-interwiki-exists": "'''Cảnh báo:''' Hình như đã có mục trong bảng liên wiki.\nĐã bỏ qua danh sách mặc định.",
+    "config-install-stats": "Đang khởi tạo các thống kê",
+    "config-install-keys": "Tạo ra các chìa khóa bí mật",
+    "config-install-sysop": "Đang mở tài khoản người dùng bảo quản viên",
+    "config-install-subscribe-fail": "Không thể theo dõi mediawiki-announce: $1",
+    "config-install-subscribe-notpossible": "cURL không được cài đặt và allow_url_fopen không có sẵn.",
+    "config-install-mainpage": "Đang tạo trang đầu với nội dung mặc định",
+    "config-install-extension-tables": "Đang tạo bảng cho các phần mở rộng được kích hoạt",
+    "config-install-mainpage-failed": "Không thể chèn trang đầu: $1",
+    "config-download-localsettings": "Tải về <code>LocalSettings.php</code>",
     "config-help": "Trợ giúp",
+    "config-nofile": "Không tìm thấy tập tin “$1”. Nó có phải bị xóa không?",
     "mainpagetext": "'''MediaWiki đã được cài đặt thành công.'''",
     "mainpagedocfooter": "Xin đọc [//meta.wikimedia.org/wiki/Help:Contents Hướng dẫn sử dụng] để biết thêm thông tin về cách sử dụng phần mềm wiki.\n\n== Để bắt đầu ==\n\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Danh sách các thiết lập cấu hình]\n* [//www.mediawiki.org/wiki/Manual:FAQ Các câu hỏi thường gặp MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Danh sách gửi thư về việc phát hành MediaWiki]"
-}
\ No newline at end of file
+}
index 050adae..9be55a1 100644 (file)
@@ -1,7 +1,5 @@
 {
-    "@metadata": {
-        "authors": []
-    },
+    "@metadata": [],
     "mainpagetext": "'''El MediaWiki pestiton benosekiko.'''",
     "mainpagedocfooter": "Konsultolös [//meta.wikimedia.org/wiki/Help:Contents Gebanageidian] ad tuvön nünis dö geb programema vükik.\n\n== Nüdugot ==\n\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Parametalised]\n* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki: SSP]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Potalised tefü fomams nulik ela MediaWiki]"
-}
\ No newline at end of file
+}
index a9c7a8e..328c361 100644 (file)
@@ -1,7 +1,5 @@
 {
-    "@metadata": {
-        "authors": []
-    },
+    "@metadata": [],
     "mainpagetext": "'''MediaWiki tarkvara paika säet.'''",
     "mainpagedocfooter": "Vikitarkvara pruukmisõ kotsilõ loeq mano:\n* [//meta.wikimedia.org/wiki/MediaWiki_User%27s_Guide MediaWiki pruukmisoppus (inglüse keelen)].\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Säädmiisi oppus (inglüse keelen)]\n* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki kõgõ küsütümbäq küsümiseq (inglüse keelen)]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce E-postilist, minka andas teedäq MediaWiki vahtsist kujõst]."
-}
\ No newline at end of file
+}
index 576d2db..d9df355 100644 (file)
@@ -5,4 +5,4 @@
         ]
     },
     "mainpagetext": "'''Li programe MediaWiki a stî astalé a l' idêye.'''"
-}
\ No newline at end of file
+}
index 3c9f1b4..2721a5c 100644 (file)
@@ -1,9 +1,72 @@
 {
     "@metadata": {
         "authors": [
-            "Harvzsf"
+            "Harvzsf",
+            "JinJian"
         ]
     },
+    "config-desc": "An pan-installar han MediaWiki",
+    "config-title": "MediaWiki $1 nga pag-installar",
+    "config-information": "Impormasyon",
+    "config-localsettings-upgrade": "Mayda <code>LocalSettings.php</code> nga paypay nga nabilngan.  Basi ma-upgrade ini nga pag-installar, alayon pagbutáng han value han <code>$wgUpgradeKey</code> ha kahon ha ubós. Mabibilngan mo ini ha <code>LocalSettings.php</code>.",
+    "config-localsettings-cli-upgrade": "Mayda <code>LocalSettings.php</code> nga paypay nga nabilngan. Basi ma-upgrade ini nga pag-installar, alayon pagpadalagan lugod han <code>update.php</code>",
+    "config-upgrade-key-missing": "Mayda daan na ng gin-installar nga MediaWiki nga nabilngan.\nBasi ma-upgrade ini nga pag-instalar, alayon pagbutang han nahasunod nga linya ha ubós han imo <code>LocalSettings.php</code>:\n\n$1",
+    "config-localsettings-connection-error": "May-ada pagsayop an nahitabo han pagpapakabit ngada ha database nga gingagamitan hin mga kamumutangan nga dapat unta ginpapatuman han <code>LocalSettings.php</code>. Alayon ayda ini nga mga kamumutangan ngan utrohon nala.\n\n$1",
+    "config-your-language": "Imo pinulongán",
+    "config-wiki-language": "Pinulongán han wiki",
+    "config-wiki-language-help": "Pilía an pinulongán nga kauróg igsúsurat hit wiki",
+    "config-back": "Bálik",
+    "config-continue": "Padayon",
+    "config-page-language": "Pinulongán",
+    "config-page-dbconnect": "Igsumpay ha database",
+    "config-page-name": "Ngaran",
+    "config-page-readme": "Basaha ako",
+    "config-page-copying": "Nagkokopya",
+    "config-restart": "Oo, utroha patikanga",
+    "config-welcome": "=== Mga pagpanginano panlibong ===\nMagkakamay-ada yano nga panginano para masabtan kun ini nga libong in naaangay para hiton pagtataod hiton MediaWiki. Hinumdomi iton paglakip hinin nga impormasyon kun karuyag mo mangaro hin suporta kun paunan-on humanon an pagtataod.",
+    "config-no-db": "Diri nakakabiling hin naaangay nga database driver! Kinahanglan mo magtaod hin uska database driver para han PHP. An masunod nga mga klase hin database in ginsusuporatahan: $1.\n\nKun ikaw mismo an nag-compile han PHP, kinahanglan ma-reconfigure iton nga para maapandar an database client, pananglitan, han paggamit han <code>./configure --with-mysqli</code>.\nKun gintaod mo an PHP tikang ha uska Debian o Ubuntu nga pakete, kinahanglan nimo magtaod liwat, pananglitan, hiton an <code>php5-mysql</code> nga pakete.",
+    "config-pcre-old": "<strong>Nangangarat-an:</strong> Nagkikinahanglan hin PCRE $1 o mas urhi pa.\nAn imo PHP nga binaryo in nakasumpay hin PCRE $2. [https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/PCRE More information].",
+    "config-site-name": "Ngaran han wiki:",
+    "config-ns-generic": "Proyekto",
+    "config-ns-site-name": "Kapareho han wiki nga ngaran: $1",
+    "config-admin-name": "Imo ngaran-gumaramit:",
+    "config-admin-password": "Tigaman panulod:",
+    "config-admin-password-confirm": "Tigaman panulod utro:",
+    "config-admin-name-blank": "Pagbutang hin ngaran-gumaramit hit magdudumara.",
+    "config-admin-password-blank": "Pagbutang hin tigaman-panulod para hit akawnt han magdudumara.",
+    "config-admin-password-mismatch": "An duha nga mga tigaman-panulod nga imo ginbutang in diri magkaparehas.",
+    "config-admin-email": "Address hit Email:",
+    "config-admin-error-bademail": "Nagbutang ka hin diri puydi nga address hit email.",
+    "config-almost-done": "Harani ka na mahuman!\nPuydi nim ilaktaw an nasasalin nga configuration ngan ig-install an wiki yana dayon.",
+    "config-optional-continue": "Pakyana pa hin durudamo nga mga pakiana.",
+    "config-profile": "Profile han mga katungod han gumaramit:",
+    "config-profile-no-anon": "Kinahanglan an paghimo hin akawnt",
+    "config-profile-fishbowl": "Otorisado nga mga editor la",
+    "config-profile-private": "Pribado nga wiki",
+    "config-license-pd": "Dominyo Publiko",
+    "config-email-user": "Igpaandar an gumaramit-ha-gumaramit nga email",
+    "config-email-user-help": "Igtugot an ngatanan nga mga gumaramit nga magpadangat hin email ha tagsa-tagsa kun ira ginpaandar ini ha ira karuyagon.",
+    "config-email-usertalk": "Igpaandar an pagpasabot ha pakli han hiruhimangraw han gumaramit",
+    "config-cc-again": "Pilii utro...",
+    "config-extensions": "Mga panugtong",
+    "config-install-step-done": "human na",
+    "config-install-step-failed": "pakyas",
+    "config-install-extensions": "Lakip an mga panugtong",
+    "config-install-schema": "Naghihimo hin iskima",
+    "config-install-pg-schema-not-exist": "Waray natatad-an nga iskima PostgreSQL.",
+    "config-install-pg-commit": "Nagsasaad hin pagbabag-o",
+    "config-install-user": "Naghihimo hin gumaramit hit database",
+    "config-install-user-alreadyexists": "May-ada na gumaramit nga \"$1\"",
+    "config-install-user-create-failed": "Pakyas an paghimo hin gumaramit nga \"$1\": $2",
+    "config-install-user-grant-failed": "Pakyas an paghatag hin pagtugot han gumaramit \"$1\": $2",
+    "config-install-tables": "Naghihimo hin mga table",
+    "config-install-interwiki-list": "Diri nakakabasa han paypay <code>interwiki.list</code>.",
+    "config-install-sysop": "Naghihimo hin akawnt han gumaramit han magdudurama",
+    "config-install-extension-tables": "Naghihimo hin mga table han pinaandar nga mga panugtong",
+    "config-install-mainpage-failed": "Diri nakakasuksok hin panguna nga pakli: $1",
+    "config-download-localsettings": "Ikarga-paubos an <code>LocalSettings.php</code>",
+    "config-help": "buligi",
+    "config-nofile": "An paypay nga \"$1\" in diri nabibilngan. Ginpara na ini?",
     "mainpagetext": "'''Malinamposon an pag-instalar han MediaWiki.'''",
-    "mainpagedocfooter": "Kitaa an [//meta.wikimedia.org/wiki/Help:Contents User's Guide] para hin impormasyon ha paggamit han wiki nga softweyr.\n\n== Ha pagtikang==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Configuration settings list]\n* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]"
-}
\ No newline at end of file
+    "mainpagedocfooter": "Kitaa an [//meta.wikimedia.org/wiki/Help:Contents User's Guide] para hin impormasyon ha paggamit han wiki nga softweyr.\n\n== Ha pagtikang==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Configuration settings list]\n* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]\n* [//www.mediawiki.org/wiki/Localisation#Translation_resources Localise MediaWiki for your language]"
+}
index 44ffdf7..618eb6a 100644 (file)
@@ -1,7 +1,5 @@
 {
-    "@metadata": {
-        "authors": []
-    },
+    "@metadata": [],
     "mainpagetext": "'''Campug MediaWiki gi sotti na . '''",
     "mainpagedocfooter": "Saytul [//meta.wikimedia.org/wiki/Ndimbal:Ndefu Gindikaayu jëfandikukat bi] ngir yeneeni xibaar ci jëfandiku gu tëriin gi.\n\n== Tambali ak MediaWiki ==\n\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Limu jumtukaayi kocc-koccal gi]\n* [//www.mediawiki.org/wiki/Manual:FAQ FAQ MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Limu waxtaan ci liy-génn ci MediaWiki]"
-}
\ No newline at end of file
+}
index e7467bf..25aeabc 100644 (file)
@@ -6,4 +6,4 @@
     },
     "mainpagetext": "'''MediaWiki安装成功哉!'''",
     "mainpagedocfooter": "请访问[//meta.wikimedia.org/wiki/Help:Contents 用户手册]以获得使用此维基软件个信息!\n\n== 入门 ==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings MediaWiki 配置设置列表]\n* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki 常见问题解答]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki 发布邮件列表]"
-}
\ No newline at end of file
+}
index 9fe1a42..28768c7 100644 (file)
@@ -6,4 +6,4 @@
     },
     "mainpagetext": "Йовудта Mediawiki гүүлһүдә тәвллһн.'''",
     "mainpagedocfooter": "Тер бики закллһна теткүл ю кеһәд олзлх туск [//meta.wikimedia.org/wiki/Help:Contents көтлвр] дастн.\n\n== Туста заавр ==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Көгүдә бүрткл]\n* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki туск ЮмБи]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki шинҗллһнә бүрткл]"
-}
\ No newline at end of file
+}
index d1f27be..0775b13 100644 (file)
@@ -8,25 +8,47 @@
     "config-desc": "דער אינסטאלירער פאר מעדיעוויקי",
     "config-title": "מעדיעוויקי $1 אינסטאלירונג",
     "config-information": "אינפֿארמאציע",
+    "config-session-error": "פֿעלער ביים אנהייבן סעסיע:$1",
+    "config-your-language": "אײַער שפראך:",
+    "config-your-language-help": "קלויבט א שפראך צו ניצן ביים אינסטאלירונג פראצעס.",
     "config-wiki-language": "ווקי שפראך:",
+    "config-wiki-language-help": "קלויבט אויס די שפראך מיט וואס בעיקר מען וועט שרײַבן די וויקי.",
     "config-back": "→ צוריק",
     "config-continue": "פֿארזעצן ←",
     "config-page-language": "שפראַך",
+    "config-page-welcome": "ברוכים הבאים צו מעדיעוויקי!",
+    "config-page-dbconnect": "פארבינדן צו דאטנבאזע",
+    "config-page-upgrade": "ראנג־העכערונג פון פארהאנע אינסטאלאציע",
+    "config-page-dbsettings": "דאטנבאזע איינשטעלונגען",
     "config-page-name": "נאָמען",
     "config-page-options": "ברירות",
+    "config-page-install": "אינסטאלירן",
+    "config-page-complete": "פארטיק!",
+    "config-page-restart": "ווידער־אנהייבן אינסטאלאציע",
+    "config-page-readme": "לייענט מיך",
+    "config-page-releasenotes": "ווערסיע־הערות",
+    "config-page-copying": "קאפיע",
+    "config-page-upgradedoc": "ראנג־העכערן",
+    "config-env-php": "PHP $1 איז אינצטאלירט.",
+    "config-apc": "[http://www.php.net/apc APC] איז אינסטאלירט",
+    "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache] איז אינסטאלירט",
+    "config-diff3-bad": "GNU diff3 נישט געטראפן.",
     "config-db-type": "דאטנבאזע טיפ:",
+    "config-db-host-oracle": "דאטנבאזע־TNS:",
     "config-db-name": "דאטנבאזע נאָמען:",
+    "config-db-username": "דאטנבאזע באניצער־נאָמען:",
     "config-project-namespace": "פראיעקט נאָמענטייל:",
     "config-ns-generic": "פראיעקט",
-    "config-admin-name": "אײַער נאָמען:",
+    "config-admin-name": "×\90ײַער ×\91×\90Ö·× ×\99צער־נ×\90Ö¸×\9e×¢×\9f:",
     "config-admin-password": "פאַסווארט:",
     "config-admin-password-mismatch": "די צוויי פאסוועטרט איר האט איינגעגעבן שטימען נישט.",
     "config-admin-email": "בליצפּאָסט אַדרעס:",
     "config-install-tables": "שאפן טאבעלעס",
     "config-install-tables-exist": "'''ווארענונג''': זעט אויס אז די מעדיעוויקי טאבעלעס עקזיסטירן שוין.\nאיבערהיפן שאפֿן.",
+    "config-install-mainpage-failed": "מ'האט נישט געקענט אריינגעבן הויפטבלאט: $1",
     "config-download-localsettings": "אראפלאדן <code>LocalSettings.php</code>",
     "config-help": "הילף",
     "config-nofile": "מ'האט נישט געקענט טרעפן די טעקע \"$1\". צי האט מען זי אויסגעמעקט?",
     "mainpagetext": "'''מעדיעוויקי אינסטאלירט מיט דערפאלג.'''",
     "mainpagedocfooter": "גיט זיך אן עצה מיט [//meta.wikimedia.org/wiki/Help:Contents באניצער'ס וועגווײַזער] פֿאר אינפֿארמאציע וויאזוי זיך באנוצן מיט וויקי ווייכוואַרג.\n\n== נוצליכע וועבלינקען פֿאַר אנהייבערס ==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings רשימה פון קאנפֿיגוראציעס]\n* [//www.mediawiki.org/wiki/Manual:FAQ אפֿט געפֿרעגטע שאלות]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce מעדיעוויקי באפֿרײַאונג פאסטליסטע]* [//www.mediawiki.org/wiki/Localisation#Translation_resources איבערזעצן מעדיעוויקי אין אײַער שפראך]"
-}
\ No newline at end of file
+}
index a575159..2813386 100644 (file)
@@ -4,6 +4,16 @@
             "Demmy"
         ]
     },
+    "config-your-language": "Èdè yín:",
+    "config-wiki-language": "Èdè wiki:",
+    "config-back": "← Ẹ̀yìn",
+    "config-continue": "Ìtẹ̀síwájú →",
+    "config-page-language": "Èdè",
+    "config-page-welcome": "Ẹ kú àbò sí MediaWiki!",
+    "config-page-dbconnect": "Ìjápọ̀ mọ́ ibùdó dátà",
+    "config-page-name": "Orúkọ",
+    "config-db-type": "Irú ibùdó dátà:",
+    "config-db-host": "Agbàlejò ibùdó dátà:",
     "mainpagetext": "'''MediaWiki ti jẹ́ gbígbékọ́sínú láyọrísírere.'''",
     "mainpagedocfooter": "Ẹ ṣàbẹ̀wò sí [//meta.wikimedia.org/wiki/Help:Contents User's Guide] fún ìfitólétí nípa líló atòlànà wíkì.\n\n== Láti bẹ̀rẹ̀ ==\n*  [//www.mediawiki.org/wiki/Manual:Configuration_settings Configuration settings list]\n* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]"
-}
\ No newline at end of file
+}
index 18dbc25..2ba0d9b 100644 (file)
@@ -1,7 +1,5 @@
 {
-    "@metadata": {
-        "authors": []
-    },
+    "@metadata": [],
     "mainpagetext": "'''MediaWiki已經裝好。'''",
     "mainpagedocfooter": "參閱[//meta.wikimedia.org/wiki/Help:Contents 用戶指引](英),裏面有資料講點用wiki軟件。\n\n==開始使用==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings 配置設定清單](英)\n* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki 常見問題](英)\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki 發佈郵件名單](英)"
-}
\ No newline at end of file
+}
index 14b15a6..89ec93e 100644 (file)
@@ -1,7 +1,5 @@
 {
-    "@metadata": {
-        "authors": []
-    },
+    "@metadata": [],
     "mainpagetext": "'''De installaotie van MediaWiki is geslaegd.'''",
     "mainpagedocfooter": "Raedpleeg de [//meta.wikimedia.org/wiki/ZEA_Ulpe:Inhoudsopgaeve andleidieng] voe informatie over 't gebruuk van de wikisoftware.\n\n== Meer ulpe over MediaWiki ==\n\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Lieste mie instelliengen]\n* [//www.mediawiki.org/wiki/Manual:FAQ Veehestelde vraehen (FAQ)]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Mailienglieste voe ankondigiengen van nieuwe versies]"
-}
\ No newline at end of file
+}
index 06c7646..c00f8fd 100644 (file)
             "Yfdyh000",
             "乌拉跨氪",
             "阿pp",
-            "아라"
+            "아라",
+            "Byfserag",
+            "Hudafu",
+            "Liuxinyu970226",
+            "Qiyue2001"
         ]
     },
     "config-desc": "MediaWiki安装程序",
@@ -24,7 +28,7 @@
     "config-localsettings-badkey": "您提供的密钥不正确。",
     "config-upgrade-key-missing": "检测到MediaWiki的配置已经存在。若要升级该配置,请将下面一行文本添加到<code>LocalSettings.php</code>的底部:\n\n$1",
     "config-localsettings-incomplete": "当前的<code>LocalSettings.php</code>可能并不完整,因为变量$1没有设置。请在<code>LocalSettings.php</code>设置该变量,并单击“{{int:Config-continue}}”。",
-    "config-localsettings-connection-error": "在使用<code>LocalSettings.php</code>或<code>AdminSettings.php</code>中指定的设置连接数据库时发生错误。请修复相应设置并重试。\n\n$1",
+    "config-localsettings-connection-error": "在使用<code>LocalSettings.php</code>中指定的设置连接数据库时发生错误。请修复相应设置并重试。\n\n$1",
     "config-session-error": "启动会话出错:$1",
     "config-session-expired": "您的会话数据可能已经过期,当前会话的使用期限被设定为$1。您可以在php.ini中设置<code>session.gc_maxlifetime</code>来延长此期限,并重新启动本配置程序。",
     "config-no-session": "您的会话数据丢失了!请检查php.ini并确保<code>session.save_path</code>被设置为适当的目录。",
     "config-page-readme": "自述",
     "config-page-releasenotes": "发布说明",
     "config-page-copying": "复制",
-    "config-page-upgradedoc": "更新",
-    "config-page-existingwiki": "有wiki",
+    "config-page-upgradedoc": "升级",
+    "config-page-existingwiki": "有wiki",
     "config-help-restart": "是否要清除所有已输入且保存的数据,并重新启动安装过程吗?",
     "config-restart": "是的,重启吧",
-    "config-welcome": "=== ç\8e¯å¢\83æ£\80æ\9f¥ ===\n对å½\93å\89\8dç\8e¯å¢\83æ\98¯å\90¦é\80\82å\90\88å®\89è£\85MediaWikiä½\9cå\9fºæ\9c¬ç\9a\84æ£\80æ\9f¥ã\80\82å¦\82æ\9e\9cæ\82¨å\9c¨å®\89è£\85è¿\87ç¨\8b中é\9c\80è¦\81帮å\8a©ï¼\8c请æ\8f\90ä¾\9bè¿\99äº\9bæ£\80æ\9f¥ç\9a\84ç»\93æ\9e\9c。",
+    "config-welcome": "=== ç\8e¯å¢\83æ£\80æ\9f¥ ===\nå°\86ç®\80å\8d\95æ£\80æ\9f¥å½\93å\89\8dç\8e¯å¢\83æ\98¯å\90¦é\80\82å\90\88å®\89è£\85MediaWikiã\80\82å¦\82æ\9e\9cæ\82¨è¦\81寻æ±\82å®\89è£\85è¿\87ç¨\8bç\9a\84æ\94¯æ\8c\81ï¼\8c请记å¾\97é\99\84ä¸\8a此信æ\81¯。",
     "config-copyright": "=== 版权和条款 ===\n\n$1\n\n本程序为自由软件;您可依据自由软件基金会所发表的GNU通用公共授权条款规定,就本程序再为发布与/或修改;无论您依据的是本授权的第二版或(您自行选择的)任一日后发行的版本。\n\n本程序是基于使用目的而加以发布,然而'''不负任何担保责任''';亦无对'''适售性'''或'''特定目的适用性'''所为的默示性担保。详情请参照GNU通用公共授权。\n\n您应已收到附随于本程序的<doclink href=\"Copying\">GNU通用公共授权的副本</doclink>;如果没有,请写信至自由软件基金会:59 Temple Place - Suite 330, Boston, Ma 02111-1307, USA,或[http://www.gnu.org/copyleft/gpl.html 在线阅读]。",
     "config-sidebar": "* [//www.mediawiki.org/wiki/MediaWiki/zh-hans MediaWiki首页]\n* [//www.mediawiki.org/wiki/Help:Contents/zh-hans 用户指南]\n* [//www.mediawiki.org/wiki/Manual:Contents 管理员指南]\n* [//www.mediawiki.org/wiki/Manual:FAQ/zh-hans 常见问题解答]\n----\n* <doclink href=Readme>自述文件</doclink>\n* <doclink href=ReleaseNotes>发行说明</doclink>\n* <doclink href=Copying>协议副本</doclink>\n* <doclink href=UpgradeDoc>升级</doclink>",
     "config-env-good": "环境检查已经完成。您可以安装MediaWiki。",
     "config-env-php": "PHP $1已安装。",
     "config-env-php-toolow": "已安装PHP $1;但是,MediaWiki需要PHP $2或更高版本。",
     "config-unicode-using-utf8": "使用Brion Vibber的utf8_normalize.so实现Unicode正常化。",
-    "config-unicode-using-intl": "使用[http://pecl.php.net/intl intl PECL扩展]实现Unicode正常化。",
-    "config-unicode-pure-php-warning": "'''警告:'''因为尚未安装 [http://pecl.php.net/intl intl PECL 扩展]以处理 Unicode 正常化,故只能退而采用运行较慢的纯 PHP 实现的方法。\n如果您运行着一个高流量的站点,请参阅 [//www.mediawiki.org/wiki/Unicode_normalization_considerations Unicode 正常化]一文。",
+    "config-unicode-using-intl": "使用[http://pecl.php.net/intl intl PECL扩展程序]标准化Unicode。",
+    "config-unicode-pure-php-warning": "<strong>警告:</strong>因为尚未安装 [http://pecl.php.net/intl intl PECL 扩展]以处理 Unicode 正常化,故只能退而采用运行较慢的纯 PHP 实现的方法。\n如果您运行着一个高流量的站点,请参阅 [//www.mediawiki.org/wiki/Unicode_normalization_considerations Unicode 正常化]一文。",
     "config-unicode-update-warning": "'''警告''':Unicode正常化封装器的已安装版本使用了旧版本的[http://site.icu-project.org/ ICU项目]库。如果您需要使用Unicode,请将其[//www.mediawiki.org/wiki/Unicode_normalization_considerations 升级]。",
-    "config-no-db": "找不到合适的数据库驱动!您需要为PHP安装数据库驱动。目前支持以下数据库:$1。\n\n如果您正在使用共享主机,请向您的主机提供商申请安装合适的数据库驱动。如果您通过自行编译安装的PHP,请对其进行重新配置以启用数据库客户端,例如使用<code>./configure --with-mysql</code>。如果您通过Debian或Ubuntu包安装的PHP,您还需要安装php5-mysql模块。",
+    "config-no-db": "找不到合适的数据库驱动!您需要为PHP安装数据库驱动。目前支持以下数据库:$1。如果您是自己编译的PHP,请重新配置他与数据库客户端将其启用,诸如,使用<code>./configure --with-mysqli</code>。如果您从Debian或Ubuntu包安装了PHP,之后您仍需要安装诸如<code>php5-mysql</code>包。",
     "config-outdated-sqlite": "'''警告''':您已安装SQLite $1,但是它的版本低于最低要求版本$2。因此您无法选择SQLite。",
     "config-no-fts3": "'''警告''':已编译的SQLite不包含[//sqlite.org/fts3.html FTS3模块],后台搜索功能将不可用。",
     "config-register-globals": "'''警告:PHP的<code>[http://php.net/register_globals register_globals]</code>选项被启用。请尽量禁用该功能,'''虽然不会影响MediaWiki的运行,但您的服务器会被暴露给潜在的安全漏洞。",
     "config-magic-quotes-runtime": "'''毁灭性错误:[http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-runtime magic_quotes_runtime]已启用!'''\n此选项会无法预测地破坏输入的数据,请将其禁用,否则您将不能安装或使用MediaWiki。",
     "config-magic-quotes-sybase": "'''毁灭性错误:[http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-runtime magic_quotes_sybase]已启用!'''\n此选项会无法预测地破坏输入的数据,请将其禁用,否则您将不能安装或使用MediaWiki。",
     "config-mbstring": "'''毁灭性错误:[http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload]已启用!'''\n此选项会导致错误并不可预测地破坏数据,请将其禁用,否则您将不能安装或使用MediaWiki。",
-    "config-ze1": "'''毁灭性错误:[http://www.php.net/manual/en/ini.core.php zend.ze1_compatibility_mode]已启用!'''\n此选项将导致MediaWiki出现极其严重的故障,请将其禁用,否则您将不能安装或使用MediaWiki。",
     "config-safe-mode": "'''警告:'''PHP的[http://www.php.net/features.safe-mode 安全模式]已启用。它可能会导致一些问题,尤其在对文件上传和数学公式<code>math</code>的支持方面。",
     "config-xml-bad": "缺少PHP的XML模块。MediaWiki需要使用该模块提供的函数,在当前配置下将无法工作。如果您正在使用Mandrake Linux,请安装php-xml包。",
-    "config-pcre": "可能缺少PCRE的支持模块。MediaWiki的运行需要兼容于Perl的正则表达式函数。",
+    "config-pcre-old": "'' 致命错误: ''需要PCRE $1 或更高版本。\n您的 PHP 二进制文件与 PCRE $2 链接。\n[https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/PCRE 详细信息]。",
     "config-pcre-no-utf8": "'''毁灭性错误''':PHP的PCRE模块在编译时可能没有包含PCRE_UTF8支持。MediaWiki需要UTF-8支持才能正常工作。",
     "config-memory-raised": "PHP的内存使用上限<code>memory_limit</code>为$1,自动提升到$2。",
     "config-memory-bad": "'''警告:'''PHP的内存使用上限<code>memory_limit</code>为$1。该设定可能过低,并导致安装失败!",
     "config-ctype": "'''毁灭性错误''':PHP必须有[http://www.php.net/manual/en/ctype.installation.php Ctype 扩展]来支持编译。",
+    "config-json": "'''致命问题:''' PHP编译没有附带JSON支持。\n在安装MediaWiki前,你必须安装PHP JSON扩展或者[http://pecl.php.net/package/jsonc PECL jsonc]扩展。\n* PHP扩展已包含在Red Hat Enterprise Linux (CentOS) 5和6中,但必须在<code>/etc/php.ini</code>或<code>/etc/php.d/json.ini</code>中启用。\n* 部分在2013年5月后发行的Linux发行版省略了PHP扩展,而将PECL扩展打包成了<code>php5-json</code>或<code>php-pecl-jsonc</code>。",
     "config-xcache": "[http://xcache.lighttpd.net/ XCache]已安装",
     "config-apc": "[http://www.php.net/apc APC]已安装",
     "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache]已安装",
     "config-gd": "已找到内建的GD图形库。如果你启用了上传功能,缩略图功能也将被启用。",
     "config-no-scaling": "找不到GD库或ImageMagick。缩略图功能将不可用。",
     "config-no-uri": "'''错误:'''无法确定当前的URI。安装已中断。",
-    "config-no-cli-uri": "'''警告''':未指定--scriptpath参数,使用默认值:<code>$1</code>。",
+    "config-no-cli-uri": "<strong>警告:</strong>未指定<code>--scriptpath</code>参数,使用默认值:<code>$1</code>。",
     "config-using-server": "使用服务器名“<nowiki>$1</nowiki>”。",
     "config-using-uri": "使用服务器URL“<nowiki>$1$2</nowiki>”。",
     "config-uploads-not-safe": "'''警告:'''您的默认上传目录<code>$1</code>存在允许执行任意脚本的漏洞。尽管MediaWiki会对所有已上传的文件进行安全检查,但我们仍然强烈建议您在启用上传功能前[//www.mediawiki.org/wiki/Manual:Security#Upload_security 关闭该安全漏洞]。",
     "config-no-cli-uploads-check": "'''警告''':在CLI安装过程中,没有对您的默认上传目录(<code>$1</code>)进行执行任意脚本的漏洞检查。",
-    "config-brokenlibxml": "您的系统安装的PHP和libxml2版本组合存在故障,并可能在MediaWiki和其他web应用程序中造成隐藏的数据损坏。请将PHP升级到5.2.9或以上,libxml2升级到2.7.3或以上([//bugs.php.net/bug.php?id=45996 PHP的故障报告])。安装已中断。",
-    "config-using531": "由于函数<code>__call()</code>的引用参数存在故障,PHP $1和MediaWiki无法兼容。请升级到PHP 5.3.2或更高版本,或降级到PHP 5.3.0以修复该问题。安装已中断。",
+    "config-brokenlibxml": "您的系统安装的PHP和libxml2版本组合存在故障,并可能在MediaWiki和其他web应用程序中造成隐藏的数据损坏。请将libxml2升级到2.7.3或以上([https://bugs.php.net/bug.php?id=45996 PHP的故障报告])。安装已中断。",
     "config-suhosin-max-value-length": "Suhosin已经安装并将GET请求的参数长度限制在$1字节。MediaWiki的ResourceLoader部件可以在此限制下正常工作,但其性能会被降低。如果可能,请在<code>php.ini</code>中将<code>suhosin.get.max_value_length</code>设为1024或更高值,并在LocalSettings.php中将<code>$wgResourceLoaderMaxQueryLength</code>设为同一值。",
     "config-db-type": "数据库类型:",
     "config-db-host": "数据库主机:",
     "config-db-username": "数据库用户名:",
     "config-db-password": "数据库密码:",
     "config-db-password-empty": "请为新数据库用户$1输入密码。尽管您可以创建不使用密码的用户,但这样做并不安全。",
+    "config-db-username-empty": "您必须输入用于“{{int:config-db-username}}”的值",
     "config-db-install-username": "请输入在安装过程中用于连接数据库的用户名。请勿输入MediaWiki帐号的用户名,请输入您数据库的用户名。",
     "config-db-install-password": "请输入在安装过程中用于连接数据库的密码。请勿输入MediaWiki帐号的密码,请输入您数据库的密码。",
     "config-db-install-help": "请输入在安装过程中用于连接数据库的用户名和密码。",
     "config-sqlite-dir-help": "SQLite会将所有的数据存储于单一文件中。\n\n您所提供的目录必须在安装过程中对网页服务器可写。\n\n该目录'''不应'''允许通过web访问,因此我们不会将数据文件和PHP文件放在一起。\n\n安装程序在创建数据文件时,亦会在相同目录下创建<code>.htaccess</code>以控制权限。假若此等控制失效,则可能会将您的数据文件暴露于公共空间,让他人可以获取用户数据(电子邮件地址、杂凑后的密码)、被删除的版本以及其他在wiki上被限制访问的数据。\n\n请考虑将数据库统一放置在某处,如<code>/var/lib/mediawiki/yourwiki</code>下。",
     "config-oracle-def-ts": "默认表空间:",
     "config-oracle-temp-ts": "临时表空间:",
+    "config-type-mysql": "MySQL(或兼容程序)",
+    "config-type-mssql": "微软SQL服务器",
     "config-support-info": "MediaWiki支持以下数据库系统:\n\n$1\n\n如果您在下面列出的数据库系统中没有找到您希望使用的系统,请根据上方链向的指引启用支持。",
-    "config-support-mysql": "* $1是MediaWiki的首选数据库,对它的支持最为完备([http://www.php.net/manual/en/mysql.installation.php 如何将对MySQL的支持编译进PHP中])",
-    "config-support-postgres": "* $1是一种流行的开源数据库系统,可作为MySQL的替代([http://www.php.net/manual/en/pgsql.installation.php 如何将对PostgreSQL的支持编译进PHP中])。本程序中可能依然存在一些小而明显的错误,因此并不建议在生产环境中使用该数据库系统。",
-    "config-support-sqlite": "* $1是一种轻量级的数据库系统,能被良好地支持。([http://www.php.net/manual/en/pdo.installation.php 如何将对SQLite的支持编译进PHP中],须使用PDO)",
-    "config-support-oracle": "* $1是一种商用企业级的数据库。([http://www.php.net/manual/en/oci8.installation.php 如何将对OCI8的支持编译进PHP中])",
+    "config-dbsupport-mysql": "* [{{int:version-db-mysql-url}} MySQL]是MediaWiki的首选数据库,对它的支持最为完备([http://www.php.net/manual/en/mysql.installation.php 如何将对MySQL的支持编译进PHP中])",
+    "config-dbsupport-postgres": "* [{{int:version-db-postgres-url}} PostgreSQL]是一种流行的开源数据库系统,可作为MySQL的替代([http://www.php.net/manual/en/pgsql.installation.php 如何将对PostgreSQL的支持编译进PHP中])。本程序中可能依然存在一些小而明显的错误,因此并不建议在生产环境中使用该数据库系统。",
+    "config-dbsupport-sqlite": "* [{{int:version-db-sqlite-url}} SQLite]是一种轻量级的数据库系统,能被良好地支持。([http://www.php.net/manual/en/pdo.installation.php 如何将对SQLite的支持编译进PHP中],须使用PDO)",
+    "config-dbsupport-oracle": "* [{{int:version-db-oracle-url}} Oracle]是一种商用企业级的数据库。([http://www.php.net/manual/en/oci8.installation.php 如何将对OCI8的支持编译进PHP中])",
+    "config-dbsupport-mssql": "* [{{int:version-db-mssql-url}} Microsoft SQL Server]是一个适用于Windows的商业性企业数据库。([http://www.php.net/manual/en/sqlsrv.installation.php 如何编译带有SQLSRV支持的PHP])",
     "config-header-mysql": "MySQL设置",
     "config-header-postgres": "PostgreSQL设置",
     "config-header-sqlite": "SQLite设置",
     "config-header-oracle": "Oracle设置",
+    "config-header-mssql": "Microsoft SQL Server设置",
     "config-invalid-db-type": "无效的数据库类型",
-    "config-missing-db-name": "您必须为“数据库名称”输入内容",
-    "config-missing-db-host": "您必须为“数据库主机”输入内容",
-    "config-missing-db-server-oracle": "您必须为“数据库透明网络底层(TNS)”输入内容",
-    "config-invalid-db-server-oracle": "无效的数据库TNS“$1”。请只使用ASCII字母(a-z、A-Z)、数字(0-9)、下划线(_)和点号(.)。",
+    "config-missing-db-name": "您必须为“{{int:config-db-name}}”输入内容。",
+    "config-missing-db-host": "您必须为“{{int:config-db-host}}”输入内容。",
+    "config-missing-db-server-oracle": "您必须为“{{int:config-db-host-oracle}}”输入内容。",
+    "config-invalid-db-server-oracle": "无效的数据库TNS“$1”。请使用“TNS 名称”或者一个“轻松连接”字符串([http://docs.oracle.com/cd/E11882_01/network.112/e10836/naming.htm Oracle 命名方法])",
     "config-invalid-db-name": "无效的数据库名称“$1”。请只使用ASCII字母(a-z、A-Z)、数字(0-9)、下划线(_)和连字号(-)。",
     "config-invalid-db-prefix": "无效的数据库前缀“$1”。请只使用ASCII字母(a-z、A-Z)、数字(0-9)、下划线(_)和连字号(-)。",
     "config-connection-error": "$1。\n\n请检查下列的主机、用户名和密码设置后重试。",
     "config-db-sys-create-oracle": "安装程序仅支持使用SYSDBA帐户创建新帐户。",
     "config-db-sys-user-exists-oracle": "用户帐户“$1”已经存在。SYSDBA仅可用于创建新帐户!",
     "config-postgres-old": "需要PostgreSQL $1或更新的版本,您的版本为$2。",
+    "config-mssql-old": "需要 Microsoft SQL Server $1 或者更高版本。您的版本是 $2。",
     "config-sqlite-name-help": "请为您的wiki指定一个用于标识的名称。请勿使用空格或连字号,该名称将被用作SQLite的数据文件名。",
     "config-sqlite-parent-unwritable-group": "由于父目录<code><nowiki>$2</nowiki></code>对网页服务器不可写,无法创建数据目录<code><nowiki>$1</nowiki></code>。\n\n安装程序已确定您网页服务器所使用的用户。请将<code><nowiki>$3</nowiki></code>目录设为对该用户可写以继续安装过程。在Unix/Linux系统中,您可以逐行输入下列命令:\n\n<pre>cd $2\nmkdir $3\nchgrp $4 $3\nchmod g+w $3</pre>",
     "config-sqlite-parent-unwritable-nogroup": "由于父目录<code><nowiki>$2</nowiki></code>对网页服务器不可写,无法创建数据目录<code><nowiki>$1</nowiki></code>。\n\n安装程序无法确定您网页服务器所使用的用户。请将<code><nowiki>$3</nowiki></code>目录设为全局可写(对所有用户)以继续安装过程。在Unix/Linux系统中,您可以逐行输入下列命令:\n\n<pre>cd $2\nmkdir $3\nchmod a+w $3</pre>",
     "config-mysql-innodb": "InnoDB",
     "config-mysql-myisam": "MyISAM",
     "config-mysql-myisam-dep": "'''警告''':您选择了MyISAM作为MySQL的存储引擎,MediaWiki并不推荐您这么做,因为:\n* 它仅能通过表锁定来勉强支持并发\n* 与其他引擎相比,它更容易被损坏\n* MediaWiki代码库并不总会去处理MyISAM\n\n如果您的MySQL程序支持InnoDB,我们高度推荐您使用该引擎替代MyISAM。\n如果您的MySQL程序不支持InnoDB,请考虑升级。",
-    "config-mysql-only-myisam-dep": "''''è­¦å\91\8aï¼\9a'''MyISAMæ\98¯MySQLå\94¯ä¸\80å\8f¯ç\94¨ç\9a\84å­\98å\82¨å¼\95æ\93\8eï¼\8cä½\86ä¸\8dé\80\82å\90\88ç\94¨äº\8eMediaWikiï¼\8cæ\98¯ç\94±äº\8eï¼\9a\n*ç\94±äº\8eå\8fªæ\94¯æ\8c\81表级é\94\81å®\9aï¼\8cå\87 ä¹\8eä¸\8dæ\94¯æ\8c\81并å\8f\91ã\80\82\n*å®\83æ¯\94å\85¶ä»\96å¼\95æ\93\8eæ\9b´å®¹æ\98\93æ\8d\9få\9d\8fã\80\82\n*MediaWiki代ç \81ä¸\8dè\83½æ\80»æ\98¯æ\8c\89ç\85§é¢\84设å\9c°操作MyISAM。\n\n你的MySQL不支持InnoDB,是时候升级了。",
+    "config-mysql-only-myisam-dep": "''''è­¦å\91\8aï¼\9a'''MyISAMæ\98¯MySQLå\9c¨æ­¤æ\9cºå\99¨ä¸\8aå\94¯ä¸\80å\8f¯ç\94¨ç\9a\84å­\98å\82¨å¼\95æ\93\8eï¼\8cä½\86å®\83ä¸\8dé\80\82å\90\88ç\94¨äº\8eMediaWikiï¼\8cå\9b ä¸ºï¼\9a\n*å\9b ä¸ºè¡¨çº§é\94\81å®\9aï¼\8cå®\83å\87 ä¹\8eä¸\8dæ\94¯æ\8c\81并å\8f\91ã\80\82\n*å®\83ç\9b¸æ¯\94å\85¶ä»\96å¼\95æ\93\8eæ\9b´å®¹æ\98\93æ\8d\9få\9d\8fã\80\82\n*MediaWiki代ç \81ä¸\8dè\83½æ\80»æ\98¯æ\8c\89ç\85§é¢\84æ\9c\9f操作MyISAM。\n\n你的MySQL不支持InnoDB,是时候升级了。",
     "config-mysql-engine-help": "'''InnoDB'''通常是最佳选项,因为它对并发操作有着良好的支持。\n\n'''MyISAM'''在单用户或只读环境下可能会有更快的性能表现。但MyISAM数据库出错的概率一般要大于InnoDB数据库。",
     "config-mysql-charset": "数据库字符集:",
     "config-mysql-binary": "二进制",
     "config-mysql-utf8": "UTF-8",
     "config-mysql-charset-help": "在'''二进制模式'''下,MediaWiki会将UTF-8编码的文本存于数据库的二进制字段中。相对于MySQL的UTF-8模式,这种方法效率更高,并允许您使用全范围的Unicode字符。\n\n在'''UTF-8模式'''下,MySQL将知道您数据使用的字符集,并能适当地提供和转换内容。但这样做您将无法在数据库中存储[//zh.wikipedia.org/wiki/基本多文种平面 基本多文种平面]以外的字符。",
-    "config-site-name": "Wiki的名称:",
+    "config-mssql-auth": "身份验证类型:",
+    "config-mssql-web-auth": "选择Web服务器在通常wiki操作期间用来连接数据库服务器的身份验证方式。\n如果您选择“{{int:config-mssql-windowsauth}}”,将使用运行Web服务器的用户的凭据。",
+    "config-mssql-sqlauth": "SQL Server 身份验证",
+    "config-mssql-windowsauth": "Windows 身份验证",
+    "config-site-name": "wiki的名称:",
     "config-site-name-help": "填入的内容会出现在浏览器的标题栏以及其他多处位置中。",
     "config-site-name-blank": "输入网站的名称。",
     "config-project-namespace": "项目名字空间:",
     "config-ns-invalid": "指定的名字空间“<nowiki>$1</nowiki>”无效,请为项目名字空间指定其他名称。",
     "config-ns-conflict": "指定的名字空间“<nowiki>$1</nowiki>”与默认的MediaWiki名字空间冲突。请指定一个不同的项目名字空间。",
     "config-admin-box": "管理员帐号",
-    "config-admin-name": "您的名字:",
+    "config-admin-name": "您的用户名:",
     "config-admin-password": "密码:",
     "config-admin-password-confirm": "确认密码:",
     "config-admin-help": "在此输入您想使用的用户名,例如“乔帮主”。您将使用该名称登录本wiki。",
     "config-admin-name-blank": "输入管理员的用户名。",
     "config-admin-name-invalid": "指定的用户名“<nowiki>$1</nowiki>”无效,请指定其他用户名。",
     "config-admin-password-blank": "输入管理员帐号的密码。",
-    "config-admin-password-same": "密码不能和用户名相同。",
     "config-admin-password-mismatch": "两次输入的密码并不相同。",
     "config-admin-email": "电子邮件地址:",
-    "config-admin-email-help": "输入电子邮件地址后,您可以收到此wiki上其他用户发来的电子邮件,并能重置您的密码,还可在监视列表中页面被更改时收到邮件通知。您可以将此字段留空。",
+    "config-admin-email-help": "在这里输入电子邮件地址可以允许你收到来自本wiki其他用户的电子邮件,重置你的密码和收到你的监视列表中的页面的更改通知。你可以将该字段留空。",
     "config-admin-error-user": "在创建用户名为“<nowiki>$1</nowiki>”的管理员帐号时发生内部错误。",
     "config-admin-error-password": "在为管理员“<nowiki>$1</nowiki>”设置密码时发生内部错误:<pre>$2</pre>",
     "config-admin-error-bademail": "您输入了无效的电子邮件地址。",
     "config-optional-continue": "多问我一些问题吧。",
     "config-optional-skip": "我已经不耐烦了,赶紧安装我的wiki。",
     "config-profile": "用户权限配置:",
-    "config-profile-wiki": "开放wiki",
+    "config-profile-wiki": "开放wiki",
     "config-profile-no-anon": "需要注册帐号",
     "config-profile-fishbowl": "编辑受限",
     "config-profile-private": "非公开wiki",
     "config-memcache-badip": "您为Memcached输入了无效的IP地址:$1。",
     "config-memcache-noport": "您没有指定Memcached服务器的端口:$1。如果您不清楚端口是多少,默认值为11211。",
     "config-memcache-badport": "Memcached的端口号应该在$1到$2之间。",
-    "config-extensions": "扩展",
+    "config-extensions": "扩展程序",
     "config-extensions-help": "已在您的<code>./extensions</code>目录中发现下列扩展。\n\n您可能要对它们进行额外的配置,但您现在可以启用它们。",
     "config-install-alreadydone": "'''警告:'''您似乎已经安装了MediaWiki,并试图重新安装它。请前往下一个页面。",
     "config-install-begin": "点击“{{int:config-continue}}”后,您将开始安装MediaWiki。如果您还想对配置作一些修改,请点击“{{int:config-back}}”。",
     "config-install-step-done": "完成",
     "config-install-step-failed": "失败",
-    "config-install-extensions": "æ­£å\9c¨å\90¯ç\94¨æ\89©å±\95",
+    "config-install-extensions": "æ­£å\9c¨å\8c\85å\90«æ\89©å±\95ç¨\8båº\8f",
     "config-install-database": "正在配置数据库",
     "config-install-schema": "创建架构",
     "config-install-pg-schema-not-exist": "PostgreSQL 架构不存在",
     "config-install-subscribe-fail": "无法订阅mediawiki-announce:$1",
     "config-install-subscribe-notpossible": "没有安装cURL,allow_url_fopen也不可用。",
     "config-install-mainpage": "正在创建显示默认内容的首页",
-    "config-install-extension-tables": "正在为已启用扩展创建数据表",
+    "config-install-extension-tables": "正在创建已启用扩展程序表",
     "config-install-mainpage-failed": "无法插入首页:$1",
     "config-install-done": "'''恭喜!'''\n您已经成功地安装了MediaWiki。\n\n安装程序已经生成了<code>LocalSettings.php</code>文件,其中包含了您所有的配置。\n\n您需要下载该文件,并将其放在您wiki的根目录(index.php的同级目录)中。稍后下载将自动开始。\n\n如果浏览器没有提示您下载,或者您取消了下载,您可以点击下面的链接重新开始下载:\n\n$3\n\n'''注意''':如果您现在不完成本步骤,而是没有下载便退出了安装过程,此后您将无法获得自动生成的配置文件。\n\n当本步骤完成后,您可以 '''[$2 进入您的wiki]'''。",
     "config-download-localsettings": "下载<code>LocalSettings.php</code>",
     "config-help": "帮助",
     "config-nofile": "找不到文件“$1”。它是否已被删除?",
+    "config-extension-link": "您是否知道您的wiki支持[//www.mediawiki.org/wiki/Manual:Extensions 拓展]?\n\n您可浏览[//www.mediawiki.org/wiki/Category:Extensions_by_category 拓展分类]或[//www.mediawiki.org/wiki/Extension_Matrix 拓展矩阵]以查找完整的拓展列表。",
     "mainpagetext": "'''已成功安装MediaWiki。'''",
     "mainpagedocfooter": "请查阅[//meta.wikimedia.org/wiki/Help:Contents 用户指南]以获取使用本wiki软件的信息!\n\n== 入门 ==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings MediaWiki配置设置列表]\n* [//www.mediawiki.org/wiki/Manual:FAQ/zh-hans MediaWiki常见问题]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki发布邮件列表]\n* [//www.mediawiki.org/wiki/Localisation#Translation_resources 本地化MediaWiki到您的语言]"
-}
\ No newline at end of file
+}
index 355e807..f43046e 100644 (file)
@@ -7,10 +7,11 @@
             "Liangent",
             "Mark85296341",
             "Simon Shek",
-            "아라"
+            "아라",
+            "Liuxinyu970226"
         ]
     },
-    "config-desc": "MediaWikiå®\89è£\9dç¨\8båº\8f",
+    "config-desc": "MediaWikiå®\89è£\9dç¨\8bå¼\8f",
     "config-title": "MediaWiki $1配置",
     "config-information": "資訊",
     "config-localsettings-upgrade": "已檢測到<code>LocalSettings.php</code>文件。要升級該配置,請在下面的框中輸入<code>$wgUpgradeKey</code>的值。您可以在<code>LocalSettings.php</code>中找到它。",
     "config-localsettings-key": "升級密鑰:",
     "config-localsettings-badkey": "您提供的密鑰不正確。",
     "config-upgrade-key-missing": "檢測到MediaWiki的配置已經存在。若要升級該配置,請將下面一行文本添加到<code>LocalSettings.php</code>的底部:\n\n$1",
-    "config-localsettings-incomplete": "當前的<code>LocalSettings.php</code>可能並不完整,因為變量$1沒有設置。請在<code>LocalSettings.php</code>設置該變量,並單擊“{{int:Config-continue}}”。",
+    "config-localsettings-incomplete": "當前的<code>LocalSettings.php</code>可能並不完整,因為變量$1沒有設置。請在<code>LocalSettings.php</code>設置該變量,並單擊「{{int:Config-continue}}」。",
     "config-localsettings-connection-error": "在使用<code>LocalSettings.php</code>或<code>AdminSettings.php</code>中指定的設置連接數據庫時發生錯誤。請修復相應設置並重試。\n\n$1",
     "config-session-error": "啟動會話出錯:$1",
     "config-session-expired": "您的會話數據可能已經過期,當前會話的使用期限被設定為$1。您可以在php.ini中設置<code>session.gc_maxlifetime</code>來延長此期限,並重新啟動本配置程序。",
     "config-no-session": "您的會話數據丟失了!請檢查php.ini並確保<code>session.save_path</code>被設置為適當的目錄。",
     "config-your-language": "您的語言:",
     "config-your-language-help": "選擇一個要使用的語言在安裝過程中。",
-    "config-wiki-language": "Wiki 語言:",
+    "config-wiki-language": "Wiki語言:",
     "config-wiki-language-help": "選擇將要安裝的wiki在多數情況下使用的語言。",
     "config-back": "←返回",
     "config-continue": "繼續→",
     "config-page-language": "語言",
-    "config-page-welcome": "歡迎您來到 MediaWiki!",
-    "config-page-dbconnect": "連接到資料庫",
+    "config-page-welcome": "歡迎您來到MediaWiki!",
+    "config-page-dbconnect": "連接到數據庫",
     "config-page-upgrade": "升級現有的安裝",
-    "config-page-dbsettings": "資料庫設定",
+    "config-page-dbsettings": "數據庫設定",
     "config-page-name": "名稱",
     "config-page-options": "選項",
     "config-page-install": "安裝",
     "config-restart": "是的,重新啟動",
     "config-welcome": "=== 環境檢查 ===\n對當前環境是否適合安裝MediaWiki作基本的檢查。如果您在安裝過程中需要幫助,請提供這些檢查的結果。",
     "config-copyright": "=== 版權和條款 ===\n\n$1\n\n本程序為自由軟件;您可依據自由軟件基金會所發表的GNU通用公共授權條款規定,就本程序再為發布與/或修改;無論您依據的是本授權的第二版或(您自行選擇的)任一日後發行的版本。\n\n本程序是基於使用目的而加以發布,然而'''不負任何擔保責任''';亦無對'''適售性'''或'''特定目的適用性'''所為的默示性擔保。詳情請參照GNU通用公共授權。\n\n您應已收到附隨於本程序的<doclink href=\"Copying\">GNU通用公共授權的副本</doclink>;如果沒有,請寫信至自由軟件基金會:59 Temple Place - Suite 330, Boston, Ma 02111-1307, USA,或[http://www.gnu.org/copyleft/gpl.html 在線閱讀]。",
-    "config-sidebar": "* [//www.mediawiki.org/wiki/MediaWiki/zh-hans MediaWiki首頁]\n* [//www.mediawiki.org/wiki/Help:Contents/zh-hans 用戶指南]\n* [//www.mediawiki.org/wiki/Manual:Contents 管理員指南]\n* [//www.mediawiki.org/wiki/Manual:FAQ/zh-hans 常見問題解答]\n----\n* <doclink href=Readme>自述文件</doclink>\n* <doclink href=ReleaseNotes>發行說明</doclink>\n* <doclink href=Copying>協議副本</doclink>\n* <doclink href=UpgradeDoc>升級</doclink>",
+    "config-sidebar": "* [www.mediawiki.org/wiki/MediaWiki/zh-hant MediaWiki首頁]\n* [www.mediawiki.org/wiki/Help:Contents/zh 用戶指南]\n* [//www.mediawiki.org/wiki/Manual:Contents/zh 管理員指南]\n* [//www.mediawiki.org/wiki/Manual:FAQ/zh-hant 常見問題解答]\n----\n* <doclink href=Readme>自述文件</doclink>\n* <doclink href=ReleaseNotes>發行說明</doclink>\n* <doclink href=Copying>協議副本</doclink>\n* <doclink href=UpgradeDoc>升級</doclink>",
     "config-env-good": "環境檢查已經完成。您可以安裝MediaWiki。",
     "config-env-bad": "環境檢查已經完成。您不能安裝MediaWiki。",
-    "config-env-php": "PHP $1 已安裝。",
-    "config-env-php-toolow": "已安裝 PHP $1;但是,MediaWiki 需要 PHP $2 或更高版本。",
+    "config-env-php": "PHP $1已安裝。",
+    "config-env-php-toolow": "已安裝PHP $1;然而,MediaWiki要求PHP $2或更高版本。",
     "config-unicode-using-utf8": "將使用 Brion Vibber 的 utf8_normalize.so 以實作 Unicode 正規化。",
     "config-unicode-using-intl": "將使用 [http://pecl.php.net/intl intl PECL 延伸函式庫]以實作 Unicode 正規化。",
-    "config-unicode-pure-php-warning": "'''警告:'''因為尚未安裝 [http://pecl.php.net/intl intl PECL 延伸函式庫]以處理 Unicode 正規化,故只能退而採用較慢的純 PHP 實作。如果您運行着一個高流量的網站,請參閱 [//www.mediawiki.org/wiki/Unicode_normalization_considerations Unicode 正規化]一文。",
+    "config-unicode-pure-php-warning": "<strong>警告:</strong>因為尚未安裝[http://pecl.php.net/intl intl PECL延伸函式庫]以處理Unicode正規化,故只能退而採用較慢的純PHP實作。如果您運行着一個高流量的網站,您應當閱讀[//www.mediawiki.org/wiki/Unicode_normalization_considerations/zh Unicode正規化]一文。",
     "config-unicode-update-warning": "'''警告''':Unicode正常化封裝器的已安裝版本使用了舊版本的[http://site.icu-project.org/ ICU項目]庫。如果您需要使用Unicode,請將其[//www.mediawiki.org/wiki/Unicode_normalization_considerations 升級]。",
-    "config-no-db": "找不到合適的數據庫驅動!您需要為PHP安裝數據庫驅動。目前支持以下數據庫:$1。\n\n如果您正在使用共享主機,請向您的主機提供商申請安裝合適的數據庫驅動。如果您通過自行編譯安裝的PHP,請對其進行重新配置以啟用數據庫客戶端,例如使用<code>./configure --with-mysql</code>。如果您通過Debian或Ubuntu包安裝的PHP,您還需要安裝php5-mysql模塊。",
+    "config-no-db": "找不到合適的數據庫驅動!您需要為PHP安裝數據庫驅動。目前支持以下數據庫:$1。\n\n如果您通過自行編譯安裝的PHP,請對其進行重新配置以啟用數據庫客戶端,例如使用<code>./configure --with-mysqli</code>。如果您通過Debian或Ubuntu包安裝PHP,您仍需安裝諸如<code>php5-mysql</code>等模塊。",
     "config-outdated-sqlite": "'''警告''':您已安裝SQLite $1,但是它的版本低於最低要求版本$2。因此您無法選擇SQLite。",
     "config-no-fts3": "'''警告''':已編譯的SQLite不包含[//sqlite.org/fts3.html FTS3模塊],後台搜索功能將不可用。",
-    "config-register-globals": "'''警告:PHP的<code>[http://php.net/register_globals register_globals]</code>選項被啟用。請盡量禁用該功能,'''雖然不會影響MediaWiki的運行,但您的服務器會被暴露給潛在的安全漏洞。",
+    "config-register-globals": "'''警告:PHP的<code>[http://php.net/register_globals register_globals]</code>選項被啟用。'''\n'''如果可以請將之禁用。'''\nMediaWiki仍將運行,但您的服務器會被暴露給潛在的安全漏洞。",
     "config-magic-quotes-runtime": "'''致命錯誤:[http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-runtime magic_quotes_runtime]被啟用!'''\n此選項會無法預測地破壞輸入的數據,請將其禁用,否則您將不能安裝或使用MediaWiki。",
     "config-magic-quotes-sybase": "'''致命錯誤:[http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-runtime magic_quotes_sybase]被啟用!'''\n此選項會無法預測地破壞輸入的數據,請將其禁用,否則您將不能安裝或使用MediaWiki。",
     "config-mbstring": "'''致命錯誤:[http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload]被啟用!'''\n此選項會導致錯誤並不可預測地破壞數據,請將其禁用,否則您將不能安裝或使用MediaWiki。",
-    "config-ze1": "'''致命錯誤:[http://www.php.net/manual/en/ini.core.php zend.ze1_compatibility_mode]被啟用!'''\n此選項將導致MediaWiki出現極其嚴重的故障,請將其禁用,否則您將不能安裝或使用MediaWiki。",
     "config-safe-mode": "'''警告:'''PHP的[http://www.php.net/features.safe-mode 安全模式]已啟用。它可能會導致一些問題,尤其在對文件上傳和數學公式<code>math</code>的支持方面。",
     "config-xml-bad": "缺少PHP的XML模塊。MediaWiki需要使用該模塊提供的函數,在當前配置下將無法工作。如果您正在使用Mandrake Linux,請安裝php-xml包。",
-    "config-pcre": "可能缺少PCRE的支持模塊。MediaWiki的運行需要兼容於Perl的正則表達式函數。",
     "config-pcre-no-utf8": "'''致命錯誤''':PHP的PCRE模塊在編譯時可能沒有包含PCRE_UTF8支持。MediaWiki需要UTF-8支持才能正常工作。",
     "config-memory-raised": "PHP的內存使用上限<code>memory_limit</code>為$1,自動提升到$2。",
     "config-memory-bad": "'''警告:'''PHP的內存使用上限<code>memory_limit</code>為$1。該設定可能過低,並導致安裝失敗!",
     "config-ctype": "'''毀滅性錯誤''':PHP必須有[http://www.php.net/manual/en/ctype.installation.php Ctype 擴展]來支持編譯。",
+    "config-json": "'''致命錯誤:'''PHP編譯程式並無法支援JSON。於MediaWiki繼續安裝之前您必須安裝PHP JSON拓展或[http://pecl.php.net/package/jsonc PECL jsonc]拓展。\n* PHP拓展包含於紅帽Linux(CentOS)5版至6版,這些用戶必須於<code>/etc/php.ini</code>或<code>/etc/php.d/json.ini</code>啟用之。\n* 部分於2013年5月后發佈Linux缺少PHP拓展,於PECL<code>php5-json</code>或<code>php-pecl-jsonc</code>拓展安裝后即可啟用。",
     "config-xcache": "[http://xcache.lighttpd.net/ XCache]已安裝",
     "config-apc": "[http://www.php.net/apc APC]已安裝",
     "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache]已安裝",
-    "config-no-cache": "'''警告:'''找不到[http://www.php.net/apc APC]、[http://xcache.lighttpd.net/ XCache]或[http://www.iis.net/download/WinCacheForPhp WinCache],無法啟用對象緩存。\nObject caching is not enabled.",
+    "config-no-cache": "'''警告:'''找不到[http://www.php.net/apc APC]、[http://xcache.lighttpd.net/ XCache]或[http://www.iis.net/download/WinCacheForPhp WinCache],無法啟用對象緩存。計劃緩存未啟用。",
     "config-mod-security": "'''警告''':您的服務器已啟動[http://modsecurity.org/ mod_security]。若其配置錯誤, 會導致MediaWiki和其他軟件的錯誤並允許用戶任意發布內容。如果您遇到任何錯誤,請查閱[http://modsecurity.org/documentation/ mod_security文檔]或聯繫您的客服。",
     "config-diff3-bad": "找不到GNU diff3。",
     "config-git": "發現Git版本控制軟件:<code>$1</code>。",
     "config-gd": "已找到內建的GD圖形庫。如果你啟用了上傳功能,縮略圖功能也將被啟用。",
     "config-no-scaling": "找不到GD庫或ImageMagick。縮略圖功能將不可用。",
     "config-no-uri": "'''錯誤:'''無法確定當前的URI。安裝已中斷。",
-    "config-no-cli-uri": "'''警告''':未指定--scriptpath參數,使用默認值:<code>$1</code>。",
-    "config-using-server": "使用服務器名“<nowiki>$1</nowiki>”。",
-    "config-using-uri": "使用服務器URL“<nowiki>$1$2</nowiki>”。",
+    "config-no-cli-uri": "'''警告''':未指定<code>--scriptpath</code>參數,使用默認值:<code>$1</code>。",
+    "config-using-server": "使用伺服器名「<nowiki>$1</nowiki>」。",
+    "config-using-uri": "使用伺服器名「<nowiki>$1$2</nowiki>」。",
     "config-uploads-not-safe": "'''警告:'''您的默認上傳目錄<code>$1</code>存在允許執行任意腳本的漏洞。儘管MediaWiki會對所有已上傳的文件進行安全檢查,但我們仍然強烈建議您在啟用上傳功能前[//www.mediawiki.org/wiki/Manual:Security#Upload_security 關閉該安全漏洞]。",
     "config-no-cli-uploads-check": "'''警告''':在CLI安裝過程中,沒有對您的默認上傳目錄(<code>$1</code>)進行執行任意腳本的漏洞檢查。",
     "config-brokenlibxml": "您的系統安裝的PHP和libxml2版本組合存在故障,並可能在MediaWiki和其他web應用程序中造成隱藏的數據損壞。請將PHP升級到5.2.9或以上,libxml2升級到2.7.3或以上([//bugs.php.net/bug.php?id=45996 PHP的故障報告])。安裝已中斷。",
-    "config-using531": "由於函數<code>__call()</code>的引用參數存在故障,PHP $1和MediaWiki無法兼容。請升級到PHP 5.3.2或更高版本,或降級到PHP 5.3.0以修復該問題。安裝已中斷。",
     "config-suhosin-max-value-length": "Suhosin已經安裝並將GET請求的參數長度限制在$1字節。MediaWiki的ResourceLoader部件可以在此限制下正常工作,但其性能會被降低。如果可能,請在<code>php.ini</code>中將<code>suhosin.get.max_value_length</code>設為1024或更高值,並在LocalSettings.php中將<code>$wgResourceLoaderMaxQueryLength</code>設為同一值。",
     "config-db-type": "資料庫類型:",
     "config-db-host": "資料庫主機:",
     "config-sqlite-dir-help": "SQLite會將所有的數據存儲於單一文件中。\n\n您所提供的目錄必須在安裝過程中對網頁服務器可寫。\n\n該目錄'''不應'''允許通過web訪問,因此我們不會將數據文件和PHP文件放在一起。\n\n安裝程序在創建數據文件時,亦會在相同目錄下創建<code>.htaccess</code>以控制權限。假若此等控制失效,則可能會將您的數據文件暴露於公共空間,讓他人可以獲取用戶數據(電子郵件地址、雜湊後的密碼)、被刪除的版本以及其他在wiki上被限制訪問的數據。\n\n請考慮將數據庫統一放置在某處,如<code>/var/lib/mediawiki/yourwiki</code>下。",
     "config-oracle-def-ts": "默認表空間:",
     "config-oracle-temp-ts": "臨時表空間:",
+    "config-type-mysql": "MySQL(或兼容程式)",
     "config-support-info": "MediaWiki支持以下數據庫系統:\n\n$1\n\n如果您在下面列出的數據庫系統中沒有找到您希望使用的系統,請根據上方鏈向的指引啟用支持。",
-    "config-support-mysql": "* $1是MediaWiki的首選數據庫,對它的支持最為完備([http://www.php.net/manual/en/mysql.installation.php 如何將對MySQL的支持編譯進PHP中])",
-    "config-support-postgres": "* $1是一種流行的開源數據庫系統,可作為MySQL的替代([http://www.php.net/manual/en/pgsql.installation.php 如何將對PostgreSQL的支持編譯進PHP中])。本程序中可能依然存在一些小而明顯的錯誤,因此並不建議在生產環境中使用該數據庫系統。",
-    "config-support-sqlite": "* $1是一種輕量級的數據庫系統,能被良好地支持。([http://www.php.net/manual/en/pdo.installation.php 如何將對SQLite的支持編譯進PHP中],須使用PDO)",
-    "config-support-oracle": "* $1是一種商用企業級的數據庫。([http://www.php.net/manual/en/oci8.installation.php 如何將對OCI8的支持編譯進PHP中])",
+    "config-dbsupport-mysql": "* [{{int:version-db-mysql-url}} MySQL]是用於MediaWiki的主要目標和最佳支援。MediaWiki也可工作於[{{int:version-db-mariadb-url}} MariaDB]和[{{int:version-db-percona-url}} Percona伺服器],當然是兼容MySQL的程式。([http://www.php.net/manual/en/mysqli.installation.php 如何編譯帶MySQL支援之PHP])",
+    "config-dbsupport-postgres": "* [{{int:version-db-postgres-url}} PostgreSQL]是一種流行的開源數據庫系統,可作為MySQL的替代([http://www.php.net/manual/en/pgsql.installation.php 如何將對PostgreSQL的支持編譯進PHP中])。本程序中可能依然存在一些小而明顯的錯誤,因此並不建議在生產環境中使用該數據庫系統。",
+    "config-dbsupport-sqlite": "* [{{int:version-db-sqlite-url}} SQLite]是一種輕量級的數據庫系統,能被良好地支持。([http://www.php.net/manual/en/pdo.installation.php 如何將對SQLite的支持編譯進PHP中],須使用PDO)",
+    "config-dbsupport-oracle": "* [{{int:version-db-oracle-url}} Oracle]是一種商用企業級的數據庫。([http://www.php.net/manual/en/oci8.installation.php 如何將對OCI8的支持編譯進PHP中])",
+    "config-dbsupport-mssql": "* [{{int:version-db-mssql-url}} Microsoft SQL Server]是一種用於商業企業的資料庫。([http://www.php.net/manual/en/sqlsrv.installation.php 如何編譯帶SQLSRV支援之PHP])",
     "config-header-mysql": "MySQL 的設定",
     "config-header-postgres": "PostgreSQL設置",
     "config-header-sqlite": "SQLite 的設定",
     "config-db-sys-user-exists-oracle": "用戶帳戶“$1”已經存在。SYSDBA僅可用於創建新帳戶!",
     "config-postgres-old": "需要PostgreSQL $1或更新的版本,您的版本為$2。",
     "config-sqlite-name-help": "請為您的wiki指定一個用於標識的名稱。請勿使用空格或連字號,該名稱將被用作SQLite的數據文件名。",
-    "config-sqlite-parent-unwritable-group": "由於父目錄<code><nowiki>$2</nowiki></code>對網頁服務器不可寫,無法創建數據目錄<code><nowiki>$1</nowiki></code>。\n\n安裝程序已確定您網頁服務器所使用的用戶。請將<code><nowiki>$3</nowiki></code>目錄設為對該用戶可寫以繼續安裝過程。在Unix/Linux系統中,您可以逐行輸入下列命令:\n\n<pre>cd $2\nmkdir $3\nchgrp $4 $3\nchmod g+w $3</pre>",
+    "config-sqlite-parent-unwritable-group": "由於父目錄<code><nowiki>$2</nowiki></code>對網頁服務器不可寫,無法創建數據目錄<code><nowiki>$1</nowiki></code>。\n\n安裝程序已確定您網頁伺服器所使用的用戶。請將<code><nowiki>$3</nowiki></code>目錄設為對該用戶可寫以繼續安裝過程。在Unix/Linux系統中,您可以逐行輸入下列命令:\n\n<pre>cd $2\nmkdir $3\nchgrp $4 $3\nchmod g+w $3</pre>",
     "config-sqlite-parent-unwritable-nogroup": "由於父目錄<code><nowiki>$2</nowiki></code>對網頁服務器不可寫,無法創建數據目錄<code><nowiki>$1</nowiki></code>。\n\n安裝程序無法確定您網頁服務器所使用的用戶。請將<code><nowiki>$3</nowiki></code>目錄設為全局可寫(對所有用戶)以繼續安裝過程。在Unix/Linux系統中,您可以逐行輸入下列命令:\n\n<pre>cd $2\nmkdir $3\nchmod a+w $3</pre>",
     "config-sqlite-mkdir-error": "創建數據目錄“$1”時發生錯誤。請檢查路徑後重試。",
     "config-sqlite-dir-unwritable": "無法寫入目錄“$1”。請修改該目錄的權限,使其對網頁服務器可寫後重試。",
     "config-mysql-innodb": "InnoDB",
     "config-mysql-myisam": "MyISAM",
     "config-mysql-myisam-dep": "'''警告''':您選擇了MyISAM作為MySQL的存儲引擎,MediaWiki並不推薦您這麼做,因為:\n* 它僅能通過表鎖定來勉強支持並發\n* 與其他引擎相比,它更容易被損壞\n* MediaWiki代碼庫並不總會去處理MyISAM\n\n如果您的MySQL程序支持InnoDB,我們高度推薦您使用該引擎替代MyISAM。\n如果您的MySQL程序不支持InnoDB,請考慮升級。",
+    "config-mysql-only-myisam-dep": "'''警告''':MyISAM貌似於此伺服器為唯一可用存儲程式,MediaWiki並不推薦您這麼做,因為:\n* 它僅能通過表鎖定來勉強支持並發\n* 與其他引擎相比,它更容易被損壞\n* MediaWiki代碼庫並不總會去處理MyISAM\n\n您的MySQL安裝程式無法支援InnoDB,可能您需要升級或更換一台伺服器。",
     "config-mysql-engine-help": "'''InnoDB'''通常是最佳選項,因為它對並發操作有着良好的支持。\n\n'''MyISAM'''在單用戶或只讀環境下可能會有更快的性能表現。但MyISAM數據庫出錯的概率一般要大於InnoDB數據庫。",
     "config-mysql-charset": "資料庫字符集:",
     "config-mysql-binary": "二進制",
     "config-ns-invalid": "指定的名字空間“<nowiki>$1</nowiki>”無效,請為項目名字空間指定其他名稱。",
     "config-ns-conflict": "指定的名字空間“<nowiki>$1</nowiki>”與默認的MediaWiki名字空間衝突。請指定一個不同的項目名字空間。",
     "config-admin-box": "管理員帳號",
-    "config-admin-name": "您的名字:",
+    "config-admin-name": "您的用戶名:",
     "config-admin-password": "密碼:",
     "config-admin-password-confirm": "再次輸入密碼:",
     "config-admin-help": "在此輸入您想使用的用戶名,例如“喬幫主”。您將使用該名稱登錄本wiki。",
     "config-admin-name-blank": "輸入管理員的使用者名稱。",
     "config-admin-name-invalid": "指定的用戶名“<nowiki>$1</nowiki>”無效,請指定其他用戶名。",
     "config-admin-password-blank": "輸入管理員帳號密碼。",
-    "config-admin-password-same": "密碼不能與使用者名稱相同。",
     "config-admin-password-mismatch": "兩次輸入的密碼並不相同。",
     "config-admin-email": "電郵地址:",
     "config-admin-email-help": "輸入電子郵件地址後,您可以收到此wiki上其他用戶發來的電子郵件,並能重置您的密碼,還可在監視列表中頁面被更改時收到郵件通知。您可以將此字段留空。",
     "config-profile-no-anon": "需要註冊帳號",
     "config-profile-fishbowl": "編輯受限",
     "config-profile-private": "非公開wiki",
-    "config-profile-help": "如果您允許盡量多的人編寫wiki,網站上的內容會更加豐富。在MediaWiki中,您可以輕鬆地審查最近更改,並輕易回退掉新手或破壞者造成的損害。\n\n然而,許多人覺得讓MediaWiki存在多種角色將更加好用;同時,要說服所有人都願以wiki的方式作貢獻並非一件易事。因此,您可以有以下選擇:\n\n'''{{int:config-profile-wiki}}'''允許包括未登錄用戶在內的所有人編輯。'''{{int:config-profile-no-anon}}'''的wiki需要額外的註冊流程,這有可能會阻礙隨意貢獻者。\n\n'''{{int:config-profile-fishbowl}}'''模式只允許獲批准的用戶編輯,但對公眾開放頁面瀏覽(包括歷史記錄)。'''{{int:config-profile-private}}'''則只允許獲批准的用戶瀏覽、編輯頁面。\n\n安裝完成後,您還可以對用戶權限進行更多、更複雜的配置,參見[//www.mediawiki.org/wiki/Manual:User_rights 相關的使用手冊]。",
+    "config-profile-help": "如果您允許盡量多的人編寫維基,網站上的內容會更加豐富。在MediaWiki中,您可以輕鬆地審查最近更改,並輕易回退掉新手或破壞者造成的損害。\n\n然而,許多人覺得讓MediaWiki存在多種角色將更加好用;同時,要說服所有人都願以維基方式作貢獻並非一件易事。因此,您有以下選擇:\n\n'''{{int:config-profile-wiki}}'''允許包括未登錄用戶在內的所有人編輯。'''{{int:config-profile-no-anon}}'''的維基需要額外的註冊流程,這有可能會阻礙隨意貢獻者。\n\n'''{{int:config-profile-fishbowl}}'''模式只允許獲批准的用戶編輯,但對公眾開放頁面瀏覽(包括歷史記錄)。'''{{int:config-profile-private}}'''則只允許獲批准的用戶瀏覽、編輯頁面。\n\n安裝完成後,您還可以對用戶權限進行更多、更複雜的配置,參見[//www.mediawiki.org/wiki/Manual:User_rights 相關的使用手冊]。",
     "config-license": "版權和許可證:",
     "config-license-none": "頁腳無許可證",
     "config-license-cc-by-sa": "知識共享署名-相同方式分享",
     "config-upload-deleted": "已刪除文件的目錄:",
     "config-upload-deleted-help": "指定用於存放被刪除文件的目錄。理想情況下,該目錄不應能通過web訪問。",
     "config-logo": "標誌URL:",
-    "config-logo-help": "在MediaWiki的默認外觀中,左側欄菜單之上有一塊135x160像素的標誌區。請上傳一幅相應大小的圖像,並在此輸入URL。\n\n如果您不希望使用標誌,請將本處留空。",
+    "config-logo-help": "在MediaWiki的默認外觀中,左側欄菜單之上有一塊135x160像素的標誌區。請上傳一幅相應大小的圖像,並在此輸入URL。\n\n你可以用<code>$wgStylePath</code>或<code>$wgScriptPath</code>來表示相對於這些位置的路徑。\n\n如果您不希望使用標誌,請將本處留空。",
     "config-instantcommons": "啟用即時共享資源",
     "config-instantcommons-help": "[//www.mediawiki.org/wiki/InstantCommons 即時共享資源]可以讓wiki使用來自[//commons.wikimedia.org/ 維基共享資源]網站的圖像、音頻和其他媒體文件。要啟用該功能,MediaWiki必須能夠訪問互聯網。\n\n有關此功能的詳細信息,包括如何將其他wiki網站設為具有類似共享功能的方法,請參考[//mediawiki.org/wiki/Manual:$wgForeignFileRepos 手冊]。",
     "config-cc-error": "知識共享許可證挑選器無法找到結果,請手動輸入許可證的名稱。",
     "config-extensions": "擴充套件",
     "config-extensions-help": "已在您的<code>./extensions</code>目錄中發現下列擴展。\n\n您可能要對它們進行額外的配置,但您現在可以啟用它們。",
     "config-install-alreadydone": "'''警告:'''您似乎已經安裝了MediaWiki,並試圖重新安裝它。請前往下一個頁面。",
-    "config-install-begin": "點擊“{{int:config-continue}}”後,您將開始安裝MediaWiki。如果您還想對配置作一些修改,請點擊後退。",
+    "config-install-begin": "點擊「{{int:config-continue}}」後,您將開始安裝MediaWiki。如果您還想對配置作一些修改,請點擊「{{int:config-back}}」。",
     "config-install-step-done": "完成",
     "config-install-step-failed": "失敗",
     "config-install-extensions": "正在啟用擴展",
     "config-install-interwiki-exists": "'''警告''':跨wiki數據表似乎已有內容,跳過默認列表。",
     "config-install-stats": "初始化統計",
     "config-install-keys": "生成密鑰中",
-    "config-insecure-keys": "'''警告''':在安裝過程中生成的{{PLURAL:$2|安全密鑰|安全密鑰}}($1){{PLURAL:$2|並|並}}不一定安全。請考慮手動更改{{PLURAL:$2|它|它們}}。",
+    "config-insecure-keys": "'''警告''':在安裝過程中生成的$2個安全密鑰($1)不一定安全。請考慮手動更改之。",
     "config-install-sysop": "正在創建管理員用戶帳號",
     "config-install-subscribe-fail": "無法訂閱mediawiki-announce:$1",
     "config-install-subscribe-notpossible": "沒有安裝cURL,allow_url_fopen也不可用。",
     "config-install-done": "'''恭喜!'''\n您已經成功地安裝了MediaWiki。\n\n安裝程序已經生成了<code>LocalSettings.php</code>文件,其中包含了您所有的配置。\n\n您需要下載該文件,並將其放在您wiki的根目錄(index.php的同級目錄)中。稍後下載將自動開始。\n\n如果瀏覽器沒有提示您下載,或者您取消了下載,您可以點擊下面的鏈接重新開始下載:\n\n$3\n\n'''注意''':如果您現在不完成本步驟,而是沒有下載便退出了安裝過程,此後您將無法獲得自動生成的配置文件。\n\n當本步驟完成後,您可以 '''[$2 進入您的wiki]'''。",
     "config-download-localsettings": "下載<code>LocalSettings.php</code>",
     "config-help": "說明",
+    "config-nofile": "檔案「$1」無法找尋。難道它被刪除?",
+    "config-extension-link": "您是否了解您的wiki支援[//www.mediawiki.org/wiki/Manual:Extensions 拓展]?您可瀏覽[//www.mediawiki.org/wiki/Category:Extensions_by_category 包含所有拓展的分類]或[//www.mediawiki.org/wiki/Extension_Matrix 拓展矩陣]以顯示拓展的完整列表。",
     "mainpagetext": "'''已成功安裝MediaWiki。'''",
     "mainpagedocfooter": "請參閱[//meta.wikimedia.org/wiki/Help:Contents 用戶手冊]以獲得使用此wiki軟體的訊息!\n\n== 入門 ==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings MediaWiki配置設定清單]\n* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki常見問題解答]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki發佈郵件清單]\n* [//www.mediawiki.org/wiki/Localisation#Translation_resources MediaWiki界面本地化]"
-}
\ No newline at end of file
+}
index e8ed310..36880f4 100644 (file)
@@ -5,4 +5,4 @@
         ]
     },
     "mainpagedocfooter": "請參閱[//meta.wikimedia.org/wiki/Help:Contents 用戶手冊]以獲得使用此 wiki 軟件的訊息!\n\n== 入門 ==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings MediaWiki 配置設定清單]\n* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki 常見問題解答]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki 發佈郵件清單]"
-}
\ No newline at end of file
+}
index 881001d..3926c3b 100644 (file)
@@ -1,6 +1,4 @@
 {
-    "@metadata": {
-        "authors": []
-    },
+    "@metadata": [],
     "mainpagedocfooter": "請參閱 [//meta.wikimedia.org/wiki/Help:Contents 使用者手冊] 以獲得使用此 wiki 軟體的訊息!\n\n== 入門 ==\n\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings MediaWiki 配置設定清單]\n* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki 常見問題解答]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki 發佈郵件清單]"
-}
\ No newline at end of file
+}
index a537861..2d7103c 100644 (file)
@@ -376,7 +376,7 @@ abstract class JobQueue {
                // Flag this job as an old duplicate based on its "root" job...
                try {
                        if ( $job && $this->isRootJobOldDuplicate( $job ) ) {
-                               JobQueue::incrStats( 'job-pop-duplicate', $this->type );
+                               JobQueue::incrStats( 'job-pop-duplicate', $this->type, 1, $this->wiki );
                                $job = DuplicateJob::newFromJob( $job ); // convert to a no-op
                        }
                } catch ( MWException $e ) {
@@ -715,11 +715,15 @@ abstract class JobQueue {
         * @param string $key Event type
         * @param string $type Job type
         * @param int $delta
+        * @param string $wiki Wiki ID (added in 1.23)
         * @since 1.22
         */
-       public static function incrStats( $key, $type, $delta = 1 ) {
+       public static function incrStats( $key, $type, $delta = 1, $wiki = null ) {
                wfIncrStats( $key, $delta );
                wfIncrStats( "{$key}-{$type}", $delta );
+               if ( $wiki !== null ) {
+                       wfIncrStats( "{$key}-{$type}-{$wiki}", $delta );
+               }
        }
 
        /**
index e83c26d..5f1ca14 100644 (file)
@@ -258,11 +258,12 @@ class JobQueueDB extends JobQueue {
                        foreach ( array_chunk( $rows, 50 ) as $rowBatch ) {
                                $dbw->insert( 'job', $rowBatch, $method );
                        }
-                       JobQueue::incrStats( 'job-insert', $this->type, count( $rows ) );
+                       JobQueue::incrStats( 'job-insert', $this->type, count( $rows ), $this->wiki );
                        JobQueue::incrStats(
                                'job-insert-duplicate',
                                $this->type,
-                               count( $rowSet ) + count( $rowList ) - count( $rows )
+                               count( $rowSet ) + count( $rowList ) - count( $rows ),
+                               $this->wiki
                        );
                } catch ( DBError $e ) {
                        if ( $flags & self::QOS_ATOMIC ) {
@@ -313,7 +314,7 @@ class JobQueueDB extends JobQueue {
                                        $this->cache->set( $this->getCacheKey( 'empty' ), 'true', self::CACHE_TTL_LONG );
                                        break; // nothing to do
                                }
-                               JobQueue::incrStats( 'job-pop', $this->type );
+                               JobQueue::incrStats( 'job-pop', $this->type, 1, $this->wiki );
                                // Get the job object from the row...
                                $title = Title::makeTitleSafe( $row->job_namespace, $row->job_title );
                                if ( !$title ) {
@@ -684,8 +685,9 @@ class JobQueueDB extends JobQueue {
                                                        'job_id' => $ids ),
                                                __METHOD__
                                        );
-                                       $count += $dbw->affectedRows();
-                                       JobQueue::incrStats( 'job-recycle', $this->type, $dbw->affectedRows() );
+                                       $affected = $dbw->affectedRows();
+                                       $count += $affected;
+                                       JobQueue::incrStats( 'job-recycle', $this->type, $affected, $this->wiki );
                                        $this->cache->set( $this->getCacheKey( 'empty' ), 'false', self::CACHE_TTL_LONG );
                                }
                        }
@@ -710,8 +712,9 @@ class JobQueueDB extends JobQueue {
                        );
                        if ( count( $ids ) ) {
                                $dbw->delete( 'job', array( 'job_id' => $ids ), __METHOD__ );
-                               $count += $dbw->affectedRows();
-                               JobQueue::incrStats( 'job-abandon', $this->type, $dbw->affectedRows() );
+                               $affected = $dbw->affectedRows();
+                               $count += $affected;
+                               JobQueue::incrStats( 'job-abandon', $this->type, $affected, $this->wiki );
                        }
 
                        $dbw->unlock( "jobqueue-recycle-{$this->type}", __METHOD__ );
index 90742ce..b1dfe14 100644 (file)
@@ -254,6 +254,31 @@ class JobQueueGroup {
                return array_diff( $this->getQueueTypes(), $wgJobTypesExcludedFromDefaultQueue );
        }
 
+       /**
+        * Check if there are any queues with jobs (this is cached)
+        *
+        * @param integer $type JobQueueGroup::TYPE_* constant
+        * @return bool
+        * @since 1.23
+        */
+       public function queuesHaveJobs( $type = self::TYPE_ANY ) {
+               global $wgMemc;
+
+               $key = wfMemcKey( 'jobqueue', 'queueshavejobs', $type );
+
+               $value = $wgMemc->get( $key );
+               if ( $value === false ) {
+                       $queues = $this->getQueuesWithJobs();
+                       if ( $type == self::TYPE_DEFAULT ) {
+                               $queues = array_intersect( $queues, $this->getDefaultQueueTypes() );
+                       }
+                       $value = count( $queues ) ? 'true' : 'false';
+                       $wgMemc->add( $key, $value, 15 );
+               }
+
+               return ( $value === 'true' );
+       }
+
        /**
         * Get the list of job types that have non-empty queues
         *
index c785cb2..135a61d 100644 (file)
@@ -237,9 +237,9 @@ class JobQueueRedis extends JobQueue {
 
                                return false;
                        }
-                       JobQueue::incrStats( 'job-insert', $this->type, count( $items ) );
+                       JobQueue::incrStats( 'job-insert', $this->type, count( $items ), $this->wiki );
                        JobQueue::incrStats( 'job-insert-duplicate', $this->type,
-                               count( $items ) - $failed - $pushed );
+                               count( $items ) - $failed - $pushed, $this->wiki );
                } catch ( RedisException $e ) {
                        $this->throwRedisException( $conn, $e );
                }
@@ -331,7 +331,7 @@ LUA;
                                        break; // no jobs; nothing to do
                                }
 
-                               JobQueue::incrStats( 'job-pop', $this->type );
+                               JobQueue::incrStats( 'job-pop', $this->type, 1, $this->wiki );
                                $item = $this->unserialize( $blob );
                                if ( $item === false ) {
                                        wfDebugLog( 'JobQueueRedis', "Could not unserialize {$this->type} job." );
@@ -715,8 +715,8 @@ LUA;
                        if ( $res ) {
                                list( $released, $abandoned, $pruned, $undelayed ) = $res;
                                $count += $released + $pruned + $undelayed;
-                               JobQueue::incrStats( 'job-recycle', $this->type, $released );
-                               JobQueue::incrStats( 'job-abandon', $this->type, $abandoned );
+                               JobQueue::incrStats( 'job-recycle', $this->type, $released, $this->wiki );
+                               JobQueue::incrStats( 'job-abandon', $this->type, $abandoned, $this->wiki );
                        }
                } catch ( RedisException $e ) {
                        $this->throwRedisException( $conn, $e );
index 19b0558..9e9bda6 100644 (file)
@@ -112,6 +112,8 @@ class AssembleUploadChunksJob extends Job {
                                )
                        );
                        $this->setLastError( get_class( $e ) . ": " . $e->getText() );
+                       // To be extra robust.
+                       MWExceptionHandler::rollbackMasterChangesAndLog( $e );
 
                        return false;
                }
index a7c5dc0..4d1e72c 100644 (file)
@@ -40,7 +40,7 @@ class HTMLCacheUpdateJob extends Job {
        }
 
        function run() {
-               global $wgUpdateRowsPerJob, $wgUpdateRowsPerQuery, $wgMaxBacklinksInvalidate;
+               global $wgUpdateRowsPerJob, $wgUpdateRowsPerQuery;
 
                static $expected = array( 'recursive', 'pages' ); // new jobs have one of these
 
@@ -57,14 +57,6 @@ class HTMLCacheUpdateJob extends Job {
 
                // Job to purge all (or a range of) backlink pages for a page
                if ( !empty( $this->params['recursive'] ) ) {
-                       // @TODO: try to use delayed jobs if possible?
-                       if ( !isset( $this->params['range'] ) && $wgMaxBacklinksInvalidate !== false ) {
-                               $numRows = $this->title->getBacklinkCache()->getNumLinks(
-                                       $this->params['table'], $wgMaxBacklinksInvalidate );
-                               if ( $numRows > $wgMaxBacklinksInvalidate ) {
-                                       return true;
-                               }
-                       }
                        // Convert this into no more than $wgUpdateRowsPerJob HTMLCacheUpdateJob per-title
                        // jobs and possibly a recursive HTMLCacheUpdateJob job for the rest of the backlinks
                        $jobs = BacklinkJobUtils::partitionBacklinkJob(
index d7667f3..918a392 100644 (file)
@@ -125,6 +125,9 @@ class PublishStashedFileJob extends Job {
                                )
                        );
                        $this->setLastError( get_class( $e ) . ": " . $e->getText() );
+                       // To prevent potential database referential integrity issues.
+                       // See bug 32551.
+                       MWExceptionHandler::rollbackMasterChangesAndLog( $e );
 
                        return false;
                }
index 83718c3..97d98a4 100644 (file)
@@ -95,11 +95,17 @@ class FormatJson {
         *       (cf. FormatJson::XMLMETA_OK). Use Xml::encodeJsVar() instead in such cases.
         *
         * @param mixed $value The value to encode. Can be any type except a resource.
-        * @param bool $pretty If true, add non-significant whitespace to improve readability.
+        * @param string|bool $pretty If a string, add non-significant whitespace to improve
+        *   readability, using that string for indentation. If true, use the default indent
+        *   string (four spaces).
         * @param int $escaping Bitfield consisting of _OK class constants
         * @return string|bool: String if successful; false upon failure
         */
        public static function encode( $value, $pretty = false, $escaping = 0 ) {
+               if ( !is_string( $pretty ) ) {
+                       $pretty = $pretty ? '    ' : false;
+               }
+
                if ( defined( 'JSON_UNESCAPED_UNICODE' ) ) {
                        return self::encode54( $value, $pretty, $escaping );
                }
@@ -125,7 +131,7 @@ class FormatJson {
         * JSON encoder wrapper for PHP >= 5.4, which supports useful encoding options.
         *
         * @param mixed $value
-        * @param bool $pretty
+        * @param string|bool $pretty
         * @param int $escaping
         * @return string|bool
         */
@@ -134,7 +140,7 @@ class FormatJson {
                // which is hardly useful when '<' and '>' are escaped (and inadequate), and such
                // escaping negatively impacts the human readability of URLs and similar strings.
                $options = JSON_UNESCAPED_SLASHES;
-               $options |= $pretty ? JSON_PRETTY_PRINT : 0;
+               $options |= $pretty !== false ? JSON_PRETTY_PRINT : 0;
                $options |= ( $escaping & self::UTF8_OK ) ? JSON_UNESCAPED_UNICODE : 0;
                $options |= ( $escaping & self::XMLMETA_OK ) ? 0 : ( JSON_HEX_TAG | JSON_HEX_AMP );
                $json = json_encode( $value, $options );
@@ -142,10 +148,22 @@ class FormatJson {
                        return false;
                }
 
-               if ( $pretty ) {
+               if ( $pretty !== false ) {
                        // Remove whitespace inside empty arrays/objects; different JSON encoders
                        // vary on this, and we want our output to be consistent across implementations.
                        $json = preg_replace( self::WS_CLEANUP_REGEX, '', $json );
+                       if ( $pretty !== '    ' ) {
+                               // Change the four-space indent to a tab indent
+                               $json = str_replace( "\n    ", "\n\t", $json );
+                               while ( strpos( $json, "\t    " ) !== false ) {
+                                       $json = str_replace( "\t    ", "\t\t", $json );
+                               }
+
+                               if ( $pretty !== "\t" ) {
+                                       // Change the tab indent to the provided indent
+                                       $json = str_replace( "\t", $pretty, $json );
+                               }
+                       }
                }
                if ( $escaping & self::UTF8_OK ) {
                        $json = str_replace( self::$badChars, self::$badCharsEscaped, $json );
@@ -159,7 +177,7 @@ class FormatJson {
         * Therefore, the missing options are implemented here purely in PHP code.
         *
         * @param mixed $value
-        * @param bool $pretty
+        * @param string|bool $pretty
         * @param int $escaping
         * @return string|bool
         */
@@ -188,8 +206,8 @@ class FormatJson {
                        $json = str_replace( self::$badChars, self::$badCharsEscaped, $json );
                }
 
-               if ( $pretty ) {
-                       return self::prettyPrint( $json );
+               if ( $pretty !== false ) {
+                       return self::prettyPrint( $json, $pretty );
                }
 
                return $json;
@@ -200,9 +218,10 @@ class FormatJson {
         * Only needed for PHP < 5.4, which lacks the JSON_PRETTY_PRINT option.
         *
         * @param string $json
+        * @param string $indentString
         * @return string
         */
-       private static function prettyPrint( $json ) {
+       private static function prettyPrint( $json, $indentString ) {
                $buf = '';
                $indent = 0;
                $json = strtr( $json, array( '\\\\' => '\\\\', '\"' => "\x01" ) );
@@ -217,11 +236,11 @@ class FormatJson {
                                        ++$indent;
                                        // falls through
                                case ',':
-                                       $buf .= $json[$i] . "\n" . str_repeat( '    ', $indent );
+                                       $buf .= $json[$i] . "\n" . str_repeat( $indentString, $indent );
                                        break;
                                case ']':
                                case '}':
-                                       $buf .= "\n" . str_repeat( '    ', --$indent ) . $json[$i];
+                                       $buf .= "\n" . str_repeat( $indentString, --$indent ) . $json[$i];
                                        break;
                                case '"':
                                        $skip = strcspn( $json, '"', $i + 1 ) + 2;
index 00cd257..340e7f4 100644 (file)
@@ -211,7 +211,8 @@ class MultiHttpClient {
                        $ch = $handles[$index];
                        curl_multi_remove_handle( $chm, $ch );
                        if ( curl_errno( $ch ) !== 0 ) {
-                               $req['error'] = "(curl error: " . curl_errno( $ch ) . ") " . curl_error( $ch );
+                               $req['response']['error'] = "(curl error: " .
+                                       curl_errno( $ch ) . ") " . curl_error( $ch );
                        }
                        // For convenience with the list() operator
                        $req['response'][0] = $req['response']['code'];
index b658ac1..8b30e9b 100644 (file)
@@ -48,13 +48,14 @@ class DeleteLogFormatter extends LogFormatter {
                $params = parent::getMessageParameters();
                $subtype = $this->entry->getSubtype();
                if ( in_array( $subtype, array( 'event', 'revision' ) ) ) {
-                       // $params[3] here is 'revision' for page revisions, 'oldimage' for
-                       // file versions, or a comma-separated list of log_ids for log
+                       // $params[3] here is 'revision' or 'archive' for page revisions, 'oldimage' or
+                       // 'filearchive' for file versions, or a comma-separated list of log_ids for log
                        // entries. $subtype here is 'revision' for page revisions and file
                        // versions, or 'event' for log entries.
                        if ( ( $subtype === 'event' && count( $params ) === 6 )
                                || ( $subtype === 'revision' && isset( $params[3] )
-                                       && ( $params[3] === 'revision' || $params[3] === 'oldimage' )
+                                       && ( $params[3] === 'revision' || $params[3] === 'oldimage'
+                                               || $params[3] === 'archive' || $params[3] === 'filearchive' )
                                )
                        ) {
                                $paramStart = $subtype === 'revision' ? 4 : 3;
@@ -63,9 +64,11 @@ class DeleteLogFormatter extends LogFormatter {
                                $new = $this->parseBitField( $params[$paramStart + 2] );
                                list( $hid, $unhid, $extra ) = RevisionDeleter::getChanges( $new, $old );
                                $changes = array();
+                               // messages used: revdelete-content-hid, revdelete-summary-hid, revdelete-uname-hid
                                foreach ( $hid as $v ) {
                                        $changes[] = $this->msg( "$v-hid" )->plain();
                                }
+                               // messages used: revdelete-content-unhid, revdelete-summary-unhid, revdelete-uname-unhid
                                foreach ( $unhid as $v ) {
                                        $changes[] = $this->msg( "$v-unhid" )->plain();
                                }
index 4f44d75..ed3a8da 100644 (file)
@@ -77,10 +77,10 @@ class LogFormatter {
        /** @var LogEntryBase */
        protected $entry;
 
-       /// Integer constant for handling log_deleted
+       /** @var Integer Constant for handling log_deleted */
        protected $audience = self::FOR_PUBLIC;
 
-       /// Whether to output user tool links
+       /** @var bool Whether to output user tool links */
        protected $linkFlood = false;
 
        /**
index 0e8d1de..2ec4f69 100644 (file)
@@ -358,10 +358,10 @@ class LogPage {
 
        /**
         * @todo Document
-        * @param  string $type
-        * @param  Language|null $lang
-        * @param  Title $title
-        * @param  array $params
+        * @param string $type
+        * @param Language|null $lang
+        * @param Title $title
+        * @param array $params
         * @return string
         */
        protected static function getTitleLink( $type, $lang, $title, &$params ) {
index e27e28a..d33fc91 100644 (file)
@@ -42,7 +42,7 @@ class LogPager extends ReverseChronologicalPager {
        /** @var string */
        private $typeCGI = '';
 
-       /** @var LogEventsList  */
+       /** @var LogEventsList */
        public $mLogEventsList;
 
        /**
index 15ec794..d296269 100644 (file)
@@ -32,7 +32,7 @@
 class BitmapHandler_ClientOnly extends BitmapHandler {
        /**
         * @param $image File
-        * @param  $params
+        * @param $params
         * @return bool
         */
        function normaliseParams( $image, &$params ) {
index 1202c9a..2aeb35d 100644 (file)
@@ -177,7 +177,33 @@ class DjVuHandler extends ImageHandler {
                        );
                }
 
-               $srcPath = $image->getLocalRefPath();
+               // Get local copy source for shell scripts
+               // Thumbnail extraction is very inefficient for large files.
+               // Provide a way to pool count limit the number of downloaders.
+               if ( $image->getSize() >= 1e7 ) { // 10MB
+                       $work = new PoolCounterWorkViaCallback( 'GetLocalFileCopy', sha1( $image->getName() ),
+                               array(
+                                       'doWork' => function() use ( $image ) {
+                                               return $image->getLocalRefPath();
+                                       }
+                               )
+                       );
+                       $srcPath = $work->execute();
+               } else {
+                       $srcPath = $image->getLocalRefPath();
+               }
+
+               if ( $srcPath === false ) { // Failed to get local copy
+                       wfDebugLog( 'thumbnail',
+                               sprintf( 'Thumbnail failed on %s: could not get local copy of "%s"',
+                                       wfHostname(), $image->getName() ) );
+
+                       return new MediaTransformError( 'thumbnail_error',
+                               $params['width'], $params['height'],
+                               wfMessage( 'filemissing' )->text()
+                       );
+               }
+
                # Use a subshell (brackets) to aggregate stderr from both pipeline commands
                # before redirecting it to the overall stdout. This works in both Linux and Windows XP.
                $cmd = '(' . wfEscapeShellArg(
@@ -230,6 +256,30 @@ class DjVuHandler extends ImageHandler {
                return $deja;
        }
 
+       /**
+        * Get metadata, unserializing it if neccessary.
+        *
+        * @param File $file The DjVu file in question
+        * @return String XML metadata as a string.
+        */
+       private function getUnserializedMetadata( File $file ) {
+               $metadata = $file->getMetadata();
+               if ( substr( $metadata, 0, 3 ) === '<?xml' ) {
+                       // Old style. Not serialized but instead just a raw string of XML.
+                       return $metadata;
+               }
+
+               wfSuppressWarnings();
+               $unser = unserialize( $metadata );
+               wfRestoreWarnings();
+               if ( is_array( $unser ) ) {
+                       return $unser['xml'];
+               }
+
+               // unserialize failed. Guess it wasn't really serialized after all,
+               return $metadata;
+       }
+
        /**
         * Cache a document tree for the DjVu XML metadata
         * @param File $image
@@ -244,7 +294,7 @@ class DjVuHandler extends ImageHandler {
                        return $image->dejaMetaTree;
                }
 
-               $metadata = $image->getMetadata();
+               $metadata = $this->getUnserializedMetadata( $image );
                if ( !$this->isMetadataValid( $image, $metadata ) ) {
                        wfDebug( "DjVu XML metadata is invalid or missing, should have been fixed in upgradeRow\n" );
 
@@ -307,7 +357,12 @@ class DjVuHandler extends ImageHandler {
        function getMetadata( $image, $path ) {
                wfDebug( "Getting DjVu metadata for $path\n" );
 
-               return $this->getDjVuImage( $image, $path )->retrieveMetaData();
+               $xml = $this->getDjVuImage( $image, $path )->retrieveMetaData();
+               if ( $xml === false ) {
+                       return false;
+               } else {
+                       return serialize( array( 'xml' => $xml ) );
+               }
        }
 
        function getMetadataType( $image ) {
index 1cb5542..b39e042 100644 (file)
@@ -319,13 +319,13 @@ class Exif {
                $this->mFilteredExifData = array();
 
                foreach ( array_keys( $this->mRawExifData ) as $section ) {
-                       if ( !in_array( $section, array_keys( $this->mExifTags ) ) ) {
+                       if ( !array_key_exists( $section, $this->mExifTags ) ) {
                                $this->debug( $section, __FUNCTION__, "'$section' is not a valid Exif section" );
                                continue;
                        }
 
                        foreach ( array_keys( $this->mRawExifData[$section] ) as $tag ) {
-                               if ( !in_array( $tag, array_keys( $this->mExifTags[$section] ) ) ) {
+                               if ( !array_key_exists( $tag, $this->mExifTags[$section] ) ) {
                                        $this->debug( $tag, __FUNCTION__, "'$tag' is not a valid tag in '$section'" );
                                        continue;
                                }
index bde889c..5992be1 100644 (file)
@@ -78,7 +78,7 @@ class GIFHandler extends BitmapHandler {
        /**
         * @todo Add unit tests
         *
-        * @param File$image
+        * @param File $image
         * @return bool
         */
        function getImageArea( $image ) {
index 87acb53..e4bbb43 100644 (file)
@@ -168,9 +168,6 @@ class MemcachedBagOStuff extends BagOStuff {
         * Send a debug message to the log
         */
        protected function debugLog( $text ) {
-               if ( substr( $text, -1 ) !== "\n" ) {
-                       $text .= "\n";
-               }
                wfDebugLog( 'memcached', $text );
        }
 }
index d9ea54c..d39b288 100644 (file)
@@ -102,8 +102,8 @@ class MWMemcached {
        /**
         * Command statistics
         *
-        * @var     array
-        * @access  public
+        * @var array
+        * @access public
         */
        var $stats;
 
@@ -113,112 +113,112 @@ class MWMemcached {
        /**
         * Cached Sockets that are connected
         *
-        * @var     array
-        * @access  private
+        * @var array
+        * @access private
         */
        var $_cache_sock;
 
        /**
         * Current debug status; 0 - none to 9 - profiling
         *
-        * @var     boolean
-        * @access  private
+        * @var boolean
+        * @access private
         */
        var $_debug;
 
        /**
         * Dead hosts, assoc array, 'host'=>'unixtime when ok to check again'
         *
-        * @var     array
-        * @access  private
+        * @var array
+        * @access private
         */
        var $_host_dead;
 
        /**
         * Is compression available?
         *
-        * @var     boolean
-        * @access  private
+        * @var boolean
+        * @access private
         */
        var $_have_zlib;
 
        /**
         * Do we want to use compression?
         *
-        * @var     boolean
-        * @access  private
+        * @var boolean
+        * @access private
         */
        var $_compress_enable;
 
        /**
         * At how many bytes should we compress?
         *
-        * @var     integer
-        * @access  private
+        * @var integer
+        * @access private
         */
        var $_compress_threshold;
 
        /**
         * Are we using persistent links?
         *
-        * @var     boolean
-        * @access  private
+        * @var boolean
+        * @access private
         */
        var $_persistent;
 
        /**
         * If only using one server; contains ip:port to connect to
         *
-        * @var     string
-        * @access  private
+        * @var string
+        * @access private
         */
        var $_single_sock;
 
        /**
         * Array containing ip:port or array(ip:port, weight)
         *
-        * @var     array
-        * @access  private
+        * @var array
+        * @access private
         */
        var $_servers;
 
        /**
         * Our bit buckets
         *
-        * @var     array
-        * @access  private
+        * @var array
+        * @access private
         */
        var $_buckets;
 
        /**
         * Total # of bit buckets we have
         *
-        * @var     integer
-        * @access  private
+        * @var integer
+        * @access private
         */
        var $_bucketcount;
 
        /**
         * # of total servers we have
         *
-        * @var     integer
-        * @access  private
+        * @var integer
+        * @access private
         */
        var $_active;
 
        /**
         * Stream timeout in seconds. Applies for example to fread()
         *
-        * @var     integer
-        * @access  private
+        * @var integer
+        * @access private
         */
        var $_timeout_seconds;
 
        /**
         * Stream timeout in microseconds
         *
-        * @var     integer
-        * @access  private
+        * @var integer
+        * @access private
         */
        var $_timeout_microseconds;
 
@@ -243,7 +243,7 @@ class MWMemcached {
         *
         * @param array $args Associative array of settings
         *
-        * @return  mixed
+        * @return mixed
         */
        public function __construct( $args ) {
                $this->set_servers( isset( $args['servers'] ) ? $args['servers'] : array() );
@@ -708,7 +708,7 @@ class MWMemcached {
         *
         * @param string $sock socket to close
         *
-        * @access  private
+        * @access private
         */
        function _close_sock( $sock ) {
                $host = array_search( $sock, $this->_cache_sock );
@@ -725,8 +725,8 @@ class MWMemcached {
         * @param $sock Integer: socket to connect
         * @param string $host Host:IP to connect to
         *
-        * @return  boolean
-        * @access  private
+        * @return boolean
+        * @access private
         */
        function _connect_sock( &$sock, $host ) {
                list( $ip, $port ) = preg_split( '/:(?=\d)/', $host );
@@ -767,7 +767,7 @@ class MWMemcached {
         *
         * @param string $sock socket to mark as dead
         *
-        * @access  private
+        * @access private
         */
        function _dead_sock( $sock ) {
                $host = array_search( $sock, $this->_cache_sock );
index 6dda64c..dfe3c80 100644 (file)
@@ -27,7 +27,7 @@
  * @ingroup Parser
  */
 class CacheTime {
-       /** @var  array|bool ParserOptions which have been taken into account to
+       /** @var array|bool ParserOptions which have been taken into account to
         * produce output or false if not available.
         */
        public $mUsedOptions;
index ad6bc0f..02f2438 100644 (file)
@@ -91,10 +91,11 @@ class CoreParserFunctions {
        }
 
        /**
-        * @param $parser Parser
-        * @param  $date
-        * @param null $defaultPref
-        * @return mixed|string
+        * @param Parser $parser
+        * @param string $date
+        * @param string $defaultPref
+        *
+        * @return string
         */
        static function formatDate( $parser, $date, $defaultPref = null ) {
                $lang = $parser->getFunctionLang();
@@ -787,7 +788,7 @@ class CoreParserFunctions {
 
        /**
         * @param $parser Parser
-        * @param  $text
+        * @param $text
         * @return string
         */
        static function anchorencode( $parser, $text ) {
index 0a69b04..d10841f 100644 (file)
@@ -143,7 +143,8 @@ class DateFormatter {
         * @param string $preference User preference
         * @param string $text Text to reformat
         * @param array $options can contain 'linked' and/or 'match-whole'
-        * @return mixed|String
+        *
+        * @return string
         */
        function reformat( $preference, $text, $options = array( 'linked' ) ) {
                $linked = in_array( 'linked', $options );
index 0fefe69..7d98e38 100644 (file)
@@ -591,7 +591,7 @@ class Parser {
         * If $frame is not provided, then template variables (e.g., {{{1}}}) within $text are not expanded
         *
         * @param string $text text extension wants to have parsed
-        * @param $frame PPFrame: The frame to use for expanding any template variables
+        * @param PPFrame $frame The frame to use for expanding any template variables
         *
         * @return string
         */
@@ -628,8 +628,8 @@ class Parser {
         * hook.
         *
         * @param string $text text to be expanded
-        * @param $frame PPFrame: The frame to use for expanding any template variables
-        * @return String
+        * @param PPFrame $frame The frame to use for expanding any template variables
+        * @return string
         * @since 1.19
         */
        public function recursivePreprocess( $text, $frame = false ) {
@@ -650,9 +650,13 @@ class Parser {
         * @param $text String
         * @param $title Title
         * @param $options ParserOptions
+        * @param $params Array
         * @return String
         */
-       public function getPreloadText( $text, Title $title, ParserOptions $options ) {
+       public function getPreloadText( $text, Title $title, ParserOptions $options, $params = array() ) {
+               $msg = new RawMessage( $text );
+               $text = $msg->params( $params )->plain();
+
                # Parser (re)initialisation
                $this->startParse( $title, $options, self::OT_PLAIN, true );
 
@@ -676,7 +680,7 @@ class Parser {
         * Set the current user.
         * Should only be used when doing pre-save transform.
         *
-        * @param $user Mixed: User object or null (to reset)
+        * @param User|null $user User object or null (to reset)
         */
        function setUser( $user ) {
                $this->mUser = $user;
@@ -741,7 +745,7 @@ class Parser {
        /**
         * Set the output type
         *
-        * @param $ot Integer: new value
+        * @param int $ot new value
         */
        function setOutputType( $ot ) {
                $this->mOutputType = $ot;
@@ -884,11 +888,11 @@ class Parser {
         *     '<element param="x">tag content</element>' ) )
         * @endcode
         *
-        * @param array $elements list of element names. Comments are always extracted.
+        * @param array $elements List of element names. Comments are always extracted.
         * @param string $text Source text string.
         * @param array $matches Out parameter, Array: extracted tags
-        * @param $uniq_prefix string
-        * @return String: stripped text
+        * @param string $uniq_prefix
+        * @return string Stripped text
         */
        public static function extractTagsAndParams( $elements, $text, &$matches, $uniq_prefix = '' ) {
                static $n = 1;
@@ -1731,10 +1735,10 @@ class Parser {
         * @param $url String
         * @return String
         *
-        * @todo  This can merge genuinely required bits in the path or query string,
-        *        breaking legit URLs. A proper fix would treat the various parts of
-        *        the URL differently; as a workaround, just use the output for
-        *        statistical records, not for actual linking/output.
+        * @todo This can merge genuinely required bits in the path or query string,
+        *       breaking legit URLs. A proper fix would treat the various parts of
+        *       the URL differently; as a workaround, just use the output for
+        *       statistical records, not for actual linking/output.
         */
        static function replaceUnusualEscapes( $url ) {
                return preg_replace_callback( '/%[0-9A-Fa-f]{2}/',
@@ -1817,9 +1821,9 @@ class Parser {
        /**
         * Process [[ ]] wikilinks
         *
-        * @param $s string
+        * @param string $s
         *
-        * @return String: processed text
+        * @return string Processed text
         *
         * @private
         */
@@ -2171,12 +2175,12 @@ class Parser {
         * breaking URLs in the following text without breaking trails on the
         * wiki links, it's been made into a horrible function.
         *
-        * @param $nt Title
-        * @param $text String
-        * @param array $query or String
-        * @param $trail String
-        * @param $prefix String
-        * @return String: HTML-wikitext mix oh yuck
+        * @param Title $nt
+        * @param string $text
+        * @param array|string $query
+        * @param string $trail
+        * @param string $prefix
+        * @return string HTML-wikitext mix oh yuck
         */
        function makeKnownLinkHolder( $nt, $text = '', $query = array(), $trail = '', $prefix = '' ) {
                list( $inside, $trail ) = Linker::splitTrail( $trail );
@@ -2200,8 +2204,8 @@ class Parser {
         * Not needed quite as much as it used to be since free links are a bit
         * more sensible these days. But bracketed links are still an issue.
         *
-        * @param string $text more-or-less HTML
-        * @return String: less-or-more HTML with NOPARSE bits
+        * @param string $text More-or-less HTML
+        * @return string Less-or-more HTML with NOPARSE bits
         */
        function armorLinks( $text ) {
                return preg_replace( '/\b((?i)' . $this->mUrlProtocols . ')/',
@@ -2220,9 +2224,9 @@ class Parser {
        /**
         * Handle link to subpage if necessary
         *
-        * @param string $target the source of the link
-        * @param &$text String: the link text, modified as necessary
-        * @return string the full name of the link
+        * @param string $target The source of the link
+        * @param string &$text The link text, modified as necessary
+        * @return string The full name of the link
         * @private
         */
        function maybeDoSubpageLink( $target, &$text ) {
@@ -2353,10 +2357,10 @@ class Parser {
        /**
         * Make lists from lines starting with ':', '*', '#', etc. (DBL)
         *
-        * @param $text String
-        * @param $linestart Boolean: whether or not this is at the start of a line.
+        * @param string $text
+        * @param bool $linestart Whether or not this is at the start of a line.
         * @private
-        * @return string the lists rendered as HTML
+        * @return string The lists rendered as HTML
         */
        function doBlockLevels( $text, $linestart ) {
                wfProfileIn( __METHOD__ );
@@ -3069,9 +3073,9 @@ class Parser {
         * This is the ghost of replace_variables().
         *
         * @param string $text The text to parse
-        * @param $flags Integer: bitwise combination of:
-        *          self::PTD_FOR_INCLUSION    Handle "<noinclude>" and "<includeonly>" as if the text is being
-        *                                     included. Default is to assume a direct page view.
+        * @param int $flags Bitwise combination of:
+        *   - self::PTD_FOR_INCLUSION: Handle "<noinclude>" and "<includeonly>" as if the text is being
+        *     included. Default is to assume a direct page view.
         *
         * The generated DOM tree must depend only on the input text and the flags.
         * The DOM tree must be the same in OT_HTML and OT_WIKI mode, to avoid a regression of bug 4899.
@@ -3217,13 +3221,13 @@ class Parser {
         * Return the text of a template, after recursively
         * replacing any variables or templates within the template.
         *
-        * @param array $piece the parts of the template
+        * @param array $piece The parts of the template
         *  $piece['title']: the title, i.e. the part before the |
         *  $piece['parts']: the parameter array
         *  $piece['lineStart']: whether the brace was at the start of a line
-        * @param $frame PPFrame The current frame, contains template arguments
+        * @param PPFrame $frame The current frame, contains template arguments
         * @throws MWException
-        * @return String: the text of the template
+        * @return string The text of the template
         * @private
         */
        function braceSubstitution( $piece, $frame ) {
@@ -3729,8 +3733,8 @@ class Parser {
         * Static function to get a template
         * Can be overridden via ParserOptions::setTemplateCallback().
         *
-        * @param $title  Title
-        * @param $parser Parser
+        * @param Title $title
+        * @param Parser $parser
         *
         * @return array
         */
@@ -4065,9 +4069,9 @@ class Parser {
        /**
         * Increment an include size counter
         *
-        * @param string $type the type of expansion
-        * @param $size Integer: the size of the text
-        * @return Boolean: false if this inclusion would take it over the maximum, true otherwise
+        * @param string $type The type of expansion
+        * @param int $size The size of the text
+        * @return bool false if this inclusion would take it over the maximum, true otherwise
         */
        function incrementIncludeSize( $type, $size ) {
                if ( $this->mIncludeSizes[$type] + $size > $this->mOptions->getMaxIncludeSize() ) {
@@ -4081,7 +4085,7 @@ class Parser {
        /**
         * Increment the expensive function count
         *
-        * @return Boolean: false if the limit has been exceeded
+        * @return bool false if the limit has been exceeded
         */
        function incrementExpensiveFunctionCount() {
                $this->mExpensiveFunctionCount++;
@@ -4155,8 +4159,8 @@ class Parser {
         * $wgTrackingCategories. That way they will be listed on
         * Special:TrackingCategories.
         *
-        * @param string $msg message key
-        * @return Boolean: whether the addition was successful
+        * @param string $msg Message key
+        * @return bool Whether the addition was successful
         */
        public function addTrackingCategory( $msg ) {
                if ( $this->mTitle->getNamespace() === NS_SPECIAL ) {
@@ -4574,12 +4578,12 @@ class Parser {
         * Transform wiki markup when saving a page by doing "\r\n" -> "\n"
         * conversion, substitting signatures, {{subst:}} templates, etc.
         *
-        * @param string $text the text to transform
-        * @param $title Title: the Title object for the current article
-        * @param $user User: the User object describing the current user
-        * @param $options ParserOptions: parsing options
-        * @param $clearState Boolean: whether to clear the parser state first
-        * @return String: the altered wiki markup
+        * @param string $text The text to transform
+        * @param Title $title The Title object for the current article
+        * @param User $user The User object describing the current user
+        * @param ParserOptions $options Parsing options
+        * @param bool $clearState Whether to clear the parser state first
+        * @return string The altered wiki markup
         */
        public function preSaveTransform( $text, Title $title, User $user, ParserOptions $options, $clearState = true ) {
                $this->startParse( $title, $options, self::OT_WIKI, $clearState );
@@ -4749,9 +4753,9 @@ class Parser {
         * 1) Strip ~~~, ~~~~ and ~~~~~ out of signatures @see cleanSigInSig
         * 2) Substitute all transclusions
         *
-        * @param $text String
+        * @param string $text
         * @param bool $parsing Whether we're cleaning (preferences save) or parsing
-        * @return String: signature text
+        * @return string Signature text
         */
        public function cleanSig( $text, $parsing = false ) {
                if ( !$parsing ) {
@@ -4786,8 +4790,8 @@ class Parser {
        /**
         * Strip ~~~, ~~~~ and ~~~~~ out of signatures
         *
-        * @param $text String
-        * @return String: signature text with /~{3,5}/ removed
+        * @param string $text
+        * @return string Signature text with /~{3,5}/ removed
         */
        public static function cleanSigInSig( $text ) {
                $text = preg_replace( '/~{3,5}/', '', $text );
@@ -4825,10 +4829,10 @@ class Parser {
        /**
         * Wrapper for preprocess()
         *
-        * @param string $text the text to preprocess
-        * @param $options ParserOptions: options
-        * @param $title Title object or null to use $wgTitle
-        * @return String
+        * @param string $text The text to preprocess
+        * @param ParserOptions $options Options
+        * @param Title|null $title Title object or null to use $wgTitle
+        * @return string
         */
        public function transformMsg( $text, $options, $title = null ) {
                static $executing = false;
@@ -4871,10 +4875,10 @@ class Parser {
         * this interface, as it is not documented and injudicious use could smash
         * private variables.**
         *
-        * @param $tag Mixed: the tag to use, e.g. 'hook' for "<hook>"
-        * @param $callback Mixed: the callback function (and object) to use for the tag
+        * @param string $tag The tag to use, e.g. 'hook' for "<hook>"
+        * @param mixed $callback The callback function (and object) to use for the tag
         * @throws MWException
-        * @return Mixed|null The old value of the mTagHooks array associated with the hook
+        * @return mixed|null The old value of the mTagHooks array associated with the hook
         */
        public function setHook( $tag, $callback ) {
                $tag = strtolower( $tag );
@@ -4902,10 +4906,10 @@ class Parser {
         * @since 1.10
         * @todo better document or deprecate this
         *
-        * @param $tag Mixed: the tag to use, e.g. 'hook' for "<hook>"
-        * @param $callback Mixed: the callback function (and object) to use for the tag
+        * @param string $tag The tag to use, e.g. 'hook' for "<hook>"
+        * @param mixed $callback The callback function (and object) to use for the tag
         * @throws MWException
-        * @return Mixed|null The old value of the mTagHooks array associated with the hook
+        * @return mixed|null The old value of the mTagHooks array associated with the hook
         */
        function setTransparentTagHook( $tag, $callback ) {
                $tag = strtolower( $tag );
@@ -4944,8 +4948,8 @@ class Parser {
         *   isHTML                    The returned text is HTML, armour it against wikitext transformation
         *
         * @param string $id The magic word ID
-        * @param $callback Mixed: the callback function (and object) to use
-        * @param $flags Integer: a combination of the following flags:
+        * @param mixed $callback The callback function (and object) to use
+        * @param int $flags A combination of the following flags:
         *     SFH_NO_HASH   No leading hash, i.e. {{plural:...}} instead of {{#if:...}}
         *
         *     SFH_OBJECT_ARGS   Pass the template arguments as PPNode objects instead of text. This
@@ -5334,6 +5338,7 @@ class Parser {
                $caption = '';
                $params = array( 'frame' => array(), 'handler' => array(),
                        'horizAlign' => array(), 'vertAlign' => array() );
+               $seenformat = false;
                foreach ( $parts as $part ) {
                        $part = trim( $part );
                        list( $magicName, $value ) = $mwArray->matchVariableStartToEnd( $part );
@@ -5401,6 +5406,13 @@ class Parser {
                                                                }
                                                        }
                                                        break;
+                                               case 'frameless':
+                                               case 'framed':
+                                               case 'thumbnail':
+                                                       // use first appearing option, discard others.
+                                                       $validated = ! $seenformat;
+                                                       $seenformat = true;
+                                                       break;
                                                default:
                                                        # Most other things appear to be empty or numeric...
                                                        $validated = ( $value === false || is_numeric( trim( $value ) ) );
@@ -5601,10 +5613,10 @@ class Parser {
         * string. If $text is the empty string and section 0 is replaced, $newText is
         * returned.
         *
-        * @param string $mode one of "get" or "replace"
-        * @param string $newText replacement text for section data.
-        * @return String: for "get", the extracted section text.
-        *                 for "replace", the whole page with the section replaced.
+        * @param string $mode One of "get" or "replace"
+        * @param string $newText Replacement text for section data.
+        * @return string For "get", the extracted section text.
+        *   for "replace", the whole page with the section replaced.
         */
        private function extractSections( $text, $section, $mode, $newText = '' ) {
                global $wgTitle; # not generally used but removes an ugly failure mode
@@ -5736,10 +5748,10 @@ class Parser {
         * specified by $section has been replaced with $text. If the target
         * section does not exist, $oldtext is returned unchanged.
         *
-        * @param string $oldtext former text of the article
-        * @param int $section section identifier
-        * @param string $text replacing text
-        * @return String: modified text
+        * @param string $oldtext Former text of the article
+        * @param int $section Section identifier
+        * @param string $text Replacing text
+        * @return string Modified text
         */
        public function replaceSection( $oldtext, $section, $text ) {
                return $this->extractSections( $oldtext, $section, "replace", $text );
@@ -5748,7 +5760,7 @@ class Parser {
        /**
         * Get the ID of the revision we are parsing
         *
-        * @return Mixed: integer or null
+        * @return int|null
         */
        function getRevisionId() {
                return $this->mRevisionId;
@@ -5801,7 +5813,7 @@ class Parser {
        /**
         * Get the name of the user that edited the last revision
         *
-        * @return String: user name
+        * @return string User name
         */
        function getRevisionUser() {
                if ( is_null( $this->mRevisionUser ) ) {
index 4c7084e..ff74f2a 100644 (file)
@@ -125,9 +125,9 @@ class ParserCache {
         *
         * @todo Document parameter $useOutdated
         *
-        * @param $article     Article
-        * @param $popts       ParserOptions
-        * @param $useOutdated Boolean (default true)
+        * @param Article $article
+        * @param ParserOptions $popts
+        * @param bool $useOutdated (default true)
         * @return bool|mixed|string
         */
        public function getKey( $article, $popts, $useOutdated = true ) {
@@ -171,9 +171,9 @@ class ParserCache {
         * Retrieve the ParserOutput from ParserCache.
         * false if not found or outdated.
         *
-        * @param $article     Article
-        * @param $popts       ParserOptions
-        * @param $useOutdated Boolean (default false)
+        * @param Article $article
+        * @param ParserOptions $popts
+        * @param bool $useOutdated (default false)
         *
         * @return ParserOutput|bool False on failure
         */
index 7c6dde6..edd4911 100644 (file)
@@ -286,7 +286,7 @@ class ParserOptions {
        /**
         * Same as getUserLangObj() but returns a string instead.
         *
-        * @return String   Language code
+        * @return String Language code
         * @since 1.17
         */
        function getUserLang() {
@@ -478,8 +478,8 @@ class ParserOptions {
         * settings.
         *
         * @since 1.17
-        * @param $forOptions Array
-        * @param $title Title: used to get the content language of the page (since r97636)
+        * @param array $forOptions
+        * @param Title $title Used to get the content language of the page (since r97636)
         * @return string Page rendering hash
         */
        public function optionsHash( $forOptions, $title = null ) {
index deaf288..d6edb21 100644 (file)
@@ -1619,7 +1619,7 @@ class PPNode_Hash_Tree implements PPNode {
        }
 
        /**
-        * @param  $i
+        * @param $i
         * @return bool
         */
        function item( $i ) {
index 5f3f18e..5b94453 100644 (file)
@@ -97,7 +97,7 @@ class StripState {
        }
 
        /**
-        * @param  $text
+        * @param $text
         * @return mixed
         */
        function unstripBoth( $text ) {
index 1bc10f2..5c88239 100644 (file)
@@ -267,7 +267,7 @@ LUA;
 
        /**
         * @param RedisConnRef $conn
-        * @param float UNIX timestamp
+        * @param float $now UNIX timestamp
         * @return string|bool False on failure
         */
        protected function initAndPopPoolSlotList( RedisConnRef $conn, $now ) {
index f992d83..02367e1 100644 (file)
@@ -95,21 +95,41 @@ class ProfileSection {
  * @todo document
  */
 class Profiler {
-       protected $mStack = array(), $mWorkStack = array(), $mCollated = array(),
-               $mCalls = array(), $mTotals = array(), $mPeriods = array();
+       /** @var array List of resolved profile calls with start/end data */
+       protected $mStack = array();
+       /** @var array Queue of open profile calls with start data */
+       protected $mWorkStack = array();
+
+       /** @var array Map of (function name => aggregate data array) */
+       protected $mCollated = array();
+       /** @var bool */
+       protected $mCollateDone = false;
+       /** @var bool */
+       protected $mCollateOnly = false;
+       /** @var array Cache of a standard broken collation entry */
+       protected $mErrorEntry;
+
+       /** @var string wall|cpu|user */
        protected $mTimeMetric = 'wall';
-       protected $mProfileID = false, $mCollateDone = false, $mTemplated = false;
+       /** @var string|bool Profiler ID for bucketing data */
+       protected $mProfileID = false;
+       /** @var bool Whether MediaWiki is in a SkinTemplate output context */
+       protected $mTemplated = false;
 
-       protected $mDBLockThreshold = 5.0; // float; seconds
+       /** @var float seconds */
+       protected $mDBLockThreshold = 5.0;
        /** @var Array DB/server name => (active trx count,timestamp) */
        protected $mDBTrxHoldingLocks = array();
-       /** @var Array DB/server name => list of (method, elapsed time) */
+       /** @var Array DB/server name => list of (function name, elapsed time) */
        protected $mDBTrxMethodTimes = array();
 
        /** @var Profiler */
        public static $__instance = null; // do not call this outside Profiler and ProfileSection
 
-       function __construct( $params ) {
+       /**
+        * @param array $params
+        */
+       public function __construct( array $params ) {
                if ( isset( $params['timeMetric'] ) ) {
                        $this->mTimeMetric = $params['timeMetric'];
                }
@@ -117,6 +137,8 @@ class Profiler {
                        $this->mProfileID = $params['profileID'];
                }
 
+               $this->mCollateOnly = $this->collateOnly();
+
                $this->addInitialStack();
        }
 
@@ -167,13 +189,19 @@ class Profiler {
         * @return Boolean
         */
        public function isPersistent() {
-               return true;
+               return false;
        }
 
+       /**
+        * @param string $id
+        */
        public function setProfileID( $id ) {
                $this->mProfileID = $id;
        }
 
+       /**
+        * @return string
+        */
        public function getProfileID() {
                if ( $this->mProfileID === false ) {
                        return wfWikiID();
@@ -182,20 +210,101 @@ class Profiler {
                }
        }
 
+       /**
+        * Whether to internally just track aggregates and ignore the full stack trace
+        *
+        * @return boolean
+        */
+       protected function collateOnly() {
+               return false;
+       }
+
        /**
         * Add the inital item in the stack.
         */
        protected function addInitialStack() {
-               // Push an entry for the pre-profile setup time onto the stack
-               $initial = $this->getInitialTime();
-               if ( $initial !== null ) {
-                       $this->mWorkStack[] = array( '-total', 0, $initial, 0 );
-                       $this->mStack[] = array( '-setup', 1, $initial, 0, $this->getTime(), 0 );
+               $this->mErrorEntry = $this->getErrorEntry();
+
+               $initialTime = $this->getInitialTime( 'wall' );
+               $initialCpu = $this->getInitialTime( 'cpu' );
+               if ( $initialTime !== null && $initialCpu !== null ) {
+                       $this->mWorkStack[] = array( '-total', 0, $initialTime, $initialCpu, 0 );
+                       if ( $this->mCollateOnly ) {
+                               $this->mWorkStack[] = array( '-setup', 1, $initialTime, $initialCpu, 0 );
+                               $this->profileOut( '-setup' );
+                       } else {
+                               $this->mStack[] = array( '-setup', 1, $initialTime, $initialCpu, 0,
+                                       $this->getTime( 'wall' ), $this->getTime( 'cpu' ), 0 );
+                       }
                } else {
                        $this->profileIn( '-total' );
                }
        }
 
+       /**
+        * @return array Initial collation entry
+        */
+       protected function getZeroEntry() {
+               return array(
+                       'cpu'      => 0.0,
+                       'cpu_sq'   => 0.0,
+                       'real'     => 0.0,
+                       'real_sq'  => 0.0,
+                       'memory'   => 0,
+                       'count'    => 0,
+                       'min_cpu'  => 0.0,
+                       'max_cpu'  => 0.0,
+                       'min_real' => 0.0,
+                       'max_real' => 0.0,
+                       'periods'  => array(), // not filled if mCollateOnly
+                       'overhead' => 0 // not filled if mCollateOnly
+               );
+       }
+
+       /**
+        * @return array Initial collation entry for errors
+        */
+       protected function getErrorEntry() {
+               $entry = $this->getZeroEntry();
+               $entry['count'] = 1;
+               return $entry;
+       }
+
+       /**
+        * Update the collation entry for a given method name
+        *
+        * @param string $name
+        * @param float $elapsedCpu
+        * @param float $elapsedReal
+        * @param integer $memChange
+        * @param integer $subcalls
+        * @param array|null $period Map of ('start','end','memory','subcalls')
+        */
+       protected function updateEntry(
+               $name, $elapsedCpu, $elapsedReal, $memChange, $subcalls = 0, $period = null
+       ) {
+               $entry =& $this->mCollated[$name];
+               if ( !is_array( $entry ) ) {
+                       $entry = $this->getZeroEntry();
+                       $this->mCollated[$name] =& $entry;
+               }
+               $entry['cpu'] += $elapsedCpu;
+               $entry['cpu_sq'] += $elapsedCpu * $elapsedCpu;
+               $entry['real'] += $elapsedReal;
+               $entry['real_sq'] += $elapsedReal * $elapsedReal;
+               $entry['memory'] += $memChange > 0 ? $memChange : 0;
+               $entry['count']++;
+               $entry['min_cpu'] = $elapsedCpu < $entry['min_cpu'] ? $elapsedCpu : $entry['min_cpu'];
+               $entry['max_cpu'] = $elapsedCpu > $entry['max_cpu'] ? $elapsedCpu : $entry['max_cpu'];
+               $entry['min_real'] = $elapsedReal < $entry['min_real'] ? $elapsedReal : $entry['min_real'];
+               $entry['max_real'] = $elapsedReal > $entry['max_real'] ? $elapsedReal : $entry['max_real'];
+               // Apply optional fields
+               $entry['overhead'] += $subcalls;
+               if ( $period ) {
+                       $entry['periods'][] = $period;
+               }
+       }
+
        /**
         * Called by wfProfieIn()
         *
@@ -203,11 +312,19 @@ class Profiler {
         */
        public function profileIn( $functionname ) {
                global $wgDebugFunctionEntry;
+
                if ( $wgDebugFunctionEntry ) {
-                       $this->debug( str_repeat( ' ', count( $this->mWorkStack ) ) . 'Entering ' . $functionname . "\n" );
+                       $this->debug( str_repeat( ' ', count( $this->mWorkStack ) ) .
+                               'Entering ' . $functionname . "\n" );
                }
 
-               $this->mWorkStack[] = array( $functionname, count( $this->mWorkStack ), $this->getTime(), memory_get_usage() );
+               $this->mWorkStack[] = array(
+                       $functionname,
+                       count( $this->mWorkStack ),
+                       $this->getTime( 'time' ),
+                       $this->getTime( 'cpu' ),
+                       memory_get_usage()
+               );
        }
 
        /**
@@ -217,33 +334,50 @@ class Profiler {
         */
        public function profileOut( $functionname ) {
                global $wgDebugFunctionEntry;
-               $memory = memory_get_usage();
-               $time = $this->getTime();
 
                if ( $wgDebugFunctionEntry ) {
-                       $this->debug( str_repeat( ' ', count( $this->mWorkStack ) - 1 ) . 'Exiting ' . $functionname . "\n" );
+                       $this->debug( str_repeat( ' ', count( $this->mWorkStack ) - 1 ) .
+                               'Exiting ' . $functionname . "\n" );
                }
 
-               $bit = array_pop( $this->mWorkStack );
+               $item = array_pop( $this->mWorkStack );
+               list( $ofname, /* $ocount */, $ortime, $octime, $omem ) = $item;
 
-               if ( !$bit ) {
-                       $this->debugGroup( 'profileerror', "Profiling error, !\$bit: $functionname" );
+               if ( $item === null ) {
+                       $this->debugGroup( 'profileerror', "Profiling error: $functionname" );
                } else {
-                       if ( $functionname == 'close' ) {
-                               if ( $bit[0] != '-total' ) {
-                                       $message = "Profile section ended by close(): {$bit[0]}";
+                       if ( $functionname === 'close' ) {
+                               if ( $ofname !== '-total' ) {
+                                       $message = "Profile section ended by close(): {$ofname}";
                                        $this->debugGroup( 'profileerror', $message );
-                                       $this->mStack[] = array( $message, 0, 0.0, 0, 0.0, 0 );
+                                       if ( $this->mCollateOnly ) {
+                                               $this->mCollated[$message] = $this->mErrorEntry;
+                                       } else {
+                                               $this->mStack[] = array( $message, 0, 0.0, 0.0, 0, 0.0, 0.0, 0 );
+                                       }
                                }
-                       } elseif ( $bit[0] != $functionname ) {
-                               $message = "Profiling error: in({$bit[0]}), out($functionname)";
+                               $functionname = $ofname;
+                       } elseif ( $ofname !== $functionname ) {
+                               $message = "Profiling error: in({$ofname}), out($functionname)";
                                $this->debugGroup( 'profileerror', $message );
-                               $this->mStack[] = array( $message, 0, 0.0, 0, 0.0, 0 );
+                               if ( $this->mCollateOnly ) {
+                                       $this->mCollated[$message] = $this->mErrorEntry;
+                               } else {
+                                       $this->mStack[] = array( $message, 0, 0.0, 0.0, 0, 0.0, 0.0, 0 );
+                               }
+                       }
+                       $realTime = $this->getTime( 'wall' );
+                       $cpuTime = $this->getTime( 'cpu' );
+                       if ( $this->mCollateOnly ) {
+                               $elapsedcpu = $cpuTime - $octime;
+                               $elapsedreal = $realTime - $ortime;
+                               $memchange = memory_get_usage() - $omem;
+                               $this->updateEntry( $functionname, $elapsedcpu, $elapsedreal, $memchange );
+                       } else {
+                               $this->mStack[] = array_merge( $item,
+                                       array( $realTime, $cpuTime,     memory_get_usage() ) );
                        }
-                       $bit[] = $time;
-                       $bit[] = $memory;
-                       $this->mStack[] = $bit;
-                       $this->updateTrxProfiling( $functionname, $time );
+                       $this->updateTrxProfiling( $functionname, $realTime - $ortime );
                }
        }
 
@@ -256,6 +390,13 @@ class Profiler {
                }
        }
 
+       /**
+        * Log the data to some store or even the page output
+        */
+       public function logData() {
+               /* Implement in subclasses */
+       }
+
        /**
         * Mark a DB as in a transaction with one or more writes pending
         *
@@ -338,7 +479,7 @@ class Profiler {
         *
         * @param $t Boolean
         */
-       function setTemplated( $t ) {
+       public function setTemplated( $t ) {
                $this->mTemplated = $t;
        }
 
@@ -349,7 +490,8 @@ class Profiler {
         */
        public function getOutput() {
                global $wgDebugFunctionEntry, $wgProfileCallTree;
-               $wgDebugFunctionEntry = false;
+
+               $wgDebugFunctionEntry = false; // hack
 
                if ( !count( $this->mStack ) && !count( $this->mCollated ) ) {
                        return "No profiling output\n";
@@ -366,8 +508,10 @@ class Profiler {
         * Returns a tree of function call instead of a list of functions
         * @return string
         */
-       function getCallTree() {
-               return implode( '', array_map( array( &$this, 'getCallTreeLine' ), $this->remapCallTree( $this->mStack ) ) );
+       protected function getCallTree() {
+               return implode( '', array_map(
+                       array( &$this, 'getCallTreeLine' ), $this->remapCallTree( $this->mStack )
+               ) );
        }
 
        /**
@@ -376,7 +520,7 @@ class Profiler {
         * @param array $stack profiling array
         * @return array
         */
-       function remapCallTree( $stack ) {
+       protected function remapCallTree( array $stack ) {
                if ( count( $stack ) < 2 ) {
                        return $stack;
                }
@@ -415,13 +559,14 @@ class Profiler {
         * Callback to get a formatted line for the call tree
         * @return string
         */
-       function getCallTreeLine( $entry ) {
-               list( $fname, $level, $start, /* $x */, $end ) = $entry;
-               $delta = $end - $start;
+       protected function getCallTreeLine( $entry ) {
+               list( $fname, $level, $startreal, , , $endreal ) = $entry;
+               $delta = $endreal - $startreal;
                $space = str_repeat( ' ', $level );
                # The ugly double sprintf is to work around a PHP bug,
                # which has been fixed in recent releases.
-               return sprintf( "%10s %s %s\n", trim( sprintf( "%7.3f", $delta * 1000.0 ) ), $space, $fname );
+               return sprintf( "%10s %s %s\n",
+                       trim( sprintf( "%7.3f", $delta * 1000.0 ) ), $space, $fname );
        }
 
        /**
@@ -435,7 +580,7 @@ class Profiler {
         *   - false (default): will fall back to default metric
         * @return float|null
         */
-       function getTime( $metric = false ) {
+       protected function getTime( $metric = false ) {
                if ( $metric === false ) {
                        $metric = $this->mTimeMetric;
                }
@@ -496,17 +641,21 @@ class Profiler {
                }
        }
 
+       /**
+        * Populate mCollated
+        */
        protected function collateData() {
                if ( $this->mCollateDone ) {
                        return;
                }
                $this->mCollateDone = true;
+               $this->close(); // set "-total" entry
 
-               $this->close();
+               if ( $this->mCollateOnly ) {
+                       return; // already collated as methods exited
+               }
 
                $this->mCollated = array();
-               $this->mCalls = array();
-               $this->mMemory = array();
 
                # Estimate profiling overhead
                $profileCount = count( $this->mStack );
@@ -515,62 +664,49 @@ class Profiler {
                # First, subtract the overhead!
                $overheadTotal = $overheadMemory = $overheadInternal = array();
                foreach ( $this->mStack as $entry ) {
+                       // $entry is (name,pos,rtime0,cputime0,mem0,rtime1,cputime1,mem1)
                        $fname = $entry[0];
-                       $start = $entry[2];
-                       $end = $entry[4];
-                       $elapsed = $end - $start;
-                       $memory = $entry[5] - $entry[3];
+                       $elapsed = $entry[5] - $entry[2];
+                       $memchange = $entry[7] - $entry[4];
 
-                       if ( $fname == '-overhead-total' ) {
+                       if ( $fname === '-overhead-total' ) {
                                $overheadTotal[] = $elapsed;
-                               $overheadMemory[] = $memory;
-                       } elseif ( $fname == '-overhead-internal' ) {
+                               $overheadMemory[] = max( 0, $memchange );
+                       } elseif ( $fname === '-overhead-internal' ) {
                                $overheadInternal[] = $elapsed;
                        }
                }
-               $overheadTotal = $overheadTotal ? array_sum( $overheadTotal ) / count( $overheadInternal ) : 0;
-               $overheadMemory = $overheadMemory ? array_sum( $overheadMemory ) / count( $overheadInternal ) : 0;
-               $overheadInternal = $overheadInternal ? array_sum( $overheadInternal ) / count( $overheadInternal ) : 0;
+               $overheadTotal = $overheadTotal ?
+                       array_sum( $overheadTotal ) / count( $overheadInternal ) : 0;
+               $overheadMemory = $overheadMemory ?
+                       array_sum( $overheadMemory ) / count( $overheadInternal ) : 0;
+               $overheadInternal = $overheadInternal ?
+                       array_sum( $overheadInternal ) / count( $overheadInternal ) : 0;
 
                # Collate
                foreach ( $this->mStack as $index => $entry ) {
+                       // $entry is (name,pos,rtime0,cputime0,mem0,rtime1,cputime1,mem1)
                        $fname = $entry[0];
-                       $start = $entry[2];
-                       $end = $entry[4];
-                       $elapsed = $end - $start;
-
-                       $memory = $entry[5] - $entry[3];
+                       $elapsedCpu = $entry[6] - $entry[3];
+                       $elapsedReal = $entry[5] - $entry[2];
+                       $memchange = $entry[7] - $entry[4];
                        $subcalls = $this->calltreeCount( $this->mStack, $index );
 
-                       if ( !preg_match( '/^-overhead/', $fname ) ) {
+                       if ( substr( $fname, 0, 9 ) !== '-overhead' ) {
                                # Adjust for profiling overhead (except special values with elapsed=0
                                if ( $elapsed ) {
                                        $elapsed -= $overheadInternal;
                                        $elapsed -= ( $subcalls * $overheadTotal );
-                                       $memory -= ( $subcalls * $overheadMemory );
+                                       $memchange -= ( $subcalls * $overheadMemory );
                                }
                        }
 
-                       if ( !array_key_exists( $fname, $this->mCollated ) ) {
-                               $this->mCollated[$fname] = 0;
-                               $this->mCalls[$fname] = 0;
-                               $this->mMemory[$fname] = 0;
-                               $this->mMin[$fname] = 1 << 24;
-                               $this->mMax[$fname] = 0;
-                               $this->mOverhead[$fname] = 0;
-                               $this->mPeriods[$fname] = array();
-                       }
-
-                       $this->mCollated[$fname] += $elapsed;
-                       $this->mCalls[$fname]++;
-                       $this->mMemory[$fname] += $memory;
-                       $this->mMin[$fname] = min( $this->mMin[$fname], $elapsed );
-                       $this->mMax[$fname] = max( $this->mMax[$fname], $elapsed );
-                       $this->mOverhead[$fname] += $subcalls;
-                       $this->mPeriods[$fname][] = compact( 'start', 'end', 'memory', 'subcalls' );
+                       $period = array( 'start' => $entry[2], 'end' => $entry[5],
+                               'memory' => $memchange, 'subcalls' => $subcalls );
+                       $this->updateEntry( $fname, $elapsedCpu, $elapsedReal, $memchange, $subcalls, $period );
                }
 
-               $this->mCalls['-overhead-total'] = $profileCount;
+               $this->mCollated['-overhead-total']['count'] = $profileCount;
                arsort( $this->mCollated, SORT_NUMERIC );
        }
 
@@ -579,7 +715,7 @@ class Profiler {
         *
         * @return string
         */
-       function getFunctionReport() {
+       protected function getFunctionReport() {
                $this->collateData();
 
                $width = 140;
@@ -589,22 +725,24 @@ class Profiler {
                $prof = "\nProfiling data\n";
                $prof .= sprintf( $titleFormat, 'Name', 'Calls', 'Total', 'Each', '%', 'Mem' );
 
-               $total = isset( $this->mCollated['-total'] ) ? $this->mCollated['-total'] : 0;
+               $total = isset( $this->mCollated['-total'] )
+                       ? $this->mCollated['-total']['real']
+                       : 0;
 
-               foreach ( $this->mCollated as $fname => $elapsed ) {
-                       $calls = $this->mCalls[$fname];
-                       $percent = $total ? 100. * $elapsed / $total : 0;
-                       $memory = $this->mMemory[$fname];
+               foreach ( $this->mCollated as $fname => $data ) {
+                       $calls = $data['count'];
+                       $percent = $total ? 100 * $data['real'] / $total : 0;
+                       $memory = $data['memory'];
                        $prof .= sprintf( $format,
                                substr( $fname, 0, $nameWidth ),
                                $calls,
-                               (float)( $elapsed * 1000 ),
-                               (float)( $elapsed * 1000 ) / $calls,
+                               (float)( $data['real'] * 1000 ),
+                               (float)( $data['real'] * 1000 ) / $calls,
                                $percent,
                                $memory,
-                               ( $this->mMin[$fname] * 1000.0 ),
-                               ( $this->mMax[$fname] * 1000.0 ),
-                               $this->mOverhead[$fname]
+                               ( $data['min_real'] * 1000.0 ),
+                               ( $data['max_real'] * 1000.0 ),
+                               $data['overhead']
                        );
                }
                $prof .= "\nTotal: $total\n\n";
@@ -616,27 +754,48 @@ class Profiler {
         * @return array
         */
        public function getRawData() {
+               // This method is called before shutdown in the footer method on Skins.
+               // If some outer methods have not yet called wfProfileOut(), work around
+               // that by clearing anything in the work stack to just the "-total" entry.
+               // Collate after doing this so the results do not include profile errors.
+               if ( count( $this->mWorkStack ) > 1 ) {
+                       $oldWorkStack = $this->mWorkStack;
+                       $this->mWorkStack = array( $this->mWorkStack[0] ); // just the "-total" one
+               } else {
+                       $oldWorkStack = null;
+               }
                $this->collateData();
+               // If this trick is used, then the old work stack is swapped back afterwards
+               // and mCollateDone is reset to false. This means that logData() will still
+               // make use of all the method data since the missing wfProfileOut() calls
+               // should be made by the time it is called.
+               if ( $oldWorkStack ) {
+                       $this->mWorkStack = $oldWorkStack;
+                       $this->mCollateDone = false;
+               }
+
+               $total = isset( $this->mCollated['-total'] )
+                       ? $this->mCollated['-total']['real']
+                       : 0;
 
                $profile = array();
-               $total = isset( $this->mCollated['-total'] ) ? $this->mCollated['-total'] : 0;
-               foreach ( $this->mCollated as $fname => $elapsed ) {
+               foreach ( $this->mCollated as $fname => $data ) {
                        $periods = array();
-                       foreach ( $this->mPeriods[$fname] as $period ) {
+                       foreach ( $data['periods'] as $period ) {
                                $period['start'] *= 1000;
                                $period['end'] *= 1000;
                                $periods[] = $period;
                        }
                        $profile[] = array(
                                'name' => $fname,
-                               'calls' => $this->mCalls[$fname],
-                               'elapsed' => $elapsed * 1000,
-                               'percent' => $total ? 100. * $elapsed / $total : 0,
-                               'memory' => $this->mMemory[$fname],
-                               'min' => $this->mMin[$fname] * 1000,
-                               'max' => $this->mMax[$fname] * 1000,
-                               'overhead' => $this->mOverhead[$fname],
-                               'periods' => $periods,
+                               'calls' => $data['count'],
+                               'elapsed' => $data['real'] * 1000,
+                               'percent' => $total ? 100 * $data['real'] / $total : 0,
+                               'memory' => $data['memory'],
+                               'min' => $data['min_real'] * 1000,
+                               'max' => $data['max_real'] * 1000,
+                               'overhead' => $data['overhead'],
+                               'periods' => $periods
                        );
                }
 
@@ -662,9 +821,8 @@ class Profiler {
         * @param $stack Array:
         * @param $start Integer:
         * @return Integer
-        * @private
         */
-       function calltreeCount( $stack, $start ) {
+       protected function calltreeCount( $stack, $start ) {
                $level = $stack[$start][1];
                $count = 0;
                for ( $i = $start -1; $i >= 0 && $stack[$i][1] > $level; $i-- ) {
@@ -673,83 +831,12 @@ class Profiler {
                return $count;
        }
 
-       /**
-        * Log the whole profiling data into the database.
-        */
-       public function logData() {
-               global $wgProfilePerHost, $wgProfileToDatabase;
-
-               # Do not log anything if database is readonly (bug 5375)
-               if ( wfReadOnly() || !$wgProfileToDatabase ) {
-                       return;
-               }
-
-               $dbw = wfGetDB( DB_MASTER );
-               if ( !is_object( $dbw ) ) {
-                       return;
-               }
-
-               if ( $wgProfilePerHost ) {
-                       $pfhost = wfHostname();
-               } else {
-                       $pfhost = '';
-               }
-
-               try {
-                       $this->collateData();
-
-                       foreach ( $this->mCollated as $name => $elapsed ) {
-                               $eventCount = $this->mCalls[$name];
-                               $timeSum = (float)( $elapsed * 1000 );
-                               $memorySum = (float)$this->mMemory[$name];
-                               $name = substr( $name, 0, 255 );
-
-                               // Kludge
-                               $timeSum = $timeSum >= 0 ? $timeSum : 0;
-                               $memorySum = $memorySum >= 0 ? $memorySum : 0;
-
-                               $dbw->update( 'profiling',
-                                       array(
-                                               "pf_count=pf_count+{$eventCount}",
-                                               "pf_time=pf_time+{$timeSum}",
-                                               "pf_memory=pf_memory+{$memorySum}",
-                                       ),
-                                       array(
-                                               'pf_name' => $name,
-                                               'pf_server' => $pfhost,
-                                       ),
-                                       __METHOD__ );
-
-                               $rc = $dbw->affectedRows();
-                               if ( $rc == 0 ) {
-                                       $dbw->insert( 'profiling', array( 'pf_name' => $name, 'pf_count' => $eventCount,
-                                               'pf_time' => $timeSum, 'pf_memory' => $memorySum, 'pf_server' => $pfhost ),
-                                               __METHOD__, array( 'IGNORE' ) );
-                               }
-                               // When we upgrade to mysql 4.1, the insert+update
-                               // can be merged into just a insert with this construct added:
-                               //     "ON DUPLICATE KEY UPDATE ".
-                               //     "pf_count=pf_count + VALUES(pf_count), ".
-                               //     "pf_time=pf_time + VALUES(pf_time)";
-                       }
-               } catch ( DBError $e ) {}
-       }
-
-       /**
-        * Get the function name of the current profiling section
-        * @return
-        */
-       function getCurrentSection() {
-               $elt = end( $this->mWorkStack );
-               return $elt[0];
-       }
-
        /**
         * Add an entry in the debug log file
         *
         * @param string $s to output
         */
-       function debug( $s ) {
+       protected function debug( $s ) {
                if ( function_exists( 'wfDebug' ) ) {
                        wfDebug( $s );
                }
@@ -761,7 +848,7 @@ class Profiler {
         * @param string $group Group to send the message to
         * @param string $s to output
         */
-       function debugGroup( $group, $s ) {
+       protected function debugGroup( $group, $s ) {
                if ( function_exists( 'wfDebugLog' ) ) {
                        wfDebugLog( $group, $s );
                }
index e7ed6e3..67b6034 100644 (file)
  * @since 1.23
  */
 class ProfilerMwprof extends Profiler {
-
        // Message types
-
        const TYPE_SINGLE = 1;
        const TYPE_RUNNING = 2;
 
+       protected function collateOnly() {
+               return false;
+       }
+
        /**
         * Indicate that this Profiler subclass is persistent.
         *
@@ -62,18 +64,7 @@ class ProfilerMwprof extends Profiler {
         */
        public function profileIn( $inName ) {
                $this->mWorkStack[] = array( $inName, count( $this->mWorkStack ),
-                       $this->getTime(), $this->getTime( 'cpu' ) );
-       }
-
-       /**
-        * Produce an empty function report.
-        *
-        * ProfileMwprof does not provide a function report.
-        *
-        * @return string Empty string.
-        */
-       public function getFunctionReport() {
-               return '';
+                       $this->getTime(), $this->getTime( 'cpu' ), 0 );
        }
 
        /**
@@ -96,7 +87,7 @@ class ProfilerMwprof extends Profiler {
 
                $elapsedCpu = $this->getTime( 'cpu' ) - $inCpu;
                $elapsedWall = $this->getTime() - $inWall;
-               $this->updateEntry( $outName, $elapsedCpu, $elapsedWall );
+               $this->updateRunningEntry( $outName, $elapsedCpu, $elapsedWall );
                $this->updateTrxProfiling( $outName, $elapsedWall );
        }
 
@@ -107,7 +98,7 @@ class ProfilerMwprof extends Profiler {
         * @param float $elapsedCpu elapsed CPU time
         * @param float $elapsedWall elapsed wall-clock time
         */
-       public function updateEntry( $name, $elapsedCpu, $elapsedWall ) {
+       public function updateRunningEntry( $name, $elapsedCpu, $elapsedWall ) {
                // If this is the first measurement for this entry, store plain values.
                // Many profiled functions will only be called once per request.
                if ( !isset( $this->mCollated[$name] ) ) {
@@ -138,6 +129,77 @@ class ProfilerMwprof extends Profiler {
                $entry['wall']->push( $elapsedWall );
        }
 
+       /**
+        * Produce an empty function report.
+        *
+        * ProfileMwprof does not provide a function report.
+        *
+        * @return string Empty string.
+        */
+       public function getFunctionReport() {
+               return '';
+       }
+
+       /**
+        * @return array
+        */
+       public function getRawData() {
+               // This method is called before shutdown in the footer method on Skins.
+               // If some outer methods have not yet called wfProfileOut(), work around
+               // that by clearing anything in the work stack to just the "-total" entry.
+               if ( count( $this->mWorkStack ) > 1 ) {
+                       $oldWorkStack = $this->mWorkStack;
+                       $this->mWorkStack = array( $this->mWorkStack[0] ); // just the "-total" one
+               } else {
+                       $oldWorkStack = null;
+               }
+               $this->close();
+               // If this trick is used, then the old work stack is swapped back afterwards.
+               // This means that logData() will still make use of all the method data since
+               // the missing wfProfileOut() calls should be made by the time it is called.
+               if ( $oldWorkStack ) {
+                       $this->mWorkStack = $oldWorkStack;
+               }
+
+               $totalWall = 0.0;
+               $profile = array();
+               foreach ( $this->mCollated as $fname => $data ) {
+                       if ( $data['count'] == 1 ) {
+                               $profile[] = array(
+                                       'name' => $fname,
+                                       'calls' => $data['count'],
+                                       'elapsed' => $data['wall'] * 1000,
+                                       'memory' => 0, // not supported
+                                       'min' => $data['wall'] * 1000,
+                                       'max' => $data['wall'] * 1000,
+                                       'overhead' => 0, // not supported
+                                       'periods' => array() // not supported
+                               );
+                               $totalWall += $data['wall'];
+                       } else {
+                               $profile[] = array(
+                                       'name' => $fname,
+                                       'calls' => $data['count'],
+                                       'elapsed' => $data['wall']->n * $data['wall']->getMean() * 1000,
+                                       'memory' => 0, // not supported
+                                       'min' => $data['wall']->min * 1000,
+                                       'max' => $data['wall']->max * 1000,
+                                       'overhead' => 0, // not supported
+                                       'periods' => array() // not supported
+                               );
+                               $totalWall += $data['wall']->n * $data['wall']->getMean();
+                       }
+               }
+               $totalWall = $totalWall * 1000;
+
+               foreach ( $profile as &$item ) {
+                       $item['percent'] = $totalWall ? 100 * $item['elapsed'] / $totalWall : 0;
+                       $z+= $item['percent'];
+               }
+
+               return $profile;
+       }
+
        /**
         * Serialize profiling data and send to a profiling data aggregator.
         *
@@ -151,6 +213,11 @@ class ProfilerMwprof extends Profiler {
 
                $this->close();
 
+               if ( !function_exists( 'socket_create' ) ) {
+                       #trigger_error( __METHOD__ . ": function \"socket_create\" not found." );
+                       return; // avoid fatal
+               }
+
                $sock = socket_create( AF_INET, SOCK_DGRAM, SOL_UDP );
                socket_connect( $sock, $wgUDPProfilerHost, $wgUDPProfilerPort );
                $bufferLength = 0;
diff --git a/includes/profiler/ProfilerSimple.php b/includes/profiler/ProfilerSimple.php
deleted file mode 100644 (file)
index 6331a30..0000000
+++ /dev/null
@@ -1,134 +0,0 @@
-<?php
-/**
- * Base class for simple profiling.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @ingroup Profiler
- */
-
-/**
- * Simple profiler base class.
- * @todo document methods (?)
- * @ingroup Profiler
- */
-class ProfilerSimple extends Profiler {
-       var $mMinimumTime = 0;
-
-       var $errorEntry;
-
-       public function getZeroEntry() {
-               return array(
-                       'cpu'     => 0.0,
-                       'cpu_sq'  => 0.0,
-                       'real'    => 0.0,
-                       'real_sq' => 0.0,
-                       'count'   => 0
-               );
-       }
-
-       public function getErrorEntry() {
-               $entry = $this->getZeroEntry();
-               $entry['count'] = 1;
-               return $entry;
-       }
-
-       public function updateEntry( $name, $elapsedCpu, $elapsedReal ) {
-               $entry =& $this->mCollated[$name];
-               if ( !is_array( $entry ) ) {
-                       $entry = $this->getZeroEntry();
-                       $this->mCollated[$name] =& $entry;
-               }
-               $entry['cpu'] += $elapsedCpu;
-               $entry['cpu_sq'] += $elapsedCpu * $elapsedCpu;
-               $entry['real'] += $elapsedReal;
-               $entry['real_sq'] += $elapsedReal * $elapsedReal;
-               $entry['count']++;
-       }
-
-       public function isPersistent() {
-               /* Implement in output subclasses */
-               return false;
-       }
-
-       protected function addInitialStack() {
-               $this->errorEntry = $this->getErrorEntry();
-
-               $initialTime = $this->getInitialTime();
-               $initialCpu = $this->getInitialTime( 'cpu' );
-               if ( $initialTime !== null && $initialCpu !== null ) {
-                       $this->mWorkStack[] = array( '-total', 0, $initialTime, $initialCpu );
-                       $this->mWorkStack[] = array( '-setup', 1, $initialTime, $initialCpu );
-
-                       $this->profileOut( '-setup' );
-               } else {
-                       $this->profileIn( '-total' );
-               }
-       }
-
-       function setMinimum( $min ) {
-               $this->mMinimumTime = $min;
-       }
-
-       function profileIn( $functionname ) {
-               global $wgDebugFunctionEntry;
-               if ( $wgDebugFunctionEntry ) {
-                       $this->debug( str_repeat( ' ', count( $this->mWorkStack ) ) . 'Entering ' . $functionname . "\n" );
-               }
-               $this->mWorkStack[] = array( $functionname, count( $this->mWorkStack ), $this->getTime(), $this->getTime( 'cpu' ) );
-       }
-
-       function profileOut( $functionname ) {
-               global $wgDebugFunctionEntry;
-
-               if ( $wgDebugFunctionEntry ) {
-                       $this->debug( str_repeat( ' ', count( $this->mWorkStack ) - 1 ) . 'Exiting ' . $functionname . "\n" );
-               }
-
-               list( $ofname, /* $ocount */, $ortime, $octime ) = array_pop( $this->mWorkStack );
-
-               if ( !$ofname ) {
-                       $this->debugGroup( 'profileerror', "Profiling error: $functionname" );
-               } else {
-                       if ( $functionname == 'close' ) {
-                               if ( $ofname != '-total' ) {
-                                       $message = "Profile section ended by close(): {$ofname}";
-                                       $this->debugGroup( 'profileerror', $message );
-                                       $this->mCollated[$message] = $this->errorEntry;
-                               }
-                               $functionname = $ofname;
-                       } elseif ( $ofname != $functionname ) {
-                               $message = "Profiling error: in({$ofname}), out($functionname)";
-                               $this->debugGroup( 'profileerror', $message );
-                               $this->mCollated[$message] = $this->errorEntry;
-                       }
-                       $elapsedcpu = $this->getTime( 'cpu' ) - $octime;
-                       $elapsedreal = $this->getTime() - $ortime;
-                       $this->updateEntry( $functionname, $elapsedcpu, $elapsedreal );
-                       $this->updateTrxProfiling( $functionname, $elapsedreal );
-               }
-       }
-
-       public function getFunctionReport() {
-               /* Implement in output subclasses */
-               return '';
-       }
-
-       public function logData() {
-               /* Implement in subclasses */
-       }
-}
diff --git a/includes/profiler/ProfilerSimpleDB.php b/includes/profiler/ProfilerSimpleDB.php
new file mode 100644 (file)
index 0000000..e35eec1
--- /dev/null
@@ -0,0 +1,110 @@
+<?php
+/**
+ * Profiler storing information in the DB.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup Profiler
+ */
+
+/**
+ * $wgProfiler['class'] = 'ProfilerSimpleDB';
+ *
+ * @ingroup Profiler
+ */
+class ProfilerSimpleDB extends Profiler {
+       protected function collateOnly() {
+               return true;
+       }
+
+       public function isPersistent() {
+               return true;
+       }
+
+       /**
+        * Log the whole profiling data into the database.
+        */
+       public function logData() {
+               global $wgProfilePerHost;
+
+               # Do not log anything if database is readonly (bug 5375)
+               if ( wfReadOnly() ) {
+                       return;
+               }
+
+               if ( $wgProfilePerHost ) {
+                       $pfhost = wfHostname();
+               } else {
+                       $pfhost = '';
+               }
+
+               try {
+                       $this->collateData();
+
+                       $dbw = wfGetDB( DB_MASTER );
+                       $useTrx = ( $dbw->getType() === 'sqlite' ); // much faster
+                       if ( $useTrx ) {
+                               $dbw->begin();
+                       }
+                       foreach ( $this->mCollated as $name => $data ) {
+                               $eventCount = $data['count'];
+                               $timeSum = (float)( $data['real'] * 1000 );
+                               $memorySum = (float)$data['memory'];
+                               $name = substr( $name, 0, 255 );
+
+                               // Kludge
+                               $timeSum = $timeSum >= 0 ? $timeSum : 0;
+                               $memorySum = $memorySum >= 0 ? $memorySum : 0;
+
+                               $dbw->update( 'profiling',
+                                       array(
+                                               "pf_count=pf_count+{$eventCount}",
+                                               "pf_time=pf_time+{$timeSum}",
+                                               "pf_memory=pf_memory+{$memorySum}",
+                                       ),
+                                       array(
+                                               'pf_name' => $name,
+                                               'pf_server' => $pfhost,
+                                       ),
+                                       __METHOD__ );
+
+                               $rc = $dbw->affectedRows();
+                               if ( $rc == 0 ) {
+                                       $dbw->insert( 'profiling',
+                                               array(
+                                                       'pf_name' => $name,
+                                                       'pf_count' => $eventCount,
+                                                       'pf_time' => $timeSum,
+                                                       'pf_memory' => $memorySum,
+                                                       'pf_server' => $pfhost
+                                               ),
+                                               __METHOD__,
+                                               array( 'IGNORE' )
+                                       );
+                               }
+                               // When we upgrade to mysql 4.1, the insert+update
+                               // can be merged into just a insert with this construct added:
+                               //     "ON DUPLICATE KEY UPDATE ".
+                               //     "pf_count=pf_count + VALUES(pf_count), ".
+                               //     "pf_time=pf_time + VALUES(pf_time)";
+                       }
+                       if ( $useTrx ) {
+                               $dbw->commit();
+                       }
+               } catch ( DBError $e ) {}
+       }
+}
index 1d57ea8..975d260 100644 (file)
@@ -31,7 +31,7 @@
  *
  * @ingroup Profiler
  */
-class ProfilerSimpleText extends ProfilerSimple {
+class ProfilerSimpleText extends Profiler {
        public $visible = false; /* Show as <PRE> or <!-- ? */
        static private $out;
 
@@ -42,6 +42,10 @@ class ProfilerSimpleText extends ProfilerSimple {
                parent::__construct( $profileConfig );
        }
 
+       protected function collateOnly() {
+               return true;
+       }
+
        public function logData() {
                if ( $this->mTemplated ) {
                        $this->close();
index 5588d1e..8d7f11c 100644 (file)
  */
 
 /**
- * Execution trace
+ * Execution trace profiler
  * @todo document methods (?)
  * @ingroup Profiler
  */
-class ProfilerSimpleTrace extends ProfilerSimple {
-       var $trace = "Beginning trace: \n";
-       var $memory = 0;
+class ProfilerSimpleTrace extends Profiler {
+       protected $trace = "Beginning trace: \n";
+       protected $memory = 0;
 
-       function profileIn( $functionname ) {
+       protected function collateOnly() {
+               return true;
+       }
+
+       public function profileIn( $functionname ) {
                parent::profileIn( $functionname );
+
                $this->trace .= "         " . sprintf( "%6.1f", $this->memoryDiff() ) .
-                               str_repeat( " ", count( $this->mWorkStack ) ) . " > " . $functionname . "\n";
+                       str_repeat( " ", count( $this->mWorkStack ) ) . " > " . $functionname . "\n";
        }
 
-       function profileOut( $functionname ) {
-               global $wgDebugFunctionEntry;
-
-               if ( $wgDebugFunctionEntry ) {
-                       $this->debug( str_repeat( ' ', count( $this->mWorkStack ) - 1 ) . 'Exiting ' . $functionname . "\n" );
-               }
+       public function profileOut( $functionname ) {
+               $item = end( $this->mWorkStack );
 
-               list( $ofname, /* $ocount */, $ortime ) = array_pop( $this->mWorkStack );
+               parent::profileOut( $functionname );
 
-               if ( !$ofname ) {
+               if ( !$item ) {
                        $this->trace .= "Profiling error: $functionname\n";
                } else {
+                       list( $ofname, /* $ocount */, $ortime ) = $item;
                        if ( $functionname == 'close' ) {
                                $message = "Profile section ended by close(): {$ofname}";
                                $functionname = $ofname;
                                $this->trace .= $message . "\n";
-                       }
-                       elseif ( $ofname != $functionname ) {
+                       } elseif ( $ofname != $functionname ) {
                                $this->trace .= "Profiling error: in({$ofname}), out($functionname)";
                        }
                        $elapsedreal = $this->getTime() - $ortime;
                        $this->trace .= sprintf( "%03.6f %6.1f", $elapsedreal, $this->memoryDiff() ) .
-                                       str_repeat( " ", count( $this->mWorkStack ) + 1 ) . " < " . $functionname . "\n";
-
-                       $this->updateTrxProfiling( $functionname, $elapsedreal );
+                               str_repeat( " ", count( $this->mWorkStack ) + 1 ) . " < " . $functionname . "\n";
                }
        }
 
-       function memoryDiff() {
+       protected function memoryDiff() {
                $diff = memory_get_usage() - $this->memory;
                $this->memory = memory_get_usage();
                return $diff / 1024;
        }
 
-       function logData() {
-               if ( PHP_SAPI === 'cli' ) {
-                       print "<!-- \n {$this->trace} \n -->";
-               } elseif ( $this->getContentType() === 'text/html' ) {
-                       print "<!-- \n {$this->trace} \n -->";
-               } elseif ( $this->getContentType() === 'text/javascript' ) {
-                       print "\n/*\n {$this->trace}\n*/";
-               } elseif ( $this->getContentType() === 'text/css' ) {
-                       print "\n/*\n {$this->trace}\n*/";
+       public function logData() {
+               if ( $this->mTemplated ) {
+                       if ( PHP_SAPI === 'cli' ) {
+                               print "<!-- \n {$this->trace} \n -->";
+                       } elseif ( $this->getContentType() === 'text/html' ) {
+                               print "<!-- \n {$this->trace} \n -->";
+                       } elseif ( $this->getContentType() === 'text/javascript' ) {
+                               print "\n/*\n {$this->trace}\n*/";
+                       } elseif ( $this->getContentType() === 'text/css' ) {
+                               print "\n/*\n {$this->trace}\n*/";
+                       }
                }
        }
 }
index 982c6ae..dfe923d 100644 (file)
  *  http://git.wikimedia.org/tree/operations%2Fsoftware.git/master/udpprofile)
  * @ingroup Profiler
  */
-class ProfilerSimpleUDP extends ProfilerSimple {
+class ProfilerSimpleUDP extends Profiler {
+       protected function collateOnly() {
+               return true;
+       }
+
        public function isPersistent() {
                return true;
        }
@@ -37,11 +41,6 @@ class ProfilerSimpleUDP extends ProfilerSimple {
 
                $this->close();
 
-               if ( isset( $this->mCollated['-total'] ) && $this->mCollated['-total']['real'] < $this->mMinimumTime ) {
-                       # Less than minimum, ignore
-                       return;
-               }
-
                if ( !function_exists( 'socket_create' ) ) {
                        # Sockets are not enabled
                        return;
index 022e317..066ecbe 100644 (file)
@@ -29,9 +29,9 @@ interface RCFeedEngine {
         * Sends some text to the specified live feed.
         *
         * @see RecentChange::cleanupForIRC
-        * @param array $feed The feed, as configured in an associative array.
-        * @param string $line The text to send.
-        * @return boolean success
+        * @param array $feed The feed, as configured in an associative array
+        * @param string $line The text to send
+        * @return bool success
         */
        public function send( array $feed, $line );
 }
index 12c452a..eac6a02 100644 (file)
@@ -98,21 +98,26 @@ class ResourceLoader {
                // Set modules' dependencies
                $modulesWithDeps = array();
                foreach ( $res as $row ) {
-                       $this->getModule( $row->md_module )->setFileDependencies( $skin,
-                               FormatJson::decode( $row->md_deps, true )
-                       );
-                       $modulesWithDeps[] = $row->md_module;
+                       $module = $this->getModule( $row->md_module );
+                       if ( $module ) {
+                               $module->setFileDependencies( $skin, FormatJson::decode( $row->md_deps, true ) );
+                               $modulesWithDeps[] = $row->md_module;
+                       }
                }
 
                // Register the absence of a dependency row too
                foreach ( array_diff( $modules, $modulesWithDeps ) as $name ) {
-                       $this->getModule( $name )->setFileDependencies( $skin, array() );
+                       $module = $this->getModule( $name );
+                       if ( $module ) {
+                               $this->getModule( $name )->setFileDependencies( $skin, array() );
+                       }
                }
 
                // Get message blob mtimes. Only do this for modules with messages
                $modulesWithMessages = array();
                foreach ( $modules as $name ) {
-                       if ( count( $this->getModule( $name )->getMessages() ) ) {
+                       $module = $this->getModule( $name );
+                       if ( $module && count( $module->getMessages() ) ) {
                                $modulesWithMessages[] = $name;
                        }
                }
@@ -124,13 +129,18 @@ class ResourceLoader {
                                ), __METHOD__
                        );
                        foreach ( $res as $row ) {
-                               $this->getModule( $row->mr_resource )->setMsgBlobMtime( $lang,
-                                       wfTimestamp( TS_UNIX, $row->mr_timestamp ) );
-                               unset( $modulesWithoutMessages[$row->mr_resource] );
+                               $module = $this->getModule( $row->mr_resource );
+                               if ( $module ) {
+                                       $module->setMsgBlobMtime( $lang, wfTimestamp( TS_UNIX, $row->mr_timestamp ) );
+                                       unset( $modulesWithoutMessages[$row->mr_resource] );
+                               }
                        }
                }
                foreach ( array_keys( $modulesWithoutMessages ) as $name ) {
-                       $this->getModule( $name )->setMsgBlobMtime( $lang, 0 );
+                       $module = $this->getModule( $name );
+                       if ( $module ) {
+                               $module->setMsgBlobMtime( $lang, 0 );
+                       }
                }
        }
 
@@ -269,21 +279,19 @@ class ResourceLoader {
                        }
 
                        // Attach module
-                       if ( is_object( $info ) ) {
-                               // Old calling convention
-                               // Validate the input
-                               if ( !( $info instanceof ResourceLoaderModule ) ) {
-                                       wfProfileOut( __METHOD__ );
-                                       throw new MWException( 'ResourceLoader invalid module error. ' .
-                                               'Instances of ResourceLoaderModule expected.' );
-                               }
-
+                       if ( $info instanceof ResourceLoaderModule ) {
                                $this->moduleInfos[$name] = array( 'object' => $info );
                                $info->setName( $name );
                                $this->modules[$name] = $info;
-                       } else {
+                       } elseif ( is_array( $info ) ) {
                                // New calling convention
                                $this->moduleInfos[$name] = $info;
+                       } else {
+                               wfProfileOut( __METHOD__ );
+                               throw new MWException(
+                                       'ResourceLoader module info type error for module \'' . $name .
+                                       '\': expected ResourceLoaderModule or array (got: ' . gettype( $info ) . ')'
+                               );
                        }
                }
 
@@ -400,8 +408,13 @@ class ResourceLoader {
        /**
         * Get the ResourceLoaderModule object for a given module name.
         *
+        * If an array of module parameters exists but a ResourceLoaderModule object has not
+        * yet been instantiated, this method will instantiate and cache that object such that
+        * subsequent calls simply return the same object.
+        *
         * @param string $name Module name
-        * @return ResourceLoaderModule if module has been registered, null otherwise
+        * @return ResourceLoaderModule|null If module has been registered, return a
+        *  ResourceLoaderModule instance. Otherwise, return null.
         */
        public function getModule( $name ) {
                if ( !isset( $this->modules[$name] ) ) {
@@ -471,8 +484,8 @@ class ResourceLoader {
                $modules = array();
                $missing = array();
                foreach ( $context->getModules() as $name ) {
-                       if ( isset( $this->moduleInfos[$name] ) ) {
-                               $module = $this->getModule( $name );
+                       $module = $this->getModule( $name );
+                       if ( $module ) {
                                // Do not allow private modules to be loaded from the web.
                                // This is a security issue, see bug 34907.
                                if ( $module->getGroup() === 'private' ) {
@@ -782,9 +795,11 @@ class ResourceLoader {
                                                $scripts = $module->getScriptURLsForDebug( $context );
                                        } else {
                                                $scripts = $module->getScript( $context );
-                                               if ( is_string( $scripts ) && strlen( $scripts ) && substr( $scripts, -1 ) !== ';' ) {
-                                                       // bug 27054: Append semicolon to prevent weird bugs
-                                                       // caused by files not terminating their statements right
+                                               // rtrim() because there are usually a few line breaks after the last ';'.
+                                               // A new line at EOF, a new line added by ResourceLoaderFileModule::readScriptFiles, etc.
+                                               if ( is_string( $scripts ) && strlen( $scripts ) && substr( rtrim( $scripts ), -1 ) !== ';' ) {
+                                                       // Append semicolon to prevent weird bugs caused by files not
+                                                       // terminating their statements right (bug 27054)
                                                        $scripts .= ";\n";
                                                }
                                        }
@@ -920,7 +935,7 @@ class ResourceLoader {
         */
        public static function makeLoaderImplementScript( $name, $scripts, $styles, $messages ) {
                if ( is_string( $scripts ) ) {
-                       $scripts = new XmlJsCode( "function () {\n{$scripts}\n}" );
+                       $scripts = new XmlJsCode( "function ( $, jQuery ) {\n{$scripts}\n}" );
                } elseif ( !is_array( $scripts ) ) {
                        throw new MWException( 'Invalid scripts error. Array of URLs or string of code expected.' );
                }
index 5ee6bd2..005081c 100644 (file)
@@ -176,7 +176,11 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule {
                                continue;
                        }
 
-                       if ( !count( $data['dependencies'] ) && $data['group'] === null && $data['source'] === 'local' ) {
+                       if (
+                               !count( $data['dependencies'] ) &&
+                               $data['group'] === null &&
+                               $data['source'] === 'local'
+                       ) {
                                // Modules without dependencies, a group or a foreign source;
                                // call mw.loader.register(name, timestamp)
                                $registrations[] = array( $name, $data['version'] );
@@ -265,7 +269,7 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule {
        public function getScript( ResourceLoaderContext $context ) {
                global $IP, $wgLegacyJavaScriptGlobals;
 
-               $out = file_get_contents( "$IP/resources/startup.js" );
+               $out = file_get_contents( "$IP/resources/src/startup.js" );
                if ( $context->getOnly() === 'scripts' ) {
 
                        // Startup function
@@ -274,7 +278,8 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule {
                        // Fix indentation
                        $registrations = str_replace( "\n", "\n\t", trim( $registrations ) );
                        $out .= "var startUp = function () {\n" .
-                               "\tmw.config = new " . Xml::encodeJsCall( 'mw.Map', array( $wgLegacyJavaScriptGlobals ) ) . "\n" .
+                               "\tmw.config = new " .
+                               Xml::encodeJsCall( 'mw.Map', array( $wgLegacyJavaScriptGlobals ) ) . "\n" .
                                "\t$registrations\n" .
                                "\t" . Xml::encodeJsCall( 'mw.config.set', array( $configuration ) ) .
                                "};\n";
@@ -315,7 +320,7 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule {
 
                $time = max(
                        wfTimestamp( TS_UNIX, $wgCacheEpoch ),
-                       filemtime( "$IP/resources/startup.js" ),
+                       filemtime( "$IP/resources/src/startup.js" ),
                        $this->getHashMtime( $context )
                );
 
index 4505ee1..b0b2253 100644 (file)
@@ -33,10 +33,10 @@ class RevisionDeleteUser {
 
        /**
         * Update *_deleted bitfields in various tables to hide or unhide usernames
-        * @param  $name String username
-        * @param  $userId Int user id
-        * @param  $op String operator '|' or '&'
-        * @param  $dbw null|DatabaseBase, if you happen to have one lying around
+        * @param $name String username
+        * @param $userId Int user id
+        * @param $op String operator '|' or '&'
+        * @param $dbw null|DatabaseBase, if you happen to have one lying around
         * @return bool
         */
        private static function setUsernameBitfields( $name, $userId, $op, $dbw ) {
index 02e1dda..bea8460 100644 (file)
@@ -207,7 +207,7 @@ class RevisionDeleter {
         * so that this key can be used instead.
         *
         * @param $title Title
-        * @param  $revid
+        * @param $revid
         * @return bool|mixed
         */
        public static function checkRevisionExistence( $title, $revid ) {
index 507a520..687f9a4 100644 (file)
@@ -37,7 +37,7 @@ class SearchEngine {
        var $namespaces = array( NS_MAIN );
        protected $showSuggestion = true;
 
-       /// Feature values
+       /** @var Array Feature values */
        protected $features = array();
 
        /**
index 11141e0..7bf933c 100644 (file)
@@ -193,7 +193,7 @@ class SiteSQLStore implements SiteStore {
         *
         * @since 1.22
         *
-        * @param Site
+        * @param Site $site
         *
         * @return ORMRow
         */
index 14ac401..bc0b8ff 100644 (file)
@@ -151,8 +151,12 @@ abstract class ChangesListSpecialPage extends SpecialPage {
         * @return array Map of filter URL param names to properties (msg/default)
         */
        protected function getCustomFilters() {
-               // @todo Fire a Special{$this->getName()}Filters hook here
-               return array();
+               if ( $this->customFilters === null ) {
+                       $this->customFilters = array();
+                       wfRunHooks( 'ChangesListSpecialPageFilters', array( $this, &$this->customFilters ) );
+               }
+
+               return $this->customFilters;
        }
 
        /**
@@ -286,13 +290,11 @@ abstract class ChangesListSpecialPage extends SpecialPage {
                        ''
                );
 
-               // @todo Fire a Special{$this->getName()}Query hook here
-               // @todo Uncomment and document
-               // if ( !wfRunHooks( 'ChangesListSpecialPageQuery',
-               //      array( &$tables, &$fields, &$conds, &$query_options, &$join_conds, $opts ) )
-               // ) {
-               //      return false;
-               // }
+               if ( !wfRunHooks( 'ChangesListSpecialPageQuery',
+                       array( $this->getName(), &$tables, &$fields, &$conds, &$query_options, &$join_conds, $opts ) )
+               ) {
+                       return false;
+               }
 
                $dbr = $this->getDB();
 
index 90f82e0..7496262 100644 (file)
@@ -113,7 +113,7 @@ abstract class FormSpecialPage extends SpecialPage {
 
        /**
         * Process the form on POST submission.
-        * @param  $data Array
+        * @param $data Array
         * @return Bool|Array true for success, false for didn't-try, array of errors on failure
         */
        abstract public function onSubmit( array $data );
index d9340b4..f7fcc7a 100644 (file)
@@ -476,8 +476,6 @@ class SpecialPage {
         * @deprecated in 1.23, use SpecialPage::getPageTitle
         */
        function getTitle( $subpage = false ) {
-               wfDeprecated( __METHOD__, '1.23' );
-
                return $this->getPageTitle( $subpage );
        }
 
index dd6bec2..f739d3b 100644 (file)
@@ -97,7 +97,8 @@ class ActiveUsersPager extends UsersPager {
                        'qcc_type' => 'activeusers',
                        'qcc_namespace' => NS_USER,
                        'user_name = qcc_title',
-                       'rc_user_text = qcc_title'
+                       'rc_user_text = qcc_title',
+                       'rc_type != ' . $dbr->addQuotes( RC_EXTERNAL ) // Don't count wikidata.
                );
                if ( $this->requestedUser != '' ) {
                        $conds[] = 'qcc_title >= ' . $dbr->addQuotes( $this->requestedUser );
@@ -340,6 +341,7 @@ class SpecialActiveUsers extends SpecialPage {
                        array( 'rc_user_text', 'lastedittime' => 'MAX(rc_timestamp)' ),
                        array(
                                'rc_user > 0', // actual accounts
+                               'rc_type != ' . $dbw->addQuotes( RC_EXTERNAL ), // no wikidata
                                'rc_log_type IS NULL OR rc_log_type != ' . $dbw->addQuotes( 'newusers' ),
                                'rc_timestamp >= ' . $dbw->addQuotes( $dbw->timestamp( $sTimestamp ) ),
                                'rc_timestamp <= ' . $dbw->addQuotes( $dbw->timestamp( $eTimestamp ) )
index 97e7238..70949d4 100644 (file)
@@ -97,7 +97,7 @@ class SpecialAllpages extends IncludableSpecialPage {
                $namespaces = $this->getContext()->getLanguage()->getNamespaces();
 
                $out->setPageTitle(
-                       ( $namespace > 0 && in_array( $namespace, array_keys( $namespaces ) ) ) ?
+                       ( $namespace > 0 && array_key_exists( $namespace, $namespaces ) ) ?
                                $this->msg( 'allinnamespace', str_replace( '_', ' ', $namespaces[$namespace] ) ) :
                                $this->msg( 'allarticles' )
                );
@@ -375,7 +375,7 @@ class SpecialAllpages extends IncludableSpecialPage {
 
                if ( !$fromList || !$toList ) {
                        $out = $this->msg( 'allpagesbadtitle' )->parseAsBlock();
-               } elseif ( !in_array( $namespace, array_keys( $namespaces ) ) ) {
+               } elseif ( !array_key_exists( $namespace, $namespaces ) ) {
                        // Show errormessage and reset to NS_MAIN
                        $out = $this->msg( 'allpages-bad-ns', $namespace )->parse();
                        $namespace = NS_MAIN;
index 57f23d3..57637c9 100644 (file)
@@ -32,19 +32,19 @@ class SpecialBlock extends FormSpecialPage {
         * or as subpage (Special:Block/Foo) */
        protected $target;
 
-       /// @var Block::TYPE_ constant
+       /** @var Integer Block::TYPE_ constant */
        protected $type;
 
-       /// @var  User|String the previous block target
+       /** @var User|String the previous block target */
        protected $previousTarget;
 
-       /// @var Bool whether the previous submission of the form asked for HideUser
+       /** @var Bool whether the previous submission of the form asked for HideUser */
        protected $requestedHideUser;
 
-       /// @var Bool
+       /** @var Bool */
        protected $alreadyBlocked;
 
-       /// @var Array
+       /** @var Array */
        protected $preErrors = array();
 
        public function __construct() {
@@ -593,8 +593,8 @@ class SpecialBlock extends FormSpecialPage {
 
        /**
         * Given the form data, actually implement a block
-        * @param  $data Array
-        * @param  $context IContextSource
+        * @param $data Array
+        * @param $context IContextSource
         * @return Bool|String
         */
        public static function processForm( array $data, IContextSource $context ) {
@@ -947,7 +947,7 @@ class SpecialBlock extends FormSpecialPage {
 
        /**
         * Process the form on POST submission.
-        * @param  $data Array
+        * @param $data Array
         * @return Bool|Array true for success, false for didn't-try, array of errors on failure
         */
        public function onSubmit( array $data ) {
index 51606b7..2c91805 100644 (file)
@@ -244,6 +244,16 @@ class SpecialContributions extends IncludableSpecialPage {
         */
        protected function contributionsSub( $userObj ) {
                if ( $userObj->isAnon() ) {
+                       // Show a warning message that the user being searched for doesn't exists
+                       if ( !User::isIP( $userObj->getName() ) ) {
+                               $this->getOutput()->wrapWikiMsg(
+                                       "<div class=\"mw-userpage-userdoesnotexist error\">\n\$1\n</div>",
+                                       array(
+                                               'contributions-userdoesnotexist',
+                                               wfEscapeWikiText( $userObj->getName() ),
+                                       )
+                               );
+                       }
                        $user = htmlspecialchars( $userObj->getName() );
                } else {
                        $user = Linker::link( $userObj->getUserPage(), htmlspecialchars( $userObj->getName() ) );
index c867f06..fbddfbd 100644 (file)
@@ -138,6 +138,7 @@ class SpecialEmailUser extends UnlistedSpecialPage {
                $ret = self::getTarget( $this->mTarget );
                if ( !$ret instanceof User ) {
                        if ( $this->mTarget != '' ) {
+                               // Messages used here: notargettext, noemailtext, nowikiemailtext
                                $ret = ( $ret == 'notarget' ) ? 'emailnotarget' : ( $ret . 'text' );
                                $out->wrapWikiMsg( "<p class='error'>$1</p>", $ret );
                        }
@@ -305,6 +306,7 @@ class SpecialEmailUser extends UnlistedSpecialPage {
 
                $target = self::getTarget( $data['Target'] );
                if ( !$target instanceof User ) {
+                       // Messages used here: notargettext, noemailtext, nowikiemailtext
                        return $context->msg( $target . 'text' )->parseAsBlock();
                }
 
index 29722c8..1bd4228 100644 (file)
@@ -448,8 +448,8 @@ class ImportReporter extends ContextSource {
         * @param Title $title
         * @param Title $origTitle
         * @param int $revisionCount
-        * @param  $successCount
-        * @param  $pageInfo
+        * @param $successCount
+        * @param $pageInfo
         * @return void
         */
        function reportPage( $title, $origTitle, $revisionCount, $successCount, $pageInfo ) {
index 82a4f70..31034f9 100644 (file)
@@ -132,6 +132,88 @@ class SpecialListGroupRights extends SpecialPage {
                        ) );
                }
                $out->addHTML( Xml::closeElement( 'table' ) );
+               $this->outputNamespaceProtectionInfo();
+       }
+
+       private function outputNamespaceProtectionInfo() {
+               global $wgNamespaceProtection, $wgParser, $wgContLang;
+               $out = $this->getOutput();
+
+               if ( count( $wgNamespaceProtection ) == 0 ) {
+                       return;
+               }
+
+               $header = $this->msg( 'listgrouprights-namespaceprotection-header' )->parse();
+               $out->addHTML(
+                       Html::rawElement( 'h2', array(), Html::element( 'span', array(
+                               'class' => 'mw-headline',
+                               'id' => $wgParser->guessSectionNameFromWikiText( $header )
+                       ), $header ) ) .
+                       Xml::openElement( 'table', array( 'class' => 'wikitable' ) ) .
+                       Html::element(
+                               'th',
+                               array(),
+                               $this->msg( 'listgrouprights-namespaceprotection-namespace' )->text()
+                       ) .
+                       Html::element(
+                               'th',
+                               array(),
+                               $this->msg( 'listgrouprights-namespaceprotection-restrictedto' )->text()
+                       )
+               );
+
+               ksort( $wgNamespaceProtection );
+               foreach ( $wgNamespaceProtection as $namespace => $rights ) {
+                       if ( !in_array( $namespace, MWNamespace::getValidNamespaces() ) ) {
+                               continue;
+                       }
+
+                       if ( $namespace == NS_MAIN ) {
+                               $namespaceText = $this->msg( 'blanknamespace' )->text();
+                       } else {
+                               $namespaceText = $wgContLang->convertNamespace( $namespace );
+                       }
+
+                       $out->addHTML(
+                               Xml::openElement( 'tr' ) .
+                               Html::rawElement(
+                                       'td',
+                                       array(),
+                                       Linker::link(
+                                               SpecialPage::getTitleFor( 'Allpages' ),
+                                               $namespaceText,
+                                               array(),
+                                               array( 'namespace' => $namespace )
+                                       )
+                               ) .
+                               Xml::openElement( 'td' ) . Xml::openElement( 'ul' )
+                       );
+
+                       if ( !is_array( $rights ) ) {
+                               $rights = array( $rights );
+                       }
+
+                       foreach ( $rights as $right ) {
+                               $out->addHTML(
+                                       Html::rawElement( 'li', array(), $this->msg(
+                                               'listgrouprights-right-display',
+                                               User::getRightDescription( $right ),
+                                               Html::element(
+                                                       'span',
+                                                       array( 'class' => 'mw-listgrouprights-right-name' ),
+                                                       $right
+                                               )
+                                       )->parse() )
+                               );
+                       }
+
+                       $out->addHTML(
+                               Xml::closeElement( 'ul' ) .
+                               Xml::closeElement( 'td' ) .
+                               Xml::closeElement( 'tr' )
+                       );
+               }
+               $out->addHTML( Xml::closeElement( 'table' ) );
        }
 
        /**
index 8137651..7ad39d2 100644 (file)
@@ -36,6 +36,9 @@ class SpecialPrefixindex extends SpecialAllpages {
 
        protected $hideRedirects = false;
 
+       // number of columns in output table
+       protected $columns = 3;
+
        // Inherit $maxPerPage
 
        function __construct() {
@@ -63,10 +66,11 @@ class SpecialPrefixindex extends SpecialAllpages {
                $namespace = (int)$ns; // if no namespace given, use 0 (NS_MAIN).
                $this->hideRedirects = $request->getBool( 'hideredirects', $this->hideRedirects );
                $this->stripPrefix = $request->getBool( 'stripprefix', $this->stripPrefix );
+               $this->columns = $request->getInt( 'columns', $this->columns );
 
                $namespaces = $wgContLang->getNamespaces();
                $out->setPageTitle(
-                       ( $namespace > 0 && in_array( $namespace, array_keys( $namespaces ) ) )
+                       ( $namespace > 0 && array_key_exists( $namespace, $namespaces ) )
                                ? $this->msg( 'prefixindex-namespace', str_replace( '_', ' ', $namespaces[$namespace] ) )
                                : $this->msg( 'prefixindex' )
                );
@@ -166,7 +170,7 @@ class SpecialPrefixindex extends SpecialAllpages {
 
                if ( !$prefixList || !$fromList ) {
                        $out = $this->msg( 'allpagesbadtitle' )->parseAsBlock();
-               } elseif ( !in_array( $namespace, array_keys( $namespaces ) ) ) {
+               } elseif ( !array_key_exists( $namespace, $namespaces ) ) {
                        // Show errormessage and reset to NS_MAIN
                        $out = $this->msg( 'allpages-bad-ns', $namespace )->parse();
                        $namespace = NS_MAIN;
@@ -224,17 +228,17 @@ class SpecialPrefixindex extends SpecialAllpages {
                                        } else {
                                                $link = '[[' . htmlspecialchars( $s->page_title ) . ']]';
                                        }
-                                       if ( $n % 3 == 0 ) {
+                                       if ( $n % $this->columns == 0 ) {
                                                $out .= '<tr>';
                                        }
                                        $out .= "<td>$link</td>";
                                        $n++;
-                                       if ( $n % 3 == 0 ) {
+                                       if ( $n % $this->columns == 0 ) {
                                                $out .= '</tr>';
                                        }
                                }
 
-                               if ( $n % 3 != 0 ) {
+                               if ( $n % $this->columns != 0 ) {
                                        $out .= '</tr>';
                                }
 
@@ -265,6 +269,7 @@ class SpecialPrefixindex extends SpecialAllpages {
                                        'prefix' => $prefix,
                                        'hideredirects' => $this->hideRedirects,
                                        'stripprefix' => $this->stripPrefix,
+                                       'columns' => $this->columns,
                                );
 
                                if ( $namespace || $prefix == '' ) {
index e505ecb..5b4ccb5 100644 (file)
@@ -465,7 +465,7 @@ class ProtectedPagesPager extends TablePager {
                                break;
 
                        case 'log_comment':
-                               // when timestamp is null, this is a old protection row
+                               // when timestamp is null, this is an old protection row
                                if ( $row->log_timestamp === null ) {
                                        $formatted = Html::rawElement(
                                                'span',
index 72fa9bc..f1a31a5 100644 (file)
@@ -94,8 +94,8 @@ class SpecialRecentChanges extends ChangesListSpecialPage {
         */
        protected function getCustomFilters() {
                if ( $this->customFilters === null ) {
-                       $this->customFilters = array();
-                       wfRunHooks( 'SpecialRecentChangesFilters', array( $this, &$this->customFilters ) );
+                       $this->customFilters = parent::getCustomFilters();
+                       wfRunHooks( 'SpecialRecentChangesFilters', array( $this, &$this->customFilters ), '1.23' );
                }
 
                return $this->customFilters;
@@ -230,7 +230,8 @@ class SpecialRecentChanges extends ChangesListSpecialPage {
                );
 
                if ( !wfRunHooks( 'SpecialRecentChangesQuery',
-                       array( &$conds, &$tables, &$join_conds, $opts, &$query_options, &$fields ) )
+                       array( &$conds, &$tables, &$join_conds, $opts, &$query_options, &$fields ),
+                       '1.23' )
                ) {
                        return false;
                }
index 526e949..e73cabc 100644 (file)
@@ -110,7 +110,8 @@ class SpecialRecentChangesLinked extends SpecialRecentChanges {
                );
 
                if ( !wfRunHooks( 'SpecialRecentChangesQuery',
-                       array( &$conds, &$tables, &$join_conds, $opts, &$query_options, &$select ) )
+                       array( &$conds, &$tables, &$join_conds, $opts, &$query_options, &$select ),
+                       '1.23' )
                ) {
                        return false;
                }
index 0c45281..104cd54 100644 (file)
@@ -152,6 +152,7 @@ class SpecialRunJobs extends UnlistedSpecialPage {
                                }
                        } while ( --$n && $job );
                } catch ( MWException $e ) {
+                       MWExceptionHandler::rollbackMasterChangesAndLog( $e );
                        // We don't want exceptions thrown during job execution to
                        // be reported to the user since the output is already sent.
                        // Instead we just log them.
index d4c47e8..ec8d754 100644 (file)
@@ -34,20 +34,20 @@ class SpecialSearch extends SpecialPage {
         * For users tt replaces the set of enabled namespaces from the query
         * string when applicable. Extensions can add new profiles with hooks
         * with custom search options just for that profile.
-        * null|string
+        * @var null|string
         */
        protected $profile;
 
-       /// Search engine
+       /** @var SearchEngine Search engine */
        protected $searchEngine;
 
-       /// Search engine type, if not default
+       /** @var String Search engine type, if not default */
        protected $searchEngineType;
 
-       /// For links
+       /** @var Array For links */
        protected $extraParams = array();
 
-       /// No idea, apparently used by some other classes
+       /** @var String No idea, apparently used by some other classes */
        protected $mPrefix;
 
        /**
index db9a992..08edf73 100644 (file)
@@ -67,7 +67,7 @@ class UserrightsPage extends SpecialPage {
         * Manage forms to be shown according to posted data.
         * Depending on the submit button used, call a form or a save function.
         *
-        * @param $par Mixed: string if any subpage provided, else null
+        * @param string|null $par String if any subpage provided, else null
         * @throws UserBlockedError|PermissionsError
         */
        public function execute( $par ) {
@@ -218,11 +218,11 @@ class UserrightsPage extends SpecialPage {
        /**
         * Save user groups changes in the database.
         *
-        * @param $user User object
-        * @param array $add of groups to add
-        * @param array $remove of groups to remove
-        * @param string $reason reason for group change
-        * @return Array: Tuple of added, then removed groups
+        * @param User $user
+        * @param array $add Array of groups to add
+        * @param array $remove Array of groups to remove
+        * @param string $reason Reason for group change
+        * @return array Tuple of added, then removed groups
         */
        function doSaveUserGroups( $user, $add, $remove, $reason = '' ) {
                global $wgAuth;
@@ -445,8 +445,8 @@ class UserrightsPage extends SpecialPage {
         * form will be able to manipulate based on the current user's system
         * permissions.
         *
-        * @param array $groups list of groups the given user is in
-        * @return Array:  Tuple of addable, then removable groups
+        * @param array $groups List of groups the given user is in
+        * @return array Tuple of addable, then removable groups
         */
        protected function splitGroups( $groups ) {
                list( $addable, $removable, $addself, $removeself ) = array_values( $this->changeableGroups() );
@@ -466,8 +466,8 @@ class UserrightsPage extends SpecialPage {
        /**
         * Show the form to edit group memberships.
         *
-        * @param $user      User or UserRightsProxy you're editing
-        * @param $groups    Array:  Array of groups the user is in
+        * @param User|UserRightsProxy $user User or UserRightsProxy you're editing
+        * @param array $groups Array of groups the user is in
         */
        protected function showEditUserGroupsForm( $user, $groups ) {
                $list = array();
@@ -682,7 +682,7 @@ class UserrightsPage extends SpecialPage {
        }
 
        /**
-        * @param  $group String: the name of the group to check
+        * @param string $group The name of the group to check
         * @return bool Can we remove the group?
         */
        private function canRemove( $group ) {
index c8add01..f07d97b 100644 (file)
 class SpecialVersion extends SpecialPage {
        protected $firstExtOpened = false;
 
+       /**
+        * Stores the current rev id/SHA hash of MediaWiki core
+        */
+       protected $coreId = '';
+
        protected static $extensionTypes = false;
 
        protected static $viewvcUrls = array(
@@ -417,7 +422,7 @@ class SpecialVersion extends SpecialPage {
        /**
         * Generate wikitext showing extensions name, URL, author and description.
         *
-        * @return String: Wikitext
+        * @return string Wikitext
         */
        function getExtensionCredits() {
                global $wgExtensionCredits;
@@ -616,19 +621,42 @@ class SpecialVersion extends SpecialPage {
                }
 
                if ( isset( $extension['path'] ) ) {
-                       $extensionPath = dirname( $extension['path'] );
-                       $gitInfo = new GitInfo( $extensionPath );
-                       $vcsVersion = $gitInfo->getHeadSHA1();
-                       if ( $vcsVersion !== false ) {
-                               $vcsVersion = substr( $vcsVersion, 0, 7 );
-                               $vcsLink = $gitInfo->getHeadViewUrl();
-                               $vcsDate = $gitInfo->getHeadCommitDate();
-                       } else {
-                               $svnInfo = self::getSvnInfo( $extensionPath );
-                               if ( $svnInfo !== false ) {
-                                       $vcsVersion = $this->msg( 'version-svn-revision', $svnInfo['checkout-rev'] )->text();
-                                       $vcsLink = isset( $svnInfo['viewvc-url'] ) ? $svnInfo['viewvc-url'] : '';
+                       global $IP;
+                       if ( $this->coreId == '' ) {
+                               wfDebug( 'Looking up core head id' );
+                               $coreHeadSHA1 = self::getGitHeadSha1( $IP );
+                               if ( $coreHeadSHA1 ) {
+                                       $this->coreId = $coreHeadSHA1;
+                               } else {
+                                       $svnInfo = self::getSvnInfo( $IP );
+                                       if ( $svnInfo !== false ) {
+                                               $this->coreId = $svnInfo['checkout-rev'];
+                                       }
+                               }
+                       }
+                       $cache = wfGetCache( CACHE_ANYTHING );
+                       $memcKey = wfMemcKey( 'specialversion-ext-version-text', $extension['path'], $this->coreId );
+                       list( $vcsVersion, $vcsLink, $vcsDate ) = $cache->get( $memcKey );
+
+                       if ( !$vcsVersion ) {
+                               wfDebug( "Getting VCS info for extension $extensionName" );
+                               $extensionPath = dirname( $extension['path'] );
+                               $gitInfo = new GitInfo( $extensionPath );
+                               $vcsVersion = $gitInfo->getHeadSHA1();
+                               if ( $vcsVersion !== false ) {
+                                       $vcsVersion = substr( $vcsVersion, 0, 7 );
+                                       $vcsLink = $gitInfo->getHeadViewUrl();
+                                       $vcsDate = $gitInfo->getHeadCommitDate();
+                               } else {
+                                       $svnInfo = self::getSvnInfo( $extensionPath );
+                                       if ( $svnInfo !== false ) {
+                                               $vcsVersion = $this->msg( 'version-svn-revision', $svnInfo['checkout-rev'] )->text();
+                                               $vcsLink = isset( $svnInfo['viewvc-url'] ) ? $svnInfo['viewvc-url'] : '';
+                                       }
                                }
+                               $cache->set( $memcKey, array( $vcsVersion, $vcsLink, $vcsDate ), 60 * 60 * 24 );
+                       } else {
+                               wfDebug( "Pulled VCS info for extension $extensionName from cache" );
                        }
                }
 
@@ -733,7 +761,7 @@ class SpecialVersion extends SpecialPage {
        /**
         * Generate wikitext showing hooks in $wgHooks.
         *
-        * @return String: wikitext
+        * @return string Wikitext
         */
        private function getWgHooks() {
                global $wgSpecialVersionShowHooks, $wgHooks;
@@ -804,7 +832,7 @@ class SpecialVersion extends SpecialPage {
        /**
         * Get information about client's IP address.
         *
-        * @return String: HTML fragment
+        * @return string HTML fragment
         */
        private function IPInfo() {
                $ip = str_replace( '--', ' - ', htmlspecialchars( $this->getRequest()->getIP() ) );
@@ -826,11 +854,11 @@ class SpecialVersion extends SpecialPage {
         *   If no '...' string variant is found, but an authors file is found an
         *   'and others' will be added to the end of the credits.
         *
-        * @param $authors mixed: string or array of strings
-        * @param $extName string: name of the extension for link creation
-        * @param $extDir  string: path to the extension root directory
+        * @param string|array $authors
+        * @param string $extName Name of the extension for link creation
+        * @param string $extDir Path to the extension root directory
         *
-        * @return String: HTML fragment
+        * @return string HTML fragment
         */
        function listAuthors( $authors, $extName, $extDir ) {
                $hasOthers = false;
@@ -930,10 +958,10 @@ class SpecialVersion extends SpecialPage {
        /**
         * Convert an array of items into a list for display.
         *
-        * @param array $list of elements to display
-        * @param $sort Boolean: whether to sort the items in $list
+        * @param array $list List of elements to display
+        * @param bool $sort Whether to sort the items in $list
         *
-        * @return String
+        * @return string
         */
        function listToText( $list, $sort = true ) {
                $cnt = count( $list );
@@ -956,10 +984,10 @@ class SpecialVersion extends SpecialPage {
        /**
         * Convert an array or object to a string for display.
         *
-        * @param $list Mixed: will convert an array to string if given and return
-        *              the paramater unaltered otherwise
+        * @param mixed $list will convert an array to string if given and return
+        *   the paramater unaltered otherwise
         *
-        * @return Mixed
+        * @return mixed
         */
        public static function arrayToString( $list ) {
                if ( is_array( $list ) && count( $list ) == 1 ) {
@@ -1070,7 +1098,7 @@ class SpecialVersion extends SpecialPage {
         *
         * @param string $dir directory of the svn checkout
         *
-        * @return Integer: revision number as int
+        * @return int Revision number
         */
        public static function getSvnRevision( $dir ) {
                $info = self::getSvnInfo( $dir );
index c1fe21a..1345b76 100644 (file)
@@ -107,8 +107,8 @@ class SpecialWatchlist extends ChangesListSpecialPage {
         */
        protected function getCustomFilters() {
                if ( $this->customFilters === null ) {
-                       $this->customFilters = array();
-                       wfRunHooks( 'SpecialWatchlistFilters', array( $this, &$this->customFilters ) );
+                       $this->customFilters = parent::getCustomFilters();
+                       wfRunHooks( 'SpecialWatchlistFilters', array( $this, &$this->customFilters ), '1.23' );
                }
 
                return $this->customFilters;
@@ -258,7 +258,8 @@ class SpecialWatchlist extends ChangesListSpecialPage {
                );
 
                wfRunHooks( 'SpecialWatchlistQuery',
-                       array( &$conds, &$tables, &$join_conds, &$fields, $opts ) );
+                       array( &$conds, &$tables, &$join_conds, &$fields, $opts ),
+                       '1.23' );
 
                return $dbr->select(
                        $tables,
index 06e9058..7a865eb 100644 (file)
@@ -157,6 +157,6 @@ class TitleValue {
                        $name .= '#' . $this->fragment;
                }
 
-               return  $name;
+               return $name;
        }
 }
index f50eb49..ad2196d 100644 (file)
@@ -177,12 +177,12 @@ class UploadStash {
        /**
         * Stash a file in a temp directory and record that we did this in the database, along with other metadata.
         *
-        * @param string $path path to file you want stashed
-        * @param string $sourceType the type of upload that generated this file (currently, I believe, 'file' or null)
+        * @param string $path Path to file you want stashed
+        * @param string $sourceType The type of upload that generated this file (currently, I believe, 'file' or null)
         * @throws UploadStashBadPathException
         * @throws UploadStashFileException
         * @throws UploadStashNotLoggedInException
-        * @return UploadStashFile: file, or null on failure
+        * @return UploadStashFile|null File, or null on failure
         */
        public function stashFile( $path, $sourceType = null ) {
                if ( !is_file( $path ) ) {
@@ -293,7 +293,7 @@ class UploadStash {
         * Does not clean up files in the repo, just the record of them.
         *
         * @throws UploadStashNotLoggedInException
-        * @return boolean: success
+        * @return bool success
         */
        public function clear() {
                if ( !$this->isLoggedIn ) {
@@ -318,9 +318,9 @@ class UploadStash {
        /**
         * Remove a particular file from the stash.  Also removes it from the repo.
         *
-        * @param $key
+        * @param string $key
         * @throws UploadStashNoSuchKeyException|UploadStashNotLoggedInException|UploadStashWrongOwnerException
-        * @return boolean: success
+        * @return bool Success
         */
        public function removeFile( $key ) {
                if ( !$this->isLoggedIn ) {
@@ -352,7 +352,8 @@ class UploadStash {
        /**
         * Remove a file (see removeFile), but doesn't check ownership first.
         *
-        * @return boolean: success
+        * @param string $key
+        * @return bool Success
         */
        public function removeFileNoAuth( $key ) {
                wfDebug( __METHOD__ . " clearing row $key\n" );
@@ -456,8 +457,8 @@ class UploadStash {
        /**
         * Helper function: do the actual database query to fetch file metadata.
         *
-        * @param string $key key
-        * @param $readFromDB: constant (default: DB_SLAVE)
+        * @param string $key
+        * @param int $readFromDB Constant (default: DB_SLAVE)
         * @return boolean
         */
        protected function fetchFileMetadata( $key, $readFromDB = DB_SLAVE ) {
@@ -514,9 +515,9 @@ class UploadStashFile extends UnregisteredLocalFile {
         * A LocalFile wrapper around a file that has been temporarily stashed, so we can do things like create thumbnails for it
         * Arguably UnregisteredLocalFile should be handling its own file repo but that class is a bit retarded currently
         *
-        * @param $repo FileRepo: repository where we should find the path
-        * @param string $path path to file
-        * @param string $key key to store the path and any stashed data under
+        * @param FileRepo $repo Repository where we should find the path
+        * @param string $path Path to file
+        * @param string $key Key to store the path and any stashed data under
         * @throws UploadStashBadPathException
         * @throws UploadStashFileNotFoundException
         */
@@ -554,7 +555,7 @@ class UploadStashFile extends UnregisteredLocalFile {
         * However, we also can't return the empty string, as the rest of MediaWiki demands this (and calls to imagemagick
         * convert require it to be there)
         *
-        * @return String: dummy value
+        * @return string Dummy value
         */
        public function getDescriptionUrl() {
                return $this->getUrl();
@@ -565,8 +566,8 @@ class UploadStashFile extends UnregisteredLocalFile {
         * The actual argument is the result of thumbName although we seem to have
         * buggy code elsewhere that expects a boolean 'suffix'
         *
-        * @param string $thumbName name of thumbnail (e.g. "120px-123456.jpg" ), or false to just get the path
-        * @return String: path thumbnail should take on filesystem, or containing directory if thumbname is false
+        * @param string $thumbName Name of thumbnail (e.g. "120px-123456.jpg" ), or false to just get the path
+        * @return string Path thumbnail should take on filesystem, or containing directory if thumbname is false
         */
        public function getThumbPath( $thumbName = false ) {
                $path = dirname( $this->path );
@@ -581,9 +582,9 @@ class UploadStashFile extends UnregisteredLocalFile {
         * We override this because we want to use the pretty url name instead of the
         * ugly file name.
         *
-        * @param array $params handler-specific parameters
-        * @param $flags integer Bitfield that supports THUMB_* constants
-        * @return String: base name for URL, like '120px-12345.jpg', or null if there is no handler
+        * @param array $params Handler-specific parameters
+        * @param int $flags Bitfield that supports THUMB_* constants
+        * @return string Base name for URL, like '120px-12345.jpg', or null if there is no handler
         */
        function thumbName( $params, $flags = 0 ) {
                return $this->generateThumbName( $this->getUrlName(), $params );
@@ -591,8 +592,8 @@ class UploadStashFile extends UnregisteredLocalFile {
 
        /**
         * Helper function -- given a 'subpage', return the local URL e.g. /wiki/Special:UploadStash/subpage
-        * @param $subPage String
-        * @return String: local URL for this subpage in the Special:UploadStash space.
+        * @param string $subPage
+        * @return string Local URL for this subpage in the Special:UploadStash space.
         */
        private function getSpecialUrl( $subPage ) {
                return SpecialPage::getTitleFor( 'UploadStash', $subPage )->getLocalURL();
@@ -604,8 +605,8 @@ class UploadStashFile extends UnregisteredLocalFile {
         * the thumbnail urls be predictable. However, in our model the URL is not based on the filename
         * (that's hidden in the db)
         *
-        * @param string $thumbName basename of thumbnail file -- however, we don't want to use the file exactly
-        * @return String: URL to access thumbnail, or URL with partial path
+        * @param string $thumbName Basename of thumbnail file -- however, we don't want to use the file exactly
+        * @return string URL to access thumbnail, or URL with partial path
         */
        public function getThumbUrl( $thumbName = false ) {
                wfDebug( __METHOD__ . " getting for $thumbName \n" );
@@ -616,7 +617,7 @@ class UploadStashFile extends UnregisteredLocalFile {
         * The basename for the URL, which we want to not be related to the filename.
         * Will also be used as the lookup key for a thumbnail file.
         *
-        * @return String: base url name, like '120px-123456.jpg'
+        * @return string Base url name, like '120px-123456.jpg'
         */
        public function getUrlName() {
                if ( ! $this->urlName ) {
@@ -629,7 +630,7 @@ class UploadStashFile extends UnregisteredLocalFile {
         * Return the URL of the file, if for some reason we wanted to download it
         * We tend not to do this for the original file, but we do want thumb icons
         *
-        * @return String: url
+        * @return string Url
         */
        public function getUrl() {
                if ( !isset( $this->url ) ) {
@@ -642,7 +643,7 @@ class UploadStashFile extends UnregisteredLocalFile {
         * Parent classes use this method, for no obvious reason, to return the path (relative to wiki root, I assume).
         * But with this class, the URL is unrelated to the path.
         *
-        * @return String: url
+        * @return string Url
         */
        public function getFullUrl() {
                return $this->getUrl();
@@ -651,7 +652,7 @@ class UploadStashFile extends UnregisteredLocalFile {
        /**
         * Getter for file key (the unique id by which this file's location & metadata is stored in the db)
         *
-        * @return String: file key
+        * @return string File key
         */
        public function getFileKey() {
                return $this->fileKey;
@@ -659,7 +660,7 @@ class UploadStashFile extends UnregisteredLocalFile {
 
        /**
         * Remove the associated temporary file
-        * @return Status: success
+        * @return status Success
         */
        public function remove() {
                if ( !$this->repo->fileExists( $this->path ) ) {
index e60293b..c7bb4f3 100644 (file)
@@ -30,6 +30,7 @@ class UIDGenerator {
        /** @var UIDGenerator */
        protected static $instance = null;
 
+       protected $nodeIdFile; // string; local file path
        protected $nodeId32; // string; node ID in binary (32 bits)
        protected $nodeId48; // string; node ID in binary (48 bits)
 
@@ -43,8 +44,11 @@ class UIDGenerator {
        const QUICK_VOLATILE = 2; // use an APC like in-memory counter if available
 
        protected function __construct() {
-               $idFile = wfTempDir() . '/mw-' . __CLASS__ . '-UID-nodeid';
-               $nodeId = is_file( $idFile ) ? file_get_contents( $idFile ) : '';
+               $this->nodeIdFile = wfTempDir() . '/mw-' . __CLASS__ . '-UID-nodeid';
+               $nodeId = '';
+               if ( is_file( $this->nodeIdFile ) ) {
+                       $nodeId = file_get_contents( $this->nodeIdFile );
+               }
                // Try to get some ID that uniquely identifies this machine (RFC 4122)...
                if ( !preg_match( '/^[0-9a-f]{12}$/i', $nodeId ) ) {
                        wfSuppressWarnings();
@@ -66,7 +70,7 @@ class UIDGenerator {
                                $nodeId = MWCryptRand::generateHex( 12, true );
                                $nodeId[1] = dechex( hexdec( $nodeId[1] ) | 0x1 ); // set multicast bit
                        }
-                       file_put_contents( $idFile, $nodeId ); // cache
+                       file_put_contents( $this->nodeIdFile, $nodeId ); // cache
                }
                $this->nodeId32 = wfBaseConvert( substr( sha1( $nodeId ), 0, 8 ), 16, 2, 32 );
                $this->nodeId48 = wfBaseConvert( $nodeId, 16, 2, 48 );
@@ -338,11 +342,12 @@ class UIDGenerator {
         */
        protected function getTimestampAndDelay( $lockFile, $clockSeqSize, $counterSize ) {
                // Get the UID lock file handle
-               if ( isset( $this->fileHandles[$lockFile] ) ) {
-                       $handle = $this->fileHandles[$lockFile];
+               $path = $this->$lockFile;
+               if ( isset( $this->fileHandles[$path] ) ) {
+                       $handle = $this->fileHandles[$path];
                } else {
-                       $handle = fopen( $this->$lockFile, 'cb+' );
-                       $this->fileHandles[$lockFile] = $handle ?: null; // cache
+                       $handle = fopen( $path, 'cb+' );
+                       $this->fileHandles[$path] = $handle ?: null; // cache
                }
                // Acquire the UID lock file
                if ( $handle === false ) {
@@ -450,7 +455,51 @@ class UIDGenerator {
                return array( (int)$sec, (int)( $msec * 1000 ) );
        }
 
+       /**
+        * Delete all cache files that have been created.
+        *
+        * This is a cleanup method primarily meant to be used from unit tests to
+        * avoid poluting the local filesystem. If used outside of a unit test
+        * environment it should be used with caution as it may destroy state saved
+        * in the files.
+        *
+        * @see unitTestTearDown
+        * @since 1.23
+        */
+       protected function deleteCacheFiles() {
+               // Bug: 44850
+               foreach ( $this->fileHandles as $path => $handle ) {
+                       if ( $handle !== null ) {
+                               fclose( $handle );
+                       }
+                       if ( is_file( $path ) ) {
+                               unlink( $path );
+                       }
+                       unset( $this->fileHandles[$path] );
+               }
+               if ( is_file( $this->nodeIdFile ) ) {
+                       unlink( $this->nodeIdFile );
+               }
+       }
+
+       /**
+        * Cleanup resources when tearing down after a unit test.
+        *
+        * This is a cleanup method primarily meant to be used from unit tests to
+        * avoid poluting the local filesystem. If used outside of a unit test
+        * environment it should be used with caution as it may destroy state saved
+        * in the files.
+        *
+        * @see deleteCacheFiles
+        * @since 1.23
+        */
+       public static function unitTestTearDown() {
+               // Bug: 44850
+               $gen = self::singleton();
+               $gen->deleteCacheFiles();
+       }
+
        function __destruct() {
-               array_map( 'fclose', $this->fileHandles );
+               array_map( 'fclose', array_filter( $this->fileHandles ) );
        }
 }
diff --git a/languages/ConverterRule.php b/languages/ConverterRule.php
new file mode 100644 (file)
index 0000000..4091041
--- /dev/null
@@ -0,0 +1,502 @@
+<?php
+/**
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup Language
+ */
+
+/**
+ * Parser for rules of language conversion , parse rules in -{ }- tag.
+ * @ingroup Language
+ * @author fdcn <fdcn64@gmail.com>, PhiLiP <philip.npc@gmail.com>
+ */
+class ConverterRule {
+       public $mText; // original text in -{text}-
+       public $mConverter; // LanguageConverter object
+       public $mRuleDisplay = '';
+       public $mRuleTitle = false;
+       public $mRules = '';// string : the text of the rules
+       public $mRulesAction = 'none';
+       public $mFlags = array();
+       public $mVariantFlags = array();
+       public $mConvTable = array();
+       public $mBidtable = array();// array of the translation in each variant
+       public $mUnidtable = array();// array of the translation in each variant
+
+       /**
+        * Constructor
+        *
+        * @param string $text The text between -{ and }-
+        * @param LanguageConverter $converter
+        */
+       public function __construct( $text, $converter ) {
+               $this->mText = $text;
+               $this->mConverter = $converter;
+       }
+
+       /**
+        * Check if variants array in convert array.
+        *
+        * @param array|string $variants Variant language code
+        * @return string Translated text
+        */
+       public function getTextInBidtable( $variants ) {
+               $variants = (array)$variants;
+               if ( !$variants ) {
+                       return false;
+               }
+               foreach ( $variants as $variant ) {
+                       if ( isset( $this->mBidtable[$variant] ) ) {
+                               return $this->mBidtable[$variant];
+                       }
+               }
+               return false;
+       }
+
+       /**
+        * Parse flags with syntax -{FLAG| ... }-
+        * @private
+        */
+       function parseFlags() {
+               $text = $this->mText;
+               $flags = array();
+               $variantFlags = array();
+
+               $sepPos = strpos( $text, '|' );
+               if ( $sepPos !== false ) {
+                       $validFlags = $this->mConverter->mFlags;
+                       $f = StringUtils::explode( ';', substr( $text, 0, $sepPos ) );
+                       foreach ( $f as $ff ) {
+                               $ff = trim( $ff );
+                               if ( isset( $validFlags[$ff] ) ) {
+                                       $flags[$validFlags[$ff]] = true;
+                               }
+                       }
+                       $text = strval( substr( $text, $sepPos + 1 ) );
+               }
+
+               if ( !$flags ) {
+                       $flags['S'] = true;
+               } elseif ( isset( $flags['R'] ) ) {
+                       $flags = array( 'R' => true );// remove other flags
+               } elseif ( isset( $flags['N'] ) ) {
+                       $flags = array( 'N' => true );// remove other flags
+               } elseif ( isset( $flags['-'] ) ) {
+                       $flags = array( '-' => true );// remove other flags
+               } elseif ( count( $flags ) == 1 && isset( $flags['T'] ) ) {
+                       $flags['H'] = true;
+               } elseif ( isset( $flags['H'] ) ) {
+                       // replace A flag, and remove other flags except T
+                       $temp = array( '+' => true, 'H' => true );
+                       if ( isset( $flags['T'] ) ) {
+                               $temp['T'] = true;
+                       }
+                       if ( isset( $flags['D'] ) ) {
+                               $temp['D'] = true;
+                       }
+                       $flags = $temp;
+               } else {
+                       if ( isset( $flags['A'] ) ) {
+                               $flags['+'] = true;
+                               $flags['S'] = true;
+                       }
+                       if ( isset( $flags['D'] ) ) {
+                               unset( $flags['S'] );
+                       }
+                       // try to find flags like "zh-hans", "zh-hant"
+                       // allow syntaxes like "-{zh-hans;zh-hant|XXXX}-"
+                       $variantFlags = array_intersect( array_keys( $flags ), $this->mConverter->mVariants );
+                       if ( $variantFlags ) {
+                               $variantFlags = array_flip( $variantFlags );
+                               $flags = array();
+                       }
+               }
+               $this->mVariantFlags = $variantFlags;
+               $this->mRules = $text;
+               $this->mFlags = $flags;
+       }
+
+       /**
+        * Generate conversion table.
+        * @private
+        */
+       function parseRules() {
+               $rules = $this->mRules;
+               $bidtable = array();
+               $unidtable = array();
+               $variants = $this->mConverter->mVariants;
+               $varsep_pattern = $this->mConverter->getVarSeparatorPattern();
+
+               // Split according to $varsep_pattern, but ignore semicolons from HTML entities
+               $rules = preg_replace( '/(&[#a-zA-Z0-9]+);/', "$1\x01", $rules );
+               $choice = preg_split( $varsep_pattern, $rules );
+               $choice = str_replace( "\x01", ';', $choice );
+
+               foreach ( $choice as $c ) {
+                       $v = explode( ':', $c, 2 );
+                       if ( count( $v ) != 2 ) {
+                               // syntax error, skip
+                               continue;
+                       }
+                       $to = trim( $v[1] );
+                       $v = trim( $v[0] );
+                       $u = explode( '=>', $v, 2 );
+                       // if $to is empty, strtr() could return a wrong result
+                       if ( count( $u ) == 1 && $to && in_array( $v, $variants ) ) {
+                               $bidtable[$v] = $to;
+                       } elseif ( count( $u ) == 2 ) {
+                               $from = trim( $u[0] );
+                               $v = trim( $u[1] );
+                               if ( array_key_exists( $v, $unidtable )
+                                       && !is_array( $unidtable[$v] )
+                                       && $to
+                                       && in_array( $v, $variants ) ) {
+                                       $unidtable[$v] = array( $from => $to );
+                               } elseif ( $to && in_array( $v, $variants ) ) {
+                                       $unidtable[$v][$from] = $to;
+                               }
+                       }
+                       // syntax error, pass
+                       if ( !isset( $this->mConverter->mVariantNames[$v] ) ) {
+                               $bidtable = array();
+                               $unidtable = array();
+                               break;
+                       }
+               }
+               $this->mBidtable = $bidtable;
+               $this->mUnidtable = $unidtable;
+       }
+
+       /**
+        * @private
+        *
+        * @return string
+        */
+       function getRulesDesc() {
+               $codesep = $this->mConverter->mDescCodeSep;
+               $varsep = $this->mConverter->mDescVarSep;
+               $text = '';
+               foreach ( $this->mBidtable as $k => $v ) {
+                       $text .= $this->mConverter->mVariantNames[$k] . "$codesep$v$varsep";
+               }
+               foreach ( $this->mUnidtable as $k => $a ) {
+                       foreach ( $a as $from => $to ) {
+                               $text .= $from . '⇒' . $this->mConverter->mVariantNames[$k] .
+                                       "$codesep$to$varsep";
+                       }
+               }
+               return $text;
+       }
+
+       /**
+        * Parse rules conversion.
+        * @private
+        *
+        * @param $variant
+        *
+        * @return string
+        */
+       function getRuleConvertedStr( $variant ) {
+               $bidtable = $this->mBidtable;
+               $unidtable = $this->mUnidtable;
+
+               if ( count( $bidtable ) + count( $unidtable ) == 0 ) {
+                       return $this->mRules;
+               } else {
+                       // display current variant in bidirectional array
+                       $disp = $this->getTextInBidtable( $variant );
+                       // or display current variant in fallbacks
+                       if ( !$disp ) {
+                               $disp = $this->getTextInBidtable(
+                                       $this->mConverter->getVariantFallbacks( $variant ) );
+                       }
+                       // or display current variant in unidirectional array
+                       if ( !$disp && array_key_exists( $variant, $unidtable ) ) {
+                               $disp = array_values( $unidtable[$variant] );
+                               $disp = $disp[0];
+                       }
+                       // or display frist text under disable manual convert
+                       if ( !$disp && $this->mConverter->mManualLevel[$variant] == 'disable' ) {
+                               if ( count( $bidtable ) > 0 ) {
+                                       $disp = array_values( $bidtable );
+                                       $disp = $disp[0];
+                               } else {
+                                       $disp = array_values( $unidtable );
+                                       $disp = array_values( $disp[0] );
+                                       $disp = $disp[0];
+                               }
+                       }
+                       return $disp;
+               }
+       }
+
+       /**
+        * Similar to getRuleConvertedStr(), but this prefers to use original
+        * page title if $variant === $this->mConverter->mMainLanguageCode
+        * and may return false in this case (so this title conversion rule
+        * will be ignored and the original title is shown).
+        *
+        * @since 1.22
+        * @param $variant The variant code to display page title in
+        * @return String|false The converted title or false if just page name
+        */
+       function getRuleConvertedTitle( $variant ) {
+               if ( $variant === $this->mConverter->mMainLanguageCode ) {
+                       // If a string targeting exactly this variant is set,
+                       // use it. Otherwise, just return false, so the real
+                       // page name can be shown (and because variant === main,
+                       // there'll be no further automatic conversion).
+                       $disp = $this->getTextInBidtable( $variant );
+                       if ( $disp ) {
+                               return $disp;
+                       }
+                       if ( array_key_exists( $variant, $this->mUnidtable ) ) {
+                               $disp = array_values( $this->mUnidtable[$variant] );
+                               $disp = $disp[0];
+                       }
+                       // Assigned above or still false.
+                       return $disp;
+               } else {
+                       return $this->getRuleConvertedStr( $variant );
+               }
+       }
+
+       /**
+        * Generate conversion table for all text.
+        * @private
+        */
+       function generateConvTable() {
+               // Special case optimisation
+               if ( !$this->mBidtable && !$this->mUnidtable ) {
+                       $this->mConvTable = array();
+                       return;
+               }
+
+               $bidtable = $this->mBidtable;
+               $unidtable = $this->mUnidtable;
+               $manLevel = $this->mConverter->mManualLevel;
+
+               $vmarked = array();
+               foreach ( $this->mConverter->mVariants as $v ) {
+                       /* for bidirectional array
+                               fill in the missing variants, if any,
+                               with fallbacks */
+                       if ( !isset( $bidtable[$v] ) ) {
+                               $variantFallbacks =
+                                       $this->mConverter->getVariantFallbacks( $v );
+                               $vf = $this->getTextInBidtable( $variantFallbacks );
+                               if ( $vf ) {
+                                       $bidtable[$v] = $vf;
+                               }
+                       }
+
+                       if ( isset( $bidtable[$v] ) ) {
+                               foreach ( $vmarked as $vo ) {
+                                       // use syntax: -{A|zh:WordZh;zh-tw:WordTw}-
+                                       // or -{H|zh:WordZh;zh-tw:WordTw}-
+                                       // or -{-|zh:WordZh;zh-tw:WordTw}-
+                                       // to introduce a custom mapping between
+                                       // words WordZh and WordTw in the whole text
+                                       if ( $manLevel[$v] == 'bidirectional' ) {
+                                               $this->mConvTable[$v][$bidtable[$vo]] = $bidtable[$v];
+                                       }
+                                       if ( $manLevel[$vo] == 'bidirectional' ) {
+                                               $this->mConvTable[$vo][$bidtable[$v]] = $bidtable[$vo];
+                                       }
+                               }
+                               $vmarked[] = $v;
+                       }
+                       /* for unidirectional array fill to convert tables */
+                       if ( ( $manLevel[$v] == 'bidirectional' || $manLevel[$v] == 'unidirectional' )
+                               && isset( $unidtable[$v] )
+                       ) {
+                               if ( isset( $this->mConvTable[$v] ) ) {
+                                       $this->mConvTable[$v] = array_merge( $this->mConvTable[$v], $unidtable[$v] );
+                               } else {
+                                       $this->mConvTable[$v] = $unidtable[$v];
+                               }
+                       }
+               }
+       }
+
+       /**
+        * Parse rules and flags.
+        * @param string $variant Variant language code
+        */
+       public function parse( $variant = null ) {
+               if ( !$variant ) {
+                       $variant = $this->mConverter->getPreferredVariant();
+               }
+
+               $this->parseFlags();
+               $flags = $this->mFlags;
+
+               // convert to specified variant
+               // syntax: -{zh-hans;zh-hant[;...]|<text to convert>}-
+               if ( $this->mVariantFlags ) {
+                       // check if current variant in flags
+                       if ( isset( $this->mVariantFlags[$variant] ) ) {
+                               // then convert <text to convert> to current language
+                               $this->mRules = $this->mConverter->autoConvert( $this->mRules,
+                                       $variant );
+                       } else {
+                               // if current variant no in flags,
+                               // then we check its fallback variants.
+                               $variantFallbacks =
+                                       $this->mConverter->getVariantFallbacks( $variant );
+                               if ( is_array( $variantFallbacks ) ) {
+                                       foreach ( $variantFallbacks as $variantFallback ) {
+                                               // if current variant's fallback exist in flags
+                                               if ( isset( $this->mVariantFlags[$variantFallback] ) ) {
+                                                       // then convert <text to convert> to fallback language
+                                                       $this->mRules =
+                                                               $this->mConverter->autoConvert( $this->mRules,
+                                                                       $variantFallback );
+                                                       break;
+                                               }
+                                       }
+                               }
+                       }
+                       $this->mFlags = $flags = array( 'R' => true );
+               }
+
+               if ( !isset( $flags['R'] ) && !isset( $flags['N'] ) ) {
+                       // decode => HTML entities modified by Sanitizer::removeHTMLtags
+                       $this->mRules = str_replace( '=&gt;', '=>', $this->mRules );
+                       $this->parseRules();
+               }
+               $rules = $this->mRules;
+
+               if ( !$this->mBidtable && !$this->mUnidtable ) {
+                       if ( isset( $flags['+'] ) || isset( $flags['-'] ) ) {
+                               // fill all variants if text in -{A/H/-|text} without rules
+                               foreach ( $this->mConverter->mVariants as $v ) {
+                                       $this->mBidtable[$v] = $rules;
+                               }
+                       } elseif ( !isset( $flags['N'] ) && !isset( $flags['T'] ) ) {
+                               $this->mFlags = $flags = array( 'R' => true );
+                       }
+               }
+
+               $this->mRuleDisplay = false;
+               foreach ( $flags as $flag => $unused ) {
+                       switch ( $flag ) {
+                               case 'R':
+                                       // if we don't do content convert, still strip the -{}- tags
+                                       $this->mRuleDisplay = $rules;
+                                       break;
+                               case 'N':
+                                       // process N flag: output current variant name
+                                       $ruleVar = trim( $rules );
+                                       if ( isset( $this->mConverter->mVariantNames[$ruleVar] ) ) {
+                                               $this->mRuleDisplay = $this->mConverter->mVariantNames[$ruleVar];
+                                       } else {
+                                               $this->mRuleDisplay = '';
+                                       }
+                                       break;
+                               case 'D':
+                                       // process D flag: output rules description
+                                       $this->mRuleDisplay = $this->getRulesDesc();
+                                       break;
+                               case 'H':
+                                       // process H,- flag or T only: output nothing
+                                       $this->mRuleDisplay = '';
+                                       break;
+                               case '-':
+                                       $this->mRulesAction = 'remove';
+                                       $this->mRuleDisplay = '';
+                                       break;
+                               case '+':
+                                       $this->mRulesAction = 'add';
+                                       $this->mRuleDisplay = '';
+                                       break;
+                               case 'S':
+                                       $this->mRuleDisplay = $this->getRuleConvertedStr( $variant );
+                                       break;
+                               case 'T':
+                                       $this->mRuleTitle = $this->getRuleConvertedTitle( $variant );
+                                       $this->mRuleDisplay = '';
+                                       break;
+                               default:
+                                       // ignore unknown flags (but see error case below)
+                       }
+               }
+               if ( $this->mRuleDisplay === false ) {
+                       $this->mRuleDisplay = '<span class="error">'
+                               . wfMessage( 'converter-manual-rule-error' )->inContentLanguage()->escaped()
+                               . '</span>';
+               }
+
+               $this->generateConvTable();
+       }
+
+       /**
+        * @todo FIXME: code this function :)
+        */
+       public function hasRules() {
+               // TODO:
+       }
+
+       /**
+        * Get display text on markup -{...}-
+        * @return string
+        */
+       public function getDisplay() {
+               return $this->mRuleDisplay;
+       }
+
+       /**
+        * Get converted title.
+        * @return string
+        */
+       public function getTitle() {
+               return $this->mRuleTitle;
+       }
+
+       /**
+        * Return how deal with conversion rules.
+        * @return string
+        */
+       public function getRulesAction() {
+               return $this->mRulesAction;
+       }
+
+       /**
+        * Get conversion table. (bidirectional and unidirectional
+        * conversion table)
+        * @return array
+        */
+       public function getConvTable() {
+               return $this->mConvTable;
+       }
+
+       /**
+        * Get conversion rules string.
+        * @return string
+        */
+       public function getRules() {
+               return $this->mRules;
+       }
+
+       /**
+        * Get conversion flags.
+        * @return array
+        */
+       public function getFlags() {
+               return $this->mFlags;
+       }
+}
index 2b98a18..1ad2b7a 100644 (file)
@@ -814,7 +814,7 @@ class Language {
        }
 
        /**
-        * @param  $image
+        * @param $image
         * @return array|null
         */
        function getImageFile( $image ) {
@@ -829,7 +829,7 @@ class Language {
        }
 
        /**
-        * @param  $tog
+        * @param $tog
         * @return string
         */
        function getUserToggle( $tog ) {
index 57e73da..8451401 100644 (file)
@@ -1,7 +1,5 @@
 <?php
 /**
- * Contains the LanguageConverter class and ConverterRule class
- *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
  * the Free Software Foundation; either version 2 of the License, or
@@ -55,7 +53,7 @@ class LanguageConverter {
        public $mManualLevel;
 
        /**
-        * @var String: memcached key name
+        * @var string memcached key name
         */
        public $mCacheKey;
 
@@ -75,12 +73,12 @@ class LanguageConverter {
        /**
         * Constructor
         *
-        * @param $langobj Language: the Language Object
-        * @param $maincode String: the main language code of this language
-        * @param $variants Array: the supported variants of this language
-        * @param $variantfallbacks Array: the fallback language of each variant
-        * @param $flags Array: defining the custom strings that maps to the flags
-        * @param $manualLevel Array: limit for supported variants
+        * @param Language $langobj
+        * @param string $maincode The main language code of this language
+        * @param array $variants The supported variants of this language
+        * @param array $variantfallbacks The fallback language of each variant
+        * @param array $flags Defining the custom strings that maps to the flags
+        * @param array $manualLevel Limit for supported variants
         */
        public function __construct( $langobj, $maincode, $variants = array(),
                                                                $variantfallbacks = array(), $flags = array(),
@@ -120,7 +118,7 @@ class LanguageConverter {
         * Get all valid variants.
         * Call this instead of using $this->mVariants directly.
         *
-        * @return Array: contains all valid variants
+        * @return array Contains all valid variants
         */
        public function getVariants() {
                return $this->mVariants;
@@ -133,9 +131,9 @@ class LanguageConverter {
         * when zh-sg is preferred but not defined, we will pick zh-hans
         * in this case. Right now this is only used by zh.
         *
-        * @param $variant String: the language code of the variant
-        * @return String|array: The code of the fallback language or the
-        *                               main code if there is no fallback
+        * @param string $variant The language code of the variant
+        * @return string|array The code of the fallback language or the
+        *   main code if there is no fallback
         */
        public function getVariantFallbacks( $variant ) {
                if ( isset( $this->mVariantFallbacks[$variant] ) ) {
@@ -146,7 +144,7 @@ class LanguageConverter {
 
        /**
         * Get the title produced by the conversion rule.
-        * @return String: The converted title text
+        * @return string The converted title text
         */
        public function getConvRuleTitle() {
                return $this->mConvRuleTitle;
@@ -154,7 +152,7 @@ class LanguageConverter {
 
        /**
         * Get preferred language variant.
-        * @return String: the preferred language code
+        * @return string The preferred language code
         */
        public function getPreferredVariant() {
                global $wgDefaultLanguageVariant, $wgUser;
@@ -184,7 +182,7 @@ class LanguageConverter {
        /**
         * Get default variant.
         * This function would not be affected by user's settings
-        * @return String: the default variant code
+        * @return string The default variant code
         */
        public function getDefaultVariant() {
                global $wgDefaultLanguageVariant;
@@ -207,8 +205,8 @@ class LanguageConverter {
 
        /**
         * Validate the variant
-        * @param $variant String: the variant to validate
-        * @return Mixed: returns the variant if it is valid, null otherwise
+        * @param string $variant The variant to validate
+        * @return mixed Returns the variant if it is valid, null otherwise
         */
        public function validateVariant( $variant = null ) {
                if ( $variant !== null && in_array( $variant, $this->mVariants ) ) {
@@ -220,7 +218,7 @@ class LanguageConverter {
        /**
         * Get the variant specified in the URL
         *
-        * @return Mixed: variant if one found, false otherwise.
+        * @return mixed Variant if one found, false otherwise.
         */
        public function getURLVariant() {
                global $wgRequest;
@@ -243,7 +241,7 @@ class LanguageConverter {
        /**
         * Determine if the user has a variant set.
         *
-        * @return Mixed: variant if one found, false otherwise.
+        * @return mixed Variant if one found, false otherwise.
         */
        protected function getUserVariant() {
                global $wgUser, $wgContLang;
@@ -277,7 +275,7 @@ class LanguageConverter {
        /**
         * Determine the language variant from the Accept-Language header.
         *
-        * @return Mixed: variant if one found, false otherwise.
+        * @return mixed Variant if one found, false otherwise.
         */
        protected function getHeaderVariant() {
                global $wgRequest;
@@ -456,9 +454,9 @@ class LanguageConverter {
         * Doesn't parse rules or do any of that other stuff, for that use
         * convert() or convertTo().
         *
-        * @param $text String: text to convert
-        * @param $variant String: variant language code
-        * @return String: translated text
+        * @param string $text Text to convert
+        * @param string $variant Variant language code
+        * @return string Translated text
         */
        public function translate( $text, $variant ) {
                wfProfileIn( __METHOD__ );
@@ -475,8 +473,8 @@ class LanguageConverter {
        /**
         * Call translate() to convert text to all valid variants.
         *
-        * @param $text String: the text to be converted
-        * @return Array: variant => converted text
+        * @param string $text The text to be converted
+        * @return array Variant => converted text
         */
        public function autoConvertToAllVariants( $text ) {
                wfProfileIn( __METHOD__ );
@@ -534,8 +532,8 @@ class LanguageConverter {
         * Auto convert a Title object to a readable string in the
         * preferred variant.
         *
-        * @param $title Title a object of Title
-        * @return String: converted title text
+        * @param Title $title A object of Title
+        * @return string Converted title text
         */
        public function convertTitle( $title ) {
                $variant = $this->getPreferredVariant();
@@ -552,9 +550,9 @@ class LanguageConverter {
        /**
         * Get the namespace display name in the preferred variant.
         *
-        * @param $index int namespace id
-        * @param $variant string|null variant code or null for preferred variant
-        * @return String: namespace name for display
+        * @param int $index Namespace id
+        * @param string|null $variant Variant code or null for preferred variant
+        * @return string Namespace name for display
         */
        public function convertNamespace( $index, $variant = null ) {
                if ( $variant === null ) {
@@ -591,8 +589,8 @@ class LanguageConverter {
         * -{flags|code1:text1;code2:text2;...}-  or
         * -{text}- in which case no conversion should take place for text
         *
-        * @param $text String: text to be converted
-        * @return String: converted text
+        * @param string $text Text to be converted
+        * @return string Converted text
         */
        public function convert( $text ) {
                $variant = $this->getPreferredVariant();
@@ -602,9 +600,9 @@ class LanguageConverter {
        /**
         * Same as convert() except a extra parameter to custom variant.
         *
-        * @param $text String: text to be converted
-        * @param $variant String: the target variant code
-        * @return String: converted text
+        * @param string $text Text to be converted
+        * @param string $variant The target variant code
+        * @return string Converted text
         */
        public function convertTo( $text, $variant ) {
                global $wgDisableLangConversion;
@@ -620,10 +618,10 @@ class LanguageConverter {
         * Recursively convert text on the outside. Allow to use nested
         * markups to custom rules.
         *
-        * @param $text String: text to be converted
-        * @param $variant String: the target variant code
-        * @param $depth Integer: depth of recursion
-        * @return String: converted text
+        * @param string $text Text to be converted
+        * @param string $variant The target variant code
+        * @param int $depth Depth of recursion
+        * @return string Converted text
         */
        protected function recursiveConvertTopLevel( $text, $variant, $depth = 0 ) {
                $startPos = 0;
@@ -659,13 +657,13 @@ class LanguageConverter {
        /**
         * Recursively convert text on the inside.
         *
-        * @param $text String: text to be converted
-        * @param $variant String: the target variant code
-        * @param $startPos int
-        * @param $depth Integer: depth of recursion
+        * @param string $text Text to be converted
+        * @param string $variant The target variant code
+        * @param int $startPos
+        * @param int $depth Depth of recursion
         *
         * @throws MWException
-        * @return String: converted text
+        * @return string Converted text
         */
        protected function recursiveConvertRule( $text, $variant, &$startPos, $depth = 0 ) {
                // Quick sanity check (no function calls)
@@ -739,11 +737,11 @@ class LanguageConverter {
         * non-existing link in one variant actually exists in another variant.
         * This function tries to find it. See e.g. LanguageZh.php
         *
-        * @param $link String: the name of the link
-        * @param $nt Mixed: the title object of the link
-        * @param $ignoreOtherCond Boolean: to disable other conditions when
-        *              we need to transclude a template or update a category's link
-        * @return Null, the input parameters may be modified upon return
+        * @param string $link The name of the link
+        * @param mixed $nt The title object of the link
+        * @param bool $ignoreOtherCond To disable other conditions when
+        *   we need to transclude a template or update a category's link
+        * @return void Null, the input parameters may be modified upon return
         */
        public function findVariantLink( &$link, &$nt, $ignoreOtherCond = false ) {
                # If the article has already existed, there is no need to
@@ -843,7 +841,7 @@ class LanguageConverter {
        /**
         * Load conversion tables either from the cache or the disk.
         * @private
-        * @param $fromCache Boolean: load from memcached? Defaults to true.
+        * @param bool $fromCache Load from memcached? Defaults to true.
         */
        function loadTables( $fromCache = true ) {
                global $wgLangConvMemc;
@@ -911,9 +909,9 @@ class LanguageConverter {
         * To make the tables more manageable, subpages are allowed
         * and will be parsed recursively if $recursive == true.
         *
-        * @param $code String: language code
-        * @param $subpage String: subpage name
-        * @param $recursive Boolean: parse subpages recursively? Defaults to true.
+        * @param string $code Language code
+        * @param string $subpage Subpage name
+        * @param bool $recursive Parse subpages recursively? Defaults to true.
         *
         * @return array
         */
@@ -1020,9 +1018,9 @@ class LanguageConverter {
         * Enclose a string with the "no conversion" tag. This is used by
         * various functions in the Parser.
         *
-        * @param $text String: text to be tagged for no conversion
-        * @param $noParse Boolean: unused
-        * @return String: the tagged text
+        * @param string $text Text to be tagged for no conversion
+        * @param bool $noParse Unused
+        * @return string The tagged text
         */
        public function markNoConversion( $text, $noParse = false ) {
                # don't mark if already marked
@@ -1051,16 +1049,16 @@ class LanguageConverter {
         * MediaWiki:Conversiontable* is updated.
         * @private
         *
-        * @param $page WikiPage object
-        * @param $user Object: User object for the current user
-        * @param $content Content: new page content
-        * @param $summary String: edit summary of the edit
-        * @param $isMinor Boolean: was the edit marked as minor?
-        * @param $isWatch Boolean: did the user watch this page or not?
-        * @param $section
-        * @param $flags int Bitfield
-        * @param $revision Object: new Revision object or null
-        * @return Boolean: true
+        * @param WikiPage $page
+        * @param User $user User object for the current user
+        * @param Content $content new page content
+        * @param string $summary edit summary of the edit
+        * @param bool $isMinor was the edit marked as minor?
+        * @param bool $isWatch did the user watch this page or not?
+        * @param string|int $section
+        * @param int $flags Bitfield
+        * @param Revision $revision new Revision object or null
+        * @return bool true
         */
        function OnPageContentSaveComplete( $page, $user, $content, $summary, $isMinor,
                        $isWatch, $section, $flags, $revision ) {
@@ -1082,9 +1080,9 @@ class LanguageConverter {
         * Armour rendered math against conversion.
         * Escape special chars in parsed math text. (in most cases are img elements)
         *
-        * @param $text String: text to armour against conversion
-        * @return String: armoured text where { and } have been converted to
-        *                 &#123; and &#125;
+        * @param string $text Text to armour against conversion
+        * @return string Armoured text where { and } have been converted to
+        *   &#123; and &#125;
         * @deprecated since 1.22 is no longer used
         */
        public function armourMath( $text ) {
@@ -1123,485 +1121,3 @@ class LanguageConverter {
                return $this->mVarSeparatorPattern;
        }
 }
-
-/**
- * Parser for rules of language conversion , parse rules in -{ }- tag.
- * @ingroup Language
- * @author fdcn <fdcn64@gmail.com>, PhiLiP <philip.npc@gmail.com>
- */
-class ConverterRule {
-       public $mText; // original text in -{text}-
-       public $mConverter; // LanguageConverter object
-       public $mRuleDisplay = '';
-       public $mRuleTitle = false;
-       public $mRules = '';// string : the text of the rules
-       public $mRulesAction = 'none';
-       public $mFlags = array();
-       public $mVariantFlags = array();
-       public $mConvTable = array();
-       public $mBidtable = array();// array of the translation in each variant
-       public $mUnidtable = array();// array of the translation in each variant
-
-       /**
-        * Constructor
-        *
-        * @param $text String: the text between -{ and }-
-        * @param $converter LanguageConverter object
-        */
-       public function __construct( $text, $converter ) {
-               $this->mText = $text;
-               $this->mConverter = $converter;
-       }
-
-       /**
-        * Check if variants array in convert array.
-        *
-        * @param $variants Array or string: variant language code
-        * @return String: translated text
-        */
-       public function getTextInBidtable( $variants ) {
-               $variants = (array)$variants;
-               if ( !$variants ) {
-                       return false;
-               }
-               foreach ( $variants as $variant ) {
-                       if ( isset( $this->mBidtable[$variant] ) ) {
-                               return $this->mBidtable[$variant];
-                       }
-               }
-               return false;
-       }
-
-       /**
-        * Parse flags with syntax -{FLAG| ... }-
-        * @private
-        */
-       function parseFlags() {
-               $text = $this->mText;
-               $flags = array();
-               $variantFlags = array();
-
-               $sepPos = strpos( $text, '|' );
-               if ( $sepPos !== false ) {
-                       $validFlags = $this->mConverter->mFlags;
-                       $f = StringUtils::explode( ';', substr( $text, 0, $sepPos ) );
-                       foreach ( $f as $ff ) {
-                               $ff = trim( $ff );
-                               if ( isset( $validFlags[$ff] ) ) {
-                                       $flags[$validFlags[$ff]] = true;
-                               }
-                       }
-                       $text = strval( substr( $text, $sepPos + 1 ) );
-               }
-
-               if ( !$flags ) {
-                       $flags['S'] = true;
-               } elseif ( isset( $flags['R'] ) ) {
-                       $flags = array( 'R' => true );// remove other flags
-               } elseif ( isset( $flags['N'] ) ) {
-                       $flags = array( 'N' => true );// remove other flags
-               } elseif ( isset( $flags['-'] ) ) {
-                       $flags = array( '-' => true );// remove other flags
-               } elseif ( count( $flags ) == 1 && isset( $flags['T'] ) ) {
-                       $flags['H'] = true;
-               } elseif ( isset( $flags['H'] ) ) {
-                       // replace A flag, and remove other flags except T
-                       $temp = array( '+' => true, 'H' => true );
-                       if ( isset( $flags['T'] ) ) {
-                               $temp['T'] = true;
-                       }
-                       if ( isset( $flags['D'] ) ) {
-                               $temp['D'] = true;
-                       }
-                       $flags = $temp;
-               } else {
-                       if ( isset( $flags['A'] ) ) {
-                               $flags['+'] = true;
-                               $flags['S'] = true;
-                       }
-                       if ( isset( $flags['D'] ) ) {
-                               unset( $flags['S'] );
-                       }
-                       // try to find flags like "zh-hans", "zh-hant"
-                       // allow syntaxes like "-{zh-hans;zh-hant|XXXX}-"
-                       $variantFlags = array_intersect( array_keys( $flags ), $this->mConverter->mVariants );
-                       if ( $variantFlags ) {
-                               $variantFlags = array_flip( $variantFlags );
-                               $flags = array();
-                       }
-               }
-               $this->mVariantFlags = $variantFlags;
-               $this->mRules = $text;
-               $this->mFlags = $flags;
-       }
-
-       /**
-        * Generate conversion table.
-        * @private
-        */
-       function parseRules() {
-               $rules = $this->mRules;
-               $bidtable = array();
-               $unidtable = array();
-               $variants = $this->mConverter->mVariants;
-               $varsep_pattern = $this->mConverter->getVarSeparatorPattern();
-
-               // Split according to $varsep_pattern, but ignore semicolons from HTML entities
-               $rules = preg_replace( '/(&[#a-zA-Z0-9]+);/', "$1\x01", $rules );
-               $choice = preg_split( $varsep_pattern, $rules );
-               $choice = str_replace( "\x01", ';', $choice );
-
-               foreach ( $choice as $c ) {
-                       $v = explode( ':', $c, 2 );
-                       if ( count( $v ) != 2 ) {
-                               // syntax error, skip
-                               continue;
-                       }
-                       $to = trim( $v[1] );
-                       $v = trim( $v[0] );
-                       $u = explode( '=>', $v, 2 );
-                       // if $to is empty, strtr() could return a wrong result
-                       if ( count( $u ) == 1 && $to && in_array( $v, $variants ) ) {
-                               $bidtable[$v] = $to;
-                       } elseif ( count( $u ) == 2 ) {
-                               $from = trim( $u[0] );
-                               $v = trim( $u[1] );
-                               if ( array_key_exists( $v, $unidtable )
-                                       && !is_array( $unidtable[$v] )
-                                       && $to
-                                       && in_array( $v, $variants ) ) {
-                                       $unidtable[$v] = array( $from => $to );
-                               } elseif ( $to && in_array( $v, $variants ) ) {
-                                       $unidtable[$v][$from] = $to;
-                               }
-                       }
-                       // syntax error, pass
-                       if ( !isset( $this->mConverter->mVariantNames[$v] ) ) {
-                               $bidtable = array();
-                               $unidtable = array();
-                               break;
-                       }
-               }
-               $this->mBidtable = $bidtable;
-               $this->mUnidtable = $unidtable;
-       }
-
-       /**
-        * @private
-        *
-        * @return string
-        */
-       function getRulesDesc() {
-               $codesep = $this->mConverter->mDescCodeSep;
-               $varsep = $this->mConverter->mDescVarSep;
-               $text = '';
-               foreach ( $this->mBidtable as $k => $v ) {
-                       $text .= $this->mConverter->mVariantNames[$k] . "$codesep$v$varsep";
-               }
-               foreach ( $this->mUnidtable as $k => $a ) {
-                       foreach ( $a as $from => $to ) {
-                               $text .= $from . '⇒' . $this->mConverter->mVariantNames[$k] .
-                                       "$codesep$to$varsep";
-                       }
-               }
-               return $text;
-       }
-
-       /**
-        * Parse rules conversion.
-        * @private
-        *
-        * @param $variant
-        *
-        * @return string
-        */
-       function getRuleConvertedStr( $variant ) {
-               $bidtable = $this->mBidtable;
-               $unidtable = $this->mUnidtable;
-
-               if ( count( $bidtable ) + count( $unidtable ) == 0 ) {
-                       return $this->mRules;
-               } else {
-                       // display current variant in bidirectional array
-                       $disp = $this->getTextInBidtable( $variant );
-                       // or display current variant in fallbacks
-                       if ( !$disp ) {
-                               $disp = $this->getTextInBidtable(
-                                               $this->mConverter->getVariantFallbacks( $variant ) );
-                       }
-                       // or display current variant in unidirectional array
-                       if ( !$disp && array_key_exists( $variant, $unidtable ) ) {
-                               $disp = array_values( $unidtable[$variant] );
-                               $disp = $disp[0];
-                       }
-                       // or display frist text under disable manual convert
-                       if ( !$disp && $this->mConverter->mManualLevel[$variant] == 'disable' ) {
-                               if ( count( $bidtable ) > 0 ) {
-                                       $disp = array_values( $bidtable );
-                                       $disp = $disp[0];
-                               } else {
-                                       $disp = array_values( $unidtable );
-                                       $disp = array_values( $disp[0] );
-                                       $disp = $disp[0];
-                               }
-                       }
-                       return $disp;
-               }
-       }
-
-       /**
-        * Similar to getRuleConvertedStr(), but this prefers to use original
-        * page title if $variant === $this->mConverter->mMainLanguageCode
-        * and may return false in this case (so this title conversion rule
-        * will be ignored and the original title is shown).
-        *
-        * @since 1.22
-        * @param $variant The variant code to display page title in
-        * @return String|false The converted title or false if just page name
-        */
-       function getRuleConvertedTitle( $variant ) {
-               if ( $variant === $this->mConverter->mMainLanguageCode ) {
-                       // If a string targeting exactly this variant is set,
-                       // use it. Otherwise, just return false, so the real
-                       // page name can be shown (and because variant === main,
-                       // there'll be no further automatic conversion).
-                       $disp = $this->getTextInBidtable( $variant );
-                       if ( $disp ) {
-                               return $disp;
-                       }
-                       if ( array_key_exists( $variant, $this->mUnidtable ) ) {
-                               $disp = array_values( $this->mUnidtable[$variant] );
-                               $disp = $disp[0];
-                       }
-                       // Assigned above or still false.
-                       return $disp;
-               } else {
-                       return $this->getRuleConvertedStr( $variant );
-               }
-       }
-
-       /**
-        * Generate conversion table for all text.
-        * @private
-        */
-       function generateConvTable() {
-               // Special case optimisation
-               if ( !$this->mBidtable && !$this->mUnidtable ) {
-                       $this->mConvTable = array();
-                       return;
-               }
-
-               $bidtable = $this->mBidtable;
-               $unidtable = $this->mUnidtable;
-               $manLevel = $this->mConverter->mManualLevel;
-
-               $vmarked = array();
-               foreach ( $this->mConverter->mVariants as $v ) {
-                       /* for bidirectional array
-                               fill in the missing variants, if any,
-                               with fallbacks */
-                       if ( !isset( $bidtable[$v] ) ) {
-                               $variantFallbacks =
-                                       $this->mConverter->getVariantFallbacks( $v );
-                               $vf = $this->getTextInBidtable( $variantFallbacks );
-                               if ( $vf ) {
-                                       $bidtable[$v] = $vf;
-                               }
-                       }
-
-                       if ( isset( $bidtable[$v] ) ) {
-                               foreach ( $vmarked as $vo ) {
-                                       // use syntax: -{A|zh:WordZh;zh-tw:WordTw}-
-                                       // or -{H|zh:WordZh;zh-tw:WordTw}-
-                                       // or -{-|zh:WordZh;zh-tw:WordTw}-
-                                       // to introduce a custom mapping between
-                                       // words WordZh and WordTw in the whole text
-                                       if ( $manLevel[$v] == 'bidirectional' ) {
-                                               $this->mConvTable[$v][$bidtable[$vo]] = $bidtable[$v];
-                                       }
-                                       if ( $manLevel[$vo] == 'bidirectional' ) {
-                                               $this->mConvTable[$vo][$bidtable[$v]] = $bidtable[$vo];
-                                       }
-                               }
-                               $vmarked[] = $v;
-                       }
-                       /* for unidirectional array fill to convert tables */
-                       if ( ( $manLevel[$v] == 'bidirectional' || $manLevel[$v] == 'unidirectional' )
-                               && isset( $unidtable[$v] )
-                       ) {
-                               if ( isset( $this->mConvTable[$v] ) ) {
-                                       $this->mConvTable[$v] = array_merge( $this->mConvTable[$v], $unidtable[$v] );
-                               } else {
-                                       $this->mConvTable[$v] = $unidtable[$v];
-                               }
-                       }
-               }
-       }
-
-       /**
-        * Parse rules and flags.
-        * @param $variant String: variant language code
-        */
-       public function parse( $variant = null ) {
-               if ( !$variant ) {
-                       $variant = $this->mConverter->getPreferredVariant();
-               }
-
-               $this->parseFlags();
-               $flags = $this->mFlags;
-
-               // convert to specified variant
-               // syntax: -{zh-hans;zh-hant[;...]|<text to convert>}-
-               if ( $this->mVariantFlags ) {
-                       // check if current variant in flags
-                       if ( isset( $this->mVariantFlags[$variant] ) ) {
-                               // then convert <text to convert> to current language
-                               $this->mRules = $this->mConverter->autoConvert( $this->mRules,
-                                       $variant );
-                       } else {
-                               // if current variant no in flags,
-                               // then we check its fallback variants.
-                               $variantFallbacks =
-                                       $this->mConverter->getVariantFallbacks( $variant );
-                               if ( is_array( $variantFallbacks ) ) {
-                                       foreach ( $variantFallbacks as $variantFallback ) {
-                                               // if current variant's fallback exist in flags
-                                               if ( isset( $this->mVariantFlags[$variantFallback] ) ) {
-                                                       // then convert <text to convert> to fallback language
-                                                       $this->mRules =
-                                                               $this->mConverter->autoConvert( $this->mRules,
-                                                                       $variantFallback );
-                                                       break;
-                                               }
-                                       }
-                               }
-                       }
-                       $this->mFlags = $flags = array( 'R' => true );
-               }
-
-               if ( !isset( $flags['R'] ) && !isset( $flags['N'] ) ) {
-                       // decode => HTML entities modified by Sanitizer::removeHTMLtags
-                       $this->mRules = str_replace( '=&gt;', '=>', $this->mRules );
-                       $this->parseRules();
-               }
-               $rules = $this->mRules;
-
-               if ( !$this->mBidtable && !$this->mUnidtable ) {
-                       if ( isset( $flags['+'] ) || isset( $flags['-'] ) ) {
-                               // fill all variants if text in -{A/H/-|text} without rules
-                               foreach ( $this->mConverter->mVariants as $v ) {
-                                       $this->mBidtable[$v] = $rules;
-                               }
-                       } elseif ( !isset( $flags['N'] ) && !isset( $flags['T'] ) ) {
-                               $this->mFlags = $flags = array( 'R' => true );
-                       }
-               }
-
-               $this->mRuleDisplay = false;
-               foreach ( $flags as $flag => $unused ) {
-                       switch ( $flag ) {
-                               case 'R':
-                                       // if we don't do content convert, still strip the -{}- tags
-                                       $this->mRuleDisplay = $rules;
-                                       break;
-                               case 'N':
-                                       // process N flag: output current variant name
-                                       $ruleVar = trim( $rules );
-                                       if ( isset( $this->mConverter->mVariantNames[$ruleVar] ) ) {
-                                               $this->mRuleDisplay = $this->mConverter->mVariantNames[$ruleVar];
-                                       } else {
-                                               $this->mRuleDisplay = '';
-                                       }
-                                       break;
-                               case 'D':
-                                       // process D flag: output rules description
-                                       $this->mRuleDisplay = $this->getRulesDesc();
-                                       break;
-                               case 'H':
-                                       // process H,- flag or T only: output nothing
-                                       $this->mRuleDisplay = '';
-                                       break;
-                               case '-':
-                                       $this->mRulesAction = 'remove';
-                                       $this->mRuleDisplay = '';
-                                       break;
-                               case '+':
-                                       $this->mRulesAction = 'add';
-                                       $this->mRuleDisplay = '';
-                                       break;
-                               case 'S':
-                                       $this->mRuleDisplay = $this->getRuleConvertedStr( $variant );
-                                       break;
-                               case 'T':
-                                       $this->mRuleTitle = $this->getRuleConvertedTitle( $variant );
-                                       $this->mRuleDisplay = '';
-                                       break;
-                               default:
-                                       // ignore unknown flags (but see error case below)
-                       }
-               }
-               if ( $this->mRuleDisplay === false ) {
-                       $this->mRuleDisplay = '<span class="error">'
-                               . wfMessage( 'converter-manual-rule-error' )->inContentLanguage()->escaped()
-                               . '</span>';
-               }
-
-               $this->generateConvTable();
-       }
-
-       /**
-        * @todo FIXME: code this function :)
-        */
-       public function hasRules() {
-               // TODO:
-       }
-
-       /**
-        * Get display text on markup -{...}-
-        * @return string
-        */
-       public function getDisplay() {
-               return $this->mRuleDisplay;
-       }
-
-       /**
-        * Get converted title.
-        * @return string
-        */
-       public function getTitle() {
-               return $this->mRuleTitle;
-       }
-
-       /**
-        * Return how deal with conversion rules.
-        * @return string
-        */
-       public function getRulesAction() {
-               return $this->mRulesAction;
-       }
-
-       /**
-        * Get conversion table. (bidirectional and unidirectional
-        * conversion table)
-        * @return array
-        */
-       public function getConvTable() {
-               return $this->mConvTable;
-       }
-
-       /**
-        * Get conversion rules string.
-        * @return string
-        */
-       public function getRules() {
-               return $this->mRules;
-       }
-
-       /**
-        * Get conversion flags.
-        * @return array
-        */
-       public function getFlags() {
-               return $this->mFlags;
-       }
-}
index a728c9d..06cb1b5 100644 (file)
@@ -190,9 +190,9 @@ class SrConverter extends LanguageConverter {
         * Guess if a text is written in Cyrillic or Latin.
         * Overrides LanguageConverter::guessVariant()
         *
-        * @param string  $text The text to be checked
-        * @param string  $variant Language code of the variant to be checked for
-        * @return bool  true if $text appears to be written in $variant
+        * @param string $text The text to be checked
+        * @param string $variant Language code of the variant to be checked for
+        * @return bool true if $text appears to be written in $variant
         *
         * @author Nikola Smolenski <smolensk@eunet.rs>
         * @since 1.19
index 6385ed1..43bd79a 100644 (file)
     "accountcreated": "Ureuëng ngui ka teupeugöt",
     "accountcreatedtext": "Ureuëng ngui keu [[{{ns:User}}:$1|$1]]([[{{ns:User talk}}:$1|talk]]) ka teupeugöt.",
     "createaccount-title": "Peugöt ureuëng ngui keu {{SITENAME}}",
-    "usernamehasherror": "Nan ureueng ngui han jeut na tanda pageue",
     "login-throttled": "Droeneuh ka lé that neuujoe tamöng.\nNeuprèh $1 sigohlom neuujoe lom.",
     "login-abort-generic": "Log tamöng droëneuh han meuhasé- Ngon ka geupeubateuë.",
     "loginlanguagelabel": "Bahsa: $1",
     "search-section": "(bideuëng $1)",
     "search-suggest": "Kadang meukeusud Droëneuh nakeuh: $1",
     "search-interwiki-caption": "Buët la’én",
-    "search-interwiki-default": "Hasé $1:",
+    "search-interwiki-default": "Hasé nibak $1:",
     "search-interwiki-more": "(lom)",
     "searchrelated": "meusambat",
     "searchall": "ban dum",
     "prefs-skin": "Kulét",
     "skin-preview": "Eu dilèe",
     "datedefault": "Hana geunalak",
-    "prefs-beta": "Fitur bèta",
-    "prefs-datetime": "Uroe ngön jeum",
     "prefs-user-pages": "Laman ureueng ngui",
     "prefs-personal": "Profil ureueng ngui",
     "prefs-rc": "Ban meuubah",
     "yourlanguage": "Bahsa:",
     "yournick": "Tanda jaroe barô:",
     "prefs-help-signature": "Komèntar bak ôn marit suwah neubôh \"<nowiki>~~~~</nowiki>\", nyang eunteuk meugantoe keu tanda jaroe droeneuh ngön watèe jinoe.",
-    "badsiglength": "Tanda jaroë droëneuh panyang that.\nBèk neupeuleubèh nibak $1 {{PLURAL:$1|haraih|haraih}}.",
+    "badsiglength": "Tanda jaroë droëneuh panyang that.\nBèk leubèh nibak $1 {{PLURAL:$1|karakter}}.",
     "gender-unknown": "Hana geupeunyata",
     "gender-male": "Ureueng agam",
     "gender-female": "Ureueng inöng",
     "reuploaddesc": "Riwang u laman peutamöng",
     "uploadnologin": "Hana lom meutamöng",
     "uploadnologintext": "Droeneuh suwah $1 keu neupeutamöng beureukaih.",
-    "uploadlog": "ceunatat peutamöng",
     "uploadlogpage": "Log peutamöng",
     "uploadlogpagetext": "Nyoe nakeuh dapeuta peutamöng barô.\nEu [[Special:NewFiles|galeri beureukaih barô]] keu seuneudeuh barô.",
     "filename": "Nan beureukaih",
     "filedesc": "Ehtisa",
     "fileuploadsummary": "Éhtisa:",
     "filesource": "Nè",
-    "uploadedfiles": "Beureukaih nyang meupeutamöng",
     "minlength1": "Nan beureukaih beuna saboh haraih.",
     "illegalfilename": "Nan beureukaih \"$1\" meuasoe seunurat nyang han jeut na bak nan. Tulông gantoe nan nyan sigohlom neupeutamöng lom.",
     "filename-toolong": "Nan beureukaih han jeut leubèh nibak 240 bita.",
     "filehist-dimensions": "Dimènsi",
     "filehist-filesize": "Rayek beureukah",
     "filehist-comment": "Seuneu'ôt",
-    "filehist-missing": "Beureukaih hana meutumèe",
     "imagelinks": "Seuneungui beureukaih",
     "linkstoimage": "{{PLURAL:$1|laman}} di yup nyoë mupawôt u beureukaih nyoë:",
     "nolinkstoimage": "Hana laman nyang na meupawôt u beureukaih nyoë.",
index f27f487..8dffa7f 100644 (file)
     "prefs-skin": "Omslag",
     "skin-preview": "Voorskou",
     "datedefault": "Geen voorkeur",
-    "prefs-beta": "Beta-funksies",
     "prefs-datetime": "Datum en tyd",
     "prefs-labs": "Labs-funksies",
     "prefs-user-pages": "Gebruikersbladsye",
     "nowatchlist": "U het geen items in u dophoulys nie.",
     "watchlistanontext": "$1 is noodsaaklik om u dophoulys te sien of te wysig.",
     "watchnologin": "Nie ingeteken nie",
-    "watchnologintext": "U moet [[Special:UserLogin|aangemeld]] wees om u dophoulys te verander.",
     "addwatch": "Voeg by dophoulys",
     "addedwatchtext": "Die bladsy \"[[:$1]]\" is by u [[Special:Watchlist|dophoulys]] bygevoeg.\nToekomstige wysigings aan hierdie bladsy en sy bybehorende besprekingsblad sal hier gelys word.",
     "removewatch": "Verwyder van dophoulys",
     "allmessagesname": "Naam",
     "allmessagesdefault": "Verstekteks",
     "allmessagescurrent": "Huidige teks",
-    "allmessagestext": "Hier is 'n lys boodskappe wat in die ''MediaWiki''-naamruimte teenwoordig is.\nGaan na [https://www.mediawiki.org/wiki/Localisation MediaWiki-lokalisasie] en [//translatewiki.net translatewiki.net] as u wil help om MediaWiki te vertaal.",
+    "allmessagestext": "Hier is 'n lys boodskappe wat in die ''MediaWiki''-naamruimte teenwoordig is.\nGaan na [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation MediaWiki-lokalisasie] en [//translatewiki.net translatewiki.net] as u wil help om MediaWiki te vertaal.",
     "allmessagesnotsupportedDB": "Daar is geen ondersteuning vir '''{{ns:special}}:Allmessages''' omdat '''$wgUseDatabaseMessages''' uitgeskakel is.",
     "allmessages-filter-legend": "Filter",
     "allmessages-filter": "Filtreer op staat van verandering:",
index ce2e154..e655c6e 100644 (file)
     "prefs-skin": "Doka",
     "skin-preview": "Parapâmja",
     "datedefault": "S'ka parapëlqim",
-    "prefs-beta": "karakteristika Beta",
     "prefs-datetime": "Data dhe ora",
     "prefs-labs": "Laboratorë karakteristika",
     "prefs-personal": "Profili i përdoruesit",
index d84788b..ba2aaab 100644 (file)
     "nowatchlist": "ዝርዝርዎ ባዶ ነው። ምንም ገጽ ገና አልተጨመረም።",
     "watchlistanontext": "የሚከታተሉት ገጾች ዝርዝርዎን ለመመልከት ወይም ለማስተካከል እባክዎ $1።",
     "watchnologin": "ገና አልገቡም",
-    "watchnologintext": "የሚከታተሏቸውን ገጾች ዝርዝር ለመቀየር [[Special:UserLogin|መግባት]] ይኖርብዎታል።",
     "addedwatchtext": "ገጹ «$1» [[Special:Watchlist|ለሚከታተሉት ገጾች]] ተጨምሯል። ወደፊት ይህ ገጽ ወይም የውይይቱ ገጽ ሲቀየር፣ በዚያ ዝርዝር ላይ ይታያል። በተጨማሪም [[Special:RecentChanges|«በቅርብ ጊዜ በተለወጡ» ገጾች]] ዝርዝር፣ በቀላሉ እንዲታይ በ'''ጉልህ ፊደላት''' ተጽፎ ይገኛል።\n\nበኋላ ጊዜ ገጹን ከሚከታተሉት ገጾች ለማስወግድ የፈለጉ እንደሆነ፣ በጫፉ ዳርቻ «አለመከታተል» የሚለውን ይጫኑ።",
     "removedwatchtext": "ይህ ገፅ \"[[:$1]]\" ከ [[Special:Watchlist|your watchlist]] ተወግዷል።",
     "watch": "ለመከታተል",
     "allmessagesname": "የመልእክት ስም",
     "allmessagesdefault": "የቆየው ጽሕፈት",
     "allmessagescurrent": "ያሁኑ ጽሕፈት",
-    "allmessagestext": "በ«MediaWiki» ክፍለ-ዊኪ ያሉት የድረገጽ መልክ መልእክቶች ሙሉ ዝርዝር ይህ ነው።\nPlease visit [https://www.mediawiki.org/wiki/Localisation MediaWiki Localisation] and [//translatewiki.net translatewiki.net] if you wish to contribute to the generic MediaWiki localisation.",
+    "allmessagestext": "በ«MediaWiki» ክፍለ-ዊኪ ያሉት የድረገጽ መልክ መልእክቶች ሙሉ ዝርዝር ይህ ነው።\nPlease visit [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation MediaWiki Localisation] and [//translatewiki.net translatewiki.net] if you wish to contribute to the generic MediaWiki localisation.",
     "allmessagesnotsupportedDB": "'''$wgUseDatabaseMessages''' ስለ ተዘጋ '''{{ns:special}}:Allmessages''' ሊጠቀም አይችልም።",
     "allmessages-filter-legend": "ማጣሪያ",
     "allmessages-filter-all": "ሁሉ",
index 32c37b0..054ba5c 100644 (file)
     "prefs-skin": "Aparencia",
     "skin-preview": "Fer una prebatina",
     "datedefault": "Sin de preferencias",
-    "prefs-beta": "Caracteristicas beta",
     "prefs-datetime": "Calendata y hora",
     "prefs-labs": "Caracteristicas experimentals",
     "prefs-personal": "Datos presonals",
     "nowatchlist": "No tien garra pachina en a lista de seguimiento.",
     "watchlistanontext": "Ha de $1 ta veyer u editar as dentradas d'a suya lista de seguimiento.",
     "watchnologin": "No ha encetato a sesión",
-    "watchnologintext": "Ha d'estar [[Special:UserLogin|identificato]] ta poder cambiar a suya lista de seguimiento.",
     "addwatch": "Adhibir ta la lista de seguimiento",
     "addedwatchtext": "A pachina «[[:$1]]» s'ha adhibito t'a suya [[Special:Watchlist|lista de seguimiento]]. Os cambios esdevenideros en ista pachina y en a suya pachina de descusión asociata s'indicarán astí, y a pachina amanixerá '''en negreta''' en a [[Special:RecentChanges|lista de cambios recients]] ta que se veiga millor. <p>Si nunca quiere borrar a pachina d'a suya lista de seguimiento, punche \"Deixar de cosirar\" en o menú.",
     "removewatch": "Sacar d'a lista de seguimiento",
     "allmessagesname": "Nombre",
     "allmessagesdefault": "texto por defecto",
     "allmessagescurrent": "texto actual",
-    "allmessagestext": "Ista ye una lista de totz os mensaches disponibles en o espacio de nombres MediaWiki.\nVesite por favor [https://www.mediawiki.org/wiki/Localisation a pachina sobre localización de MediaWiki] y  [//translatewiki.net translatewiki.net] si deseya contrebuyir t'a localización cheneral de MediaWiki.",
+    "allmessagestext": "Ista ye una lista de totz os mensaches disponibles en o espacio de nombres MediaWiki.\nVesite por favor [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation a pachina sobre localización de MediaWiki] y  [//translatewiki.net translatewiki.net] si deseya contrebuyir t'a localización cheneral de MediaWiki.",
     "allmessagesnotsupportedDB": "Ista pachina no ye disponible porque wgUseDatabaseMessages ye desactivato.",
     "allmessages-filter-legend": "Filtro",
     "allmessages-filter": "Filtrar por estau de personalización:",
index cd0ec77..b01ffee 100644 (file)
     "disclaimers": "अस्वीकरण",
     "disclaimerpage": "Project:साधारण अस्वीकरण",
     "edithelp": "संपादन मॆं सहायता",
-    "helppage": "Help:सहायता",
     "mainpage": "मुख्य पृष्ठ",
     "privacy": "गोपनीयता नीति",
     "privacypage": "Project:गोपनीयता नीति",
index 9e85baa..3ad3f59 100644 (file)
@@ -1,6 +1,48 @@
 {
     "@metadata": {
-        "authors": []
+        "authors": [
+            ";Hiba;1",
+            "Abanima",
+            "Achraf94",
+            "Aiman titi",
+            "Alexknight12",
+            "Ali1",
+            "Alnokta",
+            "Amire80",
+            "Antime",
+            "Arjanizary",
+            "Asaifm",
+            "Avocato",
+            "Bachounda",
+            "Basharh",
+            "Bassem JARKAS",
+            "Ciphers",
+            "Claw eg",
+            "DRIHEM",
+            "Gharbeia",
+            "Houcinee1",
+            "Ibrahim.ID",
+            "Majid Al-Dharrab",
+            "Meno25",
+            "Mido",
+            "Mo7amedsalim",
+            "OsamaK",
+            "Reedy",
+            "Samer",
+            "TTMTT",
+            "Tarawneh",
+            "Tux-tn",
+            "Zanatos",
+            "أحمد",
+            "ترجمان05",
+            "روخو",
+            "زكريا",
+            "عمرو",
+            "محمد أحمد عبد الفتاح",
+            "مشعل الحربي",
+            "نصوح",
+            "وهراني"
+        ]
     },
     "tog-underline": "سطر تحت الوصلات:",
     "tog-hideminor": "أخف التعديلات الطفيفة في أحدث التغييرات",
     "print": "اطبع",
     "view": "مطالعة",
     "edit": "عدل",
+    "edit-local": "تعديل الوصف المحلي",
     "create": "أنشئ",
+    "create-local": "أضف وصفا محليا",
     "editthispage": "عدل هذه الصفحة",
     "create-this-page": "أنشئ صفحة بهذا العنوان",
     "delete": "حذف",
     "pool-timeout": "انتهت مهلة القفل",
     "pool-queuefull": "الطابور ملآن",
     "pool-errorunknown": "خطأ غير معروف",
+    "pool-servererror": "خدمة العداد غير متاحة ( $1 ).",
     "aboutsite": "عن {{SITENAME}}",
     "aboutpage": "Project:عن",
     "copyright": "المحتوى منشور وفق $1 إن لم يرد خلاف ذلك.",
     "accountcreatedtext": "أنشئ حساب مستخدم ل[[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|نقاش]]).",
     "createaccount-title": "إنشاء حساب في {{SITENAME}}",
     "createaccount-text": "شخص ما أنشأ حسابا لعنوان بريدك الإلكتروني في {{SITENAME}} ($4) بالاسم \"$2\"، كلمة السر \"$3\".\nينبغي عليك تسجيل الدخول وتغيير كلمة السر الخاصة بك الآن.\n\nيمكنك تجاهل هذه الرسالة، لو تم إنشاء هذا الحساب بالخطأ.",
-    "usernamehasherror": "لا يمكن أن يحتوي اسم المستخدم على محارف هاش",
     "login-throttled": "لقد قمت بمحاولات دخول كثيرة جدا مؤخرا.\nمن فضلك انتظر $1 قبل المحاولة مرة أخرى.",
     "login-abort-generic": "لم ينجح ولوجك - تم إجهاضه",
     "loginlanguagelabel": "اللغة: $1",
     "resetpass-abort-generic": "منعت مُلحقة إتمام صيرورة تغيير كلمة السّر.",
     "resetpass-expired": "انتهت مدة صلاحية كلمة السر الخاصة بك. الرجاء تعيين كلمة سر جديدة لتسجيل الدخول.",
     "resetpass-expired-soft": "انتهت مدة صلاحية كلمة السر الخاصة بك. الرجاء تعيين كلمة سر جديدة الآن أو النقر على زر إلغاء لإعادة تعيين كلمة السر لاحقاً.",
+    "resetpass-validity-soft": "كلمة السر الخاصة بك غير مقبولة :  $1 \n\nرجاءا اختر كلمة سر جديدة الآن، أو انقر فوق \"{{int:resetpass-submit-cancel}}\" لتغييرها في وقت لاحق.",
     "passwordreset": "إعادة ضبط كلمة السر",
     "passwordreset-text-one": "أكمل هذا النموذج لإعادة ضبط كلمة السر الخاصة بك.",
     "passwordreset-text-many": "{{PLURAL:$1||املأ الحقل لتستعيد كلمة السر|املأ أحد الحقلين لتستعيد كلمة السر|املأ أحد الحقول لتستعيد كلمة السر}}.",
     "prefs-skin": "واجهة",
     "skin-preview": "عرض مسبق",
     "datedefault": "لا تفضيل",
-    "prefs-beta": "مزايا تجريبية",
-    "prefs-datetime": "وقت وتاريخ",
     "prefs-labs": "مزايا مختبرية",
     "prefs-user-pages": "صفحات المستخدمين",
     "prefs-personal": "ملف المستخدم",
     "upload-permitted": "أنواع الملفات المسموحة: $1.",
     "upload-preferred": "أنواع الملفات المفضلة: $1.",
     "upload-prohibited": "أنواع الملفات الممنوعة: $1.",
-    "uploadlog": "سجل الرفع",
     "uploadlogpage": "سجل الرفع",
     "uploadlogpagetext": "في الأسفل قائمة بأحدث عمليات رفع الملفات.\nانظر [[Special:NewFiles|معرض الملفات الجديدة]] لعرض بصري أكثر",
     "filename": "اسم الملف",
     "filereuploadsummary": "تغييرات الملف:",
     "filestatus": "حالة حقوق النسخ:",
     "filesource": "مصدر:",
-    "uploadedfiles": "الملفات المرفوعة",
     "ignorewarning": "تجاهل التحذير واحفظ الملف على أية حال.",
     "ignorewarnings": "تجاهل أية تحذيرات",
     "minlength1": "أسماء الملفات يجب أن تتكون من حرف واحد على الأقل.",
     "overwroteimage": "رفع نسخة جديدة من \"[[$1]]\"",
     "uploaddisabled": "تم تعطيل الرفع",
     "copyuploaddisabled": "الرفع من مسار معطل.",
-    "uploadfromurl-queued": "رفعك قد أضيف إلى الطابور",
     "uploaddisabledtext": "رفع الملفات معطل.",
     "php-uploaddisabledtext": "رفع ملفات PHP معطل. من فضلك تحقق من إعدادات رفع الملفات.",
     "uploadscripted": "هذا الملف يضم كود HTML أو كود آخر يمكن أن يفسره متصفح الوب بطريقة خاطئة.",
+    "uploadscriptednamespace": "يحتوي ملف SVG هذا على اسم نطاق غير مشروع \" $1 \"",
     "uploadinvalidxml": "تعذر تحليل XML في الملف المرفوع.",
     "uploadvirus": "الملف يحتوي على فيروس! التفاصيل: $1",
     "uploadjava": "يحتوي ملف ZIP هذا على ملفات جافا .class.\nلا يسمح برفع ملفات جافا لأنها تتيح تخطي القيود الأمنية.",
     "upload-misc-error": "خطأ غير معروف في الرفع",
     "upload-misc-error-text": "حدث خطأ غير معروف أثناء عملية الرفع.\nمن فضلك تاكد أن المسار صحيح ومن الممكن الدخول عليه ثم حاول مرة أخرى.\nإذا استمرت المشكلة في الحدوث، اتصل [[Special:ListUsers/sysop|بإداري]].",
     "upload-too-many-redirects": "احتوى المسار تحويلات كثيرة جدا",
-    "upload-unknown-size": "حجم غير معروف",
     "upload-http-error": "صودف خطأ HTTP: $1",
     "upload-copy-upload-invalid-domain": "رفع النسخ غير متاح من هذا الموقع",
     "backend-fail-stream": "لا يمكن عرض الملف $1.",
     "img-auth-streaming": "عرض \"$1\".",
     "img-auth-public": "وظيفة img_auth.php هي لإخراج الملفات من ويكي سري.\nهذا الويكي مضبوط كويكي علني.\nلتأمين إضافي، img_auth.php تم تعطيلها.",
     "img-auth-noread": "لا يملك المستخدم صلاحية قراءة \"$1\".",
-    "img-auth-bad-query-string": "يحتوي المسار عبارة استعلام غير صالحة.",
     "http-invalid-url": "مسار غير صالح: $1",
     "http-invalid-scheme": "المسارات ذات البروتكول \"$1\" غير مدعومة.",
     "http-request-error": "فشل طلب HTTP لسبب غير معروف.",
     "filehist-dimensions": "الأبعاد",
     "filehist-filesize": "حجم الملف",
     "filehist-comment": "تعليق",
-    "filehist-missing": "ملف مفقود",
     "imagelinks": "استخدام الملف",
     "linkstoimage": "{{PLURAL:$1||الصفحة التالية تصل|الصفحتان التاليتان تصلان|ال$1 صفحات التالية تصل|ال$1 صفحة التالية تصل}} إلى هذا الملف:",
     "linkstoimage-more": "أكثر من {{PLURAL:$1||صفحة واحدة تصل|صفحتين تصلان|$1 صفحات تصل|$1 صفحة تصل}} إلى هذا الملف.\nالقائمة التالية تعرض فقط {{PLURAL:$1||أول صفحة تصل|أول صفحتين تصلان|أول $1 صفحات تصل|أول $1 صفحة تصل}} إلى هذا الملف.\n[[Special:WhatLinksHere/$2|قائمة كاملة]] متوفرة.",
     "download": "تنزيل",
     "unwatchedpages": "صفحات غير مراقبة",
     "listredirects": "عرض التحويلات",
+    "listduplicatedfiles": "قائمة الملفات مع المكررات",
     "unusedtemplates": "قوالب غير مستخدمة",
     "unusedtemplatestext": "هذه الصفحة تعرض كل الصفحات في نطاق {{ns:template}} غير المضمنة في صفحة أخرى.\nتذكر بأن تتحقق من الوصلات الأخرى للقوالب قبل حذفها.",
     "unusedtemplateswlh": "وصلات أخرى",
     "emailuser-title-notarget": "مراسلة المستخدم",
     "emailpage": "إرسال رسالة للمستخدم",
     "emailpagetext": "يمكنك استخدام الاستمارة بالأسفل لإرسال رسالة بريد إلكتروني إلى {{GENDER:$1|هذا المستخدم|هذه المستخدمة}}.\nسيظهر عنوان البريد الإلكتروني الذي أدخلته في [[Special:Preferences|تفضيلاتك]] كعنوان المرسل في البريد الإلكتروني، كي يستطيع المتلقي الرد عليك مباشرة.",
-    "usermailererror": "جسم البريد أرجع خطأ:",
     "defemailsubject": "رسالة {{SITENAME}} من المستخدم \"$1\"",
     "usermaildisabled": "بريد المستخدم الإلكتروني معطل",
     "usermaildisabledtext": "لا يمكنك إرسال بريد إلكتروني إلى مستخدمين آخرين على هذه الويكي",
     "noemailtitle": "لا يوجد عنوان بريد إلكتروني",
     "noemailtext": "لم يحدد هذا المستخدم عنوان بريد إلكتروني صحيح.",
-    "nowikiemailtitle": "لا بريد إلكتروني مسموح به",
     "nowikiemailtext": "هذا المستخدم اختار ألا يستقبل البريد الإلكتروني من المستخدمين الآخرين.",
     "emailnotarget": "المستلم ليس مستخدمًا موجودًا أو ليس مستخدمًا صحيحًا.",
     "emailtarget": "أدخل اسم مستخدم المستلم",
     "nowatchlist": "لا توجد مدخلات في قائمة مراقبتك.",
     "watchlistanontext": "الرجاء $1 لعرض أو تعديل الصفحات في قائمة مراقبتك.",
     "watchnologin": "غير مسجل الدخول",
-    "watchnologintext": "يجب أن تكون [[Special:UserLogin|مسجل الدخول]] لتعدل قائمة مراقبتك.",
     "addwatch": "إضافة إلى قائمة المراقبة",
     "addedwatchtext": "أضيفت الصفحة  \"[[:$1]]\" إلى [[Special:Watchlist|قائمة مراقبتك]].\nالتغييرات القادمة على هذه الصفحة وصفحة نقاشها سيتم وضعها هناك.",
     "removewatch": "إزالة من قائمة المراقبة",
     "watching": "يراقب...",
     "unwatching": "إزالة المراقبة...",
     "watcherrortext": "حدث خطأ أثناء تغيير إعدادات الرصد الخاصة بك \"$1\".",
-    "enotif_mailer": "نظام {{SITENAME}} البريدي للإخطارات",
     "enotif_reset": "علم على كل الصفحات كمزارة",
     "enotif_impersonal_salutation": "مستخدم {{SITENAME}}",
     "enotif_subject_deleted": "الصفحة {{SITENAME}} $1 حذفها {{الجنس: $2 | $2 }}",
     "excontent": "المحتوى كان: '$1'",
     "excontentauthor": "المحتوى كان: '$1' (والمساهم الوحيد كان '[[Special:Contributions/$2|$2]]')",
     "exbeforeblank": "المحتوى قبل الإفراغ كان: '$1'",
-    "exblank": "الصفحة كانت فارغة",
     "delete-confirm": "حذف \"$1\"",
     "delete-legend": "حذف",
     "historywarning": "'''تحذير:''' الصفحة التي توشك على حذفها لها تاريخ فيه {{PLURAL:$1||مراجعة واحدة|مراجعتان|$1 مراجعات|$1 مراجعة}} تقريبا:",
     "allmessagesname": "الاسم",
     "allmessagesdefault": "النص الافتراضي",
     "allmessagescurrent": "النص الحالي",
-    "allmessagestext": "هذه قائمة برسائل النظام المتوفرة في نطاق ميدياويكي.\nمن فضلك زر [https://www.mediawiki.org/wiki/Localisation ترجمة ميدياويكي] و [//translatewiki.net بيتاويكي] لو كنت ترغب في المساهمة في ترجمة ميدياويكي الأساسية.",
+    "allmessagestext": "هذه قائمة برسائل النظام المتوفرة في نطاق ميدياويكي.\nمن فضلك زر [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation ترجمة ميدياويكي] و [//translatewiki.net بيتاويكي] لو كنت ترغب في المساهمة في ترجمة ميدياويكي الأساسية.",
     "allmessagesnotsupportedDB": "هذه الصفحة لا يمكن استخدامها لأن '''$wgUseDatabaseMessages''' تم تعطيله.",
     "allmessages-filter-legend": "المرشح",
     "allmessages-filter": "رشح حسب حالة التخصيص:",
     "importunknownsource": "نوع مصدر استيراد مجهول",
     "importcantopen": "لم يمكن فتح ملف الاستيراد",
     "importbadinterwiki": "وصلة إنترويكي سيئة",
-    "importnotext": "فارغ أو لا نص",
     "importsuccess": "الاستيراد انتهى!",
-    "importhistoryconflict": "هناك مراجعة تاريخ متعارضة موجودة (ربما تكون قد استوردت هذه الصفحة من قبل)",
     "importnosources": "لم يتم تعريف مصادر للاستيراد عبر الويكي وعمليات رفع التاريخ المباشرة معطلة.",
     "importnofile": "لم يتم رفع ملف استيراد.",
     "importuploaderrorsize": "رفع ملف الاستيراد فشل.\nالملف أكبر من حجم الرفع المسموح.",
     "version-entrypoints": "نقطة دخول روابط المواقع",
     "version-entrypoints-header-entrypoint": "تقطة دخول",
     "version-entrypoints-header-url": "المسار",
-    "version-entrypoints-articlepath": "[https://www.mediawiki.org/wiki/Manual:$wgArticlePath مسار المقالات]",
-    "version-entrypoints-scriptpath": "[https://www.mediawiki.org/wiki/Manual:$wgScriptPath مسار السكريبت]",
+    "version-entrypoints-articlepath": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgArticlePath مسار المقالات]",
+    "version-entrypoints-scriptpath": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgScriptPath مسار السكريبت]",
     "redirect": "تحويل حسب رقم الملف أو رقم المستخدم أو رقم الصفحة أو رقم مراجعة",
     "redirect-legend": "تحويل إلى ملف أو صفحة",
     "redirect-summary": "هذه الصفحة الخاصة تحوّل إلى ملف (باسمه) أو صفحة (برقم إحدى مراجعاتها) أو إلى صفحة مستخدم (برقمه التعريفي). الاستخدام [[{{#Special:Redirect}}/file/Example.jpg]] أو [[{{#Special:Redirect}}/revision/328429]] أو [[{{#Special:Redirect}}/user/101]].",
index d19963f..2653a5f 100644 (file)
     "accountcreatedtext": "ܐܬܒܪܝ ܚܘܫܒܢܐ ܕܡܦܠܚܢܐ ܠ $1.",
     "createaccount-title": "ܒܪܝܐ ܕܚܘܫܒܢܐ ܒ {{SITENAME}}",
     "loginlanguagelabel": "ܠܫܢܐ: $1",
+    "pt-login": "ܥܘܠ",
+    "pt-login-button": "ܥܘܠ",
+    "pt-createaccount": "ܒܪܝ ܚܘܫܒܢܐ",
+    "pt-userlogout": "ܦܠܘܛ",
     "changepassword": "ܫܚܠܦ ܡܠܬܐ ܕܥܠܠܐ",
     "resetpass_header": "ܫܚܠܦ ܡܠܬܐ ܕܥܠܠܐ ܕܚܘܫܒܢܐ",
     "oldpassword": "ܡܠܬܐ ܕܥܠܠܐ ܥܬܝܩܬܐ:",
     "prefs-skin": "ܓܠܕܐ",
     "skin-preview": "ܚܝܪܐ ܩܕܡܝܐ",
     "datedefault": "ܠܐ ܨܒܝܢܝܘܬܐ",
-    "prefs-datetime": "ܣܝܩܘܡܐ ܘܙܒܢܐ",
     "prefs-personal": "ܦܘܓܪܦܐ ܕܡܦܠܚܢܐ",
     "prefs-rc": "ܫܘܚܠܦ̈ܐ ܚܕ̈ܬܐ",
     "prefs-watchlist": "ܪ̈ܗܝܬܐ",
     "rcnotefrom": "ܠܬܚܬ ܫܘܚܠܦ̈ܐ ܕܡܢ '''$2''' (ܥܕ '''$1''' ܡܬܚܙܝܢ̈ܐ).",
     "rclistfrom": "ܚܘܝ ܫܘܚܠܦ̈ܐ ܚܕ̈ܬܐ ܡܢ $1",
     "rcshowhideminor": "$1 ܫܘܚܠܦ̈ܐ ܙܥܘܪ̈ܐ",
+    "rcshowhideminor-show": "ܚܘܝ",
+    "rcshowhideminor-hide": "ܛܫܝ",
     "rcshowhidebots": "$1 ܒܘܬ̈ܐ (Bots)",
+    "rcshowhidebots-show": "ܚܘܝ",
+    "rcshowhidebots-hide": "ܛܫܝ",
     "rcshowhideliu": "$1 ܡܦܠܚܢ̈ܐ ܡܣܓܠ̈ܐ",
+    "rcshowhideliu-show": "ܚܘܝ",
+    "rcshowhideliu-hide": "ܛܫܝ",
     "rcshowhideanons": "$1 ܡܦܠܚܢܐ ܠܐ ܝܕܝܥܐ",
+    "rcshowhideanons-show": "ܚܘܝ",
+    "rcshowhideanons-hide": "ܛܫܝ",
     "rcshowhidepatr": "$1 ܫܘܚܠܦ̈ܐ ܬܢܝ̈ܐ",
+    "rcshowhidepatr-show": "ܚܘܝ",
+    "rcshowhidepatr-hide": "ܛܫܝ",
     "rcshowhidemine": "$1 ܫܘܚܠܦ̈ܝ",
+    "rcshowhidemine-show": "ܚܘܝ",
+    "rcshowhidemine-hide": "ܛܫܝ",
     "rclinks": "ܚܘܝ $1 ܫܘܚܠܦ̈ܐ ܐܚܪ̈ܝܐ ܒ $2 ܝܘܡܬ̈ܐ ܐܚܪ̈ܝܐ<br />$3",
     "diff": "ܦܘܪܫܐ",
     "hist": "ܬܫܥܝܬܐ",
     "uploadbtn": "ܐܣܩ ܠܦܦܐ",
     "uploadnologin": "ܠܝܬܝܟ ܥܠܝܠܐ",
     "uploaderror": "ܦܘܕܐ ܒܡܣܩܬܐ",
-    "uploadlog": "ܣܓܠܐ ܕܣܠܩܐ",
     "uploadlogpage": "ܣܓܠܐ ܕܣܠܩܐ",
     "filename": "ܫܡܐ ܕܠܦܦܐ",
     "filedesc": "ܦܣܝܩܬ̈ܐ",
     "upload-proto-error": "ܦܪܘܛܘܩܘܠ ܠܐ ܬܪܝܨܐ",
     "upload-file-error": "ܦܘܕܐ ܓܘܝܐ",
     "upload-misc-error": "ܦܘܕܐ ܠܐ ܝܕܝܥܐ ܒܐܣܩܬܐ ܕܠܦܦܐ",
-    "upload-unknown-size": "ܥܓܪܐ ܠܐ ܝܕܝܥܐ",
     "img-auth-nofile": "ܠܦܦܐ \"$1\" ܠܝܬ ܠܗ ܐܝܬܘܬܐ.",
     "http-read-error": "HTTP ܦܘܕܐ ܒܩܪܝܬܐ.",
     "http-curl-error": "ܦܘܕܐ ܒܫܟܚܐ ܕURL: $1",
     "nowatchlist": "ܠܝܬ ܠܟ ܡܕܡ ܒܪ̈ܗܝܬܐ ܕܝܠܟ",
     "watchlistanontext": "$1 ܠܚܙܝܐ ܐܘ ܫܚܠܦܬܐ ܕܦܐܬܬ̈ܐ ܒܪ̈ܗܝܬܟ.",
     "watchnologin": "ܠܝܬܝܟ ܥܠܝܠܐ",
-    "watchnologintext": "ܐܠܨܐ ܕܬܗܘܐ [[Special:UserLogin|ܥܠܝܠܐ]] ܠܫܚܠܦܬܐ ܕܪ̈ܗܝܬܟ.",
     "addwatch": "ܐܘܣܦ ܥܠ ܪ̈ܗܝܬܝ",
     "addedwatchtext": "ܦܐܬܐ ܕ\"[[:$1]]\" ܐܬܬܘܣܦܬ ܠ[[Special:Watchlist|ܪ̈ܗܝܬܟ]].\nܐܝܢܐ ܫܘܚܠܦܐ ܥܠ ܦܐܬܐ ܗܕܐ ܒܕܥܬܝܕ ܬܬܓܠܚ ܥܡ ܦܐܬܐ ܕܡܡܠܠܐ ܕܝܠܗ ܬܡܢ.",
     "removewatch": "ܫܩܘܠ ܡܢ ܪ̈ܗܝܬܝ",
     "confirm": "ܫܪܪ",
     "excontent": "ܚܒܝܫܬ̈ܐ ܗܘ̈ܝ: '$1'",
     "excontentauthor": "ܚܒܝܫܬ̈ܐ ܗܘ̈ܝ: '$1' (ܘܫܘܬܦܢܐ ܝܚܝܕܝܐ ܗܘܐ '[[Special:Contributions/$2|$2]]')",
-    "exblank": "ܦܐܬܐ ܣܦܝܩܬܐ ܗܘܐ",
     "delete-confirm": "ܫܘܦ \"$1\"",
     "delete-legend": "ܫܘܦ",
     "actioncomplete": "ܥܡܠܝܬܐ ܓܡܪܬ",
     "import-upload-filename": "ܫܡܐ ܕܠܦܦܐ:",
     "import-revision-count": "$1 {{PLURAL:$1|ܬܢܝܬܐ |ܬܢܝܬ̈ܐ}}",
     "importnopages": "ܠܝܬ ܦܐܬܬ̈ܐ ܠܡܥܠܢܘܬܐ.",
-    "importnotext": "ܣܦܝܩܐ ܐܘ ܠܝܬ ܒܗ ܟܬܒܬܐ",
     "importsuccess": "ܡܥܠܢܘܬܐ ܓܡܪܬ",
     "import-noarticle": "ܠܝܬ ܦܐܬܬ̈ܐ ܠܡܥܠܢܘܬܐ!",
     "import-upload": "ܐܣܩ ܓܠܝܬ̈ܐ  ܕ XML",
index 3a8ba17..3f3ce11 100644 (file)
     "prefs-skin": "الوش",
     "skin-preview": "بروفه",
     "datedefault": "مافبش تفضيل",
-    "prefs-beta": "خصايص Beta",
     "prefs-datetime": "وقت وتاريخ",
     "prefs-labs": "خصايص Labs",
     "prefs-personal": "الپروفيل بتاع اليوزر",
     "nowatchlist": "مافيش حاجة فى لستة مراقبتك.",
     "watchlistanontext": "لو سمحت $1 لعرض أو تعديل الصفحات فى لستة مراقبتك.",
     "watchnologin": "مش متسجل",
-    "watchnologintext": "لازم تكون [[Special:UserLogin|مسجل الدخول]] علشان تعدل لستة المراقبة بتاعتك.",
     "addedwatchtext": "تمت إضافة الصفحه  \"$1\"  [[Special:Watchlist|للستة الصفحات اللى بتراقبها]].\nالتعديلات اللى بعد كده ها تتحط على الصفحه دى، وصفحة المناقش الخاصه بها ها تتحط هناك. واسم الصفحة هايظهر  بخط <b>عريض</b> فى صفحة [[Special:RecentChanges|أحدث التعديلات]] لتسهيل تحديدها واكتشافها.",
     "removedwatchtext": "الصفحه دى اتشالت \"[[:$1]]\" من [[Special:Watchlist|لستة الصفحات اللى بتراقبها]].",
     "watch": "راقب",
     "allmessagesname": "اسم",
     "allmessagesdefault": "النص الاوتوماتيكي",
     "allmessagescurrent": "النص دلوقتى",
-    "allmessagestext": "دى لستة برسايل النظام المتوفرة فى نطاق ميدياويكي.\nلو سمحت تزور[https://www.mediawiki.org/wiki/Localisation ترجمة ميدياويكي] و [//translatewiki.net بيتاويكي] لو كنت عايز تساهم فى ترجمة ميدياويكى الاصلية.",
+    "allmessagestext": "دى لستة برسايل النظام المتوفرة فى نطاق ميدياويكي.\nلو سمحت تزور[https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation ترجمة ميدياويكي] و [//translatewiki.net بيتاويكي] لو كنت عايز تساهم فى ترجمة ميدياويكى الاصلية.",
     "allmessagesnotsupportedDB": "الصفحة دى مش يمكن حد يستعملها علشان'''$wgUseDatabaseMessages''' متعطل.",
     "allmessages-filter-legend": "فيلتر",
     "allmessages-filter": "فلتره بحالة التهيئه:",
index b7337a2..70c8eb5 100644 (file)
     "pool-timeout": "বন্ধ কৰাৰ বাবে অপেক্ষা কৰাৰ সময় উকলি গৈছে",
     "pool-queuefull": "পুল কিউ (pool queue) পূৰ্ণ",
     "pool-errorunknown": "অপৰিচিত ত্ৰুটি",
+    "pool-servererror": "পুল কাউণ্টাৰ সেৱা উপলব্ধ নহয় ($1)।",
     "aboutsite": "{{SITENAME}}ৰ বিষয়ে",
     "aboutpage": "Project:ইতিবৃত্ত",
     "copyright": "আন একো উল্লেখ নাথাকিলে এই বিষয়বস্তু $1 ৰ আওতাত উপলব্ধ।",
     "gotaccountlink": "প্ৰৱেশ",
     "userlogin-resetlink": "আপোনাৰ প্ৰৱেশ তথ্য পাহৰিছে?",
     "userlogin-resetpassword-link": "আপোনাৰ গুপ্তশব্দ পাহৰিছে?",
+    "userlogin-helplink2": "প্ৰৱেশ সংক্ৰান্তীয় সাহায্য",
     "userlogin-loggedin": "আপুনি ইতিমধ্যে {{GENDER:$1|$1}} হিচাপে প্ৰৱেশ কৰিছে। তলৰ আন সদস্যৰূপে প্ৰৱেশ কৰিবলৈ তলৰ প্ৰপত্ৰ ব্যৱহাৰ কৰক।",
     "userlogin-createanother": "আন এটা একাউণ্ট সৃষ্টি কৰক",
     "createacct-join": "আপোনাৰ তথ্যসমূহ তলত লিখক।",
     "accountcreatedtext": "[[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|talk]])ৰ কাৰণে সদস্য একাউণ্ট সৃষ্টি কৰা হ'ল।",
     "createaccount-title": "{{SITENAME}}ৰ কাৰণে একাউণ্ট সৃষ্টি কৰক।",
     "createaccount-text": "আপোনাৰ ই-মেইল ঠিকনাৰ কাৰণে {{SITENAME}} ($4)ত \"$2\" নামৰ কোনোবাই, \"$3\" গুপ্তশব্দ দি সদস্যভুক্তি কৰিছে। অনুগ্ৰহ কৰি আপুনি প্ৰৱেশ কৰক আৰু গুপ্তশব্দটো সলনি কৰক।\n\nযদি এইয়া ভুলতে হৈছে, তেনেহলে আপুনি এই বাৰ্তাটো অবজ্ঞা কৰিব পাৰে ।",
-    "usernamehasherror": "সদস্যনামত হেচ্‌ চিহ্ন থাকিব নোৱাৰে",
     "login-throttled": "আপুনি স‍ম্প্ৰতি অজস্ৰবাৰ লগ্‌-ইনৰ প্ৰয়াস কৰিছে ।\nঅনুগ্ৰহ কৰি $1 সময়ৰ পিছত আকৌ চেষ্টা কৰক ।",
     "login-abort-generic": "আপোনাৰ প্ৰৱেশ অসফল হৈছে- বাতিল কৰা হ’ল",
     "loginlanguagelabel": "ভাষা: $1",
     "suspicious-userlogout": "আপোনাৰ প্ৰস্থানৰ অনুৰোধ বাতিল কৰা হৈছে কাৰণ হয়তো আপোনাৰ ব্ৰাউজাৰ অসম্পূৰ্ণ নতুবা পূৰ্বৱতী তথ্য পঠাইছে ।",
     "createacct-another-realname-tip": "প্ৰকৃত নাম দিয়াটো বৈকল্পিক।\nআপুনি নামটো দিলে সেইটো আপোনাৰ বৰঙণিসমূহৰ বাবে স্বীকৃতি প্ৰদানত ব্যৱহাৰ কৰা হ'ব।",
+    "pt-login": "প্ৰৱেশ",
     "pt-login-button": "প্ৰৱেশ",
+    "pt-createaccount": "একাউণ্ট সৃষ্টি কৰক",
+    "pt-userlogout": "প্ৰস্থান",
     "php-mail-error-unknown": "পি.এইছ.পি মেইল () কাৰ্যত অজ্ঞাত ত্ৰুটি ।",
     "user-mail-no-addy": "ই-মেইল ঠিকনা নোহোৱাকৈয়ে ই-মেইল পঠিওৱাৰ চেষ্টা কৰা হৈছে ।",
     "user-mail-no-body": "কোনো সমল নোহোৱাকৈ বা অতি সংক্ষিপ্ত কথাৰে ইমেইল পঠিয়াবলৈ চেষ্টা কৰিছিল।",
     "changepassword": "গুপ্তশব্দ সলনি কৰক",
-    "resetpass_announce": "à¦\86পà§\81নি à¦\87-মà§\87à¦\87লত à¦ªà§\8bৱা à¦\85সà§\8dথায়à§\80 à¦\97à§\81পà§\8dতশবà§\8dদৰà§\87 à¦ªà§\8dৰৱà§\87শ à¦\95ৰিà¦\9bà§\87।\nপà§\8dৰৱà§\87শ à¦¸à¦®à§\8dপà§\82ৰà§\8dণ à¦\95ৰিবলà§\88, à¦\86পà§\81নি à¦\8fà¦\9fা à¦¨à¦¤à§\81ন à¦\97à§\81পà§\8dতশবà§\8dদ à¦¦à¦¿à¦¬ à¦²à¦¾à¦\97িব:",
+    "resetpass_announce": "পà§\8dৰৱà§\87শ à¦¸à¦®à§\8dপà§\82ৰà§\8dণ à¦\95ৰিবলà§\88 à¦\86পà§\81নি à¦\8fà¦\9fা à¦¨à¦¤à§\81ন à¦\97à§\81পà§\8dতশবà§\8dদ à¦¦à¦¿à¦¬ à¦²à¦¾à¦\97িব।",
     "resetpass_header": "গুপ্তশব্দ সলনি কৰক",
     "oldpassword": "পুৰণি গুপ্তশব্দ:",
     "newpassword": "নতুন গুপ্তশব্দ:",
     "resetpass-submit-loggedin": "গুপ্তশব্দ সলনি কৰক",
     "resetpass-submit-cancel": "বাতিল কৰক",
     "resetpass-wrong-oldpass": "অস্থায়ী বা সাম্প্ৰতিক গুপ্তশব্দ গ্ৰহণযোগ্য নহয় ।\nহয়টো আপুনি ইতিমধ্যেই সফলভাবে আপুনাৰ গুপ্তশব্দ সলনি কৰিছিল বা এটা নতুন অস্থায়ী গুপ্তশব্দৰ বাবে অনুৰোধ কৰিছিল ।",
+    "resetpass-recycled": "অনুগ্ৰহ কৰি এতিয়াৰ গুপ্তশব্দটোৰ সলনি আন এটা গুপ্তশব্দ নিৰ্ধাৰণ কৰক।",
+    "resetpass-temp-emailed": "আপুনি এটা অস্থায়ী ইমেইল যোগে প্ৰাপ্ত সংকেতেৰে প্ৰৱেশ কৰিছে।\nপ্ৰৱেশ সম্পূৰ্ণ কৰিবলৈ আপুনি ইয়াত এটা নতুন গুপ্তশব্দ নিৰ্ধাৰণ কৰিব লাগিব:",
     "resetpass-temp-password": "অস্থায়ী গুপ্তশব্দ:",
     "resetpass-abort-generic": "এটা এক্সটেন্‌ছনৰদ্বাৰা গুপ্তশব্দ সলনি কাৰ্য বাতিল কৰা হৈছে।",
+    "resetpass-expired": "আপোনাৰ গুপ্তশব্দৰ ম্যাদ উকলি গৈছে। অনুগ্ৰহ কৰি প্ৰৱেশৰ বাবে এটা নতুন গুপ্তশব্দ নিৰ্ধাৰণ কৰক।",
+    "resetpass-expired-soft": "আপোনাৰ গুপ্তশব্দৰ ম্যাদ উকলি গৈছে আৰু নতুন এটা নিৰ্ধাৰণ কৰাৰ প্ৰয়োজন। অনুগ্ৰহ কৰি এতিয়া এটা নতুন গুপ্তশব্দ বাছনি কৰক বা পিছত নিৰ্ধাৰণ কৰিবলৈ \"{{int:resetpass-submit-cancel}}\" বুটামত ক্লিক কৰক।",
     "passwordreset": "গুপ্তশব্দ ন-কৈ বহুৱাওক",
     "passwordreset-text-one": "আপোনাৰ গুপ্তশব্দ ন-কৈ বহুৱাবলৈ এই প্ৰপত্ৰ পূৰণ কৰক।",
     "passwordreset-text-many": "{{PLURAL:$1|ইমেইলত এটা অস্থায়ী গুপ্তশব্দ পাবলৈ এই তথ্যসমূহৰ যিকোনো এটা দিয়ক।}}",
     "prefs-skin": "আৱৰণ",
     "skin-preview": "খচৰা",
     "datedefault": "কোনো পছন্দ নাই",
-    "prefs-beta": "বিটা বৈশিষ্টসমূহ",
-    "prefs-datetime": "তাৰিখ আৰু সময়",
     "prefs-labs": "পৰীক্ষাগাৰ বৈশিষ্টসমূহ",
     "prefs-user-pages": "সদস্য পৃষ্ঠাসমূহ",
     "prefs-personal": "সদস্যৰ বিৱৰণ",
     "rcnotefrom": "তলত '''$2''' ৰ পৰা হোৱা ('''$1''' লৈকে) পৰিৱৰ্তন দেখুৱা হৈছে ।",
     "rclistfrom": "$1ৰ পৰা নতুন সালসলনি দেখুৱাওক",
     "rcshowhideminor": "$1 -সংখ্যক নগণ্য সম্পাদনা",
+    "rcshowhideminor-show": "দেখুৱাওক",
+    "rcshowhideminor-hide": "লুকুৱাওক",
     "rcshowhidebots": "ব'ট $1",
+    "rcshowhidebots-show": "দেখুৱাওক",
+    "rcshowhidebots-hide": "লুকুৱাওক",
     "rcshowhideliu": "$1 পঞ্জীভুক্ত সদস্য",
+    "rcshowhideliu-show": "দেখুৱাওক",
+    "rcshowhideliu-hide": "লুকুৱাওক",
     "rcshowhideanons": "বেনামী সদস্য $1",
+    "rcshowhideanons-show": "দেখুৱাওক",
+    "rcshowhideanons-hide": "লুকুৱাওক",
     "rcshowhidepatr": "$1 নিৰীক্ষিত সম্পাদনা",
+    "rcshowhidepatr-show": "দেখুৱাওক",
+    "rcshowhidepatr-hide": "লুকুৱাওক",
     "rcshowhidemine": "মোৰ সম্পাদনা $1",
+    "rcshowhidemine-show": "দেখুৱাওক",
+    "rcshowhidemine-hide": "লুকুৱাওক",
     "rclinks": "যোৱা $2 দিনত হোৱা $1 টা সাল-সলনি চাওক ।<br />$3",
     "diff": "পাৰ্থক্য",
     "hist": "ইতিবৃত্ত",
     "upload-permitted": "অনুমোদিত ফাইল ধৰণ: $1",
     "upload-preferred": "বাঞ্ছিত ফাইল ধৰণ: $1",
     "upload-prohibited": "বঞ্চিত ফাইল ধৰণ: $1",
-    "uploadlog": "আপল’ড ল’গ",
     "uploadlogpage": "আপল’ড ল’গ",
     "uploadlogpagetext": "সকলোতকৈ শেহতীয়াভাৱে আপল’ড কৰা ফাইলসমূহৰ তালিকা তলত দিয়া হৈছে ।\nঅধিক দৃশ্যগত পৰ্য্যালোচনাৰ বাবে [[Special:NewFiles|নতুন ফাইলৰ গেলাৰী]] চাওক ।",
     "filename": "ফাইলনাম",
     "filereuploadsummary": "ফাইলত সালসলনিসমূহ",
     "filestatus": "স্বত্বাধিকাৰ স্থিতি:",
     "filesource": "উৎস:",
-    "uploadedfiles": "আপলোড কৰা ফাইলসমূহ",
     "ignorewarning": "সতৰ্কবাণী আওকাণ কৰি ফাইল সংৰক্ষণ কৰক",
     "ignorewarnings": "সকলো সতৰ্কবাণী আওকাণ কৰক",
     "minlength1": "ফাইলনাম কমেও এটা আখৰৰ হ'ব লাগে ।",
     "overwroteimage": "\"[[$1]]\" ৰ এটা নতুন সংস্কৰণ আপল’ড কৰা হৈছে",
     "uploaddisabled": "আপল’ড নিষ্ক্ৰিয় হৈ আছে",
     "copyuploaddisabled": "ইউ.আৰ.এল.ৰ মাধ্যমেৰে আপল’ড নিষ্ক্ৰিয় হৈ আছে ।",
-    "uploadfromurl-queued": "আপোনাৰ আপল’ড শাৰীত ৰখা হৈছে ।",
     "uploaddisabledtext": "ফাইল আপল’ড নিষ্ক্ৰিয় হৈ আছে ।",
     "php-uploaddisabledtext": "পি.এইচ.পি.ত ফাইল আপল’ড নিষ্ক্ৰিয় হৈ আছে ।\nঅনুগ্ৰহ কৰি file_uploads ছেটিং পৰীক্ষা কৰক ।",
     "uploadscripted": "এই ফাইলত HTML বা স্ক্ৰিপ্ত ক’ড আছে যিবোৰ ৱেব ব্ৰাউজাৰে ভুলকৈ ব্যাখ্যা কৰিব পাৰে ।",
     "upload-misc-error": "অজ্ঞাত আপল’ড ত্ৰুটি",
     "upload-misc-error-text": "আপল’ডৰ সময়ত কোনো অজ্ঞাত সমস্যাই দেখা দিছে ।\nURL টোৰ বৈধতা বিচাৰ কৰি পুনৰ চেষ্টা কৰক ।\nযদি তাৰ পিছতো সমস্যা হয়, তেন্তে এজন [[Special:ListUsers/sysop|প্ৰশাসকৰ]] লগত যোগাযোগ কৰক ।",
     "upload-too-many-redirects": "এই URL টোত অতি বেছি পুনৰ্নিৰ্দেশনা আছে",
-    "upload-unknown-size": "অজ্ঞাত আকাৰ",
     "upload-http-error": "এটা HTTP ত্ৰুটিয়ে দেখা দিছে: $1",
     "upload-copy-upload-invalid-domain": "এই ডমেইনত কপী আপল'ড নাপাব।",
     "backend-fail-stream": "$1 ফাইলটো ষ্ট্ৰীম কৰিব পৰা নগ'ল।",
     "img-auth-streaming": "\"$1\" স্ট্ৰিম হৈ আছে ।",
     "img-auth-public": "img_auth.phpৰ কাম হৈছে ব্যক্তিগত ৱিকিৰ পৰা ফাইল বাহিৰলৈ পঠোৱা ।\nএই ৱিকিক ৰাজহুৱা ৱিকিৰূপে কনফিগাৰ কৰা হৈছে ।\nসুৰক্ষাৰ বাবে img_auth.php নিষ্ক্ৰিয় কৰা হ'ল ।",
     "img-auth-noread": "সদস্যৰ \"$1\" ত প্ৰৱেশাধিকাৰ নাই ।",
-    "img-auth-bad-query-string": "এই ইউ.আৰ.এল.-ত অযুক্তিসংগত কুৱেৰী ষ্ট্ৰিং আছে ।",
     "http-invalid-url": "অবৈধ URL: $1",
     "http-invalid-scheme": "\"$1\" আঁচনি থকা URLসমূহ সমৰ্থিত নহয় ।",
     "http-request-error": "অজ্ঞাত ত্ৰুটিৰ বাবে HTTP অনুৰোধ ব্যাহত হৈছে ।",
     "filehist-dimensions": "আকাৰ",
     "filehist-filesize": "ফাইলৰ আকাৰ (বাইট)",
     "filehist-comment": "মন্তব্য",
-    "filehist-missing": "ফাইল সন্ধানহীন",
     "imagelinks": "ফাইল ব্যৱহাৰ",
     "linkstoimage": "তলত দিয়া {{PLURAL:$1|পৃষ্ঠাটো|$1 পৃষ্ঠাবোৰ}} এই ফাইলৰ লগত জড়িত:",
     "linkstoimage-more": "এই ফাইলৰ লগত $1ৰো বেছি {{PLURAL:$1|পৃষ্ঠা সংযোগ|পৃষ্ঠা সংযোগ}} হৈ আছে ।\nতলৰ তালিকাত {{PLURAL:$1|প্ৰথম পৃষ্ঠা সংযোগ|প্ৰথম $1 পৃষ্ঠা সংযোগ}} দেখুওৱা হৈছে ।\nএখন [[Special:WhatLinksHere/$2|সম্পূৰ্ণ তালিকা]]ও পাব ।",
     "protectedpages-cascade": "কেৱল প্ৰপাতাকাৰ সুৰক্ষা",
     "protectedpages-noredirect": "পুনঃনিৰ্দেশ লুকুৱাওক",
     "protectedpagesempty": "এই পাৰামিটাৰবোৰেৰে কোনো পৃষ্ঠা এতিয়া সুৰক্ষিত কৰা হোৱা নাই ।",
+    "protectedpages-page": "পৃষ্ঠা",
+    "protectedpages-expiry": "ম্যাদ উকলিব",
     "protectedtitles": "সুৰক্ষিত শিৰোনামাসমূহ",
     "protectedtitlesempty": "এই পাৰামিটাৰবোৰেৰে কোনো শিৰোনামা এতিয়া সুৰক্ষিত কৰা হোৱা নাই ।",
     "listusers": "সদস্য তালিকা",
     "emailuser-title-notarget": "ব্যৱহাৰকাৰী ই-পত্ৰ প্ৰেৰণ কৰক",
     "emailpage": "ই-পত্ৰ ব্যৱহাৰকাৰী",
     "emailpagetext": "তলৰ প্ৰপত্ৰখন ব্যৱহাৰ কৰি আপুনি এই {{GENDER:$1|সদস্যজনলৈ}} ই-মেইল পঠাব পাৰে ।\nআপুনি [[Special:Preferences|আপোনাৰ সদস্য পছন্দসমূহ]]ত প্ৰৱেশ কৰা ই-মেইল ঠিকনাটো প্ৰেৰকৰ ঠিকনা হিছাপে দেখা যাব, যাতে মেইলৰ প্ৰাপকে আপোনাক উত্তৰ দিব পাৰে ।",
-    "usermailererror": "মেইল বিষয়বস্তুৰ ত্ৰুটি:",
     "defemailsubject": "\"$1\" সদস্যৰ পৰা {{SITENAME}} ই-মেইল",
     "usermaildisabled": "ব্যৱহাৰকাৰীৰ ই-মেইল নিষ্ক্ৰিয়",
     "usermaildisabledtext": "আপুনি এই ৱিকিত আন সদস্যলৈ ই-পত্ৰ পঠিয়াব নোৱাৰে",
     "noemailtitle": "কোনো ই-পত্ৰ ঠিকনা নাই",
     "noemailtext": "এই সদস্যজনে কোনো বৈধ ই-পত্ৰ ঠিকনা নিৰ্বাচন কৰা নাই ।",
-    "nowikiemailtitle": "কোনো ই-পত্ৰ অনুমোদিত নহয়",
     "nowikiemailtext": "এই সদস্যজনে আন সদস্যৰপৰা ই-পত্ৰ পাবলৈ বিচৰা নাই ।",
     "emailnotarget": "পাওঁতাৰ অস্তিত্বহীন বা অবৈধ সদস্যনাম",
     "emailtarget": "পাওঁতাৰ সদস্যনাম ভৰ্তি কৰক",
     "nowatchlist": "আপোনাৰ নিৰীক্ষণ তালিকাত একো নাই ।",
     "watchlistanontext": "আপোনাৰ লক্ষ্য তালিকাত থকা বস্তুবোৰ চাবলৈ বা সম্পাদনা কৰিবলৈ অনুগ্ৰহ কৰি $1 কৰক।",
     "watchnologin": "প্ৰৱেশ কৰা নাই",
-    "watchnologintext": "নিৰীক্ষণ তালিকা পৰিৱৰ্তন কৰিবলৈ আপুনি আগতে [[Special:UserLogin|প্ৰৱেশ]] কৰিব লাগিব ।",
     "addwatch": "লক্ষ্য-তালিকাত অন্তৰ্ভুক্ত কৰক",
     "addedwatchtext": "আপোনাৰ [[Special:Watchlist|লক্ষ্য তালিকাত ]] \"[[:$1]]\" পৃষ্ঠাটো অন্তৰ্ভুক্ত কৰা হ'ল।\nভৱিষ্যতে এই পৃষ্ঠা বা ইয়াৰ আলোচনা পৃষ্ঠাত হোৱা সাল-সলনি আপুনি আপোনাৰ লক্ষ্য তালিকাত দেখিব।",
     "removewatch": "লক্ষ্য-তালিকাৰ পৰা আঁতৰাওক",
     "watching": "চকু দিয়া হৈছে.....",
     "unwatching": "আঁতৰোৱা হৈ আছে.....",
     "watcherrortext": "\"$1\"ৰ বাবে আপোনাৰ নিৰীক্ষণ তালিকাৰ ছেটিং সলনি কৰোঁতে এটা সমস্যাই দেখা দিছে ।",
-    "enotif_mailer": "{{SITENAME}} জাননী ই-পত্ৰ প্ৰেৰক",
     "enotif_reset": "সকলো পৃষ্ঠা পৰিদৰ্শিত বুলি চিহ্নিত কৰক",
     "enotif_impersonal_salutation": "{{SITENAME}} সদস্য",
     "enotif_subject_deleted": "{{SITENAME}} পৃষ্ঠা $1 {{gender:$2|$2}} ৰ দ্বাৰা বিলোপ কৰা হ’ল",
     "excontent": "বিষয়বস্তু আছিল: \"$1\"",
     "excontentauthor": "বিষয়বস্তু আছিল: \"$1\" (আৰু একমাত্ৰ অৱদানকাৰী আছিল \"[[Special:Contributions/$2|$2]]\")",
     "exbeforeblank": "খালী কৰাৰ আগেয়ে বিষয়বস্তু আছিল: $1",
-    "exblank": "পৃষ্ঠা খালি আছিল",
     "delete-confirm": "\"$1\" বিলোপ কৰক",
     "delete-legend": "বিলোপ কৰক",
     "historywarning": "'''সাৱধান:''' আপুনি বিলোপ কৰিব বিচৰা পৃষ্ঠাখনৰ ইতিহাসত প্ৰায় {{PLURAL:$1|সংস্কৰণ|সংস্কৰণ}} আছে:",
     "allmessagesname": "নাম",
     "allmessagesdefault": "সাধাৰণ বাৰ্তা পাঠ্য",
     "allmessagescurrent": "বৰ্তমানৰ বাৰ্তাৰ পাঠ",
-    "allmessagestext": "মিডিয়াৱিকি নামস্থানত থকা প্ৰণালী বাৰ্তাসমূহৰ তালিকা ইয়াত দিয়া হৈছে ।\nযদি আপুনি মিডিয়াৱিকিৰ স্থানীয়কৰণত আগ্ৰহী, তেন্তে অনুগ্ৰহ কৰি [https://www.mediawiki.org/wiki/Localisation মিডিয়াৱিকি স্থানীয়কৰণ] আৰু [//translatewiki.net translatewiki.net] চাওক ।",
+    "allmessagestext": "মিডিয়াৱিকি নামস্থানত থকা প্ৰণালী বাৰ্তাসমূহৰ তালিকা ইয়াত দিয়া হৈছে ।\nযদি আপুনি মিডিয়াৱিকিৰ স্থানীয়কৰণত আগ্ৰহী, তেন্তে অনুগ্ৰহ কৰি [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation মিডিয়াৱিকি স্থানীয়কৰণ] আৰু [//translatewiki.net translatewiki.net] চাওক ।",
     "allmessagesnotsupportedDB": "এই পৃষ্ঠা ব্যৱহাৰ কৰিব নোৱাৰি কাৰণ '''$wgUseDatabaseMessages''' নিষ্ক্ৰিয় কৰা হৈছে ।",
     "allmessages-filter-legend": "ছেকনী",
     "allmessages-filter": "স্বনিৰ্বাচন অৱস্থাৰে পৰিস্ৰাৱন কৰক:",
     "importunknownsource": "অজ্ঞাত আমদানি উৎসৰ প্ৰকাৰ",
     "importcantopen": "আমদানি ফাইল খুলিব পৰা নগ'ল",
     "importbadinterwiki": "আন্ত:ৱিকি সংযোগ বেয়া",
-    "importnotext": "খালী বা পাঠ বিহীন",
     "importsuccess": "আমদানি সমাপ্ত !",
-    "importhistoryconflict": "পৰস্পৰবিৰোধী ইতিহাস সংশোধনী আছে (এই পৃষ্ঠা আগতেও আমদানি কৰা হ'ব পাৰে)",
     "importnosources": "কোনো আন্তঃৱিকি আমদানি উৎসৰ সংজ্ঞা দিয়া হোৱা নাই আৰু প্ৰত্যক্ষ ইতিহাস আপল'ড নিষ্ক্ৰিয় কৰা হৈছে ।",
     "importnofile": "কোনো আমদানি নথি আপল'ড কৰা হোৱা নাই ।",
     "importuploaderrorsize": "আমদানি নথিৰ আপল'ড অসফল হৈছে ।\nঅনুমোদিত আপল'ড নথিতকৈ এই নথিৰ আকাৰ ডাঙৰ ।",
index 66427ff..5c0a2ec 100644 (file)
     "permalink": "Enllaz permanente",
     "print": "Imprentar",
     "view": "Ver",
+    "view-foreign": "Ver en $1",
     "edit": "Editar",
+    "edit-local": "Editar la descripción llocal",
     "create": "Crear",
+    "create-local": "Amestar descripción llocal",
     "editthispage": "Editar esta páxina",
     "create-this-page": "Crear esta páxina",
     "delete": "Desaniciar",
     "pool-timeout": "Tiempu escosáu esperando pal bloquéu",
     "pool-queuefull": "La cola de trabayu ta enllena",
     "pool-errorunknown": "Fallu desconocíu",
+    "pool-servererror": "El serviciu de contador de recursos compartíos nun ta disponible ($1).",
     "aboutsite": "Tocante a {{SITENAME}}",
     "aboutpage": "Project:Tocante a",
     "copyright": "El conteníu ta disponible baxo los términos de la $1 si nun s'indica otra cosa.",
     "accountcreatedtext": "Creóse la cuenta d'usuariu pa [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|alderique]]).",
     "createaccount-title": "Creación de cuenta pa {{SITENAME}}",
     "createaccount-text": "Daquién creó una cuenta cola to direición de corréu electrónicu en {{SITENAME}} ($4) col nome «$2», y cola contraseña «$3».\nAgora tendríes d'aniciar sesión y camudar la contraseña.\n\nPues escaecer esti mensaxe si esta cuenta creóse por error.",
-    "usernamehasherror": "El nome d'usuariu nun pue contener caráuteres «hash»",
     "login-throttled": "Ficisti demasiaos intentos d'aniciu de sesión recientes.\nPor favor espera $1 enantes d'intentalo otra vuelta.",
     "login-abort-generic": "Falló la identificación - Encaboxao",
     "loginlanguagelabel": "Llingua: $1",
     "prefs-skin": "Apariencia",
     "skin-preview": "Vista previa",
     "datedefault": "Ensin preferencia",
-    "prefs-beta": "Carauterístiques beta",
-    "prefs-datetime": "Fecha y hora",
     "prefs-labs": "Carauterístiques esperimentales",
     "prefs-user-pages": "Páxines d'usuariu",
     "prefs-personal": "Perfil del usuariu",
     "upload-permitted": "Menes d'archivu permitíes: $1.",
     "upload-preferred": "Menes d'archivu preferíes: $1.",
     "upload-prohibited": "Menes d'archivu prohibíes: $1.",
-    "uploadlog": "rexistru de xubíes",
     "uploadlogpage": "Rexistru de xubíes",
     "uploadlogpagetext": "Abaxo amuésase una llista de les xubíes d'archivos más recientes.\nMira la [[Special:NewFiles|galería d'archivos nuevos]] pa una güeyada más visual.",
     "filename": "Nome del ficheru",
     "filereuploadsummary": "Cambios del ficheru:",
     "filestatus": "Estáu de Copyright:",
     "filesource": "Fonte:",
-    "uploadedfiles": "Archivos xubíos",
     "ignorewarning": "Inorar l'avisu y grabar l'archivu de toes formes",
     "ignorewarnings": "Inorar tolos avisos",
     "minlength1": "Los nomes d'archivu han tener a lo menos una lletra.",
     "overwroteimage": "xubió una versión nueva de \"[[$1]]\"",
     "uploaddisabled": "Deshabilitaes les xubíes",
     "copyuploaddisabled": "Xubir por URL ta desactivao.",
-    "uploadfromurl-queued": "La to xubía ta na cola.",
     "uploaddisabledtext": "Les xubíes de ficheros tán desactivaes.",
     "php-uploaddisabledtext": "Les xubíes de ficheros tan desactivaes en PHP.\nPor favor, comprueba la configuración de file_uploads.",
     "uploadscripted": "Esti ficheru contién códigu HTML o scripts que se puen interpretar equivocadamente por un navegador.",
     "upload-misc-error": "Error de xubida desconocíu",
     "upload-misc-error-text": "Hebo un error desconocíu na xubida del ficheru.\nPor favor comprueba que l'URL ye válidu y accesible, y inténtalo otra vuelta.\nSi'l problema persiste, contauta con un [[Special:ListUsers/sysop|alministrador]] del sistema.",
     "upload-too-many-redirects": "La URL contenía demasiaes redireiciones",
-    "upload-unknown-size": "Tamañu desconocíu",
     "upload-http-error": "Hebo un error HTTP: $1",
     "upload-copy-upload-invalid-domain": "La xubida de copies nun ta disponible dende esti dominiu.",
     "backend-fail-stream": "Nun se pudo tresmitir el ficheru $1.",
     "img-auth-streaming": "Unviando \"$1\".",
     "img-auth-public": "La función de img_auth.php ye sacar ficheros d'una wiki privada.\nEsta wiki ta configurada como wiki pública.\nPa una meyor seguridá, img_auth.php ta desactiváu.",
     "img-auth-noread": "L'usuariu nun tien accesu pa lleer \"$1\".",
-    "img-auth-bad-query-string": "La URL tien una cadena de consulta inválida.",
     "http-invalid-url": "URL inválida: $1",
     "http-invalid-scheme": "Les URLs col esquema \"$1\" nun tienen sofitu.",
     "http-request-error": "La llamada HTTP fallló por un error desconocíu.",
     "filehist-dimensions": "Dimensiones",
     "filehist-filesize": "Tamañu del ficheru",
     "filehist-comment": "Comentariu",
-    "filehist-missing": "Falta ficheru",
     "imagelinks": "Usu del ficheru",
     "linkstoimage": "{{PLURAL:$1|La páxina siguiente enllacia|Les páxines siguientes enllacien}} a esti ficheru:",
     "linkstoimage-more": "Más de $1 {{PLURAL:$1|páxina enllacia|páxines enllacien}} a esti archivu.\nLa llista siguiente amuesa{{PLURAL:$1|'l primer enllaz de páxina| los primeros $1 enllaces de páxina}} a esti archivu namái.\nHai disponible una [[Special:WhatLinksHere/$2|llista completa]].",
     "listgrouprights-removegroup-self": "Desaniciar {{PLURAL:$2|grupu|grupos}} de la cuenta propia: $1",
     "listgrouprights-addgroup-self-all": "Amestar tolos grupos a la cuenta propia",
     "listgrouprights-removegroup-self-all": "Desaniciar tolos grupos de la cuenta propia",
+    "listgrouprights-namespaceprotection-header": "Torgues d'espaciu de nomes",
+    "listgrouprights-namespaceprotection-namespace": "Espaciu de nomes",
+    "listgrouprights-namespaceprotection-restrictedto": "Permisu(os) d'edición del usuariu",
+    "trackingcategories": "Categoríes de siguimientu",
+    "trackingcategories-summary": "Esta páxina llista les categoríes de siguimientu que rellena automáticamente'l software de MediaWiki. Puen camudase los nomes alterando los mensaxes del sistema correspondientes nel espaciu de nomes {{ns:8}}.",
+    "trackingcategories-msg": "Categoría de siguimientu",
+    "trackingcategories-name": "Nome del mensaxe",
+    "trackingcategories-desc": "Criterios d'inclusión de categoría",
+    "noindex-category-desc": "La páxina contién una pallabra máxica <code><nowiki>__NOINDEX__</nowiki></code> (y ta nun espaciu de nomes nel que se permite esta marca) y, poro, los robots nun la indexarán.",
+    "index-category-desc": "La páxina contién una pallabra máxica <code><nowiki>__INDEX__</nowiki></code> (y ta nun espaciu de nomes nel que se permite esta marca) y, poro, los robots la indexarán anque normalmente nun lo faigan.",
+    "post-expand-template-inclusion-category-desc": "Después de espander toles plantíes, el tamañu de la páxina ye mayor que <code>$wgMaxArticleSize</code>; de mou qu'algunes plantíes nun s'espandieron.",
+    "post-expand-template-argument-category-desc": "Después d'espander l'argumentu d'una plantía (daqué ente llaves triples, como <code>{{{Daqué}}}</code>), la páxina ye mayor que <code>$wgMaxArticleSize</code>.",
+    "expensive-parserfunction-category-desc": "Hai demasiaes funciones analítiques costoses (como <code>#ifexist</code>) incluíes nuna páxina. Vea [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit Manual:$wgExpensiveParserFunctionLimit].",
+    "broken-file-category-desc": "Categoría amestada si la páxina contién un enllaz de ficheru frañáu (un enllaz pa incrustar un ficheru cuando'l ficheru nun esiste).",
+    "hidden-category-category-desc": "Esta ye una categoría que contién la pallabra máxica <code><nowiki>__HIDDENCAT__</nowiki></code>, que torga que s'amuese de mou predetermináu nel cuadru d'enllaces de categoría de les páxines.",
+    "trackingcategories-nodesc": "Nun hai una descripción disponible.",
+    "trackingcategories-disabled": "La categoría ta desactivada",
     "mailnologin": "Ensin direición d'unviu",
     "mailnologintext": "Has tener [[Special:UserLogin|sesión aniciada]] y una direición de corréu válida nes tos [[Special:Preferences|preferencies]] pa poder unviar correos a otros usuarios.",
     "emailuser": "Manda-y un corréu a esti usuariu",
     "emailuser-title-notarget": "Unviar un corréu electrónicu a un usuariu",
     "emailpage": "Envigar un corréu electrónicu a un usuariu",
     "emailpagetext": "Pues usar el formulariu de más abaxo pa unviar un corréu electrónicu a {{GENDER:$1|esti usuariu|esta usuaria}}.\nLa direición de corréu electrónicu qu'especificasti nes [[Special:Preferences|tos preferencies d'usuariu]] va apaecer como la direición \"Dende\" del corréu, pa que'l que lo recibe seya quien a respondete direutamente a ti.",
-    "usermailererror": "L'operador de corréu devolvió un error:",
     "defemailsubject": "Corréu electrónicu del usuariu «$1» de {{SITENAME}}",
     "usermaildisabled": "Corréu del usuariu desactiváu",
     "usermaildisabledtext": "Nun pues unviar corréu a otros usuarios d'esta wiki",
     "noemailtitle": "Ensin direición de corréu",
     "noemailtext": "Esti usuariu nun especificó una direición de corréu válida.",
-    "nowikiemailtitle": "Nun se permite'l corréu electrónicu",
     "nowikiemailtext": "Esti usuariu nun quier recibir correos d'otros usuarios.",
     "emailnotarget": "Nome d'usuariu del destinatariu non esistente o inválidu.",
     "emailtarget": "Escribi'l nome d'usuariu del destinatariu",
     "nowatchlist": "La to llista de vixilancia ta vacia.",
     "watchlistanontext": "Por favor $1 pa ver o editar entraes na to llista de vixilancia.",
     "watchnologin": "Non identificáu",
-    "watchnologintext": "Tienes que tar [[Special:UserLogin|identificáu]] pa poder camudar la to llista de vixilancia.",
     "addwatch": "Amestar a la llista de vixilancia",
     "addedwatchtext": "La páxina \"[[:$1]]\" s'amestó a la to [[Special:Watchlist|llista de vixilancia]].\nLos futuro cambeos nesta páxina y na so páxina d'alderique asociada apaecerán allí.",
     "removewatch": "Desaniciar de la llista de vixilancia",
     "watching": "Vixilando...",
     "unwatching": "Dexando de vixilar...",
     "watcherrortext": "Hebo un fallu al camudar la configuración de la to llista de vixilancia pa «$1».",
-    "enotif_mailer": "Notificación de corréu de {{SITENAME}}",
     "enotif_reset": "Marcar toles páxines visitaes",
     "enotif_impersonal_salutation": "Usuariu de {{SITENAME}}",
     "enotif_subject_deleted": "{{GENDER:$2|$2}} desanició la páxina «$1» de {{SITENAME}}",
     "excontent": "el conteníu yera: '$1'",
     "excontentauthor": "el conteníu yera: '$1' (y l'únicu autor yera '[[Special:Contributions/$2|$2]]')",
     "exbeforeblank": "el conteníu enantes de dexar en blanco yera: '$1'",
-    "exblank": "la páxina taba vacia",
     "delete-confirm": "Desaniciar «$1»",
     "delete-legend": "Desaniciar",
     "historywarning": "'''Avisu:'''' La páxina que vas desaniciar tien un historial con aproximadamente $1 {{PLURAL:$1|revisión|revisiones}}:",
     "sp-contributions-newbies-sub": "Namái les cuentes nueves",
     "sp-contributions-newbies-title": "Contribuciones d'usuariu pa cuentes nueves",
     "sp-contributions-blocklog": "rexistru de bloqueos",
+    "sp-contributions-suppresslog": "collaboraciones del usuariu desaniciaes",
     "sp-contributions-deleted": "Contribuciones d'usuariu desaniciaes",
     "sp-contributions-uploads": "xubes",
     "sp-contributions-logs": "rexistros",
     "sp-contributions-blocked-notice": "Esti usuariu anguaño ta bloquiáu.\nLa cabera entrada del rexistru de bloqueos s'ufre darréu pa referencia:",
     "sp-contributions-blocked-notice-anon": "Esta IP anguaño ta bloquiada.\nLa cabera entrada del rexistru de bloqueos s'ufre darréu pa referencia:",
     "sp-contributions-search": "Buscar contribuciones",
-    "sp-contributions-suppresslog": "collaboraciones del usuariu desaniciaes",
     "sp-contributions-username": "Direición IP o nome d'usuariu:",
     "sp-contributions-toponly": "Amosar namái les ediciones que son les caberes revisiones",
     "sp-contributions-newonly": "Amosar namái les ediciones que son creaciones de páxines",
     "allmessagesname": "Nome",
     "allmessagesdefault": "Testu predetermináu",
     "allmessagescurrent": "Testu actual",
-    "allmessagestext": "Esta ye una llista de los mensaxes de sistema disponibles nel espaciu de nomes de MediaWiki.\nPor favor visita [https://www.mediawiki.org/wiki/Localisation Llocalización de MediaWiki] y [//translatewiki.net translatewiki.net] si quies contribuyer a la llocalización xenérica de MediaWiki.",
+    "allmessagestext": "Esta ye una llista de los mensaxes de sistema disponibles nel espaciu de nomes de MediaWiki.\nPor favor visita [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation Llocalización de MediaWiki] y [//translatewiki.net translatewiki.net] si quies contribuyer a la llocalización xenérica de MediaWiki.",
     "allmessagesnotsupportedDB": "Nun pue usase '''{{ns:special}}:Allmessages''' porque '''$wgUseDatabaseMessages''' ta deshabilitáu.",
     "allmessages-filter-legend": "Peñerar",
     "allmessages-filter": "Peñerar por estáu de personalización:",
     "importunknownsource": "Triba d'orixe d'importación desconocida",
     "importcantopen": "Nun se pudo abrir el ficheru d'importación",
     "importbadinterwiki": "Enllaz interwiki incorreutu",
-    "importnotext": "Vaciu o ensin testu",
     "importsuccess": "¡Importación finalizada!",
-    "importhistoryconflict": "Existe un conflictu na revisión del historial (seique esta páxina fuera importada previamente)",
     "importnosources": "Nun se definió l'orixe de la importación treswiki y les xubíes direutes del historial tán deshabilitaes.",
     "importnofile": "Nun se xubió nengún archivu d'importación.",
     "importuploaderrorsize": "Falló la xubida del archivu d'importación. L'archivu ye más grande que'l tamañu permitíu de xubida.",
index 1e69c3c..cf8b130 100644 (file)
     "nowatchlist": "Rinafi suzdasiki va nedoy teliz ruldar.",
     "watchlistanontext": "Ta wira ik betara va ra ke rinafi suzdasiki vay $1.",
     "watchnologin": "Dogluyariskaf",
-    "watchnologintext": "Ta betara va suzdasiki gotil [[Special:UserLogin|dogluyarakiraf]].",
     "addedwatchtext": "« $1 » bu ko rinafi [[Special:Watchlist|Suzdasiki]] fu zo loplekur.\nVa moniyaf betareem va batu bu is dofu prilarabu batlize zo bonjatad, ise ta lokaliafa tcalutera telu '''ton bold''' koe bu dem [[Special:RecentChanges|noeltaf betakseem]] turowinaweter.\n\nTa sulara va batu bu div rinafi suzdasiki, koe grablexo va « Mea suzdá » vulegal.",
     "removedwatchtext": "« [[:$1]] » bu div rinafi suzdasiki al zo sular.",
     "watch": "Suzdá",
     "allmessagesname": "Yolt",
     "allmessagesdefault": "Omavaf krent",
     "allmessagescurrent": "Noelaf krent",
-    "allmessagestext": "Batcoba tir vexala dem bolkstakseem koe MediaWiki yoltxo.\n\nVa [https://www.mediawiki.org/wiki/Localisation MediaWiki Localisation] is [//translatewiki.net translatewiki.net] vay woral ede va tulizukara va Mediawiki co-rowebel.",
+    "allmessagestext": "Batcoba tir vexala dem bolkstakseem koe MediaWiki yoltxo.\n\nVa [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation MediaWiki Localisation] is [//translatewiki.net translatewiki.net] vay woral ede va tulizukara va Mediawiki co-rowebel.",
     "allmessagesnotsupportedDB": "Batu bu me zo rofaver kire '''$wgUseDatabaseMessages''' mea tir tegis.",
     "thumbnail-more": "Tulogijara",
     "filemissing": "Gracaf iyeltak",
index 0067835..1c1ce0e 100644 (file)
     "accountcreatedtext": "$1 üçün istifadəçi hesabı yaradıldı.",
     "createaccount-title": "{{SITENAME}} hesabın yaradılması",
     "createaccount-text": "Biriləri {{SITENAME}} saytında ($4) sizin e-poçt ünvanınızdan istifadə edərək, parolu \"$3\" olan, \"$2\" adlı bir hesab yaratdı.\n\nSayta daxil olmalı və parolunuzu dəyişdirməlisiniz.\n\nƏgər istifadəçi hesabını səhvən yaratmısınızsa, bu mesajı gözardı edə bilərsiniz.",
-    "usernamehasherror": "İstifadəçi adında \"diyez\" simvolunun istifadəsi mümkün deyil",
     "login-throttled": "Sistemə daxil olmaq üçün həddən artıq cəhd etmisiniz.\nYeni cəhd etməzdən əvvəl bir qədər gözləyin.",
     "login-abort-generic": "Giriş uğursuz alındı - Rədd",
     "loginlanguagelabel": "Dil: $1",
     "template-protected": "(mühafizə)",
     "template-semiprotected": "(yarım-mühafizə)",
     "hiddencategories": "Bu səhifə {{PLURAL:$1|1 gizli kateqoriyaya|$1 gizli kateqoriyaya}} aiddir:",
+    "edittools": "<!-- Buradakı mətn redaktə və quraşdırma formalarının altında göstəriləcək. -->",
     "edittools-upload": "-",
     "nocreatetext": "{{SITENAME}} saytında yeni səhifələrin yaradılması imkanları məhdudlaşdırılıb.\nSiz geri qayıdıb mövcud səhifəni və ya  [[Special:UserLogin|sistemə təqdim olunma və ya yeni hesab açmaq]] səhifəsini redaktə edə bilərsiniz.",
     "nocreate-loggedin": "Sizin yeni səhifələr yaratmaq üçün icazəniz yoxdur.",
     "prefs-skin": "Cild",
     "skin-preview": "Sınaq görüntüsü",
     "datedefault": "Seçim yoxdur",
-    "prefs-beta": "Beta xüsusiyyətlər",
     "prefs-datetime": "Tarix və vaxt",
     "prefs-labs": "eksperimental imkanlar",
     "prefs-personal": "İstifadəçi profili",
     "upload-permitted": "İcazə verilən fayl tipləri: $1.",
     "upload-preferred": "İcazə verilən fayl tipləri: $1.",
     "upload-prohibited": "İcazə verilməyən fayl tipləri: $1.",
-    "uploadlog": "yükləmə qeydi",
     "uploadlogpage": "Yükləmə qeydləri",
     "uploadlogpagetext": "Aşağıda ən yeni yükləmə jurnal qeydləri verilmişdir.",
     "filename": "Fayl adı",
     "filereuploadsummary": "Fayl dəyişiklikləri:",
     "filestatus": "Müəllif statusu:",
     "filesource": "Mənbə:",
-    "uploadedfiles": "Yüklənmiş fayllar",
     "ignorewarning": "Xəbərdarlıqlara əhəmiyyət vermə və faylı saxla",
     "ignorewarnings": "Bütün xəbərdarlıqlara məhəl qoymamaq",
     "minlength1": "Fayl adı ən azı bir hərfdən ibarət olmalıdır.",
     "overwroteimage": "\"[[$1]]\"-in yeni versiyası yükləndi",
     "uploaddisabled": "Yükləmə baş tutmadı",
     "copyuploaddisabled": "URL-dən yükləmə baş tutmadı.",
-    "uploadfromurl-queued": "Yükləməniz növbə gözləyir",
     "uploaddisabledtext": "Fayl yüklənməsi baş tutmadı.",
     "uploadvirus": "Faylda virus var! \nDetallar: $1",
     "upload-source": "Mənbə faylı",
     "upload-file-error": "Daxili xəta",
     "upload-misc-error": "Naməlum yükləmə xətası",
     "upload-too-many-redirects": "URL-də xeyli yönləndirmə var",
-    "upload-unknown-size": "Naməlum həcm",
     "upload-http-error": " HTTP xətası var : $1",
     "backend-fail-notexists": "\"$1\" faylı mövcud deyil",
     "backend-fail-delete": "\"$1\" faylı sililmədi.",
     "img-auth-nofile": "Fayl \"$1\" mövcud deyil.",
     "img-auth-streaming": "\"$1\" axını.",
     "img-auth-noread": "İstifadəçinin \"$1\"i oxumaq hüququ yoxdur.",
-    "img-auth-bad-query-string": "URL ünvanda yanlış axtarış sətri var.",
     "http-invalid-url": "Səhv URL: $1",
     "http-read-error": "HTTP oxuma xətası",
     "http-timed-out": "HTTP istəyinin vaxtı bitdi.",
     "filehist-dimensions": "Ölçülər",
     "filehist-filesize": "Faylın həcmi",
     "filehist-comment": "Şərh",
-    "filehist-missing": "Fayl çatışmır",
     "imagelinks": "Fayl keçidləri",
     "linkstoimage": "{{PLURAL:$1|səhifə|$1 səhifə}} bu fayla istinad edir:",
     "nolinkstoimage": "Bu fayla keçid verən səhifə yoxdur.",
     "mailnologin": "Ünvan yoxdur",
     "emailuser": "İstifadəçiyə e-məktub göndər",
     "emailpage": "İstifadəçiyə e-məktub yolla",
-    "usermailererror": "Elektron poçtla məlumat göndərilən zaman xəta baş vermişdir:",
     "defemailsubject": "\"$1\" adlı istifadəçidən {{SITENAME}} e-məktubu",
     "usermaildisabled": "İstifadəçi e-maili işləmir",
     "noemailtitle": "E-məktub ünvanı yoxdur",
     "noemailtext": "Bu istifadəçi işlək e-məktub ünvanını qeyd etməmişdir.",
-    "nowikiemailtitle": "E-poçtlara icazə verilmir",
     "emailtarget": "Qəbul edən istifadəçinin adını daxil edin",
     "emailusername": "İstifadəçi adı:",
     "emailusernamesubmit": "Göndər",
     "nowatchlist": "İzləmə siyahınız böşdur.",
     "watchlistanontext": "Lütfən, izlədiyiniz səhifələri görmək və ya redaktə etmək üçün $1.",
     "watchnologin": "Daxil olmamısınız",
-    "watchnologintext": "İzləmə siyahınızda dəyişiklik aparmaq üçün [[Special:UserLogin|daxil olmalısınız]].",
     "addwatch": "İzləmə siyahısına əlavə et",
     "addedwatchtext": "\"[[:$1]]\" səhifəsi [[Special:Watchlist|izlədiyiniz səhifələr]] siyahısına əlavə edildi. Bu səhifədə və əlaqəli müzakirə səhifəsindəki bütün dəyişikliklər orada göstəriləcək və səhifə asanlıqla seçiləbilmək üçün [[Special:RecentChanges|son dəyişikliklərdə]] qalın şriftlərlə görünəcəkdir. <p> Səhifəni izləmə siyahınızdan çıxarmaq üçün yan lövhədəki \"izləmə\" düyməsinə vurun.",
     "removewatch": "Bu səhifəni İzlədiyim səhifələr siyahısından çıxar",
     "watchlist-options": "İzləmə siyahısının nizamlamaları",
     "watching": "İzlənilir...",
     "unwatching": "İzlənilmir...",
-    "enotif_mailer": "{{SITENAME}} Bildiriş Xidməti",
     "enotif_reset": "Baxılmış bütün səhifələri işarələ.",
     "enotif_impersonal_salutation": "{{SITENAME}} istifadəçisi",
     "enotif_lastvisited": "Sonuncu ziyarətinizdən indiyədək olan bütün dəyişiklikləri görmək üçün baxın: $1.",
     "excontent": "Köhnə məzmun: '$1'",
     "excontentauthor": "tərkib: '$1' (və '[[Special:Contributions/$2|$2]]' tarixçədə fəaliyyəti qeyd edilən yeganə istifadəçidir)",
     "exbeforeblank": "Silinmədən əvvəlki məzmun: '$1'",
-    "exblank": "səhifə boş",
     "delete-confirm": "Silinən səhifə: \"$1\"",
     "delete-legend": "Sil",
     "historywarning": "'''Xəbərdarlıq:''' Silinəcək səhifənin tarixçəsində qeyd olunmuş $1 {{PLURAL:$1|redaktə|redaktə}} var:",
     "allmessagesname": "Ad",
     "allmessagesdefault": "İlkin mətn",
     "allmessagescurrent": "İndiki mətn",
-    "allmessagestext": "Bu MediaWiki-də olan sistem mesajlarının siyahısıdır. Əgər MediaWiki-ni lokallaşdırmaq işində kömək etmək isəyirsinizsə, lütfən [https://www.mediawiki.org/wiki/Localisation MediaWiki Localisation] və [//translatewiki.net translatewiki.net]-ə baş çəkin.",
+    "allmessagestext": "Bu MediaWiki-də olan sistem mesajlarının siyahısıdır. Əgər MediaWiki-ni lokallaşdırmaq işində kömək etmək isəyirsinizsə, lütfən [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation MediaWiki Localisation] və [//translatewiki.net translatewiki.net]-ə baş çəkin.",
     "allmessages-filter-legend": "Filtr",
     "allmessages-filter-unmodified": "Dəyişdirilməmiş",
     "allmessages-filter-all": "Hamısı",
     "importfailed": "Uğursuz çıxarış: <nowiki>$1</nowiki>",
     "importcantopen": "Çıxarılacaq fayl açılmadı",
     "importbadinterwiki": "Yanlış interviki keçidi",
-    "importnotext": "Boş və ya mətn yoxdur",
     "importsuccess": "Çıxarma başa çatdı!",
     "import-noarticle": "Çıxarılacaq səhifə yoxdur!",
     "xml-error-string": "$1 $2 sətrində, $3 sütünunda ($4 bayt): $5",
index 2788f01..2c5aa2a 100644 (file)
@@ -9,7 +9,8 @@
             "Ebraminio",
             "Erdemaslancan",
             "Mousa",
-            "Shirayuki"
+            "Shirayuki",
+            "Microchip08"
         ]
     },
     "tog-underline": "باغلانتی‌لارین آلتینی خطله:",
@@ -19,9 +20,9 @@
     "tog-extendwatchlist": "ایزله‌دیکلری، بوتون دیشیکلیکلری گؤسترمک اوچون گئنیشلندیر",
     "tog-usenewrc": "دَییشیکلیکلری سون دَییشیکلیکلر صحیفه‌سینده ایزله‌دیکلر صحیفه‌سینده گروپ‌لا (جاوااسکریپت لازیم‌دیر)",
     "tog-numberheadings": "باشلیق‌لاری اوتوماتیک نومره‌له",
-    "tog-showtoolbar": "دَییشدیرمه آراج چوبوغونو گؤستر (جاوااسکریپت لازیم‌دیر)",
-    "tog-editondblclick": "صحیفه‌‌لری ایکی کلیکله دَییشدیر (جاوااسکریپت لازیم‌دیر)",
-    "tog-editsectiononrightclick": "بؤلوم‌لرین دیشدیرمه‌سینی، باشلیقلارین اوزرینده ساغ‌کلیک ائتمک‌له ایجازه وئر (جاوااسکریپت لازیم‌دیر)",
+    "tog-showtoolbar": "دَییشدیرمه آراج چوبوغونو گؤستر",
+    "tog-editondblclick": "صحیفه‌‌لری ایکی کلیک‌ده دَییشدیر",
+    "tog-editsectiononrightclick": "بؤلوم‌لرین دیشدیرمه‌سینی، باشلیقلارین اوزرینده ساغ‌کلیک ائتمک‌له ایجازه وئر",
     "tog-rememberpassword": "منیم گیریشیمی بو بیلگی‌سایاردا یاددا ساخلا (چوخو {{PLURAL:$1|بیر گونه|$1 گونه}} کیمی)",
     "tog-watchcreations": "ياراتدیغیم صحیفه‌‌لری و يوکله‌دیگیم فايل‌لاری ایزله‌مه‌لریمه آرتیر",
     "tog-watchdefault": "دَییشدیردیگیم صحیفه‌‌لری و فايل‌لاری ایزله‌دیکلریمه آرتیر",
@@ -37,7 +38,7 @@
     "tog-shownumberswatching": "ایزله‌ين ایستیفاده‌چیلرین سایینی گؤستر",
     "tog-oldsig": "ایندی‌کی ایمضا:",
     "tog-fancysig": "ویکی متن کیمی ایمضا (اوتوماتیک باغلانتی‌سیز)",
-    "tog-uselivepreview": "دÛ\8cرÛ\8c Ø§Ø¤Ù\86â\80\8cگؤسترÛ\8cØ´ Ø§Û\8cØ´Ù\84د (جاÙ\88ااسکرÛ\8cپت Ù\84ازÛ\8cÙ\85â\80\8cدÛ\8cر)(تست مرحله‌سینده)",
+    "tog-uselivepreview": "دÛ\8cرÛ\8c Ø§Ø¤Ù\86â\80\8cگؤسترÛ\8cØ´ Ø§Û\8cØ´Ù\84ت (تست مرحله‌سینده)",
     "tog-forceeditsummary": "دَییشیکلیک قیساسی بوش قالاندا منی بیلدیر",
     "tog-watchlisthideown": "منیم دَییشیکلیکلریمی ایزله‌دیکلردن گیزلت",
     "tog-watchlisthidebots": "بوت دَییشیکلیکلرینی ایزله‌دیکلردن گیزلت",
@@ -50,6 +51,7 @@
     "tog-showhiddencats": "گیزلی بؤلمه‌لری گؤستر",
     "tog-norollbackdiff": "قایتاراندان سونرا موقاییسه گؤسترمه",
     "tog-useeditwarning": "دَییشدیرمه صحیفه‌سینده چیخیش زامانی، آچیق و قئید اولمایان دَییشدیرمه صحیفه وارسا منه هشدار وئریلسین",
+    "tog-prefershttps": "هر زامان گیریش ائتمگه امن باغلانتی ایشلت",
     "underline-always": "همیشه",
     "underline-never": "هئچ واخت",
     "underline-default": "دیفالت قابیق یوخسا براوزر",
     "oct": "اوکتوبر",
     "nov": "نووامبر",
     "dec": "دئسامبر",
+    "january-date": "ژانویه‌نین $1-ی",
     "february-date": "$1 فئوریه",
+    "march-date": "مارسین $1-ی",
+    "april-date": "آوریلین $1-ی",
     "may-date": "$1 مئی",
+    "june-date": "ژوئنین $1-ی",
     "july-date": "$1 ژولای",
     "august-date": "$1 آقوست",
     "september-date": "$1 سئپتامبر",
     "newwindow": "(یئنی پنجره‌ده آچیلیر)",
     "cancel": "لغو ائت",
     "moredotdotdot": "داها...",
-    "morenotlisted": "داÙ\87ا Ø¢Ø±ØªÛ\8cÙ\82 Ù\84Û\8cست Ø§Ù\88Ù\84Ù\88Ù\86Ù\85اÛ\8cÛ\8cبâ\80\8cدÛ\8cر...",
+    "morenotlisted": "بÙ\88 Ù\84Û\8cست Ú©Ø§Ù\85Ù\84 Ø¯Ø¦Û\8cÛ\8cÙ\84.",
     "mypage": "مقاله",
     "mytalk": "دانیشیق",
     "anontalk": "بو آی‌پی آدرسینه دانیشیق",
     "articlepage": "مقاله‌یه باخین",
     "talk": "دانیشیق",
     "views": "گؤرونوشلر",
-    "toolbox": "آراجلار قوتوسو",
+    "toolbox": "آراجلار",
     "userpage": "ایستیفاده‌چی صحیفه‌‌سینی باخین",
     "projectpage": "پروژه صحیفه‌سینه باخین",
     "imagepage": "فایل صحیفه‌سینه باخین",
     "youhavenewmessages": "سیزین $1 ($2) وارینیزدیر.",
     "youhavenewmessagesfromusers": "سیزین {{PLURAL:$3|بیر آیری ایستیفاده‌چی‌دن|$3 ایستیفاده‌چی‌دن}} $1 وارینیزدیر ($2).",
     "youhavenewmessagesmanyusers": "سیزین چوخلو ایشلدنلردن $1 وارینیزدیر ($2).",
-    "newmessageslinkplural": "{{PLURAL:$1|بیر یئنی مئساژ|یئنی مئساژلار}}",
-    "newmessagesdifflinkplural": "سون {{PLURAL:$1|دَییشیکلیک|دَییشیکلیکلر}}",
+    "newmessageslinkplural": "{{PLURAL:$1|بیر یئنی مئساژ|999=یئنی مئساژلار}}",
+    "newmessagesdifflinkplural": "سون {{PLURAL:$1|دَییشیکلیک|999=دَییشیکلیکلر}}",
     "youhavenewmessagesmulti": "$1-دا یئنی بیلدیرینیز وار.",
     "editsection": "دَییشدیر",
     "editold": "دَییشدیر",
     "accountcreatedtext": "[[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|دانیشیق]]) ایستیفاده‌چی حسابی یارادیلیب‌دیر.",
     "createaccount-title": "{{SITENAME}} اوچون حساب یارادیلماسی",
     "createaccount-text": "بیر کس، سیزین ایمیل آدرسینیزه {{SITENAME}} ($4) سایتیندا «$2» آدی و «$3» رمزی ایله بیر حساب آچیب‌دیر. سیز گرک گیریش ائدیب و رمزینیزی ایندی دَییشدیره‌سیز.\n\nبو حساب یانلیش دوزلیب‌سه، بو مئساژا محل قویمایابیلرسیز.",
-    "usernamehasherror": "ایستیفاده‌چی آدیندا hash حرفلری اولا بیلمز",
     "login-throttled": "سیزین چوخ گیریش چالیشماغینیز اولوب‌دور.\nلوطفاً یئنی‌دن چالیشماق‌دان اؤنجه بیر آز دؤزون.",
     "login-abort-generic": "سیزین گیریشینیز باشاری‌سیز اولدو - دایاندیریلدی",
     "loginlanguagelabel": "دیل: $1",
     "suspicious-userlogout": "سیزین چیخیش ایستگینیز رد اولوندو. بو، براوزرین یا پروکسی-کَشلمه‌سینین دوزگون ایشله‌مه‌مه‌سین‌دن قایناق‌لانیر.",
+    "pt-login": "گیریش ائت",
+    "pt-login-button": "گیریش ائت",
+    "pt-createaccount": "حساب یارات",
+    "pt-userlogout": "چیخیش",
     "php-mail-error-unknown": "پی‌اچ‌پی‌نین mail() فونکسیاسیندا تانینمامیش خطا.",
     "user-mail-no-addy": "ایمیل آدرسی اولماماق‌لا، ایمیل گؤندرمگه چالیشدی",
     "user-mail-no-body": "بیر بوش یا چوخ قیسا یازیسی اولان ایمیل گؤندرمگه چالیشیلدی.",
     "changepassword": "رمزی دَییشدیر",
-    "resetpass_announce": "سیز بیر گئچرلی ایمیل اولونان کود ایله گیرمیسینیز.\nگیرمگی قورتارماق اوچون، یئنی بیر رمز قویمالیسینیز:",
+    "resetpass_announce": "گیرمگی قورتارماق اوچون، یئنی بیر رمز قویمالیسینیز.",
     "resetpass_header": "حساب رمزینی دَییشدیر",
     "oldpassword": "اسکی رمز",
     "newpassword": "یئنی رمز",
     "retypenew": "یئنی رمزی یئنی‌دن یازین:",
     "resetpass_submit": "رمز یارادین و گیریش ائدین",
-    "changepassword-success": "رمزینیز باشاری‌لا دَییشدیرلدی! ایندی گیریرسینیز...",
+    "changepassword-success": "رمزینیز باشاری‌لا دَییشدیرلدی!",
+    "changepassword-throttled": "سیزین چوخ گیریش چالیشماغینیز اولوب‌دور.\nلوطفاً یئنی‌دن چالیشماق‌دان اؤنجه $1 دؤزون.",
     "resetpass_forbidden": "رمزلر دَییشیلمز",
     "resetpass-no-info": "بو صحیفه‌نی دوغرو گؤردوگونوز اوچون سیستمه گیرمه‌لیسینیز.",
     "resetpass-submit-loggedin": "رمزی دَییشدیر",
     "session_fail_preview_html": "'''اوزر ایستییریک! داخیل وئری‌سی‌نین ایتمه‌سین‌دن گؤره تنظیملمه‌نیزی اعمال کئچیره بیلمیجیی.' '\n\n' چونکی {{SITENAME}} سایتیندا raw هتمل تأثیرین‌دیر،تا جاوااسکریپت هوجوم‌لارینا تدبیر اولا‌راق گیزلنمیش‌دیر.'\n\n' 'گر بو حاق‌لی بیر تنظیملمه گیریش میسئ، لطفاً یئنی‌دن جهد ائدین. اگر هله چالیشمازسا، [[Special:UserLogout|خارج شوید]] یئنی‌دن ایجلاس آچماغی یوخلایین.' '",
     "token_suffix_mismatch": "'' ' ديَیشیکلیگی‌نین گئری چئوریلدی، چونکی آلیجی‌نین تنزیمله‌مه کوتوجوغونداکی دورغو ایشاره‌لرینی پوزدو. \nديَیشیکلیگی‌نین، صحیفه‌‌ متنینده پوزولماغی اؤنله‌مک اوچون گئری چئوریلدی. \nاگر پروبلئملی بیر wئب-باسئد آنونیم پروکسی خیدمتی ایستیفاده بو حادثه‌‌ بضا رئاللاشا بیلر.'' '",
     "edit_form_incomplete": "'''دییشیک‌لیک فورماسی اوچون بعضی سئروئرلره ایشلمه‌دی؛ ائتدیگینیز دییشیک‌لیک‌لر بوزولمامیشتیر، نظردن کئچیریب یئنی‌دن سینایین.'",
-    "editing": "<font style=\"color:red\">$1</font> دییشدیریلیر",
+    "editing": "$1 دییشدیریلیر",
     "creating": "$1 یارادیلیر",
     "editingsection": "$1 دَییشدیریلیر (بؤلوم)",
     "editingcomment": "$1 دَییشدیریلیر (یئنی بؤلوم)",
     "prefs-skin": "قابیق",
     "skin-preview": "اؤن‌گؤستریش",
     "datedefault": "سئچیم‌سیز",
-    "prefs-beta": "بئتا اؤزل‌لیکلر",
-    "prefs-datetime": "تاریخ و واخت",
     "prefs-labs": "آزماییشی اؤزل‌لیکلر",
     "prefs-user-pages": "ایستیفاده‌چی صحیفه‌لری",
     "prefs-personal": "ایستیفاده‌چی پروفایلی",
     "upload-permitted": "ایجازه وئریلن فايل تیپلری: $1.",
     "upload-preferred": "ایجازه وئریلن فايل تیپلری: $1.",
     "upload-prohibited": "ایجازه وئریلمه‌ين فايل تیپلری: $1.",
-    "uploadlog": "يوکله‌مه قئيدی",
     "uploadlogpage": "یوکلمه قئیدلری",
     "uploadlogpagetext": "آشاغیدا ان سون یوکله‌نیلن فایل‌لارین لیستی گؤستریلیر.\nداها گؤرونوش‌لو گؤسترمک اوچون، [[Special:NewFiles|یئنی فایل‌لار گالئری‌سینه]] باخین.",
     "filename": "فایل آدی",
     "filereuploadsummary": "فایل دَییشیکلری:",
     "filestatus": "مؤلف حوقوقلاری:",
     "filesource": "قایناق:",
-    "uploadedfiles": "یوکلنمیش فایللار‌",
     "ignorewarning": "خبردارلیقلارا اهمیت وئرمه و فايلی ساخلا",
     "ignorewarnings": "بوتون خبردارلیقلارا محل قويماماق",
     "minlength1": "فايل آدی ان آزی بیر حرفدن عبارت اولمالیدیر.",
     "overwroteimage": "\"[[$1]]\"-این یئنی نوسخه سی یوکلندی",
     "uploaddisabled": "يوکله‌مه باش توتمادی",
     "copyuploaddisabled": "اینترنت آدرسی ایله یوکلمه باش توتمادی.",
-    "uploadfromurl-queued": "يوکله‌مه‌نیز نؤوبه گؤزله‌يیر",
     "uploaddisabledtext": "فايل يوکلنمه‌سی باش توتمادی.",
     "php-uploaddisabledtext": "پی اچ پی فایل یوکلملری دؤوره خاریجی‌دیر. خاهیش ائدیریک file_uploads تنظیم لرین یئنی دن بیر باخین.",
     "uploadscripted": "بو فایل بیر اینتئرنئت آختاریش برنامه سی طرفین‌دن سهو چئوریلبیلجک بیر HTML و یا ایسکریپت کودو عبارت‌دیر.",
     "upload-misc-error": "بیلین‌مه‌ین یوکلمه خطاسی",
     "upload-misc-error-text": "یوکلمه اسناسیندا بیلینمه‌ین بیر خطا میدانا گلدی.\nخاهیش ائدیریک علاقه‌نین اعتبارلی و چاتیلا بیلر اولدوغونو تصدیق و یئنی‌دن جهد ائدین.\nاگر پروبلئم تکرارلانسا، بیر [[Special:ListUsers/sysop|administrator]] ایله علاقه ساخلایین",
     "upload-too-many-redirects": "آدرس ده چوخ یؤنلندیرمه وار",
-    "upload-unknown-size": "بیلین‌مه‌ين هجم",
     "upload-http-error": "اچ تی تی پی ختاسی وار : $1",
     "upload-copy-upload-invalid-domain": "فایل یوکلنمه سی بو بازه ده امکانی یوخدور",
     "backend-fail-stream": "$1 فای‌لی یولانمامادی.",
     "img-auth-streaming": "\"$1\" آخینی.",
     "img-auth-public": "img_auth.php 'نین فونکسیاسی خصوصی بیر ویکی فایل‌لاری چیخارماق‌دیر.\nبو wiki اومومی بیر wiki اولا‌راق قورولوب.\nان اویغون تهلوکه‌سیزلیک اوچون، img_auth.php دؤوره خاریجی بوراخیلدی.",
     "img-auth-noread": "ایستیفاده‌چی‌نین «$1»بیر  اوخوماق حقوقو يوخدور.",
-    "img-auth-bad-query-string": "آدرس اونواندا يانلیش آختاریش ستری وار.",
     "http-invalid-url": "سهو اورل: $1",
     "http-invalid-scheme": "\"$1\" سماسینا صاحب اورللئر دستک‌لنمیر",
     "http-request-error": "هتتپ ایستیی بیلینمه‌ین بیر سببله موفقیت‌سیز اولدو.",
     "filehist-dimensions": "اؤلچولر",
     "filehist-filesize": "فایل اؤلچوسو",
     "filehist-comment": "باخیش",
-    "filehist-missing": "فایل یوخدور",
     "imagelinks": "فايل ایشلدمه‌سی",
     "linkstoimage": "آشاغیداکی {{PLURAL:$1|صحیفه|$1 صحیفه‌لر}} بو فایلا {{PLURAL:$1|باغلانیر|باغلانیرلار}}",
     "linkstoimage-more": "بو فایلا {{PLURAL:$1|بیر|$1}}-دن چوخ صحیفه باغلانتی‌سی واردیر.\nآشاغیداکی لیست بو فایلا یالنیز ایلک $1 صحیفه باغلانتیسینی گؤستریر.\nبیر [[Special:WhatLinksHere/$2|بوتون لیست]] ده واردیر.",
     "emailuser-title-notarget": "ایستیفاده‌چی‌یه ایمیل گؤندر",
     "emailpage": "ایستیفاده‌چی‌یه ایمیل گؤندر",
     "emailpagetext": "آشغیداکی فورم‌دان، بو {{GENDER:$1|ایستیفاده‌چی}}‌یه ایمیل گؤندرمک اوچون ایستیفاده ائده بیلرسینیز.\n[[Special:Preferences|اؤز ترجیحلرینیز]]ده وئرن ایمیل آدرسی، بو ایمیلین \"From\" یئرینده گؤستریله‌جک‌دیر و بونا گؤره ایمیلی آلان سیزه موستقیم جاواب گؤندره بیلر.",
-    "usermailererror": "ایمیل‌دن بو خطا قایتاریلدی:",
     "defemailsubject": "«$1» آدلی ایستیفاده‌چی‌دن، {{SITENAME}} ایمیلی",
     "usermaildisabled": "ایستیفاده‌چی ایمیلی باغلی‌دیر",
     "usermaildisabledtext": "بو ویکی‌ده باشقا ایستیفاده‌چیلره ایمیل گؤندره بیلنمه‌سینیز",
     "noemailtitle": "ایمیل آدرسی یوخدور",
     "noemailtext": "بو ایستیفاده‌چی، بیر گئچرلی ایمیل آدرسی وئرمه‌ییب‌دیر.",
-    "nowikiemailtitle": "ایمیل ایجازه‌سی یوخدور",
     "nowikiemailtext": "بو ایستیفاده‌چی، باشقا ایستیفاده‌چیلردن ایمیل آلماماغینی بیلدیریب‌دیر.",
     "emailnotarget": "آلان اوچون، اولمایان یوخسا گئچرسیز ایستیفاده‌چی آدی.",
     "emailtarget": "آلانین ایستیفاده‌چی آدینی دَییشدیر",
     "nowatchlist": "ایزلمه سیاهینیز بؤش‌دور.",
     "watchlistanontext": "لطفاً، ایزلدیگینیز صحیفه‌لری گؤرمک و یا رئداکته ائتمک اوچون $1.",
     "watchnologin": "داخیل اولمامیسینیز",
-    "watchnologintext": "ایزلمه سیاهینیزدا دییشیک‌لیک آپارماق اوچون [[Special:UserLogin|داخیل اولمالیسینیز]].",
     "addwatch": "ایزلمه سیاهی‌سینا علاوه ائت",
     "addedwatchtext": "\"[[:$1]]\" صحیفه‌سی [[Special:Watchlist|ایزله‌دیکلرینیزه]] آرتیریلدی. بو صحیفه‌ده و ایلگیلی دانیشیق صحیفه‌سین‌ده‌کی بوتون دییشیکلیکلر اوردا گؤستریله‌جکلر.",
     "removewatch": "بو صحیفنی ایزلدیگیم صحیفه‌لر سیاهی‌سین‌دان چیخار",
     "watching": "ایزله‌نیلیر...",
     "unwatching": "ایزله‌مه...",
     "watcherrortext": "ایزلئمئ سیاهی‌سی ترجیحلرینیزی \"$1\" اوچون دییشدیررکن بیر خطا میدانا گلدی.",
-    "enotif_mailer": "{{SITENAME}} بیلدیریش خیدمتی",
     "enotif_reset": "باخیلمیش بوتون صحیفه‌لری ایشاره‌له.",
     "enotif_impersonal_salutation": "{{SITENAME}} ایستیفاده‌چی‌سی",
     "enotif_subject_deleted": "{{SITENAME}} $1 صحیفه‌سی، {{gender:$2|$2}} ایله سیلینیب‌دیر",
     "excontent": "کؤهنه مظمون: '$1'",
     "excontentauthor": "ترکیب: '$1 (و'[[Special:Contributions/$2|$2]]' تاریخچه‌ده فالیتی قئید ائدیلن یئگانه ایستیفاده‌چی‌دیر)",
     "exbeforeblank": "سیلینمه‌دن اوولکی مزمون: '$1",
-    "exblank": "صحیفه بوش",
     "delete-confirm": "سیل $1",
     "delete-legend": "سیل",
     "historywarning": "'خبردارلیق:' سیلینه‌جک صحیفه‌نین تاریخچه‌سینده قئید اولونموش $1 {{PLURAL::$1|دییشدیر|دییشدیرمه}} وار:",
     "allmessagesname": "آد",
     "allmessagesdefault": "دفالت دانیشیق متنی",
     "allmessagescurrent": "ایندیکی متن",
-    "allmessagestext": "بو مئدیا ویکی-ده اولان سیستئم مئساژلارینین سیاهی‌سی‌دیر. اگر مئدیا ویکی-نی لوکاللاش‌دیرماق ایشینده کؤمک ائتمک ایسییرسینیزسه، لطفاً [https://www.mediawiki.org/wiki/Localisation MediaWiki Localisation] و [//translatewiki.net translatewiki.net]-ا باش چکین.",
+    "allmessagestext": "بو مئدیا ویکی-ده اولان سیستئم مئساژلارینین سیاهی‌سی‌دیر. اگر مئدیا ویکی-نی لوکاللاش‌دیرماق ایشینده کؤمک ائتمک ایسییرسینیزسه، لطفاً [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation MediaWiki Localisation] و [//translatewiki.net translatewiki.net]-ا باش چکین.",
     "allmessagesnotsupportedDB": "'''$ wgUseDatabaseMessages''' باغ‌لی اولدوغو اوچون '{{ns:special}}: Allmessages ایستیفاده‌یه آچیق دئییل.",
     "allmessages-filter-legend": "سۆزگَج",
     "allmessages-filter": "خصوصی ائتمک وضعیتینه گؤره فیلترلی:",
     "importunknownsource": "بیلینمه‌ین ایچری کؤچورمه قایناق نؤوو",
     "importcantopen": "ایچری توکمه فایل پرونده لری آچیلمادی",
     "importbadinterwiki": "یانلیش اینتئرویکی کئچیدی",
-    "importnotext": "بوش و یا متن یوخ‌دور",
     "importsuccess": "ایچری توکمه باشا چاتدی!",
-    "importhistoryconflict": "اوست-اوسته دوشمه‌ین کئچمیش رئویزیونو مؤوجود (بو صحیفه داها اول‌دن ایچه کؤچورولموش اولا بیلر)",
     "importnosources": "هئچ ویکیلئراراسی ایچه کؤچورمه قایناغی تعیین و بیرباشا کئچمیش یوکلملری دؤوره خاریجی.",
     "importnofile": "بیر کؤچورمه فایلی یوکلنمدی.",
     "importuploaderrorsize": "ایچه کؤچورولموش فایلین یوکلنمه‌سی اوغورسوز اولدو.\nفایل، ایجازه وئریلن یوکلمه اؤلچوسون‌دن بؤیوک.",
index 69cdc76..f46335d 100644 (file)
     "prefs-skin": "Күренеш",
     "skin-preview": "Алдан байҡау",
     "datedefault": "Ғәҙәттәге",
-    "prefs-beta": "Бета версияһы мөмкинлектәре",
     "prefs-datetime": "Көн һәм ваҡыт",
     "prefs-labs": "Һынау өсөн мөмкинлектәр",
     "prefs-user-pages": "Ҡатнашыусы бите",
     "nowatchlist": "Һеҙҙең күҙәтеү исемлегегеҙ буш.",
     "watchlistanontext": "Күҙәтеү исемлеген ҡарау йәки мөхәррирләү өсөн $1 кәрәк.",
     "watchnologin": "Үҙегеҙҙе танытырға кәрәк",
-    "watchnologintext": "Күҙәтеү исемлегегеҙҙе мөхәррирләү өсөн, һеҙгә [[Special:UserLogin|танылырға]] кәрәк.",
     "addwatch": "Күҙәтеү исемлегенә өҫтәргә",
     "addedwatchtext": "\"[[:$1]]\" бите [[Special:Watchlist|күҙәтеү исемлегегеҙгә]] өҫтәлде.\nБыл биттә һәм уның фекер алышыу битендә буласаҡ бар үҙгәртеүҙәр ундағы исемлектә күрһәтеләсәк.",
     "removewatch": "Күҙәтеү исемлегенән сығарырға",
     "allmessagesname": "Хәбәр",
     "allmessagesdefault": "Ғәҙәттәге яҙма",
     "allmessagescurrent": "Хәҙерге яҙма",
-    "allmessagestext": "Түбәндә MediaWiki исемдәр арауығында ҡулланылған система хәбәрҙәре исемлеге килтерелгән.\nӘгәр MediaWiki программаһын дөйөм локалләштереү эшенә үҙ өлөшөгөҙҙө керетергә теләһәгеҙ, [https://www.mediawiki.org/wiki/Localisation MediaWiki программаһын локалләштереү] битен һәм [//translatewiki.net translatewiki.net] проектын ҡарап сығығыҙ.",
+    "allmessagestext": "Түбәндә MediaWiki исемдәр арауығында ҡулланылған система хәбәрҙәре исемлеге килтерелгән.\nӘгәр MediaWiki программаһын дөйөм локалләштереү эшенә үҙ өлөшөгөҙҙө керетергә теләһәгеҙ, [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation MediaWiki программаһын локалләштереү] битен һәм [//translatewiki.net translatewiki.net] проектын ҡарап сығығыҙ.",
     "allmessagesnotsupportedDB": "Был бит ҡулланыла алмай, сөнки '''$wgUseDatabaseMessages''' мөмкинлеге һүндерелгән.",
     "allmessages-filter-legend": "Һайлау",
     "allmessages-filter": "Үҙгәртеү торошо буйынса һайлау:",
index 68ef7bd..aedb2b3 100644 (file)
     "nowatchlist": "Es gibt koane Eihträg auf deiner Beówochtungslisten.",
     "watchlistanontext": "Du muasst dé $1, um deih Beówchtungslisten z' seeng óder Eihträg borweiten z' kenner.",
     "watchnologin": "Du bist néd auhgmödt",
-    "watchnologintext": "Du muasst [[Special:UserLogin|auhgmödt]] seih, um deih Beówochtungslisten beorweiten z' kenner.",
     "addwatch": "Zua Beówochtungslisten dazuadoah",
     "addedwatchtext": "Dé Seiten „[[:$1]]“ is zua deiner [[Special:Watchlist|Beówochtungslisten]] dazuadauh worn.\nÄnderrungen an derer Seiten und voh da Dischkrierseiten wern do glistt und in da Ywersicht voh dé [[Special:RecentChanges|létzden Änderrungen]] auf Fettschrieft auhzoagt.\n\nWaunnst dé Seiten wieder voh deiner Beówochtungslisten weggerddoah mechst, druck oafoch auf da jeeweiling Seiten auf „nimmer beówochten“.",
     "removewatch": "Voh da Beówochtungslisten wegdoah",
     "allmessagesname": "Nama:",
     "allmessagesdefault": "Standardtext",
     "allmessagescurrent": "Aktuella Text",
-    "allmessagestext": "Des is a Listen vo de MediaWiki-Systemtextt.\nBsuach bittschee de Saiten [https://www.mediawiki.org/wiki/Localisation MediaWiki-Lokalisiarung] und [//translatewiki.net translatewiki.net], wånn du de ån da Lokalisiarung vo MediaWiki betailing mechadst.",
+    "allmessagestext": "Des is a Listen vo de MediaWiki-Systemtextt.\nBsuach bittschee de Saiten [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation MediaWiki-Lokalisiarung] und [//translatewiki.net translatewiki.net], wånn du de ån da Lokalisiarung vo MediaWiki betailing mechadst.",
     "allmessagesnotsupportedDB": "'''Special:Allmessages''' is im Moment net möglich, wei de Datenbank offline is.",
     "thumbnail-more": "vagressan",
     "thumbnail_error": "Fehla ban Estejn vom Vorschaubuidl: $1",
index b3bd837..ce83999 100644 (file)
     "disclaimers": "Panyakalon",
     "disclaimerpage": "Project:Pamorsoon umum",
     "edithelp": "Pangurupion laho patotahon",
-    "helppage": "Help:Isi",
     "mainpage": "Pogu ni Alaman",
     "mainpage-description": "Pogu ni alaman",
     "portal": "Harbangan ni punguan",
index 05f63f4..fefa486 100644 (file)
     "nowatchlist": "شما را هچ چیزی ته وتی لیست چارگ نیست.",
     "watchlistanontext": "لطفا  $1 په دیستن یا اصلاح ایتیمان ته وتی لیست چارگء",
     "watchnologin": "وارد نه بی تگیت",
-    "watchnologintext": "شما بایدن  [[Special:UserLogin|وارد بیت]] په تغییر داتن وتی لیست چارگء",
     "addedwatchtext": "صفحه  \"[[:$1]]\"  په شمی [[Special:Watchlist|watchlist]] هور بیت.\nدیمگی تغییرات په ای صفحه و آیاء صفحه گپ ادان لیست بنت، و صفحه پررنگ جاه کیت ته [[Special:RecentChanges|لیست نوکیت تغییرات]] په راحتر کتن شی که آی زورگ بیت.",
     "removedwatchtext": "صفحه\"[[:$1]]\"  چه [[Special:Watchlist|شمی لیست چارگ]]. دربیت.",
     "watch": "به چار",
     "allmessagesname": "نام",
     "allmessagesdefault": "پیش فرضین متن",
     "allmessagescurrent": "هنوکین متن",
-    "allmessagestext": "شی یک لیستی چه کوله یان موجود ته نام فضای مدیا وی کی انت.\nلطفا بچاریت  [https://www.mediawiki.org/wiki/Localisation MediaWiki Localisation] و [//translatewiki.net translatewiki.net] اگر شما لوٹیت ته ملکی کتن مدیا وی کی کمک کنیت.",
+    "allmessagestext": "شی یک لیستی چه کوله یان موجود ته نام فضای مدیا وی کی انت.\nلطفا بچاریت  [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation MediaWiki Localisation] و [//translatewiki.net translatewiki.net] اگر شما لوٹیت ته ملکی کتن مدیا وی کی کمک کنیت.",
     "allmessagesnotsupportedDB": "ای صفحه نه تونیت استفاده بیت په چی که'''$wgUseDatabaseMessages''' غیر فعالنت.",
     "allmessages-filter-legend": "فیلتر",
     "allmessages-filter": "فیلتر گون حالت دلواهی",
index 393efef..07b3fd6 100644 (file)
     "prefs-skin": "''Skin''",
     "skin-preview": "Tânawon",
     "datedefault": "Mayong kabôtan",
-    "prefs-beta": "Mga posturang yaon sa beta",
     "prefs-datetime": "Petsa asin oras",
     "prefs-labs": "Mga posturang yaon sa Labs",
     "prefs-user-pages": "Paragamit na mga pahina",
     "nowatchlist": "Mayo ka man na mga bagay saimong lista nin pigbabantayan.",
     "watchlistanontext": "Mag $1 tabi para mahiling o maghira nin mga bagay saimong lista nin mga pigbabantayan.",
     "watchnologin": "Mayô sa laog",
-    "watchnologintext": "Dapat ika si [[Special:UserLogin|nakalaog]] para puede kang magribay kan saimong lista nin mga pigbabantayán.",
     "addwatch": "Idagdag sa bantay-listahan",
     "addedwatchtext": "Ining pahina \"[[:$1]]\" dinadagdag sa saimong mga [[Special:Watchlist|Bantay-listahan]].\nAn maabot na mga pagbabâgo sa páhinang ini asin sa asosyadong páhina nin olay paglilistahon duman.",
     "removewatch": "Halion gikan sa bantay-listahan",
     "allmessagesname": "Pangaran",
     "allmessagesdefault": "Panugmad na tekstong mensahe",
     "allmessagescurrent": "Presenteng teksto",
-    "allmessagestext": "Ini sarong listahan nin pansistemang mga mensahe na mananagboan sa espasyong-pangaran kan MediaWiki.\nPakibisita an [https://www.mediawiki.org/wiki/Localisation Mediawiki Lokalisasyon] asin [//translatewiki.net translatewiki.net] kun boot mong mag-ambag sa henerikong lokalisasyon kan MediaWiki.",
+    "allmessagestext": "Ini sarong listahan nin pansistemang mga mensahe na mananagboan sa espasyong-pangaran kan MediaWiki.\nPakibisita an [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation Mediawiki Lokalisasyon] asin [//translatewiki.net translatewiki.net] kun boot mong mag-ambag sa henerikong lokalisasyon kan MediaWiki.",
     "allmessagesnotsupportedDB": "Dai pwedeng gamiton an '''{{ns:special}}:Allmessages''' ta sarado an '''$wgUseDatabaseMessages'''.",
     "allmessages-filter-legend": "An Pansara",
     "allmessages-filter": "Pansara sa paagi kan estado nin kustomisasyon:",
index b7f0422..7c26264 100644 (file)
     "permalink": "Сталая спасылка",
     "print": "Друкаваць",
     "view": "Прагляд",
+    "view-foreign": "Паглядзець на старонцы $1",
     "edit": "Рэдагаваць",
+    "edit-local": "Рэдагаваць лякальнае апісаньне",
     "create": "Стварыць",
+    "create-local": "Дадаць лякальнае апісаньне",
     "editthispage": "Рэдагаваць гэтую старонку",
     "create-this-page": "Стварыць гэтую старонку",
     "delete": "Выдаліць",
     "accountcreatedtext": "Рахунак {{GENDER:$1|удзельніка|удзельніцы}} [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|гутаркі]]) быў створаны.",
     "createaccount-title": "Стварэньне рахунку ў {{GRAMMAR:месны|{{SITENAME}}}}",
     "createaccount-text": "Нехта стварыў рахунак «$2» у {{GRAMMAR:месны|{{SITENAME}}}} ($4) для Вашага адрасу электроннай пошты. Пароль для гэтага рахунку — «$3». Вам трэба ўвайсьці і зьмяніць Ваш пароль зараз.\n\nВы можаце праігнараваць гэты ліст, калі гэты рахунак быў створаны памылкова.",
-    "usernamehasherror": "Імя ўдзельніка ня можа ўтрымліваць сымбаль #",
     "login-throttled": "Вы зрабілі надта шмат спробаў уваходу ў сыстэму.\nКалі ласка, пачакайце $1 перад тым як паспрабаваць ізноў.",
     "login-abort-generic": "Не атрымалася ўвайсьці ў сыстэму, скасавана",
     "loginlanguagelabel": "Мова: $1",
     "prefs-skin": "Афармленьне",
     "skin-preview": "Папярэдні прагляд",
     "datedefault": "Па змоўчаньні",
-    "prefs-beta": "Тэставыя магчымасьці",
-    "prefs-datetime": "Дата і час",
     "prefs-labs": "Экспэрымэнтальныя магчымасьці",
     "prefs-user-pages": "Старонкі ўдзельніка",
     "prefs-personal": "Асабістыя зьвесткі",
     "upload-permitted": "Дазволеныя тыпы файлаў: $1.",
     "upload-preferred": "Пажаданыя тыпы файлаў: $1.",
     "upload-prohibited": "Забароненыя тыпы файлаў: $1.",
-    "uploadlog": "журнал загрузак",
     "uploadlogpage": "Журнал загрузак",
     "uploadlogpagetext": "Сьпіс апошніх загружаных файлаў.",
     "filename": "Назва файла",
     "filereuploadsummary": "Зьмены ў файле:",
     "filestatus": "Умовы распаўсюджаньня і выкарыстаньня:",
     "filesource": "Крыніца:",
-    "uploadedfiles": "Загружаныя файлы",
     "ignorewarning": "Праігнараваць папярэджаньне і захаваць файл",
     "ignorewarnings": "Ігнараваць усе папярэджаньні",
     "minlength1": "Назва файла павінна ўтрымліваць хаця б адзін сымбаль.",
     "overwroteimage": "загружаная новая вэрсія «[[$1]]»",
     "uploaddisabled": "Загрузка файлаў забароненая",
     "copyuploaddisabled": "Загрузка праз URL-адрас адключаная.",
-    "uploadfromurl-queued": "Ваша загрузка далучаная да чаргі.",
     "uploaddisabledtext": "Загрузка файлаў забароненая.",
     "php-uploaddisabledtext": "Загрузка файлаў была адключаная ў парамэтрах канфігурацыі PHP. Калі ласка, праверце значэньне парамэтра «file_uploads».",
     "uploadscripted": "Гэты файл утрымлівае HTML-код альбо скрыпт, які можа памылкова апрацоўвацца браўзэрам.",
     "upload-misc-error": "Невядомая памылка загрузкі",
     "upload-misc-error-text": "Адбылася невядомая памылка пад час загрузкі.\nКалі ласка, упэўніцеся, што URL-адрас слушны, і паспрабуйце ізноў.\nКалі памылка паўтарыцца, зьвярніцеся да [[Special:ListUsers/sysop|адміністратара]].",
     "upload-too-many-redirects": "URL-адрас утрымлівае зашмат перанакіраваньняў",
-    "upload-unknown-size": "Невядомы памер",
     "upload-http-error": "Узьнікла памылка HTTP: $1",
     "upload-copy-upload-invalid-domain": "Капіяваньне загрузак не дазволенае ў гэтым дамэне.",
     "backend-fail-stream": "Немагчыма накіраваць файл $1.",
     "img-auth-streaming": "Перадача струменя «$1».",
     "img-auth-public": "Функцыя img_auth.php ужываецца для файла выхаду з прыватнай вікі.\nГэта вікі ўсталявана як публічная вікі.\nДля найлепшай бясьпекі img_auth.php выключана.",
     "img-auth-noread": "Удзельнік ня мае доступу на чытаньне «$1».",
-    "img-auth-bad-query-string": "URL-адрас утрымлівае няслушны радок запыту.",
     "http-invalid-url": "Няслушны URL-адрас: $1",
     "http-invalid-scheme": "URL-адрасы схемы «$1» не падтрымліваюцца",
     "http-request-error": "HTTP-запыт не атрымаўся ў выніку невядомай памылкі.",
     "filehist-dimensions": "Памеры",
     "filehist-filesize": "Памер файла",
     "filehist-comment": "Камэнтар",
-    "filehist-missing": "Файл адсутнічае",
     "imagelinks": "Выкарыстаньне файла",
     "linkstoimage": "{{PLURAL:$1|1=Наступная старонка спасылаецца|Наступныя старонкі спасылаюцца}} на гэты файл:",
     "linkstoimage-more": "Больш чым $1 {{PLURAL:$1|старонка спасылаецца|старонкі спасылаюцца|старонак спасылаюцца}} на гэты файл.\nУ гэтым сьпісе толькі $1 {{PLURAL:$1|спасылка|спасылкі|спасылак}} на гэты файл.\nДаступны таксама [[Special:WhatLinksHere/$2|поўны сьпіс]].",
     "deadendpagestext": "Наступныя старонкі не спасылаюцца на іншыя старонкі {{GRAMMAR:родны|{{SITENAME}}}}.",
     "protectedpages": "Абароненыя старонкі",
     "protectedpages-indef": "Толькі бестэрміновыя абароны",
+    "protectedpages-summary": "На гэтай старонцы пералічаныя старонкі, якія цяпер абароненыя. Для сьпісу назваў, якія забароненыя для стварэньня, глядзіце [[{{#special:ProtectedTitles}}|{{int:protectedtitles}}]].",
     "protectedpages-cascade": "Толькі каскадныя абароны",
     "protectedpages-noredirect": "Схаваць перанакіраваньні",
     "protectedpagesempty": "Цяпер няма абароненых старонак з пазначанымі парамэтрамі.",
     "listgrouprights-removegroup-self": "можа выдаліць уласны рахунак з {{PLURAL:$2|1=групы|групаў}}: $1",
     "listgrouprights-addgroup-self-all": "Можа дадаць уласны рахунак да ўсіх груп",
     "listgrouprights-removegroup-self-all": "Можа выдаліць уласны рахунак з ўсіх груп",
+    "trackingcategories": "Катэгорыі, якія патрабуюць увагі",
+    "trackingcategories-summary": "На гэтай старонцы пералічаныя катэгорыя, які патрабуюць увагі і якія аўтаматычна запаўняюцца праграмным забесьяпчэньнем MediaWiki. Іх назвы могуць быць зьмененыя рэдагаваньнем сыстэмных паведамленьняў у прасторы назваў {{ns:8}}.",
     "mailnologin": "Няма адрасу атрымальніка",
     "mailnologintext": "Вам неабходна [[Special:UserLogin|ўвайсьці ў сыстэму]] і мець пацьверджаны адрас электроннай пошты ў Вашых [[Special:Preferences|наладах]], каб дасылаць лісты іншым удзельнікам.",
     "emailuser": "Даслаць ліст",
     "emailuser-title-notarget": "Даслаць ліст ўдзельніку ці ўдзельніцы па электроннай пошце",
     "emailpage": "Даслаць ліст ўдзельніку ці ўдзельніцы па электроннай пошце",
     "emailpagetext": "Вы можаце выкарыстаць форму ніжэй, каб даслаць {{GENDER:$1|гэтаму ўдзельніку|гэтай удзельніцы}} ліст па электроннай пошце.\nАдрас электроннай пошты, які Вы пазначалі ў [[Special:Preferences|сваіх наладах]], будзе пазначаны ў полі ліста «Ад», і {{GENDER:$1|ўдзельнік|ўдзельніца}} зможа даслаць на гэты адрас адказ.",
-    "usermailererror": "Пры адсыланьні пошты адбылася памылка:",
     "defemailsubject": "Ліст з {{GRAMMAR:родны|{{SITENAME}}}} ад {{GENDER:$1|удзельніка|удзельніцы}} «$1»",
     "usermaildisabled": "Электронная пошта ўдзельніка адключаная",
     "usermaildisabledtext": "Вы ня можаце дасылаць электронныя лісты іншым удзельнікам {{GRAMMAR:родны|{{SITENAME}}}}",
     "noemailtitle": "Адрас электроннай пошты адсутнічае",
     "noemailtext": "Гэты удзельнік не пазначыў слушны адрас электроннай пошты.",
-    "nowikiemailtitle": "Атрыманьне лістоў па электроннай пошце забароненае",
     "nowikiemailtext": "Гэты ўдзельнік не дазволіў атрымліваць лісты па электроннай пошце ад іншых удзельнікаў.",
     "emailnotarget": "Неіснуючае ці няслушнае імя атрымальніка.",
     "emailtarget": "Увядзіце імя атрымальніка",
     "nowatchlist": "Ваш сьпіс назіраньня пусты.",
     "watchlistanontext": "Вам патрэбна $1, каб праглядаць альбо рэдагаваць сьпіс назіраньня.",
     "watchnologin": "Вы не ўвайшлі ў сыстэму",
-    "watchnologintext": "Вам неабходна [[Special:UserLogin|ўвайсьці ў сыстэму]], каб зьмяніць Ваш сьпіс назіраньня.",
     "addwatch": "Дадаць ў сьпіс назіраньня",
     "addedwatchtext": "Старонка «[[:$1]]» была дададзеная да Вашага [[Special:Watchlist|сьпісу назіраньня]].\nНаступныя зьмены ў гэтай старонцы і зьвязанай зь ёю старонцы абмеркаваньняў будуць бачныя там.",
     "removewatch": "Выдаліць са сьпісу назіраньня",
     "watching": "Дадаецца ў сьпіс назіраньня…",
     "unwatching": "Выдаляецца са сьпісу назіраньня…",
     "watcherrortext": "Узьнікла памылка падчас зьмены Вашага сьпісу назіраньня для «$1».",
-    "enotif_mailer": "Служба паштовага апавяшчэньня {{GRAMMAR:родны|{{SITENAME}}}}",
     "enotif_reset": "Пазначыць усе старонкі як прагледжаныя",
     "enotif_impersonal_salutation": "Удзельнік {{GRAMMAR:родны|{{SITENAME}}}}",
     "enotif_subject_deleted": "Старонка {{GRAMMAR:родны|{{SITENAME}}}} «$1» была выдаленая {{GENDER:$2|удзельнікам|удзельніцай}} $2",
     "excontent": "колішні зьмест: «$1»",
     "excontentauthor": "зьмест быў: «$1» (і адзіным аўтарам быў '[[Special:Contributions/$2|$2]]')",
     "exbeforeblank": "зьмест да ачысткі: «$1»",
-    "exblank": "старонка была пустая",
     "delete-confirm": "Выдаліць «$1»",
     "delete-legend": "Выдаліць",
     "historywarning": "'''Папярэджаньне''': старонка, якую Вы зьбіраецеся выдаліць, мае гісторыю з прыкладна $1 {{PLURAL:$1|вэрсіі|вэрсіяў|вэрсіяў}}:",
     "sp-contributions-newbies-sub": "Унёсак пачынаючых",
     "sp-contributions-newbies-title": "Унёсак удзельнікаў з новых рахункаў",
     "sp-contributions-blocklog": "журнал блякаваньняў",
+    "sp-contributions-suppresslog": "выдалены ўнёсак удзельніка",
     "sp-contributions-deleted": "выдалены ўнёсак удзельніка",
     "sp-contributions-uploads": "загрузкі",
     "sp-contributions-logs": "журналы падзеяў",
     "sp-contributions-blocked-notice": "{{GENDER:$1|Гэты ўдзельнік у дадзены момант заблякаваны|Гэтая ўдзельніца ў дадзены момант заблякаваная}}. Апошні запіс з журнала блякаваньняў пададзены ніжэй для даведкі:",
     "sp-contributions-blocked-notice-anon": "Гэты IP-адрас у дадзены момант заблякаваны.\nАпошні запіс з журнала блякаваньняў пададзены ніжэй для даведкі:",
     "sp-contributions-search": "Пошук унёску",
-    "sp-contributions-suppresslog": "выдалены ўнёсак удзельніка",
     "sp-contributions-username": "IP-адрас альбо імя ўдзельніка/ўдзельніцы:",
     "sp-contributions-toponly": "Паказваць толькі зьмены, якія зьяўляюцца апошнімі вэрсіямі",
     "sp-contributions-newonly": "Паказваць толькі праўкі, якімі былі створаныя старонкі",
     "allmessagesname": "Назва",
     "allmessagesdefault": "Тэкст па змоўчаньні",
     "allmessagescurrent": "Цяперашні тэкст",
-    "allmessagestext": "Сьпіс усіх сыстэмных паведамленьняў, якія існуюць у прасторы назваў MediaWiki.\nКалі ласка, наведайце [https://www.mediawiki.org/wiki/Localisation старонку пра лякалізацыю MediaWiki] і [//translatewiki.net translatewiki.net], калі Вы жадаеце ўдзельнічаць у перакладзе MediaWiki.",
+    "allmessagestext": "Сьпіс усіх сыстэмных паведамленьняў, якія існуюць у прасторы назваў MediaWiki.\nКалі ласка, наведайце [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation старонку пра лякалізацыю MediaWiki] і [//translatewiki.net translatewiki.net], калі Вы жадаеце ўдзельнічаць у перакладзе MediaWiki.",
     "allmessagesnotsupportedDB": "'''{{ns:special}}:AllMessages''' не падтрымліваецца, таму што адключанае '''$wgUseDatabaseMessages'''.",
     "allmessages-filter-legend": "Фільтар",
     "allmessages-filter": "Фільтар па стане зьменаў:",
     "importunknownsource": "Невядомы тып крыніцы імпарту",
     "importcantopen": "Немагчыма адкрыць файл імпарту",
     "importbadinterwiki": "Няслушная спасылка на іншую моўную вэрсію",
-    "importnotext": "Тэкст адсутнічае",
     "importsuccess": "Імпартаваньне скончанае!",
-    "importhistoryconflict": "Канфлікт вэрсіяў у гісторыі рэдагаваньняў (магчыма, гэтую старонку імпартавалі раней)",
     "importnosources": "Крыніцы імпарту паміж вікі не былі вызначаныя і наўпроставая загрузка гісторыі адключаная.",
     "importnofile": "Файл для імпартаваньня ня быў загружаны.",
     "importuploaderrorsize": "Не атрымалася загрузіць файл імпартаваньня.\nПамер файла болей за дазволены для загрузкі.",
     "version-entrypoints": "Уваходныя адрасы",
     "version-entrypoints-header-entrypoint": "Пункт уваходу",
     "version-entrypoints-header-url": "URL",
-    "version-entrypoints-articlepath": "[https://www.mediawiki.org/wiki/Manual:$wgArticlePath Шлях да артыкула]",
-    "version-entrypoints-scriptpath": "[https://www.mediawiki.org/wiki/Manual:$wgScriptPath Пуць да скрыпту]",
+    "version-entrypoints-articlepath": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgArticlePath Шлях да артыкула]",
+    "version-entrypoints-scriptpath": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgScriptPath Пуць да скрыпту]",
     "redirect": "Перанакіраваньне да файла, удзельніка, старонкі або вэрсіі старонкі",
     "redirect-legend": "Перанакіраваньне да файла або старонкі",
     "redirect-summary": "Гэтая спэцыяльная старонка перанакіруе да файла (паводле імя файла), старонкі (паводле нумару вэрсіі або старонкі) або старонкі ўдзельніка (паводле нумару ўдзельніка). Ужываньне: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]] або [[{{#Special:Redirect}}/user/101]].",
     "expand_templates_remove_comments": "Выдаліць камэнтары",
     "expand_templates_remove_nowiki": "Падаўляць тэгі <nowiki> у выніку",
     "expand_templates_generate_xml": "Паказаць дрэва аналізу XML",
-    "expand_templates_preview": "Папярэдні прагляд",
-    "trackingcategories": "Катэгорыі, якія патрабуюць увагі"
+    "expand_templates_preview": "Папярэдні прагляд"
 }
index c740de1..1b89b97 100644 (file)
     "prefs-skin": "Вокладка",
     "skin-preview": "перадпаказ",
     "datedefault": "Не вызначана",
-    "prefs-beta": "Бэта магчымасці",
     "prefs-datetime": "Дата і час",
     "prefs-labs": "Эксперыментальныя магчымасці",
     "prefs-personal": "Удзельнік",
     "nowatchlist": "Ваш спіс назірання зараз пусты.",
     "watchlistanontext": "Каб паглядзець ці змяніць спіс назірання, трэба $1.",
     "watchnologin": "Без прадстаўлення",
-    "watchnologintext": "Каб правіць свой спіс назірання, трэба [[Special:UserLogin|ўвайсці ў сістэму]].",
     "addwatch": "Дадаць у спіс назірання",
     "addedwatchtext": "Старонка \"[[:$1]]\" была дададзена да [[Special:Watchlist|назіраных]] вамі.\nЗмяненні, якія адбудуцца з гэтай старонкай і з Размовай пра яе, будуць паказвацца там, і старонка будзе '''вылучацца шрыфтам''' у [[Special:RecentChanges|спісе нядаўніх змяненняў]], каб лягчэй пазнаваць яе.\n\nКалі вы не пажадаеце больш назіраць за гэтай старонкай, націсніце \"Не назіраць\" у бакоўцы.",
     "removewatch": "Выдаліць са спіса назірання",
index a2909b1..c391f8c 100644 (file)
     "prefs-skin": "Облик",
     "skin-preview": "предварителен преглед",
     "datedefault": "Без предпочитание",
-    "prefs-beta": "Функционалности на Бета",
     "prefs-datetime": "Дата и час",
     "prefs-labs": "Функционалности на Labs",
     "prefs-user-pages": "Потребителски страници",
     "nowatchlist": "Списъкът ви за наблюдение е празен.",
     "watchlistanontext": "За преглеждане и редактиране на списъка за наблюдение се изисква $1 в системата.",
     "watchnologin": "Не сте влезли",
-    "watchnologintext": "Необходимо е да [[Special:UserLogin|влезете]], за да може да променяте списъка си за наблюдение.",
     "addwatch": "Добавяне към списъка за наблюдение",
     "addedwatchtext": "Страницата „'''[[:$1]]'''“ беше добавена към [[Special:Watchlist|списъка ви за наблюдение]].\nНейните бъдещи промени, както и на съответната й дискусионна страница, ще се описват там.",
     "removewatch": "Премахване от списъка за наблюдение",
     "allmessagesname": "Име",
     "allmessagesdefault": "Текст по подразбиране",
     "allmessagescurrent": "Текущ текст",
-    "allmessagestext": "Тази страница съдържа списък на системните съобщения от именното пространство „МедияУики“.\nПосетете [https://www.mediawiki.org/wiki/Localisation MediaWiki Localisation] и [//translatewiki.net translatewiki.net], ако желаете да допринесете за общата локализация на софтуера МедияУики.",
+    "allmessagestext": "Тази страница съдържа списък на системните съобщения от именното пространство „МедияУики“.\nПосетете [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation MediaWiki Localisation] и [//translatewiki.net translatewiki.net], ако желаете да допринесете за общата локализация на софтуера МедияУики.",
     "allmessagesnotsupportedDB": "Тази страница не може да бъде използвана, тъй като е изключена възможността '''$wgUseDatabaseMessages'''.",
     "allmessages-filter-legend": "Филтър",
     "allmessages-filter": "Филтриране по ниво на персонализация:",
index 2d97315..63d6f96 100644 (file)
     "prefs-skin": "Kulimbit",
     "skin-preview": "Titilikan",
     "datedefault": "Kadada katujuan",
-    "prefs-beta": "Fitur Beta",
     "prefs-datetime": "Tanggal wan waktu",
     "prefs-labs": "Fitur Labs",
     "prefs-personal": "Data awak",
     "nowatchlist": "Pian kada baisi apa pun pada daptar itihan Pian.",
     "watchlistanontext": "Muhun $1 hagan maniringi atawa mambabak nang dalam daptar itihan Pian.",
     "watchnologin": "Baluman babuat log",
-    "watchnologintext": "Pian musti [[Special:UserLogin|babuat log]] amun handak magaganti daptar itihan Pian.",
     "addwatch": "Tambahi ka daptar itihan",
     "addedwatchtext": "Tungkaran \"[[:$1]]\" sudah ditambahakan ka [[Special:Watchlist|daptar itihan]] Pian.\nPaubahan-paubahan salanjutnya pada tungkaran ngini dan tungkaran pamandiran taraitnya akan takambit di sini, wan tungkaran itu akan ditampaiakan '''kandal''' pada [[Special:RecentChanges|daptar paubahan pahanyarnya]] cagar labih mudah diitihi.",
     "removewatch": "Buang matan daptar itihan",
     "allmessagesname": "Ngaran",
     "allmessagesdefault": "Naskah baku pasan",
     "allmessagescurrent": "Naskah pasan wayahini.",
-    "allmessagestext": "Ngini adalah sabuah daptar pasan sistem tasadia dalam ruang-ngaran MediaWiki.\nMuhun ilangi [https://www.mediawiki.org/wiki/Localisation MediaWiki Localisation] wan [//translatewiki.net translatewiki.net] amun Pian hakun manyumbang palukalan umum MediaWiki.",
+    "allmessagestext": "Ngini adalah sabuah daptar pasan sistem tasadia dalam ruang-ngaran MediaWiki.\nMuhun ilangi [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation MediaWiki Localisation] wan [//translatewiki.net translatewiki.net] amun Pian hakun manyumbang palukalan umum MediaWiki.",
     "allmessagesnotsupportedDB": "Tungkaran ngini kada kawa dipuruk karana '''$wgUseDatabaseMessages''' sudah dipajahakan.",
     "allmessages-filter-legend": "Saringan",
     "allmessages-filter": "Saringan lawan kaadaan kustom:",
index c06413b..744d873 100644 (file)
     "prefs-skin": "আবরণ (Skin)",
     "skin-preview": "প্রাকদর্শন",
     "datedefault": "কোন পছন্দ নেই",
-    "prefs-beta": "বেটা বৈশিষ্টসমূহ",
     "prefs-datetime": "তারিখ ও সময়",
     "prefs-labs": "পরীক্ষাগার বৈশিষ্টসমূহ",
     "prefs-user-pages": "ব্যবহারকারীর পাতা",
     "nowatchlist": "আপনার নজরতালিকা খালি।",
     "watchlistanontext": "আপনার নজরতালিকার আইটেমগুলি দেখতে বা সম্পাদনা করতে অনুগ্রহ করে $1।",
     "watchnologin": "আপনি এখনও লগ-ইন করেননি।",
-    "watchnologintext": "আপনার নজর তালিকা পরিবর্তনের জন্য আপনাকে অবশ্যই অ্যাকাউন্টে [[Special:UserLogin|প্রবেশ করতে হবে]]।",
     "addwatch": "নজরতালিকায় যোগ করো",
     "addedwatchtext": "\"[[:$1]]\" পাতাটি আপনার [[Special:Watchlist|নজরতালিকাতে]] যোগ করা হয়েছে।\nভবিষ্যতে এই পাতা ও এই পাতার সাথে সম্পর্কিত আলোচনা পাতায় সংঘটিত যাবতীয় পরিবর্তন এখানে তালিকাভুক্ত হবে।",
     "removewatch": "নজরতালিকা থেকে অপসারণ",
     "sp-contributions-newbies-sub": "নতুন অ্যাকাউন্টের জন্য",
     "sp-contributions-newbies-title": "নতুন অ্যাকাউন্টের ব্যবহারকারী অবদান",
     "sp-contributions-blocklog": "বাধা দানের লগ",
+    "sp-contributions-suppresslog": "মুছে ফেলা ব্যবহারকারী অবদান",
     "sp-contributions-deleted": "মুছে ফেলা ব্যবহারকারী অবদান",
     "sp-contributions-uploads": "আপলোডসমূহ",
     "sp-contributions-logs": "লগসমূহ",
     "sp-contributions-blocked-notice": "এই ব্যবহারকারী বর্তমানে বাধাদানকৃত অবস্থায় রয়েছেন।\nতথ্যসূত্র হিসেবে সাম্প্রতিক বাধাদান লগে ভুক্তিটি নিচে দেওয়া হলো:",
     "sp-contributions-blocked-notice-anon": "এই আইপি ঠিকানাটি বর্তমানে বাধাদানকৃত অবস্থায় রয়েছে।\nতথ্যসূত্র হিসেবে সাম্প্রতিক বাধাদান লগের ভুক্তিটি নিচে দেওয়া হলো:",
     "sp-contributions-search": "অবদানসমূহের জন্য অনুসন্ধান",
-    "sp-contributions-suppresslog": "মুছে ফেলা ব্যবহারকারী অবদান",
     "sp-contributions-username": "আইপি (IP) ঠিকানা অথবা ব্যবহারকারীর নাম:",
     "sp-contributions-toponly": "শুধুমাত্র সেই সম্পাদনাগুলি দেখাও যেগুলো সাম্প্রতিক সংস্করণের অন্তর্ভুক্ত",
     "sp-contributions-newonly": "শুধুমাত্র পাতা সৃষ্টি করা সম্পাদনাগুলি দেখাও",
     "allmessagesname": "নাম",
     "allmessagesdefault": "আদি টেক্সট",
     "allmessagescurrent": "বর্তমান টেক্সট",
-    "allmessagestext": "এটি মিডিয়াউইকি নামস্থানে অন্তর্ভুক্ত সিস্টেম বার্তাগুলোর একটি তালিকা।\nআপনি যদি সাধারণ মিডিয়াউইকির স্থানীয়করণে অবদান রাখতে আগ্রহী হন, অনুগ্রহ করে [https://www.mediawiki.org/wiki/Localisation মিডিয়াউইকি স্থানীয়করণ] এবং [//translatewiki.net translatewiki.net] দেখুন।",
+    "allmessagestext": "এটি মিডিয়াউইকি নামস্থানে অন্তর্ভুক্ত সিস্টেম বার্তাগুলোর একটি তালিকা।\nআপনি যদি সাধারণ মিডিয়াউইকির স্থানীয়করণে অবদান রাখতে আগ্রহী হন, অনুগ্রহ করে [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation মিডিয়াউইকি স্থানীয়করণ] এবং [//translatewiki.net translatewiki.net] দেখুন।",
     "allmessagesnotsupportedDB": "এই পাতা ব্যবহার করা যাবে না কারণ '''$wgUseDatabaseMessages''' বন্ধ করে রাখা আছে।",
     "allmessages-filter-legend": "ছাকনী",
     "allmessages-filter": "Filter by customization state:",
index 3f818db..7af7f0d 100644 (file)
     "prefs-skin": "সরহান",
     "skin-preview": "আগচা",
     "datedefault": "পছন করাতা নেই",
-    "prefs-beta": "বেটার বৈশিষ্টহানি",
     "prefs-datetime": "তারিখ বারো সময়",
     "prefs-labs": "পরীক্ষাগারর বৈশিষ্টহানি",
     "prefs-rc": "হাদি এহানর পতানি",
     "allmessagesname": "নাং",
     "allmessagesdefault": "আদ্যকার টেক্সট",
     "allmessagescurrent": "হাদি এহানর ৱাহি",
-    "allmessagestext": "তলে মিডিয়াউইকির নাঙরথাকে পানা একরের সিস্টেম পৌহানির তালিকাহান দেনা ইল।\nকৃপা করিয়া [https://www.mediawiki.org/wiki/Localisation মিডিয়াউইকি অনুবাদর হেইচা পাতাত] বারো [//translatewiki.net translatewiki.net] মিডিয়াউইকি অনুবাদ করানির কা যানা পারর।",
+    "allmessagestext": "তলে মিডিয়াউইকির নাঙরথাকে পানা একরের সিস্টেম পৌহানির তালিকাহান দেনা ইল।\nকৃপা করিয়া [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation মিডিয়াউইকি অনুবাদর হেইচা পাতাত] বারো [//translatewiki.net translatewiki.net] মিডিয়াউইকি অনুবাদ করানির কা যানা পারর।",
     "allmessages-filter-legend": "সাক",
     "allmessages-filter-unmodified": "নাসিলথাইতে",
     "allmessages-filter-all": "হাব্বি",
index d2e6f1c..659ad50 100644 (file)
     "disclaimers": "انکار کننده ها",
     "disclaimerpage": "Project:انکار کاربران",
     "edithelp": "کمک برای اصلاح",
-    "helppage": "Help:محتوا",
     "mainpage": "صفحه اصلی",
     "mainpage-description": "صفحه اصلی",
     "policy-url": "Project:خط مشی",
index 4121bc7..5f81c89 100644 (file)
     "permalink": "Chomlec'h ar stumm-mañ",
     "print": "Moullañ",
     "view": "Gwelet",
+    "view-foreign": "Gwel war $1",
     "edit": "Kemmañ",
     "create": "Krouiñ",
     "editthispage": "Kemmañ ar bajenn-mañ",
     "accountcreatedtext": "Krouet eo bet kont implijer [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|kaozeal]]).",
     "createaccount-title": "Krouiñ ur gont war {{SITENAME}}",
     "createaccount-text": "Unan bennak en deus krouet ur gont gant ho chomlec'h postel war {{SITENAME}} ($4) zo e anv \"$2\" hag a ra gant ar ger-tremen \"$3\".\nMat e vefe deoc'h kevreañ ha cheñch ho ker-tremen bremañ.\n\nNa daolit ket evezh ouzh ar c'hemenn-mañ m'eo bet krouet ar gont dre fazi.",
-    "usernamehasherror": "N'haller ket ober gant an arouezenn # en anvioù an implijerien",
     "login-throttled": "Betek re oc'h heus klasket kevreañ en aner.\nGortozit $1, mar plij, a-raok esaeañ en-dro.",
     "login-abort-generic": "Dibosupl ho kevreañ - Dilezet",
     "loginlanguagelabel": "Yezh : $1",
     "prefs-skin": "Gwiskadur",
     "skin-preview": "Rakwelet",
     "datedefault": "Dre ziouer",
-    "prefs-beta": "Perzhioù beta",
-    "prefs-datetime": "Deiziad hag eur",
     "prefs-labs": "Perzhioù \"labs\"",
     "prefs-user-pages": "Pajennoù implijer",
     "prefs-personal": "Titouroù personel",
     "upload-permitted": "Seurtoù restroù aotreet : $1.",
     "upload-preferred": "Seurtoù restroù gwellañ : $1.",
     "upload-prohibited": "Seurtoù restroù berzet : $1.",
-    "uploadlog": "marilh ar pajennoù enporzhiet",
     "uploadlogpage": "Marilh ar pajennoù enporzhiet",
     "uploadlogpagetext": "Setu a-is marilh ar restroù diwezhañ bet karget war ar servijer.\nS.o [[Special:NewFiles|rann ar skeudennoù nevez]] evit kaout ur sell gwiroc'h",
     "filename": "Anv ar restr",
     "filereuploadsummary": "Kemmoù er restr :",
     "filestatus": "Statud a-fet gwirioù aozer :",
     "filesource": "Mammenn :",
-    "uploadedfiles": "Restroù karget",
     "ignorewarning": "Na ober van ouzh an evezhiadenn hag enrollañ ar restr forzh penaos",
     "ignorewarnings": "Na ober van ouzh ar c'hemennoù diwall",
     "minlength1": "Anv ar restroù a rank bezañ keit hag ul lizherenn da nebeutañ.",
     "overwroteimage": "enporzhiet ur stumm nevez eus \"[[$1]]\"",
     "uploaddisabled": "Ho tigarez, diweredekaet eo bet kas ar restr-mañ.",
     "copyuploaddisabled": "Diweredekaet eo bet ar pellgargañ dre URL.",
-    "uploadfromurl-queued": "Lakaet eo bet ho pellgargadenn er roll gortoz.",
     "uploaddisabledtext": "Diweredekaet eo an enporzhiañ restroù.",
     "php-uploaddisabledtext": "Diweredekaet eo bet ar pellgargañ e PHP. Gwiriit an dibarzh arventennoù file_uploads.",
     "uploadscripted": "Er restr-mañ ez eus kodoù HTML pe skriptoù a c'hallfe bezañ kammgomprenet gant ur merdeer Kenrouedad.",
     "upload-misc-error": "Fazi kargañ dianav",
     "upload-misc-error-text": "Ur fazi dianav zo bet e-ser kargañ.\nGwiriit eo reizh an URL hag e c'hall bezañ tizhet hag esaeit en-dro.\nMa talc'h ar gudenn, kit e darempred gant ur [[Special:ListUsers/sysop|merour]].",
     "upload-too-many-redirects": "Re a adkasoù zo en URL-mañ.",
-    "upload-unknown-size": "Ment dianav",
     "upload-http-error": "Ur fazi HTTP zo bet : $1",
     "upload-copy-upload-invalid-domain": "N'haller ket seveniñ enporzhiadennoù a-bell adalek an domani-mañ.",
     "backend-fail-stream": "Dibosupl eo lenn ar restr $1.",
     "img-auth-streaming": "O lenn en ur dremen \"$1\"",
     "img-auth-public": "Talvezout a ra an arc'hwel img_auth.php da ezvont restroù adalek ur wiki prevez.\nKefluniet eo bet ar wiki-mañ evel ur wiki foran.\nDiweredekaet eo bet img_auth.php evit ur surentez eus ar gwellañ",
     "img-auth-noread": "N'eo ket aotreet an implijer da lenn \"$1\"",
-    "img-auth-bad-query-string": "Un neudennad goulenn direizh zo gant an URL.",
     "http-invalid-url": "URL direizh : $1",
     "http-invalid-scheme": "N'eo ket skoret an URLoù gant ar patrom \"$1\"",
     "http-request-error": "Ur fazi dianavezet 'zo bet pa veze kaset ar reked.",
     "filehist-dimensions": "Mentoù",
     "filehist-filesize": "Ment ar restr",
     "filehist-comment": "Notenn",
-    "filehist-missing": "Restr diank",
     "imagelinks": "Implij ar restr",
     "linkstoimage": "Liammet eo {{PLURAL:$1|ar bajenn-mañ|an $1 pajenn-mañ}} ouzh ar restr-mañ :",
     "linkstoimage-more": "Ouzhpenn $1 {{PLURAL:$1|bajenn zo liammet ouzh|pajenn zo liammet ouzh}} ar restr-mañ.\nNe laka ar roll-mañ war wel nemet {{PLURAL:$1|ar bajenn gentañ liammet ouzh|an $1 pajenn gentañ liammet ouzh}} ar rest-mañ.\nUr [[Special:WhatLinksHere/$2|roll klok]] a c'haller da gaout.",
     "listgrouprights-removegroup-self": "Gallout a ra tennañ {{PLURAL:$2|ar strollad|strolladoù}} eus kont an-unan : $1",
     "listgrouprights-addgroup-self-all": "Gallout a ra ouzhpennañ an holl strolladoù da gont an-unan",
     "listgrouprights-removegroup-self-all": "Gallout a ra tennañ kuit an holl strolladoù eus kont an-unan.",
+    "trackingcategories-name": "Anv ar gemennadenn",
+    "trackingcategories-nodesc": "N'eus deskrivadur ebet.",
+    "trackingcategories-disabled": "Diweredekaet eo ar rummad",
     "mailnologin": "Chomlec'h ebet",
     "mailnologintext": "Ret eo deoc'h bezañ [[Special:UserLogin|kevreet]]\nha bezañ merket ur chomlec'h postel reizh en ho [[Special:Preferences|penndibaboù]]\nevit gallout kas ur postel d'un implijer all.",
     "emailuser": "Kas ur postel d'an implijer-mañ",
     "emailuser-title-notarget": "Kas ur postel d'un implijer",
     "emailpage": "Postel implijer",
     "emailpagetext": "Gallout a rit ober gant ar furmskrid a-is a-benn kas ur postel d'an {{GENDER:$1|implijer|implijerez}}-mañ.\nE maezienn \"Kaser\" ho postel e vo merket ar chomlec'h postel resisaet ganeoc'h-c'hwi en ho [[Special:Preferences|Penndibaboù]], d'ar resever da c'hallout respont deoc'h war-eeun ma kar.",
-    "usermailererror": "Fazi postel :",
     "defemailsubject": "Postel kaset eus {{SITENAME}} gant an implijer \"$1\"",
     "usermaildisabled": "Diweredekaet eo ar c'has posteloù etre an implijerien.",
     "usermaildisabledtext": "Ne c'helloc'h ket kas posteloù da implijerien all er wiki-mañ",
     "noemailtitle": "Chomlec'h postel ebet",
     "noemailtext": "N'en deus ket an implijer-mañ resisaet chomlec'h postel reizh ebet.",
-    "nowikiemailtitle": "Berzet kas posteloù",
     "nowikiemailtext": "Dibabet ez eus bet gant an implijerien-mañ chom hep resev posteloù a-berzh implijerien all.",
     "emailnotarget": "N'eus ket eus ar c'haser-mañ pe faziek eo an anv implijer lakaet.",
     "emailtarget": "Merkañ anav implijer ar resever",
     "nowatchlist": "N'eus pennad ebet en ho roll evezhiañ.",
     "watchlistanontext": "Ret eo deoc'h $1 evit gwelet pe kemmañ an elfennoù zo en ho roll evezhiañ.",
     "watchnologin": "Digevreet",
-    "watchnologintext": "Ret eo deoc'h bezañ [[Special:UserLogin|kevreet]]\na-benn gellout kemmañ ho roll evezhiañ.",
     "addwatch": "Ouzhpennañ d'ar roll evezhiañ",
     "addedwatchtext": "Ouzh ho [[Special:Watchlist|rollad evezhiañ]] eo bet ouzhpennet ar bajenn \"[[:$1]]\".\nAmañ e vo rollet ar c'hemmoù da zont evit ar bajenn-mañ hag ar bajenn gaozeal stag outi.",
     "removewatch": "Lemel a-ziwar ar roll evezhiañ",
     "watching": "Heuliet...",
     "unwatching": "Paouez da evezhiañ...",
     "watcherrortext": "Ur gudenn zo bet en ur gemmañ arventennoù ho roll evezhiañ evit \"$1\".",
-    "enotif_mailer": "Posteler Kemenn {{SITENAME}}",
     "enotif_reset": "Merkañ an holl bajennoù evel gwelet",
     "enotif_impersonal_salutation": "implijer {{SITENAME}}",
     "enotif_subject_deleted": "Pajenn $1 {{SITENAME}} zo bet {{GENDER:$2|dilamet}} gant $2",
     "excontent": "endalc'had '$1'",
     "excontentauthor": "an danvez a oa : '$1' (ha '[[Special:Contributions/$2|$2]]' a oa bet an implijer nemetañ)",
     "exbeforeblank": "A-raok diverkañ e oa an endalc'had : '$1'",
-    "exblank": "pajenn c'houllo",
     "delete-confirm": "Diverkañ \"$1\"",
     "delete-legend": "Diverkañ",
     "historywarning": "'''Diwallit :''' Emaoc'h war-nes diverkañ ur bajenn dezhi un istor gant e-tro {{PLURAL:$1|adweladenn|adweladenn}} :",
     "sp-contributions-newbies-sub": "Evit an implijerien nevez",
     "sp-contributions-newbies-title": "Degasadennoù implijer evit ar c'hontoù nevez",
     "sp-contributions-blocklog": "Roll ar stankadennoù",
+    "sp-contributions-suppresslog": "degasadennoù diverket un implijer",
     "sp-contributions-deleted": "Degasadennoù diverket",
     "sp-contributions-uploads": "Enporzhiadennoù",
     "sp-contributions-logs": "marilhoù",
     "sp-contributions-blocked-notice": "Stanket eo an implijer-mañ evit poent. Dindan emañ merket moned diwezhañ marilh ar stankadennoù, d'ho kelaouiñ :",
     "sp-contributions-blocked-notice-anon": "Stanket eo ar chomlec'h IP-mañ evit ar mare.\nDindan emañ merket enmont diwezhañ marilh ar stankadennoù, d'ho kelaouiñ :",
     "sp-contributions-search": "Klask degasadennoù",
-    "sp-contributions-suppresslog": "degasadennoù diverket un implijer",
     "sp-contributions-username": "Anv implijer pe chomlec'h IP :",
     "sp-contributions-toponly": "Na ziskouez nemet an adweladennoù diwezhañ",
     "sp-contributions-newonly": "Diskouez an aozadennoù a zo krouidigezhioù pajennoù hepken",
     "allmessagesname": "Anv",
     "allmessagesdefault": "Kemennadenn dre ziouer",
     "allmessagescurrent": "Kemennadenn zo bremañ",
-    "allmessagestext": "Setu roll ar c'hemennadennoù reizhiad a c'haller kaout en esaouennoù anv MediaWiki.\nKit da welet [https://www.mediawiki.org/wiki/Localisation Lec'heladur MediaWiki] ha [//translatewiki.net translatewiki.net] mar fell deoc'h kemer perzh e lec'heladur boutin MediaWiki.",
+    "allmessagestext": "Setu roll ar c'hemennadennoù reizhiad a c'haller kaout en esaouennoù anv MediaWiki.\nKit da welet [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation Lec'heladur MediaWiki] ha [//translatewiki.net translatewiki.net] mar fell deoc'h kemer perzh e lec'heladur boutin MediaWiki.",
     "allmessagesnotsupportedDB": "N'haller ket kaout {{ns:special}}:AllMessages rak diweredekaet eo bet wgUseDatabaseMessages.",
     "allmessages-filter-legend": "Sil",
     "allmessages-filter": "Silañ dre stad ar c'hemmoù",
     "importunknownsource": "Dianav eo seurt ar vammenn enporzhiañ",
     "importcantopen": "N'eus ket bet gallet digeriñ ar restr enporzhiet",
     "importbadinterwiki": "Liamm etrewiki fall",
-    "importnotext": "Goullo pe hep tamm testenn ebet",
     "importsuccess": "Deuet eo an enporzhiadenn da benn vat!",
-    "importhistoryconflict": "Divankadennoù zo er pennad istor ha tabut zo gant se (marteze eo bet enporzhiet ar bajenn araozoc'h)",
     "importnosources": "N'eus bet spisaet tamm mammenn etrewiki ebet ha diweredekaet eo enporzhiañ an Istor war-eeun.",
     "importnofile": "N'eus bet enporzhiet restr ebet.",
     "importuploaderrorsize": "C'hwitet eo bet enporzhiañ ar restr. Brasoc'h eo ar restr eget ar vent aotreet.",
     "tags": "Balizennoù ar c'hemmoù reizh",
     "tag-filter": "Silañ ar [[Special:Tags|balizennoù]] :",
     "tag-filter-submit": "Silañ",
+    "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|Balizenn}}]]: $2)",
     "tags-title": "Balizennoù",
     "tags-intro": "Rollañ a ra ar bajenn-mañ ar balizennoù a c'hall ar meziant implijout da verkañ kemmoù hag an dalvoudegezh anezho.",
     "tags-tag": "Anv ar valizenn",
index eef125a..c9c1cef 100644 (file)
     "disclaimers": "Dazkaşşík",
     "disclaimerpage": "Project:Las dazkaşşí",
     "edithelp": "Radbadal ráhşoní",
-    "helppage": "Help:Ridoband",
     "mainpage": "Monpanna",
     "mainpage-description": "Monpanna",
     "portal": "Cágiŕd bundar",
index 08051cb..8fdc6c2 100644 (file)
     "pool-errorunknown": "Nepoznata greška",
     "aboutsite": "O {{GRAMMAR:dativ|{{SITENAME}}}}",
     "aboutpage": "Project:O_projektu_{{SITENAME}}",
-    "copyright": "Sadržaj je dostupan pod licencom $1 osim ako je drugačije navedeno.",
+    "copyright": "Sadržaj je dostupan pod licencom $1 osim ako je navedeno drugačije.",
     "copyrightpage": "{{ns:project}}:Autorska_prava",
     "currentevents": "Trenutni događaji",
     "currentevents-url": "Project:Novosti",
     "createacct-yourpasswordagain": "Potvrdite šifru/lozinku",
     "createacct-yourpasswordagain-ph": "Unesite šifru/lozinku opet",
     "remembermypassword": "Zapamti moju šifru na ovom računaru (najviše $1 {{PLURAL:$1|dan|dana|dana}})",
-    "userlogin-remembermypassword": "Ostavi me prijavljen",
+    "userlogin-remembermypassword": "Ostavi me prijavljenog/-u",
     "userlogin-signwithsecure": "Koristite sigurnu konekciju",
     "yourdomainname": "Vaš domen:",
     "password-change-forbidden": "Ne možete da promjenite lozinku na ovom wikiju.",
     "gotaccount": "Već imate korisnički račun? $1.",
     "gotaccountlink": "Prijavi se",
     "userlogin-resetlink": "Zaboravili ste detalje vaše prijave?",
-    "userlogin-resetpassword-link": "Zaboravili ste šifru/lozinku?",
+    "userlogin-resetpassword-link": "Zaboravili ste lozinku?",
     "userlogin-loggedin": "Već ste prijavljeni kao {{GENDER:$1|$1}}.\nKoristite donji obrazac da biste se prijavili kao drugi korisnik.",
     "userlogin-createanother": "Napravi još jedan račun",
     "createacct-join": "Unesite svoje podatke ispod.",
     "passwordtooshort": "Šifra mora imati najmanje {{PLURAL:$1|1 znak|$1 znaka|$1 znakova}}.",
     "password-name-match": "Vaša šifra mora biti različita od Vašeg korisničkog imena.",
     "password-login-forbidden": "Korištenje ovih korisničkih imena i šifara je zabranjeo.",
-    "mailmypassword": "Poništi šifru/lozinku",
+    "mailmypassword": "Poništi lozinku",
     "passwordremindertitle": "Nova privremena šifra za {{SITENAME}}",
     "passwordremindertext": "Neko (vjerovatno Vi, sa IP adrese $1) je zahtjevao da vam pošaljemo novu šifru za {{SITENAME}}  ($4). Privremena šifra za korisnika \"$2\" je napravljena i glasi \"$3\". Ako ste to željeli, sad treba da se prijavite i promjenite šifru.\nVaša privremena šifra će isteči za {{PLURAL:$5|$5 dan|$5 dana}}.\n\nAko je neko drugi napravio ovaj zahtjev ili ako ste se sjetili vaše šifre i ne želite više da je promjenite, možete da ignorišete ovu poruku i da nastavite koristeći vašu staru šifru.",
     "noemail": "Ne postoji adresa e-pošte za korisnika \"$1\".",
     "noemailcreate": "Morate da navedete validnu e-mail adresu",
     "passwordsent": "Nova šifra je poslata na adresu e-pošte korisnika \"$1\".\nMolimo Vas da se prijavite pošto je primite.",
     "blocked-mailpassword": "Da bi se spriječila nedozvoljena akcija, Vašoj IP adresi je onemogućeno uređivanje stranica kao i mogućnost zahtijevanje nove šifre.",
-    "eauthentsent": "Na navedenu adresu poslana je e-poruka s potvrdom.\nPrije nego što pošaljemo daljnje poruke, pratite uputstva s e-pošte da biste potvrdili da je račun zaista Vaša.",
+    "eauthentsent": "Na navedenu adresu poslana je e-poruka s potvrdom.\nPrije nego što pošaljemo daljnje poruke, pratite uputstva s e-pošte da biste potvrdili da je račun zaista Vaš.",
     "throttled-mailpassword": "Već Vam je poslan e-mail za promjenu šifre u {{PLURAL:$1|zadnjih sat vremena|zadnja $1 sata|zadnjih $1 sati}}.\nDa bi se spriječila zloupotreba, može se poslati samo jedan e-mail za promjenu šifre {{PLURAL:$1|svakih sat vremena|svaka $1 sata|svakih $1 sati}}.",
     "mailerror": "Greška pri slanju e-pošte: $1",
     "acct_creation_throttle_hit": "Posjetioci na ovoj wiki koji koriste Vašu IP adresu su već napravili {{PLURAL:$1|$1 račun|$1 računa}} u zadnjih nekoliko dana, što je najveći broj dopuštenih napravljenih računa za ovaj period.\nKao rezultat, posjetioci koji koriste ovu IP adresu ne mogu trenutno praviti više računa.",
-    "emailauthenticated": "Vaša adresa e-pošte je potvrđena $2 u $3.",
-    "emailnotauthenticated": "Vaša adresa e-pošte još nije potvrđena.\nNijedna e-poruka neće biti poslana za bilo koju uslugu od slijedećih.",
+    "emailauthenticated": "Vaša adresa e-pošte potvrđena je $2 u $3.",
+    "emailnotauthenticated": "Vaša adresa e-pošte još nije potvrđena.\nNijedna e-poruka neće biti poslana za bilo koju uslugu od sljedećih.",
     "noemailprefs": "Unesite e-mail adresu za osposobljavanje slijedećih usluga.",
     "emailconfirmlink": "Potvrdite Vašu e-mail adresu",
     "invalidemailaddress": "Ova e-mail adresa ne može biti prihvaćena jer je u neodgovarajućem obliku.\nMolimo vas da unesete ispravnu adresu ili ostavite prazno polje.",
     "accountcreatedtext": "Korisnički račun za [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|razgovor]]) je napravljen.",
     "createaccount-title": "Pravljenje korisničkog računa za {{SITENAME}}",
     "createaccount-text": "Neko je napravio korisnički račun za vašu e-mail adresu na {{SITENAME}} ($4) sa imenom \"$2\", i sa šifrom \"$3\".\nTrebali biste se prijaviti i promjeniti šifru.\n\nMožete ignorisati ovu poruku, ako je korisnički račun napravljen greškom.",
-    "usernamehasherror": "Korisničko ime ne može sadržavati haš znakove",
     "login-throttled": "Previše puta ste se pokušali prijaviti.\nMolimo Vas da sačekate $1 prije nego što pokušate ponovo.",
     "login-abort-generic": "Vaša prijava nije bila uspješna – Prekinuto",
     "loginlanguagelabel": "Jezik: $1",
     "resetpass-abort-generic": "Promjenu šifre/lozinke je prekinula ekstenzija.",
     "passwordreset": "Poništavanje šifre",
     "passwordreset-text-one": "Ispunite ovaj obrazac da biste resetovali Vašu šifru/lozinku.",
-    "passwordreset-text-many": "{{PLURAL:$1|Ispunite jedno od polja kako bi ste dobili privremenu šifru/lozinku putem e-pošte.}}",
+    "passwordreset-text-many": "{{PLURAL:$1|Ispunite jedno od polja kako biste dobili privremenu lozinku putem e-pošte.}}",
     "passwordreset-legend": "Poništi šifru",
     "passwordreset-disabled": "Poništavanje šifre  je onemogućeno na ovoj wiki.",
     "passwordreset-emaildisabled": "E-pošta je onemogućena na ovom wikiju.",
     "passwordreset-emailtext-ip": "Neko (vjerovatno Vi, s IP adrese $1) je zatražio podsjetnik Vaših detalja računa za {{SITENAME}} ($4). Sljedeći {{PLURAL:$3|račun korisnika je|računi korisnika su}} povezani s ovom e-mail adresom:\n\n$2\n\n{{PLURAL:$3|Ova privremena šifra|Ove privremene šifre}} će isteći za {{PLURAL:$5|jedan dan|$5 dana}}.\nTrebate se prijaviti i odabrati novu šifru. Ako je neko drugi napravio ovaj zahtjev, ili ako ste se sjetili Vaše početne šifre, a ne želite je promijeniti, možete zanemariti ovu poruku i nastaviti koristiti staru šifru.",
     "passwordreset-emailtext-user": "Korisnik $1 na {{SITENAME}} je zatražio podsjetnik o detaljima Vašeg računa za {{SITENAME}} ($4). Sljedeći {{PLURAL:$3|korisnički račun je|korisnički računi su}} povezani s ovom e-mail adresom:\n\n$2\n\n{{PLURAL:$3|Ova privremena šifra|Ove privremene šifre}} će isteći za {{PLURAL:$5|jedan dan|$5 dana}}.\nTrebate se prijaviti i odabrati novu šifru. Ako je neko drugi napravio ovaj zahtjev, ili ako ste se sjetili Vaše originalne šifre, a ne želite je više promijeniti, možete zanemariti ovu poruku i nastaviti koristiti staru šifru.",
     "passwordreset-emailelement": "Korisničko ime: $1\nPrivremena šifra: $2",
-    "passwordreset-emailsent": "Podsjetnik o šifri/lozinci je poslat na Vašu E-mail adresu.",
-    "passwordreset-emailsent-capture": "Poslat je podsjetnik preko e-pošte (prikazan dole).",
-    "passwordreset-emailerror-capture": "E-poruka za resetiranje šifre/lozinke, prikazan ispod, je poslan, ali slanje {{GENDER:$2|korisniku|korisnici}} nije uspjelo: $1",
+    "passwordreset-emailsent": "Podsjetnik na lozinku poslan je na Vašu e-mail adresu.",
+    "passwordreset-emailsent-capture": "Poslan je podsjetnik preko e-pošte (prikazano ispod).",
+    "passwordreset-emailerror-capture": "E-poruka za resetiranje lozinke, prikazano ispod, poslana je, ali slanje {{GENDER:$2|korisniku|korisnici}} nije uspjelo: $1",
     "changeemail": "Promijeni e-mail adresu",
     "changeemail-header": "Promijeni e-mail adresu korisničkog računa",
     "changeemail-text": "Ispunite ovaj formular da biste promijenili svoju e-mail adresu. Morat ćete upisati svoj pasvord da potvrdite ovu promjenu.",
     "accmailtitle": "Šifra poslana.",
     "accmailtext": "Nasumično odabrana šifra za [[User talk:$1|$1]] je poslata na adresu $2.\n\nŠifra/lozinka za ovaj novi račun može biti promijenjena na stranici ''[[Special:ChangePassword|izmjene šifre]]'' nakon prijave.",
     "newarticle": "(Novi)",
-    "newarticletext": "Došli ste na stranicu koja još nema sadržaja.\n*Ako želite unijeti sadržaj, počnite tipkati u prozor ispod ovog teksta.\n*Ako vam treba pomoć, idite na [$1 stranicu za pomoć].\n*Ako ste ovamo dospjeli slučajno, kliknite dugme \"Nazad\" (''Back'') u svom internet pregledniku.",
+    "newarticletext": "Došli ste na stranicu koja još nema sadržaja.\n*Ako želite unijeti sadržaj, počnite tipkati u prozor ispod ovog teksta.\n*Ako Vam treba pomoć, idite na [$1 stranicu za pomoć].\n*Ako ste ovamo dospjeli slučajno, kliknite na dugme \"Nazad\" (''Back'') u Vašem internetskom pregledniku.",
     "anontalkpagetext": "----''Ovo je stranica za razgovor za anonimnog korisnika koji još nije napravio nalog ili ga ne koristi.\nZbog toga moramo da koristimo brojčanu IP adresu kako bismo identifikovali njega ili nju.\nTakvu adresu može dijeliti više korisnika.\nAko ste anonimni korisnik i mislite da su vam upućene nebitne primjedbe, molimo Vas da [[Special:UserLogin/signup|napravite nalog]] ili se [[Special:UserLogin|prijavite]] da biste izbjegli buduću zabunu sa ostalim anonimnim korisnicima.''",
     "noarticletext": "Na ovoj stranici trenutno nema teksta.\nMožete [[Special:Search/{{PAGENAME}}|tražiti naslov ove stranice]] na drugim stranicama.\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} tražiti u povezanim zapisima] ili [{{fullurl:{{FULLPAGENAME}}|action=edit}} urediti ovu stranicu]</span>.",
     "noarticletext-nopermission": "Trenutno nema teksta na ovoj stranici.\nMožete [[Special:Search/{{PAGENAME}}|tražiti ovaj naslov stranice]] na drugim stranicama ili <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} pretražiti povezane zapisnike]</span>, ali nemate dozvolu da napravite ovu stranicu.",
-    "missing-revision": "Uređivanje broj $1 na stranici \"{{FULLPAGENAME}}\" ne postoji.\n\nOvo se obično dešava kada pratite zastarjelu vezu na stranice koja je obrisana.\nViše informacija možete pronaći u [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} protokol brisanja].",
+    "missing-revision": "Uređivanje broj $1 na stranici \"{{FULLPAGENAME}}\" ne postoji.\n\nOvo se obično dešava kad pratite zastarjelu vezu na stranicu koja je obrisana.\nViše informacija možete pronaći u [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} protokolu brisanja].",
     "userpage-userdoesnotexist": "Korisnički račun \"<nowiki>$1</nowiki>\" nije registrovan.\nMolimo provjerite da li želite napraviti/izmijeniti ovu stranicu.",
     "userpage-userdoesnotexist-view": "Korisnički račun \"$1\" nije registrovan.",
     "blocked-notice-logextract": "Ovaj korisnik je trenutno blokiran.\nPosljednje stavke zapisnika blokiranja možete pogledati ispod:",
     "powersearch-togglenone": "Ništa",
     "search-external": "Vanjska pretraga",
     "searchdisabled": "<p>Izvinjavamo se!  Puno pretraga teksta je privremeno onemogućena.  U međuvremenu, možete koristiti Google za pretragu.  Indeks može biti stariji.",
-    "search-error": "Dogodila se greška prilikom pretraživanja: $1",
+    "search-error": "Desila se greška prilikom pretraživanja: $1",
     "preferences": "Postavke",
     "mypreferences": "Postavke",
     "prefs-edits": "Broj izmjena:",
     "prefs-skin": "Koža",
     "skin-preview": "Pregled",
     "datedefault": "Nije bitno",
-    "prefs-beta": "Beta mogućnosti",
-    "prefs-datetime": "Datum i vrijeme",
     "prefs-labs": "Eksperimentalne mogućnosti",
     "prefs-user-pages": "Korisničke stranice",
     "prefs-personal": "Korisnički podaci",
     "right-editmyusercss": "Uredite svoje vlastite korisničke CSS datoteke",
     "right-editmyuserjs": "Uredite vlastite korisničke JavaScript datoteke",
     "right-viewmywatchlist": "Pogledaj svoj spisak praćenih stranica",
-    "right-viewmyprivateinfo": "Vidite svoje privatne podatke (npr. adresa e-pošte, pravo ime)",
+    "right-viewmyprivateinfo": "Pogledajte Vaše privatne podatke (npr, adresa e-pošte, pravo ime)",
     "right-editmyprivateinfo": "Uredite svoje privatne podatke (npr. adresa e-pošte, pravo ime)",
     "right-editmyoptions": "Uredite svoje postavke",
     "right-rollback": "Brzo vraćanje izmjena na zadnjeg korisnika koji je uređivao određenu stranicu",
     "action-viewmyprivateinfo": "pogledajte svoje privatne informacije",
     "action-editmyprivateinfo": "uredite svoje privatne podatke",
     "nchanges": "$1 {{PLURAL:$1|promjena|promjene|promjena}}",
-    "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|izmjena od vaše posljedne posjete}}",
+    "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|izmjena od Vaše posljedne posjete}}",
     "enhancedrc-history": "historija",
     "recentchanges": "Nedavne izmjene",
     "recentchanges-legend": "Postavke nedavnih izmjena",
     "upload-permitted": "Podržane vrste datoteka: $1.",
     "upload-preferred": "Preferirane vrste datoteka: $1.",
     "upload-prohibited": "Zabranjene vrste datoteka: $1.",
-    "uploadlog": "log slanja",
     "uploadlogpage": "Protokol postavljanja",
     "uploadlogpagetext": "Ispod je spisak najskorijih slanja.",
     "filename": "Ime datoteke",
     "filereuploadsummary": "Izmjene datoteke:",
     "filestatus": "Status autorskih prava:",
     "filesource": "Izvor:",
-    "uploadedfiles": "Poslati fajlovi",
     "ignorewarning": "Zanemari upozorenja i sačuvaj datoteku",
     "ignorewarnings": "Zanemari sva upozorenja",
     "minlength1": "Ime datoteke mora imati barem jedno slovo.",
     "overwroteimage": "postavljena nova verzija datoteke \"[[$1]]\"",
     "uploaddisabled": "Slanje fajlova je isključeno",
     "copyuploaddisabled": "Postavljanje putem URL nije omogućeno.",
-    "uploadfromurl-queued": "Vaše postavljanje je na čekanju.",
     "uploaddisabledtext": "Postavljanje datoteka je onemogućeno.",
     "php-uploaddisabledtext": "Postavljanje datoteka preko PHP je onemogućeno. Molimo provjerite postavku file_uploads.",
     "uploadscripted": "Ova datoteka sadrži HTML ili skriptni kod koji može izazvati grešku kod internet preglednika.",
     "upload-misc-error": "Nepoznata greška pri postavljanju",
     "upload-misc-error-text": "Desila se nepoznata greška pri postavljanju.\nMolimo Vas provjerite da li je URL tačan i dostupan pa pokušajte ponovo.\nAko se problem ne riješi, kontaktirajte [[Special:ListUsers/sysop|administratora]].",
     "upload-too-many-redirects": "URL sadrži previše preusmjerenja",
-    "upload-unknown-size": "Nepoznata veličina",
     "upload-http-error": "Desila se HTTP greška: $1",
     "upload-copy-upload-invalid-domain": "Kopije postavljenih datoteka nisu dostupne sa ove domene.",
     "backend-fail-stream": "Ne mogu emitirati datoteku $1.",
     "img-auth-streaming": "Tok \"$1\".",
     "img-auth-public": "Funkcija img_auth.php služi za izlaz datoteka sa privatnih wikija.\nOva wiki je postavljena kao javna wiki.\nZa optimalnu sigurnost, img_auth.php je onemogućena.",
     "img-auth-noread": "Korisnik nema pristup za čitanje \"$1\".",
-    "img-auth-bad-query-string": "URL ima nevaljan izraz upita.",
     "http-invalid-url": "Nevaljan URL: $1",
     "http-invalid-scheme": "URLovi za koje šema \"$1\" nije podržana",
     "http-request-error": "Nepoznata greška pri slanju zahtjeva.",
     "filehist-dimensions": "Dimenzije",
     "filehist-filesize": "Veličina datoteke",
     "filehist-comment": "Komentar",
-    "filehist-missing": "Datoteka nedostaje",
     "imagelinks": "Upotreba datoteke",
     "linkstoimage": "{{PLURAL:$1|Slijedeća stranica koristi|Slijedećih $1 stranica koriste}} ovu sliku:",
     "linkstoimage-more": "Više od $1 {{PLURAL:$1|datoteke|datoteka}} je povezano s ovom datotekom.\nSlijedeći spisak pokazuje samo {{PLURAL:$1|prvu stranicu povezanu|prve $1 stranice povezane|prvih $1 stranica povezanih}} s ovom datotekom.\nOvdje je dostupan [[Special:WhatLinksHere/$2|potpuni spisak]].",
     "protectedpages-noredirect": "Sakrij preusmjerenja",
     "protectedpagesempty": "Trenutno nijedna stranica nije zaštićena s ovim parametrima.",
     "protectedpages-page": "Stranica",
-    "protectedpages-expiry": "Ističe",
+    "protectedpages-expiry": "Istječe",
     "protectedpages-reason": "Razlog",
     "protectedpages-unknown-timestamp": "Nepoznato",
     "protectedtitles": "Zaštićeni naslovi",
     "emailuser-title-notarget": "Pošalji e-mail korisniku",
     "emailpage": "Pošalji e-mail korisniku",
     "emailpagetext": "Možete korisiti formu ispod za slanje e-mail poruka {{GENDER:$1|ovom korisniku|ovoj korisnici|ovom korisniku}}.\nE-mail adresa koju ste unijeli u [[Special:Preferences|Vašim korisničkim postavkama]] će biti prikazana kao adresa pošiljaoca, tako da će primaoc poruke moći da Vam odgovori.",
-    "usermailererror": "Objekat pošte je vratio grešku:",
     "defemailsubject": "{{SITENAME}} e-pošta od {{GENDER:$1|korisnika|korisnice|korisnika}} $1",
     "usermaildisabled": "Korisnički e-mail onemogućen",
     "usermaildisabledtext": "Ne možete poslati e-mail drugim korisnicima na ovoj wiki",
     "noemailtitle": "Nema adrese e-pošte",
     "noemailtext": "Ovaj korisnik nije naveo ispravnu adresu e-pošte.",
-    "nowikiemailtitle": "E-mail nije dopušten",
     "nowikiemailtext": "Ovaj korisnik je odabrao da ne prima e-mail poštu od drugih korisnika.",
     "emailnotarget": "Neodgovarajuće ili nevaljano korisničko ime za primanje e-maillova.",
     "emailtarget": "Unesite korisnika za primanje e-mailova",
     "nowatchlist": "Nemate ništa na svom spisku praćenih članaka.",
     "watchlistanontext": "Molimo da $1 da možete vidjeti ili urediti stavke na Vašem spisku praćenja.",
     "watchnologin": "Niste prijavljeni",
-    "watchnologintext": "Morate biti [[Special:UserLogin|prijavljeni]] da bi ste mijenjali spisak praćenih članaka.",
     "addwatch": "Dodaj na spisak praćenja",
     "addedwatchtext": "Stranica \"[[:$1]]\" je dodata vašem [[Special:Watchlist|spisku praćenih članaka]]. \nBuduće promjene ove stranice i njoj pridružene stranice za razgovor će biti navedene ovde.",
     "removewatch": "Ukloni sa spiska praćenja",
     "watching": "Pratim...",
     "unwatching": "Ne pratim...",
     "watcherrortext": "Desila se greška pri promjeni postavki vašeg spiska praćenja za \"$1\".",
-    "enotif_mailer": "{{SITENAME}} obaviještenje o pošti",
     "enotif_reset": "Označi sve strane kao posjećene",
     "enotif_impersonal_salutation": "{{SITENAME}} korisnik",
     "enotif_subject_deleted": "{{gender:$2|Korisnik|Korisnica}} $2 je {{gender:$2|obrisao|obrisala}} stranicu $1 projekta {{SITENAME}}",
     "excontent": "sadržaj je bio: '$1'",
     "excontentauthor": "sadržaj je bio: '$1' (i jedini korisnik koji je mijenjao bio je '[[Special:Contributions/$2|$2]]')",
     "exbeforeblank": "sadržaj prije brisanja je bio: '$1'",
-    "exblank": "stranica je bila prazna",
     "delete-confirm": "Brisanje \"$1\"",
     "delete-legend": "Obriši",
     "historywarning": "'''Upozorenje''':  Stranica koju želite da obrišete ima historiju sa otprilike $1 {{PLURAL:$1|revizijom|revizije|revizija}}:",
     "cantrollback": "Ne može se vratiti izmjena; posljednji autor je ujedno i jedini.",
     "alreadyrolled": "Ne može se vratiti posljednja izmjena [[:$1]] od korisnika [[User:$2|$2]] ([[User talk:$2|razgovor]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]); neko drugi je već izmjenio ili vratio članak.\n\nPosljednja izmjena je bila od korisnika [[User:$3|$3]] ([[User talk:$3|razgovor]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
     "editcomment": "Sažetak izmjene je bio: \"''$1''\".",
-    "revertpage": "Vraćene izmjene korisnika [[Special:Contributions/$2|$2]] ([[User talk:$2|razgovor]]) na posljednju izmjenu koju je načinio [[User:$1|$1]]",
-    "revertpage-nouser": "Vraćene izmjene skrivenog korisnika na posljednju reviziju koju je {{GENDER:$1|načinio|načinila}} [[User:$1|$1]]",
+    "revertpage": "Vraćene izmjene korisnika [[Special:Contributions/$2|$2]] ([[User talk:$2|razgovor]]) na posljednju izmjenu koju je napravio [[User:$1|$1]]",
+    "revertpage-nouser": "Vraćene izmjene skrivenog korisnika na posljednju reviziju, koju je {{GENDER:$1|napravio|napravila}} [[User:$1|$1]]",
     "rollback-success": "Poništene izmjene korisnika $1;\nvraćeno na posljednju verziju koju je sačuvao $2.",
     "sessionfailure-title": "Greška u sesiji",
     "sessionfailure": "Izgleda da postoji problem sa vašom sesijom; ova akcija je otkazana kao prevencija protiv napadanja sesija. Kliknite \"back\" (''nazad'') i osvježite stranicu sa koje ste došli, i opet pokušajte.",
     "change-blocklink": "promijeni blokadu",
     "contribslink": "doprinosi",
     "emaillink": "pošalji e-mail",
-    "autoblocker": "Automatski ste blokirani jer dijelite IP adresu sa \"[[User:$1|$1]]\".\nRazlog za blokiranje korisnika $1 je ''$2''",
+    "autoblocker": "Automatski ste blokirani jer dijelite IP-adresu sa \"[[User:$1|$1]]\".\nRazlog za blokiranje korisnika $1 je ''$2''",
     "blocklogpage": "Evidencija blokiranja",
     "blocklog-showlog": "Ovaj korisnik je ranije blokiran. Zapisnik blokiranja je prikazan ispod kao referenca:",
     "blocklog-showsuppresslog": "Ovaj korisnik je ranije blokiran i sakriven. Zapisnik sakrivanja je prikazan ispod kao referenca:",
     "allmessagesname": "Naziv",
     "allmessagesdefault": "Uobičajeni tekst",
     "allmessagescurrent": "Trenutni tekst",
-    "allmessagestext": "Ovo je spisak svih sistemskih poruka u dostupnih u MediaWiki imenskom prostoru.\nMolimo posjetite [https://www.mediawiki.org/wiki/Localisation MediaWiki lokalizaciju] i [//translatewiki.net translatewiki.net] ako želite doprinijeti općoj lokalizaciji MediaWikija.",
+    "allmessagestext": "Ovo je spisak svih sistemskih poruka u dostupnih u MediaWiki imenskom prostoru.\nMolimo posjetite [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation MediaWiki lokalizaciju] i [//translatewiki.net translatewiki.net] ako želite doprinijeti općoj lokalizaciji MediaWikija.",
     "allmessagesnotsupportedDB": "Ova stranica ne može biti korištena jer je <i>wgUseDatabaseMessages</i> isključen.",
     "allmessages-filter-legend": "Filter",
     "allmessages-filter": "Filter po stanju podešavanja:",
     "importunknownsource": "Nepoznat izvorni tip uvoza",
     "importcantopen": "Ne može se otvoriti uvozna datoteka",
     "importbadinterwiki": "Loš interwiki link",
-    "importnotext": "Stranica je prazna, ili bez teksta",
     "importsuccess": "Uspješno ste uvezli stranicu!",
-    "importhistoryconflict": "Postoji konfliktna historija revizija (možda je ova stranica ranije uvezena)",
     "importnosources": "Nije definisan međuwiki izvor za uvoz i direktna postavljanja historije su onemogućena.",
     "importnofile": "Uvozna datoteka nije postavljena.",
     "importuploaderrorsize": "Postavljanje uvozne datoteke nije uspjelo.\nDatoteka je veća nego što je dopušteno.",
     "pageinfo-edits": "Ukupan broj izmjena",
     "pageinfo-authors": "Ukupan broj različitih autora",
     "pageinfo-recent-edits": "Broj nedavnih izmjena (u poslednjih $1)",
-    "pageinfo-recent-authors": "Broj nedavnih specifičnih autora",
+    "pageinfo-recent-authors": "Broj nedavnih različitih autora",
     "pageinfo-magic-words": "{{PLURAL:$1|Čarobna riječ|Čarobne riječi}} ($1)",
     "pageinfo-hidden-categories": "{{PLURAL:$1|Sakrivena kategorija|Sakrivene kategorije}} ($1)",
     "pageinfo-templates": "{{PLURAL:$1|Uključeni šablon|Uključeni šabloni}} ($1)",
index bb509bf..b615e24 100644 (file)
     "currentevents-url": "Project:Accanjingeŋ kokkoro",
     "disclaimers": "Diseklaima",
     "edithelp": "Paŋinriŋ mapadécéŋ",
-    "helppage": "Help:Lise",
     "mainpage": "Leppa Indoë",
     "mainpage-description": "Leppa Indoë",
     "portal": "Portal komunitas",
index e76b42f..65888a7 100644 (file)
     "currentevents-url": "Project:Һонин мэдээн",
     "disclaimers": "Татагалзалнууд",
     "disclaimerpage": "Project:Ниитэ татагалзал",
-    "helppage": "Help:Агуулга",
     "mainpage": "Нюур хуудаһан",
     "mainpage-description": "Нюур хуудаһан",
     "portal": "Хурал",
index 52a0e1a..dfb50e7 100644 (file)
     "permalink": "Enllaç permanent",
     "print": "Imprimir",
     "view": "Mostra",
+    "view-foreign": "Mostra en $1",
     "edit": "Modifica",
+    "edit-local": "Modifica la descripció local",
     "create": "Crea",
+    "create-local": "Afegeix una descripció local",
     "editthispage": "Modifica la pàgina",
     "create-this-page": "Crea aquesta pàgina",
     "delete": "Elimina",
     "protectedpagetext": "S'ha protegit la pàgina per evitar-hi modificacions.",
     "viewsourcetext": "Podeu visualitzar i copiar el codi font d’aquesta pàgina:",
     "viewyourtext": "Vostè pot veure i copiar la font de ' ' les modificacions ' ' d'aquesta pàgina:",
-    "protectedinterface": "Aquesta pàgina proporciona el text de la interfície del software d'aquest wiki i està protegida per evitar els abusos.\nPer agregar o canviar les traduccions per a tots els wikis, si us plau fes servir [//translatewiki.net/ translatewiki.net], el projecte de localització de MediaWiki.",
+    "protectedinterface": "Aquesta pàgina proporciona el text de la interfície del software d'aquest wiki i està protegida per evitar els abusos.\nPer afegir o canviar les traduccions per a tots els wikis, feu servir [//translatewiki.net/ translatewiki.net], el projecte de localització de MediaWiki.",
     "editinginterface": "'''Avís:''' Esteu editant una pàgina que conté cadenes de text per a la interfície d'aquest programari. Tingueu en compte que els canvis que es fan a aquesta pàgina afecten a l'aparença de la interfície d'altres usuaris. Per afegir o modificar traduccions a totes les wikis, plantegeu-vos utilitzar la [//translatewiki.net/ translatewiki.net], el projecte de localització de MediaWiki.",
     "cascadeprotected": "Aquesta pàgina està protegida i no es pot modificar perquè està inclosa en {{PLURAL:$1|la següent pàgina, que té|les següents pàgines, que tenen}} activada l'opció de «protecció en cascada»:\n$2",
     "namespaceprotected": "No teniu permís per a modificar pàgines en l'espai de noms '''$1'''.",
     "gotaccountlink": "Inicia una sessió",
     "userlogin-resetlink": "Heu oblidat les vostres dades d'accés?",
     "userlogin-resetpassword-link": "Has oblidat la teva contrasenya?",
+    "userlogin-helplink2": "Ajuda amb el registre",
     "userlogin-loggedin": "Heu iniciat una sessió com {{GENDER:$1|$1}}.\nFeu servir el formulari de sota per iniciar la sessió com un altre usuari.",
     "userlogin-createanother": "Crea un altre compte",
     "createacct-join": "Introduïu les vostres dades.",
     "accountcreatedtext": "S'ha creat el compte d'usuari de [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|discussió]]).",
     "createaccount-title": "Creació d'un compte a {{SITENAME}}",
     "createaccount-text": "Algú ha creat un compte d'usuari anomenat $2 al projecte {{SITENAME}}\n($4) amb la vostra adreça de correu electrònic. La contrasenya per a l'usuari «$2» és «$3». Hauríeu d'accedir al compte i canviar-vos aquesta contrasenya quan abans millor.\n\nSi no hi teniu cap relació i aquest compte s'ha creat per error, simplement ignoreu el missatge.",
-    "usernamehasherror": "El nom d'usuari no pot contenir caràcters hash",
     "login-throttled": "Heu realitzat massa intents d'accés a la sessió.\nEspereu $1 abans de tornar-ho a provar.",
     "login-abort-generic": "L'entrada al compte d'usuari no ha reeixit - Abortada",
     "loginlanguagelabel": "Llengua: $1",
     "suspicious-userlogout": "S'ha denegat la vostra petició per tancar la sessió ja què sembla que va ser enviada per un navegador defectuós o un proxy cau.",
     "createacct-another-realname-tip": "El nom real és opcional.\nSi decidiu proporcionar-lo, s'utilitzarà per a reconèixer a l'usuari el seu treball.",
     "pt-login": "Inicia la sessió",
+    "pt-login-button": "Inicia sessió",
     "pt-createaccount": "Crea un compte",
     "pt-userlogout": "Finalitza la sessió",
     "php-mail-error-unknown": "Error desconegut en la funció mail() de PHP",
     "resetpass-abort-generic": "Una extensió ha interromput el canvi de contrasenya.",
     "resetpass-expired": "La contrasenya ha vençut. Definiu una contrasenya nova per iniciar la sessió.",
     "resetpass-expired-soft": "La contrasenya ha vençut i cal restablir-la. Trieu una contrasenya nova ara, o feu clic a «{{int:resetpass-submit-cancel}}» per a restablir-la més endavant.",
+    "resetpass-validity-soft": "La contrasenya no és vàlida: $1\n\nTrieu una nova contrasenya ara o cliqueu \"{{int:resetpass-submit-cancel}}\" per a restablir-la més endavant.",
     "passwordreset": "Restablir contrasenya",
     "passwordreset-text-one": "Cal completar aquest formulari per reiniciar la contrasenya",
     "passwordreset-text-many": "{{PLURAL:$1|Ompliu un dels camps per a rebre una contrasenya temporal al vostre correu electrònic.}}",
     "revdelete-no-file": "El fitxer especificat no existeix.",
     "revdelete-show-file-confirm": "Esteu segurs que voleu veure una revisió esborrada del fitxer «<nowiki>$1</nowiki>» de $2 a $3?",
     "revdelete-show-file-submit": "Sí",
+    "revdelete-selected-text": "{{PLURAL:$1|Versió seleccionada|Versions seleccionades}} de [[:$2]]:",
+    "revdelete-selected-file": "{{PLURAL:$1|Versió seleccionada|Versions seleccionades}} del fitxer [[:$2]]:",
     "logdelete-selected": "{{PLURAL:$1|Esdeveniment del registre seleccionat|Esdeveniments del registre seleccionats}}:",
+    "revdelete-text-text": "Les versions suprimides encara apareixeran en la pàgina d'historial, però part del seu contingut serà inaccessible al públic.",
+    "revdelete-text-file": "Les versions suprimides encara apareixeran en l'historial del fitxer, però part del seu contingut serà inaccessible al públic.",
+    "logdelete-text": "Els esdeveniments suprimits encara apareixeran en els registres, però part del seu contingut serà inaccessible al públic.",
+    "revdelete-text-others": "Altres administradors del projecte {{SITENAME}} podran accedir al contingut ocult i podran restaurar-lo amb aquesta mateixa interfície, llevat que s'estableixin restriccions addicionals.",
     "revdelete-confirm": "Si us plau, confirmeu que és això el que desitgeu fer, que enteneu les conseqüències, i que esteu fent-ho d'acord amb [[{{MediaWiki:Policy-url}}|les polítiques acordades]].",
     "revdelete-suppress-text": "Les supressions '''només''' han de ser portades a terme en els següents casos:\n* Informació potencialment difamatòria\n* Informació personal inapropiada\n*: ''adreces personals, números de telèfon, números d'identificació nacional, etc.''",
     "revdelete-legend": "Defineix restriccions en la visibilitat",
     "search-file-match": "(coincideix amb el contingut del fitxer)",
     "search-suggest": "Volíeu dir: $1",
     "search-interwiki-caption": "Projectes germans",
-    "search-interwiki-default": "$1 resultats:",
+    "search-interwiki-default": "Resultats de $1:",
     "search-interwiki-more": "(més)",
     "search-relatedarticle": "Relacionat",
     "searcheverything-enable": "Cerca a tots els espais de noms",
     "prefs-skin": "Aparença",
     "skin-preview": "prova",
     "datedefault": "Cap preferència",
-    "prefs-beta": "Característiques beta",
-    "prefs-datetime": "Data i hora",
     "prefs-labs": "Característiques de laboratori",
     "prefs-user-pages": "Pàgines d'usuari",
     "prefs-personal": "Perfil d'usuari",
     "upload-permitted": "Tipus de fitxer permesos: $1.",
     "upload-preferred": "Tipus de fitxer preferits: $1.",
     "upload-prohibited": "Tipus de fitxer prohibits: $1.",
-    "uploadlog": "registre de càrregues",
     "uploadlogpage": "Registre de càrregues",
     "uploadlogpagetext": "A sota hi ha una llista dels fitxers que s'han carregat més recentment.\nVegeu la [[Special:NewFiles|galeria de nous fitxers]] per a una presentació més visual.",
     "filename": "Nom de fitxer",
     "filereuploadsummary": "Canvis al fitxer:",
     "filestatus": "Situació dels drets d'autor:",
     "filesource": "Font:",
-    "uploadedfiles": "Fitxers carregats",
     "ignorewarning": "Ignora qualsevol avís i desa el fitxer igualment",
     "ignorewarnings": "Ignora qualsevol avís",
     "minlength1": "Els noms de fitxer han de ser de com a mínim d'una lletra.",
     "overwroteimage": "ha carregat una nova versió de «[[$1]]»",
     "uploaddisabled": "S'ha inhabilitat la càrrega",
     "copyuploaddisabled": "Càrrega per URL deshabilitada.",
-    "uploadfromurl-queued": "S'ha encuat la vostra càrrega.",
     "uploaddisabledtext": "S'ha inhabilitat la càrrega de fitxers.",
     "php-uploaddisabledtext": "La càrrega de fitxer està desactivada al PHP. Comproveu les opcions del fitxer file_uploads.",
     "uploadscripted": "Aquest fitxer conté codi HTML o de seqüències que pot ser interpretat equivocadament per un navegador.",
     "upload-misc-error": "S'ha produït un error de càrrega desconegut",
     "upload-misc-error-text": "S'ha produït un error desconegut durant la càrrega. Verifiqueu que l'URL és vàlid i accessible, i torneu-ho a provar. Si el problema persisteix, adreceu-vos a un [[Special:ListUsers/sysop|administrador]].",
     "upload-too-many-redirects": "La URL conté massa redireccions",
-    "upload-unknown-size": "Mida desconeguda",
     "upload-http-error": "Ha ocorregut un error HTTP: $1",
     "upload-copy-upload-invalid-domain": "Les càrregues de còpia no són disponibles des d'aquest domini.",
     "backend-fail-stream": "No s'ha pogut transmetre el fitxer $1.",
     "img-auth-streaming": "Lectura corrent de \"$1\".",
     "img-auth-public": "La funció de img_auth.php és de sortida de fitxers d'un lloc wiki privat.\nAquest wiki està configurat com a wiki públic.\nPer seguretat, img_auth.php està desactivat.",
     "img-auth-noread": "L'usuari no té accés a la lectura de \"$1\".",
-    "img-auth-bad-query-string": "La direcció té una cadena de consulta invàlid.",
     "http-invalid-url": "URL incorrecta: $1",
     "http-invalid-scheme": "Les URLs amb l'esquema \"$1\" no són compatibles.",
     "http-request-error": "La petició HTTP ha fallat per un error desconegut.",
     "filehist-dimensions": "Dimensions",
     "filehist-filesize": "Mida del fitxer",
     "filehist-comment": "Comentari",
-    "filehist-missing": "Fitxer que falta",
     "imagelinks": "Ús del fitxer",
     "linkstoimage": "{{PLURAL:$1|La següent pàgina enllaça|Les següents pàgines enllacen}} a aquesta imatge:",
     "linkstoimage-more": "Hi ha més de $1 {{PLURAL:$1|pàgina que enllaça|pàgines que enllaçen}} a aquest fitxer.\nLa següent llista només mostra {{PLURAL:$1|la primera d'elles|les primeres $1 d'aquestes pàgines}}.\nPodeu consultar la [[Special:WhatLinksHere/$2|llista completa]].",
     "download": "baixada",
     "unwatchedpages": "Pàgines desateses",
     "listredirects": "Llista de redireccions",
+    "listduplicatedfiles": "Llista de fitxers amb duplicats",
+    "listduplicatedfiles-summary": "Aquesta és una llista de fitxers on la darrera versió és un duplicat de la darrera versió d'algun altre fitxer. Es consideren només els fitxers locals.",
+    "listduplicatedfiles-entry": "[[:File:$1|$1]] té [[$3|{{PLURAL:$2|un duplicat|$2 duplicats}}]].",
     "unusedtemplates": "Plantilles no utilitzades",
     "unusedtemplatestext": "Aquesta pàgina mostra les pàgines en l'espai de noms {{ns:template}}, que no estan incloses en cap altra pàgina. Recordeu de comprovar les pàgines que hi enllacen abans d'esborrar-les.",
     "unusedtemplateswlh": "altres enllaços",
     "randompage": "Pàgina a l'atzar",
     "randompage-nopages": "No hi ha cap pàgina en {{PLURAL:$2|l'espai de noms següent|els espais de noms següents}}: $1.",
-    "randomincategory": "Pàgina aleatòria en la categoria",
+    "randomincategory": "Pàgina aleatòria en una categoria",
     "randomincategory-invalidcategory": "«$1» no és un nom de categoria vàlid.",
     "randomincategory-nopages": "No hi ha pàgines a la categoria [[:Category:$1|$1]].",
     "randomincategory-selectcategory": "Obté una pàgina a l'atzar de la categoria: $1 $2.",
     "listgrouprights-removegroup-self": "Abandona {{PLURAL:$2|el grup|els grups:}} $1",
     "listgrouprights-addgroup-self-all": "Afegir-se a qualsevol grup",
     "listgrouprights-removegroup-self-all": "Abandona tots els grups",
+    "listgrouprights-namespaceprotection-header": "Restriccions dels espais de noms",
+    "listgrouprights-namespaceprotection-namespace": "Espai de noms",
+    "listgrouprights-namespaceprotection-restrictedto": "Permisos que permeten modificar a l'usuari",
+    "trackingcategories": "Categories de seguiment",
+    "trackingcategories-summary": "Aquesta pàgina llista les categories de seguiment que s'omplen automàticament pel programari MediaWiki. Es poden canviar els seus noms modificant els missatges del sistema corresponents en l'espai de noms {{ns:8}}.",
+    "trackingcategories-msg": "Categoria de seguiment",
+    "trackingcategories-name": "Nom del missatge",
+    "trackingcategories-desc": "Criteris d'inclusió de categoria",
+    "noindex-category-desc": "La pàgina conté una paraula màgica <code><nowiki>__NOINDEX__</nowiki></code> (i és en un espai de noms on està permesa) i per tant no està indexada per robots.",
+    "index-category-desc": "La pàgina conté un <code><nowiki>__INDEX__</nowiki></code> (i és en un espai de noms on està permès) i per tant està indexat per robots quan normalment no ho seria.",
+    "post-expand-template-inclusion-category-desc": "Després d'expandir totes les plantilles, la mida de la pàgina és més gran que <code>$wgMaxArticleSize</code>, per tant algunes plantilles no s'han expandit.",
+    "post-expand-template-argument-category-desc": "Després d'expandir un argument de plantilla (alguna cosa entre claus triples, com <code>{{{Això}}}</code>), la pàgina és més gran que <code>$wgMaxArticleSize</code>.",
+    "expensive-parserfunction-category-desc": "Massa funcions d'analitzador costoses (com <code>#ifexist</code>) incloses en una pàgina. Vegeu [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit Manual:$wgExpensiveParserFunctionLimit].",
+    "broken-file-category-desc": "Categoria afegida si la pàgina conté un enllaç de fitxer trencat (un enllaç per inserir un fitxer quan aquest fitxer no existeix).",
+    "hidden-category-category-desc": "Aquesta és una categoria que conté <code><nowiki>__HIDDENCAT__</nowiki></code>, que impedeix que aparegui en la caixa d'enllaços de categoria a les pàgines, per defecte.",
+    "trackingcategories-nodesc": "Sense descripció disponible.",
+    "trackingcategories-disabled": "La categoria està inhabilitada",
     "mailnologin": "Cap adreça de remitent",
     "mailnologintext": "Heu d'[[Special:UserLogin|iniciar una sessió]] i tenir una adreça electrònica vàlida en les vostres [[Special:Preferences|preferències]] per poder enviar correus a altres usuaris.",
     "emailuser": "Envia un missatge de correu electrònic a aquest usuari",
     "emailuser-title-notarget": "Enviar un correu electrònic a un usuari",
     "emailpage": "Correu electrònic a usuari",
     "emailpagetext": "Podeu usar el següent formulari per a enviar un missatge de correu electrònic a {{GENDER:$1|aquest usuari|aquesta usuària}}.\nL'adreça electrònica que vau indicar a [[Special:Preferences|les vostres preferències d'usuari]] apareixerà com a remitent del correu electrònic, de manera que el destinatari us podrà respondre directament.",
-    "usermailererror": "L'objecte de correu ha retornat un error:",
     "defemailsubject": "Correu electrònic de l'usuari \"$1\" de {{SITENAME}}",
     "usermaildisabled": "Correu electrònic d'usuaris deshabilitat",
     "usermaildisabledtext": "No podeu enviar correus electrònics a altres usuaris en aquest wiki",
     "noemailtitle": "No hi ha cap adreça electrònica",
     "noemailtext": "Aquest usuari no ha especificat una adreça electrònica vàlida.",
-    "nowikiemailtitle": "No es permet el correu electrònic",
     "nowikiemailtext": "Aquest usuari ha escollit no rebre missatges electrònics d'altres usuaris.",
     "emailnotarget": "Nom d'usuari inexistent o no vàlid per al destinatari.",
     "emailtarget": "Introduïu el nom d'usuari del destinatari",
     "nowatchlist": "No teniu cap element en la vostra llista de seguiment.",
     "watchlistanontext": "Premeu $1 per a visualitzar o modificar elements de la vostra llista de seguiment.",
     "watchnologin": "No heu iniciat la sessió",
-    "watchnologintext": "Heu d'[[Special:UserLogin|entrar]]\nper modificar el vostre llistat de seguiment.",
     "addwatch": "Afegeix a llista de seguiment",
     "addedwatchtext": "S'ha afegit la pàgina \"[[:$1]]\" a la vostra [[Special:Watchlist|llista de seguiment]].\nS'hi mostraran els canvis futurs que tinguin lloc en aquesta pàgina i la corresponent discussió.",
     "removewatch": "Treu de la llista de seguiment",
     "unwatchthispage": "Desatén",
     "notanarticle": "No és una pàgina amb contingut",
     "notvisiblerev": "S'ha suprimit la versió",
-    "watchlist-details": "Teniu $1 {{PLURAL:$1|pàgina vigilada|pàgines vigilades}}, sense comptar les pàgines de discussió.",
+    "watchlist-details": "Teniu $1 {{PLURAL:$1|pàgina|pàgines}} a la llista de seguiment, sense comptar les pàgines de discussió.",
     "wlheader-enotif": "La notificació per correu electrònic està habilitada.",
     "wlheader-showupdated": "Les pàgines que s'han canviat des de la vostra darrera visita es mostren en '''negreta'''.",
     "watchmethod-recent": "s'està comprovant si hi ha pàgines vigilades en les edicions recents",
     "watching": "S'està vigilant...",
     "unwatching": "S'està desatenent...",
     "watcherrortext": "S'ha produït un error en canviar els paràmetres de la vostra llista de seguiment de «$1».",
-    "enotif_mailer": "Sistema de notificació per correl de {{SITENAME}}",
     "enotif_reset": "Marca totes les pàgines com a visitades",
     "enotif_impersonal_salutation": "usuari de la {{SITENAME}}",
     "enotif_subject_deleted": "La pàgina $1 de {{SITENAME}} ha estat suprimida per {{gender:$2|$2}}",
     "excontent": "el contingut era: «$1»",
     "excontentauthor": "el contingut era: «$1» (i l'únic coŀlaborador era [[Special:Contributions/$2|$2]])",
     "exbeforeblank": "el contingut abans de buidar era: '$1'",
-    "exblank": "la pàgina estava en blanc",
     "delete-confirm": "Elimina «$1»",
     "delete-legend": "Elimina",
     "historywarning": "'''Atenció:''' La pàgina que esteu a punt d'eliminar té un historial amb $1 {{PLURAL:$1|versió|versions}}, aproximadament:",
     "protect-locked-blocked": "No podeu canviar els nivells de protecció mentre estigueu bloquejats. Ací hi ha els\nparàmetres actuals de la pàgina '''$1''':",
     "protect-locked-dblock": "No poden canviar-se els nivells de protecció a casa d'un bloqueig actiu de la base de dades.\nAcí hi ha els paràmetres actuals de la pàgina '''$1''':",
     "protect-locked-access": "El vostre compte no té permisos per a canviar els nivells de protecció de la pàgina.\nAcí es troben els paràmetres actuals de la pàgina '''$1''':",
-    "protect-cascadeon": "Aquesta pàgina es troba protegida perquè està inclosa en {{PLURAL:$1|la següent pàgina que té|les següents pàgines que tenen}} activada una protecció en cascada. Podeu canviar el nivell de protecció d'aquesta pàgina però això no afectarà la protecció en cascada.",
+    "protect-cascadeon": "Aquesta pàgina es troba protegida actualment perquè està inclosa en {{PLURAL:$1|la següent pàgina que té|les següents pàgines que tenen}} activada una protecció en cascada. \nCanviar el nivell de protecció d'aquesta pàgina no afectarà la protecció en cascada.",
     "protect-default": "Permet tots els usuaris",
     "protect-fallback": "Permetre només a usuaris amb permisos de \"$1\"",
     "protect-level-autoconfirmed": "Permetre només usuaris autoconfirmats",
     "contributions-title": "Contribucions de l'usuari $1",
     "mycontris": "Contribucions",
     "contribsub2": "Per a {{GENDER:$3|$1}} ($2)",
+    "contributions-userdoesnotexist": "El compte d'usuari «$1» no està registrat.",
     "nocontribs": "No s'ha trobat canvis que encaixessin amb aquests criteris.",
     "uctop": "(actual)",
     "month": "Mes (i anteriors):",
     "sp-contributions-newbies-sub": "Per a novells",
     "sp-contributions-newbies-title": "Contribucions dels comptes d'usuari més nous",
     "sp-contributions-blocklog": "Registre de bloquejos",
+    "sp-contributions-suppresslog": "contribucions suprimides de l'usuari",
     "sp-contributions-deleted": "contribucions d'usuari esborrades",
     "sp-contributions-uploads": "pujades",
     "sp-contributions-logs": "registres",
     "sp-contributions-blocked-notice": "En aquests moments, aquest compte d'usuari es troba blocat.\nPer més detalls, la última entrada del registre es mostra a continuació:",
     "sp-contributions-blocked-notice-anon": "En aquests moments, aquesta adreça IP es troba blocada.\nPer més detalls, la última entrada del registre es mostra a continuació:",
     "sp-contributions-search": "Cerca les contribucions",
-    "sp-contributions-suppresslog": "contribucions suprimides de l'usuari",
     "sp-contributions-username": "Adreça IP o nom d'usuari:",
     "sp-contributions-toponly": "Mostra només revisions superiors",
     "sp-contributions-newonly": "Mostra només modificacions que són creacions de pàgina",
     "allmessagesname": "Nom",
     "allmessagesdefault": "Text per defecte",
     "allmessagescurrent": "Text actual",
-    "allmessagestext": "Tot seguit hi ha una llista dels missatges del sistema que es troben a l'espai de noms ''MediaWiki''. La traducció genèrica d'aquests missatges no s'hauria de fer localment sinó a la traducció del programari MediaWiki. Si voleu ajudar-hi visiteu [https://www.mediawiki.org/wiki/Localisation MediaWiki Localisation] i [//translatewiki.net translatewiki.net].",
+    "allmessagestext": "Tot seguit hi ha una llista dels missatges del sistema que es troben a l'espai de noms ''MediaWiki''. La traducció genèrica d'aquests missatges no s'hauria de fer localment sinó a la traducció del programari MediaWiki. Si voleu ajudar-hi visiteu [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation MediaWiki Localisation] i [//translatewiki.net translatewiki.net].",
     "allmessagesnotsupportedDB": "No es pot processar '''{{ns:special}}:Allmessages''' perquè la variable '''$wgUseDatabaseMessages''' està desactivada.",
     "allmessages-filter-legend": "Filtre",
     "allmessages-filter": "Filtra per l'estat de personalització:",
     "importunknownsource": "No es reconeix el tipus de la font d'importació",
     "importcantopen": "No s'ha pogut obrir el fitxer a importar",
     "importbadinterwiki": "Enllaç d'interwiki incorrecte",
-    "importnotext": "Buit o sense text",
     "importsuccess": "Importació completada!",
-    "importhistoryconflict": "Hi ha un conflicte de versions en l'historial (la pàgina podria haver sigut importada abans)",
     "importnosources": "No s'ha definit cap font d'origen interwiki i s'ha inhabilitat la càrrega directa d'una còpia de l'historial",
     "importnofile": "No s'ha pujat cap fitxer d'importació.",
     "importuploaderrorsize": "La càrrega del fitxer d'importació ha fallat. El fitxer és més gran que la mida de càrrega permesa.",
index 5f90778..5b050f0 100644 (file)
@@ -3,7 +3,8 @@
         "authors": [
             "Xiaomingyan",
             "Xqt",
-            "Yejianfei"
+            "Yejianfei",
+            "Hakka"
         ]
     },
     "tog-underline": "下劃綫鏈接",
     "allmessagesname": "名",
     "allmessagesdefault": "默認其消息文字",
     "allmessagescurrent": "現時其文字",
-    "allmessagestext": "茲是敆媒體維基命名空間底裏系統消息其蜀萆單單。\n如果汝卜想貢獻通用其媒體維基本地化服務,請訪問[https://www.mediawiki.org/wiki/Localisation 媒體維基本地化]共[//translatewiki.net translatewiki.net]。",
+    "allmessagestext": "茲是敆媒體維基命名空間底裏系統消息其蜀萆單單。\n如果汝卜想貢獻通用其媒體維基本地化服務,請訪問[https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation 媒體維基本地化]共[//translatewiki.net translatewiki.net]。",
     "allmessagesnotsupportedDB": "茲蜀頁𣍐使其,因為'''$wgUseDatabaseMessages'''已經乞禁止去了。",
     "thumbnail-more": "放大",
     "tooltip-pt-userpage": "汝其用戶頁",
index fbefe03..24de11f 100644 (file)
@@ -9,7 +9,7 @@
             "Умар"
         ]
     },
-    "tog-underline": "Кlел сиз хьака хьажориган:",
+    "tog-underline": "КӀел сиз хьакха хьажорган:",
     "tog-hideminor": "Къайладаха кигийра нисдарш оц могӀама керла хийцамехь",
     "tog-hidepatrolled": "Къайладаха гӀаролладина нисдарш оц могӀама керла нисдаршкахь",
     "tog-newpageshidepatrolled": "Къайлайаха гlароллайина агlонаш оц могlама керла агlонашкахь",
     "hidden-categories": "{{PLURAL:$1|1=Къайлаха категори|Къайлаха йолу категореш}}",
     "hidden-category-category": "Къайлаха йолу категореш",
     "category-subcat-count": "{{PLURAL:$2|ХӀокху категори чохь ю хӀокхуьнан бухара категори.|ХӀокху категори чохь ю $1 {{PLURAL:$1|бухара категори|бухара категореш}} $2 массо нах.}}",
-    "category-subcat-count-limited": "Хlокх категори чохь {{PLURAL:$1|$1 бухар категори|$1 бухар категореш|$1 бухар категореша}}.",
+    "category-subcat-count-limited": "ХӀокх категори чохь {{PLURAL:$1|бухар категори|$1 бухар категореш}} ю.",
     "category-article-count": "{{PLURAL:$2|ХӀокху категори чохь яц цхьа агӀо бе.|{{PLURAL:$1|Гойту $1 агӀо|Гойту $1 агӀонаш}} хӀокху категорешца кху $2.}}",
     "category-article-count-limited": "ХӀокху категори чохь {{PLURAL:$1|$1 агӀо|$1 агӀонаш}} цхьа агӀо бен яц.",
     "category-file-count": "{{PLURAL:$2|ХӀокху категори чохь цхьа файл бе яц.|{{PLURAL:$1|Гойту $1 файл|Гойту $1 файлаш}} хӀокху категорешца кху $2.}}",
     "permalink": "Даиман йолу хьажораг",
     "print": "Зорба тоха",
     "view": "Хьажа",
+    "view-foreign": "Сайтехь $1 хьажа",
     "edit": "Нисъе",
+    "edit-local": "ТӀетоха локальни цуьнах лаьцна",
     "create": "Кхолла",
+    "create-local": "ТӀетоха локальни цуьнах лаьцна",
     "editthispage": "Нисъе хӀъара агӀо",
     "create-this-page": "Кхолла хlара агlо",
     "delete": "ДӀаяккха",
     "deletethispage": "ДӀаяккха хӀара агӀо",
     "undeletethispage": "ХӀара агӀо меттахӀоттор",
-    "undelete_short": "МеттахӀоттайé $1 {{PLURAL:$1|1=нисйинарг|нисйинарш}}",
+    "undelete_short": "МеттахӀоттайé $1 {{PLURAL:$1|нисйинарг|нисйинарш}}",
     "viewdeleted_short": "Хьажар {{PLURAL:$1|$1 дlадаьккхина нийсдар|$1 дlадаьхна нийсдарш|$1 дlадаьхна нийсдарш}}",
     "protect": "Гlаролла дé",
     "protect_change": "хийца",
     "pool-timeout": "Блоктоха еза хан тӀех йаьлла",
     "pool-queuefull": "Дехаршан чоь юьззина ю",
     "pool-errorunknown": "Дойзаш доцу гlалат",
+    "pool-servererror": "Пулан ларар тӀекхочучехь дац ($1).",
     "aboutsite": "{{grammar:genitive|{{SITENAME}}}} лаьцна",
     "aboutpage": "Project:Цуьнах лаьцна",
     "copyright": "Чулацам лело мега $1 лицензица (кхениг билгалйина яцахь).",
     "password-login-forbidden": "Иштта декъашхочун цӀе а пароль а лелаян цамаго.",
     "mailmypassword": "Пароль кхоссар",
     "passwordremindertitle": "Декъашхочун {{grammar:genitive|{{SITENAME}}}}  пароль дагайаийтар",
+    "passwordremindertext": "Цхьам (ахь хила мега IP-адрес $1 тӀера) керла пароль кхоллар дехна {{grammar:genitive|{{SITENAME}}}} ($4) чохь. Декъашхочун $2\nкхоьллина керла хана пароль: $3. Иза дехар ахь динехь,\nсистемин чугӀой хийца пароль.\nХьан керла пароль белх беш хира ю $5 {{PLURAL:$5|дийнахь}}.\n\nХьой дехар дийна дацахь хӀума маде Ӏад бита хӀара хаам.",
     "noemail": "ЦӀе $1 йолу декъашхочун электронан адрес яздина дац.",
     "noemailcreate": "Ахьа нийса электронан почтан адрес дӀаяздан деза",
     "passwordsent": "Керла пароль декъашхочун $1 электронан адрес тӀе дӀахьажина. Дехар до, керла пароль еъча юху системин чугӀо.",
     "eauthentsent": "ДӀаяздинчу электронан адрес тӀе хаам баийтина.\nДаиман хаамаш баийта хааман чохь де бохург дан деза адрес хьай хилар бакъдеш.",
     "throttled-mailpassword": "Пароль дага йоуьйту функци {{PLURAL:$1|тӀехьара $1 сахьтехь}} лелина.\nЗулам цахилийта $1 {{PLURAL:$1|сахьтан чохь}} цӀа бен функци лело йиш яц.",
     "mailerror": "Кехат дохьуьйтуш гӀалат ду: $1",
+    "acct_creation_throttle_hit": "Де-буьйса хена чохь хьа IP-адрес тӀера {{PLURAL:$1|кхоьллина $1 декъашхочун дӀаяздар|кхоьллина $1 декъашхочун дӀаяздарш}} оьцу хана юкъахь кхин дукха дӀаяздарш кхолла магийна дац.\nЦундела и IP-адрес лелочарна кхин керла дӀаяздарш кхолла цало.",
     "emailauthenticated": "Хьан электронан почтан адрес бакъдина $2 $3.",
     "emailnotauthenticated": "Хьан электронан почтан адрес хӀинца а бакъдина дац.\nХаамаш кхоьхьуьйтура бац.",
+    "noemailprefs": "Электронан почтан адрес яздина дац, эл. почтан белхан функцеш дӀаяйина ю.",
     "emailconfirmlink": "Бакъде хьай электронан почтан адрес",
+    "invalidemailaddress": "Электронан почтан адрес тӀелаца йиш яц, цуна формат нийса цахилар бахьнехь.\nДехар до, язъе нийса электронан адрес я и меттиг есса йита.",
+    "cannotchangeemail": "ХӀокху декъашхочун дӀаяздарца долу электронан почтан адресаш хуьйцийла дац хӀокху вики чохь",
     "emaildisabled": "ХӀокху сайтан таро яц электронан почте хаамаш бахьийта.",
     "accountcreated": "Декъашхочун дӀаяздар кхоьллина",
     "accountcreatedtext": "Кхоьллина декъашхочун [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|дийцаре.]]) дӀаяздар.",
     "createaccount-title": "{{SITENAME}}: декъашхочун дӀаяздар кхоллар",
-    "usernamehasherror": "Декъашхочун цӀеран юкъахь хийла ца еза «цаца»",
     "login-throttled": "Хьо дукха гӀиртира.\nДехар до, собар де $1 юха гӀортале.",
     "login-abort-generic": "Сестемин довзийта тарцаделира",
     "loginlanguagelabel": "Мотт: $1",
     "search-error": "Лохуш гӀалат даьлла: $1",
     "preferences": "Гlирс нисбан",
     "mypreferences": "ГӀирс нисбан",
-    "prefs-edits": "Нисдарши дукхалла:",
+    "prefs-edits": "Нисдарийн дукхалла:",
     "prefsnologintext2": "Оьшу $1, гӀирс дӀанисбан.",
     "prefs-skin": "Кечяран тема",
     "skin-preview": "Хьалха муха ю хьажа",
     "datedefault": "Iад йитарца",
-    "prefs-beta": "Бета-таронаш",
-    "prefs-datetime": "Терахь а хан а",
     "prefs-labs": "Муха ю хьажарна таронаш",
     "prefs-user-pages": "Декъашхочун агӀо",
     "prefs-personal": "Долахь болу хаамаш",
     "upload-permitted": "Магийна файлийн тайпанаш: $1.",
     "upload-preferred": "Магийна файлийн тайпанаш: $1.",
     "upload-prohibited": "Магийна доцу файлийн тайпанаш: $1.",
-    "uploadlog": "Чуяхаран тéптар",
     "uploadlogpage": "Чуяхаран тéптар",
     "uploadlogpagetext": "Лахахьа гойтуш бу тӀаьххьара чуяьхна файлийн могӀам.\nИшта хьажа [[Special:NewFiles|керлачу файлийн галерей]].",
     "filename": "Файлан цӀе",
     "filereuploadsummary": "Файлан хийцамаш:",
     "filestatus": "Яржоран хьал:",
     "filesource": "Хьост:",
-    "uploadedfiles": "Чуйаха файлаш",
     "ignorewarning": "ХӀума дац чуяккха файл",
     "ignorewarnings": "ДӀахедар тергал ца дан",
     "badfilename": "Файлан цӀе хийцина → $1.",
     "overwroteimage": "Чуяьккхина файлан керла верси «[[$1]]»",
     "uploaddisabled": "Чуяккхар магийна дац",
     "copyuploaddisabled": "URL тӀера чуяккхар дӀадайина ду.",
-    "uploadfromurl-queued": "Хьа чуяккхар рогӀехь ду.",
     "uploaddisabledtext": "Файлаш чуяхар дӀадайина ду.",
     "uploadscriptednamespace": "ХӀокху SVG-файлан цӀерийн меттиг нийса яц '$1'",
     "upload-source": "ДIайолалун файл",
     "upload-warning-msg": "Чуйоккхуш [$2] гӀалат даьлла. И нисдан юхагӀо [[Special:Upload/stash/$1|upload form]] чу.",
     "upload-proto-error": "Нийса йоцу протокол",
     "upload-file-error": "Чоьхьара гӀалат",
-    "upload-unknown-size": "Хууш доцу барам",
     "upload-http-error": "Даьлла гӀалат HTTP: $1",
     "backend-fail-stream": "ДӀаяккха цатарло файл «$1».",
     "backend-fail-backup": "Таро яц файлан $1 тӀаьхьалонан копиян.",
     "filehist-dimensions": "Файлан барам",
     "filehist-filesize": "Файлан барам",
     "filehist-comment": "Билгалдаккхар",
-    "filehist-missing": "Файл яц",
     "imagelinks": "Файл лелор",
     "linkstoimage": "{{PLURAL:$1|ТӀаьхьайогӀу $1 агӀо тӀетевжина|ТӀаьхьайогӀу $1 агӀонаш тӀетевжина}} хӀокху файлан:",
     "linkstoimage-more": "$1 дукха {{PLURAL:$1|агӀонаш}} чохь лелош ю хӀара файл.\nХӀокху могӀам чохь {{PLURAL:$1|гойтуш ю $1 хьажорг|гойтуш ю $1 хьажоргаш}} хӀокху файланца.\nКхин хьажа йиш ю [[Special:WhatLinksHere/$2|буьззина могӀаме]].",
     "listgrouprights-removegroup": "{{PLURAL:$2|тобан чура дӀабаха|тобанаш чура дӀабаха}} ло: $1",
     "listgrouprights-addgroup-all": "массо тобанийн юкъатоха йиш ю",
     "listgrouprights-removegroup-all": "тобан чура дӀабаха ло",
+    "listgrouprights-namespaceprotection-header": "ЦӀеран анан бехкам",
+    "listgrouprights-namespaceprotection-namespace": "ЦӀерийн ана",
+    "listgrouprights-namespaceprotection-restrictedto": "Декъашхочун хийцамаш бан таро хуьлуьйту бакъонаш",
+    "trackingcategories-msg": "Категореш зер",
+    "expensive-parserfunction-category-desc": "АгӀорахь тӀех дуккха ресурсийн функцеш лелош ю (<code>#ifexist</code> саниш). Мадарра ду — [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit Manual:$wgExpensiveParserFunctionLimit] агӀонгахь.",
     "mailnologintext": "Электронан кехаташ кхехьийта йиш хилийта [[Special:UserLogin|системин чугӀо]] кхин декъашхошка хаамаш кхехьийта хьа [[Special:Preferences|гӀирса чохь]] бакъалла долу электронан почтан адрес хила деза.",
     "emailuser": "Декъашхочун хааман кехат",
     "emailuser-title-target": "Декъашхочунга кехат яздар",
     "unwatchthispage": "ДӀадаккха терго яр",
     "notanarticle": "Бац яззам",
     "notvisiblerev": "Верси дӀаяьккхина хила",
-    "watchlist-details": "Ð¥Ñ\8cан Ñ\82еÑ\80гаме Ð¼Ð¾Ð³Ó\80амÑ\86а $1 {{PLURAL:$1|агÓ\80о|агонаÑ\88}} Ñ\8e, Ð´Ð¸Ð¹Ñ\86аÑ\80е Ð°Ð³Ó\80онаÑ\88а йоцуш.",
+    "watchlist-details": "Ð¥Ñ\8cан Ñ\82еÑ\80гаме Ð¼Ð¾Ð³Ó\80анÑ\86а $1 {{PLURAL:$1|агÓ\80о}} Ñ\8e, Ð´Ð¸Ð¹Ñ\86аÑ\80е Ð°Ð³Ó\80онаÑ\88 йоцуш.",
     "wlheader-enotif": "Электронан почте хаамаш байтар латина ду.",
     "wlheader-showupdated": "Хийцам бина агӀонаш '''Ӏаьржа''' шрифтцан билгальяха ю.",
     "watchlistcontains": "Хьан тергаме могӀам чохь ю $1 {{PLURAL:$1|агӀо|агӀонаш}}.",
     "excontent": "чуьраниг: «$1»",
     "excontentauthor": "чуьраниг: «$1» (дуьххьара кхоьллинарг [[Special:Contributions/$2|$2]])",
     "exbeforeblank": "чуьраниг дlацlанйале хьалха: «$1»",
-    "exblank": "агlо йаьсса йара",
     "delete-confirm": "$1 — дӀаяккхар",
     "delete-legend": "ДӀаяккхар",
     "historywarning": "'''Тергам:''' хӀокху агӀона герггарчу хьесапехь $1 {{PLURAL:$1|версеш|верси|верси}} ю:",
     "revertpage": "Нисдарш [[Special:Contributions/$2|$2]] ([[User talk:$2|дийцаре]]) юха даьхна башхаллийн [[User:$1|$1]]",
     "revertpage-nouser": "Нисдарш (декъашхочун цӀе хьулйина) юхадаьхина башхаллин {{GENDER:$1|[[User:$1|$1]]}}",
     "rollback-success": "Юхадаьхна $1; нисдарш, $2 версен.",
+    "sessionfailure-title": "Сеансан гӀалат",
+    "sessionfailure": "Карара белхан сеансан гӀалат деллачух тера ду;\nиза дешдерг сацийна «сеанс долаерзийтта».\nДехар до, тӀетаӀе «ЮхугӀо» кнопка, кхин агӀо карлаяккха.",
     "protectlogpage": "Гlаролли тептар",
     "protectlogtext": "Лахахь гойту агӀона гӀоралла дарна бина хийцамаш чохь болу тептар.\nХьа кхин йиш ю [[Special:ProtectedPages|хӀинца гӀоралла дина йолу агӀонийн могӀаме хьажа]].",
     "protectedarticle": "гlаролла дина агlо «[[$1]]»",
     "unprotectedarticle": "ГӀоролла дӀадаьстина «[[$1]]»",
     "movedarticleprotection": "«[[$2]]» агӀона тӀера гӀаролла «[[$1]]» агӀона тӀе даьккхина",
     "protect-title": "Оцунна «$1» гӀоралла дар",
-    "prot_1movedto2": "«[[$1]]» цӀе хийцина оцу «[[$2]]»",
+    "prot_1movedto2": "«[[$1]]» цӀе хийцина  «[[$2]]»",
     "protect-legend": "Бакъде гӀоралла дар",
     "protectcomment": "Бахьна:",
     "protectexpiry": "Чекхйолу:",
     "year": "Шерачохь (я хьалхе):",
     "sp-contributions-newbies": "Гайта бекъ къинхьегам, керла дlабазбиначара бина болу",
     "sp-contributions-blocklog": "блоктоьхарш",
+    "sp-contributions-suppresslog": "Декъашхочун дӀабаьккхина къинхьегам",
     "sp-contributions-deleted": "дӀадяхна нийсдарш",
     "sp-contributions-uploads": "Файлаш",
     "sp-contributions-logs": "тéптарш",
     "sp-contributions-blocked-notice": "ХӀара декъашхочун дӀаяздар блоктоьхна ду.\nЛахахь гойту блоктохаршан тептар чура тӀаьхьарлера дӀаяздар:",
     "sp-contributions-blocked-notice-anon": "ХӀара IP-адрес хӀинца блоктоьхна ду.\nЛахахь гойту блоктохаршан тептар чура тӀаьхьарлера дӀаяздар:",
     "sp-contributions-search": "Къинхьегам лахар",
-    "sp-contributions-suppresslog": "Декъашхочун дӀабаьккхина къинхьегам",
     "sp-contributions-username": "IP-адрес я декъашхочун цӀе:",
     "sp-contributions-toponly": "ТӀаьхьара бина хийцамаш гайта",
     "sp-contributions-newonly": "АгӀонаш кхоллар бен ма гайта",
     "nolinkshere": "ХӀокху '''[[:$1]]''' агӀона тӀе кхечу агӀонашкахь хьажорагаш яц.",
     "nolinkshere-ns": "Хаьржинчу анахь яц '''[[:$1]]''' цӀе йолу агӀонаш",
     "isredirect": "агӀо-дӀасахьажайар",
-    "istemplate": "лата йe",
+    "istemplate": "юкъаялийнарш",
     "isimage": "Файлан хьажораг",
     "whatlinkshere-prev": "{{PLURAL:$1|1=хьалхайодарг|хьалхайодарш}} $1",
     "whatlinkshere-next": "{{PLURAL:$1|тlаьхьайогlург|тlаьхьайогlурш|тlаьхьайогlурш}} $1",
     "movepagetalktext": "ТӀе хӀоьттина йолу дийцаре агӀо ишта цӀе хийцина хира ю, '''цхьа йолу ханчохь, маца:'''\n\n*Йаьсса йоцу дийцаре агӀо йолуш ю оцу цӀарца йа\n*Ахьа къастаман харжам цабиняхь а къастам хӀотточехь.\n\nИшта чу ханчохь, ахьа дехьа яккха йезар ю йа куьйга хӀоттайар, нагахь иза хьашт йалахь.",
     "movearticle": "Цle хийца хlокху агlон",
     "moveuserpage-warning": "'''Тергам бе.''' Хьо декъашхочун агӀона цӀе хийца гӀерта. Дехар до, тергам бе, декъашхочун агӀона цӀе бен хийца лур яц, декъашхочун дӀаяздаран цӀе хийца лур яц.",
+    "movenologintext": "АгӀона цӀе хийца [[Special:UserLogin|системин чугӀо]].",
+    "movenotallowed": "Хьан бакъо яц керла агӀонаш кхолла.",
+    "movenotallowedfile": "Хьан файлийн цӀераш хийца бакъо яц.",
+    "cant-move-user-page": "Хьан бакъо яц декъашхойн коьрта агӀонийн цӀераш хийца.",
+    "cant-move-to-user-page": "Хьан бакъо яц агӀона цӀе декъашхочун агӀон тӀе хийца (бухара агӀон тӀе хийца мега).",
     "newtitle": "Керла цlе",
     "move-watch": "Латайé хӀара агӀо тергаме могӀанан юкъахь",
     "movepagebtn": "АгӀон цӀе хийца",
     "allmessagesname": "Хаам",
     "allmessagesdefault": "Ӏад дитарца йоза",
     "allmessagescurrent": "Карарчу хенан йоза",
-    "allmessagestext": "ХӀара «MediaWiki» цӀерийн меттигера системан хаамийн могӀа бу.\nХьайна MediaWiki тая лууш делахь, дехар до, проект [//translatewiki.net translatewiki.net] [https://www.mediawiki.org/wiki/Localisation юьйцучу хьажа].",
+    "allmessagestext": "ХӀара «MediaWiki» цӀерийн меттигера системан хаамийн могӀа бу.\nХьайна MediaWiki тая лууш делахь, дехар до, проект [//translatewiki.net translatewiki.net] [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation юьйцучу хьажа].",
     "allmessagesnotsupportedDB": "'''$wgUseDatabaseMessages''' дӀаяйина хилар бахьнехь хӀара агӀо дӀачӀаьгӀна ю.",
     "allmessages-filter-legend": "Литтар",
     "allmessages-filter": "Литтар оцу хьола хийцамца:",
     "thumbnail_error_remote": "ГӀалатах хаам $1:\n$2",
     "import": "АгӀонаш чуяхар",
     "import-interwiki-source": "Вики-хьост/агlо:",
-    "import-interwiki-templates": "Ð\9bаÑ\82а Ð´Ðµ массо кепаш",
+    "import-interwiki-templates": "ЮкÑ\8aайиÑ\85ка массо кепаш",
     "import-interwiki-submit": "Импорт ян",
     "import-upload-filename": "Файлан цӀе:",
     "import-comment": "Билгалдаккхар:",
     "imported-log-entries": "{{PLURAL:$1|Тептар чура импорт дина $1 дӀаяздар|Тептар чура импорт дина $1 дӀаяздарш}}.",
     "importfailed": "Импорт ян цаелира: $1",
     "importnosources": "Юкъаравики-импортан хьост хаьржина яцара, дуьхьала хийцамашан истори чуяккхар дӀадайина ду.",
+    "import-noarticle": "Импорт ян агӀонаш яц!",
+    "xml-error-string": "$1 $2 могӀан чохь, позицеш $3 (байт $4): $5",
+    "import-upload": "Чуяха XML-хаамаш",
+    "import-token-mismatch": "Сеансан хаамаш дӀадайна. Дехар до, юху гӀорта.",
+    "import-invalid-interwiki": "Билгалйина вики чура импорт ян йиш яц.",
     "import-error-special": "«$1» агӀо импорт йина яц, и къастина цӀерийн меттигашан юкъайогӀуш хиларна.",
     "importlogpage": "Импортан тептар",
     "importlogpagetext": "Куьйгалхоша агӀонаш импорт яр царна бина хийцамашца кхечу википедеш чура.",
     "tooltip-ca-nstab-image": "Хlуман агlо",
     "tooltip-ca-nstab-mediawiki": "Хааман агlо MediaWiki",
     "tooltip-ca-nstab-template": "Куцкепа агlо",
+    "tooltip-ca-nstab-help": "ГӀоьна агӀо",
     "tooltip-ca-nstab-category": "Категорешан агӀо",
     "tooltip-minoredit": "Къастам бé хlокху хийцамна кlеззиг боуш санна",
     "tooltip-save": "Хьан хийцамаш lалашбой",
     "tooltip-diff": "Гайта долуш долу йозанах бина болу хийцам.",
     "tooltip-compareselectedversions": "Хlокху шина хаьржина агlона башхо муха ю хьажа.",
     "tooltip-watch": "ТӀетоха хӀара агӀо сан тергаме могӀанан юкъа",
+    "tooltip-watchlistedit-normal-submit": "Билгалйина цӀераш дӀаяха",
     "tooltip-watchlistedit-raw-submit": "Тергаме могӀам карлабаккха",
+    "tooltip-recreate": "АгӀо дӀаяьккхина хиларе ца хьоьжуш меттахӀоттае агӀо",
     "tooltip-upload": "Доладе чуяккхар",
     "tooltip-rollback": "Цхьоз тlетаlийча дlабаккха кхечо бина болу тlаьххьара хийцам",
     "tooltip-undo": "ДӀабаккха бина болу хийцам а хьалхьажар гойтуш, дӀаяккхарна бахьна гайта аьтту беш",
+    "tooltip-preferences-save": "ГӀирс нисбар Ӏалашде",
     "tooltip-summary": "Язъе йоца цӀе",
     "common.css": "/** Чуйиллина йолу кхузе CSS хир ю лелош масхьа кечйечу чохь */",
     "monobook.css": "/* Чуйиллина йолу кхузе CSS хир ю лелош масхьа Monobook чохь */",
     "spamprotectiontitle": "Совбиларна литтар",
     "spamprotectiontext": "Хьо дӀаязъян гӀерта агӀо спам-литтаро дӀакъоьвлина.\nЦуна бахьна хила там бу агӀона чохь зулам литтаран чутоьхна йолу хьажораг хилар.",
     "spambot_username": "Спам дӀацӀаняр",
+    "pageinfo-title": "Хаамаш цу «$1»",
+    "pageinfo-not-current": "Шира версийн оьцу хааме хьажа таро яц.",
     "pageinfo-header-basic": "Коьрта хаам",
     "pageinfo-header-edits": "Хийцаман истори",
     "pageinfo-header-restrictions": "АгӀона гӀоралла дар",
     "pageinfo-header-properties": "АгӀона билгало",
     "pageinfo-display-title": "Гушболу корта",
+    "pageinfo-default-sort": "Къасторан догӀа Ӏад йитарца",
     "pageinfo-length": "АгӀона йохалла (байташкахь)",
     "pageinfo-article-id": "АгӀона ID",
     "pageinfo-language": "АгӀона мотт",
     "pageinfo-views": "Хьажаран дукхалла",
     "pageinfo-watchers": "Хьоьжучера дукхалла",
     "pageinfo-few-watchers": "{{PLURAL:$1|ТӀаьхьадогӀучерал}} $1 кӀезиг",
+    "pageinfo-redirects-name": "ХӀокху агӀон тӀе йолу дӀассахьажорийн дукхалла",
+    "pageinfo-subpages-name": "ХӀокху агӀона бухара агӀонаш",
+    "pageinfo-subpages-value": "$1 ($2 {{PLURAL:$2|цӀе хийцар|цӀе хийцарш}}; $3 {{PLURAL:$3|гуттар хуьлург|гуттар хуьлурш}})",
     "pageinfo-firstuser": "АгӀо кхуллург",
     "pageinfo-firsttime": "АгӀо кхоьллина терахь",
     "pageinfo-lastuser": "ТӀеххьара тадар дийнарг",
     "pageinfo-lasttime": "ТӀеххьара нисдар дина терахь",
     "pageinfo-edits": "Массо нисдарийн дукхалла",
     "pageinfo-authors": "Башха авторийн дукхалла",
+    "pageinfo-recent-edits": "ТӀехьарчу хана нисдарш ($1 хана)",
+    "pageinfo-magic-words": "{{PLURAL:$1|Бозбуунчаллин дош|Бозбуунчаллин дешнаш}} ($1)",
+    "pageinfo-hidden-categories": "{{PLURAL:$1|Къайла категори|Къайла категореш}} ($1)",
+    "pageinfo-templates": "{{PLURAL:$1|1=Кеп|Кепаш}} ($1)",
+    "pageinfo-transclusions": "{{PLURAL:$1|1=Юкъатохало агӀо|Юкъатохало агӀонаш}} ($1)",
     "pageinfo-toolboxlink": "Агlонах болу бовзам",
     "pageinfo-redirectsto": "ДӀасахьажорг",
     "pageinfo-redirectsto-info": "Хаам",
     "pageinfo-protect-cascading-yes": "ХӀаъ",
     "pageinfo-protect-cascading-from": "Чахчарин гӀоралла тӀера",
     "pageinfo-category-info": "Категорех лаьцна хаам",
+    "pageinfo-category-pages": "АгӀонийн дукхалла",
+    "pageinfo-category-subcats": "Бухара категорийн дукхалла",
+    "pageinfo-category-files": "Файлийн дукхалла",
     "skinname-cologneblue": "Кёльнин сингаттам",
     "skinname-modern": "Кхузаманан",
     "skinname-vector": "Векторни",
+    "markaspatrolleddiff": "Билгалйе теллина санна",
     "markaspatrolledtext": "Билгала йе хӀара агӀо хьаьжна сана",
+    "markedaspatrolled": "ДӀадахка теллина санна хилар",
+    "markedaspatrolledtext": "Хаьржина [[:$1]] агӀона верси къобалйина сана билгалйина.",
+    "rcpatroldisabled": "ТӀехьара бина хийцамаш къобалбан магийна дац",
+    "rcpatroldisabledtext": "ТӀехьара бина хийцамаш къобалбар хӀинца дӀадайина ду.",
+    "markedaspatrollederror": "теллина сана билгалъян цало",
     "markedaspatrollednotify": "АгӀо «$1» пайдане хилар билгалдина",
     "patrol-log-page": "ТӀехьажаран тептар",
     "patrol-log-header": "Хьажжина версеш йолу тептар.",
     "show-big-image-preview": "Барам хьажале: $1.",
     "show-big-image-other": "{{PLURAL:$2|1=Кхин шоралла|Кхин шоралла}}: $1.",
     "show-big-image-size": "$1 × $2 пиксель",
+    "file-info-gif-frames": "$1 {{PLURAL:$1|фрейм|фреймаш}}",
+    "file-info-png-repeat": "локху $1 {{PLURAL:$1|за}}",
+    "file-info-png-frames": "$1 {{PLURAL:$1|кадр|кадраш}}",
     "newimages": "Керлачу файлийн галерей",
     "newimages-summary": "ХӀокху белхан агӀона чохь гойтуш ю дукха хан йоццуш чуйаьхна файлаш.",
     "newimages-legend": "Литтар",
     "exif-colorspace": "Беснашан хьал",
     "exif-componentsconfiguration": "Бесара компонентин конфигураци",
     "exif-compressedbitsperpixel": "Бесан кIоргалла дацдина чул тӀехьа",
+    "exif-pixelydimension": "Суьртан шоралла",
     "exif-pixelxdimension": "Суьртан локхалла",
     "exif-datetimeoriginal": "Дуьххьарлера терахь а хан",
     "exif-datetimedigitized": "Оцифровк йина терахь а хан а",
     "table_pager_limit_submit": "Кхочушдé",
     "table_pager_empty": "Цакарийна",
     "autosumm-blank": "Агӏон чулацам дӏабяккхина",
-    "autosumm-replace": "АгӀона чуьраниг хийцина оцу «$1»",
+    "autosumm-replace": "АгӀона чуьраниг хийцина  «$1»",
     "autoredircomment": "ДӀасахьажийна цуна [[$1]] тӏе",
     "autosumm-new": "Керла агlо: «$1»",
     "livepreview-loading": "Чуйолуш…",
     "version-software-version": "Верси",
     "version-entrypoints": "ЧугӀо адресин тӀадамаш",
     "version-entrypoints-header-entrypoint": "Яздаран тӀадам",
-    "version-entrypoints-articlepath": "[https://www.mediawiki.org/wiki/Manual:$wgArticlePath АгӀона тӀе некъ]",
-    "version-entrypoints-scriptpath": "[https://www.mediawiki.org/wiki/Manual:$wgScriptPath Скриптан тӀе некъ]",
+    "version-entrypoints-articlepath": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgArticlePath АгӀона тӀе некъ]",
+    "version-entrypoints-scriptpath": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgScriptPath Скриптан тӀе некъ]",
     "redirect": "Декъашхочун файлан тӀера дӀасхьажор",
     "redirect-legend": "Файлан я агӀона тӀера дӀасхьажор",
     "redirect-summary": "ХӀара агӀо лело йиш ю файлан я агӀона тӀера дӀасхьажош.",
     "revdelete-unrestricted": "куьйгалхойн доза тохар дӀаяьккхина",
     "logentry-move-move": "$1 {{GENDER:$2|цӀе хийцина}} $3 → $4",
     "logentry-move-move-noredirect": "$1 {{GENDER:$2|цӀе хийцина}} $3 → $4 дӀасахьажийнарг цаюьтуш",
-    "logentry-move-move_redir": "$1 {{GENDER:$2|цӀе хийцина|цӀе хийцина}} $3 оцу $4 дӀасахьажоран тӀохул",
-    "logentry-move-move_redir-noredirect": "$1 {{GENDER:$2|цӀе хийцина|цӀе хийцина}} $3 оцу $4 дӀасахьажоран тӀохул а дӀасахьажийнарг цаюьтуш а",
+    "logentry-move-move_redir": "$1 {{GENDER:$2|цӀе хийцина}} $3 → $4 дӀасахьажоран тӀохул",
+    "logentry-move-move_redir-noredirect": "$1 {{GENDER:$2|цӀе хийцина}} $3 → $4 дӀасахьажоран тӀохул а дӀасахьажийнарг цаюьтуш а",
     "logentry-patrol-patrol-auto": "$1 автоматически {{GENDER:$2|хьаьжина}} $3 агӀона версега $4",
     "logentry-newusers-newusers": "{{GENDER:$2|ДӀавазвелла|ДӀаязелла}} керла декъашхо $1",
     "logentry-newusers-create": "{{GENDER:$2|ДӀавазвелла|ДӀаязелла}} керла декъашхо $1",
index b89cda9..c72c3df 100644 (file)
@@ -19,7 +19,7 @@
     "tog-hidepatrolled": "لە دوایین گۆڕانکارییەکاندا دەستکارییە پاس دراوەکان بشارەوە",
     "tog-newpageshidepatrolled": "لە پێرستی پەڕە نوێکاندا پەڕە پاس دراوەکان بشارەوە",
     "tog-extendwatchlist": "لیستی چاودێری درێژبکەرەوە بۆ نیشان دانی ھەموو گۆڕانکارییەکان، نەک تەنھا دوایینەکان.",
-    "tog-usenewrc": "Ú¯Û\86Ú\95اÙ\86کارÛ\8cÛ\8cÛ\95کاÙ\86 Ù\84Û\95 Ø¯Ù\88اÛ\8cÛ\8cÙ\86 Ú¯Û\86Ú\95اÙ\86کارÛ\8cÛ\8cÛ\95کاÙ\86 Ù\88 Ù\84Û\8cستÛ\8c Ú\86اÙ\88دÛ\8eرÛ\8cدا Ø¨Û\95 Ù¾Û\8eÛ\8c Ù¾Û\95Ú\95Û\95 Ù¾Û\86Ù\84Û\8eÙ\86 Ø¨Ú©Û\95 (Ù¾Û\8eÙ\88Û\8cستÛ\8c Ø¨Û\95 Ø¬Ø§Ú¤Ø§Ø³Ú©Ø±Û\8cپتÛ\95)",
+    "tog-usenewrc": "Ú¯Û\86Ú\95اÙ\86کارÛ\8cÛ\8cÛ\95کاÙ\86 Ù\84Û\95 Ø¯Ù\88اÛ\8cÛ\8cÙ\86 Ú¯Û\86Ú\95اÙ\86کارÛ\8cÛ\8cÛ\95کاÙ\86 Ù\88 Ù¾Û\8eرستÛ\8c Ú\86اÙ\88دÛ\8eرÛ\8cدا Ø¨Û\95Ù¾Û\8eÛ\8c Ù¾Û\95Ú\95Û\95 Ù¾Û\86Ù\84Û\8eÙ\86 Ø¨Ú©Û\95",
     "tog-numberheadings": "ژمارەکردنی خۆگەڕی سەردێڕەکان",
     "tog-showtoolbar": "تووڵامرازی دەستکاری نیشان بدە",
     "tog-editondblclick": "دەستکاریی پەڕە بە دووکرتە",
     "pool-errorunknown": "هەڵەی نەزانراو",
     "aboutsite": "سەبارەت بە {{SITENAME}}",
     "aboutpage": "Project:سەبارەت",
-    "copyright": "ناوەرۆک لە ژێر $1 لەبەردەستدایە، دەنا تێبینیی دەکرا",
+    "copyright": "ناوەرۆک لە ژێر $1 لەبەردەستدایە، مەگەر بێجگە لەمە وترابێ.",
     "copyrightpage": "{{ns:project}}:مافەکانی لەبەرگرتنەوە",
     "currentevents": "ڕووداوە ھەنووکەییەکان",
     "currentevents-url": "Project:ڕووداوە بەردەوامەکان",
     "mypreferencesprotected": "دەسەڵاتی دەستکارییکردنی هەڵبژاردنەکانی خۆتت نییە.",
     "ns-specialprotected": "تۆ ناتوانی لاپەڕە تایبەتەکان دەستکاریی بکەی.",
     "titleprotected": "ئەم سەرناوە پارێزراوە لە دروستکران لە لایەن [[User:$1|$1]].\nھۆکاری ئەمە بریتیە لە \"''$2''\".",
-    "invalidtitle-knownnamespace": "سÛ\95ردÛ\8eÚ\95Û\8c Ù\87Û\95ÚµÛ\95 Ù\84Û\95Ú¯Û\95Úµ Ù\86اÙ\88Û\95بÛ\86شاÛ\8cÛ\8c \"$2\" Ù\88 Ø¯Û\95Ù\82Û\8c \"$3\"",
+    "invalidtitle-knownnamespace": "سÛ\95ردÛ\8eÚ\95Û\8c Ù\86ادرÙ\88ست Ø¨Û\95 Ø¨Û\86شاÛ\8cÛ\8c Ù\86اÙ\88Û\8c Â«$2» Ù\88 Ø¯Û\95Ù\82Û\8c Â«$3»",
     "invalidtitle-unknownnamespace": "سەردێڕی هەڵە لەگەڵ ناوەبۆشایی نەناسراوی ژمارە $1 و دەقی \"$2\"",
     "exception-nologin": "لەژوورەوە نیت",
     "exception-nologin-text": "تکایە [[Special:Userlogin|بچۆ ژوورەوە]] تا بتوانیت بچیتە نێو ئەم پەڕەیە یان ئەم کردەیە ئەنجام بدەیت.",
     "virus-badscanner": "پێکەربەندیی نابەجێ: ڤایرس سکەنێری نەناسراو: ''$1''",
     "virus-scanfailed": "سکەن ئەنجام نەدرا(کۆد $1)",
     "virus-unknownscanner": "دژەڤایرس نەناسراوە:",
-    "logouttext": "'''تÛ\86 Ø¦Û\8eستا Ù\84Û\95دÛ\95رÛ\95Ù\88Û\95Û\8cت.'''\n\nتÛ\8eبÛ\8cÙ\86Û\8cÛ\8c Ø¦Û\95Ù\88Û\95 Ø¨Ú©Û\95 Ú©Û\95 Ù\87Û\95Ù\86دÛ\8eÚ© Ù\84Û\95 Ù¾Û\95Ú\95Û\95کاÙ\86 Ø¨Û\95ردÛ\95Ù\88اÙ\85 Ù\88ا Ø¯Û\95ردÛ\95Ú©Û\95Ù\88Ù\86 Ú©Û\95 Ù\87Û\8eشتا Ù\84Û\95Ú\98Ù\88Ù\88رÛ\95Ù\88Û\95 Ø¨Û\8cتØ\8c Ù\87Û\95تا Ø¦Û\95Ù\88 Ø¯Û\95Ù\85Û\95Û\8c Ú©Û\95Ø´Û\8c Ù\88Û\8eبگÛ\95Ú\95Û\95Ú©Û\95ت Ù¾Ø§Ú© Ø¯Û\95Ú©Û\95Û\8cتÛ\95Ù\88Û\95.",
+    "logouttext": "'''ئÛ\8eستا Ú\86Ù\88Ù\88Û\8cتÛ\95 Ø¯Û\95رÛ\95Ù\88Û\95.'''\n\nئاگادار Ø¨Û\95 Ú¾Û\95تا Ø¦Û\95Ù\88 Ú©Ø§ØªÛ\95Û\8c Ú©Û\95Ø´Û\8c Ù\88Û\8eبگÛ\95Ú\95Û\95Ú©Û\95ت Ù¾Ø§Ú© Ø¯Û\95Ú©Û\95Û\8cتÛ\95Ù\88Û\95Ø\8c Ù\84Û\95Ù\88اÙ\86Û\95Û\8cÛ\95 Ú¾Û\95Ù\86دÛ\8eÚ© Ù\84Û\95 Ù¾Û\95Ú\95Û\95کاÙ\86 Ù\88ا Ù¾Û\8eشاÙ\86 Ø¨Ø¯Ø±Û\8eÙ\86 Ú©Û\95 Ú¾Û\8eشتا Ù\84Û\95 Ú\98Ù\88Ù\88رÛ\95Ù\88Û\95 Ø¨Û\8cت.",
     "welcomeuser": "بەخێربێیت، $1!",
     "welcomecreation-msg": "ھەژمارەکەت دروست کرا.\nلە بیرت نەچێت [[Special:Preferences|ھەڵبژاردەکانی {{SITENAME}}]]ت بگۆڕی.",
     "yourname": "ناوی بەکارھێنەری:",
     "gotaccount": "ھەژمارت ھەیە لێرە؟ $1.",
     "gotaccountlink": "بچۆ ژوورەوە",
     "userlogin-resetlink": "وردەکارییەکانی چوونەژوورەوەتت لە بیر کردووە؟",
-    "userlogin-resetpassword-link": "تێپەڕەووشەکەت لەبیر کردووە؟",
+    "userlogin-resetpassword-link": "تێپەڕوشەکەت بیر کردووە؟",
     "userlogin-helplink2": "یارمەتی بۆ چوونەژوورەوە",
     "userlogin-loggedin": "تۆ ھەر ئێستا بە ناوی {{GENDER:$1|$1}} چوویتە ژوورەوە.\nفۆرمی ژێرەوە بەکاربھێنە بۆ چوونەژوورەوە وەک بەکارھێنەرێکی تر.",
     "userlogin-createanother": "ھەژمارێکی تر دروست بکە",
     "createacct-emailoptional": "ناونیشانی ئیمەیل (دڵخوازانە)",
     "createacct-email-ph": "ناونیشانی ئیمەیلەکەت بنووسە",
     "createacct-another-email-ph": "ناونیشانی ئیمەیڵەکەت بنووسە",
-    "createaccountmail": "تێپەڕوشەیەکی هەڕەمەکیی کاتی بەکاربھێنە و بینێرە بۆ ناونیشانی ئیمەیڵی دیاریکراو",
+    "createaccountmail": "تێپەڕوشەیەکی ھەڕەمەکیی کاتی بەکاربھێنە و بینێرە بۆ ناونیشانی ئیمەیلی دیاریکراو",
     "createacct-realname": "ناوی ڕاستی (دڵخوازانە)",
     "createaccountreason": "هۆکار:",
     "createacct-reason": "ھۆکار",
     "passwordsent": "تێپەڕوشەیەکی نوێ ناردرا بۆ ئەدرەسی ئیمەیلی تۆمارکراوی «$1».\nتکایە دوای وەرگرتنی دیسان بچۆ ژوورەوە.",
     "blocked-mailpassword": "ئادرەسی ئای‌پی تۆ بۆ دەستکاری کردن بەستراوه بۆیە بۆ بەرگری لە بەکارهێنانی نابەجێ ئەنجامی گەڕانەوەی تێپەڕوشە ڕیگە نەدراوە.",
     "eauthentsent": "ئیمەیلێکی پشتڕاستکردنەوە بۆ ناونیشانی ئیمەیلی دیاریکراو ناردرا.\nپێش ئەوەی ئیمەیلی تر بۆ ئەم هەژمارە بنێردرێ، بۆ پشتڕاستکردنەوەی ئەمەی ئەم هەژمارە بەڕاستی ھی تۆیە، دەبێ پەیڕەوی ڕێکارەکانی ناو ئیمەیلەکە بکەیت.",
-    "throttled-mailpassword": "نامەی بەدەستهێنانەوەی تێپەڕەووشە نێردراوە لە ماوەی {{PLURAL:$1|کاتژمێر}}ی ڕابردوودا.\nبۆ ڕێگریی لە بەکارهێنانی خراپ، تاکە یەک نامەی بەدەستهێنانەوەی تێپەڕەووشە هەموو {{PLURAL:$1|کاتژمێر}}ێک دەنێردرێت.",
+    "throttled-mailpassword": "ئیمەیلێکی ڕیکخستنەوەی تێپەڕوشە لە ماوەی {{PLURAL:$1|ساعەت}}ی ڕابردوودا نێردراوە.\nبۆ ڕێگری لە بەکارھێنانی خراپ، ھەر {{PLURAL:$1|ساعەت}} تاکە یەک ئیمەیلی ڕیکخستنەوەی تێپەڕوشە دەنێردرێت.",
     "mailerror": "هەڵە ڕوویدا لە ناردنی ئیمەیل: $1",
     "acct_creation_throttle_hit": "بینەرانی ویکی بەکەڵک وەرگرتن لەم ئای‌پی ئەدرەسەی تۆ لە ڕۆژانی ڕابردوودا، دەستیان کردە بە درووست‌کردنی {{PLURAL:$1|هەژمارە}}، کە زۆرینە ڕیگەپێدان لە یەک ماوە‌دایە.\nوەک ئەنجامی ئەو ڕووداوە، ئەو بینەرانی لەم ئای‌پی ئەدرەسە کەڵک وەر دەگرن لەم کاتەدا ناتوانن هەژماری دیکە درووست‌بکەن.",
     "emailauthenticated": "ناونیشانی ئیمەیلەکەت پشتڕاست کرایەوە لە $3ی $2دا.",
     "login-throttled": "ژمارەیەکی زۆر هەوڵت داوە بۆ چوونە ژوورەوە.\nتکایە پێش هەوڵی دووبارە، نەختێک بوەستە.",
     "loginlanguagelabel": "زمان: $1",
     "pt-login": "بچۆ ژوورەوە",
+    "pt-login-button": "بچۆ ژوورەوە",
     "pt-createaccount": "ھەژمار دروست بکە",
     "pt-userlogout": "بچۆ دەرەوە",
     "changepassword": "تێپەڕوشە بگۆڕە",
     "newpassword": "تێپەڕوشەی نوێ:",
     "retypenew": "تێپەڕوشەی نوێ دوبارە بنووسەوە:",
     "resetpass_submit": "تێپەڕوشە رێکخە و بچۆ ژوورەوە",
-    "changepassword-success": "تێپەروشەکەت بە سەرکەوتوویی گۆڕدرا. ئێستا چوونە ژوورەوەت...",
+    "changepassword-success": "تێپەروشەکەت بە سەرکەوتوویی گۆڕدرا!",
     "resetpass_forbidden": "تێپەڕوشەکە ناگۆڕدرێت",
     "resetpass-no-info": "بۆ گەیشتنی راستەوخۆ بەم پەڕە ئەشێ بچیتە ژوورەوە.",
     "resetpass-submit-loggedin": "تێپەڕوشە بگۆڕە",
     "prefs-skin": "پێستە",
     "skin-preview": "پێش بینین",
     "datedefault": "ھەڵنەبژێردراو",
-    "prefs-beta": "تایبەتمەندییەکانی بیتا",
-    "prefs-datetime": "کات و ڕێکەوت",
     "prefs-labs": "کەرەسەکانی تاقیگەکان",
     "prefs-user-pages": "پەڕە بەکارھێنەرییەکان",
     "prefs-personal": "پرۆفایلی بەکارھێنەر",
     "recentchangescount": "ژمارەی گۆڕانکارییەکان کە نیشان ئەدرێن لە حاڵەتی دیفاڵت:",
     "prefs-help-recentchangescount": "ئەمە دوایین گۆڕانکارییەکان، مێژووی پەڕەکان و لۆگەکانیش لەبەردەگرێت.",
     "savedprefs": "ھەڵبژاردەکانت پاشەکەوت کران",
-    "timezonelegend": "ناوچەکات:",
-    "localtime": "کاتی ناوچەیی:",
+    "timezonelegend": "ناوچەی کاتی:",
+    "localtime": "کاتی خۆماڵی:",
     "timezoneuseserverdefault": "دیفاڵتی ویکی بەکاربێنە ($1)",
     "timezoneuseoffset": "دیکە (ناتەواویەکان دیاری بکە)",
     "servertime": "کاتی ڕاژەکار:",
     "prefs-custom-js": "JSی دڵخواز",
     "prefs-common-css-js": "سی‌ئێس‌ئێس/جاڤاسکریپتی ھاوبەش بۆ گشت پێستەکان:",
     "prefs-reset-intro": "دەتوانی لەم لاپەڕە بۆ گەڕانەوەی هەڵبژاردەکانت بۆ بنچینەیی ماڵپەر کەڵک وەرگریت.\nگەر ئەوە بکەی ئیتر گۆڕانەکەت ناگەڕێتەوە.",
-    "prefs-emailconfirm-label": "پشتڕاست کردنەوەی ئیمەیل:",
+    "prefs-emailconfirm-label": "پشتڕاستکردنەوەی ئیمەیل:",
     "youremail": "ئیمەیل:",
     "username": "{{GENDER:$1|ناوی به‌کارھێنەر}}:",
     "uid": "پێناسەی {{GENDER:$1|به‌کارھێنەر}}:",
     "prefs-help-email-others": "ھەروەھا دەتوانی ھەڵبژێری کە بەکارھێنەرانی دیکە لە ڕێگەی پەڕەی بەکارھێنەرییەکەت یان لێدوانەکەت بێ ئاشکراکردنی کەسایەتیت پێوەندیت لەگەڵ بگرن.",
     "prefs-help-email-required": "ناونیشانی ئیمەیل پێویستە.",
     "prefs-info": "زانیاریی سەرەتایی",
-    "prefs-i18n": "نێونەتەویی کردن",
+    "prefs-i18n": "نێونەتەوییکردن",
     "prefs-signature": "واژوو",
     "prefs-dateformat": "ڕازاندنەوەی ڕێکەوت",
     "prefs-timeoffset": "قەرەبووکەری کات",
     "prefs-advancedediting": "ھەڵبژاردە گشتییەکان",
+    "prefs-editor": "دەستکاریکەر",
+    "prefs-preview": "پێشبینین",
     "prefs-advancedrc": "ھەڵبژاردەکانی پێشکەوتوو",
     "prefs-advancedrendering": "هەڵبژاردە پێشکەوتووەکان",
     "prefs-advancedsearchoptions": "هەڵبژاردە پێشکەوتووەکان",
     "prefs-displayrc": "ھەڵبژاردەکانی نیشاندان",
     "prefs-displaysearchoptions": "ھەڵبژاردەکانی نیشاندان",
     "prefs-displaywatchlist": "ھەڵبژاردەکانی نیشاندان",
+    "prefs-tokenwatchlist": "نیشانە",
     "prefs-diffs": "جیاوازییەکان",
     "email-address-validity-valid": "ناونیشانی ئیمەیل دروست وە بەر چاو دێت",
     "email-address-validity-invalid": "ناونیشانێکی دروستی ئیمەیل بنووسە",
     "group-user": "بەکارهێنەران",
     "group-autoconfirmed": "بەکارھێنەرانی پەسندکراوی خۆگەڕ",
     "group-bot": "بۆتەکان",
-    "group-sysop": "بەڕێوبەران",
+    "group-sysop": "بەڕێوەبەران",
     "group-bureaucrat": "بیوروکراتەکان",
     "group-suppress": "چاودێرەکان",
     "group-all": "(ھەموو)",
     "action-userrights-interwiki": "دەستکاری مافەکانی بەکارهێنەریی بەکارهێنەران لە ویکی‌یەکانی دیکە‌دا",
     "action-siteadmin": "داخستن یا کردنەوەی بنکەدراو",
     "action-sendemail": "ناردنی ئیمەیلەکان",
+    "action-viewmywatchlist": "دیتنی پێرستی چاودێریت",
     "nchanges": "$1 {{PLURAL:$1|گۆڕانکاری}}",
     "recentchanges": "دوایین گۆڕانکارییەکان",
     "recentchanges-legend": "ھەڵبژاردەکانی دوایین گۆڕانکارییەکان",
     "upload-permitted": "جۆرە پەڕگە ڕێگەپێدراوەکان: $1.",
     "upload-preferred": "جۆرە پەڕگانەی بە باشتر دەزانرێن: $1.",
     "upload-prohibited": "جۆرە پەڕگانەی قەدەغە کراون: $1.",
-    "uploadlog": "لۆگی بارکردن",
     "uploadlogpage": "لۆگی بارکردن",
     "uploadlogpagetext": "لەخوارەوە لیستی دوایین بارکراوەکان دەبینی.\nبۆ ئەوەی چاوێکیان لێ بکەی، [[Special:NewFiles|گالەری پەڕگە نوێکان]] ببینە.",
     "filename": "ناوی پەڕگە",
     "filereuploadsummary": "گۆرانکارییەکانی پەڕگە:",
     "filestatus": "بارودۆخی مافی لەبەرگرتنەوە:",
     "filesource": "سەرچاوە:",
-    "uploadedfiles": "پەڕگە بارکراوەکان",
     "ignorewarning": "چاوپۆشان لە ئاگادارییەکان و پاشەکەوت کردن بە هەر شێوەیەک",
     "ignorewarnings": "گوێ مەدە بە ئاگادارییەکان",
     "minlength1": "ناوی پەڕگەکان دەبێ لانیکەم یەک پیت ببێت.",
     "upload-misc-error": "هەڵەیەکی نەناسراوی بارکردن",
     "upload-misc-error-text": "هەڵەیەکی نەناسراو لە کاتی بارکردن ڕووی‌دا.\nتکایە لە درووست‌بوون و دەست‌پێ گەیشتنی URL ئەرخەیان ببە و دیسان تاقی‌بکەوە.\nگەر کێشەکە هەر بەردەوام بوو پەیوەندی بکە بە [[Special:ListUsers/sysop|بەڕێوبەر]].",
     "upload-too-many-redirects": "URL ڕەوانەکەری زۆری لەخۆ گرتووە",
-    "upload-unknown-size": "قەبارەی نادیار",
     "upload-http-error": "هەڵەیەکی HTTP ڕووئ داوە: $1",
     "backend-fail-stream": "نەکرا پەڕگەی $1 بنێردرێت.",
     "backend-fail-notexists": "پەڕگەی $1 بوونی نییە.",
     "filehist-dimensions": "ئەندازە",
     "filehist-filesize": "قەبارەی پەڕگە",
     "filehist-comment": "تێبینی",
-    "filehist-missing": "ون‌بوونی پەڕه",
     "imagelinks": "بەکارھێنانی پەڕگە",
     "linkstoimage": "لەم {{PLURAL:$1|پەڕەی خوارەوە بەستەر دراوە|$1 پەڕەی خوارەوە بەستەر دراوە}} بۆ ئەم پەڕگە:",
     "linkstoimage-more": "زیاتر لە $1 {{PLURAL:$1|بەستەری لاپەڕە|بەستەری لاپەڕە}} بۆ ئەم پەڕگه.\nئەم لیستە {{PLURAL:$1|یەکەم لاپەڕەی بەستەرە|یەکەم لاپەڕە $1 بەستەرە}} بۆ تەنها یەم پەڕگە.\nهەروا [[Special:WhatLinksHere/$2|لیستی تەواو]] ئامادەی کەڵک وەرگرتنە.",
     "statistics-header-hooks": "ئامارەکانی دیکە",
     "statistics-articles": "پەڕە بە ناوەڕۆکەکان",
     "statistics-pages": "پەڕەکان",
-    "statistics-pages-desc": "گشت Ù¾Û\95Ú\95Û\95کاÙ\86Û\8c Ù\88Û\8cÚ©Û\8cØ\8c Ø¨Û\95 Ù\84Û\95Ø®Û\86گرتÙ\86Û\8c Ù¾Û\95Ú\95Û\95کاÙ\86Û\8c Ù\88تÙ\88Ù\88Û\8eÚ\98Ø\8c Ú\95Û\95Ù\88اÙ\86Û\95کراÙ\88ەکان و ھتد.",
+    "statistics-pages-desc": "گشت Ù¾Û\95Ú\95Û\95کاÙ\86Û\8c Ù\88Û\8cÚ©Û\8cØ\8c Ø¨Û\95 Ù\84Û\95Ø®Û\86گرتÙ\86Û\8c Ù¾Û\95Ú\95Û\95کاÙ\86Û\8c Ù\84Û\8eدÙ\88اÙ\86Ø\8c Ú\95Û\95Ù\88اÙ\86Û\95Ú©Û\95رەکان و ھتد.",
     "statistics-files": "پەڕگە بارکراوەکان",
     "statistics-edits": "دەستکارییەکانی پەڕەکان لە کاتی دامەزراندنی {{SITENAME}}ەوە",
-    "statistics-edits-average": "نێونجی ژمارەی دەستکارییەکان لە پەڕەیەک دا",
+    "statistics-edits-average": "ناونجیی دەستکارییەکان بۆ ھەر پەڕە",
     "statistics-views-total": "دیتنی هەموو",
     "statistics-views-peredit": "دیتنی هەر دەستکارییەک",
     "statistics-users": "[[Special:ListUsers|بەکارھێنەر]]ە تۆمارکراوەکان",
     "statistics-users-active": "ئەندامە چالاکەکان",
-    "statistics-users-active-desc": "ئەو بەکارھێنەرانە کە لە {{PLURAL:$1|ڕۆژ|$1 ڕۆژ}}ی ڕابردوودا کارێکیان جێبەجێ کردبێت.",
+    "statistics-users-active-desc": "ئەو بەکارھێنەرانەی لە {{PLURAL:$1|ڕۆژ|$1 ڕۆژ}}ی ڕابردوودا کردەوەیەکیان بەڕێوە بردووە",
     "statistics-mostpopular": "زۆرترین لاپەڕە بینراوەکان",
     "pageswithprop": "پەڕەکان بە تایبەتمەندیی پەڕە",
     "pageswithprop-legend": "پەڕەکان بە تایبەتمەندیی پەڕە",
     "listgrouprights-removegroup-self": "لابردنی {{PLURAL:$2|گرووپ|گرووپەکان}} لە سەر ھەژماری خۆی: $1",
     "listgrouprights-addgroup-self-all": "زیادکردنی ھەموو گرووپەکان بۆ سەر ھەژماری خۆی",
     "listgrouprights-removegroup-self-all": "لابردنی هەموو گرووپەکان له‌ سه‌ر هه‌ژماری خۆ",
+    "listgrouprights-namespaceprotection-namespace": "بۆشاییی ناو",
+    "trackingcategories-name": "ناوی پەیام",
     "mailnologin": "ناونیشان بۆ ناردن نییه‌",
     "mailnologintext": "ده‌بێ له‌ [[Special:UserLogin|ژووره‌وه‌]] بیت و ناونیشانێکی بڕواپێ‌کراوی ئی‌مه‌یلت له‌ ناو [[Special:Preferences|هه‌ڵبژارده‌کان]] دیاری کردبێت تا بتوانی ئی‌مه‌یل بنێریت بۆ به‌کارهێنه‌رانی دیکه‌.",
     "emailuser": "ئیمەیل بنێرە بۆ ئەم بەکارھێنەرە",
     "usermaildisabled": "ئیمەیڵی بەکارهێنەر لەکاردانیە",
     "noemailtitle": "هیچ ناونیشانێکی ئی‌مەیل نییە",
     "noemailtext": "ئەم بەکارهێنەرە ناونێشانێکی بڕوا پێکراوی ئی‌مەیلی دانەناوە.",
-    "nowikiemailtitle": "ڕێگە بۆ ئی‌مەیل نەدراوە",
     "nowikiemailtext": "ئەم بەکارهێنەرە تایبەتمەندیی وەرنەگرتنی ئی‌مەیل لە بەکارهێنەرانی دیکەی هەلبژاردووە.",
     "emailtarget": "ناوی بەکارھێنەریی وەرگر بنووسە",
     "emailusername": "ناوی به‌كارھێنه‌ر:",
     "nowatchlist": "لە لیستی چاودێڕییەکانتدا ھیچ نیە.",
     "watchlistanontext": "بۆ دیتن و دەستکاریی بابەتەکانی  ناو پێرستی چاودێرییەکەتدا دەبێ $1.",
     "watchnologin": "لە ژوورەوە نیت.",
-    "watchnologintext": "دەبی لە [[Special:UserLogin|ژوورەوە]] بیت بۆ ئەوەی بتوانی گۆڕانکاری بکەیت لە لیستی چاودێریەکەت‌دا.",
     "addwatch": "بیخە سەر لیستی چاودێری",
     "addedwatchtext": "پەڕەی «[[:$1]]» خرایە ژێر [[Special:Watchlist|پێرستی چاودێری]]یەکەت.\nگۆڕانکارییەکانی داھاتووی ئەم پەڕەیە و پەڕەی وتووێژەکەی، لەوێدا پێرست دەکرێت.",
     "removewatch": "لەلیستی چاودێری لایبە",
     "watchlist-options": "ھەڵبژاردەکانی لیستی چاودێری",
     "watching": "چاودێری...",
     "unwatching": "لابردنی چاودێری...",
-    "enotif_mailer": "نامەی ڕاگەیاندنی {{SITENAME}}",
     "enotif_reset": "ھەموو پەڕەکان وەک بینراو دیاری بکە",
     "enotif_impersonal_salutation": "بەکارهێنەری \t{{SITENAME}}",
     "enotif_subject_deleted": "پەڕەی {{SITENAME}} $1 بە دەستی {{gender:$2|$2}} سڕایەوە.",
     "excontent": "ناوەرۆک ئەمە بوو: «$1»",
     "excontentauthor": "ناوەرۆک ئەمە بوو: «$1» (و تەنیا بەشداربوو «[[Special:Contributions/$2|$2]]» بوو)",
     "exbeforeblank": "ناوەرۆک بەر لە واڵاکردنەوە ئەمە بوو: «$1»",
-    "exblank": "پەڕە واڵا بوو",
     "delete-confirm": "سڕینەوەی «$1»",
     "delete-legend": "بیسڕەوە",
     "historywarning": "'''وشیار بە:''' پەڕەیەک کە دەتەوێ بیسڕیتەوە مێژوویەکی ھەیە بە نزیکەی $1 {{PLURAL:$1|پێداچوونەوە|پێداچوونەوە}}وە:",
     "delete-edit-reasonlist": "دەستکاری کردنی ھۆکارەکانی سڕینەوە",
     "delete-toobig": "ئەم لاپەڕە مێژوویەکی دەستکاری زۆر گەورەی هەیە، زیاتر لە $1 {{PLURAL:$1|پێداچوونەوە|پێداچوونەوە}}.\nبۆ بەرگری لە خراپ‌بوونی چاوەڕوان نەکراوی {{SITENAME}}، سڕینەوەی لاپەڕەی وا بەربەست‌کراوە.",
     "delete-warning-toobig": "ئەم لاپەڕە مێژوویەکی دەستکاری زۆر گەورەی هەیە، زیاتر لە $1 {{PLURAL:$1|پێداچوونەوە|پێداچوونەوە}}.\nسڕینەوی ئەوە لە وانەیە کارەکانی بنکەدراوی {{SITENAME}} تووشی کێشە بکات؛\nدوورنواڕانە جێ‌بەجێی بکە.",
-    "deleting-backlinks-warning": "'''ھۆشدار:''' پەڕەی تر بەم پەڕەیەی دەتەوێ بیسڕییەوە بەستەر دراوە.",
+    "deleting-backlinks-warning": "'''ھۆشدار:''' [[Special:WhatLinksHere/{{FULLPAGENAME}}|پەڕەکانی تر]] بەم پەڕەیەی دەتەوێ بیسڕییەوە بەستەر دراوە.",
     "rollback": "گەڕاندنەوەی دەستکارییەکان",
     "rollback_short": "گەڕاندنەوە",
     "rollbacklink": "گەڕاندنەوە",
     "alreadyrolled": "دوایین گۆڕانکاریەکانی لەسەر [[:$1]] لە لایەن [[User:$2|$2]] ناگەڕێندرێنەوە ([[User talk:$2|وتووێژ]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]])؛ کەسێکی دیکە لە پێش‌دا دەستکاری کردووە یان گەڕاندوویەتەوە.\n\nدوایین دەستکاری ئەم لاپەڕە [[User:$3|$3]] کردوویە ([[User talk:$3|وتووێژ]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
     "editcomment": "پوختەی دەستکاری \"''$1''\" بوو.",
     "revertpage": "گەڕاندنەوەی دەستکارییەکانی [[Special:Contributions/$2|$2]] ([[User talk:$2|لێدوان]]) بۆ دوایین پێداچوونەوەی [[User:$1|$1]]",
-    "revertpage-nouser": "دەستکارییەکانی (ناوی بەکارھێنەر سڕاوەتەوە) بۆ دوایین پێداچوونەوەی [[User:$1|$1]] گەڕێنراوە.",
+    "revertpage-nouser": "دەستکارییەکانی بەکارھێنەرێکی شاڕدراوە بۆ دوایین پێداچوونەوەی {{GENDER:$1|[[User:$1|$1]]}} گەڕێنرایەوە.",
     "rollback-success": "دەستکارییەکانی $1 وەرگێرایەوە؛<br />\nگۆڕدرا بۆ دوایین پێداچوونەوەی $2.",
     "sessionfailure": "لەوەدەچی کێشەیەک لە دانیشتنی چوونەژوورەوەت (login session)دا ببێت.\nئەم کردەوە هەڵوەشێندرایەوە بۆ بەرگری لە دزینی دراوەکانی دانیشتن.\nتکایە بگەڕێوە بۆ پەڕەی پێشوو و نوێی بکەوە، ئینجا دیسان تاقیی بکەوە.",
     "protectlogpage": "لۆگی پاراستن",
     "protectexpiry": "ھەتا:",
     "protect_expiry_invalid": "کاتی بەسەرچوون نادروستە:",
     "protect_expiry_old": "کاتی بەسەرچوون ڕابردووە",
+    "protect-unchain-permissions": "ھەڵبژاردەکانی تری پاراستن بکەوە",
     "protect-text": "دەتوانی لێرەوە ئاستی پاراستنی پەڕەی '''$1''' ببینی و بیشیگۆڕی.",
     "protect-locked-blocked": "ناتوانیت ئاستی پاراستن بگۆڕیت کاتێ بەستراوە.\nئەوە هەڵبژاردەکانی ئێستای ڕێکخستنی بۆ لاپەڕە '''$1''':",
     "protect-locked-dblock": "ئاستەکانی پاراستن ناگۆڕدرێن کاتێ بنکەدراوی چالاک داخرابێت.\nئەوە هەڵبژاردەکانی ئێستای ڕێکخستنی بۆ لاپەڕە '''$1''':",
     "sp-contributions-blocked-notice-anon": "ھەنووکە ئەم ناونیشانەی IPیە بەربەست کراوە.\nدوایین بابەتی لۆگی بەربەستن لە ژێرەوە ھاتووە:",
     "sp-contributions-search": "گەڕان بۆ بەشدارییەکان",
     "sp-contributions-username": "ناونیشانی ئایپی یان ناوی‌ بەکارھێنەر:",
-    "sp-contributions-toponly": "تەنیا ئەو دەستکارییانە نیشانبدە کە دوایین پیاچوونەوەن",
+    "sp-contributions-toponly": "تەنیا ئەو دەستکارییانە نیشان بدە کە دوایین پێداچوونەوەن",
+    "sp-contributions-newonly": "تەنیا ئەو دەستکارییانە نیشان بدە کە دروستکردنی پەڕەن",
     "sp-contributions-submit": "بگەڕێ",
     "whatlinkshere": "بەسراوەکان بە ئێرەوە",
     "whatlinkshere-title": "ئەو پەڕانەی بەستەریان ھەیە بۆ «$1»",
     "change-blocklink": "بەربەستن بگۆڕە",
     "contribslink": "بەشدارییەکان",
     "emaillink": "ناردنی ئیمەیل",
-    "autoblocker": "Ø®Û\86کار Ø¨Û\95ربÛ\95ستâ\80\8cکراÙ\88Û\95 Ù\84Û\95بÛ\95ر Ø¦Û\95Ù\88Û\95Û\8c Ù\86اÙ\88Ù\86Û\8cشاÙ\86Û\8c Ø¦Ø§Û\8câ\80\8cÙ¾Û\8c ØªÛ\86 Ù\84Û\95Ù\85 Ø¯Ù\88اÛ\8cÛ\8cاÙ\86Û\95دا Ù\84Û\95 Ù\84اÛ\8cÛ\95Ù\86 \"[[User:$1|$1]]\" Ø¨Û\95کار Ù\87اتÙ\88Ù\88Û\95.\nÙ\87Û\86کارÛ\8c Ø¨Û\95ربÛ\95ستâ\80\8cکراÙ\86Û\8c $1 Ø¦Û\95Ù\85Û\95Û\8cÛ\95: \"$2\"",
+    "autoblocker": "Ø®Û\86Ú¯Û\95Ú\95 Ø¨Û\95ربÛ\95ست Ú©Ø±Ø§ Ú\86Ù\88Ù\86 Ù\86اÙ\88Ù\86Û\8cشاÙ\86Û\8c Ø¦Ø§Û\8cÙ¾Û\8cÛ\8cÛ\95Ú©Û\95ت Ù\84Û\95Ù\85 Ø¯Ù\88اÛ\8cÛ\8cÛ\95دا Ù\84Û\95 Ù\84اÛ\8cÛ\95Ù\86 Â«[[User:$1|$1]]» Ø¨Û\95کارھاتÙ\88Ù\88Û\95.\nÚ¾Û\86کارÛ\8c Ø¨Û\95ربÛ\95ستÙ\86Û\8c $1 Ø¦Û\95Ù\85Û\95Û\8cÛ\95: Â«$2»",
     "blocklogpage": "لۆگی بەربەستن",
     "blocklog-showlog": "ئەم بەکارھێنەرە پێشتر بربەست کراوە.\nلۆگی بەربەستن لە ژێرەوە ھاتووە:",
     "blocklogentry": "[[$1]]ی بۆ ماوەی $2 بەربەست کرد $3",
     "allmessagesname": "ناو",
     "allmessagesdefault": "دەقی بنەڕەتی",
     "allmessagescurrent": "دەقی ھەنووکە",
-    "allmessagestext": "ئەمە لیستێکە لە پەیامەکانی بەردەست لە بۆشایی‌ناوی میدیاویکی.\nتکایە سەردانی [https://www.mediawiki.org/wiki/Localisation ناوچەیی‌کردنی میدیاویکی] و [//translatewiki.net translatewiki.net] بکە ئەگەر دەتەوێ لە ناوچەیی‌کردنی میدیاویکی بە گشتی بەشداری بکەیت.",
+    "allmessagestext": "ئەمە لیستێکە لە پەیامەکانی بەردەست لە بۆشایی‌ناوی میدیاویکی.\nتکایە سەردانی [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation ناوچەیی‌کردنی میدیاویکی] و [//translatewiki.net translatewiki.net] بکە ئەگەر دەتەوێ لە ناوچەیی‌کردنی میدیاویکی بە گشتی بەشداری بکەیت.",
     "allmessagesnotsupportedDB": "ئەم لاپەڕە ناتوانی بەکاربێت لەبەر ئەوەی '''$wgUseDatabaseMessages''' لەکار خستراوە.",
     "allmessages-filter-legend": "پاڵێو",
     "allmessages-filter-unmodified": "نەگۆڕدراو",
     "importunknownsource": "جۆری سەرچاوەی هاوردن نەناسراوە",
     "importcantopen": "پەڕگەی ھاوردن ناکرێتەوە",
     "importbadinterwiki": "بەستەری نێوانویکیی خراپ",
-    "importnotext": "واڵا یان بێ‌دەق",
     "importsuccess": "ھاوردن تەواو بوو!",
-    "importhistoryconflict": "کێشە لەو مێژووی پێداچوونەوانە وا هەیە (لەوانەیە ئەم پەڕەیە پێشتر ھاوردە کرابێ)",
     "importnosources": "ھیچ سەرچاوەیەکی ھاوردنی ناوویکی دیاری نەکراوە و بارکردنی ڕاستەوخۆی مێژوو ناچالاکە.",
     "importnofile": "ھیچ پەڕگەیەکی ھاوردن بار نەکراوە.",
     "importuploaderrorsize": "بارکردنی پەڕگەی ھاوردن سەرکەوتوو نەبوو.\nپەڕگەکە لەو قەبارەیەی بۆ بارکردن ڕێگەدراوە گەورەترە.",
     "pageinfo-header-edits": "مێژووی دەستکاری",
     "pageinfo-header-restrictions": "پاراستنی پەڕە",
     "pageinfo-header-properties": "تایبەتمەندییەکانی پەڕە",
-    "pageinfo-display-title": "Ù\86اÙ\88Ù\86Û\8cشاÙ\86 Ù\86Û\8cشاÙ\86بدÛ\95",
+    "pageinfo-display-title": "Ù¾Û\8eشاÙ\86داÙ\86Û\8c Ø³Û\95ردÛ\8eÚ\95",
     "pageinfo-default-sort": "کلیلی ڕیزکردنی بەرگریمانە",
     "pageinfo-length": "قەبارەی پەڕە (بایت)",
     "pageinfo-article-id": "زنجیرەی پەڕە",
     "pageinfo-language": "زمانی ناوەرۆکی پەڕە",
-    "pageinfo-robot-policy": "چۆنێتیی مۆتۆڕی گەڕان",
+    "pageinfo-content-model": "شێوازی ناوەرۆکی پەڕە",
+    "pageinfo-robot-policy": "پێرستکردن بە بۆتەکان",
     "pageinfo-robot-index": "ڕێ پێدراو",
     "pageinfo-robot-noindex": "ڕێ پێنەدراوه",
     "pageinfo-views": "ژمارەی بینینەکان",
index a1e5420..137a6f5 100644 (file)
     "version-specialpages": "Pagine spiciale",
     "specialpages": "Pagine spiciale",
     "tags-edit": "mudificà",
+    "logentry-delete-delete": "$1 ha cancellatu a pagina $3",
     "logentry-move-move": "$1 {{GENDER:$2|hà spustatu}} a pagina $3 à $4",
     "rightsnone": "(nessunu)",
     "expand_templates_output": "Risultatu"
index 10a17c4..bfeba72 100644 (file)
     "nowatchlist": "Сизинъ козетюв джедвелинъиз боштыр.",
     "watchlistanontext": "Козетюв джедвелини бакъмакъ я да денъиштирмек ичюн $1 борджлусынъыз.",
     "watchnologin": "Отурым ачмакъ керек",
-    "watchnologintext": "Озь козетюв джедвелинъизни денъиштирмек ичюн [[Special:UserLogin|отурым ачынъыз]]",
     "addedwatchtext": "\"[[:$1]]\" саифеси [[Special:Watchlist|козетюв джевделинъизге]] кирсетильди.\nБундан сонъ, бу саифеде ве онынъ музакере саифесинде япыладжакъ денъиштирмелер анда косьтериледжек.",
     "removedwatchtext": "\"[[:$1]]\" саифеси [[Special:Watchlist|козетюв джедвелинъизден]] ёкъ этильди.",
     "watch": "Козет",
     "allmessagesname": "Исим",
     "allmessagesdefault": "Оригиналь метин",
     "allmessagescurrent": "Шимди къулланылгъан метин",
-    "allmessagestext": "Ишбу джедвель MediaWiki-де мевджут олгъан бутюн система беянатларынынъ джедвелидир.\nMediaWiki интерфейсининъ чешит тиллерге терджиме этювде иштирак этмеге истесенъиз [https://www.mediawiki.org/wiki/Localisation MediaWiki Localisation] ве [//translatewiki.net translatewiki.net] саифелерине зиярет этинъиз.",
+    "allmessagestext": "Ишбу джедвель MediaWiki-де мевджут олгъан бутюн система беянатларынынъ джедвелидир.\nMediaWiki интерфейсининъ чешит тиллерге терджиме этювде иштирак этмеге истесенъиз [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation MediaWiki Localisation] ве [//translatewiki.net translatewiki.net] саифелерине зиярет этинъиз.",
     "thumbnail-more": "Буют",
     "filemissing": "Файл тапылмады",
     "thumbnail_error": "Кичик ресим (thumbnail) яратылгъанда бир хата чыкъты: $1",
index c28bcc8..02374b0 100644 (file)
     "privacypage": "Project:Gizlilik esası",
     "badaccess": "İzin hatası",
     "badaccess-group0": "Yapacaq olğan areketiñizni yapmağa aqqıñız yoq.",
-    "badaccess-groups": "Yapacaq olğan areketiñizni tek aşağıdaki {{PLURAL:$2|1|$2}} gruppağa aza оlğan qullanıcıları yapıp olalar: $1.",
+    "badaccess-groups": "Yapacaq olğan areketiñizni tek aşağıdaki {{PLURAL:$2|1|$2}} gruppağa aza olğan qullanıcıları yapıp ola: $1.",
     "versionrequired": "MediaWikiniñ $1 versiyası kerek",
     "versionrequiredtext": "Bu saifeni qullanmaq içün MediaWikiniñ $1 versiyası kerek. [[Special:Version|Versiya]] saifesine baq.",
     "ok": "Ok",
     "youhavenewmessagesmulti": "$1 saifesinde yañı beyanatıñız bar.",
     "editsection": "deñiştir",
     "editold": "deñiştir",
-    "viewsourceold": "menba kоdunı köster",
+    "viewsourceold": "menba kodunı köster",
     "editlink": "deñiştir",
-    "viewsourcelink": "menba kоdunı köster",
+    "viewsourcelink": "menba kodunı köster",
     "editsectionhint": "Deñiştirilgen bölük: $1",
     "toc": "Münderice",
     "showtoc": "köster",
     "restorelink": "yoq etilgen {{PLURAL:$1|1|$1}} deñiştirmesi",
     "feedlinks": "Bu şekilde:",
     "feed-invalid": "Abune kanalınıñ çeşiti yañlıştır.",
-    "feed-unavailable": "Sindikatsiya lentaları qullanılıp оlamay.",
+    "feed-unavailable": "Sindikatsiya lentaları qullanılıp olamay.",
     "site-rss-feed": "$1 RSS lentası",
     "site-atom-feed": "$1 Atom lentası",
     "page-rss-feed": "\"$1\" - RSS lentası",
     "page-atom-feed": "\"$1\" - Atom lentası",
-    "red-link-title": "$1 (böyle saife yоq)",
+    "red-link-title": "$1 (böyle saife yoq)",
     "sort-descending": "Eksilmesi sayın sırala",
     "sort-ascending": "Artması sayın sırala",
     "nstab-main": "Saife",
     "nstab-help": "Yardım",
     "nstab-category": "Kategoriya",
     "nosuchaction": "Böyle bir areket yoq",
-    "nosuchactiontext": "URL-de bildirilgen areket ruhsetsiz.\nBelki de URL-ni yañlış yazğandırsız, ya da doğru olmağan bir bağlantını qullanğandırsız.\nBu, {{SITENAME}} saytındaki bir hatanı da kösterip оla.",
+    "nosuchactiontext": "URL-de bildirilgen areket ruhsetsiz.\nBelki de URL-ni yañlış yazğandırsız, ya da doğru olmağan bir bağlantını qullanğandırsız.\nBu, {{SITENAME}} saytındaki bir hatanı da kösterip ola.",
     "nosuchspecialpage": "Bu isimde bir mahsus saife yoq",
     "nospecialpagetext": "<strong>Tapılmağan bir mahsus saifege kirdiñiz.</strong>\n\nBar olğan bütün mahsus saifelerni [[Special:SpecialPages|{{int:specialpages}}]] saifesinde körip olursıñız.",
     "error": "Hata",
     "fileexistserror": "\"$1\" faylı saqlanıp olamay, fayl endi bar.",
     "unexpected": "beklenmegen deger: \"$1\"=\"$2\".",
     "formerror": "Hata: formanıñ malümatını yollamaqnıñ iç çaresi yoq",
-    "badarticleerror": "Siz yapmağa istegen işlev bu saifede yapılıp оlamay.",
+    "badarticleerror": "Siz yapmağa istegen işlev bu saifede yapılıp olamay.",
     "cannotdelete": "\"$1\" saife ya da faylı yoq etilip olamadı. Başqa bir qullanıcı tarafından yoq etilgen ola bile.",
     "cannotdelete-title": "\"$1\" saifesini yoq etmege olmaz",
     "delete-hook-aborted": "Yoq etüv çengel protsedurasınen toqtatıldı.\nİç bir izaat berilmedi.",
     "nouserspecified": "Qullanıcı adını kirsetmek kereksiñiz.",
     "login-userblocked": "Bu qullanıcı blok etilgen. Kirmege ruhset etilmey.",
     "wrongpassword": "Kirsetken paroliñiz yañlıştır. Lütfen, tekrar etiñiz.",
-    "wrongpasswordempty": "Kirsetken parоliñiz bоştır.\nLütfen, tekrar etiñiz.",
+    "wrongpasswordempty": "Kirsetken paroliñiz boştır.\nLütfen, tekrar etiñiz.",
     "passwordtooshort": "Paroliñizde eñ az {{PLURAL:$1|1|$1}} işaret olmalı.",
     "password-name-match": "Paroliñiz qullanıcı adıñızdan farqlı olmalı.",
     "password-login-forbidden": "Bu qullanıcı adı ve parolni qullanmaq yasaqtır.",
     "accountcreatedtext": "$1 içün bir qullanıcı esabı açıldı.",
     "createaccount-title": "{{SITENAME}} saytında yañı bir esap yaratıluvı",
     "createaccount-text": "Birev siziñ e-mail adresini bildirip {{SITENAME}} saytında ($4) \"$2\" adlı bir esap yarattı.\nŞu esap içün parol budır: \"$3\".\nSiz şimdi oturım açıp paroliñizni deñiştirmek kereksiñiz.\n\nŞu esap hata olaraq yaratılğan olsa bu mektüpke qulaq asmayıp olasıñız.",
-    "usernamehasherror": "Qullanıcı adında # işareti olamaz",
     "login-throttled": "Yaqın zamanda pek çoq kere kirmege tırıştıñız.\nLütfen, qayta kirmezden evel biraz bekleñiz.",
     "loginlanguagelabel": "Til: $1",
     "suspicious-userlogout": "Çıqış istegeniñiz red etildi, çünki bozuq bir brauzer ya da keşleyici proksi tarafından yollanğan kibi körüne.",
     "resetpass-no-info": "Bu saifege doğrudan irişmek içün oturım açmaq kereksiñiz.",
     "resetpass-submit-loggedin": "Parolni deñiştir",
     "resetpass-submit-cancel": "Lâğu",
-    "resetpass-wrong-oldpass": "Ruhsetsiz muvaqqat ya da şimdiki parоl.\nParоliñizni endi muvafaqiyetnen deñiştirdiñiz ya da yañı bir muvaqqat parоl istediñiz.",
+    "resetpass-wrong-oldpass": "Ruhsetsiz muvaqqat ya da şimdiki parol.\nParoliñizni endi muvafaqiyetnen deñiştirdiñiz ya da yañı bir muvaqqat parol istediñiz.",
     "resetpass-temp-password": "Muvaqqat parol:",
     "bold_sample": "Qalın yazılış",
     "bold_tip": "Qalın yazılış",
     "viewpagelogs": "Bu saifeniñ jurnallarını köster",
     "nohistory": "Bu saifeniñ keçmiş versiyası yoq.",
     "currentrev": "Şimdiki versiya",
-    "currentrev-asof": "$1 tarihında sоñki kere deñiştirilgen saifeniñ şimdiki alı",
+    "currentrev-asof": "$1 tarihında soñki kere deñiştirilgen saifeniñ şimdiki alı",
     "revisionasof": "Saifeniñ $1 tarihındaki alı",
     "revision-info": "Saifeniñ $2 tarafından yazılğan $1 tarihındaki alı",
     "previousrevision": "← Evelki alı",
     "search-suggest": "Bunımı demege istediñiz: $1",
     "search-interwiki-caption": "Qardaş leyhalar",
     "search-interwiki-default": "$1 netice:",
-    "search-interwiki-more": "(daa çоq)",
+    "search-interwiki-more": "(daa çoq)",
     "search-relatedarticle": "Bağlı",
     "searcheverything-enable": "Bütün isim fezalarında qıdır",
     "searchrelated": "bağlı",
     "prefs-skin": "Resimleme",
     "skin-preview": "Baqıp çıquv",
     "datedefault": "Standart",
-    "prefs-datetime": "Tarih ve saat",
     "prefs-personal": "Qullanıcı malümatı",
     "prefs-rc": "Soñki deñiştirmeler",
     "prefs-watchlist": "Közetüv cedveli",
     "editinguser": "'''[[User:$1|$1]]''' $2 qullanıcısınıñ izinlerini deñiştireyatasız",
     "userrights-editusergroup": "Qullanıcı gruppaları nizamla",
     "saveusergroups": "Qullanıcı gruppalarını saqla",
-    "userrights-groupsmember": "Azası оlğan gruppalarıñız:",
+    "userrights-groupsmember": "Azası olğan gruppalarıñız:",
     "group": "Gruppa:",
     "group-user": "Qullanıcılar",
     "group-autoconfirmed": "Avtomatik tasdıqlanğan qullanıcılar",
     "grouppage-bureaucrat": "{{ns:project}}:Bürokratlar",
     "grouppage-suppress": "{{ns:project}}:Teftişçiler",
     "newuserlogpage": "Yañı qullanıcı jurnalı",
-    "newuserlogpagetext": "Eñ sоñki qayd оlğan qullanıcı jurnalı.",
+    "newuserlogpagetext": "Eñ soñki qayd olğan qullanıcı jurnalı.",
     "rightslog": "Qullanıcınıñ aqları jurnalı",
     "action-edit": "bu saifeni deñiştirmege",
     "nchanges": "$1 {{PLURAL:$1|deñiştirme}}",
     "upload-permitted": "İzinli fayl çeşitleri: $1.",
     "upload-preferred": "İstenilgen fayl çeşitleri: $1.",
     "upload-prohibited": "Yasaqlı fayl çeşitleri: $1.",
-    "uploadlog": "yükleme jurnalı",
     "uploadlogpage": "Fayl yükleme jurnalı",
-    "uploadlogpagetext": "Aşağıda eñ soñki qоşulğan fayllarnıñ cedveli buluna.\nDaa körgezmeli körüniş içün [[Special:NewFiles|yañı fayllar galereyasına]] baqıñız.",
+    "uploadlogpagetext": "Aşağıda eñ soñki qoşulğan fayllarnıñ cedveli buluna.\nDaa körgezmeli körüniş içün [[Special:NewFiles|yañı fayllar galereyasına]] baqıñız.",
     "filename": "Fayl",
     "filedesc": "Faylğa ait qısqa tarif",
     "fileuploadsummary": "Qısqa tarif:",
     "filereuploadsummary": "Faylnıñ deñiştirilmeleri:",
     "filestatus": "Tarqatuv şartları:",
     "filesource": "Menba:",
-    "uploadedfiles": "Yüklengen fayllar",
     "ignorewarning": "Tenbige qulaq asmayıp faylnı yükle.",
     "ignorewarnings": "Tenbilerge qulaq asma",
     "minlength1": "Faylnıñ adı eñ azdan bir ariften ibaret olmalı.",
     "filehist-dimensions": "En × boy",
     "filehist-filesize": "Fayl büyükligi",
     "filehist-comment": "İzaat",
-    "filehist-missing": "Fayl yoq",
     "imagelinks": "Fayl bağlantıları",
     "linkstoimage": "Bu faylğa bağlantı olğan {{PLURAL:$1|1|$1}} saife:",
     "nolinkstoimage": "Bu faylğa bağlanğan saife yoq.",
-    "sharedupload": "Bu fayl $1 saytından ve diger leyhalarda da qullanılıp оla.",
+    "sharedupload": "Bu fayl $1 saytından ve diger leyhalarda da qullanılıp ola.",
     "uploadnewversion-linktext": "Faylnıñ yañısını yükleñiz",
     "shared-repo-from": "$1nden",
     "shared-repo": "ortaq tutulğan yeri",
     "wantedcategories": "İstenilgen kategoriyalar",
     "wantedpages": "İstenilgen saifeler",
     "wantedfiles": "İstenilgen fayllar",
-    "wantedtemplates": "İstenilgen şablоnlar",
+    "wantedtemplates": "İstenilgen şablonlar",
     "mostlinked": "Özüne eñ ziyade bağlantı berilgen saifeler",
     "mostlinkedcategories": "Eñ çoq saifege saip kategoriyalar",
     "mostlinkedtemplates": "Özüne eñ ziyade bağlantı berilgen şablonlar",
     "emailuser": "Qullanıcığa mektüp",
     "emailpage": "Qullanıcığa elektron mektüp yolla",
     "emailpagetext": "Aşağıdaki formanı toldurıp bu qullanıcığa mektüp yollap olursıñız.\n[[Special:Preferences|Öz sazlamalarıñızda]] yazğan elektron adresiñiz mektüpniñ \"Kimden\" satırında yazılacaq, bunıñ içün mektüp alıcı doğrudan-doğru siziñ adresiñizge cevap yollap olur.",
-    "usermailererror": "E-mail beyanatı yollanğan vaqıtta hata olıp çıqtı",
     "defemailsubject": "{{SITENAME}} e-mail",
     "noemailtitle": "E-mail adresi yoqtır",
     "noemailtext": "Bu qullanıcı uyğun elektron poçta adresini bildirmegen.",
     "nowatchlist": "Siziñ közetüv cedveliñiz boştır.",
     "watchlistanontext": "Közetüv cedvelini baqmaq ya da deñiştirmek içün $1 borclusıñız.",
     "watchnologin": "Oturım açmaq kerek",
-    "watchnologintext": "Öz közetüv cedveliñizni deñiştirmek içün [[Special:UserLogin|oturım açıñız]]",
     "addedwatchtext": "\"[[:$1]]\" saifesi [[Special:Watchlist|közetüv cevdeliñizge]] kirsetildi.\nBundan soñ, bu saifede ve onıñ muzakere saifesinde yapılacaq deñiştirmeler anda kösterilecek.",
     "removedwatchtext": "\"[[:$1]]\" saifesi [[Special:Watchlist|közetüv cedveliñizden]] yoq etildi.",
     "watch": "Közet",
     "watchlist-options": "Közetüv cedveli sazlamaları",
     "watching": "Közetüv cedveline kirsetilmekte...",
     "unwatching": "Közetüv cedvelinden yoq etilmekte...",
-    "enotif_mailer": "{{SITENAME}} poçta vastasınen haber bergen hızmet",
     "enotif_reset": "Cümle saifelerni baqılğan olaraq işaretle",
     "enotif_impersonal_salutation": "{{SITENAME}} qullanıcısı",
     "enotif_lastvisited": "Soñki ziyaretiñizden berli yapılğan deñiştirmelerni körmek içün $1 baqıñız.",
     "excontent": "eski metin: '$1'",
     "excontentauthor": "eski metin: '$1' ('$2' isse qoşqan tek bir qullanıcı)",
     "exbeforeblank": "Yoq etilmegen evelki metin: '$1'",
-    "exblank": "saife metini boş",
     "delete-confirm": "\"$1\" saifesini yoq etmektesiñiz",
     "delete-legend": "Yoq etüv",
     "historywarning": "'''Tenbi:''' Siz yoq etmege istegen saifeñizniñ qararnen $1 {{PLURAL:$1|versiyalı|versiyalı}} keçmişi bardır:",
     "undeletelink": "köster/keri ketir",
     "undeletecomment": "Sebep:",
     "undeletedrevisions": "Toplam {{PLURAL:$1|1 qayd|$1 qayd}} keri ketirildi.",
-    "undelete-header": "Keçenlerde yоq etilgen saifelerni körmek içün [[Special:Log/delete|yоq etüv jurnalına]] baqıñız.",
+    "undelete-header": "Keçenlerde yoq etilgen saifelerni körmek içün [[Special:Log/delete|yoq etüv jurnalına]] baqıñız.",
     "namespace": "İsim fezası:",
     "invert": "Saylanğan tışındakilerni sayla",
     "blanknamespace": "(Esas)",
     "allmessagesname": "İsim",
     "allmessagesdefault": "Original metin",
     "allmessagescurrent": "Şimdi qullanılğan metin",
-    "allmessagestext": "İşbu cedvel MediaWikide mevcut olğan bütün sistema beyanatlarınıñ cedvelidir.\nMediaWiki interfeysiniñ çeşit tillerge tercime etüvde iştirak etmege isteseñiz [https://www.mediawiki.org/wiki/Localisation MediaWiki Localisation] ve [//translatewiki.net translatewiki.net] saifelerine ziyaret etiñiz.",
+    "allmessagestext": "İşbu cedvel MediaWikide mevcut olğan bütün sistema beyanatlarınıñ cedvelidir.\nMediaWiki interfeysiniñ çeşit tillerge tercime etüvde iştirak etmege isteseñiz [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation MediaWiki Localisation] ve [//translatewiki.net translatewiki.net] saifelerine ziyaret etiñiz.",
     "thumbnail-more": "Büyüt",
     "filemissing": "Fayl tapılmadı",
     "thumbnail_error": "Kiçik resim (thumbnail) yaratılğanda bir hata çıqtı: $1",
     "seconds-abbrev": "$1san.",
     "minutes-abbrev": "$1daq.",
     "hours-abbrev": "$1saat",
-    "bad_image_list": "Format böyle olmalı:\n\nEr satır * işaretinen başlamalı. Satırnıñ birinci bağlantısı qоşmağa yasaqlanğan faylğa bağlanmalı.\nŞu satırda ilerideki bağlantılar istisna olurlar, yani şu saifelerde işbu fayl qullanmaq mümkün.",
+    "bad_image_list": "Format böyle olmalı:\n\nEr satır * işaretinen başlamalı. Satırnıñ birinci bağlantısı qoşmağa yasaqlanğan faylğa bağlanmalı.\nŞu satırda ilerideki bağlantılar istisna olur, yani şu saifelerde işbu fayl qullanmaq mümkün.",
     "metadata": "Resim detalleri",
-    "metadata-help": "Faylda (adetince raqamlı kamera ve skanerlernen qоşulğan) ilâve malümatı bar. Eger bu fayl yaratılğandan soñ deñiştirilse edi, belki de bazı parametrler eskirdi.",
+    "metadata-help": "Faylda (adetince raqamlı kamera ve skanerlernen qoşulğan) ilâve malümatı bar. Eger bu fayl yaratılğandan soñ deñiştirilse edi, belki de bazı parametrler eskirdi.",
     "metadata-expand": "Tafsilâtnı köster",
     "metadata-collapse": "Tafsilâtnı kösterme",
     "metadata-fields": "Bu cedveldeki EXIF meta malümatı resim saifesinde kösterilecek, başqaları ise gizlenecek.\n* make\n* model\n* datetimeoriginal\n* exposuretime\n* fnumber\n* isospeedratings\n* focallength\n* artist\n* copyright\n* imagedescription\n* gpslatitude\n* gpslongitude\n* gpsaltitude",
     "namespacesall": "Episi",
     "monthsall": "Episi",
     "confirmemail": "E-mail adresini tasdıqla",
-    "confirmemail_noemail": "[[Special:Preferences|Qullanıcı sazlamalarıñızda]] dоğru bir e-mail adresiñiz yoq.",
+    "confirmemail_noemail": "[[Special:Preferences|Qullanıcı sazlamalarıñızda]] doğru bir e-mail adresiñiz yoq.",
     "confirmemail_text": "{{SITENAME}} saytınıñ e-mail funktsiyalarını qullanmazdan evel e-mail adresiñizniñ tasdıqlanması kerek. Adresiñizge tasdıq e-mail mektübini yollamaq içün aşağıdaki dögmeni basıñız. Yollanacaq beyanatta adresiñizni tasdıqlamaq içün brauzeriñiznen irişip olacaq, tasdıq kodu olğan bir bağlantı olacaq.",
     "confirmemail_pending": "Tasdıq kodu endi sizge yollandı.\nEger esabıñıznı keçenleri açsa ediñiz, belki de yañnı kodnı bir daa sorağanıñızda, biraz beklemek kerek olur.",
     "confirmemail_send": "Tasdıq kodunı yolla",
     "fileduplicatesearch-filename": "Fayl adı:",
     "fileduplicatesearch-submit": "Qıdır",
     "fileduplicatesearch-info": "$1 × $2 piksel<br />Fayl büyükligi: $3<br />MIME çeşiti: $4",
-    "fileduplicatesearch-result-1": "\"$1\" faylınıñ iç kоpiyası yоq.",
-    "fileduplicatesearch-result-n": "\"$1\" faylınıñ {{PLURAL:$2|bir kоpiyası|$2 kоpiyası}} bar.",
+    "fileduplicatesearch-result-1": "\"$1\" faylınıñ iç kopiyası yoq.",
+    "fileduplicatesearch-result-n": "\"$1\" faylınıñ {{PLURAL:$2|bir kopiyası|$2 kopiyası}} bar.",
     "specialpages": "Mahsus saifeler",
     "specialpages-group-maintenance": "Baqım esabatları",
     "specialpages-group-other": "Diger mahsus saifeler",
     "specialpages-group-changes": "Soñki deñişiklikler ve jurnallar",
     "specialpages-group-media": "Fayl esabatları ve yükleme",
     "specialpages-group-users": "Qullanıcılar ve aqları",
-    "specialpages-group-highuse": "Çоq qullanılğan saifeler",
+    "specialpages-group-highuse": "Çoq qullanılğan saifeler",
     "specialpages-group-pages": "Saifeler cedveli",
     "specialpages-group-pagetools": "Saife aletleri",
     "specialpages-group-wiki": "Viki malümat ve aletler",
     "specialpages-group-redirects": "Yollama mahsus saifeler",
     "specialpages-group-spam": "Spamğa qarşı aletler",
-    "blankpage": "Bоş saife",
+    "blankpage": "Boş saife",
     "intentionallyblankpage": "Bu saife aselet boş qaldırılğan",
     "comparepages": "Saifelerni teñeştirüv",
     "compare-submit": "Teñeştir",
index d44af39..37cfee2 100644 (file)
@@ -1,11 +1,37 @@
 {
     "@metadata": {
-        "authors": []
+        "authors": [
+            "Chmee2",
+            "Danny B.",
+            "DemonioCZ",
+            "Geitost",
+            "Helix84",
+            "Jezevec",
+            "Jkjk",
+            "Kaganer",
+            "Kuvaly",
+            "Li-sung",
+            "Littledogboy",
+            "Martin Kozák",
+            "Matěj Grabovský",
+            "Matěj Suchánek",
+            "Mercy",
+            "Michawiki",
+            "Mormegil",
+            "Mr. Richard Bolla",
+            "Paxt",
+            "Quinn",
+            "Reaperman",
+            "Utar",
+            "Vks",
+            "YjM",
+            "לערי ריינהארט"
+        ]
     },
     "tog-underline": "Podtrhávat odkazy:",
     "tog-hideminor": "Skrýt malé editace v posledních změnách",
     "tog-hidepatrolled": "Skrýt patrolované editace v posledních změnách",
-    "tog-newpageshidepatrolled": "Skrýt patrolované stránky ze seznamu nových stránek",
+    "tog-newpageshidepatrolled": "Skrýt patrolované stránky v seznamu nových stránek",
     "tog-extendwatchlist": "Na seznamu sledovaných stránek zobrazovat všechny změny, ne jen tu poslední",
     "tog-usenewrc": "V posledních změnách a sledovaných stránkách seskupovat změny podle stránek",
     "tog-numberheadings": "Automaticky číslovat nadpisy",
@@ -17,7 +43,7 @@
     "tog-watchdefault": "Přidávat mnou editované stránky a soubory ke sledovaným",
     "tog-watchmoves": "Přidávat mnou přesouvané stránky a soubory mezi sledované",
     "tog-watchdeletion": "Přidávat stránky a soubory, které smažu, mezi sledované",
-    "tog-minordefault": "Označit editaci implicitně jako malá editace",
+    "tog-minordefault": "Označovat editace implicitně jako malé",
     "tog-previewontop": "Zobrazovat náhled před editačním oknem (ne za ním)",
     "tog-previewonfirst": "Zobrazit při první editaci náhled",
     "tog-enotifwatchlistpages": "Poslat e-mail při změně sledované stránky nebo souboru",
     "permalink": "Trvalý odkaz",
     "print": "Vytisknout",
     "view": "Zobrazit",
+    "view-foreign": "Prohlédnout na {{grammar:6sg|$1}}",
     "edit": "Editovat",
+    "edit-local": "Editovat místní popis",
     "create": "Vytvořit",
+    "create-local": "Přidat místní popis",
     "editthispage": "Editovat stránku",
     "create-this-page": "Vytvořit tuto stránku",
     "delete": "Smazat",
     "pool-timeout": "Při čekání na zámek vypršel časový limit",
     "pool-queuefull": "Fronta ve fondu je plná",
     "pool-errorunknown": "Neznámá chyba",
+    "pool-servererror": "Služba řídící přístup k serverům není dostupná ($1).",
     "aboutsite": "O&nbsp;{{grammar:6sg|{{SITENAME}}}}",
     "aboutpage": "Project:{{SITENAME}}",
     "copyright": "Obsah je dostupný pod $1, pokud není uvedeno jinak.",
     "badaccess": "Nedostatečná oprávnění",
     "badaccess-group0": "Nemáte oprávnění k provedení požadované činnosti.",
     "badaccess-groups": "Požadovanou činnost smějí provádět jen uživatelé ve {{PLURAL:$2|skupině|skupinách}} $1.",
-    "versionrequired": "Vyžadováno MediaWiki verze $1",
+    "versionrequired": "Vyžadována MediaWiki verze $1",
     "versionrequiredtext": "Pro použití této stránky je vyžadováno MediaWiki verze $1. Vizte [[Special:Version|stránku verze]].",
     "ok": "OK",
     "pagetitle": "$1 – {{SITENAME}}",
     "nstab-help": "Nápověda",
     "nstab-category": "Kategorie",
     "nosuchaction": "Neznámý úkon",
-    "nosuchactiontext": "Činnost („action“) uvedená v URL je neplatná.\nZřejmě jste se překlepli při zadávání adresy nebo jste klikli na chybný odkaz.\nMůže se ale jednat také o chybu {{GRAMMAR:2sg|{{SITENAME}}}}.",
+    "nosuchactiontext": "Činnost („action“) uvedená v URL je neplatná.\nZřejmě jste se při zadávání adresy překlepli nebo jste klikli na chybný odkaz.\nMůže se ale jednat také o chybu {{GRAMMAR:2sg|{{SITENAME}}}}.",
     "nosuchspecialpage": "Neexistující speciální stránka",
     "nospecialpagetext": "<strong>Zadali jste neplatnou speciální stránku.</strong>\n\nZkuste se podívat na [[Special:SpecialPages|seznam všech existujících speciálních stránek]].",
     "error": "Chyba",
     "fileexistserror": "Nelze uložit do souboru „$1“: soubor existuje",
     "unexpected": "Neočekávaná hodnota: \"$1\"=\"$2\".",
     "formerror": "Chyba: nebylo možné odeslat formulář",
-    "badarticleerror": "Tento úkon nelze použít na tuto stránku.",
+    "badarticleerror": "Tuto činnost nelze na této stránce provést.",
     "cannotdelete": "Nebylo možné smazat stránku nebo soubor „$1“.\nMožná už byl(a) smazán(a) někým jiným.",
     "cannotdelete-title": "Stránku „$1“ nelze smazat",
     "delete-hook-aborted": "Smazání bylo bez bližšího vysvětlení zrušeno přípojným bodem.",
     "viewyourtext": "Můžete si prohlédnout a zkopírovat zdrojový kód '''vašich změn''' této stránky:",
     "protectedinterface": "Tato stránka obsahuje text softwarového rozhraní a je zamčena kvůli prevenci zneužití.\nPro přidávání a změny překladů pro všechny wiki použijte [//translatewiki.net/ translatewiki.net], projekt pro lokalizaci MediaWiki.",
     "editinginterface": "'''Upozornění:''' Editujete stránku, která definuje texty rozhraní.\nZměny této stránky ovlivní vzhled uživatelského rozhraní všem uživatelům této wiki.\nPro přidávání a změny překladů pro všechny wiki použijte [//translatewiki.net/ translatewiki.net], projekt pro lokalizaci MediaWiki.",
-    "cascadeprotected": "Tato stránka je zamčena, neboť je vložena do {{PLURAL:$1|následující stránky zamčené|následujících stránek zamčených|následujících stránek zamčených}} kaskádovým zámkem:\n$2",
+    "cascadeprotected": "Tato stránka je zamčena, neboť je vložena do {{PLURAL:$1|následující stránky, zamčené|následujících stránek, zamčených|následujících stránek, zamčených}} kaskádovým zámkem:\n$2",
     "namespaceprotected": "Nemáte povoleno editovat stránky ve jmenném prostoru '''$1'''.",
     "customcssprotected": "Nemáte povoleno editovat tuto stránku s CSS, protože obsahuje osobní nastavení jiného uživatele.",
     "customjsprotected": "Nemáte povoleno editovat tuto stránku s JavaScriptem, protože obsahuje osobní nastavení jiného uživatele.",
     "virus-badscanner": "Špatná konfigurace: neznámý antivirový program: ''$1''",
     "virus-scanfailed": "prověřování selhalo (kód $1)",
     "virus-unknownscanner": "neznámý antivirus:",
-    "logouttext": "'''Nyní jste odhlášeni.'''\n\nUvědomte si, že některé stránky se mohou i nadále zobrazovat, jako byste byli dosud přihlášeni, pokud nevymažete cache prohlížeče.",
+    "logouttext": "'''Nyní jste odhlášeni.'''\n\nUvědomte si, že některé stránky se mohou i nadále zobrazovat, jako byste byli dosud přihlášeni, dokud nevymažete cache prohlížeče.",
     "welcomeuser": "Vítejte, uživateli $1!",
     "welcomecreation-msg": "Váš účet byl vytvořen.\nNezapomeňte si upravit své [[Special:Preferences|nastavení {{grammar:2sg|{{SITENAME}}}}]].",
     "yourname": "Uživatelské jméno:",
     "wrongpasswordempty": "Bylo zadáno prázdné heslo. Zkuste to znovu.",
     "passwordtooshort": "Heslo musí být dlouhé nejméně $1 {{PLURAL:$1|znak|znaky|znaků}}.",
     "password-name-match": "Vaše heslo nesmí být stejné jako uživatelské jméno.",
-    "password-login-forbidden": "Použití tohoto uživatelského jména a hesla byla zakázáno.",
+    "password-login-forbidden": "Použití tohoto uživatelského jména a hesla bylo zakázáno.",
     "mailmypassword": "Poslat nové heslo",
     "passwordremindertitle": "Nové dočasné heslo na {{grammar:4sg|{{SITENAME}}}}",
-    "passwordremindertext": "Někdo (patrně vy, z IP adresy $1) požádal, abychom o nové heslo\npro přihlášení do {{grammar:2sg|{{SITENAME}}}} ($4). Uživateli „$2“ bylo\nproto nastaveno dočasné heslo „$3“. Pokud jste to byl(a) vy, můžete se\nnyní přihlásit a zvolit si nové heslo. Platnost tohoto dočasného hesla\nvyprší za {{PLURAL:$5|jeden den|$5 dny|$5 dní}}.\n\nPokud jste o změnu hesla nežádal(a) nebo jste si na původní heslo již\nvzpomněl(a) a už ho změnit nechcete, můžete tuto zprávu ignorovat\na používat staré heslo.",
+    "passwordremindertext": "Někdo (patrně vy, z IP adresy $1) požádal o nové heslo\npro přihlášení do {{grammar:2sg|{{SITENAME}}}} ($4). Uživateli „$2“ bylo\nproto nastaveno dočasné heslo „$3“. Pokud jste to byl(a) vy, můžete se\nnyní přihlásit a zvolit si nové heslo. Platnost tohoto dočasného hesla\nvyprší za {{PLURAL:$5|jeden den|$5 dny|$5 dní}}.\n\nPokud jste o změnu hesla nežádal(a) nebo jste si na původní heslo již\nvzpomněl(a) a už ho změnit nechcete, můžete tuto zprávu ignorovat\na používat staré heslo.",
     "noemail": "Uživatel „$1“ nemá zaregistrovanou e-mailovou adresu.",
     "noemailcreate": "Musíte uvést platnou e-mailovou adresu",
     "passwordsent": "Dočasné heslo bylo zasláno na e-mailovou adresu registrovanou pro „$1“. Přihlaste se, prosím, znovu, jakmile ho obdržíte.",
     "eauthentsent": "Na zadanou adresu byl zaslán potvrzovací e-mail.\nŽádné další zprávy vám však na tuto adresu nebudou odeslány, dokud podle instrukcí v e-mailu nepotvrdíte, že tato adresa skutečně patří vám.",
     "throttled-mailpassword": "Během {{PLURAL:$1|poslední hodiny|posledních $1 hodin}} již bylo heslo jednou zasláno.\nKvůli prevenci zneužívání lze heslo zaslat jen jednou za $1 {{PLURAL:$1|hodinu|hodiny|hodin}}.",
     "mailerror": "Chyba při zasílání e-mailu: $1",
-    "acct_creation_throttle_hit": "Uživatelé přicházející z vaší IP adresy už dnes vytvořili $1 {{PLURAL:$1|účet|účty|účtů}}, což je dovolené maximum. Proto v tuto chvíli není dovoleno z této IP adresy další účty zakládat.",
+    "acct_creation_throttle_hit": "Uživatelé používající vaši IP adresu už dnes vytvořili $1 {{PLURAL:$1|účet|účty|účtů}}, což je dovolené maximum. Proto není v tuto chvíli dovoleno z této IP adresy zakládat další účty.",
     "emailauthenticated": "Vaše e-mailová adresa byla ověřena $2 v $3.",
     "emailnotauthenticated": "Vaše e-mailová adresa dosud nebyla ověřena.\nU následujících funkcí nebudou zasílány žádné e-maily.",
     "noemailprefs": "Pro zprovoznění následujících možností musíte zadat svou e-mailovou adresu.",
     "accountcreated": "Účet vytvořen",
     "accountcreatedtext": "Uživatelský účet [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|diskuse]]) byl vytvořen.",
     "createaccount-title": "Vytvoření účtu na {{grammar:6sg|{{SITENAME}}}}",
-    "createaccount-text": "Někdo vytvořil na {{grammar:6sg|{{SITENAME}}}} ($4) účet s vaší e-mailovou adresou.\nJméno účtu: „$2“\nHeslo: „$3“\nMěli byste se co nejdřív přihlásit a změnit si heslo.\n\nPokud byl účet vytvořen omylem, považujte tuto zprávu za bezpředmětnou.",
-    "usernamehasherror": "Uživatelské jméno nemůže obsahovat znak mřížka (#)",
+    "createaccount-text": "Někdo na {{grammar:6sg|{{SITENAME}}}} ($4) vytvořil účet s vaší e-mailovou adresou.\nJméno účtu: „$2“\nHeslo: „$3“\nMěli byste se co nejdřív přihlásit a změnit si heslo.\n\nPokud byl účet vytvořen omylem, považujte tuto zprávu za bezpředmětnou.",
     "login-throttled": "Provedli jste příliš mnoho pokusů o přihlášení.\nNež to zkusíte znovu, musíte počkat na vypršení lhůty $1.",
     "login-abort-generic": "Vaše přihlášení se nezdařilo – přerušeno",
     "loginlanguagelabel": "Jazyk: $1",
     "resetpass-submit-cancel": "Storno",
     "resetpass-wrong-oldpass": "Nesprávné dočasné nebo aktuální heslo.\nMožná jste si již úspěšně heslo změnili, nebo jste si vyžádali nové dočasné heslo.",
     "resetpass-recycled": "Jako nové heslo si prosím nastavte něco jiného než stávající heslo.",
-    "resetpass-temp-emailed": "Přihlašujete se dočasným heslem zaslaným e-mailem.\nAbyste dokončili přihlášení, nastavte si zde nové heslo:",
+    "resetpass-temp-emailed": "Přihlašujete se dočasným heslem, zaslaným e-mailem.\nAbyste dokončili přihlášení, nastavte si zde nové heslo:",
     "resetpass-temp-password": "Dočasné heslo:",
     "resetpass-abort-generic": "Změna hesla byla zablokována rozšířením.",
     "resetpass-expired": "Platnost vašeho hesla vypršela. Pro přihlášení si nastavte nové heslo.",
     "passwordreset-capture-help": "Pokud zaškrtnete toto políčko, bude e-mail (s dočasným heslem) kromě zaslání uživateli zobrazen i vám.",
     "passwordreset-email": "E-mailová adresa:",
     "passwordreset-emailtitle": "Informace k účtu na {{grammar:6sg|{{SITENAME}}}}",
-    "passwordreset-emailtext-ip": "Někdo (patrně vy, z IP adresy $1) zažádal o nastavení nového hesla k vašemu účtu na {{grammar:6sg|{{SITENAME}}}} ($4). K této adrese {{PLURAL:$3|je přiřazen následující účet|jsou přiřazeny následující účty}}:\n\n$2\n\n{{PLURAL:$3|Toto dočasné heslo|Tato dočasná hesla}} vyprší {{PLURAL:$5|za jeden den|za $5 dny|za $5 dnů}}.\nNyní byste se měl(a) přihlásit a zvolit si nové heslo. Pokud tento požadavek\nposlal někdo jiný nebo jste si na své staré heslo vzpomněl(a), a nechcete ho\ntedy změnit, můžete tuto zprávu ignorovat a nadále používat původní heslo.",
-    "passwordreset-emailtext-user": "{{gender:$1|Uživatel|Uživatelka}} $1 na {{grammar:6sg|{{SITENAME}}}} {{gender:$1|zažádal|zažádala}} o nastavení nového hesla k vašemu\núčtu na {{grammar:6sg|{{SITENAME}}}} ($4). K této adrese {{PLURAL:$3|je přiřazen následující účet|jsou přiřazeny následující účty}}:\n\n$2\n\n{{PLURAL:$3|Toto dočasné heslo|Tato dočasná hesla}} vyprší {{PLURAL:$5|za jeden den|za $5 dny|za $5 dnů}}.\nNyní byste se měl(a) přihlásit a zvolit si nové heslo. Pokud tento požadavek\nposlal někdo jiný nebo jste si na své staré heslo vzpomněl(a), a nechcete ho\ntedy změnit, můžete tuto zprávu ignorovat a nadále používat původní heslo.",
+    "passwordreset-emailtext-ip": "Někdo (patrně vy, z IP adresy $1) zažádal na {{grammar:6sg|{{SITENAME}}}} ($4) o nastavení nového hesla k vašemu účtu. K této adrese {{PLURAL:$3|je přiřazen následující účet|jsou přiřazeny následující účty}}:\n\n$2\n\n{{PLURAL:$3|Toto dočasné heslo|Tato dočasná hesla}} vyprší {{PLURAL:$5|za jeden den|za $5 dny|za $5 dnů}}.\nNyní byste se měl(a) přihlásit a zvolit si nové heslo. Pokud tento požadavek\nposlal někdo jiný nebo jste si na své staré heslo vzpomněl(a), a nechcete ho\ntedy změnit, můžete tuto zprávu ignorovat a nadále používat původní heslo.",
+    "passwordreset-emailtext-user": "{{gender:$1|Uživatel|Uživatelka}} $1 na {{grammar:6sg|{{SITENAME}}}} {{gender:$1|zažádal|zažádala}} na {{grammar:6sg|{{SITENAME}}}} ($4) o nastavení nového hesla k vašemu\núčtu. K této adrese {{PLURAL:$3|je přiřazen následující účet|jsou přiřazeny následující účty}}:\n\n$2\n\n{{PLURAL:$3|Toto dočasné heslo|Tato dočasná hesla}} vyprší {{PLURAL:$5|za jeden den|za $5 dny|za $5 dnů}}.\nNyní byste se měl(a) přihlásit a zvolit si nové heslo. Pokud tento požadavek\nposlal někdo jiný nebo jste si na své staré heslo vzpomněl(a), a nechcete ho\ntedy změnit, můžete tuto zprávu ignorovat a nadále používat původní heslo.",
     "passwordreset-emailelement": "Uživatelské jméno: $1\nDočasné heslo: $2",
     "passwordreset-emailsent": "E-mail pro získání nového hesla byl odeslán.",
     "passwordreset-emailsent-capture": "Byl odeslán e-mail pro získání nového hesla, který je zobrazen níže.",
-    "passwordreset-emailerror-capture": "Byl vygenerován e-mail pro získání nového hesla, který je zobrazen níže, ale nepodařilo se ho odeslat {{GENDER:$2|uživateli|uživatelce}}: $1",
+    "passwordreset-emailerror-capture": "Byl vygenerován e-mail pro získání nového hesla, který je zobrazen níže, ale {{GENDER:$2|uživateli|uživatelce}} se ho nepodařilo odeslat: $1",
     "changeemail": "Změna e-mailové adresy",
     "changeemail-header": "Změna e-mailové adresy k účtu",
     "changeemail-text": "Vyplněním tohoto formuláře si změníte e-mailovou adresu. Pro potvrzení změny budete muset zadat své heslo.",
     "anontalkpagetext": "----''Toto je diskusní stránka anonymního uživatele, který si dosud nevytvořil účet nebo ho nepoužívá. K&nbsp;jeho identifikaci proto musíme používat číselnou IP adresu. Takovou IP adresu může sdílet několik uživatelů. Pokud jste anonymní uživatel a&nbsp;máte za to, že jsou vám adresovány irelevantní komentáře, prosíme, [[Special:UserLogin/signup|vytvořte si účet]] nebo [[Special:UserLogin|se přihlaste]], vyhnete se tím budoucí záměně s&nbsp;jinými anonymními uživateli.''",
     "noarticletext": "Tato stránka zatím neobsahuje žádný text.\nMůžete [[Special:Search/{{PAGENAME}}|zkusit tento název vyhledat]] na jiných stránkách, <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} prohlédnout si příslušné protokolovací záznamy] nebo [{{fullurl:{{FULLPAGENAME}}|action=edit}} tuto stránku založit]</span>.",
     "noarticletext-nopermission": "Tato stránka zatím neobsahuje žádný text.\nMůžete [[Special:Search/{{PAGENAME}}|zkusit tento název vyhledat]] na jiných stránkách nebo <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} si prohlédnout příslušné protokolovací záznamy]</span>, ale na založení této stránky nemáte oprávnění.",
-    "missing-revision": "Revize #$1 stránky s názvem „{{FULLPAGENAME}}“ neexistuje.\n\nToto je obvykle způsobeno tím, že jste následovali zastaralý odkaz historickou verzi stránky, jež byla smazána.\nPodrobnosti mohou být uvedeny v [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} knize smazaných stránek].",
+    "missing-revision": "Revize #$1 stránky s názvem „{{FULLPAGENAME}}“ neexistuje.\n\nToto je obvykle způsobeno tím, že jste následovali zastaralý odkaz na historickou verzi stránky, jež byla smazána.\nPodrobnosti mohou být uvedeny v [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} knize smazaných stránek].",
     "userpage-userdoesnotexist": "Uživatelský účet „<nowiki>$1</nowiki>“ není zaregistrován. Zkontrolujte zda skutečně chcete vytvořit či editovat tuto stránku.",
     "userpage-userdoesnotexist-view": "Uživatelský účet „$1“ není zaregistrován.",
     "blocked-notice-logextract": "Tento uživatel je momentálně zablokován.\nZde je pro přehled zobrazen nejnovější záznam z knihy zablokování:",
     "previewconflict": "Tento náhled ukazuje text tak, jak bude vypadat po uložení stránky.",
     "session_fail_preview": "'''Váš požadavek se nepodařilo zpracovat kvůli ztrátě dat z relace.\nZkuste to prosím znovu.\nPokud se tento problém bude opakovat, zkuste se [[Special:UserLogout|odhlásit]] a znovu přihlásit.'''",
     "session_fail_preview_html": "'''Váš požadavek se nepodařilo zpracovat kvůli ztrátě dat z relace.'''\n\n''Jelikož má {{SITENAME}} zapnuto používání neomezeného HTML, náhled se kvůli prevenci proti útokům JavaScriptem nezobrazuje.''\n\n'''Pokud jde o zamýšlenou editaci, zkuste to prosím znovu. Pokud se tento problém bude opakovat, zkuste se [[Special:UserLogout|odhlásit]] a znovu přihlásit.'''",
-    "token_suffix_mismatch": "'''Vaše editace byla odmítnuta, protože Váš prohlížeč komolí některé znaky v editovaném textu.\nEditace byla odmítnuta, aby se zabránilo poškození textu stránky.\nToto se může někdy stát pokud používáte chybující webový anonymizér.'''",
+    "token_suffix_mismatch": "'''Vaše editace byla odmítnuta, protože Váš prohlížeč komolí některé znaky v editovaném textu.\nEditace byla odmítnuta, aby se zabránilo poškození textu stránky.\nToto se někdy může někdy stát, používáte-li chybující webový anonymizér.'''",
     "edit_form_incomplete": "'''Část editačního formuláře nedorazila na server; překontrolujte úplnost změn a zkuste to znovu.'''",
     "editing": "Editace stránky $1",
     "creating": "Vytváření $1",
     "editingold": "'''VAROVÁNÍ: Nyní editujete zastaralou verzi této stránky. Když ji uložíte, všechny pozdější změny se ztratí.'''",
     "yourdiff": "Rozdíly",
     "copyrightwarning": "Všechny příspěvky do {{grammar:2sg|{{SITENAME}}}} jsou zveřejňovány podle $2 (podrobnosti najdete na $1).\nPokud si nepřejete, aby váš text byl nemilosrdně upravován a volně šířen, pak ho do {{grammar:2sg|{{SITENAME}}}} neukládejte.<br />\nUložením příspěvku se zavazujete, že je vaším dílem nebo je zkopírován ze zdrojů, které nejsou chráněny autorským právem (tzv. <em>public domain</em>).\n'''NEVKLÁDEJTE DÍLA CHRÁNĚNÁ AUTORSKÝM PRÁVEM BEZ DOVOLENÍ!'''",
-    "copyrightwarning2": "Uvědomte si, že všechny příspěvky do {{grammar:2sg|{{SITENAME}}}} mohou být ostatními uživateli upraveny, pozměněny či odstraněny. Pokud si nepřejete, aby váš text byl nemilosrdně upravován, pak ho do {{grammar:2sg|{{SITENAME}}}} neukládejte.<br />\nUložením příspěvku se zavazujete, že je vaším dílem nebo je zkopírován ze zdrojů, které nejsou chráněny autorským právem (tzv. <em>public domain</em>), podrobnosti najdete na $1. '''Nekopírujte díla chráněná autorským právem bez dovolení!'''",
+    "copyrightwarning2": "Uvědomte si, že všechny příspěvky do {{grammar:2sg|{{SITENAME}}}} mohou být ostatními uživateli upraveny, pozměněny či odstraněny. Pokud si nepřejete, aby váš text byl nemilosrdně upravován, pak ho do {{grammar:2sg|{{SITENAME}}}} neukládejte.<br />\nUložením příspěvku se zavazujete, že je vaším dílem nebo je zkopírován ze zdrojů, které nejsou chráněny autorským právem (tzv. <em>public domain</em>); podrobnosti najdete na $1. '''Nekopírujte díla chráněná autorským právem bez dovolení!'''",
     "longpageerror": "'''Chyba: Pokoušíte se uložit text o velikosti {{PLURAL:$1|$1 KiB}}, přičemž dovolené maximum je {{PLURAL:$2|$2 KiB}}.'''\nVaše změna nemůže být uložena.",
-    "readonlywarning": "'''Varování: Databáze byla uzamčena kvůli údržbě, takže momentálně nebudete moci uložit své změny.'''\nMůžete si okopírovat text do souboru a uložit ho na později.\n\nSprávce serveru, který databázi zamkl, poskytl toto zdůvodnění: $1",
+    "readonlywarning": "<strong>Varování: Databáze byla uzamčena kvůli údržbě, takže momentálně nebudete moci uložit své změny.</strong>\nMůžete si okopírovat text do souboru a uložit si ho na později.\n\nSprávce serveru, který databázi zamkl, poskytl toto zdůvodnění: $1",
     "protectedpagewarning": "'''Varování: Tato stránka byla zamčena, takže ji mohou editovat pouze správci.'''\nNíže je pro přehled zobrazen nejnovější protokolovací záznam:",
     "semiprotectedpagewarning": "'''Poznámka:''' Tato stránka byla zamčena, takže ji mohou editovat pouze registrovaní uživatelé.\nNíže je pro přehled zobrazen nejnovější protokolovací záznam:",
     "cascadeprotectedwarning": "'''Varování:''' Tato stránka byla zamčena, takže ji mohou editovat pouze správci. Je vložena na následující, kaskádním zámkem  {{PLURAL:$1|zamčenou, stránku|zamčené, stránky|zamčené, stránky}}:",
     "revdelete-radio-set": "Skrytý",
     "revdelete-radio-unset": "Viditelný",
     "revdelete-suppress": "Utajit data i před správci",
-    "revdelete-unsuppress": "Odstranit omezení na vrácené verze",
+    "revdelete-unsuppress": "Odstranit omezení na obnovených revizích",
     "revdelete-log": "Důvod:",
     "revdelete-submit": "Aplikovat na {{PLURAL:$1|zvolenou revizi|zvolené revize}}",
     "revdelete-success": "'''Viditelnost revize úspěšně nastavena.'''",
     "revdelete-modify-missing": "Chyba při změně položky s ID $1: položka nenalezena v databázi!",
     "revdelete-no-change": "'''Upozornění:''' položka z $1 $2 už měla viditelnost nastavenou tak, jak bylo požadováno.",
     "revdelete-concurrent-change": "Chyba při změně položky z $1 $2: zdá se, že mezitím její stav změnil někdo jiný.\nProhlédněte si protokolovací záznamy.",
-    "revdelete-only-restricted": "Chyba skrývání položky z $2 $1: Nemůžete položky pouze skrýt před správci, aniž byste současně vybrali i některou z dalších možností utajení.",
+    "revdelete-only-restricted": "Chyba skrývání položky z $2 $1: Položky před správci nemůžete skrýt, aniž byste současně vybrali i některou z dalších možností utajení.",
     "revdelete-reason-dropdown": "*Obvyklé důvody smazání\n** Porušení autorských práv\n** Nevhodné komentáře nebo osobní údaje\n** Nevhodné uživatelské jméno\n** Potenciálně pomlouvačné údaje",
     "revdelete-otherreason": "Jiný/další důvod:",
     "revdelete-reasonotherlist": "Jiný důvod",
     "showhideselectedversions": "Zobrazit/skrýt vybrané revize",
     "editundo": "zrušit editaci",
     "diff-empty": "(Žádný rozdíl)",
-    "diff-multi-sameuser": "({{PLURAL:$1|Není zobrazena 1 mezilehlá verze|Nejsou zobrazeny $1 mezilehlé verze|Není zobrazeno $1 mezilehlých verzí}} od stejného uživatele.)",
-    "diff-multi-otherusers": "({{PLURAL:$1|Není zobrazena 1 mezilehlá verze|Nejsou zobrazeny $1 mezilehlé verze|Není zobrazeno $1 mezilehlých verzí}} od {{PLURAL:$2|1 dalšího uživatele|$2 dalších uživatelů}}.)",
-    "diff-multi-manyusers": "(Není zobrazeno $1 mezilehlých verzí od více než $2 {{PLURAL:$2|uživatele|uživatelů}}.)",
-    "difference-missing-revision": "{{PLURAL:$2|Jedna z revizí|$2 revize|$2 revizí}} k požadovanému porovnání ($1) {{PLURAL:$2|neexistuje|neexistují|neexistuje}}.\n\nToto je obvykle způsobeno tím, že jste následovali zastaralý odkaz historickou verzi stránky, jež byla smazána.\nPodrobnosti mohou být uvedeny v [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} knize smazaných stránek].",
+    "diff-multi-sameuser": "({{PLURAL:$1|Není zobrazena jedna mezilehlá verze|Nejsou zobrazeny $1 mezilehlé verze|Není zobrazeno $1 mezilehlých verzí}} od stejného uživatele.)",
+    "diff-multi-otherusers": "({{PLURAL:$1|Není zobrazena jedna mezilehlá verze|Nejsou zobrazeny $1 mezilehlé verze|Není zobrazeno $1 mezilehlých verzí}} od {{PLURAL:$2|jednoho dalšího uživatele|$2 dalších uživatelů}}.)",
+    "diff-multi-manyusers": "({{PLURAL:$1|Není zobrazena 1 mezilehlá verze|Nejsou zobrazeny $1 mezilehlé verze|Není zobrazeno $1 mezilehlých verzí}} od více než {{PLURAL:$2|1 uživatele|$2 uživatelů}}.)",
+    "difference-missing-revision": "{{PLURAL:$2|Jedna z revizí|$2 revize|$2 revizí}} k požadovanému porovnání ($1) {{PLURAL:$2|neexistuje|neexistují|neexistuje}}.\n\nToto je obvykle způsobeno tím, že jste následovali zastaralý odkaz na historickou verzi stránky, jež byla smazána.\nPodrobnosti mohou být uvedeny v [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} knize smazaných stránek].",
     "searchresults": "Výsledky hledání",
     "searchresults-title": "Výsledky hledání „$1“",
     "toomanymatches": "Požadavku odpovídá příliš mnoho záznamů, zkuste jiný dotaz.",
     "prefs-skin": "Vzhled",
     "skin-preview": "Náhled",
     "datedefault": "Implicitní",
-    "prefs-beta": "Funkce z betaverze",
-    "prefs-datetime": "Datum a čas",
     "prefs-labs": "Funkce z Labs",
     "prefs-user-pages": "Uživatelské stránky",
     "prefs-personal": "Údaje o uživateli",
     "right-suppressredirect": "Nevytváření přesměrování po přesunu stránky",
     "right-upload": "Nahrávání souborů",
     "right-reupload": "Přepisování existujících souborů",
-    "right-reupload-own": "Přepisování souborů nahraných sám sebou",
+    "right-reupload-own": "Přepisování souborů nahraných sebou samotným",
     "right-reupload-shared": "Nahrávání lokálních souborů k potlačení těch ve sdíleném úložišti",
     "right-upload_by_url": "Nahrávání souborů z URL adres",
     "right-purge": "Vyčištění vyrovnávací paměti stránky bez potvrzovacího dialogu",
     "right-editusercssjs": "Editace CSS a JS souborů jiných uživatelů",
     "right-editusercss": "Editace CSS souborů jiných uživatelů",
     "right-edituserjs": "Editace JavaScriptových souborů jiných uživatelů",
-    "right-editmyusercss": "Editace vašich uživatelských CSS souborů",
-    "right-editmyuserjs": "Editace vašich uživatelských JavaScriptových souborů",
+    "right-editmyusercss": "Editace vlastních uživatelských CSS souborů",
+    "right-editmyuserjs": "Editace vlastních uživatelských JavaScriptových souborů",
     "right-viewmywatchlist": "Prohlížení vlastního seznamu sledovaných stránek",
     "right-editmywatchlist": "Editace vlastního seznamu sledovaných stránek. Uvědomte si, že některé akce do něj mohou přidat stránky i bez tohoto oprávnění.",
     "right-viewmyprivateinfo": "Prohlížení vlastních soukromých údajů (např. e-mailová adresa, skutečné jméno)",
     "action-browsearchive": "hledat smazané stránky",
     "action-undelete": "obnovit tuto stránku",
     "action-suppressrevision": "zkontrolovat a obnovit tuto skrytou revizi",
-    "action-suppressionlog": "prohlížet si tento skrytý protokolovací záznam",
+    "action-suppressionlog": "prohlédnout si tento skrytý protokolovací záznam",
     "action-block": "znemožnit tomuto uživateli editování",
     "action-protect": "změnit úrovně ochrany této stránky",
     "action-rollback": "rychle revertovat úpravy posledního uživatele editujícího danou stránku",
     "enhancedrc-history": "historie",
     "recentchanges": "Poslední změny",
     "recentchanges-legend": "Možnosti posledních změn",
-    "recentchanges-summary": "Sledujte poslední změny na {{grammar:6sg|{{SITENAME}}}} na této stránce.",
+    "recentchanges-summary": "Na této stránce sledujte poslední změny na {{grammar:6sg|{{SITENAME}}}}.",
     "recentchanges-noresult": "V daném období neodpovídaly zadaným kritériím žádné změny.",
     "recentchanges-feed-description": "Na tomto kanále sledujte poslední změny na {{grammar:6sg|{{SITENAME}}}}.",
     "recentchanges-label-newpage": "Touto editací byla založena nová stránka",
     "upload_directory_read_only": "Do adresáře pro načítané soubory ($1) nemá webserver právo zápisu.",
     "uploaderror": "Při načítání došlo k chybě",
     "upload-recreate-warning": "'''Upozornění: Soubor pod tímto názvem byl dříve smazán či přejmenován.'''\n\nZde je pro přehled zobrazen soupis mazání a přesunů této stránky:",
-    "uploadtext": "Níže uvedený formulář slouží k načtení souborů. Již načtené soubory si můžete prohlížet a hledat pomocí [[Special:FileList|seznamu načtených souborů]], každé načtení se také zaznamenává do [[Special:Log/upload|knihy načtení]], smazání jsou v [[Special:Log/delete|knize smazaných stránek]].\n\nPro vložení obrázku do stránky použijte jeden z následujících způsobů zápisu:\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Soubor.jpg]]</nowiki></code>''' do stránky vloží celý obrázek,\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Soubor.png|thumb|left|Popisek]]</nowiki></code>''' vloží náhled v rámečku zarovnaném na levý okraj, s popiskem „Popisek“,\n* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:Soubor.ogg]]</nowiki></code>''' vloží přímý odkaz na soubor, aniž by se zobrazoval ve stránce.",
+    "uploadtext": "Níže uvedený formulář slouží k načtení souborů. Již načtené soubory si můžete prohlížet a hledat pomocí [[Special:FileList|seznamu načtených souborů]], každé načtení se také zaznamenává do [[Special:Log/upload|knihy nahrávek]], smazání jsou v [[Special:Log/delete|knize smazaných stránek]].\n\nPro vložení obrázku do stránky použijte jeden z následujících způsobů zápisu:\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Soubor.jpg]]</nowiki></code>''' do stránky vloží celý obrázek,\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Soubor.png|thumb|left|Popisek]]</nowiki></code>''' vloží náhled v rámečku zarovnaném na levý okraj, s popiskem „Popisek“,\n* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:Soubor.ogg]]</nowiki></code>''' vloží přímý odkaz na soubor, aniž by se ten na stránce zobrazoval.",
     "upload-permitted": "Povolené formáty souborů: $1.",
     "upload-preferred": "Upřednostňované formáty souborů: $1.",
     "upload-prohibited": "Zakázané formáty souborů: $1.",
-    "uploadlog": "kniha nahrávek",
     "uploadlogpage": "Kniha nahrávek",
     "uploadlogpagetext": "Níže najdete seznam nejnovějších souborů.",
     "filename": "Soubor",
     "filereuploadsummary": "Změny v souboru:",
     "filestatus": "Autorská práva:",
     "filesource": "Zdroj:",
-    "uploadedfiles": "Načtené soubory",
     "ignorewarning": "Ignorovat varování a načíst soubor.",
     "ignorewarnings": "Ignorovat všechna varování",
     "minlength1": "Jméno souboru musí mít alespoň jeden znak.",
     "overwroteimage": "načtena nová verze \"[[$1]]\"",
     "uploaddisabled": "Načítání souborů vypnuto.",
     "copyuploaddisabled": "Načítání souborů prostřednictvím URL je vypnuto.",
-    "uploadfromurl-queued": "Váš požadavek na načtení souboru byl uložen do fronty.",
     "uploaddisabledtext": "Načítání souborů je vypnuto.",
     "php-uploaddisabledtext": "V PHP je vypnuto načítání souborů. Prosím, zkontrolujte nastavení file_uploads.",
     "uploadscripted": "Tento soubor obsahuje HTML nebo kód skriptu, který by mohl být prohlížečem chybně interpretován.",
     "upload-options": "Možnosti načtení",
     "watchthisupload": "Sledovat tento soubor",
     "filewasdeleted": "Soubor stejného jména byl již dříve načten a posléze smazán. Podrobnosti obsahuje $1.",
-    "filename-bad-prefix": "Jméno souboru, který naÄ\8dítáte, zaÄ\8díná na '''â\80\9e$1â\80\9c''', což je nevhodné jméno, obvykle automaticky pÅ\99\99azované digitálním fotoaparátem. Zvolte jméno, která váš soubor lépe popíše.",
+    "filename-bad-prefix": "Jméno souboru, který naÄ\8dítáte, zaÄ\8díná na '''â\80\9e$1â\80\9c''', což je nevhodné jméno, obvykle automaticky pÅ\99\99azované digitálním fotoaparátem. Zvolte jméno, které váš soubor popíše lépe.",
     "filename-prefix-blacklist": " #<!-- tuto řádku ponechte beze změny --> <pre>\n# Používá se následující syntaxe:\n#   * Cokoli od znaku „#“ až do konce řádky je komentář\n#   * Každá neprázdná řádka je prefix typických jmen souborů automaticky generovaných digitálními fotoaparáty\nCIMG # Casio\nDSC_ # Nikon\nDSCF # Fuji\nDSCN # Nikon\nDUW # některé mobilní telefony\nIMG # obecné\nJD # Jenoptik\nMGP # Pentax\nPICT # různé\n #</pre> <!-- tuto řádku ponechte beze změny -->",
     "upload-success-subj": "Načtení úspěšně provedeno!",
     "upload-success-msg": "Soubor vámi načtený z [$2] je dostupný na [[:{{ns:file}}:$1]]",
     "upload-misc-error": "Neznámá chyba",
     "upload-misc-error-text": "Neznámá chyba se vyskytla během nahrávání souboru.  Zkontrolujte zda je URL platná a přístupné a zkuste to znovu.  Pokud se chyba znovu objeví, kontaktuje [[Special:ListUsers/sysop|správce]].",
     "upload-too-many-redirects": "URL obsahovalo příliš mnoho přesměrování",
-    "upload-unknown-size": "Neznámá velikost",
     "upload-http-error": "Došlo k chybě HTTP: $1",
     "upload-copy-upload-invalid-domain": "Načítání kopírováním není dostupné z této domény.",
     "backend-fail-stream": "Soubor $1 nelze streamovat.",
     "img-auth-streaming": "Přenáší se „$1“.",
     "img-auth-public": "Pomocí img_auth.php se poskytují soubory na soukromých wiki.\nTato wiki je nastavena jako veřejná.\nZ bezpečnostních důvodů je img_auth.php vypnuto.",
     "img-auth-noread": "Uživatel nemá oprávnění ke čtení „$1“.",
-    "img-auth-bad-query-string": "URL obsahuje neplatný dotaz.",
     "http-invalid-url": "Neplatné URL: $1",
     "http-invalid-scheme": "URL používající schéma „$1“ nejsou podporována",
     "http-request-error": "Neznámá chyba při odesílání požadavku.",
     "http-curl-error": "Chyba při čtení z URL: $1",
     "http-bad-status": "Při provádění HTTP požadavku nastal problém: $1 $2",
     "upload-curl-error6": "Z URL nelze číst",
-    "upload-curl-error6-text": "Ze zadané URL nelze číst.  Zkontrolujte ža URL je správně napsané a server je dostupný",
+    "upload-curl-error6-text": "Zadané URL není dostupné.\nZkontrolujte, zda je URL správné a server funguje.",
     "upload-curl-error28": "Čas pro nahrání vypršel",
-    "upload-curl-error28-text": "Serveru dlouho neodpovídá. Zkontrolujte, že server je dostupný, počkejte chvíli a zkuste to znovu.",
+    "upload-curl-error28-text": "Server dlouho neodpovídá.\nZkontrolujte, zda funguje, chvíli počkejte a zkuste to znovu.\nMožná to budete chtít zkusit v době menšího provozu.",
     "license": "Licence:",
     "license-header": "Licence",
     "nolicense": "Bez udání licence",
     "filehist-dimensions": "Rozměry",
     "filehist-filesize": "Velikost souboru",
     "filehist-comment": "Komentář",
-    "filehist-missing": "Soubor chybí",
     "imagelinks": "Využití souboru",
     "linkstoimage": "Na soubor {{PLURAL:$1|odkazuje tato stránka|odkazují tyto $1 stránky|odkazuje těchto $1 stránek}}:",
     "linkstoimage-more": "Na tento soubor {{PLURAL:$1|odkazuje více stránek|odkazují více než $1 stránky|odkazuje více než $1 stránek}}.\nNásledující seznam zobrazuje pouze {{PLURAL:$1|tu první|první $1|prvních $1}}.\nMůžete si prohlédnout [[Special:WhatLinksHere/$2|úplný seznam]].",
     "listgrouprights-removegroup-self": "Vyřazení svého účtu ze {{PLURAL:$2|skupiny|skupin}} $1",
     "listgrouprights-addgroup-self-all": "Přidání svého účtu do libovolné skupiny",
     "listgrouprights-removegroup-self-all": "Vyřazení svého účtu z libovolné skupiny",
+    "listgrouprights-namespaceprotection-header": "Omezení jmenných prostorů",
+    "listgrouprights-namespaceprotection-namespace": "Jmenný prostor",
+    "listgrouprights-namespaceprotection-restrictedto": "Oprávnění umožňující uživateli editovat",
+    "trackingcategories": "Sledovací kategorie",
+    "trackingcategories-summary": "Tato stránka obsahuje seznam sledovacích kategorií, které automaticky přidává software MediaWiki. Jejich jména lze změnit úpravou příslušných systémových hlášení ve jmenném prostoru {{ns:8}}.",
+    "trackingcategories-msg": "Sledovací kategorie",
+    "trackingcategories-name": "Název hlášení",
+    "trackingcategories-desc": "Kritéria pro vložení do kategorie",
+    "noindex-category-desc": "Stránka není indexována roboty, protože obsahuje kouzelné slovo <code><nowiki>__NOINDEX__</nowiki></code> a je ve jmenném prostoru, ve kterém je tento příznak dovolen.",
+    "index-category-desc": "Stránka obsahuje kouzelné slovo <code><nowiki>__INDEX__</nowiki></code> (a je ve jmenném prostoru, ve kterém je tento příznak dovolen), takže je indexována roboty, přestože by normálně nebyla.",
+    "post-expand-template-inclusion-category-desc": "Po rozbalení všech šablon je stránka větší než <code>$wgMaxArticleSize</code>, takže některé šablony rozbaleny nebyly.",
+    "post-expand-template-argument-category-desc": "Po rozbalení argumentu šablony (něco v trojitých závorkách, např. <code>{{{Foo}}})</code> je stránka větší než <code>$wgMaxArticleSize</code>.",
+    "expensive-parserfunction-category-desc": "Na stránce je použito příliš mnoho náročných funkcí parseru (jako <code>#ifexist</code>). Vizte [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit Manual:$wgExpensiveParserFunctionLimit].",
+    "broken-file-category-desc": "Kategorie přidaná pokud stránka obsahuje nefunkční odkaz na soubor (odkaz pro vložení souboru, který neexistuje).",
+    "hidden-category-category-desc": "Toto je kategorie, která obsahuje <code><nowiki>__HIDDENCAT__</nowiki></code>, což způsobuje, že se na stránkách implicitně nezobrazuje v rámečku odkazů na kategorie.",
+    "trackingcategories-nodesc": "Popis není k dispozici.",
+    "trackingcategories-disabled": "Kategorie je vypnuta",
     "mailnologin": "Bez odesílací adresy",
     "mailnologintext": "Pokud chcete posílat e-maily jiným uživatelům, musíte se [[Special:UserLogin|přihlásit]] a mít platnou e-mailovou adresu ve svém [[Special:Preferences|nastavení]].",
     "emailuser": "Poslat e-mail",
     "emailuser-title-notarget": "Poslat e-mail uživateli",
     "emailpage": "Poslat e-mail",
     "emailpagetext": "Pomocí níže zobrazeného formuláře můžete {{GENDER:$1|tomuto uživateli|této uživatelce}} poslat zprávu e-mailem.\nE-mailová adresa, kterou máte uvedenu v [[Special:Preferences|nastavení]], se objeví jako adresa odesílatele pošty, aby vám adresát mohl odpovědět přímo.",
-    "usermailererror": "Chyba poštovního programu:",
     "defemailsubject": "E-mail z {{grammar:2sg|{{SITENAME}}}} od {{gender:$1|uživatele|uživatelky|uživatele}} „$1“",
     "usermaildisabled": "Posílání e-mailů je vypnuto",
     "usermaildisabledtext": "Nemáte oprávnění odesílat e-maily ostatním uživatelům této wiki",
     "noemailtitle": "Bez e-mailové adresy",
     "noemailtext": "Tento uživatel nezadal platnou e-mailovou adresu.",
-    "nowikiemailtitle": "E-mail není povolen",
     "nowikiemailtext": "Tento uživatel si nepřeje dostávat e-maily od ostatních uživatelů.",
     "emailnotarget": "Neexistující nebo neplatné uživatelské jméno příjemce.",
     "emailtarget": "Zadejte uživatelské jméno příjemce",
     "nowatchlist": "Na svém seznamu sledovaných stránek nemáte žádné položky.",
     "watchlistanontext": "Pro prohlížení či úpravu seznamu sledovaných stránek se musíte $1.",
     "watchnologin": "Nejste přihlášen(a)",
-    "watchnologintext": "Pro sledování stránek se musíte [[Special:UserLogin|přihlásit]].",
     "addwatch": "Přidat do sledovaných stránek",
     "addedwatchtext": "Stránka „[[:$1]]“ byla přidána mezi stránky, které sledujete.\nVe [[Special:Watchlist|sledovaných stránkách]] se tak budou objevovat budoucí změny této stránky a přidružené diskuse.",
     "removewatch": "Vyřadit ze sledovaných stránek",
     "unwatchthispage": "Nesledovat tuto stránku",
     "notanarticle": "Toto není stránka",
     "notvisiblerev": "Verze byla smazána",
-    "watchlist-details": "Na vašem seznamu sledovaných stránek {{PLURAL:$1|je $1 stránka|jsou $1 stránky|je $1 stránek}}, nepočítají se diskusní stránky.",
+    "watchlist-details": "Na vašem seznamu sledovaných stránek {{PLURAL:$1|je $1 stránka|jsou $1 stránky|je $1 stránek}}, nepočítaje v to diskusní stránky.",
     "wlheader-enotif": "Upozorňování e-mailem je zapnuto.",
     "wlheader-showupdated": "Stránky, které se změnily od vaší poslední návštěvy, jsou zobrazeny '''tučně'''.",
     "watchmethod-recent": "hledají se sledované stránky mezi posledními změnami",
     "watching": "Přidávám na seznam sledovaných stránek…",
     "unwatching": "Odebírám ze seznamu sledovaných stránek…",
     "watcherrortext": "Při změně sledování stránky „$1“ došlo k chybě.",
-    "enotif_mailer": "Zasílač hlášení {{grammar:2sg|{{SITENAME}}}}",
     "enotif_reset": "Označit vše jako navštívené",
     "enotif_impersonal_salutation": "Uživatel {{grammar:2sg|{{SITENAME}}}}",
     "enotif_subject_deleted": "$2 {{gender:$2|smazal|smazala}} stránku $1 na {{grammar:6sg|{{SITENAME}}}}",
     "enotif_body_intro_restored": "V $PAGEEDITDATE {{gender:$2|obnovil|obnovila}} $2 na {{grammar:6sg|{{SITENAME}}}} stránku $1, vizte aktuální verzi na $3 .",
     "enotif_body_intro_changed": "V $PAGEEDITDATE {{gender:$2|změnil|změnila}} $2 na {{grammar:6sg|{{SITENAME}}}} stránku $1, vizte aktuální verzi na $3 .",
     "enotif_lastvisited": "Vizte $1 pro seznam všech změn od minulé návštěvy.",
-    "enotif_lastdiff": "Tuto změnu vizte na $1 .",
+    "enotif_lastdiff": "Na $1 si tuto změnu můžete prohlédnout.",
     "enotif_anon_editor": "anonymní uživatel $1",
     "enotif_body": "Vážený uživateli $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nShrnutí editace: $PAGESUMMARY $PAGEMINOREDIT\n\nUživatele, který změnu provedl, můžete kontaktovat:\ne-mailem: $PAGEEDITOR_EMAIL\nna wiki: $PAGEEDITOR_WIKI\n\nDo doby, než stránku navštívíte jako přihlášený uživatel, vám další oznámení k této stránce nebudou zasílána. Případně si můžete vynulovat příznaky ve svém seznamu sledovaných stránek.\n\nS pozdravem váš zasílač hlášení {{grammar:2sg|{{SITENAME}}}}\n\n--\nZměnit nastavení e-mailových oznámení můžete na\n{{canonicalurl:{{#special:Preferences}}}}\n\nNastavení sledovaných stránek může změnit na\n{{canonicalurl:Special:Watchlist/edit}}\n\nStránku můžete ze svých sledovaných vyřadit na\n$UNWATCHURL\n\nRady a kontakt:\n{{canonicalurl:{{MediaWiki:Helppage}}}}",
     "created": "vytvořil",
     "excontent": "obsah byl: „$1“",
     "excontentauthor": "obsah byl: „$1“ (a jediným přispěvatelem byl „[[Special:Contributions/$2|$2]]“)",
     "exbeforeblank": "obsah před vyprázdněním byl: „$1“",
-    "exblank": "stránka byla prázdná",
     "delete-confirm": "Smazání stránky „$1“",
     "delete-legend": "Smazat",
     "historywarning": "'''Varování:''' Stránka, kterou chcete smazat, má historii se zhruba $1 {{PLURAL:$1|revizí|revizemi}}:",
     "undeleteviewlink": "prohlédnout",
     "undeleteinvert": "Invertovat výběr",
     "undeletecomment": "Důvod:",
-    "undeletedrevisions": "{{PLURAL:$1|Obnovena $1 verze|Obnoveny $1 verze|Obnoveno $1 verzí}}",
-    "undeletedrevisions-files": "{{PLURAL:$1|Obnovena jedna verze|Obnoveny $1 verze|Obnoveno $1 verzí}} a $2 {{PLURAL:$2|soubor|soubory|souborů}}.",
-    "undeletedfiles": "{{PLURAL:$1|obnoven $1 soubor|obnoveny $1 soubory|obnoveno $1 souborů}}",
+    "undeletedrevisions": "{{PLURAL:$1|Obnovena jedna verze|Obnoveny $1 verze|Obnoveno $1 verzí}}",
+    "undeletedrevisions-files": "{{PLURAL:$1|Obnovena jedna verze|Obnoveny $1 verze|Obnoveno $1 verzí}} a {{PLURAL:$2|jeden soubor|$2 soubory|$2 souborů}}.",
+    "undeletedfiles": "{{PLURAL:$1|Obnoven jeden soubor|Obnoveny $1 soubory|Obnoveno $1 souborů}}",
     "cannotundelete": "Obnovení se nezdařilo:\n$1",
     "undeletedpage": "'''$1 byla obnovena'''\n\nZáznam o posledních mazáních a obnoveních najdete v [[Special:Log/delete|knize smazaných stránek]].",
     "undelete-header": "Vizte nedávno smazané stránky v [[Special:Log/delete|knize smazaných stránek]].",
     "undelete-filename-mismatch": "Nelze obnovit verzi souboru s časovou značkou $1: jméno souboru neodpovídá",
     "undelete-bad-store-key": "Nelze obnovit verzi souboru s časovou značkou $1: soubor před smazáním chyběl.",
     "undelete-cleanup-error": "Chyba při mazání nepoužívaného archivního souboru „$1“.",
-    "undelete-missing-filearchive": "Nepodařilo se obnovit soubor archivu s identifikací $1 , protože není v databázi. Možná již byl obnoven.",
+    "undelete-missing-filearchive": "Nepodařilo se obnovit soubor archivu s identifikací $1, protože není v databázi. Možná již byl obnoven.",
     "undelete-error": "Chyba při obnovování stránky",
     "undelete-error-short": "Chyba při obnovování souboru: $1",
     "undelete-error-long": "Vyskytla se chyba při obnovování souboru:\n\n$1",
     "contributions-title": "Příspěvky uživatele $1",
     "mycontris": "Příspěvky",
     "contribsub2": "{{GENDER:$3|uživatele|uživatelky}} $1 ($2)",
+    "contributions-userdoesnotexist": "Uživatelský účet „$1“ není zaregistrován.",
     "nocontribs": "Nenalezeny žádné změny vyhovující kritériím.",
     "uctop": "(aktuální)",
     "month": "Do měsíce:",
     "sp-contributions-newbies-sub": "Noví uživatelé",
     "sp-contributions-newbies-title": "Příspěvky nových uživatelů",
     "sp-contributions-blocklog": "kniha zablokování",
+    "sp-contributions-suppresslog": "utajené příspěvky uživatele",
     "sp-contributions-deleted": "smazané editace uživatele",
     "sp-contributions-uploads": "načtené soubory",
     "sp-contributions-logs": "protokolovací záznamy",
     "sp-contributions-blocked-notice": "Tento uživatel je momentálně zablokován. Zde je pro přehled zobrazen nejnovější záznam z knihy zablokování:",
     "sp-contributions-blocked-notice-anon": "Tato IP adresa je momentálně zablokována.\nZde je pro přehled zobrazen nejnovější záznam z knihy zablokování:",
     "sp-contributions-search": "Zobrazení příspěvků",
-    "sp-contributions-suppresslog": "utajené příspěvky uživatele",
     "sp-contributions-username": "IP adresa nebo uživatelské jméno:",
     "sp-contributions-toponly": "Zobrazit pouze editace na aktuální revizi",
     "sp-contributions-newonly": "Zobrazovat pouze editace zakládající stránku",
     "unblockip": "Odblokovat uživatele",
     "unblockiptext": "Tímto formulářem je možno obnovit právo blokované IP adresy či uživatele opět přispívat do {{grammar:2sg|{{SITENAME}}}}.",
     "ipusubmit": "Odblokovat",
-    "unblocked": "{{GENDER:$1|||Uživatel}} [[User:$1|$1]] {{GENDER:$1|byl odblokován|byla odblokována|byl odblokován}}",
+    "unblocked": "{{GENDER:$1|||Uživatel}} [[User:$1|$1]] {{GENDER:$1|byl odblokován|byla odblokována|byl odblokován}}.",
     "unblocked-range": "$1 bylo odblokováno",
     "unblocked-id": "Blok $1 byl zrušen",
     "blocklist": "Zablokovaní uživatelé",
     "ipb-otherblocks-header": "{{PLURAL:$1|Jiné zablokování|Jiná zablokování}}",
     "unblock-hideuser": "Tohoto uživatele nemůžete odblokovat, protože jeho uživatelské jméno bylo skryto.",
     "ipb_cant_unblock": "Chyba: Blokování s ID $1 nebylo nalezeno. Uživatel již možná byl odblokován.",
-    "ipb_blocked_as_range": "Chyba: IP adresa $1 není blokována přímo a tak ji nelze odblokovat. Je částí zablokovaného rozsahu $2, který může být odblokován.",
+    "ipb_blocked_as_range": "Chyba: IP adresa $1 není blokována přímo, a tak ji nelze odblokovat. Je částí zablokovaného rozsahu $2, který může být odblokován.",
     "ip_range_invalid": "Neplatný IP rozsah.",
     "ip_range_toolarge": "Blokování rozsahů větších než /$1 není dovoleno.",
     "proxyblocker": "Blokování proxy serverů",
     "allmessagesname": "Označení hlášení",
     "allmessagesdefault": "Původní text",
     "allmessagescurrent": "Aktuální text",
-    "allmessagestext": "Toto je seznam všech hlášení dostupných ve jmenném prostoru MediaWiki.\nPokud si přejete přispívat k lokalizaci softwaru MediaWiki, navštivte [https://www.mediawiki.org/wiki/Localisation lokalizační stránku na mediawiki.org] a [//translatewiki.net server translatewiki.net].",
+    "allmessagestext": "Toto je seznam všech hlášení dostupných ve jmenném prostoru MediaWiki.\nPokud si přejete přispívat k lokalizaci softwaru MediaWiki, navštivte [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation lokalizační stránku na mediawiki.org] a [//translatewiki.net server translatewiki.net].",
     "allmessagesnotsupportedDB": "{{ns:special}}:AllMessages není podporováno, neboť wgUseDatabaseMessages je vypnuto.",
     "allmessages-filter-legend": "Filtr",
     "allmessages-filter": "Filtr podle stavu:",
     "importunknownsource": "Neznámý typ zdroje importu",
     "importcantopen": "Nepodařilo se otevřít importní soubor",
     "importbadinterwiki": "Neplatný interwiki odkaz",
-    "importnotext": "Prázdný nebo žádný text",
     "importsuccess": "Import skončil!",
-    "importhistoryconflict": "Existuje konflikt mezi historiemi verzí. Možná, že tato stránka byla již importována dříve.",
     "importnosources": "Nebyly definovány žádné zdroje pro import mezi wiki a přímé načítání historie je vypnuto.",
     "importnofile": "Nebyl načten importní soubor.",
     "importuploaderrorsize": "Nepodařilo se načíst importní soubor. Soubor je větší než povolená velikost.",
     "group-bot.css": "/* Zde uvedené CSS bude ovlivňovat pouze boty */",
     "group-sysop.css": "/* Zde uvedené CSS bude ovlivňovat pouze správce */",
     "group-bureaucrat.css": "/* Zde uvedené CSS bude ovlivňovat pouze byrokraty */",
-    "common.js": "/* Zde uvedený JavaScript bude použit pro všechny uživatele při načtení každé stránky.  */",
+    "common.js": "/* Zde uvedený JavaScript bude použit pro všechny uživatele při načtení každé stránky. */",
     "cologneblue.js": "/* JavaScript pro uživatele používající vzhled „Kolínská modř“  */",
     "monobook.js": "/* JavaScript pro uživatele používající vzhled MonoBook */",
     "modern.js": "/* JavaScript pro uživatele používající vzhled „Moderní“ */",
     "version-entrypoints": "URL vstupních bodů",
     "version-entrypoints-header-entrypoint": "Vstupní bod",
     "version-entrypoints-header-url": "URL",
-    "version-entrypoints-articlepath": "[https://www.mediawiki.org/wiki/Manual:$wgArticlePath Cesta k článkům]",
-    "version-entrypoints-scriptpath": "[https://www.mediawiki.org/wiki/Manual:$wgScriptPath Cesta ke skriptům]",
+    "version-entrypoints-articlepath": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgArticlePath Cesta k článkům]",
+    "version-entrypoints-scriptpath": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgScriptPath Cesta ke skriptům]",
     "redirect": "Přesměrování podle souboru, uživatele, stránky nebo ID revize",
     "redirect-legend": "Přesměrování na soubor či stránku",
     "redirect-summary": "Tato speciální stránka přesměrovává na soubor (podle názvu), stránku (podle ID stránky nebo revize) nebo uživatele (podle číselného uživatelského ID). Použití: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]] nebo [[{{#Special:Redirect}}/user/101]].",
     "expand_templates_remove_nowiki": "Potlačit ve výsledku značky <nowiki>",
     "expand_templates_generate_xml": "Zobrazit syntaktický strom v XML",
     "expand_templates_generate_rawhtml": "Zobrazit surové HTML",
-    "expand_templates_preview": "Náhled",
-    "trackingcategories": "Sledovací kategorie",
-    "trackingcategories-summary": "Tato stránka obsahuje seznam sledovacích kategorií, které automaticky přidává software MediaWiki. Jejich jména lze změnit úpravou příslušných systémových hlášení ve jmenném prostoru {{ns:8}}.",
-    "trackingcategories-msg": "Sledovací kategorie",
-    "trackingcategories-name": "Název hlášení",
-    "trackingcategories-desc": "Kritéria pro vložení do kategorie",
-    "noindex-category-desc": "Stránka obsahuje kouzelné slovo <nowiki>__NOINDEX__</nowiki> (a je ve jmenném prostoru, ve kterém je tento příznak dovolen), takže není indexována roboty.",
-    "index-category-desc": "Stránka obsahuje kouzelné slovo <nowiki>__INDEX__</nowiki> (a je ve jmenném prostoru, ve kterém je tento příznak dovolen), takže je indexována roboty, přestože by normálně nebyla.",
-    "post-expand-template-inclusion-category-desc": "Po rozbalení všech šablon je stránka větší než $wgMaxArticleSize, takže některé šablony rozbaleny nebyly.",
-    "post-expand-template-argument-category-desc": "Po rozbalení argumentu šablony (něco v trojitých závorkách, např. {{{Foo}}}) je stránka větší než $wgMaxArticleSize.",
-    "expensive-parserfunction-category-desc": "Na stránce je použito příliš mnoho náročných funkcí parseru (jako #ifexists). Vizte [https://www.mediawiki.org/wiki/Manual:$wgExpensiveParserFunctionLimit Manual:$wgExpensiveParserFunctionLimit].",
-    "broken-file-category-desc": "Kategorie přidaná pokud stránka obsahuje nefunkční odkaz na soubor (odkaz pro vložení souboru, který neexistuje).",
-    "hidden-category-category-desc": "Toto je kategorie, která obsahuje <nowiki>__HIDDENCAT__</nowiki>, což způsobuje, že se na stránkách implicitně nezobrazuje v rámečku odkazů na kategorie.",
-    "trackingcategories-nodesc": "Popis není k dispozici.",
-    "trackingcategories-disabled": "Kategorie je vypnuta"
+    "expand_templates_preview": "Náhled"
 }
index 745ab42..b4ea12e 100644 (file)
     "allmessagesname": "Miono",
     "allmessagesdefault": "Domëslny tekst",
     "allmessagescurrent": "Aktualny tekst",
-    "allmessagestext": "To je zestôwk systemòwëch ògłosów przistãpnëch w rumie mionów MediaWiki.\nProszã zazdrzë na [https://www.mediawiki.org/wiki/Localisation Lokalizacëjô MediaWiki] ë [//translatewiki.net translatewiki.net] jeżlë chcesz dolmaczëc softwôrã MediaWiki.",
+    "allmessagestext": "To je zestôwk systemòwëch ògłosów przistãpnëch w rumie mionów MediaWiki.\nProszã zazdrzë na [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation Lokalizacëjô MediaWiki] ë [//translatewiki.net translatewiki.net] jeżlë chcesz dolmaczëc softwôrã MediaWiki.",
     "allmessagesnotsupportedDB": "'''{{ns:special}}:Allmessages''' nie mòże bëc brëkòwónô, temù że '''$wgUseDatabaseMessages''' je wëłączony.",
     "thumbnail-more": "Zwiszi",
     "import": "Impòrtëjë starnë",
index b37f41a..3d5a736 100644 (file)
     "prefs-skin": "Gwedd",
     "skin-preview": "Rhagolwg",
     "datedefault": "Dim dewisiad",
-    "prefs-beta": "Nodweddion Beta",
     "prefs-datetime": "Dyddiad ac amser",
     "prefs-labs": "Nodweddion Labs",
     "prefs-user-pages": "Tudalennau defnyddwyr",
     "nowatchlist": "Mae eich rhestr wylio'n wag.",
     "watchlistanontext": "Rhaid $1 er mwyn gweld neu ddiwygio'ch rhestr wylio.",
     "watchnologin": "Nid ydych wedi mewngofnodi",
-    "watchnologintext": "Mae'n rhaid i chi [[Special:UserLogin|fewngofnodi]] er mwyn newid eich rhestr wylio.",
     "addwatch": "Ychwanegu at y rhestr wylio",
     "addedwatchtext": "Mae'r dudalen \"[[:$1|$1]]\" wedi cael ei hychwanegu at eich [[Special:Watchlist|rhestr wylio]].\nPan fydd y dudalen hon, neu ei thudalen sgwrs, yn newid, fe fyddant yn ymddangos ar y rhestr honno.",
     "removewatch": "Tynnu oddi ar eich rhestr wylio",
     "allmessagesname": "Enw",
     "allmessagesdefault": "Testun rhagosodedig",
     "allmessagescurrent": "Testun cyfredol",
-    "allmessagestext": "Dyma restr o'r holl negeseuon yn y parth MediaWici.\nOs ydych am gyfrannu at y gwaith o gyfieithu ar gyfer holl prosiectau MediaWiki ar y cyd, mae croeso i chi ymweld â [https://www.mediawiki.org/wiki/Localisation MediaWiki Localisation] a [//translatewiki.net translatewiki.net].",
+    "allmessagestext": "Dyma restr o'r holl negeseuon yn y parth MediaWici.\nOs ydych am gyfrannu at y gwaith o gyfieithu ar gyfer holl prosiectau MediaWiki ar y cyd, mae croeso i chi ymweld â [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation MediaWiki Localisation] a [//translatewiki.net translatewiki.net].",
     "allmessagesnotsupportedDB": "Nid yw '''{{ns:special}}:PobNeges''' yn cael ei gynnal gan fod '''$wgUseDatabaseMessages''' wedi ei ddiffodd.",
     "allmessages-filter-legend": "Hidl",
     "allmessages-filter": "Hidlo yn ôl eu cyflwr addasu:",
index 25293de..6ed6759 100644 (file)
     "prefs-skin": "Udseende",
     "skin-preview": "Forhåndsvisning",
     "datedefault": "Standard",
-    "prefs-beta": "Betafunktioner",
     "prefs-datetime": "Dato og klokkeslæt",
     "prefs-labs": "Testfunktioner",
     "prefs-user-pages": "Brugerside",
     "nowatchlist": "Du har ingenting i din overvågningsliste.",
     "watchlistanontext": "Du skal $1, for at se din overvågningsliste eller ændre indholdet af den.",
     "watchnologin": "Ikke logget på",
-    "watchnologintext": "Du skal være [[Special:UserLogin|logget på]] for at kunne ændre din overvågningsliste.",
     "addwatch": "Tilføj til overvågningsliste",
     "addedwatchtext": "Siden \"[[:$1]]\" er blevet tilføjet til din [[Special:Watchlist|overvågningsliste]].\nFremtidige ændringer af denne side og dens tilknyttede diskussionsside vil blive vist der.",
     "removewatch": "Fjern fra overvågningsliste",
     "sp-contributions-newbies-sub": "Fra nye kontoer",
     "sp-contributions-newbies-title": "Brugerbidrag fra nye konti",
     "sp-contributions-blocklog": "blokeringslog",
+    "sp-contributions-suppresslog": "undertrykte brugerbidrag",
     "sp-contributions-deleted": "slettede brugerbidrag",
     "sp-contributions-uploads": "uploads",
     "sp-contributions-logs": "loglister",
     "sp-contributions-blocked-notice": "Denne bruger er i øjeblikket blokeret. Loggen over den seneste blokering kan ses nedenfor:",
     "sp-contributions-blocked-notice-anon": "Denne IP-adresse er i øjeblikket blokeret.\nDen seneste post i blokeringsloggen vises nedenfor:",
     "sp-contributions-search": "Søg efter bidrag",
-    "sp-contributions-suppresslog": "undertrykte brugerbidrag",
     "sp-contributions-username": "IP-adresse eller brugernavn:",
     "sp-contributions-toponly": "Vis kun redigeringer, der er aktuelle versioner",
     "sp-contributions-newonly": "Vis kun redigeringer, der er sideoprettelser",
     "allmessagesname": "Navn",
     "allmessagesdefault": "Standardtekst",
     "allmessagescurrent": "Nuværende tekst",
-    "allmessagestext": "Dette er en liste med alle systembeskeder i MediaWiki-navnerummet.\nBesøg venligst [https://www.mediawiki.org/wiki/Localisation MediaWiki-lokalisering] og [//translatewiki.net translatewiki.net] hvis du ønsker at bidrage til den generelle lokalisering (oversættelse og andre lokale tilpasninger) af MediaWiki.",
+    "allmessagestext": "Dette er en liste med alle systembeskeder i MediaWiki-navnerummet.\nBesøg venligst [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation MediaWiki-lokalisering] og [//translatewiki.net translatewiki.net] hvis du ønsker at bidrage til den generelle lokalisering (oversættelse og andre lokale tilpasninger) af MediaWiki.",
     "allmessagesnotsupportedDB": "{{ns:special}}:AllMessages ikke understøttet fordi wgUseDatabaseMessages er slået fra.",
     "allmessages-filter-legend": "Filtrér",
     "allmessages-filter": "Filtrér efter tilpasningsstatus:",
index b8c6932..da1e5de 100644 (file)
     "permalink": "Permanenter Link",
     "print": "Drucken",
     "view": "Lesen",
+    "view-foreign": "Auf $1 ansehen",
     "edit": "Bearbeiten",
+    "edit-local": "Lokale Beschreibung bearbeiten",
     "create": "Erstellen",
+    "create-local": "Lokale Beschreibung hinzufügen",
     "editthispage": "Seite bearbeiten",
     "create-this-page": "Seite erstellen",
     "delete": "Löschen",
     "pool-timeout": "Zeitablauf während des Wartens auf die Sperrung",
     "pool-queuefull": "Poolwarteschlange ist voll",
     "pool-errorunknown": "Unbekannter Fehler",
+    "pool-servererror": "Der Poolzählerdienst ist nicht verfügbar ($1).",
     "aboutsite": "Über {{SITENAME}}",
     "aboutpage": "Project:Über_{{SITENAME}}",
     "copyright": "Der Inhalt ist verfügbar unter der Lizenz $1, sofern nicht anders angegeben.",
     "accountcreatedtext": "Das Benutzerkonto für [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|Diskussion]]) wurde eingerichtet.",
     "createaccount-title": "Erstellung eines Benutzerkontos für {{SITENAME}}",
     "createaccount-text": "Es wurde für dich ein Benutzerkonto „$2“ auf {{SITENAME}} ($4) erstellt. Das automatisch generierte Passwort für „$2“ ist „$3“. Du solltest dich nun anmelden und das Passwort ändern.\n\nFalls das Benutzerkonto irrtümlich angelegt wurde, kannst du diese Nachricht ignorieren.",
-    "usernamehasherror": "Benutzernamen dürfen kein Rautenzeichen enthalten",
     "login-throttled": "Du hast zu oft versucht, dich anzumelden.\nBitte warte $1, bevor du es erneut probierst.",
     "login-abort-generic": "Deine Anmeldung war nicht erfolgreich – Abgebrochen",
     "loginlanguagelabel": "Sprache: $1",
     "prefs-skin": "Benutzeroberfläche",
     "skin-preview": "Vorschau",
     "datedefault": "Standard",
-    "prefs-beta": "Beta-Funktionen",
-    "prefs-datetime": "Datum und Zeit",
     "prefs-labs": "Alpha-Funktionen",
     "prefs-user-pages": "Benutzerseiten",
     "prefs-personal": "Benutzerdaten",
     "upload-permitted": "Erlaubte Dateitypen: $1.",
     "upload-preferred": "Bevorzugte Dateitypen: $1.",
     "upload-prohibited": "Nicht erlaubte Dateitypen: $1.",
-    "uploadlog": "Datei-Logbuch",
     "uploadlogpage": "Datei-Logbuch",
     "uploadlogpagetext": "Dies ist das Logbuch der hochgeladenen Dateien, siehe auch die [[Special:NewFiles|Galerie neuer Dateien]] für einen visuellen Überblick.",
     "filename": "Dateiname",
     "filereuploadsummary": "Dateiänderungen:",
     "filestatus": "Copyright-Status:",
     "filesource": "Quelle:",
-    "uploadedfiles": "Hochladen",
     "ignorewarning": "Warnung ignorieren und Datei speichern",
     "ignorewarnings": "Warnungen ignorieren",
     "minlength1": "Dateinamen müssen mindestens einen Buchstaben lang sein.",
     "overwroteimage": "lud eine neue Version von „[[$1]]“ hoch",
     "uploaddisabled": "Hochladen deaktiviert",
     "copyuploaddisabled": "Das Hochladen von URLs ist deaktiviert",
-    "uploadfromurl-queued": "Dein Upload befindet sich nun in der Warteschlange.",
     "uploaddisabledtext": "Das Hochladen von Dateien ist deaktiviert.",
     "php-uploaddisabledtext": "Das Hochladen von Dateien wurde in PHP deaktiviert.\nBitte überprüfe die <code>file_uploads</code>-Einstellung.",
     "uploadscripted": "Diese Datei enthält HTML- oder Scriptcode, der irrtümlich von einem Webbrowser ausgeführt werden könnte.",
     "upload-misc-error": "Unbekannter Fehler beim Hochladen",
     "upload-misc-error-text": "Beim Hochladen ist ein unbekannter Fehler aufgetreten.\nPrüfe die URL auf Fehler, den Online-Status der Seite und versuche es erneut.\nWenn das Problem weiter besteht, informiere einen [[Special:ListUsers/sysop|Administrator]].",
     "upload-too-many-redirects": "Die URL beinhaltete zu viele Weiterleitungen",
-    "upload-unknown-size": "Unbekannte Größe",
     "upload-http-error": "Ein HTTP-Fehler ist aufgetreten: $1",
     "upload-copy-upload-invalid-domain": "Als Kopie hochladbare Dateien sind über diese Domain nicht verfügbar.",
     "backend-fail-stream": "Die Datei $1 konnte nicht übertragen werden.",
     "img-auth-streaming": "Lade „$1“.",
     "img-auth-public": "img_auth.php gibt Dateien von einem privaten Wiki aus.\nDieses Wiki wurde als ein öffentliches Wiki konfiguriert.\nAus Sicherheitsgründen ist img_auth.php deaktiviert.",
     "img-auth-noread": "Benutzer hat keine Berechtigung, „$1“ zu lesen.",
-    "img-auth-bad-query-string": "Die URL weist eine ungültige Abfragezeichenfolge auf.",
     "http-invalid-url": "Ungültige URL: $1",
     "http-invalid-scheme": "URLs mit dem Schema „$1“ werden nicht unterstützt",
     "http-request-error": "Fehler beim Senden der Anfrage.",
     "filehist-dimensions": "Maße",
     "filehist-filesize": "Dateigröße",
     "filehist-comment": "Kommentar",
-    "filehist-missing": "Datei fehlt",
     "imagelinks": "Dateiverwendung",
     "linkstoimage": "Die {{PLURAL:$1|folgende Seite verwendet|folgenden $1 Seiten verwenden}} diese Datei:",
     "linkstoimage-more": "Mehr als {{PLURAL:$1|eine Seite verlinkt|$1 Seiten verlinken}} auf diese Datei.\nDie folgende Liste zeigt nur {{PLURAL:$1|den ersten Link|die ersten $1 Links}} auf diese Datei.\nEine [[Special:WhatLinksHere/$2|vollständige Liste]] ist verfügbar.",
     "listgrouprights-removegroup-self": "Eigenes Benutzerkonto aus {{PLURAL:$2|dieser Gruppe|diesen Gruppen}} entfernen: $1",
     "listgrouprights-addgroup-self-all": "Kann alle Gruppen zum eigenen Konto hinzufügen",
     "listgrouprights-removegroup-self-all": "Kann alle Gruppen vom eigenen Konto entfernen",
+    "listgrouprights-namespaceprotection-header": "Namensraumbeschränkungen",
+    "listgrouprights-namespaceprotection-namespace": "Namensraum",
+    "listgrouprights-namespaceprotection-restrictedto": "Rechte, die dem Benutzer die Bearbeitung erlauben",
+    "trackingcategories": "Tracking-Kategorien",
+    "trackingcategories-summary": "Diese Seite listet Tracking-Kategorien auf, die von der MediaWiki-Software automatisch eingepflegt werden. Ihre Namen können durch Änderung der entsprechenden Systemnachrichten im {{ns:8}}-Namensraum angepasst werden.",
+    "trackingcategories-msg": "Tracking-Kategorie",
+    "trackingcategories-name": "Name der Nachricht",
+    "trackingcategories-desc": "Kategorieeinbindungskriterien",
+    "noindex-category-desc": "Die Seite wird nicht von Bots indexiert, da sie das magische Wort <code><nowiki>__NOINDEX__</nowiki></code> enthält und sich in einem Namensraum befindet, wo dieses Flag erlaubt ist.",
+    "index-category-desc": "Die Seite enthält ein <code><nowiki>__INDEX__</nowiki></code> und befindet sich in einem Namensraum, in dem dieses Flag nicht erlaubt ist und wird daher von Bots ausnahmsweise indexiert.",
+    "post-expand-template-inclusion-category-desc": "Nach dem Expandieren aller Vorlagen ist die Seitengröße größer als <code>$wgMaxArticleSize</code>, sodass einige Vorlagen nicht expandiert werden.",
+    "post-expand-template-argument-category-desc": "Nach dem Expandieren eines Vorlagenargumentes (etwas in dreifach geschweiften Klammern, z.&nbsp;B. <code>{{{Foo}}})</code> ist die Seite größer als <code>$wgMaxArticleSize</code>.",
+    "expensive-parserfunction-category-desc": "Zu viele aufwändige Parserfunktionen (wie <code>#ifexist</code>) sind in der Seite eingebunden. Siehe das [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit Benutzerhandbuch].",
+    "broken-file-category-desc": "Kategorie, die hinzugefügt wird, falls die Seite einen defekten Dateilink enthält (einen Link zu einer eingebetteten Datei, die nicht vorhanden ist).",
+    "hidden-category-category-desc": "Dies ist eine Kategorie mit <code><nowiki>__HIDDENCAT__</nowiki></code>, die standardmäßig nicht auf Seiten im Kategorienbereich angezeigt wird.",
+    "trackingcategories-nodesc": "Keine Beschreibung verfügbar.",
+    "trackingcategories-disabled": "Kategorie ist deaktiviert",
     "mailnologin": "Fehler beim E-Mail-Versand",
     "mailnologintext": "Du musst [[Special:UserLogin|angemeldet sein]] und eine bestätigte E-Mail-Adresse in deinen [[Special:Preferences|Einstellungen]] eingetragen haben, um anderen Benutzern E-Mails schicken zu können.",
     "emailuser": "E-Mail an diesen Benutzer",
     "emailuser-title-notarget": "E-Mail an Benutzer",
     "emailpage": "E-Mail an Benutzer",
     "emailpagetext": "Du kannst {{GENDER:$1|dem Benutzer|der Benutzerin}} mit dem unten stehenden Formular eine E-Mail senden.\nAls Absender wird die E-Mail-Adresse aus deinen [[Special:Preferences|Einstellungen]] eingetragen, damit {{GENDER:$1|der Benutzer|die Benutzerin}} dir direkt antworten kann.",
-    "usermailererror": "Das E-Mail-Objekt gab einen Fehler zurück:",
     "defemailsubject": "{{SITENAME}} – E-Mail von Benutzer „$1“",
     "usermaildisabled": "E-Mail-Empfang deaktiviert",
     "usermaildisabledtext": "Du kannst in diesem Wiki keine E-Mails an andere Benutzer senden",
     "noemailtitle": "Keine E-Mail-Adresse",
     "noemailtext": "Dieser Benutzer hat keine gültige E-Mail-Adresse angegeben.",
-    "nowikiemailtitle": "E-Mail-Versand nicht möglich",
     "nowikiemailtext": "Dieser Benutzer möchte keine E-Mails von anderen Benutzern erhalten.",
     "emailnotarget": "Nicht vorhandener oder ungültiger Benutzername für den Empfang einer E-Mail.",
     "emailtarget": "Benutzernamen des Empfängers eingeben",
     "nowatchlist": "Es befinden sich keine Einträge auf deiner Beobachtungsliste.",
     "watchlistanontext": "Du musst dich $1, um deine Beobachtungsliste sehen oder Einträge auf ihr bearbeiten zu können.",
     "watchnologin": "Du bist nicht angemeldet",
-    "watchnologintext": "Du musst [[Special:UserLogin|angemeldet]] sein, um deine Beobachtungsliste bearbeiten zu können.",
     "addwatch": "Zur Beobachtungsliste hinzufügen",
     "addedwatchtext": "Die Seite „[[:$1]]“ wurde zu deiner [[Special:Watchlist|Beobachtungsliste]] hinzugefügt.\nSpätere Änderungen an dieser Seite und der zugehörigen Diskussionsseite werden dort gelistet.",
     "removewatch": "Von der Beobachtungsliste entfernen",
     "unwatchthispage": "Nicht mehr beobachten",
     "notanarticle": "Keine Seite",
     "notvisiblerev": "Version wurde gelöscht",
-    "watchlist-details": "Du beobachtest {{PLURAL:$1|eine Seite|$1 Seiten}}, ohne dass Diskussionsseiten gezählt werden.",
+    "watchlist-details": "Du beobachtest {{PLURAL:$1|eine Seite|$1 Seiten}}, ohne dass Diskussionsseiten getrennt gezählt werden.",
     "wlheader-enotif": "Der E-Mail-Benachrichtigungsdienst ist aktiviert.",
     "wlheader-showupdated": "Seiten mit noch nicht gesehenen Änderungen werden '''fett''' dargestellt.",
     "watchmethod-recent": "Überprüfen der letzten Bearbeitungen für die Beobachtungsliste",
     "watching": "Beobachten …",
     "unwatching": "Nicht mehr beobachten …",
     "watcherrortext": "Beim Ändern der Beobachtungslisteneinstellungen für „$1“ ist ein Fehler aufgetreten.",
-    "enotif_mailer": "{{SITENAME}}-E-Mail-Benachrichtigungsdienst",
     "enotif_reset": "Alle Seiten als besucht markieren",
     "enotif_impersonal_salutation": "{{SITENAME}}-Benutzer",
     "enotif_subject_deleted": "{{SITENAME}}-Seite $1 wurde von {{GENDER:$2|$2}} gelöscht",
     "excontent": "Inhalt war: „$1“",
     "excontentauthor": "Inhalt war: „$1“ (einziger Bearbeiter: [[Special:Contributions/$2|$2]])",
     "exbeforeblank": "Inhalt vor dem Leeren der Seite: „$1“",
-    "exblank": "Seite war leer",
     "delete-confirm": "Löschen von „$1“",
     "delete-legend": "Löschen",
     "historywarning": "'''Achtung:''' Die Seite, die du löschen möchtest, hat eine Versionsgeschichte mit ungefähr $1 {{PLURAL:$1|Version|Versionen}}:",
     "contributions-title": "Benutzerbeiträge von „$1“",
     "mycontris": "Beiträge",
     "contribsub2": "Von {{GENDER:$3|$1}} ($2)",
+    "contributions-userdoesnotexist": "Das Benutzerkonto „$1“ ist nicht registriert.",
     "nocontribs": "Es wurden keine Benutzerbeiträge mit diesen Kriterien gefunden.",
     "uctop": "(aktuell)",
     "month": "und Monat:",
     "sp-contributions-newbies-sub": "Von neuen Benutzern",
     "sp-contributions-newbies-title": "Benutzerbeiträge von neuen Benutzern",
     "sp-contributions-blocklog": "Sperr-Logbuch",
+    "sp-contributions-suppresslog": "Unterdrückte Benutzerbeiträge",
     "sp-contributions-deleted": "Gelöschte Beiträge",
     "sp-contributions-uploads": "Hochgeladene Dateien",
     "sp-contributions-logs": "Logbücher",
     "sp-contributions-blocked-notice": "{{GENDER:$1|Dieser Benutzer|Diese Benutzerin|Dieser Benutzer}} ist derzeit gesperrt. Es folgt der aktuelle Eintrag aus dem Benutzersperr-Logbuch:",
     "sp-contributions-blocked-notice-anon": "Diese IP-Adresse ist zurzeit gesperrt.\nZur Information folgt der aktuelle Auszug aus dem Sperr-Logbuch:",
     "sp-contributions-search": "Suche nach Benutzerbeiträgen",
-    "sp-contributions-suppresslog": "Unterdrückte Benutzerbeiträge",
     "sp-contributions-username": "IP-Adresse oder Benutzername:",
     "sp-contributions-toponly": "Nur aktuelle Versionen zeigen",
     "sp-contributions-newonly": "Nur Seitenerstellungen anzeigen",
     "allmessagesname": "Name",
     "allmessagesdefault": "Standardtext",
     "allmessagescurrent": "Aktueller Text",
-    "allmessagestext": "Dies ist eine Liste der MediaWiki-Systemtexte.\nBitte besuche die Seiten [https://www.mediawiki.org/wiki/Localisation MediaWiki-Lokalisierung] und [//translatewiki.net translatewiki.net], sofern du dich an der Lokalisierung von MediaWiki beteiligen möchtest.",
+    "allmessagestext": "Dies ist eine Liste der MediaWiki-Systemtexte.\nBitte besuche die Seiten [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation MediaWiki-Lokalisierung] und [//translatewiki.net translatewiki.net], sofern du dich an der Lokalisierung von MediaWiki beteiligen möchtest.",
     "allmessagesnotsupportedDB": "Diese Spezialseite steht nicht zur Verfügung, da sie über den Parameter <tt>$wgUseDatabaseMessages</tt> deaktiviert wurde.",
     "allmessages-filter-legend": "Filter",
     "allmessages-filter": "Filter für angepassten Zustand:",
     "importunknownsource": "Unbekannte Importquelle",
     "importcantopen": "Importdatei konnte nicht geöffnet werden",
     "importbadinterwiki": "Falscher Interwiki-Link",
-    "importnotext": "Leer oder kein Text",
     "importsuccess": "Import abgeschlossen.",
-    "importhistoryconflict": "Es existieren bereits ältere Versionen, welche mit diesen kollidieren. Möglicherweise wurde die Seite bereits vorher importiert.",
     "importnosources": "Für den Transwiki-Import sind keine Quellen definiert. Das direkte Hochladen von Versionen ist gesperrt.",
     "importnofile": "Es ist keine Importdatei ausgewählt worden.",
     "importuploaderrorsize": "Das Hochladen der Importdatei ist fehlgeschlagen. Die Datei ist größer als die maximal erlaubte Dateigröße.",
     "version-entrypoints": "URLs der Einstiegspunkte",
     "version-entrypoints-header-entrypoint": "Einstiegspunkt",
     "version-entrypoints-header-url": "URL",
-    "version-entrypoints-articlepath": "[https://www.mediawiki.org/wiki/Manual:$wgArticlePath Artikelpfad]",
-    "version-entrypoints-scriptpath": "[https://www.mediawiki.org/wiki/Manual:$wgScriptPath Skriptpfad]",
+    "version-entrypoints-articlepath": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgArticlePath Artikelpfad]",
+    "version-entrypoints-scriptpath": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgScriptPath Skriptpfad]",
     "redirect": "Weiterleitung auf Benutzerseite, Seite, Seitenversion oder Datei",
     "redirect-legend": "Weiterleitung auf eine Benutzerseite, Seite, Seitenversion oder Datei",
     "redirect-summary": "Diese Spezialseite leitet auf eine Benutzerseite (numerische Benutzerkennung angegeben), Seite (Seitenkennung angegeben), Seitenversion (Versionskennung angegeben) oder Datei (Dateiname angegeben) weiter. Benutzung: [[{{#Special:Redirect}}/user/101]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]] oder [[{{#Special:Redirect}}/file/Example.jpg]].",
     "expand_templates_remove_nowiki": "<nowiki>-Tags in der Ausgabe unterdrücken",
     "expand_templates_generate_xml": "XML-Parser-Baum zeigen",
     "expand_templates_generate_rawhtml": "Rohes HTML anzeigen",
-    "expand_templates_preview": "Vorschau",
-    "trackingcategories": "Tracking-Kategorien",
-    "trackingcategories-summary": "Diese Seite listet Tracking-Kategorien auf, die von der MediaWiki-Software automatisch eingepflegt werden. Ihre Namen können durch Änderung der entsprechenden Systemnachrichten im {{ns:8}}-Namensraum angepasst werden.",
-    "trackingcategories-msg": "Tracking-Kategorie",
-    "trackingcategories-name": "Name der Nachricht",
-    "trackingcategories-desc": "Kategorieeinbindungskriterien",
-    "noindex-category-desc": "Die Seite hat das magische Wort <nowiki>__NOINDEX__</nowiki> und befindet sich in einem Namensraum, wo dieses Flag erlaubt ist und wird daher nicht von Bots indexiert.",
-    "index-category-desc": "Die Seite enthält ein <nowiki>__INDEX__</nowiki> und befindet sich in einem Namensraum, in dem dieses Flag nicht erlaubt ist und wird daher von Bots ausnahmsweise indexiert.",
-    "post-expand-template-inclusion-category-desc": "Nach dem Expandieren aller Vorlagen ist die Seitengröße größer als $wgMaxArticleSize, sodass einige Vorlagen nicht expandiert werden.",
-    "post-expand-template-argument-category-desc": "Nach dem Expandieren eines Vorlagenargumentes (etwas in dreifach geschweiften Klammern, z.&nbsp;B. {{{Foo}}}) ist die Seite größer als $wgMaxArticleSize.",
-    "expensive-parserfunction-category-desc": "Zu viele aufwändige Parserfunktionen (wie #ifexists) sind in der Seite eingebunden. Siehe das [https://www.mediawiki.org/wiki/Manual:$wgExpensiveParserFunctionLimit Benutzerhandbuch].",
-    "broken-file-category-desc": "Kategorie, die hinzugefügt wird, falls die Seite einen defekten Dateilink enthält (einen Link zu einer eingebetteten Datei, die nicht vorhanden ist).",
-    "hidden-category-category-desc": "Dies ist eine Kategorie mit <nowiki>__HIDDENCAT__</nowiki>, die standardmäßig nicht auf Seiten im Kategorienbereich angezeigt wird.",
-    "trackingcategories-nodesc": "Keine Beschreibung verfügbar.",
-    "trackingcategories-disabled": "Kategorie ist deaktiviert"
+    "expand_templates_preview": "Vorschau"
 }
index de5c9c3..e3bb913 100644 (file)
@@ -16,7 +16,9 @@
             "Olvörg",
             "Reedy",
             "Sahim",
-            "Xoser"
+            "Xoser",
+            "Geitost",
+            "Microchip08"
         ]
     },
     "tog-underline": "Bınê gırey de xete bance:",
     "pool-queuefull": "Rêza hewze pırra",
     "pool-errorunknown": "Xeta nêzanıtiye",
     "aboutsite": "Heqa {{SITENAME}} de",
-    "aboutpage": "Project:Heqa  de",
+    "aboutpage": "Project:Heqa {{SITENAME}} de",
     "copyright": "Zerrekacı $1 bındı not biya.",
     "copyrightpage": "{{ns:project}}:Heqa telifi",
-    "currentevents": "Veng u vac",
+    "currentevents": "Veng û vac",
     "currentevents-url": "Project:Rocani hadisey",
     "disclaimers": "Redê mesuliyeti",
     "disclaimerpage": "Project:Reddê mesuliyetê bıngey",
     "accountcreatedtext": "Qandê [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|talk]]) hesabê karberi vıraziyayo.",
     "createaccount-title": "Qandé  {{SITENAME}} hesabé karberi iycat kerdış",
     "createaccount-text": "Kesê, be e-posteyê şıma ra {{SITENAME}} ($4) de, ebe nameyê \"$2\" u parola \"$3\" ra yew hesab vıraşto.\nŞıma gani cı kewê u parola xo nıka bıvurnê.",
-    "usernamehasherror": "Namey karberi de karakteri gani têmiyan ra mebê",
     "login-throttled": "Demekê $1 cıwa ver de şıma zah teşebbusê hesab akerdış kerd.\nBıne vındere u newe ra dest pê bıkere.",
     "login-abort-generic": "Dekewtışê şıma xırabo-terkneyayo",
     "loginlanguagelabel": "Zıwan: $1",
     "media_tip": "Gıreyê dosya",
     "sig_tip": "İmzay şıma be morê zemani",
     "hr_tip": "Xeta verardiye (teserrufın bıgureyne/bıxebetne)",
-    "summary": "<font style=\"color:Blue\">'''Xulasa:'''</font>",
+    "summary": "Xulasa:",
     "subject": "Mewzu/sernuşte:",
     "minoredit": "No vırnayışê do werdiyo",
     "watchthis": "'''Ena pele seyr ke'''",
     "session_fail_preview_html": "'''Ma meluli! Sebayê vindbiyayişê datasistemi ma vurnayişê şıma nêeşkeni qaydker.'''\n\n''Çunke keyepelê {{SITENAME}} de raw HTML aqtifo, seyrkerdışê verqayd semedê galayê (alızyayiş) JavaScript ri nımıyayo.''\n\n'''Eke no vurnayiş heqê şımayo, newe ra tesel bıker (bıcerebi). eke hona zi nêxebıtya, [[Special:UserLogout|vec]] newe ra hesabê xo aker.'''",
     "token_suffix_mismatch": "'''Vurnayişê şıma tepeya ameyo çunke qutiyê imla xerıbya.\nVurnayişê şıma qey nêxerepyayişê peli tepeya geyra a.\nEke şıma servisê proksi yo anonim şuxulneni sebebê ey noyo.'''",
     "edit_form_incomplete": "'''Qandê form dê vurnayışa tay wastera ma nêreşti; Vurnayışê ke şıma kerdê nêalızyayê, çım ra ravyarnê u fına bıcerbnê.'''",
-    "editing": "Şımayê <font style=\"color:red\">$1</font> vurnenê",
-    "creating": "Pela <font style=\"color:blue\">$1</font> vırazê",
+    "editing": "$1 vuriyeno",
+    "creating": "$1 vıraziyeno",
     "editingsection": "Per da $1 de şımaye kenê ke leti bıvurnê",
     "editingcomment": "$1 vuryeno (qısmo newe)",
-    "editconflict": "Vurnayişê ke yewbini nêtepışeni: $1",
+    "editconflict": "Têverabiyayışê vurnayışi: $1",
     "explainconflict": "Wexta ke şıma pel vurneyene yewna ten zi pel vurna.\nNuşteyo corin; halê pelo nıkayin mocneno.\nVurnayişê şıma cêr de mocya ( musya).\nVurnayişanê peyinan şıma gani qayd bıkeri.\nWexta ke şıma butonê \"{{int:savearticle}}\" tıkna '''teyna''' nuşteyo corin qayd beno.",
     "yourtext": "nuşteyê şıma",
     "storedversion": "Nuşteyo qaydbiyaye",
     "log-fulllog": "Temamê rocaneyi bıvine",
     "edit-hook-aborted": "Vurnayiş vınderiya.\nYew sebeb beyan nibı.",
     "edit-gone-missing": "Pel rocanebiyaye niyo.\nHewna kerde aseno.",
-    "edit-conflict": "Vurnayişê pêverdiyaye .",
+    "edit-conflict": "Têverabiyayışê vurnayışi.",
     "edit-no-change": "Vurnayişê şıma qebul nêbı, çunke nuşte de yew vurnayiş n3evıraziya.",
     "postedit-confirmation": "Vurnayışê to qeyd bi.",
     "edit-already-exists": "Pelo newe nêvıraziyeno.\nPel ca ra esto.",
     "cantcreateaccount-text": "Hesabvıraştışê na IP adrese ('''$1''') terefê [[User:$3|$3]] kılit biyo.\n\nSebebo ke terefê $3 ra diyao ''$2''",
     "viewpagelogs": "Heqa na pele de qeydan bıvêne",
     "nohistory": "Verê vurnayışanê na pele çıniyo.",
-    "currentrev": "Halo nıkayên",
+    "currentrev": "Çımraviyarnayışo rocane",
     "currentrev-asof": "Revizyonanê peniyan, tarixê $1",
     "revisionasof": "Verziyonê roca $1ine",
     "revision-info": "Vıraştena cı karber $2 ra rewizyona $1",
     "prefs-skin": "Çerme",
     "skin-preview": "Verasayış",
     "datedefault": "Tercih çıniyo",
-    "prefs-beta": "Hacetê beta",
-    "prefs-datetime": "Tarix u wext",
     "prefs-labs": "Xacetê labs",
     "prefs-user-pages": "Pela Karberi",
     "prefs-personal": "Pela karberi",
     "rightslogtext": "Ena listeyê loganê ke heqqa karbaranî mucneno.",
     "action-read": "ena pela wanayış",
     "action-edit": "ena pela bıvurnê",
-    "action-createpage": "pelan vıraze",
+    "action-createpage": "pelan vıraze",
     "action-createtalk": "pelanê werênayışi bıvıraze",
     "action-createaccount": "hesabê nê karberi bıvıraze",
     "action-minoredit": "nê vurnayışi be qıckek işaret ke",
     "upload-permitted": "Tipanê dosyayi ke izin ey estê: $1.",
     "upload-preferred": "Tipanê dosyayi ke tercihe ey estê: $1",
     "upload-prohibited": "Babetê dosyayanê tometebiyayeyan: $1.",
-    "uploadlog": "cıkewtışê barkerdışi",
     "uploadlogpage": "Cıkewtışê bar-kerdışi",
     "uploadlogpagetext": "cêr de [[Special:NewFiles|listeyê dosyayan]] estî.",
     "filename": "Namey Dosya",
     "filereuploadsummary": "Vurnayîşê dosyayî:",
     "filestatus": "Weziyetê heqa telifi:",
     "filesource": "Çıme:",
-    "uploadedfiles": "Dosyayê ke bar biye",
     "ignorewarning": "Îkazi kebul meke u dosya reyna bar bike",
     "ignorewarnings": "Îkazi kebul meke",
     "minlength1": "Nameyanê dosyayî de gani bî ezamî yew herf est biyê.",
     "overwroteimage": "yew versiyonê newvî ye \"[[$1]]\"î bar bike",
     "uploaddisabled": "bar kerdişî iptal biyo",
     "copyuploaddisabled": "URL bar kerdiş kefiliyeyo.",
-    "uploadfromurl-queued": "Bar kerdişê tu ha sira de vindeno.",
     "uploaddisabledtext": "Bar kerdişê dosyayî iptal biyo",
     "php-uploaddisabledtext": "barkerdışê dosyayê PHP nıka çino. kerem kere eyarê file_uploads korol bıkerê.",
     "uploadscripted": "Ena dosya de yew HTML ya zi kodê scriptî este ke belki browserê webî fam nikeno.",
     "sourceurl": "URLyê çımey:",
     "destfilename": "Destînasyonê nameyêdosya",
     "upload-maxfilesize": "Ebatêî dosya tewr girdî: $1",
-    "upload-description": "Deskripsiyonê dosyayî",
+    "upload-description": "Arezekerdışê dosya",
     "upload-options": "Tercihanê bar kerdişî",
     "watchthisupload": "Ena dosya seyr bike",
     "filewasdeleted": "no name de yew dosya yew wexto nızdi de bar biya u dıma zi serkaran hewn a kerdo. wexya ke şıma dosya bar keni bıewnê no pel $1.",
     "upload-misc-error": "Ğeletê bar kerdişî nizanyeno",
     "upload-misc-error-text": "wextê barkerdişî de yew xetayo mechul vırazîya.\nkonrol bıkeri şıma besteyi? Ya zi şıma karo raşt keni?\nEke problem dewam kerd [[Special:ListUsers/sysop|serkari]] de irtibat kewe.",
     "upload-too-many-redirects": "Eno URL de zaf redireksiyonî esto.",
-    "upload-unknown-size": "Ebat nizanyeno",
     "upload-http-error": "Yew ğeletê HTTPî biyo: $1",
     "upload-copy-upload-invalid-domain": "Na domain ra kopyayê barkerdışanê nêbenê.",
     "backend-fail-stream": "$1 nê vırazeyê",
     "img-auth-streaming": "\"$1\" stream keno.",
     "img-auth-public": "img_auth.php'nin fonksiyonê ney; wiki ra dosyaya xususiyan vetışo.\nno wiki bı umumi eyar biyo.\nqey pawıtışi, img_auth.php battal verdiyayo.",
     "img-auth-noread": "Heqqa karberanî çino ke \"$1\" biwendi",
-    "img-auth-bad-query-string": "URL'dı ratnayışo nêravêrde esto.",
     "http-invalid-url": "URL raşt niya: $1",
     "http-invalid-scheme": "URLan ke pê şablonê \"$1\"i rê destek cini ya.",
     "http-request-error": "Waştişê tu HTTP de xeta biya seba yew xetayê ke nizanyeno.",
     "filehist-dimensions": "Ebati",
     "filehist-filesize": "Ebatê dosyayî",
     "filehist-comment": "Vacayış",
-    "filehist-missing": "Dosya nieseno",
     "imagelinks": "Gurenayışê dosya",
     "linkstoimage": "Ena {{PLURAL:$1|pela|$1 pela}} gıreye ena dosya:",
     "linkstoimage-more": "$1 ra ziyed {{PLURAL:$1|pel|pel}} re gırey dano.\nlisteya ke ha ver a têna na {{PLURAL:$1|dosyaya ewwili|dosyaya $1 ewwili}} mocnena.\n[[Special:WhatLinksHere/$2|pêroyê liste]] mevcud o.",
     "pageswithprop-submit": "Şo",
     "pageswithprop-prophidden-long": "Erca metinda derger nımneya ($1)",
     "pageswithprop-prophidden-binary": "Erca dıdıyına ($1) nımneyé",
-    "doubleredirects": "Hetenayışê dıletıni",
+    "doubleredirects": "Serşıkıtışê dıleti",
     "doubleredirectstext": "no pel pelê ray motışani liste keno.\ngıreyê her satıri de gıreyi; raş motışê yewın u dıyıni esto.\n<del>serê ey nuşteyi</del> safi biye.",
     "double-redirect-fixed-move": "[[$1]] kırışiya, hıni ray dana [[$2]] no pel",
     "double-redirect-fixed-maintenance": "raçarnayışo dıletê [[$1]] ra  pela da [[$2]] timarêno",
     "emailuser-title-notarget": "E-postaya karberi",
     "emailpage": "karberi re e-posta bırışê",
     "emailpagetext": "Şıma şenê nê formê cêrêni nê {{GENDER:$1|karber}}i rê e-poste rıştış de bıgurenê.\n[[Special:Preferences|Tercihanê şımayê karberi]] de adresa e-posteya ke şıma daya, na adrese qısmê adresa e-postey de \"kami ra\" asena, no sebeb ra gırewtoğ şeno direkt cewab bıdero şıma.",
-    "usermailererror": "xizmetê e-postayi xeta da:",
     "defemailsubject": "\"$1\" ra e-postay {{SITENAME}} amê",
     "usermaildisabled": "E-mailê karberani kafiliyeya",
     "usermaildisabledtext": "Ti nieşkena ena wiki de karberanê binan rê e-mail bişave",
     "noemailtitle": "adresa e-postayi çina",
     "noemailtext": "no/na karber yew e-postayo meqbul nêdawa/o",
-    "nowikiemailtitle": "E-postayan re destur çino",
     "nowikiemailtext": "no/na karber/e, karberanê binani ra gırewtışê e-postayi tercih nêkerd.",
     "emailnotarget": "Qandê Gêreninamey karberiyo wuna çınyo yana xırabo.",
     "emailtarget": "Namey Karberi defiyê de.",
     "nowatchlist": "listeya temaşa kerdıişê şıma de yew madde zi çina.",
     "watchlistanontext": "qey vurnayişê maddeya listeya temaşakerdişi $1.",
     "watchnologin": "Şıma cıkewtış nêvıraşto",
-    "watchnologintext": "qey vurnayişê listeya temaşakerdışi [[Special:UserLogin|gani şıma hesab akeri]].",
     "addwatch": "Listeyê seyri deke",
     "addedwatchtext": "Ma pele \"[[:$1]]\" zerri [[Special:Watchlist|watchlist]]ê tı kerd de.\nEna deme ra, ma qe vurnayışan ser ena pele tı haberdar keni.",
     "removewatch": "Listedê mınê seyr kerdışi ra hewad",
     "watching": "Seyr ke...",
     "unwatching": "Seyr meke...",
     "watcherrortext": "Sazanê listeda seyri vurnayış de pox ta \"$1\" xırabey vıcyê .",
-    "enotif_mailer": "postaya xeberdayişi {{SITENAME}}",
     "enotif_reset": "Pela pêro ziyaret kerde deye mor ke",
     "enotif_impersonal_salutation": "{{SITENAME}} karber",
     "enotif_subject_deleted": "{{SITENAME}} de pera $1 {{gender:$2|$2}} esterıt.",
     "excontent": "Zerreko verén: '$1'",
     "excontentauthor": "Zerrey cı: '$1' no/na ('[[Special:Contributions/$2|$2]]'  teyna iştıraq kerdo)",
     "exbeforeblank": "behsê verê esteriyayişi: '$1'",
-    "exblank": "zerreyê peli vengo",
     "delete-confirm": "\"$1\" bestere",
     "delete-legend": "Bestere",
     "historywarning": "'''Teme:''' Pela ke şıma esterenê tede yew viyarte be teqriben $1 {{PLURAL:$1|versiyon esto|versiyoni estê}}:",
     "confirmdeletetext": "Tı ho yew pele u tarixê pele wederneno.\nTı ra rica keno, tı zani tı ho sekeno, tı zani neticeyanê eno wedarnayışi u tı zani tı ser [[{{MediaWiki:Policy-url}}|poliçe]] kar keno.",
-    "actioncomplete": "Xebten temam biyo",
+    "actioncomplete": "Kar bi temam",
     "actionfailed": "kar nêbı",
     "deletedtext": "\"$1\" biya wedariya.\nQe qeydê wedarnayışi, $2 bevinin.",
     "dellogpage": "Qeydê esterniye",
     "allmessagesname": "Name",
     "allmessagesdefault": "Metnê mesacê hesabiyayey",
     "allmessagescurrent": "Nuşteyê mesacê rocaney",
-    "allmessagestext": "na liste, listeya mesajê cayê nameyê wikimedya yo.\neke şıma qayili paşt bıdi mahalli kerdışê wikimedyayi, kerem kerê pelê [https://www.mediawiki.org/wiki/Localisation mahalli kerdışê wikimedyayi] u [//translatewiki.net translatewiki.net] ziyaret bıkerê.",
+    "allmessagestext": "na liste, listeya mesajê cayê nameyê wikimedya yo.\neke şıma qayili paşt bıdi mahalli kerdışê wikimedyayi, kerem kerê pelê [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation mahalli kerdışê wikimedyayi] u [//translatewiki.net translatewiki.net] ziyaret bıkerê.",
     "allmessagesnotsupportedDB": "'''$wgUseDatabaseMessages''' qefelnaye yo u ey ra '''{{ns:special}}:Allmessages''' karkerdışi re akerde niyo.",
     "allmessages-filter-legend": "Avrêc",
     "allmessages-filter": "goreyê xususi kerdışi re filtre bıker",
     "importunknownsource": "Çimeyê tip ê împortî nizanyano",
     "importcantopen": "Nieşkenî dosyayê împortî a bike",
     "importbadinterwiki": "Linkê înterwîkîyî nihebitiyeno",
-    "importnotext": "Veng o ya zi tede nuşte çini yo",
     "importsuccess": "Împort qediya!",
-    "importhistoryconflict": "verê revizyon ê ke pêverdiyaye yê tiya de mewcud o (no pel, belka cıwa ver kırışiyayo zerreyi)",
     "importnosources": "çımeyê kırıştışê zerredayişi nidiyo şınasnayişi u barbiyayişê verıni battal verdiyo.",
     "importnofile": "Yew zi dosyayê împortî bar nibiyo.",
     "importuploaderrorsize": "barbiyayişê kırıştışê zerredayişi nibı.\ngırdiyê dosyayi, gırdî yo ke musa'ade biyo ıney gırdıyî ra gırd o.",
     "version-entrypoints": "heruna dekewtış de GRE'i",
     "version-entrypoints-header-entrypoint": "Heruna dekewtışi",
     "version-entrypoints-header-url": "GRE",
-    "version-entrypoints-articlepath": "[https://www.mediawiki.org/wiki/Manual:$wgArticlePath Article path]",
-    "version-entrypoints-scriptpath": "[https://www.mediawiki.org/wiki/Manual:$wgScriptPath Script path]",
+    "version-entrypoints-articlepath": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgArticlePath Article path]",
+    "version-entrypoints-scriptpath": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgScriptPath Script path]",
     "redirect": "Serşıkıtena dosya, karberi, pele ya ki revizyonê kamiya dosya",
     "redirect-legend": "Hetenayışa dosya yana pela",
     "redirect-summary": "Na pela xase to hetê jû dosya (namey dosya daeyo), jû pele (kamiya revizyoni ya ki pele daiya) ya ki jû pela karberi (kamiya karberia reqemkiye daiya) ser şıknena. Gurenayış: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]], ya ki  [[{{#Special:Redirect}}/user/101]].",
     "logentry-rights-rights": "$1 qandê $3 rê ezayiya grube $4 ra $5 {{GENDER:$2|vuriye}}",
     "logentry-rights-rights-legacy": "$1 qandê $3 rê ezayiya grube {{GENDER:$2|vuriye}}",
     "logentry-rights-autopromote": "$1 otomatikmen $4 ra $5 {{GENDER:$2|terfi bi}}",
-    "rightsnone": "(çino)",
+    "rightsnone": "(çıniyo)",
     "feedback-bugornote": "Jew mersela teferruato teknik esta şıma reca malumatê şıma hazıro se [ $1  jew xırab rapor] bıvinê.Zewbi zi, formê cerê xo rê şenê karfiyê. Vatışê xo pela da \"[ $3  $2 ]\", namey karber dê xoya piya u wasteriya karfiye.",
     "feedback-subject": "Mewzu:",
     "feedback-message": "Mesac:",
index 00041bf..421f2c4 100644 (file)
     "prefs-skin": "Šat",
     "skin-preview": "Pśeglěd",
     "datedefault": "Standard",
-    "prefs-beta": "Preizkusne funkcije",
     "prefs-datetime": "Datum a cas",
     "prefs-labs": "Laborowe funkcije",
     "prefs-user-pages": "Wužywarske boki",
     "nowatchlist": "Žedne zapise w twójej wobglědowańce.",
     "watchlistanontext": "Dejš $1, aby mógał swóju wobglědowańku wiźeś abo zapise w njej wobźěłaś.",
     "watchnologin": "Njepśizjawjony(a)",
-    "watchnologintext": "Musyš [[Special:UserLogin|pśizjawjony]] byś, aby mógał swóju wobglědowańku wobźěłaś.",
     "addwatch": "K wobglědowańce dodaś",
     "addedwatchtext": "Bok \"[[:$1]]\" jo se k twójej [[Special:Watchlist|wobglědowańce]] dodał.\nPózdźejšne změny na toś tom boku a w pśisłušecej diskusiji se tam nalicuju.",
     "removewatch": "Z wobglědowańki wulašowaś",
     "sp-contributions-newbies-sub": "Za nowackow",
     "sp-contributions-newbies-title": "Wužywarske pśinoski nowych kontow",
     "sp-contributions-blocklog": "Protokol blokěrowanjow",
+    "sp-contributions-suppresslog": "pódtłocone wužywarske pśinoski",
     "sp-contributions-deleted": "Wulašowane wužywarske pśinoski",
     "sp-contributions-uploads": "nagraśa",
     "sp-contributions-logs": "protokole",
     "sp-contributions-blocked-notice": "Toś ten wužywaŕ jo tuchylu blokěrowany. Nejnowšy zapisk blokěrowańskego protokola pódawa se dołojce ako referenca:",
     "sp-contributions-blocked-notice-anon": "Toś ta IP-adresa jo tuchylu zablokěrowana.\nNejnowšy zapisk protokola blokěrowanjow pódawa se dołojce ako referenca:",
     "sp-contributions-search": "Pśinoski pytaś",
-    "sp-contributions-suppresslog": "pódtłocone wužywarske pśinoski",
     "sp-contributions-username": "IP-adresa abo wužywarske mě:",
     "sp-contributions-toponly": "Jano wuše wersije pokazaś",
     "sp-contributions-newonly": "Jano změny pokazaś, kótarež su napóranja bokow",
     "allmessagesname": "Mě",
     "allmessagesdefault": "Standardny tekst",
     "allmessagescurrent": "Aktualny tekst",
-    "allmessagestext": "How jo lisćina systemowych powěsćow w mjenowem rumje MediaWiki.\nPšosym wobglědaj [https://www.mediawiki.org/wiki/Localisation lokalizaciju MediaWiki] a [//translatewiki.net translatewiki.net], jolic coš k lokalizaciji MediaWiki pśinosowaś.",
+    "allmessagestext": "How jo lisćina systemowych powěsćow w mjenowem rumje MediaWiki.\nPšosym wobglědaj [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation lokalizaciju MediaWiki] a [//translatewiki.net translatewiki.net], jolic coš k lokalizaciji MediaWiki pśinosowaś.",
     "allmessagesnotsupportedDB": "'''{{ns:special}}:Allmessages''' njejo tuchylu móžno, dokulaž jo datowa banka offline.",
     "allmessages-filter-legend": "Filter",
     "allmessages-filter": "Pó pśiměrjeńskem stawje filtrěrowaś:",
index 37bdff9..7954bf2 100644 (file)
     "disclaimers": "ཁས་མི་ལེན་པ།",
     "disclaimerpage": "Project: སྤྱིར་བཏང་ཁས་མི་ལེན་པ།",
     "edithelp": "ཞུན་དག་གྲོགས་རམ།",
-    "helppage": "Help:ནང་དོན།",
     "mainpage": "མ་ཤོག།",
     "mainpage-description": "མ་ཤོག།",
     "portal": "མི་སྡེའི་སྒོ་ར།",
index f136209..5ce639c 100644 (file)
@@ -2,7 +2,8 @@
     "@metadata": {
         "authors": [
             "Lévi",
-            "Reder"
+            "Reder",
+            "Geitost"
         ]
     },
     "tog-underline": "Tîra 'na rîga sòta i colegamèint.",
     "permalink": "Colegamèint fés",
     "print": "Stâmpa",
     "view": "Guêrda",
+    "view-foreign": "Guardêr in séma $1",
     "edit": "Mudéfichi",
+    "edit-local": "Mudéfica la spiegasiòun lochêla",
     "create": "Invèinta",
+    "create-local": "Zûnta spiegasiòun lochêla",
     "editthispage": "Mudéfica cla pàgina ché",
     "create-this-page": "Fà cla pàgina ché",
     "delete": "Scanşéla",
     "pool-timeout": "Tèimp che gh'é da spetêr préma dal sblôch.",
     "pool-queuefull": "A ghé la fîla, trôpa gînta a vōl vèder la pàgina, prōva tra soquânt minût",
     "pool-errorunknown": "Erōr mìa cgnusû",
+    "pool-servererror": "Al servési cuntadōr di pool an n'é mìa léber per èser druvê",
     "aboutsite": "Infurmasiòun só {{SITENAME}}",
     "aboutpage": "Project:Infurmasiòun",
     "copyright": "Còl che gh' é che dèinter a 's pōl druvêr sòta licèinsa $1, s' an gh'é mia scrét diversamèint.",
     "accountcreatedtext": "È stê fât 'n'utèisa per [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|msg]]).",
     "createaccount-title": "Per fêr un inscrisiòun a {{SITENAME}}",
     "createaccount-text": "Quelchidûn l'à fât un inscrisiòun a  {{SITENAME}} ($4) a nòm ed $2 coleghê a cl'indirés ed pôsta eletrônica ché. La cêva 'd ingrès per l'utèint \"$2\" l'é  impustêda a \"$3\". \nÉ necesâri fêr un ingrès préma ch' es pôl e cambiêr subét la cêva 'd ingrès. \nSe l'inscrisiòun l'é stêda fâta per şbâli, es pōl scanşlêr sté mesâg.",
-    "usernamehasherror": "Al nòm utèint al pōl mìa avèir i carâter hash",
     "login-throttled": "În stê fât trôp tentatîv 'd ingrès in pôch tèimp. Spèta $1 e pó tōrna pruvêr.",
     "login-abort-generic": "An t'é mìa stê arcgnusû - Scanşlê",
     "loginlanguagelabel": "Léngva: $1",
     "accmailtitle": "Cêva 'd ingrès spidîda.",
     "accmailtext": "'Na cêva 'd ingrés l'è stêda fâta a chêş per [[User talk:$1|$1]] e l'è stêda spidîda a $2. Cla cêva 'd ingrès ché la pōl èser cambiêda int la pàgina per ''[[Special:ChangePassword|cambiêr la cêva 'd ingrès]]'' subét dôp avèir fât l'ingrès.",
     "newarticle": "(Nōv)",
-    "newarticletext": "Al colegamèint apèina fât al cumbîna cun 'na pàgina ch' an n'é mìa incòra stêda fâta. S'ét vō fêr la pàgina adès, l'é asê cumincêr a scréver al tèst int la caşèla ché sòt (per vedèr infurmasiòun pió precîşi guêrda la [$1 pàgina 'd ajót]). Se al colegamèint  l'é stê avêrt per erōr, l'é asê clichêr al pulsânt \"Indrē\" dal tó navigadōr.",
+    "newarticletext": "Al colegamèint apèina fât al cumbîna cun 'na pàgina ch' an n'é mìa incòra stêda fâta. S'ét vō fêr la pàgina adès, l'é asê cumincêr a scréver al tèst int la caşèla ché sòt (per vedèr infurmasiòun pió precîşi guêrda la [{{MediaWiki:Helppage}}| pàgina 'd ajót]). Se al colegamèint  l'é stê avêrt per erōr, l'é asê clichêr al pulsânt \"Indrē\" dal tó navigadōr.",
     "anontalkpagetext": "----'' Còsta l'è la pàgina 'd discusiòun ed 'n utèint sèinsa nòm, ch' an n' à mìa incòra fât 'n' utèinsa o in tót al manēri an n'è mìa drē druvêrla. Per arcgnòsrel l'è dòunca necesâri druvê al só indirés IP. J indirés IP a pōlen èser spartî cun êter utèint. Se t'è un utèint sèinsa nòm e 't pèins che i cumèint in cla pàgina ché an riguêrden mìa tè, [[Special:UserLogin/signup|fa 'n' utèinsa nōva]] o [[Special:UserLogin|vîn dèinter cun còla ch' ét gh'ê bèle]] per schivşêr, in futûr,  'd èser cunfûş cun 'd j êter utèint sèinsa nòm.''",
     "noarticletext": "In cól mumèint ché la pàgina serchêda l'é vōda. L'é pusébil [[Special:Search/{{PAGENAME}}|serchêr sté tétol]] int al j êtri pàgini dal sît, <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} serchêr int i regéster coleghê] opór  [{{fullurl:{{FULLPAGENAME}}|action=edit}} mudifichêr la pàgina adèsa]</span>.",
     "noarticletext-nopermission": "In cól mumèint ché la pàgina serchêda l'é vōda. L'é pusébil [[Special:Search/{{PAGENAME}}|serchêr sté tétol]] int al j êtri pàgini dal sît o<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} serchêr int i regéster coleghê] <span>, mó an 't gh'ê mìa al permès ed fêr cla pàgina ché.",
     "log-fulllog": "Guêrda la stòria dal registrasiòun",
     "edit-hook-aborted": "La mudéfica l'é stêda scanşlêda da l' hook.\nAn n'é mìa stê dê nisóna spiegasiòun.",
     "edit-gone-missing": "Impusébil arnuvêr la pàgina. \nA sèmbra ch'la sìa stêda scanşlêda.",
-    "edit-conflict": "Cuntrâst 'd edisiòun",
+    "edit-conflict": "Cuntrâst 'd edisiòun.",
     "edit-no-change": "La mudéfica an n'é mìa stêda cunsidrêda perchè an n'é mìa stê fât di cambiamèint al tèst.",
     "postedit-confirmation": "La mudéfica l'é stêda salvêda.",
     "edit-already-exists": "L'é impusébil fêr 'na pàgina nōva.\nLa ghé bèle.",
     "editpage-notsupportedcontentformat-text": "La fōrma dal scrét in $1 la rispèta mìa al mudèl scrét in $2.",
     "content-model-wikitext": "wikitèst",
     "content-model-text": "tèst normêl",
+    "content-model-javascript": "linguâg JavaScript",
+    "content-model-css": "fòj de stîl CSS",
     "expensive-parserfunction-warning": "'''Atensiòun:''' cla pàgina ché la gh'à trôpi ciamêdi ala funsiòun parse. A n' in duvré avèir mēno 'd $2, adèsa a {{PLURAL:$1|'gh n'é $1}}.",
     "expensive-parserfunction-category": "Pàgini cun trôpi ciamêdi a la funsiòun parser.",
     "post-expand-template-inclusion-warning": "'''Atensiòun:''' la grandèsa di mudē més dèinter l'é trôp grôsa. Soquânt mudē gnirâ mìa més dèinter.",
     "expansion-depth-exceeded-category": "Pàgini 'n dó vî pasê al fònd de şlargamèint",
     "expansion-depth-exceeded-warning": "Cla pàgina ché la pasê al fònd de şlargamèint",
     "parser-unstrip-loop-warning": "Catê sèria 'd Unistrip",
+    "parser-unstrip-recursion-limit": "A s'é pasê i lémit 'd arciâm 'd Unstrip ($1)",
+    "converter-manual-rule-error": "È stê catê un erōr int la règola a mân ed cambiamèint ed la léngua",
+    "undo-success": "Cla mudéfica ché la pō, èser scanşlêda., Cuntròla che sòta al diferèinsi che gh'é tr' al dō versiòun per èser sicûr che còl che gh'é scrét al cumbîna cun còl ch'ét vō, e dòunca salvêr al mudéfici per finîr la scanşladûra.",
+    "undo-failure": "Imposébil scanşlêr la mudéfica a câşva 'd un cuntrâst cun dal mudéfichi fâti dôp.",
+    "undo-norev": "La mudéfica l'an pōl mìa èser scanşlêda perchè l' an gh'é pió o l'é bèle stêda scanşlêda.",
+    "undo-nochange": "A sèmbra che la mudéfica la sìa bèle stêda scanşlêda.",
+    "undo-summary": "Scanşlê la mudéfica $1 ed [[Special:Contributions/$2|$2]]\n([[User talk:$2|discusiòun]])",
+    "undo-summary-username-hidden": "Scanşlê la modéfica $1 ed 'n utèin lughê",
+    "cantcreateaccounttitle": "Impusébil registrêr un utèint",
+    "cantcreateaccount-text": "La registrasiòun ed cl'indirés IP ché ('''$1''') l'é stêda bluchêda da [[User:$3|$3]]. \n\nAl mutîv dal blôch dê da $3 l'é còst: ''$2''.",
+    "cantcreateaccount-range-text": "La registrasiòun da indirés IP int l'intervâl '''$1''', in dó gh'é dèinter al tó  ('''$4'''), l'é stêda bluchêda da [[User:$3|$3]]. \n\nAl mutîv dê da $3 l'é ''$2''",
     "viewpagelogs": "Guêrda la stòria 'd cla pàgina ché",
+    "nohistory": "L'elèinch ed la stôria dal versiòun ed cla pàgina ché an 's câta mìa.",
     "currentrev": "Ûltma versiòun",
     "currentrev-asof": "Ûltma versiòun dal $1",
     "revisionasof": "Versiòun dal $1",
     "history-show-deleted": "Sōl quî scanşlê",
     "histfirst": "préma",
     "histlast": "ûltma",
+    "historyempty": "(vōda)",
+    "history-feed-title": "Stòria dal mudéfichi",
+    "history-feed-description": "Stòria 'd la pàgina in sém a cól sî ché",
     "history-feed-item-nocomment": "$1 al $2",
+    "history-feed-empty": "La pàgina serchêda l'an gh'é mìa; la pré èser stēda scanşlêda dal sît o gh'é stê cambiê nòm. Verifichêr cun [[Special:Search|pàgina 'd sèirca]] se gh'é dal pàgini nōvi.",
+    "rev-deleted-comment": "(argumèint ed la mudéfica armôs)",
+    "rev-deleted-user": "(nòm utèint armôs)",
+    "rev-deleted-event": "(asiòun dal log armôsa)",
+    "rev-deleted-user-contribs": "(nòm utèint o indirés IP armôs - mudéfica lughêda da la stòria)",
+    "rev-deleted-text-permission": "Cla versiòun ché 'd la pàgina l'é stêda <strong> scanşlêda </strong>. \nConsultêr al [{{fullurl:{{#Special:Log}}/delete|page={{PAGENAMEE}}}} log dal canşladûri] per nōv particulêr.",
+    "rev-deleted-text-unhide": "Cla versiòun ché 'd la pàgina l'é stêda <strong> scanşlêda </strong>. Consultêr al [{{fullurl:{{#Special:Log}}/delete|page={{PAGENAMEE}}}} log dal canşladûri] per nōv particulêr.\nS' l' é necesâri a j aministradōr a gh'é incòra permés [$1 ed guardêr cla versiòun ché].",
+    "rev-suppressed-text-unhide": "Cla versiòun ché 'd la pàgina l'é stêda <strong> scanşlêda </strong>. Consultêr al [{{fullurl:{{#Special:Log}}/delete|page={{PAGENAMEE}}}} log dal canşladûri] per nōv particulêr.\nS' l' é necesâri a j aministradōr a gh'é incòra permés [$1 ed guardêr cla versiòun ché].",
+    "rev-deleted-text-view": "Cla versiòun ché 'd la pàgina l'é stêda <strong> scanşlêda </strong>. J aministradōr a pōlen incòra guardêrla; \nconsultêr al [{{fullurl:{{#Special:Log}}/delete|page={{PAGENAMEE}}}} log dal canşladûri] per nōv particulêr.",
+    "rev-suppressed-text-view": "Cla versiòun ché 'd la pàgina l'é stêda <strong> scanşlêda </strong>. J aministradōr a pōlen incòra guardêrla; \nconsultêr al [{{fullurl:{{#Special:Log}}/delete|page={{PAGENAMEE}}}} log dal canşladûri] per nōv particulêr.",
     "rev-delundel": "Guêrda/nascònd",
     "revdelete-radio-set": "Nascònd",
     "revdelete-radio-unset": "Fà vèder",
     "prefs-skin": "Aspèt grâfich (skin)",
     "skin-preview": "Guêrda préma",
     "datedefault": "Nisóna preferèinsa",
-    "prefs-beta": "Funsionamèint 'beta'",
     "saveprefs": "Sêlva",
     "prefs-editing": "Caşèla 'd mudéfica",
     "rows": "Rîghi",
index 2482ce0..e044a54 100644 (file)
@@ -1,6 +1,41 @@
 {
     "@metadata": {
-        "authors": []
+        "authors": [
+            "AK",
+            "Assassingr",
+            "Astralnet",
+            "Axil",
+            "Badseed",
+            "Chomwitt",
+            "Consta",
+            "Crazymadlover",
+            "Dada",
+            "Dead3y3",
+            "Evropi",
+            "Flyax",
+            "FocalPoint",
+            "Geraki",
+            "Glavkos",
+            "Grondin",
+            "Kaganer",
+            "Kiolalis",
+            "Kiriakos",
+            "Kongr43gpen",
+            "Lou",
+            "MF-Warburg",
+            "Nikosguard",
+            "Omnipaedista",
+            "Protnet",
+            "Reedy",
+            "Remember the dot",
+            "Sinopeus",
+            "Tifa93",
+            "Xaris333",
+            "ZaDiak",
+            "Απεργός",
+            "Περίεργος",
+            "לערי ריינהארט"
+        ]
     },
     "tog-underline": "Υπογράμμιση συνδέσμων:",
     "tog-hideminor": "Απόκρυψη μικροεπεξεργασιών στις πρόσφατες αλλαγές",
     "loginlanguagelabel": "Γλώσσα: $1",
     "suspicious-userlogout": "Το αίτημα αποσύνδεσής σας απερρίφθη επειδή φαίνεται ότι στάλθηκε από ένα λανθασμένο φυλλομετρητή (browser) ή διακομιστή προσωρινής αποθήκευσης.",
     "createacct-another-realname-tip": "Το πραγματικό όνομα είναι προαιρετικό\nΑν επιλέξετε να το δώσετε, αυτό θα μπορεί να χρησιμοποιηθεί για να αναγνωριστεί η δουλειά σας.",
+    "pt-login": "Σύνδεση",
+    "pt-login-button": "Σύνδεση",
+    "pt-createaccount": "Δημιουργία λογαριασμού",
+    "pt-userlogout": "Αποσύνδεση;",
     "php-mail-error-unknown": "Άγνωστο σφάλμα στη συνάρτηση mail() της PHP.",
     "user-mail-no-addy": "Προσπαθήσατε να στείλετε e-mail χωρίς μια διεύθυνση e-mail.",
     "user-mail-no-body": "Προσπάθησε να στείλει e-mail με ένα κενό ή αδικαιολόγητα σύντομο σώμα.",
     "resetpass-recycled": "Παρακαλούμε επαναφέρετε τον κωδικό πρόσβασής σας σε κάτι διαφορετικό από τον τρέχοντα κωδικό πρόσβασης.",
     "resetpass-temp-password": "Προσωρινός κωδικός:",
     "resetpass-abort-generic": "Η αλλαγή του κωδικού έχει απορριφθεί από μια προέκταση.",
+    "resetpass-expired": "Τον κωδικό πρόσβασής σας έχει λήξει. Ορίστε ένα νέο κωδικό πρόσβασης για να συνδεθείτε.",
+    "resetpass-validity-soft": "Τον κωδικό πρόσβασής σας δεν είναι έγκυρος: $1 \nΠαρακαλώ επιλέξτε ένα νέο κωδικό πρόσβασης τώρα, ή κάντε κλικ στο κουμπί \"{{int:resetpass-submit-cancel}}\" για να το επαναφέρετε αργότερα.",
     "passwordreset": "Κωδικός επαναφοράς",
     "passwordreset-text-one": "Συμπληρώστε την παρακάτω φόρμα για να επαναφέρετε τον κωδικό πρόσβασής σας.",
     "passwordreset-text-many": "{{PLURAL:$1|Συμπληρώστε ένα από τα πεδία για να λάβετε προσωρινό κωδικό πρόσβαση μέσω ηλεκτρονικού ταχυδρομείου.}}",
     "revdelete-no-file": "Το αρχείο που καθορίσατε δεν υπάρχει.",
     "revdelete-show-file-confirm": "Είστε σίγουροι ότι θέλετε να δείτε μία διεγραμμένη αναθεώρηση του αρχείου \"<nowiki>$1</nowiki>\" από τις $2 στις $3;",
     "revdelete-show-file-submit": "Ναι",
+    "revdelete-selected-text": "'''{{PLURAL:$2|Επιλεγμένη έκδοση|Επιλεγμένες εκδόσεις}} της [[:$1]]:'''",
     "logdelete-selected": "{{PLURAL:$1|Επιλεγμένο γεγονός αρχείου καταγραφής|Επιλεγμένα γεγονότα αρχείου καταγραφής}}:",
     "revdelete-confirm": "Παρακαλούμε επιβεβαιώστε ότι σκοπεύετε να το κάνετε αυτό, ότι αντιλαμβάνεσθε τις συνέπειες, και ότι το κάνετε σύμφωνα με την [[{{MediaWiki:Policy-url}}|πολιτική]].",
     "revdelete-suppress-text": "Η καταστολή μπορεί να χρησιμοποιηθεί <strong> μόνο </strong> για τις ακόλουθες περιπτώσεις:\n* Ενδεχόμενη συκοφαντική δυσφήμιση\n* Ακατάλληλες προσωπικές πληροφορίες\n*: <em>διευθύνσεις κατοικίας και αριθμοί τηλεφώνου, αριθμοί ταυτότητας, κλπ. </em>",
     "prefs-skin": "Οπτική οργάνωση (skin)",
     "skin-preview": "Προεπισκόπηση",
     "datedefault": "Χωρίς προτίμηση",
-    "prefs-beta": "Λειτουργίες της Beta",
     "prefs-datetime": "Ημερομηνία και ώρα",
     "prefs-labs": "Λειτουργίες των Labs",
     "prefs-user-pages": "Σελίδες του χρήστη",
     "right-editmyusercss": "Επεξεργασία των ιδιωτικών αρχείων CSS χρήστη",
     "right-editmyuserjs": "Επεξεργασία των ιδιωτικών αρχείων JavaScript χρήστη",
     "right-viewmywatchlist": "Προβολή της δικής σας λίστα παρακολούθησης",
+    "right-viewmyprivateinfo": "Δείτε τα προσωπικά σας δεδομένα (π.χ. διεύθυνση ηλεκτρονικού ταχυδρομείου, πραγματικό όνομα)",
+    "right-editmyprivateinfo": "Επεξεργαστείτε τα προσωπικά σας δεδομένα (π.χ. διεύθυνση ηλεκτρονικού ταχυδρομείου, πραγματικό όνομα)",
     "right-editmyoptions": "Επεξεργασία των προτιμήσεών σας",
     "right-rollback": "Γρήγορη αναστροφή των επεξεργασιών του τελευταίου χρήστη που επεξεργάστηκε μια σελίδα",
     "right-markbotedits": "Σήμανση επαναφερόμενων επεξεργασιών ως επεξεργασιών μποτ",
     "recentchanges-label-plusminus": "Μεταβολή του μεγέθους της σελίδας σε bytes",
     "recentchanges-legend-heading": "'''Υπόμνημα:'''",
     "recentchanges-legend-newpage": "(δείτε [[Special:NewPages|Νέες σελίδες]])",
-    "rcnotefrom": "Παρακάτω είναι οι αλλαγές από τις '''$2''' (εμφανίζονται μέχρι '''$1''').",
+    "rcnotefrom": "Παρακάτω είναι οι αλλαγές από τις <strong>$2</strong>  (εμφανίζονται μέχρι <strong>$1</strong> ).",
     "rclistfrom": "Εμφάνιση νέων αλλαγών αρχίζοντας από $1",
     "rcshowhideminor": "$1 μικροεπεξεργασιών",
     "rcshowhideminor-show": "Εμφάνιση",
     "rcshowhideminor-hide": "Απόκρυψη",
     "rcshowhidebots": "$1 ρομπότ",
+    "rcshowhidebots-show": "Εμφάνιση",
+    "rcshowhidebots-hide": "Απόκρυψη",
     "rcshowhideliu": "$1 εγγεγραμμένων χρηστών",
+    "rcshowhideliu-show": "Εμφάνιση",
+    "rcshowhideliu-hide": "Απόκρυψη",
     "rcshowhideanons": "$1 ανωνύμων χρηστών",
+    "rcshowhideanons-show": "Εμφάνιση",
+    "rcshowhideanons-hide": "Απόκρυψη",
     "rcshowhidepatr": "$1 ελεγμένων επεξεργασιών",
+    "rcshowhidepatr-show": "Εμφάνιση",
+    "rcshowhidepatr-hide": "Απόκρυψη",
     "rcshowhidemine": "$1 των επεξεργασιών μου",
+    "rcshowhidemine-show": "Εμφάνιση",
+    "rcshowhidemine-hide": "Απόκρυψη",
     "rclinks": "Εμφάνιση των τελευταίων $1 αλλαγών στο διάστημα των τελευταίων $2 ημερών<br />$3",
     "diff": "διαφορά",
     "hist": "ιστορικό",
     "uploaddisabledtext": "Η φόρτωση αρχείων είναι απενεργοποιημένη.",
     "php-uploaddisabledtext": "Οι επιφορτώσεις αρχείων ειναι απενεργοποιημένες στην PHP. Παρακαλούμε, ελέγξτε την ρύθμιση file_uploads.",
     "uploadscripted": "Αυτό το αρχείο περιέχει κώδικα HTML ή script που μπορεί να παρερμηνευθεί από μερικούς browser.",
+    "uploadinvalidxml": "Δεν ήταν δυνατή η ανάλυση του κώδικα XML στο αρχείο.",
     "uploadvirus": "Το αρχείο περιέχει ιό! Λεπτομέρειες: $1",
     "uploadjava": "Το αρχείο είναι αρχείο ZIP, το οποίο περιέχει ένα αρχείο .class της γλώσσας Java.\nΔεν επιτρέπεται η αποστολή αρχείων Java, επειδή μπορούν να προκαλέσουν παράκαμψη των περιορισμών ασφαλείας του συστήματος.",
     "upload-source": "Αρχείο πηγής",
     "download": "λήψη",
     "unwatchedpages": "Μη παρακολουθούμενες σελίδες",
     "listredirects": "Λίστα ανακατευθύνσεων",
+    "listduplicatedfiles": "Κατάλογος αρχείων με διπλότυπα",
     "unusedtemplates": "Αχρησιμοποίητα πρότυπα",
     "unusedtemplatestext": "Αυτή η σελίδα περιέχει όλες τις σελίδες στην περιοχή ονομάτος των {{ns:template}}, οι οποίες δεν περιλαμβάνονται σε άλλη σελίδα. Θυμηθείτε να ελέγξετε για άλλους συνδέσμους προς τα πρότυπα πριν τα διαγράψετε.",
     "unusedtemplateswlh": "άλλοι σύνδεσμοι",
     "ninterwikis": "$1 {{PLURAL:$1|σύνδεσμος|σύνδεσμοι}} interwiki",
     "nlinks": "$1 {{PLURAL:$1|σύνδεσμος|σύνδεσμοι}}",
     "nmembers": "$1 {{PLURAL:$1|μέλος|μέλη}}",
+    "nmemberschanged": "$1 → $2 {{PLURAL:$2|μέλος|μέλη}}",
     "nrevisions": "$1 {{PLURAL:$1|αναθεώρηση|αναθεωρήσεις}}",
     "nviews": "$1 {{PLURAL:$1|επίσκεψη|επισκέψεις}}",
     "nimagelinks": "Χρησιμοποιείται σε $1 {{PLURAL:$1|σελίδα|σελίδες}}",
     "protectedpages-page": "Σελίδα",
     "protectedpages-expiry": "Λήγει",
     "protectedpages-performer": "Προστασία χρήστη",
+    "protectedpages-reason": "Αιτία",
     "protectedpages-unknown-timestamp": "Άγνωστο",
     "protectedpages-unknown-performer": "Άγνωστος χρήστης",
     "protectedtitles": "Προστατευμένοι τίτλοι",
     "nowatchlist": "Δεν υπάρχουν εγγραφές στη λίστα παρακολούθησης.",
     "watchlistanontext": "Παρακαλώ $1 για να δείτε ή να επεξεργαστείτε στοιχεία στη λίστα παρακολούθησής σας.",
     "watchnologin": "Δεν έχετε συνδεθεί.",
-    "watchnologintext": "Για να κάνετε αλλαγές στη λίστα παρακολούθησης πρέπει να [[Special:UserLogin|συνδεθείτε]].",
     "addwatch": "Προσθήκη στη λίστα παρακολούθησης",
     "addedwatchtext": "Η σελίδα «[[:$1]]» έχει προστεθεί στη [[Special:Watchlist|λίστα παρακολούθησής σας]].\nΜελλοντικές αλλαγές σε αυτή τη σελίδα και στη συσχετισμένη σελίδα συζήτησής της θα εμφανίζονται εδώ.",
     "removewatch": "Αφαίρεση από τη λίστα παρακολούθησης",
     "allmessagesname": "Όνομα",
     "allmessagesdefault": "Προεπιλεγμένο κείμενο μηνύματος",
     "allmessagescurrent": "Παρόν κείμενο",
-    "allmessagestext": "Αυτή είναι μια λίστα με όλα τα μηνύματα συστήματος που βρίσκονται στην περιοχή MediaWiki.\nΠαρακαλούμε επισκεφθείτε τα [https://www.mediawiki.org/wiki/Localisation MediaWiki Localisation] και [//translatewiki.net translatewiki.net] αν επιθυμείτε να συνεισφέρετε σε μια γενική μετάφραση του MediaWiki.",
+    "allmessagestext": "Αυτή είναι μια λίστα με όλα τα μηνύματα συστήματος που βρίσκονται στην περιοχή MediaWiki.\nΠαρακαλούμε επισκεφθείτε τα [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation MediaWiki Localisation] και [//translatewiki.net translatewiki.net] αν επιθυμείτε να συνεισφέρετε σε μια γενική μετάφραση του MediaWiki.",
     "allmessagesnotsupportedDB": "Αυτή η σελίδα δεν υποστηρίζεται επειδή το ''wgUseDatabaseMessages'' είναι απενεργοποιημένο.",
     "allmessages-filter-legend": "Φίλτρο",
     "allmessages-filter": "Ταξινόμηση βάσει της δήλωσης προσαρμογής:",
index a821207..646727b 100644 (file)
@@ -40,7 +40,6 @@
     "jumptosearch": "Sèirca",
     "currentevents": "Fât e prugèt ed tót",
     "currentevents-url": "Project:Prugèt_ed_tót",
-    "helppage": "Help:Introdusiòun",
     "portal": "Discóter e quistiunêr",
     "portal-url": "Project:Bar",
     "nstab-main": "Artécol",
index 9031b96..41c12b3 100644 (file)
     "permalink": "Permanent link",
     "print": "Print",
     "view": "View",
+    "view-foreign": "View on $1",
     "edit": "Edit",
+    "edit-local": "Edit local description",
     "create": "Create",
+    "create-local": "Add local description",
     "editthispage": "Edit this page",
     "create-this-page": "Create this page",
     "delete": "Delete",
     "accountcreatedtext": "The user account for [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|talk]]) has been created.",
     "createaccount-title": "Account creation for {{SITENAME}}",
     "createaccount-text": "Someone created an account for your email address on {{SITENAME}} ($4) named \"$2\", with password \"$3\".\nYou should log in and change your password now.\n\nYou may ignore this message, if this account was created in error.",
-    "usernamehasherror": "Username cannot contain hash characters",
     "login-throttled": "You have made too many recent login attempts.\nPlease wait $1 before trying again.",
     "login-abort-generic": "Your login was unsuccessful - Aborted",
     "loginlanguagelabel": "Language: $1",
     "prefs-skin": "Skin",
     "skin-preview": "Preview",
     "datedefault": "No preference",
-    "prefs-beta": "Beta features",
-    "prefs-datetime": "Date and time",
     "prefs-labs": "Labs features",
     "prefs-user-pages": "User pages",
     "prefs-personal": "User profile",
     "upload-prohibited": "Prohibited file types: $1.",
     "uploadfooter": "-",
     "upload-default-description": "-",
-    "uploadlog": "upload log",
     "uploadlogpage": "Upload log",
     "uploadlogpagetext": "Below is a list of the most recent file uploads.\nSee the [[Special:NewFiles|gallery of new files]] for a more visual overview.",
     "filename": "Filename",
     "filereuploadsummary": "File changes:",
     "filestatus": "Copyright status:",
     "filesource": "Source:",
-    "uploadedfiles": "Uploaded files",
     "ignorewarning": "Ignore warning and save file anyway",
     "ignorewarnings": "Ignore any warnings",
     "minlength1": "Filenames must be at least one letter.",
     "overwroteimage": "uploaded a new version of \"[[$1]]\"",
     "uploaddisabled": "Uploads disabled.",
     "copyuploaddisabled": "Upload by URL disabled.",
-    "uploadfromurl-queued": "Your upload has been queued.",
     "uploaddisabledtext": "File uploads are disabled.",
     "php-uploaddisabledtext": "File uploads are disabled in PHP.\nPlease check the file_uploads setting.",
     "uploadscripted": "This file contains HTML or script code that may be erroneously interpreted by a web browser.",
     "upload-misc-error": "Unknown upload error",
     "upload-misc-error-text": "An unknown error occurred during the upload.\nPlease verify that the URL is valid and accessible and try again.\nIf the problem persists, contact an [[Special:ListUsers/sysop|administrator]].",
     "upload-too-many-redirects": "The URL contained too many redirects",
-    "upload-unknown-size": "Unknown size",
     "upload-http-error": "An HTTP error occurred: $1",
     "upload-copy-upload-invalid-domain": "Copy uploads are not available from this domain.",
     "backend-fail-stream": "Could not stream file \"$1\".",
     "img-auth-streaming": "Streaming \"$1\".",
     "img-auth-public": "The function of img_auth.php is to output files from a private wiki.\nThis wiki is configured as a public wiki.\nFor optimal security, img_auth.php is disabled.",
     "img-auth-noread": "User does not have access to read \"$1\".",
-    "img-auth-bad-query-string": "The URL has an invalid query string.",
     "http-invalid-url": "Invalid URL: $1",
     "http-invalid-scheme": "URLs with the \"$1\" scheme are not supported.",
     "http-request-error": "HTTP request failed due to unknown error.",
     "filehist-dimensions": "Dimensions",
     "filehist-filesize": "File size",
     "filehist-comment": "Comment",
-    "filehist-missing": "File missing",
     "imagelinks": "File usage",
     "linkstoimage": "The following {{PLURAL:$1|page links|$1 pages link}} to this file:",
     "linkstoimage-more": "More than $1 {{PLURAL:$1|page links|pages link}} to this file.\nThe following list shows the {{PLURAL:$1|first page link|first $1 page links}} to this file only.\nA [[Special:WhatLinksHere/$2|full list]] is available.",
     "listgrouprights-removegroup-self": "Remove {{PLURAL:$2|group|groups}} from own account: $1",
     "listgrouprights-addgroup-self-all": "Add all groups to own account",
     "listgrouprights-removegroup-self-all": "Remove all groups from own account",
+    "listgrouprights-namespaceprotection-header": "Namespace restrictions",
+    "listgrouprights-namespaceprotection-namespace": "Namespace",
+    "listgrouprights-namespaceprotection-restrictedto": "Right(s) allowing user to edit",
     "trackingcategories": "Tracking categories",
     "trackingcategories-summary": "This page lists tracking categories which are automatically populated by the MediaWiki software. Their names can be changed by altering the relevant system messages in the {{ns:8}} namespace.",
-    "trackingcategories-msg": "Tracking Category",
+    "trackingcategories-msg": "Tracking category",
     "trackingcategories-name": "Message name",
     "trackingcategories-desc": "Category inclusion criteria",
-    "noindex-category-desc": "The page has a <nowiki>__NOINDEX__</nowiki> magic word on it (and is in a namespace where that flag is allowed), and hence is not indexed by robots.",
-    "index-category-desc": "The page has a <nowiki>__INDEX__</nowiki> on it (and is in a namespace where that flag is allowed), and hence is indexed by robots where it normally wouldn't be.",
-    "post-expand-template-inclusion-category-desc": "After expanding all the templates, the page size is bigger than $wgMaxArticleSize, so some templates weren't expanded.",
-    "post-expand-template-argument-category-desc": "After expanding a template argument (something in triple braces, like {{{Foo}}}), the page is bigger than $wgMaxArticleSize.",
+    "noindex-category-desc": "The page is not indexed by robots because it has the magic word <code><nowiki>__NOINDEX__</nowiki></code> on it and is in a namespace where that flag is allowed.",
+    "index-category-desc": "The page has a <code><nowiki>__INDEX__</nowiki></code> on it (and is in a namespace where that flag is allowed), and hence is indexed by robots where it normally wouldn't be.",
+    "post-expand-template-inclusion-category-desc": "After expanding all the templates, the page size is bigger than <code>$wgMaxArticleSize</code>, so some templates weren't expanded.",
+    "post-expand-template-argument-category-desc": "After expanding a template argument (something in triple braces, like <code>{{{Foo}}}</code>), the page is bigger than <code>$wgMaxArticleSize</code>.",
     "expensive-parserfunction-category-desc": "Too many expensive parser functions (like <code>#ifexist</code>) included on a page. See [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit Manual:$wgExpensiveParserFunctionLimit].",
     "broken-file-category-desc": "Category added if the page contains a broken file link (a link to embed a file when the file does not exist).",
-    "hidden-category-category-desc": "This is a category with <nowiki>__HIDDENCAT__</nowiki> on it, which prevents it from showing up in the category links box on pages, by default.",
+    "hidden-category-category-desc": "This is a category with <code><nowiki>__HIDDENCAT__</nowiki></code> on it, which prevents it from showing up in the category links box on pages, by default.",
     "trackingcategories-nodesc": "No description available.",
     "trackingcategories-disabled": "Category is disabled",
     "mailnologin": "No send address",
     "emailuser-summary": "",
     "emailpage": "Email user",
     "emailpagetext": "You can use the form below to send an email message to this {{GENDER:$1|user}}.\nThe email address you entered in [[Special:Preferences|your user preferences]] will appear as the \"From\" address of the email, so the recipient will be able to reply directly to you.",
-    "usermailererror": "Mail object returned error:",
     "defemailsubject": "{{SITENAME}} email from user \"$1\"",
     "usermaildisabled": "User email disabled",
     "usermaildisabledtext": "You cannot send email to other users on this wiki",
     "noemailtitle": "No email address",
     "noemailtext": "This user has not specified a valid email address.",
-    "nowikiemailtitle": "No email allowed",
     "nowikiemailtext": "This user has chosen not to receive email from other users.",
     "emailnotarget": "Non-existent or invalid username for recipient.",
     "emailtarget": "Enter username of recipient",
     "nowatchlist": "You have no items on your watchlist.",
     "watchlistanontext": "Please $1 to view or edit items on your watchlist.",
     "watchnologin": "Not logged in",
-    "watchnologintext": "You must be [[Special:UserLogin|logged in]] to modify your watchlist.",
     "addwatch": "Add to watchlist",
     "addedwatchtext": "The page \"[[:$1]]\" has been added to your [[Special:Watchlist|watchlist]].\nFuture changes to this page and its associated talk page will be listed there.",
     "removewatch": "Remove from watchlist",
     "unwatchthispage": "Stop watching",
     "notanarticle": "Not a content page",
     "notvisiblerev": "The last revision by a different user has been deleted",
-    "watchlist-details": "{{PLURAL:$1|$1 page|$1 pages}} on your watchlist, not counting talk pages.",
+    "watchlist-details": "{{PLURAL:$1|$1 page|$1 pages}} on your watchlist, not separately counting talk pages.",
     "wlheader-enotif": "Email notification is enabled.",
     "wlheader-showupdated": "Pages that have been changed since you last visited them are shown in <strong>bold</strong>.",
     "watchmethod-recent": "checking recent edits for watched pages",
     "watching": "Watching...",
     "unwatching": "Unwatching...",
     "watcherrortext": "An error occurred while changing your watchlist settings for \"$1\".",
-    "enotif_mailer": "{{SITENAME}} notification mailer",
     "enotif_reset": "Mark all pages visited",
     "enotif_impersonal_salutation": "{{SITENAME}} user",
     "enotif_subject_deleted": "{{SITENAME}} page $1 has been {{GENDER:$2|deleted}} by $2",
     "excontent": "content was: \"$1\"",
     "excontentauthor": "content was: \"$1\" (and the only contributor was \"[[Special:Contributions/$2|$2]]\")",
     "exbeforeblank": "content before blanking was: \"$1\"",
-    "exblank": "page was empty",
     "delete-confirm": "Delete \"$1\"",
     "delete-legend": "Delete",
     "historywarning": "<strong>Warning:</strong> The page you are about to delete has a history with approximately $1 {{PLURAL:$1|revision|revisions}}:",
     "contributions-title": "User contributions for $1",
     "mycontris": "Contributions",
     "contribsub2": "For {{GENDER:$3|$1}} ($2)",
+    "contributions-userdoesnotexist": "User account \"$1\" is not registered.",
     "nocontribs": "No changes were found matching these criteria.",
     "uctop": "(current)",
     "month": "From month (and earlier):",
     "importunknownsource": "Unknown import source type",
     "importcantopen": "Could not open import file",
     "importbadinterwiki": "Bad interwiki link",
-    "importnotext": "Empty or no text",
     "importsuccess": "Import finished!",
-    "importhistoryconflict": "Conflicting history revision exists (may have imported this page before)",
     "importnosources": "No transwiki import sources have been defined and direct history uploads are disabled.",
     "importnofile": "No import file was uploaded.",
     "importuploaderrorsize": "Upload of import file failed.\nThe file is bigger than the allowed upload size.",
index 28c3434..5909cf1 100644 (file)
     "print": "Printi",
     "view": "Vidi",
     "edit": "Redakti",
+    "edit-local": "Redakti lokan priskribon",
     "create": "Krei",
+    "create-local": "Aldoni lokan priskribon",
     "editthispage": "Redakti la paĝon",
     "create-this-page": "Krei ĉi tiun paĝon",
     "delete": "Forigi",
     "invalidtitle-unknownnamespace": "Nevalida titolo kun nekonata nomspaca numero $1 kaj teksto \"$2\"",
     "exception-nologin": "Ne ensalutinta",
     "exception-nologin-text": "Bonvolu [[Special:Userlogin|ensaluti]] por atingi ĉi tiun paĝon aŭ agon.",
+    "exception-nologin-text-manual": "Vi devas $1, por povi aliri al ĉi tiu paĝo aŭ ago.",
     "virus-badscanner": "Malbona konfiguro: nekonata virusa skanilo: ''$1''",
     "virus-scanfailed": "skano malsukcesis (kun kodo $1)",
     "virus-unknownscanner": "nekonata kontraŭvirusilo:",
     "gotaccountlink": "Ensaluti",
     "userlogin-resetlink": "Ĉu vi forgesis ensalutajn detalojn?",
     "userlogin-resetpassword-link": "Ĉu vi forgesis vian pasvorton?",
+    "userlogin-helplink2": "Helpo pri ensaluto",
     "userlogin-loggedin": "Vi jam estas ensalutita kiel {{GENDER:$1|$1}}.\nUzu la formularon suben por ensaluti kiel alia uzanto.",
     "userlogin-createanother": "Krei alian konton",
     "createacct-join": "Suben enigu informojn pri vi",
     "accountcreatedtext": "La uzanto-konto por [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|diskuto]])  estas kreita.",
     "createaccount-title": "Konto-kreado por {{SITENAME}}",
     "createaccount-text": "Iu kreis konton por via retadreso en {{SITENAME}} ($4) nomata \"$2\", kun pasvorto \"$3\". Vi ensalutu kaj ŝanĝu vian pasvorton nun.\n\nVi povas ignori ĉi tiun mesaĝon, se ĉi tiu konto estis kreita erare.",
-    "usernamehasherror": "Salutnomo ne povas enhavi signojn de kriptaj haketaĵoj",
     "login-throttled": "Vi ĵus tro ofte provis ensaluti.\nBonvolu ĝisatendi $1 antaŭ reprovi.",
     "login-abort-generic": "Via ensaluto malsukcesis - Ĉesigita",
     "loginlanguagelabel": "Lingvo: $1",
     "suspicious-userlogout": "Via peto por elsaluti estis malpermesita, ĉar verŝajne ĝi estis sendita de trompita retumilo aŭ kaŝiĝanta prokura servilo.",
     "createacct-another-realname-tip": "La vera nomo estas nenecesa.\nSe vi decidas indiki ĝin, ĝi estos uzata por montri atribuadon de viaj kontribuoj.",
     "pt-login": "Ensaluti",
+    "pt-login-button": "Ensaluti",
     "pt-createaccount": "Krei novan konton",
     "pt-userlogout": "Elsaluti",
     "php-mail-error-unknown": "Nekonata eraro en la funkcio mail() de PHP",
     "resetpass-submit-cancel": "Nuligi",
     "resetpass-wrong-oldpass": "Malvalida provizora aŭ nuna pasvorto.\nVi eble jam ŝanĝis vian pasvorton aŭ petis novan provizoran pasvorton.",
     "resetpass-recycled": "Bonvolu agordi vian novan pasvorton, kiu estu alia ol via nuntempa pasvorto.",
+    "resetpass-temp-emailed": "Vi alsalutis kun portempa retpoŝta kodo. Por fini la alsalutadon, vi ĉi tie devas difini novan pasvorton.",
     "resetpass-temp-password": "Provizora pasvorto:",
     "resetpass-abort-generic": "Ŝanĝo de pasvorto estis nuligita per kromprogramo.",
+    "resetpass-expired": "Via pasvorto eksvalidiĝis. Bonvolu difini novan pasvorton por la alsalutado.",
+    "resetpass-expired-soft": "Via pasvorto eksvalidiĝis kaj devas esti rekomencigata. Bonvolu nun elekti novan pasvorton, aŭ klaki \"{{int:resetpass-submit-cancel}}\" por rekomencigi ĝin pli malfrue.",
+    "resetpass-validity-soft": "Via pasvorto ne estas valida: $1\n\nBonvolu elekti novan pasvorton nun, aŭ klaku \"{{int:resetpass-submit-cancel}}\", por rekomencigi ĝin pli malfrue.",
     "passwordreset": "Restarigo de pasvorto",
     "passwordreset-text-one": "Plenigu ĉi tiun formularon por renovigi vian pasvorton.",
     "passwordreset-text-many": "{{PLURAL:$1|Plenumu unu el la kampoj por restarigi vian pasvorton.}}",
     "changeemail-password": "Via {{SITENAME}}-ensalutado:",
     "changeemail-submit": "Ŝanĝi retpoŝtadreson",
     "changeemail-cancel": "Nuligi",
+    "changeemail-throttled": "Vi tro ofte provis alsaluti.\nBonvolu atendi $1, antaŭ ol vi provos denove.",
     "resettokens": "Renovigi ŝlosilojn",
+    "resettokens-text": "Vi povas rekomencigi ĵetonojn, kiuj ebligas aliron al certaj privataj datumoj, kiuj estas ligataj kun via konto de uzanto ĉi tie.\n\nVi faru tion, se vi akcidente kunhavigis ilin kun iu aŭ se via konto estis malkonfidencigita.",
     "resettokens-no-tokens": "Ne estas ŝlosiloj renovigeblaj.",
     "resettokens-legend": "Renovigi ŝlosilojn",
     "resettokens-tokens": "Ŝlosiloj:",
     "resettokens-token-label": "$1 (nuna valoro: $2)",
+    "resettokens-watchlist-token": "Ĵetono por la retfluo (Atom/RSS) de [[Special:Watchlist|ŝanĝoj je paĝoj sur via atentaro]]",
     "resettokens-done": "Ŝlosiloj renovigitaj.",
     "resettokens-resetbutton": "Renovigi elektitajn ŝlosilojn",
     "bold_sample": "Grasa teksto",
     "invalid-content-data": "Enhavo estas malvalida",
     "content-not-allowed-here": "Enhavo de $1 ne estas permesita en paĝo [[$2]]",
     "editwarning-warning": "Forlaso de ĉi tiu paĝo kaŭzos al vi perdi iun ajn ŝanĝojn kiujn vi faris.\nSe vi estas ensalutinta, vi povas malŝalti ĉi tiun averton en la sekcio \"{{int:prefs-editing}}\" de viaj preferoj.",
+    "editpage-notsupportedcontentformat-title": "Nesubtenata enhavoformo",
+    "editpage-notsupportedcontentformat-text": "La enhava aranĝo $1 ne estas subtenata de la enhava modelo $2.",
     "content-model-wikitext": "vikiteksto",
     "content-model-text": "ordinara teksto",
     "content-model-javascript": "JavaScript",
     "undo-success": "La redakto estas malfarebla.\nBonvolu kontroli la jenan komparaĵon por certiĝi ĉu tio estas tio, kion vi volas, kaj konservi la ŝanĝojn malsupre por fine malfari la redakton.",
     "undo-failure": "Ne povis nuligi redakton pro konfliktaj intermezaj redaktoj.",
     "undo-norev": "La redakto ne povis esti malfarita ĉar ĝi aŭ ne ekzistas aŭ estis forigita.",
+    "undo-nochange": "Ŝajne la redakto jam estis malfarita.",
     "undo-summary": "Nuligis version $1 de [[Special:Contributions/$2|$2]] ([[User talk:$2|Diskuto]] | [[Special:Contributions/$2|{{MediaWiki:Contribslink}}]])",
     "undo-summary-username-hidden": "Malfari ŝanĝon $1 de kaŝita uzulo",
     "cantcreateaccounttitle": "Ne povas krei konton",
     "cantcreateaccount-text": "Konto-kreado de ĉi tiu IP-adreso ('''$1''') estis forbarita de [[User:$3|$3]].\n\nLa kialo donata de $3 estas ''$2''.",
+    "cantcreateaccount-range-text": "La kreado de kontoj de IP-adresoj en la intervalo '''$1''', kiu inkludas vian IP-adreson ('''$4'''), estis blokita de [[User:$3|$3]].\n\nLa donita kialo de $3 estas ''$2''",
     "viewpagelogs": "Rigardi la protokolojn por tiu ĉi paĝo",
     "nohistory": "Ne ekzistas historio de redaktoj por ĉi tiu paĝo.",
     "currentrev": "Aktuala versio",
     "revdelete-no-file": "La specifita dosiero ne ekzistas.",
     "revdelete-show-file-confirm": "Ĉu vi certas ke vi volas vidi forigitan revizion de la dosiero \"<nowiki>$1</nowiki>\" de $2, $3?",
     "revdelete-show-file-submit": "Jes",
+    "revdelete-selected-text": "{{PLURAL:$1|Selektita versio|Selektitaj versioj}} de [[:$2]]:",
+    "revdelete-selected-file": "{{PLURAL:$1|Selektita dosiera versio|Selektitaj dosieraj versioj}} de [[:$2]]:",
     "logdelete-selected": "{{PLURAL:$1|Selektata protokola evento|Selektataj protokolaj eventoj}}:",
+    "revdelete-text-text": "Forigitaj versioj ankoraŭ restas en la versia historio, sed partoj de ilia enhavo ne estas alireblaj por la publiko.",
+    "revdelete-text-file": "Forigitaj dosieraj versioj ankoraŭ restas en la dosiera historio, sed partoj de ilia enhavo ne estas alireblaj por la publiko.",
+    "revdelete-text-others": "Aliaj administrantoj sur {{SITENAME}} ankoraŭ havas aliron al la kaŝita enhavo kaj povas malforigi ĝin denove per ĉi tiu sama interfaco, tiel longe kiel aldonaj restriktoj ne estas difinitaj.",
     "revdelete-confirm": "Bonvolu konfirmi ke vi intencias fari ĉi tion, ke vi komprenas la konsekvencojn kaj ke vi faras ĉi tion laŭ [[{{MediaWiki:Policy-url}}|la regularo]].",
     "revdelete-suppress-text": "Subpremo '''nur''' estu uzata por la jenaj kazoj:\n* Ebla kalumnia informo\n* Netaŭga persona informo\n*: ''hejmaj adresoj kaj telefonnumeroj, ŝtataj identnumeroj, ktp.''",
     "revdelete-legend": "Fari videblecajn limigojn",
     "showhideselectedversions": "Montri/kaŝi elektitajn versiojn",
     "editundo": "malfari",
     "diff-empty": "(Neniu diferenco)",
+    "diff-multi-sameuser": "({{PLURAL:$1|Unu meza versio|$1 mezaj versioj}} de la sama uzanto ne montriĝas)",
+    "diff-multi-otherusers": "({{PLURAL:$1|Unu meza versio|$1 mezaj versioj}} de {{PLURAL:$2|alia uzanto|$2 uzoj}} ne montriĝas)",
     "diff-multi-manyusers": "({{PLURAL:$1|Unu intermeza versio|$1 intermezaj versioj}} de pli ol {{PLURAL:$2|unu uzanto|$2 uzantoj}} ne estas {{PLURAL:$1|montrata|montrataj}}.)",
     "difference-missing-revision": "{{PLURAL:$2|Unu revizio|$2 revizioj}} de ĉi tiu malsameco ($1) ne {{PLURAL:$2|estis|estis}} trovebla.\n\nLa kutima kaŭzo estas sekvi malaktualan malsamo-ligilon al paĝo forviŝita.\nDetaloj troveblos en la [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registro de forviŝoj].",
     "searchresults": "Serĉrezultoj",
     "search-section": "(sekcio $1)",
     "search-suggest": "Ĉu vi intenciis: $1",
     "search-interwiki-caption": "Kunprojektoj",
-    "search-interwiki-default": "$1 rezultoj:",
+    "search-interwiki-default": "Rezultoj de $1:",
     "search-interwiki-more": "(plu)",
     "search-relatedarticle": "Relataj",
     "searcheverything-enable": "Traserĉi ĉiujn nomspacojn",
     "searchrelated": "rilataj",
     "searchall": "ĉiuj",
     "showingresults": "Montras {{PLURAL:$1|'''1''' trovitan|'''$1''' trovitajn}} ekde la #'''$2'''-a.",
+    "showingresultsinrange": "Malsupre montriĝas {{PLURAL:$1|<strong>1</strong> rezulto|<strong>$1</strong> rezultoj}} en la intervalo #<strong>$2</strong> ĝis #<strong>$3</strong>.",
     "showingresultsnum": "Montras {{PLURAL:$3|'''1''' trovitan|'''$3''' trovitajn}} ekde la #'''$2'''-a.",
     "showingresultsheader": "{{PLURAL:$5|Rezulto '''$1''' el '''$3'''|Rezultoj '''$1 – $2''' el '''$3'''}} por '''$4'''",
     "search-nonefound": "La serĉomendo rezultis kun neniuj trafoj.",
     "preferences": "Preferoj",
     "mypreferences": "Preferoj",
     "prefs-edits": "Nombro de redaktoj:",
+    "prefsnologintext2": "Bonvolu $1, por ŝanĝi viajn preferojn.",
     "prefs-skin": "Etoso",
     "skin-preview": "Antaŭrigardo",
     "datedefault": "Nenia prefero",
-    "prefs-beta": "Ecoj de Beta",
-    "prefs-datetime": "Dato kaj horo",
     "prefs-labs": "Ecoj el Laboratorio",
     "prefs-user-pages": "Uzantopaĝoj",
     "prefs-personal": "Uzanta profilo",
     "recentchangesdays-max": "(maksimume $1 {{PLURAL:$1|tago|tagoj}})",
     "recentchangescount": "Nombro de redaktoj por montri defaŭlte:",
     "prefs-help-recentchangescount": "Ĉi tiu inkluzivas lastajn ŝanĝojn, paĝajn historiojn, kaj protokolojn.",
+    "prefs-help-watchlist-token2": "Tio estas la sekreta ŝlosilo al la retfluo de via atentaro.\nĈiu, kiu konas ĝin, povas legi vian atentaron. Do, ne kunhavigu ĝin.\nSe vi devas, [[Special:ResetTokens|vi povas rekomencigi ĝin]].",
     "savedprefs": "Viaj preferoj estas konservitaj.",
     "timezonelegend": "Horzono:",
     "localtime": "Loka tempo:",
     "prefs-tokenwatchlist": "Ĵetono",
     "prefs-diffs": "Diferencoj",
     "prefs-help-prefershttps": "Ĉi tiu agordo ekefikos je via sekva ensaluto.",
+    "prefs-tabs-navigation-hint": "Konsileto: Vi povas uzi la maldekstran kaj dekstran sagajn klavojn por navigi inter la langetoj en la langeta listo.",
     "email-address-validity-valid": "Ŝajnas ke la retpoŝtadreso estas valida",
     "email-address-validity-invalid": "Tajpu validan retpoŝtadreson",
     "userrights": "Prizorgi rajtojn de uzantoj",
     "userrights-notallowed": "Via konto ne rajtas doni aŭ forigi uzanto-rajtojn.",
     "userrights-changeable-col": "Grupoj kiujn vi povas ŝanĝi",
     "userrights-unchangeable-col": "Grupoj kiujn vi ne povas ŝanĝi",
+    "userrights-conflict": "Konflikto ĉe la ŝanĝo de uzantorajtoj! Bonvolu kontroli kaj konfirmi viajn ŝanĝojn.",
     "userrights-removed-self": "Vi sukcese nuligis viajn proprajn rajtojn. Do vi ne plu rajtas aliri ĉi tiun paĝon.",
     "group": "Grupo:",
     "group-user": "Uzantoj",
     "right-editmyusercss": "Redakti viajn proprajn CSS-dosierojn",
     "right-editmyuserjs": "Redakti viajn proprajn JavaScript-dosierojn",
     "right-viewmywatchlist": "Rigardi vian atentaron",
+    "right-editmywatchlist": "Redakti vian propran atentaron. Notu, ke kelkaj agoj ankoraŭ ebligas aldoni paĝojn sen ĉi tiu rajto.",
     "right-viewmyprivateinfo": "Vidi viajn proprajn privatajn informojn (ekz. retpoŝtan adreson, veran nomon)",
     "right-editmyprivateinfo": "Redakti viajn proprajn privatajn informojn (ekz. retpoŝtan adreson, veran nomon)",
     "right-editmyoptions": "Redakti proprajn preferojn",
     "recentchanges-label-minor": "Ĉi tiu estas eta redakto",
     "recentchanges-label-bot": "Ĉi tiu redakto estis farita per roboto.",
     "recentchanges-label-unpatrolled": "Ĉi tiu redakto ne jam estis patrolata.",
+    "recentchanges-label-plusminus": "La paĝa grandeco ŝanĝiĝis je ĉi tiu nombro de batoj",
     "recentchanges-legend-heading": "'''Klarigo:'''",
     "recentchanges-legend-newpage": "(vidu ankaŭ [[Special:NewPages|liston de novaj paĝoj]])",
-    "rcnotefrom": "Jen la ŝanĝoj ekde '''$2''' (lastaj ĝis '''$1''').",
+    "rcnotefrom": "Sube estas ŝanĝoj ekde <strong>$2</strong> ({{PLURAL:$1|lasta|lastaj}} <strong>$1</strong>).",
     "rclistfrom": "Montri novajn ŝanĝojn ekde \"$1\"",
     "rcshowhideminor": "$1 redaktetojn",
     "rcshowhideminor-show": "Montri",
     "upload-permitted": "Permesitaj dosiertipoj: $1.",
     "upload-preferred": "Preferitaj dosiertipoj: $1.",
     "upload-prohibited": "Malpermesitaj dosiero-tipoj: $1.",
-    "uploadlog": "protokolo de alŝutoj",
     "uploadlogpage": "Protokolo de alŝutoj",
     "uploadlogpagetext": "Jen la plej laste alŝutitaj dosieroj.\nĈiuj tempoj montriĝas laŭ la horzono UTC.",
     "filename": "Dosiernomo",
     "filereuploadsummary": "Dosieraj ŝanĝoj:",
     "filestatus": "Aŭtorrajta statuso:",
     "filesource": "Fonto:",
-    "uploadedfiles": "Alŝutitaj dosieroj",
     "ignorewarning": "Ignori averton kaj konservi dosieron ĉiukaze",
     "ignorewarnings": "Ignori ĉiajn avertojn",
     "minlength1": "Nomoj de dosieroj nepre havas almenaŭ unu literon.",
     "fileexists-shared-forbidden": "Dosiero kun ĉi tia nomo jam ekzistas en la komuna dosierujo.\nSe vi ankoraŭ volas alŝuti vian dosieron, bonvolu retroigi kaj uzi novan nomon.[[File:$1|thumb|center|$1]]",
     "file-exists-duplicate": "Ĉi tiu dosiero estas duplikato de la {{PLURAL:$1|jena dosiero|jenaj dosieroj}}:",
     "file-deleted-duplicate": "Duplikata dosiero de ĉi tiu dosiero ([[:$1]]) estis antaŭe forigita. Vi legu la forigan historion de tiu dosiero antaŭ provi realŝuti ĝin.",
+    "file-deleted-duplicate-notitle": "Dosiero identa al ĉi tiu dosiero estis forigita antaŭ nelonge kaj la titolo estis subpremita.\nVi demandu iun, kiu havas la eblecon, rigardi la subpremitajn dosierajn datojn, por kontroli la situacion antaŭ rea alŝutado.",
     "uploadwarning": "Alŝuta averto",
     "uploadwarning-text": "Bonvolu ŝanĝi la dosieran priskribon kaj reprovi.",
     "savefile": "Konservi dosieron",
     "overwroteimage": "alŝutis novan version de \"[[$1]]\"",
     "uploaddisabled": "Alŝutado estas malŝaltita",
     "copyuploaddisabled": "Alŝuto de URL malfunkciigita.",
-    "uploadfromurl-queued": "Via alŝuto estis vicatendigata.",
     "uploaddisabledtext": "Alŝutado de dosieroj estas malebligita.",
     "php-uploaddisabledtext": "Dosiera alŝutado estas malŝalta en PHP. Bonvolu kontroli la preferon file_uploads.",
     "uploadscripted": "HTML-aĵo aŭ skriptokodaĵo troviĝas en tiu ĉi tiu dosiero, kiun TTT-foliumilo eble interpretus erare.",
+    "uploadscriptednamespace": "Ĉi tiu SVG-dosiero enhavas nevalidan nomspacon \"$1\"",
     "uploadinvalidxml": "Ne eblas interpreti la XML-sintakson en la alŝutita dosiero",
     "uploadvirus": "Viruso troviĝas en la dosiero! Detaloj: $1",
     "uploadjava": "La dosiero estas ZIP-dosiero kiu enhavas .class-dosieron de Java.\nAlŝutante Java-dosieron estas malpermesita, ĉar ili povas kaŭzi sekureco-limigojn esti preterpasitaj.",
     "upload-misc-error": "Nekonata eraro pri alŝutado.",
     "upload-misc-error-text": "Nekonata eraro okazis dum la alŝuto.\nBonvolu kontroli ke la URL-o estas valida kaj atingebla tiam reprovu.\nSe la problemo kontinuas, kontaku [[Special:ListUsers/sysop|administranton]].",
     "upload-too-many-redirects": "La URL-o enhavis tro multajn alidirektilojn",
-    "upload-unknown-size": "Nekonata grandeco",
     "upload-http-error": "HTTP-eraro okazis: $1",
     "upload-copy-upload-invalid-domain": "Kopio-alŝutoj ne disponiĝas el ĉi tiu domajno.",
     "backend-fail-stream": "Ne povis fluigi dosieron $1.",
     "img-auth-streaming": "Elsendfluante \"$1\".",
     "img-auth-public": "La funkcio de img_auth.php estas eligi dosierojn de privata vikio.\nĈi tiu vikio estas konfigurita kiel publika vikio.\nPor optimuma sekureco, img_auth.php estas malŝalta.",
     "img-auth-noread": "Uzanto ne havas atingon por legi \"$1\".",
-    "img-auth-bad-query-string": "La URL-o havas malvalidan mendan signoĉenon.",
     "http-invalid-url": "Malvalida URL-o: $1",
     "http-invalid-scheme": "URL-oj kun la skemo \"$1\" ne estas subtenata.",
     "http-request-error": "HTTP-peto malsukcesis pro nekonata eraro.",
     "filehist-dimensions": "Dimensioj",
     "filehist-filesize": "Grando de dosiero",
     "filehist-comment": "Komento",
-    "filehist-missing": "Dosiero mankas",
     "imagelinks": "Dosiera uzado",
     "linkstoimage": "La {{PLURAL:$1|jena paĝo|jenaj paĝoj}} ligas al ĉi tiu dosiero:",
     "linkstoimage-more": "Pli ol $1 {{PLURAL:$1|paĝo|paĝoj}} ligas ĉi tiun dosieron.\nLa jena listo montras la {{PLURAL:$1|unua paĝligilo|unuaj $1 paĝligiloj}} al nur ĉi tiu dosiero.\n[[Special:WhatLinksHere/$2|Plena listo]] estas atingebla.",
     "download": "elŝuti",
     "unwatchedpages": "Neatentataj paĝoj",
     "listredirects": "Listo de alidirektiloj",
+    "listduplicatedfiles": "Listo de dosieroj kun duplikatoj",
+    "listduplicatedfiles-summary": "Tio estas listo de dosieroj, kies aktuala dosiera versio estas duplikato de aktuala versio de alia dosiero. Nur lokaj dosieroj estas konsiderataj.",
+    "listduplicatedfiles-entry": "[[:File:$1|$1]] havas [[$3|{{PLURAL:$2| duplikaton|$2 duplikatojn}}]].",
     "unusedtemplates": "Neuzitaj ŝablonoj",
     "unusedtemplatestext": "Ĉi tiu paĝo listigas ĉiujn paĝojn en la nomspaco {{ns:template}} kiuj ne estas enmetitaj en iu ajn alia paĝo.\nBonvolu kontroli aliajn ligilojn al la ŝablonoj antaŭ ol forigi ilin.",
     "unusedtemplateswlh": "aliaj ligiloj",
     "pageswithprop-text": "Ĉi tiu paĝo listigas paĝoj kiu uzas iajn paĝajn ecojn.",
     "pageswithprop-prop": "Nomo de la atributo:",
     "pageswithprop-submit": "Ek",
+    "pageswithprop-prophidden-long": "trajta valoro de longa teksto kaŝita  ($1)",
+    "pageswithprop-prophidden-binary": "duuma trajta valoro kaŝita ($1)",
     "doubleredirects": "Duoblaj alidirektadoj",
     "doubleredirectstext": "Ĉi tiu paĝo montras paĝojn kiuj alidirektas al aliaj alidirektiloj.\nĈiu vico enhavas ligilojn ĉe la unua kaj dua alidirektadoj, kaj la unua linio de la dua alidirektado, kiu ĝenerale montras la \"veran\" celpaĝon, kiu celu la unuan alidirektadon.\n<del>Forstrekitaj</del> listeroj estis riparitaj.",
     "double-redirect-fixed-move": "[[$1]] estis alinomita; ĝi nun alidirektas al [[$2]]",
     "ninterwikis": "$1 {{PLURAL:$1|interlingva ligilo|interlingvaj ligiloj}}",
     "nlinks": "$1 {{PLURAL:$1|ligilo|ligiloj}}",
     "nmembers": "{{PLURAL:$1|unu membro|$1 membroj}}",
+    "nmemberschanged": "$1 → $2 {{PLURAL:$2|membro|membroj}}",
     "nrevisions": "$1 {{PLURAL:$1|versio|versioj}}",
     "nviews": "{{PLURAL:$1|unufoje|$1 fojojn}}",
     "nimagelinks": "Uzita en $1 {{PLURAL:$1|paĝo|paĝoj}}",
     "deadendpagestext": "La sekvaj paĝoj ne ligas al aliaj paĝoj en {{SITENAME}}.",
     "protectedpages": "Protektitaj paĝoj",
     "protectedpages-indef": "Nur ĉiamaj protektaĵoj",
+    "protectedpages-summary": "Ĉi tiu paĝo listigas ekzistantajn paĝojn, kiuj nuntempe estas protektitaj. Por listo de titoloj, kiuj estas protektitaj kontraŭ kreado, vidu [[{{#special:ProtectedTitles}}|{{int:protectedtitles}}]].",
     "protectedpages-cascade": "Nur kaskadaj protektoj",
     "protectedpages-noredirect": "Kaŝi alidirektilojn",
     "protectedpagesempty": "Neniuj paĝoj estas momente protektitaj kun ĉi tiuj parametroj.",
     "protectedpages-timestamp": "Tempindiko",
     "protectedpages-page": "Paĝo",
+    "protectedpages-expiry": "Valida ĝis",
+    "protectedpages-performer": "Protektinto",
+    "protectedpages-params": "Ecoj de protekto",
     "protectedpages-reason": "Kialo",
     "protectedpages-unknown-timestamp": "Nekonata",
     "protectedpages-unknown-performer": "Nekonata uzanto",
     "protectedtitles": "Protektitaj titoloj",
+    "protectedtitles-summary": "Ĉi tiu paĝo listigas titolojn, kiuj estas nuntempe protektitaj kontraŭ kreado. Por listo de ekzistantaj paĝoj, kiuj estas protektitaj, vidu [[{{#special:ProtectedPages}}|{{int:protectedpages}}]].",
     "protectedtitlesempty": "Neniuj titoloj estas nune protektitaj kun ĉi parametroj.",
     "listusers": "Uzantaro",
     "listusers-editsonly": "Montri uzantojn kun redaktoj nur",
     "listusers-creationsort": "Ordigi laŭ dato de kreado",
+    "listusers-desc": "Ordigi en malsupreniranta sinsekvo",
     "usereditcount": "$1 {{PLURAL:$1|redakto|redaktoj}}",
     "usercreated": "{{GENDER:$3|Kreita}} je $1, $2",
     "newpages": "Novaj paĝoj",
     "listgrouprights-removegroup-self": "Povas forigi {{PLURAL:$2|grupon|grupojn}} de propra konto: $1",
     "listgrouprights-addgroup-self-all": "Povas aldoni ĉiujn grupojn al propra konto",
     "listgrouprights-removegroup-self-all": "Povas forigi ĉiujn grupojn de propra konto",
+    "listgrouprights-namespaceprotection-header": "Nomspacaj restriktoj",
+    "listgrouprights-namespaceprotection-namespace": "Nomspaco",
+    "listgrouprights-namespaceprotection-restrictedto": "Rajtoj, kiuj permesas al uzanto redakti",
+    "trackingcategories-nodesc": "Neniu priskribo estas disponebla.",
+    "trackingcategories-disabled": "Kategorio estas malaktivigita",
     "mailnologin": "Neniu alsendota adreso",
     "mailnologintext": "Vi nepre estu [[Special:UserLogin|salutanta]] kaj havanta validan retpoŝtadreson en viaj [[Special:Preferences|preferoj]] por retpoŝti al aliaj uzantoj.",
     "emailuser": "Retpoŝti ĉi tiun uzanton",
     "emailuser-title-notarget": "Retpoŝti uzanton",
     "emailpage": "Retpoŝti uzanton",
     "emailpagetext": "Vi povas uzi la jenan paĝon por sendi retpoŝtan mesaĝon al ĉi tiu {{GENDER:$1|uzanto|uzantino}}.\nLa retadreso kiun vi enigis en [[Special:Preferences|viaj preferoj]] aperos kiel la \"De\" adreso de la retpoŝto, do la ricevonto eblos respondi rekte al vi.",
-    "usermailererror": "Resendita retmesaĝa erarsubjekto:",
     "defemailsubject": "{{SITENAME}} retmesaĝo de uzanto \"$1\"",
     "usermaildisabled": "Retpoŝto de uzantoj estas malŝaltita",
     "usermaildisabledtext": "Vi ne povas sendi retpoŝton al aliaj uzantoj en ĉi tiu vikio",
     "noemailtitle": "Neniu retpoŝtadreso",
     "noemailtext": "Ĉi tiu uzanto ne donis validan retadreson.",
-    "nowikiemailtitle": "Retpoŝto ne permesita",
     "nowikiemailtext": "Ĉi tiu uzanto elektis ne ricevi retpoŝton de aliaj uzantoj.",
     "emailnotarget": "Neekzistanta aŭ malvalida salutnomo por ricevanto.",
     "emailtarget": "Enigi salutnomon de ricevonto",
     "nowatchlist": "Vi ne jam elektis priatenti iun ajn paĝon.",
     "watchlistanontext": "Bonvolu $1 por vidi aŭ redakti erojn en via atentaro.",
     "watchnologin": "Ne ensalutinta",
-    "watchnologintext": "Nepras [[Special:UserLogin|ensaluti]] por ŝanĝi vian atentaron.",
     "addwatch": "Aldoniĝi al atentaro",
     "addedwatchtext": "La paĝo \"[[:$1]]\" aldoniĝis al via [[Special:Watchlist|atentaro]]. Estontaj ŝanĝoj de tiu paĝo kaj de ĝia rilata diskutpaĝo aperos tie.",
     "removewatch": "Forigi el atentaro",
     "watching": "Aldonante al la atentaro...",
     "unwatching": "Malatentante...",
     "watcherrortext": "Eraro okazis ŝanĝinte vian agordojn de atentaro por \"$1\".",
-    "enotif_mailer": "Averta retmesaĝo de {{SITENAME}}",
     "enotif_reset": "Marki ĉiujn paĝojn vizititaj",
     "enotif_impersonal_salutation": "Uzanto de {{SITENAME}}",
     "enotif_subject_deleted": "La paĝon $1 de {{SITENAME}} forigis {{gender:$2|$2}}",
     "excontent": "enhavis: '$1'",
     "excontentauthor": "la enteno estis : '$1' (kaj la sola kontribuinto estis '$2')",
     "exbeforeblank": "antaŭ malplenigo enhavis: '$1'",
-    "exblank": "estis malplena",
     "delete-confirm": "Forigi \"$1\"",
     "delete-legend": "Forigi",
     "historywarning": "'''Averto:''' La forigota paĝo havas historion kun pli-malpli $1 {{PLURAL:$1|revizio|revizioj}}:",
     "delete-edit-reasonlist": "Redakti kialojn de forigo",
     "delete-toobig": "Ĉi tiu paĝo havas grandan redakto-historion, pli ol $1 {{PLURAL:$1|version|versiojn}}. Forigo de ĉi tiaj paĝoj estis limigitaj por preventi akcidentan disrompigon de {{SITENAME}}.",
     "delete-warning-toobig": "Ĉi tiu paĝo havas grandan redakto-historion, pli ol $1 {{PLURAL:$1|version|versiojn}}. Forigo de ĝi povas disrompigi operacion de {{SITENAME}}; forigu singarde.",
+    "deleting-backlinks-warning": "'''Atentigo:'''\n[[Special:WhatLinksHere/{{FULLPAGENAME}}|Aliaj paĝoj]] ligas al aŭ transkludas tiun ĉi forigotan paĝon.",
     "rollback": "Restarigi antaŭan redakton",
     "rollback_short": "Malfari",
     "rollbacklink": "malfari",
     "protect-locked-blocked": "Vi ne povas ŝanĝi prokekto-nivelojn dum forbarita. Jen la nunaj ecoj de la paĝo '''$1''':",
     "protect-locked-dblock": "Ne povas ŝanĝi nivelojn de protekto pro aktiva datumbaza ŝlosado.\nJen la nunaj agordoj de la paĝo '''$1''':",
     "protect-locked-access": "Via konto ne havas rajton ŝanĝi protekto-nivelojn.\nJen la aktualaj valoroj por la paĝo '''$1''':",
-    "protect-cascadeon": "Ĉi paĝo estas nun protektita kontraŭ redaktado ĉar ĝi estas inkluzivita en {{PLURAL:$1|jena paĝo, kiu mem estas protektita|jenaj paĝoj, kiuj mem estas protektitaj}} per kaskada protekto.\nVi povas ŝanĝi ties protektnivelon, sed tio ne ŝanĝos la kaskadan protekton.",
+    "protect-cascadeon": "Ĉi paĝo estas nun protektita kontraŭ redaktado ĉar ĝi estas inkluzivita en {{PLURAL:$1|jena paĝo, kiu mem estas protektita|jenaj paĝoj, kiuj mem estas protektitaj}} per kaskada protekto.\nŜanĝoj de ĝia protektonivelo ne influos la kaskadan protekton.",
     "protect-default": "Permesigi ĉiujn uzantojn",
     "protect-fallback": "Permesi nur uzantojn kun la rajto  \"$1\"",
     "protect-level-autoconfirmed": "Permesi nur aŭtomate konfirmitajn uzantojn",
     "sp-contributions-newbies": "Montri nur kontribuojn de novaj kontoj",
     "sp-contributions-newbies-sub": "Kontribuoj de novaj uzantoj. Forigitaj paĝoj ne estas montritaj.",
     "sp-contributions-newbies-title": "Kontribuoj de novaj uzantoj",
-    "sp-contributions-blocklog": "Protokolo de forbaroj",
-    "sp-contributions-deleted": "forigitaj kontribuoj de uzantoj",
+    "sp-contributions-blocklog": "protokolo de forbaroj",
+    "sp-contributions-deleted": "forigitaj kontribuoj de uzanto",
     "sp-contributions-uploads": "alŝutoj",
     "sp-contributions-logs": "protokoloj",
     "sp-contributions-talk": "diskuto",
-    "sp-contributions-userrights": "administri rajtojn de uzantoj",
+    "sp-contributions-userrights": "administro de uzantorajtoj",
     "sp-contributions-blocked-notice": "La uzanto nune estas forbarita. Jen la lasta blokada listero en protokolo:",
     "sp-contributions-blocked-notice-anon": "Ĉi tiu IP-adreso estas nune forbarita.\nJen la lasta ero de la forbara protokolo:",
     "sp-contributions-search": "Serĉado de kontribuoj",
     "sp-contributions-username": "IP-adreso aŭ uzantonomo:",
     "sp-contributions-toponly": "Montru nur ŝanĝojn kiuj estas la plej lastaj revizioj",
+    "sp-contributions-newonly": "Montri nur redaktojn, kiuj kreis paĝon",
     "sp-contributions-submit": "Serĉi",
     "whatlinkshere": "Ligiloj ĉi tien",
     "whatlinkshere-title": "Paĝoj ligantaj al \"$1\"",
     "allmessagesname": "Nomo",
     "allmessagesdefault": "Defaŭlta teksto",
     "allmessagescurrent": "Nuna teksto",
-    "allmessagestext": "Ĉi tio estas listo de ĉiuj mesaĝoj haveblaj en la MediaWiki-nomspaco.\nBonvolu aliri [https://www.mediawiki.org/wiki/Localisation MediaWiki-Asimilado] kaj [//translatewiki.net translatewiki.net]\nse vi volus kontribui al la komuna MediaWiki-asimilado.",
+    "allmessagestext": "Ĉi tio estas listo de ĉiuj mesaĝoj haveblaj en la MediaWiki-nomspaco.\nBonvolu aliri [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation MediaWiki-Asimilado] kaj [//translatewiki.net translatewiki.net]\nse vi volus kontribui al la komuna MediaWiki-asimilado.",
     "allmessagesnotsupportedDB": "{{ns:special}}:Allmessages ne subtenata ĉar la variablo wgUseDatabaseMessages estas malkonektita.",
     "allmessages-filter-legend": "Filtri",
     "allmessages-filter": "Filtri laŭ ŝanĝada stato",
     "importunknownsource": "Nekonata fonta speco de alŝuto",
     "importcantopen": "Ne povas malfermi import-dosieron",
     "importbadinterwiki": "Malbona intervikia ligilo",
-    "importnotext": "Malplena aŭ senteksta",
     "importsuccess": "La importo sukcesis!",
-    "importhistoryconflict": "Malkongrua historia versio ekzistas (eble la paĝo importiĝis antaŭe)",
     "importnosources": "Neniu transvikia importfonto estis difinita kaj rekta historio de alŝutoj estas malaktivigita.",
     "importnofile": "Neniu import-dosiero estis alŝutita.",
     "importuploaderrorsize": "Alŝuto de import-dosiero malsukcesis. La dosiero estas pli granda ol la permesita alŝut-grando.",
     "pageinfo-length": "Paĝgrandeco (en bajtoj)",
     "pageinfo-article-id": "Paĝa identigo",
     "pageinfo-language": "Lingvo de paĝa enhavo",
+    "pageinfo-content-model": "Modelo de paĝoenhavo",
     "pageinfo-robot-policy": "Indeksado per robotoj",
     "pageinfo-robot-index": "Permesata",
     "pageinfo-robot-noindex": "Malpermesata",
     "confirm-watch-top": "Ĉu aldoni tiun ĉi paĝon al via atentaro?",
     "confirm-unwatch-button": "Ek!",
     "confirm-unwatch-top": "Ĉu forigi tiun ĉi paĝon el via atentaro?",
+    "quotation-marks": "„$1“",
     "imgmultipageprev": "← antaŭa paĝo",
     "imgmultipagenext": "sekva paĝo →",
     "imgmultigo": "Ek!",
     "imgmultigoto": "Iri al paĝo $1",
     "img-lang-default": "(defaŭlta lingvo)",
+    "img-lang-info": "Bildigi tiun ĉi bildon en $1. $2",
     "img-lang-go": "Ek",
     "ascending_abbrev": "sprn",
     "descending_abbrev": "subn",
     "version-version": "($1)",
     "version-license": "Permesilo de MediaWiki",
     "version-ext-license": "Permesilo",
+    "version-ext-colheader-name": "Etendilo",
     "version-ext-colheader-version": "Versio",
     "version-ext-colheader-license": "Permesilo",
     "version-ext-colheader-description": "Priskribo",
     "version-ext-colheader-credits": "Aŭtoroj",
     "version-license-title": "Permesilo por $1",
+    "version-license-not-found": "Por tiu ĉi etendilo ne estis trovitaj pli detalaj permesilaj informoj.",
     "version-credits-title": "Agnosko por $1",
+    "version-credits-not-found": "Por tiu ĉi etendilo ne estis trovitaj pli detalaj informoj pri aŭtoroj.",
     "version-poweredby-credits": "Ĉi tiu vikio funkcias per '''[https://www.mediawiki.org/ MediaWiki]''', aŭtorrajto ©&thinsp;2001–$1 $2.",
     "version-poweredby-others": "aliaj",
     "version-poweredby-translators": "tradukantoj de translatewiki.net",
     "duration-centuries": "$1 {{PLURAL:$1|jarcento|jarcentoj}}",
     "duration-millennia": "$1 {{PLURAL:$1|jarmilo|jarmiloj}}",
     "rotate-comment": "Bildo pivotita $1 {{PLURAL:$1|gradon|gradojn}} dekstren",
+    "limitreport-title": "Profiladaj datumoj de sintaksa analizilo:",
     "limitreport-cputime": "Uzo de procesora tempo",
     "limitreport-cputime-value": "$1 {{PLURAL:$1|sekundo|sekundoj}}",
     "limitreport-walltime": "Uzo de reala tempo",
     "limitreport-ppvisitednodes": "Nombro da nodoj vizititaj de antaŭtraktilo",
     "limitreport-ppgeneratednodes": "Nombro da nodoj kreitaj de antaŭtraktilo",
     "limitreport-postexpandincludesize-value": "$1/$2 {{PLURAL:$2|bitoko|bitokoj}}",
+    "limitreport-templateargumentsize": "Grandeco de argumentoj de ŝablonoj",
     "limitreport-templateargumentsize-value": "$1/$2 {{PLURAL:$2|bitoko|bitokoj}}",
+    "limitreport-expensivefunctioncount": "Nombro de kostaj sintaks-analizilaj funkcioj",
     "expandtemplates": "Ampleksigi ŝablonojn",
     "expand_templates_intro": "Ĉi tiu speciala paĝo traktas tekston kaj ampleksigas ĉiujn ŝablonojn en ĝi rekursie.\nĜi ankaŭ ampleksigas sintaksajn funkciojn kiel\n<code><nowiki>{{</nowiki>#language:…}}</code> kaj variablojn kiel\n<code><nowiki>{{</nowiki>CURRENTDAY}}</code>. Fakte preskaŭ iujn ajn en duoblaj krampoj.",
     "expand_templates_title": "Kunteksta titolo, por {{FULLPAGENAME}}, ktp.:",
index 4efaeac..ef62a4b 100644 (file)
             "Wilfredor",
             "XalD",
             "XanaG",
-            "לערי ריינהארט"
+            "לערי ריינהארט",
+            "Chocolate con galleta",
+            "Csbotero"
         ]
     },
     "tog-underline": "Subrayar los enlaces:",
     "tog-showhiddencats": "Mostrar las categorías escondidas",
     "tog-norollbackdiff": "Omitir la diferencia después de revertir",
     "tog-useeditwarning": "Advertirme cuando abandone una página editada con cambios sin grabar",
-    "tog-prefershttps": "Utiliza una conexión segura siempre que haya iniciado una sesión",
+    "tog-prefershttps": "Utilizar una conexión segura siempre que haya iniciado una sesión",
     "underline-always": "Siempre",
     "underline-never": "Nunca",
     "underline-default": "Aspecto (skin) o valor predeterminado del navegador",
     "permalink": "Enlace permanente",
     "print": "Imprimir",
     "view": "Ver",
+    "view-foreign": "Ver en $1",
     "edit": "Editar",
+    "edit-local": "Editar descripción local",
     "create": "Crear",
+    "create-local": "Añadir descripción local",
     "editthispage": "Editar esta página",
     "create-this-page": "Crear esta página",
     "delete": "Borrar",
     "accountcreatedtext": "La cuenta de usuario de [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|talk]]) ha sido creada.",
     "createaccount-title": "Creación de cuenta para {{SITENAME}}",
     "createaccount-text": "Alguien creó en {{SITENAME}} ($4) una cuenta asociada a este correo electrónico con el nombre «$2».\nLa contraseña asignada automáticamente es «$3». Por favor entra ahora y cambia tu contraseña.\n\nPuedes ignorar este mensaje si esta cuenta fue creada por error.",
-    "usernamehasherror": "El nombre de usuario no puede contener símbolos de almohadilla/numeral",
     "login-throttled": "Has intentado demasiadas veces iniciar sesión. Por favor espera $1 antes de intentarlo nuevamente.",
     "login-abort-generic": "Tu inicio de sesión no fue exitoso - Cancelado",
     "loginlanguagelabel": "Idioma: $1",
     "newpassword": "Contraseña nueva:",
     "retypenew": "Confirmar la contraseña nueva:",
     "resetpass_submit": "Establecer contraseña e iniciar sesión",
-    "changepassword-success": "La contraseña ha sido cambiada con éxito.",
+    "changepassword-success": "La contraseña se modificó correctamente.",
     "changepassword-throttled": "Has intentado acceder demasiadas veces.\nEspera $1 antes de intentarlo de nuevo.",
     "resetpass_forbidden": "No se pueden cambiar las contraseñas",
     "resetpass-no-info": "Debes iniciar sesión para acceder directamente a esta página.",
     "changeemail-cancel": "Cancelar",
     "changeemail-throttled": "Has intentado acceder demasiadas veces.\nEspera $1 antes de intentarlo de nuevo.",
     "resettokens": "Restablecer claves",
-    "resettokens-text": "Puede restablecer las claves que permiten el acceso a ciertos datos privados asociados a tu cuenta aquí.\n\nDeberías hacerlo si accidentalmente la has compartido con alguien o si su cuenta ha sido comprometida.",
+    "resettokens-text": "Aquí puedes restablecer las fichas que permiten el acceso a ciertos datos privados asociados con tu cuenta.\n\nDeberías hacerlo si accidentalmente los has compartido o si tu cuenta ha sido intervenida.",
     "resettokens-no-tokens": "No hay claves para restablecer.",
     "resettokens-legend": "Restablecer claves",
     "resettokens-tokens": "Claves:",
     "prefs-skin": "Apariencia",
     "skin-preview": "Previsualizar",
     "datedefault": "Sin preferencia",
-    "prefs-beta": "Funciones en pruebas",
-    "prefs-datetime": "Fecha y hora",
     "prefs-labs": "Características de los laboratorios",
     "prefs-user-pages": "Páginas de usuario",
     "prefs-personal": "Perfil de usuario",
     "upload-permitted": "Tipos de archivo permitidos: $1.",
     "upload-preferred": "Tipos de archivo preferidos: $1.",
     "upload-prohibited": "Tipos de archivo prohibidos: $1.",
-    "uploadlog": "registro de subidas",
     "uploadlogpage": "Subidas de archivos",
     "uploadlogpagetext": "Abajo hay una lista de los últimos archivos subidos.\nMira la [[Special:NewFiles|galería de archivos nuevos]] para una descripción visual",
     "filename": "Nombre del archivo",
     "filereuploadsummary": "Cambios de archivo:",
     "filestatus": "Estado de copyright:",
     "filesource": "Fuente:",
-    "uploadedfiles": "Archivos subidos",
     "ignorewarning": "Ignorar aviso y guardar de todos modos",
     "ignorewarnings": "Ignorar cualquier aviso",
     "minlength1": "Los nombres de archivo deben tener al menos una letra.",
     "overwroteimage": "subió una nueva versión de «[[$1]]»",
     "uploaddisabled": "Subida de archivos deshabilitada",
     "copyuploaddisabled": "Carga por URL deshabilitada.",
-    "uploadfromurl-queued": "Tu carga ha sido enviada a la cola.",
     "uploaddisabledtext": "No es posible subir archivos.",
     "php-uploaddisabledtext": "La subida de archivos está deshabilitada en PHP. Por favor compruebe <code>file_uploads</code> en php.ini.",
     "uploadscripted": "Este archivo contiene script o código HTML que puede ser interpretado erróneamente por un navegador web.",
     "upload-misc-error": "Error desconocido en la subida",
     "upload-misc-error-text": "Ha ocurrido un error durante la subida. Por favor verifica que la URL es válida y accesible e inténtalo de nuevo. Si el problema persiste, contacta con un [[Special:ListUsers/sysop|administrador]].",
     "upload-too-many-redirects": "La URL contenía demasiadas redirecciones",
-    "upload-unknown-size": "Tamaño desconocido",
     "upload-http-error": "Ha ocurrido un error HTTP: $1",
     "upload-copy-upload-invalid-domain": "No se pueden realizar cargas remotas desde este dominio.",
     "backend-fail-stream": "No se pudo transmitir el archivo «$1».",
     "img-auth-streaming": "Streaming «$1».",
     "img-auth-public": "La función de img_auth.php es mostrar archivos desde una wiki privada.\nEsta wiki está configurada como pública.\nPara óptima seguridad, img_auth.php está desactivado.",
     "img-auth-noread": "El usuario no tiene acceso para leer «$1».",
-    "img-auth-bad-query-string": "La dirección URL tiene una cadena de consulta no válida.",
     "http-invalid-url": "URL inválida: $1",
     "http-invalid-scheme": "Las URLs con el esquema «$1» no son compatibles.",
     "http-request-error": "La solicitud HTTP falló debido a un error desconocido.",
     "filehist-dimensions": "Dimensiones",
     "filehist-filesize": "Tamaño",
     "filehist-comment": "Comentario",
-    "filehist-missing": "No se encuentra el archivo",
     "imagelinks": "Usos del archivo",
     "linkstoimage": "{{PLURAL:$1|La siguiente página enlaza|Las siguientes páginas enlazan}} a este archivo:",
     "linkstoimage-more": "Hay más de {{PLURAL:$1|una página que enlaza|$1 páginas que enlazan}} con este archivo.\n\nLa lista siguiente sólo muestra {{PLURAL:$1|la primera página que enlaza|las primeras $1 páginas que enlazan}} con este archivo.\nTambién puedes consultar la [[Special:WhatLinksHere/$2|lista completa]].",
     "download": "descargar",
     "unwatchedpages": "Páginas no vigiladas",
     "listredirects": "Lista de redirecciones",
+    "listduplicatedfiles": "Lista de archivos con duplicados",
+    "listduplicatedfiles-entry": "[[:File:$1|$1]] tiene [[$3|{{PLURAL:$2|un duplicado|$2 duplicados}}]].",
     "unusedtemplates": "Plantillas sin uso",
     "unusedtemplatestext": "Aquí se enumeran todas las páginas en el espacio de nombres {{ns:template}} que no están incluidas en otras páginas. Recuerda mirar lo que enlaza a las plantillas antes de borrarlas.",
     "unusedtemplateswlh": "otros enlaces",
     "listgrouprights-removegroup-self": "Eliminar {{PLURAL:$2|grupo|grupos}} de tu propia cuenta: $1",
     "listgrouprights-addgroup-self-all": "Agregar todos los grupos a tu propia cuenta",
     "listgrouprights-removegroup-self-all": "Eliminar todos los grupos de tu propia cuenta",
+    "listgrouprights-namespaceprotection-header": "Restricciones del espacio de nombre",
+    "listgrouprights-namespaceprotection-namespace": "Espacio de nombre",
+    "listgrouprights-namespaceprotection-restrictedto": "Derechos de usuario para editar",
+    "trackingcategories": "Categorías de seguimiento",
+    "trackingcategories-msg": "Categoría de seguimiento",
+    "trackingcategories-name": "Nombre del mensaje",
+    "trackingcategories-desc": "Criterios de inclusión de categoría",
+    "noindex-category-desc": "La página contiene la palabra mágica <code><nowiki>__NOINDEX__</nowiki></code> (y está en un espacio de nombres donde la función está activada); y por ello los robots no la indizan.",
+    "post-expand-template-inclusion-category-desc": "Después de expandir todas las plantillas, el tamaño de la página es más grande que <code>$wgMaxArticleSize</code>, así que algunas plantillas no se expandieron.",
+    "post-expand-template-argument-category-desc": "Después de expandir un argumento de plantilla (algunos en tres llaves, como <code>{{{Foo}}})</code>, la página es más grande que <code>$wgMaxArticleSize</code>.",
+    "hidden-category-category-desc": "Esta es una categoría con <code><nowiki>__HIDDENCAT__</nowiki></code> en ella, que evita que aparezca en el cuadro de enlace de la categoría en las páginas, de forma predeterminada.",
+    "trackingcategories-nodesc": "No hay descripción disponible.",
+    "trackingcategories-disabled": "La categoría está desactivada",
     "mailnologin": "Ninguna dirección de envio",
     "mailnologintext": "Debes [[Special:UserLogin|iniciar sesión]] y tener una dirección electrónica válida en tus [[Special:Preferences|preferencias]] para enviar un correo electrónico a otros usuarios.",
     "emailuser": "Enviar un correo electrónico a {{GENDER:{{BASEPAGENAME}}|este usuario|esta usuaria}}",
     "emailuser-title-notarget": "Enviar un correo electrónico al usuario",
     "emailpage": "Enviar un correo electrónico a un usuario",
     "emailpagetext": "Puedes usar el formulario de abajo para enviar un correo electrónico a {{GENDER:$1|este usuario|esta usuaria}}.\nLa dirección de correo electrónico que indicaste en [[Special:Preferences|tus preferencias de usuario]] aparecerá en el campo \"Remitente\" o \"De\" para que el destinatario pueda responderte.",
-    "usermailererror": "El sistema de correo devolvió un error:",
     "defemailsubject": "Correo electrónico enviado por el usuario «$1» desde {{SITENAME}}",
     "usermaildisabled": "Correo electrónico del usuario deshabilitado",
     "usermaildisabledtext": "No puedes enviar correos electrónicos a otros usuarios en esta wiki",
     "noemailtitle": "No hay dirección de correo electrónico",
     "noemailtext": "Este usuario no ha especificado una dirección de correo electrónico válida.",
-    "nowikiemailtitle": "correos electrónicos no permitidos",
     "nowikiemailtext": "Este usuario ha elegido no recibir correos electrónicos de otros usuarios.",
     "emailnotarget": "Nombre de usuario no existente o no válido para el destinatario.",
     "emailtarget": "Introduce el nombre de usuario del destinatario",
     "nowatchlist": "No tienes ninguna página en tu lista de seguimiento.",
     "watchlistanontext": "Para ver o editar las entradas de tu lista de seguimiento es necesario $1.",
     "watchnologin": "No has iniciado sesión",
-    "watchnologintext": "Debes [[Special:UserLogin|iniciar sesión]] para modificar tu lista de seguimiento.",
     "addwatch": "Añadir a la lista de seguimiento",
     "addedwatchtext": "La página «[[:$1]]» ha sido añadida a tu [[Special:Watchlist|lista de seguimiento]]. Los cambios futuros en esta página y en su página de discusión asociada se indicarán ahí.",
     "removewatch": "Quitar de la lista de seguimiento",
     "watching": "Vigilando...",
     "unwatching": "Eliminando de la lista de seguimiento...",
     "watcherrortext": "Ocurrió un error al cambiar la configuración de tu lista de seguimiento para «$1».",
-    "enotif_mailer": "Notificación por correo de {{SITENAME}}",
     "enotif_reset": "Marcar todas las páginas como visitadas",
     "enotif_impersonal_salutation": "usuario de {{SITENAME}}",
     "enotif_subject_deleted": "$2 ha borrado la página $1 de {{SITENAME}}",
     "excontent": "el contenido era: «$1»",
     "excontentauthor": "el contenido era: «$1» (y el único autor fue «[[Special:Contributions/$2|$2]]»)",
     "exbeforeblank": "El contenido antes de blanquear era: «$1»",
-    "exblank": "la página estaba vacía",
     "delete-confirm": "Borrar «$1»",
     "delete-legend": "Borrar",
     "historywarning": "'''Aviso:''' La página que estás a punto de borrar tiene un historial de aproximadamente $1 {{PLURAL:$1|revisión|revisiones}}:",
     "sp-contributions-newbies-sub": "Para cuentas nuevas",
     "sp-contributions-newbies-title": "Contribuciones de usuarios nuevos",
     "sp-contributions-blocklog": "registro de bloqueos",
+    "sp-contributions-suppresslog": "Contribuciones borradas de usuario",
     "sp-contributions-deleted": "contribuciones de usuario borradas",
     "sp-contributions-uploads": "subidas",
     "sp-contributions-logs": "registros",
     "sp-contributions-blocked-notice": "Este usuario está actualmente bloqueado. La última entrada del registro de bloqueos es presentada debajo para mayor referencia:",
     "sp-contributions-blocked-notice-anon": "Esta dirección IP se encuentra actualmente bloqueada.\nA continuación se muestra la última entrada del registro de bloqueos para mayor referencia.",
     "sp-contributions-search": "Buscar contribuciones",
-    "sp-contributions-suppresslog": "Contribuciones borradas de usuario",
     "sp-contributions-username": "Dirección IP o nombre de usuario:",
     "sp-contributions-toponly": "Solo mostrar últimas ediciones de página",
     "sp-contributions-newonly": "Mostrar solo ediciones que son creaciones de páginas",
     "allmessagesname": "Nombre",
     "allmessagesdefault": "Texto predeterminado",
     "allmessagescurrent": "Texto actual",
-    "allmessagestext": "Esta es una lista de mensajes del sistema disponibles en el espacio de nombres MediaWiki:\nPor favor visita [https://www.mediawiki.org/wiki/Localisation Localización MediaWiki] y [//translatewiki.net translatewiki.net] si deseas contribuir con la localización genérica MediaWiki.",
+    "allmessagestext": "Esta es una lista de mensajes del sistema disponibles en el espacio de nombres MediaWiki:\nPor favor visita [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation Localización MediaWiki] y [//translatewiki.net translatewiki.net] si deseas contribuir con la localización genérica MediaWiki.",
     "allmessagesnotsupportedDB": "Esta página no está disponible porque '''$wgUseDatabaseMessages''' está deshabilitado.",
     "allmessages-filter-legend": "Filtro",
     "allmessages-filter": "Filtrar por estado de personalización:",
     "importunknownsource": "Tipo de fuente de importación desconocida",
     "importcantopen": "No se pudo importar el archivo",
     "importbadinterwiki": "Enlace interwiki anómalo",
-    "importnotext": "Vacío o sin texto",
     "importsuccess": "¡La importación se ha realizado con éxito!",
-    "importhistoryconflict": "Existen revisiones en conflicto en el historial (puede que se haya importado esta página antes)",
     "importnosources": "No hay fuentes de importación transwiki y no está permitido subir directamente el historial.",
     "importnofile": "No se subieron archivos de importación.",
     "importuploaderrorsize": "Falló la carga del archivo de importaciones.\nSu tamaño es superior al máximo permitido.",
     "version-entrypoints": "URL del punto de entrada",
     "version-entrypoints-header-entrypoint": "Punto de entrada",
     "version-entrypoints-header-url": "Dirección URL",
-    "version-entrypoints-articlepath": "[https://www.mediawiki.org/wiki/Manual:$wgArticlePath Ruta del artículo]",
-    "version-entrypoints-scriptpath": "[https://www.mediawiki.org/wiki/Manual:$wgScriptPath Ruta de la secuencia de comandos (script)]",
+    "version-entrypoints-articlepath": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgArticlePath Ruta del artículo]",
+    "version-entrypoints-scriptpath": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgScriptPath Ruta de la secuencia de comandos (script)]",
     "redirect": "Redirigir por archivo, usuario, página o ID de revisión",
     "redirect-legend": "Redirigir a un archivo o página",
     "redirect-summary": "Esta página especial redirige a un fichero (dado un nombre de fichero), a una página (dado un identificador de revisión o de página) o a una página de usuario (dado un identificador numérico de usuario). Uso: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/revision/328429]], o [[{{#Special:Redirect}}/user/101]].",
     "limitreport-expensivefunctioncount": "Cuenta de la funcion expansiva del analizador",
     "expandtemplates": "Expandir plantillas",
     "expand_templates_intro": "Esta página especial toma un texto wiki y expande todas sus plantillas recursivamente.\nTambién expande las funciones sintácticas como <code><nowiki>{{</nowiki>#language:…}}</code>, y variables como\n<code><nowiki>{{</nowiki>CURRENTDAY}}</code>. De hecho, expande casi cualquier cosa que esté entre llaves dobles.",
-    "expand_templates_title": "Título de la página, útil para expandir <nowiki>{{PAGENAME}}</nowiki> o similares",
+    "expand_templates_title": "Título de la página, útil para expandir {{PAGENAME}} o similares",
     "expand_templates_input": "Texto a expandir:",
     "expand_templates_output": "Resultado:",
     "expand_templates_xml_output": "Salida XML",
index ffc888a..6b895d6 100644 (file)
     "permalink": "Püsilink",
     "print": "Prindi",
     "view": "Vaata",
+    "view-foreign": "Vaata asukohas $1",
     "edit": "Muuda",
+    "edit-local": "Redigeeri kohalikku kirjeldust",
     "create": "Loo",
+    "create-local": "Lisa kohalik kirjeldus",
     "editthispage": "Redigeeri seda lehekülge",
     "create-this-page": "Loo see lehekülg",
     "delete": "Kustuta",
     "accountcreatedtext": "Kasutaja [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|talk]]) konto on loodud.",
     "createaccount-title": "{{GRAMMAR:illative|{{SITENAME}}}} konto loomine",
     "createaccount-text": "Keegi on loonud {{GRAMMAR:illative|{{SITENAME}}}} ($4) sinu e-posti aadressile vastava kasutajatunnuse \"$2\". Parooliks seati \"$3\". Logi sisse ja muuda oma parool.\n\nKui kasutajakonto loomine on eksitus, võid käesolevat sõnumit lihtsalt eirata.",
-    "usernamehasherror": "Kasutajanimi ei või sisaldada trellimärke (\"#\").",
     "login-throttled": "Oled lühikese aja jooksul proovinud liiga palju kordi sisse logida.\nPalun oota $1, enne kui uuesti proovid.",
     "login-abort-generic": "Sisselogimine ebaõnnestus – Katkestatud",
     "loginlanguagelabel": "Keel: $1",
     "prefs-skin": "Kujundus",
     "skin-preview": "eelvaade",
     "datedefault": "Eelistus puudub",
-    "prefs-beta": "Beetafunktsioonid",
-    "prefs-datetime": "Kuupäev ja kellaaeg",
     "prefs-labs": "Katsefunktsioonid",
     "prefs-user-pages": "Kasutajaleheküljed",
     "prefs-personal": "Kasutaja andmed",
     "upload-permitted": "Lubatud failitüübid: $1.",
     "upload-preferred": "Eelistatud failitüübid: $1.",
     "upload-prohibited": "Keelatud failitüübid: $1.",
-    "uploadlog": "üleslaadimislogi",
     "uploadlogpage": "Üleslaadimislogi",
     "uploadlogpagetext": "Allpool on loend viimastest failide üleslaadimistest. Visuaalsema esituse nägemiseks vaata [[Special:NewFiles|uute failide galeriid]].",
     "filename": "Faili nimi",
     "filereuploadsummary": "Faili muudatused:",
     "filestatus": "Autoriõiguse staatus:",
     "filesource": "Allikas:",
-    "uploadedfiles": "Üleslaaditud failid",
     "ignorewarning": "Ignoreeri hoiatust ja salvesta fail hoiatusest hoolimata",
     "ignorewarnings": "Ignoreeri hoiatusi",
     "minlength1": "Faili nimes peab olema vähemalt üks kirjamärk.",
     "overwroteimage": "laadis üles faili \"[[$1]]\" uue versiooni",
     "uploaddisabled": "Üleslaadimine hetkel keelatud",
     "copyuploaddisabled": "Internetiaadressilt üleslaadimine on keelatud.",
-    "uploadfromurl-queued": "Üleslaadimine on järjekorras.",
     "uploaddisabledtext": "Faili üleslaadimine on keelatud.",
     "php-uploaddisabledtext": "Failide üleslaadmine on PHP seadetes keelatud.\nPalun vaata <code>file_uploads</code> sätet.",
     "uploadscripted": "See fail sisaldab HTML- või skriptikoodi, mida veebilehitseja võib valesti kuvada.",
     "upload-misc-error": "Tundmatu viga üleslaadimisel",
     "upload-misc-error-text": "Üleslaadimisel ilmnes tundmatu tõrge.\nPalun veendu, et internetiaadress on õige ja ligipääsetav ning proovi uuesti.\nKui probleem ei kao, võta ühendust [[Special:ListUsers/sysop|administraatoriga]].",
     "upload-too-many-redirects": "URL sisaldas liiga palju ümbersuunamisi",
-    "upload-unknown-size": "Tundmatu suurus",
     "upload-http-error": "HTTP-viga: $1",
     "upload-copy-upload-invalid-domain": "Sellest domeenist pole kopeerimise teel üleslaadimine võimalik.",
     "backend-fail-stream": "Faili $1 ei saanud edastada.",
     "img-auth-streaming": "Faili \"$1\" voogedastus.",
     "img-auth-public": "img_auth.php on ette nähtud failide väljastamiseks privaatses vikis.\nSee viki on seadistatud kui avalik viki.\nTurvakaalutlustel on img_auth.php kasutus keelatud.",
     "img-auth-noread": "Faili \"$1\" lugemiseks vajalik juurdepääs puudub.",
-    "img-auth-bad-query-string": "URL-is on vigane päringusõne.",
     "http-invalid-url": "Vigane internetiaadress: $1",
     "http-invalid-scheme": "Aadressid, mis algavad eesliitega \"$1\", ei ole toetatud.",
     "http-request-error": "HTTP-päring nurjus tundmatu tõrke tõttu.",
     "filehist-dimensions": "Mõõtmed",
     "filehist-filesize": "Faili suurus",
     "filehist-comment": "Kommentaar",
-    "filehist-missing": "Fail puudub",
     "imagelinks": "Failikasutus",
     "linkstoimage": "Sellele pildile {{PLURAL:$1|viitab järgmine lehekülg|viitavad järgmised leheküljed}}:",
     "linkstoimage-more": "Sellele failile viitab enam kui {{PLURAL:$1|üks lehekülg|$1 lehekülge}}.\nJärgmises loendis on näidatud ainult {{PLURAL:$1|esimene viitav lehekülg|esimesed $1 viitavat lehekülge}}.\n[[Special:WhatLinksHere/$2|Kogu loetelu]] on saadaval.",
     "listgrouprights-removegroup-self": "Eemaldada enda konto {{PLURAL:$2|rühmast|rühmadest}}: $1",
     "listgrouprights-addgroup-self-all": "Oma konto kõigisse rühmadesse lisada",
     "listgrouprights-removegroup-self-all": "Eemaldada ennast kõigist rühmadest",
+    "listgrouprights-namespaceprotection-header": "Nimeruumipiirangud",
+    "listgrouprights-namespaceprotection-namespace": "Nimeruum",
+    "listgrouprights-namespaceprotection-restrictedto": "Redigeerimiseks vajalikud õigused",
+    "trackingcategories": "Süsteemikategooriad",
+    "trackingcategories-summary": "Siin leheküljel on loetletud süsteemikategooriad, millesse MediaWiki tarkvara ise lehekülgi arvab. Nende kategooriate nimesid saab muuta, kui vahetada {{ns:8}}-nimeruumis vastavaid süsteemisõnumeid.",
+    "trackingcategories-msg": "Süsteemikategooria",
+    "trackingcategories-name": "Sõnumi nimi",
+    "trackingcategories-desc": "Kategooriasse arvamise kriteeriumid",
+    "noindex-category-desc": "Robotid ei indekseeri lehekülge, sest sellel on võlusõna <code><nowiki>__NOINDEX__</nowiki></code> ja lehekülg on nimeruumis, kus see silt on lubatud.",
+    "index-category-desc": "Leheküljel on <code><nowiki>__INDEX__</nowiki></code> ja lehekülg on nimeruumis, kus see silt on lubatud ning seetõttu indekseerivad robotid lehekülge seal, kus nad muidu seda ei teeks.",
+    "post-expand-template-inclusion-category-desc": "Kõigi mallide hõrendamise järel on lehekülg suurem kui <code>$wgMaxArticleSize</code>, mistõttu jäid mõned mallid hõrendamata.",
+    "post-expand-template-argument-category-desc": "Malli argumendi (midagi kolmekordsete looksulgude vahel, näiteks <code>{{{Foo}}})</code> hõrendamise järel on lehekülg suurem kui <code>$wgMaxArticleSize</code>.",
+    "expensive-parserfunction-category-desc": "Leheküljel on liiga palju kulukaid parserifunktsioone nagu <code>#ifexist</code>. Vaata [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit dokumentatsiooni].",
+    "broken-file-category-desc": "Kategooria lisatakse, kui leheküljel on katkine pildilink, millega manustatakse fail, mida pole olemas.",
+    "hidden-category-category-desc": "Selle kategooria leheküljel on <code><nowiki>__HIDDENCAT__</nowiki></code>, mis vaikimisi ei lase näidata seda kategooriat lehekülgedel kategoorialinkide kastis.",
+    "trackingcategories-nodesc": "Kirjeldus puudub.",
+    "trackingcategories-disabled": "Kategooria on keelatud.",
     "mailnologin": "Saatja aadress puudub",
     "mailnologintext": "Pead olema [[Special:UserLogin|sisse logitud]] ja sul peab [[Special:Preferences|eelistustes]] olema kehtiv e-posti aadress, et saata teistele kasutajatele e-kirju.",
     "emailuser": "Saada sellele kasutajale e-kiri",
     "emailuser-title-notarget": "Kasutajale e-kirja saatmine",
     "emailpage": "Saada kasutajale e-kiri",
     "emailpagetext": "Alloleva vormi kaudu saad sellele {{GENDER:$1|kasutajale}} e-kirja saata. Et kasutaja saaks vastata, täidetakse kirja saatja väli e-posti aadressiga, mille oled sisestanud [[Special:Preferences|oma eelistuste leheküljel]].",
-    "usermailererror": "Saatmise viga:",
     "defemailsubject": "E-kiri {{GRAMMAR:genitive|{{SITENAME}}}} kasutajalt $1",
     "usermaildisabled": "Kasutajatele e-kirjade saatmine keelatud",
     "usermaildisabledtext": "Selles vikis ei saa teistele kasutajatele e-kirju saata.",
     "noemailtitle": "E-posti aadressi pole",
     "noemailtext": "See kasutaja pole määranud kehtivat e-posti aadressi.",
-    "nowikiemailtitle": "E-kirja saatmine ei ole lubatud",
     "nowikiemailtext": "See kasutaja ei soovi e-posti teistelt kasutajatelt.",
     "emailnotarget": "Saaja kasutajanimi on olematu või vigane.",
     "emailtarget": "Saaja kasutajanime sisestamine",
     "nowatchlist": "Sinu jälgimisloend on tühi.",
     "watchlistanontext": "Oma jälgimisloendi nägemiseks ja muutmiseks pead $1.",
     "watchnologin": "Ei ole sisse logitud",
-    "watchnologintext": "Jälgimisloendi muutmiseks pead [[Special:UserLogin|sisse logima]].",
     "addwatch": "Lisa jälgimisloendisse",
     "addedwatchtext": "Lehekülg \"[[:$1]]\" on lisatud sinu [[Special:Watchlist|jälgimisloendisse]].\nEdasised muudatused sellel leheküljel ja seotud aruteluleheküljel tuuakse ära jälgimisloendis.",
     "removewatch": "Eemalda jälgimisloendist",
     "unwatchthispage": "Ära jälgi",
     "notanarticle": "Pole artikkel",
     "notvisiblerev": "Redaktsioon on kustutatud",
-    "watchlist-details": "Jälgimisloendis on {{PLURAL:$1|$1 lehekülg|$1 lehekülge}} (ei arvestata arutelulehekülgi).",
+    "watchlist-details": "Jälgimisloendis on {{PLURAL:$1|üks lehekülg|$1 lehekülge}}. Arutelulehekülgi pole eraldi välja toodud.",
     "wlheader-enotif": "E-posti teel teavitamine on lubatud.",
     "wlheader-showupdated": "Leheküljed, mida on muudetud peale sinu viimast külastust, on '''rasvases kirjas'''.",
     "watchmethod-recent": "jälgitud lehekülgedel tehtud viimaste muudatuste läbivaatamine",
     "watching": "Jälgimine...",
     "unwatching": "Jälgimise lõpetamine...",
     "watcherrortext": "Lehekülje \"$1\" jaoks jälgimisloendi sätete muutmisel ilmnes tõrge.",
-    "enotif_mailer": "{{GRAMMAR:genitive|{{SITENAME}}}} lehekülje muutmise teavitaja",
     "enotif_reset": "Märgi kõik lehed loetuks",
     "enotif_impersonal_salutation": "{{GRAMMAR:genitive|{{SITENAME}}}} kasutaja",
     "enotif_subject_deleted": "{{GENDER:$2|$2}} kustutas {{GRAMMAR:genitive|{{SITENAME}}}} lehekülje $1",
     "excontent": "sisu oli: '$1'",
     "excontentauthor": "sisu oli: '$1' (ja ainuke kirjutaja oli '[[Special:Contributions/$2|$2]]')",
     "exbeforeblank": "sisu enne lehekülje tühjendamist: '$1'",
-    "exblank": "lehekülg oli tühi",
     "delete-confirm": "Lehekülje \"$1\" kustutamine",
     "delete-legend": "Kustutamine",
     "historywarning": "'''Hoiatus:''' Kustutataval leheküljel on ligikaudu {{PLURAL:$1|ühe redaktsiooniga|$1 redaktsiooniga}} ajalugu:",
     "contributions-title": "Kasutaja $1 kaastöö",
     "mycontris": "Kaastöö",
     "contribsub2": "Kasutaja {{GENDER:$3|$1}} ($2) jaoks",
+    "contributions-userdoesnotexist": "Kasutajakonto \"$1\" pole registreeritud.",
     "nocontribs": "Antud kriteeriumitele vastavaid muudatusi ei leitud.",
     "uctop": "(praegune)",
     "month": "Alates kuust (ja varasemad):",
     "sp-contributions-newbies-sub": "Uute kontode kaastöö",
     "sp-contributions-newbies-title": "Uute kasutajate kaastöö",
     "sp-contributions-blocklog": "blokeerimised",
+    "sp-contributions-suppresslog": "varjatud kaastöö",
     "sp-contributions-deleted": "kustutatud kaastöö",
     "sp-contributions-uploads": "üleslaadimised",
     "sp-contributions-logs": "logid",
     "sp-contributions-blocked-notice": "See kasutaja on parajasti blokeeritud. Allpool on toodud kõige hilisem blokeerimislogi sissekanne:",
     "sp-contributions-blocked-notice-anon": "See IP-aadress on parajasti blokeeritud.\nAllpool on toodud viimane blokeerimislogi sissekanne:",
     "sp-contributions-search": "Kaastöö otsimine",
-    "sp-contributions-suppresslog": "varjatud kaastöö",
     "sp-contributions-username": "IP-aadress või kasutajanimi:",
     "sp-contributions-toponly": "Ainult uusimad redaktsioonid",
     "sp-contributions-newonly": "Näita ainult uute lehekülgedega alustamist",
     "allmessagesname": "Nimi",
     "allmessagesdefault": "Vaiketekst",
     "allmessagescurrent": "Praegune tekst",
-    "allmessagestext": "See on loend kõikidest olemasolevatest süsteemisõnumitest MediaWiki nimeruumis.\nKui soovid MediaWiki tarkvara tõlkimises osaleda, siis vaata lehti [https://www.mediawiki.org/wiki/Localisation MediaWiki lokaliseerimine] ja [//translatewiki.net translatewiki.net].",
+    "allmessagestext": "See on loend kõikidest olemasolevatest süsteemisõnumitest MediaWiki nimeruumis.\nKui soovid MediaWiki tarkvara tõlkimises osaleda, siis vaata lehti [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation MediaWiki lokaliseerimine] ja [//translatewiki.net translatewiki.net].",
     "allmessagesnotsupportedDB": "Seda lehekülge ei saa kasutada, sest '''$wgUseDatabaseMessages''' ei tööta.",
     "allmessages-filter-legend": "Filter",
     "allmessages-filter": "Muutmisoleku filter:",
     "importunknownsource": "Tundmatut tüüpi impordiallikas",
     "importcantopen": "Ei saa imporditavat faili avada",
     "importbadinterwiki": "Vigane vikidevaheline link",
-    "importnotext": "Tühi või ilma tekstita",
     "importsuccess": "Importimine edukalt lõpetatud!",
-    "importhistoryconflict": "Konfliktne muudatuste ajalugu (võimalik, et seda lehekülge juba varem imporditud)",
     "importnosources": "Ühtegi vikidevahelist impordiallikat pole määratletud ja otsene ajaloo üleslaadimine on keelatud.",
     "importnofile": "Ühtegi imporditavat faili ei laaditud üles.",
     "importuploaderrorsize": "Üleslaaditava faili import ebaõnnestus.\nFail on lubatust suurem.",
index f4028ea..b44678d 100644 (file)
     "accountcreatedtext": "[[{{ns:User}}:$1|$1]] lankidearentzat ([[{{ns:User talk}}:$1|eztabaida]]) kontua sortu da.",
     "createaccount-title": "{{SITENAME}}-rako kontua sortu",
     "createaccount-text": "Norbaitek zure e-postarekin kontu bat sortu du {{SITENAME}}(e)n ($4) \"$2\" izenarekin eta \"$3\" pasahitzarekin.\nOrain bertan sar zaitezke eta zure pasahitza aldatu.\n\nKontu honen sorrera akats bat dela uste baduzu mezu honi ez diozu zertan jaramonik egin.",
-    "usernamehasherror": "Erabiltzaile-izenak ezin du kuxin-karaktererik eduki",
     "login-throttled": "Saioa hasteko saiakera gehiegi egin berri dituzu.\nBerriro saiatu aurretik $1 itxoin, mesedez.",
     "login-abort-generic": "Zure sarrera ez da arrakastatsua izan - Abortatua",
     "loginlanguagelabel": "Hizkuntza: $1",
     "prefs-skin": "Itxura",
     "skin-preview": "Aurrebista",
     "datedefault": "Hobespenik ez",
-    "prefs-beta": "Beta ezaugarriak",
-    "prefs-datetime": "Data eta ordua",
     "prefs-labs": "Labs ezaugarriak",
     "prefs-user-pages": "Erabiltzaile orriak",
     "prefs-personal": "Erabiltzaile profila",
     "upload-permitted": "Baimendutako fitxategi motak: $1.",
     "upload-preferred": "Fitxategi mota hobetsiak: $1.",
     "upload-prohibited": "Debekatutako fitxategi motak: $1.",
-    "uploadlog": "igoera erregistroa",
     "uploadlogpage": "Igoera erregistroa",
     "uploadlogpagetext": "Jarraian, igotako azken fitxategien zerrenda ageri da.\nIkus ezazu [[Special:NewFiles|fitxategi berrien galeria]], irudizkoagoa den ikuspegi orokor bat izateko.",
     "filename": "Fitxategi izena",
     "filereuploadsummary": "Fitxategi aldaketak:",
     "filestatus": "Copyright egoera:",
     "filesource": "Jatorria:",
-    "uploadedfiles": "Igotako fitxategiak",
     "ignorewarning": "Oharra ezikusi eta fitxategia gorde.",
     "ignorewarnings": "Edozein ohar ezikusi.",
     "minlength1": "Fitxategi izenek letra bat izan behar dute gutxienez.",
     "overwroteimage": "\"[[$1]]\"ren bertsio berri bat igo",
     "uploaddisabled": "Igoerak ezgaituta daude",
     "copyuploaddisabled": "URL bidezko igoera desaktibatuta.",
-    "uploadfromurl-queued": "Zure igoera ilaran jarri da.",
     "uploaddisabledtext": "Fitxategiak igotzea ezgaituta dago.",
     "php-uploaddisabledtext": "Fitxategi igoerak PHP-n ezinduta daude. Ikusi fitxategi_igoerak mesedez.",
     "uploadscripted": "Fitxategi honek web zerbitzariak modu ezegokian interpretatu lezakeen HTML edo script kodea dauka.",
     "upload-misc-error": "Errore ezezaguna igotzerakoan",
     "upload-misc-error-text": "Errore ezezagun bat gertatu da fitxategia igotzen ari zenean. Mesedez, egiaztatu URLa baliozkoa eta eskuragarria dela eta berriz saiatu. Arazoak jarraitzen badu, jar zaitez [[Special:ListUsers/sysop|administratzailearekin]] harremanetan.",
     "upload-too-many-redirects": "URLak birbideratze gehiegi zituen",
-    "upload-unknown-size": "Tamaina ezezaguna",
     "upload-http-error": "HTTP errorea gertatu da: $1",
     "upload-copy-upload-invalid-domain": "Domeinu honetan ezin dira igoerak kopiatu.",
     "backend-fail-stream": "Ezin izan da \"$1\" fitxategiaren stream egin.",
     "img-auth-isdir": "\"$1\" direktorio batera iristen saiatzen ari zara.\nFitxategien sarbidea baino ez da onartzen.",
     "img-auth-streaming": "\"$1\" sekuentziatzen.",
     "img-auth-noread": "Erabiltzaileak ez du \"$1\" irakurtzeko sarbiderik.",
-    "img-auth-bad-query-string": "URLan query esaldi baliogabea dago.",
     "http-invalid-url": "URL baliogabea: $1",
     "http-invalid-scheme": "\"$1\" eskema duten URLak ez dira baliagarriak.",
     "http-request-error": "HTTP eskariak akatsa izan du errore ezezagun bat dela eta.",
     "filehist-dimensions": "Neurriak",
     "filehist-filesize": "Tamaina",
     "filehist-comment": "Iruzkina",
-    "filehist-missing": "Fitxategia falta da",
     "imagelinks": "Fitxategiaren erabilera",
     "linkstoimage": "Hurrengo {{PLURAL:$1|orrialdeak du|$1 orrialdeek dute}} fitxategi honetarako lotura:",
     "linkstoimage-more": "$1 {{PLURAL:$1|orri lotura|orri lotura}} baino gehiago daude fitxategira.\nOndorengo zerrendak fitxategira dauden {{PLURAL:$1|lehen lotura|lehen $1 loturak}} erakusten ditu bakarrik.\n[[Special:WhatLinksHere/$2|Zerrenda osoa]] ere eskuragarri dago.",
     "emailuser-title-notarget": "Erabiltzaileari e-maila bidali",
     "emailpage": "Erabiltzaileari e-posta bidali",
     "emailpagetext": "{{GENDER:$1|Erabiltzaile}} honek baliozko e-posta helbide bat ezarri badu bere hobespenetan, beheko formularioa erabiliz mezu bat bidal dakioke.\n[[Special:Preferences|Hobespenetan]] daukazun e-posta helbidea azalduko da mezuaren bidaltzaile bezala eta beraz erantzun ahal izango dizu.",
-    "usermailererror": "Mail objektuak errore hau itzuli du:",
     "defemailsubject": "{{SITENAME}} e-posta \"$1\" lankideak",
     "usermaildisabled": "Erabiltzailearen e-maila desaktibatuta",
     "usermaildisabledtext": "Wiki honetan ezin diezu beste erabiltzaileei posta elektronikorik bidali",
     "noemailtitle": "Posta helbiderik ez",
     "noemailtext": "Erabiltzaile honek ez du baliozko e-posta helbiderik zehaztu.",
-    "nowikiemailtitle": "Ezin da e-postarik bidali",
     "nowikiemailtext": "Erabiltzaile honek beste erabiltzaileengandik e-postak ez jasotzea hautatu du.",
     "emailnotarget": "Jasotzailearentzat lankide izen ez-egokia edo ezezaguna.",
     "emailtarget": "Sartu jasolearen erabiltzaile izena",
     "nowatchlist": "Zure jarraipen zerrenda hutsik dago.",
     "watchlistanontext": "Mesedez $1 zure jarraipen zerrendako orrialdeak ikusi eta aldatu ahal izateko.",
     "watchnologin": "Saioa hasi gabe",
-    "watchnologintext": "[[Special:UserLogin|Saioa hasi]] behar duzu zure jarraipen zerrenda aldatzeko.",
     "addwatch": "Jarraipen zerrendara gehitu",
     "addedwatchtext": "«[[:$1]]» orria zure [[Special:Watchlist|jarraipen zerrendara]] erantsi da. \n\nOrri honetan aurrerantzean egindako aldaketak zerrenda horretan agertuko dira.",
     "removewatch": "Kendu zure jarraipen zerrendatik",
     "watchlist-options": "Jarraitze-zerrendaren aukerak",
     "watching": "Zerrendan gehitzen...",
     "unwatching": "Zerrendatik kentzen...",
-    "enotif_mailer": "{{SITENAME}}(e)ko Oharpen Postaria",
     "enotif_reset": "Orrialde guztiak bisitatu bezala markatu",
     "enotif_impersonal_salutation": "{{SITENAME}} erabiltzailea",
     "enotif_subject_deleted": "{{SITENAME}}(e)ko $1 orrialdea {{GENDER:$2|ezabatu}} du $2 erabiltzaileak",
     "excontent": "edukia hau zen: '$1'",
     "excontentauthor": "edukia hau zen: \"$1\" (parte hartu duen lankide bakarra: \"[[Special:Contributions/$2|$2]]\")",
     "exbeforeblank": "hustu aurreko edukiera: '$1'",
-    "exblank": "orrialdea hutsik zegoen",
     "delete-confirm": "\"$1\" ezabatu",
     "delete-legend": "Ezabatu",
     "historywarning": "'''Oharra:''' Ezabatzera zoazen orrialdeak $1 {{PLURAL:$1|berrikuspen du|berrikuspen ditu}} gutxi gorabehera:",
     "rollbacklinkcount-morethan": "desegin {{PLURAL:$1|edizio bat|$1 edizio}} baino gehiago",
     "rollbackfailed": "Desegiteak huts egin dud",
     "cantrollback": "Ezin da aldaketa desegin; erabiltzaile bakarrak hartu du parte.",
-    "alreadyrolled": "Ezin da [[User:$2|$2]](e)k ([[User talk:$2|Eztabaida]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]) [[$1]](e)n egindako azken aldaketa desegin;\nbeste norbaitek editatu du edo jada desegin du.\n\n Azken aldaketa [[User:$3|$3]](e)k ([[User talk:$3|Eztabaida]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]) egin du.",
+    "alreadyrolled": "Ezin da [[User:$2|$2]] ([[User talk:$2|Eztabaida]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]) wikilariak «[[$1]]» orrian egindako azken aldaketa desegin;\nbeste norbaitek editatu edo desegin du jadanik.\n\n Azken aldaketa [[User:$3|$3]] ([[User talk:$3|Eztabaida]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]) wikilariak egin du.",
     "editcomment": "Aldaketaren laburpena: \"''$1''\".",
     "revertpage": "[[Special:Contributions/$2|$2]] ([[User talk:$2|talk]]) wikilariaren aldaketak deseginda, edukia [[User:$1|$1]] wikilariaren azken bertsiora itzuli da.",
     "rollback-success": "$1 wikilariaren aldaketak deseginda,\nedukia $2 wikilariaren azken bertsiora itzuli da.",
     "allmessagesname": "Izena",
     "allmessagesdefault": "Testu lehenetsia",
     "allmessagescurrent": "Oraingo testua",
-    "allmessagestext": "MediaWikin erabiltzen diren mezu guztien zerrenda.\nMesedez bisitatu [https://www.mediawiki.org/wiki/Localisation MediaWiki] eta [//translatewiki.net translatewiki.net] orrialdeak MediaWikira ekarpenak egin badituzu.",
+    "allmessagestext": "MediaWikin erabiltzen diren mezu guztien zerrenda.\nMesedez bisitatu [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation MediaWiki] eta [//translatewiki.net translatewiki.net] orrialdeak MediaWikira ekarpenak egin badituzu.",
     "allmessagesnotsupportedDB": "Ezin da '''{{ns:special}}:Allmessages''' erabili '''$wgUseDatabaseMessages''' ezgaituta dagoelako.",
     "allmessages-filter-legend": "Iragazi",
     "allmessages-filter": "Aldaketa-egoeraren arabera iragazi:",
     "importunknownsource": "Inportazio iturri mota ezezaguna",
     "importcantopen": "Ezin izan da inportazio fitxategia ireki",
     "importbadinterwiki": "Interwiki lotura ezegokia",
-    "importnotext": "Hutsik dago edo testurik gabe",
     "importsuccess": "Inportazioa burutu da!",
-    "importhistoryconflict": "Gatazka sortzen ari den berrikuspen historia dago (baliteke orrialdea lehenago inportatu izana)",
     "importnosources": "Ez dago wikien arteko inportazio iturririk definituta, eta historialak zuzenean igotzea ezgaituta dago.",
     "importnofile": "Ez da inportazio fitxategirik igo.",
     "importuploaderrorsize": "Inportatutako artxiboaren igoera-porrota.\nArtxiboa onartutako igoera-tamaina baino handiagoa da.",
     "tooltip-recreate": "Orrialdea birsortu ezabatu egin den arren",
     "tooltip-upload": "Igoera hasi",
     "tooltip-rollback": "\"Desegin\" ekintzak orriaren azken egilearen ekarpena ezabatzen du klik batean",
-    "tooltip-undo": "\"Desegin\" botoiak egindako aldaketa ezeztatzen du eta aurreikuspen bista erakusten du.\nLaburpenean arrazoi bat gehitzea baimentzen du",
+    "tooltip-undo": "«Desegin» botoiak egindako aldaketa ezeztatzen du, eta aurreikuspen bista erakusten. Laburpenean arrazoi bat gehitzeko aukera ematen du.",
     "tooltip-preferences-save": "Hobespenak gorde",
     "tooltip-summary": "Laburpen labur bat sar ezazu",
     "common.css": "/** Hemen idatzitako CSS kodeak itxura guztietan izango du eragina */",
index a78feef..053cadf 100644 (file)
     "nowatchlist": "La tu lista e seguimientu está vacia.",
     "watchlistanontext": "Pa vel u eital las entrás ena tu lista e seguimientu es mestel $1.",
     "watchnologin": "Nu estás rustriu",
-    "watchnologintext": "Ebis [[Special:UserLogin|abril la tu cuenta]] pa puel hazel chambus ena tu lista e seguimientu.",
     "addedwatchtext": "S´á añiiu la páhina \"[[:$1]]\" a la tu [[Special:Watchlist|lista e seguimientu]].\nLos huturus chambus de la páhina i ena su caraba se muestrarán aquí,\ni el su entítulu apaicirá en '''negrina''' ena [[Special:RecentChanges|lista d´úrtimus chambus]].\n\nSi quieis ehal de vehilal la páhina, pursa sobri \"Ehal de vehilal\".",
     "removedwatchtext": "La página \"[[:$1]]\" á siu esborrá de la tu [[Special:Watchlist|lista de seguimientu]].",
     "watch": "Vegilal",
     "allmessagesname": "Nombri",
     "allmessagesdefault": "Testu pol defeutu",
     "allmessagescurrent": "Testu atual",
-    "allmessagestext": "Esta es una lista e mensahis del sistema disponibris nel espaciu e nombris MediaWiki:\nPol favol, vesita [https://www.mediawiki.org/wiki/Localisation MediaWiki Localisation] i [//translatewiki.net translatewiki.net] si quieis colabutal.",
+    "allmessagestext": "Esta es una lista e mensahis del sistema disponibris nel espaciu e nombris MediaWiki:\nPol favol, vesita [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation MediaWiki Localisation] i [//translatewiki.net translatewiki.net] si quieis colabutal.",
     "allmessagesnotsupportedDB": "Nu se puei gastal esta páhina polque '''$wgUseDatabaseMessages''' está desativau.",
     "thumbnail-more": "Agrandal",
     "filemissing": "Archivu escambulliu",
index 4806c7a..0e52928 100644 (file)
@@ -1,6 +1,39 @@
 {
     "@metadata": {
-        "authors": []
+        "authors": [
+            "Alnokta",
+            "Americophile",
+            "Amire80",
+            "Armandaneshjoo",
+            "Armin1392",
+            "Calak",
+            "Dalba",
+            "Ebraminio",
+            "Fatemi127",
+            "Goudarz",
+            "Huji",
+            "Ladsgroup",
+            "Leyth",
+            "Mardetanha",
+            "Mehdi",
+            "Mehran",
+            "Meisam",
+            "Mjbmr",
+            "Omidh",
+            "Omnia",
+            "Reza1615",
+            "Rtemis",
+            "Sahim",
+            "Surena",
+            "Taha",
+            "Wayiran",
+            "Zack90",
+            "ZxxZxxZ",
+            "לערי ריינהארט",
+            "جواد",
+            "درفش کاویانی",
+            "محک"
+        ]
     },
     "tog-underline": "خط کشیدن زیر پیوندها:",
     "tog-hideminor": "تغییرات جزئی از فهرست تغییرات اخیر پنهان شوند",
     "permalink": "پیوند پایدار",
     "print": "چاپ",
     "view": "نمایش",
+    "view-foreign": "مشاهده در $1",
     "edit": "ویرایش",
+    "edit-local": "ویرایش توضیحات محلی",
     "create": "ایجاد",
+    "create-local": "افزودن توضیحات محلی",
     "editthispage": "ویرایش این صفحه",
     "create-this-page": "ایجاد این صفحه",
     "delete": "حذف",
     "pool-timeout": "اتمام مهلت انتظار برای قفل",
     "pool-queuefull": "صف مخزن پر است",
     "pool-errorunknown": "خطای ناشناخته",
+    "pool-servererror": "پول سنتر سرویس در دسترس نیست ( $1 ).",
     "aboutsite": "دربارهٔ {{SITENAME}}",
     "aboutpage": "Project:درباره",
     "copyright": "محتوایات تحت اجازه‌نامهٔ $1 هستند مگر اینکه خلافش ذکر شده باشد.",
     "accountcreatedtext": "حساب کاربری برای [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|بحث]]) ایجاد شده است.",
     "createaccount-title": "ایجاد حساب کاربری در {{SITENAME}}",
     "createaccount-text": "یک نفر برای رایانامه شما یک حساب کاربری در {{SITENAME}} با نام «$2» ایجاد کرده‌است ($4)، که گذرواژهٔ آن چنین است: $3\nشما باید به سامانه وارد شوید تا گذرواژهٔ خود را تغییر بدهید.\n\nاگر این حساب اشتباهی ساخته شده است، این پیغام را نادیده بگیرید.",
-    "usernamehasherror": "نام کاربری نمی‌تواند شامل نویسه‌های درهم باشد",
     "login-throttled": "شما به تازگی چندین‌بار برای ثبت ورود تلاش کرده‌اید.\nلطفاً پیش از آنکه دوباره تلاش کنید $1 صبر کنید.",
     "login-abort-generic": "ورود شما ناموفق بود - خاتمهٔ ناگهانی داده شد",
     "loginlanguagelabel": "زبان: $1",
     "resetpass-abort-generic": "تغییر گذرواژه به دست یکی از افزونه‌ها لغو شده است.",
     "resetpass-expired": "رمز عبور شما منقضی شده‌است. لطفاً برای ورود رمز عبور جدیدی را تنظیم کنید.",
     "resetpass-expired-soft": "رمز عبور شما منقضی شده‌است، و نیاز به تنظیم مجدد دارد. لطفاً اکنون رمز عبور جدیدی را انتخاب کنید، یا برای تنظیم مجدد آن بعدآً، دکمه \"{{int:resetpass-submit-cancel}}\" را کلیک کنید.",
+    "resetpass-validity-soft": "گذرواهٔ شما صحیح نیست: $1\n\nلطفاً یک گذرواژهٔ جدید الآن انتخاب کنید یا بر «{{int:resetpass-submit-cancel}}» کلیک کنید که دوباره آن را بعداً انتخاب کنید.",
     "passwordreset": "بازنشانی گذرواژه",
     "passwordreset-text-one": "برای بازنشانی گذرواژه‌تان این فرم را کامل کنید.",
     "passwordreset-text-many": "{{PLURAL:$1|برای دریافت یک گذرواژهٔ موقت از راه رایانامه، یکی از زمینه‌ها را پر کنید.}}",
     "revdelete-no-file": "پروندهٔ مشخص شده وجود ندارد.",
     "revdelete-show-file-confirm": "آیا مطمئن هستید که می‌خواهید یک نسخهٔ حذف شده از پروندهٔ «<nowiki>$1</nowiki>» مورخ $2 ساعت $3 را ببینید؟",
     "revdelete-show-file-submit": "بله",
+    "revdelete-selected-text": "{{PLURAL:$1|نسخهٔ انتخاب‌شده|نسخه‌های انتخابی}} [[:$2]]:",
+    "revdelete-selected-file": "{{PLURAL:$1|نسخهٔ انتخاب‌شدهٔ|نسخه‌های انتخابی}} [[:$2]]:",
     "logdelete-selected": "{{PLURAL:$1|مورد|موارد}} انتخاب شده از سیاهه:",
+    "revdelete-text-text": "نسخه‌های حذف‌شده همچنان در تارییخچه نمایان خواند بود ولی قسمت‌هایی از محتویات غبرقابل دسترس برای عموم خواهد بود.",
+    "revdelete-text-file": "نسخه‌های حذف‌شده همچنان در تاریخچهٔ پرونده نمایان خواهد بود ولی قسمت‌هایی از محتویات آن‌ها برای عموم غیرقابل دسترس خواهد بود.",
+    "logdelete-text": "نسخه‌های حذف‌شده همچنان در سیاهه‌های نمایان خواهد بود ولی قسمت‌هایی از محتویات آن‌ها غیرقابل دسترس برای عموم خواهد بود.",
     "revdelete-text-others": "سایر مدیران {{SITENAME}} هنوز می‌توانند این محتوای پنهان را ببینند و از همین طریق موارد حذف شده را احیا کنند، مگر آن که محدودیت‌های دیگری اعمال گردد.",
     "revdelete-confirm": "لطفاً تأیید کنید که می‌خواهید این کار را انجام دهید، عواقب آن را درک می‌کنید و این کار را طبق [[{{MediaWiki:Policy-url}}|سیاست‌ها]] انجام می‌دهید.",
     "revdelete-suppress-text": "فرونشانی باید '''تنها''' برای موارد زیر استفاده شود:\n* اطلاعات به طور بالقوه افتراآمیز\n* اطلاعات نامناسب شخصی\n*: ''نشانی منزل، شماره تلفن، کد ملی و غیره.''",
     "prefs-skin": "پوسته",
     "skin-preview": "پیش‌نمایش",
     "datedefault": "بدون ترجیح",
-    "prefs-beta": "ویژگی‌های آزمایشی",
-    "prefs-datetime": "تاریخ و زمان",
     "prefs-labs": "گزینه‌های آزمایشی",
     "prefs-user-pages": "صفحه‌های کاربری",
     "prefs-personal": "داده‌های کاربر",
     "upload-permitted": "انواع مجاز پرونده‌ها: $1.",
     "upload-preferred": "انواع ترجیح‌داده شده پرونده‌ها: $1.",
     "upload-prohibited": "انواع نامجاز پرونده‌ها: $1.",
-    "uploadlog": "سیاههٔ بارگذاری‌ها",
     "uploadlogpage": "سیاههٔ بارگذاری‌ها",
     "uploadlogpagetext": "فهرست زیر فهرستی از آخرین بارگذاری پرونده‌ها است.\nبرای مرور دیداری [[Special:NewFiles|نگارخانهٔ پرونده‌های جدید]] را ببینید.",
     "filename": "نام پرونده",
     "filereuploadsummary": "تغییرات پرونده:",
     "filestatus": "وضعیت حق تکثیر:",
     "filesource": "منبع:",
-    "uploadedfiles": "پرونده‌های بارشده",
     "ignorewarning": "چشم‌پوشی از هشدار و ذخیرهٔ پرونده.",
     "ignorewarnings": "چشم‌پوشی از همهٔ هشدارها",
     "minlength1": "نام پرونده دست کم باید یک حرف باشد.",
     "overwroteimage": "نسخه جدیدی از  «[[$1]]» را بارگذاری کرد",
     "uploaddisabled": "بارگذاری غیرفعال است.",
     "copyuploaddisabled": "بارگذاری از طریق نشانی اینترنتی غیرفعال است.",
-    "uploadfromurl-queued": "بارگذاری شما به صف اضافه شد.",
     "uploaddisabledtext": "امکان بارگذاری پرونده غیرفعال است.",
     "php-uploaddisabledtext": "بارگذاری پرونده‌های پی‌اچ‌پی غیرفعال است.\nلطفاً تنظیمات file_uploads را بررسی کنید.",
     "uploadscripted": "این صفحه حاوی کد اچ‌تی‌ام‌ال یا اسکریپتی است که ممکن است به‌نادرست توسط مرورگر وب تفسیر شود.",
     "upload-misc-error": "خطای نامعلوم در بارگذاری",
     "upload-misc-error-text": "هنگام بارگذاری، خطایی نامعلوم رخ داد.\nلطفاً اطمینان حاصل کنید که نشانی اینترنتی معتبر و قابل دسترسی است و بعد دوباره تلاش کنید.\nاگر مشکل همچنان برقرار بود با یکی از [[Special:ListUsers/sysop|مدیران]] تماس بگیرید.",
     "upload-too-many-redirects": "نشانی اینترتی حاوی تعداد بیش از اندازه‌ای تغییرمسیر است",
-    "upload-unknown-size": "اندازهٔ نامشخص",
     "upload-http-error": "یک خطای اچ‌تی‌تی‌پی رخ داد: $1",
     "upload-copy-upload-invalid-domain": "بارگذاری کپی پرونده‌ها از این دامنه امکان‌پذیر نیست.",
     "backend-fail-stream": "نمی‌توان پروندهٔ $1 را ارسال کرد.",
     "img-auth-streaming": "در حال جاری ساختن «$1».",
     "img-auth-public": "عملکرد img_auth.php برونداد پرونده‌ها از یک ویکی خصوصی است.\nاین ویکی به عنوان یک ویکی عمومی تنظیم شده‌است.\nبرای امنیت بهینه، img_auth.php غیرفعال است.",
     "img-auth-noread": "کاربر دسترسی خواندن «$1» را ندارد.",
-    "img-auth-bad-query-string": "آدرس اینترنتی شامل یک رشتهٔ نامعتبر درخواست است.",
     "http-invalid-url": "نشانی نامعتبر: $1",
     "http-invalid-scheme": "نشانی‌های اینترنتی با طرح «$1» پشتیبانی نمی‌شوند.",
     "http-request-error": "درخواست اچ‌تی‌تی‌پی به علت خطایی ناشناخته، ناموفق بود.",
     "filehist-dimensions": "ابعاد",
     "filehist-filesize": "اندازهٔ پرونده",
     "filehist-comment": "توضیح",
-    "filehist-missing": "پروندهٔ ناموجود",
     "imagelinks": "به‌کاررفتن پرونده",
     "linkstoimage": "{{PLURAL:$1|صفحهٔ|صفحه‌های}} زیر به این تصویر پیوند {{PLURAL:$1|دارد|دارند}}:",
     "linkstoimage-more": "بیش از $1 صفحه به این پرونده پیوند {{PLURAL:$1|دارد|دارند}}.\nفهرست زیر تنها {{PLURAL:$1|اولین پیوند|اولین $1 پیوند}} به این صفحه را نشان می‌دهد.\n[[Special:WhatLinksHere/$2|فهرست کامل]] نیز موجود است.",
     "download": "دریافت",
     "unwatchedpages": "صفحه‌های پی‌گیری‌نشده",
     "listredirects": "فهرست صفحه‌های تغییرمسیر",
+    "listduplicatedfiles": "فهرست همهٔ پرونده‌ها به‌همراه تکراری‌ها",
+    "listduplicatedfiles-summary": "این فهرست پرونده‌هایی با نسخه‌های اخیر این پرونده تکراری است که نسخه‌های اخبر سایر پرونده‌ها است. فقط پرونده‌های محلی در نظر گرفته شده‌اند.",
+    "listduplicatedfiles-entry": "[[:File:$1|$1]][[$3|{{PLURAL:$2|یک تکرار|$2 تکرار}}]] دارد.",
     "unusedtemplates": "الگوهای استفاده‌نشده",
     "unusedtemplatestext": "این صفحه همهٔ صفحه‌هایی در فضای نام {{ns:template}} را که در هیچ صفحه‌ای به کار نرفته‌اند، فهرست می‌کند.\nبه یاد داشته باشید که پیش از پاک‌کردن این صفحه‌ها پیوندهای دیگر به آنها را هم وارسی کنید.",
     "unusedtemplateswlh": "پیوندهای دیگر",
     "listgrouprights-removegroup-self": "می‌تواند حساب خود را از این {{PLURAL:$2|گروه|گروه‌ها}} حذف کند: $1",
     "listgrouprights-addgroup-self-all": "می‌تواند حساب خود را به تمام گروه‌ها اضافه کند",
     "listgrouprights-removegroup-self-all": "می‌تواند حساب خود را از تمام گروه‌ها حذف کند",
+    "listgrouprights-namespaceprotection-header": "محدودیت فضای نام",
+    "listgrouprights-namespaceprotection-namespace": "فضای نام",
+    "listgrouprights-namespaceprotection-restrictedto": "دسترسی(های) مجاز کاربر برای ویرایش",
+    "trackingcategories": "رده‌های ردیابی",
+    "trackingcategories-summary": "این صفحه فهرست رده‌هایی ردیابی است که به‌صورت خودکار توسط مدیاویکی پر می‌شوند است. نام‌هایشان می‌تواند پس از تغییر پیام‌های سامانه‌ای مرتبط در فضای نام {{ns:8}} تغییر یابد.",
+    "trackingcategories-msg": "ردهٔ ردیابی",
+    "trackingcategories-name": "نام پیام",
+    "trackingcategories-desc": "معیارهای گنجایش رده",
+    "noindex-category-desc": "این صفحه توسط ربات‌ها فهرست‌نشده‌است به این دلیل که واژه جادویی <code><nowiki>__NOINDEX__</nowiki></code> در آن یا در فضای که پرچم مجاز است دارد.",
+    "index-category-desc": "این صفحه <code><nowiki>__INDEX__</nowiki></code> درونش دارد (و در فضای نامی است که پرچم مجاز است)، و به این دلیل توسط ربات مجاز است که به‌صورت عادی نباید می‌شد.",
+    "post-expand-template-inclusion-category-desc": "پس از گسترش همهٔ الگوها، حجم صفحه بزرگتر از <code>$wgMaxArticleSize</code> است بنابراین بعضی از الگو گسترش نیافته‌اند.",
+    "post-expand-template-argument-category-desc": "پس از گسترش یک آرگومان الگو (چیزی بین آکولادهای سه‌تایی، مانند <code>{{{Foo}}}</code>) صفحه بزرگتر از <code>$wgMaxArticleSize</code> می‌شود.",
+    "expensive-parserfunction-category-desc": "توابع هزینه‌بر گران (مانند <code>#ifexist</code>) زیادی در صفجه شامل شده‌است. [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit Manual:$wgExpensiveParserFunctionLimit] را ببینید.",
+    "broken-file-category-desc": "رده افزود می‌شود اگر صفحه شامل یک پیوند شکسته باشد (یا یک پبوند به پروندهٔ توکاری است که وجود ندارد)",
+    "hidden-category-category-desc": "این یک ردهٔ <code><nowiki>__HIDDENCAT__</nowiki></code> درونش است که از نمایشش در جعبهٔ پیوندهای رده به‌صورت پیش‌فرض جلوگیری می‌کند.",
+    "trackingcategories-nodesc": "توضیحی وجود ندارد.",
+    "trackingcategories-disabled": "رده غیرفعال‌شده است",
     "mailnologin": "نشانی‌ای از فرستنده موجود نیست",
     "mailnologintext": "برای فرستادن رایانامه به کاربران دیگر باید [[Special:UserLogin|به سامانه وارد شوید]] و نشانی رایانامهٔ معتبری در [[Special:Preferences|ترجیحات]] خود داشته باشید.",
     "emailuser": "فرستادن نامه به این کاربر",
     "emailuser-title-notarget": "رایانامه به کاربر",
     "emailpage": "رایانامه به کاربر",
     "emailpagetext": "شما می‌توانید از فرم زیر برای ارسال یک رایانامه به این {{GENDER:$1|کاربر}} استفاده کنید.\nنشانی رایانامه‌ای که در [[Special:Preferences|ترجیحات کاربریتان]] وارد کرده‌اید در نشانی فرستنده (From) نامه خواهد آمد، تا گیرنده بتواند پاسخ دهد.",
-    "usermailererror": "رایانامه دچار خطا شد:",
     "defemailsubject": "رایانامه {{SITENAME}} از طرف کاربر «$1»",
     "usermaildisabled": "رایانامهٔ کاربر غیرقعال است",
     "usermaildisabledtext": "شما در این ویکی نمی‌توانید به دیگر کاربران رایانامه بفرستید",
     "noemailtitle": "نشانی رایانامه موجود نیست",
     "noemailtext": "این کاربر نشانی رایانامهٔ معتبری مشخص نکرده است،",
-    "nowikiemailtitle": "اجازهٔ ارسال رایانامه داده نشده‌است",
     "nowikiemailtext": "این کاربر انتخاب کرده که از دیگر کاربران رایانامه دریافت نکند.",
     "emailnotarget": "نام کاربری ناموجود یا نامعتبر برای گیرنده.",
     "emailtarget": "نام کاربری دریافت‌کننده را وارد کنید",
     "nowatchlist": "در فهرست پی‌گیری‌های شما هیچ موردی نیست.",
     "watchlistanontext": "برای مشاهده و ویرایش فهرست پی‌گیری‌های خود از $1 استفاده کنید.",
     "watchnologin": "به سامانه وارد نشده‌اید",
-    "watchnologintext": "برای تغییر فهرست پی‌گیری‌هایتان باید [[Special:UserLogin|به سامانه وارد شوید]].",
     "addwatch": "افزودن به فهرست پی‌گیری",
     "addedwatchtext": "صفحهٔ «[[:$1]]» به [[Special:Watchlist|فهرست پی‌گیری‌های]] شما اضافه شد.\nتغییرات این صفحه و صفحهٔ بحث متناظرش در آینده در اینجا فهرست خواهد شد.",
     "removewatch": "حذف از فهرست پی‌گیری",
     "unwatchthispage": "توقف پی‌گیری",
     "notanarticle": "صفحه محتوایی نیست",
     "notvisiblerev": "آخرین نسخه توسط کاربری دیگر حذف شده‌است",
-    "watchlist-details": "بدون احتساب صفحه‌های بحث، {{PLURAL:$1|$1 صفحه|$1 صفحه}} در فهرست پی‌گیری‌های شما قرار {{PLURAL:$1|دارد|دارند}}.",
+    "watchlist-details": "بدÙ\88Ù\86 Ø§Ø­ØªØ³Ø§Ø¨ ØµÙ\81Ø­Ù\87â\80\8cÙ\87اÛ\8c Ø¬Ø¯Ø§Ú¯Ø§Ù\86Ù\87Ù\94 Ø¨Ø­Ø«Ø\8c {{PLURAL:$1|$1 ØµÙ\81Ø­Ù\87|$1 ØµÙ\81Ø­Ù\87}} Ø¯Ø± Ù\81Ù\87رست Ù¾Û\8câ\80\8cÚ¯Û\8cرÛ\8câ\80\8cÙ\87اÛ\8c Ø´Ù\85ا Ù\82رار {{PLURAL:$1|دارد|دارÙ\86د}}.",
     "wlheader-enotif": "آگاه‌سازی رایانامه‌ای فعال است.",
     "wlheader-showupdated": "صفحه‌هایی که پس از آخرین بازدید شما تغییر کرده‌اند '''پررنگ''' نمایش داده شده‌اند.",
     "watchmethod-recent": "بررسی ویرایش‌های اخیر برای صفحه‌های مورد پی‌گیری",
     "watching": "پی‌گیری...",
     "unwatching": "توقف پی‌گیری...",
     "watcherrortext": "ایرادی در هنگام عوض کردن تنظیمات فهرست پیگیرتان برای «$1» رخ داد.",
-    "enotif_mailer": "رایانامهٔ اطلاع‌رسانی {{SITENAME}}",
     "enotif_reset": "نشان‌گذاری همهٔ صفحه‌ها به‌عنوان بازدیدشده",
     "enotif_impersonal_salutation": "کاربر {{SITENAME}}",
     "enotif_subject_deleted": "{{SITENAME}} صفحهٔ $1 توسط {{gender:$2|$2}} حذف شد.",
     "excontent": "محتوای صفحه این بود: «$1»",
     "excontentauthor": "محتوای صفحه این بود: «$1» (و تنها مشارکت‌کننده «[[Special:Contributions/$2|$2]]» بود)",
     "exbeforeblank": "محتوای صفحه قبل از خالی‌کردن این بود: «$1»",
-    "exblank": "صفحه خالی بود",
     "delete-confirm": "حذف «$1»",
     "delete-legend": "حذف",
     "historywarning": "'''هشدار!''' صفحه‌ای که قصد دارید حذف کنید تاریخچه‌ای با حدود $1 {{PLURAL:$1|نسخه|نسخه}} دارد:",
     "protect-locked-blocked": "شما در مدتی که دسترسی‌تان قطع است نمی‌توانید سطح محافظت صفحه‌ها را تغییر دهید.\nتنظیمات فعلی صفحهٔ '''$1''' از این قرار است:",
     "protect-locked-dblock": "به دلیل قفل شدن پایگاه داده، امکان تغییر سطح محافظت صفحه وجود ندارد.\nتنظیمات فعلی صفحهٔ '''$1''' به این قرار است:",
     "protect-locked-access": "حساب کاربری شما اجازهٔ تغییر سطح محافظت صفحه را ندارد.\nتنظیمات فعلی صفحهٔ '''$1''' به این قرار است:",
-    "protect-cascadeon": "اÛ\8cÙ\86 ØµÙ\81Ø­Ù\87  Ø¯Ø± Ø­Ø§Ù\84 Ø­Ø§Ø¶Ø± Ù\85حاÙ\81ظت Ø´Ø¯Ù\87â\80\8cاست Ø²Û\8cرا Ø¯Ø± {{PLURAL:$1|صÙ\81Ø­Ù\87Ù\94|صÙ\81Ø­Ù\87â\80\8cÙ\87اÛ\8c}} Ø²Û\8cر Ú©Ù\87 Ú¯Ø²Û\8cÙ\86Ù\87Ù\94 Ù\85حاÙ\81ظت Ø¢Ø¨Ø´Ø§Ø±Û\8c {{PLURAL:$1|Ø¢Ù\86|Ø¢Ù\86â\80\8cÙ\87ا}} Ù\81عاÙ\84 Ø§Ø³ØªØ\8c Ú¯Ù\86جاÙ\86دÙ\87 Ø´Ø¯Ù\87 Ø§Ø³Øª.\nØ´Ù\85ا Ù\85Û\8câ\80\8cتÙ\88اÙ\86Û\8cد Ø³Ø·Ø­ Ù\85حاÙ\81ظت Ø§Û\8cÙ\86 ØµÙ\81Ø­Ù\87 Ø±Ø§ ØªØºÛ\8cÛ\8cر Ø¨Ø¯Ù\87Û\8cد Ø§Ù\85ا Ø§Û\8cÙ\86 Ú©Ø§Ø± ØªØ§Ø«Û\8cرÛ\8c Ø¨Ø± Ù\85حاÙ\81ظت Ø¢Ø¨Ø´Ø§Ø±Û\8c ØµÙ\81Ø­Ù\87 نخواهد گذاشت.",
+    "protect-cascadeon": "اÛ\8cÙ\86 ØµÙ\81Ø­Ù\87  Ø¯Ø± Ø­Ø§Ù\84 Ø­Ø§Ø¶Ø± Ù\85حاÙ\81ظت Ø´Ø¯Ù\87â\80\8cاست Ø²Û\8cرا Ø¯Ø± {{PLURAL:$1|صÙ\81Ø­Ù\87Ù\94|صÙ\81Ø­Ù\87â\80\8cÙ\87اÛ\8c}} Ø²Û\8cر Ú©Ù\87 Ú¯Ø²Û\8cÙ\86Ù\87Ù\94 Ù\85حاÙ\81ظت Ø¢Ø¨Ø´Ø§Ø±Û\8c {{PLURAL:$1|Ø¢Ù\86|Ø¢Ù\86â\80\8cÙ\87ا}} Ù\81عاÙ\84 Ø§Ø³ØªØ\8c Ú¯Ù\86جاÙ\86دÙ\87 Ø´Ø¯Ù\87 Ø§Ø³Øª.\nتغÛ\8cÛ\8cراتÛ\8c Ø¨Ù\87 Ø³Ø·Ø­ Ù\85حاÙ\81ظت Ø§Û\8cÙ\86 ØµÙ\81Ø­Ù\87 Ø¨Ù\87 Ù\85حاÙ\81ظت Ø§Ø¨Ø´Ø§Ø±Û\8c ØªØ£Ø«Û\8cر نخواهد گذاشت.",
     "protect-default": "همهٔ کاربرها",
     "protect-fallback": "فقط به کاربرهایی که دسترسی «$1» دارند، اجازه داده می‌شود",
     "protect-level-autoconfirmed": "تنها کاربران تأییدشده",
     "contributions-title": "مشارکت‌های کاربری $1",
     "mycontris": "مشارکت‌ها",
     "contribsub2": "برای {{GENDER:$3|$1}} ($2)",
+    "contributions-userdoesnotexist": "حساب کاربری «$1» ثبت نشده‌است.",
     "nocontribs": "هیچ تغییری با این مشخصات یافت نشد.",
     "uctop": "(نسخه کنونی)",
     "month": "در این ماه (و پیش از آن):",
     "sp-contributions-newbies-sub": "برای تازه‌کاران",
     "sp-contributions-newbies-title": "مشارکت‌های کاربری برای حساب‌های تازه‌کار",
     "sp-contributions-blocklog": "سیاههٔ بسته‌شدن‌ها",
+    "sp-contributions-suppresslog": "کمک‌های کاربر متوقف شده",
     "sp-contributions-deleted": "مشارکت‌های حذف‌شدهٔ کاربر",
     "sp-contributions-uploads": "بارگذاری‌ها",
     "sp-contributions-logs": "سیاهه‌ها",
     "sp-contributions-blocked-notice": "این کاربر در حال حاضر بسته شده‌است.\nآخرین سیاههٔ بسته شدن در زیر آمده‌است:",
     "sp-contributions-blocked-notice-anon": "این نشانی آی‌پی در حال حاضر بسته است.\nآخرین سیاههٔ بسته شدن در زیر آمده‌است:",
     "sp-contributions-search": "جستجوی مشارکت‌ها",
-    "sp-contributions-suppresslog": "کمک‌های کاربر متوقف شده",
     "sp-contributions-username": "نشانی آی‌پی یا نام کاربری:",
     "sp-contributions-toponly": "فقط ویرایش‌هایی که آخرین نسخه‌اند نمایش داده شود",
     "sp-contributions-newonly": "فقط نمایش ویرایش‌هایی که تولید‌های صفحه هستند",
     "allmessagesname": "نام",
     "allmessagesdefault": "متن پیش‌فرض پیغام",
     "allmessagescurrent": "متن کنونی پیغام",
-    "allmessagestext": "این فهرستی از پیغام‌های سامانه‌ای موجود در فضای نام مدیاویکی است.\nچنانچه مایل به مشارکت در محلی‌سازی مدیاویکی هستید لطفاً [https://www.mediawiki.org/wiki/Localisation محلی‌سازی مدیاویکی] و [//translatewiki.net translatewiki.net] را ببینید.",
+    "allmessagestext": "این فهرستی از پیغام‌های سامانه‌ای موجود در فضای نام مدیاویکی است.\nچنانچه مایل به مشارکت در محلی‌سازی مدیاویکی هستید لطفاً [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation محلی‌سازی مدیاویکی] و [//translatewiki.net translatewiki.net] را ببینید.",
     "allmessagesnotsupportedDB": "این صفحه نمی‌تواند استفاده شود به این دلیل که <bdi>'''$wgUseDatabaseMessages'''</bdi> غیرفعال شده‌است.",
     "allmessages-filter-legend": "پالایه",
     "allmessages-filter": "پالودن بر اساس وضعیت شخصی‌سازی:",
     "importunknownsource": "نوع مأخذ درون‌ریزی معلوم نیست",
     "importcantopen": "پروندهٔ درون‌ریزی صفحه‌ها باز نشد",
     "importbadinterwiki": "پیوند میان‌ویکی نادرست",
-    "importnotext": "صفحه خالی یا بدون متن",
     "importsuccess": "درون‌ریزی با موفقیت انجام شد!",
-    "importhistoryconflict": "نسخه‌های ناسازگار از تاریخچهٔ این صفحه وجود دارد (احتمالاً این صفحه پیش از این درون‌ریزی شده است)",
     "importnosources": "هیچ منبعی برای درون‌ریزی اطلاعات از ویکی دیگر تعریف نشده‌است.",
     "importnofile": "هیچ پرونده‌ای برای درون‌ریزی بارگذاری نشده‌است.",
     "importuploaderrorsize": "در بارگذاری پروندهٔ درون‌ریزی، اشکال رخ داد.\nاندازهٔ پرونده بیشتر از حداکثر اندازهٔ مجاز است.",
     "version-entrypoints": "نشانی اینترنتی محل ورود",
     "version-entrypoints-header-entrypoint": "نقطه ورود",
     "version-entrypoints-header-url": "نشانی اینترنتی",
-    "version-entrypoints-articlepath": "[https://www.mediawiki.org/wiki/Manual:$wgArticlePath مسیر مقاله]",
-    "version-entrypoints-scriptpath": "[https://www.mediawiki.org/wiki/Manual:$wgScriptPath مسیر اسکریپت]",
+    "version-entrypoints-articlepath": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgArticlePath مسیر مقاله]",
+    "version-entrypoints-scriptpath": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgScriptPath مسیر اسکریپت]",
     "redirect": "تغییرمسیر توسط پرونده، کاربر، صفحه یا شناسهٔ نسخه",
     "redirect-legend": "تغییرمسیر به یک پرونده یا صفحه",
     "redirect-summary": "این صفحهٔ ویژه به پرونده (نام پرونده داده‌شده)، صفحه (شماره شناسهٔ صفحه یا شماره نسخهٔ داده‌شده) یا صفحهٔ کاربری (شناسهٔ عددی کاربری داده‌شده) تغییرمسیر می‌یابد. طرز استفاده: [[{{#Special:Redirect}}/file/Example.jpg]]، \n[[{{#Special:Redirect}}/page/64308]]، [[{{#Special:Redirect}}/revision/328429]] یا [[{{#Special:Redirect}}/user/101]].",
index fbecb98..d8458d4 100644 (file)
     "disclaimers": "Deentine",
     "disclaimerpage": "Project:Deentine kuuɓtidinɗe",
     "edithelp": "Ballal Taƴtagol",
-    "helppage": "Help:Loowdi",
     "mainpage": "Hello jaɓɓorgo",
     "mainpage-description": "Hello jaɓɓorgo",
     "policy-url": "Eɓɓoore:Dawirgol",
index 38dcb6c..c9ee274 100644 (file)
     "permalink": "Ikilinkki",
     "print": "Tulosta",
     "view": "Näytä",
+    "view-foreign": "Katso kohdetta $1",
     "edit": "Muokkaa",
+    "edit-local": "Muokkaa paikallista kuvausta",
     "create": "Luo sivu",
+    "create-local": "Lisää paikallinen kuvaus",
     "editthispage": "Muokkaa tätä sivua",
     "create-this-page": "Luo tämä sivu",
     "delete": "Poista",
     "pool-timeout": "Lukon aikakatkaisu.",
     "pool-queuefull": "Lukkojono on täysi.",
     "pool-errorunknown": "Tuntematon virhe.",
+    "pool-servererror": "Pool counter -palvelu ei ole käytettävissä ($1).",
     "aboutsite": "Tietoja {{GRAMMAR:elative|{{SITENAME}}}}",
     "aboutpage": "Project:Tietoja",
     "copyright": "Sisältö on käytettävissä lisenssillä $1, ellei toisin ole mainittu.",
     "accountcreatedtext": "Käyttäjätunnus [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|keskustelu]]) luotiin.",
     "createaccount-title": "Tunnuksen luominen {{GRAMMAR:illative|{{SITENAME}}}}",
     "createaccount-text": "Joku on luonut tunnuksen $2 {{GRAMMAR:illative|{{SITENAME}}}} ($4).\nTunnus on \"$2\" ja sen salasana on \"$3\". Sinun on syytä kirjautua sisään ja vaihtaa salasanasi heti.\n\nSinun ei tarvitse välittää tästä viestistä, jos tämä tunnus on luotu virheellisesti.",
-    "usernamehasherror": "Käyttäjätunnus ei voi sisältää ristikkomerkkejä (#).",
     "login-throttled": "Olet tehnyt liian monta kirjautumisyritystä.\nOdota $1 ennen kuin yrität uudelleen.",
     "login-abort-generic": "Kirjautuminen epäonnistui – keskeytetty",
     "loginlanguagelabel": "Kieli: $1",
     "content-model-javascript": "JavaScript",
     "content-model-css": "CSS",
     "expensive-parserfunction-warning": "Tällä sivulla on liian monta hitaiden laajennusfunktioiden kutsua.\nKutsuja pitäisi olla alle $2 {{PLURAL:$2|kappale|kappaletta}}, mutta nyt niitä on $1 {{PLURAL:$1|kappale|kappaletta}}.",
-    "expensive-parserfunction-category": "Liiaksi hitaita jäsentimen laajennusfunktioita käyttävät sivut",
+    "expensive-parserfunction-category": "Sivut, joissa on liian monta vaativaa jäsenninfunktiota",
     "post-expand-template-inclusion-warning": "'''Varoitus:''' Sisällytettyjen mallineiden koko on liian suuri.\nJoitakin mallineita ei ole sisällytetty.",
     "post-expand-template-inclusion-category": "Mallineiden sisällytyksen kokorajan ylittävät sivut",
     "post-expand-template-argument-warning": "'''Varoitus:''' Tällä sivulla on ainakin yksi mallineen muuttuja, jonka sisällytetty koko on liian suuri.\nNämä muuttujat on jätetty käsittelemättä.",
     "searcheverything-enable": "Hae kaikista nimiavaruuksista",
     "searchrelated": "samankaltainen",
     "searchall": "kaikki",
-    "showingresults": "{{PLURAL:$1|<strong>Yksi</strong> tulos|<strong>$1</strong> tulosta}} tuloksesta <strong>$2</strong> alkaen.",
+    "showingresults": "Alla on vain {{PLURAL:$1|<strong>1</strong> hakutulos|<strong>$1</strong> hakutulosta}} alkaen tuloksesta nro <strong>$2</strong>.",
     "showingresultsinrange": "Alla näytetään {{PLURAL:$1|<strong>1</strong> tulos|<strong>$1</strong> tulosta}} väliltä <strong>$2</strong> – <strong>$3</strong>.",
-    "showingresultsnum": "Alla on {{PLURAL:$3|'''Yksi''' hakutulos|'''$3''' hakutulosta}} alkaen '''$2.''' tuloksesta.",
+    "showingresultsnum": "Alla on {{PLURAL:$3|<strong>1</strong> hakutulos|<strong>$3</strong> hakutulosta}} alkaen tuloksesta nro <strong>$2</strong>.",
     "showingresultsheader": "{{PLURAL:$5|Tulokset '''$1'''–'''$3'''|Tulokset '''$1'''–'''$2''' kaikkiaan '''$3''' osuman joukosta}} haulle '''$4'''",
     "search-nonefound": "Hakusi ei tuottanut tulosta.",
     "powersearch-legend": "Laajennettu haku",
     "prefs-skin": "Ulkoasu",
     "skin-preview": "esikatselu",
     "datedefault": "Ei omaa määrittelyä",
-    "prefs-beta": "Beeta-ominaisuudet",
-    "prefs-datetime": "Aika ja päiväys",
     "prefs-labs": "Testattavana olevat ominaisuudet",
     "prefs-user-pages": "Käyttäjäsivut",
     "prefs-personal": "Käyttäjätiedot",
     "upload-permitted": "Sallitut tiedostomuodot: $1.",
     "upload-preferred": "Suositellut tiedostomuodot: $1.",
     "upload-prohibited": "Kielletyt tiedostomuodot: $1.",
-    "uploadlog": "Tiedostoloki",
     "uploadlogpage": "Tiedostoloki",
     "uploadlogpagetext": "Alla on luettelo uusimmista tiedostonlisäyksistä. Kaikki ajat näytetään palvelimen aikavyöhykkeessä.",
     "filename": "Tiedoston nimi:",
     "filereuploadsummary": "Muutokset",
     "filestatus": "Tiedoston tekijänoikeudet",
     "filesource": "Lähde",
-    "uploadedfiles": "Lisätyt tiedostot",
     "ignorewarning": "Tallenna tiedosto varoituksesta huolimatta.",
     "ignorewarnings": "Ohita kaikki varoitukset",
     "minlength1": "Tiedoston nimessä pitää olla vähintään yksi merkki.",
     "overwroteimage": "tallensi uuden version [[$1]]",
     "uploaddisabled": "Tiedostojen tallennus ei ole käytössä.",
     "copyuploaddisabled": "Tallennus URL:n kautta on poistettu käytöstä.",
-    "uploadfromurl-queued": "Tallennuksesi on siirretty jonoon.",
     "uploaddisabledtext": "Tiedostojen tallennus on poistettu käytöstä.",
     "php-uploaddisabledtext": "PHP:n tiedostojen lähetys ei ole käytössä. Tarkista asetukset kohdasta file_uploads.",
     "uploadscripted": "Tämä tiedosto sisältää HTML-koodia tai skriptejä, jotka selain saattaa virheellisesti suorittaa.",
     "upload-misc-error": "Virhe",
     "upload-misc-error-text": "Tiedoston etälähetys ei onnistunut. Varmista, että antamasi osoite on oikein ja toimiva. Jos virhe ei katoa, ota yhteyttä sivuston [[Special:ListUsers/sysop|ylläpitäjään]].",
     "upload-too-many-redirects": "URL sisälsi liian monta ohjausta",
-    "upload-unknown-size": "Tuntematon koko",
     "upload-http-error": "HTTP-virhe: $1",
     "upload-copy-upload-invalid-domain": "Tiedostojen tallentamista tästä verkko-osoitteesta ei ole sallittu.",
     "backend-fail-stream": "Tiedoston $1 virtauttaminen epäonnistui.",
     "img-auth-streaming": "Toistetaan tiedostoa ”$1”.",
     "img-auth-public": "Img_auth.php:n tarkoitus on näyttää tiedostoja yksityisessä wikissä.\nTämä wiki on asennettu julkiseksi wikiksi.\nParhaan turvallisuuden vuoksi img_auth.php on poissa käytöstä.",
     "img-auth-noread": "Käyttäjillä ei ole oikeutta lukea tiedostoa ”$1”.",
-    "img-auth-bad-query-string": "Osoitteessa on epäkelpo query string -määritys.",
     "http-invalid-url": "Kelpaamaton URL: $1",
     "http-invalid-scheme": "Verkko-osoitteita kaavalla \"$1\" ei tueta",
     "http-request-error": "HTTP-pyyntö epäonnistui tuntemattoman virheen takia.",
     "filehist-dimensions": "Koko",
     "filehist-filesize": "Tiedostokoko",
     "filehist-comment": "Kommentti",
-    "filehist-missing": "Tiedosto puuttuu",
     "imagelinks": "Tiedoston käyttö",
     "linkstoimage": "{{PLURAL:$1|Seuraavalta sivulta|$1 sivulla}} on linkki tähän tiedostoon:",
     "linkstoimage-more": "Enemmän kuin $1 {{PLURAL:$1|sivu|sivua}} linkittää tähän tiedostoon.\nSeuraava lista näyttää {{PLURAL:$1|ensimmäisen linkittävän sivun|$1 ensimmäistä linkittävää sivua}} tähän tiedostoon.\n[[Special:WhatLinksHere/$2|Koko lista]] on saatavilla.",
     "download": "lataa",
     "unwatchedpages": "Tarkkailemattomat sivut",
     "listredirects": "Ohjaukset",
-    "listduplicatedfiles": "Luettelo tiedostoista, joista on kaksoiskappale.",
+    "listduplicatedfiles": "Luettelo tiedostoista, joista on kaksoiskappale",
     "listduplicatedfiles-summary": "Tämä on luettelo niistä tiedostoista, joiden uusin versio on kaksoiskappale eli täysin sama jonkun toisen tiedoston uusimman version kanssa. Vain paikallisesti tallennetut tiedostot tutkitaan.",
     "listduplicatedfiles-entry": "Tiedostosta [[:File:$1|$1]] on olemassa [[$3|{{PLURAL:$2|kaksoiskappale|$2 kaksoiskappaletta}}]].",
     "unusedtemplates": "Käyttämättömät mallineet",
     "listgrouprights-removegroup-self": "Voi poistaa itsensä {{PLURAL:$2|ryhmästä|ryhmistä}} $1",
     "listgrouprights-addgroup-self-all": "Voi lisätä itsensä kaikkiin ryhmiin",
     "listgrouprights-removegroup-self-all": "Voi poistaa itsensä kaikista ryhmistä",
+    "listgrouprights-namespaceprotection-header": "Nimiavaruuksien rajoitukset",
+    "listgrouprights-namespaceprotection-namespace": "Nimiavaruus",
+    "listgrouprights-namespaceprotection-restrictedto": "Käyttäjän muokkausoikeudet",
+    "trackingcategories": "Tarkkailuluokat",
+    "trackingcategories-summary": "Tällä sivulla on luettelo sellaisista ongelmia havaitsevista luokista (tarkkailuluokat), joiden sisällön koostaa automaattisesti MediaWiki-ohjelmisto. Luokkien nimiä voi vaihtaa muuttamalla asianomaista järjestelmäviestiä nimiavaruudessa {{ns:8}}.",
+    "trackingcategories-msg": "Tarkkailuluokka",
+    "trackingcategories-name": "Viestin nimi",
+    "trackingcategories-desc": "Kriteerit luokkaan joutumiselle",
+    "noindex-category-desc": "Tätä sivua eivät hakurobotit indeksoi, koska sivulla on taikasana <code><nowiki>__NOINDEX__</nowiki></code> ja koska sivu on sellaisessa nimiavaruudessa, jossa taikasanan käyttö on sallittua.",
+    "index-category-desc": "Tällä sivulla on koodi <code><nowiki>__INDEX__</nowiki></code> ja sivu on sellaisessa nimiavaruudessa, jossa koodin käyttö on sallittua. Tämän vuoksi hakurobotit indeksoivat tämän sivun, vaikka ilman koodia sivua ei indeksoitaisi normaalisti.",
+    "post-expand-template-inclusion-category-desc": "Jos kaikki mallineet laajennetaan, sivun koko on suurempi kuin <code>$wgMaxArticleSize</code>. Tämän vuoksi kaikkia mallineita ei laajennettu.",
+    "post-expand-template-argument-category-desc": "Kun mallineen argumentti on laajennettu (argumentti on merkkijono kolmen kaarisulun sisällä kuten <code>{{{Foo}}}</code>), sivu on suurempi kuin <code>$wgMaxArticleSize</code>.",
+    "expensive-parserfunction-category-desc": "Liian monta resursseja vaativaa jäsenninfunktiota (esimerkiksi <code>#ifexist</code>) on sisällytetty sivulle. Katso [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit Manual:$wgExpensiveParserFunctionLimit].",
+    "broken-file-category-desc": "Tämä luokka sisältää ne sivut, joissa on rikkinäinen tiedostolinkki. Tällä tarkoitetaan linkkiä sellaiseen tiedostoon, jota ei olemassa.",
+    "hidden-category-category-desc": "Tämä on luokka, joka sisältää koodin <code><nowiki>__HIDDENCAT__</nowiki></code>. Koodi estää luokan näkymisen sivujen alareunassa olevassa luokkien laatikossa oletusarvoisesti.",
+    "trackingcategories-nodesc": "Ei kuvausta olemassa.",
+    "trackingcategories-disabled": "Luokka on poistettu käytöstä",
     "mailnologin": "Lähettäjän osoite puuttuu",
     "mailnologintext": "Sinun pitää olla [[Special:UserLogin|kirjautuneena sisään]] ja [[Special:Preferences|asetuksissasi]] pitää olla toimiva ja <strong>varmennettu</strong> sähköpostiosoite, jotta voit lähettää sähköpostia muille käyttäjille.",
     "emailuser": "Lähetä sähköpostia tälle käyttäjälle",
     "emailuser-title-notarget": "Lähetä sähköpostia käyttäjälle",
     "emailpage": "Lähetä sähköpostia käyttäjälle",
     "emailpagetext": "Jos tämä {{GENDER:$1|käyttäjä}} on antanut asetuksissaan kelvollisen sähköpostiosoitteen, alla olevalla lomakkeella voit lähettää hänelle viestin. [[Special:Preferences|Omissa asetuksissasi]] annettu sähköpostiosoite näkyy sähköpostin lähettäjän osoitteena, jotta vastaanottaja voi suoraan vastata viestiin.",
-    "usermailererror": "Postitus palautti virheen:",
     "defemailsubject": "Sähköpostia käyttäjältä $1 sivustolta {{SITENAME}}",
     "usermaildisabled": "Käyttäjien sähköposti poistettu käytöstä",
     "usermaildisabledtext": "Et voi lähettää sähköpostia muille käyttäjille tässä wikissä",
     "noemailtitle": "Ei sähköpostiosoitetta",
     "noemailtext": "Tämä käyttäjä ei ole määritellyt kelvollista sähköpostiosoitetta.",
-    "nowikiemailtitle": "Sähköpostin lähettäminen ei sallittu",
     "nowikiemailtext": "Tämä käyttäjä ei halua sähköpostia muilta käyttäjiltä.",
     "emailnotarget": "Vastaanottajan käyttäjänimeä ei ole tai se on väärä.",
     "emailtarget": "Vastaanottajan käyttäjätunnus",
     "nowatchlist": "Tarkkailulistallasi ei ole sivuja.",
     "watchlistanontext": "Sinun täytyy $1, jos haluat käyttää tarkkailulistaa.",
     "watchnologin": "Et ole kirjautunut sisään",
-    "watchnologintext": "Sinun pitää [[Special:UserLogin|kirjautua sisään]], jotta voisit käyttää tarkkailulistaasi.",
     "addwatch": "Lisää tarkkailulistalle",
     "addedwatchtext": "Sivu '''[[:$1]]''' on lisätty [[Special:Watchlist|tarkkailulistallesi]].\nTulevaisuudessa sivuun ja sen keskustelusivuun tehtävät muutokset listataan täällä.",
     "removewatch": "Poista tarkkailulistalta",
     "unwatchthispage": "Lopeta tarkkailu",
     "notanarticle": "Ei ole sivu",
     "notvisiblerev": "Versio on poistettu",
-    "watchlist-details": "Tarkkailulistalla on {{PLURAL:$1|$1 sivu|$1 sivua}} keskustelusivuja mukaan laskematta.",
+    "watchlist-details": "Tarkkailulistallasi on {{PLURAL:$1|$1 sivu|$1 sivua}}. Keskustelusivuja ei lasketa mukaan.",
     "wlheader-enotif": "Sähköposti-ilmoitus on käytössä.",
     "wlheader-showupdated": "Sivut, joita on muokattu viimeisen käyntisi jälkeen, on '''lihavoitu'''.",
     "watchmethod-recent": "tarkistetaan tuoreimpia muutoksia tarkkailluille sivuille",
     "watching": "Lisätään tarkkailulistalle...",
     "unwatching": "Poistetaan tarkkailulistalta...",
     "watcherrortext": "Sivun ”$1” tarkkailulista-asetusten muutoksissa tapahtui virhe.",
-    "enotif_mailer": "{{GRAMMAR:genitive|{{SITENAME}}}} sivu on muuttunut -ilmoitus",
     "enotif_reset": "Merkitse kaikki sivut nähdyiksi",
     "enotif_impersonal_salutation": "{{GRAMMAR:genitive|{{SITENAME}}}} käyttäjä",
     "enotif_subject_deleted": "{{GENDER:$2|$2}} poisti {{GRAMMAR:elative|{{SITENAME}}}} sivun $1",
     "excontent": "sisälsi: ”$1”",
     "excontentauthor": "sisälsi: ”$1” (ainoa muokkaaja oli $2)",
     "exbeforeblank": "ennen tyhjentämistä sisälsi: ”$1”",
-    "exblank": "oli tyhjä",
     "delete-confirm": "Poista ”$1”",
     "delete-legend": "Sivun poisto",
     "historywarning": "'''Varoitus:''' Sivua, jota olet poistamassa, on muokattu noin $1 {{PLURAL:$1|kerta|kertaa}}:",
     "rollbacklinkcount-morethan": "palauta yli $1 {{PLURAL:$1|muutos|muutosta}}",
     "rollbackfailed": "Palautus epäonnistui",
     "cantrollback": "Aiempaan versioon ei voi palauttaa, koska viimeisin kirjoittaja on sivun ainoa tekijä.",
-    "alreadyrolled": "Käyttäjän [[User:$2|$2]] ([[User talk:$2|keskustelu]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]) tekemiä muutoksia sivuun [[:$1]] ei voi kumota, koska joku muu on muuttanut sivua.\n\nViimeisimmän muokkauksen on tehnyt käyttäjä [[User:$3|$3]] ([[User talk:$3|keskustelu]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
+    "alreadyrolled": "Käyttäjän [[User:$2|$2]] ([[User talk:$2|keskustelu]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]) tekemiä muutoksia sivuun [[:$1]] ei voida kumota, koska joku toinen käyttäjä on joko muuttanut sivua tai palauttanut muokkauksen.\n\nViimeisimmän muokkauksen on tehnyt käyttäjä [[User:$3|$3]] ([[User talk:$3|keskustelu]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
     "editcomment": "Muokkauksen yhteenveto oli: ''$1''.",
     "revertpage": "Käyttäjän [[Special:Contributions/$2|$2]] ([[User talk:$2|keskustelu]]) muokkaukset kumottiin ja sivu palautettiin viimeisimpään käyttäjän [[User:$1|$1]] tekemään versioon.",
     "revertpage-nouser": "Käyttäjän (käyttäjänimi poistettu) muokkaukset kumottiin ja sivu palautettiin viimeisimpään käyttäjän {{GENDER:$1|[[User:$1|$1]]}} tekemään versioon",
     "contributions-title": "Käyttäjän $1 muokkaukset",
     "mycontris": "Omat muokkaukset",
     "contribsub2": "Käyttäjän {{GENDER:$3|$1}} ($2) muokkaukset",
+    "contributions-userdoesnotexist": "Käyttäjätunnusta ”$1” ei ole rekisteröity.",
     "nocontribs": "Näihin ehtoihin sopivia muokkauksia ei löytynyt.",
     "uctop": "(uusin)",
     "month": "Kuukausi",
     "sp-contributions-newbies-sub": "Uusien käyttäjien muokkaukset",
     "sp-contributions-newbies-title": "Uusien käyttäjien muokkaukset",
     "sp-contributions-blocklog": "estoloki",
+    "sp-contributions-suppresslog": "häivytetyt käyttäjän muokkaukset",
     "sp-contributions-deleted": "poistetut muokkaukset",
     "sp-contributions-uploads": "tallennukset",
     "sp-contributions-logs": "lokit",
     "sp-contributions-blocked-notice": "Tämä käyttäjä on tällä hetkellä estetty. Alla on viimeisin estolokin tapahtuma:",
     "sp-contributions-blocked-notice-anon": "Tämä IP-osoite on tällä hetkellä estetty.\nAlla on viimeisin estolokin tapahtuma:",
     "sp-contributions-search": "Etsi muokkauksia",
-    "sp-contributions-suppresslog": "häivytetyt käyttäjän muokkaukset",
     "sp-contributions-username": "IP-osoite tai käyttäjätunnus",
     "sp-contributions-toponly": "Näytä vain muokkaukset, jotka ovat viimeisimpiä versioita",
     "sp-contributions-newonly": "Näytä vain muokkaukset, joilla on luotu sivu",
     "allmessagesname": "Nimi",
     "allmessagesdefault": "Oletusarvo",
     "allmessagescurrent": "Nykyinen arvo",
-    "allmessagestext": "Tämä on luettelo järjestelmäviesteistä, jotka ovat saatavilla MediaWiki-nimiavaruudessa.\nJos haluat muokata MediaWikin yleistä kotoistusta, käy [https://www.mediawiki.org/wiki/Localisation MediaWikin kotoistussivuilla] ja sivustolla [//translatewiki.net translatewiki.net].",
+    "allmessagestext": "Tämä on luettelo järjestelmäviesteistä, jotka ovat saatavilla MediaWiki-nimiavaruudessa.\nJos haluat muokata MediaWikin yleistä kotoistusta, käy [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation MediaWikin kotoistussivuilla] ja sivustolla [//translatewiki.net translatewiki.net].",
     "allmessagesnotsupportedDB": "Tämä sivu ei ole käytössä, koska <tt>$wgUseDatabaseMessages</tt>-asetus on pois päältä.",
     "allmessages-filter-legend": "Suodata",
     "allmessages-filter": "Suodata muutosten perusteella",
     "importunknownsource": "Tuntematon lähdetyyppi",
     "importcantopen": "Tuontitiedoston avaus epäonnistui",
     "importbadinterwiki": "Kelpaamaton wikienvälinen linkki",
-    "importnotext": "Tyhjä tai ei tekstiä",
     "importsuccess": "Tuonti onnistui!",
-    "importhistoryconflict": "Sivusta on olemassa tuonnin kanssa ristiriitainen muokkausversio. Tämä sivu on saatettu tuoda jo aikaisemmin.",
     "importnosources": "Wikienvälisiä tuontilähteitä ei ole määritelty ja suorat historiatallennukset on poistettu käytöstä.",
     "importnofile": "Mitään tuotavaa tiedostoa ei lähetetty.",
     "importuploaderrorsize": "Tuontitiedoston tallennus epäonnistui. Tiedosto on suurempi kuin sallittu yläraja.",
     "expand_templates_remove_nowiki": "Poista <nowiki>-tagit tulosteesta",
     "expand_templates_generate_xml": "Näytä XML-jäsennyspuu",
     "expand_templates_generate_rawhtml": "Näytä raaka HTML",
-    "expand_templates_preview": "Esikatselu",
-    "trackingcategories": "Tarkkailuluokat",
-    "trackingcategories-summary": "Tällä sivulla on luettelo sellaisista jälkiä seuraavista luokista (tarkkailuluokat), joiden sisällön synnyttää automaattisesti MediaWiki-ohjelmisto. Luokkien nimiä voi vaihtaa muuttamalla asianomaista järjestelmäviestiä nimiavaruudessa {{ns:8}}.",
-    "trackingcategories-msg": "Tarkkailuluokka",
-    "trackingcategories-name": "Viestin nimi",
-    "trackingcategories-desc": "Kriteerit luokkaan joutumiselle",
-    "trackingcategories-nodesc": "Ei kuvausta olemassa.",
-    "trackingcategories-disabled": "Luokka on poistettu käytöstä"
+    "expand_templates_preview": "Esikatselu"
 }
index e1ed5b8..06493a4 100644 (file)
     "disclaimers": "Vastuuvaphaus",
     "disclaimerpage": "Project: Ylheinen varoitus",
     "edithelp": "Mookkausapua",
-    "helppage": "Help: Sisältö",
     "mainpage": "Alkusivu",
     "mainpage-description": "Alkusivu",
     "portal": "Kaikitten purthaali",
index ce7a865..bb14ba2 100644 (file)
     "prefs-skin": "Hamur",
     "skin-preview": "Forskoðan",
     "datedefault": "Ongi serlig ynskir",
-    "prefs-beta": "Betafunktiónir",
     "prefs-datetime": "Dato og tíð",
     "prefs-labs": "Testfunktiónir",
     "prefs-user-pages": "Brúkarasíður",
     "nowatchlist": "Tú hevur ongar lutir í eftirlitinum.",
     "watchlistanontext": "Vinarliga $1 fyri at síggja ella rætta lutir í tínum eftirlitslista.",
     "watchnologin": "Tú hevur ikki ritað inn",
-    "watchnologintext": "Tú mást vera [[Special:UserLogin|innritað/ur]] fyri at broyta tín eftirlitslista.",
     "addwatch": "Legg til eftirlitslista",
     "addedwatchtext": "Síðan  \"[[:$1]]\" er løgd undir [[Special:Watchlist|eftirlitslistan]] hjá tær.\nFramtíðar broytingar á hesi síðu og tilknýttu kjaksíðuni verða at síggja har.",
     "removewatch": "Tak burtur frá eftirlistslistanum",
     "allmessagesname": "Navn",
     "allmessagesdefault": "Enskur tekstur",
     "allmessagescurrent": "Verandi tekstur",
-    "allmessagestext": "Hetta er eitt yvirlit av tøkum kervisboðum í MediaWiki-navnarúmi.\nVinarliga vitja [https://www.mediawiki.org/wiki/Localisation MediaWiki Localisation] og [//translatewiki.net translatewiki.net] um tú ynskir at geva títt íkast til ta generisku MediaWiki lokalisatiónina.",
+    "allmessagestext": "Hetta er eitt yvirlit av tøkum kervisboðum í MediaWiki-navnarúmi.\nVinarliga vitja [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation MediaWiki Localisation] og [//translatewiki.net translatewiki.net] um tú ynskir at geva títt íkast til ta generisku MediaWiki lokalisatiónina.",
     "allmessagesnotsupportedDB": "'''{{ns:special}}:AllMessages''' er ikki stuðlað orsakað av at '''$wgUseDatabaseMessages''' er sløkt.",
     "allmessages-filter-legend": "Filtur",
     "allmessages-filter-unmodified": "Óbroytt",
index d66dbf7..3986791 100644 (file)
     "permalink": "Adresse de cette version",
     "print": "Imprimer",
     "view": "Lire",
+    "view-foreign": "Voir sur $1",
     "edit": "Modifier",
+    "edit-local": "Modifier la description locale",
     "create": "Créer",
+    "create-local": "ajouter une description locale",
     "editthispage": "Modifier cette page",
     "create-this-page": "Créer cette page",
     "delete": "Supprimer",
     "pool-timeout": "Délai d'attente dépassé",
     "pool-queuefull": "La file d'attente est pleine",
     "pool-errorunknown": "Erreur inconnue",
+    "pool-servererror": "Le service de comptage de la réserve n’est pas disponible ($1).",
     "aboutsite": "À propos de {{SITENAME}}",
     "aboutpage": "Project:À propos",
     "copyright": "Le contenu est disponible sous licence $1 sauf mention contraire.",
     "accountcreatedtext": "Le compte utilisateur pour [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|discussion]]) a été créé.",
     "createaccount-title": "Création d’un compte pour {{SITENAME}}",
     "createaccount-text": "Quelqu’un a créé un compte pour votre adresse de courriel sur {{SITENAME}} ($4) intitulé « $2 », avec le mot de passe « $3 ».\nVous devriez ouvrir une session et modifier dès à présent votre mot de passe.\n\nIgnorez ce message si ce compte a été créé par erreur.",
-    "usernamehasherror": "Le nom d'utilisateur ne peut pas contenir des caractères de hachage",
     "login-throttled": "Vous avez tenté un trop grand nombre de connexions dernièrement.\nVeuillez attendre $1 avant d'essayer à nouveau.",
     "login-abort-generic": "Votre tentative de connexion a échoué",
     "loginlanguagelabel": "Langue : $1",
     "prefs-skin": "Habillage",
     "skin-preview": "Prévisualiser",
     "datedefault": "Aucune préférence",
-    "prefs-beta": "Fonctionnalités bêta",
-    "prefs-datetime": "Date et heure",
     "prefs-labs": "Fonctionnalités « labs »",
     "prefs-user-pages": "Pages utilisateur",
     "prefs-personal": "Informations personnelles",
     "upload-permitted": "Formats de fichiers autorisés : $1.",
     "upload-preferred": "Formats de fichiers préférés : $1.",
     "upload-prohibited": "Formats de fichiers interdits : $1.",
-    "uploadlog": "Journal d’import de fichiers",
     "uploadlogpage": "Journal d’import de fichiers",
     "uploadlogpagetext": "Voici la liste des derniers fichiers importés sur le serveur.\nVoyez la [[Special:NewFiles|galerie des nouvelles images]] pour une présentation plus visuelle.",
     "filename": "Nom du fichier",
     "filereuploadsummary": "Modifications du fichier :",
     "filestatus": "Statut du droit d'auteur :",
     "filesource": "Source :",
-    "uploadedfiles": "Fichiers importés",
     "ignorewarning": "Ignorer l'avertissement et sauvegarder le fichier quand même",
     "ignorewarnings": "Ignorer les avertissements",
     "minlength1": "Le noms de fichiers doivent comprendre au moins une lettre.",
     "overwroteimage": "a importé une nouvelle version de « [[$1]] »",
     "uploaddisabled": "Désolé, l’import de fichiers est désactivé.",
     "copyuploaddisabled": "Import de fichier par URL désactivé.",
-    "uploadfromurl-queued": "Votre fichier a été mis dans la file d’attente.",
     "uploaddisabledtext": "L’import de fichiers est désactivé sur ce wiki.",
     "php-uploaddisabledtext": "L'import de fichiers a été désactivé dans PHP. Vérifiez l'option de configuration file_uploads.",
     "uploadscripted": "Ce fichier contient du code HTML ou un script qui pourrait être interprété de façon incorrecte par un navigateur web.",
     "upload-misc-error": "Erreur d’import inconnue",
     "upload-misc-error-text": "Une erreur inconnue est survenue pendant l’import.\nVeuillez vérifier que l’URL est valide et accessible, puis essayer à nouveau.\nSi le problème persiste, contactez un [[Special:ListUsers/sysop|administrateur]].",
     "upload-too-many-redirects": "L’URL contient trop de redirections.",
-    "upload-unknown-size": "Taille inconnue",
     "upload-http-error": "Une erreur HTTP est survenue : $1",
     "upload-copy-upload-invalid-domain": "La copie des téléversements n’est pas disponible depuis ce domaine.",
     "backend-fail-stream": "Impossible de lire le fichier $1.",
     "img-auth-streaming": "Lecture en continu de « $1 ».",
     "img-auth-public": "La fonction de img_auth.php est d'afficher des fichiers d'un wiki privé.\nCe wiki est configuré comme un wiki public.\nPour une sécurité optimale, img_auth.php est désactivé.",
     "img-auth-noread": "L'utilisateur n'a pas le droit en lecture sur « $1 ».",
-    "img-auth-bad-query-string": "L'URL a une chaîne de requête invalide.",
     "http-invalid-url": "URL incorrecte : $1",
     "http-invalid-scheme": "Les URL avec le schéma « $1 » ne sont pas prises en charge.",
     "http-request-error": "Erreur inconnue lors de l'envoi de la requête.",
     "filehist-dimensions": "Dimensions",
     "filehist-filesize": "Taille du fichier",
     "filehist-comment": "Commentaire",
-    "filehist-missing": "Fichier manquant",
     "imagelinks": "Utilisation du fichier",
     "linkstoimage": "{{PLURAL:$1|La page suivante utilise|Les $1 pages suivantes utilisent}} ce fichier :",
     "linkstoimage-more": "Plus {{PLURAL:$1|d'une page utilise|de $1 pages utilisent}} ce fichier.\nLa liste suivante affiche seulement {{PLURAL:$1|la première page qui utilise|les $1 premières pages qui utilisent}} ce fichier.\nUne [[Special:WhatLinksHere/$2|liste complète]] est disponible.",
     "listgrouprights-removegroup-self": "Peut se retirer {{PLURAL:$2|le groupe|les groupes}} de son propre compte : $1",
     "listgrouprights-addgroup-self-all": "Peut s'ajouter tous les groupes à son propre compte",
     "listgrouprights-removegroup-self-all": "Peut se retirer tous les groupes de son propre compte",
+    "listgrouprights-namespaceprotection-header": "Restrictions d'espace de noms",
+    "listgrouprights-namespaceprotection-namespace": "Espace de noms",
+    "listgrouprights-namespaceprotection-restrictedto": "Droit(s) permettant à l'utilisateur de modifier",
+    "trackingcategories": "Catégories de suivi",
+    "trackingcategories-summary": "Cette page liste les catégories de suivi qui sont remplies automatiquement par [[MediaWiki]]. Leurs noms peuvent être changés en modifiant les messages systèmes correspondants dans l’espace de noms {{ns:8}}.",
+    "trackingcategories-msg": "Catégorie de suivi",
+    "trackingcategories-name": "Nom du message",
+    "trackingcategories-desc": "Critère d’inclusion de la catégorie",
+    "noindex-category-desc": "La page contient <code><nowiki>__NOINDEX__</nowiki></code> et est dans un espace de noms où ce marquage est autorisé ; elle ne sera donc pas indexée par les robots.",
+    "index-category-desc": "La page contient <code><nowiki>__INDEX__</nowiki></code> et est dans un espace de noms où ce marquage est autorisé ; elle sera donc indexée par les robots alors qu’elle ne l’aurait pas été normalement.",
+    "post-expand-template-inclusion-category-desc": "Après avoir développé tous les modèles, la taille de la page dépasse <code>$wgMaxArticleSize</code> ; certains modèles n’ont donc pas été développés.",
+    "post-expand-template-argument-category-desc": "Après avoir développé l’argument d’un modèle (quelque chose entre accolades triples, comme <code>{{{Foo}}}</code>), la page dépasse <code>$wgMaxArticleSize</code>.",
+    "expensive-parserfunction-category-desc": "Trop de fonctions coûteuses de l’analyseur (comme <code>#ifexist</code>) sont incluses dans une page. Voyez [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit Manual:$wgExpensiveParserFunctionLimit].",
+    "broken-file-category-desc": "La catégorie ajoutée sur la page contient un lien de fichier incorrect (un lien pour inclure un fichier alors que celui-ci n’existe pas).",
+    "hidden-category-category-desc": "Catégorie contenant <code><nowiki>__HIDDENCAT__</nowiki></code>, ce qui empêche son affichage dans la zone des liens de catégorie sur les pages, par défaut.",
+    "trackingcategories-nodesc": "Aucune description disponible.",
+    "trackingcategories-disabled": "La catégorie est désactivée",
     "mailnologin": "Pas d'adresse d'expéditeur",
     "mailnologintext": "Vous devez être [[Special:UserLogin|identifié]] et avoir indiqué une adresse électronique valide dans vos [[Special:Preferences|préférences]] pour pouvoir envoyer des courriels à d'autres utilisateurs.",
     "emailuser": "Lui envoyer un courriel",
     "emailuser-title-notarget": "Envoyer un courriel à l'utilisateur",
     "emailpage": "Envoyer un courriel à l'utilisateur",
     "emailpagetext": "Vous pouvez utiliser le formulaire ci-dessous pour envoyer un courriel à {{GENDER:$1|cet utilisateur|cette utilisatrice}}.\nL'adresse électronique que vous avez indiquée dans [[Special:Preferences|vos préférences]] apparaîtra dans le champ « Expéditeur » de votre message ; ainsi, le destinataire pourra vous répondre directement.",
-    "usermailererror": "Erreur dans l'objet du courriel :",
     "defemailsubject": "{{SITENAME}} Courriel de l'utilisateur « $1 »",
     "usermaildisabled": "L'envoi de courriels entre utilisateurs est désactivé",
     "usermaildisabledtext": "Vous ne pouvez pas envoyer de courriels à d'autres utilisateurs sur ce wiki",
     "noemailtitle": "Aucune adresse de courriel",
     "noemailtext": "Cet utilisateur n'a pas spécifié une adresse de courriel valide.",
-    "nowikiemailtitle": "Pas de courriel autorisé",
     "nowikiemailtext": "Cet utilisateur a choisi de ne pas recevoir de courriel de la part d'autres utilisateurs.",
     "emailnotarget": "Nom d'utilisateur du destinataire inexistant ou invalide.",
     "emailtarget": "Entrez le nom d'utilisateur du destinataire",
     "nowatchlist": "Votre liste de suivi ne référence aucune page.",
     "watchlistanontext": "Veuillez vous $1 pour visualiser ou modifier les éléments de votre liste de suivi.",
     "watchnologin": "Non connecté",
-    "watchnologintext": "Vous devez être [[Special:UserLogin|identifié]] pour modifier votre liste de suivi.",
     "addwatch": "Ajouter à la liste de suivi",
     "addedwatchtext": "La page « [[:$1]] » a été ajoutée à votre [[Special:Watchlist|liste de suivi]].\nLes prochaines modifications de cette page et de la page de discussion associée y seront répertoriées.",
     "removewatch": "Supprimer de la liste de suivi",
     "unwatchthispage": "Ne plus suivre",
     "notanarticle": "Ce n'est pas une page de contenu",
     "notvisiblerev": "La version a été supprimée",
-    "watchlist-details": "Votre liste de suivi référence $1 page{{PLURAL:$1||s}}, sans compter les pages de discussion.",
+    "watchlist-details": "{{PLURAL:$1|$1 page|$1 pages}} dans votre liste de suivi, sans compter les pages de discussion.",
     "wlheader-enotif": "La notification par courriel est activée.",
     "wlheader-showupdated": "Les pages qui ont été modifiées depuis votre dernière visite sont affichées en '''gras'''.",
     "watchmethod-recent": "vérification des modifications récentes pour y trouver des pages suivies",
     "watching": "Suivi…",
     "unwatching": "Fin du suivi…",
     "watcherrortext": "Une erreur s'est produite lors de la modification des paramètres de votre liste de suivi pour « $1 ».",
-    "enotif_mailer": "Système de notification par courriel de {{SITENAME}}",
     "enotif_reset": "Marquer toutes les pages comme visitées",
     "enotif_impersonal_salutation": "Utilisateur de {{SITENAME}}",
     "enotif_subject_deleted": "La page $1 sur {{SITENAME}} a été supprimée par {{GENDER:$2|$2}}",
     "excontent": "contenait « $1 »",
     "excontentauthor": "contenait « $1 » (et son seul contributeur était [[Special:Contributions/$2|$2]])",
     "exbeforeblank": "contenait avant blanchiment « $1 »",
-    "exblank": "la page était vide",
     "delete-confirm": "Supprimer « $1 »",
     "delete-legend": "Supprimer",
     "historywarning": "'''Attention :''' la page que vous êtes sur le point de supprimer a un historique avec environ $1 {{PLURAL:$1|version|versions}} :",
     "contributions-title": "Liste des contributions de l’utilisat{{GENDER:$1|eur|rice|eur}} $1",
     "mycontris": "Contributions",
     "contribsub2": "Pour {{GENDER:$3|$1}} ($2)",
+    "contributions-userdoesnotexist": "Le compte utilisateur « $1 » n’est pas enregistré.",
     "nocontribs": "Aucune modification correspondant à ces critères n'a été trouvée.",
     "uctop": "(actuel)",
     "month": "À partir du mois (et précédents) :",
     "sp-contributions-newbies-sub": "Parmi les nouveaux comptes",
     "sp-contributions-newbies-title": "Contributions d'utilisateurs parmi les nouveaux comptes",
     "sp-contributions-blocklog": "journal des blocages",
+    "sp-contributions-suppresslog": "contributions masquées",
     "sp-contributions-deleted": "contributions supprimées",
     "sp-contributions-uploads": "imports",
     "sp-contributions-logs": "journaux",
     "sp-contributions-blocked-notice": "Cet utilisateur est actuellement bloqué. La dernière entrée du journal des blocages est indiquée ci-dessous à titre d'information :",
     "sp-contributions-blocked-notice-anon": "Cette adresse IP est actuellement bloquée.\nLa dernière entrée du journal des blocages est indiquée ci-dessous à titre d'information :",
     "sp-contributions-search": "Rechercher les contributions",
-    "sp-contributions-suppresslog": "contributions masquées",
     "sp-contributions-username": "Adresse IP ou nom d'utilisateur :",
     "sp-contributions-toponly": "Ne montrer que les contributions qui sont les dernières des articles",
     "sp-contributions-newonly": "Afficher uniquement les modifications qui sont des créations de page",
     "allmessagesname": "Nom du message",
     "allmessagesdefault": "Message par défaut",
     "allmessagescurrent": "Message actuel",
-    "allmessagestext": "Ceci est la liste des messages disponibles dans l’espace MediaWiki.\nVeuillez visiter la [https://www.mediawiki.org/wiki/Localisation Localisation de MediaWiki] et [//translatewiki.net/ translatewiki.net] si vous désirez contribuer à la localisation générique de MediaWiki.",
+    "allmessagestext": "Ceci est la liste des messages disponibles dans l’espace MediaWiki.\nVeuillez visiter la [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation Localisation de MediaWiki] et [//translatewiki.net/ translatewiki.net] si vous désirez contribuer à la localisation générique de MediaWiki.",
     "allmessagesnotsupportedDB": "Cette page '''{{ns:special}}:Allmessages''' n'est pas utilisable car '''$wgUseDatabaseMessages''' a été désactivé.",
     "allmessages-filter-legend": "Filtrer",
     "allmessages-filter": "Filtrer par état de modification :",
     "importunknownsource": "Type inconnu de la source à importer",
     "importcantopen": "Impossible d'ouvrir le fichier à importer",
     "importbadinterwiki": "Mauvais lien inter-wiki",
-    "importnotext": "Vide ou sans texte",
     "importsuccess": "L'importation a réussi !",
-    "importhistoryconflict": "Un conflit a été détecté dans l'historique des versions (cette page a pu être importée auparavant).",
     "importnosources": "Aucune source d'importation inter-wiki n'a été définie et l'import direct d'historiques est désactivé.",
     "importnofile": "Aucun fichier d'importation n'a été envoyé.",
     "importuploaderrorsize": "L'import du fichier a échoué.\nSa taille est supérieure au maximum autorisé pour l'import de fichier.",
     "version-entrypoints": "URL des points d'entrée",
     "version-entrypoints-header-entrypoint": "Point d'entrée",
     "version-entrypoints-header-url": "URL",
-    "version-entrypoints-articlepath": "[https://www.mediawiki.org/wiki/Manual:$wgArticlePath Chemin d’article]",
-    "version-entrypoints-scriptpath": "[https://www.mediawiki.org/wiki/Manual:$wgScriptPath Chemin de script]",
+    "version-entrypoints-articlepath": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgArticlePath Chemin d’article]",
+    "version-entrypoints-scriptpath": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgScriptPath Chemin de script]",
     "redirect": "Redirigé par fichier, utilisateur, page ou ID de révision",
     "redirect-legend": "Rediriger vers une page ou un fichier",
     "redirect-summary": "Cette page spéciale redirige vers un fichier (nom de fichier fourni), une page (ID de révision ou de page fourni) ou une page d’utilisateur (identifiant numérique de l’utilisateur fourni). Utilisation : [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]], ou [[{{#Special:Redirect}}/user/101]].",
     "expand_templates_remove_nowiki": "Supprime les marqueurs <nowiki> dans le résultat",
     "expand_templates_generate_xml": "Voir l’arborescence d’analyse XML",
     "expand_templates_generate_rawhtml": "Afficher le HTML brut",
-    "expand_templates_preview": "Aperçu du rendu",
-    "trackingcategories": "Catégories de suivi",
-    "trackingcategories-summary": "Cette page liste les catégories de suivi qui sont remplies automatiquement par le logiciel MédiaWiki. Leurs noms peuvent être changés en modifiant les messages systèmes correspondants dans l’espace de noms {{ns:8}}.",
-    "trackingcategories-msg": "Catégorie de suivi",
-    "trackingcategories-name": "Nom du message",
-    "trackingcategories-desc": "Critère d’inclusion de la catégorie",
-    "noindex-category-desc": "La page contient un mot magique <nowiki>__NOINDEX__</nowiki> (et est dans un espace de noms où ce marquage est autorisé), et donc ne sera pas indexée par les robots.",
-    "index-category-desc": "La page contient un <nowiki>__INDEX__</nowiki> (et est dans un espace de noms où ce marquage est autorisé), et sera donc indexée par les robots alors qu’elle ne l’aurait pas été normalement.",
-    "post-expand-template-inclusion-category-desc": "Après avoir développé tous les modèles, la taille de la page dépasse $wgMaxArticleSize ; certains modèles n’ont donc pas été développés.",
-    "post-expand-template-argument-category-desc": "Après avoir développé l’argument d’un modèle (quelque chose entre accolades triples, comme {{{Foo}}}), la page dépasse $wgMaxArticleSize.",
-    "expensive-parserfunction-category-desc": "Trop de fonctions coûteuses de l’analyseur (comme #ifexists) sont incluses dans une page. Voyez [https://www.mediawiki.org/wiki/Manual:$wgExpensiveParserFunctionLimit Manual:$wgExpensiveParserFunctionLimit].",
-    "broken-file-category-desc": "Catégorie ajoutée su la page contient un lien de fichier incorrect (un lien pour inclure un fichier alors que celui-ci n’existe pas).",
-    "hidden-category-category-desc": "C’est une catégorie contenant <nowiki>__HIDDENCAT__</nowiki>, qui empêche son affichage dans la zone des liens de catégorie sur les pages, par défaut.",
-    "trackingcategories-nodesc": "Aucune description disponible.",
-    "trackingcategories-disabled": "La catégorie est désactivée"
+    "expand_templates_preview": "Aperçu du rendu"
 }
index 463b5f2..03f016a 100644 (file)
     "disclaimers": "Avertissements",
     "disclaimerpage": "Project:Avertissements ordinaires",
     "edithelp": "Aide",
-    "helppage": "Help:Aide",
     "mainpage": "Page Principale",
     "mainpage-description": "Page Principale",
     "policy-url": "Project:Régulations",
index a68bf33..8726b31 100644 (file)
     "prefs-skin": "Habelyâjo",
     "skin-preview": "Prèvêre",
     "datedefault": "Niona prèference",
-    "prefs-beta": "Fonccionalitâts « Bèta »",
     "prefs-datetime": "Dâta et hora",
     "prefs-labs": "Fonccionalitâts « Laboratiors »",
     "prefs-user-pages": "Pâges utilisator",
     "nowatchlist": "Vos éd gins de piéce dedens voutra lista de siuvu.",
     "watchlistanontext": "Se vos plét, vos vos dête $1 por povêr vêre ou ben changiér les piéces de voutra lista de siuvu.",
     "watchnologin": "Pas branchiê",
-    "watchnologintext": "Vos dête étre [[Special:UserLogin|branchiê(ye)]] por povêr changiér voutra lista de siuvu.",
     "addwatch": "Apondre a la lista de siuvu",
     "addedwatchtext": "La pâge « [[:$1]] » est étâye apondua a voutra [[Special:Watchlist|lista de siuvu]].\nLos changements que vegnont de ceta pâge et de la sina pâge de discussion y seront listâs.",
     "removewatch": "Enlevar de la lista de siuvu",
     "allmessagesname": "Nom du mèssâjo",
     "allmessagesdefault": "Mèssâjo per dèfôt",
     "allmessagescurrent": "Tèxto d’ora",
-    "allmessagestext": "O est la lista des mèssâjos sistèmo disponiblos dens l’èspâço MediaWiki.\nVolyéd visitar la [https://www.mediawiki.org/wiki/Localisation localisacion de MediaWiki] et pués [//translatewiki.net translatewiki.net] se vos voléd contribuar a la localisacion g·ènèrica de MediaWiki.",
+    "allmessagestext": "O est la lista des mèssâjos sistèmo disponiblos dens l’èspâço MediaWiki.\nVolyéd visitar la [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation localisacion de MediaWiki] et pués [//translatewiki.net translatewiki.net] se vos voléd contribuar a la localisacion g·ènèrica de MediaWiki.",
     "allmessagesnotsupportedDB": "Ceta pâge '''{{ns:special}}:Allmessages''' est inutilisâbla perce que '''$wgUseDatabaseMessages''' at étâ dèsactivâ.",
     "allmessages-filter-legend": "Filtro",
     "allmessages-filter": "Filtrar per ètat de changement :",
index 11159ce..e2fd0e8 100644 (file)
     "pool-timeout": "Tidj uflepen bi't teewen üüb't sperang",
     "pool-queuefull": "Pool as auerläästet",
     "pool-errorunknown": "Ünbekäänd feeler",
+    "pool-servererror": "Di pooltäälersiinst werket ei ($1).",
     "aboutsite": "Auer {{SITENAME}}",
     "aboutpage": "Project:Auer",
     "copyright": "Det sidj as tu fun oner $1 , wan diar niks ööders stäänt.",
     "accountcreatedtext": "Det brükerkonto för [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|talk]]) as iinracht wurden.",
     "createaccount-title": "En brükerkonto üüb {{SITENAME}} iinracht",
     "createaccount-text": "Diar as mä din e-mail adres för di en brükerkonto \"$2\" üüb {{SITENAME}} ($4) maaget wurden. För \"$2\" as automaatisk det paaswurd \"$3\" iinracht wurden.\nDü skulst di nü uunmelde an det paaswurd anre.\n\nWan det brükerkonto ütj fersen uunlaanj wurden as, säärst dü niks widjer onernem.",
-    "usernamehasherror": "Uun brükernöömer mut nian rütjen föörkem.",
     "login-throttled": "Dü heest tufölsis fersoocht, di uuntumeldin.\nWees so gud an teew $1, iar dü det noch ans ferschükst.",
     "login-abort-generic": "Det uunmeldin hää ei loket - Ufbreegen",
     "loginlanguagelabel": "Spriak: $1",
     "revdelete-no-file": "Son dateinööm as ei diar.",
     "revdelete-show-file-confirm": "Wel dü würelk det stregen werjuun faan det datei „<nowiki>$1</nowiki>“ faan di $2, am a klook $3 uunluke?",
     "revdelete-show-file-submit": "Ja",
+    "revdelete-selected-text": "'''{{PLURAL:$1|ütjsoocht werjuun|ütjsoocht werjuunen}} faan [[:$2]]:'''",
+    "revdelete-selected-file": "Ütjsoocht {{PLURAL:$1|dateiwerjuun|dateiwerjuunen}} faan [[:$2]]:",
     "logdelete-selected": "{{PLURAL:$1|Ütjsoocht logbukiindrach|Ütjsoocht logbukiindracher}}:",
     "revdelete-text-text": "Stregen werjuunen bliiw uun't werjuunshistoore, man dialen diarfaan san ei för arken tu sen.",
     "revdelete-text-file": "Stregen datei-werjuunen bliiw uun't werjuunshistoore, man dialen diarfaan san ei för arken tu sen.",
     "prefs-skin": "Skak",
     "skin-preview": "Föörskau",
     "datedefault": "Föör-iinstelang",
-    "prefs-beta": "Beta mögelkhaiden",
-    "prefs-datetime": "Dai an klooktidj",
     "prefs-labs": "Alpha mögelkhaiden",
     "prefs-user-pages": "Brükersidjen",
     "prefs-personal": "Brüker dooten",
     "upload-permitted": "Tuläät slacher faan datein: $1.",
     "upload-preferred": "Slacher faan datein, diar dü brük skulst: $1.",
     "upload-prohibited": "Ei tuläät slacher faan datein: $1.",
-    "uploadlog": "datei logbuk",
     "uploadlogpage": "Datei-logbuk",
     "uploadlogpagetext": "Detheer as det logbuk för huuchschüürd datein. Dü könst uk det [[Special:NewFiles|galerii faan nei datein]] uunluke.",
     "filename": "Dateinööm",
     "filereuploadsummary": "Feranrangen faan det datei:",
     "filestatus": "Copyright-Status:",
     "filesource": "Kwel",
-    "uploadedfiles": "Huuchschüürd datein",
     "ignorewarning": "Ei üüb wäärnangen aachte an det datei seekre",
     "ignorewarnings": "Ei am wäärnangen komre",
     "minlength1": "Dateinöömer skel tumanst ään buksteew lung wees.",
     "overwroteimage": "hää en nei werjuun faan „[[$1]]“ huuchschüürd",
     "uploaddisabled": "Huuchschüüren as ei aktiwiaret",
     "copyuploaddisabled": "Huuchschüüren faan URLs as ei aktiwiaret.",
-    "uploadfromurl-queued": "Din huuchschüürd datei teewt.",
     "uploaddisabledtext": "Det huuchschüüren faan datein as ei aktiwiaret.",
     "php-uploaddisabledtext": "Det huuchschüüren faan datein as uun PHP ei aktiwiaret.\nLuke di det iinstelang faan <code>file_uploads</code> uun.",
     "uploadscripted": "Uun detdiar datei stäänt HTML- of Scriptcode, an küd ütj fersen faan en browser ütjfeerd wurd.",
     "upload-misc-error": "Bi't huuchschüüren as wat skiaf gingen.",
     "upload-misc-error-text": "Bi't huuchschüüren as wat skiaf gingen. Luke di det URL noch ans uun, an of det sidj uk würelk diar as.\nWan det goorei wal, do skriiw tu en [[Special:ListUsers/sysop|administraator]].",
     "upload-too-many-redirects": "Det URL hää tuföl widjerfeerangen.",
-    "upload-unknown-size": "Ünbekäänd grate",
     "upload-http-error": "Diar as en HTTP-feeler mä: $1",
     "upload-copy-upload-invalid-domain": "Kopiin faan datein kön faan detdiar domeen ei huuchschüürd wurd.",
     "backend-fail-stream": "Det datei $1 küd ei auerdraanj wurd.",
     "img-auth-streaming": "„$1“ woort iinleesen.",
     "img-auth-public": "Mä img_auth.php wurd datein faan en priwoot Wiki ütjden.\nDetheer as oober en öfentelk Wiki.\nFör a seekerhaid as img_auth.php ei aktiwiaret.",
     "img-auth-noread": "Di brüker hää nian rocht, „$1“ tu leesen.",
-    "img-auth-bad-query-string": "Uun det URL san ei tuläät uffraagtiakens.",
     "http-invalid-url": "Ei tuläät URL: $1",
     "http-invalid-scheme": "URLs mä det münster „$1“ kön ei brükt wurd.",
     "http-request-error": "HTTP-feeler bi't uffraagin.",
     "filehist-dimensions": "Miaten",
     "filehist-filesize": "Dateigrate",
     "filehist-comment": "Komentaar",
-    "filehist-missing": "Datei ei diar",
     "imagelinks": "Hü det datei brükt woort",
     "linkstoimage": "{{PLURAL:$1|Detdiar sidj brükt|Jodiar $1 sidjen brük}} detdiar datei:",
     "linkstoimage-more": "Muar üs $1 {{PLURAL:$1|sidj ferwiset|sidjen ferwise}} üüb detdiar datei.\nDet list wiset {{PLURAL:$1|at iarst ferwisang|a iarst $1 ferwisangen}} üüb detdiar datei.\nDü könst uk det [[Special:WhatLinksHere/$2|hial list]] uunluke.",
     "listgrouprights-removegroup-self": "Aanj brükerkonto faan {{PLURAL:$2|detdiar skööl|jodiar sköölen}} wechnem: $1",
     "listgrouprights-addgroup-self-all": "Koon aal a sköölen tu't aanj brükerkonto tuwise",
     "listgrouprights-removegroup-self-all": "Koon aal a sköölen faan't aanj brükerkonto wechnem",
+    "trackingcategories": "Kategoriin ferfulge",
+    "trackingcategories-summary": "Üüb detdiar sidj stun ferfulagt kategoriin, diar faan't MediaWiki-software iindraanj wurden san. Hör nöömer kön feranert wurd, wan dü a süsteem-noorachten uun a {{ns:8}}-nöömrüm feranerst.",
+    "trackingcategories-msg": "Kategorii ferfulge",
+    "trackingcategories-name": "Nööm faan't bööd",
+    "trackingcategories-desc": "Kriteerien för't iinbinjen faan kategoriin.",
+    "noindex-category-desc": "Üüb detdiar sidj stäänt det maagisk wurd <code><nowiki>__NOINDEX__</nowiki></code> an as uun en nöömrüm, huar det tuläät as. Sodenang woort det faan a bots ei indisiaret.",
+    "index-category-desc": "Üüb detdiar sidj stäänt det maagisk wurd <code><nowiki>__INDEX__</nowiki></code> an as uun en nöömrüm, huar det ei tuläät as. Sodenang woort det faan a bots likes indisiaret.",
+    "post-expand-template-inclusion-category-desc": "Efter't ütjwidjin faan a föörlaagen as det sidj grater üs <code>$wgMaxArticleSize</code>, sodenang kön enkelt föörlaagen ei ütjwidjet wurd.",
+    "post-expand-template-argument-category-desc": "Efter't ütjwidjin faan en föörlaagenargument (det stäänt uun trebelt kläämen so üs <code>{{{Foo}}})</code> as det sidj grater üs <code>$wgMaxArticleSize</code>.",
+    "expensive-parserfunction-category-desc": "Diar san tu föl parser-funktjuunen (so üs <code>#ifexist</code>) uun det sidj iinbünjen. Luke efter uun't [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit brüker-hoonbuk].",
+    "broken-file-category-desc": "Detdiar kategorii woort iinsaat, wan üüb det sidj en uunstaken ferwisang föörkomt. (Det as ferlicht en ferwisang üüb en datei, wat det goorei jaft.)",
+    "hidden-category-category-desc": "Det as en kategorii, huar <code><nowiki>__HIDDENCAT__</nowiki></code> üüb stäänt. Hat woort normoolerwiis ei bi a kategoriin uunwiset.",
+    "trackingcategories-nodesc": "Diar as nian beskriiwang.",
+    "trackingcategories-disabled": "Detdiar kategorii as ufsteld wurden",
     "mailnologin": "Bi't e-mail ferschüüren as wat skiaf gingen",
     "mailnologintext": "Dü skel [[Special:UserLogin|uunmeldet wees]] an en gudkäänd e-mail-adres uun din [[Special:Preferences|iinstelangen]] haa, am dat dü ööder brükern en e-mail schüür könst.",
     "emailuser": "E-mail tu didiar brüker",
     "emailuser-title-notarget": "E-mail tu brüker",
     "emailpage": "E-mail tu brüker",
     "emailpagetext": "Dü könst {{GENDER:$1|di brüker|det brükerin}} mä det formulaar en e-mail schüür.\nDin aanj e-mail adres faan din [[Special:Preferences|iinstelangen]] woort uunwiset, so dat {{GENDER:$1|di brüker|det brükerin}} di saner amwai swaare koon.",
-    "usermailererror": "Det e-mail objekt wiset en feeler uun.",
     "defemailsubject": "{{SITENAME}} e-mail faan brüker „$1“",
     "usermaildisabled": "E-mail fun as ei aktiif",
     "usermaildisabledtext": "Dü könst nian e-mail tu ööder brükern schüür.",
     "noemailtitle": "Nian e-mail adres",
     "noemailtext": "Didiar brüker hää nian gudkäänd e-mail adres uunden.",
-    "nowikiemailtitle": "E-mail koon ei wechschüürd wurd",
     "nowikiemailtext": "Didiar brüker maad nian e-mails faan ööder brükern fu.",
     "emailnotarget": "Didiar brükernööm as ei bekäänd of ei gudkäänd, am ham en e-mail tu schüüren",
     "emailtarget": "Brükernööm faan di ööder brüker iindu",
     "nowatchlist": "Diar as nään iindrach, diar dü uun't uug behual wel.",
     "watchlistanontext": "Dü skel di $1, am iindracher tu leesen of tu bewerkin, diar dü uun't uug behual wel.",
     "watchnologin": "Ei uunmeldet",
-    "watchnologintext": "Dü skel [[Special:UserLogin|uunmeldet]] wees, am iindracher tu bewerkin, diar dü uun't uug behual wel.",
     "addwatch": "Uk uun't uug behual",
     "addedwatchtext": "Det sidj „[[:$1]]“ wel dü [[Special:Watchlist|uun't uug behual]].\nFeranrangen faan detdiar sidj wurd üüb detdiar list fäästhäälen.",
     "removewatch": "Ei muar uun't uug behual",
     "watching": "Uun't uug behual ...",
     "unwatching": "Ei uun't uug behual ...",
     "watcherrortext": "Bi't anrin faan iinstelangen för „$1“ as wat skiaf gingen.",
-    "enotif_mailer": "{{SITENAME}}-e-mail-noorachten siinst",
     "enotif_reset": "Aal a sidjen üs besoocht kääntiakne",
     "enotif_impersonal_salutation": "{{SITENAME}}-brüker",
     "enotif_subject_deleted": "{{SITENAME}}-sidj $1 as faan {{GENDER:$2|$2}} stregen wurden.",
     "excontent": "diar sted: „$1“",
     "excontentauthor": "diar sted: „$1“ (iansagst bewerker: [[Special:Contributions/$2|$2]])",
     "exbeforeblank": "diar sted föör't leesag maagin: „$1“",
-    "exblank": "sidj wiar leesag",
     "delete-confirm": "Strik \"$1\"",
     "delete-legend": "Strike",
     "historywarning": "'''Paase üüb:''' Det sidj, wat dü strik wel, hää amanbi $1 {{PLURAL:$1|werjuun|werjuunen}}:",
     "sp-contributions-newbies-sub": "Faan nei brükern",
     "sp-contributions-newbies-title": "Brükerbidracher faan nei brükern",
     "sp-contributions-blocklog": "Sper-logbuk",
+    "sp-contributions-suppresslog": "Ei uunwiset brüker-bidracher",
     "sp-contributions-deleted": "Stregen bidracher",
     "sp-contributions-uploads": "Huuchschüürd bilen",
     "sp-contributions-logs": "Logbuken",
     "sp-contributions-blocked-notice": "Didiar brüker as speret. Det stäänt uun't sperlogbuk:",
     "sp-contributions-blocked-notice-anon": "Detdiar IP-adres as speret. Det stäänt uun't sperlogbuk:",
     "sp-contributions-search": "Schük efter brükerbidracher",
-    "sp-contributions-suppresslog": "Ei uunwiset brüker-bidracher",
     "sp-contributions-username": "IP-adres of brükernööm:",
     "sp-contributions-toponly": "Bluas aktuel werjuunen wise",
     "sp-contributions-newonly": "Bluas nei maaget sidjen wise",
     "allmessagesname": "Nööm",
     "allmessagesdefault": "Standard tekst",
     "allmessagescurrent": "Aktuel tekst",
-    "allmessagestext": "Det as en list mä MediaWiki-süsteemteksten.\nWees so gud an beschük a sidjen [https://www.mediawiki.org/wiki/Localisation MediaWiki-auersaatang] an [//translatewiki.net translatewiki.net], wan dü bi't auersaaten mähalep meest.",
+    "allmessagestext": "Det as en list mä MediaWiki-süsteemteksten.\nWees so gud an beschük a sidjen [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation MediaWiki-auersaatang] an [//translatewiki.net translatewiki.net], wan dü bi't auersaaten mähalep meest.",
     "allmessagesnotsupportedDB": "Detdiar spezial-sidj koon ei brükt wurd, auer <tt>$wgUseDatabaseMessages</tt> ei aktiif as.",
     "allmessages-filter-legend": "Filter",
     "allmessages-filter": "Filter för di uunpaaset stant:",
     "importunknownsource": "Ünbekäänd importkwel",
     "importcantopen": "Det import-datei küd ei eeben maaget wurd.",
     "importbadinterwiki": "Ferkiard interwiki-link",
-    "importnotext": "Leesag of nään tekst",
     "importsuccess": "Import klaar!",
-    "importhistoryconflict": "Diar san al ääler werjuunen diar. Ferlicht as det sidj al ans importiaret wurden.",
     "importnosources": "För di transwiki-import san nian kwelen uunden. Dü könst werjuunen ei direkt huuchschüür.",
     "importnofile": "Diar as nian importdatei bestemet wurden.",
     "importuploaderrorsize": "Bi't huuchschüüren faan det importdatei as wat skiaf gingen. Det datei as tu grat.",
index fdce5d8..8d0a4d6 100644 (file)
     "watchlistfor2": "Par $1 $2",
     "nowatchlist": "Nissun element al è tignût di voli.",
     "watchnologin": "No tu sês jentrât",
-    "watchnologintext": "Tu 'nd âs di [[Special:UserLogin|jentrâ]] par modificâ la liste des pagjinis tignudis di voli.",
     "addedwatchtext": "La pagjine \"<nowiki>$1</nowiki>\" e je stade zontade ae [[Special:Watchlist|liste di chês tignudis di voli]].\nTal futûr i cambiaments a cheste pagjine e ae pagjine di discussion relative a saran segnalâts ca,\ne la pagjine e sarà '''gruessute''' te [[Special:RecentChanges|liste dai ultins cambiaments]] cussì che tu puedis notâle daurman.\n\n<p>Se tu vuelis gjavâle de liste pi indevant, frache su \"No stâ tignî di voli\" te sbare in alt.",
     "removedwatchtext": "La pagjine \"[[:$1]]\" e je stade gjavade de [[Special:Watchlist|liste di chês tignudis di voli]].",
     "watch": "Ten di voli",
     "allmessagesname": "Non",
     "allmessagesdefault": "Test predeterminât",
     "allmessagescurrent": "Test curint",
-    "allmessagestext": "Cheste e je une liste dai messaçs di sisteme disponibii tal non dal spazi MediaWiki.\nPar plasê va su [https://www.mediawiki.org/wiki/Localisation MediaWiki Localisation] e [//translatewiki.net translatewiki.net] se tu vuelis contribuî ae traduzion gjeneriche di MediaWiki.",
+    "allmessagestext": "Cheste e je une liste dai messaçs di sisteme disponibii tal non dal spazi MediaWiki.\nPar plasê va su [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation MediaWiki Localisation] e [//translatewiki.net translatewiki.net] se tu vuelis contribuî ae traduzion gjeneriche di MediaWiki.",
     "allmessages-filter-all": "Ducj",
     "allmessages-language": "Lenghe:",
     "allmessages-filter-submit": "Va",
index bf4d458..f3a11a6 100644 (file)
     "permalink": "Fêste keppeling",
     "print": "Ofdrukke",
     "view": "Lêze",
-    "edit": "Wizigje",
+    "edit": "Feroarje",
     "create": "Oanmeitsje",
     "editthispage": "Side bewurkje",
     "create-this-page": "Dizze side oanmeitsje",
     "revdelete-hide-comment": "De bewurkingsgearfetting ferskûlje",
     "revdelete-hide-user": "Meidoggernamme/IP fan de meidogger ferskûlje",
     "revdelete-hide-restricted": "Dizze beheinings tapasse op behearders en dizze ynterface ôfslute",
+    "revdelete-radio-set": "Ferburgen",
+    "revdelete-radio-unset": "Sichtber",
     "revdelete-suppress": "Gegevens foar behearders likegoed as oaren ûnderdrukke",
     "revdelete-unsuppress": "Beheinings op tebeksette feroarings fuorthelje",
     "revdelete-log": "Reden:",
     "revdelete-submit": "Tapasse op selektearre bewurking",
-    "revdelete-success": "'''Sichtberens fan'e feroaring mei sukses ynsteld.'''",
+    "revdelete-success": "'''Sichtberens fan 'e feroaring mei sukses ynsteld.'''",
     "logdelete-success": "'''Sichtberens fan it barren mei sukses ynsteld.'''",
     "revdel-restore": "Sichtberens feroarje",
     "pagehist": "Sideskiednis",
     "prefs-skin": "Side-oansjen",
     "skin-preview": "Proefbyld",
     "datedefault": "Gjin foarkar",
-    "prefs-datetime": "Datum en tiid",
     "prefs-personal": "Persoanlike gegevens",
     "prefs-rc": "Koartlyn feroare",
     "prefs-watchlist": "Folchlist",
     "upload-permitted": "Talitten triemtypen: $1.",
     "upload-preferred": "Oanwiisde triemtypen: $1.",
     "upload-prohibited": "Ferbeane triemtypen: $1.",
-    "uploadlog": "oanbiedloch",
     "uploadlogpage": "Oanbiedloch",
     "uploadlogpagetext": "List fan de lêst oanbeane triemmen. (Tiid oanjûn as UTC).",
     "filename": "Triemnamme",
     "filereuploadsummary": "Triemferoarings:",
     "filestatus": "Auteursrjochtensituaasje:",
     "filesource": "Boarne:",
-    "uploadedfiles": "Oanbeane triemmen",
     "ignorewarning": "Negearje de warskôging en lis triem dochs fêst.",
     "ignorewarnings": "Negearje warskôgings",
     "minlength1": "Triemnammen moatte minstens út ien teken bestean.",
     "upload-file-error-text": "Der wie in ynterne fout doe't in tydlike triem op'e server oanmakke waard.\nNim kontakt op mei in [[Special:ListUsers/sysop|behearder]].",
     "upload-misc-error": "Unbekende oanbiedfout",
     "upload-misc-error-text": "Der is by it oanbieden in ûnbekende fout optreden.\nKontrolearje of de URL krekt en beskikber is en besykje it nochris.\nAs it probleem oanhâldt, nim dan kontakt op mei in\n[[Special:ListUsers/sysop|behearder]].",
-    "upload-unknown-size": "Unbekinde grutte",
     "upload-curl-error6": "Koe de URL net berikke",
     "upload-curl-error6-text": "De opjûne URL is net berikber.\nKontrolearje oft de URL krekt is en oft de webside beskikber is.",
     "upload-curl-error28": "Oanbiedtiid foarby",
     "filehist-dimensions": "Ofmjittings",
     "filehist-filesize": "Triem grutte",
     "filehist-comment": "Opmerkings",
-    "filehist-missing": "Triem net fûn",
     "imagelinks": "Ofbyldkeppelings",
     "linkstoimage": "Dizze {{PLURAL:$1|side is|$1 siden binne}} keppele oan it ôfbyld:",
     "linkstoimage-more": "Der {{PLURAL:$2|is|binne}} mear as $1 {{PLURAL:$1|ferwizing|ferwizings}} nei dizze triem.\nDe folgjende list jout allinne de earste {{PLURAL:$1|ferwizing|$1 ferwizings}} nei dizze triem wer.\nDer is ek in [[Special:WhatLinksHere/$2|folsleine list]].",
     "emailuser": "Skriuw meidogger",
     "emailpage": "E-post nei meidogger",
     "emailpagetext": "Fia dit berjocht kinne jo in e-mail oan dizze brûker ferstjoere.\nIt e-mailadres dat jo opjûn hawwe by [[Special:Preferences|jo foarkarren]] wurdt as ôfstjoerder  brûkt.\nDe ûntfanger kin dus daliks nei jo reagearje.",
-    "usermailererror": "Flatermelding by ferstjoeren:",
     "defemailsubject": "E-post fan {{SITENAME}}",
     "noemailtitle": "Gjin e-postadres",
     "noemailtext": "Dizze meidogger hat gjin jildich e-postadres ynsteld, of hat oanjûn gjin post fan oare meidoggers krije te wollen.",
-    "nowikiemailtitle": "E-mail is net tastien",
     "nowikiemailtext": "Dizze brûker wol gjin e-mail ûntfange fan oare brûkers.",
     "email-legend": "In e-mail ferstjoere nei in oare brûker fan {{SITENAME}}",
     "emailfrom": "Fan:",
     "mywatchlist": "Folchlist",
     "nowatchlist": "Jo hawwe gjin siden op jo folchlist.",
     "watchnologin": "Net oanmeld yn",
-    "watchnologintext": "Jo moatte [[Special:UserLogin|oanmeld]] wêze om jo folchlist te feroarjen.",
     "addedwatchtext": "De side \"'''[[:$1]]'''\" is tafoege oan jo [[Special:Watchlist|folchlist]]. Bewurkings fan dizze side en oerlisside wurde yn de takomst op jo folchlist oanjûn. Hja wurde foar jo ek '''fet''' printe op [[Special:RecentChanges|Koartlyn feroare]].\n\nAt jo letter in side net mear folgje wolle, dan brûke jo op dy side de keppeling \"Ferjit dizze side.\" Jo [[Special:Watchlist|folchlist]] hat ek in keppeling \"Jo folchlist bewurkje,\" foar at jo mear as ien side \"ferjitte\" wolle.",
     "removedwatchtext": "De side \"[[:$1]]\" stiet net mear op jo folchlist.",
     "watch": "Folgje",
     "excontent": "ynhâld wie: '$1'",
     "excontentauthor": "ynhâld wie: '$1' (en de ienige bewurker wie: '[[Special:Contributions/$2|$2]]')",
     "exbeforeblank": "foar de tekst wiske wie, wie dat: '$1'",
-    "exblank": "side wie leech",
     "delete-confirm": "\"$1\" wiskje",
     "delete-legend": "Wiskje",
     "historywarning": "Warskôging: De side dy't jo wiskje wolle hat skiednis:",
     "allmessagesname": "Namme",
     "allmessagesdefault": "Standerttekst",
     "allmessagescurrent": "Tekst yn de nijste ferzje",
-    "allmessagestext": "Dit is in list fan alle systeemberjochten beskikber yn de MediaWiki-nammeromte.\nSjoch: [https://www.mediawiki.org/wiki/Localisation MediaWiki Localisation], [//translatewiki.net translatewiki.net].",
+    "allmessagestext": "Dit is in list fan alle systeemberjochten beskikber yn de MediaWiki-nammeromte.\nSjoch: [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation MediaWiki Localisation], [//translatewiki.net translatewiki.net].",
     "thumbnail-more": "Fergrutsje",
     "filemissing": "Triem net fûn",
     "thumbnail_error": "Flater by it oanmeitsjen fan thumbnail: $1",
     "importunknownsource": "Unbekende ymportboarnetype",
     "importcantopen": "De ymporttriem koe net iepenen wurde.",
     "importbadinterwiki": "Ferkearde ynterwikiferwizing",
-    "importnotext": "Leech of gjin tekst",
     "importsuccess": "Ymport slagge!",
     "importnofile": "Gjin ymporttriem is oanbeane.",
     "import-noarticle": "Gjin side te ymportearjen!",
     "exif-gpstimestamp": "GPS-tiid (atoomklok)",
     "exif-gpsspeedref": "Snelheidsienheid",
     "exif-gpsdatestamp": "GPS-datum",
+    "exif-source": "Boarne",
+    "exif-contact": "Kontakt ynformaasje",
+    "exif-writer": "Skriuwer",
+    "exif-languagecode": "Taal",
+    "exif-iimcategory": "Kategory",
+    "exif-datetimereleased": "Utbrocht op",
+    "exif-serialnumber": "Searjenûmer fan de kamera",
+    "exif-cameraownername": "Eigner fan de kamera",
+    "exif-copyrightowner": "Copyright eigner",
+    "exif-disclaimer": "Foarbehâld",
     "exif-unknowndate": "Datum ûnbekend",
     "exif-orientation-1": "Normaal",
     "exif-componentsconfiguration-0": "bestiet net",
     "exif-sharpness-0": "Normaal",
     "exif-subjectdistancerange-0": "Unbekend",
     "exif-subjectdistancerange-2": "Tichtby",
+    "exif-gpsdestdistance-m": "Milen",
+    "exif-gpsdestdistance-n": "Seemilen",
     "watchlistall2": "alles",
     "namespacesall": "alles",
     "monthsall": "alle",
     "confirmemail_body": "Immen, nei gedachten jo, hat him by {{SITENAME}} oanmelde as \"$2\", mei dit netpostadres ($1).\n\nHjirtroch komme ek de netpostfunksjes fan {{SITENAME}} foar jo beskikber. Iepenje de neikommende keppeling om te befêstigjen dat jo wier josels by {{SITENAME}} mei dit netpostadres oanmelde hawwe:\n\n$3\n\nAt jo dat *net* wienen, brûk dy keppeling dan net, en klik hjir:\n\n$5\n\nDizze befêstigingskoade ferrint dan op $4.",
     "scarytranscludetoolong": "[URL-adres is te lang]",
     "confirmrecreate": "Sûnt jo begûn binne dizze side te bewurkjen, hat meidogger [[User:$1|$1]] ([[User talk:$1|oerlis]]) de side wiske. De reden dy't derfoar jûn waard wie:\n: ''$2''\nWolle jo de side wier op 'e nij skriuwe?",
+    "confirm_purge_button": "Okee",
+    "confirm-watch-button": "Okee",
+    "confirm-unwatch-button": "Okee",
+    "confirm-unwatch-top": "Dizze side fan myn folchlist ôfhelje",
+    "imgmultipageprev": "side werom",
     "imgmultipagenext": "folgjende side →",
     "imgmultigo": "Los!",
     "imgmultigoto": "Gean nei side $1",
+    "img-lang-default": "(standert taal)",
     "table_pager_next": "Folgjende side",
+    "table_pager_prev": "Side werom",
     "table_pager_first": "Earste side",
+    "table_pager_last": "Lêste side",
     "table_pager_limit_submit": "Los!",
     "table_pager_empty": "Gjin resultaat",
     "autosumm-blank": "Alle ynhâld fan de side weismiten",
     "autoredircomment": "Ferwiist troch nei [[$1]]",
     "autosumm-new": "Nije Side: $1",
     "livepreview-loading": "Ynlade...",
+    "livepreview-ready": "Lade... Klear!",
     "watchlistedit-normal-title": "Folchlist bewurkje",
     "watchlistedit-normal-submit": "Siden wiskje",
     "watchlistedit-raw-titles": "Siden:",
     "specialpages-group-spam": "Spamhelpmiddels",
     "blankpage": "Side is leech",
     "intentionallyblankpage": "Dizze side is bewust leech lizzen en wurdt brûkt foar benchmarks, ensfh.",
+    "tags-active-yes": "Ja",
+    "tags-active-no": "Nee",
+    "tags-edit": "bewurkje",
+    "tags-hitcount": "$1 {{PLURAL:$1|bewurking|bewurkings}}",
+    "comparepages": "Siden ferlykje",
+    "compare-page1": "Side 1",
+    "compare-page2": "Side 2",
+    "compare-rev1": "Revyzje 1",
+    "compare-rev2": "Revyzje 2",
+    "compare-submit": "Ferlykje",
+    "compare-invalid-title": "Unjildige titel.",
     "revdelete-restricted": "hat beheinings oplein oan behearders",
     "revdelete-unrestricted": "hat beheinings foar behearders goedmakke",
     "rightsnone": "(gjin)",
     "feedback-cancel": "Ofbrekke",
     "feedback-submit": "Feedback ferstjoere",
     "feedback-close": "Dien",
-    "searchsuggest-search": "Sykje"
+    "searchsuggest-search": "Sykje",
+    "expand_templates_ok": "Okee",
+    "expand_templates_remove_comments": "Berjochten fuorthelje"
 }
index 9b87b60..285c558 100644 (file)
     "nowatchlist": "Níl aon rud ar do liosta faire.",
     "watchlistanontext": "$1, le d'thoil, chun míreanna ar do liosta faire a fheiceáil ná a athrú.",
     "watchnologin": "Níl tú logáilte isteach",
-    "watchnologintext": "Tá ort a bheith [[Special:UserLogin|logáilte isteach]] chun do liosta faire a athrú.",
     "addedwatchtext": "Cuireadh an leathanach \"<nowiki>$1</nowiki>\" le do [[Special:Watchlist|liosta faire]].\nAmach anseo liostálfar athruithe don leathanach seo agus dá leathanach plé ansin,\nagus beidh '''cló trom''' ar a theideal san [[Special:RecentChanges|liosta de na hathruithe is déanaí]] sa chaoi go bhfeicfeá iad go héasca.",
     "removedwatchtext": "Baineadh an leathanach \"[[:$1]]\" as [[Special:Watchlist|do liosta faire]].",
     "watch": "Déan faire",
     "allmessagesname": "Ainm",
     "allmessagesdefault": "Téacs réamhshocraithe",
     "allmessagescurrent": "Téacs reatha",
-    "allmessagestext": "Is liosta é seo de theachtaireachtaí córais atá le fáil san ainmspás MediaWiki.\nTabhair cuairt ar [https://www.mediawiki.org/wiki/Localisation MediaWiki Localisation] agus [//translatewiki.net translatewiki.net] le do thoil más mian leat cur leis an logánú ginearálta MediaWiki.",
+    "allmessagestext": "Is liosta é seo de theachtaireachtaí córais atá le fáil san ainmspás MediaWiki.\nTabhair cuairt ar [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation MediaWiki Localisation] agus [//translatewiki.net translatewiki.net] le do thoil más mian leat cur leis an logánú ginearálta MediaWiki.",
     "allmessagesnotsupportedDB": "Ní féidir an leathanach seo a úsáid dá bharr gur díchumasaíodh '''$wgUseDatabaseMessages'''.",
     "allmessages-filter-all": "Uile",
     "allmessages-language": "Teanga:",
index 0af5c70..c315751 100644 (file)
     "nowatchlist": "倷𠮶监视列表什哩都冇有。",
     "watchlistanontext": "请$1眵吖或改吖倷𠮶监视列表。",
     "watchnologin": "冇登入",
-    "watchnologintext": "倷要[[Special:UserLogin|登入]]起才改得正倷𠮶监视列表。",
     "addedwatchtext": "页面\"[[:$1]]\" 加到嘞倷𠮶[[Special:Watchlist|监视列表]]。个页同佢𠮶讨论页𠮶全部改动以后都会列到许首,佢会用'''粗体''' 列到[[Special:RecentChanges|最近更改]]让倷更加容易识别。 倷以后要系拿佢到监视列表删卟佢𠮶话,就到导航条点吖“莫眏到”。",
     "removedwatchtext": "页面[[:$1]]到[[Special:Watchlist|倷𠮶监视列表]]删卟哩。",
     "watch": "眏到",
     "allmessagesname": "名字",
     "allmessagesdefault": "默认文字",
     "allmessagescurrent": "眼前𠮶文字",
-    "allmessagestext": "个首列到全部制定得正𠮶系统界面。\nPlease visit [https://www.mediawiki.org/wiki/Localisation MediaWiki Localisation] and [//translatewiki.net translatewiki.net] if you wish to contribute to the generic MediaWiki localisation.",
+    "allmessagestext": "个首列到全部制定得正𠮶系统界面。\nPlease visit [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation MediaWiki Localisation] and [//translatewiki.net translatewiki.net] if you wish to contribute to the generic MediaWiki localisation.",
     "allmessagesnotsupportedDB": "'''{{ns:special}}:系统界面功能'''关卟嘞('''$wgUseDatabaseMessages''')。",
     "thumbnail-more": "放大",
     "filemissing": "寻伓到档案",
index 9c8eb9d..aeb3d49 100644 (file)
     "nowatchlist": "倷嗰監視列表什哩都冇有。",
     "watchlistanontext": "請$1眵吖或改吖倷嗰監視列表。",
     "watchnologin": "冇登入",
-    "watchnologintext": "倷要[[Special:UserLogin|登入]]起才改得正倷嗰監視列表。",
     "addedwatchtext": "頁面「[[:$1]]」加到嘞倷嗰[[Special:Watchlist|監視列表]]。箇頁同佢嗰討論頁嗰全部改動以後都會列到許首,佢會用'''粗體''' 列到[[Special:RecentChanges|最近更改]]讓倷更加容易識別。 倷以後要係拿佢到監視列表刪卟佢嗰話,就到導航條點吖「莫眏到」。",
     "removedwatchtext": "頁面[[:$1]]到[[Special:Watchlist|倷嗰監視列表]]刪卟哩。",
     "watch": "眏到",
     "allmessagesname": "名字",
     "allmessagesdefault": "默認文字",
     "allmessagescurrent": "眼前嗰文字",
-    "allmessagestext": "箇首列到全部制定得正嗰系統界面。\nPlease visit [https://www.mediawiki.org/wiki/Localisation MediaWiki Localisation] and [//translatewiki.net translatewiki.net] if you wish to contribute to the generic MediaWiki localisation.",
+    "allmessagestext": "箇首列到全部制定得正嗰系統界面。\nPlease visit [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation MediaWiki Localisation] and [//translatewiki.net translatewiki.net] if you wish to contribute to the generic MediaWiki localisation.",
     "allmessagesnotsupportedDB": "'''{{ns:special}}:系統界面功能'''關卟嘞('''$wgUseDatabaseMessages''')。",
     "thumbnail-more": "放大",
     "filemissing": "尋伓到檔案",
index 9fa15ae..951a52c 100644 (file)
     "prefs-skin": "Bian",
     "skin-preview": "Ro-shealladh",
     "datedefault": "Gun roghainnean",
-    "prefs-beta": "Feartan Beta",
     "prefs-datetime": "Ceann-là is àm",
     "prefs-labs": "Feartan nan deuchainn-lannan",
     "prefs-user-pages": "Duilleagan a' chleachdaiche",
     "allmessages": "Teachdaireachdan an t-siostaim",
     "allmessagesname": "Ainm",
     "allmessagesdefault": "Teacsa bunaiteach na teachdaireachd",
-    "allmessagestext": "Seo liosta de theachdaireachdan an t-siostaim a tha ri làimh ann an namespace MediaWiki.\nTadhail air [https://www.mediawiki.org/wiki/Localisation Ionadaileadh MediaWiki] is [//translatewiki.net translatewiki.net] ma tha thu airson pàirt a ghabhail ann an ionadaileadh MediaWiki.",
+    "allmessagestext": "Seo liosta de theachdaireachdan an t-siostaim a tha ri làimh ann an namespace MediaWiki.\nTadhail air [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation Ionadaileadh MediaWiki] is [//translatewiki.net translatewiki.net] ma tha thu airson pàirt a ghabhail ann an ionadaileadh MediaWiki.",
     "thumbnail-more": "Meudaich",
     "filemissing": "Faidhle a dhìth",
     "thumbnail_error": "Mearachd le cruthachadh na h-ìomhaigheige: $1",
index d2ecdc7..2feec0a 100644 (file)
@@ -13,7 +13,8 @@
             "Toliño",
             "Vivaelcelta",
             "Xosé",
-            "לערי ריינהארט"
+            "לערי ריינהארט",
+            "Fitoschido"
         ]
     },
     "tog-underline": "Subliñar as ligazóns:",
     "permalink": "Ligazón permanente",
     "print": "Imprimir",
     "view": "Ver",
+    "view-foreign": "Ver en $1",
     "edit": "Editar",
+    "edit-local": "Editar a descrición local",
     "create": "Crear",
+    "create-local": "Engadir a descrición local",
     "editthispage": "Editar esta páxina",
     "create-this-page": "Crear esta páxina",
     "delete": "Borrar",
     "pool-timeout": "Tempo límite de espera para o peche",
     "pool-queuefull": "A cola está chea",
     "pool-errorunknown": "Erro descoñecido",
+    "pool-servererror": "O servidor de contador de recursos comúns non está dispoñible ($1).",
     "aboutsite": "Acerca de {{SITENAME}}",
     "aboutpage": "Project:Acerca de",
     "copyright": "Todo o contido está dispoñible baixo a licenza $1, agás que se indique o contrario.",
     "accountcreatedtext": "Creouse a conta de usuario para [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|conversa]]).",
     "createaccount-title": "Creación dunha conta para {{SITENAME}}",
     "createaccount-text": "Alguén creou unha conta chamada \"$2\" para o seu enderezo de correo electrónico en {{SITENAME}} ($4), e con contrasinal \"$3\".\nDebe acceder ao sistema e mudar o contrasinal agora.\n\nPode facer caso omiso desta mensaxe se se creou esta conta por erro.",
-    "usernamehasherror": "O nome de usuario non pode conter cancelos (\"#\")",
     "login-throttled": "Fixo demasiados intentos de acceder ao sistema.\nPor favor, agarde $1 antes de probar outra vez.",
     "login-abort-generic": "Acceso ao sistema incorrecto; abortado",
     "loginlanguagelabel": "Lingua: $1",
     "content-model-text": "texto simple",
     "content-model-javascript": "JavaScript",
     "content-model-css": "CSS",
-    "expensive-parserfunction-warning": "'''Aviso:''' Esta páxina contén demasiados analizadores de funcións de chamadas.\n\nDebe ter menos {{PLURAL:$2|dunha chamada|de $2 chamadas}}, e agora hai $1.",
-    "expensive-parserfunction-category": "Páxinas con moitos analizadores de funcións de chamadas moi caros",
+    "expensive-parserfunction-warning": "'''Aviso:''' Esta páxina contén demasiadas chamadas a funcións analíticas custosas.\n\nDebe ter menos {{PLURAL:$2|dunha chamada|de $2 chamadas}}, e agora hai $1.",
+    "expensive-parserfunction-category": "Páxinas con moitas chamadas a funcións analíticas custosas",
     "post-expand-template-inclusion-warning": "'''Aviso:''' O tamaño do modelo é moi grande.\nAlgúns modelos non se incluirán.",
     "post-expand-template-inclusion-category": "Páxinas nas que se excede o tamaño dos modelos",
     "post-expand-template-argument-warning": "'''Aviso:''' Esta páxina contén, polo menos, un argumento de modelo que ten un tamaño e expansión moi grande.\nEstes argumentos foron omitidos.",
     "prefs-skin": "Aparencia",
     "skin-preview": "Vista previa",
     "datedefault": "Ningunha preferencia",
-    "prefs-beta": "Características en probas",
-    "prefs-datetime": "Data e hora",
     "prefs-labs": "Características experimentais",
     "prefs-user-pages": "Páxinas de usuario",
     "prefs-personal": "Información de usuario",
     "upload-permitted": "Tipos de ficheiro permitidos: $1.",
     "upload-preferred": "Tipos de ficheiro preferidos: $1.",
     "upload-prohibited": "Tipos de ficheiro prohibidos: $1.",
-    "uploadlog": "rexistro de cargas",
     "uploadlogpage": "Rexistro de cargas",
     "uploadlogpagetext": "A continuación está a lista cos últimos ficheiros cargados no servidor.\nVexa a [[Special:NewFiles|galería de imaxes novas]] para ollar unha visión máis xeral.",
     "filename": "Nome do ficheiro",
     "filereuploadsummary": "Cambios no ficheiro:",
     "filestatus": "Estado dos dereitos de autor:",
     "filesource": "Fonte:",
-    "uploadedfiles": "Ficheiros cargados",
     "ignorewarning": "Ignorar a advertencia e gardar o ficheiro de calquera xeito",
     "ignorewarnings": "Ignorar as advertencias",
     "minlength1": "Os nomes dos ficheiros deben ter cando menos unha letra.",
     "overwroteimage": "enviou unha nova versión de \"[[$1]]\"",
     "uploaddisabled": "Sentímolo, a subida de ficheiros está desactivada.",
     "copyuploaddisabled": "A carga mediante URL está desactivada.",
-    "uploadfromurl-queued": "A súa carga púxose á cola.",
     "uploaddisabledtext": "A carga de ficheiros está desactivada.",
     "php-uploaddisabledtext": "As cargas de ficheiros PHP están desactivadas. Por favor, comprobe a característica file_uploads.",
     "uploadscripted": "Este ficheiro contén código HTML ou script que pode producir erros ao ser interpretado polo navegador.",
     "upload-misc-error": "Erro de carga descoñecido",
     "upload-misc-error-text": "Ocorreu un erro descoñecido durante a carga.\nComprobe que o enderezo URL é válido e accesible e, despois, inténteo de novo.\nSe o problema persiste, póñase en contacto cun [[Special:ListUsers/sysop|administrador]].",
     "upload-too-many-redirects": "O enderezo URL contiña moitas redireccións",
-    "upload-unknown-size": "Tamaño descoñecido",
     "upload-http-error": "Produciuse un erro HTTP: $1",
     "upload-copy-upload-invalid-domain": "A copia de cargas non está dispoñible neste dominio.",
     "backend-fail-stream": "Non se puido transmitir o ficheiro \"$1\".",
     "img-auth-streaming": "Secuenciando \"$1\".",
     "img-auth-public": "A función de img_auth.php é para ficheiros de saída desde un wiki privado.\nEste wiki está configurado como público.\nPara unha seguridade óptima, img_auth.php está desactivado.",
     "img-auth-noread": "O usuario non ten acceso á lectura de \"$1\".",
-    "img-auth-bad-query-string": "O enderezo URL ten unha secuencia de consulta incorrecta.",
     "http-invalid-url": "URL non válido: $1",
     "http-invalid-scheme": "Os enderezos URL co esquema \"$1\" non están soportados",
     "http-request-error": "Erro descoñecido ao enviar a solicitude.",
     "filehist-dimensions": "Dimensións",
     "filehist-filesize": "Tamaño do ficheiro",
     "filehist-comment": "Comentario",
-    "filehist-missing": "Falta o ficheiro",
     "imagelinks": "Uso do ficheiro",
     "linkstoimage": "{{PLURAL:$1|A seguinte páxina liga|As seguintes $1 páxinas ligan}} con esta imaxe:",
     "linkstoimage-more": "Máis {{PLURAL:$1|dunha páxina liga|de $1 páxinas ligan}} con este ficheiro.\nA seguinte lista só mostra {{PLURAL:$1|a primeira páxina que liga|as primeiras $1 páxina que ligan}} con el.\nHai dispoñible [[Special:WhatLinksHere/$2|unha lista completa]].",
     "listgrouprights-removegroup-self": "Pode eliminar {{PLURAL:$2|un grupo|grupos}} pola súa propia conta: $1",
     "listgrouprights-addgroup-self-all": "Pode engadir todos os grupos pola súa propia conta",
     "listgrouprights-removegroup-self-all": "Pode eliminar todos os grupos pola súa propia conta",
+    "trackingcategories": "Categorías de seguimento",
+    "trackingcategories-summary": "Esta páxina lista as categorías de seguimento que o software de MediaWiki enche automaticamente. Pódense alterar os seus nomes modificando as correspondentes mensaxes do sistema no espazo de nomes \"{{ns:8}}\".",
+    "trackingcategories-msg": "Categoría de seguimento",
+    "trackingcategories-name": "Nome da mensaxe",
+    "trackingcategories-desc": "Criterio de inclusión da categoría",
+    "noindex-category-desc": "A páxina non está indexada polos robots porque ten a palabra máxica <code><nowiki>__NOINDEX__</nowiki></code> e está nun espazo de nomes no que esa marca está permitida.",
+    "index-category-desc": "A páxina contén a palabra máxica <code><nowiki>__INDEX__</nowiki></code> (e está nun espazo de nomes no que esa marca está permitida) e, polo tanto, será indexada polos bots cando non debera selo normalmente.",
+    "post-expand-template-inclusion-category-desc": "Despois de expandir todos os modelos, o tamaño da páxina é maior que <code>$wgMaxArticleSize</code>; algúns modelos non se expandiron.",
+    "post-expand-template-argument-category-desc": "Despois de expandir o argumento dun modelo (algo entre chaves triples, como <code>{{{Proba}}}</code>), a páxina é maior que <code>$wgMaxArticleSize</code>.",
+    "expensive-parserfunction-category-desc": "Hai demasiadas funcións analíticas custosas (como <code>#ifexist</code>) incluídas nunha páxina. Consulte [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit Manual:$wgExpensiveParserFunctionLimit].",
+    "broken-file-category-desc": "Categoría engadida se a páxina contén unha ligazón de ficheiro rota (unha ligazón para incorporar un ficheiro cando o ficheiro non existe).",
+    "hidden-category-category-desc": "Esta é unha categoría coa palabra máxica <code><nowiki>__HIDDENCAT__</nowiki></code>, que impide que se mostre por defecto na caixa de categorías das páxinas.",
+    "trackingcategories-nodesc": "Non hai ningunha descrición dispoñible.",
+    "trackingcategories-disabled": "A categoría está desactivada",
     "mailnologin": "Non existe enderezo para o envío",
     "mailnologintext": "Debe [[Special:UserLogin|acceder ao sistema]] e ter rexistrado un enderezo de correo electrónico válido nas súas [[Special:Preferences|preferencias]] para enviar correos electrónicos a outros usuarios.",
     "emailuser": "Enviar un correo electrónico a {{GENDER:{{BASEPAGENAME}}|este usuario|esta usuaria}}",
     "emailuser-title-notarget": "Enviar un correo electrónico a un usuario",
     "emailpage": "Enviar un correo electrónico a un usuario",
     "emailpagetext": "Pode usar o seguinte formulario para enviar unha mensaxe de correo electrónico a {{GENDER:$1|este usuario|esta usuaria}}.\nO enderezo de correo electrónico que inseriu [[Special:Preferences|nas súas preferencias]] aparecerá no campo \"De:\" do correo, polo que {{GENDER:$1|o receptor|a receptora}} da mensaxe poderá responderlle directamente.",
-    "usermailererror": "O obxecto enviado deu unha mensaxe de erro:",
     "defemailsubject": "Correo electrónico do usuario $1 de {{SITENAME}}",
     "usermaildisabled": "O correo electrónico do usuario está desactivado",
     "usermaildisabledtext": "Non pode enviar correos electrónicos a outros usuarios deste wiki",
     "noemailtitle": "Sen enderezo de correo electrónico",
     "noemailtext": "Este usuario non especificou un enderezo de correo electrónico válido.",
-    "nowikiemailtitle": "Sen correo electrónico habilitado",
     "nowikiemailtext": "Este usuario elixiu non recibir correos electrónicos doutros usuarios.",
     "emailnotarget": "O nome de usuario do destinatario non existe ou é incorrecto.",
     "emailtarget": "Introduza o nome de usuario do destinatario",
     "nowatchlist": "Non ten elementos na súa lista de vixilancia.",
     "watchlistanontext": "Debe $1 para ver ou editar os elementos da súa lista de vixilancia.",
     "watchnologin": "Non accedeu ao sistema",
-    "watchnologintext": "Debe [[Special:UserLogin|acceder ao sistema]] para modificar a súa lista de vixilancia.",
     "addwatch": "Engadir á lista vixilancia",
     "addedwatchtext": "A páxina \"[[:$1]]\" foi engadida á súa [[Special:Watchlist|lista de vixilancia]].\nOs cambios futuros nesta páxina e na súa páxina de conversa asociada serán listados alí.",
     "removewatch": "Eliminar da lista de vixilancia",
     "watching": "Vixiando...",
     "unwatching": "Deixando de vixiar...",
     "watcherrortext": "Houbo un erro ao cambiar as súas opcións de vixilancia para a páxina \"$1\".",
-    "enotif_mailer": "Sistema de notificacións por correo de {{SITENAME}}",
     "enotif_reset": "Marcar todas as páxinas como visitadas",
     "enotif_impersonal_salutation": "Usuario de {{SITENAME}}",
     "enotif_subject_deleted": "{{GENDER:$2|$2}} borrou a páxina chamada \"$1\" en {{SITENAME}}",
     "excontent": "o contido era: \"$1\"",
     "excontentauthor": "o contido era: \"$1\" (e o único editor foi [[Special:Contributions/$2|$2]])",
     "exbeforeblank": "o contido antes do baleirado era: \"$1\"",
-    "exblank": "a páxina estaba baleira",
     "delete-confirm": "Borrar \"$1\"",
     "delete-legend": "Borrar",
     "historywarning": "'''Atención:''' A páxina que está a piques de borrar ten un historial con aproximadamente $1 {{PLURAL:$1|revisión|revisións}}:",
     "sp-contributions-newbies-sub": "Contribucións dos usuarios novos",
     "sp-contributions-newbies-title": "Contribucións dos usuarios novos",
     "sp-contributions-blocklog": "rexistro de bloqueos",
+    "sp-contributions-suppresslog": "contribucións borradas do usuario",
     "sp-contributions-deleted": "contribucións borradas do usuario",
     "sp-contributions-uploads": "cargas",
     "sp-contributions-logs": "rexistros",
     "sp-contributions-blocked-notice": "Este usuario está bloqueado. Velaquí está a última entrada do rexistro de bloqueos, por se quere consultala:",
     "sp-contributions-blocked-notice-anon": "Este enderezo IP está bloqueado.\nVelaquí está a última entrada do rexistro de bloqueos, por se quere consultala:",
     "sp-contributions-search": "Busca de contribucións",
-    "sp-contributions-suppresslog": "contribucións borradas do usuario",
     "sp-contributions-username": "Enderezo IP ou nome de usuario:",
     "sp-contributions-toponly": "Mostrar só as últimas revisións",
     "sp-contributions-newonly": "Mostrar só as edicións que crearon páxinas",
     "allmessagesname": "Nome",
     "allmessagesdefault": "Texto predeterminado",
     "allmessagescurrent": "Texto actual",
-    "allmessagestext": "Esta é unha lista de todas as mensaxes dispoñibles no espazo de nomes MediaWiki.\nPor favor, visite a páxina de [https://www.mediawiki.org/wiki/Localisation localización de MediaWiki] e [//translatewiki.net translatewiki.net] se quere contribuír á localización xenérica de MediaWiki.",
+    "allmessagestext": "Esta é unha lista de todas as mensaxes dispoñibles no espazo de nomes MediaWiki.\nPor favor, visite a páxina de [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation localización de MediaWiki] e [//translatewiki.net translatewiki.net] se quere contribuír á localización xenérica de MediaWiki.",
     "allmessagesnotsupportedDB": "Esta páxina non está dispoñible porque '''$wgUseDatabaseMessages''' está desactivado.",
     "allmessages-filter-legend": "Filtrar",
     "allmessages-filter": "Filtrar por estado de personalización:",
     "importunknownsource": "Fonte de importación descoñecida",
     "importcantopen": "Non se pode abrir o ficheiro importado",
     "importbadinterwiki": "Ligazón interwiki incorrecta",
-    "importnotext": "Baleiro ou sen texto",
     "importsuccess": "A importación rematou!",
-    "importhistoryconflict": "Existe un conflito no historial de revisións (se cadra, xa se importou esta páxina anteriormente)",
     "importnosources": "Non se defininiu ningunha fonte de importación transwiki e os envíos directos dos historiais están desactivados.",
     "importnofile": "Non se enviou ningún ficheiro de importación.",
     "importuploaderrorsize": "Fallou o envío do ficheiro de importación. O ficheiro é máis grande que o tamaño de envío permitido.",
     "version-entrypoints": "Enderezos URL de punto de entrada",
     "version-entrypoints-header-entrypoint": "Punto de entrada",
     "version-entrypoints-header-url": "URL",
-    "version-entrypoints-articlepath": "[https://www.mediawiki.org/wiki/Manual:$wgArticlePath Ruta dos artigos]",
-    "version-entrypoints-scriptpath": "[https://www.mediawiki.org/wiki/Manual:$wgScriptPath Ruta das escrituras]",
+    "version-entrypoints-articlepath": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgArticlePath Ruta dos artigos]",
+    "version-entrypoints-scriptpath": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgScriptPath Ruta das escrituras]",
     "redirect": "Redirixir por nome de ficheiro, ID de usuario, ID de páxina ou ID de revisión",
     "redirect-legend": "Redirixir a un ficheiro ou unha páxina",
     "redirect-summary": "Esta páxina especial redirixe cara a un ficheiro (dado o nome), unha páxina (dado o ID da páxina ou o dunha revisión) ou unha páxina de usuario (dado o ID dun usuario). Utilización: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]] ou [[{{#Special:Redirect}}/user/101]].",
     "redirect-submit": "Continuar",
     "redirect-lookup": "Procurar:",
     "redirect-value": "Valor:",
-    "redirect-user": "ID de usuario",
+    "redirect-user": "Id. do usuario",
     "redirect-page": "ID de páxina",
     "redirect-revision": "Revisión de páxina",
     "redirect-file": "Nome de ficheiro",
     "limitreport-templateargumentsize": "Tamaño dos argumentos do modelo",
     "limitreport-templateargumentsize-value": "$1/$2 {{PLURAL:$2|byte|bytes}}",
     "limitreport-expansiondepth": "Máxima profundidade de expansión",
-    "limitreport-expensivefunctioncount": "Número de funcións de análise custosas",
+    "limitreport-expensivefunctioncount": "Número de funcións analíticas custosas",
     "expandtemplates": "Expandir os modelos",
     "expand_templates_intro": "Esta páxina especial toma texto e expande todos os modelos dentro del recursivamente.\nTamén expande as funcións de análise como\n<code><nowiki>{{</nowiki>#language:…}}</code> e variables como\n<code><nowiki>{{</nowiki>CURRENTDAY}}</code>.\nDe feito, expande case calquera cousa entre dúas chaves.",
     "expand_templates_title": "Título do contexto, para {{FULLPAGENAME}} etc.:",
index 376f895..339c540 100644 (file)
     "disclaimers": "Chotraio",
     "disclaimerpage": "Project:Sadeo chotraio",
     "edithelp": "Sudarunk palov",
-    "helppage": "Help:Mozkur",
     "mainpage": "Mukhel Pan",
     "mainpage-description": "Mukhel Pan",
     "portal": "Somudaik proves-dar",
index 53ba295..f0c6be3 100644 (file)
     "disclaimers": "𐍅𐌰𐌳𐌾𐍉𐌱𐌹𐌻𐌰𐌲𐌴𐌹𐌽𐍃",
     "disclaimerpage": "Project:𐍅𐌰𐌳𐌾𐌹𐍃 𐌱𐌹𐌻𐌰𐌲𐌴𐌹𐌽𐍃",
     "edithelp": "𐌼𐌰𐌹𐌳𐌴𐌹𐌽𐌹𐌷𐌹𐌻𐍀𐌰",
-    "helppage": "Help:𐌷𐌰𐌿𐌱𐌹𐌳𐌰𐍃𐌴𐌹𐌳𐍉",
     "mainpage": "𐌷𐌰𐌿𐌱𐌹𐌳𐌰𐍃𐌴𐌹𐌳𐍉",
     "mainpage-description": "𐌷𐌰𐌿𐌱𐌹𐌳𐌰𐍃𐌴𐌹𐌳𐍉",
     "portal": "𐌱𐌰𐌿𐍂𐌲𐌹𐍃 𐌲𐌰𐍅𐌹",
index b0a5147..75e3690 100644 (file)
     "accountcreatedtext": "S Benutzerkonto fir [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|Diskussion]]) isch aagleit wore.",
     "createaccount-title": "Aalege vum e Benutzerkonto fir {{SITENAME}}",
     "createaccount-text": "Fir Dii isch e Benutzerkonto \"$2\" uf {{SITENAME}} ($4) aaglait wore. S Passwort fir \"$2\" , wu automatisch generiert woren isch, isch \"$3\". Du sottsch Di jetz aamälde un s Passwort ändere.\n\nWänn s Benutzerkonto us Versäh aaglait woren isch, chasch die Nochricht ignoriere.",
-    "usernamehasherror": "In Benutzernäme derf s kei Rautezeiche din haa",
     "login-throttled": "Du hesch z vilmol umesuscht versuecht, Di aazmälde. Bitte wart $1, voreb Du s non emol versuechsch.",
     "login-abort-generic": "Dyy Aamäldig isch nit erfolgryych gsii – Abbroche",
     "loginlanguagelabel": "Sproch: $1",
     "suspicious-userlogout": "Dyy Versuech di abzmälde isch abbroche wore, wel s uusgsäh het, wie wänn s vun eme bschedigte Browser oder eme Cacheproxy uus gsändet woren isch.",
     "createacct-another-realname-tip": "Dr richtig Name isch optional.\nWänn Du ne aagiisch, wird er bruucht fir d Zueornig vu dr Byytreg.",
+    "pt-login": "Aamälde",
+    "pt-login-button": "Aamälde",
+    "pt-createaccount": "Nöis Benutzerkonto aalege",
+    "pt-userlogout": "Abmälde",
     "php-mail-error-unknown": "Nit bekannte Fähler mit dr Funktion mail() vu PHP",
     "user-mail-no-addy": "Es isch versuecht worde e E-Mail ohni Angab vunere E-Mail-Adräss z verschigge.",
     "user-mail-no-body": "S isch versuecht wore, ne E-Mail mit eme lääre oder z churze Tekscht z verschicke.",
     "prefs-skin": "Benutzeroberflechi",
     "skin-preview": "Vorschou",
     "datedefault": "kei Aagab",
-    "prefs-beta": "Betafunktione",
-    "prefs-datetime": "Datum un Zyt",
     "prefs-labs": "Alphafunktione",
     "prefs-user-pages": "Benutzersyte",
     "prefs-personal": "Benutzerdate",
     "upload-permitted": "Dateitype, wu erlaubt sin: $1.",
     "upload-preferred": "Dateitype, wu bevorzugt sin: $1.",
     "upload-prohibited": "Dateitype, wu nit erlaubt sin: $1.",
-    "uploadlog": "Datei-Logbuech",
     "uploadlogpage": "Dateie-Logbuech",
     "uploadlogpagetext": "Des isch s Logbuech vu dr uffegladene Dateie.\nLueg au d [[Special:NewFiles|Galerii vu neije Dateie]] fir e visuälle Iberblick.",
     "filename": "Dateiname",
     "filereuploadsummary": "Dateiänderige:",
     "filestatus": "Urheberrächts-Status:",
     "filesource": "Quälle:",
-    "uploadedfiles": "Uffegladeni Dateie",
     "ignorewarning": "Warnig ignoriere un d Datei spychere",
     "ignorewarnings": "Warnige ignoriere",
     "minlength1": "Dateinäme mien zmindescht e Buechstab lang syy.",
     "overwroteimage": "het e neiji Version vu „[[$1]]“ uffeglade",
     "uploaddisabled": "Uffelade deaktiviert",
     "copyuploaddisabled": "S Uffelade iber URL isch abschalte wore.",
-    "uploadfromurl-queued": "Dyy Uffeladig isch jetz in dr Warteschlang.",
     "uploaddisabledtext": "S Uffelade vu Dateie isch deaktiviert.",
     "php-uploaddisabledtext": "S Uffelade vu PHP-Dateie isch deaktiviert wore. Bitte iberprief d file_uploads-Yystellig.",
     "uploadscripted": "In däre Datei git s HTML- oder Scriptcode, wu fälschligerwyys vun eme Webbrowser usgfiert chennt were.",
     "upload-misc-error": "Nit bekannte Fähler bim Uffelade",
     "upload-misc-error-text": "Bim Uffelade isch e nit bekannte Fähler uftrette.\nPrief d URL uf Fähler un dr Online-Status vu dr Syte un versuech s no mol.\nWänn s Problem alno uftritt, informier e [[Special:ListUsers/sysop|Ammann]].",
     "upload-too-many-redirects": "In dr URL het s zvyl Wyterleitige",
-    "upload-unknown-size": "Nit bekannti Greßi",
     "upload-http-error": "E HTTP-Fähler isch ufträtte: $1",
     "upload-copy-upload-invalid-domain": "As Kopi uffeladbari Dateie sin iber die Domain nit verfiegbar.",
     "backend-fail-stream": "D Datei $1 het nit chenne ibertrait wäre.",
     "img-auth-streaming": "Am Lade vu „$1“.",
     "img-auth-public": "img_auth.php git Dateie vun eme privaten Wiki uus.\nDes Wiki isch as effentlig Wiki konfiguriert.\nUs Sicherheitsgrinde isch img_auth.php deaktiviert.",
     "img-auth-noread": "Benutzer derf „$1“ nit läse.",
-    "img-auth-bad-query-string": "D URL wyst e nit giltigi Abfrogzeichnefolg uf.",
     "http-invalid-url": "Nit giltigi URL: $1",
     "http-invalid-scheme": "URL mit em Schema „$1“ wäre nit unterstitzt",
     "http-request-error": "Fähler bim Verschicke vu dr Aafrog.",
     "filehist-dimensions": "Mäß",
     "filehist-filesize": "Dateigrößi",
     "filehist-comment": "Kommentar",
-    "filehist-missing": "Datei fählt",
     "imagelinks": "Verwändig vu dr Datei",
     "linkstoimage": "Di {{PLURAL:$1|Syte|$1 Sytene}} händ en Link zu dem Bild:",
     "linkstoimage-more": "Meh as {{PLURAL:$1|ei Syte verwyyst|$1 Syte verwyyse}} uf die Datei.\nDie Lischt zeigt nume {{PLURAL:$1|dr erscht Link|di erschte $1 Link}} uf die Datei.\nE [[Special:WhatLinksHere/$2|vollständigi Lischt]] isch verfiegbar.",
     "emailuser-title-notarget": "E-Mail an Benutzer",
     "emailpage": "E-Mail an Benutzer",
     "emailpagetext": "Du chasch {{GENDER:$1|em Benutzer|dr Benutzeri}} mit däm Formular e E-Mail schicke.\nAs Absender wird d E-Mail-Adräss us Dyyne [[Special:Preferences|Yystellige]] yytrait, ass {{GENDER:$1|dr Benutzer|d Benutzeri}} Dir cha Antwort gee.",
-    "usermailererror": "S Mail-Objekt het e Fähler zruckgee:",
     "defemailsubject": "{{SITENAME}}-E-Mail vum Benutzer „$1“",
     "usermaildisabled": "Benutzer-E-Mail abgstellt",
     "usermaildisabledtext": "Du chasch in däm Wiki kei E-Mail an anderi Benutzer schicke",
     "noemailtitle": "Kei e-Mail-Adrässe",
     "noemailtext": "Dää Benutzer het kei bstätigti E-Mail-Adräss aagee oder wet kei E-Mail vo andere Benutzer.",
-    "nowikiemailtitle": "Kei E-Mail Versand mögli",
     "nowikiemailtext": "De Benutzer möcht kei E-Mails vo andri Benutzer erhalte",
     "emailnotarget": "Benutzername fir dr Empfang vun ere E-Mail git s nit oder isch nit giltig.",
     "emailtarget": "Dr Benutzername vum Empfänger yygee",
     "nowatchlist": "Du hesch ke Yträg uf dyre Beobachtigslischte.",
     "watchlistanontext": "Du muesch Di $1 go Dyyni Beobachtungslischt z säh oder go Yytreg uf ere bearbeite.",
     "watchnologin": "Du bisch nit aagmäldet",
-    "watchnologintext": "Du muesch [[Special:UserLogin|aagmäldet]] syy, zum Dyyni Beobachtigssyte z bearbeite.",
     "addwatch": "zue de Beobachtigslischte derzue tue",
     "addedwatchtext": "D Syte \"[[:$1]]\" stoht jetz uf Dyyre [[Special:Watchlist|Beobachtigslischt]].\nNeji Änderige an dr Syte oder dr Diskussionssyte drvo chasch jetz dert säh.",
     "removewatch": "Us der Beobachtigsliste usegnuu",
     "watching": "Am beobachte …",
     "unwatching": "Nümm am beobachten …",
     "watcherrortext": "Bim Ändere vu dr Beobachtigslischtenyystellige fir „$1“ het s e Fähler gee.",
-    "enotif_mailer": "{{SITENAME}} E-Mail-Benochrichtigungsdienscht",
     "enotif_reset": "Alli Syte as aagluegt markiere",
     "enotif_impersonal_salutation": "{{SITENAME}}-Benutzer",
     "enotif_subject_deleted": "{{SITENAME}}-Syte $1 isch vu {{GENDER:$2|$2}} glescht wore",
     "excontent": "Alter Inhalt: '$1'",
     "excontentauthor": "einzige Inhalt: '$1' (bearbeitet worde nume dür '$2')",
     "exbeforeblank": "Inhalt voreb d Syte gläärt woren isch: '$1'",
-    "exblank": "Syte isch läär gsi",
     "delete-confirm": "„$1“ lesche",
     "delete-legend": "Lesche",
     "historywarning": "'''Warnig:'''  Die Syte, wu Du wit lesche, het e Versionsgschicht mit schetzigswyys $1 {{PLURAL:$1|Version|Versione}}:",
     "allmessagesname": "Name",
     "allmessagesdefault": "Standardtext",
     "allmessagescurrent": "jetzige Tekscht",
-    "allmessagestext": "Des isch e Lischt vu allene meglige Syschtemnochrichte us em MediaWiki Namensruum.\nLueg au uf [https://www.mediawiki.org/wiki/Localisation MediaWiki Lokalisierig] un [//translatewiki.net translatewiki.net], wänn Du zue dr MediaWiki-Lokalisierig wit byytrage.",
+    "allmessagestext": "Des isch e Lischt vu allene meglige Syschtemnochrichte us em MediaWiki Namensruum.\nLueg au uf [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation MediaWiki Lokalisierig] un [//translatewiki.net translatewiki.net], wänn Du zue dr MediaWiki-Lokalisierig wit byytrage.",
     "allmessagesnotsupportedDB": "'''{{ns:special}}:Allmessages''' cha nit bruucht wärde will '''$wgUseDatabaseMessages''' abgschalte isch.",
     "allmessages-filter-legend": "Filter",
     "allmessages-filter": "Filter fir dr aapasst Zuestand:",
     "importunknownsource": "Importquell isch unbekannt",
     "importcantopen": "D Importdatei het nit chenne ufgmacht wäre.",
     "importbadinterwiki": "Falscher Interwiki-Link",
-    "importnotext": "Leer oder kei Teggscht",
     "importsuccess": "Dr Import isch abgschlosse.",
-    "importhistoryconflict": "Es het scho ältri Versione wo mit dere kollidiere. Es isch mögli dass die Syte scho emool importiert worde isch.",
     "importnosources": "Für de Transwiki-Import sin kei Quelle definiert worde. Wege dem isch s direkte Ufelade vo Gschichtsversione gsperrt.",
     "importnofile": "Es isch kei Importdatei ufeglade worde.",
     "importuploaderrorsize": "S Ufelade vo dr Importdatei isch misslunge. D Datei isch grösser als erlaubt isch.",
     "hours": "{{PLURAL:$1|1 Stund|$1 Stunde}}",
     "days": "{{PLURAL:$1|1 Tag|$1 Täg}}",
     "ago": "vor $1",
+    "sunday-at": "Sunntig am $1",
+    "yesterday-at": "Geschtert am $1",
     "bad_image_list": "Format:\n\nNume Zylene, wo mit emne * afö, wärde berücksichtigt.\nNach em * mues zersch e Link zuren Unerwünschte Datei cho.\nWyteri Links uf der glyche Zyle wärden als Usnahme behandlet, wo die Datei trotzdäm darff vorcho.",
     "metadata": "Metadate",
     "metadata-help": "Die Datei het wyteri Informatione, allwäg vor Digitalkamera oder vom Scanner wo se het gschaffe.\nWe die Datei isch veränderet worde, de cha's sy, das die zuesätzlechi Information für di verändereti Datei nümm richtig zuetrifft.",
     "imgmultipagenext": "nächschti Syte →",
     "imgmultigo": "Gang!",
     "imgmultigoto": "Gang uf Syte $1",
+    "img-lang-default": "(Standardsproch)",
+    "img-lang-info": "Des Bild in $1 rendere. $2",
+    "img-lang-go": "Gang",
     "ascending_abbrev": "uf",
     "descending_abbrev": "ab",
     "table_pager_next": "Näggschti Syte",
     "version-hook-subscribedby": "Ufruef vu",
     "version-version": "(Version $1)",
     "version-license": "Lizänz",
+    "version-ext-license": "Lizänz",
+    "version-ext-colheader-name": "Erwyterig",
+    "version-ext-colheader-license": "Lizänz",
+    "version-ext-colheader-description": "Bschryybig",
+    "version-ext-colheader-credits": "Autore",
+    "version-license-title": "Lizänz fir $1",
+    "version-license-not-found": "S sin keini detaillierte Lizänzinformatione fir die Erwyterig gfunde wore.",
+    "version-credits-title": "Danksagige fir $1",
+    "version-credits-not-found": "S sin keini detaillierte Danksagigsinformatione fir die Erwyterig gfunde wore.",
     "version-poweredby-credits": "Die Websyte nutzt '''[https://www.mediawiki.org/wiki/MediaWiki/de MediaWiki]''', Copyright © 2001–$1 $2.",
     "version-poweredby-others": "anderi",
+    "version-poweredby-translators": "Ibersetzer vu translatewiki.net",
     "version-credits-summary": "Mir danke däne Lyt fir ihri Bytreg zue [[Special:Version|MediaWiki]].",
     "version-license-info": "MediaWiki isch e freji Software, d. h. s cha, no dr Bedingige vu dr GNU General Public-Lizänz, wu vu dr Free Software Foundation vereffentligt woren isch, wyterverteilt un/oder modifiziert wäre. Doderbyy cha d Version 2, oder no eigenem Ermässe, jedi nejeri Version vu dr Lizänz brucht wäre.\n\nDes Programm wird in dr Hoffnig verteilt, ass es nitzli isch, aber OHNI JEDI GARANTI un sogar ohni di impliziert Garanti vun ere MÄRTGÄNGIGKEIT oder EIGNIG FIR E BSTIMMTE ZWÄCK. Doderzue git meh Hiiwys in dr GNU General Public-Lizänz.\n\nE [{{SERVER}}{{SCRIPTPATH}}/COPYING Kopi vu dr GNU General Public-Lizänz] sott zämme mit däm Programm verteilt wore syy. Wänn des nit eso isch, cha ne Kopi bi dr Free Software Foundation Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA, schriftli aagforderet oder [//www.gnu.org/licenses/old-licenses/gpl-2.0.html online gläse] wäre.",
     "version-software": "Installierti Software",
     "version-entrypoints": "Yygangspunkt-URL",
     "version-entrypoints-header-entrypoint": "Yygangspunkt",
     "version-entrypoints-header-url": "URL",
+    "redirect": "Wyterleitig uf Benutzersyte, Syte, Syteversion oder Datei",
+    "redirect-legend": "Wyterleitig uf e Datei oder e Syte",
+    "redirect-summary": "Die Spezialsyte leitet wyter uf e Benutzersyte (numerischi Benutzerkännig aagee), Syte (Sytekännig aagee), Syteversion (Versionskännig aagee) oder Datei (Dateiname aagee). Benutzig: [[{{#Special:Redirect}}/user/101]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]] oder [[{{#Special:Redirect}}/file/Example.jpg]].",
+    "redirect-submit": "Gang",
+    "redirect-lookup": "Sueche:",
+    "redirect-value": "Wärt:",
+    "redirect-user": "Benutzer-ID",
+    "redirect-page": "Syten-ID",
+    "redirect-revision": "Syteversion",
+    "redirect-file": "Dateiname",
+    "redirect-not-exists": "Wärt nit gfunde",
     "fileduplicatesearch": "Datei-Duplikat sueche",
     "fileduplicatesearch-summary": "Suech no Datei-Duplikat uf dr Grundlag vu ihrem Hash-Wärt.",
     "fileduplicatesearch-legend": "No Duplikat sueche",
     "fileduplicatesearch-result-n": "D Datei „$1“ het {{PLURAL:$2|1 identisch Duplikat|$2 identischi Duplikat}}.",
     "fileduplicatesearch-noresults": "S isch kei Datei mit em Name „$1“ gfunde wore.",
     "specialpages": "Spezialsytene",
-    "specialpages-note": "* Reguläri Spezialsyte\n* <span class=\"mw-specialpagerestricted\">Zuegriffsbschränkti Spezialsyte</span>\n* <span class=\"mw-specialpagecached\">Gecachti Spezialsyte (dr Inhalt ist villicht veraltet.)</span>",
+    "specialpages-note-top": "Zeichenerklärig:",
+    "specialpages-note": "* Normali Spezialsyte.\n* <span class=\"mw-specialpagerestricted\">Spezialsyte mit bschränktem Zuegang.</span>",
     "specialpages-group-maintenance": "Wartigslischte",
     "specialpages-group-other": "Andri Spezialsyte",
     "specialpages-group-login": "Aamälde/Konto aalege",
     "tags": "Änderigs-Tag priefe",
     "tag-filter": "[[Special:Tags|Markierigs]]filter:",
     "tag-filter-submit": "Filter",
+    "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|Markierig|Markierige}}]]: $2)",
     "tags-title": "Tag",
     "tags-intro": "Die Syte zeigt alli Tag, wu Bearbeitige mit markiert wäre un derzue d Bedytig vun ene.",
     "tags-tag": "Markierigsname",
     "tags-display-header": "Benännig uf dr Änderigslischte",
     "tags-description-header": "Vollständigi Bschryybig",
     "tags-hitcount-header": "Markierti Änderige",
+    "tags-active-yes": "Jo",
+    "tags-active-no": "Nei",
     "tags-edit": "bearbeite",
     "tags-hitcount": "$1 {{PLURAL:$1|Änderig|Änderige}}",
     "comparepages": "Syte verglyyche",
     "dberr-problems": "Excusez! Die Seite het im Momänt tächnischi Schwirigkeite.",
     "dberr-again": "Wart e paar Minute un lad derno nej.",
     "dberr-info": "(Cha kei Verbindig zum Datebank-Server härstelle: $1)",
+    "dberr-info-hidden": "(Cha kei Verbindig zum Datebank-Server härstelle)",
     "dberr-usegoogle": "Du chenntsch in dr Zwischezyt mit Google sueche.",
     "dberr-outofdate": "Obacht: Dr Suechindex vu unsere Syte chennt veraltet syy.",
     "dberr-cachederror": "Des isch e Kopii vum Cache vu dr Syte, wu Du aagforderet hesch, un chennt veraltet syy.",
     "htmlform-submit": "Ibertrage",
     "htmlform-reset": "Änderige ruckgängig mache",
     "htmlform-selectorother-other": "Anderi",
+    "htmlform-no": "Nei",
+    "htmlform-yes": "Jo",
+    "htmlform-chosen-placeholder": "Wehl en Option",
     "sqlite-has-fts": "$1 mit Unterstitzig vu dr Volltextsuechi",
     "sqlite-no-fts": "$1 ohni Unterstitzig vu dr Volltextsuechi",
     "logentry-delete-delete": "$1 het d Syte $3 glöscht",
index fad6812..3ccc31e 100644 (file)
     "accountcreatedtext": "[[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|talk]]) માટે સભ્ય ખાતું બનાવવામાં આવ્યું છે.",
     "createaccount-title": "{{SITENAME}} માટે ખાતુ બનાવ્યું",
     "createaccount-text": "કોઇકે {{SITENAME}} ($4) પર, નામ \"$2\", ગુપ્તસંજ્ઞા \"$3\", શાથે તમારા ઇ-મેઇલ એડ્રેસ માટે ખાતુ બનાવેલ છે.\n\nતમે હવે પ્રવેશ કરી અને ગુપ્તસંજ્ઞા બદલી શકો છો.\n\nજો આ ખાતુ ભુલથી બનેલું હોય તો,આ સંદેશને અવગણી શકો છો.",
-    "usernamehasherror": "સભ્યનામમાં ગડબડિયા ચિહ્નો ન હોઈ શકે",
     "login-throttled": "તમે હાલમાં ઘણાં જ પ્રવેશ પ્રયત્નો કર્યા છે.\nકૃપા કરી ફરી પ્રયત્ન કરતાં પહેલાં $1 રાહ જુઓ.",
     "login-abort-generic": "તમારું પ્રવેશ નિષ્ફળ થયું - છોડી દેવાયું",
     "loginlanguagelabel": "ભાષા: $1",
     "prefs-skin": "ફલક",
     "skin-preview": "ફેરફાર બતાવો",
     "datedefault": "મારી પસંદ",
-    "prefs-beta": "બીટા લક્ષણો",
-    "prefs-datetime": "તારીખ અને સમય",
     "prefs-labs": "પ્રયોગશાળા લક્ષણો",
     "prefs-user-pages": "સભ્ય પાનાંઓ",
     "prefs-personal": "સભ્ય ઓળખ",
     "recentchanges-label-bot": "આ ફેરફાર બોટ દ્વારા કરાયો છે",
     "recentchanges-label-unpatrolled": "આ ફેરફાર હજી ચકાસાયો નથી",
     "recentchanges-label-plusminus": "પાનાનું કદ આપેલા અંકો જેટલાં બાઈટ્સ જેટલું બદલ્યુ છે.",
+    "recentchanges-legend-heading": "'''કળ:'''",
     "recentchanges-legend-newpage": "([[Special:NewPages|નવા પાનાઓની યાદી]] પણ જુઓ)",
     "rcnotefrom": "નીચે <strong>$2</strong> થી ફેરફારો દર્શાવેલ છે (<strong>$1</strong> સુધી દર્શાવલે છે).",
     "rclistfrom": "$1 બાદ થયેલા નવા ફેરફારો બતાવો",
     "rcshowhidebots": "બૉટો $1",
     "rcshowhidebots-show": "બતાવો",
     "rcshowhidebots-hide": "છુપાવો",
-    "rcshowhideliu": "$1 નોંધણી કરેલ સભ્યો",
+    "rcshowhideliu": "નોંધણી કરેલા સભ્યો $1",
     "rcshowhideliu-show": "બતાવો",
     "rcshowhideliu-hide": "છુપાવો",
     "rcshowhideanons": "અનામી સભ્યો $1",
     "upload-permitted": "રજામંદ ફાઈલ પ્રકારો: $1.",
     "upload-preferred": "ઈચ્છીત ફાઈલ પ્રકારો: $1.",
     "upload-prohibited": "પ્રતિબંધીત ફાઈલ પ્રકારો: $1.",
-    "uploadlog": "ચઢાવેલી ફાઇલોનું માહિતિ પત્રક",
     "uploadlogpage": "ચઢાવેલી ફાઇલોનું માહિતિ પત્રક",
     "uploadlogpagetext": "નીચે હાલમાં ચડાવેલી ફાઇલોની યાદી છે.\nવધુ ફાઇલો દ્રશમાન કરવા [[Special:NewFiles|gallery of new files]] જુઓ",
     "filename": "ફાઇલ નામ",
     "filereuploadsummary": "ફાઈલ ફેરફારો",
     "filestatus": "પ્રકાશનાધિકાર સ્થિતિ",
     "filesource": "સ્રોત:",
-    "uploadedfiles": "ફાઇલ ચડાવો",
     "ignorewarning": "ચેતવણીને અવગણી ને પણ ફાઇલ સાચવો",
     "ignorewarnings": "કોઇ પણ ચેતવણી અવગણો",
     "minlength1": "ફાઇલ નામની લંબાઇ કમ સે કમ એક અક્ષર જેટલી તો હોવી જ જોઇએ.",
     "overwroteimage": " \"[[$1]]\" ની નવી આવૃત્તિ ચઢાવો.",
     "uploaddisabled": "ફાઇલ ચઢાવ પ્રતિબંધિત",
     "copyuploaddisabled": "URL દ્વાર ફાઇલ ચઢાવ પ્રતિબંધિત",
-    "uploadfromurl-queued": "તમારી ચઢાવેલી ફાઇલ કતારમાં ઉમેરાઇ છે.",
     "uploaddisabledtext": "ફાઇલ ચઢાવવું નિષ્ક્રીય બનાવ્યું છે",
     "php-uploaddisabledtext": "PHPમાં ફાઇલ અપલોડ નિષ્ક્રીય કરી દેવાયો છે.\nફાઇલ ચડાવવાના વિકલ્પ ફરી તપાસો.",
     "uploadscripted": "આ ફાઇલ HTML કે અન્ય સ્ક્રીપ્ટ કોડ ધરાવે છે જે વેબ બ્રાઉઝર દ્વારા ભૂલથી ઉપયોગમાં લઇ શકાય છે.",
     "upload-misc-error": "અજ્ઞાત ફાઇલ ચડાવ ચૂક",
     "upload-misc-error-text": "ફાઈલ ચડાવતી વખતે કાંઇક ત્રુટિ રહી ગઇ.\nખાત્રી કરો કે URL વૈધ છે અને સક્રીય છે અને ફરી પ્રયત્ન કરો.\nતેમ છતાં પણ  પ્રોબ્લેમ રહે તો અહીં સંપર્ક કરશો [[Special:ListUsers/sysop|administrator]].",
     "upload-too-many-redirects": "URLમાં ઘણાં ઉપ નિર્દેશનો છે.",
-    "upload-unknown-size": "અજ્ઞાત કદ",
     "upload-http-error": " HTTP ત્રુટિ : $1",
     "upload-copy-upload-invalid-domain": "આ વેબસાઇટ પરથી ફાઈલ નહીં ચડાવાય.",
     "backend-fail-stream": "ફાઈલ $1 ને લાવી ન શકાઈ.",
     "img-auth-streaming": "ચિત્ર માહીતી  \"$1\" ઉતરી રહી છે.",
     "img-auth-public": "img_auth.php દ્વારા કાર્યાન્વીત થતી ક્રિયા નીજી વિકિ માંથી ફાઇલ કાઢવા વપરાય છે. \nઆ વિકિ ની ગોઠવણ જન વિકી તરીકે થયેલી છે.\nમહત્તમ સુરક્ષા માટે, img_auth.php ને નિષ્ક્રિય કરાઇ છે.",
     "img-auth-noread": "\"$1\" વાંચવાને સભ્યને પરવાનગી નથી.",
-    "img-auth-bad-query-string": "આ URL માં અમાન્ય ક્વેરી શબ્દમાળા છે",
     "http-invalid-url": "અવૈધ URL: $1",
     "http-invalid-scheme": "$1 પદ્ધતિના URLs અહીં ચાલતી નથી",
     "http-request-error": "અજ્ઞાત ત્રુટીને કારણે HTTP અરજી નિષ્ફળ",
     "filehist-dimensions": "પરિમાણો",
     "filehist-filesize": "ફાઇલનું કદ",
     "filehist-comment": "ટિપ્પણી",
-    "filehist-missing": "ફાઇલ ગાયબ",
     "imagelinks": "ફાઇલનો વપરાશ",
     "linkstoimage": "આ ફાઇલ સાથે {{PLURAL:$1|નીચેનું પાનું જોડાયેલું|$1 નીચેનાં પાનાઓ જોડાયેલાં}} છે",
     "linkstoimage-more": "$1 કરતાં વધુ {{PLURAL:$1|પાનું|પાનાં}} આ ફાઇલ સાથે જોડાય છે.\nનીચે જણાવેલ યાદી ફક્ત આ ફાઇલ સાથે જોડાયેલ {{PLURAL:$1|પ્રથમ પાનાની કડી|પ્રથમ $1 પાનાંની કડીઓ}} બતાવે છે.\nઅહીં [[Special:WhatLinksHere/$2|પુરી યાદી]]  મળશે.",
     "emailuser-title-notarget": "ઇ-મેલ વપરાશકર્તા",
     "emailpage": "ઈ-મેલ સભ્ય",
     "emailpagetext": "તમે નીચે દર્શાવેલ ફોર્મ વાપરી આ {{GENDER:$1|સભ્ય}}ને ઇ-મેલ મોકલી શકો છો.\nતમે [[Special:Preferences|તમારી પસંદમાં]] જે ઇ-મેલ લખ્યો હશે તે \"દ્વારા\"ના નામ હેઠળ દેખાશે, જેથી ઇ-મેલ મેળવનાર તમને સંદેશાનો જવાબ આપી શકશે.",
-    "usermailererror": "મેલ વસ્તુ પાઠવવામાં ત્રુટિ",
     "defemailsubject": "{{SITENAME}} સભ્ય $1 તરફથી ઈ-મેલ",
     "usermaildisabled": "સભ્યનો ઈ-મેલ નિષ્ક્રિય કરાયો",
     "usermaildisabledtext": "તમે આ વિકિ પર અન્ય સભ્યોને ઇ-મેલ મોકલી ન શકો",
     "noemailtitle": "ઈ-મેલ એડ્રેસ નથી",
     "noemailtext": "આ સભ્યએ  વૈધ ઇ-મેલ સરનામું નથી આપ્યું.",
-    "nowikiemailtitle": "કોઇ પણ ઇ મેલની રજા નથી",
     "nowikiemailtext": "અન્ય સભ્યો ઇ-મેલ ન મોકલે તેવી આ સભ્યની પસંદગી છે.",
     "emailnotarget": "પ્રાપ્તકર્તા માટે બિન-હયાત અથવા અમાન્ય વપરાશકર્તા નામ.",
     "emailtarget": "પ્રાપ્તકર્તા નું સભ્યનામ દાખલ કરો",
     "nowatchlist": "તમારી ધ્યાન સૂચિ ખાલી છે",
     "watchlistanontext": "તમારી ધ્યાનસૂચિની વસ્તુઓ જોવા અને ફેરફાર કરવા $1 કરો",
     "watchnologin": "પ્રવેશ કરેલ નથી",
-    "watchnologintext": "ધ્યાનસૂચિમાં ફેરફારાકરવા તમે પ્રવેશ [[Special:UserLogin|logged in]] કરેલો હોવો જરૂરી છે.",
     "addwatch": "ધ્યાનસૂચિ માં ઉમેરો",
     "addedwatchtext": "પાનું \"[[:$1]]\" તમારી [[Special:Watchlist|ધ્યાનસૂચિ]]માં ઉમેરાઈ ગયું છે.\nભવિષ્યમાં આ પાના અને તેનાં સંલગ્ન ચર્ચાનાં પાનામાં થનારા ફેરફારોની યાદી ત્યાં આપવામાં આવશે.",
     "removewatch": "ધ્યાનસૂચિમાંથી કાઢી નાખો",
     "watching": "નજર રાખી રહ્યાં છો...",
     "unwatching": "નજર રાખવાની બંધ કરી છે...",
     "watcherrortext": "તમારી ધ્યાનસૂચિ નાં સેટિંગ્સ માં \"$1\" માં ફેરફાર કરતી વખતે ભૂલ આવી.",
-    "enotif_mailer": "{{SITENAME}} સૂચના ઈ-મેલ પ્રેષક",
     "enotif_reset": "બધા પાનાને મુલાકાત લેવાયેલા અંકિત કરો",
     "enotif_impersonal_salutation": "{{SITENAME}} સભ્ય",
     "enotif_subject_deleted": "{{SITENAME}} પૃષ્ઠ $1 {{gender:$2|$2}}એ દૂર કર્યું છે",
     "excontent": "આટલી જ માહિતી હતી: \"$1\"",
     "excontentauthor": "માત્ર આજ માહિતી હતી : \"$1\" (અને યોગદાન કરનાર માત્ર \"[[Special:Contributions/$2|$2]]\" જ હતા)",
     "exbeforeblank": "આ પાનું ભૂંસતા પહેલા તેમાં આ શબ્દો હતાં: $1",
-    "exblank": "પાનું ખાલી હતું",
     "delete-confirm": "$1ને ભૂસી નાંખો.",
     "delete-legend": "રદ કરો",
     "historywarning": "'''ચેતવણી:''' જે પાનું તમે હટાવવા જઇ રહ્યાં છો તેને આશરે $1 {{PLURAL:$1|પુનરાવર્તન|પુનરાવર્તનો}}નો ઇતિહાસ છે:",
     "allmessagesname": "નામ",
     "allmessagesdefault": "મૂળ સંદેશ",
     "allmessagescurrent": "વર્તમાન દસ્તાવેજ",
-    "allmessagestext": "આ મિડિયાવિકિ નામસ્થળમાં આવેલ પ્રણાલીજનિત સંદેશાની યાદી આ મુજબ છે.\nજો તમે મિડિયાયાવિકિના સ્થાનીયકરણમાં મદદરૂપ થવા ઇચ્છતા હોવ તો કૃપયા [https://www.mediawiki.org/wiki/Localisation MediaWiki Localisation] અને [//translatewiki.net translatewiki.net]ની મુલાકાત લો.",
+    "allmessagestext": "આ મિડિયાવિકિ નામસ્થળમાં આવેલ પ્રણાલીજનિત સંદેશાની યાદી આ મુજબ છે.\nજો તમે મિડિયાયાવિકિના સ્થાનીયકરણમાં મદદરૂપ થવા ઇચ્છતા હોવ તો કૃપયા [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation MediaWiki Localisation] અને [//translatewiki.net translatewiki.net]ની મુલાકાત લો.",
     "allmessagesnotsupportedDB": "આ પાનું ન વાપરી શકાશે કેમકે '''$wgUseDatabaseMessages'''  નિષ્ક્રીય કરાયું છે",
     "allmessages-filter-legend": "ચાળણી",
     "allmessages-filter": "સ્થાનીયકરણ સ્થિતિ દ્વારા ચાળો",
     "importunknownsource": "અજ્ઞાત આયાતી સ્રોત પ્રકાર",
     "importcantopen": "આયાતી ફાઈલ નાખોલી શકાઈ",
     "importbadinterwiki": "ખરાબ આંતરીકા વિકિ કડી",
-    "importnotext": "ખાલી કે શબ્દ વિહીન",
     "importsuccess": "આયાત સંપૂર્ણ",
-    "importhistoryconflict": "એક બીજાથી વિસંગત ફેરફારો અસ્તિત્વ ધરાવે છે ( કદાક આ પાનું પહેલાં આયાત કરાયું હોય)",
     "importnosources": "કોઇ પણ આંતર વિકિ સ્રોત જણાવાયા નથી અને સીધા ઇતિહાસ ફાઇલ ચડાવવા પર રોક લાગેલી છે.",
     "importnofile": "કોઇ પણ આયાતી ફાઇલ ન ચડાવી શકાઇ",
     "importuploaderrorsize": "આયાતી ફાઇલ ચડાવવાનું અસફળ\nમંજૂર કદ કરતા આ ફાઈલાનું કદ મોટું છે.",
index 8ae4767..dafdb28 100644 (file)
     "disclaimers": "Hattara",
     "disclaimerpage": "Project:Babban gargaɗi",
     "edithelp": "Taimako kan gyara",
-    "helppage": "Help:Tsaraba",
     "mainpage": "Marhabin",
     "privacy": "Manufar kare sirri",
     "privacypage": "Project:Manufar kare sirri",
index d1e997f..b0f78c7 100644 (file)
     "nowatchlist": "汝嘅監視列表係空嘅。",
     "watchlistanontext": "請$1來查看或編寫汝嘅監視列表。",
     "watchnologin": "還吂登入",
-    "watchnologintext": "汝必須先[[Special:UserLogin|登入]],正做得更改汝嘅監視列表。",
     "addedwatchtext": "Hong-mien \"[[:$1]]\" yí-kîn pûn kâ-ngi̍p to ngì-ke [[Special:Watchlist|Kam-sṳ chhîn-tân]] chûng. Chiông-lòi yû-kôan chhṳ́ hong-mien khi̍p khì-thâ thó-lun-hong ke ngim-hò siû-cháng chiông-voi chhai hong-mien lie̍t-chhut, song-chhiá hàn-voi chhai [[Special:RecentChanges|Chui-khiûn ke kiên-kói]] chûng ke '''chhû-thí''' hìn-sṳt lie̍t-chhut. Kó-yèn  ngì heu-lòi sióng chhiùng hong-mien kam-sṳ chhîn-tân chûng chhîn-chhù, hí-khó tiám-kit thô-hòng thiàu-chûng \"thìn-chṳ́ kam-sṳ\" ke lièn-kiet。",
     "removedwatchtext": "Vùn-chông \"[[:$1]]\" yí-kîn chhiùng Ngì kekam-sṳ lie̍t-péu mien-chûng yì-chhù.",
     "watch": "監視",
     "allmessagesname": "名",
     "allmessagesdefault": "默認信息文字",
     "allmessagescurrent": "Tông-chhièn ke vùn-sṳ",
-    "allmessagestext": "Liá-piên lie̍t-chhut só-yû hí-khó thin-chṳ ke ne-thúng kie-mien.\nPlease visit [https://www.mediawiki.org/wiki/Localisation MediaWiki Localisation] and [//translatewiki.net translatewiki.net] if you wish to contribute to the generic MediaWiki localisation.",
+    "allmessagestext": "Liá-piên lie̍t-chhut só-yû hí-khó thin-chṳ ke ne-thúng kie-mien.\nPlease visit [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation MediaWiki Localisation] and [//translatewiki.net translatewiki.net] if you wish to contribute to the generic MediaWiki localisation.",
     "allmessagesnotsupportedDB": "Ne-thúng kie-mien kûng-yung chhu-yî kôan-pit chong-thai (wgUseDatabaseMessages)。",
     "thumbnail-more": "放大",
     "filemissing": "Mò-fap cháu-to tóng-on",
index ba8997b..1025467 100644 (file)
     "october-date": "$1 ʻOkakopa",
     "november-date": "$1 Nowemapa",
     "december-date": "$1 Kēkēmapa",
-    "pagecategories": "{{PLURAL:$1|Mahele| mau Māhele}}",
+    "pagecategories": "{{PLURAL:$1|Mahele|Māhele}}",
     "category_header": "Nā ʻaoʻao i loko o ka mahele \"$1\"",
     "subcategories": "Nā Māhele kūloko",
     "category-media-header": "Nā Pāpaho i loko o ka mahele \"$1\"",
     "hidden-categories": "{{PLURAL:$1|mahele hūnā|mau māhele hūnā}}",
     "hidden-category-category": "Nā māhele hūnā",
     "category-subcat-count": "{{PLURAL:$2|Hoʻokahi mahele kūloko wale nō o kēia mahele.|Aia {{PLURAL:$1|i kēia mahele kūloko|$1 mau māhele kūloko}} i loko o kēia mahele, $2 ka huina.}}",
+    "category-subcat-count-limited": "Loaʻa i kēia mahele {{PLURAL:$1|hoʻokahi mahele kūloko|$1 mau māhele}}.",
     "category-article-count": "{{PLURAL:$2|Hoʻokahi ʻaoʻao wale nō o kēia mahele.|Aia {{PLURAL:$1|i kēia ʻaoʻao|$1 mau ʻaoʻao}} i loko o kēia mahele, $2 ka huina.}}",
+    "category-article-count-limited": "Aia {{PLURAL:$1|kēia ʻaoʻao|$1 mau ʻaoʻao}} ma ka mahele okamanawa.",
     "category-file-count": "{{PLURAL:$2|Hoʻokahi waihona wale nō o kēia mahele.|Aia {{PLURAL:$1|i kēia waihona|$1 mau waihona}} i loko o kēia mahele, $2 ka huina.}}",
+    "category-file-count-limited": "Aia {{PLURAL:$1|kēia waihona|$1 mau waihona}} ma ka mahele okamanawa.",
     "listingcontinuesabbrev": "(homaʻia)",
+    "index-category": "ʻAoʻao i hoʻopapakuhikuhi kikoʻī ʻia",
     "noindex-category": "Nā ʻAoʻao i hoʻopapakuhikuhi kikoʻī ʻia",
+    "broken-file-category": "ʻAoʻao me nā loulou waihona haki",
     "about": "No ia",
     "article": "ʻAoʻao mealoko",
     "newwindow": "(wehe ʻia i loko o kekahi pukaaniani hou)",
     "jumptonavigation": "kelena",
     "jumptosearch": "huli",
     "view-pool-error": "E kala mai, ua hoʻoili nui ʻino nā pūnaewele i kēia manawa. Hoʻāʻo nā mea hoʻohana nui kā e ʻike i kēia ʻaoʻao. E ʻoluʻolu, e kali no kekahi mau minuke a hana hou. \n\n$1",
+    "pool-timeout": "Hele a ʻole ka hola no ke kali ʻana o ka laka",
+    "pool-queuefull": "Piha ke kiʻo kiū",
     "pool-errorunknown": "Hewa ʻikeʻole",
     "aboutsite": "No {{SITENAME}}",
     "aboutpage": "Project:No translatewiki.net",
+    "copyright": "Aia nā mealoko ma lalo o ka laikini $1 inā noka ʻole ia.",
     "copyrightpage": "{{ns:project}}:Kūleana kope",
     "currentevents": "Nūhou",
     "currentevents-url": "Project:Nūhou",
     "privacy": "Kulekele pilikino",
     "privacypage": "Project:Kulekele pilikino",
     "badaccess": "Hewa ‘aena",
+    "badaccess-group0": "ʻAe ʻole ʻoe ke hana i ka mea āu i noi ʻia.",
     "versionrequired": "Noi ʻia ka mana $1 o MekiaWiki",
     "versionrequiredtext": "Noi ʻia ka mana $1 o MekiaWiki no ka hoʻohana ʻana o kēia ʻaoʻao.\nʻIke i ka [[Special:Version|ʻaoʻao mana]].",
     "ok": "Hiki nō",
     "viewdeleted": "Nānā iā $1?",
     "restorelink": "{{PLURAL:$1|kekahi loli holoi|$1 mau loli holoi}}",
     "feedlinks": "Hānaīke:",
+    "feed-invalid": "Hewa ka hulu hānaīke kiaʻi.",
+    "feed-unavailable": "Loaʻa ʻole i nā hānaīke sinidiketiona",
     "site-rss-feed": "Hānaīke RSS o $1",
     "site-atom-feed": "Hānaīke Atom o $1",
     "page-rss-feed": "Hānaīke RSS o \"$1\"",
     "nstab-help": "Kōkua",
     "nstab-category": "Mahele",
     "nosuchaction": "ʻAʻohe hana",
+    "nosuchactiontext": "Hewa ka hana a ka URL.\nUa kikokiko hewa paha ʻoe i ka URL, aiʻole hāhai ʻia kekahi loulou hewa.\nHōʻike paha nō hoʻi kēia i kekahi mū ma loko o ka lako polokalamu e hana ʻia e {{SITENAME}}.",
     "nosuchspecialpage": "ʻAʻohe ʻaoʻao kūikawā",
+    "nospecialpagetext": "<strong>Ua noi ʻoe i kekahi ʻaoʻao kūikawā hewa.</strong>\n\nAia kekahi papahelu pololei o nā ʻaoʻao kūikawā ma [[Special:SpecialPages|{{int:specialpages}}]].",
     "error": "Hewa",
     "databaseerror": "Hewa hōkeo ʻikepili",
+    "databaseerror-text": "Ua loaʻa kekahi hewa nīnau hōkeo ʻikepili.\nHōʻike paha kēīa i kekahi mū ma ka lako polokalamu.",
+    "databaseerror-textcl": "Ua loaʻa kekahi hewa nīnau hōkeo ʻikepili.",
     "databaseerror-query": "Nīnau: $1",
     "databaseerror-function": "Hana: $1",
     "databaseerror-error": "Hewa: $1",
     "laggedslavemode": "<strong>E akahele:</strong> ʻAʻole loaʻa paha i ka ʻaoʻao na hoʻouka hou hou.",
     "readonly": "Laka ‘ia ka hōkeo ‘ikepili",
+    "enterlockreason": "E kikokiko i kekahi kumu no ka laka, a hoʻokomo pū i ka pau ana o kēlā laka",
+    "readonlytext": "Ke laka nei ka hōkeo ʻikepili i kēia manawa no nā hana hou a me nā kāloli ʻē aʻe no kekahi mālama hōkeo ʻikepili hōʻoia hou a hou paha a e hele a maʻamau i ka pau ana.\n\nUa hāʻawi ke kahu i laka i kēia kumu: $1",
     "missing-article": "Loaʻa ʻole i ka hōkeo ʻikepili ke kikokikona o ka ʻaoʻao i pono e loaʻa ʻia i kapa ʻia ʻo \"$1\" $2.\n\nHana ʻia kēia pilikia e ka hāhai ʻana o kekahi ʻokoʻa kahiko aiʻole i kekahi loulou mōʻaukala i kekahi ʻaoʻao i holoi ʻia.\n\nInā ʻaʻole ka hana, ua loaʻa paha iā ʻoe i kekahi mū i loko o ka lako pōlamu.\nE ʻoluʻolu, e lono  kēia pilikia i kekahi [[Special:ListUsers/sysop|kahu]], mai poina i ka URL.",
     "missingarticle-rev": "(kāmua#: $1)",
     "missingarticle-diff": "(ʻOkoʻa: $1, $2)",
+    "readonly_lag": "Ua hikalaka ka hōkeo ʻikepili i ka hele nei ʻana o nā hōkeo ʻikepili kauā i ka haku",
     "internalerror": "Hewa koloko",
     "internalerror_info": "Hewa koloko:$1",
     "fileappenderrorread": "ʻAʻole hiki ke heluhelu iā \"$1\" ma loko o ka pākuʻi ʻana.",
     "directorycreateerror": "ʻAʻole hiki ke haku ka papakuhi waihona \"$1\"",
     "filenotfound": "‘A‘ole hiki ke loa‘a ka waihona \"$1\".",
     "fileexistserror": "ʻAʻole hiki ke kākau i ka waihona \"$1\": Aia no ia.",
+    "unexpected": "Helu mahuʻi ʻole: \"$1\"=\"$2\".",
+    "formerror": "Hewa: Hiki ʻole ke waiho i ke kahua.",
+    "badarticleerror": "Hiki ʻole i kēia hana ke hana ʻia ma kēia ʻaoʻao.",
+    "cannotdelete": "Hiki ʻole i ka ʻaoʻao aiʻole ka waihona \"$1\" ke holoi ʻia.\nUa holoi ʻia paha ia e kekahi mea ʻē aʻe.",
     "cannotdelete-title": "Hiki ʻole ke holoi iā \"$1\"",
+    "delete-hook-aborted": "Ua ʻoʻu ʻia ka holoi ʻana e ka hūka.\nʻAʻohe kumu āna.",
+    "no-null-revision": "Hiki ʻole ke haku i kekahi hōʻole kāmua hou no ka ʻaoʻao \"$1\"",
     "badtitle": "Inoa ʻohe",
     "badtitletext": "ʻAʻohe paha, hakahaka paha aiʻole loulou hewa paha ka poʻoinoa ʻaoʻao.\nLoaʻa paha nā hua kikokikona e hiki ʻole ke hana i nā poʻoinoa.",
     "viewsource": "Nānā i ke kumu",
     "createacct-imgcaptcha-ph": "E kikokiko i ke kikokikona  i luna",
     "createacct-submit": "Kāinoa",
     "createacct-another-submit": "Kāinoa hou",
+    "createacct-benefit-heading": "Hana ʻia ʻo {{SITENAME}} e nā kanaka e like me ʻoe.",
+    "createacct-benefit-body1": "{{PLURAL:$1|hoʻololi|mau hoʻololi}}",
+    "createacct-benefit-body2": "{{PLURAL:$1|ʻaoʻao|mau ʻaoʻao}}",
+    "createacct-benefit-body3": "{{PLURAL:$1|mea haʻawina|mau mea haʻawina}} hou",
     "badretype": "ʻAʻole like nā ʻōlelo hūnā āu i hoʻokomo ai",
     "userexists": "Ua kāinoa ʻia ka inoa mea ho‘ohana.\nE koho i kekahi inoa ʻē aʻe, ke ‘olu‘olu.",
     "loginerror": "Hewa ʻeʻe",
     "createacct-error": "Hewa kāinoa",
     "createaccounterror": "ʻAʻole hiki ke kāinoa: $1",
+    "nocookiesnew": "Ua haku ʻia ka moʻokāki mea hoʻohana, akā ʻaʻole ʻoe e ʻeʻe nei i kēia manawa.\nHana ʻo {{SITENAME}} i nā makana no ke ʻeʻe ʻana i nā mea hoʻohana.\nUa hoʻā ʻole ʻoe i nā makana.\nE ʻoluʻolu, e hoʻā i nā makana, a laila e ʻeʻe me kāu inoa mea hoʻohana hou a me ka ʻōlelo hūnā hou.",
+    "nocookieslogin": "Hana ʻo {{SITENAME}} i nā makana no ke ʻeʻe ʻana i nā mea hoʻohana.\nUa hoʻā ʻole ʻoe i nā makana.\nE ʻoluʻolu, e hoʻā i nā makana, a hana hou.",
     "loginsuccesstitle": "ʻEʻe kūleʻa",
     "loginsuccess": "<strong>Ua ʻeʻe ʻo \"$1\" iā {{SITENAME}}.</strong>",
     "nouserspecified": "Pono ʻoe e kāhuakomo i ka inoa mea hoʻohana.",
     "wrongpasswordempty": "Hakahaka ka ʻōlelo hūnā.\nE ʻoluʻolu, e hana hou.",
     "mailmypassword": "Kāinoa hou i ka ʻōlelo hūnā",
     "passwordremindertitle": "He 'ōlelo hūnā kūikawā no {{SITENAME}}",
+    "mailerror": "He hewa me ka hoʻouna leka ana: $1",
     "emailauthenticated": "Ua hō‘oia ‘ia kāu wahinoho lekauila ma ka lā $2 i ka hola $3.",
     "emailnotauthenticated": "ʻAʻole hōʻoia ʻia kāu wahinoho lekauila.\nHoʻouna ʻole i kekahi lekauila no kēia mau helena.",
     "emailconfirmlink": "E hō‘oia i kāu wahinoho lekauila",
+    "emaildisabled": "ʻAʻole hiki i kēia kahua ke hoʻouna i nā lekauila.",
     "accountcreated": "Ua kāinoa",
     "accountcreatedtext": "Ua kāinoa ka moʻokāki no [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|walaʻau]])",
     "createaccount-title": "Kāinoa moʻokāki no {{SITENAME}}",
     "retypenew": "E kikokiko hou i ka ʻōlelo hūnā hou:",
     "resetpass_submit": "Kau i ka ʻōlelo hūnā a ʻeʻe",
     "changepassword-success": "Ua hoʻololi ‘ia kāu hua‘ōlelo huna!",
+    "resetpass-submit-loggedin": "Hoʻololi i ka ʻōlelo hūnā",
     "resetpass-submit-cancel": "Hoʻōki",
     "resetpass-temp-password": "ʻŌlelo hūnā kūikawā:",
     "passwordreset": "Kāinoa hou i ka ʻōlelo hūnā",
     "changeemail-password": "Kāu ʻōlelo hūnā {{SITENAME}}:",
     "changeemail-submit": "Loli i kāu lekauila",
     "changeemail-cancel": "Hoʻōki",
+    "resettokens-token-label": "$1 (helu okamanawa: $2)",
     "bold_sample": "Ho‘okā‘ele",
     "bold_tip": "Ho‘okā‘ele",
     "italic_sample": "Ho‘ohiō",
     "showlivepreview": "Nāmua ʻānō",
     "showdiff": "E hō'ike i nā loli",
     "anoneditwarning": "<strong>E akahele:</strong> ʻAʻole ʻoe ʻeʻe nei.\nE hoʻopaʻa ʻia ana kāu IP ma ko kēia ʻaoʻao mōʻaukala hoʻololi.",
+    "summary-preview": "Nāmua hōʻuluʻulu manaʻo:",
     "blockedtitle": "Ua pale ‘ia ka mea ho‘ohana",
     "blockednoreason": "‘a‘ohe kumu",
     "loginreqtitle": "Noi i ka ʻeʻe ʻana",
     "search-section": "(pauku $1)",
     "search-suggest": "ʻO kēia paha kou manaʻo: $1",
     "search-interwiki-caption": "Nā pāhana ʻē aʻe",
+    "search-interwiki-default": "Nā hualoaʻa mai $1:",
     "search-interwiki-more": "(hou aʻe)",
     "search-relatedarticle": "Nā Mea ʻālike",
+    "searcheverything-enable": "Huli i nā lewainoa apau",
     "searchrelated": "na mea ʻālike",
     "searchall": "nā mea apau",
     "showingresultsheader": "{{PLURAL:$5|<strong>$1</strong> hualoaʻa o <strong>$3</strong> mau hualoaʻa|<strong$1-$2</strong> mau hualoaʻa o <strong>$3</strong> mau hualoaʻa}} no <strong>$4</strong>",
     "search-nonefound": "ʻAʻohe hualoaʻa no kēia huli.",
     "powersearch-legend": "Hulina kūlana kiʻekiʻe",
     "powersearch-ns": "Huli i loko o nā wahi inoa:",
+    "powersearch-redir": "Helu i nā kiahou",
     "powersearch-togglelabel": "Hōʻoia:",
     "powersearch-toggleall": "Nā mea apau",
     "powersearch-togglenone": "ʻAʻohe",
     "prefs-skin": "ʻIli",
     "skin-preview": "Nāmua",
     "datedefault": "ʻAʻohe makemake",
-    "prefs-beta": "Helena Beta",
-    "prefs-datetime": "Ka lā a me ka hola",
+    "prefs-user-pages": "ʻAoʻao mea ho‘ohana",
     "prefs-personal": "ʻAoʻao mea hoʻohana",
     "prefs-rc": "Nā loli hou",
     "prefs-watchlist": "Papakiaʻi",
     "prefs-watchlist-days": "Nā lā e hōʻike i ka papakiaʻi:",
     "prefs-watchlist-days-max": "He palenanui o $1 {{PLURAL:$1|lā|mau lā}}",
+    "prefs-watchlist-edits-max": "Helu palena nui: 1000",
+    "prefs-resetpass": "Hoʻololi i ka ʻōlelo hūnā",
+    "prefs-changeemail": "Hoʻololi i ka wahinoho lekauila",
+    "prefs-setemail": "Hoʻopaʻa i kekahi wahinoho lekauila",
     "prefs-email": "Koho lekauila",
     "prefs-rendering": "Helena",
     "saveprefs": "Mālama",
     "prefs-help-email": "Koi ʻole i ka wahinoho lekauila, akā pono ia nō ke kāinoa ʻana o ka ʻōlelo hūnā inā poina ʻoe i kāu ʻōlelo hūnā.",
     "prefs-help-email-others": "Hiki iā ʻoe ke koho i ka ʻae ʻana i nā mea ʻē aʻe e hoʻokaʻaʻike iā ʻoe mao ka lekauila mao kekahi loulou ma kāu ʻaoʻao mea hoʻohana aiʻole kāu ʻaoʻao walaʻau.\nʻAʻole hōʻike ʻia kāu wahinoho lekauila i nā mea ʻē aʻe e hoʻokaʻaʻike iā ʻoe.",
     "prefs-help-email-required": "Koi i ka lekauila.",
+    "prefs-info": "ʻIke nōhie",
+    "prefs-i18n": "ʻŌlelo",
     "prefs-signature": "Pūlima",
+    "prefs-dateformat": "Hulu lā",
+    "prefs-timeoffset": "Hulu hola",
     "prefs-advancedediting": "Koho paʻamau",
     "prefs-editor": "Luna Hoʻoponopono:",
     "prefs-preview": "Nāmua",
     "prefs-displayrc": "Koho nānā",
     "prefs-displaysearchoptions": "Koho nānā",
     "prefs-displaywatchlist": "Koho nānā",
+    "prefs-tokenwatchlist": "Tokene",
     "prefs-diffs": "ʻOkoʻa",
+    "prefs-help-prefershttps": "E hana ana kēia makemake i ka ʻeʻe hou ana.",
     "userrights": "Ho‘oponopono ‘ana o nā kuleana",
     "userrights-groupsmember": "He lālā o:",
     "userrights-reason": "Kumu:",
     "filedesc": "Hōʻuluʻulu manaʻo",
     "fileuploadsummary": "Hōʻuluʻulu manaʻo:",
     "filesource": "Kumu:",
-    "uploadedfiles": "Waihona hoʻouka ʻia",
+    "uploadwarning": "Akahele hoʻouka",
     "savefile": "Waihona mālama",
     "uploadedimage": "ua hoʻouka iā \"[[$1]]\"",
     "upload-source": "Waihona kūmole",
     "sourcefilename": "Inoa waihona kūmole:",
     "sourceurl": "URL kūmole:",
+    "upload-maxfilesize": "Nui palena nui waihona: $1",
+    "upload-description": "Hōʻike ʻano waihona",
+    "upload-options": "Koho hoʻouka",
+    "watchthisupload": "E kiaʻi i kēia waihona",
+    "upload-warning-subj": "Akahele hoʻouka",
+    "upload-file-error": "Hewa kūloko",
+    "upload-http-error": "Ua loaʻa kekahi hewa HTTP: $1",
     "license": "Laikini:",
     "license-header": "Laikini",
     "imgfile": "waihona",
     "filehist-dimensions": "Nā Nui",
     "filehist-filesize": "Nui o ka waihona",
     "filehist-comment": "Kaumanaʻo",
-    "filehist-missing": "Nele ka waihona",
     "imagelinks": "Nā Hana waihona",
     "linkstoimage": "Loulou {{PLURAL:$1|kekahi ‘ao‘ao|kēia mau ‘ao‘ao $1}} i kēia waihona:",
     "nolinkstoimage": "ʻAʻohe ʻaoʻao e loulou i kēia waihona.",
     "filedelete-reason-otherlist": "Nā kumu ʻē aʻe",
     "download": "hoʻoili",
     "randompage": "ʻAtikala Kaulele",
+    "randomincategory-selectcategory-submit": "Huli",
     "statistics": "ʻIkepilihelu",
+    "statistics-header-pages": "ʻIkepilihelu ʻaoʻao",
+    "statistics-header-edits": "ʻIkepilihelu hoʻololi",
+    "statistics-header-views": "ʻIkepilihelu nānā",
+    "statistics-header-users": "ʻIkepilihelu mea hoʻohana",
+    "statistics-header-hooks": "ʻIkepilihelu ʻē aʻe",
+    "statistics-articles": "ʻAoʻao mealoko",
+    "statistics-pages": "‘Ao‘ao",
+    "statistics-files": "Waihona i hoʻouka ʻia",
     "brokenredirects-edit": "ho‘ololi",
     "brokenredirects-delete": "holoi",
     "withoutinterwiki-submit": "Hō‘ike",
     "prefixindex": "Nā ʻAoʻao apau me ka pākuʻina kau mua",
     "shortpages": "Nā ʻaoʻao pōkole",
     "longpages": "Nā ʻaoʻao lōʻihi",
+    "protectedpages-page": "ʻAoʻao",
+    "protectedpages-reason": "Kumu",
+    "protectedpages-unknown-timestamp": "ʻIkeʻole",
+    "protectedpages-unknown-performer": "Mea hoʻohana ʻikeʻole",
     "usercreated": "{{GENDER:$3|Haku ʻia}} i ka lā $1 ma ka hola $2",
     "newpages": "Nā ‘Ao‘ao hou",
     "newpages-username": "Inoa mea ho'ohana:",
     "allmessagescurrent": "Kikokikona i kēia manawa",
     "thumbnail-more": "Ho‘onui",
     "thumbnail_error": "Loaʻa i ka hewa ka haku ʻana o ke kiʻiliʻi: $1",
+    "import-interwiki-submit": "Kākomo",
+    "import-upload-filename": "Inoawaihona:",
+    "import-comment": "Kaumanaʻo:",
+    "importstart": "Ke kākomo nei i nā ʻaoʻao...",
+    "import-revision-count": "$1 {{PLURAL:$1|loihape|mau loihape}}",
+    "importnopages": "ʻAʻohe ʻaoʻao no ke kākomo ʻana.",
     "tooltip-pt-userpage": "Kāu ʻaoʻao mea hoʻohana",
     "tooltip-pt-mytalk": "Kāu walaʻau",
     "tooltip-pt-preferences": "Kāu makemake",
     "tooltip-n-help": "Kahi e aʻo mai",
     "tooltip-t-whatlinkshere": "He papahelu o nā ʻaoʻao wiki apau e loulou i ʻaneʻi",
     "tooltip-t-recentchangeslinked": "Nā loli hou i nā ʻaoʻao i loulou ʻia mai kēia ʻaoʻao",
+    "tooltip-feed-rss": "Hānaīke RSS no kēia ʻaoʻao",
     "tooltip-feed-atom": "Hānaīke Atom no kēia ʻaoʻao",
     "tooltip-t-contributions": "He papahelu o nā hāʻawina o ka mea hoʻohana",
     "tooltip-t-emailuser": "Leka uila i kēia mea hoʻohana",
     "tooltip-t-permalink": "Loulou paʻa no kēia kāmua o ka ʻaoʻao",
     "tooltip-ca-nstab-main": "Nānā i ka ʻaoʻao mealoko",
     "tooltip-ca-nstab-user": "Nānā i ka ʻaoʻao mea hoʻohana",
+    "tooltip-ca-nstab-media": "Nānā i ka ʻaoʻao pāpaho",
     "tooltip-ca-nstab-special": "He ʻaoʻao kūikawā kēia; ʻaʻole hiki iā ʻoe ke hoʻololi",
     "tooltip-ca-nstab-project": "Nānā i ka ‘ao‘ao papahana",
     "tooltip-ca-nstab-image": "Nānā i ka ʻaoʻao waihona",
+    "tooltip-ca-nstab-mediawiki": "Nānā i ka pūlono ʻōnaehana",
     "tooltip-ca-nstab-template": "Nānā i ke anakuhi",
     "tooltip-ca-nstab-help": "Nānaina i ka ʻaoʻao kōkua",
     "tooltip-ca-nstab-category": "Nānā i ka ‘ao‘ao mahele",
     "tooltip-diff": "Hōʻike i nā loli āu i hana ai i kēia kikokikona",
     "tooltip-compareselectedversions": "E ʻike i na ʻokoʻa ma waena o nā kāmua ʻelua i koho ʻia o kēia ʻaoʻao",
     "tooltip-watch": "Hoʻohui i kāu papakiʻai",
+    "tooltip-watchlistedit-normal-submit": "Holoi poʻoinoa",
+    "tooltip-watchlistedit-raw-submit": "Hoʻopuka hou i ka papakiaʻi",
+    "tooltip-upload": "Hoʻomaka i ka hoʻouka ʻana",
     "tooltip-rollback": "Hoʻihoʻi ʻo \"Hoʻihoʻi\" i nā hoʻololi i kēia ʻaoʻao o ka mea hāʻawi hopeloa i hoʻokahi kāomi",
     "tooltip-undo": "Hoʻihoʻi ʻo \"Hōʻole\" i kēia hoʻololi a wehe ia i ka ʻaoʻao hoʻololi i ke ʻano nāmua. ʻAe ia i ka hoʻohui ʻana i kekahi kumu i loko o ka hōʻuluʻulu manaʻo.",
+    "tooltip-preferences-save": "Mālama i nā makemake",
     "tooltip-summary": "Kikokiko i kekahi hōʻuluʻulu manaʻo pōkole",
+    "siteuser": "$1, he mea hoʻohana o {{SITENAME}}",
+    "anonuser": "$1, he mea hoʻohana inoa ʻole o {{SITENAME}}",
+    "lastmodifiedatby": "Ua kāloli ʻia kēia ʻaoʻao ma ka hola $2 o $1 na $3.",
+    "othercontribs": "Hakuloli ʻia i ke kumuhana na $1.",
+    "others": "mea ʻē aʻe",
+    "siteusers": "{{PLURAL:$2|ka mea hoʻohana|nā mea hoʻohana}} {{SITENAME}} $1",
+    "anonusers": "{{PLURAL:$2|ka mea hoʻohana|nā mea hoʻohana}} inoa ʻole {{SITENAME}} $1",
+    "creditspage": "Pailaha ʻaoʻao",
+    "nocredits": "ʻAʻohe ʻike pailaha a kēia ʻaoʻao.",
+    "pageinfo-title": "ʻIke no \"$1\"",
+    "pageinfo-header-basic": "ʻIke nōhie",
+    "pageinfo-header-edits": "Hoʻololi i ka mōʻaukala",
+    "pageinfo-article-id": "ID ʻaoʻao",
+    "pageinfo-language": "ʻŌlelo mealoko ʻaoʻao",
+    "pageinfo-robot-index": "ʻAe",
+    "pageinfo-robot-noindex": "ʻAʻole",
+    "pageinfo-views": "Helu o nā nānā",
+    "pageinfo-watchers": "Helu o nā mea nānā ʻaoʻao",
+    "pageinfo-redirects-name": "Helu o nā kiahou i kēia ʻaoʻao",
+    "pageinfo-subpages-name": "Helu o nā ʻaoʻao kūloko o kēia ʻaoʻao",
+    "pageinfo-toolboxlink": "ʻIke ʻaoʻao",
+    "pageinfo-redirectsto": "Kiahou iā",
+    "pageinfo-redirectsto-info": "ʻike",
+    "pageinfo-contentpage-yes": "ʻAe",
+    "pageinfo-protect-cascading-yes": "ʻAe",
+    "pageinfo-category-info": "ʻIke māhele",
+    "pageinfo-category-pages": "Helu o nā ʻaoʻao",
+    "pageinfo-category-subcats": "Helu o nā ʻaoʻao kūloko",
+    "pageinfo-category-files": "Helu o nā waihona",
     "previousdiff": "← Hoʻololi aku nei",
     "nextdiff": "Hoʻololi hou aʻe →",
-    "file-info-size": "$1 x $2 kiʻiʻuku, nui waihona: $3, ʻano MIME: $4",
+    "thumbsize": "Nui kiʻiliʻi:",
+    "widthheightpage": "$1 × $2, $3 {{PLURAL:$3|ʻaoʻao|mau ʻaoʻao}}",
+    "file-info": "nui waihona: $1, kaila MIME: $2",
+    "file-info-size": "$1 x $2 pikela, nui waihona: $3, ʻano MIME: $4",
+    "file-info-size-pages": "$1 × $2 mau pikela, nui waihona: $3, kaila MIME: $4, $5 {{PLURAL:$5|ʻaoʻao|mau ʻaoʻao}}",
     "file-nohires": "Loaʻa ʻole ka miomio aʻe.",
     "svg-long-desc": "Waihona SVG, $1 x $2 mau pikela, nui waihona: $3",
+    "svg-long-error": "Hewa ka waihona SVG: $1",
     "show-big-image": "Waihona kumu",
+    "show-big-image-preview": "Ka nui o kēia nāmua: $1.",
+    "show-big-image-size": "$1 × $2 mau pikela",
+    "newimages-legend": "Kānana",
+    "showhidebots": "($1 mau lopako)",
+    "noimages": "ʻAʻohe mea.",
     "ilsubmit": "Huli",
+    "bydate": "e ka lā",
+    "sp-newimages-showfrom": "Hōʻike i nā waihona hou mai ka hola $2, $1",
+    "seconds": "{{PLURAL:$1|$1 kekona|$1 mau kekona}}",
+    "minutes": "{{PLURAL:$1|$1 minuke|$1 mau minuke}}",
+    "hours": "{{PLURAL:$1|$1 hola|$1 mau hola}}",
+    "days": "{{PLURAL:$1|$1 lā|$1 mau lā}}",
+    "weeks": "{{PLURAL:$1|$1 pule|$1 mau pule}}",
+    "months": "{{PLURAL:$1|$1 mahina|$1 mau mahina}}",
+    "years": "{{PLURAL:$1|$1 makahiki|$1 mau makahiki}}",
+    "ago": "$1 ma mua",
+    "just-now": "i kēia manawa ʻānō",
+    "hours-ago": "$1 {{PLURAL:$1|hola|mau hola}} ma mua",
+    "minutes-ago": "$1 {{PLURAL:$1|minuke|mau minuke}} ma mua",
+    "seconds-ago": "$1 {{PLURAL:$1|kekona|mau kekona}} ma mua",
+    "monday-at": "Poʻākahi ma $1",
+    "tuesday-at": "Poʻālua ma $1",
+    "wednesday-at": "Poʻākolu ma $1",
+    "thursday-at": "Poʻāhā ma $1",
+    "friday-at": "Poʻālima ma $1",
+    "saturday-at": "Poʻāono ma $1",
+    "sunday-at": "Lāpule ma $1",
+    "yesterday-at": "I nehinei ma $1",
     "bad_image_list": "ʻO kēia ka hulu:\n\nNoʻonoʻo pono wale no i nā ʻikamu papahelu (nā laina e hoʻomaka ʻia me *).\nPono ka loulou mua loa ma kekahi laina e loulou i kekahi waihona ʻino.\nNoʻonoʻo ʻia nā loulou heleiho ma kēlā laina like i nā kūʻē lula, he laʻana kēia, nā ʻaoʻao e loaʻa i ka waihona i loko o ka laina.",
     "metadata": "ʻIkepiliMeta",
     "metadata-help": "Loaʻa i kēia waihona nā ʻike ʻē aʻe i hoʻohui ʻia paha mai kekahi pahupaʻakiʻi aiʻole kekahi mīkinikopekiʻi i hana ʻia no ka haku ʻana aiʻole ka hoʻokamepiuila ʻana o ia.\nInā ua kāloli ʻia ka waihona mai kona ʻano kumu, hōʻike piha ʻole i kekahi o nā kikoʻī o ka waihona i kāloli ʻia.",
     "metadata-fields": "E hoʻokomo ʻia ana nā kula ʻikepiliMeta kiʻi i loko o kēia pūlono ma ka hōʻike ʻaoʻao kiʻi oiai ka hoʻoliʻi ʻana o ke pākaukau ʻikepiliMeta.\nHoʻohuna paʻamau i nā mea ʻē aʻe\n* kahana lōkō\n* kaʻano\n* kalāholakumu\n* holahuʻena\n* heluf\n* kūlanawikiiso\n* loaaniani\n* meahana\n* kūleanakope\n* hōʻikeʻanokiʻi\n* lakikūgps\n* lonikūgps\n* kiʻekiʻegps",
+    "exif-languagecode": "ʻŌlelo",
+    "exif-iimversion": "Mana IIM",
+    "exif-iimcategory": "Mahele",
+    "exif-label": "Lepili",
+    "exif-meteringmode-0": "ʻIkeʻole",
+    "exif-gpsspeed-n": "Mile loa",
+    "exif-gpsdestdistance-k": "Kilomika",
+    "exif-gpsdestdistance-m": "Mile",
+    "exif-gpsdestdistance-n": "Mile moana",
+    "exif-objectcycle-a": "Lā wale nō",
+    "exif-objectcycle-p": "Pō wale nō",
+    "exif-objectcycle-b": "Ka lā a me ka pō pākahi nō",
+    "exif-dc-date": "Lā",
+    "exif-dc-source": "Pāpaho kūmole",
+    "exif-dc-type": "Kaila pāpaho",
+    "exif-iimcategory-edu": "Hoʻonaʻauao",
+    "exif-iimcategory-evn": "ʻĀina",
+    "exif-iimcategory-hth": "Olakino",
+    "exif-iimcategory-wea": "Anianilā",
     "watchlistall2": "nā mea apau",
     "namespacesall": "nā mea apau",
     "monthsall": "nā mea apau",
     "confirm_purge_button": "Hiki nō",
+    "confirm-watch-button": "Hiki nō",
+    "confirm-watch-top": "Hoʻohui i kēia ʻaoʻao i kāu papakiaʻi?",
+    "confirm-unwatch-button": "Hiki nō",
+    "confirm-unwatch-top": "Holoi i kēia ʻaoʻao mai kāu papakiaʻi?",
     "imgmultipageprev": "← ʻaoʻao aku nei",
     "imgmultipagenext": "ʻaoʻao hou aʻe →",
+    "imgmultigo": "Kele!",
+    "imgmultigoto": "Kele i ka ʻaoʻao $1",
+    "img-lang-default": "(ʻōlelo paʻamau)",
+    "img-lang-info": "Hana i kēia kiʻi ma ka $1. $2",
+    "img-lang-go": "Kele",
+    "ascending_abbrev": "Pilu",
+    "descending_abbrev": "Pila",
     "table_pager_next": "ʻAoʻao hou aʻe",
     "table_pager_prev": "ʻAoʻao aku nei",
+    "table_pager_first": "ʻAoʻao mua",
+    "table_pager_last": "ʻAoʻao hope",
+    "table_pager_limit": "Hōike i $1 mau ʻikamu no kekahi ʻaoʻao",
+    "table_pager_limit_label": "ʻIkamu no kekahi ʻaoʻao:",
+    "table_pager_limit_submit": "Kele",
+    "table_pager_empty": "ʻAʻohe hualoaʻa",
     "autosumm-replace": "Ke pani nei i ka mealoko me '$1'",
     "autoredircomment": "Kiahou i ka ʻaoʻao iā [[$1]]",
     "autosumm-new": "Ua hoʻokumu ʻia kekahi ʻaoʻao me '$1'",
     "watchlisttools-raw": "Hoʻololi i ka papakiaʻi maka",
     "duplicate-defaultsort": "<strong>E akahele:</strong> Mauʻaʻe ke kī kaʻalike paʻamau \"$2\" i ke kī kaʻalike paʻamau \"$1\" mai ka wā mua.",
     "version-specialpages": "Nā ‘Ao‘ao kūikawā",
+    "version-poweredby-translators": "Mea unuhi translatewiki.net",
+    "version-software-version": "Mana",
+    "redirect": "Kiahou e ka waihona, ka mea hoʻohana, ka ʻaoʻao aiʻole ka ID loihape",
+    "redirect-legend": "Kiahou i kekahi waihona aiʻole kekahi ʻaoʻao",
+    "redirect-summary": "Kiahou kēia ʻaoʻao kūikawā i kekahi waihona (inā hāʻawi ʻia kekahi inoa waihona), kekahi ʻaoʻao (inā hāʻawi ʻia kekahi ID loihape aiʻole ID ʻaoʻao) aiʻole kekahi ʻaoʻao mea hoʻohana (inā hāʻawi ʻia ka ID mea hoʻohana helu). Ka hana ʻana: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]], aiʻole [[{{#Special:Redirect}}/user/101]].",
+    "redirect-submit": "Huli",
+    "redirect-lookup": "Huli no:",
+    "redirect-value": "Helu:",
+    "redirect-user": "ID mea hoʻohana",
+    "redirect-page": "ID ʻaoʻao",
+    "redirect-revision": "Loihape ʻaoʻao",
+    "redirect-file": "Inoa waihona",
+    "fileduplicatesearch-filename": "Inoawaihona:",
     "fileduplicatesearch-submit": "Huli",
     "specialpages": "Nā ‘Ao‘ao kūikawā",
+    "blankpage": "ʻAoʻao hakahaka",
     "external_image_whitelist": " #Waiho i kēia laina<pre>\n#Kau i nā hapa haʻi maʻamau (nā hapa e kau ʻia ma waena o nā //) i lalo\n#Hoʻohālikelike ia mea me nā URL o nā kiʻi kūwaho (loulouhūnāloko)\n#Hōʻike ʻia ia mea e hoʻohālikelike me he mau kiʻi, inā ʻaʻole pēlā e hōʻike wale me he loulou no ke kiʻi wale nō\n#Mālama ʻia nā laina e hoʻomaka me ka # e like me nā kaumanaʻo\n#Kākau wale, mai hopohopo e pili ana nā ʻaui\n\n#Kau i nā hapa ligaka apau ma luna o kēia laina. Wahiho i kēia laina</pre>",
     "tag-filter": "Kānana [[Special:Tags|lepili]]:",
+    "tag-filter-submit": "Kānana",
+    "tags-title": "Lepili",
+    "tags-tag": "Inoa lepili",
+    "tags-active-yes": "ʻAe",
+    "tags-active-no": "ʻAʻole",
     "tags-edit": "hoʻololi",
+    "tags-hitcount": "$1 {{PLURAL:$1|loli|mau loli}}",
+    "compare-page1": "ʻAoʻao 1",
+    "compare-page2": "ʻAoʻao 2",
+    "compare-rev1": "Loihape 1",
+    "compare-rev2": "Loihape 2",
+    "htmlform-submit": "Waiho",
+    "htmlform-reset": "Hanaʻole i nā loli",
+    "htmlform-selectorother-other": "Mea ʻē aʻe",
+    "htmlform-no": "ʻAʻole",
+    "htmlform-yes": "ʻAe",
+    "htmlform-chosen-placeholder": "Koho i kekahi koho",
+    "rightsnone": "(ʻaʻohe)",
+    "feedback-subject": "Kumunui:",
+    "feedback-message": "Pūlono:",
+    "feedback-cancel": "Hoʻōki",
+    "feedback-submit": "Hoʻouna i nā Manaʻo",
+    "feedback-adding": "Ke hoʻohui nei i ka manaʻo i ka ʻaoʻao...",
+    "feedback-close": "Ua pau",
+    "searchsuggest-search": "Huli",
+    "api-error-unknown-code": "Hewa ʻikeʻole: \"$1\".",
+    "api-error-unknown-warning": "Akahele ʻikeʻole: \"$1\".",
+    "api-error-unknownerror": "Hewa ʻikeʻole: \"$1\".",
+    "duration-seconds": "$1 {{PLURAL:$1|kekona|mau kekona}}",
+    "duration-minutes": "$1 {{PLURAL:$1|minuke|mau minuke}}",
+    "duration-hours": "$1 {{PLURAL:$1|hola|mau hola}}",
+    "duration-days": "$1 {{PLURAL:$1|lā|mau lā}}",
+    "duration-weeks": "$1 {{PLURAL:$1|pule|mau pule}}",
+    "duration-years": "$1 {{PLURAL:$1|makahiki|mau makahiki}}",
+    "duration-decades": "$1 {{PLURAL:$1|kekeke|mau kekeke}}",
+    "duration-centuries": "$1 {{PLURAL:$1|kenekulia|mau kenekulia}}",
+    "duration-millennia": "$1 {{PLURAL:$1|melenio|mau melenio}}",
+    "expand_templates_output": "Hualoaʻa",
     "expand_templates_ok": "Hiki nō",
+    "expand_templates_remove_comments": "Holoi i nā kaumanaʻo",
     "expand_templates_preview": "Nāmua"
 }
index e6461b9..27d259b 100644 (file)
     "permalink": "קישור קבוע",
     "print": "גרסה להדפסה",
     "view": "צפייה",
+    "view-foreign": "הצגה ב{{GRAMMAR:תחילית|$1}}",
     "edit": "עריכה",
+    "edit-local": "עריכת התיאור המקומי",
     "create": "יצירה",
+    "create-local": "הוספת תיאור מקומי",
     "editthispage": "עריכת דף זה",
     "create-this-page": "יצירת דף זה",
     "delete": "מחיקה",
     "pool-timeout": "זמן ההמתנה לסיום הנעילה עבר",
     "pool-queuefull": "התור מלא",
     "pool-errorunknown": "שגיאה בלתי ידועה",
+    "pool-servererror": "שירות המנייה אינו זמין ($1).",
     "aboutsite": "אודות {{SITENAME}}",
     "aboutpage": "Project:אודות",
     "copyright": "התוכן זמין לפי תנאי $1 אלא אם נאמר אחרת.",
     "accountcreatedtext": "חשבון המשתמש [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|שיחה]]) נוצר.",
     "createaccount-title": "יצירת חשבון ב{{grammar:תחילית|{{SITENAME}}}}",
     "createaccount-text": "מישהו יצר חשבון בשם $2 ב{{grammar:תחילית|{{SITENAME}}}} ($4), והסיסמה הזמנית של החשבון היא \"$3\". עליכם להיכנס ולשנות עכשיו את הסיסמה.\n\nבאפשרותכם להתעלם מהודעה זו, אם החשבון נוצר בטעות.",
-    "usernamehasherror": "שם משתמש אינו יכול לכלול תווי סולמית",
     "login-throttled": "ביצעתם לאחרונה ניסיונות רבים מדי להיכנס לחשבון זה.\nאנא המתינו $1 לפני שתנסו שוב.",
     "login-abort-generic": "הכניסה לחשבון לא הצליחה - היא הופסקה",
     "loginlanguagelabel": "שפה: $1",
     "prefs-skin": "עיצוב",
     "skin-preview": "תצוגה מקדימה",
     "datedefault": "ברירת המחדל",
-    "prefs-beta": "אפשרויות בטא",
-    "prefs-datetime": "תאריך ושעה",
     "prefs-labs": "אפשרויות מעבדה",
     "prefs-user-pages": "דפי משתמש",
     "prefs-personal": "פרטי המשתמש",
     "upload-permitted": "סוגי קבצים מותרים: $1.",
     "upload-preferred": "סוגי קבצים מומלצים: $1.",
     "upload-prohibited": "סוגי קבצים אסורים: $1.",
-    "uploadlog": "יומן העלאות קבצים",
     "uploadlogpage": "יומן העלאות",
     "uploadlogpagetext": "להלן רשימה של העלאות הקבצים האחרונות שבוצעו.\nראו את [[Special:NewFiles|גלריית הקבצים החדשים]] להצגה ויזואלית שלהם.",
     "filename": "שם הקובץ",
     "filereuploadsummary": "השינויים בקובץ:",
     "filestatus": "מעמד זכויות יוצרים:",
     "filesource": "מקור:",
-    "uploadedfiles": "קבצים שהועלו",
     "ignorewarning": "התעלמות מהאזהרה ושמירת הקובץ בכל זאת",
     "ignorewarnings": "התעלמות מכל האזהרות",
     "minlength1": "שמות קבצים צריכים להיות בני תו אחד לפחות.",
     "overwroteimage": "העלה גרסה חדשה של הקובץ [[$1]]",
     "uploaddisabled": "העלאת קבצים מבוטלת.",
     "copyuploaddisabled": "העלאת קבצים מכתובת URL מבוטלת.",
-    "uploadfromurl-queued": "העלאתכם הועברה לתור המשימות.",
     "uploaddisabledtext": "אפשרות העלאת הקבצים מבוטלת.",
     "php-uploaddisabledtext": "אפשרות העלאת הקבצים מבוטלת ברמת PHP. אנא בדקו את ההגדרה file_uploads.",
     "uploadscripted": "הקובץ כולל קוד סקריפט או HTML שעשוי להתפרש או להתבצע בטעות על ידי הדפדפן.",
     "upload-misc-error": "שגיאת העלאה בלתי ידועה",
     "upload-misc-error-text": "שגיאת העלאה בלתי ידועה התרחשה במהלך ההעלאה.\nאנא ודאו שכתובת ה־URL תקינה וזמינה ונסו שוב.\nאם הבעיה חוזרת על עצמה, אנא צרו קשר עם [[Special:ListUsers/sysop|מפעיל מערכת]].",
     "upload-too-many-redirects": "הכתובת מכילה הפניות רבות מדי",
-    "upload-unknown-size": "גודל בלתי ידוע",
     "upload-http-error": "התרחשה שגיאת HTTP‏: $1",
     "upload-copy-upload-invalid-domain": "העלאת קבצים משרת זה אינה אפשרית.",
     "backend-fail-stream": "לא הייתה אפשרות להזרים את הקובץ \"$1\".",
     "img-auth-streaming": "מבצע הזרמה של \"$1\".",
     "img-auth-public": "img_auth.php משמש להצגת קבצים מתוך אתר ויקי פרטי.\nאתר ויקי זה מוגדר כציבורי.\nכדי להשיג אבטחה מרבית, img_auth.php מבוטל.",
     "img-auth-noread": "למשתמש אין הרשאה לקרוא את \"$1\".",
-    "img-auth-bad-query-string": "לכתובת ה־URL יש מחרוזת פרמטרים בלתי תקינה.",
     "http-invalid-url": "כתובת URL בלתי תקינה: $1",
     "http-invalid-scheme": "כתובות URL מהסוג \"$1\" אינן נתמכות.",
     "http-request-error": "בקשת ה־HTTP נכשלה עקב שגיאה בלתי ידועה.",
     "filehist-dimensions": "ממדים",
     "filehist-filesize": "גודל הקובץ",
     "filehist-comment": "הערה",
-    "filehist-missing": "הקובץ חסר",
     "imagelinks": "שימוש בקובץ",
     "linkstoimage": "{{PLURAL:$1|הדף הבא משתמש|הדפים הבאים משתמשים}} בקובץ זה:",
     "linkstoimage-more": "יותר {{PLURAL:$1|מדף אחד מקשר|מ־$1 דפים מקשרים}} לקובץ זה.\nהרשימה הבאה מראה רק את {{PLURAL:$1|הדף הראשון שמקשר|$1 הדפים הראשונים שמקשרים}} לקובץ זה.\nניתן לצפות ב[[Special:WhatLinksHere/$2|רשימה המלאה]].",
     "listgrouprights-removegroup-self": "הסרת {{PLURAL:$2|הקבוצה|הקבוצות}} מהחשבון האישי: $1",
     "listgrouprights-addgroup-self-all": "הוספת כל הקבוצות לחשבון האישי",
     "listgrouprights-removegroup-self-all": "הסרת כל הקבוצות מהחשבון האישי",
+    "listgrouprights-namespaceprotection-header": "הגבלות על מרחבי שם",
+    "listgrouprights-namespaceprotection-namespace": "מרחב השם",
+    "listgrouprights-namespaceprotection-restrictedto": "ההרשאה או ההרשאות המאפשרות למשתמשים לערוך",
+    "trackingcategories": "קטגוריות מעקב",
+    "trackingcategories-summary": "דף זה כולל רשימה של קטגוריות מעקב, שנוצרות אוטומטית על־ידי תוכנת מדיה‏‏֫־ויקי. ניתן לשנות את שמותיהן על‏‏֫־ידי שינוי הודעות המערכת הרלוונטיות במרחב השם \"{{ns:8}}\".",
+    "trackingcategories-msg": "קטגוריית מעקב",
+    "trackingcategories-name": "שם ההודעה",
+    "trackingcategories-desc": "הקריטריון להכללה בקטגוריה",
+    "noindex-category-desc": "הדף אינו מאונדקס על‏‏־ידי רובוטים כיוון שהוא כולל את מילת הקסם <code><nowiki>__NOINDEX__</nowiki></code> והוא במרחב שם שבו דגל כזה מותר לשימוש.",
+    "index-category-desc": "הדף כולל את מילת הקסם <code><nowiki>__INDEX__</nowiki></code> (והוא במרחב שם שבו דגל כזה מותר לשימוש), ולכן הוא מאונדקס על‏‏֫־ידי רובוטים אף שכברירת מחדל הוא לא היה מאונדקס על ידם.",
+    "post-expand-template-inclusion-category-desc": "לאחר הרחבת כל התבניות, גודל הדף גדול מ‏‏֫־<code>$wgMaxArticleSize</code>, ולכן מספר תבניות אינן מורחבות.",
+    "post-expand-template-argument-category-desc": "לאחר הרחבת ארגומנט של תבנית (משהו בסוגריים משולשים, כגון <code>{{{Foo}}})</code>, הדף גדול מ‏‏֫‏‏֫־<code>$wgMaxArticleSize</code>.",
+    "expensive-parserfunction-category-desc": "יותר מדי פונקציות מפענח יקרות לשימוש (כגון #קיים) מוכללות בדף. ראו [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit Manual:$wgExpensiveParserFunctionLimit].",
+    "broken-file-category-desc": "הקטגוריה נוספת אם הדף כולל קישור שבור לקובץ (קישור להטמעת קובץ כאשר הקובץ אינו קיים).",
+    "hidden-category-category-desc": "קטגוריה זו כוללת את מילת הקסם <nowiki>__קטגוריה_מוסתרת__</nowiki>, שגורמת לה לא להופיע בתיבת קישורי הקטגוריות בדפים כברירת מחדל.",
+    "trackingcategories-nodesc": "התיאור אינו זמין.",
+    "trackingcategories-disabled": "הקטגוריה מבוטלת",
     "mailnologin": "אין כתובת לשליחה",
     "mailnologintext": "עליכם [[Special:UserLogin|להיכנס לחשבון]] ולהגדיר לעצמכם כתובת דואר אלקטרוני תקינה ב[[Special:Preferences|העדפות המשתמש]] שלכם כדי לשלוח דואר למשתמש אחר.",
     "emailuser": "שליחת דואר אלקטרוני למשתמש זה",
     "emailuser-title-notarget": "שליחת דוא\"ל למשתמש",
     "emailpage": "שליחת דואר למשתמש",
     "emailpagetext": "ניתן להשתמש בטופס כדי לשלוח הודעת דואר אלקטרוני {{GENDER:$1|למשתמש זה|למשתמשת זו}}.\nכתובת הדואר האלקטרוני שכתבתם ב[[Special:Preferences|העדפות המשתמש שלכם]] תופיע ככתובת שההודעה נשלחה ממנה, כדי לאפשר תגובה ישירה.",
-    "usermailererror": "אובייקט הדואר החזיר שגיאה:",
     "defemailsubject": "דוא\"ל מ{{grammar:תחילית|{{SITENAME}}}} מהמשתמש \"$1\"",
     "usermaildisabled": "שליחת דוא\"ל למשתמשים מבוטלת",
     "usermaildisabledtext": "אינכם רשאים לשלוח דואר אלקטרוני למשתמשים אחרים באתר זה",
     "noemailtitle": "אין כתובת דואר אלקטרוני",
     "noemailtext": "משתמש זה לא הזין כתובת דואר אלקטרוני תקינה.",
-    "nowikiemailtitle": "שליחת דוא\"ל אינה אפשרית",
     "nowikiemailtext": "משתמש זה בחר שלא לקבל דואר אלקטרוני ממשתמשים אחרים.",
     "emailnotarget": "שם המשתמש של הנמען לא קיים או בלתי תקין.",
     "emailtarget": "הקלידו את שם המשתמש של הנמען",
     "nowatchlist": "אין דפים ברשימת המעקב.",
     "watchlistanontext": "עליכם $1 כדי לצפות או לערוך פריטים ברשימת המעקב.",
     "watchnologin": "לא נכנסת לחשבון",
-    "watchnologintext": "עליכם [[Special:UserLogin|להיכנס לחשבון]] כדי לערוך את רשימת המעקב.",
     "addwatch": "הוספה לרשימת המעקב",
     "addedwatchtext": "הדף [[:$1]] נוסף ל[[Special:Watchlist|רשימת המעקב]].\nשינויים שייערכו בעתיד בדף זה ובדף השיחה שלו, יוצגו ברשימת המעקב.",
     "removewatch": "הסרה מרשימת המעקב",
     "unwatchthispage": "הפסקת המעקב אחרי דף זה",
     "notanarticle": "זהו אינו דף תוכן",
     "notvisiblerev": "הגרסה האחרונה שנוצרה על־ידי משתמש אחר נמחקה",
-    "watchlist-details": "ברשימת המעקב יש {{PLURAL:$1|דף אחד|$1 דפים}} (לא כולל דפי שיחה).",
+    "watchlist-details": "ברשימת המעקב יש {{PLURAL:$1|דף אחד|$1 דפים}}, כאשר דפי השיחה אינם נספרים בנפרד.",
     "wlheader-enotif": "הודעות דוא\"ל מאופשרות.",
     "wlheader-showupdated": "דפים שהשתנו מאז ביקורך האחרון בהם מוצגים ב'''הדגשה'''.",
     "watchmethod-recent": "בודק את הדפים שברשימת המעקב לשינויים אחרונים.",
     "watching": "בהוספה לרשימת המעקב…",
     "unwatching": "בהסרה מרשימת המעקב…",
     "watcherrortext": "אירעה שגיאה בעת שינוי הגדרות רשימת המעקב של \"$1\".",
-    "enotif_mailer": "הודעות {{SITENAME}}",
     "enotif_reset": "סימון כל הדפים כאילו נצפו",
     "enotif_impersonal_salutation": "משתמש של {{SITENAME}}",
     "enotif_subject_deleted": "הדף $1 ב{{grammar:תחילית|{{SITENAME}}}} נמחק על ידי $2",
     "excontent": "התוכן היה: \"$1\"",
     "excontentauthor": "התוכן היה: \"$1\" ({{GENDER:$2|והתורם היחיד היה|והתורמת היחידה הייתה}} \"[[Special:Contributions/$2|$2]]\")",
     "exbeforeblank": "התוכן לפני שרוקן היה: \"$1\"",
-    "exblank": "הדף היה ריק",
     "delete-confirm": "מחיקת $1",
     "delete-legend": "מחיקה",
     "historywarning": "'''אזהרה:''' לדף שאתם עומדים למחוק יש היסטוריית שינויים של {{PLURAL:$1|גרסה אחת|$1 גרסאות}}:",
     "contributions-title": "תרומות של ה{{GENDER:$1|משתמש|משתמשת}} $1",
     "mycontris": "תרומות",
     "contribsub2": "עבור {{GENDER:$3|$1}} ($2)",
+    "contributions-userdoesnotexist": "החשבון \"$1\" אינו רשום.",
     "nocontribs": "לא נמצאו שינויים המתאימים לקריטריונים אלו.",
     "uctop": "(נוכחי)",
     "month": "עד החודש:",
     "sp-contributions-newbies-sub": "עבור משתמשים חדשים",
     "sp-contributions-newbies-title": "תרומות של משתמשים חדשים",
     "sp-contributions-blocklog": "יומן חסימות",
+    "sp-contributions-suppresslog": "תרומות משתמש מוסתרות",
     "sp-contributions-deleted": "תרומות משתמש מחוקות",
     "sp-contributions-uploads": "העלאות",
     "sp-contributions-logs": "יומנים",
     "sp-contributions-blocked-notice": "{{GENDER:$1|המשתמש הזה חסום|המשתמשת הזו חסומה}} כרגע.\nהפעולה האחרונה ביומן החסימות מוצגת להלן:",
     "sp-contributions-blocked-notice-anon": "כתובת IP זו חסומה כרגע.\nהפעולה האחרונה ביומן החסימות מוצגת להלן:",
     "sp-contributions-search": "חיפוש תרומות",
-    "sp-contributions-suppresslog": "תרומות משתמש מוסתרות",
     "sp-contributions-username": "שם משתמש או כתובת IP:",
     "sp-contributions-toponly": "הצגת עריכות שהן הגרסאות האחרונות בלבד",
     "sp-contributions-newonly": "הצגת עריכות שהן יצירות של דפים בלבד",
     "allmessagesname": "שם",
     "allmessagesdefault": "טקסט ברירת המחדל של ההודעה",
     "allmessagescurrent": "הטקסט הנוכחי של ההודעה",
-    "allmessagestext": "זוהי רשימת כל הודעות המערכת שבמרחב השם {{ns:mediawiki}}, המשמשות את ממשק האתר.\n\nמפעילי המערכת יכולים לערוך את ההודעות בלחיצה על שם ההודעה.",
+    "allmessagestext": "זוהי רשימת כל הודעות המערכת שבמרחב השם {{ns:mediawiki}}.\nאנא בקרו בדף [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation MediaWiki Localisation] וב‏‏֫אתר [//translatewiki.net translatewiki.net] אם ברצונכם לתרום לתרגום הכללי של מדיה‏‏֫־ויקי.",
     "allmessagesnotsupportedDB": "לא ניתן להשתמש בדף זה כיוון ש־wgUseDatabseMessages מבוטל.",
     "allmessages-filter-legend": "מסנן",
     "allmessages-filter": "סינון לפי מצב ההודעה:",
     "importunknownsource": "סוג ייבוא בלתי ידוע",
     "importcantopen": "פתיחת קובץ הייבוא נכשלה",
     "importbadinterwiki": "קישור בינוויקי שגוי",
-    "importnotext": "ריק או חסר טקסט",
     "importsuccess": "הייבוא הושלם בהצלחה!",
-    "importhistoryconflict": "ישנה התנגשות עם ההיסטוריה הקיימת של הדף (ייתכן שהדף יובא בעבר)",
     "importnosources": "אין מקורות לייבוא בין־אתרי, וייבוא ישיר של דף עם היסטוריה אינו מאופשר כעת.",
     "importnofile": "לא הועלה קובץ ייבוא.",
     "importuploaderrorsize": "העלאת קובץ הייבוא נכשלה. הקובץ היה גדול יותר מגודל ההעלאה המותר.",
     "expand_templates_remove_nowiki": "הסרת תגי <nowiki> בתוצאה",
     "expand_templates_generate_xml": "הצגת עץ הפענוח של XML",
     "expand_templates_generate_rawhtml": "הצגת HTML גולמי",
-    "expand_templates_preview": "תצוגה מקדימה",
-    "trackingcategories": "קטגוריות מעקב",
-    "trackingcategories-summary": "דף זה כולל רשימה של קטגוריות מעקב, שנוצרות אוטומטית על ידי תוכנת מדיה‏‏֫־ויקי. ניתן לשנות את שמותיהן על‏‏֫־ידי שינוי הודעות המערכת הרלוונטיות במרחב השם \"{{ns:8}}\".",
-    "trackingcategories-msg": "קטגוריית מעקב",
-    "trackingcategories-name": "שם ההודעה",
-    "trackingcategories-desc": "הקריטריון להכללה בקטגוריה",
-    "noindex-category-desc": "הדף כולל את מילת הקסם <nowiki>__לא_לחיפוש__</nowiki> (והוא במרחב שם שבו דגל כזה מותר לשימוש), ולכן אינו מאונדקס על‏‏֫־ידי רובוטים.",
-    "index-category-desc": "הדף כולל את מילת הקסם <nowiki>__לחיפוש__</nowiki> (והוא במרחב שם שבו דגל כזה מותר לשימוש), ולכן הוא מאונדקס על‏‏֫־ידי רובוטים אף שכברירת מחדל הוא לא היה מאונדקס על ידם.",
-    "post-expand-template-inclusion-category-desc": "לאחר הרחבת כל התבניות, גודל הדף גדול מ‏‏֫־$wgMaxArticleSize, ולכן מספר תבניות אינן מורחבות.",
-    "post-expand-template-argument-category-desc": "לאחר הרחבת ארגומנט של תבנית (משהו בסוגריים משולשים, כגון {{{Foo}}}), הדף גדול מ‏‏֫‏‏֫־$wgMaxArticleSize.",
-    "expensive-parserfunction-category-desc": "יותר מדי פונקציות מפענח יקרות לשימוש (כגון #קיים) מוכללות בדף. ראו [https://www.mediawiki.org/wiki/Manual:$wgExpensiveParserFunctionLimit Manual:$wgExpensiveParserFunctionLimit].",
-    "broken-file-category-desc": "הקטגוריה נוספת אם הדף כולל קישור שבור לקובץ (קישור להטמעת קובץ כאשר הקובץ אינו קיים).",
-    "hidden-category-category-desc": "קטגוריה זו כוללת את מילת הקסם <nowiki>__קטגוריה_מוסתרת__</nowiki>, שגורמת לה לא להופיע בתיבת קישורי הקטגוריות בדפים כברירת מחדל.",
-    "trackingcategories-nodesc": "התיאור אינו זמין.",
-    "trackingcategories-disabled": "הקטגוריה מבוטלת"
+    "expand_templates_preview": "תצוגה מקדימה"
 }
index 4c5d915..ad2d99c 100644 (file)
     "permalink": "स्थायी कड़ी",
     "print": "प्रिंट करें",
     "view": "दर्शाव",
+    "view-foreign": "$1 पर देखें",
     "edit": "सम्पादन",
     "create": "बनाएँ",
     "editthispage": "इस पृष्ठ को बदलें",
     "pool-timeout": "तालाबन्दी के लिए प्रतीक्षा समय समाप्त",
     "pool-queuefull": "पूल पंक्ति भरी हुई है",
     "pool-errorunknown": "अज्ञात त्रुटि",
+    "pool-servererror": "पूल काउंटर सेवा उपलब्ध नहीं है ($1)।",
     "aboutsite": "{{SITENAME}} के बारे में",
     "aboutpage": "Project:परिचय",
     "copyright": "उपलब्ध सामग्री $1 के अधीन है जब तक अलग से उल्लेख ना किया गया हो।",
     "accountcreatedtext": "[[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|वार्ता]]) के लिये खाता निर्मित कर दिया गया है।",
     "createaccount-title": "{{SITENAME}} के लिये खाता बनाएँ",
     "createaccount-text": "आपके ई-मेल पते के लिये किसी ने {{SITENAME}} ($4) पर \"$2\" सदस्य नाम से \"$3\" कूटशब्द (पासवर्ड) सहित खाता खोला है।\nआपको लॉग इन कर के अपना कूटशब्द (पासवर्ड) तुरंत बदल लेना चाहिये।\n\nयदि यह खाता गलती से खोला गया है, तो आप इस मेसेज को नज़रंदाज़ कर सकते हैं।",
-    "usernamehasherror": "सदस्यनाम में हैश कैरैक्टर वर्जित हैं।",
     "login-throttled": "आपने हाल ही में कई बार लॉग इन करने के प्रयास किये हैं।\nपुनः प्रयास करने से पहले कृपया $1 प्रतीक्षा करें।",
     "login-abort-generic": "आपका सत्रारम्भ असफल रहा - निष्फलित",
     "loginlanguagelabel": "भाषा: $1",
     "prefs-skin": "त्वचा",
     "skin-preview": "झलक",
     "datedefault": "खा़स पसंद नहीं",
-    "prefs-beta": "बीटा सुविधाएँ",
-    "prefs-datetime": "दिनांक तथा समय",
     "prefs-labs": "लैब विशेषताएँ",
     "prefs-user-pages": "सदस्य पृष्ठ",
     "prefs-personal": "सदस्य व्यक्तिरेखा",
     "upload-permitted": "अनुमतित फ़ाइल प्रकार: $1।",
     "upload-preferred": "पसंदीदा फ़ाइल प्रकार: $1।",
     "upload-prohibited": "प्रतिबंधिक फ़ाइल प्रकार: $1।",
-    "uploadlog": "अपलोड लॉग",
     "uploadlogpage": "अपलोड लॉग",
     "uploadlogpagetext": "नीचे हाल ही में अपलोड की गई फ़ाइलों की सूची है।\nकृपया और द्रैश्यिक विवरण के लिए [[Special:NewFiles|नई फ़ाइलों की गैलरी]] देखें।",
     "filename": "फ़ाइल का नाम",
     "filereuploadsummary": "फ़ाइल में बदलाव:",
     "filestatus": "कॉपीराइट स्थिति:",
     "filesource": "स्रोत:",
-    "uploadedfiles": "अपलोड की हुई फ़ाइलें",
     "ignorewarning": "चेतावनियाँ नज़र‍ंदाज़ करें और फ़ाइल अपलोड करें",
     "ignorewarnings": "सभी चेतावनियों को नज़रंदाज़ करें",
     "minlength1": "फ़ाइल का नाम कम-से-कम एक अक्षर का होना चाहिये।",
     "overwroteimage": "\"[[$1]]\" का नया अवतरण अपलोड किया",
     "uploaddisabled": "अपलोड प्रतिबंधित हैं।",
     "copyuploaddisabled": "यू॰आर॰एल द्वारा अपलोड अक्षम हैं।",
-    "uploadfromurl-queued": "आपका अपलोड पंक्तिबद्ध किया गया।",
     "uploaddisabledtext": "फ़ाइल अपलोड अक्षम हैं।",
     "php-uploaddisabledtext": "पी॰एच॰पी में फ़ाइल अपलोड बंद हैं।\nकृपया file_uploads जमाव की जाँच करें।",
     "uploadscripted": "इस फ़ाइल में एच॰टी॰एम॰एल या स्क्रिप्ट कोड है, जो वेब ब्राउज़र द्वारा गलत पढ़ा जा सकता है।",
     "upload-misc-error": "अज्ञात अपलोड त्रुटि",
     "upload-misc-error-text": "अपलोड के दौरान कोई अज्ञात त्रुटि आई।\nकृपया यह पुष्टि कर लें कि यू॰आर॰एल वैध है और उस तक पहुँचा जा सकता है, उसके बाद फिर कोशिश करें।\nअगर फिर भी समस्या आती है तो किसी [[Special:ListUsers/sysop|प्रबंधक]] से संपर्क करें।",
     "upload-too-many-redirects": "इस यू॰आर॰एल में अत्यधिक पुनर्निर्देशन हैं",
-    "upload-unknown-size": "अज्ञात आकार",
     "upload-http-error": "एक एच॰टी॰टी॰पी त्रुटि आई: $1",
     "upload-copy-upload-invalid-domain": "कॉपी अपलोड इस डोमेन से उपलब्ध नहीं हैं।",
     "backend-fail-stream": "फ़ाइल $1 स्ट्रीम नहीं हो पाई।",
     "img-auth-streaming": "\"$1\" को स्ट्रीम किया जा रहा है।",
     "img-auth-public": "img_auth.php निजी विकि से फ़ाइलें प्रदान करने का काम करता है।\nयह विकि सार्वजनिक विकि है।\nउचित सुरक्षा के लिए img_auth.php को अक्षम है।",
     "img-auth-noread": "प्रयोक्ता को \"$1\" पढ़ने का अधिकार नहीं है।",
-    "img-auth-bad-query-string": "यू॰आर॰एल में अवैध क्वेरी स्ट्रिंग है।",
     "http-invalid-url": "अमान्य यू॰आर॰एल: $1",
     "http-invalid-scheme": "\"$1\" से शुरू होने वाले यू॰आर॰एल स्वीकार्य नहीं हैं।",
     "http-request-error": "एच॰टी॰टी॰पी अनुरोध अज्ञात त्रुटि के कारण असफल रहा।",
     "filehist-dimensions": "आकार",
     "filehist-filesize": "फ़ाईल का आकार (बाइट)",
     "filehist-comment": "टिप्पणी",
-    "filehist-missing": "फ़ाइल मौजूद नहीं है",
     "imagelinks": "फ़ाइल का उपयोग",
     "linkstoimage": "निम्नोक्त {{PLURAL:$1|पृष्ठ|$1 पन्नों}} में इस फ़ाइल की कड़ियाँ हैं:",
     "linkstoimage-more": "{{PLURAL:$1|$1}} से अधिक पृष्ठ इस फ़ाइल से जुड़ते हैं।\nनिम्नोक्त सूची फ़ाइल से जुड़ने वाले {{PLURAL:$1|$1 पृष्ठ|$1 पृष्ठ}} दिखाती है।\n[[Special:WhatLinksHere/$2|पूरी सूची]] भी उपलब्ध है।",
     "listgrouprights-removegroup-self": " अपने  खाते से {{PLURAL:$2|समूह}} हटाएँ: $1",
     "listgrouprights-addgroup-self-all": "अपने खाते में सभी समूह शामिल करें",
     "listgrouprights-removegroup-self-all": "अपने खाते से सभी समूह हटाएँ",
+    "listgrouprights-namespaceprotection-namespace": "नामस्थान",
+    "trackingcategories-nodesc": "कोई वर्णन उपलब्ध नहीं।",
     "mailnologin": "पाने वाले का एड्रेस दिया नहीं",
     "mailnologintext": "अन्य सदस्यों को इ-मेल भेजने के लिये [[Special:UserLogin|लॉग इन]] करना आवश्यक है और आपकी [[Special:Preferences|वरीयताओं]] में वैध ई-मेल पता होना आवश्यक है।",
     "emailuser": "इस सदस्य को ई-मेल भेजें",
     "emailuser-title-notarget": "सदस्य को ई-मेल करें",
     "emailpage": "सदस्य को ई-मेल करें",
     "emailpagetext": "नीचे दिए पर्चे को जरिए आप इस {{GENDER:$1|सदस्य}} को ई-मेल भेज सकते हैं।\nआपने जो पता [[Special:Preferences|अपनी पसंद]] में दिया था वह इस ई-मेल के \"भेजने वाले\" के तौर पर आएगा, अतः प्राप्तकर्ता आपको सीधे जवाब दे सकेंगे।",
-    "usermailererror": "मेल ऑब्जेक्ट ने त्रुटि दी:",
     "defemailsubject": "{{SITENAME}} ई-मेल \"$1\" सदस्य से",
     "usermaildisabled": "सदस्य ई-मेल अक्षम किया गया",
     "usermaildisabledtext": "आप इस विकि पर ई-मेल अन्य सदस्यों को ई-मेल नहीं भेज सकते हैं",
     "noemailtitle": "कोई ई-मेल एड्रेस नहीं",
     "noemailtext": "इस सदस्य ने वैध ई-मेल पता नहीं दिया है।",
-    "nowikiemailtitle": "ई-मेल की अनुमति नहीं है",
     "nowikiemailtext": "इस सदस्य ने अन्य सदस्यों से ई-मेल न प्राप्त करने का फ़ैसला लिया हुआ है।",
     "emailnotarget": "प्राप्तकर्ता के लिए अस्तित्वहीन या अमान्य सदस्यनाम।",
     "emailtarget": "प्राप्तकर्ता का सदस्यनाम भरें",
     "nowatchlist": "आपकी ध्यानसूची में कोई भी पृष्ठ नहीं हैं।",
     "watchlistanontext": "अपनी ध्यानसूची में मौजूद पृष्ठ देखने या फिर संपादित करने के लिये कॄपया $1 करें।",
     "watchnologin": "लॉग इन नहीं किया है",
-    "watchnologintext": "ध्यानसूची में बदलाव के लिये [[Special:UserLogin|लॉग इन]] करना आवश्यक है।",
     "addwatch": "ध्यानसूची में जोड़ें",
     "addedwatchtext": "आपकी [[Special:Watchlist|ध्यानसूची]] में \"[[:$1]]\" पृष्ठ जोड़ दिया गया है।\nभविष्य में इस पृष्ठ तथा इसके वार्ता पृष्ठ में होने वाले बदलाव आपकी ध्यानसूची में दिखेंगे।",
     "removewatch": "ध्यानसूची से हटाएँ",
     "watching": "ध्यान दे रहे हैं...",
     "unwatching": "ध्यान हटा रहे हैं...",
     "watcherrortext": "\"$1\" के लिये आपकी ध्यानसूची सेटिंग बदलते समय त्रुटि हुई।",
-    "enotif_mailer": "{{SITENAME}} सूचना इ-मेल कर्ता",
     "enotif_reset": "सभी पृष्ठ देखे हुए दर्शाएँ",
     "enotif_impersonal_salutation": "{{SITENAME}} सदस्य",
     "enotif_subject_deleted": "{{SITENAME}} पृष्ठ $1 को {{gender:$2|$2}} ने हटा दिया है",
     "excontent": "पाठ था: '$1'",
     "excontentauthor": "पाठ था: '$1' (और सिर्फ '[[Special:Contributions/$2|$2]]' का योगदान था।)",
     "exbeforeblank": "खाली करने से पहले पाठ था: '$1'",
-    "exblank": "पृष्ठ खाली था",
     "delete-confirm": "\"$1\" को हटाएँ",
     "delete-legend": "हटाएँ",
     "historywarning": "''' चेतावनी: ''' आप जो पृष्ठ हटाने जा रहे हैं उसके इतिहास में लगभग $1 {{PLURAL:$1|अवतरण}} हैं:",
     "sp-contributions-search": "योगदान के लिये खोज",
     "sp-contributions-username": "आईपी एड्रेस या सदस्यनाम:",
     "sp-contributions-toponly": "केवल उन सम्पादनों को दिखाएँ जो नवीनतम संशोधन हैं",
+    "sp-contributions-newonly": "केवल वे सम्पादन दिखाएँ जिनसे पृष्ठ निर्मित हुए हों",
     "sp-contributions-submit": "खोजें",
     "whatlinkshere": "यहाँ के हवाले कहाँ कहाँ हैं",
     "whatlinkshere-title": "$1 से जुड़े हुए पृष्ठ",
     "allmessagesname": "नाम",
     "allmessagesdefault": "डिफॉल्ट पाठ",
     "allmessagescurrent": "वर्तमान पाठ",
-    "allmessagestext": "ये मीडियाविकि नामस्थान में उपलब्ध प्रणाली संदेशों की एक सूची है। यदि आप सामान्य मीडियाविकि क्षेत्रीयकरण में योगदान देना चाहें तो कृपया [https://www.mediawiki.org/wiki/Localisation मीडियाविकि क्षेत्रीयकरण] व [//translatewiki.net translatewiki.net] को देखें।",
+    "allmessagestext": "ये मीडियाविकि नामस्थान में उपलब्ध प्रणाली संदेशों की एक सूची है। यदि आप सामान्य मीडियाविकि क्षेत्रीयकरण में योगदान देना चाहें तो कृपया [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation मीडियाविकि क्षेत्रीयकरण] व [//translatewiki.net translatewiki.net] को देखें।",
     "allmessagesnotsupportedDB": "इस पृष्ठ का इस्तेमाल नहीं कर सकते क्योंकी '''$wgUseDatabaseMessages''' बंद हैं।",
     "allmessages-filter-legend": "छानें",
     "allmessages-filter": "अनुकूलन स्थिति के आधार पर छानें:",
     "importunknownsource": "अज्ञात आयात स्रोत प्रकार",
     "importcantopen": "आयात फ़ाईल खोल नहीं पायें",
     "importbadinterwiki": "अवैध अन्तरविकि कड़ी",
-    "importnotext": "खाली अथवा पाठ नहीं",
     "importsuccess": "आयात सफल हुआ!",
-    "importhistoryconflict": "उपलब्ध इतिहास अवतरण आपसमें विरोधी हैं (यह पृष्ठ पहलेसे आयात कर दिया गया होनेकी आशंका हैं)",
     "importnosources": "कोई भी ट्रान्सविकी आयात स्रोत मिले नहीं और प्रत्यक्ष इतिहास अपलोड बन्द कर दिए गए हैं।",
     "importnofile": "कोईभी आयात फ़ाईल अपलोड नहीं हुई हैं।",
     "importuploaderrorsize": "आयात फ़ाईल अपलोड हुई नहीं। इसका आकार अनुमतिसे ज्यादा हैं।",
     "version-entrypoints-header-url": "यू॰आर॰एल",
     "redirect-submit": "जायें",
     "redirect-lookup": "ढूँढें:",
+    "redirect-value": "मूल्य:",
     "redirect-user": "सदस्य आई॰डी",
     "redirect-revision": "पृष्ठ अवतरण संख्या",
     "redirect-file": "फ़ाइल नाम",
     "fileduplicatesearch-result-n": "फ़ाईल \"$1\" में {{PLURAL:$2|1 द्विरावृत्ति|$2 द्विरावृत्तियाँ}} मिले हैं।",
     "fileduplicatesearch-noresults": "कोई फ़ाइल नाम \"$1\" मिला नहीं ।",
     "specialpages": "विशेष पृष्ठ",
+    "specialpages-note-top": "कुंजी",
     "specialpages-note": "* साधारण विशेष पृष्ठ।\n* <span class=\"mw-specialpagerestricted\">प्रतिबंधित विशेष पृष्ठ।</span>",
     "specialpages-group-maintenance": "अनुरक्षण रिपोर्ट",
     "specialpages-group-other": "अन्य विशेष पृष्ठ",
     "expand_templates_remove_comments": "टिप्पणी हटायें",
     "expand_templates_remove_nowiki": "परिणाम में <nowiki> टैग हटाएँ",
     "expand_templates_generate_xml": "XML का पार्स (parse) वृक्ष दर्शायें",
-    "expand_templates_preview": "झलक",
-    "trackingcategories-nodesc": "कोई वर्णन उपलब्ध नहीं।"
+    "expand_templates_preview": "झलक"
 }
index c0f7487..e21b4f3 100644 (file)
     "prefs-skin": "Skin",
     "skin-preview": "Jhalak",
     "datedefault": "Koi pasand nai",
-    "prefs-beta": "Nawaa features",
     "prefs-datetime": "Tarik aur time",
     "prefs-labs": "Try kare waala features",
     "prefs-user-pages": "Sadasya ke panna",
     "nowatchlist": "Aap ke dhyan suchi me koi chij nai hai.",
     "watchlistanontext": "Aapan dhyan suchi me ke dekhe nai to badle ke khatir meharbani kar ke $1 karo.",
     "watchnologin": "Logged in nai hai",
-    "watchnologintext": "Aapan dhyan suchi ke badle ke khatir aap ke [[Special:UserLogin|logged in]] rahe ke chaahi.",
     "addwatch": "Dhyan suchi me jorro",
     "addedwatchtext": "Panna \"[[:$1]]\" ke aap ke [[Special:Watchlist|watchlist]] me jorr dewa gais hae.\nIi panna ke aage ke badlao aur usse jurra baat waala panna ki suchi hian pe hae.",
     "removewatch": "Dhyan suchi me se hatao",
     "allmessagesname": "Naam",
     "allmessagesdefault": "Default text",
     "allmessagescurrent": "Abhi ke text",
-    "allmessagestext": "Ii ek system sandes ke suchi hai jon ki MediaWiki namespace me pawa jaae sake hai.\nAgar aap generic MediaWiki localisation ke yogdaan de mangtaa hai tab meharbani kar ke [https://www.mediawiki.org/wiki/Localisation MediaWiki Localisation] aur [//translatewiki.net translatewiki.net]  pe jao.",
+    "allmessagestext": "Ii ek system sandes ke suchi hai jon ki MediaWiki namespace me pawa jaae sake hai.\nAgar aap generic MediaWiki localisation ke yogdaan de mangtaa hai tab meharbani kar ke [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation MediaWiki Localisation] aur [//translatewiki.net translatewiki.net]  pe jao.",
     "allmessagesnotsupportedDB": "Ii panna ke kaam me nai lawa jaae sake hai kahe ki '''$wgUseDatabaseMessages''' ke band kar dewa gais hai.",
     "allmessages-filter-legend": "Chaalo",
     "allmessages-filter": "Customisation state se chhaano",
index 81c1635..ea7a0e1 100644 (file)
     "unprotectthispage": "Promijeni zaštitu ove stranice",
     "newpage": "Nova stranica",
     "talkpage": "Razgovor o ovoj stranici",
-    "talkpagelinktext": "Razgovor",
+    "talkpagelinktext": "razgovor",
     "specialpage": "Posebna stranica",
     "personaltools": "Osobni alati",
     "postcomment": "Novi odlomak",
     "accountcreatedtext": "Suradnički je račun [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|talk]]) stvoren.",
     "createaccount-title": "Otvaranje suradničkog računa za {{SITENAME}}",
     "createaccount-text": "Netko je stvorio suradnički račun s Vašom adresom elektronske pošte na {{SITENAME}} ($4) nazvan \"$2\", s lozinkom \"$3\". Trebali biste se prijaviti i odmah promijeniti lozinku.\n\nMožete zanemariti ovu poruku ako je suradnički račun stvoren nenamjerno.",
-    "usernamehasherror": "Suradničko ime ne može sadržavati znakove #",
     "login-throttled": "Nedavno ste se previše puta pokušali prijaviti.\nMolimo Vas pričekajte $1 prije nego što pokušate ponovno.",
     "login-abort-generic": "Vaša prijava bila je neuspješna - Prekinuto",
     "loginlanguagelabel": "Jezik: $1",
     "undo-success": "Izmjena je uklonjena (tekst u okviru ispod ne sadrži posljednju izmjenu). Molim sačuvajte stranicu (provjerite sažetak).",
     "undo-failure": "Ova izmjena ne može biti uklonjena zbog postojanja međuinačica.",
     "undo-norev": "Izmjena nije mogla biti uklonjena jer ne postoji ili je obrisana.",
-    "undo-summary": "Uklanjanje izmjene $1 što ju je unio/unijela [[Special:Contributions/$2|$2]] ([[User talk:$2|razgovor]])",
+    "undo-summary": "uklanjanje izmjene $1 {{GENDER:$2|suradnika|suradnice}} [[Posebno:Doprinosi/$2|$2]] ([[Razgovor sa suradnikom:$2|razgovor]])",
     "cantcreateaccounttitle": "Nije moguće stvoriti suradnički račun",
     "cantcreateaccount-text": "Otvaranje suradničkog računa ove IP adrese ('''$1''') blokirao/la je [[User:$3|$3]].\n\nRazlog koji je dao/la $3 je ''$2''",
     "viewpagelogs": "Vidi evidencije za ovu stranicu",
     "prefs-skin": "Izgled",
     "skin-preview": "Pregled",
     "datedefault": "Nemoj postaviti",
-    "prefs-beta": "Beta mogućnosti",
-    "prefs-datetime": "Datum i vrijeme",
     "prefs-labs": "Labs mogućnosti",
     "prefs-user-pages": "Suradničke stranice",
     "prefs-personal": "Podaci o suradniku",
     "userrights-unchangeable-col": "Skupine koje ne možete promijeniti",
     "group": "Skupina:",
     "group-user": "Suradnici",
-    "group-autoconfirmed": "Automatski potvrđeni suradnici",
+    "group-autoconfirmed": "automatski potvrđeni suradnici",
     "group-bot": "Botovi",
     "group-sysop": "Administratori",
     "group-bureaucrat": "Birokrati",
     "group-bureaucrat-member": "{{GENDER:$1|birokrat|birokratica}}",
     "group-suppress-member": "{{GENDER:$1|nadzornik|nadzornica}}",
     "grouppage-user": "{{ns:project}}:Suradnici",
-    "grouppage-autoconfirmed": "{{ns:project}}:Automatski potvrđeni suradnici",
+    "grouppage-autoconfirmed": "{{ns:project}}:automatski potvrđeni suradnici",
     "grouppage-bot": "{{ns:project}}:Botovi",
     "grouppage-sysop": "{{ns:project}}:Administratori",
     "grouppage-bureaucrat": "{{ns:project}}:Birokrati",
     "upload-permitted": "Dopušteni tipovi datoteka: $1.",
     "upload-preferred": "Poželjni tipovi datoteka: $1.",
     "upload-prohibited": "Zabranjeni tipovi datoteka: $1.",
-    "uploadlog": "evidencija postavljanja",
     "uploadlogpage": "Evidencija_postavljanja",
     "uploadlogpagetext": "Dolje je popis nedavno postavljenih slika.",
     "filename": "Ime datoteke",
     "filereuploadsummary": "Izmjene datoteke:",
     "filestatus": "Status autorskih prava:",
     "filesource": "Izvor:",
-    "uploadedfiles": "Postavljene datoteke",
     "ignorewarning": "Zanemari upozorenja i snimi datoteku.",
     "ignorewarnings": "Zanemari sva upozorenja",
     "minlength1": "Ime datoteke mora imati barem jedno slovo.",
     "overwroteimage": "postavljena nova inačica od \"[[$1]]\"",
     "uploaddisabled": "Postavljanje je onemogućeno",
     "copyuploaddisabled": "Postavljanje URL-om onemogućeno.",
-    "uploadfromurl-queued": "Vaše postavljanje je na čekanju.",
     "uploaddisabledtext": "Postavljanje datoteka je onemogućeno.",
     "php-uploaddisabledtext": "Postavljanja datoteka su onemogućena u PHP-u. Molimo provjerite postavke za postavljanje datoteka.",
     "uploadscripted": "Ova datoteka sadrži HTML ili skriptu, što može dovesti do grešaka u web pregledniku.",
     "upload-misc-error": "Nepoznata pogrješka pri snimanju",
     "upload-misc-error-text": "Dogodila se nepoznata pogrješka pri snimanju.\nProvjerite valjanost i dostupnost URL-a i pokušajte opet.\nAko se problem ponovi, javite to [[Special:ListUsers/sysop|administratoru]].",
     "upload-too-many-redirects": "URL je sadržavao previše preusmjeravanja",
-    "upload-unknown-size": "Nepoznata veličina",
     "upload-http-error": "HTTP-pogrješka: $1",
     "upload-copy-upload-invalid-domain": "Kopije postavljenih datoteka nisu dostupne s ove domene.",
     "backend-fail-stream": "Ne mogu prikazati datoteku $1.",
     "img-auth-streaming": "Tok \"$1\".",
     "img-auth-public": "Funkcija img_auth.php služi za izlaz datoteka s privatnih wikija.\nOvaj wiki je postavljena kao javni wiki.\nZa optimalnu sigurnost, img_auth.php je onemogućena.",
     "img-auth-noread": "Suradnik nema pristup za čitanje \"$1\".",
-    "img-auth-bad-query-string": "URL ima nevažeći izraz upita.",
     "http-invalid-url": "Nevaljan URL: $1",
     "http-invalid-scheme": "URL-ovi s prefiksom \"$1\" nisu podržani.",
     "http-request-error": "HTTP zahtjev nije uspio zbog nepoznate pogreške.",
     "filehist-dimensions": "Dimenzije",
     "filehist-filesize": "Veličina datoteke",
     "filehist-comment": "Komentar",
-    "filehist-missing": "Nedostaje datoteka",
     "imagelinks": "Upotreba datoteke",
     "linkstoimage": "{{PLURAL:$1|Sljedeća stranica povezuje|$1 sljedećih stranice povezuju}} na ovu datoteku:",
     "linkstoimage-more": "Više od $1 {{PLURAL:$1|stranice povezuje|stranica povezuje}} na ovu datoteku.\nSljedeći popis prikazuje {{PLURAL:$1|stranice koje|prvih $1 stranica koje}} vode na ovu datoteku.\n[[Special:WhatLinksHere/$2|Ovdje se nalazi]] potpuni popis.",
     "emailuser-title-notarget": "Pošalji e-poštu suradniku",
     "emailpage": "Pošalji e-poštu suradniku",
     "emailpagetext": "Možete koristiti ovaj obrazac za slanje elektroničke pošte {{GENDER:$1|suradniku|suradnici}}.\nE-mail adresa iz Vaših [[Special:Preferences|postavki]] nalazit će se u \"From\" polju poruke i primatelj će Vam moći izravno odgovoriti.",
-    "usermailererror": "Sustav pošte javio je pogrešku:",
     "defemailsubject": "{{SITENAME}} e-mail od suradnika \"$1\"",
     "usermaildisabled": "Suradnička e-pošta je onemogućena",
     "usermaildisabledtext": "Ne možete slati e-poštu drugim suradnicima na ovom wikiju",
     "noemailtitle": "Nema adrese primaoca",
     "noemailtext": "Ovaj suradnik nije odredio valjanu e-mail adresu.",
-    "nowikiemailtitle": "E-mail nije dozvoljen",
     "nowikiemailtext": "Ovaj suradnik je odlučio ne primati e-mail od drugih suradnika.",
     "emailnotarget": "Nepostojeće ili nevažeće suradničko ime za primatelja.",
     "emailtarget": "Unesite suradničko ime primatelja",
     "nowatchlist": "Na Vašem popisu praćenja nema nijednog članka.",
     "watchlistanontext": "Molimo Vas $1 kako biste mogli vidjeti ili uređivati Vaš popis praćenih stranica.",
     "watchnologin": "Niste prijavljeni",
-    "watchnologintext": "Morate biti [[Special:UserLogin|prijavljeni]]\nza promjene u popisu praćenja.",
     "addwatch": "Dodaj u popis praćenja",
     "addedwatchtext": "Stranica \"[[:$1]]\" je dodana na Vaš [[Special:Watchlist|popis praćenja]].\nPromjene na toj stranici i njenoj stranici za razgovor bit će prikazane na popisu praćenja.",
     "removewatch": "Ukloni s popisa praćenja",
     "watching": "Pratim...",
     "unwatching": "Prestajem pratiti...",
     "watcherrortext": "Došlo je do pogreške kod izmjene Vašeg popisa praćenja za \"$1\".",
-    "enotif_mailer": "{{SITENAME}} - izvješća o promjenama",
     "enotif_reset": "Označi sve stranice kao već posjećene",
     "enotif_impersonal_salutation": "{{SITENAME}} suradnik",
     "enotif_subject_deleted": "{{gender:$2|Suradnik|Suradnica}} $2 {{gender:$2|je obrisao|je obrisala}} stranicu $1 projekta {{SITENAME}}",
     "excontent": "sadržaj je bio: '$1'",
     "excontentauthor": "sadržaj je bio: '$1' (a jedini urednik '$2')",
     "exbeforeblank": "sadržaj prije brisanja je bio: '$1'",
-    "exblank": "stranica je bila prazna",
     "delete-confirm": "Obriši \"$1\"",
     "delete-legend": "Izbriši",
     "historywarning": "'''Upozorenje''':  Stranica koju želite obrisati ima starije izmjene s približno $1 {{PLURAL:$1|inačicom|inačice|inačica}}:",
     "cantrollback": "Ne mogu ukloniti posljednju promjenu, postoji samo jedna promjena.",
     "alreadyrolled": "Ne mogu ukloniti posljednju promjenu članka [[:$1]] koju je napravio  [[User:$2|$2]] ([[User talk:$2|Razgovor]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]); netko je već promijenio stranicu ili uklonio promjenu.\n\nPosljednju promjenu napravio je [[User:$3|$3]] ([[User talk:$3|Razgovor]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
     "editcomment": "Sažetak promjene je bio: \"''$1''\".",
-    "revertpage": "Uklonjena promjena suradnika [[Special:Contributions/$2|$2]] ([[User talk:$2|razgovor]]), vraćeno na posljednju inačicu suradnika [[User:$1|$1]]",
+    "revertpage": "uklonjena promjena {{GENDER:$2|suradnika|suradnice}} [[Special:Contributions/$2|$2]] ([[User talk:$2|razgovor]]), vraćeno na posljednju inačicu {{GENDER:$1|suradnika|suradnice}} [[User:$1|$1]]",
     "revertpage-nouser": "Vraćene izmjene suradnika (suradničko ime uklonjeno) na posljednju inačicu suradnika [[User:$1|$1]]",
-    "rollback-success": "Uklonjeno uređivanje {{GENDER:$1|suradnika|suradnice}} $1\nvraćeno na posljednju inačicu {{GENDER:$2|suradnika|suradnice}} $2.",
+    "rollback-success": "uklonjeno uređivanje {{GENDER:$1|suradnika|suradnice}} $1\nvraćeno na posljednju inačicu {{GENDER:$2|suradnika|suradnice}} $2.",
     "sessionfailure-title": "Prekid sesije",
     "sessionfailure": "Uočili smo problem s Vašom prijavom. Zadnja naredba nije izvršena kako bi se izbjegla zloupotreba. Molimo Vas da se u pregledniku vratite natrag na prethodnu stranicu, ponovno je učitate i zatim pokušate opet.",
     "protectlogpage": "Evidencija zaštićivanja",
     "allmessagesname": "Ime",
     "allmessagesdefault": "Prvotni tekst",
     "allmessagescurrent": "Trenutačni tekst",
-    "allmessagestext": "Ovo je popis svih sistemskih poruka u imenskom prostoru MediaWiki. Molimo posjetite [https://www.mediawiki.org/wiki/Localisation lokalizaciju MediaWikija] i [//translatewiki.net translatewiki.net] ako želite doprinijeti lokalizaciji MediaWiki softvera.",
+    "allmessagestext": "Ovo je popis svih sistemskih poruka u imenskom prostoru MediaWiki. Molimo posjetite [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation lokalizaciju MediaWikija] i [//translatewiki.net translatewiki.net] ako želite doprinijeti lokalizaciji MediaWiki softvera.",
     "allmessagesnotsupportedDB": "Ova stranica ne može biti korištena jer je isključen parametar '''$wgUseDatabaseMessages'''.",
     "allmessages-filter-legend": "Filtriraj",
     "allmessages-filter": "Filtriraj prema prilagođenom obliku:",
     "importunknownsource": "Nepoznat tip stranica za uvoz",
     "importcantopen": "Ne mogu otvoriti datoteku za uvoz",
     "importbadinterwiki": "Neispravna međuwiki poveznica",
-    "importnotext": "Prazno ili bez teksta",
     "importsuccess": "Uvoz je uspio!",
-    "importhistoryconflict": "Došlo je do konflikta među prijašnjim inačicama (ova je stranica možda već uvezena)",
     "importnosources": "Nije unesen nijedan izvor za transwiki uvoz i neposredno postavljanje povijesti je onemogućeno.",
     "importnofile": "Nije postavljena uvozna datoteka.",
     "importuploaderrorsize": "Uvoz datoteke nije uspio. Datoteka je veća od dopuštene veličine.",
index 74bfd2f..7826810 100644 (file)
     "print": "Ćišćeć",
     "view": "Wobhladać",
     "edit": "wobdźěłać",
+    "edit-local": "Lokalny wopis wobdźěłać .",
     "create": "Wutworić",
+    "create-local": "Lokalny wopis přidać",
     "editthispage": "Tutu stronu wobdźěłać",
     "create-this-page": "Stronu wutworić",
     "delete": "wušmórnyć",
     "accountcreatedtext": "Wužiwarske konto za [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|diskusiju]]) bu załožene.",
     "createaccount-title": "Wutworjenje wužiwarskeho konta za {{SITENAME}}",
     "createaccount-text": "Něchtó je wužiwarske konto za twoju e-mejlowu adresu na {{SITENAME}} ($4) z mjenom \"$2\" z hesłom \"$3\" wutworił. Ty měł so nětko přizjewić a swoje hesło změnić.\n\nMóžeš tutu zdźělenku ignorować, jeli so wužiwarske konto zmylnje wutworiło.",
-    "usernamehasherror": "Wužiwarske mjeno njesmě hašowe znamješka wpbsahować",
     "login-throttled": "Sy přehusto spytał so přizjewić. Počakaj prošu $1, prjedy hač hišće raz spytaš.",
     "login-abort-generic": "Twoje přizjewjenje njebě wuspěšne - přetorhnjene",
     "loginlanguagelabel": "Rěč: $1",
     "prefs-skin": "Drasta",
     "skin-preview": "Přehlad",
     "datedefault": "Žane nastajenje",
-    "prefs-beta": "Betafunkcije",
-    "prefs-datetime": "Datum a čas",
     "prefs-labs": "Laborowe funkcije",
     "prefs-user-pages": "Wužiwarske strony",
     "prefs-personal": "Wužiwarski profil",
     "upload-permitted": "Dowolene datajowe typy: $1.",
     "upload-preferred": "Preferowane datajowe typy: $1.",
     "upload-prohibited": "Zakazane datajowe typy: $1.",
-    "uploadlog": "Protokol nahraćow",
     "uploadlogpage": "Protokol nahraćow",
     "uploadlogpagetext": "Deleka je lisćina najnowšich nahratych datajow.\nHlej [[Special:NewFiles|galeriju nowych datajow]] za wizuelny přehlad.",
     "filename": "Mjeno dataje",
     "filereuploadsummary": "Datajowe změny:",
     "filestatus": "Licenca:",
     "filesource": "Žórło:",
-    "uploadedfiles": "Nahrate dataje",
     "ignorewarning": "Warnowanje ignorować a dataju najebać toho składować.",
     "ignorewarnings": "Wšě warnowanja ignorować",
     "minlength1": "Datajowe mjena dyrbja znajmjeńša jedyn pismik dołhe być.",
     "overwroteimage": "je nowu wersiju dataje „[[$1]]“ nahrał",
     "uploaddisabled": "Wodaj, nahraće je znjemóžnjene.",
     "copyuploaddisabled": "Nahraće přez URL znjemóžnjene.",
-    "uploadfromurl-queued": "Twoje nahraće je nětko w čakanskim rynku.",
     "uploaddisabledtext": "Nahraće datajow je znjemóžnjene.",
     "php-uploaddisabledtext": "Nahraća PHP-datajow su znjemóžnjene. Prošu skontroluj nastajenje file_uploads.",
     "uploadscripted": "Dataja wobsahuje HTML- abo skriptowy kod, kotryž móhł so mylnje přez wobhladowak wuwjesć.",
     "upload-misc-error": "Njeznaty zmylk při nahraću",
     "upload-misc-error-text": "Njeznaty zmylk wustupi při nahrawanju. Prošu přepruwuj, hač URL je płaćiwy a přistupny a spytaj hišće raz. Jeli problem dale eksistuje, skontaktuj [[Special:ListUsers/sysop|administratora]].",
     "upload-too-many-redirects": "URL wobsahowaše přewjele daleposrědkowanjow",
-    "upload-unknown-size": "Njeznata wulkosć",
     "upload-http-error": "HTTP-zmylk je wustupił: $1",
     "upload-copy-upload-invalid-domain": "Kopijowe nahraća z tuteje domeny k dispoziciji njesteji.",
     "backend-fail-stream": "Dataja $1 njeda so přenjesć.",
     "img-auth-streaming": "\"$1\" so prudźi.",
     "img-auth-public": "Funkcija img_auth.php je za wudaće datjow z priwatneho wikija.\nTutón wiki je jako zjawny wiki konfigurowany.\nZa optimalnu wěstotu je img_auth.php znjemóžnjeny.",
     "img-auth-noread": "Wužiwar nima přistup, zo by \"$1\" čitał.",
-    "img-auth-bad-query-string": "URL ma njepłaćiwy naprašowanski znamješkowy rjećazk.",
     "http-invalid-url": "Njepłaćiwy URL: $1",
     "http-invalid-scheme": "URL ze šemu „$1“ so njepodpěruja.",
     "http-request-error": "Naprašowanje HTTP je so njeznateho zmylka dla njeporadźiło.",
     "filehist-dimensions": "Rozeznaće",
     "filehist-filesize": "Wulkosć dataje",
     "filehist-comment": "Komentar",
-    "filehist-missing": "Dataja pobrachuje",
     "imagelinks": "Datajowe wužiwanje",
     "linkstoimage": "{{PLURAL:$1|Slědowaca strona wotkazuje|Slědowacej $1 stronje wotkazujetej|Slědowace $1 strony wotkazuja|Slědowacych $1 stronow wotkazuje}} na tutu dataju:",
     "linkstoimage-more": "Wjace hač $1 {{PLURAL:$1|strona wotkazuje|stronje wotkazujetej|strony wotkazuja|stronow wotkazuje}} na tutu dataju.\nSlědowaca lisćina pokazuje jenož {{PLURAL:$1|prěni wotkaz strony|prěnjej $1 wotkazaj strony|prěnje $1 wotkazy strony|prěnich $1 wotkazow strony}} na tutu dataju.\n[[Special:WhatLinksHere/$2|Dospołna lisćina]] steji k dispoziciji.",
     "emailuser-title-notarget": "Wužiwarjej mejlku pósłać",
     "emailpage": "Wužiwarjej mejlku pósłać",
     "emailpagetext": "Móžeš slědowacy formular wužiwać, zo by tutomu {{GENDER:$1|wužiwarjej}} e-mejlku pósłał.\nE-mejlowa adresa, kotruž sy w [[Special:Preferences|swojich wužiwarskich nastajenjach]] zapodał, zjewi so jako adresa \"Wot\" e-mejlki, tak zo přijimowar móže ći direktnje wotmołwić.",
-    "usermailererror": "E-mejlowy objekt je zmylk wróćił:",
     "defemailsubject": "{{SITENAME}} - e-mejlka wot wužiwarja \"$1\"",
     "usermaildisabled": "Wužiwarska e-mejl znjemóžnjena",
     "usermaildisabledtext": "Njemóžeš na tutym wikiju druhim wužiwarjam e-mejl pósłać",
     "noemailtitle": "Žana e-mejlowa adresa podata",
     "noemailtext": "Tutón wužiwar njeje płaćiwu e-mejlowu adresu podał.",
-    "nowikiemailtitle": "Žana e-mejl dowolena",
     "nowikiemailtext": "Tutón wužiwar nochce žane e-mejlki wot druhich wužiwarjow dóstać.",
     "emailnotarget": "Njeeksistowace abo njepłaćiwe wužiwarske mjeno za přijimowarja.",
     "emailtarget": "Wužiwarske mjeno přijimowarja zapodać",
     "nowatchlist": "Nimaš žane strony w swojich wobkedźbowankach.",
     "watchlistanontext": "Dyrbiš so $1, zo by swoje wobkedźbowanki wobhladać abo wobdźěłać móhł.",
     "watchnologin": "Njejsy přizjewjeny.",
-    "watchnologintext": "Dyrbiš [[Special:UserLogin|přizjewjeny]] być, zo by swoje wobkedźbowanki změnić móhł.",
     "addwatch": "K wobkedźbowankam přidać",
     "addedwatchtext": "Strona [[:$1]] bu k twojim [[Special:Watchlist|wobkedźbowankam]] přidata.\nPřichodne změny tuteje strony a přisłušneje diskusijneje strony budu so tam nalistować.",
     "removewatch": "Z wobkedźbowankow wotstronić",
     "watching": "Wobkedźbuju…",
     "unwatching": "Njewobkedźbuju…",
     "watcherrortext": "Při měnjenju nastajenjow wašich wobkedźbowankow za \"$1\" je zmylk wustupił.",
-    "enotif_mailer": "{{SITENAME}} E-mejlowe zdźělenje",
     "enotif_reset": "Wšě strony jako wopytane woznamjenić",
     "enotif_impersonal_salutation": "wužiwar {{GRAMMAR:genitiw|{{SITENAME}}}}",
     "enotif_subject_deleted": "Strona {{GRAMMAR:genitiw|{{SITENAME}}}} $1 je so wot {{GENDER:$2|$2}} zhašała",
     "excontent": "wobsah běše: '$1'",
     "excontentauthor": "wobsah bě: '$1' (a jenički wobdźěłowar bě '[[Special:Contributions/$2|$2]]')",
     "exbeforeblank": "wobsah do wuprózdnjenja běše: '$1'",
-    "exblank": "strona běše prózdna",
     "delete-confirm": "„$1“ wušmórnyć",
     "delete-legend": "Wušmórnyć",
     "historywarning": "'''KEDŹBU:''' Strona, kotruž chceš wušmórnyć, ma stawizny z přibližnje $1 {{PLURAL:$1|wersiju|wersijomaj|wersijemi|wersijemi}}:",
     "sp-contributions-newbies-sub": "Za nowačkow",
     "sp-contributions-newbies-title": "Wužiwarske přinoški za nowe konta",
     "sp-contributions-blocklog": "protokol zablokowanjow",
+    "sp-contributions-suppresslog": "potłóčene wužiwarske přinoški",
     "sp-contributions-deleted": "wušmórnjene wužiwarske přinoški",
     "sp-contributions-uploads": "nahraća",
     "sp-contributions-logs": "protokole",
     "sp-contributions-blocked-notice": "Tutón wužiwar je tuchwilu zablokowany. Najnowši protokolowy zapisk so deleka jako referenca podawa:",
     "sp-contributions-blocked-notice-anon": "Tuta IP-adresa je tuchwilu zablokowana.\nNajnowši zapisk w protokolu blokowanjow so deleka jako referenca podawa:",
     "sp-contributions-search": "Přinoški pytać",
-    "sp-contributions-suppresslog": "potłóčene wužiwarske přinoški",
     "sp-contributions-username": "IP-adresa abo wužiwarske mjeno:",
     "sp-contributions-toponly": "Jenož wyše wersije pokazać",
     "sp-contributions-newonly": "Jenož změny pokazać, kotrež su wutworjenja stronow",
     "allmessagesname": "Mjeno",
     "allmessagesdefault": "Standardny tekst",
     "allmessagescurrent": "Aktualny tekst",
-    "allmessagestext": "To je lisćina systemowych zdźělenkow, kotrež w mjenowym rumje MediaWiki k dispoziciji steja. Prošu wopytaj [https://www.mediawiki.org/wiki/Localisation lokalizaciju MediaWiki] a [//translatewiki.net translatewiki.net], jeli chceš k powšitkownej lokalizaciji MediaWiki přinošować.",
+    "allmessagestext": "To je lisćina systemowych zdźělenkow, kotrež w mjenowym rumje MediaWiki k dispoziciji steja. Prošu wopytaj [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation lokalizaciju MediaWiki] a [//translatewiki.net translatewiki.net], jeli chceš k powšitkownej lokalizaciji MediaWiki přinošować.",
     "allmessagesnotsupportedDB": "Tuta strona njeda so wužiwać, dokelž '''$wgUseDatabaseMessages''' bu znjemóžnjeny.",
     "allmessages-filter-legend": "Filter",
     "allmessages-filter": "Po přiměrjenskim stawje filtrować:",
     "importunknownsource": "Njeznate importowe žórło",
     "importcantopen": "Importowa dataja njeda so wočinjeć.",
     "importbadinterwiki": "Wopačny interwiki-wotkaz",
-    "importnotext": "Prózdny abo žadyn tekst",
     "importsuccess": "Import wuspěšny!",
-    "importhistoryconflict": "Je konflikt ze stawiznami strony wustupił. Snano bu strona hižo prjedy importowana.",
     "importnosources": "Žane importowanske žórła za transwiki wubrane. Direktne nahraće stawiznow je znjemóžnjene.",
     "importnofile": "Žana importowanska dataja wubrana.",
     "importuploaderrorsize": "Nahraće importoweje dataje je so njeporadźiło. Dataja je wjetša hač dowolena datajowa wulkosć.",
index ec50e26..0d36406 100644 (file)
     "accountcreatedtext": "[[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|vita]]) felhasználói fiókja sikeresen létrejött.",
     "createaccount-title": "Új {{SITENAME}}-azonosító létrehozása",
     "createaccount-text": "Valaki létrehozott számodra egy \"$2\" nevű {{SITENAME}}-azonosítót ($4).\nA hozzá tartozó jelszó \"$3\", melyet a bejelentkezés után minél előbb változtass meg.\n\nHa nem kértél új azonosítót, és tévedésből kaptad ezt a levelet, hagyd figyelmen kívül.",
-    "usernamehasherror": "A felhasználónév nem tartalmazhat hash karaktereket",
     "login-throttled": "Túl sok hibás bejelentkezés.\nVárj $1, mielőtt újra próbálkozol.",
     "login-abort-generic": "A bejelentkezés sikertelen – megszakítva",
     "loginlanguagelabel": "Nyelv: $1",
     "showhideselectedversions": "Kiválasztott változatok láthatóságának beállítása",
     "editundo": "visszavonás",
     "diff-empty": "(Nincs különbség)",
+    "diff-multi-sameuser": "({{PLURAL:$1|Egy közbenső módosítás|$1 közbenső módosítás}} ugyanattól a szerkesztőtől nincs mutatva)",
     "diff-multi-manyusers": "({{PLURAL:$1|Egy közbeeső változat|$1 közbeeső változat}} nincs mutatva, amit $2 szerkesztő módosított)",
     "difference-missing-revision": "A(z) \"{{PAGENAME}}\" nevű oldal #$1 $2 változata nem létezik.\n\nEzt általában egy elavult, törölt oldalra mutató laptörténeti hivatkozás használata okozza. Részletek a [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} törlési naplóban] találhatóak.",
     "searchresults": "A keresés eredménye",
     "prefs-skin": "Felület",
     "skin-preview": "előnézet",
     "datedefault": "Nincs beállítás",
-    "prefs-beta": "Béta funkciók",
-    "prefs-datetime": "Dátum és idő",
     "prefs-labs": "Kísérleti funkciók",
     "prefs-user-pages": "Felhasználói lapok",
     "prefs-personal": "Felhasználói adatok",
     "upload-permitted": "Engedélyezett fájltípusok: $1.",
     "upload-preferred": "Támogatott fájltípusok: $1.",
     "upload-prohibited": "Tiltott fájltípusok: $1.",
-    "uploadlog": "feltöltési napló",
     "uploadlogpage": "Feltöltési napló",
     "uploadlogpagetext": "Lentebb látható a legutóbbi felküldések listája.\nLásd még az [[Special:NewFiles|új fáljlok galériáját]]",
     "filename": "Fájlnév",
     "filereuploadsummary": "Változtatások:",
     "filestatus": "Szerzői jogi állapot:",
     "filesource": "Forrás:",
-    "uploadedfiles": "Feltöltött fájlok",
     "ignorewarning": "Biztosan így akarom feltölteni",
     "ignorewarnings": "Hagyd figyelmen kívül a figyelmeztetéseket",
     "minlength1": "A fájlnévnek legalább egy betűből kell állnia.",
     "overwroteimage": "feltöltötte a(z) „[[$1]]” fájl új változatát",
     "uploaddisabled": "Feltöltések kikapcsolva",
     "copyuploaddisabled": "A feltöltés URL alapján le van tiltva.",
-    "uploadfromurl-queued": "A feltöltésed a várakozási sorba került.",
     "uploaddisabledtext": "A fájlfeltöltés nem engedélyezett.",
     "php-uploaddisabledtext": "A PHP-s fájlfeltöltés le van tiltva. Ellenőrizd a file_uploads beállítást.",
     "uploadscripted": "Ez a fájl olyan HTML- vagy parancsfájlkódot tartalmaz, melyet tévedésből egy webböngésző esetleg értelmezni próbálhatna.",
     "upload-misc-error": "Ismeretlen feltöltési hiba",
     "upload-misc-error-text": "A feltöltés során ismeretlen hiba történt.  Kérjük, ellenőrizd, hogy az URL érvényes-e és hozzáférhető-e, majd próbáld újra.  Ha a probléma továbbra is fennáll, akkor lépj kapcsolatba az [[Special:ListUsers/sysop|adminisztrátorral]].",
     "upload-too-many-redirects": "Az URL túl sokszor volt átirányítva",
-    "upload-unknown-size": "Ismeretlen méretű",
     "upload-http-error": "HTTP-hiba történt: $1",
     "upload-copy-upload-invalid-domain": "Másolás nem engedélyezett ebből a tartományból.",
     "backend-fail-stream": "Nem sikerült sugározni ezt a fájlt: $1.",
     "img-auth-streaming": "„$1” továbbítása.",
     "img-auth-public": "Az img_auth.php funkciója az, hogy fájlokat közvetítsen egy privát wikiből.\nEz a wiki publikus, így a biztonság miatt az img_auth.php ki van kapcsolva.",
     "img-auth-noread": "A szerkesztő nem jogosult a(z) „$1” olvasására.",
-    "img-auth-bad-query-string": "Az URL-cím érvénytelen lekérdezést tartalmaz.",
     "http-invalid-url": "Érvénytelen URL-cím: $1",
     "http-invalid-scheme": "A(z) „$1” sémájú URL-ek nem támogatottak.",
     "http-request-error": "A HTTP-kérés nem sikerült egy ismeretlen hiba miatt.",
     "filehist-dimensions": "Felbontás",
     "filehist-filesize": "Fájlméret",
     "filehist-comment": "Megjegyzés",
-    "filehist-missing": "A fájl hiányzik",
     "imagelinks": "Fájlhasználat",
     "linkstoimage": "Az alábbi {{PLURAL:$1|lap hivatkozik|lapok hivatkoznak}} erre a fájlra:",
     "linkstoimage-more": "Több, mint {{PLURAL:$1|egy|$1}} oldal hivatkozik erre a fájlra.\nA következő lista csak az {{PLURAL:$1|első linket|első $1 linket}} tartalmazza.\nA teljes lista [[Special:WhatLinksHere/$2|ezen a lapon]] található meg.",
     "emailuser-title-notarget": "E-mail küldése a felhasználónak",
     "emailpage": "E-mail küldése",
     "emailpagetext": "{{GENDER:$1|felhasználó}}nevű szerkesztő e-mail-címére ezen űrlap kitöltésével üzenetet tudsz küldeni.\nFeladóként a [[Special:Preferences|beállításaid]]nál megadott e-mail-címed fog szerepelni, így a címzett közvetlenül tud majd válaszolni neked.",
-    "usermailererror": "A levélküldő objektum hibával tért vissza:",
     "defemailsubject": "{{SITENAME}} e-mail a következő felhasználótól: „$1”",
     "usermaildisabled": "Email fogadás letiltva",
     "usermaildisabledtext": "Nem küldhetsz emailt más felhasználóknak ezen a wikin",
     "noemailtitle": "Nincs e-mail cím",
     "noemailtext": "Ez a szerkesztő nem adott meg érvényes e-mail címet.",
-    "nowikiemailtitle": "Nem küldhető e-mail üzenet",
     "nowikiemailtext": "Ez a szerkesztő nem kíván másoktól e-mail üzeneteket fogadni.",
     "emailnotarget": "A címzett nem létezik vagy a felhasználónév érvénytelen.",
     "emailtarget": "Írd be címzett felhasználónevét",
     "nowatchlist": "Nincs lap a figyelőlistádon.",
     "watchlistanontext": "A figyelőlistád megtekintéséhez és szerkesztéséhez $1.",
     "watchnologin": "Nem vagy bejelentkezve",
-    "watchnologintext": "Ahhoz, hogy figyelőlistád lehessen, [[Special:UserLogin|be kell lépned]].",
     "addwatch": "Hozzáadás a figyelőlistához",
     "addedwatchtext": "A(z) „[[:$1]]” lapot hozzáadtam a [[Special:Watchlist|figyelőlistádhoz]].\nEzután minden, a lapon vagy annak vitalapján történő változást ott fogsz látni.",
     "removewatch": "Eltávolítás a figyelőlistáról",
     "watching": "Figyelés...",
     "unwatching": "Figyelés befejezése...",
     "watcherrortext": "Hiba történt a(z) „$1” lapra vonatkozó figyelőlista-beállítások módosítása közben.",
-    "enotif_mailer": "{{SITENAME}} Értesítéspostázó",
     "enotif_reset": "Az összes lap megjelölése felkeresettként",
     "enotif_impersonal_salutation": "{{SITENAME}} felhasználó",
     "enotif_subject_deleted": "$2 törölte a $1 {{SITENAME}} oldalt.",
     "excontent": "a lap tartalma: „$1”",
     "excontentauthor": "a lap tartalma: „$1” (és csak „[[Special:Contributions/$2|$2]]” szerkesztette)",
     "exbeforeblank": "az eltávolítás előtti tartalom: „$1”",
-    "exblank": "a lap üres volt",
     "delete-confirm": "$1 törlése",
     "delete-legend": "Törlés",
     "historywarning": "'''Figyelem:''' a lapnak, amit törölni készülsz, körülbelül $1 változattal rendelkező laptörténete van:",
     "allmessagesname": "Név",
     "allmessagesdefault": "Alapértelmezett szöveg",
     "allmessagescurrent": "Jelenlegi szöveg",
-    "allmessagestext": "Ezen a lapon a MediaWiki-névtérben elérhető rendszerüzenetek listája látható.\nHa részt szeretnél venni a MediaWiki fordításában, látogass el a [https://www.mediawiki.org/wiki/Localisation MediaWiki Localisation], valamint a [//translatewiki.net translatewiki.net] oldalra.",
+    "allmessagestext": "Ezen a lapon a MediaWiki-névtérben elérhető rendszerüzenetek listája látható.\nHa részt szeretnél venni a MediaWiki fordításában, látogass el a [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation MediaWiki Localisation], valamint a [//translatewiki.net translatewiki.net] oldalra.",
     "allmessagesnotsupportedDB": "A '''''{{ns:special}}:Allmessages''''' lap nem használható, mert a '''$wgUseDatabaseMessages''' ki van kapcsolva.",
     "allmessages-filter-legend": "Elemek szűrése",
     "allmessages-filter": "Módosítás állapota:",
     "importunknownsource": "Ismeretlen import forrástípus",
     "importcantopen": "Nem nyitható meg az importfájl",
     "importbadinterwiki": "Rossz wikiközi hivatkozás",
-    "importnotext": "Üres, vagy nincs szöveg",
     "importsuccess": "Az importálás befejeződött!",
-    "importhistoryconflict": "Ütköző előzményváltozat létezik (lehet, hogy már importálták ezt a lapot)",
     "importnosources": "Nincsenek transzwikiimport-források definiálva, a közvetlen laptörténet-felküldés pedig nem megengedett.",
     "importnofile": "Nem került importfájl feltöltésre.",
     "importuploaderrorsize": "Az importálandó fájl feltöltése nem sikerült, mert nagyobb, mint a megengedett feltöltési méret.",
index 833a4bb..762a51c 100644 (file)
     "prefs-skin": "Տեսք",
     "skin-preview": "նախադիտել",
     "datedefault": "Առանց նախընտրության",
-    "prefs-beta": "Փորձնական հնարավորություններ",
     "prefs-datetime": "Օր ու ժամ",
     "prefs-personal": "Անձնական",
     "prefs-rc": "Վերջին փոփոխություններ",
     "nowatchlist": "Ձեր հսկողության ցանկը դատարկ է։",
     "watchlistanontext": "Անհրաժեշտ է $1՝ հսկացանկը դիտելու կամ խմբագրելու համար։",
     "watchnologin": "Չեք մտել համակարգ",
-    "watchnologintext": "Անհրաժեշտ է [[Special:UserLogin|մտնել համակարգ]]՝ հսկացանկը փոփոխելու համար։",
     "addwatch": "Ավելացնել հսկացանկին",
     "addedwatchtext": "«[[:$1]]» էջը ավելացված է ձեր [[Special:Watchlist|հսկացանկին]]։ Այս էջի և նրան կապված քննարկումների էջի հետագա փոփոխությունները կգրանցվեն այդտեղ, և կցուցադրվեն թավատառով [[Special:RecentChanges|վերջին փոփոխությունների]] ցանկում։\n\nՀետագայում հսկացանկից էջը հեռացնելու ցանկության դեպքում մատնահարեք էջի վերնամասի ընտրացանկում գտնվող «հանել հսկումից» կոճակին։",
     "removewatch": "Հեռացնել հսկացանկից",
     "allmessagesname": "Անուն",
     "allmessagesdefault": "Ուղերձի լռելյայն տեքստ",
     "allmessagescurrent": "Ընթացիկ տեքստ",
-    "allmessagestext": "Ստորև բերված է «MediaWiki» անվանատարածքի բոլոր համակարգային ուղերձների ցանկը։\nPlease visit [https://www.mediawiki.org/wiki/Localisation MediaWiki Localisation] and [//translatewiki.net translatewiki.net] if you wish to contribute to the generic MediaWiki localisation.",
+    "allmessagestext": "Ստորև բերված է «MediaWiki» անվանատարածքի բոլոր համակարգային ուղերձների ցանկը։\nPlease visit [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation MediaWiki Localisation] and [//translatewiki.net translatewiki.net] if you wish to contribute to the generic MediaWiki localisation.",
     "allmessagesnotsupportedDB": "Այս էջը չի գործում, քանի որ '''$wgUseDatabaseMessages''' հատկանիշը անջատված է։",
     "allmessages-filter-all": "Բոլորը",
     "allmessages-language": "Լեզու",
index 419637c..27ca669 100644 (file)
     "prefs-skin": "Apparentia",
     "skin-preview": "Previsualisation",
     "datedefault": "Nulle preferentia",
-    "prefs-beta": "Functiones beta",
     "prefs-datetime": "Data e hora",
     "prefs-labs": "Functiones experimental",
     "prefs-user-pages": "Paginas de usator",
     "nowatchlist": "Tu non ha paginas sub observation.",
     "watchlistanontext": "Tu debe $1 pro poter vider o modificar entratas in tu observatorio.",
     "watchnologin": "Tu non ha aperite un session",
-    "watchnologintext": "Tu debe [[Special:UserLogin|aperir un session]] pro modificar tu observatorio.",
     "addwatch": "Adder al observatorio",
     "addedwatchtext": "Le pagina \"[[:$1]]\" ha essite addite a tu [[Special:Watchlist|observatorio]].\nLe modificationes futur in iste pagina e in le pagina de discussion associate essera listate in illo.",
     "removewatch": "Remover del observatorio",
     "sp-contributions-newbies-sub": "Pro nove contos",
     "sp-contributions-newbies-title": "Contributiones de nove contos de usator",
     "sp-contributions-blocklog": "Registro de blocadas",
+    "sp-contributions-suppresslog": "contributiones supprimite de usatores",
     "sp-contributions-deleted": "contributiones delite de usatores",
     "sp-contributions-uploads": "incargamentos",
     "sp-contributions-logs": "registros",
     "sp-contributions-blocked-notice": "Iste usator es actualmente blocate. Le ultime entrata del registro de blocadas es reproducite ci infra pro information:",
     "sp-contributions-blocked-notice-anon": "Iste adresse IP es actualmente blocate.\nLe ultime entrata del registro de blocadas es reproducite hic infra pro information:",
     "sp-contributions-search": "Cercar contributiones",
-    "sp-contributions-suppresslog": "contributiones supprimite de usatores",
     "sp-contributions-username": "Adresse IP o nomine de usator:",
     "sp-contributions-toponly": "Monstrar solmente le versiones recente",
     "sp-contributions-newonly": "Monstrar solmente le modificationes que es creationes de pagina",
     "allmessagesname": "Nomine",
     "allmessagesdefault": "Texto predefinite",
     "allmessagescurrent": "Texto actual",
-    "allmessagestext": "Isto es un lista de messages de systema disponibile in le spatio de nomines MediaWiki.\nPer favor visita [https://www.mediawiki.org/wiki/Localisation MediaWiki Localisation] e [//translatewiki.net translatewiki.net] si tu desira contribuer al localisation general de MediaWiki.",
+    "allmessagestext": "Isto es un lista de messages de systema disponibile in le spatio de nomines MediaWiki.\nPer favor visita [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation MediaWiki Localisation] e [//translatewiki.net translatewiki.net] si tu desira contribuer al localisation general de MediaWiki.",
     "allmessagesnotsupportedDB": "Iste pagina non pote esser usate proque '''$wgUseDatabaseMessages''' ha essite disactivate.",
     "allmessages-filter-legend": "Filtro",
     "allmessages-filter": "Filtrar per stato de personalisation:",
     "version-entrypoints": "URL del puncto de entrata",
     "version-entrypoints-header-entrypoint": "Puncto de entrata",
     "version-entrypoints-header-url": "URL",
-    "version-entrypoints-articlepath": "[https://www.mediawiki.org/wiki/Manual:$wgArticlePath Cammino al articulo]",
-    "version-entrypoints-scriptpath": "[https://www.mediawiki.org/wiki/Manual:$wgScriptPath Cammino al script]",
+    "version-entrypoints-articlepath": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgArticlePath Cammino al articulo]",
+    "version-entrypoints-scriptpath": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgScriptPath Cammino al script]",
     "redirect": "Rediriger per nomine de file, ID de usator, ID de pagina o ID de version",
     "redirect-legend": "Rediriger a un file o pagina",
     "redirect-summary": "Iste pagina special redirige a un file (si es date le nomine de un file), a un pagina (si es date un ID de version o ID de pagina) o a un pagina de usator (si es date un ID de usator numeric). Usage: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]] o [[{{#Special:Redirect}}/user/101]].",
index 3a1d7b1..20c78f0 100644 (file)
     "gotaccountlink": "Masuk log",
     "userlogin-resetlink": "Lupa detail info masuk Anda?",
     "userlogin-resetpassword-link": "Lupa kata sandi?",
+    "userlogin-helplink2": "Bantuan masuk log",
     "userlogin-loggedin": "Andan telah masuk log sebagai $1.\nGunakan formulir di bawah untuk masuk log sebagai pengguna lain.",
     "userlogin-createanother": "Buat akun lain",
     "createacct-join": "Masukkan informasi Anda di bawah ini.",
     "accountcreatedtext": "Akun pengguna untuk [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|bicara]]) telah dibuat.",
     "createaccount-title": "Pembuatan akun untuk {{SITENAME}}",
     "createaccount-text": "Seseorang telah membuat sebuah akun untuk alamat surel Anda di {{SITENAME}} ($4) dengan nama \"$2\" dan kata sandi \"$3\". Anda dianjurkan untuk masuk log dan mengganti kata sandi Anda sekarang.\n\nAnda dapat mengabaikan pesan ini jika akun ini dibuat karena suatu kesalahan.",
-    "usernamehasherror": "Nama pengguna tidak bisa mengandung tanda pagar",
     "login-throttled": "Anda sudah terlalu sering mencoba masuk log.\nSilakan menunggu $1 sebelum mencoba lagi.",
     "login-abort-generic": "Proses masuk Anda tidak berhasil - Dibatalkan",
     "loginlanguagelabel": "Bahasa: $1",
     "suspicious-userlogout": "Permintaan Anda untuk keluar log ditolak karena tampaknya dikirim oleh penjelajah yang rusak atau proksi penyinggah.",
     "createacct-another-realname-tip": "Nama asli bersifat opsional.\nJika Anda memberikannya, nama asli Anda akan digunakan untuk memberi pengenalan atas hasil kerja Anda.",
+    "pt-login": "Masuk log",
+    "pt-login-button": "Masuk log",
+    "pt-createaccount": "Buat akun baru",
+    "pt-userlogout": "Keluar log",
     "php-mail-error-unknown": "Kesalahan yang tidak dikenal dalam fungsi mail() PHP",
     "user-mail-no-addy": "Mencoba mengirimkan surel tanpa alamat surel.",
     "user-mail-no-body": "Mencoba untuk mengirim surel kosong atau terlalu pendek.",
     "changepassword": "Ganti kata sandi",
-    "resetpass_announce": "Anda telah masuk log dengan kode sementara yang dikirim melalui surel. Untuk melanjutkan, Anda harus memasukkan kata sandi baru di sini:",
+    "resetpass_announce": "Untuk menyelesaikan masuk log, Anda harus memasukkan kata sandi baru.",
     "resetpass_text": "<!-- Tambahkan teks di sini -->",
     "resetpass_header": "Ganti kata sandi akun",
     "oldpassword": "Kata sandi lama:",
     "resetpass-submit-loggedin": "Ganti kata sandi",
     "resetpass-submit-cancel": "Batalkan",
     "resetpass-wrong-oldpass": "Kata sandi tidak sah.\nAnda mungkin telah berhasil mengganti kata sandi Anda atau telah meminta kata sandi sementara yang baru.",
+    "resetpass-recycled": "Mohon menyetel ulang kata sandi Anda.",
+    "resetpass-temp-emailed": "Anda masuk log dengan kode sementara yang disurel.\nUntuk menyelesaikan masuk log, Anda harus mengatur sandi baru di sini:",
     "resetpass-temp-password": "Kata sandi sementara:",
     "resetpass-abort-generic": "Perubahan kata sandi telah dibatalkan oleh ekstensi.",
+    "resetpass-expired": "Kata sandi Anda telah kedaluarsa. Silakan atur kata sandi baru untuk masuk log.",
+    "resetpass-expired-soft": "Kata sandi Anda telah kedaluarsa dan perlu disetel ulang. Silakan memilih kata sandi baru, atau klik \"{{int:resetpass-submit-cancel}}\" untuk menyetel ulang pada waktu lain.",
+    "resetpass-validity-soft": "Kata sandi tidak valid: $1\n\nSilakan pilih kata sandi baru sekarang, atau klik \"{{int:resetpass-submit-cancel}}\" untuk menyetel ulang pada waktu lain.",
     "passwordreset": "Setel ulang kata sandi",
     "passwordreset-text-one": "Lengkapi formulir ini untuk menyetel ulang kata sandi.",
     "passwordreset-text-many": "{{PLURAL:$1|Isi salah satu kotak di bawah ini untuk mendapatkan kata sandi sementara melalui surel.}}",
     "changeemail-password": "Sandi {{SITENAME}} Anda:",
     "changeemail-submit": "Ubah surel",
     "changeemail-cancel": "Batalkan",
+    "changeemail-throttled": "Anda sudah terlalu banyak mencoba masuk log.\nSilakan menunggu $1 sebelum mencoba lagi.",
     "resettokens": "Reset token",
     "resettokens-text": "Anda dapat me-reset Token yang memungkinkan akses ke data pribadi tertentu yang terkait dengan akun Anda di sini.\n\nAnda harus melakukannya jika Anda secara tidak sengaja berbagi dengan seseorang atau jika akun Anda telah disusupi.",
     "resettokens-no-tokens": "Tidak ada token untuk di-reset.",
     "undo-summary-username-hidden": "Batalkan revisi $1 oleh seorang pengguna tersembunyi",
     "cantcreateaccounttitle": "Akun tak dapat dibuat",
     "cantcreateaccount-text": "Pembuatan akun dari alamat IP ini (<strong>$1</strong>) telah diblokir oleh [[User:$3|$3]].\n\nAlasan yang diberikan oleh $3 adalah ''$2''",
-    "cantcreateaccount-range-text": "Pembuatan akun dari alamat IP dalam rentang '''$1''', yang mencakup alamat IP anda ('''$4'''), telah diblokir oleh [[Pengguna:$3|$3]].\n\nAlasan yang diberikan oleh  $3  adalah ''$2''",
+    "cantcreateaccount-range-text": "Pembuatan akun dari alamat IP dalam rentang '''$1''', yang mencakup alamat IP anda ('''$4'''), telah diblokir oleh [[User:$3|$3]].\n\nAlasan yang diberikan oleh  $3  adalah ''$2''",
     "viewpagelogs": "Lihat log halaman ini",
     "nohistory": "Tidak ada sejarah penyuntingan untuk halaman ini",
     "currentrev": "Revisi terkini",
     "revdelete-no-file": "Berkas yang dituju tidak ditemukan.",
     "revdelete-show-file-confirm": "Apakah Anda yakin ingin melihat revisi yang telah dihapus dari berkas \"<nowiki>$1</nowiki>\" per $3, $2?",
     "revdelete-show-file-submit": "Ya",
+    "revdelete-selected-text": "{{PLURAL:$1|Revisi terpilih|Revisi terpilih}} dari [[:$2]]:",
+    "revdelete-selected-file": "{{PLURAL:$1|Versi berkas terpilih|Versi berkas terpilih}} dari [[:$2]]:",
     "logdelete-selected": "{{PLURAL:$1|Log|Log-log}} pilihan untuk:",
     "revdelete-confirm": "Tolong konfirmasi bahwa Anda memang bermaksud melakukan ini, memahami konsekuensinya, dan bahwa Anda melakukannya sesuai dengan [[{{MediaWiki:Policy-url}}|kebijakan]].",
     "revdelete-suppress-text": "Penyembunyian revisi '''hanya''' boleh digunakan untuk kasus-kasus berikut:\n* Informasi yang berpotensi memfitnah\n* Informasi pribadi yang tak sepantasnya\n*: ''alamat rumah dan nomor telepon, nomor kartu identitas, dan lain-lain.''",
     "search-file-match": "(cocok dengan isi berkas)",
     "search-suggest": "Mungkin maksud Anda adalah: $1",
     "search-interwiki-caption": "Proyek lain",
-    "search-interwiki-default": "Hasil $1:",
+    "search-interwiki-default": "Hasil dari $1:",
     "search-interwiki-more": "(selanjutnya)",
     "search-relatedarticle": "Berkaitan",
     "searcheverything-enable": "Cari di semua ruang nama",
     "prefs-skin": "Kulit",
     "skin-preview": "Pratayang",
     "datedefault": "Tak ada preferensi",
-    "prefs-beta": "Fitur Beta",
-    "prefs-datetime": "Tanggal dan waktu",
     "prefs-labs": "Fitur Labs",
     "prefs-user-pages": "Halaman pengguna",
     "prefs-personal": "Profil",
     "rcnotefrom": "Di bawah ini adalah perubahan sejak <strong>$2</strong> (ditampilkan sampai <strong>$1</strong> perubahan).",
     "rclistfrom": "Perlihatkan perubahan terbaru sejak $1",
     "rcshowhideminor": "$1 suntingan kecil",
+    "rcshowhideminor-show": "Tampilkan",
+    "rcshowhideminor-hide": "Sembunyikan",
     "rcshowhidebots": "$1 bot",
+    "rcshowhidebots-show": "Tampilkan",
+    "rcshowhidebots-hide": "Sembunyikan",
     "rcshowhideliu": "$1 pengguna-pengguna terdaftar",
+    "rcshowhideliu-show": "Tampilkan",
+    "rcshowhideliu-hide": "Sembunyikan",
     "rcshowhideanons": "$1 pengguna anon",
+    "rcshowhideanons-show": "Tampilkan",
+    "rcshowhideanons-hide": "Sembunyikan",
     "rcshowhidepatr": "$1 suntingan terpatroli",
+    "rcshowhidepatr-show": "Tampilkan",
+    "rcshowhidepatr-hide": "Sembunyikan",
     "rcshowhidemine": "$1 suntingan saya",
+    "rcshowhidemine-show": "Tampilkan",
+    "rcshowhidemine-hide": "Sembunyikan",
     "rclinks": "Perlihatkan $1 perubahan terbaru dalam $2 hari terakhir<br />$3",
     "diff": "beda",
     "hist": "versi",
     "upload-permitted": "Jenis berkas yang diperbolehkan: $1.",
     "upload-preferred": "Jenis berkas yang disarankan: $1.",
     "upload-prohibited": "Jenis berkas yang dilarang: $1.",
-    "uploadlog": "log pengunggahan",
     "uploadlogpage": "Log pengunggahan",
     "uploadlogpagetext": "Berikut adalah daftar unggahan berkas terbaru. \nLihat [[Special:NewFiles|galeri berkas baru]] untuk tampilan visual.",
     "filename": "Nama berkas",
     "filereuploadsummary": "Perubahan berkas:",
     "filestatus": "Status hak cipta:",
     "filesource": "Sumber:",
-    "uploadedfiles": "Berkas yang telah dimuat",
     "ignorewarning": "Abaikan peringatan dan langsung simpan berkas.",
     "ignorewarnings": "Abaikan peringatan apa pun",
     "minlength1": "Nama berkas paling tidak harus terdiri dari satu huruf.",
     "overwroteimage": "memuat versi baru dari \"[[$1]]\"",
     "uploaddisabled": "Maaf, fasilitas pemuatan dimatikan.",
     "copyuploaddisabled": "Pengunggahan dengan URL dimatikan.",
-    "uploadfromurl-queued": "Pengunggahan Anda telah terantri.",
     "uploaddisabledtext": "Pemuatan berkas tidak diizinkan.",
     "php-uploaddisabledtext": "Pemuatan berkas dimatikan di PHP. Silakan cek pengaturan file_uploads.",
     "uploadscripted": "Berkas ini mengandung HTML atau kode yang dapat diinterpretasikan dengan keliru oleh penjelajah web.",
+    "uploadscriptednamespace": "Berkas SVG ini memuat ruang nama ilegal \"$1\"",
     "uploadinvalidxml": "XML dalam berkas yang diunggah tidak bisa diuraikan.",
     "uploadvirus": "Berkas tersebut mengandung virus! Rincian: $1",
     "uploadjava": "Berkas ini adalah berkas ZIP yang mengnadung berkas .class Java.\nPenggunggahan berkas Java tidak diperbolehkan karena dapat menyebabkan pengabaian batasan keamanan.",
     "upload-misc-error": "Kesalahan pemuatan yang tak dikenal",
     "upload-misc-error-text": "Suatu kesalahan yang tak dikenal terjadi sewaktu pemuatan. Harap pastikan bahwa URL tersebut valid dan dapat diakses dan silakan coba lagi. Jika masalah ini tetap terjadi, kontak administrator sistem.",
     "upload-too-many-redirects": "URL mengandung terlalu banyak pengalihan",
-    "upload-unknown-size": "Ukuran tidak diketahui",
     "upload-http-error": "Kesalahan HTTP terjadi: $1",
     "upload-copy-upload-invalid-domain": "Unggahan salinan tidak tersedia dari domain ini.",
     "backend-fail-stream": "Tidak bisa mengalikan berkas $1.",
     "img-auth-streaming": "Streaming \"$1\".",
     "img-auth-public": "Fungsi dari img_auth.php adalah mengeluarkan berkas dari wiki pribadi.\nWiki ini di atur sebagai wiki umum.\nUntuk pilihan keamanan, img_auth.php dinonaktifkan.",
     "img-auth-noread": "Pengguna tidak memiliki akses untuk membaca \"$1\".",
-    "img-auth-bad-query-string": "URL memiliki string kueri yang tidak sah.",
     "http-invalid-url": "URL tidak sah: $1",
     "http-invalid-scheme": "URL dengan skema \"$1\" tidak didukung.",
     "http-request-error": "Permintaan HTTP gagal karena kesalahan yang tidak diketahui.",
     "filehist-dimensions": "Dimensi",
     "filehist-filesize": "Besar berkas",
     "filehist-comment": "Komentar",
-    "filehist-missing": "Berkas tidak ditemukan",
     "imagelinks": "Pranala berkas",
     "linkstoimage": "{{PLURAL:$1||}}$1 halaman berikut memiliki pranala ke berkas ini:",
     "linkstoimage-more": "Lebih dari $1 {{PLURAL:$1|halaman|halaman}} memiliki pranala ke berkas ini.\nDaftar berikut menampilkan {{PLURAL:$1|halaman dengan pranala langsung|$1 halaman dengan pranala langsung}} ke berkas ini.\nJuga tersedia [[Special:WhatLinksHere/$2|daftar selengkapnya]].",
     "download": "unduh",
     "unwatchedpages": "Halaman yang tak dipantau",
     "listredirects": "Daftar pengalihan",
+    "listduplicatedfiles": "Daftar berkas yang berduplikat",
     "unusedtemplates": "Templat yang tak digunakan",
     "unusedtemplatestext": "Daftar berikut adalah semua halaman pada ruang nama {{ns:template}} yang tidak dipakai di halaman mana pun.\nCek dahulu pranala lain ke templat tersebut sebelum menghapusnya.",
     "unusedtemplateswlh": "pranala lain",
     "listgrouprights-removegroup-self": "Menghapus {{PLURAL:$2|kelompok|kelompok}} dari akun sendiri: $1",
     "listgrouprights-addgroup-self-all": "Dapat menambahkan semua grup ke akun sendiri",
     "listgrouprights-removegroup-self-all": "Menghapus semua kelompok dari akun sendiri",
+    "trackingcategories-disabled": "Kategori dinonaktifkan",
     "mailnologin": "Tidak ada alamat surel",
     "mailnologintext": "Anda harus [[Special:UserLogin|masuk log]] dan mempunyai alamat surel yang sah di dalam [[Special:Preferences|preferensi]] untuk mengirimkan surel kepada pengguna lain.",
     "emailuser": "Surel pengguna",
     "emailuser-title-notarget": "Kirim surel",
     "emailpage": "Kirim surel ke pengguna ini",
     "emailpagetext": "Anda dapat menggunakan formulir di bawah ini untuk mengirimkan surel ke {{GENDER:$1|pengguna}} ini.\nAlamat surel yang Anda masukkan di [[Special:Preferences|preferensi akun Anda]] akan muncul sebagai alamat \"Dari\" dalam surel tersebut, sehingga penerima dapat langsung membalas kepada Anda.",
-    "usermailererror": "Kesalahan objek surat:",
     "defemailsubject": "Surel {{SITENAME}} dari pengguna \"$1\"",
     "usermaildisabled": "Surel pengguna dinonaktifkan",
     "usermaildisabledtext": "Anda tidak dapat mengirim surel pada pengguna lain di wiki ini",
     "noemailtitle": "Tidak ada alamat surel",
     "noemailtext": "Pengguna ini tidak memberikan suatu alamat surel yang valid.",
-    "nowikiemailtitle": "Surel tak diizinkan",
     "nowikiemailtext": "Pengguna ini telah memilih untuk tidak menerima surel dari pengguna lain.",
     "emailnotarget": "Nama pengguna penerima tidak ada atau tidak sah.",
     "emailtarget": "Masukkan nama pengguna penerima",
     "nowatchlist": "Daftar pantauan Anda kosong.",
     "watchlistanontext": "Silakan $1 untuk melihat atau menyunting daftar pantauan Anda.",
     "watchnologin": "Belum masuk log",
-    "watchnologintext": "Anda harus [[Special:UserLogin|masuk log]] untuk mengubah daftar pantauan Anda.",
     "addwatch": "Tambahkan ke daftar pantauan",
     "addedwatchtext": "Halaman \"[[:$1]]\" telah ditambahkan ke [[Special:Watchlist|daftar pantauan]] Anda.\nPerubahan-perubahan berikutnya pada halaman tersebut dan halaman pembicaraan terkaitnya akan tercantum di sini.",
     "removewatch": "Hapus dari daftar pantauan",
     "watching": "Memantau...",
     "unwatching": "Menghilangkan pemantauan...",
     "watcherrortext": "Terjadi kesalahan saat mengubah preferensi daftar pantauan Anda untuk \" $1 \".",
-    "enotif_mailer": "Pengirim Notifikasi {{SITENAME}}",
     "enotif_reset": "Tandai semua halaman sebagai telah dikunjungi",
     "enotif_impersonal_salutation": "Pengguna {{SITENAME}}",
     "enotif_subject_deleted": "Halaman $1 di {{SITENAME}} telah dihapus oleh {{gender:$2|$2}}",
     "excontent": "isi sebelumnya: '$1'",
     "excontentauthor": "isinya hanya berupa: '$1' (dan satu-satunya penyumbang adalah '[[Special:Contributions/$2|$2]]')",
     "exbeforeblank": "isi sebelum dikosongkan: '$1'",
-    "exblank": "halaman kosong",
     "delete-confirm": "Hapus \"$1\"",
     "delete-legend": "Hapus",
     "historywarning": "'''Peringatan:''' Halaman yang akan Anda hapus mempunyai sejarah dengan $1 {{PLURAL:$1|revisi|revisi}}:",
     "allmessagesname": "Nama",
     "allmessagesdefault": "Teks baku",
     "allmessagescurrent": "Teks sekarang",
-    "allmessagestext": "Ini adalah daftar semua pesan sistem yang tersedia dalam ruang nama MediaWiki.\nSilakan kunjungi [https://www.mediawiki.org/wiki/Localisation Pelokalan MediaWiki] dan [//translatewiki.net translatewiki.net] jika Anda ingin berkontribusi untuk pelokalan generik MediaWiki.",
+    "allmessagestext": "Ini adalah daftar semua pesan sistem yang tersedia dalam ruang nama MediaWiki.\nSilakan kunjungi [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation Pelokalan MediaWiki] dan [//translatewiki.net translatewiki.net] jika Anda ingin berkontribusi untuk pelokalan generik MediaWiki.",
     "allmessagesnotsupportedDB": "Halaman ini tidak dapat digunakan karena '''$wgUseDatabaseMessages''' telah dimatikan.",
     "allmessages-filter-legend": "Penyaring",
     "allmessages-filter": "Saring dengan keadaan kustomisasi:",
     "importunknownsource": "Sumber impor tidak dikenali",
     "importcantopen": "Berkas impor tidak dapat dibuka",
     "importbadinterwiki": "Pranala interwiki rusak",
-    "importnotext": "Kosong atau tidak ada teks",
     "importsuccess": "Impor sukses!",
-    "importhistoryconflict": "Terjadi konflik revisi sejarah (mungkin pernah mengimpor halaman ini sebelumnya)",
     "importnosources": "Tidak ada sumber impor transwiki yang telah dibuat dan pemuatan riwayat secara langsung telah di non-aktifkan.",
     "importnofile": "Tidak ada berkas sumber impor yang telah dimuat.",
     "importuploaderrorsize": "Pemuatan berkas impor gagal. Ukuran berkas melebihi ukuran yang diperbolehkan.",
     "version-entrypoints": "URL titik entri",
     "version-entrypoints-header-entrypoint": "Titik entri",
     "version-entrypoints-header-url": "URL",
-    "version-entrypoints-articlepath": "[https://www.mediawiki.org/wiki/Manual:$wgArticlePath Artikel path]",
-    "version-entrypoints-scriptpath": "[https://www.mediawiki.org/wiki/Manual:$wgScriptPath Skrip path]",
+    "version-entrypoints-articlepath": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgArticlePath Artikel path]",
+    "version-entrypoints-scriptpath": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgScriptPath Skrip path]",
     "redirect": "Pengalihan berdasarkan ID berkas, pengguna, halaman atau revisi",
     "redirect-legend": "Pengalihan ke sebuah berkas atau halaman",
     "redirect-summary": "Halaman istimewa ini beralih ke berkas (sesuai nama berkasnya), halaman (sesuai ID revisinya), atau halaman pengguna (sesuai ID numerik penggunanya). Penggunaan: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/revision/328429]], atau [[{{#Special:Redirect}}/user/101]].",
index f35f165..2613139 100644 (file)
@@ -18,7 +18,6 @@
     "october": "Nuliaġvik",
     "november": "Quyyavik",
     "december": "Uvluiḷaq",
-    "helppage": "Help:anniqsuiruq",
     "mainpage": "Makpiġaaq Kanna",
     "mainpage-description": "Makpibaaq Kanna",
     "portal-url": "Project:qargi"
index fbe83db..f4ffe1f 100644 (file)
     "prefs-skin": "Kudil",
     "skin-preview": "Ipadas",
     "datedefault": "Awan ti kakaykayatan",
-    "prefs-beta": "Dagiti beta a langa",
     "prefs-datetime": "Petsa ken oras",
     "prefs-labs": "Dagiti subokan a langa",
     "prefs-user-pages": "Dagiti panid ti agar-aramat",
     "nowatchlist": "Awan ti banag iti listaan dagiti bambantayam.",
     "watchlistanontext": "Pangngaasim ti $1 tapno makitam dagiti inurnosmo dita bambantayam.",
     "watchnologin": "Saan a nakastrek",
-    "watchnologintext": "Masapul a [[Special:UserLogin|nakastrekka]] tapno mabaliwam dagiti bambantayam a panid.",
     "addwatch": "Inayon iti bambantayan",
     "addedwatchtext": "Ti panid iti \"[[:$1]]\" ket nainayonen idiay [[Special:Watchlist|listaan ti bambantayam]].\nDagiti masakbayan a panagsukat iti daytoy a panid ken dagiti mainaig a tungtunganna a panid ket mailistanto idiay.",
     "removewatch": "Ikkaten dita bambantayan",
     "sp-contributions-newbies-sub": "Para kadagiti kabarbaro a pakabilangan",
     "sp-contributions-newbies-title": "Dagiti inar-aramid ti agar-aramat iti baro a pakabilangan",
     "sp-contributions-blocklog": "listaan ti naserraan",
+    "sp-contributions-suppresslog": "pasardengen dagiti kontribusion ti agar-aramat",
     "sp-contributions-deleted": "dagiti naikkat nga inar-aramid ti agar-aramat",
     "sp-contributions-uploads": "dagiti pang-ipan",
     "sp-contributions-logs": "listaan",
     "sp-contributions-blocked-notice": "Naserraan tatta daytoy nga agar-aramat.\nTi naudi a listaan ti pannakaserra ket adda dita baba tapno mausar a reperensia:",
     "sp-contributions-blocked-notice-anon": "Daytoy nga IP a pagtaengan ket naserraan.\nTi naudi a listaan ti pannakaserra ket adda dita baba tapno mausar a reperensia:",
     "sp-contributions-search": "Agsapul para kadagiti naar-aramid",
-    "sp-contributions-suppresslog": "pasardengen dagiti kontribusion ti agar-aramat",
     "sp-contributions-username": "IP a pagtaengan wenno nagan ti agar-aramat:",
     "sp-contributions-toponly": "Ipakita laeng dagiti inurnos a kinaudian a panagbaliw",
     "sp-contributions-newonly": "Ipakita laeng dagiti inurnos a pannakapartuat ti pampanid",
     "allmessagesname": "Nagan",
     "allmessagesdefault": "Kasisigud a testo ti mensahe",
     "allmessagescurrent": "Agdama a testo ti mensahe",
-    "allmessagestext": "Daytoy ti listaan dagiti mensahe ti sistema a magun-od idiay MediaWiki a nagan ti espasio.\nPangngaasi a bisitaen ti [https://www.mediawiki.org/wiki/Localisation Lokalisasion ti MediaWiki] ken [//translatewiki.net translatewiki.net] no kayatmo ti agparawad kadagiti sapasap a panagipatarus ti MediaWiki.",
+    "allmessagestext": "Daytoy ti listaan dagiti mensahe ti sistema a magun-od idiay MediaWiki a nagan ti espasio.\nPangngaasi a bisitaen ti [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation Lokalisasion ti MediaWiki] ken [//translatewiki.net translatewiki.net] no kayatmo ti agparawad kadagiti sapasap a panagipatarus ti MediaWiki.",
     "allmessagesnotsupportedDB": "Saan a mausar daytoy a panid ngamin ket ti '''$wgUseDatabaseMessages''' ket nabaldado.",
     "allmessages-filter-legend": "Sagat",
     "allmessages-filter": "Sagaten babaen ti naipaduma a kasasaad:",
index 110dfad..1b895dc 100644 (file)
     "mywatchlist": "Surveyaji",
     "nowatchlist": "Vu ne havas objekti en vua listo di surveyaji.",
     "watchnologin": "Vu ne startis sesiono",
-    "watchnologintext": "Vu mustas [[Special:UserLogin|enirir]] por modifikar vua surveyaji.",
     "addedwatchtext": "La pagino \"<nowiki>$1</nowiki>\" atachesis a vua [[Special:Watchlist|listo de surveyaji]]. Futura chanji di ica pagino ed olua relatanta debato-pagini montresos ibe, ed la pagino aparos per '''dika literi''' en la [[Special:RecentChanges|listo de recenta chanji]] por faciligar sua trovebleso.\n\n<p> Se vu volas efacar la pagino de vua listo de surveyaji pose, presez \"Ne plus surveyar\" en la selektaro.",
     "removedwatchtext": "La pagino \"[[:$1]]\" forigesis de [[Special:Watchlist|vua surveyado]].",
     "watch": "Surveyar",
     "export-addcat": "Adjuntar",
     "allmessages": "Omna sistemo-mesaji",
     "allmessagesname": "Nomo",
-    "allmessagestext": "Ico esas listo di omna sistemo-mesaji disponebla en la MediaWiki nomaro.\nVoluntez vizitar [https://www.mediawiki.org/wiki/Localisation MediaWiki Lokizado] e [//translatewiki.net translatewiki.net] se vu volus kontributar ad generala MediaWiki lokizado.",
+    "allmessagestext": "Ico esas listo di omna sistemo-mesaji disponebla en la MediaWiki nomaro.\nVoluntez vizitar [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation MediaWiki Lokizado] e [//translatewiki.net translatewiki.net] se vu volus kontributar ad generala MediaWiki lokizado.",
     "allmessages-language": "Linguo:",
     "thumbnail-more": "Grandigar",
     "thumbnail_error": "Ne sucesas krear imajeto: $1",
index 3415cd9..a200043 100644 (file)
     "accountcreatedtext": "Notandaaðgangurinn fyrir [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|spjall]]) hefur verið búinn til.",
     "createaccount-title": "Innskráningagerð á {{SITENAME}}",
     "createaccount-text": "Einhver bjó til aðgang fyrir netfangið þitt á {{SITENAME}} ($4) undir nafninu „$2“, með lykilorðið „$3“.\nÞú ættir að skrá þig inn og breyta lykilorðinu núna.\n\nÞú getur hunsað þessi skilaboð, ef villa hefur átt sér stað.",
-    "usernamehasherror": "Notendanöfn mega ekki innihalda kassa (#)",
     "login-throttled": "Þér hefur mistekist að skrá þig inn undir þessu notendanafni of oft.\nVinsamlegast bíðið $1 áður en þú reynir aftur.",
     "login-abort-generic": "Innskráningin misheppnaðist - hætt var við hana.",
     "loginlanguagelabel": "Tungumál: $1",
     "suspicious-userlogout": "Beiðni um útskráningu hafnað því hún var líklegast send frá biluðum vafra eða vefseli sem hefur vistað vefsíðuna í flýtiminni.",
     "createacct-another-realname-tip": "Alvöru nafn er valfrjálst. Ef þú kýst að gefa það upp, verður það notað til að gefa þér heiður af verkum þínum.",
     "pt-createaccount": "Stofna aðgang",
+    "pt-userlogout": "Útskrá",
     "php-mail-error-unknown": "Óþekkt villa í PHP mail() aðgerð.",
     "user-mail-no-addy": "Gat ekki sent tölvupóst því ekkert tölvupóstfang fannst.",
     "user-mail-no-body": "Reyndi að senda tölvupóst með engu eða verulega stuttu meginmáli.",
     "changepassword": "Breyta lykilorði",
-    "resetpass_announce": "Þú skráðir þig inn með tímabundnum netfangskóða.\nTil að klára að skrá þig inn, verður þú að endurstilla lykilorðið hér:",
+    "resetpass_announce": "Til að klára að skrá þig inn, verður þú að velja nýtt lykilorð.",
     "resetpass_text": "<!-- Setja texta hér -->",
     "resetpass_header": "Breyta lykilorði",
     "oldpassword": "Gamla lykilorðið",
     "undo-success": "Breytingin hefur verið tekin tilbaka. Vinsamlegast staðfestu og vistaðu svo.",
     "undo-failure": "Breytinguna var ekki hægt að taka tilbaka vegna breytinga í millitíðinni.",
     "undo-norev": "Ekki var hægt að taka breytinguna aftr því að hún er ekki til eða henni var eytt.",
+    "undo-nochange": "Breytingin virðist þegar hafa verið tekin til baka.",
     "undo-summary": "Tek aftur breytingu $1 frá [[Special:Contributions/$2|$2]] ([[User talk:$2|spjall]])",
     "undo-summary-username-hidden": "Afturkalla breytingu $1 eftir faldan notanda",
     "cantcreateaccounttitle": "Ekki hægt að búa til aðgang",
     "cantcreateaccount-text": "Aðgangsgerð fyrir þetta vistfang ('''$1''') hefur verið bannað af [[User:$3|$3]].\n\nÁstæðan sem $3 gaf fyrir því er ''$2''",
+    "cantcreateaccount-range-text": "Aðgangsgerð frá visföngunum „$1”, sem innihalda vistfang þitt („$4”) hefur verið bönnuð af [[User:$3|$3]].\n\nÁstæðan sem $3 gaf fyrir því er „$2”",
     "viewpagelogs": "Sýna aðgerðir varðandi þessa síðu",
     "nohistory": "Þessi síða hefur enga breytingaskrá.",
     "currentrev": "Núverandi útgáfa",
     "showhideselectedversions": "Sýna/fela valdar breytingar",
     "editundo": "Taka aftur þessa breytingu",
     "diff-empty": "(Enginn munur)",
+    "diff-multi-sameuser": "($1 {{PLURAL:$1|millibreyting ekki sýnd|millibreytingar ekki sýndar}} frá sama notandanum)",
     "diff-multi-manyusers": "($1 {{PLURAL:$1|millibreyting ekki sýnd|millibreytingar ekki sýndar}} frá fleiri en $2 {{PLURAL:$2|notanda|notendum}}.)",
     "difference-missing-revision": "$2 {{PLURAL:$2|útgáfa|útgáfur}} samanburðarins ($1) {{PLURAL:$2|fannst|fundust}} ekki.\n\nÞetta gerist oftast þegar úreldur samanburðartengill tengir á síðu sem hefur verið eytt.\nFrekari upplýsingar eru í [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} eyðingarskránni].",
     "searchresults": "Leitarniðurstöður",
     "search-result-score": "Gildi: $1%",
     "search-redirect": "(tilvísun $1)",
     "search-section": "(hluti $1)",
+    "search-file-match": "(passar við innihald skráa)",
     "search-suggest": "Varstu að leita að: $1",
     "search-interwiki-caption": "Systurverkefni",
     "search-interwiki-default": "$1 útkomur:",
     "prefs-skin": "Þema",
     "skin-preview": "Forskoða",
     "datedefault": "Sjálfgefið",
-    "prefs-beta": "Stillingar á prufustigi",
-    "prefs-datetime": "Tímasnið og tímabelti",
     "prefs-labs": "Stillingar á tilraunastigi",
     "prefs-user-pages": "Notendasíður",
     "prefs-personal": "Notandaupplýsingar",
     "recentchanges-label-bot": "Þessi breyting var gerð af vélmenni",
     "recentchanges-label-unpatrolled": "Þessi breyting hefur ekki verið yfirfarin",
     "recentchanges-legend-newpage": "(sjá einng [[Special:NewPages|lista yfir nýjar síður]])",
-    "rcnotefrom": "Að neðan eru breytingar síðan '''$2''' (allt að '''$1''' sýndar).",
+    "rcnotefrom": "Að neðan eru breytingar síðan <strong>$2<strong> (allt að <strong>$1<strong> sýndar).",
     "rclistfrom": "Sýna breytingar frá og með $1",
     "rcshowhideminor": "$1 minniháttar breytingar",
     "rcshowhideminor-show": "Sýna",
     "upload-permitted": "Heimilaðar skráargerðir: $1.",
     "upload-preferred": "Ákjósanlegustu skrárgerðirnar: $1.",
     "upload-prohibited": "Óheimiluð skrárgerð: $1.",
-    "uploadlog": "innhlaðningarskrá",
     "uploadlogpage": "Innhlaðningarskrá",
     "uploadlogpagetext": "Fyrir neðan er listi yfir nýlegustu innhlöðnu skrárnar.\nSjá [[Special:NewFiles|myndasafn nýrra mynda]] fyrir myndrænna yfirlit.",
     "filename": "Skráarnafn",
     "filereuploadsummary": "Skráarbreytingar:",
     "filestatus": "Staða höfundaréttar:",
     "filesource": "Heimild:",
-    "uploadedfiles": "Hlóð inn skráunum",
     "ignorewarning": "Hunsa viðvaranir og vista þessa skrá",
     "ignorewarnings": "Hunsa allar viðvaranir",
     "minlength1": "Skráarnöfn þurfa að vera að minnsta kosti einn stafur að lengd",
     "overwroteimage": "hlóð inn nýrri útgáfu af \"[[$1]]\"",
     "uploaddisabled": "Lokað er fyrir að hlaða inn myndum.",
     "copyuploaddisabled": "Lokað er fyrir að hlaða inn myndum frá vefslóð.",
-    "uploadfromurl-queued": "Upphlaðið þitt hefur verið sett í biðröð.",
     "uploaddisabledtext": "Lokað er fyrir að hlaða inn skrám.",
     "php-uploaddisabledtext": "Skráar upphlöð eru óvirk í PHP.\nVinsamlegast athugaðu stillinguna í file_uploads.",
     "uploadscripted": "Þetta skjal inniheldur (X)HTML eða forskriftu sem gæti valdið villum í vöfrum.",
     "upload-misc-error": "Óþekkt innhleðsluvilla",
     "upload-misc-error-text": "Upphal þitt mistókst vegna óþekktrar villu.\nAthugaðu hvort vefslóðin sé rétt og aðgengileg og að því loknu reyndu aftur.\nEf vandamálið lagast ekki, hafðu samband við [[Special:ListUsers/sysop|stjórnanda]].",
     "upload-too-many-redirects": "Vefslóðin inniheldur of margar tilvísanir.",
-    "upload-unknown-size": "Óþekkt stærð",
     "upload-http-error": "HTTP villa kom upp við upphal skráarinnar: $1",
     "upload-copy-upload-invalid-domain": "Lokað er fyrir afritun skráa frá öðrum vefþjón á þessu vefsvæði.",
     "backend-fail-stream": "Gat ekki streymt skránni „$1“.",
     "img-auth-streaming": "Streymi \"$1\".",
     "img-auth-public": "Virkni img_auth.php er að flytja út skrár frá einkawiki.\nÞessi wiki er stilltur sem opinber wiki.\nVegna öryggissjónarmiða er img_auth.php óvirkt.",
     "img-auth-noread": "Notandinn hefur ekki rétt til að lesa \"$1\"",
-    "img-auth-bad-query-string": "Vefslóðin hefur ógildan fyrirspurnar streng.",
     "http-invalid-url": "Vitlaust veffang: $1",
     "http-invalid-scheme": "Vefslóðir með \"$1\" forskeyti eru óstuddar.",
     "http-request-error": "HTTP beiðni mistókst vegna óþekktrar villu.",
     "filehist-dimensions": "Víddir",
     "filehist-filesize": "Stærð skráar",
     "filehist-comment": "Athugasemd",
-    "filehist-missing": "Skrá vantar",
     "imagelinks": "Skráartenglar",
     "linkstoimage": "Eftirfarandi {{PLURAL:$1|síða tengist|$1 síður tengjast}} í þessa skrá:",
     "linkstoimage-more": "Fleiri en $1 {{PLURAL:$1|síða tengist|síður tengjast}} þessari skrá.\nEftirfarandi listi sýnir {{PLURAL:$1|fyrsta myndatengilinn|fyrstu $1 myndatenglana}}.\n[[Special:WhatLinksHere/$2|Tæmandi listi]] er til staðar.",
     "emailuser-title-notarget": "Senda tölvupóst",
     "emailpage": "Senda tölvupóst",
     "emailpagetext": "Hafi notandinn tilgreint netfang í stillingunum sínum er hægt að senda póst til {{GENDER:$1|hans|hennar|hans}} hér.\nPóstfangið sem þú tilgreindir í [[Special:Preferences|stillingunum þínum]] birtist í \"Frá:\" hluta tölvupóstsins, svo að viðtakandi hans geti svarað beint til þín.",
-    "usermailererror": "Póst hlutur skilaði villu:",
     "defemailsubject": "{{SITENAME}} skilaboð frá notandanum \"$1\"",
     "usermaildisabled": "Netfang notenda er óvirkt",
     "usermaildisabledtext": "Þú getur ekki sent tölvupóst til annara notenda á þessum wiki",
     "noemailtitle": "Ekkert póstfang",
     "noemailtext": "Þessi notandi hefur ekki tilgreint gilt netfang.",
-    "nowikiemailtitle": "Tölvupóstur óheimill",
     "nowikiemailtext": "Þessi notandi hefur valið að fá engan tölvupóst frá öðrum notendum.",
     "emailnotarget": "Notendanafn er ekki til eða ógilt fyrir þennan viðtakanda.",
     "emailtarget": "Tilgreindu notendanafn viðtakanda",
     "nowatchlist": "Vaktlistinn er tómur.",
     "watchlistanontext": "Vinsamlegast $1ðu þig til að skoða eða breyta vaktlistanum þínum.",
     "watchnologin": "Óinnskráð(ur)",
-    "watchnologintext": "Þú verður að vera [[Special:UserLogin|innskáð(ur)]] til að geta breytt vaktlistanum.",
     "addwatch": "Bæta á vaktlistann",
     "addedwatchtext": "Síðunni „[[:$1]]“ hefur verið bætt á [[Special:Watchlist|vaktlistann]] þinn.\nFrekari breytingar á henni eða spjallsíðu hennar munu verða sýndar þar.",
     "removewatch": "Fjarlægja af vaktlistanum",
     "watching": "Vakta...",
     "unwatching": "Afvakta...",
     "watcherrortext": "Villa kom upp við breytingu á stillingum vaktlistans fyrir \"$1\".",
-    "enotif_mailer": "{{SITENAME}} tilkynningasendill",
     "enotif_reset": "Merkja allar síður sem skoðaðar",
     "enotif_impersonal_salutation": "{{SITENAME}}notandi",
     "enotif_subject_deleted": "$1 á {{SITENAME}} hefur verið eytt af {{gender:$2|$2}}",
     "excontent": "innihaldið var: „$1“",
     "excontentauthor": "innihaldið var: '$1' (og öll framlög voru frá '[[Special:Contributions/$2|$2]]')",
     "exbeforeblank": "innihald fyrir tæmingu var: '$1'",
-    "exblank": "síðan var tóm",
     "delete-confirm": "Eyða „$1“",
     "delete-legend": "Eyða",
     "historywarning": "'''Viðvörun:''' Síðan sem þú ert um það bil að eyða hefur breytingarskrá með $1 {{PLURAL:$1|breytingu|breytingum}}:",
     "change-blocklink": "breyta bönnun",
     "contribslink": "framlög",
     "emaillink": "senda tölvupóst",
-    "autoblocker": "Vistfang þitt er bannað vegna þess að það hefur nýlega verið notað af „[[User:$1|$1]]“.\nÁstæðan fyrir því að $1 var bannaður er: „$2“",
+    "autoblocker": "Vistfang þitt var sjálfkrafa bannað vegna þess að það var nýlega notað af „[[User:$1|$1]]“.\nÁstæðan fyrir því að $1 var bannaður er: „$2“",
     "blocklogpage": "Bönnunarskrá",
     "blocklog-showlog": "Notandinn hefur verið bannaður áður.\nSíðasta færsla notandans úr bönnunarskrá er sýnd hér fyrir neðan til skýringar:",
     "blocklog-showsuppresslog": "Notandinn hefur verið bældur niður áður.\nSíðasta færsla notandans úr bælingarskrá er sýnd hér fyrir neðan til skýringar:",
     "range_block_disabled": "Möppudýr geta ekki fjöldabannað vistföng á þessum wiki.",
     "ipb_expiry_invalid": "Tími ógildur.",
     "ipb_expiry_temp": "Bönn faldra notenda verða að vera varanleg.",
-    "ipb_hide_invalid": "Mistókst að bæla niður þennan aðgang; mögulega hefur hann of margar breytingar.",
+    "ipb_hide_invalid": "Mistókst að bæla niður þennan aðgang; hann hefur meira en $1 {{PLURAL:$1|breytingu|breytingar}}.",
     "ipb_already_blocked": "„$1“ er nú þegar í banni",
     "ipb-needreblock": "$1 er þegar bannaður. Vilt þú breyta banninu?",
     "ipb-otherblocks-header": "{{PLURAL:$1|Annað bann|Önnur bönn}}",
     "allmessagesname": "Titill",
     "allmessagesdefault": "Sjálfgefinn skilaboða texti",
     "allmessagescurrent": "Núverandi texti",
-    "allmessagestext": "Þetta er listi yfir kerfismeldingar í Melding-nafnrýminu.\nVinsamlegast heimsæktu [https://www.mediawiki.org/wiki/Localisation MediaWiki-staðfæringuna] og [//translatewiki.net translatewiki.net] ef þú vilt taka þátt í almennri MediaWiki-staðfæringu.",
+    "allmessagestext": "Þetta er listi yfir kerfismeldingar í Melding-nafnrýminu.\nVinsamlegast heimsæktu [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation MediaWiki-staðfæringuna] og [//translatewiki.net translatewiki.net] ef þú vilt taka þátt í almennri MediaWiki-staðfæringu.",
     "allmessagesnotsupportedDB": "Það er ekki hægt að nota '''{{ns:special}}:Allmessages''' því '''$wgUseDatabaseMessages''' hefur verið gerð óvirk.",
     "allmessages-filter-legend": "Sía",
     "allmessages-filter": "Sía með breytingarstöðu:",
     "importunknownsource": "Óþekkt innflutningstilfangsgerð",
     "importcantopen": "Get ekki opnað innflutt skjal",
     "importbadinterwiki": "Villa í tungumálatengli",
-    "importnotext": "Tómt eða enginn texti",
     "importsuccess": "Innflutningi lokið!",
-    "importhistoryconflict": "Breytingarskrá þessarar síðu er þegar til (gæti hafa verið flutt inn áður)",
     "importnosources": "Engin uppspretta hefur verið valin og bein upphlöð breytingarskráa eru óvirk.",
     "importnofile": "Engri skrá var hlaðið inn.",
     "importuploaderrorsize": "Upphlöðun skráarinnar mistókst.\nSkráin er stærri en hámarsstærð síðna segir til um.",
     "importuploaderrortemp": "Upphlöðun skráarinnar mistókst.\nTímabundin mappa fannst ekki.",
     "import-parse-failure": "Þáttunarvilla við innflutning XML skjals",
     "import-noarticle": "Engin síða til innflutnings!",
-    "import-nonewrevisions": "Allar breytingar voru fluttar inn.",
+    "import-nonewrevisions": "Engar breytingar voru fluttar inn (þær voru allar annaðhvort þegar til eða sleppt vegna villna).",
     "xml-error-string": "$1 í línu $2, dálki $3 ($4 bæt): $5",
     "import-upload": "Hlaða inn XML-gögnum",
     "import-token-mismatch": "Týnd setu gögn.\nVinsamlegast reyndu aftur.",
     "version-parser-extensiontags": "Þáttuð smáforrita tög",
     "version-hook-subscribedby": "Í áskrift af",
     "version-version": "(Útgáfa $1)",
-    "version-license": "Leyfi",
+    "version-license": "MediaWiki leyfi",
     "version-poweredby-credits": "Þessi wiki er knúin af '''[https://www.mediawiki.org/ MediaWiki]''', höfundaréttur © 2001-$1 $2.",
     "version-poweredby-others": "aðrir",
     "version-license-info": "MediaWiki er frjáls hugbúnaður; þú mátt endurútgefa hann og/eða breyta honum undir GNU General Public leyfi eins og það er gefið út af Free Software stofnuninni, annaðhvort útgáfu 2 eða (að þínu mati) hvaða nýrri útgáfa sem er.\n\nMediaWiki er útgefin í þeirri von að hann sé gagnlegur, en ÁN ALLRAR ÁBYRGÐAR; þar meðtalið er undanskilin ábyrgð við MARKAÐSETNINGU og að hugbúnaðurinn VIRKI Í ÁKVEÐNUM TILGANGI. Sjá GNU General Public leyfið fyrir frekari upplýsingar.\n\nÞú ættir að hafa fengið [{{SERVER}}{{SCRIPTPATH}}/COPYING afrit af  GNU General Public leyfinu] með þessum hugbúnaði, en ef ekki, skrifaðu til Free Software stofnunarinnar, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, Bandaríkjunum eða [//www.gnu.org/licenses/old-licenses/gpl-2.0.html lestu það á netinu]",
index 8605bbc..49b4309 100644 (file)
     "permalink": "Link permanente",
     "print": "Stampa",
     "view": "Visualizza",
+    "view-foreign": "Vedi su $1",
     "edit": "Modifica",
+    "edit-local": "Modifica descrizione locale",
     "create": "Crea",
+    "create-local": "Aggiungi descrizione locale",
     "editthispage": "Modifica questa pagina",
     "create-this-page": "Crea questa pagina",
     "delete": "Cancella",
     "pool-timeout": "Timeout durante l'attesa dello sblocco",
     "pool-queuefull": "La coda del pool è piena",
     "pool-errorunknown": "Errore sconosciuto",
+    "pool-servererror": "Il servizio contatore dei pool non è disponibile ($1).",
     "aboutsite": "Informazioni su {{SITENAME}}",
     "aboutpage": "Project:Informazioni",
     "copyright": "Il contenuto è disponibile in base alla licenza $1, se non diversamente specificato.",
     "accountcreatedtext": "È stata creata un'utenza per [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|msg]]).",
     "createaccount-title": "Creazione di un accesso a {{SITENAME}}",
     "createaccount-text": "Qualcuno ha creato un accesso a {{SITENAME}} ($4) a nome di $2, associato a questo indirizzo di posta elettronica. La password per l'utente \"$2\" è impostata a \"$3\".\nÈ opportuno eseguire un accesso quanto prima e cambiare la password immediatamente.\n\nSe l'accesso è stato creato per errore, si può ignorare questo messaggio.",
-    "usernamehasherror": "Il nome utente non può contenere caratteri hash",
     "login-throttled": "Sono stati effettuati troppi tentativi di accesso in breve tempo.\nAttendi $1 e riprova in seguito.",
     "login-abort-generic": "Il tuo login non ha avuto successo - Annullato",
     "loginlanguagelabel": "Lingua: $1",
     "resettokens-token-label": "$1 (valore attuale: $2)",
     "resettokens-watchlist-token": "Token per il feed web (Atom/RSS) delle [[Special:Watchlist|modifiche alle pagine nei tuoi osservati speciali]]",
     "resettokens-done": "Token reimpostati.",
-    "resettokens-resetbutton": "Reset token selezionati",
+    "resettokens-resetbutton": "Reimposta token selezionati",
     "bold_sample": "Grassetto",
     "bold_tip": "Grassetto",
     "italic_sample": "Corsivo",
     "content-model-javascript": "JavaScript",
     "content-model-css": "CSS",
     "expensive-parserfunction-warning": "'''Attenzione:''' Questa pagina contiene troppe chiamate alle parser functions.\n\nDovrebbe averne meno di $2, al momento ce {{PLURAL:$1|n'è $1|ne sono $1}}.",
-    "expensive-parserfunction-category": "Pagine con troppe chiamate alle parser functions",
+    "expensive-parserfunction-category": "Pagine con troppe chiamate alle funzioni parser",
     "post-expand-template-inclusion-warning": "'''Attenzione:''' la dimensione dei template inclusi è troppo grande.\nAlcuni template non verranno inclusi.",
     "post-expand-template-inclusion-category": "Pagine per le quali la dimensione dei template inclusi supera il limite consentito",
     "post-expand-template-argument-warning": "'''Attenzione:''' questa pagina contiene uno o più argomenti di template troppo grandi per essere espansi. Tali argomenti verranno omessi.",
     "prefs-skin": "Aspetto grafico (skin)",
     "skin-preview": "Anteprima",
     "datedefault": "Nessuna preferenza",
-    "prefs-beta": "Funzionalità beta",
-    "prefs-datetime": "Data e ora",
     "prefs-labs": "Funzionalità sperimentali",
     "prefs-user-pages": "Pagine utente",
     "prefs-personal": "Profilo utente",
     "upload-permitted": "Tipi di file consentiti: $1.",
     "upload-preferred": "Tipi di file consigliati: $1.",
     "upload-prohibited": "Tipi di file non consentiti: $1.",
-    "uploadlog": "File caricati",
     "uploadlogpage": "File caricati",
     "uploadlogpagetext": "Di seguito sono elencati gli ultimi file caricati.\nConsultare la [[Special:NewFiles|galleria dei nuovi file]] per una visione d'insieme.",
     "filename": "Nome del file",
     "filereuploadsummary": "Cambiamenti al file:",
     "filestatus": "Informazioni sul copyright:",
     "filesource": "Fonte:",
-    "uploadedfiles": "Elenco dei file caricati",
     "ignorewarning": "Ignora l'avviso e salva comunque il file",
     "ignorewarnings": "Ignora i messaggi di avvertimento del sistema",
     "minlength1": "Il nome del file dev'essere composto da almeno un carattere.",
     "overwroteimage": "ha caricato una nuova versione di \"[[$1]]\"",
     "uploaddisabled": "Il caricamento dei file è disabilitato.",
     "copyuploaddisabled": "Il caricamento tramite URL è disabilitato.",
-    "uploadfromurl-queued": "Il caricamento è stato accodato.",
     "uploaddisabledtext": "Il caricamento dei file non è attivo.",
     "php-uploaddisabledtext": "Il caricamento di file tramite PHP è disabilitato. Controlla la configurazione di file_uploads.",
     "uploadscripted": "Questo file contiene codice HTML o di script, che potrebbe essere interpretato erroneamente da un browser web.",
     "upload-misc-error": "Errore di caricamento sconosciuto",
     "upload-misc-error-text": "Si è verificato un errore non identificato durante il caricamento del file. Verificare che la URL sia corretta e accessibile e provare di nuovo. Se il problema persiste, contattare un [[Special:ListUsers/sysop|amministratore]].",
     "upload-too-many-redirects": "L'URL conteneva troppi redirect",
-    "upload-unknown-size": "Dimensione sconosciuta",
     "upload-http-error": "Si è verificato un errore HTTP: $1",
     "upload-copy-upload-invalid-domain": "Non è consentito il caricamento di copie da questo dominio.",
     "backend-fail-stream": "Impossibile trasmettere il file $1.",
     "img-auth-streaming": "\"$1\" in streaming.",
     "img-auth-public": "La funzione di img_auth.php è di dare in output file da un sito wiki privato.\nQuesto sito è configurato come un wiki pubblico.\nPer una sicurezza ottimale, img_auth.php è disattivato.",
     "img-auth-noread": "L'utente non ha accesso alla lettura di \"$1\".",
-    "img-auth-bad-query-string": "L'URL contiene una stringa di query non valida.",
     "http-invalid-url": "URL non valido: $1",
     "http-invalid-scheme": "URL con il prefisso \"$1\" non sono supportati.",
     "http-request-error": "Richiesta HTTP fallita a causa di un errore sconosciuto.",
     "filehist-dimensions": "Dimensioni",
     "filehist-filesize": "Dimensione del file",
     "filehist-comment": "Commento",
-    "filehist-missing": "File mancante",
     "imagelinks": "Uso del file",
     "linkstoimage": "{{PLURAL:$1|La seguente pagina contiene|Le seguenti $1 pagine contengono}} collegamenti al file:",
     "linkstoimage-more": "Più di $1 {{PLURAL:$1|pagina punta|pagine puntano}} a questo file.\nDi seguito sono elencate solo {{PLURAL:$1|la prima pagina che punta|le prime $1 pagine che puntano}} a questo file.\nÈ disponibile un [[Special:WhatLinksHere/$2|elenco completo]].",
     "listgrouprights-removegroup-self": "Può rimuoversi {{PLURAL:$2|dal gruppo|dai gruppi}}: $1",
     "listgrouprights-addgroup-self-all": "Può aggiungersi a tutti i gruppi",
     "listgrouprights-removegroup-self-all": "Può rimuoversi da tutti i gruppi",
+    "listgrouprights-namespaceprotection-header": "Restrizioni per namespace",
+    "listgrouprights-namespaceprotection-namespace": "Namespace",
+    "listgrouprights-namespaceprotection-restrictedto": "Diritto che consente all'utente di modificare",
+    "trackingcategories": "Categorie di monitoraggio",
+    "trackingcategories-summary": "Questa pagina elenca le categorie di monitoraggio che vengono popolate automaticamente dal software MediaWiki. I loro nomi possono essere cambiati modificando i relativi messaggi di sistema nel namespace {{ns:8}}.",
+    "trackingcategories-msg": "Categoria di monitoraggio",
+    "trackingcategories-name": "Nome del messaggio",
+    "trackingcategories-desc": "Criteri per l'inclusione nella categoria",
+    "noindex-category-desc": "La pagina non è indicizzata dai robot perché contiene la parola magica <code><nowiki>__NOINDEX__</nowiki></code> e si trova in un namespace dove tale flag è consentito.",
+    "index-category-desc": "La pagina contiene <code><nowiki>__INDEX__</nowiki></code> (e si trova in un namespace dove tale flag è consentito) e quindi è indicizzata dai robot, anche se normalmente non lo sarebbe.",
+    "post-expand-template-inclusion-category-desc": "Dopo aver espanso tutti i template, la dimensione della pagina sarà più grande di <code>$wgMaxArticleSize</code>, e dunque alcuni non si espanderanno.",
+    "post-expand-template-argument-category-desc": "Dopo aver espanso il parametro di un template (qualcosa tra parentesi graffe, come <code>{{{Foo}}})</code>, la pagina sarà più grande di <code>$wgMaxArticleSize</code>.",
+    "expensive-parserfunction-category-desc": "La pagina usa troppe funzioni parser (come <code>#ifexist</code>). Vedi [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit Manual:$wgExpensiveParserFunctionLimit].",
+    "broken-file-category-desc": "Categoria aggiunta se la pagina contiene un collegamento interrotto ad un file (un collegamento per incorporare un file quando questo non esiste).",
+    "hidden-category-category-desc": "Questa è una categoria che contiene <code><nowiki>__HIDDENCAT__</nowiki></code>, il quale impedisce che venga mostrata, in modo predefinito, nel riquadro dei collegamenti alle categorie delle pagine.",
+    "trackingcategories-nodesc": "Nessuna descrizione disponibile.",
+    "trackingcategories-disabled": "La categoria è disabilitata",
     "mailnologin": "Nessun indirizzo cui inviare il messaggio",
     "mailnologintext": "Per inviare messaggi e-mail ad altri utenti è necessario [[Special:UserLogin|accedere al sito]] e aver registrato un indirizzo valido nelle proprie [[Special:Preferences|preferenze]].",
     "emailuser": "Scrivi all'utente",
     "emailuser-title-notarget": "Invia una email a un utente",
     "emailpage": "Invia un messaggio email all'utente",
     "emailpagetext": "Usare il modulo sottostante per inviare un messaggio e-mail all'{{GENDER:$1|utente}} indicato. L'indirizzo specificato nelle [[Special:Preferences|preferenze]] del mittente apparirà nel campo \"Da:\" del messaggio per consentire al destinatario di rispondere direttamente.",
-    "usermailererror": "L'oggetto mail ha restituito l'errore:",
     "defemailsubject": "Messaggio da {{SITENAME}} dall'utente \"$1\"",
     "usermaildisabled": "e-mail utente disabilitata",
     "usermaildisabledtext": "Non è possibile inviare e-mail ad altri utenti su questo wiki",
     "noemailtitle": "Nessun indirizzo e-mail",
     "noemailtext": "Questo utente non ha indicato un indirizzo e-mail valido.",
-    "nowikiemailtitle": "E-mail non permessa",
     "nowikiemailtext": "Questo utente ha scelto di non ricevere messaggi di posta elettronica dagli altri utenti.",
     "emailnotarget": "Nome utente del destinatario inesistente o non valido.",
     "emailtarget": "Inserisci il nome utente del destinatario",
     "nowatchlist": "La lista degli osservati speciali è vuota.",
     "watchlistanontext": "Per visualizzare e modificare l'elenco degli osservati speciali è necessario $1.",
     "watchnologin": "Accesso non effettuato",
-    "watchnologintext": "Per modificare la lista degli osservati speciali è necessario prima eseguire l'[[Special:UserLogin|accesso al sito]].",
     "addwatch": "Aggiungi agli osservati speciali",
     "addedwatchtext": "La pagina \"[[:$1]]\" è stata aggiunta alla propria [[Special:Watchlist|lista degli osservati speciali]].\nD'ora in poi, le modifiche apportate alla pagina e alla sua discussione verranno elencate in quella sede.",
     "removewatch": "Rimuovi dagli osservati speciali",
     "watching": "Aggiunta agli osservati speciali...",
     "unwatching": "Eliminazione dagli osservati speciali...",
     "watcherrortext": "Si è verificato un errore durante la modifica degli osservati speciali per \"$1\".",
-    "enotif_mailer": "Sistema di notifica via e-mail di {{SITENAME}}",
     "enotif_reset": "Segna tutte le pagine come già visitate",
     "enotif_impersonal_salutation": "Utente di {{SITENAME}}",
     "enotif_subject_deleted": "La pagina $1 di {{SITENAME}} è stata cancellata da {{gender:$2|$2}}",
     "excontent": "il contenuto era: '$1'",
     "excontentauthor": "il contenuto era: '$1' (e l'unico contributore era '[[Special:Contributions/$2|$2]]')",
     "exbeforeblank": "Il contenuto prima dello svuotamento era: '$1'",
-    "exblank": "la pagina era vuota",
     "delete-confirm": "Cancella \"$1\"",
     "delete-legend": "Cancella",
     "historywarning": "'''Attenzione:''' La pagina che stai per cancellare ha una cronologia con approssimativamente $1 {{PLURAL:$1|revisione|revisioni}}:",
     "contributions-title": "Contributi di $1",
     "mycontris": "contributi",
     "contribsub2": "Per {{GENDER:$3|$1}} ($2)",
+    "contributions-userdoesnotexist": "L'account utente \"$1\" non è registrato.",
     "nocontribs": "Non sono state trovate modifiche che soddisfino i criteri di ricerca.",
     "uctop": "(attuale)",
     "month": "Dal mese (e precedenti):",
     "sp-contributions-newbies-sub": "Per i nuovi utenti",
     "sp-contributions-newbies-title": "Contributi dei nuovi utenti",
     "sp-contributions-blocklog": "blocchi",
+    "sp-contributions-suppresslog": "contributi utente soppressi",
     "sp-contributions-deleted": "contributi utente cancellati",
     "sp-contributions-uploads": "file caricati",
     "sp-contributions-logs": "registri",
     "sp-contributions-blocked-notice": "Questo utente è attualmente bloccato. L'ultimo elemento del registro dei blocchi è riportato di seguito per informazione:",
     "sp-contributions-blocked-notice-anon": "Questo indirizzo IP è attualmente bloccato. Di seguito è riportato l'ultimo elemento del registro dei blocchi:",
     "sp-contributions-search": "Ricerca contributi",
-    "sp-contributions-suppresslog": "contributi utente soppressi",
     "sp-contributions-username": "Indirizzo IP o nome utente:",
     "sp-contributions-toponly": "Mostra solo i contributi che sono le ultime revisioni per la pagina",
     "sp-contributions-newonly": "Visualizza solo le modifiche che sono creazioni di pagina",
     "allmessagesname": "Nome",
     "allmessagesdefault": "Testo predefinito",
     "allmessagescurrent": "Testo attuale",
-    "allmessagestext": "Questa è la lista di tutti i messaggi di sistema disponibili nel namespace MediaWiki.\nVisitare [https://www.mediawiki.org/wiki/Localisation MediaWiki Localisation] e [//translatewiki.net translatewiki.net] se si desidera contribuire alla localizzazione generica di MediaWiki.",
+    "allmessagestext": "Questa è la lista di tutti i messaggi di sistema disponibili nel namespace MediaWiki.\nVisitare [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation MediaWiki Localisation] e [//translatewiki.net translatewiki.net] se si desidera contribuire alla localizzazione generica di MediaWiki.",
     "allmessagesnotsupportedDB": "Non è possibile utilizzare questa pagina perché il flag '''$wgUseDatabaseMessages''' non è attivo.",
     "allmessages-filter-legend": "Filtro",
     "allmessages-filter": "Filtra per stato di modifica:",
     "importunknownsource": "Tipo di origine sconosciuto per l'importazione",
     "importcantopen": "Impossibile aprire il file di importazione",
     "importbadinterwiki": "Collegamento inter-wiki errato",
-    "importnotext": "Testo vuoto o mancante",
     "importsuccess": "Importazione riuscita.",
-    "importhistoryconflict": "La cronologia contiene delle versioni in conflitto (questa pagina potrebbe essere già stata importata)",
     "importnosources": "Non è stata definita una fonte per l'importazione transwiki; l'importazione diretta della cronologia non è attiva.",
     "importnofile": "Non è stato caricato nessun file per l'importazione.",
     "importuploaderrorsize": "Caricamento del file per l'importazione non riuscito. Il file supera le dimensioni massime consentite per l'upload.",
     "version-entrypoints": "URL di accesso",
     "version-entrypoints-header-entrypoint": "Punti di accesso",
     "version-entrypoints-header-url": "URL",
-    "version-entrypoints-articlepath": "[https://www.mediawiki.org/wiki/Manual:$wgArticlePath Percorso voci]",
-    "version-entrypoints-scriptpath": "[https://www.mediawiki.org/wiki/Manual:$wgScriptPath Percorso script]",
+    "version-entrypoints-articlepath": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgArticlePath Percorso voci]",
+    "version-entrypoints-scriptpath": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgScriptPath Percorso script]",
     "redirect": "Reindirizzamento da file, utente, pagina o versione",
     "redirect-legend": "Reindirizza a un file o una pagina",
     "redirect-summary": "Questa pagina speciale reindirizza a un file (specificando il nome del file), a una pagina (specificando un ID di versione o un ID pagina) o a un utente (specificando un ID utente numerico).\nEsempi: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]], or [[{{#Special:Redirect}}/user/101]].",
     "specialpages-group-users": "Utenti e diritti",
     "specialpages-group-highuse": "Pagine molto usate",
     "specialpages-group-pages": "Elenchi di pagine",
-    "specialpages-group-pagetools": "Strumenti utili per le pagine",
+    "specialpages-group-pagetools": "Strumenti per le pagine",
     "specialpages-group-wiki": "Dati e strumenti",
-    "specialpages-group-redirects": "Pagine speciali di redirect",
+    "specialpages-group-redirects": "Pagine speciali che reindirizzano",
     "specialpages-group-spam": "Strumenti contro lo spam",
     "blankpage": "Pagina vuota",
     "intentionallyblankpage": "Questa pagina è lasciata volutamente vuota.",
index 95b3b7f..76266a5 100644 (file)
     "pool-timeout": "ロック待ちタイムアウト",
     "pool-queuefull": "プールキューがいっぱいです",
     "pool-errorunknown": "不明なエラー",
+    "pool-servererror": "プール カウンター サービスは利用できません ($1)。",
     "aboutsite": "{{SITENAME}}について",
     "aboutpage": "Project:{{SITENAME}}について",
     "copyright": "特に記載がない限り、内容は$1のライセンスで利用できます。",
     "accountcreatedtext": "利用者アカウント [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|トーク]]) を作成しました。",
     "createaccount-title": "{{SITENAME}}のアカウント作成",
     "createaccount-text": "誰か (おそらくあなた) が、{{SITENAME}} ($4) にあなたのメールアドレスのアカウントを作成しました。\nアカウント名「$2」、パスワード「$3」です。\n今すぐログインしてパスワードを変更してください。\n\nこのアカウントが何かの手違いで作成された場合は、このメッセージを無視してください。",
-    "usernamehasherror": "利用者名には番号記号を含めることができません",
     "login-throttled": "ログインの失敗が制限回数を超えました。\n$1待ってから再度試してください。",
     "login-abort-generic": "ログインに失敗しました - 中止",
     "loginlanguagelabel": "言語: $1",
     "prefs-skin": "外装",
     "skin-preview": "プレビュー",
     "datedefault": "選択なし",
-    "prefs-beta": "ベータ版機能",
-    "prefs-datetime": "日付と時刻",
     "prefs-labs": "ラボの機能",
     "prefs-user-pages": "利用者ページ",
     "prefs-personal": "利用者情報",
     "upload-permitted": "許可されているファイル形式: $1。",
     "upload-preferred": "推奨されているファイル形式: $1。",
     "upload-prohibited": "禁止されているファイル形式: $1。",
-    "uploadlog": "アップロード記録",
     "uploadlogpage": "アップロード記録",
     "uploadlogpagetext": "以下はファイルアップロードの最近の記録です。\n画像付きで見るには[[Special:NewFiles|新規ファイルの一覧]]をご覧ください。",
     "filename": "ファイル名",
     "filereuploadsummary": "ファイルの変更:",
     "filestatus": "著作権情報:",
     "filesource": "出典:",
-    "uploadedfiles": "アップロードされたファイル",
     "ignorewarning": "警告を無視してファイルを保存",
     "ignorewarnings": "警告を無視",
     "minlength1": "ファイル名には少なくとも1文字必要です。",
     "overwroteimage": "「[[$1]]」の新しい版をアップロードしました",
     "uploaddisabled": "アップロード機能は無効になっています。",
     "copyuploaddisabled": "URL からのアップロードは無効になっています。",
-    "uploadfromurl-queued": "アップロードがキューに追加されました。",
     "uploaddisabledtext": "ファイルのアップロードは、無効になっています。",
     "php-uploaddisabledtext": "ファイルのアップロードがPHPで無効化されています。\nfile_uploadsの設定を確認してください。",
     "uploadscripted": "このファイルは、ウェブブラウザーが誤って解釈してしまうおそれがあるHTMLまたはスクリプトコードを含んでいます。",
     "upload-misc-error": "不明なアップロードエラー",
     "upload-misc-error-text": "アップロード中に不明なエラーが発生しました。\n指定した URL が正しいこととアクセスできることを確認して、もう一度試してください。\nそれでもこのエラーが発生する場合は、[[Special:ListUsers/sysop|管理者]]に連絡してください。",
     "upload-too-many-redirects": "そのURLに含まれるリダイレクトが多すぎます",
-    "upload-unknown-size": "サイズ不明",
     "upload-http-error": "HTTP エラー発生: $1",
     "upload-copy-upload-invalid-domain": "このドメインからのアップロードは許可されていません。",
     "backend-fail-stream": "ファイル $1 をストリームできませんでした。",
     "img-auth-streaming": "「$1」を転送中。",
     "img-auth-public": "img_auth.phpの機能は、非公開ウィキからのファイルの出力です。\nこのウィキは公開ウィキとして構成されています。\n最適なセキュリティのため、img_auth.phpを無効にしています。",
     "img-auth-noread": "利用者は「$1」の読み取り権限を持っていません。",
-    "img-auth-bad-query-string": "URLの中に無効なクエリ文字列があります。",
     "http-invalid-url": "無効なURL: $1",
     "http-invalid-scheme": "スキーム「$1」の URL には未対応です。",
     "http-request-error": "不明なエラーによりHTTPリクエストに失敗しました。",
     "filehist-dimensions": "寸法",
     "filehist-filesize": "ファイルサイズ",
     "filehist-comment": "コメント",
-    "filehist-missing": "ファイルがありません",
     "imagelinks": "ファイルの使用状況",
     "linkstoimage": "以下の{{PLURAL:$1|ページ|​&#32;$1 ページ}}がこのファイルにリンクしています:",
     "linkstoimage-more": "このファイルへは $1 を超える数のページからリンクがあります。\n以下の一覧ではこのファイルにリンクしている最初の $1 ページのみを表示しています。\n[[Special:WhatLinksHere/$2|完全な一覧]]も参照してください。",
     "listgrouprights-removegroup-self": "自身のアカウントから{{PLURAL:$2|グループ}}を除去: $1",
     "listgrouprights-addgroup-self-all": "自身のアカウントに全グループを追加可能",
     "listgrouprights-removegroup-self-all": "自身のアカウントから全グループを除去可能",
+    "listgrouprights-namespaceprotection-namespace": "名前空間",
+    "trackingcategories": "追跡用カテゴリ",
+    "trackingcategories-summary": "このページでは、MediaWiki ソフトウェアが自動的に追加した追跡用カテゴリを列挙します。これらの名前は、{{ns:8}} 名前空間内の対応するシステム メッセージを修正することで変更できます。",
+    "trackingcategories-msg": "追跡用カテゴリ",
+    "trackingcategories-name": "メッセージ名",
+    "post-expand-template-inclusion-category-desc": "テンプレートを展開したあとのページ サイズが <code>$wgMaxArticleSize</code> よりも大きいため、一部のテンプレートが展開されなかった",
+    "post-expand-template-argument-category-desc": "テンプレート引数 (<code>{{{Foo}}}</code> のような三重中括弧部分) を展開したあとのページが <code>$wgMaxArticleSize</code> よりも大きい",
+    "expensive-parserfunction-category-desc": "高負荷なパーサー関数 (<code>#ifexist</code> など) の呼び出し回数が多過ぎるページ。[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit Manual:$wgExpensiveParserFunctionLimit] を参照してください。",
+    "broken-file-category-desc": "リンク切れしたファイルを含むページ (ファイルを埋め込むリンクがあり、そのファイルが存在しない) に追加されるカテゴリ",
+    "hidden-category-category-desc": "<code><nowiki>__HIDDENCAT__</nowiki></code> を含むカテゴリ。このカテゴリは、既定ではページのカテゴリ リンク ボックス内に表示されません。",
+    "trackingcategories-nodesc": "説明はありません。",
     "mailnologin": "送信アドレスがありません",
     "mailnologintext": "他の利用者宛にメールを送信するためには、[[Special:UserLogin|ログイン]]し、[[Special:Preferences|個人設定]]で有効なメールアドレスを設定する必要があります。",
     "emailuser": "この利用者にメールを送信",
     "emailuser-title-notarget": "利用者にメールを送信",
     "emailpage": "利用者にメールを送信",
     "emailpagetext": "以下のフォームを使用してこの{{GENDER:$1|利用者}}にメールを送信できます。\n「差出人」として、[[Special:Preferences|利用者の個人設定]]で入力したメールアドレスが設定されます。これにより、受信者があなたに直接返信できるようになります。",
-    "usermailererror": "メールが以下のエラーを返しました:",
     "defemailsubject": "{{SITENAME}} 利用者「$1」からのメール",
     "usermaildisabled": "利用者メール機能は無効です",
     "usermaildisabledtext": "このウィキでは他の利用者にメールを送信できません",
     "noemailtitle": "メールアドレスがありません",
     "noemailtext": "この利用者は有効なメールアドレスを登録していません。",
-    "nowikiemailtitle": "メールは許可されていません",
     "nowikiemailtext": "この利用者は他の利用者からメールを受け取らない設定にしています。",
     "emailnotarget": "受信者の利用者名が存在しない、あるいは無効です。",
     "emailtarget": "受信者の利用者名を入力してください",
     "nowatchlist": "ウォッチリストには何も項目がありません。",
     "watchlistanontext": "ウォッチリストにある項目を閲覧または編集するには、$1してください。",
     "watchnologin": "ログインしていません",
-    "watchnologintext": "ウォッチリストを変更するためには、[[Special:UserLogin|ログイン]]している必要があります。",
     "addwatch": "ウォッチリストに追加",
     "addedwatchtext": "ページ「[[:$1]]」を[[Special:Watchlist|ウォッチリスト]]に追加しました。\nこのページまたはそのトークページが変更されると、ウォッチリストに表示されます。",
     "removewatch": "ウォッチリストから除去",
     "watching": "ウォッチリストに追加中...",
     "unwatching": "ウォッチリストから除去中...",
     "watcherrortext": "ウォッチリストの「$1」の設定を変更中にエラーが発生しました。",
-    "enotif_mailer": "{{SITENAME}} 通知メール",
     "enotif_reset": "すべてのページを訪問済みにする",
     "enotif_impersonal_salutation": "{{SITENAME}}の利用者",
     "enotif_subject_deleted": "{{SITENAME}} ページ $1 を $2 が{{GENDER:$2|削除しました}}",
     "excontent": "内容:「$1」",
     "excontentauthor": "内容:「$1」(投稿者は「[[Special:Contributions/$2|$2]]」のみ)",
     "exbeforeblank": "白紙化前の内容:「$1」",
-    "exblank": "白紙ページ",
     "delete-confirm": "「$1」の削除",
     "delete-legend": "削除",
     "historywarning": "<strong>警告:</strong> 削除しようとしているページには、約$1版の履歴があります:",
     "contributions-title": "$1の投稿記録",
     "mycontris": "投稿記録",
     "contribsub2": "利用者: {{GENDER:$3|$1}} ($2)",
+    "contributions-userdoesnotexist": "利用者アカウント「$1」は登録されていません。",
     "nocontribs": "これらの条件に一致する変更は見つかりませんでした。",
     "uctop": "(最新)",
     "month": "この月以前:",
     "sp-contributions-newbies-sub": "新規利用者のみ",
     "sp-contributions-newbies-title": "新規利用者の投稿記録",
     "sp-contributions-blocklog": "ブロック記録",
+    "sp-contributions-suppresslog": "利用者の秘匿された投稿",
     "sp-contributions-deleted": "削除された投稿の一覧",
     "sp-contributions-uploads": "アップロード",
     "sp-contributions-logs": "記録",
     "sp-contributions-blocked-notice": "この利用者は現在ブロックされています。\n参考のために最新のブロック記録項目を以下に表示します:",
     "sp-contributions-blocked-notice-anon": "このIPアドレスは現在ブロックされています。\n参考のために最近のブロック記録項目を以下に表示します:",
     "sp-contributions-search": "投稿の検索",
-    "sp-contributions-suppresslog": "利用者の秘匿された投稿",
     "sp-contributions-username": "IPアドレスまたは利用者名:",
     "sp-contributions-toponly": "最新版の編集のみを表示",
     "sp-contributions-newonly": "ページ作成を伴う編集のみを表示",
     "allmessagesname": "名前",
     "allmessagesdefault": "既定のメッセージ文",
     "allmessagescurrent": "現在のメッセージ文",
-    "allmessagestext": "これは MediaWiki 名前空間で利用できるシステム メッセージの一覧です。\nMediaWiki 全般のローカライズ (地域化) に貢献したい場合は、[https://www.mediawiki.org/wiki/Localisation/ja MediaWiki のローカライズ]や [//translatewiki.net?setlang=ja translatewiki.net] をご覧ください。",
+    "allmessagestext": "これは MediaWiki 名前空間で利用できるシステム メッセージの一覧です。\nMediaWiki 全般のローカライズ (地域化) に貢献したい場合は、[https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation MediaWiki のローカライズ]や [//translatewiki.net?setlang=ja translatewiki.net] をご覧ください。",
     "allmessagesnotsupportedDB": "<strong>$wgUseDatabaseMessages</strong>が無効のため、このページを使用できません。",
     "allmessages-filter-legend": "絞り込み",
     "allmessages-filter": "変更状態により絞り込む:",
     "importunknownsource": "取り込み元のタイプが不明です",
     "importcantopen": "取り込みファイルが開けませんでした",
     "importbadinterwiki": "ウィキ間リンクが正しくありません",
-    "importnotext": "内容が空、または本文がありません",
     "importsuccess": "取り込みが完了しました!",
-    "importhistoryconflict": "取り込み時にいくつかの版が競合しました (以前に同じページが取り込まれているかもしれません)",
     "importnosources": "ウィキ間移動の取り込み元が定義されていないため、履歴の直接アップロードは無効になっています。",
     "importnofile": "取り込みファイルはアップロードされませんでした。",
     "importuploaderrorsize": "取り込みファイルのアップロードに失敗しました。\nファイルが、アップロードできるサイズを超えています。",
     "version-entrypoints": "エントリーポイントの URL",
     "version-entrypoints-header-entrypoint": "エントリーポイント",
     "version-entrypoints-header-url": "URL",
-    "version-entrypoints-articlepath": "[https://www.mediawiki.org/wiki/Manual:$wgArticlePath/ja 記事のパス]",
-    "version-entrypoints-scriptpath": "[https://www.mediawiki.org/wiki/Manual:$wgScriptPath/ja スクリプトパス]",
+    "version-entrypoints-articlepath": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgArticlePath 記事のパス]",
+    "version-entrypoints-scriptpath": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgScriptPath スクリプトパス]",
     "redirect": "ファイル名、利用者ID、ページID、版IDでの転送",
     "redirect-legend": "ファイルまたはページヘの転送",
     "redirect-summary": "この特別ページは、ファイル (ファイル名を指定)、ページ (版 ID またはページ ID を指定)、利用者ページ (利用者 ID を整数で指定) に転送されます。使用例: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]], [[{{#Special:Redirect}}/user/101]]",
     "expand_templates_remove_nowiki": "結果に含まれる <nowiki> タグを表示しない",
     "expand_templates_generate_xml": "XML 構文解析ツリーを表示",
     "expand_templates_generate_rawhtml": "HTML ソースを表示",
-    "expand_templates_preview": "プレビュー",
-    "trackingcategories": "追跡用カテゴリ",
-    "trackingcategories-summary": "このページでは、MediaWiki ソフトウェアが自動的に追加した追跡用カテゴリを列挙します。これらの名前は、{{ns:8}} 名前空間内の対応するシステム メッセージを修正することで変更できます。",
-    "trackingcategories-msg": "追跡用カテゴリ",
-    "trackingcategories-name": "メッセージ名",
-    "trackingcategories-nodesc": "説明はありません。"
+    "expand_templates_preview": "プレビュー"
 }
index 6c2e421..3d72b45 100644 (file)
     "disclaimers": "nunxusra lo za'i na fuzme",
     "disclaimerpage": "Project:kampu nunxusra be lo za'i na fuzme",
     "edithelp": "stika nunsidju",
-    "helppage": "Help:lo se vasru",
     "mainpage": "Ralju Ckupau",
     "mainpage-description": "ralju ckupau",
     "portal": "bende ckupau",
index 3a4142e..0dbe6ed 100644 (file)
     "disclaimers": "Førbeholt",
     "disclaimerpage": "Project:Huses førbeholt",
     "edithelp": "Hjælp til redigærenge",
-    "helppage": "Help:Hjælpførside",
     "mainpage": "Førsit",
     "mainpage-description": "Førsit",
     "policy-url": "Project:Politik",
index 6d5183d..ae3a0bb 100644 (file)
     "prefs-skin": "Kulit",
     "skin-preview": "Pratilik",
     "datedefault": "Ora ana préferènsi",
-    "prefs-beta": "Piranti béta",
     "prefs-datetime": "Tanggal lan wektu",
     "prefs-labs": "Piranti lab",
     "prefs-user-pages": "Kaca panganggo",
     "nowatchlist": "Daftar pangawasan panjenengan kosong.",
     "watchlistanontext": "Mangga $1 kanggo mirsani utawa nyunting daftar pangawasan panjenengan.",
     "watchnologin": "Durung mlebu log",
-    "watchnologintext": "Panjenengan kudu [[Special:UserLogin|mlebu log]] kanggo ngowahi daftar artikel pilihan.",
     "addwatch": "Tambah nèng daptar pangawasan",
     "addedwatchtext": "Kaca \"[[:$1]]\" wis ditambahaké menyang [[Special:Watchlist|daftar pangawasan]].\nOwah-owahan sing dumadi ing tembé ing kaca iku lan kaca dhiskusi sing kagandhèng, bakal dipacak ing kéné.",
     "removewatch": "Singkiraké saka daptar pangawasan",
     "allmessagesname": "Asma (jeneng)",
     "allmessagesdefault": "Tèks baku",
     "allmessagescurrent": "Tèks saiki",
-    "allmessagestext": "Iki dhaptar kabèh pesen saka sistem sing ana ing bilik jeneng MediaWiki.\nMangga pirsani [https://www.mediawiki.org/wiki/Localisation MediaWiki Localisation] lan [//translatewiki.net translatewiki.net] yèn panjenengan arep kontribusi ing lokalisasi generik MediaWiki.",
+    "allmessagestext": "Iki dhaptar kabèh pesen saka sistem sing ana ing bilik jeneng MediaWiki.\nMangga pirsani [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation MediaWiki Localisation] lan [//translatewiki.net translatewiki.net] yèn panjenengan arep kontribusi ing lokalisasi generik MediaWiki.",
     "allmessagesnotsupportedDB": "Kaca iki ora bisa dienggo amerga '''$wgUseDatabaseMessages''' dipatèni.",
     "allmessages-filter-legend": "Penyaring",
     "allmessages-filter": "Saring nganggo kahanan kustomisasi:",
index 03331b1..60e6af4 100644 (file)
     "accountcreatedtext": "მომხმარებლის ანგარიში [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|განხილვა]]) შექმნილია.",
     "createaccount-title": "ანგარიშის შექმნა {{SITENAME}}-თვის",
     "createaccount-text": "ვიღაცამ შექმნა ანგარიში სახელით „$2“ და პაროლით „$3“ თქვენი ელექტრონული ფოსტისთვის {{SITENAME}}-ში ($4). გთხოვთ დარეგისტრირდეთ და შეცვალოთ პაროლი.\n\nშეგიძლიათ ყურადღება არ მიაქციოთ ამ შეტყობინებას, თუ ანგარიში შეცდომით შეიქმნა.",
-    "usernamehasherror": "მომხმარებლის სახელი არ უნდა შეიცავდეს დიეზის სიმბოლოს.",
     "login-throttled": "You have made too many recent login attempts.\nPlease wait $1 before trying again.",
     "login-abort-generic": "თქვენი ავტორიზაცია წარუმატებელია – გაუქმდა",
     "loginlanguagelabel": "ენა: $1",
     "showhideselectedversions": "ჩვენება/დამალვა არჩეული ვერსიებისა",
     "editundo": "გაუქმება",
     "diff-empty": "(განსხვავება არ არის)",
+    "diff-multi-sameuser": "({{PLURAL:$1|ერთი შუალედური ცვლილება|$1 შუალედური ცვლილებები}} იმავე მომხმარებლის მიერ არ არის ნაჩვენები)",
     "diff-multi-manyusers": "({{PLURAL:$2|ერთი მომხმარებლის|$2 მომხმარებლების}} {{PLURAL:$1|ერთი შუალედური ვერსია|$1 შუალედური ვერსიები}}, რომლებიც არ არის ნაჩვენები.)",
     "difference-missing-revision": "{{PLURAL:$2|$2 ვერსია}} ამ შედარებისათვის ($1) {{PLURAL:$2|ვერ მოიძებნა}}.\n\nეს ჩვეულებრივ ხდება მაშინ, თუ ვერსიების შედარების მოძველებული ბმულით გადადიხართ გვერდზე, რომელიც წაიშალა.\nდეტალური ინფორმაცია შესაძლებელია იყოს [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} წაშლების ჟურნალში].",
     "searchresults": "ძიების შედეგები",
     "prefs-skin": "გარეკანი",
     "skin-preview": "წინასწარი გადახედვა",
     "datedefault": "წყარო მითითებული არაა",
-    "prefs-beta": "ბეტა შესაძლებლობები",
-    "prefs-datetime": "თარიღი და დრო",
     "prefs-labs": "ექსპერიმენტალური ფუნქციები",
     "prefs-user-pages": "მომხმარებლის გვერდები",
     "prefs-personal": "მომხმარებლის მონაცემები",
     "rclistfrom": "ახალი ცვლილებების ჩვენება დაწყებული $1-დან",
     "rcshowhideminor": "მცირე რედაქტირების $1",
     "rcshowhidebots": "რობოტების  $1",
+    "rcshowhidebots-show": "ჩვენება",
+    "rcshowhidebots-hide": "დამალვა",
     "rcshowhideliu": "$1 რეგისტრირებული მომხმარებელი",
     "rcshowhideanons": "ანონიმური მომხმარებლების $1",
     "rcshowhidepatr": "გაკონტროლებული ცვლილებების $1",
     "upload-permitted": "მიღებული ფაილის ტიპები: $1.",
     "upload-preferred": "სასურველი ფაილის ტიპები: $1.",
     "upload-prohibited": "აკრძალული ფაილის ტიპები: $1.",
-    "uploadlog": "გადმოტვირთვის რეგისტრაცია",
     "uploadlogpage": "გადმოტვირთვის რეგისტრაცია",
     "uploadlogpagetext": "ქვემოთ არის ყველაზე ბოლოს ატვირთული ფაილების სია.",
     "filename": "ფაილის სახელი",
     "filereuploadsummary": "ფაილის ცვლილებები:",
     "filestatus": "საავტორო უფლებების სტატუსი:",
     "filesource": "წყარო:",
-    "uploadedfiles": "ფაილების დამატება",
     "ignorewarning": "გაფრთხილება უგულებელყავი და მაინც შეინახე ფაილი.",
     "ignorewarnings": "უგულებელყავი ნებისმიერი გაფრთხილება",
     "minlength1": "ფაილის სახელი უნდა იყოს არანაკლებ ერთი ასო.",
     "overwroteimage": "ატვირთულია „[[$1]]-ის“ ახალი ვერსია",
     "uploaddisabled": "ატვირთვა გამორთულია.",
     "copyuploaddisabled": "URL ატვირთვა გაღიშულია",
-    "uploadfromurl-queued": "თქვენი ატვირთვა რიგში ჩადგა.",
     "uploaddisabledtext": "ფაილების ატვირთვა შეუძლებელია.",
     "php-uploaddisabledtext": "ფაილების ატვირთვა შეჩერებულია PHP-ით. გთხოვთ შეამოწმოთ file_uploads-ის მნიშვნელობა.",
     "uploadscripted": "ფაილი შეიცავს HTML-კოდს, ან სკრიპტს, რომელიც ბროუზერმა შეიძლება არასწორედ გაანალიზოს.",
     "upload-misc-error": "უცნობია ატვირთვის შეცდომა",
     "upload-misc-error-text": "ატვირთვისას უცნობი სახის შეცდომა გაიპარა.\nგთხოვთ შეამოწმოთ თუ URL სწორია და ხელმისაწვდომია და ისევ სცადოთ.\nთუ პრობლემა ვერ გადაიჭრა, მიმართეთ [[Special:ListUsers/sysop|ადმინისტრატორს]].",
     "upload-too-many-redirects": "URL შეიცავს ძალიან ბევრ გადამისამართებებს",
-    "upload-unknown-size": "უცნობი ზომა",
     "upload-http-error": "მოხდა HTTP შეცდომა: $1",
     "upload-copy-upload-invalid-domain": "ამ დომენში ატვირთვების კოპირება არ არის ხელმისაწვდომი.",
     "backend-fail-stream": "ფაილი $1 ტრანსლირება ვერ მოხერხდა.",
     "img-auth-streaming": "ნაკადური გადაცემა «$1».",
     "img-auth-public": "img_auth.php-ის დანიშვნა გამოიწვევს ფაილების დახურული ვიკიდან გაოტანას.\nეს ვიკი გამართულია როგორც საზოგადი.\nუსაფრთხოების ოპტიმიზააციისთვის img_auth.php გათიშულია.",
     "img-auth-noread": "მომხმარებელს არა აქვს ნებართვა \"$1\"-ის წასაკითხად.",
-    "img-auth-bad-query-string": "URL შეიცავს არასწორ მოთხოვნას.",
     "http-invalid-url": "არასწორი ბმული: $1",
     "http-invalid-scheme": "«$1» სქემის მქონე მისამართები მხარდაჭერილები არ არიან.",
     "http-request-error": "HTTP მოთხოვნის შეცდომა უცნობი მიზეზის გამო.",
     "filehist-dimensions": "განზომილებები",
     "filehist-filesize": "ფაილის ზომა",
     "filehist-comment": "კომენტარი",
-    "filehist-missing": "ფაილი ვერ მოიძებნა",
     "imagelinks": "ფაილის გამოყენება",
     "linkstoimage": "მომდევნო {{PLURAL:$1|გვერდი|გვერდები}} ებმის ამ ფაილს:",
     "linkstoimage-more": "$1-ზე მეტი {{PLURAL:$1|გვერდები|გვერდების|გვერდები}} რომლებსაც აქვთ ბმულები ამ ფაილზე.\nმოცემულ სიაში {{PLURAL:$1|წარმოდგენილია მხოლოდ $1 ბმული|წარმოდგენილია მხოლოდ $1 ბმულები|წარმოდგენილია მხოლოდ $1 ბმულების}} ამ ფაილზე.\nშეგიძლიათ ნახოთ ასევე [[Special:WhatLinksHere/$2|სრული სია]].",
     "emailuser-title-notarget": "ელ. ფოსტის გაგზავნა მომხმარებელთან",
     "emailpage": "ელ. ფოსტა მომხმარებელს",
     "emailpagetext": "თუ ამ მომხმარებელმა თავის პარამეტრებში ელ. ფოსტის მოქმედი მისამართი მიუთითა, ქვემოთ მოყვანილი ფორმის შევსებისას შეგიძლიათ {{GENDER:$1|მისთვის}} შეტყობინების გაგზავნა. ელ. ფოსტის მისამართი, რომელიც [[Special:Preferences|თქვენს პარამეტრებში]] მიუთითეთ, დაფიქსირდება „გამომგზავნის“ ველში, რათა ადრესატმა პასუხის გაცემა შეძლოს.",
-    "usermailererror": "ელ. ფოსტა დაბრუნდა შეცდომის გამო:",
     "defemailsubject": "ელ-ფოსტა საიტის {{SITENAME}} მომხმარებლისგან „$1“",
     "usermaildisabled": "მომხმარებლის e-mail გათიშულია",
     "usermaildisabledtext": "თქვენ ვერ გაგზავნით e-mail-ს.",
     "noemailtitle": "ელ. ფოსტის მისამართი მითითებული არ არის",
     "noemailtext": "მომხმარებელმა არ მიუთითა მოქმედი ელ. ფოსტის მისამართი.",
-    "nowikiemailtitle": "წერილების გაგზავნის უფლება არ გაქვთ.",
     "nowikiemailtext": "ამ მომხმარებელს არ სურს წერილების მიღება სხვა მომხმარებლებისაგან.",
     "emailnotarget": "არარსებული ან არასწორი მომხმარებლის სახელი.",
     "emailtarget": "შეიყვანეთ მომხმარებლის სახელი ელ-ფოსტის გასაგზავნად.",
     "nowatchlist": "თქვენი კონტროლის სია ცარიელია.",
     "watchlistanontext": "$1\n\nიხილეთ ან რედაქტირება გაუკეთეთ თქვენი კონტროლის სიაში შეტანილ ერთეულებს.",
     "watchnologin": "რეგისტრაცია ვერ შესრულდა",
-    "watchnologintext": "თქვენ უნდა მოახდინოთ [[Special:UserLogin|რეგისტრაცია]] თქვენი კონტროლის სიის მოდიფიცირებისათვის.",
     "addwatch": "კონტროლის სიაში დამატება",
     "addedwatchtext": "გვერდი „[[:$1]]“ დაემატა თქვენს [[Special:Watchlist|კონტროლის სიას]].\nამ და მასთან დაკავშირებული განხილვის გვერდის შემდგომი ცვლილებები აისახება იქ.",
     "removewatch": "კონტროლის სიიდან წაშლა",
     "watching": "კონტროლებადი...",
     "unwatching": "არაკონტროლირებადი...",
     "watcherrortext": "\"$1\"–თვის კონტროლის სიის პარამეტრების ცვლილებისას მოხდა შეცდომა.",
-    "enotif_mailer": "{{SITENAME}}. ელ. ფოსტით შეტყობინების სამსახური",
     "enotif_reset": "აღნიშნე ყველა გვერდი, როგორც გადასინჯული",
     "enotif_impersonal_salutation": "ვიკიპედიის მომხმარებელი",
     "enotif_subject_deleted": "გვერდი პროექტიდან „{{SITENAME}}“ სახელწოდებით „$1“ წაშალა {{gender:$2|მომხმარებელმა}} $2",
     "excontent": "შინაარსი იყო: „$1“",
     "excontentauthor": "შინაარსი იყო: „$1“ (და ერთადერთი ავტორი იყო „[[Special:Contributions/$2|$2]]“)",
     "exbeforeblank": "გვერდის შინაარსი წაშლამდე იყო შემდეგი: „$1“",
-    "exblank": "გვერდი ცარიელი იყო",
     "delete-confirm": "„$1“-ის წაშლა",
     "delete-legend": "წაშლა",
     "historywarning": "'''ყურადღება:''' გვერდს, რომლის წაშლასაც აპირებთ, აქვს დიდი ისტორია: ($1)",
     "allmessagesname": "დასახელება",
     "allmessagesdefault": "სტანდარტული ტექსტი",
     "allmessagescurrent": "მიმდინარე ტექსტი",
-    "allmessagestext": "ეს არის სისემურ შეტყობინებათა სია «MediaWiki» სახელთა სივრცეში.\nგთხოვთ ეწვიოთ  [https://www.mediawiki.org/wiki/Localisation ლოკალიზაციის აღმწერ] გვერდს [//translatewiki.net translatewiki.net] პროექტს, თუ გსურთ MediaWiki ლოკალიზაციაში წვლილის შეტანა.",
+    "allmessagestext": "ეს არის სისემურ შეტყობინებათა სია «MediaWiki» სახელთა სივრცეში.\nგთხოვთ ეწვიოთ  [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation ლოკალიზაციის აღმწერ] გვერდს [//translatewiki.net translatewiki.net] პროექტს, თუ გსურთ MediaWiki ლოკალიზაციაში წვლილის შეტანა.",
     "allmessagesnotsupportedDB": "{{ns:special}}:AllMessages-ის უზრუნველყოფა არ ხდება, ვინაიდან wgUseDatabaseMessages გამორთულია.",
     "allmessages-filter-legend": "ფილტრი",
     "allmessages-filter": "ფილტრი ცვლილებების სტატუსით:",
     "importunknownsource": "იმპორტის წყაროს ტიპი უცნობია",
     "importcantopen": "იმპორტირებული ფაილი არ გაიხსნა",
     "importbadinterwiki": "არასწორი ინტერვიკი ბმული",
-    "importnotext": "ცარიელია",
     "importsuccess": "იმპორტი განხორციელდა!",
-    "importhistoryconflict": "არსებულ ვერსიათა კონფლიქტი. შესაძლოა იგი უკვე იქნა იმპორტირებული.",
     "importnosources": "ტრანსვიკი იმპორტის წყარო არ არის არჩეული. ცვლილებათა ისტორიის პირდაპირი ატვირთვა გათიშულია.",
     "importnofile": "საიმპორტო ფაილის ატვირთვა ვერ მოხერხდა.",
     "importuploaderrorsize": "ვერ მოხერხდა ფაილის ატვირთვა ან იმპორტირება. ფაილის ზომ არღვევს მითითებულ ზღვარს.",
     "version-entrypoints": "შესვლის წერტილის URL-ები",
     "version-entrypoints-header-entrypoint": "შესვლის წერტილი",
     "version-entrypoints-header-url": "URL",
-    "version-entrypoints-articlepath": "[https://www.mediawiki.org/wiki/Manual:$wgArticlePath გზა სტატიისაკენ]",
-    "version-entrypoints-scriptpath": "[https://www.mediawiki.org/wiki/Manual:$wgScriptPath გზა სკრიპტისაკენ]",
+    "version-entrypoints-articlepath": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgArticlePath გზა სტატიისაკენ]",
+    "version-entrypoints-scriptpath": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgScriptPath გზა სკრიპტისაკენ]",
     "redirect": "გადამისამართება ფაილიდან, მომხმარებლიდან, გვერდიდან ან ვერსიის იდენტიფიკატორიდან",
     "redirect-legend": "გადამისამართება ფაილზე ან გვერდზე",
     "redirect-submit": "მიდი",
index f8329e0..87691d7 100644 (file)
     "nowatchlist": "Baqlaw dizimin'iz bos.",
     "watchlistanontext": "Baqlaw dizimin'izdegilerdi qaraw yamasa o'zgertiw ushın $1 kerek.",
     "watchnologin": "Kirilmegen",
-    "watchnologintext": "Baqlaw dizimin'izdi o'zgertiw ushın [[Special:UserLogin|kiriwin'iz]] kerek.",
     "addedwatchtext": "\"[[:$1]]\" beti [[Special:Watchlist|baqlaw dizimin'izge]] qosıldı.\nUsı ha'm og'an baylanıslı bolg'an sa'wbet betlerinde bolatug'ın keleshektegi o'zgerisler usı dizimde ko'rsetiledi ha'mde betti tabıwdı an'satlastırıw ushın [[Special:RecentChanges|taza o'zgerisler diziminde]] '''juwan ha'ripte''' ko'rsetiledi.\nEger siz bul betti baqlaw dizimin'izden o'shirmekshi bolsan'ız bettin' joqarg'ı on' jag'ındag'ı \"Baqlamaw\" jazıwın basın'.",
     "removedwatchtext": "\"[[:$1]]\" beti [[Special:Watchlist|sizin' baqlaw dizimin'izden]] o'shirildi.",
     "watch": "Baqlaw",
     "allmessagesname": "Atama",
     "allmessagesdefault": "Defolt tekst",
     "allmessagescurrent": "Ha'zirgi tekst",
-    "allmessagestext": "Bul {{ns:mediawiki}} isimler ko'pligindegi bar bolg'an sistema xabarları dizimi.\nPlease visit [https://www.mediawiki.org/wiki/Localisation MediaWiki Localisation] and [//translatewiki.net translatewiki.net] if you wish to contribute to the generic MediaWiki localisation.",
+    "allmessagestext": "Bul {{ns:mediawiki}} isimler ko'pligindegi bar bolg'an sistema xabarları dizimi.\nPlease visit [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation MediaWiki Localisation] and [//translatewiki.net translatewiki.net] if you wish to contribute to the generic MediaWiki localisation.",
     "thumbnail-more": "U'lkeytiw",
     "filemissing": "Fayl tabılmadı",
     "thumbnail_error": "Miniatyura jaratıw qa'teligi: $1",
index b6aa9d5..75dde14 100644 (file)
     "prefs-skin": "Aglim",
     "skin-preview": "Pre-timeẓriwt",
     "datedefault": "Ur sɛiɣ ara asemyifi",
-    "prefs-beta": "Tiseɣnin bêta",
     "prefs-datetime": "Azemz d ukud",
     "prefs-labs": "Tiseɣnin « labs »",
     "prefs-user-pages": "Isebtar n useqdac",
     "nowatchlist": "Umuɣ n uɛessi inek d ilem.",
     "watchlistanontext": "G leɛnaya-k $1 iwakken ad twalaḍ neɣ tbeddleḍ iferdas deg wumuɣ n uɛessi inek.",
     "watchnologin": "Ur tekcimeḍ ara",
-    "watchnologintext": "Yessefk ad [[Special:UserLogin|tkecmeḍ]] iwakken ad tbeddleḍ umuɣ n uɛessi inek.",
     "addwatch": "Rnu i umuɣ n uɛassi",
     "addedwatchtext": "Asebter \"[[:$1]]\" yettwarnu deg [[Special:Watchlist|wumuɣ n uḍfar]] inek/inem.\nIbeddlen id-yetteddun deg usebter-agi neɣ deg usbtar umyennan ines, ad banen dagi.",
     "removewatch": "Ekkes seg umuɣ n uɛassi",
     "allmessagesname": "Isem",
     "allmessagesdefault": "Aḍris ameslugen",
     "allmessagescurrent": "Aḍris n tura",
-    "allmessagestext": "Wagi d-umuɣ n inzan yestufan deg tallunt MediaWiki.\nẒeṛ [https://www.mediawiki.org/wiki/Localisation MediaWiki Localisation] dɣa [//translatewiki.net translatewiki.net] ma tebɣiḍ ad ɛiweneḍ i usideg imcettel n MediaWiki.",
+    "allmessagestext": "Wagi d-umuɣ n inzan yestufan deg tallunt MediaWiki.\nẒeṛ [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation MediaWiki Localisation] dɣa [//translatewiki.net translatewiki.net] ma tebɣiḍ ad ɛiweneḍ i usideg imcettel n MediaWiki.",
     "allmessagesnotsupportedDB": "'''{{ns:special}}:Allmessages''' ut yezmir ara ad yettuseqdac axaṭer '''$wgUseDatabaseMessages''' yettwakkes.",
     "allmessages-filter-legend": "Tastayt",
     "allmessages-filter": "Ṣeffi s addad n ubeddil :",
index 257fb68..aad4a1c 100644 (file)
     "currentevents": "Mâmbu ya malu-malu",
     "currentevents-url": "Lukanu:Mâmbu ya malu-malu",
     "edithelp": "Lusadisu ya kusoba",
-    "helppage": "Lusadisu:Mâmbu",
     "mainpage": "Mukânda ya ngudi",
     "mainpage-description": "Mukânda ya ngudi",
     "portal": "Mbôngi",
index 84caf33..d50a58b 100644 (file)
     "accountcreated": "Hesab vırajiya",
     "accountcreatedtext": "Serba $1i hesabê karberi vırajiya.",
     "createaccount-title": "Serba {{SITENAME}}i vırajiyaene hesabê karberi",
-    "usernamehasherror": "Namê karberi de karakteri gunê têwerte ra mebê",
     "loginlanguagelabel": "Zon: $1",
     "changepassword": "Parola bıvurne",
     "resetpass_header": "Parola hesabi bıvurne",
     "updated": "(Bi rozane)",
     "note": "'''Not:'''",
     "previewnote": "Teme! ena teyna verqeyda.'''\nVurnayışê tu hama qeyd nıbiyo!",
-    "editing": "$1 Vurnayis",
+    "editing": "$1 vurino",
     "editingsection": "Vurnaena $1 (qısım)",
     "editingcomment": "$1 vurnino (qısımo newe)",
-    "editconflict": "Têverabiyaena vurnaişi: $1",
+    "editconflict": "Têverabiyayena vurnayişi: $1",
     "yourtext": "Metnê to",
     "storedversion": "Metıno qeydkerde",
     "yourdiff": "Ferqi",
     "permissionserrorstext-withaction": "Desturê to be $2 çino, serba {{PLURAL:$1|na sebebi|nê sebebu}} ra:",
     "recreate-moveddeleted-warn": "'''Hişyari: no pel o ke şıma vırazeni vere cû vırazyayo.'''\n\nDiqet bıkeri no vurnayişê şıma re gerek esto:",
     "moveddeleted-notice": "Ma ena pele wederna.\nQe referansi logê wedernayışi bın de mocnayiya.",
-    "edit-conflict": "Têverabiyaena vurnaişi.",
+    "edit-conflict": "Têverabiyayena vurnayişi.",
     "post-expand-template-inclusion-warning": "'''Teme''': Zerrekê şabloni zaf gırso.\nTaê şabloni ilawe nêbenê.",
     "post-expand-template-inclusion-category": "Pelê ke tede gırşênia şabloni serde sono",
     "post-expand-template-argument-warning": "Hişyari: No pel de tewr tay yew şablono herayi esto.",
     "post-expand-template-argument-category": "Pelê ke şablonê eyi qebul niye",
     "viewpagelogs": "Qeydê ke na pele ra alaqedarê, inu bıasne",
-    "currentrev": "Çımraviarnaoğo rozane",
+    "currentrev": "Çımraviyarnayiso rozane",
     "currentrev-asof": "$1 ra gore pele be halo nıkaên",
     "revisionasof": "Halê roca $1ine",
     "revision-info": "Tesdiq kerdışê roca $1ine be terefê $2",
     "prefs-skin": "Çerme",
     "skin-preview": "Verqayt",
     "datedefault": "Tercihi çinê",
-    "prefs-datetime": "Tarix u zeman",
     "prefs-personal": "Dosya karberi",
     "prefs-rc": "Vurnaisê peyêni",
     "prefs-watchlist": "Lista şêrkerdene",
     "upload_directory_missing": "İndeksê bar-kerdena ($1)i çino u terefê ''webserver''i ra nêşikino ke bıaferiyo.",
     "upload_directory_read_only": "İndeksê bar-kerdena ($1)i terefê ''webserver''i nênuşino.",
     "uploaderror": "Xeta bar-kerdene",
-    "uploadlog": "qeydê barkerdene",
     "uploadlogpage": "Qeydê dosya barkerdene",
     "filename": "Namê dosya",
     "filedesc": "Xulasa",
     "filereuploadsummary": "Vurnaisê dosya:",
     "filestatus": "Halê heqa telifi:",
     "filesource": "Çıme:",
-    "uploadedfiles": "Dosyê barkerdey",
     "empty-file": "Dosya ke ti şawit veng biy.",
     "savefile": "Dosya qeyd ke",
     "uploadedimage": "\"[[$1]]\" bar bi",
     "filehist-dimensions": "Budi",
     "filehist-filesize": "Gırşênia dosya",
     "filehist-comment": "Areze-kerdene",
-    "filehist-missing": "Dosya vindbiyaiya",
     "imagelinks": "Gurenaisê dosya",
     "linkstoimage": "Ano {{PLURAL:$1|girê pele|$1 girê pelu}} be na dosya:",
     "nolinkstoimage": "Pelanê ser ena dosyayê link biyê çin o.",
index 822fd90..42b4448 100644 (file)
@@ -1,6 +1,9 @@
 {
     "@metadata": {
-        "authors": []
+        "authors": [
+            "GaiJin",
+            "Kaztrans"
+        ]
     },
     "tog-underline": "سىلتەمەنىڭ استىن سىز:",
     "tog-hideminor": "جۋىقتاعى وزگەرىستەردەن شاعىن وڭدەمەلەردى جاسىر",
     "nowatchlist": "باقىلاۋ تىزىمىڭىزدە ەش دانا جوق",
     "watchlistanontext": "باقىلاۋ تىزىمىڭىزدەگى دانالاردى قاراۋ, نە وڭدەۋ ٴۇشىن $1 كەرەك.",
     "watchnologin": "كىرمەگەنسىز",
-    "watchnologintext": "باقىلاۋ ٴتىزىمىڭىزدى وزگەرتۋ ٴۇشىن [[Special:UserLogin|كىرۋىڭىز]] ٴجون.",
     "addedwatchtext": "«[[:$1]]» بەتى [[{{#special:Watchlist}}|باقىلاۋ تىزىمىڭىزگە]] ۇستەلدى.\nبۇل بەتتىڭ جانە بايلانىستى تالقىلاۋ بەتىنىڭ كەلەشەكتەگى وزگەرىستەرى مىندا تىزىمدەلىنەدى دە, جانە بەتتىڭ اتاۋى جەڭىل تابىلۋ ٴۇشىن [[{{#special:Recentchanges}}|جۋىقتاعى وزگەرىستەر تىزىمىندە]] '''جۋان ارپىمەن''' كورسەتىلەدى.",
     "removedwatchtext": "«[[:$1]]» بەتى باقىلاۋ تىزىمىڭىزدەن الاستالدى.",
     "watch": "باقىلاۋ",
     "allmessagesname": "اتاۋى",
     "allmessagesdefault": "ادەپكى ٴماتىنى",
     "allmessagescurrent": "اعىمدىق ٴماتىنى",
-    "allmessagestext": "مىندا {{ns:mediawiki}} ەسىم اياسىندا جەتىمدى جۇيە حابار ٴتىزىمى بەرىلەدى.\nەگەر امبەباپ MediaWiki جەرسىندىرۋگە ۇلەس قوسقىڭىز كەلسە [https://www.mediawiki.org/wiki/Localisation MediaWiki جەرسىندىرۋ بەتىنە] جانە [//translatewiki.net translatewiki.net جوباسىنا] بارىپ شىعىڭىز.",
+    "allmessagestext": "مىندا {{ns:mediawiki}} ەسىم اياسىندا جەتىمدى جۇيە حابار ٴتىزىمى بەرىلەدى.\nەگەر امبەباپ MediaWiki جەرسىندىرۋگە ۇلەس قوسقىڭىز كەلسە [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation MediaWiki جەرسىندىرۋ بەتىنە] جانە [//translatewiki.net translatewiki.net جوباسىنا] بارىپ شىعىڭىز.",
     "allmessagesnotsupportedDB": "'''$wgUseDatabaseMessages''' وشىرىلگەن سەبەبىنەن '''{{ns:special}}:AllMessages''' بەتى قولدانىلمايدى.",
     "thumbnail-more": "ۇلكەيتۋ",
     "filemissing": "جوعالعان فايل",
index 262c153..3d7ea16 100644 (file)
@@ -1,6 +1,14 @@
 {
     "@metadata": {
-        "authors": []
+        "authors": [
+            "Alibek Kisybay",
+            "Amangeldy",
+            "Arystanbek",
+            "Bakytgul Salykhova",
+            "Daniyar",
+            "GaiJin",
+            "Kaztrans"
+        ]
     },
     "tog-underline": "Сілтеменің астын сызу:",
     "tog-hideminor": "Жуықтағы өзгерістерден шағын өңдемелерді жасыру",
@@ -25,7 +33,7 @@
     "tog-enotifminoredits": "Шағын өңдеме туралы да маған хат жібер",
     "tog-enotifrevealaddr": "Е-поштамның мекенжайын ескерту хаттарда аш",
     "tog-shownumberswatching": "Бақылап тұрған қатысушылардың санын көрсет",
-    "tog-oldsig": "Ағымдағы қолтаңбаңыз:",
+    "tog-oldsig": "Қазіргі уақыттағы қолтаңбаңыз:",
     "tog-fancysig": "Қолтаңбаны уикимәтін ретінде қарастыру (автоматты сілтеме қойылмайды)",
     "tog-uselivepreview": "Тура қарап шығуды қолдану (сынақтық)",
     "tog-forceeditsummary": "Өңдеменің қысқаша мазмұндамасы бос қалғанда маған ескерт",
     "permalink": "Тұрақты сілтеме",
     "print": "Басып шығару",
     "view": "Қарау",
+    "view-foreign": "$1 сайтынан қарау",
     "edit": "Өңдеу",
+    "edit-local": "Жергілікті сипаттамасын өңдеу",
     "create": "Бастау",
+    "create-local": "Жергілікті сипаттамасын қосу",
     "editthispage": "Бұл бетті өңдеу",
     "create-this-page": "Осы бетті бастау",
     "delete": "Жою",
     "hidetoc": "жасыру",
     "collapsible-collapse": "Түру",
     "collapsible-expand": "Жазу",
-    "thisisdeleted": "$1 қарайсыз ба, немесе қалпына келтіресіз бе?",
+    "thisisdeleted": "$1 қарайсыз ба немесе қалпына келтіресіз бе?",
     "viewdeleted": "$1 қарайсыз ба?",
-    "restorelink": "{{PLURAL:$1|жойылған өңдеме|$1 жойылған өңдемелер}}",
+    "restorelink": "{{PLURAL:$1|жойылған өңдемені|$1 жойылған өңдемені}}",
     "feedlinks": "Арна:",
     "feed-invalid": "Жарамсыз жазылымды арна түрі.",
     "feed-unavailable": "Синдикация таспалары қолжетімсіз",
     "accountcreatedtext": "[[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|талқылауы]]) үшін жаңа қатысушы тіркелгісі жасалды.",
     "createaccount-title": "{{SITENAME}} үшін тіркелу",
     "createaccount-text": "Кейбіреу е-пошта мекенжайыңызды пайдаланып {{SITENAME}} жобасында ($4) «$2» атауымен, «$3» құпия сөзімен тіркелгі жасаған.\nЖобаға кіріуіңіз және құпия сөзіңізді өзгертуіңіз тиісті.\n\nЕгер бұл тіркелгі қателікпен жасалса, осы хабарға елемеуіңіз мүмкін.",
-    "usernamehasherror": "Қатысушы есіміне тор белгі нышаны енгізілмейді.",
     "login-throttled": "Сіз жүйеге кіру үшін тым көп талпыныс жасадыңыз. Өтінемін, қайта кірмес бұрын $1 күте тұрыңыз.",
     "login-abort-generic": "Жүйеге кіру үшін сәтсіз талпыныс жасадыңыз.",
     "loginlanguagelabel": "Тіл: $1",
     "newarticle": "(Жаңа)",
     "newarticletext": "Сілтемеге еріп әлі басталмаған бетке келіпсіз.\nБетті бастау үшін, төменгі терезеде мәтініңізді теріңіз (көбірек ақпарат үшін [$1 анықтама бетін] қараңыз).\nЕгер жаңылғаннан осында келген болсаңыз, браузердің «артқа» деген батырмасын басыңыз.",
     "anontalkpagetext": "----''Бұл тіркелгісіз (немесе тіркелгісін қолданбаған) қатысушы талқылау беті. Осы қатысушыны біз тек сандық IP мекенжайымен теңдестіреміз.\nОсындай IP мекенжай бірнеше қатысушыға ортақтастырылған болуы мүмкін.\nЕгер сіз тіркелгісіз қатысушы болсаңыз және сізге қатыссыз мәндемелер жіберілгенін сезсеңіз, басқа тіркелгісіз қатысушылармен араластырмауы үшін [[{{#special:Userlogin}}|тіркеліңіз не кіріңіз]].''",
-    "noarticletext": "Ағымда бұл бетте еш мәтін жоқ.\n* Басқа беттерден [[Special:Search/{{PAGENAME}}|бұл бет атауын іздеу]],\n* <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} Журналдардан бұл бетке қатысты сәйкес жазбаларды табу]</span>,\n* <span class=\"plainlinks\">'''[{{fullurl:{{FULLPAGENAME}}|action=edit}} Бұл бетті жаңадан бастау]'''</span>.",
+    "noarticletext": "Қазіргі уақытта бұл бетте еш мәтін жоқ.\n* Басқа беттерден [[Special:Search/{{PAGENAME}}|бұл бет атауын іздеу]],\n* <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} Журналдардан бұл бетке қатысты сәйкес жазбаларды табу]</span>,\n* <span class=\"plainlinks\">'''[{{fullurl:{{FULLPAGENAME}}|action=edit}} Бұл бетті жаңадан бастау]'''</span>.",
     "noarticletext-nopermission": "Ағымда бұл бетте еш мәтін жоқ.\nСіз [[Special:Search/{{PAGENAME}}|бұл бет атауын]] басқа беттерден іздей аласыз, немесе <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} журналдардан бұл бетке қатысты сәйкес жазбаларды таба аласыз]</span>. Ал бұл бетті жаңадан бастауға сізде рұқсат жоқ.",
     "userpage-userdoesnotexist": "«<nowiki>$1</nowiki>» қатысушы тіркелгісі жазып алынбаған. Бұл бетті бастау/өңдеу талабыңызды тексеріп шығыңыз.",
     "userpage-userdoesnotexist-view": "«$1» қатысушы есімі тіркелмеген.",
     "revertmerge": "Біріктіруді болдырмау",
     "mergelogpagetext": "Төменде бір беттің тарихы өзге бетке біріктіру ең соңғы тізімі келтіріледі.",
     "history-title": "«$1» дегеннің өңдеу тарихы",
-    "difference-title": "Нұсқалар арасындағы айырмашылық: \"$1\"",
+    "difference-title": "Нұсқалар арасындағы айырмашылық: <<$1>>",
     "difference-title-multipage": "\"$1\" және \"$2\" беттерінің арасындағы айырмашылық",
     "difference-multipage": "(Беттер арасындағы айырмашылық)",
     "lineno": "Жол нөмірі $1:",
     "showhideselectedversions": "Бөлектенген нұсқаларды көрсет/жасыр",
     "editundo": "жоққа шығару",
     "diff-empty": "(айырмашылығы жоқ)",
-    "diff-multi-sameuser": "(Ð\96оғарыда көрсетілген қатысушының (бір ғана қатысушының) арадағы {{PLURAL:$1|бір түзетуі|$1 түзетуі}} көрсетілмеген)",
+    "diff-multi-sameuser": "(Ð\9eÒ£ Ð¶Ð°Ò\9b Ð¶оғарыда көрсетілген қатысушының (бір ғана қатысушының) арадағы {{PLURAL:$1|бір түзетуі|$1 түзетуі}} көрсетілмеген)",
     "diff-multi-otherusers": "({{PLURAL:$2|басқа бір қатысуышының|$2 қатысушының}} арадағы {{PLURAL:$1|бір түзетуі|$1 түзетуі}} көрсетілмеген)",
     "diff-multi-manyusers": "($2-(ден<sup>4</sup>) көп {{PLURAL:$2|қатысуышының|қатысушының}} арадағы {{PLURAL:$1|бір түзетуі|$1 түзетуі}} көрсетілмеген)",
     "difference-missing-revision": "Бұл ($1) {{PLURAL:$2|нұсқа|$2 нұсқалар}} айырмашылығы табылмады.\n\n\nБұл әлте жойылған беттің нұсқалар айырмашылығының сілтемесі.\nЕгжей-тегжейін [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} жою журналынан] таба аласыз.",
     "search-error": "Іздеген кезде қате кездесті: $1",
     "preferences": "Баптаулар",
     "mypreferences": "Баптаулар",
-    "prefs-edits": "Өңдеме саны:",
+    "prefs-edits": "Өңдеме саныңыз:",
     "prefsnologintext2": "Баптауларыңызды өзгерту үшін $1.",
     "prefs-skin": "Мәнерлер",
     "skin-preview": "Қарап шығу",
     "datedefault": "Еш қалаусыз",
-    "prefs-beta": "Beta мүмкіндік",
-    "prefs-datetime": "Уақыт",
     "prefs-labs": "Тәжірибелік мүмкіндіктер",
     "prefs-user-pages": "Қатысушы беттері",
     "prefs-personal": "Жеке деректері",
     "prefs-common-css-js": "Барлық skin-дер үшін CSS/JavaScript бөлісілді:",
     "prefs-emailconfirm-label": "Е-поштаның расталуы:",
     "youremail": "Е-поштаңыз:",
-    "username": "{{GENDER:$1|Қатысушы аты}}:",
+    "username": "{{GENDER:$1|Қатысушы атыңыз}}:",
     "uid": "{{GENDER:$1|Қатысушы}} теңдестіргішіңіз (ID):",
     "prefs-memberingroups": "{{GENDER:$2|Мүше}}  {{PLURAL:$1|тобыңыз|топтарыңыз}}:",
-    "prefs-registration": "Тіркелу уақыты:",
+    "prefs-registration": "Тіркелген уақытыңыз:",
     "yourrealname": "Нақты атыңыз:",
     "yourlanguage": "Тіліңіз:",
     "yourvariant": "Жазба тілінің нұсқалары:",
     "prefs-help-gender": "Бұл баптауды орнату міндетті емес.\nБағдарламалық жасақтама жынысыңызға сәйкес хабарларды көрсетуге қолданылады.\nБұл мағлұмат баршаға мәлім болады.",
     "email": "Е-поштаңыз",
     "prefs-help-realname": "Нақты атыңыз міндетті емес.\nЕгер бұны жетістіруді таңдасаңыз, бұл түзетуіңіздің ауторлығын анықтау үшін қолданылады.",
-    "prefs-help-email": "Электронды поштаңыздың мекенжайын көрсету міндетті емес, бірақ құпия сөзіңізді ұмытқан жағдайда керек болады.",
-    "prefs-help-email-others": "Кейде қатысушы немесе талқылау бетіңізге е-пошта мекенжайы сілтемесін көрсету арқылы басқалармен байланыса аласыз.\nЕ-пошта мекенжайыныңыз басқа қатысушылар сізбен байланысқан кезде көрсетілмейді",
+    "prefs-help-email": "Электронды поштаңыздың мекенжайын көрсету міндетті емес, бірақ құпия сөзіңізді ұмытқан жағдайда құпия сөзді қалпына келтіру үшін керек болады.",
+    "prefs-help-email-others": "Кейде қатысушы немесе талқылау бетіңізге е-пошта мекенжайы сілтемесін көрсету арқылы басқалармен байланыса аласыз.\nЕ-пошта мекенжайыныңыз басқа қатысушылар сізбен байланысқан кезде көрсетілмейді.",
     "prefs-help-email-required": "Е-пошта мекенжайы керек.",
     "prefs-info": "Негізгі мәлімет",
     "prefs-i18n": "Тіл туралы мәлімет",
     "rcshowhidemine-show": "көрсету",
     "rcshowhidemine-hide": "жасыру",
     "rclinks": "Соңғы $2 күнде болған, соңғы $1 өзгерісті көрсет<br />$3",
-    "diff": "айырм.",
+    "diff": "айырм",
     "hist": "тарихы",
     "hide": "жасыру",
     "show": "көрсету",
     "upload-permitted": "Рұқсат етілген файл түрлері: $1.",
     "upload-preferred": "Ұнамды файл түрлері $1.",
     "upload-prohibited": "Рұқсат етілмеген файл түрлері: $1.",
-    "uploadlog": "жүктеу журналы",
     "uploadlogpage": "Жүктеу журналы",
     "uploadlogpagetext": "Төменде ең соңғы жүктелген файлдар тізімі.\nТағы көрнекі қарап шығу үшін [[Special:NewFiles|жаңа файлдар көрмесі]] дегенді қараңыз.",
     "filename": "Файл атауы",
     "filereuploadsummary": "Файлдағы өзгерістер",
     "filestatus": "Ауторлық құқықтар күйі:",
     "filesource": "Қайнар көзі:",
-    "uploadedfiles": "Жүктелген файлдар",
     "ignorewarning": "Ескетуді елеме де файлды қалайда сақта.",
     "ignorewarnings": "Ескертулерді елемеу",
     "minlength1": "Файл атауында ең кемінде бір әріп болуы жөн.",
     "overwroteimage": "«[[$1]]» деген файлдың жаңа нұсқасын жүктеді",
     "uploaddisabled": "Жүктеу өшірілген",
     "copyuploaddisabled": "URL арқылы жүктеу өшірілген.",
-    "uploadfromurl-queued": "Сіздің жүктеулеріңіз кезекте тұр.",
     "uploaddisabledtext": "Файл жүктеу өшірілген.",
     "uploadscripted": "Бұл файлда веб шолғышты қателікпен талдатқызатын HTML не әмір коды бар.",
     "uploadvirus": "Бұл файлда вирус бар! Егжей-тегжейлері: $1",
     "upload-misc-error": "Жүктеу кезіндегі белгісіз қате",
     "upload-misc-error-text": "Жүктеу кезінде белгісіз қатеге ұшырасты.\nURL жарамды және қатынаулы екенін тексеріп шығыңыз да қайта байқап көріңіз.\nЕгер бұл мәселе әлде де қалса, [[Special:ListUsers/sysop|жүйе әкімшімен]] қатынасыңыз.",
     "upload-too-many-redirects": "URL шектен тыс жылжытуларға ие",
-    "upload-unknown-size": "Белгісіз өлшем",
+    "backend-fail-notexists": "$1 файлы бар емес.",
     "backend-fail-delete": "«$1» файлы жойылмайды.",
     "backend-fail-describe": "\"$1\" файлы үшін метадерегі өзгертілмейді.",
     "backend-fail-alreadyexists": "\"$1\" файлы бұрыннан бар.",
     "filehist-dimensions": "Өлшемдері",
     "filehist-filesize": "Файл өлшемі",
     "filehist-comment": "Пікір",
-    "filehist-missing": "Жоғалған файл",
     "imagelinks": "Файл қолданылуы",
     "linkstoimage": "Бұл файлға келесі {{PLURAL:$1|беттер|$1 бет}} сілтейді:",
     "nolinkstoimage": "Бұл файлға еш бет сілтемейді.",
     "nviews": "$1 {{PLURAL:$1|қаралу|қаралу}}",
     "nimagelinks": "$1 {{PLURAL:$1|бетінде|беттерінде}} қолданылады",
     "ntransclusions": "$1 {{PLURAL:$1|бетінде|беттерінде}} қолданылады",
-    "specialpage-empty": "Бұл баянатқа еш нәтиже жоқ.",
+    "specialpage-empty": "Бұл сұраныс бойынша нәтиже жоқ.",
     "lonelypages": "Еш беттен сілтелмеген беттер",
     "lonelypagestext": "Келесі беттерге {{SITENAME}} жобасындағы басқа беттерінің ішіндегі кірікбеттер сілтемейді.",
     "uncategorizedpages": "Санатсыз беттер",
     "emailuser-title-notarget": "Қатысушы е-поштасы",
     "emailpage": "Қатысушыға хат жазу",
     "emailpagetext": "Төмендегі пішін арқылы бұл {{GENDER:$1|қатысушыға}} е-пошта хабарламасын жөнелтуге болады.\n[[Special:Preferences|Қатысушы баптауыңызда]] енгізген е-пошта мекенжайыңыз «Кімнен» деген бас жолағында көрінеді, сондықтан хат алушысы тура жауап бере алады.",
-    "usermailererror": "Mail нысаны қате қайтарды:",
     "defemailsubject": "\"$1\" есімді қатысушының {{SITENAME}} е-поштасының хаты",
     "usermaildisabled": "Қатысушының электронды поштасы қосылмаған",
     "usermaildisabledtext": "Бұл уикиде басқа қатысушыларға хат жібере алмайсыз",
     "nowatchlist": "Бақылау тізіміңізде еш дана жоқ",
     "watchlistanontext": "Бақылау тізіміңіздегі даналарды қарау не өңдеу үшін $1.",
     "watchnologin": "Кірмегенсіз",
-    "watchnologintext": "Бақылау тізіміңізді өзгерту үшін [[Special:UserLogin|кіріңіз]].",
     "addwatch": "Бақылау тізіміңізге қосу",
     "addedwatchtext": "«[[:$1]]» беті [[Special:Watchlist|бақылау тізіміңізге]] қосылды.\nБұл беттің және байланысты талқылау бетінің келешектегі өзгерістері мында тізімделінеді де, және беттің атауы жеңіл табылу үшін [[{{#special:Recentchanges}}|жуықтағы өзгерістер тізімінде]] '''жуан әрпімен''' көрсетіледі.",
     "removewatch": "Бақылау тізіміңізден аластату",
     "watchlist-options": "Бақылау тізімінің баптаулары",
     "watching": "Бақылауда…",
     "unwatching": "Бақыламауда…",
-    "enotif_mailer": "{{SITENAME}} ескерту хат жіберу қызметі",
     "enotif_reset": "Барлық бет келіп-кетілді деп белгіле",
     "enotif_impersonal_salutation": "{{SITENAME}} қатысушысы",
     "enotif_subject_deleted": "{{SITENAME}} $1 бетін $2 қатысушысы {{GENDER:$2|жойған}}",
     "excontent": "болған мағлұматы: '$1'",
     "excontentauthor": "болған мағлұматы (тек \"[[Special:Contributions/$2|$2]]\" үлесі): \"$1\"",
     "exbeforeblank": "тазарту алдындағы болған мағлұматы: \"$1\"",
-    "exblank": "бет бос болды",
     "delete-confirm": "«$1» дегенді жою",
     "delete-legend": "Жою",
     "historywarning": "'''Ескету:'' Жоюы көзделген бетте бет тарихында шамамен $1 {{PLURAL:$1|түзетілуі|түзетілулері}} бар:",
     "viewdeletedpage": "Жойылған беттерді қарау",
     "undeletepagetext": "Келесі {{PLURAL:$1|бет жойылған бірақ|$1 бет жойылған бірақ}} мағлұматы мұрағатта бар\nжәне қалпына келтіруге болады. Мұрағат ұдайы тазаланып тұруы мүмкін.",
     "undelete-fieldset-title": "Нұсқаларды қалпына келтіру",
-    "undeleteextrahelp": "Ð\91үкÑ\96л Ð±ÐµÑ\82Ñ\82Ñ\96 Ò\9bалпÑ\8bна ÐºÐµÐ»Ñ\82Ñ\96Ñ\80Ñ\83 Ò¯Ñ\88Ñ\96н, Ð±Ð°Ñ\80лÑ\8bÒ\9b Ò\9bÒ±Ñ\81белгÑ\96 ÐºÓ©Ð·Ð´ÐµÑ\80дÑ\96 Ð±Ð¾Ñ\81аÑ\82Ñ\8bп '''''{{int:Ò\9aалпÑ\8bна ÐºÐµÐ»Ñ\82Ñ\96Ñ\80!}}''''' Ð±Ð°Ñ\82Ñ\8bÑ\80маÑ\81Ñ\8bн Ð½Ò±Ò\9bÑ\8bÒ£Ñ\8bз.\nÐ\91өлекÑ\82еÑ\83мен Ò\9bалпÑ\8bна ÐºÐµÐ»Ñ\82Ñ\96Ñ\80Ñ\83 Ð¾Ñ\80Ñ\8bндаÑ\83 Ò¯Ñ\88Ñ\96н, ÐºÐµÐ»Ñ\82Ñ\96Ñ\80емÑ\96н Ð´ÐµÐ³ÐµÐ½ Ñ\82үзеÑ\82Ñ\83леÑ\80Ñ\96не Ñ\81Ó\99йкеÑ\81 ÐºÓ©Ð·Ð´ÐµÑ\80ге Ò\9bÒ±Ñ\81белгÑ\96 Ñ\81алÑ\8bÒ£Ñ\8bз Ð´Ð°, Ð¶Ó\99не '''''{{int:Ò\9aалпÑ\8bна ÐºÐµÐ»Ñ\82Ñ\96Ñ\80!}}''''' Ñ\82үймеÑ\81Ñ\96н Ð½Ò±Ò\9bÑ\8bÒ£Ñ\8bз. '''''Ò\9aайÑ\82а Ò\9bой''''' Ñ\82үймеÑ\81Ñ\96н Ð½Ò±Ò\9bÑ\8bÒ\93анда Ð¼Ó\99ндеме Ð°Ñ\83маÒ\93Ñ\8b Ñ\82азаÑ\80Ñ\82адÑ\8b Ð¶Ó\99не Ð±Ð°Ñ\80лÑ\8bÒ\9b Ò\9bÒ±Ñ\81белгÑ\96 ÐºÓ©Ð·Ð´ÐµÑ\80Ñ\96н Ð±Ð¾Ñ\81аÑ\82адÑ\8b.",
+    "undeleteextrahelp": "ТолÑ\8bÒ\9b Ð±ÐµÑ\82 Ñ\82аÑ\80иÑ\85Ñ\8bн Ò\9bалпÑ\8bна ÐºÐµÐ»Ñ\82Ñ\96Ñ\80Ñ\83 Ò¯Ñ\88Ñ\96н Ð±Ð°Ñ\80лÑ\8bÒ\9b Ò\9bÒ±Ñ\81белгÑ\96 ÐºÓ©Ð·Ð´ÐµÑ\80дÑ\96 Ð±Ð¾Ñ\81аÑ\82Ñ\8bп <strong><em>{{int:undeletebtn}}</em></strong> Ð±Ð°Ñ\82Ñ\8bÑ\80маÑ\81Ñ\8bн Ð½Ò±Ò\9bÑ\8bÒ£Ñ\8bз.\nÐ\91өлекÑ\82еÑ\83мен Ò\9bалпÑ\8bна ÐºÐµÐ»Ñ\82Ñ\96Ñ\80Ñ\83дÑ\96 Ð¾Ñ\80Ñ\8bндаÑ\83 Ò¯Ñ\88Ñ\96н Ò\9bалпÑ\8bна ÐºÐµÐ»Ñ\82Ñ\96Ñ\80Ñ\83 ÐºÐµÑ\80ек Ñ\82үзеÑ\82Ñ\83леÑ\80Ñ\96не Ñ\81Ó\99йкеÑ\81 ÐºÓ©Ð·Ð´ÐµÑ\80ге Ò\9bÒ±Ñ\81белгÑ\96мен Ð±ÐµÐ»Ð³Ñ\96леп <strong><em>{{int:undeletebtn}}</em></strong> Ð±Ð°Ñ\82Ñ\8bÑ\80маÑ\81Ñ\8bн Ð±Ð°Ñ\81Ñ\8bÒ£Ñ\8bз.",
     "undeleterevisions": "$1 түзету мұрағатталды",
     "undeletehistory": "Егер бет мағлұматын қалпына келтірсеңіз, тарихында барлық түзетулер да\nқайтарылады. Егер жоюдан соң дәл солай атауымен жаңа бет басталса, қалпына келтірілген түзетулер\nтарихтың алдында көрсетіледі. Тағы да файл түзетулерін қалпына келтіргенде тиымдары жойылатын ескеріңіз.",
     "undeleterevdel": "Егер бұл үстіңгі бетте аяқталса, не файл түзетуі жарым-жартылай жойылған болса, жою болдырмауы орындалмайды.\nОсындай жағдайларда, ең жаңа жойылған түзетуін алып тастауыңыз не жасыруын болдырмауыңыз жөн.",
     "undeletebtn": "Қалпына келтір!",
     "undeletelink": "қарау/қалпына келтіру",
     "undeleteviewlink": "қарау",
-    "undeleteinvert": "ТаңдалÒ\93андÑ\8b Ð°Ð»Ð¼Ð°Ñ\81Ñ\82ыру",
+    "undeleteinvert": "ТаңдалÒ\93андÑ\8b Ð¶Ð°Ñ\81ыру",
     "undeletecomment": "Себебі:",
     "undeletedrevisions": "{{PLURAL:$1|1 түзету|$1 түзету}} қалпына келтірілді",
     "undeletedrevisions-files": "{{PLURAL:$1|1 түзету|$1 түзету}} және {{PLURAL:$2|1 файл|$2 файл}} қалпына келтірілді",
     "sp-contributions-newbies": "Тек жаңа тіркелгіден жасаған үлестерді көрсет",
     "sp-contributions-newbies-sub": "Жаңа тіркелгендер үшін",
     "sp-contributions-newbies-title": "Жаңа тіркелгендер үшін қатысушы үлестері",
-    "sp-contributions-blocklog": "Ð\91Ò±Ò\93аÑ\82Ñ\82ау журналы",
-    "sp-contributions-deleted": "Қатысушының жойылған үлестері",
+    "sp-contributions-blocklog": "бұÒ\93аÑ\82Ñ\82алу журналы",
+    "sp-contributions-deleted": "жойылған үлесі",
     "sp-contributions-uploads": "жүктеулері",
     "sp-contributions-logs": "журналдары",
     "sp-contributions-talk": "талқылауы",
     "ipblocklist-no-results": "Сұратылған IP мекенжай не қатысушы аты бұғатталған емес.",
     "blocklink": "бұғаттау",
     "unblocklink": "бұғаттамау",
-    "change-blocklink": "Ð\91ұғаттауын өзгерту",
+    "change-blocklink": "бұғаттауын өзгерту",
     "contribslink": "үлесі",
     "emaillink": "хат жіберу",
     "autoblocker": "IP мекенжайыңызды жуықта \"[[User:$1|$1]]\" пайдаланған, сондықтан өздігінен бұғатталған.\n$1 бұғаттауы үшін келтірілген себебі: «''$2''».",
     "movepagetext": "Бетті бүкіл тарихымен қоса жаңа атауға жылжытқалы жатырсыз.\nБеттің бұрыңғы атауы жаңа бетке айдағыш сілтеме ретінде қалады.\nҚаласаңыз, бұрыңғы атауды мегзейтін сілтемелердің автоматты түрде жаңартылуын таңдай аласыз. Бұны таңдамаған жағдайда, [[Special:DoubleRedirects|екі мәрте айдағыш]] не [[Special:BrokenRedirects|сынық айдағыш]] сілтемелер қалып қоймауына көз жеткізіңіз.\nЖылжытудан кейін әр сілтеме өзіне тиісті бетке мегзейтініне жауапты боласыз.\n\nЕгер жылжытайын деп жатқан жаңа атау басқа бетке әлдеқашан берілген болса, жылжыту '''орындалмайды'''. Бұл шара әлдеқашан бар беттің қайта жазылуынан сақтайды. Алайда, егер бет —   бос бет, не өткен тарихы жоқ [[Special:ListRedirects|айдағыш бет]] болса, жылжыту орындалады. Бұл жаңылыс жылжытылған бетті бұрыңғы атауына қайтаруды мүмкін ету үшін жасалған.\n\n\n'''Ескерту!'''\nБұл көп қаралатын бетке тиісті өзгеріс болуы мүмкін;\nілгері басудан бұрын әрекетіңіздің салдарын есепке алуыңызды сұраймыз.",
     "movepagetext-noredirectfixer": "Бетті бүкіл тарихымен қоса жаңа атауға жылжытқалы жатырсыз.\nБеттің бұрыңғы атауы жаңа бетке айдағыш сілтеме ретінде қалады.\n[[Special:DoubleRedirects|Екі мәрте айдағыш]] не [[Special:BrokenRedirects|сынық айдағыш]] сілтемелер қалып қоймауына көз жеткізіңіз.\nЖылжытудан кейін әр сілтеме өзіне тиісті бетке мегзейтініне жауапты боласыз.\n\nЕгер жылжытайын деп жатқан жаңа атау басқа бетке әлдеқашан берілген болса, жылжыту '''орындалмайды'''. Бұл шара әлдеқашан бар беттің қайта жазылуынан сақтайды. Алайда, егер бет —   бос бет, не өткен тарихы жоқ [[Special:ListRedirects|айдағыш бет]] болса, жылжыту орындалады. Бұл жаңылыс жылжытылған бетті бұрыңғы атауына қайтаруды мүмкін ету үшін жасалған.\n\n\n'''Ескерту!'''\nБұл көп қаралатын бетке тиісті өзгеріс болуы мүмкін;\nілгері басудан бұрын әрекетіңіздің салдарын есепке алуыңызды сұраймыз.",
     "movepagetalktext": "Келесі жағдай орын алса, қатысты талқылау беті '''жылжытылмайды''':\n*жаңа атаумен аталатын беттің талқылау беті әлдеқашан бар болған кезде (бұл жағдайда талқылауын қолмен көшіруге болады, бірақ түйіндемесіне қай беттен көшірілгендігін міндетті түрде жазыңыз)\n*төмендегі қорапшадан құсбелгі алынып тасталғанда.\n\nАл мақаланың атауын өзгертем деп мағлұматын қолмен көшіруге болмайды, себебі беттің түзету тарихын өшіреді.",
-    "movearticle": "Ð\90Ò\93Ñ\8bмдаÒ\93Ñ\8b Ð±ÐµÑ\82 Ð°Ñ\82аÑ\83Ñ\8b:",
+    "movearticle": "Ð\91еÑ\82Ñ\82Ñ\96 Ð¶Ñ\8bлжÑ\8bÑ\82Ñ\83:",
     "moveuserpage-warning": "<strong>Ескерту:</strong> Сіз қатысушы бетін жылжытпақшысыз. Назар аударыңыз, қатысушы беті ғана жылжытылуы мүмкін және қатысушы аты <em>өзгертілмейді</em>.",
     "movenologintext": "Бетті жылжыту үшін тіркелген болуыңыз және [[{{#special:UserLogin}}|кіруіңіз]] жөн.",
     "movenotallowed": "{{SITENAME}} жобасында беттерді жылжытуға рұқсатыңыз жоқ.",
     "allmessagesname": "Атауы",
     "allmessagesdefault": "Әдепкі мәтіні",
     "allmessagescurrent": "Ағымдық мәтіні",
-    "allmessagestext": "Мында {{ns:mediawiki}} есім аясында жетімді жүйе хабар тізімі беріледі.\nЕгер әмбебап MediaWiki жерсіндіруге үлес қосқыңыз келсе [https://www.mediawiki.org/wiki/Localisation MediaWiki жерсіндіру бетіне] және [//translatewiki.net translatewiki.net жобасына] барып шығыңыз.",
+    "allmessagestext": "Мында {{ns:mediawiki}} есім аясында жетімді жүйе хабар тізімі беріледі.\nЕгер әмбебап MediaWiki жерсіндіруге үлес қосқыңыз келсе [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation MediaWiki жерсіндіру бетіне] және [//translatewiki.net translatewiki.net жобасына] барып шығыңыз.",
     "allmessagesnotsupportedDB": "'''$wgUseDatabaseMessages''' өшірілген себебінен '''{{#special:AllMessages}}''' беті қолданылмайды.",
     "allmessages-filter-legend": "Сүзгі",
     "allmessages-filter-unmodified": "Өзгертілмегендер",
     "importunknownsource": "Cырттан алынатын қайнар түрі белгісіз",
     "importcantopen": "Сырттан алынатын файл ашылмайды",
     "importbadinterwiki": "Жарамсыз уики-аралық сілтеме",
-    "importnotext": "Бұл бос, немесе мәтіні жоқ",
     "importsuccess": "Сырттан алу аяқталды!",
-    "importhistoryconflict": "Тарихында қақтығысты түзету бар (бұл бет алдында сырттан алынған сияқты)",
     "importnosources": "Уики-апару үшін сырттан алынатын еш қайнар көзі анықталмаған, және тарихын тікелей қотарып беруі өшірілген.",
     "importnofile": "Сырттан алынған файл жүктелген жоқ.",
     "importuploaderrorsize": "Сырттан алынған файлдың жүктелуі сәтсіз өтті. Файл мөлшері рұқсат етілгеннен мөлшерден асады.",
index 44bf836..fb64486 100644 (file)
@@ -1,6 +1,10 @@
 {
     "@metadata": {
-        "authors": []
+        "authors": [
+            "Atabek",
+            "GaiJin",
+            "Kaztrans"
+        ]
     },
     "tog-underline": "Siltemeniñ astın sız:",
     "tog-hideminor": "Jwıqtağı özgeristerden şağın öñdemelerdi jasır",
     "nowatchlist": "Baqılaw tizimiñizde eş dana joq",
     "watchlistanontext": "Baqılaw tizimiñizdegi danalardı qaraw, ne öñdew üşin $1 kerek.",
     "watchnologin": "Kirmegensiz",
-    "watchnologintext": "Baqılaw tizimiñizdi özgertw üşin [[Special:UserLogin|kirwiñiz]] jön.",
     "addedwatchtext": "«[[:$1]]» beti [[{{#special:Watchlist}}|baqılaw tizimiñizge]] üsteldi.\nBul bettiñ jäne baýlanıstı talqılaw betiniñ keleşektegi özgeristeri mında tizimdelinedi de, jäne bettiñ atawı jeñil tabılw üşin [[{{#special:Recentchanges}}|jwıqtağı özgerister tiziminde]] '''jwan ärpimen''' körsetiledi.",
     "removedwatchtext": "«[[:$1]]» beti baqılaw tizimiñizden alastaldı.",
     "watch": "Baqılaw",
     "allmessagesname": "Atawı",
     "allmessagesdefault": "Ädepki mätini",
     "allmessagescurrent": "Ağımdıq mätini",
-    "allmessagestext": "Mında {{ns:mediawiki}} esim ayasında jetimdi jüýe xabar tizimi beriledi.\nEger ämbebap MediaWiki jersindirwge üles qosqıñız kelse [https://www.mediawiki.org/wiki/Localisation MediaWiki jersindirw betine] jäne [//translatewiki.net translatewiki.net jobasına] barıp şığıñız.",
+    "allmessagestext": "Mında {{ns:mediawiki}} esim ayasında jetimdi jüýe xabar tizimi beriledi.\nEger ämbebap MediaWiki jersindirwge üles qosqıñız kelse [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation MediaWiki jersindirw betine] jäne [//translatewiki.net translatewiki.net jobasına] barıp şığıñız.",
     "allmessagesnotsupportedDB": "'''$wgUseDatabaseMessages''' öşirilgen sebebinen '''{{ns:special}}:AllMessages''' beti qoldanılmaýdı.",
     "thumbnail-more": "Ülkeýtw",
     "filemissing": "Joğalğan faýl",
index 20ff74c..b6d6856 100644 (file)
     "currentevents": "Maannakkut pisut",
     "disclaimers": "Aalajangersagaq",
     "edithelp": "Ikiuutit",
-    "helppage": "Help:Ikiuutit",
     "mainpage": "Saqqaa",
     "mainpage-description": "Saqqaa",
     "portal": "Allattartup saqqaa",
index 9e9d026..5f7c521 100644 (file)
@@ -36,7 +36,8 @@
             "Yknok29",
             "לערי ריינהארט",
             "관인생략",
-            "아라"
+            "아라",
+            "Keysuck"
         ]
     },
     "tog-underline": "링크에 밑줄:",
     "faqpage": "Project:FAQ",
     "vector-action-addsection": "새 주제",
     "vector-action-delete": "삭제",
-    "vector-action-move": "ì\9d´ë\8f\99",
+    "vector-action-move": "ì\98®ê¸°ê¸°",
     "vector-action-protect": "보호",
-    "vector-action-undelete": "되살리기",
+    "vector-action-undelete": "삭제 취소",
     "vector-action-unprotect": "보호 설정 바꾸기",
     "vector-view-create": "만들기",
     "vector-view-edit": "편집",
-    "vector-view-history": "역사",
+    "vector-view-history": "역사 보기",
     "vector-view-view": "읽기",
     "vector-view-viewsource": "원본 보기",
     "actions": "행위",
     "print": "인쇄",
     "view": "보기",
     "edit": "편집",
+    "edit-local": "로컬 설명 편집",
     "create": "만들기",
+    "create-local": "로컬 설명 추가",
     "editthispage": "이 문서 편집하기",
     "create-this-page": "이 문서 만들기",
     "delete": "삭제",
     "talkpagelinktext": "토론",
     "specialpage": "특수 문서",
     "personaltools": "개인 도구",
-    "postcomment": "새 주제",
+    "postcomment": "새 문단",
     "articlepage": "문서 보기",
     "talk": "토론",
     "views": "보기",
     "blocked-mailpassword": "당신의 IP 주소는 편집을 할 수 없게 차단되어 있어서 악용하지 못하도록 비밀번호 되살리기 기능 사용이 금지됩니다.",
     "eauthentsent": "입력한 이메일로 확인 이메일을 보냈습니다.\n다른 모든 형태의 이메일을 당신의 계정으로 보내기 전에, 계정이 정말 당신의 것인지 확인하기 위해 이메일 내용의 지시대로 계정 확인 절차를 실행해 주셔야 합니다.",
     "throttled-mailpassword": "비밀번호 재설정 이메일을 이미 최근 {{PLURAL:$1|$1시간}} 안에 보냈습니다.\n악용을 방지하기 위해 비밀번호 재설정 메일은 {{PLURAL:$1|$1시간}}마다 오직 하나씩만 보낼 수 있습니다.",
-    "mailerror": "메일 보내기 오류: $1",
+    "mailerror": "메일을 보내는 중 오류: $1",
     "acct_creation_throttle_hit": "당신의 IP 주소를 이용한 방문자가 이전에 이미 {{PLURAL:$1|계정 $1개}}를 만들어, 계정 만들기 한도를 초과하였습니다.\n따라서 지금은 이 IP 주소로는 더 이상 계정을 만들 수 없습니다.",
     "emailauthenticated": "이메일 주소는 $2 에 $3 에서 인증되었습니다.",
     "emailnotauthenticated": "이메일 주소를 인증하지 않았습니다.\n이메일 확인 절차를 거치지 않으면 다음 이메일 기능을 사용할 수 없습니다.",
     "accountcreatedtext": "[[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|토론]]) 사용자 계정이 만들어졌습니다.",
     "createaccount-title": "{{SITENAME}} 계정 만들기",
     "createaccount-text": "누군가가 {{SITENAME}} ($4)에서 사용자 이름 \"$2\", 비밀번호 \"$3\"로 당신의 이메일 주소가 등록된 계정을 만들었습니다. \n지금 로그인하여 비밀번호를 바꾸십시오.\n\n실수로 계정을 잘못 만들었다면 이 메시지는 무시해도 됩니다.",
-    "usernamehasherror": "사용자 계정 이름에는 해시 문자가 들어갈 수 없습니다",
     "login-throttled": "로그인에 연속으로 실패하였습니다.\n$1 기다렸다가 다시 시도하세요.",
     "login-abort-generic": "로그인에 실패했습니다 - 중지됨",
     "loginlanguagelabel": "언어: $1",
     "resetpass_header": "비밀번호 바꾸기",
     "oldpassword": "이전 비밀번호:",
     "newpassword": "새 비밀번호:",
-    "retypenew": "새 비밀번호 입력:",
+    "retypenew": "새 비밀번호 다시 입력:",
     "resetpass_submit": "비밀번호를 설정하고 로그인하기",
     "changepassword-success": "비밀번호가 성공적으로 바뀌었습니다!",
     "changepassword-throttled": "최근 너무 많이 로그인을 시도했습니다.\n$1 뒤에 다시 시도하세요.",
     "passwordreset-emailsent-capture": "비밀번호 재설정 이메일이 발송되었으며, 아래에 나타나 있습니다.",
     "passwordreset-emailerror-capture": "비밀번호 재설정 이메일이 생성되어 아래에 보여져 있지만, {{GENDER:$2|사용자}}에게 발송하는 데에는 실패했습니다: $1",
     "changeemail": "이메일 주소 바꾸기",
-    "changeemail-header": "계정 메일 주소 바꾸기",
+    "changeemail-header": "계정 메일 주소 바꾸기",
     "changeemail-text": "이메일 주소를 바꾸려면 이 양식을 채우세요. 이 바뀜을 확인하기 위해 비밀번호를 입력해야 합니다.",
     "changeemail-no-info": "이 특수 문서에 직접 접근하려면 반드시 로그인해야 합니다.",
     "changeemail-oldemail": "현재 이메일 주소 :",
     "noarticletext": "이 문서가 현재 존재하지 않습니다.\n이 문서와 제목이 비슷한 문서가 있는지 [[Special:Search/{{PAGENAME}}|검색하거나]],\n이 문서에 관련된 <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} 기록]을 확인하거나,\n문서를 직접 [{{fullurl:{{FULLPAGENAME}}|action=edit}} 편집]</span>할 수 있습니다.",
     "noarticletext-nopermission": "이 문서가 현재 존재하지 않습니다.\n이 문서와 제목이 비슷한 문서가 있는지 [[Special:Search/{{PAGENAME}}|검색하거나]], 이 문서에 관련된 <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} 기록]을 확인할 수 있습니다.</span> 그러나 이 문서를 만들 수 있는 권한은 없습니다.",
     "missing-revision": "\"{{FULLPAGENAME}}\"이라는 문서의 #$1판이 존재하지 않습니다.\n\n이 문제는 주로 삭제된 문서를 가리키는 오래된 문서 역사 링크로 인해 발생합니다.\n자세한 내용은 [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} 삭제 기록]에서 확인할 수 있습니다.",
-    "userpage-userdoesnotexist": "\"$1\" 계정은 등록되어 있지 않습니다.\n이 문서를 만들거나 편집하려면 계정이 존재 하는지 확인해주세요.",
+    "userpage-userdoesnotexist": "\"$1\" 사용자 계정은 등록되어 있지 않습니다.\n이 문서를 만들거나 편집하려면 계정이 존재하는지 확인해주세요.",
     "userpage-userdoesnotexist-view": "\"$1\" 사용자 계정은 등록되지 않았습니다.",
     "blocked-notice-logextract": "이 사용자는 현재 차단되어 있습니다.\n해당 사용자의 최근 차단 기록을 참고하십시오:",
     "clearyourcache": "'''참고:''' 설정을 저장한 후에 바뀐 점을 확인하기 위해서는 브라우저의 캐시를 새로 고쳐야 합니다.\n* '''파이어폭스 / 사파리''': ''Shift'' 키를 누르면서 새로 고침을 클릭하거나, ''Ctrl-F5'' 또는 ''Ctrl-R'' 을 입력 (Mac에서는 ''⌘-R'')\n* '''구글 크롬''': ''Ctrl-Shift-R''키를 입력 (Mac에서는 ''⌘-Shift-R'')\n* '''인터넷 익스플로러''': ''Ctrl'' 키를 누르면서 새로 고침을 클릭하거나, ''Ctrl-F5''를 입력.\n* '''오페라''': ''도구→설정''에서 캐시를 비움",
     "prefs-skin": "스킨",
     "skin-preview": "미리 보기",
     "datedefault": "기본 값",
-    "prefs-beta": "베타 기능",
-    "prefs-datetime": "날짜와 시각",
     "prefs-labs": "실험 중인 기능",
     "prefs-user-pages": "사용자 문서",
     "prefs-personal": "사용자 정보",
     "right-createtalk": "토론 문서 만들기",
     "right-createaccount": "새 계정 만들기",
     "right-minoredit": "사소한 편집으로 표시",
-    "right-move": "문ì\84\9c ì\9d´ë\8f\99",
-    "right-move-subpages": "문ì\84\9cì\99\80 í\95\98ì\9c\84 ë¬¸ì\84\9c ì\9d´ë\8f\99í\95\98기",
-    "right-move-rootuserpages": "ìµ\9cì\83\81ì\9c\84 ì\82¬ì\9a©ì\9e\90 ë¬¸ì\84\9c ì\9d´ë\8f\99",
+    "right-move": "문ì\84\9c ì\98®ê¸°ê¸°",
+    "right-move-subpages": "문ì\84\9cì\99\80 í\95\98ì\9c\84 ë¬¸ì\84\9c ì\98®ê¸°기",
+    "right-move-rootuserpages": "ìµ\9cì\83\81ì\9c\84 ì\82¬ì\9a©ì\9e\90 ë¬¸ì\84\9c ì\98®ê¸°ê¸°",
     "right-movefile": "파일 옮기기",
     "right-suppressredirect": "문서을 옮길 때 원래 문서 이름으로 된 넘겨주기를 만들지 않기",
     "right-upload": "파일 올리기",
     "right-override-export-depth": "5단계로 링크된 문서를 포함하여 문서를 내보내기",
     "right-sendemail": "다른 사용자에게 이메일 보내기",
     "right-passwordreset": "비밀번호 재설정 이메일을 보기",
-    "newuserlogpage": "ì\82¬ì\9a©ì\9e\90 ë\93±ë¡\9d 기록",
-    "newuserlogpagetext": "사용자 등록 기록입니다.",
+    "newuserlogpage": "ì\82¬ì\9a©ì\9e\90 ë§\8cë\93¤ê¸° 기록",
+    "newuserlogpagetext": "사용자가 만들어진 기록입니다.",
     "rightslog": "사용자 권한 기록",
     "rightslogtext": "사용자 권한 조정 기록입니다.",
     "action-read": "이 문서를 읽기",
     "upload-permitted": "허용하는 파일 확장자: $1",
     "upload-preferred": "권장하는 파일 확장자: $1",
     "upload-prohibited": "금지하는 파일 확장자: $1",
-    "uploadlog": "올리기 기록",
     "uploadlogpage": "올리기 기록",
     "uploadlogpagetext": "최근 올라온 파일 목록입니다.\n갤러리 형식으로 확인하고 싶으시다면 [[Special:NewFiles|새 파일 목록]]을 보세요.",
     "filename": "파일 이름",
-    "filedesc": "파일의 설명",
+    "filedesc": "요약",
     "fileuploadsummary": "요약:",
     "filereuploadsummary": "파일의 바뀜:",
     "filestatus": "저작권 상태:",
     "filesource": "출처:",
-    "uploadedfiles": "파일 올리기",
     "ignorewarning": "경고를 무시하고 파일 저장",
     "ignorewarnings": "모든 경고 무시하기",
     "minlength1": "파일 이름은 적어도 1글자 이상이어야 합니다.",
     "fileexists": "같은 이름의 파일이 이미 있습니다. 파일을 바꾸고 싶지 않다면 <strong>[[:$1]]</strong> 파일을 확인해 주세요.\n[[$1|thumb]]",
     "filepageexists": "이 파일의 설명 문서가 <strong>[[:$1]]</strong>에 존재하지만, 이 이름을 가진 파일이 존재하지 않습니다.\n입력한 설명은 설명 문서에 반영되지 않을 것입니다.\n설명을 반영시키려면, 직접 편집하셔야 합니다.\n[[$1|thumb]]",
     "fileexists-extension": "비슷한 이름의 파일이 존재합니다: [[$2|thumb]]\n* 올리려는 파일 이름: <strong>[[:$1]]</strong>\n* 존재하는 파일 이름: <strong>[[:$2]]</strong>\n다른 이름으로 선택하세요.",
-    "fileexists-thumbnail-yes": "이 파일은 원본 그림이 아닌, 다른 그림의 크기를 줄인 섬네일 파일인 것 같습니다.\n[[$1|thumb]]\n<strong>[[:$1]]</strong> 파일을 확인하세요.\n해당 파일이 현재 올리려는 파일과 같다면 더 작은 크기의 그림을 올릴 필요는 없습니다.",
-    "file-thumbnail-no": "파일 이름이 <strong>$1</strong>으로 시작합니다.\n이 파일은 원본 그림이 아닌, 다른 그림의 크기를 줄인 섬네일 파일인 것 같습니다.\n더 해상도가 좋은 파일이 있다면 그 파일을 올리거나 아니면 올리려는 파일 이름을 바꾸세요.",
+    "fileexists-thumbnail-yes": "파일은 그림의 크기를 줄인 (섬네일) 파일인 것 같습니다.\n[[$1|thumb]]\n<strong>[[:$1]]</strong> 파일을 확인하세요.\n해당 파일이 현재 올리려는 파일과 같다면 더 작은 크기의 그림을 올릴 필요는 없습니다.",
+    "file-thumbnail-no": "파일 이름이 <strong>$1</strong>으로 시작합니다.\n이 파일은 그림의 크기를 줄인 (섬네일) 파일인 것 같습니다.\n더 해상도가 좋은 파일이 있다면 그 파일을 올리거나 아니면 올리려는 파일 이름을 바꾸세요.",
     "fileexists-forbidden": "같은 이름의 파일이 이미 있고, 덮어쓸 수 없습니다.\n그래도 파일을 올리시려면, 뒤로 돌아가서 다른 이름으로 시도해 주시기 바랍니다.\n[[File:$1|thumb|center|$1]]",
     "fileexists-shared-forbidden": "같은 이름의 파일이 이미 위키미디어 공용에 있습니다.\n그래도 파일을 올리려면 뒤로 돌아가서 다른 이름으로 시도해 주시기 바랍니다.\n[[File:$1|thumb|center|$1]]",
     "file-exists-duplicate": "현재 올리고 있는 {{PLURAL:$1|파일}}이 아래 파일과 중복됩니다:",
     "overwroteimage": "사용자가 \"[[$1]]\" 파일의 새 판을 올렸습니다.",
     "uploaddisabled": "올리기 비활성화됨",
     "copyuploaddisabled": "URL로 파일 올리기가 비활성화되어 있습니다.",
-    "uploadfromurl-queued": "올리기 명령이 대기열에 추가됐습니다.",
     "uploaddisabledtext": "파일 올리기 기능이 비활성화되어 있습니다.",
     "php-uploaddisabledtext": "PHP 파일 올리기가 비활성화되었습니다. 파일 올리기 설정을 확인하십시오.",
     "uploadscripted": "이 파일에는 HTML이나 다른 스크립트 코드가 포함되어 있어, 웹 브라우저에서 오류를 일으킬 수 있습니다.",
     "sourceurl": "출처 URL:",
     "destfilename": "파일의 새 이름:",
     "upload-maxfilesize": "파일의 최대 크기: $1",
-    "upload-description": "파일 설명",
+    "upload-description": "파일 설명",
     "upload-options": "올리기 설정",
     "watchthisupload": "이 파일 주시하기",
     "filewasdeleted": "같은 이름을 가진 파일이 올라온 적이 있었고 그 후에 삭제되었습니다.\n올리기 전에 $1을 확인해 주시기 바랍니다.",
     "upload-misc-error": "알 수 없는 파일 올리기 오류",
     "upload-misc-error-text": "파일을 올리는 중 알 수 없는 오류가 발생했습니다.\nURL이 올바르고 접근 가능한지를 확인하고 다시 시도하세요.\n문제가 계속되면 [[Special:ListUsers/sysop|관리자]]에게 연락해주세요.",
     "upload-too-many-redirects": "URL이 너무 많은 넘겨주기를 포함하고 있습니다.",
-    "upload-unknown-size": "크기를 알 수 없음",
     "upload-http-error": "HTTP 오류 발생: $1",
     "upload-copy-upload-invalid-domain": "이 도메인에 속하지 않는 웹사이트의 파일을 올릴 수 없습니다.",
     "backend-fail-stream": "\"$1\" 파일을 스트림할 수 없습니다.",
     "img-auth-streaming": "\"$1\" 파일을 전송하는 중입니다.",
     "img-auth-public": "img_auth.php는 개인 위키 파일을 바깥 사이트로 전송하는 기능입니다.\n이 기능은 기본적으로 공개적인 위키에서 사용하도록 설계되어 있습니다.\n보안적인 문제로 기본적으로 img_auth.php 기능은 비활성화되어 있습니다.",
     "img-auth-noread": "\"$1\" 파일을 볼 권한이 없습니다.",
-    "img-auth-bad-query-string": "URL에 잘못된 쿼리 문자열이 있습니다.",
     "http-invalid-url": "잘못된 URL: $1",
     "http-invalid-scheme": "\"$1\"로 시작하는 URL은 지원되지 않습니다.",
     "http-request-error": "알 수 없는 오류로 HTTP 요청에 실패했습니다.",
     "filehist-dimensions": "크기",
     "filehist-filesize": "파일 크기",
     "filehist-comment": "덧글",
-    "filehist-missing": "파일이 없음",
     "imagelinks": "이 파일을 사용하는 문서",
     "linkstoimage": "다음 {{PLURAL:$1|문서 $1개}}가 이 파일을 가리키고 있습니다:",
     "linkstoimage-more": "$1개 이상의 {{PLURAL:$1|문서}}가 이 파일을 가리키고 있습니다.\n다음 목록은 이 파일을 {{PLURAL:$1|가리키는 처음 문서 $1개}}만 보여주고 있습니다.\n이 파일을 가리키는 [[Special:WhatLinksHere/$2|모든 문서 목록]]을 볼 수 있습니다.",
     "nmemberschanged": "$1 → $2{{PLURAL:$2|개}}",
     "nrevisions": "{{PLURAL:$1|판}} $1개",
     "nviews": "$1번 {{PLURAL:$1|읽음}}",
-    "nimagelinks": "{{PLURAL:$1|문서}} $1개에서 사용 중",
-    "ntransclusions": "{{PLURAL:$1|문서}} $1개에서 사용 중",
+    "nimagelinks": "{{PLURAL:$1|문서}} $1개에서 사용",
+    "ntransclusions": "{{PLURAL:$1|문서}} $1개에서 사용",
     "specialpage-empty": "명령에 대한 결과가 없습니다.",
     "lonelypages": "외톨이 문서 목록",
     "lonelypagestext": "{{SITENAME}}에서 다른 모든 문서에서 링크되거나 틀로 포함되지 않은 문서의 목록입니다.",
     "newpages": "새 문서 목록",
     "newpages-username": "사용자 이름:",
     "ancientpages": "오래된 문서 목록",
-    "move": "ì\9d´ë\8f\99",
-    "movethispage": "문서 이동하기",
+    "move": "ì\98®ê¸°ê¸°",
+    "movethispage": "이 문서 옮기기",
     "unusedimagestext": "다음은 어떠한 문서도 사용하지 않는 파일의 목록입니다.\n다른 사이트에서 URL 접근을 통해 파일을 사용할 수 있기 때문에, 아래 목록에 있는 파일도 실제로 사용 중일 가능성이 있다는 점을 주의해주세요.",
     "unusedcategoriestext": "사용하지 않는 분류 문서의 목록입니다.",
     "notargettitle": "해당하는 문서 없음",
     "allpagesbadtitle": "주어진 문서 제목이 잘못되었거나 다른 사이트로 연결되는 인터위키가 있습니다.\n문서 제목에 사용할 수 없는 문자를 사용했을 수 있습니다.",
     "allpages-bad-ns": "{{SITENAME}}에서는 \"$1\" 이름공간을 사용하지 않습니다.",
     "allpages-hide-redirects": "넘겨주기 숨기기",
-    "cachedspecial-viewing-cached-ttl": "ì§\80ê¸\88 ì\9d´ ë¬¸ì\84\9cì\9d\98 ìº\90ì\8b\9cë\90\9c ë²\84ì \84ì\9d\84 ë³´ê³  ì\9e\88ì\8aµë\8b\88ë\8b¤. ì\9d´ ë²\84ì \84ì\9d\80 ìµ\9cë\8c\80 $1ë§\8cí\81¼ ì§\80ë\82\9c ë²\84ì \84ì\9d¼ ê°\80ë\8a¥ì\84±ì\9d´ 있습니다.",
+    "cachedspecial-viewing-cached-ttl": "ì\9d´ ë¬¸ì\84\9cì\9d\98 ìº\90ì\8b\9cë\90\9c í\8c\90ì\9d\84 ë³´ê³  ì\9e\88ì\9c¼ë©°, ìµ\9cë\8c\80 $1ë§\8cí\81¼ ì§\80ë\82\9c í\8c\90ì\9d¼ ì\88\98 ì\9d¼ ì\88\98 있습니다.",
     "cachedspecial-viewing-cached-ts": "현재 이 문서는 캐시 처리된 버전으로 현재 문서 상태를 반영하지 않을 수도 있습니다.",
     "cachedspecial-refresh-now": "최신 버전 보기.",
     "categories": "분류 목록",
     "listgrouprights-removegroup-self": "자신에게서 다음 {{PLURAL:$2|권한}}을 해제: $1",
     "listgrouprights-addgroup-self-all": "자신에게 모든 권한을 부여",
     "listgrouprights-removegroup-self-all": "자신의 계정에서 모든 권한을 해제",
+    "trackingcategories-name": "메시지 이름",
     "mailnologin": "보낼 이메일 주소가 없음",
     "mailnologintext": "다른 사용자에게 이메일을 보내려면 [[Special:UserLogin|로그인]]한 다음 [[Special:Preferences|사용자 환경 설정]]에서 자신의 이메일 주소를 저장해야 합니다.",
     "emailuser": "이메일 보내기",
     "emailuser-title-notarget": "사용자에게 이메일 보내기",
     "emailpage": "사용자에게 이메일 보내기",
     "emailpagetext": "이 {{GENDER:$1|사용자}}가 환경 설정에 올바른 이메일 주소를 적었다면, 아래 양식을 통해 이메일을 보낼 수 있습니다.\n이메일을 받은 사용자가 바로 답장할 수 있도록 하기 위해 [[Special:Preferences|사용자 환경 설정]]에 적은 이메일 주소가 \"보내는 사람\" 정보에 들어갑니다. 따라서 받는 사람이 당신에게 직접 답장을 보낼 수 있습니다.",
-    "usermailererror": "메일 개체에서 오류 발생:",
     "defemailsubject": "\"$1\" 사용자가 보낸 {{SITENAME}} 이메일",
     "usermaildisabled": "사용자 이메일 비활성화됨",
     "usermaildisabledtext": "이 위키에서 다른 사용자에게 메일을 보낼 수 없습니다",
     "noemailtitle": "이메일 주소 없음",
     "noemailtext": "이 사용자는 올바른 이메일 주소를 입력하지 않았습니다.",
-    "nowikiemailtitle": "이메일이 허용되지 않음",
     "nowikiemailtext": "이 사용자는 다른 사용자로부터의 이메일을 받지 않도록 설정하였습니다.",
     "emailnotarget": "없는 사용자를 받는 이로 지정하였거나 사용자 이름이 잘못되었습니다.",
     "emailtarget": "받는 사용자 이름 입력",
     "emailmessage": "내용:",
     "emailsend": "보내기",
     "emailccme": "사본을 내 이메일로도 보내기",
-    "emailccsubject": "$1ì\97\90ê²\8c ë³´ë\82¸ ë©\94ì\9d¼ 사본: $2",
+    "emailccsubject": "$1ì\97\90ê²\8c ë³´ë\82¸ ë©\94ì\8b\9cì§\80ì\9d\98 ë³µ사본: $2",
     "emailsent": "이메일 보냄",
     "emailsenttext": "이메일을 보냈습니다.",
     "emailuserfooter": "이 이메일은 {{SITENAME}}의 $1 사용자가 $2 사용자에게 \"이메일 보내기\" 기능을 통해 보냈습니다.",
     "nowatchlist": "주시하는 문서가 아직 없습니다.",
     "watchlistanontext": "주시문서 목록을 보거나 고치려면 $1 하세요.",
     "watchnologin": "로그인하지 않음",
-    "watchnologintext": "주시문서 목록을 고치려면 [[Special:UserLogin|로그인]]해야 합니다.",
     "addwatch": "주시문서 목록에 추가",
     "addedwatchtext": "\"[[:$1]]\" 문서를 [[Special:Watchlist|주시문서 목록]]에 추가했습니다.\n앞으로 이 문서나 관련된 토론 문서가 바뀌면 보일 것입니다.",
     "removewatch": "주시문서 목록에서 제거",
     "watching": "주시 추가 중…",
     "unwatching": "주시 해제 중…",
     "watcherrortext": "\"$1\" 문서에 대한 주시 여부를 바꾸는 중 오류가 발생했습니다.",
-    "enotif_mailer": "{{SITENAME}} 자동 알림 메일",
     "enotif_reset": "모든 문서를 방문한 것으로 표시하기",
     "enotif_impersonal_salutation": "{{SITENAME}} 사용자",
     "enotif_subject_deleted": "{{SITENAME}} $1 문서를 $2 사용자가 {{GENDER:$2|삭제했습니다}}",
     "excontent": "내용: \"$1\"",
     "excontentauthor": "내용: \"$1\" (유일한 편집자는 \"[[Special:Contributions/$2|$2]]\")",
     "exbeforeblank": "비우기 전의 내용: \"$1\"",
-    "exblank": "빈 문서",
     "delete-confirm": "\"$1\" 삭제",
     "delete-legend": "삭제",
     "historywarning": "'''경고:''' 삭제하려는 문서에 이전 {{PLURAL:$1|편집 역사}} 약 $1개가 있습니다:",
     "maximum-size": "최대 크기:",
     "pagesize": "(바이트)",
     "restriction-edit": "편집",
-    "restriction-move": "ì\9d´ë\8f\99",
+    "restriction-move": "ì\98®ê¸°ê¸°",
     "restriction-create": "만들기",
     "restriction-upload": "올리기",
     "restriction-level-sysop": "보호됨",
     "sp-contributions-newbies-sub": "새 사용자의 기여",
     "sp-contributions-newbies-title": "새 사용자의 기여",
     "sp-contributions-blocklog": "차단 기록",
+    "sp-contributions-suppresslog": "삭제된 사용자 기여",
     "sp-contributions-deleted": "삭제된 기여 목록",
     "sp-contributions-uploads": "올린 파일",
     "sp-contributions-logs": "기록",
     "sp-contributions-blocked-notice": "이 사용자는 현재 차단되어 있습니다.\n해당 사용자의 차단 기록은 다음과 같습니다:",
     "sp-contributions-blocked-notice-anon": "이 IP 주소는 현재 차단되어 있습니다.\n차단 기록은 다음과 같습니다:",
     "sp-contributions-search": "기여 검색",
-    "sp-contributions-suppresslog": "삭제된 사용자 기여",
     "sp-contributions-username": "IP 주소 또는 사용자 이름:",
     "sp-contributions-toponly": "최신판만 보기",
     "sp-contributions-newonly": "새 글인 기여만 보기",
     "nolinkshere-ns": "선택한 이름공간에는 '''[[:$1]]''' 문서를 가리키는 문서가 없습니다.",
     "isredirect": "넘겨주기 문서",
     "istemplate": "끼워넣기",
-    "isimage": "파일 사용 중",
+    "isimage": "연결된 파일",
     "whatlinkshere-prev": "{{PLURAL:$1|이전|이전 $1개}}",
     "whatlinkshere-next": "{{PLURAL:$1|다음|다음 $1개}}",
     "whatlinkshere-links": "← 가리키는 문서 목록",
     "lockfilenotwritable": "데이터베이스 잠금 파일에 쓰기 권한이 없습니다.\n데이터베이스를 잠그거나 잠금 해제하려면, 웹 서버에서 이 파일의 쓰기 권한을 설정해야 합니다.",
     "databasenotlocked": "데이터베이스가 잠겨 있지 않습니다.",
     "lockedbyandtime": "({{GENDER:$1|$1}} 사용자가 $2 $3에 잠금)",
-    "move-page": "$1 ì\9d´ë\8f\99",
-    "move-page-legend": "문ì\84\9c ì\9d´ë\8f\99í\95\98기",
+    "move-page": "$1 ì\98®ê¸°ê¸°",
+    "move-page-legend": "문ì\84\9c ì\98®ê¸°기",
     "movepagetext": "아래 양식을 채워 문서의 이름을 바꾸고 모든 역사를 새 이름으로 된 문서로 옮길 수 있습니다.\n원래의 문서는 새 문서로 넘겨주는 링크로만 남게 되고,\n원래 이름을 가리키는 넘겨주기는 자동으로 갱신됩니다.\n만약 이 설정을 선택하지 않았다면 [[Special:DoubleRedirects|이중 넘겨주기]]와 [[Special:BrokenRedirects|끊긴 넘겨주기]]를 확인해주세요.\n당신은 링크와 가리키는 대상이 서로 일치하도록 해야 하는 책임을 집니다.\n\n만약 이미 있는 문서의 이름을 새 이름으로 입력했을 때는 그 문서가 넘겨주기 문서이고 문서 역사가 없어야만 이동이 됩니다. 그렇지 않을 경우에는 이동되지 '''않습니다'''.\n이것은 실수로 이동한 문서를 되돌릴 수는 있지만, 이미 존재하는 문서 위에 덮어씌울 수는 없다는 것을 의미합니다.\n\n'''주의!'''\n자주 사용하는 문서를 이동하면 해결하기 어려운 문제를 일으킬 수도 있습니다.\n이동하기 전에 반드시 이 문서를 이동해도 문제가 없는지 확인해주세요.",
     "movepagetext-noredirectfixer": "아래 양식을 채워 문서의 이름을 바꾸고 모든 역사를 새 이름으로 된 문서로 옮길 수 있습니다.\n원래의 문서는 새 문서로 넘겨주는 링크로만 남게 됩니다.\n[[Special:DoubleRedirects|이중 넘겨주기]]와 [[Special:BrokenRedirects|끊긴 넘겨주기]]를 확인해주세요.\n당신은 링크와 가리키는 대상이 서로 일치하도록 해야 하는 책임을 집니다.\n\n만약 이미 있는 문서의 이름을 새 이름으로 입력했을 때는 그 문서가 넘겨주기 문서이고 문서 역사가 없어야만 이동이 됩니다. 그렇지 않을 경우에는 이동되지 '''않습니다'''.\n이것은 실수로 이동한 문서를 되돌릴 수는 있지만, 이미 존재하는 문서 위에 덮어씌울 수는 없다는 것을 의미합니다.\n\n'''주의!'''\n자주 사용하는 문서를 이동하면 해결하기 어려운 문제를 일으킬 수도 있습니다.\n이동하기 전에 반드시 이 문서를 이동해도 문제가 없는지 확인해주세요.",
     "movepagetalktext": "딸린 토론 문서도 자동으로 이동합니다. 하지만 다음의 경우는 '''이동하지 않습니다''':\n* 이동할 이름으로 된 문서가 이미 있는 경우\n* 아래의 선택을 해제하는 경우\n\n이 경우에는 문서를 직접 이동하거나 두 문서를 합쳐야 합니다.",
-    "movearticle": "문ì\84\9c ì\9d´ë\8f\99í\95\98기",
+    "movearticle": "문ì\84\9c ì\98®ê¸°ê¸°:",
     "moveuserpage-warning": "'''경고:''' 사용자 문서를 옮기려 하고 있습니다. 사용자 문서만 이동되며 사용자 이름이 바뀌지 '''않는다'''는 점을 참고하세요.",
     "movenologintext": "문서를 이동하려면 [[Special:UserLogin|로그인]]해야 합니다.",
     "movenotallowed": "문서를 옮길 권한이 없습니다.",
     "movenotallowedfile": "파일을 옮길 권한이 없습니다.",
     "cant-move-user-page": "사용자 문서를 옮길 권한이 없습니다(하위 문서는 예외).",
     "cant-move-to-user-page": "문서를 사용자 문서로 옮길 권한이 없습니다(하위 문서는 예외).",
-    "newtitle": "새 문서 이름",
-    "move-watch": "ì\9b\90본 문서와 대상 문서를 주시하기",
-    "movepagebtn": "이동",
+    "newtitle": "새 제목:",
+    "move-watch": "ì\9b\90ë\9e\98 문서와 대상 문서를 주시하기",
+    "movepagebtn": "문서 옮기기",
     "pagemovedsub": "옮기기 성공",
     "movepage-moved": "'''\"$1\" 문서를 \"$2\" 문서로 옮겼습니다.'''",
     "movepage-moved-redirect": "넘겨주기 문서를 만들었습니다.",
     "movepage-moved-noredirect": "넘겨주기 문서를 남기지 않았습니다.",
     "articleexists": "문서가 이미 존재하거나 이름이 올바르지 않습니다.\n다른 이름을 선택하세요.",
     "cantmove-titleprotected": "새로운 제목으로 문서를 만드는 것이 금지되어 있어 문서를 옮길 수 없습니다",
-    "movetalk": "딸린 토론도 함께 이동합니다.",
-    "move-subpages": "하위 문서도 함께 ($1개 이하) 이동합니다.",
-    "move-talk-subpages": "토론 문서의 하위 문서도 ($1개까지) 함께 이동합니다.",
+    "movetalk": "딸린 토론 문서도 옮기기",
+    "move-subpages": "하위 문서도 옮기기 ($1개까지)",
+    "move-talk-subpages": "토론 문서의 하위 문서도 옮기기 ($1개까지)",
     "movepage-page-exists": "$1 문서가 이미 존재하므로 자동으로 덮어쓸 수 없습니다.",
     "movepage-page-moved": "\"$1\" 문서를 \"$2\" 문서로 옮겼습니다.",
     "movepage-page-unmoved": "$1 문서를 $2 문서로 옮길 수 없습니다.",
     "movepage-max-pages": "{{PLURAL:$1|문서}}를 최대 $1개 옮겼으며 나머지 문서는 자동으로 옮기지 않습니다.",
-    "movelogpage": "ì\9d´ë\8f\99 기록",
-    "movelogpagetext": "ì\95\84ë\9e\98ë\8a\94 ì\9d´ë\8f\99í\95\9c 문서의 목록입니다.",
+    "movelogpage": "ì\98®ê¸°ê¸° 기록",
+    "movelogpagetext": "ì\95\84ë\9e\98ë\8a\94 ì\98®ê²¨ì§\84 ëª¨ë\93  문서의 목록입니다.",
     "movesubpage": "{{PLURAL:$1|하위 문서}}",
     "movesubpagetext": "이 문서에는 다음 {{PLURAL:$1|하위 문서}} $1개가 있습니다.",
     "movenosubpage": "이 문서에는 하위 문서가 존재하지 않습니다.",
     "movereason": "이유:",
     "revertmove": "되돌리기",
-    "delete_and_move": "ì\82­ì \9cí\95\98ê³  ì\9d´ë\8f\99",
+    "delete_and_move": "ì\82­ì \9cí\95\98ê³  ì\98®ê¸°ê¸°",
     "delete_and_move_text": "== 삭제 필요 ==\n이동하려는 제목으로 된 \"[[:$1]]\" 문서가 이미 존재합니다.\n삭제하고 이동할까요?",
     "delete_and_move_confirm": "네. 문서를 삭제합니다",
     "delete_and_move_reason": "\"[[$1]]\"에서 문서를 이동하기 위해 삭제함",
     "nonfile-cannot-move-to-file": "파일이 아닌 문서를 파일 이름공간으로 옮길 수 없습니다.",
     "imagetypemismatch": "새 파일의 확장자가 원래의 확장자와 일치하지 않습니다.",
     "imageinvalidfilename": "새 파일 이름이 잘못되었습니다.",
-    "fix-double-redirects": "기존 이름을 가리키는 넘겨주기를 새로 고침",
-    "move-leave-redirect": "ì\9d´ë\8f\99 í\9b\84 넘겨주기를 남기기",
+    "fix-double-redirects": "원래 제목을 가리키는 넘겨주기를 새로 고침",
+    "move-leave-redirect": "ì\98®ê¸´ ë\92¤ 넘겨주기를 남기기",
     "protectedpagemovewarning": "'''경고:''' 이 문서는 관리자만이 이동할 수 있도록 잠겨 있습니다.\n최근의 기록을 참고용으로 제공합니다:",
     "semiprotectedpagemovewarning": "'''참고:''' 이 문서는 등록된 사용자만이 이동할 수 있도록 잠겨 있습니다.\n최근 기록 내용을 참고용로 제공합니다:",
     "move-over-sharedrepo": "== 파일이 존재함 ==\n[[:$1]] 파일이 공용 저장소에 있습니다. 이 이름으로 파일을 옮기면 공용의 파일을 덮어쓰게 될 것입니다.",
     "allmessagesname": "이름",
     "allmessagesdefault": "기본 메시지 글",
     "allmessagescurrent": "현재 문자열",
-    "allmessagestext": "미디어위키 이름공간에 있는 모든 시스템 메시지의 목록입니다.\n미디어위키의 번역 작업에 관심이 있으면 [https://www.mediawiki.org/wiki/Localisation 미디어위키 지역화]나 [//translatewiki.net translatewiki.net]에 참가해주세요.",
+    "allmessagestext": "미디어위키 이름공간에 있는 모든 시스템 메시지의 목록입니다.\n미디어위키의 번역 작업에 관심이 있으면 [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation 미디어위키 지역화]나 [//translatewiki.net translatewiki.net]에 참가해주세요.",
     "allmessagesnotsupportedDB": "'''$wgUseDatabaseMessages'''가 비활성화되어 있어서 이 문서를 사용할 수 없습니다.",
     "allmessages-filter-legend": "필터",
     "allmessages-filter": "수정 상태로 거르기:",
     "thumbnail_error_remote": "$1에서 반환한 오류 메시지:\n$2",
     "djvu_page_error": "DjVu 페이지 범위 벗어남",
     "djvu_no_xml": "DjVu 파일의 XML 정보를 읽을 수 없음",
-    "thumbnail-temp-create": "임시 섬네일 파일을 만들 수 없습니다.",
+    "thumbnail-temp-create": "임시 섬네일 파일을 만들 수 없습니다",
     "thumbnail-dest-create": "대상 경로에 섬네일을 저장할 수 없습니다.",
-    "thumbnail_invalid_params": "ì\84¬ë\84¤ì\9d¼ ë§¤ê°\9cë³\80ì\88\98ê°\80 ì\9e\98못ë\90\98ì\97\88ì\8aµë\8b\88ë\8b¤.",
+    "thumbnail_invalid_params": "ì\84¬ë\84¤ì\9d¼ ë³\80ì\88\98ê°\80 ì\9e\98못ë\90\98ì\97\88ì\8aµë\8b\88ë\8b¤",
     "thumbnail_dest_directory": "새 목적 디렉터리를 만들 수 없습니다.",
     "thumbnail_image-type": "그림 형식이 지원되지 않습니다",
     "thumbnail_gd-library": "GD 라이브러리 설정이 잘못되었습니다: $1 함수를 찾을 수 없습니다.",
     "importunknownsource": "알 수 없는 가져오기 원본 유형",
     "importcantopen": "파일을 열 수 없습니다.",
     "importbadinterwiki": "인터위키 링크가 잘못되었습니다.",
-    "importnotext": "내용이 없습니다",
     "importsuccess": "가져오기 완료!",
-    "importhistoryconflict": "문서 역사가 충돌하는 판이 있습니다. (이전에 이 문서를 가져온 적이 있을 수도 있습니다)",
     "importnosources": "문서를 가져올 출처가 정의되지 않았고 문서 역사 올리기가 비활성화되었습니다.",
     "importnofile": "가져오기용 파일이 올려지지 않았습니다.",
     "importuploaderrorsize": "파일 올리기를 통한 가져오기에 실패했습니다.\n파일이 허용된 크기 제한보다 큽니다.",
     "tooltip-ca-unprotect": "이 문서의 보호 설정을 바꾸기",
     "tooltip-ca-delete": "문서 삭제하기",
     "tooltip-ca-undelete": "삭제되기 전에 이 문서의 완료한 편집 되살리기",
-    "tooltip-ca-move": "문서 이동하기",
+    "tooltip-ca-move": "이 문서 옮기기",
     "tooltip-ca-watch": "이 문서를 주시문서 목록에 추가",
     "tooltip-ca-unwatch": "이 문서를 주시문서 목록에서 제거",
     "tooltip-search": "{{SITENAME}} 검색",
     "quotation-marks": "“$1”",
     "imgmultipageprev": "← 이전 페이지",
     "imgmultipagenext": "다음 페이지 →",
-    "imgmultigo": "이동!",
+    "imgmultigo": "가기!",
     "imgmultigoto": "$1 페이지로 가기",
     "img-lang-default": "(기본 언어)",
     "img-lang-info": "이 그림을 $1로 렌더합니다. $2",
     "version-entrypoints": "URL 진입점",
     "version-entrypoints-header-entrypoint": "진입점",
     "version-entrypoints-header-url": "URL",
-    "version-entrypoints-articlepath": "[https://www.mediawiki.org/wiki/Manual:$wgArticlePath 문서 경로]",
-    "version-entrypoints-scriptpath": "[https://www.mediawiki.org/wiki/Manual:$wgScriptPath 스크립트 경로]",
+    "version-entrypoints-articlepath": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgArticlePath 문서 경로]",
+    "version-entrypoints-scriptpath": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgScriptPath 스크립트 경로]",
     "redirect": "파일, 사용자, 문서나 판 ID로 넘겨주기",
     "redirect-legend": "파일이나 문서로 넘겨주기",
     "redirect-summary": "이 특수 문서는 파일(파일 이름이 주어짐), 문서(판 ID나 문서 ID가 주어짐)나 사용자 문서(숫자로 표시된 사용자 ID가 주어짐)로 넘겨줍니다. 사용법: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]], 또는 [[{{#Special:Redirect}}/user/101]].",
     "api-error-illegal-filename": "이 파일 이름을 사용할 수 없습니다.",
     "api-error-internal-error": "내부 오류: 올린 파일을 위키에서 처리하는 중 어떤 문제가 발생했습니다.",
     "api-error-invalid-file-key": "내부 오류: 임시 저장소에서 파일을 찾지 못했습니다.",
-    "api-error-missingparam": "내부 오류: 요청 중 매개변수가 누락되었습니다.",
+    "api-error-missingparam": "내부 오류: 요청에 변수가 없습니다.",
     "api-error-missingresult": "내부 오류: 파일의 복제가 성공했는지 판단할 수 없습니다.",
     "api-error-mustbeloggedin": "파일을 올리려면 로그인해야 합니다.",
     "api-error-mustbeposted": "내부 오류: HTTP POST에 요청이 필요합니다.",
index e74b94b..8b71870 100644 (file)
     "disclaimers": "Мийö сöстöмöсь йöз одзын",
     "disclaimerpage": "Project:Мийö сöстöмöсь йöз одзын",
     "edithelp": "Уджкерись понда отсöт",
-    "helppage": "Help:Отсöт",
     "mainpage": "Пондöтчан листбок",
     "mainpage-description": "Пондöтчан листбок",
     "privacy": "Астор дорьян йылiсь",
index 419fa02..0e9e496 100644 (file)
@@ -34,7 +34,7 @@
     "tog-shownumberswatching": "Бетни, кёзде тургъан тизмелерине къошханланы санын кёргюз",
     "tog-oldsig": "Бусагъатдагъы къол салыннган:",
     "tog-fancysig": "Къол салыуну энчи вики-тексти (автомат джибериусюз)",
-    "tog-uselivepreview": "Терк ал къарауну хайырландыр (JavaScript, экспериментал халда)",
+    "tog-uselivepreview": "Терк ал къарауну хайырландыр (экспериментал халда)",
     "tog-forceeditsummary": "Тюрлендириуню ачыкълау тизгини бош къалса, билдир",
     "tog-watchlisthideown": "Кёзюмде тургъан бетден мени тюрлендириулерими джашыр",
     "tog-watchlisthidebots": "Кёзюмде тургъан бетден ботланы тюрлендириулерин джашыр",
     "category-subcat-count": "{{PLURAL:$2|Бу категориягъа къуру баргъан тюбкатегория киреди.|$2 тюбкатегориядан $1 киреди бу категориягъа.}}",
     "category-subcat-count-limited": "Бу категорияда {{PLURAL:$1|тюбкатегория|$1 тюбкатегория}} барды.",
     "category-article-count": "{{PLURAL:$2|Бу категорияда къуру бир бет барды.|Бу категориядагъы $2 бетден {{PLURAL:$1|бет|$1 бет}} кёргюзюлгенди.}}",
-    "category-article-count-limited": "Бу категорияда {{PLURAL:$1|$1 бет}} барды.",
+    "category-article-count-limited": "Бу категорияда {{PLURAL:$1|$1 бет|1=джангыз бир бет}} барды.",
     "category-file-count": "{{PLURAL:$2|Бу категорияда къуру бир файл барды.|Категориядагъы $2 файлдан {{PLURAL:$1|бир файл|$1 файлы}} кёргюзюлгенди.}}",
-    "category-file-count-limited": "Бу категория да {{PLURAL:$1|$1 файл}} барды.",
+    "category-file-count-limited": "Бу категорияда {{PLURAL:$1|$1 файл|1=джангыз бир файл}} барды.",
     "listingcontinuesabbrev": "(баргъаны)",
     "index-category": "Индексленнген бетле",
     "noindex-category": "Индексленмеген бетле",
     "newwindow": "(джангы терезеде ачылады)",
     "cancel": "Ызына алыу",
     "moredotdotdot": "Баргъаны…",
-    "morenotlisted": "Энди Ð´Ð¶Ñ\83кÑ\8a Ð´Ð¶Ð¾ÐºÑ\8aдÑ\83...",
+    "morenotlisted": "Ð\91Ñ\83 Ñ\82изме Ñ\82олÑ\83 Ñ\82Ñ\8eлдÑ\8e.",
     "mypage": "Бет",
     "mytalk": "Сюзюу",
     "anontalk": "Бу IP-адресге сюзюу бет",
     "permalink": "Дайым джибериу",
     "print": "Басмала",
     "view": "Къарау",
+    "view-foreign": "$1 сайтда къара",
     "edit": "Тюрлендир",
     "create": "Къура",
     "editthispage": "Бу бетни тюрлендир",
     "privacypage": "Project:Джашыргъанлыкъ политика",
     "badaccess": "Кириуню халаты",
     "badaccess-group0": "Сизни соргъан амалны этерге эркинлигигиз джокъду.",
-    "badaccess-groups": "Сиз соргъан амалны къуру $1 {{PLURAL:$2|1=группаны|группаланы}} къошулуучуларыны этерге мадарлары барды.",
+    "badaccess-groups": "Сиз соргъан амалны къуру {{PLURAL:$2|бу группаны|бу группаланы}} къошулуучуларыны этерге мадарлары барды: $1.",
     "versionrequired": "MediaWiki-ни $1 версиясы керекди",
     "versionrequiredtext": "Бу бетде ишлер ючюн MediaWiki-ни $1 версиясы керекди.  [[Special:Version|Хайырладырылгъан программаны версияларыны юсюнден информациягъа]] къара.",
     "ok": "ОК",
     "retrievedfrom": "Чыкъгъаны — «$1»",
     "youhavenewmessages": "Сизге $1 келдиле ($2).",
-    "youhavenewmessagesfromusers": "{{PLURAL:$3|1=Башха бир къошулуучудан|$3 къошулуучудан}} сеннге $1 келди ($2).",
+    "youhavenewmessagesfromusers": "{{PLURAL:$3|Башха бир къошулуучудан|$3 къошулуучудан}} {{PLURAL:$4|сеннге}} $1 келди ($2).",
     "youhavenewmessagesmanyusers": "Талай къошулуучудан $1 барды. ($2)",
-    "newmessageslinkplural": "{{PLURAL:$1|1=джангы билдириу|джангы билдириуле}}",
-    "newmessagesdifflinkplural": "ахыр {{PLURAL:$1|тюрлениу}}",
+    "newmessageslinkplural": "{{PLURAL:$1|джангы билдириу|999=джангы билдириуле}}",
+    "newmessagesdifflinkplural": "ахыр {{PLURAL:$1|тюрлениу|999=тюрлениу}}",
     "youhavenewmessagesmulti": "$1 бетде джангы билдириуле бардыла.",
     "editsection": "тюрлендир",
     "editold": "тюрлендир",
     "collapsible-expand": "кёргюз",
     "thisisdeleted": "$1 къараргъа неда къайтарыргъа (тургъузтургъа)?",
     "viewdeleted": "$1 къараймыса?",
-    "restorelink": "кетерилген {{PLURAL:$1|1=1|$1}} тюрлендириу",
+    "restorelink": "{{PLURAL:$1|джангыз бир кетерилген тюрлендириу|$1 кетерилген тюрлендириу}}",
     "feedlinks": "Бу кёрюмде:",
     "feed-invalid": "Джазылыу каналны типи терсди.",
     "feed-unavailable": "Синдикация лентала табылынмайла бусагъатда",
     "nstab-main": "Статья",
     "nstab-user": "Къошулуучуну бети",
     "nstab-media": "Мультимедиа",
-    "nstab-special": "Къуллукъчу бет",
+    "nstab-special": "Къуллукъ бет",
     "nstab-project": "Проектни бети",
     "nstab-image": "Файл",
     "nstab-mediawiki": "Билдириу",
     "nospecialpagetext": "<strong>Сиз излеген къуллукъ бет джокъду.</strong>\n\nБолгъан къуллукъ бетлени тизмеси: [[Special:SpecialPages|{{int:specialpages}}]].",
     "error": "Халат",
     "databaseerror": "Информация базада халат",
+    "databaseerror-query": "Соруулау: $1",
+    "databaseerror-error": "Халат: $1",
     "laggedslavemode": "Эс бёлюгюз! Бу бетге ахыр джангыртыула болмазгъа боллукъдула.",
     "readonly": "Информация база джабыкъды",
     "enterlockreason": "Блок этилиуню чурумун эм заманын белгилегиз.",
     "badtitle": "Джарамагъан ат",
     "badtitletext": "Сорулгъан бетни аты терсди, бошду, неда интервики аты терс джазылгъанды. Келишмеген (хайырланыргъа болмагъан) символла хайырланыргъада боллукъдула атында.",
     "perfcached": "Бу информация кэшден алыннганды, ахыр тюрлениулени кёргюзмезге боллукъду. Кэшде максимум {{PLURAL:$1|джазыу}} сакъланады.",
-    "perfcachedts": "Бу кэшден алыннган информацияды, ахыр кере ол $1 джангыртылыннганды. Кэшде эм кёбю бла  {{PLURAL:$4|1=джазыу|джазыу}} сакъланады.",
+    "perfcachedts": "Бу кэшден алыннган информацияды, ахыр кере ол $1 джангыртылыннганды. Кэшде эм кёбю бла   {{PLURAL:$4|бир джазыу|$4 джазыу}} сакъланады.",
     "querypage-no-updates": "Бу бетни бусагъатда джангыртыргъа болмайды.\nМында келтирилген информация къабыл этилинник тюйюлдю.",
     "viewsource": "Къарау",
     "viewsource-title": "$1 бетни чыкъгъан текстине къарау",
     "viewyourtext": "Бу бетде '''кесигизни тюрлендириулеригизни''' къайнакъ текстине къараргъа эм копия этерге боллукъсуз:",
     "protectedinterface": "Бу бетде программаны интерфейс билдириую барды.\nБютеу викиледе да бу билдириуню кёчюрмесин къошар неда тюрлендирир ючюн MediaWiki-ни локализациясыны сайты [//translatewiki.net/ translatewiki.net]-ни хайырландырыгъыз.",
     "editinginterface": "'''Эс бёл:''' Сен системаны интерфейс бетин тюрлендире тураса. Бу, викини башха къошулуучуларына да тиерик затды. Кёчюрюр ючюн неда кёчюрмелени тюрлендирир ючюн, MediaWiki-ни локализация этиу проекти [//translatewiki.net/ translatewiki.net]-ни хайырландырыгъыз.",
-    "cascadeprotected": "Бу бет тюрлениуледен джакъланыбды, ол каскадлы джакълау къабыл этилиннген  {{PLURAL:$1|1=бетге|бетлеге}} киргени ючюндю:\n$2",
+    "cascadeprotected": "Бу бет тюрлениуледен джакъланыбды, ол каскадлы джакълау къабыл этилиннген {{PLURAL:$1|бетге|бетлеге}} киргени ючюндю:\n$2",
     "namespaceprotected": "«$1» ат аламда бетлени тюрлендирирге эркинлигигиз джокъду.",
     "customcssprotected": "Бу CSS-бетни тюрлендирирге эркинлигигиз джокъду, бу бетде башха къошулуучуну энчи джарашдырыулары барды.",
     "customjsprotected": "Бу JavaScript-бетни тюрлендирирге эркинлигигиз джокъду, бу бетде башха къошулуучуну энчи джарашдырыулары барды.",
+    "mycustomcssprotected": "Бу CSS бетни тюрлендирирге эркинлигигиз джокъду.",
     "ns-specialprotected": "«{{ns:special}}» ат аламны бетлерин тюрлендирирге болмайды.",
     "titleprotected": "Быллай атлы бет къураргъа [[User:$1|$1]]  къоймайды.\nБелгиленнген чурум: ''$2''.",
     "filereadonlyerror": "«$2» гезен «къуру окъур ючюн» режимде болгъаны себебли «$1» файл тюрленмейди.\n\nБу режимни салгъан администратор бу ангылатыуну къойгъанды: «''$3''».",
     "invalidtitle-knownnamespace": "«$2» ат аламы бла эм «$3» тексти бла джарамагъан башлыкъ.",
     "invalidtitle-unknownnamespace": "$1 белгили болмагъан алам номери бла эм «$2» тексти бла джарамагъан башлыкъ",
     "exception-nologin": "Авторизацияны ётмегенсиз",
-    "exception-nologin-text": "Бу бетге къарар ючюн неда сорулгъан ишни этер ючюн авторизацияны ётерге керекди.",
+    "exception-nologin-text": "Бу бетге къарар ючюн неда сорулгъан ишни этер ючюн [[Special:Userlogin|авторизацияны ётерге]] керекди.",
     "virus-badscanner": "Джарашдырыуну хатасы. Белгисиз вирус сканер: ''$1''",
     "virus-scanfailed": "скан этиуню хатасы (код $1)",
     "virus-unknownscanner": "белгисиз антивирус:",
-    "logouttext": "'''Аккаунтугъуздан чыкъдыгъыз.'''\n\nСиз {{SITENAME}} сайтда аноним халда къалыргъа боллкъсуз. неда <span class='plainlinks'>[$1 джангыдан кирирге]</span>.\nТалай бетле сиз тергеу джазыу (аккаунт) бла киргенча кёрюнюрге боллукъдула, аны кетерир ючюн кэшни джангыртыгъыз.",
+    "logouttext": "<strong>Аккаунтугъуздан чыкъдыгъыз.</strong>\n\nБир-бир бетле, сиз тергеу джазыу (аккаунт) бла киргенча кёрюнюрге боллукъдула. Аны кетерир ючюн браузеригизни кэшин джангыртыгъыз.",
     "welcomeuser": "Сау кел, $1!",
     "welcomecreation-msg": "Сизни тергеу джазыуугъуз (аккаунтугъуз) къуралды.\n{{SITENAME}} сайтда [[Special:Preferences|джарашдырыуларыгъызны]] тюрлендирирге унутмагъыз.",
     "yourname": "Къошулуучуну аты",
     "userlogin-yourname": "Тергеу джазыуну аты",
     "userlogin-yourname-ph": "Тергеу джазыуунгу атын джаз",
+    "createacct-another-username-ph": "Тергеу джазыуну атын джаз",
     "yourpassword": "Паролюгъуз:",
     "userlogin-yourpassword": "Пароль",
     "userlogin-yourpassword-ph": "Паролунгу джаз",
     "gotaccount": "Тергеу джазыуугъуз (аккаунтугъуз) энди бармыды? $1.",
     "gotaccountlink": "Системагъа кир",
     "userlogin-resetlink": "Кирир ючюн билгилеригизни унутхан этгенмисиз?",
-    "userlogin-resetpassword-link": "Паролну джибериу",
+    "userlogin-resetpassword-link": "Паролунгу унутдунгму?",
     "userlogin-helplink2": "Кириуде болушлукъ",
     "userlogin-createanother": "Башха аккаунт къурау",
     "createacct-join": "Билгилеринги тюбюрекде джаз.",
     "createacct-emailrequired": "Электрон почтаны адреси",
     "createacct-emailoptional": "Электрон почтаны адреси (амалсыз тюлдю)",
     "createacct-email-ph": "Электрон почта адресигизни джазыгъыз",
-    "createaccountmail": "Эсде болмагъанлай генерация этилген болджаллы паролну хайырландыр эм тюбюрекде берилген электрон почта адресге ий:",
+    "createacct-another-email-ph": "Электрон почтаны адресин джаз",
+    "createaccountmail": "Эсде болмагъанлай генерация этилген болджаллы паролну хайырландырыу эмда берилген электрон почта адресге ийиу",
     "createacct-realname": "Керти атыгъыз (ажымсыз керек тюлдю)",
     "createaccountreason": "Чурум:",
     "createacct-reason": "Чурум",
     "createacct-submit": "Тергеу джазыуну къура",
     "createacct-another-submit": "Энтда бир аккаунт къурау",
     "createacct-benefit-heading": "{{SITENAME}} сизнича адамла бла къуралгъанды.",
-    "createacct-benefit-body1": "{{PLURAL:$1|тюрлениу}}",
-    "createacct-benefit-body2": "{{PLURAL:$1|бет}}",
-    "createacct-benefit-body3": "арт заманда {{PLURAL:$1|къошум этген}}",
+    "createacct-benefit-body1": "{{PLURAL:$1|тюрлениу|тюрлениу}}",
+    "createacct-benefit-body2": "{{PLURAL:$1|бет|бет}}",
+    "createacct-benefit-body3": "арт заманда {{PLURAL:$1|къошум этген|къошум этген}}",
     "badretype": "Джазгъан паролларыгъыз бир-бирине келишмейдиле.",
     "userexists": "Джазылгъан ат хайырландырылады.\nБашха ат сайлагъыз.",
     "loginerror": "Кириуде халат",
     "login-userblocked": "Бу къошулуучу блокга салыннганды. Кирирге мадары джокъду.",
     "wrongpassword": "Сиз джазгъан пароль терсди. Джангыдан кёрюгюз.",
     "wrongpasswordempty": "Пароль джазылмай къалгъанды. Джангыдан кёрюгюз.",
-    "passwordtooshort": "$1 {{PLURAL:$1|символдан}} аз болмазгъа керекди пароль.",
+    "passwordtooshort": "Пароль, {{PLURAL:$1|1 символдан|$1 символдан}} аз болмазгъа керекди.",
     "password-name-match": "Пароль къошулуучу атдан башха тюрлю болургъа керекди.",
     "password-login-forbidden": "Бу къошулуучу ат бла паролну хайырландыргъан джарамайды.",
     "mailmypassword": "Паролну джибер",
     "passwordremindertitle": "{{SITENAME}}  къошулуучугъа джангы болджаллы пароль",
-    "passwordremindertext": "Ким эседа (сиз болургъа боллукъсуз, IP-адрес: $1) {{SITENAME}} ($4) къошулуучугъа джангы пароль къураргъа соргъанды. $2 къошулуучугъа джангы пароль: $3. Сорууну джиберген сиз болгъан эсегиз, системагъа кирирге эм паролну алышдырыргъа тыйычлыды. Джангы паролну $5 {{PLURAL:$5|кюнню}} ичинде амалы боллукъду.\n\nПаролну алышдырыргъа сорууну сиз джибермеген эсегиз, неда эсигизге тюшген эсе паролюгъуз, бу билдириуге эс бёлмегизда къоюгъуз, эски паролюгъузну хайырландырыгъыз.",
+    "passwordremindertext": "Ким эсе да (сиз болургъа боллукъсуз, IP-адрес: $1) {{grammar:genitive|{{SITENAME}}}} ($4) къошулуучугъа джангы пароль къураргъа соргъанды. \n$2\nдеген къошулуучугъа джангы пароль къуралды: $3. Сорууну джиберген сиз болгъан эсегиз, системагъа кирирге эм джангы пароль сайларгъа тыйыншлыды. Болджаллы паролугъузну {{PLURAL:$5|1 кюнню|$5 кюнню}} ичинде амалы боллукъду.\n\nПаролну алмашдырыргъа сорууну сиз джибермеген эсегиз, неда эсигизге тюшген эсе паролугъуз,\nбу билдириуге эс бёлмегиз да къоюгъуз,\nэски паролугъузну хайырландырыгъыз.",
     "noemail": "$1 аты бла къошулуучугъа e-mail адрес джазылмагъанды.",
     "noemailcreate": "Сизге тюз e-mail адресни джазаргъа керекди",
     "passwordsent": "Джангы пароль $1 къошулуучуну электрон почтасына джиберилди.\n\nПаролну алгъандан сора, джангыдан киригиз системагъа.",
     "blocked-mailpassword": "Сизни IP-адресигиз блокланыб турады, аны бла паролну къайтарыу функцияда.",
-    "eauthentsent": "Ð\94жазÑ\8bлгÑ\8aан Ñ\8dлекÑ\82Ñ\80он Ð¿Ð¾Ñ\87Ñ\82агÑ\8aа Ð°Ð´Ñ\80еÑ\81ни Ñ\82Ñ\8eÑ\80лениÑ\83Ñ\8eн Ð±ÐµÐ³Ð¸Ñ\82иÑ\80ге Ñ\81оÑ\80Ñ\83Ñ\83 Ð´Ð¶Ð¸Ð±ÐµÑ\80илгенди. Ð\9fиÑ\81Ñ\8cмода Ð±Ñ\83 Ñ\81изни Ñ\8dлекÑ\82Ñ\80он Ð¿Ð¾Ñ\87Ñ\82агÑ\8aÑ\8bзнÑ\8b Ð°Ð´Ñ\80еÑ\81и Ð±Ð¾Ð»Ð³Ñ\8aанÑ\8bн Ð±ÐµÐ³Ð¸Ñ\82иÑ\80 Ñ\8eÑ\87Ñ\8eн Ð½Ðµ Ñ\8dÑ\82еÑ\80ге ÐºÐµÑ\80ек Ð±Ð¾Ð»Ð³Ñ\8aанÑ\8b Ð´Ð° чертилгенди.",
-    "throttled-mailpassword": "Паролну билдириу амал {{PLURAL:$1|1=ахыр $1 сагъатны}} ичинде бир кере хайырланылгъанды.\nДжорукъдан чыгъыудан сакъланыр ючюн $1 {{PLURAL:$1|сагъатны}} ичинде къуру бир билдириу алыргъа болады.",
+    "eauthentsent": "Ð\94жазÑ\8bлгÑ\8aан Ñ\8dлекÑ\82Ñ\80он Ð¿Ð¾Ñ\87Ñ\82агÑ\8aа Ð±Ð¸Ð»Ð´Ð¸Ñ\80иÑ\83 Ð´Ð¶Ð¸Ð±ÐµÑ\80илди. Ð\91илдиÑ\80иÑ\83де Ð±Ñ\83 Ñ\81изни Ñ\8dлекÑ\82Ñ\80он Ð¿Ð¾Ñ\87Ñ\82агÑ\8aÑ\8bзнÑ\8b Ð°Ð´Ñ\80еÑ\81и Ð±Ð¾Ð»Ð³Ñ\8aанÑ\8bн Ð±ÐµÐ³Ð¸Ñ\82иÑ\80 Ñ\8eÑ\87Ñ\8eн Ð½Ðµ Ñ\8dÑ\82еÑ\80ге ÐºÐµÑ\80ек Ð±Ð¾Ð»Ð³Ñ\8aанÑ\8b чертилгенди.",
+    "throttled-mailpassword": "Паролну билдириу амал ахыр {{PLURAL:$1|сагъатны|$1 сагъатны}} ичинде бир кере хайырланылгъанды.\nДжорукъдан чыгъыудан сакъланыр ючюн $1 {{PLURAL:$1|сагъатны|$1 сагъатны}} ичинде къуру бир билдириу алыргъа болады.",
     "mailerror": "Почта джибериу хата: $1",
     "acct_creation_throttle_hit": "Кюн бла кечеге сизни IP-адресигизден {{PLURAL:$1|$1 тергеу джазыу (аккаунт)}} къуралгъанды. Бу амал энди бусагъатда джабыкъды.",
     "emailauthenticated": "Сизни электрон почта адресигиз бегитилгенди: $3, $2.",
     "accountcreatedtext": "$1 къошулуучугъа тергеу джазыу (аккаунт) къуралды.",
     "createaccount-title": "{{SITENAME}}: тергеу джазыу (аккаунт) къурау",
     "createaccount-text": "Ким эсе да, электрон почтагъызны адресин джазыб  {{SITENAME}} ($4) проектде «$3» пароль бла «$2» тергеу джазыу (аккаунт) къурагъанды. Сиз кириб паролну тюрлендирсегиз тыйыншлыды.\n\nТергеу джазыуну (аккаунтну) халат бла къурагъан эсегиз, игнор этигиз да къоюгъуз бу билдириуню.",
-    "usernamehasherror": "Къошулуучуну атында «#» символ болургъа джарамайда.",
     "login-throttled": "Сиз асыры кёб кере кирирге кюрешгенсиз.\nДжангыдан кёргюнчю бираз заман ётдюрюгюз.",
     "login-abort-generic": "Системагъа кириу джетишимсиз болду",
     "loginlanguagelabel": "Тил: $1",
     "suspicious-userlogout": "Терс браузер неда кэш этиучу прокси берген соруугъа ушагъаны ючюн, Сизни чыгъаргъа сорууугъуз алынмагъанды.",
     "pt-login": "Кириу",
+    "pt-login-button": "Кириу",
     "pt-createaccount": "Аккаунт къурау",
     "pt-userlogout": "Чыгъыу",
     "php-mail-error-unknown": "PHP's mail() функцияда белгили болмагъан халат",
     "user-mail-no-body": "Бош неда магъанасыз къысха джазыу бла билдириу иерге изледи.",
     "changepassword": "Паролну ауушдур",
     "resetpass_announce": "Сиз, электрон почта бла ийилген, болджаллы пароль бла киргенсиз. Системагъа кириуню тамамларча, джангы пароль къурагъыз.",
+    "resetpass_text": "<!-- Текстни былайгъа къошугъуз -->",
     "resetpass_header": "Тергеу джазыуну (аккаунтну) паролун тюрлендириу",
     "oldpassword": "Эски пароль:",
     "newpassword": "Джангы пароль:",
     "changeemail-password": "«{{SITENAME}}» проектде паролугъуз:",
     "changeemail-submit": "Адресни тюрлендир",
     "changeemail-cancel": "Ызына алыу",
+    "resettokens-tokens": "Токенле:",
     "bold_sample": "Къалын джазыу",
     "bold_tip": "Къалын джазыу",
     "italic_sample": "Курсив джазыу",
     "revdelete-no-file": "Белгиленнген файл джокъду.",
     "revdelete-show-file-confirm": "«<nowiki>$1</nowiki>» файлны $2 $3 датада кетерилген версиясына къараргъа излегенигизге ишексизмисиз?",
     "revdelete-show-file-submit": "Хоу",
-    "logdelete-selected": "Журналны {{PLURAL:$1|1=Сайланнган джазыу|сайланнган джазыулары}}:",
+    "logdelete-selected": "Журналны {{PLURAL:$1|сайланнган джазыуу|сайланнган джазыулары}}:",
     "revdelete-confirm": "Тилейбиз, буну этерге излегенигизни, эсеблерин ангылагъаныгъызны, эм буну [[{{MediaWiki:Policy-url}}|джорукълагъа]] кёре этгенигизни билдиригиз.",
     "revdelete-suppress-text": "Джашырыу '''джангыз''' бу турумлада этиледи:\n* Келишмеген энчи информация\n*: ''юй адресле эм телефон номерле, паспорт номер эмда башхала''",
     "revdelete-legend": "Чеклеуле сал:",
-    "revdelete-hide-text": "Ð\91еÑ\82ни Ð±Ñ\83 Ð²ÐµÑ\80Ñ\81иÑ\8fÑ\81Ñ\8bнÑ\8b Ñ\82екÑ\81Ñ\82ин Ð´Ð¶Ð°Ñ\88Ñ\8bÑ\80",
+    "revdelete-hide-text": "ТÑ\8eÑ\80лендиÑ\80иÑ\83нÑ\8e Ñ\82екÑ\81Ñ\82и",
     "revdelete-hide-image": "Файлны ичин джашыр",
     "revdelete-hide-name": "Ишлеу бла аны объектин джашыр",
-    "revdelete-hide-comment": "Тюрлениулени ангылатыуларын джашыр",
-    "revdelete-hide-user": "Авторну атын/IP адресин джашыр",
+    "revdelete-hide-comment": "Тюрлениулени ачыкълау",
+    "revdelete-hide-user": "Авторну аты/IP адреси",
     "revdelete-hide-restricted": "Администраторладан да джашыр билгилени",
     "revdelete-radio-same": "(тюрлендирмей къой)",
-    "revdelete-radio-set": "ХоÑ\83",
-    "revdelete-radio-unset": "Ð\9eгÑ\8aай",
+    "revdelete-radio-set": "Ð\94жаÑ\88Ñ\8bÑ\80Ñ\8bлгÑ\8aан",
+    "revdelete-radio-unset": "Ð\9aÑ\91Ñ\80Ñ\8eннген",
     "revdelete-suppress": "Администраторладан да джашыра тур билгилени",
     "revdelete-unsuppress": "Ызына къайтарылгъан версияладан тыйгъычланы кетер",
     "revdelete-log": "Чурум:",
-    "revdelete-submit": "{{PLURAL:$1|1=Сайланнган версия|Сайланнган версиялада}} хайырлан",
+    "revdelete-submit": "{{PLURAL:$1|Сайланнган версияда|Сайланнган версиялада}} хайырлан",
     "revdelete-success": "'''Версияны кёрюнюую джетишимли тюрлендирилгенди'''",
     "revdelete-failure": "'''Версияны кёрюнюую тюрленеллик тюлдю'''\n$1",
     "logdelete-success": "'''Болууланы кёрюнюую тюрленнгенди.'''",
     "mergehistory-go": "Бирлешиннген тюрлендириулени кёргюз",
     "mergehistory-submit": "Тюрлениулени бирлештир",
     "mergehistory-empty": "Бирлешдирир ючюн тюрлениуле табылмагъандыла",
-    "mergehistory-success": "[[:$1]] бетни $3 {{PLURAL:$3|1=тюрлендириую|тюрлендириую}} тыйыншлы [[:$2]] ичинде бирлешдирилди.",
+    "mergehistory-success": "[[:$1]] бетни $3 {{PLURAL:$3|тюрлендириую}} тыйыншлы [[:$2]] ичинде бирлешдирилди.",
     "mergehistory-fail": "Бетлине тарихлери бирлешемеди, тилейбиз бетни эмда заманны параметрлерин джангыдан сынагъыз.",
     "mergehistory-no-source": "$1 тамал бет джокъду",
     "mergehistory-no-destination": "$1 нюзюр бет джокъду",
     "compareselectedversions": "Сайланнган версияланы тенглешдириу",
     "showhideselectedversions": "Сайланнган версияланы кёргюз/джашыр",
     "editundo": "ызына алыу",
-    "diff-multi-manyusers": "($2 къошулуучудан кёб {{PLURAL:$2|1=Бир къошулуучу|къошулуучу}} этген {{PLURAL:$1|1=бир аралыкъ тюрлениу|$1 аралыкъ тюрлениу}} кёргюзюлмегенди)",
-    "difference-missing-revision": "Бу тенглешдириу ($1) ючюн {{PLURAL:$2|1=$2 версия}} {{PLURAL:$2|табылмады}}.\n\n\nБу, эскирген джибериу бла кетерилген бетни версияларын тенглешдириуге кёчген сагъатда кёбюсюне болады.\nТолуракъ информация [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} кетериулени журналында] болургъа боллукъду.",
+    "diff-empty": "(башхалыкъ джокъ)",
+    "diff-multi-manyusers": "($2 {{PLURAL:$2|къошулуучудан}} кёб этген {{PLURAL:$1|бир аралыкъ тюрлениу|$1 аралыкъ тюрлениу}} кёргюзюлмегенди)",
+    "difference-missing-revision": "Бу тенглешдириу ($1) ючюн {{PLURAL:$2|бир версия|$2 версия}} {{PLURAL:$2|табылмады}}.\n\n\nБу, эскирген джибериу бла кетерилген бетни версияларын тенглешдириуге кёчген сагъатда кёбюсюне болады.\nТолуракъ информация [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} кетериулени журналында] болургъа боллукъду.",
     "searchresults": "Излеуню эсеби",
     "searchresults-title": "«$1» ючюн излеуню эсеблери",
     "toomanymatches": "Асыры кёб бирчалыкъ барды, джангыдан соруу джиберирге кюрешигиз",
     "prevn": "алдагъы {{PLURAL:$1|$1}}",
     "nextn": "эндиги {{PLURAL:$1|$1}}",
     "prevn-title": "Алдагъы $1 {{PLURAL:$1|эсеб|эсеб}}",
-    "nextn-title": "Эндиги $1 {{PLURAL:$1|эсеб|эсеб}}",
+    "nextn-title": "Эндиги $1 {{PLURAL:$1|эсеб}}",
     "shown-title": "Бетде $1 {{PLURAL:$1|джазыуну}} кёргюз",
     "viewprevnext": "Къара: ($1 {{int:pipe-separator}} $2) ($3)",
     "searchmenu-exists": "'''Бу викиде «[[:$1]]» бет барды'''",
     "prefs-skin": "Джасауу",
     "skin-preview": "Ал къарау",
     "datedefault": "Сайлау джокъду",
-    "prefs-beta": "Бета-амалла",
-    "prefs-datetime": "Дата бла сагъат",
     "prefs-labs": "Эксперимент амалла",
     "prefs-user-pages": "Къошулуучуну бетлери",
     "prefs-personal": "Энчи билгиле",
     "recentchangesdays-max": "(максимум $1 {{PLURAL:$1|1=кюн|кюн}})",
     "recentchangescount": "Тынгылау бла кёргюзюллюк тюрлениулени саны:",
     "prefs-help-recentchangescount": "Бу, ахыр тюрлениулени, бетни тарихлерин эмда журналланы ичине къошады.",
+    "prefs-help-watchlist-token2": "Бу, сизни кёздеги тизмегизни веб-каналыны тахсалы ачхычыды.\nБу ачхычны билген хар ким да сизни кёздеги тизмегизни окъуяллыкъды, аны себебли башха кишиге билдирмегиз. [[Special:ResetTokens|Аны джиберирге керек эсе, былайдан басыгъыз]].",
     "savedprefs": "Джарашдырыуларыгъыз сакъландыла.",
     "timezonelegend": "Заман бел:",
     "localtime": "Джерли заман:",
     "badsiglength": "Къол салыуугъуз бек узунду.\n$1 {{PLURAL:$1|1=символдан|символладан}} кеб болургъа болмайды.",
     "yourgender": "Эркиши/Тиширыу:",
     "gender-unknown": "Белгиленмегенди",
-    "gender-male": "эркиши",
-    "gender-female": "тиширыу",
+    "gender-male": "Викини бетлерин эркиши тюрлендиреди",
+    "gender-female": "Викини бетлерин тиширыу тюрлендиреди",
     "prefs-help-gender": "Излеуге байламлы: джазылым джанындан къошулуучуну ырхызына кёре хайырланады.\nБу билги хар кимгеда ачыкъды.",
     "email": "Электрон почта",
     "prefs-help-realname": "Керти ат (излеуге байламлы).\nАны кёргюзюрге излесегиз, сиз тюрлендирген бетлеригизни,сиз тюрлендиргенигизи белгили боллукъду.",
     "prefs-dateformat": "Датаны форматы",
     "prefs-timeoffset": "Заманны офсети",
     "prefs-advancedediting": "Кенгленнген джарашдырыула",
+    "prefs-editor": "Редактор",
+    "prefs-preview": "ал къарау",
     "prefs-advancedrc": "Кенгленнген джарашдырыула",
     "prefs-advancedrendering": "Кенгленнген джарашдырыула",
     "prefs-advancedsearchoptions": "Кенгленнген джарашдырыула",
     "prefs-displaysearchoptions": "Кёрюнюуню джарашдырыулары",
     "prefs-displaywatchlist": "Кёрюнюуню джарашдырыулары",
     "prefs-diffs": "Версияланы башхалыкълары",
+    "prefs-help-prefershttps": "Бу джарашдырыу эндиги авторизацияны ётгенден сора сингдирилликди.",
     "email-address-validity-valid": "E-mail адрес тюзге ушайды",
     "email-address-validity-invalid": "Тюз e-mail адрес джазыгъыз!",
     "userrights": "Къошулуучуну хакъларына оноу этиу",
     "action-userrights-interwiki": "къошулуучуланы башха викиледе хакъларын тюрлендириу",
     "action-siteadmin": "билгилени базасын блокга салыу эм блокдан алыу",
     "action-sendemail": "E-mail джибериу",
+    "action-editmywatchlist": "кёзде тургъан тизменги тюрлендириу",
+    "action-viewmywatchlist": "кёзде тургъан тизменги кёрюу",
     "nchanges": "$1 {{PLURAL:$1|тюрлениу|тюрлениу}}",
+    "enhancedrc-history": "тарих",
     "recentchanges": "Ахыр тюрлениуле",
     "recentchanges-legend": "Ахыр тюрлениулени джарашдырыулары",
     "recentchanges-summary": "Тюбюнде, Википедияда этилген ахыр тюрлениуле хронология бла тизилиб турадыла.",
     "rcshowhideminor-show": "кёргюз",
     "rcshowhideminor-hide": "джашыр",
     "rcshowhidebots": "ботланыкъыланы $1",
+    "rcshowhidebots-show": "кёргюз",
+    "rcshowhidebots-hide": "джашыр",
     "rcshowhideliu": "системагъа киргенленикилени $1",
+    "rcshowhideliu-show": "кёргюз",
+    "rcshowhideliu-hide": "джашыр",
     "rcshowhideanons": "анонимленикилени $1",
-    "rcshowhidepatr": "$1 патруль этилиннген тюрлендириуле",
+    "rcshowhideanons-show": "кёргюз",
+    "rcshowhideanons-hide": "джашыр",
+    "rcshowhidepatr": "тинтилгенлени $1",
+    "rcshowhidepatr-show": "кёргюз",
+    "rcshowhidepatr-hide": "джашыр",
     "rcshowhidemine": "кесими тюрлендириулерими $1",
+    "rcshowhidemine-show": "кёргюз",
+    "rcshowhidemine-hide": "джашыр",
     "rclinks": "Ахыр $2 кюнню ичинде этилиннген $1 тюрлениуню кёргюз;<br /> $3",
     "diff": "башх.",
     "hist": "тарих",
     "upload-permitted": "Эркинлик берилген файлланы типлери: $1.",
     "upload-preferred": "Изленнген файлланы типлери: $1.",
     "upload-prohibited": "Джасакъ этилген файлланы типлери: $1.",
-    "uploadlog": "Джюклеулени журналы",
     "uploadlogpage": "Джюклеулени журналы",
     "uploadlogpagetext": "Тюбюнде эм ахыр къошулгъан файлланы тизмеси барды.\nДагъыда [[Special:NewFiles|dosyalджангы файлланы галереясына]] къара, анда джангы джюклеулени юсюнден билгиле толу кёрюгюзюлгендиле.",
     "filename": "Файлны аты",
     "filereuploadsummary": "Файлны тюрлениулери:",
     "filestatus": "Джайылыу хакълары:",
     "filesource": "Къайнакъ:",
-    "uploadedfiles": "Джюкленнген файлла",
     "ignorewarning": "Эсгертиулеге къарамай сакълат файлны",
     "ignorewarnings": "Эсгертиулеге къарама",
     "minlength1": "Файлны аты эм азы бла бир харифден болургъа керекди.",
     "overwroteimage": "«[[$1]]» суратны джангы версиясы джюкленнгенди",
     "uploaddisabled": "Джюклеуге эркинлик джокъду",
     "copyuploaddisabled": "URL кёре джюклеу джукъланыбды.",
-    "uploadfromurl-queued": "Сизни джюклеуюгюз кёзюуге салыннганды.",
     "uploaddisabledtext": "Файлланы джюклеу мадар джукъланыбды",
     "php-uploaddisabledtext": "PHP-да файл джюклеу амал джукъланыбды.\nfile_uploads джарашдырыулагъа бир къарагъыз.",
     "uploadscripted": "Бу файл, браузер бла халатлы таныргъа боллукъ, HTML-код неда скрипт джюрютеди.",
     "upload-misc-error": "Билинмеген джюклеу халат",
     "upload-misc-error-text": "Джюклеуню кёзюуюнде билинмеген халат болду.\nURL-адрес тюз болгъанын осмакълагъыз эмда джангыдан сынагъыз.\nПроблема джангыдан чыкъса, [[Special:ListUsers/sysop|администраторгъа]] джазыгъыз.",
     "upload-too-many-redirects": "URL асыры кёб джибериу тутады",
-    "upload-unknown-size": "Билинмеген ёлчем",
     "upload-http-error": "HTTP хата болду: $1",
     "backend-fail-stream": "«$1» файл окъулмады.",
     "backend-fail-backup": "«$1» файлны резерв копиясын этерге болмайды.",
     "listfiles_size": "Ёлчем",
     "listfiles_description": "Ачыкълау",
     "listfiles_count": "Версияла",
+    "listfiles-latestversion": "Бусагъатдагъы версия",
+    "listfiles-latestversion-yes": "Хоу",
+    "listfiles-latestversion-no": "Огъай",
     "file-anchor-link": "Файл",
     "filehist": "Файлны тарихи",
     "filehist-help": "Датагъа/заманнга басыгъыз, ол сагъатда файл къаллай болгъанын кёрюр ючюн.",
     "filehist-dimensions": "Ёлчеми",
     "filehist-filesize": "Файлны ёлчеми",
     "filehist-comment": "Эсгериу",
-    "filehist-missing": "Файл джокъду",
     "imagelinks": "Файлны хайырланыуу",
-    "linkstoimage": "Бу файлгъа {{PLURAL:$1|1=бет|$1 бет}} джибередиле:",
+    "linkstoimage": "Бу файлгъа {{PLURAL:$1|бет|$1 бет}} джибередиле:",
     "linkstoimage-more": "$1 дегенден артыкъ {{PLURAL:$1|бет}} бу файлгъа джибериу береди.\nБу тизмеде бу файлгъа {{PLURAL:$1|къуру $1 джибериу}} кёргюзюледи.\n[[Special:WhatLinksHere/$2|Толу тизме]] да барды.",
     "nolinkstoimage": "Бу файлгъа джиберген бет джокъду.",
     "morelinkstoimage": "Бу файлгъа [[Special:WhatLinksHere/$1|къалгъан джибериулеге]] къара.",
     "unusedtemplateswlh": "башха джибериуле",
     "randompage": "Эсде болмагъан бет",
     "randompage-nopages": "{{PLURAL:$2|1=Ат аланында|Ат аланында}} чырт бир бет джокъду: $1.",
+    "randomincategory-selectcategory-submit": "Кёч",
     "randomredirect": "Сакъланмагъан джибериу",
     "randomredirect-nopages": "«$1» ат аланда чырт бир джибериу джокъду.",
     "statistics": "Статистика",
     "statistics-views-peredit": "Тюрлендириуге къарауну саны",
     "statistics-users": "Регистрация этилген [[Special:ListUsers|къошулуучула]]",
     "statistics-users-active": "Актив къошулуучула",
-    "statistics-users-active-desc": "Ахыр {{PLURAL:$1|1=1 кюнде|$1 кюнде}} ишлеме этген къошулуучула",
+    "statistics-users-active-desc": "Ахыр {{PLURAL:$1|кюнде|$1 кюнде}} ишлеме этген къошулуучула",
     "statistics-mostpopular": "Эм кёб къаралгъан бетле",
     "pageswithprop-submit": "Таб",
     "doubleredirects": "Джибериу болгъан джибериуле",
     "withoutinterwiki-legend": "Префикс",
     "withoutinterwiki-submit": "Кёргюз",
     "fewestrevisions": "Эм аз версиясы болгъан бетле",
-    "nbytes": "$1 {{PLURAL:$1|байт|байт}}",
-    "ncategories": "$1 {{PLURAL:$1|1=категория|категорияла}}",
-    "nlinks": "$1 {{PLURAL:$1|1=джибериу|джибериу}}",
-    "nmembers": "$1 {{PLURAL:$1|объект|объект}}",
-    "nrevisions": "$1 {{PLURAL:$1|1=версия|версия}}",
-    "nviews": "$1 {{PLURAL:$1|1=къарау|къарау}}",
-    "nimagelinks": "$1 {{PLURAL:$1|1=бетде|бетде}} хайырланады",
-    "ntransclusions": "$1 {{PLURAL:$1|1=бетде|бетде}} хайырланады",
+    "nbytes": "$1 {{PLURAL:$1|байт}}",
+    "ncategories": "$1 {{PLURAL:$1|категория}}",
+    "nlinks": "$1 {{PLURAL:$1|джибериу}}",
+    "nmembers": "$1 {{PLURAL:$1|объект}}",
+    "nrevisions": "$1 {{PLURAL:$1|версия}}",
+    "nviews": "$1 {{PLURAL:$1|къарау}}",
+    "nimagelinks": "$1 {{PLURAL:$1|бетде}} хайырланады",
+    "ntransclusions": "$1 {{PLURAL:$1|бетде}} хайырланады",
     "specialpage-empty": "Сорма эсеб келтирмеди.",
     "lonelypages": "Ёксюз бетле",
     "lonelypagestext": "Тюбюндеги бетлеге {{SITENAME}} сайтдагъы башха бетледен джибериу берилмегенди неда ала башха бетлеге къошулмагъандыла.",
     "protectedpages": "Къоруугъа алыннган бетле",
     "protectedpages-indef": "Къуру болджалсыз къоруу",
     "protectedpages-cascade": "Джангыз секиртме къоруу",
+    "protectedpages-noredirect": "Редиректлени джашыр",
     "protectedpagesempty": "Бусагъатда бу параметрле бла джакъланнган бет джекъду.",
+    "protectedpages-timestamp": "Дата/заман",
+    "protectedpages-page": "Бет",
+    "protectedpages-expiry": "Бошалыу датасы",
+    "protectedpages-reason": "Чурум",
+    "protectedpages-unknown-timestamp": "Билинмейди",
+    "protectedpages-unknown-performer": "Белгили болмагъан къошулуучу",
     "protectedtitles": "Джакъланнган башлыкъла",
     "protectedtitlesempty": "Бусагъатда, бу параметрле бла джакъланнган башлыкъ джокъду.",
     "listusers": "Къошулуучуланы тизмеси",
     "listusers-editsonly": "Къуру тюрлендириу этген къошлуучуланы кёргюз",
     "listusers-creationsort": "Къуралгъан заманына кёре сафла",
-    "usereditcount": "$1 {{PLURAL:$1|1=тюрлендириу|тюрлендириу}}",
+    "usereditcount": "$1 {{PLURAL:$1|тюрлендириу}}",
     "usercreated": "$1 $2 заманда {{GENDER:$3|регистрацияны ётгенди}}",
     "newpages": "Джангы бетле",
     "newpages-username": "Къошулуучуну аты:",
     "listgrouprights-removegroup-self": "кесини тергеу джазыуундан {{PLURAL:$2|1=къауум|къауумланы}} къораталлыкъды: $1",
     "listgrouprights-addgroup-self-all": "Бютеу къауумланы кесини тергеу джазыууна къошаллыкъды",
     "listgrouprights-removegroup-self-all": "Кесини тергеу джазыуундан бютеу къауумланы къораталлыкъды",
+    "listgrouprights-namespaceprotection-namespace": "Атла алам",
+    "trackingcategories": "Марлаб туруучу категорияла",
+    "trackingcategories-msg": "Марлаб туруучу категория",
+    "trackingcategories-name": "Билдириуню аты",
+    "trackingcategories-disabled": "Категория джукъланыбды",
     "mailnologin": "Джиберирге адрес джокъду",
     "mailnologintext": "Башха къошулуучулагъа эл. почта джиберелир ючюн [[Special:UserLogin|системагъа кирирге]] керексиз эм [[Special:Preferences|джарашдырыуланы]] бетинде джараулу эл. почта адрес болургъа керекди.",
     "emailuser": "Къошулуучугъа письмо",
     "emailuser-title-notarget": "Электрон джазма джазыу",
     "emailpage": "Къошулуучугъа письмо джибер",
     "emailpagetext": "Бу къошулуучуну почтасына письмо джиберир ючюн бу форманы толтурургъа боллукъсуз.\nЫзына адрес болуб, сиз [[Special:Preferences|джарашдырыуларыгъызда]] джазгъан адрес белгиленникди, ол себебден сизни письмогъузну аллыкъ сизге тюз джууаб берирге мадарлы боллукъду.",
-    "usermailererror": "Халат ючюн элетктрон письмо ызына къайтды:",
     "defemailsubject": "{{SITENAME}} — $1 къошулуучудан билдириу",
     "usermaildisabled": "Къошулуучуну электрон почтасы джукъланыбды",
     "usermaildisabledtext": "Сиз бу викини башха къошулуучуларына электрон письмола джиберелмейсиз",
     "noemailtitle": "Электрон почтаны адреси джокъду",
     "noemailtext": "Бу къошулуучу керти электрон адресин бермегенди.",
-    "nowikiemailtitle": "Электрон письмо джиберирге эркинлик джокъду",
     "nowikiemailtext": "Бу къошулуучу, башха къошулуучуладан электрон писмо алыргъа излемегенин билдиргенди.",
     "emailtarget": "Аллыкъ къошулуучуну атын джазыгъыз",
     "emailusername": "Къошулуучуну аты:",
     "nowatchlist": "Кёзюгюзде тургъан тизмегиз бошду.",
     "watchlistanontext": "Кёзюгюзде тургъан тизмегизни статьяларын кёрюр неда тюрлендирир ючюн бери ётюгюз: $1.",
     "watchnologin": "Системагъа кирирге керекди.",
-    "watchnologintext": "Кёзюгюзде тургъан тизмегизни тюрлендирир ючюн [[Special:UserLogin|системагъа кирирге керексиз]].",
     "addwatch": "Кёзде тургъан тизмеге къош",
     "addedwatchtext": "«[[:$1]]» бет [[Special:Watchlist|кёзюгюзде тургъан тизмегизге]] къошулду.\nБу бетни эмда муну бла байламлы сюзюу бетни тюрлениулери ол тизмеде белгиленникдиле, [[Special:RecentChanges|джангы тюрлениулени тизмесини]] бетинде уа къалын шрифт бла чертилинникдиле, кёрюрге тынчыракъ болурча.",
     "removewatch": "Кёзде тургъан тизмеден кетер",
     "notanarticle": "Статья тюлдю",
     "notvisiblerev": "Версия кетерилгенди",
     "watchlist-details": "Кёздеги тизмегизде сюзюу бетлери саналмай {{PLURAL:$1|бет|бет}} барды.",
-    "wlheader-enotif": "Эл. почта бла хапар бериу джандырылыбды.",
+    "wlheader-enotif": "E-mail бла хапар бериу джандырылыбды.",
     "wlheader-showupdated": "Ахыр кириуюгюзден сора бетни тюрлениулери '''къалын''' джазыу бла кёргюзюлгенди.",
     "watchmethod-recent": "кёзде тургъан бетледе этилген ахыр тюрлениуле кёрюу",
     "watchmethod-list": "кёзде тургъан бетледе этилген ахыр тюрлениуле кёрюу",
     "watchlist-options": "Кёзде тургъан тизмени джарашдырыулары",
     "watching": "Кёзде тургъан тизмеге къошуу...",
     "unwatching": "Кёзде тургъан тизмеден кетериу...",
-    "enotif_mailer": "{{SITENAME}} Билдириу Почта",
     "enotif_reset": "Бютеу бетлени къаралгъанча белгиле",
     "enotif_impersonal_salutation": "{{SITENAME}} къошулуучу",
     "enotif_lastvisited": "Ахыр кириуюгюзден бу кереге дери болгъан бютеу тюрлениулени кёрюр ючюн $1-ге къара.",
     "excontent": "ичиндеги: $1",
     "excontentauthor": "ичиндеги: «$1» (юлюш къошхан джангыз къошулуучу [[Special:Contributions/$2|$2]] эди)",
     "exbeforeblank": "Кетериуню алындагъы ичи: '$1'",
-    "exblank": "бет бош эди",
     "delete-confirm": "«$1» — кетериу",
     "delete-legend": "Кетер",
     "historywarning": "'''Эсгериу:''' кетериле тургъан бетни $1 {{PLURAL:$1|1=версиялы|версиялы}} тарихи барды:",
     "rollback": "Тюрлендириулени ызына ал",
     "rollback_short": "Ызына ал",
     "rollbacklink": "ызына къайтарыу",
+    "rollbacklinkcount": "$1 {{PLURAL:$1|тюрлендириуню ызына|тюрлендириуню ызларына}} тёнгерет",
     "rollbackfailed": "Ызына алыу джетишимсизди",
     "cantrollback": "Бетге ахыр юлюш къошхан къошулуучу, бетге юлюшюн къошхан джангыз адам болгъаны себебли, тюрлендириуле ызына алыналмайдыла.",
     "alreadyrolled": "[[User:$2|$2]] ([[User talk:$2|сюзюу]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]) джанындан [[:$1]] бетде этилген ахыр тюрлендириу ызына алыналмайды;\nбашха бири бетде тюрлендириу этди неда бетни ызына алды.\n\nАхыр тюрлендириуюню этген: [[User:$3|$3]] ([[User talk:$3|сюзюу]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
     "protect-title": "\"$1\" ючюн къоруулау дараджаны сайлагъыз",
     "protect-title-notallowed": "«$1» джакълау дараджагъа къара",
     "prot_1movedto2": "[[$1]] бетни джангы аты: [[$2]]",
+    "protect-norestrictiontypes-title": "Джакъланмаучу бет",
     "protect-legend": "Къоруулауну къабыл эт",
     "protectcomment": "Чурум:",
     "protectexpiry": "Бошалады:",
     "protect-locked-blocked": "Тергеу джазыуугъуз джасакъ болса, бетни къоруулауну дараджасын тюрлендиреллик тюлсюз.\n'''$1''' бетдеги бусагъатдагъы параметрле:",
     "protect-locked-dblock": "Актив билги базаны киритленнгени себебли, коъруулау параметрлени тюрлендиреллик тюлсюз.\n'''$1''' бет ючюн бусагъатдагъы параметрле:",
     "protect-locked-access": "Сизге хакъ джетмейди бетни джакълау дараджасын тюрлендирирге. '''$1''' бетни бусагъатдагъы джакълау джарашдырыулары:",
-    "protect-cascadeon": "Бу бет {{PLURAL:$1|1=тюбюнде белгиленнген бетге|тюбюнде белгиленнген бетлеге}} къошулгъаны ючюн джакъланыбды. Ол {{PLURAL:$1|1=бетде|бетледе}} каскадлы джакълау салыныб турады. Сиз бу бетни джакълау дараджасын тюрлендирирге боллукъсуз, алай а ол каскад джакълауну тюрледирлик тюлдю.",
+    "protect-cascadeon": "Бу бет, {{PLURAL:$1|тюбюнде белгиленнген бетге|тюбюнде белгиленнген бетлеге}} къошулгъаны ючюн джакъланыбды. Ол {{PLURAL:$1|бетде|бетледе}} каскадлы джакълау салыныб турады.\nСиз бу бетни джакълау дараджасын тюрлендирирге боллукъсуз, алай а ол каскад джакълауну тюрледирлик тюлдю.",
     "protect-default": "Джакълаусуз",
     "protect-fallback": "«$1» эркинлик керекди",
     "protect-level-autoconfirmed": "Джангы эм регистрация этмеген къошулуучуладан джакъла",
     "cannotundelete": "Бетни неда медианы сизден алгъа башха къошулуучу ызына къайтаргъаны себебли сизини ызына къайтарыу ишлемигиз джараусузду.",
     "undeletedpage": "'''$1 бет ызына къайтарылды '''\n\nАхыр кетериу бла ызына къайтарыуну кёрюр ючюн [[Special:Log/delete|кетериуню журнал]]ына къарагъыз.",
     "undelete-header": "Кёб болмай кетерилген бетлени кёрюр ючюн [[Special:Log/delete|кетериу журнал]]гъа къарагъыз.",
+    "undelete-search-title": "Кетерилген бетлени изле",
     "undelete-search-box": "Кетерилген бетлени изле",
     "undelete-search-prefix": "Буну бла башланнган бетлине кёргюз:",
     "undelete-search-submit": "Изле",
     "contributions-title": "$1 къошулуучуну къошагъы",
     "mycontris": "Къошум",
     "contribsub2": "{{GENDER:$3|$1}} къошуму ($2)",
+    "contributions-userdoesnotexist": "«$1» тергеу джазыу (аккаунт) регистрацияны ётмегенди.",
     "nocontribs": "Бу критерийлеге келишген тюрлениуле табылмадыла",
     "uctop": "(бусагъатдагъы)",
     "month": "Айдан башлаб (эм алгъаракъ):",
     "sp-contributions-newbies-sub": "Джангы тергеу джазыуладан (аккаунтладан)",
     "sp-contributions-newbies-title": "Джангы тергеу джазыуладан этилген къошакъ",
     "sp-contributions-blocklog": "Блок этиуню журналы",
+    "sp-contributions-suppresslog": "къошулуучуну кетерилген къошуму",
     "sp-contributions-deleted": "къошулуучуну кетерилген тюрлендириулери",
     "sp-contributions-uploads": "джюкленнгенле",
     "sp-contributions-logs": "журналла",
     "whatlinkshere-hidelinks": "$1 джибериуле",
     "whatlinkshere-hideimages": "Файл джибериулени $1",
     "whatlinkshere-filters": "Фильтрле",
+    "autoblockid": "Автоблок #$1",
     "block": "Къошулуучуну блокла",
     "unblock": "Къошулуучуну блок этилиуюн алыу",
     "blockip": "Бу къошулуучуну блок эт",
     "ipusubmit": "Бу тыйгъычны кетер",
     "unblocked": "[[User:$1|$1]]- тыйылыу тохтатылгъанды",
     "unblocked-id": "$1 тыйылыу къоратылгъанды",
+    "blocklist": "Блок этилиннген къошулуучула",
     "ipblocklist": "Блок этилиннген къошулуучула",
     "ipblocklist-legend": "Тыйылгъан къошулуучуну аты",
     "blocklist-timestamp": "Дата/заман",
     "allmessagesname": "Ат",
     "allmessagesdefault": "Оригинал текст",
     "allmessagescurrent": "Хайырлана тургъан текст",
-    "allmessagestext": "Бу тизме MediaWiki ат аламында бар болгъан система билдириулени тизмесиди.\nMediaWiki локализациясына юлюш къошаргъа излей эсегиз, [https://www.mediawiki.org/wiki/Localisation MediaWiki локализация] бла [//translatewiki.net translatewiki.net] сайтлагъа киригиз.",
+    "allmessagestext": "Бу тизме MediaWiki ат аламында бар болгъан система билдириулени тизмесиди.\nMediaWiki локализациясына юлюш къошаргъа излей эсегиз, [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation MediaWiki локализация] бла [//translatewiki.net translatewiki.net] сайтлагъа киригиз.",
     "allmessagesnotsupportedDB": "'''$wgUseDatabaseMessages''' джабыкъ болгъаны ючюн '''{{ns:special}}:Allmessages''' хайырланыугъа ачыкъ тюлдю.",
     "allmessages-filter-legend": "Фильтр",
     "allmessages-filter": "Тюрлендириуюне кёре фильтрлендир:",
     "allmessages-prefix": "Префикс бла фильтр:",
     "allmessages-language": "Тил:",
     "allmessages-filter-submit": "Бар",
+    "allmessages-filter-translate": "Кёчюр",
     "thumbnail-more": "Уллу эт",
     "filemissing": "Файл табылмады",
     "thumbnail_error": "Миниатураны этиуде халат: $1",
     "importunknownsource": "Билинмеген импорт къайнакъ типи",
     "importcantopen": "Импорт этилген файл ачылалмады",
     "importbadinterwiki": "Терс интер-вики джибериу",
-    "importnotext": "Бош неда текст джокъду",
     "importsuccess": "Импорт этилиб бошады!",
-    "importhistoryconflict": "Бар болгъан версияланы арасында уруш (бу бет алгъаракъ импорт этилген болур)",
     "importnosources": "Викиле арасы къайнакъ сайланмагъанды эм  тюрлендириулени тарихини тюз джюклеую джукъланыбды.",
     "importnofile": "Импорт ючюн файл джюкленмегенди.",
     "importuploaderrorsize": "Импорт этилген  файлны джюклеую джетишимсиз болду.\nФайл, эркинлик берилген джюклеу ёлчеминден уллуду.",
     "tooltip-t-contributions": "Къошулуучуну тюрлендирген бетлерине къара",
     "tooltip-t-emailuser": "Бу къошулуучугъа письмо джибер",
     "tooltip-t-upload": "Файлланы джюклеу",
-    "tooltip-t-specialpages": "Бютеу къуллукъчу бетлени тизмеси",
+    "tooltip-t-specialpages": "Бютеу къуллукъ бетлени тизмеси",
     "tooltip-t-print": "Бу бетни басмагъа версиясы",
     "tooltip-t-permalink": "Бетни бу версиясына дайым джибериу",
     "tooltip-ca-nstab-main": "Статьяны ичиндеги",
     "tooltip-ca-nstab-user": "Къошулуучуну бетине къарау",
     "tooltip-ca-nstab-media": "Медиа-файл",
-    "tooltip-ca-nstab-special": "Бу къуллукъчу бетди, тюрлендирилмейди",
+    "tooltip-ca-nstab-special": "Бу къуллукъ бетди, тюрлендирилмейди",
     "tooltip-ca-nstab-project": "Проектни бетине къара",
     "tooltip-ca-nstab-image": "Файлны бетине къара",
     "tooltip-ca-nstab-mediawiki": "Система билдириуге къара",
     "pageinfo-length": "Бетни узунлугъу (байтла бла)",
     "pageinfo-article-id": "Бетни идентификатору",
     "pageinfo-language": "Бетни ичиндегисини тили",
+    "pageinfo-content-model": "Батни ичиндегисини модели",
     "pageinfo-robot-policy": "Излеу къуллукъла бла индексация",
-    "pageinfo-robot-index": "Ð\98ндекÑ\81аÑ\86иÑ\8f Ñ\8dÑ\82иледи",
-    "pageinfo-robot-noindex": "Ð\98ндекÑ\81аÑ\86иÑ\8f Ñ\8dÑ\82илмейди",
+    "pageinfo-robot-index": "ЭÑ\80кинлик Ð±ÐµÑ\80илгенди",
+    "pageinfo-robot-noindex": "ЭÑ\80кинлик Ð±ÐµÑ\80илмегенди",
     "pageinfo-views": "Къарауланы саны",
     "pageinfo-watchers": "Бетни кёзде тутханланы саны",
-    "pageinfo-redirects-name": "Бу бетге редиректле",
+    "pageinfo-redirects-name": "Бу бетге редиректлени саны",
     "pageinfo-firstuser": "Бетле къураучу",
+    "pageinfo-firsttime": "Бетни къуралыу датасы",
     "pageinfo-lastuser": "Ахыр редактор",
+    "pageinfo-lasttime": "Ахыр тюрлениуню датасы",
     "pageinfo-edits": "Бютеу тюрлендириулени саны",
     "pageinfo-authors": "Тюрлю-тюрлю авторланы саны",
     "pageinfo-toolboxlink": "Бетни юсюнден",
     "pageinfo-redirectsto-info": "билги",
     "pageinfo-contentpage-yes": "Хоу",
     "pageinfo-protect-cascading-yes": "Хоу",
+    "pageinfo-category-info": "Категорияны юсюнден информация",
+    "pageinfo-category-pages": "Бетлени саны",
+    "pageinfo-category-subcats": "Тюбкатегорияланы саны",
+    "pageinfo-category-files": "Файлланы саны",
     "skinname-cologneblue": "Кёльн такъылыкъ",
     "skinname-monobook": "Моно-китаб",
     "skinname-modern": "Бусагъатдагъы",
     "imagemaxsize": "Суратны ёлчемини чеги:<br />''(файлны ангылытыу бетле ючюн)''",
     "thumbsize": "Гитче ёлчем:",
     "widthheight": "$1 × $2",
-    "widthheightpage": "$1 × $2, $3 {{PLURAL:$3|1=бет|бет}}",
+    "widthheightpage": "$1 × $2, $3 {{PLURAL:$3|бет}}",
     "file-info": "файлны ёлчеми: $1, MIME типи: $2",
     "file-info-size": "$1 × $2 пиксель, файлны ёлчеми: $3, MIME типи: $4",
     "file-nohires": "Мындан ары ачыкъланнган версиясы джокъду",
     "svg-long-desc": "SVG файл, шартлы $1 × $2 пиксель, файлны ёлчеми: $3",
+    "svg-long-error": "терс SVG-файл: $1",
     "show-big-image": "Чыкъгъан файл",
     "show-big-image-preview": "Ал къарауда уллулугъу: $1.",
+    "show-big-image-other": "Башха {{PLURAL:$2|разрешение|разрешениеле}}: $1.",
     "show-big-image-size": "$1 × $2 пиксель",
     "file-info-gif-looped": "тогъайланнганды",
-    "file-info-gif-frames": "$1 {{PLURAL:$1|1=фрейм|фрейм}}",
+    "file-info-gif-frames": "$1 {{PLURAL:$1|фрейм}}",
     "file-info-png-looped": "тогъайланнганды",
-    "file-info-png-repeat": "$1 {{PLURAL:$1|1=кере|кере}} ойнатылды",
-    "file-info-png-frames": "$1 {{PLURAL:$1|1=фрейм|фрейм}}",
+    "file-info-png-repeat": "$1 {{PLURAL:$1|кере}} ойнатылды",
+    "file-info-png-frames": "$1 {{PLURAL:$1|фрейм}}",
     "newimages": "Джангы файлланы галереясы",
-    "imagelisttext": "Тюбюрекде $2 кёре тизилген '''$1''' {{PLURAL:$1|1=файл|файл}} кёрюнеди.",
+    "imagelisttext": "Тюбюрекде $2 кёре тизилген <strong>$1</strong> {{PLURAL:$1|файл}} кёрюнеди.",
     "newimages-summary": "Бу къуллукъ бет, кёб болмай джюкленнген файлланы кёргюзеди.",
     "newimages-legend": "Фильтр",
     "newimages-label": "Файлны аты (неда кесеги):",
     "ilsubmit": "Таб",
     "bydate": "Хронологиягъа кёре",
     "sp-newimages-showfrom": "$1, $2 замандан башлаб джангы файлланы кёргюз",
-    "seconds": "{{PLURAL:$1|1=$1 секунд|$1 секунд}}",
-    "minutes": "{{PLURAL:$1|1=$1 минут|$1 минут}}",
-    "hours": "{{PLURAL:$1|1=$1 сагъат|$1 сагъат}}",
-    "days": "{{PLURAL:$1|1=$1 кюн|$1 кюн}}",
+    "seconds": "{{PLURAL:$1|$1 секунд}}",
+    "minutes": "{{PLURAL:$1|$1 минут}}",
+    "hours": "{{PLURAL:$1|$1 сагъат}}",
+    "days": "{{PLURAL:$1|$1 кюн}}",
     "weeks": "{{PLURAL:$1|ыйыкъ}}",
     "months": "{{PLURAL:$1|ай}}",
     "years": "{{PLURAL:$1|джыл}}",
     "exif-compression-3": "CCITT Group 3, факс кодлау",
     "exif-compression-4": "CCITT Group 4, факс кодлау",
     "exif-copyrighted-true": "Автор хакъла бла джакъланыбды",
-    "exif-copyrighted-false": "Ð\94жамагÑ\8aаÑ\82 Ð¼Ñ\8eлк",
+    "exif-copyrighted-false": "Ð\90вÑ\82оÑ\80 Ð¾Ð½Ð³Ð½Ñ\83 Ñ\81Ñ\82аÑ\82Ñ\83Ñ\81Ñ\83 Ð±ÐµÑ\80илмегенди",
     "exif-unknowndate": "Билинмеген заман",
     "exif-orientation-1": "Нормал",
     "exif-orientation-2": "Горизонтал бла кёргюзюлгенди",
     "exif-gpslatitude-s": "Къыбыла кенглик",
     "exif-gpslongitude-e": "Кюнчыгъыш узунлукъ",
     "exif-gpslongitude-w": "Кюнбатыш узунлукъ",
-    "exif-gpsaltitude-above-sealevel": "$1 {{PLURAL:$1|1=метрге|метрге}} тенгизден мийик",
-    "exif-gpsaltitude-below-sealevel": "$1 {{PLURAL:$1|1=метрге|метрге}} тенгизден алаша",
+    "exif-gpsaltitude-above-sealevel": "$1 {{PLURAL:$1|метрге}} тенгизден мийик",
+    "exif-gpsaltitude-below-sealevel": "$1 {{PLURAL:$1|метрге}} тенгизден алаша",
     "exif-gpsstatus-a": "Ёлчелеу бошалмагъанды",
     "exif-gpsstatus-v": "Ёлчелеу бошалгъанды",
     "exif-gpsmeasuremode-2": "2-ли координатланы ёлчелеу",
     "imgmultipagenext": "эндиги бет →",
     "imgmultigo": "Кёч!",
     "imgmultigoto": "$1 бетге кёч",
+    "img-lang-default": "(тынгылау бла тил)",
+    "img-lang-info": "Бу суратны $1 тилде кёргюз. $2",
+    "img-lang-go": "Хайыр­ландыр",
     "ascending_abbrev": "гитчеден уллугъа",
     "descending_abbrev": "азалгъан",
     "table_pager_next": "Эндиги бет",
     "livepreview-ready": "Джюклениу... Хазырды!",
     "livepreview-failed": "Джанлы ал къарау джетишимсиз! Нормал ал къарауну сынагъыз.",
     "livepreview-error": "Байланыу этиленмеди: $1 \"$2\".\nНормал ал къарауну хайырланыгъыз.",
-    "lag-warn-normal": "$1 {{PLURAL:$1|1=секундан|секундан}} джангы тюрлендириуле бу тизмеде кёрюнмезге боллукъдула.",
-    "lag-warn-high": "Билги базаны сервериндеги бек кечигиу себебли, $1 {{PLURAL:$1|1=секундан|секундан}} джангы тюрлендириуле бу тизмеде кёрюнмей къалыргъа болур.",
-    "watchlistedit-numitems": "Кёзде тургъан тизмеде {{PLURAL:$1|1=1 джазылгъан|$1 джазылгъан}} барды, сюзюу бетлени тышында.",
+    "lag-warn-normal": "$1 {{PLURAL:$1|секундан}} джангы тюрлендириуле бу тизмеде кёрюнмезге боллукъдула.",
+    "lag-warn-high": "Билги базаны сервериндеги бек кечигиу себебли, $1 {{PLURAL:$1|секундан}} джангы тюрлендириуле бу тизмеде кёрюнмей къалыргъа болур.",
+    "watchlistedit-numitems": "Кёзде тургъан тизмеде {{PLURAL:$1|1 джазылгъан|$1 джазылгъан}} барды, сюзюу бетлени тышында.",
     "watchlistedit-noitems": "Кёзюгюзде тургъан тизмегизде бир джазылгъан да джокъду.",
     "watchlistedit-normal-title": "Чынчыкълау спизокню тюрлендир",
     "watchlistedit-normal-legend": "Кёзюгюзде тургъан тизмегизден джазылгъанланы кетериу",
     "watchlistedit-normal-explain": "Кёзде тургъан тизмедеги бетле тюбюрекде кёргюзюлгендиле.\nДжазылгъанланы кетерир ючюн, къатындагъы тёртгюлчюкде белгилеб, «{{int:Watchlistedit-normal-submit}}» тиекден басыгъыз.\nСиз дагъыда [[Special:EditWatchlist/raw|тизмени текст кибик тюрлендирирге]] боллукъсуз.",
     "watchlistedit-normal-submit": "Башлыкъланы кетер",
-    "watchlistedit-normal-done": "{{PLURAL:$1|1=1 джазылгъан|$1 джазылгъан}}, кёзюгюзде тургъан тизмегизден кетерилди:",
+    "watchlistedit-normal-done": "{{PLURAL:$1|1 джазылгъан|$1 джазылгъан}}, кёзюгюзде тургъан тизмегизден кетерилди:",
     "watchlistedit-raw-title": "Кёзде тургъан «чий» тизмени тюрлендир",
     "watchlistedit-raw-legend": "Кёзде тургъан «чий» тизмени тюрлендир",
     "watchlistedit-raw-explain": "Кёзюгюзде тургъан тизмегиздеги бетле тюбюнде кёрюнедиле. Хар тизгинде бир башлыкъ болады, бетлени къошуб неда кетериб тизмени тюрлендирирге боллукъсуз.\nБошалса, «{{int:Watchlistedit-raw-submit}}» деген тиекден басыгъыз.\n[[Special:EditWatchlist|Стандарт тюрлендириу]] бла да хайырланаллыкъсыз.",
     "watchlistedit-raw-titles": "Башлыкъла:",
     "watchlistedit-raw-submit": "Кёзде тургъан тизмени сакъла",
     "watchlistedit-raw-done": "Кёзюгюзде тургъан тизмегиз сакъланнганды.",
-    "watchlistedit-raw-added": "{{PLURAL:$1|1=1 башлыкъ|$1 башлыкъ}} къошулду:",
-    "watchlistedit-raw-removed": "{{PLURAL:$1|1=1 башлыкъ|$1 башлыкъ}} кетерилди:",
+    "watchlistedit-raw-added": "{{PLURAL:$1|1 башлыкъ|$1 башлыкъ}} къошулду:",
+    "watchlistedit-raw-removed": "{{PLURAL:$1|1 башлыкъ|$1 башлыкъ}} кетерилди:",
     "watchlisttools-view": "Тизмеден бетледе тюрлениуле",
     "watchlisttools-edit": "Тизмеге къарау эм тюрлендириу",
     "watchlisttools-raw": "Текстча тюрлендириу",
     "version-hook-name": "Тутуучуну аты",
     "version-hook-subscribedby": "Абонент болгъан",
     "version-version": "(Версия $1)",
-    "version-license": "Лицензия",
+    "version-license": "MediaWiki'ни лицензиясы",
+    "version-ext-colheader-name": "Кенгериу",
+    "version-ext-colheader-description": "Ачыкълау",
+    "version-ext-colheader-credits": "Авторла",
+    "version-license-title": "$1 ючюн лицензия",
     "version-poweredby-credits": "Бу вики '''[https://www.mediawiki.org/ MediaWiki]''' программа бла ишлейди, copyright © 2001-$1 $2.",
     "version-poweredby-others": "башхала",
     "version-license-info": "MediaWiki эркин программа джазыуду, сиз аны GNU General Public License лицензияны (эркин программа джазыуланы фонду чыгъаргъан; экинчи версиясы неда андан кеч къайсысы да) шартларына кёре джаяргъа эмда/неда тюрлендирирге боллукъсуз.\n\nMediaWiki хайырлы боллукъду деген умут бла джайылады, алай а БИР ТЮРЛЮ БИР ГАРАНТИЯСЫЗДЫ, КОММЕРЦИЯЛЫКЪ неда ЭНЧИ БИР НЮЗЮРГЕ ДЖАРАРЫКЪ гаратияласыз огъунады. Толуракъ билгиле кёрюр ючюн GNU General Public License лицензиягъа къарагъыз.\n\nБу программа бла бирге  [{{SERVER}}{{SCRIPTPATH}}/COPYING GNU General Public License лицензияны копиясы] болургъа керекди, джокъ эсе Free Software Foundation, Inc. комапиягъа джазыгъыз (адреси: 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA) неда [//www.gnu.org/licenses/old-licenses/gpl-2.0.html лицензияны онлайн окъугъуз].",
     "version-entrypoints": "Кириу нохталаны адреслери",
     "version-entrypoints-header-entrypoint": "Кириу нохта",
     "version-entrypoints-header-url": "URL",
+    "redirect-submit": "Кёч",
+    "redirect-lookup": "Излеу:",
+    "redirect-value": "Магъана:",
+    "redirect-user": "Къошулуучуну ID'си",
+    "redirect-page": "Бетни ID'си",
+    "redirect-revision": "Бетни версиясы",
+    "redirect-file": "Файлны аты",
     "fileduplicatesearch": "Дубликат файлланы изле",
     "fileduplicatesearch-summary": "Хэш-кодлары бла дубликат файланны изле.",
     "fileduplicatesearch-legend": "Дубликатланы изле",
     "fileduplicatesearch-submit": "Таб",
     "fileduplicatesearch-info": "$1 × $2 пиксель<br />Файлны ёлчеми: $3<br />MIME-тип: $4",
     "fileduplicatesearch-result-1": "«$1» файлны келишген дубликаты джокъду",
-    "fileduplicatesearch-result-n": "«$1» файлны {{PLURAL:$2|1=1 келишген дубликатыi|$2 келишген дубликаты}} барды.",
+    "fileduplicatesearch-result-n": "«$1» файлны {{PLURAL:$2|1 келишген дубликаты|$2 келишген дубликаты}} барды.",
     "fileduplicatesearch-noresults": "«$1» деген файл табылмады.",
     "specialpages": "Къуллукъ бетле",
-    "specialpages-note": "* Тюз къуллукъчу бетле.\n* <span class=\"mw-specialpagerestricted\">Кирирге эркинлик чекленнген къуллукъчу бетле.</span>\n* <span class=\"mw-specialpagecached\">Кэш этилген къуллукъчу бетле (эски болургъа боллукъдула).</span>",
+    "specialpages-note": "* Тюз къуллукъ бетле.\n* <span class=\"mw-specialpagerestricted\">Кирирге эркинлик чекленнген къуллукъ бетле.</span>",
     "specialpages-group-maintenance": "Техника баджарыуну отчетлары",
-    "specialpages-group-other": "Башха къуллукъчу бетле",
+    "specialpages-group-other": "Башха къуллукъ бетле",
     "specialpages-group-login": "Системагъа кириу / Аккаунт къурау",
     "specialpages-group-changes": "Ахыр тюрлендириуле бла журналла",
     "specialpages-group-media": "Медиа-материалланы юсюнден отчетла бла джюклеуле",
     "specialpages-group-pages": "Бетлени тизмелери",
     "specialpages-group-pagetools": "Бет адырла",
     "specialpages-group-wiki": "Билгиле эм адырла",
-    "specialpages-group-redirects": "Ð\94жибеÑ\80ген ÐºÑ\8aÑ\83ллÑ\83кÑ\8aÑ\87Ñ\83 бетле",
+    "specialpages-group-redirects": "Ð\94жибеÑ\80иÑ\83Ñ\87Ñ\8e ÐºÑ\8aÑ\83ллÑ\83кÑ\8a бетле",
     "specialpages-group-spam": "Спамгъа къаршчы адырла",
     "blankpage": "Бош бет",
     "intentionallyblankpage": "Бу бет, иш этиб, бош къоюлгъанды.",
     "tags": "Джараулу тюрлендириу белгиле",
     "tag-filter": "[[Special:Tags|Тег]] фильтр:",
     "tag-filter-submit": "Фильтрлендир",
+    "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|Эн|Энле}}]]: $2)",
     "tags-title": "Тегле",
     "tags-intro": "Бу бет, джазылыуну тюрлениуюню кёргюзюрге боллукъ теглени эм аланы ангыламларыны тизмесиди.",
     "tags-tag": "Тегни аты",
     "tags-display-header": "Тюрлендириулени тизмелеринде кёрюнюу",
     "tags-description-header": "Магъананы толу ангылтыуу",
+    "tags-active-header": "Тирими?",
     "tags-hitcount-header": "Белгиленнген тюрлендириуле",
+    "tags-active-yes": "Хоу",
+    "tags-active-no": "Огъай",
     "tags-edit": "тюрлендир",
-    "tags-hitcount": "$1 {{PLURAL:$1|1=тюрлениу|тюрлениу}}",
+    "tags-hitcount": "$1 {{PLURAL:$1|тюрлениу}}",
     "comparepages": "Бетлени тенглешдир",
     "compare-page1": "Биринчи бет",
     "compare-page2": "Экинчи бет",
     "compare-rev1": "Биринчи версия",
     "compare-rev2": "Экинчи версия",
     "compare-submit": "Тенглешдир",
+    "compare-title-not-exists": "Белгиленнген башлыкъ джокъду.",
     "dberr-header": "Бу викини проблемасы барды",
     "dberr-problems": "Кечериксиз! Бу сайтда техника джаны бла проблемала чыкъгъандыла.",
     "dberr-again": "Талай минутну сакълаб, джангыдан кириб кёрюгюз.",
     "dberr-info": "(билги базаны сервери бла байлам къурулалмайды: $1)",
+    "dberr-info-hidden": "(Билги базаны сервери бла байлам къурулалмайды)",
     "dberr-usegoogle": "Google сайтны болушлугъу бла излеб кёрюрге боллукъсуз.",
     "dberr-outofdate": "Аны индекси эски болургъа боллугъун унутмагъыз.",
     "dberr-cachederror": "Тюбюндеги бет, изленнген бетни кэш этилген версиясыды, эмда ахыр тюрлендириулени кёргюзмезге болур.",
     "revdelete-uname-unhid": "къошулуучуну аты ачылды",
     "revdelete-restricted": "администраторла ючюн этилген чеклениуле",
     "revdelete-unrestricted": "администратолра ючюн этилген чеклениуле къоратылгъандыла",
-    "logentry-move-move": "$1, $3 бетни атын $4 деб тюрлендирди",
+    "logentry-move-move": "$1, $3 бетни атын $4 деб {{GENDER:$2|тюрлендирди}}",
     "logentry-move-move-noredirect": "$1, $3 бетни атын $4 деб {{GENDER:$2|тюрлендирди}} (редирект къоймагъанлай)",
     "logentry-move-move_redir": "$1, $3 бетни атын $4 деб {{GENDER:$2|тюрлендирди}} (редиректни башы бла)",
     "logentry-move-move_redir-noredirect": "$1, $3 бетни атын $4 деб {{GENDER:$2|тюрлендирди}} (редиректни башы бла эм редирект къурамай)",
-    "logentry-patrol-patrol": "$1, $3 бетни $4 версияын партруль этиб чыкъды",
-    "logentry-patrol-patrol-auto": "$1, $3 бетни $4 версиясын автомат халда тинтиб чыкъды",
+    "logentry-patrol-patrol": "$1, $3 бетни $4 версияын партруль этиб {{GENDER:$2|чыкъды}}",
+    "logentry-patrol-patrol-auto": "$1, $3 бетни $4 версиясын автомат халда тинтиб {{GENDER:$2|чыкъды}}",
     "logentry-newusers-newusers": "$1 тергеу джазыу (аккаунт) {{GENDER:$2|къуралды}}",
-    "logentry-newusers-create": "$1 тергеу джазыу (аккаунт) къуралды",
-    "logentry-newusers-create2": "$1, $3 тергеу джазыуну къурады",
-    "logentry-newusers-autocreate": "$1 тергеу джазыу автомат халда къуралды",
+    "logentry-newusers-create": "$1 тергеу джазыу (аккаунт) {{GENDER:$2|къуралды}}",
+    "logentry-newusers-create2": "$1, $3 тергеу джазыуну {{GENDER:$2|къурады}}",
+    "logentry-newusers-autocreate": "$1 тергеу джазыу автомат халда {{GENDER:$2|къуралды}}",
     "logentry-rights-rights": "$1 къошулуучу, $3 къошулуучуну членлигин $4 къауумдан $5 къауумгъа {{GENDER:$2|кёчюрдю}}",
-    "logentry-rights-rights-legacy": "$1 къошулуучу, $3 къушулуучуну къауумлада членлигин тюрлендирди",
+    "logentry-rights-rights-legacy": "$1 къошулуучу, $3 къушулуучуну къауумлада членлигин {{GENDER:$2|тюрлендирди}}",
     "logentry-rights-autopromote": "$1 къошулуучу, $4 къауумдан автомат халда $5 къауумгъа {{GENDER:$2|кёчюрюлдю}}",
     "rightsnone": "(джокъ)",
     "feedback-subject": "Тема:",
     "searchsuggest-search": "Излеу",
     "searchsuggest-containing": "ичиндегиси…",
     "api-error-badtoken": "Ич халат: терс токен.",
-    "api-error-duplicate-popup-title": " {{PLURAL:$1|1=Файлны|Файлны}} дубликаты",
+    "api-error-duplicate-popup-title": "Дубликат {{PLURAL:$1|файл|файлла}}",
     "api-error-empty-file": "Сиз ийген файлны ичи бошду.",
     "api-error-emptypage": "Ичи бош болгъан джангы бетле къураргъа болмайды.",
     "api-error-file-too-large": "Сиз ийген файл асыры уллуду.",
     "api-error-filename-tooshort": "Файлны аты асыры къысхады.",
     "api-error-filetype-banned": "Быллай типли файлла джасакъланыбдыла.",
-    "api-error-filetype-banned-type": "$1 — {{PLURAL:$4|1=джасакъланнган файл типди|джасакъланнган файл типледиле}}. {{PLURAL:$3|1=Эркинлик берилген файл тип —|Эркинлик берилген файл типле:}} $2.",
+    "api-error-filetype-banned-type": "$1 — {{PLURAL:$4|джасакъланнган файл типди|джасакъланнган файл типледиле}}. {{PLURAL:$3|Эркинлик берилген файл тип —|Эркинлик берилген файл типле:}} $2.",
     "api-error-filetype-missing": "Файлны кенгериую джокъду.",
     "api-error-hookaborted": "Сиз теджеген тюрлендириуню кенгертиуню сюзюучю джасакълагъанды.",
     "api-error-illegal-filename": "Джарамагъан файл ат.",
     "duration-decades": "$1 {{PLURAL:$1|декада}}",
     "duration-centuries": "$1 {{PLURAL:$1|ёмюр}}",
     "duration-millennia": "$1 {{PLURAL:$1|мингджыллыкъ}}",
-    "expandtemplates": "Шаблонланы ачыу"
+    "limitreport-title": "Анализаторну билгилери:",
+    "limitreport-cputime": "Процессорну заманын хайырлан",
+    "limitreport-cputime-value": "$1 {{PLURAL:$1|секунд}}",
+    "limitreport-walltime-value": "$1 {{PLURAL:$1|секунд}}",
+    "limitreport-postexpandincludesize-value": "$1/$2 {{PLURAL:$2|байт}}",
+    "limitreport-templateargumentsize": "Шаблонну арагументини ёлчеми",
+    "limitreport-templateargumentsize-value": "$1/$2 {{PLURAL:$2|байт}}",
+    "expandtemplates": "Шаблонланы ачыу",
+    "expand_templates_title": "{{FULLPAGENAME}} ючюн контекст башлыкъ эм д. а. к.:",
+    "expand_templates_input": "Кириу текст:",
+    "expand_templates_output": "Эсеб",
+    "expand_templates_xml_output": "XML чыгъыш",
+    "expand_templates_html_output": "HTML-чыгъыш",
+    "expand_templates_remove_comments": "Комментарийлени кетер",
+    "expand_templates_remove_nowiki": "Эсебде <nowiki> теглени тый",
+    "expand_templates_generate_xml": "XML'ни тинтиу терегин кёргюз",
+    "expand_templates_generate_rawhtml": "HTML'ни кёргюз",
+    "expand_templates_preview": "Ал къарау"
 }
index bcbcb53..01ba585 100644 (file)
     "disclaimers": "Disklamardèm",
     "disclaimerpage": "Projèkt:Jènèral disklamar",
     "edithelp": "Èdithèp",
-    "helppage": "Help:Kòntèntdèm",
     "mainpage": "Men Pej",
     "mainpage-description": "Men Pej",
     "policy-url": "Project:Pòlisia",
index 9880e24..d2c81e3 100644 (file)
@@ -1,6 +1,13 @@
 {
     "@metadata": {
-        "authors": []
+        "authors": [
+            "Geitost",
+            "Matma Rex",
+            "Purodha",
+            "Reedy",
+            "Rentenirer",
+            "לערי ריינהארט"
+        ]
     },
     "tog-underline": "Dun de Links ungerstriche:",
     "tog-hideminor": "Dun de klein Mini-Änderunge (<strong>M</strong>) en de Liss  met „{{int:Recentchanges}}“ <strong>nit</strong> aanzeije",
     "prefs-skin": "Et Ussinn",
     "skin-preview": "Vör-Ansich",
     "datedefault": "Ejaal - kein Vörliebe",
-    "prefs-beta": "Saache zum Ußprobeere, di schun en Zick lang erproob woode sin",
     "prefs-datetime": "Datum un Uhrzigge",
     "prefs-labs": "Neu Saache zom Ußprobeere, die künnte noch nit akeraat fluppe",
     "prefs-user-pages": "Metmaachersigge",
     "nowatchlist": "En Ding Oppassliss es nix dren.",
     "watchlistanontext": "Do muss $1, domet de en Ding Oppassliss erenluure kanns, oder jet dran ändere.",
     "watchnologin": "Nit enjelogg",
-    "watchnologintext": "Öm Ding Oppassliss ze ändere, mööts de ald [[Special:UserLogin|enjelogg]] sin.",
     "addwatch": "En de Oppassliss don",
     "addedwatchtext": "Die Sigg „[[:$1]]“ es jetz en Dinge [[Special:Watchlist|Oppaßleß]].\nWann di Sigg udder ier Klaafsigg verändert weed, kütt dat af jäz heh en di Oppaßleß.",
     "removewatch": "Us de Oppassliss nämme",
     "sp-contributions-newbies-sub": "För neu Metmaacher",
     "sp-contributions-newbies-title": "Neu Metmaacher ier Beidräsch",
     "sp-contributions-blocklog": "Logboch met Metmaacher-Sperre",
+    "sp-contributions-suppresslog": "verschtoche Beidrääch",
     "sp-contributions-deleted": "Fottjeschmesse Beidrääsch",
     "sp-contributions-uploads": "huhjelaade Dateie",
     "sp-contributions-logs": "Logböcher",
     "sp-contributions-blocked-notice": "Heh dä Metmaacher es em Momang jespert, Dä letzte Enndraach em Logbooch doh drövver kütt jez als ene Henwiiß:",
     "sp-contributions-blocked-notice-anon": "Heh di <i lang=\"en\">IP</i>-Address es em Momang jesperrt.\nDe neuste Sperr ier Enndraach em Logbooch es:",
     "sp-contributions-search": "Söök noh Metmaacher ier Beidräg",
-    "sp-contributions-suppresslog": "verschtoche Beidrääch",
     "sp-contributions-username": "Metmaachername odder IP-Address:",
     "sp-contributions-toponly": "Bloß neuste Versione zeije",
     "sp-contributions-newonly": "Blohß neu aanjelaate Sigge zeije.",
     "allmessagesname": "Name",
     "allmessagesdefault": "Dä standaadmäßije Tex",
     "allmessagescurrent": "Esu es dä Tex jetz",
-    "allmessagestext": "Heh kütt en Liss met Texte, Texstöck, un Nohreechte em Appachtemeng „MediaWiki“ — Do draan Ändere löht et Wiki anders ußsin, dat darf dröm nit Jede maache.\nWenn De jenerell aan [https://www.mediawiki.org/wiki/Localisation MediaWiki singe Översezung] jet anders han wells, do jangk noh [//translatewiki.net translatewiki.net].",
+    "allmessagestext": "Heh kütt en Liss met Texte, Texstöck, un Nohreechte em Appachtemeng „MediaWiki“ — Do draan Ändere löht et Wiki anders ußsin, dat darf dröm nit Jede maache.\nWenn De jenerell aan [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation MediaWiki singe Översezung] jet anders han wells, do jangk noh [//translatewiki.net translatewiki.net].",
     "allmessagesnotsupportedDB": "<strong>Dat wor nix!</strong> Mer künne „{{#special:allmessages}}“ nit zeije, <code>$wgUseDatabaseMessages</code> es usjeschalt!",
     "allmessages-filter-legend": "Ußsöhke — wat för en Täxte o Nohreeshte aazeije?",
     "allmessages-filter": "Zohshtand:",
     "version-entrypoints": "<i lang=\"en\" xml:lang=\"en\">URL</i>s för enzeschteije",
     "version-entrypoints-header-entrypoint": "Enschteesch",
     "version-entrypoints-header-url": "<i lang=\"en\">URL</i>",
-    "version-entrypoints-articlepath": "[https://www.mediawiki.org/wiki/Manual:$wgArticlePath Der Pad noh de Atikele]",
-    "version-entrypoints-scriptpath": "[https://www.mediawiki.org/wiki/Manual:$wgScriptPath Der Pad noh de Skrepte]",
+    "version-entrypoints-articlepath": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgArticlePath Der Pad noh de Atikele]",
+    "version-entrypoints-scriptpath": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgScriptPath Der Pad noh de Skrepte]",
     "redirect": "Ömleide op en Dattei, ene Metmaacher udder de Väsjohn vun ener Sigg",
     "redirect-legend": "Ömleide ob_en Dattei udder Sigg",
     "redirect-summary": "Heh di {{int:specialpage}} leidt öm ob_en Dattei — doh mößd_Er ene Nahme aanjävve, för e Beischpell:[[{{#Special:Redirect}}/file/Example.jpg]] — udder en Sigg — doh mößd_Er en Kännong för, udder en Väsjuhn aanjävve, för e Beischpell esu: [[{{#Special:Redirect}}/page/64308]] udder [[{{#Special:Redirect}}/revision/328429]] — udder en Metmaachersigg — doh mößd_Er enem Metmaacher sing Kännong aanjävve, för e Beischpell: [[{{#Special:Redirect}}/user/101]].",
index ffd0d7b..1efa02f 100644 (file)
     "revisiondelete": "Emendationem delere",
     "revdelete-nooldid-title": "Emendatio-scopus invalida",
     "revdelete-show-file-submit": "Sic",
+    "revdelete-selected-text": "{{PLURAL:$1|Emendatio selecta|Emendationes selectae}} paginae [[:$2]]:",
+    "revdelete-selected-file": "{{PLURAL:$1|Emendatio selecta|Emendationes selectae}} fasciculi [[:$2]]:",
     "revdelete-legend": "Modificare cohibitiones visibilitatis",
     "revdelete-hide-text": "Textus emendationis",
     "revdelete-hide-image": "Celare contentum fasciculi",
     "prefs-skin": "Aspectum",
     "skin-preview": "Praevisum",
     "datedefault": "Nullum praeferentiae",
-    "prefs-beta": "Facultates experimentales",
     "prefs-datetime": "Dies et tempus",
     "prefs-user-pages": "Paginae usoris",
     "prefs-personal": "Minutiae rationis",
     "nowatchlist": "Nullas paginas custodis.",
     "watchlistanontext": "Necesse est $1 ad indicem paginarum custoditarum inspiciendum vel recensendum.",
     "watchnologin": "Conventum non est apertum",
-    "watchnologintext": "[[Special:UserLogin|Conventum aperire]] debes ut indicem paginarum custoditarum mutes.",
     "addedwatchtext": "Pagina \"[[:$1]]\" in [[Special:Watchlist|paginas tuas custoditas]] addita est.\nMutationes posthac huic paginae et paginae disputationis ibi notabuntur.",
     "removedwatchtext": "Pagina \"[[:$1]]\" ex [[Special:Watchlist|indice paginarum custoditarum]] remota est.",
     "watch": "Custodire",
index 8efc1a3..24aeaa9 100644 (file)
     "print": "Drécken",
     "view": "Weisen",
     "edit": "Änneren",
+    "edit-local": "Lokal Beschreiwung änneren",
     "create": "Uleeën",
+    "create-local": "Lokal Beschreiwung derbäisetzen",
     "editthispage": "Dës Säit änneren",
     "create-this-page": "Dës Säit uleeën",
     "delete": "Läschen",
     "accountcreatedtext": "De Benotzerkont fir [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|Diskussioun]]) gouf geschaf.",
     "createaccount-title": "Opmaache vun engem Benotzerkont op {{SITENAME}}",
     "createaccount-text": "Et gouf e Benotzerkont \"$2\" fir Iech op {{SITENAME}} ($4) ugeluecht mat dem Passwuert \"$3\".\nDir sollt Iech aloggen an Äert Passwuert elo änneren.\n\nWann dëse Benotzerkont ongewollt ugeluecht gouf, kënnt Dir dës Noriicht einfach ignoréieren.",
-    "usernamehasherror": "Am Benotzernumm däerfe keng ''hash'' Zeeche sinn",
     "login-throttled": "Dir hutt zevill dacks versicht Iech anzeloggen.\nWaart w.e.g. $1 ier Dir et nach eng Kéier probéiert.",
     "login-abort-generic": "Dir sidd net ageloggt - Aloggen ofgebrach",
     "loginlanguagelabel": "Sprooch: $1",
     "continue-editing": "Gitt weider an de Beräich fir z'änneren",
     "previewconflict": "Dir gesitt an dem ieweschten Textfeld wéi den Text ausgesi wäert, wann Dir späichert.",
     "session_fail_preview": "'''Är Ännerung konnt net gespäichert gi well d'Date vun Ärer Sessioun verluergaange sinn.\nVersicht et w.e.g. nach eng Kéier.\nWann de Problem dann ëmmer nach bestoe sollt, da versicht Iech [[Special:UserLogout|auszeloggen]] an dann erëm anzeloggen.'''",
-    "session_fail_preview_html": "'''Är Ännerung konnt net gespäichert gi well d'Date vun Ärer Sessioun verluergaange sinn.'''\n\n''Well op {{SITENAME}} ''raw HTML'' aktivéiert ass, gouf d'Uweise vun der nach net gespäicherter Versioun ausgeblennt fir JavaScript-Attacken ze vermeiden.''\n\n'''Wann dir eng berechtegt Ännerung maache wëllt, da versicht et w.e.g. nach eng Kéier.\nWann de Problem dann ëmmer nach bestoe sollt, versicht Iech [[Special:UserLogout|auszeloggen]] an dann erëm anzeloggen.'''",
+    "session_fail_preview_html": "<strong>Är Ännerung konnt net gespäichert gi well d'Date vun Ärer Sessioun verluergaange sinn.</strong>\n\n<em>Well op {{SITENAME}} 'raw HTML' aktivéiert ass, gouf d'Uweise vun der nach net gespäicherter Versioun ausgeblennt fir JavaScript-Attacken ze vermeiden.</em>\n\n<strong>Wann Dir eng berechtegt Ännerung maache wëllt, da versicht et w.e.g. nach eng Kéier.\nWann de Problem dann ëmmer nach bestoe sollt, versicht Iech [[Special:UserLogout|auszeloggen]] an dann erëm anzeloggen.</strong>",
     "token_suffix_mismatch": "'''Är Ännerung gouf refuséiert, well Äre Browser Zeechen am Ännerungs-Identifiant verännert huet.'''\nD'Ännerung gouf refuséiert, fir ze verhënneren datt den Text op der Säit onliesbar gëtt.\nDëst geschitt heiansdo wann Dir en anonyme Proxy-Service um Internet benotzt.",
     "edit_form_incomplete": "'''En Deel vum Ännerungsformulaire koum net um Server un; iwwerpréift w.e.g ob Är Ännerunge komplett sinn a probéiert nach emol.'''",
     "editing": "Ännere vu(n) $1",
     "prefs-skin": "Skin",
     "skin-preview": "Kucken",
     "datedefault": "Egal (Standard)",
-    "prefs-beta": "Beta-Funktiounen",
-    "prefs-datetime": "Datum an Auerzäit",
     "prefs-labs": "\"Labs\"-Funktiounen",
     "prefs-user-pages": "Benotzersäiten",
     "prefs-personal": "Benotzerprofil",
     "enhancedrc-history": "Versiounen",
     "recentchanges": "Rezent Ännerungen",
     "recentchanges-legend": "Optioune vun de rezenten Ännerungen",
-    "recentchanges-summary": "Op dëser Säit kënnt Dir déi rezent Ännerungen op '''{{SITENAME}}''' gesinn.",
+    "recentchanges-summary": "Op dëser Säit kënnt Dir déi rezent Ännerungen op dëser Wiki gesinn.",
     "recentchanges-noresult": "Keng Ännerunge während der Period déi ugi gouf passen op de Critère.",
     "recentchanges-feed-description": "Verfollegt mat dësem Feed déi rezent Ännerungen op {{SITENAME}}.",
     "recentchanges-label-newpage": "Dës Ännerung huet eng nei Säit ugeluecht",
     "upload-permitted": "Erlaabt Formater vun de Fichieren: $1.",
     "upload-preferred": "Fichierszorten déi am beschte funktionéieren: $1.",
     "upload-prohibited": "Verbuede Fichiers Formater: $1.",
-    "uploadlog": "Lëscht vun den eropgeluedene Fichieren",
     "uploadlogpage": "Logbuch vum Eroplueden",
     "uploadlogpagetext": "Dëst ass d'Lëscht vun de rezente Fichieren déi eropgeluede goufen.\nKuckt [[Special:NewFiles|d'Gallerie vun de neie Fichieren]] wann Dir méi e visuellen Iwwerbléck wëllt",
     "filename": "Numm vum Fichier",
     "filereuploadsummary": "Ännerunge vum Fichier:",
     "filestatus": "Copyright Status:",
     "filesource": "Quell:",
-    "uploadedfiles": "Eropgeluede Fichieren",
     "ignorewarning": "Warnung ignoréieren an de Fichier nawell späicheren",
     "ignorewarnings": "Ignoréier all Iwwerschreiwungswarnungen",
     "minlength1": "D'Nimm vu Fichiere musse mindestens e Buschtaf am Numm hunn.",
     "overwroteimage": "huet eng nei Versioun vun \"[[$1]]\" eropgelueden",
     "uploaddisabled": "Pardon, d'Eropluede vu Fichieren ass ausgeschalt.",
     "copyuploaddisabled": "D'Eroplueden iwwer URL ass desaktivéiert.",
-    "uploadfromurl-queued": "Dat wat Dir eropgelueden hutt gouf an d'Waardelëscht agedroen.",
     "uploaddisabledtext": "D'Eropluede vu Fichieren ass ausgeschalt.",
     "php-uploaddisabledtext": "D'Eropluede vu Fichieren ass am PHP desaktivéiert. Kuckt w.e.g. d'Astellung ''file_uploads'' no.",
     "uploadscripted": "An dësem Fichier ass HTML- oder Scriptcode, dee vun engem Webbrowser falsch interpretéiert kéint ginn.",
     "upload-misc-error": "Onbekannte Feeler beim Eroplueden",
     "upload-misc-error-text": "Beim Eroplueden ass en onbekannte Feeler geschitt.\nKuckt d'URL w.e.g. no, a vergewëssert iech datt d'Säit online ass a probéiert et dann nach eng Kéier.\nWann de Problem weider besteet, dann un de [[Special:ListUsers/sysop|Administrateuren]].",
     "upload-too-many-redirects": "Et waren zevill Viruleedungen fir d'URL do",
-    "upload-unknown-size": "Onbekannte Gréisst",
     "upload-http-error": "Et ass en HTTP-Feeler geschitt: $1",
     "upload-copy-upload-invalid-domain": "Vun dësem Domain ass d'Eropluede vu Kopien net méiglech.",
     "backend-fail-stream": "De Fichier $1 konnt net iwwerdroe ginn.",
     "img-auth-streaming": "\"$1\" lueden.",
     "img-auth-public": "D'Funktioun img_auth.php erlaabt et fir Fichieren vun enger privater Wiki erauszeginn.\nDës Wiki ass als ëffentlech Wiki konfiguréiert.\nFir eng optimal Sécherheet ass img_auth.php ausgeschalt.",
     "img-auth-noread": "De Benotzer hut keen Zougang fir \"$1\" ze liesen",
-    "img-auth-bad-query-string": "D'URL huet eng net valabel Rei vun Zeechen.",
     "http-invalid-url": "Net-valabel URL: $1",
     "http-invalid-scheme": "URLe mam Schema \"$1\" ginn net ënnerstëtzt",
     "http-request-error": "D'HTTP-Ufro huet wéinst engem onbekannte Feeler net funktionéiert.",
     "filehist-dimensions": "Dimensiounen",
     "filehist-filesize": "Gréisst vum Fichier",
     "filehist-comment": "Bemierkung",
-    "filehist-missing": "Fichier feelt",
     "imagelinks": "Benotze vu Fichieren",
     "linkstoimage": "Dës {{PLURAL:$1|Säit benotzt|Säite benotzen}} dëse Fichier:",
     "linkstoimage-more": "Méi wéi {{PLURAL:$1|eng Säit ass|$1 Säite si}} mat dësem Fichier verlinkt.\nDës Lëscht weist nëmmen {{PLURAL:$1|den éischte Link|déi éischt $1 Linken}} op dëse Fichier.\nEng [[Special:WhatLinksHere/$2|komplett Lëscht]] ass disponibel.",
     "download": "eroflueden",
     "unwatchedpages": "Net iwwerwaacht Säiten",
     "listredirects": "Lëscht vun de Viruleedungen",
+    "listduplicatedfiles": "Lëscht vu Fichiere mat Doublonen",
+    "listduplicatedfiles-entry": "[[:File:$1|$1]] huet [[$3|{{PLURAL:$2|een Doublon|$2 Doublonen}}]].",
     "unusedtemplates": "Net benotzt Schablounen",
     "unusedtemplatestext": "Op dëser Säit stinn all Säiten aus dem {{ns:template}} Nummraum, déi a kenger anerer Säit benotzt ginn. Vergiesst net nozekucken, ob et keng aner Linken op dës Schabloune gëtt, ier Dir eng Schabloun läscht.",
     "unusedtemplateswlh": "Aner Linken",
     "listgrouprights-removegroup-self": "Däerf {{PLURAL:$2|de Grupp|d'Gruppe}} vu sengem eegene Benotzerkont ewechhuelen: $1",
     "listgrouprights-addgroup-self-all": "däerf all Gruppe bei säin eegene Benotzerkont derbäisetzen",
     "listgrouprights-removegroup-self-all": "Däerf all Gruppe vu sengem eegene Benotzerkont ewechhuelen",
+    "listgrouprights-namespaceprotection-header": "Limitatioune vum Nummraum",
+    "listgrouprights-namespaceprotection-namespace": "Nummraum",
+    "listgrouprights-namespaceprotection-restrictedto": "Recht(er), déi dem Benotzer d'Änneren erlaben",
+    "trackingcategories-name": "Numm vum Message",
+    "noindex-category-desc": "D'Säit gëtt net vu Botten indexéiert, well dat magescht Wuert <code><nowiki>__NOINDEX__</nowiki></code> dran ass a well se an engem Nummraum ass, an deem déi Markéierung erlaabt ass.",
+    "hidden-category-category-desc": "Dëst ass eng Kategorie an där <code><nowiki>__HIDDENCAT__</nowiki></code> drasteet, dat verhënnert datt se standardméisseg an der këscht mat de Kategorielinken op der Säit gewise gëtt.",
+    "trackingcategories-nodesc": "Keng Beschreiwung disponibel.",
+    "trackingcategories-disabled": "Kategorie ass desaktivéiert",
     "mailnologin": "Keng E-Mailadress",
     "mailnologintext": "Dir musst [[Special:UserLogin|ageloggt]] sinn an eng gëlteg E-Mail Adress an Ären [[Special:Preferences|Astellungen]] aginn hunn, fir engem anere Benotzer eng E-Mail ze schécken.",
     "emailuser": "Dësem Benotzer eng E-Mail schécken",
     "emailuser-title-notarget": "Dem Benotzer eng E-Mail schécken",
     "emailpage": "Dem Benotzer eng E-Mail schécken",
     "emailpagetext": "Dir kënnt mat dësem Formulaire {{GENDER:$1|dësem Benotzer}} en E-Mail-Message schécken.\nD'E-Mail-Adress, déi Dir an [[Special:Preferences|Ären Astellungen]] aginn hutt, steet an der \"From\" Adress vun der Mail, sou datt den Destinataire Iech direkt äntwerte kann.",
-    "usermailererror": "E-Mail-Objet mellt deen heite Feeler:",
     "defemailsubject": "{{SITENAME}} E-Mail vum Benotzer \"$1\"",
     "usermaildisabled": "Benotzer E-Mail ausgeschalt",
     "usermaildisabledtext": "Dir kënnt op dëser Wiki anere Benotzer keng E-Mail schécken",
     "noemailtitle": "Keng E-Mailadress",
     "noemailtext": "Dëse Benotzer huet keng valabel E-Mail-Adress uginn.",
-    "nowikiemailtitle": "Keng E-Mail erlaabt",
     "nowikiemailtext": "Dëse Benotzer wëllt keng E-Maile vun anere Benotzer kréien.",
     "emailnotarget": "Et gëtt keen oder just een net valabele Benotzernumm fir den Empfänger.",
     "emailtarget": "Gitt de Benotzernumm vum Empfänger an",
     "nowatchlist": "Är Iwwerwaachungslëscht ass eidel.",
     "watchlistanontext": "Dir musst $1 fir Säiten op ärer Iwwerwaachungslëscht ze gesinn oder z'änneren.",
     "watchnologin": "Net ageloggt",
-    "watchnologintext": "Dir musst [[Special:UserLogin|ugemellt]] sinn, fir Är Iwwerwaachungslëscht z'änneren.",
     "addwatch": "Op d'Iwwerwaachungslëscht derbäisetzen",
     "addedwatchtext": "D'Säit \"[[:$1]]\" gouf op är [[Special:Watchlist|Iwwerwaachungslëscht]] gesat.\nAll weider Ännerungen op dëser Säit an der associéierter Diskussiounssäit ginn hei opgelëscht.",
     "removewatch": "Vun der Iwwerwaachungslëscht erofhuelen",
     "unwatchthispage": "Net méi iwwerwaachen",
     "notanarticle": "Keng Säit",
     "notvisiblerev": "Versioun gouf geläscht",
-    "watchlist-details": "{{PLURAL:$1|1 Säit|$1 Säiten}} sinn op ärer Iwwerwaachungsklëscht (d'Diskussiounssäite net matgezielt).",
+    "watchlist-details": "{{PLURAL:$1|1 Säit|$1 Säiten}} sinn op ärer Iwwerwaachungsklëscht, d'Diskussiounssäiten net matgezielt.",
     "wlheader-enotif": "E-Mail-Notifikatioun ass ageschalt.",
     "wlheader-showupdated": "Säiten déi zanter Ärer leschter Visite geännert goufen, si '''fett''' geschriwwen",
     "watchmethod-recent": "Rezent Ännerunge ginn op iwwerwaacht Säiten iwwerpréift",
     "watching": "Iwwerwaachen …",
     "unwatching": "Net méi iwwerwaachen …",
     "watcherrortext": "Beim Ännere vun den Astellunge vun der Iwwerwaachungslëscht fir \"$1\" ass e Feeler geschitt.",
-    "enotif_mailer": "{{SITENAME}} E-Mail-Informatiounssystem",
     "enotif_reset": "All Säiten als besicht markéieren",
     "enotif_impersonal_salutation": "{{SITENAME}}-Benotzer",
     "enotif_subject_deleted": "D'{{SITENAME}}-Säit $1 gouf vum {{gender:$2|$2}} geläscht",
     "excontent": "Inhalt war: '$1'",
     "excontentauthor": "Op der Säit stoung: '$1' (An als eenzegen dru geschriwwen hat de Benotzer '[[Special:Contributions/$2|$2]]').",
     "exbeforeblank": "Den Inhalt virum Läsche war: '$1'",
-    "exblank": "D'Säit war eidel",
     "delete-confirm": "Läsche vu(n) \"$1\"",
     "delete-legend": "Läschen",
     "historywarning": "'''Opgepasst:''' Déi Säit déi Dir läsche wëllt huet en Historique mat ongeféier $1 {{PLURAL:$1|Versioun|Versiounen}}:",
     "sp-contributions-newbies-sub": "Fir déi Nei",
     "sp-contributions-newbies-title": "Kontributioune vun neie Benotzer",
     "sp-contributions-blocklog": "Spärlescht",
+    "sp-contributions-suppresslog": "geläscht Benotzerkontributiounen",
     "sp-contributions-deleted": "geläscht Kontributiounen",
     "sp-contributions-uploads": "Eropgeluede Fichieren",
     "sp-contributions-logs": "Logbicher",
     "allmessagesname": "Numm",
     "allmessagesdefault": "Standardtext",
     "allmessagescurrent": "Aktuellen Text",
-    "allmessagestext": "Dëst ass eng Lëscht vun alle '''Messagen am MediaWiki:Nummraum, déi vun der MediaWiki-Software benotzt ginn.\nBesicht w.e.g. [https://www.mediawiki.org/wiki/Localisation MediaWiki Localisatioun] an [//translatewiki.net translatewiki.net] wann Dir wëllt bei de MediaWiki Iwwersetzunge matschaffen.",
+    "allmessagestext": "Dëst ass eng Lëscht vun alle '''Messagen am MediaWiki:Nummraum, déi vun der MediaWiki-Software benotzt ginn.\nBesicht w.e.g. [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation MediaWiki Localisatioun] an [//translatewiki.net translatewiki.net] wann Dir wëllt bei de MediaWiki Iwwersetzunge matschaffen.",
     "allmessagesnotsupportedDB": "Dës Säit kann net benotzt gi well '''$wgUseDatabaseMessages''' ausgeschalt ass.",
     "allmessages-filter-legend": "Filter",
     "allmessages-filter": "Filter nom ugepassten Zoustand:",
     "importunknownsource": "Onbekannt Importquell",
     "importcantopen": "De Fichier dee sollt importéiert gi konnt net opgemaach ginn",
     "importbadinterwiki": "Falschen Interwiki-Link",
-    "importnotext": "Eidel oder keen Text",
     "importsuccess": "Den Import ass fäerdeg!",
-    "importhistoryconflict": "Et gëtt Konflikter am Historique vun de Versiounen, (méiglecherweis gouf dës Säit virdrun importéiert).",
     "importnosources": "Fir den Transwiki-Import si keng Quellen definéiert an et ass net méiglech fir Säite mat alle Versiounen aus dem Transwiki-Tëschespäicher eropzelueden.",
     "importnofile": "Et gouf keen importéierte Fichier eropgelueden",
     "importuploaderrorsize": "D'Eropluede vum importéierte Fichier huet net funktionéiert. De Fichier ass méi grouss wéi maximal erlaabt.",
     "filedelete-archive-read-only": "Op den Archiv-Repertoire „$1“ ka vum Webserver aus näischt geschriwwe ginn.",
     "previousdiff": "← Méi al Ännerung",
     "nextdiff": "Méi nei Ännerung →",
-    "mediawarning": "'''Warnung:''' Dës Zort vu Fichier kann e béiswëllege Programmcode enthalen.\nDuerch d'Opmaache vum Fichier kann Äre System beschiedegt ginn.",
+    "mediawarning": "<strong>Warnung:</strong> Dës Zort vu Fichier kann e béiswëllege Programmcode enthalen.\nDuerch d'Opmaache vum Fichier kann Äre System beschiedegt ginn.",
     "imagemaxsize": "Maximal Gréisst fir Biller:<br />''(fir Billerbeschreiwungssäiten)''",
     "thumbsize": "Gréisst vun der Miniatur:",
     "widthheightpage": "$1 × $2, $3 {{PLURAL:$3|Säit|Säiten}}",
     "file-info-png-repeat": "gouf $1 {{PLURAL:$1|mol|mol}} gespillt",
     "file-info-png-frames": "$1 {{PLURAL:$1|Frame|Framen}}",
     "file-no-thumb-animation": "''''Informatioun: Wéinst technesche Limitatioune sinn d'Miniatur-Biller vun dësem Fichier net animéiert.'''",
-    "file-no-thumb-animation-gif": "'''Hiweis: Aus technesche Grënn gi Miniature mat enger héijer Opléisung vu GIF Biller, sou wéi dëst, net animéiert.'''",
+    "file-no-thumb-animation-gif": "<strong>Hiweis: Aus technesche Grënn gi Miniature mat enger héijer Opléisung vu GIF Biller, sou wéi dëst, net animéiert.</strong>",
     "newimages": "Gallerie vun den neie Biller",
     "imagelisttext": "Hei ass eng Lëscht vu(n) '''$1''' {{PLURAL:$1|Fichier|Fichieren}}, zortéiert $2.",
     "newimages-summary": "Dës Spezialsäit weist eng Lëscht mat de Fichieren déi als lescht eropgeluede goufen.",
index 333ce85..bb43de7 100644 (file)
     "prefs-skin": "Къайдадиз ттунин тема",
     "skin-preview": "Сифтедин килигун",
     "datedefault": "Туькlуьрмир",
-    "prefs-beta": "Бета-мумкинвилер",
     "prefs-datetime": "Нумра ва вахт",
     "prefs-labs": "Экспериментдин мумкинвилер",
     "prefs-personal": "Уртахдин профил",
index 554b32d..eda257a 100644 (file)
     "allmessagesname": "Erinnya",
     "allmessagesdefault": "Ebigambo ebya bulijjo",
     "allmessagescurrent": "Ebiriwo kakano",
-    "allmessagestext": "Luno lwe lukalala olw'obubaka obwa sisitemu obw'omu kkuŋŋaanizo erya MediaWiki.\n\nOb'oyagala okuyamba ku kuvvuunula eby'omu MediaWiki yonna, kebera ku [https://www.mediawiki.org/wiki/Localisation MediaWiki Localisation] ne [//translatewiki.net translatewiki.net].",
+    "allmessagestext": "Luno lwe lukalala olw'obubaka obwa sisitemu obw'omu kkuŋŋaanizo erya MediaWiki.\n\nOb'oyagala okuyamba ku kuvvuunula eby'omu MediaWiki yonna, kebera ku [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation MediaWiki Localisation] ne [//translatewiki.net translatewiki.net].",
     "allmessages-filter-legend": "Ensunsula",
     "allmessages-filter": "Londamu:",
     "allmessages-filter-unmodified": "Ebitannakyusibwamu",
index f5d90fd..d858e45 100644 (file)
     "prefs-skin": "{{SITENAME}}-uterlik",
     "skin-preview": "Veurbesjouwing",
     "datedefault": "Gein veurkäör",
-    "prefs-beta": "Bètadeil",
     "prefs-datetime": "Datum en tied",
     "prefs-labs": "Alfadeil",
     "prefs-user-pages": "Gebroekerpagina's",
     "nowatchlist": "D'r sjtit niks op dien volglies.",
     "watchlistanontext": "$1 is verplich om dien volglies in te zeen of te wiezige.",
     "watchnologin": "De bis neet aangemèld",
-    "watchnologintext": "De mós [[Special:UserLogin|aangemèld]] zeen veur 't verangere van dien volglies.",
     "addwatch": "Aan volglies toeveuge",
     "addedwatchtext": "De pagina \"[[:$1]]\" is aan dien [[Special:Watchlist|volglies]] toegeveug.\nToekomstige verangeringe aan dees pagina en de biebehurende euverlèkpagina weure dao vermeld en de pagina weurt '''vèt''' weergegaeve in de [[Special:RecentChanges|lies van recènte verangeringe]].",
     "removewatch": "Van volglies aafhoale",
     "allmessagesname": "Naam",
     "allmessagesdefault": "Obligaten teks",
     "allmessagescurrent": "Hujige teks",
-    "allmessagestext": "Dit is 'n lies van alle systeemberichte besjikbaar in de MediaWiki-naamruumde.\nBezeuk [https://www.mediawiki.org/wiki/Localisation MediaWiki-lokalisatie] en [//translatewiki.net translatewiki.net] es doe wils biedrage aon lokalisatie.",
+    "allmessagestext": "Dit is 'n lies van alle systeemberichte besjikbaar in de MediaWiki-naamruumde.\nBezeuk [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation MediaWiki-lokalisatie] en [//translatewiki.net translatewiki.net] es doe wils biedrage aon lokalisatie.",
     "allmessagesnotsupportedDB": "Deze pagina kan neet gebroek waere omdet '''$wgUseDatabaseMessages''' oet steit.",
     "allmessages-filter-legend": "Filter",
     "allmessages-filter": "Filter óp aangepas:",
index 4d99866..f91cd20 100644 (file)
     "disclaimers": "Kūondõkst",
     "disclaimerpage": "Project:Kūondõkst",
     "edithelp": "Redigīerimiz opātõks",
-    "helppage": "Help:Sižāli",
     "mainpage": "Eḑḑilēḑ",
     "mainpage-description": "Eḑḑilēḑ",
     "portal": "Kubgõnd vǟrõd",
index 65e48d8..c66fd53 100644 (file)
     "watchlist": "Zwa mukoloko di kentezi",
     "mywatchlist": "Zwa mukoloko di kentezi",
     "watchnologin": "A ni sa menuhile",
-    "watchnologintext": "A sa [[Special:UserLogin|menuhile]] di hloli ye ng'i zwa mukoloko di kentezi.",
     "addedwatchtext": "Petulo \"[[:$1]]\" sa vugisize di zwa [[Special:Watchlist|mukoloko di kentezi]].\nPetuhoni di bye petulo e sa bulelezi sa mukolokosize ta, e '''ombelu''' kwa [[Special:RecentChanges|petuho nca]] di kwazidisize akusize.\n\nA sa afi kulobala di zwa mukoloko di kentezi, tampi \"ngambu kentezi\".",
     "removedwatchtext": "Petulo \"[[:$1]]\" sa afi kulobala di zwa mukoloko di kentezi.",
     "watch": "Kentezi",
     "allmessagesname": "Sebu",
     "allmessagesdefault": "Selt orge",
     "allmessagescurrent": "Selt nca",
-    "allmessagestext": "Bye mukoloko sa mukoloko di mulumiwani di MediaWiki poo.\nPlease visit [https://www.mediawiki.org/wiki/Localisation MediaWiki Localisation] and [//translatewiki.net translatewiki.net] if you wish to contribute to the generic MediaWiki localisation.",
+    "allmessagestext": "Bye mukoloko sa mukoloko di mulumiwani di MediaWiki poo.\nPlease visit [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation MediaWiki Localisation] and [//translatewiki.net translatewiki.net] if you wish to contribute to the generic MediaWiki localisation.",
     "thumbnail-more": "Pusize",
     "thumbnail_error": "Bufosi hloli tumbneli: $1",
     "import": "Petulo import",
index 62008b7..fa65b2e 100644 (file)
     "emaildisabled": "ای مالگه نتونه ایمیل بفرسنه",
     "accountcreated": "حساو راس بی",
     "createaccount-title": "حساو راس کرده سی  {{SITENAME}}",
-    "usernamehasherror": "نوم کاربری نتونه شومل نیسه یا هش بوئه",
     "login-throttled": "شما ایسنی فره سی وامین اومائن تلاش کردیته.\n$1 لطفن سی تلاش هنی صبر بکید",
     "login-abort-generic": "اومائن وامین تو شکست حرد-شکست حرده",
     "loginlanguagelabel": "زون:$1",
     "prefs-edits": "شماره ویرایشتا:",
     "prefs-skin": "پوست",
     "skin-preview": "پیش سیل",
-    "prefs-datetime": "وخت و زمون",
     "prefs-user-pages": "بلگیا كارور",
     "prefs-personal": "پروفایل کارور",
     "prefs-rc": "آلشتیا تازه باو",
     "right-editmyprivateinfo": "دونسمنیا شصقی خوتونه ویرایشت بکید(چی نشونی ایمیل،نوم راستکی)",
     "right-importupload": "دئن بلگه یا د یه گل جانیا سوار بیه",
     "right-unwatchedpages": "دیئن نوم گه بلگه یا دیئه نبیه",
+    "right-userrights": "حقوق همه کاروریانه ویرایشت بکید",
+    "right-userrights-interwiki": "حقوق همه کاروریانه د ویکی یا هنی ویرایشت بکید",
     "right-siteadmin": "پاگا دونسمنی نه قلف بکید یا نکید",
     "right-sendemail": "سی کاروریا هنی ایمیل کل بکید",
     "right-passwordreset": "پاسورد ایمیلیا د نو دئه بیه نه بوینیت",
     "action-import": "بلگه یا نه د ویکی هنی وارد بکید",
     "action-importupload": "بلگه یا نه د فایل سوار بیه وارد بکید",
     "action-unwatchedpages": "دیئن نوم گه بلگه یا دیئه نبیه",
+    "action-userrights": "حقوق همه کاروریانه ویرایشت بکید",
+    "action-userrights-interwiki": "حقوق همه کاروریانه د ویکی یا هنی ویرایشت بکید",
     "action-siteadmin": "پاگا دونسمنی نه قلف بکید یا نکید",
     "action-sendemail": "ایمیلیانه کل کو",
     "action-editmywatchlist": "سیل برگ خوتونه ویرایشت بکید",
     "recentchanges-label-minor": "يه ويرايشت كؤچكيه",
     "recentchanges-label-bot": "ای ويرايشت نه يه بوت انجوم ديئه",
     "recentchanges-label-unpatrolled": "ای ويرايشت هنی تيه واداشت نبيه",
+    "recentchanges-legend-heading": "'''میراث:'''",
     "recentchanges-legend-newpage": "(همچنو بوینیت [[ویجه:بلگیا تازه|نوم گه بلگیا تازه]])",
     "rcnotefrom": "د هار آلشتیا د $2 هیئن(د بال د $1 نشون دئه بیه)",
     "rclistfrom": "آلشتیا تازه ایی که وا $1 شرو بیه نشونش بئه",
     "uploadnologin": "وارد نبیه",
     "uploadnologintext": "لطفن $1 سی سوارکرد جانیایا.",
     "uploaderror": "خطا د سوار کردن",
-    "uploadlog": "پهرستنومه سوارکرد",
     "uploadlogpage": "سوارکرد",
     "filename": "نوم فایل",
     "filedesc": "چكسته",
     "fileuploadsummary": "چکسه",
     "filereuploadsummary": "آلشتیا فایل:",
+    "filestatus": "حال و بال کپی رایت",
     "filesource": "سرچشمه:",
-    "uploadedfiles": "جانیایا سواربیه",
     "ignorewarnings": "د هر زنهار تیه پوشی کو",
     "badfilename": "نوم جانیا د \"$1\" آلشت بیه.",
     "empty-file": "فایلی که دئی ته حالی بیه.",
     "overwroteimage": "یه گل نسقه تازه د \"[[$1]]\" سوار بیه",
     "uploaddisabled": "سوار کردن د کار نئ.",
     "copyuploaddisabled": "سوار کردن وا یو آر ال د کار نئ.",
-    "uploadfromurl-queued": "سوارکرد تو ها د گئ.",
     "uploaddisabledtext": "سوار کرد فایلیا د کار نئ.",
     "uploadinvalidxml": "ایکس ام الی که سوار بیه نبوئه نوتیج با.",
     "upload-source": "سرچشمه فایل",
     "upload-proto-error": "پروتکل نادروس",
     "upload-file-error": "خطا مینونه",
     "upload-misc-error": "خطا سوار کرد ناشناخته",
-    "upload-unknown-size": "انازه نادیار",
     "upload-copy-upload-invalid-domain": "ورداشتن سوارکردیا د ای پوشگئر د دسرس نئ.",
     "backend-fail-notexists": "فایل $1 وجود ناره.",
     "backend-fail-delete": "نبوئه جانیا $1 پاک بوئه",
     "filehist-dimensions": "بعديا",
     "filehist-filesize": "انازه فایل",
     "filehist-comment": "نظر",
-    "filehist-missing": "گم بیئن جانیا",
     "imagelinks": "استفاده د فايل",
     "linkstoimage": "دمال بيه {{PLURAL:$1|ديس ونيا بلگه|$1 ديس ون بلگيا}} دای فایل:",
     "nolinkstoimage": "ایچه هیژ بلگه ای سی هوم پیوند بیئن وا ای فایل نی",
     "mywatchlist": "سیل برگ",
     "watchlistfor2": "سي $1 $2",
     "watchnologin": "وارد نبیه",
-    "watchnologintext": "شما سی آلشت دئن سیل برگتو با [[ویجه:وامین اومائن کارور|وامین اومائه]]",
     "watch": "سيل كردن",
     "watchthispage": "ديئن ای بلگه",
     "unwatch": "ديه نبيه",
     "watchlist-options": "گزینیا سیل برگ",
     "watching": "د حال دیئن...",
     "unwatching": "د حال ندیئن...",
-    "enotif_mailer": "{{نوم سیلجا}} وارسیاری ایمیل زننه",
     "enotif_reset": "همه بلگه یا دیئه بینه نشودار بکید",
     "enotif_impersonal_salutation": "{{نوم سیلجا}} کارور",
     "enotif_lastvisited": "همه آلشتیا$1 د اوسه که شما د آخرین بار دیئته بوینیت.",
     "confirm": "مئكم كردن",
     "excontent": "مینونه :\"$1\" بی",
     "exbeforeblank": "مینونه حالی دمایی:\"$1\" بی",
-    "exblank": "بلگه حال بی",
     "delete-confirm": "پاک کردن\"$1\"",
     "delete-legend": "پاك كردن",
     "actioncomplete": "عملكرد كامل بيه",
index eb2691a..5755ddc 100644 (file)
@@ -26,7 +26,8 @@
             "Vilius2001",
             "Vpovilaitis",
             "Xabier Armendaritz",
-            "לערי ריינהארט"
+            "לערי ריינהארט",
+            "Vogone"
         ]
     },
     "tog-underline": "Pabraukti nuorodas:",
     "accountcreatedtext": "Naudotojo paskyra [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|talk]]) buvo sukurta.",
     "createaccount-title": "{{SITENAME}} paskyros kūrimas",
     "createaccount-text": "Projekte {{SITENAME}} ($4) kažkas sukūrė paskyrą „$2“ su slaptažodžiu „$3“ panaudodamas jūsų el. pašto adresą.\nJūs turėtumėte prisijungti ir pasikeisti savo slaptažodį.\n\nJūs galite nekreipti dėmesio į laišką, jei ši paskyra buvo sukurta per klaidą.",
-    "usernamehasherror": "Naudotojo vardas negali turėti grotelių simbolio",
     "login-throttled": "Jūs pernelyg daug kartų bandėte prisijungti.\nPalaukite prieš bandant vėl.",
     "login-abort-generic": "Jūsų prisijungimas buvo nesėkmingas - Nutraukta",
     "loginlanguagelabel": "Kalba: $1",
     "prefs-skin": "Išvaizda",
     "skin-preview": "Peržiūra",
     "datedefault": "Jokio pasirinkimo",
-    "prefs-beta": "Beta funkcijos",
-    "prefs-datetime": "Data ir laikas",
     "prefs-labs": "Bandomosios funkcijos",
     "prefs-user-pages": "Naudotojo puslapiai",
     "prefs-personal": "Naudotojo profilis",
     "upload-permitted": "Leidžiami failų tipai: $1.",
     "upload-preferred": "Pageidautini failų tipai: $1.",
     "upload-prohibited": "Uždrausti failų tipai: $1.",
-    "uploadlog": "įkėlimų sąrašas",
     "uploadlogpage": "Įkėlimų sąrašas",
     "uploadlogpagetext": "Žemiau pateikiamas paskutinių failų įkėlimų sąrašas.\nTaip pat galite peržvelgti [[Special:NewFiles|naujausių failų galeriją]].",
     "filename": "Failo vardas",
     "filereuploadsummary": "Failo pakeitimai:",
     "filestatus": "Autorystės teisės:",
     "filesource": "Šaltinis:",
-    "uploadedfiles": "Įkelti failai",
     "ignorewarning": "Ignoruoti įspėjimą ir išsaugoti failą vistiek.",
     "ignorewarnings": "Ignuoruoti bet kokius įspėjimus",
     "minlength1": "Failo pavadinimas turi būti bent viena raidė.",
     "overwroteimage": "įkėlė naują „[[$1]]“ versiją",
     "uploaddisabled": "Įkėlimai uždrausti",
     "copyuploaddisabled": "Įkėlimas pagal URL išjungtas.",
-    "uploadfromurl-queued": "Jūsų įkėlimas įtrauktas į eilę.",
     "uploaddisabledtext": "Failų įkėlimai yra uždrausti.",
     "php-uploaddisabledtext": "Failų įkėlimai uždrausti PHP nustatymuose.\nPatikrinkite ''file_uploads'' nustatą.",
     "uploadscripted": "Šis failas turi HTML arba programinį kodą, kuris gali būti klaidingai suprastas interneto naršyklės.",
     "upload-misc-error": "Nežinoma įkėlimo klaida",
     "upload-misc-error-text": "Įvyko nežinoma klaida vykstant įkėlimui. Prašome patikrinti, kad URL teisingas bei pasiekiamas ir pamėginkite vėl. Jei problema lieka, susisiekite su [[Special:ListUsers/sysop|administratoriumi]].",
     "upload-too-many-redirects": "URL yra per daug kartų peradresuotas",
-    "upload-unknown-size": "Nežinomas dydis",
     "upload-http-error": "Įvyko HTTP klaida: $1",
     "upload-copy-upload-invalid-domain": "Pakrovimų kopijos yra neleidžiamos iš šio domeno.",
     "backend-fail-stream": "Negali būti apdorotas failas $1.",
     "img-auth-streaming": "Siunčiamas „$1“.",
     "img-auth-public": "img_auth.php paskirtis yra pateikti failus iš privačių projektų.\nŠis projektas sukonfigūruotas kaip viešasis.\nDėl saugumo, img_auth.php yra išjungtas.",
     "img-auth-noread": "Naudotojas neturi teisės peržiūrėti „$1“.",
-    "img-auth-bad-query-string": "URL neteisingas užklausos eilutę.",
     "http-invalid-url": "Neleistinas URL: $1",
     "http-invalid-scheme": "URL su priedėliu „$1“ nepalaikomi.",
     "http-request-error": "HTTP užklausa nepavyko dėl nežinomos klaidos.",
     "filehist-dimensions": "Matmenys",
     "filehist-filesize": "Failo dydis",
     "filehist-comment": "Komentaras",
-    "filehist-missing": "Failo nėra",
     "imagelinks": "Failų panaudojimas",
     "linkstoimage": "{{PLURAL:$1|Šis puslapis|Šie puslapiai}} nurodo į šį failą:",
     "linkstoimage-more": "Daugiau nei $1 {{PLURAL:$1|puslapis|puslapiai|puslapių}} rodo į šį failą.\nŠis sąrašas rodo tik {{PLURAL:$1|puslapio|pirmų $1 puslapių}} nuorodas į šį failą.\nYra pasiekiamas ir [[Special:WhatLinksHere/$2|visas sąrašas]].",
     "emailuser-title-notarget": "El. pašto vartotojas",
     "emailpage": "Siųsti el. laišką naudotojui",
     "emailpagetext": "Jūs gali pasinaudoti šia forma norėdami nusiųsti el. laišką šiam naudotojui.\nEl. pašto adresas, kurį įvedėte [[Special:Preferences|savo naudotojo nustatymuose]], bus rodomas kaip el. pašto siuntėjo adresas, tam, kad gavėjas galėtų jums iškart atsakyti.",
-    "usermailererror": "Pašto objektas grąžino klaidą:",
     "defemailsubject": "{{SITENAME}} el. pašto iš vartotojo \" $1 \"",
     "usermaildisabled": "Naudotojo elektroninis paštas išjungtas",
     "usermaildisabledtext": "Jūs negalite siūlsti el. laiško kitiems šio wiki projekto naudotojams.",
     "noemailtitle": "Nėra el. pašto adreso",
     "noemailtext": "Šis naudotojas nėra nurodęs teisingo el. pašto adreso, arba yra pasirinkęs negauti el. pašto iš kitų naudotojų.",
-    "nowikiemailtitle": "El. laiškai neleidžiami",
     "nowikiemailtext": "Šis naudotojas yra pasirinkęs negauti elektroninių laiškų iš kitų naudotojų.",
     "emailnotarget": "Nesamas arba neteisingas vartotojo vardas gavėjui.",
     "emailtarget": "Įveskite vartotojo vardą gavėjo",
     "nowatchlist": "Neturite nei vieno stebimo puslapio.",
     "watchlistanontext": "Prašome $1, kad peržiūrėtumėte ar pakeistumėte elementus savo stebimųjų sąraše.",
     "watchnologin": "Neprisijungęs",
-    "watchnologintext": "Jums reikia būti [[Special:UserLogin|prisijungusiam]], kad pakeistumėte savo stebimųjų sąrašą.",
     "addwatch": "Pridėti į stebimųjų sąrašą",
     "addedwatchtext": "Puslapis „[[:$1]]“ pridėtas į [[Special:Watchlist|stebimųjų sąrašą]].\nBūsimi puslapio bei atitinkamo aptarimo puslapio pakeitimai bus rodomi stebimųjų puslapių sąraše,\ntaip pat bus '''paryškinti''' [[Special:RecentChanges|naujausių keitimų sąraše]], kad išsiskirtų iš kitų puslapių.",
     "removewatch": "Pašalinti iš stebimųjų sąrašo",
     "watching": "Įtraukiama į stebimųjų sąrašą...",
     "unwatching": "Šalinama iš stebimųjų sąrašo...",
     "watcherrortext": "Keičiant jūsų stebėjimo nustatymus puslapiui „$1“ įvyko klaida.",
-    "enotif_mailer": "{{SITENAME}} Pranešimų sistema",
     "enotif_reset": "Pažymėti visus puslapius kaip aplankytus",
     "enotif_impersonal_salutation": "{{SITENAME}} naudotojau",
     "enotif_subject_deleted": "{{GENDER:$2|Naudotojas}} ištrynė puslapį $1, priklausantį projektui {{SITENAME}}",
     "excontent": "buvęs turinys: „$1“",
     "excontentauthor": "buvęs turinys: „$1“ (redagavo tik „[[Special:Contributions/$2|$2]]“)",
     "exbeforeblank": "prieš ištrinant turinys buvo: „$1“",
-    "exblank": "puslapis buvo tuščias",
     "delete-confirm": "Ištrinti „$1“",
     "delete-legend": "Trynimas",
     "historywarning": "'''Dėmesio:''' Trinamas puslapis turi istoriją su maždaug $1 {{PLURAL:$1|versija|versijomis|versijų}}:",
     "allmessagesname": "Pavadinimas",
     "allmessagesdefault": "Pradinis tekstas",
     "allmessagescurrent": "Dabartinis tekstas",
-    "allmessagestext": "Čia pateikiamas sisteminių pranešimų sąrašas, esančių MediaWiki vardų srityje.\nAplankykite [https://www.mediawiki.org/wiki/Localisation „MediaWiki“ lokaliziciją] ir [//translatewiki.net „translatewiki.net“], jei norite prisidėti prie bendrojo „MediaWiki“ lokalizavimo.",
+    "allmessagestext": "Čia pateikiamas sisteminių pranešimų sąrašas, esančių MediaWiki vardų srityje.\nAplankykite [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation „MediaWiki“ lokaliziciją] ir [//translatewiki.net „translatewiki.net“], jei norite prisidėti prie bendrojo „MediaWiki“ lokalizavimo.",
     "allmessagesnotsupportedDB": "Šis puslapis nepalaikomas, nes nuostata '''$wgUseDatabaseMessages''' yra išjungtas.",
     "allmessages-filter-legend": "Filtras",
     "allmessages-filter": "Filtruoti pagal būseną:",
     "importunknownsource": "Nežinomas importo šaltinio tipas",
     "importcantopen": "Nepavyksta atverti importo failo",
     "importbadinterwiki": "Bloga tarpprojektinė nuoroda",
-    "importnotext": "Tuščia arba jokio teksto",
     "importsuccess": "Importas užbaigtas!",
-    "importhistoryconflict": "Yra konfliktuojanti istorijos versija (galbūt šis puslapis buvo importuotas anksčiau)",
     "importnosources": "Nenustatyti transwiki importo šaltiniai, o tiesioginis praeities įkėlimas uždraustas.",
     "importnofile": "Nebuvo įkeltas joks importo failas.",
     "importuploaderrorsize": "Importavimo failo įkėlimas nepavyko. Failas didesnis nei leidžiamas dydis.",
     "tags": "Leistinos keitimų žymės",
     "tag-filter": "[[Special:Tags|Žymų]] filtras:",
     "tag-filter-submit": "Filtras",
+    "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|Žyma|Žymos}}]]: $2)",
     "tags-title": "Žymos",
     "tags-intro": "Šiame puslapyje yra žymų, kuriomis programinė įranga gali pažymėti keitimus, sąrašas bei jų reikšmės.",
     "tags-tag": "Žymos pavadinimas",
index 3d59b9f..a55ee5c 100644 (file)
@@ -1,6 +1,26 @@
 {
     "@metadata": {
-        "authors": []
+        "authors": [
+            "Admresdeserv.",
+            "Dark Eagle",
+            "Edgars2007",
+            "FnTmLV",
+            "Geimeris",
+            "Geitost",
+            "GreenZeb",
+            "Kaganer",
+            "Karlis",
+            "Kikos",
+            "Knakts",
+            "Marozols",
+            "Papuass",
+            "Reedy",
+            "Shirayuki",
+            "Srolanh",
+            "Xil",
+            "Yyy",
+            "לערי ריינהארט"
+        ]
     },
     "tog-underline": "Pasvītrot saites:",
     "tog-hideminor": "Paslēpt maznozīmīgus labojumus pēdējo izmaiņu lapā",
     "accountcreated": "Konts izveidots",
     "accountcreatedtext": "Lietotāja konts priekš $1 tika izveidots.",
     "createaccount-title": "Lietotāja konta izveidošana {{grammar:lokatīvs|{{SITENAME}}}}",
-    "usernamehasherror": "Lietotājvārds nevar saturēt hash simbolus",
     "login-throttled": "Jūs esat veicis pārāk daudz pieslēgšanās mēģinājumus.\nLūdzu, uzgaidiet $1 pirms mēģiniet vēlreiz.",
     "login-abort-generic": "Jūsu pieteikšanās bija neveiksmīga — Darbība pārtraukta",
     "loginlanguagelabel": "Valoda: $1",
     "showhideselectedversions": "Rādīt/slēpt izvēlētās versijas",
     "editundo": "atcelt",
     "diff-empty": "(Nav atšķirību)",
+    "diff-multi-sameuser": "({{PLURAL:$1|Viena starpversija|$1 starpversijas}}, ko izdarījis viens lietotājs, nav parādīta{{PLURAL:$1||s}})",
+    "diff-multi-otherusers": "({{PLURAL:$1|Viena starpversija|$1 starpversijas}}, ko {{PLURAL:$2|saglabājis|saglabājuši}} {{PLURAL:$2|viens cits lietotājs|$2 lietotāji}}, nav parādīta{{PLURAL:$1||s}})",
+    "diff-multi-manyusers": "({{PLURAL:$1|Viena starpversija|$1 starpversijas}}, ko saglabājuši vairāk nekā $2 {{PLURAL:$2|lietotājs|lietotāji}}, nav parādīta{{PLURAL:$1||s}})",
     "searchresults": "Meklēšanas rezultāti",
     "searchresults-title": "Meklēšanas rezultāti \"$1\"",
     "toomanymatches": "Tika atgriezti poārāk daudzi rezultāti, lūdzu pamēģini citādāku pieprasījumu",
     "prefs-skin": "Apdare",
     "skin-preview": "Priekšskats",
     "datedefault": "Vienalga",
-    "prefs-beta": "Beta funkcijas",
-    "prefs-datetime": "Datums un laiks",
     "prefs-labs": "Laboratorijas funkcijas",
     "prefs-user-pages": "Lietotāja lapas",
     "prefs-personal": "Lietotāja dati",
     "upload-permitted": "Atļautie failu tipi: $1.",
     "upload-preferred": "Ieteicamie failu tipi: $1.",
     "upload-prohibited": "Aizliegtie failu tipi: $1.",
-    "uploadlog": "augšupielādes reģistrs",
     "uploadlogpage": "Augšupielādes reģistrs",
     "uploadlogpagetext": "Zemāk ir redzams jaunāko augšuplādēto failu saraksts.\nPārskatāmāka versija ir pieejama [[Special:NewFiles|jauno attēlu galerijā]].",
     "filename": "Faila nosaukums",
     "filereuploadsummary": "Faila izmaiņas:",
     "filestatus": "Autortiesību statuss:",
     "filesource": "Izejas kods:",
-    "uploadedfiles": "Augšupielādēja failus",
     "ignorewarning": "Ignorēt brīdinājumu un saglabāt failu",
     "ignorewarnings": "Ignorēt visus brīdinājumus",
     "minlength1": "Failu vārdiem jābūt vismaz vienu simbolu gariem.",
     "overwroteimage": "augšupielādēta jauna \"[[$1]]\" versija",
     "uploaddisabled": "Augšupielāde atslēgta",
     "copyuploaddisabled": "URL augšupielādes nav atļautas.",
-    "uploadfromurl-queued": "Tava augšupielāde tika pievienota rindā.",
     "uploaddisabledtext": "Failu augšupielāde ir atslēgta.",
     "php-uploaddisabledtext": "Failu augšupielāde ir atslēgta PHP.\nLūdzu, pārbaudi file_uploads uzstādījumu.",
     "uploadscripted": "Šis fails satur HTML vai skriptu kodu, kuru, interneta pārlūks, var kļūdas pēc, mēģināt interpretēt (ar potenciāli sliktām sekām).",
     "upload-file-error-text": "Iekšējā kļūda, mēģinot izveidot pagaidu failu uz servera.\nLūdzu, sazinieties ar [[Special:ListUsers/sysop|administratoru.]]",
     "upload-misc-error": "Nezināma augšupielādes kļūda",
     "upload-too-many-redirects": "URL sastāvēja pārāk daudz pāradresāciju",
-    "upload-unknown-size": "Nezināms izmērs",
     "upload-http-error": "HTTP kļūda: $1",
     "backend-fail-stream": "Nevar straumēt failu $1.",
     "backend-fail-backup": "Nevar dublēt failu $1.",
     "filehist-dimensions": "Izmēri",
     "filehist-filesize": "Faila izmērs",
     "filehist-comment": "Komentārs",
-    "filehist-missing": "Fails pazudis",
     "imagelinks": "Faila lietojums",
     "linkstoimage": "{{PLURAL:$1|Šajā lapā ir saite|Šajās $1 lapās ir saites}} uz šo failu:",
     "nolinkstoimage": "Nevienā lapā nav norāžu uz šo attēlu.",
     "emailuser-title-notarget": "Sūtīt e-pastu lietotājam",
     "emailpage": "Sūtīt e-pastu lietotājam",
     "emailpagetext": "Ar šo veidni ir iespējams nosūtīt e-pastu šim lietotājam.\nTā e-pasta adrese, kuru tu esi norādījis [[Special:Preferences|savā izvēļu lapā]], parādīsies e-pasta \"From\" lauciņā, tādejādi saņēmējs varēs tev atbildēt.",
-    "usermailererror": "Pasta objekts atgrieza kļūdu:",
     "defemailsubject": "{{SITENAME}} e-pasts no lietotāja \"$1\"",
     "usermaildisabled": "Lietotāja e-pasts atslēgts",
     "usermaildisabledtext": "Jūs nevarat sūtīt e-pastu citiem lietotājiem šajā viki",
     "noemailtitle": "Nav e-pasta adreses",
     "noemailtext": "Šis lietotājs nav norādījis derīgu e-pasta adresi.",
-    "nowikiemailtitle": "E-pasts nav atļauts",
     "nowikiemailtext": "Šis lietotājs ir vēlējies nesaņemt e-pastu no citiem lietotājiem.",
     "emailnotarget": "Neeksistējošs vai nederīgs saņēmēja lietotājvārds.",
     "emailtarget": "Ievadiet saņēmēja lietotājvārdu",
     "nowatchlist": "Tavā uzraugāmo rakstu sarakstā nav neviena raksta.",
     "watchlistanontext": "Lūdzu $1, lai apskatītu vai labotu savu uzraugāmo rakstu saraksta saturu.",
     "watchnologin": "Neesi iegājis",
-    "watchnologintext": "Tev ir [[Special:UserLogin|jāieiet]], lai mainītu uzraugāmo lapu sarakstu.",
     "addwatch": "Pievienot uzraugāmo lapu sarakstam",
     "addedwatchtext": "Lapa \"[[:$1]]\" ir pievienota [[Special:Watchlist|tevis uzraudzītajām lapām]], kur tiks parādītas izmaiņas, kas izdarītas šajā lapā vai šīs lapas diskusiju lapā, kā arī šī lapa tiks iezīmēta '''pustrekna''' [[Special:RecentChanges|pēdējo izmaiņu lapā]], lai to būtu vieglāk pamanīt.\n\nJa vēlāk pārdomāsi un nevēlēsies vairs uzraudzīt šo lapu, klikšķini uz saites '''neuzraudzīt''' rīku joslā.",
     "removewatch": "Izņemt no uzraugāmo lapu saraksta",
     "watchlist-options": "Uzraugāmo rakstu saraksta opcijas",
     "watching": "Uzrauga...",
     "unwatching": "Neuzrauga...",
-    "enotif_mailer": "{{SITENAME}} paziņojumu izsūtīšana",
     "enotif_reset": "Atzīmēt visas lapas kā apskatītas",
     "enotif_impersonal_salutation": "{{SITENAME}} lietotājs",
     "enotif_lastvisited": "$1 lai apskatītos visas izmaiņas kopš tava pēdējā apmeklējuma.",
     "excontent": "lapas saturs bija: '$1'",
     "excontentauthor": "saturs bija: \"$1\" (vienīgais autors: [[Special:Contributions/$2|$2]])",
     "exbeforeblank": "lapas saturs pirms satura dzēšanas bija šāds: '$1'",
-    "exblank": "lapa bija tukša",
     "delete-confirm": "Dzēst \"$1\"",
     "delete-legend": "Dzēšana",
     "historywarning": "'''Brīdinājums:''' Lapai, ko tu gatavojies dzēst, ir vēsture ar aptuveni $1 {{PLURAL:$1|versiju|versijām}}:",
     "allmessagesname": "Nosaukums",
     "allmessagesdefault": "Noklusētais ziņojuma teksts",
     "allmessagescurrent": "Pašreizējais teksts",
-    "allmessagestext": "Šajā lapā ir visu \"'''MediaWiki:'''\" lapās atrodamo sistēmas paziņojumu uzskaitījums.\nŠos paziņojumus var izmainīt tikai admini. Izmainot tos šeit, tie tiks izmainīti tikai šajā mediawiki instalācijā. Lai tos izmainītu visām pārējām, apskatieties [https://www.mediawiki.org/wiki/Localisation MediaWiki Localisation] un [//translatewiki.net translatewiki.net].",
+    "allmessagestext": "Šajā lapā ir visu \"'''MediaWiki:'''\" lapās atrodamo sistēmas paziņojumu uzskaitījums.\nŠos paziņojumus var izmainīt tikai admini. Izmainot tos šeit, tie tiks izmainīti tikai šajā mediawiki instalācijā. Lai tos izmainītu visām pārējām, apskatieties [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation MediaWiki Localisation] un [//translatewiki.net translatewiki.net].",
     "allmessagesnotsupportedDB": "Šī lapa nedarbojas, tāpēc, ka '''wgUseDatabaseMessages''' nedarbojas.",
     "allmessages-filter-legend": "Filtrs",
     "allmessages-filter": "Filtrēt pēc izmainīšanas statusa:",
     "importunknownsource": "Nezināms importēšanas avota veids",
     "importcantopen": "Nevarēja atvērt importējamo failu",
     "importbadinterwiki": "Slikta starpviki saite",
-    "importnotext": "Tukšs vai nav teksta",
     "importsuccess": "Importēšana pabeigta!",
     "importnosources": "Tiešā hronoloģijas augšuplāde ir atslēgta. Nav definēts neviens ''Transwiki'' importa avots (''source'').",
     "importnofile": "Neviens importējamais fails netika augšupielādēts.",
index 3c4d45a..0246c38 100644 (file)
@@ -1,6 +1,17 @@
 {
     "@metadata": {
-        "authors": []
+        "authors": [
+            "C933103",
+            "Itsmine",
+            "Justincheng12345",
+            "Omnipaedista",
+            "Shinjiman",
+            "Simon Shek",
+            "StephDC",
+            "Super Wang",
+            "Xiaomingyan",
+            "Yanteng3"
+        ]
     },
     "tog-underline": "鏈墊線:",
     "tog-hideminor": "隱近校",
@@ -10,7 +21,7 @@
     "tog-usenewrc": "青出近易(JavaScript)",
     "tog-numberheadings": "生章數",
     "tog-showtoolbar": "多寶列見(JavaScript)",
-    "tog-editondblclick": "纂頁雙擊(JavaScript)",
+    "tog-editondblclick": "雙擊以纂頁",
     "tog-editsectiononrightclick": "纂段右擊標(JavaScript)",
     "tog-rememberpassword": "符節通越(達至$1日)",
     "tog-watchcreations": "哨己撰",
     "gotaccountlink": "登簿",
     "userlogin-resetlink": "君忘登簿所需爾?",
     "userlogin-resetpassword-link": "輸子符節",
+    "userlogin-helplink2": "助登簿",
     "createacct-emailrequired": "電郵",
     "createacct-emailoptional": "電郵 (可選)",
     "createaccountmail": "同郵",
     "accountcreatedtext": "[[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|書]])簿增矣。",
     "createaccount-title": "於{{SITENAME}}增簿",
     "createaccount-text": "有人於{{SITENAME}}用爾之電郵增名為 \"$2\" 之簿 ($4),符節為 \"$3\" 。汝應登,再改符節也。\n\n如簿誤增,爾可略之。",
-    "usernamehasherror": "簿名無含切細符也",
     "login-throttled": "爾多試於此簿登中。\n請候再試之。",
     "login-abort-generic": "登簿未成——棄",
     "loginlanguagelabel": "語:$1",
     "suspicious-userlogout": "爾欲無離也,可由壞瀏覽器或快枝代理呈送之。",
+    "pt-login": "登簿",
+    "pt-login-button": "登簿",
+    "pt-createaccount": "增簿",
+    "pt-userlogout": "去簿",
     "php-mail-error-unknown": "於 PHP mail() 參數現錯",
     "user-mail-no-addy": "遣函豈能無址?",
     "user-mail-no-body": "試遞一空或過短郵",
     "newpassword": "新符節:",
     "retypenew": "重察新符節:",
     "resetpass_submit": "設符再登",
-    "changepassword-success": "爾之符節已改!\n現登簿中...",
+    "changepassword-success": "爾之符節已改!",
+    "changepassword-throttled": "爾多試於此簿登中。\n請候再試之。",
     "resetpass_forbidden": "無改符節",
     "resetpass-no-info": "爾須登簿後方進此頁。",
     "resetpass-submit-loggedin": "改符節",
     "passwordreset-username": "簿名:",
     "passwordreset-domain": "域:",
     "passwordreset-email": "電郵址",
+    "changeemail": "更郵址",
     "changeemail-none": "(無)",
     "changeemail-password": "汝 {{SITENAME}} 之符節",
     "changeemail-cancel": "棄",
     "prefs-skin": "面版",
     "skin-preview": "草覽",
     "datedefault": "原註",
-    "prefs-datetime": "日時",
     "prefs-personal": "概簿",
     "prefs-rc": "近易",
     "prefs-watchlist": "哨站",
     "yournick": "新署名︰",
     "prefs-help-signature": "論版以論事以「<nowiki>~~~~</nowiki>」署名之,換爾之署名與時辰也。",
     "badsig": "無效之自畫。\n查HTML籤之。",
-    "badsiglength": "署名宜簡。",
+    "badsiglength": "署名宜簡,勿逾$1字。",
     "yourgender": "性別︰",
     "gender-unknown": "未",
     "gender-male": "男",
     "action-userrights-interwiki": "纂他wiki上之權",
     "action-siteadmin": "鎖及解鎖其庫",
     "nchanges": "$1易",
+    "enhancedrc-history": "誌",
     "recentchanges": "近易",
     "recentchanges-legend": "近易項",
     "recentchanges-summary": "共筆揮新,悉列於此。",
     "rcnotefrom": "下為自'''$2'''至'''$1'''之易也。",
     "rclistfrom": "自$1起之易也",
     "rcshowhideminor": "$1校",
+    "rcshowhideminor-show": "示",
+    "rcshowhideminor-hide": "藏",
     "rcshowhidebots": "$1僕",
+    "rcshowhidebots-show": "示",
+    "rcshowhidebots-hide": "藏",
     "rcshowhideliu": "$1簿",
+    "rcshowhideliu-show": "示",
+    "rcshowhideliu-hide": "藏",
     "rcshowhideanons": "$1匿名",
+    "rcshowhideanons-show": "示",
+    "rcshowhideanons-hide": "藏",
     "rcshowhidepatr": "$1哨",
+    "rcshowhidepatr-show": "示",
+    "rcshowhidepatr-hide": "藏",
     "rcshowhidemine": "$1吾纂",
+    "rcshowhidemine-show": "示",
+    "rcshowhidemine-hide": "藏",
     "rclinks": "$2日內$1近易。<br />$3",
     "diff": "辨",
     "hist": "誌",
     "upload-permitted": "可之物類:$1。",
     "upload-preferred": "議之物類:$1。",
     "upload-prohibited": "禁之物類:$1。",
-    "uploadlog": "誌獻",
     "uploadlogpage": "誌獻",
     "uploadlogpagetext": "近獻如下。\n看[[Special:NewFiles|新畫獻]]示獻功。",
     "filename": "名",
     "filereuploadsummary": "動:",
     "filestatus": "授權:",
     "filesource": "源:",
-    "uploadedfiles": "進獻",
     "ignorewarning": "強儲之",
     "ignorewarnings": "警略。",
     "minlength1": "名務逾一字元。",
     "overwroteimage": "新置「[[$1]]」矣",
     "uploaddisabled": "進獻已阻",
     "copyuploaddisabled": "由URL之貢被禁也。",
-    "uploadfromurl-queued": "爾之貢已排之。",
     "uploaddisabledtext": "檔之貢被禁也。",
     "php-uploaddisabledtext": "PHP之貢被禁也。查 file_uploads 之。",
     "uploadvirus": "此檔含毒也!\n詳:$1",
     "upload-warning-msg": "爾自[$2]之貢出問。爾可回[[Special:Upload/stash/$1|貢表]]修此問。",
     "upload-proto-error": "協訂錯誤",
     "upload-too-many-redirects": "網址含多轉",
-    "upload-unknown-size": "未知之積",
     "upload-http-error": "發一HTTP之錯:$1",
     "backend-fail-notexists": "無檔 $1 。",
     "backend-fail-alreadyexists": "$1 已含。",
     "listfiles_size": "幅(位元組)",
     "listfiles_description": "述",
     "listfiles_count": "擇",
+    "listfiles-latestversion-yes": "是",
+    "listfiles-latestversion-no": "否",
     "file-anchor-link": "檔",
     "filehist": "檔史",
     "filehist-help": "揀日尋檔。",
     "filehist-dimensions": "度",
     "filehist-filesize": "檔幅",
     "filehist-comment": "註",
-    "filehist-missing": "失檔",
     "imagelinks": "檔所繫者",
     "linkstoimage": "下頁連本檔有$1:",
     "linkstoimage-more": "連檔有多於$1。\n下表示連檔之首$1。\n[[Special:WhatLinksHere/$2|整表]]可供之閱也。",
     "filepage-nofile": "查無此檔。",
     "filepage-nofile-link": "查無此檔,爾可[$1 貢焉]。",
     "uploadnewversion-linktext": "更新此檔",
+    "shared-repo-from": "自$1",
     "shared-repo-name-wikimediacommons": "維基共享",
     "filerevert": "還$1",
     "filerevert-legend": "還檔",
     "unusedtemplateswlh": "支鏈",
     "randompage": "風掀",
     "randompage-nopages": "下列{{PLURAL:$2|名集}}中無頁也:$1",
+    "randomincategory-selectcategory-submit": "往",
     "randomredirect": "任渡",
     "randomredirect-nopages": "「$1」名冊內無渡也。",
     "statistics": "彙統",
     "statistics-users-active": "活簿",
     "statistics-users-active-desc": "早$1日前更動之簿",
     "statistics-mostpopular": "燴炙",
+    "pageswithprop-submit": "往",
     "doubleredirects": "窮渡",
     "doubleredirectstext": "頁下窮渡,迭列以示。首尾宿合,宜正渡之。\n<del>劃</del>已解之。",
     "double-redirect-fixed-move": "[[$1]]遷畢,現渡至[[$2]]",
     "protectedpages": "頁錮",
     "protectedpages-indef": "只示無期之錮",
     "protectedpages-cascade": "只示連串之錮",
+    "protectedpages-page": "頁",
+    "protectedpages-expiry": "屆期",
+    "protectedpages-reason": "因:",
     "listusers": "點簿",
     "listusers-editsonly": "只示有纂之簿",
     "listusers-creationsort": "按先後列之",
     "emailuser": "捎君",
     "emailpage": "捎書",
     "emailpagetext": "表下捎焉,以郵制君。\n署[[Special:Preferences|子簿郵]]以候往返。",
-    "usermailererror": "驛報有誤:",
     "defemailsubject": "{{SITENAME}}來書",
     "usermaildisabled": "無他人之郵",
     "usermaildisabledtext": "無發電郵於wiki上之他戶也",
     "noemailtitle": "無郵",
     "noemailtext": "此君無郵。",
-    "nowikiemailtitle": "無許之郵",
     "nowikiemailtext": "此君謝收郵之。",
+    "emailusername": "簿名:",
     "email-legend": "發郵至{{SITENAME}}之另一簿",
     "emailfrom": "自:",
     "emailto": "致:",
     "nowatchlist": "無哨",
     "watchlistanontext": "$1以治哨",
     "watchnologin": "未登簿",
-    "watchnologintext": "[[Special:UserLogin|登簿]]以治哨。",
     "addedwatchtext": "\"[[:$1]]\"哨派矣。後有易、議者可見於[[Special:Watchlist|哨站]],且'''粗體'''列於[[Special:RecentChanges|近易]]。",
     "removedwatchtext": "\"[[:$1]]\"[[Special:Watchlist|哨]]撤矣。",
     "watch": "派哨",
     "watchlist-options": "哨項",
     "watching": "出陣…",
     "unwatching": "收兵…",
-    "enotif_mailer": "{{SITENAME}}報",
     "enotif_reset": "令為盡閱",
     "enotif_impersonal_salutation": "貴客",
     "enotif_lastvisited": "自子出簿,有易見$1。",
     "excontent": "文乃「$1」",
     "excontentauthor": "文乃「$1」,乃「[[Special:Contributions/$2|$2]]」獨作。",
     "exbeforeblank": "清文前乃為:「$1」",
-    "exblank": "缺頁",
     "delete-confirm": "刪\"$1\"",
     "delete-legend": "刪",
     "historywarning": "警示,此頁約有誌$1:",
     "allmessagesname": "話",
     "allmessagesdefault": "慣話文",
     "allmessagescurrent": "今話文",
-    "allmessagestext": "此列MediaWiki官話。\n如貢正宗MediaWiki本地化,[https://www.mediawiki.org/wiki/Localisation MediaWiki本地化]與[//translatewiki.net translatewiki.net]閱之。",
+    "allmessagestext": "此列MediaWiki官話。\n如貢正宗MediaWiki本地化,[https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation MediaWiki本地化]與[//translatewiki.net translatewiki.net]閱之。",
     "allmessagesnotsupportedDB": "'''$wgUseDatabaseMessages'''閉庫,'''無纂也。",
     "allmessages-filter-legend": "濾",
     "allmessages-filter": "以易濾:",
     "importunknownsource": "入類不明",
     "importcantopen": "入未可啟",
     "importbadinterwiki": "維基內鏈壞",
-    "importnotext": "空檔或無文",
     "importsuccess": "入匯成矣!",
-    "importhistoryconflict": "舊審沖,疑早存焉",
     "importnosources": "互匯而未定入源,審、誌不予直進。",
     "importnofile": "無匯入也。",
     "importuploaderrorsize": "檔未入匯。幅越焉。",
     "spambot_username": "MediaWiki清濫",
     "spam_reverting": "還新審之無鏈$1者。",
     "spam_blanking": "審皆鏈$1,遂令白頁。",
+    "pageinfo-toolboxlink": "文訊",
     "skinname-cologneblue": "馨藍",
     "skinname-monobook": "單書",
     "skinname-modern": "時髦",
index 9b01e23..6446d43 100644 (file)
     "disclaimers": "Kʼabuli na var ixvenu ondepe",
     "disclaimerpage": "Project:Mtelot kʼabuli na var ixvenu ondepe",
     "edithelp": "Muçʼoşi iktirinen?",
-    "helppage": "Help:Doloxe na renanpe",
     "mainpage": "Dudi Butʼkʼa",
     "mainpage-description": "Dudi But'k'a",
     "privacy": "Şinaxeri Hakʼepe",
index e052d4c..2ed1ce9 100644 (file)
     "prefs-skin": "रूप",
     "skin-preview": "पूर्वावलोकन",
     "datedefault": "कोनो मोनपसंद नै",
-    "prefs-beta": "द्वितीय-परीक्षा गुण सभ",
     "prefs-datetime": "दिन आ तिथि",
     "prefs-labs": "प्रायोगिक गुण सभ",
     "prefs-personal": "प्रयोक्ता परिचय",
     "nowatchlist": "अहाँक साकांक्ष-सूचीमे कोनो बौस्तु नै अछि।",
     "watchlistanontext": "कृपा कऽ $1 अहाँक साकांक्ष-सूचीकेँ देखबा वा सम्पादित करबा लेल।",
     "watchnologin": "सम्प्रवेशित नै",
-    "watchnologintext": "अहाँ [[Special:UserLogin|सम्प्रवेशित]] साकांक्ष-सूची संशोधित करबा लेल।",
     "addwatch": "साकांक्ष सूचीमे जोड़ू",
     "addedwatchtext": "पन्ना \"[[:$1]]\" अहाँक [[Special:Watchlist|साकांक्ष सूची]] मे जोड़ल गेल।\nऐ पन्नामे भविष्यक परिवर्तन आ एकर सम्बन्धित चौबटिया पन्ना एतए सूचीबद्ध रहत, आ पन्ना [[Special:RecentChanges|हालक परिवर्तन]]मे '''गाढ़''' देखाएत , जइसँ आसानीसँ एकरा चिन्हल जा सकत।",
     "removewatch": "साकांक्ष सूचीसँ हटाउ",
     "allmessagesname": "नाम",
     "allmessagesdefault": "पूर्वनिर्धारित संदेश पाठ",
     "allmessagescurrent": "अखुनका संदेश पाठ",
-    "allmessagestext": "ई मीडियाविकी नामस्थानमे उपलब्ध संस्थागत संदेशक सूची छी।\nकृपा कऽ देखू [https://www.mediawiki.org/wiki/Localisation MediaWiki Localisation] आ [//translatewiki.net translatewiki.net] जँ अहाँ मीडियाविकीक स्थानिकीकरणक मूलक अनुवादमे योगदान करए चाहै छी।",
+    "allmessagestext": "ई मीडियाविकी नामस्थानमे उपलब्ध संस्थागत संदेशक सूची छी।\nकृपा कऽ देखू [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation MediaWiki Localisation] आ [//translatewiki.net translatewiki.net] जँ अहाँ मीडियाविकीक स्थानिकीकरणक मूलक अनुवादमे योगदान करए चाहै छी।",
     "allmessagesnotsupportedDB": "ई पन्ना प्रयोगमे नै आनल जा सकैए कारण '''$wgUseDatabaseMessages''' अशक्त कएल अछि।",
     "allmessages-filter-legend": "चलनी",
     "allmessages-filter": "अपन हिसाबे अनुकूलित कऽ छाँटू:",
index d403c78..28ceac7 100644 (file)
     "nowatchlist": "Мезеге аш тонь мельгеваномасот.",
     "watchlistanontext": "$1 тонь ванома мельгеваномаста лопат ваноманкса эли петнеманкса.",
     "watchnologin": "Апак сувак",
-    "watchnologintext": "Тондейть эряви [[Special:UserLogin|сувамс]] тонь мельгеваномацень петнеманкса.",
     "addedwatchtext": "Лопась \"[[:$1]]\" сувафнезь тонь [[Special:Watchlist|Мельгеваномасот]].\nСяда тов тя лопать ди мархтонза сюлмаф Корхнема лопать полафнематне кармайхть тякшстафтовома   тя лувомас, сяда тёждяень няевомаснонды синь тага кармайхть сёрмадовома  [[Special:RecentChanges|мекольце полафнематнень лувомас]] '''эчке тяшксса'''.\n\nУлендяряй тонь мяльце тя лопать нардамс тонь мельгеваномастот, люпштак \"аф ваномс мельге\" лопань вярдень виде ужеса.",
     "removedwatchtext": "Лопась \"[[:$1]]\" нардафоль [[Special:Watchlist|тонь мельгеванома лувомастот]].",
     "watch": "Ватт мельге",
     "allmessagesname": "Лем",
     "allmessagesdefault": "Апак полафтт текст",
     "allmessagescurrent": "Тяниень текст",
-    "allmessagestext": "Тя MediaWiki-са васьфневи системонь пачфтематнень лувомась.\nЭняльттяма, сувак [https://www.mediawiki.org/wiki/Localisation MediaWiki Локализациес] ди [//translatewiki.net translatewiki.net-с] кда тонь мяльце тиемс эсь путксце марстонь MediaWiki локализациес.",
+    "allmessagestext": "Тя MediaWiki-са васьфневи системонь пачфтематнень лувомась.\nЭняльттяма, сувак [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation MediaWiki Локализациес] ди [//translatewiki.net translatewiki.net-с] кда тонь мяльце тиемс эсь путксце марстонь MediaWiki локализациес.",
     "allmessagesnotsupportedDB": "Тя лопас аш кода кунцемс сяс мес '''$wgUseDatabaseMessages'''лоткафоль.",
     "allmessages-language": "Кяль:",
     "allmessages-filter-submit": "Ётамс",
index 7ebb8a4..4c05c6a 100644 (file)
     "prefs-skin": "Endrika",
     "skin-preview": "Tsipalotra",
     "datedefault": "Tsy misy safidy",
-    "prefs-beta": "Fitaovana beta",
     "prefs-datetime": "Daty sy ora",
     "prefs-labs": "Fitaovana  « labs »",
     "prefs-user-pages": "Pejim-pikambana",
     "nowatchlist": "Tsy manaraka pejy ianao.",
     "watchlistanontext": "Andana $1 hahafahanao mijery na manova zavatra ao amin'ny pejy arahanao.",
     "watchnologin": "Tsy niditra",
-    "watchnologintext": "Mila [[Special:UserLogin|miditra]] ianao vao afaka manova ny lisitry ny pejy arahanao.",
     "addwatch": "Ampiana ao amin'ny pejy arahana",
     "addedwatchtext": "Voalisitra ao amin'ny [[Special:Watchlist|pejy arahanao]] ilay pejy \"[[:$1]]\". Ny fanovana ho avy ao amin'ilay pejy ary ao amin'ilay pejin-dresaka dia ho voalisitra any.",
     "removewatch": "Alàna amin'ny pejy arahana",
     "allmessagesname": "Anarana",
     "allmessagesdefault": "Dikan-teny tany am-boalohany",
     "allmessagescurrent": "Dikan-teny miasa ankehitriny",
-    "allmessagestext": "Ity dia lisitry ny hafatra hita ao amin'ny anaran-tsehatra MediaWiki.\nAndana vangio ny [https://www.mediawiki.org/wiki/Localisation Fandikana an'i Mediawiki] ary [//translatewiki.net/ translatewiki.net] raha tia handray anjara amin'ny fandikana an'i Mediawiki amin'ny ankapobeny.",
+    "allmessagestext": "Ity dia lisitry ny hafatra hita ao amin'ny anaran-tsehatra MediaWiki.\nAndana vangio ny [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation Fandikana an'i Mediawiki] ary [//translatewiki.net/ translatewiki.net] raha tia handray anjara amin'ny fandikana an'i Mediawiki amin'ny ankapobeny.",
     "allmessagesnotsupportedDB": "Tsy mbola mandeha ny '''{{ns:special}}:Allmessages''' satria tsy mandeha koa ny '''$wgUseDatabaseMessages'''.",
     "allmessages-filter-legend": "Tantavanina",
     "allmessages-filter": "Hanasivana araka ny satam-panovana :",
index 0afee3d..bba0e63 100644 (file)
     "prefs-skin": "Kulik",
     "skin-preview": "Caliak",
     "datedefault": "Indak usah diatua",
-    "prefs-beta": "Baru uji-cubo (Beta)",
     "prefs-datetime": "Tanggal jo wakatu",
     "prefs-labs": "Alaik uji",
     "prefs-user-pages": "Laman pangguno",
     "version-software-product": "Produk",
     "version-software-version": "Versi",
     "version-entrypoints-header-url": "URL",
-    "version-entrypoints-articlepath": "[https://www.mediawiki.org/wiki/Manual:$wgArticlePath Artikel path]",
-    "version-entrypoints-scriptpath": "[https://www.mediawiki.org/wiki/Manual:$wgScriptPath Skrip path]",
+    "version-entrypoints-articlepath": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgArticlePath Artikel path]",
+    "version-entrypoints-scriptpath": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgScriptPath Skrip path]",
     "fileduplicatesearch": "Pancarian berkas duplikat",
     "fileduplicatesearch-summary": "Pancarian berkas duplikat badasaran nilai hash-nyo.",
     "fileduplicatesearch-result-n": "Berkas \"$1\" ado {{PLURAL:$2|$2 duplikat nan samo}}.",
index 4b83e57..36b85bc 100644 (file)
     "permalink": "Постојана врска",
     "print": "Печати",
     "view": "Преглед",
+    "view-foreign": "Погл. на $1",
     "edit": "Уреди",
+    "edit-local": "Уреди локален опис",
     "create": "Создај",
+    "create-local": "Додај локален опис",
     "editthispage": "Уреди ја страницава",
     "create-this-page": "Создај ја оваа страница",
     "delete": "Избриши",
     "pool-timeout": "Истече времето за чекање на заклучувањето",
     "pool-queuefull": "Редицата на барања е полна",
     "pool-errorunknown": "Непозната грешка",
+    "pool-servererror": "Службата на фондовскиот шалтер е недостапна ($1).",
     "aboutsite": "За {{SITENAME}}",
     "aboutpage": "Project:За {{SITENAME}}",
     "copyright": "Содржината е достапна под условите на $1 освен ако не е поинаку наведено.",
     "accountcreatedtext": "Корисничкта сметка за [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|разговор]]) е направена.",
     "createaccount-title": "Создавање на сметка за {{SITENAME}}",
     "createaccount-text": "Некој направил сметка со вашата е-поштенска адреса на {{SITENAME}} ($4) со име „$2“ и  лозинка „$3“.\nБи требало сега да се пријавите и да ја промените вашата лозинка.\n\nМожете да ја занемарите оваа порака ако сметката била направена по грешка.",
-    "usernamehasherror": "Корисничкото име не може да содржи тараба",
     "login-throttled": "Имате премногу обиди за најава за кратко време.\nПочекајте $1 пред да се обидете повторно.",
     "login-abort-generic": "Најавата е неуспешна - Прекинато",
     "loginlanguagelabel": "Јазик: $1",
     "prefs-skin": "Руво",
     "skin-preview": "Преглед",
     "datedefault": "Небитно",
-    "prefs-beta": "Бета-можности",
-    "prefs-datetime": "Датум и време",
     "prefs-labs": "Експериментални можности",
     "prefs-user-pages": "Кориснички страници",
     "prefs-personal": "Кориснички профил",
     "upload-permitted": "Допуштени податотечни типови: $1.",
     "upload-preferred": "Претпочитани податотечни типови: $1.",
     "upload-prohibited": "Недопуштени податотечни типови: $1.",
-    "uploadlog": "дневник на подигања",
     "uploadlogpage": "Дневник на подигања",
     "uploadlogpagetext": "Наведен е список на најновите подигања на податотеки.\nПогледнете ја [[Special:NewFiles|галеријата на нови податотеки]] за визуелен преглед.",
     "filename": "Име на податотеката",
     "filereuploadsummary": "Измени во податотеката:",
     "filestatus": "Copyright статус:",
     "filesource": "Извор:",
-    "uploadedfiles": "Подигнати податотеки",
     "ignorewarning": "Занемари ги предупредувањата и зачувај ја податотеката",
     "ignorewarnings": "Занемари предупредувања",
     "minlength1": "Името на податотеката мора да содржи барем една буква.",
     "overwroteimage": "подигнато нова верзија на „[[$1]]“",
     "uploaddisabled": "Забрана за подигања",
     "copyuploaddisabled": "Подигањето од URL е оневозможено.",
-    "uploadfromurl-queued": "Вашето подигање е ставено во редица.",
     "uploaddisabledtext": "Подигањето на податотеки е оневозможено.",
     "php-uploaddisabledtext": "Подигањето на податотеки е оневозможено во PHP. \nПроверете го нагодувањето file_uploads.",
     "uploadscripted": "Податотеката содржи HTML-код или сценарио што може погрешно да се протолкува во прелистувачот.",
     "upload-misc-error": "Непозната грешка при подигањето",
     "upload-misc-error-text": "Се појави грешка при подигањето.\nПроверете дали URL-адресата е правилна и достапна, па обидете се повторно.\nАко пак се појави проблем, обратете се кај некој [[Special:ListUsers/sysop|администратор]].",
     "upload-too-many-redirects": "Оваа URL адреса содржеше премногу пренасочувања",
-    "upload-unknown-size": "Непозната големина",
     "upload-http-error": "HTTP грешка: $1",
     "upload-copy-upload-invalid-domain": "Примероци од подигањата не се достапни на овој домен.",
     "backend-fail-stream": "Не можев да ја емитувам податотеката $1.",
     "img-auth-streaming": "Емитување „$1“.",
     "img-auth-public": "Функцијата на img_auth.php служи за излез на податотеки од лични викија.\nОва вики е нагодено како јавно вики.\nОд причини на оптимална сигурност, img_auth.php е оневозможен.",
     "img-auth-noread": "Корисникот нема пристап за читање на „$1“.",
-    "img-auth-bad-query-string": "URL-адресата има неважечка низа за барање.",
     "http-invalid-url": "Неважечка URL: $1",
     "http-invalid-scheme": "Не се поддржани URL-адреси со шема „$1“",
     "http-request-error": "Неуспешно HTTP барање поради непозната грешка.",
     "filehist-dimensions": "Димензии",
     "filehist-filesize": "Големина",
     "filehist-comment": "Коментар",
-    "filehist-missing": "Непостоечка податотека",
     "imagelinks": "Употреба на податотеката",
     "linkstoimage": "До оваа податотека {{PLURAL:$1|води следнава страница|водат следниве $1 страници}}:",
     "linkstoimage-more": "Повеќе од {{PLURAL:$1|една страница е поврзана|$1 страници се поврзани}} со оваа податотека.\nСледниов список {{PLURAL:$1|ја прикажува само првата поврзана страница|ги прикажува само првите $1 поврзани страници}} до оваа податотека.\nЦелосен список може да добиете [[Special:WhatLinksHere/$2|тука]].",
     "statistics-header-hooks": "Други статистики",
     "statistics-articles": "Статии",
     "statistics-pages": "Страници",
-    "statistics-pages-desc": "Сите страници на викито, вклучувајќи и страници за разговор, пренасочувања, и.т.н.",
+    "statistics-pages-desc": "Сите страници на викито, вклучувајќи страници за разговор, пренасочувања и тн.",
     "statistics-files": "Подигнати податотеки",
     "statistics-edits": "Број на уредувања од започнувањето на {{SITENAME}}",
     "statistics-edits-average": "Просечен број на уредувања по страница",
     "listgrouprights-removegroup-self": "Може да брише {{PLURAL:$2|група|групи}} од сопствената корисничка сметка: $1",
     "listgrouprights-addgroup-self-all": "Може да ги додаде сите групи на сопствената корисничка сметка",
     "listgrouprights-removegroup-self-all": "Може да ги избрише сите групи од сопствената корисничка сметка",
+    "listgrouprights-namespaceprotection-header": "Ограничувања за именски простори",
+    "listgrouprights-namespaceprotection-namespace": "Именски простор",
+    "listgrouprights-namespaceprotection-restrictedto": "Права што им овозможуваат на корисниците да уредуваат",
+    "trackingcategories": "Следачки категории",
+    "trackingcategories-summary": "На страницава се наведени следачки категории што автоматски се пополнуваат од програмот на МедијаВики. Нивните називи можат да се сменат со измена на соодветните системски пораки во именскиот простор {{ns:8}}.",
+    "trackingcategories-msg": "Следачка категорија",
+    "trackingcategories-name": "Назив на пораката",
+    "trackingcategories-desc": "Критериуми за вклучување",
+    "noindex-category-desc": "Роботите не ја индексираат страницава бидејќи го содржи волшебниот збор <code><nowiki>__NOINDEX__</nowiki></code> и се наоѓа во именски простор кајшто е дозволен.",
+    "index-category-desc": "Страницата содржи <code><nowiki>__INDEX__</nowiki></code> (и се наоѓа во именски простор кајшто ова е дозволено), па затоа се индексира од роботи, што инаку не би било.",
+    "post-expand-template-inclusion-category-desc": "По проширувањето на сите шаблони, страницата е поголема од <code>$wgMaxArticleSize</code>, па затоа некои шаблони не се проширени.",
+    "post-expand-template-argument-category-desc": "По проширување на шаблонски аргумент (нешто во тројни кадрави загради, како на пр. <code>{{{Foo}}})</code>, страницата е поголема од <code>$wgMaxArticleSize</code>.",
+    "expensive-parserfunction-category-desc": "Во страницата има премногу оптоварувачки расчленувачки функции (како <code>#ifexist</code>). Погл. [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit Manual:$wgExpensiveParserFunctionLimit].",
+    "broken-file-category-desc": "Категорјата се става ако страницата содржи неисправна податотечка врска (врска за вметнување на податотека што не постои).",
+    "hidden-category-category-desc": "Ова е категорија што содржи <code><nowiki>__HIDDENCAT__</nowiki></code>, што значи дека по основно не се прикажува во страниците.",
+    "trackingcategories-nodesc": "Нема опис.",
+    "trackingcategories-disabled": "Категоријата е оневозможена",
     "mailnologin": "Нема адреса за праќање",
     "mailnologintext": "Мора да сте [[Special:UserLogin|најавени]] и да имате важечка е-поштенска адреса во вашите [[Special:Preferences|нагодувања]] за да може да праќате е-пошта до други корисници.",
     "emailuser": "Пиши е-пошта на корисникот",
     "emailuser-title-notarget": "Е-пошта за корисникот",
     "emailpage": "Е-пошта",
     "emailpagetext": "Можете да го употребите следниов образец за да му испратите е-пошта на овој {{GENDER:$1|корисник}}.\nАдреса која ја имате наведено во [[Special:Preferences|вашите нагодувања]] ќе се прикаже во полето „Од“ на пораката, со што примачот ќе може да ви одговори директно вам.",
-    "usermailererror": "Настана следната грешка при праќање е-пошта:",
     "defemailsubject": "{{SITENAME}} — писмо од корисникот „$1“",
     "usermaildisabled": "Корисничката е-пошта е оневозможена",
     "usermaildisabledtext": "Не можете да испратите е-порака до дрги корисници на ова вики",
     "noemailtitle": "Нема е-поштенска адреса",
     "noemailtext": "Овој корисник нема наведено важечка е-поштенска адреса.",
-    "nowikiemailtitle": "Не е допуштено користење на е-пошта",
     "nowikiemailtext": "Овој корисник избрал да не прима е-пошта од други корисници.",
     "emailnotarget": "Непостоечко или неважечко корисничко име за примачот.",
     "emailtarget": "Внесете го корисничкото име на примачот",
     "nowatchlist": "Немате ништо во списокот на набљудувања.",
     "watchlistanontext": "Треба да сте $1 за да можете да го прегледувате и уредувате списокот на набљудувања.",
     "watchnologin": "Не сте најавени",
-    "watchnologintext": "Мора да сте [[Special:UserLogin|најавени]] за да го менувате списокот на набљудувања.",
     "addwatch": "Додај во списокот на набљудувања",
     "addedwatchtext": "Страницата „[[:$1]]“ е додадена во [[Special:Watchlist|списокот на набљудувања]].\nИдните промени на оваа страница и нејзината страница за разговор ќе се прикажуваат таму.",
     "removewatch": "Отстрани од списокот на набљудувања",
     "unwatchthispage": "Престани набљудување",
     "notanarticle": "Не е статија",
     "notvisiblerev": "Преработката била избришана",
-    "watchlist-details": "{{PLURAL:$1|$1 страница|$1 страници}} во вашиот список на набљудувања, не броејќи ги страниците за разговор.",
+    "watchlist-details": "{{PLURAL:$1|$1 страница|$1 страници}} во вашиот список на набљудувања, не броејќи ги посебно страниците за разговор.",
     "wlheader-enotif": "Известувањето по е-пошта е вклучено.",
     "wlheader-showupdated": "Страниците што се изменети од вашата последна посета се прикажани со '''задебелени''' букви",
     "watchmethod-recent": "Проверка на скорешните уредувања на набљудуваните страници",
     "watching": "Набљудување...",
     "unwatching": "Отстранувам од набљудувани...",
     "watcherrortext": "Се појави грешка при менувањето на вашите нагодувања списокот на набљудувања за „$1“.",
-    "enotif_mailer": "{{SITENAME}} Систем за известување",
     "enotif_reset": "Означи ги сите страници како посетени",
     "enotif_impersonal_salutation": "Википедија корисник",
     "enotif_subject_deleted": "Страницата $1 на {{SITENAME}} е избришана од {{gender:$2|$2}}",
     "excontent": "содржината беше: '$1'",
     "excontentauthor": "содржината беше: '$1' (и единствениот автор беше '$2')",
     "exbeforeblank": "содржината пред бришењето беше: '$1'",
-    "exblank": "страницата беше празна",
     "delete-confirm": "Избриши „$1“",
     "delete-legend": "Бришење",
     "historywarning": "'''Предупредување:''' Страницата што сакате да ја избришете има историја со околу $1 {{PLURAL:$1|преработка|преработки}}:",
     "contributions-title": "Придонеси на корисникот $1",
     "mycontris": "придонеси",
     "contribsub2": "За {{GENDER:$3|$1}} ($2)",
+    "contributions-userdoesnotexist": "Корисничката сметка „$1“ не е регистрирана.",
     "nocontribs": "Не се пронајдени промени што одговараат на овој критериум.",
     "uctop": "(тековно)",
     "month": "Од месец (и порано):",
     "sp-contributions-newbies-sub": "За нови кориснички сметки",
     "sp-contributions-newbies-title": "Придонеси на нови корисници",
     "sp-contributions-blocklog": "Дневник на блокирања",
+    "sp-contributions-suppresslog": "притаени придонеси на корисникот",
     "sp-contributions-deleted": "избришани придонеси на корисникот",
     "sp-contributions-uploads": "подигања",
     "sp-contributions-logs": "дневници",
     "sp-contributions-blocked-notice": "Овој корисник е блокиран. Последните ставки во дневникот на блокирања, за ваша информација се дадени подолу:",
     "sp-contributions-blocked-notice-anon": "Оваа IP-адреса е моментално блокирана.\nПодолу е наведен најновиот дневнички запис на блокирање:",
     "sp-contributions-search": "Пребарување на придонеси",
-    "sp-contributions-suppresslog": "притаени придонеси на корисникот",
     "sp-contributions-username": "IP-адреса или корисничко име:",
     "sp-contributions-toponly": "Прикажувај само последни преработки",
     "sp-contributions-newonly": "Прикажувај само новосоздадени страници",
     "allmessagesname": "Име",
     "allmessagesdefault": "Текст по основно",
     "allmessagescurrent": "Сегашен текст",
-    "allmessagestext": "Ова е список на системските пораки расположиви за именскиот простор „МедијаВики“.\nОдете на [https://www.mediawiki.org/wiki/Localisation Локализација на МедијаВики] и [//translatewiki.net translatewiki.net] ако сакате да придонесете кон општата локализација на МедијаВики.",
+    "allmessagestext": "Ова е список на системските пораки расположиви за именскиот простор „МедијаВики“.\nОдете на [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation Локализација на МедијаВики] и [//translatewiki.net translatewiki.net] ако сакате да придонесете кон општата локализација на МедијаВики.",
     "allmessagesnotsupportedDB": "Оваа страница не може да се користи бидејќи '''$wgUseDatabaseMessages''' е исклучено.",
     "allmessages-filter-legend": "Филтер",
     "allmessages-filter": "Филтрирај по состојба на прилагодувањето:",
     "importunknownsource": "Непознат тип за внесување",
     "importcantopen": "Не може да се отвори увезената податотека",
     "importbadinterwiki": "Лоша меѓувики-врска",
-    "importnotext": "Празно или без текст",
     "importsuccess": "Увезувањето е завршено!",
-    "importhistoryconflict": "Постои конфликтна историја на верзиите (можно е страницата веќе да била внесена)",
     "importnosources": "Нема определено меѓувики-извори за увоз и директните подигања на историја се оневозможени.",
     "importnofile": "Нема подигнато увозна податотека.",
     "importuploaderrorsize": "Подигањето на увозната податотека не успеа.\nПодатотеката ја надминува допуштената големина.",
     "version-entrypoints": "URL-а на влезните точки",
     "version-entrypoints-header-entrypoint": "Влезна точка",
     "version-entrypoints-header-url": "URL",
-    "version-entrypoints-articlepath": "[https://www.mediawiki.org/wiki/Manual:$wgArticlePath?uselang=mk Статија]",
-    "version-entrypoints-scriptpath": "[https://www.mediawiki.org/wiki/Manual:$wgScriptPath?uselang=mk Скрипта]",
+    "version-entrypoints-articlepath": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgArticlePath?uselang=mk Статија]",
+    "version-entrypoints-scriptpath": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgScriptPath?uselang=mk Скрипта]",
     "redirect": "Пренасочување по податотеки, корисник или назнака на преработка",
     "redirect-legend": "Пренасочување кон податотека или страница",
     "redirect-summary": "Оваа специјална страница пренасочува кон податотека (се задава името), страница (се задава назнаката на преработката или страницата) или корисничка странца (се задава бројчената назнака на корисникот). Употреба: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/revision/328429]] или [[{{#Special:Redirect}}/user/101]].",
     "expand_templates_remove_nowiki": "Притаи <nowiki> ознаки во резултатот",
     "expand_templates_generate_xml": "Прикажи XML-дрво на расчленувањето",
     "expand_templates_generate_rawhtml": "Прикажувај сиров HTML",
-    "expand_templates_preview": "Преглед",
-    "trackingcategories": "Следачки категории",
-    "trackingcategories-summary": "На страницава се наведени следачки категории што автоматски се пополнуваат од програмот на МедијаВики. Нивните називи можат да се сменат со измена на соодветните системски пораки во именскиот простор {{ns:8}}.",
-    "trackingcategories-msg": "Следачка категорија",
-    "trackingcategories-name": "Назив на пораката",
-    "trackingcategories-desc": "Критериуми за вклучување",
-    "noindex-category-desc": "Страницата содржи волшебен збор <nowiki>__NOINDEX__</nowiki> (и се наоѓа во именски простор кајшто е дозволен), па затоа не се индексира од роботи.",
-    "index-category-desc": "Страницата содржи <nowiki>__INDEX__</nowiki> (и се наоѓа во именски простор кајшто ова е дозволено), па затоа се индексира од роботи, што инаку не би било.",
-    "post-expand-template-inclusion-category-desc": "По проширувањето на сите шаблони, страницата е поголема од $wgMaxArticleSize, па затоа некои шаблони не се проширени.",
-    "post-expand-template-argument-category-desc": "По проширување на шаблонски аргумент (нешто во тројни кадрави загради, како на пр. {{{Foo}}}), страницата е поголема од $wgMaxArticleSize.",
-    "expensive-parserfunction-category-desc": "Во страницата има премногу оптоварувачки расчленувачки функции (како #ifexists). Погл. [https://www.mediawiki.org/wiki/Manual:$wgExpensiveParserFunctionLimit Manual:$wgExpensiveParserFunctionLimit].",
-    "broken-file-category-desc": "Категорјата се става ако страницата содржи неисправна податотечка врска (врска за вметнување на податотека што не постои).",
-    "hidden-category-category-desc": "Ова е категорија што содржи <nowiki>__HIDDENCAT__</nowiki>, што значи дека по основно не се прикажува во страниците.",
-    "trackingcategories-nodesc": "Нема опис.",
-    "trackingcategories-disabled": "Категоријата е оневозможена"
+    "expand_templates_preview": "Преглед"
 }
index 564934a..501f2e9 100644 (file)
     "permalink": "സ്ഥിരംകണ്ണി",
     "print": "അച്ചടിയ്ക്കുക",
     "view": "കാണുക",
+    "view-foreign": "$1 സംരംഭത്തിൽ കാണുക",
     "edit": "തിരുത്തുക",
+    "edit-local": "ഇവിടുത്തെ വിവരണം തിരുത്തുക",
     "create": "ഈ താൾ സൃഷ്ടിക്കുക",
+    "create-local": "ഇവിടെ വിവരണം ചേർക്കുക",
     "editthispage": "ഈ താൾ തിരുത്തുക",
     "create-this-page": "ഈ താൾ സൃഷ്ടിക്കുക",
     "delete": "മായ്ക്കുക",
     "pool-timeout": "പൂട്ട് മാറാനുള്ള കാത്തിരിപ്പ് സമയം",
     "pool-queuefull": "പൂൾ ക്യൂ നിറഞ്ഞിരിക്കുന്നു",
     "pool-errorunknown": "അപരിചിതമായ പിഴവ്",
+    "pool-servererror": "പൂൾ കൗണ്ടർ സേവനം ലഭ്യമല്ല ($1).",
     "aboutsite": "{{SITENAME}} സം‌രംഭത്തെക്കുറിച്ച്",
     "aboutpage": "Project:വിവരണം",
     "copyright": "പ്രത്യേകം പറയാത്ത പക്ഷം ഉള്ളടക്കം $1 പ്രകാരം ലഭ്യം.",
     "accountcreatedtext": "[[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|talk]]) എന്ന ഉപയോക്താവിനായി അംഗത്വം സൃഷ്ടിക്കപ്പെട്ടിരിക്കുന്നു.",
     "createaccount-title": "{{SITENAME}} സംരംഭത്തിൽ അംഗത്വം സൃഷ്ടിക്കൽ",
     "createaccount-text": "{{SITENAME}} സംരംഭത്തിൽ ($4) താങ്കളുടെ ഇമെയിൽ വിലാസത്തിൽ ആരോ ഒരു അംഗത്വം \"$2\" എന്ന ഉപയോക്തൃനാമത്തിൽ ഉണ്ടാക്കിയിരിക്കുന്നു (രഹസ്യവാക്ക്: \"$3\").  താങ്കൾ ഇപ്പോൾ ലോഗിൻ ചെയ്തു രഹസ്യവാക്ക് മാറ്റേണ്ടതാകുന്നു.\n\nഅംഗത്വം അബദ്ധവശാൽ ഉണ്ടാക്കിയതാണെങ്കിൽ താങ്കൾക്ക് ഈ സന്ദേശം നിരാകരിക്കാവുന്നതാണ്‌.",
-    "usernamehasherror": "ഉപയോക്തൃനാമത്തിൽ ഹാഷ് ലിപികൾ ഉൾപ്പെടുത്തരുത്",
     "login-throttled": "താങ്കൾ നിരവധി പ്രാവശ്യം ലോഗിൻ ചെയ്യാൻ ശ്രമിച്ചിരിക്കുന്നു.\nപുതിയതായി ശ്രമിക്കുന്നതിനു മുമ്പ് $1 ദയവായി കാത്തിരിക്കുക.",
     "login-abort-generic": "താങ്കളുടെ പ്രവേശിക്കൽ പരാജയപ്പെട്ടു - റദ്ദാക്കപ്പെട്ടിരിക്കുന്നു",
     "loginlanguagelabel": "ഭാഷ: $1",
     "prefs-skin": "ദൃശ്യരൂപം",
     "skin-preview": "എങ്ങനെയുണ്ടെന്നു കാണുക",
     "datedefault": "ക്രമീകരണങ്ങൾ വേണ്ട",
-    "prefs-beta": "പരീക്ഷണാടിസ്ഥാനത്തിലുള്ള സൗകര്യങ്ങൾ",
-    "prefs-datetime": "ദിവസവും സമയവും",
     "prefs-labs": "പരീക്ഷണശാലയിൽ തയ്യാറാകുന്ന സൗകര്യങ്ങൾ",
     "prefs-user-pages": "ഉപയോക്തൃതാളുകൾ",
     "prefs-personal": "എന്നെപ്പറ്റി",
     "upload-permitted": "അനുവദനീയമായ പ്രമാണ തരങ്ങൾ: $1.",
     "upload-preferred": "പ്രോത്സാഹിപ്പിക്കുന്ന പ്രമാണ തരങ്ങൾ: $1.",
     "upload-prohibited": "നിരോധിക്കപ്പെട്ട തരം പ്രമാണങ്ങൾ: $1.",
-    "uploadlog": "അപ്‌ലോഡ് പ്രവർത്തനരേഖ",
     "uploadlogpage": "അപ്‌ലോഡ് രേഖ",
     "uploadlogpagetext": "സമീപകാലത്ത് അപ്‌ലോഡ് ചെയ്ത പ്രമാണങ്ങളുടെ പട്ടിക താഴെ കാണാം.",
     "filename": "പ്രമാണത്തിന്റെ പേര്",
     "filereuploadsummary": "പ്രമാണത്തിലെ മാറ്റങ്ങൾ:",
     "filestatus": "പകർപ്പവകാശത്തിന്റെ സ്ഥിതി:",
     "filesource": "സ്രോതസ്സ്:",
-    "uploadedfiles": "അപ്‌ലോഡ് ചെയ്ത പ്രമാണങ്ങൾ",
     "ignorewarning": "മുന്നറിയിപ്പ് അവഗണിച്ച് പ്രമാണം സേവ് ചെയ്യുക",
     "ignorewarnings": "അറിയിപ്പുകൾ അവഗണിക്കുക",
     "minlength1": "പ്രമാണത്തിന്റെ പേരിൽ ഒരക്ഷരമെങ്കിലും ഉണ്ടാവണം.",
     "overwroteimage": "\"[[$1]]\" എന്ന പ്രമാണത്തിന്റെ പുതിയ പതിപ്പ് അപ്‌ലോഡ് ചെയ്തിരിക്കുന്നു",
     "uploaddisabled": "അപ്‌ലോഡുകൾ പ്രവർത്തനരഹിതമാക്കിയിരിക്കുന്നു.",
     "copyuploaddisabled": "യൂ.ആർ.എൽ. വഴിയുള്ള അപ്‌‌ലോഡ് നിർജ്ജീവമാക്കിയിരിക്കുന്നു.",
-    "uploadfromurl-queued": "താങ്കളുടെ അപ്‌‌ലോഡ് നിർവഹിക്കാൻ ഉൾപ്പെടുത്തിയിരിക്കുന്നു.",
     "uploaddisabledtext": "പ്രമാണം അപ്‌ലോഡ് ചെയ്യുന്നതു സാദ്ധ്യമല്ലാതാക്കിയിരിക്കുന്നു.",
     "php-uploaddisabledtext": "പി.എച്ച്.പി.യിൽ പ്രമാണ അപ്‌‌ലോഡുകൾ സാദ്ധ്യമല്ലാതാക്കിയിരിക്കുന്നു.\nദയവായി file_uploads ക്രമീകരണങ്ങൾ പരിശോധിക്കുക.",
     "uploadscripted": "ഈ പ്രമാണത്തിൽ വെബ് ബ്രൗസർ തെറ്റായി വ്യാഖ്യാനിച്ചേക്കാവുന്ന എച്ച്.റ്റി.എം.എൽ. അല്ലെങ്കിൽ സ്ക്രിപ്റ്റ് കോഡ് ഉണ്ട്.",
     "upload-misc-error": "കാരണം അജ്ഞാതമായ അപ്‌ലോഡ് പിഴവ്",
     "upload-misc-error-text": "അപ്‌ലോഡിങ്ങ് സമയത്ത് അജ്ഞാതമായ പിഴവ് സംഭവിച്ചു.\nദയവായി യൂ.ആർ.എൽ. സാധുവാണോ എന്നും അതു പ്രാപ്യമാണോ എന്നും പരിശോധിച്ചതിനു ശേഷം വീണ്ടും പരിശ്രമിക്കുക.\nതുടർന്നും പ്രശ്നം അവശേഷിക്കുകയാണെങ്കിൽ [[Special:ListUsers/sysop|കാര്യനി‌ർവാഹകരിലൊരാളെ]] സമീപിക്കുക.",
     "upload-too-many-redirects": "യൂ.ആർ.എല്ലിൽ നിരവധി തിരിച്ചുവിടലുകളുണ്ട്",
-    "upload-unknown-size": "വലിപ്പം അറിയില്ല",
     "upload-http-error": "ഒരു എച്ച്.റ്റി.റ്റി.പി. പിഴവു സംഭവിച്ചിരിക്കുന്നു: $1",
     "upload-copy-upload-invalid-domain": "ഈ ഡൊമൈനിൽ നിന്നും പകർത്തി അപ്‌ലോഡ് ചെയ്യൽ ലഭ്യമല്ല.",
     "backend-fail-stream": "$1 എന്ന പ്രമാണം സ്ട്രീം ചെയ്യാൻ കഴിഞ്ഞില്ല.",
     "img-auth-streaming": "സ്ട്രീമിങ് \"$1\".",
     "img-auth-public": "img_auth.php എന്ന ഗുണനിർവഹണം സ്വകാര്യ‌‌വിക്കികളിൽ പ്രമാണങ്ങൾ ഔട്ട്പുട്ട് ചെയ്യുന്നതിനുള്ളതാണ്.\nഈ വിക്കി ഒരു പൊതുജന വിക്കിയായാണ് ക്രമീകരിച്ചിരിക്കുന്നത്.\nസുരക്ഷയ്ക്ക് ഏറ്റവും അനുകൂലിതമായെന്നതിനാൽ img_auth.php നിർജീവമാക്കിയിരിക്കുന്നു.",
     "img-auth-noread": "\"$1\" എടുത്തുനോക്കാൻ ഉപയോക്താവിനു കഴിയില്ല.",
-    "img-auth-bad-query-string": "യൂ.ആർ.എല്ലിൽ അസാധുവായ ക്വറി പദം ഉണ്ട്.",
     "http-invalid-url": "അസാധുവായ യു.ആർ.എൽ.: $1",
     "http-invalid-scheme": "\"$1\" രീതിയിലുള്ള യു.ആർ.എല്ലുകൾ പിന്തുണയ്ക്കുന്നില്ല",
     "http-request-error": "അഭ്യർത്ഥന അയയ്ക്കുന്നതിൽ അപരിചിതമായ പിഴവ്:",
     "filehist-dimensions": "അളവുകൾ",
     "filehist-filesize": "പ്രമാണത്തിന്റെ വലിപ്പം",
     "filehist-comment": "അഭിപ്രായം",
-    "filehist-missing": "പ്രമാണം ലഭ്യമല്ല",
     "imagelinks": "പ്രമാണത്തിന്റെ ഉപയോഗം",
     "linkstoimage": "താഴെ കാണുന്ന {{PLURAL:$1|താളിൽ|$1 താളുകളിൽ}}  ഈ ചിത്രം ഉപയോഗിക്കുന്നു:",
     "linkstoimage-more": "ഈ പ്രമാണത്തിലേയ്ക്ക് {{PLURAL:$1|ഒരു താളിലധികം കണ്ണി|$1 താളിലധികം കണ്ണികൾ}} ഉണ്ട്.\nതാഴെക്കൊടുത്തിരിക്കുന്ന പട്ടിക ഈ പ്രമാണത്തിലേയ്ക്കു മാത്രമുള്ള {{PLURAL:$1|ആദ്യ താളിന്റെ കണ്ണി|ആദ്യ $1 താളുകളുടെ കണ്ണികൾ}} കാട്ടുന്നു.\n[[Special:WhatLinksHere/$2|മുഴുവൻ പട്ടികയും]] ലഭ്യമാണ്.",
     "listgrouprights-removegroup-self": "സ്വന്തം അംഗത്വത്തിൽ നിന്ന് {{PLURAL:$2|സംഘത്തെ|സംഘങ്ങളെ}} നീക്കം ചെയ്യുക: $1",
     "listgrouprights-addgroup-self-all": "എല്ലാ സംഘങ്ങളേയും സ്വന്തം അംഗത്വത്തിൽ ചേർക്കുക",
     "listgrouprights-removegroup-self-all": "സ്വന്തം അംഗത്വത്തിൽ നിന്ന് എല്ലാ സംഘങ്ങളേയും നീക്കംചെയ്യുക",
+    "trackingcategories": "പിന്തുടരൽ വർഗ്ഗങ്ങൾ",
+    "trackingcategories-summary": "ഈ താളിൽ മീഡിയവിക്കി സോഫ്റ്റ്‌വേർ സ്വതേ നിർമ്മിക്കുന്ന പിന്തുടരൽ വർഗ്ഗങ്ങളുടെ പട്ടിക കാണാം. അവയുടെ പേരുകൾ {{ns:8}} നാമമേഖലയിലെ ബന്ധപ്പെട്ട വ്യവസ്ഥാസന്ദേശങ്ങൾ തിരുത്തി മാറ്റാവുന്നതാണ്.",
+    "trackingcategories-msg": "പിന്തുടരൽ വർഗ്ഗം",
+    "trackingcategories-name": "സന്ദേശത്തിന്റെ പേര്",
+    "trackingcategories-desc": "വർഗ്ഗം ഉൾപ്പെടുത്തുന്നതിനുള്ള മാനദണ്ഡം",
+    "noindex-category-desc": "ഈ താളിൽ <code><nowiki>__NOINDEX__</nowiki></code> എന്ന മാന്ത്രികവാക്ക് ഉണ്ട്, അത് അനുവദിച്ചിട്ടുള്ള നാമമേഖലയിലും ആണ്, അതുകൊണ്ടിത് റോബോട്ടുകളാൽ സൂചികാവത്കരിക്കപ്പെടില്ല.",
+    "index-category-desc": "ഈ താളിൽ <code><nowiki>__INDEX__</nowiki></code> എന്ന മാന്ത്രികവാക്ക് ഉണ്ട് (അത് അനുവദിച്ചിട്ടുള്ള നാമമേഖലയിലും ആണ്), അതുകൊണ്ടിത്, സാധാരണഗതിയിൽ പാടില്ലാത്തതാണെങ്കിലും റോബോട്ടുകളാൽ സൂചികാവത്കരിക്കപ്പെടുന്നതാണ്.",
+    "post-expand-template-inclusion-category-desc": "എല്ലാ ഫലകങ്ങളും വികസിപ്പിച്ചു കഴിയുമ്പോൾ, താളിന്റെ വലിപ്പം <code>$wgMaxArticleSize</code> എന്നതിലും കൂടുതലാവുമെന്നതിനാൽ, ചില ഫലകങ്ങൾ വികസിപ്പിച്ചിരുന്നില്ല.",
+    "post-expand-template-argument-category-desc": "ഫലകത്തിലേയ്ക്കുള്ള ചരം വികസിപ്പിച്ച ശേഷം (<code>{{{പന}}}</code> പോലെയുള്ള മൂന്ന് കോഷ്ഠകങ്ങളിലെ എഴുത്ത്), താളിന്റെ വലിപ്പം <code>$wgMaxArticleSize</code> എന്നതിലും കൂടുതലായി.",
+    "expensive-parserfunction-category-desc": "നിരവധി വ്യയമേറിയ പാഴ്സർ ഫങ്ഷനുകൾ ( #എങ്കിൽ പോലെയുള്ളവ) താളിൽ ഉൾപ്പെടുത്തിയിരിക്കുന്നു. [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit Manual:$wgExpensiveParserFunctionLimit] കാണുക.",
+    "broken-file-category-desc": "താളിൽ നിലവിലില്ലാത്ത പ്രമാണത്തിലോട്ട് കണ്ണി ചേർത്തിട്ടുണ്ടെങ്കിൽ വർഗ്ഗം ചേർക്കപ്പെടും.",
+    "hidden-category-category-desc": "ഈ വർഗ്ഗത്തിൽ <code><nowiki>__HIDDENCAT__</nowiki></code> ഉള്ളതിനാൽ, താളുകളിലെ വർഗ്ഗങ്ങളുടെ കണ്ണികൾ കാണിക്കുന്ന പെട്ടിയിൽ സ്വതേ പ്രത്യക്ഷപ്പെടുന്നതല്ല.",
+    "trackingcategories-nodesc": "വിവരണം ലഭ്യമല്ല.",
+    "trackingcategories-disabled": "വർഗ്ഗം നിർജ്ജീവമാക്കിയിരിക്കുന്നു",
     "mailnologin": "അയയ്ക്കാനുള്ള വിലാസം ലഭ്യമല്ല",
     "mailnologintext": "മറ്റ് ഉപയോക്താക്കൾക്കു ഇമെയിലയക്കുവാൻ താങ്കൾ [[Special:UserLogin|ലോഗിൻ]] ചെയ്തിരിക്കുകയും, സാധുവായ ഒരു ഇമെയിൽ വിലാസം താങ്കളുടെ [[Special:Preferences|ക്രമീകരണങ്ങൾ]] താളിൽ സജ്ജീകരിച്ചിരിക്കുകയും വേണം.",
     "emailuser": "ഈ ഉപയോക്താവിനു ഇമെയിൽ അയക്കുക",
     "emailuser-title-notarget": "ഉപയോക്താവിന് ഇമെയിൽ അയക്കുക",
     "emailpage": "ഉപയോക്താവിന് ഇമെയിൽ അയക്കുക",
     "emailpagetext": "താഴെ കാണുന്ന ഫോം ഈ {{GENDER:$1|ഉപയോക്താവിന്‌}} ഇമെയിൽ അയക്കാൻ ഉപയോഗിക്കാവുന്നതാണ്.\n[[Special:Preferences|ഉപയോക്താവിന്റെ ക്രമീകരണങ്ങളിൽ]] കൊടുത്തിട്ടുള്ള ഇമെയിൽ വിലാസം \"ദാതാവ്\" ആയി വരുന്നതാണ്‌, അതുകൊണ്ട് സ്വീകർത്താവിന്‌ താങ്കൾക്ക് നേരിട്ട് മറുപടി അയക്കാൻ കഴിയും.",
-    "usermailererror": "മെയിലുണ്ടായ പിഴവ് തിരിച്ചയച്ചിരിക്കുന്നു:",
     "defemailsubject": "\"$1\" എന്ന ഉപയോക്താവ് അയച്ച {{SITENAME}} ഇമെയിൽ",
     "usermaildisabled": "ഉപയോക്തൃ ഇമെയിൽ പ്രവർത്തനരഹിതമാക്കിയിരിക്കുന്നു",
     "usermaildisabledtext": "ഈ വിക്കിയിലെ മറ്റുപയോക്താക്കൾക്ക് ഇമെയിൽ അയയ്ക്കാൻ താങ്കൾക്ക് കഴിയില്ല",
     "noemailtitle": "ഇമെയിൽ വിലാസം ഇല്ല",
     "noemailtext": "ഈ ഉപയോക്താവ് സാധുവായ ഇമെയിൽ വിലാസം നൽകിയിട്ടില്ല.",
-    "nowikiemailtitle": "ഇമെയിൽ അനുവദിക്കപ്പെട്ടിട്ടില്ല",
     "nowikiemailtext": "ഈ ഉപയോക്താവ് മറ്റുള്ളവരിൽ നിന്നും ഇമെയിൽ സ്വീകരിക്കുന്നത് ഒഴിവാക്കിയിരിക്കുന്നു.",
     "emailnotarget": "സ്വീകർത്താവിന്റെ ഉപയോക്തൃനാമം നിലവിലില്ല അല്ലെങ്കിൽ അസാധുവാണ്.",
     "emailtarget": "സ്വീകർത്താവിന്റെ ഉപയോക്തൃനാമം നൽകുക",
     "nowatchlist": "താങ്കൾ ശ്രദ്ധിക്കുന്ന താളുകളുടെ പട്ടികയിൽ ഇനങ്ങളൊന്നുമില്ല.",
     "watchlistanontext": "താങ്കൾ ശ്രദ്ധിക്കുന്ന താളുകളുടെ പട്ടിക കാണുവാനോ തിരുത്തുവാനോ $1.",
     "watchnologin": "ലോഗിൻ ചെയ്തിട്ടില്ല",
-    "watchnologintext": "ശ്രദ്ധിക്കുന്ന താളിന്റെ പട്ടിക തിരുത്തുവാൻ താങ്കൾ [[Special:UserLogin|ലോഗിൻ]] ചെയ്തിരിക്കണം.",
     "addwatch": "ശ്രദ്ധിക്കുന്ന താളുകളുടെ പട്ടികയിലേക്കു ചേർക്കുക",
     "addedwatchtext": "താങ്കൾ [[Special:Watchlist|ശ്രദ്ധിക്കുന്ന താളുകളുടെ പട്ടികയിലേക്ക്]] \"[[:$1]]\" എന്ന ഈ താൾ ചേർത്തിരിക്കുന്നു. ഇനി മുതൽ ഈ താളിലും ബന്ധപ്പെട്ട സം‌വാദം താളിലും ഉണ്ടാകുന്ന മാറ്റങ്ങൾ ആ പട്ടികയിൽ ദൃശ്യമാവും.",
     "removewatch": "ശ്രദ്ധിക്കുന്ന താളുകളുടെ പട്ടികയിൽ നിന്നും ഒഴിവാക്കുക",
     "watching": "ശ്രദ്ധിക്കുന്നു...",
     "unwatching": "അവഗണിക്കുന്നു...",
     "watcherrortext": "\"$1\" എന്ന താൾ ശ്രദ്ധിക്കുന്നതിന്റെ സ്ഥിതിയിൽ മാറ്റം വരുത്തിയപ്പോൾ ഒരു പിഴവുണ്ടായിരിക്കുന്നു.",
-    "enotif_mailer": "{{SITENAME}} വിജ്ഞാപന മെയിലർ",
     "enotif_reset": "എല്ലാ താളുകളും സന്ദർശിച്ചതായി രേഖപ്പെടുത്തുക",
     "enotif_impersonal_salutation": "{{SITENAME}} ഉപയോക്താവ്",
     "enotif_subject_deleted": "{{SITENAME}} സംരംഭത്തിലെ $1 എന്ന താൾ {{gender:$2|$2}} മായ്ച്ചിരിക്കുന്നു",
     "excontent": "ഉള്ളടക്കം: '$1'",
     "excontentauthor": "ഉള്ളടക്കം: '$1' ('[[Special:Contributions/$2|$2]]' മാത്രമേ ഈ താളിൽ തിരുത്തൽ നടത്തിയിട്ടുള്ളൂ)",
     "exbeforeblank": "ശൂന്യമാക്കപ്പെടുന്നതിനു മുമ്പുള്ള ഉള്ളടക്കം: '$1'",
-    "exblank": "താൾ ശൂന്യമായിരുന്നു",
     "delete-confirm": "\"$1\" മായ്ക്കുക",
     "delete-legend": "മായ്ക്കുക",
     "historywarning": "'''മുന്നറിയിപ്പ്''': താങ്കൾ മായ്ക്കുവാൻ പോകുന്ന താളിനു ഏകദേശം {{PLURAL:$1|ഒരു നാൾപ്പതിപ്പ്|$1 നാൾപ്പതിപ്പുകൾ}} ഉള്ള നാൾവഴി ഉണ്ട്:",
     "sp-contributions-newbies-sub": "പുതിയ ഉപയോക്താക്കൾ ചെയ്തവ",
     "sp-contributions-newbies-title": "പുതിയ അംഗത്വമെടുത്ത ഉപയോക്താക്കളുടെ സേവനങ്ങൾ",
     "sp-contributions-blocklog": "തടയൽ രേഖ",
+    "sp-contributions-suppresslog": "ഒതുക്കപ്പെട്ട ഉപയോക്തൃസംഭാവനകൾ",
     "sp-contributions-deleted": "മായ്ക്കപ്പെട്ട ഉപയോക്തൃസംഭാവനകൾ",
     "sp-contributions-uploads": "അപ്‌ലോഡുകൾ",
     "sp-contributions-logs": "പ്രവർത്തനരേഖകൾ",
     "sp-contributions-blocked-notice": "ഈ ഉപയോക്താവ് ഇപ്പോൾ തടയപ്പെട്ടിരിക്കുകയാണ്. അവലംബമായി തടയൽ രേഖയുടെ പുതിയ ഭാഗം താഴെ കൊടുത്തിരിക്കുന്നു:",
     "sp-contributions-blocked-notice-anon": "ഈ ഐ.പി. വിലാസം ഇപ്പോൾ തടയപ്പെട്ടിരിക്കുകയാണ്.\nഅവലംബമായി തടയൽ രേഖയുടെ പുതിയഭാഗം താഴെ കൊടുത്തിരിക്കുന്നു:",
     "sp-contributions-search": "ചെയ്ത സേവനങ്ങൾ",
-    "sp-contributions-suppresslog": "ഒതുക്കപ്പെട്ട ഉപയോക്തൃസംഭാവനകൾ",
     "sp-contributions-username": "ഐ.പി. വിലാസം അഥവാ ഉപയോക്തൃനാമം:",
     "sp-contributions-toponly": "ഒടുവിലത്തെ നാൾപ്പതിപ്പുകൾ മാത്രം പ്രദർശിപ്പിക്കുക",
     "sp-contributions-newonly": "താൾ സൃഷ്ടിക്കാനുള്ള തിരുത്തുകൾ മാത്രം പ്രദർശിപ്പിക്കുക",
     "allmessagesname": "പേര്‌",
     "allmessagesdefault": "സ്വതേയുള്ള ഉള്ളടക്കം",
     "allmessagescurrent": "നിലവിലുള്ള ഉള്ളടക്കം",
-    "allmessagestext": "ഇത് മീഡിയവിക്കി നാമമേഖലയിൽ ലഭ്യമായ വ്യവസ്ഥാസന്ദേശങ്ങളുടെ ഒരു പട്ടിക ആണ്‌.\nപ്രാമാണികമായ വിധത്തിൽ മീഡിയവിക്കിയുടെ പ്രാദേശീകരണം താങ്കൾ ഉദ്ദേശിക്കുന്നുവെങ്കിൽ ദയവായി [https://www.mediawiki.org/wiki/Localisation MediaWiki Localisation], [//translatewiki.net translatewiki.net] എന്നീ താളുകൾ സന്ദർശിക്കുക.",
+    "allmessagestext": "ഇത് മീഡിയവിക്കി നാമമേഖലയിൽ ലഭ്യമായ വ്യവസ്ഥാസന്ദേശങ്ങളുടെ ഒരു പട്ടിക ആണ്‌.\nപ്രാമാണികമായ വിധത്തിൽ മീഡിയവിക്കിയുടെ പ്രാദേശീകരണം താങ്കൾ ഉദ്ദേശിക്കുന്നുവെങ്കിൽ ദയവായി [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation മീഡിയവിക്കി പ്രാദേശീകരണം], [//translatewiki.net പരിഭാഷാവിക്കി] തുടങ്ങിയവ സന്ദർശിക്കുക.",
     "allmessagesnotsupportedDB": "'''$wgUseDatabaseMessages''' ബന്ധിച്ചിരിക്കുന്നതു കാരണം ഈ താൾ ഉപയോഗിക്കുവാൻ സാദ്ധ്യമല്ല.",
     "allmessages-filter-legend": "അരിപ്പ",
     "allmessages-filter": "പുനഃക്രമീകരിച്ച ക്രമത്തിൽ തിരഞ്ഞുവെയ്ക്കുക:",
     "importunknownsource": "അപരിചിതമായ ഇറക്കുമതി സ്രോതസ്സ് തരം",
     "importcantopen": "ഇറക്കുമതി പ്രമാണം തുറക്കാൻ കഴിഞ്ഞില്ല",
     "importbadinterwiki": "മോശമായ അന്തർവിക്കി കണ്ണി",
-    "importnotext": "ശൂന്യം അല്ലെങ്കിൽ ഉള്ളടക്കം ഒന്നുമില്ല",
     "importsuccess": "ഇറക്കുമതി ചെയ്തുകഴിഞ്ഞു!",
-    "importhistoryconflict": "നാൾപ്പതിപ്പുകളിൽ പൊരുത്തക്കേടുണ്ട് (ഈ താൾ ഇതിനു മുൻപ് ഇറക്കുമതി ചെയ്തിട്ടുണ്ടാവാം)",
     "importnosources": "ട്രാൻസ്‌‌വിക്കി ഇറക്കുമതി സ്രോതസ്സുകളൊന്നും നിർവചിച്ചിട്ടില്ല, നേരിട്ടുള്ള നാൾവഴി അപ്‌‌ലോഡുകൾ പ്രവർത്തനരഹിതവുമാക്കിയിരിക്കുന്നു.",
     "importnofile": "ഇറക്കുമതി പ്രമാണങ്ങളൊന്നും അപ്‌‌ലോഡ് ചെയ്തിട്ടില്ല.",
     "importuploaderrorsize": "ഇറക്കുമതി ചെയ്ത പ്രമാണത്തിന്റെ അപ്‌‌ലോഡ് പരാജയപ്പെട്ടു.\nപ്രമാണം അപ്‌‌ലോഡിങ്ങിനനുവദിക്കപ്പെട്ടിരിക്കുന്ന അളവിലും വലുതാണ്.",
     "version-entrypoints": "പ്രവേശനസ്ഥാന യു.ആർ.എല്ലുകൾ",
     "version-entrypoints-header-entrypoint": "പ്രവേശനസ്ഥാനം",
     "version-entrypoints-header-url": "യു.ആർ.എൽ.",
-    "version-entrypoints-articlepath": "[https://www.mediawiki.org/wiki/Manual:$wgArticlePath ലേഖന പഥം]",
-    "version-entrypoints-scriptpath": "[https://www.mediawiki.org/wiki/Manual:$wgScriptPath സ്ക്രിപ്റ്റ് പഥം]",
+    "version-entrypoints-articlepath": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgArticlePath ലേഖനപഥം]",
+    "version-entrypoints-scriptpath": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgScriptPath സ്ക്രിപ്റ്റ് പഥം]",
     "redirect": "പ്രമാണത്താൽ, ഉപയോക്താവിനാൽ, താളിനാൽ അഥവാ നാൾപ്പതിപ്പ് ഐ.ഡി.യാൽ ചെയ്യുന്ന തിരിച്ചുവിടൽ",
     "redirect-legend": "ഒരു പ്രമാണത്തിലോട്ടോ താളിലോട്ടോ ഉള്ള തിരിച്ചുവിടൽ",
     "redirect-summary": "ഈ പ്രത്യേക താൾ ഒരു പ്രമാണത്തിലേയ്ക്കോ (പ്രമാണത്തിന്റെ പേര് തന്നിട്ടുണ്ട്), ഒരു താളിലേയ്ക്കോ (നാൾപ്പതിപ്പിന്റെ ഐ.ഡി. അല്ലെങ്കിൽ താൾ തന്നിട്ടുണ്ട്), അല്ലെങ്കിൽ ഒരു ഉപയോക്തൃതാളിലേയ്ക്കോ (ഉപയോക്താവിന്റെ സംഖ്യാ ഐ.ഡി. തന്നിട്ടുണ്ട്) തിരിച്ചുവിടുന്നു. ഉപയോഗം: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]],  [[{{#Special:Redirect}}/revision/328429]], അല്ലെങ്കിൽ [[{{#Special:Redirect}}/user/101]].",
index 8820bb8..80ecb78 100644 (file)
     "november-date": "Арван нэгдүгээр сарын $1",
     "december-date": "Арван хоёрдугаар сарын $1",
     "pagecategories": "{{PLURAL:$1|Анги|Ангилал}}",
-    "category_header": "\"$1\" Ð°Ð½Ð³Ð¸Ð»Ð°Ð» Ð´Ð°Ñ\85Ñ\8c Ñ\85Ñ\83Ñ\83даÑ\81нÑ\83Ñ\83д",
+    "category_header": "\"$1\" Ð°Ð½Ð³Ð¸Ð¹Ð½ Ð´Ð°Ð½ Ñ\85Ñ\83Ñ\83даÑ\81",
     "subcategories": "Ангийн бүлэг",
     "category-media-header": "\"$1\" ангийн файл",
     "category-empty": "''Одоогийн байдлаар энэ ангилалд хуудас, медиа файл байхгүй байна.''",
     "hidden-categories": "{{PLURAL:$1|Нуугдсан ангилал|Нуугдсан ангиллууд}}",
     "hidden-category-category": "Нуугдсан ангиллууд",
-    "category-subcat-count": "{{PLURAL:$2|ЭнÑ\8d Ð°Ð½Ð³Ð¸Ð»Ð°Ð»Ð´ Ð´Ð°Ñ\80ааÑ\85 Ð´Ñ\8dд Ð°Ð½Ð³Ð¸Ð»Ð°Ð» Ð» Ð±Ð°Ð¹Ð½Ð°.|ЭнÑ\8d Ð°Ð½Ð³Ð¸Ð»Ð°Ð»Ð´ Ð½Ð¸Ð¹Ñ\82 $2-Ñ\81 Ð´Ð°Ñ\80ааÑ\85 $1 Ð´Ñ\8dд Ð°Ð½Ð³Ð¸Ð»Ð°Ð» Ð±Ð°Ð¹на.}}",
+    "category-subcat-count": "{{PLURAL:$2|ТÑ\83Ñ\81 Ð°Ð½Ð³Ð¸Ð´ Ð´Ð°Ñ\80ааÑ\85 Ð°Ð½Ð³Ð¸Ð¹Ð½ Ñ\85Ñ\83Ñ\83дÑ\81Ñ\83Ñ\83д Ñ\85амааÑ\80на.|ТÑ\83Ñ\81 Ð°Ð½Ð³Ð¸Ð´ Ð´Ð°Ñ\80ааÑ\85 $2 Ð°Ð½Ð³Ð¸Ð¹Ð½ Ñ\85Ñ\83Ñ\83дÑ\81Ñ\83Ñ\83д Ñ\85амааÑ\80на.}}",
     "category-subcat-count-limited": "Энэ ангилалд {{PLURAL:$1| дэд ангилал|$1-н дэд ангилалууд}} байна.",
-    "category-article-count": "{{PLURAL:$2|Энд нэг хуудас байна.|Энэ ангид $2 хуудас байна.}}\n\n{{PLURAL:$2|Энэ ангилалд дараах хуудас л байна.|Энэ ангилалд нийт $2-с дараах $1 хуудас байна.}}",
+    "category-article-count": "{{PLURAL:$2|Энэ ангид дараах хуудас хамаарна.|Энэ ангид дараах $2 хуудас хамаарна.}}",
     "category-article-count-limited": "Энэ ангилалд дараах {{PLURAL:$1|хуудас|$1 хуудаснууд}} байна.",
     "category-file-count": "{{PLURAL:$2|Энэ ангилалд дараах файл л байна.|Энэ ангилалд нийт $2-с дараах $1 файл байна.}}",
     "category-file-count-limited": "Энэ ангилалд дараах {{PLURAL:$1|файл|$1 файлнууд}} байна.",
     "accountcreatedtext": "$1 хэрэглэгчийн бүртгэл үүсгэгдлээ.",
     "createaccount-title": "{{SITENAME}}-н бүртгэлийн үүсгэл",
     "createaccount-text": "Хэн нэгэн {{SITENAME}}-д ($4) \"$2\" гэсэн нэрээр, \"$3\" гэсэн нууц үгтэйгээр таны мэйл хаягийг ашиглан бүртгүүлжээ.\nТа одоо нэвтэрч өөрийн нууц үгээ солих хэрэгтэй.\n\nХэрэв буруугаар бүртгүүлсэн бол энэ мэдэгдлийг үл ойшоож болно.",
-    "usernamehasherror": "Хэрэглэгчийн нэрэнд хаш тэмдэгт орж болохгүй",
     "login-throttled": "Та хэт олон удаа нэвтрэх гэж оролдсон байна.\n$1 хүлээж байгаад дахин оролдоно уу.",
     "login-abort-generic": "Та нэвтэрч чадсангүй",
     "loginlanguagelabel": "Хэл: $1",
     "prefs-skin": "Арьс",
     "skin-preview": "Урьдчилж харах",
     "datedefault": "Анхны байдал",
-    "prefs-beta": "Туршилтын бета хэрэгсүүрүүд",
-    "prefs-datetime": "Огноо ба цаг",
     "prefs-labs": "Labs -ын функцүүд",
     "prefs-user-pages": "Хэрэглэгчийн хуудсууд",
     "prefs-personal": "Хувийн тохируулга",
     "upload-permitted": "Оруулж болох файлын төрлүүд: $1.",
     "upload-preferred": "Хэрэглэхийг зөвлөж буй файлын төрлүүд: $1.",
     "upload-prohibited": "Оруулж болохгүй файлын төрлүүд: $1.",
-    "uploadlog": "файл оруулалтын лог",
     "uploadlogpage": "Файл оруулалтын лог",
     "uploadlogpagetext": "Доорх нь хамгийн сүүлд оруулсан файлуудын жагсаалт юм.\n[[Special:NewFiles|Шинэ файлуудын үзэсгэлэн]] дээр жагсаалтыг зурган байдлаар харуулсан байгаа.",
     "filename": "Файлын нэр",
     "filereuploadsummary": "Файлын өөрчлөлтүүд:",
     "filestatus": "Зохиогчийн эрхийн байдал:",
     "filesource": "Эх үүсвэр:",
-    "uploadedfiles": "Оруулагдсан файлууд",
     "ignorewarning": "Анхааруулгыг үл тоомсорлон файлыг хадгалах",
     "ignorewarnings": "Ямар ч анхааруулгыг үл тоомсорлох",
     "minlength1": "Файлын нэрүүд доод тал нь нэг үсгийн урттай байх ёстой.",
     "overwroteimage": "\"[[$1]]\"-н шинэ хувилбарыг орууллаа",
     "uploaddisabled": "Файл оруулах боломжгүй байна.",
     "copyuploaddisabled": "URL-аас оруулж болохгүй.",
-    "uploadfromurl-queued": "Таны оруулалсан файлыг оруулах дараалалд нэмэв.",
     "uploaddisabledtext": "Файл оруулалтуудыг идэвхижүүлээгүй байна.",
     "php-uploaddisabledtext": "PHP-д файл оруулахыг хориглоно.\nfile_uploads тохиргоогоо шалгана уу.",
     "uploadscripted": "Энэ файл нь вэб броузераас шалтгаалж алдаатай уншигдах магадлал бүхий HTML буюу скрипт код агуулсан байна.",
     "upload-misc-error": "Мэдэгдэхгүй файл оруулалтын алдаа",
     "upload-misc-error-text": "Файл оруулахад үл мэдэгдэх алдаа гарлаа.\nURL нь хүчинтэй, мөн түүн руу орж болж байгаа эсэхийг шалган, дахин оролдож үзнэ үү.\nЭнэ асуудал үргэлжилсээр байвал [[Special:ListUsers/sysop|администраторт]] хандана уу.",
     "upload-too-many-redirects": "URL-д хэт олон чиглүүлэгч байв",
-    "upload-unknown-size": "Үл мэдэгдэх хэмжээ",
     "upload-http-error": "HTTP алдаа гарав: $1",
     "upload-copy-upload-invalid-domain": "Энэ хаяг дээрээс хуулах боломжгүй байна.",
     "backend-fail-stream": "$1 файлыг дамжуулж чадсангүй.",
     "filehist-dimensions": "Хэмжээ",
     "filehist-filesize": "Файлын хэмжээ",
     "filehist-comment": "Тайлбар",
-    "filehist-missing": "Файл байхгүй байна",
     "imagelinks": "Файлын хэрэглээ",
     "linkstoimage": "Дараах {{PLURAL:$1|хуудас уг файлтай|$1 хуудас уг файлтай}} холбогдсон байна:",
     "linkstoimage-more": "$1-с их зураг энэ файлд холбогдсон байна.\nДараах жагсаалт нь энэ файлд холбогдсон эхний $1 хуудсыг л харуулна.\n[[Special:WhatLinksHere/$2|Бүтэн жагсаалт]] мөн байгаа.",
     "cachedspecial-refresh-now": "Саяханы хуудсыг харах",
     "categories": "Ангиллууд",
     "categoriespagetext": "Дараах {{PLURAL:$1|ангилалд|ангиллуудад}} хуудас эсвэл медиа файл агуулагдаж байна.\n[[Special:UnusedCategories|Хэрэглэгдэхгүй байгаа]] ангиллуудыг энд харуулсангүй.\n[[Special:WantedCategories|Хэрэгтэй ангиллууд]] гэдгийг харна уу.",
-    "categoriesfrom": "Эхний ангилал:",
+    "categoriesfrom": "Эхний анги:",
     "special-categories-sort-count": "тоогоор ялгах",
     "special-categories-sort-abc": "үсгийн дарааллаар ялгах",
     "deletedcontributions": "Устгагдсан хэрэглэгчийн хувь нэмэр",
     "emailuser-title-notarget": "И-мейл хэрэглэгч",
     "emailpage": "Хэрэглэгчид мэйл илгээх",
     "emailpagetext": "Энэ хэрэглэгч рүү мэйл илгээхэд доорхийг бөглөнө.\nТаны өөрийн [[Special:Preferences|хэрэглэгчийн тохиргоонд]] оруулсан мэйл хаяг нь \"Хэнээс\" гэсэн хэсэгт гарах тул хүлээн авагч хариугаа тань руу шууд илгээх боломжтой.",
-    "usermailererror": "Мэйл нь буцаж ирсэн шалтгаан:",
     "defemailsubject": "{{SITENAME}} дахь \"$1\" хэрэглэгчийн и-мэйл хаяг",
     "usermaildisabled": "Хэрэглэгчийн и-мэйлийг идэвхигүйжүүлэв",
     "usermaildisabledtext": "Та энэ викигийн бусад хэрэглэгч руу и-мэйл явуулах боломжгүй",
     "noemailtitle": "Мэйл хаяггүй байна",
     "noemailtext": "Энэ хэрэглэгч хүчинтэй и-мэйл хаяг тохируулаагүй байна.",
-    "nowikiemailtitle": "Мэйл зөвшөөрөгдөхгүй",
     "nowikiemailtext": "Энэ хэрэглэгч бусад хэрэглэгчдээс мэйл хүлээж авахгүй гэсэн байна.",
     "emailtarget": "Хүлээн авагчийн хэрэглэгчийн нэрийг оруулах",
     "emailusername": "Хэрэглэгчийн нэр:",
     "nowatchlist": "Танд хянаж буй зүйл байхгүй.",
     "watchlistanontext": "Та өөрийн хянах листийг өөрчлөх буюу үзэхийг хүсвэл $1 хэрэгтэй.",
     "watchnologin": "Нэвтрээгүй байна.",
-    "watchnologintext": "Та өөрийн хянаж буй хуудаснуудын жагсаалтыг өөрчлөхийн тулд [[Special:UserLogin|нэвтэрсэн байх]] шаардлагатай.",
     "addwatch": "Хяналтын жагсаалтад нэмэх",
     "addedwatchtext": "\"[[:$1]]\" гэсэн хуудас таны [[Special:Watchlist|хянах жагсаалтанд]] нэмэгдлээ.\nЭнэ хуудас эсвэл түүний хэлэлцүүлгийн хуудас засварлагдахад тэдгээр нь [[Special:RecentChanges|сүүлийн засваруудын жагсаалтад]] '''тодруулалттай''' харагдах болно.",
     "removewatch": "Хяналтын жагсаалтаас хасах",
     "watchlist-options": "Хянаж буй хуудсуудын жагсаалтны сонголтууд",
     "watching": "Хянаж байна...",
     "unwatching": "Хянахаа больж байна...",
-    "enotif_mailer": "{{SITENAME}}-н мэйл сонордуулга",
     "enotif_reset": "Бүх хуудсыг үзсэн гэж тэмдэглэх",
     "enotif_impersonal_salutation": "{{SITENAME}}-н хэрэглэгч",
     "enotif_lastvisited": "$1-н хамгийн сүүлд зочилсноос хойших өөрчлөлтүүдийг харуул.",
     "excontent": "агуулга нь ийм байсан: '$1'",
     "excontentauthor": "агуулга нь ийм байсан: '$1' (цорын ганц хувь нэмэрлэгч нь '[[Special:Contributions/$2|$2]]')",
     "exbeforeblank": "хоосон болгохын өмнөх агуулга: '$1'",
-    "exblank": "хуудас нь хоосон байсан",
     "delete-confirm": "\"$1\"-г устгах",
     "delete-legend": "Устгах",
     "historywarning": "'''Анхаар''': Таны устгах гэж байгаа хуудас $1 орчим засвар бүхий түүхтэй байна:",
     "sp-contributions-newbies-sub": "Шинээр бүртгүүлсэн хэрэглэгчид",
     "sp-contributions-newbies-title": "Шинэ бүртгэлүүдийн хувь нэмэр",
     "sp-contributions-blocklog": "Түгжээний лог",
+    "sp-contributions-suppresslog": "Хориглосон хэрэглэгчийн оролцоо",
     "sp-contributions-deleted": "устгагдсан хэрэглэгчийн хувь нэмэр",
     "sp-contributions-uploads": "өгөгдөл дамжуулалт",
     "sp-contributions-logs": "логууд",
     "sp-contributions-blocked-notice": "Энэхүү хэрэглэгч одоогоор түгжигдсэн байна.\nЛавлагааны зориулалтаар түгжээний лог дээрх хамгийн сүүлийн нэмэлтийг доор оруулав:",
     "sp-contributions-blocked-notice-anon": "Энэхүү IP хаягыг одоогоор түгжигдсэн байна.\nЛавлагааны зориулалтаар түгжээний лог дээрх хамгийн сүүлийн нэмэлтийг доор оруулав:",
     "sp-contributions-search": "Хувь нэмрийг хайх",
-    "sp-contributions-suppresslog": "Хориглосон хэрэглэгчийн оролцоо",
     "sp-contributions-username": "IP хаяг эсвэл хэрэглэгчийн нэр:",
     "sp-contributions-toponly": "Хамгийн сүүлийн засваруудыг л үзүүлэх",
     "sp-contributions-submit": "Хайх",
     "allmessagesname": "Нэр",
     "allmessagesdefault": "Анхны",
     "allmessagescurrent": "Одоогийн",
-    "allmessagestext": "Энэ бол МедиаВики дахь системийн мэдэгдлүүдийн жагсаалт юм.\nМедиаВикиг орчуулах тухай мэдээллийг [https://www.mediawiki.org/wiki/Localisation МедиаВикигийн орчуулга], мөн [//translatewiki.net translatewiki.net]-с авна уу.",
+    "allmessagestext": "Энэ бол МедиаВики дахь системийн мэдэгдлүүдийн жагсаалт юм.\nМедиаВикиг орчуулах тухай мэдээллийг [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation МедиаВикигийн орчуулга], мөн [//translatewiki.net translatewiki.net]-с авна уу.",
     "allmessagesnotsupportedDB": "'''$wgUseDatabaseMessages''' нь унтарсан байгаа тул '''Special:Allmessages'''-г хэрэглэж болохгүй.",
     "allmessages-filter-legend": "Шүүлтүүр",
     "allmessages-filter": "Өөрийн болгосон байдлаар нь шүүх:",
     "importunknownsource": "Мэдэгдээгүй төрлийн импортлох эх үүсвэр",
     "importcantopen": "Импортлосон файлыг нээж чадсангүй",
     "importbadinterwiki": "Интервикигийн хүчингүй холбоос",
-    "importnotext": "Хоосон эсвэл текст байхгүй",
     "importsuccess": "Амжилттай импортлолоо!",
-    "importhistoryconflict": "Өмнөх хувилбар нь оршин байгаа эсэх нь харшилдаж байна(магадгүй өмнө нь импотлосон хуудас байж болзошгүй)",
     "importnosources": "Транс-викигийн импортын эх үүсвэрүүд тодорхойлогдоогүй байгаа бөгөөд түүхийг шууд оруулах явдлыг хаасан байна.",
     "importnofile": "Имтортлосон файл хуулагдаагүй байна.",
     "importuploaderrorsize": "Импортлогдсон файлыг оруулж чадсангүй. Файлыг хэмжээ зөвшөөрөгдсөн хэмжээнээс том байна.",
index 41cc245..a34eb27 100644 (file)
@@ -92,7 +92,6 @@
     "disclaimers": "Деклараций",
     "disclaimerpage": "Project:Декларацие ӂенералэ",
     "edithelp": "Ажутор пентру едитаре",
-    "helppage": "Help:Купринс",
     "mainpage": "Прима паӂина",
     "mainpage-description": "Прима паӂина",
     "privacy": "Политика де интимитате",
index cd582d3..b85882d 100644 (file)
     "disclaimers": "Вӓшештӹмӹ шая (ответственность) гӹц карангмаш",
     "disclaimerpage": "Project:Вӓшештӹмӓш (ответственность) гӹц карангмаш",
     "edithelp": "Тӧрлӓш манын палшык",
-    "helppage": "Help:Палшык",
     "mainpage": "Тӹнг ӹлӹштӓш",
     "mainpage-description": "Тӹнг ӹлӹштӓш",
     "privacy": "Весӹвлӓлӓн шайышташ ак ли ылмы политика",
index 103178b..4790f1d 100644 (file)
@@ -1,6 +1,23 @@
 {
     "@metadata": {
-        "authors": []
+        "authors": [
+            "Algazel-ms",
+            "Anakmalaysia",
+            "Aurora",
+            "Aviator",
+            "CoolCityCat",
+            "Diagramma Della Verita",
+            "Hydra",
+            "Izzudin",
+            "Kaganer",
+            "Kurniasan",
+            "Meno25",
+            "Putera Luqman Tunku Andre",
+            "SNN95",
+            "Yosri",
+            "Zamwan",
+            "לערי ריינהארט"
+        ]
     },
     "tog-underline": "Garis bawah pautan:",
     "tog-hideminor": "Sembunyikan suntingan kecil dalam laman perubahan terkini",
     "prefs-skin": "Rupa",
     "skin-preview": "Pralihat",
     "datedefault": "Tiada keutamaan",
-    "prefs-beta": "Ciri-ciri beta",
     "prefs-datetime": "Tarikh dan waktu",
     "prefs-labs": "Ciri-ciri makmal",
     "prefs-user-pages": "Laman pengguna",
     "nowatchlist": "Tiada item dalam senarai pantau anda.",
     "watchlistanontext": "Sila $1 terlebih dahulu untuk melihat atau menyunting senarai pantau anda.",
     "watchnologin": "Belum log masuk",
-    "watchnologintext": "Anda mesti [[Special:UserLogin|log masuk]] terlebih dahulu untuk mengubah senarai pantau.",
     "addwatch": "Tambahkan ke senarai pantau",
     "addedwatchtext": "Halaman \"[[:$1]]\" telah dimasukkan ke dalam [[Special:Watchlist|senarai pantau anda]].\nPerubahan-perubahan pada halaman ini dan halaman perbualannya pada masa akan datang akan tersenarai di dalam senarai itu.",
     "removewatch": "Buang dari senarai pantau",
     "allmessagesname": "Nama",
     "allmessagesdefault": "Teks mesej asal",
     "allmessagescurrent": "Teks pesanan semasa",
-    "allmessagestext": "Ini ialah senarai pesanan sistem yang terdapat dalam ruang nama MediaWiki.\nSila lawat [https://www.mediawiki.org/wiki/Localisation Penyetempatan MediaWiki] dan [//translatewiki.net translatewiki.net] sekiranya anda mahu menyumbang dalam menyetempatkan dan menterjemah perisian MediaWiki.",
+    "allmessagestext": "Ini ialah senarai pesanan sistem yang terdapat dalam ruang nama MediaWiki.\nSila lawat [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation Penyetempatan MediaWiki] dan [//translatewiki.net translatewiki.net] sekiranya anda mahu menyumbang dalam menyetempatkan dan menterjemah perisian MediaWiki.",
     "allmessagesnotsupportedDB": "'''{{ns:special}}:Allmessages''' tidak boleh digunakan kerana '''$wgUseDatabaseMessages''' dipadamkan.",
     "allmessages-filter-legend": "Penapisan",
     "allmessages-filter": "Tapis berdasarkan keadaan penempahan:",
     "version-entrypoints": "URL titik permulaan",
     "version-entrypoints-header-entrypoint": "Titik permulaan",
     "version-entrypoints-header-url": "URL",
-    "version-entrypoints-articlepath": "[https://www.mediawiki.org/wiki/Manual:$wgArticlePath Laluan rencana]",
-    "version-entrypoints-scriptpath": "[https://www.mediawiki.org/wiki/Manual:$wgScriptPath Laluan skrip]",
+    "version-entrypoints-articlepath": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgArticlePath Laluan rencana]",
+    "version-entrypoints-scriptpath": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgScriptPath Laluan skrip]",
     "redirect": "Lencongkan mengikut ID fail, pengguna, halaman atau semakan",
     "redirect-legend": "Lencongkan ke fail atau halaman",
     "redirect-summary": "Halaman khas ini melencong kepada fail (dengan nama fail), halaman (dengan ID semakan atau ID halaman) atau halaman pengguna (dengan ID pengguna berangka). Penggunaan: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]], atau [[{{#Special:Redirect}}/user/101]].",
index 8a4d359..22896db 100644 (file)
     "prefs-skin": "Aspett grafiku (skin)",
     "skin-preview": "dehra proviżorja",
     "datedefault": "L-ebda preferenza",
-    "prefs-beta": "Karatteristiċi tal-Beta",
     "prefs-datetime": "Data u ħin",
     "prefs-labs": "Karatteristiċi tal-laboratorji",
     "prefs-user-pages": "Paġni tal-utent",
     "nowatchlist": "Il-lista ta' osservazzjoni tiegħek hija vojta.",
     "watchlistanontext": "Sabiex tara u timmodifika l-lista ta' osservazzjoni tiegħek, hemm bżonn li $1.",
     "watchnologin": "Għadek ma dħaltx ġewwa",
-    "watchnologintext": "Biex tagħmel modifika fil-lista t'osservazzjoni speċjali huwa neċessarju li l-ewwel [[Special:UserLogin|tidħol]] fil-kont tiegħek.",
     "addwatch": "Żid mal-lista ta' osservazzjonijiet",
     "addedwatchtext": "Il-paġna \"[[:$1]]\" ġiet miżjuda mal-[[Special:Watchlist|lista ta' osservazzjonijiet]] tiegħek.\nKwalunkwe modifika li ssir fil-futur, kemm fuq din il-paġna u fil-paġna ta' diskussjoni tagħha, tiġi elenkata hemmhekk.",
     "removewatch": "Neħħi mil-lista ta' osservazzjonijiet",
index 27f4057..fedb292 100644 (file)
@@ -28,7 +28,6 @@
     "currentevents": "Imwin",
     "currentevents-url": "Project:Imwin",
     "edithelp": "Oomo/edar Ipuok",
-    "helppage": "Help:Oangan",
     "mainpage": "Bwiema peij",
     "mainpage-description": "Bwiema peij",
     "editsection": "Kiwiwid",
index 93a8e2c..4aabc37 100644 (file)
@@ -10,7 +10,7 @@
     "tog-hideminor": "Am chòe-kīn ê sió kái-piàn",
     "tog-hidepatrolled": "Am chòe-kīn sûn koè--ê  kái-piàn",
     "tog-newpageshidepatrolled": "Sin-ia̍h ê chheng-toaⁿ am sûn koè--ê",
-    "tog-extendwatchlist": "Khok-chhiong kàm-sī-toaⁿ kàu hián-sī só͘-ū ê kái-piàn",
+    "tog-extendwatchlist": "thián-khui kàm-sī-toaⁿ, khoàⁿ choân-pō͘  kái ê, m̄-nā choè-kīn niā.",
     "tog-usenewrc": "Ka-kiông pán ê chòe-kīn-ê-kái-piàn (su-iàu JavaScript)",
     "tog-numberheadings": "Phiau-tê chū-tōng pian-hō",
     "tog-showtoolbar": "Hián-sī pian-chi̍p ke-si-tiâu (su-iàu JavaScript)",
     "prefs-skin": "Phôe",
     "skin-preview": "Chhì khoàⁿ",
     "datedefault": "Chhìn-chhái",
-    "prefs-datetime": "Ji̍t-kî kap sî-kan",
     "prefs-personal": "Iōng-chiá chu-liāu",
     "prefs-rc": "Chòe-kīn ê kái-piàn & stub ê hián-sī",
     "prefs-watchlist": "Kàm-sī-toaⁿ",
     "filename": "Tóng-àn",
     "filedesc": "Khài-iàu",
     "fileuploadsummary": "Khài-iàu:",
-    "uploadedfiles": "Tóng-àn í-keng sàng chiūⁿ-bāng",
     "ignorewarning": "Mài chhap kéng-kò, kā tóng-àn pó-chûn khí lâi.",
     "ignorewarnings": "Mài chhap kéng-kò",
     "badfilename": "Iáⁿ-siōng ê miâ í-keng kái chò \"$1\".",
     "watchlistfor2": "予$1 $2",
     "nowatchlist": "Lí ê kàm-sī-toaⁿ bô pòaⁿ hāng.",
     "watchnologin": "Bô teng-ji̍p",
-    "watchnologintext": "Lí it-tēng ài [[Special:UserLogin|teng-ji̍p]] chiah ē-tàng siu-kái lí ê kàm-sī-toaⁿ.",
     "addedwatchtext": "\"[[:$1]]\" chit ia̍h í-keng ka-ji̍p lí ê [[Special:Watchlist|kàm-sī-toaⁿ]]. Bī-lâi chit ia̍h a̍h-sī siong-koan ê thó-lūn-ia̍h nā ū kái-piàn, ē lia̍t tī hia. Tông-sî tī [[Special:RecentChanges|Chòe-kīn ê kái-piàn]] ē iōng '''chho·-thé''' hián-sī ia̍h ê piau-tê, án-ne khah bêng-hián. Ká-sú lí beh chiōng chit ia̍h tùi lí ê kàm-sī-toaⁿ tû tiāu, khì khòng-chè-tiâu chhi̍h \"Mài kàm-sī\" chiū ē-sái-tit.",
     "removedwatchtext": "\"[[:$1]]\" chit ia̍h í-keng tùi lí ê kàm-sī-toaⁿ tû tiāu.",
     "watch": "kàm-sī",
     "excontent": "lōe-iông sī: '$1'",
     "excontentauthor": "loē-iông sī: '$1' (î-it ê kòng-hiàn-chiá sī '[[Special:Contributions/$2|$2]]')",
     "exbeforeblank": "chìn-chêng ê lōe-iông sī: '$1'",
-    "exblank": "ia̍h khang-khang",
     "historywarning": "Kéng-kò: Lí beh thâi ê ia̍h ū le̍k-sú:",
     "confirmdeletetext": "Lí tih-beh kā 1 ê ia̍h a̍h-sī iáⁿ-siōng (pau-koat siong-koan ê le̍k-sú) éng-kiú tùi chu-liāu-khò· thâi tiāu. Chhiáⁿ khak-tēng lí àn-sǹg án-ne chò, jī-chhiáⁿ liáu-kái hiō-kó, jī-chhiáⁿ bô ûi-hoán [[{{MediaWiki:Policy-url}}]].",
     "actioncomplete": "Chip-hêng sêng-kong",
index 0d4f821..245600f 100644 (file)
     "pool-timeout": "Tidsavbudd mens man ventet på låsing",
     "pool-queuefull": "Prosesskøen er full",
     "pool-errorunknown": "Ukjent feil",
+    "pool-servererror": "'Pool counter'-tjenesten er ikke tilgjengelig ($1).",
     "aboutsite": "Om {{SITENAME}}",
     "aboutpage": "Project:Om",
     "copyright": "Innholdet er tilgjengelig under $1 med mindre annet er spesifikt angitt.",
     "gotaccountlink": "Logg inn",
     "userlogin-resetlink": "Har du glemt påloggingsdetaljene dine?",
     "userlogin-resetpassword-link": "Glemt passordet?",
+    "userlogin-helplink2": "Hjelp med innlogging",
     "userlogin-loggedin": "Du er allerede logget inn som {{GENDER:$1|$1}}.\nBruk skjemaet nedenfor for å logge inn som en annen bruker.",
     "userlogin-createanother": "Opprett ny konto",
     "createacct-join": "Skriv inn informasjonen din under.",
     "accountcreatedtext": "Brukerkontoen for [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|diskusjon]]) har blitt opprettet.",
     "createaccount-title": "Kontooppretting på {{SITENAME}}",
     "createaccount-text": "Noen opprettet en konto for din e-postadresse på {{SITENAME}} ($4) med navnet «$2», med «$3» som passord. Du burde logge inn og endre passordet nå.\n\nDu kan ignorere denne beskjeden dersom kontoen ble opprettet ved en feil.",
-    "usernamehasherror": "Brukernavn kan ikke inneholde nummertegn.",
     "login-throttled": "Du har prøvd å logge inn for mange ganger.\nVent $1 før du prøver på nytt.",
     "login-abort-generic": "Innleggingen ble avbrutt.",
     "loginlanguagelabel": "Språk: $1",
     "suspicious-userlogout": "Din forespørsel om å logge ut ble nektet fordi den så ut til å ha bli sendt av en ødelagt nettleser eller en mellomtjener.",
     "createacct-another-realname-tip": "Det er frivillig å oppgi ditt egentlige navn.\nHvis du velger å oppgi det, vil det blir anvendt for å gi deg som bruker anerkjennelse",
     "pt-login": "Logg inn",
+    "pt-login-button": "Logg inn",
     "pt-createaccount": "Opprett konto",
+    "pt-userlogout": "Logg ut",
     "php-mail-error-unknown": "Ukjent feil i PHPs mail()-funksjon",
     "user-mail-no-addy": "Forsøkte å sende e-post uten e-postadresse",
     "user-mail-no-body": "Prøvde å sende e-post med tom eller for kort brødtekst.",
     "resetpass-temp-password": "Midlertidig passord:",
     "resetpass-abort-generic": "Endring av passord har blitt avbrutt av en utvidelse.",
     "resetpass-expired": "Passordet ditt har utløpt. Vær vennlig å angi et nytt passord for å logge inn.",
-    "resetpass-expired-soft": "Passordet ditt har utløpt og må endres. Vær vennlig å angi et nytt passord, eller klikk avbryt for å endre det senere.",
+    "resetpass-expired-soft": "Passordet ditt har utløpt og må endres. Vær vennlig å angi et nytt passord, eller klikk \"{{int:resetpass-submit-cancel}}\" for å endre det senere.",
+    "resetpass-validity-soft": "Ditt passord er ikke gyldig: $1",
     "passwordreset": "Tilbakestilling av passord",
     "passwordreset-text-one": "Fyll ut skjemaet for å tilbakestille passordet",
     "passwordreset-text-many": "{{PLURAL:$1|Fyll inn ett av datafeltene for å tilbakestille passordet ditt via epost.}}",
     "revdelete-no-file": "Den spesifiserte filen finnes ikke.",
     "revdelete-show-file-confirm": "Er du sikker på at du ønsker å vise en slettet versjon av filen «<nowiki>$1</nowiki>» fra $2 kl. $3?",
     "revdelete-show-file-submit": "Ja",
+    "revdelete-selected-text": "{{PLURAL:$1|Valgt revisjon|Valgte revisjoner}} av [[:$2]]:",
+    "revdelete-selected-file": "{{PLURAL:$1|Valgt filversjon|Valgte filversjoner}} av [[:$2]]:",
     "logdelete-selected": "{{PLURAL:$1|Valgt loggoppføring|Valgte loggoppføringer}}:",
+    "revdelete-text-text": "Slettede revisjoner vil fortsatt finnes i sidens historikk, men deler av deres innhold vil være utilgjengelige for offentligheten.",
+    "revdelete-text-file": "Slettede filversjoner vil fortsatt finnes i filhistorikken, men deler av deres innhold vil være utilgjengelige for offentligheten.",
+    "logdelete-text": "Slettede hendelser i loggen vil fortsatt finnes i loggene, men deler av deres innhold vil være utilgjengelige for offentligheten.",
+    "revdelete-text-others": "Andre administratorer på {{SITENAME}} vil fortsatt ha tilgang til det skjulte innholdet og kan rulle det tilbake igjen via det samme grensesnittet, hvis ikke ytterligere begrensinger er satt.",
     "revdelete-confirm": "Bekreft at du ønsker å gjøre dette, at du forstår konsekvensene, og at du gjør det i samsvar med [[{{MediaWiki:Policy-url}}|retningslinjene]].",
     "revdelete-suppress-text": "Skjuling bør '''kun''' brukes i følgende tilfeller:\n* Mulig injurierende utsagn\n* Følsomme personlige opplysninger\n*: ''privatadresser og -telefonnumre, fødselsnumre og lignende''",
     "revdelete-legend": "Fastsett synlighetsbegrensninger",
     "search-file-match": "(matcher filinnhold)",
     "search-suggest": "Mente du: $1",
     "search-interwiki-caption": "Søsterprosjekter",
-    "search-interwiki-default": "$1-resultater:",
+    "search-interwiki-default": "Resultater fra $1:",
     "search-interwiki-more": "(mer)",
     "search-relatedarticle": "Relatert",
     "searcheverything-enable": "Søk i alle navnerom",
     "prefs-skin": "Utseende",
     "skin-preview": "Forhåndsvisning",
     "datedefault": "Ingen foretrukket",
-    "prefs-beta": "Betafunksjoner",
-    "prefs-datetime": "Dato og tid",
     "prefs-labs": "Lab-funksjoner",
     "prefs-user-pages": "Brukersider",
     "prefs-personal": "Brukerdata",
     "rcnotefrom": "Nedenfor er endringene gjort siden <strong>$2</strong> (frem til <strong>$1</strong> vises).",
     "rclistfrom": "Vis nye endringer med start fra $1",
     "rcshowhideminor": "$1 mindre endringer",
+    "rcshowhideminor-show": "Vis",
+    "rcshowhideminor-hide": "Skjul",
     "rcshowhidebots": "$1 roboter",
+    "rcshowhidebots-show": "Vis",
+    "rcshowhidebots-hide": "Skjul",
     "rcshowhideliu": "$1 registrerte brukere",
-    "rcshowhideanons": "$1 anonyme brukere",
+    "rcshowhideliu-show": "Vis",
+    "rcshowhideliu-hide": "Skjul",
+    "rcshowhideanons": "$1 uregistrerte brukere",
+    "rcshowhideanons-show": "Vis",
+    "rcshowhideanons-hide": "Skjul",
     "rcshowhidepatr": "$1 patruljerte endringer",
+    "rcshowhidepatr-show": "Vis",
+    "rcshowhidepatr-hide": "Skjul",
     "rcshowhidemine": "$1 mine endringer",
+    "rcshowhidemine-show": "Vis",
+    "rcshowhidemine-hide": "Skjul",
     "rclinks": "Vis siste $1 endringer i de siste $2 dagene<br />$3",
     "diff": "diff",
     "hist": "hist",
     "upload-permitted": "Tillatte filtyper: $1.",
     "upload-preferred": "Foretrukne filtyper: $1",
     "upload-prohibited": "Forbudte filtyper: $1.",
-    "uploadlog": "opplastingslogg",
     "uploadlogpage": "Opplastingslogg",
     "uploadlogpagetext": "Her er en liste over de siste opplastede filene.\nSe [[Special:NewFiles|galleriet over nye filer]] for en mer visuell visning",
     "filename": "Filnavn",
     "filereuploadsummary": "Filendringer:",
     "filestatus": "Opphavsrettsstatus:",
     "filesource": "Kilde:",
-    "uploadedfiles": "Filer som er lastet opp",
     "ignorewarning": "Ignorer advarselen og lagre filen likevel",
     "ignorewarnings": "Ignorer eventuelle advarsler",
     "minlength1": "Filnavn må være på minst én bokstav.",
     "overwroteimage": "last opp en ny versjon av «[[$1]]»",
     "uploaddisabled": "Opplastingsfunksjonen er slått av",
     "copyuploaddisabled": "Opplasting via nettadresse deaktivert.",
-    "uploadfromurl-queued": "Opplastingen din har blitt satt i kø.",
     "uploaddisabledtext": "Opplasting er slått av.",
     "php-uploaddisabledtext": "PHP-filopplasting er deaktivert. Sjekk innstillingen for file_uploads.",
     "uploadscripted": "Denne filen inneholder HTML eller skripting som kan feiltolkes av en nettleser.",
+    "uploadscriptednamespace": "Denne SVG-filen inneholder et ulovlig navnerom \"$1\"",
     "uploadinvalidxml": "XML-en i den opplastede filen kunne ikke tolkes.",
     "uploadvirus": "Denne filen inneholder virus! Detaljer: $1",
     "uploadjava": "Filen er en ZIP-fil som inneholder en Java-fil av typen .class.\nDet er ikke tillatt å laste opp Java-filer, fordi de kan omgå sikkerhetsrestriksjoner.",
     "upload-misc-error": "Ukjent opplastingsfeil",
     "upload-misc-error-text": "En ukjent feil forekom under opplastingen.\nBekreft at adressen er gyldig og tilgjengelig, og prøv igjen.\nOm problemet fortsetter, kontakt en [[Special:ListUsers/sysop|administrator]].",
     "upload-too-many-redirects": "URL-en inneholdt for mange omdirigeringer",
-    "upload-unknown-size": "Ukjent størrelse",
     "upload-http-error": "En HTTP-feil oppstod: $1",
     "upload-copy-upload-invalid-domain": "Opplasting av kopier er ikke tilgjengelig fra dette domenet.",
     "backend-fail-stream": "Kunne ikke strømme filen $1.",
     "img-auth-streaming": "Sender «$1».",
     "img-auth-public": "Funksjonen til img_auth.php er å lage filer fra en privat wiki.\nDenne wikien er satt opp som en offentlig wiki.\nFor best mulig sikkerhet er img_auth.php slått av.",
     "img-auth-noread": "Brukeren har ikke tilgang til å lese «$1».",
-    "img-auth-bad-query-string": "URL-en har en ugyldig spørrestreng.",
     "http-invalid-url": "Ugyldig internettadresse: $1",
     "http-invalid-scheme": "Internettadresser med «$1»-formen støttes ikke",
     "http-request-error": "HTTP-forespørselen feilet på grunn av en ukjent feil.",
     "filehist-dimensions": "Dimensjoner",
     "filehist-filesize": "Filstørrelse",
     "filehist-comment": "Kommentar",
-    "filehist-missing": "Fil mangler",
     "imagelinks": "Filbruk",
     "linkstoimage": "Følgende {{PLURAL:$1|side|$1 sider}} har lenker til denne filen:",
     "linkstoimage-more": "Mer enn $1 {{PLURAL:$1|side|sider}} lenker til denne filen.\nFølgende liste viser {{PLURAL:$1|den første siden|de $1 første sidene}}.\nEn [[Special:WhatLinksHere/$2|fullstendig liste]] er tilgjengelig.",
     "download": "last ned",
     "unwatchedpages": "Sider som ikke er overvåket",
     "listredirects": "Liste over omdirigeringer",
+    "listduplicatedfiles": "Liste av filer med duplikater",
+    "listduplicatedfiles-summary": "Dette er en liste av filer hvor den nyeste versjonen av filen er en duplikat av den nyeste versjonen av en annen fil. Bare lokale filer er sammenlignet.",
+    "listduplicatedfiles-entry": "[[:File:$1|$1]] har [[$3|{{PLURAL:$2|en duplikat|$2 duplikater}}]].",
     "unusedtemplates": "Ubrukte maler",
     "unusedtemplatestext": "Denne siden lister opp alle sider i malnavnerommet ({{ns:template}}:) som ikke er inkludert på en annen side. Husk å sjekke for andre slags lenker til malen før du sletter den.",
     "unusedtemplateswlh": "andre lenker",
     "listgrouprights-removegroup-self": "Kan ta vekk {{PLURAL:$2|gruppe|grupper}} fra egen konto: $1",
     "listgrouprights-addgroup-self-all": "Kan legge til alle grupper til egen konto",
     "listgrouprights-removegroup-self-all": "Kan ta bort alle grupper fra egen konto",
+    "trackingcategories": "Sporingskategori",
+    "trackingcategories-summary": "Denne siden lister sporingskategorier som er automatisk befolket av Mediawiki-programvaren. Deres navn kan bli endret ved å redigere de tilhørende systembeskjedene i {{ns:8}}-navnerommet.",
+    "trackingcategories-msg": "Sporingskategori",
+    "trackingcategories-name": "Beskjednavn",
+    "trackingcategories-desc": "Kategori-inklusjonskriterium",
+    "noindex-category-desc": "Denne siden indekseres ikke av roboter fordi den er merket med det magiske ordet <code><nowiki>__NOINDEX__</nowiki></code> og er i navnerom der dette flagget tillates.",
+    "index-category-desc": "Denne siden er påført det magiske ordet <code><nowiki>__INDEX__</nowiki></code> (og er i et navnerom hvor flagget er tillatt), og vil derfor bli indeksert av roboter selv når det normalt ikke ville skjedd.",
+    "post-expand-template-inclusion-category-desc": "Etter ekspandering av alle malene ble siden større enn <code>$wgMaxArticleSize</code>, så noen maler kunne ikke ekspanderes.",
+    "post-expand-template-argument-category-desc": "Etter ekspandering av et malargument (noe i trippel krøllparentes, slik som <code>{{{Foo}}})</code>, så er siden større en <code>$wgMaxArticleSize</code>.",
+    "expensive-parserfunction-category-desc": "For mange kostbare parserfunksjoner (som <code>#ifexist</code>) er inkludert på en side. Se [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit Manual:$wgExpensiveParserFunctionLimit].",
+    "broken-file-category-desc": "Kategorien blir lagt til hvis siden inneholder en brutt fil-lenke (en lenke for å bygge inn en fil når filen selv ikke eksisterer).",
+    "hidden-category-category-desc": "Dette er en kategori merket med <code><nowiki>__HIDDENCAT__</nowiki></code>, som hindrer den fra å vises i siders kategorioversikt som standard.",
+    "trackingcategories-nodesc": "Ingen beskrivelse er tilgjengelig",
+    "trackingcategories-disabled": "Kategorien er deaktivert",
     "mailnologin": "Ingen avsenderadresse",
     "mailnologintext": "Du må være [[Special:UserLogin|logget inn]] og ha en gyldig e-postadresse satt i [[Special:Preferences|brukerinnstillingene]] for å sende e-post til andre brukere.",
     "emailuser": "E-post til denne brukeren",
     "emailuser-title-notarget": "E-post til bruker",
     "emailpage": "E-post til bruker",
     "emailpagetext": "Du kan bruke skjemaet under for å sende en e-post til denne {{GENDER:$1|brukeren}}.\nE-postadressen du har satt i [[Special:Preferences|innstillingene dine]] vil vises i «Fra»-feltet i e-posten, slik at mottakeren kan svare deg direkte.",
-    "usermailererror": "E-postobjekt returnerte feilen:",
     "defemailsubject": "E-post fra {{SITENAME}}-brukeren «$1»",
     "usermaildisabled": "Brukerepost deaktivert",
     "usermaildisabledtext": "Du kan ikke sende epost til andre brukere på denne wikien",
     "noemailtitle": "Ingen e-postadresse",
     "noemailtext": "Dene brukeren har ikke oppgitt en gyldig e-postadresse.",
-    "nowikiemailtitle": "Ingen e-post tillatt",
     "nowikiemailtext": "Denne brukeren har valgt å ikke motta e-post fra andre brukere.",
     "emailnotarget": "Ikke-eksisterende eller ugyldig brukernavn for mottaker.",
     "emailtarget": "Skriv inn brukernavnet på mottakeren",
     "nowatchlist": "Du har ingenting i overvåkningslisten.",
     "watchlistanontext": "Vennligst $1 for å vise eller redigere sider på overvåkningslisten din.",
     "watchnologin": "Ikke logget inn",
-    "watchnologintext": "Du må være [[Special:UserLogin|logget inn]] for å kunne endre overvåkningslisten.",
     "addwatch": "Legg til i overvåkningslisten",
     "addedwatchtext": "Siden «[[:$1]]» er lagt til [[Special:Watchlist|overvåkningslisten]] din.\nFremtidige endringer til denne siden og den tilhørende diskusjonssiden blir listet opp der.",
     "removewatch": "Fjern fra overvåkningslisten",
     "watching": "Overvåker…",
     "unwatching": "Fjerner fra overvåkningsliste…",
     "watcherrortext": "Det oppsto en feil under endring av overvåkningsinnstillingene dine for «$1».",
-    "enotif_mailer": "{{SITENAME}}s påminnelsessystem",
     "enotif_reset": "Merk alle sider som besøkt",
     "enotif_impersonal_salutation": "{{SITENAME}}-bruker",
     "enotif_subject_deleted": "{{SITENAME}}-siden $1 har blitt slettet av {{gender:$2|$2}}",
     "excontent": "Innholdet var: «$1»",
     "excontentauthor": "innholdet var «$1» (og eneste bidragsyter var [[Special:Contributions/$2|$2]])",
     "exbeforeblank": "innholdet før siden ble tømt var: «$1»",
-    "exblank": "siden var tom",
     "delete-confirm": "Slett «$1»",
     "delete-legend": "Slett",
     "historywarning": "Advarsel: Siden du er i ferd med å slette har en historikk med omtrent {{PLURAL:$1|én revisjon|$1 revisjoner}}:",
     "delete-edit-reasonlist": "Rediger begrunnelser for sletting",
     "delete-toobig": "Denne siden har en stor redigeringshistorikk, med over {{PLURAL:$1|$1&nbsp;revisjon|$1&nbsp;revisjoner}}. Muligheten til å slette slike sider er begrenset for å unngå utilsiktet forstyrring av {{SITENAME}}.",
     "delete-warning-toobig": "Denne siden har en stor redigeringshistorikk, med over {{PLURAL:$1|$1&nbsp;revisjon|$1&nbsp;revisjoner}}. Sletting av denne siden kan forstyrre databasen til {{SITENAME}}; vær varsom.",
-    "deleting-backlinks-warning": "'''Advarsel:''' Andre sider linker til eller inkluderer siden du er i ferd med å slette.",
+    "deleting-backlinks-warning": "'''Advarsel:''' [[Special:WhatLinksHere/{{FULLPAGENAME}|Andre sider]] lenker til eller inkluderer siden du er i ferd med å slette.",
     "rollback": "Fjern redigeringer",
     "rollback_short": "Tilbakestill",
     "rollbacklink": "tilbakestill",
     "sp-contributions-newbies-sub": "For nybegynnere",
     "sp-contributions-newbies-title": "Bidrag av nye kontoer",
     "sp-contributions-blocklog": "blokkeringslogg",
+    "sp-contributions-suppresslog": "undertrykte brukerbidrag",
     "sp-contributions-deleted": "slettede brukerbidrag",
     "sp-contributions-uploads": "opplastinger",
     "sp-contributions-logs": "logger",
     "sp-contributions-search": "Søk etter bidrag",
     "sp-contributions-username": "IP-adresse eller brukernavn:",
     "sp-contributions-toponly": "Vis kun endringer som er gjeldende revisjoner",
+    "sp-contributions-newonly": "Bare vis bidrag som er sideopprettinger",
     "sp-contributions-submit": "Søk",
     "whatlinkshere": "Lenker hit",
     "whatlinkshere-title": "Sider som lenker til «$1»",
     "allmessagesname": "Navn",
     "allmessagesdefault": "Standardtekst",
     "allmessagescurrent": "Nåværende tekst",
-    "allmessagestext": "Dette er en liste over tilgjengelige systemmeldinger i MediaWiki-navnerommet.\nBesøk [//translatewiki.net translatewiki.net] om du ønsker å bidra med oversettelse av MediaWiki.",
+    "allmessagestext": "Dette er en liste over tilgjengelige systemmeldinger i MediaWiki-navnerommet.\nBesøk [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation MediaWiki Oversettelse] og [//translatewiki.net translatewiki.net] om du ønsker å bidra med oversettelse av MediaWiki.",
     "allmessagesnotsupportedDB": "''{{ns:special}}:Allmessages'' kan ikke brukes fordi '''$wgUseDatabaseMessages''' er slått av.",
     "allmessages-filter-legend": "Filtrér",
     "allmessages-filter": "Filtrér etter tilpasningsgrad",
     "importunknownsource": "Ukjent importkildetype",
     "importcantopen": "Kunne ikke åpne importfil",
     "importbadinterwiki": "Ugyldig interwikilenke",
-    "importnotext": "Tom eller ingen tekst",
     "importsuccess": "Importering ferdig.",
-    "importhistoryconflict": "Motstridende revisjoner finnes (siden kan ha blitt importert tidligere)",
     "importnosources": "Ingen transwikiimportkilder er angitt, og direkte historikkimporteringer er slått av.",
     "importnofile": "Ingen importfil opplastet.",
     "importuploaderrorsize": "Importfilopplasting mislyktes. Filen er større enn tillatt opplastingsstørrelse.",
index ca755c0..82d52f4 100644 (file)
     "permalink": "Vaste verwiezing",
     "print": "Aofdrokken",
     "view": "Lezen",
+    "view-foreign": "Bekieken op $1",
     "edit": "Bewarken",
     "create": "Anmaken",
     "editthispage": "Disse zied bewarken",
     "youhavenewmessages": "Je hebben $1 ($2).",
     "youhavenewmessagesfromusers": "Je hebben $1 van {{PLURAL:$3|n aandere gebruker|$3 gebrukers}} ($2).",
     "youhavenewmessagesmanyusers": "Je hebben $1 van n bulte gebrukers ($2).",
-    "newmessageslinkplural": "{{PLURAL:$1|n niej bericht|nieje berichten}}",
-    "newmessagesdifflinkplural": "leste {{PLURAL:$1|wieziging|wiezigingen}}",
+    "newmessageslinkplural": "{{PLURAL:$1|n niej bericht|999=nieje berichten}}",
+    "newmessagesdifflinkplural": "leste {{PLURAL:$1|wieziging|999=wiezigingen}}",
     "youhavenewmessagesmulti": "Je hebben nieje berichten op $1",
     "editsection": "bewark",
     "editold": "bewark",
     "passwordtooshort": "Wachtwoorden mutten uut tenminsten {{PLURAL:$1|$1 teken|$1 tekens}} bestaon.",
     "password-name-match": "Joew wachtwoord en gebrukersnaam maggen niet liek alleens ween.",
     "password-login-forbidden": "t Gebruuk van disse gebrukersnaam mit dit wachtwoord is niet toe-estaon.",
-    "mailmypassword": "Niej wachtwoord opsturen",
+    "mailmypassword": "Wachtwoord opniej instellen",
     "passwordremindertitle": "Niej tiedelik wachtwoord veur {{SITENAME}}",
     "passwordremindertext": "Der hef der ene evreugen, vanaof t IP-adres $1 (warschienlik jie zelf),\num n niej wachtwoord veur {{SITENAME}} ($4) op te sturen.\nDer is n tiedelik wachtwoord an-emaakt veur gebruker \"$2\":\n\"$3\". As dit niet de bedoeling was, meld dan effen an en kies n niej wachtwoord.\nJoew tiedelike wachtwoord zal verlopen over {{PLURAL:$5|één dag|$5 dagen}}.\n\nA'j dit verzeuk niet zelf edaon hebben of a'j t wachtwoord weer weten\nen t niet meer wiezigen willen, negeer dit bericht dan\nen blief joew bestaonde wachtwoord gebruken.",
     "noemail": "Gien netpostadres eregistreerd veur \"$1\".",
     "accountcreatedtext": "De gebrukersnaam veur [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|talk]]) is an-emaakt.",
     "createaccount-title": "Gebrukers anmaken veur {{SITENAME}}",
     "createaccount-text": "Der hef der ene n gebruker an-emaakt op {{SITENAME}} ($4), mit de naam $2 en t wachtwoord \"$3\". \nMeld je eigen noen an en wiezig t wachtwoord.\n\nNegeer dit bericht as disse gebruker zonder joew toestemming an-emaakt is.",
-    "usernamehasherror": "In n gebrukersnaam ma'j gien hekjen gebruken.",
     "login-throttled": "Je hebben lestens te vake eprobeerd um an te melden mit n verkeerd wachtwoord.\nJe mutten effen $1 wachten veurda'j t opniej proberen.",
     "login-abort-generic": "Je bin niet an-emeld. De procedure is aofebreuken.",
     "loginlanguagelabel": "Taal: $1",
     "suspicious-userlogout": "Joew verzeuk um of te melden is aofewezen umdat t dernaor uutziet dat t verstuurd is deur n kepotte webkieker of tussenopslagbuffer",
     "createacct-another-realname-tip": "Joew echte naam opgeven is niet verplicht.\nA'j t invullen, dan zu'w t gebruken um erkenning te geven veur joew warkzaamhejen.",
+    "pt-login": "Anmelden",
+    "pt-login-button": "Anmelden",
+    "pt-createaccount": "Inschrieven",
+    "pt-userlogout": "Aofmelden",
     "php-mail-error-unknown": "Der was n onbekende fout mit de mail()-funksie van PHP",
     "user-mail-no-addy": "Eprobeerd n berichjen te versturen zonder n netpostadres",
     "user-mail-no-body": "Der is eprobeerd n netbreef zonder tekste of mit n biester korte tekste te versturen.",
     "changepassword": "Wachtwoord wiezigen",
-    "resetpass_announce": "Je bin an-emeld mit n veurlopige kode die mit de netpost toe-estuurd wörden. Um t anmelden te voltooien, mu'j n niej wachtwoord invoeren:",
+    "resetpass_announce": "Um t anmelden te voltooien, mu'j n niej wachtwoord invoeren.",
     "resetpass_text": "<!-- Tekste hier invoegen -->",
     "resetpass_header": "Wachtwoord wiezigen",
     "oldpassword": "Wachtwoord da'j noen hebben",
     "retypenew": "Niej wachtwoord (opniej)",
     "resetpass_submit": "Voer t wachtwoord in en meld je an",
     "changepassword-success": "Joew wachtwoord is ewiezigd!",
+    "changepassword-throttled": "Je hebben lestens te vake eprobeerd um an te melden mit n verkeerd wachtwoord.\nJe mutten effen $1 wachten veurda'j t opniej proberen.",
     "resetpass_forbidden": "Wachtwoorden kunnen niet ewiezigd wörden",
     "resetpass-no-info": "Je mutten an-emeld ween veurda'j disse zied gebruken kunnen.",
     "resetpass-submit-loggedin": "Wachtwoord wiezigen",
     "resetpass-abort-generic": "De wachtwoordwieziging is aofebreuken deur n uutbreiding.",
     "passwordreset": "Wachtwoord opniej instellen",
     "passwordreset-text-one": "Vul dit formulier in um joew wachtwoord opniej in te stellen.",
-    "passwordreset-text-many": "{{PLURAL:$1|Vul een van de gegevensvelden in um joew wachtwoord opniej in te stellen.}}",
+    "passwordreset-text-many": "{{PLURAL:$1|Vul een van de gegevensvelden in um per netpost n tiejelik wachtwoord te ontvangen.}}",
     "passwordreset-legend": "Wachtwoord opniej instellen",
     "passwordreset-disabled": "Je kunnen op disse wiki joew wachtwoord niet opniej instellen.",
     "passwordreset-emaildisabled": "Netpostmeugelikhejen bin uutezet op disse wiki.",
     "content-failed-to-parse": "Kon de inhoud van t MIME-type $2 veur t model $1 niet verwarken: $3.",
     "invalid-content-data": "Ongeldige inhoudsgegevens",
     "content-not-allowed-here": "De inhoud \"$1\" is niet toe-estaan op de zied [[$2]].",
-    "editwarning-warning": "A'j disse zied verlaoten dan bi'j de wieziging die'j emaakt hebben waorschienlik kwiet.\nA'j an-emeld bin, dan ku'j disse waorschuwing uutzetten in t tabblad \"Bewarkingsveld\" in joew veurkeuren.",
+    "editwarning-warning": "A'j disse zied verlaoten dan bi'j de wieziging die'j emaakt hebben waorschienlik kwiet.\nA'j an-emeld bin, dan ku'j disse waorschuwing uutzetten in t tabblad \"{{int:prefs-editing}}\" in joew veurkeuren.",
     "content-model-wikitext": "wikitekste",
     "content-model-text": "tekste zonder opmaak",
     "content-model-javascript": "JavaScript",
     "revdelete-hide-user": "Gebrukersnaam/IP-adres van disse gebruker",
     "revdelete-hide-restricted": "Gegevens veur beheerders en aander volk onderdrokken",
     "revdelete-radio-same": "(niet wiezigen)",
-    "revdelete-radio-set": "Zichtbaor",
-    "revdelete-radio-unset": "Verbörgen",
+    "revdelete-radio-set": "Verbörgen",
+    "revdelete-radio-unset": "Zichtbaor",
     "revdelete-suppress": "Gegevens veur beheerders en aander volk onderdrokken",
     "revdelete-unsuppress": "Beparkingen veur weerummezetten versies vortdoon",
     "revdelete-log": "Reden:",
     "shown-title": "Laot $1 {{PLURAL:$1|resultaot|resultaoten}} per zied zien",
     "viewprevnext": "($1 {{int:pipe-separator}} $2) ($3)",
     "searchmenu-exists": "'''Der is n zied mit de naam \"[[:$1]]\" op disse wiki.'''",
-    "searchmenu-new": "'''De zied \"[[:$1]]\" op disse wiki anmaken!'''",
+    "searchmenu-new": "<strong>De zied \"[[:$1]]\" op disse wiki anmaken!</strong> \n{{PLURAL:$2|0=|Zie oek de zied mit joew zeukresultaoten.|Zie oek de lieste mit evunnen zeukresultaoten.}}",
     "searchprofile-articles": "Artikels",
     "searchprofile-project": "Hulp- en projektziejen",
     "searchprofile-images": "Multimedia",
     "search-section": "(onderwarp $1)",
     "search-suggest": "Bedoelden je: $1",
     "search-interwiki-caption": "Zusterprojekten",
-    "search-interwiki-default": "$1 resultaoten:",
+    "search-interwiki-default": "Resultaoten van $1:",
     "search-interwiki-more": "(meer)",
     "search-relatedarticle": "Verwaant",
     "searcheverything-enable": "In alle naamruumten zeuken",
     "prefs-skin": "{{SITENAME}}-uterlik",
     "skin-preview": "bekieken",
     "datedefault": "Gien veurkeur",
-    "prefs-beta": "Bètafunksies",
-    "prefs-datetime": "Daotum en tied",
     "prefs-labs": "Alphafunksies",
     "prefs-user-pages": "Gebrukersziejen",
     "prefs-personal": "Gebrukersgegevens",
     "recentchanges-label-unpatrolled": "Disse bewarking is nog niet nao-ekeken",
     "recentchanges-label-plusminus": "Disse ziedgrootte is mit dit antal bytes ewiezigd",
     "recentchanges-legend-newpage": "(zie oek de [[Special:NewPages|lieste mit nieje ziejen]])",
-    "rcnotefrom": "Dit bin de wiezigingen sinds <b>$2</b> (maximum van <b>$1</b> wiezigingen).",
+    "rcnotefrom": "Dit bin de wiezigingen sinds <strong>$2</strong> (maximum van <strong>$1</strong> wiezigingen).",
     "rclistfrom": "Bekiek wiezigingen vanaof $1",
     "rcshowhideminor": "$1 kleine wiezigingen",
     "rcshowhidebots": "$1 botgebrukers",
-    "rcshowhideliu": "$1 an-emelde gebrukers",
+    "rcshowhideliu": "$1 eregistreerden gebrukers",
     "rcshowhideanons": "$1 anonieme gebrukers",
     "rcshowhidepatr": "$1 nao-ekeken bewarkingen",
     "rcshowhidemine": "$1 mien bewarkingen",
     "upload-permitted": "Toe-estaone bestaandstypes: $1.",
     "upload-preferred": "An-ewezen bestaandstypes: $1.",
     "upload-prohibited": "Verbeujen bestaandstypes: $1.",
-    "uploadlog": "logboek mit nieje bestaanden",
     "uploadlogpage": "Logboek mit nieje bestaanden",
     "uploadlogpagetext": "Hieronder steet n lieste mit bestaanden die net niej bin.\nZie de [[Special:NewFiles|uutstalling mit media]] veur n overzichte.",
     "filename": "Bestaandsnaam",
     "filereuploadsummary": "Bestaandswiezigingen:",
     "filestatus": "Auteursrechtstaotus",
     "filesource": "Bron",
-    "uploadedfiles": "Nieje bestaanden",
     "ignorewarning": "Negeer alle waorschuwingen",
     "ignorewarnings": "Negeer waorschuwingen",
     "minlength1": "Bestaandsnamen mutten uut tenminsten één letter bestaon.",
     "overwroteimage": "Nieje versie van \"[[$1]]\" op-estuurd",
     "uploaddisabled": "t Opsturen van bestaanden is uutezet.",
     "copyuploaddisabled": "t Opsturen van bestaanden via n webadres is uutezet.",
-    "uploadfromurl-queued": "Joew bestaand is in de wachtrie ezet.",
     "uploaddisabledtext": "t Opsturen van bestaanden is uutezet.",
     "php-uploaddisabledtext": "t Opsturen van PHP-bestaanden is uutezet. Kiek de instellingen veur t opsturen van bestaanden effen nao.",
     "uploadscripted": "In dit bestaand steet HTML- of skriptkode die verkeerd elezen kan wörden deur de webkieker.",
     "upload-misc-error": "Onbekende fout bie t inlaojen van joew bestaand",
     "upload-misc-error-text": "Der is bie t inlaojen van t bestaand n onbekende fout op-etrejen. \nKiek effen nao of de verwiezing t wel döt en probeer t opniej. \nAs t probleem zo blif, neem dan kontakt op mit één van de [[Special:ListUsers/sysop|beheerders]].",
     "upload-too-many-redirects": "Der zatten te veule deurverwiezingen in de URL.",
-    "upload-unknown-size": "Onbekende grootte",
     "upload-http-error": "Der is n HTTP-fout op-etrejen: $1",
     "upload-copy-upload-invalid-domain": "Bestaanden per kopie opsturen is niet beschikbaor vanuut dit domein.",
     "backend-fail-stream": "t Was niet meugelik t bestaand $1 te streumen.",
     "img-auth-streaming": "Bezig mit t streumen van \"$1\".",
     "img-auth-public": "t Doel van img_auth.php is de uutvoer van bestaanden van n besleuten wiki.\nDisse wiki is in-esteld as publieke wiki.\nUm beveiligingsredens is img_auth.php uutezet.",
     "img-auth-noread": "De gebruker hef gien leestoegang tot \"$1\".",
-    "img-auth-bad-query-string": "In t webadres steet n ongeldige zeukopdrachte.",
     "http-invalid-url": "Ongeldig webadres: $1",
     "http-invalid-scheme": "Webadressen mit de opmaak \"$1\" wörden niet ondersteund.",
     "http-request-error": "Fout bie t verzenden van t verzeuk.",
     "filehist-dimensions": "Grootte",
     "filehist-filesize": "Bestaandsgrootte",
     "filehist-comment": "Opmarkingen",
-    "filehist-missing": "Bestaand ontbrik",
     "imagelinks": "Bestaandsgebruuk",
     "linkstoimage": "Dit bestaand wörden gebruukt op de volgende {{PLURAL:$1|zied|$1 ziejen}}:",
     "linkstoimage-more": "Der {{PLURAL:$2|is|bin}} meer as $1 {{PLURAL:$1|verwiezing|verwiezingen}} naor dit bestaand.\nDe volgende lieste gif allinnig de eerste {{PLURAL:$1|verwiezing|$1 verwiezingen}} naor dit bestaand weer.\nDe [[Special:WhatLinksHere/$2|hele lieste]] is oek beschikbaor.",
     "emailuser-title-notarget": "Gebruker n bericht sturen",
     "emailpage": "Gebruker n bericht sturen",
     "emailpagetext": "Deur middel van dit formulier ku'j n bericht sturen naor disse {{GENDER:$1|gebruker}}.\nt Adres da'j op-egeven hebben bie [[Special:Preferences|joew veurkeuren]] zal as aofzender gebruukt wörden.\nDe ontvanger kan dus drek beantwoorden.",
-    "usermailererror": "Foutmelding bie t versturen:",
     "defemailsubject": "Bericht van {{SITENAME}}-gebruker \"$1\"",
     "usermaildisabled": "n Persoonlik berichjen sturen geet niet.",
     "usermaildisabledtext": "Je kunnen gien berichjes sturen naor aandere gebrukers van disse wiki",
     "noemailtitle": "Gebruker hef gien netpostadres op-egeven",
     "noemailtext": "Disse gebruker hef gien geldig e-mailadres in-evoerd.",
-    "nowikiemailtitle": "Netpost is niet toe-estaon",
     "nowikiemailtext": "Disse gebruker wil gien netpost toe-estuurd kriegen van aandere gebrukers.",
     "emailnotarget": "Niet-bestaonde of ongeldige ontvanger.",
     "emailtarget": "Voer de gebrukersnaam of ontvanger in",
     "nowatchlist": "Gien artikels in volglieste.",
     "watchlistanontext": "$1 is verplicht um joew volglieste te bekieken of te wiezigen.",
     "watchnologin": "Niet an-emeld",
-    "watchnologintext": "Um je volglieste an te passen mu'j eerst [[Special:UserLogin|an-emeld]] ween.",
     "addwatch": "Op mien volglieste zetten",
     "addedwatchtext": "De zied \"[[:$1]]\" steet noen op joew [[Special:Watchlist|volglieste]].\nToekomstige wiezigingen op disse zied en de overlegzied zullen hier vermeld wörden.",
     "removewatch": "Van mien volglieste aofhaolen",
     "watching": "Volg...",
     "unwatching": "Niet volgen...",
     "watcherrortext": "Der is n fout op-etrejen tiejens t wiezigen van joew volgliesinstellingen veur \"$1\".",
-    "enotif_mailer": "{{SITENAME}}-berichgevingssysteem",
     "enotif_reset": "Markeer alle ziejen as bezöcht.",
     "enotif_impersonal_salutation": "{{SITENAME}}-gebruker",
     "enotif_subject_deleted": "{{SITENAME}}: zied $1 is vortedaon deur {{GENDER:$2|$2}}",
     "enotif_lastvisited": "Zie $1 veur alle wiezigingen sinds joew leste bezeuk.",
     "enotif_lastdiff": "Zie $1 um disse wieziging te bekieken.",
     "enotif_anon_editor": "anonieme gebruker $1",
-    "enotif_body": "Huj $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nSamenvatting van de wieziging: $PAGESUMMARY $PAGEMINOREDIT\n\nKontaktgevevens van de auteur:\nNetpost: $PAGEEDITOR_EMAIL\nWiki: $PAGEEDITOR_WIKI\n\nJe kriegen veerder gien berichten, behalven a'j disse zied bezeuken.\nOp joew volglieste ku'j veur alle ziejen die'j volgen de waorschuwingsinstellingen deraof haolen.\n\nGroeten van t {{SITENAME}}-waorschuwingssysteem.\n\n--\nJe kunnen joew netpostinstellingen wiezigen op:\n{{canonicalurl:{{#special:Preferences}}}}\n\nJe kunnen de volgliestinstellingen wiezigen op:\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nJe kunnen de zied van joew volglieste aofhaolen deur op de volgende verwiezing te klikken:\n$UNWATCHURL\n\nOpmarkingen en veerdere hulpe:\n{{canonicalurl:{{MediaWiki:Helppage}}}}",
+    "enotif_body": "Huj $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nSamenvatting van de wieziging: $PAGESUMMARY $PAGEMINOREDIT\n\nKontaktgevevens van de auteur:\nNetpost: $PAGEEDITOR_EMAIL\nWiki: $PAGEEDITOR_WIKI\n\nJe kriegen veerder gien berichten, behalven a'j disse zied bezeuken terwiel je an-emeld bin. Op joew volglieste ku'j veur alle ziejen die'j volgen de waorschuwingsinstellingen deraof haolen.\n\nGroeten van t {{SITENAME}}-waorschuwingssysteem.\n\n--\nJe kunnen joew netpostinstellingen wiezigen op:\n{{canonicalurl:{{#special:Preferences}}}}\n\nJe kunnen de volgliestinstellingen wiezigen op:\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nJe kunnen de zied van joew volglieste aofhaolen deur op de volgende verwiezing te klikken:\n$UNWATCHURL\n\nOpmarkingen en veerdere hulpe:\n{{canonicalurl:{{MediaWiki:Helppage}}}}",
     "created": "an-emaakt",
     "changed": "ewiezigd",
     "deletepage": "Vortdoon",
     "excontent": "De tekste was: '$1'",
     "excontentauthor": "De tekste was: '$1' (zied an-emaakt deur: [[Special:Contributions/$2|$2]])",
     "exbeforeblank": "veurdat disse zied leegemaakt wörden stung hier: '$1'",
-    "exblank": "Zied was leeg",
     "delete-confirm": "\"$1\" vortdoon",
     "delete-legend": "Vortdoon",
     "historywarning": "'''Waorschuwing''': de zied die'j vortdoon, hef $1 {{PLURAL:$1|versie|versies}}:",
     "protect-locked-blocked": "Je kunnen beveiligingsnivo's niet wiezigen terwiel je eblokkeerd bin. Hier bin de instellingen zo as ze noen bin veur de zied '''$1''':",
     "protect-locked-dblock": "Beveiligingsnivo's kunnen effen niet ewiezigd wörden umdat de databanke noen beveiligd is.\nHier staon de instellingen zo as ze noen bin veur de zied '''$1''':",
     "protect-locked-access": "Je hebben gien rechten um t beveilingsnivo van ziejen te wiezigen.\nHier staon de instellingen zo as ze noen bin veur de zied '''$1''':",
-    "protect-cascadeon": "Disse zied wörden beveiligd, umdat t op-eneumen is in de volgende {{PLURAL:$1|zied|ziejen}} die beveiligd {{PLURAL:$1|is|bin}} mit de kaskadeopsie. Je kunnen t beveiligingsnivo van disse zied anpassen, mer dat hef gien invleud op de kaskadebeveiliging.",
+    "protect-cascadeon": "Disse zied wörden beveiligd, umdat t op-eneumen is in de volgende {{PLURAL:$1|zied|ziejen}} die beveiligd {{PLURAL:$1|is|bin}} mit de kaskadeopsie. Wiezigingen in t beveiligingsnivo van disse zied hebben gien invleud op de kaskadebeveiliging.",
     "protect-default": "Veur alle gebrukers",
     "protect-fallback": "Allinnig gebrukers mit t recht \"$1\" toestaon",
     "protect-level-autoconfirmed": "Allinnig automaties bevestigden gebrukers toestaon",
     "range_block_disabled": "De meugelikheid veur beheerders um n groep adressen te blokkeren is uutezet.",
     "ipb_expiry_invalid": "De op-egeven verlooptied is ongeldig.",
     "ipb_expiry_temp": "Blokkeringen veur verbörgen gebrukers mutten permanent ween.",
-    "ipb_hide_invalid": "Kan disse gebruker niet verbargen; warschienlik hef e al te veule bewarkingen emaakt.",
+    "ipb_hide_invalid": "Kan disse gebruker niet verbargen; waorschienlik hef e al meer as {{PLURAL:$1|één bewarking|$1 bewarkingen}} edaon.",
     "ipb_already_blocked": "\"$1\" is al eblokkeerd",
     "ipb-needreblock": "$1 is al eblokkeerd.\nWi'j de instellingen wiezigen?",
     "ipb-otherblocks-header": "Aandere {{PLURAL:$1|blokkering|blokkeringen}}",
     "allmessagesname": "Naam",
     "allmessagesdefault": "Standardtekste",
     "allmessagescurrent": "De leste versie",
-    "allmessagestext": "Hieronder steet n lieste mit alle systeemteksten in de MediaWiki-naamruumte.\nKiek oek effen bie [https://www.mediawiki.org/wiki/Localisation MediaWiki-lokalisasie] en [//translatewiki.net translatewiki.net] a'j biedragen willen an de algemene vertaling veur MediaWiki.",
+    "allmessagestext": "Hieronder steet n lieste mit alle systeemteksten in de MediaWiki-naamruumte.\nKiek oek effen bie [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation MediaWiki-lokalisasie] en [//translatewiki.net translatewiki.net] a'j biedragen willen an de algemene vertaling veur MediaWiki.",
     "allmessagesnotsupportedDB": "Disse zied kan niet gebruukt wörden umdat '''$wgUseDatabaseMessages''' uutezet is.",
     "allmessages-filter-legend": "Filter",
     "allmessages-filter": "Filtreer op wiezigingen:",
     "importunknownsource": "Onbekend invoerbrontype",
     "importcantopen": "Kon t invoerbestaand niet los doon",
     "importbadinterwiki": "Foute interwikiverwiezing",
-    "importnotext": "Leeg of gien tekste",
     "importsuccess": "Invoeren suksesvol!",
-    "importhistoryconflict": "Der bin konflikten in de geschiedenisse van de zied (is misschien eerder al in-evoerd)",
     "importnosources": "Gien transwiki-invoerbronnen vastesteld en t drek inlaojen van versies is eblokkeerd.",
     "importnofile": "Der is gien invoerbestaand op-estuurd.",
     "importuploaderrorsize": "t Opsturen van t invoerbestaand is mislokt.\nt Bestaand is groter as de in-estelde limiet.",
     "importuploaderrortemp": "t Opsturen van t invoerbestaand is mislokt.\nDe tiedelike map is niet anwezig.",
     "import-parse-failure": "Fout bie t verwarken van de XML-invoer",
     "import-noarticle": "Der bin gien ziejen um in te voeren!",
-    "import-nonewrevisions": "Alle versies bin al eerder in-evoerd.",
+    "import-nonewrevisions": "Gien eerdere versies in-evoerd (alles was der al, of is overesleugen vanwegen fouten).",
     "xml-error-string": "$1 op regel $2, kolom $3 (byte $4): $5",
     "import-upload": "XML-gegevens derbie doon",
     "import-token-mismatch": "De sessiegegevens bin verleuren egaon. Probeer t opniej.",
     "svg-long-desc": "SVG-bestaand, uutgangsgrootte $1 × $2 beeldpunten, bestaandsgrootte: $3",
     "svg-long-desc-animated": "Bewegend SVG-bestaand, uutgangsgrootte $1 × $2 beeldpunten, bestaandsgrootte: $3",
     "svg-long-error": "Ongeldig SVG-bestaand: $1",
-    "show-big-image": "Volle resolusie",
+    "show-big-image": "Oorspronkelik bestaand",
     "show-big-image-preview": "Grootte van disse weergave: $1.",
     "show-big-image-other": "Aandere {{PLURAL:$2|resolusie|resolusies}}: $1.",
     "show-big-image-size": "$1 × $2 beeldpunten",
     "version-hook-name": "Hooknaam",
     "version-hook-subscribedby": "In-eschreven deur",
     "version-version": "(Versie $1)",
-    "version-license": "Lisensie",
+    "version-license": "MediaWiki-lisensie",
     "version-poweredby-credits": "Disse wiki wörden an-estuurd deur '''[https://www.mediawiki.org/ MediaWiki]''', auteursrecht © 2001-$1 $2.",
     "version-poweredby-others": "aanderen",
     "version-poweredby-translators": "vertalers van translatewiki.net",
     "version-entrypoints": "Webadressen veur ingangen",
     "version-entrypoints-header-entrypoint": "Ingang",
     "version-entrypoints-header-url": "Webadres",
-    "redirect": "Deurverwiezen op bestaandsnaam, gebrukersnummer of versienummer",
+    "redirect": "Deurverwiezen op bestaandsnaam, gebrukersnummer, ziednummer of versienummer",
     "redirect-legend": "Deurverwiezen naor n bestaand of zied",
-    "redirect-summary": "Disse spesiale zied verwis deur naor n bestaand (as de bestaandsnaam op-egeven wörden), n zied (as n versienummer op-egeven wörden) of n gebrukerszied (as t gebrukersnummer op-egeven wörden). Gebruuk: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/revision/328429]], of [[{{#Special:Redirect}}/user/101]].",
+    "redirect-summary": "Disse spesiale zied verwis deur naor n bestaand (as de bestaandsnaam op-egeven wörden), n zied (as n zied- of versienummer op-egeven wörden) of n gebrukerszied (as t gebrukersnummer op-egeven wörden). Gebruuk: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]], of [[{{#Special:Redirect}}/user/101]].",
     "redirect-submit": "Zeuk",
     "redirect-lookup": "Opzeuken:",
     "redirect-value": "Weerde:",
     "fileduplicatesearch-result-n": "Der {{PLURAL:$2|is één bestaand|bin $2 bestaanden}} die liek alleens bin as \"$1\".",
     "fileduplicatesearch-noresults": "Der is gien bestaand mit de naam \"$1\" evunnen.",
     "specialpages": "Spesiale ziejen",
-    "specialpages-note": "* Normale spesiale ziejen.\n* <strong class=\"mw-specialpagerestricted\">Beparkt toegankelike spesiale ziejen.</strong>\n* <span class=\"mw-specialpagecached\">Spesiale ziejen mit allinnig gegevens uut t tussengeheugen (kunnen verouwerd ween).</span>",
+    "specialpages-note": "* Normale spesiale ziejen.\n* <span class=\"mw-specialpagerestricted\">Beparkt toegankelike spesiale ziejen.</span>",
     "specialpages-group-maintenance": "Onderhoudsliesten",
     "specialpages-group-other": "Aandere spesiale ziejen",
     "specialpages-group-login": "Anmelden / inschrieven",
index 882c5dc..7241f53 100644 (file)
     "nowatchlist": "Du hest kene Indreeg op dien Oppasslist.",
     "watchlistanontext": "$1, dat du dien Oppasslist ankieken oder ännern kannst.",
     "watchnologin": "Du büst nich anmellt",
-    "watchnologintext": "Du must [[Special:UserLogin|anmellt]] wesen, wenn du dien Oppasslist ännern willst.",
     "addedwatchtext": "De Siet „<nowiki>$1</nowiki>“ is to diene [[Special:Watchlist|Oppasslist]] toföögt worrn.\nÄnnern, de in Tokumst an disse Siet un an de tohörige Diskuschoonssiet maakt warrt, sünd dor op oplist un de Siet is op de [[Special:RecentChanges|List vun de letzten Ännern]] fett markt. Wenn du de Siet nich mehr op diene Oppasslist hebben willst, klick op „Nich mehr oppassen“.",
     "removedwatchtext": "De Sied „[[:$1]]“ is nich mehr op [[Special:Watchlist|dien Oppasslist]].",
     "watch": "Oppassen",
index f5e6c51..66e60b0 100644 (file)
     "gotaccountlink": "लग इन",
     "userlogin-resetlink": "प्रवेश सम्बन्धी विवरणहरु बिर्सनु भयो?",
     "userlogin-resetpassword-link": "पासवर्ड भुल्नुभयो?",
+    "userlogin-helplink2": "प्रवेश गर्नको लागि सहयोग",
     "userlogin-createanother": "अर्को खाता खोल्नुहोस्",
     "createacct-join": "तपाईँका जानकारीहरू तल थप्नुहोस् ।",
     "createacct-another-join": "नयाँ खाताको जानकारी तल थप्नुहोस ।",
     "throttled-mailpassword": "बितेको {{PLURAL:$1|घण्टा|$1 घण्टाहरु}} भित्र एउटा प्रवेशशब्द अनुस्मारक पठाई सकिएको छ।\nदुरुपयोगबाट बचाउकोलागि प्रत्येक {{PLURAL:$1|घण्टा|$1 घण्टाहरु}}मा केवल एउटा प्रवेशशब्द अनुस्मारक पठाइन्छ।",
     "mailerror": " चिठी :$1 पठाउँदा त्रुटी भयो",
     "acct_creation_throttle_hit": "तपाईंको आईपी ठेगानाबाट आएका आगन्तुकद्वारा बितेको चौबिस घण्टामा यस विकिमा {{PLURAL:$1|एउटा खाता बनाइसकिएको छ|$1 खाताहरु बनाइसकिएका छन्}}, यस समयावधिमा यति नैं अधिकतम सीमा हो।\nअतः यस समय यस आईपी ठेगानाको प्रयोग गर्ने आगन्तुकले अरु खाता खोल्न सक्नेछैनन्।",
-    "emailauthenticated": "तपाà¤\88à¤\82à¤\95à¥\8b à¤\88-मà¥\87ल à¤ à¥\87à¤\97ाना $2 à¤\95à¥\8b $3 à¤®à¤¾ à¤ªà¥\8dरमाणित à¤\97रियो।",
-    "emailnotauthenticated": "तपाईँको इमेल ठेगाना अहिले सम्म प्रमाणित गरिएको छैन ।\nनिम्न सुविधाको लागि कुनै पनि इ-मेल पठाइने छैन ।",
+    "emailauthenticated": "तपाà¤\88à¤\82à¤\95à¥\8b à¤\87मà¥\87ल à¤ à¥\87à¤\97ाना $2 à¤\95à¥\8b $3 à¤®à¤¾ à¤ªà¥\8dरमाणित à¤\97रिà¤\8fà¤\95à¥\8b à¤¥ियो।",
+    "emailnotauthenticated": "तपाईँको इमेल ठेगाना अहिले सम्म प्रमाणित गरिएको छैन ।\nनिम्न सुविधाको लागि कुनै पनि इमेल पठाइने छैन ।",
     "noemailprefs": "निम्न सुविधाहरु राम्ररी काम गर्नको लागि तपाईको अभिरुचिमा आफ्नो ई-मेल ठेगाना खुलाउनुहोस् ।",
     "emailconfirmlink": "तपाईंको ई-मेल ठेगाना पक्का गर्नुहोस्",
     "invalidemailaddress": "ई-मेल ठेगाना स्वीकार गर्न सकिएन किन भनें यो सही प्रारूपमा छैन, कृपया सही प्रारूपको  ठेगाना दिनुहोस्।",
     "accountcreatedtext": "[[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|वार्ता]])$1 प्रयोगकर्ताको लागि खाता खोलिएको छ ।",
     "createaccount-title": "{{SITENAME}}कोलागि खाता खोल्ने काम",
     "createaccount-text": "कसैले तपाईको इमेल ठेगानालाई {{SITENAME}} ($4) मा \"$2\" नामको खाता बनाएको छ, जसको पासवर्ड \"$3\" छ।",
-    "usernamehasherror": "प्रयोगकर्तानाममा ह्यास अक्षरहरु राख्न मिल्दैन।",
     "login-throttled": "तपाईंले भर्खरै धेरै पल्ट प्रवेशको निम्ति प्रयास गर्नुभएको छ ,कृपया $1 पर्खेर मात्र प्रयास गर्नुहोस्।",
     "login-abort-generic": "तपाईंको प्रवेश असफल भयो - छोड़ियो",
     "loginlanguagelabel": "भाषा: $1",
     "suspicious-userlogout": "तपाईंको निर्गमन अनुरोध अस्विकार गरिन्छ किन कि यो खराब ब्राउजर वा क्यासिङ प्रोक्सिले पठाएको जस्तो देखिन्छ।",
+    "pt-login": "प्रवेश",
+    "pt-login-button": "प्रवेश",
+    "pt-createaccount": "खाता खोल्नुहोस्",
+    "pt-userlogout": "निर्गमन (लग आउट)",
     "php-mail-error-unknown": "PHP मेल() क्रियामा अज्ञात त्रुटि",
     "user-mail-no-addy": "इमेल ठेगाना बिना नै इमेल पठाउन खोजिएको थियो।",
     "changepassword": "पासवर्ड परिवर्तन गर्नुहोस्",
-    "resetpass_announce": "तपाà¤\88à¤\82लà¥\87 à¤\85सà¥\8dथायà¥\80 à¤\88-मà¥\87ल à¤\95à¥\8bडà¤\95à¥\8b à¤\86धारमा à¤ªà¥\8dरवà¥\87श à¤\97रà¥\8dनà¥\81 à¤­à¤\8fà¤\95à¥\8bà¤\9b।\nपà¥\8dरवà¥\87शà¤\95ारà¥\8dय à¤ªà¥\82रा à¤\97रà¥\8dन à¤¨à¤¯à¤¾à¤\81 à¤ªà¥\8dरवà¥\87श à¤¶à¤µà¥\8dद à¤¯à¤¹à¤¾à¤\81 à¤¦à¤¿à¤¨à¥\81हà¥\8bसà¥\8d:",
+    "resetpass_announce": "पà¥\8dरवà¥\87श à¤ªà¥\82रा à¤\97रà¥\8dन à¤¤à¤ªà¤¾à¤\88à¤\81लà¥\87 à¤ªà¤¾à¤¸à¤µà¤°à¥\8dड à¤ªà¤°à¤¿à¤µà¤°à¥\8dतन à¤\97रà¥\8dनà¥\81परà¥\8dà¤\9b à¥¤",
     "resetpass_text": "<!-- Add text here -->",
     "resetpass_header": "खाताको प्रवेशशव्द परिवर्तन गर्ने",
     "oldpassword": "पुरानो पासवर्ड:",
     "resettokens-no-tokens": "पूर्वरुपमा फर्काउन कुनै पनि टोकन छैन ।",
     "resettokens-legend": "टोकनहरू पूर्वरुपमा फर्काउने",
     "resettokens-tokens": "टोकनहरू:",
+    "resettokens-done": "टोकन पूर्वरुपमा फर्काइयो ।",
     "bold_sample": "गाढा अक्षर",
     "bold_tip": "गाढा अक्षर",
     "italic_sample": "इटालिक पाठ",
     "revdelete-hide-image": "फाइल कमेन्ट लुकाउने",
     "revdelete-hide-name": "कार्य र गन्तब्य लुकाउने",
     "revdelete-hide-comment": "सम्पादन टिप्पणी",
-    "revdelete-hide-user": "समà¥\8dपादà¤\95à¤\95à¥\8b à¤ªà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dता à¤¨à¤¾à¤®/IP à¤²à¥\81à¤\95ाà¤\89नà¥\87",
+    "revdelete-hide-user": "समà¥\8dपादà¤\95à¤\95à¥\8b à¤ªà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dता à¤¨à¤¾à¤®/IP à¤ à¥\87à¤\97ाना",
     "revdelete-hide-restricted": "प्रवन्धक वा अरुबाट डेटा कम लिने",
     "revdelete-radio-same": "(परिवर्तन नगर्नुहोस्)",
     "revdelete-radio-set": "लुकाइएको",
     "compareselectedversions": "छानिएका संस्करणहरू दाँज्नुहोस्",
     "showhideselectedversions": "छानिएका पुनरावलोकनहरु देखाउने/लुकाउने",
     "editundo": "रद्द गर्ने",
+    "diff-empty": "(कुनै भिन्नता छैन)",
     "diff-multi-manyusers": "($2 {{PLURAL:$2|भन्दा अधिक प्रयोगकर्ता|भन्दा अधिक प्रयोगकर्ताहरु}}द्वारा {{PLURAL:$1|एउटा मध्यवर्ती संशोधन|$1 मध्यवर्ती संशोधनहरु}} नदेखाइएको)",
     "searchresults": "खोज नतिजाहरू",
     "searchresults-title": " \"$1\"को लागि खोज नतिजाहरु",
     "prefs-skin": "काँचुली",
     "skin-preview": "पूर्वावलोकन",
     "datedefault": "कुनै अभिरुचि छैन",
-    "prefs-beta": "बिटा गुणहरु",
-    "prefs-datetime": "मिति र समय",
     "prefs-labs": "प्रयोगशाला गुणहरु",
     "prefs-user-pages": "प्रयोगकर्ता पृष्ठहरू",
     "prefs-personal": "प्रयोगकर्ताको विवरण",
     "right-hideuser": "एक प्रयोगकर्ता नाम रोक्ने, सार्वजनिकहुनबाट लुकाउने",
     "right-ipblock-exempt": "IP रोक,स्वत: रोक तथा स्तर रोक कटेर जाने",
     "right-proxyunbannable": "प्रोक्सिको स्वत: रोक कटेर जाने",
-    "right-unblockself": "तिनà¥\80हरà¥\81 à¤\86फà¥\88à¤\82लाà¤\88 à¤\96à¥\81लà¥\8dला à¤\97रà¥\8dà¤\9bन्",
+    "right-unblockself": "à¤\86फà¥\88à¤\82लाà¤\88 à¤\96à¥\81लà¥\8dला à¤\97रà¥\8dनà¥\81हà¥\8bस्",
     "right-protect": "सुरक्षा स्तर परिवर्तन गर्ने र जोगाइएका पृष्ठहरु सम्पादन गर्ने",
     "right-editprotected": "\"{{int:protect-level-sysop}}\" को हैसियतले सुरक्षित पृष्ठहरु सम्पादन गर्ने",
     "right-editinterface": "प्रयोगकर्ता अन्तरमोहडा सम्पादन गर्ने",
     "action-suppressionlog": "यो व्यक्तिगत लग हेर्ने",
     "action-block": "यो प्रयोगकर्तालाई सम्पादन गर्नबाट रोक्ने",
     "action-protect": "यो पृष्ठको सुरक्षा स्तर परिवर्तन गर्ने",
-    "action-import": "यà¥\8b à¤ªà¥\83षà¥\8dठ à¤\85रà¥\8dà¤\95à¥\8b à¤µà¤¿à¤\95िबाà¤\9f à¤\86यात à¤\97रà¥\8dनà¥\87",
-    "action-importupload": "फाà¤\87ल à¤\89रà¥\8dधà¥\8dवभरणबाà¤\9f à¤«à¤¾à¤\87ल आयात गर्ने",
+    "action-import": "पà¥\83षà¥\8dठहरà¥\82 à¤\85रà¥\8dà¤\95à¥\8b à¤µà¤¿à¤\95िबाà¤\9f à¤\86यात à¤\97रà¥\8dनà¥\81हà¥\8bसà¥\8d",
+    "action-importupload": "पà¥\83षà¥\8dठहरà¥\82 à¤«à¤¾à¤\87ल à¤\89रà¥\8dधà¥\8dवभरणबाà¤\9f आयात गर्ने",
     "action-patrol": "अरुको सम्पादनलाई निगरानीको चिन्ह लगाउने",
     "action-autopatrol": "तपाईंको सम्पादनलाई गश्त रुपमा दाग दिनुहोस्",
     "action-unwatchedpages": "अवलोकन नगरिएका  पृष्ठहरुको सूची हेर्ने",
     "recentchanges-label-minor": "यो साधारण सम्पादन हो",
     "recentchanges-label-bot": "यो सम्पादन बोट द्वारा गरिएको थियो",
     "recentchanges-label-unpatrolled": "यो सम्पादन अहिले सम्म पट्रोल गरिएको छैन",
-    "recentchanges-legend-newpage": "$1 - नयाँ पृष्ठ",
+    "recentchanges-legend-newpage": "([[Special:NewPages|list of new pages]] यो पनि हेर्नुहोस्)",
     "recentchanges-legend-plusminus": "(''±१२३'')",
     "rcnotefrom": "'''$2''' देखिका परिवर्तनहरु तल ('''$1''' सम्मका देखाइन्छ)।",
     "rclistfrom": "$1 देखिका नयाँ परिवर्तनहरू देखाउनु",
     "rcshowhideminor": "$1 सामान्य सम्पादन",
+    "rcshowhideminor-show": "देखाउनुहोस्",
+    "rcshowhideminor-hide": "लुकाउनुहोस्",
     "rcshowhidebots": "$1 बोटहरू",
-    "rcshowhideliu": "$1 प्रवेश गरेका प्रयोगकर्ताहरु",
+    "rcshowhidebots-show": "देखाउनुहोस्",
+    "rcshowhidebots-hide": "लुकाउनुहोस्",
+    "rcshowhideliu": "$1 दर्ता गरेका प्रयोगकर्ताहरु",
+    "rcshowhideliu-show": "देखाउनुहोस्",
+    "rcshowhideliu-hide": "लुकाउनुहोस्",
     "rcshowhideanons": "$1 अज्ञात प्रयोगकर्ता",
+    "rcshowhideanons-show": "देखाउनुहोस्",
+    "rcshowhideanons-hide": "लुकाउनुहोस्",
     "rcshowhidepatr": "$1 पट्रोल गरिएका सम्पादनहरु",
+    "rcshowhidepatr-show": "देखाउनुहोस्",
+    "rcshowhidepatr-hide": "लुकाउनुहोस्",
     "rcshowhidemine": "$1 मेरा सम्पादनहरु",
+    "rcshowhidemine-show": "देखाउनुहोस्",
+    "rcshowhidemine-hide": "लुकाउनुहोस्",
     "rclinks": "पछिल्ला $1 परिवर्तनहरु पछिल्ला $2 दिनहरुमा<br />$3",
     "diff": "भिन्न",
     "hist": "इतिहास",
     "upload-permitted": "अनुमति पाएका फ़ाइल प्रकार:$1.",
     "upload-preferred": "चाहिएका फ़ाइल प्रकार:$1.",
     "upload-prohibited": "निषिद्ध फ़ाइल प्रकार:$1.",
-    "uploadlog": "उर्ध्वभरण लग",
     "uploadlogpage": "उर्ध्वभरण लग",
     "uploadlogpagetext": "भर्खरै उर्ध्वभरण गरिएका फ़ाइलहरुको सूची तल दिइएकोछ ।\nविस्तृत अवलोकनको लागि [[Special:NewFiles|नयाँ फ़ाइलको ग्यालरी]]मा हेर्नुहोस्।",
     "filename": "फाइलनाम",
     "filereuploadsummary": "फ़ाइल परिवर्तनहरू:",
     "filestatus": "लेखाधिकार स्थिति:",
     "filesource": "स्रोत:",
-    "uploadedfiles": "उर्ध्वभरण गरिएका फाइलहरू",
     "ignorewarning": "चेतावनीलाई अनदेखा गर्दै जसरि भएपनि फाइल संग्रह गर्ने",
     "ignorewarnings": "कुनै चेतावनीप्रति ध्यान नदिने",
     "minlength1": "फाइलको नाम कम्तिमा एक अक्षरको हुनैपर्छ।",
     "overwroteimage": " \"[[$1]]\"को एउटा नयाँ संस्करण उर्ध्वभरण गरियो",
     "uploaddisabled": "उर्ध्वभरण अक्षम पारिएकोछ",
     "copyuploaddisabled": " URL प्रयोग गरी उर्ध्वभरण निश्कृय पारिएको छ।",
-    "uploadfromurl-queued": "तपाईको उर्ध्वभरणलाई प्रतिक्षा सुचिमा राखिएको छ।",
     "uploaddisabledtext": "फाइल उर्ध्वभरण अक्षम पारिएकोछ",
     "php-uploaddisabledtext": "PHP मा फाइल उर्ध्वभरण अक्षम गरिएकोछ।\nकृपया फाइल उर्ध्वभरण व्यवस्था(setting) जाँच्नुहोस्।",
     "uploadvirus": "फाइलमा भाइरस छ!\nविवरण:$1",
     "upload-file-error": "आन्तरिक त्रुटि",
     "upload-misc-error": "अज्ञात अपलोड त्रुटि",
     "upload-too-many-redirects": "यस URL मा धेरै पुननिर्देशनहरु छन् ।",
-    "upload-unknown-size": "अज्ञात  आकार",
     "upload-http-error": "HTTP त्रुटि भयो: $1",
     "backend-fail-delete": " $1 फाइल मेट्न सकिएन ।",
     "backend-fail-alreadyexists": " $1 पहिके देखि नै रहेको छ ।",
     "listfiles_search_for": "मिडिया नामको लागि खोज्नुहोस:",
     "imgfile": "फाइल",
     "listfiles": "फाइल सूची",
+    "listfiles_thumb": "थम्बनेल",
     "listfiles_date": "मिति",
     "listfiles_name": "नाम",
     "listfiles_user": "प्रयोगकर्ता",
     "filehist-dimensions": "आकारहरू",
     "filehist-filesize": "फाइल आकार",
     "filehist-comment": "टिप्पणी",
-    "filehist-missing": "फाइल हराइरहेको छ",
     "imagelinks": "फाइलको प्रयोगहरु",
     "linkstoimage": "यस फाइलमा निम्न{{PLURAL:$1|पृष्ठ जोडिन्छ|$1 पृष्ठहरु जोडिन्छन}}:",
     "nolinkstoimage": "यो फाईलसंग लिंकभएको कुनै पृष्ठ छैन.",
     "filedelete-reason-dropdown": "*मेट्नुका सामान्य कारणहरु\n** कपी राइट उल्लघन\n** सारिएको फाइल",
     "filedelete-edit-reasonlist": "मेट्नका कारण संपादन गर्नुहोस्।",
     "filedelete-maintenance": "रखरखाव चलिरहेको हुँदा अस्थायी रुपमा फाइलहरु मेटाउने र मेटाइएकोलाई पुनर्बहाली गर्न निष्क्रिय गरिएकोछ।",
+    "filedelete-maintenance-title": "फाइल मेट्न सकिएन",
     "mimesearch": "MIME खोज",
     "mimesearch-summary": "MIME-प्रकार अनुसार फ़ाइलहरु खोज्न यस पृष्ठको प्रयोग गर्न सकिन्छ।\nइनपुट: फ़ाइलको प्रकार/उपप्रकार, उदा. <code>image/jpeg</code>।",
     "mimetype": "MIME प्रकार:",
     "protectedpages": "संरक्षित पृष्ठहरू",
     "protectedpages-indef": "नखुलेको सुरक्षा मात्र",
     "protectedpages-cascade": "लामबद्ध सुरक्षाहरु मात्रा",
+    "protectedpages-noredirect": "अनुप्रेषण लुकाउने",
     "protectedpagesempty": "दिइएको प्यारामिटर प्रयोग गरि सुरक्षा गरिएका पृष्ठहरु छैनन् ।",
+    "protectedpages-timestamp": "समय चिन्ह",
     "protectedpages-page": "पृष्ठ",
     "protectedpages-expiry": "सकिनेछ",
     "protectedpages-performer": "प्रयोगकर्ता सुरक्षित गरिँदै",
     "activeusers-noresult": "प्रयोगकर्ताहरु भेटिएनन्।",
     "listgrouprights": "प्रयोगकर्ता समूह अधिकार",
     "listgrouprights-summary": "निम्न सूची यस विकिमा परिभाषित समूहहरु र तिनीहरुले प्रयोगगर्न सक्ने संबद्ध  अधिकारहरुको हो।\nयसमा निजी अधिकारहरुको बारेमा [[{{MediaWiki:Listgrouprights-helppage}}|अतिरिक्त सूचना]] हुनसक्छ।",
-    "listgrouprights-key": "* <span class=\"listgrouprights-granted\">à¤\85धिà¤\95ार à¤¦à¤¿à¤\87यà¥\8b</span>\n* <span class=\"listgrouprights-revoked\">à¤\85धिà¤\95ार à¤«à¤°à¥\8dà¤\95ाà¤\87यà¥\8b</span>",
+    "listgrouprights-key": "* <span class=\"listgrouprights-granted\">पà¥\8dरदान à¤\97रिà¤\8fà¤\95ा à¤\85धिà¤\95ारहरà¥\82</span>\n* <span class=\"listgrouprights-revoked\">फिरà¥\8dता à¤\97रिà¤\8fà¤\95ा à¤\85धिà¤\95ारहरà¥\82</span>",
     "listgrouprights-group": "समूह",
     "listgrouprights-rights": "अधिकारहरु",
     "listgrouprights-helppage": "Help:सामूहिक अधिकारहरु",
     "emailuser": "यो प्रयोगकर्तालाई ई-मेल पठाउनुहोस्",
     "emailuser-title-notarget": "प्रयोगकर्तालाई इमेल गर्नुहोस्",
     "emailpage": "प्रयोगकर्तालाई इमेल गर्नुहोस्",
-    "usermailererror": "मेल अब्जेक्टले देखाएको त्रुटि:",
     "defemailsubject": "{{SITENAME}} प्रयपोगकर्ता \"$1\" बाट इमेल",
     "usermaildisabled": "प्रयोगकर्ता इमेल निरस्त गरिएको",
     "usermaildisabledtext": "यस विकिमा तपाईं अरु प्रयोगकर्तालाई ई-मेल पठाउन सक्नुहुन्न",
     "noemailtitle": "ईमेल ठेगाना नभएको",
     "noemailtext": "प्रयोगकर्ताले सही ई-मेल ठेगाना दर्शाएको छैन।",
-    "nowikiemailtitle": "ई-मेलको अनुमति छैन",
     "nowikiemailtext": "यी प्रयोगकर्ताले अरु प्रयोगकर्ताहरुबाट ई-मेल स्वीकार नगर्ने छनोट गरेकाछन्।",
     "emailnotarget": "प्राप्तकर्ताको रुपमा नभएको अथवा अमान्य प्रयोगकर्ता।",
     "emailtarget": "प्राप्तकर्ताको प्रयोगकर्ता नाम हाल्नुहोस्",
     "nowatchlist": "तपाईको अवलोकन सूचीमा कुनै पनि सामाग्री छैन।",
     "watchlistanontext": "कृपया तपाईको निगरानी सुची हेर्न या सम्पादनगर्न $1 गर्नुहोस् ।",
     "watchnologin": "प्रवेश (लग ईन) नगरिएको",
-    "watchnologintext": "आफ्नो अवलोकनलाइ परिवर्तन गर्नको लागि त तपाइ यसमा [[Special:UserLogin|प्रवेश(लगइन)]] गर्नुपर्छ।",
     "addwatch": "निगरानी सुचीमा थप्ने",
     "addedwatchtext": "\"[[:$1]]\" पृष्ठ [[Special:Watchlist|अवलोकनसूची]]मा थपियो\nयो पृष्ठ र यससित सम्बद्ध वार्तालाप पृष्ठमा भविष्यमा हुने परिवर्तन सूचिबद्ध गरिनेछ र यो पृष्ठ [[Special:RecentChanges|नयाँ परिवर्तनहरू]]मा छान्न सजिलोकोलागि गाढा अक्षरमा देखा पर्नेछ।",
     "removewatch": "निगरानी सुचीबाट हटाउने",
     "notvisiblerev": "पूर्वावलोकन हटाइयो",
     "watchlist-details": "तपाईको निगरानी सूचीमा रहेका{{PLURAL:$1|$1 पृष्ठ|$1 पृष्ठहरु}}वार्तालापमा पृष्ठमा गनिएका छैनन् ।",
     "wlheader-enotif": "ईमेल जानकारी सक्रिय गरियो ।",
-    "wlheader-showupdated": "तपाà¤\87लà¥\87 à¤ªà¤\9bिलà¥\8dलà¥\8b à¤ªà¤²à¥\8dà¤\9f à¤­à¥\8dरमण à¤\97रà¥\87पà¤\9bि à¤ªà¤°à¤¿à¤µà¤°à¥\8dतन à¤­à¤\8fà¤\95ा à¤ªà¥\83षà¥\8dठहरà¥\82लाà¤\88 '''à¤\97ाढा''' गरेर देखाइएको छ ।",
+    "wlheader-showupdated": "तपाà¤\88à¤\81लà¥\87 à¤ªà¤\9bिलà¥\8dलà¥\8b à¤ªà¤²à¥\8dà¤\9f à¤­à¥\8dरमण à¤\97रà¥\87पà¤\9bि à¤ªà¤°à¤¿à¤µà¤°à¥\8dतन à¤­à¤\8fà¤\95ा à¤ªà¥\83षà¥\8dठहरà¥\82लाà¤\88 <strong>à¤\97ाढा<strong> गरेर देखाइएको छ ।",
     "watchmethod-recent": "निगरानी सुचीमा रहेका पृष्ठमा गरिएका सम्पादनहरु जाँच्दै",
     "watchmethod-list": "सम्पदान गरिएका निगरानी सुचीमा रहेका पृष्ठहरुको सम्पादन जाँच्दै",
     "watchlistcontains": "तपाईको निगरानी सुचीमा $1 {{PLURAL:$1|पृष्ठ|पृष्ठहरु}}रहेका छन् ।",
     "watching": "निगरानी गर्दै...",
     "unwatching": "निगरानीबाट हटाउँदै...",
     "watcherrortext": "\"$1\"को लागि तपाइँको निगरानी सुची परिवर्तन गर्ने क्रममा यौटा त्रुटी भएको छ।",
-    "enotif_mailer": "{{SITENAME}} जानकारी प्रेषक",
     "enotif_reset": "सबै पृष्ठहरु भनी दाग दिने",
     "enotif_impersonal_salutation": "{{SITENAME}} प्रयोगकर्ता",
     "enotif_lastvisited": "अघिल्लो हेराइपछिका सबै परिवर्तनहरुको निम्ति हेर्नुहोस्: $1",
     "excontent": "लेख थियो: '$1'",
     "excontentauthor": "लेखेको थियो:\"$1\" (र  योगदान कर्ता थिए \"[[Special:Contributions/$2|$2]]\")",
     "exbeforeblank": "खालि गर्नु भन्दा अघिको सामग्री थियो: \"$1\"",
-    "exblank": "पृष्ठ खाली छ",
     "delete-confirm": "मेट्नुहोस् \"$1\"",
     "delete-legend": "मेट्नुहोस्",
     "historywarning": " चेतावनी: तपाईंले मेटाउन लाग्नुभएको पृष्ठको इतिहासको लगभग $1 {{PLURAL:$1|पुनरावृत्ति छ|पुनरावृत्तिहरु छन्}}:",
     "deletecomment": "कारण :",
     "deleteotherreason": "अरू/थप कारणहरू :",
     "deletereasonotherlist": "अरु कारण",
-    "deletereason-dropdown": "*मà¥\87à¤\9fà¥\8dनà¤\95ा à¤¸à¤¾à¤®à¤¾à¤¨à¥\8dय à¤\95ारणहरà¥\81\n** à¤²à¥\87à¤\96à¤\95à¤\95à¥\8b à¤\85नà¥\81रà¥\8bध\n** à¤\95पà¥\80राà¤\87à¤\9f à¤\89लà¥\8dलà¤\82à¤\98न\n** à¤¬à¤°à¥\8dबरता (Vandalism)",
+    "deletereason-dropdown": "*मà¥\87à¤\9fà¥\8dनà¤\95ा à¤¸à¤¾à¤®à¤¾à¤¨à¥\8dय à¤\95ारणहरà¥\81\n** à¤¸à¥\8dपà¥\8dयाम\n** à¤¹à¥\81लà¥\8dयाहापन(Vandalism) \n** à¤ªà¥\8dरतिलिपà¥\80 à¤\85धिà¤\95ार à¤\89लà¥\8dलà¤\82à¤\98न\n** à¤²à¥\87à¤\96à¤\95à¤\95à¥\8b à¤\85नà¥\81रà¥\8bध\n** à¤\9fà¥\81à¤\9fà¥\87à¤\95à¥\8b à¤\85नà¥\81पà¥\8dरà¥\87षण",
     "delete-edit-reasonlist": "मेट्नुको कारण सम्पादन गर्नुहोस्",
     "delete-toobig": "यो पृष्ठको सम्पादन इतिहास धेरै र  $1 {{PLURAL:$1|पुनरावलोक|पुनरावलोकहरु}}भन्दा बढी रहेको छ।\n {{SITENAME}}मा दुर्घटनाको कारणले गडबडी आउनसक्ने कुरालाई रोक्न यस्ता पृष्ठहरुलाई मेट्नबाट निषेध गरिएको छ ।",
     "delete-warning-toobig": "This page has a large edit history, over $1 {{PLURAL:$1|revision|revisions}}.\nDeleting it may disrupt database operations of {{SITENAME}};\nproceed with caution.",
     "allmessagesname": "नाम",
     "allmessagesdefault": "डिफल्ट सन्देश पाठ",
     "allmessagescurrent": "वर्तमान सन्देश पाठ",
-    "allmessagestext": "यो मीडियाविकि नेमस्पेसमा पाइने सिस्टम सन्देशहरूको सूची हो।\nयदि तपाईं व्यापक मीडिया विकि स्थानीयकरणमा योगदान गर्न चाहनुहुन्छ भनें कृपया [https://www.mediawiki.org/wiki/Localisation MediaWiki Localisation]मा र [//translatewiki.net translatewiki.net]मा जानुहोस्।",
+    "allmessagestext": "यो मीडियाविकि नेमस्पेसमा पाइने सिस्टम सन्देशहरूको सूची हो।\nयदि तपाईं व्यापक मीडिया विकि स्थानीयकरणमा योगदान गर्न चाहनुहुन्छ भनें कृपया [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation MediaWiki Localisation]मा र [//translatewiki.net translatewiki.net]मा जानुहोस्।",
     "allmessages-filter-legend": "फिल्टर",
     "allmessages-filter-unmodified": "असंशोधित",
     "allmessages-filter-all": "सबै",
     "importunknownsource": "अज्ञात आयात स्रोत प्रकार ।",
     "importcantopen": "आयात गर्ने स्रोत फाइल खोल्न सकिएन ।",
     "importbadinterwiki": "खराव अन्तर विकि लिंक",
-    "importnotext": "पाठ नभएको या  खाली",
     "importsuccess": "आयात सम्पन्न भयो!",
-    "importhistoryconflict": "पुनरावलोकन इतिहासमा द्वन्द रहेको छ (तपाईँले यो पृष्ठ पहिलेनै आयात गरिसक्नु भएको हुनुपर्दछ )",
     "importnofile": "कुनै पनि आयात फाइल अपलोड गरिएन ।",
     "importuploaderrorsize": "आयात फाइलको अपलोड असफल भयो।\nफाइल अनुमति दिइए भन्दा ठूलो छ।",
     "importuploaderrorpartial": "आयात फाइलको अपलोड असफल भयो।\nफाइल आंशिकरुपमा अपलोड भयो।",
index 1169fb1..73314c6 100644 (file)
     "disclaimers": "डिस्क्लेमर्स",
     "disclaimerpage": "Project:साधारण डिस्क्लेमर्स",
     "edithelp": "सम्पादन ग्वहालि",
-    "helppage": "Help:धलःपौ",
     "mainpage": "मू पौ",
     "mainpage-description": "मू पौ",
     "policy-url": "Project:नीति",
index c5feb40..7cbd573 100644 (file)
@@ -64,7 +64,6 @@
     "aboutpage": "Project: Hagaao",
     "currentevents": "Tau Fakaholoaga Mogonei",
     "edithelp": "Lagomatai ke he Fakahakohako",
-    "helppage": "Help: Ke lata mo e tau mena i loto",
     "mainpage": "Matapatu Lau",
     "mainpage-description": "Matapatu Lau",
     "portal": "Maaga ke Matutaki",
index 8d30256..c6cf9b0 100644 (file)
     "permalink": "Permanente koppeling",
     "print": "Afdrukken",
     "view": "Lezen",
+    "view-foreign": "Bekijken op $1",
     "edit": "Bewerken",
+    "edit-local": "Lokale beschrijving bewerken",
     "create": "Aanmaken",
+    "create-local": "Lokale beschrijving toevoegen",
     "editthispage": "Deze pagina bewerken",
     "create-this-page": "Deze pagina aanmaken",
     "delete": "Verwijderen",
     "pool-timeout": "De maximaal te wachten tijd voor het wachten op een lock is verstreken",
     "pool-queuefull": "De wachtrij van de poel is vol",
     "pool-errorunknown": "Er is een onbekende fout opgetreden",
+    "pool-servererror": "De dienst \"pool counter\" is niet beschikbaar ($1).",
     "aboutsite": "Over {{SITENAME}}",
     "aboutpage": "Project:Info",
     "copyright": "De inhoud is beschikbaar onder de $1 tenzij anders aangegeven.",
     "userlogin-resetpassword-link": "Wachtwoord vergeten?",
     "userlogin-helplink2": "Hulp bij aanmelden",
     "userlogin-loggedin": "U bent al aangemeld als {{GENDER:$1|$1}}.\nGebruik het onderstaande formulier om aan te melden als een andere gebruiker.",
-    "userlogin-createanother": "Nog een gebruiker aanmaken",
+    "userlogin-createanother": "Gebruiker aanmaken",
     "createacct-join": "Geef uw gegevens hieronder op.",
     "createacct-another-join": "Geef hieronder de informatie voor de nieuwe gebruiker op.",
     "createacct-emailrequired": "E-mailadres",
     "createacct-captcha": "Veiligheidscontrole",
     "createacct-imgcaptcha-ph": "Geef de tekst in die u hierboven ziet",
     "createacct-submit": "Gebruiker aanmaken",
-    "createacct-another-submit": "Nog een gebruiker aanmaken",
+    "createacct-another-submit": "Gebruiker aanmaken",
     "createacct-benefit-heading": "{{SITENAME}} wordt gemaakt door mensen zoals u.",
     "createacct-benefit-body1": "bewerking{{PLURAL:$1||en}}",
     "createacct-benefit-body2": "pagina{{PLURAL:$1||'s}}",
     "accountcreatedtext": "De gebruiker [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|overleg]]) is aangemaakt.",
     "createaccount-title": "Gebruikers registreren voor {{SITENAME}}",
     "createaccount-text": "Iemand heeft een gebruiker op {{SITENAME}} ($4) aangemaakt met de naam \"$2\" en uw e-mailadres.\nHet wachtwoord voor \"$2\" is \"$3\".\nMeld u aan en wijzig uw wachtwoord.\n\nNegeer dit bericht als deze gebruiker zonder uw medeweten is aangemaakt.",
-    "usernamehasherror": "Een gebruikersnaam mag het teken hekje (\"#\") niet bevatten.",
     "login-throttled": "U heeft recentelijk te veel mislukte aanmeldpogingen gedaan.\nWacht alstublieft $1 voordat u het opnieuw probeert.",
     "login-abort-generic": "U bent niet aangemeld. De procedure is afgebroken.",
     "loginlanguagelabel": "Taal: $1",
     "prefs-skin": "Vormgeving",
     "skin-preview": "Voorvertoning",
     "datedefault": "Geen voorkeur",
-    "prefs-beta": "Bètafunctionaliteit",
-    "prefs-datetime": "Datum en tijd",
     "prefs-labs": "Alphafunctionaliteit",
     "prefs-user-pages": "Gebruikerspagina's",
     "prefs-personal": "Gebruikersprofiel",
     "defaultns": "Anders in de volgende naamruimten zoeken:",
     "default": "standaard",
     "prefs-files": "Bestanden",
-    "prefs-custom-css": "persoonlijke CSS",
-    "prefs-custom-js": "persoonlijke JS",
-    "prefs-common-css-js": "Gedeelde CSS/JS voor elke vormgeving:",
+    "prefs-custom-css": "aangepaste CSS",
+    "prefs-custom-js": "aangepaste JavaScript",
+    "prefs-common-css-js": "Gedeelde CSS/JavaScript voor elke vormgeving:",
     "prefs-reset-intro": "Gebruik deze functie om uw voorkeuren te herstellen naar de standaardinstellingen.\nDeze handeling kan niet ongedaan gemaakt worden.",
     "prefs-emailconfirm-label": "E-mailbevestiging:",
     "youremail": "Uw e-mailadres:",
     "right-editprotected": "Pagina's bewerken die beveiligd zijn als \"{{int:protect-level-sysop}}\"",
     "right-editsemiprotected": "Pagina's bewerken die beveiligd zijn als \"{{int:protect-level-autoconfirmed}}\"",
     "right-editinterface": "De gebruikersinterface bewerken",
-    "right-editusercssjs": "De CSS- en JS-bestanden van andere gebruikers bewerken",
+    "right-editusercssjs": "De CSS- en JavaScriptbestanden van andere gebruikers bewerken",
     "right-editusercss": "De CSS-bestanden van andere gebruikers bewerken",
     "right-edituserjs": "De JavaScriptbestanden van andere gebruikers bewerken",
     "right-editmyusercss": "Uw eigen CSS-pagina's bewerken",
     "upload-permitted": "Toegelaten bestandstypes: $1.",
     "upload-preferred": "Aangewezen bestandstypes: $1.",
     "upload-prohibited": "Verboden bestandstypes: $1.",
-    "uploadlog": "uploadlogboek",
     "uploadlogpage": "Uploadlogboek",
     "uploadlogpagetext": "Hieronder staan de nieuwste bestanden.\nZie de [[Special:NewFiles|galerij met nieuwe bestanden]] voor een visueler overzicht.",
     "filename": "Bestandsnaam",
     "filereuploadsummary": "Bestandswijzigingen:",
     "filestatus": "Auteursrechtenstatus:",
     "filesource": "Bron:",
-    "uploadedfiles": "Geüploade bestanden",
     "ignorewarning": "Deze waarschuwing negeren en het bestand toch opslaan",
     "ignorewarnings": "Alle waarschuwingen negeren",
     "minlength1": "Bestandsnamen moeten minstens één letter bevatten.",
     "overwroteimage": "heeft een nieuwe versie van \"[[$1]]\" toegevoegd",
     "uploaddisabled": "Uploaden is uitgeschakeld",
     "copyuploaddisabled": "Het uploaden van bestanden via een URL is uitgeschakeld.",
-    "uploadfromurl-queued": "Uw upload is in de wachtrij geplaatst.",
     "uploaddisabledtext": "Het uploaden van bestanden is uitgeschakeld.",
     "php-uploaddisabledtext": "Het uploaden van bestanden is uitgeschakeld in PHP.\nControleer de instelling \"file_uploads\".",
     "uploadscripted": "Dit bestand bevat HTML- of scriptcode die foutief door uw browser kan worden weergegeven.",
     "upload-misc-error": "Onbekende uploadfout",
     "upload-misc-error-text": "Er is tijdens het uploaden een onbekende fout opgetreden.\nControleer of de URL correct en beschikbaar is en probeer het opnieuw.\nAls het probleem aanhoudt, neem dan contact op met een [[Special:ListUsers/sysop|moderator]].",
     "upload-too-many-redirects": "De URL bevatte te veel doorverwijzingen",
-    "upload-unknown-size": "Onbekende grootte",
     "upload-http-error": "Er is een HTTP-fout opgetreden: $1",
     "upload-copy-upload-invalid-domain": "Uploaden per kopie is niet beschikbaar vanuit dit domein.",
     "backend-fail-stream": "Het was niet mogelijk het bestand $1 te streamen.",
     "img-auth-streaming": "Bezig met het streamen van \"$1\".",
     "img-auth-public": "Het doel van img_auth.php is de uitvoer van bestanden van een besloten wiki.\nDeze wiki is ingesteld als publieke wiki.\nOm beveiligingsreden is img_auth.php uitgeschakeld.",
     "img-auth-noread": "De gebruiker heeft geen leestoegang tot \"$1\".",
-    "img-auth-bad-query-string": "De URL bevat een ongeldige querystring.",
     "http-invalid-url": "Ongeldige URL: $1",
     "http-invalid-scheme": "URL's met de opmaak \"$1\" worden niet ondersteund",
     "http-request-error": "Fout bij het verzenden van het verzoek.",
     "filehist-dimensions": "Afmetingen",
     "filehist-filesize": "Bestandsgrootte",
     "filehist-comment": "Opmerking",
-    "filehist-missing": "Het bestand is niet aangetroffen",
     "imagelinks": "Bestandsgebruik",
     "linkstoimage": "Dit bestand wordt op de volgende {{PLURAL:$1|pagina|$1 pagina's}} gebruikt:",
     "linkstoimage-more": "Er {{PLURAL:$2|is|zijn}} meer dan $1 {{PLURAL:$1|koppeling|koppelingen}} naar dit bestand.\nDe volgende lijst geeft alleen de eerste {{PLURAL:$1|koppeling|$1 koppelingen}} naar dit bestand weer.\nEr is ook een [[Special:WhatLinksHere/$2|volledige lijst]].",
     "listgrouprights-removegroup-self": "De volgende {{PLURAL:$2|groep|groepen}} verwijderen van eigen gebruiker: $1",
     "listgrouprights-addgroup-self-all": "Alle groepen toevoegen aan eigen gebruiker",
     "listgrouprights-removegroup-self-all": "Alle groepen verwijderen van eigen gebruiker",
+    "listgrouprights-namespaceprotection-header": "Naamruimtebeperkingen",
+    "listgrouprights-namespaceprotection-namespace": "Naamruimte",
+    "listgrouprights-namespaceprotection-restrictedto": "Recht(en) waardoor gebruiker kan bewerken",
+    "trackingcategories": "Volgcategorieën",
+    "trackingcategories-summary": "Op deze pagina worden volgcategorieën weergegeven die automatisch worden gevuld door de MediaWikisoftware. De namen van de categorieën kunnen gewijzigd worden door de bijbehorende systeemberichten in de naamruimte \"{{ns:8}}\" bij te werken.",
+    "trackingcategories-msg": "Volgcategorie",
+    "trackingcategories-name": "Berichtnaam",
+    "trackingcategories-desc": "Opnamecriteria",
+    "noindex-category-desc": "De pagina bevat het magische woord <code><nowiki>__NOINDEX__</nowiki></code> (en bevindt zich in een naamruimte waarin dat magische woord is toegestaan), en wordt niet geïndexeerd door robots.",
+    "index-category-desc": "De pagina bevat het magische woord <code><nowiki>__INDEX__</nowiki></code> (en bevindt zich in een naamruimte waarin dat magische woord is toegestaan), en wordt geïndexeerd door robots, terwijl dat normaliter niet zou gebeuren.",
+    "post-expand-template-inclusion-category-desc": "Na het uitbreiden van alle sjablonen, is de pagina groter dan <code>$wgMaxArticleSize</code>, dus zijn sommige sjablonen niet uitgebreid.",
+    "post-expand-template-argument-category-desc": "Na het uitbreiden van een sjabloonparameter (iets in de drievoudige accolades, zoals <code>{{{Foo}}})</code>), is de pagina groter dan <code>$wgMaxArticleSize</code>.",
+    "expensive-parserfunction-category-desc": "Op de pagina worden te veel kostbare parserfuncties (zoals <code>#ifexist</code>) gebruikt. [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit Meer informatie].",
+    "broken-file-category-desc": "Een categorie die wordt toegevoegd als een pagina een niet-bestaande koppeling bevat (een koppeling om een bestand toe te voegen als dat bestand niet bestaat).",
+    "hidden-category-category-desc": "Dit is een categoriepagina die het magische woord <code><nowiki>__HIDDENCAT__</nowiki></code> bevat, waardoor de categorie standaard niet zichtbaar is in de lijst met categorieën op pagina's.",
+    "trackingcategories-nodesc": "Geen beschrijving beschikbaar.",
+    "trackingcategories-disabled": "Categorie uitgeschakeld",
     "mailnologin": "Geen verzendadres beschikbaar",
     "mailnologintext": "U moet [[Special:UserLogin|aangemeld]] zijn en een geldig e-mailadres in uw [[Special:Preferences|voorkeuren]] vermelden om andere gebruikers te kunnen e-mailen.",
     "emailuser": "Deze gebruiker e-mailen",
     "emailuser-title-notarget": "Gebruiker e-mailen",
     "emailpage": "Gebruiker e-mailen",
     "emailpagetext": "Via dit formulier kunt u een e-mail aan {{GENDER:$1|deze gebruiker}} verzenden.\nHet e-mailadres dat u hebt opgegeven bij [[Special:Preferences|uw voorkeuren]] wordt als afzender gebruikt.\nDe ontvanger kan dus direct naar u reageren.",
-    "usermailererror": "Foutmelding bij het verzenden:",
     "defemailsubject": "E-mail van {{SITENAME}}-gebruiker \"$1\"",
     "usermaildisabled": "Gebruikerse-mail uitgeschakeld",
     "usermaildisabledtext": "U kunt geen e-mail verzenden naar andere gebruikers op deze wiki",
     "noemailtitle": "Van deze gebruiker is geen e-mailadres bekend",
     "noemailtext": "Deze gebruiker heeft geen geldig e-mailadres opgegeven.",
-    "nowikiemailtitle": "E-mail is niet toegestaan",
     "nowikiemailtext": "Deze gebruiker wil geen e-mail ontvangen van andere gebruikers.",
     "emailnotarget": "Niet-bestaande of ongeldige ontvanger.",
     "emailtarget": "Voer de geadresseerde in",
     "nowatchlist": "Uw volglijst is leeg.",
     "watchlistanontext": "Om uw volglijst te bekijken of te bewerken moet u zich $1.",
     "watchnologin": "U bent niet aangemeld",
-    "watchnologintext": "U dient [[Special:UserLogin|aangemeld]] te zijn om uw volglijst te bewerken.",
     "addwatch": "Toevoegen aan volglijst",
     "addedwatchtext": "De pagina \"[[:$1]]\" is toegevoegd aan uw [[Special:Watchlist|volglijst]].\nToekomstige bewerkingen van deze pagina en de bijbehorende overlegpagina worden daar weergegeven.",
     "removewatch": "Verwijderen uit volglijst",
     "unwatchthispage": "Niet meer volgen",
     "notanarticle": "Is geen pagina",
     "notvisiblerev": "De laatste versie van een andere gebruiker is verwijderd",
-    "watchlist-details": "Er {{PLURAL:$1|staat één pagina|staan $1 pagina's}} op uw volglijst, exclusief overlegpagina's.",
+    "watchlist-details": "Er {{PLURAL:$1|staat één pagina|staan $1 pagina's}} op uw volglijst. Overlegpagina's worden niet meegeteld.",
     "wlheader-enotif": "U wordt per e-mail gewaarschuwd.",
     "wlheader-showupdated": "Pagina's die zijn bewerkt sinds uw laatste bezoek worden '''vet''' weergegeven.",
     "watchmethod-recent": "controleer recente wijzigingen op pagina's op volglijst",
     "watching": "Bezig met plaatsen op volglijst…",
     "unwatching": "Bezig met verwijderen van volglijst…",
     "watcherrortext": "Er is een fout opgetreden tijdens het wijzigen van uw volglijstinstellingen voor \"$1\".",
-    "enotif_mailer": "{{SITENAME}}-berichtensysteem",
     "enotif_reset": "Alle pagina's markeren als bezocht",
     "enotif_impersonal_salutation": "gebruiker van {{SITENAME}}",
     "enotif_subject_deleted": "{{SITENAME}}: pagina $1 is verwijderd door {{GENDER:$2|$2}}",
     "excontent": "De inhoud was: \"$1\"",
     "excontentauthor": "De inhoud was: \"$1\" ([[Special:Contributions/$2|$2]] was de enige auteur)",
     "exbeforeblank": "De inhoud was: \"$1\"",
-    "exblank": "pagina was leeg",
     "delete-confirm": "\"$1\" verwijderen",
     "delete-legend": "Verwijderen",
     "historywarning": "'''Waarschuwing:''' de pagina die u wilt verwijderen heeft ongeveer $1 {{PLURAL:$1|versie|versies}}:",
     "contributions-title": "Bijdragen van $1",
     "mycontris": "Bijdragen",
     "contribsub2": "Voor {{GENDER:$3|$1}} ($2)",
+    "contributions-userdoesnotexist": "De gebruiker \"$1\" is niet geregistreerd.",
     "nocontribs": "Geen wijzigingen gevonden die aan de gestelde criteria voldoen.",
     "uctop": "(laatste wijziging)",
     "month": "Van maand (en eerder):",
     "sp-contributions-newbies-sub": "Voor nieuwelingen",
     "sp-contributions-newbies-title": "Bijdragen van nieuwe gebruikers",
     "sp-contributions-blocklog": "blokkeerlogboek",
+    "sp-contributions-suppresslog": "onderdrukte gebruikersbijdragen",
     "sp-contributions-deleted": "verwijderde bijdragen",
     "sp-contributions-uploads": "uploads",
     "sp-contributions-logs": "logboeken",
     "sp-contributions-blocked-notice": "Deze gebruiker is op het moment geblokkeerd.\nDe laatste regel uit het blokkeerlogboek wordt hieronder ter referentie weergegeven:",
     "sp-contributions-blocked-notice-anon": "Dit IP-adres is geblokkeerd.\nDe laatste regel uit het blokkeerlogboek wordt hieronder ter referentie weergegeven:",
     "sp-contributions-search": "Zoeken naar bijdragen",
-    "sp-contributions-suppresslog": "onderdrukte gebruikersbijdragen",
     "sp-contributions-username": "IP-adres of gebruikersnaam:",
     "sp-contributions-toponly": "Alleen nieuwste versies weergeven",
     "sp-contributions-newonly": "Alleen nieuwe pagina's weergeven",
     "allmessagesname": "Naam",
     "allmessagesdefault": "Standaardinhoud",
     "allmessagescurrent": "Huidige inhoud",
-    "allmessagestext": "Hieronder staan de systeemberichten uit de MediaWiki-naamruimte.\nGa naar [https://www.mediawiki.org/wiki/Localisation MediaWiki-lokalisatie] en [//translatewiki.net translatewiki.net] als u wilt bijdragen aan de algemene vertaling voor MediaWiki.",
+    "allmessagestext": "Hieronder staan de systeemberichten uit de MediaWiki-naamruimte.\nGa naar [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation MediaWiki-lokalisatie] en [//translatewiki.net translatewiki.net] als u wilt bijdragen aan de algemene vertaling voor MediaWiki.",
     "allmessagesnotsupportedDB": "Deze pagina kan niet worden gebruikt, omdat '''$wgUseDatabaseMessages''' is uitgeschakeld.",
     "allmessages-filter-legend": "Filter",
     "allmessages-filter": "Filteren op aangepast:",
     "importunknownsource": "Onbekend importbrontype",
     "importcantopen": "Kon het importbestand niet openen",
     "importbadinterwiki": "Verkeerde interwikikoppeling",
-    "importnotext": "Leeg of geen tekst",
     "importsuccess": "Import afgerond!",
-    "importhistoryconflict": "Er zijn conflicten in de geschiedenis van de pagina (is misschien eerder geïmporteerd)",
     "importnosources": "Er zijn geen transwiki-importbronnen gedefinieerd en directe geschiedenis-uploads zijn uitgeschakeld.",
     "importnofile": "Er is geen importbestand geüpload.",
     "importuploaderrorsize": "Upload van het importbestand in mislukt.\nHet bestand is groter dan de ingestelde limiet.",
     "version-entrypoints": "URL's voor ingangen",
     "version-entrypoints-header-entrypoint": "Ingang",
     "version-entrypoints-header-url": "URL",
-    "version-entrypoints-articlepath": "[https://www.mediawiki.org/wiki/Manual:$wgArticlePath Article path]",
-    "version-entrypoints-scriptpath": "[https://www.mediawiki.org/wiki/Manual:$wgScriptPath Script path]",
+    "version-entrypoints-articlepath": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgArticlePath Paginapad]",
+    "version-entrypoints-scriptpath": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgScriptPath Scriptpad]",
     "redirect": "Doorverwijzen op bestandsnaam, gebruikersnummer, paginanummer, of versienummer",
     "redirect-legend": "Doorverwijzen naar een bestand of pagina",
     "redirect-summary": "Deze speciale pagina verwijst door naar een bestand (als een bestandsnaam wordt opgegeven), een pagina (als een paginanummer of versienummer wordt opgegeven) of een gebruikerspagina (als een gebruikersnummer wordt opgegeven). Gebruik: [[{{#Special:Redirect}}/file/Voorbeeld.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]] of [[{{#Special:Redirect}}/user/101]].",
index ea474c0..e9bdc0a 100644 (file)
@@ -1,13 +1,33 @@
 {
     "@metadata": {
-        "authors": []
+        "authors": [
+            "Cocu",
+            "Dittaeva",
+            "Diupwijk",
+            "Eirik",
+            "Finnrind",
+            "Frokor",
+            "Geitost",
+            "Gunnernett",
+            "Jeblad",
+            "Jon Harald Søby",
+            "Jorunn",
+            "Kaganer",
+            "Marinsb",
+            "Najami",
+            "Nghtwlkr",
+            "Njardarlogar",
+            "Pcoombe",
+            "Ranveig",
+            "לערי ריינהארט"
+        ]
     },
     "tog-underline": "Strek under lenkjer:",
     "tog-hideminor": "Gøym småplukk i lista over siste endringar",
     "tog-hidepatrolled": "Gøym patruljerte endringar i lista over siste endringar",
     "tog-newpageshidepatrolled": "Gøym patruljerte sider frå lista over nye sider",
     "tog-extendwatchlist": "Utvid overvakingslista til å vise alle endringane, ikkje berre dei siste",
-    "tog-usenewrc": "Grupper endringar etter side i siste endringane og på overvakingslista mi (krev JavaScript)",
+    "tog-usenewrc": "Grupper endringar etter side i siste endringane og på overvakingslista",
     "tog-numberheadings": "Vis nummererte overskrifter",
     "tog-showtoolbar": "Vis endringsverktøyline",
     "tog-editondblclick": "Endre sider med dobbeltklikk",
     "youhavenewmessages": "Du har $1 ($2).",
     "youhavenewmessagesfromusers": "Du har $1 frå {{PLURAL:$3|ein annan brukar| $3 brukarar}} ($2).",
     "youhavenewmessagesmanyusers": "Du har $1 frå mange brukarar ($2).",
-    "newmessageslinkplural": "{{PLURAL:$1|ei ny melding|nye meldingar}}",
-    "newmessagesdifflinkplural": "siste {{PLURAL:$1|endringa|endringane}}",
+    "newmessageslinkplural": "{{PLURAL:$1|ei ny melding|999=nye meldingar}}",
+    "newmessagesdifflinkplural": "siste {{PLURAL:$1|endringa|999=endringane}}",
     "youhavenewmessagesmulti": "Du har nye meldingar på $1",
     "editsection": "endre",
     "editold": "endre",
     "nospecialpagetext": "Du har bede om ei spesialside som ikkje finst. Lista over spesialsider finn du [[Special:SpecialPages|her]].",
     "error": "Feil",
     "databaseerror": "Databasefeil",
+    "databaseerror-text": "Ein spørjefeil mot databasa har oppstått.\nDette kan indikere ein feil i programvara.",
     "databaseerror-error": "Feil: $1",
     "laggedslavemode": "Åtvaring: Det er mogleg at sida ikkje er heilt oppdatert.",
     "readonly": "Databasen er skriveverna",
     "accountcreatedtext": "Brukarkontoen til [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|diskusjon]]) er oppretta.",
     "createaccount-title": "Oppretting av brukarkonto på {{SITENAME}}",
     "createaccount-text": "Nokon oppretta ein brukarkonto for $2 på {{SITENAME}} ($4). Passordet til «$2» er «$3». Du bør logge inn og endre passordet ditt med ein gong.\n\nDu kan sjå bort frå denne meldinga dersom kontoen vart oppretta med eit uhell.",
-    "usernamehasherror": "Brukarnamn kan ikkje innehalda nummerteikn.",
     "login-throttled": "Du har prøvd å logge inn for mange gonger. Ver venleg og vent før du prøver igjen.",
     "login-abort-generic": "Innlogginga er avbroten.",
     "loginlanguagelabel": "Språk: $1",
     "suspicious-userlogout": "Førespurnaden din om å logge ut vart nekta fordi han såg ut til å vere sendt av ein øydelagt nettlesar eller mellomtenar.",
     "pt-login": "Logg inn",
+    "pt-login-button": "Logg inn",
     "pt-createaccount": "Opprett konto",
+    "pt-userlogout": "Logg ut",
     "php-mail-error-unknown": "Ukjend feil i PHPs mail()-funksjon",
     "user-mail-no-addy": "↓Prøvde å senda e-post utan e-postadresse",
     "user-mail-no-body": "Freista å senda e-post med tom eller urimeleg stutt brødtekst.",
     "prefs-skin": "Drakt",
     "skin-preview": "førehandsvis",
     "datedefault": "Standard",
-    "prefs-beta": "Betafunksjonar",
-    "prefs-datetime": "Dato og klokkeslett",
     "prefs-labs": "Testfunksjonar",
     "prefs-user-pages": "Brukarsider",
     "prefs-personal": "Brukaropplysningar",
     "rcnotefrom": "Nedanfor er endringane gjorde sidan <strong>$2</strong> viste (opp til <strong>$1</strong> stykke)",
     "rclistfrom": "Vis nye endringar sidan $1",
     "rcshowhideminor": "$1 småplukk",
+    "rcshowhideminor-show": "Vis",
+    "rcshowhideminor-hide": "Gøym",
     "rcshowhidebots": "$1 robotar",
+    "rcshowhidebots-show": "Vis",
+    "rcshowhidebots-hide": "Gøym",
     "rcshowhideliu": "$1 registrerte brukarar",
+    "rcshowhideliu-show": "Vis",
+    "rcshowhideliu-hide": "Gøym",
     "rcshowhideanons": "$1 anonyme brukarar",
+    "rcshowhideanons-show": "Vis",
+    "rcshowhideanons-hide": "Gøym",
     "rcshowhidepatr": "$1 godkjende endringar",
+    "rcshowhidepatr-show": "Vis",
+    "rcshowhidepatr-hide": "Gøym",
     "rcshowhidemine": "$1 endringane mine",
+    "rcshowhidemine-show": "Vis",
+    "rcshowhidemine-hide": "Gøym",
     "rclinks": "Vis dei siste $1 endringane dei siste $2 dagane<br />$3",
     "diff": "skil",
     "hist": "hist",
     "upload-permitted": "Godtekne filtypar: $1.",
     "upload-preferred": "Føretrekte filtypar: $1.",
     "upload-prohibited": "Ikkje godtekne filtypar: $1.",
-    "uploadlog": "opplastingslogg",
     "uploadlogpage": "Opplastingslogg",
     "uploadlogpagetext": "Dette er ei liste over filer som nyleg er lasta opp.",
     "filename": "Filnamn",
     "filereuploadsummary": "Filendringar:",
     "filestatus": "Opphavsrettsstatus:",
     "filesource": "Kjelde:",
-    "uploadedfiles": "Filer som er opplasta",
     "ignorewarning": "Sjå bort frå åtvaringa og lagre fila likevel",
     "ignorewarnings": "Oversjå åtvaringar",
     "minlength1": "Filnamn må ha minst eitt teikn.",
     "overwroteimage": "lasta opp ein ny versjon av «[[$1]]»",
     "uploaddisabled": "Beklagar, funksjonen for opplasting er deaktivert på denne nettenaren.",
     "copyuploaddisabled": "Opplasting gjennom URL er slege av.",
-    "uploadfromurl-queued": "Opplastinga di er sett i kø.",
     "uploaddisabledtext": "Filopplasting er slått av.",
     "php-uploaddisabledtext": "PHP-filopplasting er deaktivert. Sjå innstillinga for file_uploads.",
     "uploadscripted": "Fila inneheld HTML- eller skriptkode som feilaktig kan bli tolka og køyrd av nettlesarar.",
     "upload-misc-error": "Ukjend feil ved opplastinga",
     "upload-misc-error-text": "Ein ukjend feil oppstod under opplastinga. Ver venleg og stadfest at nettadressa er gyldig og tilgjengeleg, og prøv ein gong til. Dersom problemet held fram, ta kontakt med ein [[Special:ListUsers/sysop|administrator]].",
     "upload-too-many-redirects": "URL-en inneheldt for mange omdirigeringar",
-    "upload-unknown-size": "Ukjend storleik",
     "upload-http-error": "Ein HTTP-feil oppstod: $1",
     "upload-copy-upload-invalid-domain": "Kopiopplastingar er ikkje tilgjengelege frå dette domenet.",
     "backend-fail-stream": "Kunne ikkje strøyma fila «$1».",
     "img-auth-streaming": "Sendar \"$1\".",
     "img-auth-public": "Funksjonen til img_auth.php er å laga filer frå ein privat wiki.\nDenne wikien er sett opp som ein ålmennt tilgjengeleg wiki.\nFor best tryggleik, er img_auth.php sett ut av funksjon.",
     "img-auth-noread": "Brukaren har ikkje rettar til å lesa «$1».",
-    "img-auth-bad-query-string": "URL-en har ein ugild spørjestreng.",
     "http-invalid-url": "Ugyldig URL: $1",
     "http-invalid-scheme": "URL-ar med  «$1»-førestavinga er ikkje støtta.",
     "http-request-error": "HTTP-førespurnaden feila grunna ein ukjend feil.",
     "filehist-dimensions": "Oppløysing",
     "filehist-filesize": "Filstorleik",
     "filehist-comment": "Kommentar",
-    "filehist-missing": "Fila manglar",
     "imagelinks": "Filbruk",
     "linkstoimage": "{{PLURAL:$1|Den følgjande sida|Dei følgjande $1 sidene}} har lenkjer til denne fila:",
     "linkstoimage-more": "Meir enn $1 {{PLURAL:$1|side|sider}} lenkjer til denne fila.\nFølgjande liste viser {{PLURAL:$1|den første sida|dei $1 første sidene}}.\nEi [[Special:WhatLinksHere/$2|fullstendig liste]] er tilgjengeleg.",
     "emailuser-title-notarget": "Send e-post åt brukar",
     "emailpage": "Send e-post åt brukar",
     "emailpagetext": "Du kan nytte skjemaet nedanfor til å sende ein e-post til denne {{GENDER:$1|brukaren}}.\nE-postadressa du har sett i [[Special:Preferences|innstillingane dine]] vil dukke opp i «frå»-feltet på denne e-posten, så mottakaren er i stand til å svare.",
-    "usermailererror": "E-post systemet gav feilmelding:",
     "defemailsubject": "{{SITENAME}} epost frå brukar \"$1\"",
     "usermaildisabled": "Brukare-post slegen av",
     "usermaildisabledtext": "Du kan ikkje senda e-postar til andre brukarar på wikien",
     "noemailtitle": "Inga e-postadresse",
     "noemailtext": "Denne brukaren har ikkje oppgjeve ei gyldig e-postadresse.",
-    "nowikiemailtitle": "Ingen e-post tillaten",
     "nowikiemailtext": "Denne brukaren har vald å ikkje motta e-postar frå andre brukarar.",
     "emailnotarget": "Ikkje-eksisterande eller ugyldig brukarnamn for mottakar.",
     "emailtarget": "Skriv inn brukarnamnet til mottakaren",
     "nowatchlist": "Du har ikkje noko i overvakingslista di.",
     "watchlistanontext": "Du lyt $1 for å vise eller endre sider på overvakingslista di.",
     "watchnologin": "Ikkje innlogga",
-    "watchnologintext": "Du lyt vera [[Special:UserLogin|innlogga]] for å kunna endre overvakingslista.",
     "addwatch": "↓Legg til i overvakingslista",
     "addedwatchtext": "Sida «[[:$1]]» er lagd til i [[Special:Watchlist|overvakingslista]] di. Framtidige endringar av henne og den tilhøyrande diskusjonssida hennar vil bli oppførde der.",
     "removewatch": "Fjerna frå overvakingslista",
     "watching": "Overvakar...",
     "unwatching": "Fjernar frå overvakinglista...",
     "watcherrortext": "Det oppstod ein feil under endringa av overvakingsinnstillingane dine for «$1».",
-    "enotif_mailer": "{{SITENAME}}-endringsmeldingssendar",
     "enotif_reset": "Merk alle sidene som vitja",
     "enotif_impersonal_salutation": "{{SITENAME}}-brukar",
     "enotif_subject_deleted": "{{SITENAME}}-sida $1 har vorte sletta av {{gender:$2|$2}}",
     "excontent": "innhaldet var: «$1»",
     "excontentauthor": "innhaldet var: «$1» (og den einaste bidragsytaren var «[[Special:Contributions/$2|$2]]»)",
     "exbeforeblank": "innhaldet før sida vart tømd var: «$1»",
-    "exblank": "sida var tom",
     "delete-confirm": "Slett «$1»",
     "delete-legend": "Slett",
     "historywarning": "'''Åtvaring:''' Sida du held på å slette har ein historikk med om lag $1 {{PLURAL:$1|versjon|versjonar}}:",
     "allmessagesname": "Namn",
     "allmessagesdefault": "Standardtekst",
     "allmessagescurrent": "Gjeldande meldingstekst",
-    "allmessagestext": "Dette er ei liste over systemmeldingar i MediaWiki-namnerommet.\nVitja [https://www.mediawiki.org/wiki/Localisation MediaWiki Localisation] og [//translatewiki.net translatewiki.net] om du ynskjer å bidra til den generelle omsetjinga av MediaWiki.",
+    "allmessagestext": "Dette er ei liste over systemmeldingar i MediaWiki-namnerommet.\nVitja [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation MediaWiki Localisation] og [//translatewiki.net translatewiki.net] om du ynskjer å bidra til den generelle omsetjinga av MediaWiki.",
     "allmessagesnotsupportedDB": "Denne sida kan ein ikkje bruka fordi «'''$wgUseDatabaseMessages'''» er slått av.",
     "allmessages-filter-legend": "Filtrer",
     "allmessages-filter": "Filtrer etter tilpassingsgrad:",
     "importunknownsource": "Ukjend importkjeldetype",
     "importcantopen": "Kunne ikkje opne importfil",
     "importbadinterwiki": "Ugyldig interwikilenkje",
-    "importnotext": "Tom eller ingen tekst",
     "importsuccess": "Importeringa er ferdig!",
-    "importhistoryconflict": "Det kan vera at det er konflikt i historikken (kanskje sida vart importert før)",
     "importnosources": "Ingen kjelder for transwikiimport er oppgjevne og funksjonen for opplasting av historikk er deaktivert.",
     "importnofile": "Inga importfil er lasta opp.",
     "importuploaderrorsize": "Opplastinga av importfila var mislukka. Fila er større enn det som er lov å laste opp.",
index 221b236..c516f05 100644 (file)
     "currentevents": "Nuni eventes",
     "currentevents-url": "Project:Nuni eventes",
     "edithelp": "Helpo pri modifiko de pagines",
-    "helppage": "Help:Kontenaje",
     "mainpage": "Chefi pagine",
     "mainpage-description": "Chefi pagine",
     "portal": "Li komun chambre",
index 2f3bbc7..69410b4 100644 (file)
@@ -90,7 +90,6 @@
     "aboutpage": "Project: baa haneʼ",
     "copyright": "Díí naaltsoos bikáaʼgi saad shijaaʼígíí \"$1\" beehazʼą́ąnii bikʼehgo choidííłįįł",
     "edithelp": "anáʼálwoʼ",
-    "helppage": "Help:Bee hadítʼéhígíí",
     "mainpage": "Íiyisíí Naaltsoos",
     "mainpage-description": "Íiyisíí Naaltsoos",
     "retrievedfrom": "\"$1\" bitsʼą́ą́dę́ę́ʼ",
index e20b40c..2729d1c 100644 (file)
     "permalink": "Ligam istoric",
     "print": "Imprimir",
     "view": "Veire",
+    "view-foreign": "Veire sus $1",
     "edit": "Modificar",
+    "edit-local": "Modificar la descripcion locala",
     "create": "Crear",
+    "create-local": "apondre una descripcion locala",
     "editthispage": "Modificar aquesta pagina",
     "create-this-page": "Crear aquesta pagina",
     "delete": "Suprimir",
     "accountcreatedtext": "Lo compte d'utilizaire per [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|discussion]]) es estat creat.",
     "createaccount-title": "Creacion d'un compte per {{SITENAME}}",
     "createaccount-text": "Qualqu'un a creat un compte per vòstra adreça de corrièr electronic sus {{SITENAME}} ($4) intitolat « $2 », amb per senhal « $3 ». Deuriaz dobrir una sessilha e cambiar, tre ara, aqueste senhal.\n\nIgnoratz aqueste messatge se aqueste compte es estat creat per error.",
-    "usernamehasherror": "Lo nom d'utilizaire pòt pas conténer de caractèrs de hachage",
     "login-throttled": "Avètz ensajat un tròp grand nombre de connexions darrièrament.\nEsperatz $1 abans d’ensajar tornarmai.",
     "login-abort-generic": "Vòstra temptativa de connexion a fracassat",
     "loginlanguagelabel": "Lenga: $1",
     "revdelete-no-file": "Lo fichièr especificat existís pas.",
     "revdelete-show-file-confirm": "Sètz segur(a) que volètz veire la revision suprimida del fichièr « <nowiki>$1</nowiki> » datant del $2 a $3?",
     "revdelete-show-file-submit": "Òc",
+    "revdelete-selected-text": "{{PLURAL:$1|Revision seleccionada|Revisions seleccionadas}} de [[:$2]] :",
+    "revdelete-selected-file": "{{PLURAL:$1|Version de fichièr seleccionada|Versions de fichièr seleccionadas}} de [[:$2]] :",
     "logdelete-selected": "{{PLURAL:$1|Eveniment d'istoric seleccionat|Eveniments d'istoric seleccionats}} :",
     "revdelete-confirm": "Confirmatz que volètz efectuar aquesta accion, que ne comprenètz las consequéncias, e qu'o fasètz en acòrd amb [[{{MediaWiki:Policy-url}}|las règlas]].",
     "revdelete-suppress-text": "La supression deu èsser utilizada '''sonque''' dins los cases seguents :\n* Informacions potencialament difamatòrias\n* Informacions personalas inapropriadas\n*: ''adreça, numèro de telefòn, numèro de seguretat sociala, ...''",
     "prefs-skin": "Aparéncia",
     "skin-preview": "Previsualizar",
     "datedefault": "Pas cap de preferéncia",
-    "prefs-beta": "Foncionalitats bèta",
-    "prefs-datetime": "Data e ora",
     "prefs-labs": "Foncionalitats « labs »",
     "prefs-user-pages": "Paginas d'utilizaire",
     "prefs-personal": "Entresenhas personalas",
     "upload-permitted": "Formats de fichièrs autorizats : $1.",
     "upload-preferred": "Formats de fichièrs preferits : $1.",
     "upload-prohibited": "Formats de fichièrs interdiches : $1.",
-    "uploadlog": "Istoric de las importacions",
     "uploadlogpage": "Istoric de las importacions de fichièrs multimèdia",
     "uploadlogpagetext": "Aquí la lista dels darrièrs fichièrs copiats sul servidor.\nVejatz la [[Special:NewFiles|galariá dels imatges novèls]] per una presentacion mai visuala.",
     "filename": "Nom del fichièr",
     "filereuploadsummary": "Modificacions del fichièr :",
     "filestatus": "Estatut dels dreches d'autor :",
     "filesource": "Font :",
-    "uploadedfiles": "Fichièrs importats",
     "ignorewarning": "Ignorar l’avertiment e salvar lo fichièr",
     "ignorewarnings": "Ignorar los avertiments al moment de l’impòrt",
     "minlength1": "Los noms de fichièrs devon comprendre almens una letra.",
     "overwroteimage": "a importat una version novèla de « [[$1]] »",
     "uploaddisabled": "O planhèm, lo mandadís de fichièr es desactivat.",
     "copyuploaddisabled": "Mandadís de fichièr per URL desactivat.",
-    "uploadfromurl-queued": "Vòstre mandadís es estat mes dins la fila d'espèra.",
     "uploaddisabledtext": "L'impòrt de fichièrs cap al servidor es desactivat.",
     "php-uploaddisabledtext": "Lo telecargament de fichièrs es estat desactivat dins PHP. Verificatz l'opcion de configuracion file_uploads.",
     "uploadscripted": "Aqueste fichièr conten de còde HTML o un escript que poiriá èsser interpretat d'un biais incorrècte per un navigador Internet.",
     "upload-misc-error": "Error d’impòrt desconeguda",
     "upload-misc-error-text": "Una error desconeguda s'es producha pendent l’impòrt.\nVerificatz que l’URL es valida e accessibla, puèi ensajatz tornamai.\nSe lo problèma persistís, contactatz un [[Special:ListUsers/sysop|administrator del sistèma]].",
     "upload-too-many-redirects": "L'URL conten tròp de redireccions",
-    "upload-unknown-size": "Talha desconeguda",
     "upload-http-error": "Una error HTTP es intervenguda : $1",
     "upload-copy-upload-invalid-domain": "La còpia dels telecargaments es pas disponibla dempuèi aqueste domeni.",
     "backend-fail-stream": "Impossible de legir lo fichièr $1.",
     "img-auth-streaming": "Lectura en continú de « $1 ».",
     "img-auth-public": "La foncion d'img_auth.php es d'afichar de fichièrs d'un wiki privat.\nAqueste wiki es configurat coma un wiki public.\nPer una seguretat optimala, img_auth.php es desactivat.",
     "img-auth-noread": "L'utilizaire a pas lo drech en lectura sus « $1 ».",
-    "img-auth-bad-query-string": "L'URL a una cadena de requèsta invalida.",
     "http-invalid-url": "URL incorrècta : $1",
     "http-invalid-scheme": "Las URLs amb l\"esquèma « $1 » son pas suportadas",
     "http-request-error": "Error desconeguda al moment del mandadís de la requèsta.",
     "filehist-dimensions": "Dimensions",
     "filehist-filesize": "Talha del fichièr",
     "filehist-comment": "Comentari",
-    "filehist-missing": "Fichièr mancant",
     "imagelinks": "Paginas que contenon lo fichièr",
     "linkstoimage": "{{PLURAL:$1|La pagina çaijós compòrta|Las paginas çaijós compòrtan}} aqueste imatge :",
     "linkstoimage-more": "Mai {{PLURAL:$1|d’un ligam de pagina|de $1 ligams de paginas}} cap a aqueste fichièr.\nLa lista seguenta aficha {{PLURAL:$1|lo primièr ligam de pagina|los $1 primièrs ligams de pagina}} unicament cap a aqueste fichièr.\nUna [[Special:WhatLinksHere/$2|lista completa]] es disponibla.",
     "listgrouprights-removegroup-self": "Se pòt levar {{PLURAL:$2|lo grop|los gropes}} de son compte pròpri : $1",
     "listgrouprights-addgroup-self-all": "Se pòt apondre totes los gropes a son compte pròpri",
     "listgrouprights-removegroup-self-all": "Se pòt levar totes los gropes de son compte pròpri",
+    "listgrouprights-namespaceprotection-header": "Restriccions d'espaci de noms",
+    "listgrouprights-namespaceprotection-namespace": "Espaci de noms",
+    "listgrouprights-namespaceprotection-restrictedto": "Drech(s) que permet(on) a l'utilizaire de modificar",
+    "trackingcategories": "Categorias de seguiment",
+    "trackingcategories-msg": "Categoria de seguiment",
+    "trackingcategories-name": "Nom del messatge",
+    "trackingcategories-desc": "Critèri d’inclusion de la categoria",
+    "trackingcategories-nodesc": "Cap de descripcion pas disponibla.",
+    "trackingcategories-disabled": "La categoria es desactivada",
     "mailnologin": "Pas d'adreça",
     "mailnologintext": "Vos cal èsser [[Special:UserLogin|connectat(ada)]]\ne aver indicat una adreça electronica valida dins vòstras [[Special:Preferences|preferéncias]]\nper poder mandar un messatge a un autre utilizaire.",
     "emailuser": "Mandar un messatge a aqueste utilizaire",
     "emailuser-title-notarget": "Mandar un corrièr electronic a l’utilizaire",
     "emailpage": "Mandar un corrièr electronic a l’utilizaire",
     "emailpagetext": "Podètz utilizar lo formulari çaijós per mandar un corrièr electronic a {{GENDER:$1|aqueste utilizaire|aquesta utilizaira}}.\nL'adreça electronica qu'avètz indicada dins [[Special:Preferences|vòstras preferéncias]] apareisserà dins lo camp « Expeditor » de vòstre messatge. E mai, lo destinatari vos poirà respondre dirèctament.",
-    "usermailererror": "Error dins lo subjècte del corrièr electronic :",
     "defemailsubject": "{{SITENAME}} Corrièl de l'utilizaire « $1 »",
     "usermaildisabled": "Lo mandadís de corrièrs electronics entre utilizairers es desactivat",
     "usermaildisabledtext": "Podètz pas mandar de corrièrs electronics a d'autres utilizaires sur aquel wiki",
     "noemailtitle": "Pas d'adreça electronica",
     "noemailtext": "Aqueste utilizaire a pas especificat d'adreça electronica valida.",
-    "nowikiemailtitle": "Pas de corrièr electronic autorizat",
     "nowikiemailtext": "Aqueste utilizaire a causit de recebre pas de corrièr electronic de la part d'autres utilizaires.",
     "emailnotarget": "Nom d'utilizaire del destinatari inexistent o invalid.",
     "emailtarget": "Entratz lo nom d'utilizaire del destinatari",
     "nowatchlist": "Vòstra lista de seguiment conten pas cap d'article.",
     "watchlistanontext": "Per poder afichar o editar los elements de vòstra lista de seguiment, vos cal vos $1.",
     "watchnologin": "Vos sètz pas identificat(ada)",
-    "watchnologintext": "Vos cal èsser [[Special:UserLogin|connectat(ada)]]\nper modificar vòstra lista de seguiment.",
     "addwatch": "Ajustar a la lista de seguiment",
     "addedwatchtext": "La pagina « [[:$1]] » es estada aponduda a vòstra [[Special:Watchlist|lista de seguiment]]. Las modificacions venentas d'aquesta pagina e de la pagina de discussion associada i seràn repertoriadas.",
     "removewatch": "Suprimir de la lista de seguiment",
     "unwatchthispage": "Arrestar de seguir",
     "notanarticle": "Pas cap d'article",
     "notvisiblerev": "Version suprimida",
-    "watchlist-details": "I a {{PLURAL:$1|pagina|paginas}} dins vòstra lista de seguiment, sens comptar las paginas de discussion.",
+    "watchlist-details": "I a {{PLURAL:$1|$1 pagina|$1 paginas}} dins vòstra lista de seguiment, sens comptar las paginas de discussion.",
     "wlheader-enotif": "La notificacion per corrièr electronic es activada.",
     "wlheader-showupdated": "Las paginas que son estadas modificadas dempuèi vòstra darrièra visita son afichadas en '''gras'''.",
     "watchmethod-recent": "verificacion dels darrièrs cambiaments per i trobar de paginas seguidas",
     "watching": "Seguit...",
     "unwatching": "Fin del seguit...",
     "watcherrortext": "Una error s'es producha al moment de la modificacion dels paramètres de vòstra lista de seguiment per « $1 ».",
-    "enotif_mailer": "Sistèma d’expedicion de notificacion de {{SITENAME}}",
     "enotif_reset": "Marcar totas las paginas coma visitadas",
     "enotif_impersonal_salutation": "Utilizaire de {{SITENAME}}",
     "enotif_subject_deleted": "La pagina $1 sus {{SITENAME}} es estada suprimida per {{GENDER:$2|$2}}",
     "excontent": "contenent '$1'",
     "excontentauthor": "lo contengut èra : « $1 » (e l'unic contributor èra « [[Special:Contributions/$2|$2]] »)",
     "exbeforeblank": "lo contengut abans blanquiment èra :'$1'",
-    "exblank": "pagina voida",
     "delete-confirm": "Escafar «$1»",
     "delete-legend": "Escafar",
     "historywarning": "'''Atencion :''' La pagina que s�tz a mand de suprimir a un istoric que conten aproximadament $1 {{PLURAL:$1|revision|revisions}} :",
     "contributions-title": "Lista de las contribucions de l’utilizaire $1",
     "mycontris": "Contribucions",
     "contribsub2": "Per {{GENDER:$3|$1}} ($2)",
+    "contributions-userdoesnotexist": "Lo compte d'utilizaire « $1 » es pas enregistrat.",
     "nocontribs": "Cap de modificacion correspondenta a aquestes critèris es pas estada trobada.",
     "uctop": "(actual)",
     "month": "A partir del mes (e precedents) :",
     "sp-contributions-newbies-sub": "Lista de las contribucions dels utilizaires novèls. Las paginas que son estadas suprimidas son pas afichadas.",
     "sp-contributions-newbies-title": "Las contribucions de l’utilizaire pels comptes novèls",
     "sp-contributions-blocklog": "Istoric dels blocatges",
+    "sp-contributions-suppresslog": "contribucions suprimidas d’un utilizaire",
     "sp-contributions-deleted": "contribucions suprimidas",
     "sp-contributions-uploads": "importat",
     "sp-contributions-logs": "jornals",
     "sp-contributions-blocked-notice": "Aqueste utilizaire es actualament blocat. La darrièra entrada del jornal dels blocatges es indicada çaijós a títol d’informacion :",
     "sp-contributions-blocked-notice-anon": "Aquesta adreça IP es actualament blocada.\nLa darrièra intrada del jornal dels blocatges es indicada çaijós a títol d’informacion :",
     "sp-contributions-search": "Cercar las contribucions",
-    "sp-contributions-suppresslog": "contribucions suprimidas d’un utilizaire",
     "sp-contributions-username": "Adreça IP o nom d’utilizaire :",
     "sp-contributions-toponly": "Mostrar sonque las contribucions que son lo darrièr cambiament",
     "sp-contributions-newonly": "Afichar unicament las modificacions que son de creacions de pagina",
     "allmessagesname": "Nom del camp",
     "allmessagesdefault": "Messatge per defaut",
     "allmessagescurrent": "Messatge actual",
-    "allmessagestext": "Aquò es la lista de totes los messatges disponibles dins l’espaci MediaWiki.\nVisitatz la [https://www.mediawiki.org/wiki/Localisation Localizacion MediaWiki] e [//translatewiki.net translatewiki.net] se desiratz contribuir a la localizacion MediaWiki generica.",
+    "allmessagestext": "Aquò es la lista de totes los messatges disponibles dins l’espaci MediaWiki.\nVisitatz la [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation Localizacion MediaWiki] e [//translatewiki.net translatewiki.net] se desiratz contribuir a la localizacion MediaWiki generica.",
     "allmessagesnotsupportedDB": "'''{{ns:special}}:Allmessages''' es pas disponible perque '''$wgUseDatabaseMessages''' es desactivat.",
     "allmessages-filter-legend": "Filtre",
     "allmessages-filter": "Filtrar per estat de modificacion :",
     "importunknownsource": "Tipe de la font d’impòrt desconegut",
     "importcantopen": "Impossible de dobrir lo fichièr d'importar",
     "importbadinterwiki": "Ligam interwiki marrit",
-    "importnotext": "Void o sens tèxte",
     "importsuccess": "L'impòrt a capitat !",
-    "importhistoryconflict": "I a un conflicte dins l'istoric de las versions (aquesta pagina a pogut èsser importada de per abans).",
     "importnosources": "Cap de font interwiki es pas estada definida e la còpia dirècta d’istoric es desactivada.",
     "importnofile": "Cap de fichièr es pas estat importat.",
     "importuploaderrorsize": "Lo telecargament del fichièr d'importar a pas capitat. Sa talha es mai granda que la autorizada.",
index 78958cd..652e0b1 100644 (file)
@@ -2,7 +2,15 @@
     "@metadata": {
         "authors": [
             "Shijualex",
-            "Psubhashish"
+            "Psubhashish",
+            "Ansumang",
+            "Jnanaranjan Sahu",
+            "Jose77",
+            "MKar",
+            "Odisha1",
+            "Sambiwiki",
+            "Shisir 1945",
+            "ଶିତିକଣ୍ଠ ଦାଶ"
         ]
     },
     "tog-underline": "ତଳେ ଥିବା ଲିଙ୍କ:",
     "gotaccount": "ଆଗରୁ ଖାତାଟିଏ ଅଛି କି? $1.",
     "gotaccountlink": "ଲଗ ଇନ (Log in)",
     "userlogin-resetlink": "ଲଗଇନ ତଥ୍ୟ ସବୁ ଭୁଲିଗେଲେକି?",
-    "userlogin-resetpassword-link": "ପାସୱାରà­\8dଡ଼ à¬°à¬¿à¬¸à­\87à¬\9f à¬\95ରନà­\8dତà­\81",
+    "userlogin-resetpassword-link": "ପାସୱାରà­\8dଡ଼ à¬­à­\81ଲିଯାà¬\87à¬\9bନà­\8dତି ?",
     "createacct-emailrequired": "ଇମେଲ ଠିକଣା",
     "createacct-emailoptional": "ଇମେଲ ଠିକଣା (ଇଚ୍ଛାଧୀନ)",
     "createacct-email-ph": "ଆପଣଙ୍କ ଇମେଲ ଠିକଣା ନିବେଶ କରନ୍ତୁ",
     "login-abort-generic": "ଆପଣଙ୍କ ଲଗ ଇନ ଅସଫଳ ହେଲା - ନାକଚ କରିଦିଆଗଲା",
     "loginlanguagelabel": "ଭାଷା: $1",
     "suspicious-userlogout": "ଲଗ ଆଉଟ କରିବା ନିମନ୍ତେ ଆପଣ କରିଥିବା ଆବେଦନ ନାକଚ କରିଦିଆଗଲା କାରଣ ଲାଗୁଅଛି ଯେ ଏହା ଏକ ଅସ୍ଥିର ବ୍ରାଉଜରରୁ ପଠାଯାଇଅଛି ଅବା ପ୍ରକ୍ସି ଧରାଯାଇଅଛି ।",
+    "pt-login": "ଲଗ-ଇନ",
+    "pt-login-button": "ଲଗ-ଇନ",
+    "pt-createaccount": "ଖାତାଟିଏ ଖୋଲନ୍ତୁ",
+    "pt-userlogout": "ଲଗ-ଆଉଟ",
     "php-mail-error-unknown": "PHP ର ମେଲ() କାମରେ ଅଜଣା ଅସୁବିଧା ।",
     "user-mail-no-addy": "ଏକ ଇ-ମେଲ ଠିକଣା ବିନା ଇ-ମେଲ ପଠାଇବାକୁ ଚେଷ୍ଟା କଲୁଁ ।",
     "user-mail-no-body": "ଏକ ଖାଲି କିମ୍ବା ଅଦରକାରୀ ଛୋଟ ଲେଖା ଥିବା ମେଲ ପଠେଇବାକୁ ଚେଷ୍ଟା କରିଥିଲେ",
     "changepassword": "ପାସୱର୍ଡ଼ ବଦଳାନ୍ତୁ",
-    "resetpass_announce": "à¬\86ପଣ à¬\8fà¬\95 à¬\85ସà­\8dଥାà­\9fà­\80 à¬\87-ମà­\87ଲରà­\87 à¬¯à¬¾à¬\87ଥିବା à¬\95à­\8bଡ଼ à¬¸à¬¹à¬¾à­\9fତାରà­\87 à¬²à¬\97 à¬\87ନ à¬\95ରିà¬\85à¬\9bନà­\8dତି à¥¤\nଲà¬\97 à¬\87ନ à¬¶à­\87ଷ à¬\95ରିବା à¬¨à¬¿à¬®à¬¨à­\8dତà­\87 à¬\86ପଣà¬\99à­\8dà¬\95à­\81 à¬\8fହିଠାରà­\87 à¬¨à­\82à¬\86 à¬ªà¬¾à¬¸à¬¬à¬¾à¬°à­\8dଡ଼à¬\9fିà¬\8f à¬¦à­\87ବାà¬\95à­\81 à¬ªà¬¡à¬¼à¬¿à¬¬:",
+    "resetpass_announce": "ଲà¬\97à­\8d-à¬\87ନ à¬ªà­\8dରà¬\95à­\8dରିà­\9fା à¬¶à­\87ଷ à¬\95ରିବା à¬¨à¬¿à¬®à¬¨à­\8dତà­\87, à¬\86ପଣà¬\99à­\8dà¬\95à­\81 à¬\8fà¬\95 à¬¨à­\82à¬\86 à¬ªà¬¾à¬¸à­±à¬¾à¬°à­\8dଡ଼à¬\9fିà¬\8f à¬¦à­\87ବାà¬\95à­\81 à¬ªà¬¡à¬¼à¬¿à¬¬ à¥¤",
     "resetpass_header": "ଖାତାର ପାସୱାର୍ଡ଼ଟିକୁ ବଦଳାଇ ଦିଅନ୍ତୁ",
     "oldpassword": "ପୁରୁଣା ପାସୱାର୍ଡ଼:",
     "newpassword": "ନୂଆ ପାସୱାର୍ଡ଼:",
     "retypenew": "ପାସୱାର୍ଡ଼ ଆଉଥରେ ଦିଅନ୍ତୁ:",
     "resetpass_submit": "ପାସୱାର୍ଡ଼ଟିଏ ଦେଇ ଲଗ ଇନ କରନ୍ତୁ",
-    "changepassword-success": "à¬\86ପଣà¬\99à­\8dà¬\95 à¬ªà¬¾à¬¸à­±à¬¾à¬°à­\8dଡ଼à¬\9fି à¬¬à¬¦à¬³à¬¾à¬\87 à¬¦à¬¿à¬\86à¬\97ଲା !\nà¬\8fବà­\87 à¬²à¬\97 à¬\87ନ à¬\95ରà­\81à¬\85à¬\9bà­\81à¬\81...",
+    "changepassword-success": "à¬\86ପଣà¬\99à­\8dà¬\95 à¬ªà¬¾à¬¸à­±à¬¾à¬°à­\8dଡ଼à¬\9fି à¬¸à¬«à¬³à¬¤à¬¾ à¬ªà­\82ରà­\8dବà¬\95 à¬¬à¬¦à¬³à¬¾à¬\87 à¬¦à¬¿à¬\86à¬\97ଲା !",
     "resetpass_forbidden": "ପାସୱାର୍ଡ଼ମାନ ବଦଳା ଯାଇପାରିବ ନାହିଁ",
     "resetpass-no-info": "ଏହି ପୃଷ୍ଠାଟିକୁ ସିଧା ଖୋଲିବା ନିମନ୍ତେ ଆପଣଙ୍କୁ ଲଗ ଇନ କରିବାକୁ ପଡ଼ିବ ।",
     "resetpass-submit-loggedin": "ପାସୱାର୍ଡ଼ ବଦଳାନ୍ତୁ",
     "prefs-skin": "ବହିରାବରଣ",
     "skin-preview": "ସାଇତା ଆଗରୁ ଦେଖଣା",
     "datedefault": "କୌଣସି ପସନ୍ଦ ନାହିଁ",
-    "prefs-beta": "ଆଗ ବିଶେଷତାମାନ",
     "prefs-datetime": "ତାରିଖ ଓ ସମୟ",
     "prefs-labs": "ପରଖଶାଳା ସୁବିଧାସବୁ",
     "prefs-user-pages": "ବ୍ୟବହାରକାରୀଙ୍କର ପୃଷ୍ଠାଗୁଡିକ",
     "nowatchlist": "ଆପଣଙ୍କ ଦେଖଣା ତାଲିକାରେ କିଛି ବି ଜିନିଷ ନାହିଁ ।",
     "watchlistanontext": "ଆପଣା ଦେଖଣାତାଲିକାରେ କିଛି ସମ୍ପାଦନା କରିବା ନିମନ୍ତେ ଦୟାକରି  $1 କରନ୍ତୁ ।",
     "watchnologin": "ଲଗ‌‌ ଇନ କରିନାହାନ୍ତି",
-    "watchnologintext": "ଆପଣା ଦେଖଣାତାଲିକା ବଦଳାଇବା ନିମନ୍ତେ ଆପଣଙ୍କୁ [[Special:UserLogin|ଲଗ ଇନ]] କରିବାକୁ ପଡ଼ିବ ।",
     "addwatch": "ଦେଖଣାତାଲିକାରେ ଯୋଡ଼ିବେ",
     "addedwatchtext": "\"[[:$1]]\" ପୃଷ୍ଠାଟି ଆପଣଙ୍କ [[Special:Watchlist|ଦେଖଣାତାଲିକା]]ରେ ଯୋଡ଼ିଦିଆଗଲା ।\nଏହି ପୃଷ୍ଠାରେ ଭବିଷ୍ୟତର ଅଦଳ ବଦଳ ଓ ତାହା ସହ ଯୋଡ଼ା ଆଲୋଚନା ପୃଷ୍ଠା ସେଠାରେ ଦିଆଯିବ ।",
     "removewatch": "ଦେଖଣା ତାଲିକାରୁ ହଟାଇବେ",
     "allmessagesname": "ନାମ",
     "allmessagesdefault": "ଆପେଆପେ ଚିଠିରେ ରହିବା କଥା",
     "allmessagescurrent": "ଏବେକର ସନ୍ଦେଶ ଲେଖା",
-    "allmessagestext": "ଏଥିରେ ମିଡ଼ିଆଉଇକି ନେମସ୍ପେସରେ ଥିବା ସିଷ୍ଟମ ସନ୍ଦେଶର ଏକ ତାଲିକା ଦିଆଗଲା ।\nଯଦି ଆପଣ ମୂଳ ଦୟାକରି ମିଡ଼ିଆଉଇକି ଆଞ୍ଚଳିକୀକରଣରେ ଭାଗ ନେବା ପାଇଁ ଚାହାନ୍ତି ତେବେ [https://www.mediawiki.org/wiki/Localisation ମିଡ଼ିଆଉଇକି ଆଞ୍ଚଳିକୀକରଣ] ଓ [//translatewiki.net translatewiki.net] ଦେଖନ୍ତୁ ।",
+    "allmessagestext": "ଏଥିରେ ମିଡ଼ିଆଉଇକି ନେମସ୍ପେସରେ ଥିବା ସିଷ୍ଟମ ସନ୍ଦେଶର ଏକ ତାଲିକା ଦିଆଗଲା ।\nଯଦି ଆପଣ ମୂଳ ଦୟାକରି ମିଡ଼ିଆଉଇକି ଆଞ୍ଚଳିକୀକରଣରେ ଭାଗ ନେବା ପାଇଁ ଚାହାନ୍ତି ତେବେ [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation ମିଡ଼ିଆଉଇକି ଆଞ୍ଚଳିକୀକରଣ] ଓ [//translatewiki.net translatewiki.net] ଦେଖନ୍ତୁ ।",
     "allmessagesnotsupportedDB": "'''$wgUseDatabaseMessages''' ଅଚଳ କରାଯାଇଥିବାରୁ ଏହି ପୃଷ୍ଠାଟି ବ୍ୟବହାର କରାଯାଇପାରିବ ନାହିଁ ।",
     "allmessages-filter-legend": "ଛାଣିବା",
     "allmessages-filter": "ଆପଣା ପସନ୍ଦରେ ଛାଣିବେ:",
index fd88bed..57e52a5 100644 (file)
@@ -53,7 +53,6 @@
     "currentevents": "Saray nagagawa natan",
     "currentevents-url": "Project:Saray nagagawa natan",
     "edithelp": "Tolong nipakar ed panagbalo na artikulo",
-    "helppage": "Help:Saray Laman",
     "mainpage": "Arapan ya Bolong",
     "mainpage-description": "Arapan ya Bolong",
     "portal": "Pwerta na komyunidad",
index 11c6ec4..d690593 100644 (file)
     "disclaimers": "Deklarashon di Liberashon for di Responsabilidatnan",
     "disclaimerpage": "Project:Deklarashon di Liberashon for di Responsabilidat General",
     "edithelp": "Ayudo ku editamentu",
-    "helppage": "Help:Kontenido",
     "mainpage": "Página Prinsipal",
     "mainpage-description": "Página Prinsipal",
     "policy-url": "Project:Pólisa",
index 92bf0e5..2a5329b 100644 (file)
     "disclaimers": "Impressum",
     "disclaimerpage": "Project:Impressum",
     "edithelp": "Help tom Beoabeide",
-    "helppage": "Help:Enhault",
     "mainpage": "Hauptsied",
     "mainpage-description": "Hauptsied",
     "policy-url": "Project:Policy",
index 6e370a0..3aabf75 100644 (file)
@@ -25,7 +25,6 @@
     "talk": "diskushun",
     "currentevents": "Dem Kurent Iwent",
     "currentevents-url": "Project:Dem Kurent Iwent",
-    "helppage": "Help:Dem Kontent",
     "mainpage": "Mien Paij",
     "mainpage-description": "Mien Paij",
     "portal": "Trii'nohlij",
index 82b742c..ed9604a 100644 (file)
@@ -61,7 +61,8 @@
             "Wpedzich",
             "Ymar",
             "Žekřil71pl",
-            "לערי ריינהארט"
+            "לערי ריינהארט",
+            "Pan Cube"
         ]
     },
     "tog-underline": "Podkreślenie linków:",
@@ -87,7 +88,7 @@
     "tog-enotifminoredits": "Wyślij e‐mail także w przypadku drobnych zmian na stronach lub w plikach",
     "tog-enotifrevealaddr": "Nie ukrywaj mojego adresu e‐mail w powiadomieniach",
     "tog-shownumberswatching": "Pokaż liczbę użytkowników obserwujących stronę",
-    "tog-oldsig": "Twój obecny podpis",
+    "tog-oldsig": "Twój obecny podpis:",
     "tog-fancysig": "Traktuj podpis jako wikikod (nie linkuj automatycznie całości)",
     "tog-uselivepreview": "Używaj dynamicznego podglądu (eksperymentalny)",
     "tog-forceeditsummary": "Informuj o niewypełnieniu opisu zmian",
     "underline-always": "zawsze",
     "underline-never": "nigdy",
     "underline-default": "według ustawień skórki lub przeglądarki",
-    "editfont-style": "Styl czcionki w polu edycyjnym",
+    "editfont-style": "Styl czcionki w polu edycyjnym:",
     "editfont-default": "domyślny przeglądarki",
     "editfont-monospace": "czcionka o stałej szerokości",
     "editfont-sansserif": "czcionka bezszeryfowa",
     "print": "Drukuj",
     "view": "Podgląd",
     "edit": "Edytuj",
+    "edit-local": "Edytuj lokalny opis",
     "create": "Utwórz",
+    "create-local": "Dodaj lokalny opis",
     "editthispage": "Edytuj tę stronę",
     "create-this-page": "Utwórz tę stronę",
     "delete": "Usuń",
     "pool-timeout": "Zbyt długi czas oczekiwania na blokadę",
     "pool-queuefull": "Kolejka zadań jest pełna",
     "pool-errorunknown": "Błąd nieznany",
+    "pool-servererror": "Usługa licznika nie jest dostępna ($1).",
     "aboutsite": "O {{GRAMMAR:MS.lp|{{SITENAME}}}}",
     "aboutpage": "Project:O {{GRAMMAR:MS.lp|{{SITENAME}}}}",
     "copyright": "Treść udostępniana na licencji $1, jeśli nie podano inaczej.",
     "userlogin-yourname": "Nazwa użytkownika",
     "userlogin-yourname-ph": "Wprowadź swoją nazwę użytkownika",
     "createacct-another-username-ph": "Wprowadź nazwę użytkownika",
-    "yourpassword": "Hasło",
+    "yourpassword": "Hasło:",
     "userlogin-yourpassword": "Hasło",
     "userlogin-yourpassword-ph": "Wpisz swoje hasło",
     "createacct-yourpassword-ph": "Wprowadź hasło",
     "createacct-benefit-heading": "{{grammar:B.lp|{{SITENAME}}}} tworzą ludzie tacy jak Ty.",
     "createacct-benefit-body1": "{{PLURAL:$1|edycja|edycje|edycji}}",
     "createacct-benefit-body2": "{{PLURAL:$1|strona|strony|stron}}",
-    "createacct-benefit-body3": "{{PLURAL:$1|użytkownik|użytkowników}} w ostatnim czasie",
+    "createacct-benefit-body3": "{{PLURAL:$1|aktywny użytkownik|aktywnych użytkowników}} w ostatnim miesiącu",
     "badretype": "Wprowadzone hasła różnią się między sobą.",
     "userexists": "Wybrana przez Ciebie nazwa użytkownika jest już zajęta.\nWybierz inną nazwę użytkownika.",
     "loginerror": "Błąd logowania",
     "accountcreatedtext": "Konto dla [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|dyskusja]]) zostało utworzone.",
     "createaccount-title": "Utworzenie konta w {{GRAMMAR:MS.lp|{{SITENAME}}}}",
     "createaccount-text": "Ktoś utworzył w {{GRAMMAR:MS.lp|{{SITENAME}}}} ($4), podając Twój adres e‐mail, konto „$2”. Aktualnym hasłem jest „$3”.\nZaloguj się teraz i je zmień.\n\nMożesz zignorować tę wiadomość, jeśli konto zostało utworzone przez pomyłkę.",
-    "usernamehasherror": "Nazwa użytkownika nie może zawierać znaków kratki „#”",
     "login-throttled": "Zbyt wiele razy próbowałeś zalogować się na to konto.\nOdczekaj $1 zanim ponowisz próbę.",
     "login-abort-generic": "Logowanie nieudane – przerwano",
     "loginlanguagelabel": "Język: $1",
     "search-error": "Wystąpił błąd podczas wyszukiwania:$1",
     "preferences": "Preferencje",
     "mypreferences": "Preferencje",
-    "prefs-edits": "Liczba edycji",
+    "prefs-edits": "Liczba edycji:",
     "prefsnologintext2": "Musisz $1 aby ustawić preferencje.",
     "prefs-skin": "Skórka",
     "skin-preview": "podgląd",
     "datedefault": "Domyślny",
-    "prefs-beta": "Funkcje testowe",
-    "prefs-datetime": "Data i czas",
     "prefs-labs": "Funkcje doświadczalne",
     "prefs-user-pages": "Strony użytkowników",
     "prefs-personal": "Dane użytkownika",
     "prefs-watchlist": "Obserwowane",
     "prefs-watchlist-days": "Liczba dni widocznych na liście obserwowanych",
     "prefs-watchlist-days-max": "Maksimum $1 {{PLURAL:$1|dzień|dni}}",
-    "prefs-watchlist-edits": "Liczba edycji pokazywanych w rozszerzonej liście obserwowanych",
+    "prefs-watchlist-edits": "Liczba edycji pokazywanych w rozszerzonej liście obserwowanych:",
     "prefs-watchlist-edits-max": "Maksymalnie 1000",
     "prefs-watchlist-token": "Identyfikator listy obserwowanych:",
     "prefs-misc": "Ustawienia różne",
     "saveprefs": "Zapisz",
     "restoreprefs": "Przywróć wszystkie domyślne preferencje (we wszystkich zakładkach)",
     "prefs-editing": "Edycja",
-    "rows": "Wiersze",
-    "columns": "Kolumny",
+    "rows": "Wiersze:",
+    "columns": "Kolumny:",
     "searchresultshead": "Wyszukiwanie",
     "stub-threshold": "Maksymalny (w bajtach) rozmiar strony oznaczanej jako <a href=\"#\" class=\"stub\">zalążek (stub)</a>",
     "stub-threshold-disabled": "Wyłączone",
-    "recentchangesdays": "Liczba dni prezentowanych w ostatnich zmianach",
+    "recentchangesdays": "Liczba dni prezentowanych w ostatnich zmianach:",
     "recentchangesdays-max": "(maksymalnie $1 {{PLURAL:$1|dzień|dni}})",
-    "recentchangescount": "Domyślna liczba wyświetlanych edycji",
+    "recentchangescount": "Domyślna liczba wyświetlanych edycji:",
     "prefs-help-recentchangescount": "Uwzględnia ostatnie zmiany, historię stron i rejestry.",
     "prefs-help-watchlist-token2": "To jest tajny klucz umożliwiający dostęp do kanału internetowego zmian w obserwowanych przez ciebie stronach.\nKażdy, kto go zna, będzie mógł je zobaczyć, więc zachowaj go dla siebie.\n[[Special:ResetTokens|Kliknij tu, jeśli musisz go zresetować]].",
     "savedprefs": "Twoje preferencje zostały zapisane.",
-    "timezonelegend": "Strefa czasowa",
-    "localtime": "Czas lokalny",
+    "timezonelegend": "Strefa czasowa:",
+    "localtime": "Czas lokalny:",
     "timezoneuseserverdefault": "Użyj domyślnej dla tej wiki ($1)",
     "timezoneuseoffset": "Inna (określ różnicę czasu)",
-    "servertime": "Czas serwera",
+    "servertime": "Czas serwera:",
     "guesstimezone": "Pobierz z przeglądarki",
     "timezoneregion-africa": "Afryka",
     "timezoneregion-america": "Ameryka",
     "prefs-files": "Pliki",
     "prefs-custom-css": "własny CSS",
     "prefs-custom-js": "własny JavaScript",
-    "prefs-common-css-js": "Wspólny CSS/JS dla wszystkich skórek",
+    "prefs-common-css-js": "Wspólny CSS/JS dla wszystkich skórek:",
     "prefs-reset-intro": "Na tej stronie można przywrócić domyślne ustawienia preferencji dla tej witryny.\nTej operacji nie można później cofnąć.",
-    "prefs-emailconfirm-label": "Potwierdzenie adresu e‐mail",
-    "youremail": "Twój adres e‐mail",
+    "prefs-emailconfirm-label": "Potwierdzenie adresu e‐mail:",
+    "youremail": "Twój adres e‐mail:",
     "username": "{{GENDER:$1|Nazwa użytkownika}}:",
     "uid": "{{GENDER:$1|Identyfikator użytkownika}}:",
     "prefs-memberingroups": "{{GENDER:$2|Członek}} {{PLURAL:$1|grupy|grup}}:",
-    "prefs-registration": "Data rejestracji",
-    "yourrealname": "Imię i nazwisko",
-    "yourlanguage": "Język interfejsu",
+    "prefs-registration": "Data rejestracji:",
+    "yourrealname": "Imię i nazwisko:",
+    "yourlanguage": "Język interfejsu:",
     "yourvariant": "Wariant języka treści",
     "prefs-help-variant": "Preferowany wariant ortografii, który ma zostać użyty przy wyświetlaniu treści tej wiki.",
-    "yournick": "Twój podpis",
+    "yournick": "Nowy podpis:",
     "prefs-help-signature": "Wypowiedzi na stronach dyskusji powinny być podpisywane za pomocą „<nowiki>~~~~</nowiki>”, dzięki temu automatycznie wstawiany jest Twój podpis wraz z bieżącą datą.",
     "badsig": "Nieprawidłowy podpis, sprawdź znaczniki HTML.",
     "badsiglength": "Twój podpis jest zbyt długi.\nDopuszczalna długość to $1 {{PLURAL:$1|znak|znaki|znaków}}.",
     "upload-permitted": "Dopuszczalne formaty plików: $1.",
     "upload-preferred": "Zalecane formaty plików: $1.",
     "upload-prohibited": "Zabronione formaty plików: $1.",
-    "uploadlog": "rejestr przesyłania plików",
     "uploadlogpage": "Przesłane",
     "uploadlogpagetext": "Lista ostatnio przesłanych plików.\nPrzejdź na stronę [[Special:NewFiles|galerii nowych plików]], by zobaczyć pliki jako miniaturki.",
     "filename": "Nazwa pliku",
     "filereuploadsummary": "Zmiany w pliku:",
     "filestatus": "Status prawny",
     "filesource": "Źródło",
-    "uploadedfiles": "Przesłane pliki",
     "ignorewarning": "Zignoruj ostrzeżenia i wymuś zapisanie pliku",
     "ignorewarnings": "Ignoruj wszystkie ostrzeżenia",
     "minlength1": "Nazwa pliku musi składać się co najmniej z jednej litery.",
     "overwroteimage": "przesłano nową wersję pliku „[[$1]]“",
     "uploaddisabled": "Przesyłanie plików wyłączone",
     "copyuploaddisabled": "Przesyłanie poprzez podanie adres URL jest wyłączone.",
-    "uploadfromurl-queued": "Żądanie przesłania pliku zostało dołączone do kolejki.",
     "uploaddisabledtext": "Możliwość przesyłania plików została wyłączona.",
     "php-uploaddisabledtext": "Przesyłanie plików PHP zostało zablokowane. Sprawdź ustawienie „file_uploads”.",
     "uploadscripted": "Plik zawiera kod HTML lub skrypt, który może zostać błędnie zinterpretowany przez przeglądarkę internetową.",
     "upload-misc-error": "Nieznany błąd przesyłania",
     "upload-misc-error-text": "Wystąpił nieznany błąd podczas przesyłania.\nSprawdź, czy podany adres URL jest poprawny i dostępny, a następnie spróbuj ponownie.\nJeśli problem będzie się powtarzał, skontaktuj się z [[Special:ListUsers/sysop|administratorem]].",
     "upload-too-many-redirects": "URL zawiera zbyt wiele przekierowań",
-    "upload-unknown-size": "Nieznany rozmiar",
     "upload-http-error": "Wystąpił błąd protokołu HTTP – $1",
     "upload-copy-upload-invalid-domain": "Przesyłanie kopii z tej domeny nie jest dostępne.",
     "backend-fail-stream": "Nie można odczytać pliku $1.",
     "img-auth-streaming": "Strumieniowanie „$1”.",
     "img-auth-public": "Funkcja img_auth.php służy do pobierania plików z prywatnej wiki.\nPonieważ ta wiki została skonfigurowana jako publiczna dla zapewnienia optymalnego bezpieczeństwa img_auth.php została wyłączona.",
     "img-auth-noread": "Użytkownik nie ma dostępu do odczytu „$1”.",
-    "img-auth-bad-query-string": "Adres URL zawiera nieprawidłowe zapytanie.",
     "http-invalid-url": "Niepoprawny adres URL: $1",
     "http-invalid-scheme": "Adresy „$1“ nie są obsługiwane.",
     "http-request-error": "Nieudane żądanie HTTP ze względu na nieznany błąd.",
     "filehist-dimensions": "Wymiary",
     "filehist-filesize": "Rozmiar pliku",
     "filehist-comment": "Opis",
-    "filehist-missing": "Brak pliku",
     "imagelinks": "Wykorzystanie pliku",
     "linkstoimage": "{{PLURAL:$1|Poniższa strona odwołuje|Następujące strony odwołują}} się do tego pliku:",
     "linkstoimage-more": "Więcej niż $1 {{PLURAL:$1|strona linkuje|strony linkują|stron linkuje}} do tego pliku.\nPoniższa lista pokazuje jedynie {{PLURAL:$1|pierwszy link|pierwsze $1 linki|pierwszych $1 linków}} do tego pliku.\nDostępna jest też [[Special:WhatLinksHere/$2|pełna lista]].",
     "listgrouprights-removegroup-self": "Możliwość usunięcia własnego konta z {{PLURAL:$2|grupy|grup:}} $1",
     "listgrouprights-addgroup-self-all": "Może dodać własne konto do wszystkich grup",
     "listgrouprights-removegroup-self-all": "Może usunąć własne konto ze wszystkich grup",
+    "listgrouprights-namespaceprotection-header": "Ograniczenia przestrzeni nazw",
+    "listgrouprights-namespaceprotection-namespace": "Przestrzeń nazw",
+    "listgrouprights-namespaceprotection-restrictedto": "Uprawnienia pozwalające użytkownikom na edytowanie",
+    "trackingcategories": "Śledzenie kategorii",
+    "trackingcategories-msg": "Śledzenie kategorii",
+    "trackingcategories-name": "Nazwa komunikatu",
+    "post-expand-template-inclusion-category-desc": "Po rozwinięciu wszystkich szablonów, rozmiar strony jest większe niż <code>$wgMaxArticleSize</code>, więc niektóre szablony nie zostały rozwinięte.",
+    "expensive-parserfunction-category-desc": "Na stronie używanych jest zbyt wiele wymagających funkcji parsera (takich jak <code>#ifexist</code>). Więcej informacji na stronie [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit Manual:$wgExpensiveParserFunctionLimit].",
+    "trackingcategories-nodesc": "Opis nie jest dostępny.",
+    "trackingcategories-disabled": "Kategoria jest wyłączona",
     "mailnologin": "Brak adresu",
     "mailnologintext": "Musisz się [[Special:UserLogin|zalogować]] i mieć wpisany aktualny adres e‐mailowy w swoich [[Special:Preferences|preferencjach]], aby móc wysłać e‐mail do innego użytkownika.",
     "emailuser": "Wyślij e‐mail do tego użytkownika",
     "emailuser-title-notarget": "Wyślij wiadomość e‐mail",
     "emailpage": "Wyślij e‐mail do użytkownika",
     "emailpagetext": "Możesz użyć poniższego formularza, aby wysłać wiadomość e‐mail do {{GENDER:$1|tego użytkownika|tej użytkowniczki}}.\nAdres e‐mailowy, który został przez Ciebie wprowadzony w [[Special:Preferences|Twoich preferencjach]], zostanie umieszczony w polu „Od”, dzięki czemu odbiorca będzie mógł Ci odpowiedzieć.",
-    "usermailererror": "Moduł obsługi poczty zwrócił błąd:",
     "defemailsubject": "{{SITENAME}} – e‐mail od użytkownika „$1“",
     "usermaildisabled": "E‐mail użytkownika jest wyłączony",
     "usermaildisabledtext": "Nie możesz wysyłać e‐maili do innych użytkowników tej wiki",
     "noemailtitle": "Brak adresu e‐mail",
     "noemailtext": "Ten użytkownik nie podał poprawnego adresu e‐mail.",
-    "nowikiemailtitle": "Brak zezwolenia na otrzymywanie e‐maili",
     "nowikiemailtext": "Ten użytkownik nie chce otrzymywać wiadomości e‐mail od innych użytkowników.",
     "emailnotarget": "Adresat nie istnieje lub podana nazwa użytkownika jest nieprawidłowa.",
     "emailtarget": "Wpisz nazwę użytkownika, który jest adresatem",
     "nowatchlist": "Lista obserwowanych przez Ciebie stron jest pusta.",
     "watchlistanontext": "$1, aby obejrzeć lub edytować elementy listy obserwowanych.",
     "watchnologin": "Nie jesteś zalogowany",
-    "watchnologintext": "Musisz się [[Special:UserLogin|zalogować]] przed modyfikacją listy obserwowanych stron.",
     "addwatch": "Dodaj do listy obserwowanych",
     "addedwatchtext": "Strona „[[:$1|$1]]” została dodana do Twojej [[Special:Watchlist|listy obserwowanych]].\nKażda zmiana treści tej strony lub związanej z nią strony dyskusji zostanie odnotowana na tej liście.",
     "removewatch": "Usuń z listy obserwowanych",
     "unwatchthispage": "Nie obserwuj",
     "notanarticle": "To nie jest artykuł",
     "notvisiblerev": "Wersja została usunięta",
-    "watchlist-details": "Lista obserwowanych przez Ciebie stron zawiera {{PLURAL:$1|$1 pozycję|$1 pozycje|$1 pozycji}}, nie licząc stron dyskusji.",
+    "watchlist-details": "Lista obserwowanych przez Ciebie stron zawiera {{PLURAL:$1|$1 pozycję|$1 pozycje|$1 pozycji}}, nie licząc oddzielnie stron dyskusji.",
     "wlheader-enotif": "Wysyłanie powiadomień na adres e‐mail jest włączone.",
     "wlheader-showupdated": "'''Wytłuszczone''' zostały strony, które zostały zmodyfikowane od Twojej ostatniej wizyty na nich.",
     "watchmethod-recent": "poszukiwanie ostatnich zmian wśród obserwowanych stron",
     "watching": "Dodaję do obserwowanych...",
     "unwatching": "Przestaję obserwować...",
     "watcherrortext": "Wystąpił błąd podczas zmiany obecności „$1” na liście obserwowanych.",
-    "enotif_mailer": "Powiadomienie z {{GRAMMAR:D.lp|{{SITENAME}}}}",
     "enotif_reset": "Zaznacz wszystkie strony jako odwiedzone",
     "enotif_impersonal_salutation": "użytkownik {{GRAMMAR:D.lp|{{SITENAME}}}}",
     "enotif_subject_deleted": "Strona projektu {{SITENAME}} o nazwie $1 została usunięta przez {{gender:$2|$2}}",
     "excontent": "treść: „$1”",
     "excontentauthor": "treść: „$1” (jedyny autor: [[Special:Contributions/$2|$2]])",
     "exbeforeblank": "poprzednia zawartość, obecnie pustej strony: „$1”",
-    "exblank": "Strona była pusta",
     "delete-confirm": "Usuwanie „$1”",
     "delete-legend": "Usuń",
     "historywarning": "'''Uwaga!''' Strona, którą chcesz usunąć, ma w przybliżeniu {{PLURAL:$1|jedną starszą wersję|$1 starsze wersje|$1 starszych wersji}}:",
     "contributions-title": "Wkład {{GENDER:$1|użytkownika|użytkowniczki}} $1",
     "mycontris": "Edycje",
     "contribsub2": "Dla {{GENDER:$3|użytkownika|użytkowniczki}} $1 ($2)",
+    "contributions-userdoesnotexist": "Konto użytkownika „$1” nie jest zarejestrowane.",
     "nocontribs": "Brak zmian odpowiadających tym kryteriom.",
     "uctop": "(ostatnia)",
     "month": "Do miesiąca (włącznie)",
     "sp-contributions-newbies-sub": "Dla nowych użytkowników",
     "sp-contributions-newbies-title": "Wkład nowych użytkowników",
     "sp-contributions-blocklog": "blokady",
+    "sp-contributions-suppresslog": "stłumiony wkład użytkownika",
     "sp-contributions-deleted": "usunięty wkład użytkownika",
     "sp-contributions-uploads": "przesłane pliki",
     "sp-contributions-logs": "rejestry",
     "allmessagesname": "Nazwa",
     "allmessagesdefault": "Tekst domyślny",
     "allmessagescurrent": "Tekst obecny",
-    "allmessagestext": "Lista wszystkich komunikatów systemowych dostępnych w przestrzeni nazw MediaWiki.\nOdwiedź [https://www.mediawiki.org/wiki/Localisation Tłumaczenie MediaWiki] oraz [//translatewiki.net translatewiki.net], jeśli chcesz uczestniczyć w tłumaczeniu oprogramowania MediaWiki.",
+    "allmessagestext": "Lista wszystkich komunikatów systemowych dostępnych w przestrzeni nazw MediaWiki.\nOdwiedź [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation Tłumaczenie MediaWiki] oraz [//translatewiki.net translatewiki.net], jeśli chcesz uczestniczyć w tłumaczeniu oprogramowania MediaWiki.",
     "allmessagesnotsupportedDB": "Ta strona nie może być użyta, ponieważ zmienna '''$wgUseDatabaseMessages''' jest wyłączona.",
     "allmessages-filter-legend": "Filtr",
     "allmessages-filter": "Filtrowanie według stanu modyfikacji:",
     "importunknownsource": "Nieznany format importowanych danych",
     "importcantopen": "Nie można otworzyć importowanego pliku",
     "importbadinterwiki": "Błędny link interwiki",
-    "importnotext": "Brak tekstu lub zawartości",
     "importsuccess": "Import zakończony powodzeniem!",
-    "importhistoryconflict": "Wystąpił konflikt wersji (ta strona mogła zostać zaimportowana już wcześniej)",
     "importnosources": "Możliwość bezpośredniego importu historii została wyłączona, ponieważ nie zdefiniowano źródła.",
     "importnofile": "Importowany plik nie został przesłany.",
     "importuploaderrorsize": "Przesyłanie pliku importowanego zawiodło. Jest większy niż dopuszczalny rozmiar dla przesyłanych plików.",
     "pageinfo-firsttime": "Data utworzenia strony",
     "pageinfo-lastuser": "Autor ostatniej edycji",
     "pageinfo-lasttime": "Data ostatniej edycji",
-    "pageinfo-edits": "Liczba edycji",
+    "pageinfo-edits": "Całkowita liczba edycji",
     "pageinfo-authors": "Całkowita liczba autorów",
     "pageinfo-recent-edits": "Liczba ostatnich edycji (w przeciągu $1)",
     "pageinfo-recent-authors": "Liczba ostatnich autorów",
     "previousdiff": "← poprzednia edycja",
     "nextdiff": "następna edycja →",
     "mediawarning": "'''Uwaga!''' Plik w tym formacie może zawierać złośliwy kod.\nJeśli go otworzysz, możesz zarazić swój system.",
-    "imagemaxsize": "Ograniczenie wielkości obrazków<br />''(na stronach opisu plików)''",
+    "imagemaxsize": "Ograniczenie wielkości obrazków:<br /><em>(na stronach opisu plików)</em>",
     "thumbsize": "Rozmiar miniaturki",
     "widthheightpage": "$1 × $2, $3 {{PLURAL:$3|strona|strony|stron}}",
     "file-info": "rozmiar pliku: $1, typ MIME: $2",
     "redirect-revision": "Wersja strony",
     "redirect-file": "Nazwa pliku",
     "redirect-not-exists": "Nie znaleziono wartości",
-    "fileduplicatesearch": "Szukaj duplikatów pliku",
-    "fileduplicatesearch-summary": "Szukaj duplikatów pliku na podstawie wartości funkcji skrótu.",
+    "fileduplicatesearch": "Wyszukiwanie duplikatów pliku",
+    "fileduplicatesearch-summary": "Wyszukiwanie duplikatów pliku na podstawie wartości funkcji skrótu.",
     "fileduplicatesearch-legend": "Szukaj duplikatów pliku",
     "fileduplicatesearch-filename": "Nazwa pliku",
     "fileduplicatesearch-submit": "Szukaj",
index 90ce509..82a05b4 100644 (file)
@@ -11,7 +11,8 @@
             "Teak",
             "The Evil IP address",
             "Ævar Arnfjörð Bjarmason <avarab@gmail.com>, Jens Frank",
-            "לערי ריינהארט"
+            "לערי ריינהארט",
+            "Shirayuki"
         ]
     },
     "tog-underline": "Anliure con la sotliniadura",
     "permalink": "Anliura fissa",
     "print": "Stampé",
     "view": "Vardé",
+    "view-foreign": "Vëdde su $1",
     "edit": "Modifiché",
+    "edit-local": "Modifiché la descrission local",
     "create": "Creé",
+    "create-local": "Gionté na descrission local",
     "editthispage": "Modifiché costa pàgina",
     "create-this-page": "Creé sta pàgina",
     "delete": "Scancelé",
     "pool-timeout": "Ël temp a l'é finì antramentre ch'a së spetava la saradura",
     "pool-queuefull": "La coa ëd travaj a l'é pien-a",
     "pool-errorunknown": "Eror pa conossù",
+    "pool-servererror": "Ël servissi ëd conteur dl'arzerva a l'é nen disponìbil ($1).",
     "aboutsite": "A propòsit ëd {{SITENAME}}",
     "aboutpage": "Project:A propòsit",
     "copyright": "Ël contnù a resta disponìbil sota $1 gavà ch'a sia marcà an n'àutra manera.",
     "accountcreatedtext": "Ël cont utent për [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|ciaciarade]]) a l'é stàit creà.",
     "createaccount-title": "Creassion d'un cont për {{SITENAME}}",
     "createaccount-text": "Cheidun a l'ha duvertà un cont për soa adrëssa ëd pòsta eletrònica ansima a {{SITENAME}} ($4) butand da stranòm «$2» e da ciav «$3». A dovrìa rintré ant ël sistema e cambiesse soa ciav pì ampressa ch'a peul.\n\nSe sòn a l'é rivà për eror, a peul lassé perde e fé gnente sensa problema.",
-    "usernamehasherror": "Lë stranòm d'utent a peul pa conten-e dij caràter ciapulà",
     "login-throttled": "A l'ha fàit tròpi tentativ recent d'intré ant ël sistema.\nPër piasì, ch'a speta $1 prima ëd prové torna.",
     "login-abort-generic": "Sò tentitiv d'intré ant ël sistema a l'é falì - Abortì",
     "loginlanguagelabel": "Lenga: $1",
     "logdelete-selected": "{{PLURAL:$1|Event}} dël registr selessionà:",
     "revdelete-text-text": "Le revision ëscancelà a compariran ancora ant la stòria dla pàgina, ma na part ëd sò contnù a sarà inacessìbil al pùblich.",
     "revdelete-text-file": "Le version d'archivi scancelà a compariran ancora ant la stòria dj'archivi, ma na part ëd sò contnù a sarà inacessìbil al pùblich.",
+    "logdelete-text": "J'eveniment dl'argistr ëscancelà a compariran ancora ant j'argistr, ma na part ëd sò contnù a sarà inacessìbil al pùblich.",
+    "revdelete-text-others": "J'àutri aministrator ëd {{SITENAME}} a podran sempe acede al contù stërmà e a peulo ripristinelo torna con costa antërfassa, gavà ch'a sio definìe ëd restrission adissionaj.",
     "revdelete-confirm": "Për piasì, ch'a confema ch'a veul fé sòn, ch'as rend cont dle conseguense, e ch'a lo fa an acòrd con [[{{MediaWiki:Policy-url}}|le régole]].",
     "revdelete-suppress-text": "La scancelassion a dovrìa '''mach''' esse dovrà an costi cas:\n* Anformassion ch'a podrìo esse difamatòrie\n* Anformassion përsonaj inapropià\n*: ''adrësse ëd ca e nùmer ëd teléfon, còdes fiscaj, e via fòrt''",
     "revdelete-legend": "But-je coste limitassion-sì a le version scancelà:",
     "prefs-skin": "Facia",
     "skin-preview": "Preuva",
     "datedefault": "Franch l'istess",
-    "prefs-beta": "Caraterìstiche dla Beta",
-    "prefs-datetime": "Data e ora",
     "prefs-labs": "Caraterìstiche dël laboratòri",
     "prefs-user-pages": "Pàgine utent",
     "prefs-personal": "Profil dl'utent",
     "upload-permitted": "Sòrt d'archivi consentìe: $1.",
     "upload-preferred": "Sòrt d'archivi preferìe: $1.",
     "upload-prohibited": "Sòrt d'archivi proibìe: $1.",
-    "uploadlog": "Registr dij càrich",
     "uploadlogpage": "Registr dij càrich",
     "uploadlogpagetext": "Ambelessì-sota a-i é na lista dj'ùltim archivi carià.\nBeiché la [[Special:NewFiles|galarìa dj'archivi neuv]] për na presentassion pì visual.",
     "filename": "Nòm dl'archivi",
     "filereuploadsummary": "Modìfiche dl'archivi:",
     "filestatus": "Situassion dij drit d'autor:",
     "filesource": "Sorgiss:",
-    "uploadedfiles": "Archivi carià",
     "ignorewarning": "Lassé perde j'avis e salvé an tute le manere",
     "ignorewarnings": "Lassé perde j'avis",
     "minlength1": "Ij nòm ëd j'archivi a devo esse longh almanch un caràter.",
     "overwroteimage": "a l'ha carìa na version neuva ëd \"[[$1]]\"",
     "uploaddisabled": "Càrich blocà.",
     "copyuploaddisabled": "Ël càrich për mojen ëd n'adrëssa dl'aragnà a l'é disabilità.",
-    "uploadfromurl-queued": "Sò càrich a l'é stàit butà an coa.",
     "uploaddisabledtext": "La possibilità ëd carié dj'archivi a l'é staita disabilità.",
     "php-uploaddisabledtext": "Ij cariament d'archivi a son disabilità an PHP.\nPër piasì, ch'a controla l'ampostassion file_uploads.",
     "uploadscripted": "St'archivi-sì a l'ha andrinta chèich-còs (dël còdes HTML ò pura un senari) che a podrìa esse travajà mal da chèich programa ëd navigassion.",
     "upload-misc-error": "Eror nen identificà antramentr ch'as cariava",
     "upload-misc-error-text": "A l'é staie n'eror nen identificà dëmentrè ch'as cariava chèich-còs.\nPër piasì, ch'a varda che soa anliura a sia bon-a e che a rësponda e peuj ch'a preuva torna.\nSe a-i riva sossì n'àotra vira, ch'as buta an comunicassion con n'[[Special:ListUsers/sysop|aministrator]].",
     "upload-too-many-redirects": "L'adrëssa dl'aragnà a l'avìa tròpe ridiression",
-    "upload-unknown-size": "Dimension pa conossùa",
     "upload-http-error": "A l'é staje n'eror HTTP: $1.",
     "upload-copy-upload-invalid-domain": "Cariagi ëd cobie a l'é pa disponìbil da sto domini.",
     "backend-fail-stream": "A peul pa sequensialisé l'archivi $1.",
     "img-auth-streaming": "Letura an continuà ëd \"$1\".",
     "img-auth-public": "La funsion d'img_auth.php a l'é dë smone dj'archivi da na wiki privà.\nSta wiki-sì a l'é configurà com na wiki pùblica.\nPër na sicurëssa otimal, img_auth.php a l'é disabilità.",
     "img-auth-noread": "L'utent a l'ha pa ij privilegi për lese \"$1\".",
-    "img-auth-bad-query-string": "L'anliura a l'ha na stringa d'arcesta pa bon-a.",
     "http-invalid-url": "Adrëssa dl'aragnà pa bon-a: $1.",
     "http-invalid-scheme": "J'adrësse dl'aragnà con ël prefiss \"$1\" a son pa mantnùe.",
     "http-request-error": "L'arcesta Http a l'é falìa për n'eror pa conossù.",
     "filehist-dimensions": "Amzure",
     "filehist-filesize": "Amzure dl'archivi",
     "filehist-comment": "Coment",
-    "filehist-missing": "Archivi mancant",
     "imagelinks": "Usagi dl'archivi",
     "linkstoimage": "{{PLURAL:$1|La pàgina sì-sota a l'ha|Le $1 pàgine sì-sota a l'han}} andrinta dj'anliure a cost archivi:",
     "linkstoimage-more": "Pì che $1 {{PLURAL:$1|pàgina|pàgine}} a l'han dj'anliure a cost archivi.\nLa lista sì-sota a smon mach {{PLURAL:$1|la prima pàgina ch'a l'ha|le prime $1 pàgine ch'a l'han}} d'anliure a s'archivi.\nA l'é disponìbil na [[Special:WhatLinksHere/$2|lista completa]].",
     "download": "dëscarié",
     "unwatchedpages": "Pàgine che gnun a ten sot-euj",
     "listredirects": "Lista dle ridiression",
+    "listduplicatedfiles": "Lista d'archivi con duplicà",
+    "listduplicatedfiles-summary": "Costa a l'é na lista d'archivi pr'ij quaj la version pi recenta dl'archivi a l'é un duplicà dla version pi recenta ëd chèich àutr archivi. Mach j'archivi local a son considerà.",
+    "listduplicatedfiles-entry": "[[:File:$1|$1]] a l'ha [[$3|{{PLURAL:$2|un dobion|$2 dobion}}]].",
     "unusedtemplates": "Stamp nen dovrà",
     "unusedtemplatestext": "Sta pàgina-sì a la smon tute lë pàgine ant lë spassi nominal {{ns:template}} che a son pa dovrà andrinta a d'àutre pàgine.\nCh'as visa ëd controlé che në stamp a-j serva nen a dj'àutri stamp anans che fé che ranchelo via.",
     "unusedtemplateswlh": "àutre anliure",
     "listgrouprights-removegroup-self": "Gavé {{PLURAL:$2|la partìa|le partìe}} da sò cont: $1",
     "listgrouprights-addgroup-self-all": "Gionté tute le partìe a sò cont",
     "listgrouprights-removegroup-self-all": "Gavé tute le partìe da sò cont",
+    "listgrouprights-namespaceprotection-header": "Restrission dë spassi nominal",
+    "listgrouprights-namespaceprotection-namespace": "Spassi nominal",
+    "listgrouprights-namespaceprotection-restrictedto": "Drit ch'a permëtto a l'utent ëd modifiché",
+    "trackingcategories": "Categorìe ëd trassament",
+    "trackingcategories-summary": "Costa pàgina a lista le categorìe ëd trassament ch'a son ampinìe an automàtich dal programa MediaWiki. Ij sò nòm a peulo esse cangià an modificand ij mëssagi ëd sistema rëspondent ant lë spassi nominal {{ns:8}}.",
+    "trackingcategories-msg": "Categorìa ëd trassament",
+    "trackingcategories-name": "Nòm dël mëssagi",
+    "trackingcategories-desc": "Criteri d'anclusion dla categorìa",
+    "noindex-category-desc": "La pàgina a l'é pa trassà dai robò përchè a conten la paròla màgica <code><nowiki>__NOINDEX__</nowiki></code> andrinta e a l'é an në spassi nominal anté che cost marcagi a l'é autorisà.",
+    "index-category-desc": "La pàgina a conten un <code><nowiki>__INDEX__</nowiki></code> (e a l'é an në spassi nominal anté che ëd marcagi a l'é autorisà); a l'é donca trassà dai robò antant che ëd sòlit a lo sarìa nen.",
+    "post-expand-template-inclusion-category-desc": "Apress avèj dësvlupà tuti jë stamp, la taja dla pàgina a sorpassa <code>$wgMaxArticleSize</code>, donca chèich ëstamp a son nen ëstàit dësvlupà.",
+    "post-expand-template-argument-category-desc": "Apress avèj dësvlupà l'argoment ëd në stamp (cheicòs antra tripl agraf, tanme <code>{{{Foo}}}</code>), la pàgina a l'é pi gròssa che <code>$wgMaxArticleSize</code>.",
+    "expensive-parserfunction-category-desc": "Tròpe fonsion care ëd l'analisator (parèj ëd <code>#ifexist</code>) contnùe an na pàgina. Ch'a vëdda [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit Manual:$wgExpensiveParserFunctionLimit].",
     "mailnologin": "A-i é pa l'adrëssa për mandé ël mëssagi",
     "mailnologintext": "A dev [[Special:UserLogin|rintré ant ël sistema]]\ne avèj registrà n'adrëssa ëd pòsta eletrònica vàlida ant ij [[Special:Preferences|sò gust]] për podèj mandé dij mëssagi ëd pòsta eletrònica a j'àutri Utent.",
     "emailuser": "Mandeje un mëssagi eletrònich a st'utent-sì",
     "emailuser-title-notarget": "Mandeje un mëssagi ëd pòsta eletrònica a st'utent-sì",
     "emailpage": "Mandeje un mëssagi ëd pòsta eletrònica a st'utent-sì",
     "emailpagetext": "A peul dovré ël formolari sì-sota për mandé un mëssagi ëd pòsta eletrònica a st'{{GENDER:$1|utent}}-sì.\nL'adrëssa ëd pòsta eletrònica ch'a l'ha butà ant ij [[Special:Preferences|sò gust]] a sarà butà ant l'adrëssa «Da» ëd sò mëssagi, parèj chi ch'a l'arsèiv a podrà rësponde diretament a chiel.",
-    "usermailererror": "L'oget che a goèrna la pòsta eletrònica a l'ha dàit eror:",
     "defemailsubject": "Mëssagi da l'utent \"$1\"",
     "usermaildisabled": "Pòsta eletrònica dl'utent disabilità",
     "usermaildisabledtext": "A peul pa mandé ëd mëssagi ëd pòsta eletrònica a d'àutri utent ansima a costa wiki",
     "noemailtitle": "Gnun-a adrëssa ëd pòsta eletrònica",
     "noemailtext": "Cost utent-sì a l'ha pa spessificà n'adrëssa ëd pòsta eletrònica vàlida.",
-    "nowikiemailtitle": "Gnun mëssagi ëd pòsta eletrònica a l'é autorisà",
     "nowikiemailtext": "Cost utent a l'ha sërnù ëd nen arsèive dij mëssagi ëd pòsta eletrònica da j'àutri utent.",
     "emailnotarget": "Stranòm dël destinatari pa esistent o pa bon.",
     "emailtarget": "Ch'a anserissa lë stranòm dël destinatari",
     "nowatchlist": "A l'ha ancó pa marcà dj'artìcoj coma ròba da tnì sot-euj.",
     "watchlistanontext": "Për piasì, $1 për ës-ciairé ò pura modifiché j'element ëd soa lista dla ròba che as ten sot-euj.",
     "watchnologin": "A l'é ancó nen rintrà ant ël sistema",
-    "watchnologintext": "A l'ha da manca prima ëd tut ëd [[Special:UserLogin|rintré ant ël sistema]]\npër podèj modifiché soa lista dla ròba dë tnì sot-euj.",
     "addwatch": "Gionté a la lista ëd lòn ch'as ten sot-euj",
     "addedwatchtext": "La pàgina «[[:$1]]» a l'é staita giontà a soa [[Special:Watchlist|lista dla ròba da tnì sot-euj]].\nLe modìfiche che a-i saran ant costa pàgina-sì e ant soa pàgina ëd discussion a saran listà ambelessì.",
     "removewatch": "Gavé da la lista ëd lòn ch'as ten sot-euj",
     "watching": "Sot-euj...",
     "unwatching": "Ën gavand da lòn ch'as ten sot-euj...",
     "watcherrortext": "A l'é capitaje n'eror durant la modìfica ëd j'ampostassion ëd lòn ch'as ten sot-euj për «$1».",
-    "enotif_mailer": "{{SITENAME}} - Servissi ëd Notìfica Postal",
     "enotif_reset": "Marché tute le pàgine tanme visità",
     "enotif_impersonal_salutation": "utent ëd {{SITENAME}}",
     "enotif_subject_deleted": "La pàgina $1 ëd {{SITENAME}} a l'é stàita scancelà da {{gender:$2|$2}}",
     "excontent": "Ël contnù a l'era: '$1'",
     "excontentauthor": "ël contnù a l'era: «$1» (e l'ùnich contributor a l'era stàit «[[Special:Contributions/$2|$2]]»)",
     "exbeforeblank": "anans d'esse dësvujdà ël contnù a l'era: «$1»",
-    "exblank": "La pàgina a l'era veujda",
     "delete-confirm": "Scancelé «$1»",
     "delete-legend": "Scancelé",
     "historywarning": "'''Avis:''' La pàgina che a l'é antramentr che a scancela a l'ha na stòria con pi o men $1 {{PLURAL:$1|revision|revision}}:",
     "allmessagesname": "Nòm",
     "allmessagesdefault": "Test che a-i sarìa se a-i fusso pa 'd modìfiche",
     "allmessagescurrent": "Test corent",
-    "allmessagestext": "Costa-sì a l'é na lista dij mëssagi ëd sistema disponìbij ant lë spassi nominal MediaWiki.\nPër piasì, ch'a vìsita la [https://www.mediawiki.org/wiki/Localisation Localisassion ëd MediaWiki] e [//translatewiki.net translatewiki.net] se a veul contribuì a la localisassion general ëd MediaWiki.",
+    "allmessagestext": "Costa-sì a l'é na lista dij mëssagi ëd sistema disponìbij ant lë spassi nominal MediaWiki.\nPër piasì, ch'a vìsita la [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation Localisassion ëd MediaWiki] e [//translatewiki.net translatewiki.net] se a veul contribuì a la localisassion general ëd MediaWiki.",
     "allmessagesnotsupportedDB": "Sta pàgina-sì a peul pa esse dovrà përchè '''$wgUseDatabaseMessages''' a l'é stàit disabilità.",
     "allmessages-filter-legend": "Filtr",
     "allmessages-filter": "Filtré për stat ëd përsonalisassion:",
     "importunknownsource": "Sorgiss d'amportassion ëd na sòrt nen conossùa",
     "importcantopen": "L'archivi da amporté a l'é pa podusse deurbe",
     "importbadinterwiki": "Liura antra wiki diferente cioca",
-    "importnotext": "Veujd o con gnun test",
     "importsuccess": "Amportassion finìa!",
-    "importhistoryconflict": "A-i son dle stòrie dë sta pàgina-sì che as contradiso un-a con l'àutra (a peul esse che sta pàgina-sì a l'avèissa già amportala)",
     "importnosources": "A l'é pa stàita definìa gnun-a sorgiss d'amportassion da na wiki diferenta, e carié mach le stòrie as peul nen.",
     "importnofile": "Pa gnun archivi d'amportassion carià.",
     "importuploaderrorsize": "A l'é falìe la caria dl'archivi d'amporté. L'archivi a resta pì gròss che lòn ch'as peul cariesse.",
     "version-entrypoints": "Anliure dij pont d'intrada",
     "version-entrypoints-header-entrypoint": "Pont d'intrada",
     "version-entrypoints-header-url": "Adrëssa an sl'aragnà",
-    "version-entrypoints-articlepath": "[https://www.mediawiki.org/wiki/Manual:$wgArticlePath Senté d'artìcol]",
+    "version-entrypoints-articlepath": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgArticlePath Senté d'artìcol]",
     "redirect": "Ridirigiù da archivi, utent, pàgina o ID ëd revision",
     "redirect-legend": "Ridirige a n'archivi o na pàgina",
     "redirect-summary": "Costa pàgina special a ponta a n'archivi (dàit ël nòm dl'archivi), na pàgina (dàit n'ID ëd revision o n'ID ëd pàgina) o na pàgina d'utent (dàit n'identificativ numérich a l'utent). Usagi: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/revision/328429]], o [[{{#Special:Redirect}}/user/101]].",
index 82f68c9..3447c94 100644 (file)
     "prefs-skin": "چھاڑ",
     "skin-preview": "کچا کم",
     "datedefault": "خاص پسند نئیں",
-    "prefs-beta": "بیٹا فیچرز",
     "prefs-datetime": "تریح تے ویلہ",
     "prefs-labs": "لیبز فیچرز",
     "prefs-personal": "ورتن آلے دا پروفائل",
     "nowatchlist": "تھواڈی اکھ تھلے لسٹ چ کوئی شے نئیں۔",
     "watchlistanontext": "مہربانی کرکے $1 نوں ویکھو یا اپنی اکھ تھلے رکھی لسٹ نوں بدلو۔",
     "watchnologin": "لاگ ان نئیں ہوۓ او",
-    "watchnologintext": "توانوں لازمی [[Special:UserLogin|لاگان]] ہونا پووے گا اپنی اکھ تھلے رکھی لسٹ نوں بدلن لئی۔",
     "addwatch": "اکھ تھلے کرو",
     "addedwatchtext": "اے صفحہ \"[[:$1]] تواڈیاں اکھاں تھلے آگیا اے۔<br />\nمستقبل وچ اس صفحہ تے ایدے بارے چ گل بات نویاں تبدیلیاں وچ موٹے نظر آن گے تا کہ آسانی نال کھوجیا جا سکے۔",
     "removewatch": "اکھ تھلیوں ہٹاؤ",
     "allmessagesname": "ناں",
     "allmessagesdefault": "ڈیفالٹ لکھائی",
     "allmessagescurrent": "موجودہ لکھائی",
-    "allmessagestext": "ایہ لسٹ اے پربندھ سنیعیاں دی  جیہڑے میڈیاوکی دی ناں تھاں تے ہیگے نیں۔\nمہربانی کرکے [https://www.mediawiki.org/wiki/Localisation MediaWiki Localisation] تے [//translatewiki.net translatewiki.net] تے جاؤ۔\nاگر تسیں میڈیا وکی دے بولی وٹاندرے چ کم کرنا چاندے او۔",
+    "allmessagestext": "ایہ لسٹ اے پربندھ سنیعیاں دی  جیہڑے میڈیاوکی دی ناں تھاں تے ہیگے نیں۔\nمہربانی کرکے [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation MediaWiki Localisation] تے [//translatewiki.net translatewiki.net] تے جاؤ۔\nاگر تسیں میڈیا وکی دے بولی وٹاندرے چ کم کرنا چاندے او۔",
     "allmessagesnotsupportedDB": "اے صفہ نئیں ورتیا جاسکدا کیوں جے '''$wgUseDatabaseMessages''' روک دتا گیا اے۔",
     "allmessages-filter-legend": "فلٹر",
     "allmessages-filter": "کسٹمائزیشن سٹیٹ فلٹر ہوئي:",
index f3b7251..4c88b1b 100644 (file)
     "nowatchlist": "Twajā listi stēisan nadirītan pāusan ast pāustan.",
     "watchlistanontext": "Madli $1, kāi widālai elamēntans stesse listin stēisan nadirītan.",
     "watchnologin": "Ni assei engūbun",
-    "watchnologintext": "Tū turri būtwei[[Special:UserLogin|engūbun]], kāi kitawīdintun listin stēisan nadirītan.",
     "addedwatchtext": "Pāusan \"[[:$1]]\" pastāi preidātan prei twajjan [[Special:Watchlist|nadirītan listin]].\nEraīna šisse pāusas ēnturas kitawīdinsna anga diskusiōnis pāusas sēitan sen tennan kitawīdinsna wīrst būwusi enpeisātan en šissei listin. Pāusas tītels wīrst būwuns '''pastarīntan''' en [[Special:RecentChanges|listei stēisan panzdauman kitawīdinsnan]], kāi lānginlai ti endirītun kitawīdinsnan.",
     "removedwatchtext": "Pāusan \"[[:$1]]\" pastāi āupausintan iz [[Special:Watchlist|twajjan listin stēisan āupausintan]].",
     "watch": "Nadirēis",
     "allmessagesname": "Emmens",
     "allmessagesdefault": "Auprestamins teksts",
     "allmessagescurrent": "Bigānts teksts",
-    "allmessagestext": "Sta ast listi wisēisan waīstin preiēiminan en MediaWikis tītelin plattibin.\nMadli kāimalukeis [https://www.mediawiki.org/wiki/Localisation MediaWiki Localisation] be [//translatewiki.net translatewiki.net] ik tu kwaitēi delīkan īmtun en MediaWikis prōgraminin tulkausnai.",
+    "allmessagestext": "Sta ast listi wisēisan waīstin preiēiminan en MediaWikis tītelin plattibin.\nMadli kāimalukeis [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation MediaWiki Localisation] be [//translatewiki.net translatewiki.net] ik tu kwaitēi delīkan īmtun en MediaWikis prōgraminin tulkausnai.",
     "allmessagesnotsupportedDB": "Šī pāusan ni mazzi būtwei tērpautan, beggi wariābli '''$wgUseDatabaseMessages''' ast izklaūtan.",
     "allmessages-filter-legend": "Filtrīs",
     "allmessages-filter": "Filtrīs pa būsenin:",
index 721c400..9c5b3bd 100644 (file)
     "permalink": "تلپاتې تړنه",
     "print": "چاپ",
     "view": "کتل",
+    "view-foreign": "په $1 باندې کتل",
     "edit": "سمول",
+    "edit-local": "سيمه ايزې څرگندونې سمول",
     "create": "جوړول",
+    "create-local": "سيمه ايزې څرگندونې ورگډول",
     "editthispage": "همدا مخ سمول",
     "create-this-page": "همدا مخ ليکل",
     "delete": "ړنگول",
     "accountcreatedtext": "د [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|خبرې اترې]]) لپاره يو گڼون جوړ شو.",
     "createaccount-title": "د {{SITENAME}} د گڼون جوړېدنه",
     "createaccount-text": "يو چا د {{SITENAME}} په وېبځي ($4) کې ستاسې د برېښليک پتې لپاره د \"$2\" په نامه يو گڼون جوړ کړی چې پټنوم يې \"$3\" دی.\nتاسې بايد غونډال ته ورننوځۍ او همدا اوس خپل پټنوم بدل کړی.\n\nکه چېرته دا کړنه په تېروتنه کې شوی وي نو تاسې کولای شی چې دا پيغام بابېزه وگڼۍ.",
-    "usernamehasherror": "کارن-نوم نشي کېدلای چې کرښکې لوښې ولري",
     "login-throttled": "تاسې څو واره هڅه کړې چې غونډال ته ورننوځۍ.\nلطفاً د بيا هڅې نه مخکې $1 شېبې تم شۍ.",
     "login-abort-generic": "غونډال کې مو ننوتل نابريالی شو - ناڅاپي بند شو",
     "loginlanguagelabel": "ژبه: $1",
     "loginreqpagetext": "د نورو مخونو د کتلو لپاره تاسو بايد $1 وکړۍ.",
     "accmailtitle": "پټنوم ولېږل شو.",
     "newarticle": "(نوی)",
-    "newarticletext": "تاسې د يوې داسې تړنې څارنه کړې چې لا تر اوسه پورې نه شته.\nکه همدا مخ ليکل غواړۍ، نو په لانديني چوکاټ کې خپل متن وټاپۍ (د لا نورو مالوماتو لپاره د [$1 لارښود مخ] وگورۍ).\nکه چېرته تاسې دلته په تېروتنه راغلي ياست، نو يواځې د خپل د کتنمل '''مخ پر شا''' تڼۍ مو وټوکۍ.",
+    "newarticletext": "تاسې د يوې داسې تړنې څارنه کړې چې لا تر اوسه پورې نه شته.\nکه همدا مخ ليکل غواړۍ، نو په لانديني چوکاټ کې خپل متن وټاپئ (د لا نورو مالوماتو لپاره د [$1 لارښود مخ] وگورئ).\nکه چېرته تاسې دلته په تېروتنه راغلي ياست، نو يواځې د خپل د کتنمل '''مخ پر شا''' تڼۍ مو وټوکئ.",
     "anontalkpagetext": "----''دا د يوه ورکنومي کارن چې کارن-نوم نه لري او يا خپل کارن-نوم نه کاروي، د سکالو يوه پاڼه ده. نو د يوه کس د پېژندلو پخاطر موږ د هماغه کارن د انټرنېټ شمېره يا IP پته دلته ثبتوؤ. داسې يوه IP پته د ډېرو کارنانو لخوا هم کارېدلی شي. که تاسې يو ورکنومی کارن ياست او تاسې ته دا څرگندېږي چې تاسې ته نااړونده پېغامونه او تبصرې اشاره شوي، نو د نورو بې نومو کارنانو او ستاسې ترمېنځ د ټکنتوب د مخ نيونې لپاره لطفاً [[Special:UserLogin/signup|يو گڼون جوړ کړۍ]] او يا هم [[Special:UserLogin|غونډال ته ورننوځۍ]].''",
     "noarticletext": "دم مهال په دې مخ کې څه نشته.\nتاسې کولای شی چې په نورو مخونو کې [[Special:Search/{{PAGENAME}}|د دې مخ د سرليک پلټنه]] يا\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} د اړوندو يادښتونو پلټنه] وکړی.\nاو يا [{{fullurl:{{FULLPAGENAME}}|action=edit}} همدا مخ سم کړی]</span>.",
     "noarticletext-nopermission": "دم مهال په دې مخ کې متن نشته.\nتاسې کولای شی چې [[Special:Search/{{PAGENAME}}|همدا سرليک په نورو مخونو کې وپلټۍ]], يا هم <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} اړونده يادښتونه وپلټۍ]</span>، خو تاسې د دې مخ د جوړولو اجازه نه لرۍ.",
     "prefs-skin": "پوښۍ",
     "skin-preview": "مخکتنه",
     "datedefault": "هېڅ نه ټاکل",
-    "prefs-beta": "د آزمېښتي بڼې ځانگړنې",
-    "prefs-datetime": "نېټه او وخت",
     "prefs-labs": "د آزمېښتون ځانگړنې",
     "prefs-user-pages": "کارن مخونه",
     "prefs-personal": "د کارن پېژنليک",
     "upload-permitted": "د پرېښودلو دوتنو ډولونه: $1.",
     "upload-preferred": "د غوره دوتنو ډولونه: $1.",
     "upload-prohibited": "د منع شويو دوتنو ډولونه: $1.",
-    "uploadlog": "د پورته شويو دوتنو يادښت",
     "uploadlogpage": "د پورته شويو دوتنو يادښت",
     "uploadlogpagetext": "دا لاندې د نوو پورته شوو دوتنو لړليک دی.",
     "filename": "د دوتنې نوم",
     "filereuploadsummary": "د دوتنې بدلونونه:",
     "filestatus": "د رښتو دريځ:",
     "filesource": "سرچينه:",
-    "uploadedfiles": "پورته شوې دوتنې",
     "ignorewarning": "گواښنه بې پامه گڼل او دوتنه خوندي کول",
     "ignorewarnings": "هر ډول ګواښونه له پامه غورځول",
     "minlength1": "پکار ده چې د دوتنو نومونه لږ تر لږه يو حرف ولري.",
     "upload-warning-subj": "د پورته کولو ګواښ",
     "upload-proto-error": "ناسم پروتوکول",
     "upload-file-error": "کورنۍ ستونزه",
-    "upload-unknown-size": "ناڅرګنده کچه",
     "upload-http-error": "د HTTP يوه ستونزه رامېنځ ته شوې: $1",
     "backend-fail-notexists": "د $1 په نوم دوتنه نشته.",
     "backend-fail-delete": "د \"$1\" دوتنه ړنګه نه شوه.",
     "filehist-dimensions": "ډډې",
     "filehist-filesize": "د دوتنې کچه",
     "filehist-comment": "تبصره",
-    "filehist-missing": "دوتنه ورکه ده",
     "imagelinks": "د دوتنې کارېدنه",
     "linkstoimage": "دا {{PLURAL:$1|لاندينی مخ|$1 لانديني مخونه}} د همدې دوتنې سره تړنې لري:",
     "nolinkstoimage": "داسې هېڅ کوم مخ نه شته چې د دغې دوتنې سره تړنې ولري.",
     "listgrouprights-removegroup-self": "خپل گڼون نه د {{PLURAL:$2|ډله|ډلې}} ليري کول: $1",
     "listgrouprights-addgroup-self-all": "خپل گڼون کې ټولې ډلې ورگډول",
     "listgrouprights-removegroup-self-all": "خپل گڼون نه ټولې ډلې ليري کول",
+    "listgrouprights-namespaceprotection-namespace": "نوم-تشيال",
+    "trackingcategories-name": "پيغام نوم",
     "mailnologin": "د لېږلو پته نشته",
     "emailuser": "کارن ته برېښليک لېږل",
     "emailuser-title-target": "دې {{GENDER:$1|کارن}} ته برېښليک لېږل",
     "usermaildisabled": "د کارن برېښليک ناچارند دی",
     "usermaildisabledtext": "په دې ويکي تاسې نورو کارنانو ته برېښليک نه شی ورلېږلی",
     "noemailtitle": "هېڅ کومه برېښليک پته نشته.",
-    "nowikiemailtitle": "د برېښليک لېږلو اجازه نشته",
     "nowikiemailtext": "دې کارن د نورو کارنانو لخوا د برېښليک د نه ترلاسه کولو چاره خوښه کړې.",
     "emailtarget": "د ترلاسه کوونکي کارن-نوم وټاپۍ",
     "emailusername": "کارن-نوم:",
     "nowatchlist": "ستاسې کتنلړ کې څه نه شته.",
     "watchlistanontext": "د خپل کتنلړ د توکو د سمولو او کتلو لپاره $1 ترسره کړۍ.",
     "watchnologin": "غونډال کې نه ياست ننوتي.",
-    "watchnologintext": "ددې لپاره چې خپل کتنلړ کې بدلون راولی نو تاسو ته پکار ده چې لومړی غونډال کې [[Special:UserLogin|ورننوځۍ]].",
     "addwatch": "کتنلړ کې ورگډول",
     "addedwatchtext": "د \"[[:$1]]\" په نوم يو مخ ستاسې [[Special:Watchlist|کتنلړ]] کې ورگډ شو.\nپه راتلونکې کې چې په دغه مخ او د دې د خبرواترو مخ کې کوم بدلونونه راځي نو هغه به ستاسې کتنلړ کې ښکاري.",
     "removewatch": "له کتنلړ نه غورځول",
     "unwatch": "نه کتل",
     "unwatchthispage": "څارنې په ټپه درول",
     "notanarticle": "يو منځپانګيز مخ نه دی",
-    "watchlist-details": "ستاسې کتنلړ کې {{PLURAL:$1|$1 مخ دی|$1 مخونه دي}}، د خبرو اترو مخونه مو پکې نه دي شمېرلي.",
+    "watchlist-details": "ستاسې کتنلړ کې {{PLURAL:$1|$1 مخ دی|$1 مخونه دي}}، د خبرو اترو مخونه مو بېل نه دي شمېرلي.",
     "wlheader-enotif": "برېښليک خبرونه چارنه شوې.",
     "wlheader-showupdated": "هغه مخونه چې ستاسې د کتلو نه وروسته بدلون موندلی په '''روڼ''' ليک په نښه شوي.",
     "watchlistcontains": "ستاسې کتنلړ $1 {{PLURAL:$1|مخ|مخونه}} لري.",
     "watchlist-options": "د کتنلړ خوښنې",
     "watching": "د کتلو په حال کې...",
     "unwatching": "د نه کتلو په حال کې...",
-    "enotif_mailer": "د {{SITENAME}} خبرتيايي برېښليک",
     "enotif_reset": "ټول مخونه کتل شوي نخښه کول",
     "enotif_impersonal_salutation": "{{SITENAME}} کارن",
     "enotif_subject_deleted": "د {{SITENAME}} مخ $1 د {{gender:$2|$2}} لخوا ړنگ شوی",
     "confirm": "تاييد",
     "excontent": "د مخ مېنځپانگه دا وه: \"$1\"",
     "excontentauthor": "د مخ مېنځپانگه دا وه: \"$1\" (او يواځينی ونډه وال \"[[Special:Contributions/$2|$2]]\" وه)",
-    "exblank": "مخ تش وه",
     "delete-confirm": "\"$1\" ړنگول",
     "delete-legend": "ړنگول",
     "historywarning": "گواښنه:''' دا مخ چې تاسې يې د ړنگېدو تکل لرئ نژدې $1 {{PLURAL:$1|بڼه|بڼې}} پېښليک لري:",
     "delete-edit-reasonlist": "د ړنگولو سببونه سمول",
     "rollback_short": "په شابېول",
     "rollbacklink": "په شابېول",
+    "rollbacklinkcount": "$1 {{PLURAL:$1|سمون|سمونونه}} پرشابېول",
     "protectlogpage": "د ژغورنې يادښت",
     "protectedarticle": "\"[[$1]]\" وژغورل شو",
     "modifiedarticleprotection": "د \"[[$1]]\" لپاره د ژغورنې کچه بدله شوه",
     "allmessagesname": "نوم",
     "allmessagesdefault": "تلواليزه پيغام متن",
     "allmessagescurrent": "اوسنی پيغام متن",
-    "allmessagestext": "دا د مېډياويکي په نوم-تشيال کې د غونډال د پيغامونو لړليک دی.\nکه چېرته تاسې د ميډياويکي په ځايتابه کې ونډې ترسره کول غواړۍ نو لطفاً [https://www.mediawiki.org/wiki/Localisation د ميډياويکي ځايتابه] او [//translatewiki.net translatewiki.net] څخه ليدنه وکړۍ.",
+    "allmessagestext": "دا د مېډياويکي په نوم-تشيال کې د غونډال د پيغامونو لړليک دی.\nکه چېرته تاسې د ميډياويکي په ځايتابه کې ونډې ترسره کول غواړۍ نو لطفاً [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation د ميډياويکي ځايتابه] او [//translatewiki.net translatewiki.net] څخه ليدنه وکړۍ.",
     "allmessagesnotsupportedDB": "'''Special:Allmessages''' ترېنه کار نه اخيستل کېږي ځکه چې '''$wgUseDatabaseMessages''' مړ دی.",
     "allmessages-filter-legend": "چاڼگر",
     "allmessages-filter-unmodified": "نابدلېدلي",
     "import-upload-filename": "د دوتنې نوم:",
     "import-comment": "تبصره:",
     "import-revision-count": "$1 {{PLURAL:$1|بڼه|بڼې}}",
-    "importnotext": "تش او يا بې متنه مخ",
     "importlogpage": "د واردولو يادښت",
     "import-logentry-upload-detail": "$1 {{PLURAL:$1|بڼه|بڼې}}",
     "javascripttest": "د جاوا سکرېپټ آزمېښت",
     "tooltip-watchlistedit-normal-submit": "سرليکونه غورځول",
     "tooltip-watchlistedit-raw-submit": "کتنلړ اوسمهالول",
     "tooltip-upload": "د پورته کولو پيل",
-    "tooltip-rollback": "Ù¾Ù\87 Ù\87Ù\85دÛ\90 Ù\85Ø® Ú©Û\90 \"Ù¾Ù\87 Ø´Ø§Ø¨Û\90Ù\88Ù\84\" Ø¯ Ù\88رÙ\88ستÙ\86Ù\8a Ù\88Ù\86Ú\89Ù\88اÙ\84 Ø³Ù\85Ù\88Ù\86 (سÙ\85Ù\88Ù\86Ù\88Ù\86Ù\87) Ù¾Ù\87 Ù\8aÙ\88Ù\87 Ú©Ù\84Û\90Ú© Ù¾Ù\87 Ú\85Ù¼ Ù\88رګرځوي.",
+    "tooltip-rollback": "Ù¾Ù\87 Ù\87Ù\85دÛ\90 Ù\85Ø® Ú©Û\90 \"Ù¾Ù\87 Ø´Ø§Ø¨Û\90Ù\88Ù\84\" Ø¯ Ù\88رÙ\88ستÙ\86Ù\8a Ù\88Ù\86Ú\89Ù\88اÙ\84 Ø³Ù\85Ù\88Ù\86 (سÙ\85Ù\88Ù\86Ù\88Ù\86Ù\87) Ù¾Ù\87 Ù\8aÙ\88Ù\87 Ú©Ù\84Û\90Ú© Ù¾Ù\87 Ú\85Ù¼ Ù\88رگرځوي.",
     "tooltip-undo": "\"ناکړ\" همدا سمون پر شا گرځوي او د سمون کړکۍ د مخکتنې په بڼه پرانيزي.\nدا کړنه د لنډيز په برخه کې د سمونونو د سببونو د ورگډولو آسانتيا برابروي.",
     "tooltip-preferences-save": "غوره توبونه خوندي کول",
     "tooltip-summary": "يو لنډ لنډيز کښل",
     "expand_templates_input": "ځايونکی متن:",
     "expand_templates_output": "پايله",
     "expand_templates_ok": "ښه",
+    "expand_templates_remove_nowiki": "په پايلو کې د <nowiki> نښلنونه ځپل",
+    "expand_templates_generate_rawhtml": "خام HTML ښکاره کول",
     "expand_templates_preview": "مخکتنه"
 }
index de885b2..a9905f0 100644 (file)
@@ -69,7 +69,8 @@
             "Waldir",
             "Yves Marques Junqueira",
             "לערי ריינהארט",
-            "555"
+            "555",
+            "Fabsouza1"
         ]
     },
     "tog-underline": "Sublinhar links:",
     "print": "Imprimir",
     "view": "Ver",
     "edit": "Editar",
+    "edit-local": "Editar descrição local",
     "create": "Criar",
+    "create-local": "Adicionar descrição local",
     "editthispage": "Editar esta página",
     "create-this-page": "Iniciar esta página",
     "delete": "Eliminar",
     "pool-timeout": "Tempo limite de espera para o bloqueio excedido",
     "pool-queuefull": "A fila de processos está cheia",
     "pool-errorunknown": "Erro desconhecido",
+    "pool-servererror": "O servidor de contador do pool não está disponível ($1).",
     "aboutsite": "Sobre {{SITENAME}}",
     "aboutpage": "Project:Sobre",
     "copyright": "Conteúdo disponível sob $1, salvo indicação em contrário.",
     "gotaccountlink": "Autenticar-se",
     "userlogin-resetlink": "Esqueceu-se do seu nome de usuário ou da senha?",
     "userlogin-resetpassword-link": "Esqueceu sua senha?",
+    "userlogin-helplink2": "Ajuda com o login",
     "userlogin-loggedin": "Você já está conectado como {{GENDER:$1|$1}}.\nUse o formulário abaixo para iniciar sessão como outro usuário.",
     "userlogin-createanother": "Crie uma outra conta",
     "createacct-join": "Insira suas informações abaixo.",
     "accountcreatedtext": "A conta de usuário para [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|talk]]) foi criada.",
     "createaccount-title": "Criação de conta em {{SITENAME}}",
     "createaccount-text": "Alguém criou uma conta de nome $2 para o seu endereço de email no wiki {{SITENAME}} ($4), tendo como senha \"$3\".\nVocê deve se autenticar e alterar sua senha.\n\nIgnore esta mensagem caso a conta tenha sido criada por engano.",
-    "usernamehasherror": "Nome de usuário não pode conter o símbolo de cardinal (#).",
     "login-throttled": "Você recentemente tentou iniciar sessão muitas vezes.\nPor favor aguarde $1 antes de tentar novamente.",
     "login-abort-generic": "A sua autenticação não teve êxito - Abortada",
     "loginlanguagelabel": "Idioma: $1",
     "resetpass-abort-generic": "Uma extensão cancelou a alteração da senha.",
     "resetpass-expired": "Sua senha expirou. Por favor insira uma nova senha para autenticar-se.",
     "resetpass-expired-soft": "Sua senha expirou e necessita ser resetada. Por favor escolha uma nova agora, ou clique \"{{int:resetpass-submit-cancel}}\" para resetar mais tarde.",
+    "resetpass-validity-soft": "Sua senha não é válida: $1\n\nPor favor escolha uma nova senha agora, ou clique \"{{int:resetpass-submit-cancel}}\" para redefini-la mais tarde.",
     "passwordreset": "Redefinir senha",
     "passwordreset-text-one": "Complete este formulário para trocar sua senha.",
     "passwordreset-text-many": "{{PLURAL:$1|Preencha um dos campos para trocar sua senha.}}",
     "accmailtitle": "Senha enviada.",
     "accmailtext": "Uma senha gerada aleatoriamente para [[User talk:$1|$1]] foi enviada para $2.\n\nEla pode ser alterada na página ''[[Special:ChangePassword|de troca de senha]]'', após o início de sessão.",
     "newarticle": "(Nova)",
-    "newarticletext": "Você seguiu um link para uma página que ainda não existe.\nPara criá-la, comece escrevendo na caixa abaixo (veja [$1 na página de ajuda] para mais informações).\nSe você chegou aqui por engano, clique no botão '''voltar''' do seu navegador.",
+    "newarticletext": "Você seguiu um link para uma página que ainda não existe.\nPara criá-la, comece escrevendo na caixa abaixo (veja [$1 a página de ajuda] para mais informações).\nSe você chegou aqui por engano, clique no botão '''voltar''' do seu navegador.",
     "anontalkpagetext": "---- ''Esta é a página de discussão para um usuário anônimo que ainda não criou uma conta ou que não a usa, de forma que temos de utilizar o endereço de IP para identificá-lo(a). Tal endereço de IP pode ser compartilhado por vários usuários. Se você é um usuário anônimo e acha que comentários irrelevantes foram direcionados a você, por gentileza, [[Special:UserLogin/signup|crie uma conta]] ou [[Special:UserLogin|autentique-se]], a fim de evitar futuras confusões com outros usuários anônimos.''",
     "noarticletext": "No momento, não há conteúdo nesta página.\nVocê pode [[Special:Search/{{PAGENAME}}|pesquisar pelo título desta página]] em outras páginas, <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} buscar por registros relacionados],\nou [{{fullurl:{{FULLPAGENAME}}|action=edit}} criar esta página]</span>.",
     "noarticletext-nopermission": "No momento, não há conteúdo nesta página\nVocê pode [[Special:Search/{{PAGENAME}}|pesquisar pelo título desta página]] em outras páginas,\nou <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} buscar por registros relacionados] </span>. Note que, no entanto, você não tem permissão para criar esta página.",
     "revdelete-no-file": "O arquivo especificado não existe.",
     "revdelete-show-file-confirm": "Tem a certeza de que quer visualizar uma revisão eliminada do arquivo \"<nowiki>$1</nowiki>\" de $2 em $3?",
     "revdelete-show-file-submit": "Sim",
+    "revdelete-selected-text": "'''{{PLURAL:$1|Revisão selecionada|Revisões selecionadas}} de [[:$1]]:'''",
+    "revdelete-selected-file": "{{PLURAL:$1|Versão do arquivo selecionado|Versões do arquivo selecionado}} of [[:$2]]:",
     "logdelete-selected": "{{PLURAL:$1|Evento de registro selecionado|Eventos de registro selecionados}}:",
     "revdelete-text-text": "Revisões apagadas continuarão a aparecer na página de histórico, mas parte de seus conteúdos estarão inacessíveis ao público.",
     "revdelete-text-file": "Versões dos arquivos apagados continuarão a aparecer no arquivo de histórico, mas parte de seus conteúdos estarão inacessíveis ao público.",
     "prefs-skin": "Tema",
     "skin-preview": "Pré-visualização",
     "datedefault": "Sem preferência",
-    "prefs-beta": "Características beta",
-    "prefs-datetime": "Data e hora",
     "prefs-labs": "Características de laboratório",
     "prefs-user-pages": "Páginas de usuário",
     "prefs-personal": "Dados do usuário",
     "upload-permitted": "Tipos de arquivos permitidos: $1.",
     "upload-preferred": "Tipos de arquivos preferidos: $1.",
     "upload-prohibited": "Tipos de arquivo proibidos: $1.",
-    "uploadlog": "registro de uploads",
     "uploadlogpage": "Registro de uploads",
     "uploadlogpagetext": "Segue listagem dos uploads de arquivos mais recentes.\nA [[Special:NewFiles|galeria de arquivos novos]] oferece uma listagem mais visual.",
     "filename": "Nome do arquivo",
     "filereuploadsummary": "Alterações no arquivo:",
     "filestatus": "Status dos direitos autorais:",
     "filesource": "Fonte:",
-    "uploadedfiles": "Arquivos enviados",
     "ignorewarning": "Ignorar aviso e salvar mesmo assim.",
     "ignorewarnings": "Ignorar todos os avisos",
     "minlength1": "Os nomes de arquivos precisam ter pelo menos uma letra.",
     "overwroteimage": "enviou uma nova versão de \"[[$1]]\"",
     "uploaddisabled": "Envio de arquivos desativado.",
     "copyuploaddisabled": "O upload por URL encontra-se desativado.",
-    "uploadfromurl-queued": "O seu upload foi adicionado à fila.",
     "uploaddisabledtext": "O envio de arquivos encontra-se desativado.",
     "php-uploaddisabledtext": "O envio de arquivos via PHP está desativado.\nVerifique a configuração file_uploads.",
     "uploadscripted": "Este arquivo contém HTML ou código que pode ser erroneamente interpretado por um navegador web.",
     "upload-misc-error": "Erro desconhecido ao enviar",
     "upload-misc-error-text": "Ocorreu um erro desconhecido durante o envio.\nVerifique se o endereço (URL) é válido e acessível e tente novamente.\nCaso o problema persista, procure um [[Special:ListUsers/sysop|administrador]].",
     "upload-too-many-redirects": "A URL contém redirecionamentos demais",
-    "upload-unknown-size": "Tamanho desconhecido",
     "upload-http-error": "Ocorreu um erro HTTP: $1",
     "upload-copy-upload-invalid-domain": "Não é possível realizar envios remotos neste domínio.",
     "backend-fail-stream": "Não foi possível transmitir o arquivo  $1.",
     "img-auth-streaming": "Realizando ''streaming'' de \"$1\".",
     "img-auth-public": "A img_auth.php produz arquivos a partir de um wiki privado.\nEste wiki está configurado como um wiki público.\nPara melhor segurança, o img_auth.php está desativado.",
     "img-auth-noread": "Usuário não tem acesso para ler \"$1\".",
-    "img-auth-bad-query-string": "A URL tem um texto de consulta inválido.",
     "http-invalid-url": "URL inválida: $1",
     "http-invalid-scheme": "URLs que iniciam com o prefixo \"$1\" não são aceitas.",
     "http-request-error": "A requisição HTTP falhou devido a um erro desconhecido.",
     "filehist-dimensions": "Dimensões",
     "filehist-filesize": "Tamanho do arquivo",
     "filehist-comment": "Comentário",
-    "filehist-missing": "Arquivo faltando",
     "imagelinks": "Uso do arquivo",
     "linkstoimage": "{{PLURAL:$1|A página|As $1 páginas}} a seguir tem link para este arquivo:",
     "linkstoimage-more": "Mais de $1 {{PLURAL:$1|página|páginas}} tem algum link para este arquivo.\nA lista a seguir mostra apenas {{PLURAL:$1|o primeiro link|os $1 primeiros links}} para este arquivo.\nUma [[Special:WhatLinksHere/$2|listagem completa]] está disponível.",
     "download": "download",
     "unwatchedpages": "Páginas não vigiadas",
     "listredirects": "Listar redirecionamentos",
+    "listduplicatedfiles": "Lista de arquivos com duplicatas",
+    "listduplicatedfiles-summary": "Esta é uma lista de arquivos, onde a versão mais recente do arquivo é uma duplicata da versão mais recente de algum outro arquivo. Somente os arquivos locais são considerados.",
+    "listduplicatedfiles-entry": "O arquivo [[:File:$1|$1]] tem [[$3|{{PLURAL:$2|uma duplicata|$2 duplicatas}}]].",
     "unusedtemplates": "Predefinições não utilizadas",
     "unusedtemplatestext": "Esta página lista todas as páginas no espaço nominal {{ns:template}} que não estão incluídas em uma outra página. Lembre-se de conferir se há outros links para as predefinições antes de apaga-las.",
     "unusedtemplateswlh": "outros links",
     "protectedpages-unknown-timestamp": "Desconhecido",
     "protectedpages-unknown-performer": "Usuário desconhecido",
     "protectedtitles": "Títulos protegidos",
-    "protectedtitles-summary": "Está página lista os títulos já protegidos de criação. Para ver a lista de páginas existentes que estão protegidas, consulte [[{{#special:ProtectedPages}}|{{int:protectedpages}}]].",
+    "protectedtitles-summary": "Está página lista os títulos já protegidos desde a criação. Para ver a lista de páginas existentes que estão protegidas, consulte [[{{#special:ProtectedPages}}|{{int:protectedpages}}]].",
     "protectedtitlesempty": "Neste momento, nenhum dos títulos está protegido com estes parâmetros.",
     "listusers": "Lista de usuários",
     "listusers-editsonly": "Mostrar apenas usuários com edições",
     "listgrouprights-removegroup-self": "Pode remover {{PLURAL:$2|grupo|grupos}} da própria conta: $1",
     "listgrouprights-addgroup-self-all": "Pode adicionar todos os grupos à própria conta",
     "listgrouprights-removegroup-self-all": "Pode remover todos os grupos da própria conta",
+    "trackingcategories": "Monitorando categorias",
     "mailnologin": "Nenhum endereço de envio",
     "mailnologintext": "Necessita de estar [[Special:UserLogin|autenticado]] e de possuir um endereço de e-mail válido nas suas [[Special:Preferences|preferências]] para poder enviar um e-mail a outros usuários.",
     "emailuser": "Enviar-lhe um e-mail",
     "emailuser-title-notarget": "Enviar e-mail",
     "emailpage": "Contactar usuário",
     "emailpagetext": "Você pode usar o formulário a seguir para enviar um e-mail para {{GENDER:$1|este usuário|esta usuária}}.\nO endereço de e-mail que você inseriu em [[Special:Preferences|suas preferências de usuário]] irá aparecer como o endereço do remetente da mensagem, com o destinatário podendo responder diretamente para você.",
-    "usermailererror": "Erro no email:",
     "defemailsubject": "E-mail do usuário \"$1\" da {{SITENAME}}",
     "usermaildisabled": "O e-mail do usuário foi desativado",
     "usermaildisabledtext": "Você não tem como enviar e-mails a outros usuários deste wiki.",
     "noemailtitle": "Sem endereço de e-mail",
     "noemailtext": "Este usuário não especificou um endereço de e-mail válido.",
-    "nowikiemailtitle": "E-mail não permitido",
     "nowikiemailtext": "Este usuário optou por não receber e-mail de outros usuários.",
     "emailnotarget": "O nome do destinatário não existe ou é inválido.",
     "emailtarget": "Insira o nome de usuário do destinatário",
     "nowatchlist": "A sua lista de páginas vigiadas não possui títulos.",
     "watchlistanontext": "Por favor $1 para ver ou editar os itens na sua lista de páginas vigiadas.",
     "watchnologin": "Não está autenticado",
-    "watchnologintext": "Você precisa estar [[Special:UserLogin|autenticado]] para modificar a sua lista de páginas vigiadas.",
     "addwatch": "Adicionar às páginas vigiadas",
     "addedwatchtext": "A página \"[[:$1]]\" foi adicionada à sua [[Special:Watchlist|lista de páginas vigiadas]].\nFuturas modificações em tal página e páginas de discussão relacionadas serão listadas lá.",
     "removewatch": "Remover das páginas vigiadas",
     "watching": "Vigiando...",
     "unwatching": "Deixando de vigiar...",
     "watcherrortext": "Ocorreu um erro ao alterar a configuração da sua lista de páginas vigiadas para \"$1\".",
-    "enotif_mailer": "{{SITENAME}} Email de Notificação",
     "enotif_reset": "Marcar todas páginas como visitadas",
     "enotif_impersonal_salutation": "Usuário do projeto \"{{SITENAME}}\"",
     "enotif_subject_deleted": "A página $1 da {{SITENAME}} foi eliminada por {{gender:$2|$2}}",
     "excontent": "o conteúdo era: '$1'",
     "excontentauthor": "o conteúdo era: \"$1\" (e o único editor era \"[[Special:Contributions/$2|$2]]\")",
     "exbeforeblank": "o conteúdo antes de esvaziar era: '$1'",
-    "exblank": "página esvaziada",
     "delete-confirm": "Eliminar \"$1\"",
     "delete-legend": "Eliminar",
     "historywarning": "'''Atenção:''' A página que você está prestes a eliminar possui um histórico com aproximadamente $1 {{PLURAL:$1|revisão|revisões}}:",
     "sp-contributions-newbies-sub": "Para contas novas",
     "sp-contributions-newbies-title": "Contribuições de contas novas",
     "sp-contributions-blocklog": "registro de bloqueios",
+    "sp-contributions-suppresslog": "Contribuições de usuário suprimidas",
     "sp-contributions-deleted": "contribuições eliminadas",
     "sp-contributions-uploads": "envios",
     "sp-contributions-logs": "registros",
     "sp-contributions-blocked-notice": "Este usuário atualmente está bloqueado. O registro de bloqueio mais recente é fornecido abaixo para referência:",
     "sp-contributions-blocked-notice-anon": "Este endereço IP encontra-se bloqueado.\nSegue, para referência, a entrada mais recente no registro de bloqueios:",
     "sp-contributions-search": "Navegar pelas contribuições",
-    "sp-contributions-suppresslog": "Contribuições de usuário suprimidas",
     "sp-contributions-username": "Endereço de IP ou usuário:",
     "sp-contributions-toponly": "Mostrar somente as edições que sejam a última alteração",
     "sp-contributions-newonly": "Mostre somente as edições que criaram uma nova página.",
     "allmessagesname": "Nome",
     "allmessagesdefault": "Texto padrão",
     "allmessagescurrent": "Texto atual",
-    "allmessagestext": "Esta é uma lista de todas as mensagens de sistema disponíveis no espaço nominal {{ns:mediawiki}}.\nAcesse [https://www.mediawiki.org/wiki/Localisation MediaWiki Localisation] e [//translatewiki.net translatewiki.net] caso deseje contribuir para traduções do MediaWiki feitas para uso geral.",
+    "allmessagestext": "Esta é uma lista de todas as mensagens de sistema disponíveis no espaço nominal {{ns:mediawiki}}.\nAcesse [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation MediaWiki Localisation] e [//translatewiki.net translatewiki.net] caso deseje contribuir para traduções do MediaWiki feitas para uso geral.",
     "allmessagesnotsupportedDB": "Esta página não pode ser utilizada, uma vez que '''$wgUseDatabaseMessages''' foi desativado.",
     "allmessages-filter-legend": "Filtro",
     "allmessages-filter": "Filtrar por estado de personalização:",
     "importunknownsource": "Tipo de fonte de importação desconhecida",
     "importcantopen": "Não foi possível abrir o arquivo de importação",
     "importbadinterwiki": "Ligação de interwiki incorreta",
-    "importnotext": "Vazio ou sem texto",
     "importsuccess": "Importação completa!",
-    "importhistoryconflict": "Existem conflitos de edições no histórico (talvez esta página já foi importada antes)",
     "importnosources": "Não foram definidas fontes de importação transwiki e o carregamento direto de históricos encontra-se desativado.",
     "importnofile": "Nenhum arquivo de importação foi carregado.",
     "importuploaderrorsize": "O envio do arquivo a ser importado falhou. O arquivo é maior do que o tamanho máximo permitido para upload.",
index bd9e642..564ffe2 100644 (file)
     "permalink": "Ligação permanente",
     "print": "Imprimir",
     "view": "Ver",
+    "view-foreign": "Ver em $1",
     "edit": "Editar",
+    "edit-local": "Editar descrição local",
     "create": "Criar",
     "editthispage": "Editar esta página",
     "create-this-page": "Criar esta página",
     "accountcreatedtext": "A conta de utilizador para [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|talk]]) foi criada.",
     "createaccount-title": "Criação de conta na {{SITENAME}}",
     "createaccount-text": "Alguém criou uma conta com o nome $2 para o seu endereço de correio eletrónico, na wiki {{SITENAME}} ($4), com a palavra-chave \"$3\".\nDeve agora autenticar-se e alterar a sua palavra-chave.\n\nSe a conta foi criada por engano, pode ignorar esta mensagem.",
-    "usernamehasherror": "O nome de utilizador não pode conter o símbolo de cardinal (#).",
     "login-throttled": "Realizou demasiadas tentativas de autenticação com esta conta.\nAguarde $1 antes de tentar novamente, por favor.",
     "login-abort-generic": "A sua autenticação não teve êxito - Cancelada",
     "loginlanguagelabel": "Língua: $1",
     "prefs-skin": "Tema",
     "skin-preview": "Antever tema",
     "datedefault": "Sem preferência",
-    "prefs-beta": "Funcionalidades beta",
-    "prefs-datetime": "Data e hora",
     "prefs-labs": "Funcionalidades dos laboratórios",
     "prefs-user-pages": "Páginas de utilizador",
     "prefs-personal": "Dados do utilizador",
     "upload-permitted": "Tipos de ficheiro permitidos: $1.",
     "upload-preferred": "Tipos de ficheiro preferidos: $1.",
     "upload-prohibited": "Tipos de ficheiro proibidos: $1.",
-    "uploadlog": "registo de carregamento",
     "uploadlogpage": "Registo de carregamento",
     "uploadlogpagetext": "Segue-se uma lista dos carregamentos mais recentes.\nConsulte a [[Special:NewFiles|galeria de novos ficheiros]] para visioná-los.",
     "filename": "Nome do ficheiro",
     "filereuploadsummary": "Alterações ao ficheiro:",
     "filestatus": "Estado dos direitos de autor:",
     "filesource": "Fonte:",
-    "uploadedfiles": "Ficheiros carregados",
     "ignorewarning": "Ignorar o aviso e gravar o ficheiro.",
     "ignorewarnings": "Ignorar todos os avisos",
     "minlength1": "Os nomes de ficheiros devem de ter pelo menos uma letra.",
     "overwroteimage": "enviou uma nova versão de \"[[$1]]\"",
     "uploaddisabled": "Carregamentos impossibilitados",
     "copyuploaddisabled": "Upload por URL impossibilitado.",
-    "uploadfromurl-queued": "O seu upload foi adicionado à fila.",
     "uploaddisabledtext": "O carregamento de ficheiros está impossibilitado.",
     "php-uploaddisabledtext": "O carregamento de ficheiros está impossibilitado no PHP.\nVerifique a configuração file_uploads, por favor.",
     "uploadscripted": "Este ficheiro contém HTML ou código que pode ser erradamente interpretado por um browser.",
     "upload-misc-error": "Erro de carregamento desconhecido",
     "upload-misc-error-text": "Ocorreu um erro desconhecido durante o envio.\nVerifique se o endereço (URL) é válido e acessível e tente novamente.\nCaso o problema persista, contacte um [[Special:ListUsers/sysop|administrador]].",
     "upload-too-many-redirects": "A URL continha demasiados redirecionamentos",
-    "upload-unknown-size": "Tamanho desconhecido",
     "upload-http-error": "Ocorreu um erro HTTP: $1",
     "upload-copy-upload-invalid-domain": "Não é possível realizar carregamentos remotos neste domínio.",
     "backend-fail-stream": "Não foi possível transmitir o ficheiro $1.",
     "img-auth-streaming": "A fazer o ''streaming'' de \"$1\".",
     "img-auth-public": "A função do img_auth.php é produzir ficheiros a partir de uma wiki privada.\nEsta wiki está configurada como uma wiki pública.\nPara optimizar a segurança, o img_auth.php está impossibilitado de executar.",
     "img-auth-noread": "O utilizador não tem acesso de leitura ao ficheiro \"$1\".",
-    "img-auth-bad-query-string": "A URL tem um texto de consulta inválido.",
     "http-invalid-url": "URL inválida: $1",
     "http-invalid-scheme": "URLs iniciadas pelo prefixo \"$1\" não são aceites.",
     "http-request-error": "O pedido HTTP falhou devido a um erro desconhecido.",
     "filehist-dimensions": "Dimensões",
     "filehist-filesize": "Tamanho do ficheiro",
     "filehist-comment": "Comentário",
-    "filehist-missing": "Ficheiro em falta",
     "imagelinks": "Uso do ficheiro",
     "linkstoimage": "{{PLURAL:$1|A seguinte página contém|As seguintes $1 páginas contêm}} links para este ficheiro:",
     "linkstoimage-more": "Mais de {{PLURAL:$1|uma página contém|$1 páginas contêm}} links para este ficheiro.\nA lista abaixo apresenta apenas {{PLURAL:$1|a primeira página|as primeiras $1 páginas}}.\nEncontra-se disponível uma [[Special:WhatLinksHere/$2|lista completa]].",
     "listgrouprights-removegroup-self": "Remover a própria conta {{PLURAL:$2|do grupo|dos grupos}}: $1",
     "listgrouprights-addgroup-self-all": "Adicionar a própria conta a todos os grupos",
     "listgrouprights-removegroup-self-all": "Remover a própria conta de todos os grupos",
+    "listgrouprights-namespaceprotection-header": "Restrições do campo nominal",
+    "listgrouprights-namespaceprotection-namespace": "Campo nominal",
+    "trackingcategories-name": "Nome da mensagem",
     "mailnologin": "Não existe endereço de envio",
     "mailnologintext": "Precisa de estar [[Special:UserLogin|autenticado]] e ter um endereço de correio válido nas suas [[Special:Preferences|preferências]], para poder enviar correio eletrónico a outros utilizadores.",
     "emailuser": "Enviar correio eletrónico a este utilizador",
     "emailuser-title-notarget": "Enviar correio eletrónico ao utilizador",
     "emailpage": "Enviar correio eletrónico ao utilizador",
     "emailpagetext": "Pode usar o formulário abaixo para enviar uma mensagem por correio eletrónico para {{GENDER:$1|este utilizador|esta utilizadora}}.\nO endereço de correio que introduziu nas [[Special:Preferences|suas preferências]] irá aparecer no campo do remetente da mensagem \"De:\", para que o destinatário lhe possa responder diretamente.",
-    "usermailererror": "O sistema de correio devolveu o erro:",
     "defemailsubject": "Correio eletrónico da {{SITENAME}}, do utilizador \"$1\"",
     "usermaildisabled": "O correio eletrónico do utilizador foi desativado",
     "usermaildisabledtext": "Não pode enviar correio eletrónico a outros utilizadores desta wiki",
     "noemailtitle": "Sem endereço de correio eletrónico",
     "noemailtext": "Este utilizador não especificou um endereço de correio eletrónico válido.",
-    "nowikiemailtitle": "Correio eletrónico não é permitido",
     "nowikiemailtext": "Este utilizador optou por não receber correio eletrónico de outros utilizadores.",
     "emailnotarget": "O nome do destinatário não existe ou é inválido.",
     "emailtarget": "Introduza o nome de utilizador do destinatário.",
     "nowatchlist": "A sua lista de páginas vigiadas está vazia.",
     "watchlistanontext": "Precisa de $1 para ver ou editar a sua lista de páginas vigiadas, por favor.",
     "watchnologin": "Não está autenticado(a)",
-    "watchnologintext": "Precisa de [[Special:UserLogin|autenticar-se]] para modificar a sua lista de páginas vigiadas.",
     "addwatch": "Adicionar às páginas vigiadas",
     "addedwatchtext": "A página \"[[:$1]]\" foi adicionada à sua [[Special:Watchlist|lista de páginas vigiadas]].\nModificações futuras desta página e da respetiva página de discussão serão listadas lá.",
     "removewatch": "Remover das páginas vigiadas",
     "watching": "A vigiar...",
     "unwatching": "Deixando de vigiar...",
     "watcherrortext": "Ocorreu um erro ao alterar a configuração da sua lista de páginas vigiadas para \"$1\".",
-    "enotif_mailer": "Gerador de Notificações da {{SITENAME}}",
     "enotif_reset": "Marcar todas as páginas como visitadas",
     "enotif_impersonal_salutation": "Utilizador da \"{{SITENAME}}\"",
     "enotif_subject_deleted": "A página  $1 de {{SITENAME}} foi {{GENDER:$2|eliminada}} por $2",
     "excontent": "o conteúdo era: \"$1\"",
     "excontentauthor": "o conteúdo era: \"$1\" (e o único editor era [[Special:Contributions/$2|$2]]\")",
     "exbeforeblank": "o conteúdo antes de esvaziar era: \"$1\"",
-    "exblank": "página esvaziada",
     "delete-confirm": "Eliminar \"$1\"",
     "delete-legend": "Eliminar",
     "historywarning": "'''Aviso:''' A página que está prestes a eliminar tem um histórico com aproximadamente $1 {{PLURAL:$1|revisão|revisões}}:",
     "sp-contributions-newbies-sub": "Para contas novas",
     "sp-contributions-newbies-title": "Contribuições de contas novas",
     "sp-contributions-blocklog": "registo de bloqueios",
+    "sp-contributions-suppresslog": "contribuições suprimidas",
     "sp-contributions-deleted": "contribuições eliminadas",
     "sp-contributions-uploads": "carregamentos",
     "sp-contributions-logs": "registos",
     "sp-contributions-blocked-notice": "Este utilizador está bloqueado neste momento.\nPara referência é apresentado abaixo o último registo de bloqueio:",
     "sp-contributions-blocked-notice-anon": "Este endereço IP está bloqueado neste momento.\nPara referência é apresentado abaixo o último registo de bloqueio:",
     "sp-contributions-search": "Pesquisar contribuições",
-    "sp-contributions-suppresslog": "contribuições suprimidas",
     "sp-contributions-username": "Endereço IP ou utilizador:",
     "sp-contributions-toponly": "Mostrar somente as revisões mais recentes",
     "sp-contributions-newonly": "Mostrar só edições que são criações de páginas",
     "allmessagesname": "Nome",
     "allmessagesdefault": "Texto padrão",
     "allmessagescurrent": "Texto atual",
-    "allmessagestext": "Esta é a lista das mensagens de sistema disponíveis no espaço nominal MediaWiki.\nSe deseja colaborar na localização genérica do MediaWiki, visite [https://www.mediawiki.org/wiki/Localisation MediaWiki Localisation] e a [//translatewiki.net translatewiki.net].",
+    "allmessagestext": "Esta é a lista das mensagens de sistema disponíveis no espaço nominal MediaWiki.\nSe deseja colaborar na localização genérica do MediaWiki, visite [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation MediaWiki Localisation] e a [//translatewiki.net translatewiki.net].",
     "allmessagesnotsupportedDB": "Esta página não pode ser usada porque a <strong>$wgUseDatabaseMessages</strong> foi desativada.",
     "allmessages-filter-legend": "Filtro",
     "allmessages-filter": "Filtrar pelo estado de personalização:",
     "importunknownsource": "Tipo da fonte de importação desconhecido",
     "importcantopen": "Não foi possível abrir o ficheiro a importar",
     "importbadinterwiki": "Link interwikis incorrecto",
-    "importnotext": "Vazio ou sem texto",
     "importsuccess": "Importação completa!",
-    "importhistoryconflict": "Existem conflitos de edições no histórico (talvez esta página já tenha sido importada anteriormente)",
     "importnosources": "Não foram definidas fontes de importação transwikis e o carregamento direto de históricos encontra-se desativado.",
     "importnofile": "Nenhum ficheiro de importação foi carregado.",
     "importuploaderrorsize": "O carregamento do ficheiro importado falhou.\nO ficheiro é maior do que o tamanho máximo permitido.",
index 5b3c939..f61842b 100644 (file)
             "Žekřil71pl",
             "פוילישער",
             "គីមស៊្រុន",
-            "아라"
+            "아라",
+            "Jdforrester"
         ]
     },
+    "sidebar": "{{notranslate}}",
     "tog-underline": "[[Special:Preferences]], tab 'Misc'. Offers user a choice how to underline links. {{Gender}}",
     "tog-hideminor": "[[Special:Preferences]], tab 'Recent changes'. Offers user to hide minor edits in recent changes or not. {{Gender}}",
     "tog-hidepatrolled": "Option in Recent changes tab of [[Special:Preferences]] (if [[mw:Manual:$wgUseRCPatrol|$wgUseRCPatrol]] is enabled). {{Gender}}",
     "november-date": "A date in the Gregorian month of November. $1 is the numerical date, for example \"23\".\n{{Identical|November}}",
     "december-date": "A date in the Gregorian month of December. $1 is the numerical date, for example \"23\".",
     "pagecategories": "Used in the categories section of pages.\n\nFollowed by a colon and a list of categories.\n\nParameters:\n* $1 - number of categories",
+    "pagecategorieslink": "{{notranslate}}",
     "category_header": "In category description page. Parameters:\n* $1 - category name\nSee also:\n* {{msg-mw|Category-media-header}}",
     "subcategories": "Used as a header on category pages that have subcategories.\n{{Identical|Subcategory}}",
     "category-media-header": "In category description page. Parameters:\n* $1 - category name\nSee also:\n* {{msg-mw|Category header}}",
     "category-empty": "The text displayed in category page when that category is empty",
     "hidden-categories": "Used in the categories section of pages.\n\nFollowed by a colon and a list of categories.\n\nParameters:\n* $1 - number of hidden categories\n{{Identical|Hidden category}}",
-    "hidden-category-category": "Name of the [[mw:Help:Tracking categories|tracking category]] where hidden categories will be listed.\n{{Identical|Hidden category}}",
+    "hidden-category-category": "Name of the [[mw:Special:MyLanguage/Help:Tracking categories|tracking category]] where hidden categories will be listed.\n\nSee also:\n* {{msg-mw|Hidden-category-category-desc}}\n{{Identical|Hidden category}}",
     "category-subcat-count": "This message is displayed at the top of a category page showing the number of pages in the category.\n\nParameters:\n* $1 - number of subcategories shown\n* $2 - total number of subcategories in category",
     "category-subcat-count-limited": "This message is displayed at the top of a category page showing the number of pages in the category when not all pages in a category are counted.\n\nParameters:\n* $1 - number of subcategories shown",
     "category-article-count": "This message is used on category pages. Parameters:\n* $1 – number of pages shown\n* $2 – total number of pages in category",
     "category-file-count": "This message is displayed at the top of a category page showing the number of pages in the category.\n\nParameters:\n* $1 – number of files shown\n* $2 – total number of files in category",
     "category-file-count-limited": "This message is displayed at the top of a category page showing the number of pages in the category when not all pages in a category are counted.\n\nParameters:\n* $1 - number of files shown",
     "listingcontinuesabbrev": "Shown in contiuation of each first letter group. This message follows the first letter.\n\nSee http://test.wikipedia.org/wiki/Category:Test_ko?uselang={{SUBPAGENAME}}, for example.",
-    "index-category": "Name of the [[mw:Help:Tracking categories|tracking category]] where pages with the <nowiki>__INDEX__</nowiki> behavior switch are listed. For description of this behavior switch see [[mw:Help:Magic_words#Behavior_switches|MediaWiki]].",
-    "noindex-category": "Name of the [[mw:Help:Tracking categories|tracking category]] where pages with the <nowiki>__NOINDEX__</nowiki> behavior switch are listed. For description of this behavior switch see [[mw:Help:Magic_words#Behavior_switches|MediaWiki]].",
-    "broken-file-category": "Name of [[mw:Help:Tracking categories|tracking category]] where pages that embed files that do not exist (\"broken images\") are listed.",
+    "index-category": "Name of the [[mw:Special:MyLanguage/Help:Tracking categories|tracking category]] where pages with the <nowiki>__INDEX__</nowiki> behavior switch are listed.\n\nFor description of this behavior switch see [[mw:Special:MyLanguage/Help:Magic_words#Behavior_switches|MediaWiki]].\n\nSee also:\n* {{msg-mw|Index-category-desc}}",
+    "noindex-category": "Name of the [[mw:Special:MyLanguage/Help:Tracking categories|tracking category]] where pages with the <nowiki>__NOINDEX__</nowiki> behavior switch are listed.\n\nFor description of this behavior switch see [[mw:Special:MyLanguage/Help:Magic_words#Behavior_switches|MediaWiki]].\n\nSee also:\n* {{msg-mw|Noindex-category-desc}}",
+    "broken-file-category": "Name of [[mw:Special:MyLanguage/Help:Tracking categories|tracking category]] where pages that embed files that do not exist (\"broken images\") are listed.\n\nSee also:\n* {{msg-mw|Broken-file-category-desc}}",
     "categoryviewer-pagedlinks": "{{Optional}}\nThe pagination links in category viewer. Parameters:\n* $1 - the previous link, uses {{msg-mw|Prevn}}\n* $2 - the next link, uses {{msg-mw|Nextn}}",
     "about": "{{Identical|About}}",
     "article": "A 'content page' is a page that forms part of the purpose of the wiki. It includes the main page and pages in the main namespace and any other namespaces that are included when the wiki is customised. For example on Wikimedia Commons 'content pages' include pages in the file and category namespaces. On Wikinews 'content pages' include pages in the Portal namespace. For technical definition of 'content namespaces' see [[mw:Manual:Using_custom_namespaces#Content_namespaces|MediaWiki]].\n\nPossible alternatives to the word 'content' are 'subject matter' or 'wiki subject' or 'wiki purpose'.\n\n{{Identical|Content page}}",
     "qbmyoptions": "Heading in the Cologne Blue skin user menu containing links to user (talk) page, preferences, watchlist, etc.\n{{Identical|My pages}}",
     "faq": "FAQ is short for ''frequently asked questions''.\n{{Identical|FAQ}}",
     "faqpage": "{{doc-important|Do not translate <code>Project:</code> part.}}\n\"FAQ\" is short for \"frequently asked questions\".\n\nThis page is only linked in CologneBlue (an old skin), not in Monobook or Vector.",
+    "sitetitle": "{{Ignore}}",
+    "sitesubtitle": "{{Ignore}}",
     "vector-action-addsection": "Used in the Vector skin. See for example {{canonicalurl:Talk:Main_Page|useskin=vector}}",
     "vector-action-delete": "Used in the Vector skin, as the name of a tab at the top of the page. See for example {{canonicalurl:Main_Page|useskin=vector}}\n\n{{Identical|Delete}}",
     "vector-action-move": "Used in the Vector skin, on the tabs at the top of the page. See for example {{canonicalurl:Talk:Main_Page|useskin=vector}}\n\n{{Identical|Move}}",
     "permalink": "Display name for a permanent link to the current revision of a page. When the page is edited, permalink will still link to this revision. Example: Last menu link on [[{{MediaWiki:Mainpage}}]]\n\nSee also:\n* {{msg-mw|Permalink}}\n* {{msg-mw|Accesskey-t-permalink}}\n* {{msg-mw|Tooltip-t-permalink}}\n{{Identical|Permalink}}",
     "print": "{{Identical|Print}}",
     "view": "The default text of the \"View\" or \"Read\" (Vector) views tab which represents the basic view for the page. Should be in the infinitive mood.\n\n{{Identical|View}}",
+    "view-foreign": "The text on the tab that sends people to the \"master copy\" of the file at the foreign file\nrepository (e.g. Wikimedia Commons). Should be in the infinitive mood.\n\nParameters:\n* $1 - the name of the shared repository. On Wikimedia sites, $1 is {{msg-mw|Shared-repo-name-shared}}. On wikis using [[mw:InstantCommons|InstantCommons]], $1 is {{msg-mw|Shared-repo-name-wikimediacommons}}. The default value for $1 is {{msg-mw|Shared-repo}}.",
     "edit": "The text of the tab going to the edit form. When the page is protected, you will see {{msg-mw|Viewsource}}. Should be in the infinitive mood.\n\nSee also:\n* {{msg-mw|Edit}}\n* {{msg-mw|Accesskey-ca-edit}}\n* {{msg-mw|Tooltip-ca-edit}}\n{{Identical|Edit}}",
-    "create": "The text on the tab of the edit form on unexisting pages starts editing them.\n\n{{Identical|Create}}",
+    "edit-local": "The text on the tab going to the edit form for the local description page of a file from a foreign file repository (e.g. Wikimedia Commons). Should be in the infinitive mood.\n\nSee also:\n* {{msg-mw|Edit}}\n* {{msg-mw|Create-local}}",
+    "create": "The text on the tab of the edit form on unexisting pages starts editing them. Should be in the infinitive mood.\n\n{{Identical|Create}}",
+    "create-local": "The text on the tab going to the creation form for the (not yet existing) local description page of a file from a foreign file repository (e.g. Wikimedia Commons). Should be in the infinitive mood.\n\nSee also:\n* {{msg-mw|Create}}\n* {{msg-mw|Edit-local}}",
     "editthispage": "This is the \"edit\" link as used in the Cologne Blue skin, at the bottom of the page.\n\nSee {{msg-mw|Create-this-page}} for when the page does not exist.\n{{Identical|Edit this page}}",
     "create-this-page": "In the Cologne Blue skin this is the text for the link leading to the edit form on pages that have not yet been created, at the bottom of the page. See {{msg-mw|editthispage}} for when the page already exists.\n{{Identical|Createpage}}",
     "delete": "Name of the Delete tab shown for admins. Should be in the infinitive mood.\n\nSee also:\n* {{msg-mw|Delete}}\n* {{msg-mw|Accesskey-ca-delete}}\n* {{msg-mw|Tooltip-ca-delete}}\n{{Identical|Delete}}",
     "specialpage": "{{Identical|Special page}}",
     "personaltools": "Heading for a group of links to your user page, talk page, preferences, watchlist, and contributions. This heading is visible in the sidebar in some skins. For an example, see [{{canonicalurl:Main_Page|useskin=simple}} Main Page using simple skin].",
     "postcomment": "Used as link text.\n\nThe link points to the talk page and has the parameters \"action=edit&section=new\".",
+    "addsection": "{{notranslate}}\nText of the new section tab (the one next to the \"edit\" tab on non-Vector skins).\n\nSee also:\n* {{msg-mw|Addsection}}\n* {{msg-mw|Accesskey-ca-addsection}}\n* {{msg-mw|Tooltip-ca-addsection}}",
     "articlepage": "'Content page' is used for NS_MAIN and any other non-standard namespaces. Only used in the Cologne Blue skin in the bottomLinks part.\n\n{{Identical|Content page}}",
     "talk": "Used as display name for the tab to all {{msg-mw|Talk}} pages. These pages accompany all content pages and can be used for discussing the content page. Example: [[Talk:Example]].\n\nSee also:\n* {{msg-mw|Talk}}\n* {{msg-mw|Accesskey-ca-talk}}\n* {{msg-mw|Tooltip-ca-talk}}\n{{Identical|Discussion}}",
     "views": "Subtitle for the list of available views, for the current page. In \"monobook\" skin the list of views are shown as tabs, so this sub-title is not shown. For an example, see [{{canonicalurl:Main_Page|useskin=simple}} Main Page using simple skin].\n\n'''Note:''' This is \"views\" as in \"appearances\"/\"representations\", '''not''' as in \"visits\"/\"accesses\".\n{{Identical|View}}",
     "otherlanguages": "This message is shown under the toolbox. It is used if there are interwiki links added to the page, like <code><nowiki>[[</nowiki>en:Interwiki article]]</code>.\n{{Identical|Otherlanguages}}",
     "redirectedfrom": "The text displayed when a certain page is redirected to another page. Parameters:\n* $1 - the name of the page user came from",
     "redirectpagesub": "Displayed under the page title of a page which is a redirect to another page, see [{{fullurl:Project:Translators|redirect=no}} Project:Translators] for example.\n\n{{Identical|Redirect page}}",
+    "talkpageheader": "{{notranslate}}",
     "lastmodifiedat": "This message is shown below each page, in the footer with the logos and links.\n\nParameters:\n* $1 - date\n* $2 - time\nSee also:\n* {{msg-mw|Lastmodifiedatby}}",
     "viewcount": "Used as page-view counter. Parameters:\n* $1 - number of pageviews",
     "protectedpage": "This message is displayed when trying to edit a page you can't edit because it has been protected.\n\nThis message is the title for the message {{msg-mw|protectedpagetext}}.",
     "pool-timeout": "Part of {{msg-mw|view-pool-error}}.\n\nFor explanation of 'lock' see [[w:Lock_(computer_science)|wikipedia]].",
     "pool-queuefull": "Part of {{msg-mw|view-pool-error}}\n\n\"Pool\" refers to a pool of processes.",
     "pool-errorunknown": "Part of {{msg-mw|view-pool-error}}.\n{{Identical|Unknown error}}",
-    "pool-servererror": "Error message. Parameters:\n* $1 - list of server addresses",
+    "pool-servererror": "Error message. Parameters:\n* $1 - list of server addresses\n\nSee e.g. {{msg-mw|Poolcounter-desc}} (and the Pool Counter extension in general) for translation hints for “pool counter service”.",
     "aboutsite": "Used as the label of the link that appears at the footer of every page on the wiki (in most of  the skins) and leads to the page that contains the site description. The link target is {{msg-mw|aboutpage}}.\n\n[[mw:Manual:Interface/Aboutsite|MediaWiki manual]].\n\n{{doc-important|Do not change <nowiki>{{SITENAME}}</nowiki>.}}\n\n{{Identical|About}}",
     "aboutpage": "Used as the target of the link that appears at the footer of every page on the wiki (in most of  the skins) and leads to the page that contains the site description. Therefore the content should be the same with the page name of the site description page. Only the message in the [[mw:Manual:$wgLanguageCode|site language]]  ([[MediaWiki:Aboutpage]]) is used. The link label is {{msg-mw|aboutsite}}.\n\n{{doc-important|Do not translate \"Project:\" part, for this is the namespace prefix.}}",
     "copyright": "Parameters:\n* $1 - license name\n'''See also'''\n* {{msg-mw|Mobile-frontend-copyright}}",
     "disclaimers": "Used as display name for the link to [[{{MediaWiki:Disclaimerpage}}]] shown at the bottom of every page on the wiki. Example [[{{MediaWiki:Disclaimerpage}}|{{MediaWiki:Disclaimers}}]].\n{{Identical|Disclaimer}}",
     "disclaimerpage": "{{doc-important|Do not change the <code>Project:</code> part.}}\nUsed as page for that contains the site disclaimer. Used at the bottom of every page on the wiki. Example: [[{{MediaWiki:Disclaimerpage}}|{{MediaWiki:Disclaimers}}]].",
     "edithelp": "This is the text that appears on the editing help link that is near the bottom of the editing page",
+    "edithelppage": "The help page displayed when a user clicks on editing help link which is present on the right of Show changes button.\n{{doc-important|Do not change the \"<tt>Help:</tt>\" part.}}",
+    "helppage": "{{ignored}}\nThe link destination used by default in the sidebar, and in {{msg-mw|Noarticletext}}.",
     "mainpage": "Defines the link and display name of the main page of the wiki. Shown as the top link in the navigation part of the interface. Please do not change it too often, that could break things!\n\nSee also:\n* {{msg-mw|Mainpage}}\n* {{msg-mw|Accesskey-n-mainpage}}\n* {{msg-mw|Tooltip-n-mainpage}}\n{{Identical|Main page}}",
     "mainpage-description": "The same as {{msg-mw|mainpage}}, used as link text on [[MediaWiki:Sidebar]].\n\nThis makes it possible to the change the link destination (the message \"mainpage\") without changing the link text or without disabling translations.\n\nSee also:\n* {{msg-mw|Mainpage-description}}\n* {{msg-mw|Accesskey-n-mainpage-description}}\n* {{msg-mw|Tooltip-n-mainpage-description}}\n{{Identical|Main page}}",
     "policy-url": "{{doc-important|Do not change the <code>Project:</code> part.}}\nThe URL of the project page describing the policies of the wiki.\n\nThis is shown below every page (the left link).",
     "newmessageslinkplural": "This is the first link displayed in an orange rectangle when a user gets a message on their talk page.\n\nUsed as <code>$1</code> in the following messages:\n* {{msg-mw|youhavenewmessagesfromusers}}\n* {{msg-mw|youhavenewmessagesmanyusers}}\n* {{msg-mw|youhavenewmessages}}.\nParameters:\n* $1 - 1 or 999:\n** 1 - if there was '''one''' new edit since the last time the user has seen their talk page\n** 999 - if there was '''more than one''' new edit since the last time the user has seen their talk page\n{{Identical|New messages}}",
     "newmessagesdifflinkplural": "This is the second link displayed in an orange rectangle when a user gets a message on his talk page.\n\nUsed as <code>$2</code> in messages {{msg-mw|youhavenewmessagesfromusers}}, {{msg-mw|youhavenewmessagesmanyusers}}, {{msg-mw|youhavenewmessages}}.\n\nParameters:\n* $1 - 1 or 999:\n** 1 - if there was '''one''' new edit since the last time the user has seen their talk page\n** 999 - if there was '''more than one''' new edit since the last time the user has seen their talk page\n{{Identical|Last change}}",
     "youhavenewmessagesmulti": "The alternative of {{msg-mw|youhavenewmessages}} as used on wikis with a special setup so they can receive the \"new message\" notice on other wikis as well. Used on [http://www.wikia.com/ Wikia].\n\nThe format is: \"{{int:youhavenewmessagesmulti| [[MediaWiki:Newmessageslinkplural/{{SUBPAGENAME}}|{{int:newmessageslinkplural}}]]}}\"\n\nParameters:\n* $1 - a link points to new messages. Its text is {{msg-mw|Newmessageslinkplural}}",
+    "newtalkseparator": "{{notranslate}}",
     "editsection": "Display name of link to edit a section on a content page. Example: [{{MediaWiki:Editsection}}].\n\n{{Identical|Edit}}",
     "editold": "{{Identical|Edit}}",
     "viewsourceold": "{{Identical|View source}}",
     "page-atom-feed": "Parameters:\n* $1 - page title\nSee also:\n* {{msg-mw|Page-rss-feed}}\n{{Identical|S1 RSS/Atom feed}}",
     "feed-atom": "{{optional}}\nSee also:\n* {{msg-mw|Feed-atom}}\n* {{msg-mw|Accesskey-feed-atom}}\n* {{msg-mw|Tooltip-feed-atom}}",
     "feed-rss": "{{optional}}\nSee also:\n* {{msg-mw|Feed-rss}}\n* {{msg-mw|Accesskey-feed-rss}}\n* {{msg-mw|Tooltip-feed-rss}}",
+    "sitenotice": "{{Notranslate}}\n\nMediaWiki:Sitenotice is displayed above the page title for all users if it is defined, unless it is superseded by another notice. 'Defined' means it exists and has content other than the single character '-'.\n\nManual: [[mw:Manual:Interface/Sitenotice]]",
+    "anonnotice": "{{notranslate}}",
+    "newsectionheaderdefaultlevel": "{{notranslate}}\nParameters:\n* $1 - section name",
     "red-link-title": "Title for red hyperlinks. Indicates, that the page is empty, not written yet.\n\nParameters:\n* $1 - page title",
     "sort-descending": "JavaScript message. Used by sortable table script.",
     "sort-ascending": "JavaScript message. Used by sortable table script.",
     "nstab-template": "The name for the tab of the template namespace. Example: [[Template:Example]]\n\nSee also:\n* {{msg-mw|Nstab-template}}\n* {{msg-mw|Accesskey-ca-nstab-template}}\n* {{msg-mw|Tooltip-ca-nstab-template}}\n{{Identical|Template}}",
     "nstab-help": "The name for the tab of the help namespace. Example: [[Help:Rollback]]\n\nSee also:\n* {{msg-mw|Nstab-help}}\n* {{msg-mw|Accesskey-ca-nstab-help}}\n* {{msg-mw|Tooltip-ca-nstab-help}}",
     "nstab-category": "The name for the tab of the category namespace. Example: [[:Category:Example]]\n\nSee also:\n* {{msg-mw|Nstab-category}}\n* {{msg-mw|Accesskey-ca-nstab-category}}\n* {{msg-mw|Tooltip-ca-nstab-category}}\n{{Identical|Category}}",
+    "mainpage-nstab": "{{notranslate}}",
     "nosuchaction": "The title of the error you get when trying to open a page with invalid \"action\" parameter. The text of the warning is the message {{msg-mw|nosuchactiontext}}.\n\nSee example [{{canonicalurl:Main_page|action=x}} action=x].",
     "nosuchactiontext": "This error is shown when trying to open a page with invalid \"action\" parameter, e.g. [{{canonicalurl:Main_page|action=x}} action=x].\n* The title of this error is the message {{msg-mw|nosuchaction}}.",
     "nosuchspecialpage": "The title of the error you get when trying to open a special page which does not exist. The text of the warning is the message {{msg-mw|nospecialpagetext}}. Example: [[Special:Nosuchpage]]",
     "filenotfound": "Parameters:\n* $1 - file name",
     "fileexistserror": "Parameters:\n* $1 - file name",
     "unexpected": "This message indicates the value $2 is unexpected for $1. Parameters:\n* $1 - name\n* $2 - value",
+    "formerror": "Generic error message show to a user when they try to submit information that could not be processed for any reason.",
     "badarticleerror": "Used as error message in moving page.\n\nSee also:\n* {{msg-mw|Articleexists}}\n* {{msg-mw|Bad-target-model}}",
     "cannotdelete": "Error message in deleting. Parameters:\n* $1 - page name or file name",
     "cannotdelete-title": "Title of error page when the user cannot delete a page. Parameters:\n* $1 - the page name",
     "userlogin-yourname": "In user login & create account forms, label for username field.\n{{doc-important|<nowiki>{{</nowiki>[[Gender|GENDER]]<nowiki>}}</nowiki> is '''NOT''' supported.}}\n\nSee examples: [[Special:UserLogin]] and [{{canonicalurl:Special:UserLogin|type=signup}} Special:UserLogin?type=signup]\n{{Identical|Username}}",
     "userlogin-yourname-ph": "Placeholder text in login & create account form field.\n\nSee example: [[Special:UserLogin]] and [{{canonicalurl:Special:UserLogin|type=signup}} Special:UserLogin?type=signup]",
     "createacct-another-username-ph": "Placeholder text in create account form field when one user creates an account for another.",
+    "createacct-helpusername": "Message in new create account form providing guidance for username.\n\nRefers to {{msg-mw|createacct-helpusername-url}}.",
     "yourpassword": "In user preferences\n\n{{Identical|Password}}",
     "userlogin-yourpassword": "In login & create account forms, label for password field.\n\nSee examples: [[Special:UserLogin]] and [{{canonicalurl:Special:UserLogin|type=signup}} Special:UserLogin?type=signup]\n{{Identical|Password}}",
     "userlogin-yourpassword-ph": "Placeholder text in login form for password field.\n\nSee examples: [[Special:UserLogin]] and [{{canonicalurl:Special:UserLogin|type=signup}} Special:UserLogin?type=signup]\n{{Identical|Enter password}}",
     "userloginnocreate": "Since 1.22 no longer used in core, but may still be used by some extensions. A variant of {{msg-mw|Userlogin}} when the user is not allowed to create a new account. DEPRECATED\n\n{{Identical|Log in}}",
     "logout": "Used as link text in your personal toolbox (upper right side).\n\nSee also:\n* {{msg-mw|Logout}}\n* {{msg-mw|Accesskey-pt-logout}}\n* {{msg-mw|Tooltip-pt-logout}}\n{{Identical|Log out}}",
     "userlogout": "{{doc-special|UserLogout|unlisted=1}}\n{{Identical|Log out}}",
+    "userlogout-summary": "{{ignored}}",
     "notloggedin": "This message is displayed in the standard skin when not logged in. The message is placed above the login link in the top right corner of pages.\n\n{{Identical|Not logged in}}",
     "userlogin-noaccount": "In the [[Special:Userlogin]] form, this is the text prior to button inviting user to join project.\n{{Identical|Do not have an account}}",
     "userlogin-joinproject": "Text of button inviting user to create an account.\n\nSee example: [[Special:UserLogin]]",
     "gotaccountlink": "Since 1.22 no longer used in core, but may be used by some extensions. DEPRECATED.\n{{Identical|Log in}}",
     "userlogin-resetlink": "Since 1.22 no longer used in core, but may be used by some extensions. DEPRECATED.",
     "userlogin-resetpassword-link": "Used as link text in the login form.\n\nThe link points to the local page [[Special:PasswordReset]].\n\nSee example: [[Special:UserLogin]]\n\nuserlogin-resetpassword-link may have to be shorter than the old {{msg-mw|userlogin-resetlink}}.\n{{Identical|Forgot your password}}",
+    "helplogin-url": "{{doc-important|Do not translate the namespace name <code>Help</code>.}}\nUsed as name of the page that provides information about logging into the wiki.\n\nUsed as a link target in the message {{msg-mw|Userlogin-helplink}}.",
     "userlogin-helplink2": "Label for a link to login help.\n\nSee example: [[Special:UserLogin]]\n\nSee also:\n* {{msg-mw|Helplogin-url}}",
     "userlogin-loggedin": "Used as warning on [[Special:UserLogin]] when the current user is already logged in.\n\nFollowed by the Login form.\n\nSee example: [[Special:UserLogin]].\n\nParameters:\n* $1 - user name (used for display and for gender support)",
     "userlogin-createanother": "Used as label for the button on [[Special:UserLogin]] shown when the current user is already logged in.\n{{Identical|Create another account}}",
     "createacct-reason": "In create account form, label for field to enter reason to create an account when already logged-in.\n\nSee example: [{{canonicalurl:Special:UserLogin|type=signup}} Special:UserLogin?type=signup]\n{{Identical|Reason}}",
     "createacct-reason-ph": "Placeholder in vertical-layout create account form for reason field.\n\nSee example: [{{canonicalurl:Special:UserLogin|type=signup}} Special:UserLogin?type=signup]",
     "createacct-captcha": "Label in vertical-layout create account form for CAPTCHA input field when repositioned by JavaScript.",
+    "createacct-imgcaptcha-help": "Help text in vertical-layout create account form for image CAPTCHA input field when repositioned by JavaScript.\n\nRefers to {{msg-mw|Createacct-captcha-help-url}}.",
     "createacct-imgcaptcha-ph": "Placehodler text in vertical-layout create account form for image CAPTCHA input field when repositioned by JavaScript.",
     "createacct-submit": "Submit button on vertical-layout create account form.\n\nSee example: [{{canonicalurl:Special:UserLogin|type=signup}} Special:UserLogin?type=signup]",
     "createacct-another-submit": "Submit button of  [[Special:UserLogin/signup]] ([[Special:CreateAccount]]) when accessed by a registered user.\n\nThe original means \"create an account in addition to the one you already have\"; sometimes, but not always, it means you are going to \"Create the account on behalf of somebody else\" or \"Create account for another\".\n{{Identical|Create another account}}",
     "createacct-benefit-heading": "In vertical-layout create account form, the heading for the section describing the benefits of creating an account. See example: [{{canonicalurl:Special:UserLogin|type=signup}} Special:UserLogin?type=signup]\n\nIf in your language you need to know the gender of the name for the wiki (which is the subject of the English sentence), please adapt the sentence as much as you need for your translation to fit.",
+    "createacct-benefit-icon1": "In vertical-layout create account form, the CSS style for the div next to the first benefit. If you replace this you will need probably need to adjust CSS.\n\nUsed as a CSS class name.\n\nSee example: [{{canonicalurl:Special:UserLogin|type=signup&useNew=1}} Special:UserLogin?type=signup&useNew=1]",
+    "createacct-benefit-head1": "In vertical-layout create account form, the text in the heading for the first benefit. Do not edit the magic word; if you replace it you will probably need to adjust CSS.\n\nFollowed by the message {{msg-mw|Createacct-benefit-body1}}.\n\nSee example: [{{canonicalurl:Special:UserLogin|type=signup&useNew=1}} Special:UserLogin?type=signup&useNew=1]",
     "createacct-benefit-body1": "In vertical-layout create account form, the text for the first benefit.\n\nPreceded by the message {{msg-mw|Createacct-benefit-head1}} (number of edits).\n\nSee example: [{{canonicalurl:Special:UserLogin|type=signup}} Special:UserLogin?type=signup]\n\nParameters:\n* $1 - number of edits\n{{Identical|Edit}}",
+    "createacct-benefit-icon2": "In vertical-layout create account form, the CSS style for the div next to the second benefit. If you replace this you will need probably need to adjust CSS.\n\nUsed as a CSS class name.\n\nSee example: [{{canonicalurl:Special:UserLogin|type=signup&useNew=1}} Special:UserLogin?type=signup&useNew=1]",
+    "createacct-benefit-head2": "In vertical-layout create account form, the text in the heading for the second benefit. Do not edit the magic word; if you replace it you will probably need to adjust CSS.\n\nFollowed by the message {{msg-mw|Createacct-benefit-body2}}.\n\nSee example: [{{canonicalurl:Special:UserLogin|type=signup&useNew=1}} Special:UserLogin?type=signup&useNew=1]",
     "createacct-benefit-body2": "In vertical-layout create account form, the text for the second benefit.\n\nPreceded by the message {{msg-mw|Createacct-benefit-head2}} (number of pages).\n\nSee example: [{{canonicalurl:Special:UserLogin|type=signup}} Special:UserLogin?type=signup]\n\nParameters:\n* $1 - number of pages\n{{Identical|Page}}",
+    "createacct-benefit-icon3": "In vertical-layout create account form, the CSS style for the div next to the third benefit. If you replace this you will need probably need to adjust CSS.\n\nUsed as a CSS class name.\n\nSee example: [{{canonicalurl:Special:UserLogin|type=signup&useNew=1}} Special:UserLogin?type=signup&useNew=1]",
+    "createacct-benefit-head3": "In vertical-layout create account form, the text in the heading for the third benefit. Do not edit the magic word; if you replace it you will probably need to adjust CSS.\n\nFollowed by the message {{msg-mw|Createacct-benefit-body3}}.\n\nSee example: [{{canonicalurl:Special:UserLogin|type=signup&useNew=1}} Special:UserLogin?type=signup&useNew=1]",
     "createacct-benefit-body3": "In vertical-layout create account form, the text for the third benefit.\n\nPreceded by the message {{msg-mw|Createacct-benefit-head3}} (number of contributors).\n\nSee example: [{{canonicalurl:Special:UserLogin|type=signup}} Special:UserLogin?type=signup]\n\nParameters:\n* $1 - number of contributors (users)",
     "badretype": "Used as error message when the new password and its retype do not match.",
     "userexists": "Used as error message in creating a user account.",
     "blocked-mailpassword": "Used as error message in password recovery.",
     "eauthentsent": "This message appears after entering an email address in [[Special:Preferences]] > {{int:prefs-personal}} > {{int:email}}, then clicking on \"{{int:saveprefs}}\".",
     "throttled-mailpassword": "Used in [[Special:PasswordReset]]. Parameters:\n* $1 - password reset email resend time (in hours)",
+    "loginstart": "{{notranslate}}",
+    "loginend": "{{notranslate}}",
+    "loginend-https": "{{notranslate}}",
+    "signupstart": "{{notranslate}}\nDefault:\n* {{msg-mw|Loginstart}}",
+    "signupend": "{{notranslate}}\nDefault:\n* {{msg-mw|Loginend}}",
+    "signupend-https": "{{notranslate}}",
     "mailerror": "Used as error message in sending confirmation mail to user. Parameters:\n* $1 - new mail address",
     "acct_creation_throttle_hit": "Error message at [[Special:CreateAccount]].\n\n\"in the last day\" precisely means: during the lasts 86400 seconds (24 hours) ending right now.\n\nParameters:\n* $1 - number of accounts",
     "emailauthenticated": "In user preferences ([[Special:Preferences]] > {{int:prefs-personal}} > {{int:email}}) and on [[Special:ConfirmEmail]].\n\nParameters:\n* $1 - (Unused) obsolete, date and time\n* $2 - date\n* $3 - time",
     "invalidemailaddress": "Shown as a warning when written an invalid email address in [[Special:Preferences]] and {{fullurl:Special:UserLogin|type=signup}} page",
     "cannotchangeemail": "Error message shown when user goes to [[Special:ChangeEmail]] but email addresses cannot be changed on the site.",
     "emaildisabled": "Error message shown when user tries to set an email address but email features are disabled.",
+    "emailsender": "{{optional}}",
     "accountcreated": "Used as page title in [[Special:UserLogin]].\n\nSee also:\n* {{msg-mw|Accountcreated|title}}\n* {{msg-mw|Accountcreatedtext|message}}",
     "accountcreatedtext": "Used in [[Special:UserLogin]]. Parameters:\n* $1 - username\nSee also:\n* {{msg-mw|Accountcreated|title}}\n* {{msg-mw|Accountcreatedtext|message}}",
     "createaccount-title": "Subject of the email sent to the email address entered at [[Special:CreateAccount]] when one user creates an account for another and clicks the checkbox labelled {{msg-mw|Createaccountmail}}.",
     "login-throttled": "Error message shown at [[Special:UserLogin]] after the user has tried to login with incorrect password too many times.\n\nThe user has to wait a certain time before trying to log in again.\n\nParameters:\n* $1 - the time to wait before the next login attempt. Automatically formatted using the following duration messages:\n** {{msg-mw|Duration-millennia}}\n** {{msg-mw|Duration-centuries}}\n** {{msg-mw|Duration-decades}}\n** {{msg-mw|Duration-years}}\n** {{msg-mw|Duration-weeks}}\n** {{msg-mw|Duration-days}}\n** {{msg-mw|Duration-hours}}\n** {{msg-mw|Duration-minutes}}\n** {{msg-mw|Duration-seconds}}\n\nThis is a protection against robots trying to find the password by trying lots of them.\nThe number of attempts and waiting time are configured via [[mw:Manual:$wgPasswordAttemptThrottle|$wgPasswordAttemptThrottle]].\nThis message is used in html.\n{{identical|Login throttled}}",
     "login-abort-generic": "The generic unsuccessful login message is used unless otherwise specified by hook writers",
     "loginlanguagelabel": "Used on [[Special:UserLogin]] if $wgLoginLanguageSelector is true. Parameters:\n* $1 - a pipe-separated list built from the names that appear in the message {{msg-mw|Loginlanguagelinks}}.\n{{Identical|Language}}",
+    "loginlanguagelinks": "{{notranslate}}",
     "suspicious-userlogout": "Used when the logout request looks suspicious, in Special:UserLogout.",
     "createacct-another-realname-tip": "{{doc-singularthey}}\nUsed on the account creation form when creating another user's account. Similar to {{msg-mw|prefs-help-realname}}.\n{{Identical|Real name attribution}}",
     "pt-login": "Shown to anonymous users in the upper right corner of the page when they can't create an account (otherwise the message {{msg-mw|nav-login-createaccount}} is shown there).\n{{Identical|Log in}}",
     "pt-login-button": "Shown as the caption of the button at [[Special:UserLogin]].\n{{Identical|Log in}}",
     "pt-createaccount": "Used on the top of the page for logged out users, where it appears next to {{msg-mw|login}}, so consider making them similar.\n{{Identical|Create account}}",
     "pt-userlogout": "{{Doc-actionlink}}\n{{Identical|Log out}}",
+    "pear-mail-error": "{{notranslate}}\nParameters:\n* $1 - error message which is returned by PEAR mailer.",
+    "php-mail-error": "{{notranslate}}\nParameters:\n* $1 - error message",
     "php-mail-error-unknown": "Used as error message when <code>mail()</code> returned empty error message.",
     "user-mail-no-addy": "This is the error message in case an email could not be sent because there was no email address to send it to.",
     "user-mail-no-body": "This is the error message in case an email has an empty or unreasonably short body.",
     "changepassword": "Section heading on [[Special:Preferences]], tab 'User profile'.\n{{Identical|Change password}}",
+    "changepassword-summary": "{{ignored}}",
     "resetpass_announce": "Used in [[Special:UserLogin]].",
     "resetpass_text": "{{optional}}",
     "resetpass_header": "Header on box on special page [[Special:ChangePassword]].\n\n{{Identical|Reset password}}",
     "passwordreset-emailsent-capture": "Used in [[Special:PasswordReset]].\n\nSee also:\n* {{msg-mw|Passwordreset-emailsent}}\n* {{msg-mw|Passwordreset-emailerror-capture}}",
     "passwordreset-emailerror-capture": "Error message displayed in [[Special:PasswordReset]] when sending an email fails. Parameters:\n* $1 - error message\n* $2 - username, used for GENDER\nSee also:\n* {{msg-mw|Passwordreset-emailsent}}\n* {{msg-mw|Passwordreset-emailsent-capture}}",
     "changeemail": "Title of [[Special:ChangeEmail|special page]].",
+    "changeemail-summary": "{{ignored}}",
     "changeemail-header": "Header on [[Special:ChangeEmail]].",
     "changeemail-text": "Text of [[Special:ChangeEmail]].",
     "changeemail-no-info": "Error message for [[Special:ChangeEmail]].\n\nParameters:\n* $1 (unused) - a link to [[Special:UserLogin]] with {{msg-mw|loginreqlink}} as link description",
     "changeemail-cancel": "Cancel button on [[Special:ChangeEmail]]\n\n{{Identical|Cancel}}",
     "changeemail-throttled": "Error message shown at [[Special:ChangeEmail]] after the user has tried to login with incorrect password too many times.\n\nThe user has to wait a certain time before trying to log in again.\n\nParameters:\n* $1 - the time to wait before the next login attempt. Automatically formatted using the following duration messages:\n** {{msg-mw|Duration-millennia}}\n** {{msg-mw|Duration-centuries}}\n** {{msg-mw|Duration-decades}}\n** {{msg-mw|Duration-years}}\n** {{msg-mw|Duration-weeks}}\n** {{msg-mw|Duration-days}}\n** {{msg-mw|Duration-hours}}\n** {{msg-mw|Duration-minutes}}\n** {{msg-mw|Duration-seconds}}\n\nThis is a protection against robots trying to find the password by trying lots of them.\nThe number of attempts and waiting time are configured via [[mw:Manual:$wgPasswordAttemptThrottle|$wgPasswordAttemptThrottle]].\nThis message is used in html.\n\nSee also:\n* {{msg-mw|Changepassword-throttled}}",
     "resettokens": "{{doc-special|ResetTokens}}\nIn this case \"token\" may be translated as \"key\", or similar.\n{{Identical|Reset token}}",
+    "resettokens-summary": "{{ignored}}",
     "resettokens-text": "Text on [[Special:ResetTokens]].",
     "resettokens-no-tokens": "Additional text on [[Special:ResetTokens]] if the user has no tokens.",
     "resettokens-legend": "Form legend on [[Special:ResetTokens]].\n{{Identical|Reset token}}",
     "accmailtext": "{{doc-important|Do not translate <code><nowiki>[[User talk:$1|$1]]</nowiki></code> and <code>Special:ChangePassword</code>.}}\nThe message shown when a temporary password has been sent to the user's email address.\n\nParameters:\n* $1 - username\n* $2 - email address",
     "newarticle": "{{Identical|New}}",
     "newarticletext": "Text displayed above the edit box in editor when trying to create a new page.\nParameters:\n* $1 - The URL to the help page, defined in {{msg-mw|helppage}}",
+    "newarticletextanon": "{{notranslate}}\nDefault:\n* {{msg-mw|Newarticletext}}",
+    "talkpagetext": "{{notranslate}}",
     "anontalkpagetext": "Displayed at the bottom of talk pages of anonymous users.",
     "noarticletext": "This is the message that you get if you search for a term that has not yet got any entries on the wiki.\n\nSee also:\n* {{msg-mw|Noarticletext-nopermission}}",
     "noarticletext-nopermission": "See also {{msg-mw|Noarticletext}}.",
+    "noarticletextanon": "{{notranslate}}\nDefault:\n* {{msg-mw|Noarticletext}}",
     "missing-revision": "Text displayed when the requested revision does not exist using a permalink.\n\nExample: [{{canonicalurl:Project:News|oldid=9999999}} Permalink with invalid revision#]\n\nParameters:\n* $1 - the ID of the missing revision",
-    "userpage-userdoesnotexist": "Error message displayed when trying to edit or create a page or a subpage that belongs to a user who is not registered on the wiki.\n\nParameters:\n* $1 - a possible username that has not been registered",
-    "userpage-userdoesnotexist-view": "Shown in user pages of non existing users. See for example [{{canonicalurl:User:Foo}} User:Foo].\n\nParameters:\n* $1 - a username",
+    "userpage-userdoesnotexist": "Error message displayed when trying to edit or create a page or a subpage that belongs to a user who is not registered on the wiki.\n\nParameters:\n* $1 - a username\n{{identical|userdoesnotexist}}",
+    "userpage-userdoesnotexist-view": "Shown in user pages of non-existing users. See for example [{{canonicalurl:User:Foo}} User:Foo].\n\nParameters:\n* $1 - a username\n{{identical|userdoesnotexist}}",
     "blocked-notice-logextract": "{{gender}}\nParameters:\n* $1 - (Optional) the name of the blocked user. Can be used for GENDER.",
     "clearyourcache": "Text at the top of .js/.css pages",
     "usercssyoucanpreview": "Text displayed on every CSS page.\n\nSee also:\n* {{msg-mw|Userjsyoucanpreview}}\n* {{msg-mw|Showpreview}}",
     "storedversion": "This is used in an edit conflict as the label for the top revision that has been stored, as opposed to your version {{msg-mw|yourtext}} that has not been stored which is shown at the bottom of the page.",
     "nonunicodebrowser": "Used as warning when editing page.",
     "editingold": "Used as warning when editing page.",
-    "yourdiff": "",
+    "yourdiff": "Used as h2 header for the diff of the current version of a page with the user's version in case there is an edit conflict or a spam filter hit.",
     "copyrightwarning": "Copyright warning displayed under the edit box in editor. Parameters:\n* $1 - link\n* $2 - license name",
     "copyrightwarning2": "Copyright warning displayed under the edit box in editor\n*$1 - license name",
+    "editpage-head-copy-warn": "{{ignored}}Custom copyright warning in the header of an edit page.",
+    "editpage-tos-summary": "{{notranslate}}",
+    "longpage-hint": "{{notranslate}}\n* <tt>$1</tt>: Size of the textbox formatted for output, using an appropriate unit ({{msg-mw|size-bytes}}, {{msg-mw|size-kilobytes}}, {{msg-mw|size-megabytes}}, {{msg-mw|size-gigabytes}})\n* <tt>$2</tt>: Size of the textbox in bytes, not formatnum",
     "longpageerror": "Warning displayed when trying to save a text larger than the maximum size allowed.\n\nParameters:\n* $1 - submitted size (in kilobytes)\n* $2 - maximum size (in kilobytes)",
     "readonlywarning": "Parameters:\n* $1 - reason",
     "protectedpagewarning": "{{Related|Semiprotectedpagewarning}}",
     "edit-no-change": "Used as error message.\n\nSee also:\n* {{msg-mw|edit-hook-aborted}}\n* {{msg-mw|edit-gone-missing}}\n* {{msg-mw|edit-conflict}}\n* {{msg-mw|edit-already-exists}}",
     "postedit-confirmation": "{{gender}}\nConfirmation message that is displayed upon successful edit.\n\nParameters:\n* $1 - (Optional) the current user, for GENDER support",
     "edit-already-exists": "Used as error message.\n\nSee also:\n* {{msg-mw|edit-hook-aborted}}\n* {{msg-mw|edit-gone-missing}}\n* {{msg-mw|edit-conflict}}\n* {{msg-mw|edit-no-change}}",
+    "addsection-preload": "{{notranslate}}",
+    "addsection-editintro": "{{notranslate}}",
     "defaultmessagetext": "Caption above the default message text shown on the left-hand side of a diff displayed after clicking \"Show changes\" when creating a new page in the MediaWiki: namespace",
     "content-failed-to-parse": "Error message indicating that the page's content can not be saved because it is syntactically invalid. This may occurr for content types using serialization or a strict markup syntax.\n\nParameters:\n* $1 – content model, any one of the following messages:\n** {{msg-mw|Content-model-wikitext}}\n** {{msg-mw|Content-model-javascript}}\n** {{msg-mw|Content-model-css}}\n** {{msg-mw|Content-model-text}}\n* $2 – content format as MIME type (e.g. <code>text/css</code>)\n* $3 – specific error message",
     "invalid-content-data": "Error message indicating that the page's content can not be saved because it is invalid. This may occurr for content types with internal consistency constraints.",
     "content-model-javascript": "Name for the JavaScript content model, used when decribing what type of content a page contains.\n\nThis message is substituted in:\n*{{msg-mw|Bad-target-model}}\n*{{msg-mw|Content-not-allowed-here}}",
     "content-model-css": "Name for the CSS content model, used when decribing what type of content a page contains.\n\nThis message is substituted in:\n*{{msg-mw|Bad-target-model}}\n*{{msg-mw|Content-not-allowed-here}}",
     "expensive-parserfunction-warning": "On some (expensive) [[MetaWikipedia:Help:ParserFunctions|parser functions]] (e.g. <code><nowiki>{{#ifexist:}}</nowiki></code>) there is a limit of how many times it may be used. This is an error message shown when the limit is exceeded.\n\nParameters:\n* $1 - the current number of parser function calls\n* $2 - the allowed number of parser function calls\nSee also [[:mw:Manual:$wgExpensiveParserFunctionLimit|$wgExpensiveParserFunctionLimit in the MediaWiki manual]].\n\nSee also:\n* {{msg-mw|Expensive-parserfunction-category}}",
-    "expensive-parserfunction-category": "This message is used as a category name for a [[mw:Help:Tracking categories|tracking category]] where pages are placed automatically if they contain too many calls to expensive parser functions.\n\nSee also:\n* {{msg-mw|Expensive-parserfunction-warning}}",
+    "expensive-parserfunction-category": "This message is used as a category name for a [[mw:Special:MyLanguage/Help:Tracking categories|tracking category]] where pages are placed automatically if they contain too many calls to expensive parser functions.\n\nSee also:\n* {{msg-mw|Expensive-parserfunction-category-desc}}\n* {{msg-mw|Expensive-parserfunction-warning}}",
     "post-expand-template-inclusion-warning": "When templates are expanded, there is a size limit for the number of bytes yielded. Usually that occurs from excessively nested templates, recursive templates, or ones having x-zillion of #if #case or similar contructs in them. When the wikicode parser detects this, it outputs a red warning message to the page.\n\n\nSee also:\n* {{msg-mw|Post-expand-template-inclusion-category}}",
-    "post-expand-template-inclusion-category": "This message is used as a category name for a [[mw:Help:Tracking categories|tracking category]] where pages are placed automatically if the expanded size of the templates they contain exceeds the limit.\nWhen templates are expanded, there is a size limit for the number of bytes yielded. Usually that occurs from excessively nested templates, recursive templates, or ones having x-zillion of #if #case or similar contructs in them. When the wikicode parser detects this, it outputs a red warning message to the page.\n\nSee also:\n* {{msg-mw|Post-expand-template-inclusion-warning}}",
+    "post-expand-template-inclusion-category": "This message is used as a category name for a [[mw:Special:MyLanguage/Help:Tracking categories|tracking category]] where pages are placed automatically if the expanded size of the templates they contain exceeds the limit.\n\nWhen templates are expanded, there is a size limit for the number of bytes yielded. Usually that occurs from excessively nested templates, recursive templates, or ones having x-zillion of #if #case or similar contructs in them. When the wikicode parser detects this, it outputs a red warning message to the page.\n\nSee also:\n* {{msg-mw|Post-expand-template-inclusion-category-desc}}\n* {{msg-mw|Post-expand-template-inclusion-warning}}",
     "post-expand-template-argument-warning": "Used as warning in parser limitation.\n\nSee also:\n* {{msg-mw|Post-expand-template-argument-category}}",
-    "post-expand-template-argument-category": "This message is used as a category name for a [[mw:Help:Tracking categories|tracking category]] where pages are placed automatically if they contain omitted template arguments.\n\nSee also:\n* {{msg-mw|Post-expand-template-argument-warning}}",
+    "post-expand-template-argument-category": "This message is used as a category name for a [[mw:Special:MyLanguage/Help:Tracking categories|tracking category]] where pages are placed automatically if they contain omitted template arguments.\n\nSee also:\n* {{msg-mw|Post-expand-template-argument-category-desc}}\n* {{msg-mw|Post-expand-template-argument-warning}}",
     "parser-template-loop-warning": "Parameters:\n* $1 - page title",
     "parser-template-recursion-depth-warning": "Parameters:\n* $1 - limit value of recursion depth",
     "language-converter-depth-warning": "Error message shown when a page uses too deeply nested language conversion syntax. Parameters:\n* $1 - the value of the depth limit",
     "cantcreateaccounttitle": "Used as title of the error message {{msg-mw|Cantcreateaccount-text}}.",
     "cantcreateaccount-text": "Used as error message, with the title {{msg-mw|Cantcreateaccounttitle}}.\n* $1 - target IP address\n* $2 - reason or {{msg-mw|Blockednoreason}}\n* $3 - username\nSee also:\n* {{msg-mw|Cantcreateaccount-range-text}}",
     "cantcreateaccount-range-text": "Used as more detailed version of the {{msg-mw|Cantcreateaccount-text}} error message, with the title {{msg-mw|Cantcreateaccounttitle}}.\n* $1 - target IP range\n* $2 - reason or {{msg-mw|Blockednoreason}}\n* $3 - username\n* $4 - current user's IP address",
+    "createaccount-hook-aborted": "Placeholder message to return with API errors on account create; passes through the message from a hook {{notranslate}}",
     "viewpagelogs": "Link displayed in history of pages",
     "nohistory": "Message shown when there are no history to list. See [{{canonicalurl:x|action=history}} example history].\n----\nAlso used as title of error message when the feed is empty. See [{{canonicalurl:x|action=history&feed=atom}} example feed].\n\nSee the error message:\n* {{msg-mw|history-feed-empty}}",
     "currentrev": "Used in Diff Preview page. The diff is between {{msg-mw|currentrev}} and {{msg-mw|yourtext}}.\n{{Identical|Current revision}}",
     "currentrev-asof": "Used on a difference page when comparing the current versions of a page with each other.\n\nSee {{msg-mw|Revisionasof}} for the message for non-current version.\n\nParameters:\n* $1 - a date and time\n* $2 - (Optional) a date\n* $3 - (Optional) a time",
     "revisionasof": "Used on a difference page when comparing different versions of a page or when viewing an non-current version of a page.\n\nSee {{msg-mw|Currentrev-asof}} for the message for the current version.\n\nParameters:\n* $1 - the date/time at which the revision was created. e.g. \"''Revision as of 14:44, 24 January 2008''\".\n* $2 - (Optional) the date at which the revision was created\n* $3 - (Optional) the time at which the revision was created",
     "revision-info": "Appears just below the page title when an old version of the page is being viewed.\n\nParameters:\n* $1 - date and time of revision\n* $2 - a series of links: to author of the revision, his talk page, etc.\n* $3 - (Optional) revision ID\n* $4 - (Optional) date of revision\n* $5 - (Optional) time of revision\n* $6 - (Optional) author of revision, for GENDER use",
+    "revision-info-current": "{{notranslate}}\n* $1: date and time of revision\n* $2: a series of links: to author of the revision, his talk page, etc. \n* (optional) $3: revision ID\n* (optional) $4: date of revision\n* (optional) $5: time of revision\n* (optional) $6: author of revision, for GENDER use",
+    "revision-nav": "{{notranslate}}\nRefers to {{msg-mw|Pipe-separator}}.\n\nParameters:\n* $1 - prev diff. link text is {{msg-mw|Diff}}\n* $2 - prev link. link text is {{msg-mw|Previousrevision}}\n* $3 - link. link text is {{msg-mw|Currentrevisionlink}}\n* $4 - cur diff. link text is {{msg-mw|Diff}}\n* $5 - next link. link text is {{msg-mw|Nextrevision}}\n* $6 - next diff. link text is {{msg-mw|Diff}}",
     "previousrevision": "See also:\n* {{msg-mw|Nextrevision}}",
     "nextrevision": "See also:\n* {{msg-mw|Previousrevision}}",
     "currentrevisionlink": "{{Identical|Current revision}}",
     "histlegend": "Text in history page.\n\nSee also:\n* {{msg-mw|Cur}}\n* {{msg-mw|Last}}\n* {{msg-mw|Minoreditletter}}",
     "history-fieldset-title": "Fieldset label in the edit history pages.",
     "history-show-deleted": "CheckBox to show only per [[mw:Manual:RevisionDelete|RevisonDelete]] deleted versions.\n\nUsed in History and [[Special:Contributions]].",
+    "history_copyright": "{{notranslate}}",
     "histfirst": "This is part of the navigation message on the top and bottom of Page History pages which are lists of things in date order, e.g. [{{canonicalurl:Support|action=history}} Page History of Support].\n\nIt is followed by the message {{msg-mw|Viewprevnext}}.\n{{Identical|Oldest}}",
     "histlast": "This is part of the navigation message on the top and bottom of Page History pages which are lists of things in date order, e.g. [{{canonicalurl:Support|action=history}} Page History of Support].\n\nIt is followed by the message {{msg-mw|Viewprevnext}}.\n{{Identical|Newest}}",
     "historysize": "Parameters:\n* $1 - byte count, for PLURAL support",
     "revdelete-no-file": "Used as error message in [[Special:RevisionDelete]].",
     "revdelete-show-file-confirm": "A confirmation message shown on [[Special:Revisiondelete]] when the request does not contain a valid token (e.g. when a user clicks a link received in mail).\n\nParameters:\n* $1 - a file name\n* $2 - a date\n* $3 - a time\n{{Identical|Are you sure you want to view the deleted revision of the file...}}",
     "revdelete-show-file-submit": "Reply to {{msg-mw|Revdelete-show-file-confirm}}.\n\n{{Identical|Yes}}",
-    "revdelete-selected-text": "{{Related|Revdelete-selected}}",
-    "revdelete-selected-file": "{{Related|Revdelete-selected}}",
-    "logdelete-selected": "{{RevisionDelete}}\nParameters:\n* $1 - number of log events\n* $2 - (Unused) localized name of Special:Log, maybe with type as subpage\n{{Related|Revdelete-selected}}",
+    "revdelete-selected-text": "Parameters:\n* $1 - number of revisions\n* $2 - page title\n{{Related|Revdelete-selected}}",
+    "revdelete-selected-file": "Parameters:\n* $1 - number of revisions\n* $2 - page title\n{{Related|Revdelete-selected}}",
+    "logdelete-selected": "{{RevisionDelete}}\nParameters:\n* $1 - number of log events\n* $2 - (Unused) localized name of [[Special:Log]], maybe with type as subpage\n{{Related|Revdelete-selected}}",
     "revdelete-text-text": "{{RevisionDelete}}\nThis is the introduction explaining the feature.\n\nSee also:\n* {{msg-mw|Revdelete-text-file}}\n* {{msg-mw|Logdelete-text}}\n* {{msg-mw|Revdelete-text-others}}",
     "revdelete-text-file": "{{RevisionDelete}}\nThis is the introduction explaining the feature.\n\nSee also:\n* {{msg-mw|Revdelete-text-text}}\n* {{msg-mw|Logdelete-text}}\n* {{msg-mw|Revdelete-text-others}}",
     "logdelete-text": "{{RevisionDelete}}\nThis is the introduction explaining the feature.\n\nSee also:\n* {{msg-mw|Revdelete-text-text}}\n* {{msg-mw|Revdelete-text-file}}\n* {{msg-mw|Revdelete-text-others}}",
     "diff-multi-otherusers": "This message appears in the revision history of a page when comparing two versions which aren't consecutive, and at least one of the intermediate revisions was created by a user other than the user who created the new revision.\n\nParameters:\n* $1 - the number of revisions\n* $2 - the number of distinct other users who made those revisions\n{{Related|Diff-multi}}",
     "diff-multi-manyusers": "This message appears in the revision history of a page when comparing two versions which aren't consecutive, and the intermediate revisions have been edited by more than 100 users.\n\nParameters:\n* $1 - the number of revisions, will always be 101 or more\n* $2 - the number of users that were found, which was limited at 100\n{{Related|Diff-multi}}",
     "difference-missing-revision": "Text displayed when the requested revision does not exist using a diff link.\n\nExample: [{{canonicalurl:Project:News|diff=426850&oldid=99999999}} Diff with invalid revision#]\n\nParameters:\n* $1 - the list of missing revisions IDs\n* $2 - the number of items in $1 (one or two)",
+    "search-summary": "{{doc-specialpagesummary|search}}",
     "searchresults": "This is the title of the page that contains the results of a search.\n\n{{Identical|Search results}}",
     "searchresults-title": "Appears as page title in the html header of the search result special page.\n\nParameters:\n* $1 - the search term",
     "toomanymatches": "Used as section header in [[Special:Search]], when there are too many hits.",
     "viewprevnext": "This is part of the navigation message on the top and bottom of Special pages which are lists of things, e.g. the User's contributions page (in date order) or the list of all categories (in alphabetical order). ($1) and ($2) are either {{msg-mw|Pager-older-n}} and {{msg-mw|Pager-newer-n}} (for date order) or {{msg-mw|Prevn}} and {{msg-mw|Nextn}} (for alphabetical order).\n\nIt is also used by [[Special:WhatLinksHere|Whatlinkshere]] pages, where ($1) and ($2) are {{msg-mw|Whatlinkshere-prev}} and {{msg-mw|Whatlinkshere-next}}.\n($3) is made up in all cases of the various proposed numbers of results per page, e.g. \"(20 | 50 | 100 | 250 | 500)\".\nFor Special pages, the navigation bar is prefixed by \"({{msg-mw|Page first}} | {{msg-mw|Page last}})\" (alphabetical order) or \"({{msg-mw|Histfirst}} | {{msg-mw|Histlast}})\" (date order).\n\nViewprevnext is sometimes preceded by the {{msg-mw|Showingresults}} or {{msg-mw|Showingresultsnum}} message (for Special pages) or by the {{msg-mw|Linkshere}} message (for Whatlinkshere pages).\n\nRefers to {{msg-mw|Pipe-separator}}.",
     "searchmenu-exists": "An option shown in a menu beside search form offering a link to the existing page having the specified title (when using the default MediaWiki search engine).\n\nParameters:\n* $1 - page title\n* $2 - the number of search results found",
     "searchmenu-new": "An option shown in a menu beside search form offering a red link to the not yet existing page having the specified title (when using the default MediaWiki search engine).\n\nParameters:\n* $1 - page title\n* $2 - the number of search results found",
+    "searchmenu-new-nocreate": "{{notranslate}}",
     "searchprofile-articles": "A quick link in the advanced search box on [[Special:Search]]. Clicking on this link starts a search in the content pages of the wiki.\n\nA 'content page' is a page that forms part of the purpose of the wiki. It includes the main page and pages in the main namespace and any other namespaces that are included when the wiki is customised. For example on Wikimedia Commons 'content pages' include pages in the file and category namespaces. On Wikinews 'content pages' include pages in the Portal namespace. For technical definition of 'content namespaces' see [[mw:Manual:Using_custom_namespaces#Content_namespaces|MediaWiki]].\n\nPossible alternatives to the word 'content' are 'subject matter' or 'wiki subject' or 'wiki purpose'.\n\n{{Identical|Content page}}",
     "searchprofile-project": "Used as an option in [[Special:Search]].\n\nSee also:\n* {{msg-mw|Searchprofile-project|message}}\n* {{msg-mw|Searchprofile-project-tooltip|tooltip}}",
     "searchprofile-images": "An option in the [[Special:Search]].\n\nSee also:\n* {{msg-mw|Searchprofile-images|message}}\n* {{msg-mw|Searchprofile-images-tooltip|tooltip}}\n{{Identical|Muitimedia}}",
     "search-suggest": "Used for \"Did you mean\" suggestions:\n* $1 - suggested link",
     "search-interwiki-caption": "Used in [[Special:Search]], when showing search results from other wikis.",
     "search-interwiki-default": "Parameters:\n* $1 - the hostname of the remote wiki from where the additional results listed below are returned",
+    "search-interwiki-custom": "#REDIRECT [[MediaWiki:Wmf-search-interwiki-custom/qqq]]",
     "search-interwiki-more": "{{Identical|More}}",
     "search-relatedarticle": "This is a search result (and I guess search engine) dependent messages. I do not know how to trigger the feature. The message is displayed if the search result contains information that related pages can also be provided from the search engine. I assume this is \"More Like This\" functionality. Microsoft glossary defines MLT as \"A way to refine search by identifying the right set of documents and then locating similar documents. This allows the searcher to control the direction of the search and focus on the most fruitful lines of inquiry.\"[http://www.microsoft.com/enterprisesearch/en/us/search-glossary.aspx]\n{{Identical|Related}}",
     "searcheverything-enable": "Used in [[Special:Preferences]], tab \"Search\".",
     "powersearch-togglenone": "\"None\" refers to namespaces. It is used in Advanced search: {{canonicalurl:Special:Search|advanced=1}}\n{{Identical|None}}",
     "search-external": "Legend of the fieldset for the input form when the internal search is disabled. Inside the fieldset [[MediaWiki:Searchdisabled]] and [[MediaWiki:Googlesearch]] is shown.",
     "searchdisabled": "{{doc-singularthey}}\nIn this sentence, \"their indexes\" refers to \"Google's indexes\".\n\nShown on [[Special:Search]] when the internal search is disabled.",
+    "googlesearch": "{{notranslate}}\nShown when [[mw:Manual:$wgDisableTextSearch|$wgDisableTextSearch]] is set to true and no [[mw:Manual:$wgSearchForwardUrl|$wgSearchForwardUrl]] is set.\n\nParameters:\n* $1 - the search term\n* $2 - \"UTF-8\" (hard-coded)\n* $3 - the message {{msg-mw|Searchbutton}}",
     "search-error": "Shown when an error has occurred when performing a search. Parameters:\n* $1 - the localized error that was returned",
+    "opensearch-desc": "{{ignored}}Link description of the [www.opensearch.org/ OpenSearch] link in the HTML head of pages.",
     "preferences": "Title of the [[Special:Preferences]] page.\n{{Identical|Preferences}}",
+    "preferences-summary": "{{doc-specialpagesummary|preferences}}",
     "mypreferences": "Action link label that leads to [[Special:Preferences]]; appears in the top menu (e.g. \"Username Talk Preferences Watchlist Contributions Log out\").\n\nSee also:\n* {{msg-mw|Mypreferences}}\n* {{msg-mw|Accesskey-pt-preferences}}\n* {{msg-mw|Tooltip-pt-preferences}}\n{{Identical|Preferences}}",
     "prefs-edits": "In user preferences.",
     "prefsnologintext2": "Parameters:\n* $1 - a link to [[Special:UserLogin]] with {{msg-mw|loginreqlink}} as link description",
     "prefs-skin": "Used in user preferences.\n{{Identical|Skin}}",
     "skin-preview": "{{doc-actionlink}}\nThe link beside each skin name in [[Special:Preferences|your user preferences]], tab \"skin\".\n{{Identical|Preview}}",
     "datedefault": "Used as checkbox label in [[Special:Preferences#mw-prefsection-datetime|user preferences]], {{msg-mw|prefs-datetime}} tab.\n\nThis message indicates {{msg-mw|prefs-dateformat}} is default (= not specified).",
-    "prefs-beta": "Header of a subsection at [[Special:Preferences]], tab ''{{int:prefs-editing}}'', listing features that are in beta but mostly suitable for general use.\n{{Identical|Beta feature}}",
-    "prefs-datetime": "{{Identical|Date}}",
     "prefs-labs": "Header of a subsection at [[Special:Preferences]], tab ''{{int:prefs-editing}}'', listing features that are experimental",
     "prefs-user-pages": "Header of a subsection at [[Special:Preferences]], tab ''{{int:prefs-misc}}'', listing features that are related to user pages",
     "prefs-personal": "Title of a tab in [[Special:Preferences]].\n{{Identical|User profile}}",
     "defaultns": "Used in [[Special:Preferences]], tab \"Search\".",
     "default": "{{Identical|Default}}",
     "prefs-files": "Title of a tab in [[Special:Preferences]].\n{{Identical|File}}",
-    "prefs-custom-css": "visible on [[Special:Preferences]] -[Skins].",
-    "prefs-custom-js": "visible on [[Special:Preferences]] -[Skins].",
+    "prefs-custom-css": "visible on [[Special:Preferences]] -[Skins].\n{{Identical|Custom CSS}}",
+    "prefs-custom-js": "visible on [[Special:Preferences]] -[Skins].\n{{Identical|Custom JavaScript}}",
     "prefs-common-css-js": "Used as label in [[Special:Preferences#mw-prefsection-rendering|preferences]], tab \"Appearance\", section \"Skin\".",
     "prefs-reset-intro": "Used in [[Special:Preferences/reset]].",
     "prefs-emailconfirm-label": "Sub-heading in [[Special:Preferences]] > {{int:prefs-personal}} > {{int:email}}.",
     "email-address-validity-valid": "Used as hint for {{msg-mw|changeemail-newemail}} field in [[Special:ChangeEmail]], when the provided E-mail address is valid.",
     "email-address-validity-invalid": "Used as warning for {{msg-mw|changeemail-newemail}} field in [[Special:ChangeEmail]], when the provided E-mail address is invalid.",
     "userrights": "Page title of [[Special:UserRights]].",
+    "userrights-summary": "{{doc-specialpagesummary|userrights}}",
     "userrights-lookup-user": "Label text when managing user rights ([[Special:UserRights]])",
     "userrights-user-editname": "Displayed on [[Special:UserRights]].",
     "editusergroup": "Button name, in page [[Special:Userrights]] (only available to administrators), in the section named {{MediaWiki:userrights-lookup-user}}.\n\n{{Identical|Edit user groups}}",
     "enhancedrc-since-last-visit": "Appears on enhanced watchlist and recent changes when page has more than one change on given date and at least one that the user hasn't seen yet, linking to a diff of the unviewed changes.\n\nParameters:\n* $1 - the number of unviewed changes (1 or more)\nThree messages are shown side-by-side: ({{msg-mw|nchanges}} | {{msg-mw|enhancedrc-since-last-visit}} | {{msg-mw|enhancedrc-history}}).",
     "enhancedrc-history": "Appears on enhanced watchlist and recent changes when page has more than one change on given date, linking to its history.\n\nThis is the same as {{msg-mw|hist}}, but not abbreviated.\n\nThree messages are shown side-by-side: ({{msg-mw|nchanges}} | {{msg-mw|enhancedrc-since-last-visit}} | {{msg-mw|enhancedrc-history}}).\n{{Identical|History}}",
     "recentchanges": "The text of the link in sidebar going to the special page [[Special:RecentChanges]]. Also the page title of that special page.\n\nSee also:\n* {{msg-mw|Recentchanges}}\n* {{msg-mw|Accesskey-n-recentchanges}}\n* {{msg-mw|Tooltip-n-recentchanges}}\n{{Identical|Recent changes}}",
+    "recentchanges-url": "{{notranslate}}",
     "recentchanges-legend": "Legend of the fieldset of [[Special:RecentChanges]]",
     "recentchanges-summary": "Summary of [[Special:RecentChanges]].",
+    "recentchangestext": "Text in [[Special:RecentChanges]]",
     "recentchanges-noresult": "Used in [[Special:RecentChanges]], [[Special:RecentChangesLinked]], and [[Special:Watchlist]] when there are no changes to be shown.",
     "recentchanges-feed-description": "Used in feed of RecentChanges. See example [{{canonicalurl:Special:RecentChanges|feed=atom}} feed].",
     "recentchanges-label-newpage": "# Used as tooltip for {{msg-mw|Newpageletter}}.\n# Also used as legend. Preceded by {{msg-mw|Newpageletter}} and followed by {{msg-mw|Recentchanges-legend-newpage}}.",
     "rcshowhideliu": "Option text in [[Special:RecentChanges]]. Parameters:\n* $1 - any one of the following messages:\n** {{msg-mw|rcshowhideliu-show}}\n** {{msg-mw|rcshowhideliu-hide}}",
     "rcshowhideliu-show": "{{doc-actionlink}}\nOption text in [[Special:RecentChanges]] in conjunction with {{msg-mw|rcshowhideliu}}.\n\nSee also:\n* {{msg-mw|rcshowhideliu-hide}}\n{{Identical|Show}}",
     "rcshowhideliu-hide": "{{doc-actionlink}}\nOption text in [[Special:RecentChanges]] in conjunction with {{msg-mw|rcshowhideliu}}.\n\nSee also:\n* {{msg-mw|rcshowhideliu-show}}\n{{Identical|Hide}}",
-    "rcshowhideanons": "Option text in [[Special:RecentChanges]]. Parameters:\n* $1 - the \"show/hide\" command, with the text taken from either {{msg-mw|rcshowhideanons-show}} or {{msg-mw|showhideanons-hide}}\n{{Identical|Anonymous user}}",
+    "rcshowhideanons": "Option text in [[Special:RecentChanges]]. Parameters:\n* $1 - the \"show/hide\" command, with the text taken from either {{msg-mw|Rcshowhideanons-show}} or {{msg-mw|Rcshowhideanons-hide}}\n{{Identical|Anonymous user}}",
     "rcshowhideanons-show": "{{doc-actionlink}}\nOption text in [[Special:RecentChanges]] in conjunction with {{msg-mw|rcshowhideanons}}.\n\nSee also:\n* {{msg-mw|rcshowhideanons-hide}}\n{{Identical|Hide}}",
     "rcshowhideanons-hide": "{{doc-actionlink}}\nOption text in [[Special:RecentChanges]] in conjunction with {{msg-mw|rcshowhideanons}}.\n\nSee also:\n* {{msg-mw|rcshowhideanons-show}}\n{{Identical|hide}}",
     "rcshowhidepatr": "Option text in [[Special:RecentChanges]]. Parameters:\n* $1 - the \"show/hide\" command, with the text taken from either {{msg-mw|rcshowhidepatr-show}} or {{msg-mw|rcshowhidepatr-hide}}",
     "newpageletter": "Very short form of \"'''new page'''\". Used in [[Special:RecentChanges]], [[Special:Watchlist]] and [[Special:Contributions]].",
     "boteditletter": "Abbreviation of \"'''bot'''\". Appears in [[Special:RecentChanges]] and [[Special:Watchlist]].",
     "unpatrolledletter": "{{optional}}\n\nUsed in {{msg-mw|Recentchanges-label-legend}}, meaning \"unpatrolled\".",
+    "number_of_watching_users_RCview": "{{notranslate}}\nParameters:\n* $1 - number of users who are watching",
     "number_of_watching_users_pageview": "Used if <code>$wgPageShowWatchingUsers</code> is true.\n* $1 - number of watching user(s)",
     "rc_categories": "Probably to do with 'recent changes' special page, either in a particular skin, or for a particular user group.\n\nI guess that this should appear before an input box where you can specify that recent changes should be shown for pages belonging to certain categories only. You name the categories in the input box, and separate them by a pipe character. If this is right, then you should be able to use 'restrict' instead of 'limit', or even 'show pages in the following categories only'.",
     "rc_categories_any": "Used in the CategoryFilter form on [[Special:RecentChanges]], if <code>$wgAllowCategorizedRecentChanges</code> is true.\n{{Identical|Any}}",
     "upload_directory_missing": "Parameters:\n* $1 - directory name",
     "upload_directory_read_only": "Parameters:\n* $1 - directory name",
     "uploaderror": "Used as section header in [[Special:Upload]].\n\nSee also:\n* {{msg-mw|upload-tryagain|Submit text}}",
+    "upload-summary": "{{doc-specialpagesummary|upload}}",
     "upload-recreate-warning": "Used as warning in [[Special:Upload]].",
     "uploadtext": "{{doc-important|<code>thumb</code> and <code>left</code> are magic words. Leave them untranslated!}}\nText displayed when uploading a file using [[Special:Upload]].",
     "upload-permitted": "Used in [[Special:Upload]]. Parameters:\n* $1 - list of file types, defined in the variable [[mw:Special:MyLanguage/Manual:$wgFileExtensions|$wgFileExtensions]]\nSee also:\n* {{msg-mw|Upload-preferred}}\n* {{msg-mw|Upload-prohibited}}",
     "upload-preferred": "Used in [[Special:Upload]]. Parameters:\n* $1 - list of file types, defined in the variable [[mw:Special:MyLanguage/Manual:$wgFileExtensions|$wgFileExtensions]]\nSee also:\n* {{msg-mw|Upload-permitted}}\n* {{msg-mw|Upload-prohibited}}",
     "upload-prohibited": "Used in [[Special:Upload]]. Parameters:\n* $1 - list of file types, defined in the variable [[mw:Special:MyLanguage/Manual:$wgFileBlacklist|$wgFileBlacklist]]\nSee also:\n* {{msg-mw|Upload-permitted}}\n* {{msg-mw|Upload-preferred}}",
+    "uploadfooter": "{{notranslate}}",
+    "upload-default-description": "{{ignored}}Custom default upload description. The contents of this message be will inserted in the field \"Summary\" on [[Special:Upload]].",
     "uploadlogpage": "{{doc-logpage}}\n\nPage title of [[Special:Log/upload]].",
     "uploadlogpagetext": "Appears on top of [[Special:Log/upload]].",
     "filename": "{{Identical|Filename}}",
     "upload-file-error-text": "See also:\n* {{msg-mw|Upload-file-error|title}}\n* {{msg-mw|Upload-file-error-text|text}}",
     "upload-misc-error": "See also:\n* {{msg-mw|Upload-misc-error|title}}\n* {{msg-mw|Upload-misc-error-text|text}}",
     "upload-misc-error-text": "See also:\n* {{msg-mw|Upload-misc-error|title}}\n* {{msg-mw|Upload-misc-error-text|text}}",
+    "upload-too-many-redirects": "Error message shown when uploading a file via URL, if the upload failed because the URL returned too many redirects.",
     "upload-http-error": "Parameters:\n* $1 - error message",
     "upload-copy-upload-invalid-domain": "Error message shown if a user is trying to upload (i.e. copy) a file from a website that is not in $wgCopyUploadsDomains (if set).\n\nSee also:\n* {{msg-mw|http-invalid-url}}\n* {{msg-mw|tmp-create-error}}\n* {{msg-mw|tmp-write-error}}",
     "backend-fail-stream": "Parameters:\n* $1 - a filename",
     "license": "This appears in the upload form for the license drop-down. The header in the file description page is now at {{msg-mw|License-header}}.\n{{Identical|Licensing}}",
     "license-header": "Used as section header in [[Special:Upload]].\n\nSee also:\n* {{msg-mw|Filedesc}}\n* {{msg-mw|Filestatus}}\n* {{msg-mw|Filesource}}\n{{Identical|Licensing}}",
     "nolicense": "{{Identical|None selected}}",
+    "licenses": "{{notranslate}}",
     "license-nopreview": "Error message when a certain license does not exist",
     "upload_source_url": "Used in [[Special:Upload]].\n\nSee also:\n* {{msg-mw|Sourcefilename|label}}\n* {{msg-mw|Sourceurl|label}}\n* {{msg-mw|Upload source file}}\n* {{msg-mw|Upload-maxfilesize}}",
     "upload_source_file": "Used in [[Special:Upload]].\n\nSee also:\n* {{msg-mw|Sourcefilename|label}}\n* {{msg-mw|Sourceurl|label}}\n* {{msg-mw|Upload source url}}\n* {{msg-mw|Upload-maxfilesize}}",
     "sharedupload-desc-here": "Parameters:\n* $1 - the name of the shared repository. On Wikimedia sites, $1 is {{msg-mw|Shared-repo-name-shared}}. The default value for $1 is {{msg-mw|Shared-repo}}.\n* $2 - description URL\nSee also:\n* {{msg-mw|Sharedupload}}\n* {{msg-mw|Sharedupload-desc-there}}\n* {{msg-mw|Sharedupload-desc-edit}}\n* {{msg-mw|Sharedupload-desc-create}}",
     "sharedupload-desc-edit": "Parameters:\n* $1 - the name of the shared repository. On Wikimedia sites, $1 is {{msg-mw|Shared-repo-name-shared}}. The default value for $1 is {{msg-mw|Shared-repo}}.\n* $2 - description URL\nSee also:\n* {{msg-mw|Sharedupload}}\n* {{msg-mw|Sharedupload-desc-there}}\n* {{msg-mw|Sharedupload-desc-here}}\n* {{msg-mw|Sharedupload-desc-create}}",
     "sharedupload-desc-create": "Parameters:\n* $1 - the name of the shared repository. On Wikimedia sites, $1 is {{msg-mw|Shared-repo-name-shared}}. The default value for $1 is {{msg-mw|Shared-repo}}.\n* $2 - description URL\nSee also:\n* {{msg-mw|Sharedupload}}\n* {{msg-mw|Sharedupload-desc-there}}\n* {{msg-mw|Sharedupload-desc-here}}\n* {{msg-mw|Sharedupload-desc-edit}}",
+    "shareddescriptionfollows": "{{notranslate}}\n\nSee also {{msg-mw|sharedupload-desc-here}}.",
     "filepage-nofile": "This message appears when visiting a File page for which there's no file, if the user cannot upload files, or file uploads are disabled. (Otherwise, see {{msg-mw|Filepage-nofile-link}})\n\nFilepage-nofile and Filepage-nofile-link message deprecate {{msg-mw|Noimage}}",
     "filepage-nofile-link": "This message appears when visiting a File page for which there's no file, if the user can upload files, and file uploads are enabled. (Otherwise, see {{msg-mw|Filepage-nofile}})\n\nParameters:\n* $1 - URL of upload page for this file\nFilepage-nofile and Filepage-nofile-link message deprecate {{msg-mw|Noimage}}",
     "uploadnewversion-linktext": "Used on pages in the \"File\" namespace to update the file version.",
     "shared-repo-from": "This message is shown on an image description page when a duplicate of the image exists on a shared repository such as Wikimedia Commons.\n\nExample: http://test.wikipedia.org/wiki/File:Wiki.png#filelinks\n\nParameters:\n* $1 - the name of the shared repository. On wikimedia sites, $1 is {{msg-mw|Shared-repo-name-shared}}. The default value for $1 is {{msg-mw|Shared-repo}}.",
-    "shared-repo": "This message can be used as parameter <code>$1</code> in the following messages:\n* {{msg-mw|shared-repo-from}}\n* {{msg-mw|sharedupload}}\n* {{msg-mw|sharedupload-desc-here}}\n* {{msg-mw|sharedupload-desc-there}}",
-    "shared-repo-name-wikimediacommons": "{{optional}}\n{{Identical|Wikimedia Commons}}",
+    "shared-repo": "This message can be used as parameter <code>$1</code> in the following messages:\n* {{msg-mw|view-foreign}}\n* {{msg-mw|shared-repo-from}}\n* {{msg-mw|sharedupload}}\n* {{msg-mw|sharedupload-desc-here}}\n* {{msg-mw|sharedupload-desc-there}}",
+    "shared-repo-name-wikimediacommons": "{{optional}}\n\nA specific version of {{msg-mw|shared-repo}}; see [[MediaWiki:Shared-repo/qqq]] for more information.\n\n{{Identical|Wikimedia Commons}}",
     "filepage.css": "{{Optional}}",
     "upload-disallowed-here": "This message appears on an image page in place of the normal reupload link if they cannot upload - e.g. if the image page is upload protected and they do not have the right privilege.",
     "filerevert": "Used as page title. Parameters:\n* $1 - page title\n{{Identical|Revert}}",
     "mimetype": "Used as label for input box in the MIMESearch form on [[Special:MIMESearch]].\n\nSee also:\n* {{msg-mw|Mimesearch|page title}}\n* {{msg-mw|Ilsubmit|Submit button text}}\n{{Identical|MIME type}}",
     "download": "Direct download link in each line returned by [[Special:MIMESearch]]. Points to the actual file, rather than the image description page.\n{{Identical|Download}}",
     "unwatchedpages": "{{doc-special|UnwatchedPages}}",
+    "unwatchedpages-summary": "{{doc-specialpagesummary|unwatchedpages}}",
     "listredirects": "{{doc-special|ListRedirects}}",
+    "listredirects-summary": "{{doc-specialpagesummary|listredirects}}",
     "listduplicatedfiles": "{{doc-special|ListDuplicatedFiles}}",
     "listduplicatedfiles-summary": "Summary at top of Special:ListDuplicatedFiles",
     "listduplicatedfiles-entry": "A list item on [[Special:ListDuplicatedFiles]]. Parameters:\n* $1 - the file name (no namespace prefix)\n* $2 - the number of duplicates this file has\n* $3 - the name of the duplicate search page (aka \"Special:FileDuplicateSearch/Foo.png\" or \"Spécial:Recherche_fichier_en_double/Firefox.png\")",
     "unusedtemplates": "{{doc-special|UnusedTemplates}}",
+    "unusedtemplates-summary": "{{doc-specialpagesummary|unusedtemplates}}",
     "unusedtemplatestext": "Shown on top of [[Special:Unusedtemplates]]",
     "unusedtemplateswlh": "Used as link text in [[Special:UnusedTemplates]].\n\nThe link points to the \"What links here\" page.",
     "randompage": "{{doc-special|RandomPage}}\nSee also:\n* {{msg-mw|Randompage}}\n* {{msg-mw|Accesskey-n-randompage}}\n* {{msg-mw|Tooltip-n-randompage}}\n{{Identical|Random page}}",
     "randompage-nopages": "Parameters:\n* $1 - list of namespaces\n* $2 - number of namespaces, for PLURAL support\nSee also:\n* {{msg-mw|Randomredirect-nopages}}",
+    "randompage-url": "{{notranslate}}",
     "randomincategory": "{{doc-special|RandomInCategory}}",
     "randomincategory-invalidcategory": "Message shown if an invalid category is specified.\n\nParameters:\n* $1 - the invalid category name given\n\n(Note, if the category is simply empty, but could possibly exist, {{msg-mw|randomincategory-nopages}} is shown instead)",
     "randomincategory-nopages": "Message shown from [[Special:RandomInCategory]] if the category is empty.\n\nParameters:\n* $1 - the category name (without the namespace prefix)",
     "randomredirect": "{{doc-special|RandomRedirect}}",
     "randomredirect-nopages": "Parameters:\n* $1 - list of namespaces\n* $2 - (Unused) number of namespaces\nSee also:\n* {{msg-mw|Randompage-nopages}}",
     "statistics": "{{doc-special|Statistics}}\n{{Identical|Statistics}}",
+    "statistics-summary": "{{doc-specialpagesummary|statistics}}",
     "statistics-header-pages": "Used in [[Special:Statistics]]",
     "statistics-header-edits": "Used in [[Special:Statistics]]",
     "statistics-header-views": "Used in [[Special:Statistics]]",
     "statistics-users-active": "Used in [[Special:Statistics]]",
     "statistics-users-active-desc": "Description shown beneath ''Active users'' in [[Special:Statistics]]. Parameters:\n* $1 - Value of <code>$wgRCMaxAge</code> in days",
     "statistics-mostpopular": "Used in [[Special:Statistics]]",
+    "statistics-footer": "{{notranslate}}",
     "pageswithprop": "{{doc-special|PagesWithProp}}\n{{Identical|Page with page property}}",
+    "pageswithprop-summary": "{{doc-specialpagesummary|pageswithprop}}",
     "pageswithprop-legend": "Legend for the input form on [[Special:PagesWithProp]].\n{{Identical|Page with page property}}",
     "pageswithprop-text": "Introductory text for the input form on [[Special:PagesWithProp]]",
     "pageswithprop-prop": "Label for the property name input field on [[Special:PagesWithProp]].\n{{Identical|Property name}}",
     "pageswithprop-prophidden-long": "Information shown on [[Special:PagesWithProp]] when property value is longer than 1 kilobyte.\n\nParameters:\n* $1 - size of property value in kilobytes\nSee also:\n* {{msg-mw|pageswithprop-prophidden-binary}}",
     "pageswithprop-prophidden-binary": "Information shown on [[Special:PagesWithProp]] when property value contains binary data.\n\nParameters:\n* $1 - size of property value in kilobytes\nSee also:\n* {{msg-mw|pageswithprop-prophidden-long}}",
     "doubleredirects": "{{doc-special|DoubleRedirects}}",
+    "doubleredirects-summary": "{{doc-specialpagesummary|doubleredirects}}",
     "doubleredirectstext": "Shown on top of [[Special:Doubleredirects]]",
     "double-redirect-fixed-move": "This is the message in the log when the software (under the username {{msg-mw|Double-redirect-fixer}}) updates the redirects after a page move.\n\nParameters:\n* $1 - redirect page title\n* $2 - new page title\nSee also:\n* {{msg-mw|Fix-double-redirects}}\n* {{msg-mw|Double-redirect-fixed-maintenance}}",
     "double-redirect-fixed-maintenance": "This is the message in the log when the software (under the username {{msg-mw|Double-redirect-fixer}}) updates the redirects after running maintenance/fixDoubleRedirects.php.\n\nParameters:\n* $1 - redirect page title\n* $2 - new page title\nSee also:\n* {{msg-mw|Double-redirect-fixed-move}}",
     "double-redirect-fixer": "This is the '''username''' of the user who updates the double redirects after a page move.\n\nA user is created with this username, so it is perhaps better to not change this message too often.\n\nSee also:\n* {{msg-mw|Double-redirect-fixed-move}}\n* {{msg-mw|Fix-double-redirects}}",
     "brokenredirects": "{{doc-special|BrokenRedirects}}",
+    "brokenredirects-summary": "{{doc-specialpagesummary|brokenredirects}}",
     "brokenredirectstext": "Shown on top of [[Special:BrokenRedirects]].",
     "brokenredirects-edit": "Link in [[Special:BrokenRedirects]]\n\n{{Identical|Edit}}",
     "brokenredirects-delete": "Link in [[Special:BrokenRedirects]] for admins\n\n{{Identical|Delete}}",
     "withoutinterwiki-legend": "Used on [[Special:WithoutInterwiki]] as title of fieldset.",
     "withoutinterwiki-submit": "{{Identical|Show}}",
     "fewestrevisions": "{{doc-special|FewestRevisions}}",
+    "fewestrevisions-summary": "{{doc-specialpagesummary|fewestrevisions}}",
     "nbytes": "Message used on the history page of a wiki page. Each version of a page consist of a number of bytes. $1 is the number of bytes that the page uses. Uses plural as configured for a language based on $1.",
     "ncategories": "Used in the special page '[[Special:MostCategories]]' in brackets after each entry on the list signifying how many categories a page is part of. $1 is the number of categories.",
     "ninterwikis": "Used in the special page '[[Special:MostInterwikis]]' in brackets after each entry on the list signifying how many interwikis a page is part of.\n\nParameters:\n* $1 - the number of interwiki links",
     "ntransclusions": "Used on [[Special:MostLinkedTemplates]] to indicate how often a template is in use.\n\nParameters:\n* $1 - number of pages\nSee also:\n* {{msg-mw|Nimagelinks}}",
     "specialpage-empty": "Used on a special page when there is no data. For example on [[Special:Unusedimages]] when all images are used.",
     "lonelypages": "{{doc-special|LonelyPages}}",
+    "lonelypages-summary": "{{doc-specialpagesummary|lonelypages}}",
     "lonelypagestext": "Text displayed in [[Special:LonelyPages]]",
     "uncategorizedpages": "{{doc-special|UncategorizedPages}}",
+    "uncategorizedpages-summary": "{{doc-specialpagesummary|uncategorizedpages}}",
     "uncategorizedcategories": "{{doc-special|UncategorizedCategories}}",
+    "uncategorizedcategories-summary": "{{doc-specialpagesummary|uncategorizedcategories}}",
     "uncategorizedimages": "{{doc-special|UncategorizedImages}}",
+    "uncategorizedimages-summary": "{{notranslate}}\nused in [[Special:Uncategorizedimages]]. [[mw:Manual:Interface/Special pages summary|mw manual]].",
     "uncategorizedtemplates": "{{doc-special|UncategorizedTemplates}}",
+    "uncategorizedtemplates-summary": "{{doc-specialpagesummary|uncategorizedtemplates}}",
     "unusedcategories": "{{doc-special|UnusedCategories}}",
+    "unusedcategories-summary": "{{doc-specialpagesummary|unusedcategories}}",
     "unusedimages": "{{doc-special|UnusedImages}}",
+    "unusedimages-summary": "{{doc-specialpagesummary|unusedimages}}",
     "popularpages": "{{doc-special|PopularPages}}",
+    "popularpages-summary": "{{doc-specialpagesummary|popularpages}}",
     "wantedcategories": "{{doc-special|WantedCategories}}",
+    "wantedcategories-summary": "{{doc-specialpagesummary|wantedcategories}}",
     "wantedpages": "{{doc-special|WantedPages}}",
+    "wantedpages-summary": "{{doc-specialpagesummary|wantedpages}}",
     "wantedpages-badtitle": "Error message shown when [[Special:WantedPages]] is listing a page with a title that shouldn't exist.\n\nParameters:\n* $1 - a page title",
     "wantedfiles": "{{doc-special|WantedFiles}}",
+    "wantedfiles-summary": "{{doc-specialpagesummary|wantedfiles}}",
     "wantedfiletext-cat": "Message displayed at top of [[special:WantedFiles]]. $1 contains the name of the tracking category for broken files (Including Category prefix). {{msg-mw|wantedfiletext-nocat}} is used if the tracking category is disabled.",
     "wantedfiletext-nocat": "Message displayed at top of [[special:WantedFiles]] when broken file tracking category is disabled. See {{msg-mw|wantedfiletext-cat}}.",
     "wantedtemplates": "{{doc-special|WantedTemplates}}",
+    "wantedtemplates-summary": "{{doc-specialpagesummary|wantedtemplates}}",
     "mostlinked": "{{doc-special|MostLinked}}",
+    "mostlinked-summary": "{{doc-specialpagesummary|mostlinked}}",
     "mostlinkedcategories": "{{doc-special|MostLinkedCategories}}",
+    "mostlinkedcategories-summary": "{{doc-specialpagesummary|mostlinkedcategories}}",
     "mostlinkedtemplates": "{{doc-special|MostLinkedTemplates}}",
+    "mostlinkedtemplates-summary": "{{doc-specialpagesummary|mostlinkedtemplates}}",
     "mostcategories": "{{doc-special|MostCategories}}",
+    "mostcategories-summary": "{{doc-specialpagesummary|mostcategories}}",
     "mostimages": "{{doc-special|MostImages}}",
+    "mostimages-summary": "{{notranslate}}\nThe summary displayed at the top of [[Special:Mostimages]]. [[mw:Manual:Interface/Special pages summary|mw manual]].",
     "mostinterwikis": "{{doc-special|MostInterwikis}}",
+    "mostinterwikis-summary": "{{doc-specialpagesummary|mostinterwikis}}",
     "mostrevisions": "{{doc-special|MostRevisions}}",
+    "mostrevisions-summary": "{{notranslate}}\nThe summary displayed at the top of [[Special:Mostrevisions]]. [[mw:Manual:Interface/Special pages summary|mw manual]].",
     "prefixindex": "{{doc-special|PrefixIndex}}\nWhen the user limits the list to a certain namespace, {{msg-mw|allinnamespace}} is used instead.",
     "prefixindex-namespace": "The page title of [[Special:PrefixIndex]] limited to a specific namespace. Similar to {{msg-mw|allinnamespace}}. $1 is the name of the namespace",
+    "prefixindex-summary": "{{notranslate}}\n\nThe summary displayed at the top of [[Special:Prefixindex]]. [[mw:Manual:Interface/Special pages summary|MediaWiki manual]].",
     "prefixindex-strip": "Label for a checkbox. If the checkbox is checked, the prefix searched will be removed from the title displayed in the list. Used in [[Special:PrefixIndex]].\n\nSee the following search results:\n* [{{canonicalurl:Special:PrefixIndex|prefix=Doc&namespace=10}} Special:PrefixIndex?prefix=Doc&namespace=10] (prefix NOT stripped)\n* [{{canonicalurl:Special:PrefixIndex|prefix=Doc&namespace=10&stripprefix=1}} Special:PrefixIndex?prefix=Doc&namespace=10&stripprefix=1] (prefix stripped)",
     "shortpages": "{{doc-special|ShortPages}}",
+    "shortpages-summary": "{{notranslate}}\nThe summary displayed at the top of [[Special:Shortpages]]. [[mw:Manual:Interface/Special pages summary|mw manual]].",
     "longpages": "{{doc-special|LongPages}}",
+    "longpages-summary": "{{notranslate}}\nThe summary displayed at the top of [[Special:Longpages]]. [[mw:Manual:Interface/Special pages summary|mw manual]].",
     "deadendpages": "{{doc-special|DeadendPages}}",
+    "deadendpages-summary": "{{notranslate}}\nThe summary displayed at the top of [[Special:Deadendpages]]. [[mw:Manual:Interface/Special pages summary|mw manual]].",
     "deadendpagestext": "Introductory text for [[Special:DeadendPages]]",
     "protectedpages": "{{doc-special|ProtectedPages}}",
     "protectedpages-indef": "Option in [[Special:ProtectedPages]]",
     "protectedpages-reason": "This is a column header in the table on the page [[Special:ProtectedPages]].\n{{Identical|Reason}}",
     "protectedpages-unknown-timestamp": "This is shown, when the date and time is unknown for a protection on the page [[Special:ProtectedPages]].\n{{Identical|Unknown}}",
     "protectedpages-unknown-performer": "This is shown, when the protecting user is unknown for a protection on the page [[Special:ProtectedPages]].",
+    "protectedpages-unknown-reason": "{{ignored}}Comment used for extremely old protection log events (before there was a reason field).",
     "protectedtitles": "{{doc-special|ProtectedTitles}}",
     "protectedtitles-summary": "Summary of [[Special:ProtectedTitles]].\n\nSee also:\n* {{msg-mw|Protectedpages-summary}}",
     "protectedtitlesempty": "Used on [[Special:ProtectedTitles]]. This text appears if the list of protected titles is empty. See the [[mw:Project:Protected_titles|help page on MediaWiki]] for more information.",
     "listusers": "{{doc-special|ListUsers}}",
+    "listusers-summary": "{{notranslate}}\nThe summary displayed at the top of [[Special:Listusers]]. [[mw:Manual:Interface/Special pages summary|mw manual]].",
     "listusers-editsonly": "Option in [[Special:ListUsers]].",
     "listusers-creationsort": "Option in [[Special:ListUsers]].",
     "listusers-desc": "Used as label for the checkbox.",
     "usereditcount": "Shown behind every username on [[Special:ListUsers]]. Parameters:\n* $1 - number of edits",
     "usercreated": "Used in [[Special:ListUsers]]. Parameters:\n* $1 - a date\n* $2 - a time\n* $3 - the name of the user, for use in GENDER",
     "newpages": "{{doc-special|NewPages}}\n{{Identical|New page}}",
+    "newpages-summary": "{{notranslate}}\nThe summary displayed at the top of [[Special:Newpages]]. [[mw:Manual:Interface/Special pages summary|mw manual]].",
     "newpages-username": "{{Identical|Username}}",
     "ancientpages": "{{doc-special|AncientPages}}\nSee [[mw:Manual:Interface/Special pages title|manual]].",
+    "ancientpages-summary": "{{doc-specialpagesummary|ancientpages}}",
     "move": "Name of Move tab. Should be in the imperative mood.\n\nSee also:\n* {{msg-mw|Move}}\n* {{msg-mw|Accesskey-ca-move}}\n* {{msg-mw|Tooltip-ca-move}}\n{{Identical|Move}}",
     "movethispage": "{{Identical|Move this page}}",
     "unusedimagestext": "Header message of [[Special:UnusedFiles]]",
     "suppress": "{{Identical|Oversight}}",
     "querypage-disabled": "On special pages that use expensive database queries but are not cacheable, this message is displayed when 'miser mode' is on (i.e. no expensive queries allowed).",
     "booksources": "{{doc-special|BookSources}}\n\n'''This message shouldn't be changed unless it has serious mistakes.'''\n\nIt's used as the page name of the configuration page of [[Special:BookSources]]. Changing it breaks existing sites using the default version of this message.\n\nSee also:\n* {{msg-mw|Booksources|title}}\n* {{msg-mw|Booksources-text|text}}",
+    "booksources-summary": "{{doc-specialpagesummary|booksources}}",
     "booksources-search-legend": "Box heading on [[Special:BookSources|book sources]] special page. The box is for searching for places where a particular book can be bought or viewed.",
     "booksources-isbn": "{{optional}}\nThis is a label that appears before a text input field on the Special:BookSources page.\n{{Identical|ISBN}}",
     "booksources-go": "Name of button in [[Special:BookSources]]\n\n{{Identical|Go}}",
     "booksources-text": "Used in [[Special:BookSources/1]].\n\nThis message is followed by a list of links to other sites.\n\nSee also:\n* {{msg-mw|Booksources|title}}\n* {{msg-mw|Booksources-text|text}}",
     "booksources-invalid-isbn": "This message is displayed after an invalid ISBN is entered on [[Special:Booksources]].",
+    "rfcurl": "{{notranslate}}\nParameters:\n* $1 - RFC number\nSee also:\n* {{msg-mw|Pubmedurl}}",
+    "pubmedurl": "{{notranslate}}\nParameters:\n* $1 - Pubmed number\nSee also:\n* {{msg-mw|Rfcurl}}",
     "specialloguserlabel": "Used in [[Special:Log]] as a label for an input field with which the log can be filtered for entries describing actions ''performed'' by the specified user.  \"Carried out\" and \"done\" are possible alternatives for \"performed\".",
     "speciallogtitlelabel": "Used in [[Special:Log]] as a label for an input field with which the log can be filtered.  This filter selects for pages or users on which a log action was performed.",
     "log": "{{doc-special|Log}}",
     "log-title-wildcard": "* Appears in: [[Special:Log]]\n* Description: A check box to enable prefix search option",
     "showhideselectedlogentries": "Text of the button which brings up the [[mw:RevisionDelete|RevisionDelete]] menu on [[Special:Log]].",
     "allpages": "{{doc-special|AllPages}}\nFirst part of the navigation bar for the special page [[Special:AllPages]] and [[Special:PrefixIndex]].\nThe other parts are {{msg-mw|Prevpage}} and {{msg-mw|Nextpage}}.\n{{Identical|All pages}}",
+    "allpages-summary": "{{doc-specialpagesummary|allpages}}",
     "alphaindexline": "Used on [[Special:AllPages]] if the main namespace contains more than 960 pages. Indicates the page range displayed behind the link. \"from page $1 to page $2\". $1 is the source page name. $1 is the target page name.",
     "nextpage": "Third part of the navigation bar for the special page [[Special:AllPages]] and [[Special:PrefixIndex]]. $1 is a page title. The other parts are {{msg-mw|Allpages}} and {{msg-mw|Prevpage}}.\n\n{{Identical|Next page}}",
     "prevpage": "Second part of the navigation bar for the special page [[Special:AllPages]] and [[Special:PrefixIndex]]. $1 is a page title. The other parts are {{msg-mw|Allpages}} and {{msg-mw|Nextpage}}.\n\n{{Identical|Previous page}}",
     "cachedspecial-viewing-cached-ts": "Message notifying they are watching a cached page. This is a message displayed on special pages (contaning lists of pages with certain properties) that are served from the cache, as opposed to having been compiled run-time. This means that the displayed data may differ from the current situation.",
     "cachedspecial-refresh-now": "Link text pointing to the most recent version of the page.",
     "categories": "The page name of [[Special:Categories]].\n{{Identical|Category}}",
+    "categories-summary": "{{doc-specialpagesummary|categories}}",
     "categoriespagetext": "{{doc-important|Do not translate or change links.}}\nText displayed in [[Special:Categories]].\n\nIn order to translate \"Unused categories\" and \"wanted categories\" see {{msg-mw|Unusedcategories}} and {{msg-mw|Wantedcategories}}.\n\nParameters:\n* $1 - number of categories",
     "categoriesfrom": "Used as label for the input box in [[Special:Categories]].\n\nThis message follows the fieldset label {{msg-mw|categories}}, and is followed by the input box.",
     "special-categories-sort-count": "Commented out at this time.\n\nThis message is used on [[Special:Categories]] to sort the list by the number of members in the categories.\n\nSee also:\n* {{msg-mw|Special-categories-sort-abc}}",
     "special-categories-sort-abc": "Commented out at this time.\n\nThis message is used on [[Special:Categories]] to sort the list by the category name.\n\nSee also:\n* {{msg-mw|Special-categories-sort-count}}",
     "deletedcontributions": "The message is shown as a link on [[Special:SpecialPages]] to [[Special:DeletedContributions]].\n\n{{Identical|Deleted user contributions}}",
+    "deletedcontributions-summary": "{{doc-specialpagesummary|deletedcontributions}}",
     "deletedcontributions-title": "Title of [[Special:DeletedContributions]] (extension), a special page with a list of edits to pages which were deleted. Only viewable by sysops.\n\n{{Identical|Deleted user contributions}}",
     "sp-deletedcontributions-contribs": "Link to user's contributions on [[Special:DeletedContributions]].\n{{Identical|Contribution}}",
     "linksearch": "Title of [[Special:LinkSearch|special page]] and legend of fieldset on that page.\n\n{{Identical|External link}}",
+    "linksearch-summary": "{{doc-specialpagesummary|linksearch}}",
     "linksearch-pat": "Legend for input box on [[Special:LinkSearch]].",
     "linksearch-ns": "Legend for dropdown box on [[Special:LinkSearch|special page]].\n\n{{Identical|Namespace}}",
     "linksearch-ok": "Button label on [[Special:LinkSearch|special page]]e\n\n{{Identical|Search}}",
     "listusers-noresult": "identical with {{msg-mw|activeusers-noresult}}",
     "listusers-blocked": "Used on [[Special:ActiveUsers]] when a user has been blocked. Parameters:\n* $1 - (Optional) a user name for use with GENDER\n{{Identical|Blocked}}",
     "activeusers": "Title of [[Special:ActiveUsers]]",
+    "activeusers-summary": "{{doc-specialpagesummary|activeusers}}",
     "activeusers-intro": "Used as introduction in [[Special:ActiveUsers]]. Parameters:\n* $1 - number of days (<code>$wgActiveUserDays</code>)",
     "activeusers-count": "Used in [[Special:ActiveUsers]] to show the active user's recent action count in brackets ([]).\n* $1 is the number of recent actions\n* $2 is the user's name for use with GENDER (optional)\n* $3 is the maximum number of days of the RecentChangesList",
     "activeusers-from": "Used as label for checkbox in the form on [[Special:ActiveUsers]].\n\nidentical with {{msg-mw|listusersfrom}}\n\nSee also:\n* {{msg-mw|activeusers|legend for the form}}\n* {{msg-mw|activeusers-hidebots|label for checkbox}}\n* {{msg-mw|activeusers-hidesysops|label for checkbox}}",
     "listgrouprights-removegroup-self": "This is an individual right for groups, used on [[Special:ListGroupRights]].\n* $1 - the group names\n* $2 - the number of group names in $1",
     "listgrouprights-addgroup-self-all": "Used on [[Special:ListGroupRights]].\n{{Related|Listgrouprights}}",
     "listgrouprights-removegroup-self-all": "Used on [[Special:ListGroupRights]].\n{{Related|Listgrouprights}}",
+    "listgrouprights-namespaceprotection-header": "Shown on [[Special:ListGroupRights]] as the header for the namespace restrictions table.",
+    "listgrouprights-namespaceprotection-namespace": "Shown on [[Special:ListGroupRights]] as the 'namespace' column header for the namespace restrictions table.\n{{Identical|Namespace}}",
+    "listgrouprights-namespaceprotection-restrictedto": "Shown on [[Special:ListGroupRights]] as the \"right(s) allowing user to edit\" column header for the namespace restrictions table.",
+    "trackingcategories": "[[Special:TrackingCategories]] page implementing list of Tracking categories [[mw:Special:MyLanguage/Help:Tracking categories|tracking category]].\n{{Identical|Tracking category}}",
+    "trackingcategories-summary": "Description for [[Special:TrackingCategories]] page [[mw:Help:Tracking categories|tracking category]]",
+    "trackingcategories-msg": "Header for the message column of the table on [[Special:TrackingCategories]]. This column lists the mediawiki message that controls the tracking category in question.\n{{Identical|Tracking category}}",
+    "trackingcategories-name": "Header for the message column of the table on [[Special:TrackingCategories]]. This column lists the name of the tracking category in the content language.",
+    "trackingcategories-desc": "Header for the message column of the table on [[Special:TrackingCategories]]. This column lists the inclusion criteria for the category.",
+    "noindex-category-desc": "No-index category-description. Shown on [[Special:TrackingCategories]].\n\nSee also:\n* {{msg-mw|Noindex-category}}",
+    "index-category-desc": "Index category-description. Shown on [[Special:TrackingCategories]].\n\nSee also:\n* {{msg-mw|Index-category}}",
+    "post-expand-template-inclusion-category-desc": "Post expand template inclusion category description. Shown on [[Special:TrackingCategories]].\n\nSee also:\n* {{msg-mw|Post-expand-template-inclusion-category}}",
+    "post-expand-template-argument-category-desc": "Post expand template argument category description. Shown on [[Special:TrackingCategories]].\n\nSee also:\n* {{msg-mw|Post-expand-template-argument-category}}",
+    "expensive-parserfunction-category-desc": "Expensive parserfunction category description. Shown on [[Special:TrackingCategories]].\n\nSee also:\n* {{msg-mw|Expensive-parserfunction-category}}",
+    "broken-file-category-desc": "Broken file category description. Shown on [[Special:TrackingCategories]].\n\nSee also:\n* {{msg-mw|Broken-file-category}}",
+    "hidden-category-category-desc": "Hidden-category category description. Shown on [[Special:TrackingCategories]].\n\nSee also:\n* {{msg-mw|Hidden-category-category}}",
+    "trackingcategories-nodesc": "Tracking category description not available message",
+    "trackingcategories-disabled": "This message is used as the contents of the column \"Tracking category\" on [[Special:TrackingCategories]] when a particular tracking category has been disabled.",
     "mailnologin": "Used in [[Special:EmailUser]].\n\nUsed as title of the error message {{msg-mw|Mailnologintext}}.",
     "mailnologintext": "Used as error message in [[Special:EmailUser]].\n\nThe title of this error message is {{msg-mw|Mailnologin}}.",
     "emailuser": "Link in the sidebar to send an e-mail to a user.\n\nSee also:\n* {{msg-mw|Emailuser}}\n* {{msg-mw|Accesskey-t-emailuser}}\n* {{msg-mw|Tooltip-t-emailuser}}",
     "emailuser-title-target": "{{doc-special|EmailUser|unlisted=1}}\nUsed when a user was given to e-mail. Parameters:\n* $1 - a plain text username, used for GENDER.",
     "emailuser-title-notarget": "{{doc-special|EmailUser|unlisted=1}}\nUsed when no user given to e-mail yet.",
+    "emailuser-summary": "{{doc-specialpagesummary|emailuser}}",
     "emailpage": "Title of special page [[Special:EmailUser]], when it is the destination of the sidebar link {{msg-mw|Emailuser}} on a user's page.",
     "emailpagetext": "This is the text that is displayed above the email form on [[Special:EmailUser]].\n\nSpecial:EmailUser appears when you click on the link \"Email this user\" in the sidebar, but only if there is an email address in the recipient's user preferences. If there isn't then the message {{msg-mw|Noemailtext}} will appear instead of Special:EmailUser.\n\nParameters:\n* $1 - username",
     "defemailsubject": "The default subject of EmailUser emails. Parameters:\n* $1 - the username of the user sending the email and can be used for GENDER",
     "usermessage-editor": "The user name for the user that is the editor of system messages. See [{{canonicalurl:Thread:Support/Message_info_please}} discussion on Support].",
     "usermessage-template": "{{optional}}",
     "watchlist": "{{Identical|Watchlist}}",
+    "watchlist-summary": "{{doc-specialpagesummary|watchlist}}",
     "mywatchlist": "Link at the upper right corner of the screen.\n\nSee also:\n* {{msg-mw|Mywatchlist}}\n* {{msg-mw|Accesskey-pt-watchlist}}\n* {{msg-mw|Tooltip-pt-watchlist}}\n{{Identical|Watchlist}}",
     "watchlistfor2": "Subtitle on [[Special:Watchlist]].\nParameters:\n* $1 - Username of current user\n* $2 - Tool links (View relevant changes | View and edit watchlist | Edit raw watchlist)\n{{Identical|For $1}}",
     "nowatchlist": "Displayed when there is no pages in the watchlist.",
     "watchlistanontext": "Parameters:\n* $1 - a link to [[Special:UserLogin]] with {{msg-mw|loginreqlink}} as link description",
     "watchnologin": "Used as error page title.\n\nThe error message for this title is:\n* {{msg-mw|Watchnologintext}}\n{{Identical|Not logged in}}",
-    "watchnologintext": "Used as error message.\n\nThe title for this error is {{msg-mw|Watchnologin}}.",
     "addwatch": "Link to a dialog box, displayed at the end of the list of categories at the foot of each page.\n\nSee also:\n* {{msg-mw|Removewatch}}",
     "addedwatchtext": "Explanation shown when clicking on the {{msg-mw|Watch}} tab. Parameters:\n* $1 - page title\nSee also:\n* {{msg-mw|Addedwatch}}",
     "removewatch": "Link to a dialog box, displayed at the end of the list of categories at the foot of each page.\n\nSee also:\n* {{msg-mw|Addwatch}}",
     "restriction-level-autoconfirmed": "Used on [[Special:ProtectedPages]] and [[Special:ProtectedTitles]]. An option in the drop-down box 'Restriction level', and in brackets after each page name entry. See the [[mw:Project:Protected_titles|help page on MediaWiki]] and on [[meta:Protect|Meta]] for more information.\n\nSee also:\n*{{msg-mw|Restriction-level-sysop}}\n*{{msg-mw|Restriction-level-all}}",
     "restriction-level-all": "Used on [[Special:ProtectedPages]] and [[Special:ProtectedTitles]]. An option in the drop-down box 'Restriction level'. See the [[mw:Project:Protected_titles|help page on MediaWiki]] and on [[meta:Protect|Meta]] for more information.\n\nSee also:\n*{{msg-mw|Restriction-level-sysop}}\n*{{msg-mw|Restriction-level-autoconfirmed}}",
     "undelete": "{{doc-special|Undelete}}\nSee also:\n* {{msg-mw|Undelete}}\n* {{msg-mw|Accesskey-ca-undelete}}\n* {{msg-mw|Tooltip-ca-undelete}}\n{{Identical|View deleted pages}}",
+    "undelete-summary": "{{doc-specialpagesummary|undelete}}",
     "undeletepage": "Title of special page [[Special:Undelete]]. This special page is only visible to administrators.",
     "undeletepagetitle": "Used as introduction in [[Special:Undelete]]. Parameters:\n* $1 - page title",
     "viewdeletedpage": "Title of the [[Special:Undelete]].\n\n{{Identical|View deleted pages}}",
     "tooltip-namespace_association": "Used in [[Special:Recentchanges]] as a tooltip for the associated namespace checkbox.\n\nSee also:\n* {{msg-mw|Namespace association}}",
     "blanknamespace": "Name for main namespace (blank namespace) in drop-down menus at [[Special:RecentChanges]] and other special pages.\n{{Identical|Main}}",
     "contributions": "Display name for the 'User contributions', shown in the sidebar menu of all user pages and user talk pages.\n\nAlso the page name of the target page.\n\nThe target page shows an overview of the most recent contributions by a user.\n\nParameters:\n* $1 - username\n\nSee also:\n* {{msg-mw|Contributions}}\n* {{msg-mw|Accesskey-t-contributions}}\n* {{msg-mw|Tooltip-t-contributions}}",
+    "contributions-summary": "{{doc-specialpagesummary|contributions}}",
     "contributions-title": "{{Gender}}\nThe page title in your browser bar, but not the page title.\n\nParameters:\n* $1 - the username\nSee also:\n* {{msg-mw|Contributions}}",
     "mycontris": "In the personal urls page section - right upper corner.\n\nSee also:\n* {{msg-mw|Mycontris}}\n* {{msg-mw|Accesskey-pt-mycontris}}\n* {{msg-mw|Tooltip-pt-mycontris}}\n{{Identical|Contribution}}",
     "contribsub2": "Contributions for \"user\" (links). Parameters:\n* $1 is an IP address or a username, with a link which points to the user page (if registered user).\n* $2 is list of tool links. The list contains a link which has text {{msg-mw|Sp-contributions-talk}}.\n* $3 is a plain text username used for GENDER.\n{{Identical|For $1}}",
+    "contributions-userdoesnotexist": "This message is used in [[Special:Contributions]]. It is used to tell the user that the name he searched for doesn't exists.\n\nParameters:\n* $1 - a username\n\n{{identical|userdoesnotexist}}",
     "nocontribs": "Used in [[Special:Contributions]] and [[Special:DeletedContributions]].\n\nSee examples: [[Special:Contributions/x]] and [[Special:DeletedContributions/x]].\n\nParameters:\n* $1 - (Unused) the user name",
     "uctop": "This message is used in [[Special:Contributions]]. It is used to show that a particular edit was the last made to a page. Example: 09:57, 11 February 2008 (hist) (diff) Pagename‎ (edit summary) (current)\n{{Identical|Top}}",
     "month": "Used in [[Special:Contributions]] and history pages ([{{fullurl:Sandbox|action=history}} example]), as label for a dropdown box to select a specific month to view the edits made in that month, and the earlier months. See also {{msg-mw|year}}.",
     "sp-contributions-newbies-sub": "Note at the top of the page of results for a search on [[Special:Contributions]] where 'Show contributions for new accounts only' has been selected.",
     "sp-contributions-newbies-title": "The page title in your browser bar, but not the page title.\n\nSee also:\n* {{msg-mw|Sp-contributions-newbies-sub}}",
     "sp-contributions-blocklog": "Used as a display name for a link to the block log on for example [[Special:Contributions/Mediawiki default]]\n\nUsed as link title in [[Special:Contributions]] and in [[Special:DeletedContributions]].\n\nSee also:\n* {{msg-mw|Sp-contributions-talk}}\n* {{msg-mw|Change-blocklink}}\n* {{msg-mw|Unblocklink}}\n* {{msg-mw|Blocklink}}\n* {{msg-mw|Sp-contributions-uploads}}\n* {{msg-mw|Sp-contributions-logs}}\n* {{msg-mw|Sp-contributions-deleted}}\n* {{msg-mw|Sp-contributions-userrights}}\n{{Identical|Block log}}",
+    "sp-contributions-suppresslog": "Used as a display name for a link to log entries of suppressed edits made by that user.\n\nUsed as link title in [[Special:Contributions]] and in [[Special:DeletedContributions]].\n\nSee also {{msg-mw|sp-contributions-deleted}}, {{msg-mw|sp-deletedcontributions-contribs}}, {{msg-mw|contributions}}, {{msg-mw|deletedcontributions-title}}.",
     "sp-contributions-deleted": "This is a link anchor used in [[Special:Contributions]]/''name'', when user viewing the page has the right to delete pages, or to restore deleted pages.\n\nUsed as link title in [[Special:Contributions]].\n\nSee also:\n* {{msg-mw|Sp-contributions-talk}}\n* {{msg-mw|Change-blocklink}}\n* {{msg-mw|Unblocklink}}\n* {{msg-mw|Blocklink}}\n* {{msg-mw|Sp-contributions-blocklog}}\n* {{msg-mw|Sp-contributions-uploads}}\n* {{msg-mw|Sp-contributions-logs}}\n* {{msg-mw|Sp-contributions-userrights}}",
     "sp-contributions-uploads": "Used as link title in [[Special:Contributions]] and in [[Special:DeletedContributions]].\n\nSee also:\n* {{msg-mw|Sp-contributions-talk}}\n* {{msg-mw|Change-blocklink}}\n* {{msg-mw|Unblocklink}}\n* {{msg-mw|Blocklink}}\n* {{msg-mw|Sp-contributions-blocklog}}\n* {{msg-mw|Sp-contributions-logs}}\n* {{msg-mw|Sp-contributions-deleted}}\n* {{msg-mw|Sp-contributions-userrights}}\n{{Identical|Upload}}",
     "sp-contributions-logs": "Appears as an action link in the header of the Special:Contributions/''Username'' pages (e.g. \"For Somebody (talk | block log | logs)\").\n\nUsed as link title in [[Special:Contributions]] and in [[Special:DeletedContributions]].\n\nSee also:\n* {{msg-mw|Sp-contributions-talk}}\n* {{msg-mw|Change-blocklink}}\n* {{msg-mw|Unblocklink}}\n* {{msg-mw|Blocklink}}\n* {{msg-mw|Sp-contributions-blocklog}}\n* {{msg-mw|Sp-contributions-uploads}}\n* {{msg-mw|Sp-contributions-deleted}}\n* {{msg-mw|Sp-contributions-userrights}}",
     "sp-contributions-blocked-notice": "Shown on top of contributions special page of currently blocked users.\n\nParameters:\n* $1 - (Optional) the blocked user. Can be used for GENDER\nAnon version:\n* {{msg-mw|Sp-contributions-blocked-notice-anon}}",
     "sp-contributions-blocked-notice-anon": "Same as {{msg-mw|Sp-contributions-blocked-notice}} but for anonymous users.",
     "sp-contributions-search": "Used on [[Special:Contributions]]",
-    "sp-contributions-suppresslog": "Used as a display name for a link to log entries of suppressed edits made by that user.\n\nUsed as link title in [[Special:Contributions]] and in [[Special:DeletedContributions]].\n\nSee also {{msg-mw|sp-contributions-deleted}}, {{msg-mw|sp-deletedcontributions-contribs}}, {{msg-mw|contributions}}, {{msg-mw|deletedcontributions-title}}.",
     "sp-contributions-username": "This message appears whenever someone requests [[Special:Contributions]].\n{{Identical|IP address or username}}",
     "sp-contributions-toponly": "A checkbox at [[Special:Mycontributions|Special:Contributions]]",
     "sp-contributions-newonly": "Used as checkbox label at [[Special:Mycontributions|Special:Contributions]].\n\n\"page creation\" means the \"first revision\" of a page.\n\nPreceded by {{msg-mw|Sp-contributions-toponly}}.",
     "sp-contributions-submit": "{{Identical|Search}}",
     "sp-contributions-explain": "{{optional}}",
+    "sp-contributions-footer": "{{ignored}}This is the footer for users that are not anonymous or newbie on [[Special:Contributions]].",
+    "sp-contributions-footer-anon": "{{ignored}}This is the footer for anonymous users on [[Special:Contributions]].",
+    "sp-contributions-footer-newbies": "{{ignored}}This is the footer for newbie users on [[Special:Contributions]].",
     "whatlinkshere": "The text of the link in the toolbox (on the left, below the search menu) going to [[Special:WhatLinksHere]].\n\nSee also:\n* {{msg-mw|Whatlinkshere}}\n* {{msg-mw|Accesskey-t-whatlinkshere}}\n* {{msg-mw|Tooltip-t-whatlinkshere}}",
     "whatlinkshere-title": "Title of the special page [[Special:WhatLinksHere]]. This page appears when you click on the 'What links here' button in the toolbox. $1 is the name of the page concerned.",
+    "whatlinkshere-summary": "{{doc-specialpagesummary|whatlinkshere}}",
     "whatlinkshere-page": "{{Identical|Page}}",
     "linkshere": "This message is the header line of the [[Special:WhatLinksHere/$1]] page generated by clicking \"What links here\" in the sidebar toolbox.\n\nIt is followed by a navigation bar built using {{msg-mw|Viewprevnext}}.\n\nParameters:\n* $1 - page title",
     "nolinkshere": "Used in [[Special:WhatLinksHere]] if empty. Parameters:\n* $1 - page title\nSee also:\n* {{msg-mw|Nolinkshere-ns}}",
     "autoblockid": "Used as name of autoblock, instead of autoblocked IPs. Parameters:\n* $1 - autoblock ID",
     "block": "{{doc-special|Block}}\n{{Identical|Block user}}",
     "unblock": "{{doc-special|Unblock}}",
+    "unblock-summary": "{{doc-specialpagesummary|unblock}}",
     "blockip": "Used as the text of a link in the sidebar toolbox. Clicking this link takes you to [[Special:Block]], with a relevant username or IP address (e.g. \"Username\" on [[User talk:Username]], [[Special:Contributions/Username]], etc.) already filled in.\n\n{{Identical|Block user}}",
     "blockip-legend": "Legend/Header for the fieldset around the input form of [[Special:Block]].\n\n{{Identical|Block user}}",
     "blockiptext": "Used in the {{msg-mw|Blockip}} form in [[Special:Block]].\n\nRefers to {{msg-mw|Policy-url}}.\n\nThis message may follow the message {{msg-mw|Ipb-otherblocks-header}} and other block messages.\n\nSee also:\n* {{msg-mw|Unblockiptext}}",
     "blockipsuccesstext": "Used in [[Special:Block]].\nThe title (subject) for this message is {{msg-mw|Blockipsuccesssub}}.\n\nParameters:\n* $1 - username, can be used for GENDER",
     "ipb-blockingself": "Used as confirmation message in [[Special:Block]].\n\nSee also:\n* {{msg-mw|Ipb-confirmhideuser}}",
     "ipb-confirmhideuser": "Used as confirmation message in [[Special:Block]].\n\nSee also:\n* {{msg-mw|Ipb-blockingself}}",
+    "ipb-confirmaction": "Confirmation message displayed to users asking them to think again before really blocking someone.",
     "ipb-edit-dropdown": "Shown beneath the user block form on the right side. It is a link to {{msg-mw|Ipbreason-dropdown|notext=1}}.\n\nSee also:\n* {{msg-mw|Delete-edit-reasonlist}}\n* {{msg-mw|Protect-edit-reasonlist}}",
     "ipb-unblock-addr": "Used as page title in [[Special:Block]], if the target user is specified.\n\nParameters:\n* $1 - target username\n\nSee also:\n* {{msg-mw|Ipb-unblock}}",
     "ipb-unblock": "Used as page title in [[Special:Block]], if the target user is not specified.\n\nSee also:\n* {{msg-mw|Ipb-unblock-addr}}",
     "blocklist-by": "This is a column header in the table on the page [[Special:BlockList]].",
     "blocklist-params": "This is a column header in the table on the page [[Special:BlockList]].",
     "blocklist-reason": "This is a column header in the table on the page [[Special:BlockList]].\n\n{{Identical|Reason}}",
+    "blocklist-summary": "{{doc-specialpagesummary|blocklist}}",
     "ipblocklist-submit": "Used as Submit button text in the form on [[Special:BlockList]].\n\nSee also:\n* {{msg-mw|Ipblocklist-legend}}\n* {{msg-mw|Ipblocklist-submit}}\n{{Identical|Search}}",
     "ipblocklist-localblock": "[[File:Special IPBlockList new.png|thumb|Example]]\nUsed on [[Special:IPBlockList]] as header when global blocks exists too.",
     "ipblocklist-otherblocks": "[[File:Special IPBlockList new.png|thumb|Example]]\nUsed on [[Special:IPBlockList]] as header for other blocks, i.e. from GlobalBlocking or TorBlocks.\n\nParameters:\n* $1 - number of blocks\nSee also:\n* {{msg-mw|Ipb-otherblocks-header}}",
     "cant-see-hidden-user": "Used as (red) error message on [[Special:Block]] when you try to change (as sysop without the hideuser right) the block of a hidden user.",
     "ipbblocked": "Error message shown when a user tries to alter block settings when they are themselves blocked.",
     "ipbnounblockself": "Error message shown when a user without the <code>unblockself</code> right tries to unblock themself.",
+    "ipb-default-expiry": "{{ignored}}The default block expiry on the block form on [[Special:Block]].",
     "lockdb": "The title of the special page [[Special:LockDB]].\n\nAlso used as the title of the error message {{msg-mw|Databasenotlocked}} in [[Special:UnlockDB]].\n\nSee also:\n* {{msg-mw|Lockdb}}\n* {{msg-mw|Unlockdb}}\n* {{msg-mw|Lockfilenotwritable|error in Special:LockDB}}\n* {{msg-mw|Databasenotlocked|error in Special:UnlockDB}}\n{{Identical|Lock database}}",
     "unlockdb": "The title of the special page [[Special:UnlockDB]].\n\n{{Identical|Unlock database}}",
     "lockdbtext": "Used in the Lock form on [[Special:LockDB]].\n\nSee also:\n* {{msg-mw|Lockbtn}}\n* {{msg-mw|Unlockbtn}}\n* {{msg-mw|Lockdbtext}}\n* {{msg-mw|Unlockdbtext}}",
     "databasenotlocked": "Used as error message in [[Special:UnlockDB]].\nThe title of this error message is {{msg-mw|Lockdb}}.\n\nSee also:\n* {{msg-mw|Lockdb|title}}\n* {{msg-mw|Databasenotlocked|message}}",
     "lockedbyandtime": "Used as part of the message when a database is locked through [[Special:LockDB]]. Parameters:\n* $1 is the user that locked the database.\n* $2 is the date on which the lock was made\n* $3 is the time at which the lock was made",
     "move-page": "Used as page title of [[Special:MovePage]] to move pages.\n\nSee example: [[Special:MovePage/Portal:En]].\n\nParameters:\n* $1 - the name of the page to be moved (without link)",
+    "movepage-summary": "{{doc-specialpagesummary|movepage}}",
     "move-page-legend": "Legend of the fieldset around the input form of [[Special:MovePage/testpage]].\n\nSee also:\n* {{msg-mw|movearticle|label for old title}}\n* {{msg-mw|newtitle|label for new title}}\n* {{msg-mw|movereason|label for textarea}}\n* {{msg-mw|movetalk|label for checkbox}}\n* {{msg-mw|move-leave-redirect|label for checkbox}}\n* {{msg-mw|fix-double-redirects|label for checkbox}}\n* {{msg-mw|move-subpages|label for checkbox}}\n* {{msg-mw|move-talk-subpages|label for checkbox}}\n* {{msg-mw|move-watch|label for checkbox}}\n{{Identical|Move page}}",
     "movepagetext": "Introduction shown when moving a page ([[Special:MovePage]]).\n\nSpecial pages mentioned: {{msg-mw|Doubleredirects}}, {{msg-mw|Brokenredirects}}\n\nSee also:\n* {{msg-mw|Movepagetext-noredirectfixer}}",
     "movepagetext-noredirectfixer": "A variant of the following message ''Movepagetext'' displayed when the automatic redirect fixer is not enabled.\n\nSpecial pages mentioned: {{msg-mw|Doubleredirects}}, {{msg-mw|Brokenredirects}}\n\nSee also:\n* {{msg-mw|Movepagetext}}",
     "movesubpagetext": "Used in [[Special:MovePage]]. Parameters:\n* $1 - number of subpages\nSee also:\n* {{msg-mw|movesubpage|section header}}\n* {{msg-mw|movenosubpage|without subpage}}",
     "movenosubpage": "See also:\n* {{msg-mw|movesubpage|section header}}\n* {{msg-mw|movenosubpage|without subpage}}\n* {{msg-mw|movesubpagetext|with subpages}}",
     "movereason": "Used in [[Special:MovePage]]. The text for the inputbox to give a reason for the page move.\n\nSee also:\n* {{msg-mw|Move-page-legend|legend for the form}}\n* {{msg-mw|Movearticle|label for old title}}\n* {{msg-mw|Newtitle|label for new title}}\n* {{msg-mw|Movetalk|label for checkbox}}\n* {{msg-mw|Move-leave-redirect|label for checkbox}}\n* {{msg-mw|Fix-double-redirects|label for checkbox}}\n* {{msg-mw|Move-subpages|label for checkbox}}\n* {{msg-mw|Move-talk-subpages|label for checkbox}}\n* {{msg-mw|Move-watch|label for checkbox}}\n{{Identical|Reason}}",
+    "move-redirect-text": "{{ignored}}The text that's added to a redirected page when that redirect is created.",
     "revertmove": "{{Identical|Revert}}",
     "delete_and_move": "Button text on the move page when the target page already exists.",
     "delete_and_move_text": "Used when moving a page, but the destination page already exists and needs deletion.\n\nThis message is to confirm that you really want to delete the page.\n\nParameters:\n* $1 - the destination page title\n\nSee also:\n* {{msg-mw|Delete and move confirm}}",
     "move-over-sharedrepo": "Notice when a file with that filename already exists on a shared repository, such as Wikimedia Commons.\n\nParameters:\n* $1 - the destination page title",
     "file-exists-sharedrepo": "Used in [[Special:MovePage]].",
     "export": "Page title of [[Special:Export]], a page where a user can export pages from a wiki to a file.",
+    "export-summary": "{{doc-specialpagesummary|export}}",
     "exporttext": "{{doc-important|Leave the line <code><nowiki>[[{{#Special:Export}}/{{MediaWiki:Mainpage}}]]</nowiki></code> exactly as it is!}}\nMain text on [[Special:Export]].\n\nRefers to {{msg-mw|Mainpage}}.",
     "exportall": "A label of checkbox option in [[Special:Export]]",
     "exportcuronly": "A label of checkbox option in [[Special:Export]]",
     "thumbnail_image-missing": "This is the parameter 1 of the message {{msg-mw|thumbnail error}}.\n*$1 is the path incl. filename of the missing image",
     "thumbnail_image-failure-limit": "Used as <code>$1</code> in {{msg-mw|Thumbnail error}}.\n\nParameters:\n* $1 - the maximum allowed number of failed attempts",
     "import": "The title of the special page [[Special:Import]];",
+    "import-summary": "{{doc-specialpagesummary|import}}",
     "importinterwiki": "Used as legend for the Import form in [[Special:Import]].",
     "import-interwiki-text": "Used as summary for the Import form in [[Special:Import]].",
     "import-interwiki-source": "Used as label for input box in [[Special:Import]].",
     "importuploaderrorsize": "Used as error message when importing from file.\n\nSee also:\n* {{msg-mw|importnofile}}\n* {{msg-mw|importuploaderrorpartial}}\n* {{msg-mw|importuploaderrortemp}}",
     "importuploaderrorpartial": "Used as error message when importing from file.\n\nSee also:\n* {{msg-mw|importnofile}}\n* {{msg-mw|importuploaderrorsize}}\n* {{msg-mw|importuploaderrortemp}}",
     "importuploaderrortemp": "Used as error message when importing from file.\n\nSee also:\n* {{msg-mw|importnofile}}\n* {{msg-mw|importuploaderrorsize}}\n* {{msg-mw|importuploaderrorpartial}}",
+    "import-parse-failure": "Error message shown when importing one or more pages to the wiki via an XML file, if the import failed because the XML in the file could not be parsed.",
     "import-noarticle": "Used as error message when importing from interwiki.\n\nSee also:\n* {{msg-mw|Import-noarticle}}\n* {{msg-mw|Importbadinterwiki}}",
     "import-nonewrevisions": "Used in [[Special:Import]].",
     "xml-error-string": "Parameters:\n* $1 - Some kind of message, perhaps name of the error?\n* $2 - line number\n* $3 - column number\n* $4 - ?? $this->mByte . $this->mContext\n* $5 - error description\nExample:\n* Import failed: XML import parse failure at line 1, col 1 (byte 3; \"- <mediawiki xml\"): Empty document",
     "import-logentry-interwiki": "Used as action listed in the log. Parameters:\n* $1 - page title",
     "import-logentry-interwiki-detail": "Used as success message. Parameters:\n* $1 - number of succeeded revisions\n* $2 - interwiki name\nSee also:\n* {{msg-mw|Import-logentry-upload-detail}}",
     "javascripttest": "Title of the special page [[Special:JavaScriptTest]].\n\nSee also:\n* {{msg-mw|Javascripttest|title}}\n* {{msg-mw|Javascripttest-pagetext-noframework|summary}}\n* {{msg-mw|Javascripttest-pagetext-unknownframework|error message}}",
+    "javascripttest-backlink": "{{optional}}\nUsed as subtitle in [[Special:JavaScriptTest]]. Parameters:\n* $1 - page title",
     "javascripttest-title": "Title of the special page when running a test suite. Parameters:\n* $1 is the name of the framework, for example QUnit.",
     "javascripttest-pagetext-noframework": "Used as summary when no framework specified.\n\nSee also:\n* {{msg-mw|Javascripttest|title}}\n* {{msg-mw|Javascripttest-pagetext-noframework|summary}}\n* {{msg-mw|Javascripttest-pagetext-unknownframework|error message}}",
     "javascripttest-pagetext-unknownframework": "Error message when given framework ID is not found. Parameters:\n* $1 - the ID of the framework\nSee also:\n* {{msg-mw|Javascripttest|title}}\n* {{msg-mw|Javascripttest-pagetext-noframework|summary}}\n* {{msg-mw|Javascripttest-pagetext-unknownframework|error message}}",
     "javascripttest-pagetext-frameworks": "Parameters:\n* $1 - frameworks list which contain a link text {{msg-mw|Javascripttest-qunit-name}}",
     "javascripttest-pagetext-skins": "Used as label in [[Special:JavaScriptTest]].",
+    "javascripttest-qunit-name": "{{Ignore}}",
     "javascripttest-qunit-intro": "Used as summary. Parameters:\n* $1 - the configured URL to the documentation\nSee also:\n* {{msg-mw|Javascripttest-qunit-heading}}",
     "javascripttest-qunit-heading": "See also:\n* {{msg-mw|Javascripttest-qunit-intro}}",
+    "accesskey-pt-userpage": "{{doc-accesskey}}\nSee also:\n<!--* username-->\n* {{msg-mw|Accesskey-pt-userpage}}\n* {{msg-mw|Tooltip-pt-userpage}}",
+    "accesskey-pt-anonuserpage": "{{doc-accesskey}}",
+    "accesskey-pt-mytalk": "{{doc-accesskey}}\nSee also:\n* {{msg-mw|Mytalk}}\n* {{msg-mw|Accesskey-pt-mytalk}}\n* {{msg-mw|Tooltip-pt-mytalk}}",
+    "accesskey-pt-anontalk": "{{doc-accesskey}}\nSee also:\n* {{msg-mw|Anontalk}}\n* {{msg-mw|Accesskey-pt-anontalk}}\n* {{msg-mw|Tooltip-pt-anontalk}}",
+    "accesskey-pt-preferences": "{{doc-accesskey}}\nSee also:\n* {{msg-mw|Mypreferences}}\n* {{msg-mw|Accesskey-pt-preferences}}\n* {{msg-mw|Tooltip-pt-preferences}}",
+    "accesskey-pt-watchlist": "{{doc-accesskey}}\nSee also:\n* {{msg-mw|Mywatchlist}}\n* {{msg-mw|Accesskey-pt-watchlist}}\n* {{msg-mw|Tooltip-pt-watchlist}}",
+    "accesskey-pt-mycontris": "{{doc-accesskey}}\nSee also:\n* {{msg-mw|Mycontris}}\n* {{msg-mw|Accesskey-pt-mycontris}}\n* {{msg-mw|Tooltip-pt-mycontris}}",
+    "accesskey-pt-login": "{{doc-accesskey}}",
+    "accesskey-pt-logout": "{{doc-accesskey}}\nSee also:\n* {{msg-mw|Logout}}\n* {{msg-mw|Accesskey-pt-logout}}\n* {{msg-mw|Tooltip-pt-logout}}",
+    "accesskey-ca-talk": "{{doc-accesskey}}\nSee also:\n* {{msg-mw|Talk}}\n* {{msg-mw|Accesskey-ca-talk}}\n* {{msg-mw|Tooltip-ca-talk}}",
+    "accesskey-ca-edit": "{{doc-accesskey}}\nSee also:\n* {{msg-mw|Edit}}\n* {{msg-mw|Accesskey-ca-edit}}\n* {{msg-mw|Tooltip-ca-edit}}",
+    "accesskey-ca-addsection": "{{doc-accesskey}}\nSee also:\n* {{msg-mw|Addsection}}\n* {{msg-mw|Accesskey-ca-addsection}}\n* {{msg-mw|Tooltip-ca-addsection}}",
+    "accesskey-ca-viewsource": "{{doc-accesskey}}\nSee also:\n* {{msg-mw|Viewsource}}\n* {{msg-mw|Accesskey-ca-viewsource}}\n* {{msg-mw|Tooltip-ca-viewsource}}",
+    "accesskey-ca-history": "{{doc-accesskey}}",
+    "accesskey-ca-protect": "{{doc-accesskey}}\nSee also:\n* {{msg-mw|Protect}}\n* {{msg-mw|Accesskey-ca-protect}}\n* {{msg-mw|Tooltip-ca-protect}}",
+    "accesskey-ca-unprotect": "{{doc-accesskey}}\nSee also:\n* {{msg-mw|Unprotect}}\n* {{msg-mw|Accesskey-ca-unprotect}}\n* {{msg-mw|Tooltip-ca-unprotect}}",
+    "accesskey-ca-delete": "{{doc-accesskey}}\nSee also:\n* {{msg-mw|Delete}}\n* {{msg-mw|Accesskey-ca-delete}}\n* {{msg-mw|Tooltip-ca-delete}}",
+    "accesskey-ca-undelete": "{{doc-accesskey}}\nSee also:\n* {{msg-mw|Undelete}}\n* {{msg-mw|Accesskey-ca-undelete}}\n* {{msg-mw|Tooltip-ca-undelete}}",
+    "accesskey-ca-move": "{{doc-accesskey}}\nSee also:\n* {{msg-mw|Move}}\n* {{msg-mw|Accesskey-ca-move}}\n* {{msg-mw|Tooltip-ca-move}}",
+    "accesskey-ca-watch": "{{doc-accesskey}}\nSee also:\n* {{msg-mw|Watch}}\n* {{msg-mw|Accesskey-ca-watch}}\n* {{msg-mw|Tooltip-ca-watch}}",
+    "accesskey-ca-unwatch": "{{doc-accesskey}}\nSee also:\n* {{msg-mw|Unwatch}}\n* {{msg-mw|Accesskey-ca-unwatch}}\n* {{msg-mw|Tooltip-ca-unwatch}}",
+    "accesskey-search": "{{doc-accesskey}}\nSee also:\n* {{msg-mw|Search}}\n* {{msg-mw|Accesskey-search}}\n* {{msg-mw|Tooltip-search}}",
+    "accesskey-search-go": "{{doc-accesskey}}\nSee also:\n* {{msg-mw|Go}}\n* {{msg-mw|Accesskey-search-go}}\n* {{msg-mw|Tooltip-search-go}}",
+    "accesskey-search-fulltext": "{{doc-accesskey}}\nSee also:\n* {{msg-mw|Search}}\n* {{msg-mw|Accesskey-search-fulltext}}\n* {{msg-mw|Tooltip-search-fulltext}}",
+    "accesskey-p-logo": "{{doc-accesskey}}\nSee also:\n* {{msg-mw|Accesskey-p-logo}}\n* {{msg-mw|Tooltip-p-logo}}",
+    "accesskey-n-mainpage": "{{doc-accesskey}}\nSee also:\n* {{msg-mw|Mainpage}}\n* {{msg-mw|Accesskey-n-mainpage}}\n* {{msg-mw|Tooltip-n-mainpage}}",
+    "accesskey-n-mainpage-description": "{{doc-accesskey}}\nSee also:\n* {{msg-mw|Mainpage-description}}\n* {{msg-mw|Accesskey-n-mainpage-description}}\n* {{msg-mw|Tooltip-n-mainpage-description}}",
+    "accesskey-n-portal": "{{doc-accesskey}}\nSee also:\n* {{msg-mw|Portal}}\n* {{msg-mw|Portal-url}}\n* {{msg-mw|Accesskey-n-portal}}\n* {{msg-mw|Tooltip-n-portal}}",
+    "accesskey-n-currentevents": "{{doc-accesskey}}\nSee also:\n* {{msg-mw|Currentevents}}\n* {{msg-mw|Currentevents-url}}\n* {{msg-mw|Accesskey-n-currentevents}}\n* {{msg-mw|Tooltip-n-currentevents}}",
+    "accesskey-n-recentchanges": "{{doc-accesskey}}\nSee also:\n* {{msg-mw|Recentchanges}}\n* {{msg-mw|Accesskey-n-recentchanges}}\n* {{msg-mw|Tooltip-n-recentchanges}}",
+    "accesskey-n-randompage": "{{doc-accesskey}}\nSee also:\n* {{msg-mw|Randompage}}\n* {{msg-mw|Accesskey-n-randompage}}\n* {{msg-mw|Tooltip-n-randompage}}",
+    "accesskey-n-help": "{{doc-accesskey}}\nSee also:\n* {{msg-mw|Help}}\n* {{msg-mw|Accesskey-n-help}}\n* {{msg-mw|Tooltip-n-help}}",
+    "accesskey-t-whatlinkshere": "{{doc-accesskey}}\nSee also:\n* {{msg-mw|Whatlinkshere}}\n* {{msg-mw|Accesskey-t-whatlinkshere}}\n* {{msg-mw|Tooltip-t-whatlinkshere}}",
+    "accesskey-t-recentchangeslinked": "{{doc-accesskey}}\nSee also:\n* {{msg-mw|Recentchangeslinked}}\n* {{msg-mw|Accesskey-t-recentchangeslinked}}\n* {{msg-mw|Tooltip-t-recentchangeslinked}}",
+    "accesskey-feed-rss": "{{doc-accesskey}}\nSee also:\n* {{msg-mw|Feed-rss}}\n* {{msg-mw|Accesskey-feed-rss}}\n* {{msg-mw|Tooltip-feed-rss}}",
+    "accesskey-feed-atom": "{{doc-accesskey}}\nSee also:\n* {{msg-mw|Feed-atom}}\n* {{msg-mw|Accesskey-feed-atom}}\n* {{msg-mw|Tooltip-feed-atom}}",
+    "accesskey-t-contributions": "{{doc-accesskey}}\nSee also:\n* {{msg-mw|Contributions}}\n* {{msg-mw|Accesskey-t-contributions}}\n* {{msg-mw|Tooltip-t-contributions}}",
+    "accesskey-t-emailuser": "{{doc-accesskey}}\nSee also:\n* {{msg-mw|Emailuser}}\n* {{msg-mw|Accesskey-t-emailuser}}\n* {{msg-mw|Tooltip-t-emailuser}}",
+    "accesskey-t-permalink": "{{doc-accesskey}}\nSee also:\n* {{msg-mw|Permalink}}\n* {{msg-mw|Accesskey-t-permalink}}\n* {{msg-mw|Tooltip-t-permalink}}",
+    "accesskey-t-print": "{{doc-accesskey}}\nSee also:\n* {{msg-mw|Printableversion}}\n* {{msg-mw|Accesskey-t-print}}\n* {{msg-mw|Tooltip-t-print}}",
+    "accesskey-t-upload": "{{doc-accesskey}}\nSee also:\n* {{msg-mw|Upload}}\n* {{msg-mw|Accesskey-t-upload}}\n* {{msg-mw|Tooltip-t-upload}}",
+    "accesskey-t-specialpages": "{{doc-accesskey}}\nSee also:\n* {{msg-mw|Specialpages}}\n* {{msg-mw|Accesskey-t-specialpages}}\n* {{msg-mw|Tooltip-t-specialpages}}",
+    "accesskey-ca-nstab-main": "{{doc-accesskey}}\nSee also:\n* {{msg-mw|Nstab-main}}\n* {{msg-mw|Accesskey-ca-nstab-main}}\n* {{msg-mw|Tooltip-ca-nstab-main}}",
+    "accesskey-ca-nstab-user": "{{doc-accesskey}}\nSee also:\n* {{msg-mw|Nstab-user}}\n* {{msg-mw|Accesskey-ca-nstab-user}}\n* {{msg-mw|Tooltip-ca-nstab-user}}",
+    "accesskey-ca-nstab-media": "{{doc-accesskey}}\nSee also:\n* {{msg-mw|Nstab-media}}\n* {{msg-mw|Accesskey-ca-nstab-media}}\n* {{msg-mw|Tooltip-ca-nstab-media}}",
+    "accesskey-ca-nstab-special": "{{doc-accesskey}}",
+    "accesskey-ca-nstab-project": "{{doc-accesskey}}\nSee also:\n* {{msg-mw|Nstab-project}}\n* {{msg-mw|Accesskey-ca-nstab-project}}\n* {{msg-mw|Tooltip-ca-nstab-project}}",
+    "accesskey-ca-nstab-image": "{{doc-accesskey}}\nSee also:\n* {{msg-mw|Nstab-image}}\n* {{msg-mw|Accesskey-ca-nstab-image}}\n* {{msg-mw|Tooltip-ca-nstab-image}}",
+    "accesskey-ca-nstab-mediawiki": "{{doc-accesskey}}\nSee also:\n* {{msg-mw|Nstab-mediawiki}}\n* {{msg-mw|Accesskey-ca-nstab-mediawiki}}\n* {{msg-mw|Tooltip-ca-nstab-mediawiki}}",
+    "accesskey-ca-nstab-template": "{{doc-accesskey}}\nSee also:\n* {{msg-mw|Nstab-template}}\n* {{msg-mw|Accesskey-ca-nstab-template}}\n* {{msg-mw|Tooltip-ca-nstab-template}}",
+    "accesskey-ca-nstab-help": "{{doc-accesskey}}\nSee also:\n* {{msg-mw|Nstab-help}}\n* {{msg-mw|Accesskey-ca-nstab-help}}\n* {{msg-mw|Tooltip-ca-nstab-help}}",
+    "accesskey-ca-nstab-category": "{{doc-accesskey}}\nSee also:\n* {{msg-mw|Nstab-category}}\n* {{msg-mw|Accesskey-ca-nstab-category}}\n* {{msg-mw|Tooltip-ca-nstab-category}}",
+    "accesskey-minoredit": "{{doc-accesskey}}\nSee also:\n* {{msg-mw|Minoredit}}\n* {{msg-mw|Accesskey-minoredit}}\n* {{msg-mw|Tooltip-minoredit}}",
+    "accesskey-save": "{{doc-accesskey}}\nSee also:\n* {{msg-mw|Savearticle}}\n* {{msg-mw|Accesskey-save}}\n* {{msg-mw|Tooltip-save}}",
+    "accesskey-preview": "{{doc-accesskey}}\nSee also:\n* {{msg-mw|Showpreview}}\n* {{msg-mw|Accesskey-preview}}\n* {{msg-mw|Tooltip-preview}}",
+    "accesskey-diff": "{{doc-accesskey}}\nSee also:\n* {{msg-mw|Showdiff}}\n* {{msg-mw|Accesskey-diff}}\n* {{msg-mw|Tooltip-diff}}",
+    "accesskey-compareselectedversions": "{{doc-accesskey}}\nSee also:\n* {{msg-mw|Compareselectedversions}}\n* {{msg-mw|Accesskey-compareselectedversions}}\n* {{msg-mw|Tooltip-compareselectedversions}}",
+    "accesskey-watch": "{{doc-accesskey}}\nSee also:\n* {{msg-mw|Watchthis}}\n* {{msg-mw|Accesskey-watch}}\n* {{msg-mw|Tooltip-watch}}",
+    "accesskey-upload": "{{doc-accesskey}}\nSee also:\n* {{msg-mw|Uploadbtn}}\n* {{msg-mw|Accesskey-upload}}\n* {{msg-mw|Tooltip-upload}}",
+    "accesskey-preferences-save": "{{doc-accesskey}}\nSee also:\n* {{msg-mw|Saveprefs}}\n* {{msg-mw|Accesskey-preferences-save}}\n* {{msg-mw|Tooltip-preferences-save}}",
+    "accesskey-summary": "{{doc-accesskey}}\nSee also:\n* {{msg-mw|Summary}}\n* {{msg-mw|Accesskey-summary}}\n* {{msg-mw|Tooltip-summary}}",
+    "accesskey-userrights-set": "{{doc-accesskey}}",
+    "accesskey-blockip-block": "{{doc-accesskey}}",
+    "accesskey-export": "{{doc-accesskey}}",
+    "accesskey-import": "{{doc-accesskey}}",
+    "accesskey-watchlistedit-normal-submit": "{{doc-accesskey|watchlistedit-normal-submit}}\nSee also:\n* {{msg-mw|Watchlistedit-normal-submit}}\n* {{msg-mw|Accesskey-watchlistedit-normal-submit}}\n* {{msg-mw|Tooltip-watchlistedit-normal-submit}}",
+    "accesskey-watchlistedit-raw-submit": "{{doc-accesskey|watchlistedit-raw-submit}}\nSee also:\n* {{msg-mw|Watchlistedit-raw-submit}}\n* {{msg-mw|Accesskey-watchlistedit-raw-submit}}\n* {{msg-mw|Tooltip-watchlistedit-raw-submit}}",
     "tooltip-pt-userpage": "Tooltip shown when hovering the mouse over the link to your own User page in the upper-side personal toolbox.\n\nSee also:\n<!--* username-->\n* {{msg-mw|Accesskey-pt-userpage}}\n* {{msg-mw|Tooltip-pt-userpage}}",
+    "tooltip-pt-anonuserpage": "Tooltip for a link to the user page of the current anonymous user.",
     "tooltip-pt-mytalk": "Tooltip shown when hovering over the {{msg-mw|Mytalk}} link in your personal toolbox (upper right side).\n\nSee also:\n* {{msg-mw|Mytalk}}\n* {{msg-mw|Accesskey-pt-mytalk}}\n* {{msg-mw|Tooltip-pt-mytalk}}",
     "tooltip-pt-anontalk": "Used as tooltip for link {{msg-mw|Anontalk}}.\n\nSee also:\n* {{msg-mw|Anontalk}}\n* {{msg-mw|Accesskey-pt-anontalk}}\n* {{msg-mw|Tooltip-pt-anontalk}}",
     "tooltip-pt-preferences": "Tooltip shown when hovering over the {{msg-mw|Mypreferences}} link in your personal toolbox (upper right side).\n\nSee also:\n* {{msg-mw|Mypreferences}}\n* {{msg-mw|Accesskey-pt-preferences}}\n* {{msg-mw|Tooltip-pt-preferences}}\n{{Identical|Preferences}}",
     "tooltip-preferences-save": "Used as tooltip for Save button.\n\nSee also:\n* {{msg-mw|Saveprefs}}\n* {{msg-mw|Accesskey-preferences-save}}\n* {{msg-mw|Tooltip-preferences-save}}",
     "tooltip-summary": "Used as tooltip for Summary input box in Editor page.\n\nSee also:\n* {{msg-mw|Summary}}\n* {{msg-mw|Accesskey-summary}}\n* {{msg-mw|Tooltip-summary}}",
     "interlanguage-link-title": "{{Optional}}\nFormat of a sidebar interwiki link tooltip. Parameters:\n* $1 - page name in the target wiki\n* $2 - target wiki language autonym",
+    "interlanguage-link-title-langonly": "{{ignored}}Interlanguage link title. Parameters: $1 replaced with a language name.",
     "common.css": "{{optional}}\nCSS applied to all users.",
     "cologneblue.css": "{{optional}}",
     "monobook.css": "{{optional}}\nCSS applied to users using Monobook skin.",
     "spam_blanking": "Edit summary for spam cleanup script.\n\nUsed when a page is blanked (made to have no content, but still exist) because the script could not find an appropriate revision to set the page to.\n\nParameters:\n* $1 - a spammed domain name",
     "spam_deleting": "Edit summary for spam cleanup script.\n\nUsed when a page is deleted because all revisions contained a particular link.\n\nParameters:\n* $1 - a spammed domain name",
     "simpleantispam-label": "Used as label for the input box in \"Edit\" page.\n\nThe label and the input box are always hidden.",
+    "pageinfo-header": "{{ignored}}Custom text for the top of the info page (action=info).",
     "pageinfo-title": "Page title for action=info. Parameters:\n* $1 is the page name",
     "pageinfo-not-current": "Error message displayed when information for an old revision is requested. Example: [{{fullurl:Project:News|oldid=4266597&action=info}}]",
     "pageinfo-header-basic": "Table section header in action=info. See [{{canonicalurl:MediaWiki:Pageinfo-header-basic/en|action=info}} example].\n{{Identical|Basic information}}",
     "pageinfo-hidden-categories": "The list of hidden categories on the page. Parameters:\n* $1 - the number of hidden categories on the page\n{{Identical|Hidden category}}",
     "pageinfo-templates": "The list of templates transcluded within the page. Parameters:\n* $1 is the number of templates transcluded within the current page.\nSee also:\n* {{msg-mw|Pageinfo-transclusions}}",
     "pageinfo-transclusions": "The list of pages on which this page is transcluded. Parameters:\n* $1 is the number of pages the current page is transcluded on.\nSee also:\n* {{msg-mw|Pageinfo-templates}}",
+    "pageinfo-footer": "{{ignored}}Custom text for the bottom of the info page (action=info).",
     "pageinfo-toolboxlink": "Information link for the page (like 'What links here', but to action=info for the current page instead)",
     "pageinfo-redirectsto": "Key for the row shown if this page is a redirect. Verb. See [{{canonicalurl:w:Main_page|action=info}} example].",
     "pageinfo-redirectsto-info": "Text to put in parentheses for the link to the action=info of the redirect target.\n{{Identical|Info}}",
     "skinname-modern": "{{optional}}\n{{Identical|Modern}}",
     "skinname-vector": "{{optional}}",
     "markaspatrolleddiff": "{{doc-actionlink}}\nSee also:\n* {{msg-mw|Markaspatrolledtext}}",
+    "markaspatrolledlink": "{{notranslate}}\nParameters:\n* $1 - link which has text {{msg-mw|Markaspatrolledtext}}",
     "markaspatrolledtext": "{{doc-actionlink}}\nSee also:\n* {{msg-mw|Markaspatrolleddiff}}",
     "markedaspatrolled": "Used as title of the message {{msg-mw|Markedaspatrolledtext}}, when marking a change as patrolled.\n{{Related|Markedaspatrolled}}",
     "markedaspatrolledtext": "Used when marking a change as patrolled.\n\nThe title for this message is {{msg-mw|Markedaspatrolled}}.\n\nParameters:\n* $1 - page title\n{{Related|Markedaspatrolled}}",
     "friday-at": "Phrase for indicating that something occurred at a particular time on the most recent Friday.\n\nParameters:\n* $1 - the time (localized)\n{{Related|Day-at}}",
     "saturday-at": "Phrase for indicating that something occurred at a particular time on the most recent Saturday.\n\nParameters:\n* $1 - the time (localized)\n{{Related|Day-at}}",
     "sunday-at": "Phrase for indicating that something occurred at a particular time on the most recent Sunday.\n\nParameters:\n* $1 - the time (localized)\n{{Related|Day-at}}",
+    "today-at": "Phrase for indicating that something occurred at a particular time today.\n\nParameters:\n* $1 - the time (localized)\n{{Related|Day-at}}",
     "yesterday-at": "Phrase for indicating that something occurred at a particular time yesterday.\n\nParameters:\n* $1 - the time (localized)\n{{Related|Day-at}}",
     "bad_image_list": "箇条信息只出现在引导管理员用正确个格式加链接。弗会徕Mediawiki别荡处出现。",
     "variantname-zh-hans": "{{Optional}}\n\nVariant option for wikis with variants conversion enabled.",
     "exif-contrast": "{{Related|Exif-contrast}}",
     "exif-saturation": "{{Related|Exif-saturation}}",
     "exif-sharpness": "{{Related|Exif-sharpness}}",
+    "exif-devicesettingdescription": "The section header shown above device settings extracted from a file's EXIF data on the file's page.",
     "exif-subjectdistancerange": "{{Related|Exif-subjectdistancerange}}",
     "exif-imageuniqueid": "A unique identifier for the image in the form of a 128-bit hexadecimal string. See http://www.exif.org/Exif2-2.PDF for details on exif properties.",
     "exif-gpsversionid": "Version of the GPS IFD used to store location information. This is usually 2.2.0.0",
     "exif-gpsaltituderef": "No longer used except for when using foreign image repository with old version of mediawiki. 0 for above sea level, 1 for below sea level.",
     "exif-gpsaltitude": "Altitude in meters that the image was taken at.",
     "exif-gpstimestamp": "Time (does not include date) that GPS measurement was taken, in UTC. Since often this is at the same time as photo was taken, this is sometimes more reliable than {{msg-mw|exif-datetimeoriginal}}.",
+    "exif-gpssatellites": "Label for EXIF information. Indicates the GPS satellites used for measurements.",
     "exif-gpsstatus": "See also:\n* {{msg-mw|Exif-gpsstatus-a}}\n* {{msg-mw|Exif-gpsstatus-v}}",
     "exif-gpsmeasuremode": "Is the measurement 2D (latitude and longitude) or 3D (latitude, longitude, and altitude).\n\nSee also:\n* {{msg-mw|Exif-gpsmeasuremode-2}}\n* {{msg-mw|Exif-gpsmeasuremode-3}}",
     "exif-gpsdop": "How accurate the GPS information is. See http://en.wikipedia.org/wiki/Dilution_of_precision_(GPS)\n{{Related|Exif-gpsdop}}",
     "exif-gpstrack": "See also:\n* {{msg-mw|Exif-gpstrackref}}\n* {{msg-mw|Exif-gpsimgdirection}}\n* {{msg-mw|Exif-gpsimgdirectionref}}\n* {{msg-mw|Exif-gpsdestbearing}}\n* {{msg-mw|Exif-gpsdestbearingref}}",
     "exif-gpsimgdirectionref": "See also:\n* {{msg-mw|Exif-gpstrack}}\n* {{msg-mw|Exif-gpstrackref}}\n* {{msg-mw|Exif-gpsimgdirection}}\n* {{msg-mw|Exif-gpsdestbearing}}\n* {{msg-mw|Exif-gpsdestbearingref}}",
     "exif-gpsimgdirection": "See also:\n* {{msg-mw|Exif-gpstrack}}\n* {{msg-mw|Exif-gpstrackref}}\n* {{msg-mw|Exif-gpsimgdirectionref}}\n* {{msg-mw|Exif-gpsdestbearing}}\n* {{msg-mw|Exif-gpsdestbearingref}}",
+    "exif-gpsmapdatum": "Label for EXIF information. Indicates the geodetic survey data used by the GPS receiver.",
     "exif-gpsdestlatituderef": "{{Related|Exif-gpslatitude}}",
     "exif-gpsdestlatitude": "The latitude of the location shown in the picture, if it is different from latitude of the camera location. See {{msg-mw|exif-gpslatitude}}.\n{{Related|Exif-gpslatitude}}\n{{Identical|Latitude}}",
     "exif-gpsdestlongituderef": "{{Related|Exif-gpslatitude}}",
     "exif-gpsdestbearing": "See also:\n* {{msg-mw|Exif-gpstrack}}\n* {{msg-mw|Exif-gpstrackref}}\n* {{msg-mw|Exif-gpsimgdirection}}\n* {{msg-mw|Exif-gpsimgdirectionref}}\n* {{msg-mw|Exif-gpsdestbearingref}}",
     "exif-gpsdestdistanceref": "I think \"reference\" stands for \"unit\". See {{msg-mw|Exif-gpsspeedref}}\n{{Related|Exif-gpsdestdistance}}",
     "exif-gpsdestdistance": "{{Related|Exif-gpsdestdistance}}",
+    "exif-gpsprocessingmethod": "Label for EXIF information. A character string recording the name of the method used for location finding.",
+    "exif-gpsareainformation": "Label for EXIF information. Contains a character string recording the name of the GPS area.",
     "exif-gpsdatestamp": "Date (does not generally include time unless recorded in XMP) that GPS measurement was taken, in UTC. Since often this is at the same date as photo was taken, this is sometimes more reliable than {{msg-mw|exif-datetimeoriginal}}.",
+    "exif-gpsdifferential": "Label for EXIF information. Indicates whether differential correction is applied to the GPS receiver.",
     "exif-coordinate-format": "{{optional}}\nFor formatting GPS latitude coordinates. Parameters:\n* $1 - degrees\n* $2 - minutes\n* $3 - seconds (up to two decimal places)\n* $4 - direction (N, S, W, or E)\n* $5 - (Unused) coordinate as a single positive or negative real number",
     "exif-jpegfilecomment": "This is not a true exif tag, but the contents of the JPEG COM segment. This often contains a file source, but can potentially contain any comment about the file. This is similar to {{msg-mw|exif-usercomment}}, {{msg-mw|exif-pngfilecomment}}, and {{msg-mw|exif-giffilecomment}}.",
     "exif-keywords": "List of keywords for the photograph (or other media).\n\nThis can come from IPTC-iim 2:25 keyword field, or XMP's dc:subject field.",
     "exif-personinimage": "Name of person depicted in image",
     "exif-originalimageheight": "Height of image before it was cropped in pixels",
     "exif-originalimagewidth": "Width of image before it was cropped in pixels",
+    "exif-make-value": "{{notranslate}}\nParameters:\n* $1 - make name",
+    "exif-model-value": "{{notranslate}}\nIt's used for local customizations (it allows some wiki syntax). Parameters:\n* $1 - the name of the camera, shown in the metadata table alongside {{msg-mw|Exif-model}}",
+    "exif-software-value": "{{notranslate}}\nParameters:\n* $1 - software name",
+    "exif-software-version-value": "{{notranslate}}\nParameters:\n* $1 - software name\n* $2 - version number",
     "exif-contact-value": "{{optional}}\nParameters:\n* $1 - email\n* $2 - URL of website\n* $3 - street address\n* $4 - city\n* $5 - region\n* $6 - postal code\n* $7 - country\n* $8 - telephone number\nNote, not all fields are guaranteed to be present, some may be empty strings.",
     "exif-subjectnewscode-value": "{{Optional}}\nParameters:\n* $1 - numeric IPTC subject news code (one of http://cv.iptc.org/newscodes/subjectcode )\n* $2 - one of 17 broad categories that the code falls into. For example any code starting with 15 has the contents of {{msg-mw|Exif-iimcategory-spo}} for $2.",
     "exif-compression-1": "{{Related|Exif-compression}}",
     "semicolon-separator": "{{optional}}",
     "comma-separator": "{{optional}}\n\nWarning: languages have different usages of punctuation, and sometimes they are swapped (e.g. openining and closing quotation marks, or full stop and colon in Armenian), or change their form (the full stop in Chinese and Japanese, the prefered \"colon\" in Armenian used in fact as the regular full stop, the comma in Arabic, Armenian, and Chinese...)\n\nTheir spacing (before or after) may also vary across languages (for example French requires a non-breaking space, preferably narrow if the browser supports NNBSP, on the inner side of some punctuations like quotation/question/exclamation marks, colon, and semicolons).",
     "colon-separator": "{{optional}}\nChange it only if your language uses another character for ':' or it needs an extra space before the colon.",
+    "autocomment-prefix": "{{optional}}",
     "pipe-separator": "{{optional}}",
     "word-separator": "{{optional}}\nThis is a string which is (usually) put between words of the language. It is used, e.g. when messages are concatenated (appended to each other). Note that you must express a space as html entity &amp;#32; because the editing and updating process strips leading and trailing spaces from messages.\n\nMost languages use a space, but some Asian languages, such as Thai and Chinese, do not.",
     "ellipsis": "{{optional}}",
     "autosumm-replace": "The auto summary when a user removes a lot of characters in the page.\n\nParameters:\n* $1 - truncated text",
     "autoredircomment": "The auto summary when making a redirect. Parameters:\n* $1 - the page where it redirects to\n* $2 - (Optional) the first X number of characters of the redirect ($2 is usually only used when end users customize the message)",
     "autosumm-new": "The auto summary when creating a new page. $1 are the first X number of characters of the new page.",
+    "autoblock_whitelist": "{{notranslate}}",
     "size-bytes": "{{optional}}\nSize (of a page, typically) in bytes.",
     "size-kilobytes": "{{optional}}\nSize (of a page, typically) in kibibytes (1 kibibyte = 1024 bytes).",
     "size-megabytes": "{{optional}}\nSize (of a file, typically) in mebibytes (1 mebibyte = 1024×1024 bytes).",
     "livepreview-error": "Used as error message. Parameters:\n* $1 - ...\n* $2 - ...\nSee also:\n* {{msg-mw|Livepreview-failed}}\n* {{msg-mw|Livepreview-error}}",
     "lag-warn-normal": "Used as warning about slave lag. Parameters:\n* $1 - number of seconds\nSee also:\n* {{msg-mw|Lag-warn-high}}",
     "lag-warn-high": "Used as warning about slave lag. Parameters:\n* $1 - number of seconds\nSee also:\n* {{msg-mw|Lag-warn-normal}}",
+    "editwatchlist-summary": "{{doc-specialpagesummary|editwatchlist}}",
     "watchlistedit-numitems": "Message on [[Special:EditWatchlist]]. This is paired with the message {{Msg-mw|Watchlistedit-noitems}} which appears instead of this message when $1 is 0.",
     "watchlistedit-noitems": "Message on [[Special:EditWatchlist]], which only appears when a user's watchlist is empty.",
     "watchlistedit-normal-title": "Title of [[Special:Watchlist/edit|special page]].",
     "hebrew-calendar-m11-gen": "{{optional}}\nName of month in Hebrew calendar.",
     "hebrew-calendar-m12-gen": "{{optional}}\nName of month in Hebrew calendar.",
     "signature": "This will be substituted in the signature (~<nowiki></nowiki>~~ or ~~<nowiki></nowiki>~~ excluding timestamp).\n\nParameters:\n* $1 - the username that is currently login\n* $2 - the customized signature which is specified in [[Special:Preferences|user's preferences]] as non-raw\nUse your language default parentheses ({{msg-mw|parentheses}}), but not use the message direct.\n\nSee also:\n* {{msg-mw|Signature-anon}} - signature for anonymous user",
+    "signature-anon": "{{notranslate}}\nUsed as signature for anonymous user. Parameters:\n* $1 - username (IP address?)\n* $2 - nickname (IP address?)\nSee also:\n* {{msg-mw|Signature}} - signature for registered user",
     "timezone-utc": "{{optional}}",
     "unknown_extension_tag": "This is an error shown when you use an unknown extension tag name.\n\nThis feature allows tags like <code><nowiki><pre></nowiki></code> to be called with a parser like <code><nowiki>{{#tag:pre}}</nowiki></code>.\n\nParameters:\n* $1 - the unknown extension tag name",
     "duplicate-defaultsort": "See definition of [[w:Sorting|sort key]] on Wikipedia. Parameters:\n* $1 - old default sort key\n* $2 - new default sort key",
     "version": "{{doc-special|Version}}\n{{Identical|Version}}",
+    "version-summary": "{{doc-specialpagesummary|version}}",
     "version-extensions": "Header on [[Special:Version]].",
     "version-specialpages": "Part of [[Special:Version]].\n{{Identical|Special page}}",
     "version-parserhooks": "This message is a heading at [[Special:Version]] for extensions that modifies the parser of wikitext.",
     "version-software": "Message shown on [[Special:Version]].\nThis message is followed by the list of installed software (MediaWiki, PHP and MySQL).",
     "version-software-product": "Shown in [[Special:Version]].\n{{Identical|Product}}",
     "version-software-version": "{{Identical|Version}}",
+    "version-db-mysql-url": "{{ignored}}URL to the website of MySQL",
+    "version-db-mariadb-url": "{{ignored}}URL to the website of MariaDB",
+    "version-db-percona-url": "{{ignored}}URL to the website of Percona",
+    "version-db-postgres-url": "{{ignored}}URL to the website of PostgreSQL",
+    "version-db-oracle-url": "{{ignored}}URL to the website of Oracle",
+    "version-db-sqlite-url": "{{ignored}}URL to the website of SQLite",
+    "version-db-mssql-url": "{{ignored}}URL to the website of Microsoft SQL Server",
     "version-entrypoints": "Header on [[Special:Version]] above a table that lists the URLs of various entry points in this MediaWiki installation. Entry points are the \"places\" where the wiki's content and information can be accessed in various ways, for instance the standard index.php which shows normal pages, histories etc.",
     "version-entrypoints-header-entrypoint": "Header for the first column in the entry points table on [[Special:Version]].\nSee also {{msg-mw|Version-entrypoints}}",
     "version-entrypoints-header-url": "Header for the second column in the entry points table on [[Special:Version]].\n{{Identical|URL}}",
     "version-entrypoints-articlepath": "{{Optional}}\nA short description of the article path entry point. Links to the mediawiki.org documentation page for $wgArticlePath.",
     "version-entrypoints-scriptpath": "{{Optional}}\nA short description of the script path entry point. Links to the mediawiki.org documentation page for $wgScriptPath.",
+    "version-entrypoints-index-php": "A short description of the index.php entry point. Links to the mediawiki.org documentation page for index.php.",
+    "version-entrypoints-api-php": "A short description of the api.php entry point. Links to the mediawiki.org documentation page for api.php.",
+    "version-entrypoints-load-php": "A short description of the load.php entry point. Links to the mediawiki.org documentation page for load.php.",
     "redirect": "{{doc-special|Redirect}}\nThis means \"Redirect by file'''name''', user '''ID''', page '''ID''', or revision ID\".",
     "redirect-legend": "Legend of fieldset around input box in [[Special:Redirect]]",
+    "redirect-text": "Inside fieldset for [[Special:Redirect]]",
     "redirect-summary": "Shown at top of [[Special:Redirect]]",
     "redirect-submit": "Button label in [[Special:Redirect]].\n{{Identical|Go}}",
     "redirect-lookup": "First field label in [[Special:Redirect]].\n\nFollowed by the select box which has the following options:\n* {{msg-mw|Redirect-user}}\n* {{msg-mw|Redirect-page}}\n* {{msg-mw|Redirect-revision}}\n* {{msg-mw|Redirect-file}}",
     "fileduplicatesearch-result-n": "Result line after the list of files of [[Special:FileDuplicateSearch]]\n\n* $1 is the name of the requested file.\n* $2 is the number of identical duplicates of the requested file",
     "fileduplicatesearch-noresults": "Parameters:\n* $1 - file name",
     "specialpages": "{{doc-special|SpecialPages|unlisted=1}}\nDisplay name of link to [[Special:SpecialPages]] shown on all pages in the toolbox.\n\nSee also:\n* {{msg-mw|Specialpages}}\n* {{msg-mw|Accesskey-t-specialpages}}\n* {{msg-mw|Tooltip-t-specialpages}}\n{{Identical|Special page}}",
+    "specialpages-summary": "{{doc-specialpagesummary|specialpages}}",
     "specialpages-note-top": "Heading for {{msg-mw|specialpages-note}}.\n{{Identical|Legend}}",
     "specialpages-note": "Footer note for the [[Special:SpecialPages]] page",
     "specialpages-group-maintenance": "{{doc-special-group|like=[[Special:DoubleRedirects]], [[Special:LonelyPages]] and [[Special:WantedPages]]}}",
     "intentionallyblankpage": "Text displayed in [[Special:BlankPage]].\n\nSee also:\n* {{msg-mw|Intentionallyblankpage|page title}}",
     "external_image_whitelist": "As usual please leave all the wiki markup, including the spaces, as they are. You can translate the text, including 'Leave this line exactly as it is'. The first line of this messages has one (1) leading space.\n\nSee definition of [[w:Regular_expression|regular expression]] on Wikipedia.",
     "tags": "Shown on [[Special:Specialpages]] for page listing the tags that the software may mark an edit with, and their meaning. For more information on tags see [[mw:Manual:Tags|MediaWiki]].\n\nIt appears that the word 'valid' describes 'tags', not 'change'. It also appears that you could use the term 'defined' instead of 'valid', or perhaps use a phrase meaning 'The change tags that are in use'.",
+    "tags-summary": "{{doc-specialpagesummary|tags}}",
     "tag-filter": "Caption of a filter shown on lists of changes (e.g. [[Special:Log]], [[Special:Contributions]], [[Special:Newpages]], [[Special:Recentchanges]], [[Special:Recentchangeslinked]], page histories)",
     "tag-filter-submit": "Caption of the submit button displayed next to the tag filter on lists of changes (e.g. [[Special:Log]], [[Special:Contributions]], [[Special:Newpages]], [[Special:Recentchanges]], [[Special:Recentchangeslinked]], page histories)\n\n{{Identical|Filter}}",
     "tag-list-wrapper": "Wrapper for the list of tags shown on recent changes, watchlists, history pages and diffs.\n\nParameters:\n* $1 - number of distinct tags for given edit\n* $2 - comma-separated list of tags for given edit",
     "tags-edit": "Used on [[Special:Tags]]. Verb. Used as display text on a link to create/edit a description.\n{{Identical|Edit}}",
     "tags-hitcount": "Shown in the \"{{msg-mw|Tags-hitcount-header}}\" column in [[Special:Tags]]. For more information on tags see [[mw:Manual:Tags|MediaWiki]].\n\nParameters:\n* $1 - the number of changes marked with the tag",
     "comparepages": "The title of [[Special:ComparePages]]",
+    "comparepages-summary": "{{doc-specialpagesummary|comparepages}}",
     "compare-page1": "Label for the field of the 1st page in the comparison for [[Special:ComparePages]]\n{{Identical|Page}}",
     "compare-page2": "Label for the field of the 2nd page in the comparison for [[Special:ComparePages]]\n{{Identical|Page}}",
     "compare-rev1": "Label for the field of the 1st revision in the comparison for [[Special:ComparePages]]\n{{Identical|Revision}}",
     "logentry-rights-rights-legacy": "* $1 - username\n* $2 - (see below)\n* $3 - username\n----\n{{Logentry|[[Special:Log/rights]]}}",
     "logentry-rights-autopromote": "* $1 - username\n* $2 - (see below)\n* $3 - (see below)\n* $4 - comma separated list of old user groups or {{msg-mw|Rightsnone}}\n* $5 - comma separated list of new user groups\n----\n{{Logentry|[[Special:Log/rights]]}}",
     "rightsnone": "Default rights for registered users.\n\n{{Identical|None}}",
+    "revdelete-logentry": "{{RevisionDelete}}\nThis is the message for the log entry in [[Special:Log/delete]] when changing visibility restrictions for page revisions.\n\nFollowed by the message {{msg-mw|revdelete-log-message}} in brackets.\n\nPreceded by the name of the user doing this task.\n\nParameters:\n* $1 - the page name\nSee also:\n* {{msg-mw|Logdelete-logentry}}",
+    "logdelete-logentry": "{{RevisionDelete}}\nThis is the message for the log entry in [[Special:Log/delete]] when changing visibility restrictions for log events.\n\nFollowed by the message {{msg-mw|logdelete-log-message}} in brackets.\n\nPreceded by the name of the user who did this task.\n\nParameters:\n* $1 - the log name in brackets\nSee also:\n* {{msg-mw|Revdelete-logentry}}",
+    "revdelete-content": "This message is used as parameter $1 in {{msg-mw|revdelete-hid}} and {{msg-mw|revdelete-unhid}} when hiding or unhiding the content of a revision or event.\n{{Identical|Content}}",
+    "revdelete-summary": "This message is used as parameter $1 in {{msg-mw|revdelete-hid}} and {{msg-mw|revdelete-unhid}} when hiding or unhiding the edit summary of a revision or event.",
+    "revdelete-uname": "This message is used as parameter $1 in {{msg-mw|revdelete-hid}} and {{msg-mw|revdelete-unhid}} when hiding or unhiding the username for a revision or event.\n\n{{Identical|Username}}",
+    "revdelete-hid": "This message is used as <code>$1</code>:\n* in {{msg-mw|revdelete-log-message}} when hiding revisions\n* in {{msg-mw|logdelete-log-message}} when hiding information in the log entry about hiding revisions\nParameters:\n* $1 - any one of the following:\n** {{msg-mw|Revdelete-content}} (when hiding the page content)\n** {{msg-mw|Revdelete-summary}} (when hiding the edit summary)\n** {{msg-mw|Revdelete-uname}} (when hiding the user name)\n** a combination of these three messages\nSee also:\n* {{msg-mw|Revdelete-unhid}}",
+    "revdelete-unhid": "This message is used as <code>$1</code>:\n* in {{msg-mw|Revdelete-log-message}} when unhiding revisions\n* in {{msg-mw|Logdelete-log-message}} when unhiding information in the log entry about unhiding revisions\nParameters:\n* $1 - any one of the following:\n** {{msg-mw|Revdelete-content}} (when unhiding the page content)\n** {{msg-mw|Revdelete-summary}} (when unhiding the edit summary)\n** {{msg-mw|Revdelete-uname}} (when unhiding the user name)\n** a combination of these three messages\nSee also:\n* {{msg-mw|Revdelete-hid}}",
+    "revdelete-log-message": "This log message is used together with {{msg-mw|revdelete-logentry}} in the deletion or suppression logs when changing visibility restrictions for page revisions.\n\nParameters:\n* $1 - any one of the following\n** {{msg-mw|revdelete-hid}} (when hiding data)\n** {{msg-mw|revdelete-unhid}} (when unhiding data)\n** {{msg-mw|revdelete-restricted}} (when applying restrictions for sysops)\n** {{msg-mw|revdelete-unrestricted}} (when removing restrictions for sysops)\n** a combination of those messages\n* $2 - the number of revisions for which the restrictions are changed\n\nPlease note that the parameters in a log entry will appear in the log only in the default language of the wiki. View [[Special:Log]] for examples on translatewiki.net with English default language.\n\nSee also:\n* {{msg-mw|Logdelete-log-message}}",
+    "logdelete-log-message": "This log message appears in brackets after the message {{msg-mw|logdelete-logentry}} in the deletion or suppression logs when changing the visibility of a log entry for events. For a brief description of the process of changing the visibility of events and their log entries see this [http://www.mediawiki.org/wiki/RevisionDelete mediawiki explanation].\n\nParameters:\n* $1 - any one of the following\n** {{msg-mw|revdelete-hid}} (when hiding data)\n** {{msg-mw|revdelete-unhid}} (when unhiding data)\n** {{msg-mw|revdelete-restricted}} (when applying restrictions for sysops)\n** {{msg-mw|revdelete-unrestricted}} (when removing restrictions for sysops)\n** a combination of those messages\n* $2 - the number of events for which the restrictions are changed\n\nPlease note that the parameters in a log entry will appear in the log only in the default language of the wiki. View [[Special:Log]] for examples on translatewiki.net with English default language.\n\nSee also:\n* {{msg-mw|Revdelete-log-message}}",
+    "deletedarticle": "This is a ''logentry'' message. Parameters:\n* $1 - deleted page name",
+    "suppressedarticle": "Part of a [[mw:Manual:RevisionDelete|RevisionDelete]] log entry. Parameters:\n* $1 - suppressed page name\n{{Identical|Suppressed}}",
+    "undeletedarticle": "This is a ''logentry'' message. Parameters:\n* $1 - restored (undeleted) page name",
+    "patrol-log-line": "Text of notes on entries in the [http://translatewiki.net/w/i.php?title=Special%3ALog&type=patrol&user=&page=&year=&month=-1 patrol log].\nParameters:\n* $1 - the link whose text is {{msg-mw|patrol-log-diff}}\n* $2 - the name of the page\n* $3 - appears to be {{msg-mw|Patrol-log-auto}} (at least sometimes)\n\nThe message appears after the name of the patroller.",
+    "patrol-log-auto": "Automated edit summary when patrolling.\n\n{{Identical|Automatic}}",
+    "patrol-log-diff": "The text of the diff link in {{msg-mw|Patrol-log-line}} (inside <code>$1</code> there).\n\nParameters:\n* $1 - revision ID\n{{Identical|Revision}}",
+    "1movedto2": "{{ignored}}This is ''logentry'' message only used on IRC. Parameters:\n* $1 - the original page name\n* $2 - the destination page name\nSee also:\n* {{msg-mw|1movedto2 redir}}",
+    "1movedto2_redir": "{{ignored}}This is ''logentry'' message only used on IRC. Parameters:\n* $1 - the original page name\n* $2 - the destination page name\nSee also:\n* {{msg-mw|1movedto2}}",
+    "move-redirect-suppressed": "{{ignored}}Message unused?",
+    "newuserlog-create-entry": "Part of the \"Newuserlog\" extension. It is the summary in the [[Special:RecentChanges|recent changes]] and on [[Special:Log/newusers]].",
+    "newuserlog-create2-entry": "Part of the \"Newuserlog\" extension.\n\nIt is the summary in the [[Special:RecentChanges|recent changes]] and on [[Special:Log/newusers]] when creating an account for someone else (\"$1\").\n\nPreceded by the name of the user doing this task.\n\nParameters:\n* $1 - username",
+    "newuserlog-autocreate-entry": "This message is used in the [[:mw:Extension:Newuserlog|new user log]] to mark an account that was created by MediaWiki as part of a [[:mw:Extension:CentralAuth|CentralAuth]] global account.",
+    "rightslogentry": "This message is displayed in the [[Special:Log/rights|User Rights Log]] when a bureaucrat changes the user groups for a user.\n\nParameters:\n* $1 - the username\n* $2 - list of user groups or {{msg-mw|Rightsnone}}\n* $3 - list of user groups or {{msg-mw|Rightsnone}}\n\nThe name of the bureaucrat who did this task appears before this message.\n\nSimilar to {{msg-mw|Gur-rightslog-entry}}",
+    "rightslogentry-autopromote": "This message is displayed in the [[Special:Log/rights|User Rights Log]] when a user is automatically promoted to a user group.\n\nParameters:\n* $1 - (Unused)\n* $2 - a comma separated list of old user groups or {{msg-mw|Rightsnone}}\n* $3 - a comma separated list of new user groups",
     "feedback-bugornote": "When feedback dialog box is opened, this introductory message in small print explains the options to report a bug or add simple feedback.\n\nWe expect that people in a hurry will not read this.\n\nParameters:\n* $1 - Bug note URL\n* $2 - \"Feedback\"\n* $3 - Feedback page URL",
     "feedback-subject": "Label for a text input\n{{Identical|Subject}}",
     "feedback-message": "Label for a textarea; signature referrs to a Wikitext signature.\n{{Identical|Message}}",
     "expand_templates_remove_nowiki": "Option on [[Special:Expandtemplates]]\n\nHere's what the tick box does:\n\nFor:\n<pre>\n&lt;nowiki>test&lt;/nowiki>\n</pre>\n\nNot ticked:\n<pre>\n&lt;nowiki>test&lt;/nowiki>\n</pre>\n\nTicked:\n<pre>\ntest\n</pre>",
     "expand_templates_generate_xml": "Used as checkbox label.",
     "expand_templates_generate_rawhtml": "Used as checkbox label.",
-    "expand_templates_preview": "{{Identical|Preview}}",
-    "trackingcategories": "[[Special:TrackingCategories]] page implementing list of Tracking categories [[mw:Special:MyLanguage/Help:Tracking categories|tracking category]].\n{{Identical|Tracking category}}",
-    "trackingcategories-summary": "Description for [[Special:TrackingCategories]] page [[mw:Help:Tracking categories|tracking category]]",
-    "trackingcategories-msg": "Header for the message column of the table on [[Special:TrackingCategories]]. This column lists the mediawiki message that controls the tracking category in question.\n{{Identical|Tracking category}}",
-    "trackingcategories-name": "Header for the message column of the table on [[Special:TrackingCategories]]. This column lists the name of the tracking category in the content language.",
-    "trackingcategories-desc": "Header for the message column of the table on [[Special:TrackingCategories]]. This column lists the inclusion criteria for the category.",
-    "noindex-category-desc": "No-index category-description. Shown on [[Special:TrackingCategories]]",
-    "index-category-desc": "Index category-description. Shown on [[Special:TrackingCategories]]",
-    "post-expand-template-inclusion-category-desc": "Post expand template inclusion category description. Shown on [[Special:TrackingCategories]]",
-    "post-expand-template-argument-category-desc": "Post expand template argument category description. Shown on [[Special:TrackingCategories]]",
-    "expensive-parserfunction-category-desc": "Expensive parserfunction category description. Shown on [[Special:TrackingCategories]]",
-    "broken-file-category-desc": "Broken file category description. Shown on [[Special:TrackingCategories]]",
-    "hidden-category-category-desc": "Hidden-category category description. Shown on [[Special:TrackingCategories]]",
-    "trackingcategories-nodesc": "Tracking category description not available message"
+    "expand_templates_preview": "{{Identical|Preview}}"
 }
index 62abc6f..3ab68a2 100644 (file)
     "password-change-forbidden": "Kay wikipi yaykuna rimataqa manam hukchayta atinkichu.",
     "externaldberror": "Hawa yaykuna pantasqam karqan, ichataq manam saqillasunkichu hawa rakiqunaykita musuqchayta.",
     "login": "Yaykuy",
-    "nav-login-createaccount": "Yaykuy",
+    "nav-login-createaccount": "Yaykuy / rakiqunata kamariy",
     "loginprompt": "{{SITENAME}}man yaykunaykipaqqa wamp'unaykipi <i>cookies</i> nisqakunaman ari ninaykim tiyan.",
     "userlogin": "Yaykuy / rakiqunata kamariy",
     "userloginnocreate": "Yaykuy",
     "nologinlink": "Kichariy",
     "createaccount": "Musuq rakiqunata kichariy",
     "gotaccount": "Rakiqunaykiñachu kachkan? '''$1'''.",
-    "gotaccountlink": "Rakiqunaykita willaway",
+    "gotaccountlink": "Yaykuy",
     "userlogin-resetlink": "Yaykuna willayniykikunatari qunqarqankichu?",
     "userlogin-resetpassword-link": "Yaykuna rimaykita qunqarqankichu?",
+    "userlogin-helplink2": "Yaykuywan yanapay",
     "userlogin-createanother": "Huk rakiqunata kamariy",
     "createacct-join": "Kay qatiqpi willaykita yaykuchiy.",
     "createacct-emailrequired": "E-chaski imamayta",
     "suspicious-userlogout": "Lluqsiy mañakuyniykiqa mananchasqam karqan, waqllisqa wamp'unamanta icha pakaq proksimanta kachasqa kaspanchá.",
     "createacct-another-realname-tip": "* Chiqap sutiqa munanallapaqmi. Quwaptiykiqa, llamk'apusqakunam paywan sananchasqa kanqa.",
     "pt-login": "Yaykuy",
+    "pt-login-button": "Yaykuy",
     "pt-createaccount": "Musuq rakiqunata kichariy",
     "pt-userlogout": "Lluqsiy",
     "php-mail-error-unknown": "Mana riqsisqa pantasqa PHP mail() rurananpi",
     "nosuchsectiontitle": "Manam tarinichu chay rakita",
     "nosuchsectiontext": "Allichaykacharqunki mana kachkaq rakitam.\nAstasqachá icha qullusqachá qhawachkaptiyki.",
     "loginreqtitle": "Yaykunaykim tiyan",
-    "loginreqlink": "yaykuna",
+    "loginreqlink": "yaykuy",
     "loginreqpagetext": "Huk p'anqakunata rikunaykipaqqa $1ykim tiyan.",
     "accmailtitle": "Yaykuna rimaqa kachasqañam.",
     "accmailtext": "Kikinmanta kamarisqa [[User talk:$1|$1]]-paq yaykuna rimaqa $2-manmi kachasqaña.\n\nYaykurqaspaqa ''[[Special:ChangePassword|yaykuna rima hukchana]]'' p'anqapi kay yaykuna rimata hukchaytam atinki.",
     "prefs-skin": "Qara",
     "skin-preview": "Ñawpaqta qhaway",
     "datedefault": "Kikinmanta allinkachina",
-    "prefs-beta": "Beta nisqap kaqninkuna",
     "prefs-datetime": "P'unchaw, pacha",
     "prefs-labs": "Laburaturyu nisqap kaqninkuna",
     "prefs-user-pages": "Ruraqpa p'anqankuna",
     "nowatchlist": "Manam watiqasqakunachu kachkan.",
     "watchlistanontext": "Ama hina kaspa, $1 watiqana sutisuyuykipi imakunatapas qhawanaykipaq icha hukchanaykipaq.",
     "watchnologin": "Manam yaykurqankichu",
-    "watchnologintext": "[[Special:UserLogin|Yaykunaykim]] tiyan watiqana sutisuyuykita hukchanaykipaq.",
     "addwatch": "Watiqasqaykunaman yapay",
     "addedwatchtext": "Kunanqa \"[[:$1]]\" sutiyuq p'anqa [[Special:Watchlist|watiqasqayki p'anqakunaman]] yapasqañam. Chay p'anqapi rimanakuy p'anqanpipas hukchanakunata kay watiqana p'anqapim rikunki.",
     "removewatch": "Watiqasqaykunamanta qichuy",
     "allmessagesname": "Suti",
     "allmessagesdefault": "Ñawpaq qillqa",
     "allmessagescurrent": "Kunan kachkaq qillqa",
-    "allmessagestext": "Kayqa MediaWiki suti k'itipi llamk'achinalla willaykunayuq sutisuyum.\nAma hina kaspa, [https://www.mediawiki.org/wiki/Localisation MediaWiki Localisation] nisqata, [//translatewiki.net translatewiki.net] nisqatapas watukuy, MediaWiki nisqata t'ikraywan yanapayta munaspaykiqa.",
+    "allmessagestext": "Kayqa MediaWiki suti k'itipi llamk'achinalla willaykunayuq sutisuyum.\nAma hina kaspa, [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation MediaWiki Localisation] nisqata, [//translatewiki.net translatewiki.net] nisqatapas watukuy, MediaWiki nisqata t'ikraywan yanapayta munaspaykiqa.",
     "allmessagesnotsupportedDB": "Kay p'anqaqa manam llamk'achinallachu, '''$wgUseDatabaseMessages''' nisqaman ama nisqa kaptinmi.",
     "allmessages-filter-legend": "Ch'illchina",
     "allmessages-filter": "Ch'illchina, allinchasqa kachkaykama:",
index 0f55f36..14289ec 100644 (file)
     "disclaimers": "Infurmaziòn legêli",
     "disclaimerpage": "Project: Avìs generèl",
     "edithelp": "Livar dal spiegaziòn",
-    "helppage": "Help:Tòt j argumént",
     "mainpage": "Prèma Pagina",
     "privacy": "Léz sora agli infurmaziòn persunèli",
     "privacypage": "Project: Léz sora agli infurmaziòn persunèli",
index 93712c6..b91e233 100644 (file)
     "disclaimers": "Ismigilen",
     "disclaimerpage": "Project:Asmigel amatu",
     "edithelp": "Tallalt deg uẓareg",
-    "helppage": "Help:Tira d yiwlafen",
     "mainpage": "Tasna Tamezwarut",
     "mainpage-description": "Tasna Tamezwarut",
     "portal": "Tawwart n timetti",
index 7bc45ab..e931dfb 100644 (file)
@@ -7,7 +7,8 @@
             "Kazu89",
             "Shirayuki",
             "Urhixidur",
-            "לערי ריינהארט"
+            "לערי ריינהארט",
+            "Davent"
         ]
     },
     "tog-underline": "Suttastritgar colliaziuns:",
@@ -72,7 +73,7 @@
     "january": "schaner",
     "february": "favrer",
     "march": "mars",
-    "april": "avril",
+    "april": "avrigl",
     "may_long": "matg",
     "june": "zercladur",
     "july": "fanadur",
@@ -84,7 +85,7 @@
     "january-gen": "schaner",
     "february-gen": "favrer",
     "march-gen": "mars",
-    "april-gen": "avril",
+    "april-gen": "avrigl",
     "may-gen": "matg",
     "june-gen": "zercladur",
     "july-gen": "fanadur",
     "accountcreatedtext": "Il conto d'utilisader [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|talk]]) è vegnì creà.",
     "createaccount-title": "Crear in conto per {{SITENAME}}",
     "createaccount-text": "Insatgi ha creà in conto d'utilisader per tia adressa dad e-mail sin {{SITENAME}} ($4). Il pled-clav generà automaticamain per l'utilisader «$2» è «$3». Ti ta duessas t'annunzar uss e midar tes pled-clav. \n\nSche ti na levas betg crear quest conto d'utilisader pos ti ignorar quest e-mail.",
-    "usernamehasherror": "Il num d'utilisader na po betg cuntegnair il segn da rauta (#)",
     "login-throttled": "Ti has empruvà memia savens da t'annunziar.\nSpetga $1 avant ch'empruvar anc ina giada.",
     "login-abort-generic": "Annunzia senza success - Annullà",
     "loginlanguagelabel": "Lingua: $1",
     "session_fail_preview_html": "''Stgisa! Tia modificaziun na pudeva betg vegnir memorisada perquei che las datas da la sesida èn idas a perder.'''\n\n''Perquai che {{SITENAME}} ha activà la pussaivlada d'utilisar HTML è la prevista betg visibla per impedir attaccas cun JavaScript.''\n\n'''Emprova per plaschair danovamain.'''\nSche quai na funcziuna anc adina betg, emprova da [[Special:UserLogout|partir]] ed anc ina giada t'annunziar.",
     "token_suffix_mismatch": "'''Tia modificaziun è vegnida refusada perquai che tes navigatur ha manizzà ils segns en il token da modifitgar.'''\nLa modificaziun è vegnida refusada per evitar ch'il cuntegn da la pagina vegnia destruì. \nQuai po capitar sche ti utiliseschas in survetsch da proxy anonim che na funcziuna betg correctamain.",
     "edit_form_incomplete": "'''Entginas parts dal formular da modifitgar n'èn betg arrivadas cumplattamain al server; controllescha p.pl. che tias midadas èn intactas ed emprova danovamain.'''",
-    "editing": "Modifitgar $1",
-    "creating": "Crear $1",
-    "editingsection": "Modifitgar $1 (secziun)",
-    "editingcomment": "Modifitgar $1 (nova secziun)",
+    "editing": "Modifitgar «$1»",
+    "creating": "Crear «$1»",
+    "editingsection": "Modifitgar «$1» (secziun)",
+    "editingcomment": "Modifitgar «$1» (nova secziun)",
     "editconflict": "Conflict da modifitgar: $1",
     "explainconflict": "Insatgi auter ha midà questa pagina dapi che ti has cumenzà a la modifitgar. \nIl champ d'endataziun sura cuntegna il text sco che la pagina vesa ora actualmain. \nTias midadas èn mussadas en il champ d'endataziun sut. \nTi stos integrar tias midadas en il text existent. \n'''Mo''' il text en il champ d'endataziun sura vegn memorià sche ti cliccas sin \"{{int:savearticle}}\".",
     "yourtext": "Tes text",
     "prefs-skin": "Skin",
     "skin-preview": "Prevista",
     "datedefault": "Nagina preferenza",
-    "prefs-beta": "Funcziuns da Beta",
-    "prefs-datetime": "Data e temp",
     "prefs-labs": "Funcziuns experimentalas",
     "prefs-user-pages": "Paginas dad utilisader",
     "prefs-personal": "Profil da l'utilisader",
     "upload-permitted": "Tips da datotecas lubids: $1.",
     "upload-preferred": "Tips da datotecas preferids: $1.",
     "upload-prohibited": "Tips da datotecas betg lubids: $1.",
-    "uploadlog": "protocol da datotecas chargiadas si",
     "uploadlogpage": "Protocol da datotecas chargiadas si",
     "uploadlogpagetext": "Quai è ina glista da las datotecas ch'èn vegnidas chargiadas si sco ultimas.\nGuarda era la [[Special:NewFiles|galleria da novas datotecas]] per ina survista pli visuala.",
     "filename": "Num da datoteca",
     "filereuploadsummary": "Midadas da la datoteca:",
     "filestatus": "Status dals dretgs d'autur:",
     "filesource": "Funtauna:",
-    "uploadedfiles": "Datotecas chargiadas si",
     "ignorewarning": "Ignorar l'avertiment e memorisar la datoteca",
     "ignorewarnings": "Ignorar tut ils avertiments (Warnung)",
     "minlength1": "Nums da datotecas ston esser almain in bustab lung.",
     "overwroteimage": "ha chargià si ina nova versiun da \"[[$1]]\"",
     "uploaddisabled": "Chargiar si è deactivà.",
     "copyuploaddisabled": "Il transferir per URL è deactivà.",
-    "uploadfromurl-queued": "Tia datoteca per transferir è vegnida agiuntada a la colonna da spetga.",
     "uploaddisabledtext": "La funcziun da chargiar si datotecas è deactivada.",
     "php-uploaddisabledtext": "La funcziun da chargiar si datotecas è deactivada en PHP. \nControllescha per plaschair l'opziun <code>file_uploads</code>.",
     "uploadscripted": "Questa datoteca cuntegna HTML u code da scripts che pudess vegnir exequì per sbagl dal navigatur.",
     "upload-misc-error": "Errur da transferir nunenconuschenta",
     "upload-misc-error-text": "Ina errur nunenconuschenta è capitada durant transferir. \nControllescha per plaschair che l'URL è valida ed accessibla ed emprova anc ina giada.\nSch'il problem exista anc adina, contactescha in [[Special:ListUsers/sysop|administratur]].",
     "upload-too-many-redirects": "La URL ha cuntegnì memia blers renviaments",
-    "upload-unknown-size": "Grondezza nunenconuschenta",
     "upload-http-error": "In sbagl da HTTP è capità: $1",
     "upload-copy-upload-invalid-domain": "Transferir copias n'è betg pussaivel sin questa domain.",
     "backend-fail-stream": "Impussibel da leger la datoteca $1.",
     "img-auth-streaming": "Stream da \"$1\".",
     "img-auth-public": "La funcziun da img_auth.php è da returnar datotecas d'in vichi privat.\nQuest vichi è configurà sco public.\nPer cuntanscher segirezza opgimala è img_auth.php deactivà.",
     "img-auth-noread": "L'utilisader n'ha betg access da leger \"$1\".",
-    "img-auth-bad-query-string": "L'URL ha in string da query nunvalid.",
     "http-invalid-url": "URL nunvalida: $1",
     "http-invalid-scheme": "URLs dal schema \"$1\" na vegnan betg sustegnidas.",
     "http-request-error": "La damonda HTTP n'è betg reussida causa ina errur nunenconuschenta.",
     "filehist-dimensions": "dimensiuns",
     "filehist-filesize": "grondezza da datoteca",
     "filehist-comment": "commentari",
-    "filehist-missing": "Datoteca manca",
     "imagelinks": "Utilisaziun da la datoteca",
     "linkstoimage": "{{PLURAL:$1|La suandanta pagina è colliada|Las suandantas $1 paginas èn colliadas}} cun questa datoteca:",
     "linkstoimage-more": "Dapli che {{PLURAL:$1|ina pagina è colliada|$1 paginas èn colliadas}} a questa datoteca.\nLa suandanta glista mussa be {{PLURAL:$1|l'emprima colliaziun|las emprimas $1 colliaziuns}} a questa pagina.\nIna [[Special:WhatLinksHere/$2|glista cumpletta]] è disponibla",
     "emailuser-title-notarget": "Trametter in e-mail a l'utilisader",
     "emailpage": "Trametter in e-mail a l'utilisader",
     "emailpagetext": "Ti pos utilisar il formular sutvart per trametter in'e-mail a {{GENDER:$1|quest utilisader|questa utilisadra}}.\nL'adressa dad e-mail che ti has endatà en [[Special:Preferences|tias preferenzas]] vegn inditgada sco speditur da l'e-mail, uschia {{GENDER:$1|ch'il retschavider|che la retschavidra}} po rispunder directamain a tai.",
-    "usermailererror": "La funcziun dad e-mail ha returnà ina errur:",
     "defemailsubject": "{{SITENAME}} e-mail da l'utilisader \"$1\"",
     "usermaildisabled": "Trametter e-mails è deactivà",
     "usermaildisabledtext": "Ti na pos betg trametter e-mails ad auters utilisaders sin questa wiki",
     "noemailtitle": "Nagina adressa dad e-mail",
     "noemailtext": "Quest utilisader n'ha betg inditgà ina adressa dad e-mail valida.",
-    "nowikiemailtitle": "Betg lubì da termetter e-mail",
     "nowikiemailtext": "Quest utilisader ha tschernì ch'el na vul betg reschaiver e-mails dad auters utilisaders.",
     "emailnotarget": "Num d'utilisader nunexistent u nunvalid sco desinatur.",
     "emailtarget": "Endatescha il num d'utilisader dal destinatur",
     "nowatchlist": "Ti n'has nagins elements sin tia glista d'observaziun.",
     "watchlistanontext": "Ti stos $1 per vesair u modifitgar elements sin tia glista d'observaziun",
     "watchnologin": "Ti n'es betg t'annunzià!",
-    "watchnologintext": "Ti stos [[Special:UserLogin|t'annunziar]] per midar tia glista d'observaziun.",
     "addwatch": "Agiuntar a la glista d'observaziun",
     "addedwatchtext": "La pagina \"[[:$1]]\" è vegnida agiuntada a tia [[Special:Watchlist|glista dad observaziun]].\nMidadas futuras vid questa pagina e la pagina da discussiun appertegnenta vegnan mussadas là.",
     "removewatch": "Allontanar da la glista d'observaziun",
     "watching": "observ...",
     "unwatching": "observ betg pli...",
     "watcherrortext": "Ina errur è capitada durant midar tia configuraziun da tia glista d'observaziun per \"$1\".",
-    "enotif_mailer": "Servetsch d'infurmaziun per e-mail da {{SITENAME}}",
     "enotif_reset": "Marcar tut las paginas sco visitadas.",
     "enotif_impersonal_salutation": "Utilisader da {{SITENAME}}",
     "enotif_subject_deleted": "La pagina $1 da {{SITENAME}} è vegnida stizzada da {{GENDER:$2|$2}}",
     "excontent": "il cuntegn era: \"$1\"",
     "excontentauthor": "il cuntegn era: \"$1\" (ed il sulet contribuent era \"[[Special:Contributions/$2|$2]]\")",
     "exbeforeblank": "il cuntegn avant svidar la pagina era: \"$1\"",
-    "exblank": "la pagina era vida",
     "delete-confirm": "Stizzar \"$1\"",
     "delete-legend": "Stizzar",
     "historywarning": "'''Attenziun:''' L'artitgel che ti vuls stizzar ha ina cronologia cun circa {{PLURAL:$1|ina versiun|$1 versiuns}}:",
     "allmessagesname": "num",
     "allmessagesdefault": "text original",
     "allmessagescurrent": "text actual",
-    "allmessagestext": "Quai è ina glista da tut ils messadis dals differents tips da paginas da MediaWiki che vegnan utilisadas da la software MediaWiki.\nFai ina visita sin [https://www.mediawiki.org/wiki/Localisation MediaWiki Localisation] e [//translatewiki.net translatewiki.net] sche ti vuls gidar da translatar la software MediaWiki.",
+    "allmessagestext": "Quai è ina glista da tut ils messadis dals differents tips da paginas da MediaWiki che vegnan utilisadas da la software MediaWiki.\nFai ina visita sin [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation MediaWiki Localisation] e [//translatewiki.net translatewiki.net] sche ti vuls gidar da translatar la software MediaWiki.",
     "allmessagesnotsupportedDB": "Questa pagina na po betg vegnir mussada, perquai che '''$wgUseDatabaseMessages''' è vegnì deactivà.",
     "allmessages-filter-legend": "Filtrar",
     "allmessages-filter": "Filtrar tenor standi da modificaziun:",
     "importunknownsource": "Funtauna d'import nunenconuschenta",
     "importcantopen": "Betg pussaivel dad avrir la datoteca d'import",
     "importbadinterwiki": "Colliaziun interwiki nunvalida",
-    "importnotext": "Vid u nagin text",
     "importsuccess": "Terminà l'import!",
-    "importhistoryconflict": "La cronologia cuntegna versiuns che stattan en conflict (eventualmain è questa pagina gia vegnida importada ina giada)",
     "importnosources": "Naginas funtaunas per l'import transwiki èn vegnidas definidas e la funcziun da chargiar si directamain la coronologia è deactivada.",
     "importnofile": "Nagina datoteca d'import è vegnida chargiada si.",
     "importuploaderrorsize": "Betg reussì da chargiar si la datoteca d'import.\nLa datoteca è pli gronda che la grondezza maximala per chargiar si.",
index 4844455..48873b6 100644 (file)
@@ -91,7 +91,6 @@
     "disclaimers": "Termenurya",
     "disclaimerpage": "Project:Termenurya",
     "edithelp": "Editisaripnasko zhutipen",
-    "helppage": "Help:Zhutipen",
     "mainpage": "Sherutni patrin",
     "mainpage-description": "Sherutni patrin",
     "portal": "Maladipnasko than",
index 9d36cf8..b02da5c 100644 (file)
     "permalink": "Legătură permanentă",
     "print": "Tipărire",
     "view": "Lectură",
+    "view-foreign": "Vizualizare la $1",
     "edit": "Modificare",
+    "edit-local": "Modificare descriere locală",
     "create": "Creare",
+    "create-local": "Adăugare descriere locală",
     "editthispage": "Modificați pagina",
     "create-this-page": "Creați această pagină",
     "delete": "Ștergere",
     "accountcreatedtext": "Contul utilizatorului pentru [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|discuție]]) a fost creat.",
     "createaccount-title": "Creare de cont la {{SITENAME}}",
     "createaccount-text": "Cineva a creat un cont asociat adresei dumneavoastră de e-mail pe {{SITENAME}} ($4) numit „$2” și având parola „$3”.\nEste de dorit să vă autentificați și să schimbați parola cât mai repede.\n\nIgnorați acest mesaj dacă crearea contului s-a produs în urma unei greșeli.",
-    "usernamehasherror": "Numele de utilizator nu poate conține caractere diez (#)",
     "login-throttled": "Ați avut prea multe încercări recente de a vă autentifica.\nVă rugăm să așteptați $1 până să reîncercați.",
     "login-abort-generic": "Procesul de autentificare a eșuat și a fost abandonat",
     "loginlanguagelabel": "Limba: $1",
     "templatesusedsection": "{{PLURAL:$1|Format utilizat|Formate utilizate}} în această secțiune:",
     "template-protected": "(protejat)",
     "template-semiprotected": "(semiprotejat)",
-    "hiddencategories": "Această pagină este membrul {{PLURAL:$1|unei categorii ascunse|a $1 categorii ascunse}}:",
+    "hiddencategories": "Această pagină este membră {{PLURAL:$1|a unei categorii ascunse|a $1 categorii ascunse|a $1 de categorii ascunse}}:",
     "edittools": "<!-- Acest text va apărea după caseta de editare și formularele de trimitere fișier. -->",
     "nocreatetext": "{{SITENAME}} a restricționat abilitatea de a crea pagini noi.\nPuteți edita o pagină deja existentă sau puteți să vă [[Special:UserLogin|autentificați/creați]] un cont de utilizator.",
     "nocreate-loggedin": "Nu ai permisiunea să creezi pagini noi.",
     "prefs-skin": "Aspect",
     "skin-preview": "Previzualizare",
     "datedefault": "Nici o preferință",
-    "prefs-beta": "Opțiuni beta",
-    "prefs-datetime": "Data și ora",
     "prefs-labs": "Opțiuni „labs”",
     "prefs-user-pages": "Pagini de utilizator",
     "prefs-personal": "Informații personale",
     "right-protect": "Schimbă nivelurile de protejare și modifică pagini protejate în cascadă",
     "right-editprotected": "Modifică pagini protejate ca „{{int:protect-level-sysop}}”",
     "right-editsemiprotected": "Modifică pagini protejate ca „{{int:protect-level-autoconfirmed}}”",
-    "right-editinterface": "Modificare interfața cu utilizatorul",
+    "right-editinterface": "Modifică interfața cu utilizatorul",
     "right-editusercssjs": "Modifică fișierele CSS și JS ale altor utilizatori",
     "right-editusercss": "Modifică fișierele CSS ale altor utilizatori",
     "right-edituserjs": "Modifică fișierele JS ale altor utilizatori",
     "upload-permitted": "Tipuri de fișiere permise: $1.",
     "upload-preferred": "Tipuri de fișiere preferate: $1.",
     "upload-prohibited": "Tipuri de fișiere interzise: $1.",
-    "uploadlog": "jurnal fișiere trimise",
     "uploadlogpage": "Jurnal fișiere trimise",
     "uploadlogpagetext": "Mai jos este afișată lista ultimelor fișiere trimise.\nVezi [[Special:NewFiles|galeria fișierelor noi]] pentru o mai bună vizualizare.",
     "filename": "Nume fișier",
     "filereuploadsummary": "Modificări ale fișierului:",
     "filestatus": "Statutul drepturilor de autor:",
     "filesource": "Sursă:",
-    "uploadedfiles": "Fișiere trimise",
     "ignorewarning": "Ignoră avertismentul și salvează fișierul",
     "ignorewarnings": "Ignoră orice avertismente",
     "minlength1": "Numele fișierelor trebuie să fie cel puțin o literă.",
     "overwroteimage": "încărcat o versiune nouă a fișierului \"[[$1]]\"",
     "uploaddisabled": "Ne pare rău, trimiterea de imagini este dezactivată.",
     "copyuploaddisabled": "Trimiterea prin URL este dezactivată.",
-    "uploadfromurl-queued": "Fișierul a fost pus în șirul de așteptare.",
     "uploaddisabledtext": "Încărcările de fișiere sunt dezactivate.",
     "php-uploaddisabledtext": "Încărcarea de fișiere este dezactivată în PHP.\nVă rugăm să verificați setările din file_uploads.",
     "uploadscripted": "Fișierul conține HTML sau cod script care poate fi interpretat în mod eronat de un browser.",
     "upload-misc-error": "Eroare de încărcare necunoscută",
     "upload-misc-error-text": "A apărut o eroare necunoscută în timpul încărcării.\nVă rugăm să verificați dacă adresa URL este validă și accesibilă și încercați din nou.\nDacă problema persistă, contactați un [[Special:ListUsers/sysop|administrator]].",
     "upload-too-many-redirects": "URL-ul conținea prea multe redirecționări",
-    "upload-unknown-size": "Mărime necunoscută",
     "upload-http-error": "A avut loc o eroare HTTP: $1",
     "upload-copy-upload-invalid-domain": "Încărcarea copiilor nu este disponibilă pentru acest domeniu.",
     "backend-fail-stream": "Imposibil de citit fișierul $1.",
     "img-auth-streaming": "Derularea continuă a \"$1\".",
     "img-auth-public": "Funcția img_auth.php este pentru a exporta fișiere de pe un wiki privat.\nAcest wiki este configurat ca unul public.\nPentru securitate optimă, img_auth.php este dezactivat.",
     "img-auth-noread": "Acest utilizator nu are acces să citească \"$1\".",
-    "img-auth-bad-query-string": "Adresa URL are un șir de interogare invalid.",
     "http-invalid-url": "URL invalid: $1",
     "http-invalid-scheme": "Adresele URL cu schema „$1” nu sunt acceptate.",
     "http-request-error": "Cererea HTTP a eșuat din cauza unei erori necunoscute.",
     "filehist-dimensions": "Dimensiuni",
     "filehist-filesize": "Mărimea fișierului",
     "filehist-comment": "Comentariu",
-    "filehist-missing": "Fișier lipsă",
     "imagelinks": "Utilizarea fișierului",
     "linkstoimage": "{{PLURAL:$1|Următoarea pagină trimite spre|Următoarele $1 pagini trimit spre|Următoarele $1 de pagini trimit spre}} această imagine:",
     "linkstoimage-more": "Mai mult de $1 {{PLURAL:$1|pagină este legată|pagini sunt legate}} de acest fișier.\nUrmătoarea listă arată {{PLURAL:$1|prima legătură|primele $1 legături}} către acest fișier.\nO [[Special:WhatLinksHere/$2|listă completă]] este disponibilă.",
     "listgrouprights-removegroup-self": "{{PLURAL:$2|Poate fi șters grupul|Pot fi șterse grupurile}} pentru contul propriu: $1",
     "listgrouprights-addgroup-self-all": "Pot fi adăugate toate grupurile contului propriu",
     "listgrouprights-removegroup-self-all": "Pot fi șterse toate grupurile din contul propriu",
+    "listgrouprights-namespaceprotection-header": "Restricții de spațiu de nume",
+    "listgrouprights-namespaceprotection-namespace": "Spațiu de nume",
+    "listgrouprights-namespaceprotection-restrictedto": "Drept(uri) care permit(e) utilizatorului modificări",
+    "trackingcategories": "Categorii de urmărire",
+    "trackingcategories-summary": "Această pagină conține categorii de urmărire care sunt populate în mod automat de către software-ul MediaWiki. Numele acestora se pot schimba modificând mesajele de sistem relevante din spațiul de nume {{ns:8}}.",
+    "trackingcategories-msg": "Categorie de urmărire",
+    "trackingcategories-name": "Numele mesajului",
+    "trackingcategories-desc": "Criteriile de includere în categorie",
+    "noindex-category-desc": "Pagina conține cuvântul magic <code><nowiki>__NOINDEX__</nowiki></code> (aflându-se într-un spațiu de nume care permite acest marcaj) și, drept urmare, nu este indexată de roboți.",
+    "index-category-desc": "Pagina conține cuvântul magic <code><nowiki>__INDEX__</nowiki></code> (aflându-se într-un spațiu de nume care permite acest marcaj) și, ca urmare, este indexată de roboți, deși în mod normal acest lucru nu s-ar fi întâmplat.",
+    "post-expand-template-inclusion-category-desc": "După extinderea tuturor formatelor, dimensiunea paginii a depășit <code>$wgMaxArticleSize</code>, astfel că anumite formate nu au fost extinse.",
+    "post-expand-template-argument-category-desc": "După extinderea argumentului unui format (ceva plasat între acolade triple, precum <code>{{{Foo}}})</code>, pagina a depășit <code>$wgMaxArticleSize</code>.",
+    "broken-file-category-desc": "Categorie adăugată dacă pagina conține o legătură întreruptă către un fișier (o legătură folosită pentru încorporarea unui fișier atunci când fișierul nu există).",
+    "hidden-category-category-desc": "Această categorie conține <code><nowiki>__HIDDENCAT__</nowiki></code>, ceea ce împiedică în mod implicit afișarea ei în zona cu legături către categorii din cadrul paginilor.",
+    "trackingcategories-nodesc": "Nicio descriere disponibilă.",
+    "trackingcategories-disabled": "Categoria este dezactivată",
     "mailnologin": "Nu există adresă de trimitere",
     "mailnologintext": "Trebuie să fii [[Special:UserLogin|autentificat]] și să ai o adresă validă de e-mail în [[Special:Preferences|preferințe]] pentru a trimite e-mail altor utilizatori.",
     "emailuser": "Trimiteți un e-mail",
     "emailuser-title-notarget": "E-mail către utilizator",
     "emailpage": "E-mail către utilizator",
     "emailpagetext": "Puteți folosi formularul de mai jos pentru a trimite un e-mail {{GENDER:$1|acestui utilizator|acestei utilizatoare}}.\nAdresa de e-mail specificată de dumneavoastră în [[Special:Preferences|preferințele de utilizator]] va apărea ca adresa expeditorului e-mailului; astfel, destinatarul va putea să vă răspundă direct.",
-    "usermailererror": "Obiectul de mail a dat eroare:",
     "defemailsubject": "E-mail {{SITENAME}} de la utilizatorul „$1”",
     "usermaildisabled": "E-mail dezactivat",
     "usermaildisabledtext": "Nu puteți trimite e-mail altor utilizatori ai acestui wiki.",
     "noemailtitle": "Fără adresă de e-mail",
     "noemailtext": "Utilizatorul nu a specificat o adresă validă de e-mail.",
-    "nowikiemailtitle": "Nu este permis e-mail-ul",
     "nowikiemailtext": "Acest utilizator a ales să nu primească e-mail-uri de la alți utilizatori.",
     "emailnotarget": "Destinatarul este un nume de utilizator inexistent sau invalid.",
     "emailtarget": "Introduceți numele de utilizator al destinatarului",
     "nowatchlist": "Lista dumneavoastră de pagini urmărite nu conține nici o pagină.",
     "watchlistanontext": "Vă rugăm să vă $1 pentru a vizualiza sau edita elementele din lista dumneavoastră de pagini urmărite.",
     "watchnologin": "Nu sunteți autentificat",
-    "watchnologintext": "Trebuie să fiți [[Special:UserLogin|autentificat]] pentru a vă modifica lista de pagini urmărite.",
     "addwatch": "Adăugă la lista de pagini urmărite",
     "addedwatchtext": "Pagina „[[:$1]]” a fost adăugată la lista dumneavoastră de [[Special:Watchlist|pagini urmărite]].\nModificările viitoare efectuate asupra acestei pagini dar și asupra paginii de discuție asociată vor fi listate acolo.",
     "removewatch": "Elimină din lista de pagini urmărite",
     "unwatchthispage": "Nu mai urmări",
     "notanarticle": "Nu este un articol",
     "notvisiblerev": "Versiunea a fost ștearsă",
-    "watchlist-details": "{{PLURAL:$1|O pagină|$1 pagini urmărite|$1 de pagini urmărite}}, excluzând paginile de discuție.",
+    "watchlist-details": "{{PLURAL:$1|O pagină|$1 pagini urmărite|$1 de pagini urmărite}}, fără a include separat paginile de discuție.",
     "wlheader-enotif": "Notificarea prin e-mail este activată.",
     "wlheader-showupdated": "Paginile care au fost modificate după ultima dumneavoastră vizită sunt afișate '''îngroșat'''.",
     "watchmethod-recent": "căutarea schimbărilor recente pentru paginile urmărite",
     "watching": "Se urmărește...",
     "unwatching": "Așteptați...",
     "watcherrortext": "A apărut o eroare în timp ce se modificau setările listei de pagini urmărite pentru „$1”.",
-    "enotif_mailer": "Sistemul de notificare {{SITENAME}}",
     "enotif_reset": "Marchează toate paginile vizitate",
     "enotif_impersonal_salutation": "Utilizator {{SITENAME}}",
     "enotif_subject_deleted": "Pagina $1 de la {{SITENAME}} a fost ștearsă de către {{gender:$2|$2}}",
     "excontent": "conținutul era: '$1'",
     "excontentauthor": "conținutul era: „$1” (unicul contribuitor: [[Special:Contributions/$2|$2]])",
     "exbeforeblank": "conținutul înainte de golire era: '$1'",
-    "exblank": "pagina era goală",
     "delete-confirm": "Şterge \"$1\"",
     "delete-legend": "Şterge",
     "historywarning": "'''Atenție:''' istoricul paginii pe care o ștergeți conține aproximativ $1 {{PLURAL:$1|versiune|versiuni|de versiuni}}:",
     "contributions-title": "Contribuțiile utilizatorului $1",
     "mycontris": "Contribuții",
     "contribsub2": "Pentru {{GENDER:$3|$1}} ($2)",
+    "contributions-userdoesnotexist": "Contul de utilizator „$1” nu este înregistrat.",
     "nocontribs": "Nu a fost găsită nici o modificare care să satisfacă acest criteriu.",
     "uctop": "(actuală)",
     "month": "Din luna (și dinainte):",
     "sp-contributions-newbies-sub": "Pentru începători",
     "sp-contributions-newbies-title": "Contribuțiile utilizatorului pentru conturile noi",
     "sp-contributions-blocklog": "jurnal blocări",
+    "sp-contributions-suppresslog": "contribuții suprimate ale utilizatorului",
     "sp-contributions-deleted": "contribuțiile șterse ale utilizatorului",
     "sp-contributions-uploads": "încărcări",
     "sp-contributions-logs": "jurnale",
     "sp-contributions-blocked-notice": "Acest utilizator este momentan blocat.\nUltima blocare este indicată mai jos pentru informare:",
     "sp-contributions-blocked-notice-anon": "Această adresă IP este blocată acum.\nIată aici ultima înregistrare relevantă din jurnalul blocărilor:",
     "sp-contributions-search": "Căutare contribuții",
-    "sp-contributions-suppresslog": "contribuții suprimate ale utilizatorului",
     "sp-contributions-username": "Adresă IP sau nume de utilizator:",
     "sp-contributions-toponly": "Afișează numai versiunile recente",
     "sp-contributions-newonly": "Afișează numai modificările care au dus la crearea de pagini",
     "allmessagesname": "Nume",
     "allmessagesdefault": "Textul standard",
     "allmessagescurrent": "Textul curent",
-    "allmessagestext": "Aceasta este lista completă a mesajelor disponibile în domeniul MediaWiki.\nVă rugăm să vizitați [https://www.mediawiki.org/wiki/Localisation MediaWiki Localisation] și [//translatewiki.net translatewiki.net] dacă vreți să contribuiți la localizarea programului MediaWiki generic.",
+    "allmessagestext": "Aceasta este lista completă a mesajelor disponibile în domeniul MediaWiki.\nVă rugăm să vizitați [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation MediaWiki Localisation] și [//translatewiki.net translatewiki.net] dacă vreți să contribuiți la localizarea programului MediaWiki generic.",
     "allmessagesnotsupportedDB": "'''{{ns:special}}:Allmessages''' nu poate fi folosit deoarece '''$wgUseDatabaseMessages''' este închisă.",
     "allmessages-filter-legend": "Filtru",
     "allmessages-filter": "Filtru după statutul de modificare:",
     "importunknownsource": "Tipul sursei de import este necunoscut",
     "importcantopen": "Fișierul importat nu a putut fi deschis",
     "importbadinterwiki": "Legătură interwiki greșită",
-    "importnotext": "Gol sau fără text",
     "importsuccess": "Import reușit!",
-    "importhistoryconflict": "Există istorii contradictorii (se poate să fi importat această pagină înainte)",
     "importnosources": "Nici o sursă de import transwiki a fost definită și încărcările directe ale istoricului sunt oprite.",
     "importnofile": "Nici un fișier pentru import nu a fost încărcat.",
     "importuploaderrorsize": "Încărcarea fișierului a eșuat.\nFișierul are o mărime mai mare decât limita de încărcare permisă.",
index c9ba9e0..8dcd9df 100644 (file)
     "prefs-skin": "Skin",
     "skin-preview": "Andeprime",
     "datedefault": "Nisciuna preferenze",
-    "prefs-beta": "Funziune de Beta",
     "prefs-datetime": "Date e ore",
     "prefs-labs": "Funziune de Labs",
     "prefs-user-pages": "Pàgene de l'utende",
     "nowatchlist": "Non ge tine pàggene jndr'à liste de le pàggene condrollete.",
     "watchlistanontext": "Pe piacere $1 pe vedè o cangià le vosce sus a liste de le pàggene condrollete.",
     "watchnologin": "Non ge sinde colleghete",
-    "watchnologintext": "Tu a essere [[Special:UserLogin|colleghete]] pe cangià le pàggene condrollete tue.",
     "addwatch": "Mitte jndr'à le pàggene condrollate",
     "addedwatchtext": "'A pàgene \"[[:$1]]\" ha state aggiunde jndr'à le [[Special:Watchlist|pàggene condrollate]].\nLe cangiaminde future a sta pàgene e 'a pàgene de le 'ngazzaminde associete le puè acchià aqquà.",
     "removewatch": "Live da le pàggene condrollate",
     "allmessagesname": "Nome",
     "allmessagesdefault": "Teste de default",
     "allmessagescurrent": "Teste corrende",
-    "allmessagestext": "Queste jè 'na liste de tutte le messagge d'u sisteme ca se ponne acchià jndr'à le namespace de MediaUicchi.\nPe piacere vè vide [https://www.mediawiki.org/wiki/Localisation Localizzazione de MediaUicchi] e [//translatewiki.net translatewiki.net] ce tu vuè ccu condrebbuisce a 'a localizzazione de MediaUicchi.",
+    "allmessagestext": "Queste jè 'na liste de tutte le messagge d'u sisteme ca se ponne acchià jndr'à le namespace de MediaUicchi.\nPe piacere vè vide [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation Localizzazione de MediaUicchi] e [//translatewiki.net translatewiki.net] ce tu vuè ccu condrebbuisce a 'a localizzazione de MediaUicchi.",
     "allmessagesnotsupportedDB": "Sta pàgene non ge pò essere ausate purcè '''$wgUseDatabaseMessages''' ha state disabbilitate.",
     "allmessages-filter-legend": "Filtre",
     "allmessages-filter": "Filtre cu 'nu state personalizzate:",
index 49298f5..1dec640 100644 (file)
@@ -1,6 +1,69 @@
 {
     "@metadata": {
-        "authors": []
+        "authors": [
+            "Ahonc",
+            "Aleksandrit",
+            "AlexSm",
+            "Alexandr Efremov",
+            "Altai uul",
+            "Amikeco",
+            "Amire80",
+            "Askarmuk",
+            "BellaIlabekyan",
+            "Bouron",
+            "Chilin",
+            "Cinemantique",
+            "Claymore",
+            "Cryptocoryne",
+            "DCamer",
+            "Dim Grits",
+            "Don Alessandro",
+            "Eleferen",
+            "Erdemaslancan",
+            "EugeneZelenko",
+            "Eugrus",
+            "Ferrer",
+            "Flrn",
+            "G0rn",
+            "Geitost",
+            "Grigol",
+            "Haffman",
+            "HalanTul",
+            "Ignatus",
+            "Illusion",
+            "Iluvatar",
+            "Iniquity",
+            "Innv",
+            "Ivan Shmakov",
+            "JenVan",
+            "KPu3uC B Poccuu",
+            "Kaganer",
+            "Kalan",
+            "KorneySan",
+            "Kv75",
+            "Lockal",
+            "Lunacy1911",
+            "Matma Rex",
+            "MaxSem",
+            "Milicevic01",
+            "NBS",
+            "Nemo bis",
+            "Okras",
+            "Ole Yves",
+            "Putnik",
+            "Rave",
+            "Rubin16",
+            "Soul Train",
+            "Spider",
+            "Sunpriat",
+            "VasilievVV",
+            "Volkov",
+            "Ytsukeng Fyvaprol",
+            "Александр Сигачёв",
+            "ОйЛ",
+            "Умар",
+            "לערי ריינהארט"
+        ]
     },
     "tog-underline": "Подчёркивание ссылок:",
     "tog-hideminor": "Скрывать малые правки в списке свежих правок",
     "permalink": "Постоянная ссылка",
     "print": "Печать",
     "view": "Просмотр",
+    "view-foreign": "Посмотреть на сайте $1",
     "edit": "Править",
+    "edit-local": "Редактировать локальное описание",
     "create": "Создать",
+    "create-local": "Добавить локальное описание",
     "editthispage": "Править эту страницу",
     "create-this-page": "Создать эту страницу",
     "delete": "Удалить",
     "pool-timeout": "Истекло время ожидания блокировки",
     "pool-queuefull": "Накопитель запросов полон",
     "pool-errorunknown": "Неизвестная ошибка",
+    "pool-servererror": "Служба счётчика пула недоступна ($1).",
     "aboutsite": "Описание {{grammar:genitive|{{SITENAME}}}}",
     "aboutpage": "Project:Описание",
     "copyright": "Содержимое доступно по лицензии $1 (если не указано иное).",
     "accountcreatedtext": "Создана учётная запись участника [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|обс.]]).",
     "createaccount-title": "{{SITENAME}}: создание учётной записи",
     "createaccount-text": "Кто-то создал учётную запись «$2» на сервере проекта {{SITENAME}} ($4), указав ваш адрес электронной почты. \n\nПароль учётной записи — «$3». Вам следует авторизоваться на сайте и изменить пароль.\n\nПроигнорируйте данное сообщение, если учётная запись была создана по ошибке.",
-    "usernamehasherror": "Имя участника не может содержать символ «решётки»",
     "login-throttled": "Вы сделали слишком много попыток представиться системе.\nПожалуйста, подождите $1 перед тем, как попробовать снова.",
     "login-abort-generic": "Неудачная попытка представиться системе",
     "loginlanguagelabel": "Язык: $1",
     "prefs-skin": "Тема оформления",
     "skin-preview": "Предпросмотр",
     "datedefault": "По умолчанию",
-    "prefs-beta": "Бета-возможности",
-    "prefs-datetime": "Дата и время",
     "prefs-labs": "Экспериментальные возможности",
     "prefs-user-pages": "Страницы участника",
     "prefs-personal": "Личные данные",
     "upload-permitted": "Разрешённые типы файлов: $1.",
     "upload-preferred": "Предпочтительные типы файлов: $1.",
     "upload-prohibited": "Запрещённые типы файлов: $1.",
-    "uploadlog": "журнал загрузок",
     "uploadlogpage": "Журнал загрузок",
     "uploadlogpagetext": "Ниже представлен список последних загрузок файлов.\nСм. также [[Special:NewFiles|галерею новых файлов]], где сведения о новых загрузках представлены в более наглядном виде.",
     "filename": "Имя файла",
     "filereuploadsummary": "Изменения в файле:",
     "filestatus": "Условия распространения:",
     "filesource": "Источник:",
-    "uploadedfiles": "Загруженные файлы",
     "ignorewarning": "Игнорировать предупреждения и сохранить файл",
     "ignorewarnings": "Игнорировать предупреждения",
     "minlength1": "Название файла должно содержать хотя бы одну букву.",
     "overwroteimage": "загружена новая версия «[[$1]]»",
     "uploaddisabled": "Загрузка запрещена",
     "copyuploaddisabled": "Загрузка по URL отключена.",
-    "uploadfromurl-queued": "Ваша загрузка поставлена в очередь.",
     "uploaddisabledtext": "Загрузка файлов отключена.",
     "php-uploaddisabledtext": "Загрузка файлов отключена в настройках PHP. Пожалуйста, проверьте значение свойства file_uploads.",
     "uploadscripted": "Файл содержит HTML-код или скрипт, который может быть ошибочно обработан браузером.",
     "upload-misc-error": "Неизвестная ошибка загрузки",
     "upload-misc-error-text": "Неизвестная ошибка загрузки. Пожалуйста, проверьте, что адрес верен, и повторите попытку. Если проблема остаётся, обратитесь к [[Special:ListUsers/sysop|администратору]].",
     "upload-too-many-redirects": "URL содержит слишком много перенаправлений",
-    "upload-unknown-size": "Неизвестный размер",
     "upload-http-error": "Произошла ошибка HTTP: $1",
     "upload-copy-upload-invalid-domain": "Копирование загрузок не доступно в этом домене.",
     "backend-fail-stream": "Не удалось транслировать файл $1.",
     "img-auth-streaming": "Потоковая передача «$1».",
     "img-auth-public": "Назначением img_auth.php является вывод файлов из закрытой вики.\nЭта вики настроена как общедоступная.\nДля оптимизации безопасности img_auth.php отключена.",
     "img-auth-noread": "Участник не имеет доступа на чтение «$1».",
-    "img-auth-bad-query-string": "URL-адрес содержит неправильную строку запроса.",
     "http-invalid-url": "Ошибочный URL: $1",
     "http-invalid-scheme": "Не поддерживаются адреса со схемой «$1»",
     "http-request-error": "Сбой HTTP-запроса из-за неизвестной ошибки.",
     "filehist-dimensions": "Размеры",
     "filehist-filesize": "Размер файла",
     "filehist-comment": "Примечание",
-    "filehist-missing": "Файл отсутствует",
     "imagelinks": "Использование файла",
     "linkstoimage": "{{PLURAL:$1|Следующая $1 страница ссылается|Следующие $1 страниц ссылаются|Следующие $1 страницы ссылаются}} на данный файл:",
     "linkstoimage-more": "Более $1 {{PLURAL:$1|страницы|страниц}} ссылаются на этот файл.\nВ данном списке {{PLURAL:$1|представлена только $1 ссылка|представлены только $1 ссылок|представлены только $1 ссылки}} на этот файл.\nДоступен также [[Special:WhatLinksHere/$2|полный список]].",
     "listgrouprights-removegroup-self": "может удалять свою учётную запись из {{PLURAL:$2|1=группы|групп}}: $1",
     "listgrouprights-addgroup-self-all": "Может добавлять все группы к своей учётной записи",
     "listgrouprights-removegroup-self-all": "может удалять все группы со своей учётной записи",
+    "listgrouprights-namespaceprotection-header": "Ограничения пространства имён",
+    "listgrouprights-namespaceprotection-namespace": "Пространство имён",
+    "listgrouprights-namespaceprotection-restrictedto": "Права, позволяющие участнику редактировать",
+    "trackingcategories": "Отслеживающие категории",
+    "trackingcategories-summary": "На этой странице перечислены отслеживающие категории, которые автоматически заполняются программным обеспечением MediaWiki. Их можно переименовать, изменив соответствующие системные сообщения в пространстве имён {{ns:8}}.",
+    "trackingcategories-msg": "Отслеживающая категория",
+    "trackingcategories-name": "Имя сообщения",
+    "trackingcategories-desc": "Критерий включения в категорию",
+    "noindex-category-desc": "Страница не индексируются поисковыми роботами, потому что на ней имеется «волшебное слово» <code><nowiki>__NOINDEX__</nowiki></code>, и она находится в пространстве имён, где разрешён этот флаг).",
+    "index-category-desc": "На странице имеется «волшебное слово» __INDEX__ (и страница находится в пространстве имён, где разрешён этот флаг), поэтому она индексируются поисковыми роботами в тех случаях, когда этого обычно не происходит.",
+    "post-expand-template-inclusion-category-desc": "После показа всех шаблонов размер страницы станет больше, чем <code>$wgMaxArticleSize</code>, поэтому некоторые шаблоны не были показаны полностью.",
+    "post-expand-template-argument-category-desc": "После раскрытия аргумента шаблона (что-нибудь в тройных фигурных скобках, например, <code>{{{Foo}}})</code>, страница станет больше, чем <code>$wgMaxArticleSize</code>.",
+    "expensive-parserfunction-category-desc": "На странице используется слишком много ресурсоёмких функций (таких, как <code>#ifexist</code>). Подробнее — на странице [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit Manual:$wgExpensiveParserFunctionLimit].",
+    "broken-file-category-desc": "Категория добавляется, если страница содержит некорректную файловую ссылку (ссылку на несуществующий файл).",
+    "hidden-category-category-desc": "Это категория с добавленной меткой <code><nowiki>__HIDDENCAT__</nowiki></code> в ней, что по умолчанию предотвращает её отображение на страницах в разделе категорий.",
+    "trackingcategories-nodesc": "Описание отсутствует.",
+    "trackingcategories-disabled": "Категория отключена",
     "mailnologin": "Адрес для отправки отсутствует",
     "mailnologintext": "Вы должны [[Special:UserLogin|представиться системе]] и иметь действительный адрес электронной почты в ваших [[Special:Preferences|настройках]], чтобы иметь возможность отправлять электронную почту другим участникам.",
     "emailuser": "Письмо участнику",
     "emailuser-title-notarget": "Написание электронного письма участнику",
     "emailpage": "Письмо участнику",
     "emailpagetext": "С помощью данной формы можно отправить сообщение на адрес электронной почты {{GENDER:$1|этого участника|этой участницы}}.\nВ качестве обратного адреса будет указан тот адрес, который вы указали в [[Special:Preferences|своих настройках]], таким образом получатель будет иметь возможность ответить непосредственно вам.",
-    "usermailererror": "При отправке сообщения электронной почты произошла ошибка:",
     "defemailsubject": "{{SITENAME}} — Письмо от $1",
     "usermaildisabled": "Электронная почта участника отключена",
     "usermaildisabledtext": "Вы не можете отправлять электронные письма другим участникам этой вики",
     "noemailtitle": "Адрес электронной почты отсутствует",
     "noemailtext": "Этот участник не указал действительный адрес электронной почты.",
-    "nowikiemailtitle": "Нет разрешения отправлять письма",
     "nowikiemailtext": "Этот участник указал, что не желает получать письма от других участников.",
     "emailnotarget": "Несуществующее или ошибочное имя участника-получателя.",
     "emailtarget": "Введите имя участника-получателя",
     "nowatchlist": "Ваш список наблюдения пуст.",
     "watchlistanontext": "Вы должны $1, чтобы просмотреть или отредактировать список наблюдения.",
     "watchnologin": "Нужно представиться системе",
-    "watchnologintext": "Вы должны [[Special:UserLogin|представиться системе]], чтобы иметь возможность изменять свой список наблюдения",
     "addwatch": "Добавить в список наблюдения",
     "addedwatchtext": "Страница «[[:$1]]» была добавлена в ваш [[Special:Watchlist|список наблюдения]].\nТам будут отмечаться последующие изменения этой страницы, а также связанной с ней страницы обсуждения.",
     "removewatch": "Удалить из списка наблюдения",
     "watching": "Добавление в список наблюдения…",
     "unwatching": "Удаление из списка наблюдения…",
     "watcherrortext": "Произошла ошибка при изменении настройки наблюдения для «$1».",
-    "enotif_mailer": "{{SITENAME}} Служба извещений по почте",
     "enotif_reset": "Отметить все страницы как просмотренные",
     "enotif_impersonal_salutation": "Участник {{grammar:genitive|{{SITENAME}}}}",
     "enotif_subject_deleted": "Страница проекта «{{SITENAME}}» с именем «$1» была удалена {{gender:$2|участником|участницей}} $2",
     "excontent": "содержимое: «$1»",
     "excontentauthor": "содержимое: «$1» (единственным автором был [[Special:Contributions/$2|$2]])",
     "exbeforeblank": "содержимое до очистки: «$1»",
-    "exblank": "страница была пуста",
     "delete-confirm": "$1 — удаление",
     "delete-legend": "Удаление",
     "historywarning": "'''Внимание:''' эта страница имеет историю изменений приблизительно из $1 {{PLURAL:$1|версии|версий}}:",
     "contributions-title": "Вклад {{GENDER:$1|участника|участницы}} $1",
     "mycontris": "Вклад",
     "contribsub2": "Вклад {{GENDER:$3|$1}} ($2)",
+    "contributions-userdoesnotexist": "Не зарегистрировано учётной записи «$1».",
     "nocontribs": "Изменений, соответствующих заданным условиям, найдено не было.",
     "uctop": "(текущая)",
     "month": "С месяца (и ранее):",
     "sp-contributions-newbies-sub": "С новых учётных записей",
     "sp-contributions-newbies-title": "Вклад с недавно созданных учётных записей",
     "sp-contributions-blocklog": "блокировки",
+    "sp-contributions-suppresslog": "удалённый вклад участника",
     "sp-contributions-deleted": "удалённые правки",
     "sp-contributions-uploads": "загрузки",
     "sp-contributions-logs": "журналы",
     "sp-contributions-blocked-notice": "Этот участник в данный момент заблокирован. Ниже приведена последняя запись из журнала блокировок:",
     "sp-contributions-blocked-notice-anon": "Этот IP-адрес в данный момент заблокирован.\nНиже приведена последняя запись из журнала блокировок:",
     "sp-contributions-search": "Поиск вклада",
-    "sp-contributions-suppresslog": "удалённый вклад участника",
     "sp-contributions-username": "IP-адрес или имя участника:",
     "sp-contributions-toponly": "Показывать только правки, являющиеся последними версиями",
     "sp-contributions-newonly": "Показывать только правки, являющиеся созданием страниц",
     "allmessagesname": "Сообщение",
     "allmessagesdefault": "Текст по умолчанию",
     "allmessagescurrent": "Текущий текст",
-    "allmessagestext": "Это список системных сообщений, доступных в пространстве имён «MediaWiki».\nЕсли вы хотите внести вклад в общую локализацию MediaWiki, пожалуйста, посетите страницу [https://www.mediawiki.org/wiki/Localisation описания локализации] и проект [//translatewiki.net translatewiki.net].",
+    "allmessagestext": "Это список системных сообщений, доступных в пространстве имён «MediaWiki».\nЕсли вы хотите внести вклад в общую локализацию MediaWiki, пожалуйста, посетите страницу [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation описания локализации] и проект [//translatewiki.net translatewiki.net].",
     "allmessagesnotsupportedDB": "Эта страница недоступна, так как отключена опция '''$wgUseDatabaseMessages'''.",
     "allmessages-filter-legend": "Фильтр",
     "allmessages-filter": "Фильтр по статусу изменения:",
     "importunknownsource": "Неизвестный тип импортируемой страницы",
     "importcantopen": "Невозможно открыть импортируемый файл",
     "importbadinterwiki": "Неправильная интервики-ссылка",
-    "importnotext": "Текст отсутствует",
     "importsuccess": "Импортирование выполнено!",
-    "importhistoryconflict": "Конфликт существующих версий (возможно, эта страница уже была импортирована)",
     "importnosources": "Не был выбран источник межвики-импорта, прямая загрузка истории изменений отключена.",
     "importnofile": "Файл для импорта не был загружен.",
     "importuploaderrorsize": "Не удалось загрузить или импортировать файл. Размер файла превышает установленный предел.",
     "version-entrypoints": "Адреса точек входа",
     "version-entrypoints-header-entrypoint": "Точка входа",
     "version-entrypoints-header-url": "URL",
-    "version-entrypoints-articlepath": "[https://www.mediawiki.org/wiki/Manual:$wgArticlePath Путь к статье]",
-    "version-entrypoints-scriptpath": "[https://www.mediawiki.org/wiki/Manual:$wgScriptPath Путь к скрипту]",
+    "version-entrypoints-articlepath": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgArticlePath Путь к статье]",
+    "version-entrypoints-scriptpath": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgScriptPath Путь к скрипту]",
     "redirect": "Перенаправление с файла, участника, страницы или идентификатора версии",
     "redirect-legend": "Перенаправление на файл или страницу",
     "redirect-summary": "Эта служебная страница перенаправляет на файл (с имени файла), страницу (с идентификатора версии или страницы) или страницу участника (с числового идентификатора участника). Использование: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]] или [[{{#Special:Redirect}}/user/101]].",
     "expand_templates_remove_nowiki": "Подавлять теги <nowiki> в результате",
     "expand_templates_generate_xml": "Показать дерево разбора XML",
     "expand_templates_generate_rawhtml": "Показать HTML",
-    "expand_templates_preview": "Предпросмотр",
-    "trackingcategories": "Отслеживающие категории",
-    "trackingcategories-summary": "На этой странице перечислены отслеживающие категории, которые автоматически заполняются программным обеспечением MediaWiki. Их можно переименовать, изменив соответствующие системные сообщения в пространстве имён {{ns:8}}.",
-    "trackingcategories-msg": "Отслеживающая категория",
-    "trackingcategories-name": "Имя сообщения",
-    "trackingcategories-desc": "Критерий включения в категорию",
-    "broken-file-category-desc": "Категория добавляется, если страница содержит некорректную файловую ссылку (ссылку на несуществующий файл).",
-    "trackingcategories-nodesc": "Описание отсутствует.",
-    "trackingcategories-disabled": "Категория отключена"
+    "expand_templates_preview": "Предпросмотр"
 }
index 0889819..ec805a8 100644 (file)
     "prefs-skin": "Взгляд",
     "skin-preview": "Попереднїй нагляд",
     "datedefault": "Імпліцітный",
-    "prefs-beta": "Бета-функції",
     "prefs-datetime": "Датум і час",
     "prefs-labs": "Експеріменталны функції",
     "prefs-user-pages": "Сторінкы хоснователя",
     "nowatchlist": "Ваш список слїдованых сторінок є порожнїй.",
     "watchlistanontext": "Про перезераня ці управу списку слїдованых сторінок ся мусите $1.",
     "watchnologin": "Не сьте приголошеный(а)",
-    "watchnologintext": "Про слїдованя сторінок ся мусите [[Special:UserLogin|приголосити]].",
     "addwatch": "Придати до списку слїдованых сторінок",
     "addedwatchtext": "Сторінка «[[:$1]]» была придана до вашого [[Special:Watchlist|списку слїдованых]].\nБудучі зміны той статї і з нёв повязаной сторінков діскузії будуть зображены у тім списку.",
     "removewatch": "Вымазати зо списку слїдованых сторінок",
     "allmessagesname": "Назва",
     "allmessagesdefault": "Штандартный текст",
     "allmessagescurrent": "Актуалный текст",
-    "allmessagestext": "Тото є список вшыткых повідомлїнь доступных в просторї назв «MediaWiki».\nКідь хочете приспівати ку локалізації софтверу MediaWiki, навщівте [https://www.mediawiki.org/wiki/Localisation локалізачну сторінку на mediawiki.org] і [//translatewiki.net сервер server translatewiki.net].",
+    "allmessagestext": "Тото є список вшыткых повідомлїнь доступных в просторї назв «MediaWiki».\nКідь хочете приспівати ку локалізації софтверу MediaWiki, навщівте [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation локалізачну сторінку на mediawiki.org] і [//translatewiki.net сервер server translatewiki.net].",
     "allmessagesnotsupportedDB": "{{ns:special}}:AllMessages не є підпороване, бо wgUseDatabaseMessages є выпнуте.",
     "allmessages-filter-legend": "Філтер",
     "allmessages-filter": "Філтер за станом:",
index f3a1d59..37206aa 100644 (file)
@@ -96,7 +96,6 @@
     "currentevents": "Evenimente di tora",
     "disclaimers": "Nipricunuschire",
     "edithelp": "Agiutor ti alãxire",
-    "helppage": "Help:Conținut",
     "mainpage": "Prota frânḑâ",
     "mainpage-description": "Prota frânḑâ",
     "portal": "Portalu a comunitatiľei",
index 7652498..4972df2 100644 (file)
@@ -88,7 +88,6 @@
     "disclaimers": "Тајменулс",
     "disclaimerpage": "Project:тајменул",
     "edithelp": "Ајутор пентре едитаере",
-    "helppage": "Help:Ајутор",
     "mainpage": "Пажу принципу",
     "mainpage-description": "Пажу принципу",
     "privacy": "Политикмус де лижитул",
index f1c808c..d3275f3 100644 (file)
@@ -88,7 +88,6 @@
     "disclaimers": "tǎmenuls",
     "disclaimerpage": "Project:tǎmenul",
     "edithelp": "Ajutor pentru editaere",
-    "helppage": "Help:Ajutor",
     "mainpage": "Pažu principu",
     "mainpage-description": "Pažu principu",
     "privacy": "Politikmus de ližitul",
index f31c634..f853559 100644 (file)
     "permalink": "स्थायिपरिसन्धिः",
     "print": "मुद्र्यताम्",
     "view": "दृश्यताम्",
+    "view-foreign": "$1 अत्र दृश्यताम्",
     "edit": "सम्पाद्यताम्",
+    "edit-local": "स्थानीयवर्णनं सम्पाद्यताम्",
     "create": "सृज्यताम्",
+    "create-local": "स्थानीयवर्णनं योज्यताम्",
     "editthispage": "इदं पृष्ठं सम्पाद्यताम्",
     "create-this-page": "इदं पृष्ठं सृज्यताम्",
     "delete": "अपाक्रियताम्",
     "pool-timeout": "संरक्षणार्थं कालावधिः समाप्ता",
     "pool-queuefull": "Pool इति पङ्कतिः पूर्णा अस्ति ।",
     "pool-errorunknown": "अज्ञातदोषः",
+    "pool-servererror": "Pool counter सेवा नोपलभ्यते ।",
     "aboutsite": "{{SITENAME}} विषयकं",
     "aboutpage": "Project:विषयकम्",
     "copyright": "भिन्नोल्लखः न भवति तावत् $1 अत्र उल्लेखो भवति ।",
     "noemailcreate": "भवता/भवत्या मान्यः ई-पत्रसङ्केतः दातव्यः ।",
     "passwordsent": "\"$1\" इत्यस्य पञ्जीकृताय ई-पत्रसङ्केताय नवीनः कूटशब्दः प्रेषितः अस्ति । \n\nकृपया तस्य कूटशब्दस्य उपयोगेन पुनः प्रविश्यताम् ।",
     "blocked-mailpassword": "भवतः/भवत्याः अन्तर्जालसंविद् (IP) प्रतिबन्धितः अस्ति । \nसम्पादनाय अनुमतिः नास्ति, अतः कूटशब्दस्य पुनःप्राप्तिः भवितुं नार्हति ।",
-    "eauthentsent": "भवता à¤ªà¥\8dरदतà¥\8dतà¥\87 à¤µà¤¿à¤¦à¥\8dयà¥\81तà¥\8dपतà¥\8dर-सà¤\82à¤\95à¥\87तà¥\87 à¤\8fà¤\95à¤\83 à¤ªà¤°à¤¿à¤ªà¥\81षà¥\8dà¤\9fिरà¥\82पà¤\83 à¤µà¤¿à¤¦à¥\8dयà¥\81तà¥\8dसनà¥\8dदà¥\87शà¤\83 à¤ªà¥\8dरà¥\87षितà¥\8bऽसà¥\8dति।\nà¤\85नà¥\8dयà¤\83 à¤\95शà¥\8dà¤\9aिदà¥\8d à¤µà¤¿à¤¦à¥\8dयà¥\81तà¥\8dसनà¥\8dदà¥\87शà¤\83 à¤ªà¥\8dरà¥\87षितà¥\8b à¤­à¤µà¥\87तà¥\8d à¤\87तà¥\8dयà¥\87तदरà¥\8dथà¤\82 à¤­à¤µà¤¤à¤¾ à¤¤à¤¤à¥\8dसनà¥\8dदà¥\87शà¥\87 à¤ªà¥\8dरदतà¥\8dताà¤\83 à¤¨à¤¿à¤°à¥\8dदà¥\87शाà¤\83 à¤ªà¤¾à¤²à¤¿à¤¤à¤µà¥\8dयाà¤\83, à¤¯à¥\87न à¤¹à¤¿ à¤¸à¤¾ à¤µà¤¿à¤¦à¥\8dयà¥\81तà¥\8dसनà¥\8dदà¥\87शलà¥\87à¤\96ा à¤­à¤µà¤¦à¥\80या à¤\8fव à¤\87ति à¤¸à¤¤à¥\8dयापितà¥\8b à¤­à¤µà¥\87तà¥\8d।",
-    "throttled-mailpassword": "पà¥\82रà¥\8dवतनायाà¤\82 {{PLURAL:$1|हà¥\8bरसà¥\8dय|$1 à¤¹à¥\8bराणाà¤\82}} à¤\85वधà¥\8c à¤­à¤µà¤¦à¤°à¥\8dथà¤\82 à¤\8fà¤\95à¤\83 à¤\95à¥\82à¤\9fशबà¥\8dद-पà¥\81नà¤\83सà¥\8dमारà¤\95मà¥\8d à¤ªà¥\8dरà¥\87षितà¥\8bऽसà¥\8dति।\nदà¥\81षà¥\8dपà¥\8dरयà¥\8bà¤\97ादà¥\8d à¤µà¤¾à¤°à¤¯à¤¿à¤¤à¥\81à¤\82 à¤ªà¥\8dरति {{PLURAL:$1|हà¥\8bरà¥\87|$1 à¤¹à¥\8bरà¥\87षà¥\81}} à¤\95à¥\87वलमà¥\8d à¤\8fà¤\95à¤\82 à¤\95à¥\82à¤\9fशबà¥\8dद-पà¥\81नà¤\83सà¥\8dमारà¤\95à¤\82 à¤ªà¥\8dरà¥\87षयितà¥\81à¤\82 à¤¶à¤\95à¥\8dयतà¥\87।",
-    "mailerror": "विदà¥\8dयà¥\81तà¥\8dसनà¥\8dदà¥\87शपà¥\8dरà¥\87षणà¥\87 à¤¤à¥\8dरà¥\81à¤\9fिà¤\83: $1",
-    "acct_creation_throttle_hit": "à¤\97तà¥\87 à¤¦à¤¿à¤µà¤¸à¥\87 à¤\85सà¥\8dयाà¤\82 à¤µà¤¿à¤\95à¥\8dयाà¤\82 à¤­à¤µà¤¤à¤\83 à¤\86à¤\87पà¥\80सà¤\82à¤\95à¥\87तमà¥\8d à¤\86धà¥\83तà¥\8dय à¤\86à¤\97नà¥\8dतà¥\81à¤\95ाà¤\83 {{PLURAL:$1|1 à¤²à¥\87à¤\96ाà¤\82|$1 à¤²à¥\87à¤\96ाà¤\83}} à¤¸à¥\83à¤\9cितवनà¥\8dतà¤\83 à¤¸à¤¨à¥\8dति। à¤¤à¤¦à¥\87व à¤\8fततà¥\8dसमयावधà¥\8c à¤\85धिà¤\95तममà¥\8d à¤\85नà¥\81मतमà¥\8d।\nतसà¥\8dमातà¥\8d, à¤\8fतदà¥\8d à¤\86à¤\87पà¥\80सà¤\82à¤\95à¥\87तà¥\87 à¤\86à¤\97नà¥\8dतà¥\81à¤\95ाà¤\83 à¤\8fततà¥\8dसमयà¥\87 à¤¨à¤¾à¤§à¤¿à¤\95à¤\82 à¤²à¥\87à¤\96ाà¤\82 à¤¸à¥\8dरषà¥\8dà¤\9fà¥\81à¤\82 à¤¶à¤\95à¥\8dनà¥\81वनà¥\8dति।",
-    "emailauthenticated": "भवतः विद्युत्सन्देशसंकेतः $2 दिनांके $3 वादने परिपुष्टीकृतः आसीत्।",
-    "emailnotauthenticated": "भवतà¤\83 à¤µà¤¿à¤¦à¥\8dयà¥\81तà¥\8dसà¤\82दà¥\87श-सà¤\82à¤\95à¥\87तà¤\83 à¤\85धà¥\81नायावतà¥\8d à¤ªà¤°à¤¿à¤ªà¥\81षà¥\8dà¤\9fà¥\80à¤\95à¥\83तà¤\83 à¤¨à¤¾à¤¸à¥\8dति।\nà¤\85धसà¥\8dतातà¥\8d à¤\89लà¥\8dलिà¤\96ितà¥\87षà¥\81 à¤\95सà¥\8dमिà¤\82शà¥\8dà¤\9aिदपि à¤µà¤¿à¤·à¤¯à¥\87 à¤­à¤µà¤¾à¤¨à¥\8d à¤µà¤¿à¤¦à¥\8dयà¥\81तà¥\8dसनà¥\8dदà¥\87शà¤\82 à¤ªà¥\8dरषयितà¥\81à¤\82 à¤¨ à¤¶à¤\95à¥\8dनà¥\8bसि।",
-    "noemailprefs": "à¤\8fताà¤\83 à¤¸à¥\81विधाà¤\83 à¤\95ारà¥\8dयशà¥\80लाà¤\83 à¤­à¤µà¥\87यà¥\81à¤\83 à¤\87तà¥\8dयà¥\87तदरà¥\8dथà¤\82 à¤¸à¥\8dवà¤\95à¥\80यà¥\87 à¤µà¤°à¥\80याà¤\82सि à¤\87ति à¤ªà¥\8dरभाà¤\97à¥\87 à¤µà¤¿à¤¦à¥\8dयà¥\81तà¥\8dसनà¥\8dदà¥\87शसà¤\82à¤\95à¥\87त à¤\8fà¤\95à¤\83 à¤¦à¤¾à¤¤à¤µà¥\8dयà¤\83।",
-    "emailconfirmlink": "सà¥\8dवà¤\95à¥\80यà¤\82 à¤µà¤¿à¤¦à¥\8dयà¥\81तà¥\8dसनà¥\8dदà¥\87शसà¤\82à¤\95à¥\87तà¤\82 à¤ªà¥\8dरमाणà¥\80à¤\95रà¥\8bतà¥\81।",
-    "invalidemailaddress": "पà¥\8dरतà¥\80यतà¥\87 à¤¯à¤¦à¥\8d à¤µà¤¿à¤¦à¥\8dयà¥\81तà¥\8dसनà¥\8dदà¥\87शसà¤\82à¤\95à¥\87तà¤\83 à¤\85मानà¥\8dयà¥\87 à¤ªà¥\8dरारà¥\82पà¥\87 à¤µà¤¿à¤¦à¥\8dयतà¥\87। à¤\85तà¤\8fव à¤\8fततà¥\8d à¤¸à¥\8dवà¥\80à¤\95रà¥\8bतà¥\81à¤\82 à¤¨ à¤¶à¤\95à¥\8dयतà¥\87।\nà¤\95à¥\83पया à¤\8fà¤\95à¤\82 à¤ªà¥\8dरारà¥\82पसमà¥\8dमतà¤\82 à¤¸à¤\82à¤\95à¥\87तà¤\82 à¤¦à¤¦à¤¾à¤¤à¥\81, à¤\85थवा à¤¤à¤¤à¥\8d à¤\95à¥\8dषà¥\87तà¥\8dरà¤\82 à¤°à¤¿à¤\95à¥\8dतमà¥\87व à¤\95रà¥\8bतà¥\81।",
-    "cannotchangeemail": "अस्मिन् विकिमध्ये सदस्य-ईपत्र-सङ्केतः परिवर्तयितुं न शक्यते ।",
-    "emaildisabled": "स्थानमेतत् विद्युन्मनपत्रं न प्रेषयति ।",
+    "eauthentsent": "à¤\85धिà¤\95à¥\83तपà¥\81षà¥\8dà¤\9fà¥\88 à¤­à¤µà¤¤à¤¾/भवतà¥\8dया à¤ªà¤\9eà¥\8dà¤\9cà¥\80à¤\95à¥\83ताय à¤\88-पतà¥\8dरसà¤\99à¥\8dà¤\95à¥\87ताय à¤\88-पतà¥\8dरà¤\82 à¤ªà¥\8dरà¥\87षितमसà¥\8dति à¥¤ à¤¤à¤¸à¥\8dय à¤\88-पतà¥\8dरसà¤\99à¥\8dà¤\95à¥\87तसà¥\8dयà¥\88व à¤\87तà¤\83 à¤ªà¤°à¤®à¥\8d à¤\89पयà¥\8bà¤\97à¤\83 à¤­à¤µà¤¤à¥\81 à¤\87ति à¤\87à¤\9aà¥\8dà¤\9bति à¤\9aà¥\87तà¥\8d à¤ªà¥\8dरà¥\87षितà¥\87 à¤\88-पतà¥\8dरà¥\87 à¤¯à¤¥à¤¾ à¤²à¤¿à¤\96ितमसà¥\8dति, à¤¤à¤¥à¤¾ à¤\95रà¥\8bतà¥\81 à¥¤ à¤\8fवà¤\82 à¤¤à¤¸à¥\8dय à¤\88-पतà¥\8dरसà¤\99à¥\8dà¤\95à¥\87तसà¥\8dय à¤\85धिà¤\95à¥\83तपà¥\81षà¥\8dà¤\9fता à¤­à¤µà¤¿à¤·à¥\8dयति ।",
+    "throttled-mailpassword": "à¤\95à¥\82à¤\9fशबà¥\8dदà¤\82 à¤ªà¤°à¤¿à¤°à¥\8dवतितà¥\81à¤\82 à¤­à¤µà¤¤à¤\83/भवतà¥\8dयाà¤\83 à¤ªà¤\9eà¥\8dà¤\9cà¥\80à¤\95à¥\83ताय à¤\88-पतà¥\8dरसà¤\99à¥\8dà¤\95à¥\87ताय à¤\85नà¥\8dतिम{{PLURAL:$1|हà¥\8bरायाà¤\82|$1 à¤¹à¥\8bरासà¥\81}} à¤¨à¥\82तनà¤\95à¥\82à¤\9fशबà¥\8dदà¤\83 à¤ªà¥\8dरà¥\87षितà¤\83 à¤\85सà¥\8dति à¥¤\n\nदà¥\81रà¥\81पयà¥\8bà¤\97à¤\82 à¤µà¤¾à¤°à¤¯à¤¿à¤¤à¥\81मà¥\8d à¤ªà¥\8dरति {{PLURAL:$1|हà¥\8bरायाà¤\82|$1 à¤¹à¥\8bरासà¥\81}} à¤\95à¥\87वलमà¥\8d à¤\8fà¤\95मà¥\8d à¤\88-पतà¥\8dरà¤\82 à¤ªà¥\8dरà¥\87षà¥\8dयतà¥\87 ।",
+    "mailerror": "à¤\88-पतà¥\8dरसमà¥\8dपà¥\8dरà¥\87षणà¥\87 à¤¦à¥\8bषà¤\83 : $1",
+    "acct_creation_throttle_hit": "à¤\9aतà¥\81à¥\8dरà¥\8dविà¤\82शतिà¤\98णà¥\8dà¤\9fासà¥\81 à¤\85सà¥\8dय à¤¸à¤\99à¥\8dà¤\97णà¤\95सà¥\8dय à¤\86नà¥\8dतरà¥\8dà¤\9cालसà¤\82विदा (IP) {{PLURAL:$1|1 à¤¯à¥\8bà¤\9cà¤\95à¤\83|$1 à¤¯à¥\8bà¤\9cà¤\95ाà¤\83}} à¤¸à¤¦à¤¸à¥\8dयताà¤\82 à¤ªà¥\8dरापà¥\8dतवानà¥\8d/वनà¥\8dतà¤\83 à¥¤ à¤\85दà¥\8dय à¤\87तà¥\8bपि à¤\85धिà¤\95सदसà¥\8dयाà¤\83 à¤ªà¥\8dरापà¥\8dतà¥\81à¤\82 à¤¨ à¤¶à¤\95à¥\8dयनà¥\8dतà¥\87 ।",
+    "emailauthenticated": "$2 दिनाङ्के $3 वादने भवतः/भवत्याः ई-पत्रसङ्केतः पुष्टितः ।",
+    "emailnotauthenticated": "à¤\8fतावता à¤­à¤µà¤¤à¤\83/भवतà¥\8dयाà¤\83 à¤\88-पतà¥\8dरसà¤\99à¥\8dà¤\95à¥\87तà¤\83 à¤ªà¥\81षà¥\8dà¤\9fà¤\83 à¤¨à¤¾à¤­à¤µà¤¤à¥\8d à¥¤ \nनिमà¥\8dनलिà¤\96िताय à¤¨ à¤\95िमपि à¤\88-पतà¥\8dरà¤\82 à¤ªà¥\8dरà¥\87षयितà¥\81à¤\82 à¤¶à¤\95à¥\8dयतà¥\87 ।",
+    "noemailprefs": "à¤\8fनà¤\82 à¤µà¤¿à¤\95लà¥\8dपà¤\82 à¤¸à¤®à¤°à¥\8dथितà¥\81मà¥\8d \"à¤\87षà¥\8dà¤\9fतमानि\" à¤®à¤§à¥\8dयà¥\87 à¤­à¤µà¤¤à¤\83/भवतà¥\8dयाà¤\83 à¤\88-पतà¥\8dरसà¤\99à¥\8dà¤\95à¥\87तसà¥\8dय à¤\89लà¥\8dलà¥\87à¤\96à¤\83 à¤\86वशà¥\8dयà¤\95à¤\83 ।",
+    "emailconfirmlink": "सà¥\8dवसà¥\8dय à¤\88-पतà¥\8dरसà¤\99à¥\8dà¤\95तà¤\82 à¤ªà¥\81षà¥\8dà¤\9fà¤\82 à¤\95रà¥\8bतà¥\81",
+    "invalidemailaddress": "à¤\8fषà¤\83 à¤\88-पतà¥\8dरसà¤\99à¥\8dà¤\95à¥\87तà¤\83 à¤\86वशà¥\8dयà¤\95पà¥\8dरारà¥\81पà¥\87 à¤¨à¤¾à¤¸à¥\8dति à¥¤ à¤\95à¥\83पया à¤¯à¥\8bà¤\97à¥\8dयपà¥\8dरारà¥\81पानà¥\81à¤\95à¥\82लà¤\83 à¤\88-पतà¥\8dरसà¤\99à¥\8dà¤\95à¥\87तà¤\83 à¤²à¤¿à¤\96à¥\8dयतामà¥\8d à¥¤ à¤\85थवा à¤¸à¤¾ à¤ªà¥\87à¤\9fिà¤\95ा à¤°à¤¿à¤\95à¥\8dता à¤¤à¥\8dयà¤\9cà¥\8dयतामà¥\8d ।",
+    "cannotchangeemail": "अस्मिन् विकि-जालस्थाने योजक-ईपत्र-सङ्केताः परिवर्तयितुं न शक्यन्ते ।",
+    "emaildisabled": "स्थानमेतत् (site) ई-पत्रं प्रेषयितुं न शक्यते ।",
     "accountcreated": "सदस्यता प्राप्ता",
-    "accountcreatedtext": "$1 इत्येतस्य सदस्यता प्राप्ता अस्ति।",
-    "createaccount-title": "{{SITENAME}} इत्यत्र सदस्यता प्राप्यताम्",
-    "createaccount-text": "भवतः विद्युत्संदेशसंकेतार्थं केनचित् $2 इति जनेन {{SITENAME}} ($4) इत्यत्र  $3 इति कूटशब्दं दत्वा लेखा सृष्टाऽस्ति।\nभवता अधुना प्रवेशं कृत्वा कूटशब्दः परिवर्तितव्यः।\n\nचेत् सा लेखा त्रुटिवशात् सृष्टा, तर्हि भवान् एतत्सन्देशम् उपेक्षितुं शक्नोति।\n\nTranslation in English: \nSomeone created an account for your e-mail address on {{SITENAME}} ($4) named \"$2\", with password \"$3\".\nYou should log in and change your password now.\n\nYou may ignore this message, if this account was created in error.",
-    "usernamehasherror": "प्रयोक्तृनाम्नि हेश् इत्यक्षरं (#) न अन्तर्भवितुं शक्नोति।",
-    "login-throttled": "भवता सद्य एव प्रभूततया प्रवेशप्रयासाः कृताः।\nकृपया पुनः प्रयासार्थं किंचित् प्रतीक्षताम्।",
-    "login-abort-generic": "भवतः प्रवेशप्रयासः विफलीभूतः - परित्यक्तः",
+    "accountcreatedtext": "[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|talk]]) कृते \"योजसम्भाषणम्\" इति पृष्ठं रचितम् ।",
+    "createaccount-title": "{{SITENAME}} कृते सदस्यता प्राप्यताम्",
+    "createaccount-text": "{{SITENAME}} ($4) इत्यत्र, \"$2\" नाम्ना, \"$3\" कूटशब्देन, च कोऽपि भवतः/भवत्याः ई-पत्रसङ्केतस्य उपयोगं कृत्वा सदस्यतां प्रापत् ।\nअधुना भवान्/भवती प्रवेशं कृत्वा गुप्तसङ्ख्यां परिवर्तयितं शक्नोति ।\nएषा सदस्यताप्राप्तिः क्षत्या अभवत् चेत्, एनं सन्देशम् अवगणोतु ।",
+    "login-throttled": "भवता/भवत्या अत्यधिकाः प्रवेशप्रयासाः कृताः । \nकृपया $1 कालं यावत् प्रतिक्षां करोतु ।",
+    "login-abort-generic": "भवतः/भवत्याः प्रवेशप्रयासः विफलीभूतः - परित्यक्तः",
     "loginlanguagelabel": "भाषा : $1",
-    "suspicious-userlogout": "भवतः सत्राद् बहिर्गमनस्य अनुरोधः अस्वीकृतोऽस्ति, यस्मादेतत् भग्नादेकस्मात् ब्राउज़र्तः अथवा स्वल्पसञ्चयि-प्रॉक्सितः प्रेषित आसीत्।",
+    "suspicious-userlogout": "भवतः/भवत्याः \"निर्गमनम्\" इत्यस्य विनतिं स्वीकर्तुं न शक्यते । कारणं भवता/भवत्या एषा विनतिः तृटियुक्तगवेक्षणात् प्रतिनिधि(proxy)-तः वा कृता ।",
+    "createacct-another-realname-tip": "वास्तविकनाम ऐच्छकम् अस्ति । भवान्/भवती एनं विकल्पं समर्थयति चेत्, भवतः/भवत्याः योगदानश्रेयस्य उल्लेखसमये अस्य उपयोगः भविष्यति ।",
     "pt-login": "प्रविश्यताम्",
     "pt-login-button": "प्रविश्यताम्",
     "pt-createaccount": "सदस्यता प्राप्यताम्",
     "pt-userlogout": "निर्गमनम्",
-    "php-mail-error-unknown": "पीएच्पी इत्येतस्य mail() फलने अज्ञाता काऽपि त्रुटिर्जाता।",
-    "user-mail-no-addy": "ईपत्रसङ्केतं विना ईपत्रप्रेषणस्य प्रयासः कृतः ।",
-    "user-mail-no-body": "भवता खलु विद्युत्पत्रं रिक्ततया अथवा अतिलघुरूपेण प्रेषितुं चेष्टितम्।",
+    "php-mail-error-unknown": "PHP लिप्याः मुख्यनियोगे (in main()) अज्ञातत्रुटिः प्राप्ता ।",
+    "user-mail-no-addy": "ई-पत्रसङ्केतं विना ई-पत्रप्रेषणस्य प्रयासः कृतः ।",
+    "user-mail-no-body": "भवता/भवत्या रिक्तं लघुसन्देशयुक्तं वा ई-पत्रं प्रेषणस्य प्रयासः कृतः ।",
     "changepassword": "कूटशब्दः परिवर्त्यताम्",
-    "resetpass_announce": "भवानà¥\8d à¤¤à¤¾à¤¤à¥\8dà¤\95ालिà¤\95-à¤\88पतà¥\8dरदà¥\8dवारा à¤\85तà¥\8dर à¤ªà¥\8dरविषà¥\8dà¤\9fà¤\83 à¤\85सà¥\8dति à¥¤\nपà¥\8dरवà¥\87शनसà¥\8dय à¤¸à¤®à¤¾à¤ªà¤¨à¤¾à¤¯ à¤­à¤µà¤¤à¤¾ à¤\85तà¥\8dर à¤¨à¥\82तनà¤\83 à¤\95à¥\82à¤\9fशबà¥\8dदà¤\83 à¤¦à¤¾à¤¤à¤µà¥\8dयà¤\83:",
+    "resetpass_announce": "सदसà¥\8dयतापà¥\8dरà¤\95à¥\8dरियाà¤\82 à¤ªà¥\82रà¥\8dणà¤\82 à¤\95रà¥\8dतà¥\81à¤\82 à¤¨à¥\82तनà¤\83 à¤\95à¥\82à¤\9fशबà¥\8dदà¤\83 à¤²à¥\87à¤\96नà¥\80यà¤\83 à¤\8fव à¥¤",
     "resetpass_text": "<!-- पाठं अत्र लिखतु -->",
-    "resetpass_header": "सदस्यतायाः कूटशब्दः परिवर्त्यताम्",
+    "resetpass_header": "सदस्यतायाः कूटशब्दः परिवर्त्यताम्",
     "oldpassword": "पुरातनः कूटशब्दः",
     "newpassword": "नूतनः कूटशब्दः",
-    "retypenew": "नूतनः कूटशब्दः पुनः लिख्यताम्:",
-    "resetpass_submit": "कूटशब्दः योज्यतां प्रविश्यतां च",
-    "changepassword-success": "भवतः कूटशब्दः सफलतया परिवर्तितः!\nअधुना भवान् प्रवेश्यते ...",
+    "retypenew": "नूतनकूटशब्दः पुनः लिख्यताम् :",
+    "resetpass_submit": "कूटशब्दः योज्यतां, प्रविश्यतां च",
+    "changepassword-success": "भवतः/भवत्याः कूटशब्दः सफलतया परिवर्तितः ।",
+    "changepassword-throttled": "भवता/भवत्या अत्यधिकाः प्रवेशप्रयासाः कृताः । \nकृपया $1 कालं यावत् प्रतिक्षां करोतु ।",
     "resetpass_forbidden": "कूटशब्दाः परिवर्तयितुं न शक्यन्ते",
-    "resetpass-no-info": "भवता à¤\8fततà¥\8dपà¥\83षà¥\8dठà¤\82 à¤ªà¥\8dरतà¥\8dयà¤\95à¥\8dषतया à¤¸à¤®à¥\8dपà¥\8dरापà¥\8dतà¥\81à¤\82 à¤ªà¥\8dरवà¥\87शà¤\83 à¤\85वशà¥\8dयमà¥\87व à¤\95रà¥\8dतà¥\8dतवà¥\8dयà¤\83।",
+    "resetpass-no-info": "à¤\8fततà¥\8d à¤ªà¥\83षà¥\8dठà¤\82 à¤¸à¤®à¥\8dपादयितà¥\81à¤\82 à¤ªà¥\8dरवà¥\87शà¤\83 à¤\85निवारà¥\8dयà¤\83 ।",
     "resetpass-submit-loggedin": "कूटशब्दः परिवर्त्यताम्",
     "resetpass-submit-cancel": "निरस्यताम्",
-    "resetpass-wrong-oldpass": "अल्पकालीनः अथवा सद्यःकालीनः कूटशब्दः अमान्यः अस्ति।\nभवता पूर्वे एव सफलतया स्वकीयः कूटशब्दः परिवर्तितः स्यात्, अथवा एकः नूतनः अल्पकालीनः कूटशब्दः प्रार्थितः स्यात्।",
-    "resetpass-temp-password": "अस्थिर रहस्यवाक् :",
-    "passwordreset": "कूटशब्द पुनःस्थापनम्",
-    "passwordreset-legend": "कूटशब्द पुनःस्थापनम्",
-    "passwordreset-disabled": "अस्मिन् विक्यां कूटशब्द पुनःस्थापनं असमर्थीकृतमस्ति।",
-    "passwordreset-username": "योजकनामन्:",
+    "resetpass-wrong-oldpass": "अल्पकालीनः सद्यःकालीनः वा कूटशब्दः अमान्यः अस्ति ।\nभवता/भवत्या पूर्वम् एव सफलतया स्वकीयः कूटशब्दः परिवर्तितः स्यात्, एकः नूतनः अल्पकालीनः कूटशब्दः प्रार्थितः स्यात् वा ।",
+    "resetpass-recycled": "कूटशब्दं परिवर्तनावसरे नवीनकूटशब्दे पुरानतकूटशब्दस्य उपयोगं मा करोतु ।",
+    "resetpass-temp-emailed": "भवता/भवत्या अल्पकालीन(temporary)कूटशब्देन प्रवेशः प्राप्तः । \nसदस्यताप्रक्रियां पूर्णं कर्तुं नूतनः कूटशब्दः लेखनीयः एव ।",
+    "resetpass-temp-password": "अल्पकालीनकूटशब्दः :",
+    "resetpass-expired": "भवतः/भवत्याः कृटशब्दस्य अवधिः समाप्ता । प्रवेष्टुं नवीनकूटशब्दं निर्धारयतु ।",
+    "resetpass-expired-soft": "भवतः/भवत्याः कृटशब्दस्य अवधिः समाप्ता । कृपया नवीनकूटशब्दं निर्धारयतु । पश्चात् नवीनकूटशब्दं निर्धारयितुं \"{{int:resetpass-submit-cancel}}\" नुदतु ।",
+    "resetpass-validity-soft": "भवतः/भवत्याः कृटशब्दः अयोग्यः अस्ति । कृपया नवीनकूटशब्दं निर्धारयतु । पश्चात् नवीनकूटशब्दं निर्धारयितुं \"{{int:resetpass-submit-cancel}}\" नुदतु ।",
+    "passwordreset": "कूटशब्दः परिवर्त्यताम्",
+    "passwordreset-text-one": "ई-पत्रमाध्यमेन अल्पकालीनकूटशब्दं प्राप्तुम् अधस्तनं प्रपत्रं पूरयतु ।",
+    "passwordreset-text-many": "{{PLURAL:$1|ई-पत्रमाध्यमेन अल्पकालीनकूटशब्दं प्राप्तुम् अधस्तनां कामपि एकां पेटिकां पूरयतु ।}}",
+    "passwordreset-legend": "कूटशब्दः परिवर्त्यताम्",
+    "passwordreset-disabled": "अस्मिन् विकि-जालस्थाने कूटशब्दं परिर्तितुं निषेधः अस्ति ।",
+    "passwordreset-emaildisabled": "अस्मिन् विकि-जालस्थाने ई-पत्रसम्बद्धाः सेवाः असमर्थिताः सन्ति ।",
+    "passwordreset-username": "योजकनाम:",
     "passwordreset-domain": "क्षेत्रम्:",
-    "passwordreset-capture": "फलितरà¥\82पमà¥\8d à¤\88पतà¥\8dरà¤\82 à¤\95िà¤\82 à¤¦à¥\83शà¥\8dयतà¥\87 ?",
+    "passwordreset-capture": "परिणामसà¥\8dवरà¥\82पनिरà¥\8dमितानि à¤\88-पतà¥\8dराणि à¤¦à¥\8dरषà¥\8dà¤\9fà¥\81मà¥\8d à¤\87à¤\9aà¥\8dà¤\9bति ?",
     "passwordreset-capture-help": "अस्यां मञ्जूषायां यदि भवता अङ्क्यते तर्हि ईपत्रम् (अस्थायिकूटशब्देन सह) दर्श्यते प्रेष्यते च ।",
-    "passwordreset-email": "परमाणुपत्रसङ्गेत:",
-    "passwordreset-emailtitle": "{{SITENAME}} इत्यत्र लेखा-विवरणम्",
-    "passwordreset-emailtext-ip": "कश्चित् (भवान् अपि स्यात्, $1 इति ऐ. पि. सङ्केतात्) {{SITENAME}} ($4) इत्यस्य प्रवेशसम्बद्धं विवरणं प्रार्थितवान् । अधः सूचितस्य उपयोक्तुः {{PLURAL:$3 | प्रवेशविवरणं | प्रवेशविवरणानि}} \n$2\nइत्यनेन ईपत्रसङ्केतेन सम्बद्धम् अस्ति / सम्बद्धानि सन्ति ।\n{{PLURAL:$3|अयं तात्कालिकः कूटशब्दः | इमे तात्कालिकाः कूटशब्दाः}}  {{PLURAL:$5| एकं दिनं | $5 दिनानि}} यावत् सक्रियः भवति / सक्रियाः भवन्ति ।",
-    "passwordreset-emailtext-user": "कश्चित् (भवान् अपि स्यात्, $1 इति ऐ. पि. सङ्केतात्) {{SITENAME}} ($4) इत्यस्य प्रवेशसम्बद्धं विवरणं प्रार्थितवान् । अधः सूचितस्य उपयोक्तुः {{PLURAL:$3 | प्रवेशविवरणं | प्रवेशविवरणानि}} \n$2\nइत्यनेन ईपत्रसङ्केतेन सम्बद्धम् अस्ति / सम्बद्धानि सन्ति ।\n{{PLURAL:$3|अयं तात्कालिकः कूटशब्दः | इमे तात्कालिकाः कूटशब्दाः}}  {{PLURAL:$5| एकं दिनं | $5 दिनानि}} यावत् सक्रियः भवति / सक्रियाः भवन्ति ।",
-    "passwordreset-emailelement": "प्रयोक्तृनाम: $1\nअल्पकालिकः कूटशब्दः : $2",
-    "passwordreset-emailsent": "एकः स्मारकः विद्युत्सन्देशः प्रेषितोऽस्ति।",
-    "passwordreset-emailsent-capture": "अधो दर्शितस्य विद्युन्मानसङ्केतस्य अनुस्मारकं प्रेषितम् ।",
-    "passwordreset-emailerror-capture": "अधो निर्दिष्टानुस्मारकः विद्युन्मानसन्देशः रचितः । किन्तुः योजकसम्प्रेषणं विपन्नम् ।$1",
-    "changeemail": "विद्युन्मानपत्रादेशं परिवर्तयतु",
-    "changeemail-header": "उपयोजकसंज्ञायाः विद्युन्मानपत्रसङ्केतं परिवर्तयतु ।",
-    "changeemail-text": "स्वस्य विद्युन्मानपत्रसङ्केतं परिवर्तयितुम् एतत् प्रपत्रं पूरयतु । दृढीकरणार्थं निकुञ्चः निवेशनीयः ।",
-    "changeemail-no-info": "अस्य पुटस्य उपसञ्चारार्थं नामाभिलेखनम् अनिवार्यम् ।",
-    "changeemail-oldemail": "प्रचलितः विद्युन्मानपत्रसङ्केतः ।",
-    "changeemail-newemail": "नूतनः विद्युन्मानसङ्केतः ।",
-    "changeemail-none": "असत्",
-    "changeemail-password": "भवतः {{SITENAME}} कूटशब्दः:",
-    "changeemail-submit": "विद्युन्मानपत्रसङ्केतं परिवर्तयतु ।",
-    "changeemail-cancel": "निवर्तयते",
+    "passwordreset-email": "ई-पत्रसङ्केतः",
+    "passwordreset-emailtitle": "{{SITENAME}} इत्यत्र योजकविषये",
+    "passwordreset-emailtext-ip": "कोऽपि (कदाचित् भवान्/भवती, $1 अन्तर्जालसंविदः (from IP)) {{SITENAME}}($4) जालस्थानस्य  कृते कूटशब्दपरिवर्तनस्य विनतिम् अकरोत् । निम्न{{PLURAL:$3|योजकः|योजकाः}} अनेन ई-पत्रेण सह सल्लग्नः अस्ति/सल्लग्नाः सन्ति ।\n\n$2\n\n{{PLURAL:$3|एषः अल्पकालीनकूटशब्दः|एते अल्पकालीनकूटशब्दाः}} {{PLURAL:$5|चतुर्विंशतिघण्टासु|$5 दिनेषु}} निरस्तः भविष्यति/निरस्ताः भविष्यन्ति ।\nअधुना प्रवेशं सम्प्राप्य कूटशब्दः परिवर्तनीयः एव । \n\nनिम्नकारणानि यदि सन्ति, तर्हि एनं सन्देशम् अवगण्यताम् ।\n\n१ कोऽपि अन्यः अत्र विनतिम् अकरोत् । \n२ पूरातनः कूटशब्दः भवतः/भवत्याः स्मरणे अस्ति ।\n३ भवान्/भवती कूटशब्दं परिवर्तयितुं नेच्छिति ।",
+    "passwordreset-emailtext-user": "$1 योजकः {{SITENAME}}($4) जालस्थानस्य  कृते कूटशब्दपरिवर्तनस्य विनतिम् अकरोत् । निम्न{{PLURAL:$3|योजकः|योजकाः}} अनेन ई-पत्रेण सह सल्लग्नः अस्ति/सल्लग्नाः सन्ति ।\n\n$2\n\n{{PLURAL:$3|एषः अल्पकालीनकूटशब्दः|एते अल्पकालीनकूटशब्दाः}} {{PLURAL:$5|चतुर्विंशतिघण्टासु|$5 दिनेषु}} निरस्तः भविष्यति/निरस्ताः भविष्यन्ति ।\nअधुना प्रवेशं सम्प्राप्य कूटशब्दः परिवर्तनीयः एव । \n\nनिम्नकारणानि यदि सन्ति, तर्हि एनं सन्देशम् अवगण्यताम् ।\n\n१ कोऽपि अन्यः अत्र विनतिम् अकरोत् । \n२ पूरातनः कूटशब्दः भवतः/भवत्याः स्मरणे अस्ति ।\n३ भवान्/भवती कूटशब्दं परिवर्तयितुं नेच्छिति ।",
+    "passwordreset-emailelement": "प्रयोक्तृनाम : $1\nअल्पकालीनकूटशब्दः : $2",
+    "passwordreset-emailsent": "परिवर्तितकूटशब्दस्य ई-पत्रं प्रेषितम् अस्ति ।",
+    "passwordreset-emailsent-capture": "परिवर्तितकूटशब्दस्य ई-पत्रं प्रेषितम् अस्ति । तत् अधः द्रष्टुं शक्यते ।",
+    "passwordreset-emailerror-capture": "परिवर्तितकूटशब्दस्य ई-पत्रं निर्मितम् अस्ति । तत् अधः द्रष्टुं शक्यते । परन्तु {{GENDER:$2|योजकाय}} प्रेषणकाले तत् निरस्तम् अभवत् : $1",
+    "changeemail": "ई-पत्रसङ्केतः परिवर्त्यताम्",
+    "changeemail-header": "प्रयोक्तृनाम्नः ई-पत्रसङ्केतः परिवर्त्यताम्",
+    "changeemail-text": "स्वस्य ई-पत्रसङ्केतं परिवर्तयितुम् अधः दत्तं प्रपत्रं पूरयतु । एतस्यै प्रक्रियायै कूटशब्दः आवश्यकः ।",
+    "changeemail-no-info": "एतत् पृष्ठं सम्पादयितुं प्रवेशः अनिवार्यः ।",
+    "changeemail-oldemail": "वर्तमानः ई-पत्रसङ्केतः",
+    "changeemail-newemail": "नूतनः ई-पत्रसङ्केतः :",
+    "changeemail-none": "(न कोऽपि)",
+    "changeemail-password": "भवतः/भवत्याः {{SITENAME}} कूटशब्दः:",
+    "changeemail-submit": "ई-पत्रं परिवर्त्यताम्",
+    "changeemail-cancel": "निरस्यताम्",
+    "changeemail-throttled": "भवता/भवत्या अत्यधिकाः प्रवेशप्रयासाः कृताः । \nकृपया $1 कालं यावत् प्रतिक्षां करोतु ।",
+    "resettokens": "चिह्नानि (tokens) परिवर्त्यताम्",
+    "resettokens-text": "भवतः/भवत्याः सदस्यतया सह सल्लग्नानि चिह्नानि () उपयोक्तुं शक्यन्ते । येन अनया सदस्यतया सह सल्लग्नाः काश्चन गुप्तसूचनाः ज्ञातुं शक्यन्ते ।",
+    "resettokens-no-tokens": "परिवर्तनार्थं न किमपि चिह्नं तत्र विद्यते ।",
+    "resettokens-legend": "चिह्नानि (tokens) परिवर्त्यताम्",
+    "resettokens-tokens": "चिह्नानि :",
+    "resettokens-token-label": "$1 (वर्तमानमूल्यम् : $2)",
+    "resettokens-watchlist-token": "[[Special:Watchlist|भवतः/भवत्याः ध्यानसूच्याः परिवर्तनस्य]] जालपूर्तेः (Atom/RSS) चिह्नं",
+    "resettokens-done": "चिह्नं परिवर्त्यताम्",
+    "resettokens-resetbutton": "अङ्कितं चिह्नं परिवर्त्यताम्",
     "bold_sample": "स्थूलाक्षराणि",
     "bold_tip": "स्थूलाक्षराणि",
     "italic_sample": "तिर्यक् अक्षरम्",
     "link_sample": "परिसन्धेः शीर्षकम्",
     "link_tip": "आन्तरिकसम्पर्कतन्तुः",
     "extlink_sample": "http://www.example.com परिसन्धेः शीर्षकम्",
-    "extlink_tip": "बाहà¥\8dयानà¥\81बनà¥\8dधà¤\83 (http:// à¤\87ति à¤ªà¥\82रà¥\8dवनà¥\8dयासमà¥\8d अग्रे योजनीयम् इति स्मरतु)",
+    "extlink_tip": "बाहà¥\8dयानà¥\81बनà¥\8dधà¤\83 (http:// à¤ªà¥\82रà¥\8dवनà¥\8dयाससà¥\8dय अग्रे योजनीयम् इति स्मरतु)",
     "headline_sample": "शीर्षकम्",
     "headline_tip": "द्वितीयस्तरीयं शीर्षकम्",
     "nowiki_sample": "अप्रारूपितं पाठम् अत्र निवेश्यताम्",
     "media_sample": "उदाहरणम्.ogg",
     "media_tip": "सञ्चिकासम्बन्धः",
     "sig_tip": "समयोल्लेखेन सह भवतः/भवत्याः हस्ताक्षरम्",
-    "hr_tip": "à¤\95à¥\8dषà¥\88तिà¤\9c-रà¥\87à¤\96ा (नà¥\8dयà¥\82नतया प्रयोक्तव्या)",
-    "summary": "सारांशः:",
+    "hr_tip": "तिरà¥\8dयà¤\95à¥\8d-रà¥\87à¤\96ा (भिनà¥\8dनतया प्रयोक्तव्या)",
+    "summary": "सारांशः :",
     "subject": "विषयः/शीर्षकम् :",
     "minoredit": "इदं लघु सम्पादनम्",
     "watchthis": "इदं पृष्ठं निरीक्षताम्",
     "showlivepreview": "प्रत्यक्षं प्राग्दृश्यम्",
     "showdiff": "परिवर्तनानि दृश्यन्ताम्",
     "anoneditwarning": "'''पूर्वसूचना''' भवता/भवत्या प्रवेशः न कृतः !\nअत्र सम्पादनं कर्तुं प्रवेशः अनिवार्यः । अन्यथा अस्य पृष्ठस्य इतिहासे भवतः/भवत्याः अन्तर्जालसंविदः (IP) सङ्ख्या अङ्किता भवति ।",
-    "anonpreviewwarning": "''भवानà¥\8d à¤ªà¥\8dरवà¥\87शितà¤\83 à¤¨ à¤\85सà¥\8dति। à¤°à¤\95à¥\8dषणà¥\87न à¤ªà¥\83षà¥\8dठसà¥\8dय à¤¸à¤®à¥\8dपादनà¥\87तिहासà¥\87 à¤­à¤µà¤¤à¤\83 à¤\86à¤\87पà¥\80सà¤\82à¤\95à¥\87तà¤\83 à¤\85à¤\82à¤\95ितà¤\83 à¤­à¤µà¤¿à¤·à¥\8dयति।''",
-    "missingsummary": "'''à¤\85नà¥\81सà¥\8dमारà¤\95मà¥\8d:''' à¤­à¤µà¤¤à¤¾ à¤¸à¤®à¥\8dपादनसà¥\8dय à¤¸à¤¾à¤°à¤\83 à¤¨ à¤ªà¥\8dरदतà¥\8dतà¤\83।\nà¤\9aà¥\87दà¥\8dभवानà¥\8d \"{{int:savearticle}}\" à¤\87तà¥\8dयà¥\87तदà¥\8d à¤ªà¥\81नà¤\83 à¤\95à¥\8dलिà¤\95à¥\8dà¤\95रà¥\8bति, à¤­à¤µà¤¤à¤\83 à¤¸à¤®à¥\8dपादनानि à¤¸à¤¾à¤°à¤¾à¤¦à¥\8d à¤\8bतà¥\87 à¤°à¤\95à¥\8dषितà¥\80भविषà¥\8dयनà¥\8dति।",
-    "missingcommenttext": "à¤\95à¥\83पया à¤\85धसà¥\8dतातà¥\8d à¤\8fà¤\95ा à¤\9fिपà¥\8dपणà¥\80 à¤¦à¤¾à¤¤à¤µà¥\8dया।",
-    "missingcommentheader": "'''à¤\85नà¥\81सà¥\8dमारà¤\95मà¥\8d:''' à¤­à¤µà¤¤à¤¾ à¤\85सà¥\8dयाà¤\83 à¤\9fिपà¥\8dपणà¥\8dयाà¤\83 à¤µà¤¿à¤·à¤¯à¤\83 à¤¶à¥\80रà¥\8dषà¤\95à¤\82 à¤µà¤¾ à¤¨ à¤ªà¥\8dरदतà¥\8dतà¤\83।\nà¤\9aà¥\87दà¥\8dभवानà¥\8d \"{{int:savearticle}}\" à¤\87तà¥\8dयà¥\87तदà¥\8d à¤ªà¥\81नà¤\83 à¤\95à¥\8dलिà¤\95à¥\8dà¤\95रà¥\8bति, à¤­à¤µà¤¤à¤\83 à¤¸à¤®à¥\8dपादनानि à¤µà¤¿à¤·à¤¯à¤¾à¤¤à¥\8d à¤¶à¥\80रà¥\8dषà¤\95ादà¥\8d à¤µà¤¾ à¤\8bतà¥\87 à¤°à¤\95à¥\8dषितà¥\80भविषà¥\8dयनà¥\8dति।",
+    "anonpreviewwarning": "''भवता/भवतà¥\8dया à¤ªà¥\8dरवà¥\87शà¤\83 à¤¨ à¤¸à¥\8dवà¥\80à¤\95à¥\83तà¤\83 à¥¤ à¤\85सà¥\8dय à¤ªà¥\83षà¥\8dठसà¥\8dय à¤ªà¤°à¤¿à¤µà¤°à¥\8dतनसà¥\8dय à¤\87तिहासà¥\87 à¤­à¤µà¤¤à¤\83/भवतà¥\8dयाà¤\83 à¤\85नà¥\8dतरà¥\8dà¤\9cालसà¤\82विदà¤\83 (IP) à¤\89लà¥\8dलà¥\87à¤\96à¥\8b à¤­à¤µà¤¿à¤·à¥\8dयति ।''",
+    "missingsummary": "'''सà¥\8dमरतà¥\81''' à¤­à¤µà¤¤à¤¾/भवतà¥\8dया à¤¸à¤®à¥\8dपादनसà¥\8dय à¤¸à¤¾à¤°à¤¾à¤\82शà¤\83 à¤¨ à¤ªà¥\8dरदतà¥\8dतà¤\83 à¥¤\n\"{{int:savearticle}}\" à¤\85तà¥\8dर à¤¯à¤¦à¤¿ à¤­à¤µà¤¾à¤¨à¥\8d/भवतà¥\80 à¤¦à¥\8dवितà¥\80यवारà¤\82 à¤¨à¥\81दिषà¥\8dयति, à¤¤à¤°à¥\8dहि à¤­à¤µà¤¤à¤\83/भवतà¥\8dयाà¤\83 à¤¸à¤®à¥\8dपादनसाराà¤\82शातà¥\8d à¤\8bतà¥\87 à¤ªà¤°à¤¿à¤µà¤°à¥\8dतनà¤\82 à¤°à¤\95à¥\8dषितà¤\82 à¤­à¤µà¤¿à¤·à¥\8dयति ।",
+    "missingcommenttext": "à¤\95à¥\83पया à¤\85धà¤\83 à¤\9fिपà¥\8dपणà¥\80à¤\82 à¤²à¤¿à¤\96तà¥\81 ।",
+    "missingcommentheader": "'''सà¥\8dमरतà¥\81''' à¤­à¤µà¤¤à¤¾/भवतà¥\8dया à¤\85सà¥\8dयà¥\88 à¤\9fिपà¥\8dपणà¥\8dयà¥\88 à¤µà¤¿à¤·à¤¯à¤\83/शà¥\80रà¥\8dषà¤\95à¤\82 à¤¨ à¤ªà¥\8dरदतà¥\8dतमà¥\8d à¥¤\n\"{{int:savearticle}}\" à¤\85तà¥\8dर à¤¯à¤¦à¤¿ à¤­à¤µà¤¾à¤¨à¥\8d/भवतà¥\80 à¤¦à¥\8dवितà¥\80यवारà¤\82 à¤¨à¥\81दिषà¥\8dयति, à¤¤à¤°à¥\8dहि à¤­à¤µà¤¤à¤\83/भवतà¥\8dयाà¤\83 à¤¸à¤®à¥\8dपादनसाराà¤\82शातà¥\8d à¤\8bतà¥\87 à¤\8fततà¥\8d à¤°à¤\95à¥\8dषितà¤\82 à¤­à¤µà¤¿à¤·à¥\8dयति ।",
     "summary-preview": "सारांशस्य प्राग्दृश्यम् :",
     "subject-preview": "विषयस्य/शीर्षकस्य प्राग्दृश्यम्:",
     "blockedtitle": "प्रयोक्ता अवरुद्धः वर्तते",
-    "blockedtext": "भवतः आइपिसङ्केतः स्वचालितविधिना अवरुद्धोऽस्ति, यस्मादयं भिन्नेनैकेन सदस्येन प्रयुक्त आसीत्, यो हि $1 इत्यनेन अवरुद्धः आसीत्।\nप्रदत्तं कारणमेतदस्ति:\n:''$2''\n* अवरोधनस्यारम्भः: $8\n* अवरोधनस्य समाप्तिः: $6\n* अभिप्रेतः अवरोध्यः: $7\n\nभवान् अवरोधार्थं सम्भाषणं कर्तुं  $1 इत्येतं अथवा अन्यान् [[{{MediaWiki:Grouppage-sysop}}|प्रबन्धकान्]] सम्पर्कं कर्त्तुं शक्नोति।\nमनसि धारयतु यद् भवान् \"e-mail this user\"(विद्युत्सन्देशः)  इति सुविधायाः प्रयोगः तावत् कर्त्तुं न शक्नोति यावत् भवानेकं  विधिमान्यं विद्युत्सन्देश-सङ्केतं [[Special:Preferences|user preferences]] इत्यत्र न पञ्जीकृतवानस्ति अपि च भवान् तस्य प्रयोगात् न निवारितोऽस्ति।\n\nभवतः वर्तमानः आइपीसङ्केतः $3 इति अस्ति। अपि च अवरोधनस्य परिचयचिह्नम्  (आइडी) #$5 इत्यस्ति।\nकृपया भवान् स्वकीयेषु सर्वेष्वपि प्रश्नेषु सर्वमेतत् वर्णनं ददातु।",
-    "autoblockedtext": "भवतः आइपिसङ्केतः स्वचालितविधिना अवरुद्धोऽस्ति, यस्मादयं भिन्नेनैकेन सदस्येन प्रयुक्त आसीत्, यो हि $1 इत्यनेन अवरुद्धः आसीत्।\nप्रदत्तं कारणमेतदस्ति:\n:''$2''\n* अवरोधनस्यारम्भः: $8\n* अवरोधनस्य समाप्तिः: $6\n* अभिप्रेतः अवरोध्यः: $7\n\nभवान् अवरोधार्थं सम्भाषणं कर्तुं  $1 इत्येतं अथवा अन्यान् [[{{MediaWiki:Grouppage-sysop}}|प्रबन्धकान्]] सम्पर्कं कर्त्तुं शक्नोति।\nमनसि धारयतु यद् भवान् \"e-mail this user\"(विद्युत्सन्देशः)  इति सुविधायाः प्रयोगः तावत् कर्त्तुं न शक्नोति यावत् भवानेकं  विधिमान्यं विद्युत्सन्देश-सङ्केतं [[Special:Preferences|user preferences]] इत्यत्र न पञ्जीकृतवानस्ति अपि च भवान् तस्य प्रयोगात् न निवारितोऽस्ति।\n\nभवतः वर्तमानः आइपीसङ्केतः $3 इति अस्ति। अपि च अवरोधनस्य परिचयचिह्नम्  (आइडी) #$5 इत्यस्ति।\nकृपया भवान् स्वकीयेषु सर्वेष्वपि प्रश्नेषु सर्वमेतत् वर्णनं ददातु।",
-    "blockednoreason": "न किमपि कारणम् दत्तम्",
-    "whitelistedittext": "पà¥\83षà¥\8dठाणाà¤\82 à¤¸à¤®à¥\8dपादनारà¥\8dथà¤\82 $1 à¤\87ति à¤\95ारà¥\8dयमà¥\8d à¤\86वशà¥\8dयà¤\95मà¥\8d।",
-    "confirmedittext": "समà¥\8dपादनातà¥\8d à¤ªà¥\82रà¥\8dवà¤\82 à¤­à¤µà¤¤à¤¾ à¤¸à¥\8dवà¤\95à¥\80यà¤\82 à¤µà¤¿à¤¦à¥\8dयà¥\81तà¥\8dसनà¥\8dदà¥\87शसà¤\82à¤\95à¥\87तà¤\83 à¤ªà¤°à¤¿à¤ªà¥\81षà¥\8dà¤\9fà¥\80à¤\95रणà¥\80यà¤\83।\nà¤\95à¥\83पया à¤¸à¥\8dवà¤\95à¥\80यà¤\83 à¤µà¤¿à¤¦à¥\8dयà¥\81तà¥\8dसनà¥\8dदà¥\87शसà¤\82à¤\95à¥\87तà¤\83 [[Special:Preferences|पà¥\8dरयà¥\8bà¤\95à¥\8dतà¥\83-वरà¥\80याà¤\82सि]] à¤\87तà¥\8dयà¥\87तदà¥\8dदà¥\8dवारा à¤ªà¥\8dरददातà¥\81 à¤¤à¤¥à¤¾ à¤\9a à¤ªà¥\8dरमाणà¥\80à¤\95रà¥\8bतà¥\81।",
-    "nosuchsectiontitle": "à¤\8fतादà¥\83शà¤\83 à¤\95à¥\8bपà¥\8dयनà¥\81भाà¤\97à¤\83 à¤¨ à¤²à¤¬à¥\8dधः",
-    "nosuchsectiontext": "भवता à¤\8fतादà¥\83श à¤\8fà¤\95à¥\8bऽनà¥\81भाà¤\97à¤\83 à¤¸à¤®à¥\8dपादितà¥\81à¤\82 à¤\9aà¥\87षà¥\8dà¤\9fितà¤\82, à¤¯à¤¨à¥\8dन à¤¹à¤¿ à¤µà¤¿à¤¦à¥\8dयतà¥\87।\nततà¥\8dतà¥\81 à¤ªà¤¶à¥\8dयति à¤­à¤µà¤¤à¤¿ à¤\8fव à¤ªà¥\8dरà¤\9aालितमà¥\8d à¤\85थवा à¤\85पाà¤\95à¥\83तà¤\82 à¤¸à¥\8dयातà¥\8d।",
+    "blockedtext": "<strong>भवतः/भवत्याः सदस्यता अन्तर्जालसंविद् वा प्रतिबन्धिता वर्तते ।</strong>\n\nप्रतिबन्धः $1 द्वारा अभवत् ।\nकारणं दत्तं यत्, <em>$2</em>.\n\n* प्रतिबन्धस्य प्रारम्भः : $8\n* प्रतिबन्धस्य समाप्तिः : $6\n* अभिप्रेतः अवरोध्यः : $7\n\n$1 अस्य सम्पर्कं कर्तुं शक्नोति । अथवा अन्य[[{{MediaWiki:Grouppage-sysop}}|प्रबन्धकेन]] सह प्रतिबन्धविषयकचर्चां कर्तुं शक्नोति ।\nभवान्/भवती \"ई-पत्रं प्रेष्यताम्\" विकल्पस्य उपयोगं कर्तुं न शक्नोति । भवतः/भवत्याः [[Special:Preferences|इष्टतमानि]] विकल्पे कोऽपि ई-पत्रसङ्केतः अस्ति, तस्य उपयोगाय च प्रतिबन्धः नास्ति चेत्, तस्य ई-पत्रस्य उपयोगं कर्तुं शक्नोति ।\n\nभवतः/भवत्याः वर्तमाना अन्तर्जालसंविद् $3, प्रतिबन्धितसदस्यता #$5 च अस्ति । \n\nयत्र कुत्रापि प्रबन्धसम्बद्धां चर्चां करोति, तत्र उक्तसूचनायाः  उपयोगम् अवश्यं करोतु ।",
+    "autoblockedtext": "<strong>भवतः/भवत्याः अन्तर्जालसंविद् प्रतिबन्धिता वर्तते ।</strong>\n\nप्रतिबन्धः $1 द्वारा अभवत् ।\nकारणं दत्तं यत्, <em>$2</em>.\n\n* प्रतिबन्धस्य प्रारम्भः : $8\n* प्रतिबन्धस्य समाप्तिः : $6\n* अभिप्रेतः अवरोध्यः : $7\n\n$1 अस्य सम्पर्कं कर्तुं शक्नोति । अथवा अन्य[[{{MediaWiki:Grouppage-sysop}}|प्रबन्धकेन]] सह प्रतिबन्धविषयकचर्चां कर्तुं शक्नोति ।\nभवान्/भवती \"ई-पत्रं प्रेष्यताम्\" विकल्पस्य उपयोगं कर्तुं न शक्नोति । भवतः/भवत्याः [[Special:Preferences|इष्टतमानि]] विकल्पे कोऽपि ई-पत्रसङ्केतः अस्ति, तस्य उपयोगाय च प्रतिबन्धः नास्ति चेत्, तस्य ई-पत्रस्य उपयोगं कर्तुं शक्नोति ।\n\nभवतः/भवत्याः वर्तमाना अन्तर्जालसंविद् $3, प्रतिबन्धितसदस्यता #$5 च अस्ति । \n\nयत्र कुत्रापि प्रबन्धसम्बद्धां चर्चां करोति, तत्र उक्तसूचनायाः  उपयोगम् अवश्यं करोतु ।",
+    "blockednoreason": "न किमपि कारणम् दत्तम्",
+    "whitelistedittext": "समà¥\8dपादनà¤\82 à¤\95रà¥\8dतà¥\81à¤\82 $1 à¤\86वशà¥\8dयà¤\95मà¥\8d ।",
+    "confirmedittext": "समà¥\8dपादनातà¥\8d à¤ªà¥\82रà¥\8dवà¤\82 à¤¸à¥\8dवसà¥\8dय à¤\88-पतà¥\8dरसà¤\99à¥\8dà¤\95à¥\87तà¤\82 à¤ªà¥\81षà¥\8dà¤\9fà¤\82 à¤\95रà¥\8bतà¥\81 à¥¤\n[[Special:Preferences|user preferences]] à¤\87तà¥\8dयतà¥\8dर à¤¸à¥\8dवसà¥\8dय à¤¯à¥\8bà¤\97à¥\8dयमà¥\8d à¤\88-पतà¥\8dरसà¤\99à¥\8dà¤\95à¥\87तà¤\82 à¤²à¤¿à¤\96तà¥\81 ।",
+    "nosuchsectiontitle": "à¤\8fतादà¥\83शà¤\83 à¤¨ à¤\95à¥\8bऽपि à¤µà¤¿à¤­à¤¾à¤\97à¤\83 à¤ªà¥\8dरापà¥\8dतः",
+    "nosuchsectiontext": "यà¤\83 à¤µà¤¿à¤­à¤¾à¤\97à¤\83 à¤\8fव à¤¨à¤¾à¤¸à¥\8dति, à¤¤à¤¾à¤¦à¥\83शसà¥\8dय à¤µà¤¿à¤­à¤¾à¤\97सà¥\8dय à¤¸à¤®à¥\8dपादनसà¥\8dय à¤¨à¤¿à¤¶à¥\8dà¤\9aयà¤\83 à¤\95à¥\83तà¤\83 à¤­à¤µà¤¤à¤¾/भवतà¥\8dया à¥¤\nà¤\8fषà¤\83 à¤µà¤¿à¤­à¤¾à¤\97à¤\83 à¤\9aालितà¤\83 à¤\85पाà¤\95à¥\83तà¤\83 à¤µà¤¾ à¤¸à¥\8dयातà¥\8d ।",
     "loginreqtitle": "प्रवेशः अपेक्षितः",
     "loginreqlink": "प्रविश्यताम्",
-    "loginreqpagetext": "अन्यानि पृष्ठानि द्रष्टुं भवता $1 इत्येतत् अवश्यमेव कर्त्तव्यम्।",
-    "accmailtitle": "à¤\95à¥\82à¤\9fसà¤\99à¥\8dà¤\95à¥\87तः प्रेषितः",
-    "accmailtext": "[[User talk:$1|$1]] à¤\87तà¥\8dयà¥\87तदरà¥\8dथà¤\82 à¤\8fà¤\95à¤\83 à¤¯à¤¾à¤¦à¥\83à¤\9aà¥\8dà¤\9bिà¤\95तया à¤\89तà¥\8dपादितà¤\83 à¤\95à¥\82à¤\9fशबà¥\8dदà¤\83 $2 à¤\87तà¥\8dयà¥\87ततà¥\8d à¤ªà¥\8dरति à¤ªà¥\8dरà¥\87षितà¥\8bऽसà¥\8dति।\nसतà¥\8dरारमà¥\8dभपशà¥\8dà¤\9aातà¥\8d à¤¨à¥\82तनायाà¤\83 à¤\85सà¥\8dयाà¤\83 à¤²à¥\87à¤\96ायाà¤\83 à¤\95à¥\82à¤\9fशबà¥\8dदà¤\83  '''[[Special:ChangePassword|à¤\95à¥\82à¤\9fशबà¥\8dदà¤\82 à¤ªà¤°à¤¿à¤µà¤°à¥\8dततामà¥\8d]]'' à¤\87ति à¤ªà¥\83षà¥\8dठà¥\87 à¤ªà¤°à¤¿à¤µà¤°à¥\8dतितà¥\81à¤\82 à¤¶à¤\95à¥\8dयतà¥\87।",
+    "loginreqpagetext": "अन्यानि पृष्ठानि द्रष्टुं $1 आवश्यकम् ।",
+    "accmailtitle": "à¤\95à¥\82à¤\9fशबà¥\8dदः प्रेषितः",
+    "accmailtext": "[[User talk:$1|$1]] à¤\95à¥\83तà¥\87 à¤\85शà¥\83à¤\99à¥\8dà¤\96लितरà¥\80तà¥\8dया (randomly) à¤\89तà¥\8dपादितà¤\83 à¤\95à¥\82à¤\9fशबà¥\8dदà¤\83 $2 à¤\88-पतà¥\8dरसà¤\99à¥\8dà¤\95à¥\87तà¤\82 à¤ªà¥\8dरति à¤ªà¥\8dरषितà¤\83 à¤\85सà¥\8dति à¥¤ <em>[[Special:ChangePassword|à¤\95à¥\82à¤\9fशबà¥\8dदà¤\83 à¤ªà¤°à¤¿à¤µà¤°à¥\8dतà¥\8dयतामà¥\8d]]</em> à¤\85तà¥\8dर à¤¤à¤¤à¥\8d à¤ªà¤°à¤¿à¤°à¥\8dतयितà¥\81à¤\82 à¤¶à¤\95à¥\8dयतà¥\87 ।",
     "newarticle": "(नूतनम्)",
     "newarticletext": "भवान्/भवती अनिर्मिते पृष्ठे अस्ति । \nपृष्ठं स्रष्टुम् अधः प्रदत्तायां पेटिकायां टङ्कनं प्रारभतु (साहाय्यार्थं [$1 अत्र]) नुदतु ।\nभवान्/भवती यदि क्षतिकारणात् एतत् पृष्ठं प्रति आगच्छत्, तर्हि अस्य गवेषकस्य (browser) Back नुदतु ।",
-    "anontalkpagetext": "तस्य अनामकयोजकस्य, अथवा अनुपयोजकस्य च परिचर्चापुटम् येन एतावति काले स्वस्थनं  न निर्मितम् । \nअतः तस्य अभिज्ञानार्थं ऐ.पि.सङ्गेतसङ्ख्या प्रयोजनीया । \nसा समाना सङ्ख्याः अन्ययोजकैः अपि विभक्ता । यदि भवान् अनामकयोजकः, भवता असम्बद्धटीकाः श्रुताः, कृपया स्वस्थनं निर्मीय नामाभिलेखं करोतु ।  [[Special:UserLogin/signup|create an account]], [[Special:UserLogin|log in]] अन्यानामकयोजकैः सह सम्भूयमनभ्रमैः विमुक्तः भवतु ।",
+    "anontalkpagetext": "----\n<em>एतत् सम्भाषणपृष्ठम् अनामकयोजकेभ्यः अस्ति । एतत् तेभ्यः अनामकयोजकेभ्यः रचितमस्ति, यैः सदस्यता न प्राप्ता अस्ति तथा च अस्य पृष्ठस्य उपयोगं न कुर्वन्तः सन्ति ।</em>\nतेषां व्यक्तिगतसूचनां प्राप्तुमेव वयं तस्य/तस्याः अन्तर्जालसंविदः उपयोगं कुर्मः । केचन योजकाः स्वस्य अन्तर्जालसंविदम् अन्यान् योजकान् कथयन्ति । \nयद्यपि अनामकयोजकः अहं नास्मि, तथापि अयोग्यसूचनाः मम पार्श्वे आगच्छन्त्यः सन्ति इति यदि भवान्/भवती अनुवति, तर्हि एतत् [[Special:UserLogin/signup|create an account]] एतत् [[Special:UserLogin|log in]] वा कृत्वा भविष्यस्य अनामकयोजकनां सन्देशेभ्यः स्वस्य रक्षणं करोतु ।",
     "noarticletext": "अस्मिन् पृष्ठे अधुना किमपि न विद्यते । [[Special:Search/{{PAGENAME}}|एषः शब्दः]] येषु पृष्ठेषु अन्तर्भवति, तानि पृष्ठानि अन्वेष्टुं शक्यन्ते । \n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}}  सम्बद्धेषु पृष्ठेषु अन्वेषणं]\n[{{fullurl:{{FULLPAGENAME}}|action=edit}} अस्य पृष्ठस्य सम्पादनं] वा  शक्यम्</span>.",
     "noarticletext-nopermission": "अस्मिन् पृष्ठे अधुना किमपि न विद्यते । [[Special:Search/{{PAGENAME}}|एषः शब्दः]] येषु पृष्ठेषु अन्तर्भवति, तानि पृष्ठानि अन्वेष्टुं शक्यन्ते । \n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}}  सम्बद्धेषु पृष्ठेषु अन्वेषणं]\n[{{fullurl:{{FULLPAGENAME}}|action=edit}} अस्य पृष्ठस्य सम्पादनं] वा  शक्यम्</span>.",
-    "missing-revision": "{{FULLPAGENAME}} इति नामाङ्कितपुटस्य #$1 इति पुनरावृत्तिः अत्र नाश्ति । \nपुटेन सह कालातीतानुबन्धकारणेन एतत् अभवत् ।\nविवरणम् अत्र दृश्यते ।[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log].",
-    "userpage-userdoesnotexist": "\"$1\" à¤\87ति à¤ªà¥\8dरयà¥\8bà¤\95à¥\8dतà¥\83लà¥\87à¤\96ा à¤ªà¤\9eà¥\8dà¤\9cà¥\80à¤\95à¥\83ता à¤¨à¤¾à¤¸à¥\8dति।\nà¤\9aà¥\87दà¥\8dभवानà¥\8d à¤\8fततà¥\8dपà¥\83षà¥\8dठà¤\82 à¤¸à¥\8dरषà¥\8dà¤\9fà¥\81मिà¤\9aà¥\8dà¤\9bति à¤¸à¤®à¥\8dपादयितà¥\81मिà¤\9aà¥\8dà¤\9bति à¤µà¤¾ à¤¤à¤¦à¤¾ à¤\95à¥\83पया à¤ªà¥\81नरà¥\80à¤\95à¥\8dषतामà¥\8d।",
-    "userpage-userdoesnotexist-view": "\"$1\" à¤\87ति à¤ªà¥\8dरयà¥\8bà¤\95à¥\8dतà¥\83लà¥\87à¤\96ा à¤ªà¤\9eà¥\8dà¤\9cà¥\80à¤\95à¥\83ता à¤¨à¤¾à¤¸à¥\8dति।",
+    "missing-revision": "\"{{FULLPAGENAME}}\" पृष्ठस्य संस्करणं #$1 नोपलभ्यत् ।\nयस्य पृष्ठस्य इतिहासे परिसन्धयः कालातीतान्यः सन्ति, तेषु पृष्ठेषु एवं भवति ।\nअधिकसूटनाः अत्र प्राप्तुं शक्यते [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} अपाकृतानाम् आवलिः].",
+    "userpage-userdoesnotexist": "\"$1\" à¤\87ति à¤ªà¥\8dरयà¥\8bà¤\95à¥\8dतà¥\83नाम à¤ªà¤\9eà¥\8dà¤\9cिà¤\95à¥\83तà¤\82 à¤¨ à¤µà¤¿à¤¦à¥\8dयतà¥\87 à¥¤ à¤\85सà¥\8dय\nनवरà¤\9aनायà¥\88/समà¥\8dपादनाय à¤¤à¤¤à¥\8d à¤ªà¤¶à¥\8dयतà¥\81 ।",
+    "userpage-userdoesnotexist-view": "\"$1\" à¤\87ति à¤ªà¥\8dरयà¥\8bà¤\95à¥\8dतà¥\83नाम à¤ªà¤\9eà¥\8dà¤\9cिà¤\95à¥\83तà¤\82 à¤¨ à¤µà¤¿à¤¦à¥\8dयतà¥\87 ।",
     "blocked-notice-logextract": "अयं प्रयोक्ता सम्प्रति अवरुद्धः वर्तते।\nनूतनतमा अवरोधाभिलेख-प्रविष्टिः सन्दर्भार्थम् अधस्तात् प्रदत्ताऽस्ति:",
-    "clearyourcache": "'''सूचनाः:''' संरक्षणानन्तरं परिवर्तनानां दर्शनाय जालगवेशकस्य पुनर्चालनम् अवश्यं भवेत् ।\n* '''Firefox / Safari:''' गृह्यताम् ''Shift'' नोदनावसरे ''Reload'', अथवा एतयोः अन्यतरं नुद्यताम् ''Ctrl-F5'' अथवा ''Ctrl-R'' (''⌘-R'' on a Mac)\n* '''Google Chrome:''' नुद्यताम् ''Ctrl-Shift-R'' (''⌘-Shift-R'' on a Mac)\n* '''Internet Explorer:''' गृह्यताम् ''Ctrl'' नोदनावसरे ''Refresh'', अथवा नुद्यताम् ''Ctrl-F5''\n* '''Opera:''' पुनर्चाल्यताम् ''Tools → Preferences''",
-    "usercssyoucanpreview": "'''सूचना :''' रक्षणात्पूर्वं स्वकीयं जावास्क्रिप्ट् इति लिपिं परीक्षितुं \"{{int:showpreview}}\" इति गण्डं प्रयोजयतु।",
-    "userjsyoucanpreview": "'''सूचना :''' रक्षणात्पूर्वं स्वकीयं जावास्क्रिप्ट् इति लिपिं परीक्षितुं \"{{int:showpreview}}\" इति गण्डं प्रयोजयतु।",
-    "usercsspreview": "'''मनसि धारयतु यद्भवान् केवलं प्राग्दृश्यं पश्यति स्वकीयस्य प्रयोक्तृ-सीएसएस् इत्येतस्य'''\n'''इदं अधुनावधि यावत् रक्षितं नास्ति!'''",
-    "userjspreview": "'''मनसि धारयतु यद्भवान् केवलं स्वकीयस्य जावास्क्रिप्ट्लिपेः परीक्षणं प्राग्दर्शनं वा करोति।'''\n'''इदं अधुनावधि यावत् रक्षितं नास्ति!'''",
-    "sitecsspreview": "'''मनसि धारयतु यद्भवान् स्वकीयस्य सीएस्एस्-इत्येतस्य केवलं प्राग्दृश्यं पश्यति।'''\n'''इदं अधुनावधि यावत् रक्षितं नास्ति!'''",
-    "sitejspreview": "'''मनसि धारयतु यद्भवान् स्वकीयस्य जावास्क्रिप्ट्कूटस्य केवलं प्राग्दृश्यं पश्यति।'''\n'''इदं अधुनावधि यावत् रक्षितं नास्ति!'''",
-    "userinvalidcssjstitle": "'''पà¥\82रà¥\8dवसà¥\82à¤\9aना:'''  \"$1\" à¤\87ति à¤¤à¥\8dवà¤\95à¥\8d à¤¨ à¤µà¤¿à¤¦à¥\8dयतà¥\87।\nमनसि à¤§à¤¾à¤°à¤¯à¤¤à¥\81 à¤¯à¤¤à¥\8d à¤¸à¥\8dवà¥\87à¤\9aà¥\8dà¤\9bया à¤ªà¤°à¤¿à¤µà¤°à¥\8dतिताà¤\83 .css, .js à¤\9aà¥\87ति à¤ªà¥\83षà¥\8dठाà¤\83 à¤²à¤\98à¥\82नà¤\95à¥\8dषरानà¥\8d à¤ªà¥\8dरयà¥\8bà¤\9cयनà¥\8dति, à¤¯à¤¥à¤¾  {{ns:user}}:Foo/Vector.css à¤\87तà¥\8dयà¥\87तसà¥\8dय à¤¸à¥\8dथानà¥\87  {{ns:user}}:Foo/vector.css à¤\87तà¥\8dयà¥\87ततà¥\8d।",
-    "updated": "(à¤\85दà¥\8dयतनà¥\80à¤\95à¥\83तà¤\83)",
+    "clearyourcache": "<strong>सूचना :</strong> भवता/भवत्या कृतानि सम्पादनानि संरक्ष्य तानि परिवर्तनेषु द्रष्टुं गवेषकस्य पृष्ठस्य पुनरारोपणम् (reload) आवश्यकं भवति ।\n* <strong>Firefox / Safari:</strong> <em>Shift</em>कुड्मलेन सह <em>Reload</em>कुड्मलं नुदतु । \n* <strong>Google Chrome:</strong> <em>Ctrl-Shift-R</em> नोदनेन पुनरारोपणं भवति । (<em>⌘-R</em> इति Mac तन्त्रांशप्रयोक्तॄभ्यः)\n* <strong>Internet Explorer:</strong> <em>Ctrl</em>कुड्मलेन सह <em>Refresh</em>कुड्मलं नुदतु, <em>Ctrl-F5</em> नुदतु वा ।\n* <strong>Opera:</strong> <em>Tools → Preferences</em> इत्यत्र गत्वा कर्तुं शक्नोति ।",
+    "usercssyoucanpreview": "'''सूचना :''' CSS नवीनलिप्याः संरक्षणं करणात् प्राक् एतत् \"{{int:showpreview}}\" नुद्य प्रयोगं करोतु ।",
+    "userjsyoucanpreview": "'''सूचना :''' JavaScript नवीनलिप्याः संरक्षणं करणात् प्राक् एतत् \"{{int:showpreview}}\" नुद्य प्रयोगं करोतु ।",
+    "usercsspreview": "<strong>एतत् केवलं योजकस्य CSS इत्यस्य प्राग्दृश्यं वर्तते इति स्मरतु । भवता/भवत्या कृतानि परिवर्तनानि एतवता न रक्षितानि !</strong>",
+    "userjspreview": "<strong>एतत् केवलं योजकस्य JabaScript इत्यस्य प्राग्दृश्यं वर्तते इति स्मरतु । भवता/भवत्या कृतानि परिवर्तनानि एतवता न रक्षितानि !</strong>",
+    "sitecsspreview": "<strong>एतत् केवलं CSS इत्यस्य प्राग्दृश्यं वर्तते इति स्मरतु । भवता/भवत्या कृतानि परिवर्तनानि एतवता न रक्षितानि !</strong>",
+    "sitejspreview": "<strong>एतत् केवलं JavaScript इत्यस्य प्राग्दृश्यं वर्तते इति स्मरतु । भवता/भवत्या कृतानि परिवर्तनानि एतवता न रक्षितानि !</strong>",
+    "userinvalidcssjstitle": "'''पà¥\82रà¥\8dवसà¥\82à¤\9aना:'''  \"$1\" à¤\87ति à¤¤à¥\8dवà¤\95à¥\8d à¤¨ à¤µà¤¿à¤¦à¥\8dयतà¥\87।\nयà¥\8bà¤\9cà¤\95परिवरà¥\8dतितà¥\87 .css, .js à¤¸à¤\9eà¥\8dà¤\9aिà¤\95à¥\87 à¤²à¤\98à¥\81-à¤\86à¤\99à¥\8dà¤\97ावरà¥\8dणमालायाà¤\83 à¤µà¤°à¥\8dणà¥\88à¤\83 à¤²à¤¿à¤\96à¥\8dयà¥\87तà¥\87 à¥¤ à¤\89दा. {{ns:user}}:Foo/Vector.css à¤\8fवà¤\82 à¤¨ à¤²à¥\87à¤\96नà¥\80यमà¥\8d à¥¤ à¤²à¤\98à¥\81वरà¥\8dणà¥\88à¤\83 {{ns:user}}:Foo/vector.css à¤\8fवà¤\82 à¤²à¥\87à¤\96नà¥\80यमà¥\8d ।",
+    "updated": "(नवà¥\80à¤\95à¥\83तमà¥\8d (updated))",
     "note": "'''सूचना:'''",
-    "previewnote": "'''एतत् केवलं प्राग्दृश्यं वर्तते इति स्मरतु'''\nभवता/भवत्या कृतानि परिवर्तनानि एतवता न रक्षितानि ।",
-    "continue-editing": "समà¥\8dपादनमà¥\8d à¤\85नà¥\81वरà¥\8dतताम्",
-    "previewconflict": "à¤\85सà¥\8dमिनà¥\8d à¤ªà¥\8dराà¤\97à¥\8dदà¥\83शà¥\8dयà¥\87 à¤¦à¤°à¥\8dशितमसà¥\8dति à¤¯à¤¤à¥\8d à¤\89परिवरà¥\8dति à¤ªà¤¾à¤  à¤\95à¥\8dषà¥\87तà¥\8dरसà¥\8dय à¤ªà¤¾à¤ à¤\83 à¤°à¤\95à¥\8dषणपशà¥\8dà¤\9aातà¥\8d à¤\95à¥\80दà¥\83शà¤\83 à¤¦à¥\83षà¥\8dà¤\9fिà¤\97à¥\8bà¤\9aरà¤\83 à¤­à¤µà¤¿à¤·à¥\8dयति।",
-    "session_fail_preview": "'''क्षम्यताम्! अस्माभिः भवतः सम्पादनस्य संसाधनं न कर्तुं शक्तम् यस्माद्धि सत्रस्य सूचनाः लुप्ताः।'''\nकृपया पुनः चेष्टताम्।\nचेदेतत् अधुनाऽपि न कार्यशीलं स्यात्, [[Special:UserLogout|सत्राद्बहिः गत्वा]] पुनः प्रवेशं करोतु।",
-    "session_fail_preview_html": "लेखभागाभावात् ते परिचर्यां समापयितुं न शक्यते ।[[Special:UserLogout|logging out]]",
-    "token_suffix_mismatch": "'''तà¥\87 à¤¸à¤®à¥\8dपादनà¤\82 à¤¤à¤¿à¤°à¥\8dसà¥\8dà¤\95à¥\83तमà¥\8d à¥¤ à¤¯à¤¤à¤\83 à¤¤à¥\87 à¤\97à¥\8dराहà¤\95à¤\83 à¤¸à¤®à¥\8dपादनपà¥\8dरतà¥\80à¤\95à¥\87 à¤²à¥\87à¤\96ानà¤\9aिहà¥\8dनानि à¤\95à¥\8dषतविà¤\95à¥\8dषतानि à¤\85à¤\95रà¥\8bतà¥\8d। '''\nपाठà¥\8dयपà¥\81à¤\9fसà¥\8dय à¤¸à¤\82रà¤\95à¥\8dषणारà¥\8dथà¤\82 à¤¸à¤®à¥\8dपादनावà¤\95ाशà¤\83 à¤ªà¤¿à¤¹à¤¿à¤¤à¤\83 à¥¤ à¤\85नामिà¤\95ानामà¥\8d à¤\89पयà¥\8bà¤\97à¤\95ालà¥\87 à¤\95दाà¤\9aितà¥\8d à¤\8fवà¤\82 à¤¸à¤®à¥\8dभवति ।",
-    "edit_form_incomplete": "'''समà¥\8dपादनसà¥\8dय à¤\95तिà¤\9aनाà¤\82शाà¤\83 à¤µà¤¿à¤¤à¤¾à¤°à¤\95à¤\82 à¤¨ à¤ªà¥\8dरापà¥\8dताà¤\83 ; à¤¸à¤®à¥\8dपादनà¤\82  à¤¦à¥\8dविवरà¤\82 à¤ªà¤°à¤¿à¤¶à¥\80लयतà¥\81 à¥¤ à¤¤à¥\87 à¤¸à¤®à¥\8dपादनानि à¤\85नाहतानि, à¤ªà¥\81नà¤\83 à¤¯à¤¤à¤¤à¤¾à¤®à¥\8d  '''",
+    "previewnote": "<strong>एतत् केवलं प्राग्दृश्यं वर्तते इति स्मरतु । भवता/भवत्या कृतानि परिवर्तनानि एतवता न रक्षितानि !</strong>",
+    "continue-editing": "समà¥\8dपादनविभाà¤\97à¤\82 à¤\97मà¥\8dयताम्",
+    "previewconflict": "à¤\8fततà¥\8d à¤ªà¥\83षà¥\8dठà¤\82 à¤¯à¤¦à¤¿ à¤­à¤µà¤¾à¤¨à¥\8d/भवतà¥\80 à¤°à¤\95à¥\8dषिषà¥\8dयति, à¤¤à¤°à¥\8dहि à¤\85तà¥\8dर à¤ªà¥\8dराà¤\97à¥\8dदà¥\83शà¥\8dयà¥\87 à¤¯à¤¥à¤¾ à¤¦à¥\83शà¥\8dयतà¥\87, à¤¤à¤¥à¥\88व à¤°à¤\95à¥\8dषितà¤\82 à¤­à¤µà¤¿à¤·à¥\8dयति ।",
+    "session_fail_preview": "'''क्षम्यताम् ! प्रवेशसूचनायाः लोपत्वात् भवता/भवत्या कृतानि परिवर्तनानि रक्षितुं वयं न अशक्नुम ।\nअधुनापि यदि सा एव समस्या अस्ति, तर्हि [[Special:UserLogout|निर्गमनं कृत्वा]] पुनः प्रविश्यताम् ।",
+    "session_fail_preview_html": "'''क्षम्यताम् ! प्रवेशसूचनायाः लोपत्वात् भवता/भवत्या कृतानि परिवर्तनानि रक्षितुं वयं न अशक्नुम ।\n\n<em>कारणं {{SITENAME}} इत्यत्र मूल-HTML-समर्थितं भवति । अतः JavaScript इत्यस्मात् रक्षितुं प्राग्दृश्यं निगूढं भवति ।</em>\n\n<strong>भवता/भवत्या कृतं सम्पादनं यदि उचितमस्ति, तर्हि पुनः प्रयासं करोतु ।</strong>\n\nअधुनापि यदि सा एव समस्या अस्ति, तर्हि [[Special:UserLogout|निर्गमनं कृत्वा]] पुनः प्रविश्यताम् ।",
+    "token_suffix_mismatch": "'''भवता/भवतà¥\8dया à¤\95à¥\83तानि à¤ªà¤°à¤¿à¤µà¤°à¥\8dतनानि à¤¨à¤¿à¤°à¤¸à¥\8dतानि à¤\95à¥\83तानि à¥¤ à¤\95राणà¤\82 à¤­à¤µà¤¤à¤\83/भवतà¥\8dयाà¤\83 à¤\97वà¥\87षà¤\95à¥\87न (browser) à¤¸à¤®à¥\8dपादनà¥\87 à¤\95ानिà¤\9aन à¤µà¤¿à¤°à¤¾à¤®à¤\9aिहà¥\8dनानि à¤\85सà¥\8dतवà¥\8dयसà¥\8dतà¤\95à¥\83तानि à¥¤'''\nलà¥\87à¤\96सà¥\8dय à¤ªà¤¾à¤ à¤\83 à¤\85सà¤\82सà¥\8dà¤\95à¥\83तà¤\83 à¤¨ à¤¸à¥\8dयातà¥\8d, à¤\85तà¤\83 à¤­à¤µà¤¤à¤\83/भवतà¥\8dयाà¤\83 à¤ªà¤°à¤¿à¤µà¤°à¥\8dतनानि à¤¨à¤¿à¤°à¤¸à¥\8dतà¥\80à¤\95à¥\83तानि à¥¤\nà¤\85यà¥\8bà¤\97à¥\8dयपà¥\8dरतिनिधà¥\87à¤\83 (proxy server) à¤\89पयà¥\8bà¤\97à¥\87नापि à¤\95à¥\81तà¥\8dरà¤\9aितà¥\8d à¤\8fतादà¥\83शà¤\82 भवति ।",
+    "edit_form_incomplete": "'''समà¥\8dपादनसà¥\8dय à¤\95तिà¤\9aनाà¤\82शाà¤\83 à¤µà¤¿à¤¤à¤°à¤\95à¥\87 (server) à¤¨ à¤°à¤\95à¥\8dषिताà¤\83 à¥¤ à¤­à¤µà¤¤à¤¾/भवतà¥\8dया à¤\95à¥\83तानि à¤¸à¤®à¥\8dपादनानि à¤¯à¥\8bà¤\97à¥\8dयानि à¤\9aà¥\87तà¥\8d à¤ªà¥\81नà¤\83 à¤ªà¥\8dरयततामà¥\8d à¥¤'''",
     "editing": "$1 सम्पाद्यते",
-    "creating": "$1 à¤¸à¤°à¥\8dà¤\9cनमà¥\8d",
-    "editingsection": "$1 (विभाà¤\97सà¥\8dय) à¤¸à¤®à¥\8dपादनà¤\82 à¤\95à¥\81रà¥\8dवनà¥\8d à¤\85सà¥\8dति",
-    "editingcomment": "$1 संपादनम् (विभागः)",
-    "editconflict": "सम्पादनयोः/सम्पादनानाम् अन्तर्विरोधः : $1",
-    "explainconflict": "तà¥\87 à¤¸à¤®à¥\8dपादनावसरà¥\87 à¤\95à¥\8bपि à¤\85नà¥\8dयà¤\83 à¤ªà¤°à¤¿à¤µà¤°à¥\8dतितवानà¥\8d à¥¤ à¤\89परितनलà¥\87à¤\96सà¥\8dय à¤\95à¥\8dषà¥\87तà¥\8dरà¤\82 à¤¸à¤¦à¥\8dयà¤\83 à¤µà¤¿à¤¦à¥\8dयमानपà¥\81à¤\9fयà¥\81à¤\95à¥\8dतमसà¥\8dति à¥¤ à¤¤à¥\87 à¤ªà¤°à¤¿à¤µà¤°à¥\8dतनमà¥\8d à¤\85धà¤\83 à¤²à¥\87à¤\96à¤\95à¥\8dषà¥\87तà¥\8dरà¥\87 à¤¦à¥\83शà¥\8dयतà¥\87 à¥¤ à¤µà¤¿à¤¦à¥\8dयमानलà¥\87à¤\96à¥\88à¤\83 à¤¸à¤¹ à¤¤à¥\87 à¤ªà¤°à¤¿à¤µà¤°à¥\8dताननि à¤µà¤¿à¤²à¥\80नयतà¥\81 à¥¤ à¤¯à¤¦à¤¾ à¤¸à¤\82रà¤\95à¥\8dषणपà¥\8dरयतà¥\8dनà¤\83 à¤\95à¥\8dरियतà¥\87 à¤¤à¤¦à¤¾ à¤\95à¥\87वलमà¥\8d à¤\89परिपठà¥\8dयभाà¤\97à¤\83 à¤\8fव à¤¸à¥\81रà¤\95à¥\8dषितà¤\82 à¤­à¤µति ।",
-    "yourtext": "भवतः पाठः",
-    "storedversion": "रà¤\95à¥\8dषिता à¤\86वà¥\83तà¥\8dतिà¤\83",
-    "nonunicodebrowser": "'''पूर्वसूचना: भवतः विचरकं यूनीकोड्-अनुकूलम् नास्ति।'''\nभवान् सुरक्षिततया सम्पादनं करोतु इत्येतदर्थं एका युक्तिः कृताऽस्ति: आस्की-इतराणि अक्षराणि सम्पादनपिटके षौडशिक(hexadecimal) कूटेषु द्रक्ष्यन्ते।",
-    "editingold": "''' पूर्वसूचना : कालातीतपुटस्य सम्पादनं करोति  ''' यदि एतत् रक्षितुं यतते परिवर्तनं नैव रक्ष्यते ।",
+    "creating": "$1 à¤¸à¥\83à¤\9cà¥\8dयतà¥\87",
+    "editingsection": "$1 (विभाà¤\97à¤\83) à¤¸à¤®à¥\8dपादà¥\8dयतà¥\87",
+    "editingcomment": "$1 (नवीनविभागः) सम्पाद्यते",
+    "editconflict": "सम्पादनयोः अन्तर्विरोधः : $1",
+    "explainconflict": "भवता/भवतà¥\8dया à¤¯à¤¦à¤¾ à¤¸à¤®à¥\8dपादनà¤\82 à¤ªà¥\8dरारबà¥\8dधà¤\82, à¤¤à¤¦à¤¾à¤°à¤­à¥\8dय à¤\85नà¥\8dयà¤\9cनà¤\83 à¤\85पि à¤\85तà¥\8dर à¤¸à¤®à¥\8dपादनà¤\82 à¤\95à¥\81रà¥\8dवनà¥\8d à¤\86सà¥\80तà¥\8d à¥¤\nà¤\85धà¥\81ना à¤¯à¤¥à¤¾ à¤¸à¥\8dथितिà¤\83 à¤\85सà¥\8dति, à¤¤à¤¥à¤¾ à¤\89परि à¤ªà¥\87à¤\9fिà¤\95ायाà¤\82 à¤¦à¥\8dरषà¥\8dà¤\9fà¥\81à¤\82 à¤¶à¤\95à¥\8dयतà¥\87 à¥¤\nà¤\85धà¤\83 à¤ªà¥\87à¤\9fिà¤\95ायाà¤\82 à¤­à¤µà¤¤à¤¾/भवतà¥\8dया à¤\95à¥\83तानि à¤ªà¤°à¤¿à¤µà¤°à¥\8dतनानि à¤ªà¥\8dरदरà¥\8dशितानि à¤¸à¤¨à¥\8dति à¥¤ \nà¤\85धà¥\81ना à¤ªà¥\83षà¥\8dठà¥\87 à¤¯à¤¤à¥\8d à¤²à¤¿à¤\96ितà¤\82 à¤µà¤°à¥\8dततà¥\87, à¤¤à¥\87न à¤¸à¤¹ à¤¸à¥\8dवसà¥\8dय à¤ªà¤°à¤¿à¤µà¤°à¥\8dतनानि à¤¯à¥\8bà¤\9cनà¥\80यानि à¤­à¤µà¤¿à¤·à¥\8dयति à¥¤ \nभवानà¥\8d/भवतà¥\80 à¤¯à¤¦à¤¾ \" à¤\8fततà¥\8d {{int:savearticle}}\" à¤¨à¥\81दति, à¤¤à¤¦à¤¾\n<strong>à¤\95à¥\87वलà¤\82</strong> à¤\89परिसà¥\8dतनपà¥\87à¤\9fिà¤\95ायाà¤\82 à¤¯à¤¤à¥\8d à¤²à¤¿à¤\96ितमà¥\8d à¤\85सà¥\8dति, à¤¤à¤¤à¥\8d à¤°à¤\95à¥\8dषितà¤\82 à¤­à¤µà¤¿à¤·à¥\8dयति ।",
+    "yourtext": "भवतः/भवत्याः पाठः",
+    "storedversion": "रà¤\95à¥\8dषितसà¤\82सà¥\8dà¤\95रणमà¥\8d",
+    "nonunicodebrowser": "<strong>पूर्वसूचना : भवतः/भवत्याः गवेषकं (browser) Unicode न समर्थयति ।</strong>\nअत्र भवान्/भवती योग्यरीत्या सम्पादनं कर्तुं शक्ष्यति :\nये वर्णाः ASCII कूटे न भविष्यन्ति, ते hexadecimal वर्णत्वेन प्रदर्शयन्ते ।",
+    "editingold": "<strong>पूर्वसूचना : भवता/भवत्या अस्य पृष्ठस्य कालातीत-आवृत्तिं समाद्यते । </strong>\nएतत् पृष्ठं यदि भवान्/भवती रक्षिष्यति, तर्हि सद्यः आवृत्ति-तः पुरा यानि परिवर्तनानि आसन्, तानि नशिष्यन्ति ।",
     "yourdiff": "भेदाः",
-    "copyrightwarning": "à¤\95à¥\83पया à¤¸à¤\82सà¥\8dमरà¥\8dतवà¥\8dयà¤\82 à¤¯à¤¤à¥\8d {{SITENAME}} à¤\87तà¥\8dयà¥\87तदà¥\8d à¤ªà¥\8dरति à¤\95à¥\83तानि à¤¸à¤°à¥\8dवाणि à¤¯à¥\8bà¤\97दानानि $2 à¤\87तà¥\8dयसà¥\8dय à¤ªà¥\8dरतिबà¤\82धाà¤\82तरà¥\8dà¤\97तानि à¤¸à¤¨à¥\8dति (à¤\85धिà¤\95ाय à¤\9cà¥\8dà¤\9eानाय $1 à¤\87तà¥\8dयà¥\87तदà¥\8d à¤ªà¤¶à¥\8dयतà¥\81)।\n\nयदि à¤­à¤µà¤¾à¤¨à¥\8d à¤¸à¥\8dवà¤\95à¥\80यानि à¤²à¤¿à¤\96ितानि à¤ªà¤°à¤¿à¤µà¤°à¥\8dतमनà¥\8dतशà¥\8dà¤\9a, à¤ªà¥\81नà¤\83 à¤µà¤¿à¤¤à¤°à¥\8dयमनà¥\8dतशà¥\8dà¤\9a à¤¨ à¤¦à¥\8dरषà¥\8dà¤\9fà¥\81मिà¤\9aà¥\8dà¤\9bति à¤¤à¤¦à¤¾ à¤®à¤¾ à¤\95à¥\83पया à¤®à¤¾à¤½à¤¤à¥\8dर à¤¯à¥\8bà¤\97दानà¤\82 à¤\95रà¥\8bतà¥\81। <br />\n\nभवानà¥\8d à¤\8fतदपि à¤ªà¥\8dरमाणà¥\80à¤\95रà¥\8bति à¤¯à¤¤à¥\8d à¤\8fतदà¥\8d à¤­à¤µà¤¤à¤¾ à¤¸à¥\8dवतà¤\83 à¤²à¤¿à¤\96ितमसà¥\8dति à¤\85थवा à¤\95सà¥\8dमाà¤\9aà¥\8dà¤\9aतà¥\8d à¤\9cनारà¥\8dपितातà¥\8d à¤µà¤¾ à¤®à¥\81à¤\95à¥\8dतातà¥\8d à¤µà¤¾ à¤¸à¥\8dरà¥\8bतसà¤\83 à¤ªà¥\8dरतिलिपà¥\80à¤\95à¥\83तमसà¥\8dति।\n\n'''पà¥\8dरतिलिपà¥\8dयधिà¤\95ारयà¥\81तानà¥\8d à¤²à¥\87à¤\96ानà¥\8d, à¤\85नà¥\81à¤\9cà¥\8dà¤\9eाà¤\82 à¤µà¤¿à¤¨à¤¾, à¤®à¤¾à¤½à¤¤à¥\8dर à¤ªà¥\8dरददातà¥\81!'''",
-    "copyrightwarning2": "à¤\95à¥\83पया à¤¸à¤\82सà¥\8dमरà¥\8dतवà¥\8dयà¤\82 à¤¯à¤¤à¥\8d {{SITENAME}} à¤\87तà¥\8dयà¥\87तदà¥\8d à¤ªà¥\8dरति à¤\95à¥\83तानि à¤¸à¤°à¥\8dवाणि à¤¯à¥\8bà¤\97दानानि  à¤\87तà¥\8dयसà¥\8dय à¤ªà¥\8dरतिबà¤\82धाà¤\82तरà¥\8dà¤\97तानि à¤¸à¤¨à¥\8dति (à¤\85धिà¤\95ाय à¤\9cà¥\8dà¤\9eानाय $1 à¤\87तà¥\8dयà¥\87तदà¥\8d à¤ªà¤¶à¥\8dयतà¥\81)।\n\nयदि à¤­à¤µà¤¾à¤¨à¥\8d à¤¸à¥\8dवà¤\95à¥\80यानि à¤²à¤¿à¤\96ितानि à¤ªà¤°à¤¿à¤µà¤°à¥\8dतमनà¥\8dतशà¥\8dà¤\9a, à¤ªà¥\81नà¤\83 à¤µà¤¿à¤¤à¤°à¥\8dयमनà¥\8dतशà¥\8dà¤\9a à¤¨ à¤¦à¥\8dरषà¥\8dà¤\9fà¥\81मिà¤\9aà¥\8dà¤\9bति à¤¤à¤¦à¤¾ à¤®à¤¾ à¤\95à¥\83पया à¤®à¤¾à¤½à¤¤à¥\8dर à¤¯à¥\8bà¤\97दानà¤\82 à¤\95रà¥\8bतà¥\81। <br />\n\nभवानà¥\8d à¤\8fतदपि à¤ªà¥\8dरमाणà¥\80à¤\95रà¥\8bति à¤¯à¤¤à¥\8d à¤\8fतदà¥\8d à¤­à¤µà¤¤à¤¾ à¤¸à¥\8dवतà¤\83 à¤²à¤¿à¤\96ितमसà¥\8dति à¤\85थवा à¤\95सà¥\8dमाà¤\9aà¥\8dà¤\9aतà¥\8d à¤\9cनारà¥\8dपितातà¥\8d à¤µà¤¾ à¤®à¥\81à¤\95à¥\8dतातà¥\8d à¤µà¤¾ à¤¸à¥\8dरà¥\8bतसà¤\83 à¤ªà¥\8dरतिलिपà¥\80à¤\95à¥\83तमसà¥\8dति।\n\n'''पà¥\8dरतिलिपà¥\8dयधिà¤\95ारयà¥\81तानà¥\8d à¤²à¥\87à¤\96ानà¥\8d, à¤\85नà¥\81à¤\9cà¥\8dà¤\9eाà¤\82 à¤µà¤¿à¤¨à¤¾, à¤®à¤¾à¤½à¤¤à¥\8dर à¤ªà¥\8dरददातà¥\81!'''",
-    "longpageerror": "रुटिः: भवता प्रदत्तः पाठः {{PLURAL:}} $1 किलोबैटमितः दीर्घः, अतः एषः अधिकतमानुज्ञातात् $2 मितात् दीर्घतरः अस्ति। एषः रक्षितुं न शक्यते।'''",
-    "readonlywarning": "पूर्वसूचना ''' निर्वहणार्थं पाठः पिहितः । अधुना भवान् सम्पादनं रक्षितुं नैव शक्नोति । पाठसञ्चिकायां संश्लेष्य कार्यफलं रक्षतु । एतद्विवरणं प्रतिबन्धकः प्रशासकः विरतरि ।$1",
-    "protectedpagewarning": "'''पूर्वसूचना ''' प्रशासकपदयुक्ताः योजकाः एव सम्पादनं कर्तुमर्हन्ति । अतः एतत्पुटं सुरक्षितम् । निदेशार्थम् अधः जघन्यप्रवेशः सूचितः ।",
-    "semiprotectedpagewarning": "'''सà¥\82à¤\9aना ''' à¤ªà¤\9eà¥\8dà¤\9cà¥\80à¤\95à¥\83तयà¥\8bà¤\9cà¤\95ानाà¤\82  à¤\89पयà¥\8bà¤\97ारà¥\8dथ à¤\95à¥\87वलमà¥\8d à¤\8fततà¥\8dपà¥\81à¤\9fमà¥\8d à¤\85भिरà¤\95à¥\8dषितमà¥\8d à¥¤ à¤\9cà¤\98नà¥\8dयपà¥\8dरवà¥\87शसà¥\8dय à¤¸à¥\82à¤\9aना à¤\86नà¥\81à¤\95à¥\82लà¥\8dयारà¥\8dथमà¥\8d à¤\85धà¥\8bनिदà¥\87शिता à¥¤",
-    "cascadeprotectedwarning": "'''पूर्वसूचना ''' प्रशासकसौकर्ययुक्तानां योजकानाम् सम्पादनार्थम् एतत् पुटम् अभिरक्षितमस्ति । यतः अधोनिदेशितनिर्झरे एतदन्तर्गतम् । {{PLURAL:$1|page|pages}}:",
-    "titleprotectedwarning": "'''पूर्वसूचना  [[Special:ListGroupRights|specific rights]] जनानां सर्जनार्थम् एतत्पुटम् अभिरक्षितम् । '''",
+    "copyrightwarning": "à¤\95à¥\83पया à¤§à¥\8dयानà¤\82 à¤¦à¤¦à¤¾à¤¤à¥\81 à¤¯à¤¤à¥\8d, {{SITENAME}} à¤\87तà¥\8dयतà¥\8dर à¤\95à¥\83तानि à¤¸à¤°à¥\8dवाणि à¤¯à¥\8bà¤\97दानानि $2 à¤\87तà¥\8dयसà¥\8dय à¤¨à¤¿à¤¯à¤¨à¤¾à¤¨à¥\81सारà¤\82 à¤­à¤µà¤¿à¤·à¥\8dयनà¥\8dति à¥¤ (विसà¥\8dतारà¥\87ण à¤\9cà¥\8dà¤\9eातà¥\81à¤\82 $1 à¤\85तà¥\8dर à¤¨à¥\81दतà¥\81)\nभवानà¥\8d/भवतà¥\80 à¤¸à¥\8dवसà¥\8dय à¤¯à¥\8bà¤\97दानà¥\87षà¥\81 à¤ªà¤°à¤¿à¤µà¤°à¥\8dतन-पà¥\81नरà¥\8dनिरà¥\8dदà¥\87शन-à¤\86दिनि à¤ªà¤°à¤¿à¤µà¤°à¥\8dतनानि à¤¦à¥\8dरषà¥\8dà¤\9fà¥\81à¤\82 à¤¨ à¤¶à¤\95à¥\8dनà¥\8bति à¤\9aà¥\87तà¥\8d, à¤\85तà¥\8dर à¤¯à¥\8bà¤\97दानà¤\82 à¤®à¤¾ à¤\95रà¥\8bतà¥\81 à¥¤ (à¤\85तà¥\8dर à¤¤à¥\81 à¤²à¤¿à¤\96ितà¥\87 à¤¨à¤¿à¤°à¤¨à¥\8dतरà¤\82 à¤ªà¤¿à¤°à¤µà¤°à¥\8dतनà¤\82 à¤­à¤µà¤¤à¥\8dयà¥\87व à¤\87ति à¤­à¤¾à¤µà¤\83)\n<br />\n\nà¤\85सà¥\8dमभà¥\8dयà¤\82 à¤­à¤µà¤¤à¤¾/भवतà¥\8dया à¤ªà¥\8dरतिà¤\9cà¥\8dà¤\9eा à¤\95रà¥\8dतवà¥\8dया à¤¯à¤¤à¥\8d, \"à¤\85तà¥\8dर à¤¯à¤¤à¥\8dà¤\95िमपि à¤­à¤µà¤¾à¤¨à¥\8d/भवतà¥\80 à¤²à¥\87à¤\96िषà¥\8dयति, à¤¤à¤¤à¥\8d à¤¸à¤°à¥\8dवà¤\82 à¤¸à¥\8dवरà¤\9aितà¤\82, à¤¸à¤¾à¤°à¥\8dवà¤\9cनà¥\80à¤\95à¤\82 à¤\9a à¤­à¤µà¤¿à¤·à¥\8dयति à¥¤ à¤\95à¥\81तसà¥\8dमातà¥\8d à¤¸à¥\8dथानातà¥\8d à¤ªà¥\8dरतिलिपिà¤\95à¥\83तमà¥\8d à¤\85पि à¤¸à¤¾à¤°à¥\8dवà¤\9cनà¥\80à¤\95मà¥\87व à¤¸à¥\8dयातà¥\8d\" à¤\87ति à¥¤ \n<strong>à¤\85नà¥\8dयसà¥\8dय à¤¸à¤°à¥\8dवाधिà¤\95ारानà¥\8dतरà¥\8dà¤\97तà¤\82 (copyright) à¤¯à¤¤à¥\8d à¤­à¤µà¤¤à¤¿, à¤¤à¤¤à¥\8d à¤µà¤¿à¤¨à¤¾ à¤\85नà¥\81मतà¥\8dया à¤\85तà¥\8dर à¤²à¤¿à¤\96तà¥\81à¤\82 à¤¨ à¤¶à¤\95à¥\8dयतà¥\87 à¥¤</strong>",
+    "copyrightwarning2": "à¤\95à¥\83पया à¤§à¥\8dयानà¤\82 à¤¦à¤¦à¤¾à¤¤à¥\81 à¤¯à¤¤à¥\8d, {{SITENAME}} à¤\87तà¥\8dयतà¥\8dर à¤\95à¥\83तानि à¤¸à¤°à¥\8dवाणि à¤¯à¥\8bà¤\97दानानि à¤\85नà¥\8dययà¥\8bà¤\9cà¤\95à¥\88à¤\83 à¤¸à¤®à¥\8dपादयितà¥\81à¤\82, à¤ªà¤°à¤¿à¤°à¥\8dवतितà¥\81à¤\82, à¤¨à¤¿à¤·à¥\8dà¤\95ाशयितà¥\81à¤\82 à¤\9a à¤¶à¤\95à¥\8dयनà¥\8dतà¥\87 à¥¤ \nभवानà¥\8d/भवतà¥\80 à¤¸à¥\8dवसà¥\8dय à¤¯à¥\8bà¤\97दानà¥\87षà¥\81 à¤ªà¤°à¤¿à¤µà¤°à¥\8dतन-पà¥\81नरà¥\8dनिरà¥\8dदà¥\87शन-à¤\86दिनि à¤ªà¤°à¤¿à¤µà¤°à¥\8dतनानि à¤¦à¥\8dरषà¥\8dà¤\9fà¥\81à¤\82 à¤¨ à¤¶à¤\95à¥\8dनà¥\8bति à¤\9aà¥\87तà¥\8d, à¤\85तà¥\8dर à¤¯à¥\8bà¤\97दानà¤\82 à¤®à¤¾ à¤\95रà¥\8bतà¥\81 à¥¤ (à¤\85तà¥\8dर à¤¤à¥\81 à¤²à¤¿à¤\96ितà¥\87 à¤¨à¤¿à¤°à¤¨à¥\8dतरà¤\82 à¤ªà¤¿à¤°à¤µà¤°à¥\8dतनà¤\82 à¤­à¤µà¤¤à¥\8dयà¥\87व à¤\87ति à¤­à¤¾à¤µà¤\83)\n<br />\n\nà¤\85सà¥\8dमभà¥\8dयà¤\82 à¤­à¤µà¤¤à¤¾/भवतà¥\8dया à¤ªà¥\8dरतिà¤\9cà¥\8dà¤\9eा à¤\95रà¥\8dतवà¥\8dया à¤¯à¤¤à¥\8d, \"à¤\85तà¥\8dर à¤¯à¤¤à¥\8dà¤\95िमपि à¤­à¤µà¤¾à¤¨à¥\8d/भवतà¥\80 à¤²à¥\87à¤\96िषà¥\8dयति, à¤¤à¤¤à¥\8d à¤¸à¤°à¥\8dवà¤\82 à¤¸à¥\8dवरà¤\9aितà¤\82, à¤¸à¤¾à¤°à¥\8dवà¤\9cनà¥\80à¤\95à¤\82 à¤\9a à¤­à¤µà¤¿à¤·à¥\8dयति à¥¤ à¤\95à¥\81तसà¥\8dमातà¥\8d à¤¸à¥\8dथानातà¥\8d à¤ªà¥\8dरतिलिपिà¤\95à¥\83तमà¥\8d à¤\85पि à¤¸à¤¾à¤°à¥\8dवà¤\9cनà¥\80à¤\95मà¥\87व à¤¸à¥\8dयातà¥\8d\" à¤\87ति à¥¤ \n<strong>à¤\85नà¥\8dयसà¥\8dय à¤¸à¤°à¥\8dवाधिà¤\95ारानà¥\8dतरà¥\8dà¤\97तà¤\82 (copyright) à¤¯à¤¤à¥\8d à¤­à¤µà¤¤à¤¿, à¤¤à¤¤à¥\8d à¤µà¤¿à¤¨à¤¾ à¤\85नà¥\81मतà¥\8dया à¤\85तà¥\8dर à¤²à¤¿à¤\96तà¥\81à¤\82 à¤¨ à¤¶à¤\95à¥\8dयतà¥\87 à¥¤</strong>",
+    "longpageerror": "<strong>दोषः : भवता/भवत्या लिखितः पाठः  {{PLURAL:$1|सहाष्टकं|$1 सहाष्टकानि}} दीर्घः अस्ति । एषः पाठः बृह्त्तमसीमया अपेक्षया {{PLURAL:$2|सहाष्टकं|$2 सहाष्टकानि}} दीर्घः अस्ति ।(सहस्राष्टकानि (kilobytes) इत्यस्य सङ्क्षेपः सहाष्टकम्)</strong>\nएतत् रक्षितुं न शक्यते ।",
+    "readonlywarning": "<strong>पूर्वसूचना : दत्तांशः (database) किलितः अस्ति । अतः अधुना भवान्/भवती स्वस्य सम्पादनं रक्षितुं न शक्नोति ।</strong>\nस्वस्य परिवर्तितस्य लेखस्य .txt .doc वा सञ्चिकां निर्माय किञ्चित् कालानन्तरं रक्षतु । \nदत्तांश-किलनस्य कारणं प्रबन्धकेन दत्तं यत्, : $1",
+    "protectedpagewarning": "'''पूर्वसूचना : पृष्ठमेतत् संरक्षितं वर्तते । अतः केवलं प्रबन्धकाः अत्र सम्पादनं कर्तुं शक्नुवन्ति ।'''\n\nसद्यःकालीना संरक्षितावलिः (log) अधः दत्ता अस्ति :",
+    "semiprotectedpagewarning": "'''पà¥\82रà¥\8dवसà¥\82à¤\9aना : à¤ªà¥\83षà¥\8dठमà¥\87ततà¥\8d à¤¸à¤\82रà¤\95à¥\8dषितà¤\82 à¤µà¤°à¥\8dततà¥\87 à¥¤ à¤\85तà¤\83 à¤\95à¥\87वलà¤\82 à¤ªà¤\9eà¥\8dà¤\9cिà¤\95à¥\83तयà¥\8bà¤\9cà¤\95ाà¤\83 à¤\85तà¥\8dर à¤¸à¤®à¥\8dपादनà¤\82 à¤\95रà¥\8dतà¥\81à¤\82 à¤¶à¤\95à¥\8dनà¥\81वनà¥\8dति à¥¤'''\n\nसदà¥\8dयà¤\83à¤\95ालà¥\80ना à¤¸à¤\82रà¤\95à¥\8dषितावलिà¤\83 (log) à¤\85धà¤\83 à¤¦à¤¤à¥\8dता à¤\85सà¥\8dति :",
+    "cascadeprotectedwarning": "'''पूर्वसूचना :''' पृष्ठमेतत् संरक्षितं वर्तते । अतः केवलं प्रबन्धकाः अत्र सम्पादनं कर्तुं शक्नुवन्ति ।\nनिम्ननियमान्तर्गतम् एतत्{{PLURAL:$1|पृष्ठं रक्षितं|पृष्ठानि रक्षितानि}}:",
+    "titleprotectedwarning": "'''पूर्वसूचना : एतत् पृष्ठं संरक्षितम् अस्ति । अतः अस्य सम्पादनं कर्तुं [[Special:ListGroupRights|विशेषाधिकारः]] अपेक्ष्यते ।'''\nसद्यःकालीना संरक्षितावलिः (log) अधः दत्ता अस्ति :",
     "templatesused": "अस्मिन् पृष्ठे प्रयुक्त{{PLURAL:$1|फलकम्|फलकानि}}:",
-    "templatesusedpreview": "अस्मिन् प्राग्दृश्ये प्रयुक्ताः {{PLURAL:$1|बिंबधराः |बिंबधराः}}:",
-    "templatesusedsection": "{{PLURAL:$1|Template|Templates}} अस्मिन् विभागे उपयुक्तम् ।",
+    "templatesusedpreview": "अस्मिन् प्राग्दृश्ये प्रयुक्त{{PLURAL:$1|फलकम्|फलकानि}}:",
+    "templatesusedsection": "अस्मिन् विभागे प्रयुक्त{{PLURAL:$1|फलकम्|फलकानि}}:",
     "template-protected": "(संरक्षितम्)",
     "template-semiprotected": "अर्धसंरक्षितम्",
     "hiddencategories": "इदं पृष्ठं {{PLURAL:$1|1 निगूढे वर्गे |$1 निगूढेषु वर्गेषु}} अन्तर्भवति :",
-    "nocreatetext": "{{SITENAME}} à¤¨à¥\82तनपà¥\81à¤\9fनिरà¥\8dमाणसà¥\8dय à¤\95à¥\8dषमता à¤¨à¤¿à¤¯à¤¤à¤¾ à¥¤ à¤µà¤°à¥\8dतमानापà¥\81à¤\9fानाà¤\82 à¤¸à¤®à¥\8dपादनारà¥\8dथà¤\82 à¤¨à¤¿à¤°à¥\8dà¤\97à¤\9aà¥\8dà¤\9bतà¥\81 à¥¤ à¤\85थवा [[Special:UserLogin|log in or create an account]].",
-    "nocreate-loggedin": "नà¥\82तनपà¥\81à¤\9fनिरà¥\8dमारà¥\8dथम् अनुमतिः नास्ति ।",
-    "sectioneditnotsupported-title": "विभाà¤\97समà¥\8dपादनà¤\82 à¤¨ à¤ªà¥\8bषितमà¥\8d à¥¤",
-    "sectioneditnotsupported-text": "à¤\85सà¥\8dमिनà¥\8d à¤ªà¥\81à¤\9fà¥\87 à¤µà¤¿à¤­à¤¾à¤\97समà¥\8dपादनणà¥\8d à¤¨ à¤ªà¥\8bषितमà¥\8d ।",
-    "permissionserrors": "à¤\85नà¥\81à¤\9cà¥\8dà¤\9eा-विभà¥\8dरमाः",
-    "permissionserrorstext": "भवानà¥\8d à¤¤à¤¤à¥\8d à¤\95रà¥\8dतà¥\81à¤\82 à¤\85नà¥\81à¤\9cà¥\8dà¤\9eाà¤\82 à¤¨ à¤§à¤¾à¤°à¤¯à¤¤à¤¿ {{PLURAL:$1|à¤\85धà¥\8bऽà¤\99à¥\8dà¤\95ितातà¥\8d à¤\95ारणातà¥\8d |à¤\85धà¥\8bऽà¤\99à¥\8dà¤\95ितà¥\87भà¥\8dयà¤\83 à¤\95ारणà¥\87भà¥\8dयà¤\83:}}",
+    "nocreatetext": "{{SITENAME}} à¤\9cालसà¥\8dथानà¥\87ऽसà¥\8dमिनà¥\8d à¤¨à¤µà¥\80नपà¥\83षà¥\8dठनिरà¥\8dमातà¥\81मà¥\8d à¤\85नà¥\81मतिà¤\83 à¤¨ à¤µà¤¿à¤¦à¥\8dयतà¥\87 à¥¤\nभवानà¥\8d/भवतà¥\80 à¤ªà¥\8dरतिà¤\97तà¥\8dवा à¤µà¤¿à¤¦à¥\8dयमानà¤\82 à¤ªà¥\83षà¥\8dठà¤\82 à¤¸à¤®à¥\8dपादयतà¥\81 à¤¶à¤\95à¥\8dनà¥\8bति à¥¤  à¤¸à¤®à¥\8dपादयितà¥\81à¤\82 [[Special:UserLogin|पà¥\8dरविशà¥\8dयतामà¥\8d à¤¸à¤¦à¤¸à¥\8dयता à¤ªà¥\8dरापà¥\8dयतामà¥\8d à¤µà¤¾]].",
+    "nocreate-loggedin": "भवतà¤\83/भवतà¥\8dयाà¤\83 à¤ªà¤¾à¤°à¥\8dशà¥\8dवà¥\87 à¤¨à¤µà¥\80नपà¥\83षà¥\8dठà¤\82 à¤°à¤\9aितà¥\81म् अनुमतिः नास्ति ।",
+    "sectioneditnotsupported-title": "विभाà¤\97सà¥\8dय à¤¸à¤®à¥\8dपादनà¤\82 à¤¶à¤\95à¥\8dयà¤\82 à¤¨à¤¾à¤¸à¥\8dति",
+    "sectioneditnotsupported-text": "पà¥\83षà¥\8dठà¥\87ऽसà¥\8dमिनà¥\8d à¤µà¤¿à¤­à¤¾à¤\97समà¥\8dपादनà¤\82 à¤¶à¤\95à¥\8dयà¤\82 à¤¨à¤¾à¤¸à¥\8dति ।",
+    "permissionserrors": "à¤\85नà¥\81मतिदà¥\8bषः",
+    "permissionserrorstext": "à¤\8fततà¥\8d à¤\95रà¥\8dतà¥\81à¤\82 à¤­à¤µà¤¤à¤\83/भवतà¥\8dयाà¤\83 à¤ªà¤¾à¤°à¥\8dशà¥\8dवà¥\87 à¤\85नà¥\81मति à¤¨à¤¾à¤¸à¥\8dति, à¤¨à¤¿à¤®à¥\8dन{{PLURAL:$1|à¤\95ारणमà¥\8d|à¤\95ारणानि}}:",
     "permissionserrorstext-withaction": "$1 निम्नकारणत्वात्  $2 सम्पादनस्य अनुमतिः नास्ति ।\n{{PLURAL:$1|कारणम्|कारणानि}}:",
-    "recreate-moveddeleted-warn": "'''पूर्वसूचना: पूर्वम् अपाकृतं पृष्टं भवता रच्यमानम् अस्ति ।'''\nअस्य पृष्ठस्य सम्पादनं करणात् प्राक् गभीरतया चिन्तनं करोतु ।\nअस्य पृष्ठस्य निर्माणं न्यायसङ्गतम् इति भवतः/भवत्याः मतमस्ति चेत् अत्र परिवर्तनं करोतु । सौकर्यार्थं पृष्ठ-अपाकरणस्य प्राक्तनसम्पादनस्य आवलिः अत्र वर्तते ।",
+    "recreate-moveddeleted-warn": "'''पूर्वसूचना: पूर्वम् अपाकृतं पृष्टं भवता रच्यमानम् अस्ति ।'''\nअस्य पृष्ठस्य सम्पादनं करणात् प्राक् गभीरतया चिन्तनं करोतु ।\nअस्य पृष्ठस्य निर्माणं न्यायसङ्गतम् इति भवतः/भवत्याः मतमस्ति चेत्, अत्र परिवर्तनं करोतु । सौकर्यार्थं पृष्ठ-अपाकरणस्य प्राक्तनसम्पादनस्य आवलिः अत्र दीयते ।",
     "moveddeleted-notice": "इदं पृष्ठम् अपाकृतम् अस्ति।\nअस्य अपाकरणस्य, स्थानान्तरणस्य च विवरणम् अधः प्रदत्तम् ।",
-    "log-fulllog": "पूर्ण प्रवर्तनरेख पश्यतु",
-    "edit-hook-aborted": "पाशेन (हुक् इत्यनेन) सम्पादनं परित्यक्तम्।\nअनेन न किमपि कारणं प्रदत्तम्।",
-    "edit-gone-missing": "पà¥\83षà¥\8dठà¤\82 à¤ªà¤°à¤¿à¤µà¤°à¥\8dतितà¥\81à¤\82 à¤¨à¤¾à¤ªà¤¾à¤°à¤¯à¤¤à¥\8d।\nपà¥\8dरतà¥\80यतà¥\87 à¤¯à¤¦à¤¿à¤¦à¤\82 à¤\85पाà¤\95à¥\83तमसà¥\8dति।",
-    "edit-conflict": "सम्पादनयोः/सम्पादनानां अन्तर्विरोधः।",
-    "edit-no-change": "भवतà¤\83 à¤¸à¤®à¥\8dपादनमà¥\8d à¤\89पà¥\87à¤\95à¥\8dषितमà¥\8d, à¤¯à¤¤à¥\8b à¤¹à¤¿ à¤­à¤µà¤¤à¤¾ à¤ªà¤¾à¤ à¥\87 à¤¨ à¤\95िमपि à¤ªà¤°à¤¿à¤µà¤°à¥\8dतनà¤\82 à¤\95à¥\83तमà¥\8d।",
+    "log-fulllog": "पूर्णसंरक्षितावलिं दृश्यताम्",
+    "edit-hook-aborted": "hook द्वारा सम्पादनक्रिया मध्ये एव स्थगिता । स्थगनस्य कारणं न दत्तम् ।",
+    "edit-gone-missing": "à¤\85सà¥\8dमिनà¥\8d à¤ªà¥\83षà¥\8dठà¥\87 à¤ªà¤°à¤¿à¤µà¤°à¥\8dतनà¤\82 à¤¨à¤¾à¤­à¥\82तà¥\8d à¥¤\nà¤\8fततà¥\8d à¤ªà¥\83षà¥\8dठà¤\82 à¤ªà¥\81रा à¤\8fव à¤\95à¥\87नापि à¤\85पाà¤\95à¥\83तमà¥\8d à¤\87ति à¤­à¤¾à¤¤à¤¿ ।",
+    "edit-conflict": "सम्पादनयोः अन्तर्विरोधः ।",
+    "edit-no-change": "भवता/भवतà¥\8dया à¤\95à¥\83तà¤\82 à¤¸à¤®à¥\8dपादमà¥\8d à¤\85वà¤\97णितमà¥\8d à¥¤ à¤\95ारणà¤\82 à¤²à¥\87à¤\96à¥\87 à¤¨ à¤\95िमपि à¤ªà¤°à¤¿à¤µà¤°à¥\8dतनà¤\82 à¤\9cातमसà¥\8dति ।",
     "postedit-confirmation": "सम्पादनं रक्षितम् ।",
-    "edit-already-exists": "नूतनं पृष्ठं स्रष्टुं नापारयत्।\nइदं पूर्वे एव विद्यते।",
-    "defaultmessagetext": "सन्देशपाठं स्थिरयतु ।",
-    "invalid-content-data": "अमान्यः सामग्रीदत्तांशः",
-    "content-not-allowed-here": "[[$2]] इति पृष्ठे \"$1\" सामग्री अनुमता नास्ति।",
-    "editwarning-warning": "अस्मात् पृष्ठात् गमनेन अत्र भवता कृतानि परिवर्तनानि निष्फलानि भवेयुः ।\nभवता यदि प्रविष्टं तर्हि मम इष्टतमानि इत्यत्र अस्मिन् विभागे सम्पादनेन एषः प्रबोधः यथा न आगच्छेत् तथा कर्तुं शक्यते ।",
+    "edit-already-exists": "नूतनपृष्ठस्य निर्माणं नाभूत् ।\nपूर्वस्मादेव एतत् पृष्ठं विद्यते ।",
+    "defaultmessagetext": "मूलसन्देशः",
+    "content-failed-to-parse": "$1 कृते $2 इत्यस्य विभाजनं विफलम् अभवत् । दोषः : $3",
+    "invalid-content-data": "अयोग्यः लेखः",
+    "content-not-allowed-here": "[[$2]] पृष्ठे \"$1\" सामग्री अनुमता नास्ति",
+    "editwarning-warning": "एतत् पृष्ठं त्यक्तवा यदि गमिष्यति, तर्हि भवता/भवत्या कृतस्य सम्पादनस्य रक्षणं न भविष्यति ।\n\nभवता/भवत्या यदि प्रवेशः प्राप्तः अस्ति, तर्हि एषा सूचना अत्र \"{{int:prefs-editing}}\" निगूढितुं शक्यते ।",
+    "editpage-notsupportedcontentformat-title": "लेखस्य प्रारूपम् अयोग्यम्",
+    "editpage-notsupportedcontentformat-text": "लेखस्य सामग्र्याः $1 इति प्रारूपं $2 सामग्री-उदाहरणानुगुणं नास्ति ।",
     "content-model-wikitext": "विकिपाठः",
     "content-model-text": "शुद्धपाठः",
     "content-model-javascript": "जावालिपिः",
     "content-model-css": "सी-एस्-एस्",
-    "expensive-parserfunction-warning": "'''प्रबोधः :''' अस्मिन् पृष्ठे प्रभूतानि जटिलानि पार्सर्-फ़ंक्शन्-आह्वानानि सन्ति।\nअत्र $2 संख्यातः  {{PLURAL:$2|न्यूनं आह्वानं|न्यूनानि आह्वानानि}} भवितव्यानि, सद्यः तत्र {{PLURAL:$1 $1 आह्वानं विद्यते|$1 आह्वानानि विद्यन्ते}}।",
-    "expensive-parserfunction-category": "पà¥\8dरभà¥\82तà¥\87भà¥\8dयà¤\83 à¤\9cà¤\9fिलà¥\87भà¥\8dयà¤\83 à¤ªà¤¾à¤°à¥\8dसरà¥\8d-फà¤\82à¤\95à¥\8dशनà¥\8d-à¤\86हà¥\8dवानà¥\87भà¥\8dयà¤\83 à¤¯à¥\81à¤\95à¥\8dतानि à¤ªà¥\83षà¥\8dठाणि।",
+    "expensive-parserfunction-warning": "<strong>पूर्वसूचना :</strong> अस्मिन् पृष्ठे बहवः विभाजिताः नियोजिताः (functions) विद्यन्ते ।\n\nअत्र न्यूनातिन्यूनं $2 {{PLURAL:$2|आह्वानं|आह्वानानि}} शक्यते । तत्र {{PLURAL:$1|अधुना $1 आह्वाहनं|अधिना $1 आह्वाहनानि}}",
+    "expensive-parserfunction-category": "à¤\85सà¥\8dमिनà¥\8d à¤ªà¥\83षà¥\8dठà¥\87 à¤¬à¤¹à¤µà¤\83 à¤µà¤¿à¤­à¤¾à¤\9cिताà¤\83 à¤¨à¤¿à¤¯à¥\8bà¤\9cिताà¤\83 (functions) à¤µà¤¿à¤¦à¥\8dयनà¥\8dतà¥\87 ।",
     "post-expand-template-inclusion-warning": "'''पूर्वसूचना:''' फलकस्य आकारः बृहत् वर्तते । कानिचन फलकानि नान्तर्भविष्यन्ति ।",
     "post-expand-template-inclusion-category": "सूचनाफलकस्य अपेक्षया पृष्ठं बृहत् वर्तते ।",
     "post-expand-template-argument-warning": "'''पूर्वसूचना''' अस्मिन् पृष्ठे स्थितस्य फलकस्य एकः विकल्पः बहु बृहत् वर्तते । तस्य विकल्पस्य अंशाः अपाकृताः ।",
     "post-expand-template-argument-category": "येषु पृष्ठेषु फलके स्थिताः विकल्पाः न पूरिताः तेषां पृष्ठानाम् आवलिः",
-    "parser-template-loop-warning": "बिमà¥\8dबधर-पाशà¤\83 à¤ªà¥\8dरापà¥\8dतà¤\83: [[$1]]",
-    "parser-template-recursion-depth-warning": "बिमà¥\8dबधर-पà¥\81नरावरà¥\8dतनारà¥\8dथà¤\82 à¤\97हनतायाà¤\83 à¤¸à¥\80मा à¤\85तिà¤\95à¥\8dरानà¥\8dताऽसà¥\8dति ($1)",
-    "language-converter-depth-warning": "भाषा-परिवरà¥\8dतà¤\95सà¥\8dय à¤\97हनतायाà¤\83 à¤¸à¥\80मा à¤\85तिà¤\95à¥\8dरानà¥\8dताऽसà¥\8dति (*$1)",
-    "node-count-exceeded-category": "सनà¥\8dधिà¤\97णनमà¥\8d à¤\85तिà¤\95à¥\8dरानà¥\8dतपà¥\81à¤\9fानि à¥¤",
-    "node-count-exceeded-warning": "सनà¥\8dधिà¤\97णनà¥\87न à¤¤à¤¿à¤\95à¥\8dरानà¥\8dतपà¥\81à¤\9fमà¥\8d à¥¤",
-    "expansion-depth-exceeded-category": "पà¥\81à¤\9fविसà¥\8dतारसà¥\8dय à¤\97ाहà¤\83 à¤\85तिà¤\95à¥\8dरानà¥\8dतà¤\83 à¥¤",
-    "expansion-depth-exceeded-warning": "विसà¥\8dतारà¤\97ाहातिà¤\95à¥\8dरानà¥\8dतपà¥\81à¤\9fमà¥\8d à¥¤",
-    "parser-unstrip-loop-warning": "अपट्टरन्धः दृष्टः ।",
-    "parser-unstrip-recursion-limit": "अपट्टपुनरवतरणमितिः अतिक्रान्ता ।$1",
+    "parser-template-loop-warning": "फलà¤\95सà¥\8dय à¤ªà¤°à¤¿à¤\95à¥\8dरमà¤\83 (loop) à¤ªà¥\8dरापà¥\8dतà¤\83 : [[$1]]",
+    "parser-template-recursion-depth-warning": "फलà¤\95-पà¥\8dरतà¥\8dयावरà¥\8dतनसà¥\8dय (recursion) à¤¸à¥\80मा à¤¸à¤®à¤¾à¤ªà¥\8dता ($1)",
+    "language-converter-depth-warning": "भाषा-परिवरà¥\8dतà¤\95सà¥\8dय à¤¸à¥\80मा à¤¸à¤®à¤¾à¤ªà¥\8dता ($1)",
+    "node-count-exceeded-category": "यà¥\87षà¥\81 à¤¸à¤¨à¥\8dधà¥\87à¤\83 (node) à¤¸à¥\80मा à¤¸à¤®à¤¾à¤ªà¥\8dता, à¤¤à¥\87षाà¤\82 à¤ªà¥\83षà¥\8dठानामà¥\8d à¤\86वलिà¤\83",
+    "node-count-exceeded-warning": "पà¥\83षà¥\8dठà¥\87ऽसà¥\8dमिनà¥\8d à¤¸à¤¨à¥\8dधà¥\87à¤\83 (node) à¤¸à¥\80मा à¤¸à¤®à¤¾à¤ªà¥\8dता",
+    "expansion-depth-exceeded-category": "यà¥\87षà¥\81 à¤µà¤¿à¤¸à¥\8dतारसà¥\80मा à¤¸à¤®à¤¾à¤ªà¥\8dता, à¤¤à¥\87षाà¤\82 à¤ªà¥\83षà¥\8dठानामà¥\8d à¤\86वलिà¤\83",
+    "expansion-depth-exceeded-warning": "पà¥\83षà¥\8dठà¥\87ऽसà¥\8dमिनà¥\8d à¤µà¤¿à¤¸à¥\8dतारसà¥\80मा à¤¸à¤®à¤¾à¤ªà¥\8dता",
+    "parser-unstrip-loop-warning": "Unstrap परिक्रमः (loop) प्राप्तः",
+    "parser-unstrip-recursion-limit": "Unstrip इत्यस्य प्रत्यावर्तनस्य (recursion) सीमा समाप्ता ($1)",
     "converter-manual-rule-error": "मानवीये भाषापरिवर्तने दोषः दृष्टः ।",
-    "undo-success": "सम्पादनमिदं विपरीतीकर्तुं शक्यते।\nकृपया अधस्तात् तुलनां दृष्ट्वा निश्चितीकरोतु यत् भवान् एवमेव कर्तुमिच्छति। तदा भवान् विपरीतीकर्तुं निम्नांकितानि परिवर्तनानि रक्षतु।",
-    "undo-failure": "सम्पादनम् अकर्तुं न पारयत् यस्मात् मध्ये परस्परविरोधीनि सम्पादनानि अभवन्।",
-    "undo-norev": "इदं सम्पादनं अकर्तुं न पारयत् यस्मात् एतत् न विद्यते अथवा अपाकृतस्ति।",
-    "undo-summary": " [[Special:Contributions/$2|$2]] ([[User talk:$2|talk]]) इत्यनेन कृताम् $1 इति आवृत्तिम् अकरोतु",
-    "cantcreateaccounttitle": "लेखा स्रष्टुं न शक्यते",
-    "cantcreateaccount-text": "('''$1''') इति आइपिसंकेतात् लेखासृजनम् [[User:$3|$3]] इत्यनेन अवरुद्धीकृतः अस्ति।\nएतदर्थं $3 इत्यनेन प्रदत्तं कारणम्''$2'' इत्यस्ति।",
+    "undo-success": "एतत् सम्पादनं पूर्ववत् कर्तुं शक्यते ।\nकृपया अधः दत्तयोः तुलनां कृत्वा यत् आवश्यकं, तत् संरक्षतु । ततः पूर्ववत्-करणप्रक्रिया समाप्तं भविष्यति ।",
+    "undo-failure": "सम्पादनं पूर्ववत् कर्तुं न शक्यते । कारणं मध्ये परस्परविपरितानि सम्पादनानि अभवन् ।",
+    "undo-norev": "सम्पादनमिदं पूर्ववत् कर्तुं न शक्यते । कारणं सम्पादनम् पूर्वमेव अपाकृतं अथवा न विद्यते ।",
+    "undo-nochange": "पूर्वमेव एतत् सम्पादनं पूर्ववत् कृतं स्यात् ।",
+    "undo-summary": "[[Special:Contributions/$2|$2]] ([[User talk:$2|talk]]) द्वारा कृता  $1 पूर्ववत्-प्रक्रिया निरस्तीक्रियताम् ।",
+    "undo-summary-username-hidden": "निगूढितयोजकद्वारा कृता  $1 पूर्ववत्-प्रक्रिया निरस्तीक्रियताम् ।",
+    "cantcreateaccounttitle": "सदस्यता प्राप्तुं न शक्यते",
+    "cantcreateaccount-text": "(<strong>$1</strong>) इत्यस्य संविदः (IP) कृते सदस्यता प्राप्तुं न शक्यते । कारणं [[User:$3|$3]] द्वारा सा संवित्सङ्ख्या प्रतिबन्धिता अस्ति । \n\n$3 इत्यनेन कारणं दत्तं यत्, <em>$2</em>",
+    "cantcreateaccount-range-text": "सदस्यताप्राप्तेः सीमा-आक्रान्तासु '''$1''' अन्तर्जालसंवित्सु (IP) भवतः/भवत्याः अन्तर्जालसंवद् ('''$4''') अन्तर्भवति । अतः [[User:$3|$3]] द्वारा भवतः/भवत्याः अन्तर्जालसंविद् प्रतिबन्धिता ।\n\n$3 इत्यनेन कारणं दत्तं यत्, ''$2''",
     "viewpagelogs": "अस्य पृष्ठस्य संरक्षितावलिः (logs) दृश्यताम्",
-    "nohistory": "à¤\85सà¥\8dय à¤ªà¥\83षà¥\8dठसà¥\8dय à¤\95à¥\83तà¥\87 à¤ªà¥\83षà¥\8dठà¥\87तिहासà¤\83 à¤¨ à¤µà¤°à¥\8dततà¥\87।",
-    "currentrev": "सदà¥\8dयà¤\83à¤\95ालà¥\80ना आवृत्तिः",
+    "nohistory": "à¤\85सà¥\8dय à¤ªà¥\83षà¥\8dठसà¥\8dय à¤\87तिहासà¤\83 à¤¨ à¤µà¤°à¥\8dततà¥\87 ।",
+    "currentrev": "नà¥\82तनतमा आवृत्तिः",
     "currentrev-asof": "$1 समयस्य संस्करणम्",
     "revisionasof": "$1 इत्यस्य संस्करणं",
     "revision-info": "$1 पर्यन्तं $2 द्वारा जातानां परिवर्तनानाम् आवलिः",
     "last": "पूर्वतनम्",
     "page_first": "प्रथमम्",
     "page_last": "अन्तिमम्",
-    "histlegend": "भेदस्य चयनम्: आवृत्तिभेदस्य दर्शनाय अग्रे प्रदत्ता रेडियोमञ्जूषा नुद्यताम्, एण्टर्-कुड्मलं नुद्यताम्, अधः दत्तं कुड्मलं वा नुद्यताम् । <br />\nनूतनसंस्करणम् = नूतनासु आवृत्तिषु भेदः, \n(पूर्वतनम्) = पूर्वतनासु आवृत्तिषु भेदः, (लघु) = लघु सम्पादनम्",
-    "history-fieldset-title": "अन्वेषणस्य (browse) इतिहासः",
+    "histlegend": "भेदस्य चयनम् : आवृत्तिभेदस्य दर्शनाय अग्रे प्रदत्ता रेडियो-मञ्जूषा नुद्यताम्, एण्टर्-कुड्मलं नुद्यताम्, अधः दत्तं कुड्मलं वा नुद्यताम् । <br />\nनूतनसंस्करणम् = नूतनासु आवृत्तिषु भेदः, \n(पूर्वतनम्) = पूर्वतनासु आवृत्तिषु भेदः, (लघु) = लघु सम्पादनम्",
+    "history-fieldset-title": "अन्वेषणस्य इतिहासः",
     "history-show-deleted": "केवलम् अपाकृतम्",
     "histfirst": "पुरातनतमम्",
     "histlast": "नूतनतमम्",
-    "historysize": "({{PLURAL:$1|1 à¤¬à¥\88à¤\9fमà¥\8d|$1 à¤¬à¥\88à¤\9fानि}})",
+    "historysize": "({{PLURAL:$1|1 à¤\85षà¥\8dà¤\9fà¤\95à¤\82|$1 à¤\85षà¥\8dà¤\9fà¤\95ानि}})",
     "historyempty": "(रिक्तम्)",
-    "history-feed-title": "à¤\86वरà¥\8dतनà¥\87तिहासà¤\83",
-    "history-feed-description": "विà¤\95à¥\8dयामà¥\8d à¤\85सà¥\8dय à¤ªà¥\83षà¥\8dठसà¥\8dय à¤\86वरà¥\8dतनेतिहासः",
+    "history-feed-title": "सà¤\82सà¥\8dà¤\95रणसà¥\8dय à¤\87तिहासà¤\83",
+    "history-feed-description": "à¤\85सà¥\8dमिनà¥\8d à¤µà¤¿à¤\95ि-à¤\9cालसà¥\8dथानà¥\87 à¤¤à¤¸à¥\8dमà¥\88 à¤ªà¥\83षà¥\8dठाय à¤¸à¤\82सà¥\8dà¤\95रणेतिहासः",
     "history-feed-item-nocomment": "$1 द्वारा $3 दिनाङ्के $4 समये",
-    "history-feed-empty": "याà¤\9aितà¤\82 à¤ªà¥\83षà¥\8dठà¤\82 à¤¨ à¤µà¤¿à¤¦à¥\8dयतà¥\87।\nà¤\87दà¤\82 à¤µà¤¿à¤\95ितà¤\83 à¤\85पाà¤\95à¥\83तमà¥\8d à¤\85थवा à¤ªà¥\81नरà¥\8dनामितà¤\82 à¤¸à¥\8dयातà¥\8d।\nसमà¥\8dबनà¥\8dधितानि à¤¨à¥\82तनानि à¤ªà¥\83षà¥\8dठाणि à¤¸à¤®à¥\8dपà¥\8dरापà¥\8dतà¥\81à¤\82 [[Special:Search|विà¤\95à¥\8dयामà¥\8d à¤\85नà¥\8dवà¥\87षणà¤\82]] à¤\95रà¥\8bतà¥\81।",
-    "rev-deleted-comment": "(समà¥\8dपादनसà¥\8dय à¤¸à¤¾à¤°à¤\83 à¤\85पाà¤\95à¥\83तमसà¥\8dति)",
+    "history-feed-empty": "à¤\8fततà¥\8d à¤ªà¥\83षà¥\8dठà¤\82 à¤¨ à¤µà¤¿à¤¦à¥\8dयतà¥\87 à¥¤ \nà¤\8fतसà¥\8dय à¤ªà¥\83षà¥\8dठसà¥\8dय à¤¨à¤¾à¤®à¤ªà¤°à¤¿à¤µà¤°à¥\8dतनमà¥\8d, à¤\85पाà¤\95रणà¤\82 à¤\9a à¤\95à¥\83तà¤\82 à¤¸à¥\8dयातà¥\8d à¥¤ \n à¤\85नà¥\87न à¤¸à¤®à¥\8dबदà¥\8dधानि à¤ªà¥\83षà¥\8dठानि [[Special:Search|विà¤\95ि-à¤\9cालसà¥\8dथानà¥\87 à¤\85नà¥\8dविषà¥\8dयतामà¥\8d]] ।",
+    "rev-deleted-comment": "(समà¥\8dपादनसà¥\8dय à¤¸à¤¾à¤°à¤\83 à¤\85पाà¤\95à¥\83तà¤\83)",
     "rev-deleted-user": "(प्रयोक्तृनाम अपाकृतमस्ति)",
-    "rev-deleted-event": "(à¤\85भिलà¥\87à¤\96न-à¤\95à¥\8dरिया à¤\85पाà¤\95à¥\83ताऽसà¥\8dति)",
-    "rev-deleted-user-contribs": "[पà¥\8dरयà¥\8bà¤\95à¥\8dतà¥\83नाम à¤\85थवा à¤\86à¤\87पà¥\80सà¤\82à¤\95à¥\87तà¤\83 à¤\85पाà¤\95à¥\83तà¤\83 - à¤¸à¤®à¥\8dपादनà¤\82 à¤¯à¥\8bà¤\97दानà¥\87भà¥\8dयà¤\83 à¤¨à¤¿à¤\97à¥\82ढमसà¥\8dति]",
-    "rev-deleted-text-permission": "à¤\85सà¥\8dय à¤ªà¥\81à¤\9fसà¥\8dय à¤ªà¥\81नरवतरणमà¥\8d à¤\85पमारà¥\8dà¤\9cितमà¥\8d à¥¤ à¤µà¤¿à¤µà¤°à¤£à¤®à¥\8d à¤\85तà¥\8dर à¤ªà¥\8dरापà¥\8dयतà¥\87  à¥¤ [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log].",
-    "rev-deleted-text-unhide": "à¤\85सà¥\8dय à¤ªà¥\81à¤\9fसà¥\8dय à¤ªà¥\81नरवतरणमà¥\8d à¤\85पमारà¥\8dà¤\9cितमà¥\8d à¥¤ à¤µà¤¿à¤µà¤°à¤£à¤®à¥\8d à¤\85तà¥\8dर à¤ªà¥\8dरापà¥\8dयतà¥\87 à¥¤ [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log].\nYou can still [$1 view this revision]",
-    "rev-suppressed-text-unhide": "à¤\85सà¥\8dय à¤ªà¥\81à¤\9fसà¥\8dय à¤ªà¥\81नरवतरणà¤\82 ''' à¤¨à¤¿à¤·à¤¿à¤¦à¥\8dधमà¥\8d ''' à¤¯à¤¦à¤¿ à¤\85नà¥\81वरà¥\8dतनमिà¤\9aà¥\8dà¤\9bति à¤¤à¤°à¥\8dहि à¤µà¤¿à¤µà¤°à¤£à¤®à¥\8d à¤\85तà¥\8dर à¤ªà¥\8dरापà¥\8dयतà¥\87 à¥¤ [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} suppression log].\nYou can still [$1 view this revision]",
-    "rev-deleted-text-view": "à¤\8fतसà¥\8dमातà¥\8d à¤\85नà¥\8dतरतà¤\83 à¤\95िà¤\9eà¥\8dà¤\9aिदवतरणà¤\82 à¤ªà¤°à¤¿à¤®à¤¾à¤°à¥\8dà¤\9cितमà¥\8d à¥¤ à¤\8fतदनà¥\8dतरà¤\82 à¤¦à¥\83षà¥\8dà¤\9fà¥\81à¤\82 à¤¶à¤\95à¥\8dनà¥\81वनà¥\8dति à¥¤ à¤µà¤¿à¤µà¤°à¤£à¤®à¥\8d [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} à¤¹à¤\9fानà¥\87 à¤\95à¥\80 à¤²à¥\89à¤\97]",
-    "rev-suppressed-text-view": "à¤\85सà¥\8dमिनà¥\8dननà¥\8dतरà¥\87 à¤\95िà¤\9eà¥\8dà¤\9aिदवतरणà¤\82 à¤¸à¤\99à¥\8dà¤\97à¥\81पतमà¥\8d à¥¤ à¤¤à¤¦à¤¨à¥\8dतरमà¥\8d à¤\85तà¥\8dर à¤¦à¥\83षà¥\8dà¤\9fà¥\81à¤\82 à¤¶à¤\95à¥\8dनà¥\81वनà¥\8dति à¥¤ [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} suppression log].",
-    "rev-deleted-no-diff": "à¤\8fततà¥\8d à¤¦à¥\83षà¥\8dà¤\9fà¥\81à¤\82 à¤¨à¥\88व à¤¶à¤\95à¥\8dयतà¥\87 à¤¯à¤¤à¤\83 à¤ªà¥\81नरावरà¥\8dतनà¤\82 à¤ªà¤°à¤¿à¤®à¤¾à¤°à¥\8dà¤\9cितमà¥\8d à¥¤ à¤µà¤¿à¤µà¤°à¤£à¤®à¥\8d à¤\85तà¥\8dर à¤ªà¥\8dरापà¥\8dयतà¥\87 à¥¤ [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log].",
-    "rev-suppressed-no-diff": "à¤\8fतदनà¥\8dतरà¤\82 à¤¦à¥\83षà¥\8dà¤\9fà¥\81à¤\82 à¤¨à¥\88व à¤¶à¤\95à¥\8dयतà¥\87 à¤¯à¤¤à¤\83 à¤\85तà¥\8dर à¤\95िà¤\9eà¥\8dà¤\9aिदवतरणà¤\82 à¤ªà¤°à¤¿à¤®à¤¾à¤°à¥\8dà¤\9cितमà¥\8d ।",
-    "rev-deleted-unhide-diff": "à¤\85सà¥\8dय à¤ªà¥\81à¤\9fसà¥\8dय à¤ªà¥\81नरवतरणमà¥\8d à¤\85पमारà¥\8dà¤\9cितमà¥\8d à¥¤ à¤µà¤¿à¤µà¤°à¤£à¤®à¥\8d à¤\85तà¥\8dर à¤ªà¥\8dरापà¥\8dयतà¥\87 à¥¤ [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log].\nYou can still [$1 view this revision]",
-    "rev-suppressed-unhide-diff": "à¤\85सà¥\8dय à¤ªà¥\81à¤\9fसà¥\8dय à¤ªà¥\81नरवतरणà¤\82 ''' à¤¨à¤¿à¤·à¤¿à¤¦à¥\8dधमà¥\8d ''' à¤¯à¤¦à¤¿ à¤\85नà¥\81वरà¥\8dतनमिà¤\9aà¥\8dà¤\9bति à¤¤à¤°à¥\8dहि à¤µà¤¿à¤µà¤°à¤£à¤®à¥\8d à¤\85तà¥\8dर à¤ªà¥\8dरापà¥\8dयतà¥\87 à¥¤ [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} suppression log].\nYou can still [$1 view this revision]",
-    "rev-deleted-diff-view": "à¤\8fतसà¥\8dमातà¥\8d à¤\85नà¥\8dतरतà¤\83 à¤\95िà¤\9eà¥\8dà¤\9aिदवतरणà¤\82 à¤ªà¤°à¤¿à¤®à¤¾à¤°à¥\8dà¤\9cितमà¥\8d à¥¤ à¤\8fतदनà¥\8dतरà¤\82 à¤¦à¥\83षà¥\8dà¤\9fà¥\81à¤\82 à¤¶à¤\95à¥\8dनà¥\81वनà¥\8dति à¥¤ à¤µà¤¿à¤µà¤°à¤£à¤®à¥\8d [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} à¤¹à¤\9fानà¥\87 à¤\95à¥\80 à¤²à¥\89à¤\97]",
-    "rev-suppressed-diff-view": "à¤\85सà¥\8dमिनà¥\8dननà¥\8dतरà¥\87 à¤\95िà¤\9eà¥\8dà¤\9aिदवतरणà¤\82 à¤¸à¤\99à¥\8dà¤\97à¥\81पतमà¥\8d à¥¤ à¤¤à¤¦à¤¨à¥\8dतरमà¥\8d à¤\85तà¥\8dर à¤¦à¥\83षà¥\8dà¤\9fà¥\81à¤\82 à¤¶à¤\95à¥\8dनà¥\81वनà¥\8dति à¥¤ [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} suppression log].",
+    "rev-deleted-event": "(सà¤\82रà¤\95à¥\8dषिताऽऽवलà¥\8dयà¤\83(log) à¤\85पाà¤\95à¥\83ताà¤\83)",
+    "rev-deleted-user-contribs": "[पà¥\8dरयà¥\8bà¤\95à¥\8dतà¥\83नाम à¤\85नà¥\8dतरà¥\8dà¤\9cालसà¤\82विदà¥\8d à¤µà¤¾ à¤\85पाà¤\95à¥\83तमà¥\8d - à¤¯à¥\8bà¤\97दानाऽऽवलà¥\8dयामà¥\8d à¤\8fतानि à¤ªà¤°à¤¿à¤µà¤°à¥\8dतनानि à¤¨à¤¿à¤\97à¥\82ढितानि à¤¸à¤¨à¥\8dति à¥¤]",
+    "rev-deleted-text-permission": "à¤\8fतसà¥\8dय à¤ªà¥\83षà¥\8dठसà¥\8dय à¤¸à¤\82सà¥\8dà¤\95रणमà¥\8d <strong>à¤\85पाà¤\95à¥\83तमसà¥\8dति</strong> à¥¤\nविसà¥\8dतà¥\83तà¤\82 à¤\9cà¥\8dà¤\9eानमà¥\8d à¤\85तà¥\8dर à¤ªà¥\8dरापà¥\8dतà¥\81à¤\82 à¤¶à¤\95à¥\8dनà¥\8bति... [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log].",
+    "rev-deleted-text-unhide": "à¤\8fतसà¥\8dय à¤ªà¥\83षà¥\8dठसà¥\8dय à¤¸à¤\82सà¥\8dà¤\95रणमà¥\8d <strong>à¤\85पाà¤\95à¥\83तमसà¥\8dति</strong> à¥¤\nविसà¥\8dतà¥\83तà¤\82 à¤\9cà¥\8dà¤\9eानमà¥\8d à¤\85तà¥\8dर à¤ªà¥\8dरापà¥\8dतà¥\81à¤\82 à¤¶à¤\95à¥\8dनà¥\8bति... [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log]. \n\nयदि à¤\87à¤\9aà¥\8dà¤\9bति, à¤¤à¤°à¥\8dहि à¤\85तà¥\8dरापि [$1 view this revision] à¤¦à¥\8dरषà¥\8dà¤\9fà¥\81à¤\82 à¤¶à¤\95à¥\8dनà¥\8bति à¥¤",
+    "rev-suppressed-text-unhide": "à¤\8fतसà¥\8dय à¤ªà¥\83षà¥\8dठसà¥\8dय à¤¸à¤\82सà¥\8dà¤\95रणमà¥\8d <strong>निषिदà¥\8dधमसà¥\8dति</strong> à¥¤\nविसà¥\8dतà¥\83तà¤\82 à¤\9cà¥\8dà¤\9eानमà¥\8d à¤\85तà¥\8dर à¤ªà¥\8dरापà¥\8dतà¥\81à¤\82 à¤¶à¤\95à¥\8dनà¥\8bति... [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log]. \n\nयदि à¤\87à¤\9aà¥\8dà¤\9bति, à¤¤à¤°à¥\8dहि à¤\85तà¥\8dरापि [$1 view this revision] à¤¦à¥\8dरषà¥\8dà¤\9fà¥\81à¤\82 à¤¶à¤\95à¥\8dनà¥\8bति à¥¤",
+    "rev-deleted-text-view": "à¤\8fतसà¥\8dय à¤ªà¥\83षà¥\8dठसà¥\8dय à¤¸à¤\82सà¥\8dà¤\95रणमà¥\8d <strong>à¤\85पाà¤\95à¥\83तमसà¥\8dति</strong> à¥¤\nविसà¥\8dतà¥\83तà¤\82 à¤\9cà¥\8dà¤\9eानमà¥\8d à¤\85तà¥\8dर à¤ªà¥\8dरापà¥\8dतà¥\81à¤\82 à¤¶à¤\95à¥\8dनà¥\8bति... [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log].",
+    "rev-suppressed-text-view": "à¤\8fतसà¥\8dय à¤ªà¥\83षà¥\8dठसà¥\8dय à¤¸à¤\82सà¥\8dà¤\95रणमà¥\8d <strong>निषिदà¥\8dधमसà¥\8dति</strong> à¥¤\nविसà¥\8dतà¥\83तà¤\82 à¤\9cà¥\8dà¤\9eानमà¥\8d à¤\85तà¥\8dर à¤ªà¥\8dरापà¥\8dतà¥\81à¤\82 à¤¶à¤\95à¥\8dनà¥\8bति... [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log].",
+    "rev-deleted-no-diff": "भवानà¥\8d/भवतà¥\80 à¤¸à¤\82सà¥\8dà¤\95रणसà¥\8dय à¤­à¥\87दà¤\82 à¤¦à¥\8dरषà¥\8dà¤\9fà¥\81à¤\82 à¤¨ à¤¶à¤\95à¥\8dनà¥\8bति à¥¤ à¤\95ारणमà¥\8d à¤\8fतसà¥\8dय à¤\95िमपि à¤¸à¤\82सà¥\8dà¤\95रणà¤\82 <strong>à¤\85पाà¤\95à¥\83तमसà¥\8dति</strong> à¥¤\nविसà¥\8dतà¥\83तà¤\82 à¤\9cà¥\8dà¤\9eानमà¥\8d à¤\85तà¥\8dर à¤ªà¥\8dरापà¥\8dतà¥\81à¤\82 à¤¶à¤\95à¥\8dनà¥\8bति... [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log].",
+    "rev-suppressed-no-diff": "भवानà¥\8d/भवतà¥\80 à¤¸à¤\82सà¥\8dà¤\95रणसà¥\8dय à¤­à¥\87दà¤\82 à¤¦à¥\8dरषà¥\8dà¤\9fà¥\81à¤\82 à¤¨ à¤¶à¤\95à¥\8dनà¥\8bति à¥¤ à¤\95ारणमà¥\8d à¤\8fतसà¥\8dय à¤\95िमपि à¤¸à¤\82सà¥\8dà¤\95रणà¤\82 <strong>à¤\85पाà¤\95à¥\83तमसà¥\8dति</strong> ।",
+    "rev-deleted-unhide-diff": "भवानà¥\8d/भवतà¥\80 à¤¸à¤\82सà¥\8dà¤\95रणसà¥\8dय à¤­à¥\87दà¤\82 à¤¦à¥\8dरषà¥\8dà¤\9fà¥\81à¤\82 à¤¨ à¤¶à¤\95à¥\8dनà¥\8bति à¥¤ à¤\95ारणमà¥\8d à¤\8fतसà¥\8dय à¤\95िमपि à¤¸à¤\82सà¥\8dà¤\95रणà¤\82 <strong>à¤\85पाà¤\95à¥\83तमसà¥\8dति</strong> à¥¤\n\nयदि à¤\87à¤\9aà¥\8dà¤\9bति, à¤¤à¤°à¥\8dहि à¤\85तà¥\8dरापि [$1 view this revision] à¤¦à¥\8dरषà¥\8dà¤\9fà¥\81à¤\82 à¤¶à¤\95à¥\8dनà¥\8bति à¥¤",
+    "rev-suppressed-unhide-diff": "भवानà¥\8d/भवतà¥\80 à¤¸à¤\82सà¥\8dà¤\95रणसà¥\8dय à¤­à¥\87दà¤\82 à¤¦à¥\8dरषà¥\8dà¤\9fà¥\81à¤\82 à¤¨ à¤¶à¤\95à¥\8dनà¥\8bति à¥¤ à¤\95ारणमà¥\8d à¤\8fतसà¥\8dय à¤\95िमपि à¤¸à¤\82सà¥\8dà¤\95रणà¤\82 <strong>निषिदà¥\8dधमसà¥\8dति</strong> à¥¤\nविसà¥\8dतà¥\83तà¤\82 à¤\9cà¥\8dà¤\9eानमà¥\8d à¤\85तà¥\8dर à¤ªà¥\8dरापà¥\8dतà¥\81à¤\82 à¤¶à¤\95à¥\8dनà¥\8bति... [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log]. \n\nयदि à¤\87à¤\9aà¥\8dà¤\9bति, à¤¤à¤°à¥\8dहि à¤\85तà¥\8dरापि [$1 view this revision] à¤¦à¥\8dरषà¥\8dà¤\9fà¥\81à¤\82 à¤¶à¤\95à¥\8dनà¥\8bति à¥¤",
+    "rev-deleted-diff-view": "भवानà¥\8d/भवतà¥\80 à¤¸à¤\82सà¥\8dà¤\95रणसà¥\8dय à¤­à¥\87दà¤\82 à¤¦à¥\8dरषà¥\8dà¤\9fà¥\81à¤\82 à¤¨ à¤¶à¤\95à¥\8dनà¥\8bति à¥¤ à¤\95ारणमà¥\8d à¤\8fतसà¥\8dय à¤\95िमपि à¤¸à¤\82सà¥\8dà¤\95रणà¤\82 <strong>निषिदà¥\8dधमसà¥\8dति</strong> à¥¤\nविसà¥\8dतà¥\83तà¤\82 à¤\9cà¥\8dà¤\9eानमà¥\8d à¤\85तà¥\8dर à¤ªà¥\8dरापà¥\8dतà¥\81à¤\82 à¤¶à¤\95à¥\8dनà¥\8bति... [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log].",
+    "rev-suppressed-diff-view": "भवानà¥\8d/भवतà¥\80 à¤¸à¤\82सà¥\8dà¤\95रणसà¥\8dय à¤­à¥\87दà¤\82 à¤¦à¥\8dरषà¥\8dà¤\9fà¥\81à¤\82 à¤¨ à¤¶à¤\95à¥\8dनà¥\8bति à¥¤ à¤\95ारणमà¥\8d à¤\8fतसà¥\8dय à¤\95िमपि à¤¸à¤\82सà¥\8dà¤\95रणà¤\82 <strong>निषिदà¥\8dधमसà¥\8dति</strong> à¥¤\nविसà¥\8dतà¥\83तà¤\82 à¤\9cà¥\8dà¤\9eानमà¥\8d à¤\85तà¥\8dर à¤ªà¥\8dरापà¥\8dतà¥\81à¤\82 à¤¶à¤\95à¥\8dनà¥\8bति... [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log].",
     "rev-delundel": "दृश्यताम्/गोप्यताम्",
     "rev-showdeleted": "दर्श्यताम्",
-    "revisiondelete": "à¤\85वतरणà¤\82 à¤ªà¤°à¤¿à¤®à¤¾à¤°à¥\8dà¤\9cयतà¥\81/पà¥\81नस्थापयतु",
-    "revdelete-nooldid-title": "लà¤\95à¥\8dषà¥\8dयरà¥\82पा à¤\86वà¥\83तà¥\8dतिà¤\83 à¤\85मानà¥\8dयाऽसà¥\8dति।",
-    "revdelete-nooldid-text": "एतत्कार्यं कर्तुं भवतः अवतरणं न दत्तम् । अथवा भवता दत्तावतरणस्य अस्तित्वं नास्ति । अथवा सद्यः अवतरणस्य सङ्गोपनं कुर्वन् अस्ति ।",
+    "revisiondelete": "सà¤\82सà¥\8dà¤\95रणानि à¤¨à¤¿à¤·à¥\8dà¤\95ासयतà¥\81/पà¥\81नसà¥\8dस्थापयतु",
+    "revdelete-nooldid-title": "à¤\85यà¥\8bà¤\97à¥\8dयलà¤\95à¥\8dषà¥\8dयसà¥\8dय à¤¸à¤\82शà¥\8bधनमà¥\8d",
+    "revdelete-nooldid-text": "एतत् कार्यं कर्तुं भवता/भवत्या लक्ष्य न निर्धारितम् एतत् संस्करणं न भवेत् वा । भवान्/भवती एतत् संस्करणं निगूढितुम् प्रयतति इत्यपि शक्यम् ।",
     "revdelete-no-file": "निर्दिष्टा सञ्चिका न विद्यते ।",
-    "revdelete-show-file-confirm": "$2 à¤¤à¤\83 $3 à¤®à¤§à¥\8dयà¥\87 \"<nowiki>$1</nowiki>\" à¤\87ति à¤¸à¤\9eà¥\8dà¤\9aिà¤\95ायाà¤\83 à¤¨à¤¿à¤°à¤¸à¥\8dतà¤\82 à¤ªà¤°à¤¿à¤·à¥\8dà¤\95रणà¤\82 à¤­à¤µà¤¾à¤¨à¥\8d à¤¨à¥\82नà¤\82 à¤¦à¥\8dरषà¥\8dà¤\9fà¥\81मà¥\8d à¤\87à¤\9aà¥\8dà¤\9bति ?",
+    "revdelete-show-file-confirm": "$2 à¤¦à¤¿à¤¨à¤¾à¤\99à¥\8dà¤\95सà¥\8dय  $3 à¤¸à¤®à¤¯à¤ªà¤°à¥\8dयनà¥\8dतसà¥\8dय  \"<nowiki>$1</nowiki>\" à¤\87तà¥\8dयसà¥\8dयाà¤\83 à¤\85पाà¤\95à¥\83तसà¤\9eà¥\8dà¤\9aिà¤\95ायाà¤\83 à¤¸à¤\82सà¥\8dà¤\95रणाऽऽवलिà¤\82 à¤­à¤µà¤¾à¤¨à¥\8d/भवतà¥\80 à¤¨à¤¿à¤¶à¥\8dà¤\9aयà¥\87न à¤¦à¥\8dरषà¥\8dà¤\9fà¥\81मà¥\8d à¤\88पà¥\8dसति ?",
     "revdelete-show-file-submit": "आम्",
-    "logdelete-selected": "{{PLURAL:$1|Selected log event|Selected log events}}:",
-    "revdelete-confirm": "भवान् एतत् कार्यं करोति इति दढयतु । भवान् अस्य परिणामं जानाति । [[{{MediaWiki:Policy-url}}|the policy]] भवान् एतदनुसारं करोति ।",
-    "revdelete-suppress-text": "अधोनिदेशितपरिस्थितिषु केवलं निग्रहः कार्यः । \n* अवमाननीयाः विषयाः ।\n* अप्रधानाः वैयक्तिकविषयाः\n* गृहसङ्केतः, दूरवाणीसङ्ख्या, सामाजिकसुरक्षासङ्ख्या, इत्यादयः ।",
-    "revdelete-legend": "दृश्यप्रतिबन्धं निश्चिनोतु ।",
-    "revdelete-hide-text": "अवतरणस्य पाठं गोपयतु ।",
-    "revdelete-hide-image": "सञ्चिकाधेयं गोपयतु ।",
-    "revdelete-hide-name": "प्रक्रियां लक्ष्यं च गोपयतु ।",
-    "revdelete-hide-comment": "सम्पादनसारं गोपयतु ।",
-    "revdelete-hide-user": "सम्पादकस्य योजकनाम/आइपिसंकेतः गोप्यताम्।",
-    "revdelete-hide-restricted": "प्रबन्धकेभ्यः अन्येभ्यश्च समंकं गोपयतु।",
-    "revdelete-radio-same": "मा परिवर्तयतु।",
-    "revdelete-radio-set": "आम्",
-    "revdelete-radio-unset": "न हि",
-    "revdelete-suppress": "प्रबन्धकेभ्यः अन्येभ्यश्च समंकं गोपयतु।",
-    "revdelete-unsuppress": "प्रत्यानीताऽऽवृत्तिभ्यः  वर्जनाः अपाकरोतु।",
+    "revdelete-selected-text": "[[:$2]] इत्यस्य {{PLURAL:$1|चित-परिवर्तनं|चित-परिवर्तनानि}} :",
+    "revdelete-selected-file": "[[:$2]] इत्यस्य {{PLURAL:$1|चित-सञ्चिका|चित-सञ्चिकाः}} :",
+    "logdelete-selected": "[[:$2]] इत्यस्य {{PLURAL:$1|चित-संरक्षिताऽऽवलेः घटना|संरक्षिताऽऽवलेः घटनाः}} :",
+    "revdelete-text-text": "पृष्ठस्य इतिहासे अधुनापि अपाकृतानि संस्करणानि द्रष्टुं शक्यन्ते । परन्तु सामान्ययोजकेभ्यः तत्र परिवर्तनम् अशक्यम् ।",
+    "revdelete-text-file": "सञ्चिकायाः इतिहासे अधुनापि अपाकृतानां सञ्चिकानां संस्करणानि द्रष्टुं शक्यन्ते । परन्तु सामान्ययोजकेभ्यः तत्र परिवर्तनम् अशक्यम् ।",
+    "logdelete-text": "संरक्षिताऽऽवलीनां(log) संस्करणानि संरक्षिताऽऽवल्यां द्रष्टुं शक्यन्ते । परन्तु सामान्ययोजकेभ्यः तत्र परिवर्तनम् अशक्यम् ।",
+    "revdelete-confirm": "एतस्याः [[{{MediaWiki:Policy-url}}|नीतेः]] अन्तर्गतं भवता/भवत्या एतत् कार्यं गभीरतया क्रियमाणम् अस्ति इत्यस्य पुष्टतां करोतु ।",
+    "revdelete-suppress-text": "<strong>केवलं</strong> निम्नकारणेभ्यः निषेधः योग्यः....\n१ भयोत्पादकमाहिती स्यात्\n२ वैयक्तिकमाहिती स्यात्\n३ <em>गृहसङ्केतः, दूरभाषसङ्केतः, राष्ट्रियपरिचयपत्रस्य अङ्कः इत्यादीनि माहितयः स्युः ।</em>",
+    "revdelete-legend": "दृश्यप्रतिबन्धं निश्चितं करोतु",
+    "revdelete-hide-text": "संस्करणस्थं लेखनं (text)",
+    "revdelete-hide-image": "सञ्चिकाधेयं गोप्यताम्",
+    "revdelete-hide-name": "प्रक्रियां, लक्ष्यं च गोप्यताम्",
+    "revdelete-hide-comment": "सम्पादनसारं गोप्यताम्",
+    "revdelete-hide-user": "योजकस्य प्रयोकतृनाम/अन्तर्जालसंविद् (IP)",
+    "revdelete-hide-restricted": "प्रबन्धकेभ्यः, अन्येभ्यश्च माहिती गोप्यताम्",
+    "revdelete-radio-same": "(मा परिवर्त्यताम्)",
+    "revdelete-radio-set": "निगूढितम्",
+    "revdelete-radio-unset": "प्रत्यक्षम्",
+    "revdelete-suppress": "प्रबन्धकेभ्यः, अन्येभ्यश्च माहिती गोप्यताम्",
+    "revdelete-unsuppress": "पुनस्स्थापितसंस्करणानां प्रतिबन्धः अपाक्रियताम्",
     "revdelete-log": "कारणम् :",
-    "revdelete-submit": "{{PLURAL:$1|चितायां आवृत्त्यां|चितासु आवृत्तिषु}} अनुप्रयोजयतु।",
-    "revdelete-success": "अवतरणदृश्यता साफल्येन उन्नतीकृता ।",
-    "revdelete-failure": "अवतरणदृश्यता उन्नतीकरणं न शक्यते ।$1",
-    "logdelete-success": "नामाङ्कनदृश्यता साफल्येन योजिता ।",
-    "logdelete-failure": "नामाभिलेखदृश्यता सपला नाभवत् । $1",
+    "revdelete-submit": "{{PLURAL:$1|चित-संस्करणे|चित-संस्करणेषु}} प्रयोगं क्रियताम्",
+    "revdelete-success": "<strong>संस्करणस्य दृश्यता साफल्येन अद्यतनकृता </strong>",
+    "revdelete-failure": "<strong>संस्करणस्य दृश्यता अद्यतना नाभवत् </strong> $1",
+    "logdelete-success": "<strong>संरक्षिताऽऽवल्याः दृश्यता योग्यतया परिवर्तिता ।</strong>",
+    "logdelete-failure": "<strong>संरक्षिताऽऽवल्याः दृश्यता न परिवर्तिता ।</strong> $1",
     "revdel-restore": "दृश्यता परिवर्त्यताम्",
     "pagehist": "पृष्ठस्य इतिहासः",
-    "deletedhist": "परिमारà¥\8dà¤\9cितà¥\87तिहासà¤\83 à¥¤",
-    "revdelete-hide-current": "$2 $1 दिनाङ्कितस्य गोपने दोषः । एतत् प्रकृतावतरणम्, एतत् न गोपनीयम् ।",
-    "revdelete-show-no-access": "$2, $1: दिनाङ्कितस्य दर्शने दोषः । एतत् पञ्जीकृतमिति अङ्कितम् । एतत् प्राप्तुं नैव शक्नोति ।",
-    "revdelete-modify-no-access": " $2, $1 दिनाङ्कितं परिवर्तने दोषः । एतत् निर्बन्धितमिति अङ्कितम् । एतत् प्राप्तुं नैव शक्नोति ।",
-    "revdelete-modify-missing": "$1 दिनाङ्कितं परिवर्तने दोषः । मूलपाठात् विहीनम् एतत् ।",
-    "revdelete-no-change": "'''पूर्वसूचना ''' $2, $1 दिनाङ्किताः पूर्वमेव दृश्यतासंयोजनम् आभ्यर्थिताः ।",
-    "revdelete-concurrent-change": "$2, $1: दिनाङ्कितदेषपरिमार्जनानि । अस्य स्तरः केनचित् परिवर्तितं यत् भवता परिवर्तितुं प्रयत्नः कृतः । प्रवेशं परिशीलयतु ।",
-    "revdelete-only-restricted": "$2, $1: दिनाङ्कितस्य गोपने दोषाः। अन्यदृश्यविकल्पानां चयनेन विना एतत् निग्रहितुं नैव शक्नोति ।",
-    "revdelete-reason-dropdown": "*परित्यागाय समानकारणाः\n** प्रतिलिपिअधिकारअतिक्रम\n** अयोग्यवैयक्तिकविज्ञप्ति",
-    "revdelete-otherreason": "à¤\85नà¥\8dयतà¥\8d/सà¤\99à¥\8dà¤\95लितं कारणम् :",
+    "deletedhist": "à¤\85पाà¤\95à¥\83तà¤\83 à¤\87तिहासà¤\83",
+    "revdelete-hide-current": "$2 दिनाङ्कस्य $1 समये कस्यापि वस्तोः निगूढनं कार्यं न सफलीभीतम् । एतत् सद्यःकालीन संस्करणमस्ति । एतत् निगूढितुं शक्यते ।",
+    "revdelete-show-no-access": "$2 दिनाङ्कस्य $1 समयस्य वस्तुनि दोषः दृष्टः । तत् वस्तुः निषिद्धावल्याम् अस्ति । भवान्/भवती तस्य परिवर्तनं कर्तुं न शक्नोति ।",
+    "revdelete-modify-no-access": "$2 दिनाङ्कस्य $1 समयस्य परिवर्तितवस्तुनि दोषः दृष्टः । तत् वस्तुः निषिद्धावल्याम् अस्ति । भवान्/भवती तस्य परिवर्तनं कर्तुं न शक्नोति ।",
+    "revdelete-modify-missing": " ID $1 इत्यस्य परिवर्तने दोषः : एतत् दत्तांशे न प्राप्तम् !",
+    "revdelete-no-change": "'''पूर्वसूचना :''' $2, $1 इत्यस्मिन् याचितवस्तूनि पूर्वस्मादेव विद्यन्ते ।",
+    "revdelete-concurrent-change": "$2, $1:",
+    "revdelete-only-restricted": "$2, $1: दिनाङ्कितस्य गोपने दोषाः। अन्यदृश्यविकल्पानां चयनेन विना एतत् निग्रहितुं नैव शक्नोति",
+    "revdelete-reason-dropdown": "* अपाकरणस्य सामान्यकारणानि\n** प्रतिकृत्यधिकारस्य उल्लङ्घनम्\n** अयोग्या टिप्पणी वैयक्तिकमाहिती वा\n** अयोग्यं सभ्यनाम\n** हानिकारकमाहिती",
+    "revdelete-otherreason": "à¤\85परà¤\82/à¤\85तिरिà¤\95à¥\8dतं कारणम् :",
     "revdelete-reasonotherlist": "अन्यानि कारणानि",
     "revdelete-edit-reasonlist": "सम्पादनस्य अपाकरणाय कारणानि",
-    "revdelete-offender": "à¤\85वतरणà¤\95रà¥\8dता à¥¤",
+    "revdelete-offender": "सà¤\82सà¥\8dà¤\95रणà¤\95रà¥\8dता",
     "suppressionlog": "निग्रहनामाभिलेखः ।",
     "suppressionlogtext": "अधोनिदेशितप्रशासकैः सङ्गुप्तस्य विभागस्य निष्कासितपुटानां सूची ।\nनिषिद्धपिहितपुटानि  [[Special:BlockList|block list]] पश्यतु ।",
     "mergehistory": "संलीनपुटेतिहासाः ।",
     "prefs-skin": "त्वक्",
     "skin-preview": "प्राग्दृश्यम्",
     "datedefault": "वरीयांसि नास्ति",
-    "prefs-beta": "आवर्णलक्षणानि ।",
-    "prefs-datetime": "दिनाङ्कः, समयः च",
     "prefs-labs": "प्रयोगशालालक्षणानि ।",
     "prefs-user-pages": "योजकपुटानि ।",
-    "prefs-personal": "यà¥\8bà¤\9cà¤\95à¤\83 à¤µà¥\8dयà¤\95à¥\8dतिरेखा",
-    "prefs-rc": "सद्योजातानि परिवर्तनानि",
-    "prefs-watchlist": "दà¥\83षà¥\8dà¤\9fि सूची",
+    "prefs-personal": "यà¥\8bà¤\9cà¤\95सà¥\8dय à¤°à¥\82परेखा",
+    "prefs-rc": "सद्यो जातानि परिवर्तनानि",
+    "prefs-watchlist": "निरà¥\80à¤\95à¥\8dषासूची",
     "prefs-watchlist-days": "दृष्टि सूची दर्शनार्थे  दिवसानि",
     "prefs-watchlist-days-max": "अधिकतमानि $1 {{PLURAL:$1|दिनानि}}",
     "prefs-watchlist-edits": "विस्तृतावलोकनावल्यां प्रदर्शयितुम् अत्यधिकपरिवर्तनानि ।",
     "prefs-changeemail": "विद्युन्मानपत्रसङ्केतं परिवर्तयतु ।",
     "prefs-setemail": "विद्युन्मानपत्रसङ्केतं योजयतु ।",
     "prefs-email": "इमेल वैकल्पिकाः",
-    "prefs-rendering": "सà¥\8dवरà¥\81पà¤\83",
+    "prefs-rendering": "सà¥\8dवरà¥\82पमà¥\8d",
     "saveprefs": "संरक्ष्यताम्",
     "restoreprefs": "समग्राः व्यवस्थादय व्यवस्थानुसारं पुनः संरक्ष्यताम्",
     "prefs-editing": "सम्पादनम्",
     "prefs-help-email": "ई-पत्रसङ्केतः अनिवार्यः नास्ति । किन्तु कूटशब्दः विस्मर्यते चेत् तस्य परिवर्तनाय आवश्यकः भवति ।",
     "prefs-help-email-others": "योजकपृष्ठ-सम्भाषणपृष्ठयोः माध्यमेन,  ई-पत्रमाध्यमेन वा अन्ये योजकाः भवतः/भवत्याः सम्पर्कं कर्तुं शक्नुयुः ।\nसम्पर्केऽस्मिन् भवतः/भवत्याः ई-पत्रसङ्केतम् अन्ययोजकाः ज्ञातुं न प्रभवतन्ति ।",
     "prefs-help-email-required": "विद्युन्मानपत्रसङ्केतः आवश्यकः ।",
-    "prefs-info": "मूलसूचनाः ।",
+    "prefs-info": "मूलसूचनाः",
     "prefs-i18n": "अन्ताराष्ट्रिकरणम् ।",
     "prefs-signature": "हस्ताक्षर",
     "prefs-dateformat": "दिनाङ्कस्य प्रारूपः",
     "recentchanges-label-minor": "इदं लघु सम्पादनम्",
     "recentchanges-label-bot": "बोट्-द्वारा कृतं सम्पादनमेतत्",
     "recentchanges-label-unpatrolled": "एतावता अस्य सम्पादनस्य परिशीलिनं नाभूत् ।",
+    "recentchanges-legend-heading": "'''विकल्पविषयकम्'''",
     "rcnotefrom": "<strong>$2</strong> तः आरभ्य (<strong>$1</strong> पर्यन्तं) जातानि परिवर्तनानि अधः प्रदर्शितानि ।",
     "rclistfrom": "$1 पश्चात् जातानि नूतनानि परिवर्तनानि दृश्यन्ताम्",
     "rcshowhideminor": "$1 लघुसम्पादनानि",
+    "rcshowhideminor-show": "दर्श्यताम्",
+    "rcshowhideminor-hide": "गोप्यताम्",
     "rcshowhidebots": "$1 बोट् इत्येतानि",
     "rcshowhideliu": "$1 पञ्जीकृताः योजकाः",
     "rcshowhideanons": "अनामकाः योजकाः $1",
     "upload-permitted": "अनुमतसञ्चिकाभेदाः $1.",
     "upload-preferred": "अनुमतसञ्चिकाभेदाः $1.",
     "upload-prohibited": "अनुमतसञ्चिकाभेदाः $1.",
-    "uploadlog": "उत्तरणस्य सूची ।",
     "uploadlogpage": "उपारोहिताऽऽवलिः (Upload log)",
     "uploadlogpagetext": "अधः सद्यः काले उत्तारितसञ्चिकानाम् आवली अस्ति ।\nअधिकदृश्यविवरणार्थम् एतत् पश्यतु [[Special:NewFiles|gallery of new files]]",
     "filename": "सञ्चिकानाम",
     "filereuploadsummary": "सञ्चिकापरिवर्तनानि ।",
     "filestatus": "प्रतिकृत्यधिकारस्य स्थितिः ।",
     "filesource": "मूल:",
-    "uploadedfiles": "आरोपिताः सञ्चिकाः",
     "ignorewarning": "पूर्वसूचनां निर्लक्ष्य सञ्चिकाः कथञ्चित् संरक्षतु ।",
     "ignorewarnings": "पूर्वसूचनाः निर्लक्षतु ।",
     "minlength1": "सञ्चिकानाम न्यूनतिन्यूनम् एकाक्षरं भवेत् ।",
     "overwroteimage": "\"[[$1]]\" इत्यस्य नूतनावतरणम् उत्तारयतु ।",
     "uploaddisabled": "सक्रियम् उत्तारयतु ।",
     "copyuploaddisabled": "निष्क्रियतः यु.आर्.एल् तः उत्तारयतु  ।",
-    "uploadfromurl-queued": "ते उत्तारणम् अनुपङ्कौ अस्ति ।",
     "uploaddisabledtext": "उत्तारितसञ्चिकाः निष्क्रियाः ।",
     "php-uploaddisabledtext": "PHP मध्ये उत्तारितसञ्चिकाः निष्क्रियाः ।",
     "uploadscripted": "HTMLयुक्ताः अथवा लिपिसङ्केतयुक्ताः सञ्चिकाः जालदर्शिकया बाधिताः ।",
     "upload-misc-error": "अज्ञातः उत्तारणदोषः ।",
     "upload-misc-error-text": "उत्तारणावसरे कश्चन अज्ञातदोषः उपगतः । \nURL मान्यम् अभिगम्यं वेति परिशील्य पुनः यतताम् ।[[Special:ListUsers/sysop|administrator]]",
     "upload-too-many-redirects": "URL अधिकपुनर्निदेशान् अन्तर्गतम् ।",
-    "upload-unknown-size": "अज्ञात आकार",
     "upload-http-error": "कश्चन HTTP दोषः उपगतः $1",
     "upload-copy-upload-invalid-domain": "अस्मिन् कोशे प्रतिकृत्युत्तारणम् उपलब्धं नास्ति ।",
     "backend-fail-stream": "सञ्चिका क्रमगता न $1.",
     "img-auth-streaming": "\"$1\"इत्यस्य प्रवाहिनी ।",
     "img-auth-public": "स्वायत्तविकितः सञ्चिकाः नेतुम् अयं कार्यक्रमः img_auth.php उपयुज्यते ।\nएषा विकिः सार्वजनिकविकिः इति  दृढिता । \nवैकल्पिकसुरक्षार्थं img_auth.php अपलपितः । ।",
     "img-auth-noread": "\"$1\"पठने योजकस्य अभिगमनं नास्ति ।",
-    "img-auth-bad-query-string": " URL मध्ये अमान्यं प्रश्नतन्तुः अस्ति ।",
     "http-invalid-url": " $1 इति अमान्यम् URL ।",
     "http-invalid-scheme": "\"$1\"योजनायुक्तं URLs नानुमोदितानि ।",
     "http-request-error": " अज्ञातदोषात् HTTP अभ्यर्थनं निष्पलम् ।",
     "filehist-dimensions": "आयामाः",
     "filehist-filesize": "सञ्चिकाकारः ।",
     "filehist-comment": "टिप्पणी",
-    "filehist-missing": "सञ्चिका विनष्टा ।",
     "imagelinks": "सञ्चिकायाः उपयोगः",
     "linkstoimage": "{{PLURAL:$1|अधो निर्दिष्टपृष्ठस्य परिसन्धयः संलग्नाः सन्ति|$1 अधो निर्दिष्टपृष्ठानां परिसन्धिः संलग्ना अस्ति}}:",
     "linkstoimage-more": "{{PLURAL:$1|$1}} तः अधिकपुटानि अस्यां सञ्चिकायां योज्यन्ते । \nअधोनिदेशितसूची सञ्चिकाभिः योजनीयपुटानि पश्यति ।{{PLURAL:$1|$1 पृष्ठ|$1 पृष्ठ}} \n[[Special:WhatLinksHere/$2|पूर्णसूची]] अपि लभ्यते ।",
     "booksources-invalid-isbn": "दत्तं ISBN मान्यम् इति  न भाति । मूलस्रोततः प्रतिकृतीः कर्तुं परिशीलयतु ।",
     "specialloguserlabel": "आचारी :",
     "speciallogtitlelabel": "लक्ष्यम् (शीर्षकम् / योजकः)",
-    "log": "सà¤\82सक्षितावल्यः (Logs)",
+    "log": "सà¤\82रक्षितावल्यः (Logs)",
     "all-logs-page": "सर्वसार्वजनिकप्रवेशः ।",
     "alllogstext": "{{SITENAME}}इत्यस्य उबलब्धप्रवेशानां  संयुक्तप्रदर्शनम् ।\nप्रवेशप्रकारं चित्वा भवान् दृश्यं क्षाययितुं शक्नोति । योजकनाम,  सदस्य नाम (ह्रस्वदीर्घाक्षरसंवादी) प्रभावितपुटम् ।",
     "logempty": "प्रवेशे मेलयुक्तपुटं नास्ति ।",
     "emailuser-title-notarget": "ईपत्र योजकः",
     "emailpage": "ई-मेल योजक",
     "emailpagetext": "अस्मै योजकाय विद्युन्मानपत्रं प्रेषयितुम् अधो दत्तप्रपत्रम् उपयोक्तुं शक्नोति । \n[[Special:Preferences|your user preferences]] अत्र भवता विनिवेशितः वि-पत्रसङ्केतः सकाशात् इति स्थाने प्रतिभाति । अनेन स्वीकर्ता साक्षात् प्रत्युत्तरं दातुं प्रभविष्यति ।",
-    "usermailererror": "पत्राचारपदार्थस्य प्रत्यागतदोषः ।",
     "defemailsubject": "{{SITENAME}}\"$1\" इति योजकात् विद्युन्मानपत्रम् ।",
     "usermaildisabled": "योजकस्य विद्युन्मानपत्रं निष्क्रियम् ।",
     "usermaildisabledtext": "अस्यां विक्याम् अन्ययोजकेभ्यः विद्युन्मानपत्रं प्रेषयितुं नै शक्नोति ।",
     "noemailtitle": "विद्युन्मानपत्रसङ्केतः नास्ति ।",
     "noemailtext": "अस्य योजकस्य निरिदिष्टः विद्युन्मानपत्रसङ्केतः नास्ति ।",
-    "nowikiemailtitle": "विद्युन्मानपत्रम् अननुमतम् ।",
     "nowikiemailtext": "अयं योजकः अन्ययोजकेभ्यः विद्युन्मानपत्राणि स्वीकार्तुं नेच्छति ।",
     "emailnotarget": "स्वीकर्तुः अस्तित्वविहीनम् अथवा अमान्यं योजकनाम  ।",
     "emailtarget": "स्वीकर्तुः योजकनाम लिखतु ।",
     "nowatchlist": "अवलोकनावल्यां पदार्थः नास्ति ।",
     "watchlistanontext": "अवलोकनपट्टिकायां पुटं दृष्टुं सम्पादयितुं वा  $1  करोतु ।",
     "watchnologin": "न नामाभिलितम्",
-    "watchnologintext": "अवलोकनावलीं परिवर्तयितुं भवता नामाभिलेखनं करणीयम् ।[[Special:UserLogin|logged in]]",
     "addwatch": "अवलोकनावलीं योजयतु ।",
     "addedwatchtext": "भवतः [[Special:Watchlist|ध्यानसूचिकायां]] \"[[:$1]]\" इत्येतत् योजितमस्ति।\nइदानींप्रभृति अस्मिन् पृष्ठे तथा अस्य चर्चापृष्ठे सन्तः परिवर्तनानि भवतः निरीक्षासूचिकायां द्रक्ष्यन्ते तथा च [[Special:RecentChanges|सद्यःपरिवर्तितानां सूचिकायां]] इदं पृष्ठं स्थूलाक्षरैः द्रक्ष्यते, यस्मात् भवान् सरलतया इदं पश्यतु <p>निरीक्षासूचिकातः निराकर्तुमिच्छति चेत्, \"मा निरीक्षताम्\" इत्यसमिन् नोदयतु।",
     "removewatch": "अवलोकनावलीतः अपनयतु ।",
     "watching": "निरीक्षते...",
     "unwatching": "निरीक्षाम् अपाकरोति...",
     "watcherrortext": " \"$1\" कृते अवलोकनावल्याः व्यवस्थापरिवर्तनावसरे दोषः संविधितः ।",
-    "enotif_mailer": "{{SITENAME}} सूचितः विद्युन्मानपत्रप्रेषकः ।",
     "enotif_reset": "सन्दर्शितानि इति सर्वपुटानि अङ्कयतु ।",
     "enotif_impersonal_salutation": "{{SITENAME}} योजक",
     "enotif_subject_deleted": "{{SITENAME}} पृष्ठं $1 इत्येतत् {{gender:$2 इत्यनेन|$2 इत्यनया}} अपाकृतमस्ति।",
     "excontent": "\"$1\" आधेयः आसीत् ।",
     "excontentauthor": "आधेयः $1आसीत् । अपि च योगदाता तु \"[[Special:Contributions/$2|$2]]\" आसीत् ।",
     "exbeforeblank": "रिक्तीकरणात् पूर्वम् आधेयः \"$1\" आसीत् ।",
-    "exblank": "पुटं रिक्तमासीत् ।",
     "delete-confirm": "विलुप्यताम् \"$1\"",
     "delete-legend": "विलुप्यताम्",
     "historywarning": "' पूर्वसूचना ''' भवता अपमर्जनसिद्धपुटे बहुशः  $1 इतिहासयुक्तः अस्ति ।{{PLURAL:$1|revision|revisions}}:",
     "allmessagesname": "नाम",
     "allmessagesdefault": "मूलसन्देशः",
     "allmessagescurrent": "सद्यः सन्देशपाठः ।",
-    "allmessagestext": "à¤\8fषा à¤®à¥\80डियाविà¤\95िनामसà¥\8dथानà¥\87 à¤\89पलबà¥\8dधा à¤\95ाà¤\9aितà¥\8d à¤¤à¤¨à¥\8dतà¥\8dरसनà¥\8dदà¥\87शसà¥\8dय à¤¸à¥\82à¤\9aिà¤\95ा à¤\85सà¥\8dति à¥¤  à¤¯à¤¦à¤¿ à¤­à¤µà¤¾à¤¨à¥\8d à¤¸à¤¾à¤®à¤¾à¤¨à¥\8dयमà¥\80डियाविà¤\95ि à¤\95à¥\8dषà¥\87तà¥\8dरà¥\80यà¤\95रणà¥\87 à¤¯à¥\8bà¤\97दानà¤\82 à¤\95रà¥\8dतà¥\81मिà¤\9aà¥\8dà¤\9bति à¤¤à¤°à¥\8dहि[https://www.mediawiki.org/wiki/Localisation à¤®à¥\80डियाविà¤\95ि à¤\95à¥\8dषà¥\87तà¥\8dरà¥\80यà¤\95रणमà¥\8d] à¤\85थवा [//translatewiki.net translatewiki.net] à¤\87तà¥\8dयतà¥\8dर गच्छतु ।",
+    "allmessagestext": "मà¥\80डियाविà¤\95ि à¤\87तà¥\8dयनà¥\87न à¤¨à¤¾à¤®à¤¾à¤\95ाशà¥\87न à¤¸à¤¹ à¤¸à¤²à¥\8dलà¤\97à¥\8dनानाà¤\82 à¤¯à¤¨à¥\8dतà¥\8dरà¤\9cनà¥\80तानाà¤\82 à¤¸à¥\82à¤\9aनानामà¥\8d à¤\86वलिà¤\83 à¤\85तà¥\8dर à¤\85सà¥\8dति à¥¤ à¤\95à¥\83पया à¤\85तà¥\8dर [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation MediaWiki Localisation], à¤\85तà¥\8dर [//translatewiki.net translatewiki.net] if you wish to contribute to the generic MediaWiki localisation. à¤\9a गच्छतु ।",
     "allmessagesnotsupportedDB": "अस्य पुटस्य उपयोगः नैव शक्यते यतः '''$wgUseDatabaseMessages''' तटास्थम् अस्ति ।",
     "allmessages-filter-legend": "शोधनी ।",
     "allmessages-filter": "ग्राहकीकरणस्य स्थितौ शोधनी ।",
     "importunknownsource": "अज्ञातायातस्रोतप्रकारः ।",
     "importcantopen": "आयातसञ्चिकाः उद्घाटयितुं न शक्यते ।",
     "importbadinterwiki": "प्रदुष्टः अन्तर्विक्यनुबन्धः ।",
-    "importnotext": "रिक्तम् अथवा पाठः नास्ति ।",
     "importsuccess": "आयातः समाप्तः ।",
-    "importhistoryconflict": "उपलब्धाः इतिहासपुनरावृत्तयः परस्परं विपरीताः। (एतत्पुटं पूर्वमेव आयातम् इति भाति ।)",
     "importnosources": "कोऽपि ट्रान्स्विकि आयातः नोपलब्धः अपि च प्रत्यक्षेतिहासस्य उत्तारणं निष्कियम् ।",
     "importnofile": "कापि आयातसञ्चिका उत्तारिता ।",
     "importuploaderrorsize": "आयातसञ्चिकाः अनुत्तारिताः। अस्याः आकारः अधिकतरः अस्ति ।",
     "simpleantispam-label": "अनिष्टसन्देशविरोधपरीक्षणम् ।\nअस्मिन् '''नहि''' पूर्यताम् !",
     "pageinfo-title": "\"$1\" कृते सूचनाः ।",
     "pageinfo-not-current": "क्षम्यताम्, पुरातनाभ्यः आवृत्तिभ्यः एषा सूचना दातुं न शक्यते।",
-    "pageinfo-header-basic": "मूलसूचनाः ।",
+    "pageinfo-header-basic": "मूलसूचनाः",
     "pageinfo-header-edits": "इतिहासः सम्पाद्यताम्",
     "pageinfo-header-restrictions": "पृष्ठसंरक्षणम्",
     "pageinfo-header-properties": "पृष्ठस्य गुणधर्मः",
index 27b4abf..7e00291 100644 (file)
     "permalink": "Куруук баар ыйынньык",
     "print": "Бэчээттээ",
     "view": "Көрүү",
+    "view-foreign": "Манна көрүү: $1",
     "edit": "Уларыт",
+    "edit-local": "Олохтоох ойуулааһынын уларытыы",
     "create": "Саҥаны айыы",
+    "create-local": "Бу туһунан суруйуу",
     "editthispage": "Бу сирэйи уларыт",
     "create-this-page": "Бу сирэйи ай",
     "delete": "Соттор",
     "pool-timeout": "Хааччахтааһыны кэтэһии болдьоҕо ааста",
     "pool-queuefull": "Көрдөбүллэри хомуйуу туолбут",
     "pool-errorunknown": "Биллибэт алҕас",
+    "pool-servererror": "Пул ааҕааччытын сулууспата үлэлээбэт($1).",
     "aboutsite": "{{SITENAME}} туһунан",
     "aboutpage": "Project:туһунан",
     "copyright": "Маны туһанары $1 лиссиэнсийэ көҥүллүүр (атын ыйыллыбытах буоллаҕына).",
     "youhavenewmessages": "$1 ($2) кэллэ",
     "youhavenewmessagesfromusers": "Маны $1 {{PLURAL:$3|соҕотох кыттааччыттан|$3 кыттааччыттан}} туппуккун ($2).",
     "youhavenewmessagesmanyusers": "Маны $1 элбэх кыттааччыттан туппуккун ($2).",
-    "newmessageslinkplural": "{{PLURAL:$1|саҥа этии|саҥа этии}}",
-    "newmessagesdifflinkplural": "тиһэх {{PLURAL:$1|уларытыы|уларытыылар}}",
+    "newmessageslinkplural": "{{PLURAL:$1|саҥа этии|999=саҥа этии}}",
+    "newmessagesdifflinkplural": "тиһэх {{PLURAL:$1|уларытыы|999=уларытыылар}}",
     "youhavenewmessagesmulti": "$1, саҥа суруктар кэллилэр",
     "editsection": "уларыт",
     "editold": "уларыт",
     "invalidtitle-knownnamespace": "«$2» аат далыгар маннык тиэкистээх «$3» сатаммат аат",
     "invalidtitle-unknownnamespace": "Биллибэт аат дала $1 нүөмэрдээх, \"$2\" тиэкистээх сатаммат аат",
     "exception-nologin": "Ааккын билиһиннэрбэтэххин",
-    "exception-nologin-text": "Маны көрөргө эбэтэр оҥорорго ааккын билиһиннэриэхтээххин.",
+    "exception-nologin-text": "Маны көрөргө эбэтэр оҥорорго [[Special:Userlogin|ааккын билиһиннэриэхтээххин]].",
+    "exception-nologin-text-manual": "Көрөргө эбэтэр оҥорорго маны гыныахтааххын: $1.",
     "virus-badscanner": "Сатаммата. Вирус сканера биллибэтэ: ''$1''",
     "virus-scanfailed": "скан сыыһата (куода $1)",
     "virus-unknownscanner": "биллибэт антивирус:",
     "gotaccount": "Бэлиэтэммитиҥ дуо? '''$1'''.",
     "gotaccountlink": "Аатыҥ",
     "userlogin-resetlink": "Киирэр тылгын умнубуккун дуо?",
-    "userlogin-resetpassword-link": "Киирии тылы уларытыы",
+    "userlogin-resetpassword-link": "Киирии тылгын санаттараҕын дуо?",
+    "userlogin-helplink2": "Киирэргэ көмө",
     "userlogin-loggedin": "Маннык аатынан киирбиккин {{GENDER:$1|$1}}.\nАтын аатынан киирэргэ аллара көстөр форманы туһан.",
     "userlogin-createanother": "Атын аатынан бэлиэтэн",
     "createacct-join": "Аллара суруй.",
     "passwordtooshort": "Киирии тылыҥ наһаа кылгас.\nКырата {{PLURAL:$1|1 бэлиэлээх|$1 бэлиэлээх}} буолуохтаах.",
     "password-name-match": "Киирии тыл ааккыттан атын буолуохтаах.",
     "password-login-forbidden": "Маннык ааты уонна киирии тылы туһаныы бобуллар.",
-    "mailmypassword": "Саҥа ÐºÐ¸Ð¸Ñ\80ии Ñ\82Ñ\8bлла Ñ\8bÑ\8bÑ\82Ñ\82аÑ\80",
+    "mailmypassword": "Ð\9aииÑ\80ии Ñ\82Ñ\8bлÑ\8b Ñ\81аҥаÑ\80дÑ\8bÑ\8b",
     "passwordremindertitle": "{{SITENAME}} киирии тылын санатыы",
     "passwordremindertext": "Ким эрэ (бадаҕа эн бу IP-аадырыстан: $1), {{SITENAME}} ($4) киирии тылын саҥаттан ыытыҥ диэбит.\n\"$2\" кыттааччы быстах киирии тыла билигин маннык: \"$3\".\nӨскө маны эн чахчы көрдөөбүт буоллаххына, систиэмэҕэ саҥаттан киирэҥҥин киирии тылгын уларытыаххын сөп.\nБыстах киири тыл {{PLURAL:$5|биир хонук|$5 хонук устата}} үлэлиир.\n\nӨскөтүн киирии тылы саҥаттан көрдөөбөтөх буоллаххына,\nэбэтэр урукку киирии тылгын өйдөөн кэлбит буоллаххына,\nбу сурукка ааххайыма уонна урукку киирии тылгын салгыы туһан.",
     "noemail": "\"$1\" ааттаах киһиэхэ эл. почтата ыйыллыбатах.",
     "throttled-mailpassword": "Киирии тылы өйдөтөр тэрил бүтэһик {{PLURAL:$1|чаас|$1 чаас}} иһигэр туттулла сылдьыбыт.\nКөмүскэнэр соруктан сылтаан киирии тылы {{PLURAL:$1|чааска|$1 чааска}} биирдэ эрэ ыйытыахха сөп.",
     "mailerror": "Сурук ыытарга алҕас таҕыста: $1",
     "acct_creation_throttle_hit": "Эн IP-гыттан бүгүн {{PLURAL:$1|1 аат оҥоһуллубут|$1 аат бэлиэтэммит}} буолан бүгүҥҥү күннээҕи нуорма туолбут.\nБу IP-тан киирэр дьон саҥа ааты билигин бэлиэтиир кыахтара суох.",
-    "emailauthenticated": "Эн Ð¿Ð¾Ñ\87Ñ\82аҥ Ð°Ð°Ð´Ñ\8bÑ\80Ñ\8bһа Ð±Ð°Ñ\87Ñ\87аÒ\95а Ð±Ð¸Ð³Ñ\8dÑ\80гÑ\8dÑ\82иллибиÑ\82: $2, $3.",
-    "emailnotauthenticated": "Эл. почтаҥ аадырыһа бигэргэтиллэ илик.\nОнон вики-движок эн почтаҕын кытта үлэлиир кыаҕа суох.",
+    "emailauthenticated": "Эн Ð¿Ð¾Ñ\87Ñ\82аҥ Ð°Ð°Ð´Ñ\8bÑ\80Ñ\8bһа Ð±Ð¸Ð³Ñ\8dÑ\80гÑ\8dÑ\82иллибиÑ\82 ÐºÑ\8dмÑ\8d: $2, $3.",
+    "emailnotauthenticated": "Эл. почтаҥ аадырыһа бигэргэтиллэ илик эбит.\nОнон сурук манна ааттаммыт түгэннэргэ ыытыллыа суоҕа.",
     "noemailprefs": "Эл. почтаҥ ыйыллыбатах, онон вики-движок аадырыскын туһанар кыаҕа суох.",
     "emailconfirmlink": "Эл. аадырыскын бигэргэтэргэ",
     "invalidemailaddress": "Киллэрбит аадырыһыҥ эл. почта аадырыһыгар майгыннаабат.\nСөпкө суруй эбэтэр кураанах хааллар.",
     "accountcreatedtext": "[[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|ыр.]]) бэлиэ аат оҥоһулунна.",
     "createaccount-title": "{{SITENAME}} бырайыакка саҥа аат оҥоруу",
     "createaccount-text": "Ким эрэ {{SITENAME}} бырайыакка ($4) саҥа $2 ааты бэлиэтээбит. \"$2\" киирии тыла \"$3\". Билигин киирэн киирии тылгын уларытыаххын наада.\n\nСаҥа аат сыыһа оҥоһуллубут буоллаҕына тугу да гыныа суоххун сөп.",
-    "usernamehasherror": "Аакка эрэһиэккэ бэлиэтин туттар сатаммат",
     "login-throttled": "Ааккын аһара элбэхтик билиһиннэрэ сатаатыҥ.\nБука диэн $1 буолан баран өссө киирэн көрөөр.",
     "login-abort-generic": "Бу аатынан сатаан киирбэтиҥ - быстан хаалла",
     "loginlanguagelabel": "Омугун тыла: $1",
     "suspicious-userlogout": "Сеансы түмүктүүр ыйытыгыҥ ылыныллыбата, тоҕо диэтэххэ браузер эбэтэр кээштыыр прокси алҕас ыыппыт ыйытыктарыгар майгынныыр.",
     "createacct-another-realname-tip": "Дьиҥнээх аатыҥ булгуччута суох.\nЫйдаххына уларыппыт сирэйиҥ устуоруйатыгар көстөр буолуоҕа.",
+    "pt-login": "Киир",
+    "pt-login-button": "Киир",
+    "pt-createaccount": "Бэлиэтэнии",
+    "pt-userlogout": "Тахсыы",
     "php-mail-error-unknown": "mail() PHP-функциятыгар туох эрэ алҕас тахсыбыт",
     "user-mail-no-addy": "Сурук аадырыһа суох ыыттылла сатаабыт",
     "user-mail-no-body": "Кураанах эбэтэр суолтата суох кылгас тиэкистээх суругу ыыта сатаабыт.",
     "changepassword": "Киирии тылы уларытарга",
-    "resetpass_announce": "Ð\91Ñ\83 Ð±Ñ\8bÑ\81Ñ\82аÑ\85 ÐºÑ\8dмҥÑ\8d Ñ\82Ñ\83Ñ\82Ñ\82Ñ\83ллаÑ\80 ÐºÐ¸Ð¸Ñ\80ии Ñ\82Ñ\8bлÑ\8bнан ÐºÐ¸Ð¸Ñ\80диҥ. Ð¢Ò¯Ð¼Ò¯ÐºÐºÑ\8d Ñ\81аҥа ÐºÐ¸Ð¸Ñ\80ии Ñ\82Ñ\8bлла Ñ\81Ñ\83Ñ\80Ñ\83й:",
+    "resetpass_announce": "ТүмүкÑ\82Ò¯Ò¯Ñ\80гÑ\8d Ñ\81аҥа ÐºÐ¸Ð¸Ñ\80ии Ñ\82Ñ\8bлла Ñ\81Ñ\83Ñ\80Ñ\83й.",
     "resetpass_text": "<!-- Тиэкиһи манна эбэн суруйуҥ -->",
     "resetpass_header": "Аат киирии тылын уларытыы",
     "oldpassword": "Эргэ киирии тыл:",
     "retypenew": "Саҥа киирии тылы хатылаа:",
     "resetpass_submit": "Киирии тылы уларыт уонна киир",
     "changepassword-success": "Киирии тылыҥ этэҥҥэ уларыйда!",
+    "changepassword-throttled": "Ааккын аһара элбэхтик билиһиннэрэ сатаатыҥ.\nБука диэн $1 буолан баран өссө киирэн көрөөр.",
     "resetpass_forbidden": "Киирии тылы уларытар сатаммат",
     "resetpass-no-info": "Ааккын билиһиннэрдэххинэ эрэ бу сирэйгэ быһа тиийиэххин сөп.",
     "resetpass-submit-loggedin": "Киирии тылы уларытыы",
     "resetpass-submit-cancel": "Салҕаама",
     "resetpass-wrong-oldpass": "Киирии тыл сөп түбэспэтэ.\nБаҕар уларыппытыҥ буолуо эбэтэр быстах кэмҥэ туттуллар киирии тылы оҥотторбутуҥ буолуо.",
+    "resetpass-recycled": "Бука диэн, билиҥҥи киирии тылтан атыны суруй.",
+    "resetpass-temp-emailed": "Быстах кэмҥэ туттуллар киирии тылынан киирдиҥ.\nТүмүктүүргэ саҥа киирии тылы суруйуохтааххын:",
     "resetpass-temp-password": "Быстах кэмҥэ туттуллар киирии тыл:",
     "resetpass-abort-generic": "Киирии тылы уларытыыны кэҥэтии тохтотто.",
+    "resetpass-expired": "Киирии тылыҥ болдьоҕо ааспыт эбит. Бука диэн, саҥа киирии тылла туруорун.",
+    "resetpass-expired-soft": "Киирии тылыҥ болдьоҕо бүппүт, онон уларытыллыахтаах эбит. Бука диэн атын киирии тылы суруй эбэтэр маня баттаан кэлин киллэрээр \"{{int:resetpass-submit-cancel}}\".",
+    "resetpass-validity-soft": "Киирии тылыҥ алҕастаах: $1\n\nБука диэн саҥа киирии тылла суруй эбэтэр кэлин киллэриэххин баҕарар буоллаххына маны баттаа \"{{int:resetpass-submit-cancel}}\"",
     "passwordreset": "Киирии тылы саҥаттан",
     "passwordreset-text-one": "Урукку киирии тылы уларытарга бу форманы толор.",
-    "passwordreset-text-many": "{{PLURAL:$1|Ð\9aииÑ\80ии Ñ\82Ñ\8bлÑ\8b Ñ\83лаÑ\80Ñ\8bÑ\82арга түннүктэртэн биирдэстэрин толор.}}",
+    "passwordreset-text-many": "{{PLURAL:$1|Ð\91Ñ\8bÑ\81Ñ\82аÑ\85 ÐºÐ¸Ð¸Ñ\80ии Ñ\82Ñ\8bлÑ\8b Ñ\8dлекÑ\82Ñ\80он Ð¿Ð¾Ñ\87Ñ\82аÒ\95аÑ\80 Ñ\8bÑ\8bÑ\82Ñ\82аÑ\80арга түннүктэртэн биирдэстэрин толор.}}",
     "passwordreset-legend": "Киирии тылы саҥаттан",
     "passwordreset-disabled": "Бу биикигэ киирии тылы саҥардыы бобуллубут.",
     "passwordreset-emaildisabled": "Бу биикигэ эл. почтаны туттуу араарыллыбыт",
     "changeemail-password": "{{SITENAME}} ситим-сиргэ киирэр тылыҥ:",
     "changeemail-submit": "Аадырыһы уларыт",
     "changeemail-cancel": "Тохтот",
+    "changeemail-throttled": "Ааккын аһара элбэхтик билиһиннэрэ сатаатыҥ.\nБука диэн $1 буолан баран өссө киирэн көрөөр.",
     "resettokens": "Токеннары бырах",
     "resettokens-legend": "Токеннары бырах",
     "resettokens-tokens": "Токеннар:",
     "prefs-skin": "Тас көстүү",
     "skin-preview": "Хайдах буолара",
     "datedefault": "Көннөрү көстүүтэ",
-    "prefs-beta": "Бета-туруоруулар",
-    "prefs-datetime": "Күнэ-дьыла уонна кэмэ",
     "prefs-labs": "Тургутуллар туруоруулар",
     "prefs-user-pages": "Кыттааччы сирэйдэрэ",
     "prefs-personal": "Кыттааччы туруоруулара",
     "upload-permitted": "Көҥүллэммит билэ көрүҥнэрэ: $1.",
     "upload-preferred": "Маннык билэ көрүҥнэрин туһанар ордук: $1.",
     "upload-prohibited": "Маннык билэ көрүҥнэрэ бобуллубуттар: $1.",
-    "uploadlog": "уларытыы устуоруйата",
     "uploadlogpage": "Уларытыы устуоруйата",
     "uploadlogpagetext": "Манна бүтэһик уларытыылар тиһиктэрэ көстөр.\nӨссө [[Special:NewFiles|саҥа билэлэр]] тиһиктэрин көрүөххүн сөп.",
     "filename": "Билэ аата",
     "filereuploadsummary": "Билэ уларыйыылара:",
     "filestatus": "Туһаныы (Copyright):",
     "filesource": "Хантан ылыллыбыта:",
-    "uploadedfiles": "Киллэриллибит билэлэр",
     "ignorewarning": "Сэрэтиилэри истибэккэ билэни киллэр",
     "ignorewarnings": "Сэрэтиини истимэ",
     "minlength1": "Билэ аата биир суругунан буолуохтаах.",
     "overwroteimage": "\"[[$1]]\" киллэриллибит саҥа торума",
     "uploaddisabled": "Суруттарыы бобуллубут",
     "copyuploaddisabled": "URL көмөтүнэн хачайдыыр кыах араарыллыбыт.",
-    "uploadfromurl-queued": "Эн хачайдааһыныҥ уочаркка туруорулунна.",
     "uploaddisabledtext": "Билэлэри суруттарар көҥүллэммэт.",
     "php-uploaddisabledtext": "PHP туруорууларыгар билэни киллэрии араарыллыбыт. Бука диэн, file_uploads туруоруутун көр.",
     "uploadscripted": "Бу билэ HTML эбэтэр скрипт куодтаах эбит. Интэриниэт көрдөрөр бырагыраамма ону сыыһа ааҕыан сөп.",
     "upload-misc-error": "Сурутуу биллибэт моһоллонно",
     "upload-misc-error-text": "Сурутуу биллибэт моһоллонно.\nАадырыһы сөпкө суруйбуккун көр уонна өссө биирдэ боруобалаа.\nБу хатыланнаҕына [[Special:ListUsers/sysop|администраатары]] кытта сибээстэс.",
     "upload-too-many-redirects": "URL наһаа элбэх утаарыылаах",
-    "upload-unknown-size": "Биллибэт кээмэй",
     "upload-http-error": "HTTP алҕаһа таҕыста: $1",
     "upload-copy-upload-invalid-domain": "Бу домеҥҥа хачайдааһыны хатылыыр табыллыбат.",
     "backend-fail-stream": "$1 билэни ыытар табыллыбата.",
     "img-auth-streaming": "Ботуогунан биэрии «$1».",
     "img-auth-public": "img_auth.php аналынан билэлэри сабыылаах биикиттэн таһаарыы буолар.\nБу биики аһаҕас.\nОнон img_auth.php араарыллыбыт.",
     "img-auth-noread": "Кыттааччы «$1» ааҕарга көҥүлэ суох.",
-    "img-auth-bad-query-string": "URL алҕастаах",
     "http-invalid-url": "Алҕастаах URL: $1",
     "http-invalid-scheme": "Маннык схемалаах аадырыстар өйөммөттөр \"$1\"",
     "http-request-error": "HTTP-көрдөбүл биллибэт алҕастаан сылтаан ылыныллыбата.",
     "filehist-dimensions": "Кээмэйдэрэ",
     "filehist-filesize": "Билэ кээмэйэ",
     "filehist-comment": "Хос быһаарыы",
-    "filehist-missing": "Билэ суох",
     "imagelinks": "Билэни туттуу",
     "linkstoimage": "Бу билэҕэ маннык атын {{PLURAL:$1|сирэй сигэнэр|$1 сирэйдэр сигэнэллэр}}:",
     "linkstoimage-more": "$1 {{PLURAL:$1|сирэйтэн|сирэйтэн}} элбэх сирэй бу билэҕэ сигэнэр.\nОнтон бу тиһиккэ {{PLURAL:$1|$1 эрэ сигэ көһүннэ|$1 сигэ эрэ көһүннэ}}.\nӨссө [[Special:WhatLinksHere/$2|толору тиһиги]] көрүөххүн сөп.",
     "emailuser-title-notarget": "Кыттааччыга e-mail сурук ыытыы",
     "emailpage": "Кыттааччыга E-mail ыыт",
     "emailpagetext": "Бу фуорма көмөтүнэн {{GENDER:$1|кыттааччыга}} сурук ыытыаххын сөп.\n\"Кимтэн\" диэҥҥэ эн [[Special:Preferences|туруорууларгар]] баар аадырыһыҥ киириэҕэ,\nонон суругу туппут киһи ол аадырыскар чопчу хардарар кыахтаныа.",
-    "usermailererror": "Сурук кыайан барбата:",
     "defemailsubject": "{{SITENAME}} — $1 диэн киһиттэн сурук кэлбит",
     "usermaildisabled": "Кыттааччы эл почтата арахса сылдьар",
     "usermaildisabledtext": "Эн атын кыттааччыларга эл. почтанан сурук ыытар кыаҕыҥ суох эбит",
     "noemailtitle": "E-mail суох",
     "noemailtext": "Бу кыттааччы e-mail аадырыһын эппэтэх.",
-    "nowikiemailtitle": "Сурук ыытар кыах суох",
     "nowikiemailtext": "Бу кыттааччы сурук тутуон баҕарбат.",
     "emailnotarget": "Суруйбут кыттааччыҥ суох эбэтэр аата алҕастаах.",
     "emailtarget": "Суруйар киһиҥ аатын киллэр",
     "nowatchlist": "Эн кэтиир сирэйдэриҥ суохтар.",
     "watchlistanontext": "Кэтэбилиҥ сирэйин көрөргөр эбэтэр уларытаргар маны оҥор: $1.",
     "watchnologin": "Бэйэҕин билиһиннэр",
-    "watchnologintext": "Бэйэҕин [[Special:UserLogin|билиһиннэрдэххинэ]] кэтэбил сирэйгин уларытыаххын сөп.",
     "addwatch": "Кэтэбил тиһигэр киллэр",
     "addedwatchtext": "«[[:$1]]» сирэй [[Special:Watchlist|кэтэбил тиһигэр]] киирдэ.\nСирэй уларытыылара уонна кинини кытта ситимнээх ырытыы сирэйин уларытыылара бүгүҥҥүттэн онно көстөр буолуохтара.",
     "removewatch": "Кэтэбил тиһигиттэн сот",
     "watching": "Кэтээ...",
     "unwatching": "Кэтээмэ...",
     "watcherrortext": "Кэтээн көрүү тиһигин уларытыы кэмигэр алҕас таҕыста (\"$1\" сирэйгэ сыһыаннаах).",
-    "enotif_mailer": "{{SITENAME}} Биллэрэр Сулууспата",
     "enotif_reset": "Бары сирэйдэри көрбүтүм курдук бэлиэтээ",
     "enotif_impersonal_salutation": "{{SITENAME}} кыттааччыта",
     "enotif_subject_deleted": "«{{SITENAME}}» бырайыак «$1» ааттаах сирэйин бу {{gender:$2|кыттааччы|кыттааччы}} соппут - $2",
     "excontent": "иһинээҕитэ: '$1'",
     "excontentauthor": "иһинээҕитэ: «$1» (соҕотох ааптар [[Special:Contributions/$2|$2]])",
     "exbeforeblank": "иһинээҕитэ сотуллуон иннинэ: '$1'",
-    "exblank": "сирэй кураанах этэ",
     "delete-confirm": "Маны \"$1\" соторго",
     "delete-legend": "Сотуу",
     "historywarning": "'''Сэрэтии''': Сотоору турар сирэйиҥ көрүллүбүт $1 {{PLURAL:$1|соҕотох барыллаах|барыллаах}} устуоруйалаах:",
     "allmessagesname": "Биллэрии",
     "allmessagesdefault": "Туспа этиллибэтэҕинэ суруллар тиэкис",
     "allmessagescurrent": "Билиҥҥи тиэкис",
-    "allmessagestext": "Манна MediaWiki биллэриилэрин испииһэгэ көстөр.\nЭн MediaWiki движогун тылбаастыырга көмөлөһүөххүн баҕарар буоллаххына манна [https://www.mediawiki.org/wiki/Localisation MediaWiki Localisation] уонна манна [//translatewiki.net translatewiki.net] киир.",
+    "allmessagestext": "Манна MediaWiki биллэриилэрин испииһэгэ көстөр.\nЭн MediaWiki движогун тылбаастыырга көмөлөһүөххүн баҕарар буоллаххына манна [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation MediaWiki Localisation] уонна манна [//translatewiki.net translatewiki.net] киир.",
     "allmessagesnotsupportedDB": "'''{{ns:special}}:Allmessages''' туттуллар кыаҕа суох, тоҕо диэтэххэ '''$wgUseDatabaseMessages''' араарыллыбыт.",
     "allmessages-filter-legend": "Сиидэ",
     "allmessages-filter": "Уларытыы көрүҥүнэн наардыыр сиидэ:",
     "importunknownsource": "Импортанар сирэй биллибэт көрүҥнээх",
     "importcantopen": "Импортанар билэ кыайан арыллыбат",
     "importbadinterwiki": "Интервики ыйынньык сыыһа",
-    "importnotext": "Тиэкис суох",
     "importsuccess": "Импортааһын түмүктэннэ!",
-    "importhistoryconflict": "Баар торумнар сөпсөспөтүлэр (баҕар сирэй номнуо импортаммыт буолуон сөп)",
     "importnosources": "Биики ыккрадынааҕы импортанар билэ талыллыбатах, уларытыы историятын көһөрүү арахса сылдьар.",
     "importnofile": "Импортанар билэ сатаан киллэриллибэтэ.",
     "importuploaderrorsize": "Файл ыйааhына наhаа улахан буолан хачайдааhын тохтотулунна.",
index 602b65b..a4478a5 100644 (file)
     "prefs-skin": "Aspettu",
     "skin-preview": "Antiprima",
     "datedefault": "Nudda prifirenza",
-    "prefs-beta": "Funzioni beta",
     "prefs-datetime": "Data e ura",
     "prefs-labs": "Funziunalità dî labboratoria",
     "prefs-personal": "Prufilu utenti",
     "nowatchlist": "Nun hai innicatu pàggini a tèniri d'occhiu.",
     "watchlistanontext": "Pi visualizzari e canciari l'alencu di l'ossirvati spiciali è nicissariu $1.",
     "watchnologin": "Nun hai effittuatu lu login",
-    "watchnologintext": "Hai a fari prima lu [[Special:UserLogin|login]] pi canciari la tò lista di ossirvati spiciali.",
     "addedwatchtext": "La pàggina \"[[:$1]]\" è stata agghiunciuta â propia [[Special:Watchlist|lista di l'ossirvati spiciali]]. D'ora n poi, li mudìfichi appurtati â pàggina e â sò discussioni vèninu alincati n chidda sedi; lu tìtulu dâ pàggina appari n '''grassettu''' ntâ pàggina di l' [[Special:RecentChanges|ùrtimi canciamenti]] pi rinnìrilu cchiù visìbbili. Siddu n un secunnu tempu s'addisìa eliminari la pàggina dâ lista di l'ossirvati spiciali, fari clic supra \"nun sèquiri\" ntâ barra n àutu.",
     "removedwatchtext": "La pàggina \"[[:$1]]\" hà statu eliminata dâ lista di l'ossirvati spiciali.",
     "watch": "talìa",
     "allmessagesname": "Nomu",
     "allmessagesdefault": "Testu pridifinitu",
     "allmessagescurrent": "Testu attuali",
-    "allmessagestext": "Chista è na lista di missaggi di sistema chi s'attròvanu sutta MediaWiki:''nomu''.\nVisita [https://www.mediawiki.org/wiki/Localisation MediaWiki Localisation] e [//translatewiki.net translatewiki.net] si voi cuntribbuiri â localizzazioni generica di MediaWiki.",
+    "allmessagestext": "Chista è na lista di missaggi di sistema chi s'attròvanu sutta MediaWiki:''nomu''.\nVisita [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation MediaWiki Localisation] e [//translatewiki.net translatewiki.net] si voi cuntribbuiri â localizzazioni generica di MediaWiki.",
     "allmessagesnotsupportedDB": "'''{{ns:special}}:Allmessages''' nun è suppurtatu pirchì lu flag '''$wgUseDatabaseMessages''' nun è attivu.",
     "allmessages-filter-legend": "Filtru",
     "allmessages-filter": "Filtru pi statu di canciamentu:",
index 6a29ead..8554226 100644 (file)
     "delete": "Delyte",
     "deletethispage": "Delyte this page",
     "undeletethispage": "Ondelyte this page",
-    "undelete_short": "Undelete {{PLURAL:$1|ane edit|$1 edits}}",
+    "undelete_short": "Ondelyte {{PLURAL:$1|yin eedit|$1 eedits}}",
     "viewdeleted_short": "See {{PLURAL:$1|yin delytit eedit|$1 delytit eedits}}",
     "protect": "Fend",
     "protect_change": "chynge",
     "pool-timeout": "Timeout waitin fer the lock",
     "pool-queuefull": "Pool line is ful",
     "pool-errorunknown": "Onknawn mistak.",
+    "pool-servererror": "The puil coonter service is na available ($1).",
     "aboutsite": "Aboot {{SITENAME}}",
     "aboutpage": "Project:Aboot",
     "copyright": "Content is available unner $1 onless itherwise noted.",
     "accountcreatedtext": "The uiser accoont fer [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|tauk]]) haes been cræftit.",
     "createaccount-title": "Accoont makin for {{SITENAME}}",
     "createaccount-text": "Somebodie cræftit aen accoont fer yer wab-mail address oan {{SITENAME}} ($4) named \"$2\", wi passwaird \"$3\".\nYe shid log in n chynge yer passwaird nou.\n\nYe can ignore this message, gif this accoont wis cræftit bi mistak.",
-    "usernamehasherror": "Uisername canna contain hash chairacters",
     "login-throttled": "Ye'v makit ower monie recynt login attempts.\nPlease wait $1 afore giein it anither gae.",
     "login-abort-generic": "Yer login wisna successful - Aborted",
     "loginlanguagelabel": "Leid: $1",
     "anontalkpagetext": "----\n<em>This is the discussion page fer aen anonymoos uiser that's naw cræftit aen accoont yet, or that disna uise it.</em>\nWe maun therefore uise the numerical IP address tae identifie him/her.\nSic aen IP address can be shaired bi several uisers.\nGif ye'r aen anonymos uiser n feel that onreelavant comments hae been directed at ye, please [[Special:UserLogin/signup|cræft aen accoont]] or [[Special:UserLogin|log in]] tae avoid futur confusion wi ither anonymoos uisers.",
     "noarticletext": "Thaur's naw tex oan this page the nou. \nYe can [[Special:Search/{{PAGENAME}}|rake fer this page teitle]] in ither pages,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} rake the related logs],\n or [{{fullurl:{{FULLPAGENAME}}|action=edit}} eidit this page].</span>",
     "noarticletext-nopermission": "Thaur's nae tex in this page the nou.\nYe can [[Special:Search/{{PAGENAME}}|rake fer this page title]] in ither pages, or <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} rake the relatit logs]</span>, but ye dinna hae permeession tae cræft this page.",
-    "missing-revision": "The reveesion #$1 o the page named \"{{FULLPAGENAME}}\" disna exeest.\n\nThis is uissuallie caused bi follaein aen ootdated histerie link til ae page that haes been delytit.\nDetails can be foond in the [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} delytion log].",
+    "missing-revision": "The reveesion #$1 o the page named \"{{FULLPAGENAME}}\" disna exeest.\n\nThis is uissuallie caused bi follaein aen ootdated histerie airtin til ae page that haes been delytit.\nDetails can be foond in the [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} delytion log].",
     "userpage-userdoesnotexist": "Uiser accoont \"<nowiki>$1</nowiki>\" hasnae been registerit. Please check gin ye wint tae mak or eidit this page.",
     "userpage-userdoesnotexist-view": "Uiser accoont \"$1\" isna registered.",
     "blocked-notice-logextract": "This uiser is nou blockit.\nThe laitest block log entrie is gien ablo fer referance:",
     "rev-suppressed-no-diff": "Ye cannae see this diff cause yin o the reveesions haes been <strong>delytit</strong>.",
     "rev-deleted-unhide-diff": "Yin o the reveesions o this diff haes been <strong>delytit</strong>.\nDetails can be foond in the [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} delytion log].\nYe can still [$1 see this diff] gif ye wish tae proceed.",
     "rev-suppressed-unhide-diff": "Yin o the luikowers o this diff haes been <strong>suppressed</strong>.\nDetails can be foond in the [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} suppression log].\nYe can still [$1 see this diff] gif ye wish tae proceed.",
-    "rev-deleted-diff-view": "Ane o the reveesions o this diff haes been '''delytit'''.\nYe can see this diff; details can be foond in the [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} delytion log].",
+    "rev-deleted-diff-view": "Yin o the reveesions o this diff haes been '''delytit'''.\nYe can see this diff; details can be foond in the [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} delytion log].",
     "rev-suppressed-diff-view": "Yin o the luikowers o this diff haes been <strong>suppressed</strong>.\nYe can see this diff; the details can be foond in the [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} suppression log].",
     "rev-delundel": "chynge veesibilitie",
     "rev-showdeleted": "shaw",
     "revdelete-no-change": "<strong>Warnishment:</strong> The eetem dated $2, $1 awreadie haed the requested veesibeelitie settins.",
     "revdelete-concurrent-change": "Mistak modifiein the eitem dated $2, $1: Its status appears tae'v been chynged bi some ither bodie while ye attempted tae modifie it.\nPlease check the logs.",
     "revdelete-only-restricted": "Mistak skaukin the eetem dated $2, $1: Ye canna suppress eetems fae sicht bi admeenistraters wioot selectin yin o the ither veesibeelitie opties ava.",
-    "revdelete-reason-dropdown": "*Commyn delete raisons\n** Copiericht violation\n** Onappropriate comment or personal information\n** Onappropriate username\n** Potentially libelous information",
+    "revdelete-reason-dropdown": "*Commyn delyte raisons\n** Copiericht violation\n** Galus comment or personal information\n** Galus uisername\n** Potentiallie libelous information",
     "revdelete-otherreason": "Ither/addeetional raison:",
     "revdelete-reasonotherlist": "Ither raison",
     "revdelete-edit-reasonlist": "Eidit delyte raisons",
     "prefs-skin": "Huil",
     "skin-preview": "First Leuk",
     "datedefault": "Nae preference",
-    "prefs-beta": "Beta features.",
-    "prefs-datetime": "Date n time",
     "prefs-labs": "Labs featurs",
     "prefs-user-pages": "Uiser pages",
     "prefs-personal": "Uiser data",
     "upload_directory_read_only": "The uplaid directerie ($1) is naw writable bi the wabserver.",
     "uploaderror": "Uplaid mistak",
     "upload-recreate-warning": "'''Warnishment: Ae file bi that name haes been delytit or muived.'''\n\nThe delytion n muiv log fer this page ar gien here fer conveeneeance:",
-    "uploadtext": "Uise the form ablo tae uplaid files.\nTae see or rake preeveeislie uplaided files gang til the [[Special:FileList|leet o uplaided files]], (re)uplaids ar loggit in the [[Special:Log/upload|uplaid log]] ava, delytions in the [[Special:Log/delete|delytion log]].\n\nTae incluid ae file in ae page, uise aen airtin in yin o the follaein forms:\n* <strong><code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></code></strong> tae uise the ful version o the file\n* <strong><code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|alt tex]]</nowiki></code></strong> tae uise ae 200 pixel wide rendeetion in ae kist in the cair margin wi \"alt tex\" aes descreeption\n* <strong><code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code></strong> fer linkin directlie til the file wioot displeyin the file.",
+    "uploadtext": "Uise the form ablo tae uplaid files.\nTae see or rake aforegaun uplaided files gang til the [[Special:FileList|leet o uplaided files]], (re)uplaids ar loggit in the [[Special:Log/upload|uplaid log]] aes weel, n delytions in the [[Special:Log/delete|delytion log]].\n\nTae incluid ae file in ae page, uise aen airtin in yin o the follaein forms:\n* <strong><code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></code></strong> tae uise the ful version o the file\n* <strong><code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|alt tex]]</nowiki></code></strong> tae uise ae 200 pixel wide rendeetion in ae kist in the cair margin wi \"alt tex\" aes descreeption\n* <strong><code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code></strong> fer linkin directlie til the file wioot displeyin the file.",
     "upload-permitted": "Permitit file types: $1.",
     "upload-prohibited": "Proheebited file types: $1.",
-    "uploadlog": "uplaid log",
     "uploadlogpage": "Uplaid log",
     "uploadlogpagetext": "Ablo is a leet o the maist recent file uplaids.",
     "filedesc": "Ootline",
     "filereuploadsummary": "File chynges:",
     "filestatus": "Copyricht status:",
     "filesource": "Soorce:",
-    "uploadedfiles": "Uplaidit files",
     "ignorewarning": "Ignore warnishment n hain file oniewey.",
     "ignorewarnings": "Ignore ony warnins",
     "minlength1": "Filenames maun be at least yin letter.",
     "overwroteimage": "uplaided ae new version o \"[[$1]]\"",
     "uploaddisabled": "Sorry, uplaidin is disabled.",
     "copyuploaddisabled": "Uplaid bi URL disabled.",
-    "uploadfromurl-queued": "Yer uplaid haes been pit in line.",
     "uploaddisabledtext": "File uplaids ar disabled.",
     "php-uploaddisabledtext": "File uplaids ar disabled in PHP.\nPlease check the file_uploads settin.",
     "uploadscripted": "This file hauds HTML or script code that micht be wrang interpretit bi a wab brouser.",
     "upload-misc-error": "Onkent uplaid mistake",
     "upload-misc-error-text": "Aen onkent mistak occurred during the uplaid.\nPlease vereefie that the URL is valit n accessible n gie it anither gae.\nGif the proablem persists, contact aen [[Special:ListUsers/sysop|admeenistrater]].",
     "upload-too-many-redirects": "The URL contained oewr monie reguidals",
-    "upload-unknown-size": "Onkent size",
     "upload-http-error": "Aen HTTP mistake occurred: $1",
     "upload-copy-upload-invalid-domain": "Copie uplaids arna available fae this domain.",
     "backend-fail-stream": "Coudna stream file \"$1\".",
     "img-auth-streaming": "Streamin \"$1\".",
     "img-auth-public": "The function o img_auth.php is tae ootpit files fae ae preevate wiki.\nThis wiki is confeegured aes ae publeec wiki.\nFr optimal securitie, img_auth.php is disabled.",
     "img-auth-noread": "Uiser disna hae access tae read \"$1\".",
-    "img-auth-bad-query-string": "The URL haaes aen onvalid speirin string.",
     "http-invalid-url": "Onvalid URL: $1",
     "http-invalid-scheme": "URLs wi the \"$1\" preefix ar naw supported.",
     "http-request-error": "HTTP request failed cause o onkent mistak.",
     "filehist-user": "Uiser",
     "filehist-dimensions": "Dimensions",
     "filehist-comment": "Comment",
-    "filehist-missing": "File missin",
     "imagelinks": "File uisage",
     "linkstoimage": "The follaein {{PLURAL:$1|page airts|$1 pages airt}} tae this file:",
     "linkstoimage-more": "Mair than $1 {{PLURAL:$1|page airts|pages airt}} til this file.\nThe follaein leet shaws the {{PLURAL:$1|first page airtin|first $1 page airtins}} til this file yinlie.\nAe [[Special:WhatLinksHere/$2|ful leet]] is available.",
     "listgrouprights-removegroup-self": "Remuiv {{PLURAL:$2|groop|groops}} fae yer accoont: $1",
     "listgrouprights-addgroup-self-all": "Eik aw groops til yer accoont",
     "listgrouprights-removegroup-self-all": "Remuiv aw groops fae yer accoont",
+    "trackingcategories": "Keepin track o categeries",
+    "trackingcategories-summary": "This page leets the trackin categeries that ar autæmateecallie populatit bi the MediaWiki saffware. Thair names can be chynged bi alterin the reelavant system messages in the {{ns:8}} namespace.",
+    "trackingcategories-msg": "The Trackin Categerie",
+    "trackingcategories-name": "The Message name",
+    "trackingcategories-desc": "Categerie inclusion criteria",
+    "noindex-category-desc": "The page haes ae <code><nowiki>__NOINDEX__</nowiki></code> mageec waird oan it (n is in ae namespace whaur that flag is permitit), n sae it's na indext bi the robots.",
+    "index-category-desc": "The page haes ae <code><nowiki>__INDEX__</nowiki></code> oan it (n is in ae namespace whaur that flag is permitit), n sae it's indext bi the robots whaur it widna normallie be.",
+    "post-expand-template-inclusion-category-desc": "Efter makin aw o the templates muckler, the page size is muckler than <code>$wgMaxArticleSize</code>, sae some templates were na makit muckler.",
+    "post-expand-template-argument-category-desc": "Efter makin ae template argument muckler (sommit in triple braces, lik <code>{{{Foo}}})</code>, the page is muckler than <code>$wgMaxArticleSize</code>.",
+    "expensive-parserfunction-category-desc": "Ower monie expenseeve parser functions (lik <code>#ifexist</code>) incluidit oan ae page. See [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit Manual:$wgExpensiveParserFunctionLimit].",
+    "broken-file-category-desc": "Categerie eikit gif the page contains ae broken file airtin (aen airtin tae embed ae file whan the file disna exeest).",
+    "hidden-category-category-desc": "This is ae categerie wi <code><nowiki>__HIDDENCAT__</nowiki></code> oan it, This prevents it fae shawin up in the categerie airtins kist oan pages, bi defaut.",
+    "trackingcategories-nodesc": "Nae descreeption is available.",
+    "trackingcategories-disabled": "The categerie is disabled",
     "mailnologin": "Nae send address",
     "mailnologintext": "Ye maun be [[Special:UserLogin|loggit in]] n hae ae valid wab-mail address in yer [[Special:Preferences|preferences]] tae send Wab-mail til ither uisers.",
     "emailuser": "E-mail this uiser",
     "emailuser-title-notarget": "Wab-mail uiser",
     "emailpage": "Wab-mail uiser",
     "emailpagetext": "Ye can uise the form ablo tae send ae wab-mail message til this {{GENDER:$1|uiser}}.\nThe wab-mail address that ye entered in [[Special:Preferences|yer uiser preeferances]] will kith aes the \"Fae\" address o the wab-mail, sae that the receepient will be able tae replie directlie til ye.",
-    "usermailererror": "Mail object returned mistak:",
     "defemailsubject": "{{SITENAME}} wab-mail fae uiser \"$1\"",
     "usermaildisabled": "Uiser wab-mail disablit",
     "usermaildisabledtext": "Ye canna send wab-mail til ither uisers oan this wiki",
     "noemailtitle": "Nae e-mail address",
     "noemailtext": "This uiser haesna speceefied ae valid wab-mail address.",
-    "nowikiemailtitle": "Naw wab-mail permitit",
     "nowikiemailtext": "This uiser haes choosen tae naw receeve wab-mail fae ither uisers.",
     "emailnotarget": "Non-exeestent or onvalit uisername fer receepeeant.",
     "emailtarget": "Enter uisername o reeceepeeant",
     "nowatchlist": "Ye'v nae eitems oan yer watchleet.",
     "watchlistanontext": "Please $1 tae see or eedit eetems oan yer watchlet.",
     "watchnologin": "Nae loggit in",
-    "watchnologintext": "Ye maun be [[Special:UserLogin|loggit in]] tae modify yer watchleet.",
     "addwatch": "Eik til watchleet",
     "addedwatchtext": "The page \"[[:$1]]\" haes been added til yer [[Special:Watchlist|watchleet]].\nFutur chynges til this page n its associated tauk page will be leeted thaur.",
     "removewatch": "Remuiv fae watchleet",
     "watching": "Watchin...",
     "unwatching": "Unwatchin...",
     "watcherrortext": "Ae mistak occurred while chyngin yer watchleet settins fer \"$1\".",
-    "enotif_mailer": "{{SITENAME}} annooncemant mailer",
     "enotif_reset": "Merk aa pages visitit",
     "enotif_impersonal_salutation": "{{SITENAME}} uiser",
     "enotif_subject_deleted": "{{SITENAME}} page $1 haes been {{GENDER:$2|delytit}} bi $2",
     "excontent": "content wis: '$1'",
     "excontentauthor": "content wis: '$1' (n the ae contreebuter wis '[[Special:Contributions/$2|$2]]')",
     "exbeforeblank": "content afore blankin wis: '$1'",
-    "exblank": "page wis tuim",
     "delete-confirm": "Delyte \"$1\"",
     "delete-legend": "Delyte",
     "historywarning": "<strong>Warnishment:</strong> The page that ye'r aboot tae delyte haes ae histerie wi approximatelie $1 {{PLURAL:$1|reveesion|reveesions}}:",
     "undeletedrevisions": "{{PLURAL:$1|1 reveesion|$1 reveesions}} restored",
     "undeletedrevisions-files": "{{PLURAL:$1|1 reveesion|$1 reveesions}} n {{PLURAL:$2|1 file|$2 files}} restored",
     "cannotundelete": "Ondelyte failed:\n$1",
-    "undeletedpage": "<strong>$1 haes been restored</strong>\n\nConsult the [[Special:Log/delete|delytion log]] fer ae record o recent delytions an restorâtions.",
-    "undelete-header": "See [[Special:Log/delete|the delytion log]] fer recentlie delytit pages.",
+    "undeletedpage": "<strong>$1 haes been restored</strong>\n\nConsult the [[Special:Log/delete|delytion log]] fer ae record o recynt delytions n restorations.",
+    "undelete-header": "See [[Special:Log/delete|the delytion log]] fer the recentlie delytit pages.",
     "undelete-search-title": "Rake delytit pages",
     "undelete-search-box": "Rake delytit pages",
     "undelete-search-prefix": "Shaw pages stairtin wi:",
     "sp-contributions-newbies-sub": "Fer new accoonts",
     "sp-contributions-newbies-title": "Uiser contreebutions fer new accoonts",
     "sp-contributions-blocklog": "block log",
+    "sp-contributions-suppresslog": "suppressed uiser contreebutions",
     "sp-contributions-deleted": "delytit uiser contreebutions",
     "sp-contributions-uploads": "uploads",
     "sp-contributions-logs": "logs",
     "sp-contributions-blocked-notice": "This uiser is nou blockit.\nThe latest block log entrie is gien ablo fer referance:",
     "sp-contributions-blocked-notice-anon": "This IP address is blockit the nou.\nThe latest block log entrie is gien ablo fer referance:",
     "sp-contributions-search": "Rake fer contreebutions",
-    "sp-contributions-suppresslog": "suppressed uiser contreebutions",
     "sp-contributions-username": "IP address or uisername:",
     "sp-contributions-toponly": "Ainlie shaw eedits that ar laitest reveesions",
     "sp-contributions-newonly": "Yinlie shaw eidits that ar page cræftins",
     "allmessagesname": "Name",
     "allmessagesdefault": "Defaut message tex",
     "allmessagescurrent": "Message tex the nou",
-    "allmessagestext": "This is ae leet o system messages available in the MediaWiki namespace.\nPlease veesit [https://www.mediawiki.org/wiki/Localisation MediaWiki Localisation] n [//translatewiki.net translatewiki.net] gif ye wish tae contreebute til the generic MediaWiki localisation.",
+    "allmessagestext": "This is ae leet o system messages available in the MediaWiki namespace.\nPlease veesit [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation MediaWiki Localisation] n [//translatewiki.net translatewiki.net] gif ye wish tae contreebute til the generic MediaWiki localisation.",
     "allmessagesnotsupportedDB": "'''{{ns:special}}:AllMessages''' nae supportit acause '''$wgUseDatabaseMessages''' is aff.",
     "allmessages-filter": "Filter b custymization state:",
     "allmessages-filter-unmodified": "Onmodified",
     "imported-log-entries": "Imported $1 {{PLURAL:$1|log entrie|log entries}}.",
     "importunknownsource": "Onkent import soorce type",
     "importcantopen": "Coudna apen import file",
-    "importnotext": "Tuim or nae tex",
     "importsuccess": "Importit fine!",
-    "importhistoryconflict": "Conflictin histerie reveesion exeests (micht hae importit this page afore)",
     "importnosources": "Nae transwiki import soorces haes been defined n direct histerie uplaids is disabled.",
     "importnofile": "Naw import file wis uplaided.",
     "importuploaderrorsize": "Uplaid o import file failed.\nThe file is muckler than the permitit uplaid size.",
index 76aeb70..8eeaa66 100644 (file)
     "disclaimers": "غيرجوابداريناما",
     "disclaimerpage": "Project:عام غيرجوابدارينامو",
     "edithelp": "مدد براءِ ترميم",
-    "helppage": "Help:فهرست",
     "mainpage": "مُک صفحو",
     "mainpage-description": "مُک صفحو",
     "policy-url": "Project:پاليسي",
index a38bfcf..4bddc6a 100644 (file)
@@ -5,7 +5,8 @@
             "Cornelia",
             "Felis",
             "Jun Misugi",
-            "Kaganer"
+            "Kaganer",
+            "Midnight Gambler"
         ]
     },
     "tog-underline": "Sotturìnia li cullegamenti:",
     "tog-extendwatchlist": "Musthra tutti li mudìfigghi a li abbaidaddi ippiziari, nò soru l'ulthimi.",
     "tog-usenewrc": "Utirizza l'ulthimi mudìfigghi abanzaddi (dumanda JavaScript)",
     "tog-numberheadings": "Numarazioni otomàtigga di li tìturi di sezzioni",
-    "tog-showtoolbar": "Musthra barra di l'isthrumenti di mudìfigga (dumanda JavaScript)",
-    "tog-editondblclick": "Mudìfigga di li pàgini attrabessu dóppiu clic (dumanda JavaScript)",
-    "tog-editsectiononrightclick": "Mudìfigga di li sezzioni attrabessu lu clic dresthu i' lu tìturu (nezzessàriu JavaScript)",
-    "tog-rememberpassword": "Ammenta la paràura d'órdhini (nezzessàriu azzittà li cookie) (for a maximum of $1 {{PLURAL:$1|dì|dì}})",
+    "tog-showtoolbar": "Musthra barra di l'isthrumenti di mudìfigga",
+    "tog-editondblclick": "Mudìfigga di li pàgini attrabessu dóppiu clic",
+    "tog-editsectiononrightclick": "Mudìfigga di li sezzioni attrabessu lu clic dresthu i' lu tìturu",
+    "tog-rememberpassword": "Ammenta la paràura d'órdhini (for a maximum of $1 {{PLURAL:$1|dì|dì}})",
     "tog-watchcreations": "Aggiungi li pàgini criaddi a l'abbaidaddi ippiziari",
     "tog-watchdefault": "Aggiungi li pàgini mudìfiggaddi a l'abbaidaddi ippiziari",
     "tog-watchmoves": "Aggiungi li pàgini ippusthaddi a l'abbaidaddi ippiziari",
     "newwindow": "(s'abbri in d'unu nobu balchoni)",
     "cancel": "Annullà",
     "moredotdotdot": "Althru...",
-    "mypage": "La mea pàgina",
+    "mypage": "Pàgina",
     "mytalk": "Li me' dischussioni",
     "anontalk": "Dischussioni pa chisthu IP",
     "navigation": "Nabiggazioni",
     "createaccount-title": "Criazioni di un'intradda a {{SITENAME}}",
     "createaccount-text": "Calchunu à criaddu una registhrazioni a {{SITENAME}} ($4) pa contu di \"$2\", cun la paràura d'órdhini \"$3\".\nÈ opporthunu eseguì un'intradda cantu primma e ciamballa immediatamenti.\n\nSi la registhrazioni è isthadda criadda pa un'errori, pói ignorà chisth'imbasciadda.",
     "loginlanguagelabel": "Linga: $1",
+    "pt-login": "Intra",
+    "pt-login-button": "Intra",
+    "pt-userlogout": "Iscidda",
     "changepassword": "Ciamba paràura d'órdhini",
     "resetpass_announce": "L'intradda è isthadda effettuadda cun un còdizi timpuràniu, inviaddu via postha erettrònica.\n\nPa cumprità la registhrazioni è nezzessàriu impusthà una noba paràura d'órdhini inogghi:",
     "resetpass_text": "<!-- Aggiungi lu testhu inogghi -->",
     "resetpass_submit": "Impustha la paràura d'órdhini e intra",
     "changepassword-success": "La paràura d'órdhini tóia è isthadda mudìfiggadda. Abà sei intrendi...",
     "resetpass_forbidden": "No è pussìbiri mudifiggà li paràuri d'órdhini in {{SITENAME}}.",
+    "passwordreset-username": "Innòmu utenti:",
+    "resettokens-tokens": "Token:",
     "bold_sample": "Grassetu",
     "bold_tip": "Grassetu",
     "italic_sample": "Cursibu",
     "prefs-skin": "Aipettu gràficu",
     "skin-preview": "antiprimma",
     "datedefault": "Nisciuna prifirènzia",
-    "prefs-datetime": "Data e ora",
     "prefs-personal": "Profiru utenti",
     "prefs-rc": "Ulthimi mudìfigghi",
     "prefs-watchlist": "Abbaidaddi ippiziari",
     "upload-permitted": "Fuimmaddi di file autorizaddi: $1.",
     "upload-preferred": "Fuimmaddi di file prifiriddi: $1.",
     "upload-prohibited": "Fuimmaddi di file pruibbiddi: $1.",
-    "uploadlog": "File carriggaddi",
     "uploadlogpage": "Rigisthru di li file carriggaddi",
     "uploadlogpagetext": "Inogghi v'è l'erencu di l'ulthimi file cariggaddi.",
     "filename": "Innòmu di lu file",
     "fileuploadsummary": "Dettàgli di lu file:",
     "filestatus": "Infuimmazioni i' lu copyright:",
     "filesource": "Orìgini:",
-    "uploadedfiles": "Erencu di li file carriggaddi",
     "ignorewarning": "Ignora l'avvirthimentu e saivva cumenti si sia lu file",
     "ignorewarnings": "Ignora li imbasciaddi di avvirthimentu di lu sisthema",
     "minlength1": "Lu nommu di lu file débi assé cumposthu arumandu d'un caràtteri.",
     "emailuser": "Ischribì a l'utenti",
     "emailpage": "Invia un'imbasciadda di postha erettrònica a l'utenti",
     "emailpagetext": "Si l'utenti à registhraddu un'indirizzu di postha erettrònica vàriddu i' li propri prifirenzi, lu mòdulu in giossu cunsenti d'ischribelli una sora imbasciadda. L'indirizzu indicaddu i' li prifirenzi di lu mandanti apparirà i' lu campu \"Da:\" di l'imbasciadda pa cunsintì a  lu disthinatàriu l'eventuari rippostha.",
-    "usermailererror": "L'oggettu di l'imbasciadda à turraddu l'errori:",
     "defemailsubject": "Imbasciadda da {{SITENAME}}",
     "noemailtitle": "Nisciun indirizzu di postha erettrònica",
     "noemailtext": "Chistu utenti nò à indicaddu un'indirizzu postha erettrònica vàriddu, oppuru à sciubaraddu di nò rizzibì imbasciaddi di postha erettrònica da l'althri utenti.",
     "nowatchlist": "La listha di l'abbaidaddi ippiziari è biodda.",
     "watchlistanontext": "Pa visuarizzà e mudìfiggà l'erencu di l'abbaidaddi ippiziari è nezzessàriu $1.",
     "watchnologin": "Intradda nò effettuadda",
-    "watchnologintext": "Pa mudìfiggà la listha di l'abbaidaddi ippiziari è nezzessàriu primma [[Special:UserLogin|intrà]].",
     "addedwatchtext": "La pàgina  \"[[:$1]]\" è isthadda aggiunta a la propria [[Special:Watchlist|listha di l'abbaidaddi ippiziari]]. D'abà innanzi, tutti li mudìfigghi arriggaddi a la pàgina e a la sóia dischussioni sarani erencaddi in chidda listha; lu tìturu di la pàgina apparirà in '''grasseddu''' i' la pàgina\ndi l'[[Special:RecentChanges|ulthimi mudìfigghi]] pa rindiru più visìbiri.\n\nSi daboi s'à gana d'eliminà la pàgina da la listha di l'abbaidaddi ippiziarii, fà clic i' \"nò sighì\" i' la barra in althu.",
     "removedwatchtext": "La pàgina  \"[[:$1]]\" è isthadda eliminadda da la listha di l'abbaidaddi ippiziari.",
     "watch": "Sighi",
     "watchlist-options": "Opzioni abbaidaddi ippiziari",
     "watching": "Aggiunta a l'abbaidaddi ippiziari...",
     "unwatching": "Eliminazioni da l'abbaidaddi ippiziari...",
-    "enotif_mailer": "Sisthema di nutìfica via postha erettrònica di {{SITENAME}}",
     "enotif_reset": "Signa tutti li pàgini cumenti già visitaddi",
     "enotif_impersonal_salutation": "Utenti di {{SITENAME}}",
     "enotif_lastvisited": "Cunsultha $1 pa vidé tutti li mudìfigghi da l'ulthima visita tóia.",
     "excontent": "lu cuntinuddu era : '$1'",
     "excontentauthor": "lu cuntinuddu era: '$1' (e lu soru cuntributori era '[[Special:Contributions/$2|$2]]')",
     "exbeforeblank": "Lu cuntinuddu primma di l'ibbiuddamentu era: '$1'",
-    "exblank": "la pàgina era biodda",
     "delete-confirm": "Canzella \"$1\"",
     "delete-legend": "Canzella",
     "historywarning": "Attinzioni: La pàgina chi sei canzellendi à una cronologia:",
     "allmessagesname": "Nommu",
     "allmessagesdefault": "Testhu pridifiniddu",
     "allmessagescurrent": "Testhu attuari",
-    "allmessagestext": "Chistha è la listha di tutti l'imbasciaddi di sisthema dipunìbiri i' lu tipu di pàgina MediaWiki.\nPa piazeri utirizà [https://www.mediawiki.org/wiki/Localisation MediaWiki Lucarizazioni] e [//translatewiki.net translatewiki.net] pa l'althri traduzioni.",
+    "allmessagestext": "Chistha è la listha di tutti l'imbasciaddi di sisthema dipunìbiri i' lu tipu di pàgina MediaWiki.\nPa piazeri utirizà [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation MediaWiki Lucarizazioni] e [//translatewiki.net translatewiki.net] pa l'althri traduzioni.",
     "allmessagesnotsupportedDB": "Chistha pàgina nò è supporthadda parchí l'indicadori '''$wgUseDatabaseMessages''' nò è attibuu.",
     "allmessages-filter-unmodified": "Nò mudifiggaddi",
     "allmessages-filter-all": "Tutti",
     "importunknownsource": "Tipu d'orìgini ischunisciddu pa l'impurthazioni",
     "importcantopen": "Impussìbiri abbrì lu file d'impurthazioni",
     "importbadinterwiki": "Cullegamentu interwiki ibbagliaddu",
-    "importnotext": "Testhu bioddu o mancanti",
     "importsuccess": "Impurthazioni finidda!",
-    "importhistoryconflict": "La cronologia cunteni di li versioni in cuntrasthu (chistha pàgina pudia assé già isthadda impurthadda)",
     "importnosources": "Nò è isthadda difinidda un'origini pa l'impurthazioni transwiki; l'impurthazioni diretta di la cronologia nò è attiba.",
     "importnofile": "Nò è isthaddu cariggaddu nisciun file pa l'impurthazioni.",
     "importuploaderrorsize": "Carriggamentu di file pa l'impurthazioni nò ridisciddu. Lu file supara li misuri massimi cunsintiddi pa lu carriggamentu.",
index 4314c32..f44eb45 100644 (file)
     "currentevents-url": "Project:Âsango",
     "disclaimers": "Zïngö-lê",
     "disclaimerpage": "Project:Zïngö-lê",
-    "helppage": "Help:Münä",
     "mainpage": "Gä nzönî",
     "mainpage-description": "Gä nzönî",
     "portal": "Âsëwä",
index c501a77..81a5330 100644 (file)
     "accountcreatedtext": "Korisnički račun za $1 je kreiran. Кориснички налог за $1 је креиран.",
     "createaccount-title": "Pravljenje korisničkog računa za {{SITENAME}}",
     "createaccount-text": "Neko je napravio korisnički račun za vašu e-mail adresu na {{SITENAME}} ($4) sa imenom \"$2\", i sa šifrom \"$3\".\nTrebali biste se prijaviti i promjeniti šifru.\n\nMožete ignorisati ovu poruku, ako je korisnički račun napravljen greškom.",
-    "usernamehasherror": "Korisničko ime ne može sadržavati haš znakove",
     "login-throttled": "Previše puta ste se pokušali prijaviti.\nMolimo Vas da sačekate prije nego što pokušate ponovo.",
     "login-abort-generic": "Vaša prijava nije bila uspješna – Prekinuto",
     "loginlanguagelabel": "Jezik: $1",
     "suspicious-userlogout": "Vaš zahtjev za odjavu je odbijen jer je poslan preko pokvarenog preglednika ili keširanog proksija.",
+    "pt-login": "Prijavi me / Пријави ме",
+    "pt-login-button": "Prijavi me / Пријави ме",
+    "pt-createaccount": "Napraviti novi nalog / Направити нови налог",
     "pt-userlogout": "Odjavi se / Одјави се",
     "php-mail-error-unknown": "Nepoznata greška u PHP funkciji mail()",
     "user-mail-no-addy": "Pokušaj slanja e-maila bez e-mail adrese.",
     "prefs-skin": "Izgled (skin)",
     "skin-preview": "Pretpregled",
     "datedefault": "Bez preferenci",
-    "prefs-beta": "Beta mogućnosti",
-    "prefs-datetime": "Datum i vrijeme",
     "prefs-labs": "Eksperimentalne mogućnosti",
     "prefs-user-pages": "Korisničke stranice",
     "prefs-personal": "Korisnički profil",
     "upload-permitted": "Podržane vrste datoteka: $1.",
     "upload-preferred": "Preferirane vrste datoteka: $1.",
     "upload-prohibited": "Zabranjene vrste datoteka: $1.",
-    "uploadlog": "registar postavljanja",
     "uploadlogpage": "Registar postavljanja",
     "uploadlogpagetext": "Ispod je popis najnovijih postavljanja datoteka.\nVidi [[Special:NewFiles|galeriju novih datoteka]] za slikovitiji pregled.",
     "filename": "Ime fajla / Име датотеке",
     "filereuploadsummary": "Izmjene datoteke:",
     "filestatus": "Status autorskih prava:",
     "filesource": "Izvor / Извор",
-    "uploadedfiles": "Postavljene datoteke",
     "ignorewarning": "Zanemari upozorenja i sačuvaj datoteku",
     "ignorewarnings": "Zanemari sva upozorenja",
     "minlength1": "Ime datoteke mora imati barem jedno slovo.",
     "overwroteimage": "postavljena nova verzija datoteke \"[[$1]]\"",
     "uploaddisabled": "Slanje fajlova je isključeno",
     "copyuploaddisabled": "Postavljanje putem URL nije omogućeno.",
-    "uploadfromurl-queued": "Vaše postavljanje je na čekanju.",
     "uploaddisabledtext": "Postavljanje datoteka je onemogućeno.",
     "php-uploaddisabledtext": "Postavljanje datoteka preko PHP je onemogućeno. \nMolimo provjerite postavku za postavljanje datoteka.",
     "uploadscripted": "Ova datoteka sadrži HTML ili skriptni kod koji može izazvati grešku kod internet preglednika.",
     "upload-misc-error": "Nepoznata greška pri postavljanju",
     "upload-misc-error-text": "Desila se nepoznata greška pri postavljanju.\nMolimo Vas provjerite da li je URL tačan i dostupan pa pokušajte ponovo.\nAko se problem ne riješi, kontaktirajte [[Special:ListUsers/sysop|administratora]].",
     "upload-too-many-redirects": "URL sadrži previše preusmjerenja",
-    "upload-unknown-size": "Nepoznata veličina",
     "upload-http-error": "Desila se HTTP greška: $1",
     "upload-copy-upload-invalid-domain": "Kopije postavljanja nisu dostupni na ovom domenu.",
     "backend-fail-stream": "Ne mogu da emitujem datoteku $1.",
     "img-auth-streaming": "Tok \"$1\".",
     "img-auth-public": "Funkcija img_auth.php služi za izlaz datoteka sa privatnih wikija.\nOva wiki je postavljena kao javna wiki.\nZa optimalnu sigurnost, img_auth.php je onemogućena.",
     "img-auth-noread": "Korisnik nema pristup za čitanje \"$1\".",
-    "img-auth-bad-query-string": "URL ima nevaljan izraz upita.",
     "http-invalid-url": "Nevaljan URL: $1",
     "http-invalid-scheme": "URLovi za koje šema \"$1\" nije podržana",
     "http-request-error": "HTTP zahtjev nije uspio zbog nepoznate pogreške.",
     "filehist-dimensions": "Dimenzije",
     "filehist-filesize": "Veličina datoteke",
     "filehist-comment": "Komentar",
-    "filehist-missing": "Datoteka nedostaje",
     "imagelinks": "Upotreba datoteke",
     "linkstoimage": "{{PLURAL:$1|Sljedeća stranica koristi|Sljedećih $1 stranica koriste}} ovu sliku:",
     "linkstoimage-more": "Više od $1 {{PLURAL:$1|stranice povezuje|stranica povezuje}} na ovu datoteku.\nSlijedeći popis prikazuje {{PLURAL:$1|stranice koje|prvih $1 stranica koje}} vode na ovu datoteku.\n[[Special:WhatLinksHere/$2|Ovdje se nalazi]] potpuni popis.",
     "emailuser-title-notarget": "Slanje e-maila korisniku",
     "emailpage": "Pošalji e-mail ovom korisniku",
     "emailpagetext": "Možete da koristite donji obrazac da pošaljete e-mail {{GENDER:$1|ovom korisniku|ovoj korisnici|ovom korisniku|}}.\nE-mail koju ste uneli u vašim [[Special:Preferences|postavkama]] će se prikazati u polju \"Od:\", tako da će primalac moći da vam odgovori direktno.",
-    "usermailererror": "Objekat maila je vratio grešku:",
     "defemailsubject": "{{SITENAME}} e-mail od korisnika \"$1\"",
     "usermaildisabled": "Korisnički e-mail onemogućen",
     "usermaildisabledtext": "Ne možete poslati e-mail drugim korisnicima na ovoj wiki",
     "noemailtitle": "Nema adrese e-pošte",
     "noemailtext": "Ovaj korisnik nije naveo ispravnu adresu e-pošte.",
-    "nowikiemailtitle": "E-mail nije dozvoljen",
     "nowikiemailtext": "Ovaj korisnik je odabrao da ne prima e-mail poštu od drugih korisnika.",
     "emailnotarget": "Neodgovarajuće ili nevaljano korisničko ime za primanje e-maillova.",
     "emailtarget": "Unesite korisnika za primanje e-mailova",
     "nowatchlist": "Nemate ništa na svom spisku praćenih članaka.",
     "watchlistanontext": "Molimo da $1 da možete vidjeti ili urediti stavke na Vašem spisku praćenja.",
     "watchnologin": "Niste logovani / Нисте логовани",
-    "watchnologintext": "Morate da budete [[Special:Userlogin|prijavljeni]] da biste sređivali spisak praćenja.",
     "addwatch": "Dodaj u popis praćenja",
     "addedwatchtext": "Stranica \"[[:$1]]\" je dodata vašem [[Special:Watchlist|spisku praćenih članaka]]. \nBuduće promjene ove stranice i njoj pridružene stranice za razgovor će biti navedene ovde.",
     "removewatch": "Ukloni sa spiska praćenja",
     "watching": "Pratim... / Додавање на списак надгледања...",
     "unwatching": "Ne pratim…",
     "watcherrortext": "Desila se greška pri promjeni postavki vašeg spiska praćenja za \"$1\".",
-    "enotif_mailer": "{{SITENAME}} obavještenje o pošti",
     "enotif_reset": "Označi sve strane kao posjećene",
     "enotif_impersonal_salutation": "{{SITENAME}} korisnik",
     "enotif_subject_deleted": "{{SITENAME}} stranicu $1 {{gender:|je izbrisao|je izbrisala|je izbrisao}} $2",
     "excontent": "sadržaj je bio: '$1'",
     "excontentauthor": "sadržaj je bio: '$1' (i jedini korisnik koji je mijenjao bio je '[[Special:Contributions/$2|$2]]')",
     "exbeforeblank": "sadržaj prije brisanja je bio: '$1'",
-    "exblank": "stranica je bila prazna",
     "delete-confirm": "Brisanje \"$1\"",
     "delete-legend": "Obriši",
     "historywarning": "'''Upozorenje''':  Stranica koju želite da obrišete ima historiju sa otprilike $1 {{PLURAL:$1|revizijom|revizije|revizija}}:",
     "allmessagesname": "Naziv",
     "allmessagesdefault": "Uobičajeni tekst",
     "allmessagescurrent": "Trenutni tekst",
-    "allmessagestext": "Ovo je spisak svih sistemskih poruka u dostupnih u MediaWiki imenskom prostoru.\nMolimo posjetite [https://www.mediawiki.org/wiki/Localisation MediaWiki lokalizaciju] i [//translatewiki.net translatewiki.net] ako želite doprinijeti općoj lokalizaciji MediaWikija.",
+    "allmessagestext": "Ovo je spisak svih sistemskih poruka u dostupnih u MediaWiki imenskom prostoru.\nMolimo posjetite [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation MediaWiki lokalizaciju] i [//translatewiki.net translatewiki.net] ako želite doprinijeti općoj lokalizaciji MediaWikija.",
     "allmessagesnotsupportedDB": "Ova stranica ne može biti korištena jer je '''$wgUseDatabaseMessages''' isključen.",
     "allmessages-filter-legend": "Filter",
     "allmessages-filter": "Filter po stanju podešavanja:",
     "importunknownsource": "Nepoznat izvorni tip uvoza",
     "importcantopen": "Ne može se otvoriti uvozna datoteka",
     "importbadinterwiki": "Loš interwiki link",
-    "importnotext": "Prazan ili nepostojeći tekst",
     "importsuccess": "Uvoz dovršen!",
-    "importhistoryconflict": "Postoji konfliktna historija revizija (moguće je da je ova stranica ranije uvezena)",
     "importnosources": "Nisu definirani izvori za transwiki uvoz i neposredna postavljanja historije su onemogućena.",
     "importnofile": "Uvozna datoteka nije postavljena.",
     "importuploaderrorsize": "Postavljanje uvozne datoteke nije uspjelo.\nDatoteka je veća od dozvoljene veličine za postavljanje.",
index c91a98a..cb518a0 100644 (file)
     "prefs-skin": "ඡවිය",
     "skin-preview": "පෙරදසුන",
     "datedefault": "අභිරුචියක් නොමැත",
-    "prefs-beta": "බීටා අනුවාදයේ ලක්ෂණ",
     "prefs-datetime": "දිනය සහ වේලාව",
     "prefs-labs": "Labs features",
     "prefs-user-pages": "පරිශීලක පිටු",
     "nowatchlist": "ඔබගේ මුර-ලැයිස්තුවේ කිසිදු අයිතමයක් නොමැත.",
     "watchlistanontext": "ඔබගේ මුර-ලැයිස්තුවෙහි අයිතම නැරඹීමට හෝ සංස්කරණය කිරීමට හෝ කරුණාකර $1 සපුරන්න.",
     "watchnologin": "ප්‍රවිෂ්ට වී නොමැත",
-    "watchnologintext": "ඔබගේ මුරලැයිස්තුව විකරණය කිරීමට පෙරාතුව ඔබ [[Special:UserLogin|ප්‍රවිෂ්ට වී]] සිටිය යුතුය.",
     "addwatch": "මුර ලැයිස්තුවට එක් කරන්න",
     "addedwatchtext": "\"[[:$1]]\" පිටුව ඔබගේ [[Special:Watchlist|මුර-ලැයිස්තුවට]] එක් කොට ඇත.\nමෙම පිටුවට සහ එයට අදාළ සාකච්ඡා පිටුවට ඉදිරියෙහිදී සිදු කෙරෙන වෙනස්කිරීම් ලයිස්තුගත වන අතර, ‍තෝරාගැනීමේගැනීමෙහි පහසුව තකා,  [[Special:RecentChanges|මෑත වෙනස්වීම් ලැයිස්තුව]]  තුල මෙම පිටුව  '''තදකුරු''' වලින් දක්වනු ඇත.",
     "removewatch": "මුරලැයිස්තුවෙන් ඉවත් කරන්න",
     "allmessagesname": "නම",
     "allmessagesdefault": "සාමාන්‍ය පණිවුඩ පෙළ",
     "allmessagescurrent": "වත්මන් පෙළ",
-    "allmessagestext": "මේ මාධ්‍යවිකි නාමඅවකාශයෙහිදී  හමුවන පද්ධති පණිවුඩයන් ලැයිස්තුවකි.\nවර්ගීය මාධ්‍යවිකි ප්‍රාදේශීයකරණයට දායක වීමට ඔබ රිසි නම් කරුණාකර [https://www.mediawiki.org/wiki/Localisation මාධ්‍යවිකි ප්‍රාදේශීයකරණය]  සහ [//translatewiki.net බීටාවිකි] වෙත පිවිසෙන්න.",
+    "allmessagestext": "මේ මාධ්‍යවිකි නාමඅවකාශයෙහිදී  හමුවන පද්ධති පණිවුඩයන් ලැයිස්තුවකි.\nවර්ගීය මාධ්‍යවිකි ප්‍රාදේශීයකරණයට දායක වීමට ඔබ රිසි නම් කරුණාකර [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation මාධ්‍යවිකි ප්‍රාදේශීයකරණය]  සහ [//translatewiki.net බීටාවිකි] වෙත පිවිසෙන්න.",
     "allmessagesnotsupportedDB": "'''$wgUseDatabaseMessages''' අක්‍රීය කොට ඇති බැවින්, මෙම පිටුව භාවිතා කල නොහැක.",
     "allmessages-filter-legend": "පෙරහන",
     "allmessages-filter": "පාරිභෝගීකරණ තත්ත්වය අනුව පෙරීම:",
index ab06009..d12f3a5 100644 (file)
     "permalink": "Trvalý odkaz",
     "print": "Tlač",
     "view": "Zobraziť",
+    "view-foreign": "Prehliadnuť na {{GRAMMAR:lokál|$1}}",
     "edit": "upraviť",
+    "edit-local": "Upraviť miestny popis",
     "create": "Vytvoriť",
+    "create-local": "Pridať miestny popis",
     "editthispage": "Upraviť túto stránku",
     "create-this-page": "Vytvoriť túto stránku",
     "delete": "Vymazať",
     "pool-timeout": "Bol prekročený vyhradený čas čakania na zámok",
     "pool-queuefull": "Front je plný",
     "pool-errorunknown": "Neznáma chyba",
+    "pool-servererror": "Služba riadiaca prístup k serverom nieje dostupná ($1).",
     "aboutsite": "O {{GRAMMAR:lokál|{{SITENAME}}}}",
     "aboutpage": "Project:Úvod",
     "copyright": "Obsah je dostupný pod $1, pokiaľ nie je uvedené inak.",
     "invalidtitle-unknownnamespace": "Neplatný názov s neznámym číslom menného priestoru „$1“ a textom „$2“",
     "exception-nologin": "Nie ste prihlásený",
     "exception-nologin-text": "Táto stránka alebo operácia vyžaduje, aby ste [[Special:Userlogin|boli prihlásený]].",
+    "exception-nologin-text-manual": "Pre prístup na túto stránku alebo k tejto akcii sa musíte $1.",
     "virus-badscanner": "Chybná konfigurácia: neznámy antivírus: ''$1''",
     "virus-scanfailed": "kontrola zlyhala (kód $1)",
     "virus-unknownscanner": "neznámy antivírus:",
     "gotaccountlink": "Prihlásiť",
     "userlogin-resetlink": "Zabudli ste svoje prihlasovacie údaje?",
     "userlogin-resetpassword-link": "Zabudli ste heslo?",
+    "userlogin-helplink2": "Pomoc s prihlásením",
     "userlogin-loggedin": "Ste už {{GENDER:$1|prihĺasený|prihlásená}} ako $1.\nPomocou formulára nižšie sa môžete prihlásiť ako iný redaktor.",
     "userlogin-createanother": "Vytvoriť ďalší účet",
     "createacct-join": "Vyplňte svoje údaje.",
     "createacct-imgcaptcha-ph": "Zadajte text, ktorý vidíte vyššie",
     "createacct-submit": "Vytvoriť účet",
     "createacct-another-submit": "Vytvoriť ďalší účet",
-    "createacct-benefit-heading": "{{grammar:4sg|{{SITENAME}}}} tvoria ľudia ako vy.",
+    "createacct-benefit-heading": "{{GRAMMAR:akuzatív|{{SITENAME}}}} tvoria ľudia ako vy.",
     "createacct-benefit-body1": "{{PLURAL:$1|úprava|úpravy|úprav}}",
     "createacct-benefit-body2": "{{PLURAL:$1|stránka|stránky|stránok}}",
     "createacct-benefit-body3": "{{PLURAL:$1|nedávny prispievateľ|nedávni prispievatelia|nedávnych prispievateľov}}",
     "accountcreatedtext": "Používateľský účet [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|diskusia]]) bol vytvorený.",
     "createaccount-title": "Vytvorenie účtu na {{GRAMMAR:lokál|{{SITENAME}}}}",
     "createaccount-text": "Niekto vytvoril účet pre vašu emailovú adresu na {{GRAMMAR:lokál|{{SITENAME}}}}\n($4) s názvom „$2“, s heslom „$3“. Mali by ste sa prihlásiť a svoje heslo teraz zmeniť.\n\nAk bol účet vytvorený omylom, túto správu môžete ignorovať.",
-    "usernamehasherror": "Používateľské meno nemôže obsahovať znak mriežky.",
     "login-throttled": "Uskutočnili ste príliš mnoho neúspešných pokusov o prihlásenie.\nProsím, počkajte $1 predtým, než to skúsite znova.",
     "login-abort-generic": "Vaše prihlásenie nebolo úspešné - zrušené",
     "loginlanguagelabel": "Jazyk: $1",
     "resetpass-submit-cancel": "Zrušiť",
     "resetpass-wrong-oldpass": "Neplatné dočasné alebo aktuálne heslo.\nJe možné, že sa vám už podarilo úspešne zmeniť svoje heslo alebo ste si vyžiadali nové dočasné heslo.",
     "resetpass-recycled": "Ako nové heslo si prosím nastavte niečo iné než súčasné heslo.",
+    "resetpass-temp-emailed": "Prihlasujete sa dočasným heslom, zaslaným e-mailom. Aby ste dokončili prihlásenie, nastavte si tu nové heslo:",
     "resetpass-temp-password": "Dočasné heslo:",
     "resetpass-abort-generic": "Zmena hesla bola zablokovaná rozšírením.",
+    "resetpass-expired": "Platnosť vášho hesla vypršala. Pre prihlásenie si nastavte nové heslo.",
     "passwordreset": "Reset hesla",
     "passwordreset-text-one": "Pre získanie nového hesla vyplňte tento formulár.",
     "passwordreset-text-many": "{{PLURAL:$1|Pre získanie nového hesla zadajte jeden z údajov.}}",
     "prefs-skin": "Vzhľad",
     "skin-preview": "Náhľad",
     "datedefault": "štandardný",
-    "prefs-beta": "Nové funkcie",
-    "prefs-datetime": "Dátum a čas",
     "prefs-labs": "Laboratórne funkcie",
     "prefs-user-pages": "Stránky používateľa",
     "prefs-personal": "Profil",
     "upload-permitted": "Povolené typy súborov: $1.",
     "upload-preferred": "Uprednostňované typy súborov: $1.",
     "upload-prohibited": "Zakázané typy súborov: $1.",
-    "uploadlog": "Záznam nahrávaní",
     "uploadlogpage": "Záznam nahrávaní",
     "uploadlogpagetext": "Nižšie je zoznam nedávno nahraných súborov.\nVizuálny prehľad nájdete v [[Special:NewFiles|galérii novo nahraných súborov]].",
     "filename": "Názov súboru",
     "filereuploadsummary": "Zmeny súboru:",
     "filestatus": "Stav autorských práv:",
     "filesource": "Zdroj:",
-    "uploadedfiles": "Nahrané súbory",
     "ignorewarning": "Ignorovať varovanie a súbor napriek tomu uložiť",
     "ignorewarnings": "Ignorovať všetky varovania",
     "minlength1": "Názvy súborov musia mať aspoň jedno písmeno.",
     "overwroteimage": "bola nahraná nová verzia „[[$1]]“",
     "uploaddisabled": "Prepáčte, nahrávanie je vypnuté.",
     "copyuploaddisabled": "Nahrávanie prostredníctvom URL nie je povolené.",
-    "uploadfromurl-queued": "Súbor, ktorý ste dali nahrať bol uložený do fronty.",
     "uploaddisabledtext": "Nahrávanie súborov je vypnuté.",
     "php-uploaddisabledtext": "Nahrávanie PHP súborov je vypnuté. Prosím, skontrolujte nastavenie file_uploads.",
     "uploadscripted": "Tento súbor obsahuje kód HTML alebo skript, ktorý može byť chybne interpretovaný prehliadačom.",
     "upload-misc-error": "Neznáma chyba pri nahrávaní",
     "upload-misc-error-text": "Počas nahrávania sa vyskytla neznáma chyba.\nProsím, overte, že URL je platný a dostupný a skúste znova.\nAk problém pretrváva, kontaktujte [[Special:ListUsers/sysop|správcu systému]].",
     "upload-too-many-redirects": "URL obsahoval príliš mnoho presmerovaní",
-    "upload-unknown-size": "Neznáma veľkosť",
     "upload-http-error": "Vyskytla sa chyba HTTP: $1",
     "upload-copy-upload-invalid-domain": "Kopírovanie nahraných súborov nie je dostupné z tejto domény.",
     "backend-fail-stream": "$1 je názov súboru.",
     "img-auth-streaming": "Streamovanie „$1“.",
     "img-auth-public": "Funkciou img_auth.php je výstup súborov zo súkromnej wiki.\nNastavená wiki je verejná.\nAby bolo zabezpečenie optimálne, img_auth.php je vypnutý.",
     "img-auth-noread": "Používateľ nemá prístup na čítanie „$1“.",
-    "img-auth-bad-query-string": "URL má neplatný reťazec požiadavky.",
     "http-invalid-url": "Neplatný URL: $1",
     "http-invalid-scheme": "URL so schémou „$1“ nie sú podporované",
     "http-request-error": "Požiadavka HTTP zlyhala z neznámych dôvodov.",
     "filehist-dimensions": "rozmery",
     "filehist-filesize": "veľkosť súboru",
     "filehist-comment": "komentár",
-    "filehist-missing": "Súbor chýba",
     "imagelinks": "Použitie súboru",
     "linkstoimage": "Na tento obrázok {{PLURAL:$1|odkazuje nasledujúca stránka|odkazujú nasledujúce $1 stránky|odkazuje nasledujúcich $1 stránok}}:",
     "linkstoimage-more": "Viac ako $1 {{PLURAL:$1|stránka odkazuje|stránky odkazujú|stránok odkazuje}} na tento súbor.\nNasledovný zoznam zobrazuje {{PLURAL:$1|prvú stránku odkazujúcu|prvé $1 stránky odkazujúce|prvých $1 stránok odkazujúcich}} iba na tento súbor.\nMôžete si pozrieť [[Special:WhatLinksHere/$2|úplný zoznam]].",
     "listgrouprights-removegroup-self": "Z vlastného účtu je možné odstrániť {{PLURAL:$2|skupinu|skupiny}}: $1",
     "listgrouprights-addgroup-self-all": "Do vlastného účtu je možné pridať všetky skupiny",
     "listgrouprights-removegroup-self-all": "Z vlastného účtu je možné odstrániť všetky skupiny",
+    "trackingcategories-msg": "Sledovacia kategória",
+    "trackingcategories-name": "Názov správy",
+    "trackingcategories-desc": "Kritériá pre zaradenie do kategórie",
+    "trackingcategories-nodesc": "Popis nie je k dispozícii.",
+    "trackingcategories-disabled": "Kategória je vypnutá",
     "mailnologin": "Žiadna adresa na zaslanie",
     "mailnologintext": "Musíte byť [[Special:UserLogin|prihlásený]] a mať platnú e-mailovú adresu vo vašich [[Special:Preferences|nastaveniach]], aby ste mohli iným používateľom posielať e-maily.",
     "emailuser": "E-mail tomuto používateľovi",
     "emailuser-title-notarget": "E-mail používateľovi",
     "emailpage": "E-mail používateľovi",
     "emailpagetext": "Pomocou nasledovného formulára môžete {{GENDER:$1|tomuto používateľovi|tejto používateľke}} poslať e-mailovú správu.\nMailová adresa, ktorú ste zadali vo svojich [[Special:Preferences|nastaveniach]] sa zobrazí ako adresa odosielateľa mailu, aby vám mohol príjemca priamo odpovedať.",
-    "usermailererror": "Emailový program vrátil chybu:",
     "defemailsubject": "email {{GRAMMAR:genitív|{{SITENAME}}}} od používateľa „$1“",
     "usermaildisabled": "Používateľ má vypnuté používanie emailu",
     "usermaildisabledtext": "Nemôžete posielať emaily ostatným používateľom na tejto wiki",
     "noemailtitle": "Chýba e-mailová adresa",
     "noemailtext": "Tento používateľ neuviedol svoju platnú e-mailovú adresu.",
-    "nowikiemailtitle": "Posielanie emailov nie je umožnené",
     "nowikiemailtext": "Tento používateľ sa rozhodol, že si neželá prijímať emaily od ostatných používateľov.",
     "emailnotarget": "Neexistujúce alebo neplatné používateľské meno príjemcu.",
     "emailtarget": "Zadajte používateľské meno príjemcu",
     "nowatchlist": "V zozname sledovaných stránok nemáte žiadne položky.",
     "watchlistanontext": "Prosím $1 pre prezeranie alebo úpravu vášho zoznamu sledovaných stránok.",
     "watchnologin": "Nie ste prihlásený/á",
-    "watchnologintext": "Musíte byť [[Special:UserLogin|prihlásený/á]], aby ste mohli modifikovať vaše sledované stránky.",
     "addwatch": "Pridať do zoznamu sledovaných stránok",
     "addedwatchtext": "Stránka „[[:$1]]“ bola pridaná do vášho zoznamu [[Special:Watchlist|sledovaných stránok]].\nBudú tam uvedené aj budúce úpravy tejto stránky a jej diskusie.",
     "removewatch": "Odstrániť zo zoznamu sledovaných",
     "watching": "Pridávam do zoznamu sledovaných...",
     "unwatching": "Odoberám zo zoznamu sledovaných...",
     "watcherrortext": "Vyskytla sa chyba počas zmeny nastavenia vášho zoznamu sledovaných pre „$1“.",
-    "enotif_mailer": "Upozorňovač {{GRAMMAR:genitív|{{SITENAME}}}}",
     "enotif_reset": "Označiť všetky stránky ako „navštívené“",
     "enotif_impersonal_salutation": "používateľ {{GRAMMAR:genitív|{{SITENAME}}}}",
     "enotif_subject_deleted": "Stránku {{GENDER:genitív|{{SITENAME}}}} „$1“ odstránil používateľ $2",
     "excontent": "obsah bol: „$1“",
     "excontentauthor": "obsah bol: „$1“ (a jediný autor bol [[Special:Contributions/$2]])",
     "exbeforeblank": "obsah pred vyčistením stránky bol: '$1'",
-    "exblank": "stránka bola prázdna",
     "delete-confirm": "Zmazať „$1“",
     "delete-legend": "Zmazať",
     "historywarning": "'''Upozornenie:''' Stránka, ktorú sa chystáte zmazať má históriu obsahujúcu približne $1 {{PLURAL:$1|revíziu|revízie|revízií}}:",
     "allmessagesname": "Názov",
     "allmessagesdefault": "štandardný text",
     "allmessagescurrent": "aktuálny text",
-    "allmessagestext": "Toto je zoznam všetkých správ dostupných v mennom priestore MediaWiki.\nProsím, navštívte [https://www.mediawiki.org/wiki/Localisation MediaWiki Localisation] a [//translatewiki.net translatewiki.net] ak chcete prispieť k všeobecnej lokalizácii MediaWiki.",
+    "allmessagestext": "Toto je zoznam všetkých správ dostupných v mennom priestore MediaWiki.\nProsím, navštívte [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation MediaWiki Localisation] a [//translatewiki.net translatewiki.net] ak chcete prispieť k všeobecnej lokalizácii MediaWiki.",
     "allmessagesnotsupportedDB": "Túto stránku nemožno použiť, pretože '''$wgUseDatabaseMessages''' je vypnuté.",
     "allmessages-filter-legend": "Filter",
     "allmessages-filter": "Filter podľa stavu prispôsobenia:",
     "importunknownsource": "Neznámy typ zdroja pre import",
     "importcantopen": "Nedal sa otvoriť súbor importu",
     "importbadinterwiki": "Zlý interwiki odkaz",
-    "importnotext": "Prázdny alebo žiadny text",
     "importsuccess": "Import dokončený!",
-    "importhistoryconflict": "Existujú konfliktné histórie revízií (možno už bola táto stránka importovaná)",
     "importnosources": "Neboli definované žiadne zdroje pre transwiki import a priame nahranie histórie je vypnuté.",
     "importnofile": "Nebol nahraný import súbor.",
     "importuploaderrorsize": "Nahranie alebo import súboru zlyhal. Súbor je väčší ako maximálna povolená veľkosť.",
index e73d2af..1bcb3a9 100644 (file)
@@ -1,6 +1,14 @@
 {
     "@metadata": {
-        "authors": []
+        "authors": [
+            "Dbc334",
+            "Eleassar",
+            "Freakolowsky",
+            "Matej1234",
+            "Smihael",
+            "Vadgt",
+            "Yerpo"
+        ]
     },
     "tog-underline": "Podčrtavanje povezav:",
     "tog-hideminor": "Skrij manjše popravke v zadnjih spremembah",
     "permalink": "Trajna povezava",
     "print": "Tisk",
     "view": "Ogled",
+    "view-foreign": "Ogled na: $1",
     "edit": "Uredi stran",
+    "edit-local": "Uredi lokalni opis",
     "create": "Ustvari",
+    "create-local": "Dodaj lokalni opis",
     "editthispage": "Uredi stran",
     "create-this-page": "Ustvari stran",
     "delete": "Briši",
     "pool-timeout": "Časovno obdobje čakanja na zaklep",
     "pool-queuefull": "Čakalna vrsta zaloge je polna",
     "pool-errorunknown": "Neznana napaka",
+    "pool-servererror": "Storitev založnega pulta ni na voljo ($1).",
     "aboutsite": "O {{GRAMMAR:dajalnik|{{SITENAME}}}}",
     "aboutpage": "Project:O {{GRAMMAR:dajalnik|{{SITENAME}}}}",
     "copyright": "Razen, kjer je navedeno drugače, je besedilo na razpolago pod pogoji licence $1.",
     "accountcreatedtext": "Ustvarili smo uporabniški račun za [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|pogovor]]).",
     "createaccount-title": "Ustvarjanje računa za {{GRAMMAR:tožilnik|{{SITENAME}}}}",
     "createaccount-text": "Nekdo je ustvaril račun $2 na {{GRAMMAR:dajalnik|{{SITENAME}}}} ($4). Geslo za »$2« je »$3«. Priporočljivo je, da se prijavite in spremenite svoje geslo sedaj.\n\nTo sporočilo lahko prezrete, če je bil račun ustvarjen pomotoma.",
-    "usernamehasherror": "Uporabniško ime ne sme vsebovati ''hash'' znakov",
     "login-throttled": "Nedavno ste izvedli preveč poskusov prijave.\nProsimo, počakajte $1, preden poskusite znova.",
     "login-abort-generic": "Vaša prijava ni bila uspešna – Prekinjeno",
     "loginlanguagelabel": "Jezik: $1",
     "prefs-skin": "Koža",
     "skin-preview": "Predogled",
     "datedefault": "Kakor koli",
-    "prefs-beta": "Betafunkcije",
-    "prefs-datetime": "Datum in čas",
     "prefs-labs": "Funkcije laboratorija",
     "prefs-user-pages": "Uporabniške strani",
     "prefs-personal": "Podatki o uporabniku",
     "upload-permitted": "Dovoljene vrste datotek: $1.",
     "upload-preferred": "Priporočene vrste datotek: $1.",
     "upload-prohibited": "Prepovedane vrste datotek: $1.",
-    "uploadlog": "dnevnik nalaganja",
     "uploadlogpage": "Dnevnik nalaganja datotek",
     "uploadlogpagetext": "Prikazan je seznam nedavno naloženih datotek.\nZa grafični pogled obiščite [[Special:NewFiles|galerijo novih datotek]].",
     "filename": "Ime datoteke",
     "filereuploadsummary": "Spremembe datoteke:",
     "filestatus": "Položaj avtorskih pravic:",
     "filesource": "Vir:",
-    "uploadedfiles": "Naložene datoteke",
     "ignorewarning": "Naloži kljub opozorilu",
     "ignorewarnings": "Prezri vsa opozorila",
     "minlength1": "Imena datotek morajo biti dolga vsaj eno črko.",
     "overwroteimage": "je naložil(-a) novo različico datoteke »[[$1]]«",
     "uploaddisabled": "Nalaganje je onemogočeno",
     "copyuploaddisabled": "Nalaganje preko URL je onemogočeno",
-    "uploadfromurl-queued": "Vaše nalaganje je bilo postavljeno v čakalno vrsto.",
     "uploaddisabledtext": "Nalaganje datotek je onemogočeno.",
     "php-uploaddisabledtext": "Nalaganje datotek je onemogočeno v PHP.\nProsimo preverite file_uploads nastavitev.",
     "uploadscripted": "Datoteka vsebuje HTML- ali skriptno kodo, ki bi jo lahko brskalnik razlagal napačno.",
     "upload-misc-error": "Neznana napaka pri nalaganju",
     "upload-misc-error-text": "Med nalaganjem je prišlo do neznane napake.\nProsimo, preverite veljavnost in dostopnost naslova URL ter poskusite ponovno.\nČe se težava ponavlja, kontaktirajte [[Special:ListUsers/sysop|administratorja]].",
     "upload-too-many-redirects": "URL vsebuje preveč preusmeritev",
-    "upload-unknown-size": "neznana velikost",
     "upload-http-error": "Prišlo je do napake HTTP: $1",
     "upload-copy-upload-invalid-domain": "Nalaganje kopij s te domene ni možno.",
     "backend-fail-stream": "Ne morem pretakati datoteke $1.",
     "img-auth-streaming": "Pretakanje »$1«.",
     "img-auth-public": "Funkcija img_auth.php je izvoz datotek iz zasebnega wikija.\nTa wiki je konfiguriran kot javni wiki.\nZa optimalno varnost je img_auth.php onemogočen.",
     "img-auth-noread": "Uporabnik nima dostopa za branje »$1«.",
-    "img-auth-bad-query-string": "URL ima neveljavni niz poizvedbe.",
     "http-invalid-url": "Napačen URL: $1",
     "http-invalid-scheme": "URL-naslovi s shemo »$1« niso podprti.",
     "http-request-error": "Zahteva HTTP ni uspela zaradi neznane napake.",
     "filehist-dimensions": "Velikost",
     "filehist-filesize": "Velikost datoteke",
     "filehist-comment": "Komentar",
-    "filehist-missing": "Datoteka manjka",
     "imagelinks": "Uporaba datoteke",
     "linkstoimage": "Datoteka je del {{PLURAL:$1|naslednje $1 strani|naslednjih $1 strani}} {{GRAMMAR:rodilnik|{{SITENAME}}}}:",
     "linkstoimage-more": "Na to datoteko se {{PLURAL:$1|povezuje več kot $1 stran|povezujeta več kot $1 strani|povezujejo več kot $1 strani|povezuje več kot $1 strani}}.\nNaslednji seznam obsega samo {{PLURAL:$1|prvo stran, ki se povezuje|prvi $1 strani, ki se povezujeta|prve $1 strani, ki se povezujejo|prvih $1 strani, ki se povezujejo}} na datoteko.\nNa razpolago je tudi [[Special:WhatLinksHere/$2|popoln seznam]].",
     "listgrouprights-removegroup-self": "Odstranitev svojega računa iz {{PLURAL:$2|skupine|skupin}}: $1",
     "listgrouprights-addgroup-self-all": "Lastni račun dodaj v vse skupine",
     "listgrouprights-removegroup-self-all": "Lastni račun odstrani iz vseh skupin",
+    "listgrouprights-namespaceprotection-header": "Omejitve imenskih prostorov",
+    "listgrouprights-namespaceprotection-namespace": "Imenski prostor",
+    "listgrouprights-namespaceprotection-restrictedto": "Pravice, ki uporabniku omogočajo urejanje",
+    "trackingcategories": "Sledilne kategorije",
+    "trackingcategories-summary": "Stran navaja sledilne kategorije, ki jih samodejno napolni programje MediaWiki. Njihova imena lahko spremenite s spreminjanjem ustreznih sistemskih sporočil v imenskem prostoru {{ns:8}}.",
+    "trackingcategories-msg": "Sledilna kategorija",
+    "trackingcategories-name": "Ime sporočila",
+    "trackingcategories-desc": "Merila za vključitev v kategorijo",
+    "noindex-category-desc": "Stran vsebuje čarobno besedo <code><nowiki>__NOINDEX__</nowiki></code> (in je v imenskem prostoru, ki dovoljuje to oznako) in posledično je roboti ne indeksirajo.",
+    "index-category-desc": "Stran vsebuje čarobno besedo <code><nowiki>__INDEX__</nowiki></code> (in je v imenskem prostoru, ki dovoljuje to oznako) in posledično jo roboti indeksirajo, čeprav je drugače ne bi.",
+    "post-expand-template-inclusion-category-desc": "Po razširitvi vseh predlog je velikost strani več kot <code>$wgMaxArticleSize</code>, zato nekaterih predlog nismo razširili.",
+    "post-expand-template-argument-category-desc": "Po razširitvi argumentov predloge (nekaj v trojnih narekovajih, npr. <code>{{{Foo}}})</code> je stran večja od <code>$wgMaxArticleSize</code>.",
+    "expensive-parserfunction-category-desc": "Stran vsebuje preveč dragih razčlenitvenih funkcij (npr. <code>#ifexist</code>). Glejte [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit Manual:$wgExpensiveParserFunctionLimit].",
+    "broken-file-category-desc": "Kategorijo smo dodali, če stan vsebuje pokvarjeno povezavo na datoteko (povezavo na vključeno datoteko, ki ne obstaja).",
+    "hidden-category-category-desc": "To je kategorija s <code><nowiki>__HIDDENCAT__</nowiki></code>, kar ji preprečuje, da se po privzetem prikazuje v okvirju s povezavami na kategorije strani.",
+    "trackingcategories-nodesc": "Opis ni na voljo.",
+    "trackingcategories-disabled": "Kategorija je onemogočena",
     "mailnologin": "Manjka naslov pošiljatelja",
     "mailnologintext": "Za pošiljanje e-pošte drugim uporabnikom se [[Special:UserLogin|prijavite]] in v [[Special:Preferences|nastavitvah]] vpišite veljaven e-poštni naslov.",
     "emailuser": "Pošlji uporabniku e-pismo",
     "emailuser-title-notarget": "Pošlji uporabniku e-pismo",
     "emailpage": "Pošlji uporabniku e-pismo",
     "emailpagetext": "S spodnjim obrazcem lahko {{GENDER:$1|uporabniku|uporabnici}} pošljete e-poštno sporočilo.\nE-poštni naslov, ki ste ga vpisali v [[Special:Preferences|uporabniških nastavitvah]], bo v e-sporočilu naveden kot naslov »Od:«, tako da bo {{GENDER:$1|prejemnik lahko odgovoril|prejemnica lahko odgovorila}} neposredno vam.",
-    "usermailererror": "Predmet e-pošte je vrnil napako:",
     "defemailsubject": "Elektronska pošta {{GRAMMAR:rodilnik|{{SITENAME}}}} od uporabnika »$1«",
     "usermaildisabled": "Uporabniška e-pošta je onemogočena",
     "usermaildisabledtext": "Na tem wikiju ne morete poslati e-pošte drugim uporabnikom",
     "noemailtitle": "Ni e-poštnega naslova",
     "noemailtext": "Uporabnik ni navedel veljavnega e-poštnega naslova.",
-    "nowikiemailtitle": "E-pošta ni dovoljena",
     "nowikiemailtext": "Ta uporabnik se je odločil, da ne bo prejmal e-pošte od drugih uporabnikov.",
     "emailnotarget": "Neobstoječe ali neveljavno uporabniško ime prejemnika.",
     "emailtarget": "Vnesite uporabniško ime prejemnika",
     "nowatchlist": "Vaš spisek nadzorov je prazen.",
     "watchlistanontext": "Za pregled ali urejanje vsebine vašega spiska nadzorov se morate $1.",
     "watchnologin": "Niste prijavljeni",
-    "watchnologintext": "Za urejanje spiska nadzorov morate biti [[Special:UserLogin|prijavljeni]].",
     "addwatch": "Dodaj na spisek nadzorov",
     "addedwatchtext": "Stran »[[:$1]]« je bila dodana na vaš [[Special:Watchlist|spisek nadzorov]].\nTam bodo navedene prihodnje spremembe te strani in pripadajoče pogovorne strani.",
     "removewatch": "Odstrani s spiska nadzorov",
     "unwatchthispage": "Prenehaj opazovati stran",
     "notanarticle": "Ni članek",
     "notvisiblerev": "Redakcija je bila izbrisana",
-    "watchlist-details": "Spremljate $1 {{PLURAL:$1|stran|strani|strani|strani|strani}} (pogovorne strani niso vštete).",
+    "watchlist-details": "Na vašem spisku nadzorov je $1 {{PLURAL:$1|stran|strani|strani}}; pogovorne strani niso štete posebej.",
     "wlheader-enotif": "Obveščanje po elektronski pošti je omogočeno.",
     "wlheader-showupdated": "Strani, spremenjene od vašega zadnjega ogleda, so prikazane '''krepko'''.",
     "watchmethod-recent": "med nedavnimi urejanji iščem spremljane strani",
     "watching": "Nadziranje ...",
     "unwatching": "Nenadziranje ...",
     "watcherrortext": "Med spreminjanjem vaših nastavitev spiska nadzora za »$1« je prišlo do napake.",
-    "enotif_mailer": "Obvestilni poštar {{GRAMMAR:rodilnik|{{SITENAME}}}}",
     "enotif_reset": "Označi vse strani kot prebrane",
     "enotif_impersonal_salutation": "Uporabnik {{GRAMMAR:rodilnik|{{SITENAME}}}}",
     "enotif_subject_deleted": "{{GENDER:$2|Uporabnik|Uporabnica}} $2 je {{GENDER:$2|izbrisal|izbrisala}} stran $1 v {{GRAMMAR:dajalnik|{{SITENAME}}}}",
     "excontent": "vsebina: '$1'",
     "excontentauthor": "vsebina: '$1' (edini urejevalec pa '$2')",
     "exbeforeblank": "vsebina pred brisanjem: '$1'",
-    "exblank": "prazna stran",
     "delete-confirm": "Brisanje »$1«",
     "delete-legend": "Izbriši",
     "historywarning": "'''Opozorilo:''' Stran, ki jo želite izbrisati, ima zgodovino s približno $1 {{PLURAL:$1|redakcijo|redakcijama|redakcijami}}:",
     "contributions-title": "Prispevki uporabnika $1",
     "mycontris": "Prispevki",
     "contribsub2": "Za {{GENDER:$3|$1}} ($2)",
+    "contributions-userdoesnotexist": "Uporabniški račun »$1« ni registriran.",
     "nocontribs": "Ne najdem nobene merilom ustrezajoče spremembe.",
     "uctop": "(trenutno)",
     "month": "Od meseca (in prej):",
     "sp-contributions-newbies-sub": "Prispevki novincev",
     "sp-contributions-newbies-title": "Uporabniški prispevki novih računov",
     "sp-contributions-blocklog": "dnevnik blokiranja",
+    "sp-contributions-suppresslog": "zatrti uporabnikovi prispevki",
     "sp-contributions-deleted": "izbrisani uporabnikovi prispevki",
     "sp-contributions-uploads": "naložene datoteke",
     "sp-contributions-logs": "dnevniki",
     "sp-contributions-blocked-notice": "Ta uporabnik je trenutno blokiran.\nNajnovejši vnos v dnevniku blokad je naveden spodaj:",
     "sp-contributions-blocked-notice-anon": "Ta IP-naslov je trenutno blokiran.\nNajnovejši vnos v dnevniku blokad je naveden spodaj:",
     "sp-contributions-search": "Išči prispevke",
-    "sp-contributions-suppresslog": "zatrti uporabnikovi prispevki",
     "sp-contributions-username": "IP-naslov ali uporabniško ime:",
     "sp-contributions-toponly": "Prikaži samo vrhnje redakcije",
     "sp-contributions-newonly": "Prikaži samo urejanja, ki so ustvarila nove strani",
     "allmessagesname": "Ime",
     "allmessagesdefault": "Prednastavljeno besedilo",
     "allmessagescurrent": "Trenutno besedilo",
-    "allmessagestext": "Navedena so v imenskem prostoru MediaWiki dostopna sistemska sporočila.\nZa lokalizacijo in prevajanje obiščite [https://www.mediawiki.org/wiki/Localisation MediaWiki] in [//translatewiki.net translatewiki.net] ter tako prispevajte k splošnemu prevodu programja.",
+    "allmessagestext": "Navedena so v imenskem prostoru MediaWiki dostopna sistemska sporočila.\nZa lokalizacijo in prevajanje obiščite [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation MediaWiki] in [//translatewiki.net translatewiki.net] ter tako prispevajte k splošnemu prevodu programja.",
     "allmessagesnotsupportedDB": "Te strani ni mogoče uporabljati, ker je bilo '''$wgUseDatabaseMessages''' izključeno.",
     "allmessages-filter-legend": "Filter",
     "allmessages-filter": "Filtriraj po prilagoditvenem stanju:",
     "importunknownsource": "Neznana vrsta vira uvoza",
     "importcantopen": "Neuspešno odpiranje uvožene datoteke",
     "importbadinterwiki": "Slaba jezikovna povezava",
-    "importnotext": "Prazno ali brez besedila",
     "importsuccess": "Uspešno uvoženo!",
-    "importhistoryconflict": "Zgodovina strani vključuje navzkrižno redakcijo (morda je bila stran naložena že prej)",
     "importnosources": "Na tem wikiju je ta možnost onemogočena.",
     "importnofile": "Uvožena ni bila nobena datoteka.",
     "importuploaderrorsize": "Nalaganje datoteke za uvoz ni uspelo.\nDatoteka je večja od dovoljene velikosti nalaganja.",
     "version-entrypoints": "URL-ji vstopnih točk",
     "version-entrypoints-header-entrypoint": "Vstopna točka",
     "version-entrypoints-header-url": "URL",
-    "version-entrypoints-articlepath": "[https://www.mediawiki.org/wiki/Manual:$wgArticlePath Pot članka]",
-    "version-entrypoints-scriptpath": "[https://www.mediawiki.org/wiki/Manual:$wgScriptPath Pot skripta]",
+    "version-entrypoints-articlepath": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgArticlePath Pot članka]",
+    "version-entrypoints-scriptpath": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgScriptPath Pot skripta]",
     "redirect": "Preusmeri po datoteki, uporabniku, strani ali ID-ju redakcije",
     "redirect-legend": "Preusmeritev na datoteko ali stran",
     "redirect-summary": "Posebna stran preusmeri na datoteko (če podate ime datoteke), stran (če podate ID redakcije ali ID strani) ali uporabniško stran (če podate številski ID uporabnika). Uporaba: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]] ali [[{{#Special:Redirect}}/user/101]].",
index 8c24a86..80a5d85 100644 (file)
     "nowatchlist": "Du host kenne Einträge uff denner Beobachtungsliste.",
     "watchlistanontext": "Du muoßt diech $1, im denne Beobachtungsliste zu sahn oder Einträge uff ihr zu bearbta.",
     "watchnologin": "Du best ne oagemeldet",
-    "watchnologintext": "Du muoßt [[Special:UserLogin|oagemeldet]] sei, im denne Beobachtungsliste bearbta zu kinna.",
     "addedwatchtext": "De Seite „<nowiki>$1</nowiki>“ wurde zu denner [[Special:Watchlist|Beobachtungsliste]] hinzugefiegt.\n\nSpätere Änneronga oa dieser Seite und der dazugeheeriga Dischkursseite waan durt gelistet und\nei der Iebersicht der [[Special:RecentChanges|letzta Änneronga]] ei Fettschrift dargestellt.\n\nWenn du de Seite wieder vu denner Beobachtungsliste entferna mechtest, klicke uff der jeweiligen Seite uff „nee meh beobachta“.",
     "removedwatchtext": "De Seite „[[:$1]]“ wurde vun denner [[Special:Watchlist|Beobachtungsliste]] entfernt.",
     "watch": "Beobachta",
     "export-pagelinks": "Verlinkte Seyta automatisch miet exportiera, bis zer Rekursionstiefe vu:",
     "allmessagesname": "Noame",
     "allmessagesdefault": "Standardtext",
-    "allmessagestext": "Dies ies anne Liste dar MediaWiki-Systemtexte.\nBesiche de Seyta [https://www.mediawiki.org/wiki/Localisation MediaWiki-Lokalisierung] und [//translatewiki.net translatewiki.net], wenn du diech oa dar Lokalisierung vu MediaWiki beteiliga mechtest.",
+    "allmessagestext": "Dies ies anne Liste dar MediaWiki-Systemtexte.\nBesiche de Seyta [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation MediaWiki-Lokalisierung] und [//translatewiki.net translatewiki.net], wenn du diech oa dar Lokalisierung vu MediaWiki beteiliga mechtest.",
     "allmessagesnotsupportedDB": "Diese Spezialseyte stieht ne zur Verfigung, do se ieber dann Parameter <tt>$wgUseDatabaseMessages</tt> deaktiviert wurde.",
     "allmessages-filter-all": "Olle",
     "allmessages-language": "Sproache:",
index b743f01..1a8edef 100644 (file)
     "disclaimers": "Friijavuohte vastideamis",
     "disclaimerpage": "Project:Bäjjesereaktah",
     "edithelp": "Sjiehtedimmie viehkie",
-    "helppage": "Help:Sisvege",
     "mainpage": "Aalkoebielie",
     "mainpage-description": "Aalkoebielie",
     "portal": "Meatan portaale",
index 80c4bf7..a70edcb 100644 (file)
     "nowatchlist": "Waxba kuma jiraan liiskaaga waardiyeynta.",
     "watchlistanontext": "Fadlan $1 si aad u fiirisid ama wax uga bedeshid qoraalada ku jira liiska waardiyeyska.",
     "watchnologin": "Gudaha kuma jirtid",
-    "watchnologintext": "Waa ina aad [[Special:UserLogin|gudaha ku jirtaa]] si aad wax uga bedeshid liiskaaga waardiyeynta.",
     "addedwatchtext": "Bogga \"[[:$1]]\" waxaa lagudaray [[Special:Watchlist|liiska-waardiyahaaga]].\nIsbedelka mustaqbalka ku dhaca boggan iyo bogga wadahadalka la'xiriira waxaa lagu soo qoridoonaa inta,\nboggana wuxuu noqonaayaa mid la' '''nuuriyey''' dhinaca [[Special:RecentChanges|Liiska isbedelada show]] si\nay u fududdayso sidii loo dalbanlahaa.\n\nHadii aad rabootid in aad boggan ka saartid wardiyeynta, dhagsii \"Ha' wardiyeynin\" oo ku yaala dhinaca.",
     "removedwatchtext": "Bogga \"[[:$1]]\" waa laga saaray [[Special:Watchlist|liiskaaga waardiyaha]].",
     "watch": "Waardiyey",
     "allmessagesname": "Magac",
     "allmessagesdefault": "Qoraalka la'isku ogyahay",
     "allmessagescurrent": "Qoraalka hada qoran",
-    "allmessagestext": "Kan waa liiska fariimaha systemka oo laga heli karo xarun magaceedka MediaWiki.\nFadlan booqo [https://www.mediawiki.org/wiki/Localisation MediaWiki Localisation] iyo [//translatewiki.net translatewiki.net] hadii aad rabto in aad wax ku darsatid guud ahaanba MediaWiki ku fasirida luqadaada.",
+    "allmessagestext": "Kan waa liiska fariimaha systemka oo laga heli karo xarun magaceedka MediaWiki.\nFadlan booqo [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation MediaWiki Localisation] iyo [//translatewiki.net translatewiki.net] hadii aad rabto in aad wax ku darsatid guud ahaanba MediaWiki ku fasirida luqadaada.",
     "allmessagesnotsupportedDB": "'''{{ns:special}}:Allmessages''' la'ma isticmaalikaro, '''$wgUseDatabaseMessages''' oo dansan daraadeed.",
     "allmessages-language": "Luqad:",
     "allmessages-filter-submit": "Soco",
index df31f5c..f3fb702 100644 (file)
     "prefs-skin": "Pamja",
     "skin-preview": "Parapamje",
     "datedefault": "Parazgjedhje",
-    "prefs-beta": "Karakteristikat Beta",
     "prefs-datetime": "Data dhe Ora",
     "prefs-labs": "Karakteristikat laboratorik",
     "prefs-user-pages": "Faqet e përdoruesit",
     "nowatchlist": "Nuk keni asnjë faqe në listën mbikqyrëse.",
     "watchlistanontext": "Ju lutemi $1 për të parë redaktimet e artikujve në listë tuaj mbikqyrëse.",
     "watchnologin": "Nuk keni hyrë brënda",
-    "watchnologintext": "Duhet të keni [[Special:UserLogin|hyrë brenda]] për të ndryshuar listën mbikqyrëse.",
     "addwatch": "Shto tek lista mbikqyrëse",
     "addedwatchtext": "Faqja \"[[:$1]]\"  i është shtuar [[Special:Watchlist|listës mbikqyrëse]] tuaj. Ndryshimet e ardhshme të kësaj faqeje dhe faqes së diskutimit të saj do të jepen më poshtë, dhe emri i faqes do të duket i '''trashë''' në [[Special:RecentChanges|listën e ndryshimeve së fundmi]] për t'i dalluar më kollaj.\n\nNë qoftë se dëshironi të hiqni një faqe nga lista mbikqyrëse më vonë, shtypni \"çmbikqyre\" në tabelën e sipërme.",
     "removewatch": "Largo nga lista mbikqyrëse",
     "sp-contributions-newbies-sub": "Për newbies",
     "sp-contributions-newbies-title": "Kontributet e përdoruesit për kontot e reja",
     "sp-contributions-blocklog": "Regjistri i bllokimeve",
+    "sp-contributions-suppresslog": "Anëtar me Kontribute të kufizuara",
     "sp-contributions-deleted": "kontributet e grisura",
     "sp-contributions-uploads": "ngarkimet",
     "sp-contributions-logs": "Regjistrat",
     "sp-contributions-blocked-notice": "Ky përdorues është i bllokuar.\nBllokimi i fundit është shfaqur më poshtë për referencë:",
     "sp-contributions-blocked-notice-anon": "Kjo adresë IP është e bllokuar aktualisht.\nBllokimi i funditë është më poshtë për referencë:",
     "sp-contributions-search": "Kërko tek kontributet",
-    "sp-contributions-suppresslog": "Anëtar me Kontribute të kufizuara",
     "sp-contributions-username": "IP Addresa ose Përdoruesi:",
     "sp-contributions-toponly": "Trego vetëm redaktimet që janë versionet më të fundit",
     "sp-contributions-submit": "Kërko",
     "allmessagesname": "Emri",
     "allmessagesdefault": "Teksti i parazgjedhur",
     "allmessagescurrent": "Teksti i tanishëshm",
-    "allmessagestext": "Kjo është një listë e të gjitha faqeve në hapësirën MediaWiki:\nJu lutemi vizitoni [https://www.mediawiki.org/wiki/Localisation MediaWiki Localisation] dhe [//translatewiki.net translatewiki.net] nëse dëshironi të kontribuoni në lokalizimin e përgjithshëm MediaWiki",
+    "allmessagestext": "Kjo është një listë e të gjitha faqeve në hapësirën MediaWiki:\nJu lutemi vizitoni [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation MediaWiki Localisation] dhe [//translatewiki.net translatewiki.net] nëse dëshironi të kontribuoni në lokalizimin e përgjithshëm MediaWiki",
     "allmessagesnotsupportedDB": "Kjo faqe nuk mund të përdoret sepse '''$wgUseDatabaseMessages''' është çaktivizuar.",
     "allmessages-filter-legend": "Filtër",
     "allmessages-filter": "Filtroni nga shteti",
index b03a32b..38662bc 100644 (file)
     "create-this-page": "Направи ову страницу",
     "delete": "Обриши",
     "deletethispage": "Обриши ову страницу",
-    "undeletethispage": "Ð\9fоврати ову страницу",
+    "undeletethispage": "Ð\92рати ову страницу",
     "undelete_short": "Врати {{PLURAL:$1|једну обрисану измену|$1 обрисане измене|$1 обрисаних измена}}",
     "viewdeleted_short": "Погледај {{PLURAL:$1|обрисану измену|$1 обрисане измене|$1 обрисаних измена}}",
     "protect": "Заштити",
     "accountcreatedtext": "Кориснички налог [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|talk]]) је отворен.",
     "createaccount-title": "Отварање корисничког налога за {{SITENAME}}",
     "createaccount-text": "Неко је отворио налог с вашом е-адресом на {{SITENAME}} ($4) под именом $2 и лозинком $3.\nПријавите се и промените своју лозинку.\n\nАко је ово грешка, занемарите ову поруку.",
-    "usernamehasherror": "Корисничко име не може садржати тарабе",
     "login-throttled": "Превише пута сте покушали да се пријавите.\nМолимо вас да сачекате $1 пре него што покушате поново.",
     "login-abort-generic": "Неуспешна пријава – прекинуто",
     "loginlanguagelabel": "Језик: $1",
     "user-mail-no-addy": "Покушали сте да пошаљете поруку без е-адресе.",
     "user-mail-no-body": "Покушано слање електронске поруке с празним или неразумно кратким садржајем.",
     "changepassword": "Промени лозинку",
-    "resetpass_announce": "Ð\9fÑ\80иÑ\98авÑ\99ени Ñ\81Ñ\82е Ñ\81 Ð¿Ñ\80ивÑ\80еменом Ð»Ð¾Ð·Ð¸Ð½ÐºÐ¾Ð¼.\nÐ\94а Ð±Ð¸Ñ\81Ñ\82е Ð·Ð°Ð²Ñ\80Ñ\88или Ð¿Ñ\80иÑ\98авÑ\83, Ð¿Ð¾Ð´ÐµÑ\81иÑ\82е Ð½Ð¾Ð²Ñ\83 Ð»Ð¾Ð·Ð¸Ð½ÐºÑ\83 Ð¾Ð²Ð´Ðµ:",
+    "resetpass_announce": "Ð\94а Ð±Ð¸Ñ\81Ñ\82е Ð·Ð°Ð²Ñ\80Ñ\88или Ð¿Ñ\80иÑ\98авÑ\83, Ð¿Ð¾Ð´ÐµÑ\81иÑ\82е Ð½Ð¾Ð²Ñ\83 Ð»Ð¾Ð·Ð¸Ð½ÐºÑ\83 Ð¾Ð²Ð´Ðµ.",
     "resetpass_text": "<!-- Овде унесите текст -->",
     "resetpass_header": "Промена лозинке налога",
     "oldpassword": "Стара лозинка:",
     "resetpass-temp-password": "Привремена лозинка:",
     "resetpass-abort-generic": "Промену лозинке је спречио додатак.",
     "resetpass-expired": "Ваша лозинка је истекла. Поставите нову лозинку да бисте се пријавили.",
-    "resetpass-expired-soft": "Ваша лозинка је истекла и морате поставити нову. Поставите нову лозинку или кликните откажи да је поставите касније.",
+    "resetpass-expired-soft": "Ваша лозинка је истекла и морате поставити нову. Поставите нову лозинку или кликните „{{int:resetpass-submit-cancel}}“ да је поставите касније.",
     "passwordreset": "Обнављање лозинке",
     "passwordreset-text-one": "Попуните овај образац да бисте ресетовали лозинку.",
     "passwordreset-text-many": "{{PLURAL:$1|Испуните једно од поља како би сте добили привремену лозинку на е-пошту.}}",
     "content-failed-to-parse": "Не могу да рашчланим садржај типа $2 за модел $1: $3",
     "invalid-content-data": "Неисправни подаци садржаја",
     "content-not-allowed-here": "Садржај модела „$1“ није дозвољен на страници [[$2]]",
-    "editwarning-warning": "Ако напустите ову страницу, изгубићете све измене које сте направили.\nАко сте пријављени, можете онемогућити ово упозорење у својим подешавањима, у одељку „Уређивање“.",
+    "editwarning-warning": "Ако напустите ову страницу, изгубићете све измене које сте направили.\nАко сте пријављени, можете онемогућити ово упозорење у својим подешавањима, у одељку „{{int:prefs-editing}}“.",
     "content-model-wikitext": "викитекст",
     "content-model-text": "чист текст",
     "content-model-javascript": "јаваскрипт",
     "page_last": "последња",
     "histlegend": "Избор разлика: изаберите кутијице измена за упоређивање и притисните ентер или дугме на дну.<br />\nОбјашњење: '''({{int:cur}})''' – разлика с тренутном изменом,\n'''({{int:last}})''' – разлика с претходном изменом, '''{{int:minoreditletter}}''' – мала измена",
     "history-fieldset-title": "Преглед историје",
-    "history-show-deleted": "само обрисано",
+    "history-show-deleted": "Само обрисано",
     "histfirst": "најстарије",
     "histlast": "најновије",
     "historysize": "({{PLURAL:$1|1 бајт|$1 бајта|$1 бајтова}})",
     "powersearch-togglenone": "ништа",
     "search-external": "Спољна претрага",
     "searchdisabled": "Претрага је онемогућена.\nУ међувремену можете тражити преко Гугла.\nУпамтите да његови пописи овог викија могу бити застарели.",
+    "search-error": "Дошло је до грешке приликом претраге: $1",
     "preferences": "Подешавања",
     "mypreferences": "Подешавања",
     "prefs-edits": "Број измена:",
     "prefs-skin": "Тема",
     "skin-preview": "Прегледај",
     "datedefault": "Свеједно",
-    "prefs-beta": "Бета могућности",
-    "prefs-datetime": "Датум и време",
     "prefs-labs": "Пробне могућности",
     "prefs-user-pages": "Корисничке странице",
     "prefs-personal": "Профил",
     "prefs-watchlist-days-max": "Највише $1 {{PLURAL:$1|дан|дана|дана}}",
     "prefs-watchlist-edits": "Највећи број измена у проширеном списку надгледања:",
     "prefs-watchlist-edits-max": "Највећа вредност је хиљаду",
-    "prefs-watchlist-token": "Ð\96еÑ\82он списка надгледања:",
+    "prefs-watchlist-token": "Токен списка надгледања:",
     "prefs-misc": "Друга подешавања",
     "prefs-resetpass": "Промени лозинку",
     "prefs-changeemail": "Промени е-адресу",
     "recentchangesdays-max": "(највише $1 {{PLURAL:$1|дан|дана|дана}})",
     "recentchangescount": "Број измена за приказ:",
     "prefs-help-recentchangescount": "Подразумева скорашње измене, историје страница и дневнике.",
+    "prefs-help-watchlist-token2": "Ово је тајни кључ за RSS довод вашег списка надгледања.\nСвако ко зна овај кључ биће у могућности да види ваша надгледања стога немојте га одавати никоме.\nАко је потребно можете га [[Special:ResetTokens|ресетовати]].",
     "savedprefs": "Ваша подешавања су сачувана.",
     "timezonelegend": "Временска зона:",
     "localtime": "Локално време:",
     "right-deleterevision": "брисање и враћање одређених измена страница",
     "right-deletedhistory": "прегледање обрисаних ставки историје без повезаног текста",
     "right-deletedtext": "прегледање обрисаног текста и измена између обрисаних измена",
-    "right-browsearchive": "тражење обрисаних страница",
+    "right-browsearchive": "претрага обрисаних страница",
     "right-undelete": "враћање обрисаних страница",
     "right-suppressrevision": "прегледање и враћање измена које су сакривене од стране администратора",
     "right-suppressionlog": "гледање приватних дневника",
     "right-block": "блокирање даљих измена других корисника",
     "right-blockemail": "онемогућавање корисницима да шаљу е-поруке",
     "right-hideuser": "блокирање корисничког имена и његово сакривање од јавности",
-    "right-ipblock-exempt": "заобилажење блокирања IP адресе, самоблокирања и блокирања опсега",
+    "right-ipblock-exempt": "заобилажење блокирања IP адресе, аутоматска блокирања и блокирања опсега",
     "right-proxyunbannable": "заобилажење самоблокирања посредника",
     "right-unblockself": "одблокирај самог себе",
     "right-protect": "промени нивое заштите и уреди странице са преносивом заштитом",
-    "right-editprotected": "уреди странице под заштитом „{{int:protect-level-sysop}}“",
-    "right-editsemiprotected": "уреди странице под заштитом „{{int:protect-level-autoconfirmed}}“",
+    "right-editprotected": "уређивање страница под заштитом „{{int:protect-level-sysop}}“",
+    "right-editsemiprotected": "уређивање страница под заштитом „{{int:protect-level-autoconfirmed}}“",
     "right-editinterface": "уређивање корисничког окружења",
     "right-editusercssjs": "уређивање туђих CSS и јаваскрипт датотека",
     "right-editusercss": "уређивање туђих CSS датотека",
-    "right-edituserjs": "уређивање туђих јаваскрипт датотека",
+    "right-edituserjs": "уређивање туђих JavaScript датотека",
+    "right-editmyusercss": "уређивање сопствених CSS датотека",
+    "right-editmyuserjs": "уређивање сопствених JavaScript датотека",
     "right-viewmyprivateinfo": "видите своје личне податке (нпр. адресу е-поште, право име)",
-    "right-editmyprivateinfo": "уреди своје личне податке (нпр. адресу е-поште, право име)",
+    "right-editmyprivateinfo": "уређивање сопствених личних података (нпр. адресу е-поште, право име)",
     "right-editmyoptions": "уредите своја подешавања",
     "right-rollback": "брзо враћање измена последњег корисника који је мењао одређену страницу",
     "right-markbotedits": "означавање враћених измена као измене бота",
     "right-noratelimit": "отпорност на ограничења",
     "right-import": "увожење страница из других викија",
     "right-importupload": "увожење страница из отпремљене датотеке",
-    "right-patrol": "ознаÑ\87аваÑ\9aе Ñ\82Ñ\83Ñ\92иÑ\85 Ð¸Ð·Ð¼ÐµÐ½Ð° ÐºÐ°Ð¾ Ð¿Ñ\80егледаниÑ\85",
-    "right-autopatrol": "самоозначавање измена као прегледане",
+    "right-patrol": "ознаÑ\87аваÑ\9aе Ñ\82Ñ\83Ñ\92иÑ\85 Ð¸Ð·Ð¼ÐµÐ½Ð° Ð¿Ð°Ñ\82Ñ\80олиÑ\80аним",
+    "right-autopatrol": "аутоматско означавање измена као прегледаним",
     "right-patrolmarks": "прегледање ознака за патролирање унутар скорашњих измена",
     "right-unwatchedpages": "прегледање списка ненадгледаних страница",
     "right-mergehistory": "спајање историја страница",
     "upload-permitted": "Дозвољени типови датотека: $1.",
     "upload-preferred": "Препоручени типови датотека: $1.",
     "upload-prohibited": "Забрањени типови датотека: $1.",
-    "uploadlog": "дневник отпремања",
     "uploadlogpage": "Дневник отпремања",
     "uploadlogpagetext": "Испод је списак скорашњих слања.\nПогледајте [[Special:NewFiles|галерију нових датотека]] за лепши преглед.",
     "filename": "Назив датотеке",
     "filereuploadsummary": "Измене датотеке:",
     "filestatus": "Статус ауторског права:",
     "filesource": "Извор:",
-    "uploadedfiles": "Послате датотеке",
     "ignorewarning": "Занемари упозорења и сачувај датотеку",
     "ignorewarnings": "Занемари сва упозорења",
     "minlength1": "Назив датотеке мора имати барем један знак.",
     "overwroteimage": "је послао нову верзију датотеке „[[$1]]“",
     "uploaddisabled": "Отпремање је онемогућено.",
     "copyuploaddisabled": "Слање путем URL адресе је онемогућено.",
-    "uploadfromurl-queued": "Слање је стављено на списак чекања.",
     "uploaddisabledtext": "Отпремање датотека је онемогућено.",
     "php-uploaddisabledtext": "Слање датотека је онемогућено у PHP-у.\nПроверите поставке file_uploads.",
     "uploadscripted": "Датотека садржи HTML или скриптни код који може бити погрешно протумачен од стране прегледача.",
     "upload-misc-error": "Непозната грешка при слању датотеке",
     "upload-misc-error-text": "Непозната грешка при слању датотеке.\nПроверите да ли је адреса исправна и покушајте поново.\nАко се проблем не реши, контактирајте [[Special:ListUsers/sysop|администратора]].",
     "upload-too-many-redirects": "Адреса садржи превише преусмерења",
-    "upload-unknown-size": "Непозната величина",
     "upload-http-error": "Дошло је до HTTP грешке: $1",
     "upload-copy-upload-invalid-domain": "Примерци отпремања нису доступни на овом домену.",
     "backend-fail-stream": "Не могу да емитујем датотеку $1.",
     "img-auth-streaming": "Учитавање „$1“.",
     "img-auth-public": "Сврха img_auth.php је да прослеђује датотеке из приватних викија.\nОвај вики је постављен као јавни.\nРади сигурности, img_auth.php је онемогућен.",
     "img-auth-noread": "Корисник нема приступ за читање „$1“.",
-    "img-auth-bad-query-string": "Адреса има неисправну ниску упита.",
     "http-invalid-url": "Неисправна адреса: $1",
     "http-invalid-scheme": "Адресе са шемом „$1“ нису подржане.",
     "http-request-error": "HTTP захтев није прошао због непознате грешке.",
     "filehist-dimensions": "Димензије",
     "filehist-filesize": "Величина датотеке",
     "filehist-comment": "Коментар",
-    "filehist-missing": "Датотека недостаје",
     "imagelinks": "Употреба датотеке",
     "linkstoimage": "{{PLURAL:$1|Следећа страница користи|$1 следеће странице користе|$1 следећих страница користи}} ову датотеку:",
     "linkstoimage-more": "Више од $1 {{PLURAL:$1|странице|странице|страница}} је повезано с овом датотеком.\nСледећи списак приказује само {{PLURAL:$1|прву страницу повезану|прве $1 странице повезане|првих $1 страница повезаних}} с овом датотеком.\nДоступан је и [[Special:WhatLinksHere/$2|потпуни списак]].",
     "download": "преузми",
     "unwatchedpages": "Ненадгледане странице",
     "listredirects": "Списак преусмерења",
+    "listduplicatedfiles": "Списак дупликата датотека",
+    "listduplicatedfiles-summary": "Ово је списак датотека које су дупликат неких других датотека. Само локалне датотеке су приказане.",
     "unusedtemplates": "Некоришћени шаблони",
     "unusedtemplatestext": "Ова страница наводи све странице у именском простору {{ns:template}} које нису укључене ни на једној другој страници.\nПре брисања проверите да ли друге странице воде до тих шаблона.",
     "unusedtemplateswlh": "остале везе",
     "emailuser-title-notarget": "Слање е-поруке кориснику",
     "emailpage": "Слање е-порука",
     "emailpagetext": "Можете да користите доњи образац да пошаљете е-поруку {{GENDER:$1|овом кориснику|овој корисници|овом кориснику|}}.\nЕ-адреса коју сте унели у вашим [[Special:Preferences|подешавањима]] ће се приказати у пољу „Од“, тако да ће прималац моћи да вам одговори директно.",
-    "usermailererror": "Дошло је до грешке при слању поруке:",
     "defemailsubject": "{{SITENAME}} е-адреса {{GENDER:$1|корисника|кориснице|корисника}} $1",
     "usermaildisabled": "Корисничка е-пошта је онемогућена",
     "usermaildisabledtext": "Не можете да шаљете е-поруке другим корисницима на овом викију",
     "noemailtitle": "Нема е-адресе",
     "noemailtext": "Овај корисник није навео исправну е-адресу.",
-    "nowikiemailtitle": "Е-пошта није дозвољена",
     "nowikiemailtext": "Овај корисник је одлучио да не прима е-поруке од других корисника.",
     "emailnotarget": "Непостојеће или неисправно корисничко име примаоца.",
     "emailtarget": "Унос корисничког имена примаоца",
     "nowatchlist": "Ваш списак надгледања је празан.",
     "watchlistanontext": "Морате бити $1 да бисте гледали и уређивали ставке на вашем списку надгледања.",
     "watchnologin": "Нисте пријављени",
-    "watchnologintext": "Морате бити [[Special:UserLogin|пријављени]] да бисте мењали списак надгледања.",
     "addwatch": "Додај на списак надгледања",
     "addedwatchtext": "Страница „[[:$1]]“ је додата на ваш [[Special:Watchlist|списак надгледања]].\nБудуће измене ове странице и њене странице за разговор биће наведене овде.",
     "removewatch": "Уклони са списка надгледања",
     "watching": "Надгледање…",
     "unwatching": "Прекидање надгледања…",
     "watcherrortext": "Дошло је до грешке при промени поставки вашег списка надгледања за „$1“.",
-    "enotif_mailer": "{{SITENAME}} е-обавештење",
     "enotif_reset": "Означи све странице као посећене",
     "enotif_impersonal_salutation": "{{SITENAME}} корисник",
     "enotif_subject_deleted": "Страницу $1 на {{SITENAME}} {{GENDER:$2|обрисао је|обрисала је|обрисао је}} $2",
     "excontent": "садржај је био: „$1“",
     "excontentauthor": "садржај је био: „$1“ (а једини уредник је био „[[Special:Contributions/$2|$2]]“)",
     "exbeforeblank": "садржај пре брисања је био: „$1“",
-    "exblank": "страница је била празна",
     "delete-confirm": "Брисање странице „$1“",
     "delete-legend": "Обриши",
     "historywarning": "'''Упозорење:''' страница коју желите да обришете има историју с приближно $1 {{PLURAL:$1|изменом|измене|измена}}:",
     "allmessagesname": "Назив",
     "allmessagesdefault": "Подразумевани текст",
     "allmessagescurrent": "Тренутни текст поруке",
-    "allmessagestext": "Ово је списак свих системских порука које су доступне у именском простору „Медијавики“.\nПосетите [https://www.mediawiki.org/wiki/Localisation Медијавики локализацију] и [//translatewiki.net Транслејтвики] ако желите да помогнете у превођењу.",
+    "allmessagestext": "Ово је списак свих системских порука које су доступне у именском простору „Медијавики“.\nПосетите [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation Медијавики локализацију] и [//translatewiki.net Транслејтвики] ако желите да помогнете у превођењу.",
     "allmessagesnotsupportedDB": "Ова страница не може да се користи јер је '''$wgUseDatabaseMessages''' онемогућен.",
     "allmessages-filter-legend": "Филтер",
     "allmessages-filter": "Филтрирај по стању:",
     "importunknownsource": "Непозната врста за увоз",
     "importcantopen": "Не могу да отворим датотеку за увоз",
     "importbadinterwiki": "Неисправна међувики веза",
-    "importnotext": "Празно или без текста",
     "importsuccess": "Увожење је завршено!",
-    "importhistoryconflict": "Постоји сукобљена измена у историји (можда је ова страница већ увезена раније)",
     "importnosources": "Није одређен ниједан међувики извор за увоз, тако да је отпремање историје онемогућено.",
     "importnofile": "Увозна датотека није послата.",
     "importuploaderrorsize": "Не могу да отпремим датотеку за увоз.\nДатотека је већа од дозвољене величине.",
     "tooltip-recreate": "Поново направите страницу иако је обрисана",
     "tooltip-upload": "Започните отпремање",
     "tooltip-rollback": "„Врати“ враћа измене последњег корисника једним кликом",
-    "tooltip-undo": "Ð\92Ñ\80аÑ\9bа ову измену и отвара образац за уређивање.",
+    "tooltip-undo": "Ð\9fониÑ\88Ñ\82ава ову измену и отвара образац за уређивање.",
     "tooltip-preferences-save": "Сачувај поставке",
     "tooltip-summary": "Унесите кратак опис",
     "common.css": "/** CSS постављен овде ће се одразити на све теме */",
     "semicolon-separator": ";&#32;",
     "comma-separator": ",&#32;",
     "colon-separator": ":&#32;",
-    "pipe-separator": "&#32;&#32;",
+    "pipe-separator": "&#32;|&#32;",
     "word-separator": "&#32;",
     "ellipsis": "…",
     "percent": "$1%",
index 4d52e08..68f120d 100644 (file)
     "actions": "Radnje",
     "namespaces": "Imenski prostori",
     "variants": "Varijante",
+    "navigation-heading": "Navigacioni meni",
     "errorpagetitle": "Greška",
     "returnto": "Nazad na $1.",
     "tagline": "Izvor: {{SITENAME}}",
     "create-this-page": "Napravi ovu stranicu",
     "delete": "Obriši",
     "deletethispage": "Obriši ovu stranicu",
+    "undeletethispage": "Vrati ovu stranicu",
     "undelete_short": "Vrati {{PLURAL:$1|jednu obrisanu izmenu|$1 obrisane izmene|$1 obrisanih izmena}}",
     "viewdeleted_short": "Pogledaj {{PLURAL:$1|obrisanu izmenu|$1 obrisane izmene|$1 obrisanih izmena}}",
     "protect": "Zaštiti",
     "error": "Greška",
     "databaseerror": "Greška u bazi podataka",
     "databaseerror-text": "Došlo je do greške u upitu baze podataka. Možda je u pitanju programska greška.",
+    "databaseerror-function": "Funkcija: $1",
+    "databaseerror-error": "Greška: $1",
     "laggedslavemode": "'''Upozorenje:''' stranica je možda zastarela.",
     "readonly": "Baza podataka je zaključana",
     "enterlockreason": "Unesite razlog za zaključavanje, uključujući i vreme otključavanja",
     "namespaceprotected": "Nemate dozvolu da uređujete stranice u imenskom prostoru '''$1'''.",
     "customcssprotected": "Nemate dozvolu da menjate ovu CSS stranicu jer sadrži lične postavke drugog korisnika.",
     "customjsprotected": "Nemate dozvolu da menjate ovu stranicu javaskripta jer sadrži lične postavke drugog korisnika.",
+    "mycustomcssprotected": "Nemate dozvolu za menjanje ove CSS stranice.",
+    "mycustomjsprotected": "Nemate dozvolu za menjanje ove JavaScript stranice.",
+    "myprivateinfoprotected": "Nemate dozvolu za menjanje vaših ličnih informacija.",
+    "mypreferencesprotected": "Nemate dozvolu za menjanje vaših podešavanja.",
     "ns-specialprotected": "Posebne stranice se ne mogu uređivati.",
     "titleprotected": "Ovaj naziv je [[User:$1|$1]] zaštitio od pravljenja. Razlog: ''$2''.",
     "filereadonlyerror": "Ne mogu da izmenim datoteku „$1“ jer je riznica „$2“ u režimu za čitanje.\n\nAdministrator koji ju je zaključao ponudio je sledeće objašnjenje: „$3“.",
     "invalidtitle-unknownnamespace": "Neispravan naslov s imenskim prostorom br. $1 i tekstom „$2“",
     "exception-nologin": "Niste prijavljeni",
     "exception-nologin-text": "[[Special:Userlogin|Prijavite se]] da biste pristupili ovoj stranici ili radnji.",
+    "exception-nologin-text-manual": "Morate biti $1 da biste pristupili ovoj stranici ili radnji.",
     "virus-badscanner": "Neispravna postavka: nepoznati skener za viruse: ''$1''",
     "virus-scanfailed": "neuspešno skeniranje (kod $1)",
     "virus-unknownscanner": "nepoznati antivirus:",
     "yourname": "Korisničko ime:",
     "userlogin-yourname": "Korisničko ime",
     "userlogin-yourname-ph": "Unesite vaše korisničko ime",
+    "createacct-another-username-ph": "Unesite korisničko ime",
     "yourpassword": "Lozinka:",
     "userlogin-yourpassword": "Lozinka",
     "userlogin-yourpassword-ph": "Unesite vašu lozinku",
     "gotaccountlink": "Prijava",
     "userlogin-resetlink": "Zaboravili ste podatke za prijavu?",
     "userlogin-resetpassword-link": "Zaboravili ste lozinku?",
+    "userlogin-helplink2": "Pomoć pri prijavljivanju",
+    "userlogin-loggedin": "Već ste prijavljeni kao {{GENDER:$1|$1}}.\nKoristite donji obrazac da biste se prijavili kao drugi korisnik.",
+    "userlogin-createanother": "Otvori još jedan nalog",
     "createacct-join": "Unesite svoje podatke ispod.",
+    "createacct-another-join": "Unesite podatke za novi nalog ispod.",
     "createacct-emailrequired": "Adresa e-pošte",
     "createacct-emailoptional": "Adresa e-pošte (opciono)",
     "createacct-email-ph": "Unesite vašu adresu e-pоšte",
+    "createacct-another-email-ph": "Unesite adresu e-pošte",
     "createaccountmail": "Koristite privremenu, slučajno stvorenu lozinku i pošaljite na navedenu adresu elektronske pošte",
     "createacct-realname": "Pravo ime (opciono)",
     "createaccountreason": "Razlog:",
     "createacct-captcha": "Sigurnosna provera",
     "createacct-imgcaptcha-ph": "Unesite tekst koji vidite iznad",
     "createacct-submit": "Otvori nalog",
+    "createacct-another-submit": "Otvori još jedan nalog",
     "createacct-benefit-heading": "{{SITENAME}} je napravljen od strane ljudi kao što ste vi.",
+    "createacct-benefit-body1": "{{PLURAL:$1|izmena|izmene}}",
+    "createacct-benefit-body2": "{{PLURAL:$1|stranica|stranice}}",
     "createacct-benefit-body3": "skorašnjih {{PLURAL:$1|doprinosa}}",
     "badretype": "Unete lozinke se ne poklapaju.",
     "userexists": "Korisničko ime je zauzeto. Izaberite drugo.",
     "accountcreatedtext": "Korisnički nalog [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|talk]]) je otvoren.",
     "createaccount-title": "Otvaranje korisničkog naloga za {{SITENAME}}",
     "createaccount-text": "Neko je otvorio nalog s vašom e-adresom na {{SITENAME}} ($4) pod imenom $2 i lozinkom $3.\nPrijavite se i promenite svoju lozinku.\n\nAko je ovo greška, zanemarite ovu poruku.",
-    "usernamehasherror": "Korisničko ime ne može sadržati tarabe",
     "login-throttled": "Previše puta ste pokušali da se prijavite. \nMolimo vas da sačekate $1 pre nego što pokušate ponovo.",
     "login-abort-generic": "Neuspešna prijava – prekinuto",
     "loginlanguagelabel": "Jezik: $1",
     "suspicious-userlogout": "Vaš zahtev za odjavu je odbijen jer je poslat od strane neispravnog pregledača ili posrednika.",
+    "createacct-another-realname-tip": "Pravo ime nije obavezno.\nAko izaberete da ga unesete, ono će biti korišćeno za pripisivanje vašeg rada.",
     "pt-login": "Prijavi me",
     "pt-login-button": "Prijavi me",
     "pt-createaccount": "Otvori nalog",
     "pt-userlogout": "Odjavi me",
     "php-mail-error-unknown": "Nepoznata greška u funkciji PHP mail().",
     "user-mail-no-addy": "Pokušali ste da pošaljete poruku bez e-adrese.",
+    "user-mail-no-body": "Pokušano slanje elektronske poruke s praznim ili nerazumno kratkim sadržajem.",
     "changepassword": "Promeni lozinku",
-    "resetpass_announce": "Prijavljeni ste s privremenom lozinkom.\nDa biste završili prijavu, podesite novu lozinku ovde:",
+    "resetpass_announce": "Da biste završili prijavu, podesite novu lozinku ovde.",
     "resetpass_text": "<!-- Ovde unesite tekst -->",
     "resetpass_header": "Promena lozinke naloga",
     "oldpassword": "Stara lozinka:",
     "resetpass-submit-loggedin": "Promeni lozinku",
     "resetpass-submit-cancel": "Otkaži",
     "resetpass-wrong-oldpass": "Neispravna privremena ili tekuća lozinka.\nMožda ste već promenili lozinku ili ste zatražili novu privremenu lozinku.",
+    "resetpass-recycled": "Uneli ste sadašnju lozinku, da bi ste resetovali lozinku morate uneti novu.",
+    "resetpass-temp-emailed": "Prijavili ste se sa privremenim kodom iz e-pošte.\nDa biste završili prijavljivanje morate postaviti novu lozinku ovde:",
     "resetpass-temp-password": "Privremena lozinka:",
+    "resetpass-abort-generic": "Promenu lozinke je sprečio dodatak.",
+    "resetpass-expired": "Vaša lozinka je istekla. Postavite novu lozinku da biste se prijavili.",
+    "resetpass-expired-soft": "Vaša lozinka je istekla i morate postaviti novu. Postavite novu lozinku ili kliknite „{{int:resetpass-submit-cancel}}“ da je postavite kasnije.",
     "passwordreset": "Obnavljanje lozinke",
     "passwordreset-text-one": "Popunite ovaj obrazac da biste resetovali lozinku.",
     "passwordreset-text-many": "{{PLURAL:$1|Ispunite jedno od polja kako bi ste dobili privremenu lozinku na e-poštu.}}",
     "passwordreset-legend": "Poništi lozinku",
     "passwordreset-disabled": "Obnavljanje lozinke je onemogućeno na ovom vikiju.",
+    "passwordreset-emaildisabled": "E-pošta je onemogućena na ovom vikiju.",
     "passwordreset-username": "Korisničko ime:",
     "passwordreset-domain": "Domen:",
     "passwordreset-capture": "Pogledati krajnju poruku?",
     "changeemail-none": "(ništa)",
     "changeemail-submit": "Promeni",
     "changeemail-cancel": "Otkaži",
+    "resettokens-token-label": "$1 (trenutna vrednost: $2)",
     "bold_sample": "Podebljan tekst",
     "bold_tip": "Podebljan tekst",
     "italic_sample": "Iskošeni tekst",
     "copyrightwarning": "Imajte na umu da se svi doprinosi na ovom vikiju smatraju kao objavljeni pod licencom $2 (više na $1).\nAko ne želite da se vaši tekstovi menjaju i razmenjuju bez ograničenja, onda ih ne šaljite ovde.<br />\nIsto tako obećavate da ste vi autor teksta, ili da ste ga umnožili s izvora koji je u javnom vlasništvu.\n'''Ne šaljite radove zaštićene autorskim pravima bez dozvole!'''",
     "copyrightwarning2": "Imajte na umu da se svi doprinosi na ovom vikiju mogu menjati, vraćati ili brisati od drugih korisnika.\nAko ne želite da se vaši tekstovi slobodno menjaju i raspodeljuju, ne šaljite ih ovde.<br />\nIsto tako obećavate da ste vi autor teksta, ili da ste ga umnožili s izvora koji je u javnom vlasništvu (više na $1).\n'''Ne šaljite radove zaštićene autorskim pravima bez dozvole!'''",
     "longpageerror": "'''Greška: tekst koji ste uneli je veličine {{PLURAL:$1|jedan kilobajt|$1 kilobajta|$1 kilobajta}}, što je veće od {{PLURAL:$2|dozvoljenog jednog kilobajta|dozvoljena $2 kilobajta|dozvoljenih $2 kilobajta}}.'''\nStranica ne može biti sačuvana.",
-    "readonlywarning": "'''Upozorenje: baza podataka je zaključana radi održavanja, tako da nećete moći da sačuvate izmene.\nNajbolje bi bilo da umnožite tekst u uređivač teksta i sačuvate ga za kasnije.'''\n\nAdministrator koji je zaključao bazu podataka je naveo sledeće objašnjenje: $1",
+    "readonlywarning": "<strong>Upozorenje: baza podataka je zaključana radi održavanja, tako da trenutno nećete moći da sačuvate izmene.</strong>\nMožda biste želeli sačuvati tekst za kasnije u nekoj tekstualnoj datoteci.\n\nAdministrator koji je zaključao bazu dao je sledeće objašnjenje: $1",
     "protectedpagewarning": "'''Upozorenje: ova stranica je zaštićena, tako da samo administratori mogu da je menjaju.'''\nPoslednja stavka u istoriji je prikazana ispod:",
     "semiprotectedpagewarning": "'''Napomena:''' ova stranica je zaštićena, tako da samo registrovani korisnici mogu da je uređuju.\nPoslednji zapis u dnevniku je prikazan ispod:",
     "cascadeprotectedwarning": "<div style=\"background: #FFBDBD; border: 1px solid #BB7979; color: #000000; font-weight: bold; margin: 2em 0 1em; padding: .5em 1em; vertical-align: middle; clear: both;\">'''Upozorenje:''' Ova stranica je zaštićena tako da je mogu uređivati samo administratori, jer je ona uključena u {{PLURAL:$1|sledeću stranicu koja je|sledeće stranice koje su}} zaštićene „prenosivom“ zaštitom:</div>",
     "content-failed-to-parse": "Ne mogu da raščlanim sadržaj tipa $2 za model $1: $3",
     "invalid-content-data": "Neispravni podaci sadržaja",
     "content-not-allowed-here": "Sadržaj modela „$1“ nije dozvoljen na stranici [[$2]]",
-    "editwarning-warning": "Ako napustite ovu stranicu, izgubićete sve izmene koje ste napravili.\nAko ste prijavljeni, možete onemogućiti ovo upozorenje u svojim podešavanjima, u odeljku „Uređivanje“.",
+    "editwarning-warning": "Ako napustite ovu stranicu, izgubićete sve izmene koje ste napravili.\nAko ste prijavljeni, možete onemogućiti ovo upozorenje u svojim podešavanjima, u odeljku „{{int:prefs-editing}}“.",
     "content-model-wikitext": "vikitekst",
     "content-model-text": "čist tekst",
     "content-model-javascript": "javaskript",
     "undo-failure": "Ova izmena se ne može poništiti zbog konflikta izmena.",
     "undo-norev": "Ne mogu da vratim izmenu jer ne postoji ili je obrisana.",
     "undo-summary": "Poništena izmena $1 {{GENDER:$2|korisnika|korisnice}} [[Special:Contributions/$2|$2]] ([[User talk:$2|razgovor]])",
+    "undo-summary-username-hidden": "Poništi izmenu $1 skrivenog korisnika",
     "cantcreateaccounttitle": "Ne mogu da otvorim nalog",
     "cantcreateaccount-text": "Otvaranje naloga s ove IP adrese ('''$1''') je {{GENDER:$3|blokirao|blokirala|blokirao}} [[User:$3|$3]].\n\nRazlog koji je naveo {{GENDER:$3|korisnik|korisnica|korisnik}} $3 je ''$2''",
     "viewpagelogs": "Pogledaj dnevnike ove stranice",
     "page_last": "poslednja",
     "histlegend": "Izbor razlika: izaberite kutijice izmena za upoređivanje i pritisnite enter ili dugme na dnu.<br />\nObjašnjenje: '''({{int:cur}})''' – razlika s trenutnom izmenom,\n'''({{int:last}})''' – razlika s prethodnom izmenom, '''{{int:minoreditletter}}''' – mala izmena",
     "history-fieldset-title": "Pregled istorije",
-    "history-show-deleted": "samo obrisano",
+    "history-show-deleted": "Samo obrisane",
     "histfirst": "najstarije",
     "histlast": "najnovije",
     "historysize": "({{PLURAL:$1|1 bajt|$1 bajta|$1 bajtova}})",
     "revdelete-no-file": "Tražena datoteka ne postoji.",
     "revdelete-show-file-confirm": "Želite li da vidite obrisanu izmenu datoteke „<nowiki>$1</nowiki>“ od $2; $3?",
     "revdelete-show-file-submit": "Da",
+    "revdelete-selected-text": "{{PLURAL:$1|Izabrana izmena|Izabrane izmene}} [[:$2]]:",
+    "revdelete-selected-file": "{{PLURAL:$1|Izabrana verzija datoteke|Izabrane verzije datoteke}} [[:$2]]:",
     "logdelete-selected": "{{PLURAL:$1|Izabrana stavka u istoriji|Izabrane stavke u istoriji}}:",
     "revdelete-confirm": "Potvrdite da nameravate ovo uraditi, da razumete posledice i da to činite u skladu s [[{{MediaWiki:Policy-url}}|pravilima]].",
     "revdelete-suppress-text": "Sakrivanje izmena bi trebalo koristiti '''samo''' u sledećim slučajevima:\n* Zlonamerni ili pogrdni podaci\n* Neprikladni lični podaci\n*: ''kućna adresa i broj telefona, broj bankovne kartice itd.''",
     "revdelete-legend": "Ograničenja vidljivosti",
-    "revdelete-hide-text": "sakrij tekst izmene",
+    "revdelete-hide-text": "Tekst revizije",
     "revdelete-hide-image": "Sakrij sadržaj datoteke",
     "revdelete-hide-name": "Sakrij radnju i odredište",
     "revdelete-hide-comment": "Opis izmene",
-    "revdelete-hide-user": "sakrij ime uređivača",
+    "revdelete-hide-user": "Korisnčko ime urednika/IP adresa",
     "revdelete-hide-restricted": "Sakrij podatke od administratora i drugih korisnika",
     "revdelete-radio-same": "(ne menjaj)",
     "revdelete-radio-set": "Sakriveno",
     "preferences": "Podešavanja",
     "mypreferences": "Podešavanja",
     "prefs-edits": "Broj izmena:",
+    "prefsnologintext2": "Morate biti $1 da biste menjali svoja podešavanja.",
     "prefs-skin": "Tema",
     "skin-preview": "Pregledaj",
     "datedefault": "Svejedno",
-    "prefs-beta": "Beta mogućnosti",
-    "prefs-datetime": "Datum i vreme",
     "prefs-labs": "Probne mogućnosti",
     "prefs-user-pages": "Korisničke stranice",
     "prefs-personal": "Profil",
     "prefs-watchlist-days-max": "Najviše $1 {{PLURAL:$1|dan|dana|dana}}",
     "prefs-watchlist-edits": "Najveći broj izmena u proširenom spisku nadgledanja:",
     "prefs-watchlist-edits-max": "Najveća vrednost je hiljadu",
-    "prefs-watchlist-token": "Žeton spiska nadgledanja:",
+    "prefs-watchlist-token": "Token spiska nadgledanja:",
     "prefs-misc": "Druga podešavanja",
     "prefs-resetpass": "Promeni lozinku",
     "prefs-changeemail": "Promeni e-adresu",
     "prefs-dateformat": "Format datuma",
     "prefs-timeoffset": "Vremenska razlika",
     "prefs-advancedediting": "Glavna podešavanja",
+    "prefs-editor": "Uređivač",
+    "prefs-preview": "Pretpregled",
     "prefs-advancedrc": "Napredne postavke",
     "prefs-advancedrendering": "Napredne postavke",
     "prefs-advancedsearchoptions": "Napredne postavke",
     "right-deleterevision": "brisanje i vraćanje određenih izmena stranica",
     "right-deletedhistory": "pregledanje obrisanih stavki istorije bez povezanog teksta",
     "right-deletedtext": "pregledanje obrisanog teksta i izmena između obrisanih izmena",
-    "right-browsearchive": "traženje obrisanih stranica",
+    "right-browsearchive": "pretraga obrisanih stranica",
     "right-undelete": "vraćanje obrisanih stranica",
     "right-suppressrevision": "pregledanje i vraćanje izmena koje su sakrivene od strane administratora",
     "right-suppressionlog": "gledanje privatnih dnevnika",
     "right-block": "blokiranje daljih izmena drugih korisnika",
     "right-blockemail": "onemogućavanje korisnicima da šalju e-poruke",
     "right-hideuser": "blokiranje korisničkog imena i njegovo sakrivanje od javnosti",
-    "right-ipblock-exempt": "zaobilaženje blokiranja IP adrese, samoblokiranja i blokiranja opsega",
+    "right-ipblock-exempt": "zaobilaženje blokiranja IP adrese, automatska blokiranja i blokiranja opsega",
     "right-proxyunbannable": "zaobilaženje samoblokiranja posrednika",
     "right-unblockself": "odblokiraj samog sebe",
     "right-protect": "promeni nivoe zaštite i uredi stranice sa prenosivom zaštitom",
-    "right-editprotected": "uredi stranice pod zaštitom „{{int:protect-level-sysop}}“",
+    "right-editprotected": "uređivanje stranice pod zaštitom „{{int:protect-level-sysop}}“",
+    "right-editsemiprotected": "uređivanje stranica pod zaštitom „{{int:protect-level-autoconfirmed}}“",
     "right-editinterface": "uređivanje korisničkog sučelja",
     "right-editusercssjs": "uređivanje tuđih CSS i javaskript datoteka",
     "right-editusercss": "uređivanje tuđih CSS datoteka",
-    "right-edituserjs": "uređivanje tuđih javaskript datoteka",
+    "right-edituserjs": "uređivanje tuđih JavaScript datoteka",
+    "right-editmyuserjs": "uređivanje sopstvenih JavaScript datoteka",
+    "right-viewmyprivateinfo": "vidite svoje lične podatke (npr. adresu e-pošte, pravo ime)",
+    "right-editmyprivateinfo": "uređivanje sopstvenih ličnih podataka (npr. adresu e-pošte, pravo ime)",
+    "right-editmyoptions": "uredite svoja podešavanja",
     "right-rollback": "brzo vraćanje izmena poslednjeg korisnika koji je menjao određenu stranicu",
     "right-markbotedits": "označavanje vraćenih izmena kao izmene bota",
     "right-noratelimit": "otpornost na ograničenja",
     "right-import": "uvoženje stranica iz drugih vikija",
     "right-importupload": "uvoženje stranica iz otpremljene datoteke",
-    "right-patrol": "označavanje tuđih izmena kao pregledanih",
-    "right-autopatrol": "samooznačavanje izmena kao pregledane",
+    "right-patrol": "označavanje tuđih izmena patroliranim",
+    "right-autopatrol": "automatsko označavanje izmena kao pregledanim",
     "right-patrolmarks": "pregledanje oznaka za patroliranje unutar skorašnjih izmena",
     "right-unwatchedpages": "pregledanje spiska nenadgledanih stranica",
     "right-mergehistory": "spajanje istorija stranica",
     "action-userrights-interwiki": "uređivanje korisničkih prava na drugim vikijima",
     "action-siteadmin": "zaključavanje ili otključavanje baze podataka",
     "action-sendemail": "slanje e-poruka",
+    "action-editmywatchlist": "izmeni svoj spisak nadgledanja",
     "nchanges": "$1 {{PLURAL:$1|izmena|izmene|izmena}}",
+    "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|izmena od vaše poslednje posete}}",
+    "enhancedrc-history": "istorija",
     "recentchanges": "Skorašnje izmene",
     "recentchanges-legend": "Postavke skorašnjih izmena",
     "recentchanges-summary": "Pratite skorašnje izmene na ovoj stranici.",
     "upload-permitted": "Dozvoljeni tipovi datoteka: $1.",
     "upload-preferred": "Preporučeni tipovi datoteka: $1.",
     "upload-prohibited": "Zabranjeni tipovi datoteka: $1.",
-    "uploadlog": "dnevnik otpremanja",
     "uploadlogpage": "Dnevnik otpremanja",
     "uploadlogpagetext": "Ispod je spisak skorašnjih slanja.\nPogledajte [[Special:NewFiles|galeriju novih datoteka]] za lepši pregled.",
     "filename": "Naziv datoteke",
     "filereuploadsummary": "Izmene datoteke:",
     "filestatus": "Status autorskog prava:",
     "filesource": "Izvor:",
-    "uploadedfiles": "Poslate datoteke",
     "ignorewarning": "Zanemari upozorenja i sačuvaj datoteku",
     "ignorewarnings": "Zanemari sva upozorenja",
     "minlength1": "Naziv datoteke mora imati barem jedan znak.",
     "overwroteimage": "je poslao novu verziju datoteke „[[$1]]“",
     "uploaddisabled": "Otpremanje je onemogućeno.",
     "copyuploaddisabled": "Slanje putem URL adrese je onemogućeno.",
-    "uploadfromurl-queued": "Slanje je stavljeno na spisak čekanja.",
     "uploaddisabledtext": "Otpremanje datoteka je onemogućeno.",
     "php-uploaddisabledtext": "Slanje datoteka je onemogućeno u PHP-u.\nProverite postavke file_uploads.",
     "uploadscripted": "Datoteka sadrži HTML ili skriptni kod koji može biti pogrešno protumačen od strane pregledača.",
+    "uploadscriptednamespace": "Ova SVG datoteka sadrži pogrešan imenski prostor „$1“",
     "uploadvirus": "Datoteka sadrži virus!\nDetalji: $1",
     "uploadjava": "Datoteka je formata ZIP koji sadrži java .class element.\nSlanje java datoteka nije dozvoljeno jer one mogu izazvati zaobilaženje sigurnosnih ograničenja.",
     "upload-source": "Izvorna datoteka",
     "upload-misc-error": "Nepoznata greška pri slanju datoteke",
     "upload-misc-error-text": "Nepoznata greška pri slanju datoteke.\nProverite da li je adresa ispravna i pokušajte ponovo.\nAko se problem ne reši, kontaktirajte [[Special:ListUsers/sysop|administratora]].",
     "upload-too-many-redirects": "Adresa sadrži previše preusmerenja",
-    "upload-unknown-size": "Nepoznata veličina",
     "upload-http-error": "Došlo je do HTTP greške: $1",
     "upload-copy-upload-invalid-domain": "Primerci otpremanja nisu dostupni na ovom domenu.",
     "backend-fail-stream": "Ne mogu da emitujem datoteku $1.",
     "img-auth-streaming": "Učitavanje „$1“.",
     "img-auth-public": "Svrha img_auth.php je da prosleđuje datoteke iz privatnih vikija.\nOvaj viki je postavljen kao javni.\nRadi sigurnosti, img_auth.php je onemogućen.",
     "img-auth-noread": "Korisnik nema pristup za čitanje „$1“.",
-    "img-auth-bad-query-string": "Adresa ima neispravnu nisku upita.",
     "http-invalid-url": "Neispravna adresa: $1",
     "http-invalid-scheme": "Adrese sa šemom „$1“ nisu podržane.",
     "http-request-error": "HTTP zahtev nije prošao zbog nepoznate greške.",
     "filehist-dimensions": "Dimenzije",
     "filehist-filesize": "Veličina datoteke",
     "filehist-comment": "Komentar",
-    "filehist-missing": "Datoteka nedostaje",
     "imagelinks": "Upotreba datoteke",
     "linkstoimage": "{{PLURAL:$1|Sledeća stranica koristi|$1 sledeće stranice koriste|$1 sledećih stranica koristi}} ovu datoteku:",
     "linkstoimage-more": "Više od $1 {{PLURAL:$1|stranice|stranice|stranica}} je povezano s ovom datotekom.\nSledeći spisak prikazuje samo {{PLURAL:$1|prvu stranicu povezanu|prve $1 stranice povezane|prvih $1 stranica povezanih}} s ovom datotekom.\nDostupan je i [[Special:WhatLinksHere/$2|potpuni spisak]].",
     "unusedtemplateswlh": "ostale veze",
     "randompage": "Slučajna stranica",
     "randompage-nopages": "Nema stranica u {{PLURAL:$2|sledećem imenskom prostoru|sledećim imenskim prostorima}}: $1.",
+    "randomincategory": "Slučajna stranica u kategoriji",
+    "randomincategory-selectcategory-submit": "Idi",
     "randomredirect": "Slučajno preusmerenje",
     "randomredirect-nopages": "Nema preusmerenja u imenskom prostoru „$1”.",
     "statistics": "Statistike",
     "statistics-users-active": "Aktivni korisnici",
     "statistics-users-active-desc": "Korisnici koji su izvršili bar jednu radnju {{PLURAL:$1|prethodni dan|u poslednja $1 dana|u poslednjih $1 dana}}",
     "statistics-mostpopular": "Najposećenije stranice",
+    "pageswithprop": "Strane s osobinom strane",
+    "pageswithprop-legend": "Strane s osobinom strane",
+    "pageswithprop-text": "Ova strana izlistava strane koje imaju određenu osobinu",
     "pageswithprop-prop": "Ime osobine:",
     "pageswithprop-submit": "Idi",
     "doubleredirects": "Dvostruka preusmerenja",
     "mostrevisions": "Stranice s najviše izmena",
     "prefixindex": "Sve stranice s prefiksom",
     "prefixindex-namespace": "Sve stranice s predmetkom (imenski prostor $1)",
+    "prefixindex-strip": "Sakrij prefiks u spisku",
     "shortpages": "Kratke stranice",
     "longpages": "Dugačke stranice",
     "deadendpages": "Stranice bez unutrašnjih veza",
     "emailuser-title-notarget": "Slanje e-poruke korisniku",
     "emailpage": "Slanje e-poruka",
     "emailpagetext": "Možete da koristite donji obrazac da pošaljete e-poruku {{GENDER:$1|ovom korisniku|ovoj korisnici|ovom korisniku|}}.\nE-adresa koju ste uneli u vašim [[Special:Preferences|podešavanjima]] će se prikazati u polju „Od“, tako da će primalac moći da vam odgovori direktno.",
-    "usermailererror": "Došlo je do greške pri slanju poruke:",
     "defemailsubject": "{{SITENAME}} e-adresa {{GENDER:$1|korisnika|korisnice|korisnika}} $1",
     "usermaildisabled": "Korisnička e-pošta je onemogućena",
     "usermaildisabledtext": "Ne možete da šaljete e-poruke drugim korisnicima na ovom vikiju",
     "noemailtitle": "Nema e-adrese",
     "noemailtext": "Ovaj korisnik nije naveo ispravnu e-adresu.",
-    "nowikiemailtitle": "E-pošta nije dozvoljena",
     "nowikiemailtext": "Ovaj korisnik je odlučio da ne prima e-poruke od drugih korisnika.",
     "emailnotarget": "Nepostojeće ili neispravno korisničko ime primaoca.",
     "emailtarget": "Unos korisničkog imena primaoca",
     "nowatchlist": "Vaš spisak nadgledanja je prazan.",
     "watchlistanontext": "Morate biti $1 da biste gledali i uređivali stavke na vašem spisku nadgledanja.",
     "watchnologin": "Niste prijavljeni",
-    "watchnologintext": "Morate biti [[Special:UserLogin|prijavljeni]] da biste menjali spisak nadgledanja.",
     "addwatch": "Dodaj na spisak nadgledanja",
     "addedwatchtext": "Stranica „[[:$1]]“ je dodata na vaš [[Special:Watchlist|spisak nadgledanja]].\nBuduće izmene ove stranice i njene stranice za razgovor biće navedene ovde.",
     "removewatch": "Ukloni sa spiska nadgledanja",
     "watching": "Nadgledanje…",
     "unwatching": "Prekidanje nadgledanja…",
     "watcherrortext": "Došlo je do greške pri promeni postavki vašeg spiska nadgledanja za „$1“.",
-    "enotif_mailer": "{{SITENAME}} e-obaveštenje",
     "enotif_reset": "Označi sve stranice kao posećene",
     "enotif_impersonal_salutation": "{{SITENAME}} korisnik",
+    "enotif_subject_deleted": "Stranicu $1 na {{SITENAME}} {{GENDER:$2|obrisao je|obrisala je}} $2",
+    "enotif_subject_created": "Stranicu $1 na {{SITENAME}} {{GENDER:$2|napravio je|napravila je}} $2",
+    "enotif_subject_moved": "Stranicu $1 na {{SITENAME}} {{GENDER:$2|premestio je|premestila je}} $2",
+    "enotif_subject_restored": "Stranicu $1 na {{SITENAME}} {{GENDER:$2|vratio je|vratila je}} $2",
+    "enotif_subject_changed": "Stranicu $1 na {{SITENAME}} {{GENDER:$2|promenio je|promenila je}} $2",
+    "enotif_body_intro_deleted": "Stranicu $1 na {{SITENAME}} {{GENDER:$2|obrisao je|obrisala je}} $2 dana $PAGEEDITDATE. Pogledajte $3.",
+    "enotif_body_intro_created": "Stranicu $1 na {{SITENAME}} {{GENDER:$2|napravio je|napravila je|napravio je}} $2 dana $PAGEEDITDATE. Trenutna izmena nalazi se na $3.",
+    "enotif_body_intro_moved": "Stranicu $1 na {{SITENAME}} {{GENDER:$2|premestio je|premestila je}} $2 dana $PAGEEDITDATE. Trenutna izmena nalazi se na  $3.",
+    "enotif_body_intro_restored": "Stranicu $1 na {{SITENAME}} {{GENDER:$2|vratio je|vratila je|vratio je}} $2 dana $PAGEEDITDATE. Trenutna izmena nalazi se na $3.",
+    "enotif_body_intro_changed": "Stranicu $1 na {{SITENAME}} {{GENDER:$2|promenio je|promenila je|promenio je}} $2 dana $PAGEEDITDATE. Trenutna izmena nalazi se na $3.",
     "enotif_lastvisited": "Pogledajte $1 za sve izmene od vaše poslednje posete.",
     "enotif_lastdiff": "Pogledajte $1 da vidite ovu izmenu.",
     "enotif_anon_editor": "anoniman korisnik $1",
     "excontent": "sadržaj je bio: „$1“",
     "excontentauthor": "sadržaj je bio: „$1“ (a jedini urednik je bio „[[Special:Contributions/$2|$2]]“)",
     "exbeforeblank": "sadržaj pre brisanja je bio: „$1“",
-    "exblank": "stranica je bila prazna",
     "delete-confirm": "Brisanje stranice „$1“",
     "delete-legend": "Obriši",
     "historywarning": "'''Upozorenje:''' stranica koju želite da obrišete ima istoriju s približno $1 {{PLURAL:$1|izmenom|izmene|izmena}}:",
     "allmessagesname": "Naziv",
     "allmessagesdefault": "Podrazumevani tekst",
     "allmessagescurrent": "Trenutni tekst poruke",
-    "allmessagestext": "Ovo je spisak svih sistemskih poruka koje su dostupne u imenskom prostoru „Medijaviki“.\nPosetite [https://www.mediawiki.org/wiki/Localisation Medijaviki lokalizaciju] i [//translatewiki.net Translejtviki] ako želite da pomognete u prevođenju.",
+    "allmessagestext": "Ovo je spisak svih sistemskih poruka koje su dostupne u imenskom prostoru „Medijaviki“.\nPosetite [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation Medijaviki lokalizaciju] i [//translatewiki.net Translejtviki] ako želite da pomognete u prevođenju.",
     "allmessagesnotsupportedDB": "Ova stranica ne može da se koristi jer je '''$wgUseDatabaseMessages''' onemogućen.",
     "allmessages-filter-legend": "Filter",
     "allmessages-filter": "Filtriraj po stanju:",
     "importunknownsource": "Nepoznata vrsta za uvoz",
     "importcantopen": "Ne mogu da otvorim datoteku za uvoz",
     "importbadinterwiki": "Neispravna međuviki veza",
-    "importnotext": "Prazno ili bez teksta",
     "importsuccess": "Uvoženje je završeno!",
-    "importhistoryconflict": "Postoji sukobljena izmena u istoriji (možda je ova stranica već uvezena ranije)",
     "importnosources": "Nije određen nijedan međuviki izvor za uvoz, tako da je otpremanje istorije onemogućeno.",
     "importnofile": "Uvozna datoteka nije poslata.",
     "importuploaderrorsize": "Ne mogu da otpremim datoteku za uvoz.\nDatoteka je veća od dozvoljene veličine.",
     "import-error-interwiki": "Ne mogu da uvezem stranicu „$1“ jer je njen naziv rezervisan za spoljno povezivanje (međuviki).",
     "import-error-special": "Ne mogu da uvezem stranicu „$1“ jer ona pripada posebnom imenskom prostoru koje ne prihvata stranice.",
     "import-error-invalid": "Ne mogu da uvezem stranicu „$1“ jer je njen naziv neispravan.",
+    "import-error-unserialize": "Verzija $2 stranice $1 ne može biti pročitana/uvezena. Zapisano je da verzija koristi $3 tip sadržaja u $4 formatu.",
     "import-options-wrong": "{{PLURAL:$2|Pogrešna opcija|Pogrešne opcije}}: <nowiki>$1</nowiki>",
     "import-rootpage-invalid": "Navedena osnovna stranica ima neispravan naslov.",
     "import-rootpage-nosubpage": "Imenski prostor „$1“ osnovne stranice ne dozvoljava podstranice.",
     "tooltip-recreate": "Ponovo napravite stranicu iako je obrisana",
     "tooltip-upload": "Započnite otpremanje",
     "tooltip-rollback": "Opcija „Vrati“ vraća izmene poslednjeg korisnika",
-    "tooltip-undo": "Vraća ovu izmenu i otvara obrazac za uređivanje.",
+    "tooltip-undo": "Poništava ovu izmenu i otvara obrazac za uređivanje.",
     "tooltip-preferences-save": "Sačuvaj postavke",
     "tooltip-summary": "Unesite kratak opis",
     "common.css": "/** CSS postavljen ovde će se odraziti na sve teme */",
     "spam_reverting": "Vraćam na poslednju izmenu koja ne sadrži veze do $1",
     "spam_blanking": "Sve izmene sadrže veze do $1. Čistim",
     "spam_deleting": "Sve izmene sadrže veze do $1. Brišem",
-    "simpleantispam-label": "Provera spama. '''NE''' popunjavaj ovo unutra!",
+    "simpleantispam-label": "Anti-spama provera. \n<strong>NE</strong> popunjavaj ovo unutra!",
     "pageinfo-title": "Podaci o „$1“",
     "pageinfo-not-current": "Nažalost, nemoguće je pribaviti ove podatke za starije izmene.",
     "pageinfo-header-basic": "Osnovni podaci",
     "minutes": "{{PLURAL:$1|$1 minut|$1 minuta|$1 minuta}}",
     "hours": "{{PLURAL:$1|$1 sat|$1 sata|$1 sati}}",
     "days": "{{PLURAL:$1|$1 dan|$1 dana|$1 dana}}",
+    "weeks": "{{PLURAL:$1|$1 sedmica}}",
+    "months": "{{PLURAL:$1|$1 mesec|$1 meseci}}",
     "years": "{{PLURAL:$1|$1 godina|$1 godine}}",
     "ago": "pre $1",
     "just-now": "upravo sad",
+    "hours-ago": "Pre $1 {{PLURAL:$1|sat|sata|sati}}",
     "minutes-ago": "Pre $1 {{PLURAL:$1|minut|minuta}}",
     "bad_image_list": "Format je sledeći:\n\nRazmatraju se samo nabrajanja (redovi koji počinju sa zvezdicom).\nPrva veza u redu mora da bude veza do neispravne datoteke.\nSve daljnje veze u istom redu smatraju se izuzecima.",
     "variantname-zh-hans": "hans",
     "semicolon-separator": ";&#32;",
     "comma-separator": ",&#32;",
     "colon-separator": ":&#32;",
-    "pipe-separator": "&#32;&#32;",
+    "pipe-separator": "&#32;|&#32;",
     "word-separator": "&#32;",
     "ellipsis": "…",
     "percent": "$1%",
index e62ff64..af91034 100644 (file)
     "currentevents": "Tentakalo tanyalo",
     "currentevents-url": "Project:Tentakalo tanyalo",
     "edithelp": "Lusito ngekuhlela",
-    "helppage": "Help:Lokucuketfwe",
     "mainpage": "Likhasi Lelikhulu",
     "mainpage-description": "Likhasi lelikhulu",
     "policy-url": "Project:Umtsetfo",
index 2eba66d..378278b 100644 (file)
     "prefs-skin": "Skin",
     "skin-preview": "Foarskau",
     "datedefault": "Neen Preferenz",
-    "prefs-beta": "Beta-Funktione",
     "prefs-datetime": "Doatum un Tied",
     "prefs-labs": "Alpha-Funktione",
     "prefs-personal": "Benutserdoaten",
     "nowatchlist": "Du hääst neen Iendraage ap dien Beooboachtengslieste. Du moast anmälded weese, dät die een Beooboachtengslieste tou Ferföigenge stoant.",
     "watchlistanontext": "Du moast die $1, uum dien Beooboachtengslieste tou sjoon of Iendraage ap hier tou beoarbaidjen.",
     "watchnologin": "Du bäst nit anmälded",
-    "watchnologintext": "Du moast [[Special:UserLogin|anmälded]] weese, uum dien Beooboachtengslieste tou beoarbaidjen.",
     "addwatch": "Tou Beooboachtengslieste bietouföigje",
     "addedwatchtext": "Die Artikkel \"[[:$1]]\" wuude an dien [[Special:Watchlist|Foulgelieste]] touföiged.\nLeetere Annerengen an dissen Artikkel un ju touheerende Diskussionssiede wäide deer liested\nun die Artikkel wäd in ju [[Special:RecentChanges|fon do lääste Annerengen]] in '''Fatskrift''' anroat.\n\nWan du die Artikkel wier fon ju Foulgelieste ou hoalje moatest, klik ap ju Siede ap \"Ferjeet disse Siede\".",
     "removewatch": "Fon ju Beooboachtengslieste wächhoalje",
     "allmessagesname": "Noome",
     "allmessagesdefault": "Standardtext",
     "allmessagescurrent": "Dissen Text",
-    "allmessagestext": "Dit is ne Lieste fon aal System-Ättergjuchte do in dän MediaWiki-Noomenruum tou Ferföigenge stounde.\nBesäik jädden [https://www.mediawiki.org/wiki/Localisation MediaWiki Localisation] un [//translatewiki.net translatewiki.net], wan du mee-oarbaidje wolt an ju MediaWiki-Sortierenge.",
+    "allmessagestext": "Dit is ne Lieste fon aal System-Ättergjuchte do in dän MediaWiki-Noomenruum tou Ferföigenge stounde.\nBesäik jädden [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation MediaWiki Localisation] un [//translatewiki.net translatewiki.net], wan du mee-oarbaidje wolt an ju MediaWiki-Sortierenge.",
     "allmessagesnotsupportedDB": "Disse Spezioalsiede stoant nit tou Ferföigenge, deer ju uur dän Parameter <tt>$wgUseDatabaseMessages</tt> deaktivierd wuude.",
     "allmessages-filter-legend": "Sieuwe",
     "allmessages-filter": "Sieuwe foar anpaaseden Toustand:",
index fe20a0a..f27961d 100644 (file)
     "permalink": "Permanent länk",
     "print": "Skriv ut",
     "view": "Visa",
+    "view-foreign": "Visa på $1",
     "edit": "Redigera",
+    "edit-local": "Redigera lokal beskrivning",
     "create": "Skapa",
+    "create-local": "Lägg till en lokal beskrivning",
     "editthispage": "Redigera denna sida",
     "create-this-page": "Skapa denna sida",
     "delete": "Radera",
     "pool-timeout": "Timeout i väntan på låsning",
     "pool-queuefull": "Kön är full",
     "pool-errorunknown": "Okänt fel",
+    "pool-servererror": "Pool counter-tjänsten är inte tillgänglig ($1).",
     "aboutsite": "Om {{SITENAME}}",
     "aboutpage": "Project:Om",
     "copyright": "Innehållet är tillgängligt under $1 om inte annat anges.",
     "thisisdeleted": "Visa eller återställ $1?",
     "viewdeleted": "Visa $1?",
     "restorelink": "{{PLURAL:$1|en raderad version|$1 raderade versioner}}",
-    "feedlinks": "Matning:",
-    "feed-invalid": "Ogiltig matningstyp.",
-    "feed-unavailable": "Webbmatningar (feeds) är inte tillgängliga",
-    "site-rss-feed": "$1 RSS-matning",
-    "site-atom-feed": "$1 Atom-matning",
-    "page-rss-feed": "\"$1\" RSS-matning",
-    "page-atom-feed": "\"$1\" Atom-matning",
+    "feedlinks": "Flöde:",
+    "feed-invalid": "Ogiltig flödestyp.",
+    "feed-unavailable": "Syndikerade flöden är inte tillgängliga",
+    "site-rss-feed": "$1 RSS-flöde",
+    "site-atom-feed": "$1 Atom-flöde",
+    "page-rss-feed": "\"$1\" RSS-flöde",
+    "page-atom-feed": "\"$1\" Atom-flöde",
     "red-link-title": "$1 (sidan existerar inte)",
     "sort-descending": "Sortera fallande",
     "sort-ascending": "Sortera stigande",
     "databaseerror-error": "Fel: $1",
     "laggedslavemode": "<strong>Varning:</strong> Sidan kan sakna de senaste uppdateringarna.",
     "readonly": "Databasen är låst",
-    "enterlockreason": "Ange varför sidan låsts, och ge en uppskattning av hur länge låset kommer att släppas",
+    "enterlockreason": "Ange varför databasen låsts, inkludera en uppskattning om när låsningen kommer att hävas",
     "readonlytext": "Databasen är tillfälligt låst för nya inlägg och andra modifieringar, förmodligen på grund av rutinmässigt underhåll, efter vilket den kommer den att återgå till normalläge.\n\nDen administratör som låste den har angivit följande förklaring: $1",
     "missing-article": "Databasen hittade inte texten för en sida som den borde ha funnit, med namnet \"$1\" $2.\n\nDetta orsakas oftast av att man följer en inaktuell länk till en jämförelse mellan versioner (diff) eller en historiklänk för en sida som raderats.\n\nOm inte så är fallet, kan du ha hittat en bugg i mjukvaran.\nRapportera gärna problemet till någon [[Special:ListUsers/sysop|administratör]], ange då URL:en (webbadressen).",
     "missingarticle-rev": "(versionsnummer: $1)",
     "badtitle": "Felaktig titel",
     "badtitletext": "Den begärda sidtiteln är antingen ogiltig eller tom, eller så är titeln felaktigt länkad från en annan wiki.\nDen kan innehålla ett eller flera tecken som inte får användas i sidtitlar.",
     "perfcached": "Följande data är cachad och är möjligtvis inte helt uppdaterad. Maximalt {{PLURAL:$1|ett|$1}} resultat finns {{PLURAL:$1|tillgängligt|tillgängliga}} i cachen.",
-    "perfcachedts": "Sidan är hämtad ur ett cacheminne och uppdaterades senast $1. Maximalt {{PLURAL:$4|ett|$4}} resultat finns {{PLURAL:$4|tillgängligt|tillgängliga}} i cachen.",
+    "perfcachedts": "Följande data är cachad och uppdaterades senast $1. Maximalt {{PLURAL:$4|ett|$4}} resultat finns {{PLURAL:$4|tillgängligt|tillgängliga}} i cachen.",
     "querypage-no-updates": "Uppdatering av den här sidan är inte aktiverad. Datan kommer i nuläget inte att uppdateras.",
     "viewsource": "Visa wikitext",
-    "viewsource-title": "Visa källkod för $1",
+    "viewsource-title": "Visa källa för $1",
     "actionthrottled": "Åtgärden stoppades",
     "actionthrottledtext": "Som skydd mot spam, finns det en begränsning av hur många gånger du kan utföra den här åtgärden under en viss tid. Du har överskridit den gränsen. Försök igen om några minuter.",
     "protectedpagetext": "Den här sidan har skrivskyddats för att förhindra redigering eller andra åtgärder.",
     "mypreferencesprotected": "Du har inte behörighet att redigera dina inställningar.",
     "ns-specialprotected": "Specialsidor kan inte redigeras.",
     "titleprotected": "Denna sidtitel har skyddats från att skapas av [[User:$1|$1]].\nDen angivna anledningen är \"''$2''\".",
-    "filereadonlyerror": "Det går inte att ändra filen \"$1\", eftersom fildatabasen \"$2\" är i skrivskyddat läge.\n\nDen administratör som låste den angav följande anledning: \"''$3''\".",
+    "filereadonlyerror": "Det går inte att ändra filen \"$1\", eftersom fildatabasen \"$2\" är i skrivskyddat läge.\n\nDen administratör som låste den angav följande anledning: \"$3\".",
     "invalidtitle-knownnamespace": "Ogiltig titel med namnrymden \"$2\" och texten \"$3\"",
     "invalidtitle-unknownnamespace": "Ogiltig titel med okänt namnrymdsnummer $1 och texten \"$2\"",
     "exception-nologin": "Inte inloggad",
     "password-login-forbidden": "Användningen av dessa användarnamn och lösenord har förbjudits.",
     "mailmypassword": "Återställ lösenord",
     "passwordremindertitle": "Nytt temporärt lösenord från {{SITENAME}}",
-    "passwordremindertext": "Någon (förmodligen du, från IP-adressen $1) har begärt ett nytt lösenord till {{SITENAME}} ($4). Ett tillfälligt lösenordet för användaren \"$2\" har skapats och det blev \"$3\". Om detta var vad du önskade, så behöver du nu logga in och välja ett nytt lösenord. Ditt tillfälliga lösenord går ut om {{PLURAL:$5|ett dygn|$5 dygn}}.\n\nOm denna begäran gjordes av någon annan, eller om du har kommit på ditt lösenord,\noch inte längre önskar ändra det, så kan du ignorera detta meddelande. Då kan du\nfortsätta använda ditt gamla lösenord.",
+    "passwordremindertext": "Någon (förmodligen du, från IP-adressen $1) har begärt ett nytt lösenord för {{SITENAME}} ($4). Ett tillfälligt lösenordet för användaren \"$2\" har skapats och satts till \"$3\". Om detta var vad du önskade, behöver du nu logga in och välja ett nytt lösenord. Ditt tillfälliga lösenord går ut om {{PLURAL:$5|ett dygn|$5 dygn}}.\n\nOm denna begäran gjordes av någon annan, eller om du har kommit ihåg ditt lösenord, och inte längre önskar ändra det, kan du ignorera detta meddelande och fortsätta använda ditt gamla lösenord.",
     "noemail": "Användaren \"$1\" har inte registrerat någon e-postadress.",
     "noemailcreate": "Du måste ange en giltig e-postadress",
     "passwordsent": "Ett nytt lösenord har skickats till den e-postadress som användaren \"$1\" har registrerat. När du får meddelandet, var god logga in igen.",
     "eauthentsent": "Ett e-postmeddelande för bekräftelse har skickats till den angivna e-postadressen.\nInnan någon annan e-post kan skickas till kontot, måste du följa instruktionerna i e-postmeddelandet för att bekräfta att kontot verkligen är ditt.",
     "throttled-mailpassword": "En lösenordsåterställning har redan skickats för mindre än {{PLURAL:$1|en timme|$1 timmar}} sedan.\nFör att förhindra missbruk skickas bara en lösenordsåterställning per {{PLURAL:$1|timme|$1-timmarsperiod}}.",
     "mailerror": "Fel vid skickande av e-post: $1",
-    "acct_creation_throttle_hit": "Besökare till den här wikin som har använt din IP-adress har skapat {{PLURAL:$1|1 användarkonto|$1 användarkonton}} under det senaste dygnet, vilket är det maximalt tillåtna inom den tidsperioden.\nSom ett resultat kan besökare som använder den här IP-adressen inte skapa några fler användarkonton just nu.",
+    "acct_creation_throttle_hit": "Besökare till den här wikin som har använt din IP-adress har skapat {{PLURAL:$1|ett användarkonto|$1 användarkonton}} under det senaste dygnet, vilket är det maximalt tillåtna inom den tidsperioden.\nSom ett resultat kan besökare som använder den här IP-adressen inte skapa några fler användarkonton just nu.",
     "emailauthenticated": "Din e-postadress bekräftades den $2 kl. $3.",
     "emailnotauthenticated": "Din e-postadress är ännu inte bekräftad. Ingen e-post kommer att skickas vad gäller det följande funktionerna.",
     "noemailprefs": "Uppge en e-postadress i dina inställningar för att få dessa funktioner att fungera.",
     "accountcreatedtext": "Användarkontot [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|diskussion]]) har skapats.",
     "createaccount-title": "Konto skapat på {{SITENAME}}",
     "createaccount-text": "Någon har skapat ett konto åt din e-postadress på {{SITENAME}} ($4) med namnet \"$2\" och lösenordet \"$3\". Du bör nu logga in och ändra ditt lösenord.\n\nDu kan ignorera detta meddelande om kontot skapats av misstag.",
-    "usernamehasherror": "Användarnamnet får inte innehålla #.",
-    "login-throttled": "Du har gjort för många misslyckade inloggningsförsök till det här kontot.\nVänta $1 innan du försöker igen.",
+    "login-throttled": "Du har gjort för många misslyckade inloggningsförsök.\nVänta $1 innan du försöker igen.",
     "login-abort-generic": "Din inloggning misslyckades - Avbröts",
     "loginlanguagelabel": "Språk: $1",
     "suspicious-userlogout": "Din begäran om att logga ut nekades eftersom det ser ut som det skickades av en trasig webbläsare eller cachande proxy.",
     "user-mail-no-addy": "Försökte skicka e-post utan en e-postadress",
     "user-mail-no-body": "Försökte skicka e-post med tomt eller orimligt kort innehåll.",
     "changepassword": "Byt lösenord",
-    "resetpass_announce": "För att slutföra inloggningen måste du välja ett nytt lösenord.",
+    "resetpass_announce": "För att slutföra inloggningen måste du ange ett nytt lösenord.",
     "resetpass_text": "<!-- Lägg till text här -->",
     "resetpass_header": "Ändra lösenord för konto",
     "oldpassword": "Gammalt lösenord:",
     "retypenew": "Upprepa det nya lösenordet:",
     "resetpass_submit": "Ange lösenord och logga in",
     "changepassword-success": "Ditt lösenord har ändrats!",
-    "changepassword-throttled": "Du har gjort för många misslyckade inloggningsförsök.\nVänta $1 innan du försöker igen.",
+    "changepassword-throttled": "Du har gjort för många inloggningsförsök nyligen.\nVänta $1 innan du försöker igen.",
     "resetpass_forbidden": "Lösenord kan inte ändras",
     "resetpass-no-info": "Du måste vara inloggad för att komma åt den här sidan direkt.",
     "resetpass-submit-loggedin": "Ändra lösenord",
     "resetpass-submit-cancel": "Avbryt",
     "resetpass-wrong-oldpass": "Ogiltigt tillfälligt eller nuvarande lösenord.\nDu kanske redan har lyckats ändra ditt lösenord eller begärt ett nytt tillfälligt lösenord.",
     "resetpass-recycled": "Var god återställ ditt lösenord till någonting annat än ditt aktuella lösenord.",
-    "resetpass-temp-emailed": "Du loggade in med en temporär kod som skickats via e-post.\nFör att slutföra inloggningen måste du välja ett nytt lösenord här:",
+    "resetpass-temp-emailed": "Du loggade in med en temporär kod som skickats via e-post.\nFör att slutföra inloggningen måste du ange ett nytt lösenord här:",
     "resetpass-temp-password": "Tillfälligt lösenord:",
     "resetpass-abort-generic": "Lösenordsändring av har avbrutits av ett tillägg.",
-    "resetpass-expired": "Ditt lösenord har gått ut. Var god välj ett nytt lösenord för att logga in.",
+    "resetpass-expired": "Ditt lösenord har gått ut. Var god ange ett nytt lösenord för att logga in.",
     "resetpass-expired-soft": "Ditt lösenord har gått ut och behöver återställas. Var god välj ett nytt lösenord nu eller klicka på \"{{int:resetpass-submit-cancel}}\" för att återställa det senare.",
     "resetpass-validity-soft": "Ditt lösenord är ogiltigt: $1\n\nVar god välj ett nytt lösenord nu eller klicka på \"{{int:resetpass-submit-cancel}}\" för att återställa det senare.",
     "passwordreset": "Återställ lösenord",
     "passwordreset-capture-help": "Om du markerar den här rutan kommer e-postmeddelandet (med det tillfälliga lösenordet) visas för dig och skickas till användaren.",
     "passwordreset-email": "E-postadress:",
     "passwordreset-emailtitle": "Kontouppgifter på {{SITENAME}}",
-    "passwordreset-emailtext-ip": "Någon (förmodligen du, från IP-adressen $1) begärde en återställning av ditt lösenord för {{SITENAME}} ($4). Följande användar{{PLURAL:$3|konto är förknippad|konton är förknippade}} med denna e-postadress:\n\n$2\n\n{{PLURAL:$3|Detta|Dessa}} tillfälliga lösenord kommer att gå ut om {{PLURAL:$5|en dag|$5 dagar}}.\nDu bör logga in och välja ett nytt lösenord nu. Om någon annan gjorde denna begäran, eller om du kommer ihåg ditt ursprungliga lösenord, och du önskar inte att ändra det, kan du ignorera detta meddelande och fortsätta använda ditt gamla lösenord.",
-    "passwordreset-emailtext-user": "Användaren $1 på {{SITENAME}} begärde en återställning av ditt lösenord för {{SITENAME}} ($4). Följande användar{{PLURAL:$3|konto är förknippad|konton är förknippade}} med denna e-postadress:\n\n$2\n\n{{PLURAL:$3|Detta|Dessa}} tillfälliga lösenord kommer att gå ut om {{PLURAL:$5|en dag|$5 dagar}}.\nDu bör logga in och välja ett nytt lösenord nu. Om någon annan gjorde denna begäran, eller om du kommer ihåg ditt ursprungliga lösenord, och du önskar inte att ändra det, kan du ignorera detta meddelande och fortsätta använda ditt gamla lösenord.",
+    "passwordreset-emailtext-ip": "Någon (förmodligen du, från IP-adressen $1) begärde en återställning av ditt lösenord för {{SITENAME}} ($4). Följande användar{{PLURAL:$3|konto är förknippad|konton är förknippade}} med denna e-postadress:\n\n$2\n\n{{PLURAL:$3|Detta|Dessa}} tillfälliga lösenord kommer att gå ut om {{PLURAL:$5|en dag|$5 dagar}}.\nDu bör logga in och välja ett nytt lösenord nu. Om någon annan gjorde denna begäran, eller om du kommer ihåg ditt ursprungliga lösenord, och inte längre önskar ändra det, kan du ignorera detta meddelande och fortsätta använda ditt gamla lösenord.",
+    "passwordreset-emailtext-user": "Användaren $1 på {{SITENAME}} begärde en återställning av ditt lösenord för {{SITENAME}} ($4). Följande användar{{PLURAL:$3|konto är förknippad|konton är förknippade}} med denna e-postadress:\n\n$2\n\n{{PLURAL:$3|Detta|Dessa}} tillfälliga lösenord kommer att gå ut om {{PLURAL:$5|en dag|$5 dagar}}.\nDu bör logga in och välja ett nytt lösenord nu. Om någon annan gjorde denna begäran, eller om du kommer ihåg ditt ursprungliga lösenord, och inte längre önskar ändra det, kan du ignorera detta meddelande och fortsätta använda ditt gamla lösenord.",
     "passwordreset-emailelement": "Användarnamn: $1\nTillfälligt lösenord: $2",
     "passwordreset-emailsent": "En lösenordsåterställning via e-post har skickats.",
     "passwordreset-emailsent-capture": "En lösenordsåterställning via e-post har skickats, som visas nedan.",
     "prefs-skin": "Utseende",
     "skin-preview": "Förhandsvisning",
     "datedefault": "Ovidkommande",
-    "prefs-beta": "Betafunktioner",
-    "prefs-datetime": "Datum och tid",
     "prefs-labs": "Testfunktioner",
     "prefs-user-pages": "Användarsidor",
     "prefs-personal": "Mitt konto",
     "recentchanges-legend": "Alternativ för senaste ändringarna",
     "recentchanges-summary": "Följ de senaste ändringarna i wikin på denna sida.",
     "recentchanges-noresult": "Inga ändringar under den angivna perioden matchar dessa kriterier.",
-    "recentchanges-feed-description": "Följ de senaste ändringarna i wikin genom den här matningen.",
+    "recentchanges-feed-description": "Följ de senaste ändringarna i wikin genom detta flöde",
     "recentchanges-label-newpage": "Denna redigering skapade en ny sida",
     "recentchanges-label-minor": "Detta är en mindre ändring",
     "recentchanges-label-bot": "Denna redigering gjordes av en bot",
     "upload-permitted": "Tillåtna filtyper: $1.",
     "upload-preferred": "Föredragna filtyper: $1.",
     "upload-prohibited": "Förbjudna filtyper: $1.",
-    "uploadlog": "uppladdningslogg",
     "uploadlogpage": "Uppladdningslogg",
     "uploadlogpagetext": "Det här är en logg över de senast uppladdade filerna.\nSe [[Special:NewFiles|galleriet över nya filer]] för en mer visuell översikt.",
     "filename": "Filnamn",
     "filereuploadsummary": "Filändringar:",
     "filestatus": "Upphovsrättslig status:",
     "filesource": "Källa:",
-    "uploadedfiles": "Uppladdade filer",
     "ignorewarning": "Ignorera varningen och spara filen ändå.",
     "ignorewarnings": "Ignorera eventuella varningar",
     "minlength1": "Filens namn måste innehålla minst ett tecken.",
     "overwroteimage": "laddade upp ny version av \"[[$1]]\"",
     "uploaddisabled": "Uppladdningsfunktionen är avstängd",
     "copyuploaddisabled": "Uppladdning med URL avstängt.",
-    "uploadfromurl-queued": "Din uppladdning har lagts i kö.",
     "uploaddisabledtext": "Uppladdning av filer är avstängd.",
     "php-uploaddisabledtext": "PHP filuppladdningar är avaktiverade. Kolla inställningarna för file_uploads.",
     "uploadscripted": "Denna fil innehåller HTML eller script som felaktigt kan komma att tolkas av webbläsare.",
     "upload-misc-error": "Okänt uppladdningsfel",
     "upload-misc-error-text": "Ett okänt fel inträffade under uppladdningen.\nKontrollera att URL:en giltig och tillgänglig och försök igen.\nOm problemet kvarstår, kontakta en [[Special:ListUsers/sysop|administratör]].",
     "upload-too-many-redirects": "URL-en innehöll för många omdirigeringar",
-    "upload-unknown-size": "Okänd storlek",
     "upload-http-error": "Ett HTTP-fel uppstod: $1",
     "upload-copy-upload-invalid-domain": "Uppladdning av kopior är inte tillgängligt från denna domän.",
     "backend-fail-stream": "Kunde inte strömma filen $1.",
     "img-auth-streaming": "Strömmar \"$1\".",
     "img-auth-public": "Funktionaliteten i img_auth.php är att skicka filer från en privat wiki.\nDenna wiki är konfigurerad som en publik wiki.\nFör optimal säkerhet, har img_auth.php blivit avaktiverad.",
     "img-auth-noread": "Användaren har inte tillåtelse att läsa \"$1\"",
-    "img-auth-bad-query-string": "URL-adressen har en ogiltig frågesträng.",
     "http-invalid-url": "Ogiltig URL: $1",
     "http-invalid-scheme": "URLer med \"$1\"-formen stöds inte",
     "http-request-error": "HTTP-begäran misslyckades på grund av okänt fel.",
     "filehist-dimensions": "Dimensioner",
     "filehist-filesize": "Filstorlek",
     "filehist-comment": "Kommentar",
-    "filehist-missing": "Fil saknas",
     "imagelinks": "Filanvändning",
     "linkstoimage": "Följande {{PLURAL:$1|sida|$1 sidor}} länkar till den här filen:",
     "linkstoimage-more": "Mer änr {{PLURAL:$1|en sida|$1 sidor}} länkar till den här filen.\nFöljande lista visar bara {{PLURAL:$1|den första sidan|de $1 första sidorna}} som länkar till filen.\nDet finns en [[Special:WhatLinksHere/$2|fullständig lista]].",
     "listgrouprights-removegroup-self": "Ta bort {{PLURAL:$2|gruppen|grupperna}} från eget konto: $1",
     "listgrouprights-addgroup-self-all": "Lägg till alla grupperna till eget konto",
     "listgrouprights-removegroup-self-all": "Ta bort alla grupperna från eget konto",
+    "listgrouprights-namespaceprotection-header": "Namnrymdsbegränsningar",
+    "listgrouprights-namespaceprotection-namespace": "Namnrymd",
+    "listgrouprights-namespaceprotection-restrictedto": "Rättighet(er) som låter användare redigera",
+    "trackingcategories": "Spårningskategorier",
+    "trackingcategories-summary": "Denna sida listar spårningskategorier som automatiskt befolkas av MediaWiki-mjukvaran. Deras namn kan ändras genom att ändra det relevanta systemmeddelandena i {{ns:8}}-namnrymden.",
+    "trackingcategories-msg": "Spårningskategori",
+    "trackingcategories-name": "Meddelandenamn",
+    "trackingcategories-desc": "Inklusionskriterier för kategori",
+    "noindex-category-desc": "Sidan innehåller det magiska ordet <code><nowiki>__NOINDEX__</nowiki></code> (och är i en namnrymd där denna flagga tillåts), och indexeras därför inte av robotar.",
+    "index-category-desc": "Denna sidan innehåller ett <code><nowiki>__INDEX__</nowiki></code> (och är i en namnrymd där denna flagga tillåts), och indexeras därför av robotar även där detta normalt inte skulle ske.",
+    "post-expand-template-inclusion-category-desc": "Efter att alla mallar har expanderats är denna sidan större än <code>$wgMaxArticleSize</code>, därför har vissa mallar inte expanderats.",
+    "post-expand-template-argument-category-desc": "Efter att ett mallargument (något inom trippla parenteser, som <code>{{{Foo}}})</code> expanderats är denna sidan större än <code>$wgMaxArticleSize</code>.",
+    "expensive-parserfunction-category-desc": "För många kostsamma parser-funktioner (som <code>#ifexist</code>) har inkluderats på en sida. Se [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit användarhandboken].",
+    "broken-file-category-desc": "Kategori som läggs till om sidan innehåller en bruten fillänk (en länk som bäddar in en fil som inte finns).",
+    "hidden-category-category-desc": "Detta är en kategori som innehåller <code><nowiki>__HIDDENCAT__</nowiki></code> vilket, som standard, förhindrar den från att visas i kategorirutan.",
+    "trackingcategories-nodesc": "Ingen beskrivning tillgänglig.",
+    "trackingcategories-disabled": "Kategorin är inaktiverad",
     "mailnologin": "Ingen adress att skicka till",
     "mailnologintext": "För att kunna skicka e-post till andra användare, måste du vara [[Special:UserLogin|inloggad]] och ha angivit en korrekt e-postadress i dina [[Special:Preferences|användarinställningar]].",
     "emailuser": "Skicka e-post till den här användaren",
     "emailuser-title-notarget": "E-postanvändare",
     "emailpage": "Skicka e-post till användare",
     "emailpagetext": "Du kan använda formuläret nedan för att skicka e-post till den här {{GENDER:$1|användaren}}.\nDen e-postadress du har angivit i [[Special:Preferences|dina användarinställningar]] kommer att visas som \"Från\"-adress i meddelandet, så att mottagaren har möjlighet att svara direkt till dig.",
-    "usermailererror": "Fel i hanteringen av mail:",
     "defemailsubject": "{{SITENAME}} e-post från användare \"$1\"",
     "usermaildisabled": "Användar-e-post avaktiverat",
     "usermaildisabledtext": "Du kan inte skicka e-post till andra användare på den här wikin",
     "noemailtitle": "Ingen e-postadress",
     "noemailtext": "Den här användaren har inte angivit en giltig e-postadress.",
-    "nowikiemailtitle": "Ingen e-post tillåten",
     "nowikiemailtext": "Den här användaren har valt att inte motta e-post från andra användare.",
     "emailnotarget": "Icke-existerande eller ogiltigt användarnamn för mottagaren.",
     "emailtarget": "Ange mottagarens användarnamn",
     "nowatchlist": "Du har inga sidor i din bevakningslista.",
     "watchlistanontext": "Du måste $1 för att se eller redigera din bevakningslista.",
     "watchnologin": "Inte inloggad",
-    "watchnologintext": "Du måste vara [[Special:UserLogin|inloggad]] för att kunna ändra din bevakningslista.",
     "addwatch": "Lägg till i bevakningslistan",
     "addedwatchtext": "Sidan \"[[:$1]]\" har lagts till på din [[Special:Watchlist|bevakningslista]].\nFramtida ändringar av den här sidan och dess diskussionssida kommer att listas där.",
     "removewatch": "Ta bort från bevakningslistan",
     "unwatchthispage": "Sluta bevaka",
     "notanarticle": "Inte en artikel",
     "notvisiblerev": "Sidversionen har raderats",
-    "watchlist-details": "Du har $1 {{PLURAL:$1|sida|sidor}} på din bevakningslista (diskussionssidor är inte medräknade).",
+    "watchlist-details": "Du har {{PLURAL:$1|en sida|$1 sidor}} på din bevakningslista (diskussionssidor är inte separat medräknade).",
     "wlheader-enotif": "E-postmeddelanden är aktiverade.",
     "wlheader-showupdated": "Sidor som har ändrats sedan ditt senaste besök visas i '''fetstil.'''",
     "watchmethod-recent": "letar efter bevakade sidor bland senaste ändringar",
     "watching": "Bevakar...",
     "unwatching": "Avbevakar...",
     "watcherrortext": "Ett fel inträffade när du ändrade dina bevakningsinställningarna för \"$1\".",
-    "enotif_mailer": "{{SITENAME}}s system för att få meddelanden om förändringar per e-post",
     "enotif_reset": "Markera alla sidor som besökta",
     "enotif_impersonal_salutation": "{{SITENAME}}användare",
     "enotif_subject_deleted": "{{SITENAME}}sidan $1 har raderats av {{gender:$2|$2}}",
     "excontent": "Före radering: \"$1\"",
     "excontentauthor": "innehållet var: \"$1\" (den enda som skrivit var \"[[Special:Contributions/$2|$2]]\")",
     "exbeforeblank": "innehåll före tömning var: \"$1\"",
-    "exblank": "sidan var tom",
     "delete-confirm": "Radera \"$1\"",
     "delete-legend": "Radera",
     "historywarning": "'''Varning:''' Sidan du håller på att radera har en historik med ungefär $1 {{PLURAL:$1|version|versioner}}:",
     "sp-contributions-newbies-sub": "Från nya konton",
     "sp-contributions-newbies-title": "Bidrag från nya konton",
     "sp-contributions-blocklog": "blockeringslogg",
+    "sp-contributions-suppresslog": "undanhållna användarbidrag",
     "sp-contributions-deleted": "raderade användarbidrag",
     "sp-contributions-uploads": "uppladdningar",
     "sp-contributions-logs": "loggar",
     "sp-contributions-blocked-notice": "Användaren är blockerad.\nOrsaken till senaste blockeringen kan ses nedan:",
     "sp-contributions-blocked-notice-anon": "Denna IP-adress är för närvarande blockerad.\nDen senaste posten i blockeringsloggen visas nedan som referens:",
     "sp-contributions-search": "Sök efter användarbidrag",
-    "sp-contributions-suppresslog": "undanhållna användarbidrag",
     "sp-contributions-username": "IP-adress eller användarnamn:",
     "sp-contributions-toponly": "Visa endast aktuella sidversioner",
     "sp-contributions-newonly": "Visa endast redigeringar där sidor skapas",
     "allmessagesname": "Namn",
     "allmessagesdefault": "Standardtext",
     "allmessagescurrent": "Nuvarande text",
-    "allmessagestext": "Detta är en lista över alla meddelanden i namnrymden MediaWiki.\nBesök [https://www.mediawiki.org/wiki/Localisation MediaWiki Localisation] eller [//translatewiki.net translatewiki.net] om du vill bidra till översättningen av MediaWiki.",
+    "allmessagestext": "Detta är en lista över alla meddelanden i namnrymden MediaWiki.\nBesök [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation MediaWiki Localisation] eller [//translatewiki.net translatewiki.net] om du vill bidra till översättningen av MediaWiki.",
     "allmessagesnotsupportedDB": "Den här sidan kan inte användas eftersom '''$wgUseDatabaseMessages''' är avstängd.",
     "allmessages-filter-legend": "Filtrera",
     "allmessages-filter": "Filtrera efter anpassningsgrad:",
     "importunknownsource": "Okänd typ av importkälla",
     "importcantopen": "Misslyckades med att öppna importfilen.",
     "importbadinterwiki": "Felaktig interwiki-länk",
-    "importnotext": "Tom eller ingen text",
     "importsuccess": "Importen är genomförd!",
-    "importhistoryconflict": "Det föreligger en konflikt i versionshistoriken (kanske har denna sida importerats tidigare)",
     "importnosources": "Inga källor för transwiki-import har angivits, och direkt uppladdning av historik har stängts av.",
     "importnofile": "Ingen fil att importera har laddats upp.",
     "importuploaderrorsize": "Uppladdningen av importfilen misslyckades. Filen är större än vad som är tillåtet att ladda upp.",
     "print.css": "/* CSS som skrivs här kommer att påverka utskriftsversionen */",
     "noscript.css": "/* CSS som placeras här kommer att påverka användare med JavaScript inaktiverat */",
     "group-autoconfirmed.css": "/* CSS som placeras här kommer bara att påverka bekräftade användare */",
+    "group-user.css": "/* CSS som placeras här kommer bara att påverka registrerade användare */",
     "group-bot.css": "/* CSS som placeras här kommer bara att påverka robotar */",
     "group-sysop.css": "/* CSS som placeras här kommer bara att påverka administratörer */",
     "group-bureaucrat.css": "/* CSS som placeras här kommer bara att påverka byråkrater */",
     "modern.js": "/* JavaScript här kommer att laddas för dem som använder skalet Modern */",
     "vector.js": "/* JavaScript här kommer att laddas för dem som använder skalet Vector */",
     "group-autoconfirmed.js": "/* JavaScript här kommer att laddas för bekräftade användare */",
+    "group-user.js": "/* JavaScript här kommer att laddas för registrerade användare */",
     "group-bot.js": "/* JavaScript här kommer att laddas för robotar */",
     "group-sysop.js": "/* JavaScript här kommer att laddas för administratörer */",
     "group-bureaucrat.js": "/* JavaScript här kommer att laddas för byråkrater */",
index a5c3d62..6719ed1 100644 (file)
     "prefs-skin": "Umbo",
     "skin-preview": "Hakiki",
     "datedefault": "Chaguo-msingi",
-    "prefs-beta": "Zana za Beta",
     "prefs-datetime": "Tarehe na saa",
     "prefs-labs": "Maumbile ya maabara",
     "prefs-user-pages": "Kurasa za watumiaji",
     "nowatchlist": "Hamna vitu katika maangalizi yako.",
     "watchlistanontext": "Tafadhali $1 ili kutazama au kuhariri vitu vilivyopo katika orodha yako ya maangalizi.",
     "watchnologin": "Hujaingia",
-    "watchnologintext": "Lazima uwe [[Special:UserLogin|umeshaingia]] ili uweze kuhariri orodha ya maangalizi yako.",
     "addwatch": "Ongeza kwenye orodha ya maangalizi",
     "addedwatchtext": "Ukurasa \"[[:$1]]\" umewekwa kwenye [[Special:Watchlist|maangalizi]] yako.\nMabadiliko katika ukurasa huo na ukurasa wake wa majadiliano utaonekana hapo.",
     "removewatch": "Ondoa kutoka orodha ya maangalizi",
     "allmessagesname": "Jina",
     "allmessagesdefault": "Ujumbe uliopo bidhaa pepe",
     "allmessagescurrent": "Ujumbe unapo sasa hivi",
-    "allmessagestext": "Hii ni orodha ya jumbe za mfumo zilizopo katika eneo la MediaWiki.\nUkitaka kusaidia kazi ya kutohoa MediaWiki yote katika lugha nyingi, tafadhali uende tovuti ya [https://www.mediawiki.org/wiki/Localisation Kutohoa MediaWiki Kwenye Lugha Nyingi] na [//translatewiki.net translatewiki.net].",
+    "allmessagestext": "Hii ni orodha ya jumbe za mfumo zilizopo katika eneo la MediaWiki.\nUkitaka kusaidia kazi ya kutohoa MediaWiki yote katika lugha nyingi, tafadhali uende tovuti ya [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation Kutohoa MediaWiki Kwenye Lugha Nyingi] na [//translatewiki.net translatewiki.net].",
     "allmessagesnotsupportedDB": "Ukurasa huu hauwezi kutumika kwa sababu '''$wgUseDatabaseMessages''' imelemazwa.",
     "allmessages-filter-legend": "Chuja",
     "allmessages-filter": "Zichujwe kwa hali ya kutengenezwa:",
index 3b26fb1..d0d868b 100644 (file)
     "prefs-skin": "Skůrka",
     "skin-preview": "podglůnd",
     "datedefault": "Důmyślny",
-    "prefs-beta": "Testowe funkcyje",
     "prefs-datetime": "Data a czas",
     "prefs-labs": "Funkcyje \"labs\"",
     "prefs-user-pages": "Zajty używaczy",
     "nowatchlist": "Ńy ma žodnych pozycyji na liśće zajtůw, na kere dowoš pozůr.",
     "watchlistanontext": "$1 coby uobejřeć abo sprowjać elymynty listy zajtůw, na kere dowoš pozůr",
     "watchnologin": "Ńy jest žeś zalůgowany",
-    "watchnologintext": "Muśyš śe [[Special:UserLogin|zalůgować]] coby modyfikować lista zajtůw, na kere dowoš pozůr.",
     "addedwatchtext": "Zajta \"[[:$1]]\" zostoua dodano do Twojij [[Special:Watchlist|listy artiklůw, na kere dowoš pozůr]].\nNa tyi liśće bydźeš mjou rejer přišuych sprowjyń tyi zajty i jeji zajty godki, a mjano zajty bydźeš mjou škryflane '''tustym''' na [[Special:RecentChanges|liśće půmjyńanych na ůostatku]], cobyś mjou wygoda w jei pomjyńańa filować.",
     "removedwatchtext": "Artikel \"[[:$1]]\" zostou wyćepńjynty s [[Special:Watchlist|Twojij pozorlisty]].",
     "watch": "Dej pozůr",
     "allmessagesname": "Mjano",
     "allmessagesdefault": "Tekst důmyślny",
     "allmessagescurrent": "Tekst uobecny",
-    "allmessagestext": "Uoto lista wšyjstkych kůmůńikatůw systymowych dostympnych w přestřyńi mjan MedjaWiki.\nUodwjydź [https://www.mediawiki.org/wiki/Localisation Tuůmačyńy MediaWiki] a tyž [//translatewiki.net translatewiki.net] kejbyś chćou učestńičyć w tuůmačyńu uoprůgramowańo MediaWiki.",
+    "allmessagestext": "Uoto lista wšyjstkych kůmůńikatůw systymowych dostympnych w přestřyńi mjan MedjaWiki.\nUodwjydź [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation Tuůmačyńy MediaWiki] a tyž [//translatewiki.net translatewiki.net] kejbyś chćou učestńičyć w tuůmačyńu uoprůgramowańo MediaWiki.",
     "allmessagesnotsupportedDB": "Ta zajta ńy može być užyta, bez tůž co zmjynna '''$wgUseDatabaseMessages''' je wůuůnčůno.",
     "thumbnail-more": "Zwjynksz",
     "filemissing": "Njy mo pliku",
index 904bdf3..b37df48 100644 (file)
@@ -31,7 +31,8 @@
             "கௌசிக் பிரபு",
             "செல்வா",
             "மதனாஹரன்",
-            "බිඟුවා"
+            "බිඟුවා",
+            "Thamiziniyan"
         ]
     },
     "tog-underline": "இணைப்புகளுக்கு அடிக்கோடிடு",
     "accountcreatedtext": "[[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|talk]]) என்ற பெயரில் பயனர் கணக்கு உருவாக்கப்பட்டது.",
     "createaccount-title": "{{SITENAME}} தளத்துக்கான கணக்கு தொடக்கம்",
     "createaccount-text": "யாரோ ஒருவர் உங்கள் மின்னஞ்சல் முவரிக்காக {{SITENAME}} ($4) தளத்தில் கணக்கொண்றை தொடங்கியுள்ளார். கணக்கின் பெயர் \"$2\", கடவுச்சொல் \"$3\". நீங்கள் இப்போது புகுபதிகைச் செய்து கடவுச்சொல்லை மாற்ற வேண்டும்.\n\nஇக்கணக்கு தவறுதலாக தொடங்கப்பட்டிருந்தால், இத்தகவலைப் புறக்கணிக்கலாம்.",
-    "usernamehasherror": "பயனர் பெயரில் '#' எழுத்தைப் பயன்படுத்த முடியாது",
     "login-throttled": "தாங்கள் மிக அண்மையில் பலமுறை புகுபதிகை செய்ய முயற்சி செய்துள்ளீர்கள்.\n\nமீண்டும் முயற்சிக்கும் முன் $1 காத்திருக்கவும்.",
     "login-abort-generic": "உங்கள் உள்நுழைவு தோல்வியுற்றது - Aborted",
     "loginlanguagelabel": "மொழி: $1",
     "updated": "(இற்றைப்படுத்தப்பட்டது)",
     "note": "'''குறிப்பு:'''",
     "previewnote": "'''இது ஒரு முன்தோற்றம் மட்டுமே''', உங்கள் மாற்றங்கள் இன்னும் சேமிக்கப்படவில்லை!",
-    "continue-editing": "தொகுக்கும் பகுதிக்கு செல்லவும்",
+    "continue-editing": "தொகுக்கும் பகுதிக்குச் செல்லவும்",
     "previewconflict": "இந்த முன்தோற்றம் உரை தொகுப்புப் பகுதியின் மேற்பகுதியிலுள்ள உரையைப் பிரதிபலிக்கின்றது. நீங்கள் இப்பொழுது சேமித்தால் மேற்படி தோற்றமே கிடைக்கும்.",
     "session_fail_preview": "'''உங்கள் அமர்வுத் தரவுகள் அழிந்துப்போனமையால் உங்கள் தொகுப்பை செயற்படுத்த முடியவில்லை. அருள் கூர்ந்து மீண்டும் முயலவும். அதுவும் பலனளிக்காவிட்டால் விடுபதிகைச் செய்து மீண்டும் புகுபதிகைச் செய்யவும்'''",
     "session_fail_preview_html": "'''மன்னிக்கவும்! தங்கள் அமர்வுத் தரவுகள் அழிந்துப்போனமையால் தொகுப்பைச் செயற்படுத்த முடியவில்லை.'''\n\n''கரணியம்:{{SITENAME}} தளத்தில் பக்குவப்படாத எச்.டி.எம்.எல். முடுக்கிவிடப்பட்டுள்ளமையால் ஜாவா நிரல் தாக்குதல்களைத் தவிர்க்கும் பொருட்டு முன்தோற்றம் முடக்கப்பட்டுள்ளது.''\n\n'''இது ஒரு முறையான தொகுப்பாயின், அருள் கூர்ந்து மீண்டும் முயலவும். அதுவும் பலனளிக்காவிடின் [[Special:UserLogout|விடுபதிகை]] செய்து மீண்டும் புகுபதிகை செய்யவும்'''",
     "prefs-skin": "முகப்புறை",
     "skin-preview": "முன்தோற்றம்",
     "datedefault": "விருப்பத்தேர்வுகள் இல்லை",
-    "prefs-beta": "சோதனைநிலை அம்சங்கள்",
-    "prefs-datetime": "நாள் நேரம்",
     "prefs-labs": "ஆய்வகச் சிறப்புக்கூறுகள்",
     "prefs-user-pages": "பயனர் பக்கங்கள்",
     "prefs-personal": "பயனர் தரவு",
     "upload-permitted": "அனுமதிக்கப்பட்ட கோப்பு வகைகள்: $1.",
     "upload-preferred": "விரும்பத்தக்க கோப்பு வகைகள்: $1.",
     "upload-prohibited": "தடைச் செய்யப்பட்ட கோப்பு வகைகள்: $1.",
-    "uploadlog": "பதிவேற்றப் பதிகை",
     "uploadlogpage": "பதிவேற்றப் பதிகை",
     "uploadlogpagetext": "கீழேயுள்ளது மிக அண்மையில் பதிவேற்றம் செய்யப்பட்ட கோப்புகளின் பட்டியலாகும்.\nமேலும் விவரங்கள் அறிய, [[Special:NewFiles|புதிய கோப்புகள் பக்கத்தைப்]] பார்க்கவும்.",
     "filename": "கோப்புப் பெயர்",
     "filereuploadsummary": "கோப்பில் செய்யப்பட்ட மாற்றங்கள்:",
     "filestatus": "பதிப்புரிமை நிலை:",
     "filesource": "மூலம்:",
-    "uploadedfiles": "பதிவேற்றப்பட்டக் கோப்புகள்",
     "ignorewarning": "எச்சரிக்கையை சட்டை செய்யாமல் கோப்பை சேமி",
     "ignorewarnings": "எச்சரிக்கைகளைப் புறக்கணி",
     "minlength1": "கோப்பின் பெயர் ஆகக் குறைந்தது ஒரு எழுத்தையாவது கொண்டிருக்க வேண்டும்.",
     "overwroteimage": "\"[[$1]]\" கோப்பின் புதிய பதிப்பை பதிவேற்று",
     "uploaddisabled": "பதிவேற்றம் செயலிழக்கச் செய்யப்பட்டுள்ளது",
     "copyuploaddisabled": "URL வழியாக தகவலேற்றல் முடக்கப்பட்டுள்ளது.",
-    "uploadfromurl-queued": "தங்களுடைய பதிவேற்றம் வரிசையில் உள்ளது.",
     "uploaddisabledtext": "கோப்பு பதிவேற்றங்கள் செயலிழக்கச் செய்யப்பட்டுள்ளன.",
     "php-uploaddisabledtext": "கோப்பு தரவேற்றம் PHP இல் முடக்கப்பட்டுள்ளது.தயவுகூர்ந்து file_uploads அமைப்பை சரிபார்க்கவும்.",
     "uploadscripted": "இந்தக் கோப்பு உலாவியால் பிழையாக விளங்கிக் கொள்ளக்கூடிய எச்.டி.எம்.எல். அல்லது வேறு நிரல்களைக் கொண்டுள்ளது.",
     "upload-misc-error": "இனந்தெரியாத பதிவேற்றல் தவறு",
     "upload-misc-error-text": "தகவலேற்றும்போது அறியப்படாத பிழை ஏற்பட்டுள்ளது.\nதயவுசெய்து இந்த URL செல்லதக்கதா மற்றும் உபயோகிக்ககூடியதா என சரிபார்த்து மீண்டும் முயற்சிக்கவும்.\nஇச்சிக்கல் தொடர்ந்தால் ஒரு  நிர்வாகியை [[Special:ListUsers/sysop|administrator]]  தொடர்பு கொள்ளவும்.",
     "upload-too-many-redirects": "இந்த URL மிக அதிகமான திருப்பங்களை (redirects) கொண்டுள்ளது.",
-    "upload-unknown-size": "தெரியாத அளவு",
     "upload-http-error": "ஒரு HTTP பிழை ஏற்பட்டுள்ளது:$1",
     "upload-copy-upload-invalid-domain": "இந்தக் களத்தில் இருந்து படியெடுத்துப் பதிவேற்றம் செய்யும் வசதி கிடையாது.",
     "backend-fail-stream": " $1 கோப்பை stream செய்ய இயலவில்லை  .",
     "img-auth-streaming": "தொடரோடி \"$1\".",
     "img-auth-public": "Img_auth.php யின் செயல்பாடு, தனியார் விக்கி கோப்புகளை வெளியிட்டு உள்ளது.\nஇந்த விக்கி  பொது விக்கி போல உள்ளமைக்கப்பட்டுள்ளது.\nவிவேகமிக்க பாதுகாப்புக்காக , img_auth.php செயலிழக்கம் செய்யப்பட்டுள்ளது.",
     "img-auth-noread": "பயனர் \"$1\" ஐ படிக்க அனுமதி கொண்டிருக்கவில்லை .",
-    "img-auth-bad-query-string": "செல்லாத கேள்வி எழுத்துகளை URL கொண்டுள்ளது.",
     "http-invalid-url": "செல்லாத உரலி: $1",
     "http-invalid-scheme": " \"$1\" திட்டத்துடன் உள்ள URLகள் ஆதரிக்கப்படாது.",
     "http-request-error": "அறியப்படாத பிழை காரணமாக HTTP கோரிக்கை தோல்வியடைந்தது.",
     "filehist-dimensions": "அளவுகள்",
     "filehist-filesize": "கோப்பின் அளவு",
     "filehist-comment": "கருத்து",
-    "filehist-missing": "கோப்பைக் காணவில்லை",
     "imagelinks": "கோப்பு பயன்பாடு",
     "linkstoimage": "பின்வரும் {{PLURAL:$1|பக்க இணைப்புகள்|$1 பக்கங்கள் இணைப்பு}}\nஇப் படிமத்துக்கு இணைக்கபட்டுள்ளது(ளன):",
     "linkstoimage-more": " $1  க்கும் மேற்பட்ட {{PLURAL:$1| பக்கம் இணைப்புகள்|பக்கத்தின்  இணைப்பு}}  இந்த கோப்பிற்கு உள்ளது.\nகீழ்கண்ட பட்டியல் காட்டுவது,  {{PLURAL:$1| முதல் பக்க இணைப்பு|முதல்  $1 பக்க  இணைப்புகளை பக்கம்}}, இந்த கோப்பிற்கு மட்டும்.\nஒரு [[Special:WhatLinksHere/$2|முழு பட்டியல்]] உள்ளது.",
     "emailuser-title-notarget": "பயனருக்கு மின்னஞ்சல் செய்",
     "emailpage": "மின்னஞ்சல் பயனர்",
     "emailpagetext": "நீங்கள் கீழ்வரும் படிவத்தை உபயோகித்து இந்த பயனருக்கு மின்னஞ்சல் செய்யலாம்.\n\n[[Special:Preferences|என் விருப்பத்தேர்வுகளில்]] நீங்கள் கொடுத்துள்ள மின்னஞ்சல் முகவரி மின்னஞ்சலின் \"From\" முகவரியாகக் காட்சி தரும், இதனால் பெறுநர் உங்களுக்கு நேரடியாக பதில் எழுத முடியும்.",
-    "usermailererror": "மின்னஞ்சல் விளைவாக்கிய தவறு:",
     "defemailsubject": "{{SITENAME}} மின்னஞ்சல் பயனர்  \"$1\"-இடமிருந்து.",
     "usermaildisabled": "பயனரின் மின்னஞ்சல் செயலிழக்கச் செய்யப்பட்டுள்ளது",
     "usermaildisabledtext": "நீங்கள் மற்ற பயனர்களுக்கு இந்த விக்கியில் மின்னஞ்சல் அனுப்ப முடியாது.",
     "noemailtitle": "மின்னஞ்சல் முகவரி இல்லை",
     "noemailtext": "இப் பயனர் ஒரு செல்லுபடியாகக்கூடிய மின்னஞ்சல் முகவரியைக் குறிப்பிடவில்லை.",
-    "nowikiemailtitle": "மின்னஞ்சலுக்கு  அனுமதி இல்லை.",
     "nowikiemailtext": "இந்த பயனர் மற்ற பயனர்களிடமிருந்து மின்னஞ்சல் பெற வேண்டாம் என தேர்வு செய்துள்ளார் .",
     "emailnotarget": "பெறுநர் இல்லாத அல்லது செல்லாத பயனர்பெயர்.",
     "emailtarget": "பெறுநரின் பயனர் பெயரை உள்ளிடவும்",
     "nowatchlist": "உங்களுடைய கவனிப்புப் பட்டியலில் ஒரு விடயமும் இல்லை.",
     "watchlistanontext": "உங்கள் கவனிப்புப் பட்டியலைப் பார்க்க அல்லது தொகுக்க அருள் கூர்ந்து $1 செய்யுங்கள்.",
     "watchnologin": "புகுபதிகை செய்யப்படவில்லை.",
-    "watchnologintext": "உங்கள் கவனிப்புப் பட்டியலில் திருத்தம் செய்வதற்கு, நீங்கள்[[Special:UserLogin|புகுபதிகை செய்திருக்கவேண்டும்]].",
     "addwatch": "கவனிப்புப் பட்டியலில் சேர்",
     "addedwatchtext": "\"[[:$1]]\" பக்கம் உங்கள் [[Special:Watchlist|கவனிப்புப் பக்கத்தில்]] சேர்க்கப்பட்டுள்ளது. இந்தப் பக்கத்துக்கு எதிர்காலத்தில் செய்யப்படவுள்ள மாற்றங்களும், அதனோடிணைந்த பேச்சுப் பக்கமும், அங்கே பட்டியலிடப்படும். அத்துடன் தெரிந்தெடுக்க வசதியாக [[Special:RecentChanges|அண்மைய மாற்றங்களின் பட்டியலில்]] இது தடித்த எழுத்துக்களில் காட்டப்படும். பின்னர், இப் பக்கத்தை உங்கள் கவனிப்புப் பட்டியலிலிருந்து நீக்க விரும்பினால், பக்கச் சட்டத்திலுள்ள ''கவனிப்பு நீக்கு'' என்ற இணைப்பைச் சொடுக்கவும்.",
     "removewatch": "கவனிப்புப் பட்டியலிருந்து நீக்கு",
     "watching": "கவனிக்கப்படுகிறது...",
     "unwatching": "கவனிப்பு விடப்படுகிறது...",
     "watcherrortext": "\"$1\". உக்கான கவனிப்புப் பட்டியல் அமைப்பை மாற்றும்பொழுது பிழை நேர்ந்தது",
-    "enotif_mailer": "{{SITENAME}} தளத்தின் அறிவித்தல் அஞ்சல்காரர்",
     "enotif_reset": "எல்லாப் பக்கங்களையும் பார்வையிட்டதாக குறித்துக்கொள்",
     "enotif_impersonal_salutation": "{{SITENAME}} பயனர்",
     "enotif_lastvisited": "உங்கள் கடைசி வருகைக்குப் பின்னர் நடைபெற்றுள்ள மாற்றங்களைக் காண $1 பக்கத்தைப் பார்க்கவும்.",
     "excontent": "இருந்த உள்ளடக்கம்: '$1'",
     "excontentauthor": "இருந்த உள்ளடக்கம்: '$1' (தவிர, '[[Special:Contributions/$2|$2]]' மட்டுமே பங்களித்திருந்தார்)",
     "exbeforeblank": "வெறுமைப்படுத்த முன்னிருந்த உள்ளடக்கம்: '$1'",
-    "exblank": "பக்கம் வெறுமையாய் இருந்தது",
     "delete-confirm": "\"$1\" பக்கத்தை நீக்கு",
     "delete-legend": "நீக்கவும்",
     "historywarning": "'''எச்சரிக்கை:''' தாங்கள் நீக்கவுள்ள பக்கத்திற்கு சுமார் $1 {{PLURAL:$1|திருத்தம்|திருத்தங்களின்}} வரலாறு உண்டு:",
     "sp-contributions-newbies-sub": "புதிய கணக்குகளுக்கு",
     "sp-contributions-newbies-title": "புதிய கணக்குகளுக்கு பயனரின் பங்களிப்புகள்",
     "sp-contributions-blocklog": "தடைப் பதிகை",
+    "sp-contributions-suppresslog": "பயனரின் நீக்கப்பட்ட பங்களிப்புகள்",
     "sp-contributions-deleted": "பயனரின் நீக்கப்பட்ட பங்களிப்புக்கள்",
     "sp-contributions-uploads": "பதிவேற்றங்கள்",
     "sp-contributions-logs": "பதிகைகள்",
     "sp-contributions-blocked-notice": "இந்தப் பயனர் தற்சமயம் தடை செய்யப்பட்டுள்ளார்.\nதடை பதிகையின் அண்மைய மாற்றம் குறிப்புதவிக்காக கீழே தரப்பட்டுள்ளது:",
     "sp-contributions-blocked-notice-anon": "இந்த IP முகவரி தற்போது தடுக்கப்பட்டுள்ளது.\nசமீபத்திய தடுப்பு குறிப்பேடு  கீழே குறிப்பிற்காக வழங்கப்பட்டுள்ளது :",
     "sp-contributions-search": "பங்களிப்புகளைத் தேடு",
-    "sp-contributions-suppresslog": "பயனரின் நீக்கப்பட்ட பங்களிப்புகள்",
     "sp-contributions-username": "ஐ.பி. அல்லது பயனர் பெயர்:",
     "sp-contributions-toponly": "சமீபத்திய பரிசீலனைகளுக்குட்பட்ட  திருத்தங்களை மட்டும் காண்பி",
     "sp-contributions-submit": "தேடுக",
     "allmessagesname": "பெயர்",
     "allmessagesdefault": "இயல்பிருப்பு உரை",
     "allmessagescurrent": "தற்போதைய உரை",
-    "allmessagestext": "இது மீடியாவிக்கி பெயர்வெளியிலுள்ள எல்லா முறைமை தகவல்களினதும் பட்டியலாகும்.\nமொழிபெயர்ப்பில் உதவ விரும்பின் அருள்கூர்ந்து [//translatewiki.net பீட்டாவிக்கி], [https://www.mediawiki.org/wiki/Localisation மீடியாவிக்கி மொழியாக்க]  தளங்களுக்குச் செல்லவும்.",
+    "allmessagestext": "இது மீடியாவிக்கி பெயர்வெளியிலுள்ள எல்லா முறைமை தகவல்களினதும் பட்டியலாகும்.\nமொழிபெயர்ப்பில் உதவ விரும்பின் அருள்கூர்ந்து [//translatewiki.net பீட்டாவிக்கி], [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation மீடியாவிக்கி மொழியாக்க]  தளங்களுக்குச் செல்லவும்.",
     "allmessagesnotsupportedDB": "'''$wgUseDatabaseMessages''' முடக்கப்பட்டுள்ளப் படியால் இப்பக்கததை பயன்படுத்த முடியாது.",
     "allmessages-filter-legend": "வடிகட்டி",
     "allmessages-filter": "தனிப்பயனாக்கத்தின்படி வடிகட்டு.",
     "importunknownsource": "அறியப்படாத இறக்குமதிக் கோப்பு வகை",
     "importcantopen": "இறக்குமதிக் கோப்பை திறக்க முடியவில்லை",
     "importbadinterwiki": "பழுதுள்ள விக்கியிடை இணைப்பு",
-    "importnotext": "வெற்று அல்லது உரையெதுவுமில்லை",
     "importsuccess": "இறக்குமதி முற்றியது!",
-    "importhistoryconflict": "முரண்பாடான திருத்த வரலாறுகள் காணப்படுகின்றன (நீர் ஏற்கனவே இப்பக்கத்தை இறக்கியிருக்கலாம்)",
     "importnosources": "விக்கியிடை இறகுமதி மூலம் வரையறுக்கப்படவில்லை மேலும் நேரடி வரலாறு பதிவேற்றங்கள் முடக்கப்பட்டுள்ளன.",
     "importnofile": "இறக்குமதிக் கோப்பொன்றும் பதிவேற்றப்படவில்லை.",
     "importuploaderrorsize": "இறக்குமதி கோப்பின் பதிவேற்றம் தோல்வி. அனுமதிக்கப்பட்ட உச்ச அளவைவிட கோப்பு பெரியது.",
index eb0b67c..567ad5c 100644 (file)
     "permalink": "శాశ్వత లంకె",
     "print": "ముద్రించు",
     "view": "చూచుట",
+    "view-foreign": "$1 లో చూడండి",
     "edit": "సవరించు",
     "create": "సృష్టించు",
     "editthispage": "ఈ పేజీని సవరించండి",
     "pool-timeout": "తాళం కొరకు వేచివుండడానికి కాలపరిమితి అయిపోయింది",
     "pool-queuefull": "సమూహపు వరుస నిండుగా ఉంది",
     "pool-errorunknown": "తెలియని లోపం",
+    "pool-servererror": "పూల్ కౌంటర్ సేవ అందుబాటులో లేదు ($1).",
     "aboutsite": "{{SITENAME}} గురించి",
     "aboutpage": "Project:గురించి",
     "copyright": "విషయం $1 కి లోబడి లభ్యం, వేరుగా పేర్కొంటే తప్ప.",
     "accountcreatedtext": "[[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|చర్చ]])కి వాడుకరి ఖాతాను సృష్టించాం.",
     "createaccount-title": "{{SITENAME}} కోసం ఖాతా సృష్టి",
     "createaccount-text": "{{SITENAME}} ($4) లో ఎవరో మీ ఈమెయిలు చిరునామాకి \"$2\" అనే పేరుగల ఖాతాని \"$3\" అనే సంకేతపదంతో సృష్టించారు.\nమీరు లోనికి ప్రవేశించి మీ సంకేతపదాన్ని ఇప్పుడే మార్చుకోవాలి.\n\nఈ ఖాతాని పొరపాటున సృష్టిస్తే గనక, ఈ సందేశాన్ని పట్టించుకోకండి.",
-    "usernamehasherror": "వాడుకరిపేరులో హాష్ అక్షరాలు ఉండకూడదు",
     "login-throttled": "కొద్దిసేపటిగా మీరు చాలా లాగిన్ ప్రయత్నాలు చేసారు.\nమళ్ళీ ప్రయత్నించే ముందు $1 ఆగండి.",
     "login-abort-generic": "మీ లాగిన్ ప్రయత్నం విఫలమైంది - ఆగిపోయింది",
     "loginlanguagelabel": "భాష: $1",
     "prefs-skin": "రూపు",
     "skin-preview": "మునుజూడు",
     "datedefault": "ఏదైనా పరవాలేదు",
-    "prefs-beta": "బీటా సౌలభ్యాలు",
-    "prefs-datetime": "తేదీ, సమయం",
     "prefs-labs": "ప్రయోగాత్మక సౌలభ్యాలు",
     "prefs-user-pages": "వాడుకరి పేజీలు",
     "prefs-personal": "వాడుకరి ప్రవర",
     "upload-permitted": "అనుమతించే ఫైలు రకాలు: $1.",
     "upload-preferred": "అనుమతించే ఫైలు రకాలు: $1.",
     "upload-prohibited": "నిషేధించిన ఫైలు రకాలు: $1.",
-    "uploadlog": "ఎక్కింపుల చిట్టా",
     "uploadlogpage": "ఎక్కింపుల చిట్టా",
     "uploadlogpagetext": "ఇటీవల జరిగిన ఫైలు అప్‌లోడుల జాబితా ఇది.\nమరింత దృశ్యాత్మకంగా చూడటం కోసం [[Special:NewFiles|కొత్త ఫైళ్ళ కొలువు]]కు వెళ్ళండి.",
     "filename": "ఫైలు పేరు",
     "filereuploadsummary": "ఫైలు మార్పులు:",
     "filestatus": "కాపీహక్కు స్థితి:",
     "filesource": "మూలం:",
-    "uploadedfiles": "ఎక్కించిన ఫైళ్ళు",
     "ignorewarning": "హెచ్చరికను పట్టించుకోకుండా ఫైలును భద్రపరచు",
     "ignorewarnings": "హెచ్చరికలను పట్టించుకోవద్దు",
     "minlength1": "పైలు పేర్ల నిడివి కనీసం ఒక్క అక్షరమైనా ఉండాలి.",
     "overwroteimage": "\"[[$1]]\" యొక్క కొత్త కూర్పును ఎక్కించారు",
     "uploaddisabled": "ఎక్కింపులు అచేతనం చెయ్యబడ్డాయి.",
     "copyuploaddisabled": "URL ద్వారా ఎక్కింపుని అశక్తం చేసారు.",
-    "uploadfromurl-queued": "మీ ఎక్కింపు వరుసలో ఉంది.",
     "uploaddisabledtext": "ఫైళ్ళ ఎక్కింపులను అచేతనం చేసారు.",
     "php-uploaddisabledtext": "PHPలో ఫైలు ఎక్కింపులు అచేతనమై ఉన్నాయి.\nదయచేసి file_uploads అమరికని చూడండి.",
     "uploadscripted": "ఈ ఫైల్లో HTML కోడు గానీ స్క్రిప్టు కోడు గానీ ఉంది. వెబ్ బ్రౌజరు దాన్ని పొరపాటుగా అనువదించే అవకాశం ఉంది.",
     "upload-misc-error": "తెలియని ఎక్కింపు లోపం",
     "upload-misc-error-text": "ఎక్కిస్తూండగా ఏదో తెలియని లోపం తలెత్తింది. \nURL సరైనదేనని, అది అందుబాటులోనే ఉందని నిర్ధారించుకుని మళ్ళీ ప్రయత్నించండి. సమస్య అలాగే ఉంటే, [[Special:ListUsers/sysop|నిర్వాహకులు]] ఎవరినైనా సంప్రదించండి.",
     "upload-too-many-redirects": "ఆ URLలో చాలా దారిమార్పులు ఉన్నాయి",
-    "upload-unknown-size": "సైజు తెలియదు",
     "upload-http-error": "ఒక HTTP పొరపాటు జరిగింది: $1",
     "upload-copy-upload-invalid-domain": "ఈ డొమెయిన్ నుంచి కాపీ ఎక్కింపులు కుదరదు.",
     "backend-fail-stream": "\"$1\" ఫైలును స్ట్రీమింగు చెయ్యలేకపోయాం.",
     "img-auth-streaming": "\"$1\" ను ప్రసారిస్తున్నాం.",
     "img-auth-public": "img_auth.php యొక్క పని, గోప్యవికీలనుండి ఫైళ్ళ వివరాలను బయట పెట్టడం.\nఇది బహిరంగ వికీగా తయారుచేయబడింది.\nసరైన భద్రత కోసం, img_auth.php ను అచేతనం చేసాం.",
     "img-auth-noread": "\"$1\"ని చూడడానికి వాడుకరికి అనుమతి లేదు.",
-    "img-auth-bad-query-string": "ఈ URL లో తప్పుడు క్వెరీ స్ట్రింగు ఉంది.",
     "http-invalid-url": "చెల్లని URL: $1",
     "http-invalid-scheme": "\"$1\" ప్రణాళికలో ఉన్న URLలకు తోడ్పాటులేదు",
     "http-request-error": "తెలియని లోపం వల్ల HTTP అభ్యర్థన విఫలమైంది.",
     "filehist-dimensions": "కొలతలు",
     "filehist-filesize": "దస్త్రపు పరిమాణం",
     "filehist-comment": "వ్యాఖ్య",
-    "filehist-missing": "ఫైలు కనిపించుటలేదు",
     "imagelinks": "దస్త్రపు వాడుక",
     "linkstoimage": "కింది {{PLURAL:$1|పేజీ|$1 పేజీల}} నుండి ఈ ఫైలుకి లింకులు ఉన్నాయి:",
     "linkstoimage-more": "ఈ ఫైలుకు $1 కంటే ఎక్కువ {{PLURAL:$1|పేజీ లింకై ఉంది|పేజీలు లింకై ఉన్నాయి}}.\nఈ ఫైలుకి మాత్రమే లింకై ఉన్న {{PLURAL:$1|మొదటి పేజీని|మొదటి $1 పేజీలను}} ఈ క్రింది జాబితా చూపిస్తుంది.\n[[Special:WhatLinksHere/$2|పూర్తి జాబితా]] కూడా ఉంది.",
     "unwatchedpages": "వీక్షణలో లేని పేజీలు",
     "listredirects": "దారిమార్పుల జాబితా",
     "listduplicatedfiles": "నకళ్ళు కలిగిన ఫైళ్ళ జాబితా",
+    "listduplicatedfiles-summary": "ఇది ఒక ఫైలు యొక్క సరికొత్త సంచిక మరొక ఫైలు యొక్క సరికొత్త సంచికతో సమానంగా ఉండే నకిలీ ఫైళ్ళ జాబితా. స్థానిక ఫైళ్ళు మాత్రమే పరిగణించబడ్డాయి.",
     "listduplicatedfiles-entry": "[[:File:$1|$1]] కు [[$3|{{PLURAL:$2|ఓ నకలు ఉంది|$2 నకళ్ళున్నాయి}}]].",
     "unusedtemplates": "వాడని మూసలు",
     "unusedtemplatestext": "వేరే ఇతర పేజీలలో చేర్చని {{ns:template}} పేరుబరిలోని పేజీలన్నింటినీ ఈ పేజీ చూపిస్తుంది.\nమూసలను తొలగించే ముందు వాటికి ఉన్న ఇతర లింకుల కోసం చూడడం గుర్తుంచుకోండి.",
     "listgrouprights-removegroup-self": "{{PLURAL:$2|సమూహాన్ని|సమూహాలని}} తన స్వంత ఖాతా నుండి తొలగించుకోవడం: $1",
     "listgrouprights-addgroup-self-all": "అన్ని సమూహాలని స్వంత ఖాతాకు చేర్చుకోలగడటం",
     "listgrouprights-removegroup-self-all": "స్వంత ఖాతా నుండి అన్ని సమూహాలనూ తొలగించుకోగలగడం",
+    "listgrouprights-namespaceprotection-header": "పేరుబరి నిబంధనలు",
+    "listgrouprights-namespaceprotection-namespace": "పేరుబరి",
+    "trackingcategories-name": "సందేశం పేరు",
+    "trackingcategories-nodesc": "వివరణ లేదు.",
+    "trackingcategories-disabled": "వర్గం అచేతనమై ఉంది",
     "mailnologin": "పంపించవలసిన చిరునామా లేదు",
     "mailnologintext": "ఇతరులకు ఈ-మెయిలు పంపించాలంటే, మీరు [[Special:UserLogin|లాగిన్‌]] అయి ఉండాలి, మరియు మీ [[Special:Preferences|అభిరుచుల]]లో సరైన ఈ-మెయిలు చిరునామా ఇచ్చి ఉండాలి.",
     "emailuser": "ఈ వాడుకరికి ఈ-మెయిలుని పంపించండి",
     "emailuser-title-notarget": "వాడుకరికి ఈమెయిలు పంపించండి",
     "emailpage": "వాడుకరికి ఈ-మెయిలుని పంపించు",
     "emailpagetext": "ఈ {{GENDER:$1|వాడుకరికి}} ఈమెయిలు సందేశము పంపించుటకు క్రింది ఫారంను ఉపయోగించవచ్చు. [[Special:Preferences|మీ వాడుకరి అభిరుచుల]]లో మీరిచ్చిన ఈ-మెయిలు చిరునామా \"నుండి\" ఆ సందేశం వచ్చినట్లుగా ఉంటుంది, కనుక వేగుని అందుకునేవారు నేరుగా మీకు జవాబివ్వగలుగుతారు.",
-    "usermailererror": "మెయిలు ఆబ్జెక్టు ఈ లోపాన్ని చూపింది:",
     "defemailsubject": "వాడుకరి \"$1\" నుండి {{SITENAME}} ఈ-మెయిలు",
     "usermaildisabled": "వాడుకరి ఈమెయిలు అచేతనం చెయ్యబడింది",
     "usermaildisabledtext": "ఈ వికీలో మీరు ఇతర వాడుకరులకి ఈ-మెయిళ్ళని పంపించలేరు",
     "noemailtitle": "ఈ-మెయిలు చిరునామా లేదు",
     "noemailtext": "ఈ వాడుకరి సరైన ఈ-మెయిలు చిరునామాని ఇవ్వలేదు.",
-    "nowikiemailtitle": "ఈమెయిలుకు అనుమతి లేదు",
     "nowikiemailtext": "ఇతర వాడుకరుల నుండి ఈ-మెయిళ్ళను అందుకోడానికి ఈ వాడుకరి సుముఖంగా లేరు.",
     "emailnotarget": "గ్రహీతగా ఇచ్చిన వాడుకరిపేరు తప్పైనా కావచ్చు, లేదా అసలే ఉండి ఉండకపోవచ్చు",
     "emailtarget": "అందుకొనేవారి వాడుకరిపేరు ఇవ్వండి",
     "nowatchlist": "మీ వీక్షణ జాబితా ఖాళీగా ఉంది.",
     "watchlistanontext": "మీ వీక్షణ జాబితా లోని అంశాలను చూసేందుకు లేదా మార్చేందుకు మీరు $1.",
     "watchnologin": "లాగిన్‌ అయిలేరు",
-    "watchnologintext": "మీ వీక్షణ జాబితాను మార్చడానికి మీరు [[Special:UserLogin|లాగిన్‌]] అయి ఉండాలి.",
     "addwatch": "వీక్షణ జాబితాలో చేర్చు",
     "addedwatchtext": "\"[[:$1]]\" అనే పుట మీ [[Special:Watchlist|వీక్షణ జాబితా]]లో చేరింది.\nభవిష్యత్తులో ఈ పుటకి మరియు సంబంధిత చర్చాపుటకి జరిగే మార్పులు అక్కడ కనిపిస్తాయి.",
     "removewatch": "వీక్షణ జాబితా నుండి తొలగించు",
     "watching": "గమనిస్తున్నారు...",
     "unwatching": "గమనించడం లేదు...",
     "watcherrortext": "\"$1\" కు మీ సెట్టింగులను మార్చేటపుడు ఏదో లోపం దొర్లింది.",
-    "enotif_mailer": "{{SITENAME}} ప్రకటన మెయిలు పంపునది",
     "enotif_reset": "అన్ని పేజీలను చూసినట్లుగా గుర్తించు",
     "enotif_impersonal_salutation": "{{SITENAME}} వాడుకరి",
     "enotif_subject_deleted": "{{SITENAME}} $1 పేజీని $2 {{GENDER:$2|తొలగించారు}}",
     "excontent": "ఉన్న విషయ సంగ్రహం: '$1'",
     "excontentauthor": "ఉన్న విషయ సంగ్రహం: \"$1\" (మరియు దీని ఒకే ఒక్క రచయిత \"[[Special:Contributions/$2|$2]]\")",
     "exbeforeblank": "ఖాళీ చెయ్యకముందు పేజీలో ఉన్న విషయ సంగ్రహం: '$1'",
-    "exblank": "పేజీ ఖాళీగా ఉంది",
     "delete-confirm": "\"$1\"ని తొలగించు",
     "delete-legend": "తొలగించు",
     "historywarning": "'''హెచ్చరిక''': మీరు తొలగించబోయే పేజీకి సుమారు $1 {{PLURAL:$1|కూర్పుతో|కూర్పులతో}} చరిత్ర ఉంది:",
     "sp-contributions-newbies-sub": "కొత్తవారి కోసం",
     "sp-contributions-newbies-title": "కొత్త ఖాతాల వాడుకరుల మార్పుచేర్పులు",
     "sp-contributions-blocklog": "నిరోధాల చిట్టా",
+    "sp-contributions-suppresslog": "అణచిపెట్టబడిన వాడుకరి రచనలు",
     "sp-contributions-deleted": "తొలగించబడిన వాడుకరి రచనలు",
     "sp-contributions-uploads": "ఎక్కింపులు",
     "sp-contributions-logs": "చిట్టాలు",
     "sp-contributions-blocked-notice": "ఈ వాడుకరిపై ప్రస్తుతం నిరోధం ఉంది.\nనిరోధపు చిట్టాలోని చివరి పద్దుని మీ సమాచారంకోసం ఇస్తున్నాం:",
     "sp-contributions-blocked-notice-anon": "ఈ ఐపీ చిరునామాపై ప్రస్తుతం నిరోధం ఉంది.\nనిరోధపు చిట్టాలోని చివరి పద్దుని మీ సమాచారంకోసం ఇస్తున్నాం:",
     "sp-contributions-search": "రచనల కోసం అన్వేషణ",
-    "sp-contributions-suppresslog": "అణచిపెట్టబడిన వాడుకరి రచనలు",
     "sp-contributions-username": "ఐపీ చిరునామా లేదా వాడుకరిపేరు:",
     "sp-contributions-toponly": "చిట్టచివరి కూర్పులను మాత్రమే చూపించు",
     "sp-contributions-newonly": "పేజీని సృష్టించిన మార్పులను మాత్రమే చూపించు",
     "allmessagesname": "పేరు",
     "allmessagesdefault": "అప్రమేయ సందేశపు పాఠ్యం",
     "allmessagescurrent": "ప్రస్తుత పాఠ్యం",
-    "allmessagestext": "మీడియావికీ పేరుబరిలో ఉన్న అంతరవర్తి సందేశాల జాబితా ఇది.\nసాధారణ మీడియావికీ స్థానికీకరణకి మీరు తోడ్పడాలనుకుంటే, దయచేసి [https://www.mediawiki.org/wiki/Localisation మీడియావికీ స్థానికీకరణ] మరియు [//translatewiki.net ట్రాన్స్&zwnj;లేట్&zwnj;వికీ.నెట్] సైట్లను చూడండి.",
+    "allmessagestext": "మీడియావికీ పేరుబరిలో ఉన్న అంతరవర్తి సందేశాల జాబితా ఇది.\nసాధారణ మీడియావికీ స్థానికీకరణకి మీరు తోడ్పడాలనుకుంటే, దయచేసి [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation మీడియావికీ స్థానికీకరణ] మరియు [//translatewiki.net ట్రాన్స్&zwnj;లేట్&zwnj;వికీ.నెట్] సైట్లను చూడండి.",
     "allmessagesnotsupportedDB": "'''$wgUseDatabaseMessages''' అన్నది అచేతనం చేసి ఉన్నందువల్ల ఈ పేజీని వాడలేరు.",
     "allmessages-filter-legend": "వడపోత",
     "allmessages-filter": "కస్టమైజేషను స్థితిని బట్టి వడకట్టు:",
     "importunknownsource": "దిగుమతి చేసుకుంటున్న దాని మాతృక రకం తెలియదు",
     "importcantopen": "దిగుమతి చేయబోతున్న ఫైలును తెరవలేకపోతున్నాను",
     "importbadinterwiki": "చెడు అంతర్వికీ లింకు",
-    "importnotext": "ఖాళీ లేదా పాఠ్యం లేదు",
     "importsuccess": "దిగుమతి పూర్తయ్యింది!",
-    "importhistoryconflict": "కూర్పుల చరిత్రలో ఘర్షణ తలెత్తింది (ఈ పేజీని ఇంతకు ముందే దిగుమతి చేసుంటారు)",
     "importnosources": "No transwiki import sources have been defined and direct history uploads are disabled.\nఎటువంటి అంతర్వికీ దిగుమతి మూలాలను పేర్కొనకపోవటం వలన, ప్రత్యక్ష చరిత్ర అప్లోడులను నిలిపివేశాం.",
     "importnofile": "ఎటువంటి దిగుమతి ఫైలునూ అప్లోడుచేయలేదు.",
     "importuploaderrorsize": "దిగుమతి ఫైలు అప్లోడు ఫలించలేదు. ఈ ఫైలు అప్లోడు ఫైలుకు నిర్దేశించిన పరిమాణం కంటే పెద్దా ఉంది.",
index 4d4ab9f..61fca51 100644 (file)
     "tog-hidepatrolled": "Пинҳон кардани вироишҳои гаштхӯрда дар тағйироти охир",
     "tog-newpageshidepatrolled": "Пинҳони саҳифаҳои гаштхӯрда аз феҳристи саҳифаҳои нав",
     "tog-extendwatchlist": "Густариши феҳристи пайгириҳо барои нишон додани ҳамаи тағйиротҳо, на танҳо аз ҳама охирин",
-    "tog-usenewrc": "Гурӯҳбандии тағийрот бар пояи сафҳа дар тағийроти охир ва феҳристи пайгириҳо (ниёзманди ҶаваСкрипт)",
+    "tog-usenewrc": "Гурӯҳбандии тағийрот бар пояи сафҳа дар тағийроти охир ва феҳристи пайгириҳо",
     "tog-numberheadings": "шуморагузори~и худкори инвонҳо",
-    "tog-showtoolbar": "Намоиши навори абзори вироиш (JavaScript)",
-    "tog-editondblclick": "Вироиш намудани саҳифаҳо ҳангоми ду карат пахш намудани тугмаи мушак (JavaScript)",
-    "tog-editsectiononrightclick": "Ба кор андохтани вироиши сарлавҳаҳои қисматҳо бо клики рост (ҶаваСкрипт)",
+    "tog-showtoolbar": "Намоиши навори абзори вироиш",
+    "tog-editondblclick": "Вироиш намудани саҳифаҳо ҳангоми ду карат пахш намудани тугмаи мушак",
+    "tog-editsectiononrightclick": "Ба кор андохтани вироиши сарлавҳаҳои қисматҳо бо клики рост",
     "tog-rememberpassword": "Вуруди манро дар ин мурургар дар хотир нигоҳ дор (ҳадди аксар то $1 {{PLURAL:$1|рӯз|рӯз}})",
     "tog-watchcreations": "Саҳифаҳое, ки месозам ва парвандаҳое, ки боргузорӣ мекунам ба феҳристи пайгириҳоям афзуда шавад.",
     "tog-watchdefault": "Саҳифаҳо ва парвандаҳое, ки вироиш мекунам ба феҳристи пайгириҳоям афзуда шавад",
     "actions": "Амалкардҳо",
     "namespaces": "Фазоҳои ном",
     "variants": "Вариантҳо",
+    "navigation-heading": "Менюи гаштан",
     "errorpagetitle": "Хато",
     "returnto": "Бозгашт ба $1.",
     "tagline": "Аз {{SITENAME}}",
     "printableversion": "Нусхаи чопӣ",
     "permalink": "Пайванди доимӣ",
     "print": "Чоп",
+    "view": "Намо",
+    "view-foreign": "Дидан дар $1",
     "edit": "Вироиш",
+    "edit-local": "Вироиши тавзеҳи маҳаллӣ",
     "create": "Эҷод",
+    "create-local": "Иловаи тавзеҳи маҳаллӣ",
     "editthispage": "Вироиши ин саҳифа",
     "create-this-page": "Эҷод кардани ин саҳифа",
     "delete": "Ҳазф",
     "toc": "Мундариҷа",
     "showtoc": "Намоиш дода шавад",
     "hidetoc": "Пинҳон кардани",
+    "collapsible-collapse": "Фурукаш",
+    "collapsible-expand": "Густариш",
     "thisisdeleted": "Намоиш ё эҳёи $1?",
     "viewdeleted": "Намоиши $1?",
     "restorelink": "{{PLURAL:$1|вироиши ҳазфшуда|$1 вироишоти ҳазфшудаҳо}}",
     "nospecialpagetext": "<strong>Шумо саҳифаи вижаеро дархост кардаед, ки нодуруст аст.</strong>\n\nФеҳристи саҳифаҳои вижаи дурустро метавонед дар инҷо [[Special:SpecialPages|{{int:specialpages}}]] нигаред.",
     "error": "Иштибоҳ",
     "databaseerror": "Хатои бойгоҳи дода",
+    "databaseerror-query": "Пурсуҷӯ: $1",
+    "databaseerror-function": "Амал:$1",
+    "databaseerror-error": "Хато: $1",
     "laggedslavemode": "Ҳушдор: Саҳифа мумкин аст рӯзрасониҳои охирро дар бар нагирад.",
     "readonly": "Бойгоҳи дода қуфл шудааст",
     "enterlockreason": "Далелеро барои қуфл кардан зикр кунед, ва тақрибан вақти аз қуфл озод шуданашро ҳам зикр кунед",
     "unexpected": "Миқдори ғайри мунтазир: \"$1\"=\"$2\".",
     "formerror": "Хато: наметавон формро фиристод",
     "badarticleerror": "Наметавон ин амалро бар ин саҳифа анҷом дод.",
-    "cannotdelete": "Саҳифа ё парвандаи мушаххасшударо ҳазф карда нашуд. (Мумкин аст қаблан касе дигаре онро ҳазф карда бошад.)",
+    "cannotdelete": "Саҳифа ё парвандаи \"$1\" ҳазф карда нашуд. \nШояд қаблан касе дигаре онро ҳазф карда бошад.",
     "badtitle": "Унвони номуносиб",
     "badtitletext": "Унвони саҳифаи дархостшуда номӯътабар, холӣ, ё пайванди байнизабони ё байнивикии нодуруст буд. Он метавонад як ё якчанд аломатҳоеро дар бар гирад, ки дар унвонҳо истифода шуда наметавонанд.",
     "perfcached": "Додаҳои зерин аз ҳофизаи муваққатӣ фарохонӣ шудаанд ва мумкин аст, комилан ба рӯз нашудаанд. Ҳаддиаксар {{PLURAL:$1|як натиҷа|$1 натоиҷ}} дар ҳофиза дастрас аст.",
-    "perfcachedts": "Ð\94одаҳои Ð·ÐµÑ\80ин Ð°Ð· Ò³Ð¾Ñ\84изаи Ð¼Ñ\83ваÒ\9bÒ\9bаÑ\82Ó£ Ñ\84аÑ\80оÑ\85онӣ Ñ\88Ñ\83даанд Ð²Ð° Ð¼Ñ\83мкин Ð°Ñ\81Ñ\82, Ð¾Ñ\85иÑ\80ин Ð±Ð° Ñ\80ӯзÑ\80аÑ\81онӣ $1 Ð°Ñ\81Ñ\82. A maximum of {{PLURAL:$4|one result is|$4 results are}} available in the cache.",
+    "perfcachedts": "Ð\94одаҳои Ð·ÐµÑ\80ин Ð°Ð· Ò³Ð¾Ñ\84изаи Ð¼Ñ\83ваÒ\9bÒ\9bаÑ\82Ó£ Ñ\84аÑ\80оÑ\85онӣ Ñ\88Ñ\83даанд Ð²Ð° Ð°Ð· Ñ\81ӯи $1 Ð±Ð°Ñ\80ӯз Ñ\88Ñ\83да Ð±Ñ\83д. Ò²Ð°Ð´Ð´Ð¸Ð°ÐºÑ\81аÑ\80 {{PLURAL:$4|Ñ\8fк Ð½Ð°Ñ\82иҷа|$4 Ð½Ð¾Ñ\82оиҷ}} Ð´Ð°Ñ\80 Ò³Ð¾Ñ\84иза Ð¼Ñ\83ваÒ\9bÒ\9bаÑ\82Ó£ Ð²Ñ\83Ò·Ñ\83д Ð´Ð¾Ñ\80ад.",
     "querypage-no-updates": "Имкони ба рӯзрасонии ин саҳифа феълан ғайрифаъол шудааст.",
     "viewsource": "Намоиши матни вики",
+    "viewsource-title": "Дидани манбаъи $1",
     "actionthrottled": "Ҷилави амали шумо гирифта шуд",
     "actionthrottledtext": "Ба манзури ҷилавгирӣ аз спам, шумо иҷоза надоред, ки чунин амалеро беш аз чанд бор дар як муддати замони кӯтоҳ анҷом бидиҳед. Лутфан пас аз чанд дақиқа дубора талош кунед.",
     "protectedpagetext": "Ин саҳифа барои ҷилавгирӣ аз вироиш ва дигар амалҳо қуфл шудааст.",
     "viewsourcetext": "Шумо метавонед матни викии ин саҳифаро назар кунед ё нусха бардоред:",
-    "protectedinterface": "Ин саҳифа ороишдиҳандаи матни ин нармафзор аст, ва ба манзури пешгирӣ аз харобкорӣ қуфл шудааст.",
-    "editinginterface": "'''Огоҳӣ:''' Шумо саҳифаеро вироиш карда истодаед, ки матни интерфейси барнома мебошад. Тағйироти ин саҳифа барои намуди интерфейси дигар корбарон таъсир хоҳад расонид. Барои тарҷумаҳо, лутфан аз [//translatewiki.net/wiki/Main_Page?setlang=tg Бетавики], ки лоиҳаи маҳаликунонии МедиаВики мебошад, истифода кунед.",
+    "protectedinterface": "Ин саҳифа ороишдиҳандаи матнӣ барои нармафзори ин вики аст, ва ба манзури пешгирӣ аз харобкорӣ қуфл шудааст.\nБарои изофа ё тағийри тарҷума барои ҳамаи викиҳо, лутфан аз [//translatewiki.net/ translatewiki.net], лоиҳаи тарҷумаи МедиаВики истифода баред.",
+    "editinginterface": "'''Огоҳӣ:''' Шумо саҳифаеро вироиш карда истодаед, ки матни интерфейс барои нармафзор мебошад. Тағйироти ин саҳифа барои намуди интерфейси дигар корбарон дар ин вики таъсир хоҳад расонид. Барои изофа ё тағийри тарҷумаҳои ҳамаи викиҳо, лутфан аз [//translatewiki.net/ translatewiki.net], лоиҳаи тарҷумаи МедиаВики истифода баред.",
     "cascadeprotected": "Ин саҳифа аз вироиш муҳофизат шудааст, барои ин ки  дар {{PLURAL:$1|саҳифаи|саҳифаҳои}} муҳофизатшудаи зерин, ки гузаинаи \"обшорӣ\" дар {{PLURAL:$1|он|онҳо}} интихоб шудааст, фаро гирифтааст: $2",
     "namespaceprotected": "Шумо иҷозати вироиши саҳифаҳои фазоиноми '''$1'''-ро надоред.",
     "ns-specialprotected": "Саҳифаҳои вижа ғайри қобили вироиш ҳастанд.",
     "titleprotected": "Эҷоди саҳифае бо ин унвон аз тарафи [[User:$1|$1]] ҷилавгирӣ шудааст.\nДалели зикршуда аз ин қарор аст ''$2''.",
+    "exception-nologin": "Вуруд нашудаед",
     "virus-badscanner": "Танзимоти бад: пуишгари вируси ношинохта: ''$1''",
     "virus-scanfailed": "пуиш номуваффақ (рамзи $1)",
     "virus-unknownscanner": "антивируси ношинос:",
-    "logouttext": "'''Акнун аз систем хориҷ шудаед.'''\n\nШумо метавонед гумном аз {{SITENAME}} истифодабариро идома диҳед, ё метавонед бо ҳамин номи корбариатон ва ё номи корбарии дигаре <span class='plainlinks'>[$1 боз вуруд кунед]</span>.\nТавваҷӯҳ кунед, ки баъзе аз саҳифаҳо қаблан чи тавре намоиш шуда будан ҳамин тавр намоиш дода мешаванд, то даме ки шумо ҳофизаи мурургаратонро пок кунед.",
+    "logouttext": "<strong>Акнун аз систем хориҷ шудаед.</strong>\n\nШумо метавонед гумном аз {{SITENAME}} истифодабариро идома диҳед, ё метавонед бо ҳамин номи корбариатон ва ё номи корбарии дигаре <span class='plainlinks'>[$1 боз вуруд кунед]</span>.\nТавваҷӯҳ кунед, ки баъзе аз саҳифаҳо қаблан чи тавре намоиш шуда буданд ҳамин тавр намоиш дода мешаванд, то даме ки шумо ҳофизаи мурургаратонро пок кунед.",
+    "welcomeuser": "Хуш омадед, $1!",
     "yourname": "Номи корбар",
+    "userlogin-yourname": "Номи корбарӣ",
+    "userlogin-yourname-ph": "Номи корбарии худро ворид кунед",
+    "createacct-another-username-ph": "Номи корбарро дохил кунед",
     "yourpassword": "Калимаи убур\\пароль",
+    "userlogin-yourpassword": "Гузарвожа",
+    "userlogin-yourpassword-ph": "Гузарвожаи худро ворид кунед",
+    "createacct-yourpassword-ph": "Гузарвожаи худро ворид кунед",
     "yourpasswordagain": "Калимаи убурро боз нависед",
+    "createacct-yourpasswordagain": "Тасдиқи гузарвожа",
+    "createacct-yourpasswordagain-ph": "Гузарвожаро бори дигар ворид кунед",
     "remembermypassword": "Вуруди манро дар ин мурургар дар хотир нигоҳ дор (то ҳадди аксар $1 {{PLURAL:$1|рӯз|рӯз}})",
+    "userlogin-remembermypassword": "Вурудшударо манро нигоҳ дор",
+    "userlogin-signwithsecure": "Истифодаи пайвастшавии амн",
     "yourdomainname": "Домейни Шумо",
+    "password-change-forbidden": "Шумо гузарвожаро дар ин вики тағийр дода наметавонед.",
     "externaldberror": "Хатое дар иртибот бо пойгоҳи дода рух дода аст ё ин ки шумо иҷозат ба рӯзрасонии ҳисоби берунии худро надоред.",
     "login": "Вуруд",
     "nav-login-createaccount": "Вуруд / Сохтани ҳисоби ҷадид",
     "logout": "Хуруҷ аз систем",
     "userlogout": "Хуруҷ аз систем",
     "notloggedin": "Ба систем вуруд нашудаед",
+    "userlogin-noaccount": "Ҳисоби корбарӣ надоред?",
+    "userlogin-joinproject": "Ба {{SITENAME}} ҳамроҳ шавед",
     "nologin": "Номи корбар надоред? '''$1'''.",
     "nologinlink": "Ҳисоберо созед",
     "createaccount": "Ҳисоби ҷадидеро созед",
     "gotaccount": "Ҳисоби корбарӣ доред? '''$1'''.",
     "gotaccountlink": "Вуруд шавед",
     "userlogin-resetlink": "Ҷузъиёти вурудро фаромӯш кардаед?",
-    "createaccountmail": "бо почтаи электронӣ",
+    "userlogin-resetpassword-link": "Гузарвожаро фаромӯш кардед?",
+    "userlogin-helplink2": "Роҳнамои вуруд",
+    "userlogin-loggedin": "Шумо дар ҳол чун {{GENDER:$1|$1}} вуруд шудаед.\nБо истифода аз форми зер чун корбари дигар вориди систем шавед.",
+    "userlogin-createanother": "Эҷоди ҳисоби дигар",
+    "createacct-join": "Маълумоти худро дар зер ворид кунед.",
+    "createacct-another-join": "Маълумоти ҳисоби нави худро дар зер ворид кунед.",
+    "createacct-emailrequired": "Нишонаи email",
+    "createacct-emailoptional": "Нишони email (ихтиёрӣ)",
+    "createacct-email-ph": "Нишони email худро ворид кунед",
+    "createacct-another-email-ph": "Нишонаи email-ро ворид кунед",
+    "createaccountmail": "Аз гузарвожаи муваққатӣ ва тасодуфӣ истифода кунед ва онро нишонаи электронии мушаххасшуда бифиристед",
+    "createacct-realname": "Номи аслӣ (ихтиёрӣ)",
     "createaccountreason": "Сабаб:",
+    "createacct-reason": "Сабаб",
+    "createacct-reason-ph": "Барои чӣ ҳисоби дигареро эҷод карда истодаед",
+    "createacct-captcha": "Бозрасии амниятӣ",
+    "createacct-imgcaptcha-ph": "Матни болоро ворид кунед",
     "createacct-submit": "Ҳисоби худро созед",
     "createacct-another-submit": "Ҳисоби дигаре созед",
     "createacct-benefit-heading": "{{SITENAME}} тавассути одамони мисли шумо сохта шудааст.",
     "password-login-forbidden": "Истифодаи ин номи корбарӣ ва гузарвожа манъ аст.",
     "mailmypassword": "Танзими гузарвожа",
     "passwordremindertitle": "Муваққатан калимаи убурӣ ҷадид барои {{SITENAME}}",
-    "passwordremindertext": "Ð\9aаÑ\81е (Ñ\8dÒ³Ñ\82имолан Ñ\85Ñ\83ди Ð¨Ñ\83мо, Ð°Ð· Ð½Ð¸Ñ\88онаи IP $1) Ð³Ñ\83заÑ\80вожаи Ð½Ð°Ð²Ñ\80о Ð±Ð°Ñ\80ои {{SITENAME}} ($4) Ð´Ð°Ñ\80Ñ\85оÑ\81Ñ\82 ÐºÐ°Ñ\80дааÑ\81Ñ\82. Ð\93Ñ\83заÑ\80вожаи Ð¼Ñ\83ваÒ\9bÒ\9bаÑ\82Ó£ Ð±Ð°Ñ\80ои ÐºÐ¾Ñ\80баÑ\80 \"$2\" Ñ\81оÑ\85Ñ\82а Ð²Ð° Ð±Ð° \"$3\" Ñ\82аÑ\8aин Ñ\88Ñ\83д.\nÐ\90гаÑ\80 Ð¸Ð½ Ð½Ð¸Ñ\8fÑ\82и Ñ\88Ñ\83мо Ð±Ñ\83д, Ñ\88Ñ\83мо Ð±Ð¾Ñ\8fд Ð²Ð¾Ñ\80иди Ñ\81иÑ\81Ñ\82ем Ñ\88авед Ð²Ð° Ð³Ñ\83заÑ\80вожаи Ð½Ð°Ð²Ñ\80о Ð¸Ð½Ñ\82иÑ\85об ÐºÑ\83нед.\n\nАгар касе дигаре инро дахост кардааст, ё инки шумо гузарвожаи пешинаи худро ба ёд овардаед ва дигар хоҳиши тағйир додани онро надоред, ба ин паём аҳамият надиҳед ва гузарвожаи пешинаи худро истифода баред.",
+    "passwordremindertext": "Ð\9aаÑ\81е (Ñ\8dÒ³Ñ\82имолан Ñ\85Ñ\83ди Ð¨Ñ\83мо, Ð°Ð· Ð½Ð¸Ñ\88онаи IP $1) Ð³Ñ\83заÑ\80вожаи Ð½Ð°Ð²Ñ\80о Ð±Ð°Ñ\80ои {{SITENAME}} ($4) Ð´Ð°Ñ\80Ñ\85оÑ\81Ñ\82 ÐºÐ°Ñ\80дааÑ\81Ñ\82. Ð¯Ðº Ð³Ñ\83заÑ\80вожаи Ð¼Ñ\83ваÒ\9bÒ\9bаÑ\82Ó£ Ð±Ð°Ñ\80ои ÐºÐ¾Ñ\80баÑ\80 \"$2\" Ñ\81оÑ\85Ñ\82а Ð²Ð° Ð±Ð° \"$3\" Ñ\82аÑ\8aин Ñ\88Ñ\83д.\nÐ\90гаÑ\80 Ð¸Ð½ Ð½Ð¸Ñ\8fÑ\82и Ñ\88Ñ\83мо Ð±Ñ\83д, Ñ\88Ñ\83мо Ð±Ð¾Ñ\8fд Ð²Ð¾Ñ\80иди Ñ\81иÑ\81Ñ\82ем Ñ\88авед Ð²Ð° Ð³Ñ\83заÑ\80вожаи Ð½Ð°Ð²Ñ\80о Ð¸Ð½Ñ\82иÑ\85об ÐºÑ\83нед.\nÐ\93Ñ\83заÑ\80вожаи Ð¼Ñ\83ваÒ\9bÒ\9bаÑ\82ии Ñ\88Ñ\83мо Ñ\82о {{PLURAL:$5|Ñ\8fк Ñ\80ӯз|$5 Ñ\80ӯз}} Ñ\8dÑ\8aÑ\82ибоÑ\80 Ð´Ð¾Ñ\80ад.\n\nАгар касе дигаре инро дахост кардааст, ё инки шумо гузарвожаи пешинаи худро ба ёд овардаед ва дигар хоҳиши тағйир додани онро надоред, ба ин паём аҳамият надиҳед ва гузарвожаи пешинаи худро истифода баред.",
     "noemail": "Ҳеҷ нишонаи почтаи электронӣ барои корбар \"$1\" сабт нашудааст.",
     "noemailcreate": "Шумо бояд як нишонаи почтаи электронии мӯътабарро ворид кунед",
     "passwordsent": "Калимаи убури нав ба адреси e-mail, ки барои \"$1\" номнавис шудааст фиристода шуд.\nБаъд аз дастрас кардани он, марҳамат карда вуруд кунед.",
     "blocked-mailpassword": "Нишонаи IP шумо аз вироиш боз дошта шудааст ва аз ин рӯ ба манзури ҷилавгирӣ аз сӯиистифода аз баҳрагирӣ аз қобилияти барқарор кардани калимаи убурро надорад.",
     "eauthentsent": "Номае барои тасдиқ ба нишонаи почтаи электронии мушахасшуда фиристода шуд. Пеш аз фиристодани дигар нома ба ин ҳисоб, шумо бояд дастуроте ки ба он нишонаи почтаи электронӣ омадаст, иҷро карда, дар ҳақиқат ҳисоби Шумо буданашро тасдиқ кунед.",
-    "throttled-mailpassword": "Як Ñ\91доваÑ\80ии ÐºÐ°Ð»Ð¸Ð¼Ð°Ð¸ Ñ\83бÑ\83Ñ\80 Ð±Ð°Ñ\80ои Ñ\88Ñ\83мо {{PLURAL:$1|Ñ\81оаÑ\82|$1 Ñ\81оаÑ\82}} Ð³Ñ\83заÑ\88Ñ\82а Ñ\84иÑ\80иÑ\81Ñ\82ода Ñ\88Ñ\83дааÑ\81Ñ\82. Ð\91аÑ\80ои Ñ\87илавгиÑ\80Ó£ Ð°Ð· Ñ\81ӯииÑ\81Ñ\82иÑ\84ода, Ñ\84аÒ\9bаÑ\82 Ð´Ð°Ñ\80 Ò³Ð°Ñ\80 {{PLURAL:$1|Ñ\81оаÑ\82|$1 Ñ\81оаÑ\82}} Ñ\82анҳо Ñ\8fк Ñ\91доваÑ\80Ó£ фиристода мешавад.",
+    "throttled-mailpassword": "Як Ñ\91доваÑ\80ии Ð³Ñ\83заÑ\80вожа Ð±Ð°Ñ\80ои Ñ\88Ñ\83мо {{PLURAL:$1|Ñ\81оаÑ\82|$1 Ñ\81оаÑ\82}} Ð³Ñ\83заÑ\88Ñ\82а Ñ\84иÑ\80иÑ\81Ñ\82ода Ñ\88Ñ\83дааÑ\81Ñ\82. Ð\91аÑ\80ои Ñ\87илавгиÑ\80Ó£ Ð°Ð· Ñ\81ӯииÑ\81Ñ\82иÑ\84ода, Ñ\84аÒ\9bаÑ\82 Ð´Ð°Ñ\80 Ò³Ð°Ñ\80 {{PLURAL:$1|Ñ\81оаÑ\82|$1 Ñ\81оаÑ\82}} Ñ\82анҳо Ñ\8fк Ñ\91доваÑ\80ии Ñ\82аÒ\93ийÑ\80и Ð³Ñ\83заÑ\80вожа фиристода мешавад.",
     "mailerror": "Хато дар фиристодани номаи электронӣ: $1",
-    "acct_creation_throttle_hit": "Ð\91Ñ\83баÑ\85Ñ\88ед, Ð¨Ñ\83мо Ð°Ð»Ð»Ð°ÐºÐ°Ð¹ $1 Ò³Ð¸Ñ\81обҳо Ñ\81оÑ\85Ñ\82ед. Ð¨Ñ\83мо Ð±ÐµÑ\88Ñ\82аÑ\80 Ñ\81оÑ\85Ñ\82а Ð½Ð°Ð¼ÐµÑ\82авонед.",
-    "emailauthenticated": "E-mail нишонаи Шумо дар санаи $1 сабт шудааст.",
-    "emailnotauthenticated": "Нишонаи почтаи электронии шумо ҳанӯз тасдиқ нашудааст. Номаи электрони барои ҳар як аз вижагиҳои зерин фиристода нахоҳад шуд.",
+    "acct_creation_throttle_hit": "ТаÑ\88Ñ\80иÑ\84оваÑ\80дагон Ð±Ð° Ð¸Ð½ Ð²Ð¸ÐºÐ¸ Ð±Ð¾ Ð¸Ñ\81Ñ\82иÑ\84ода Ð°Ð· Ð½Ð¸Ñ\88онаи IP-ии Ñ\88Ñ\83мо {{PLURAL:$1|1 Ò³Ð¸Ñ\81оби ÐºÐ¾Ñ\80баÑ\80Ó£|$1 Ò³Ð¸Ñ\81оби ÐºÐ¾Ñ\80баÑ\80Ó£}} Ð¼Ñ\83ддаÑ\82и Ñ\87анд Ñ\80ӯз Ñ\8dҷод ÐºÐ°Ñ\80даанд, ÐºÐ¸ Ð±Ð°Ñ\80обаÑ\80 Ñ\88Ñ\83моÑ\80аи Ò³Ð°Ð´Ð´Ð¸Ð°ÐºÑ\81аÑ\80и Ð¸Ò·Ð¾Ð·Ð°Ñ\88Ñ\83даÑ\80о Ð´Ð°Ñ\80 Ñ\87анд Ñ\80ӯзи Ð¾Ñ\85иÑ\80 Ð±Ð°Ñ\80обаÑ\80 Ð°Ñ\81Ñ\82.\nÐ\94аÑ\80 Ð½Ð°Ñ\82иҷа, Ñ\82аÑ\88Ñ\80иÑ\84оваÑ\80дагон Ð±Ð¾ Ð¸Ñ\81Ñ\82иÑ\84ода Ð°Ð· Ð¸Ð½ Ð½Ð¸Ñ\88онаи IP Ð´Ð°Ñ\80 Ò³Ð¾Ð»Ð¸ Ò³Ð¾Ð·Ð¸Ñ\80 Ð´Ð¸Ð³Ð°Ñ\80 Ò³Ð¸Ñ\81оби ÐºÐ¾Ñ\80баÑ\80иÑ\80о Ñ\8dҷод ÐºÐ°Ñ\80да Ð½Ð°Ð¼ÐµÑ\82авонанд.",
+    "emailauthenticated": "Нишонаи e-mail шумо таърихи $2 дар $3 тасдиқ шуда буд.",
+    "emailnotauthenticated": "Нишонаи почтаи электронии шумо ҳанӯз тасдиқ нашудааст. \nНомаи электронӣ барои ҳар яке аз вижагиҳои зерин фиристода нахоҳад шуд.",
     "noemailprefs": "Барои корандозии ин қобилиятҳо як нишонаи почтаи электрониро мушаххас кунед.",
     "emailconfirmlink": "Адреси почтаи электрониаторо тасдиқ кунед",
-    "invalidemailaddress": "Нишонаи воридшудаи почтаи электронӣ қобили қабул нест, барои он ки дорои сохтори номӯътабаре аст. Лутфан нишонае бо сохтори саҳеҳ ворид кунед ва ё бахши марбутро холӣ бигузоред.",
+    "invalidemailaddress": "Нишонаи воридшудаи почтаи электронӣ қобили қабул нест, барои он ки дорои сохтори номӯътабаре аст. \nЛутфан нишонаро бо сохтори саҳеҳ ворид кунед ва ё бахши марбутро холӣ монед.",
+    "cannotchangeemail": "Наметавон нишонаҳои почтаи электронии ҳисобро дар ин вики тағийр дод.",
+    "emaildisabled": "Ин сайт пайёмҳои электронӣ фиристода наметавонад",
     "accountcreated": "Ҳисоби ҷадид сохта шуд",
-    "accountcreatedtext": "Ҳисоби корбар барои $1 сохта шуд.",
+    "accountcreatedtext": "Ҳисоби корбарӣ барои [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|баҳс]]) эҷод шуд.",
     "createaccount-title": "Эҷоди ҳисоби корбарӣ дар {{SITENAME}}",
     "createaccount-text": "Як нафаре барои $2 як ҳисоби корбарӣ дар {{SITENAME}} эҷод кардааст ($4). Калимаи убури \"$2\" чунин аст: \"$3\". Шумо бояд вориди систем шавед то калимаи убури худро тағйир бидиҳед.\n\nАгар ин ҳисоб иштибоҳе сохта шудааст, ин номаро нодида бигиред.",
-    "usernamehasherror": "Номи корбарӣ наметавонад шомили аломатҳои дар ҳам бошад",
-    "login-throttled": "Шумо ба тозагӣ чандин бор барои вуруд ба систем талош кардаед.\nЛутфан пеш аз он, ки дубора талош кунед, сабр кунед.",
+    "login-throttled": "Шумо ба тозагӣ чандин маротиба барои вуруд ба систем талош кардед.\nЛутфан пеш аз он, ки дубора талош кунед, $1 сабр кунед.",
+    "login-abort-generic": "Вуруди шумо номуваффақ буд - Соқит шуд",
     "loginlanguagelabel": "Забон: $1",
+    "pt-login": "Вуруд",
+    "pt-login-button": "Вуруд",
+    "pt-createaccount": "Эҷоди ҳисоб",
+    "pt-userlogout": "Хуруҷ",
     "changepassword": "Иваз намудани калимаи убур",
-    "resetpass_announce": "ШÑ\83мо Ð±Ð¾ ÐºÐ¾Ð´Ð¸ Ð¼Ñ\83ваÒ\9bаÑ\82Ó£ Ð±Ð° Ñ\81иÑ\81Ñ\82ем Ð²Ñ\83Ñ\80Ñ\83д Ñ\88Ñ\83даед. Ð\91аÑ\80ои Ð°Ð½Ò·Ð¾Ð¼ Ð´Ð¾Ð´Ð°Ð½Ð¸ Ð²Ñ\83Ñ\80Ñ\83дÑ\88авӣ, Ñ\88Ñ\83мо Ð±Ð¾Ñ\8fд ÐºÐ°Ð»Ð¸Ð¼Ð°Ð¸ Ñ\83бÑ\83Ñ\80Ó£ Ò·Ð°Ð´Ð¸Ð´Ñ\80о Ð¸Ð½Ò·Ð¾ Ð²Ð¾Ñ\80ид ÐºÑ\83нед:",
+    "resetpass_announce": "Ð\91аÑ\80ои Ð°Ð½Ò·Ð¾Ð¼Ð¸ Ð²Ñ\83Ñ\80Ñ\83дÑ\88авӣ, Ñ\88Ñ\83мо Ð±Ð¾Ñ\8fд Ð³Ñ\83заÑ\80вожаи Ð½Ð°Ð²Ñ\80о Ð²Ð¾Ñ\80ид ÐºÑ\83нед.",
     "resetpass_header": "Тағйири гузарвожаи ҳисоб",
     "oldpassword": "Калимаи кӯҳнаи убур:",
     "newpassword": "Калимаи нави убур:",
     "retypenew": "Калимаи нави убурро такроран нависед:",
     "resetpass_submit": "Калимаи убурро танзим карда ба систем вуруд кунед",
-    "changepassword-success": "Ð\9aалимаи Ñ\83бÑ\83Ñ\80и Ñ\88Ñ\83мо Ð±Ð¾ Ð¼Ñ\83ваÑ\84Ñ\84аÒ\9bиÑ\8fÑ\82 Ñ\82аÒ\93йиÑ\80 Ð´Ð¾Ð´Ð° Ñ\88Ñ\83д! Ð\94аÑ\80 Ò³Ð¾Ð»Ð¸ Ð²Ð¾Ñ\80ид ÐºÐ°Ñ\80дани Ñ\88Ñ\83мо Ð±Ð° Ñ\81иÑ\81Ñ\82ем...",
-    "resetpass_forbidden": "Ð\94аÑ\80 {{SITENAME}} ÐºÐ°Ð»Ð¸Ð¼Ð°Ò³Ð¾Ð¸ Ñ\83бÑ\83Ñ\80ро наметавон тағйир дод",
+    "changepassword-success": "Ð\93Ñ\83заÑ\80вожаи Ñ\88Ñ\83мо Ð±Ð¾ Ð¼Ñ\83ваÑ\84Ñ\84аÒ\9bиÑ\8fÑ\82 Ñ\82аÒ\93йиÑ\80 Ð´Ð¾Ð´Ð° Ñ\88Ñ\83д!",
+    "resetpass_forbidden": "Ð\93Ñ\83заÑ\80вожаҳоро наметавон тағйир дод",
     "resetpass-no-info": "Барои дастрасии мустақим ба ин саҳифа шумо бояд ба систем ворид шуда бошед.",
     "resetpass-submit-loggedin": "Тағйири гузарвожа",
     "resetpass-submit-cancel": "Лағв",
     "resetpass-wrong-oldpass": "Гузарвожаи мувақат ё охир номӯътабар.\nМумкин аст, ки шумо аллакай гузарвожаатонро бо муваффақият тағйир дода бошед ё дархости як гузарвожаи мувақатӣ карда бошед.",
     "resetpass-temp-password": "Гузарвожаи муваққатӣ:",
+    "passwordreset": "Тағйири гузарвожа",
+    "passwordreset-legend": "Тағйири гузарвожа",
     "passwordreset-username": "Номи корбарӣ:",
+    "passwordreset-email": "Нишонаи почтаи электронӣ:",
+    "passwordreset-emailtitle": "Мушаххасоти ҳисоб дар {{SITENAME}}",
     "passwordreset-emailelement": "Номи корбарӣ: $1\nГузарвожаи муваққатӣ: $2",
+    "changeemail": "Тағийри нишонаи email",
+    "changeemail-submit": "Ивази email",
     "changeemail-cancel": "Лағв",
     "bold_sample": "Матни пурранг",
     "bold_tip": "Матни пурранг",
     "anoneditwarning": "'''Огоҳӣ:''' Шумо вуруд накардаед. Суроғаи IP Шумо дар вироишоти ин саҳифа сабт хоҳад шуд.",
     "missingsummary": "'''Ёдоварӣ:''' Шумо хулосаи вироиш нанавиштаед.\nАгар дубора тугмаи \"Захира\"-ро клик кунед, вироишатон бидуни хулоса захира хоҳад шуд.",
     "missingcommenttext": "Лутфан тавсифе дар зер бинависед.",
-    "missingcommentheader": "'''Ёдоварӣ:''' Шумо мавзӯъ/унвони ин ёддоштро мушаххаст накардаед.\nАгар дубора тугмаи \"Захира\"-ро пахш кунед, вироишатон бидуни он захира хоҳад шуд.",
+    "missingcommentheader": "<strong>Ёдоварӣ:</strong> Шумо мавзӯъ/унвони ин ёддоштро мушаххас накардед.\nАгар дубора \"{{int:savearticle}}\" пахш кунед, вироишатон бидуни он захира хоҳад шуд.",
     "summary-preview": "Пешнамоиши хулоса:",
     "subject-preview": "Пешнамоиши мавзӯъ/унвон:",
     "blockedtitle": "Корбар баста шудааст",
     "blockedtext": "'''Номи корбарии Шумо ё нишонаи IP баста шудааст.'''\n\nБастан аз тарафи $1 иҷро шуд.\nСабаби он ''$2'' аст.\n\n* Замони қатъ кардан: $8\n* Замони саромадани қатъи дастрасӣ: $6\n* Қатъкунанда: $7\n\nШумо метавонед бо $1 ё яке дигаре аз [[{{MediaWiki:Grouppage-sysop}}|мудирон]] барои гуфтугӯ роҷеъ ба қатъи дастрасӣ тамос гиред.\nТаваҷҷӯҳ кунед, ки аз қобилияти 'фиристодаи почтаи электронӣ ба ин корбар' наметавоне истифода кард, магар ин ки як нишони мӯътабари почтаи электронӣ дар [[Special:Preferences|тарҷиҳоти корбарии]] худ сабт карда бошед ва аз корбурди он манъ нашуда бошед.\nНишонаи кунунии IP Шумо $3 аст, ва шиносаи қатъи дастрасии Шумо #$5 аст.\nЛутфан ин ё онро ва ё ҳардуи онро дар дархостҳои худ зикр кунед.",
-    "autoblockedtext": "Ð\94аÑ\81Ñ\82Ñ\80аÑ\81ии Ð½Ð¸Ñ\88онаи IP Ñ\88Ñ\83мо Ò\9bаÑ\82Ñ\8a Ñ\88Ñ\83дааÑ\81Ñ\82, Ñ\81абаб Ð¾Ð½ Ð°Ñ\81Ñ\82, ÐºÐ¸ Ð¸Ð½ Ð½Ð¸Ñ\88онаи IP Ð°Ð· Ñ\82аÑ\80аÑ\84и ÐºÐ¾Ñ\80баÑ\80е Ð¸Ñ\81Ñ\82иÑ\84ода Ð¼ÐµÑ\88Ñ\83д, ÐºÐ¸ Ð´Ð°Ñ\81Ñ\82Ñ\80аÑ\81ии Ó¯ Ð°Ð· Ñ\82аÑ\80аÑ\84и $1 Ò\9bаÑ\82Ñ\8a Ð³Ð°Ñ\80донида Ñ\88Ñ\83дааÑ\81Ñ\82.\nÐ\98ллаÑ\82и Ð·Ð¸ÐºÑ\80Ñ\88Ñ\83да Ñ\87Ñ\83нин Ð°Ñ\81Ñ\82:\n\n:''$2''\n\n* Ð¨Ñ\83Ñ\80Ó¯Ñ\8aи Ò\9bаÑ\82Ñ\8aи Ð´Ð°Ñ\81Ñ\82Ñ\80аÑ\81Ó£: $8\n* Ð\9fоÑ\91ни Ò\9bаÑ\82Ñ\8aи Ð´Ð°Ñ\81Ñ\82Ñ\80аÑ\81Ó£: $6\n\nШÑ\83мо Ð¼ÐµÑ\82авонед Ð±Ð¾ $1 Ñ\91 Ñ\8fке Ð°Ð· Ð´Ð¸Ð³Ð°Ñ\80е [[{{MediaWiki:Grouppage-sysop}}|мÑ\83диÑ\80он]] Ñ\82амоÑ\81 Ð±Ð¸Ð³Ð¸Ñ\80ед, Ñ\82о Ð´Ð°Ñ\80 Ð¼Ð°Ð²Ñ\80иди Ð¸Ð½ Ò\9bаÑ\82Ñ\8aи Ð´Ð°Ñ\81Ñ\82Ñ\80аÑ\81Ó£ Ñ\81ӯҳбаÑ\82 ÐºÑ\83нед.\n\nТаваҷҷӯҳ ÐºÑ\83нед, ÐºÐ¸ Ð±Ð°Ñ\80ои Ð¸Ñ\80Ñ\81оли Ð¿Ð¾Ñ\87Ñ\82аи Ñ\8dлекÑ\82Ñ\80онӣ Ð´Ð°Ñ\80 Ð²Ð¸ÐºÐ¸ Ð±Ð¾Ñ\8fд Ð¿Ð¾Ñ\87Ñ\82аи Ñ\8dлекÑ\82Ñ\80онии Ñ\85Ñ\83дÑ\80о Ð´Ð°Ñ\80 Ñ\81аҳиÑ\84аи [[Special:Preferences|Ñ\82аÑ\80ҷиҳоÑ\82и ÐºÐ¾Ñ\80баÑ\80Ó£]] Ñ\84аÑ\8aол ÐºÐ°Ñ\80да Ð±Ð¾Ñ\88ед Ð²Ð° Ð½Ð¸Ð·, Ð¸Ð¼ÐºÐ¾Ð½Ð¸ Ð¸Ñ\81Ñ\82иÑ\84ода Ð°Ð· Ð¸Ð½ Ð²Ð¸Ð¶Ð°Ð³Ó£ Ð±Ð°Ñ\80ои Ñ\88Ñ\83мо Ò\9bаÑ\82Ñ\8a Ð½Ð°Ð±Ð¾Ñ\88ад.\n\nШÑ\83моÑ\80аи Ò\9bаÑ\82Ñ\8aи Ð´Ð°Ñ\81Ñ\82Ñ\80аÑ\81ии Ñ\88Ñ\83мо $5 Ð°Ñ\81Ñ\82. Ð\9bÑ\83Ñ\82Ñ\84ан Ð¸Ð½ Ñ\88Ñ\83моÑ\80аÑ\80о Ð´Ð°Ñ\80 Ò³Ð°Ñ\80 Ð´Ð°Ñ\80Ñ\85оÑ\81Ñ\82е, ÐºÐ¸ Ð´Ð°Ñ\80 Ð¸Ð½ Ð¼Ð°Ñ\82Ñ\80аҳ Ð¼ÐµÐºÑ\83нед, Ò\9bайд ÐºÑ\83нед.",
+    "autoblockedtext": "Ð\9dиÑ\88онаи IP Ñ\88Ñ\83мо Ò\9bаÑ\82Ñ\8a Ñ\88Ñ\83дааÑ\81Ñ\82, Ñ\81абаб Ð¾Ð½ Ð°Ñ\81Ñ\82, ÐºÐ¸ Ð¸Ð½ Ð½Ð¸Ñ\88онаи IP Ð°Ð· Ñ\82аÑ\80аÑ\84и ÐºÐ¾Ñ\80баÑ\80е Ð¸Ñ\81Ñ\82иÑ\84ода Ð¼ÐµÑ\88Ñ\83д, ÐºÐ¸ Ð´Ð°Ñ\81Ñ\82Ñ\80аÑ\81ии Ó¯ Ð°Ð· Ñ\82аÑ\80аÑ\84и $1 Ò\9bаÑ\82Ñ\8a Ð³Ð°Ñ\80донида Ñ\88Ñ\83дааÑ\81Ñ\82.\nÐ\98ллаÑ\82и Ð·Ð¸ÐºÑ\80Ñ\88Ñ\83да Ñ\87Ñ\83нин Ð°Ñ\81Ñ\82:\n\n:<em>$2</em>\n\n* Ð¨Ñ\83Ñ\80Ó¯Ñ\8aи Ò\9bаÑ\82Ñ\8aи Ð´Ð°Ñ\81Ñ\82Ñ\80аÑ\81Ó£: $8\n* Ð\9fоÑ\91ни Ò\9bаÑ\82Ñ\8aи Ð´Ð°Ñ\81Ñ\82Ñ\80аÑ\81Ó£: $6\n* Ð¨Ð°Ñ\85Ñ\81и Ð±Ð°Ñ\81Ñ\82аÑ\88Ñ\83да: $7\n\nШÑ\83мо Ð¼ÐµÑ\82авонед Ð±Ð¾ $1 Ñ\91 Ñ\8fке Ð°Ð· Ð´Ð¸Ð³Ð°Ñ\80е [[{{MediaWiki:Grouppage-sysop}}|мÑ\83диÑ\80он]] Ñ\82амоÑ\81 Ð±Ð¸Ð³Ð¸Ñ\80ед, Ñ\82о Ð´Ð°Ñ\80 Ð¼Ð°Ð²Ñ\80иди Ð¸Ð½ Ò\9bаÑ\82Ñ\8aи Ð´Ð°Ñ\81Ñ\82Ñ\80аÑ\81Ó£ Ñ\81ӯҳбаÑ\82 ÐºÑ\83нед.\n\nТаваҷҷӯҳ ÐºÑ\83нед, Ñ\88Ñ\83мо Ð°Ð· \"Ñ\84иÑ\80иÑ\81Ñ\82одани email Ð±Ð° Ð¸Ð½ ÐºÐ¾Ñ\80баÑ\80\" Ð¸Ñ\81Ñ\82иÑ\84ода Ð±Ñ\83Ñ\80да Ð½Ð°Ð¼ÐµÑ\82авонед, Ð°Ð³Ð°Ñ\80 Ð½Ð¸Ñ\88онаи Ð¿Ð¾Ñ\87Ñ\82аи Ñ\8dлекÑ\82Ñ\80онӣ Ñ\85Ñ\83дÑ\80о Ð´Ð°Ñ\80 Ñ\81аҳиÑ\84аи [[Special:Preferences|Ñ\82аÑ\80ҷиҳоÑ\82и ÐºÐ¾Ñ\80баÑ\80Ó£]] Ñ\84аÑ\8aол ÐºÐ°Ñ\80да Ð½Ð°Ð±Ð¾Ñ\88ед Ð²Ð° Ð½Ð¸Ð·, Ð¸Ð¼ÐºÐ¾Ð½Ð¸ Ð¸Ñ\81Ñ\82иÑ\84ода Ð°Ð· Ð¸Ð½ Ð²Ð¸Ð¶Ð°Ð³Ó£ Ð±Ð°Ñ\80ои Ñ\88Ñ\83мо Ò\9bаÑ\82Ñ\8a Ð½Ð°Ð±Ð¾Ñ\88ад.\n\nÐ\9dиÑ\88онаи IP ÐºÑ\83нÑ\83нии Ñ\88Ñ\83мо $3, Ð²Ð° Ð½Ð¸Ñ\88онаи Ð±Ð°Ñ\81Ñ\82аÑ\88Ñ\83да #$5 Ð°Ñ\81Ñ\82.\nÐ\9bÑ\83Ñ\82Ñ\84ан Ð¸Ð½ Ð¸Ñ\82Ñ\82илооÑ\82Ñ\80о Ð´Ð°Ñ\80 Ò³Ð°Ñ\80 Ð´Ð°Ñ\80Ñ\85оÑ\81Ñ\82е, ÐºÐ¸ Ð¼ÐµÐºÑ\83нед, Ò\9bайд Ð½Ð°Ð¼Ð¾ед.",
     "blockednoreason": "далеле мушаххас нашудааст",
     "whitelistedittext": "Барои вироиши мақола бояд ба систем $1 шавед.",
     "confirmedittext": "Шумо бояд нишонаи почтаи электрониатонро пеш аз вироиш кардани саҳифаҳо, тасдиқ кунед. Лутфан ин корро тариқи [[Special:Preferences|тарҷиҳоти корбар]] сурат диҳед.",
-    "nosuchsectiontitle": "ЧÑ\83нин Ð±Ð°Ñ\85Ñ\88е Ð²Ñ\83Ò·Ñ\83д Ð½Ð°Ð´Ð¾Ñ\80ад",
-    "nosuchsectiontext": "Шумо хостед, ки қисмеро вироиш кунед, ки он вуҷуд надорад.",
+    "nosuchsectiontitle": "Ð\91аÑ\85Ñ\88 Ð¿Ð°Ð¹Ð´Ð¾ Ð½Ð°Ñ\88Ñ\83д",
+    "nosuchsectiontext": "Шумо хостед, ки қисмеро вироиш кунед, ки он вуҷуд надорад.\nШояд масири он тағийр ёфта бошад ва ё дар ҳоли дидани шумо ин саҳифа ҳазф шуда бошад.",
     "loginreqtitle": "Вуруд ба систем лозим аст",
     "loginreqlink": "вуруд ба систем",
     "loginreqpagetext": "Барои дидани саҳифаҳои дигар шумо бояд $1 кунед.",
     "accmailtitle": "Калимаи убур фиристода шуд.",
-    "accmailtext": "Ð\9aалимаи Ñ\83бÑ\83Ñ\80 Ð±Ð°Ñ\80ои \"$1\" Ð±Ð° $2 Ñ\84иÑ\80иÑ\81Ñ\82ода Ñ\88Ñ\83д.",
+    "accmailtext": "Як Ð³Ñ\83заÑ\80вожаи Ñ\82аÑ\81одÑ\83Ñ\84ан Ñ\8dҷодÑ\88Ñ\83да Ð±Ð°Ñ\80ои [[User talk:$1|$1]] Ð±Ð° $2 Ñ\84иÑ\80иÑ\81Ñ\82ода Ñ\88Ñ\83д. Ð\9eнÑ\80о Ð¼ÐµÑ\82авон Ð´Ð°Ñ\80 Ñ\81аҳиÑ\84аи <em>[[Special:ChangePassword|Ñ\82аÒ\93ийÑ\80и Ð³Ñ\83заÑ\80вожа]]</em> Ð¿Ð°Ñ\81 Ð°Ð· Ð²Ñ\83Ñ\80Ñ\83д Ñ\82аÒ\93йиÑ\80 Ð´Ð¾д.",
     "newarticle": "(Нав)",
     "newarticletext": "Шумо пайвандеро интихоб кардед, ки саҳифа дар он арзи вуҷуд надорад.\nБарои сохтани саҳифа, ба қуттии зерин нависед ([$1 саҳифаи роҳнаморо] барои маълумоти бештар нигаред).\nАгар аз сабаби хатогӣ ва ё иштибоҳ омадед, тугмаи '''Ба оқиб'''-ро дар браузери худ пахш кунед.",
-    "anontalkpagetext": "----''Ин саҳифае баҳсе барои корбари гумном (аноним) аст, ки ҳануз ҳисоби ҷадид эчод накардааст ва ё аз он истифода намекунад. Бинобар ин барои шиносоиаш маҷбурем аз нишонаи IP истифода кунем. Чунин нишонаи IP мумкин аст аз тарафи чандин корбарон ба шакли муштарак истифода шавад. Агар шумо корбари гумном ҳастед ва ҳис мекунед, изҳори назари номарбуте ба шумо сурат гирифтааст, лутфан барои пешгири аз иштибоҳ гирифта шудан бо корбарони гумноми дигар дар оянда [[Special:UserLogin|ҳисобе эҷод кунед ё вориди систем шавед]].''",
+    "anontalkpagetext": "----\n<em>Ин саҳифаи баҳс барои як корбари гумном (аноним) аст, ки ҳанӯз ҳисоби ҷадид эҷод накардааст ва ё аз он истифода намекунад.</em> \nБинобар ин барои шиносоиаш маҷбурем аз нишонаи IP рақамии вай истифода баред.\nЧунин нишонаи IP шояд аз сӯи чандин корбарон ба шакли муштарак истифода шавад. \nАгар шумо корбари гумном ҳастед ва ҳис мекунед, ки изҳори назари номарбуте ба шумо сурат гирифтааст, лутфан [[Special:UserLogin/signup|ҳисоберо эҷод кунед]] ё [[Special:UserLogin|вуруд шавед]] барои пешгирӣ аз нофаҳмиҳои оянда бо корбарони гумном.",
     "noarticletext": "Дар ин саҳифа то кунун матне вуҷуд надорад.\nШумо метавонед дар дигар саҳифаҳо [[Special:Search/{{PAGENAME}}|унвони ин саҳифаро ҷустуҷӯ кунед]],\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} гузоришҳои алоқамандро ҷустуҷӯ намоед],\nё [{{fullurl:{{FULLPAGENAME}}|action=edit}} ин саҳифаро вироиш кунед]</span>.",
     "noarticletext-nopermission": "Дар ин саҳифа то кунун матне вуҷуд надорад. Шумо метавонед дар дигар саҳифаҳо [[Special:Search/{{PAGENAME}}|унвони ин саҳифаро ҷустуҷӯ кунед]], <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} гузоришҳои алоқамандро ҷустуҷӯ намоед], ё [{{fullurl:{{FULLPAGENAME}}|action=edit}} ин саҳифаро вироиш кунед]</span>.",
     "userpage-userdoesnotexist": "Ҳисоби корбар \"<nowiki>$1</nowiki>\" сабт нашудааст. Итминон ҳосил кунед ки мехоҳед ин саҳифаро эчод ё вироиш кунед.",
-    "clearyourcache": "'''Эзоҳ:''' Пас аз захирасозӣ мумкин аст барои дидани тағйирот ниёз бошад, ки ҳофизаи ниҳонии мурургари худро холӣ кунед. '''Мозилла / Файерфокс / Сафари:''' калиди ''Shift''-ро нигоҳ доред  ва рӯи тугмаи  ''Reload'' клик кунед, ё калидҳои ''Ctrl-Shift-R'' (''Cmd-Shift-R'' дар Эппл Макинтош) бо ҳам фишор диҳед; '''IE:''' калиди ''Ctrl'' нигоҳ доред ва рӯи тугмаи ''Refresh'' клик кунед, ё калидҳои ''Ctrl-F5'' бо ҳам фишор диҳед; '''Konqueror:''': тугмаи ''Reload''-ро оддӣ клик кунед, ё калиди ''F5'' фишор диҳед; Ба корбарони '''Opera''' мумкин аст лозим бошад, ки ҳофизаи ниҳонии худро комилан дар ''Tools→Preferences'' холӣ кунанд.",
-    "usercssyoucanpreview": "'''Эзоҳ:''' Пеш парвандаи CSS ё JS худро захира кунед, бо истифода аз тугмаи \"Пешнамоиш\" метавонед онро озмоиш кунед.",
-    "userjsyoucanpreview": "'''Эзоҳ:''' Пеш парвандаи CSS ё JS худро захира кунед, бо истифода аз тугмаи \"Пешнамоиш\" метавонед онро озмоиш кунед.",
-    "usercsspreview": "'''Фаромӯш накунед, ки шумо фақат CSS корбариатонро пешнамоиш карда истодааед ва он ҳанӯз захира нашудааст!'''",
+    "clearyourcache": "<strong>Эзоҳ:</strong> Пас аз захирасозӣ мумкин аст барои дидани тағйирот ниёз бошад, ки ҳофизаи ниҳонии мурургари худро холӣ кунед. \n*<strong>Файерфокс/Сафари:</strong> калиди <em>Shift</em>-ро нигоҳ доред  ва рӯи тугмаи  <em>Reload</em> клик кунед, ё калидҳои <em>Ctrl-F5</em> ё <em>Cmd-R</em>(<em>⌘-R</em> дар Мак) бо ҳам фишор диҳед; \n* <strong>Google Chrome:</strong> <em>Ctrl-Shift-R</em> пахш кунед (<em>⌘-Shift-R</em> дар Мак)\n* <strong>Internet Explorer:</strong> калиди <em>Ctrl</em> нигоҳ доред ва рӯи тугмаи <em>Refresh</em> клик кунед, ё калидҳои <em>Ctrl-F5</em> бо ҳам фишор диҳед \n* <strong>Opera:</strong> Ҳофизаи ниҳониро дар ''Tools→Preferences'' холӣ кунанд.",
+    "usercssyoucanpreview": "<strong>Эзоҳ:</strong> Тугмаи \"{{int:showpreview}}\" барои санҷиши парванди CSS қабл аз захира истифода баред.",
+    "userjsyoucanpreview": "<strong>Эзоҳ:</strong> Тугмаи \"{{int:showpreview}}\" барои санҷиши парванди ҶаваСкрипт қабл аз захира истифода баред.",
+    "usercsspreview": "<strong>Фаромӯш накунед, ки шумо фақат CSS корбариатонро пешнамоиш карда истодааед. Он ҳанӯз захира нашудааст!</strong>",
     "userjspreview": "'''Фаромӯш накунед, ки шумо фақат ҶаваСкрипти корбариатонро имтиҳон,пешнамоиш карда истодаед ва он ҳанӯз захира нашудааст!'''",
     "userinvalidcssjstitle": "'''Ҳушдор:'''Пӯсте бо номи \"$1\" вуҷуд надорад. Таваҷҷӯҳ кунед ки саҳифаҳои .css ва .js бо ҳарфҳои хурд навишта мешаванд, Намуна. {{ns:user}}:Фу/vector.css дар муқобили корбар {{ns:user}}:Фу/Vector.css.",
     "updated": "(Ба рӯз шуда)",
     "session_fail_preview_html": "'''Бубахшед! Имкони сабти вироиши шумо ба хотир аз даст рафтани иттилоот нишаст.'''\n\n''Бо таваҷҷӯҳ ба ин ки дар {{SITENAME}} имкони HTML хом фаъол аст, пешнамоиши саҳифа пинҳон шуда то имкони зидди ҳамалоти ҶаваСкрипт вуҷуд ндошта бошад.''\n\n'''Агар боварӣ доред, ки ин пешнамоиш як вироиши миҷоз ас, онро такрор кунед. Агар пешнамоиш натиҷае надод, аз систем хориҷ шавед ва дубора ворид шавед'''",
     "token_suffix_mismatch": "'''Вироишҳои шумо захира нашуд, зеро мурургари шумо навиштаҳои нуқтагузориро аз ҳам пошида аст. Вироиши шумо захира нашуд то аз вайрон шудани матни саҳифа пешгирӣ кунад.\nБаъзан ин хато вақте пайдо мешавад, ки шумо аз хизмати (web-based proxy) истифода мекунед.'''",
     "editing": "Дар ҳоли вироиш $1",
+    "creating": "Дар ҳоли эҷоди $1",
     "editingsection": "Дар ҳоли вироиши $1 (қисмат)",
-    "editingcomment": "Дар ҳоли вироиш $1 (comment)",
+    "editingcomment": "Дар ҳоли вироиши $1 (қисми нав)",
     "editconflict": "Бархӯрди вироишӣ: $1",
     "explainconflict": "Аз вақте ки шумо вироиши ин саҳифаро оғоз кардаед, шахси дигаре онро тағйир дода аст.\nНоҳияи матни болои шомили матни саҳифа ба шакли феълии он аст.\nТағйироти шумо дар ноҳияи матни поёни нишон дода шудааст.\nШумо бояд тағйиротатонро бо матни феълӣ таркиб кунед.\n'''Фақат''', вақте, ки тугмаи \"{{int:savearticle}}\"-ро фишор диҳед матни ноҳияи матни болои захира хоҳад шуд.",
     "yourtext": "Матни Шумо",
     "yourdiff": "Фарқиятҳо",
     "copyrightwarning": "Ҳамаи ҳиссагузорӣ ба {{SITENAME}} аз рӯи қонунҳои зерин $2 (нигаред $1 барои маълумоти бештар) ҳиссагузорӣ мешаванд. Агар Шумо намехоҳед, ки навиштаҷоти Шумо вироиш ва паҳн нашаванд, Шумо метавонед ин мақоларо нафиристед.<br /> Шумо ваъда медиҳед, ки худатон ин мақоларо навиштед ё ки аз сарчашмаҳои кушод нусхабардорӣ кардаед. '''АСАРҲОИ ҚОБИЛИ ҲУҚУҚИ МУАЛЛИФРО БЕ ИҶОЗАТ НАФИРИСТЕД!'''",
     "copyrightwarning2": "Лутфан таваҷҷӯҳ дошта бошед ки ҳамаи ҳиссагузориҳо ба {{SITENAME}} бо таҳти  \"Иҷозатномаи мустанадоти Озод GNU\" мунташир мешаванд. (барои ҷузъиёти бештар нигаред ба $1). Агар намехоҳед навиштаҳоятон бераҳмона вироиш шуда ва ба дилхоҳ тавзеҳ шавад, инҷо нафиристед.<br />\nҲамин тавр шумо қавл медиҳед, ки худатонро инро навиштаед ё онро аз як манбаи озод бо моликияти умумӣ ё мушобеҳи он нусхабардорӣ кардаед. '''КОРҲОИ ҲУҚУҚИ ИНҲИСОРИ МУАЛЛИФРО (ТАКСИР) БЕ ИҷОЗАТЕ НАФИРИСТЕД!'''",
-    "longpageerror": "'''ХАТО: Матне ки ирсол кардаед $1 килобайт ҳаҷм дорад, ки ин миқдор аз миқдори пешина $2 килобайт  бештар аст. Наметавон онро захира кард.'''",
+    "longpageerror": "<strong>Хато: Матне ки ирсол кардед {{PLURAL:$1|як килобайт|$1 килобайт}} ҳаҷм дорад, ки ин миқдор бештар аз ҳаддиаксари {{PLURAL:$2|як килобайт|$2 килобайт}} аст.</strong>\nНаметавон онро захира кард.",
     "readonlywarning": "'''ҲУШДОР: Пойгоҳи дода барои нигоҳдорӣ қуфл шудааст, бинобар ин наметавонед вироишҳоятонро ҳоло фавран захира кунед. Агар мехоҳед матнро дар як парвандаи матнӣ часпонед ва барои оянда онро захира кунед.'''",
     "protectedpagewarning": "'''ҲУШДОР: Ин саҳифа қуфл шудааст то фақат корбароне бо имтиёзи мудир (ё болотар) битавонанд онро вироиш кунанд.'''",
     "semiprotectedpagewarning": "'''Таваҷҷӯҳ:''' Ин саҳифа қуфл шудааст то танҳо корбарони сабтиномкарда қодир ба вироиши он бошанд.",
     "permissionserrorstext-withaction": "Шумо ба $2 аз {{PLURAL:$1|сабаби|сабабҳои}} зерин иҷозате надоред:",
     "recreate-moveddeleted-warn": "'''Диққат: Шумо саҳифаеро барқарор карда истодаед, ки пештар ҳазф шудааст.'''\n\nШумо зарурияти вироиши ин саҳифаро дида баромаданатон лозим.\nСабти ҳазфшавии ин саҳифа барои фароҳам овардани имкониятҳои қулай оварда шудааст:",
     "moveddeleted-notice": "Ин саҳифа ҳазф шудааст. \nГузориши ҳазф ва тағйири масири ин саҳифа дар зер барои иттилооти шумо оварда шудааст.",
+    "content-model-javascript": "ҶаваСкрипт",
     "post-expand-template-inclusion-warning": "<strong>Огоҳӣ:</strong> Шаблони дар баргирифта хеле калон аст. Баъзе аз шаблонҳо дар бар гирифта намешавад.",
     "post-expand-template-inclusion-category": "Саҳифаҳое ки дар он ҳаҷми шаблон беш аз ҳад аст",
     "post-expand-template-argument-warning": "<strong>Огоҳӣ:</strong> Ин саҳифа ҳаддиақал як шаблоне дорад, ки хосияти ҳаҷм калони васеъшавӣ дорад.\nИн хосият аз байр гирифта шуд.",
     "rev-deleted-text-permission": "Ин вироиш аз ин саҳифа аз таърихи умумии ин саҳифа ҳазф шудааст.\nИттилооти марбутаро эҳтимолан метавонед дар [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} гузориши ҳазф] бубинед.",
     "rev-deleted-text-view": "Ин вироиш аз ин саҳифа аз таърихи умумии ин саҳифа ҳазф шудааст.\nШумо ҳамчун мудири {{SITENAME}} метавонед онро бубинед; иттилооти марбутаро эҳтимолан метавонед дар [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} гузориши ҳазф] бубинед.",
     "rev-delundel": "намоиш/пинҳон",
+    "rev-showdeleted": "намоиш",
     "revisiondelete": "Нусхаҳои ҳазф/эҳёӣ",
     "revdelete-nooldid-title": "Нусхаи мақсади номӯътабар",
     "revdelete-nooldid-text": "Шумо ин ё он нусхаи(ҳои) мақсадро барои иҷрои ин амал мушаххас накардаед, нусхаи мушаххасшуда вуҷуд надорад, ё  шумо дар ҳоли кӯшиши пинҳон кардани нусхаи кунуниаш ҳастед.",
+    "revdelete-show-file-submit": "Бале",
     "logdelete-selected": "{{PLURAL:$1|Гузориши маврид интихобшуда|Гузориши мавориди интихобшуда}}:",
     "revdelete-legend": "Танзими маҳдудиятҳои падидорӣ",
-    "revdelete-hide-text": "Ð\9fинҳон ÐºÐ°Ñ\80дани Ð½Ñ\83Ñ\81Ñ\85аи Ð¼Ð°Ñ\82н",
+    "revdelete-hide-text": "Ð\9cаÑ\82ни Ñ\82аҷдиди Ð½Ð°Ð·Ð°Ñ\80",
     "revdelete-hide-image": "Пинҳон кардани мӯҳтавиёти парванда",
     "revdelete-hide-name": "Пинҳон кардани амал ва ҳадаф",
-    "revdelete-hide-comment": "Ð\9fинҳон ÐºÐ°Ñ\80дани Ñ\82авзеҳи вироиш",
-    "revdelete-hide-user": "Номи корбар/нишонаи IP пинҳон шавад",
+    "revdelete-hide-comment": "Ð¥Ñ\83лоÑ\81аи вироиш",
+    "revdelete-hide-user": "Номи корбар/нишонаи IP",
     "revdelete-hide-restricted": "Фурунишонии иттилоот барои мудирон ба ҳамроҳи дигарон",
+    "revdelete-radio-same": "(тағйир надиҳед)",
+    "revdelete-radio-set": "Пинҳон",
+    "revdelete-radio-unset": "Намоён",
     "revdelete-suppress": "Аз дастрасии мудирон ба додаҳо низ монанди сайри корбарон ҷилавгирӣ ба амал ояд",
     "revdelete-unsuppress": "Хотимаи маҳдудиятҳо дар мавриди нусхаҳои интихобшуда",
     "revdelete-log": "Сабаб:",
     "powersearch-legend": "Ҷустуҷӯи пешрафта",
     "powersearch-ns": "Ҷустуҷӯ дар фазоҳои ном:",
     "powersearch-redir": "Феҳрист кардани масирҳо",
+    "powersearch-toggleall": "Ҳама",
     "search-external": "Ҷустуҷӯи хориҷӣ",
     "searchdisabled": "Ҷустуҷу дар {{SITENAME}} ғайрифаъол карда шудааст. Шумо метавонед тариқи Google дар ҳол ҷустуҷӯ кунед. Таваҷҷӯҳ кунед, ки натоиҷи ҷустуҷӯ {{SITENAME}} метавонад барӯз набошад.",
     "preferences": "Тарҷиҳот",
     "prefs-skin": "Пӯст",
     "skin-preview": "Пешнамоиш",
     "datedefault": "Бе тарҷиҳ",
-    "prefs-datetime": "Сана ва вақт",
+    "prefs-user-pages": "Саҳифаҳои корбар",
     "prefs-personal": "Додаҳои корбар",
     "prefs-rc": "Тағйироти охирин",
     "prefs-watchlist": "Феҳристи пайгириҳо",
     "prefs-watchlist-edits": "Теъдоди вироишҳои нишондода дар феҳристи пайгириҳои густаришёфта:",
     "prefs-misc": "Танзимоти ҳархела",
     "prefs-resetpass": "Тағйири гузарвожа",
+    "prefs-rendering": "Намуд",
     "saveprefs": "Захираи тарҷиҳот",
     "prefs-editing": "Дар ҳоли вироиш",
     "rows": "Теъдоди сатрҳо:",
     "columns": "Теъдоди сутунҳо:",
     "searchresultshead": "Ҷустуҷӯ",
     "stub-threshold": "Остонаи вироиши пайвандҳои <a href=\"#\" class=\"stub\">ноқис</a>:",
+    "stub-threshold-disabled": "Ғайрифаъолшуда",
     "recentchangesdays": "Теъдоди рӯзҳои намоиш додашуда дар тағйироти охир:",
     "recentchangescount": "Теъдоди вироишҳо барои намоиш дар тағйироти охир:",
     "savedprefs": "Тарҷиҳоти шумо захира шуд.",
     "timezoneregion-africa": "Африқо",
     "timezoneregion-america": "Амрико",
     "timezoneregion-asia": "Осиё",
+    "timezoneregion-atlantic": "Уқёнуси Атлантик",
+    "timezoneregion-australia": "Австралия",
     "timezoneregion-europe": "Аврупо",
+    "timezoneregion-indian": "Уқёнуси Ҳинд",
+    "timezoneregion-pacific": "Уқёнуси Ором",
     "allowemail": "Иҷозат додани e-mail аз дигар корбарон",
-    "prefs-searchoptions": "Гузинаҳои ҷустуҷӯ",
+    "prefs-searchoptions": "Ҷустуҷӯ",
     "prefs-namespaces": "Фазоҳои ном",
     "defaultns": "Ба таври пешфарз дар ин фазоҳои ном ҷустуҷӯ шавад:",
     "default": "пешфарз",
     "badsiglength": "Тахаллус хеле дароз аст.\nОн бояд камтар аз $1 {{PLURAL:$1|аломат|аломатҳо}} бошад.",
     "yourgender": "Ҷинс:",
     "gender-unknown": "Мушаххаснашуда",
-    "gender-male": "Ð\9cаÑ\80д",
-    "gender-female": "Ð\97ан",
+    "gender-male": "Ð\92ай Ð²Ð¸ÐºÐ¸ Ñ\81аҳиÑ\84аҳоÑ\80о Ð²Ð¸Ñ\80оиÑ\88 Ð¼ÐµÐºÑ\83над",
+    "gender-female": "Ð\92ай Ð²Ð¸ÐºÐ¸ Ñ\81аҳиÑ\84аҳоÑ\80о Ð²Ð¸Ñ\80оиÑ\88 Ð¼ÐµÐºÑ\83над",
     "email": "Почтаи электронӣ",
     "prefs-help-realname": "Номи ҳақиқӣ ихтиёрӣ ва агар шумо онро пешниҳод кунед онро ҳамчун муаллифи эҷодиётатон ёдоварӣ карда хоҳад шуд.",
     "prefs-help-email": "Нишонаи электронӣ ихтиёрист, аммо фиристодани гузарвожаи навро агар гузарвожаи худро фаромӯш кунед мумкин мегардад.",
     "prefs-help-email-required": "Нишони почтаи электрони лозим аст.",
+    "prefs-i18n": "Байналмиллаликунӣ",
+    "prefs-signature": "Имзо",
+    "prefs-editor": "Вироишгар",
+    "prefs-preview": "Пешнамоиш",
+    "prefs-advancedrc": "Ихтиёроти пешрафта",
+    "prefs-advancedrendering": "Ихтиёроти пешрафта",
+    "prefs-advancedsearchoptions": "Ихтиёроти пешрафта",
+    "prefs-advancedwatchlist": "Ихтиёроти пешрафта",
+    "prefs-displayrc": "Ихтиёроти намоиш",
+    "prefs-displaysearchoptions": "Ихтиёроти намоиш",
+    "prefs-displaywatchlist": "Ихтиёроти намоиш",
+    "prefs-tokenwatchlist": "Рамз",
+    "prefs-diffs": "Тафовут",
     "userrights": "Мудирияти ихтиёроти корбарӣ",
     "userrights-lookup-user": "Мудирияти гурӯҳҳои корбарӣ",
     "userrights-user-editname": "Номи корбарро дохил кунед:",
     "group-user-member": "Корбар",
     "group-autoconfirmed-member": "Корбари таъйидшуда",
     "group-bot-member": "Робот",
-    "group-sysop-member": "Администратор",
-    "group-bureaucrat-member": "Бюрократ",
-    "group-suppress-member": "Назар",
+    "group-sysop-member": "{{GENDER:$1|мудир}}",
+    "group-bureaucrat-member": "{{GENDER:$1|девонсолор}}",
+    "group-suppress-member": "{{GENDER:$1|саҳв}}",
     "grouppage-user": "{{ns:project}}:Корбарон",
     "grouppage-autoconfirmed": "{{ns:project}}:Корбарони таъйидшуда",
     "grouppage-bot": "{{ns:project}}:Роботҳо",
     "right-block": "Бастани дигар корбарон аз вироишкунӣ",
     "right-blockemail": "Бастани корбар аз фиристодани почтаи электронӣ",
     "right-hideuser": "Бастани корбар, бо пинҳон кардани он аз омма",
-    "right-editprotected": "Вироиши саҳифаҳои ҳифзшуда (бидуни ҳифзи обшорӣ)",
+    "right-editprotected": "Вироиши саҳифаҳои ҳифзшуда чун \"{{int:protect-level-sysop}}\"",
     "right-editinterface": "Вироиши намоиши корбарӣ",
     "right-editusercssjs": "Вироиши парвандаҳои CSS ва JS дигар корбарон",
     "right-editusercss": "Вироиши парвандаҳои CSS дигар корбарон",
     "newuserlogpagetext": "Ин гузориш аз номҳои корбарии тозасохташуда аст.",
     "rightslog": "Гузориши ихтиёроти корбар",
     "rightslogtext": "Ин гузориш тағйироти ихтиёроти корбар аст.",
+    "action-read": "хондани ин саҳифа",
     "action-edit": "вироиши ин саҳифа",
+    "action-createpage": "эҷоди саҳифаҳо",
+    "action-createtalk": "эҷоди саҳифаҳои баҳс",
+    "action-createaccount": "эҷоди ин ҳисоби корбарӣ",
+    "action-minoredit": "аломат задани ин вироиш чун ҷузъӣ",
+    "action-move": "кӯчонидани ин саҳифа",
+    "action-move-subpages": "кӯчонидани ин саҳифа, ва зерсаҳифаҳояш",
+    "action-move-rootuserpages": "кӯчонидани реша саҳифаҳои корбарӣ",
+    "action-movefile": "кӯчонидани ин парванда",
+    "action-upload": "бор кардани ин парванда",
+    "action-reupload": "бознависии ин парвандаи мавҷудбуда",
+    "action-browsearchive": "ҷустуҷӯи саҳифаҳои ҳазвшуда",
+    "action-undelete": "барқарор кардани ин саҳифа",
+    "action-sendemail": "фиристодани пайёмҳо",
     "nchanges": "$1 {{PLURAL:$1|тағйир|тағйирот}}",
+    "enhancedrc-history": "таърих",
     "recentchanges": "Тағйироти охирин",
     "recentchanges-legend": "Ихтиёроти тағйироти охирин",
     "recentchanges-summary": "Назорати тағйиротҳои навтарин дар Википедиа дар ҳамин саҳифа аст.",
     "rcnotefrom": "Дар зер тағйиротҳои охирин аз <b>$2</b> (то <b>$1</b> нишон дода шудааст).",
     "rclistfrom": "Нишон додани тағйиротҳои нав сар карда аз $1",
     "rcshowhideminor": "$1 вироишҳои хурд",
+    "rcshowhideminor-show": "Намоиш",
+    "rcshowhideminor-hide": "Пинҳон",
     "rcshowhidebots": "$1 ботҳо",
+    "rcshowhidebots-show": "Намоиш",
+    "rcshowhidebots-hide": "Пинҳон",
     "rcshowhideliu": "$1 корбарони сабтиномшуда",
+    "rcshowhideliu-show": "Намоиш",
+    "rcshowhideliu-hide": "Пинҳон",
     "rcshowhideanons": "$1 корбарони вуруднашуда",
+    "rcshowhideanons-show": "Намоиш",
+    "rcshowhideanons-hide": "Пинҳон",
     "rcshowhidepatr": "$1 вироишҳои гаштӣ",
+    "rcshowhidepatr-show": "Намоиш",
+    "rcshowhidepatr-hide": "Пинҳон",
     "rcshowhidemine": "$1 вироишҳои ман",
+    "rcshowhidemine-show": "Намоиш",
+    "rcshowhidemine-hide": "Пинҳон",
     "rclinks": "Нишон додани $1 тағйироти охирин дар $2 рӯзи охир<br />$3",
     "diff": "фарқият",
     "hist": "таърих",
     "upload-permitted": "Навъҳои парвандаҳои иҷозатшуда: $1.",
     "upload-preferred": "Навъҳои парвандаҳои иҷозатшуда: $1.",
     "upload-prohibited": "Навъҳои парвандаҳои манъшуда: $1.",
-    "uploadlog": "сабти фиристодан",
     "uploadlogpage": "Сабти фиристодан",
     "uploadlogpagetext": "Феҳристи зерин феҳристи охирин парвандаҳои богузоришуда мебошад. (Ҳамаи вақтҳои нишондодашуда вақти Ҷаҳонӣ ё Вақти Гринвич мебошад)",
     "filename": "Номи парванда",
     "filedesc": "Хулоса",
     "fileuploadsummary": "Хулоса:",
+    "filereuploadsummary": "Тағийроти парванда:",
     "filestatus": "Вазъияти ҳаққи таксир:",
     "filesource": "Манбаъ:",
-    "uploadedfiles": "Файлҳои фиристодашуда",
     "ignorewarning": "Аҳмият надодан ба ҳушдор ва захира кардани парванда",
     "ignorewarnings": "Чашмпӯшӣ аз ҳама ҳушдорҳо",
     "minlength1": "Номи парванда дасти кам як ҳарф бошад.",
     "emailuser": "Фиристодани email ба ин корбар",
     "emailpage": "Почтаи электронӣ ба корбар",
     "emailpagetext": "Агар ин корбар нишонаи почтаи электронии мӯътабаре дар тарҷиҳоти ворид карда бошад, форми зерин як пайғоме мефиристад.\nНишонаи почтаи электроние, ки шумо дар тарҷиҳоти корбариатон ворид кардаед, дар нишони фиристандаи нома \"From\" хоҳад омад, то ки гиранда тавонад ба шумо посух диҳад.",
-    "usermailererror": "Почтаи электрони ба хатое дучор шуд:",
     "defemailsubject": "Википедиа e-mail",
     "noemailtitle": "Нишонаи почтаи электронӣ мавҷуд нест",
     "noemailtext": "Ин корбар, нишонаи мӯътабари почтаи электрониро мушаххас накарда аст, ё тасмим гирифааст, аз корбарони дигар почтаи электронӣ дарёфт накунад.",
     "nowatchlist": "Дар феҳристи пайгириҳои шумо ҳеҷ мавриде нест.",
     "watchlistanontext": "Лутфан барои мушоҳида ва вироиши феҳристи пайгириҳои худ аз $1 истифода кунед.",
     "watchnologin": "Вуруд нашуда",
-    "watchnologintext": "Барои тағйири феҳристи пайгириҳои худ бояд [[Special:UserLogin|ба систем ворид шавед]].",
     "addedwatchtext": "Ин саҳифа \"[[:$1]]\" ва [[Special:Watchlist|феҳристи назароти]] Шумо илова шуд.\nДигаргуниҳои ояндаи ин саҳифа ва саҳифи баҳси алоқаманд дар рӯихати онҷо хоҳад шуд,\nва саҳифа '''ғафс''' дар [[Special:RecentChanges|рӯихати тағйироти охирин]] барои бо осони дарёфт кардан хоҳад ба назар расид.\n\nАгар шумо дертар аз феҳристи назаротатон ин саҳифаро ҳазв кардан хоҳед, дар меню \"Назар накардан\"-ро пахш кунед.",
     "removedwatchtext": "Саҳифаи \"[[:$1]]\" аз [[Special:Watchlist|феҳристи пайгириҳои шумо]] бардошта шуд.",
     "watch": "Назар кардан",
     "watchlist-options": "Ихтиёроти феҳристи пайгириҳо",
     "watching": "Пайгири...",
     "unwatching": "Тавқифи пайгири...",
-    "enotif_mailer": "{{SITENAME}} Иттилорасонӣ почтаи электронӣ",
     "enotif_reset": "Аломатрасони ҳамаи саҳифаҳо ба унвони боздидшуда",
     "enotif_impersonal_salutation": "Корбари {{SITENAME}}",
     "enotif_lastvisited": "Барои дидани ҳамаи тағйирот аз охирин боре, ки сар задаед $1ро бубинед.",
     "excontent": "мӯҳтавои саҳифа ин буд: '$1'",
     "excontentauthor": "мӯҳтавои саҳифа ин буд: '$1' (ва ягона ҳиссагузор '[[Special:Contributions/$2|$2]]' буд)",
     "exbeforeblank": "мӯҳтавои саҳифа қабл аз холӣ кардан ин '$1' буд",
-    "exblank": "саҳифа холӣ буд",
     "delete-confirm": "Ҳазф \"$1\"",
     "delete-legend": "Ҳазф",
     "historywarning": "Ҳушдор: Саҳифае ки шумо ҳазф карданиед, таърих дорад:",
     "undeletebtn": "Барқарор кардан",
     "undeletelink": "дидан/барқарор кардан",
     "undeleteviewlink": "намоиш",
-    "undeletecomment": "Тавзеҳ:",
+    "undeletecomment": "Сабаб:",
     "undeletedrevisions": "$1 нусха бақарор {{PLURAL:$1|шуд|шуданд}}",
     "undeletedrevisions-files": "$1 нусха ва $2 парванда барқарор {{PLURAL:$1|шуд|шуданд}}",
     "undeletedfiles": "$1 парванда барқарор {{PLURAL:$1|шуд|шуданд}}",
     "allmessagesname": "Ном",
     "allmessagesdefault": "Матни қарордодӣ",
     "allmessagescurrent": "Матни кунунӣ",
-    "allmessagestext": "Ин феҳристи паёмҳои системавии дастрас дар фазои номи MediaWiki мебошад.\nАгар майли ҳиссагузорӣ карданро ба маҳалликунонии MediaWiki доред, пас лутан саҳифаҳои [https://www.mediawiki.org/wiki/Localisation Маҳалликунонии MediaWiki] ва [//translatewiki.net translatewiki.net] нигаред.",
+    "allmessagestext": "Ин феҳристи паёмҳои системавии дастрас дар фазои номи MediaWiki мебошад.\nАгар майли ҳиссагузорӣ карданро ба маҳалликунонии MediaWiki доред, пас лутфан ба саҳифаҳои [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation Маҳалликунонии MediaWiki] ва [//translatewiki.net translatewiki.net] гузаред.",
     "allmessagesnotsupportedDB": "Аз ин саҳифа наметавон истифода бурд, чун '''$wgUseDatabaseMessages''' ғайрифаъол гардонида шудааст.",
     "allmessages-filter-legend": "Филтр",
     "allmessages-filter-all": "Ҳама",
     "importunknownsource": "Навъи манбаи номаълум барои воридкуни",
     "importcantopen": "Парвандаи вуруди саҳифаҳо боз нашуд",
     "importbadinterwiki": "Пайванди байнивики нодуруст",
-    "importnotext": "Саҳифа холӣ ё бе матн",
     "importsuccess": "Ворид кардан бо муваффақият анҷом ёфт!",
-    "importhistoryconflict": "Нусхаҳои носозгор аз таърихчаи ин саҳифа вуҷуд дорад (эҳтимолан қаблан ин саҳифа ворид шудааст)",
     "importnosources": "Ҳеҷ манбаъе барои ворид кардани иттилоот аз викии дигар таъриф нашудааст ва боргузории бевоситаи таърих ғайрифаъол аст.",
     "importnofile": "Ҳеҷ парвандаи вуруди боргузорӣ нашудааст.",
     "importuploaderrorsize": "Дар боргузории парвандаи вуруд, ишколе рух дод. Андозаи парванда калонтар аз андозаи иҷозатшуда ба борзуорӣ аст.",
     "exif-isospeedratings": "Дараҷабандии суръати ISO",
     "exif-shutterspeedvalue": "Суръати парда",
     "exif-aperturevalue": "Андозаи диафрагм",
-    "exif-brightnessvalue": "Равшанӣ",
+    "exif-brightnessvalue": "APEX равшанӣ",
     "exif-exposurebiasvalue": "Хатои нурдиҳӣ",
     "exif-maxaperturevalue": "Ҳадди аксар кушодагии замин",
     "exif-subjectdistance": "Фосилаи ҷисм",
     "exif-orientation-3": "180° дараҷа чархида",
     "exif-orientation-4": "Амудӣ пуштурӯ шуда",
     "exif-orientation-5": "90° бо ақрабаки соат чархида ва амудӣ пуштурӯ шуда",
-    "exif-orientation-6": "90° ақрабаки соат чархида",
+    "exif-orientation-6": "Чархида 90° ақрабаки соат",
     "exif-orientation-7": "90° ақрабаки соат чархида ва амудӣ пуштурӯ шуда",
     "exif-orientation-8": "90° бо ақрабаки соат чархида",
     "exif-planarconfiguration-1": "Қолаби фарбеҳ",
     "invalidateemail": "Таъйиди тариқи почтаи электрониро лағв кунед",
     "scarytranscludedisabled": "[Ғунҷоиши байнивикиёна фаъол нест]",
     "scarytranscludefailed": "[Фарохонии шаблон барои $1 муяссар нашуд]",
-    "scarytranscludetoolong": "[URL-Ð\9dиÑ\88онаи Ð¸Ð½Ñ\82еÑ\80неÑ\82ии Ð¼Ð°Ð²Ñ\80иди Ð½Ð°Ð·Ð°Ñ\80 Ð±ÐµÑ\88 Ð°Ð· Ð°Ð½Ð´Ð¾Ð·Ð° Ð´Ð°Ñ\80оз Ð±Ñ\83д; Ð±Ñ\83баÑ\85Ñ\88ед]",
+    "scarytranscludetoolong": "[URL-Ð\9dиÑ\88онаи Ð¸Ð½Ñ\82еÑ\80неÑ\82ии Ð¼Ð°Ð²Ñ\80иди Ð½Ð°Ð·Ð°Ñ\80 Ð±ÐµÑ\88 Ð°Ð· Ð°Ð½Ð´Ð¾Ð·Ð° Ð´Ð°Ñ\80оз Ð°Ñ\81Ñ\82]",
     "deletedwhileediting": "'''Огоҳӣ''': Ин саҳифа баъди ба вироиш шурӯъ кардани шумо ҳазф шуда буд!",
     "confirmrecreate": "Корбар [[User:$1|$1]] ([[User talk:$1|баҳс]]) ин мақоларо пас аз он ки огоз ба вироиши он намудаед бо далели зерин ҳазф кардааст:\n: ''$2''\nЛутфан таъйид кунед, ки муҷаддадан мехоҳед ин мақоларо эҷод кунед.",
     "recreate": "Аз нав созед",
     "autosumm-blank": "Саҳифаро холӣ кард",
     "autosumm-replace": "Ивазкунии саҳифа бо '$1'",
     "autoredircomment": "Тағйири масир ба [[$1]]",
-    "autosumm-new": "Саҳифаи нав: $1",
+    "autosumm-new": "Саҳифаи нав бо \"$1\" эҷод шуд",
     "livepreview-loading": "Дар ҳоли бор шудан…",
     "livepreview-ready": "Бор шудан… Омода!",
     "livepreview-failed": "Пешнамоиши зинда ба мушкилӣ бархӯрд! Лутфан аз пешнамоиши оддӣ истифода кунед.",
     "version-hook-name": "Номи қолаб",
     "version-hook-subscribedby": "Воридшуда тавассути",
     "version-version": "(Нусха $1)",
-    "version-license": "Иҷозатнома",
+    "version-license": "Иҷозатномаи МедиаВики",
     "version-software": "Нусхаи насбшуда",
     "version-software-product": "Маҳсул",
     "version-software-version": "Нусха",
     "fileduplicatesearch-result-n": "Парвандаи \"$1\" дорои {{PLURAL:$2|1 мавриди такрорӣ|$2 мавриди такрорӣ}} аст.",
     "specialpages": "Саҳифаҳои вижа",
     "specialpages-group-other": "Дигар саҳифаҳои вижа",
-    "specialpages-group-login": "Ð\92Ñ\83Ñ\80Ñ\83д / Ñ\81абÑ\82и Ð½Ð¾Ð¼",
+    "specialpages-group-login": "Ð\92Ñ\83Ñ\80Ñ\83д / Ñ\8dҷоди Ò³Ð¸Ñ\81об",
     "specialpages-group-changes": "Тағйироти охирин ва гузоришҳо",
     "specialpages-group-pages": "Феҳристҳои саҳифаҳо",
     "specialpages-group-pagetools": "Абзорҳои саҳифа",
-    "specialpages-group-wiki": "Ð\92ики Ð´одаҳо ва абзорҳо",
+    "specialpages-group-wiki": "Ð\94одаҳо ва абзорҳо",
     "specialpages-group-redirects": "Дар ҳоли тағйири масири саҳифаҳои вижа",
     "blankpage": "Саҳифаи холӣ",
     "tag-filter": "Филтри [[Special:Tags|барчасбҳо]]:",
index bebd969..8b293a4 100644 (file)
     "nowatchlist": "Dar fehristi pajgirihoi şumo heç mavride nest.",
     "watchlistanontext": "Lutfan baroi muşohida va viroişi fehristi pajgirihoi xud az $1 istifoda kuned.",
     "watchnologin": "Vurud naşuda",
-    "watchnologintext": "Baroi taƣjiri fehristi pajgirihoi xud bojad [[Special:UserLogin|ba sistem vorid şaved]].",
     "addedwatchtext": "In sahifa \"[[:$1]]\" va [[Special:Watchlist|fehristi nazaroti]] Şumo ilova şud.\nDigargunihoi ojandai in sahifa va sahifi bahsi aloqamand dar rūixati onço xohad şud,\nva sahifa '''ƣafs''' dar [[Special:RecentChanges|rūixati taƣjiroti oxirin]] baroi bo osoni darjoft kardan xohad ba nazar rasid.\n\nAgar şumo dertar az fehristi nazarotaton in sahifaro hazv kardan xohed, dar menju \"Nazar nakardan\"-ro paxş kuned.",
     "removedwatchtext": "Sahifai \"[[:$1]]\" az [[Special:Watchlist|fehristi pajgirihoi şumo]] bardoşta şud.",
     "watch": "Nazar kardan",
     "allmessagesname": "Nom",
     "allmessagesdefault": "Matni qarordodī",
     "allmessagescurrent": "Matni kununī",
-    "allmessagestext": "In fehristi pajomhoi sistemaviji dastras dar fazoi nomi MediaWiki meboşad.\nAgar majli hissaguzorī kardanro ba mahallikunoniji MediaWiki dored, pas lutan sahifahoi [https://www.mediawiki.org/wiki/Localisation Mahallikunoniji MediaWiki] va [//translatewiki.net translatewiki.net] nigared.",
+    "allmessagestext": "In fehristi pajomhoi sistemaviji dastras dar fazoi nomi MediaWiki meboşad.\nAgar majli hissaguzorī kardanro ba mahallikunoniji MediaWiki dored, pas lutan sahifahoi [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation Mahallikunoniji MediaWiki] va [//translatewiki.net translatewiki.net] nigared.",
     "allmessagesnotsupportedDB": "Az in sahifa nametavon istifoda burd, cun '''$wgUseDatabaseMessages''' ƣajrifa'ol gardonida şudaast.",
     "allmessages-filter-legend": "Filtr",
     "allmessages-filter-all": "Hama",
index 40794a1..2c98775 100644 (file)
     "tog-hidepatrolled": "ซ่อนการแก้ไขที่ตรวจแล้วในหน้าปรับปรุงล่าสุด",
     "tog-newpageshidepatrolled": "ซ่อนหน้าที่ตรวจแล้วจากรายการหน้าใหม่",
     "tog-extendwatchlist": "ขยายรายการเฝ้าดูให้แสดงการเปลี่ยนแปลงทั้งหมด ไม่เพียงการเปลี่ยนแปลงล่าสุด",
-    "tog-usenewrc": "à¸\88ัà¸\94à¸\81ลุà¹\88มà¸\84วามเปลี่ยนแปลงแบ่งตามหน้าในรายการปรับปรุงล่าสุดและรายการเฝ้าดู",
+    "tog-usenewrc": "à¸\88ัà¸\94à¸\81ลุà¹\88มà¸\81ารเปลี่ยนแปลงแบ่งตามหน้าในรายการปรับปรุงล่าสุดและรายการเฝ้าดู",
     "tog-numberheadings": "ใส่เลขหัวข้อในสารบัญอัตโนมัติ",
     "tog-showtoolbar": "แสดงแถบเครื่องมือแก้ไข",
     "tog-editondblclick": "แก้ไขหน้าเมื่อดับเบิลคลิก",
-    "tog-editsectiononrightclick": "à¹\80à¸\9bิà¸\94à¹\83à¸\8aà¹\89à¸\87าà¸\99à¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82à¹\80à¸\89à¸\9eาะสà¹\88วà¸\99à¹\82à¸\94ยà¸\84ลิà¸\81à¸\82วาà¸\97ีà¹\88หัวà¸\82à¹\89อ",
+    "tog-editsectiononrightclick": "à¹\80à¸\9bิà¸\94à¹\83à¸\8aà¹\89à¸\87าà¸\99à¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82à¹\80à¸\89à¸\9eาะสà¹\88วà¸\99à¹\82à¸\94ยà¸\84ลิà¸\81à¸\82วาà¸\97ีà¹\88à¸\8aืà¹\88อà¹\80รืà¹\88อà¸\87à¸\82อà¸\87สà¹\88วà¸\99à¸\99ัà¹\89à¸\99",
     "tog-rememberpassword": "จำการล็อกอินของฉันในเบราว์เซอร์นี้ (สูงสุด $1 วัน)",
     "tog-watchcreations": "เพิ่มหน้าที่ฉันสร้างและไฟล์ที่ฉันอัปโหลดเข้ารายการเฝ้าดู",
     "tog-watchdefault": "เพิ่มหน้าและไฟล์ที่ฉันแก้ไขเข้ารายการเฝ้าดู",
     "tog-watchmoves": "เพิ่มและไฟล์ที่ฉันเปลี่ยนชื่อเข้ารายการเฝ้าดู",
     "tog-watchdeletion": "เพิ่มหน้าและไฟล์ที่ฉันลบเข้ารายการเฝ้าดู",
     "tog-minordefault": "กำหนดให้การแก้ไขทุกครั้งเป็นการแก้ไขเล็กน้อยโดยปริยาย",
-    "tog-previewontop": "à¹\81สà¸\94à¸\87à¸\95ัวอยà¹\88าà¸\87à¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82à¸\81à¹\88อนกล่องแก้ไข",
+    "tog-previewontop": "à¹\81สà¸\94à¸\87à¸\95ัวอยà¹\88าà¸\87à¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82à¸\9aนกล่องแก้ไข",
     "tog-previewonfirst": "แสดงตัวอย่างการแก้ไขสำหรับการแก้ไขครั้งแรก",
     "tog-enotifwatchlistpages": "อีเมลหาเมื่อหน้าหรือไฟล์ในรายการเฝ้าดูมีการเปลี่ยนแปลง",
     "tog-enotifusertalkpages": "อีเมลหาเมื่อหน้าคุยกับผู้ใช้ของฉันมีการเปลี่ยนแปลง",
     "tog-diffonly": "ไม่แสดงเนื้อหาใต้ส่วนต่างการแก้ไข",
     "tog-showhiddencats": "แสดงหมวดหมู่ที่ซ่อนอยู่",
     "tog-norollbackdiff": "ไม่แสดงการเปลี่ยนแปลงหลังดำเนินการย้อนกลับฉุกเฉิน",
-    "tog-useeditwarning": "เตือนฉัน เมื่อฉันกำลังจะออกจากหน้าแก้ไขโดยมีข้อมูลที่ยังไม่ได้บันทึก",
+    "tog-useeditwarning": "เตือนฉันเมื่อออกหน้าแก้ไขโดยมีการเปลี่ยนแปลงที่ยังไม่บันทึก",
     "tog-prefershttps": "ใช้การเชื่อมต่อปลอดภัยทุกครั้งเมื่อล็อกอิน",
     "underline-always": "ทุกครั้ง",
     "underline-never": "ไม่",
-    "underline-default": "à¸\84à¹\88าà¹\82à¸\94ยà¸\9bริยายของหน้าตาหรือเบราว์เซอร์",
+    "underline-default": "à¸\84à¹\88าà¸\95ัà¹\89à¸\87à¸\95à¹\89à¸\99ของหน้าตาหรือเบราว์เซอร์",
     "editfont-style": "รูปแบบชุดแบบอักษรในพื้นที่แก้ไข:",
     "editfont-default": "ค่าตั้งต้นของเบราว์เซอร์",
     "editfont-monospace": "ชุดอักษรแบบความกว้างคงที่",
     "category_header": "หน้าในหมวดหมู่ \"$1\"",
     "subcategories": "หมวดหมู่ย่อย",
     "category-media-header": "สื่อในหมวดหมู่ \"$1\"",
-    "category-empty": "''ปัจจุบันหมวดหมู่นี้ไม่มีหน้าหรือสื่อใด''",
+    "category-empty": "<em>ปัจจุบันหมวดหมู่นี้ไม่มีหน้าหรือสื่อใด</em>",
     "hidden-categories": "{{PLURAL:$1|หมวดหมู่ที่ซ่อนอยู่|หมวดหมู่ที่ซ่อนอยู่}}",
     "hidden-category-category": "หมวดหมู่ที่ซ่อนอยู่",
     "category-subcat-count": "{{PLURAL:$2|หมวดหมู่นี้มีหมวดหมู่ย่อยเพียงหมวดหมู่เดียว|หมวดหมู่นี้มี {{PLURAL:$1|หมวดหมู่ย่อย|$1 หมวดหมู่ย่อย}} จากทั้งหมด $2 หมวดหมู่}}",
     "print": "พิมพ์",
     "view": "ดู",
     "edit": "แก้ไข",
+    "edit-local": "แก้ไขคำอธิบายท้องถิ่น",
     "create": "สร้าง",
+    "create-local": "เพิ่มคำอธิบายท้องถิ่น",
     "editthispage": "แก้ไขหน้านี้",
     "create-this-page": "สร้างหน้านี้",
     "delete": "ลบ",
     "currentevents-url": "Project:เหตุการณ์ปัจจุบัน",
     "disclaimers": "ข้อปฏิเสธความรับผิดชอบ",
     "disclaimerpage": "Project:ข้อปฏิเสธความรับผิดชอบทั่วไป",
-    "edithelp": "วิà¸\98ีà¹\81à¸\81à¹\89à¹\84à¸\82หà¸\99à¹\89า",
+    "edithelp": "à¸\84ำอà¸\98ิà¸\9aายà¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82",
     "mainpage": "หน้าหลัก",
     "mainpage-description": "หน้าหลัก",
     "policy-url": "Project:นโยบาย",
     "cannotdelete": "ไม่สามารถลบหน้าหรือไฟล์ \"$1\" \nอาจมีผู้อื่นลบไปแล้ว",
     "cannotdelete-title": "ไม่สามารถลบหน้า ''$1''",
     "delete-hook-aborted": "การลบถูกฮุกยกเลิก\nโดยไม่มีคำอธิบาย",
+    "no-null-revision": "ไม่สามารถสร้างรุ่นว่างใหม่ของหน้า \"$1\"",
     "badtitle": "ใช้ชื่อเรื่องนี้ไม่ได้",
     "badtitletext": "ชื่อหน้าที่ขอไม่ถูกต้อง เป็นชื่อว่าง หรือชื่อข้ามภาษาหรือข้ามวิกิที่เชื่อมโยงไม่ถูกต้อง\nอาจมีอักขระที่ไม่สามารถใช้ในชื่อเรื่องได้",
     "perfcached": "ข้อมูลต่อไปนี้ถูกเก็บในแคช และอาจล้าสมัย มีผลการค้นหาสูงสุด $1 รายการในแคช",
     "accountcreatedtext": "บัญชีผู้ใช้สำหรับ [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|พูดคุย]]) ได้สร้างขึ้นแล้ว",
     "createaccount-title": "สร้างบัญชีสำหรับ {{SITENAME}}",
     "createaccount-text": "มีบางคนสร้างบัญชีโดยใช้ที่อยู่อีเมลของคุณบน {{SITENAME}} ($4) โดยใช้ชื่อ \"$2\" และรหัสผ่าน \"$3\" คุณควรล็อกอินเพื่อเปลี่ยนรหัสผ่านทันที\n\nคุณอาจเพิกเฉยข้อความนี้ หากการสร้างบัญชีนี้เกิดจากความผิดพลาด",
-    "usernamehasherror": "ชื่อผู้ใช้ต้องไม่มีอักขระแฮช",
     "login-throttled": "ที่ผ่านมาคุณพยายามล็อกอินมากครั้งเกินไป\nกรุณารอ $1 ก่อนลองอีกครั้ง",
     "login-abort-generic": "การเข้าสู่ระบบของคุณไม่ประสบความสำเร็จ - ล้มเลิกแล้ว",
     "loginlanguagelabel": "ภาษา: $1",
     "watchthis": "เฝ้าดูหน้านี้",
     "savearticle": "บันทึก",
     "preview": "ตัวอย่าง",
-    "showpreview": "à¹\81สà¸\94à¸\87ตัวอย่าง",
+    "showpreview": "à¸\94ูตัวอย่าง",
     "showlivepreview": "แสดงตัวอย่างทันที",
     "showdiff": "แสดงความเปลี่ยนแปลง",
     "anoneditwarning": "'''คำเตือน:''' คุณมิได้ล็อกอิน เลขที่อยู่ไอพีของคุณจะถูกบันทึกไว้ในประวัติการแก้ไขของหน้านี้",
     "storedversion": "รุ่นที่เก็บไว้",
     "nonunicodebrowser": "'''คำเตือน: เว็บเบราว์เซอร์นี้ไม่สนับสนุนการใช้งานแบบยูนิโคด ตัวอักษรที่ไม่ใช่แบบแอสกีจะแสดงในกล่องการแก้ไขในลักษณะรหัสเลขฐานสิบหก'''",
     "editingold": "'''คำเตือน: ข้อมูลที่แก้ไขอยู่ไม่ใช่ข้อมูลใหม่ล่าสุดของหน้านี้ ถ้าทำการบันทึกไป การเปลี่ยนแปลงที่เกิดขึ้นระหว่างรุ่นนี้กับรุ่นใหม่จะสูญหาย'''",
-    "yourdiff": "à¸\82à¹\89อแตกต่าง",
+    "yourdiff": "à¸\84วามแตกต่าง",
     "copyrightwarning": "โปรดอย่าลืมว่างานเขียนทั้งหมดใน {{SITENAME}} ผู้เขียนทั้งหมดยินดีให้งานเก็บไว้ภายใต้สัญญาลิขสิทธิ์ $2 (ดู $1 สำหรับข้อมูลเพิ่มเติม)\nถ้าคุณไม่ต้องการให้งานของคุณถูกแก้ไข หรือไม่ต้องการให้งานเผยแพร่ตามที่ได้กล่าวไว้ อย่าส่งข้อความเข้ามาที่นี่<br />\nนอกจากนี้แน่ใจว่าข้อความที่ส่งเข้ามาได้เขียนด้วยตัวเอง ไม่ได้คัดลอก หรือทำซ้ำจากแหล่งอื่น\n'''อย่าส่งงานที่มีลิขสิทธิ์เข้ามาก่อนได้รับอนุญาตจากเจ้าของ!'''",
     "copyrightwarning2": "โปรดอย่าลืมว่างานเขียนทั้งหมดใน {{SITENAME}} อาจจะถูกแก้ไข ดัดแปลง หรือลบออกโดยผู้ร่วมเขียนคนอื่น\nถ้าคุณไม่ต้องการให้งานของคุณถูกแก้ไข หรือไม่ต้องการให้งานเผยแพร่ตามที่กล่าวไว้ อย่าส่งข้อความของคุณเข้ามาที่นี่<br />\nนอกจากนี้คุณแน่ใจว่าข้อความที่ส่งเข้ามาคุณได้เขียนด้วยตัวเอง ไม่ได้คัดลอก ทำซ้ำส่วนหนึ่งส่วนใดหรือทั้งหมดจากแหล่งอื่น (ดูรายละเอียดที่ $1)\n'''อย่าส่งงานที่มีลิขสิทธิ์เข้ามาก่อนได้รับอนุญาตจากเจ้าของ!'''",
     "longpageerror": "'''ข้อผิดพลาด: ข้อความที่คุณส่งเข้ามามีขนาด $1 กิโลไบต์\nซึ่งเกินกว่าขนาดสูงสุดซึ่งกำหนดไว้ที่ $2 กิโลไบต์ จึงไม่สามารถบันทึกได้'''",
     "postedit-confirmation": "บันทึกการแก้ไขของคุณแล้ว",
     "edit-already-exists": "ไม่สามารถสร้างหน้าใหม่ได้\nเพราะมีหน้านี้แล้ว",
     "defaultmessagetext": "ข้อความสารโดยปริยาย",
+    "content-failed-to-parse": "แจงส่วนเนื้อหา $2 ของตัวแบบ $1 ล้มเหลว: $3",
     "invalid-content-data": "ข้อมูลเนื้อหาไม่ถูกต้อง",
     "content-not-allowed-here": "เนื้อหา \"$1\" ไม่อนุญาตในหน้า [[$2]]",
     "editwarning-warning": "การออกจากหน้านี้อาจทำให้ความเปลี่ยนแปลงที่คุณดำเนินการสูญหาย\nถ้าคุณล็อกอินแล้ว คุณสามารถปิดคำเตือนนี้ได้ที่ส่วน \"{{int:prefs-editing}}\" ในการตั้งค่าของคุณ",
     "editpage-notsupportedcontentformat-title": "รูปแบบเนื้อหาไม่ได้รับการรองรับ",
+    "editpage-notsupportedcontentformat-text": "ตัวแบบเนื้อหา $2 ไม่รองรับตัวแบบเนื้อหา $1",
     "content-model-wikitext": "ข้อความวิกิ",
     "content-model-text": "ข้อความธรรมดา",
     "content-model-javascript": "จาวาสคริปต์",
     "parser-template-loop-warning": "ตรวจพบแม่แบบกลับมาเรียกตัวเอง: [[$1]]",
     "parser-template-recursion-depth-warning": "เรียกแม่แบบซ้อนหลายชั้นเกินขีดจำกัด ($1)",
     "language-converter-depth-warning": "คำสั่งในการแปลงภาษาลึกเกิน $1 ลำดับ",
+    "expansion-depth-exceeded-category": "หน้าที่ความลึกการขยายเกิน",
+    "expansion-depth-exceeded-warning": "หน้าเกินความลึกการขยาย",
+    "parser-unstrip-loop-warning": "พบวงวน unstrip",
+    "parser-unstrip-recursion-limit": "ขีดจำกัดการเรียกซ้ำ unstrip เกิน ($1)",
     "undo-success": "การแก้ไขนี้สามารถย้อนกลับได้ กรุณาตรวจสอบข้อแตกต่างด้านล่างให้แน่ใจว่านี่คือสิ่งที่คุณต้องการทำ จากนั้นให้บันทึกการเปลี่ยนแปลงด้านล่างเพื่อเสร็จสิ้นขั้นตอน",
     "undo-failure": "การแก้ไขนี้ไม่สามารถย้อนกลับได้ เนื่องจากขัดแย้งกับการแก้ไขปัจจุบัน",
     "undo-norev": "ไม่สามารถย้อนการแก้ไขนี้ เพราะไม่มีหรือถูกลบไปแล้ว",
     "revdelete-no-file": "ไม่มีไฟล์ที่ระบุ",
     "revdelete-show-file-confirm": "คุณแน่ใจที่จะดูรุ่นที่ถูกลบของไฟล์ \"<nowiki>$1</nowiki>\" เมื่อวันที่ $2 เวลา $3 หรือไม่",
     "revdelete-show-file-submit": "ใช่",
+    "revdelete-selected-text": "{{PLURAL:$1|รุ่นที่เลือก}}ของ [[:$2]]:",
+    "revdelete-selected-file": "{{PLURAL:$1|รุ่นไฟล์ที่เลือก}}ของ [[:$2]]:",
     "logdelete-selected": "{{PLURAL:$1|เหตุการณ์ปูมที่เลือก|เหตุการณ์ปูมที่เลือก}} :",
     "revdelete-text-text": "รุ่นที่ถูกลบจะยังปรากฏในประวัติหน้า แต่สาธารณะจะไม่สามารถเข้าถึงเนื้อหาบางส่วนได้",
     "revdelete-text-file": "รุ่นที่ถูกลบจะยังปรากฏในประวัติไฟล์ แต่สาธารณะจะไม่สามารถเข้าถึงเนื้อหาบางส่วนได้",
     "prefs-skin": "หน้าตา",
     "skin-preview": "แสดงตัวอย่าง",
     "datedefault": "ค่าตั้งต้น",
-    "prefs-beta": "คุณลักษณะรุ่นทดสอบ",
-    "prefs-datetime": "วันที่และเวลา",
     "prefs-labs": "คุณสมบัติทดลอง",
     "prefs-user-pages": "หน้าผู้ใช้",
     "prefs-personal": "โพรไฟล์ผู้ใช้",
     "yourrealname": "ชื่อจริง:",
     "yourlanguage": "ภาษา:",
     "yourvariant": "อักษรต่างรูปของเนื้อหา:",
+    "prefs-help-variant": "รูปแปรหรืออักขรวิธีที่คุณเลือกให้แสดงหน้าเนื้อหาของวิกินี้",
     "yournick": "ลายเซ็น:",
     "prefs-help-signature": "ความเห็นในหน้าพูดคุยควรลงลายเซ็นด้วย \"<nowiki>~~~~</nowiki>\" ซึ่งจะถูกแปลงเป็นลายเซ็นของคุณและตราเวลา",
     "badsig": "ลายเซ็นดิบไม่ถูกต้อง ให้ตรวจสอบแท็กเอชทีเอ็มแอล",
     "prefs-dateformat": "รูปแบบวันที่และเวลา",
     "prefs-timeoffset": "ส่วนต่างเวลา",
     "prefs-advancedediting": "ตัวเลือกทั่วไป",
+    "prefs-editor": "ตัวแก้ไข",
     "prefs-preview": "การแสดงตัวอย่าง",
     "prefs-advancedrc": "ตัวเลือกขั้นสูง",
     "prefs-advancedrendering": "ตัวเลือกขั้นสูง",
     "prefs-tokenwatchlist": "โทเค็น",
     "prefs-diffs": "ผลต่าง",
     "prefs-help-prefershttps": "การตั้งค่านี้จะมีผลเมื่อคุณล็อกอินครั้งถัดไป",
+    "prefs-tabs-navigation-hint": "แนะนำ: คุณสามารถใช้แป้นลูกศรซ้ายและขวาเพื่อนำทางระหว่างแถบในรายการแถบได้",
     "email-address-validity-valid": "ที่อยู่อีเมลดูถูกต้อง",
     "email-address-validity-invalid": "ป้อนที่อยู่อีเมลที่ถูกต้อง",
     "userrights": "บริหารสิทธิผู้ใช้",
     "upload-permitted": "ชนิดไฟล์ที่อนุญาต: $1",
     "upload-preferred": "ชนิดไฟล์ที่ควรใช้: $1",
     "upload-prohibited": "ชนิดไฟล์ที่ไม่อนุญาต: $1",
-    "uploadlog": "ปูมการอัปโหลด",
     "uploadlogpage": "ปูมการอัปโหลด",
     "uploadlogpagetext": "ด้านล่างเป็นรายการการอัปโหลดไฟล์ล่าสุด\nดูภาพรวมที่ [[Special:NewFiles|แกลอรีไฟล์ใหม่]]",
     "filename": "ชื่อไฟล์",
     "filereuploadsummary": "เปลี่ยนแปลงไฟล์:",
     "filestatus": "สถานะลิขสิทธิ์:",
     "filesource": "แหล่งที่มา:",
-    "uploadedfiles": "ไฟล์ที่อัปโหลดแล้ว",
     "ignorewarning": "บันทึกไฟล์โดยละเลยคำเตือน",
     "ignorewarnings": "ละเลยคำเตือนทั้งหมด",
     "minlength1": "ชื่อไฟล์ต้องมีตัวอักษรอย่างน้อยหนึ่งตัว",
     "overwroteimage": "อัปโหลดรุ่นใหม่ของ \"[[$1]]\"",
     "uploaddisabled": "ปิดใช้งานการอัปโหลด",
     "copyuploaddisabled": "ปิดใช้งานการอัปโหลดโดยยูอาร์แอล",
-    "uploadfromurl-queued": "การอัปโหลดของคุณถูกจัดคิวแล้ว",
     "uploaddisabledtext": "ปิดใช้งานการอัปโหลดไฟล์",
     "php-uploaddisabledtext": "เปิดการใช้งานการอัปโหลดไฟล์ในพีเอชพี\nกรุณาตรวจสอบการตั้งค่า file_uploads",
     "uploadscripted": "ไฟล์นี้มีส่วนประกอบของโค้ดเอชทีเอ็มแอลหรือสคริปต์ ซึ่งอาจก่อให้เกิดความผิดพลาดในการแสดงผลของเว็บเบราว์เซอร์",
     "upload-misc-error": "เกิดความผิดพลาดในการอัปโหลดโดยไม่ทราบสาเหตุ",
     "upload-misc-error-text": "เกิดความผิดพลาดไม่ทราบสาเหตุระหว่างอัปโหลด กรุณาตรวจสอบว่ายูอาร์แอลนั้นถูกต้องและเข้าถึงได้ และลองอีกครั้ง ถ้ายังมีปัญหา ให้ติดต่อ[[Special:ListUsers/sysop|ผู้ดูแลระบบ]]",
     "upload-too-many-redirects": "ยูอาร์แอลที่ระบุมีการเปลี่ยนทางมากเกินไป",
-    "upload-unknown-size": "ไม่ทราบขนาด",
     "upload-http-error": "เกิดข้อผิดพลาดเอชทีทีพี: $1",
     "upload-copy-upload-invalid-domain": "การอัปโหลดสำเนาไม่สามารถทำได้จากโดเมนนี้",
     "backend-fail-backup": "ไม่สามารถสำรองข้อมูลไฟล์ $1.",
     "img-auth-streaming": "กำลังดึงข้อมูล \"$1\"",
     "img-auth-public": "ฟังก็ชันของ img_auth.php คือเพื่อส่งไฟล์ขาออกจากวิกิส่วนตัว\nวิกินี้ถูกกำหนดเป็นวิกิส่วนตัว\nเพื่อความปลอดภัยสูงสุด img_auth.php จึงถูกปิด",
     "img-auth-noread": "ผู้ใช้ไม่ได้รับสิทธิ์ในการอ่าน \"$1\"",
-    "img-auth-bad-query-string": "ที่อยู่ URL ดังกล่าวมีชุดข้อความสตริงก์ที่ร้องขอไม่ถูกต้อง",
     "http-invalid-url": "ยูอาร์แอลไม่ถูกต้อง: $1",
     "http-invalid-scheme": "ไม่สนับสนุนยูอาร์แอลที่มีรูปแบบ \"$1\"",
     "http-request-error": "คำขอข้อมูล HTTP ผิดพลาดโดยไม่ทราบสาเหตุ",
     "filehist-dimensions": "ขนาด",
     "filehist-filesize": "ขนาดไฟล์",
     "filehist-comment": "ความเห็น",
-    "filehist-missing": "ไฟล์หายไป",
     "imagelinks": "การใช้ไฟล์",
     "linkstoimage": "มี $1 หน้าเชื่อมโยงมายังไฟล์นี้:",
     "linkstoimage-more": "ไฟล์นี้มีหน้าเชื่อมโยงมากว่า $1 หน้า\nรายการต่อไปนี้แสดงการเชื่อมโยง $1 หน้าแรกที่มายังไฟล์นี้เท่านั้น\nดูเพิ่มได้ที่[[Special:WhatLinksHere/$2|รายการเต็ม]]",
     "listgrouprights-removegroup-self": "ลบ{{PLURAL:$2|กลุ่ม|กลุ่ม}}ออกจากบัญชี: $1",
     "listgrouprights-addgroup-self-all": "เพิ่มทุกกลุ่มเข้าไปในบัญชีนี้",
     "listgrouprights-removegroup-self-all": "นำทุกกลุ่มออกจากบัญชีนี้",
+    "hidden-category-category-desc": "นี่คือหมวดหมู่ที่ติด <code><nowiki>__HIDDENCAT__</nowiki></code> ซึ่งป้องกันมิให้แสดงในกล่องลิงก์หมวดหมู่ในหน้าโดยปริยาย",
     "mailnologin": "ไม่มีที่อยู่ส่ง",
     "mailnologintext": "คุณต้อง[[Special:UserLogin|ล็อกอิน]]และมีที่อยู่อีเมลที่สมเหตุสมผลใน[[Special:Preferences|การตั้งค่า]]ของคุณ ในการส่งอีเมลหาผู้ใช้อื่น",
     "emailuser": "ส่งอีเมลหาผู้ใช้นี้",
     "emailuser-title-notarget": "อีเมลผู้ใช้",
     "emailpage": "อีเมลผู้ใช้",
     "emailpagetext": "คุณสามารถใช้แบบด้านล่างส่งอีเมลหา{{GENDER:$1|ผู้ใช้}}นี้\nที่อยู่อีเมลที่คุณกรอกใน[[Special:Preferences|การตั้งค่าส่วนตัวของคุณ]]จะปรากฏเป็นที่อยู่ \"จาก\" ของอีเมล ซึ่งผู้รับสามารถตอบกลับคุณได้โดยตรง",
-    "usermailererror": "การส่งอีเมลผิดพลาด:",
     "defemailsubject": "อีเมล{{SITENAME}}จากผู้ใช้ \"$1\"",
     "usermaildisabled": "ปิดใช้งานการส่งอีเมลหาผู้ใช้",
     "usermaildisabledtext": "คุณไม่สามารถส่งอีเมลหาผู้ใช้อื่นบนวิกินี้",
     "noemailtitle": "ไม่มีที่อยู่อีเมล",
     "noemailtext": "ผู้ใช้คนนี้ระบุที่อยู่อีเมลไม่ถูกต้อง",
-    "nowikiemailtitle": "ไม่อนุญาตให้ใช้อีเมล",
     "nowikiemailtext": "ผู้ใช้คนนี้เลือกไม่รับอีเมลจากผู้ใช้อื่น",
     "emailnotarget": "ไม่มีชื่อผู้ใช้ของผู้รับหรือชื่อผู้ใช้ไม่ถูกต้อง",
     "emailtarget": "กรอกชื่อผู้ใช้ของผู้รับ",
     "nowatchlist": "ไม่มีรายการในรายการเฝ้าดูของคุณ",
     "watchlistanontext": "กรุณา$1เพื่อดูหรือแก้ไขรายการในรายการเฝ้าดูของคุณ",
     "watchnologin": "ยังไม่ได้ล็อกอิน",
-    "watchnologintext": "ต้อง[[Special:UserLogin|ล็อกอิน]]เพื่อแก้ไขรายการเฝ้าดูของคุณ",
     "addwatch": "เพิ่มเข้ารายการเฝ้าดู",
     "addedwatchtext": "หน้า \"[[:$1]]\" ได้เพิ่มลงใน[[Special:Watchlist|รายการเฝ้าดู]]ของคุณแล้ว การเปลี่ยนแปลงในหน้านี้หรือหน้าพูดคุยที่เกี่ยวข้องจะแสดงในรายการดังกล่าว",
     "removewatch": "นำออกจากรายการเฝ้าดู",
     "watching": "เฝ้าดู...",
     "unwatching": "เลิกเฝ้าดู...",
     "watcherrortext": "เกิดข้อผิดพลาดขณะเปลี่ยนแปลงการตั้งค่ารายการเฝ้าดูของคุณ เพราะ \"$1\"",
-    "enotif_mailer": "แจ้งการแก้ไขจาก {{SITENAME}}",
     "enotif_reset": "ทำเครื่องหมายว่าชมทุกหน้าแล้ว",
     "enotif_impersonal_salutation": "ผู้ใช้{{SITENAME}}",
     "enotif_subject_deleted": "หน้า $1 บน {{SITENAME}} ถูกลบโดย {{gender:$2|$2}}",
     "excontent": "เนื้อหาเดิม: '$1'",
     "excontentauthor": "เนื้อหาเดิม: '$1' (และมีผู้เขียนคนเดียวคือ '[[Special:Contributions/$2|$2]]')",
     "exbeforeblank": "เนื้อหาก่อนถูกทำว่างคือ: '$1'",
-    "exblank": "หน้าว่าง",
     "delete-confirm": "ลบ \"$1\"",
     "delete-legend": "ลบ",
     "historywarning": "'''คำเตือน:'''' หน้าที่คุณกำลังลบมีประวัติการแก้ไขประมาณ $1 {{PLURAL:$1|รุ่น}}:",
     "sp-contributions-username": "เลขที่อยู่ไอพีหรือชื่อผู้ใช้:",
     "sp-contributions-toponly": "แสดงเฉพาะการแก้ไขรุ่นล่าสุด",
     "sp-contributions-newonly": "แสดงเฉพาะการแก้ไขที่เป็นการสร้างหน้า",
-    "sp-contributions-submit": "สืà¸\9aà¸\84à¹\89à¸\99",
+    "sp-contributions-submit": "à¸\84à¹\89à¸\99หา",
     "whatlinkshere": "หน้าที่ลิงก์มา",
     "whatlinkshere-title": "หน้าที่ลิงก์มายัง \"$1\"",
     "whatlinkshere-page": "หน้า:",
     "allmessagesname": "ชื่อ",
     "allmessagesdefault": "ข้อความตามค่าตั้งต้น",
     "allmessagescurrent": "ข้อความปัจจุบัน",
-    "allmessagestext": "นี่คือรายการข้อความของระบบที่อยู่ในเนมสเปซมีเดียวิกิ\nกรุณาอ่านหน้า[https://www.mediawiki.org/wiki/Localisation เทศวิวัตน์ของมีเดียวิกิ] และ [//translatewiki.net translatewiki.net] ถ้าคุณอยากที่จะช่วยแปลข้อความของระบบมีเดียวิกิ",
+    "allmessagestext": "นี่คือรายการข้อความของระบบที่อยู่ในเนมสเปซมีเดียวิกิ\nกรุณาอ่านหน้า[https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation เทศวิวัตน์ของมีเดียวิกิ] และ [//translatewiki.net translatewiki.net] ถ้าคุณอยากที่จะช่วยแปลข้อความของระบบมีเดียวิกิ",
     "allmessagesnotsupportedDB": "หน้านี้ไม่สามารถใช้งานได้เนื่องจาก '''$wgUseDatabaseMessages''' ถูกระงับการใช้งาน",
     "allmessages-filter-legend": "กรอง",
     "allmessages-filter": "กรองตามสถานะที่เลือก:",
     "importunknownsource": "ไม่ทราบชนิดของไฟล์นำเข้า",
     "importcantopen": "ไม่สามารถเปิดไฟล์นำเข้าได้",
     "importbadinterwiki": "ลิงก์ข้ามภาษาเสีย",
-    "importnotext": "ไฟล์ว่างหรือไฟล์ไม่มีข้อความ",
     "importsuccess": "นำเข้าไฟล์สำเร็จ!",
-    "importhistoryconflict": "มีประวัติรุ่นขัดแย้งกัน (อาจเคยนำเข้าหน้านี้มาก่อน)",
     "importnosources": "ไม่มีการกำหนดแหล่งนำเข้าข้ามวิกิ และการอัปโหลดประวัติหน้าโดยตรงถูกปิดการใช้งาน",
     "importnofile": "ไฟล์นำเข้าไม่ได้ถูกอัปโหลด",
     "importuploaderrorsize": "อัปโหลดไฟล์ข้อมูลนำเข้าไม่สำเร็จ\nขนาดไฟล์ใหญ่เกินกว่าที่อนุญาตไว้",
     "version-software": "ซอฟต์แวร์ที่ติดตั้ง",
     "version-software-product": "ชื่อ",
     "version-software-version": "รุ่น",
-    "version-entrypoints-articlepath": "[https://www.mediawiki.org/wiki/Manual:$wgArticlePath เส้นทางบทความ]",
-    "version-entrypoints-scriptpath": "[https://www.mediawiki.org/wiki/Manual:$wgScriptPath เส้นทางสคริปต์]",
+    "version-entrypoints-articlepath": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgArticlePath เส้นทางบทความ]",
+    "version-entrypoints-scriptpath": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgScriptPath เส้นทางสคริปต์]",
     "redirect": "การเปลี่ยนทางตามชื่อไฟล์ รหัสประจำผู้ใช้ หน้าหรือรุ่น",
     "redirect-legend": "การเปลี่ยนทางไปยังไฟล์หรือหน้า",
     "redirect-summary": "หน้าพิเศษนี้เปลี่ยนทางไปยังไฟล์ (ระบุเป็นชื่อไฟล์) หน้า (ระบุเป็นรหัสรุ่นหรือรหัสหน้า) หรือหน้าผู้ใช้ (ระบุเป็นรหัสผู้ใช้ตัวเลข) การใช้งาน: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]] หรือ [[{{#Special:Redirect}}/user/101]]",
index f0468a1..4e0f00a 100644 (file)
     "prefs-skin": "Bezeg",
     "skin-preview": "Deslapky syn",
     "datedefault": "Gaýybana",
-    "prefs-beta": "Beta funksiýalar",
     "prefs-datetime": "Sene we wagt",
     "prefs-labs": "Synag funksiýalar",
     "prefs-personal": "Ulanyjy maglumatlary",
     "nowatchlist": "Gözegçilik sanawyňyzda hiçhili sahypa ýok.",
     "watchlistanontext": "Gözegçilik sanawyňyzdaky sahypalary görmek ýa-da redaktirlemek üçin $1.",
     "watchnologin": "Sessiýa açmansyňyz",
-    "watchnologintext": "Gözegçilik sanawyňyzy üýtgetmek üçin [[Special:UserLogin|sessiýa açmagyňyz]] zerurdyr.",
     "addedwatchtext": "[[:$1]]  atly sahypa [[Special:Watchlist|gözegçilik sanawyňyza]] goşuldy.\n\nGeljekde, bu sahypada we degişli çekişme sahypasynda ediljek üýtgeşmeler şu ýerde sanawlanjakdyr.\n\nAňsatlyk bilen saýlap almak üçin bolsa, [[Special:RecentChanges|soňky üýtgeşmeleriň sanawynda]] '''goýy''' harp bilen görkeziljekdir.",
     "removedwatchtext": "\"[[:$1]]\" sahypasy [[Special:Watchlist|gözegçilik sanawyňyzdan]] aýyryldy.",
     "watch": "Gözegçilikde sakla",
     "allmessagesname": "At",
     "allmessagesdefault": "Gaýybana habarlaşyk teksti",
     "allmessagescurrent": "Häzirki habarlaşyk teksti",
-    "allmessagestext": "Bu sanaw MediaWiki at giňişliginde bar bolan ulgam habarlaşyklarynyň sanawydyr.\nUmumy MediaWiki lokalizasiýasyna goşan goşmak isleýän bolsaňyz, [https://www.mediawiki.org/wiki/Localisation MediaWiki lokalizasiýasy] we [//translatewiki.net translatewiki.net] sahypalaryna baryp görmegiňizi haýyş edýäris.",
+    "allmessagestext": "Bu sanaw MediaWiki at giňişliginde bar bolan ulgam habarlaşyklarynyň sanawydyr.\nUmumy MediaWiki lokalizasiýasyna goşan goşmak isleýän bolsaňyz, [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation MediaWiki lokalizasiýasy] we [//translatewiki.net translatewiki.net] sahypalaryna baryp görmegiňizi haýyş edýäris.",
     "allmessagesnotsupportedDB": "'''$wgUseDatabaseMessages''' ýapykdygy zerarly bu sahypany ulanyp bolmaýar.",
     "allmessages-filter-legend": "Filtr",
     "allmessages-filter": "Üýtgediş statusy boýunça filtr:",
index 18859fa..50131bf 100644 (file)
     "prefs-skin": "Pabalat",
     "skin-preview": "Unang tingin",
     "datedefault": "Walang kagustuhan",
-    "prefs-beta": "Mga kaangkapang-katangiang pang-beta",
     "prefs-datetime": "Petsa at oras",
     "prefs-labs": "Mga kasangkapang-katangiang pang-Labs",
     "prefs-user-pages": "Mga pahina ng tagagamit",
     "nowatchlist": "Wala kang pahinang binabantayan.",
     "watchlistanontext": "Paki $1 upang makita o mabago ang mga aytem sa iyong binabantayan.",
     "watchnologin": "Hindi nakalagda",
-    "watchnologintext": "Dapat kang [[Special:UserLogin|nakalagda]] upang mabago ang talaan mo ng mga binabantayan.",
     "addwatch": "Idagdag sa bantayan",
     "addedwatchtext": "Dinagdag na ang pahinang \"[[:$1]]\" sa iyong [[Special:Watchlist|Babantayan]].\nMakikita doon ang lahat ng mga susunod na pagbabago sa pahinang ito pati na ang usapang pahina, at ang pahina ay makikitang sa '''malalaking titik''' ('''''bold''''') sa [[Special:RecentChanges|tala ng mga huling binago]] para madaling makita.",
     "removewatch": "Alisin mula sa bantayan",
     "allmessagesname": "Pangalan",
     "allmessagesdefault": "Tinakdang teksto",
     "allmessagescurrent": "Kasalukuyang teksto",
-    "allmessagestext": "Isa itong talaan ng mga mensahe ng sistema na makukuha mula sa namespace ng MediaWiki.\nPakidalaw ang [https://www.mediawiki.org/wiki/Localisation Lokalisasyong MediaWiki] at [//translatewiki.net translatewiki.net] kung ibig mong magambag sa heneriko o pangkalahatang lokalisasyon ng MediaWiki.",
+    "allmessagestext": "Isa itong talaan ng mga mensahe ng sistema na makukuha mula sa namespace ng MediaWiki.\nPakidalaw ang [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation Lokalisasyong MediaWiki] at [//translatewiki.net translatewiki.net] kung ibig mong magambag sa heneriko o pangkalahatang lokalisasyon ng MediaWiki.",
     "allmessagesnotsupportedDB": "Hindi magagamit ang '''{{ns:special}}:AllMessages''' dahil hindi gumagana ang '''$wgUseDatabaseMessages'''.",
     "allmessages-filter-legend": "Salain",
     "allmessages-filter": "Salain ayon sa katayuan ng pagbabagay:",
     "version-entrypoints": "Mga URL na butas-pasukan",
     "version-entrypoints-header-entrypoint": "Butas na pasukan",
     "version-entrypoints-header-url": "URL",
-    "version-entrypoints-articlepath": "[https://www.mediawiki.org/wiki/Manual:$wgArticlePath Landas ng artikulo]",
-    "version-entrypoints-scriptpath": "[https://www.mediawiki.org/wiki/Manual:$wgScriptPath Landas ng panitik]",
+    "version-entrypoints-articlepath": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgArticlePath Landas ng artikulo]",
+    "version-entrypoints-scriptpath": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgScriptPath Landas ng panitik]",
     "fileduplicatesearch": "Maghanap ng kaparehong mga talaksan",
     "fileduplicatesearch-summary": "Maghanap ng mga kaparehong mga talaksan sa baba ng kanyang halaga ng ''hash''.",
     "fileduplicatesearch-legend": "Maghanap ng mga kapareho",
index 11c903e..151c751 100644 (file)
     "prefs-skin": "Görünüm",
     "skin-preview": "Önizleme",
     "datedefault": "Tercih yok",
-    "prefs-beta": "Beta özellikleri",
     "prefs-datetime": "Tarih ve saat",
     "prefs-labs": "Deneysel özellikler",
     "prefs-user-pages": "Kullanıcı sayfaları",
     "rcshowhidebots-show": "Göster",
     "rcshowhidebots-hide": "Gizle",
     "rcshowhideliu": "Kayıtlı kullanıcıları $1",
-    "rcshowhideliu-show": "Göster",
-    "rcshowhideliu-hide": "Gizle",
+    "rcshowhideliu-show": "göster",
+    "rcshowhideliu-hide": "gizle",
     "rcshowhideanons": "Anonim kullanıcıları $1",
     "rcshowhideanons-show": "Göster",
     "rcshowhideanons-hide": "Gizle",
     "nowatchlist": "İzleme listesinde hiçbir madde bulunmuyor.",
     "watchlistanontext": "Lütfen izleme listenizdeki maddeleri görmek ya da değiştirmek için $1.",
     "watchnologin": "Oturum açık değil.",
-    "watchnologintext": "İzleme listenizi değiştirebilmek için [[Special:UserLogin|oturum açmalısınız]].",
     "addwatch": "İzleme listesine ekle",
     "addedwatchtext": "\"[[:$1]]\" sayfası [[Special:Watchlist|izleme listenize]] eklenmiştir.\nBundan sonra, bu sayfaya ve ilgili tartışma sayfasına yapılacak değişiklikler burada listelenecek.",
     "removewatch": "İzleme listesinden kaldır",
     "sp-contributions-search": "Katkıları ara",
     "sp-contributions-username": "IP adresi veya kullanıcı adı:",
     "sp-contributions-toponly": "Sadece son revizyon olan değişiklikleri göster",
+    "sp-contributions-newonly": "Yalnızca yeni sayfa oluşturan değişiklikleri görüntüle",
     "sp-contributions-submit": "Ara",
     "whatlinkshere": "Sayfaya bağlantılar",
     "whatlinkshere-title": "\"$1\" maddesine bağlantı veren sayfalar",
     "allmessagesname": "Ad",
     "allmessagesdefault": "Varsayılan mesaj metni",
     "allmessagescurrent": "Kullanımdaki metin",
-    "allmessagestext": "Bu liste  MediaWiki ad alanında mevcut olan sistem mesajlarının listesidir.\nGenel MediaWiki yerelleştirmesine katkıda bulunmak isterseniz, lütfen [https://www.mediawiki.org/wiki/Localisation MediaWiki Yerelleştirmesi] ve [//translatewiki.net translatewiki.net] sayfalarını ziyaret edin.",
+    "allmessagestext": "Bu liste  MediaWiki ad alanında mevcut olan sistem mesajlarının listesidir.\nGenel MediaWiki yerelleştirmesine katkıda bulunmak isterseniz, lütfen [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation MediaWiki Yerelleştirmesi] ve [//translatewiki.net translatewiki.net] sayfalarını ziyaret edin.",
     "allmessagesnotsupportedDB": "'''$wgUseDatabaseMessages''' kapalı olduğu için '''{{ns:special}}:Allmessages''' kullanıma açık değil.",
     "allmessages-filter-legend": "Filtre",
     "allmessages-filter": "Özelleştirme durumuna göre filtrele:",
index b185e5b..82fe130 100644 (file)
     "prefs-skin": "Күренеш",
     "skin-preview": "Алдан карау",
     "datedefault": "Баштагы көйләнмәләр",
-    "prefs-beta": "Бета-мөмкинчелекләр",
     "prefs-datetime": "Дата һәм вакыт",
     "prefs-labs": "Сынаулы мөмкинчелекләр",
     "prefs-personal": "Шәхси мәгълүматлар",
     "watchlistfor2": "$1 $2 өчен",
     "nowatchlist": "Күзәтү исемлегегездә битләр юк.",
     "watchnologin": "Кермәдегез",
-    "watchnologintext": "Күзәтү исемлегегезне үзгәртү өчен сез [[Special:UserLogin|керергә]] тиешсез.",
     "addedwatchtext": "\"[[:$1]]\" бите [[Special:Watchlist|күзәтү исемлегегезгә]] өстәлде.\nБу биттә һәм аның бәхәслегендә барлык булачак үзгәртүләр шунда күрсәтелер, һәм, [[Special:RecentChanges|соңгы үзгәртүләр]] исемлегендә бу битне җиңелрәк табу өчен, ул '''калын мәтен''' белән күрсәтелер.",
     "removedwatchtext": "«[[:$1]]» бите [[Special:Watchlist|сезнең күзәтү исемлегеннән]] бетерелде.",
     "watch": "Күзәтү",
     "allmessages": "Система хәбәрләре",
     "allmessagesname": "Исем",
     "allmessagesdefault": "Баштан ук куелган текс",
-    "allmessagestext": "Бу исемлек MediaWiki исемнәр мәйданында булган система хәбәрләренең исемлеге.\nГомуми MediaWiki локализациясендә катнашырга теләсәгез, зинһар [https://www.mediawiki.org/wiki/Localisation MediaWiki Локализациясе] һәм [//translatewiki.net translatewiki.net] сәхифәләрне кулланыгыз.",
+    "allmessagestext": "Бу исемлек MediaWiki исемнәр мәйданында булган система хәбәрләренең исемлеге.\nГомуми MediaWiki локализациясендә катнашырга теләсәгез, зинһар [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation MediaWiki Локализациясе] һәм [//translatewiki.net translatewiki.net] сәхифәләрне кулланыгыз.",
     "allmessages-filter-legend": "Фильтр",
     "allmessages-filter-unmodified": "Үзгәртелмәгән",
     "allmessages-filter-all": "Барысы",
index 7362578..84ebc57 100644 (file)
     "mywatchlist": "Küzätü isemlegem",
     "nowatchlist": "Küzätü isemlegegezdä bitlär yuq.",
     "watchnologin": "Kermädegez",
-    "watchnologintext": "Küzätü isemlegegezne üzgärtü öçen, sez [[Special:UserLogin|kerergä]] tieşsez.",
     "addedwatchtext": "\"[[:$1]]\" bite [[Special:Watchlist|küzätü isemlegegezgä]] östälde.\nBu bittä häm anıñ bäxäslegendä barlıq bulaçaq üzgärtülär şunda kürsäteler, häm, [[Special:RecentChanges|soñğı üzgärtülär]] isemlegendä bu bitne ciñelräk tabu öçen, ul '''qalın mäten''' belän kürsäteler.",
     "removedwatchtext": "«[[:$1]]» bite [[Special:Watchlist|sezneñ küzätü isemlegennän]] beterelde.",
     "watch": "Küzätü",
     "allmessagesname": "İsem",
     "allmessagesdefault": "Töpcay yazma",
     "allmessagescurrent": "Eligi yazma",
-    "allmessagestext": "Bu isemlek MediaWiki isemnär mäydanında bulğan sistema xäbärläreneñ isemlege.\nĞomumi MediaWiki lokalizatsiäsendä qatnaşırğa teläsägez, zinhar [https://www.mediawiki.org/wiki/Localisation MediaWiki Lokalizatsiäse] häm [//translatewiki.net translatewiki.net] säxifälärne qullanığız.",
+    "allmessagestext": "Bu isemlek MediaWiki isemnär mäydanında bulğan sistema xäbärläreneñ isemlege.\nĞomumi MediaWiki lokalizatsiäsendä qatnaşırğa teläsägez, zinhar [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation MediaWiki Lokalizatsiäse] häm [//translatewiki.net translatewiki.net] säxifälärne qullanığız.",
     "allmessages-filter-legend": "Filtr",
     "allmessages-filter-unmodified": "Üzgärtelmägän",
     "allmessages-filter-all": "Barısı",
index d58831b..c2591b8 100644 (file)
     "jumptosearch": "утчан",
     "currentevents": "Выль иворъёс",
     "currentevents-url": "Project:Выль иворъёс",
-    "helppage": "Help:Валэктон",
     "mainpage": "Кутскон бам",
     "mainpage-description": "Кутскон бам",
     "portal": "Сообщество",
index 5c980d6..4be92c9 100644 (file)
     "prefs-skin": "تېرە",
     "skin-preview": "ئالدىن كۆزەت",
     "datedefault": "مايىللىق يوق",
-    "prefs-beta": "سىناق ئىقتىدارلىرى",
     "prefs-datetime": "چېسلا ۋە ۋاقىت",
     "prefs-labs": "تەجرىبە ئىقتىدارلىرى",
     "prefs-user-pages": "ئىشلەتكۈچى بېتى",
     "nowatchlist": "كۆزەت تىزىملىكىڭىز بوش.",
     "watchlistanontext": "$1 كۆزەت تىزىملىكىڭىزنى كۆرۈپ تەھرىرلەڭ.",
     "watchnologin": "تىزىمغا كىرمىدى",
-    "watchnologintext": "سىز [[Special:UserLogin|تىزىمغا كىر]]گەندىلا ئاندىن كۆزەت تىزىملىكىڭىزنى ئۆزگەرتەلەيسىز.",
     "addwatch": "كۆزەت تىزىملىكىگە قوش",
     "addedwatchtext": "\"[[:$1]]\" بېتى [[Special:Watchlist|كۆزەت تىزىملىكى]]ڭىزگە قوشۇلدى.\nكەلگۈسىدە بۇ بەت ۋە ئۇنىڭ مۇنازىرە بېتىگە مۇناسىۋەتلىك ھەر قانداق ئۆزگەرتىش شۇ جايدا كۆرسىتىلدۇ.",
     "removewatch": "كۆزەت تىزىملىكىدىن چىقىرىۋەت",
     "allmessagesname": "ئاتى",
     "allmessagesdefault": "كۆڭۈلدىكى ئۇچۇر تېكستى",
     "allmessagescurrent": "نۆۋەتتىكى ئۇچۇر تېكستى",
-    "allmessagestext": "بۇ جايدا تەڭشىگىلى بولىدىغان ھەممە سىستېما كۆرۈنۈش ئۇچۇرلىرى كۆرسىتىلدى.\nئەگەر ھەقىقىي يەرلەشتۈرۈلگەن MediaWiki غا تۆھپە قوشماقچى بولسىڭىز[https://www.mediawiki.org/wiki/Localisation MediaWiki يەرلىكلەشتۈرۈش] ۋە [//translatewiki.net translatewiki.net] نى زىيارەت قىلىڭ.",
+    "allmessagestext": "بۇ جايدا تەڭشىگىلى بولىدىغان ھەممە سىستېما كۆرۈنۈش ئۇچۇرلىرى كۆرسىتىلدى.\nئەگەر ھەقىقىي يەرلەشتۈرۈلگەن MediaWiki غا تۆھپە قوشماقچى بولسىڭىز[https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation MediaWiki يەرلىكلەشتۈرۈش] ۋە [//translatewiki.net translatewiki.net] نى زىيارەت قىلىڭ.",
     "allmessagesnotsupportedDB": "بۇ بەتنى ئىشلەتكىلى بولمايدۇ، سەۋەبى '''$wgUseDatabaseMessages''' چەكلەنگەن.",
     "allmessages-filter-legend": "سۈزگۈچ",
     "allmessages-filter": "ئىختىيارىچە سۈزگۈچ ھالىتى:",
index 3be5706..eecd5ff 100644 (file)
     "permalink": "Постійне посилання",
     "print": "Друк",
     "view": "Перегляд",
+    "view-foreign": "Переглянути на $1",
     "edit": "Редагувати",
+    "edit-local": "Редагувати локальний опис",
     "create": "Створити",
+    "create-local": "Додати локальний опис",
     "editthispage": "Редагувати цю сторінку",
     "create-this-page": "Створити цю сторінку",
     "delete": "Вилучити",
     "pool-timeout": "Час очікування блокування вичерпано",
     "pool-queuefull": "Сервер запитів заповнений",
     "pool-errorunknown": "Невідома помилка",
+    "pool-servererror": "Служба лічильника пулу недоступна ($1).",
     "aboutsite": "Про {{grammar:accusative|{{SITENAME}}}}",
     "aboutpage": "Project:Про",
     "copyright": "Вміст доступний на умовах $1, якщо не вказано інше.",
     "accountcreatedtext": "Обліковий запис користувача для [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|обговорення]]) був створений.",
     "createaccount-title": "Створення облікового запису для {{SITENAME}}",
     "createaccount-text": "Хтось створив обліковий запис «$2» на сервері проекту {{SITENAME}} ($4) з паролем «$3», зазначивши вашу адресу електронної пошти. Вам слід зайти і змінити пароль.\n\nПроігноруйте дане повідомлення, якщо обліковий запис було створено помилково.",
-    "usernamehasherror": "Ім'я користувача не може містити символу «решітка»",
     "login-throttled": "Ви зробили надто багато спроб ввійти до системи.\nБудь ласка, зачекайте $1 перед повторною спробою.",
     "login-abort-generic": "Не вдалося ввійти до системи",
     "loginlanguagelabel": "Мова: $1",
     "prefs-skin": "Оформлення",
     "skin-preview": "Попередній перегляд",
     "datedefault": "Стандартний",
-    "prefs-beta": "Бета-функції",
-    "prefs-datetime": "Дата й час",
     "prefs-labs": "Експериментальні функції",
     "prefs-user-pages": "Сторінки користувача",
     "prefs-personal": "Особисті дані",
     "upload-permitted": "Дозволені типи файлів: $1.",
     "upload-preferred": "Бажані типи файлів: $1.",
     "upload-prohibited": "Заборонені типи файлів: $1.",
-    "uploadlog": "журнал завантажень",
     "uploadlogpage": "Журнал завантажень",
     "uploadlogpagetext": "Нижче наведено список останніх завантажених файлів.\nГляньте [[Special:NewFiles|галерею нових зображень]] для більш візуального огляду.",
     "filename": "Назва файлу",
     "filereuploadsummary": "Зміни у файлі:",
     "filestatus": "Умови поширення:",
     "filesource": "Джерело:",
-    "uploadedfiles": "Завантажені файли",
     "ignorewarning": "Ігнорувати попередження і зберегти файл",
     "ignorewarnings": "Ігнорувати всі попередження",
     "minlength1": "Назва файлу повинна містити щонайменше одну літеру.",
     "overwroteimage": "завантажив нову версію «[[$1]]»",
     "uploaddisabled": "Завантаження заборонене",
     "copyuploaddisabled": "Завантаження через URL вимкнене.",
-    "uploadfromurl-queued": "Ваше завантаження поставлене в чергу.",
     "uploaddisabledtext": "Можливість завантаження файлів відключена.",
     "php-uploaddisabledtext": "Завантаження файлів вимкнене у налаштуваннях PHP. Будь ласка, перевірте значення file_uploads.",
     "uploadscripted": "Файл містить HTML-код або скрипт, який може неправильно обробитися браузером.",
     "upload-misc-error": "Невідома помилка завантаження",
     "upload-misc-error-text": "Невідома помилка завантаження. Будь-ласка, перевірте, що вказана адреса вірна й спробуйте ще. Якщо проблема виникає знову, зверніться до [[Special:ListUsers/sysop|адміністратора]].",
     "upload-too-many-redirects": "URL містить надто багато перенаправлень",
-    "upload-unknown-size": "Невідомий розмір",
     "upload-http-error": "Відбулася помилка HTTP: $1",
     "upload-copy-upload-invalid-domain": "З цього домену завантаження неможливе.",
     "backend-fail-stream": "Не вдалося транслювати файл $1.",
     "img-auth-streaming": "Потокова передача «$1».",
     "img-auth-public": "Призначенням img_auth.php є добування файлів із закритих вікі.\nЦя вікі налаштована як загальнодоступна.\nДля оптимальної безпеки img_auth.php відключено.",
     "img-auth-noread": "Користувач не має доступу до перегляду \"$1\".",
-    "img-auth-bad-query-string": "URL-адреса містить неправильний рядок запиту.",
     "http-invalid-url": "Неправильний URL: $1",
     "http-invalid-scheme": "URL-адреси схеми \"$1\" не підтримуються",
     "http-request-error": "HTTP-запит не вдався через невідому помилку.",
     "filehist-dimensions": "Розмір об'єкта",
     "filehist-filesize": "Розмір файлу",
     "filehist-comment": "Коментар",
-    "filehist-missing": "Файл відсутній",
     "imagelinks": "Використання файлу",
     "linkstoimage": "{{PLURAL:$1|1=Наступна сторінка посилається|Наступні сторінки посилаються}} на цей файл:",
     "linkstoimage-more": "Більше $1 {{PLURAL:$1|1=сторінки|сторінок}} посилаються на цей файл.\nУ цьому списку {{PLURAL:$1|показане тільки $1 посилання|показані тільки $1 посилання|показані тільки $1 посилань}} на цей файл.\nТакож доступний [[Special:WhatLinksHere/$2|повний список]].",
     "deadendpagestext": "Наступні сторінки не містять посилань на інші сторінки цієї вікі.",
     "protectedpages": "Захищені сторінки",
     "protectedpages-indef": "Тільки безстроково захищені",
-    "protectedpages-summary": "На цій сторінці перераховані сторінки, які на цей момент захищені. Список назв, які захищені від створення див. [[{{#special:ProtectedTitles}}|{{int:protectedtitles}}]].",
+    "protectedpages-summary": "На цій сторінці перераховані сторінки, які на цей момент захищені. Список назв, які захищені від створення див.  [[{{#special:ProtectedTitles}}|{{int:protectedtitles}}]].",
     "protectedpages-cascade": "Тільки каскадний захист",
     "protectedpages-noredirect": "Сховати перенаправлення",
     "protectedpagesempty": "Зараз нема захищених сторінок із зазначеними параметрами",
     "protectedpages-unknown-timestamp": "Невідомо",
     "protectedpages-unknown-performer": "Невідомий користувач",
     "protectedtitles": "Заборонені назви",
-    "protectedtitles-summary": "На цій сторінці перераховані назви, які захищені від створення. Для перегляду списку сторінок, які на цей момент захищені, див. [[{{#special:ProtectedPages}}|{{int:protectedpages}}]].",
+    "protectedtitles-summary": "На цій сторінці перераховані назви, які захищені від створення. Для перегляду списку сторінок, які на цей момент захищені, див.  [[{{#special:ProtectedPages}}|{{int:protectedpages}}]].",
     "protectedtitlesempty": "Зараз нема захищених назв із зазначеними параметрами.",
     "listusers": "Список користувачів",
     "listusers-editsonly": "Показати лише користувачів, які зробили принаймні одне редагування",
     "listgrouprights-removegroup-self": "може вилучати {{PLURAL:$2|1=групу|групи}} зі свого облікового запису: $1",
     "listgrouprights-addgroup-self-all": "Може додавати всі групи до свого облікового запису",
     "listgrouprights-removegroup-self-all": "може вилучати всі групи зі свого облікового запису",
+    "listgrouprights-namespaceprotection-header": "Обмеження простору імен",
+    "listgrouprights-namespaceprotection-namespace": "Простір імен",
+    "listgrouprights-namespaceprotection-restrictedto": "Права, що дозволяють учаснику редагувати",
+    "trackingcategories": "Відстежувані категорії",
+    "trackingcategories-summary": "На цій сторінці перераховані відстежують категорії, які заповнюються автоматично програмним забезпеченням MediaWiki. Їх можна перейменувати, змінивши відповідні системні повідомлення в просторі імен {{ns:8}}.",
+    "trackingcategories-msg": "Відстежувана категорія",
+    "trackingcategories-name": "Ім'я повідомлення",
+    "trackingcategories-desc": "Критерій включення в категорію",
+    "noindex-category-desc": "Сторінка не індексується пошуковими роботами, тому що на ній є «чарівне слово» <code><nowiki>__NOINDEX__</nowiki></code>, і вона знаходиться в просторі імен, де дозволений цей прапор).",
+    "index-category-desc": "На сторінці є «чарівне слово» __INDEX__ (і сторінка знаходиться в просторі імен, де дозволений цей прапор), тому вона індексуються пошуковими роботами в тих випадках, коли цього зазвичай не відбувається.",
+    "post-expand-template-inclusion-category-desc": "Після показу всіх шаблонів розмір сторінки стане більше, ніж <code>$wgMaxArticleSize</code>, тому деякі шаблони не були показані повністю.",
+    "post-expand-template-argument-category-desc": "Після розкриття аргументу шаблона (що-небудь в потрійних фігурних дужках, наприклад, <code>{{{Foo}}})</code>, сторінка стане більше, ніж <code>$wgMaxArticleSize</code>.",
+    "expensive-parserfunction-category-desc": "На сторінці використовується занадто багато ресурсомістких функцій (таких, як <code>#ifexist</code>). Детальніше - на сторінці [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit Manual:$wgExpensiveParserFunctionLimit].",
+    "broken-file-category-desc": "Категорія додається, якщо сторінка містить некоректну файлову посилання (посилання на неіснуючий файл).",
+    "hidden-category-category-desc": "Це категорія з доданою міткою <code><nowiki>__HIDDENCAT__</nowiki></code> в неї, що за замовчуванням запобігає її відображенню на сторінках в розділі категорій.",
+    "trackingcategories-nodesc": "Опис відсутній.",
+    "trackingcategories-disabled": "Категорія вимкнена",
     "mailnologin": "Відсутня адреса для відправки",
     "mailnologintext": "Ви повинні [[Special:UserLogin|ввійти до системи]] і мати підтверджену адресу електронної пошти у ваших [[Special:Preferences|налаштуваннях]], щоб мати змогу надсилати електронну пошту іншим користувачам.",
     "emailuser": "Надіслати листа",
     "emailuser-title-notarget": "Надіслати електронного листа користувачеві",
     "emailpage": "Лист користувачеві",
     "emailpagetext": "Заповнивши наведену нижче форму, можна надіслати повідомлення {{GENDER:$1|цьому користувачу|цій користувачці}}.\nЕлектронна адреса, яку Ви зазначили у [[Special:Preferences|своїх налаштуваннях]], буде зазначена в полі «Від кого» листа, тому одержувач матиме можливість відповісти безпосередньо вам.",
-    "usermailererror": "При відправці повідомлення електронної пошти сталася помилка:",
     "defemailsubject": "{{SITENAME}} - електронний лист від користувача \" $1 \"",
     "usermaildisabled": "Електронне листування між користувачами вимкнене",
     "usermaildisabledtext": "Ви не можете надсилати електронні листи іншим користувачам цієї вікі",
     "noemailtitle": "Відсутня адреса електронної пошти",
     "noemailtext": "Цей користувач не вказав коректної адреси електронної пошти.",
-    "nowikiemailtitle": "Ел. пошти не дозволено",
     "nowikiemailtext": "Цей користувач вирішив не отримувати ел. пошту від інших користувачів.",
     "emailnotarget": "Неіснуюче чи некоректне ім'я одержувача",
     "emailtarget": "Введіть ім'я користувача-одержувача",
     "nowatchlist": "Ваш список спостереження порожній.",
     "watchlistanontext": "Вам необхідно $1, щоб переглянути чи редагувати список спостереження.",
     "watchnologin": "Ви не ввійшли до системи",
-    "watchnologintext": "Ви повинні [[Special:UserLogin|ввійти до системи]], щоб мати можливість змінювати список спостереження.",
     "addwatch": "Додати до списку спостереження",
     "addedwatchtext": "Сторінку «[[:$1]]» додано до вашого [[Special:Watchlist|списку спостереження]].\nПодальші редагування цієї сторінки (та пов'язаної з нею сторінки обговорення) відображатимуться в цьому списку.",
     "removewatch": "Видалити зі списку спостереження",
     "watching": "Додавання до списку спостереження…",
     "unwatching": "Вилучення зі списку спостереження…",
     "watcherrortext": "Сталася помилка при заміні налаштувань списку спостереження для \" $1 \".",
-    "enotif_mailer": "{{SITENAME}} Служба сповіщення поштою",
     "enotif_reset": "Позначити всі сторінки як переглянуті",
     "enotif_impersonal_salutation": "Користувач {{grammar:genitive|{{SITENAME}}}}",
     "enotif_subject_deleted": "Сторінку {{GRAMMAR:genitive|{{SITENAME}}}} «$1» було вилучено {{GENDER:$2|користувачем|користувачкою}} $2",
     "excontent": "зміст: «$1»",
     "excontentauthor": "зміст був: «$1» (єдиний автор: [[Special:Contributions/$2|$2]])",
     "exbeforeblank": "зміст до очистки: «$1»",
-    "exblank": "стаття була порожньою",
     "delete-confirm": "Вилучення «$1»",
     "delete-legend": "Вилучення",
     "historywarning": "'''Попередження:''' Сторінка, яку ви збираєтеся вилучити, має історію редагувань з приблизно $1 {{PLURAL:$1|1=версії|версій}}:",
     "sp-contributions-newbies-sub": "Внесок новачків",
     "sp-contributions-newbies-title": "Внесок з нових облікових записів",
     "sp-contributions-blocklog": "журнал блокувань",
+    "sp-contributions-suppresslog": "вилучений внесок користувача",
     "sp-contributions-deleted": "вилучені редагування користувача",
     "sp-contributions-uploads": "завантаження",
     "sp-contributions-logs": "журнали",
     "sp-contributions-blocked-notice": "Цей користувач наразі заблокований. Останній запис у журналі блокувань такий:",
     "sp-contributions-blocked-notice-anon": "Доступ з цієї IP-адреси зараз заблокований.\nДалі наведено останній запис з журналу блокувань:",
     "sp-contributions-search": "Пошук внеску",
-    "sp-contributions-suppresslog": "вилучений внесок користувача",
     "sp-contributions-username": "IP-адреса або ім'я користувача:",
     "sp-contributions-toponly": "Показувати тільки редагування, що є останніми версіями",
     "sp-contributions-newonly": "Показувати тільки редагування, які є створеннями сторінок",
     "allmessagesname": "Назва",
     "allmessagesdefault": "Стандартний текст",
     "allmessagescurrent": "Поточний текст",
-    "allmessagestext": "Це список усіх системних повідомлень, які доступні в просторі назв «MediaWiki».\nБудь ласка, відвідайте [https://www.mediawiki.org/wiki/Localisation MediaWiki Localisation] і [//translatewiki.net translatewiki.net], якщо ви хочете зробити внесок до спільної локалізації MediaWiki.",
+    "allmessagestext": "Це список усіх системних повідомлень, які доступні в просторі назв «MediaWiki».\nБудь ласка, відвідайте [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation MediaWiki Localisation] і [//translatewiki.net translatewiki.net], якщо ви хочете зробити внесок до спільної локалізації MediaWiki.",
     "allmessagesnotsupportedDB": "Ця сторінка не може використовуватися, оскільки вимкнена опція '''$wgUseDatabaseMessages'''.",
     "allmessages-filter-legend": "Фільтр",
     "allmessages-filter": "Фільтр за внесеними змінами:",
     "importunknownsource": "Невідомий тип імпортованої сторінки",
     "importcantopen": "Неможливо відкрити файл імпорту",
     "importbadinterwiki": "Невірне інтервікі-посилання",
-    "importnotext": "Текст відсутній",
     "importsuccess": "Імпорт виконано!",
-    "importhistoryconflict": "Конфлікт існуючих версій (можливо, цю сторінку вже імпортували)",
     "importnosources": "Не було вибране джерело міжвікі-імпорту, пряме завантаження історії змін вимкнуте.",
     "importnofile": "Файл імпорту не було завантажено.",
     "importuploaderrorsize": "Не вдалося завантажити або імпортувати файл. Розмір файлу перевищує встановлену межу.",
     "version-entrypoints": "URL-адреса точки входу",
     "version-entrypoints-header-entrypoint": "Точка входу",
     "version-entrypoints-header-url": "URL",
-    "version-entrypoints-articlepath": "[https://www.mediawiki.org/wiki/Manual:$wgArticlePath Шлях до статей]",
-    "version-entrypoints-scriptpath": "[https://www.mediawiki.org/wiki/Manual:$wgScriptPath Шлях до скриптів]",
+    "version-entrypoints-articlepath": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgArticlePath Шлях до статей]",
+    "version-entrypoints-scriptpath": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgScriptPath Шлях до скриптів]",
     "redirect": "Перенаправлення за файлом, користувачем, сторінкою або ID версії",
     "redirect-legend": "Перенаправити на файл чи сторінку",
     "redirect-summary": "Ця спеціальна сторінка перенаправляє на файл (за поданою назвою файлу), сторінку (за поданим ID версії або сторінки) або сторінку користувача (за поданим числовим ID користувача). Використання: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]],[[{{#Special:Redirect}}/revision/328429]] або [[{{#Special:Redirect}}/user/101]].",
index 9c71cfa..ff50887 100644 (file)
@@ -1,6 +1,15 @@
 {
     "@metadata": {
-        "authors": []
+        "authors": [
+            "Abdulla",
+            "Akmalzhon",
+            "Casual",
+            "CoderSI",
+            "Lyncos",
+            "Nataev",
+            "Sociologist",
+            "Xexdof"
+        ]
     },
     "tog-underline": "Havolalarning tagiga chizish:",
     "tog-hideminor": "Yangi oʻzgarishlar roʻyxatida kichik tahrirlarni yashirish",
     "privacy": "Maxfiylik siyosati",
     "privacypage": "Project:Maxfiylik siyosati",
     "badaccess": "Ruxsatlilik xatosi",
-    "badaccess-group0": "Siz so'ralgan amallarni bajara olmaysiz",
-    "badaccess-groups": "So'ralgan amallarni kamida $1 {{PLURAL:$2|guruhi|guruhlari}} foydalanuvchilarigina amalga oshirishi mumkin.",
+    "badaccess-group0": "Sizda soʻralgan amallarni bajarish huquqi yoʻq.",
+    "badaccess-groups": "Soʻralgan amallarni kamida $1 {{PLURAL:$2|guruhi|guruhlari}} foydalanuvchilari amalga oshirishi mumkin.",
     "versionrequired": "$1 versiyasidagi MediaWiki talab etiladi",
     "versionrequiredtext": "Bu sahifada ishlash uchun MediaWikining $1-versiyasi talab etiladi.\n[[Special:Version|Dasturiy taʼminot haqida axborot]]ni koʻring.",
     "ok": "OK",
     "searchall": "barchasi",
     "showingresults": "Quyida №'''$2'''dan boshlab {{PLURAL:$1|'''bitta''' natija|'''$1''' ta natija}} koʻrsatilgan.",
     "showingresultsnum": "Quyida №'''$2'''dan boshlab '''$1''' ta {{PLURAL:$1|natija}} ko'rsatildi.",
-    "showingresultsheader": "$4 uchun {{PLURAL:$5|'''$3'''dan '''$1''' natija|'''$3'''dan '''$1 - $2''' natijalar}}",
+    "showingresultsheader": "<strong>$4</strong> uchun jami {{PLURAL:$5|<strong>$3</strong> tadan <strong>$1</strong> ta natija koʻrsatildi|<strong>$3</strong> tadan <strong>$1</strong> — <strong>$2</strong> chi natijalar koʻrsatildi}}",
     "search-nonefound": "Talabga javob beradigan natija topilmadi.",
     "powersearch-legend": "Kengaytirilgan qidiruv",
     "powersearch-ns": "Quyidagi nomfazolardan qidir:",
     "prefs-skin": "Tashqi ko‘rinishi",
     "skin-preview": "Ko‘rib chiqish",
     "datedefault": "Farqi yoʻq",
-    "prefs-beta": "Beta-imkoniyatlar",
-    "prefs-datetime": "Sana va vaqt",
     "prefs-labs": "Tajribaviy imkoniyatlar",
     "prefs-user-pages": "Foydalanuvchi sahifalari",
     "prefs-personal": "Shaxsiy ma’lumotlar",
     "action-edit": "ushbu sahifani tahrirlash",
     "action-move": "bu sahifani koʻchirish",
     "action-move-subpages": "Bu sahifani va uning ostsahifalarini koʻchirish",
+    "action-deletedhistory": "ushbu sahifaning oʻchirilgan tarixini koʻrish",
     "action-sendemail": "elektron xatlar jo'natish",
     "nchanges": "$1 {{PLURAL:$1|oʻzgarish|oʻzgarishlar}}",
     "recentchanges": "Yangi oʻzgarishlar",
     "recentchanges-label-plusminus": "Sahifa vazni qanchaga oʻzgargani (bayt)",
     "recentchanges-legend-heading": "'''Izoh:'''",
     "recentchanges-legend-newpage": "([[Special:NewPages|alohida roʻyxat]])",
-    "rcnotefrom": "Quyida <strong>$2</strong>dan boshlab boʻlgan oʻzgarishlar keltirilgan (<strong>$1</strong>dan koʻp boʻlmaganlari koʻrsatildi).",
-    "rclistfrom": "$1 dan boshlab yangi oʻzgarishlarni koʻrsat.",
+    "rcnotefrom": "Quyida <strong>$2</strong> dan boshlab boʻlgan oʻzgarishlar keltirilgan (<strong>$1</strong> tasi koʻrsatildi).",
+    "rclistfrom": "$3, $2 dan keyingi yangi oʻzgarishlarni koʻrsatish",
     "rcshowhideminor": "Kichik tahrirlarni $1",
+    "rcshowhideminor-show": "koʻrsat",
+    "rcshowhideminor-hide": "yashir",
     "rcshowhidebots": "Botlarni $1",
+    "rcshowhidebots-show": "koʻrsat",
+    "rcshowhidebots-hide": "yashir",
     "rcshowhideliu": "Roʻyxatdan oʻtgan foydalanuvchilarni $1",
+    "rcshowhideliu-show": "koʻrsat",
+    "rcshowhideliu-hide": "yashir",
     "rcshowhideanons": "Anonim foydalanuvchilarni $1",
+    "rcshowhideanons-show": "koʻrsat",
+    "rcshowhideanons-hide": "yashir",
     "rcshowhidepatr": "Tekshirilgan tahrirlarni $1",
+    "rcshowhidepatr-hide": "yashir",
     "rcshowhidemine": "Oʻz tahrirlarimni $1",
+    "rcshowhidemine-show": "koʻrsat",
+    "rcshowhidemine-hide": "yashir",
     "rclinks": "Oxirgi $2 kun ichida sodir boʻlgan $1 ta oʻzgarish koʻrsatildi<br />$3",
     "diff": "farq",
     "hist": "tarix",
     "filereuploadsummary": "Fayldagi oʻzgarishlar:",
     "filestatus": "Tarqatish shartlari:",
     "filesource": "Manba:",
-    "uploadedfiles": "Yuklangan fayllar",
     "ignorewarnings": "Ogohlantirishlarga eʼtibor qilma",
     "uploadedimage": "\"[[$1]]\"ni yukladi",
     "overwroteimage": "\"[[$1]]\"ning yangi versiyasini yukladi",
     "filehist-dimensions": "Oʻlchamlari",
     "filehist-filesize": "Fayl hajmi",
     "filehist-comment": "Izoh",
-    "filehist-missing": "Fayl mavjud emas",
     "imagelinks": "Fayllarga ishoratlar",
     "linkstoimage": "Bu faylga quyidagi {{PLURAL:$1|sahifa|$1 sahifalar}} bogʻlangan:",
     "nolinkstoimage": "Bu faylga bogʻlangan sahifalar yoʻq.",
     "emailuser-title-target": "Ushbu {{GENDER:$1|foydalanuvchi}}ga maktub joʻnatish",
     "emailuser-title-notarget": "Foydalanuvchiga elektron maktub yozish",
     "emailpage": "Foydalanuvchiga maktub",
-    "usermailererror": "Elektron pochta xabarini joʻnatishda xatolik yuz berdi:",
     "defemailsubject": "{{SITENAME}} — $1 tomonidan maktub",
     "usermaildisabled": "Foydalanuvchi elektron pochtasi o‘chirilgan",
     "noemailtitle": "Elektron pochta manzili mavjud emas",
     "noemailtext": "Bu foydalanuvchi e-mail manzil koʻrsatgani yoʻq.",
-    "nowikiemailtitle": "Maktub joʻnatishga ruxsat yoʻq",
     "emailtarget": "Oluvchi ishtirokchining ismini kiriting",
     "emailusername": "Foydalanuvchi nomi:",
     "emailusernamesubmit": "Jo'natish",
     "watchlist-options": "Kuzatuv roʻyxati moslamalari",
     "watching": "Kuzatish...",
     "unwatching": "Kuzatuv ro'yxatidan o'chirish...",
-    "enotif_mailer": "{{SITENAME}} Pochta orqali e'lon qilish xizmati",
     "enotif_reset": "Hammasini koʻrib chiqilgan deb belgilash",
     "enotif_impersonal_salutation": "{{SITENAME}} ishtirokchisi",
     "enotif_subject_deleted": "{{SITENAME}} loyihasining $1 nomli sahifasi foydalanuvchi {{gender:$2|$2}} tomonidan o‘chirildi",
     "deletepage": "Sahifani o'chirish",
     "confirm": "Tasdiqlash",
     "excontent": "tarkibi: \"$1\"",
-    "exblank": "sahifa boʻsh edi",
     "delete-confirm": "$1 — oʻchirish",
     "delete-legend": "O‘chirish",
     "actioncomplete": "Bajarildi",
     "maximum-size": "Eng katta hajm:",
     "pagesize": "(bayt)",
     "restriction-edit": "Tahrirlash",
-    "restriction-move": "Ko'chirish",
+    "restriction-move": "Koʻchirish",
     "restriction-create": "Yaratish",
     "restriction-upload": "Yuklash",
     "restriction-level-sysop": "to'liq himoya",
     "whatlinkshere-prev": "{{PLURAL:$1|oldingi}} $1",
     "whatlinkshere-next": "{{PLURAL:$1|keyingi}} $1",
     "whatlinkshere-links": "← ishoratlar",
-    "whatlinkshere-hideredirs": "$1 qayta yo'naltirishlar",
+    "whatlinkshere-hideredirs": "Qayta yoʻnaltirishlarni $1",
     "whatlinkshere-hidetrans": "$1 kiritmalar",
     "whatlinkshere-hidelinks": "$1 havolalar",
     "whatlinkshere-hideimages": "$1 fayllar uchun havolalar",
     "block-log-flags-nousertalk": "o'zining munozara sahifasini tahrirlay olmaydi",
     "move-page": "$1 — qayta nomlash",
     "move-page-legend": "Sahifani qayta nomlash",
-    "movearticle": "Sahifani qayta nomlash",
+    "movearticle": "Hozirgi nomi:",
     "newtitle": "Yangi nom:",
     "move-watch": "Ushbu sahifani kuzatuv roʻyxatingizga qoʻshish",
     "movepagebtn": "Sahifani koʻchirish",
     "movepage-moved": "'''\"$1\" nomli sahifa \"$2\" nomli sahifaga koʻchirildi'''",
     "movepage-moved-redirect": "Qayta yo‘naltirish yaratildi.",
     "movetalk": "Mos munozara sahifasini qayta nomlash",
+    "move-subpages": "Ostsahifalarni ham qayta nomlash ($1 gacha)",
+    "move-talk-subpages": "Munozara sahifasining ostsahifalarini ham qayta nomlash ($1 gacha)",
     "movelogpage": "Koʻchirish qaydlari",
     "movesubpage": "{{PLURAL:$1|Ostsahifa|Ostsahifalar}}",
     "movesubpagetext": "Ushbu sahifaning $1 ta ostsahifasi bor.",
     "revertmove": "qaytarish",
     "delete_and_move": "O‘chirish va qayta nomlash",
     "delete_and_move_confirm": "Ha, ushbu sahifa o‘chirilsin",
+    "fix-double-redirects": "Oldingi nomga yoʻnaltirishlarni toʻgʻrilash",
+    "move-leave-redirect": "Qayta yoʻnaltirish qoldirish",
     "move-over-sharedrepo": "== Fayl allaqachon mavjud ==\nUmumiy omborda [[:$1]] mavjud. Faylning bu nomga qayta nomlanishi faylning umumiy omborda to‘silishiga olib keladi.",
     "export": "Sahifalar eksporti",
     "export-submit": "Eksport",
index b1d2111..abcc91c 100644 (file)
     "prefs-skin": "Aspeto grafico",
     "skin-preview": "Anteprima",
     "datedefault": "Nissuna preferensa",
-    "prefs-beta": "Funsionałidà beta",
     "prefs-datetime": "Data e ora",
     "prefs-labs": "Funsionałidà de i laboratori",
     "prefs-user-pages": "Pàjine utente",
     "nowatchlist": "No te ghè indicà pagine da tegner d'ocio.",
     "watchlistanontext": "Per vardar e modifegar l'ełenco de i osservati speciałi bisogna $1.",
     "watchnologin": "Acesso mia efetuà",
-    "watchnologintext": "Te ghè prima da far el [[Special:UserLogin|login]] par modificar la to lista de osservati speciali.",
     "addwatch": "Tien d'ocio",
     "addedwatchtext": "Ła pagina \"[[:$1]]\" ła xe stà xontà a ła to [[Special:Watchlist|lista de pàjine da tegner d'ocio]].\nI futuri canbiamenti a sta pàjina e a ła so pàjina de discusion i vegnarà elencai in cheła pàjina là.",
     "removewatch": "Cava da łe tegnùe d'ocio",
     "allmessagesname": "Nome",
     "allmessagesdefault": "Testo predefinìo",
     "allmessagescurrent": "Testo come che el xe desso",
-    "allmessagestext": "Sta quà l'è na lista de tuti i messagi disponibili nel namespace MediaWiki.\nPar piaser visita [https://www.mediawiki.org/wiki/Localisation MediaWiki Localisation] e [//translatewiki.net translatewiki.net] se te voli jutarne par la traduzion del software MediaWiki ne le varie lengue.",
+    "allmessagestext": "Sta quà l'è na lista de tuti i messagi disponibili nel namespace MediaWiki.\nPar piaser visita [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation MediaWiki Localisation] e [//translatewiki.net translatewiki.net] se te voli jutarne par la traduzion del software MediaWiki ne le varie lengue.",
     "allmessagesnotsupportedDB": "'''{{ns:special}}:Allmessages''' no'l xè supportà parché '''$wgUseDatabaseMessages''' no'l xè ativo.",
     "allmessages-filter-legend": "Filtro",
     "allmessages-filter": "Filtra par stato de personalixassion:",
index 53f1e4d..1c7498b 100644 (file)
     "permalink": "Liên kết thường trực",
     "print": "In",
     "view": "Xem",
+    "view-foreign": "Xem trên $1",
     "edit": "Sửa đổi",
+    "edit-local": "Sửa đổi miêu tả địa phương",
     "create": "Tạo",
+    "create-local": "Thêm miêu tả địa phương",
     "editthispage": "Sửa đổi trang này",
     "create-this-page": "Tạo trang này",
     "delete": "Xóa",
     "pool-timeout": "Hết thời gian chờ đợi khóa",
     "pool-queuefull": "Đầy hàng đợi khối ứng dụng (pool queue)",
     "pool-errorunknown": "Lỗi lạ",
+    "pool-servererror": "Dịch vụ chia việc xử lý (pool counter) không có sẵn ($1).",
     "aboutsite": "Giới thiệu {{SITENAME}}",
     "aboutpage": "Project:Giới thiệu",
     "copyright": "Nội dung được phát hành theo $1, ngoại trừ khi có ghi chú khác.",
     "invalidtitle-knownnamespace": "Tựa trang không hợp lệ có không gian tên “$2” và văn bản “$3”",
     "invalidtitle-unknownnamespace": "Tựa trang không hợp lệ có không gian tên số $1 không rõ và văn bản “$2”",
     "exception-nologin": "Chưa đăng nhập",
-    "exception-nologin-text": "Xin vui lòng [[Special:Userlogin|đăng nhập]] để truy cập trang hoặc tác vụ này.",
+    "exception-nologin-text": "Xin vui lòng [[Special:Userlogin|đăng nhập]] để truy cập trang hoặc thực hiện tác vụ này.",
     "exception-nologin-text-manual": "Xin vui lòng $1 để truy cập trang hoặc tác vụ này.",
     "virus-badscanner": "Cấu hình sau: không nhận ra bộ quét virus: ''$1''",
     "virus-scanfailed": "quét thất bại (mã $1)",
     "accountcreatedtext": "Tài khoản thành viên cho [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|thảo luận]]) đã được mở.",
     "createaccount-title": "Tài khoản mới tại {{SITENAME}}",
     "createaccount-text": "Ai đó đã tạo một tài khoản với tên $2 tại {{SITENAME}} ($4). Mật khẩu của \"$2\" là \"$3\". Bạn nên đăng nhập và đổi mật khẩu ngay bây giờ.\n\nXin hãy bỏ qua thông điệp này nếu tài khoản này không phải do bạn tạo ra.",
-    "usernamehasherror": "Tên người dùng không thể chứa dấu rào",
     "login-throttled": "Bạn đã hết quyền thử mật khẩu tài khoản này vì bạn đã nhập sai quá nhiều. Xin hãy đợi $1 rồi hãy thử lại.",
     "login-abort-generic": "Thất bại khi đăng nhập",
     "loginlanguagelabel": "Ngôn ngữ: $1",
     "prefs-skin": "Hình dạng",
     "skin-preview": "Xem trước",
     "datedefault": "Không quan tâm",
-    "prefs-beta": "Tính năng beta",
-    "prefs-datetime": "Ngày tháng",
     "prefs-labs": "Tính năng phòng thí nghiệm",
     "prefs-user-pages": "Trang cá nhân",
     "prefs-personal": "Thông tin cá nhân",
     "upload-permitted": "Các định dạng tập tin được phép tải lên: $1.",
     "upload-preferred": "Các định dạng tập tin nên dùng: $1.",
     "upload-prohibited": "Các định dạng tập tin bị cấm: $1.",
-    "uploadlog": "nhật trình tải lên",
     "uploadlogpage": "Nhật trình tải lên",
     "uploadlogpagetext": "Dưới đây là danh sách các tập tin đã tải lên gần nhất.\nXem [[Special:NewFiles|trang trưng bày các tập tin mới]] để xem trực quan hơn.",
     "filename": "Tên tập tin",
     "filereuploadsummary": "Các thay đổi của tập tin:",
     "filestatus": "Tình trạng bản quyền:",
     "filesource": "Nguồn:",
-    "uploadedfiles": "Tập tin đã tải",
     "ignorewarning": "Bỏ qua cảnh báo và lưu tập tin",
     "ignorewarnings": "Bỏ qua cảnh báo",
     "minlength1": "Tên tập tin phải có ít nhất một ký tự.",
     "overwroteimage": "đã tải lên một phiên bản mới của “[[$1]]”",
     "uploaddisabled": "Chức năng tải lên đã bị khóa.",
     "copyuploaddisabled": "Chức năng tải lên từ địa chỉ URL đã bị tắt.",
-    "uploadfromurl-queued": "Tập tin của bạn đã được xếp vào hàng đợi tải lên.",
     "uploaddisabledtext": "Chức năng tải tập tin đã bị tắt.",
     "php-uploaddisabledtext": "Việc tải tập tin trong PHP đã bị tắt. Xin hãy kiểm tra lại thiết lập file_uploads.",
     "uploadscripted": "Tập tin này có chứa mã HTML hoặc kịch bản có thể khiến trình duyệt web thông dịch sai.",
     "upload-misc-error": "Có lỗi lạ khi tải lên",
     "upload-misc-error-text": "Có lỗi lạ khi tải lên.\nXin hãy xác nhận lại địa chỉ URL là hợp lệ và có thể truy cập được không rồi thử lại lần nữa.\nNếu vẫn còn bị lỗi, xin hãy liên hệ với một [[Special:ListUsers/sysop|bảo quản viên]].",
     "upload-too-many-redirects": "URL có quá nhiều đổi hướng",
-    "upload-unknown-size": "Không rõ kích thước",
     "upload-http-error": "Xảy ra lỗi HTTP: $1",
     "upload-copy-upload-invalid-domain": "Không có sẵn các bản sao tải lên tại tên miền này.",
     "backend-fail-stream": "Không thể gửi luồng tập tin $1.",
     "img-auth-streaming": "Đang truyền “$1”.",
     "img-auth-public": "Chức năng của img_auth.php là xuất tập tin từ wiki cá nhân.\nWiki này được cấu hình là wiki công cộng.\nVì lý do bảo mật, img_auth.php đã bị tắt.",
     "img-auth-noread": "Người dùng không đủ quyền truy cập để đọc “$1”.",
-    "img-auth-bad-query-string": "URL có một chuỗi truy vấn không hợp lệ.",
     "http-invalid-url": "URL không hợp lệ: $1",
     "http-invalid-scheme": "Không hỗ trợ các URL có mô hình “$1”",
     "http-request-error": "Có lỗi lạ khi gửi yêu cầu HTTP.",
     "filehist-dimensions": "Kích cỡ",
     "filehist-filesize": "Kích thước tập tin",
     "filehist-comment": "Miêu tả",
-    "filehist-missing": "Không thấy tập tin",
     "imagelinks": "Các trang sử dụng tập tin",
     "linkstoimage": "{{PLURAL:$1|Trang|$1 trang}} sau có liên kết đến tập tin này:",
     "linkstoimage-more": "Có hơn $1 {{PLURAL:$1|trang|trang}} liên kết đến tập tin này.\nDanh sách dưới đây chỉ hiển thị {{PLURAL:$1|liên kết đầu tiên|$1 liên kết đầu tiên}} đến tập tin này.\nCó [[Special:WhatLinksHere/$2|danh sách đầy đủ ở đây]].",
     "listgrouprights-removegroup-self": "Có thể loại tài khoản của chính mình ra khỏi {{PLURAL:$2|nhóm|các nhóm}}: $1",
     "listgrouprights-addgroup-self-all": "Có thể đưa tài khoản của chính mình vào tất cả các nhóm",
     "listgrouprights-removegroup-self-all": "Có thể loại tài khoản của chính mình ra khỏi tất cả các nhóm",
+    "listgrouprights-namespaceprotection-header": "Hạn chế không gian tên",
+    "listgrouprights-namespaceprotection-namespace": "Không gian tên",
+    "listgrouprights-namespaceprotection-restrictedto": "Quyền cho phép người dùng chỉnh sửa",
+    "trackingcategories": "Thể loại phần mềm",
+    "trackingcategories-summary": "Đây là danh sách các thể loại được phần mềm MediaWiki tự động xếp trang vào. Các tên thể loại được định rõ trong các thông điệp thuộc không gian tên {{ns:8}}.",
+    "trackingcategories-msg": "Thể loại phần mềm",
+    "trackingcategories-name": "Tên thông điệp",
+    "trackingcategories-desc": "Tiêu chuẩn xếp thể loại",
+    "noindex-category-desc": "Trang này không được các robot đánh chỉ mục vì trang có từ thần chú <code><nowiki>__NOINDEX__</nowiki></code> và nằm trong không gian tên cho phép từ thần chú này.",
+    "index-category-desc": "Trang này có từ thần chú <code><nowiki>__INDEX__</nowiki></code> và nằm trong một không gian tên cho phép từ thần chú này, nên được các robot đánh chỉ mục, trong khi bình thường nó không được đánh chỉ mục.",
+    "post-expand-template-inclusion-category-desc": "Nếu bung tất cả các bản mẫu, kích thước trang sẽ vượt quá <code>$wgMaxArticleSize</code>, nên một số bản mẫu không được bung.",
+    "post-expand-template-argument-category-desc": "Nếu bung một tham số bản mẫu (tức định danh có mỗi bên ba dấu ngoặc móc, thí dụ <code>{{{Thí dụ}}}</code>), trang này sẽ vượt quá <code>$wgMaxArticleSize</code>.",
+    "expensive-parserfunction-category-desc": "Trang có quá nhiều hàm cú pháp cần mức độ xử lý cao (chẳng hạn như <code>#ifexist</code>). Xem [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit?uselang=vi Manual:$wgExpensiveParserFunctionLimit].",
+    "broken-file-category-desc": "Trang này muốn nhúng một tập tin không tồn tại.",
+    "hidden-category-category-desc": "Thể loại này có <code><nowiki>__HIDDENCAT__</nowiki></code>, nên, theo mặc định, thể loại không xuất hiện trong hộp thể loại trên các trang được xếp vào thể loại.",
+    "trackingcategories-nodesc": "Không có miêu tả.",
+    "trackingcategories-disabled": "Thể loại bị tắt",
     "mailnologin": "Không có địa chỉ gửi thư",
     "mailnologintext": "Bạn phải [[Special:UserLogin|đăng nhập]] và khai báo một địa chỉ thư điện tử hợp lệ trong phần [[Special:Preferences|tùy chọn cá nhân]] thì mới gửi được thư cho người khác.",
     "emailuser": "Gửi thư cho người này",
     "emailuser-title-notarget": "Gửi thư cho người dùng",
     "emailpage": "Gửi thư",
     "emailpagetext": "{{GENDER:$1}}Mẫu dưới đây sẽ gửi một bức thư điện tử tới người dùng này.\nĐịa chỉ thư điện tử mà bạn đã cung cấp trong [[Special:Preferences|tùy chọn cá nhân của mình]] sẽ xuất hiện trong phần địa chỉ “Người gửi” của bức thư, do đó người nhận sẽ có thể trả lời trực tiếp cho bạn.",
-    "usermailererror": "Lỗi gửi thư:",
     "defemailsubject": "Thư của người dùng \"$1\" tại {{SITENAME}}",
     "usermaildisabled": "Chức năng gửi thư cho người dùng đã bị tắt.",
     "usermaildisabledtext": "Bạn không thể gửi thư điện tử cho những người dùng khác trên wiki này.",
     "noemailtitle": "Không có địa chỉ nhận thư",
     "noemailtext": "Người này không cung cấp một địa chỉ thư hợp lệ.",
-    "nowikiemailtitle": "Không cho phép thư điện tử",
     "nowikiemailtext": "Thành viên này quyết định không nhận thư từ các thành viên khác.",
     "emailnotarget": "Người nhận không tồn tại hoặc tên hiệu không hợp lệ.",
     "emailtarget": "Nhập tên hiệu của người nhận",
     "nowatchlist": "Danh sách theo dõi của bạn không có gì.",
     "watchlistanontext": "Xin hãy $1 để xem hay sửa đổi các trang được theo dõi.",
     "watchnologin": "Chưa đăng nhập",
-    "watchnologintext": "Bạn phải [[Special:UserLogin|đăng nhập]] mới sửa đổi được danh sách theo dõi.",
     "addwatch": "Thêm vào danh sách theo dõi",
     "addedwatchtext": "Trang “[[:$1]]” đã vào [[Special:Watchlist|danh sách theo dõi]] của bạn.\nNhững sửa đổi đối với trang này và trang thảo luận của nó sẽ được liệt kê ở đấy.",
     "removewatch": "Gỡ khỏi danh sách theo dõi",
     "unwatchthispage": "Ngừng theo dõi",
     "notanarticle": "Không phải trang có nội dung",
     "notvisiblerev": "Phiên bản bị xóa",
-    "watchlist-details": "Bạn đang theo dõi {{PLURAL:$1|$1 trang|$1 trang}}, không kể các trang thảo luận.",
+    "watchlist-details": "Bạn đang theo dõi {{PLURAL:$1}}$1 trang, không kể riêng các trang thảo luận.",
     "wlheader-enotif": "Đã bật thông báo qua thư điện tử.",
     "wlheader-showupdated": "Các trang đã thay đổi kể từ lần cuối bạn xem chúng được in '''đậm'''",
     "watchmethod-recent": "Dưới đây hiện thay đổi mới với các trang theo dõi.",
     "watching": "Đang theo dõi…",
     "unwatching": "Đang ngừng theo dõi…",
     "watcherrortext": "Lỗi xảy ra khi theo dõi hoặc ngừng theo dõi “$1”.",
-    "enotif_mailer": "Thông báo của {{SITENAME}}",
     "enotif_reset": "Đánh dấu đã xem mọi trang",
     "enotif_impersonal_salutation": "thành viên {{SITENAME}}",
     "enotif_subject_deleted": "Trang $1 tại {{SITENAME}} đã được xóa bởi $2.",
     "excontent": "nội dung cũ: “$1”",
     "excontentauthor": "nội dung cũ: “$1” (người viết duy nhất “[[Special:Contributions/$2|$2]]”)",
     "exbeforeblank": "nội dung trước khi tẩy trống: “$1”",
-    "exblank": "trang trắng",
     "delete-confirm": "Xóa “$1”",
     "delete-legend": "Xóa",
     "historywarning": "'''Cảnh báo:''' Trang bạn sắp xóa đã có lịch sử khoảng $1 {{PLURAL:$1|phiên bản|phiên bản}}:",
     "sp-contributions-newbies": "Chỉ hiển thị đóng góp của tài khoản mới",
     "sp-contributions-newbies-sub": "Các thành viên mới",
     "sp-contributions-newbies-title": "Đóng góp của các thành viên mới",
-    "sp-contributions-blocklog": "Nhật trình cấm",
+    "sp-contributions-blocklog": "nhật trình cấm",
+    "sp-contributions-suppresslog": "đóng góp đã bị đàn áp của thành viên",
     "sp-contributions-deleted": "đóng góp đã bị xóa của thành viên",
     "sp-contributions-uploads": "tập tin tải lên",
     "sp-contributions-logs": "nhật trình",
     "sp-contributions-blocked-notice": "Thành viên này hiện đang bị cấm sửa đổi. Nhật trình cấm gần nhất được ghi ở dưới để tiện theo dõi:",
     "sp-contributions-blocked-notice-anon": "Địa chỉ IP này đang bị cấm. Hãy tham khảo mục mới nhất trong nhật trình cấm IP này:",
     "sp-contributions-search": "Tìm kiếm đóng góp",
-    "sp-contributions-suppresslog": "đóng góp đã bị đàn áp của thành viên",
     "sp-contributions-username": "Địa chỉ IP hay tên thành viên:",
     "sp-contributions-toponly": "Chỉ hiện các phiên bản mới nhất",
     "sp-contributions-newonly": "Chỉ hiện các sửa đổi tạo trang",
     "allmessagesname": "Tên thông điệp",
     "allmessagesdefault": "Nội dung mặc định",
     "allmessagescurrent": "Nội dung hiện thời",
-    "allmessagestext": "Đây là toàn bộ thông điệp hệ thống có trong không gian tên MediaWiki.\nMời vào [https://www.mediawiki.org/wiki/Localisation?uselang=vi Địa phương hóa MediaWiki] và [//translatewiki.net/wiki/?uselang=vi translatewiki.net] nếu bạn muốn đóng góp dịch chung cả MediaWiki.",
+    "allmessagestext": "Đây là toàn bộ thông điệp hệ thống có trong không gian tên MediaWiki.\nMời vào [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation?uselang=vi Địa phương hóa MediaWiki] và [//translatewiki.net/wiki/?uselang=vi translatewiki.net] nếu bạn muốn đóng góp dịch chung cả MediaWiki.",
     "allmessagesnotsupportedDB": "Trang này không dùng được vì biến '''$wgUseDatabaseMessages''' đã bị tắt.",
     "allmessages-filter-legend": "Bộ lọc",
     "allmessages-filter": "Lọc theo tình trạng sửa đổi:",
     "importunknownsource": "Không hiểu nguồn trang để nhập vào",
     "importcantopen": "Không có thể mở tập tin để nhập vào",
     "importbadinterwiki": "Liên kết liên wiki sai",
-    "importnotext": "Trang trống hoặc không có nội dung",
     "importsuccess": "Nhập thành công!",
-    "importhistoryconflict": "Có mâu thuẫn trong lịch sử của các phiên bản (trang này có thể đã được nhập vào trước đó)",
     "importnosources": "Không có nguồn nhập giữa wiki và việc nhập lịch sử bị tắt.",
     "importnofile": "Không tải được tập tin nào lên.",
     "importuploaderrorsize": "Không thể tải tập tin nhập trang. Tập tin lớn hơn kích thước cho phép tải lên.",
     "version-entrypoints": "Các URL lối vào",
     "version-entrypoints-header-entrypoint": "Lối vào",
     "version-entrypoints-header-url": "URL",
-    "version-entrypoints-articlepath": "[https://www.mediawiki.org/wiki/Manual:$wgArticlePath?uselang=vi Đường dẫn bài]",
-    "version-entrypoints-scriptpath": "[https://www.mediawiki.org/wiki/Manual:$wgScriptPath?uselang=vi Đường dẫn kịch bản]",
+    "version-entrypoints-articlepath": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgArticlePath?uselang=vi Đường dẫn bài]",
+    "version-entrypoints-scriptpath": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgScriptPath?uselang=vi Đường dẫn kịch bản]",
     "redirect": "Đổi hướng đến tập tin, người dùng, trang, hoặc số phiên bản",
     "redirect-legend": "Đổi hướng đến tập tin hoặc trang",
     "redirect-summary": "Trang đặc biệt này đổi hướng đến một tập tin (theo tên tập tin được cho vào), trang (theo số phiên bản hoặc số trang được cho vào), hoặc trang cá nhân (theo số thành viên). Cách sử dụng: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]], hoặc [[{{#Special:Redirect}}/user/101]].",
     "expand_templates_remove_nowiki": "Bỏ qua thẻ <nowiki> trong kết quả",
     "expand_templates_generate_xml": "Xem cây phân tích XML",
     "expand_templates_generate_rawhtml": "Hiển thị HTML thô",
-    "expand_templates_preview": "Xem trước",
-    "trackingcategories": "Thể loại phần mềm",
-    "trackingcategories-summary": "Đây là danh sách các thể loại được phần mềm MediaWiki tự động xếp trang vào. Các tên thể loại được định rõ trong các thông điệp thuộc không gian tên {{ns:8}}.",
-    "trackingcategories-msg": "Thể loại phần mềm",
-    "trackingcategories-name": "Tên thông điệp",
-    "trackingcategories-desc": "Tiêu chuẩn xếp thể loại",
-    "noindex-category-desc": "Trang này có từ thần chú <nowiki>__NOINDEX__</nowiki> và nằm trong không gian tên cho phép từ thần chú này, nên không được các robot đánh chỉ mục.",
-    "index-category-desc": "Trang này có từ thần chú <nowiki>__INDEX__</nowiki> và nằm trong một không gian tên cho phép từ thần chú này, nên được các robot đánh chỉ mục, trong khi bình thường nó không được đánh chỉ mục.",
-    "post-expand-template-inclusion-category-desc": "Nếu bung tất cả các bản mẫu, kích thước trang sẽ vượt quá $wgMaxArticleSize, nên một số bản mẫu không được bung.",
-    "post-expand-template-argument-category-desc": "Nếu bung một tham số bản mẫu (tức định danh có mỗi bên ba dấu ngoặc móc, thí dụ {{{Thí dụ}}}), trang này sẽ vượt quá $wgMaxArticleSize.",
-    "expensive-parserfunction-category-desc": "Trang có quá nhiều hàm cú pháp cần mức độ xử lý cao (chẳng hạn như #ifexists). Xem [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit?uselang=vi Manual:$wgExpensiveParserFunctionLimit].",
-    "broken-file-category-desc": "Trang này muốn nhúng một tập tin không tồn tại.",
-    "hidden-category-category-desc": "Thể loại này có <nowiki>__HIDDENCAT__</nowiki>, nên, theo mặc định, thể loại không xuất hiện trong hộp thể loại trên các trang được xếp vào thể loại.",
-    "trackingcategories-nodesc": "Không có miêu tả.",
-    "trackingcategories-disabled": "Thể loại bị tắt"
+    "expand_templates_preview": "Xem trước"
 }
index 736e025..5fe1403 100644 (file)
     "nowatchlist": "Labol nosi in galädalised olik.",
     "watchlistanontext": "$1 ad logön u redakön lienis galädaliseda olik",
     "watchnologin": "No enunädon oki",
-    "watchnologintext": "Mutol [[Special:UserLogin|nunädön oli]] büä kanol votükön galädalisedi olik.",
     "addwatch": "Peläükön lä galädalised",
     "addedwatchtext": "Pad: \"[[:$1]]\" peläükon lä [[Special:Watchlist|galädalised]] olik.\nVotükams fütürik pada at, äsi bespikapada onik, polisedons us, e pad popenon '''me tonats dagik'''  in [[Special:RecentChanges|lised votükamas nulik]] ad fasilükön tuvi ona.\n\nIf vilol poso moükön padi de galädalised olik, välolös lä on knopi: „negalädön“.",
     "removewatch": "Pemoükön de galädalised",
     "allmessagesname": "Nem",
     "allmessagesdefault": "Vödem rigädik",
     "allmessagescurrent": "Vödem nuik",
-    "allmessagestext": "Is binon lised sitanunas valik lonöföl in nemaspad: Sitanuns.\nGebolös [https://www.mediawiki.org/wiki/Localisation Topükami ela MediaWiki] ed el [//translatewiki.net translatewiki.net] if vilol keblünön topükame valemik ela MediaWiki.",
+    "allmessagestext": "Is binon lised sitanunas valik lonöföl in nemaspad: Sitanuns.\nGebolös [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation Topükami ela MediaWiki] ed el [//translatewiki.net translatewiki.net] if vilol keblünön topükame valemik ela MediaWiki.",
     "allmessagesnotsupportedDB": "Pad at no kanon pagebön bi el '''$wgUseDatabaseMessages''' penemögükon.",
     "allmessages-filter-legend": "Sul",
     "allmessages-filter-unmodified": "Penevotüköl",
index 3540a7a..581b44d 100644 (file)
     "nowatchlist": "Perräkaemisnimekiri om tühi.",
     "watchlistanontext": "Perräkaemisnimekirä pruukmisõs $1.",
     "watchnologin": "Olõ-i nimega sisse mint",
-    "watchnologintext": "Perräkaemisnimekirä muutmisõs piät [[Special:UserLogin|nimega sisse minemä]].",
     "addedwatchtext": "Lehekülg \"<nowiki>$1</nowiki>\" om pant su [[Special:Watchlist|perräkaemisnimekirjä]]. Edespididseq muutmisõq seo lehe ja tä arotuskülgi pääl pandasõq ritta siin ja [[Special:RecentChanges|viimätside muutmiisi lehe pääl]] tuvvasõq '''paksun kirän'''. Ku tahat taad lehte perräkaemisnimekiräst vällä võttaq, klõpsaq nuppi \"Lõpõdaq perräkaeminõ ärq\".",
     "removedwatchtext": "Leht \"[[:$1]]\" om [[Special:Watchlist|perräkaemisnimekiräst]] maaha võet.",
     "watch": "Kaeq perrä",
     "allmessagesname": "Nimi",
     "allmessagesdefault": "Vaikimiisi tekst",
     "allmessagescurrent": "Parhillanõ tekst",
-    "allmessagestext": "Taan nimekirän ommaq kõik MediaWiki nimeruumi tallitusteedüseq.\nPlease visit [https://www.mediawiki.org/wiki/Localisation MediaWiki Localisation] and [//translatewiki.net translatewiki.net] if you wish to contribute to the generic MediaWiki localisation.",
+    "allmessagestext": "Taan nimekirän ommaq kõik MediaWiki nimeruumi tallitusteedüseq.\nPlease visit [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation MediaWiki Localisation] and [//translatewiki.net translatewiki.net] if you wish to contribute to the generic MediaWiki localisation.",
     "allmessagesnotsupportedDB": "Taad lehte saa-i pruukiq, selle et '''$wgUseDatabaseMessages'''-säädmine om välän.",
     "thumbnail-more": "Suurõndaq",
     "filemissing": "Olõ-i teedüstüt",
index a954501..e3aaa2e 100644 (file)
     "nowatchlist": "Vosse djivêye des pådjes a shuve est vude.",
     "watchlistanontext": "I vs fåt $1 po vey ou candjî les cayets di vosse djivêye des shuvous.",
     "watchnologin": "Vos n' estoz nén elodjî",
-    "watchnologintext": "I vs fåt esse [[Special:UserLogin|elodjî]] po pleur candjî vosse djivêye des pådjes a shuve.",
     "addedwatchtext": "Li pådje «<nowiki>$1</nowiki>» a stî radjoutêye a vosse [[Special:Watchlist|djivêye des pådjes a shuve]].\nTos les candjmints k' i gn årè di cisse pådje chal,\neyet di si pådje di copene, seront håynés chal, eyet li pådje serè metowe e '''cråssès letes'''\nel [[Special:RecentChanges|djivêye des dierins candjmints]] po k' ça soeye pus åjhey por vos del rimårker.\n\nSi vos vloz bodjî l' pådje foû di vosse djivêye des shuvous, clitchîz so «Èn pus shuve li pådje» dins l' bår di menu sol costé.",
     "removedwatchtext": "Li pådje «[[:$1]]» a stî bodjeye foû di vosse djivêye des pådjes a shuve.",
     "watch": "Shuve",
     "allmessagesname": "No del variåve",
     "allmessagesdefault": "Tecse prémetou",
     "allmessagescurrent": "Tecse pol moumint",
-    "allmessagestext": "Çouchal est ene djivêye des messaedjes sistinme k' i gn a dins l' espåce di lomaedje ''MediaWiki:''.\nLoukîz les pådjes sol [https://www.mediawiki.org/wiki/Localisation Locålijhaedje di MediaWiki] et \n[//translatewiki.net/ translatewiki.net] si vos vloz pårticiper avou l' ratournaeje djenerike di MediaWiki.",
+    "allmessagestext": "Çouchal est ene djivêye des messaedjes sistinme k' i gn a dins l' espåce di lomaedje ''MediaWiki:''.\nLoukîz les pådjes sol [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation Locålijhaedje di MediaWiki] et \n[//translatewiki.net/ translatewiki.net] si vos vloz pårticiper avou l' ratournaeje djenerike di MediaWiki.",
     "allmessagesnotsupportedDB": "'''{{ns:special}}:AllMessages''' n' est nén sopoirté paski '''$wgUseDatabaseMessages''' est dismetou.",
     "allmessages-filter-legend": "Passete",
     "allmessages-filter": "Sorlon l' estat d' candjaedje:",
index 7aeec72..60007df 100644 (file)
@@ -6,7 +6,8 @@
             "JinJian",
             "Kaganer",
             "Wiki indio",
-            "לערי ריינהארט"
+            "לערי ריינהארט",
+            "Kolega2357"
         ]
     },
     "tog-underline": "Bagisa ha ilarom an mga sumpay:",
     "prefs-skin": "Panit",
     "skin-preview": "Pahiuna nga pagawas",
     "datedefault": "Waray pinaurog nga karuyag",
-    "prefs-beta": "Beta nga mga nahihigamitan",
     "prefs-datetime": "Pitsa ngan oras",
     "prefs-labs": "Mga labs feature",
     "prefs-user-pages": "Mga pakli hin gumaramit",
     "rollback_short": "Libot-pabalik",
     "rollbacklink": "libot-pabalik",
     "rollbackfailed": "Diri malinamposon an paglibot-pabalik",
+    "revertpage": "Ginpabalik an ginliwat ni [[Special:Contributions/|$2]] ([[User talk:$2|hiruhimangraw]]) ngadto ha urhi nga rebisyon ni [[User:$1|$1]] ngan",
     "sessionfailure-title": "Pakyas an sesyon",
     "protectlogpage": "Talaan han pinasaliporan",
     "protectedarticle": "pinasaliporan \"[[$1]]\"",
     "watchlisttools-view": "Kitaa an mga nanginginlabot nga mga pagbabag-o",
     "watchlisttools-edit": "Kitaa ngan igliwat an talaan han binabantayan",
     "watchlisttools-raw": "Igliwat an hilaw nga talaan han binabantayan",
+    "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|hiruhimangraw]])",
     "duplicate-defaultsort": "'''Pahimatngon:''' An daan-aada nga paglainlain nga piridlitan nga \"$2\" in igsasapaw an durudaan nga daan-aada nga paglainlain nga piridlitan nga \"$1\".",
     "version": "Bersyon",
     "version-specialpages": "Mga pinaurog nga pakli",
index 15355db..4d07e61 100644 (file)
     "permalink": "שטענדיגער לינק",
     "print": "דרוק",
     "view": "באַקוקן",
+    "view-foreign": "באקוקן אויף $1",
     "edit": "רעדאַקטירן",
+    "edit-local": "רעדאקטירן לאקאלע באשרײַבונג",
     "create": "שאַפֿן",
+    "create-local": "צולייגן לאקאלע באשרײַבונג",
     "editthispage": "ענדערן דעם בלאט",
     "create-this-page": "שאַפֿן דעם בלאַט",
     "delete": "אויסמעקן",
     "accountcreatedtext": "די באניצער קאנטע פאר [[{{ns:User}}:$1|$1]] \n([[{{ns:User talk}}:$1|שמועס]])  איז באַשאַפֿן געווארן.",
     "createaccount-title": "קאנטע באשאפֿן אין {{SITENAME}}",
     "createaccount-text": "עמעצער האט באשאפֿן א קאנטע פֿאר אייער ע-פאסט אדרעס אין {{SITENAME}} ($4) מיטן נאמען \"$2\" און  פאסווארט \"$3\". איר דארפט אצינד איינלאגירן און ענדערן דאס פאסווארט.\n\nאיר קענט איגנארירן די מעלדונג, ווען די קאנטע איז באשאפֿן בטעות.",
-    "usernamehasherror": "באַניצער נאמען טאָר נישט אַנטהאַלטן קיין לייטער סימבאל",
     "login-throttled": "איר האט געפרוווט צופֿיל מאל אריינלאגירן.\nזייט אזוי גוט און וואַרט $1 איידער איר פרוווט נאכאמאל.",
     "login-abort-generic": "אײַער ארײַנלאגירונג איז נישט געווען דערפֿאלגרייך—אָפגעשטעלט",
     "loginlanguagelabel": "שפראך: $1",
     "undo-success": "די ענדערונג קען ווערן מבוטל. ביטע נאכקוקן די פארגלייך פון אונטן צו זיין זיכער אז דאס איז וואס איר ווילט טאן, און דערנאך היט-אפ די ענדערונגן פון אונטן צו ענדיגן דאס בטל מאכן די ענדערונג.",
     "undo-failure": "די ענדערונג קען נישט מבוטל ווערן צוליב סתירות מיט צווישנצייטלעכע ענדערונגען.",
     "undo-norev": "ס'איז נישט מעגלעך צוריקקערן די רעדאַקטירונג ווײַל זי עקסיסטירט נישט אדער איז אויסגעמעקט.",
+    "undo-nochange": "אויבערפלעכטלעך איז די רעדאקטירונג שוין געווארן אנולירט.",
     "undo-summary": "זיי מבטל רי-ווערסיע $1 פון [[Special:Contributions/$2|$2]] ([[User talk:$2|רעדן]])",
     "undo-summary-username-hidden": "זײַט מבטל ווערסיע $1 פון א באהאלטענעם באניצער",
     "cantcreateaccounttitle": "מען קען נישט באשאפֿן קאנטע",
     "revdelete-no-file": "די ספעציפֿירטע טעקע עקזיסטירט נישט.",
     "revdelete-show-file-confirm": "צי זענט איר זעכער איר ווילט באַקוקן אַן אויסגעמעקטע רעוויזיע פון דער טעקע \"<nowiki>$1</nowiki>\" פון $2 בשעה $3?",
     "revdelete-show-file-submit": "יא",
+    "revdelete-selected-text": "'''{{PLURAL:$2|אויסדערוויילטע רעוויזיע| אויסדערוויילטע רעוויזיעס}} פון [[:$1]]:'''",
     "logdelete-selected": "{{PLURAL:$1| אויסדערוויילטע לאג אקציע|אויסדערוויילטע לאג אקציעס}}:",
     "revdelete-confirm": "זייט אזוי גוט און באשטעטיקט אז דאס איז טאקע אייער כוונה, אז איר פארשטייט די קאנסעקווענצן, און אז איר טוט דאס לויט  [[{{MediaWiki:Policy-url}}|דער פאליסי]].",
     "revdelete-suppress-text": "אונטערדרוקן זאל בלויז גענוצט ווערן '''נאר''' אין די פאלגנדע פעלער:\n* אינפארמאציע וואס קען זיין מוציא שם רע\n* אויפדעקונג פון פריוואטקייט אינפארמאציע\n*: ''היים אדרעסן, טעלעפאן נומערן, נאציאנאלע אידענטיפיקאציע נומערן, א.א.וו.''",
     "prefs-skin": "סקין",
     "skin-preview": "פארויסדיגע ווייזונג",
     "datedefault": "נישטא קיין פרעפערענץ",
-    "prefs-beta": "בעטאַ אייגנשאַפֿטן",
-    "prefs-datetime": "דאטום און צייט",
     "prefs-labs": "לאַבאראַטאריע מעגלעכקייטן",
     "prefs-user-pages": "באניצער בלעטער",
     "prefs-personal": "באַניצער פראָפֿיל",
     "upload-permitted": "ערלויבטע טעקע טיפן: $1.",
     "upload-preferred": "פרעפֿרירטע טעקע טיפן: $1.",
     "upload-prohibited": "פֿאַרווערענע טעקע טיפן: $1.",
-    "uploadlog": "ארויפלאָדן לאָגבוך",
     "uploadlogpage": "ארויפֿלאדן לאג",
     "uploadlogpagetext": "פֿאָלגנד איז אַ ליסטע פֿון די לעצטע אַרױפֿגעלאָדענע טעקעס.\nזעט די  [[Special:NewFiles|גאלאריע פֿון נײַע טעקעס]] פֿאַר א מער וויזועלע איבערבליק.",
     "filename": "טעקע נאמען",
     "filereuploadsummary": "טעקע ענדערונגען:",
     "filestatus": "קאפירעכט סטאַטוס:",
     "filesource": "מקור:",
-    "uploadedfiles": "ארויפֿגעלאדעטע טעקעס",
     "ignorewarning": "איגנאָרירן ווארענונג און אויפֿהיטן טעקע סיי ווי סיי",
     "ignorewarnings": "איגנארירן וואָרענונגען",
     "minlength1": "א טעקע נאמען מוז האבן כאטש איין אות.",
     "overwroteimage": "אַרויפֿגעלאָדן א נײַע ווערסיע פון \"[[$1]]\"",
     "uploaddisabled": "אַרויפֿלאָדן טעקעס מבוטל",
     "copyuploaddisabled": "ארויפלאדן דורך URL אומאקטיווירט",
-    "uploadfromurl-queued": "אייער ארויפֿלאד איז אין דער רייע.",
     "uploaddisabledtext": "אַרויפֿלאָדן טעקעס נישט דערמעגלעכט.",
     "php-uploaddisabledtext": "אַרויפֿלאָדן טעקעס נישט דערמעגלעכט אין PHP.\nזייט אזוי גוט בודק זיין די file_uploads שטעלונג.",
     "uploadscripted": "די טעקע האט א סקריפט אדער HTML קאד וואס קען ווערן פֿאלש אויסגעטייטשט דורך א בלעטערער",
+    "uploadscriptednamespace": "די SVG טעקע אנטהאלט אן אומלעגאלן נאמענטייל  \"$1\"",
     "uploadvirus": "די טעקע האָט אַ ווירוס! פרטים: <div dir=\"rtl\">$1</div>",
     "upload-source": "מקור טעקע",
     "sourcefilename": "מקור טעקע נאמען:",
     "upload-misc-error": "אומבאַוואוסטער ארויפֿלאָדן גרײַז",
     "upload-misc-error-text": "אן אומבאקאנטער גרייז האט פאסירט בשעת דעם ארויפלאד.\nביטע באשטעטיקט אז דער  URL איז גילטיק און דערגרייכבאר און פרובירט נאכאמאל.\nווען דער פראבלעם בלייבט ווייטער, קאנטאקטירט  א [[Special:ListUsers/sysop|סיסאפ]].",
     "upload-too-many-redirects": "דער URL אַנטהאַלט צופֿיל ווײַטערפֿירונגען.",
-    "upload-unknown-size": "אומוויסנדע גרייס",
     "upload-http-error": "א HTTP גרײַז האט פאַסירט: $1",
     "backend-fail-stream": "קען נישט מאכן שטראמען טעקע $1.",
     "backend-fail-notexists": "נישט פֿאראן די טעקע $1.",
     "img-auth-isdir": "איר פֿארזיכט צוצוטרעטן אן ארכיוו \"$1\".\nנאר טעקע צוטריט איז ערלויבט.",
     "img-auth-streaming": "שטראָמענדיק \"$1\".",
     "img-auth-noread": "באניצער האט נישט קיין דערלויבניש צו ליינען \"$1\".",
-    "img-auth-bad-query-string": "דער URL האט אן אומגילטיק פראגע שנורל.",
     "http-invalid-url": "אומגילטיג URL: $1",
     "http-invalid-scheme": "URL אדרעסן מיט דער \"$1\" סכעמע ווערן נישט געשטיצט.",
     "http-request-error": "HTTP בקשה דורכגעפאלן צוליב אומבאוואוסטער פעלער.",
     "filehist-dimensions": "געמעסטן",
     "filehist-filesize": "טעקע גרייס",
     "filehist-comment": "באמערקונג",
-    "filehist-missing": "טעקע פעלט",
     "imagelinks": "טעקע באַניץ",
     "linkstoimage": "{{PLURAL:$1|דער פאלגנדער בלאט ניצט|די פאלגנדע בלעטער ניצן}} דאס דאזיגע בילד:",
     "linkstoimage-more": "מער ווי $1 {{PLURAL:$1|בלאַט פֿאַרבינדט|בלעטער פֿאַרבינדן}} צו דער דאזיגער טעקע.\nדי פֿאלגנדע ליסטע ווײַזט  {{PLURAL:$1|דעם ערשטן בלאַט לינק|די ערשטע $1 בלאַט לינקען}} צו דער טעקע.\nס'איז פֿאַראַן[[Special:WhatLinksHere/$2|פֿולע רשימה]].",
     "download": "אַראָפלאָדן",
     "unwatchedpages": "בלעטער וואס זענען נישט אויפגעפאסט",
     "listredirects": "ליסטע פון ווײַטערפֿירונגען",
+    "listduplicatedfiles": "ליסטע פון טעקעס מיט דופליקאטן",
     "unusedtemplates": "נישט באניצטע מוסטערן",
     "unusedtemplatestext": "דער בלאט ווײַזט אלע בלעטער אינעם {{ns:template}} נאמענטייל וואס זענען נישט אײַנגעשלאסן אין אן אנדער בלאט. געדענקט צו באקוקן אנדערע בלעטער פאר לינקען צו די מוסטערן איידער איר מעקט זיי אויס.",
     "unusedtemplateswlh": "אנדערע פֿאַרבינדונגען",
     "listgrouprights-removegroup-self": "א§ראָפנעמען {{PLURAL:$2|גרופּע |גרופּעס}} פון אייגענער קאנטע: $1",
     "listgrouprights-addgroup-self-all": "צולייגן אַלע גרופעס צו אייגענער קאנטע",
     "listgrouprights-removegroup-self-all": "אראָפנעמען אַלע גרופעס פֿון אייגענער קאנטע",
+    "listgrouprights-namespaceprotection-namespace": "נאָמענטייל",
     "mailnologin": "נישטא קיין אדרעס צו שיקן",
     "mailnologintext": "איר ברויכט זײַן [[Special:UserLogin|אַרײַנלאגירט]] און האָבן א גילטיגן ע־פאסט אַדרעס אין אײַער [[Special:Preferences|פרעפֿערענצן]] צו שיקן ע־פאסט צו אַנדערע באַניצער.",
     "emailuser": "שיקן ע-פאסט צו דעם באַניצער",
     "emailuser-title-notarget": "שיקן א באניצער ע־פאסט",
     "emailpage": "שיקן ע-פאסט צו באַניצער",
     "emailpagetext": "איר קענט ניצן די פֿארעם אונטן צו שיקן א בליצבריוו צו {{GENDER:$1|דעם דאזיגן באַניצער|דער דאזיגער באַניצערין}}.\nדער ע-פאסט אדרעס וואס איר האט אריינגעלייגט אין [[Special:Preferences| אייערע באַניצער פרעפערנעצן]] וועט זיך ווײַזן כאילו דאס איז געקומען פון דארטן, בכדי צו דערמעגלעכן א תשובה.",
-    "usermailererror": "בליצבריוו האט צוריקגעשיקט א טעות:",
     "defemailsubject": "ע-פאסט פון באַניצער \"$1\" {{SITENAME}}",
     "usermaildisabled": "באַניצער ע־פאסט אומאַקטיוויזירט",
     "usermaildisabledtext": "איר קענט נישט שיקן ע־פאסט צו אנדערע באַניצערס אויף דער דאָזיקער וויקי",
     "noemailtitle": "נישטא קיין אי-מעיל אדרעס",
     "noemailtext": "דער באַניצער האט נישט באשטימט קיין גילטיקן ע-פאסט אדרעס.",
-    "nowikiemailtitle": "קיין ע-פאסט נישט דערלויבט",
     "nowikiemailtext": "דער באַניצער האט געקליבן נישט באַקומען ע־פאסט פֿון אַנדערע באַניצער.",
     "emailnotarget": "נישט־פֿאראן אדער אומגילטיקער באַניצער־נאָמען פאר באַקומער.",
     "emailtarget": "אַרײַנגעבן באַניצער־נאָמען פון באַקומער",
     "nowatchlist": "איר האט נישט קיין שום בלעטער אין אייער אויפפַּאסונג ליסטע.",
     "watchlistanontext": "ביטע $1 כדי צו זען אדער ענדערן בלעטער אין אייער אַכטגעבן ליסטע.",
     "watchnologin": "איר זענט נישט אַרײַנלאגירט",
-    "watchnologintext": "איר דארפֿט זיין [[Special:UserLogin|אריינגלאגירט]] צו מאדיפֿיצירן אייער אויפפַּאסונג־ליסטע.",
     "addwatch": "צולייגן צו דער אויפֿפאַסונג ליסטע",
     "addedwatchtext": "דער בלאט \"[[:$1]]\" איז צוגעלײגט געוואָרן צו אײַער [[Special:Watchlist|אויפֿפאַסונג ליסטע]].\n\nווײַטערע ענדערונגען צו דעם בלאַט און צו זײַן פארבינדענעם רעדן בלאַט וועלן זײַן אויסגערעכנט דארט.",
     "removewatch": "אַראָפּנעמען פון דער אויפֿפאַסונג ליסטע",
     "unwatchthispage": "ענדיגן אויפֿפאַסן",
     "notanarticle": "דאס איז נישט קיין אינהאלט בלאט",
     "notvisiblerev": "די באארבעטונג איז געווארן אויסגעמעקט",
-    "watchlist-details": "{{PLURAL:$1|איין בלאט|$1 בלעטער}} אין אייער אויפֿפאסן ליסטע (נישט רעכענען  רעדן בלעטער).",
+    "watchlist-details": "{{PLURAL:$1|$1 בלאט|$1 בלעטער}} אין אייער אויפֿפאסן ליסטע, נישט רעכענען  רעדן בלעטער.",
     "wlheader-enotif": "ע-פאסט מעלדונג ערמעגליכט.",
     "wlheader-showupdated": "בלעטער געענדערט זײַט אײַער לעצטן וויזיט זען געוויזן '''דיק'''.",
     "watchmethod-recent": "קאנטראלירן לעצטע ענדערונגען פֿאַר אויפֿגעפאַסטע בלעטער",
     "watching": "אויפפאסענדונג…",
     "unwatching": "נעמט אראפ פון אויפפאסונג ליסטע…",
     "watcherrortext": "א גרײַז האט פאסירט ביים ענדערן אײַערע אויפֿפאסן ליסטע אײַנשטעלונגען פֿאר \"$1\".",
-    "enotif_mailer": "נאטיפאקאציע שיקער {{SITENAME}}",
     "enotif_reset": "באַצייכענען אלע בלעטער שוין געזען",
     "enotif_impersonal_salutation": "{{SITENAME}} באַניצער",
     "enotif_subject_deleted": "{{SITENAME}} בלאט $1 איז אויסגעמעקט געווארן דורך {{gender:$2|$2}}",
     "excontent": "אינהאלט געווען: \"$1\"",
     "excontentauthor": "אינהאלט געווען: '$1' (און דער איינציגסטער באארבעטער איז געווען '[[Special:Contributions/$2|$2]]')",
     "exbeforeblank": "אינהאַלט בעפֿאַרן אויסליידיגן איז געווען: \"$1\"",
-    "exblank": "בלאט איז געווען ליידיג",
     "delete-confirm": "אויסמעקן $1",
     "delete-legend": "אויסמעקן",
     "historywarning": "אכטונג – איר גייט אויסמעקן א בלאט וואָס האט א היסטאריע מיט $1 {{PLURAL:$1|ווערסיע|ווערסיעס}}:",
     "allmessagesname": "נאָמען",
     "allmessagesdefault": "גרונטלעכער טעקסט",
     "allmessagescurrent": "איצטיגער טעקסט",
-    "allmessagestext": "אט דאס איז א ליסטע פון אלע סיסטעם מעלדונגען וואס זענען פאראן אין דעם  {{ns:mediawiki}}  נאמענטייל, וואס באדינען דעם אויפהאלט פונעם סייט.\n\nסיסאפן קענען ענדערן די מעלדונגען דורך דרוקן אויפן נאמען פון דער מעלדונג.\n\nביטע באזוכט [https://www.mediawiki.org/wiki/Localisation מעדיעוויקי לאקאליזאציע] און [//translatewiki.net בעטאוויקי] אויב איר ווילט ביישטייערן צו דער גענערישער מעדיעוויקי לאקאליזאציע.",
+    "allmessagestext": "אט דאס איז א ליסטע פון אלע סיסטעם מעלדונגען וואס זענען פאראן אין דעם  {{ns:mediawiki}}  נאמענטייל, וואס באדינען דעם אויפהאלט פונעם סייט.\n\nסיסאפן קענען ענדערן די מעלדונגען דורך דרוקן אויפן נאמען פון דער מעלדונג.\n\nביטע באזוכט [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation מעדיעוויקי לאקאליזאציע] און [//translatewiki.net בעטאוויקי] אויב איר ווילט ביישטייערן צו דער גענערישער מעדיעוויקי לאקאליזאציע.",
     "allmessagesnotsupportedDB": "מען קען זיך נישט באניצן מיט דעם בלאט וויבאלד די $wgUseDatabseMessages איז געווארן בטל.",
     "allmessages-filter-legend": "פילטער",
     "allmessages-filter": "פֿילטערן לויטן סטאטוס פון מעלדונג:",
     "importunknownsource": "אומבאקאנטער  אימפארט טיפ",
     "importcantopen": "נישט געקענט עפֿענען אימפארט טעקע",
     "importbadinterwiki": "שלעכטע אינטערוויקי לינק",
-    "importnotext": "ליידיג אדער נישט קיין טעקסט",
     "importsuccess": "!אימפארט אדורכגעפירט מיט דערפאלג!",
-    "importhistoryconflict": "פאראן א קאנפליקט מיט דער עקזיסטירנדע היסטאריע רעוויזיע (מעגליך אז דער בלאט איז געווארן אימפארטירט שוין פריער)",
     "importnosources": "קיין מקורות פֿאַר צווישן־וויקי אימפארט, און דירעקט היסטאריע אַרויפֿלאָדן איז נישט דערמעגלעכט אַצינד.",
     "importnofile": "קיין אימפארט טעקע איז נישט ארויפֿגעלאדן.",
     "importuploaderrorsize": "אַרויפֿלאָדן פֿון אימפארט טעקע דורכגעפֿאלן.\nדי טעקע איז גרעסער פֿון דער דערלויבטער אַרויפֿלאָדן גרייס.",
index 94b1333..de61292 100644 (file)
     "prefs-skin": "Skin (Àwọ̀)",
     "skin-preview": "Àkọ́yẹ̀wò",
     "datedefault": "Kò sí ìfẹ́ràn",
-    "prefs-beta": "Àwọn ìní Beta",
     "prefs-datetime": "Ọjọ́ọdún àti àkókò",
     "prefs-labs": "Àwọn ìní ibiàdánwò",
     "prefs-user-pages": "Àwọn ojúewé oníṣe",
     "nowatchlist": "Ẹ kò ní ohun kankan nínú ìmójútó yín.",
     "watchlistanontext": "Ẹ jọ̀wọ́ $1 láti wò tàbí ṣàtúnṣe àwọn ohun inú ìmójútó yín.",
     "watchnologin": "Ẹ kò tíì wọlé",
-    "watchnologintext": "Ẹ gbọ́dọ̀ [[Special:UserLogin|wọlè]] láti ṣàtúnṣe ìmójútó yín.",
     "addwatch": "Ìfikún mọ́ ìmójútó",
     "addedwatchtext": "A ti ṣ'àfikún \"[[:$1]]\" sí [[Special:Watchlist|ìmójútó]] yín.\nA óò ṣ'àkójọ àwọn àtúnṣe ọjọ́wajú sí ojúewé yìí àti ojúewé ọ̀rọ̀ rẹ̀ sí bẹ̀.",
     "removewatch": "Ìyọkúrò nínú ìmójútó",
     "allmessagesname": "Orúkọ",
     "allmessagesdefault": "Ìkọ ìránṣẹ́ àtìbẹ̀rẹ̀",
     "allmessagescurrent": "Ìkọ ìránṣẹ́ lọ́wọ́",
-    "allmessagestext": "Èyí ni àtòjọ àwọn ìránṣẹ́ sístẹ́mù tó wà nínú orúkọàyè MediaWiki.\nẸ lọ sí [https://www.mediawiki.org/wiki/Localisation MediaWiki Localisation] àti [//translatewiki.net translatewiki.net] tí ẹ bá fẹ́ kópa nínú ìyèdèpadà ìsiṣẹ́ MediaWiki.",
+    "allmessagestext": "Èyí ni àtòjọ àwọn ìránṣẹ́ sístẹ́mù tó wà nínú orúkọàyè MediaWiki.\nẸ lọ sí [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation MediaWiki Localisation] àti [//translatewiki.net translatewiki.net] tí ẹ bá fẹ́ kópa nínú ìyèdèpadà ìsiṣẹ́ MediaWiki.",
     "allmessagesnotsupportedDB": "Ojúewé yìí kò ṣe é lò nítorípé '''$wgUseDatabaseMessages''' ti jẹ́ dídálẹkun.",
     "allmessages-filter-legend": "Ajọ̀",
     "allmessages-filter": "Ajọ̀ gẹ́gẹ́bí ipò ìṣàyàn:",
index aa64cd4..7e1e9c8 100644 (file)
@@ -14,7 +14,8 @@
             "William915",
             "Wong128hk",
             "Xiaomingyan",
-            "Yfdyh000"
+            "Yfdyh000",
+            "Cwek"
         ]
     },
     "tog-underline": "連結加底線:",
     "accountcreatedtext": "$1嘅戶口起好咗。",
     "createaccount-title": "響{{SITENAME}}度開個新戶口",
     "createaccount-text": "有人響{{SITENAME}}度用咗你個電郵開咗個名叫 \"$2\" 嘅新戶口 ($4),密碼係 \"$3\" 。你應該而家登入,改埋個密碼。\n\n如果個戶口係開錯咗嘅話,你可以唔埋呢篇信。",
-    "usernamehasherror": "用戶名唔可以包含切細字元",
     "login-throttled": "你已經試咗太多次登入動作。請等多一陣再試過。",
     "loginlanguagelabel": "語言:$1",
     "suspicious-userlogout": "你去登出嘅要求已經拒絕咗,因為佢可能由壞咗嘅瀏覽器或者快取代理傳送。",
     "prefs-skin": "畫面",
     "skin-preview": "預覽",
     "datedefault": "冇喜好",
-    "prefs-beta": "試緊嘅特色",
-    "prefs-datetime": "日期同埋時間",
     "prefs-labs": "實驗性嘅特色",
     "prefs-personal": "用戶簡介",
     "prefs-rc": "最近更改",
     "upload-permitted": "准許嘅檔案類型: $1。",
     "upload-preferred": "建議嘅檔案類型: $1。",
     "upload-prohibited": "禁止嘅檔案類型: $1。",
-    "uploadlog": "上載日誌",
     "uploadlogpage": "上載日誌",
     "uploadlogpagetext": "以下係最近檔案上載嘅一覽表。\n睇[[Special:NewFiles|新圖像畫廊]]去睇更詳細嘅總覽。",
     "filename": "檔名",
     "filereuploadsummary": "檔案改變:",
     "filestatus": "版權狀態:",
     "filesource": "來源:",
-    "uploadedfiles": "上載檔案中",
     "ignorewarning": "總要忽略警告同埋儲存檔案",
     "ignorewarnings": "忽略任何警告",
     "minlength1": "檔名必須最少要有一個字。",
     "overwroteimage": "已經上載咗\"[[$1]]\"嘅新版本",
     "uploaddisabled": "上載已停用。",
     "copyuploaddisabled": "由URL嘅上載已經停用。",
-    "uploadfromurl-queued": "你嘅上載已經開始排隊。",
     "uploaddisabledtext": "檔案上載已經停用。",
     "php-uploaddisabledtext": "PHP 檔案上載已經停用。請檢查 file_uploads 設定。",
     "uploadscripted": "呢個檔案包含可能會誤被瀏覽器解釋執行嘅 HTML 或 script 代碼。",
     "upload-misc-error": "未知嘅上載錯誤",
     "upload-misc-error-text": "響上載時發生咗未知嘅錯誤。請確認輸入咗嘅URL係可以訪問嘅,之後再試多一次。如果重有問題嘅話,請聯絡一位[[Special:ListUsers/sysop|管理員]]。",
     "upload-too-many-redirects": "個URL有太多跳轉",
-    "upload-unknown-size": "未知嘅大細",
     "upload-http-error": "一個HTTP錯誤發生咗: $1",
     "backend-fail-notexists": "檔案$1唔存在。",
     "backend-fail-delete": "刪唔到檔案「$1」。",
     "filehist-dimensions": "尺寸",
     "filehist-filesize": "檔案大細",
     "filehist-comment": "註解",
-    "filehist-missing": "檔案遺失",
     "imagelinks": "檔案用途",
     "linkstoimage": "以下嘅$1個頁面連結到呢個檔案:",
     "linkstoimage-more": "多過$1版連過去呢個檔案。\n下面嘅表只係列示咗連去呢個檔案嘅最頭$1版。\n一個[[Special:WhatLinksHere/$2|完整嘅表]]可以提供。",
     "emailuser": "發電郵畀呢位用戶",
     "emailpage": "發電郵畀用戶",
     "emailpagetext": "你可以用下面嘅表去寄一封電郵畀呢位用戶。\n你喺[[Special:Preferences|你嘅用戶喜好設定]]入面填寫嘅電郵地址會出現喺呢封電郵「由」嘅地址度,以便收件人可以回覆到。",
-    "usermailererror": "目標郵件地址返回錯誤:",
     "defemailsubject": "{{SITENAME}} 電郵",
     "usermaildisabled": "用戶電郵已停用",
     "usermaildisabledtext": "你唔可以發送電郵到響呢個wiki度嘅其他用戶",
     "noemailtitle": "無電郵地址",
     "noemailtext": "呢個用戶重未指定一個有效嘅電郵地址。",
-    "nowikiemailtitle": "唔容許電郵",
     "nowikiemailtext": "呢位用戶揀咗唔收其他用戶畀佢嘅電郵。",
     "email-legend": "寄電郵畀另一位{{SITENAME}}用戶",
     "emailfrom": "由:",
     "nowatchlist": "你嘅監視清單度並冇任何項目。",
     "watchlistanontext": "請先$1去睇或者改響你監視清單度嘅項目。",
     "watchnologin": "未登入",
-    "watchnologintext": "你必須先[[Special:UserLogin|登入]]至可以更改你嘅監視清單。",
     "addedwatchtext": "頁面「[[:$1]]」已加入到你嘅[[Special:Watchlist|監視清單]]度。\n呢個頁面以及佢個討論頁以後嘅修改都會列喺嗰度,佢喺[[Special:RecentChanges|最近更改清單]]度會以'''粗體'''顯示,等你可以容易啲睇到佢。",
     "removedwatchtext": "頁面「[[:$1]]」已經喺[[Special:Watchlist|你嘅監視清單]]度刪除。",
     "watch": "監視",
     "watchlist-options": "監視清單選項",
     "watching": "監視緊...",
     "unwatching": "唔再監視緊...",
-    "enotif_mailer": "{{SITENAME}}通知郵遞員",
     "enotif_reset": "將所有頁面標成已視察",
     "enotif_impersonal_salutation": "{{SITENAME}}用戶",
     "enotif_lastvisited": "你上次視察以嚟嘅修改請睇$1。",
     "excontent": "內容係:「$1」",
     "excontentauthor": "內容係:「$1」 (而且唯一嘅貢獻者係「[[Special:Contributions/$2|$2]]」)",
     "exbeforeblank": "喺清空之前嘅內容係:「$1」",
-    "exblank": "頁面之前係空嘅",
     "delete-confirm": "刪除\"$1\"",
     "delete-legend": "刪除",
     "historywarning": "警告:你要刪除嘅頁面有大約$1次嘅修訂:",
     "ipblocklist-submit": "搵",
     "ipblocklist-localblock": "本地封鎖",
     "ipblocklist-otherblocks": "其他{{PLURAL:$1|封鎖|封鎖}}",
-    "infiniteblock": "不設期限",
+    "infiniteblock": "期限",
     "expiringblock": "$1 $2 期滿",
     "anononlyblock": "只限匿名",
     "noautoblockblock": "自動封鎖已經停用",
     "allmessagesname": "名稱",
     "allmessagesdefault": "預設訊息文字",
     "allmessagescurrent": "現時訊息文字",
-    "allmessagestext": "以下係 MediaWiki 空間名入邊現有系統信息嘅清單。\n如果想貢獻正宗嘅MediaWiki本地化嘅話,請參閱[https://www.mediawiki.org/wiki/Localisation MediaWiki本地化]同埋[//translatewiki.net translatewiki.net]。",
+    "allmessagestext": "以下係 MediaWiki 空間名入邊現有系統信息嘅清單。\n如果想貢獻正宗嘅MediaWiki本地化嘅話,請參閱[https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation MediaWiki本地化]同埋[//translatewiki.net translatewiki.net]。",
     "allmessagesnotsupportedDB": "呢一版唔可以用,因為'''$wgUseDatabaseMessages'''已經閂咗。",
     "allmessages-filter-legend": "過濾",
     "allmessages-filter": "以自定狀況過濾:",
     "importunknownsource": "不明嘅倒入來源類型",
     "importcantopen": "唔能夠開個倒入檔案",
     "importbadinterwiki": "壞嘅跨 wiki 連結",
-    "importnotext": "空白或者唔係文字",
     "importsuccess": "已經完成倒入!",
-    "importhistoryconflict": "存在有衝突嘅歷史版本(之前可能曾經倒入過呢頁)",
     "importnosources": "未定義 transwiki 嘅匯入來源,同埋歷史嘅直接上載已經停用。",
     "importnofile": "冇上載到任何要倒入嘅檔案。",
     "importuploaderrorsize": "上載要倒入嘅檔案失敗。個檔案大過可以容許嘅上載大細。",
index 1b9f7c3..3405680 100644 (file)
     "disclaimers": "gangjmingz mienxcwz",
     "disclaimerpage": "Project:Itbuen mienxcwz",
     "edithelp": "Caeuq mungz san-zonz",
-    "helppage": "Help:moegloeg",
     "mainpage": "Yiebdaeuz",
     "mainpage-description": "Yiebdeauz",
     "policy-url": "Project:fuengcim",
diff --git a/languages/i18n/zh-cn.json b/languages/i18n/zh-cn.json
deleted file mode 100644 (file)
index 3eef3dc..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-{
-    "@metadata": {
-        "authors": [
-            "Liangent",
-            "PhiLiP",
-            "Shizhao",
-            "Wong128hk",
-            "Xiaomingyan"
-        ]
-    },
-    "tog-norollbackdiff": "进行回退后略过差异比较",
-    "mytalk": "我的讨论页",
-    "portal": "社区专页",
-    "editing": "正在编辑 $1"
-}
index f207d92..5074f0f 100644 (file)
@@ -72,7 +72,8 @@
             "御坂美琴",
             "燃玉",
             "范",
-            "阿pp"
+            "阿pp",
+            "Hudafu"
         ]
     },
     "tog-underline": "链接下划线:",
     "tog-shownumberswatching": "显示监视用户数",
     "tog-oldsig": "当前签名:",
     "tog-fancysig": "将签名视为维基文本(不自动生成链接)",
-    "tog-uselivepreview": "使用实时预览(验中)",
+    "tog-uselivepreview": "使用实时预览(验中)",
     "tog-forceeditsummary": "未输入编辑摘要时提醒我",
     "tog-watchlisthideown": "隐藏监视列表中的我的编辑",
     "tog-watchlisthidebots": "隐藏监视列表中的机器人编辑",
     "permalink": "永久链接",
     "print": "打印",
     "view": "查看",
+    "view-foreign": "在$1查看",
     "edit": "编辑",
+    "edit-local": "编辑本地说明",
     "create": "创建",
+    "create-local": "添加本地说明",
     "editthispage": "编辑本页",
     "create-this-page": "创建本页",
     "delete": "删除",
     "deletethispage": "删除本页",
     "undeletethispage": "还原本页",
-    "undelete_short": "还原{{PLURAL:$1|$1个编辑}}",
+    "undelete_short": "还原$1次编辑",
     "viewdeleted_short": "查看$1个已被删除的编辑",
     "protect": "保护",
     "protect_change": "更改",
     "pool-timeout": "等待锁超时",
     "pool-queuefull": "请求队列已满",
     "pool-errorunknown": "未知错误",
+    "pool-servererror": "池计数器服务不可用($1)。",
     "aboutsite": "关于{{SITENAME}}",
     "aboutpage": "Project:关于",
     "copyright": "除非另有声明,本网站内容采用$1授权。",
     "privacypage": "Project:隐私权政策",
     "badaccess": "权限错误",
     "badaccess-group0": "你被禁止执行你刚才请求的操作。",
-    "badaccess-groups": "你刚才请求的操作只对属于{{PLURAL:$2|该用户组|这些用户组}}的用户开放:$1",
+    "badaccess-groups": "您刚才请求的操作只对以下$2个用户组开放:$1。",
     "versionrequired": "需要$1版本的MediaWiki",
     "versionrequiredtext": "使用本页需要$1版本的MediaWiki。请见[[Special:Version|版本页面]]。",
     "ok": "确定",
     "sort-descending": "降序",
     "sort-ascending": "升序",
     "nstab-main": "页面",
-    "nstab-user": "用户页",
+    "nstab-user": "用户页",
     "nstab-media": "媒体文件页面",
     "nstab-special": "特殊页面",
     "nstab-project": "项目页面",
     "perfcachedts": "以下是缓存的数据,最后更新于$1。缓存中最多有{{PLURAL:$4|$4条结果}}。",
     "querypage-no-updates": "该页面的更新目前停用。这里的数据不会马上刷新。",
     "viewsource": "查看源代码",
-    "viewsource-title": "查看$1的源代码",
+    "viewsource-title": "查看“$1”的源代码",
     "actionthrottled": "操作被限制",
     "actionthrottledtext": "基于反垃圾的考量,您被限制在短时间内多次重复该操作,但您已超过此上限。请在数分钟后再尝试。",
     "protectedpagetext": "该页面已被保护以防止编辑和其他操作。",
     "viewsourcetext": "您可以查看并复制此页面的源代码:",
-    "viewyourtext": "您可以查看并复制'''您对此页面作出编辑后'''的源代码:",
+    "viewyourtext": "您可以查看并复制<strong>您对此页面作出编辑后</strong>的源代码:",
     "protectedinterface": "该页提供此wiki软件的界面文字,它已被保护以防止恶意修改。\n如欲修改所有wiki的翻译,请到[//translatewiki.net/ translatewiki.net]上的MediaWiki本地化计划。",
     "editinginterface": "'''警告:'''您正在编辑的页面是用于提供软件的界面文字。\n改变此页将影响其他在此wiki上的用户界面外观。\n如欲修改所有wiki的翻译,请到[//translatewiki.net/ translatewiki.net]上的MediaWiki本地化计划。",
     "cascadeprotected": "此页面已被保护,因为这个页面被以下已标注“联锁保护”的{{PLURAL:$1|一个|多个}}被保护页面包含:\n$2",
     "virus-badscanner": "错误的配置:未知的病毒扫描程序:''$1''",
     "virus-scanfailed": "扫描失败(代码 $1)",
     "virus-unknownscanner": "未知的反病毒软件:",
-    "logouttext": "<strong>你现在已经退出登录。</strong>\n\n请注意,某些页面可能在你清除你的浏览器缓存之前,继续显示你处于登录状态。",
+    "logouttext": "<strong>您现在已经退出登录。</strong>\n\n请注意一些页面可能仍然显示您处于登录状态,直到您清空浏览器缓存为止。",
     "welcomeuser": "欢迎,$1!",
     "welcomecreation-msg": "你的账户已创建。请不要忘记更改你的[[Special:Preferences|{{SITENAME}}设置]]。",
     "yourname": "用户名:",
     "userlogin-resetlink": "忘记你的登录信息?",
     "userlogin-resetpassword-link": "忘记密码?",
     "userlogin-helplink2": "登录帮助",
-    "userlogin-loggedin": "已经以{{GENDER:$1|$1}}的身份登录。使用下面的表格以其他用户的身份登录。",
+    "userlogin-loggedin": "已经以{{GENDER:$1|$1}}的身份登录。使用下面的表格以其他用户的身份登录。",
     "userlogin-createanother": "创建另一个账户",
     "createacct-join": "请在下面输入你的信息。",
     "createacct-another-join": "在下方输入新帐户信息。",
     "createacct-email-ph": "请输入你的电子邮件地址",
     "createacct-another-email-ph": "输入电子邮件地址",
     "createaccountmail": "使用一个临时的随机密码并将其发送到指定的电子邮件地址中",
-    "createacct-realname": "真实姓名 (可选)",
+    "createacct-realname": "真实姓名(可选)",
     "createaccountreason": "原因:",
     "createacct-reason": "原因",
     "createacct-reason-ph": "你为什么要创建另一个账户",
     "createacct-submit": "创建你的账户",
     "createacct-another-submit": "创建另一个账户",
     "createacct-benefit-heading": "{{SITENAME}}是由同你一样的人们构筑的。",
-    "createacct-benefit-body1": "{{PLURAL:$1|编辑}}",
-    "createacct-benefit-body2": "$1个页面",
-    "createacct-benefit-body3": "最近{{PLURAL:$1|贡献者}}",
+    "createacct-benefit-body1": "{{PLURAL:$1|编辑}}",
+    "createacct-benefit-body2": "{{PLURAL:$1|页面}}",
+    "createacct-benefit-body3": "最近{{PLURAL:$1|贡献者}}",
     "badretype": "您所输入的密码并不相同。",
     "userexists": "用户名已存在。请使用其他名称。",
     "loginerror": "登录错误",
     "password-login-forbidden": "这个用户名称及密码的使用是被禁止的。",
     "mailmypassword": "重置密码",
     "passwordremindertitle": "{{SITENAME}}的新临时密码",
-    "passwordremindertext": "有人(可能是您,来自IP地址$1)已请求{{SITENAME}}的新密码($4)。\n用户“$2”的一个新临时密码现在已被设置好为“$3”。\n如果这个动作是您所指示的,您便需要立即登录并选择一个新的密码。\n您的临时密码会于$5天内过期。\n\n如果是其他人发出了该请求,或者您已经记起了您的密码并不准备改变它,\n您可以忽略此消息并继续使用您的旧密码。",
+    "passwordremindertext": "有人(可能是您,来自IP地址$1)已请求{{SITENAME}}的新密码($4)。\n用户“$2”的一个新临时密码现在已被设置好为“$3”。\n如果这个动作是您所指示的,您便需要立即登录并选择一个新的密码。\n您的临时密码会于$5天内过期。\n\n如果是其他人发出了该请求,或者您已经记起了您的密码并不准备改变它,您可以忽略此消息并继续使用您的旧密码。",
     "noemail": "用户\"$1\"没有登记电子邮件地址。",
     "noemailcreate": "您需要提供一个有效的电子邮件地址",
     "passwordsent": "用户\"$1\"的新密码已经寄往所登记的电子邮件地址。\n请在收到后再登录。",
     "throttled-mailpassword": "密码提醒已在最近$1小时内发送。为了安全起见,在每$1小时内只能发送一个密码提醒。",
     "mailerror": "发送邮件错误:$1",
     "acct_creation_throttle_hit": "使用你的IP地址访问本wiki的访客在过去24小时中创建了{{PLURAL:$1|$1个账户}},达到了这段时间所允许的最大值。因此,使用该IP地址的访客现在不能再创建账户。",
-    "emailauthenticated": "的电子邮件地址已于$2 $3确认。",
+    "emailauthenticated": "的电子邮件地址已于$2 $3确认。",
     "emailnotauthenticated": "您的邮件地址尚未确认。\n您将不会收到以下任何功能的邮件。",
     "noemailprefs": "指定一个电子邮箱地址以使用此功能。",
     "emailconfirmlink": "确认您的邮箱地址",
     "invalidemailaddress": "邮箱地址格式不正确,请输入正确的邮箱地址或清空该输入框。",
     "cannotchangeemail": "本wiki不允许对账户的电子邮件地址进行更改。",
-    "emaildisabled": "此站点不能发送电子邮件。",
+    "emaildisabled": "该网站无法发送电子邮件。",
     "accountcreated": "已建立账户",
     "accountcreatedtext": "[[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|talk]])的账户已创建。",
     "createaccount-title": "在{{SITENAME}}中创建新账户",
     "createaccount-text": "有人在{{SITENAME}}中利用您的邮箱创建了一个名为 \"$2\" 的新帐户($4),密码是 \"$3\" 。您应该立即登录并更改密码。\n\n如果该账户创建错误的话,您可以忽略此信息。",
-    "usernamehasherror": "用户名中不可包含哈希(hash)字符",
     "login-throttled": "你最近尝试登录的次数过多。请等待$1后再试。",
     "login-abort-generic": "登录失败 - 已终止",
     "loginlanguagelabel": "语言:$1",
     "resetpass-recycled": "请重置您的密码为与当前密码不同的密码。",
     "resetpass-temp-emailed": "您通过一个暂时电子邮件发送的代码登录。要完成登录,您必须在此设置一个新密码:",
     "resetpass-temp-password": "临时密码:",
-    "resetpass-abort-generic": "密码更改已被一个扩展插件中止。",
+    "resetpass-abort-generic": "密码更改已经被扩展程序中止。",
     "resetpass-expired": "您的密码已经过期。请设置一个新的密码登录。",
     "resetpass-expired-soft": "您的密码已过期并且需要重置。请现在选择一个新密码,或单击“{{int:resetpass-submit-cancel}}”以便稍后重置。",
     "resetpass-validity-soft": "您的密码无效:$1\n请选择一个新密码,或单击“{{int:resetpass-submit-cancel}}”以稍后重置。",
     "showpreview": "显示预览",
     "showlivepreview": "实时预览",
     "showdiff": "显示更改",
-    "anoneditwarning": "'''警告:'''你没有登录。你的IP地址将被记录在该页面的编辑历史中。",
+    "anoneditwarning": "<strong>警告:</strong>您没有登录。您的IP地址将被记录在该页面的编辑历史中。",
     "anonpreviewwarning": "''你没有登录。保存会记录你的IP地址于该页面的编辑历史中。''",
     "missingsummary": "'''提示:'''你没有提供编辑摘要。如果你再次点击“{{int:savearticle}}”,你的编辑将不带编辑摘要保存。",
     "missingcommenttext": "请在下面输入评论。",
     "subject-preview": "标题预览:",
     "blockedtitle": "用户被封禁",
     "blockedtext": "'''你的用户名或IP地址已被封禁。'''\n\n执行封禁的管理员是$1。封禁原因是''$2''。\n\n* 开始时间:$8\n* 到期时间:$6\n* 目标用户:$7\n\n你可以联系$1或其他[[{{MediaWiki:Grouppage-sysop}}|管理员]]讨论该封禁。只有当你在[[Special:Preferences|系统设置]]确认了电子邮件地址且未被禁止使用“电邮联系”功能时,才可以使用它。你当前的IP地址是$3,该封禁ID是#$5。请在你的询问中包含上面的所有信息。",
-    "autoblockedtext": "你的IP地址因曾被一位被$1封禁的用户使用而被自动封禁。封禁原因:\n\n:''$2''\n\n* 开始时间:$8\n* 到期时间:$6\n* 目标用户:$7\n\n你可以联系$1或其他[[{{MediaWiki:Grouppage-sysop}}|管理员]]讨论该封禁。\n\n请注意,只有当你在[[Special:Preferences|系统设置]]确认了电子邮件地址且未被禁止使用“电邮联系”功能时,才可以使用它。\n\n你当前的IP地址是$3,该封禁ID是#$5。请在你的询问中包含上面的所有信息。",
+    "autoblockedtext": "您的IP地址因曾被一位被$1封禁的用户使用而被自动封禁。封禁原因:\n\n:<em>$2</em>\n\n* 开始时间:$8\n* 到期时间:$6\n* 目标用户:$7\n\n您可以联系$1或其他[[{{MediaWiki:Grouppage-sysop}}|管理员]]申诉该封禁。\n\n请注意,只有当您已在[[Special:Preferences|系统设置]]确认了电子邮件地址且未被禁止使用“电邮联系”功能时,才能发送电子邮件联系管理员。\n\n您当前的IP地址为$3,该封禁ID为#$5。\n请您在申诉内容中说明以上所有信息。",
     "blockednoreason": "未给出原因",
     "whitelistedittext": "您必须先$1才可编辑页面。",
     "confirmedittext": "你必须确认你的电子邮件地址才能编辑页面。请通过[[Special:Preferences|系统设置]]设置并确认你的电子邮件地址。",
     "noarticletext-nopermission": "本页面目前没有内容。你可以在其他页面中[[Special:Search/{{PAGENAME}}|搜索本页标题]]或<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} 搜索相关日志]</span>,但你没有权限创建本页面。",
     "missing-revision": "“{{FULLPAGENAME}}”的修订#$1不存在。\n\n这通常是因为进入了一个已被删除的页面的历史链接。\n详细信息可以在[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} 删除日志]中找到。",
     "userpage-userdoesnotexist": "用户账户“$1”没有注册。请在创建/编辑本页前检查。",
-    "userpage-userdoesnotexist-view": "ç\94¨æ\88·è´¦æ\88·â\80\9c$1â\80\9dæ\9cªæ\9b¾å\88\9b建。",
+    "userpage-userdoesnotexist-view": "ç\94¨æ\88·è´¦æ\88·â\80\9c$1â\80\9d没æ\9c\89被注å\86\8c。",
     "blocked-notice-logextract": "这位用户目前已被封禁。以下提供最近的封禁日志以供参考:",
-    "clearyourcache": "'''注意:'''在保存之后,你可能需要清除你的浏览器的缓存以查看更改。\n* '''Firefox/Safari:'''按住“Shift”的同时单击“刷新”,或按“Ctrl-F5”或“Ctrl-R”(Mac为“⌘-R”)\n* '''Google Chrome:'''按“Ctrl-Shift-R”(Mac为“⌘-Shift-R”)\n* '''Internet Explorer:'''按住“Ctrl”的同时单击“刷新”,或按“Ctrl-F5”\n* '''Opera:'''在“工具→首选项”中清除缓存",
+    "clearyourcache": "'''注意:'''在保存之后,您可能需要清除浏览器缓存才能看到所作出的变更的影响。\n* '''Firefox/Safari:'''按住“Shift”的同时单击“刷新”,或按“Ctrl-F5”或“Ctrl-R”(Mac为“⌘-R”)\n* '''Google Chrome:'''按“Ctrl-Shift-R”(Mac为“⌘-Shift-R”)\n* '''Internet Explorer:'''按住“Ctrl”的同时单击“刷新”,或按“Ctrl-F5”\n* '''Opera:'''在“工具→首选项”中清除缓存",
     "usercssyoucanpreview": "'''提示:''' 在保存前请用“{{int:showpreview}}”按钮来测试您新的 CSS 。",
     "userjsyoucanpreview": "'''提示:''' 在保存前请用“{{int:showpreview}}”按钮来测试您新的 JavaScript 。",
     "usercsspreview": "'''请记住你现在只是在预览你的用户CSS。它尚未保存!'''",
     "templatesusedsection": "该段落使用的{{PLURAL:$1|模板}}:",
     "template-protected": "(保护)",
     "template-semiprotected": "(半保护)",
-    "hiddencategories": "页面属于$1个隐藏分类:",
+    "hiddencategories": "页面属于$1个隐藏分类:",
     "edittools": "<!-- 这里的文字将显示在编辑和上传表格下面。 -->",
     "nocreatetext": "{{SITENAME}}已经限制创建新页面功能。你可以返回编辑现有页面或[[Special:UserLogin|登录或创建账户]]。",
     "nocreate-loggedin": "你没有权限创建新页面。",
     "editwarning-warning": "离开本页面可能导致你失去任何你已经作出的更改。如果你处于登录状态,你可以在你的设置的“{{int:prefs-editing}}”部分停用该警告。",
     "editpage-notsupportedcontentformat-title": "内容格式尚不支持",
     "editpage-notsupportedcontentformat-text": "内容模型$2尚不支持内容格式$1。",
-    "content-model-wikitext": "wiki文本",
+    "content-model-wikitext": "维基文字",
     "content-model-text": "纯文本",
     "content-model-javascript": "JavaScript",
     "content-model-css": "CSS",
-    "expensive-parserfunction-warning": "警告:这个页面有太多高昂的语法功能调用。\n\n它应该少过$2次呼叫,现在有$1次呼叫。",
-    "expensive-parserfunction-category": "页面中有太多耗费的语法功能呼叫",
+    "expensive-parserfunction-warning": "<strong>警告:</strong>这个页面有太多高昂的语法功能调用。\n\n它应该少过$2次呼叫,现在有$1次呼叫。",
+    "expensive-parserfunction-category": "有过多高开销函数解析器调用的页面",
     "post-expand-template-inclusion-warning": "'''警告:'''包含模板大小过大。\n一些模板将不会包含。",
-    "post-expand-template-inclusion-category": "模板包含上限已经超过的页面",
+    "post-expand-template-inclusion-category": "模板包含大小超限的页面",
     "post-expand-template-argument-warning": "'''警告:'''本页面包含至少一个模板参数有过大扩展大小。这些参数会被略过。",
-    "post-expand-template-argument-category": "å\8c\85å\90«ç\9d\80略过模板参数的页面",
+    "post-expand-template-argument-category": "å\90«æ\9c\89略过模板参数的页面",
     "parser-template-loop-warning": "检查到模板循环:[[$1]]",
     "parser-template-recursion-depth-warning": "模板递归深度越限($1)",
     "language-converter-depth-warning": "字词转换器深度越限($1)",
     "showhideselectedversions": "显示/隐藏选择的版本",
     "editundo": "撤销",
     "diff-empty": "(没有差异)",
-    "diff-multi-sameuser": "(相同用户的{{PLURAL:$1|一个|$1个}}中间修订版本未显示)",
-    "diff-multi-otherusers": "({{PLURAL:$1|某位用户|$2位用户}}的{{PLURAL:$1|一个|$1个}}中间修订版本未显示)",
+    "diff-multi-sameuser": "(未显示同一用户的{{PLURAL:$1|$1个中间版本}})",
+    "diff-multi-otherusers": "(未显示{{PLURAL:$1|另一用户|$2个用户}}的{{PLURAL:$1|$1个中间版本}})",
     "diff-multi-manyusers": "(未显示超过$2个用户的$1个中间版本)",
     "difference-missing-revision": "此差异对比的{{PLURAL:$2|一个修订|$2个修订}}($1){{PLURAL:$2|没有}}找到。\n\n这通常是因为进入了一个已被删除的页面的修订差异对比链接。\n详细信息可以在[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} 删除日志]中找到。",
     "searchresults": "搜索结果",
     "prefs-skin": "皮肤",
     "skin-preview": "预览",
     "datedefault": "默认格式",
-    "prefs-beta": "测试功能",
-    "prefs-datetime": "日期时间",
     "prefs-labs": "实验室特性",
-    "prefs-user-pages": "用户页",
+    "prefs-user-pages": "用户页",
     "prefs-personal": "用户资料",
     "prefs-rc": "最近更改",
     "prefs-watchlist": "监视列表",
     "rows": "行数:",
     "columns": "列数:",
     "searchresultshead": "搜索",
-    "stub-threshold": "<a href=\"#\" class=\"stub\">ç\9f­é¡µé\9d¢é\93¾æ\8e¥</a>æ ¼å¼\8fé\98\88å\80¼ï¼\88å­\97è\8a\82ï¼\89ï¼\9a",
+    "stub-threshold": "<a href=\"#\" class=\"stub\">短链接</a>格式阈值(字节):",
     "stub-threshold-disabled": "停用",
     "recentchangesdays": "最近更改中显示的天数:",
     "recentchangesdays-max": "最多$1天",
     "recentchangescount": "默认显示的编辑数:",
     "prefs-help-recentchangescount": "这包括最近更改、页面历史和日志。",
-    "prefs-help-watchlist-token2": "这是你的监视列表的网络feed的密钥。任何知道它的人均可以阅读你的监视列表,因此请不要分享它。如果需要,[[Special:ResetTokens|你可以重置它]]。",
-    "savedprefs": "的系统设置已保存。",
+    "prefs-help-watchlist-token2": "这是您的监视列表的网络feed密钥。\n任何拥有者均可以浏览您的监视列表,因此不要公开该密钥。\n如果有需要,[[Special:ResetTokens|您可以重置密钥]]。",
+    "savedprefs": "的系统设置已保存。",
     "timezonelegend": "时区:",
     "localtime": "当地时间:",
     "timezoneuseserverdefault": "使用wiki默认值($1)",
     "prefs-memberingroups": "{{GENDER:$2|用户}}{{PLURAL:$1|组}}:",
     "prefs-registration": "注册时间:",
     "yourrealname": "真实姓名:",
-    "yourlanguage": "语言:",
+    "yourlanguage": "界面语言:",
     "yourvariant": "内容语言变种:",
-    "prefs-help-variant": "你希望用于显示该wiki的内容页面的语言变种或正字法。",
+    "prefs-help-variant": "您希望用于显示该本站内容的语言变体。",
     "yournick": "新签名:",
-    "prefs-help-signature": "讨论页面上的评论应该使用“<nowiki>~~~~</nowiki>”签名,它会自动转换为你的签名及时间戳。",
+    "prefs-help-signature": "讨论页上留言应该使用“<nowiki>~~~~</nowiki>”签名,它会自动转换为您的签名及时间戳。",
     "badsig": "错误的原始签名。请检查HTML标签。",
     "badsiglength": "签名过长。请不超过$1个字符。",
-    "yourgender": "希望使用什么性别称呼?",
+    "yourgender": "希望使用什么性别称呼?",
     "gender-unknown": "我不愿意指明(被称为“他/她”)",
     "gender-male": "他",
     "gender-female": "她",
-    "prefs-help-gender": "该设置为可选项目。软件根据它的值在称呼你及对他人提及你时使用适当的语法性别。该信息会被公开。",
+    "prefs-help-gender": "该设置为可选项目。软件根据该值在称呼您及对他人提及您时使用适当的语法性别。该信息会被公开。",
     "email": "电子邮件",
     "prefs-help-realname": "真实姓名是选填项目。如果你选择提供它,它将会用于贡献署名。",
     "prefs-help-email": "电子邮件是可选项,但是在您忘记密码时很有用。",
-    "prefs-help-email-others": "你也可以选择让其他用户通过你的用户或讨论页面上的链接用电子邮件联系你。其他用户联系你时你的电子邮件地址不会显示。",
+    "prefs-help-email-others": "您也可以选择让其他用户通过您的用户页或讨论页上的链接用电子邮件联系您。其他用户联系您时您的电子邮件地址不会显示。",
     "prefs-help-email-required": "电子邮件地址是必填项目。",
     "prefs-info": "基本信息",
-    "prefs-i18n": "界面语言",
+    "prefs-i18n": "语言",
     "prefs-signature": "签名",
     "prefs-dateformat": "日期格式",
     "prefs-timeoffset": "时差",
     "prefs-displaywatchlist": "显示",
     "prefs-tokenwatchlist": "密钥",
     "prefs-diffs": "差异对比",
-    "prefs-help-prefershttps": "该设置å°\86å\9c¨ä½ ä¸\8b次ç\99»å½\95æ\97¶ç\94\9fæ\95\88ã\80\82",
+    "prefs-help-prefershttps": "该设置将在下次登录时生效。",
     "prefs-tabs-navigation-hint": "提示:您可以通过左、右箭头键在选项卡之间切换。",
     "email-address-validity-valid": "电子邮件地址有效",
     "email-address-validity-invalid": "请输入有效的电子邮件地址",
     "upload-permitted": "允许的文件类型:$1。",
     "upload-preferred": "建议的文件类型:$1。",
     "upload-prohibited": "禁止的文件类型:$1。",
-    "uploadlog": "上传日志",
     "uploadlogpage": "上传日志",
     "uploadlogpagetext": "下面是最近的文件上传的列表。图像概览请见[[Special:NewFiles|新文件图库]]。",
     "filename": "文件名",
     "filereuploadsummary": "文件更改:",
     "filestatus": "著作权状况:",
     "filesource": "来源:",
-    "uploadedfiles": "已上传文件",
     "ignorewarning": "忽略警告,继续保存文件",
     "ignorewarnings": "忽略所有警告",
     "minlength1": "文件名至少要有一个字符。",
     "filename-tooshort": "文件名过短。",
     "filetype-banned": "此类文件被禁止。",
     "verification-error": "文件未通过验证。",
-    "hookaborted": "您所尝试的修改被一个扩展程序终止。",
+    "hookaborted": "你尝试的修改被扩展程序中止。",
     "illegal-filename": "文件名非法。",
     "overwrite": "不允许覆盖现有文件。",
     "unknown-error": "发生未知错误。",
     "overwroteimage": "上传“[[$1]]”的新版本",
     "uploaddisabled": "上传己停用。",
     "copyuploaddisabled": "URL上传已停用。",
-    "uploadfromurl-queued": "上传已被列入队列。",
     "uploaddisabledtext": "文件上传已停用。",
     "php-uploaddisabledtext": "PHP文件上传停用。请检查file_uploads设置。",
     "uploadscripted": "该文件包含可能被网络浏览器错误解释的 HTML 或脚本代码。",
     "upload-misc-error": "未知的上传错误",
     "upload-misc-error-text": "在上传时发生未知的错误。请确认您使用了正确并可访问的URL,然后进行重试。如果问题仍然存在,请与[[Special:ListUsers/sysop|管理员]]联系。",
     "upload-too-many-redirects": "在网址中有太多重新定向",
-    "upload-unknown-size": "未知大小",
     "upload-http-error": "发生HTTP错误:$1",
     "upload-copy-upload-invalid-domain": "不能从该域名上载文件副本。",
     "backend-fail-stream": "无法流传送文件$1。",
     "img-auth-streaming": "流式化“$1”中。",
     "img-auth-public": "img_auth.php的功能是从非公开wiki输出文件。本wiki已被设置为公开。为了最佳安全状况,img_auth.php已停用。",
     "img-auth-noread": "用户无权读取“$1”。",
-    "img-auth-bad-query-string": "URL 有一个无效的查询字符串。",
     "http-invalid-url": "无效URL:$1",
     "http-invalid-scheme": "不支持带有“$1”的URL",
     "http-request-error": "未知的错误令到HTTP请求失败。",
     "filehist-dimensions": "大小",
     "filehist-filesize": "文件大小",
     "filehist-comment": "备注",
-    "filehist-missing": "文件遗失",
     "imagelinks": "文件用途",
-    "linkstoimage": "以下{{PLURAL:$1|页面|$1个页面}}链接至本文件:",
+    "linkstoimage": "以下$1个页面链接至本文件:",
     "linkstoimage-more": "超过$1个页面连接到这个文件。\n此处只列出首$1个链接到该文件的页面。\n您也可以查看[[Special:WhatLinksHere/$2|完整的列表]]。",
     "nolinkstoimage": "没有页面链接到本文件。",
     "morelinkstoimage": "查看连接到这个文件的[[Special:WhatLinksHere/$1|更多链接]]。",
     "statistics-articles": "内容页面",
     "statistics-pages": "页面",
     "statistics-pages-desc": "本wiki的所有页面,包括讨论页面、重定向等。",
-    "statistics-files": "已上传文件",
+    "statistics-files": "上传的文件",
     "statistics-edits": "自{{SITENAME}}建立以来的页面编辑数",
     "statistics-edits-average": "每页平均编辑数",
     "statistics-views-total": "查看总数",
     "speciallogtitlelabel": "目标(标题或用户):",
     "log": "日志",
     "all-logs-page": "所有公开日志",
-    "alllogstext": "所有{{SITENAME}}公开日志的联合展示。可以通过选择日志类型、输入用户名(区分大小写)或相关页面(区分大小写)筛选日志条目。",
+    "alllogstext": "所有{{SITENAME}}公开日志的联合展示。可以通过选择日志类型、输入用户名(区分大小写)或相关页面(区分大小写)筛选日志条目。",
     "logempty": "在日志中不存在匹配项。",
     "log-title-wildcard": "搜索以该文字开头的标题",
     "showhideselectedlogentries": "显示/隐藏所选日志项",
     "listgrouprights-removegroup-self": "删除自己的账户的{{PLURAL:$2|用户组}}:$1",
     "listgrouprights-addgroup-self-all": "添加所有用户组至自己的账户",
     "listgrouprights-removegroup-self-all": "删除自己的账户的所有用户组",
+    "listgrouprights-namespaceprotection-header": "名字空间限制",
+    "listgrouprights-namespaceprotection-namespace": "名字空间",
+    "listgrouprights-namespaceprotection-restrictedto": "允许用户编辑的权限",
+    "trackingcategories": "追踪分类",
+    "trackingcategories-summary": "本页面列举由MediaWiki软件自动添加的跟踪分类。它们的名字可通过修改{{ns:8}}名字空间对应的系统信息而变更。",
+    "trackingcategories-msg": "追踪分类",
+    "trackingcategories-name": "信息名",
+    "trackingcategories-desc": "分类收录标准",
+    "noindex-category-desc": "页面中有<code><nowiki>__NOINDEX__</nowiki></code>魔术字(并且在标记允许的名字空间)且因此未被机器人索引的。",
+    "index-category-desc": "页面中有<code><nowiki>__INDEX__</nowiki></code>魔术字(并且在标记允许的名字空间)且因此被机器人索引但本不应索引的。",
+    "post-expand-template-inclusion-category-desc": "在展开了所有模板后,页面大小大于<code>$wgMaxArticleSize</code>,所以一些模板未展开。",
+    "post-expand-template-argument-category-desc": "展开了模板参数(三对花括号内,例如<code>{{{Foo}}}</code>)之后,页面大于<code>$wgMaxArticleSize</code>。",
+    "expensive-parserfunction-category-desc": "页面包含了太多的高开销函数解析器(例如<code>#ifexist</code>)。参见[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit Manual:$wgExpensiveParserFunctionLimit]。",
+    "broken-file-category-desc": "当页面包含损坏文件连接(连接至嵌入的一个不存在文件)时分类被加入。",
+    "hidden-category-category-desc": "这是有<code><nowiki>__HIDDENCAT__</nowiki></code>的分类,该魔术字阻止分类默认在页面上的分类链接框中显示。",
+    "trackingcategories-nodesc": "没有说明。",
+    "trackingcategories-disabled": "分类被禁用",
     "mailnologin": "无电子邮件地址",
     "mailnologintext": "你必须[[Special:UserLogin|登录]]并在你的[[Special:Preferences|系统设置]]中拥有有效的电子邮件地址才能向其他用户发送电子邮件。",
     "emailuser": "电邮联系",
     "emailuser-title-notarget": "电邮联系",
     "emailpage": "电邮联系",
     "emailpagetext": "你可以使用下面的表格发送电子邮件信息至该{{GENDER:$1|用户}}。你在[[Special:Preferences|系统设置]]中输入的电子邮件地址将显示为邮件的“发件人”地址,所以该用户将可以直接回复你。",
-    "usermailererror": "Mail 对象返回错误:",
     "defemailsubject": "来自{{SITENAME}}用户“$1”的电子邮件",
     "usermaildisabled": "用户电子邮件停用",
     "usermaildisabledtext": "你不能发送电子邮件至本wiki的其他用户",
     "noemailtitle": "无电子邮件地址",
     "noemailtext": "该用户还没有指定一个有效的电子邮件地址。",
-    "nowikiemailtitle": "禁止电子邮件",
     "nowikiemailtext": "该用户已经选择不接收来自其他用户的电子邮件。",
     "emailnotarget": "收件人不存在或无效的用户名。",
     "emailtarget": "输入收件人的用户名",
     "nowatchlist": "你的监视列表为空。",
     "watchlistanontext": "请$1以查看或编辑您的监视列表。",
     "watchnologin": "未登录",
-    "watchnologintext": "您必须先[[Special:UserLogin|登录]]才能更改您的监视列表。",
     "addwatch": "添加至监视列表",
-    "addedwatchtext": "页面“[[:$1]]”已添加至你的[[Special:Watchlist|监视列表]]。本页面及其讨论页面的新增更改将会列入监视列表。",
+    "addedwatchtext": "已将页面“[[:$1]]”加入您的[[Special:Watchlist|监视列表]]。此后本页面及其讨论页的若有更改将在监视列表中显示。",
     "removewatch": "从监视列表中删除",
     "removedwatchtext": "页面“[[:$1]]”已从[[Special:Watchlist|你的监视列表]]中删除。",
     "watch": "监视",
     "unwatchthispage": "停止监视",
     "notanarticle": "非内容页面",
     "notvisiblerev": "上次由不同用户所作的修订版本已经删除",
-    "watchlist-details": "不计讨论页面,你的监视列表中有$1个页面。",
+    "watchlist-details": "不计讨论页,您的监视列表中共有$1个页面。",
     "wlheader-enotif": "已启用电子邮件通知。",
-    "wlheader-showupdated": "你上次访问后更改的页面以'''粗体'''显示",
+    "wlheader-showupdated": "您上次访问后发生更改的页面'''加粗'''显示",
     "watchmethod-recent": "检查被监视页面的最近编辑",
     "watchmethod-list": "查看监视页中的最新修改",
     "watchlistcontains": "您的监视列表包含$1个页面。",
     "iteminvalidname": "页面'$1'错误,无效命名...",
-    "wlnote2": "下面是过去{{PLURAL:$1|<strong>$1</strong>小时}}的更改,截至$2 $3。",
+    "wlnote2": "下面是最近{{PLURAL:$1|<strong>$1</strong>小时}}的更改,截至$2 $3。",
     "wlshowlast": "显示过去$1小时$2天$3",
     "watchlist-options": "监视列表选项",
     "watching": "正在监视...",
     "unwatching": "正在取消监视...",
     "watcherrortext": "更改“$1”的监视列表设置时出错。",
-    "enotif_mailer": "{{SITENAME}}通知发送器",
     "enotif_reset": "标记所有页面为已访问",
     "enotif_impersonal_salutation": "{{SITENAME}}用户",
     "enotif_subject_deleted": "{{SITENAME}}页面$1已被$2删除",
     "excontent": "内容:“$1”",
     "excontentauthor": "内容:“$1”(唯一贡献者为“[[Special:Contributions/$2|$2]]”)",
     "exbeforeblank": "被清空前的内容为:“$1”",
-    "exblank": "页面为空",
     "delete-confirm": "删除“$1”",
     "delete-legend": "删除",
     "historywarning": "警告:您将要删除的页面有约$1个{{PLURAL:$1|修订}}版本的历史:",
     "protect-summary-cascade": "联锁",
     "protect-expiring": "终止于$1(UTC)",
     "protect-expiring-local": "$1到期",
-    "protect-expiry-indefinite": "限期",
+    "protect-expiry-indefinite": "限期",
     "protect-cascade": "保护本页中包含的页面(连锁保护)",
     "protect-cantedit": "您无法更改这个页面的保护等级,因为您没有权限去编辑它。",
     "protect-othertime": "其它时间:",
     "protect-otherreason-op": "其他原因",
     "protect-dropdown": "*常见保护原因\n** 过度破坏\n** 过多垃圾信息\n** 负面的编辑战\n** 高流量页面",
     "protect-edit-reasonlist": "编辑保护原因",
-    "protect-expiry-options": "1小时:1 hour,1天:1 day,1周:1 week,2周:2 weeks,1个月:1 month,3个月:3 months,6个月:6 months,1年:1 year,限期:infinite",
+    "protect-expiry-options": "1小时:1 hour,1天:1 day,1周:1 week,2周:2 weeks,1个月:1 month,3个月:3 months,6个月:6 months,1年:1 year,限期:infinite",
     "restriction-type": "权限:",
     "restriction-level": "限制级别:",
     "minimum-size": "最小尺寸",
     "contributions-title": "$1的用户贡献",
     "mycontris": "贡献",
     "contribsub2": "{{GENDER:$3|$1}}的贡献($2)",
+    "contributions-userdoesnotexist": "用户“$1”尚未注册。",
     "nocontribs": "没有找到符合特征的更改。",
     "uctop": "(当前)",
     "month": "截止月份:",
     "sp-contributions-newbies-sub": "新账户的贡献",
     "sp-contributions-newbies-title": "新账户的用户贡献",
     "sp-contributions-blocklog": "封禁日志",
+    "sp-contributions-suppresslog": "已被删除的用户贡献",
     "sp-contributions-deleted": "已被删除的用户贡献",
     "sp-contributions-uploads": "上传",
     "sp-contributions-logs": "日志",
     "sp-contributions-blocked-notice": "这位用户现时正在被封锁中。\n最近的封锁日志项目在下面提供以便参考:",
     "sp-contributions-blocked-notice-anon": "这个IP地址现时正在被封锁中。\n最近的封锁日志项目在下面提供以便参考:",
     "sp-contributions-search": "搜索贡献",
-    "sp-contributions-suppresslog": "已被删除的用户贡献",
     "sp-contributions-username": "IP地址或用户名:",
     "sp-contributions-toponly": "仅显示最后版本的编辑",
     "sp-contributions-newonly": "仅显示创建页面的编辑",
     "ipbenableautoblock": "自动封禁该用户最后使用的IP地址,以及他们随后试图用于编辑的所有IP地址",
     "ipbsubmit": "封禁该用户",
     "ipbother": "其它时间:",
-    "ipboptions": "2小时:2 hours,1天:1 day,3天:3 days,1周:1 week,2周:2 weeks,1个月:1 month,3个月:3 months,6个月:6 months,1年:1 year,限期:infinite",
+    "ipboptions": "2小时:2 hours,1天:1 day,3天:3 days,1周:1 week,2周:2 weeks,1个月:1 month,3个月:3 months,6个月:6 months,1年:1 year,限期:infinite",
     "ipbhidename": "在编辑及列表中隐藏用户名",
-    "ipbwatchuser": "监视该用户的用户页面和讨论页面",
-    "ipb-disableusertalk": "阻止用户在封禁期间编辑自己的讨论页",
+    "ipbwatchuser": "监视该用户的用户页和讨论页",
+    "ipb-disableusertalk": "阻止用户在封禁期间编辑自己的讨论页",
     "ipb-change-block": "使用这些设置重新封禁用户",
     "ipb-confirm": "确认封禁",
     "badipaddress": "无效IP地址",
     "ipblocklist-submit": "搜索",
     "ipblocklist-localblock": "本地封禁",
     "ipblocklist-otherblocks": "其他{{PLURAL:$1|封禁}}",
-    "infiniteblock": "限期",
+    "infiniteblock": "限期",
     "expiringblock": "$1 $2到期",
     "anononlyblock": "仅匿名用户",
     "noautoblockblock": "自动封禁停用",
     "createaccountblock": "账户创建停用",
     "emailblock": "电子邮件停用",
-    "blocklist-nousertalk": "不能编辑自己的讨论页",
+    "blocklist-nousertalk": "不能编辑自己的讨论页",
     "ipblocklist-empty": "封禁列表为空。",
     "ipblocklist-no-results": "请求的IP地址或用户名没有被封禁。",
     "blocklink": "封禁",
     "block-log-flags-nocreate": "账户创建停用",
     "block-log-flags-noautoblock": "自动封禁停用",
     "block-log-flags-noemail": "电子邮件停用",
-    "block-log-flags-nousertalk": "不能编辑自己的讨论页",
+    "block-log-flags-nousertalk": "不能编辑自己的讨论页",
     "block-log-flags-angry-autoblock": "已启用增强型自动封禁",
     "block-log-flags-hiddenname": "隐藏用户名",
     "range_block_disabled": "管理员执行段封禁的权限已被禁用。",
     "ipb_expiry_invalid": "无效的终止时间。",
     "ipb_expiry_temp": "隐藏用户名的封禁必须是永久性的。",
     "ipb_hide_invalid": "无法封禁此账户;它拥有多于$1次编辑。",
-    "ipb_already_blocked": "“$1”已被封禁",
+    "ipb_already_blocked": "“$1”已被封禁",
     "ipb-needreblock": "$1已被封禁。您是否想更改封禁设置?",
     "ipb-otherblocks-header": "其他{{PLURAL:$1|封禁}}",
     "unblock-hideuser": "您无法取消封禁该用户,因为他们的用户名已被隐藏。",
     "export-download": "另存为文件",
     "export-templates": "包含模板",
     "export-pagelinks": "包含链接页面的搜索深度:",
-    "allmessages": "系统息",
+    "allmessages": "系统息",
     "allmessagesname": "名称",
     "allmessagesdefault": "默认信息文字",
     "allmessagescurrent": "当前信息文字",
-    "allmessagestext": "此处列出了MediaWiki名字空间下的所有有效系统消息。\n如果想为MediaWiki的本地化贡献翻译,请访问[https://www.mediawiki.org/wiki/Localisation MediaWiki本地化]和[//translatewiki.net translatewiki.net]。",
+    "allmessagestext": "此处列出了MediaWiki名字空间下的所有有效系统消息。\n如果想为MediaWiki的本地化贡献翻译,请访问[https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation MediaWiki本地化]和[//translatewiki.net translatewiki.net]。",
     "allmessagesnotsupportedDB": "此页面无法使用,因为'''$wgUseDatabaseMessages'''已被设置关闭。",
     "allmessages-filter-legend": "过滤",
     "allmessages-filter": "按自定义状态过滤:",
     "importunknownsource": "未知的源导入类型",
     "importcantopen": "无法打开导入文件",
     "importbadinterwiki": "无效的跨wiki链接",
-    "importnotext": "空或没有文本",
     "importsuccess": "导入完成!",
-    "importhistoryconflict": "存在冲突的修订历史(可能在之前已经导入过此页面)",
     "importnosources": "跨Wiki导入源没有定义,同时不允许直接的历史上传。",
     "importnofile": "没有上传导入文件。",
     "importuploaderrorsize": "上传导入文件失败。文件大于可以允许的上传大小。",
     "pageinfo-few-watchers": "少于$1个监视者",
     "pageinfo-redirects-name": "至该页面的重定向数",
     "pageinfo-subpages-name": "该页面的子页面数",
-    "pageinfo-subpages-value": "$1($2个重定向页,$3个非重定向页)",
+    "pageinfo-subpages-value": "$1($2个{{PLURAL:$2|重定向}},$3个{{PLURAL:$3|非重定向}})",
     "pageinfo-firstuser": "页面创建者",
     "pageinfo-firsttime": "页面创建日期",
     "pageinfo-lastuser": "最后编辑者",
     "exif-gpsareainformation": "GPS区域名称",
     "exif-gpsdatestamp": "GPS日期",
     "exif-gpsdifferential": "GPS差动修正",
-    "exif-jpegfilecomment": "JPEG 文件注释",
+    "exif-jpegfilecomment": "JPEG文件备注",
     "exif-keywords": "关键词",
     "exif-worldregioncreated": "照片中的世界区域",
     "exif-countrycreated": "在拍摄图片的国家",
     "exif-morepermissionsurl": "其他授权协议信息",
     "exif-attributionurl": "二次使用本作品时,请链接至",
     "exif-preferredattributionname": "二次使用本作品时,请署名",
-    "exif-pngfilecomment": "PNG文件注释",
+    "exif-pngfilecomment": "PNG文件备注",
     "exif-disclaimer": "免责声明",
     "exif-contentwarning": "内容的警告",
-    "exif-giffilecomment": "GIF文件注释",
+    "exif-giffilecomment": "GIF文件备注",
     "exif-intellectualgenre": "项目类型",
     "exif-subjectnewscode": "主题代码",
     "exif-scenecode": "IPTC 现场代码",
     "watchlistall2": "所有",
     "namespacesall": "所有",
     "monthsall": "所有",
-    "confirmemail": "确认邮箱地址",
+    "confirmemail": "确认电子邮件地址",
     "confirmemail_noemail": "你还没有在你的[[Special:Preferences|系统设置]]中设置有效的电子邮件地址。",
     "confirmemail_text": "{{SITENAME}}要求您在使用邮件功能之前验证您的邮箱地址。\n点击以下按钮可向您的邮箱发送一封确认邮件。该邮件包含有一行代码链接;\n请在您的浏览器中加载此链接以确认您的邮箱地址是有效的。",
     "confirmemail_pending": "一个确认码已经被发送到您的邮箱,您可能需要等几分钟才能收到。如果无法收到,请再申请一个新的确认码。",
     "livepreview-error": "连接失败:$1“$2”。\n尝试标准预览。",
     "lag-warn-normal": "过去$1秒内的更改未必会在这个列表中显示。",
     "lag-warn-high": "由于数据库的过度延迟,过去$1秒的更改未必会在这个列表中显示。",
-    "watchlistedit-numitems": "不计讨论页面,的监视列表包含$1个标题。",
+    "watchlistedit-numitems": "不计讨论页面,的监视列表包含$1个标题。",
     "watchlistedit-noitems": "你的监视列表中没有标题。",
     "watchlistedit-normal-title": "编辑监视列表",
     "watchlistedit-normal-legend": "删除监视列表中的标题",
     "watchlisttools-edit": "查看并编辑监视列表",
     "watchlisttools-raw": "编辑原始监视列表",
     "signature": "[[{{ns:user}}:$1|$2]]([[{{ns:user_talk}}:$1|讨论]])",
-    "unknown_extension_tag": "不明的扩展标签“$1”",
+    "unknown_extension_tag": "未知扩展标签“$1”",
     "duplicate-defaultsort": "'''警告:'''默认排序关键词“$2”覆盖了之前的默认排序关键词“$1”。",
     "version": "版本",
-    "version-extensions": "å·²å®\89è£\85ç\9a\84æ\89©å±\95ç¨\8båº\8f",
+    "version-extensions": "安装的扩展程序",
     "version-specialpages": "特殊页面",
     "version-parserhooks": "解析器钩",
     "version-variables": "变量",
     "version-version": "(版本 $1)",
     "version-license": "MediaWiki协议",
     "version-ext-license": "许可协议",
-    "version-ext-colheader-name": "扩展",
+    "version-ext-colheader-name": "扩展程序",
     "version-ext-colheader-version": "版本",
     "version-ext-colheader-license": "许可协议",
     "version-ext-colheader-description": "说明",
     "version-poweredby-translators": "translatewiki.net上的翻译者",
     "version-credits-summary": "我们感谢下列人士为[[Special:Version|MediaWiki]]作出的贡献。",
     "version-license-info": "MediaWiki是自由软件,你可以依据自由软件基金会发行的'''GNU公众授权协议'''第2版或任意后续版本的条款,传播和/或修改本软件。\n\nMediaWiki发表时预期有用,但对此'''无任何保证''',亦无隐含的'''可以销售'''或'''适合特定目的'''的保证。详情请见GNU公众授权协议。\n\n你应该已经接受本程序附带的[{{SERVER}}{{SCRIPTPATH}}/COPYING GNU公众授权协议的副本]。如果没有,请写信至美国马萨诸塞州波士顿富兰克林大街51号5楼自由软件基金会,邮编MA 02110-1301(Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA),或[//www.gnu.org/licenses/old-licenses/gpl-2.0.html 在线阅读该协议]。",
-    "version-software": "å·²å®\89è£\85ç\9a\84软件",
+    "version-software": "安装的软件",
     "version-software-product": "产品",
     "version-software-version": "版本",
     "version-entrypoints": "接入点URL",
     "version-entrypoints-header-entrypoint": "接入点",
     "version-entrypoints-header-url": "URL",
-    "version-entrypoints-articlepath": "[https://www.mediawiki.org/wiki/Manual:$wgArticlePath 条目路径]",
-    "version-entrypoints-scriptpath": "[https://www.mediawiki.org/wiki/Manual:$wgScriptPath 脚本路径]",
+    "version-entrypoints-articlepath": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgArticlePath 条目路径]",
+    "version-entrypoints-scriptpath": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgScriptPath 脚本路径]",
     "redirect": "重定向(按文件、用户、页面或版本ID)",
     "redirect-legend": "重定向至文件或页面",
     "redirect-summary": "本特殊页面可以跳转至一个文件(提供文件名)、页面(提供版本ID或页面ID)或用户页面(提供数字用户ID)。用法:[[{{#Special:Redirect}}/file/Example.jpg]]、[[{{#Special:Redirect}}/page/64308]]、[[{{#Special:Redirect}}/revision/328429]]或[[{{#Special:Redirect}}/user/101]]。",
     "fileduplicatesearch-result-n": "文件“$1”有$2项完全相同的重复副本。",
     "fileduplicatesearch-noresults": "没有文件命名为\"$1\"发现。",
     "specialpages": "特殊页面",
-    "specialpages-note-top": "图例",
+    "specialpages-note-top": "说明",
     "specialpages-note": "*普通特殊页面。\n*<span class=\"mw-specialpagerestricted\">受限特殊页面。</span>",
     "specialpages-group-maintenance": "维护报告",
     "specialpages-group-other": "其它特殊页面",
     "limitreport-templateargumentsize": "模板参数大小",
     "limitreport-templateargumentsize-value": "$1/$2 字节",
     "limitreport-expansiondepth": "最高扩展深度",
-    "limitreport-expensivefunctioncount": "高开销函数分析器",
+    "limitreport-expensivefunctioncount": "高开销解析函数数量",
     "expandtemplates": "展开模板",
     "expand_templates_intro": "此特殊页面可以递归地展开所给文本中的模板。\n它同时还可展开诸如<nowiki>{{</nowiki>#language:...}}的解析器函数和诸如<nowiki>{{</nowiki>CURRENTDAY}}的变量。\n实际上,几乎所有在双重花括号中的内容都会被展开。",
     "expand_templates_title": "上下文标题,用于{{FULLPAGENAME}}等:",
     "expand_templates_remove_nowiki": "在结果中隐藏<nowiki>标签",
     "expand_templates_generate_xml": "显示XML语法树",
     "expand_templates_generate_rawhtml": "显示原始HTML",
-    "expand_templates_preview": "预览",
-    "trackingcategories": "跟踪分类",
-    "trackingcategories-summary": "本页面列举由MediaWiki软件自动添加的跟踪分类。它们的名字可通过修改{{ns:8}}名字空间对应的系统信息而变更。",
-    "trackingcategories-msg": "跟踪分类",
-    "trackingcategories-name": "信息名",
-    "trackingcategories-desc": "分类收录标准",
-    "noindex-category-desc": "页面中有<nowiki>__NOINDEX__</nowiki>魔术字(并且在标记允许的名字空间)且因此未被机器人索引的。",
-    "index-category-desc": "页面中有<nowiki>__INDEX__</nowiki>魔术字(并且在标记允许的名字空间)且因此被机器人索引但本不应索引的。",
-    "post-expand-template-inclusion-category-desc": "在展开了所有模板后,页面大小大于$wgMaxArticleSize,所以一些模板未展开。",
-    "post-expand-template-argument-category-desc": "展开了模板参数(三对花括号内,例如{{{Foo}}})之后,页面大于$wgMaxArticleSize。",
-    "expensive-parserfunction-category-desc": "页面包含了太多的高开销函数解析器(例如#ifexists)。参见[https://www.mediawiki.org/wiki/Manual:$wgExpensiveParserFunctionLimit Manual:$wgExpensiveParserFunctionLimit]。",
-    "broken-file-category-desc": "当页面包含损坏文件连接(连接至嵌入的一个不存在文件)时分类被加入。",
-    "hidden-category-category-desc": "这是一个带<nowiki>__HIDDENCAT__</nowiki>的分类,它默认防止在页面的分类连接盒中显示。",
-    "trackingcategories-nodesc": "没有说明。",
-    "trackingcategories-disabled": "分类被禁用"
+    "expand_templates_preview": "预览"
 }
index 532f14c..f3199db 100644 (file)
     "permalink": "永久連結",
     "print": "列印",
     "view": "檢視",
+    "view-foreign": "於$1查閱",
     "edit": "編輯",
+    "edit-local": "編輯本地說明",
     "create": "建立",
+    "create-local": "添加本地說明",
     "editthispage": "編輯本頁",
     "create-this-page": "建立本頁",
     "delete": "刪除",
     "pool-timeout": "等待鎖定逾時",
     "pool-queuefull": "請求池已滿",
     "pool-errorunknown": "未知錯誤",
+    "pool-servererror": "池計數器服務不可用($1)。",
     "aboutsite": "關於 {{SITENAME}}",
     "aboutpage": "Project:關於",
     "copyright": "除非另有說明,否則本站內容均以$1條款提供。",
     "accountcreatedtext": "[[{{ns:User}}:$1|$1]]([[{{ns:User talk}}:$1|討論]])的賬戶已經被建立。",
     "createaccount-title": "在{{SITENAME}}中建立新賬戶",
     "createaccount-text": "有人在{{SITENAME}}中利用您的電郵創建了一個名為 \"$2\" 的新賬戶($4),密碼是 \"$3\" 。您應該立即登入並更改密碼。\n\n如果該賬戶建立錯誤的話,您可以忽略此訊息。",
-    "usernamehasherror": "用戶名稱不可以包含切細字元",
     "login-throttled": "您已經嘗試多次的登入動作。\n請稍等$1後再試。",
     "login-abort-generic": "登入錯誤 - 中止",
     "loginlanguagelabel": "語言:$1",
     "editwarning-warning": "離開這個頁面可能會令您失去之前作出的所有更改。若您已經登入,您可在偏好設定的「{{int:prefs-editing}}」部份裡關閉此警告。",
     "editpage-notsupportedcontentformat-title": "內容格式尚無法支援",
     "editpage-notsupportedcontentformat-text": "內容模型$2尚無法支援內容格式$1。",
-    "content-model-wikitext": "圍記文字(Wikitext)",
+    "content-model-wikitext": "維基文字",
     "content-model-text": "純文字",
     "content-model-javascript": "JavaScript",
     "content-model-css": "CSS",
     "prefs-skin": "外觀",
     "skin-preview": "預覽",
     "datedefault": "預設值",
-    "prefs-beta": "測試功能",
-    "prefs-datetime": "日期和時間",
     "prefs-labs": "實驗中的功能",
     "prefs-user-pages": "使用者頁面",
     "prefs-personal": "使用者概況表",
     "upload-permitted": "准許的檔案類型:$1。",
     "upload-preferred": "建議的檔案類型:$1。",
     "upload-prohibited": "禁止的檔案類型:$1。",
-    "uploadlog": "上傳日誌",
     "uploadlogpage": "上傳日誌",
     "uploadlogpagetext": "以下是最近上載的檔案的一覽表。\n檢視[[Special:NewFiles|新檔案畫廊]]去看更富圖片的總覽。",
     "filename": "檔案名稱",
     "filereuploadsummary": "檔案變更:",
     "filestatus": "版權狀態:",
     "filesource": "來源:",
-    "uploadedfiles": "已上載檔案",
     "ignorewarning": "忽略警告並儲存檔案",
     "ignorewarnings": "忽略所有警告",
     "minlength1": "檔案名字必須至少有一個字母。",
     "overwroteimage": "已經上傳「[[$1]]」的新版本",
     "uploaddisabled": "上傳己停用。",
     "copyuploaddisabled": "通過網址上傳功能未開通。",
-    "uploadfromurl-queued": "上傳已被列入隊列。",
     "uploaddisabledtext": "檔案上傳不可用。",
     "php-uploaddisabledtext": "PHP 檔案上載已經停用。請檢查 file_uploads 設定。",
     "uploadscripted": "該檔案包含可能被網路瀏覽器錯誤解釋的 HTML 或腳本代碼。",
     "upload-misc-error": "未知的上傳錯誤",
     "upload-misc-error-text": "在上傳時發生未知的錯誤。請驗証使用了正確並可訪問的 URL,然後進行重試。如果問題仍然存在,請與[[Special:ListUsers/sysop|管理員]]聯繫。",
     "upload-too-many-redirects": "在網址中有太多重新定向",
-    "upload-unknown-size": "未知的大小",
     "upload-http-error": "已發生一個HTTP錯誤:$1",
     "upload-copy-upload-invalid-domain": "不能從該域名上載檔案副本。",
     "backend-fail-stream": "無法流傳送文件「$1」。",
     "img-auth-streaming": "串流「$1」中。",
     "img-auth-public": "img_auth.php的功能是由一個公共wiki中輸出檔案。\n這個wiki是已經設定做一個公共wiki。\n基於保安最佳化,img_auth.php已經停用。",
     "img-auth-noread": "用戶無權讀取「$1」。",
-    "img-auth-bad-query-string": "URL有一個無效的查詢字符串",
     "http-invalid-url": "無效的URL:$1",
     "http-invalid-scheme": "不支援含有「$1」的URL。",
     "http-request-error": "未知的錯誤令到HTTP請求失敗。",
     "filehist-dimensions": "維度",
     "filehist-filesize": "檔案大小",
     "filehist-comment": "註解",
-    "filehist-missing": "檔案遺失",
     "imagelinks": "檔案使用情況",
     "linkstoimage": "以下的$1個頁面連接到本檔案:",
     "linkstoimage-more": "超過$1個頁面連接到這個檔案。\n此處只列出首$1個連接到此檔案的頁面。\n您也可以查看[[Special:WhatLinksHere/$2|完整的清單]]。",
     "listgrouprights-removegroup-self": "在自己的賬戶中移除的{{PLURAL:$2|一個|多個}}群組: $1",
     "listgrouprights-addgroup-self-all": "在自己的賬戶中加入所有群組",
     "listgrouprights-removegroup-self-all": "在自己的賬戶中移除所有群組",
+    "listgrouprights-namespaceprotection-header": "命名空間限制",
+    "listgrouprights-namespaceprotection-namespace": "命名空間",
+    "listgrouprights-namespaceprotection-restrictedto": "允許用戶編輯權限",
+    "trackingcategories": "跟蹤分類",
+    "trackingcategories-summary": "當前頁面收錄由MediaWiki軟體自動加入的跟蹤分類。名稱可經由{{ns:8}}名字空間對於系統資訊修改之。",
+    "trackingcategories-msg": "跟蹤分類",
+    "trackingcategories-name": "資訊名",
+    "trackingcategories-desc": "分類收錄準則",
+    "noindex-category-desc": "頁面中存在<code><nowiki>__NOINDEX__</nowiki></code>魔術字(並且於標記允許名字空間)並藉此未被機械人索引。",
+    "index-category-desc": "頁面中存在<code><nowiki>__INDEX__</nowiki></code>魔術字(並且於標記允許名字空間)並藉此被機械人錯誤索引。",
+    "post-expand-template-inclusion-category-desc": "展開所有模板后,頁面大小大於<code>$wgMaxArticleSize</code>,藉此某些模板未展開。",
+    "post-expand-template-argument-category-desc": "展開模板參數(三隊花括弧內,例如<code>{{{Foo}}}</code>)後,頁面大於<code>$wgMaxArticleSize</code>。",
+    "expensive-parserfunction-category-desc": "頁面包含太多高開銷函數解析器(例如<code>#ifexist</code>)。參見[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit Manual:$wgExpensiveParserFunctionLimit]。",
+    "broken-file-category-desc": "黨頁面包含受損檔案連接(連入被嵌入之不存在檔案)時。",
+    "hidden-category-category-desc": "此分類帶有<code><nowiki>__HIDDENCAT__</nowiki></code>,它預設防止於頁面分類連接盒中顯示。",
+    "trackingcategories-nodesc": "並無說明。",
+    "trackingcategories-disabled": "分類被禁用",
     "mailnologin": "無電郵地址",
     "mailnologintext": "您必須先[[Special:UserLogin|登入]]\n並在[[Special:Preferences|偏好設定]]\n中有一個有效的 e-mail 地址才可以電郵其他用戶。",
     "emailuser": "E-mail該用戶",
     "emailuser-title-notarget": "E-mail用戶",
     "emailpage": "E-mail用戶",
     "emailpagetext": "您可以用下面的表格去寄一封電郵給這位{{Gender:$1|用戶}}。\n您在[[Special:Preferences|您的參數設置]]中所輸入的電子郵件地址將出現在郵件「發件人」一欄中,這樣該用戶就可以回覆您。",
-    "usermailererror": "目標郵件地址返回錯誤:",
     "defemailsubject": "{{SITENAME}}來自用戶「$1」的電子郵件",
     "usermaildisabled": "用戶電郵已停用",
     "usermaildisabledtext": "您不可以發送電郵到這個wiki上的其他用戶",
     "noemailtitle": "無e-mail地址",
     "noemailtext": "該用戶還沒有指定一個有效的e-mail地址。",
-    "nowikiemailtitle": "不容許電子郵件",
     "nowikiemailtext": "這位用戶選擇不接收其他用戶的電子郵件。",
     "emailnotarget": "收件人不存在或無效的用戶名。",
     "emailtarget": "輸入收件人用戶名",
     "nowatchlist": "您的監視列表為空。",
     "watchlistanontext": "請$1以檢視或編輯您的監視列表。",
     "watchnologin": "未登入",
-    "watchnologintext": "您必須先[[Special:UserLogin|登入]],才能更改您的監視列表。",
     "addwatch": "加至監視列表",
     "addedwatchtext": "已將頁面「[[:$1]]」加入您的[[Special:Watchlist|監視列表]]。將來此頁面及其討論頁如有更動都會在那裡列出。",
     "removewatch": "停止監視",
     "unwatchthispage": "停止監視",
     "notanarticle": "不是頁面",
     "notvisiblerev": "上次由不同用戶所作的修訂版本已經刪除",
-    "watchlist-details": "不包含討論頁,您的監視列表上有 $1 個頁面。",
+    "watchlist-details": "不包含討論頁,您的監視列表上有$1個頁面。",
     "wlheader-enotif": "已經啟動電子郵件通知功能。",
     "wlheader-showupdated": "在{{GENDER:|你|妳|你}}上次檢視後有被修改過的頁面會顯示為'''粗體'''。",
     "watchmethod-recent": "檢查被監視頁面的最近編輯",
     "watching": "正在監視...",
     "unwatching": "正在停止監視...",
     "watcherrortext": "更改「$1」的監視列表設定時發生錯誤。",
-    "enotif_mailer": "{{SITENAME}}郵件通知器",
     "enotif_reset": "將所有頁面標為已閱讀",
     "enotif_impersonal_salutation": "{{SITENAME}}用戶",
     "enotif_subject_deleted": "{{SITENAME}}的「$1」頁面被$2刪除",
     "excontent": "內容為: 「$1」",
     "excontentauthor": "內容為:「$1」(而且唯一貢獻者為「[[Special:Contributions/$2|$2]]」)",
     "exbeforeblank": "被清空前的內容為:「$1」",
-    "exblank": "頁面為空",
     "delete-confirm": "刪除「$1」",
     "delete-legend": "刪除",
     "historywarning": "'''警告: '''您將要刪除的頁內含有約$1次{{PLURAL:$1|修訂}}的歷史:",
     "protect-otherreason-op": "其它理由",
     "protect-dropdown": "*通用保護理由\n** 過量的破壞\n** 過量的灌水\n** 反生產性編輯戰\n** 高流量頁面",
     "protect-edit-reasonlist": "編輯保護理由",
-    "protect-expiry-options": "1小時:1 hour,1天:1 day,1周:1 week,2周:2 weeks,1個月:1 month,3個月:3 months,6個月:6 months,1年:1 year,永久:infinite",
+    "protect-expiry-options": "1小時:1 hour,1天:1 day,1周:1 week,2周:2 weeks,1個月:1 month,3個月:3 months,6個月:6 months,1年:1 year,不限期:infinite",
     "restriction-type": "權限:",
     "restriction-level": "限制級別:",
     "minimum-size": "最小大小",
     "contributions-title": "$1 的使用者貢獻",
     "mycontris": "我的貢獻",
     "contribsub2": "{{GENDER:$3|$1}} 的貢獻 ($2)",
+    "contributions-userdoesnotexist": "用戶賬戶「$1」未曾註冊。",
     "nocontribs": "沒有找到符合特徵的更改。",
     "uctop": "(最新修改)",
     "month": "截止月份:",
     "sp-contributions-newbies-sub": "新手",
     "sp-contributions-newbies-title": "新手的用戶貢獻",
     "sp-contributions-blocklog": "封禁記錄",
+    "sp-contributions-suppresslog": "已隱藏的用戶貢獻",
     "sp-contributions-deleted": "已刪除的用戶貢獻",
     "sp-contributions-uploads": "上傳",
     "sp-contributions-logs": "日誌",
     "sp-contributions-blocked-notice": "這位用戶現時正在被封鎖中。\n最近的封鎖日誌項目在下面提供以便參考:",
     "sp-contributions-blocked-notice-anon": "這個IP地址現時正在被封鎖中。\n最近的封鎖日誌項目在下面提供以便參考:",
     "sp-contributions-search": "搜尋貢獻記錄",
-    "sp-contributions-suppresslog": "已隱藏的用戶貢獻",
     "sp-contributions-username": "IP位址或用戶名稱:",
     "sp-contributions-toponly": "只顯示最新修訂版本的編輯",
     "sp-contributions-newonly": "僅顯示建立頁面之編輯",
     "allmessagesname": "名稱",
     "allmessagesdefault": "預設的訊息文字",
     "allmessagescurrent": "現時的訊息文字",
-    "allmessagestext": "這裡列出所有可定製的系統界面。\n如果想貢獻正宗的MediaWiki本地化的話,請參閱[https://www.mediawiki.org/wiki/Localisation MediaWiki本地化]以及[//translatewiki.net translatewiki.net]。",
+    "allmessagestext": "這裡列出所有可定製的系統界面。\n如果想貢獻正宗的MediaWiki本地化的話,請參閱[https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation MediaWiki本地化]以及[//translatewiki.net translatewiki.net]。",
     "allmessagesnotsupportedDB": "這個頁面無法使用,因為'''$wgUseDatabaseMessages'''已被設定關閉。",
     "allmessages-filter-legend": "搜尋",
     "allmessages-filter": "以自定狀況過濾:",
     "importunknownsource": "未知的源匯入類型",
     "importcantopen": "無法打開匯入檔案",
     "importbadinterwiki": "損壞的內部 wiki 連結",
-    "importnotext": "空或沒有文字",
     "importsuccess": "匯入完成!",
-    "importhistoryconflict": "存在衝突的修訂歷史(可能在之前已經匯入過此頁面)",
     "importnosources": "跨Wiki匯入源沒有定義,同時不允許直接的歷史上傳。",
     "importnofile": "沒有上傳匯入檔案。",
     "importuploaderrorsize": "上載匯入檔案失敗。檔案大於可以允許的上傳大小。",
     "tooltip-ca-move": "移動本頁",
     "tooltip-ca-watch": "將此頁面加入監視列表",
     "tooltip-ca-unwatch": "將此頁面從監視列表中移除",
-    "tooltip-search": "搜尋該網站",
+    "tooltip-search": "搜尋{{SITENAME}}",
     "tooltip-search-go": "如果相同的標題存在的話便直接前往該頁面",
     "tooltip-search-fulltext": "搜尋該文字的頁面",
     "tooltip-p-logo": "訪問首頁",
     "version-entrypoints": "入口點URL",
     "version-entrypoints-header-entrypoint": "入口點",
     "version-entrypoints-header-url": "URL",
-    "version-entrypoints-articlepath": "[https://www.mediawiki.org/wiki/Manual:$wgArticlePath 條目路徑]",
+    "version-entrypoints-articlepath": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgArticlePath 條目路徑]",
     "redirect": "重定向檔案、用戶、頁面或修訂ID",
     "redirect-legend": "重定向到檔案或頁面",
     "redirect-summary": "此特殊頁面重定向到檔案(請指定檔案名)、頁面(請指定修訂ID或頁面ID)或用戶頁(請指定用戶ID數值)。用法:[[{{#Special:Redirect}}/file/Example.jpg]]、[[{{#Special:Redirect}}/page/64308]]、[[{{#Special:Redirect}}/revision/328429]]或[[{{#Special:Redirect}}/user/101]]。",
     "limitreport-templateargumentsize": "模板參數大小",
     "limitreport-templateargumentsize-value": "$1/$2 個{{PLURAL:$2|位元組}}",
     "limitreport-expansiondepth": "最高展開深度",
-    "limitreport-expensivefunctioncount": "昂貴分析器函數計數",
+    "limitreport-expensivefunctioncount": "高開銷分析函數數位",
     "expandtemplates": "展開模板",
     "expand_templates_intro": "本特殊頁面用於將一些文字中的模版展開,包括模版中引用的模版。同時也展開解譯器函數如<nowiki>{{</nowiki>#language:...}},以及變數如<nowiki>{{</nowiki>CURRENTDAY}}&mdash;實際上,幾乎所有在雙括弧中的內容都被展開。",
     "expand_templates_title": "上下文標題,用於 {{FULLPAGENAME}} 等:",
     "expand_templates_remove_nowiki": "在結果中隱藏<nowiki>標記",
     "expand_templates_generate_xml": "顯示XML語法樹",
     "expand_templates_generate_rawhtml": "顯示原始HTML",
-    "expand_templates_preview": "預覽",
-    "trackingcategories": "跟蹤分類",
-    "trackingcategories-summary": "當前頁面收錄由MediaWiki軟體自動加入的跟蹤分類。名稱可經由{{ns:8}}名字空間對於系統資訊修改之。",
-    "trackingcategories-msg": "跟蹤分類",
-    "trackingcategories-name": "資訊名",
-    "trackingcategories-desc": "分類收錄準則",
-    "noindex-category-desc": "頁面中存在<nowiki>__NOINDEX__</nowiki>魔術字(並且於標記允許名字空間)並藉此未被機械人索引。",
-    "index-category-desc": "頁面中存在<nowiki>__INDEX__</nowiki>魔術字(並且於標記允許名字空間)並藉此被機械人錯誤索引。",
-    "post-expand-template-inclusion-category-desc": "展開所有模板后,頁面大小大於$wgMaxArticleSize,藉此某些模板未展開。",
-    "post-expand-template-argument-category-desc": "展開模板參數(三隊花括弧內,例如{{{Foo}}})後,頁面大於$wgMaxArticleSize。",
-    "expensive-parserfunction-category-desc": "頁面包含太多高開銷函數解析器(例如#ifexists)。參見[https://www.mediawiki.org/wiki/Manual:$wgExpensiveParserFunctionLimit Manual:$wgExpensiveParserFunctionLimit]。",
-    "broken-file-category-desc": "黨頁面包含受損檔案連接(連入被嵌入之不存在檔案)時。",
-    "hidden-category-category-desc": "此分類帶有<nowiki>__HIDDENCAT__</nowiki>,它預設防止於頁面分類連接盒中顯示。",
-    "trackingcategories-nodesc": "並無說明。",
-    "trackingcategories-disabled": "分類被禁用"
+    "expand_templates_preview": "預覽"
 }
index 437c47c..cd4ce7a 100644 (file)
@@ -80,7 +80,6 @@
     "currentevents": "Izehlakalo ezimanje",
     "currentevents-url": "Project:Izehlakalo ezimanje",
     "edithelp": "Usizo ngokuhlela",
-    "helppage": "Help:Isiqikili",
     "mainpage": "Ikhasi Elikhulu",
     "mainpage-description": "Ikhasi Elikhulu",
     "portal": "Umnyango wamgwamanda",
index 4e2b919..6109535 100644 (file)
@@ -129,7 +129,7 @@ $namespaceGenderAliases = array(
        NS_USER_TALK => array(
                'male' => 'نقاش_المستخدم',
                'female' => 'نقاش_المستخدمة'
-       ), 
+       ),
 );
 
 $magicWords = array(
index 05db874..6d40d8a 100644 (file)
@@ -408,7 +408,7 @@ $specialPageAliases = array(
        'DoubleRedirects'           => array( 'DoubleRedirects' ),
        'EditWatchlist'             => array( 'EditWatchlist' ),
        'Emailuser'                 => array( 'EmailUser' ),
-       'ExpandTemplates'           => array( 'ExpandTemplates', 'Expantemplates' ),
+       'ExpandTemplates'           => array( 'ExpandTemplates' ),
        'Export'                    => array( 'Export' ),
        'Fewestrevisions'           => array( 'FewestRevisions' ),
        'FileDuplicateSearch'       => array( 'FileDuplicateSearch' ),
@@ -518,7 +518,6 @@ $imageFiles = array(
        'button-headline' => 'button_headline.png',
        'button-image'    => 'button_image.png',
        'button-media'    => 'button_media.png',
-       'button-math'     => 'button_math.png',
        'button-nowiki'   => 'button_nowiki.png',
        'button-sig'      => 'button_sig.png',
        'button-hr'       => 'button_hr.png',
index 2bb7599..8b0b7b1 100644 (file)
@@ -36,7 +36,7 @@ $digitTransformTable = array(
 
 $linkTrail = "/^([a-z\x{0B00}-\x{0B7F}]+)(.*)$/sDu";
 
-/** namespace translations from translatewiki.net 
+/** namespace translations from translatewiki.net
  * @author Shijualex
  * @author Psubhashish
  */
index 8a0eb9b..aba939d 100644 (file)
@@ -96,7 +96,7 @@ $namespaceAliases = array(
 
 $namespaceGenderAliases = array(
        NS_USER => array( 'male' => 'Użytkownik', 'female' => 'Użytkowniczka' ),
-       NS_USER_TALK => array( 'male' => 'Dyskusja_użytkownika', 'female' => 'Dyskusja_użytkowniczki' ), 
+       NS_USER_TALK => array( 'male' => 'Dyskusja_użytkownika', 'female' => 'Dyskusja_użytkowniczki' ),
 );
 
 $dateFormats = array(
diff --git a/languages/utils/CLDRPluralRuleConverter.php b/languages/utils/CLDRPluralRuleConverter.php
new file mode 100644 (file)
index 0000000..65d57e0
--- /dev/null
@@ -0,0 +1,313 @@
+<?php
+
+/**
+ * @author Niklas Laxström, Tim Starling
+ *
+ * @copyright Copyright © 2010-2012, Niklas Laxström
+ * @license http://www.gnu.org/copyleft/gpl.html GNU General Public License 2.0 or later
+ *
+ * @file
+ * @since 1.20
+ */
+
+/**
+ * Helper class for converting rules to reverse polish notation (RPN).
+ */
+class CLDRPluralRuleConverter {
+       /**
+        * The input string
+        *
+        * @var string
+        */
+       public $rule;
+
+       /**
+        * The current position
+        *
+        * @var int
+        */
+       public $pos;
+
+       /**
+        * The past-the-end position
+        *
+        * @var int
+        */
+       public $end;
+
+       /**
+        * The operator stack
+        *
+        * @var array
+        */
+       public $operators = array();
+
+       /**
+        * The operand stack
+        *
+        * @var array
+        */
+       public $operands = array();
+
+       /**
+        * Precedence levels. Note that there's no need to worry about associativity
+        * for the level 4 operators, since they return boolean and don't accept
+        * boolean inputs.
+        */
+       static $precedence = array(
+               'or' => 2,
+               'and' => 3,
+               'is' => 4,
+               'is-not' => 4,
+               'in' => 4,
+               'not-in' => 4,
+               'within' => 4,
+               'not-within' => 4,
+               'mod' => 5,
+               ',' => 6,
+               '..' => 7,
+       );
+
+       /**
+        * A character list defining whitespace, for use in strspn() etc.
+        */
+       const WHITESPACE_CLASS = " \t\r\n";
+
+       /**
+        * Same for digits. Note that the grammar given in UTS #35 doesn't allow
+        * negative numbers or decimal separators.
+        */
+       const NUMBER_CLASS = '0123456789';
+
+       /**
+        * A character list of symbolic operands.
+        */
+       const OPERAND_SYMBOLS = 'nivwft';
+
+       /**
+        * An anchored regular expression which matches a word at the current offset.
+        */
+       const WORD_REGEX = '/[a-zA-Z@]+/A';
+
+       /**
+        * Convert a rule to RPN. This is the only public entry point.
+        *
+        * @param string $rule The rule to convert
+        * @return string The RPN representation of the rule
+        */
+       public static function convert( $rule ) {
+               $parser = new self( $rule );
+               return $parser->doConvert();
+       }
+
+       /**
+        * Private constructor.
+        */
+       protected function __construct( $rule ) {
+               $this->rule = $rule;
+               $this->pos = 0;
+               $this->end = strlen( $rule );
+       }
+
+       /**
+        * Do the operation.
+        *
+        * @return string The RPN representation of the rule (e.g. "5 3 mod n is")
+        */
+       protected function doConvert() {
+               $expectOperator = true;
+
+               // Iterate through all tokens, saving the operators and operands to a
+               // stack per Dijkstra's shunting yard algorithm.
+               /** @var CLDRPluralRuleConverter_Operator $token */
+               while ( false !== ( $token = $this->nextToken() ) ) {
+                       // In this grammar, there are only binary operators, so every valid
+                       // rule string will alternate between operator and operand tokens.
+                       $expectOperator = !$expectOperator;
+
+                       if ( $token instanceof CLDRPluralRuleConverter_Expression ) {
+                               // Operand
+                               if ( $expectOperator ) {
+                                       $token->error( 'unexpected operand' );
+                               }
+                               $this->operands[] = $token;
+                               continue;
+                       } else {
+                               // Operator
+                               if ( !$expectOperator ) {
+                                       $token->error( 'unexpected operator' );
+                               }
+                               // Resolve higher precedence levels
+                               $lastOp = end( $this->operators );
+                               while ( $lastOp && self::$precedence[$token->name] <= self::$precedence[$lastOp->name] ) {
+                                       $this->doOperation( $lastOp, $this->operands );
+                                       array_pop( $this->operators );
+                                       $lastOp = end( $this->operators );
+                               }
+                               $this->operators[] = $token;
+                       }
+               }
+
+               // Finish off the stack
+               while ( $op = array_pop( $this->operators ) ) {
+                       $this->doOperation( $op, $this->operands );
+               }
+
+               // Make sure the result is sane. The first case is possible for an empty
+               // string input, the second should be unreachable.
+               if ( !count( $this->operands ) ) {
+                       $this->error( 'condition expected' );
+               } elseif ( count( $this->operands ) > 1 ) {
+                       $this->error( 'missing operator or too many operands' );
+               }
+
+               $value = $this->operands[0];
+               if ( $value->type !== 'boolean' ) {
+                       $this->error( 'the result must have a boolean type' );
+               }
+
+               return $this->operands[0]->rpn;
+       }
+
+       /**
+        * Fetch the next token from the input string.
+        *
+        * @return CLDRPluralRuleConverter_Fragment The next token
+        */
+       protected function nextToken() {
+               if ( $this->pos >= $this->end ) {
+                       return false;
+               }
+
+               // Whitespace
+               $length = strspn( $this->rule, self::WHITESPACE_CLASS, $this->pos );
+               $this->pos += $length;
+
+               if ( $this->pos >= $this->end ) {
+                       return false;
+               }
+
+               // Number
+               $length = strspn( $this->rule, self::NUMBER_CLASS, $this->pos );
+               if ( $length !== 0 ) {
+                       $token = $this->newNumber( substr( $this->rule, $this->pos, $length ), $this->pos );
+                       $this->pos += $length;
+                       return $token;
+               }
+
+               // Two-character operators
+               $op2 = substr( $this->rule, $this->pos, 2 );
+               if ( $op2 === '..' || $op2 === '!=' ) {
+                       $token = $this->newOperator( $op2, $this->pos, 2 );
+                       $this->pos += 2;
+                       return $token;
+               }
+
+               // Single-character operators
+               $op1 = $this->rule[$this->pos];
+               if ( $op1 === ',' || $op1 === '=' || $op1 === '%' ) {
+                       $token = $this->newOperator( $op1, $this->pos, 1 );
+                       $this->pos ++;
+                       return $token;
+               }
+
+               // Word
+               if ( !preg_match( self::WORD_REGEX, $this->rule, $m, 0, $this->pos ) ) {
+                       $this->error( 'unexpected character "' . $this->rule[$this->pos] . '"' );
+               }
+               $word1 = strtolower( $m[0] );
+               $word2 = '';
+               $nextTokenPos = $this->pos + strlen( $word1 );
+               if ( $word1 === 'not' || $word1 === 'is' ) {
+                       // Look ahead one word
+                       $nextTokenPos += strspn( $this->rule, self::WHITESPACE_CLASS, $nextTokenPos );
+                       if ( $nextTokenPos < $this->end
+                               && preg_match( self::WORD_REGEX, $this->rule, $m, 0, $nextTokenPos )
+                       ) {
+                               $word2 = strtolower( $m[0] );
+                               $nextTokenPos += strlen( $word2 );
+                       }
+               }
+
+               // Two-word operators like "is not" take precedence over single-word operators like "is"
+               if ( $word2 !== '' ) {
+                       $bothWords = "{$word1}-{$word2}";
+                       if ( isset( self::$precedence[$bothWords] ) ) {
+                               $token = $this->newOperator( $bothWords, $this->pos, $nextTokenPos - $this->pos );
+                               $this->pos = $nextTokenPos;
+                               return $token;
+                       }
+               }
+
+               // Single-word operators
+               if ( isset( self::$precedence[$word1] ) ) {
+                       $token = $this->newOperator( $word1, $this->pos, strlen( $word1 ) );
+                       $this->pos += strlen( $word1 );
+                       return $token;
+               }
+
+               // The single-character operand symbols
+               if ( strpos( self::OPERAND_SYMBOLS, $word1 ) !== false ) {
+                       $token = $this->newNumber( $word1, $this->pos );
+                       $this->pos ++;
+                       return $token;
+               }
+
+               // Samples
+               if ( $word1 === '@integer' || $word1 === '@decimal' ) {
+                       // Samples are like comments, they have no effect on rule evaluation.
+                       // They run from the first sample indicator to the end of the string.
+                       $this->pos = $this->end;
+                       return false;
+               }
+
+               $this->error( 'unrecognised word' );
+       }
+
+       /**
+        * For the binary operator $op, pop its operands off the stack and push
+        * a fragment with rpn and type members describing the result of that
+        * operation.
+        *
+        * @param CLDRPluralRuleConverter_Operator $op
+        */
+       protected function doOperation( $op ) {
+               if ( count( $this->operands ) < 2 ) {
+                       $op->error( 'missing operand' );
+               }
+               $right = array_pop( $this->operands );
+               $left = array_pop( $this->operands );
+               $result = $op->operate( $left, $right );
+               $this->operands[] = $result;
+       }
+
+       /**
+        * Create a numerical expression object
+        *
+        * @param string $text
+        * @param int $pos
+        * @return CLDRPluralRuleConverter_Expression The numerical expression
+        */
+       protected function newNumber( $text, $pos ) {
+               return new CLDRPluralRuleConverter_Expression( $this, 'number', $text, $pos, strlen( $text ) );
+       }
+
+       /**
+        * Create a binary operator
+        *
+        * @param string $type
+        * @param int $pos
+        * @param int $length
+        * @return CLDRPluralRuleConverter_Operator The operator
+        */
+       protected function newOperator( $type, $pos, $length ) {
+               return new CLDRPluralRuleConverter_Operator( $this, $type, $pos, $length );
+       }
+
+       /**
+        * Throw an error
+        */
+       protected function error( $message ) {
+               throw new CLDRPluralRuleError( $message );
+       }
+}
diff --git a/languages/utils/CLDRPluralRuleConverter_Expression.php b/languages/utils/CLDRPluralRuleConverter_Expression.php
new file mode 100644 (file)
index 0000000..8352e72
--- /dev/null
@@ -0,0 +1,41 @@
+<?php
+
+/**
+ * @author Niklas Laxström, Tim Starling
+ *
+ * @copyright Copyright © 2010-2012, Niklas Laxström
+ * @license http://www.gnu.org/copyleft/gpl.html GNU General Public License 2.0 or later
+ *
+ * @file
+ * @since 1.20
+ */
+
+/**
+ * Helper for CLDRPluralRuleConverter.
+ * An expression object, representing a region of the input string (for error
+ * messages), the RPN notation used to evaluate it, and the result type for
+ * validation.
+ */
+class CLDRPluralRuleConverter_Expression extends CLDRPluralRuleConverter_Fragment {
+       /** @var string */
+       public $type;
+
+       /** @var string */
+       public $rpn;
+
+       function __construct( $parser, $type, $rpn, $pos, $length ) {
+               parent::__construct( $parser, $pos, $length );
+               $this->type = $type;
+               $this->rpn = $rpn;
+       }
+
+       public function isType( $type ) {
+               if ( $type === 'range' && ( $this->type === 'range' || $this->type === 'number' ) ) {
+                       return true;
+               }
+               if ( $type === $this->type ) {
+                       return true;
+               }
+               return false;
+       }
+}
diff --git a/languages/utils/CLDRPluralRuleConverter_Fragment.php b/languages/utils/CLDRPluralRuleConverter_Fragment.php
new file mode 100644 (file)
index 0000000..88795a0
--- /dev/null
@@ -0,0 +1,35 @@
+<?php
+
+/**
+ * @author Niklas Laxström, Tim Starling
+ *
+ * @copyright Copyright © 2010-2012, Niklas Laxström
+ * @license http://www.gnu.org/copyleft/gpl.html GNU General Public License 2.0 or later
+ *
+ * @file
+ * @since 1.20
+ */
+
+/**
+ * Helper for CLDRPluralRuleConverter.
+ * The base class for operators and expressions, describing a region of the input string.
+ */
+class CLDRPluralRuleConverter_Fragment {
+       public $parser, $pos, $length, $end;
+
+       function __construct( $parser, $pos, $length ) {
+               $this->parser = $parser;
+               $this->pos = $pos;
+               $this->length = $length;
+               $this->end = $pos + $length;
+       }
+
+       public function error( $message ) {
+               $text = $this->getText();
+               throw new CLDRPluralRuleError( "$message at position " . ( $this->pos + 1 ) . ": \"$text\"" );
+       }
+
+       public function getText() {
+               return substr( $this->parser->rule, $this->pos, $this->length );
+       }
+}
diff --git a/languages/utils/CLDRPluralRuleConverter_Operator.php b/languages/utils/CLDRPluralRuleConverter_Operator.php
new file mode 100644 (file)
index 0000000..c42953c
--- /dev/null
@@ -0,0 +1,114 @@
+<?php
+
+/**
+ * @author Niklas Laxström, Tim Starling
+ *
+ * @copyright Copyright © 2010-2012, Niklas Laxström
+ * @license http://www.gnu.org/copyleft/gpl.html GNU General Public License 2.0 or later
+ *
+ * @file
+ * @since 1.20
+ */
+
+/**
+ * Helper for CLDRPluralRuleConverter.
+ * An operator object, representing a region of the input string (for error
+ * messages), and the binary operator at that location.
+ */
+class CLDRPluralRuleConverter_Operator extends CLDRPluralRuleConverter_Fragment {
+       /** @var string The name */
+       public $name;
+
+       /**
+        * Each op type has three characters: left operand type, right operand type and result type
+        *
+        *   b = boolean
+        *   n = number
+        *   r = range
+        *
+        * A number is a kind of range.
+        *
+        * @var array
+        */
+       static $opTypes = array(
+               'or' => 'bbb',
+               'and' => 'bbb',
+               'is' => 'nnb',
+               'is-not' => 'nnb',
+               'in' => 'nrb',
+               'not-in' => 'nrb',
+               'within' => 'nrb',
+               'not-within' => 'nrb',
+               'mod' => 'nnn',
+               ',' => 'rrr',
+               '..' => 'nnr',
+       );
+
+       /**
+        * Map converting from the abbrevation to the full form.
+        *
+        * @var array
+        */
+       static $typeSpecMap = array(
+               'b' => 'boolean',
+               'n' => 'number',
+               'r' => 'range',
+       );
+
+       /**
+        * Map for converting the new operators introduced in Rev 33 to the old forms
+        */
+       static $aliasMap = array(
+               '%' => 'mod',
+               '!=' => 'not-in',
+               '=' => 'in'
+       );
+
+       /**
+        * Initialize a new instance of a CLDRPluralRuleConverter_Operator object
+        *
+        * @param CLDRPluralRuleConverter $parser The parser
+        * @param string $name The operator name
+        * @param int $pos The length
+        * @param int $length
+        */
+       function __construct( $parser, $name, $pos, $length ) {
+               parent::__construct( $parser, $pos, $length );
+               if ( isset( self::$aliasMap[$name] ) ) {
+                       $name = self::$aliasMap[$name];
+               }
+               $this->name = $name;
+       }
+
+       /**
+        * Compute the operation
+        *
+        * @param CLDRPluralRuleConverter_Expression $left The left part of the expression
+        * @param CLDRPluralRuleConverter_Expression $right The right part of the expression
+        * @return CLDRPluralRuleConverter_Expression The result of the operation
+        */
+       public function operate( $left, $right ) {
+               $typeSpec = self::$opTypes[$this->name];
+
+               $leftType = self::$typeSpecMap[$typeSpec[0]];
+               $rightType = self::$typeSpecMap[$typeSpec[1]];
+               $resultType = self::$typeSpecMap[$typeSpec[2]];
+
+               $start = min( $this->pos, $left->pos, $right->pos );
+               $end = max( $this->end, $left->end, $right->end );
+               $length = $end - $start;
+
+               $newExpr = new CLDRPluralRuleConverter_Expression( $this->parser, $resultType,
+                       "{$left->rpn} {$right->rpn} {$this->name}",
+                       $start, $length );
+
+               if ( !$left->isType( $leftType ) ) {
+                       $newExpr->error( "invalid type for left operand: expected $leftType, got {$left->type}" );
+               }
+
+               if ( !$right->isType( $rightType ) ) {
+                       $newExpr->error( "invalid type for right operand: expected $rightType, got {$right->type}" );
+               }
+               return $newExpr;
+       }
+}
diff --git a/languages/utils/CLDRPluralRuleError.php b/languages/utils/CLDRPluralRuleError.php
new file mode 100644 (file)
index 0000000..2ca3410
--- /dev/null
@@ -0,0 +1,21 @@
+<?php
+
+/**
+ * @author Niklas Laxström, Tim Starling
+ *
+ * @copyright Copyright © 2010-2012, Niklas Laxström
+ * @license http://www.gnu.org/copyleft/gpl.html GNU General Public License 2.0 or later
+ *
+ * @file
+ * @since 1.20
+ */
+
+/**
+ * The exception class for all the classes in this file. This will be thrown
+ * back to the caller if there is any validation error.
+ */
+class CLDRPluralRuleError extends MWException {
+       function __construct( $message ) {
+               parent::__construct( 'CLDR plural rule error: ' . $message );
+       }
+}
\ No newline at end of file
index e420cb2..61ab947 100644 (file)
@@ -30,6 +30,7 @@
  * @file
  * @since 1.20
  */
+
 class CLDRPluralRuleEvaluator {
        /**
         * Evaluate a number against a set of plural rules. If a rule passes,
@@ -179,570 +180,3 @@ class CLDRPluralRuleEvaluator {
                }
        }
 }
-
-/**
- * Evaluator helper class representing a range list.
- */
-class CLDRPluralRuleEvaluator_Range {
-       /**
-        * The parts
-        *
-        * @var array
-        */
-       public $parts = array();
-
-       /**
-        * Initialize a new instance of CLDRPluralRuleEvaluator_Range
-        *
-        * @param int $start The start of the range
-        * @param int|bool $end The end of the range, or false if the range is not bounded.
-        */
-       function __construct( $start, $end = false ) {
-               if ( $end === false ) {
-                       $this->parts[] = $start;
-               } else {
-                       $this->parts[] = array( $start, $end );
-               }
-       }
-
-       /**
-        * Determine if the given number is inside the range.
-        *
-        * @param int $number The number to check
-        * @param bool $integerConstraint If true, also asserts the number is an integer; otherwise, number simply has to be inside the range.
-        * @return bool True if the number is inside the range; otherwise, false.
-        */
-       function isNumberIn( $number, $integerConstraint = true ) {
-               foreach ( $this->parts as $part ) {
-                       if ( is_array( $part ) ) {
-                               if ( ( !$integerConstraint || floor( $number ) === (float)$number )
-                                       && $number >= $part[0] && $number <= $part[1]
-                               ) {
-                                       return true;
-                               }
-                       } else {
-                               if ( $number == $part ) {
-                                       return true;
-                               }
-                       }
-               }
-               return false;
-       }
-
-       /**
-        * Readable alias for isNumberIn( $number, false ), and the implementation
-        * of the "within" operator.
-        *
-        * @param int $number The number to check
-        * @return bool True if the number is inside the range; otherwise, false.
-        */
-       function isNumberWithin( $number ) {
-               return $this->isNumberIn( $number, false );
-       }
-
-       /**
-        * Add another part to this range.
-        *
-        * @param CLDRPluralRuleEvaluator_Range|int $other The part to add, either
-        *   a range object itself or a single number.
-        */
-       function add( $other ) {
-               if ( $other instanceof self ) {
-                       $this->parts = array_merge( $this->parts, $other->parts );
-               } else {
-                       $this->parts[] = $other;
-               }
-       }
-
-       /**
-        * Returns the string representation of the rule evaluator range.
-        * The purpose of this method is to help debugging.
-        *
-        * @return string The string representation of the rule evaluator range
-        */
-       function __toString() {
-               $s = 'Range(';
-               foreach ( $this->parts as $i => $part ) {
-                       if ( $i ) {
-                               $s .= ', ';
-                       }
-                       if ( is_array( $part ) ) {
-                               $s .= $part[0] . '..' . $part[1];
-                       } else {
-                               $s .= $part;
-                       }
-               }
-               $s .= ')';
-               return $s;
-       }
-
-}
-
-/**
- * Helper class for converting rules to reverse polish notation (RPN).
- */
-class CLDRPluralRuleConverter {
-       /**
-        * The input string
-        *
-        * @var string
-        */
-       public $rule;
-
-       /**
-        * The current position
-        *
-        * @var int
-        */
-       public $pos;
-
-       /**
-        * The past-the-end position
-        *
-        * @var int
-        */
-       public $end;
-
-       /**
-        * The operator stack
-        *
-        * @var array
-        */
-       public $operators = array();
-
-       /**
-        * The operand stack
-        *
-        * @var array
-        */
-       public $operands = array();
-
-       /**
-        * Precedence levels. Note that there's no need to worry about associativity
-        * for the level 4 operators, since they return boolean and don't accept
-        * boolean inputs.
-        */
-       static $precedence = array(
-               'or' => 2,
-               'and' => 3,
-               'is' => 4,
-               'is-not' => 4,
-               'in' => 4,
-               'not-in' => 4,
-               'within' => 4,
-               'not-within' => 4,
-               'mod' => 5,
-               ',' => 6,
-               '..' => 7,
-       );
-
-       /**
-        * A character list defining whitespace, for use in strspn() etc.
-        */
-       const WHITESPACE_CLASS = " \t\r\n";
-
-       /**
-        * Same for digits. Note that the grammar given in UTS #35 doesn't allow
-        * negative numbers or decimal separators.
-        */
-       const NUMBER_CLASS = '0123456789';
-
-       /**
-        * A character list of symbolic operands.
-        */
-       const OPERAND_SYMBOLS = 'nivwft';
-
-       /**
-        * An anchored regular expression which matches a word at the current offset.
-        */
-       const WORD_REGEX = '/[a-zA-Z@]+/A';
-
-       /**
-        * Convert a rule to RPN. This is the only public entry point.
-        *
-        * @param string $rule The rule to convert
-        * @return string The RPN representation of the rule
-        */
-       public static function convert( $rule ) {
-               $parser = new self( $rule );
-               return $parser->doConvert();
-       }
-
-       /**
-        * Private constructor.
-        */
-       protected function __construct( $rule ) {
-               $this->rule = $rule;
-               $this->pos = 0;
-               $this->end = strlen( $rule );
-       }
-
-       /**
-        * Do the operation.
-        *
-        * @return string The RPN representation of the rule (e.g. "5 3 mod n is")
-        */
-       protected function doConvert() {
-               $expectOperator = true;
-
-               // Iterate through all tokens, saving the operators and operands to a
-               // stack per Dijkstra's shunting yard algorithm.
-               /** @var CLDRPluralRuleConverter_Operator $token */
-               while ( false !== ( $token = $this->nextToken() ) ) {
-                       // In this grammar, there are only binary operators, so every valid
-                       // rule string will alternate between operator and operand tokens.
-                       $expectOperator = !$expectOperator;
-
-                       if ( $token instanceof CLDRPluralRuleConverter_Expression ) {
-                               // Operand
-                               if ( $expectOperator ) {
-                                       $token->error( 'unexpected operand' );
-                               }
-                               $this->operands[] = $token;
-                               continue;
-                       } else {
-                               // Operator
-                               if ( !$expectOperator ) {
-                                       $token->error( 'unexpected operator' );
-                               }
-                               // Resolve higher precedence levels
-                               $lastOp = end( $this->operators );
-                               while ( $lastOp && self::$precedence[$token->name] <= self::$precedence[$lastOp->name] ) {
-                                       $this->doOperation( $lastOp, $this->operands );
-                                       array_pop( $this->operators );
-                                       $lastOp = end( $this->operators );
-                               }
-                               $this->operators[] = $token;
-                       }
-               }
-
-               // Finish off the stack
-               while ( $op = array_pop( $this->operators ) ) {
-                       $this->doOperation( $op, $this->operands );
-               }
-
-               // Make sure the result is sane. The first case is possible for an empty
-               // string input, the second should be unreachable.
-               if ( !count( $this->operands ) ) {
-                       $this->error( 'condition expected' );
-               } elseif ( count( $this->operands ) > 1 ) {
-                       $this->error( 'missing operator or too many operands' );
-               }
-
-               $value = $this->operands[0];
-               if ( $value->type !== 'boolean' ) {
-                       $this->error( 'the result must have a boolean type' );
-               }
-
-               return $this->operands[0]->rpn;
-       }
-
-       /**
-        * Fetch the next token from the input string.
-        *
-        * @return CLDRPluralRuleConverter_Fragment The next token
-        */
-       protected function nextToken() {
-               if ( $this->pos >= $this->end ) {
-                       return false;
-               }
-
-               // Whitespace
-               $length = strspn( $this->rule, self::WHITESPACE_CLASS, $this->pos );
-               $this->pos += $length;
-
-               if ( $this->pos >= $this->end ) {
-                       return false;
-               }
-
-               // Number
-               $length = strspn( $this->rule, self::NUMBER_CLASS, $this->pos );
-               if ( $length !== 0 ) {
-                       $token = $this->newNumber( substr( $this->rule, $this->pos, $length ), $this->pos );
-                       $this->pos += $length;
-                       return $token;
-               }
-
-               // Two-character operators
-               $op2 = substr( $this->rule, $this->pos, 2 );
-               if ( $op2 === '..' || $op2 === '!=' ) {
-                       $token = $this->newOperator( $op2, $this->pos, 2 );
-                       $this->pos += 2;
-                       return $token;
-               }
-
-               // Single-character operators
-               $op1 = $this->rule[$this->pos];
-               if ( $op1 === ',' || $op1 === '=' || $op1 === '%' ) {
-                       $token = $this->newOperator( $op1, $this->pos, 1 );
-                       $this->pos ++;
-                       return $token;
-               }
-
-               // Word
-               if ( !preg_match( self::WORD_REGEX, $this->rule, $m, 0, $this->pos ) ) {
-                       $this->error( 'unexpected character "' . $this->rule[$this->pos] . '"' );
-               }
-               $word1 = strtolower( $m[0] );
-               $word2 = '';
-               $nextTokenPos = $this->pos + strlen( $word1 );
-               if ( $word1 === 'not' || $word1 === 'is' ) {
-                       // Look ahead one word
-                       $nextTokenPos += strspn( $this->rule, self::WHITESPACE_CLASS, $nextTokenPos );
-                       if ( $nextTokenPos < $this->end
-                               && preg_match( self::WORD_REGEX, $this->rule, $m, 0, $nextTokenPos )
-                       ) {
-                               $word2 = strtolower( $m[0] );
-                               $nextTokenPos += strlen( $word2 );
-                       }
-               }
-
-               // Two-word operators like "is not" take precedence over single-word operators like "is"
-               if ( $word2 !== '' ) {
-                       $bothWords = "{$word1}-{$word2}";
-                       if ( isset( self::$precedence[$bothWords] ) ) {
-                               $token = $this->newOperator( $bothWords, $this->pos, $nextTokenPos - $this->pos );
-                               $this->pos = $nextTokenPos;
-                               return $token;
-                       }
-               }
-
-               // Single-word operators
-               if ( isset( self::$precedence[$word1] ) ) {
-                       $token = $this->newOperator( $word1, $this->pos, strlen( $word1 ) );
-                       $this->pos += strlen( $word1 );
-                       return $token;
-               }
-
-               // The single-character operand symbols
-               if ( strpos( self::OPERAND_SYMBOLS, $word1 ) !== false ) {
-                       $token = $this->newNumber( $word1, $this->pos );
-                       $this->pos ++;
-                       return $token;
-               }
-
-               // Samples
-               if ( $word1 === '@integer' || $word1 === '@decimal' ) {
-                       // Samples are like comments, they have no effect on rule evaluation.
-                       // They run from the first sample indicator to the end of the string.
-                       $this->pos = $this->end;
-                       return false;
-               }
-
-               $this->error( 'unrecognised word' );
-       }
-
-       /**
-        * For the binary operator $op, pop its operands off the stack and push
-        * a fragment with rpn and type members describing the result of that
-        * operation.
-        *
-        * @param CLDRPluralRuleConverter_Operator $op
-        */
-       protected function doOperation( $op ) {
-               if ( count( $this->operands ) < 2 ) {
-                       $op->error( 'missing operand' );
-               }
-               $right = array_pop( $this->operands );
-               $left = array_pop( $this->operands );
-               $result = $op->operate( $left, $right );
-               $this->operands[] = $result;
-       }
-
-       /**
-        * Create a numerical expression object
-        *
-        * @param string $text
-        * @param int $pos
-        * @return CLDRPluralRuleConverter_Expression The numerical expression
-        */
-       protected function newNumber( $text, $pos ) {
-               return new CLDRPluralRuleConverter_Expression( $this, 'number', $text, $pos, strlen( $text ) );
-       }
-
-       /**
-        * Create a binary operator
-        *
-        * @param string $type
-        * @param int $pos
-        * @param int $length
-        * @return CLDRPluralRuleConverter_Operator The operator
-        */
-       protected function newOperator( $type, $pos, $length ) {
-               return new CLDRPluralRuleConverter_Operator( $this, $type, $pos, $length );
-       }
-
-       /**
-        * Throw an error
-        */
-       protected function error( $message ) {
-               throw new CLDRPluralRuleError( $message );
-       }
-}
-
-/**
- * Helper for CLDRPluralRuleConverter.
- * The base class for operators and expressions, describing a region of the input string.
- */
-class CLDRPluralRuleConverter_Fragment {
-       public $parser, $pos, $length, $end;
-
-       function __construct( $parser, $pos, $length ) {
-               $this->parser = $parser;
-               $this->pos = $pos;
-               $this->length = $length;
-               $this->end = $pos + $length;
-       }
-
-       public function error( $message ) {
-               $text = $this->getText();
-               throw new CLDRPluralRuleError( "$message at position " . ( $this->pos + 1 ) . ": \"$text\"" );
-       }
-
-       public function getText() {
-               return substr( $this->parser->rule, $this->pos, $this->length );
-       }
-}
-
-/**
- * Helper for CLDRPluralRuleConverter.
- * An expression object, representing a region of the input string (for error
- * messages), the RPN notation used to evaluate it, and the result type for
- * validation.
- */
-class CLDRPluralRuleConverter_Expression extends CLDRPluralRuleConverter_Fragment {
-       /** @var string */
-       public $type;
-
-       /** @var string */
-       public $rpn;
-
-       function __construct( $parser, $type, $rpn, $pos, $length ) {
-               parent::__construct( $parser, $pos, $length );
-               $this->type = $type;
-               $this->rpn = $rpn;
-       }
-
-       public function isType( $type ) {
-               if ( $type === 'range' && ( $this->type === 'range' || $this->type === 'number' ) ) {
-                       return true;
-               }
-               if ( $type === $this->type ) {
-                       return true;
-               }
-               return false;
-       }
-}
-
-/**
- * Helper for CLDRPluralRuleConverter.
- * An operator object, representing a region of the input string (for error
- * messages), and the binary operator at that location.
- */
-class CLDRPluralRuleConverter_Operator extends CLDRPluralRuleConverter_Fragment {
-       /** @var string The name */
-       public $name;
-
-       /**
-        * Each op type has three characters: left operand type, right operand type and result type
-        *
-        *   b = boolean
-        *   n = number
-        *   r = range
-        *
-        * A number is a kind of range.
-        *
-        * @var array
-        */
-       static $opTypes = array(
-               'or' => 'bbb',
-               'and' => 'bbb',
-               'is' => 'nnb',
-               'is-not' => 'nnb',
-               'in' => 'nrb',
-               'not-in' => 'nrb',
-               'within' => 'nrb',
-               'not-within' => 'nrb',
-               'mod' => 'nnn',
-               ',' => 'rrr',
-               '..' => 'nnr',
-       );
-
-       /**
-        * Map converting from the abbrevation to the full form.
-        *
-        * @var array
-        */
-       static $typeSpecMap = array(
-               'b' => 'boolean',
-               'n' => 'number',
-               'r' => 'range',
-       );
-
-       /**
-        * Map for converting the new operators introduced in Rev 33 to the old forms
-        */
-       static $aliasMap = array(
-               '%' => 'mod',
-               '!=' => 'not-in',
-               '=' => 'in'
-       );
-
-       /**
-        * Initialize a new instance of a CLDRPluralRuleConverter_Operator object
-        *
-        * @param CLDRPluralRuleConverter $parser The parser
-        * @param string $name The operator name
-        * @param int $pos The length
-        * @param int $length
-        */
-       function __construct( $parser, $name, $pos, $length ) {
-               parent::__construct( $parser, $pos, $length );
-               if ( isset( self::$aliasMap[$name] ) ) {
-                       $name = self::$aliasMap[$name];
-               }
-               $this->name = $name;
-       }
-
-       /**
-        * Compute the operation
-        *
-        * @param CLDRPluralRuleConverter_Expression $left The left part of the expression
-        * @param CLDRPluralRuleConverter_Expression $right The right part of the expression
-        * @return CLDRPluralRuleConverter_Expression The result of the operation
-        */
-       public function operate( $left, $right ) {
-               $typeSpec = self::$opTypes[$this->name];
-
-               $leftType = self::$typeSpecMap[$typeSpec[0]];
-               $rightType = self::$typeSpecMap[$typeSpec[1]];
-               $resultType = self::$typeSpecMap[$typeSpec[2]];
-
-               $start = min( $this->pos, $left->pos, $right->pos );
-               $end = max( $this->end, $left->end, $right->end );
-               $length = $end - $start;
-
-               $newExpr = new CLDRPluralRuleConverter_Expression( $this->parser, $resultType,
-                       "{$left->rpn} {$right->rpn} {$this->name}",
-                       $start, $length );
-
-               if ( !$left->isType( $leftType ) ) {
-                       $newExpr->error( "invalid type for left operand: expected $leftType, got {$left->type}" );
-               }
-
-               if ( !$right->isType( $rightType ) ) {
-                       $newExpr->error( "invalid type for right operand: expected $rightType, got {$right->type}" );
-               }
-               return $newExpr;
-       }
-}
-
-/**
- * The exception class for all the classes in this file. This will be thrown
- * back to the caller if there is any validation error.
- */
-class CLDRPluralRuleError extends MWException {
-       function __construct( $message ) {
-               parent::__construct( 'CLDR plural rule error: ' . $message );
-       }
-}
diff --git a/languages/utils/CLDRPluralRuleEvaluator_Range.php b/languages/utils/CLDRPluralRuleEvaluator_Range.php
new file mode 100644 (file)
index 0000000..9732b8d
--- /dev/null
@@ -0,0 +1,108 @@
+<?php
+/**
+ * @author Niklas Laxström, Tim Starling
+ *
+ * @copyright Copyright © 2010-2012, Niklas Laxström
+ * @license http://www.gnu.org/copyleft/gpl.html GNU General Public License 2.0 or later
+ *
+ * @file
+ * @since 1.20
+ */
+
+/**
+ * Evaluator helper class representing a range list.
+ */
+class CLDRPluralRuleEvaluator_Range {
+       /**
+        * The parts
+        *
+        * @var array
+        */
+       public $parts = array();
+
+       /**
+        * Initialize a new instance of CLDRPluralRuleEvaluator_Range
+        *
+        * @param int $start The start of the range
+        * @param int|bool $end The end of the range, or false if the range is not bounded.
+        */
+       function __construct( $start, $end = false ) {
+               if ( $end === false ) {
+                       $this->parts[] = $start;
+               } else {
+                       $this->parts[] = array( $start, $end );
+               }
+       }
+
+       /**
+        * Determine if the given number is inside the range.
+        *
+        * @param int $number The number to check
+        * @param bool $integerConstraint If true, also asserts the number is an integer; otherwise, number simply has to be inside the range.
+        * @return bool True if the number is inside the range; otherwise, false.
+        */
+       function isNumberIn( $number, $integerConstraint = true ) {
+               foreach ( $this->parts as $part ) {
+                       if ( is_array( $part ) ) {
+                               if ( ( !$integerConstraint || floor( $number ) === (float)$number )
+                                       && $number >= $part[0] && $number <= $part[1]
+                               ) {
+                                       return true;
+                               }
+                       } else {
+                               if ( $number == $part ) {
+                                       return true;
+                               }
+                       }
+               }
+               return false;
+       }
+
+       /**
+        * Readable alias for isNumberIn( $number, false ), and the implementation
+        * of the "within" operator.
+        *
+        * @param int $number The number to check
+        * @return bool True if the number is inside the range; otherwise, false.
+        */
+       function isNumberWithin( $number ) {
+               return $this->isNumberIn( $number, false );
+       }
+
+       /**
+        * Add another part to this range.
+        *
+        * @param CLDRPluralRuleEvaluator_Range|int $other The part to add, either
+        *   a range object itself or a single number.
+        */
+       function add( $other ) {
+               if ( $other instanceof self ) {
+                       $this->parts = array_merge( $this->parts, $other->parts );
+               } else {
+                       $this->parts[] = $other;
+               }
+       }
+
+       /**
+        * Returns the string representation of the rule evaluator range.
+        * The purpose of this method is to help debugging.
+        *
+        * @return string The string representation of the rule evaluator range
+        */
+       function __toString() {
+               $s = 'Range(';
+               foreach ( $this->parts as $i => $part ) {
+                       if ( $i ) {
+                               $s .= ', ';
+                       }
+                       if ( is_array( $part ) ) {
+                               $s .= $part[0] . '..' . $part[1];
+                       } else {
+                               $s .= $part;
+                       }
+               }
+               $s .= ')';
+               return $s;
+       }
+
+}
index 3eff534..9f11c63 100644 (file)
@@ -70,7 +70,7 @@ class BenchmarkDeleteTruncate extends Benchmarker {
        }
 
        /**
-        * @param  $dbw DatabaseBase
+        * @param $dbw DatabaseBase
         * @return void
         */
        private function insertData( $dbw ) {
@@ -83,7 +83,7 @@ class BenchmarkDeleteTruncate extends Benchmarker {
        }
 
        /**
-        * @param  $dbw DatabaseBase
+        * @param $dbw DatabaseBase
         * @return void
         */
        private function delete( $dbw ) {
@@ -91,7 +91,7 @@ class BenchmarkDeleteTruncate extends Benchmarker {
        }
 
        /**
-        * @param  $dbw DatabaseBase
+        * @param $dbw DatabaseBase
         * @return void
         */
        private function truncate( $dbw ) {
diff --git a/maintenance/jsduck/CustomTags.rb b/maintenance/jsduck/CustomTags.rb
new file mode 100644 (file)
index 0000000..2aff988
--- /dev/null
@@ -0,0 +1,116 @@
+# Custom tags for JSDuck 5.x
+# See also:
+# - https://github.com/senchalabs/jsduck/wiki/Tags
+# - https://github.com/senchalabs/jsduck/wiki/Custom-tags
+# - https://github.com/senchalabs/jsduck/wiki/Custom-tags/7f5c32e568eab9edc8e3365e935bcb836cb11f1d
+require 'jsduck/tag/tag'
+
+class CommonTag < JsDuck::Tag::Tag
+  def initialize
+    @html_position = POS_DOC + 0.1
+    @repeatable = true
+  end
+
+  def parse_doc(scanner, position)
+    if @multiline
+      return { :tagname => @tagname, :doc => :multiline }
+    else
+      text = scanner.match(/.*$/)
+      return { :tagname => @tagname, :doc => text }
+    end
+  end
+
+  def process_doc(context, tags, position)
+    context[@tagname] = tags
+  end
+
+  def format(context, formatter)
+    context[@tagname].each do |tag|
+      tag[:doc] = formatter.format(tag[:doc])
+    end
+  end
+end
+
+class SourceTag < CommonTag
+  def initialize
+    @tagname = :source
+    @pattern = "source"
+    super
+  end
+
+  def to_html(context)
+    context[@tagname].map do |source|
+      <<-EOHTML
+        <h3 class='pa'>Source</h3>
+        #{source[:doc]}
+      EOHTML
+    end.join
+  end
+end
+
+class SeeTag < CommonTag
+  def initialize
+    @tagname = :see
+    @pattern = "see"
+    super
+  end
+
+  def format(context, formatter)
+    position = context[:files][0]
+    context[@tagname].each do |tag|
+      tag[:doc] = '<li>' + render_long_see(tag[:doc], formatter, position) + '</li>'
+    end
+  end
+
+  def to_html(context)
+    <<-EOHTML
+      <h3 class="pa">Related</h3>
+      <ul>
+      #{ context[@tagname].map {|tag| tag[:doc] }.join("\n") }
+      </ul>
+    EOHTML
+  end
+
+  def render_long_see(tag, formatter, position)
+    if tag =~ /\A([^\s]+)( .*)?\Z/m
+      name = $1
+      doc = $2 ? ': ' + $2 : ''
+      return formatter.format("{@link #{name}} #{doc}")
+    else
+      JsDuck::Logger.warn(nil, 'Unexpected @see argument: "'+tag+'"', position)
+      return tag
+    end
+  end
+end
+
+class ContextTag < CommonTag
+  def initialize
+    @tagname = :context
+    @pattern = 'context'
+    super
+  end
+
+  def format(context, formatter)
+    position = context[:files][0]
+    context[@tagname].each do |tag|
+      tag[:doc] = render_long_context(tag[:doc], formatter, position)
+    end
+  end
+
+  def to_html(context)
+    <<-EOHTML
+      <h3 class="pa">Context</h3>
+      #{ context[@tagname].last[:doc] }
+    EOHTML
+  end
+
+  def render_long_context(tag, formatter, position)
+    if tag =~ /\A([^\s]+)/m
+      name = $1
+      return formatter.format("`context` : {@link #{name}}")
+    else
+      JsDuck::Logger.warn(nil, 'Unexpected @context argument: "'+tag+'"', position)
+      return tag
+    end
+  end
+end
index c9736df..493815e 100644 (file)
@@ -2,28 +2,26 @@
        "--title": "MediaWiki core - Documentation",
        "--footer": "Documentation for MediaWiki core. Generated on {DATE} by {JSDUCK} {VERSION}.",
        "--categories": "./categories.json",
-       "--meta-tags": "./MetaTags.rb",
        "--eg-iframe": "./eg-iframe.html",
-       "--warnings": ["-no_doc"],
        "--builtin-classes": true,
        "--output": "../../docs/js",
        "--external": "HTMLElement,HTMLDocument,Window",
        "--": [
                "./external.js",
-               "../../resources/mediawiki",
-               "../../resources/mediawiki.action/mediawiki.action.edit.js",
-               "../../resources/mediawiki.action/mediawiki.action.view.postEdit.js",
-               "../../resources/mediawiki.page/mediawiki.page.startup.js",
-               "../../resources/mediawiki.page/mediawiki.page.watch.ajax.js",
-               "../../resources/mediawiki.api",
-               "../../resources/mediawiki.language",
-               "../../resources/jquery/jquery.arrowSteps.js",
-               "../../resources/jquery/jquery.autoEllipsis.js",
-               "../../resources/jquery/jquery.badge.js",
-               "../../resources/jquery/jquery.byteLimit.js",
-               "../../resources/jquery/jquery.localize.js",
-               "../../resources/jquery/jquery.spinner.js",
-               "../../resources/oojs",
-               "../../resources/oojs-ui"
+               "../../resources/src/mediawiki",
+               "../../resources/src/mediawiki.action/mediawiki.action.edit.js",
+               "../../resources/src/mediawiki.action/mediawiki.action.view.postEdit.js",
+               "../../resources/src/mediawiki.page/mediawiki.page.startup.js",
+               "../../resources/src/mediawiki.page/mediawiki.page.watch.ajax.js",
+               "../../resources/src/mediawiki.api",
+               "../../resources/src/mediawiki.language",
+               "../../resources/src/jquery/jquery.arrowSteps.js",
+               "../../resources/src/jquery/jquery.autoEllipsis.js",
+               "../../resources/src/jquery/jquery.badge.js",
+               "../../resources/src/jquery/jquery.byteLimit.js",
+               "../../resources/src/jquery/jquery.localize.js",
+               "../../resources/src/jquery/jquery.spinner.js",
+               "../../resources/lib/oojs",
+               "../../resources/lib/oojs-ui"
        ]
 }
index 66a78a9..31d753c 100644 (file)
@@ -1031,7 +1031,6 @@ $wgMessageStructure = array(
                'prefs-skin',
                'skin-preview',
                'datedefault',
-               'prefs-beta',
                'prefs-datetime',
                'prefs-labs',
                'prefs-user-pages',
index 4254887..62d1bba 100755 (executable)
@@ -11,10 +11,20 @@ then
        exit 1
 fi
 
+# Support jsduck 4.x and 5.x
+JSDUCK_VERSION="$(jsduck --version | sed -e 's/[.].*//')"
+if [  "$JSDUCK_VERSION" = "JSDuck 4" ]; then
+       JSDUCK_VERSION_OPT="--meta-tags ./maintenance/jsduck/MetaTags.rb --warnings=-no_doc"
+else
+       JSDUCK_VERSION_OPT="--tags ./maintenance/jsduck/CustomTags.rb --warnings=-nodoc(class,public)"
+fi
+
 MWCORE_DIR=$(cd $(dirname $0)/..; pwd)
 
 jsduck \
 --config=$MWCORE_DIR/maintenance/jsduck/config.json \
---footer="Documentation for MediaWiki core ($JSDUCK_MWVERSION). Generated on {DATE} by {JSDUCK} {VERSION}." \
+$JSDUCK_VERSION_OPT \
+--footer="Documentation for branch ($JSDUCK_MWVERSION) on {DATE} by {JSDUCK} {VERSION}." \
+--processes 0 --warnings-exit-nonzero \
 && echo 'JSDuck execution finished.' \
 && ln -s ../../resources $MWCORE_DIR/docs/js/modules
index bfe04d7..9847ccc 100644 (file)
@@ -91,7 +91,7 @@ class ResetUserTokens extends Maintenance {
 
                        wfWaitForSlaves();
 
-               } while ( $max <= $maxid );
+               } while ( $min <= $maxid );
 
        }
 
diff --git a/maintenance/resources/update-oojs.sh b/maintenance/resources/update-oojs.sh
new file mode 100755 (executable)
index 0000000..f26350f
--- /dev/null
@@ -0,0 +1,51 @@
+#!/usr/bin/env bash
+
+if [ "$2" != "" ]
+then
+       echo >&2 "Usage: $0 [<version>]"
+       exit 1
+fi
+
+MW_DIR=$(cd $(dirname $0)/../..; pwd) # e.g. mediawiki-core/
+NPM_DIR=`mktemp -d 2>/dev/null || mktemp -d -t 'mw-update-oojs'` # e.g. /tmp/mw-update-oojs.rI0I5Vir
+
+# Prepare MediaWiki working copy
+cd $MW_DIR
+git reset resources/lib/oojs/ && git checkout resources/lib/oojs/ && git fetch origin || exit 1
+
+git checkout -B upstream-oojs origin/master || exit 1
+
+# Fetch upstream version
+cd $NPM_DIR
+if [ "$1" != "" ]
+then
+       npm install oojs@$1 || exit 1
+else
+       npm install oojs || exit 1
+fi
+
+OOJS_VERSION=$(node -e 'console.log(JSON.parse(require("fs").readFileSync("./node_modules/oojs/package.json")).version);')
+if [ "$OOJS_VERSION" == "" ]
+then
+       echo 'Could not find OOjs version'
+       exit 1
+fi
+
+# Copy file(s)
+mv ./node_modules/oojs/dist/* $MW_DIR/resources/lib/oojs/ || exit 1
+
+# Generate commit
+cd $MW_DIR || exit 1
+
+# Clean up temporary area
+rm -rf $NPM_DIR
+
+COMMITMSG=$(cat <<END
+Update OOjs to v$OOJS_VERSION
+
+Release notes:
+ https://git.wikimedia.org/blob/oojs%2Fcore.git/v$OOJS_VERSION/History.md
+END
+)
+
+git commit resources/lib/oojs/ -m "$COMMITMSG" || exit 1
index f7d5fc0..dc9c763 100644 (file)
@@ -36,6 +36,7 @@ class RunJobs extends Maintenance {
                $this->addOption( 'maxtime', 'Maximum amount of wall-clock time', false, true );
                $this->addOption( 'type', 'Type of job to run', false, true );
                $this->addOption( 'procs', 'Number of processes to use', false, true );
+               $this->addOption( 'nothrottle', 'Ignore job throttling configuration', false, false );
        }
 
        public function memoryLimit() {
@@ -66,6 +67,7 @@ class RunJobs extends Maintenance {
                $type = $this->getOption( 'type', false );
                $maxJobs = $this->getOption( 'maxjobs', false );
                $maxTime = $this->getOption( 'maxtime', false );
+               $noThrottle = $this->hasOption( 'nothrottle' );
                $startTime = time();
 
                $group = JobQueueGroup::singleton();
@@ -83,10 +85,12 @@ class RunJobs extends Maintenance {
                $flags = JobQueueGroup::USE_CACHE;
                $lastTime = time(); // time since last slave check
                do {
+                       $backoffs = array_filter( $backoffs, $backoffExpireFunc );
+                       $blacklist = $noThrottle ? array() : array_keys( $backoffs );
                        if ( $type === false ) {
-                               $backoffs = array_filter( $backoffs, $backoffExpireFunc );
-                               $blacklist = array_keys( $backoffs );
                                $job = $group->pop( JobQueueGroup::TYPE_DEFAULT, $flags, $blacklist );
+                       } elseif ( in_array( $type, $blacklist ) ) {
+                               $job = false; // requested queue in backoff state
                        } else {
                                $job = $group->pop( $type ); // job from a single queue
                        }
@@ -103,6 +107,7 @@ class RunJobs extends Maintenance {
                                        $status = $job->run();
                                        $error = $job->getLastError();
                                } catch ( MWException $e ) {
+                                       MWExceptionHandler::rollbackMasterChangesAndLog( $e );
                                        $status = false;
                                        $error = get_class( $e ) . ': ' . $e->getMessage();
                                        $e->report(); // write error to STDERR and the log
diff --git a/resources/Makefile b/resources/Makefile
deleted file mode 100644 (file)
index 1b7aeb1..0000000
+++ /dev/null
@@ -1,19 +0,0 @@
-MEDIAWIKI_LOAD_URL ?= http://localhost/w/load.php
-
-kss: nodecheck
-# FIXME: Use more up-to-date Ruby version
-
-# Generates CSS of mediawiki.ui and mediawiki.ui.button using ResourceLoader, then applies it to the
-# KSS style guide
-       $(eval KSS_RL_TMP := $(shell mktemp /tmp/tmp.XXXXXXXXXX))
-       @curl -sG "${MEDIAWIKI_LOAD_URL}?modules=mediawiki.ui|mediawiki.ui.button&only=styles" > $(KSS_RL_TMP)
-       @node_modules/.bin/kss-node mediawiki.ui mediawiki.ui/docs --css $(KSS_RL_TMP) -t styleguide-template
-       @rm $(KSS_RL_TMP)
-
-kssopen: kss
-       @echo Opening the generated style guide...
-       @command -v xdg-open >/dev/null 2>&1 || { open ${PWD}/mediawiki.ui/docs/index.html; exit 0; }
-       @xdg-open ${PWD}/mediawiki.ui/docs/index.html
-
-nodecheck:
-       @scripts/nodecheck.sh
diff --git a/resources/README.txt b/resources/README.txt
deleted file mode 100644 (file)
index d91bf2a..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-The Makefile, package.json, scripts, styleguide-template, and
-mediawiki.ui/styleguide.md files and directories in here support the automatic
-generation of CSS documentation from the source LESS files using kss for
-node.js, https://github.com/kneath/kss
index 5a255e6..cea012a 100644 (file)
@@ -55,27 +55,30 @@ return array(
         *
         * Level 1 "elements":
         *     The base level that only contains the most basic of common skin styles.
-        *     Only styles for single elements are included, no styling for complex structures like the TOC
-        *     is present. This level is for skins that want to implement the entire style of even content area
-        *     structures like the TOC themselves.
+        *     Only styles for single elements are included, no styling for complex structures like the
+        *     TOC is present. This level is for skins that want to implement the entire style of even
+        *     content area structures like the TOC themselves.
         *
         * Level 2 "content":
-        *     The most commonly used level for skins implemented from scratch. This level includes all the single
-        *     element styles from "elements" as well as styles for complex structures such as the TOC that are output
-        *     in the content area by MediaWiki rather than the skin. Essentially this is the common level that lets
-        *     skins leave the style of the content area as it is normally styled, while leaving the rest of the skin
-        *     up to the skin implementation.
+        *     The most commonly used level for skins implemented from scratch. This level includes all
+        *     the single element styles from "elements" as well as styles for complex structures such
+        *     as the TOC that are output in the content area by MediaWiki rather than the skin.
+        *     Essentially this is the common level that lets skins leave the style of the content area
+        *     as it is normally styled, while leaving the rest of the skin up to the skin
+        *     implementation.
         *
         * Level 3 "interface":
-        *     The highest level, this stylesheet contains extra common styles for classes like .firstHeading, #contentSub,
-        *     et cetera which are not outputted by MediaWiki but are common to skins like MonoBook, Vector, etc...
-        *     Essentially this level is for styles that are common to MonoBook clones. And since practically every skin
-        *     that currently exists within core is a MonoBook clone, all our core skins currently use this level.
+        *     The highest level, this stylesheet contains extra common styles for classes like
+        *     .firstHeading, #contentSub, et cetera which are not outputted by MediaWiki but are common
+        *     to skins like MonoBook, Vector, etc... Essentially this level is for styles that are
+        *     common to MonoBook clones. And since practically every skin that currently exists within
+        *     core is a MonoBook clone, all our core skins currently use this level.
         *
-        * These modules are typically loaded by addModuleStyles which has absolutely no concept of dependency
-        * management. As a result the skins.common.* modules contain duplicate stylesheet references instead of
-        * setting 'dependencies' to the lower level the module is based on. For this reason avoid including multiple
-        * skins.common.* modules into your skin as this will result in duplicate css.
+        * These modules are typically loaded by addModuleStyles which has absolutely no concept of
+        * dependency management. As a result, the skins.common.* modules contain duplicate stylesheet
+        * references instead of setting 'dependencies' to the lower level the module is based on. For
+        * this reason avoid including multiple skins.common.* modules into your skin as this will
+        * result in duplicate css.
         */
        'skins.common.elements' => array(
                'styles' => array(
@@ -174,7 +177,7 @@ return array(
        /* jQuery */
 
        'jquery' => array(
-               'scripts' => 'resources/jquery/jquery.js',
+               'scripts' => 'resources/lib/jquery/jquery.js',
                'debugRaw' => false,
                'targets' => array( 'desktop', 'mobile' ),
        ),
@@ -182,152 +185,149 @@ return array(
        /* jQuery Plugins */
 
        'jquery.appear' => array(
-               'scripts' => 'resources/jquery/jquery.appear.js',
+               'scripts' => 'resources/lib/jquery/jquery.appear.js',
        ),
        'jquery.arrowSteps' => array(
-               'scripts' => 'resources/jquery/jquery.arrowSteps.js',
-               'styles' => 'resources/jquery/jquery.arrowSteps.css',
+               'scripts' => 'resources/src/jquery/jquery.arrowSteps.js',
+               'styles' => 'resources/src/jquery/jquery.arrowSteps.css',
        ),
        'jquery.async' => array(
-               'scripts' => 'resources/jquery/jquery.async.js',
+               'scripts' => 'resources/lib/jquery/jquery.async.js',
        ),
        'jquery.autoEllipsis' => array(
-               'scripts' => 'resources/jquery/jquery.autoEllipsis.js',
+               'scripts' => 'resources/src/jquery/jquery.autoEllipsis.js',
                'dependencies' => 'jquery.highlightText',
                'targets' => array( 'desktop', 'mobile' ),
        ),
        'jquery.badge' => array(
-               'scripts' => 'resources/jquery/jquery.badge.js',
-               'styles' => 'resources/jquery/jquery.badge.css',
+               'scripts' => 'resources/src/jquery/jquery.badge.js',
+               'styles' => 'resources/src/jquery/jquery.badge.css',
                'dependencies' => 'mediawiki.language',
        ),
        'jquery.byteLength' => array(
-               'scripts' => 'resources/jquery/jquery.byteLength.js',
+               'scripts' => 'resources/src/jquery/jquery.byteLength.js',
                'targets' => array( 'desktop', 'mobile' ),
        ),
        'jquery.byteLimit' => array(
-               'scripts' => 'resources/jquery/jquery.byteLimit.js',
+               'scripts' => 'resources/src/jquery/jquery.byteLimit.js',
                'dependencies' => 'jquery.byteLength',
                'targets' => array( 'desktop', 'mobile' ),
        ),
        'jquery.checkboxShiftClick' => array(
-               'scripts' => 'resources/jquery/jquery.checkboxShiftClick.js',
+               'scripts' => 'resources/src/jquery/jquery.checkboxShiftClick.js',
                'targets' => array( 'desktop', 'mobile' ),
        ),
        'jquery.chosen' => array(
-               'scripts' => 'resources/jquery.chosen/chosen.jquery.js',
-               'styles' => 'resources/jquery.chosen/chosen.css',
+               'scripts' => 'resources/lib/jquery.chosen/chosen.jquery.js',
+               'styles' => 'resources/lib/jquery.chosen/chosen.css',
        ),
        'jquery.client' => array(
-               'scripts' => 'resources/jquery/jquery.client.js',
+               'scripts' => 'resources/src/jquery/jquery.client.js',
                'targets' => array( 'desktop', 'mobile' ),
        ),
        'jquery.color' => array(
-               'scripts' => 'resources/jquery/jquery.color.js',
+               'scripts' => 'resources/src/jquery/jquery.color.js',
                'dependencies' => 'jquery.colorUtil',
        ),
        'jquery.colorUtil' => array(
-               'scripts' => 'resources/jquery/jquery.colorUtil.js',
+               'scripts' => 'resources/src/jquery/jquery.colorUtil.js',
        ),
        'jquery.cookie' => array(
-               'scripts' => 'resources/jquery/jquery.cookie.js',
+               'scripts' => 'resources/lib/jquery/jquery.cookie.js',
                'targets' => array( 'desktop', 'mobile' ),
        ),
-       'jquery.delayedBind' => array(
-               'scripts' => 'resources/jquery/jquery.delayedBind.js',
-       ),
        'jquery.expandableField' => array(
-               'scripts' => 'resources/jquery/jquery.expandableField.js',
+               'scripts' => 'resources/src/jquery/jquery.expandableField.js',
        ),
        'jquery.farbtastic' => array(
-               'scripts' => 'resources/jquery/jquery.farbtastic.js',
-               'styles' => 'resources/jquery/jquery.farbtastic.css',
+               'scripts' => 'resources/src/jquery/jquery.farbtastic.js',
+               'styles' => 'resources/src/jquery/jquery.farbtastic.css',
                'dependencies' => 'jquery.colorUtil',
        ),
        'jquery.footHovzer' => array(
-               'scripts' => 'resources/jquery/jquery.footHovzer.js',
-               'styles' => 'resources/jquery/jquery.footHovzer.css',
+               'scripts' => 'resources/src/jquery/jquery.footHovzer.js',
+               'styles' => 'resources/src/jquery/jquery.footHovzer.css',
        ),
        'jquery.form' => array(
-               'scripts' => 'resources/jquery/jquery.form.js',
+               'scripts' => 'resources/lib/jquery/jquery.form.js',
        ),
        'jquery.fullscreen' => array(
-               'scripts' => 'resources/jquery/jquery.fullscreen.js',
+               'scripts' => 'resources/lib/jquery/jquery.fullscreen.js',
        ),
        'jquery.getAttrs' => array(
-               'scripts' => 'resources/jquery/jquery.getAttrs.js',
+               'scripts' => 'resources/src/jquery/jquery.getAttrs.js',
                'targets' => array( 'desktop', 'mobile' ),
        ),
        'jquery.hidpi' => array(
-               'scripts' => 'resources/jquery/jquery.hidpi.js',
+               'scripts' => 'resources/src/jquery/jquery.hidpi.js',
                'targets' => array( 'desktop', 'mobile' ),
        ),
        'jquery.highlightText' => array(
-               'scripts' => 'resources/jquery/jquery.highlightText.js',
+               'scripts' => 'resources/src/jquery/jquery.highlightText.js',
                'dependencies' => 'jquery.mwExtension',
                'targets' => array( 'desktop', 'mobile' ),
        ),
        'jquery.hoverIntent' => array(
-               'scripts' => 'resources/jquery/jquery.hoverIntent.js',
+               'scripts' => 'resources/lib/jquery/jquery.hoverIntent.js',
        ),
        'jquery.json' => array(
-               'scripts' => 'resources/jquery/jquery.json.js',
+               'scripts' => 'resources/lib/jquery/jquery.json.js',
                'targets' => array( 'mobile', 'desktop' ),
        ),
        'jquery.localize' => array(
-               'scripts' => 'resources/jquery/jquery.localize.js',
+               'scripts' => 'resources/src/jquery/jquery.localize.js',
        ),
        'jquery.makeCollapsible' => array(
-               'scripts' => 'resources/jquery/jquery.makeCollapsible.js',
-               'styles' => 'resources/jquery/jquery.makeCollapsible.css',
+               'scripts' => 'resources/src/jquery/jquery.makeCollapsible.js',
+               'styles' => 'resources/src/jquery/jquery.makeCollapsible.css',
                'messages' => array( 'collapsible-expand', 'collapsible-collapse' ),
                'targets' => array( 'desktop', 'mobile' ),
        ),
        'jquery.mockjax' => array(
-               'scripts' => 'resources/jquery/jquery.mockjax.js',
+               'scripts' => 'resources/lib/jquery/jquery.mockjax.js',
        ),
        'jquery.mw-jump' => array(
-               'scripts' => 'resources/jquery/jquery.mw-jump.js',
+               'scripts' => 'resources/src/jquery/jquery.mw-jump.js',
                'targets' => array( 'desktop', 'mobile' ),
        ),
        'jquery.mwExtension' => array(
-               'scripts' => 'resources/jquery/jquery.mwExtension.js',
+               'scripts' => 'resources/src/jquery/jquery.mwExtension.js',
                'targets' => array( 'desktop', 'mobile' ),
        ),
        'jquery.placeholder' => array(
-               'scripts' => 'resources/jquery/jquery.placeholder.js',
+               'scripts' => 'resources/src/jquery/jquery.placeholder.js',
                'targets' => array( 'desktop', 'mobile' ),
        ),
        'jquery.qunit' => array(
-               'scripts' => 'resources/jquery/jquery.qunit.js',
-               'styles' => 'resources/jquery/jquery.qunit.css',
+               'scripts' => 'resources/lib/jquery/jquery.qunit.js',
+               'styles' => 'resources/lib/jquery/jquery.qunit.css',
                'position' => 'top',
                'targets' => array( 'desktop', 'mobile' ),
        ),
        'jquery.qunit.completenessTest' => array(
-               'scripts' => 'resources/jquery/jquery.qunit.completenessTest.js',
+               'scripts' => 'resources/src/jquery/jquery.qunit.completenessTest.js',
                'dependencies' => 'jquery.qunit',
                'targets' => array( 'desktop', 'mobile' ),
        ),
        'jquery.spinner' => array(
-               'scripts' => 'resources/jquery/jquery.spinner.js',
-               'styles' => 'resources/jquery/jquery.spinner.css',
+               'scripts' => 'resources/src/jquery/jquery.spinner.js',
+               'styles' => 'resources/src/jquery/jquery.spinner.css',
        ),
        'jquery.jStorage' => array(
-               'scripts' => 'resources/jquery/jquery.jStorage.js',
+               'scripts' => 'resources/lib/jquery/jquery.jStorage.js',
                'dependencies' => 'jquery.json',
        ),
        'jquery.suggestions' => array(
-               'scripts' => 'resources/jquery/jquery.suggestions.js',
-               'styles' => 'resources/jquery/jquery.suggestions.css',
-               'dependencies' => 'jquery.autoEllipsis',
+               'scripts' => 'resources/src/jquery/jquery.suggestions.js',
+               'styles' => 'resources/src/jquery/jquery.suggestions.css',
+               'dependencies' => 'jquery.highlightText',
        ),
        'jquery.tabIndex' => array(
-               'scripts' => 'resources/jquery/jquery.tabIndex.js',
+               'scripts' => 'resources/src/jquery/jquery.tabIndex.js',
        ),
        'jquery.tablesorter' => array(
-               'scripts' => 'resources/jquery/jquery.tablesorter.js',
-               'styles' => 'resources/jquery/jquery.tablesorter.css',
+               'scripts' => 'resources/src/jquery/jquery.tablesorter.js',
+               'styles' => 'resources/src/jquery/jquery.tablesorter.css',
                'messages' => array( 'sort-descending', 'sort-ascending' ),
                'dependencies' => array(
                        'jquery.mwExtension',
@@ -335,195 +335,194 @@ return array(
                ),
        ),
        'jquery.textSelection' => array(
-               'scripts' => 'resources/jquery/jquery.textSelection.js',
+               'scripts' => 'resources/src/jquery/jquery.textSelection.js',
                'dependencies' => 'jquery.client',
        ),
        'jquery.throttle-debounce' => array(
-               'scripts' => 'resources/jquery/jquery.ba-throttle-debounce.js',
+               'scripts' => 'resources/lib/jquery/jquery.ba-throttle-debounce.js',
        ),
        'jquery.validate' => array(
-               'scripts' => 'resources/jquery/jquery.validate.js',
+               'scripts' => 'resources/lib/jquery/jquery.validate.js',
        ),
        'jquery.xmldom' => array(
-               'scripts' => 'resources/jquery/jquery.xmldom.js',
+               'scripts' => 'resources/lib/jquery/jquery.xmldom.js',
        ),
 
        /* jQuery Tipsy */
 
        'jquery.tipsy' => array(
-               'scripts' => 'resources/jquery.tipsy/jquery.tipsy.js',
-               'styles' => 'resources/jquery.tipsy/jquery.tipsy.css',
+               'scripts' => 'resources/src/jquery.tipsy/jquery.tipsy.js',
+               'styles' => 'resources/src/jquery.tipsy/jquery.tipsy.css',
        ),
 
        /* jQuery UI */
 
        // Core
        'jquery.ui.core' => array(
-               'scripts' => 'resources/jquery.ui/jquery.ui.core.js',
+               'scripts' => 'resources/lib/jquery.ui/jquery.ui.core.js',
                'skinStyles' => array(
                        'default' => array(
-                               'resources/jquery.ui/themes/default/jquery.ui.core.css',
-                               'resources/jquery.ui/themes/default/jquery.ui.theme.css',
+                               'resources/lib/jquery.ui/themes/default/jquery.ui.core.css',
+                               'resources/lib/jquery.ui/themes/default/jquery.ui.theme.css',
                        ),
                        'vector' => array(
-                               'resources/jquery.ui/themes/vector/jquery.ui.core.css',
-                               'resources/jquery.ui/themes/vector/jquery.ui.theme.css',
+                               'resources/src/jquery.ui-themes/vector/jquery.ui.core.css',
+                               'resources/src/jquery.ui-themes/vector/jquery.ui.theme.css',
                        ),
                ),
-               'dependencies' => 'jquery',
                'group' => 'jquery.ui',
        ),
        'jquery.ui.widget' => array(
-               'scripts' => 'resources/jquery.ui/jquery.ui.widget.js',
+               'scripts' => 'resources/lib/jquery.ui/jquery.ui.widget.js',
                'group' => 'jquery.ui',
        ),
        'jquery.ui.mouse' => array(
-               'scripts' => 'resources/jquery.ui/jquery.ui.mouse.js',
+               'scripts' => 'resources/lib/jquery.ui/jquery.ui.mouse.js',
                'dependencies' => 'jquery.ui.widget',
                'group' => 'jquery.ui',
        ),
        'jquery.ui.position' => array(
-               'scripts' => 'resources/jquery.ui/jquery.ui.position.js',
+               'scripts' => 'resources/lib/jquery.ui/jquery.ui.position.js',
                'group' => 'jquery.ui',
        ),
        // Interactions
        'jquery.ui.draggable' => array(
-               'scripts' => 'resources/jquery.ui/jquery.ui.draggable.js',
+               'scripts' => 'resources/lib/jquery.ui/jquery.ui.draggable.js',
                'dependencies' => array( 'jquery.ui.core', 'jquery.ui.mouse', 'jquery.ui.widget' ),
                'group' => 'jquery.ui',
        ),
        'jquery.ui.droppable' => array(
-               'scripts' => 'resources/jquery.ui/jquery.ui.droppable.js',
+               'scripts' => 'resources/lib/jquery.ui/jquery.ui.droppable.js',
                'dependencies' => array(
                        'jquery.ui.core', 'jquery.ui.mouse', 'jquery.ui.widget', 'jquery.ui.draggable',
                ),
                'group' => 'jquery.ui',
        ),
        'jquery.ui.resizable' => array(
-               'scripts' => 'resources/jquery.ui/jquery.ui.resizable.js',
+               'scripts' => 'resources/lib/jquery.ui/jquery.ui.resizable.js',
                'skinStyles' => array(
-                       'default' => 'resources/jquery.ui/themes/default/jquery.ui.resizable.css',
-                       'vector' => 'resources/jquery.ui/themes/vector/jquery.ui.resizable.css',
+                       'default' => 'resources/lib/jquery.ui/themes/default/jquery.ui.resizable.css',
+                       'vector' => 'resources/src/jquery.ui-themes/vector/jquery.ui.resizable.css',
                ),
                'dependencies' => array( 'jquery.ui.core', 'jquery.ui.widget', 'jquery.ui.mouse' ),
                'group' => 'jquery.ui',
        ),
        'jquery.ui.selectable' => array(
-               'scripts' => 'resources/jquery.ui/jquery.ui.selectable.js',
+               'scripts' => 'resources/lib/jquery.ui/jquery.ui.selectable.js',
                'skinStyles' => array(
-                       'default' => 'resources/jquery.ui/themes/default/jquery.ui.selectable.css',
-                       'vector' => 'resources/jquery.ui/themes/vector/jquery.ui.selectable.css',
+                       'default' => 'resources/lib/jquery.ui/themes/default/jquery.ui.selectable.css',
+                       'vector' => 'resources/src/jquery.ui-themes/vector/jquery.ui.selectable.css',
                ),
                'dependencies' => array( 'jquery.ui.core', 'jquery.ui.widget', 'jquery.ui.mouse' ),
                'group' => 'jquery.ui',
        ),
        'jquery.ui.sortable' => array(
-               'scripts' => 'resources/jquery.ui/jquery.ui.sortable.js',
+               'scripts' => 'resources/lib/jquery.ui/jquery.ui.sortable.js',
                'dependencies' => array( 'jquery.ui.core', 'jquery.ui.widget', 'jquery.ui.mouse' ),
                'group' => 'jquery.ui',
        ),
        // Widgets
        'jquery.ui.accordion' => array(
-               'scripts' => 'resources/jquery.ui/jquery.ui.accordion.js',
+               'scripts' => 'resources/lib/jquery.ui/jquery.ui.accordion.js',
                'dependencies' => array( 'jquery.ui.core', 'jquery.ui.widget' ),
                'skinStyles' => array(
-                       'default' => 'resources/jquery.ui/themes/default/jquery.ui.accordion.css',
-                       'vector' => 'resources/jquery.ui/themes/vector/jquery.ui.accordion.css',
+                       'default' => 'resources/lib/jquery.ui/themes/default/jquery.ui.accordion.css',
+                       'vector' => 'resources/src/jquery.ui-themes/vector/jquery.ui.accordion.css',
                ),
                'group' => 'jquery.ui',
        ),
        'jquery.ui.autocomplete' => array(
-               'scripts' => 'resources/jquery.ui/jquery.ui.autocomplete.js',
+               'scripts' => 'resources/lib/jquery.ui/jquery.ui.autocomplete.js',
                'dependencies' => array( 'jquery.ui.core', 'jquery.ui.widget', 'jquery.ui.position' ),
                'skinStyles' => array(
-                       'default' => 'resources/jquery.ui/themes/default/jquery.ui.autocomplete.css',
-                       'vector' => 'resources/jquery.ui/themes/vector/jquery.ui.autocomplete.css',
+                       'default' => 'resources/lib/jquery.ui/themes/default/jquery.ui.autocomplete.css',
+                       'vector' => 'resources/src/jquery.ui-themes/vector/jquery.ui.autocomplete.css',
                ),
                'group' => 'jquery.ui',
        ),
        'jquery.ui.button' => array(
-               'scripts' => 'resources/jquery.ui/jquery.ui.button.js',
+               'scripts' => 'resources/lib/jquery.ui/jquery.ui.button.js',
                'dependencies' => array( 'jquery.ui.core', 'jquery.ui.widget' ),
                'skinStyles' => array(
-                       'default' => 'resources/jquery.ui/themes/default/jquery.ui.button.css',
-                       'vector' => 'resources/jquery.ui/themes/vector/jquery.ui.button.css',
+                       'default' => 'resources/lib/jquery.ui/themes/default/jquery.ui.button.css',
+                       'vector' => 'resources/src/jquery.ui-themes/vector/jquery.ui.button.css',
                ),
                'group' => 'jquery.ui',
        ),
        'jquery.ui.datepicker' => array(
-               'scripts' => 'resources/jquery.ui/jquery.ui.datepicker.js',
+               'scripts' => 'resources/lib/jquery.ui/jquery.ui.datepicker.js',
                'dependencies' => 'jquery.ui.core',
                'skinStyles' => array(
-                       'default' => 'resources/jquery.ui/themes/default/jquery.ui.datepicker.css',
-                       'vector' => 'resources/jquery.ui/themes/vector/jquery.ui.datepicker.css',
+                       'default' => 'resources/lib/jquery.ui/themes/default/jquery.ui.datepicker.css',
+                       'vector' => 'resources/src/jquery.ui-themes/vector/jquery.ui.datepicker.css',
                ),
                'languageScripts' => array(
-                       'af' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-af.js',
-                       'ar' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-ar.js',
-                       'az' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-az.js',
-                       'bg' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-bg.js',
-                       'bs' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-bs.js',
-                       'ca' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-ca.js',
-                       'cs' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-cs.js',
-                       'da' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-da.js',
-                       'de' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-de.js',
-                       'el' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-el.js',
-                       'en-gb' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-en-GB.js',
-                       'eo' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-eo.js',
-                       'es' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-es.js',
-                       'et' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-et.js',
-                       'eu' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-eu.js',
-                       'fa' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-fa.js',
-                       'fi' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-fi.js',
-                       'fo' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-fo.js',
-                       'fr' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-fr.js',
-                       'gl' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-gl.js',
-                       'he' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-he.js',
-                       'hi' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-hi.js',
-                       'hr' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-hr.js',
-                       'hu' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-hu.js',
-                       'hy' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-hy.js',
-                       'id' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-id.js',
-                       'is' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-is.js',
-                       'it' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-it.js',
-                       'ja' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-ja.js',
-                       'ka' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-ka.js',
-                       'kk' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-kk.js',
-                       'km' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-km.js',
-                       'ko' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-ko.js',
-                       'lb' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-lb.js',
-                       'lt' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-lt.js',
-                       'lv' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-lv.js',
-                       'mk' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-mk.js',
-                       'ml' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-ml.js',
-                       'ms' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-ms.js',
-                       'nl' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-nl.js',
-                       'no' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-no.js',
-                       'pl' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-pl.js',
-                       'pt' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-pt.js',
-                       'pt-br' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-pt-BR.js',
-                       'rm' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-rm.js',
-                       'ro' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-ro.js',
-                       'ru' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-ru.js',
-                       'sk' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-sk.js',
-                       'sl' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-sl.js',
-                       'sq' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-sq.js',
-                       'sr-sr' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-sr-SR.js',
-                       'sr' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-sr.js',
-                       'sv' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-sv.js',
-                       'ta' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-ta.js',
-                       'th' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-th.js',
-                       'tr' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-tr.js',
-                       'uk' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-uk.js',
-                       'vi' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-vi.js',
-                       'zh-cn' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-zh-CN.js',
-                       'zh-hk' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-zh-HK.js',
-                       'zh-tw' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-zh-TW.js',
+                       'af' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-af.js',
+                       'ar' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-ar.js',
+                       'az' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-az.js',
+                       'bg' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-bg.js',
+                       'bs' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-bs.js',
+                       'ca' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-ca.js',
+                       'cs' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-cs.js',
+                       'da' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-da.js',
+                       'de' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-de.js',
+                       'el' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-el.js',
+                       'en-gb' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-en-GB.js',
+                       'eo' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-eo.js',
+                       'es' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-es.js',
+                       'et' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-et.js',
+                       'eu' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-eu.js',
+                       'fa' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-fa.js',
+                       'fi' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-fi.js',
+                       'fo' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-fo.js',
+                       'fr' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-fr.js',
+                       'gl' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-gl.js',
+                       'he' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-he.js',
+                       'hi' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-hi.js',
+                       'hr' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-hr.js',
+                       'hu' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-hu.js',
+                       'hy' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-hy.js',
+                       'id' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-id.js',
+                       'is' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-is.js',
+                       'it' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-it.js',
+                       'ja' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-ja.js',
+                       'ka' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-ka.js',
+                       'kk' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-kk.js',
+                       'km' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-km.js',
+                       'ko' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-ko.js',
+                       'lb' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-lb.js',
+                       'lt' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-lt.js',
+                       'lv' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-lv.js',
+                       'mk' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-mk.js',
+                       'ml' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-ml.js',
+                       'ms' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-ms.js',
+                       'nl' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-nl.js',
+                       'no' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-no.js',
+                       'pl' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-pl.js',
+                       'pt' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-pt.js',
+                       'pt-br' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-pt-BR.js',
+                       'rm' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-rm.js',
+                       'ro' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-ro.js',
+                       'ru' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-ru.js',
+                       'sk' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-sk.js',
+                       'sl' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-sl.js',
+                       'sq' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-sq.js',
+                       'sr-sr' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-sr-SR.js',
+                       'sr' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-sr.js',
+                       'sv' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-sv.js',
+                       'ta' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-ta.js',
+                       'th' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-th.js',
+                       'tr' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-tr.js',
+                       'uk' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-uk.js',
+                       'vi' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-vi.js',
+                       'zh-cn' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-zh-CN.js',
+                       'zh-hk' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-zh-HK.js',
+                       'zh-tw' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-zh-TW.js',
                ),
                'group' => 'jquery.ui',
        ),
        'jquery.ui.dialog' => array(
-               'scripts' => 'resources/jquery.ui/jquery.ui.dialog.js',
+               'scripts' => 'resources/lib/jquery.ui/jquery.ui.dialog.js',
                'dependencies' => array(
                        'jquery.ui.core',
                        'jquery.ui.widget',
@@ -534,106 +533,105 @@ return array(
                        'jquery.ui.resizable',
                ),
                'skinStyles' => array(
-                       'default' => 'resources/jquery.ui/themes/default/jquery.ui.dialog.css',
-                       'vector' => 'resources/jquery.ui/themes/vector/jquery.ui.dialog.css',
+                       'default' => 'resources/lib/jquery.ui/themes/default/jquery.ui.dialog.css',
+                       'vector' => 'resources/src/jquery.ui-themes/vector/jquery.ui.dialog.css',
                ),
                'group' => 'jquery.ui',
        ),
        'jquery.ui.progressbar' => array(
-               'scripts' => 'resources/jquery.ui/jquery.ui.progressbar.js',
+               'scripts' => 'resources/lib/jquery.ui/jquery.ui.progressbar.js',
                'dependencies' => array( 'jquery.ui.core', 'jquery.ui.widget' ),
                'skinStyles' => array(
-                       'default' => 'resources/jquery.ui/themes/default/jquery.ui.progressbar.css',
-                       'vector' => 'resources/jquery.ui/themes/vector/jquery.ui.progressbar.css',
+                       'default' => 'resources/lib/jquery.ui/themes/default/jquery.ui.progressbar.css',
+                       'vector' => 'resources/src/jquery.ui-themes/vector/jquery.ui.progressbar.css',
                ),
                'group' => 'jquery.ui',
        ),
        'jquery.ui.slider' => array(
-               'scripts' => 'resources/jquery.ui/jquery.ui.slider.js',
+               'scripts' => 'resources/lib/jquery.ui/jquery.ui.slider.js',
                'dependencies' => array( 'jquery.ui.core', 'jquery.ui.widget', 'jquery.ui.mouse' ),
                'skinStyles' => array(
-                       'default' => 'resources/jquery.ui/themes/default/jquery.ui.slider.css',
-                       'vector' => 'resources/jquery.ui/themes/vector/jquery.ui.slider.css',
+                       'default' => 'resources/lib/jquery.ui/themes/default/jquery.ui.slider.css',
+                       'vector' => 'resources/src/jquery.ui-themes/vector/jquery.ui.slider.css',
                ),
                'group' => 'jquery.ui',
        ),
        'jquery.ui.tabs' => array(
-               'scripts' => 'resources/jquery.ui/jquery.ui.tabs.js',
+               'scripts' => 'resources/lib/jquery.ui/jquery.ui.tabs.js',
                'dependencies' => array( 'jquery.ui.core', 'jquery.ui.widget' ),
                'skinStyles' => array(
-                       'default' => 'resources/jquery.ui/themes/default/jquery.ui.tabs.css',
-                       'vector' => 'resources/jquery.ui/themes/vector/jquery.ui.tabs.css',
+                       'default' => 'resources/lib/jquery.ui/themes/default/jquery.ui.tabs.css',
+                       'vector' => 'resources/src/jquery.ui-themes/vector/jquery.ui.tabs.css',
                ),
                'group' => 'jquery.ui',
        ),
        // Effects
        'jquery.effects.core' => array(
-               'scripts' => 'resources/jquery.effects/jquery.effects.core.js',
-               'dependencies' => 'jquery',
+               'scripts' => 'resources/lib/jquery.effects/jquery.effects.core.js',
                'group' => 'jquery.ui',
        ),
        'jquery.effects.blind' => array(
-               'scripts' => 'resources/jquery.effects/jquery.effects.blind.js',
+               'scripts' => 'resources/lib/jquery.effects/jquery.effects.blind.js',
                'dependencies' => 'jquery.effects.core',
                'group' => 'jquery.ui',
        ),
        'jquery.effects.bounce' => array(
-               'scripts' => 'resources/jquery.effects/jquery.effects.bounce.js',
+               'scripts' => 'resources/lib/jquery.effects/jquery.effects.bounce.js',
                'dependencies' => 'jquery.effects.core',
                'group' => 'jquery.ui',
        ),
        'jquery.effects.clip' => array(
-               'scripts' => 'resources/jquery.effects/jquery.effects.clip.js',
+               'scripts' => 'resources/lib/jquery.effects/jquery.effects.clip.js',
                'dependencies' => 'jquery.effects.core',
                'group' => 'jquery.ui',
        ),
        'jquery.effects.drop' => array(
-               'scripts' => 'resources/jquery.effects/jquery.effects.drop.js',
+               'scripts' => 'resources/lib/jquery.effects/jquery.effects.drop.js',
                'dependencies' => 'jquery.effects.core',
                'group' => 'jquery.ui',
        ),
        'jquery.effects.explode' => array(
-               'scripts' => 'resources/jquery.effects/jquery.effects.explode.js',
+               'scripts' => 'resources/lib/jquery.effects/jquery.effects.explode.js',
                'dependencies' => 'jquery.effects.core',
                'group' => 'jquery.ui',
        ),
        'jquery.effects.fade' => array(
-               'scripts' => 'resources/jquery.effects/jquery.effects.fade.js',
+               'scripts' => 'resources/lib/jquery.effects/jquery.effects.fade.js',
                'dependencies' => 'jquery.effects.core',
                'group' => 'jquery.ui',
        ),
        'jquery.effects.fold' => array(
-               'scripts' => 'resources/jquery.effects/jquery.effects.fold.js',
+               'scripts' => 'resources/lib/jquery.effects/jquery.effects.fold.js',
                'dependencies' => 'jquery.effects.core',
                'group' => 'jquery.ui',
        ),
        'jquery.effects.highlight' => array(
-               'scripts' => 'resources/jquery.effects/jquery.effects.highlight.js',
+               'scripts' => 'resources/lib/jquery.effects/jquery.effects.highlight.js',
                'dependencies' => 'jquery.effects.core',
                'group' => 'jquery.ui',
        ),
        'jquery.effects.pulsate' => array(
-               'scripts' => 'resources/jquery.effects/jquery.effects.pulsate.js',
+               'scripts' => 'resources/lib/jquery.effects/jquery.effects.pulsate.js',
                'dependencies' => 'jquery.effects.core',
                'group' => 'jquery.ui',
        ),
        'jquery.effects.scale' => array(
-               'scripts' => 'resources/jquery.effects/jquery.effects.scale.js',
+               'scripts' => 'resources/lib/jquery.effects/jquery.effects.scale.js',
                'dependencies' => 'jquery.effects.core',
                'group' => 'jquery.ui',
        ),
        'jquery.effects.shake' => array(
-               'scripts' => 'resources/jquery.effects/jquery.effects.shake.js',
+               'scripts' => 'resources/lib/jquery.effects/jquery.effects.shake.js',
                'dependencies' => 'jquery.effects.core',
                'group' => 'jquery.ui',
        ),
        'jquery.effects.slide' => array(
-               'scripts' => 'resources/jquery.effects/jquery.effects.slide.js',
+               'scripts' => 'resources/lib/jquery.effects/jquery.effects.slide.js',
                'dependencies' => 'jquery.effects.core',
                'group' => 'jquery.ui',
        ),
        'jquery.effects.transfer' => array(
-               'scripts' => 'resources/jquery.effects/jquery.effects.transfer.js',
+               'scripts' => 'resources/lib/jquery.effects/jquery.effects.transfer.js',
                'dependencies' => 'jquery.effects.core',
                'group' => 'jquery.ui',
        ),
@@ -641,117 +639,118 @@ return array(
        /* Moment.js */
 
        'moment' => array(
-               'scripts' => 'resources/moment/moment.js',
+               'scripts' => 'resources/lib/moment/moment.js',
                'languageScripts' => array(
-                       'ar-ma' => 'resources/moment/lang/ar-ma.js',
-                       'ar' => 'resources/moment/lang/ar.js',
-                       'bg' => 'resources/moment/lang/bg.js',
-                       'br' => 'resources/moment/lang/br.js',
-                       'bs' => 'resources/moment/lang/bs.js',
-                       'ca' => 'resources/moment/lang/ca.js',
-                       'cs' => 'resources/moment/lang/cs.js',
-                       'cv' => 'resources/moment/lang/cv.js',
-                       'cy' => 'resources/moment/lang/cy.js',
-                       'da' => 'resources/moment/lang/da.js',
-                       'de' => 'resources/moment/lang/de.js',
-                       'el' => 'resources/moment/lang/el.js',
-                       'en-au' => 'resources/moment/lang/en-au.js',
-                       'en-ca' => 'resources/moment/lang/en-ca.js',
-                       'en-gb' => 'resources/moment/lang/en-gb.js',
-                       'eo' => 'resources/moment/lang/eo.js',
-                       'es' => 'resources/moment/lang/es.js',
-                       'et' => 'resources/moment/lang/et.js',
-                       'eu' => 'resources/moment/lang/eu.js',
-                       'fa' => 'resources/moment/lang/fa.js',
-                       'fi' => 'resources/moment/lang/fi.js',
-                       'fo' => 'resources/moment/lang/fo.js',
-                       'fr-ca' => 'resources/moment/lang/fr-ca.js',
-                       'fr' => 'resources/moment/lang/fr.js',
-                       'gl' => 'resources/moment/lang/gl.js',
-                       'he' => 'resources/moment/lang/he.js',
-                       'hi' => 'resources/moment/lang/hi.js',
-                       'hr' => 'resources/moment/lang/hr.js',
-                       'hu' => 'resources/moment/lang/hu.js',
-                       'hy-am' => 'resources/moment/lang/hy-am.js',
-                       'id' => 'resources/moment/lang/id.js',
-                       'is' => 'resources/moment/lang/is.js',
-                       'it' => 'resources/moment/lang/it.js',
-                       'ja' => 'resources/moment/lang/ja.js',
-                       'ka' => 'resources/moment/lang/ka.js',
-                       'ko' => 'resources/moment/lang/ko.js',
-                       'lt' => 'resources/moment/lang/lt.js',
-                       'lv' => 'resources/moment/lang/lv.js',
-                       'mk' => 'resources/moment/lang/mk.js',
-                       'ml' => 'resources/moment/lang/ml.js',
-                       'mr' => 'resources/moment/lang/mr.js',
-                       'ms-my' => 'resources/moment/lang/ms-my.js',
-                       'nb' => 'resources/moment/lang/nb.js',
-                       'ne' => 'resources/moment/lang/ne.js',
-                       'nl' => 'resources/moment/lang/nl.js',
-                       'nn' => 'resources/moment/lang/nn.js',
-                       'pl' => 'resources/moment/lang/pl.js',
-                       'pt-br' => 'resources/moment/lang/pt-br.js',
-                       'pt' => 'resources/moment/lang/pt.js',
-                       'ro' => 'resources/moment/lang/ro.js',
-                       'rs' => 'resources/moment/lang/rs.js',
-                       'ru' => 'resources/moment/lang/ru.js',
-                       'sk' => 'resources/moment/lang/sk.js',
-                       'sl' => 'resources/moment/lang/sl.js',
-                       'sq' => 'resources/moment/lang/sq.js',
-                       'sv' => 'resources/moment/lang/sv.js',
-                       'ta' => 'resources/moment/lang/ta.js',
-                       'th' => 'resources/moment/lang/th.js',
-                       'tl-ph' => 'resources/moment/lang/tl-ph.js',
-                       'tr' => 'resources/moment/lang/tr.js',
-                       'tzm-la' => 'resources/moment/lang/tzm-la.js',
-                       'tzm' => 'resources/moment/lang/tzm.js',
-                       'uk' => 'resources/moment/lang/uk.js',
-                       'uz' => 'resources/moment/lang/uz.js',
-                       'vn' => 'resources/moment/lang/vn.js',
-                       'zh-cn' => 'resources/moment/lang/zh-cn.js',
-                       'zh-tw' => 'resources/moment/lang/zh-tw.js',
+                       'ar-ma' => 'resources/lib/moment/lang/ar-ma.js',
+                       'ar' => 'resources/lib/moment/lang/ar.js',
+                       'bg' => 'resources/lib/moment/lang/bg.js',
+                       'br' => 'resources/lib/moment/lang/br.js',
+                       'bs' => 'resources/lib/moment/lang/bs.js',
+                       'ca' => 'resources/lib/moment/lang/ca.js',
+                       'cs' => 'resources/lib/moment/lang/cs.js',
+                       'cv' => 'resources/lib/moment/lang/cv.js',
+                       'cy' => 'resources/lib/moment/lang/cy.js',
+                       'da' => 'resources/lib/moment/lang/da.js',
+                       'de' => 'resources/lib/moment/lang/de.js',
+                       'el' => 'resources/lib/moment/lang/el.js',
+                       'en-au' => 'resources/lib/moment/lang/en-au.js',
+                       'en-ca' => 'resources/lib/moment/lang/en-ca.js',
+                       'en-gb' => 'resources/lib/moment/lang/en-gb.js',
+                       'eo' => 'resources/lib/moment/lang/eo.js',
+                       'es' => 'resources/lib/moment/lang/es.js',
+                       'et' => 'resources/lib/moment/lang/et.js',
+                       'eu' => 'resources/lib/moment/lang/eu.js',
+                       'fa' => 'resources/lib/moment/lang/fa.js',
+                       'fi' => 'resources/lib/moment/lang/fi.js',
+                       'fo' => 'resources/lib/moment/lang/fo.js',
+                       'fr-ca' => 'resources/lib/moment/lang/fr-ca.js',
+                       'fr' => 'resources/lib/moment/lang/fr.js',
+                       'gl' => 'resources/lib/moment/lang/gl.js',
+                       'he' => 'resources/lib/moment/lang/he.js',
+                       'hi' => 'resources/lib/moment/lang/hi.js',
+                       'hr' => 'resources/lib/moment/lang/hr.js',
+                       'hu' => 'resources/lib/moment/lang/hu.js',
+                       'hy-am' => 'resources/lib/moment/lang/hy-am.js',
+                       'id' => 'resources/lib/moment/lang/id.js',
+                       'is' => 'resources/lib/moment/lang/is.js',
+                       'it' => 'resources/lib/moment/lang/it.js',
+                       'ja' => 'resources/lib/moment/lang/ja.js',
+                       'ka' => 'resources/lib/moment/lang/ka.js',
+                       'ko' => 'resources/lib/moment/lang/ko.js',
+                       'lt' => 'resources/lib/moment/lang/lt.js',
+                       'lv' => 'resources/lib/moment/lang/lv.js',
+                       'mk' => 'resources/lib/moment/lang/mk.js',
+                       'ml' => 'resources/lib/moment/lang/ml.js',
+                       'mr' => 'resources/lib/moment/lang/mr.js',
+                       'ms-my' => 'resources/lib/moment/lang/ms-my.js',
+                       'nb' => 'resources/lib/moment/lang/nb.js',
+                       'ne' => 'resources/lib/moment/lang/ne.js',
+                       'nl' => 'resources/lib/moment/lang/nl.js',
+                       'nn' => 'resources/lib/moment/lang/nn.js',
+                       'pl' => 'resources/lib/moment/lang/pl.js',
+                       'pt-br' => 'resources/lib/moment/lang/pt-br.js',
+                       'pt' => 'resources/lib/moment/lang/pt.js',
+                       'ro' => 'resources/lib/moment/lang/ro.js',
+                       'rs' => 'resources/lib/moment/lang/rs.js',
+                       'ru' => 'resources/lib/moment/lang/ru.js',
+                       'sk' => 'resources/lib/moment/lang/sk.js',
+                       'sl' => 'resources/lib/moment/lang/sl.js',
+                       'sq' => 'resources/lib/moment/lang/sq.js',
+                       'sv' => 'resources/lib/moment/lang/sv.js',
+                       'ta' => 'resources/lib/moment/lang/ta.js',
+                       'th' => 'resources/lib/moment/lang/th.js',
+                       'tl-ph' => 'resources/lib/moment/lang/tl-ph.js',
+                       'tr' => 'resources/lib/moment/lang/tr.js',
+                       'tzm-la' => 'resources/lib/moment/lang/tzm-la.js',
+                       'tzm' => 'resources/lib/moment/lang/tzm.js',
+                       'uk' => 'resources/lib/moment/lang/uk.js',
+                       'uz' => 'resources/lib/moment/lang/uz.js',
+                       'vn' => 'resources/lib/moment/lang/vn.js',
+                       'zh-cn' => 'resources/lib/moment/lang/zh-cn.js',
+                       'zh-tw' => 'resources/lib/moment/lang/zh-tw.js',
                ),
        ),
 
        /* MediaWiki */
 
        'mediawiki' => array(
-               'scripts' => 'resources/mediawiki/mediawiki.js',
-               'debugScripts' => 'resources/mediawiki/mediawiki.log.js',
+               'scripts' => 'resources/src/mediawiki/mediawiki.js',
+               'debugScripts' => 'resources/src/mediawiki/mediawiki.log.js',
                'debugRaw' => false,
                'targets' => array( 'desktop', 'mobile' ),
        ),
        'mediawiki.api' => array(
-               'scripts' => 'resources/mediawiki.api/mediawiki.api.js',
+               'scripts' => 'resources/src/mediawiki.api/mediawiki.api.js',
                'dependencies' => 'mediawiki.util',
                'targets' => array( 'desktop', 'mobile' ),
        ),
        'mediawiki.api.category' => array(
-               'scripts' => 'resources/mediawiki.api/mediawiki.api.category.js',
+               'scripts' => 'resources/src/mediawiki.api/mediawiki.api.category.js',
                'dependencies' => array(
                        'mediawiki.api',
                        'mediawiki.Title',
                ),
        ),
        'mediawiki.api.edit' => array(
-               'scripts' => 'resources/mediawiki.api/mediawiki.api.edit.js',
+               'scripts' => 'resources/src/mediawiki.api/mediawiki.api.edit.js',
                'dependencies' => array(
                        'mediawiki.api',
                        'mediawiki.Title',
+                       'user.tokens',
                ),
        ),
        'mediawiki.api.login' => array(
-               'scripts' => 'resources/mediawiki.api/mediawiki.api.login.js',
+               'scripts' => 'resources/src/mediawiki.api/mediawiki.api.login.js',
                'dependencies' => array(
                        'mediawiki.api',
                ),
        ),
        'mediawiki.api.parse' => array(
-               'scripts' => 'resources/mediawiki.api/mediawiki.api.parse.js',
+               'scripts' => 'resources/src/mediawiki.api/mediawiki.api.parse.js',
                'dependencies' => 'mediawiki.api',
        ),
        'mediawiki.api.watch' => array(
-               'scripts' => 'resources/mediawiki.api/mediawiki.api.watch.js',
+               'scripts' => 'resources/src/mediawiki.api/mediawiki.api.watch.js',
                'dependencies' => array(
                        'mediawiki.api',
                        'user.tokens',
@@ -759,12 +758,12 @@ return array(
        ),
        'mediawiki.debug' => array(
                'scripts' => array(
-                       'resources/mediawiki/mediawiki.debug.js',
-                       'resources/mediawiki/mediawiki.debug.profile.js'
+                       'resources/src/mediawiki/mediawiki.debug.js',
+                       'resources/src/mediawiki/mediawiki.debug.profile.js'
                ),
                'styles' => array(
-                       'resources/mediawiki/mediawiki.debug.less',
-                       'resources/mediawiki/mediawiki.debug.profile.css'
+                       'resources/src/mediawiki/mediawiki.debug.less',
+                       'resources/src/mediawiki/mediawiki.debug.profile.css'
                ),
                'dependencies' => array(
                        'jquery.footHovzer',
@@ -773,15 +772,15 @@ return array(
                'position' => 'bottom',
        ),
        'mediawiki.debug.init' => array(
-               'scripts' => 'resources/mediawiki/mediawiki.debug.init.js',
+               'scripts' => 'resources/src/mediawiki/mediawiki.debug.init.js',
                'dependencies' => 'mediawiki.debug',
                // Uses a custom mw.config variable that is set in debughtml,
                // must be loaded on the bottom
                'position' => 'bottom',
        ),
        'mediawiki.feedback' => array(
-               'scripts' => 'resources/mediawiki/mediawiki.feedback.js',
-               'styles' => 'resources/mediawiki/mediawiki.feedback.css',
+               'scripts' => 'resources/src/mediawiki/mediawiki.feedback.js',
+               'styles' => 'resources/src/mediawiki/mediawiki.feedback.css',
                'dependencies' => array(
                        'mediawiki.api.edit',
                        'mediawiki.Title',
@@ -805,28 +804,28 @@ return array(
                ),
        ),
        'mediawiki.hidpi' => array(
-               'scripts' => 'resources/mediawiki/mediawiki.hidpi.js',
+               'scripts' => 'resources/src/mediawiki/mediawiki.hidpi.js',
                'dependencies' => array(
                        'jquery.hidpi',
                ),
                'targets' => array( 'desktop', 'mobile' ),
        ),
        'mediawiki.hlist' => array(
-               'styles' => 'resources/mediawiki/mediawiki.hlist.css',
-               'scripts' => 'resources/mediawiki/mediawiki.hlist.js',
+               'styles' => 'resources/src/mediawiki/mediawiki.hlist.css',
+               'scripts' => 'resources/src/mediawiki/mediawiki.hlist.js',
                'dependencies' => array(
                        'jquery.client',
                ),
        ),
        'mediawiki.htmlform' => array(
-               'scripts' => 'resources/mediawiki/mediawiki.htmlform.js',
+               'scripts' => 'resources/src/mediawiki/mediawiki.htmlform.js',
                'messages' => array( 'htmlform-chosen-placeholder' ),
        ),
        'mediawiki.icon' => array(
-               'styles' => 'resources/mediawiki/mediawiki.icon.less',
+               'styles' => 'resources/src/mediawiki/mediawiki.icon.less',
        ),
        'mediawiki.inspect' => array(
-               'scripts' => 'resources/mediawiki/mediawiki.inspect.js',
+               'scripts' => 'resources/src/mediawiki/mediawiki.inspect.js',
                'dependencies' => array(
                        'jquery.byteLength',
                        'jquery.json',
@@ -835,28 +834,28 @@ return array(
        ),
        'mediawiki.notification' => array(
                'styles' => array(
-                       'resources/mediawiki/mediawiki.notification.css',
-                       'resources/mediawiki/mediawiki.notification.hideForPrint.css' => array( 'media' => 'print' ),
+                       'resources/src/mediawiki/mediawiki.notification.css',
+                       'resources/src/mediawiki/mediawiki.notification.hideForPrint.css'
+                               => array( 'media' => 'print' ),
                ),
-               'scripts' => 'resources/mediawiki/mediawiki.notification.js',
+               'scripts' => 'resources/src/mediawiki/mediawiki.notification.js',
                'dependencies' => array(
                        'mediawiki.page.startup',
                ),
                'targets' => array( 'desktop', 'mobile' ),
        ),
        'mediawiki.notify' => array(
-               'scripts' => 'resources/mediawiki/mediawiki.notify.js',
+               'scripts' => 'resources/src/mediawiki/mediawiki.notify.js',
                'targets' => array( 'desktop', 'mobile' ),
        ),
        'mediawiki.searchSuggest' => array(
-               'scripts' => 'resources/mediawiki/mediawiki.searchSuggest.js',
-               'styles' => 'resources/mediawiki/mediawiki.searchSuggest.css',
+               'scripts' => 'resources/src/mediawiki/mediawiki.searchSuggest.js',
+               'styles' => 'resources/src/mediawiki/mediawiki.searchSuggest.css',
                'messages' => array(
                        'searchsuggest-search',
                        'searchsuggest-containing',
                ),
                'dependencies' => array(
-                       'jquery.autoEllipsis',
                        'jquery.client',
                        'jquery.placeholder',
                        'jquery.suggestions',
@@ -864,7 +863,7 @@ return array(
                ),
        ),
        'mediawiki.Title' => array(
-               'scripts' => 'resources/mediawiki/mediawiki.Title.js',
+               'scripts' => 'resources/src/mediawiki/mediawiki.Title.js',
                'dependencies' => array(
                        'jquery.byteLength',
                        'mediawiki.util',
@@ -872,7 +871,7 @@ return array(
                'targets' => array( 'desktop', 'mobile' ),
        ),
        'mediawiki.toc' => array(
-               'scripts' => 'resources/mediawiki/mediawiki.toc.js',
+               'scripts' => 'resources/src/mediawiki/mediawiki.toc.js',
                'dependencies' => array(
                        'jquery.cookie',
                ),
@@ -880,11 +879,11 @@ return array(
                'targets' => array( 'desktop', 'mobile' ),
        ),
        'mediawiki.Uri' => array(
-               'scripts' => 'resources/mediawiki/mediawiki.Uri.js',
+               'scripts' => 'resources/src/mediawiki/mediawiki.Uri.js',
                'targets' => array( 'desktop', 'mobile' ),
        ),
        'mediawiki.user' => array(
-               'scripts' => 'resources/mediawiki/mediawiki.user.js',
+               'scripts' => 'resources/src/mediawiki/mediawiki.user.js',
                'dependencies' => array(
                        'jquery.cookie',
                        'mediawiki.api',
@@ -894,7 +893,7 @@ return array(
                'targets' => array( 'desktop', 'mobile' ),
        ),
        'mediawiki.util' => array(
-               'scripts' => 'resources/mediawiki/mediawiki.util.js',
+               'scripts' => 'resources/src/mediawiki/mediawiki.util.js',
                'dependencies' => array(
                        'jquery.client',
                        'jquery.mwExtension',
@@ -908,7 +907,7 @@ return array(
        /* MediaWiki Action */
 
        'mediawiki.action.edit' => array(
-               'scripts' => 'resources/mediawiki.action/mediawiki.action.edit.js',
+               'scripts' => 'resources/src/mediawiki.action/mediawiki.action.edit.js',
                'dependencies' => array(
                        'mediawiki.action.edit.styles',
                        'jquery.textSelection',
@@ -917,12 +916,12 @@ return array(
                'position' => 'top',
        ),
        'mediawiki.action.edit.styles' => array(
-               'styles' => 'resources/mediawiki.action/mediawiki.action.edit.styles.css',
+               'styles' => 'resources/src/mediawiki.action/mediawiki.action.edit.styles.css',
                'position' => 'top',
        ),
        'mediawiki.action.edit.collapsibleFooter' => array(
-               'scripts' => 'resources/mediawiki.action/mediawiki.action.edit.collapsibleFooter.js',
-               'styles' => 'resources/mediawiki.action/mediawiki.action.edit.collapsibleFooter.css',
+               'scripts' => 'resources/src/mediawiki.action/mediawiki.action.edit.collapsibleFooter.js',
+               'styles' => 'resources/src/mediawiki.action/mediawiki.action.edit.collapsibleFooter.css',
                'dependencies' => array(
                        'jquery.makeCollapsible',
                        'jquery.cookie',
@@ -930,7 +929,7 @@ return array(
                ),
        ),
        'mediawiki.action.edit.preview' => array(
-               'scripts' => 'resources/mediawiki.action/mediawiki.action.edit.preview.js',
+               'scripts' => 'resources/src/mediawiki.action/mediawiki.action.edit.preview.js',
                'dependencies' => array(
                        'jquery.form',
                        'jquery.spinner',
@@ -938,31 +937,31 @@ return array(
                ),
        ),
        'mediawiki.action.history' => array(
-               'scripts' => 'resources/mediawiki.action/mediawiki.action.history.js',
+               'scripts' => 'resources/src/mediawiki.action/mediawiki.action.history.js',
                'group' => 'mediawiki.action.history',
        ),
        'mediawiki.action.history.diff' => array(
-               'styles' => 'resources/mediawiki.action/mediawiki.action.history.diff.css',
+               'styles' => 'resources/src/mediawiki.action/mediawiki.action.history.diff.css',
                'group' => 'mediawiki.action.history',
                'targets' => array( 'desktop', 'mobile' ),
        ),
        'mediawiki.action.view.dblClickEdit' => array(
-               'scripts' => 'resources/mediawiki.action/mediawiki.action.view.dblClickEdit.js',
+               'scripts' => 'resources/src/mediawiki.action/mediawiki.action.view.dblClickEdit.js',
                'dependencies' => array(
                        'mediawiki.util',
                        'mediawiki.page.startup',
                ),
        ),
        'mediawiki.action.view.metadata' => array(
-               'scripts' => 'resources/mediawiki.action/mediawiki.action.view.metadata.js',
+               'scripts' => 'resources/src/mediawiki.action/mediawiki.action.view.metadata.js',
                'messages' => array(
                        'metadata-expand',
                        'metadata-collapse',
                ),
        ),
        'mediawiki.action.view.postEdit' => array(
-               'scripts' => 'resources/mediawiki.action/mediawiki.action.view.postEdit.js',
-               'styles' => 'resources/mediawiki.action/mediawiki.action.view.postEdit.css',
+               'scripts' => 'resources/src/mediawiki.action/mediawiki.action.view.postEdit.js',
+               'styles' => 'resources/src/mediawiki.action/mediawiki.action.view.postEdit.css',
                'dependencies' => array(
                        'jquery.cookie',
                        'mediawiki.jqueryMsg'
@@ -972,17 +971,17 @@ return array(
                ),
        ),
        'mediawiki.action.view.redirectToFragment' => array(
-               'scripts' => 'resources/mediawiki.action/mediawiki.action.view.redirectToFragment.js',
+               'scripts' => 'resources/src/mediawiki.action/mediawiki.action.view.redirectToFragment.js',
                'dependencies' => array(
                        'jquery.client',
                ),
                'position' => 'top',
        ),
        'mediawiki.action.view.rightClickEdit' => array(
-               'scripts' => 'resources/mediawiki.action/mediawiki.action.view.rightClickEdit.js',
+               'scripts' => 'resources/src/mediawiki.action/mediawiki.action.view.rightClickEdit.js',
        ),
        'mediawiki.action.edit.editWarning' => array(
-               'scripts' => 'resources/mediawiki.action/mediawiki.action.edit.editWarning.js',
+               'scripts' => 'resources/src/mediawiki.action/mediawiki.action.edit.editWarning.js',
                'dependencies' => array(
                        'mediawiki.jqueryMsg'
                ),
@@ -1000,23 +999,23 @@ return array(
 
        'mediawiki.language' => array(
                'scripts' => array(
-                       'resources/mediawiki.language/mediawiki.language.js',
-                       'resources/mediawiki.language/mediawiki.language.numbers.js'
+                       'resources/src/mediawiki.language/mediawiki.language.js',
+                       'resources/src/mediawiki.language/mediawiki.language.numbers.js'
                ),
                'languageScripts' => array(
-                       'bs' => 'resources/mediawiki.language/languages/bs.js',
-                       'dsb' => 'resources/mediawiki.language/languages/dsb.js',
-                       'fi' => 'resources/mediawiki.language/languages/fi.js',
-                       'ga' => 'resources/mediawiki.language/languages/ga.js',
-                       'he' => 'resources/mediawiki.language/languages/he.js',
-                       'hsb' => 'resources/mediawiki.language/languages/hsb.js',
-                       'hu' => 'resources/mediawiki.language/languages/hu.js',
-                       'hy' => 'resources/mediawiki.language/languages/hy.js',
-                       'la' => 'resources/mediawiki.language/languages/la.js',
-                       'os' => 'resources/mediawiki.language/languages/os.js',
-                       'ru' => 'resources/mediawiki.language/languages/ru.js',
-                       'sl' => 'resources/mediawiki.language/languages/sl.js',
-                       'uk' => 'resources/mediawiki.language/languages/uk.js',
+                       'bs' => 'resources/src/mediawiki.language/languages/bs.js',
+                       'dsb' => 'resources/src/mediawiki.language/languages/dsb.js',
+                       'fi' => 'resources/src/mediawiki.language/languages/fi.js',
+                       'ga' => 'resources/src/mediawiki.language/languages/ga.js',
+                       'he' => 'resources/src/mediawiki.language/languages/he.js',
+                       'hsb' => 'resources/src/mediawiki.language/languages/hsb.js',
+                       'hu' => 'resources/src/mediawiki.language/languages/hu.js',
+                       'hy' => 'resources/src/mediawiki.language/languages/hy.js',
+                       'la' => 'resources/src/mediawiki.language/languages/la.js',
+                       'os' => 'resources/src/mediawiki.language/languages/os.js',
+                       'ru' => 'resources/src/mediawiki.language/languages/ru.js',
+                       'sl' => 'resources/src/mediawiki.language/languages/sl.js',
+                       'uk' => 'resources/src/mediawiki.language/languages/uk.js',
                ),
                'dependencies' => array(
                                'mediawiki.language.data',
@@ -1026,7 +1025,7 @@ return array(
        ),
 
        'mediawiki.cldr' => array(
-               'scripts' => 'resources/mediawiki.language/mediawiki.cldr.js',
+               'scripts' => 'resources/src/mediawiki.language/mediawiki.cldr.js',
                'dependencies' => array(
                        'mediawiki.libs.pluralruleparser',
                ),
@@ -1034,17 +1033,17 @@ return array(
        ),
 
        'mediawiki.libs.pluralruleparser' => array(
-               'scripts' => 'resources/mediawiki.libs/CLDRPluralRuleParser.js',
+               'scripts' => 'resources/src/mediawiki.libs/CLDRPluralRuleParser.js',
                'targets' => array( 'desktop', 'mobile' ),
        ),
 
        'mediawiki.language.init' => array(
-               'scripts' => 'resources/mediawiki.language/mediawiki.language.init.js',
+               'scripts' => 'resources/src/mediawiki.language/mediawiki.language.init.js',
                'targets' => array( 'desktop', 'mobile' ),
        ),
 
        'mediawiki.jqueryMsg' => array(
-               'scripts' => 'resources/mediawiki/mediawiki.jqueryMsg.js',
+               'scripts' => 'resources/src/mediawiki/mediawiki.jqueryMsg.js',
                'dependencies' => array(
                        'mediawiki.util',
                        'mediawiki.language',
@@ -1053,7 +1052,7 @@ return array(
        ),
 
        'mediawiki.language.months' => array(
-               'scripts' => 'resources/mediawiki.language/mediawiki.language.months.js',
+               'scripts' => 'resources/src/mediawiki.language/mediawiki.language.months.js',
                'dependencies' => 'mediawiki.language',
                'messages' => array_merge(
                        Language::$mMonthMsgs,
@@ -1065,16 +1064,16 @@ return array(
        /* MediaWiki Libs */
 
        'mediawiki.libs.jpegmeta' => array(
-               'scripts' => 'resources/mediawiki.libs/mediawiki.libs.jpegmeta.js',
+               'scripts' => 'resources/src/mediawiki.libs/mediawiki.libs.jpegmeta.js',
        ),
 
        /* MediaWiki Page */
 
        'mediawiki.page.gallery' => array(
-               'scripts' => 'resources/mediawiki.page/mediawiki.page.gallery.js',
+               'scripts' => 'resources/src/mediawiki.page/mediawiki.page.gallery.js',
        ),
        'mediawiki.page.ready' => array(
-               'scripts' => 'resources/mediawiki.page/mediawiki.page.ready.js',
+               'scripts' => 'resources/src/mediawiki.page/mediawiki.page.ready.js',
                'dependencies' => array(
                        'jquery.checkboxShiftClick',
                        'jquery.makeCollapsible',
@@ -1085,16 +1084,15 @@ return array(
                'targets' => array( 'desktop', 'mobile' ),
        ),
        'mediawiki.page.startup' => array(
-               'scripts' => 'resources/mediawiki.page/mediawiki.page.startup.js',
+               'scripts' => 'resources/src/mediawiki.page/mediawiki.page.startup.js',
                'dependencies' => array(
-                       'jquery.client',
                        'mediawiki.util',
                ),
                'position' => 'top',
                'targets' => array( 'desktop', 'mobile' ),
        ),
        'mediawiki.page.patrol.ajax' => array(
-               'scripts' => 'resources/mediawiki.page/mediawiki.page.patrol.ajax.js',
+               'scripts' => 'resources/src/mediawiki.page/mediawiki.page.patrol.ajax.js',
                'dependencies' => array(
                        'mediawiki.page.startup',
                        'mediawiki.api',
@@ -1111,7 +1109,7 @@ return array(
                ),
        ),
        'mediawiki.page.watch.ajax' => array(
-               'scripts' => 'resources/mediawiki.page/mediawiki.page.watch.ajax.js',
+               'scripts' => 'resources/src/mediawiki.page/mediawiki.page.watch.ajax.js',
                'dependencies' => array(
                        'mediawiki.page.startup',
                        'mediawiki.api.watch',
@@ -1130,29 +1128,29 @@ return array(
                ),
        ),
        'mediawiki.page.image.pagination' => array(
-               'scripts' => 'resources/mediawiki.page/mediawiki.page.image.pagination.js',
+               'scripts' => 'resources/src/mediawiki.page/mediawiki.page.image.pagination.js',
                'dependencies' => array( 'jquery.spinner' )
        ),
 
        /* MediaWiki Special pages */
 
        'mediawiki.special' => array(
-               'scripts' => 'resources/mediawiki.special/mediawiki.special.js',
-               'styles' => 'resources/mediawiki.special/mediawiki.special.css',
+               'scripts' => 'resources/src/mediawiki.special/mediawiki.special.js',
+               'styles' => 'resources/src/mediawiki.special/mediawiki.special.css',
                'skinStyles' => array(
                        'vector' => 'skins/vector/special.less',
                ),
        ),
        'mediawiki.special.block' => array(
-               'scripts' => 'resources/mediawiki.special/mediawiki.special.block.js',
-               'styles' => 'resources/mediawiki.special/mediawiki.special.block.css',
+               'scripts' => 'resources/src/mediawiki.special/mediawiki.special.block.js',
+               'styles' => 'resources/src/mediawiki.special/mediawiki.special.block.css',
                'dependencies' => array(
                        'mediawiki.util',
                ),
        ),
        'mediawiki.special.changeemail' => array(
-               'scripts' => 'resources/mediawiki.special/mediawiki.special.changeemail.js',
-               'styles' => 'resources/mediawiki.special/mediawiki.special.changeemail.css',
+               'scripts' => 'resources/src/mediawiki.special/mediawiki.special.changeemail.js',
+               'styles' => 'resources/src/mediawiki.special/mediawiki.special.changeemail.css',
                'dependencies' => array(
                        'mediawiki.util',
                ),
@@ -1162,31 +1160,31 @@ return array(
                ),
        ),
        'mediawiki.special.changeslist' => array(
-               'styles' => 'resources/mediawiki.special/mediawiki.special.changeslist.css',
+               'styles' => 'resources/src/mediawiki.special/mediawiki.special.changeslist.css',
        ),
        'mediawiki.special.changeslist.legend' => array(
-               'styles' => 'resources/mediawiki.special/mediawiki.special.changeslist.legend.css',
+               'styles' => 'resources/src/mediawiki.special/mediawiki.special.changeslist.legend.css',
        ),
        'mediawiki.special.changeslist.legend.js' => array(
-               'scripts' => 'resources/mediawiki.special/mediawiki.special.changeslist.legend.js',
+               'scripts' => 'resources/src/mediawiki.special/mediawiki.special.changeslist.legend.js',
                'dependencies' => array(
                        'jquery.makeCollapsible',
                        'jquery.cookie',
                ),
        ),
        'mediawiki.special.changeslist.enhanced' => array(
-               'styles' => 'resources/mediawiki.special/mediawiki.special.changeslist.enhanced.css',
+               'styles' => 'resources/src/mediawiki.special/mediawiki.special.changeslist.enhanced.css',
        ),
        'mediawiki.special.movePage' => array(
-               'scripts' => 'resources/mediawiki.special/mediawiki.special.movePage.js',
+               'scripts' => 'resources/src/mediawiki.special/mediawiki.special.movePage.js',
                'dependencies' => 'jquery.byteLimit',
        ),
        'mediawiki.special.pagesWithProp' => array(
-               'styles' => 'resources/mediawiki.special/mediawiki.special.pagesWithProp.css',
+               'styles' => 'resources/src/mediawiki.special/mediawiki.special.pagesWithProp.css',
        ),
        'mediawiki.special.preferences' => array(
-               'scripts' => 'resources/mediawiki.special/mediawiki.special.preferences.js',
-               'styles' => 'resources/mediawiki.special/mediawiki.special.preferences.css',
+               'scripts' => 'resources/src/mediawiki.special/mediawiki.special.preferences.js',
+               'styles' => 'resources/src/mediawiki.special/mediawiki.special.preferences.css',
                'position' => 'top',
                'skinStyles' => array(
                        'vector' => 'skins/vector/special.preferences.less',
@@ -1199,13 +1197,13 @@ return array(
                ),
        ),
        'mediawiki.special.recentchanges' => array(
-               'scripts' => 'resources/mediawiki.special/mediawiki.special.recentchanges.js',
+               'scripts' => 'resources/src/mediawiki.special/mediawiki.special.recentchanges.js',
                'dependencies' => array( 'mediawiki.special' ),
                'position' => 'top',
        ),
        'mediawiki.special.search' => array(
-               'scripts' => 'resources/mediawiki.special/mediawiki.special.search.js',
-               'styles' => 'resources/mediawiki.special/mediawiki.special.search.css',
+               'scripts' => 'resources/src/mediawiki.special/mediawiki.special.search.js',
+               'styles' => 'resources/src/mediawiki.special/mediawiki.special.search.css',
                'messages' => array(
                        'powersearch-togglelabel',
                        'powersearch-toggleall',
@@ -1213,11 +1211,11 @@ return array(
                ),
        ),
        'mediawiki.special.undelete' => array(
-               'scripts' => 'resources/mediawiki.special/mediawiki.special.undelete.js',
+               'scripts' => 'resources/src/mediawiki.special/mediawiki.special.undelete.js',
        ),
        'mediawiki.special.upload' => array(
                // @todo merge in remainder of mediawiki.legacy.upload
-               'scripts' => 'resources/mediawiki.special/mediawiki.special.upload.js',
+               'scripts' => 'resources/src/mediawiki.special/mediawiki.special.upload.js',
                'messages' => array(
                        'widthheight',
                        'size-bytes',
@@ -1233,25 +1231,25 @@ return array(
        ),
        'mediawiki.special.userlogin.common.styles' => array(
                'styles' => array(
-                       'resources/mediawiki.special/mediawiki.special.userlogin.common.css',
+                       'resources/src/mediawiki.special/mediawiki.special.userlogin.common.css',
                ),
                'position' => 'top',
        ),
        'mediawiki.special.userlogin.signup.styles' => array(
                'styles' => array(
-                       'resources/mediawiki.special/mediawiki.special.userlogin.signup.css',
+                       'resources/src/mediawiki.special/mediawiki.special.userlogin.signup.css',
                ),
                'position' => 'top',
        ),
        'mediawiki.special.userlogin.login.styles' => array(
                'styles' => array(
-                       'resources/mediawiki.special/mediawiki.special.userlogin.login.css',
+                       'resources/src/mediawiki.special/mediawiki.special.userlogin.login.css',
                ),
                'position' => 'top',
        ),
        'mediawiki.special.userlogin.common.js' => array(
                'scripts' => array(
-                       'resources/mediawiki.special/mediawiki.special.userlogin.common.js',
+                       'resources/src/mediawiki.special/mediawiki.special.userlogin.common.js',
                ),
                'messages' => array(
                        'createacct-captcha',
@@ -1259,7 +1257,7 @@ return array(
                ),
        ),
        'mediawiki.special.userlogin.signup.js' => array(
-               'scripts' => 'resources/mediawiki.special/mediawiki.special.userlogin.signup.js',
+               'scripts' => 'resources/src/mediawiki.special/mediawiki.special.userlogin.signup.js',
                'messages' => array(
                        'createacct-error',
                        'createacct-emailrequired',
@@ -1273,7 +1271,7 @@ return array(
                ),
        ),
        'mediawiki.special.javaScriptTest' => array(
-               'scripts' => 'resources/mediawiki.special/mediawiki.special.javaScriptTest.js',
+               'scripts' => 'resources/src/mediawiki.special/mediawiki.special.javaScriptTest.js',
                'messages' => array_merge( Skin::getSkinNameMessages(), array(
                        'colon-separator',
                        'javascripttest-pagetext-skins',
@@ -1283,7 +1281,7 @@ return array(
                'targets' => array( 'desktop', 'mobile' ),
        ),
        'mediawiki.special.version' => array(
-               'styles' => 'resources/mediawiki.special/mediawiki.special.version.css',
+               'styles' => 'resources/src/mediawiki.special/mediawiki.special.version.css',
        ),
 
        /* MediaWiki Legacy */
@@ -1356,8 +1354,8 @@ return array(
 
        'mediawiki.ui' => array(
                'skinStyles' => array(
-                       'default' => 'resources/mediawiki.ui/default.less',
-                       'vector' => 'resources/mediawiki.ui/vector.less',
+                       'default' => 'resources/src/mediawiki.ui/default.less',
+                       'vector' => 'resources/src/mediawiki.ui/vector.less',
                ),
                'position' => 'top',
                'targets' => array( 'desktop', 'mobile' ),
@@ -1365,8 +1363,8 @@ return array(
        // Lightweight module for button styles
        'mediawiki.ui.button' => array(
                'skinStyles' => array(
-                       'default' => 'resources/mediawiki.ui/components/default/buttons.less',
-                       'vector' => 'resources/mediawiki.ui/components/vector/buttons.less',
+                       'default' => 'resources/src/mediawiki.ui/components/default/buttons.less',
+                       'vector' => 'resources/src/mediawiki.ui/components/vector/buttons.less',
                ),
                'position' => 'top',
                'targets' => array( 'desktop', 'mobile' ),
@@ -1377,20 +1375,20 @@ return array(
        // WILL BREAK if loaded in browsers that don't support ES5
        'oojs' => array(
                'scripts' => array(
-                       'resources/oojs/oojs.js',
+                       'resources/lib/oojs/oojs.js',
                ),
                'targets' => array( 'desktop', 'mobile' ),
        ),
        'oojs-ui' => array(
                'scripts' => array(
-                       'resources/oojs-ui/oojs-ui.js',
+                       'resources/lib/oojs-ui/oojs-ui.js',
                ),
                'styles' => array(
-                       'resources/oojs-ui/oojs-ui.svg.css',
+                       'resources/lib/oojs-ui/oojs-ui.svg.css',
                ),
                'skinStyles' => array(
-                       'default' => 'resources/oojs-ui/oojs-ui-apex.css',
-                       'minerva' => 'resources/oojs-ui/oojs-ui-agora.css',
+                       'default' => 'resources/lib/oojs-ui/oojs-ui-apex.css',
+                       'minerva' => 'resources/lib/oojs-ui/oojs-ui-agora.css',
                ),
                'messages' => array(
                        'ooui-dialog-action-close',
diff --git a/resources/jquery.chosen/LICENSE b/resources/jquery.chosen/LICENSE
deleted file mode 100644 (file)
index 0675dc5..0000000
+++ /dev/null
@@ -1,24 +0,0 @@
-# Chosen, a Select Box Enhancer for jQuery and Protoype
-## by Patrick Filler for [Harvest](http://getharvest.com)
-
-Available for use under the [MIT License](http://en.wikipedia.org/wiki/MIT_License)
-
-Copyright (c) 2011-2013 by Harvest
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
diff --git a/resources/jquery.chosen/chosen-sprite.png b/resources/jquery.chosen/chosen-sprite.png
deleted file mode 100644 (file)
index 3611ae4..0000000
Binary files a/resources/jquery.chosen/chosen-sprite.png and /dev/null differ
diff --git a/resources/jquery.chosen/chosen-sprite@2x.png b/resources/jquery.chosen/chosen-sprite@2x.png
deleted file mode 100644 (file)
index bd61d96..0000000
Binary files a/resources/jquery.chosen/chosen-sprite@2x.png and /dev/null differ
diff --git a/resources/jquery.chosen/chosen.css b/resources/jquery.chosen/chosen.css
deleted file mode 100644 (file)
index 17793ed..0000000
+++ /dev/null
@@ -1,440 +0,0 @@
-/* @group Base */
-.chzn-container {
-  font-size: 13px;
-  position: relative;
-  display: inline-block;
-  vertical-align: middle;
-  zoom: 1;
-  *display: inline;
-}
-.chzn-container .chzn-drop {
-  background: #fff;
-  border: 1px solid #aaa;
-  border-top: 0;
-  position: absolute;
-  top: 100%;
-  left: -9999px;
-  -webkit-box-shadow: 0 4px 5px rgba(0,0,0,.15);
-  -moz-box-shadow   : 0 4px 5px rgba(0,0,0,.15);
-  box-shadow        : 0 4px 5px rgba(0,0,0,.15);
-  z-index: 1010;
-  width: 100%;
-  -moz-box-sizing   : border-box;
-  -ms-box-sizing    : border-box;
-  -webkit-box-sizing: border-box;
-  -khtml-box-sizing : border-box;
-  box-sizing        : border-box;
-}
-
-.chzn-container.chzn-with-drop .chzn-drop {
-  left: 0;
-}
-
-/* @end */
-
-/* @group Single Chosen */
-.chzn-container-single .chzn-single {
-  background-color: #ffffff;
-  filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#ffffff', endColorstr='#eeeeee', GradientType=0 );   
-  background-image: -webkit-gradient(linear, 0 0, 0 100%, color-stop(20%, #ffffff), color-stop(50%, #f6f6f6), color-stop(52%, #eeeeee), color-stop(100%, #f4f4f4));
-  background-image: -webkit-linear-gradient(top, #ffffff 20%, #f6f6f6 50%, #eeeeee 52%, #f4f4f4 100%);
-  background-image: -moz-linear-gradient(top, #ffffff 20%, #f6f6f6 50%, #eeeeee 52%, #f4f4f4 100%);
-  background-image: -o-linear-gradient(top, #ffffff 20%, #f6f6f6 50%, #eeeeee 52%, #f4f4f4 100%);
-  background-image: linear-gradient(#ffffff 20%, #f6f6f6 50%, #eeeeee 52%, #f4f4f4 100%); 
-  -webkit-border-radius: 5px;
-  -moz-border-radius   : 5px;
-  border-radius        : 5px;
-  -moz-background-clip   : padding;
-  -webkit-background-clip: padding-box;
-  background-clip        : padding-box;
-  border: 1px solid #aaaaaa;
-  -webkit-box-shadow: 0 0 3px #ffffff inset, 0 1px 1px rgba(0,0,0,0.1);
-  -moz-box-shadow   : 0 0 3px #ffffff inset, 0 1px 1px rgba(0,0,0,0.1);
-  box-shadow        : 0 0 3px #ffffff inset, 0 1px 1px rgba(0,0,0,0.1);
-  display: block;
-  overflow: hidden;
-  white-space: nowrap;
-  position: relative;
-  height: 23px;
-  line-height: 24px;
-  padding: 0 0 0 8px;
-  color: #444444;
-  text-decoration: none;
-}
-.chzn-container-single .chzn-default {
-  color: #999;
-}
-.chzn-container-single .chzn-single span {
-  margin-right: 26px;
-  display: block;
-  overflow: hidden;
-  white-space: nowrap;
-  -o-text-overflow: ellipsis;
-  -ms-text-overflow: ellipsis;
-  text-overflow: ellipsis;
-}
-.chzn-container-single .chzn-single abbr {
-  display: block;
-  position: absolute;
-  right: 26px;
-  top: 6px;
-  width: 12px;
-  height: 12px;
-  font-size: 1px;
-  background: url('chosen-sprite.png') -42px 1px no-repeat;
-}
-.chzn-container-single .chzn-single abbr:hover {
-  background-position: -42px -10px;
-}
-.chzn-container-single.chzn-disabled .chzn-single abbr:hover {
-  background-position: -42px -10px;
-}
-.chzn-container-single .chzn-single div {
-  position: absolute;
-  right: 0;
-  top: 0;
-  display: block;
-  height: 100%;
-  width: 18px;
-}
-.chzn-container-single .chzn-single div b {
-  background: url('chosen-sprite.png') no-repeat 0px 2px;
-  display: block;
-  width: 100%;
-  height: 100%;
-}
-.chzn-container-single .chzn-search {
-  padding: 3px 4px;
-  position: relative;
-  margin: 0;
-  white-space: nowrap;
-  z-index: 1010;
-}
-.chzn-container-single .chzn-search input {
-  background: #fff url('chosen-sprite.png') no-repeat 100% -20px;
-  background: url('chosen-sprite.png') no-repeat 100% -20px, -webkit-gradient(linear, 0 0, 0 100%, color-stop(1%, #eeeeee), color-stop(15%, #ffffff));
-  background: url('chosen-sprite.png') no-repeat 100% -20px, -webkit-linear-gradient(top, #eeeeee 1%, #ffffff 15%);
-  background: url('chosen-sprite.png') no-repeat 100% -20px, -moz-linear-gradient(top, #eeeeee 1%, #ffffff 15%);
-  background: url('chosen-sprite.png') no-repeat 100% -20px, -o-linear-gradient(top, #eeeeee 1%, #ffffff 15%);
-  background: url('chosen-sprite.png') no-repeat 100% -20px, linear-gradient(#eeeeee 1%, #ffffff 15%);
-  margin: 1px 0;
-  padding: 4px 20px 4px 5px;
-  outline: 0;
-  border: 1px solid #aaa;
-  font-family: sans-serif;
-  font-size: 1em;
-  width: 100%;
-  -moz-box-sizing   : border-box;
-  -ms-box-sizing    : border-box;
-  -webkit-box-sizing: border-box;
-  -khtml-box-sizing : border-box;
-  box-sizing        : border-box;
-}
-.chzn-container-single .chzn-drop {
-  margin-top: -1px;
-  -webkit-border-radius: 0 0 4px 4px;
-  -moz-border-radius   : 0 0 4px 4px;
-  border-radius        : 0 0 4px 4px;
-  -moz-background-clip   : padding;
-  -webkit-background-clip: padding-box;
-  background-clip        : padding-box;
-}
-.chzn-container-single-nosearch .chzn-search {
-  position: absolute;
-  left: -9999px;
-}
-/* @end */
-
-/* @group Multi Chosen */
-.chzn-container-multi .chzn-choices {
-  background-color: #fff;
-  background-image: -webkit-gradient(linear, 0 0, 0 100%, color-stop(1%, #eeeeee), color-stop(15%, #ffffff));
-  background-image: -webkit-linear-gradient(top, #eeeeee 1%, #ffffff 15%);
-  background-image: -moz-linear-gradient(top, #eeeeee 1%, #ffffff 15%);
-  background-image: -o-linear-gradient(top, #eeeeee 1%, #ffffff 15%);
-  background-image: linear-gradient(#eeeeee 1%, #ffffff 15%);
-  border: 1px solid #aaa;
-  margin: 0;
-  padding: 0;
-  cursor: text;
-  overflow: hidden;
-  height: auto !important;
-  height: 1%;
-  position: relative;
-  width: 100%;
-  -moz-box-sizing   : border-box;
-  -ms-box-sizing    : border-box;
-  -webkit-box-sizing: border-box;
-  -khtml-box-sizing : border-box;
-  box-sizing        : border-box;
-}
-.chzn-container-multi .chzn-choices li {
-  float: left;
-  list-style: none;
-}
-.chzn-container-multi .chzn-choices .search-field {
-  white-space: nowrap;
-  margin: 0;
-  padding: 0;
-}
-.chzn-container-multi .chzn-choices .search-field input {
-  color: #666;
-  background: transparent !important;
-  border: 0 !important;
-  font-family: sans-serif;
-  font-size: 100%;
-  height: 15px;
-  padding: 5px;
-  margin: 1px 0;
-  outline: 0;
-  -webkit-box-shadow: none;
-  -moz-box-shadow   : none;
-  box-shadow        : none;
-}
-.chzn-container-multi .chzn-choices .search-field .default {
-  color: #999;
-}
-.chzn-container-multi .chzn-choices .search-choice {
-  -webkit-border-radius: 3px;
-  -moz-border-radius   : 3px;
-  border-radius        : 3px;
-  -moz-background-clip   : padding;
-  -webkit-background-clip: padding-box;
-  background-clip        : padding-box;
-  background-color: #e4e4e4;
-  filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#f4f4f4', endColorstr='#eeeeee', GradientType=0 ); 
-  background-image: -webkit-gradient(linear, 0 0, 0 100%, color-stop(20%, #f4f4f4), color-stop(50%, #f0f0f0), color-stop(52%, #e8e8e8), color-stop(100%, #eeeeee));
-  background-image: -webkit-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);
-  background-image: -moz-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);
-  background-image: -o-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);
-  background-image: linear-gradient(#f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%); 
-  -webkit-box-shadow: 0 0 2px #ffffff inset, 0 1px 0 rgba(0,0,0,0.05);
-  -moz-box-shadow   : 0 0 2px #ffffff inset, 0 1px 0 rgba(0,0,0,0.05);
-  box-shadow        : 0 0 2px #ffffff inset, 0 1px 0 rgba(0,0,0,0.05);
-  color: #333;
-  border: 1px solid #aaaaaa;
-  line-height: 13px;
-  padding: 3px 20px 3px 5px;
-  margin: 3px 0 3px 5px;
-  position: relative;
-  cursor: default;
-}
-.chzn-container-multi .chzn-choices .search-choice.search-choice-disabled {
-  background-color: #e4e4e4;
-  filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#f4f4f4', endColorstr='#eeeeee', GradientType=0 );
-  background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, color-stop(20%, #f4f4f4), color-stop(50%, #f0f0f0), color-stop(52%, #e8e8e8), color-stop(100%, #eeeeee));
-  background-image: -webkit-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);
-  background-image: -moz-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);
-  background-image: -o-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);
-  background-image: -ms-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);
-  background-image: linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);
-  color: #666;
-  border: 1px solid #cccccc;
-  padding-right: 5px;
-}
-.chzn-container-multi .chzn-choices .search-choice-focus {
-  background: #d4d4d4;
-}
-.chzn-container-multi .chzn-choices .search-choice .search-choice-close {
-  display: block;
-  position: absolute;
-  right: 3px;
-  top: 4px;
-  width: 12px;
-  height: 12px;
-  font-size: 1px;
-  background: url('chosen-sprite.png') -42px 1px no-repeat;
-}
-.chzn-container-multi .chzn-choices .search-choice .search-choice-close:hover {
-  background-position: -42px -10px;
-}
-.chzn-container-multi .chzn-choices .search-choice-focus .search-choice-close {
-  background-position: -42px -10px;
-}
-/* @end */
-
-/* @group Results */
-.chzn-container .chzn-results {
-  margin: 0 4px 4px 0;
-  max-height: 240px;
-  padding: 0 0 0 4px;
-  position: relative;
-  overflow-x: hidden;
-  overflow-y: auto;
-  -webkit-overflow-scrolling: touch;
-}
-.chzn-container-multi .chzn-results {
-  margin: 0;
-  padding: 0;
-}
-.chzn-container .chzn-results li {
-  display: none;
-  line-height: 15px;
-  padding: 5px 6px;
-  margin: 0;
-  list-style: none;
-}
-.chzn-container .chzn-results .active-result {
-  cursor: pointer;
-  display: list-item;
-}
-.chzn-container .chzn-results .highlighted {
-  background-color: #3875d7;
-  filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#3875d7', endColorstr='#2a62bc', GradientType=0 );  
-  background-image: -webkit-gradient(linear, 0 0, 0 100%, color-stop(20%, #3875d7), color-stop(90%, #2a62bc));
-  background-image: -webkit-linear-gradient(top, #3875d7 20%, #2a62bc 90%);
-  background-image: -moz-linear-gradient(top, #3875d7 20%, #2a62bc 90%);
-  background-image: -o-linear-gradient(top, #3875d7 20%, #2a62bc 90%);
-  background-image: linear-gradient(#3875d7 20%, #2a62bc 90%);
-  color: #fff;
-}
-.chzn-container .chzn-results li em {
-  background: #feffde;
-  font-style: normal;
-}
-.chzn-container .chzn-results .highlighted em {
-  background: transparent;
-}
-.chzn-container .chzn-results .no-results {
-  background: #f4f4f4;
-  display: list-item;
-}
-.chzn-container .chzn-results .group-result {
-  cursor: default;
-  color: #999;
-  font-weight: bold;
-}
-.chzn-container .chzn-results .group-option {
-  padding-left: 15px;
-}
-.chzn-container-multi .chzn-drop .result-selected {
-  display: none;
-}
-.chzn-container .chzn-results-scroll {
-  background: white;
-  margin: 0 4px;
-  position: absolute;
-  text-align: center;
-  width: 321px; /* This should by dynamic with js */
-  z-index: 1;
-}
-.chzn-container .chzn-results-scroll span {
-  display: inline-block;
-  height: 17px;
-  text-indent: -5000px;
-  width: 9px;
-}
-.chzn-container .chzn-results-scroll-down {
-  bottom: 0;
-}
-.chzn-container .chzn-results-scroll-down span {
-  background: url('chosen-sprite.png') no-repeat -4px -3px;
-}
-.chzn-container .chzn-results-scroll-up span {
-  background: url('chosen-sprite.png') no-repeat -22px -3px;
-}
-/* @end */
-
-/* @group Active  */
-.chzn-container-active .chzn-single {
-  -webkit-box-shadow: 0 0 5px rgba(0,0,0,.3);
-  -moz-box-shadow   : 0 0 5px rgba(0,0,0,.3);
-  box-shadow        : 0 0 5px rgba(0,0,0,.3);
-  border: 1px solid #5897fb;
-}
-.chzn-container-active.chzn-with-drop .chzn-single {
-  border: 1px solid #aaa;
-  -webkit-box-shadow: 0 1px 0 #fff inset;
-  -moz-box-shadow   : 0 1px 0 #fff inset;
-  box-shadow        : 0 1px 0 #fff inset;
-  background-color: #eee;
-  filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#eeeeee', endColorstr='#ffffff', GradientType=0 );
-  background-image: -webkit-gradient(linear, 0 0, 0 100%, color-stop(20%, #eeeeee), color-stop(80%, #ffffff));
-  background-image: -webkit-linear-gradient(top, #eeeeee 20%, #ffffff 80%);
-  background-image: -moz-linear-gradient(top, #eeeeee 20%, #ffffff 80%);
-  background-image: -o-linear-gradient(top, #eeeeee 20%, #ffffff 80%);
-  background-image: linear-gradient(#eeeeee 20%, #ffffff 80%);
-  -webkit-border-bottom-left-radius : 0;
-  -webkit-border-bottom-right-radius: 0;
-  -moz-border-radius-bottomleft : 0;
-  -moz-border-radius-bottomright: 0;
-  border-bottom-left-radius : 0;
-  border-bottom-right-radius: 0;
-}
-.chzn-container-active.chzn-with-drop .chzn-single div {
-  background: transparent;
-  border-left: none;
-}
-.chzn-container-active.chzn-with-drop .chzn-single div b {
-  background-position: -18px 2px;
-}
-.chzn-container-active .chzn-choices {
-  -webkit-box-shadow: 0 0 5px rgba(0,0,0,.3);
-  -moz-box-shadow   : 0 0 5px rgba(0,0,0,.3);
-  box-shadow        : 0 0 5px rgba(0,0,0,.3);
-  border: 1px solid #5897fb;
-}
-.chzn-container-active .chzn-choices .search-field input {
-  color: #111 !important;
-}
-/* @end */
-
-/* @group Disabled Support */
-.chzn-disabled {
-  cursor: default;
-  opacity:0.5 !important;
-}
-.chzn-disabled .chzn-single {
-  cursor: default;
-}
-.chzn-disabled .chzn-choices .search-choice .search-choice-close {
-  cursor: default;
-}
-
-/* @group Right to Left */
-.chzn-rtl { text-align: right; }
-.chzn-rtl .chzn-single { padding: 0 8px 0 0; overflow: visible; }
-.chzn-rtl .chzn-single span { margin-left: 26px; margin-right: 0; direction: rtl; }
-
-.chzn-rtl .chzn-single div { left: 3px; right: auto; }
-.chzn-rtl .chzn-single abbr {
-  left: 26px;
-  right: auto;
-}
-.chzn-rtl .chzn-choices .search-field input { direction: rtl; }
-.chzn-rtl .chzn-choices li { float: right; }
-.chzn-rtl .chzn-choices .search-choice { padding: 3px 5px 3px 19px; margin: 3px 5px 3px 0; }
-.chzn-rtl .chzn-choices .search-choice .search-choice-close { left: 4px; right: auto; }
-.chzn-rtl .chzn-search { left: 9999px; }
-.chzn-rtl.chzn-with-drop .chzn-search { left: 0px; }
-.chzn-rtl .chzn-drop { left: 9999px; }
-.chzn-rtl.chzn-container-single .chzn-results { margin: 0 0 4px 4px; padding: 0 4px 0 0; }
-.chzn-rtl .chzn-results .group-option { padding-left: 0; padding-right: 15px; }
-.chzn-rtl.chzn-container-active.chzn-with-drop .chzn-single div { border-right: none; }
-.chzn-rtl .chzn-search input {
-  background: #fff url('chosen-sprite.png') no-repeat -30px -20px;
-  background: url('chosen-sprite.png') no-repeat -30px -20px, -webkit-gradient(linear, 0 0, 0 100%, color-stop(1%, #eeeeee), color-stop(15%, #ffffff));
-  background: url('chosen-sprite.png') no-repeat -30px -20px, -webkit-linear-gradient(top, #eeeeee 1%, #ffffff 15%);  
-  background: url('chosen-sprite.png') no-repeat -30px -20px, -moz-linear-gradient(top, #eeeeee 1%, #ffffff 15%);
-  background: url('chosen-sprite.png') no-repeat -30px -20px, -o-linear-gradient(top, #eeeeee 1%, #ffffff 15%);
-  background: url('chosen-sprite.png') no-repeat -30px -20px, linear-gradient(#eeeeee 1%, #ffffff 15%);
-  padding: 4px 5px 4px 20px;
-  direction: rtl;
-}
-.chzn-container-single.chzn-rtl .chzn-single div b {
-  background-position: 6px 2px;
-}
-.chzn-container-single.chzn-rtl.chzn-with-drop .chzn-single div b {
-  background-position: -12px 2px;
-}
-/* @end */
-
-/* @group Retina compatibility */
-@media only screen and (-webkit-min-device-pixel-ratio: 2), only screen and (min-resolution: 144dpi)  {
-  .chzn-rtl .chzn-search input, .chzn-container-single .chzn-single abbr, .chzn-container-single .chzn-single div b, .chzn-container-single .chzn-search input, .chzn-container-multi .chzn-choices .search-choice .search-choice-close, .chzn-container .chzn-results-scroll-down span, .chzn-container .chzn-results-scroll-up span {
-      background-image: url('chosen-sprite@2x.png') !important;
-      background-repeat: no-repeat !important;
-      background-size: 52px 37px !important;
-  }
-}
-/* @end */
diff --git a/resources/jquery.chosen/chosen.jquery.js b/resources/jquery.chosen/chosen.jquery.js
deleted file mode 100644 (file)
index 745174f..0000000
+++ /dev/null
@@ -1,1103 +0,0 @@
-// Chosen, a Select Box Enhancer for jQuery and Protoype
-// by Patrick Filler for Harvest, http://getharvest.com
-//
-// Version 0.9.14
-// Full source at https://github.com/harvesthq/chosen
-// Copyright (c) 2011 Harvest http://getharvest.com
-
-// MIT License, https://github.com/harvesthq/chosen/blob/master/LICENSE.md
-// This file is generated by `cake build`, do not edit it by hand.
-(function() {
-  var SelectParser;
-
-  SelectParser = (function() {
-
-    function SelectParser() {
-      this.options_index = 0;
-      this.parsed = [];
-    }
-
-    SelectParser.prototype.add_node = function(child) {
-      if (child.nodeName.toUpperCase() === "OPTGROUP") {
-        return this.add_group(child);
-      } else {
-        return this.add_option(child);
-      }
-    };
-
-    SelectParser.prototype.add_group = function(group) {
-      var group_position, option, _i, _len, _ref, _results;
-      group_position = this.parsed.length;
-      this.parsed.push({
-        array_index: group_position,
-        group: true,
-        label: group.label,
-        children: 0,
-        disabled: group.disabled
-      });
-      _ref = group.childNodes;
-      _results = [];
-      for (_i = 0, _len = _ref.length; _i < _len; _i++) {
-        option = _ref[_i];
-        _results.push(this.add_option(option, group_position, group.disabled));
-      }
-      return _results;
-    };
-
-    SelectParser.prototype.add_option = function(option, group_position, group_disabled) {
-      if (option.nodeName.toUpperCase() === "OPTION") {
-        if (option.text !== "") {
-          if (group_position != null) {
-            this.parsed[group_position].children += 1;
-          }
-          this.parsed.push({
-            array_index: this.parsed.length,
-            options_index: this.options_index,
-            value: option.value,
-            text: option.text,
-            html: option.innerHTML,
-            selected: option.selected,
-            disabled: group_disabled === true ? group_disabled : option.disabled,
-            group_array_index: group_position,
-            classes: option.className,
-            style: option.style.cssText
-          });
-        } else {
-          this.parsed.push({
-            array_index: this.parsed.length,
-            options_index: this.options_index,
-            empty: true
-          });
-        }
-        return this.options_index += 1;
-      }
-    };
-
-    return SelectParser;
-
-  })();
-
-  SelectParser.select_to_array = function(select) {
-    var child, parser, _i, _len, _ref;
-    parser = new SelectParser();
-    _ref = select.childNodes;
-    for (_i = 0, _len = _ref.length; _i < _len; _i++) {
-      child = _ref[_i];
-      parser.add_node(child);
-    }
-    return parser.parsed;
-  };
-
-  this.SelectParser = SelectParser;
-
-}).call(this);
-
-/*
-Chosen source: generate output using 'cake build'
-Copyright (c) 2011 by Harvest
-*/
-
-
-(function() {
-  var AbstractChosen, root;
-
-  root = this;
-
-  AbstractChosen = (function() {
-
-    function AbstractChosen(form_field, options) {
-      this.form_field = form_field;
-      this.options = options != null ? options : {};
-      if (!AbstractChosen.browser_is_supported()) {
-        return;
-      }
-      this.is_multiple = this.form_field.multiple;
-      this.set_default_text();
-      this.set_default_values();
-      this.setup();
-      this.set_up_html();
-      this.register_observers();
-      this.finish_setup();
-    }
-
-    AbstractChosen.prototype.set_default_values = function() {
-      var _this = this;
-      this.click_test_action = function(evt) {
-        return _this.test_active_click(evt);
-      };
-      this.activate_action = function(evt) {
-        return _this.activate_field(evt);
-      };
-      this.active_field = false;
-      this.mouse_on_container = false;
-      this.results_showing = false;
-      this.result_highlighted = null;
-      this.result_single_selected = null;
-      this.allow_single_deselect = (this.options.allow_single_deselect != null) && (this.form_field.options[0] != null) && this.form_field.options[0].text === "" ? this.options.allow_single_deselect : false;
-      this.disable_search_threshold = this.options.disable_search_threshold || 0;
-      this.disable_search = this.options.disable_search || false;
-      this.enable_split_word_search = this.options.enable_split_word_search != null ? this.options.enable_split_word_search : true;
-      this.search_contains = this.options.search_contains || false;
-      this.choices = 0;
-      this.single_backstroke_delete = this.options.single_backstroke_delete || false;
-      this.max_selected_options = this.options.max_selected_options || Infinity;
-      return this.inherit_select_classes = this.options.inherit_select_classes || false;
-    };
-
-    AbstractChosen.prototype.set_default_text = function() {
-      if (this.form_field.getAttribute("data-placeholder")) {
-        this.default_text = this.form_field.getAttribute("data-placeholder");
-      } else if (this.is_multiple) {
-        this.default_text = this.options.placeholder_text_multiple || this.options.placeholder_text || AbstractChosen.default_multiple_text;
-      } else {
-        this.default_text = this.options.placeholder_text_single || this.options.placeholder_text || AbstractChosen.default_single_text;
-      }
-      return this.results_none_found = this.form_field.getAttribute("data-no_results_text") || this.options.no_results_text || AbstractChosen.default_no_result_text;
-    };
-
-    AbstractChosen.prototype.mouse_enter = function() {
-      return this.mouse_on_container = true;
-    };
-
-    AbstractChosen.prototype.mouse_leave = function() {
-      return this.mouse_on_container = false;
-    };
-
-    AbstractChosen.prototype.input_focus = function(evt) {
-      var _this = this;
-      if (this.is_multiple) {
-        if (!this.active_field) {
-          return setTimeout((function() {
-            return _this.container_mousedown();
-          }), 50);
-        }
-      } else {
-        if (!this.active_field) {
-          return this.activate_field();
-        }
-      }
-    };
-
-    AbstractChosen.prototype.input_blur = function(evt) {
-      var _this = this;
-      if (!this.mouse_on_container) {
-        this.active_field = false;
-        return setTimeout((function() {
-          return _this.blur_test();
-        }), 100);
-      }
-    };
-
-    AbstractChosen.prototype.result_add_option = function(option) {
-      var classes, style;
-      if (!option.disabled) {
-        option.dom_id = this.container_id + "_o_" + option.array_index;
-        classes = option.selected && this.is_multiple ? [] : ["active-result"];
-        if (option.selected) {
-          classes.push("result-selected");
-        }
-        if (option.group_array_index != null) {
-          classes.push("group-option");
-        }
-        if (option.classes !== "") {
-          classes.push(option.classes);
-        }
-        style = option.style.cssText !== "" ? " style=\"" + option.style + "\"" : "";
-        return '<li id="' + option.dom_id + '" class="' + classes.join(' ') + '"' + style + '>' + option.html + '</li>';
-      } else {
-        return "";
-      }
-    };
-
-    AbstractChosen.prototype.results_update_field = function() {
-      this.set_default_text();
-      if (!this.is_multiple) {
-        this.results_reset_cleanup();
-      }
-      this.result_clear_highlight();
-      this.result_single_selected = null;
-      return this.results_build();
-    };
-
-    AbstractChosen.prototype.results_toggle = function() {
-      if (this.results_showing) {
-        return this.results_hide();
-      } else {
-        return this.results_show();
-      }
-    };
-
-    AbstractChosen.prototype.results_search = function(evt) {
-      if (this.results_showing) {
-        return this.winnow_results();
-      } else {
-        return this.results_show();
-      }
-    };
-
-    AbstractChosen.prototype.choices_click = function(evt) {
-      evt.preventDefault();
-      if (!this.results_showing) {
-        return this.results_show();
-      }
-    };
-
-    AbstractChosen.prototype.keyup_checker = function(evt) {
-      var stroke, _ref;
-      stroke = (_ref = evt.which) != null ? _ref : evt.keyCode;
-      this.search_field_scale();
-      switch (stroke) {
-        case 8:
-          if (this.is_multiple && this.backstroke_length < 1 && this.choices > 0) {
-            return this.keydown_backstroke();
-          } else if (!this.pending_backstroke) {
-            this.result_clear_highlight();
-            return this.results_search();
-          }
-          break;
-        case 13:
-          evt.preventDefault();
-          if (this.results_showing) {
-            return this.result_select(evt);
-          }
-          break;
-        case 27:
-          if (this.results_showing) {
-            this.results_hide();
-          }
-          return true;
-        case 9:
-        case 38:
-        case 40:
-        case 16:
-        case 91:
-        case 17:
-          break;
-        default:
-          return this.results_search();
-      }
-    };
-
-    AbstractChosen.prototype.generate_field_id = function() {
-      var new_id;
-      new_id = this.generate_random_id();
-      this.form_field.id = new_id;
-      return new_id;
-    };
-
-    AbstractChosen.prototype.generate_random_char = function() {
-      var chars, newchar, rand;
-      chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
-      rand = Math.floor(Math.random() * chars.length);
-      return newchar = chars.substring(rand, rand + 1);
-    };
-
-    AbstractChosen.prototype.container_width = function() {
-      var width;
-      if (this.options.width != null) {
-        return this.options.width;
-      }
-      width = window.getComputedStyle != null ? parseFloat(window.getComputedStyle(this.form_field).getPropertyValue('width')) : (typeof jQuery !== "undefined" && jQuery !== null) && (this.form_field_jq != null) ? this.form_field_jq.outerWidth() : this.form_field.getWidth();
-      return width + "px";
-    };
-
-    AbstractChosen.browser_is_supported = function() {
-      var _ref;
-      if (window.navigator.appName === "Microsoft Internet Explorer") {
-        return (null !== (_ref = document.documentMode) && _ref >= 8);
-      }
-      return true;
-    };
-
-    AbstractChosen.default_multiple_text = "Select Some Options";
-
-    AbstractChosen.default_single_text = "Select an Option";
-
-    AbstractChosen.default_no_result_text = "No results match";
-
-    return AbstractChosen;
-
-  })();
-
-  root.AbstractChosen = AbstractChosen;
-
-}).call(this);
-
-/*
-Chosen source: generate output using 'cake build'
-Copyright (c) 2011 by Harvest
-*/
-
-
-(function() {
-  var $, Chosen, root,
-    __hasProp = {}.hasOwnProperty,
-    __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; };
-
-  root = this;
-
-  $ = jQuery;
-
-  $.fn.extend({
-    chosen: function(options) {
-      if (!AbstractChosen.browser_is_supported()) {
-        return this;
-      }
-      return this.each(function(input_field) {
-        var $this;
-        $this = $(this);
-        if (!$this.hasClass("chzn-done")) {
-          return $this.data('chosen', new Chosen(this, options));
-        }
-      });
-    }
-  });
-
-  Chosen = (function(_super) {
-
-    __extends(Chosen, _super);
-
-    function Chosen() {
-      return Chosen.__super__.constructor.apply(this, arguments);
-    }
-
-    Chosen.prototype.setup = function() {
-      this.form_field_jq = $(this.form_field);
-      this.current_selectedIndex = this.form_field.selectedIndex;
-      return this.is_rtl = this.form_field_jq.hasClass("chzn-rtl");
-    };
-
-    Chosen.prototype.finish_setup = function() {
-      return this.form_field_jq.addClass("chzn-done");
-    };
-
-    Chosen.prototype.set_up_html = function() {
-      var container_classes, container_props;
-      this.container_id = this.form_field.id.length ? this.form_field.id.replace(/[^\w]/g, '_') : this.generate_field_id();
-      this.container_id += "_chzn";
-      container_classes = ["chzn-container"];
-      container_classes.push("chzn-container-" + (this.is_multiple ? "multi" : "single"));
-      if (this.inherit_select_classes && this.form_field.className) {
-        container_classes.push(this.form_field.className);
-      }
-      if (this.is_rtl) {
-        container_classes.push("chzn-rtl");
-      }
-      container_props = {
-        'id': this.container_id,
-        'class': container_classes.join(' '),
-        'style': "width: " + (this.container_width()) + ";",
-        'title': this.form_field.title
-      };
-      this.container = $("<div />", container_props);
-      if (this.is_multiple) {
-        this.container.html('<ul class="chzn-choices"><li class="search-field"><input type="text" value="' + this.default_text + '" class="default" autocomplete="off" style="width:auto;" /></li></ul><div class="chzn-drop"><ul class="chzn-results"></ul></div>');
-      } else {
-        this.container.html('<a href="javascript:void(0)" class="chzn-single chzn-default" tabindex="-1"><span>' + this.default_text + '</span><div><b></b></div></a><div class="chzn-drop"><div class="chzn-search"><input type="text" autocomplete="off" /></div><ul class="chzn-results"></ul></div>');
-      }
-      this.form_field_jq.hide().after(this.container);
-      this.dropdown = this.container.find('div.chzn-drop').first();
-      this.search_field = this.container.find('input').first();
-      this.search_results = this.container.find('ul.chzn-results').first();
-      this.search_field_scale();
-      this.search_no_results = this.container.find('li.no-results').first();
-      if (this.is_multiple) {
-        this.search_choices = this.container.find('ul.chzn-choices').first();
-        this.search_container = this.container.find('li.search-field').first();
-      } else {
-        this.search_container = this.container.find('div.chzn-search').first();
-        this.selected_item = this.container.find('.chzn-single').first();
-      }
-      this.results_build();
-      this.set_tab_index();
-      this.set_label_behavior();
-      return this.form_field_jq.trigger("liszt:ready", {
-        chosen: this
-      });
-    };
-
-    Chosen.prototype.register_observers = function() {
-      var _this = this;
-      this.container.mousedown(function(evt) {
-        _this.container_mousedown(evt);
-      });
-      this.container.mouseup(function(evt) {
-        _this.container_mouseup(evt);
-      });
-      this.container.mouseenter(function(evt) {
-        _this.mouse_enter(evt);
-      });
-      this.container.mouseleave(function(evt) {
-        _this.mouse_leave(evt);
-      });
-      this.search_results.mouseup(function(evt) {
-        _this.search_results_mouseup(evt);
-      });
-      this.search_results.mouseover(function(evt) {
-        _this.search_results_mouseover(evt);
-      });
-      this.search_results.mouseout(function(evt) {
-        _this.search_results_mouseout(evt);
-      });
-      this.search_results.bind('mousewheel DOMMouseScroll', function(evt) {
-        _this.search_results_mousewheel(evt);
-      });
-      this.form_field_jq.bind("liszt:updated", function(evt) {
-        _this.results_update_field(evt);
-      });
-      this.form_field_jq.bind("liszt:activate", function(evt) {
-        _this.activate_field(evt);
-      });
-      this.form_field_jq.bind("liszt:open", function(evt) {
-        _this.container_mousedown(evt);
-      });
-      this.search_field.blur(function(evt) {
-        _this.input_blur(evt);
-      });
-      this.search_field.keyup(function(evt) {
-        _this.keyup_checker(evt);
-      });
-      this.search_field.keydown(function(evt) {
-        _this.keydown_checker(evt);
-      });
-      this.search_field.focus(function(evt) {
-        _this.input_focus(evt);
-      });
-      if (this.is_multiple) {
-        return this.search_choices.click(function(evt) {
-          _this.choices_click(evt);
-        });
-      } else {
-        return this.container.click(function(evt) {
-          evt.preventDefault();
-        });
-      }
-    };
-
-    Chosen.prototype.search_field_disabled = function() {
-      this.is_disabled = this.form_field_jq[0].disabled;
-      if (this.is_disabled) {
-        this.container.addClass('chzn-disabled');
-        this.search_field[0].disabled = true;
-        if (!this.is_multiple) {
-          this.selected_item.unbind("focus", this.activate_action);
-        }
-        return this.close_field();
-      } else {
-        this.container.removeClass('chzn-disabled');
-        this.search_field[0].disabled = false;
-        if (!this.is_multiple) {
-          return this.selected_item.bind("focus", this.activate_action);
-        }
-      }
-    };
-
-    Chosen.prototype.container_mousedown = function(evt) {
-      if (!this.is_disabled) {
-        if (evt && evt.type === "mousedown" && !this.results_showing) {
-          evt.preventDefault();
-        }
-        if (!((evt != null) && ($(evt.target)).hasClass("search-choice-close"))) {
-          if (!this.active_field) {
-            if (this.is_multiple) {
-              this.search_field.val("");
-            }
-            $(document).click(this.click_test_action);
-            this.results_show();
-          } else if (!this.is_multiple && evt && (($(evt.target)[0] === this.selected_item[0]) || $(evt.target).parents("a.chzn-single").length)) {
-            evt.preventDefault();
-            this.results_toggle();
-          }
-          return this.activate_field();
-        }
-      }
-    };
-
-    Chosen.prototype.container_mouseup = function(evt) {
-      if (evt.target.nodeName === "ABBR" && !this.is_disabled) {
-        return this.results_reset(evt);
-      }
-    };
-
-    Chosen.prototype.search_results_mousewheel = function(evt) {
-      var delta, _ref, _ref1;
-      delta = -((_ref = evt.originalEvent) != null ? _ref.wheelDelta : void 0) || ((_ref1 = evt.originialEvent) != null ? _ref1.detail : void 0);
-      if (delta != null) {
-        evt.preventDefault();
-        if (evt.type === 'DOMMouseScroll') {
-          delta = delta * 40;
-        }
-        return this.search_results.scrollTop(delta + this.search_results.scrollTop());
-      }
-    };
-
-    Chosen.prototype.blur_test = function(evt) {
-      if (!this.active_field && this.container.hasClass("chzn-container-active")) {
-        return this.close_field();
-      }
-    };
-
-    Chosen.prototype.close_field = function() {
-      $(document).unbind("click", this.click_test_action);
-      this.active_field = false;
-      this.results_hide();
-      this.container.removeClass("chzn-container-active");
-      this.winnow_results_clear();
-      this.clear_backstroke();
-      this.show_search_field_default();
-      return this.search_field_scale();
-    };
-
-    Chosen.prototype.activate_field = function() {
-      this.container.addClass("chzn-container-active");
-      this.active_field = true;
-      this.search_field.val(this.search_field.val());
-      return this.search_field.focus();
-    };
-
-    Chosen.prototype.test_active_click = function(evt) {
-      if ($(evt.target).parents('#' + this.container_id).length) {
-        return this.active_field = true;
-      } else {
-        return this.close_field();
-      }
-    };
-
-    Chosen.prototype.results_build = function() {
-      var content, data, _i, _len, _ref;
-      this.parsing = true;
-      this.results_data = root.SelectParser.select_to_array(this.form_field);
-      if (this.is_multiple && this.choices > 0) {
-        this.search_choices.find("li.search-choice").remove();
-        this.choices = 0;
-      } else if (!this.is_multiple) {
-        this.selected_item.addClass("chzn-default").find("span").text(this.default_text);
-        if (this.disable_search || this.form_field.options.length <= this.disable_search_threshold) {
-          this.container.addClass("chzn-container-single-nosearch");
-        } else {
-          this.container.removeClass("chzn-container-single-nosearch");
-        }
-      }
-      content = '';
-      _ref = this.results_data;
-      for (_i = 0, _len = _ref.length; _i < _len; _i++) {
-        data = _ref[_i];
-        if (data.group) {
-          content += this.result_add_group(data);
-        } else if (!data.empty) {
-          content += this.result_add_option(data);
-          if (data.selected && this.is_multiple) {
-            this.choice_build(data);
-          } else if (data.selected && !this.is_multiple) {
-            this.selected_item.removeClass("chzn-default").find("span").text(data.text);
-            if (this.allow_single_deselect) {
-              this.single_deselect_control_build();
-            }
-          }
-        }
-      }
-      this.search_field_disabled();
-      this.show_search_field_default();
-      this.search_field_scale();
-      this.search_results.html(content);
-      return this.parsing = false;
-    };
-
-    Chosen.prototype.result_add_group = function(group) {
-      if (!group.disabled) {
-        group.dom_id = this.container_id + "_g_" + group.array_index;
-        return '<li id="' + group.dom_id + '" class="group-result">' + $("<div />").text(group.label).html() + '</li>';
-      } else {
-        return "";
-      }
-    };
-
-    Chosen.prototype.result_do_highlight = function(el) {
-      var high_bottom, high_top, maxHeight, visible_bottom, visible_top;
-      if (el.length) {
-        this.result_clear_highlight();
-        this.result_highlight = el;
-        this.result_highlight.addClass("highlighted");
-        maxHeight = parseInt(this.search_results.css("maxHeight"), 10);
-        visible_top = this.search_results.scrollTop();
-        visible_bottom = maxHeight + visible_top;
-        high_top = this.result_highlight.position().top + this.search_results.scrollTop();
-        high_bottom = high_top + this.result_highlight.outerHeight();
-        if (high_bottom >= visible_bottom) {
-          return this.search_results.scrollTop((high_bottom - maxHeight) > 0 ? high_bottom - maxHeight : 0);
-        } else if (high_top < visible_top) {
-          return this.search_results.scrollTop(high_top);
-        }
-      }
-    };
-
-    Chosen.prototype.result_clear_highlight = function() {
-      if (this.result_highlight) {
-        this.result_highlight.removeClass("highlighted");
-      }
-      return this.result_highlight = null;
-    };
-
-    Chosen.prototype.results_show = function() {
-      if (this.result_single_selected != null) {
-        this.result_do_highlight(this.result_single_selected);
-      } else if (this.is_multiple && this.max_selected_options <= this.choices) {
-        this.form_field_jq.trigger("liszt:maxselected", {
-          chosen: this
-        });
-        return false;
-      }
-      this.container.addClass("chzn-with-drop");
-      this.form_field_jq.trigger("liszt:showing_dropdown", {
-        chosen: this
-      });
-      this.results_showing = true;
-      this.search_field.focus();
-      this.search_field.val(this.search_field.val());
-      return this.winnow_results();
-    };
-
-    Chosen.prototype.results_hide = function() {
-      this.result_clear_highlight();
-      this.container.removeClass("chzn-with-drop");
-      this.form_field_jq.trigger("liszt:hiding_dropdown", {
-        chosen: this
-      });
-      return this.results_showing = false;
-    };
-
-    Chosen.prototype.set_tab_index = function(el) {
-      var ti;
-      if (this.form_field_jq.attr("tabindex")) {
-        ti = this.form_field_jq.attr("tabindex");
-        this.form_field_jq.attr("tabindex", -1);
-        return this.search_field.attr("tabindex", ti);
-      }
-    };
-
-    Chosen.prototype.set_label_behavior = function() {
-      var _this = this;
-      this.form_field_label = this.form_field_jq.parents("label");
-      if (!this.form_field_label.length && this.form_field.id.length) {
-        this.form_field_label = $("label[for=" + this.form_field.id + "]");
-      }
-      if (this.form_field_label.length > 0) {
-        return this.form_field_label.click(function(evt) {
-          if (_this.is_multiple) {
-            return _this.container_mousedown(evt);
-          } else {
-            return _this.activate_field();
-          }
-        });
-      }
-    };
-
-    Chosen.prototype.show_search_field_default = function() {
-      if (this.is_multiple && this.choices < 1 && !this.active_field) {
-        this.search_field.val(this.default_text);
-        return this.search_field.addClass("default");
-      } else {
-        this.search_field.val("");
-        return this.search_field.removeClass("default");
-      }
-    };
-
-    Chosen.prototype.search_results_mouseup = function(evt) {
-      var target;
-      target = $(evt.target).hasClass("active-result") ? $(evt.target) : $(evt.target).parents(".active-result").first();
-      if (target.length) {
-        this.result_highlight = target;
-        this.result_select(evt);
-        return this.search_field.focus();
-      }
-    };
-
-    Chosen.prototype.search_results_mouseover = function(evt) {
-      var target;
-      target = $(evt.target).hasClass("active-result") ? $(evt.target) : $(evt.target).parents(".active-result").first();
-      if (target) {
-        return this.result_do_highlight(target);
-      }
-    };
-
-    Chosen.prototype.search_results_mouseout = function(evt) {
-      if ($(evt.target).hasClass("active-result" || $(evt.target).parents('.active-result').first())) {
-        return this.result_clear_highlight();
-      }
-    };
-
-    Chosen.prototype.choice_build = function(item) {
-      var choice_id, html, link,
-        _this = this;
-      if (this.is_multiple && this.max_selected_options <= this.choices) {
-        this.form_field_jq.trigger("liszt:maxselected", {
-          chosen: this
-        });
-        return false;
-      }
-      choice_id = this.container_id + "_c_" + item.array_index;
-      this.choices += 1;
-      if (item.disabled) {
-        html = '<li class="search-choice search-choice-disabled" id="' + choice_id + '"><span>' + item.html + '</span></li>';
-      } else {
-        html = '<li class="search-choice" id="' + choice_id + '"><span>' + item.html + '</span><a href="javascript:void(0)" class="search-choice-close" rel="' + item.array_index + '"></a></li>';
-      }
-      this.search_container.before(html);
-      link = $('#' + choice_id).find("a").first();
-      return link.click(function(evt) {
-        return _this.choice_destroy_link_click(evt);
-      });
-    };
-
-    Chosen.prototype.choice_destroy_link_click = function(evt) {
-      evt.preventDefault();
-      evt.stopPropagation();
-      if (!this.is_disabled) {
-        return this.choice_destroy($(evt.target));
-      }
-    };
-
-    Chosen.prototype.choice_destroy = function(link) {
-      if (this.result_deselect(link.attr("rel"))) {
-        this.choices -= 1;
-        this.show_search_field_default();
-        if (this.is_multiple && this.choices > 0 && this.search_field.val().length < 1) {
-          this.results_hide();
-        }
-        link.parents('li').first().remove();
-        return this.search_field_scale();
-      }
-    };
-
-    Chosen.prototype.results_reset = function() {
-      this.form_field.options[0].selected = true;
-      this.selected_item.find("span").text(this.default_text);
-      if (!this.is_multiple) {
-        this.selected_item.addClass("chzn-default");
-      }
-      this.show_search_field_default();
-      this.results_reset_cleanup();
-      this.form_field_jq.trigger("change");
-      if (this.active_field) {
-        return this.results_hide();
-      }
-    };
-
-    Chosen.prototype.results_reset_cleanup = function() {
-      this.current_selectedIndex = this.form_field.selectedIndex;
-      return this.selected_item.find("abbr").remove();
-    };
-
-    Chosen.prototype.result_select = function(evt) {
-      var high, high_id, item, position;
-      if (this.result_highlight) {
-        high = this.result_highlight;
-        high_id = high.attr("id");
-        this.result_clear_highlight();
-        if (this.is_multiple) {
-          this.result_deactivate(high);
-        } else {
-          this.search_results.find(".result-selected").removeClass("result-selected");
-          this.result_single_selected = high;
-          this.selected_item.removeClass("chzn-default");
-        }
-        high.addClass("result-selected");
-        position = high_id.substr(high_id.lastIndexOf("_") + 1);
-        item = this.results_data[position];
-        item.selected = true;
-        this.form_field.options[item.options_index].selected = true;
-        if (this.is_multiple) {
-          this.choice_build(item);
-        } else {
-          this.selected_item.find("span").first().text(item.text);
-          if (this.allow_single_deselect) {
-            this.single_deselect_control_build();
-          }
-        }
-        if (!((evt.metaKey || evt.ctrlKey) && this.is_multiple)) {
-          this.results_hide();
-        }
-        this.search_field.val("");
-        if (this.is_multiple || this.form_field.selectedIndex !== this.current_selectedIndex) {
-          this.form_field_jq.trigger("change", {
-            'selected': this.form_field.options[item.options_index].value
-          });
-        }
-        this.current_selectedIndex = this.form_field.selectedIndex;
-        return this.search_field_scale();
-      }
-    };
-
-    Chosen.prototype.result_activate = function(el) {
-      return el.addClass("active-result");
-    };
-
-    Chosen.prototype.result_deactivate = function(el) {
-      return el.removeClass("active-result");
-    };
-
-    Chosen.prototype.result_deselect = function(pos) {
-      var result, result_data;
-      result_data = this.results_data[pos];
-      if (!this.form_field.options[result_data.options_index].disabled) {
-        result_data.selected = false;
-        this.form_field.options[result_data.options_index].selected = false;
-        result = $("#" + this.container_id + "_o_" + pos);
-        result.removeClass("result-selected").addClass("active-result").show();
-        this.result_clear_highlight();
-        this.winnow_results();
-        this.form_field_jq.trigger("change", {
-          deselected: this.form_field.options[result_data.options_index].value
-        });
-        this.search_field_scale();
-        return true;
-      } else {
-        return false;
-      }
-    };
-
-    Chosen.prototype.single_deselect_control_build = function() {
-      if (this.allow_single_deselect && this.selected_item.find("abbr").length < 1) {
-        return this.selected_item.find("span").first().after("<abbr class=\"search-choice-close\"></abbr>");
-      }
-    };
-
-    Chosen.prototype.winnow_results = function() {
-      var found, option, part, parts, regex, regexAnchor, result, result_id, results, searchText, startpos, text, zregex, _i, _j, _len, _len1, _ref;
-      this.no_results_clear();
-      results = 0;
-      searchText = this.search_field.val() === this.default_text ? "" : $('<div/>').text($.trim(this.search_field.val())).html();
-      regexAnchor = this.search_contains ? "" : "^";
-      regex = new RegExp(regexAnchor + searchText.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&"), 'i');
-      zregex = new RegExp(searchText.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&"), 'i');
-      _ref = this.results_data;
-      for (_i = 0, _len = _ref.length; _i < _len; _i++) {
-        option = _ref[_i];
-        if (!option.disabled && !option.empty) {
-          if (option.group) {
-            $('#' + option.dom_id).css('display', 'none');
-          } else if (!(this.is_multiple && option.selected)) {
-            found = false;
-            result_id = option.dom_id;
-            result = $("#" + result_id);
-            if (regex.test(option.html)) {
-              found = true;
-              results += 1;
-            } else if (this.enable_split_word_search && (option.html.indexOf(" ") >= 0 || option.html.indexOf("[") === 0)) {
-              parts = option.html.replace(/\[|\]/g, "").split(" ");
-              if (parts.length) {
-                for (_j = 0, _len1 = parts.length; _j < _len1; _j++) {
-                  part = parts[_j];
-                  if (regex.test(part)) {
-                    found = true;
-                    results += 1;
-                  }
-                }
-              }
-            }
-            if (found) {
-              if (searchText.length) {
-                startpos = option.html.search(zregex);
-                text = option.html.substr(0, startpos + searchText.length) + '</em>' + option.html.substr(startpos + searchText.length);
-                text = text.substr(0, startpos) + '<em>' + text.substr(startpos);
-              } else {
-                text = option.html;
-              }
-              result.html(text);
-              this.result_activate(result);
-              if (option.group_array_index != null) {
-                $("#" + this.results_data[option.group_array_index].dom_id).css('display', 'list-item');
-              }
-            } else {
-              if (this.result_highlight && result_id === this.result_highlight.attr('id')) {
-                this.result_clear_highlight();
-              }
-              this.result_deactivate(result);
-            }
-          }
-        }
-      }
-      if (results < 1 && searchText.length) {
-        return this.no_results(searchText);
-      } else {
-        return this.winnow_results_set_highlight();
-      }
-    };
-
-    Chosen.prototype.winnow_results_clear = function() {
-      var li, lis, _i, _len, _results;
-      this.search_field.val("");
-      lis = this.search_results.find("li");
-      _results = [];
-      for (_i = 0, _len = lis.length; _i < _len; _i++) {
-        li = lis[_i];
-        li = $(li);
-        if (li.hasClass("group-result")) {
-          _results.push(li.css('display', 'auto'));
-        } else if (!this.is_multiple || !li.hasClass("result-selected")) {
-          _results.push(this.result_activate(li));
-        } else {
-          _results.push(void 0);
-        }
-      }
-      return _results;
-    };
-
-    Chosen.prototype.winnow_results_set_highlight = function() {
-      var do_high, selected_results;
-      if (!this.result_highlight) {
-        selected_results = !this.is_multiple ? this.search_results.find(".result-selected.active-result") : [];
-        do_high = selected_results.length ? selected_results.first() : this.search_results.find(".active-result").first();
-        if (do_high != null) {
-          return this.result_do_highlight(do_high);
-        }
-      }
-    };
-
-    Chosen.prototype.no_results = function(terms) {
-      var no_results_html;
-      no_results_html = $('<li class="no-results">' + this.results_none_found + ' "<span></span>"</li>');
-      no_results_html.find("span").first().html(terms);
-      return this.search_results.append(no_results_html);
-    };
-
-    Chosen.prototype.no_results_clear = function() {
-      return this.search_results.find(".no-results").remove();
-    };
-
-    Chosen.prototype.keydown_arrow = function() {
-      var first_active, next_sib;
-      if (!this.result_highlight) {
-        first_active = this.search_results.find("li.active-result").first();
-        if (first_active) {
-          this.result_do_highlight($(first_active));
-        }
-      } else if (this.results_showing) {
-        next_sib = this.result_highlight.nextAll("li.active-result").first();
-        if (next_sib) {
-          this.result_do_highlight(next_sib);
-        }
-      }
-      if (!this.results_showing) {
-        return this.results_show();
-      }
-    };
-
-    Chosen.prototype.keyup_arrow = function() {
-      var prev_sibs;
-      if (!this.results_showing && !this.is_multiple) {
-        return this.results_show();
-      } else if (this.result_highlight) {
-        prev_sibs = this.result_highlight.prevAll("li.active-result");
-        if (prev_sibs.length) {
-          return this.result_do_highlight(prev_sibs.first());
-        } else {
-          if (this.choices > 0) {
-            this.results_hide();
-          }
-          return this.result_clear_highlight();
-        }
-      }
-    };
-
-    Chosen.prototype.keydown_backstroke = function() {
-      var next_available_destroy;
-      if (this.pending_backstroke) {
-        this.choice_destroy(this.pending_backstroke.find("a").first());
-        return this.clear_backstroke();
-      } else {
-        next_available_destroy = this.search_container.siblings("li.search-choice").last();
-        if (next_available_destroy.length && !next_available_destroy.hasClass("search-choice-disabled")) {
-          this.pending_backstroke = next_available_destroy;
-          if (this.single_backstroke_delete) {
-            return this.keydown_backstroke();
-          } else {
-            return this.pending_backstroke.addClass("search-choice-focus");
-          }
-        }
-      }
-    };
-
-    Chosen.prototype.clear_backstroke = function() {
-      if (this.pending_backstroke) {
-        this.pending_backstroke.removeClass("search-choice-focus");
-      }
-      return this.pending_backstroke = null;
-    };
-
-    Chosen.prototype.keydown_checker = function(evt) {
-      var stroke, _ref;
-      stroke = (_ref = evt.which) != null ? _ref : evt.keyCode;
-      this.search_field_scale();
-      if (stroke !== 8 && this.pending_backstroke) {
-        this.clear_backstroke();
-      }
-      switch (stroke) {
-        case 8:
-          this.backstroke_length = this.search_field.val().length;
-          break;
-        case 9:
-          if (this.results_showing && !this.is_multiple) {
-            this.result_select(evt);
-          }
-          this.mouse_on_container = false;
-          break;
-        case 13:
-          evt.preventDefault();
-          break;
-        case 38:
-          evt.preventDefault();
-          this.keyup_arrow();
-          break;
-        case 40:
-          this.keydown_arrow();
-          break;
-      }
-    };
-
-    Chosen.prototype.search_field_scale = function() {
-      var div, h, style, style_block, styles, w, _i, _len;
-      if (this.is_multiple) {
-        h = 0;
-        w = 0;
-        style_block = "position:absolute; left: -1000px; top: -1000px; display:none;";
-        styles = ['font-size', 'font-style', 'font-weight', 'font-family', 'line-height', 'text-transform', 'letter-spacing'];
-        for (_i = 0, _len = styles.length; _i < _len; _i++) {
-          style = styles[_i];
-          style_block += style + ":" + this.search_field.css(style) + ";";
-        }
-        div = $('<div />', {
-          'style': style_block
-        });
-        div.text(this.search_field.val());
-        $('body').append(div);
-        w = div.width() + 25;
-        div.remove();
-        if (!this.f_width) {
-          this.f_width = this.container.outerWidth();
-        }
-        if (w > this.f_width - 10) {
-          w = this.f_width - 10;
-        }
-        return this.search_field.css({
-          'width': w + 'px'
-        });
-      }
-    };
-
-    Chosen.prototype.generate_random_id = function() {
-      var string;
-      string = "sel" + this.generate_random_char() + this.generate_random_char() + this.generate_random_char();
-      while ($("#" + string).length > 0) {
-        string += this.generate_random_char();
-      }
-      return string;
-    };
-
-    return Chosen;
-
-  })(AbstractChosen);
-
-  root.Chosen = Chosen;
-
-}).call(this);
diff --git a/resources/jquery.effects/jquery.effects.blind.js b/resources/jquery.effects/jquery.effects.blind.js
deleted file mode 100644 (file)
index ac25bbd..0000000
+++ /dev/null
@@ -1,49 +0,0 @@
-/*!
- * jQuery UI Effects Blind 1.8.24
- *
- * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
- * Dual licensed under the MIT or GPL Version 2 licenses.
- * http://jquery.org/license
- *
- * http://docs.jquery.com/UI/Effects/Blind
- *
- * Depends:
- *     jquery.effects.core.js
- */
-(function( $, undefined ) {
-
-$.effects.blind = function(o) {
-
-       return this.queue(function() {
-
-               // Create element
-               var el = $(this), props = ['position','top','bottom','left','right'];
-
-               // Set options
-               var mode = $.effects.setMode(el, o.options.mode || 'hide'); // Set Mode
-               var direction = o.options.direction || 'vertical'; // Default direction
-
-               // Adjust
-               $.effects.save(el, props); el.show(); // Save & Show
-               var wrapper = $.effects.createWrapper(el).css({overflow:'hidden'}); // Create Wrapper
-               var ref = (direction == 'vertical') ? 'height' : 'width';
-               var distance = (direction == 'vertical') ? wrapper.height() : wrapper.width();
-               if(mode == 'show') wrapper.css(ref, 0); // Shift
-
-               // Animation
-               var animation = {};
-               animation[ref] = mode == 'show' ? distance : 0;
-
-               // Animate
-               wrapper.animate(animation, o.duration, o.options.easing, function() {
-                       if(mode == 'hide') el.hide(); // Hide
-                       $.effects.restore(el, props); $.effects.removeWrapper(el); // Restore
-                       if(o.callback) o.callback.apply(el[0], arguments); // Callback
-                       el.dequeue();
-               });
-
-       });
-
-};
-
-})(jQuery);
diff --git a/resources/jquery.effects/jquery.effects.bounce.js b/resources/jquery.effects/jquery.effects.bounce.js
deleted file mode 100644 (file)
index 1169d77..0000000
+++ /dev/null
@@ -1,78 +0,0 @@
-/*!
- * jQuery UI Effects Bounce 1.8.24
- *
- * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
- * Dual licensed under the MIT or GPL Version 2 licenses.
- * http://jquery.org/license
- *
- * http://docs.jquery.com/UI/Effects/Bounce
- *
- * Depends:
- *     jquery.effects.core.js
- */
-(function( $, undefined ) {
-
-$.effects.bounce = function(o) {
-
-       return this.queue(function() {
-
-               // Create element
-               var el = $(this), props = ['position','top','bottom','left','right'];
-
-               // Set options
-               var mode = $.effects.setMode(el, o.options.mode || 'effect'); // Set Mode
-               var direction = o.options.direction || 'up'; // Default direction
-               var distance = o.options.distance || 20; // Default distance
-               var times = o.options.times || 5; // Default # of times
-               var speed = o.duration || 250; // Default speed per bounce
-               if (/show|hide/.test(mode)) props.push('opacity'); // Avoid touching opacity to prevent clearType and PNG issues in IE
-
-               // Adjust
-               $.effects.save(el, props); el.show(); // Save & Show
-               $.effects.createWrapper(el); // Create Wrapper
-               var ref = (direction == 'up' || direction == 'down') ? 'top' : 'left';
-               var motion = (direction == 'up' || direction == 'left') ? 'pos' : 'neg';
-               var distance = o.options.distance || (ref == 'top' ? el.outerHeight(true) / 3 : el.outerWidth(true) / 3);
-               if (mode == 'show') el.css('opacity', 0).css(ref, motion == 'pos' ? -distance : distance); // Shift
-               if (mode == 'hide') distance = distance / (times * 2);
-               if (mode != 'hide') times--;
-
-               // Animate
-               if (mode == 'show') { // Show Bounce
-                       var animation = {opacity: 1};
-                       animation[ref] = (motion == 'pos' ? '+=' : '-=') + distance;
-                       el.animate(animation, speed / 2, o.options.easing);
-                       distance = distance / 2;
-                       times--;
-               };
-               for (var i = 0; i < times; i++) { // Bounces
-                       var animation1 = {}, animation2 = {};
-                       animation1[ref] = (motion == 'pos' ? '-=' : '+=') + distance;
-                       animation2[ref] = (motion == 'pos' ? '+=' : '-=') + distance;
-                       el.animate(animation1, speed / 2, o.options.easing).animate(animation2, speed / 2, o.options.easing);
-                       distance = (mode == 'hide') ? distance * 2 : distance / 2;
-               };
-               if (mode == 'hide') { // Last Bounce
-                       var animation = {opacity: 0};
-                       animation[ref] = (motion == 'pos' ? '-=' : '+=')  + distance;
-                       el.animate(animation, speed / 2, o.options.easing, function(){
-                               el.hide(); // Hide
-                               $.effects.restore(el, props); $.effects.removeWrapper(el); // Restore
-                               if(o.callback) o.callback.apply(this, arguments); // Callback
-                       });
-               } else {
-                       var animation1 = {}, animation2 = {};
-                       animation1[ref] = (motion == 'pos' ? '-=' : '+=') + distance;
-                       animation2[ref] = (motion == 'pos' ? '+=' : '-=') + distance;
-                       el.animate(animation1, speed / 2, o.options.easing).animate(animation2, speed / 2, o.options.easing, function(){
-                               $.effects.restore(el, props); $.effects.removeWrapper(el); // Restore
-                               if(o.callback) o.callback.apply(this, arguments); // Callback
-                       });
-               };
-               el.queue('fx', function() { el.dequeue(); });
-               el.dequeue();
-       });
-
-};
-
-})(jQuery);
diff --git a/resources/jquery.effects/jquery.effects.clip.js b/resources/jquery.effects/jquery.effects.clip.js
deleted file mode 100644 (file)
index edd51a6..0000000
+++ /dev/null
@@ -1,54 +0,0 @@
-/*!
- * jQuery UI Effects Clip 1.8.24
- *
- * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
- * Dual licensed under the MIT or GPL Version 2 licenses.
- * http://jquery.org/license
- *
- * http://docs.jquery.com/UI/Effects/Clip
- *
- * Depends:
- *     jquery.effects.core.js
- */
-(function( $, undefined ) {
-
-$.effects.clip = function(o) {
-
-       return this.queue(function() {
-
-               // Create element
-               var el = $(this), props = ['position','top','bottom','left','right','height','width'];
-
-               // Set options
-               var mode = $.effects.setMode(el, o.options.mode || 'hide'); // Set Mode
-               var direction = o.options.direction || 'vertical'; // Default direction
-
-               // Adjust
-               $.effects.save(el, props); el.show(); // Save & Show
-               var wrapper = $.effects.createWrapper(el).css({overflow:'hidden'}); // Create Wrapper
-               var animate = el[0].tagName == 'IMG' ? wrapper : el;
-               var ref = {
-                       size: (direction == 'vertical') ? 'height' : 'width',
-                       position: (direction == 'vertical') ? 'top' : 'left'
-               };
-               var distance = (direction == 'vertical') ? animate.height() : animate.width();
-               if(mode == 'show') { animate.css(ref.size, 0); animate.css(ref.position, distance / 2); } // Shift
-
-               // Animation
-               var animation = {};
-               animation[ref.size] = mode == 'show' ? distance : 0;
-               animation[ref.position] = mode == 'show' ? 0 : distance / 2;
-
-               // Animate
-               animate.animate(animation, { queue: false, duration: o.duration, easing: o.options.easing, complete: function() {
-                       if(mode == 'hide') el.hide(); // Hide
-                       $.effects.restore(el, props); $.effects.removeWrapper(el); // Restore
-                       if(o.callback) o.callback.apply(el[0], arguments); // Callback
-                       el.dequeue();
-               }});
-
-       });
-
-};
-
-})(jQuery);
diff --git a/resources/jquery.effects/jquery.effects.core.js b/resources/jquery.effects/jquery.effects.core.js
deleted file mode 100644 (file)
index 7fd946f..0000000
+++ /dev/null
@@ -1,612 +0,0 @@
-/*!
- * jQuery UI Effects 1.8.24
- *
- * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
- * Dual licensed under the MIT or GPL Version 2 licenses.
- * http://jquery.org/license
- *
- * http://docs.jquery.com/UI/Effects/
- */
-;jQuery.effects || (function($, undefined) {
-
-$.effects = {};
-
-
-
-/******************************************************************************/
-/****************************** COLOR ANIMATIONS ******************************/
-/******************************************************************************/
-
-// override the animation for color styles
-$.each(['backgroundColor', 'borderBottomColor', 'borderLeftColor',
-       'borderRightColor', 'borderTopColor', 'borderColor', 'color', 'outlineColor'],
-function(i, attr) {
-       $.fx.step[attr] = function(fx) {
-               if (!fx.colorInit) {
-                       fx.start = getColor(fx.elem, attr);
-                       fx.end = getRGB(fx.end);
-                       fx.colorInit = true;
-               }
-
-               fx.elem.style[attr] = 'rgb(' +
-                       Math.max(Math.min(parseInt((fx.pos * (fx.end[0] - fx.start[0])) + fx.start[0], 10), 255), 0) + ',' +
-                       Math.max(Math.min(parseInt((fx.pos * (fx.end[1] - fx.start[1])) + fx.start[1], 10), 255), 0) + ',' +
-                       Math.max(Math.min(parseInt((fx.pos * (fx.end[2] - fx.start[2])) + fx.start[2], 10), 255), 0) + ')';
-       };
-});
-
-// Color Conversion functions from highlightFade
-// By Blair Mitchelmore
-// http://jquery.offput.ca/highlightFade/
-
-// Parse strings looking for color tuples [255,255,255]
-function getRGB(color) {
-               var result;
-
-               // Check if we're already dealing with an array of colors
-               if ( color && color.constructor == Array && color.length == 3 )
-                               return color;
-
-               // Look for rgb(num,num,num)
-               if (result = /rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(color))
-                               return [parseInt(result[1],10), parseInt(result[2],10), parseInt(result[3],10)];
-
-               // Look for rgb(num%,num%,num%)
-               if (result = /rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/.exec(color))
-                               return [parseFloat(result[1])*2.55, parseFloat(result[2])*2.55, parseFloat(result[3])*2.55];
-
-               // Look for #a0b1c2
-               if (result = /#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(color))
-                               return [parseInt(result[1],16), parseInt(result[2],16), parseInt(result[3],16)];
-
-               // Look for #fff
-               if (result = /#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(color))
-                               return [parseInt(result[1]+result[1],16), parseInt(result[2]+result[2],16), parseInt(result[3]+result[3],16)];
-
-               // Look for rgba(0, 0, 0, 0) == transparent in Safari 3
-               if (result = /rgba\(0, 0, 0, 0\)/.exec(color))
-                               return colors['transparent'];
-
-               // Otherwise, we're most likely dealing with a named color
-               return colors[$.trim(color).toLowerCase()];
-}
-
-function getColor(elem, attr) {
-               var color;
-
-               do {
-                               // jQuery <1.4.3 uses curCSS, in 1.4.3 - 1.7.2 curCSS = css, 1.8+ only has css
-                               color = ($.curCSS || $.css)(elem, attr);
-
-                               // Keep going until we find an element that has color, or we hit the body
-                               if ( color != '' && color != 'transparent' || $.nodeName(elem, "body") )
-                                               break;
-
-                               attr = "backgroundColor";
-               } while ( elem = elem.parentNode );
-
-               return getRGB(color);
-};
-
-// Some named colors to work with
-// From Interface by Stefan Petre
-// http://interface.eyecon.ro/
-
-var colors = {
-       aqua:[0,255,255],
-       azure:[240,255,255],
-       beige:[245,245,220],
-       black:[0,0,0],
-       blue:[0,0,255],
-       brown:[165,42,42],
-       cyan:[0,255,255],
-       darkblue:[0,0,139],
-       darkcyan:[0,139,139],
-       darkgrey:[169,169,169],
-       darkgreen:[0,100,0],
-       darkkhaki:[189,183,107],
-       darkmagenta:[139,0,139],
-       darkolivegreen:[85,107,47],
-       darkorange:[255,140,0],
-       darkorchid:[153,50,204],
-       darkred:[139,0,0],
-       darksalmon:[233,150,122],
-       darkviolet:[148,0,211],
-       fuchsia:[255,0,255],
-       gold:[255,215,0],
-       green:[0,128,0],
-       indigo:[75,0,130],
-       khaki:[240,230,140],
-       lightblue:[173,216,230],
-       lightcyan:[224,255,255],
-       lightgreen:[144,238,144],
-       lightgrey:[211,211,211],
-       lightpink:[255,182,193],
-       lightyellow:[255,255,224],
-       lime:[0,255,0],
-       magenta:[255,0,255],
-       maroon:[128,0,0],
-       navy:[0,0,128],
-       olive:[128,128,0],
-       orange:[255,165,0],
-       pink:[255,192,203],
-       purple:[128,0,128],
-       violet:[128,0,128],
-       red:[255,0,0],
-       silver:[192,192,192],
-       white:[255,255,255],
-       yellow:[255,255,0],
-       transparent: [255,255,255]
-};
-
-
-
-/******************************************************************************/
-/****************************** CLASS ANIMATIONS ******************************/
-/******************************************************************************/
-
-var classAnimationActions = ['add', 'remove', 'toggle'],
-       shorthandStyles = {
-               border: 1,
-               borderBottom: 1,
-               borderColor: 1,
-               borderLeft: 1,
-               borderRight: 1,
-               borderTop: 1,
-               borderWidth: 1,
-               margin: 1,
-               padding: 1
-       };
-
-function getElementStyles() {
-       var style = document.defaultView
-                       ? document.defaultView.getComputedStyle(this, null)
-                       : this.currentStyle,
-               newStyle = {},
-               key,
-               camelCase;
-
-       // webkit enumerates style porperties
-       if (style && style.length && style[0] && style[style[0]]) {
-               var len = style.length;
-               while (len--) {
-                       key = style[len];
-                       if (typeof style[key] == 'string') {
-                               camelCase = key.replace(/\-(\w)/g, function(all, letter){
-                                       return letter.toUpperCase();
-                               });
-                               newStyle[camelCase] = style[key];
-                       }
-               }
-       } else {
-               for (key in style) {
-                       if (typeof style[key] === 'string') {
-                               newStyle[key] = style[key];
-                       }
-               }
-       }
-       
-       return newStyle;
-}
-
-function filterStyles(styles) {
-       var name, value;
-       for (name in styles) {
-               value = styles[name];
-               if (
-                       // ignore null and undefined values
-                       value == null ||
-                       // ignore functions (when does this occur?)
-                       $.isFunction(value) ||
-                       // shorthand styles that need to be expanded
-                       name in shorthandStyles ||
-                       // ignore scrollbars (break in IE)
-                       (/scrollbar/).test(name) ||
-
-                       // only colors or values that can be converted to numbers
-                       (!(/color/i).test(name) && isNaN(parseFloat(value)))
-               ) {
-                       delete styles[name];
-               }
-       }
-       
-       return styles;
-}
-
-function styleDifference(oldStyle, newStyle) {
-       var diff = { _: 0 }, // http://dev.jquery.com/ticket/5459
-               name;
-
-       for (name in newStyle) {
-               if (oldStyle[name] != newStyle[name]) {
-                       diff[name] = newStyle[name];
-               }
-       }
-
-       return diff;
-}
-
-$.effects.animateClass = function(value, duration, easing, callback) {
-       if ($.isFunction(easing)) {
-               callback = easing;
-               easing = null;
-       }
-
-       return this.queue(function() {
-               var that = $(this),
-                       originalStyleAttr = that.attr('style') || ' ',
-                       originalStyle = filterStyles(getElementStyles.call(this)),
-                       newStyle,
-                       className = that.attr('class') || "";
-
-               $.each(classAnimationActions, function(i, action) {
-                       if (value[action]) {
-                               that[action + 'Class'](value[action]);
-                       }
-               });
-               newStyle = filterStyles(getElementStyles.call(this));
-               that.attr('class', className);
-
-               that.animate(styleDifference(originalStyle, newStyle), {
-                       queue: false,
-                       duration: duration,
-                       easing: easing,
-                       complete: function() {
-                               $.each(classAnimationActions, function(i, action) {
-                                       if (value[action]) { that[action + 'Class'](value[action]); }
-                               });
-                               // work around bug in IE by clearing the cssText before setting it
-                               if (typeof that.attr('style') == 'object') {
-                                       that.attr('style').cssText = '';
-                                       that.attr('style').cssText = originalStyleAttr;
-                               } else {
-                                       that.attr('style', originalStyleAttr);
-                               }
-                               if (callback) { callback.apply(this, arguments); }
-                               $.dequeue( this );
-                       }
-               });
-       });
-};
-
-$.fn.extend({
-       _addClass: $.fn.addClass,
-       addClass: function(classNames, speed, easing, callback) {
-               return speed ? $.effects.animateClass.apply(this, [{ add: classNames },speed,easing,callback]) : this._addClass(classNames);
-       },
-
-       _removeClass: $.fn.removeClass,
-       removeClass: function(classNames,speed,easing,callback) {
-               return speed ? $.effects.animateClass.apply(this, [{ remove: classNames },speed,easing,callback]) : this._removeClass(classNames);
-       },
-
-       _toggleClass: $.fn.toggleClass,
-       toggleClass: function(classNames, force, speed, easing, callback) {
-               if ( typeof force == "boolean" || force === undefined ) {
-                       if ( !speed ) {
-                               // without speed parameter;
-                               return this._toggleClass(classNames, force);
-                       } else {
-                               return $.effects.animateClass.apply(this, [(force?{add:classNames}:{remove:classNames}),speed,easing,callback]);
-                       }
-               } else {
-                       // without switch parameter;
-                       return $.effects.animateClass.apply(this, [{ toggle: classNames },force,speed,easing]);
-               }
-       },
-
-       switchClass: function(remove,add,speed,easing,callback) {
-               return $.effects.animateClass.apply(this, [{ add: add, remove: remove },speed,easing,callback]);
-       }
-});
-
-
-
-/******************************************************************************/
-/*********************************** EFFECTS **********************************/
-/******************************************************************************/
-
-$.extend($.effects, {
-       version: "1.8.24",
-
-       // Saves a set of properties in a data storage
-       save: function(element, set) {
-               for(var i=0; i < set.length; i++) {
-                       if(set[i] !== null) element.data("ec.storage."+set[i], element[0].style[set[i]]);
-               }
-       },
-
-       // Restores a set of previously saved properties from a data storage
-       restore: function(element, set) {
-               for(var i=0; i < set.length; i++) {
-                       if(set[i] !== null) element.css(set[i], element.data("ec.storage."+set[i]));
-               }
-       },
-
-       setMode: function(el, mode) {
-               if (mode == 'toggle') mode = el.is(':hidden') ? 'show' : 'hide'; // Set for toggle
-               return mode;
-       },
-
-       getBaseline: function(origin, original) { // Translates a [top,left] array into a baseline value
-               // this should be a little more flexible in the future to handle a string & hash
-               var y, x;
-               switch (origin[0]) {
-                       case 'top': y = 0; break;
-                       case 'middle': y = 0.5; break;
-                       case 'bottom': y = 1; break;
-                       default: y = origin[0] / original.height;
-               };
-               switch (origin[1]) {
-                       case 'left': x = 0; break;
-                       case 'center': x = 0.5; break;
-                       case 'right': x = 1; break;
-                       default: x = origin[1] / original.width;
-               };
-               return {x: x, y: y};
-       },
-
-       // Wraps the element around a wrapper that copies position properties
-       createWrapper: function(element) {
-
-               // if the element is already wrapped, return it
-               if (element.parent().is('.ui-effects-wrapper')) {
-                       return element.parent();
-               }
-
-               // wrap the element
-               var props = {
-                               width: element.outerWidth(true),
-                               height: element.outerHeight(true),
-                               'float': element.css('float')
-                       },
-                       wrapper = $('<div></div>')
-                               .addClass('ui-effects-wrapper')
-                               .css({
-                                       fontSize: '100%',
-                                       background: 'transparent',
-                                       border: 'none',
-                                       margin: 0,
-                                       padding: 0
-                               }),
-                       active = document.activeElement;
-
-               // support: Firefox
-               // Firefox incorrectly exposes anonymous content
-               // https://bugzilla.mozilla.org/show_bug.cgi?id=561664
-               try {
-                       active.id;
-               } catch( e ) {
-                       active = document.body;
-               }
-
-               element.wrap( wrapper );
-
-               // Fixes #7595 - Elements lose focus when wrapped.
-               if ( element[ 0 ] === active || $.contains( element[ 0 ], active ) ) {
-                       $( active ).focus();
-               }
-               
-               wrapper = element.parent(); //Hotfix for jQuery 1.4 since some change in wrap() seems to actually loose the reference to the wrapped element
-
-               // transfer positioning properties to the wrapper
-               if (element.css('position') == 'static') {
-                       wrapper.css({ position: 'relative' });
-                       element.css({ position: 'relative' });
-               } else {
-                       $.extend(props, {
-                               position: element.css('position'),
-                               zIndex: element.css('z-index')
-                       });
-                       $.each(['top', 'left', 'bottom', 'right'], function(i, pos) {
-                               props[pos] = element.css(pos);
-                               if (isNaN(parseInt(props[pos], 10))) {
-                                       props[pos] = 'auto';
-                               }
-                       });
-                       element.css({position: 'relative', top: 0, left: 0, right: 'auto', bottom: 'auto' });
-               }
-
-               return wrapper.css(props).show();
-       },
-
-       removeWrapper: function(element) {
-               var parent,
-                       active = document.activeElement;
-               
-               if (element.parent().is('.ui-effects-wrapper')) {
-                       parent = element.parent().replaceWith(element);
-                       // Fixes #7595 - Elements lose focus when wrapped.
-                       if ( element[ 0 ] === active || $.contains( element[ 0 ], active ) ) {
-                               $( active ).focus();
-                       }
-                       return parent;
-               }
-                       
-               return element;
-       },
-
-       setTransition: function(element, list, factor, value) {
-               value = value || {};
-               $.each(list, function(i, x){
-                       var unit = element.cssUnit(x);
-                       if (unit[0] > 0) value[x] = unit[0] * factor + unit[1];
-               });
-               return value;
-       }
-});
-
-
-function _normalizeArguments(effect, options, speed, callback) {
-       // shift params for method overloading
-       if (typeof effect == 'object') {
-               callback = options;
-               speed = null;
-               options = effect;
-               effect = options.effect;
-       }
-       if ($.isFunction(options)) {
-               callback = options;
-               speed = null;
-               options = {};
-       }
-        if (typeof options == 'number' || $.fx.speeds[options]) {
-               callback = speed;
-               speed = options;
-               options = {};
-       }
-       if ($.isFunction(speed)) {
-               callback = speed;
-               speed = null;
-       }
-
-       options = options || {};
-
-       speed = speed || options.duration;
-       speed = $.fx.off ? 0 : typeof speed == 'number'
-               ? speed : speed in $.fx.speeds ? $.fx.speeds[speed] : $.fx.speeds._default;
-
-       callback = callback || options.complete;
-
-       return [effect, options, speed, callback];
-}
-
-function standardSpeed( speed ) {
-       // valid standard speeds
-       if ( !speed || typeof speed === "number" || $.fx.speeds[ speed ] ) {
-               return true;
-       }
-       
-       // invalid strings - treat as "normal" speed
-       if ( typeof speed === "string" && !$.effects[ speed ] ) {
-               return true;
-       }
-       
-       return false;
-}
-
-$.fn.extend({
-       effect: function(effect, options, speed, callback) {
-               var args = _normalizeArguments.apply(this, arguments),
-                       // TODO: make effects take actual parameters instead of a hash
-                       args2 = {
-                               options: args[1],
-                               duration: args[2],
-                               callback: args[3]
-                       },
-                       mode = args2.options.mode,
-                       effectMethod = $.effects[effect];
-               
-               if ( $.fx.off || !effectMethod ) {
-                       // delegate to the original method (e.g., .show()) if possible
-                       if ( mode ) {
-                               return this[ mode ]( args2.duration, args2.callback );
-                       } else {
-                               return this.each(function() {
-                                       if ( args2.callback ) {
-                                               args2.callback.call( this );
-                                       }
-                               });
-                       }
-               }
-               
-               return effectMethod.call(this, args2);
-       },
-
-       _show: $.fn.show,
-       show: function(speed) {
-               if ( standardSpeed( speed ) ) {
-                       return this._show.apply(this, arguments);
-               } else {
-                       var args = _normalizeArguments.apply(this, arguments);
-                       args[1].mode = 'show';
-                       return this.effect.apply(this, args);
-               }
-       },
-
-       _hide: $.fn.hide,
-       hide: function(speed) {
-               if ( standardSpeed( speed ) ) {
-                       return this._hide.apply(this, arguments);
-               } else {
-                       var args = _normalizeArguments.apply(this, arguments);
-                       args[1].mode = 'hide';
-                       return this.effect.apply(this, args);
-               }
-       },
-
-       // jQuery core overloads toggle and creates _toggle
-       __toggle: $.fn.toggle,
-       toggle: function(speed) {
-               if ( standardSpeed( speed ) || typeof speed === "boolean" || $.isFunction( speed ) ) {
-                       return this.__toggle.apply(this, arguments);
-               } else {
-                       var args = _normalizeArguments.apply(this, arguments);
-                       args[1].mode = 'toggle';
-                       return this.effect.apply(this, args);
-               }
-       },
-
-       // helper functions
-       cssUnit: function(key) {
-               var style = this.css(key), val = [];
-               $.each( ['em','px','%','pt'], function(i, unit){
-                       if(style.indexOf(unit) > 0)
-                               val = [parseFloat(style), unit];
-               });
-               return val;
-       }
-});
-
-
-
-/******************************************************************************/
-/*********************************** EASING ***********************************/
-/******************************************************************************/
-
-// based on easing equations from Robert Penner (http://www.robertpenner.com/easing)
-
-var baseEasings = {};
-
-$.each( [ "Quad", "Cubic", "Quart", "Quint", "Expo" ], function( i, name ) {
-       baseEasings[ name ] = function( p ) {
-               return Math.pow( p, i + 2 );
-       };
-});
-
-$.extend( baseEasings, {
-       Sine: function ( p ) {
-               return 1 - Math.cos( p * Math.PI / 2 );
-       },
-       Circ: function ( p ) {
-               return 1 - Math.sqrt( 1 - p * p );
-       },
-       Elastic: function( p ) {
-               return p === 0 || p === 1 ? p :
-                       -Math.pow( 2, 8 * (p - 1) ) * Math.sin( ( (p - 1) * 80 - 7.5 ) * Math.PI / 15 );
-       },
-       Back: function( p ) {
-               return p * p * ( 3 * p - 2 );
-       },
-       Bounce: function ( p ) {
-               var pow2,
-                       bounce = 4;
-
-               while ( p < ( ( pow2 = Math.pow( 2, --bounce ) ) - 1 ) / 11 ) {}
-               return 1 / Math.pow( 4, 3 - bounce ) - 7.5625 * Math.pow( ( pow2 * 3 - 2 ) / 22 - p, 2 );
-       }
-});
-
-$.each( baseEasings, function( name, easeIn ) {
-       $.easing[ "easeIn" + name ] = easeIn;
-       $.easing[ "easeOut" + name ] = function( p ) {
-               return 1 - easeIn( 1 - p );
-       };
-       $.easing[ "easeInOut" + name ] = function( p ) {
-               return p < .5 ?
-                       easeIn( p * 2 ) / 2 :
-                       easeIn( p * -2 + 2 ) / -2 + 1;
-       };
-});
-
-})(jQuery);
diff --git a/resources/jquery.effects/jquery.effects.drop.js b/resources/jquery.effects/jquery.effects.drop.js
deleted file mode 100644 (file)
index 97e5abd..0000000
+++ /dev/null
@@ -1,50 +0,0 @@
-/*!
- * jQuery UI Effects Drop 1.8.24
- *
- * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
- * Dual licensed under the MIT or GPL Version 2 licenses.
- * http://jquery.org/license
- *
- * http://docs.jquery.com/UI/Effects/Drop
- *
- * Depends:
- *     jquery.effects.core.js
- */
-(function( $, undefined ) {
-
-$.effects.drop = function(o) {
-
-       return this.queue(function() {
-
-               // Create element
-               var el = $(this), props = ['position','top','bottom','left','right','opacity'];
-
-               // Set options
-               var mode = $.effects.setMode(el, o.options.mode || 'hide'); // Set Mode
-               var direction = o.options.direction || 'left'; // Default Direction
-
-               // Adjust
-               $.effects.save(el, props); el.show(); // Save & Show
-               $.effects.createWrapper(el); // Create Wrapper
-               var ref = (direction == 'up' || direction == 'down') ? 'top' : 'left';
-               var motion = (direction == 'up' || direction == 'left') ? 'pos' : 'neg';
-               var distance = o.options.distance || (ref == 'top' ? el.outerHeight( true ) / 2 : el.outerWidth( true ) / 2);
-               if (mode == 'show') el.css('opacity', 0).css(ref, motion == 'pos' ? -distance : distance); // Shift
-
-               // Animation
-               var animation = {opacity: mode == 'show' ? 1 : 0};
-               animation[ref] = (mode == 'show' ? (motion == 'pos' ? '+=' : '-=') : (motion == 'pos' ? '-=' : '+=')) + distance;
-
-               // Animate
-               el.animate(animation, { queue: false, duration: o.duration, easing: o.options.easing, complete: function() {
-                       if(mode == 'hide') el.hide(); // Hide
-                       $.effects.restore(el, props); $.effects.removeWrapper(el); // Restore
-                       if(o.callback) o.callback.apply(this, arguments); // Callback
-                       el.dequeue();
-               }});
-
-       });
-
-};
-
-})(jQuery);
diff --git a/resources/jquery.effects/jquery.effects.explode.js b/resources/jquery.effects/jquery.effects.explode.js
deleted file mode 100644 (file)
index f63e47a..0000000
+++ /dev/null
@@ -1,79 +0,0 @@
-/*!
- * jQuery UI Effects Explode 1.8.24
- *
- * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
- * Dual licensed under the MIT or GPL Version 2 licenses.
- * http://jquery.org/license
- *
- * http://docs.jquery.com/UI/Effects/Explode
- *
- * Depends:
- *     jquery.effects.core.js
- */
-(function( $, undefined ) {
-
-$.effects.explode = function(o) {
-
-       return this.queue(function() {
-
-       var rows = o.options.pieces ? Math.round(Math.sqrt(o.options.pieces)) : 3;
-       var cells = o.options.pieces ? Math.round(Math.sqrt(o.options.pieces)) : 3;
-
-       o.options.mode = o.options.mode == 'toggle' ? ($(this).is(':visible') ? 'hide' : 'show') : o.options.mode;
-       var el = $(this).show().css('visibility', 'hidden');
-       var offset = el.offset();
-
-       //Substract the margins - not fixing the problem yet.
-       offset.top -= parseInt(el.css("marginTop"),10) || 0;
-       offset.left -= parseInt(el.css("marginLeft"),10) || 0;
-
-       var width = el.outerWidth(true);
-       var height = el.outerHeight(true);
-
-       for(var i=0;i<rows;i++) { // =
-               for(var j=0;j<cells;j++) { // ||
-                       el
-                               .clone()
-                               .appendTo('body')
-                               .wrap('<div></div>')
-                               .css({
-                                       position: 'absolute',
-                                       visibility: 'visible',
-                                       left: -j*(width/cells),
-                                       top: -i*(height/rows)
-                               })
-                               .parent()
-                               .addClass('ui-effects-explode')
-                               .css({
-                                       position: 'absolute',
-                                       overflow: 'hidden',
-                                       width: width/cells,
-                                       height: height/rows,
-                                       left: offset.left + j*(width/cells) + (o.options.mode == 'show' ? (j-Math.floor(cells/2))*(width/cells) : 0),
-                                       top: offset.top + i*(height/rows) + (o.options.mode == 'show' ? (i-Math.floor(rows/2))*(height/rows) : 0),
-                                       opacity: o.options.mode == 'show' ? 0 : 1
-                               }).animate({
-                                       left: offset.left + j*(width/cells) + (o.options.mode == 'show' ? 0 : (j-Math.floor(cells/2))*(width/cells)),
-                                       top: offset.top + i*(height/rows) + (o.options.mode == 'show' ? 0 : (i-Math.floor(rows/2))*(height/rows)),
-                                       opacity: o.options.mode == 'show' ? 1 : 0
-                               }, o.duration || 500);
-               }
-       }
-
-       // Set a timeout, to call the callback approx. when the other animations have finished
-       setTimeout(function() {
-
-               o.options.mode == 'show' ? el.css({ visibility: 'visible' }) : el.css({ visibility: 'visible' }).hide();
-                               if(o.callback) o.callback.apply(el[0]); // Callback
-                               el.dequeue();
-
-                               $('div.ui-effects-explode').remove();
-
-       }, o.duration || 500);
-
-
-       });
-
-};
-
-})(jQuery);
diff --git a/resources/jquery.effects/jquery.effects.fade.js b/resources/jquery.effects/jquery.effects.fade.js
deleted file mode 100644 (file)
index 7aa37b1..0000000
+++ /dev/null
@@ -1,32 +0,0 @@
-/*!
- * jQuery UI Effects Fade 1.8.24
- *
- * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
- * Dual licensed under the MIT or GPL Version 2 licenses.
- * http://jquery.org/license
- *
- * http://docs.jquery.com/UI/Effects/Fade
- *
- * Depends:
- *     jquery.effects.core.js
- */
-(function( $, undefined ) {
-
-$.effects.fade = function(o) {
-       return this.queue(function() {
-               var elem = $(this),
-                       mode = $.effects.setMode(elem, o.options.mode || 'hide');
-
-               elem.animate({ opacity: mode }, {
-                       queue: false,
-                       duration: o.duration,
-                       easing: o.options.easing,
-                       complete: function() {
-                               (o.callback && o.callback.apply(this, arguments));
-                               elem.dequeue();
-                       }
-               });
-       });
-};
-
-})(jQuery);
diff --git a/resources/jquery.effects/jquery.effects.fold.js b/resources/jquery.effects/jquery.effects.fold.js
deleted file mode 100644 (file)
index 06cc553..0000000
+++ /dev/null
@@ -1,56 +0,0 @@
-/*!
- * jQuery UI Effects Fold 1.8.24
- *
- * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
- * Dual licensed under the MIT or GPL Version 2 licenses.
- * http://jquery.org/license
- *
- * http://docs.jquery.com/UI/Effects/Fold
- *
- * Depends:
- *     jquery.effects.core.js
- */
-(function( $, undefined ) {
-
-$.effects.fold = function(o) {
-
-       return this.queue(function() {
-
-               // Create element
-               var el = $(this), props = ['position','top','bottom','left','right'];
-
-               // Set options
-               var mode = $.effects.setMode(el, o.options.mode || 'hide'); // Set Mode
-               var size = o.options.size || 15; // Default fold size
-               var horizFirst = !(!o.options.horizFirst); // Ensure a boolean value
-               var duration = o.duration ? o.duration / 2 : $.fx.speeds._default / 2;
-
-               // Adjust
-               $.effects.save(el, props); el.show(); // Save & Show
-               var wrapper = $.effects.createWrapper(el).css({overflow:'hidden'}); // Create Wrapper
-               var widthFirst = ((mode == 'show') != horizFirst);
-               var ref = widthFirst ? ['width', 'height'] : ['height', 'width'];
-               var distance = widthFirst ? [wrapper.width(), wrapper.height()] : [wrapper.height(), wrapper.width()];
-               var percent = /([0-9]+)%/.exec(size);
-               if(percent) size = parseInt(percent[1],10) / 100 * distance[mode == 'hide' ? 0 : 1];
-               if(mode == 'show') wrapper.css(horizFirst ? {height: 0, width: size} : {height: size, width: 0}); // Shift
-
-               // Animation
-               var animation1 = {}, animation2 = {};
-               animation1[ref[0]] = mode == 'show' ? distance[0] : size;
-               animation2[ref[1]] = mode == 'show' ? distance[1] : 0;
-
-               // Animate
-               wrapper.animate(animation1, duration, o.options.easing)
-               .animate(animation2, duration, o.options.easing, function() {
-                       if(mode == 'hide') el.hide(); // Hide
-                       $.effects.restore(el, props); $.effects.removeWrapper(el); // Restore
-                       if(o.callback) o.callback.apply(el[0], arguments); // Callback
-                       el.dequeue();
-               });
-
-       });
-
-};
-
-})(jQuery);
diff --git a/resources/jquery.effects/jquery.effects.highlight.js b/resources/jquery.effects/jquery.effects.highlight.js
deleted file mode 100644 (file)
index ad9e7bd..0000000
+++ /dev/null
@@ -1,50 +0,0 @@
-/*!
- * jQuery UI Effects Highlight 1.8.24
- *
- * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
- * Dual licensed under the MIT or GPL Version 2 licenses.
- * http://jquery.org/license
- *
- * http://docs.jquery.com/UI/Effects/Highlight
- *
- * Depends:
- *     jquery.effects.core.js
- */
-(function( $, undefined ) {
-
-$.effects.highlight = function(o) {
-       return this.queue(function() {
-               var elem = $(this),
-                       props = ['backgroundImage', 'backgroundColor', 'opacity'],
-                       mode = $.effects.setMode(elem, o.options.mode || 'show'),
-                       animation = {
-                               backgroundColor: elem.css('backgroundColor')
-                       };
-
-               if (mode == 'hide') {
-                       animation.opacity = 0;
-               }
-
-               $.effects.save(elem, props);
-               elem
-                       .show()
-                       .css({
-                               backgroundImage: 'none',
-                               backgroundColor: o.options.color || '#ffff99'
-                       })
-                       .animate(animation, {
-                               queue: false,
-                               duration: o.duration,
-                               easing: o.options.easing,
-                               complete: function() {
-                                       (mode == 'hide' && elem.hide());
-                                       $.effects.restore(elem, props);
-                                       (mode == 'show' && !$.support.opacity && this.style.removeAttribute('filter'));
-                                       (o.callback && o.callback.apply(this, arguments));
-                                       elem.dequeue();
-                               }
-                       });
-       });
-};
-
-})(jQuery);
diff --git a/resources/jquery.effects/jquery.effects.pulsate.js b/resources/jquery.effects/jquery.effects.pulsate.js
deleted file mode 100644 (file)
index d730bee..0000000
+++ /dev/null
@@ -1,51 +0,0 @@
-/*!
- * jQuery UI Effects Pulsate 1.8.24
- *
- * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
- * Dual licensed under the MIT or GPL Version 2 licenses.
- * http://jquery.org/license
- *
- * http://docs.jquery.com/UI/Effects/Pulsate
- *
- * Depends:
- *     jquery.effects.core.js
- */
-(function( $, undefined ) {
-
-$.effects.pulsate = function(o) {
-       return this.queue(function() {
-               var elem = $(this),
-                       mode = $.effects.setMode(elem, o.options.mode || 'show'),
-                       times = ((o.options.times || 5) * 2) - 1,
-                       duration = o.duration ? o.duration / 2 : $.fx.speeds._default / 2,
-                       isVisible = elem.is(':visible'),
-                       animateTo = 0;
-
-               if (!isVisible) {
-                       elem.css('opacity', 0).show();
-                       animateTo = 1;
-               }
-
-               if ((mode == 'hide' && isVisible) || (mode == 'show' && !isVisible)) {
-                       times--;
-               }
-
-               for (var i = 0; i < times; i++) {
-                       elem.animate({ opacity: animateTo }, duration, o.options.easing);
-                       animateTo = (animateTo + 1) % 2;
-               }
-
-               elem.animate({ opacity: animateTo }, duration, o.options.easing, function() {
-                       if (animateTo == 0) {
-                               elem.hide();
-                       }
-                       (o.callback && o.callback.apply(this, arguments));
-               });
-
-               elem
-                       .queue('fx', function() { elem.dequeue(); })
-                       .dequeue();
-       });
-};
-
-})(jQuery);
diff --git a/resources/jquery.effects/jquery.effects.scale.js b/resources/jquery.effects/jquery.effects.scale.js
deleted file mode 100644 (file)
index 52d1871..0000000
+++ /dev/null
@@ -1,178 +0,0 @@
-/*!
- * jQuery UI Effects Scale 1.8.24
- *
- * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
- * Dual licensed under the MIT or GPL Version 2 licenses.
- * http://jquery.org/license
- *
- * http://docs.jquery.com/UI/Effects/Scale
- *
- * Depends:
- *     jquery.effects.core.js
- */
-(function( $, undefined ) {
-
-$.effects.puff = function(o) {
-       return this.queue(function() {
-               var elem = $(this),
-                       mode = $.effects.setMode(elem, o.options.mode || 'hide'),
-                       percent = parseInt(o.options.percent, 10) || 150,
-                       factor = percent / 100,
-                       original = { height: elem.height(), width: elem.width() };
-
-               $.extend(o.options, {
-                       fade: true,
-                       mode: mode,
-                       percent: mode == 'hide' ? percent : 100,
-                       from: mode == 'hide'
-                               ? original
-                               : {
-                                       height: original.height * factor,
-                                       width: original.width * factor
-                               }
-               });
-
-               elem.effect('scale', o.options, o.duration, o.callback);
-               elem.dequeue();
-       });
-};
-
-$.effects.scale = function(o) {
-
-       return this.queue(function() {
-
-               // Create element
-               var el = $(this);
-
-               // Set options
-               var options = $.extend(true, {}, o.options);
-               var mode = $.effects.setMode(el, o.options.mode || 'effect'); // Set Mode
-               var percent = parseInt(o.options.percent,10) || (parseInt(o.options.percent,10) == 0 ? 0 : (mode == 'hide' ? 0 : 100)); // Set default scaling percent
-               var direction = o.options.direction || 'both'; // Set default axis
-               var origin = o.options.origin; // The origin of the scaling
-               if (mode != 'effect') { // Set default origin and restore for show/hide
-                       options.origin = origin || ['middle','center'];
-                       options.restore = true;
-               }
-               var original = {height: el.height(), width: el.width()}; // Save original
-               el.from = o.options.from || (mode == 'show' ? {height: 0, width: 0} : original); // Default from state
-
-               // Adjust
-               var factor = { // Set scaling factor
-                       y: direction != 'horizontal' ? (percent / 100) : 1,
-                       x: direction != 'vertical' ? (percent / 100) : 1
-               };
-               el.to = {height: original.height * factor.y, width: original.width * factor.x}; // Set to state
-
-               if (o.options.fade) { // Fade option to support puff
-                       if (mode == 'show') {el.from.opacity = 0; el.to.opacity = 1;};
-                       if (mode == 'hide') {el.from.opacity = 1; el.to.opacity = 0;};
-               };
-
-               // Animation
-               options.from = el.from; options.to = el.to; options.mode = mode;
-
-               // Animate
-               el.effect('size', options, o.duration, o.callback);
-               el.dequeue();
-       });
-
-};
-
-$.effects.size = function(o) {
-
-       return this.queue(function() {
-
-               // Create element
-               var el = $(this), props = ['position','top','bottom','left','right','width','height','overflow','opacity'];
-               var props1 = ['position','top','bottom','left','right','overflow','opacity']; // Always restore
-               var props2 = ['width','height','overflow']; // Copy for children
-               var cProps = ['fontSize'];
-               var vProps = ['borderTopWidth', 'borderBottomWidth', 'paddingTop', 'paddingBottom'];
-               var hProps = ['borderLeftWidth', 'borderRightWidth', 'paddingLeft', 'paddingRight'];
-
-               // Set options
-               var mode = $.effects.setMode(el, o.options.mode || 'effect'); // Set Mode
-               var restore = o.options.restore || false; // Default restore
-               var scale = o.options.scale || 'both'; // Default scale mode
-               var origin = o.options.origin; // The origin of the sizing
-               var original = {height: el.height(), width: el.width()}; // Save original
-               el.from = o.options.from || original; // Default from state
-               el.to = o.options.to || original; // Default to state
-               // Adjust
-               if (origin) { // Calculate baseline shifts
-                       var baseline = $.effects.getBaseline(origin, original);
-                       el.from.top = (original.height - el.from.height) * baseline.y;
-                       el.from.left = (original.width - el.from.width) * baseline.x;
-                       el.to.top = (original.height - el.to.height) * baseline.y;
-                       el.to.left = (original.width - el.to.width) * baseline.x;
-               };
-               var factor = { // Set scaling factor
-                       from: {y: el.from.height / original.height, x: el.from.width / original.width},
-                       to: {y: el.to.height / original.height, x: el.to.width / original.width}
-               };
-               if (scale == 'box' || scale == 'both') { // Scale the css box
-                       if (factor.from.y != factor.to.y) { // Vertical props scaling
-                               props = props.concat(vProps);
-                               el.from = $.effects.setTransition(el, vProps, factor.from.y, el.from);
-                               el.to = $.effects.setTransition(el, vProps, factor.to.y, el.to);
-                       };
-                       if (factor.from.x != factor.to.x) { // Horizontal props scaling
-                               props = props.concat(hProps);
-                               el.from = $.effects.setTransition(el, hProps, factor.from.x, el.from);
-                               el.to = $.effects.setTransition(el, hProps, factor.to.x, el.to);
-                       };
-               };
-               if (scale == 'content' || scale == 'both') { // Scale the content
-                       if (factor.from.y != factor.to.y) { // Vertical props scaling
-                               props = props.concat(cProps);
-                               el.from = $.effects.setTransition(el, cProps, factor.from.y, el.from);
-                               el.to = $.effects.setTransition(el, cProps, factor.to.y, el.to);
-                       };
-               };
-               $.effects.save(el, restore ? props : props1); el.show(); // Save & Show
-               $.effects.createWrapper(el); // Create Wrapper
-               el.css('overflow','hidden').css(el.from); // Shift
-
-               // Animate
-               if (scale == 'content' || scale == 'both') { // Scale the children
-                       vProps = vProps.concat(['marginTop','marginBottom']).concat(cProps); // Add margins/font-size
-                       hProps = hProps.concat(['marginLeft','marginRight']); // Add margins
-                       props2 = props.concat(vProps).concat(hProps); // Concat
-                       el.find("*[width]").each(function(){
-                               var child = $(this);
-                               if (restore) $.effects.save(child, props2);
-                               var c_original = {height: child.height(), width: child.width()}; // Save original
-                               child.from = {height: c_original.height * factor.from.y, width: c_original.width * factor.from.x};
-                               child.to = {height: c_original.height * factor.to.y, width: c_original.width * factor.to.x};
-                               if (factor.from.y != factor.to.y) { // Vertical props scaling
-                                       child.from = $.effects.setTransition(child, vProps, factor.from.y, child.from);
-                                       child.to = $.effects.setTransition(child, vProps, factor.to.y, child.to);
-                               };
-                               if (factor.from.x != factor.to.x) { // Horizontal props scaling
-                                       child.from = $.effects.setTransition(child, hProps, factor.from.x, child.from);
-                                       child.to = $.effects.setTransition(child, hProps, factor.to.x, child.to);
-                               };
-                               child.css(child.from); // Shift children
-                               child.animate(child.to, o.duration, o.options.easing, function(){
-                                       if (restore) $.effects.restore(child, props2); // Restore children
-                               }); // Animate children
-                       });
-               };
-
-               // Animate
-               el.animate(el.to, { queue: false, duration: o.duration, easing: o.options.easing, complete: function() {
-                       if (el.to.opacity === 0) {
-                               el.css('opacity', el.from.opacity);
-                       }
-                       if(mode == 'hide') el.hide(); // Hide
-                       $.effects.restore(el, restore ? props : props1); $.effects.removeWrapper(el); // Restore
-                       if(o.callback) o.callback.apply(this, arguments); // Callback
-                       el.dequeue();
-               }});
-
-       });
-
-};
-
-})(jQuery);
diff --git a/resources/jquery.effects/jquery.effects.shake.js b/resources/jquery.effects/jquery.effects.shake.js
deleted file mode 100644 (file)
index 44b8ea4..0000000
+++ /dev/null
@@ -1,57 +0,0 @@
-/*!
- * jQuery UI Effects Shake 1.8.24
- *
- * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
- * Dual licensed under the MIT or GPL Version 2 licenses.
- * http://jquery.org/license
- *
- * http://docs.jquery.com/UI/Effects/Shake
- *
- * Depends:
- *     jquery.effects.core.js
- */
-(function( $, undefined ) {
-
-$.effects.shake = function(o) {
-
-       return this.queue(function() {
-
-               // Create element
-               var el = $(this), props = ['position','top','bottom','left','right'];
-
-               // Set options
-               var mode = $.effects.setMode(el, o.options.mode || 'effect'); // Set Mode
-               var direction = o.options.direction || 'left'; // Default direction
-               var distance = o.options.distance || 20; // Default distance
-               var times = o.options.times || 3; // Default # of times
-               var speed = o.duration || o.options.duration || 140; // Default speed per shake
-
-               // Adjust
-               $.effects.save(el, props); el.show(); // Save & Show
-               $.effects.createWrapper(el); // Create Wrapper
-               var ref = (direction == 'up' || direction == 'down') ? 'top' : 'left';
-               var motion = (direction == 'up' || direction == 'left') ? 'pos' : 'neg';
-
-               // Animation
-               var animation = {}, animation1 = {}, animation2 = {};
-               animation[ref] = (motion == 'pos' ? '-=' : '+=')  + distance;
-               animation1[ref] = (motion == 'pos' ? '+=' : '-=')  + distance * 2;
-               animation2[ref] = (motion == 'pos' ? '-=' : '+=')  + distance * 2;
-
-               // Animate
-               el.animate(animation, speed, o.options.easing);
-               for (var i = 1; i < times; i++) { // Shakes
-                       el.animate(animation1, speed, o.options.easing).animate(animation2, speed, o.options.easing);
-               };
-               el.animate(animation1, speed, o.options.easing).
-               animate(animation, speed / 2, o.options.easing, function(){ // Last shake
-                       $.effects.restore(el, props); $.effects.removeWrapper(el); // Restore
-                       if(o.callback) o.callback.apply(this, arguments); // Callback
-               });
-               el.queue('fx', function() { el.dequeue(); });
-               el.dequeue();
-       });
-
-};
-
-})(jQuery);
diff --git a/resources/jquery.effects/jquery.effects.slide.js b/resources/jquery.effects/jquery.effects.slide.js
deleted file mode 100644 (file)
index 502e6c9..0000000
+++ /dev/null
@@ -1,50 +0,0 @@
-/*!
- * jQuery UI Effects Slide 1.8.24
- *
- * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
- * Dual licensed under the MIT or GPL Version 2 licenses.
- * http://jquery.org/license
- *
- * http://docs.jquery.com/UI/Effects/Slide
- *
- * Depends:
- *     jquery.effects.core.js
- */
-(function( $, undefined ) {
-
-$.effects.slide = function(o) {
-
-       return this.queue(function() {
-
-               // Create element
-               var el = $(this), props = ['position','top','bottom','left','right'];
-
-               // Set options
-               var mode = $.effects.setMode(el, o.options.mode || 'show'); // Set Mode
-               var direction = o.options.direction || 'left'; // Default Direction
-
-               // Adjust
-               $.effects.save(el, props); el.show(); // Save & Show
-               $.effects.createWrapper(el).css({overflow:'hidden'}); // Create Wrapper
-               var ref = (direction == 'up' || direction == 'down') ? 'top' : 'left';
-               var motion = (direction == 'up' || direction == 'left') ? 'pos' : 'neg';
-               var distance = o.options.distance || (ref == 'top' ? el.outerHeight( true ) : el.outerWidth( true ));
-               if (mode == 'show') el.css(ref, motion == 'pos' ? (isNaN(distance) ? "-" + distance : -distance) : distance); // Shift
-
-               // Animation
-               var animation = {};
-               animation[ref] = (mode == 'show' ? (motion == 'pos' ? '+=' : '-=') : (motion == 'pos' ? '-=' : '+=')) + distance;
-
-               // Animate
-               el.animate(animation, { queue: false, duration: o.duration, easing: o.options.easing, complete: function() {
-                       if(mode == 'hide') el.hide(); // Hide
-                       $.effects.restore(el, props); $.effects.removeWrapper(el); // Restore
-                       if(o.callback) o.callback.apply(this, arguments); // Callback
-                       el.dequeue();
-               }});
-
-       });
-
-};
-
-})(jQuery);
diff --git a/resources/jquery.effects/jquery.effects.transfer.js b/resources/jquery.effects/jquery.effects.transfer.js
deleted file mode 100644 (file)
index 4ee4ae8..0000000
+++ /dev/null
@@ -1,45 +0,0 @@
-/*!
- * jQuery UI Effects Transfer 1.8.24
- *
- * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
- * Dual licensed under the MIT or GPL Version 2 licenses.
- * http://jquery.org/license
- *
- * http://docs.jquery.com/UI/Effects/Transfer
- *
- * Depends:
- *     jquery.effects.core.js
- */
-(function( $, undefined ) {
-
-$.effects.transfer = function(o) {
-       return this.queue(function() {
-               var elem = $(this),
-                       target = $(o.options.to),
-                       endPosition = target.offset(),
-                       animation = {
-                               top: endPosition.top,
-                               left: endPosition.left,
-                               height: target.innerHeight(),
-                               width: target.innerWidth()
-                       },
-                       startPosition = elem.offset(),
-                       transfer = $('<div class="ui-effects-transfer"></div>')
-                               .appendTo(document.body)
-                               .addClass(o.options.className)
-                               .css({
-                                       top: startPosition.top,
-                                       left: startPosition.left,
-                                       height: elem.innerHeight(),
-                                       width: elem.innerWidth(),
-                                       position: 'absolute'
-                               })
-                               .animate(animation, o.duration, o.options.easing, function() {
-                                       transfer.remove();
-                                       (o.callback && o.callback.apply(elem[0], arguments));
-                                       elem.dequeue();
-                               });
-       });
-};
-
-})(jQuery);
diff --git a/resources/jquery.tipsy/images/tipsy.png b/resources/jquery.tipsy/images/tipsy.png
deleted file mode 100644 (file)
index ef17cc3..0000000
Binary files a/resources/jquery.tipsy/images/tipsy.png and /dev/null differ
diff --git a/resources/jquery.tipsy/jquery.tipsy.css b/resources/jquery.tipsy/jquery.tipsy.css
deleted file mode 100644 (file)
index 3680fbe..0000000
+++ /dev/null
@@ -1,75 +0,0 @@
-.tipsy {
-       padding: 5px;
-       position: absolute;
-       z-index: 100000;
-       cursor: default;
-}
-.tipsy-inner {
-       padding: 5px 8px 4px 8px;
-       /*background-color: #e8f2f8;*/
-       background-color: #ffffff;
-       border: solid 1px #a7d7f9;
-       color: black;
-       max-width: 15em;
-       border-radius: 4px;
-       -moz-border-radius: 4px;
-       -webkit-border-radius: 4px;
-       /*
-       -moz-box-shadow: 0px 2px 8px #cccccc;
-       -webkit-box-shadow: 0px 2px 8px #cccccc;
-       box-shadow: 0px 2px 8px #cccccc;
-       -ms-filter: "progid:DXImageTransform.Microsoft.DropShadow(OffX=0, OffY=2, Strength=6, Direction=90, Color='#cccccc')";
-       filter: progid:DXImageTransform.Microsoft.DropShadow(OffX=0, OffY=2, Strength=6, Direction=90, Color='#cccccc');
-       */
-}
-.tipsy-arrow {
-       position: absolute;
-       /* @embed */
-       background: url('images/tipsy.png') no-repeat top left;
-       width: 11px;
-       height: 6px;
-}
-/* @noflip */ .tipsy-n .tipsy-arrow {
-       top: 0px;
-       left: 50%;
-       margin-left: -5px;
-}
-/* @noflip */ .tipsy-nw .tipsy-arrow {
-       top: 1px;
-       left: 10px;
-}
-/* @noflip */ .tipsy-ne .tipsy-arrow {
-       top: 1px;
-       right: 10px;
-}
-/* @noflip */ .tipsy-s .tipsy-arrow {
-       bottom: 0px;
-       left: 50%;
-       margin-left: -5px;
-       background-position: bottom left;
-}
-/* @noflip */ .tipsy-sw .tipsy-arrow {
-       bottom: 0px;
-       left: 10px;
-       background-position: bottom left;
-}
-/* @noflip */ .tipsy-se .tipsy-arrow {
-       bottom: 0px;
-       right: 10px;
-       background-position: bottom left;
-}
-/* @noflip */ .tipsy-e .tipsy-arrow {
-       top: 50%;
-       margin-top: -5px;
-       right: 1px;
-       width: 5px;
-       height: 11px;
-       background-position: top right;
-}
-/* @noflip */ .tipsy-w .tipsy-arrow {
-       top: 50%;
-       margin-top: -5px;
-       left: 0px;
-       width: 6px;
-       height: 11px;
-}
\ No newline at end of file
diff --git a/resources/jquery.tipsy/jquery.tipsy.js b/resources/jquery.tipsy/jquery.tipsy.js
deleted file mode 100644 (file)
index f920e8b..0000000
+++ /dev/null
@@ -1,223 +0,0 @@
-// tipsy, facebook style tooltips for jquery
-// version 1.0.0a*
-// (c) 2008-2010 jason frame [jason@onehackoranother.com]
-// released under the MIT license
-
-// * This installation of tipsy includes several local modifications to both Javascript and CSS.
-//   Please be careful when upgrading.
-
-(function($) {
-
-    function maybeCall(thing, ctx) {
-        return (typeof thing == 'function') ? (thing.call(ctx)) : thing;
-    }
-
-    function fixTitle($ele) {
-        if ($ele.attr('title') || typeof($ele.attr('original-title')) != 'string') {
-            $ele.attr('original-title', $ele.attr('title') || '').removeAttr('title');
-        }
-    }
-
-    function Tipsy(element, options) {
-        this.$element = $(element);
-        this.options = options;
-        this.enabled = true;
-        fixTitle(this.$element);
-    }
-
-    Tipsy.prototype = {
-        show: function() {
-            var title = this.getTitle();
-            if (title && this.enabled) {
-                var $tip = this.tip();
-
-                $tip.find('.tipsy-inner')[this.options.html ? 'html' : 'text'](title);
-                $tip[0].className = 'tipsy'; // reset classname in case of dynamic gravity
-                if (this.options.className) {
-                    $tip.addClass(maybeCall(this.options.className, this.$element[0]));
-                }
-                $tip.remove().css({top: 0, left: 0, visibility: 'hidden', display: 'block'}).appendTo(document.body);
-
-                var pos = $.extend({}, this.$element.offset(), {
-                    width: this.$element[0].offsetWidth,
-                    height: this.$element[0].offsetHeight
-                });
-
-                var gravity = (typeof this.options.gravity == 'function')
-                                ? this.options.gravity.call(this.$element[0])
-                                : this.options.gravity;
-
-                // Attach css classes before checking height/width so they
-                // can be applied.
-                $tip.addClass('tipsy-' + gravity);
-                if (this.options.className) {
-                    $tip.addClass(maybeCall(this.options.className, this.$element[0]));
-                }
-
-                var actualWidth = $tip[0].offsetWidth, actualHeight = $tip[0].offsetHeight;
-                var tp;
-                switch (gravity.charAt(0)) {
-                    case 'n':
-                        tp = {top: pos.top + pos.height + this.options.offset, left: pos.left + pos.width / 2 - actualWidth / 2};
-                        break;
-                    case 's':
-                        tp = {top: pos.top - actualHeight - this.options.offset, left: pos.left + pos.width / 2 - actualWidth / 2};
-                        break;
-                    case 'e':
-                        tp = {top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth - this.options.offset};
-                        break;
-                    case 'w':
-                        tp = {top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width + this.options.offset};
-                        break;
-                }
-
-                if (gravity.length == 2) {
-                    if (gravity.charAt(1) == 'w') {
-                        if (this.options.center) {
-                            tp.left = pos.left + pos.width / 2 - 15;
-                        } else {
-                            tp.left = pos.left;
-                        }
-                    } else {
-                        if (this.options.center) {
-                            tp.left = pos.left + pos.width / 2 - actualWidth + 15;
-                        } else {
-                            tp.left = pos.left + pos.width;
-                        }
-                    }
-                }
-                $tip.css(tp);
-
-                if (this.options.fade) {
-                    $tip.stop().css({opacity: 0, display: 'block', visibility: 'visible'}).animate({opacity: this.options.opacity}, 100);
-                } else {
-                    $tip.css({visibility: 'visible', opacity: this.options.opacity});
-                }
-            }
-        },
-
-        hide: function() {
-            if (this.options.fade) {
-                this.tip().stop().fadeOut(100, function() { $(this).remove(); });
-            } else {
-                this.tip().remove();
-            }
-        },
-
-        getTitle: function() {
-            var title, $e = this.$element, o = this.options;
-            fixTitle($e);
-            if (typeof o.title == 'string') {
-                title = $e.attr(o.title == 'title' ? 'original-title' : o.title);
-            } else if (typeof o.title == 'function') {
-                title = o.title.call($e[0]);
-            }
-            title = ('' + title).replace(/(^\s*|\s*$)/, "");
-            return title || o.fallback;
-        },
-
-        tip: function() {
-            if (!this.$tip) {
-                this.$tip = $('<div class="tipsy"></div>').html('<div class="tipsy-arrow"></div><div class="tipsy-inner"/></div>');
-            }
-            return this.$tip;
-        },
-
-        validate: function() {
-            if (!this.$element[0].parentNode) {
-                this.hide();
-                this.$element = null;
-                this.options = null;
-            }
-        },
-
-        enable: function() { this.enabled = true; },
-        disable: function() { this.enabled = false; },
-        toggleEnabled: function() { this.enabled = !this.enabled; }
-    };
-
-    $.fn.tipsy = function(options) {
-
-        if (options === true) {
-            return this.data('tipsy');
-        } else if (typeof options == 'string') {
-            return this.data('tipsy')[options]();
-        }
-
-        options = $.extend({}, $.fn.tipsy.defaults, options);
-
-        function get(ele) {
-            var tipsy = $.data(ele, 'tipsy');
-            if (!tipsy) {
-                tipsy = new Tipsy(ele, $.fn.tipsy.elementOptions(ele, options));
-                $.data(ele, 'tipsy', tipsy);
-            }
-            return tipsy;
-        }
-
-        function enter() {
-            var tipsy = get(this);
-            tipsy.hoverState = 'in';
-            if (options.delayIn == 0) {
-                tipsy.show();
-            } else {
-                setTimeout(function() { if (tipsy.hoverState == 'in') tipsy.show(); }, options.delayIn);
-            }
-        };
-
-        function leave() {
-            var tipsy = get(this);
-            tipsy.hoverState = 'out';
-            if (options.delayOut == 0) {
-                tipsy.hide();
-            } else {
-                setTimeout(function() { if (tipsy.hoverState == 'out') tipsy.hide(); }, options.delayOut);
-            }
-        };
-
-        if (!options.live) this.each(function() { get(this); });
-
-        if (options.trigger != 'manual') {
-            var binder   = options.live ? 'live' : 'bind',
-                eventIn  = options.trigger == 'hover' ? 'mouseenter' : 'focus',
-                eventOut = options.trigger == 'hover' ? 'mouseleave' : 'blur';
-            this[binder](eventIn, enter)[binder](eventOut, leave);
-        }
-
-        return this;
-
-    };
-
-    $.fn.tipsy.defaults = {
-        className: null,
-        delayIn: 0,
-        delayOut: 0,
-        fade: true,
-        fallback: '',
-        gravity: 'n',
-        center: true,
-        html: false,
-        live: false,
-        offset: 0,
-        opacity: 1.0,
-        title: 'title',
-        trigger: 'hover'
-    };
-
-    // Overwrite this method to provide options on a per-element basis.
-    // For example, you could store the gravity in a 'tipsy-gravity' attribute:
-    // return $.extend({}, options, {gravity: $(ele).attr('tipsy-gravity') || 'n' });
-    // (remember - do not modify 'options' in place!)
-    $.fn.tipsy.elementOptions = function(ele, options) {
-        return $.metadata ? $.extend({}, options, $(ele).metadata()) : options;
-    };
-
-    $.fn.tipsy.autoNS = function() {
-        return $(this).offset().top > ($(document).scrollTop() + $(window).height() / 2) ? 's' : 'n';
-    };
-
-    $.fn.tipsy.autoWE = function() {
-        return $(this).offset().left > ($(document).scrollLeft() + $(window).width() / 2) ? 'e' : 'w';
-    };
-
-})(jQuery);
diff --git a/resources/jquery.ui/i18n/jquery.ui.datepicker-af.js b/resources/jquery.ui/i18n/jquery.ui.datepicker-af.js
deleted file mode 100644 (file)
index 0922ef7..0000000
+++ /dev/null
@@ -1,23 +0,0 @@
-/* Afrikaans initialisation for the jQuery UI date picker plugin. */
-/* Written by Renier Pretorius. */
-jQuery(function($){
-       $.datepicker.regional['af'] = {
-               closeText: 'Selekteer',
-               prevText: 'Vorige',
-               nextText: 'Volgende',
-               currentText: 'Vandag',
-               monthNames: ['Januarie','Februarie','Maart','April','Mei','Junie',
-               'Julie','Augustus','September','Oktober','November','Desember'],
-               monthNamesShort: ['Jan', 'Feb', 'Mrt', 'Apr', 'Mei', 'Jun',
-               'Jul', 'Aug', 'Sep', 'Okt', 'Nov', 'Des'],
-               dayNames: ['Sondag', 'Maandag', 'Dinsdag', 'Woensdag', 'Donderdag', 'Vrydag', 'Saterdag'],
-               dayNamesShort: ['Son', 'Maa', 'Din', 'Woe', 'Don', 'Vry', 'Sat'],
-               dayNamesMin: ['So','Ma','Di','Wo','Do','Vr','Sa'],
-               weekHeader: 'Wk',
-               dateFormat: 'dd/mm/yy',
-               firstDay: 1,
-               isRTL: false,
-               showMonthAfterYear: false,
-               yearSuffix: ''};
-       $.datepicker.setDefaults($.datepicker.regional['af']);
-});
diff --git a/resources/jquery.ui/i18n/jquery.ui.datepicker-ar.js b/resources/jquery.ui/i18n/jquery.ui.datepicker-ar.js
deleted file mode 100644 (file)
index 8a9218d..0000000
+++ /dev/null
@@ -1,23 +0,0 @@
-/* Arabic Translation for jQuery UI date picker plugin. */
-/* Khaled Alhourani -- me@khaledalhourani.com */
-/* NOTE: monthNames are the original months names and they are the Arabic names, not the new months name فبراير - يناير and there isn't any Arabic roots for these months */
-jQuery(function($){
-       $.datepicker.regional['ar'] = {
-               closeText: 'إغلاق',
-               prevText: '&#x3c;السابق',
-               nextText: 'التالي&#x3e;',
-               currentText: 'اليوم',
-               monthNames: ['كانون الثاني', 'شباط', 'آذار', 'نيسان', 'مايو', 'حزيران',
-               'تموز', 'آب', 'أيلول',       'تشرين الأول', 'تشرين الثاني', 'كانون الأول'],
-               monthNamesShort: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'],
-               dayNames: ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'],
-               dayNamesShort: ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'],
-               dayNamesMin: ['ح', 'ن', 'ث', 'ر', 'خ', 'ج', 'س'],
-               weekHeader: 'أسبوع',
-               dateFormat: 'dd/mm/yy',
-               firstDay: 6,
-               isRTL: true,
-               showMonthAfterYear: false,
-               yearSuffix: ''};
-       $.datepicker.setDefaults($.datepicker.regional['ar']);
-});
\ No newline at end of file
diff --git a/resources/jquery.ui/i18n/jquery.ui.datepicker-az.js b/resources/jquery.ui/i18n/jquery.ui.datepicker-az.js
deleted file mode 100644 (file)
index 57802a4..0000000
+++ /dev/null
@@ -1,23 +0,0 @@
-/* Azerbaijani (UTF-8) initialisation for the jQuery UI date picker plugin. */
-/* Written by Jamil Najafov (necefov33@gmail.com). */
-jQuery(function($) {
-       $.datepicker.regional['az'] = {
-               closeText: 'Bağla',
-               prevText: '&#x3c;Geri',
-               nextText: 'İrəli&#x3e;',
-               currentText: 'Bugün',
-               monthNames: ['Yanvar','Fevral','Mart','Aprel','May','İyun',
-               'İyul','Avqust','Sentyabr','Oktyabr','Noyabr','Dekabr'],
-               monthNamesShort: ['Yan','Fev','Mar','Apr','May','İyun',
-               'İyul','Avq','Sen','Okt','Noy','Dek'],
-               dayNames: ['Bazar','Bazar ertəsi','Çərşənbə axşamı','Çərşənbə','Cümə axşamı','Cümə','Şənbə'],
-               dayNamesShort: ['B','Be','Ça','Ç','Ca','C','Ş'],
-               dayNamesMin: ['B','B','Ç','С','Ç','C','Ş'],
-               weekHeader: 'Hf',
-               dateFormat: 'dd.mm.yy',
-               firstDay: 1,
-               isRTL: false,
-               showMonthAfterYear: false,
-               yearSuffix: ''};
-       $.datepicker.setDefaults($.datepicker.regional['az']);
-});
\ No newline at end of file
diff --git a/resources/jquery.ui/i18n/jquery.ui.datepicker-bg.js b/resources/jquery.ui/i18n/jquery.ui.datepicker-bg.js
deleted file mode 100644 (file)
index c19d20f..0000000
+++ /dev/null
@@ -1,24 +0,0 @@
-/* Bulgarian initialisation for the jQuery UI date picker plugin. */
-/* Written by Stoyan Kyosev (http://svest.org). */
-jQuery(function($){
-    $.datepicker.regional['bg'] = {
-        closeText: 'затвори',
-        prevText: '&#x3c;назад',
-        nextText: 'напред&#x3e;',
-               nextBigText: '&#x3e;&#x3e;',
-        currentText: 'днес',
-        monthNames: ['Януари','Февруари','Март','Април','Май','Юни',
-        'Юли','Август','Септември','Октомври','Ноември','Декември'],
-        monthNamesShort: ['Яну','Фев','Мар','Апр','Май','Юни',
-        'Юли','Авг','Сеп','Окт','Нов','Дек'],
-        dayNames: ['Неделя','Понеделник','Вторник','Сряда','Четвъртък','Петък','Събота'],
-        dayNamesShort: ['Нед','Пон','Вто','Сря','Чет','Пет','Съб'],
-        dayNamesMin: ['Не','По','Вт','Ср','Че','Пе','Съ'],
-               weekHeader: 'Wk',
-        dateFormat: 'dd.mm.yy',
-               firstDay: 1,
-        isRTL: false,
-               showMonthAfterYear: false,
-               yearSuffix: ''};
-    $.datepicker.setDefaults($.datepicker.regional['bg']);
-});
diff --git a/resources/jquery.ui/i18n/jquery.ui.datepicker-bs.js b/resources/jquery.ui/i18n/jquery.ui.datepicker-bs.js
deleted file mode 100644 (file)
index d4dc8b0..0000000
+++ /dev/null
@@ -1,23 +0,0 @@
-/* Bosnian i18n for the jQuery UI date picker plugin. */
-/* Written by Kenan Konjo. */
-jQuery(function($){
-       $.datepicker.regional['bs'] = {
-               closeText: 'Zatvori', 
-               prevText: '&#x3c;', 
-               nextText: '&#x3e;', 
-               currentText: 'Danas', 
-               monthNames: ['Januar','Februar','Mart','April','Maj','Juni',
-               'Juli','August','Septembar','Oktobar','Novembar','Decembar'],
-               monthNamesShort: ['Jan','Feb','Mar','Apr','Maj','Jun',
-               'Jul','Aug','Sep','Okt','Nov','Dec'],
-               dayNames: ['Nedelja','Ponedeljak','Utorak','Srijeda','Četvrtak','Petak','Subota'],
-               dayNamesShort: ['Ned','Pon','Uto','Sri','Čet','Pet','Sub'],
-               dayNamesMin: ['Ne','Po','Ut','Sr','Če','Pe','Su'],
-               weekHeader: 'Wk',
-               dateFormat: 'dd.mm.yy',
-               firstDay: 1,
-               isRTL: false,
-               showMonthAfterYear: false,
-               yearSuffix: ''};
-       $.datepicker.setDefaults($.datepicker.regional['bs']);
-});
\ No newline at end of file
diff --git a/resources/jquery.ui/i18n/jquery.ui.datepicker-ca.js b/resources/jquery.ui/i18n/jquery.ui.datepicker-ca.js
deleted file mode 100644 (file)
index b128e69..0000000
+++ /dev/null
@@ -1,23 +0,0 @@
-/* Inicialització en català per a l'extenció 'calendar' per jQuery. */
-/* Writers: (joan.leon@gmail.com). */
-jQuery(function($){
-       $.datepicker.regional['ca'] = {
-               closeText: 'Tancar',
-               prevText: '&#x3c;Ant',
-               nextText: 'Seg&#x3e;',
-               currentText: 'Avui',
-               monthNames: ['Gener','Febrer','Mar&ccedil;','Abril','Maig','Juny',
-               'Juliol','Agost','Setembre','Octubre','Novembre','Desembre'],
-               monthNamesShort: ['Gen','Feb','Mar','Abr','Mai','Jun',
-               'Jul','Ago','Set','Oct','Nov','Des'],
-               dayNames: ['Diumenge','Dilluns','Dimarts','Dimecres','Dijous','Divendres','Dissabte'],
-               dayNamesShort: ['Dug','Dln','Dmt','Dmc','Djs','Dvn','Dsb'],
-               dayNamesMin: ['Dg','Dl','Dt','Dc','Dj','Dv','Ds'],
-               weekHeader: 'Sm',
-               dateFormat: 'dd/mm/yy',
-               firstDay: 1,
-               isRTL: false,
-               showMonthAfterYear: false,
-               yearSuffix: ''};
-       $.datepicker.setDefaults($.datepicker.regional['ca']);
-});
\ No newline at end of file
diff --git a/resources/jquery.ui/i18n/jquery.ui.datepicker-cs.js b/resources/jquery.ui/i18n/jquery.ui.datepicker-cs.js
deleted file mode 100644 (file)
index 9805bcd..0000000
+++ /dev/null
@@ -1,23 +0,0 @@
-/* Czech initialisation for the jQuery UI date picker plugin. */
-/* Written by Tomas Muller (tomas@tomas-muller.net). */
-jQuery(function($){
-       $.datepicker.regional['cs'] = {
-               closeText: 'Zavřít',
-               prevText: '&#x3c;Dříve',
-               nextText: 'Později&#x3e;',
-               currentText: 'Nyní',
-               monthNames: ['leden','únor','březen','duben','květen','červen',
-        'červenec','srpen','září','říjen','listopad','prosinec'],
-               monthNamesShort: ['led','úno','bře','dub','kvě','čer',
-               'čvc','srp','zář','říj','lis','pro'],
-               dayNames: ['neděle', 'pondělí', 'úterý', 'středa', 'čtvrtek', 'pátek', 'sobota'],
-               dayNamesShort: ['ne', 'po', 'út', 'st', 'čt', 'pá', 'so'],
-               dayNamesMin: ['ne','po','út','st','čt','pá','so'],
-               weekHeader: 'Týd',
-               dateFormat: 'dd.mm.yy',
-               firstDay: 1,
-               isRTL: false,
-               showMonthAfterYear: false,
-               yearSuffix: ''};
-       $.datepicker.setDefaults($.datepicker.regional['cs']);
-});
diff --git a/resources/jquery.ui/i18n/jquery.ui.datepicker-da.js b/resources/jquery.ui/i18n/jquery.ui.datepicker-da.js
deleted file mode 100644 (file)
index 176044e..0000000
+++ /dev/null
@@ -1,23 +0,0 @@
-/* Danish initialisation for the jQuery UI date picker plugin. */
-/* Written by Jan Christensen ( deletestuff@gmail.com). */
-jQuery(function($){
-    $.datepicker.regional['da'] = {
-               closeText: 'Luk',
-        prevText: '&#x3c;Forrige',
-               nextText: 'Næste&#x3e;',
-               currentText: 'Idag',
-        monthNames: ['Januar','Februar','Marts','April','Maj','Juni',
-        'Juli','August','September','Oktober','November','December'],
-        monthNamesShort: ['Jan','Feb','Mar','Apr','Maj','Jun',
-        'Jul','Aug','Sep','Okt','Nov','Dec'],
-               dayNames: ['Søndag','Mandag','Tirsdag','Onsdag','Torsdag','Fredag','Lørdag'],
-               dayNamesShort: ['Søn','Man','Tir','Ons','Tor','Fre','Lør'],
-               dayNamesMin: ['Sø','Ma','Ti','On','To','Fr','Lø'],
-               weekHeader: 'Uge',
-        dateFormat: 'dd-mm-yy',
-               firstDay: 1,
-               isRTL: false,
-               showMonthAfterYear: false,
-               yearSuffix: ''};
-    $.datepicker.setDefaults($.datepicker.regional['da']);
-});
diff --git a/resources/jquery.ui/i18n/jquery.ui.datepicker-de.js b/resources/jquery.ui/i18n/jquery.ui.datepicker-de.js
deleted file mode 100644 (file)
index f3ef9e8..0000000
+++ /dev/null
@@ -1,23 +0,0 @@
-/* German initialisation for the jQuery UI date picker plugin. */
-/* Written by Milian Wolff (mail@milianw.de). */
-jQuery(function($){
-       $.datepicker.regional['de'] = {
-               closeText: 'schließen',
-               prevText: '&#x3c;zurück',
-               nextText: 'Vor&#x3e;',
-               currentText: 'heute',
-               monthNames: ['Januar','Februar','März','April','Mai','Juni',
-               'Juli','August','September','Oktober','November','Dezember'],
-               monthNamesShort: ['Jan','Feb','Mär','Apr','Mai','Jun',
-               'Jul','Aug','Sep','Okt','Nov','Dez'],
-               dayNames: ['Sonntag','Montag','Dienstag','Mittwoch','Donnerstag','Freitag','Samstag'],
-               dayNamesShort: ['So','Mo','Di','Mi','Do','Fr','Sa'],
-               dayNamesMin: ['So','Mo','Di','Mi','Do','Fr','Sa'],
-               weekHeader: 'KW',
-               dateFormat: 'dd.mm.yy',
-               firstDay: 1,
-               isRTL: false,
-               showMonthAfterYear: false,
-               yearSuffix: ''};
-       $.datepicker.setDefaults($.datepicker.regional['de']);
-});
diff --git a/resources/jquery.ui/i18n/jquery.ui.datepicker-el.js b/resources/jquery.ui/i18n/jquery.ui.datepicker-el.js
deleted file mode 100644 (file)
index 6d775f9..0000000
+++ /dev/null
@@ -1,23 +0,0 @@
-/* Greek (el) initialisation for the jQuery UI date picker plugin. */
-/* Written by Alex Cicovic (http://www.alexcicovic.com) */
-jQuery(function($){
-       $.datepicker.regional['el'] = {
-               closeText: 'Κλείσιμο',
-               prevText: 'Προηγούμενος',
-               nextText: 'Επόμενος',
-               currentText: 'Τρέχων Μήνας',
-               monthNames: ['Ιανουάριος','Φεβρουάριος','Μάρτιος','Απρίλιος','Μάιος','Ιούνιος',
-               'Ιούλιος','Αύγουστος','Σεπτέμβριος','Οκτώβριος','Νοέμβριος','Δεκέμβριος'],
-               monthNamesShort: ['Ιαν','Φεβ','Μαρ','Απρ','Μαι','Ιουν',
-               'Ιουλ','Αυγ','Σεπ','Οκτ','Νοε','Δεκ'],
-               dayNames: ['Κυριακή','Δευτέρα','Τρίτη','Τετάρτη','Πέμπτη','Παρασκευή','Σάββατο'],
-               dayNamesShort: ['Κυρ','Δευ','Τρι','Τετ','Πεμ','Παρ','Σαβ'],
-               dayNamesMin: ['Κυ','Δε','Τρ','Τε','Πε','Πα','Σα'],
-               weekHeader: 'Εβδ',
-               dateFormat: 'dd/mm/yy',
-               firstDay: 1,
-               isRTL: false,
-               showMonthAfterYear: false,
-               yearSuffix: ''};
-       $.datepicker.setDefaults($.datepicker.regional['el']);
-});
\ No newline at end of file
diff --git a/resources/jquery.ui/i18n/jquery.ui.datepicker-en-GB.js b/resources/jquery.ui/i18n/jquery.ui.datepicker-en-GB.js
deleted file mode 100644 (file)
index 16a096e..0000000
+++ /dev/null
@@ -1,23 +0,0 @@
-/* English/UK initialisation for the jQuery UI date picker plugin. */
-/* Written by Stuart. */
-jQuery(function($){
-       $.datepicker.regional['en-GB'] = {
-               closeText: 'Done',
-               prevText: 'Prev',
-               nextText: 'Next',
-               currentText: 'Today',
-               monthNames: ['January','February','March','April','May','June',
-               'July','August','September','October','November','December'],
-               monthNamesShort: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',
-               'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],
-               dayNames: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],
-               dayNamesShort: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],
-               dayNamesMin: ['Su','Mo','Tu','We','Th','Fr','Sa'],
-               weekHeader: 'Wk',
-               dateFormat: 'dd/mm/yy',
-               firstDay: 1,
-               isRTL: false,
-               showMonthAfterYear: false,
-               yearSuffix: ''};
-       $.datepicker.setDefaults($.datepicker.regional['en-GB']);
-});
diff --git a/resources/jquery.ui/i18n/jquery.ui.datepicker-eo.js b/resources/jquery.ui/i18n/jquery.ui.datepicker-eo.js
deleted file mode 100644 (file)
index 6cabc2c..0000000
+++ /dev/null
@@ -1,23 +0,0 @@
-/* Esperanto initialisation for the jQuery UI date picker plugin. */
-/* Written by Olivier M. (olivierweb@ifrance.com). */
-jQuery(function($){
-       $.datepicker.regional['eo'] = {
-               closeText: 'Fermi',
-               prevText: '&lt;Anta',
-               nextText: 'Sekv&gt;',
-               currentText: 'Nuna',
-               monthNames: ['Januaro','Februaro','Marto','Aprilo','Majo','Junio',
-               'Julio','Aŭgusto','Septembro','Oktobro','Novembro','Decembro'],
-               monthNamesShort: ['Jan','Feb','Mar','Apr','Maj','Jun',
-               'Jul','Aŭg','Sep','Okt','Nov','Dec'],
-               dayNames: ['Dimanĉo','Lundo','Mardo','Merkredo','Ĵaŭdo','Vendredo','Sabato'],
-               dayNamesShort: ['Dim','Lun','Mar','Mer','Ĵaŭ','Ven','Sab'],
-               dayNamesMin: ['Di','Lu','Ma','Me','Ĵa','Ve','Sa'],
-               weekHeader: 'Sb',
-               dateFormat: 'dd/mm/yy',
-               firstDay: 0,
-               isRTL: false,
-               showMonthAfterYear: false,
-               yearSuffix: ''};
-       $.datepicker.setDefaults($.datepicker.regional['eo']);
-});
diff --git a/resources/jquery.ui/i18n/jquery.ui.datepicker-es.js b/resources/jquery.ui/i18n/jquery.ui.datepicker-es.js
deleted file mode 100644 (file)
index a02133d..0000000
+++ /dev/null
@@ -1,23 +0,0 @@
-/* Inicialización en español para la extensión 'UI date picker' para jQuery. */
-/* Traducido por Vester (xvester@gmail.com). */
-jQuery(function($){
-       $.datepicker.regional['es'] = {
-               closeText: 'Cerrar',
-               prevText: '&#x3c;Ant',
-               nextText: 'Sig&#x3e;',
-               currentText: 'Hoy',
-               monthNames: ['Enero','Febrero','Marzo','Abril','Mayo','Junio',
-               'Julio','Agosto','Septiembre','Octubre','Noviembre','Diciembre'],
-               monthNamesShort: ['Ene','Feb','Mar','Abr','May','Jun',
-               'Jul','Ago','Sep','Oct','Nov','Dic'],
-               dayNames: ['Domingo','Lunes','Martes','Mi&eacute;rcoles','Jueves','Viernes','S&aacute;bado'],
-               dayNamesShort: ['Dom','Lun','Mar','Mi&eacute;','Juv','Vie','S&aacute;b'],
-               dayNamesMin: ['Do','Lu','Ma','Mi','Ju','Vi','S&aacute;'],
-               weekHeader: 'Sm',
-               dateFormat: 'dd/mm/yy',
-               firstDay: 1,
-               isRTL: false,
-               showMonthAfterYear: false,
-               yearSuffix: ''};
-       $.datepicker.setDefaults($.datepicker.regional['es']);
-});
\ No newline at end of file
diff --git a/resources/jquery.ui/i18n/jquery.ui.datepicker-et.js b/resources/jquery.ui/i18n/jquery.ui.datepicker-et.js
deleted file mode 100644 (file)
index 32702b2..0000000
+++ /dev/null
@@ -1,23 +0,0 @@
-/* Estonian initialisation for the jQuery UI date picker plugin. */
-/* Written by Mart Sõmermaa (mrts.pydev at gmail com). */
-jQuery(function($){
-       $.datepicker.regional['et'] = {
-               closeText: 'Sulge',
-               prevText: 'Eelnev',
-               nextText: 'Järgnev',
-               currentText: 'Täna',
-               monthNames: ['Jaanuar','Veebruar','Märts','Aprill','Mai','Juuni',
-               'Juuli','August','September','Oktoober','November','Detsember'],
-               monthNamesShort: ['Jaan', 'Veebr', 'Märts', 'Apr', 'Mai', 'Juuni',
-               'Juuli', 'Aug', 'Sept', 'Okt', 'Nov', 'Dets'],
-               dayNames: ['Pühapäev', 'Esmaspäev', 'Teisipäev', 'Kolmapäev', 'Neljapäev', 'Reede', 'Laupäev'],
-               dayNamesShort: ['Pühap', 'Esmasp', 'Teisip', 'Kolmap', 'Neljap', 'Reede', 'Laup'],
-               dayNamesMin: ['P','E','T','K','N','R','L'],
-               weekHeader: 'näd',
-               dateFormat: 'dd.mm.yy',
-               firstDay: 1,
-               isRTL: false,
-               showMonthAfterYear: false,
-               yearSuffix: ''};
-       $.datepicker.setDefaults($.datepicker.regional['et']);
-}); 
\ No newline at end of file
diff --git a/resources/jquery.ui/i18n/jquery.ui.datepicker-eu.js b/resources/jquery.ui/i18n/jquery.ui.datepicker-eu.js
deleted file mode 100644 (file)
index ff66e49..0000000
+++ /dev/null
@@ -1,23 +0,0 @@
-/* Euskarako oinarria 'UI date picker' jquery-ko extentsioarentzat */
-/* Karrikas-ek itzulia (karrikas@karrikas.com) */
-jQuery(function($){
-       $.datepicker.regional['eu'] = {
-               closeText: 'Egina',
-               prevText: '&#x3c;Aur',
-               nextText: 'Hur&#x3e;',
-               currentText: 'Gaur',
-               monthNames: ['urtarrila','otsaila','martxoa','apirila','maiatza','ekaina',
-                       'uztaila','abuztua','iraila','urria','azaroa','abendua'],
-               monthNamesShort: ['urt.','ots.','mar.','api.','mai.','eka.',
-                       'uzt.','abu.','ira.','urr.','aza.','abe.'],
-               dayNames: ['igandea','astelehena','asteartea','asteazkena','osteguna','ostirala','larunbata'],
-               dayNamesShort: ['ig.','al.','ar.','az.','og.','ol.','lr.'],
-               dayNamesMin: ['ig','al','ar','az','og','ol','lr'],
-               weekHeader: 'As',
-               dateFormat: 'yy-mm-dd',
-               firstDay: 1,
-               isRTL: false,
-               showMonthAfterYear: false,
-               yearSuffix: ''};
-       $.datepicker.setDefaults($.datepicker.regional['eu']);
-});
\ No newline at end of file
diff --git a/resources/jquery.ui/i18n/jquery.ui.datepicker-fa.js b/resources/jquery.ui/i18n/jquery.ui.datepicker-fa.js
deleted file mode 100644 (file)
index be8acd2..0000000
+++ /dev/null
@@ -1,59 +0,0 @@
-/* Persian (Farsi) Translation for the jQuery UI date picker plugin. */
-/* Javad Mowlanezhad -- jmowla@gmail.com */
-/* Jalali calendar should supported soon! (Its implemented but I have to test it) */
-jQuery(function($) {
-       $.datepicker.regional['fa'] = {
-               closeText: 'بستن',
-               prevText: '&#x3C;قبلی',
-               nextText: 'بعدی&#x3E;',
-               currentText: 'امروز',
-               monthNames: [
-                       'فروردين',
-                       'ارديبهشت',
-                       'خرداد',
-                       'تير',
-                       'مرداد',
-                       'شهريور',
-                       'مهر',
-                       'آبان',
-                       'آذر',
-                       'دی',
-                       'بهمن',
-                       'اسفند'
-               ],
-               monthNamesShort: ['1','2','3','4','5','6','7','8','9','10','11','12'],
-               dayNames: [
-                       'يکشنبه',
-                       'دوشنبه',
-                       'سه‌شنبه',
-                       'چهارشنبه',
-                       'پنجشنبه',
-                       'جمعه',
-                       'شنبه'
-               ],
-               dayNamesShort: [
-                       'ی',
-                       'د',
-                       'س',
-                       'چ',
-                       'پ',
-                       'ج', 
-                       'ش'
-               ],
-               dayNamesMin: [
-                       'ی',
-                       'د',
-                       'س',
-                       'چ',
-                       'پ',
-                       'ج', 
-                       'ش'
-               ],
-               weekHeader: 'هف',
-               dateFormat: 'yy/mm/dd',
-               firstDay: 6,
-               isRTL: true,
-               showMonthAfterYear: false,
-               yearSuffix: ''};
-       $.datepicker.setDefaults($.datepicker.regional['fa']);
-});
\ No newline at end of file
diff --git a/resources/jquery.ui/i18n/jquery.ui.datepicker-fi.js b/resources/jquery.ui/i18n/jquery.ui.datepicker-fi.js
deleted file mode 100644 (file)
index 4c5adda..0000000
+++ /dev/null
@@ -1,23 +0,0 @@
-/* Finnish initialisation for the jQuery UI date picker plugin. */
-/* Written by Harri Kilpiö (harrikilpio@gmail.com). */
-jQuery(function($){
-       $.datepicker.regional['fi'] = {
-               closeText: 'Sulje',
-               prevText: '&#xAB;Edellinen',
-               nextText: 'Seuraava&#xBB;',
-               currentText: 'T&#xE4;n&#xE4;&#xE4;n',
-               monthNames: ['Tammikuu','Helmikuu','Maaliskuu','Huhtikuu','Toukokuu','Kes&#xE4;kuu',
-               'Hein&#xE4;kuu','Elokuu','Syyskuu','Lokakuu','Marraskuu','Joulukuu'],
-               monthNamesShort: ['Tammi','Helmi','Maalis','Huhti','Touko','Kes&#xE4;',
-               'Hein&#xE4;','Elo','Syys','Loka','Marras','Joulu'],
-               dayNamesShort: ['Su','Ma','Ti','Ke','To','Pe','La'],
-               dayNames: ['Sunnuntai','Maanantai','Tiistai','Keskiviikko','Torstai','Perjantai','Lauantai'],
-               dayNamesMin: ['Su','Ma','Ti','Ke','To','Pe','La'],
-               weekHeader: 'Vk',
-               dateFormat: 'dd.mm.yy',
-               firstDay: 1,
-               isRTL: false,
-               showMonthAfterYear: false,
-               yearSuffix: ''};
-       $.datepicker.setDefaults($.datepicker.regional['fi']);
-});
diff --git a/resources/jquery.ui/i18n/jquery.ui.datepicker-fo.js b/resources/jquery.ui/i18n/jquery.ui.datepicker-fo.js
deleted file mode 100644 (file)
index 8a6cb99..0000000
+++ /dev/null
@@ -1,23 +0,0 @@
-/* Faroese initialisation for the jQuery UI date picker plugin */
-/* Written by Sverri Mohr Olsen, sverrimo@gmail.com */
-jQuery(function($){
-       $.datepicker.regional['fo'] = {
-               closeText: 'Lat aftur',
-               prevText: '&#x3c;Fyrra',
-               nextText: 'Næsta&#x3e;',
-               currentText: 'Í dag',
-               monthNames: ['Januar','Februar','Mars','Apríl','Mei','Juni',
-               'Juli','August','September','Oktober','November','Desember'],
-               monthNamesShort: ['Jan','Feb','Mar','Apr','Mei','Jun',
-               'Jul','Aug','Sep','Okt','Nov','Des'],
-               dayNames: ['Sunnudagur','Mánadagur','Týsdagur','Mikudagur','Hósdagur','Fríggjadagur','Leyardagur'],
-               dayNamesShort: ['Sun','Mán','Týs','Mik','Hós','Frí','Ley'],
-               dayNamesMin: ['Su','Má','Tý','Mi','Hó','Fr','Le'],
-               weekHeader: 'Vk',
-               dateFormat: 'dd-mm-yy',
-               firstDay: 0,
-               isRTL: false,
-               showMonthAfterYear: false,
-               yearSuffix: ''};
-       $.datepicker.setDefaults($.datepicker.regional['fo']);
-});
diff --git a/resources/jquery.ui/i18n/jquery.ui.datepicker-fr.js b/resources/jquery.ui/i18n/jquery.ui.datepicker-fr.js
deleted file mode 100644 (file)
index 7e79363..0000000
+++ /dev/null
@@ -1,25 +0,0 @@
-/* French initialisation for the jQuery UI date picker plugin. */
-/* Written by Keith Wood (kbwood{at}iinet.com.au),
-              Stéphane Nahmani (sholby@sholby.net),
-              Stéphane Raimbault <stephane.raimbault@gmail.com> */
-jQuery(function($){
-       $.datepicker.regional['fr'] = {
-               closeText: 'Fermer',
-               prevText: 'Précédent',
-               nextText: 'Suivant',
-               currentText: 'Aujourd\'hui',
-               monthNames: ['Janvier','Février','Mars','Avril','Mai','Juin',
-               'Juillet','Août','Septembre','Octobre','Novembre','Décembre'],
-               monthNamesShort: ['Janv.','Févr.','Mars','Avril','Mai','Juin',
-               'Juil.','Août','Sept.','Oct.','Nov.','Déc.'],
-               dayNames: ['Dimanche','Lundi','Mardi','Mercredi','Jeudi','Vendredi','Samedi'],
-               dayNamesShort: ['Dim.','Lun.','Mar.','Mer.','Jeu.','Ven.','Sam.'],
-               dayNamesMin: ['D','L','M','M','J','V','S'],
-               weekHeader: 'Sem.',
-               dateFormat: 'dd/mm/yy',
-               firstDay: 1,
-               isRTL: false,
-               showMonthAfterYear: false,
-               yearSuffix: ''};
-       $.datepicker.setDefaults($.datepicker.regional['fr']);
-});
diff --git a/resources/jquery.ui/i18n/jquery.ui.datepicker-gl.js b/resources/jquery.ui/i18n/jquery.ui.datepicker-gl.js
deleted file mode 100644 (file)
index 278403e..0000000
+++ /dev/null
@@ -1,23 +0,0 @@
-/* Galician localization for 'UI date picker' jQuery extension. */
-/* Translated by Jorge Barreiro <yortx.barry@gmail.com>. */
-jQuery(function($){
-       $.datepicker.regional['gl'] = {
-               closeText: 'Pechar',
-               prevText: '&#x3c;Ant',
-               nextText: 'Seg&#x3e;',
-               currentText: 'Hoxe',
-               monthNames: ['Xaneiro','Febreiro','Marzo','Abril','Maio','Xuño',
-               'Xullo','Agosto','Setembro','Outubro','Novembro','Decembro'],
-               monthNamesShort: ['Xan','Feb','Mar','Abr','Mai','Xuñ',
-               'Xul','Ago','Set','Out','Nov','Dec'],
-               dayNames: ['Domingo','Luns','Martes','M&eacute;rcores','Xoves','Venres','S&aacute;bado'],
-               dayNamesShort: ['Dom','Lun','Mar','M&eacute;r','Xov','Ven','S&aacute;b'],
-               dayNamesMin: ['Do','Lu','Ma','M&eacute;','Xo','Ve','S&aacute;'],
-               weekHeader: 'Sm',
-               dateFormat: 'dd/mm/yy',
-               firstDay: 1,
-               isRTL: false,
-               showMonthAfterYear: false,
-               yearSuffix: ''};
-       $.datepicker.setDefaults($.datepicker.regional['gl']);
-});
\ No newline at end of file
diff --git a/resources/jquery.ui/i18n/jquery.ui.datepicker-he.js b/resources/jquery.ui/i18n/jquery.ui.datepicker-he.js
deleted file mode 100644 (file)
index 135cdec..0000000
+++ /dev/null
@@ -1,23 +0,0 @@
-/* Hebrew initialisation for the UI Datepicker extension. */
-/* Written by Amir Hardon (ahardon at gmail dot com). */
-jQuery(function($){
-       $.datepicker.regional['he'] = {
-               closeText: 'סגור',
-               prevText: '&#x3c;הקודם',
-               nextText: 'הבא&#x3e;',
-               currentText: 'היום',
-               monthNames: ['ינואר','פברואר','מרץ','אפריל','מאי','יוני',
-               'יולי','אוגוסט','ספטמבר','אוקטובר','נובמבר','דצמבר'],
-               monthNamesShort: ['ינו','פבר','מרץ','אפר','מאי','יוני',
-               'יולי','אוג','ספט','אוק','נוב','דצמ'],
-               dayNames: ['ראשון','שני','שלישי','רביעי','חמישי','שישי','שבת'],
-               dayNamesShort: ['א\'','ב\'','ג\'','ד\'','ה\'','ו\'','שבת'],
-               dayNamesMin: ['א\'','ב\'','ג\'','ד\'','ה\'','ו\'','שבת'],
-               weekHeader: 'Wk',
-               dateFormat: 'dd/mm/yy',
-               firstDay: 0,
-               isRTL: true,
-               showMonthAfterYear: false,
-               yearSuffix: ''};
-       $.datepicker.setDefaults($.datepicker.regional['he']);
-});
diff --git a/resources/jquery.ui/i18n/jquery.ui.datepicker-hi.js b/resources/jquery.ui/i18n/jquery.ui.datepicker-hi.js
deleted file mode 100644 (file)
index 6c563b9..0000000
+++ /dev/null
@@ -1,23 +0,0 @@
-/* Hindi initialisation for the jQuery UI date picker plugin. */
-/* Written by Michael Dawart. */
-jQuery(function($){
-       $.datepicker.regional['hi'] = {
-               closeText: 'बंद',
-               prevText: 'पिछला',
-               nextText: 'अगला',
-               currentText: 'आज',
-               monthNames: ['जनवरी ','फरवरी','मार्च','अप्रेल','मई','जून',
-               'जूलाई','अगस्त ','सितम्बर','अक्टूबर','नवम्बर','दिसम्बर'],
-               monthNamesShort: ['जन', 'फर', 'मार्च', 'अप्रेल', 'मई', 'जून',
-               'जूलाई', 'अग', 'सित', 'अक्ट', 'नव', 'दि'],
-               dayNames: ['रविवार', 'सोमवार', 'मंगलवार', 'बुधवार', 'गुरुवार', 'शुक्रवार', 'शनिवार'],
-               dayNamesShort: ['रवि', 'सोम', 'मंगल', 'बुध', 'गुरु', 'शुक्र', 'शनि'],
-               dayNamesMin: ['रवि', 'सोम', 'मंगल', 'बुध', 'गुरु', 'शुक्र', 'शनि'],
-               weekHeader: 'हफ्ता',
-               dateFormat: 'dd/mm/yy',
-               firstDay: 1,
-               isRTL: false,
-               showMonthAfterYear: false,
-               yearSuffix: ''};
-       $.datepicker.setDefaults($.datepicker.regional['hi']);
-});
diff --git a/resources/jquery.ui/i18n/jquery.ui.datepicker-hr.js b/resources/jquery.ui/i18n/jquery.ui.datepicker-hr.js
deleted file mode 100644 (file)
index 1eb3dd9..0000000
+++ /dev/null
@@ -1,23 +0,0 @@
-/* Croatian i18n for the jQuery UI date picker plugin. */
-/* Written by Vjekoslav Nesek. */
-jQuery(function($){
-       $.datepicker.regional['hr'] = {
-               closeText: 'Zatvori',
-               prevText: '&#x3c;',
-               nextText: '&#x3e;',
-               currentText: 'Danas',
-               monthNames: ['Siječanj','Veljača','Ožujak','Travanj','Svibanj','Lipanj',
-               'Srpanj','Kolovoz','Rujan','Listopad','Studeni','Prosinac'],
-               monthNamesShort: ['Sij','Velj','Ožu','Tra','Svi','Lip',
-               'Srp','Kol','Ruj','Lis','Stu','Pro'],
-               dayNames: ['Nedjelja','Ponedjeljak','Utorak','Srijeda','Četvrtak','Petak','Subota'],
-               dayNamesShort: ['Ned','Pon','Uto','Sri','Čet','Pet','Sub'],
-               dayNamesMin: ['Ne','Po','Ut','Sr','Če','Pe','Su'],
-               weekHeader: 'Tje',
-               dateFormat: 'dd.mm.yy.',
-               firstDay: 1,
-               isRTL: false,
-               showMonthAfterYear: false,
-               yearSuffix: ''};
-       $.datepicker.setDefaults($.datepicker.regional['hr']);
-});
\ No newline at end of file
diff --git a/resources/jquery.ui/i18n/jquery.ui.datepicker-hu.js b/resources/jquery.ui/i18n/jquery.ui.datepicker-hu.js
deleted file mode 100644 (file)
index b28c268..0000000
+++ /dev/null
@@ -1,23 +0,0 @@
-/* Hungarian initialisation for the jQuery UI date picker plugin. */
-/* Written by Istvan Karaszi (jquery@spam.raszi.hu). */
-jQuery(function($){
-       $.datepicker.regional['hu'] = {
-               closeText: 'bezár',
-               prevText: 'vissza',
-               nextText: 'előre',
-               currentText: 'ma',
-               monthNames: ['Január', 'Február', 'Március', 'Április', 'Május', 'Június',
-               'Július', 'Augusztus', 'Szeptember', 'Október', 'November', 'December'],
-               monthNamesShort: ['Jan', 'Feb', 'Már', 'Ápr', 'Máj', 'Jún',
-               'Júl', 'Aug', 'Szep', 'Okt', 'Nov', 'Dec'],
-               dayNames: ['Vasárnap', 'Hétfő', 'Kedd', 'Szerda', 'Csütörtök', 'Péntek', 'Szombat'],
-               dayNamesShort: ['Vas', 'Hét', 'Ked', 'Sze', 'Csü', 'Pén', 'Szo'],
-               dayNamesMin: ['V', 'H', 'K', 'Sze', 'Cs', 'P', 'Szo'],
-               weekHeader: 'Hét',
-               dateFormat: 'yy.mm.dd.',
-               firstDay: 1,
-               isRTL: false,
-               showMonthAfterYear: true,
-               yearSuffix: ''};
-       $.datepicker.setDefaults($.datepicker.regional['hu']);
-});
diff --git a/resources/jquery.ui/i18n/jquery.ui.datepicker-hy.js b/resources/jquery.ui/i18n/jquery.ui.datepicker-hy.js
deleted file mode 100644 (file)
index c6cc194..0000000
+++ /dev/null
@@ -1,23 +0,0 @@
-/* Armenian(UTF-8) initialisation for the jQuery UI date picker plugin. */
-/* Written by Levon Zakaryan (levon.zakaryan@gmail.com)*/
-jQuery(function($){
-       $.datepicker.regional['hy'] = {
-               closeText: 'Փակել',
-               prevText: '&#x3c;Նախ.',
-               nextText: 'Հաջ.&#x3e;',
-               currentText: 'Այսօր',
-               monthNames: ['Հունվար','Փետրվար','Մարտ','Ապրիլ','Մայիս','Հունիս',
-               'Հուլիս','Օգոստոս','Սեպտեմբեր','Հոկտեմբեր','Նոյեմբեր','Դեկտեմբեր'],
-               monthNamesShort: ['Հունվ','Փետր','Մարտ','Ապր','Մայիս','Հունիս',
-               'Հուլ','Օգս','Սեպ','Հոկ','Նոյ','Դեկ'],
-               dayNames: ['կիրակի','եկուշաբթի','երեքշաբթի','չորեքշաբթի','հինգշաբթի','ուրբաթ','շաբաթ'],
-               dayNamesShort: ['կիր','երկ','երք','չրք','հնգ','ուրբ','շբթ'],
-               dayNamesMin: ['կիր','երկ','երք','չրք','հնգ','ուրբ','շբթ'],
-               weekHeader: 'ՇԲՏ',
-               dateFormat: 'dd.mm.yy',
-               firstDay: 1,
-               isRTL: false,
-               showMonthAfterYear: false,
-               yearSuffix: ''};
-       $.datepicker.setDefaults($.datepicker.regional['hy']);
-});
\ No newline at end of file
diff --git a/resources/jquery.ui/i18n/jquery.ui.datepicker-id.js b/resources/jquery.ui/i18n/jquery.ui.datepicker-id.js
deleted file mode 100644 (file)
index c626fbb..0000000
+++ /dev/null
@@ -1,23 +0,0 @@
-/* Indonesian initialisation for the jQuery UI date picker plugin. */
-/* Written by Deden Fathurahman (dedenf@gmail.com). */
-jQuery(function($){
-       $.datepicker.regional['id'] = {
-               closeText: 'Tutup',
-               prevText: '&#x3c;mundur',
-               nextText: 'maju&#x3e;',
-               currentText: 'hari ini',
-               monthNames: ['Januari','Februari','Maret','April','Mei','Juni',
-               'Juli','Agustus','September','Oktober','Nopember','Desember'],
-               monthNamesShort: ['Jan','Feb','Mar','Apr','Mei','Jun',
-               'Jul','Agus','Sep','Okt','Nop','Des'],
-               dayNames: ['Minggu','Senin','Selasa','Rabu','Kamis','Jumat','Sabtu'],
-               dayNamesShort: ['Min','Sen','Sel','Rab','kam','Jum','Sab'],
-               dayNamesMin: ['Mg','Sn','Sl','Rb','Km','jm','Sb'],
-               weekHeader: 'Mg',
-               dateFormat: 'dd/mm/yy',
-               firstDay: 0,
-               isRTL: false,
-               showMonthAfterYear: false,
-               yearSuffix: ''};
-       $.datepicker.setDefaults($.datepicker.regional['id']);
-});
\ No newline at end of file
diff --git a/resources/jquery.ui/i18n/jquery.ui.datepicker-is.js b/resources/jquery.ui/i18n/jquery.ui.datepicker-is.js
deleted file mode 100644 (file)
index c53235a..0000000
+++ /dev/null
@@ -1,23 +0,0 @@
-/* Icelandic initialisation for the jQuery UI date picker plugin. */
-/* Written by Haukur H. Thorsson (haukur@eskill.is). */
-jQuery(function($){
-       $.datepicker.regional['is'] = {
-               closeText: 'Loka',
-               prevText: '&#x3c; Fyrri',
-               nextText: 'N&aelig;sti &#x3e;',
-               currentText: '&Iacute; dag',
-               monthNames: ['Jan&uacute;ar','Febr&uacute;ar','Mars','Apr&iacute;l','Ma&iacute','J&uacute;n&iacute;',
-               'J&uacute;l&iacute;','&Aacute;g&uacute;st','September','Okt&oacute;ber','N&oacute;vember','Desember'],
-               monthNamesShort: ['Jan','Feb','Mar','Apr','Ma&iacute;','J&uacute;n',
-               'J&uacute;l','&Aacute;g&uacute;','Sep','Okt','N&oacute;v','Des'],
-               dayNames: ['Sunnudagur','M&aacute;nudagur','&THORN;ri&eth;judagur','Mi&eth;vikudagur','Fimmtudagur','F&ouml;studagur','Laugardagur'],
-               dayNamesShort: ['Sun','M&aacute;n','&THORN;ri','Mi&eth;','Fim','F&ouml;s','Lau'],
-               dayNamesMin: ['Su','M&aacute;','&THORN;r','Mi','Fi','F&ouml;','La'],
-               weekHeader: 'Vika',
-               dateFormat: 'dd/mm/yy',
-               firstDay: 0,
-               isRTL: false,
-               showMonthAfterYear: false,
-               yearSuffix: ''};
-       $.datepicker.setDefaults($.datepicker.regional['is']);
-});
\ No newline at end of file
diff --git a/resources/jquery.ui/i18n/jquery.ui.datepicker-it.js b/resources/jquery.ui/i18n/jquery.ui.datepicker-it.js
deleted file mode 100644 (file)
index 59da2df..0000000
+++ /dev/null
@@ -1,23 +0,0 @@
-/* Italian initialisation for the jQuery UI date picker plugin. */
-/* Written by Antonello Pasella (antonello.pasella@gmail.com). */
-jQuery(function($){
-       $.datepicker.regional['it'] = {
-               closeText: 'Chiudi',
-               prevText: '&#x3c;Prec',
-               nextText: 'Succ&#x3e;',
-               currentText: 'Oggi',
-               monthNames: ['Gennaio','Febbraio','Marzo','Aprile','Maggio','Giugno',
-                       'Luglio','Agosto','Settembre','Ottobre','Novembre','Dicembre'],
-               monthNamesShort: ['Gen','Feb','Mar','Apr','Mag','Giu',
-                       'Lug','Ago','Set','Ott','Nov','Dic'],
-               dayNames: ['Domenica','Luned&#236','Marted&#236','Mercoled&#236','Gioved&#236','Venerd&#236','Sabato'],
-               dayNamesShort: ['Dom','Lun','Mar','Mer','Gio','Ven','Sab'],
-               dayNamesMin: ['Do','Lu','Ma','Me','Gi','Ve','Sa'],
-               weekHeader: 'Sm',
-               dateFormat: 'dd/mm/yy',
-               firstDay: 1,
-               isRTL: false,
-               showMonthAfterYear: false,
-               yearSuffix: ''};
-       $.datepicker.setDefaults($.datepicker.regional['it']);
-});
diff --git a/resources/jquery.ui/i18n/jquery.ui.datepicker-ja.js b/resources/jquery.ui/i18n/jquery.ui.datepicker-ja.js
deleted file mode 100644 (file)
index 7eb4268..0000000
+++ /dev/null
@@ -1,23 +0,0 @@
-/* Japanese initialisation for the jQuery UI date picker plugin. */
-/* Written by Kentaro SATO (kentaro@ranvis.com). */
-jQuery(function($){
-       $.datepicker.regional['ja'] = {
-               closeText: '閉じる',
-               prevText: '&#x3c;前',
-               nextText: '次&#x3e;',
-               currentText: '今日',
-               monthNames: ['1月','2月','3月','4月','5月','6月',
-               '7月','8月','9月','10月','11月','12月'],
-               monthNamesShort: ['1月','2月','3月','4月','5月','6月',
-               '7月','8月','9月','10月','11月','12月'],
-               dayNames: ['日曜日','月曜日','火曜日','水曜日','木曜日','金曜日','土曜日'],
-               dayNamesShort: ['日','月','火','水','木','金','土'],
-               dayNamesMin: ['日','月','火','水','木','金','土'],
-               weekHeader: '週',
-               dateFormat: 'yy/mm/dd',
-               firstDay: 0,
-               isRTL: false,
-               showMonthAfterYear: true,
-               yearSuffix: '年'};
-       $.datepicker.setDefaults($.datepicker.regional['ja']);
-});
\ No newline at end of file
diff --git a/resources/jquery.ui/i18n/jquery.ui.datepicker-ka.js b/resources/jquery.ui/i18n/jquery.ui.datepicker-ka.js
deleted file mode 100644 (file)
index c10658d..0000000
+++ /dev/null
@@ -1,21 +0,0 @@
-/* Georgian (UTF-8) initialisation for the jQuery UI date picker plugin. */
-/* Written by Lado Lomidze (lado.lomidze@gmail.com). */
-jQuery(function($){
-       $.datepicker.regional['ka'] = {
-               closeText: 'დახურვა',
-               prevText: '&#x3c; წინა',
-               nextText: 'შემდეგი &#x3e;',
-               currentText: 'დღეს',
-               monthNames: ['იანვარი','თებერვალი','მარტი','აპრილი','მაისი','ივნისი', 'ივლისი','აგვისტო','სექტემბერი','ოქტომბერი','ნოემბერი','დეკემბერი'],
-               monthNamesShort: ['იან','თებ','მარ','აპრ','მაი','ივნ', 'ივლ','აგვ','სექ','ოქტ','ნოე','დეკ'],
-               dayNames: ['კვირა','ორშაბათი','სამშაბათი','ოთხშაბათი','ხუთშაბათი','პარასკევი','შაბათი'],
-               dayNamesShort: ['კვ','ორშ','სამ','ოთხ','ხუთ','პარ','შაბ'],
-               dayNamesMin: ['კვ','ორშ','სამ','ოთხ','ხუთ','პარ','შაბ'],
-               weekHeader: 'კვირა',
-               dateFormat: 'dd-mm-yy',
-               firstDay: 1,
-               isRTL: false,
-               showMonthAfterYear: false,
-               yearSuffix: ''};
-       $.datepicker.setDefaults($.datepicker.regional['ka']);
-});
diff --git a/resources/jquery.ui/i18n/jquery.ui.datepicker-kk.js b/resources/jquery.ui/i18n/jquery.ui.datepicker-kk.js
deleted file mode 100644 (file)
index 79e3f24..0000000
+++ /dev/null
@@ -1,23 +0,0 @@
-/* Kazakh (UTF-8) initialisation for the jQuery UI date picker plugin. */
-/* Written by Dmitriy Karasyov (dmitriy.karasyov@gmail.com). */
-jQuery(function($){
-       $.datepicker.regional['kk'] = {
-               closeText: 'Жабу',
-               prevText: '&#x3c;Алдыңғы',
-               nextText: 'Келесі&#x3e;',
-               currentText: 'Бүгін',
-               monthNames: ['Қаңтар','Ақпан','Наурыз','Сәуір','Мамыр','Маусым',
-               'Шілде','Тамыз','Қыркүйек','Қазан','Қараша','Желтоқсан'],
-               monthNamesShort: ['Қаң','Ақп','Нау','Сәу','Мам','Мау',
-               'Шіл','Там','Қыр','Қаз','Қар','Жел'],
-               dayNames: ['Жексенбі','Дүйсенбі','Сейсенбі','Сәрсенбі','Бейсенбі','Жұма','Сенбі'],
-               dayNamesShort: ['жкс','дсн','ссн','срс','бсн','жма','снб'],
-               dayNamesMin: ['Жк','Дс','Сс','Ср','Бс','Жм','Сн'],
-               weekHeader: 'Не',
-               dateFormat: 'dd.mm.yy',
-               firstDay: 1,
-               isRTL: false,
-               showMonthAfterYear: false,
-               yearSuffix: ''};
-       $.datepicker.setDefaults($.datepicker.regional['kk']);
-});
diff --git a/resources/jquery.ui/i18n/jquery.ui.datepicker-km.js b/resources/jquery.ui/i18n/jquery.ui.datepicker-km.js
deleted file mode 100644 (file)
index f9c4e3a..0000000
+++ /dev/null
@@ -1,23 +0,0 @@
-/* Khmer initialisation for the jQuery calendar extension. */
-/* Written by Chandara Om (chandara.teacher@gmail.com). */
-jQuery(function($){
-       $.datepicker.regional['km'] = {
-               closeText: 'ធ្វើ​រួច',
-               prevText: 'មុន',
-               nextText: 'បន្ទាប់',
-               currentText: 'ថ្ងៃ​នេះ',
-               monthNames: ['មករា','កុម្ភៈ','មីនា','មេសា','ឧសភា','មិថុនា',
-               'កក្កដា','សីហា','កញ្ញា','តុលា','វិច្ឆិកា','ធ្នូ'],
-               monthNamesShort: ['មករា','កុម្ភៈ','មីនា','មេសា','ឧសភា','មិថុនា',
-               'កក្កដា','សីហា','កញ្ញា','តុលា','វិច្ឆិកា','ធ្នូ'],
-               dayNames: ['អាទិត្យ', 'ចន្ទ', 'អង្គារ', 'ពុធ', 'ព្រហស្បតិ៍', 'សុក្រ', 'សៅរ៍'],
-               dayNamesShort: ['អា', 'ច', 'អ', 'ពុ', 'ព្រហ', 'សុ', 'សៅ'],
-               dayNamesMin: ['អា', 'ច', 'អ', 'ពុ', 'ព្រហ', 'សុ', 'សៅ'],
-               weekHeader: 'សប្ដាហ៍',
-               dateFormat: 'dd-mm-yy',
-               firstDay: 1,
-               isRTL: false,
-               showMonthAfterYear: false,
-               yearSuffix: ''};
-       $.datepicker.setDefaults($.datepicker.regional['km']);
-});
diff --git a/resources/jquery.ui/i18n/jquery.ui.datepicker-ko.js b/resources/jquery.ui/i18n/jquery.ui.datepicker-ko.js
deleted file mode 100644 (file)
index 0411242..0000000
+++ /dev/null
@@ -1,23 +0,0 @@
-/* Korean initialisation for the jQuery calendar extension. */
-/* Written by DaeKwon Kang (ncrash.dk@gmail.com), Edited by Genie. */
-jQuery(function($){
-       $.datepicker.regional['ko'] = {
-               closeText: '닫기',
-               prevText: '이전달',
-               nextText: '다음달',
-               currentText: '오늘',
-               monthNames: ['1월','2월','3월','4월','5월','6월',
-               '7월','8월','9월','10월','11월','12월'],
-               monthNamesShort: ['1월','2월','3월','4월','5월','6월',
-               '7월','8월','9월','10월','11월','12월'],
-               dayNames: ['일요일','월요일','화요일','수요일','목요일','금요일','토요일'],
-               dayNamesShort: ['일','월','화','수','목','금','토'],
-               dayNamesMin: ['일','월','화','수','목','금','토'],
-               weekHeader: 'Wk',
-               dateFormat: 'yy-mm-dd',
-               firstDay: 0,
-               isRTL: false,
-               showMonthAfterYear: true,
-               yearSuffix: '년'};
-       $.datepicker.setDefaults($.datepicker.regional['ko']);
-});
\ No newline at end of file
diff --git a/resources/jquery.ui/i18n/jquery.ui.datepicker-lb.js b/resources/jquery.ui/i18n/jquery.ui.datepicker-lb.js
deleted file mode 100644 (file)
index 87c79d5..0000000
+++ /dev/null
@@ -1,23 +0,0 @@
-/* Luxembourgish initialisation for the jQuery UI date picker plugin. */
-/* Written by Michel Weimerskirch <michel@weimerskirch.net> */
-jQuery(function($){
-       $.datepicker.regional['lb'] = {
-               closeText: 'Fäerdeg',
-               prevText: 'Zréck',
-               nextText: 'Weider',
-               currentText: 'Haut',
-               monthNames: ['Januar','Februar','Mäerz','Abrëll','Mee','Juni',
-               'Juli','August','September','Oktober','November','Dezember'],
-               monthNamesShort: ['Jan', 'Feb', 'Mäe', 'Abr', 'Mee', 'Jun',
-               'Jul', 'Aug', 'Sep', 'Okt', 'Nov', 'Dez'],
-               dayNames: ['Sonndeg', 'Méindeg', 'Dënschdeg', 'Mëttwoch', 'Donneschdeg', 'Freideg', 'Samschdeg'],
-               dayNamesShort: ['Son', 'Méi', 'Dën', 'Mët', 'Don', 'Fre', 'Sam'],
-               dayNamesMin: ['So','Mé','Dë','Më','Do','Fr','Sa'],
-               weekHeader: 'W',
-               dateFormat: 'dd.mm.yy',
-               firstDay: 1,
-               isRTL: false,
-               showMonthAfterYear: false,
-               yearSuffix: ''};
-       $.datepicker.setDefaults($.datepicker.regional['lb']);
-});
diff --git a/resources/jquery.ui/i18n/jquery.ui.datepicker-lt.js b/resources/jquery.ui/i18n/jquery.ui.datepicker-lt.js
deleted file mode 100644 (file)
index 67d5119..0000000
+++ /dev/null
@@ -1,23 +0,0 @@
-/* Lithuanian (UTF-8) initialisation for the jQuery UI date picker plugin. */
-/* @author Arturas Paleicikas <arturas@avalon.lt> */
-jQuery(function($){
-       $.datepicker.regional['lt'] = {
-               closeText: 'Uždaryti',
-               prevText: '&#x3c;Atgal',
-               nextText: 'Pirmyn&#x3e;',
-               currentText: 'Šiandien',
-               monthNames: ['Sausis','Vasaris','Kovas','Balandis','Gegužė','Birželis',
-               'Liepa','Rugpjūtis','Rugsėjis','Spalis','Lapkritis','Gruodis'],
-               monthNamesShort: ['Sau','Vas','Kov','Bal','Geg','Bir',
-               'Lie','Rugp','Rugs','Spa','Lap','Gru'],
-               dayNames: ['sekmadienis','pirmadienis','antradienis','trečiadienis','ketvirtadienis','penktadienis','šeštadienis'],
-               dayNamesShort: ['sek','pir','ant','tre','ket','pen','šeš'],
-               dayNamesMin: ['Se','Pr','An','Tr','Ke','Pe','Še'],
-               weekHeader: 'Wk',
-               dateFormat: 'yy-mm-dd',
-               firstDay: 1,
-               isRTL: false,
-               showMonthAfterYear: false,
-               yearSuffix: ''};
-       $.datepicker.setDefaults($.datepicker.regional['lt']);
-});
\ No newline at end of file
diff --git a/resources/jquery.ui/i18n/jquery.ui.datepicker-lv.js b/resources/jquery.ui/i18n/jquery.ui.datepicker-lv.js
deleted file mode 100644 (file)
index 003934e..0000000
+++ /dev/null
@@ -1,23 +0,0 @@
-/* Latvian (UTF-8) initialisation for the jQuery UI date picker plugin. */
-/* @author Arturas Paleicikas <arturas.paleicikas@metasite.net> */
-jQuery(function($){
-       $.datepicker.regional['lv'] = {
-               closeText: 'Aizvērt',
-               prevText: 'Iepr',
-               nextText: 'Nāka',
-               currentText: 'Šodien',
-               monthNames: ['Janvāris','Februāris','Marts','Aprīlis','Maijs','Jūnijs',
-               'Jūlijs','Augusts','Septembris','Oktobris','Novembris','Decembris'],
-               monthNamesShort: ['Jan','Feb','Mar','Apr','Mai','Jūn',
-               'Jūl','Aug','Sep','Okt','Nov','Dec'],
-               dayNames: ['svētdiena','pirmdiena','otrdiena','trešdiena','ceturtdiena','piektdiena','sestdiena'],
-               dayNamesShort: ['svt','prm','otr','tre','ctr','pkt','sst'],
-               dayNamesMin: ['Sv','Pr','Ot','Tr','Ct','Pk','Ss'],
-               weekHeader: 'Nav',
-               dateFormat: 'dd-mm-yy',
-               firstDay: 1,
-               isRTL: false,
-               showMonthAfterYear: false,
-               yearSuffix: ''};
-       $.datepicker.setDefaults($.datepicker.regional['lv']);
-});
\ No newline at end of file
diff --git a/resources/jquery.ui/i18n/jquery.ui.datepicker-mk.js b/resources/jquery.ui/i18n/jquery.ui.datepicker-mk.js
deleted file mode 100644 (file)
index 0285325..0000000
+++ /dev/null
@@ -1,23 +0,0 @@
-/* Macedonian i18n for the jQuery UI date picker plugin. */
-/* Written by Stojce Slavkovski. */
-jQuery(function($){
-       $.datepicker.regional['mk'] = {
-               closeText: 'Затвори',
-               prevText: '&#x3C;',
-               nextText: '&#x3E;',
-               currentText: 'Денес',
-               monthNames: ['Јануари','Февруари','Март','Април','Мај','Јуни',
-               'Јули','Август','Септември','Октомври','Ноември','Декември'],
-               monthNamesShort: ['Јан','Фев','Мар','Апр','Мај','Јун',
-               'Јул','Авг','Сеп','Окт','Ное','Дек'],
-               dayNames: ['Недела','Понеделник','Вторник','Среда','Четврток','Петок','Сабота'],
-               dayNamesShort: ['Нед','Пон','Вто','Сре','Чет','Пет','Саб'],
-               dayNamesMin: ['Не','По','Вт','Ср','Че','Пе','Са'],
-               weekHeader: 'Сед',
-               dateFormat: 'dd.mm.yy',
-               firstDay: 1,
-               isRTL: false,
-               showMonthAfterYear: false,
-               yearSuffix: ''};
-       $.datepicker.setDefaults($.datepicker.regional['mk']);
-});
diff --git a/resources/jquery.ui/i18n/jquery.ui.datepicker-ml.js b/resources/jquery.ui/i18n/jquery.ui.datepicker-ml.js
deleted file mode 100644 (file)
index 1e3432c..0000000
+++ /dev/null
@@ -1,23 +0,0 @@
-/* Malayalam (UTF-8) initialisation for the jQuery UI date picker plugin. */
-/* Written by Saji Nediyanchath (saji89@gmail.com). */
-jQuery(function($){
-       $.datepicker.regional['ml'] = {
-               closeText: 'ശരി',
-               prevText: 'മുന്നത്തെ',  
-               nextText: 'അടുത്തത് ',
-               currentText: 'ഇന്ന്',
-               monthNames: ['ജനുവരി','ഫെബ്രുവരി','മാര്‍ച്ച്','ഏപ്രില്‍','മേയ്','ജൂണ്‍',
-               'ജൂലൈ','ആഗസ്റ്റ്','സെപ്റ്റംബര്‍','ഒക്ടോബര്‍','നവംബര്‍','ഡിസംബര്‍'],
-               monthNamesShort: ['ജനു', 'ഫെബ്', 'മാര്‍', 'ഏപ്രി', 'മേയ്', 'ജൂണ്‍',
-               'ജൂലാ', 'ആഗ', 'സെപ്', 'ഒക്ടോ', 'നവം', 'ഡിസ'],
-               dayNames: ['ഞായര്‍', 'തിങ്കള്‍', 'ചൊവ്വ', 'ബുധന്‍', 'വ്യാഴം', 'വെള്ളി', 'ശനി'],
-               dayNamesShort: ['ഞായ', 'തിങ്ക', 'ചൊവ്വ', 'ബുധ', 'വ്യാഴം', 'വെള്ളി', 'ശനി'],
-               dayNamesMin: ['ഞാ','തി','ചൊ','ബു','വ്യാ','വെ','ശ'],
-               weekHeader: 'ആ',
-               dateFormat: 'dd/mm/yy',
-               firstDay: 1,
-               isRTL: false,
-               showMonthAfterYear: false,
-               yearSuffix: ''};
-       $.datepicker.setDefaults($.datepicker.regional['ml']);
-});
diff --git a/resources/jquery.ui/i18n/jquery.ui.datepicker-ms.js b/resources/jquery.ui/i18n/jquery.ui.datepicker-ms.js
deleted file mode 100644 (file)
index e953ac0..0000000
+++ /dev/null
@@ -1,23 +0,0 @@
-/* Malaysian initialisation for the jQuery UI date picker plugin. */
-/* Written by Mohd Nawawi Mohamad Jamili (nawawi@ronggeng.net). */
-jQuery(function($){
-       $.datepicker.regional['ms'] = {
-               closeText: 'Tutup',
-               prevText: '&#x3c;Sebelum',
-               nextText: 'Selepas&#x3e;',
-               currentText: 'hari ini',
-               monthNames: ['Januari','Februari','Mac','April','Mei','Jun',
-               'Julai','Ogos','September','Oktober','November','Disember'],
-               monthNamesShort: ['Jan','Feb','Mac','Apr','Mei','Jun',
-               'Jul','Ogo','Sep','Okt','Nov','Dis'],
-               dayNames: ['Ahad','Isnin','Selasa','Rabu','Khamis','Jumaat','Sabtu'],
-               dayNamesShort: ['Aha','Isn','Sel','Rab','kha','Jum','Sab'],
-               dayNamesMin: ['Ah','Is','Se','Ra','Kh','Ju','Sa'],
-               weekHeader: 'Mg',
-               dateFormat: 'dd/mm/yy',
-               firstDay: 0,
-               isRTL: false,
-               showMonthAfterYear: false,
-               yearSuffix: ''};
-       $.datepicker.setDefaults($.datepicker.regional['ms']);
-});
\ No newline at end of file
diff --git a/resources/jquery.ui/i18n/jquery.ui.datepicker-nl.js b/resources/jquery.ui/i18n/jquery.ui.datepicker-nl.js
deleted file mode 100644 (file)
index 781fe61..0000000
+++ /dev/null
@@ -1,23 +0,0 @@
-/* Dutch (UTF-8) initialisation for the jQuery UI date picker plugin. */
-/* Written by Mathias Bynens <http://mathiasbynens.be/> */
-jQuery(function($){
-       $.datepicker.regional.nl = {
-               closeText: 'Sluiten',
-               prevText: '←',
-               nextText: '→',
-               currentText: 'Vandaag',
-               monthNames: ['januari', 'februari', 'maart', 'april', 'mei', 'juni',
-               'juli', 'augustus', 'september', 'oktober', 'november', 'december'],
-               monthNamesShort: ['jan', 'feb', 'mrt', 'apr', 'mei', 'jun',
-               'jul', 'aug', 'sep', 'okt', 'nov', 'dec'],
-               dayNames: ['zondag', 'maandag', 'dinsdag', 'woensdag', 'donderdag', 'vrijdag', 'zaterdag'],
-               dayNamesShort: ['zon', 'maa', 'din', 'woe', 'don', 'vri', 'zat'],
-               dayNamesMin: ['zo', 'ma', 'di', 'wo', 'do', 'vr', 'za'],
-               weekHeader: 'Wk',
-               dateFormat: 'dd-mm-yy',
-               firstDay: 1,
-               isRTL: false,
-               showMonthAfterYear: false,
-               yearSuffix: ''};
-       $.datepicker.setDefaults($.datepicker.regional.nl);
-});
\ No newline at end of file
diff --git a/resources/jquery.ui/i18n/jquery.ui.datepicker-no.js b/resources/jquery.ui/i18n/jquery.ui.datepicker-no.js
deleted file mode 100644 (file)
index 2507043..0000000
+++ /dev/null
@@ -1,23 +0,0 @@
-/* Norwegian initialisation for the jQuery UI date picker plugin. */
-/* Written by Naimdjon Takhirov (naimdjon@gmail.com). */
-
-jQuery(function($){
-  $.datepicker.regional['no'] = {
-    closeText: 'Lukk',
-    prevText: '&laquo;Forrige',
-    nextText: 'Neste&raquo;',
-    currentText: 'I dag',
-    monthNames: ['januar','februar','mars','april','mai','juni','juli','august','september','oktober','november','desember'],
-    monthNamesShort: ['jan','feb','mar','apr','mai','jun','jul','aug','sep','okt','nov','des'],
-    dayNamesShort: ['søn','man','tir','ons','tor','fre','lør'],
-    dayNames: ['søndag','mandag','tirsdag','onsdag','torsdag','fredag','lørdag'],
-    dayNamesMin: ['sø','ma','ti','on','to','fr','lø'],
-    weekHeader: 'Uke',
-    dateFormat: 'dd.mm.yy',
-    firstDay: 1,
-    isRTL: false,
-    showMonthAfterYear: false,
-    yearSuffix: ''
-  };
-  $.datepicker.setDefaults($.datepicker.regional['no']);
-});
diff --git a/resources/jquery.ui/i18n/jquery.ui.datepicker-pl.js b/resources/jquery.ui/i18n/jquery.ui.datepicker-pl.js
deleted file mode 100644 (file)
index 61fa29c..0000000
+++ /dev/null
@@ -1,23 +0,0 @@
-/* Polish initialisation for the jQuery UI date picker plugin. */
-/* Written by Jacek Wysocki (jacek.wysocki@gmail.com). */
-jQuery(function($){
-       $.datepicker.regional['pl'] = {
-               closeText: 'Zamknij',
-               prevText: '&#x3c;Poprzedni',
-               nextText: 'Następny&#x3e;',
-               currentText: 'Dziś',
-               monthNames: ['Styczeń','Luty','Marzec','Kwiecień','Maj','Czerwiec',
-               'Lipiec','Sierpień','Wrzesień','Październik','Listopad','Grudzień'],
-               monthNamesShort: ['Sty','Lu','Mar','Kw','Maj','Cze',
-               'Lip','Sie','Wrz','Pa','Lis','Gru'],
-               dayNames: ['Niedziela','Poniedziałek','Wtorek','Środa','Czwartek','Piątek','Sobota'],
-               dayNamesShort: ['Nie','Pn','Wt','Śr','Czw','Pt','So'],
-               dayNamesMin: ['N','Pn','Wt','Śr','Cz','Pt','So'],
-               weekHeader: 'Tydz',
-               dateFormat: 'dd.mm.yy',
-               firstDay: 1,
-               isRTL: false,
-               showMonthAfterYear: false,
-               yearSuffix: ''};
-       $.datepicker.setDefaults($.datepicker.regional['pl']);
-});
diff --git a/resources/jquery.ui/i18n/jquery.ui.datepicker-pt-BR.js b/resources/jquery.ui/i18n/jquery.ui.datepicker-pt-BR.js
deleted file mode 100644 (file)
index 3cc8c79..0000000
+++ /dev/null
@@ -1,23 +0,0 @@
-/* Brazilian initialisation for the jQuery UI date picker plugin. */
-/* Written by Leonildo Costa Silva (leocsilva@gmail.com). */
-jQuery(function($){
-       $.datepicker.regional['pt-BR'] = {
-               closeText: 'Fechar',
-               prevText: '&#x3c;Anterior',
-               nextText: 'Pr&oacute;ximo&#x3e;',
-               currentText: 'Hoje',
-               monthNames: ['Janeiro','Fevereiro','Mar&ccedil;o','Abril','Maio','Junho',
-               'Julho','Agosto','Setembro','Outubro','Novembro','Dezembro'],
-               monthNamesShort: ['Jan','Fev','Mar','Abr','Mai','Jun',
-               'Jul','Ago','Set','Out','Nov','Dez'],
-               dayNames: ['Domingo','Segunda-feira','Ter&ccedil;a-feira','Quarta-feira','Quinta-feira','Sexta-feira','S&aacute;bado'],
-               dayNamesShort: ['Dom','Seg','Ter','Qua','Qui','Sex','S&aacute;b'],
-               dayNamesMin: ['Dom','Seg','Ter','Qua','Qui','Sex','S&aacute;b'],
-               weekHeader: 'Sm',
-               dateFormat: 'dd/mm/yy',
-               firstDay: 0,
-               isRTL: false,
-               showMonthAfterYear: false,
-               yearSuffix: ''};
-       $.datepicker.setDefaults($.datepicker.regional['pt-BR']);
-});
\ No newline at end of file
diff --git a/resources/jquery.ui/i18n/jquery.ui.datepicker-pt.js b/resources/jquery.ui/i18n/jquery.ui.datepicker-pt.js
deleted file mode 100644 (file)
index f09f5ae..0000000
+++ /dev/null
@@ -1,22 +0,0 @@
-/* Portuguese initialisation for the jQuery UI date picker plugin. */
-jQuery(function($){
-       $.datepicker.regional['pt'] = {
-               closeText: 'Fechar',
-               prevText: '&#x3c;Anterior',
-               nextText: 'Seguinte',
-               currentText: 'Hoje',
-               monthNames: ['Janeiro','Fevereiro','Mar&ccedil;o','Abril','Maio','Junho',
-               'Julho','Agosto','Setembro','Outubro','Novembro','Dezembro'],
-               monthNamesShort: ['Jan','Fev','Mar','Abr','Mai','Jun',
-               'Jul','Ago','Set','Out','Nov','Dez'],
-               dayNames: ['Domingo','Segunda-feira','Ter&ccedil;a-feira','Quarta-feira','Quinta-feira','Sexta-feira','S&aacute;bado'],
-               dayNamesShort: ['Dom','Seg','Ter','Qua','Qui','Sex','S&aacute;b'],
-               dayNamesMin: ['Dom','Seg','Ter','Qua','Qui','Sex','S&aacute;b'],
-               weekHeader: 'Sem',
-               dateFormat: 'dd/mm/yy',
-               firstDay: 0,
-               isRTL: false,
-               showMonthAfterYear: false,
-               yearSuffix: ''};
-       $.datepicker.setDefaults($.datepicker.regional['pt']);
-});
\ No newline at end of file
diff --git a/resources/jquery.ui/i18n/jquery.ui.datepicker-rm.js b/resources/jquery.ui/i18n/jquery.ui.datepicker-rm.js
deleted file mode 100644 (file)
index cf03cd4..0000000
+++ /dev/null
@@ -1,21 +0,0 @@
-/* Romansh initialisation for the jQuery UI date picker plugin. */
-/* Written by Yvonne Gienal (yvonne.gienal@educa.ch). */
-jQuery(function($){
-       $.datepicker.regional['rm'] = {
-               closeText: 'Serrar',
-               prevText: '&#x3c;Suandant',
-               nextText: 'Precedent&#x3e;',
-               currentText: 'Actual',
-               monthNames: ['Schaner','Favrer','Mars','Avrigl','Matg','Zercladur', 'Fanadur','Avust','Settember','October','November','December'],
-               monthNamesShort: ['Scha','Fev','Mar','Avr','Matg','Zer', 'Fan','Avu','Sett','Oct','Nov','Dec'],
-               dayNames: ['Dumengia','Glindesdi','Mardi','Mesemna','Gievgia','Venderdi','Sonda'],
-               dayNamesShort: ['Dum','Gli','Mar','Mes','Gie','Ven','Som'],
-               dayNamesMin: ['Du','Gl','Ma','Me','Gi','Ve','So'],
-               weekHeader: 'emna',
-               dateFormat: 'dd/mm/yy',
-               firstDay: 1,
-               isRTL: false,
-               showMonthAfterYear: false,
-               yearSuffix: ''};
-       $.datepicker.setDefaults($.datepicker.regional['rm']);
-});
diff --git a/resources/jquery.ui/i18n/jquery.ui.datepicker-ro.js b/resources/jquery.ui/i18n/jquery.ui.datepicker-ro.js
deleted file mode 100644 (file)
index 6b140af..0000000
+++ /dev/null
@@ -1,26 +0,0 @@
-/* Romanian initialisation for the jQuery UI date picker plugin.
- *
- * Written by Edmond L. (ll_edmond@walla.com)
- * and Ionut G. Stan (ionut.g.stan@gmail.com)
- */
-jQuery(function($){
-       $.datepicker.regional['ro'] = {
-               closeText: 'Închide',
-               prevText: '&laquo; Luna precedentă',
-               nextText: 'Luna următoare &raquo;',
-               currentText: 'Azi',
-               monthNames: ['Ianuarie','Februarie','Martie','Aprilie','Mai','Iunie',
-               'Iulie','August','Septembrie','Octombrie','Noiembrie','Decembrie'],
-               monthNamesShort: ['Ian', 'Feb', 'Mar', 'Apr', 'Mai', 'Iun',
-               'Iul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],
-               dayNames: ['Duminică', 'Luni', 'Marţi', 'Miercuri', 'Joi', 'Vineri', 'Sâmbătă'],
-               dayNamesShort: ['Dum', 'Lun', 'Mar', 'Mie', 'Joi', 'Vin', 'Sâm'],
-               dayNamesMin: ['Du','Lu','Ma','Mi','Jo','Vi','Sâ'],
-               weekHeader: 'Săpt',
-               dateFormat: 'dd.mm.yy',
-               firstDay: 1,
-               isRTL: false,
-               showMonthAfterYear: false,
-               yearSuffix: ''};
-       $.datepicker.setDefaults($.datepicker.regional['ro']);
-});
diff --git a/resources/jquery.ui/i18n/jquery.ui.datepicker-ru.js b/resources/jquery.ui/i18n/jquery.ui.datepicker-ru.js
deleted file mode 100644 (file)
index 50a4613..0000000
+++ /dev/null
@@ -1,23 +0,0 @@
-/* Russian (UTF-8) initialisation for the jQuery UI date picker plugin. */
-/* Written by Andrew Stromnov (stromnov@gmail.com). */
-jQuery(function($){
-       $.datepicker.regional['ru'] = {
-               closeText: 'Закрыть',
-               prevText: '&#x3c;Пред',
-               nextText: 'След&#x3e;',
-               currentText: 'Сегодня',
-               monthNames: ['Январь','Февраль','Март','Апрель','Май','Июнь',
-               'Июль','Август','Сентябрь','Октябрь','Ноябрь','Декабрь'],
-               monthNamesShort: ['Янв','Фев','Мар','Апр','Май','Июн',
-               'Июл','Авг','Сен','Окт','Ноя','Дек'],
-               dayNames: ['воскресенье','понедельник','вторник','среда','четверг','пятница','суббота'],
-               dayNamesShort: ['вск','пнд','втр','срд','чтв','птн','сбт'],
-               dayNamesMin: ['Вс','Пн','Вт','Ср','Чт','Пт','Сб'],
-               weekHeader: 'Нед',
-               dateFormat: 'dd.mm.yy',
-               firstDay: 1,
-               isRTL: false,
-               showMonthAfterYear: false,
-               yearSuffix: ''};
-       $.datepicker.setDefaults($.datepicker.regional['ru']);
-});
\ No newline at end of file
diff --git a/resources/jquery.ui/i18n/jquery.ui.datepicker-sk.js b/resources/jquery.ui/i18n/jquery.ui.datepicker-sk.js
deleted file mode 100644 (file)
index 078d1b0..0000000
+++ /dev/null
@@ -1,23 +0,0 @@
-/* Slovak initialisation for the jQuery UI date picker plugin. */
-/* Written by Vojtech Rinik (vojto@hmm.sk). */
-jQuery(function($){
-       $.datepicker.regional['sk'] = {
-               closeText: 'Zavrieť',
-               prevText: '&#x3c;Predchádzajúci',
-               nextText: 'Nasledujúci&#x3e;',
-               currentText: 'Dnes',
-               monthNames: ['Január','Február','Marec','Apríl','Máj','Jún',
-               'Júl','August','September','Október','November','December'],
-               monthNamesShort: ['Jan','Feb','Mar','Apr','Máj','Jún',
-               'Júl','Aug','Sep','Okt','Nov','Dec'],
-               dayNames: ['Nedeľa','Pondelok','Utorok','Streda','Štvrtok','Piatok','Sobota'],
-               dayNamesShort: ['Ned','Pon','Uto','Str','Štv','Pia','Sob'],
-               dayNamesMin: ['Ne','Po','Ut','St','Št','Pia','So'],
-               weekHeader: 'Ty',
-               dateFormat: 'dd.mm.yy',
-               firstDay: 1,
-               isRTL: false,
-               showMonthAfterYear: false,
-               yearSuffix: ''};
-       $.datepicker.setDefaults($.datepicker.regional['sk']);
-});
diff --git a/resources/jquery.ui/i18n/jquery.ui.datepicker-sl.js b/resources/jquery.ui/i18n/jquery.ui.datepicker-sl.js
deleted file mode 100644 (file)
index 5165501..0000000
+++ /dev/null
@@ -1,24 +0,0 @@
-/* Slovenian initialisation for the jQuery UI date picker plugin. */
-/* Written by Jaka Jancar (jaka@kubje.org). */
-/* c = &#x10D;, s = &#x161; z = &#x17E; C = &#x10C; S = &#x160; Z = &#x17D; */
-jQuery(function($){
-       $.datepicker.regional['sl'] = {
-               closeText: 'Zapri',
-               prevText: '&lt;Prej&#x161;nji',
-               nextText: 'Naslednji&gt;',
-               currentText: 'Trenutni',
-               monthNames: ['Januar','Februar','Marec','April','Maj','Junij',
-               'Julij','Avgust','September','Oktober','November','December'],
-               monthNamesShort: ['Jan','Feb','Mar','Apr','Maj','Jun',
-               'Jul','Avg','Sep','Okt','Nov','Dec'],
-               dayNames: ['Nedelja','Ponedeljek','Torek','Sreda','&#x10C;etrtek','Petek','Sobota'],
-               dayNamesShort: ['Ned','Pon','Tor','Sre','&#x10C;et','Pet','Sob'],
-               dayNamesMin: ['Ne','Po','To','Sr','&#x10C;e','Pe','So'],
-               weekHeader: 'Teden',
-               dateFormat: 'dd.mm.yy',
-               firstDay: 1,
-               isRTL: false,
-               showMonthAfterYear: false,
-               yearSuffix: ''};
-       $.datepicker.setDefaults($.datepicker.regional['sl']);
-});
diff --git a/resources/jquery.ui/i18n/jquery.ui.datepicker-sq.js b/resources/jquery.ui/i18n/jquery.ui.datepicker-sq.js
deleted file mode 100644 (file)
index 21974c5..0000000
+++ /dev/null
@@ -1,23 +0,0 @@
-/* Albanian initialisation for the jQuery UI date picker plugin. */
-/* Written by Flakron Bytyqi (flakron@gmail.com). */
-jQuery(function($){
-       $.datepicker.regional['sq'] = {
-               closeText: 'mbylle',
-               prevText: '&#x3c;mbrapa',
-               nextText: 'Përpara&#x3e;',
-               currentText: 'sot',
-               monthNames: ['Janar','Shkurt','Mars','Prill','Maj','Qershor',
-               'Korrik','Gusht','Shtator','Tetor','Nëntor','Dhjetor'],
-               monthNamesShort: ['Jan','Shk','Mar','Pri','Maj','Qer',
-               'Kor','Gus','Sht','Tet','Nën','Dhj'],
-               dayNames: ['E Diel','E Hënë','E Martë','E Mërkurë','E Enjte','E Premte','E Shtune'],
-               dayNamesShort: ['Di','Hë','Ma','Më','En','Pr','Sh'],
-               dayNamesMin: ['Di','Hë','Ma','Më','En','Pr','Sh'],
-               weekHeader: 'Ja',
-               dateFormat: 'dd.mm.yy',
-               firstDay: 1,
-               isRTL: false,
-               showMonthAfterYear: false,
-               yearSuffix: ''};
-       $.datepicker.setDefaults($.datepicker.regional['sq']);
-});
diff --git a/resources/jquery.ui/i18n/jquery.ui.datepicker-sr-SR.js b/resources/jquery.ui/i18n/jquery.ui.datepicker-sr-SR.js
deleted file mode 100644 (file)
index e7a8683..0000000
+++ /dev/null
@@ -1,23 +0,0 @@
-/* Serbian i18n for the jQuery UI date picker plugin. */
-/* Written by Dejan Dimić. */
-jQuery(function($){
-       $.datepicker.regional['sr-SR'] = {
-               closeText: 'Zatvori',
-               prevText: '&#x3c;',
-               nextText: '&#x3e;',
-               currentText: 'Danas',
-               monthNames: ['Januar','Februar','Mart','April','Maj','Jun',
-               'Jul','Avgust','Septembar','Oktobar','Novembar','Decembar'],
-               monthNamesShort: ['Jan','Feb','Mar','Apr','Maj','Jun',
-               'Jul','Avg','Sep','Okt','Nov','Dec'],
-               dayNames: ['Nedelja','Ponedeljak','Utorak','Sreda','Četvrtak','Petak','Subota'],
-               dayNamesShort: ['Ned','Pon','Uto','Sre','Čet','Pet','Sub'],
-               dayNamesMin: ['Ne','Po','Ut','Sr','Če','Pe','Su'],
-               weekHeader: 'Sed',
-               dateFormat: 'dd/mm/yy',
-               firstDay: 1,
-               isRTL: false,
-               showMonthAfterYear: false,
-               yearSuffix: ''};
-       $.datepicker.setDefaults($.datepicker.regional['sr-SR']);
-});
diff --git a/resources/jquery.ui/i18n/jquery.ui.datepicker-sr.js b/resources/jquery.ui/i18n/jquery.ui.datepicker-sr.js
deleted file mode 100644 (file)
index 0bd240e..0000000
+++ /dev/null
@@ -1,23 +0,0 @@
-/* Serbian i18n for the jQuery UI date picker plugin. */
-/* Written by Dejan Dimić. */
-jQuery(function($){
-       $.datepicker.regional['sr'] = {
-               closeText: 'Затвори',
-               prevText: '&#x3c;',
-               nextText: '&#x3e;',
-               currentText: 'Данас',
-               monthNames: ['Јануар','Фебруар','Март','Април','Мај','Јун',
-               'Јул','Август','Септембар','Октобар','Новембар','Децембар'],
-               monthNamesShort: ['Јан','Феб','Мар','Апр','Мај','Јун',
-               'Јул','Авг','Сеп','Окт','Нов','Дец'],
-               dayNames: ['Недеља','Понедељак','Уторак','Среда','Четвртак','Петак','Субота'],
-               dayNamesShort: ['Нед','Пон','Уто','Сре','Чет','Пет','Суб'],
-               dayNamesMin: ['Не','По','Ут','Ср','Че','Пе','Су'],
-               weekHeader: 'Сед',
-               dateFormat: 'dd/mm/yy',
-               firstDay: 1,
-               isRTL: false,
-               showMonthAfterYear: false,
-               yearSuffix: ''};
-       $.datepicker.setDefaults($.datepicker.regional['sr']);
-});
diff --git a/resources/jquery.ui/i18n/jquery.ui.datepicker-sv.js b/resources/jquery.ui/i18n/jquery.ui.datepicker-sv.js
deleted file mode 100644 (file)
index e5f549f..0000000
+++ /dev/null
@@ -1,23 +0,0 @@
-/* Swedish initialisation for the jQuery UI date picker plugin. */
-/* Written by Anders Ekdahl ( anders@nomadiz.se). */
-jQuery(function($){
-    $.datepicker.regional['sv'] = {
-               closeText: 'Stäng',
-        prevText: '&laquo;Förra',
-               nextText: 'Nästa&raquo;',
-               currentText: 'Idag',
-        monthNames: ['Januari','Februari','Mars','April','Maj','Juni',
-        'Juli','Augusti','September','Oktober','November','December'],
-        monthNamesShort: ['Jan','Feb','Mar','Apr','Maj','Jun',
-        'Jul','Aug','Sep','Okt','Nov','Dec'],
-               dayNamesShort: ['Sön','Mån','Tis','Ons','Tor','Fre','Lör'],
-               dayNames: ['Söndag','Måndag','Tisdag','Onsdag','Torsdag','Fredag','Lördag'],
-               dayNamesMin: ['Sö','Må','Ti','On','To','Fr','Lö'],
-               weekHeader: 'Ve',
-        dateFormat: 'yy-mm-dd',
-               firstDay: 1,
-               isRTL: false,
-               showMonthAfterYear: false,
-               yearSuffix: ''};
-    $.datepicker.setDefaults($.datepicker.regional['sv']);
-});
diff --git a/resources/jquery.ui/i18n/jquery.ui.datepicker-ta.js b/resources/jquery.ui/i18n/jquery.ui.datepicker-ta.js
deleted file mode 100644 (file)
index 40431ed..0000000
+++ /dev/null
@@ -1,23 +0,0 @@
-/* Tamil (UTF-8) initialisation for the jQuery UI date picker plugin. */
-/* Written by S A Sureshkumar (saskumar@live.com). */
-jQuery(function($){
-       $.datepicker.regional['ta'] = {
-               closeText: 'மூடு',
-               prevText: 'முன்னையது',
-               nextText: 'அடுத்தது',
-               currentText: 'இன்று',
-               monthNames: ['தை','மாசி','பங்குனி','சித்திரை','வைகாசி','ஆனி',
-               'ஆடி','ஆவணி','புரட்டாசி','ஐப்பசி','கார்த்திகை','மார்கழி'],
-               monthNamesShort: ['தை','மாசி','பங்','சித்','வைகா','ஆனி',
-               'ஆடி','ஆவ','புர','ஐப்','கார்','மார்'],
-               dayNames: ['ஞாயிற்றுக்கிழமை','திங்கட்கிழமை','செவ்வாய்க்கிழமை','புதன்கிழமை','வியாழக்கிழமை','வெள்ளிக்கிழமை','சனிக்கிழமை'],
-               dayNamesShort: ['ஞாயிறு','திங்கள்','செவ்வாய்','புதன்','வியாழன்','வெள்ளி','சனி'],
-               dayNamesMin: ['ஞா','தி','செ','பு','வி','வெ','ச'],
-               weekHeader: 'Не',
-               dateFormat: 'dd/mm/yy',
-               firstDay: 1,
-               isRTL: false,
-               showMonthAfterYear: false,
-               yearSuffix: ''};
-       $.datepicker.setDefaults($.datepicker.regional['ta']);
-});
diff --git a/resources/jquery.ui/i18n/jquery.ui.datepicker-th.js b/resources/jquery.ui/i18n/jquery.ui.datepicker-th.js
deleted file mode 100644 (file)
index 2e5300c..0000000
+++ /dev/null
@@ -1,23 +0,0 @@
-/* Thai initialisation for the jQuery UI date picker plugin. */
-/* Written by pipo (pipo@sixhead.com). */
-jQuery(function($){
-       $.datepicker.regional['th'] = {
-               closeText: 'ปิด',
-               prevText: '&laquo;&nbsp;ย้อน',
-               nextText: 'ถัดไป&nbsp;&raquo;',
-               currentText: 'วันนี้',
-               monthNames: ['มกราคม','กุมภาพันธ์','มีนาคม','เมษายน','พฤษภาคม','มิถุนายน',
-               'กรกฎาคม','สิงหาคม','กันยายน','ตุลาคม','พฤศจิกายน','ธันวาคม'],
-               monthNamesShort: ['ม.ค.','ก.พ.','มี.ค.','เม.ย.','พ.ค.','มิ.ย.',
-               'ก.ค.','ส.ค.','ก.ย.','ต.ค.','พ.ย.','ธ.ค.'],
-               dayNames: ['อาทิตย์','จันทร์','อังคาร','พุธ','พฤหัสบดี','ศุกร์','เสาร์'],
-               dayNamesShort: ['อา.','จ.','อ.','พ.','พฤ.','ศ.','ส.'],
-               dayNamesMin: ['อา.','จ.','อ.','พ.','พฤ.','ศ.','ส.'],
-               weekHeader: 'Wk',
-               dateFormat: 'dd/mm/yy',
-               firstDay: 0,
-               isRTL: false,
-               showMonthAfterYear: false,
-               yearSuffix: ''};
-       $.datepicker.setDefaults($.datepicker.regional['th']);
-});
\ No newline at end of file
diff --git a/resources/jquery.ui/i18n/jquery.ui.datepicker-tr.js b/resources/jquery.ui/i18n/jquery.ui.datepicker-tr.js
deleted file mode 100644 (file)
index dedfc7f..0000000
+++ /dev/null
@@ -1,23 +0,0 @@
-/* Turkish initialisation for the jQuery UI date picker plugin. */
-/* Written by Izzet Emre Erkan (kara@karalamalar.net). */
-jQuery(function($){
-       $.datepicker.regional['tr'] = {
-               closeText: 'kapat',
-               prevText: '&#x3c;geri',
-               nextText: 'ileri&#x3e',
-               currentText: 'bugün',
-               monthNames: ['Ocak','Şubat','Mart','Nisan','Mayıs','Haziran',
-               'Temmuz','Ağustos','Eylül','Ekim','Kasım','Aralık'],
-               monthNamesShort: ['Oca','Şub','Mar','Nis','May','Haz',
-               'Tem','Ağu','Eyl','Eki','Kas','Ara'],
-               dayNames: ['Pazar','Pazartesi','Salı','Çarşamba','Perşembe','Cuma','Cumartesi'],
-               dayNamesShort: ['Pz','Pt','Sa','Ça','Pe','Cu','Ct'],
-               dayNamesMin: ['Pz','Pt','Sa','Ça','Pe','Cu','Ct'],
-               weekHeader: 'Hf',
-               dateFormat: 'dd.mm.yy',
-               firstDay: 1,
-               isRTL: false,
-               showMonthAfterYear: false,
-               yearSuffix: ''};
-       $.datepicker.setDefaults($.datepicker.regional['tr']);
-});
\ No newline at end of file
diff --git a/resources/jquery.ui/i18n/jquery.ui.datepicker-uk.js b/resources/jquery.ui/i18n/jquery.ui.datepicker-uk.js
deleted file mode 100644 (file)
index 2718f5d..0000000
+++ /dev/null
@@ -1,24 +0,0 @@
-/* Ukrainian (UTF-8) initialisation for the jQuery UI date picker plugin. */
-/* Written by Maxim Drogobitskiy (maxdao@gmail.com). */
-/* Corrected by Igor Milla (igor.fsp.milla@gmail.com). */
-jQuery(function($){
-       $.datepicker.regional['uk'] = {
-               closeText: 'Закрити',
-               prevText: '&#x3c;',
-               nextText: '&#x3e;',
-               currentText: 'Сьогодні',
-               monthNames: ['Січень','Лютий','Березень','Квітень','Травень','Червень',
-               'Липень','Серпень','Вересень','Жовтень','Листопад','Грудень'],
-               monthNamesShort: ['Січ','Лют','Бер','Кві','Тра','Чер',
-               'Лип','Сер','Вер','Жов','Лис','Гру'],
-               dayNames: ['неділя','понеділок','вівторок','середа','четвер','п’ятниця','субота'],
-               dayNamesShort: ['нед','пнд','вів','срд','чтв','птн','сбт'],
-               dayNamesMin: ['Нд','Пн','Вт','Ср','Чт','Пт','Сб'],
-               weekHeader: 'Тиж',
-               dateFormat: 'dd/mm/yy',
-               firstDay: 1,
-               isRTL: false,
-               showMonthAfterYear: false,
-               yearSuffix: ''};
-       $.datepicker.setDefaults($.datepicker.regional['uk']);
-});
\ No newline at end of file
diff --git a/resources/jquery.ui/i18n/jquery.ui.datepicker-vi.js b/resources/jquery.ui/i18n/jquery.ui.datepicker-vi.js
deleted file mode 100644 (file)
index 1d8f7bb..0000000
+++ /dev/null
@@ -1,23 +0,0 @@
-/* Vietnamese initialisation for the jQuery UI date picker plugin. */
-/* Translated by Le Thanh Huy (lthanhhuy@cit.ctu.edu.vn). */
-jQuery(function($){
-       $.datepicker.regional['vi'] = {
-               closeText: 'Đóng',
-               prevText: '&#x3c;Trước',
-               nextText: 'Tiếp&#x3e;',
-               currentText: 'Hôm nay',
-               monthNames: ['Tháng Một', 'Tháng Hai', 'Tháng Ba', 'Tháng Tư', 'Tháng Năm', 'Tháng Sáu',
-               'Tháng Bảy', 'Tháng Tám', 'Tháng Chín', 'Tháng Mười', 'Tháng Mười Một', 'Tháng Mười Hai'],
-               monthNamesShort: ['Tháng 1', 'Tháng 2', 'Tháng 3', 'Tháng 4', 'Tháng 5', 'Tháng 6',
-               'Tháng 7', 'Tháng 8', 'Tháng 9', 'Tháng 10', 'Tháng 11', 'Tháng 12'],
-               dayNames: ['Chủ Nhật', 'Thứ Hai', 'Thứ Ba', 'Thứ Tư', 'Thứ Năm', 'Thứ Sáu', 'Thứ Bảy'],
-               dayNamesShort: ['CN', 'T2', 'T3', 'T4', 'T5', 'T6', 'T7'],
-               dayNamesMin: ['CN', 'T2', 'T3', 'T4', 'T5', 'T6', 'T7'],
-               weekHeader: 'Tu',
-               dateFormat: 'dd/mm/yy',
-               firstDay: 0,
-               isRTL: false,
-               showMonthAfterYear: false,
-               yearSuffix: ''};
-       $.datepicker.setDefaults($.datepicker.regional['vi']);
-});
diff --git a/resources/jquery.ui/i18n/jquery.ui.datepicker-zh-CN.js b/resources/jquery.ui/i18n/jquery.ui.datepicker-zh-CN.js
deleted file mode 100644 (file)
index 83f2825..0000000
+++ /dev/null
@@ -1,23 +0,0 @@
-/* Chinese initialisation for the jQuery UI date picker plugin. */
-/* Written by Cloudream (cloudream@gmail.com). */
-jQuery(function($){
-       $.datepicker.regional['zh-CN'] = {
-               closeText: '关闭',
-               prevText: '&#x3c;上月',
-               nextText: '下月&#x3e;',
-               currentText: '今天',
-               monthNames: ['一月','二月','三月','四月','五月','六月',
-               '七月','八月','九月','十月','十一月','十二月'],
-               monthNamesShort: ['一月','二月','三月','四月','五月','六月',
-               '七月','八月','九月','十月','十一月','十二月'],
-               dayNames: ['星期日','星期一','星期二','星期三','星期四','星期五','星期六'],
-               dayNamesShort: ['周日','周一','周二','周三','周四','周五','周六'],
-               dayNamesMin: ['日','一','二','三','四','五','六'],
-               weekHeader: '周',
-               dateFormat: 'yy-mm-dd',
-               firstDay: 1,
-               isRTL: false,
-               showMonthAfterYear: true,
-               yearSuffix: '年'};
-       $.datepicker.setDefaults($.datepicker.regional['zh-CN']);
-});
diff --git a/resources/jquery.ui/i18n/jquery.ui.datepicker-zh-HK.js b/resources/jquery.ui/i18n/jquery.ui.datepicker-zh-HK.js
deleted file mode 100644 (file)
index 11189d3..0000000
+++ /dev/null
@@ -1,23 +0,0 @@
-/* Chinese initialisation for the jQuery UI date picker plugin. */
-/* Written by SCCY (samuelcychan@gmail.com). */
-jQuery(function($){
-       $.datepicker.regional['zh-HK'] = {
-               closeText: '關閉',
-               prevText: '&#x3c;上月',
-               nextText: '下月&#x3e;',
-               currentText: '今天',
-               monthNames: ['一月','二月','三月','四月','五月','六月',
-               '七月','八月','九月','十月','十一月','十二月'],
-               monthNamesShort: ['一月','二月','三月','四月','五月','六月',
-               '七月','八月','九月','十月','十一月','十二月'],
-               dayNames: ['星期日','星期一','星期二','星期三','星期四','星期五','星期六'],
-               dayNamesShort: ['周日','周一','周二','周三','周四','周五','周六'],
-               dayNamesMin: ['日','一','二','三','四','五','六'],
-               weekHeader: '周',
-               dateFormat: 'dd-mm-yy',
-               firstDay: 0,
-               isRTL: false,
-               showMonthAfterYear: true,
-               yearSuffix: '年'};
-       $.datepicker.setDefaults($.datepicker.regional['zh-HK']);
-});
diff --git a/resources/jquery.ui/i18n/jquery.ui.datepicker-zh-TW.js b/resources/jquery.ui/i18n/jquery.ui.datepicker-zh-TW.js
deleted file mode 100644 (file)
index 089498b..0000000
+++ /dev/null
@@ -1,23 +0,0 @@
-/* Chinese initialisation for the jQuery UI date picker plugin. */
-/* Written by Ressol (ressol@gmail.com). */
-jQuery(function($){
-       $.datepicker.regional['zh-TW'] = {
-               closeText: '關閉',
-               prevText: '&#x3c;上月',
-               nextText: '下月&#x3e;',
-               currentText: '今天',
-               monthNames: ['一月','二月','三月','四月','五月','六月',
-               '七月','八月','九月','十月','十一月','十二月'],
-               monthNamesShort: ['一月','二月','三月','四月','五月','六月',
-               '七月','八月','九月','十月','十一月','十二月'],
-               dayNames: ['星期日','星期一','星期二','星期三','星期四','星期五','星期六'],
-               dayNamesShort: ['周日','周一','周二','周三','周四','周五','周六'],
-               dayNamesMin: ['日','一','二','三','四','五','六'],
-               weekHeader: '周',
-               dateFormat: 'yy/mm/dd',
-               firstDay: 1,
-               isRTL: false,
-               showMonthAfterYear: true,
-               yearSuffix: '年'};
-       $.datepicker.setDefaults($.datepicker.regional['zh-TW']);
-});
diff --git a/resources/jquery.ui/jquery.ui.accordion.js b/resources/jquery.ui/jquery.ui.accordion.js
deleted file mode 100644 (file)
index dc1ba60..0000000
+++ /dev/null
@@ -1,611 +0,0 @@
-/*!
- * jQuery UI Accordion 1.8.24
- *
- * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
- * Dual licensed under the MIT or GPL Version 2 licenses.
- * http://jquery.org/license
- *
- * http://docs.jquery.com/UI/Accordion
- *
- * Depends:
- *     jquery.ui.core.js
- *     jquery.ui.widget.js
- */
-(function( $, undefined ) {
-
-$.widget( "ui.accordion", {
-       options: {
-               active: 0,
-               animated: "slide",
-               autoHeight: true,
-               clearStyle: false,
-               collapsible: false,
-               event: "click",
-               fillSpace: false,
-               header: "> li > :first-child,> :not(li):even",
-               icons: {
-                       header: "ui-icon-triangle-1-e",
-                       headerSelected: "ui-icon-triangle-1-s"
-               },
-               navigation: false,
-               navigationFilter: function() {
-                       return this.href.toLowerCase() === location.href.toLowerCase();
-               }
-       },
-
-       _create: function() {
-               var self = this,
-                       options = self.options;
-
-               self.running = 0;
-
-               self.element
-                       .addClass( "ui-accordion ui-widget ui-helper-reset" )
-                       // in lack of child-selectors in CSS
-                       // we need to mark top-LIs in a UL-accordion for some IE-fix
-                       .children( "li" )
-                               .addClass( "ui-accordion-li-fix" );
-
-               self.headers = self.element.find( options.header )
-                       .addClass( "ui-accordion-header ui-helper-reset ui-state-default ui-corner-all" )
-                       .bind( "mouseenter.accordion", function() {
-                               if ( options.disabled ) {
-                                       return;
-                               }
-                               $( this ).addClass( "ui-state-hover" );
-                       })
-                       .bind( "mouseleave.accordion", function() {
-                               if ( options.disabled ) {
-                                       return;
-                               }
-                               $( this ).removeClass( "ui-state-hover" );
-                       })
-                       .bind( "focus.accordion", function() {
-                               if ( options.disabled ) {
-                                       return;
-                               }
-                               $( this ).addClass( "ui-state-focus" );
-                       })
-                       .bind( "blur.accordion", function() {
-                               if ( options.disabled ) {
-                                       return;
-                               }
-                               $( this ).removeClass( "ui-state-focus" );
-                       });
-
-               self.headers.next()
-                       .addClass( "ui-accordion-content ui-helper-reset ui-widget-content ui-corner-bottom" );
-
-               if ( options.navigation ) {
-                       var current = self.element.find( "a" ).filter( options.navigationFilter ).eq( 0 );
-                       if ( current.length ) {
-                               var header = current.closest( ".ui-accordion-header" );
-                               if ( header.length ) {
-                                       // anchor within header
-                                       self.active = header;
-                               } else {
-                                       // anchor within content
-                                       self.active = current.closest( ".ui-accordion-content" ).prev();
-                               }
-                       }
-               }
-
-               self.active = self._findActive( self.active || options.active )
-                       .addClass( "ui-state-default ui-state-active" )
-                       .toggleClass( "ui-corner-all" )
-                       .toggleClass( "ui-corner-top" );
-               self.active.next().addClass( "ui-accordion-content-active" );
-
-               self._createIcons();
-               self.resize();
-               
-               // ARIA
-               self.element.attr( "role", "tablist" );
-
-               self.headers
-                       .attr( "role", "tab" )
-                       .bind( "keydown.accordion", function( event ) {
-                               return self._keydown( event );
-                       })
-                       .next()
-                               .attr( "role", "tabpanel" );
-
-               self.headers
-                       .not( self.active || "" )
-                       .attr({
-                               "aria-expanded": "false",
-                               "aria-selected": "false",
-                               tabIndex: -1
-                       })
-                       .next()
-                               .hide();
-
-               // make sure at least one header is in the tab order
-               if ( !self.active.length ) {
-                       self.headers.eq( 0 ).attr( "tabIndex", 0 );
-               } else {
-                       self.active
-                               .attr({
-                                       "aria-expanded": "true",
-                                       "aria-selected": "true",
-                                       tabIndex: 0
-                               });
-               }
-
-               // only need links in tab order for Safari
-               if ( !$.browser.safari ) {
-                       self.headers.find( "a" ).attr( "tabIndex", -1 );
-               }
-
-               if ( options.event ) {
-                       self.headers.bind( options.event.split(" ").join(".accordion ") + ".accordion", function(event) {
-                               self._clickHandler.call( self, event, this );
-                               event.preventDefault();
-                       });
-               }
-       },
-
-       _createIcons: function() {
-               var options = this.options;
-               if ( options.icons ) {
-                       $( "<span></span>" )
-                               .addClass( "ui-icon " + options.icons.header )
-                               .prependTo( this.headers );
-                       this.active.children( ".ui-icon" )
-                               .toggleClass(options.icons.header)
-                               .toggleClass(options.icons.headerSelected);
-                       this.element.addClass( "ui-accordion-icons" );
-               }
-       },
-
-       _destroyIcons: function() {
-               this.headers.children( ".ui-icon" ).remove();
-               this.element.removeClass( "ui-accordion-icons" );
-       },
-
-       destroy: function() {
-               var options = this.options;
-
-               this.element
-                       .removeClass( "ui-accordion ui-widget ui-helper-reset" )
-                       .removeAttr( "role" );
-
-               this.headers
-                       .unbind( ".accordion" )
-                       .removeClass( "ui-accordion-header ui-accordion-disabled ui-helper-reset ui-state-default ui-corner-all ui-state-active ui-state-disabled ui-corner-top" )
-                       .removeAttr( "role" )
-                       .removeAttr( "aria-expanded" )
-                       .removeAttr( "aria-selected" )
-                       .removeAttr( "tabIndex" );
-
-               this.headers.find( "a" ).removeAttr( "tabIndex" );
-               this._destroyIcons();
-               var contents = this.headers.next()
-                       .css( "display", "" )
-                       .removeAttr( "role" )
-                       .removeClass( "ui-helper-reset ui-widget-content ui-corner-bottom ui-accordion-content ui-accordion-content-active ui-accordion-disabled ui-state-disabled" );
-               if ( options.autoHeight || options.fillHeight ) {
-                       contents.css( "height", "" );
-               }
-
-               return $.Widget.prototype.destroy.call( this );
-       },
-
-       _setOption: function( key, value ) {
-               $.Widget.prototype._setOption.apply( this, arguments );
-                       
-               if ( key == "active" ) {
-                       this.activate( value );
-               }
-               if ( key == "icons" ) {
-                       this._destroyIcons();
-                       if ( value ) {
-                               this._createIcons();
-                       }
-               }
-               // #5332 - opacity doesn't cascade to positioned elements in IE
-               // so we need to add the disabled class to the headers and panels
-               if ( key == "disabled" ) {
-                       this.headers.add(this.headers.next())
-                               [ value ? "addClass" : "removeClass" ](
-                                       "ui-accordion-disabled ui-state-disabled" );
-               }
-       },
-
-       _keydown: function( event ) {
-               if ( this.options.disabled || event.altKey || event.ctrlKey ) {
-                       return;
-               }
-
-               var keyCode = $.ui.keyCode,
-                       length = this.headers.length,
-                       currentIndex = this.headers.index( event.target ),
-                       toFocus = false;
-
-               switch ( event.keyCode ) {
-                       case keyCode.RIGHT:
-                       case keyCode.DOWN:
-                               toFocus = this.headers[ ( currentIndex + 1 ) % length ];
-                               break;
-                       case keyCode.LEFT:
-                       case keyCode.UP:
-                               toFocus = this.headers[ ( currentIndex - 1 + length ) % length ];
-                               break;
-                       case keyCode.SPACE:
-                       case keyCode.ENTER:
-                               this._clickHandler( { target: event.target }, event.target );
-                               event.preventDefault();
-               }
-
-               if ( toFocus ) {
-                       $( event.target ).attr( "tabIndex", -1 );
-                       $( toFocus ).attr( "tabIndex", 0 );
-                       toFocus.focus();
-                       return false;
-               }
-
-               return true;
-       },
-
-       resize: function() {
-               var options = this.options,
-                       maxHeight;
-
-               if ( options.fillSpace ) {
-                       if ( $.browser.msie ) {
-                               var defOverflow = this.element.parent().css( "overflow" );
-                               this.element.parent().css( "overflow", "hidden");
-                       }
-                       maxHeight = this.element.parent().height();
-                       if ($.browser.msie) {
-                               this.element.parent().css( "overflow", defOverflow );
-                       }
-
-                       this.headers.each(function() {
-                               maxHeight -= $( this ).outerHeight( true );
-                       });
-
-                       this.headers.next()
-                               .each(function() {
-                                       $( this ).height( Math.max( 0, maxHeight -
-                                               $( this ).innerHeight() + $( this ).height() ) );
-                               })
-                               .css( "overflow", "auto" );
-               } else if ( options.autoHeight ) {
-                       maxHeight = 0;
-                       this.headers.next()
-                               .each(function() {
-                                       maxHeight = Math.max( maxHeight, $( this ).height( "" ).height() );
-                               })
-                               .height( maxHeight );
-               }
-
-               return this;
-       },
-
-       activate: function( index ) {
-               // TODO this gets called on init, changing the option without an explicit call for that
-               this.options.active = index;
-               // call clickHandler with custom event
-               var active = this._findActive( index )[ 0 ];
-               this._clickHandler( { target: active }, active );
-
-               return this;
-       },
-
-       _findActive: function( selector ) {
-               return selector
-                       ? typeof selector === "number"
-                               ? this.headers.filter( ":eq(" + selector + ")" )
-                               : this.headers.not( this.headers.not( selector ) )
-                       : selector === false
-                               ? $( [] )
-                               : this.headers.filter( ":eq(0)" );
-       },
-
-       // TODO isn't event.target enough? why the separate target argument?
-       _clickHandler: function( event, target ) {
-               var options = this.options;
-               if ( options.disabled ) {
-                       return;
-               }
-
-               // called only when using activate(false) to close all parts programmatically
-               if ( !event.target ) {
-                       if ( !options.collapsible ) {
-                               return;
-                       }
-                       this.active
-                               .removeClass( "ui-state-active ui-corner-top" )
-                               .addClass( "ui-state-default ui-corner-all" )
-                               .children( ".ui-icon" )
-                                       .removeClass( options.icons.headerSelected )
-                                       .addClass( options.icons.header );
-                       this.active.next().addClass( "ui-accordion-content-active" );
-                       var toHide = this.active.next(),
-                               data = {
-                                       options: options,
-                                       newHeader: $( [] ),
-                                       oldHeader: options.active,
-                                       newContent: $( [] ),
-                                       oldContent: toHide
-                               },
-                               toShow = ( this.active = $( [] ) );
-                       this._toggle( toShow, toHide, data );
-                       return;
-               }
-
-               // get the click target
-               var clicked = $( event.currentTarget || target ),
-                       clickedIsActive = clicked[0] === this.active[0];
-
-               // TODO the option is changed, is that correct?
-               // TODO if it is correct, shouldn't that happen after determining that the click is valid?
-               options.active = options.collapsible && clickedIsActive ?
-                       false :
-                       this.headers.index( clicked );
-
-               // if animations are still active, or the active header is the target, ignore click
-               if ( this.running || ( !options.collapsible && clickedIsActive ) ) {
-                       return;
-               }
-
-               // find elements to show and hide
-               var active = this.active,
-                       toShow = clicked.next(),
-                       toHide = this.active.next(),
-                       data = {
-                               options: options,
-                               newHeader: clickedIsActive && options.collapsible ? $([]) : clicked,
-                               oldHeader: this.active,
-                               newContent: clickedIsActive && options.collapsible ? $([]) : toShow,
-                               oldContent: toHide
-                       },
-                       down = this.headers.index( this.active[0] ) > this.headers.index( clicked[0] );
-
-               // when the call to ._toggle() comes after the class changes
-               // it causes a very odd bug in IE 8 (see #6720)
-               this.active = clickedIsActive ? $([]) : clicked;
-               this._toggle( toShow, toHide, data, clickedIsActive, down );
-
-               // switch classes
-               active
-                       .removeClass( "ui-state-active ui-corner-top" )
-                       .addClass( "ui-state-default ui-corner-all" )
-                       .children( ".ui-icon" )
-                               .removeClass( options.icons.headerSelected )
-                               .addClass( options.icons.header );
-               if ( !clickedIsActive ) {
-                       clicked
-                               .removeClass( "ui-state-default ui-corner-all" )
-                               .addClass( "ui-state-active ui-corner-top" )
-                               .children( ".ui-icon" )
-                                       .removeClass( options.icons.header )
-                                       .addClass( options.icons.headerSelected );
-                       clicked
-                               .next()
-                               .addClass( "ui-accordion-content-active" );
-               }
-
-               return;
-       },
-
-       _toggle: function( toShow, toHide, data, clickedIsActive, down ) {
-               var self = this,
-                       options = self.options;
-
-               self.toShow = toShow;
-               self.toHide = toHide;
-               self.data = data;
-
-               var complete = function() {
-                       if ( !self ) {
-                               return;
-                       }
-                       return self._completed.apply( self, arguments );
-               };
-
-               // trigger changestart event
-               self._trigger( "changestart", null, self.data );
-
-               // count elements to animate
-               self.running = toHide.size() === 0 ? toShow.size() : toHide.size();
-
-               if ( options.animated ) {
-                       var animOptions = {};
-
-                       if ( options.collapsible && clickedIsActive ) {
-                               animOptions = {
-                                       toShow: $( [] ),
-                                       toHide: toHide,
-                                       complete: complete,
-                                       down: down,
-                                       autoHeight: options.autoHeight || options.fillSpace
-                               };
-                       } else {
-                               animOptions = {
-                                       toShow: toShow,
-                                       toHide: toHide,
-                                       complete: complete,
-                                       down: down,
-                                       autoHeight: options.autoHeight || options.fillSpace
-                               };
-                       }
-
-                       if ( !options.proxied ) {
-                               options.proxied = options.animated;
-                       }
-
-                       if ( !options.proxiedDuration ) {
-                               options.proxiedDuration = options.duration;
-                       }
-
-                       options.animated = $.isFunction( options.proxied ) ?
-                               options.proxied( animOptions ) :
-                               options.proxied;
-
-                       options.duration = $.isFunction( options.proxiedDuration ) ?
-                               options.proxiedDuration( animOptions ) :
-                               options.proxiedDuration;
-
-                       var animations = $.ui.accordion.animations,
-                               duration = options.duration,
-                               easing = options.animated;
-
-                       if ( easing && !animations[ easing ] && !$.easing[ easing ] ) {
-                               easing = "slide";
-                       }
-                       if ( !animations[ easing ] ) {
-                               animations[ easing ] = function( options ) {
-                                       this.slide( options, {
-                                               easing: easing,
-                                               duration: duration || 700
-                                       });
-                               };
-                       }
-
-                       animations[ easing ]( animOptions );
-               } else {
-                       if ( options.collapsible && clickedIsActive ) {
-                               toShow.toggle();
-                       } else {
-                               toHide.hide();
-                               toShow.show();
-                       }
-
-                       complete( true );
-               }
-
-               // TODO assert that the blur and focus triggers are really necessary, remove otherwise
-               toHide.prev()
-                       .attr({
-                               "aria-expanded": "false",
-                               "aria-selected": "false",
-                               tabIndex: -1
-                       })
-                       .blur();
-               toShow.prev()
-                       .attr({
-                               "aria-expanded": "true",
-                               "aria-selected": "true",
-                               tabIndex: 0
-                       })
-                       .focus();
-       },
-
-       _completed: function( cancel ) {
-               this.running = cancel ? 0 : --this.running;
-               if ( this.running ) {
-                       return;
-               }
-
-               if ( this.options.clearStyle ) {
-                       this.toShow.add( this.toHide ).css({
-                               height: "",
-                               overflow: ""
-                       });
-               }
-
-               // other classes are removed before the animation; this one needs to stay until completed
-               this.toHide.removeClass( "ui-accordion-content-active" );
-               // Work around for rendering bug in IE (#5421)
-               if ( this.toHide.length ) {
-                       this.toHide.parent()[0].className = this.toHide.parent()[0].className;
-               }
-
-               this._trigger( "change", null, this.data );
-       }
-});
-
-$.extend( $.ui.accordion, {
-       version: "1.8.24",
-       animations: {
-               slide: function( options, additions ) {
-                       options = $.extend({
-                               easing: "swing",
-                               duration: 300
-                       }, options, additions );
-                       if ( !options.toHide.size() ) {
-                               options.toShow.animate({
-                                       height: "show",
-                                       paddingTop: "show",
-                                       paddingBottom: "show"
-                               }, options );
-                               return;
-                       }
-                       if ( !options.toShow.size() ) {
-                               options.toHide.animate({
-                                       height: "hide",
-                                       paddingTop: "hide",
-                                       paddingBottom: "hide"
-                               }, options );
-                               return;
-                       }
-                       var overflow = options.toShow.css( "overflow" ),
-                               percentDone = 0,
-                               showProps = {},
-                               hideProps = {},
-                               fxAttrs = [ "height", "paddingTop", "paddingBottom" ],
-                               originalWidth;
-                       // fix width before calculating height of hidden element
-                       var s = options.toShow;
-                       originalWidth = s[0].style.width;
-                       s.width( s.parent().width()
-                               - parseFloat( s.css( "paddingLeft" ) )
-                               - parseFloat( s.css( "paddingRight" ) )
-                               - ( parseFloat( s.css( "borderLeftWidth" ) ) || 0 )
-                               - ( parseFloat( s.css( "borderRightWidth" ) ) || 0 ) );
-
-                       $.each( fxAttrs, function( i, prop ) {
-                               hideProps[ prop ] = "hide";
-
-                               var parts = ( "" + $.css( options.toShow[0], prop ) ).match( /^([\d+-.]+)(.*)$/ );
-                               showProps[ prop ] = {
-                                       value: parts[ 1 ],
-                                       unit: parts[ 2 ] || "px"
-                               };
-                       });
-                       options.toShow.css({ height: 0, overflow: "hidden" }).show();
-                       options.toHide
-                               .filter( ":hidden" )
-                                       .each( options.complete )
-                               .end()
-                               .filter( ":visible" )
-                               .animate( hideProps, {
-                               step: function( now, settings ) {
-                                       // only calculate the percent when animating height
-                                       // IE gets very inconsistent results when animating elements
-                                       // with small values, which is common for padding
-                                       if ( settings.prop == "height" ) {
-                                               percentDone = ( settings.end - settings.start === 0 ) ? 0 :
-                                                       ( settings.now - settings.start ) / ( settings.end - settings.start );
-                                       }
-
-                                       options.toShow[ 0 ].style[ settings.prop ] =
-                                               ( percentDone * showProps[ settings.prop ].value )
-                                               + showProps[ settings.prop ].unit;
-                               },
-                               duration: options.duration,
-                               easing: options.easing,
-                               complete: function() {
-                                       if ( !options.autoHeight ) {
-                                               options.toShow.css( "height", "" );
-                                       }
-                                       options.toShow.css({
-                                               width: originalWidth,
-                                               overflow: overflow
-                                       });
-                                       options.complete();
-                               }
-                       });
-               },
-               bounceslide: function( options ) {
-                       this.slide( options, {
-                               easing: options.down ? "easeOutBounce" : "swing",
-                               duration: options.down ? 1000 : 200
-                       });
-               }
-       }
-});
-
-})( jQuery );
diff --git a/resources/jquery.ui/jquery.ui.autocomplete.js b/resources/jquery.ui/jquery.ui.autocomplete.js
deleted file mode 100644 (file)
index 8d69be2..0000000
+++ /dev/null
@@ -1,631 +0,0 @@
-/*!
- * jQuery UI Autocomplete 1.8.24
- *
- * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
- * Dual licensed under the MIT or GPL Version 2 licenses.
- * http://jquery.org/license
- *
- * http://docs.jquery.com/UI/Autocomplete
- *
- * Depends:
- *     jquery.ui.core.js
- *     jquery.ui.widget.js
- *     jquery.ui.position.js
- */
-(function( $, undefined ) {
-
-// used to prevent race conditions with remote data sources
-var requestIndex = 0;
-
-$.widget( "ui.autocomplete", {
-       options: {
-               appendTo: "body",
-               autoFocus: false,
-               delay: 300,
-               minLength: 1,
-               position: {
-                       my: "left top",
-                       at: "left bottom",
-                       collision: "none"
-               },
-               source: null
-       },
-
-       pending: 0,
-
-       _create: function() {
-               var self = this,
-                       doc = this.element[ 0 ].ownerDocument,
-                       suppressKeyPress;
-               this.isMultiLine = this.element.is( "textarea" );
-
-               this.element
-                       .addClass( "ui-autocomplete-input" )
-                       .attr( "autocomplete", "off" )
-                       // TODO verify these actually work as intended
-                       .attr({
-                               role: "textbox",
-                               "aria-autocomplete": "list",
-                               "aria-haspopup": "true"
-                       })
-                       .bind( "keydown.autocomplete", function( event ) {
-                               if ( self.options.disabled || self.element.propAttr( "readOnly" ) ) {
-                                       return;
-                               }
-
-                               suppressKeyPress = false;
-                               var keyCode = $.ui.keyCode;
-                               switch( event.keyCode ) {
-                               case keyCode.PAGE_UP:
-                                       self._move( "previousPage", event );
-                                       break;
-                               case keyCode.PAGE_DOWN:
-                                       self._move( "nextPage", event );
-                                       break;
-                               case keyCode.UP:
-                                       self._keyEvent( "previous", event );
-                                       break;
-                               case keyCode.DOWN:
-                                       self._keyEvent( "next", event );
-                                       break;
-                               case keyCode.ENTER:
-                               case keyCode.NUMPAD_ENTER:
-                                       // when menu is open and has focus
-                                       if ( self.menu.active ) {
-                                               // #6055 - Opera still allows the keypress to occur
-                                               // which causes forms to submit
-                                               suppressKeyPress = true;
-                                               event.preventDefault();
-                                       }
-                                       //passthrough - ENTER and TAB both select the current element
-                               case keyCode.TAB:
-                                       if ( !self.menu.active ) {
-                                               return;
-                                       }
-                                       self.menu.select( event );
-                                       break;
-                               case keyCode.ESCAPE:
-                                       self.element.val( self.term );
-                                       self.close( event );
-                                       break;
-                               default:
-                                       // keypress is triggered before the input value is changed
-                                       clearTimeout( self.searching );
-                                       self.searching = setTimeout(function() {
-                                               // only search if the value has changed
-                                               if ( self.term != self.element.val() ) {
-                                                       self.selectedItem = null;
-                                                       self.search( null, event );
-                                               }
-                                       }, self.options.delay );
-                                       break;
-                               }
-                       })
-                       .bind( "keypress.autocomplete", function( event ) {
-                               if ( suppressKeyPress ) {
-                                       suppressKeyPress = false;
-                                       event.preventDefault();
-                               }
-                       })
-                       .bind( "focus.autocomplete", function() {
-                               if ( self.options.disabled ) {
-                                       return;
-                               }
-
-                               self.selectedItem = null;
-                               self.previous = self.element.val();
-                       })
-                       .bind( "blur.autocomplete", function( event ) {
-                               if ( self.options.disabled ) {
-                                       return;
-                               }
-
-                               clearTimeout( self.searching );
-                               // clicks on the menu (or a button to trigger a search) will cause a blur event
-                               self.closing = setTimeout(function() {
-                                       self.close( event );
-                                       self._change( event );
-                               }, 150 );
-                       });
-               this._initSource();
-               this.menu = $( "<ul></ul>" )
-                       .addClass( "ui-autocomplete" )
-                       .appendTo( $( this.options.appendTo || "body", doc )[0] )
-                       // prevent the close-on-blur in case of a "slow" click on the menu (long mousedown)
-                       .mousedown(function( event ) {
-                               // clicking on the scrollbar causes focus to shift to the body
-                               // but we can't detect a mouseup or a click immediately afterward
-                               // so we have to track the next mousedown and close the menu if
-                               // the user clicks somewhere outside of the autocomplete
-                               var menuElement = self.menu.element[ 0 ];
-                               if ( !$( event.target ).closest( ".ui-menu-item" ).length ) {
-                                       setTimeout(function() {
-                                               $( document ).one( 'mousedown', function( event ) {
-                                                       if ( event.target !== self.element[ 0 ] &&
-                                                               event.target !== menuElement &&
-                                                               !$.ui.contains( menuElement, event.target ) ) {
-                                                               self.close();
-                                                       }
-                                               });
-                                       }, 1 );
-                               }
-
-                               // use another timeout to make sure the blur-event-handler on the input was already triggered
-                               setTimeout(function() {
-                                       clearTimeout( self.closing );
-                               }, 13);
-                       })
-                       .menu({
-                               focus: function( event, ui ) {
-                                       var item = ui.item.data( "item.autocomplete" );
-                                       if ( false !== self._trigger( "focus", event, { item: item } ) ) {
-                                               // use value to match what will end up in the input, if it was a key event
-                                               if ( /^key/.test(event.originalEvent.type) ) {
-                                                       self.element.val( item.value );
-                                               }
-                                       }
-                               },
-                               selected: function( event, ui ) {
-                                       var item = ui.item.data( "item.autocomplete" ),
-                                               previous = self.previous;
-
-                                       // only trigger when focus was lost (click on menu)
-                                       if ( self.element[0] !== doc.activeElement ) {
-                                               self.element.focus();
-                                               self.previous = previous;
-                                               // #6109 - IE triggers two focus events and the second
-                                               // is asynchronous, so we need to reset the previous
-                                               // term synchronously and asynchronously :-(
-                                               setTimeout(function() {
-                                                       self.previous = previous;
-                                                       self.selectedItem = item;
-                                               }, 1);
-                                       }
-
-                                       if ( false !== self._trigger( "select", event, { item: item } ) ) {
-                                               self.element.val( item.value );
-                                       }
-                                       // reset the term after the select event
-                                       // this allows custom select handling to work properly
-                                       self.term = self.element.val();
-
-                                       self.close( event );
-                                       self.selectedItem = item;
-                               },
-                               blur: function( event, ui ) {
-                                       // don't set the value of the text field if it's already correct
-                                       // this prevents moving the cursor unnecessarily
-                                       if ( self.menu.element.is(":visible") &&
-                                               ( self.element.val() !== self.term ) ) {
-                                               self.element.val( self.term );
-                                       }
-                               }
-                       })
-                       .zIndex( this.element.zIndex() + 1 )
-                       // workaround for jQuery bug #5781 http://dev.jquery.com/ticket/5781
-                       .css({ top: 0, left: 0 })
-                       .hide()
-                       .data( "menu" );
-               if ( $.fn.bgiframe ) {
-                        this.menu.element.bgiframe();
-               }
-               // turning off autocomplete prevents the browser from remembering the
-               // value when navigating through history, so we re-enable autocomplete
-               // if the page is unloaded before the widget is destroyed. #7790
-               self.beforeunloadHandler = function() {
-                       self.element.removeAttr( "autocomplete" );
-               };
-               $( window ).bind( "beforeunload", self.beforeunloadHandler );
-       },
-
-       destroy: function() {
-               this.element
-                       .removeClass( "ui-autocomplete-input" )
-                       .removeAttr( "autocomplete" )
-                       .removeAttr( "role" )
-                       .removeAttr( "aria-autocomplete" )
-                       .removeAttr( "aria-haspopup" );
-               this.menu.element.remove();
-               $( window ).unbind( "beforeunload", this.beforeunloadHandler );
-               $.Widget.prototype.destroy.call( this );
-       },
-
-       _setOption: function( key, value ) {
-               $.Widget.prototype._setOption.apply( this, arguments );
-               if ( key === "source" ) {
-                       this._initSource();
-               }
-               if ( key === "appendTo" ) {
-                       this.menu.element.appendTo( $( value || "body", this.element[0].ownerDocument )[0] )
-               }
-               if ( key === "disabled" && value && this.xhr ) {
-                       this.xhr.abort();
-               }
-       },
-
-       _initSource: function() {
-               var self = this,
-                       array,
-                       url;
-               if ( $.isArray(this.options.source) ) {
-                       array = this.options.source;
-                       this.source = function( request, response ) {
-                               response( $.ui.autocomplete.filter(array, request.term) );
-                       };
-               } else if ( typeof this.options.source === "string" ) {
-                       url = this.options.source;
-                       this.source = function( request, response ) {
-                               if ( self.xhr ) {
-                                       self.xhr.abort();
-                               }
-                               self.xhr = $.ajax({
-                                       url: url,
-                                       data: request,
-                                       dataType: "json",
-                                       success: function( data, status ) {
-                                               response( data );
-                                       },
-                                       error: function() {
-                                               response( [] );
-                                       }
-                               });
-                       };
-               } else {
-                       this.source = this.options.source;
-               }
-       },
-
-       search: function( value, event ) {
-               value = value != null ? value : this.element.val();
-
-               // always save the actual value, not the one passed as an argument
-               this.term = this.element.val();
-
-               if ( value.length < this.options.minLength ) {
-                       return this.close( event );
-               }
-
-               clearTimeout( this.closing );
-               if ( this._trigger( "search", event ) === false ) {
-                       return;
-               }
-
-               return this._search( value );
-       },
-
-       _search: function( value ) {
-               this.pending++;
-               this.element.addClass( "ui-autocomplete-loading" );
-
-               this.source( { term: value }, this._response() );
-       },
-
-       _response: function() {
-               var that = this,
-                       index = ++requestIndex;
-
-               return function( content ) {
-                       if ( index === requestIndex ) {
-                               that.__response( content );
-                       }
-
-                       that.pending--;
-                       if ( !that.pending ) {
-                               that.element.removeClass( "ui-autocomplete-loading" );
-                       }
-               };
-       },
-
-       __response: function( content ) {
-               if ( !this.options.disabled && content && content.length ) {
-                       content = this._normalize( content );
-                       this._suggest( content );
-                       this._trigger( "open" );
-               } else {
-                       this.close();
-               }
-       },
-
-       close: function( event ) {
-               clearTimeout( this.closing );
-               if ( this.menu.element.is(":visible") ) {
-                       this.menu.element.hide();
-                       this.menu.deactivate();
-                       this._trigger( "close", event );
-               }
-       },
-       
-       _change: function( event ) {
-               if ( this.previous !== this.element.val() ) {
-                       this._trigger( "change", event, { item: this.selectedItem } );
-               }
-       },
-
-       _normalize: function( items ) {
-               // assume all items have the right format when the first item is complete
-               if ( items.length && items[0].label && items[0].value ) {
-                       return items;
-               }
-               return $.map( items, function(item) {
-                       if ( typeof item === "string" ) {
-                               return {
-                                       label: item,
-                                       value: item
-                               };
-                       }
-                       return $.extend({
-                               label: item.label || item.value,
-                               value: item.value || item.label
-                       }, item );
-               });
-       },
-
-       _suggest: function( items ) {
-               var ul = this.menu.element
-                       .empty()
-                       .zIndex( this.element.zIndex() + 1 );
-               this._renderMenu( ul, items );
-               // TODO refresh should check if the active item is still in the dom, removing the need for a manual deactivate
-               this.menu.deactivate();
-               this.menu.refresh();
-
-               // size and position menu
-               ul.show();
-               this._resizeMenu();
-               ul.position( $.extend({
-                       of: this.element
-               }, this.options.position ));
-
-               if ( this.options.autoFocus ) {
-                       this.menu.next( new $.Event("mouseover") );
-               }
-       },
-
-       _resizeMenu: function() {
-               var ul = this.menu.element;
-               ul.outerWidth( Math.max(
-                       // Firefox wraps long text (possibly a rounding bug)
-                       // so we add 1px to avoid the wrapping (#7513)
-                       ul.width( "" ).outerWidth() + 1,
-                       this.element.outerWidth()
-               ) );
-       },
-
-       _renderMenu: function( ul, items ) {
-               var self = this;
-               $.each( items, function( index, item ) {
-                       self._renderItem( ul, item );
-               });
-       },
-
-       _renderItem: function( ul, item) {
-               return $( "<li></li>" )
-                       .data( "item.autocomplete", item )
-                       .append( $( "<a></a>" ).text( item.label ) )
-                       .appendTo( ul );
-       },
-
-       _move: function( direction, event ) {
-               if ( !this.menu.element.is(":visible") ) {
-                       this.search( null, event );
-                       return;
-               }
-               if ( this.menu.first() && /^previous/.test(direction) ||
-                               this.menu.last() && /^next/.test(direction) ) {
-                       this.element.val( this.term );
-                       this.menu.deactivate();
-                       return;
-               }
-               this.menu[ direction ]( event );
-       },
-
-       widget: function() {
-               return this.menu.element;
-       },
-       _keyEvent: function( keyEvent, event ) {
-               if ( !this.isMultiLine || this.menu.element.is( ":visible" ) ) {
-                       this._move( keyEvent, event );
-
-                       // prevents moving cursor to beginning/end of the text field in some browsers
-                       event.preventDefault();
-               }
-       }
-});
-
-$.extend( $.ui.autocomplete, {
-       escapeRegex: function( value ) {
-               return value.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&");
-       },
-       filter: function(array, term) {
-               var matcher = new RegExp( $.ui.autocomplete.escapeRegex(term), "i" );
-               return $.grep( array, function(value) {
-                       return matcher.test( value.label || value.value || value );
-               });
-       }
-});
-
-}( jQuery ));
-
-/*
- * jQuery UI Menu (not officially released)
- * 
- * This widget isn't yet finished and the API is subject to change. We plan to finish
- * it for the next release. You're welcome to give it a try anyway and give us feedback,
- * as long as you're okay with migrating your code later on. We can help with that, too.
- *
- * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
- * Dual licensed under the MIT or GPL Version 2 licenses.
- * http://jquery.org/license
- *
- * http://docs.jquery.com/UI/Menu
- *
- * Depends:
- *     jquery.ui.core.js
- *  jquery.ui.widget.js
- */
-(function($) {
-
-$.widget("ui.menu", {
-       _create: function() {
-               var self = this;
-               this.element
-                       .addClass("ui-menu ui-widget ui-widget-content ui-corner-all")
-                       .attr({
-                               role: "listbox",
-                               "aria-activedescendant": "ui-active-menuitem"
-                       })
-                       .click(function( event ) {
-                               if ( !$( event.target ).closest( ".ui-menu-item a" ).length ) {
-                                       return;
-                               }
-                               // temporary
-                               event.preventDefault();
-                               self.select( event );
-                       });
-               this.refresh();
-       },
-       
-       refresh: function() {
-               var self = this;
-
-               // don't refresh list items that are already adapted
-               var items = this.element.children("li:not(.ui-menu-item):has(a)")
-                       .addClass("ui-menu-item")
-                       .attr("role", "menuitem");
-               
-               items.children("a")
-                       .addClass("ui-corner-all")
-                       .attr("tabindex", -1)
-                       // mouseenter doesn't work with event delegation
-                       .mouseenter(function( event ) {
-                               self.activate( event, $(this).parent() );
-                       })
-                       .mouseleave(function() {
-                               self.deactivate();
-                       });
-       },
-
-       activate: function( event, item ) {
-               this.deactivate();
-               if (this.hasScroll()) {
-                       var offset = item.offset().top - this.element.offset().top,
-                               scroll = this.element.scrollTop(),
-                               elementHeight = this.element.height();
-                       if (offset < 0) {
-                               this.element.scrollTop( scroll + offset);
-                       } else if (offset >= elementHeight) {
-                               this.element.scrollTop( scroll + offset - elementHeight + item.height());
-                       }
-               }
-               this.active = item.eq(0)
-                       .children("a")
-                               .addClass("ui-state-hover")
-                               .attr("id", "ui-active-menuitem")
-                       .end();
-               this._trigger("focus", event, { item: item });
-       },
-
-       deactivate: function() {
-               if (!this.active) { return; }
-
-               this.active.children("a")
-                       .removeClass("ui-state-hover")
-                       .removeAttr("id");
-               this._trigger("blur");
-               this.active = null;
-       },
-
-       next: function(event) {
-               this.move("next", ".ui-menu-item:first", event);
-       },
-
-       previous: function(event) {
-               this.move("prev", ".ui-menu-item:last", event);
-       },
-
-       first: function() {
-               return this.active && !this.active.prevAll(".ui-menu-item").length;
-       },
-
-       last: function() {
-               return this.active && !this.active.nextAll(".ui-menu-item").length;
-       },
-
-       move: function(direction, edge, event) {
-               if (!this.active) {
-                       this.activate(event, this.element.children(edge));
-                       return;
-               }
-               var next = this.active[direction + "All"](".ui-menu-item").eq(0);
-               if (next.length) {
-                       this.activate(event, next);
-               } else {
-                       this.activate(event, this.element.children(edge));
-               }
-       },
-
-       // TODO merge with previousPage
-       nextPage: function(event) {
-               if (this.hasScroll()) {
-                       // TODO merge with no-scroll-else
-                       if (!this.active || this.last()) {
-                               this.activate(event, this.element.children(".ui-menu-item:first"));
-                               return;
-                       }
-                       var base = this.active.offset().top,
-                               height = this.element.height(),
-                               result = this.element.children(".ui-menu-item").filter(function() {
-                                       var close = $(this).offset().top - base - height + $(this).height();
-                                       // TODO improve approximation
-                                       return close < 10 && close > -10;
-                               });
-
-                       // TODO try to catch this earlier when scrollTop indicates the last page anyway
-                       if (!result.length) {
-                               result = this.element.children(".ui-menu-item:last");
-                       }
-                       this.activate(event, result);
-               } else {
-                       this.activate(event, this.element.children(".ui-menu-item")
-                               .filter(!this.active || this.last() ? ":first" : ":last"));
-               }
-       },
-
-       // TODO merge with nextPage
-       previousPage: function(event) {
-               if (this.hasScroll()) {
-                       // TODO merge with no-scroll-else
-                       if (!this.active || this.first()) {
-                               this.activate(event, this.element.children(".ui-menu-item:last"));
-                               return;
-                       }
-
-                       var base = this.active.offset().top,
-                               height = this.element.height(),
-                               result = this.element.children(".ui-menu-item").filter(function() {
-                                       var close = $(this).offset().top - base + height - $(this).height();
-                                       // TODO improve approximation
-                                       return close < 10 && close > -10;
-                               });
-
-                       // TODO try to catch this earlier when scrollTop indicates the last page anyway
-                       if (!result.length) {
-                               result = this.element.children(".ui-menu-item:first");
-                       }
-                       this.activate(event, result);
-               } else {
-                       this.activate(event, this.element.children(".ui-menu-item")
-                               .filter(!this.active || this.first() ? ":last" : ":first"));
-               }
-       },
-
-       hasScroll: function() {
-               return this.element.height() < this.element[ $.fn.prop ? "prop" : "attr" ]("scrollHeight");
-       },
-
-       select: function( event ) {
-               this._trigger("selected", event, { item: this.active });
-       }
-});
-
-}(jQuery));
diff --git a/resources/jquery.ui/jquery.ui.button.js b/resources/jquery.ui/jquery.ui.button.js
deleted file mode 100644 (file)
index 8326262..0000000
+++ /dev/null
@@ -1,414 +0,0 @@
-/*!
- * jQuery UI Button 1.8.24
- *
- * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
- * Dual licensed under the MIT or GPL Version 2 licenses.
- * http://jquery.org/license
- *
- * http://docs.jquery.com/UI/Button
- *
- * Depends:
- *     jquery.ui.core.js
- *     jquery.ui.widget.js
- */
-(function( $, undefined ) {
-
-var lastActive, startXPos, startYPos, clickDragged,
-       baseClasses = "ui-button ui-widget ui-state-default ui-corner-all",
-       stateClasses = "ui-state-hover ui-state-active ",
-       typeClasses = "ui-button-icons-only ui-button-icon-only ui-button-text-icons ui-button-text-icon-primary ui-button-text-icon-secondary ui-button-text-only",
-       formResetHandler = function() {
-               var buttons = $( this ).find( ":ui-button" );
-               setTimeout(function() {
-                       buttons.button( "refresh" );
-               }, 1 );
-       },
-       radioGroup = function( radio ) {
-               var name = radio.name,
-                       form = radio.form,
-                       radios = $( [] );
-               if ( name ) {
-                       if ( form ) {
-                               radios = $( form ).find( "[name='" + name + "']" );
-                       } else {
-                               radios = $( "[name='" + name + "']", radio.ownerDocument )
-                                       .filter(function() {
-                                               return !this.form;
-                                       });
-                       }
-               }
-               return radios;
-       };
-
-$.widget( "ui.button", {
-       options: {
-               disabled: null,
-               text: true,
-               label: null,
-               icons: {
-                       primary: null,
-                       secondary: null
-               }
-       },
-       _create: function() {
-               this.element.closest( "form" )
-                       .unbind( "reset.button" )
-                       .bind( "reset.button", formResetHandler );
-
-               if ( typeof this.options.disabled !== "boolean" ) {
-                       this.options.disabled = !!this.element.propAttr( "disabled" );
-               } else {
-                       this.element.propAttr( "disabled", this.options.disabled );
-               }
-
-               this._determineButtonType();
-               this.hasTitle = !!this.buttonElement.attr( "title" );
-
-               var self = this,
-                       options = this.options,
-                       toggleButton = this.type === "checkbox" || this.type === "radio",
-                       hoverClass = "ui-state-hover" + ( !toggleButton ? " ui-state-active" : "" ),
-                       focusClass = "ui-state-focus";
-
-               if ( options.label === null ) {
-                       options.label = this.buttonElement.html();
-               }
-
-               this.buttonElement
-                       .addClass( baseClasses )
-                       .attr( "role", "button" )
-                       .bind( "mouseenter.button", function() {
-                               if ( options.disabled ) {
-                                       return;
-                               }
-                               $( this ).addClass( "ui-state-hover" );
-                               if ( this === lastActive ) {
-                                       $( this ).addClass( "ui-state-active" );
-                               }
-                       })
-                       .bind( "mouseleave.button", function() {
-                               if ( options.disabled ) {
-                                       return;
-                               }
-                               $( this ).removeClass( hoverClass );
-                       })
-                       .bind( "click.button", function( event ) {
-                               if ( options.disabled ) {
-                                       event.preventDefault();
-                                       event.stopImmediatePropagation();
-                               }
-                       });
-
-               this.element
-                       .bind( "focus.button", function() {
-                               // no need to check disabled, focus won't be triggered anyway
-                               self.buttonElement.addClass( focusClass );
-                       })
-                       .bind( "blur.button", function() {
-                               self.buttonElement.removeClass( focusClass );
-                       });
-
-               if ( toggleButton ) {
-                       this.element.bind( "change.button", function() {
-                               if ( clickDragged ) {
-                                       return;
-                               }
-                               self.refresh();
-                       });
-                       // if mouse moves between mousedown and mouseup (drag) set clickDragged flag
-                       // prevents issue where button state changes but checkbox/radio checked state
-                       // does not in Firefox (see ticket #6970)
-                       this.buttonElement
-                               .bind( "mousedown.button", function( event ) {
-                                       if ( options.disabled ) {
-                                               return;
-                                       }
-                                       clickDragged = false;
-                                       startXPos = event.pageX;
-                                       startYPos = event.pageY;
-                               })
-                               .bind( "mouseup.button", function( event ) {
-                                       if ( options.disabled ) {
-                                               return;
-                                       }
-                                       if ( startXPos !== event.pageX || startYPos !== event.pageY ) {
-                                               clickDragged = true;
-                                       }
-                       });
-               }
-
-               if ( this.type === "checkbox" ) {
-                       this.buttonElement.bind( "click.button", function() {
-                               if ( options.disabled || clickDragged ) {
-                                       return false;
-                               }
-                               $( this ).toggleClass( "ui-state-active" );
-                               self.buttonElement.attr( "aria-pressed", self.element[0].checked );
-                       });
-               } else if ( this.type === "radio" ) {
-                       this.buttonElement.bind( "click.button", function() {
-                               if ( options.disabled || clickDragged ) {
-                                       return false;
-                               }
-                               $( this ).addClass( "ui-state-active" );
-                               self.buttonElement.attr( "aria-pressed", "true" );
-
-                               var radio = self.element[ 0 ];
-                               radioGroup( radio )
-                                       .not( radio )
-                                       .map(function() {
-                                               return $( this ).button( "widget" )[ 0 ];
-                                       })
-                                       .removeClass( "ui-state-active" )
-                                       .attr( "aria-pressed", "false" );
-                       });
-               } else {
-                       this.buttonElement
-                               .bind( "mousedown.button", function() {
-                                       if ( options.disabled ) {
-                                               return false;
-                                       }
-                                       $( this ).addClass( "ui-state-active" );
-                                       lastActive = this;
-                                       $( document ).one( "mouseup", function() {
-                                               lastActive = null;
-                                       });
-                               })
-                               .bind( "mouseup.button", function() {
-                                       if ( options.disabled ) {
-                                               return false;
-                                       }
-                                       $( this ).removeClass( "ui-state-active" );
-                               })
-                               .bind( "keydown.button", function(event) {
-                                       if ( options.disabled ) {
-                                               return false;
-                                       }
-                                       if ( event.keyCode == $.ui.keyCode.SPACE || event.keyCode == $.ui.keyCode.ENTER ) {
-                                               $( this ).addClass( "ui-state-active" );
-                                       }
-                               })
-                               .bind( "keyup.button", function() {
-                                       $( this ).removeClass( "ui-state-active" );
-                               });
-
-                       if ( this.buttonElement.is("a") ) {
-                               this.buttonElement.keyup(function(event) {
-                                       if ( event.keyCode === $.ui.keyCode.SPACE ) {
-                                               // TODO pass through original event correctly (just as 2nd argument doesn't work)
-                                               $( this ).click();
-                                       }
-                               });
-                       }
-               }
-
-               // TODO: pull out $.Widget's handling for the disabled option into
-               // $.Widget.prototype._setOptionDisabled so it's easy to proxy and can
-               // be overridden by individual plugins
-               this._setOption( "disabled", options.disabled );
-               this._resetButton();
-       },
-
-       _determineButtonType: function() {
-
-               if ( this.element.is(":checkbox") ) {
-                       this.type = "checkbox";
-               } else if ( this.element.is(":radio") ) {
-                       this.type = "radio";
-               } else if ( this.element.is("input") ) {
-                       this.type = "input";
-               } else {
-                       this.type = "button";
-               }
-
-               if ( this.type === "checkbox" || this.type === "radio" ) {
-                       // we don't search against the document in case the element
-                       // is disconnected from the DOM
-                       var ancestor = this.element.parents().filter(":last"),
-                               labelSelector = "label[for='" + this.element.attr("id") + "']";
-                       this.buttonElement = ancestor.find( labelSelector );
-                       if ( !this.buttonElement.length ) {
-                               ancestor = ancestor.length ? ancestor.siblings() : this.element.siblings();
-                               this.buttonElement = ancestor.filter( labelSelector );
-                               if ( !this.buttonElement.length ) {
-                                       this.buttonElement = ancestor.find( labelSelector );
-                               }
-                       }
-                       this.element.addClass( "ui-helper-hidden-accessible" );
-
-                       var checked = this.element.is( ":checked" );
-                       if ( checked ) {
-                               this.buttonElement.addClass( "ui-state-active" );
-                       }
-                       this.buttonElement.attr( "aria-pressed", checked );
-               } else {
-                       this.buttonElement = this.element;
-               }
-       },
-
-       widget: function() {
-               return this.buttonElement;
-       },
-
-       destroy: function() {
-               this.element
-                       .removeClass( "ui-helper-hidden-accessible" );
-               this.buttonElement
-                       .removeClass( baseClasses + " " + stateClasses + " " + typeClasses )
-                       .removeAttr( "role" )
-                       .removeAttr( "aria-pressed" )
-                       .html( this.buttonElement.find(".ui-button-text").html() );
-
-               if ( !this.hasTitle ) {
-                       this.buttonElement.removeAttr( "title" );
-               }
-
-               $.Widget.prototype.destroy.call( this );
-       },
-
-       _setOption: function( key, value ) {
-               $.Widget.prototype._setOption.apply( this, arguments );
-               if ( key === "disabled" ) {
-                       if ( value ) {
-                               this.element.propAttr( "disabled", true );
-                       } else {
-                               this.element.propAttr( "disabled", false );
-                       }
-                       return;
-               }
-               this._resetButton();
-       },
-
-       refresh: function() {
-               var isDisabled = this.element.is( ":disabled" );
-               if ( isDisabled !== this.options.disabled ) {
-                       this._setOption( "disabled", isDisabled );
-               }
-               if ( this.type === "radio" ) {
-                       radioGroup( this.element[0] ).each(function() {
-                               if ( $( this ).is( ":checked" ) ) {
-                                       $( this ).button( "widget" )
-                                               .addClass( "ui-state-active" )
-                                               .attr( "aria-pressed", "true" );
-                               } else {
-                                       $( this ).button( "widget" )
-                                               .removeClass( "ui-state-active" )
-                                               .attr( "aria-pressed", "false" );
-                               }
-                       });
-               } else if ( this.type === "checkbox" ) {
-                       if ( this.element.is( ":checked" ) ) {
-                               this.buttonElement
-                                       .addClass( "ui-state-active" )
-                                       .attr( "aria-pressed", "true" );
-                       } else {
-                               this.buttonElement
-                                       .removeClass( "ui-state-active" )
-                                       .attr( "aria-pressed", "false" );
-                       }
-               }
-       },
-
-       _resetButton: function() {
-               if ( this.type === "input" ) {
-                       if ( this.options.label ) {
-                               this.element.val( this.options.label );
-                       }
-                       return;
-               }
-               var buttonElement = this.buttonElement.removeClass( typeClasses ),
-                       buttonText = $( "<span></span>", this.element[0].ownerDocument )
-                               .addClass( "ui-button-text" )
-                               .html( this.options.label )
-                               .appendTo( buttonElement.empty() )
-                               .text(),
-                       icons = this.options.icons,
-                       multipleIcons = icons.primary && icons.secondary,
-                       buttonClasses = [];  
-
-               if ( icons.primary || icons.secondary ) {
-                       if ( this.options.text ) {
-                               buttonClasses.push( "ui-button-text-icon" + ( multipleIcons ? "s" : ( icons.primary ? "-primary" : "-secondary" ) ) );
-                       }
-
-                       if ( icons.primary ) {
-                               buttonElement.prepend( "<span class='ui-button-icon-primary ui-icon " + icons.primary + "'></span>" );
-                       }
-
-                       if ( icons.secondary ) {
-                               buttonElement.append( "<span class='ui-button-icon-secondary ui-icon " + icons.secondary + "'></span>" );
-                       }
-
-                       if ( !this.options.text ) {
-                               buttonClasses.push( multipleIcons ? "ui-button-icons-only" : "ui-button-icon-only" );
-
-                               if ( !this.hasTitle ) {
-                                       buttonElement.attr( "title", buttonText );
-                               }
-                       }
-               } else {
-                       buttonClasses.push( "ui-button-text-only" );
-               }
-               buttonElement.addClass( buttonClasses.join( " " ) );
-       }
-});
-
-$.widget( "ui.buttonset", {
-       options: {
-               items: ":button, :submit, :reset, :checkbox, :radio, a, :data(button)"
-       },
-
-       _create: function() {
-               this.element.addClass( "ui-buttonset" );
-       },
-       
-       _init: function() {
-               this.refresh();
-       },
-
-       _setOption: function( key, value ) {
-               if ( key === "disabled" ) {
-                       this.buttons.button( "option", key, value );
-               }
-
-               $.Widget.prototype._setOption.apply( this, arguments );
-       },
-       
-       refresh: function() {
-               var rtl = this.element.css( "direction" ) === "rtl";
-               
-               this.buttons = this.element.find( this.options.items )
-                       .filter( ":ui-button" )
-                               .button( "refresh" )
-                       .end()
-                       .not( ":ui-button" )
-                               .button()
-                       .end()
-                       .map(function() {
-                               return $( this ).button( "widget" )[ 0 ];
-                       })
-                               .removeClass( "ui-corner-all ui-corner-left ui-corner-right" )
-                               .filter( ":first" )
-                                       .addClass( rtl ? "ui-corner-right" : "ui-corner-left" )
-                               .end()
-                               .filter( ":last" )
-                                       .addClass( rtl ? "ui-corner-left" : "ui-corner-right" )
-                               .end()
-                       .end();
-       },
-
-       destroy: function() {
-               this.element.removeClass( "ui-buttonset" );
-               this.buttons
-                       .map(function() {
-                               return $( this ).button( "widget" )[ 0 ];
-                       })
-                               .removeClass( "ui-corner-left ui-corner-right" )
-                       .end()
-                       .button( "destroy" );
-
-               $.Widget.prototype.destroy.call( this );
-       }
-});
-
-}( jQuery ) );
diff --git a/resources/jquery.ui/jquery.ui.core.js b/resources/jquery.ui/jquery.ui.core.js
deleted file mode 100644 (file)
index b36c1ac..0000000
+++ /dev/null
@@ -1,334 +0,0 @@
-/*!
- * jQuery UI 1.8.24
- *
- * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
- * Dual licensed under the MIT or GPL Version 2 licenses.
- * http://jquery.org/license
- *
- * http://docs.jquery.com/UI
- */
-(function( $, undefined ) {
-
-// prevent duplicate loading
-// this is only a problem because we proxy existing functions
-// and we don't want to double proxy them
-$.ui = $.ui || {};
-if ( $.ui.version ) {
-       return;
-}
-
-$.extend( $.ui, {
-       version: "1.8.24",
-
-       keyCode: {
-               ALT: 18,
-               BACKSPACE: 8,
-               CAPS_LOCK: 20,
-               COMMA: 188,
-               COMMAND: 91,
-               COMMAND_LEFT: 91, // COMMAND
-               COMMAND_RIGHT: 93,
-               CONTROL: 17,
-               DELETE: 46,
-               DOWN: 40,
-               END: 35,
-               ENTER: 13,
-               ESCAPE: 27,
-               HOME: 36,
-               INSERT: 45,
-               LEFT: 37,
-               MENU: 93, // COMMAND_RIGHT
-               NUMPAD_ADD: 107,
-               NUMPAD_DECIMAL: 110,
-               NUMPAD_DIVIDE: 111,
-               NUMPAD_ENTER: 108,
-               NUMPAD_MULTIPLY: 106,
-               NUMPAD_SUBTRACT: 109,
-               PAGE_DOWN: 34,
-               PAGE_UP: 33,
-               PERIOD: 190,
-               RIGHT: 39,
-               SHIFT: 16,
-               SPACE: 32,
-               TAB: 9,
-               UP: 38,
-               WINDOWS: 91 // COMMAND
-       }
-});
-
-// plugins
-$.fn.extend({
-       propAttr: $.fn.prop || $.fn.attr,
-
-       _focus: $.fn.focus,
-       focus: function( delay, fn ) {
-               return typeof delay === "number" ?
-                       this.each(function() {
-                               var elem = this;
-                               setTimeout(function() {
-                                       $( elem ).focus();
-                                       if ( fn ) {
-                                               fn.call( elem );
-                                       }
-                               }, delay );
-                       }) :
-                       this._focus.apply( this, arguments );
-       },
-
-       scrollParent: function() {
-               var scrollParent;
-               if (($.browser.msie && (/(static|relative)/).test(this.css('position'))) || (/absolute/).test(this.css('position'))) {
-                       scrollParent = this.parents().filter(function() {
-                               return (/(relative|absolute|fixed)/).test($.curCSS(this,'position',1)) && (/(auto|scroll)/).test($.curCSS(this,'overflow',1)+$.curCSS(this,'overflow-y',1)+$.curCSS(this,'overflow-x',1));
-                       }).eq(0);
-               } else {
-                       scrollParent = this.parents().filter(function() {
-                               return (/(auto|scroll)/).test($.curCSS(this,'overflow',1)+$.curCSS(this,'overflow-y',1)+$.curCSS(this,'overflow-x',1));
-                       }).eq(0);
-               }
-
-               return (/fixed/).test(this.css('position')) || !scrollParent.length ? $(document) : scrollParent;
-       },
-
-       zIndex: function( zIndex ) {
-               if ( zIndex !== undefined ) {
-                       return this.css( "zIndex", zIndex );
-               }
-
-               if ( this.length ) {
-                       var elem = $( this[ 0 ] ), position, value;
-                       while ( elem.length && elem[ 0 ] !== document ) {
-                               // Ignore z-index if position is set to a value where z-index is ignored by the browser
-                               // This makes behavior of this function consistent across browsers
-                               // WebKit always returns auto if the element is positioned
-                               position = elem.css( "position" );
-                               if ( position === "absolute" || position === "relative" || position === "fixed" ) {
-                                       // IE returns 0 when zIndex is not specified
-                                       // other browsers return a string
-                                       // we ignore the case of nested elements with an explicit value of 0
-                                       // <div style="z-index: -10;"><div style="z-index: 0;"></div></div>
-                                       value = parseInt( elem.css( "zIndex" ), 10 );
-                                       if ( !isNaN( value ) && value !== 0 ) {
-                                               return value;
-                                       }
-                               }
-                               elem = elem.parent();
-                       }
-               }
-
-               return 0;
-       },
-
-       disableSelection: function() {
-               return this.bind( ( $.support.selectstart ? "selectstart" : "mousedown" ) +
-                       ".ui-disableSelection", function( event ) {
-                               event.preventDefault();
-                       });
-       },
-
-       enableSelection: function() {
-               return this.unbind( ".ui-disableSelection" );
-       }
-});
-
-// support: jQuery <1.8
-if ( !$( "<a>" ).outerWidth( 1 ).jquery ) {
-       $.each( [ "Width", "Height" ], function( i, name ) {
-               var side = name === "Width" ? [ "Left", "Right" ] : [ "Top", "Bottom" ],
-                       type = name.toLowerCase(),
-                       orig = {
-                               innerWidth: $.fn.innerWidth,
-                               innerHeight: $.fn.innerHeight,
-                               outerWidth: $.fn.outerWidth,
-                               outerHeight: $.fn.outerHeight
-                       };
-
-               function reduce( elem, size, border, margin ) {
-                       $.each( side, function() {
-                               size -= parseFloat( $.curCSS( elem, "padding" + this, true) ) || 0;
-                               if ( border ) {
-                                       size -= parseFloat( $.curCSS( elem, "border" + this + "Width", true) ) || 0;
-                               }
-                               if ( margin ) {
-                                       size -= parseFloat( $.curCSS( elem, "margin" + this, true) ) || 0;
-                               }
-                       });
-                       return size;
-               }
-
-               $.fn[ "inner" + name ] = function( size ) {
-                       if ( size === undefined ) {
-                               return orig[ "inner" + name ].call( this );
-                       }
-
-                       return this.each(function() {
-                               $( this ).css( type, reduce( this, size ) + "px" );
-                       });
-               };
-
-               $.fn[ "outer" + name] = function( size, margin ) {
-                       if ( typeof size !== "number" ) {
-                               return orig[ "outer" + name ].call( this, size );
-                       }
-
-                       return this.each(function() {
-                               $( this).css( type, reduce( this, size, true, margin ) + "px" );
-                       });
-               };
-       });
-}
-
-// selectors
-function focusable( element, isTabIndexNotNaN ) {
-       var nodeName = element.nodeName.toLowerCase();
-       if ( "area" === nodeName ) {
-               var map = element.parentNode,
-                       mapName = map.name,
-                       img;
-               if ( !element.href || !mapName || map.nodeName.toLowerCase() !== "map" ) {
-                       return false;
-               }
-               img = $( "img[usemap=#" + mapName + "]" )[0];
-               return !!img && visible( img );
-       }
-       return ( /input|select|textarea|button|object/.test( nodeName )
-               ? !element.disabled
-               : "a" == nodeName
-                       ? element.href || isTabIndexNotNaN
-                       : isTabIndexNotNaN)
-               // the element and all of its ancestors must be visible
-               && visible( element );
-}
-
-function visible( element ) {
-       return !$( element ).parents().andSelf().filter(function() {
-               return $.curCSS( this, "visibility" ) === "hidden" ||
-                       $.expr.filters.hidden( this );
-       }).length;
-}
-
-$.extend( $.expr[ ":" ], {
-       data: $.expr.createPseudo ?
-               $.expr.createPseudo(function( dataName ) {
-                       return function( elem ) {
-                               return !!$.data( elem, dataName );
-                       };
-               }) :
-               // support: jQuery <1.8
-               function( elem, i, match ) {
-                       return !!$.data( elem, match[ 3 ] );
-               },
-
-       focusable: function( element ) {
-               return focusable( element, !isNaN( $.attr( element, "tabindex" ) ) );
-       },
-
-       tabbable: function( element ) {
-               var tabIndex = $.attr( element, "tabindex" ),
-                       isTabIndexNaN = isNaN( tabIndex );
-               return ( isTabIndexNaN || tabIndex >= 0 ) && focusable( element, !isTabIndexNaN );
-       }
-});
-
-// support
-$(function() {
-       var body = document.body,
-               div = body.appendChild( div = document.createElement( "div" ) );
-
-       // access offsetHeight before setting the style to prevent a layout bug
-       // in IE 9 which causes the elemnt to continue to take up space even
-       // after it is removed from the DOM (#8026)
-       div.offsetHeight;
-
-       $.extend( div.style, {
-               minHeight: "100px",
-               height: "auto",
-               padding: 0,
-               borderWidth: 0
-       });
-
-       $.support.minHeight = div.offsetHeight === 100;
-       $.support.selectstart = "onselectstart" in div;
-
-       // set display to none to avoid a layout bug in IE
-       // http://dev.jquery.com/ticket/4014
-       body.removeChild( div ).style.display = "none";
-});
-
-// jQuery <1.4.3 uses curCSS, in 1.4.3 - 1.7.2 curCSS = css, 1.8+ only has css
-if ( !$.curCSS ) {
-       $.curCSS = $.css;
-}
-
-
-
-
-
-// deprecated
-$.extend( $.ui, {
-       // $.ui.plugin is deprecated.  Use the proxy pattern instead.
-       plugin: {
-               add: function( module, option, set ) {
-                       var proto = $.ui[ module ].prototype;
-                       for ( var i in set ) {
-                               proto.plugins[ i ] = proto.plugins[ i ] || [];
-                               proto.plugins[ i ].push( [ option, set[ i ] ] );
-                       }
-               },
-               call: function( instance, name, args ) {
-                       var set = instance.plugins[ name ];
-                       if ( !set || !instance.element[ 0 ].parentNode ) {
-                               return;
-                       }
-       
-                       for ( var i = 0; i < set.length; i++ ) {
-                               if ( instance.options[ set[ i ][ 0 ] ] ) {
-                                       set[ i ][ 1 ].apply( instance.element, args );
-                               }
-                       }
-               }
-       },
-       
-       // will be deprecated when we switch to jQuery 1.4 - use jQuery.contains()
-       contains: function( a, b ) {
-               return document.compareDocumentPosition ?
-                       a.compareDocumentPosition( b ) & 16 :
-                       a !== b && a.contains( b );
-       },
-       
-       // only used by resizable
-       hasScroll: function( el, a ) {
-       
-               //If overflow is hidden, the element might have extra content, but the user wants to hide it
-               if ( $( el ).css( "overflow" ) === "hidden") {
-                       return false;
-               }
-       
-               var scroll = ( a && a === "left" ) ? "scrollLeft" : "scrollTop",
-                       has = false;
-       
-               if ( el[ scroll ] > 0 ) {
-                       return true;
-               }
-       
-               // TODO: determine which cases actually cause this to happen
-               // if the element doesn't have the scroll set, see if it's possible to
-               // set the scroll
-               el[ scroll ] = 1;
-               has = ( el[ scroll ] > 0 );
-               el[ scroll ] = 0;
-               return has;
-       },
-       
-       // these are odd functions, fix the API or move into individual plugins
-       isOverAxis: function( x, reference, size ) {
-               //Determines when x coordinate is over "b" element axis
-               return ( x > reference ) && ( x < ( reference + size ) );
-       },
-       isOver: function( y, x, top, left, height, width ) {
-               //Determines when x, y coordinates is over "b" element
-               return $.ui.isOverAxis( y, top, height ) && $.ui.isOverAxis( x, left, width );
-       }
-});
-
-})( jQuery );
diff --git a/resources/jquery.ui/jquery.ui.datepicker.js b/resources/jquery.ui/jquery.ui.datepicker.js
deleted file mode 100644 (file)
index 1fcea12..0000000
+++ /dev/null
@@ -1,1854 +0,0 @@
-/*!
- * jQuery UI Datepicker 1.8.24
- *
- * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
- * Dual licensed under the MIT or GPL Version 2 licenses.
- * http://jquery.org/license
- *
- * http://docs.jquery.com/UI/Datepicker
- *
- * Depends:
- *     jquery.ui.core.js
- */
-(function( $, undefined ) {
-
-$.extend($.ui, { datepicker: { version: "1.8.24" } });
-
-var PROP_NAME = 'datepicker';
-var dpuuid = new Date().getTime();
-var instActive;
-
-/* Date picker manager.
-   Use the singleton instance of this class, $.datepicker, to interact with the date picker.
-   Settings for (groups of) date pickers are maintained in an instance object,
-   allowing multiple different settings on the same page. */
-
-function Datepicker() {
-       this.debug = false; // Change this to true to start debugging
-       this._curInst = null; // The current instance in use
-       this._keyEvent = false; // If the last event was a key event
-       this._disabledInputs = []; // List of date picker inputs that have been disabled
-       this._datepickerShowing = false; // True if the popup picker is showing , false if not
-       this._inDialog = false; // True if showing within a "dialog", false if not
-       this._mainDivId = 'ui-datepicker-div'; // The ID of the main datepicker division
-       this._inlineClass = 'ui-datepicker-inline'; // The name of the inline marker class
-       this._appendClass = 'ui-datepicker-append'; // The name of the append marker class
-       this._triggerClass = 'ui-datepicker-trigger'; // The name of the trigger marker class
-       this._dialogClass = 'ui-datepicker-dialog'; // The name of the dialog marker class
-       this._disableClass = 'ui-datepicker-disabled'; // The name of the disabled covering marker class
-       this._unselectableClass = 'ui-datepicker-unselectable'; // The name of the unselectable cell marker class
-       this._currentClass = 'ui-datepicker-current-day'; // The name of the current day marker class
-       this._dayOverClass = 'ui-datepicker-days-cell-over'; // The name of the day hover marker class
-       this.regional = []; // Available regional settings, indexed by language code
-       this.regional[''] = { // Default regional settings
-               closeText: 'Done', // Display text for close link
-               prevText: 'Prev', // Display text for previous month link
-               nextText: 'Next', // Display text for next month link
-               currentText: 'Today', // Display text for current month link
-               monthNames: ['January','February','March','April','May','June',
-                       'July','August','September','October','November','December'], // Names of months for drop-down and formatting
-               monthNamesShort: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'], // For formatting
-               dayNames: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'], // For formatting
-               dayNamesShort: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'], // For formatting
-               dayNamesMin: ['Su','Mo','Tu','We','Th','Fr','Sa'], // Column headings for days starting at Sunday
-               weekHeader: 'Wk', // Column header for week of the year
-               dateFormat: 'mm/dd/yy', // See format options on parseDate
-               firstDay: 0, // The first day of the week, Sun = 0, Mon = 1, ...
-               isRTL: false, // True if right-to-left language, false if left-to-right
-               showMonthAfterYear: false, // True if the year select precedes month, false for month then year
-               yearSuffix: '' // Additional text to append to the year in the month headers
-       };
-       this._defaults = { // Global defaults for all the date picker instances
-               showOn: 'focus', // 'focus' for popup on focus,
-                       // 'button' for trigger button, or 'both' for either
-               showAnim: 'fadeIn', // Name of jQuery animation for popup
-               showOptions: {}, // Options for enhanced animations
-               defaultDate: null, // Used when field is blank: actual date,
-                       // +/-number for offset from today, null for today
-               appendText: '', // Display text following the input box, e.g. showing the format
-               buttonText: '...', // Text for trigger button
-               buttonImage: '', // URL for trigger button image
-               buttonImageOnly: false, // True if the image appears alone, false if it appears on a button
-               hideIfNoPrevNext: false, // True to hide next/previous month links
-                       // if not applicable, false to just disable them
-               navigationAsDateFormat: false, // True if date formatting applied to prev/today/next links
-               gotoCurrent: false, // True if today link goes back to current selection instead
-               changeMonth: false, // True if month can be selected directly, false if only prev/next
-               changeYear: false, // True if year can be selected directly, false if only prev/next
-               yearRange: 'c-10:c+10', // Range of years to display in drop-down,
-                       // either relative to today's year (-nn:+nn), relative to currently displayed year
-                       // (c-nn:c+nn), absolute (nnnn:nnnn), or a combination of the above (nnnn:-n)
-               showOtherMonths: false, // True to show dates in other months, false to leave blank
-               selectOtherMonths: false, // True to allow selection of dates in other months, false for unselectable
-               showWeek: false, // True to show week of the year, false to not show it
-               calculateWeek: this.iso8601Week, // How to calculate the week of the year,
-                       // takes a Date and returns the number of the week for it
-               shortYearCutoff: '+10', // Short year values < this are in the current century,
-                       // > this are in the previous century,
-                       // string value starting with '+' for current year + value
-               minDate: null, // The earliest selectable date, or null for no limit
-               maxDate: null, // The latest selectable date, or null for no limit
-               duration: 'fast', // Duration of display/closure
-               beforeShowDay: null, // Function that takes a date and returns an array with
-                       // [0] = true if selectable, false if not, [1] = custom CSS class name(s) or '',
-                       // [2] = cell title (optional), e.g. $.datepicker.noWeekends
-               beforeShow: null, // Function that takes an input field and
-                       // returns a set of custom settings for the date picker
-               onSelect: null, // Define a callback function when a date is selected
-               onChangeMonthYear: null, // Define a callback function when the month or year is changed
-               onClose: null, // Define a callback function when the datepicker is closed
-               numberOfMonths: 1, // Number of months to show at a time
-               showCurrentAtPos: 0, // The position in multipe months at which to show the current month (starting at 0)
-               stepMonths: 1, // Number of months to step back/forward
-               stepBigMonths: 12, // Number of months to step back/forward for the big links
-               altField: '', // Selector for an alternate field to store selected dates into
-               altFormat: '', // The date format to use for the alternate field
-               constrainInput: true, // The input is constrained by the current date format
-               showButtonPanel: false, // True to show button panel, false to not show it
-               autoSize: false, // True to size the input for the date format, false to leave as is
-               disabled: false // The initial disabled state
-       };
-       $.extend(this._defaults, this.regional['']);
-       this.dpDiv = bindHover($('<div id="' + this._mainDivId + '" class="ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all"></div>'));
-}
-
-$.extend(Datepicker.prototype, {
-       /* Class name added to elements to indicate already configured with a date picker. */
-       markerClassName: 'hasDatepicker',
-       
-       //Keep track of the maximum number of rows displayed (see #7043)
-       maxRows: 4,
-
-       /* Debug logging (if enabled). */
-       log: function () {
-               if (this.debug)
-                       console.log.apply('', arguments);
-       },
-       
-       // TODO rename to "widget" when switching to widget factory
-       _widgetDatepicker: function() {
-               return this.dpDiv;
-       },
-
-       /* Override the default settings for all instances of the date picker.
-          @param  settings  object - the new settings to use as defaults (anonymous object)
-          @return the manager object */
-       setDefaults: function(settings) {
-               extendRemove(this._defaults, settings || {});
-               return this;
-       },
-
-       /* Attach the date picker to a jQuery selection.
-          @param  target    element - the target input field or division or span
-          @param  settings  object - the new settings to use for this date picker instance (anonymous) */
-       _attachDatepicker: function(target, settings) {
-               // check for settings on the control itself - in namespace 'date:'
-               var inlineSettings = null;
-               for (var attrName in this._defaults) {
-                       var attrValue = target.getAttribute('date:' + attrName);
-                       if (attrValue) {
-                               inlineSettings = inlineSettings || {};
-                               try {
-                                       inlineSettings[attrName] = eval(attrValue);
-                               } catch (err) {
-                                       inlineSettings[attrName] = attrValue;
-                               }
-                       }
-               }
-               var nodeName = target.nodeName.toLowerCase();
-               var inline = (nodeName == 'div' || nodeName == 'span');
-               if (!target.id) {
-                       this.uuid += 1;
-                       target.id = 'dp' + this.uuid;
-               }
-               var inst = this._newInst($(target), inline);
-               inst.settings = $.extend({}, settings || {}, inlineSettings || {});
-               if (nodeName == 'input') {
-                       this._connectDatepicker(target, inst);
-               } else if (inline) {
-                       this._inlineDatepicker(target, inst);
-               }
-       },
-
-       /* Create a new instance object. */
-       _newInst: function(target, inline) {
-               var id = target[0].id.replace(/([^A-Za-z0-9_-])/g, '\\\\$1'); // escape jQuery meta chars
-               return {id: id, input: target, // associated target
-                       selectedDay: 0, selectedMonth: 0, selectedYear: 0, // current selection
-                       drawMonth: 0, drawYear: 0, // month being drawn
-                       inline: inline, // is datepicker inline or not
-                       dpDiv: (!inline ? this.dpDiv : // presentation div
-                       bindHover($('<div class="' + this._inlineClass + ' ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all"></div>')))};
-       },
-
-       /* Attach the date picker to an input field. */
-       _connectDatepicker: function(target, inst) {
-               var input = $(target);
-               inst.append = $([]);
-               inst.trigger = $([]);
-               if (input.hasClass(this.markerClassName))
-                       return;
-               this._attachments(input, inst);
-               input.addClass(this.markerClassName).keydown(this._doKeyDown).
-                       keypress(this._doKeyPress).keyup(this._doKeyUp).
-                       bind("setData.datepicker", function(event, key, value) {
-                               inst.settings[key] = value;
-                       }).bind("getData.datepicker", function(event, key) {
-                               return this._get(inst, key);
-                       });
-               this._autoSize(inst);
-               $.data(target, PROP_NAME, inst);
-               //If disabled option is true, disable the datepicker once it has been attached to the input (see ticket #5665)
-               if( inst.settings.disabled ) {
-                       this._disableDatepicker( target );
-               }
-       },
-
-       /* Make attachments based on settings. */
-       _attachments: function(input, inst) {
-               var appendText = this._get(inst, 'appendText');
-               var isRTL = this._get(inst, 'isRTL');
-               if (inst.append)
-                       inst.append.remove();
-               if (appendText) {
-                       inst.append = $('<span class="' + this._appendClass + '">' + appendText + '</span>');
-                       input[isRTL ? 'before' : 'after'](inst.append);
-               }
-               input.unbind('focus', this._showDatepicker);
-               if (inst.trigger)
-                       inst.trigger.remove();
-               var showOn = this._get(inst, 'showOn');
-               if (showOn == 'focus' || showOn == 'both') // pop-up date picker when in the marked field
-                       input.focus(this._showDatepicker);
-               if (showOn == 'button' || showOn == 'both') { // pop-up date picker when button clicked
-                       var buttonText = this._get(inst, 'buttonText');
-                       var buttonImage = this._get(inst, 'buttonImage');
-                       inst.trigger = $(this._get(inst, 'buttonImageOnly') ?
-                               $('<img/>').addClass(this._triggerClass).
-                                       attr({ src: buttonImage, alt: buttonText, title: buttonText }) :
-                               $('<button type="button"></button>').addClass(this._triggerClass).
-                                       html(buttonImage == '' ? buttonText : $('<img/>').attr(
-                                       { src:buttonImage, alt:buttonText, title:buttonText })));
-                       input[isRTL ? 'before' : 'after'](inst.trigger);
-                       inst.trigger.click(function() {
-                               if ($.datepicker._datepickerShowing && $.datepicker._lastInput == input[0])
-                                       $.datepicker._hideDatepicker();
-                               else if ($.datepicker._datepickerShowing && $.datepicker._lastInput != input[0]) {
-                                       $.datepicker._hideDatepicker(); 
-                                       $.datepicker._showDatepicker(input[0]);
-                               } else
-                                       $.datepicker._showDatepicker(input[0]);
-                               return false;
-                       });
-               }
-       },
-
-       /* Apply the maximum length for the date format. */
-       _autoSize: function(inst) {
-               if (this._get(inst, 'autoSize') && !inst.inline) {
-                       var date = new Date(2009, 12 - 1, 20); // Ensure double digits
-                       var dateFormat = this._get(inst, 'dateFormat');
-                       if (dateFormat.match(/[DM]/)) {
-                               var findMax = function(names) {
-                                       var max = 0;
-                                       var maxI = 0;
-                                       for (var i = 0; i < names.length; i++) {
-                                               if (names[i].length > max) {
-                                                       max = names[i].length;
-                                                       maxI = i;
-                                               }
-                                       }
-                                       return maxI;
-                               };
-                               date.setMonth(findMax(this._get(inst, (dateFormat.match(/MM/) ?
-                                       'monthNames' : 'monthNamesShort'))));
-                               date.setDate(findMax(this._get(inst, (dateFormat.match(/DD/) ?
-                                       'dayNames' : 'dayNamesShort'))) + 20 - date.getDay());
-                       }
-                       inst.input.attr('size', this._formatDate(inst, date).length);
-               }
-       },
-
-       /* Attach an inline date picker to a div. */
-       _inlineDatepicker: function(target, inst) {
-               var divSpan = $(target);
-               if (divSpan.hasClass(this.markerClassName))
-                       return;
-               divSpan.addClass(this.markerClassName).append(inst.dpDiv).
-                       bind("setData.datepicker", function(event, key, value){
-                               inst.settings[key] = value;
-                       }).bind("getData.datepicker", function(event, key){
-                               return this._get(inst, key);
-                       });
-               $.data(target, PROP_NAME, inst);
-               this._setDate(inst, this._getDefaultDate(inst), true);
-               this._updateDatepicker(inst);
-               this._updateAlternate(inst);
-               //If disabled option is true, disable the datepicker before showing it (see ticket #5665)
-               if( inst.settings.disabled ) {
-                       this._disableDatepicker( target );
-               }
-               // Set display:block in place of inst.dpDiv.show() which won't work on disconnected elements
-               // http://bugs.jqueryui.com/ticket/7552 - A Datepicker created on a detached div has zero height
-               inst.dpDiv.css( "display", "block" );
-       },
-
-       /* Pop-up the date picker in a "dialog" box.
-          @param  input     element - ignored
-          @param  date      string or Date - the initial date to display
-          @param  onSelect  function - the function to call when a date is selected
-          @param  settings  object - update the dialog date picker instance's settings (anonymous object)
-          @param  pos       int[2] - coordinates for the dialog's position within the screen or
-                            event - with x/y coordinates or
-                            leave empty for default (screen centre)
-          @return the manager object */
-       _dialogDatepicker: function(input, date, onSelect, settings, pos) {
-               var inst = this._dialogInst; // internal instance
-               if (!inst) {
-                       this.uuid += 1;
-                       var id = 'dp' + this.uuid;
-                       this._dialogInput = $('<input type="text" id="' + id +
-                               '" style="position: absolute; top: -100px; width: 0px;"/>');
-                       this._dialogInput.keydown(this._doKeyDown);
-                       $('body').append(this._dialogInput);
-                       inst = this._dialogInst = this._newInst(this._dialogInput, false);
-                       inst.settings = {};
-                       $.data(this._dialogInput[0], PROP_NAME, inst);
-               }
-               extendRemove(inst.settings, settings || {});
-               date = (date && date.constructor == Date ? this._formatDate(inst, date) : date);
-               this._dialogInput.val(date);
-
-               this._pos = (pos ? (pos.length ? pos : [pos.pageX, pos.pageY]) : null);
-               if (!this._pos) {
-                       var browserWidth = document.documentElement.clientWidth;
-                       var browserHeight = document.documentElement.clientHeight;
-                       var scrollX = document.documentElement.scrollLeft || document.body.scrollLeft;
-                       var scrollY = document.documentElement.scrollTop || document.body.scrollTop;
-                       this._pos = // should use actual width/height below
-                               [(browserWidth / 2) - 100 + scrollX, (browserHeight / 2) - 150 + scrollY];
-               }
-
-               // move input on screen for focus, but hidden behind dialog
-               this._dialogInput.css('left', (this._pos[0] + 20) + 'px').css('top', this._pos[1] + 'px');
-               inst.settings.onSelect = onSelect;
-               this._inDialog = true;
-               this.dpDiv.addClass(this._dialogClass);
-               this._showDatepicker(this._dialogInput[0]);
-               if ($.blockUI)
-                       $.blockUI(this.dpDiv);
-               $.data(this._dialogInput[0], PROP_NAME, inst);
-               return this;
-       },
-
-       /* Detach a datepicker from its control.
-          @param  target    element - the target input field or division or span */
-       _destroyDatepicker: function(target) {
-               var $target = $(target);
-               var inst = $.data(target, PROP_NAME);
-               if (!$target.hasClass(this.markerClassName)) {
-                       return;
-               }
-               var nodeName = target.nodeName.toLowerCase();
-               $.removeData(target, PROP_NAME);
-               if (nodeName == 'input') {
-                       inst.append.remove();
-                       inst.trigger.remove();
-                       $target.removeClass(this.markerClassName).
-                               unbind('focus', this._showDatepicker).
-                               unbind('keydown', this._doKeyDown).
-                               unbind('keypress', this._doKeyPress).
-                               unbind('keyup', this._doKeyUp);
-               } else if (nodeName == 'div' || nodeName == 'span')
-                       $target.removeClass(this.markerClassName).empty();
-       },
-
-       /* Enable the date picker to a jQuery selection.
-          @param  target    element - the target input field or division or span */
-       _enableDatepicker: function(target) {
-               var $target = $(target);
-               var inst = $.data(target, PROP_NAME);
-               if (!$target.hasClass(this.markerClassName)) {
-                       return;
-               }
-               var nodeName = target.nodeName.toLowerCase();
-               if (nodeName == 'input') {
-                       target.disabled = false;
-                       inst.trigger.filter('button').
-                               each(function() { this.disabled = false; }).end().
-                               filter('img').css({opacity: '1.0', cursor: ''});
-               }
-               else if (nodeName == 'div' || nodeName == 'span') {
-                       var inline = $target.children('.' + this._inlineClass);
-                       inline.children().removeClass('ui-state-disabled');
-                       inline.find("select.ui-datepicker-month, select.ui-datepicker-year").
-                               removeAttr("disabled");
-               }
-               this._disabledInputs = $.map(this._disabledInputs,
-                       function(value) { return (value == target ? null : value); }); // delete entry
-       },
-
-       /* Disable the date picker to a jQuery selection.
-          @param  target    element - the target input field or division or span */
-       _disableDatepicker: function(target) {
-               var $target = $(target);
-               var inst = $.data(target, PROP_NAME);
-               if (!$target.hasClass(this.markerClassName)) {
-                       return;
-               }
-               var nodeName = target.nodeName.toLowerCase();
-               if (nodeName == 'input') {
-                       target.disabled = true;
-                       inst.trigger.filter('button').
-                               each(function() { this.disabled = true; }).end().
-                               filter('img').css({opacity: '0.5', cursor: 'default'});
-               }
-               else if (nodeName == 'div' || nodeName == 'span') {
-                       var inline = $target.children('.' + this._inlineClass);
-                       inline.children().addClass('ui-state-disabled');
-                       inline.find("select.ui-datepicker-month, select.ui-datepicker-year").
-                               attr("disabled", "disabled");
-               }
-               this._disabledInputs = $.map(this._disabledInputs,
-                       function(value) { return (value == target ? null : value); }); // delete entry
-               this._disabledInputs[this._disabledInputs.length] = target;
-       },
-
-       /* Is the first field in a jQuery collection disabled as a datepicker?
-          @param  target    element - the target input field or division or span
-          @return boolean - true if disabled, false if enabled */
-       _isDisabledDatepicker: function(target) {
-               if (!target) {
-                       return false;
-               }
-               for (var i = 0; i < this._disabledInputs.length; i++) {
-                       if (this._disabledInputs[i] == target)
-                               return true;
-               }
-               return false;
-       },
-
-       /* Retrieve the instance data for the target control.
-          @param  target  element - the target input field or division or span
-          @return  object - the associated instance data
-          @throws  error if a jQuery problem getting data */
-       _getInst: function(target) {
-               try {
-                       return $.data(target, PROP_NAME);
-               }
-               catch (err) {
-                       throw 'Missing instance data for this datepicker';
-               }
-       },
-
-       /* Update or retrieve the settings for a date picker attached to an input field or division.
-          @param  target  element - the target input field or division or span
-          @param  name    object - the new settings to update or
-                          string - the name of the setting to change or retrieve,
-                          when retrieving also 'all' for all instance settings or
-                          'defaults' for all global defaults
-          @param  value   any - the new value for the setting
-                          (omit if above is an object or to retrieve a value) */
-       _optionDatepicker: function(target, name, value) {
-               var inst = this._getInst(target);
-               if (arguments.length == 2 && typeof name == 'string') {
-                       return (name == 'defaults' ? $.extend({}, $.datepicker._defaults) :
-                               (inst ? (name == 'all' ? $.extend({}, inst.settings) :
-                               this._get(inst, name)) : null));
-               }
-               var settings = name || {};
-               if (typeof name == 'string') {
-                       settings = {};
-                       settings[name] = value;
-               }
-               if (inst) {
-                       if (this._curInst == inst) {
-                               this._hideDatepicker();
-                       }
-                       var date = this._getDateDatepicker(target, true);
-                       var minDate = this._getMinMaxDate(inst, 'min');
-                       var maxDate = this._getMinMaxDate(inst, 'max');
-                       extendRemove(inst.settings, settings);
-                       // reformat the old minDate/maxDate values if dateFormat changes and a new minDate/maxDate isn't provided
-                       if (minDate !== null && settings['dateFormat'] !== undefined && settings['minDate'] === undefined)
-                               inst.settings.minDate = this._formatDate(inst, minDate);
-                       if (maxDate !== null && settings['dateFormat'] !== undefined && settings['maxDate'] === undefined)
-                               inst.settings.maxDate = this._formatDate(inst, maxDate);
-                       this._attachments($(target), inst);
-                       this._autoSize(inst);
-                       this._setDate(inst, date);
-                       this._updateAlternate(inst);
-                       this._updateDatepicker(inst);
-               }
-       },
-
-       // change method deprecated
-       _changeDatepicker: function(target, name, value) {
-               this._optionDatepicker(target, name, value);
-       },
-
-       /* Redraw the date picker attached to an input field or division.
-          @param  target  element - the target input field or division or span */
-       _refreshDatepicker: function(target) {
-               var inst = this._getInst(target);
-               if (inst) {
-                       this._updateDatepicker(inst);
-               }
-       },
-
-       /* Set the dates for a jQuery selection.
-          @param  target   element - the target input field or division or span
-          @param  date     Date - the new date */
-       _setDateDatepicker: function(target, date) {
-               var inst = this._getInst(target);
-               if (inst) {
-                       this._setDate(inst, date);
-                       this._updateDatepicker(inst);
-                       this._updateAlternate(inst);
-               }
-       },
-
-       /* Get the date(s) for the first entry in a jQuery selection.
-          @param  target     element - the target input field or division or span
-          @param  noDefault  boolean - true if no default date is to be used
-          @return Date - the current date */
-       _getDateDatepicker: function(target, noDefault) {
-               var inst = this._getInst(target);
-               if (inst && !inst.inline)
-                       this._setDateFromField(inst, noDefault);
-               return (inst ? this._getDate(inst) : null);
-       },
-
-       /* Handle keystrokes. */
-       _doKeyDown: function(event) {
-               var inst = $.datepicker._getInst(event.target);
-               var handled = true;
-               var isRTL = inst.dpDiv.is('.ui-datepicker-rtl');
-               inst._keyEvent = true;
-               if ($.datepicker._datepickerShowing)
-                       switch (event.keyCode) {
-                               case 9: $.datepicker._hideDatepicker();
-                                               handled = false;
-                                               break; // hide on tab out
-                               case 13: var sel = $('td.' + $.datepicker._dayOverClass + ':not(.' + 
-                                                                       $.datepicker._currentClass + ')', inst.dpDiv);
-                                               if (sel[0])
-                                                       $.datepicker._selectDay(event.target, inst.selectedMonth, inst.selectedYear, sel[0]);
-                                                       var onSelect = $.datepicker._get(inst, 'onSelect');
-                                                       if (onSelect) {
-                                                               var dateStr = $.datepicker._formatDate(inst);
-
-                                                               // trigger custom callback
-                                                               onSelect.apply((inst.input ? inst.input[0] : null), [dateStr, inst]);
-                                                       }
-                                               else
-                                                       $.datepicker._hideDatepicker();
-                                               return false; // don't submit the form
-                                               break; // select the value on enter
-                               case 27: $.datepicker._hideDatepicker();
-                                               break; // hide on escape
-                               case 33: $.datepicker._adjustDate(event.target, (event.ctrlKey ?
-                                                       -$.datepicker._get(inst, 'stepBigMonths') :
-                                                       -$.datepicker._get(inst, 'stepMonths')), 'M');
-                                               break; // previous month/year on page up/+ ctrl
-                               case 34: $.datepicker._adjustDate(event.target, (event.ctrlKey ?
-                                                       +$.datepicker._get(inst, 'stepBigMonths') :
-                                                       +$.datepicker._get(inst, 'stepMonths')), 'M');
-                                               break; // next month/year on page down/+ ctrl
-                               case 35: if (event.ctrlKey || event.metaKey) $.datepicker._clearDate(event.target);
-                                               handled = event.ctrlKey || event.metaKey;
-                                               break; // clear on ctrl or command +end
-                               case 36: if (event.ctrlKey || event.metaKey) $.datepicker._gotoToday(event.target);
-                                               handled = event.ctrlKey || event.metaKey;
-                                               break; // current on ctrl or command +home
-                               case 37: if (event.ctrlKey || event.metaKey) $.datepicker._adjustDate(event.target, (isRTL ? +1 : -1), 'D');
-                                               handled = event.ctrlKey || event.metaKey;
-                                               // -1 day on ctrl or command +left
-                                               if (event.originalEvent.altKey) $.datepicker._adjustDate(event.target, (event.ctrlKey ?
-                                                                       -$.datepicker._get(inst, 'stepBigMonths') :
-                                                                       -$.datepicker._get(inst, 'stepMonths')), 'M');
-                                               // next month/year on alt +left on Mac
-                                               break;
-                               case 38: if (event.ctrlKey || event.metaKey) $.datepicker._adjustDate(event.target, -7, 'D');
-                                               handled = event.ctrlKey || event.metaKey;
-                                               break; // -1 week on ctrl or command +up
-                               case 39: if (event.ctrlKey || event.metaKey) $.datepicker._adjustDate(event.target, (isRTL ? -1 : +1), 'D');
-                                               handled = event.ctrlKey || event.metaKey;
-                                               // +1 day on ctrl or command +right
-                                               if (event.originalEvent.altKey) $.datepicker._adjustDate(event.target, (event.ctrlKey ?
-                                                                       +$.datepicker._get(inst, 'stepBigMonths') :
-                                                                       +$.datepicker._get(inst, 'stepMonths')), 'M');
-                                               // next month/year on alt +right
-                                               break;
-                               case 40: if (event.ctrlKey || event.metaKey) $.datepicker._adjustDate(event.target, +7, 'D');
-                                               handled = event.ctrlKey || event.metaKey;
-                                               break; // +1 week on ctrl or command +down
-                               default: handled = false;
-                       }
-               else if (event.keyCode == 36 && event.ctrlKey) // display the date picker on ctrl+home
-                       $.datepicker._showDatepicker(this);
-               else {
-                       handled = false;
-               }
-               if (handled) {
-                       event.preventDefault();
-                       event.stopPropagation();
-               }
-       },
-
-       /* Filter entered characters - based on date format. */
-       _doKeyPress: function(event) {
-               var inst = $.datepicker._getInst(event.target);
-               if ($.datepicker._get(inst, 'constrainInput')) {
-                       var chars = $.datepicker._possibleChars($.datepicker._get(inst, 'dateFormat'));
-                       var chr = String.fromCharCode(event.charCode == undefined ? event.keyCode : event.charCode);
-                       return event.ctrlKey || event.metaKey || (chr < ' ' || !chars || chars.indexOf(chr) > -1);
-               }
-       },
-
-       /* Synchronise manual entry and field/alternate field. */
-       _doKeyUp: function(event) {
-               var inst = $.datepicker._getInst(event.target);
-               if (inst.input.val() != inst.lastVal) {
-                       try {
-                               var date = $.datepicker.parseDate($.datepicker._get(inst, 'dateFormat'),
-                                       (inst.input ? inst.input.val() : null),
-                                       $.datepicker._getFormatConfig(inst));
-                               if (date) { // only if valid
-                                       $.datepicker._setDateFromField(inst);
-                                       $.datepicker._updateAlternate(inst);
-                                       $.datepicker._updateDatepicker(inst);
-                               }
-                       }
-                       catch (err) {
-                               $.datepicker.log(err);
-                       }
-               }
-               return true;
-       },
-
-       /* Pop-up the date picker for a given input field.
-       If false returned from beforeShow event handler do not show. 
-          @param  input  element - the input field attached to the date picker or
-                         event - if triggered by focus */
-       _showDatepicker: function(input) {
-               input = input.target || input;
-               if (input.nodeName.toLowerCase() != 'input') // find from button/image trigger
-                       input = $('input', input.parentNode)[0];
-               if ($.datepicker._isDisabledDatepicker(input) || $.datepicker._lastInput == input) // already here
-                       return;
-               var inst = $.datepicker._getInst(input);
-               if ($.datepicker._curInst && $.datepicker._curInst != inst) {
-                       $.datepicker._curInst.dpDiv.stop(true, true);
-                       if ( inst && $.datepicker._datepickerShowing ) {
-                               $.datepicker._hideDatepicker( $.datepicker._curInst.input[0] );
-                       }
-               }
-               var beforeShow = $.datepicker._get(inst, 'beforeShow');
-               var beforeShowSettings = beforeShow ? beforeShow.apply(input, [input, inst]) : {};
-               if(beforeShowSettings === false){
-            //false
-                       return;
-               }
-               extendRemove(inst.settings, beforeShowSettings);
-               inst.lastVal = null;
-               $.datepicker._lastInput = input;
-               $.datepicker._setDateFromField(inst);
-               if ($.datepicker._inDialog) // hide cursor
-                       input.value = '';
-               if (!$.datepicker._pos) { // position below input
-                       $.datepicker._pos = $.datepicker._findPos(input);
-                       $.datepicker._pos[1] += input.offsetHeight; // add the height
-               }
-               var isFixed = false;
-               $(input).parents().each(function() {
-                       isFixed |= $(this).css('position') == 'fixed';
-                       return !isFixed;
-               });
-               if (isFixed && $.browser.opera) { // correction for Opera when fixed and scrolled
-                       $.datepicker._pos[0] -= document.documentElement.scrollLeft;
-                       $.datepicker._pos[1] -= document.documentElement.scrollTop;
-               }
-               var offset = {left: $.datepicker._pos[0], top: $.datepicker._pos[1]};
-               $.datepicker._pos = null;
-               //to avoid flashes on Firefox
-               inst.dpDiv.empty();
-               // determine sizing offscreen
-               inst.dpDiv.css({position: 'absolute', display: 'block', top: '-1000px'});
-               $.datepicker._updateDatepicker(inst);
-               // fix width for dynamic number of date pickers
-               // and adjust position before showing
-               offset = $.datepicker._checkOffset(inst, offset, isFixed);
-               inst.dpDiv.css({position: ($.datepicker._inDialog && $.blockUI ?
-                       'static' : (isFixed ? 'fixed' : 'absolute')), display: 'none',
-                       left: offset.left + 'px', top: offset.top + 'px'});
-               if (!inst.inline) {
-                       var showAnim = $.datepicker._get(inst, 'showAnim');
-                       var duration = $.datepicker._get(inst, 'duration');
-                       var postProcess = function() {
-                               var cover = inst.dpDiv.find('iframe.ui-datepicker-cover'); // IE6- only
-                               if( !! cover.length ){
-                                       var borders = $.datepicker._getBorders(inst.dpDiv);
-                                       cover.css({left: -borders[0], top: -borders[1],
-                                               width: inst.dpDiv.outerWidth(), height: inst.dpDiv.outerHeight()});
-                               }
-                       };
-                       inst.dpDiv.zIndex($(input).zIndex()+1);
-                       $.datepicker._datepickerShowing = true;
-                       if ($.effects && $.effects[showAnim])
-                               inst.dpDiv.show(showAnim, $.datepicker._get(inst, 'showOptions'), duration, postProcess);
-                       else
-                               inst.dpDiv[showAnim || 'show']((showAnim ? duration : null), postProcess);
-                       if (!showAnim || !duration)
-                               postProcess();
-                       if (inst.input.is(':visible') && !inst.input.is(':disabled'))
-                               inst.input.focus();
-                       $.datepicker._curInst = inst;
-               }
-       },
-
-       /* Generate the date picker content. */
-       _updateDatepicker: function(inst) {
-               var self = this;
-               self.maxRows = 4; //Reset the max number of rows being displayed (see #7043)
-               var borders = $.datepicker._getBorders(inst.dpDiv);
-               instActive = inst; // for delegate hover events
-               inst.dpDiv.empty().append(this._generateHTML(inst));
-               this._attachHandlers(inst);
-               var cover = inst.dpDiv.find('iframe.ui-datepicker-cover'); // IE6- only
-               if( !!cover.length ){ //avoid call to outerXXXX() when not in IE6
-                       cover.css({left: -borders[0], top: -borders[1], width: inst.dpDiv.outerWidth(), height: inst.dpDiv.outerHeight()})
-               }
-               inst.dpDiv.find('.' + this._dayOverClass + ' a').mouseover();
-               var numMonths = this._getNumberOfMonths(inst);
-               var cols = numMonths[1];
-               var width = 17;
-               inst.dpDiv.removeClass('ui-datepicker-multi-2 ui-datepicker-multi-3 ui-datepicker-multi-4').width('');
-               if (cols > 1)
-                       inst.dpDiv.addClass('ui-datepicker-multi-' + cols).css('width', (width * cols) + 'em');
-               inst.dpDiv[(numMonths[0] != 1 || numMonths[1] != 1 ? 'add' : 'remove') +
-                       'Class']('ui-datepicker-multi');
-               inst.dpDiv[(this._get(inst, 'isRTL') ? 'add' : 'remove') +
-                       'Class']('ui-datepicker-rtl');
-               if (inst == $.datepicker._curInst && $.datepicker._datepickerShowing && inst.input &&
-                               // #6694 - don't focus the input if it's already focused
-                               // this breaks the change event in IE
-                               inst.input.is(':visible') && !inst.input.is(':disabled') && inst.input[0] != document.activeElement)
-                       inst.input.focus();
-               // deffered render of the years select (to avoid flashes on Firefox) 
-               if( inst.yearshtml ){
-                       var origyearshtml = inst.yearshtml;
-                       setTimeout(function(){
-                               //assure that inst.yearshtml didn't change.
-                               if( origyearshtml === inst.yearshtml && inst.yearshtml ){
-                                       inst.dpDiv.find('select.ui-datepicker-year:first').replaceWith(inst.yearshtml);
-                               }
-                               origyearshtml = inst.yearshtml = null;
-                       }, 0);
-               }
-       },
-
-       /* Retrieve the size of left and top borders for an element.
-          @param  elem  (jQuery object) the element of interest
-          @return  (number[2]) the left and top borders */
-       _getBorders: function(elem) {
-               var convert = function(value) {
-                       return {thin: 1, medium: 2, thick: 3}[value] || value;
-               };
-               return [parseFloat(convert(elem.css('border-left-width'))),
-                       parseFloat(convert(elem.css('border-top-width')))];
-       },
-
-       /* Check positioning to remain on screen. */
-       _checkOffset: function(inst, offset, isFixed) {
-               var dpWidth = inst.dpDiv.outerWidth();
-               var dpHeight = inst.dpDiv.outerHeight();
-               var inputWidth = inst.input ? inst.input.outerWidth() : 0;
-               var inputHeight = inst.input ? inst.input.outerHeight() : 0;
-               var viewWidth = document.documentElement.clientWidth + (isFixed ? 0 : $(document).scrollLeft());
-               var viewHeight = document.documentElement.clientHeight + (isFixed ? 0 : $(document).scrollTop());
-
-               offset.left -= (this._get(inst, 'isRTL') ? (dpWidth - inputWidth) : 0);
-               offset.left -= (isFixed && offset.left == inst.input.offset().left) ? $(document).scrollLeft() : 0;
-               offset.top -= (isFixed && offset.top == (inst.input.offset().top + inputHeight)) ? $(document).scrollTop() : 0;
-
-               // now check if datepicker is showing outside window viewport - move to a better place if so.
-               offset.left -= Math.min(offset.left, (offset.left + dpWidth > viewWidth && viewWidth > dpWidth) ?
-                       Math.abs(offset.left + dpWidth - viewWidth) : 0);
-               offset.top -= Math.min(offset.top, (offset.top + dpHeight > viewHeight && viewHeight > dpHeight) ?
-                       Math.abs(dpHeight + inputHeight) : 0);
-
-               return offset;
-       },
-
-       /* Find an object's position on the screen. */
-       _findPos: function(obj) {
-               var inst = this._getInst(obj);
-               var isRTL = this._get(inst, 'isRTL');
-        while (obj && (obj.type == 'hidden' || obj.nodeType != 1 || $.expr.filters.hidden(obj))) {
-            obj = obj[isRTL ? 'previousSibling' : 'nextSibling'];
-        }
-        var position = $(obj).offset();
-           return [position.left, position.top];
-       },
-
-       /* Hide the date picker from view.
-          @param  input  element - the input field attached to the date picker */
-       _hideDatepicker: function(input) {
-               var inst = this._curInst;
-               if (!inst || (input && inst != $.data(input, PROP_NAME)))
-                       return;
-               if (this._datepickerShowing) {
-                       var showAnim = this._get(inst, 'showAnim');
-                       var duration = this._get(inst, 'duration');
-                       var postProcess = function() {
-                               $.datepicker._tidyDialog(inst);
-                       };
-                       if ($.effects && $.effects[showAnim])
-                               inst.dpDiv.hide(showAnim, $.datepicker._get(inst, 'showOptions'), duration, postProcess);
-                       else
-                               inst.dpDiv[(showAnim == 'slideDown' ? 'slideUp' :
-                                       (showAnim == 'fadeIn' ? 'fadeOut' : 'hide'))]((showAnim ? duration : null), postProcess);
-                       if (!showAnim)
-                               postProcess();
-                       this._datepickerShowing = false;
-                       var onClose = this._get(inst, 'onClose');
-                       if (onClose)
-                               onClose.apply((inst.input ? inst.input[0] : null),
-                                       [(inst.input ? inst.input.val() : ''), inst]);
-                       this._lastInput = null;
-                       if (this._inDialog) {
-                               this._dialogInput.css({ position: 'absolute', left: '0', top: '-100px' });
-                               if ($.blockUI) {
-                                       $.unblockUI();
-                                       $('body').append(this.dpDiv);
-                               }
-                       }
-                       this._inDialog = false;
-               }
-       },
-
-       /* Tidy up after a dialog display. */
-       _tidyDialog: function(inst) {
-               inst.dpDiv.removeClass(this._dialogClass).unbind('.ui-datepicker-calendar');
-       },
-
-       /* Close date picker if clicked elsewhere. */
-       _checkExternalClick: function(event) {
-               if (!$.datepicker._curInst)
-                       return;
-
-               var $target = $(event.target),
-                       inst = $.datepicker._getInst($target[0]);
-
-               if ( ( ( $target[0].id != $.datepicker._mainDivId &&
-                               $target.parents('#' + $.datepicker._mainDivId).length == 0 &&
-                               !$target.hasClass($.datepicker.markerClassName) &&
-                               !$target.closest("." + $.datepicker._triggerClass).length &&
-                               $.datepicker._datepickerShowing && !($.datepicker._inDialog && $.blockUI) ) ) ||
-                       ( $target.hasClass($.datepicker.markerClassName) && $.datepicker._curInst != inst ) )
-                       $.datepicker._hideDatepicker();
-       },
-
-       /* Adjust one of the date sub-fields. */
-       _adjustDate: function(id, offset, period) {
-               var target = $(id);
-               var inst = this._getInst(target[0]);
-               if (this._isDisabledDatepicker(target[0])) {
-                       return;
-               }
-               this._adjustInstDate(inst, offset +
-                       (period == 'M' ? this._get(inst, 'showCurrentAtPos') : 0), // undo positioning
-                       period);
-               this._updateDatepicker(inst);
-       },
-
-       /* Action for current link. */
-       _gotoToday: function(id) {
-               var target = $(id);
-               var inst = this._getInst(target[0]);
-               if (this._get(inst, 'gotoCurrent') && inst.currentDay) {
-                       inst.selectedDay = inst.currentDay;
-                       inst.drawMonth = inst.selectedMonth = inst.currentMonth;
-                       inst.drawYear = inst.selectedYear = inst.currentYear;
-               }
-               else {
-                       var date = new Date();
-                       inst.selectedDay = date.getDate();
-                       inst.drawMonth = inst.selectedMonth = date.getMonth();
-                       inst.drawYear = inst.selectedYear = date.getFullYear();
-               }
-               this._notifyChange(inst);
-               this._adjustDate(target);
-       },
-
-       /* Action for selecting a new month/year. */
-       _selectMonthYear: function(id, select, period) {
-               var target = $(id);
-               var inst = this._getInst(target[0]);
-               inst['selected' + (period == 'M' ? 'Month' : 'Year')] =
-               inst['draw' + (period == 'M' ? 'Month' : 'Year')] =
-                       parseInt(select.options[select.selectedIndex].value,10);
-               this._notifyChange(inst);
-               this._adjustDate(target);
-       },
-
-       /* Action for selecting a day. */
-       _selectDay: function(id, month, year, td) {
-               var target = $(id);
-               if ($(td).hasClass(this._unselectableClass) || this._isDisabledDatepicker(target[0])) {
-                       return;
-               }
-               var inst = this._getInst(target[0]);
-               inst.selectedDay = inst.currentDay = $('a', td).html();
-               inst.selectedMonth = inst.currentMonth = month;
-               inst.selectedYear = inst.currentYear = year;
-               this._selectDate(id, this._formatDate(inst,
-                       inst.currentDay, inst.currentMonth, inst.currentYear));
-       },
-
-       /* Erase the input field and hide the date picker. */
-       _clearDate: function(id) {
-               var target = $(id);
-               var inst = this._getInst(target[0]);
-               this._selectDate(target, '');
-       },
-
-       /* Update the input field with the selected date. */
-       _selectDate: function(id, dateStr) {
-               var target = $(id);
-               var inst = this._getInst(target[0]);
-               dateStr = (dateStr != null ? dateStr : this._formatDate(inst));
-               if (inst.input)
-                       inst.input.val(dateStr);
-               this._updateAlternate(inst);
-               var onSelect = this._get(inst, 'onSelect');
-               if (onSelect)
-                       onSelect.apply((inst.input ? inst.input[0] : null), [dateStr, inst]);  // trigger custom callback
-               else if (inst.input)
-                       inst.input.trigger('change'); // fire the change event
-               if (inst.inline)
-                       this._updateDatepicker(inst);
-               else {
-                       this._hideDatepicker();
-                       this._lastInput = inst.input[0];
-                       if (typeof(inst.input[0]) != 'object')
-                               inst.input.focus(); // restore focus
-                       this._lastInput = null;
-               }
-       },
-
-       /* Update any alternate field to synchronise with the main field. */
-       _updateAlternate: function(inst) {
-               var altField = this._get(inst, 'altField');
-               if (altField) { // update alternate field too
-                       var altFormat = this._get(inst, 'altFormat') || this._get(inst, 'dateFormat');
-                       var date = this._getDate(inst);
-                       var dateStr = this.formatDate(altFormat, date, this._getFormatConfig(inst));
-                       $(altField).each(function() { $(this).val(dateStr); });
-               }
-       },
-
-       /* Set as beforeShowDay function to prevent selection of weekends.
-          @param  date  Date - the date to customise
-          @return [boolean, string] - is this date selectable?, what is its CSS class? */
-       noWeekends: function(date) {
-               var day = date.getDay();
-               return [(day > 0 && day < 6), ''];
-       },
-
-       /* Set as calculateWeek to determine the week of the year based on the ISO 8601 definition.
-          @param  date  Date - the date to get the week for
-          @return  number - the number of the week within the year that contains this date */
-       iso8601Week: function(date) {
-               var checkDate = new Date(date.getTime());
-               // Find Thursday of this week starting on Monday
-               checkDate.setDate(checkDate.getDate() + 4 - (checkDate.getDay() || 7));
-               var time = checkDate.getTime();
-               checkDate.setMonth(0); // Compare with Jan 1
-               checkDate.setDate(1);
-               return Math.floor(Math.round((time - checkDate) / 86400000) / 7) + 1;
-       },
-
-       /* Parse a string value into a date object.
-          See formatDate below for the possible formats.
-
-          @param  format    string - the expected format of the date
-          @param  value     string - the date in the above format
-          @param  settings  Object - attributes include:
-                            shortYearCutoff  number - the cutoff year for determining the century (optional)
-                            dayNamesShort    string[7] - abbreviated names of the days from Sunday (optional)
-                            dayNames         string[7] - names of the days from Sunday (optional)
-                            monthNamesShort  string[12] - abbreviated names of the months (optional)
-                            monthNames       string[12] - names of the months (optional)
-          @return  Date - the extracted date value or null if value is blank */
-       parseDate: function (format, value, settings) {
-               if (format == null || value == null)
-                       throw 'Invalid arguments';
-               value = (typeof value == 'object' ? value.toString() : value + '');
-               if (value == '')
-                       return null;
-               var shortYearCutoff = (settings ? settings.shortYearCutoff : null) || this._defaults.shortYearCutoff;
-               shortYearCutoff = (typeof shortYearCutoff != 'string' ? shortYearCutoff :
-                               new Date().getFullYear() % 100 + parseInt(shortYearCutoff, 10));
-               var dayNamesShort = (settings ? settings.dayNamesShort : null) || this._defaults.dayNamesShort;
-               var dayNames = (settings ? settings.dayNames : null) || this._defaults.dayNames;
-               var monthNamesShort = (settings ? settings.monthNamesShort : null) || this._defaults.monthNamesShort;
-               var monthNames = (settings ? settings.monthNames : null) || this._defaults.monthNames;
-               var year = -1;
-               var month = -1;
-               var day = -1;
-               var doy = -1;
-               var literal = false;
-               // Check whether a format character is doubled
-               var lookAhead = function(match) {
-                       var matches = (iFormat + 1 < format.length && format.charAt(iFormat + 1) == match);
-                       if (matches)
-                               iFormat++;
-                       return matches;
-               };
-               // Extract a number from the string value
-               var getNumber = function(match) {
-                       var isDoubled = lookAhead(match);
-                       var size = (match == '@' ? 14 : (match == '!' ? 20 :
-                               (match == 'y' && isDoubled ? 4 : (match == 'o' ? 3 : 2))));
-                       var digits = new RegExp('^\\d{1,' + size + '}');
-                       var num = value.substring(iValue).match(digits);
-                       if (!num)
-                               throw 'Missing number at position ' + iValue;
-                       iValue += num[0].length;
-                       return parseInt(num[0], 10);
-               };
-               // Extract a name from the string value and convert to an index
-               var getName = function(match, shortNames, longNames) {
-                       var names = $.map(lookAhead(match) ? longNames : shortNames, function (v, k) {
-                               return [ [k, v] ];
-                       }).sort(function (a, b) {
-                               return -(a[1].length - b[1].length);
-                       });
-                       var index = -1;
-                       $.each(names, function (i, pair) {
-                               var name = pair[1];
-                               if (value.substr(iValue, name.length).toLowerCase() == name.toLowerCase()) {
-                                       index = pair[0];
-                                       iValue += name.length;
-                                       return false;
-                               }
-                       });
-                       if (index != -1)
-                               return index + 1;
-                       else
-                               throw 'Unknown name at position ' + iValue;
-               };
-               // Confirm that a literal character matches the string value
-               var checkLiteral = function() {
-                       if (value.charAt(iValue) != format.charAt(iFormat))
-                               throw 'Unexpected literal at position ' + iValue;
-                       iValue++;
-               };
-               var iValue = 0;
-               for (var iFormat = 0; iFormat < format.length; iFormat++) {
-                       if (literal)
-                               if (format.charAt(iFormat) == "'" && !lookAhead("'"))
-                                       literal = false;
-                               else
-                                       checkLiteral();
-                       else
-                               switch (format.charAt(iFormat)) {
-                                       case 'd':
-                                               day = getNumber('d');
-                                               break;
-                                       case 'D':
-                                               getName('D', dayNamesShort, dayNames);
-                                               break;
-                                       case 'o':
-                                               doy = getNumber('o');
-                                               break;
-                                       case 'm':
-                                               month = getNumber('m');
-                                               break;
-                                       case 'M':
-                                               month = getName('M', monthNamesShort, monthNames);
-                                               break;
-                                       case 'y':
-                                               year = getNumber('y');
-                                               break;
-                                       case '@':
-                                               var date = new Date(getNumber('@'));
-                                               year = date.getFullYear();
-                                               month = date.getMonth() + 1;
-                                               day = date.getDate();
-                                               break;
-                                       case '!':
-                                               var date = new Date((getNumber('!') - this._ticksTo1970) / 10000);
-                                               year = date.getFullYear();
-                                               month = date.getMonth() + 1;
-                                               day = date.getDate();
-                                               break;
-                                       case "'":
-                                               if (lookAhead("'"))
-                                                       checkLiteral();
-                                               else
-                                                       literal = true;
-                                               break;
-                                       default:
-                                               checkLiteral();
-                               }
-               }
-               if (iValue < value.length){
-                       throw "Extra/unparsed characters found in date: " + value.substring(iValue);
-               }
-               if (year == -1)
-                       year = new Date().getFullYear();
-               else if (year < 100)
-                       year += new Date().getFullYear() - new Date().getFullYear() % 100 +
-                               (year <= shortYearCutoff ? 0 : -100);
-               if (doy > -1) {
-                       month = 1;
-                       day = doy;
-                       do {
-                               var dim = this._getDaysInMonth(year, month - 1);
-                               if (day <= dim)
-                                       break;
-                               month++;
-                               day -= dim;
-                       } while (true);
-               }
-               var date = this._daylightSavingAdjust(new Date(year, month - 1, day));
-               if (date.getFullYear() != year || date.getMonth() + 1 != month || date.getDate() != day)
-                       throw 'Invalid date'; // E.g. 31/02/00
-               return date;
-       },
-
-       /* Standard date formats. */
-       ATOM: 'yy-mm-dd', // RFC 3339 (ISO 8601)
-       COOKIE: 'D, dd M yy',
-       ISO_8601: 'yy-mm-dd',
-       RFC_822: 'D, d M y',
-       RFC_850: 'DD, dd-M-y',
-       RFC_1036: 'D, d M y',
-       RFC_1123: 'D, d M yy',
-       RFC_2822: 'D, d M yy',
-       RSS: 'D, d M y', // RFC 822
-       TICKS: '!',
-       TIMESTAMP: '@',
-       W3C: 'yy-mm-dd', // ISO 8601
-
-       _ticksTo1970: (((1970 - 1) * 365 + Math.floor(1970 / 4) - Math.floor(1970 / 100) +
-               Math.floor(1970 / 400)) * 24 * 60 * 60 * 10000000),
-
-       /* Format a date object into a string value.
-          The format can be combinations of the following:
-          d  - day of month (no leading zero)
-          dd - day of month (two digit)
-          o  - day of year (no leading zeros)
-          oo - day of year (three digit)
-          D  - day name short
-          DD - day name long
-          m  - month of year (no leading zero)
-          mm - month of year (two digit)
-          M  - month name short
-          MM - month name long
-          y  - year (two digit)
-          yy - year (four digit)
-          @ - Unix timestamp (ms since 01/01/1970)
-          ! - Windows ticks (100ns since 01/01/0001)
-          '...' - literal text
-          '' - single quote
-
-          @param  format    string - the desired format of the date
-          @param  date      Date - the date value to format
-          @param  settings  Object - attributes include:
-                            dayNamesShort    string[7] - abbreviated names of the days from Sunday (optional)
-                            dayNames         string[7] - names of the days from Sunday (optional)
-                            monthNamesShort  string[12] - abbreviated names of the months (optional)
-                            monthNames       string[12] - names of the months (optional)
-          @return  string - the date in the above format */
-       formatDate: function (format, date, settings) {
-               if (!date)
-                       return '';
-               var dayNamesShort = (settings ? settings.dayNamesShort : null) || this._defaults.dayNamesShort;
-               var dayNames = (settings ? settings.dayNames : null) || this._defaults.dayNames;
-               var monthNamesShort = (settings ? settings.monthNamesShort : null) || this._defaults.monthNamesShort;
-               var monthNames = (settings ? settings.monthNames : null) || this._defaults.monthNames;
-               // Check whether a format character is doubled
-               var lookAhead = function(match) {
-                       var matches = (iFormat + 1 < format.length && format.charAt(iFormat + 1) == match);
-                       if (matches)
-                               iFormat++;
-                       return matches;
-               };
-               // Format a number, with leading zero if necessary
-               var formatNumber = function(match, value, len) {
-                       var num = '' + value;
-                       if (lookAhead(match))
-                               while (num.length < len)
-                                       num = '0' + num;
-                       return num;
-               };
-               // Format a name, short or long as requested
-               var formatName = function(match, value, shortNames, longNames) {
-                       return (lookAhead(match) ? longNames[value] : shortNames[value]);
-               };
-               var output = '';
-               var literal = false;
-               if (date)
-                       for (var iFormat = 0; iFormat < format.length; iFormat++) {
-                               if (literal)
-                                       if (format.charAt(iFormat) == "'" && !lookAhead("'"))
-                                               literal = false;
-                                       else
-                                               output += format.charAt(iFormat);
-                               else
-                                       switch (format.charAt(iFormat)) {
-                                               case 'd':
-                                                       output += formatNumber('d', date.getDate(), 2);
-                                                       break;
-                                               case 'D':
-                                                       output += formatName('D', date.getDay(), dayNamesShort, dayNames);
-                                                       break;
-                                               case 'o':
-                                                       output += formatNumber('o',
-                                                               Math.round((new Date(date.getFullYear(), date.getMonth(), date.getDate()).getTime() - new Date(date.getFullYear(), 0, 0).getTime()) / 86400000), 3);
-                                                       break;
-                                               case 'm':
-                                                       output += formatNumber('m', date.getMonth() + 1, 2);
-                                                       break;
-                                               case 'M':
-                                                       output += formatName('M', date.getMonth(), monthNamesShort, monthNames);
-                                                       break;
-                                               case 'y':
-                                                       output += (lookAhead('y') ? date.getFullYear() :
-                                                               (date.getYear() % 100 < 10 ? '0' : '') + date.getYear() % 100);
-                                                       break;
-                                               case '@':
-                                                       output += date.getTime();
-                                                       break;
-                                               case '!':
-                                                       output += date.getTime() * 10000 + this._ticksTo1970;
-                                                       break;
-                                               case "'":
-                                                       if (lookAhead("'"))
-                                                               output += "'";
-                                                       else
-                                                               literal = true;
-                                                       break;
-                                               default:
-                                                       output += format.charAt(iFormat);
-                                       }
-                       }
-               return output;
-       },
-
-       /* Extract all possible characters from the date format. */
-       _possibleChars: function (format) {
-               var chars = '';
-               var literal = false;
-               // Check whether a format character is doubled
-               var lookAhead = function(match) {
-                       var matches = (iFormat + 1 < format.length && format.charAt(iFormat + 1) == match);
-                       if (matches)
-                               iFormat++;
-                       return matches;
-               };
-               for (var iFormat = 0; iFormat < format.length; iFormat++)
-                       if (literal)
-                               if (format.charAt(iFormat) == "'" && !lookAhead("'"))
-                                       literal = false;
-                               else
-                                       chars += format.charAt(iFormat);
-                       else
-                               switch (format.charAt(iFormat)) {
-                                       case 'd': case 'm': case 'y': case '@':
-                                               chars += '0123456789';
-                                               break;
-                                       case 'D': case 'M':
-                                               return null; // Accept anything
-                                       case "'":
-                                               if (lookAhead("'"))
-                                                       chars += "'";
-                                               else
-                                                       literal = true;
-                                               break;
-                                       default:
-                                               chars += format.charAt(iFormat);
-                               }
-               return chars;
-       },
-
-       /* Get a setting value, defaulting if necessary. */
-       _get: function(inst, name) {
-               return inst.settings[name] !== undefined ?
-                       inst.settings[name] : this._defaults[name];
-       },
-
-       /* Parse existing date and initialise date picker. */
-       _setDateFromField: function(inst, noDefault) {
-               if (inst.input.val() == inst.lastVal) {
-                       return;
-               }
-               var dateFormat = this._get(inst, 'dateFormat');
-               var dates = inst.lastVal = inst.input ? inst.input.val() : null;
-               var date, defaultDate;
-               date = defaultDate = this._getDefaultDate(inst);
-               var settings = this._getFormatConfig(inst);
-               try {
-                       date = this.parseDate(dateFormat, dates, settings) || defaultDate;
-               } catch (event) {
-                       this.log(event);
-                       dates = (noDefault ? '' : dates);
-               }
-               inst.selectedDay = date.getDate();
-               inst.drawMonth = inst.selectedMonth = date.getMonth();
-               inst.drawYear = inst.selectedYear = date.getFullYear();
-               inst.currentDay = (dates ? date.getDate() : 0);
-               inst.currentMonth = (dates ? date.getMonth() : 0);
-               inst.currentYear = (dates ? date.getFullYear() : 0);
-               this._adjustInstDate(inst);
-       },
-
-       /* Retrieve the default date shown on opening. */
-       _getDefaultDate: function(inst) {
-               return this._restrictMinMax(inst,
-                       this._determineDate(inst, this._get(inst, 'defaultDate'), new Date()));
-       },
-
-       /* A date may be specified as an exact value or a relative one. */
-       _determineDate: function(inst, date, defaultDate) {
-               var offsetNumeric = function(offset) {
-                       var date = new Date();
-                       date.setDate(date.getDate() + offset);
-                       return date;
-               };
-               var offsetString = function(offset) {
-                       try {
-                               return $.datepicker.parseDate($.datepicker._get(inst, 'dateFormat'),
-                                       offset, $.datepicker._getFormatConfig(inst));
-                       }
-                       catch (e) {
-                               // Ignore
-                       }
-                       var date = (offset.toLowerCase().match(/^c/) ?
-                               $.datepicker._getDate(inst) : null) || new Date();
-                       var year = date.getFullYear();
-                       var month = date.getMonth();
-                       var day = date.getDate();
-                       var pattern = /([+-]?[0-9]+)\s*(d|D|w|W|m|M|y|Y)?/g;
-                       var matches = pattern.exec(offset);
-                       while (matches) {
-                               switch (matches[2] || 'd') {
-                                       case 'd' : case 'D' :
-                                               day += parseInt(matches[1],10); break;
-                                       case 'w' : case 'W' :
-                                               day += parseInt(matches[1],10) * 7; break;
-                                       case 'm' : case 'M' :
-                                               month += parseInt(matches[1],10);
-                                               day = Math.min(day, $.datepicker._getDaysInMonth(year, month));
-                                               break;
-                                       case 'y': case 'Y' :
-                                               year += parseInt(matches[1],10);
-                                               day = Math.min(day, $.datepicker._getDaysInMonth(year, month));
-                                               break;
-                               }
-                               matches = pattern.exec(offset);
-                       }
-                       return new Date(year, month, day);
-               };
-               var newDate = (date == null || date === '' ? defaultDate : (typeof date == 'string' ? offsetString(date) :
-                       (typeof date == 'number' ? (isNaN(date) ? defaultDate : offsetNumeric(date)) : new Date(date.getTime()))));
-               newDate = (newDate && newDate.toString() == 'Invalid Date' ? defaultDate : newDate);
-               if (newDate) {
-                       newDate.setHours(0);
-                       newDate.setMinutes(0);
-                       newDate.setSeconds(0);
-                       newDate.setMilliseconds(0);
-               }
-               return this._daylightSavingAdjust(newDate);
-       },
-
-       /* Handle switch to/from daylight saving.
-          Hours may be non-zero on daylight saving cut-over:
-          > 12 when midnight changeover, but then cannot generate
-          midnight datetime, so jump to 1AM, otherwise reset.
-          @param  date  (Date) the date to check
-          @return  (Date) the corrected date */
-       _daylightSavingAdjust: function(date) {
-               if (!date) return null;
-               date.setHours(date.getHours() > 12 ? date.getHours() + 2 : 0);
-               return date;
-       },
-
-       /* Set the date(s) directly. */
-       _setDate: function(inst, date, noChange) {
-               var clear = !date;
-               var origMonth = inst.selectedMonth;
-               var origYear = inst.selectedYear;
-               var newDate = this._restrictMinMax(inst, this._determineDate(inst, date, new Date()));
-               inst.selectedDay = inst.currentDay = newDate.getDate();
-               inst.drawMonth = inst.selectedMonth = inst.currentMonth = newDate.getMonth();
-               inst.drawYear = inst.selectedYear = inst.currentYear = newDate.getFullYear();
-               if ((origMonth != inst.selectedMonth || origYear != inst.selectedYear) && !noChange)
-                       this._notifyChange(inst);
-               this._adjustInstDate(inst);
-               if (inst.input) {
-                       inst.input.val(clear ? '' : this._formatDate(inst));
-               }
-       },
-
-       /* Retrieve the date(s) directly. */
-       _getDate: function(inst) {
-               var startDate = (!inst.currentYear || (inst.input && inst.input.val() == '') ? null :
-                       this._daylightSavingAdjust(new Date(
-                       inst.currentYear, inst.currentMonth, inst.currentDay)));
-                       return startDate;
-       },
-
-       /* Attach the onxxx handlers.  These are declared statically so
-        * they work with static code transformers like Caja.
-        */
-       _attachHandlers: function(inst) {
-               var stepMonths = this._get(inst, 'stepMonths');
-               var id = '#' + inst.id.replace( /\\\\/g, "\\" );
-               inst.dpDiv.find('[data-handler]').map(function () {
-                       var handler = {
-                               prev: function () {
-                                       window['DP_jQuery_' + dpuuid].datepicker._adjustDate(id, -stepMonths, 'M');
-                               },
-                               next: function () {
-                                       window['DP_jQuery_' + dpuuid].datepicker._adjustDate(id, +stepMonths, 'M');
-                               },
-                               hide: function () {
-                                       window['DP_jQuery_' + dpuuid].datepicker._hideDatepicker();
-                               },
-                               today: function () {
-                                       window['DP_jQuery_' + dpuuid].datepicker._gotoToday(id);
-                               },
-                               selectDay: function () {
-                                       window['DP_jQuery_' + dpuuid].datepicker._selectDay(id, +this.getAttribute('data-month'), +this.getAttribute('data-year'), this);
-                                       return false;
-                               },
-                               selectMonth: function () {
-                                       window['DP_jQuery_' + dpuuid].datepicker._selectMonthYear(id, this, 'M');
-                                       return false;
-                               },
-                               selectYear: function () {
-                                       window['DP_jQuery_' + dpuuid].datepicker._selectMonthYear(id, this, 'Y');
-                                       return false;
-                               }
-                       };
-                       $(this).bind(this.getAttribute('data-event'), handler[this.getAttribute('data-handler')]);
-               });
-       },
-       
-       /* Generate the HTML for the current state of the date picker. */
-       _generateHTML: function(inst) {
-               var today = new Date();
-               today = this._daylightSavingAdjust(
-                       new Date(today.getFullYear(), today.getMonth(), today.getDate())); // clear time
-               var isRTL = this._get(inst, 'isRTL');
-               var showButtonPanel = this._get(inst, 'showButtonPanel');
-               var hideIfNoPrevNext = this._get(inst, 'hideIfNoPrevNext');
-               var navigationAsDateFormat = this._get(inst, 'navigationAsDateFormat');
-               var numMonths = this._getNumberOfMonths(inst);
-               var showCurrentAtPos = this._get(inst, 'showCurrentAtPos');
-               var stepMonths = this._get(inst, 'stepMonths');
-               var isMultiMonth = (numMonths[0] != 1 || numMonths[1] != 1);
-               var currentDate = this._daylightSavingAdjust((!inst.currentDay ? new Date(9999, 9, 9) :
-                       new Date(inst.currentYear, inst.currentMonth, inst.currentDay)));
-               var minDate = this._getMinMaxDate(inst, 'min');
-               var maxDate = this._getMinMaxDate(inst, 'max');
-               var drawMonth = inst.drawMonth - showCurrentAtPos;
-               var drawYear = inst.drawYear;
-               if (drawMonth < 0) {
-                       drawMonth += 12;
-                       drawYear--;
-               }
-               if (maxDate) {
-                       var maxDraw = this._daylightSavingAdjust(new Date(maxDate.getFullYear(),
-                               maxDate.getMonth() - (numMonths[0] * numMonths[1]) + 1, maxDate.getDate()));
-                       maxDraw = (minDate && maxDraw < minDate ? minDate : maxDraw);
-                       while (this._daylightSavingAdjust(new Date(drawYear, drawMonth, 1)) > maxDraw) {
-                               drawMonth--;
-                               if (drawMonth < 0) {
-                                       drawMonth = 11;
-                                       drawYear--;
-                               }
-                       }
-               }
-               inst.drawMonth = drawMonth;
-               inst.drawYear = drawYear;
-               var prevText = this._get(inst, 'prevText');
-               prevText = (!navigationAsDateFormat ? prevText : this.formatDate(prevText,
-                       this._daylightSavingAdjust(new Date(drawYear, drawMonth - stepMonths, 1)),
-                       this._getFormatConfig(inst)));
-               var prev = (this._canAdjustMonth(inst, -1, drawYear, drawMonth) ?
-                       '<a class="ui-datepicker-prev ui-corner-all" data-handler="prev" data-event="click"' +
-                       ' title="' + prevText + '"><span class="ui-icon ui-icon-circle-triangle-' + ( isRTL ? 'e' : 'w') + '">' + prevText + '</span></a>' :
-                       (hideIfNoPrevNext ? '' : '<a class="ui-datepicker-prev ui-corner-all ui-state-disabled" title="'+ prevText +'"><span class="ui-icon ui-icon-circle-triangle-' + ( isRTL ? 'e' : 'w') + '">' + prevText + '</span></a>'));
-               var nextText = this._get(inst, 'nextText');
-               nextText = (!navigationAsDateFormat ? nextText : this.formatDate(nextText,
-                       this._daylightSavingAdjust(new Date(drawYear, drawMonth + stepMonths, 1)),
-                       this._getFormatConfig(inst)));
-               var next = (this._canAdjustMonth(inst, +1, drawYear, drawMonth) ?
-                       '<a class="ui-datepicker-next ui-corner-all" data-handler="next" data-event="click"' +
-                       ' title="' + nextText + '"><span class="ui-icon ui-icon-circle-triangle-' + ( isRTL ? 'w' : 'e') + '">' + nextText + '</span></a>' :
-                       (hideIfNoPrevNext ? '' : '<a class="ui-datepicker-next ui-corner-all ui-state-disabled" title="'+ nextText + '"><span class="ui-icon ui-icon-circle-triangle-' + ( isRTL ? 'w' : 'e') + '">' + nextText + '</span></a>'));
-               var currentText = this._get(inst, 'currentText');
-               var gotoDate = (this._get(inst, 'gotoCurrent') && inst.currentDay ? currentDate : today);
-               currentText = (!navigationAsDateFormat ? currentText :
-                       this.formatDate(currentText, gotoDate, this._getFormatConfig(inst)));
-               var controls = (!inst.inline ? '<button type="button" class="ui-datepicker-close ui-state-default ui-priority-primary ui-corner-all" data-handler="hide" data-event="click">' +
-                       this._get(inst, 'closeText') + '</button>' : '');
-               var buttonPanel = (showButtonPanel) ? '<div class="ui-datepicker-buttonpane ui-widget-content">' + (isRTL ? controls : '') +
-                       (this._isInRange(inst, gotoDate) ? '<button type="button" class="ui-datepicker-current ui-state-default ui-priority-secondary ui-corner-all" data-handler="today" data-event="click"' +
-                       '>' + currentText + '</button>' : '') + (isRTL ? '' : controls) + '</div>' : '';
-               var firstDay = parseInt(this._get(inst, 'firstDay'),10);
-               firstDay = (isNaN(firstDay) ? 0 : firstDay);
-               var showWeek = this._get(inst, 'showWeek');
-               var dayNames = this._get(inst, 'dayNames');
-               var dayNamesShort = this._get(inst, 'dayNamesShort');
-               var dayNamesMin = this._get(inst, 'dayNamesMin');
-               var monthNames = this._get(inst, 'monthNames');
-               var monthNamesShort = this._get(inst, 'monthNamesShort');
-               var beforeShowDay = this._get(inst, 'beforeShowDay');
-               var showOtherMonths = this._get(inst, 'showOtherMonths');
-               var selectOtherMonths = this._get(inst, 'selectOtherMonths');
-               var calculateWeek = this._get(inst, 'calculateWeek') || this.iso8601Week;
-               var defaultDate = this._getDefaultDate(inst);
-               var html = '';
-               for (var row = 0; row < numMonths[0]; row++) {
-                       var group = '';
-                       this.maxRows = 4;
-                       for (var col = 0; col < numMonths[1]; col++) {
-                               var selectedDate = this._daylightSavingAdjust(new Date(drawYear, drawMonth, inst.selectedDay));
-                               var cornerClass = ' ui-corner-all';
-                               var calender = '';
-                               if (isMultiMonth) {
-                                       calender += '<div class="ui-datepicker-group';
-                                       if (numMonths[1] > 1)
-                                               switch (col) {
-                                                       case 0: calender += ' ui-datepicker-group-first';
-                                                               cornerClass = ' ui-corner-' + (isRTL ? 'right' : 'left'); break;
-                                                       case numMonths[1]-1: calender += ' ui-datepicker-group-last';
-                                                               cornerClass = ' ui-corner-' + (isRTL ? 'left' : 'right'); break;
-                                                       default: calender += ' ui-datepicker-group-middle'; cornerClass = ''; break;
-                                               }
-                                       calender += '">';
-                               }
-                               calender += '<div class="ui-datepicker-header ui-widget-header ui-helper-clearfix' + cornerClass + '">' +
-                                       (/all|left/.test(cornerClass) && row == 0 ? (isRTL ? next : prev) : '') +
-                                       (/all|right/.test(cornerClass) && row == 0 ? (isRTL ? prev : next) : '') +
-                                       this._generateMonthYearHeader(inst, drawMonth, drawYear, minDate, maxDate,
-                                       row > 0 || col > 0, monthNames, monthNamesShort) + // draw month headers
-                                       '</div><table class="ui-datepicker-calendar"><thead>' +
-                                       '<tr>';
-                               var thead = (showWeek ? '<th class="ui-datepicker-week-col">' + this._get(inst, 'weekHeader') + '</th>' : '');
-                               for (var dow = 0; dow < 7; dow++) { // days of the week
-                                       var day = (dow + firstDay) % 7;
-                                       thead += '<th' + ((dow + firstDay + 6) % 7 >= 5 ? ' class="ui-datepicker-week-end"' : '') + '>' +
-                                               '<span title="' + dayNames[day] + '">' + dayNamesMin[day] + '</span></th>';
-                               }
-                               calender += thead + '</tr></thead><tbody>';
-                               var daysInMonth = this._getDaysInMonth(drawYear, drawMonth);
-                               if (drawYear == inst.selectedYear && drawMonth == inst.selectedMonth)
-                                       inst.selectedDay = Math.min(inst.selectedDay, daysInMonth);
-                               var leadDays = (this._getFirstDayOfMonth(drawYear, drawMonth) - firstDay + 7) % 7;
-                               var curRows = Math.ceil((leadDays + daysInMonth) / 7); // calculate the number of rows to generate
-                               var numRows = (isMultiMonth ? this.maxRows > curRows ? this.maxRows : curRows : curRows); //If multiple months, use the higher number of rows (see #7043)
-                               this.maxRows = numRows;
-                               var printDate = this._daylightSavingAdjust(new Date(drawYear, drawMonth, 1 - leadDays));
-                               for (var dRow = 0; dRow < numRows; dRow++) { // create date picker rows
-                                       calender += '<tr>';
-                                       var tbody = (!showWeek ? '' : '<td class="ui-datepicker-week-col">' +
-                                               this._get(inst, 'calculateWeek')(printDate) + '</td>');
-                                       for (var dow = 0; dow < 7; dow++) { // create date picker days
-                                               var daySettings = (beforeShowDay ?
-                                                       beforeShowDay.apply((inst.input ? inst.input[0] : null), [printDate]) : [true, '']);
-                                               var otherMonth = (printDate.getMonth() != drawMonth);
-                                               var unselectable = (otherMonth && !selectOtherMonths) || !daySettings[0] ||
-                                                       (minDate && printDate < minDate) || (maxDate && printDate > maxDate);
-                                               tbody += '<td class="' +
-                                                       ((dow + firstDay + 6) % 7 >= 5 ? ' ui-datepicker-week-end' : '') + // highlight weekends
-                                                       (otherMonth ? ' ui-datepicker-other-month' : '') + // highlight days from other months
-                                                       ((printDate.getTime() == selectedDate.getTime() && drawMonth == inst.selectedMonth && inst._keyEvent) || // user pressed key
-                                                       (defaultDate.getTime() == printDate.getTime() && defaultDate.getTime() == selectedDate.getTime()) ?
-                                                       // or defaultDate is current printedDate and defaultDate is selectedDate
-                                                       ' ' + this._dayOverClass : '') + // highlight selected day
-                                                       (unselectable ? ' ' + this._unselectableClass + ' ui-state-disabled': '') +  // highlight unselectable days
-                                                       (otherMonth && !showOtherMonths ? '' : ' ' + daySettings[1] + // highlight custom dates
-                                                       (printDate.getTime() == currentDate.getTime() ? ' ' + this._currentClass : '') + // highlight selected day
-                                                       (printDate.getTime() == today.getTime() ? ' ui-datepicker-today' : '')) + '"' + // highlight today (if different)
-                                                       ((!otherMonth || showOtherMonths) && daySettings[2] ? ' title="' + daySettings[2] + '"' : '') + // cell title
-                                                       (unselectable ? '' : ' data-handler="selectDay" data-event="click" data-month="' + printDate.getMonth() + '" data-year="' + printDate.getFullYear() + '"') + '>' + // actions
-                                                       (otherMonth && !showOtherMonths ? '&#xa0;' : // display for other months
-                                                       (unselectable ? '<span class="ui-state-default">' + printDate.getDate() + '</span>' : '<a class="ui-state-default' +
-                                                       (printDate.getTime() == today.getTime() ? ' ui-state-highlight' : '') +
-                                                       (printDate.getTime() == currentDate.getTime() ? ' ui-state-active' : '') + // highlight selected day
-                                                       (otherMonth ? ' ui-priority-secondary' : '') + // distinguish dates from other months
-                                                       '" href="#">' + printDate.getDate() + '</a>')) + '</td>'; // display selectable date
-                                               printDate.setDate(printDate.getDate() + 1);
-                                               printDate = this._daylightSavingAdjust(printDate);
-                                       }
-                                       calender += tbody + '</tr>';
-                               }
-                               drawMonth++;
-                               if (drawMonth > 11) {
-                                       drawMonth = 0;
-                                       drawYear++;
-                               }
-                               calender += '</tbody></table>' + (isMultiMonth ? '</div>' + 
-                                                       ((numMonths[0] > 0 && col == numMonths[1]-1) ? '<div class="ui-datepicker-row-break"></div>' : '') : '');
-                               group += calender;
-                       }
-                       html += group;
-               }
-               html += buttonPanel + ($.browser.msie && parseInt($.browser.version,10) < 7 && !inst.inline ?
-                       '<iframe src="javascript:false;" class="ui-datepicker-cover" frameborder="0"></iframe>' : '');
-               inst._keyEvent = false;
-               return html;
-       },
-
-       /* Generate the month and year header. */
-       _generateMonthYearHeader: function(inst, drawMonth, drawYear, minDate, maxDate,
-                       secondary, monthNames, monthNamesShort) {
-               var changeMonth = this._get(inst, 'changeMonth');
-               var changeYear = this._get(inst, 'changeYear');
-               var showMonthAfterYear = this._get(inst, 'showMonthAfterYear');
-               var html = '<div class="ui-datepicker-title">';
-               var monthHtml = '';
-               // month selection
-               if (secondary || !changeMonth)
-                       monthHtml += '<span class="ui-datepicker-month">' + monthNames[drawMonth] + '</span>';
-               else {
-                       var inMinYear = (minDate && minDate.getFullYear() == drawYear);
-                       var inMaxYear = (maxDate && maxDate.getFullYear() == drawYear);
-                       monthHtml += '<select class="ui-datepicker-month" data-handler="selectMonth" data-event="change">';
-                       for (var month = 0; month < 12; month++) {
-                               if ((!inMinYear || month >= minDate.getMonth()) &&
-                                               (!inMaxYear || month <= maxDate.getMonth()))
-                                       monthHtml += '<option value="' + month + '"' +
-                                               (month == drawMonth ? ' selected="selected"' : '') +
-                                               '>' + monthNamesShort[month] + '</option>';
-                       }
-                       monthHtml += '</select>';
-               }
-               if (!showMonthAfterYear)
-                       html += monthHtml + (secondary || !(changeMonth && changeYear) ? '&#xa0;' : '');
-               // year selection
-               if ( !inst.yearshtml ) {
-                       inst.yearshtml = '';
-                       if (secondary || !changeYear)
-                               html += '<span class="ui-datepicker-year">' + drawYear + '</span>';
-                       else {
-                               // determine range of years to display
-                               var years = this._get(inst, 'yearRange').split(':');
-                               var thisYear = new Date().getFullYear();
-                               var determineYear = function(value) {
-                                       var year = (value.match(/c[+-].*/) ? drawYear + parseInt(value.substring(1), 10) :
-                                               (value.match(/[+-].*/) ? thisYear + parseInt(value, 10) :
-                                               parseInt(value, 10)));
-                                       return (isNaN(year) ? thisYear : year);
-                               };
-                               var year = determineYear(years[0]);
-                               var endYear = Math.max(year, determineYear(years[1] || ''));
-                               year = (minDate ? Math.max(year, minDate.getFullYear()) : year);
-                               endYear = (maxDate ? Math.min(endYear, maxDate.getFullYear()) : endYear);
-                               inst.yearshtml += '<select class="ui-datepicker-year" data-handler="selectYear" data-event="change">';
-                               for (; year <= endYear; year++) {
-                                       inst.yearshtml += '<option value="' + year + '"' +
-                                               (year == drawYear ? ' selected="selected"' : '') +
-                                               '>' + year + '</option>';
-                               }
-                               inst.yearshtml += '</select>';
-                               
-                               html += inst.yearshtml;
-                               inst.yearshtml = null;
-                       }
-               }
-               html += this._get(inst, 'yearSuffix');
-               if (showMonthAfterYear)
-                       html += (secondary || !(changeMonth && changeYear) ? '&#xa0;' : '') + monthHtml;
-               html += '</div>'; // Close datepicker_header
-               return html;
-       },
-
-       /* Adjust one of the date sub-fields. */
-       _adjustInstDate: function(inst, offset, period) {
-               var year = inst.drawYear + (period == 'Y' ? offset : 0);
-               var month = inst.drawMonth + (period == 'M' ? offset : 0);
-               var day = Math.min(inst.selectedDay, this._getDaysInMonth(year, month)) +
-                       (period == 'D' ? offset : 0);
-               var date = this._restrictMinMax(inst,
-                       this._daylightSavingAdjust(new Date(year, month, day)));
-               inst.selectedDay = date.getDate();
-               inst.drawMonth = inst.selectedMonth = date.getMonth();
-               inst.drawYear = inst.selectedYear = date.getFullYear();
-               if (period == 'M' || period == 'Y')
-                       this._notifyChange(inst);
-       },
-
-       /* Ensure a date is within any min/max bounds. */
-       _restrictMinMax: function(inst, date) {
-               var minDate = this._getMinMaxDate(inst, 'min');
-               var maxDate = this._getMinMaxDate(inst, 'max');
-               var newDate = (minDate && date < minDate ? minDate : date);
-               newDate = (maxDate && newDate > maxDate ? maxDate : newDate);
-               return newDate;
-       },
-
-       /* Notify change of month/year. */
-       _notifyChange: function(inst) {
-               var onChange = this._get(inst, 'onChangeMonthYear');
-               if (onChange)
-                       onChange.apply((inst.input ? inst.input[0] : null),
-                               [inst.selectedYear, inst.selectedMonth + 1, inst]);
-       },
-
-       /* Determine the number of months to show. */
-       _getNumberOfMonths: function(inst) {
-               var numMonths = this._get(inst, 'numberOfMonths');
-               return (numMonths == null ? [1, 1] : (typeof numMonths == 'number' ? [1, numMonths] : numMonths));
-       },
-
-       /* Determine the current maximum date - ensure no time components are set. */
-       _getMinMaxDate: function(inst, minMax) {
-               return this._determineDate(inst, this._get(inst, minMax + 'Date'), null);
-       },
-
-       /* Find the number of days in a given month. */
-       _getDaysInMonth: function(year, month) {
-               return 32 - this._daylightSavingAdjust(new Date(year, month, 32)).getDate();
-       },
-
-       /* Find the day of the week of the first of a month. */
-       _getFirstDayOfMonth: function(year, month) {
-               return new Date(year, month, 1).getDay();
-       },
-
-       /* Determines if we should allow a "next/prev" month display change. */
-       _canAdjustMonth: function(inst, offset, curYear, curMonth) {
-               var numMonths = this._getNumberOfMonths(inst);
-               var date = this._daylightSavingAdjust(new Date(curYear,
-                       curMonth + (offset < 0 ? offset : numMonths[0] * numMonths[1]), 1));
-               if (offset < 0)
-                       date.setDate(this._getDaysInMonth(date.getFullYear(), date.getMonth()));
-               return this._isInRange(inst, date);
-       },
-
-       /* Is the given date in the accepted range? */
-       _isInRange: function(inst, date) {
-               var minDate = this._getMinMaxDate(inst, 'min');
-               var maxDate = this._getMinMaxDate(inst, 'max');
-               return ((!minDate || date.getTime() >= minDate.getTime()) &&
-                       (!maxDate || date.getTime() <= maxDate.getTime()));
-       },
-
-       /* Provide the configuration settings for formatting/parsing. */
-       _getFormatConfig: function(inst) {
-               var shortYearCutoff = this._get(inst, 'shortYearCutoff');
-               shortYearCutoff = (typeof shortYearCutoff != 'string' ? shortYearCutoff :
-                       new Date().getFullYear() % 100 + parseInt(shortYearCutoff, 10));
-               return {shortYearCutoff: shortYearCutoff,
-                       dayNamesShort: this._get(inst, 'dayNamesShort'), dayNames: this._get(inst, 'dayNames'),
-                       monthNamesShort: this._get(inst, 'monthNamesShort'), monthNames: this._get(inst, 'monthNames')};
-       },
-
-       /* Format the given date for display. */
-       _formatDate: function(inst, day, month, year) {
-               if (!day) {
-                       inst.currentDay = inst.selectedDay;
-                       inst.currentMonth = inst.selectedMonth;
-                       inst.currentYear = inst.selectedYear;
-               }
-               var date = (day ? (typeof day == 'object' ? day :
-                       this._daylightSavingAdjust(new Date(year, month, day))) :
-                       this._daylightSavingAdjust(new Date(inst.currentYear, inst.currentMonth, inst.currentDay)));
-               return this.formatDate(this._get(inst, 'dateFormat'), date, this._getFormatConfig(inst));
-       }
-});
-
-/*
- * Bind hover events for datepicker elements.
- * Done via delegate so the binding only occurs once in the lifetime of the parent div.
- * Global instActive, set by _updateDatepicker allows the handlers to find their way back to the active picker.
- */ 
-function bindHover(dpDiv) {
-       var selector = 'button, .ui-datepicker-prev, .ui-datepicker-next, .ui-datepicker-calendar td a';
-       return dpDiv.bind('mouseout', function(event) {
-                       var elem = $( event.target ).closest( selector );
-                       if ( !elem.length ) {
-                               return;
-                       }
-                       elem.removeClass( "ui-state-hover ui-datepicker-prev-hover ui-datepicker-next-hover" );
-               })
-               .bind('mouseover', function(event) {
-                       var elem = $( event.target ).closest( selector );
-                       if ($.datepicker._isDisabledDatepicker( instActive.inline ? dpDiv.parent()[0] : instActive.input[0]) ||
-                                       !elem.length ) {
-                               return;
-                       }
-                       elem.parents('.ui-datepicker-calendar').find('a').removeClass('ui-state-hover');
-                       elem.addClass('ui-state-hover');
-                       if (elem.hasClass('ui-datepicker-prev')) elem.addClass('ui-datepicker-prev-hover');
-                       if (elem.hasClass('ui-datepicker-next')) elem.addClass('ui-datepicker-next-hover');
-               });
-}
-
-/* jQuery extend now ignores nulls! */
-function extendRemove(target, props) {
-       $.extend(target, props);
-       for (var name in props)
-               if (props[name] == null || props[name] == undefined)
-                       target[name] = props[name];
-       return target;
-};
-
-/* Determine whether an object is an array. */
-function isArray(a) {
-       return (a && (($.browser.safari && typeof a == 'object' && a.length) ||
-               (a.constructor && a.constructor.toString().match(/\Array\(\)/))));
-};
-
-/* Invoke the datepicker functionality.
-   @param  options  string - a command, optionally followed by additional parameters or
-                    Object - settings for attaching new datepicker functionality
-   @return  jQuery object */
-$.fn.datepicker = function(options){
-       
-       /* Verify an empty collection wasn't passed - Fixes #6976 */
-       if ( !this.length ) {
-               return this;
-       }
-       
-       /* Initialise the date picker. */
-       if (!$.datepicker.initialized) {
-               $(document).mousedown($.datepicker._checkExternalClick).
-                       find('body').append($.datepicker.dpDiv);
-               $.datepicker.initialized = true;
-       }
-
-       var otherArgs = Array.prototype.slice.call(arguments, 1);
-       if (typeof options == 'string' && (options == 'isDisabled' || options == 'getDate' || options == 'widget'))
-               return $.datepicker['_' + options + 'Datepicker'].
-                       apply($.datepicker, [this[0]].concat(otherArgs));
-       if (options == 'option' && arguments.length == 2 && typeof arguments[1] == 'string')
-               return $.datepicker['_' + options + 'Datepicker'].
-                       apply($.datepicker, [this[0]].concat(otherArgs));
-       return this.each(function() {
-               typeof options == 'string' ?
-                       $.datepicker['_' + options + 'Datepicker'].
-                               apply($.datepicker, [this].concat(otherArgs)) :
-                       $.datepicker._attachDatepicker(this, options);
-       });
-};
-
-$.datepicker = new Datepicker(); // singleton instance
-$.datepicker.initialized = false;
-$.datepicker.uuid = new Date().getTime();
-$.datepicker.version = "1.8.24";
-
-// Workaround for #4055
-// Add another global to avoid noConflict issues with inline event handlers
-window['DP_jQuery_' + dpuuid] = $;
-
-})(jQuery);
diff --git a/resources/jquery.ui/jquery.ui.dialog.js b/resources/jquery.ui/jquery.ui.dialog.js
deleted file mode 100644 (file)
index 06b85f2..0000000
+++ /dev/null
@@ -1,866 +0,0 @@
-/*!
- * jQuery UI Dialog 1.8.24
- *
- * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
- * Dual licensed under the MIT or GPL Version 2 licenses.
- * http://jquery.org/license
- *
- * http://docs.jquery.com/UI/Dialog
- *
- * Depends:
- *     jquery.ui.core.js
- *     jquery.ui.widget.js
- *  jquery.ui.button.js
- *     jquery.ui.draggable.js
- *     jquery.ui.mouse.js
- *     jquery.ui.position.js
- *     jquery.ui.resizable.js
- */
-(function( $, undefined ) {
-
-var uiDialogClasses =
-               'ui-dialog ' +
-               'ui-widget ' +
-               'ui-widget-content ' +
-               'ui-corner-all ',
-       sizeRelatedOptions = {
-               buttons: true,
-               height: true,
-               maxHeight: true,
-               maxWidth: true,
-               minHeight: true,
-               minWidth: true,
-               width: true
-       },
-       resizableRelatedOptions = {
-               maxHeight: true,
-               maxWidth: true,
-               minHeight: true,
-               minWidth: true
-       };
-
-$.widget("ui.dialog", {
-       options: {
-               autoOpen: true,
-               buttons: {},
-               closeOnEscape: true,
-               closeText: 'close',
-               dialogClass: '',
-               draggable: true,
-               hide: null,
-               height: 'auto',
-               maxHeight: false,
-               maxWidth: false,
-               minHeight: 150,
-               minWidth: 150,
-               modal: false,
-               position: {
-                       my: 'center',
-                       at: 'center',
-                       collision: 'fit',
-                       // ensure that the titlebar is never outside the document
-                       using: function(pos) {
-                               var topOffset = $(this).css(pos).offset().top;
-                               if (topOffset < 0) {
-                                       $(this).css('top', pos.top - topOffset);
-                               }
-                       }
-               },
-               resizable: true,
-               show: null,
-               stack: true,
-               title: '',
-               width: 300,
-               zIndex: 1000
-       },
-
-       _create: function() {
-               this.originalTitle = this.element.attr('title');
-               // #5742 - .attr() might return a DOMElement
-               if ( typeof this.originalTitle !== "string" ) {
-                       this.originalTitle = "";
-               }
-
-               this.options.title = this.options.title || this.originalTitle;
-               var self = this,
-                       options = self.options,
-
-                       title = options.title || '&#160;',
-                       titleId = $.ui.dialog.getTitleId(self.element),
-
-                       uiDialog = (self.uiDialog = $('<div></div>'))
-                               .appendTo(document.body)
-                               .hide()
-                               .addClass(uiDialogClasses + options.dialogClass)
-                               .css({
-                                       zIndex: options.zIndex
-                               })
-                               // setting tabIndex makes the div focusable
-                               // setting outline to 0 prevents a border on focus in Mozilla
-                               .attr('tabIndex', -1).css('outline', 0).keydown(function(event) {
-                                       if (options.closeOnEscape && !event.isDefaultPrevented() && event.keyCode &&
-                                               event.keyCode === $.ui.keyCode.ESCAPE) {
-                                               
-                                               self.close(event);
-                                               event.preventDefault();
-                                       }
-                               })
-                               .attr({
-                                       role: 'dialog',
-                                       'aria-labelledby': titleId
-                               })
-                               .mousedown(function(event) {
-                                       self.moveToTop(false, event);
-                               }),
-
-                       uiDialogContent = self.element
-                               .show()
-                               .removeAttr('title')
-                               .addClass(
-                                       'ui-dialog-content ' +
-                                       'ui-widget-content')
-                               .appendTo(uiDialog),
-
-                       uiDialogTitlebar = (self.uiDialogTitlebar = $('<div></div>'))
-                               .addClass(
-                                       'ui-dialog-titlebar ' +
-                                       'ui-widget-header ' +
-                                       'ui-corner-all ' +
-                                       'ui-helper-clearfix'
-                               )
-                               .prependTo(uiDialog),
-
-                       uiDialogTitlebarClose = $('<a href="#"></a>')
-                               .addClass(
-                                       'ui-dialog-titlebar-close ' +
-                                       'ui-corner-all'
-                               )
-                               .attr('role', 'button')
-                               .hover(
-                                       function() {
-                                               uiDialogTitlebarClose.addClass('ui-state-hover');
-                                       },
-                                       function() {
-                                               uiDialogTitlebarClose.removeClass('ui-state-hover');
-                                       }
-                               )
-                               .focus(function() {
-                                       uiDialogTitlebarClose.addClass('ui-state-focus');
-                               })
-                               .blur(function() {
-                                       uiDialogTitlebarClose.removeClass('ui-state-focus');
-                               })
-                               .click(function(event) {
-                                       self.close(event);
-                                       return false;
-                               })
-                               .appendTo(uiDialogTitlebar),
-
-                       uiDialogTitlebarCloseText = (self.uiDialogTitlebarCloseText = $('<span></span>'))
-                               .addClass(
-                                       'ui-icon ' +
-                                       'ui-icon-closethick'
-                               )
-                               .text(options.closeText)
-                               .appendTo(uiDialogTitlebarClose),
-
-                       uiDialogTitle = $('<span></span>')
-                               .addClass('ui-dialog-title')
-                               .attr('id', titleId)
-                               .html(title)
-                               .prependTo(uiDialogTitlebar);
-
-               //handling of deprecated beforeclose (vs beforeClose) option
-               //Ticket #4669 http://dev.jqueryui.com/ticket/4669
-               //TODO: remove in 1.9pre
-               if ($.isFunction(options.beforeclose) && !$.isFunction(options.beforeClose)) {
-                       options.beforeClose = options.beforeclose;
-               }
-
-               uiDialogTitlebar.find("*").add(uiDialogTitlebar).disableSelection();
-
-               if (options.draggable && $.fn.draggable) {
-                       self._makeDraggable();
-               }
-               if (options.resizable && $.fn.resizable) {
-                       self._makeResizable();
-               }
-
-               self._createButtons(options.buttons);
-               self._isOpen = false;
-
-               if ($.fn.bgiframe) {
-                       uiDialog.bgiframe();
-               }
-       },
-
-       _init: function() {
-               if ( this.options.autoOpen ) {
-                       this.open();
-               }
-       },
-
-       destroy: function() {
-               var self = this;
-               
-               if (self.overlay) {
-                       self.overlay.destroy();
-               }
-               self.uiDialog.hide();
-               self.element
-                       .unbind('.dialog')
-                       .removeData('dialog')
-                       .removeClass('ui-dialog-content ui-widget-content')
-                       .hide().appendTo('body');
-               self.uiDialog.remove();
-
-               if (self.originalTitle) {
-                       self.element.attr('title', self.originalTitle);
-               }
-
-               return self;
-       },
-
-       widget: function() {
-               return this.uiDialog;
-       },
-
-       close: function(event) {
-               var self = this,
-                       maxZ, thisZ;
-               
-               if (false === self._trigger('beforeClose', event)) {
-                       return;
-               }
-
-               if (self.overlay) {
-                       self.overlay.destroy();
-               }
-               self.uiDialog.unbind('keypress.ui-dialog');
-
-               self._isOpen = false;
-
-               if (self.options.hide) {
-                       self.uiDialog.hide(self.options.hide, function() {
-                               self._trigger('close', event);
-                       });
-               } else {
-                       self.uiDialog.hide();
-                       self._trigger('close', event);
-               }
-
-               $.ui.dialog.overlay.resize();
-
-               // adjust the maxZ to allow other modal dialogs to continue to work (see #4309)
-               if (self.options.modal) {
-                       maxZ = 0;
-                       $('.ui-dialog').each(function() {
-                               if (this !== self.uiDialog[0]) {
-                                       thisZ = $(this).css('z-index');
-                                       if(!isNaN(thisZ)) {
-                                               maxZ = Math.max(maxZ, thisZ);
-                                       }
-                               }
-                       });
-                       $.ui.dialog.maxZ = maxZ;
-               }
-
-               return self;
-       },
-
-       isOpen: function() {
-               return this._isOpen;
-       },
-
-       // the force parameter allows us to move modal dialogs to their correct
-       // position on open
-       moveToTop: function(force, event) {
-               var self = this,
-                       options = self.options,
-                       saveScroll;
-
-               if ((options.modal && !force) ||
-                       (!options.stack && !options.modal)) {
-                       return self._trigger('focus', event);
-               }
-
-               if (options.zIndex > $.ui.dialog.maxZ) {
-                       $.ui.dialog.maxZ = options.zIndex;
-               }
-               if (self.overlay) {
-                       $.ui.dialog.maxZ += 1;
-                       self.overlay.$el.css('z-index', $.ui.dialog.overlay.maxZ = $.ui.dialog.maxZ);
-               }
-
-               //Save and then restore scroll since Opera 9.5+ resets when parent z-Index is changed.
-               //  http://ui.jquery.com/bugs/ticket/3193
-               saveScroll = { scrollTop: self.element.scrollTop(), scrollLeft: self.element.scrollLeft() };
-               $.ui.dialog.maxZ += 1;
-               self.uiDialog.css('z-index', $.ui.dialog.maxZ);
-               self.element.attr(saveScroll);
-               self._trigger('focus', event);
-
-               return self;
-       },
-
-       open: function() {
-               if (this._isOpen) { return; }
-
-               var self = this,
-                       options = self.options,
-                       uiDialog = self.uiDialog;
-
-               self.overlay = options.modal ? new $.ui.dialog.overlay(self) : null;
-               self._size();
-               self._position(options.position);
-               uiDialog.show(options.show);
-               self.moveToTop(true);
-
-               // prevent tabbing out of modal dialogs
-               if ( options.modal ) {
-                       uiDialog.bind( "keydown.ui-dialog", function( event ) {
-                               if ( event.keyCode !== $.ui.keyCode.TAB ) {
-                                       return;
-                               }
-
-                               var tabbables = $(':tabbable', this),
-                                       first = tabbables.filter(':first'),
-                                       last  = tabbables.filter(':last');
-
-                               if (event.target === last[0] && !event.shiftKey) {
-                                       first.focus(1);
-                                       return false;
-                               } else if (event.target === first[0] && event.shiftKey) {
-                                       last.focus(1);
-                                       return false;
-                               }
-                       });
-               }
-
-               // set focus to the first tabbable element in the content area or the first button
-               // if there are no tabbable elements, set focus on the dialog itself
-               $(self.element.find(':tabbable').get().concat(
-                       uiDialog.find('.ui-dialog-buttonpane :tabbable').get().concat(
-                               uiDialog.get()))).eq(0).focus();
-
-               self._isOpen = true;
-               self._trigger('open');
-
-               return self;
-       },
-
-       _createButtons: function(buttons) {
-               var self = this,
-                       hasButtons = false,
-                       uiDialogButtonPane = $('<div></div>')
-                               .addClass(
-                                       'ui-dialog-buttonpane ' +
-                                       'ui-widget-content ' +
-                                       'ui-helper-clearfix'
-                               ),
-                       uiButtonSet = $( "<div></div>" )
-                               .addClass( "ui-dialog-buttonset" )
-                               .appendTo( uiDialogButtonPane );
-
-               // if we already have a button pane, remove it
-               self.uiDialog.find('.ui-dialog-buttonpane').remove();
-
-               if (typeof buttons === 'object' && buttons !== null) {
-                       $.each(buttons, function() {
-                               return !(hasButtons = true);
-                       });
-               }
-               if (hasButtons) {
-                       $.each(buttons, function(name, props) {
-                               props = $.isFunction( props ) ?
-                                       { click: props, text: name } :
-                                       props;
-                               var button = $('<button type="button"></button>')
-                                       .click(function() {
-                                               props.click.apply(self.element[0], arguments);
-                                       })
-                                       .appendTo(uiButtonSet);
-                               // can't use .attr( props, true ) with jQuery 1.3.2.
-                               $.each( props, function( key, value ) {
-                                       if ( key === "click" ) {
-                                               return;
-                                       }
-                                       if ( key in button ) {
-                                               button[ key ]( value );
-                                       } else {
-                                               button.attr( key, value );
-                                       }
-                               });
-                               if ($.fn.button) {
-                                       button.button();
-                               }
-                       });
-                       uiDialogButtonPane.appendTo(self.uiDialog);
-               }
-       },
-
-       _makeDraggable: function() {
-               var self = this,
-                       options = self.options,
-                       doc = $(document),
-                       heightBeforeDrag;
-
-               function filteredUi(ui) {
-                       return {
-                               position: ui.position,
-                               offset: ui.offset
-                       };
-               }
-
-               self.uiDialog.draggable({
-                       cancel: '.ui-dialog-content, .ui-dialog-titlebar-close',
-                       handle: '.ui-dialog-titlebar',
-                       containment: 'document',
-                       start: function(event, ui) {
-                               heightBeforeDrag = options.height === "auto" ? "auto" : $(this).height();
-                               $(this).height($(this).height()).addClass("ui-dialog-dragging");
-                               self._trigger('dragStart', event, filteredUi(ui));
-                       },
-                       drag: function(event, ui) {
-                               self._trigger('drag', event, filteredUi(ui));
-                       },
-                       stop: function(event, ui) {
-                               options.position = [ui.position.left - doc.scrollLeft(),
-                                       ui.position.top - doc.scrollTop()];
-                               $(this).removeClass("ui-dialog-dragging").height(heightBeforeDrag);
-                               self._trigger('dragStop', event, filteredUi(ui));
-                               $.ui.dialog.overlay.resize();
-                       }
-               });
-       },
-
-       _makeResizable: function(handles) {
-               handles = (handles === undefined ? this.options.resizable : handles);
-               var self = this,
-                       options = self.options,
-                       // .ui-resizable has position: relative defined in the stylesheet
-                       // but dialogs have to use absolute or fixed positioning
-                       position = self.uiDialog.css('position'),
-                       resizeHandles = (typeof handles === 'string' ?
-                               handles :
-                               'n,e,s,w,se,sw,ne,nw'
-                       );
-
-               function filteredUi(ui) {
-                       return {
-                               originalPosition: ui.originalPosition,
-                               originalSize: ui.originalSize,
-                               position: ui.position,
-                               size: ui.size
-                       };
-               }
-
-               self.uiDialog.resizable({
-                       cancel: '.ui-dialog-content',
-                       containment: 'document',
-                       alsoResize: self.element,
-                       maxWidth: options.maxWidth,
-                       maxHeight: options.maxHeight,
-                       minWidth: options.minWidth,
-                       minHeight: self._minHeight(),
-                       handles: resizeHandles,
-                       start: function(event, ui) {
-                               $(this).addClass("ui-dialog-resizing");
-                               self._trigger('resizeStart', event, filteredUi(ui));
-                       },
-                       resize: function(event, ui) {
-                               self._trigger('resize', event, filteredUi(ui));
-                       },
-                       stop: function(event, ui) {
-                               $(this).removeClass("ui-dialog-resizing");
-                               options.height = $(this).height();
-                               options.width = $(this).width();
-                               self._trigger('resizeStop', event, filteredUi(ui));
-                               $.ui.dialog.overlay.resize();
-                       }
-               })
-               .css('position', position)
-               .find('.ui-resizable-se').addClass('ui-icon ui-icon-grip-diagonal-se');
-       },
-
-       _minHeight: function() {
-               var options = this.options;
-
-               if (options.height === 'auto') {
-                       return options.minHeight;
-               } else {
-                       return Math.min(options.minHeight, options.height);
-               }
-       },
-
-       _position: function(position) {
-               var myAt = [],
-                       offset = [0, 0],
-                       isVisible;
-
-               if (position) {
-                       // deep extending converts arrays to objects in jQuery <= 1.3.2 :-(
-       //              if (typeof position == 'string' || $.isArray(position)) {
-       //                      myAt = $.isArray(position) ? position : position.split(' ');
-
-                       if (typeof position === 'string' || (typeof position === 'object' && '0' in position)) {
-                               myAt = position.split ? position.split(' ') : [position[0], position[1]];
-                               if (myAt.length === 1) {
-                                       myAt[1] = myAt[0];
-                               }
-
-                               $.each(['left', 'top'], function(i, offsetPosition) {
-                                       if (+myAt[i] === myAt[i]) {
-                                               offset[i] = myAt[i];
-                                               myAt[i] = offsetPosition;
-                                       }
-                               });
-
-                               position = {
-                                       my: myAt.join(" "),
-                                       at: myAt.join(" "),
-                                       offset: offset.join(" ")
-                               };
-                       } 
-
-                       position = $.extend({}, $.ui.dialog.prototype.options.position, position);
-               } else {
-                       position = $.ui.dialog.prototype.options.position;
-               }
-
-               // need to show the dialog to get the actual offset in the position plugin
-               isVisible = this.uiDialog.is(':visible');
-               if (!isVisible) {
-                       this.uiDialog.show();
-               }
-               this.uiDialog
-                       // workaround for jQuery bug #5781 http://dev.jquery.com/ticket/5781
-                       .css({ top: 0, left: 0 })
-                       .position($.extend({ of: window }, position));
-               if (!isVisible) {
-                       this.uiDialog.hide();
-               }
-       },
-
-       _setOptions: function( options ) {
-               var self = this,
-                       resizableOptions = {},
-                       resize = false;
-
-               $.each( options, function( key, value ) {
-                       self._setOption( key, value );
-                       
-                       if ( key in sizeRelatedOptions ) {
-                               resize = true;
-                       }
-                       if ( key in resizableRelatedOptions ) {
-                               resizableOptions[ key ] = value;
-                       }
-               });
-
-               if ( resize ) {
-                       this._size();
-               }
-               if ( this.uiDialog.is( ":data(resizable)" ) ) {
-                       this.uiDialog.resizable( "option", resizableOptions );
-               }
-       },
-
-       _setOption: function(key, value){
-               var self = this,
-                       uiDialog = self.uiDialog;
-
-               switch (key) {
-                       //handling of deprecated beforeclose (vs beforeClose) option
-                       //Ticket #4669 http://dev.jqueryui.com/ticket/4669
-                       //TODO: remove in 1.9pre
-                       case "beforeclose":
-                               key = "beforeClose";
-                               break;
-                       case "buttons":
-                               self._createButtons(value);
-                               break;
-                       case "closeText":
-                               // ensure that we always pass a string
-                               self.uiDialogTitlebarCloseText.text("" + value);
-                               break;
-                       case "dialogClass":
-                               uiDialog
-                                       .removeClass(self.options.dialogClass)
-                                       .addClass(uiDialogClasses + value);
-                               break;
-                       case "disabled":
-                               if (value) {
-                                       uiDialog.addClass('ui-dialog-disabled');
-                               } else {
-                                       uiDialog.removeClass('ui-dialog-disabled');
-                               }
-                               break;
-                       case "draggable":
-                               var isDraggable = uiDialog.is( ":data(draggable)" );
-                               if ( isDraggable && !value ) {
-                                       uiDialog.draggable( "destroy" );
-                               }
-                               
-                               if ( !isDraggable && value ) {
-                                       self._makeDraggable();
-                               }
-                               break;
-                       case "position":
-                               self._position(value);
-                               break;
-                       case "resizable":
-                               // currently resizable, becoming non-resizable
-                               var isResizable = uiDialog.is( ":data(resizable)" );
-                               if (isResizable && !value) {
-                                       uiDialog.resizable('destroy');
-                               }
-
-                               // currently resizable, changing handles
-                               if (isResizable && typeof value === 'string') {
-                                       uiDialog.resizable('option', 'handles', value);
-                               }
-
-                               // currently non-resizable, becoming resizable
-                               if (!isResizable && value !== false) {
-                                       self._makeResizable(value);
-                               }
-                               break;
-                       case "title":
-                               // convert whatever was passed in o a string, for html() to not throw up
-                               $(".ui-dialog-title", self.uiDialogTitlebar).html("" + (value || '&#160;'));
-                               break;
-               }
-
-               $.Widget.prototype._setOption.apply(self, arguments);
-       },
-
-       _size: function() {
-               /* If the user has resized the dialog, the .ui-dialog and .ui-dialog-content
-                * divs will both have width and height set, so we need to reset them
-                */
-               var options = this.options,
-                       nonContentHeight,
-                       minContentHeight,
-                       isVisible = this.uiDialog.is( ":visible" );
-
-               // reset content sizing
-               this.element.show().css({
-                       width: 'auto',
-                       minHeight: 0,
-                       height: 0
-               });
-
-               if (options.minWidth > options.width) {
-                       options.width = options.minWidth;
-               }
-
-               // reset wrapper sizing
-               // determine the height of all the non-content elements
-               nonContentHeight = this.uiDialog.css({
-                               height: 'auto',
-                               width: options.width
-                       })
-                       .height();
-               minContentHeight = Math.max( 0, options.minHeight - nonContentHeight );
-               
-               if ( options.height === "auto" ) {
-                       // only needed for IE6 support
-                       if ( $.support.minHeight ) {
-                               this.element.css({
-                                       minHeight: minContentHeight,
-                                       height: "auto"
-                               });
-                       } else {
-                               this.uiDialog.show();
-                               var autoHeight = this.element.css( "height", "auto" ).height();
-                               if ( !isVisible ) {
-                                       this.uiDialog.hide();
-                               }
-                               this.element.height( Math.max( autoHeight, minContentHeight ) );
-                       }
-               } else {
-                       this.element.height( Math.max( options.height - nonContentHeight, 0 ) );
-               }
-
-               if (this.uiDialog.is(':data(resizable)')) {
-                       this.uiDialog.resizable('option', 'minHeight', this._minHeight());
-               }
-       }
-});
-
-$.extend($.ui.dialog, {
-       version: "1.8.24",
-
-       uuid: 0,
-       maxZ: 0,
-
-       getTitleId: function($el) {
-               var id = $el.attr('id');
-               if (!id) {
-                       this.uuid += 1;
-                       id = this.uuid;
-               }
-               return 'ui-dialog-title-' + id;
-       },
-
-       overlay: function(dialog) {
-               this.$el = $.ui.dialog.overlay.create(dialog);
-       }
-});
-
-$.extend($.ui.dialog.overlay, {
-       instances: [],
-       // reuse old instances due to IE memory leak with alpha transparency (see #5185)
-       oldInstances: [],
-       maxZ: 0,
-       events: $.map('focus,mousedown,mouseup,keydown,keypress,click'.split(','),
-               function(event) { return event + '.dialog-overlay'; }).join(' '),
-       create: function(dialog) {
-               if (this.instances.length === 0) {
-                       // prevent use of anchors and inputs
-                       // we use a setTimeout in case the overlay is created from an
-                       // event that we're going to be cancelling (see #2804)
-                       setTimeout(function() {
-                               // handle $(el).dialog().dialog('close') (see #4065)
-                               if ($.ui.dialog.overlay.instances.length) {
-                                       $(document).bind($.ui.dialog.overlay.events, function(event) {
-                                               // stop events if the z-index of the target is < the z-index of the overlay
-                                               // we cannot return true when we don't want to cancel the event (#3523)
-                                               if ($(event.target).zIndex() < $.ui.dialog.overlay.maxZ) {
-                                                       return false;
-                                               }
-                                       });
-                               }
-                       }, 1);
-
-                       // allow closing by pressing the escape key
-                       $(document).bind('keydown.dialog-overlay', function(event) {
-                               if (dialog.options.closeOnEscape && !event.isDefaultPrevented() && event.keyCode &&
-                                       event.keyCode === $.ui.keyCode.ESCAPE) {
-                                       
-                                       dialog.close(event);
-                                       event.preventDefault();
-                               }
-                       });
-
-                       // handle window resize
-                       $(window).bind('resize.dialog-overlay', $.ui.dialog.overlay.resize);
-               }
-
-               var $el = (this.oldInstances.pop() || $('<div></div>').addClass('ui-widget-overlay'))
-                       .appendTo(document.body)
-                       .css({
-                               width: this.width(),
-                               height: this.height()
-                       });
-
-               if ($.fn.bgiframe) {
-                       $el.bgiframe();
-               }
-
-               this.instances.push($el);
-               return $el;
-       },
-
-       destroy: function($el) {
-               var indexOf = $.inArray($el, this.instances);
-               if (indexOf != -1){
-                       this.oldInstances.push(this.instances.splice(indexOf, 1)[0]);
-               }
-
-               if (this.instances.length === 0) {
-                       $([document, window]).unbind('.dialog-overlay');
-               }
-
-               $el.remove();
-               
-               // adjust the maxZ to allow other modal dialogs to continue to work (see #4309)
-               var maxZ = 0;
-               $.each(this.instances, function() {
-                       maxZ = Math.max(maxZ, this.css('z-index'));
-               });
-               this.maxZ = maxZ;
-       },
-
-       height: function() {
-               var scrollHeight,
-                       offsetHeight;
-               // handle IE 6
-               if ($.browser.msie && $.browser.version < 7) {
-                       scrollHeight = Math.max(
-                               document.documentElement.scrollHeight,
-                               document.body.scrollHeight
-                       );
-                       offsetHeight = Math.max(
-                               document.documentElement.offsetHeight,
-                               document.body.offsetHeight
-                       );
-
-                       if (scrollHeight < offsetHeight) {
-                               return $(window).height() + 'px';
-                       } else {
-                               return scrollHeight + 'px';
-                       }
-               // handle "good" browsers
-               } else {
-                       return $(document).height() + 'px';
-               }
-       },
-
-       width: function() {
-               var scrollWidth,
-                       offsetWidth;
-               // handle IE
-               if ( $.browser.msie ) {
-                       scrollWidth = Math.max(
-                               document.documentElement.scrollWidth,
-                               document.body.scrollWidth
-                       );
-                       offsetWidth = Math.max(
-                               document.documentElement.offsetWidth,
-                               document.body.offsetWidth
-                       );
-
-                       if (scrollWidth < offsetWidth) {
-                               return $(window).width() + 'px';
-                       } else {
-                               return scrollWidth + 'px';
-                       }
-               // handle "good" browsers
-               } else {
-                       return $(document).width() + 'px';
-               }
-       },
-
-       resize: function() {
-               /* If the dialog is draggable and the user drags it past the
-                * right edge of the window, the document becomes wider so we
-                * need to stretch the overlay. If the user then drags the
-                * dialog back to the left, the document will become narrower,
-                * so we need to shrink the overlay to the appropriate size.
-                * This is handled by shrinking the overlay before setting it
-                * to the full document size.
-                */
-               var $overlays = $([]);
-               $.each($.ui.dialog.overlay.instances, function() {
-                       $overlays = $overlays.add(this);
-               });
-
-               $overlays.css({
-                       width: 0,
-                       height: 0
-               }).css({
-                       width: $.ui.dialog.overlay.width(),
-                       height: $.ui.dialog.overlay.height()
-               });
-       }
-});
-
-$.extend($.ui.dialog.overlay.prototype, {
-       destroy: function() {
-               $.ui.dialog.overlay.destroy(this.$el);
-       }
-});
-
-}(jQuery));
diff --git a/resources/jquery.ui/jquery.ui.draggable.js b/resources/jquery.ui/jquery.ui.draggable.js
deleted file mode 100644 (file)
index 149035c..0000000
+++ /dev/null
@@ -1,832 +0,0 @@
-/*!
- * jQuery UI Draggable 1.8.24
- *
- * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
- * Dual licensed under the MIT or GPL Version 2 licenses.
- * http://jquery.org/license
- *
- * http://docs.jquery.com/UI/Draggables
- *
- * Depends:
- *     jquery.ui.core.js
- *     jquery.ui.mouse.js
- *     jquery.ui.widget.js
- */
-(function( $, undefined ) {
-
-$.widget("ui.draggable", $.ui.mouse, {
-       widgetEventPrefix: "drag",
-       options: {
-               addClasses: true,
-               appendTo: "parent",
-               axis: false,
-               connectToSortable: false,
-               containment: false,
-               cursor: "auto",
-               cursorAt: false,
-               grid: false,
-               handle: false,
-               helper: "original",
-               iframeFix: false,
-               opacity: false,
-               refreshPositions: false,
-               revert: false,
-               revertDuration: 500,
-               scope: "default",
-               scroll: true,
-               scrollSensitivity: 20,
-               scrollSpeed: 20,
-               snap: false,
-               snapMode: "both",
-               snapTolerance: 20,
-               stack: false,
-               zIndex: false
-       },
-       _create: function() {
-
-               if (this.options.helper == 'original' && !(/^(?:r|a|f)/).test(this.element.css("position")))
-                       this.element[0].style.position = 'relative';
-
-               (this.options.addClasses && this.element.addClass("ui-draggable"));
-               (this.options.disabled && this.element.addClass("ui-draggable-disabled"));
-
-               this._mouseInit();
-
-       },
-
-       destroy: function() {
-               if(!this.element.data('draggable')) return;
-               this.element
-                       .removeData("draggable")
-                       .unbind(".draggable")
-                       .removeClass("ui-draggable"
-                               + " ui-draggable-dragging"
-                               + " ui-draggable-disabled");
-               this._mouseDestroy();
-
-               return this;
-       },
-
-       _mouseCapture: function(event) {
-
-               var o = this.options;
-
-               // among others, prevent a drag on a resizable-handle
-               if (this.helper || o.disabled || $(event.target).is('.ui-resizable-handle'))
-                       return false;
-
-               //Quit if we're not on a valid handle
-               this.handle = this._getHandle(event);
-               if (!this.handle)
-                       return false;
-               
-               if ( o.iframeFix ) {
-                       $(o.iframeFix === true ? "iframe" : o.iframeFix).each(function() {
-                               $('<div class="ui-draggable-iframeFix" style="background: #fff;"></div>')
-                               .css({
-                                       width: this.offsetWidth+"px", height: this.offsetHeight+"px",
-                                       position: "absolute", opacity: "0.001", zIndex: 1000
-                               })
-                               .css($(this).offset())
-                               .appendTo("body");
-                       });
-               }
-
-               return true;
-
-       },
-
-       _mouseStart: function(event) {
-
-               var o = this.options;
-
-               //Create and append the visible helper
-               this.helper = this._createHelper(event);
-
-               this.helper.addClass("ui-draggable-dragging");
-
-               //Cache the helper size
-               this._cacheHelperProportions();
-
-               //If ddmanager is used for droppables, set the global draggable
-               if($.ui.ddmanager)
-                       $.ui.ddmanager.current = this;
-
-               /*
-                * - Position generation -
-                * This block generates everything position related - it's the core of draggables.
-                */
-
-               //Cache the margins of the original element
-               this._cacheMargins();
-
-               //Store the helper's css position
-               this.cssPosition = this.helper.css("position");
-               this.scrollParent = this.helper.scrollParent();
-
-               //The element's absolute position on the page minus margins
-               this.offset = this.positionAbs = this.element.offset();
-               this.offset = {
-                       top: this.offset.top - this.margins.top,
-                       left: this.offset.left - this.margins.left
-               };
-
-               $.extend(this.offset, {
-                       click: { //Where the click happened, relative to the element
-                               left: event.pageX - this.offset.left,
-                               top: event.pageY - this.offset.top
-                       },
-                       parent: this._getParentOffset(),
-                       relative: this._getRelativeOffset() //This is a relative to absolute position minus the actual position calculation - only used for relative positioned helper
-               });
-
-               //Generate the original position
-               this.originalPosition = this.position = this._generatePosition(event);
-               this.originalPageX = event.pageX;
-               this.originalPageY = event.pageY;
-
-               //Adjust the mouse offset relative to the helper if 'cursorAt' is supplied
-               (o.cursorAt && this._adjustOffsetFromHelper(o.cursorAt));
-
-               //Set a containment if given in the options
-               if(o.containment)
-                       this._setContainment();
-
-               //Trigger event + callbacks
-               if(this._trigger("start", event) === false) {
-                       this._clear();
-                       return false;
-               }
-
-               //Recache the helper size
-               this._cacheHelperProportions();
-
-               //Prepare the droppable offsets
-               if ($.ui.ddmanager && !o.dropBehaviour)
-                       $.ui.ddmanager.prepareOffsets(this, event);
-
-               
-               this._mouseDrag(event, true); //Execute the drag once - this causes the helper not to be visible before getting its correct position
-               
-               //If the ddmanager is used for droppables, inform the manager that dragging has started (see #5003)
-               if ( $.ui.ddmanager ) $.ui.ddmanager.dragStart(this, event);
-               
-               return true;
-       },
-
-       _mouseDrag: function(event, noPropagation) {
-
-               //Compute the helpers position
-               this.position = this._generatePosition(event);
-               this.positionAbs = this._convertPositionTo("absolute");
-
-               //Call plugins and callbacks and use the resulting position if something is returned
-               if (!noPropagation) {
-                       var ui = this._uiHash();
-                       if(this._trigger('drag', event, ui) === false) {
-                               this._mouseUp({});
-                               return false;
-                       }
-                       this.position = ui.position;
-               }
-
-               if(!this.options.axis || this.options.axis != "y") this.helper[0].style.left = this.position.left+'px';
-               if(!this.options.axis || this.options.axis != "x") this.helper[0].style.top = this.position.top+'px';
-               if($.ui.ddmanager) $.ui.ddmanager.drag(this, event);
-
-               return false;
-       },
-
-       _mouseStop: function(event) {
-
-               //If we are using droppables, inform the manager about the drop
-               var dropped = false;
-               if ($.ui.ddmanager && !this.options.dropBehaviour)
-                       dropped = $.ui.ddmanager.drop(this, event);
-
-               //if a drop comes from outside (a sortable)
-               if(this.dropped) {
-                       dropped = this.dropped;
-                       this.dropped = false;
-               }
-               
-               //if the original element is no longer in the DOM don't bother to continue (see #8269)
-               var element = this.element[0], elementInDom = false;
-               while ( element && (element = element.parentNode) ) {
-                       if (element == document ) {
-                               elementInDom = true;
-                       }
-               }
-               if ( !elementInDom && this.options.helper === "original" )
-                       return false;
-
-               if((this.options.revert == "invalid" && !dropped) || (this.options.revert == "valid" && dropped) || this.options.revert === true || ($.isFunction(this.options.revert) && this.options.revert.call(this.element, dropped))) {
-                       var self = this;
-                       $(this.helper).animate(this.originalPosition, parseInt(this.options.revertDuration, 10), function() {
-                               if(self._trigger("stop", event) !== false) {
-                                       self._clear();
-                               }
-                       });
-               } else {
-                       if(this._trigger("stop", event) !== false) {
-                               this._clear();
-                       }
-               }
-
-               return false;
-       },
-       
-       _mouseUp: function(event) {
-               //Remove frame helpers
-               $("div.ui-draggable-iframeFix").each(function() { 
-                       this.parentNode.removeChild(this); 
-               });
-               
-               //If the ddmanager is used for droppables, inform the manager that dragging has stopped (see #5003)
-               if( $.ui.ddmanager ) $.ui.ddmanager.dragStop(this, event);
-               
-               return $.ui.mouse.prototype._mouseUp.call(this, event);
-       },
-       
-       cancel: function() {
-               
-               if(this.helper.is(".ui-draggable-dragging")) {
-                       this._mouseUp({});
-               } else {
-                       this._clear();
-               }
-               
-               return this;
-               
-       },
-
-       _getHandle: function(event) {
-
-               var handle = !this.options.handle || !$(this.options.handle, this.element).length ? true : false;
-               $(this.options.handle, this.element)
-                       .find("*")
-                       .andSelf()
-                       .each(function() {
-                               if(this == event.target) handle = true;
-                       });
-
-               return handle;
-
-       },
-
-       _createHelper: function(event) {
-
-               var o = this.options;
-               var helper = $.isFunction(o.helper) ? $(o.helper.apply(this.element[0], [event])) : (o.helper == 'clone' ? this.element.clone().removeAttr('id') : this.element);
-
-               if(!helper.parents('body').length)
-                       helper.appendTo((o.appendTo == 'parent' ? this.element[0].parentNode : o.appendTo));
-
-               if(helper[0] != this.element[0] && !(/(fixed|absolute)/).test(helper.css("position")))
-                       helper.css("position", "absolute");
-
-               return helper;
-
-       },
-
-       _adjustOffsetFromHelper: function(obj) {
-               if (typeof obj == 'string') {
-                       obj = obj.split(' ');
-               }
-               if ($.isArray(obj)) {
-                       obj = {left: +obj[0], top: +obj[1] || 0};
-               }
-               if ('left' in obj) {
-                       this.offset.click.left = obj.left + this.margins.left;
-               }
-               if ('right' in obj) {
-                       this.offset.click.left = this.helperProportions.width - obj.right + this.margins.left;
-               }
-               if ('top' in obj) {
-                       this.offset.click.top = obj.top + this.margins.top;
-               }
-               if ('bottom' in obj) {
-                       this.offset.click.top = this.helperProportions.height - obj.bottom + this.margins.top;
-               }
-       },
-
-       _getParentOffset: function() {
-
-               //Get the offsetParent and cache its position
-               this.offsetParent = this.helper.offsetParent();
-               var po = this.offsetParent.offset();
-
-               // This is a special case where we need to modify a offset calculated on start, since the following happened:
-               // 1. The position of the helper is absolute, so it's position is calculated based on the next positioned parent
-               // 2. The actual offset parent is a child of the scroll parent, and the scroll parent isn't the document, which means that
-               //    the scroll is included in the initial calculation of the offset of the parent, and never recalculated upon drag
-               if(this.cssPosition == 'absolute' && this.scrollParent[0] != document && $.ui.contains(this.scrollParent[0], this.offsetParent[0])) {
-                       po.left += this.scrollParent.scrollLeft();
-                       po.top += this.scrollParent.scrollTop();
-               }
-
-               if((this.offsetParent[0] == document.body) //This needs to be actually done for all browsers, since pageX/pageY includes this information
-               || (this.offsetParent[0].tagName && this.offsetParent[0].tagName.toLowerCase() == 'html' && $.browser.msie)) //Ugly IE fix
-                       po = { top: 0, left: 0 };
-
-               return {
-                       top: po.top + (parseInt(this.offsetParent.css("borderTopWidth"),10) || 0),
-                       left: po.left + (parseInt(this.offsetParent.css("borderLeftWidth"),10) || 0)
-               };
-
-       },
-
-       _getRelativeOffset: function() {
-
-               if(this.cssPosition == "relative") {
-                       var p = this.element.position();
-                       return {
-                               top: p.top - (parseInt(this.helper.css("top"),10) || 0) + this.scrollParent.scrollTop(),
-                               left: p.left - (parseInt(this.helper.css("left"),10) || 0) + this.scrollParent.scrollLeft()
-                       };
-               } else {
-                       return { top: 0, left: 0 };
-               }
-
-       },
-
-       _cacheMargins: function() {
-               this.margins = {
-                       left: (parseInt(this.element.css("marginLeft"),10) || 0),
-                       top: (parseInt(this.element.css("marginTop"),10) || 0),
-                       right: (parseInt(this.element.css("marginRight"),10) || 0),
-                       bottom: (parseInt(this.element.css("marginBottom"),10) || 0)
-               };
-       },
-
-       _cacheHelperProportions: function() {
-               this.helperProportions = {
-                       width: this.helper.outerWidth(),
-                       height: this.helper.outerHeight()
-               };
-       },
-
-       _setContainment: function() {
-
-               var o = this.options;
-               if(o.containment == 'parent') o.containment = this.helper[0].parentNode;
-               if(o.containment == 'document' || o.containment == 'window') this.containment = [
-                       o.containment == 'document' ? 0 : $(window).scrollLeft() - this.offset.relative.left - this.offset.parent.left,
-                       o.containment == 'document' ? 0 : $(window).scrollTop() - this.offset.relative.top - this.offset.parent.top,
-                       (o.containment == 'document' ? 0 : $(window).scrollLeft()) + $(o.containment == 'document' ? document : window).width() - this.helperProportions.width - this.margins.left,
-                       (o.containment == 'document' ? 0 : $(window).scrollTop()) + ($(o.containment == 'document' ? document : window).height() || document.body.parentNode.scrollHeight) - this.helperProportions.height - this.margins.top
-               ];
-
-               if(!(/^(document|window|parent)$/).test(o.containment) && o.containment.constructor != Array) {
-                       var c = $(o.containment);
-                       var ce = c[0]; if(!ce) return;
-                       var co = c.offset();
-                       var over = ($(ce).css("overflow") != 'hidden');
-
-                       this.containment = [
-                               (parseInt($(ce).css("borderLeftWidth"),10) || 0) + (parseInt($(ce).css("paddingLeft"),10) || 0),
-                               (parseInt($(ce).css("borderTopWidth"),10) || 0) + (parseInt($(ce).css("paddingTop"),10) || 0),
-                               (over ? Math.max(ce.scrollWidth,ce.offsetWidth) : ce.offsetWidth) - (parseInt($(ce).css("borderLeftWidth"),10) || 0) - (parseInt($(ce).css("paddingRight"),10) || 0) - this.helperProportions.width - this.margins.left - this.margins.right,
-                               (over ? Math.max(ce.scrollHeight,ce.offsetHeight) : ce.offsetHeight) - (parseInt($(ce).css("borderTopWidth"),10) || 0) - (parseInt($(ce).css("paddingBottom"),10) || 0) - this.helperProportions.height - this.margins.top  - this.margins.bottom
-                       ];
-                       this.relative_container = c;
-
-               } else if(o.containment.constructor == Array) {
-                       this.containment = o.containment;
-               }
-
-       },
-
-       _convertPositionTo: function(d, pos) {
-
-               if(!pos) pos = this.position;
-               var mod = d == "absolute" ? 1 : -1;
-               var o = this.options, scroll = this.cssPosition == 'absolute' && !(this.scrollParent[0] != document && $.ui.contains(this.scrollParent[0], this.offsetParent[0])) ? this.offsetParent : this.scrollParent, scrollIsRootNode = (/(html|body)/i).test(scroll[0].tagName);
-
-               return {
-                       top: (
-                               pos.top                                                                                                                                 // The absolute mouse position
-                               + this.offset.relative.top * mod                                                                                // Only for relative positioned nodes: Relative offset from element to offset parent
-                               + this.offset.parent.top * mod                                                                                  // The offsetParent's offset without borders (offset + border)
-                               - ($.browser.safari && $.browser.version < 526 && this.cssPosition == 'fixed' ? 0 : ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollTop() : ( scrollIsRootNode ? 0 : scroll.scrollTop() ) ) * mod)
-                       ),
-                       left: (
-                               pos.left                                                                                                                                // The absolute mouse position
-                               + this.offset.relative.left * mod                                                                               // Only for relative positioned nodes: Relative offset from element to offset parent
-                               + this.offset.parent.left * mod                                                                                 // The offsetParent's offset without borders (offset + border)
-                               - ($.browser.safari && $.browser.version < 526 && this.cssPosition == 'fixed' ? 0 : ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollLeft() : scrollIsRootNode ? 0 : scroll.scrollLeft() ) * mod)
-                       )
-               };
-
-       },
-
-       _generatePosition: function(event) {
-
-               var o = this.options, scroll = this.cssPosition == 'absolute' && !(this.scrollParent[0] != document && $.ui.contains(this.scrollParent[0], this.offsetParent[0])) ? this.offsetParent : this.scrollParent, scrollIsRootNode = (/(html|body)/i).test(scroll[0].tagName);
-               var pageX = event.pageX;
-               var pageY = event.pageY;
-
-               /*
-                * - Position constraining -
-                * Constrain the position to a mix of grid, containment.
-                */
-
-               if(this.originalPosition) { //If we are not dragging yet, we won't check for options
-                        var containment;
-                        if(this.containment) {
-                                if (this.relative_container){
-                                    var co = this.relative_container.offset();
-                                    containment = [ this.containment[0] + co.left,
-                                                    this.containment[1] + co.top,
-                                                    this.containment[2] + co.left,
-                                                    this.containment[3] + co.top ];
-                                }
-                                else {
-                                    containment = this.containment;
-                                }
-
-                               if(event.pageX - this.offset.click.left < containment[0]) pageX = containment[0] + this.offset.click.left;
-                               if(event.pageY - this.offset.click.top < containment[1]) pageY = containment[1] + this.offset.click.top;
-                               if(event.pageX - this.offset.click.left > containment[2]) pageX = containment[2] + this.offset.click.left;
-                               if(event.pageY - this.offset.click.top > containment[3]) pageY = containment[3] + this.offset.click.top;
-                       }
-
-                       if(o.grid) {
-                               //Check for grid elements set to 0 to prevent divide by 0 error causing invalid argument errors in IE (see ticket #6950)
-                               var top = o.grid[1] ? this.originalPageY + Math.round((pageY - this.originalPageY) / o.grid[1]) * o.grid[1] : this.originalPageY;
-                               pageY = containment ? (!(top - this.offset.click.top < containment[1] || top - this.offset.click.top > containment[3]) ? top : (!(top - this.offset.click.top < containment[1]) ? top - o.grid[1] : top + o.grid[1])) : top;
-
-                               var left = o.grid[0] ? this.originalPageX + Math.round((pageX - this.originalPageX) / o.grid[0]) * o.grid[0] : this.originalPageX;
-                               pageX = containment ? (!(left - this.offset.click.left < containment[0] || left - this.offset.click.left > containment[2]) ? left : (!(left - this.offset.click.left < containment[0]) ? left - o.grid[0] : left + o.grid[0])) : left;
-                       }
-
-               }
-
-               return {
-                       top: (
-                               pageY                                                                                                                           // The absolute mouse position
-                               - this.offset.click.top                                                                                                 // Click offset (relative to the element)
-                               - this.offset.relative.top                                                                                              // Only for relative positioned nodes: Relative offset from element to offset parent
-                               - this.offset.parent.top                                                                                                // The offsetParent's offset without borders (offset + border)
-                               + ($.browser.safari && $.browser.version < 526 && this.cssPosition == 'fixed' ? 0 : ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollTop() : ( scrollIsRootNode ? 0 : scroll.scrollTop() ) ))
-                       ),
-                       left: (
-                               pageX                                                                                                                           // The absolute mouse position
-                               - this.offset.click.left                                                                                                // Click offset (relative to the element)
-                               - this.offset.relative.left                                                                                             // Only for relative positioned nodes: Relative offset from element to offset parent
-                               - this.offset.parent.left                                                                                               // The offsetParent's offset without borders (offset + border)
-                               + ($.browser.safari && $.browser.version < 526 && this.cssPosition == 'fixed' ? 0 : ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollLeft() : scrollIsRootNode ? 0 : scroll.scrollLeft() ))
-                       )
-               };
-
-       },
-
-       _clear: function() {
-               this.helper.removeClass("ui-draggable-dragging");
-               if(this.helper[0] != this.element[0] && !this.cancelHelperRemoval) this.helper.remove();
-               //if($.ui.ddmanager) $.ui.ddmanager.current = null;
-               this.helper = null;
-               this.cancelHelperRemoval = false;
-       },
-
-       // From now on bulk stuff - mainly helpers
-
-       _trigger: function(type, event, ui) {
-               ui = ui || this._uiHash();
-               $.ui.plugin.call(this, type, [event, ui]);
-               if(type == "drag") this.positionAbs = this._convertPositionTo("absolute"); //The absolute position has to be recalculated after plugins
-               return $.Widget.prototype._trigger.call(this, type, event, ui);
-       },
-
-       plugins: {},
-
-       _uiHash: function(event) {
-               return {
-                       helper: this.helper,
-                       position: this.position,
-                       originalPosition: this.originalPosition,
-                       offset: this.positionAbs
-               };
-       }
-
-});
-
-$.extend($.ui.draggable, {
-       version: "1.8.24"
-});
-
-$.ui.plugin.add("draggable", "connectToSortable", {
-       start: function(event, ui) {
-
-               var inst = $(this).data("draggable"), o = inst.options,
-                       uiSortable = $.extend({}, ui, { item: inst.element });
-               inst.sortables = [];
-               $(o.connectToSortable).each(function() {
-                       var sortable = $.data(this, 'sortable');
-                       if (sortable && !sortable.options.disabled) {
-                               inst.sortables.push({
-                                       instance: sortable,
-                                       shouldRevert: sortable.options.revert
-                               });
-                               sortable.refreshPositions();    // Call the sortable's refreshPositions at drag start to refresh the containerCache since the sortable container cache is used in drag and needs to be up to date (this will ensure it's initialised as well as being kept in step with any changes that might have happened on the page).
-                               sortable._trigger("activate", event, uiSortable);
-                       }
-               });
-
-       },
-       stop: function(event, ui) {
-
-               //If we are still over the sortable, we fake the stop event of the sortable, but also remove helper
-               var inst = $(this).data("draggable"),
-                       uiSortable = $.extend({}, ui, { item: inst.element });
-
-               $.each(inst.sortables, function() {
-                       if(this.instance.isOver) {
-
-                               this.instance.isOver = 0;
-
-                               inst.cancelHelperRemoval = true; //Don't remove the helper in the draggable instance
-                               this.instance.cancelHelperRemoval = false; //Remove it in the sortable instance (so sortable plugins like revert still work)
-
-                               //The sortable revert is supported, and we have to set a temporary dropped variable on the draggable to support revert: 'valid/invalid'
-                               if(this.shouldRevert) this.instance.options.revert = true;
-
-                               //Trigger the stop of the sortable
-                               this.instance._mouseStop(event);
-
-                               this.instance.options.helper = this.instance.options._helper;
-
-                               //If the helper has been the original item, restore properties in the sortable
-                               if(inst.options.helper == 'original')
-                                       this.instance.currentItem.css({ top: 'auto', left: 'auto' });
-
-                       } else {
-                               this.instance.cancelHelperRemoval = false; //Remove the helper in the sortable instance
-                               this.instance._trigger("deactivate", event, uiSortable);
-                       }
-
-               });
-
-       },
-       drag: function(event, ui) {
-
-               var inst = $(this).data("draggable"), self = this;
-
-               var checkPos = function(o) {
-                       var dyClick = this.offset.click.top, dxClick = this.offset.click.left;
-                       var helperTop = this.positionAbs.top, helperLeft = this.positionAbs.left;
-                       var itemHeight = o.height, itemWidth = o.width;
-                       var itemTop = o.top, itemLeft = o.left;
-
-                       return $.ui.isOver(helperTop + dyClick, helperLeft + dxClick, itemTop, itemLeft, itemHeight, itemWidth);
-               };
-
-               $.each(inst.sortables, function(i) {
-                       
-                       //Copy over some variables to allow calling the sortable's native _intersectsWith
-                       this.instance.positionAbs = inst.positionAbs;
-                       this.instance.helperProportions = inst.helperProportions;
-                       this.instance.offset.click = inst.offset.click;
-                       
-                       if(this.instance._intersectsWith(this.instance.containerCache)) {
-
-                               //If it intersects, we use a little isOver variable and set it once, so our move-in stuff gets fired only once
-                               if(!this.instance.isOver) {
-
-                                       this.instance.isOver = 1;
-                                       //Now we fake the start of dragging for the sortable instance,
-                                       //by cloning the list group item, appending it to the sortable and using it as inst.currentItem
-                                       //We can then fire the start event of the sortable with our passed browser event, and our own helper (so it doesn't create a new one)
-                                       this.instance.currentItem = $(self).clone().removeAttr('id').appendTo(this.instance.element).data("sortable-item", true);
-                                       this.instance.options._helper = this.instance.options.helper; //Store helper option to later restore it
-                                       this.instance.options.helper = function() { return ui.helper[0]; };
-
-                                       event.target = this.instance.currentItem[0];
-                                       this.instance._mouseCapture(event, true);
-                                       this.instance._mouseStart(event, true, true);
-
-                                       //Because the browser event is way off the new appended portlet, we modify a couple of variables to reflect the changes
-                                       this.instance.offset.click.top = inst.offset.click.top;
-                                       this.instance.offset.click.left = inst.offset.click.left;
-                                       this.instance.offset.parent.left -= inst.offset.parent.left - this.instance.offset.parent.left;
-                                       this.instance.offset.parent.top -= inst.offset.parent.top - this.instance.offset.parent.top;
-
-                                       inst._trigger("toSortable", event);
-                                       inst.dropped = this.instance.element; //draggable revert needs that
-                                       //hack so receive/update callbacks work (mostly)
-                                       inst.currentItem = inst.element;
-                                       this.instance.fromOutside = inst;
-
-                               }
-
-                               //Provided we did all the previous steps, we can fire the drag event of the sortable on every draggable drag, when it intersects with the sortable
-                               if(this.instance.currentItem) this.instance._mouseDrag(event);
-
-                       } else {
-
-                               //If it doesn't intersect with the sortable, and it intersected before,
-                               //we fake the drag stop of the sortable, but make sure it doesn't remove the helper by using cancelHelperRemoval
-                               if(this.instance.isOver) {
-
-                                       this.instance.isOver = 0;
-                                       this.instance.cancelHelperRemoval = true;
-                                       
-                                       //Prevent reverting on this forced stop
-                                       this.instance.options.revert = false;
-                                       
-                                       // The out event needs to be triggered independently
-                                       this.instance._trigger('out', event, this.instance._uiHash(this.instance));
-                                       
-                                       this.instance._mouseStop(event, true);
-                                       this.instance.options.helper = this.instance.options._helper;
-
-                                       //Now we remove our currentItem, the list group clone again, and the placeholder, and animate the helper back to it's original size
-                                       this.instance.currentItem.remove();
-                                       if(this.instance.placeholder) this.instance.placeholder.remove();
-
-                                       inst._trigger("fromSortable", event);
-                                       inst.dropped = false; //draggable revert needs that
-                               }
-
-                       };
-
-               });
-
-       }
-});
-
-$.ui.plugin.add("draggable", "cursor", {
-       start: function(event, ui) {
-               var t = $('body'), o = $(this).data('draggable').options;
-               if (t.css("cursor")) o._cursor = t.css("cursor");
-               t.css("cursor", o.cursor);
-       },
-       stop: function(event, ui) {
-               var o = $(this).data('draggable').options;
-               if (o._cursor) $('body').css("cursor", o._cursor);
-       }
-});
-
-$.ui.plugin.add("draggable", "opacity", {
-       start: function(event, ui) {
-               var t = $(ui.helper), o = $(this).data('draggable').options;
-               if(t.css("opacity")) o._opacity = t.css("opacity");
-               t.css('opacity', o.opacity);
-       },
-       stop: function(event, ui) {
-               var o = $(this).data('draggable').options;
-               if(o._opacity) $(ui.helper).css('opacity', o._opacity);
-       }
-});
-
-$.ui.plugin.add("draggable", "scroll", {
-       start: function(event, ui) {
-               var i = $(this).data("draggable");
-               if(i.scrollParent[0] != document && i.scrollParent[0].tagName != 'HTML') i.overflowOffset = i.scrollParent.offset();
-       },
-       drag: function(event, ui) {
-
-               var i = $(this).data("draggable"), o = i.options, scrolled = false;
-
-               if(i.scrollParent[0] != document && i.scrollParent[0].tagName != 'HTML') {
-
-                       if(!o.axis || o.axis != 'x') {
-                               if((i.overflowOffset.top + i.scrollParent[0].offsetHeight) - event.pageY < o.scrollSensitivity)
-                                       i.scrollParent[0].scrollTop = scrolled = i.scrollParent[0].scrollTop + o.scrollSpeed;
-                               else if(event.pageY - i.overflowOffset.top < o.scrollSensitivity)
-                                       i.scrollParent[0].scrollTop = scrolled = i.scrollParent[0].scrollTop - o.scrollSpeed;
-                       }
-
-                       if(!o.axis || o.axis != 'y') {
-                               if((i.overflowOffset.left + i.scrollParent[0].offsetWidth) - event.pageX < o.scrollSensitivity)
-                                       i.scrollParent[0].scrollLeft = scrolled = i.scrollParent[0].scrollLeft + o.scrollSpeed;
-                               else if(event.pageX - i.overflowOffset.left < o.scrollSensitivity)
-                                       i.scrollParent[0].scrollLeft = scrolled = i.scrollParent[0].scrollLeft - o.scrollSpeed;
-                       }
-
-               } else {
-
-                       if(!o.axis || o.axis != 'x') {
-                               if(event.pageY - $(document).scrollTop() < o.scrollSensitivity)
-                                       scrolled = $(document).scrollTop($(document).scrollTop() - o.scrollSpeed);
-                               else if($(window).height() - (event.pageY - $(document).scrollTop()) < o.scrollSensitivity)
-                                       scrolled = $(document).scrollTop($(document).scrollTop() + o.scrollSpeed);
-                       }
-
-                       if(!o.axis || o.axis != 'y') {
-                               if(event.pageX - $(document).scrollLeft() < o.scrollSensitivity)
-                                       scrolled = $(document).scrollLeft($(document).scrollLeft() - o.scrollSpeed);
-                               else if($(window).width() - (event.pageX - $(document).scrollLeft()) < o.scrollSensitivity)
-                                       scrolled = $(document).scrollLeft($(document).scrollLeft() + o.scrollSpeed);
-                       }
-
-               }
-
-               if(scrolled !== false && $.ui.ddmanager && !o.dropBehaviour)
-                       $.ui.ddmanager.prepareOffsets(i, event);
-
-       }
-});
-
-$.ui.plugin.add("draggable", "snap", {
-       start: function(event, ui) {
-
-               var i = $(this).data("draggable"), o = i.options;
-               i.snapElements = [];
-
-               $(o.snap.constructor != String ? ( o.snap.items || ':data(draggable)' ) : o.snap).each(function() {
-                       var $t = $(this); var $o = $t.offset();
-                       if(this != i.element[0]) i.snapElements.push({
-                               item: this,
-                               width: $t.outerWidth(), height: $t.outerHeight(),
-                               top: $o.top, left: $o.left
-                       });
-               });
-
-       },
-       drag: function(event, ui) {
-
-               var inst = $(this).data("draggable"), o = inst.options;
-               var d = o.snapTolerance;
-
-               var x1 = ui.offset.left, x2 = x1 + inst.helperProportions.width,
-                       y1 = ui.offset.top, y2 = y1 + inst.helperProportions.height;
-
-               for (var i = inst.snapElements.length - 1; i >= 0; i--){
-
-                       var l = inst.snapElements[i].left, r = l + inst.snapElements[i].width,
-                               t = inst.snapElements[i].top, b = t + inst.snapElements[i].height;
-
-                       //Yes, I know, this is insane ;)
-                       if(!((l-d < x1 && x1 < r+d && t-d < y1 && y1 < b+d) || (l-d < x1 && x1 < r+d && t-d < y2 && y2 < b+d) || (l-d < x2 && x2 < r+d && t-d < y1 && y1 < b+d) || (l-d < x2 && x2 < r+d && t-d < y2 && y2 < b+d))) {
-                               if(inst.snapElements[i].snapping) (inst.options.snap.release && inst.options.snap.release.call(inst.element, event, $.extend(inst._uiHash(), { snapItem: inst.snapElements[i].item })));
-                               inst.snapElements[i].snapping = false;
-                               continue;
-                       }
-
-                       if(o.snapMode != 'inner') {
-                               var ts = Math.abs(t - y2) <= d;
-                               var bs = Math.abs(b - y1) <= d;
-                               var ls = Math.abs(l - x2) <= d;
-                               var rs = Math.abs(r - x1) <= d;
-                               if(ts) ui.position.top = inst._convertPositionTo("relative", { top: t - inst.helperProportions.height, left: 0 }).top - inst.margins.top;
-                               if(bs) ui.position.top = inst._convertPositionTo("relative", { top: b, left: 0 }).top - inst.margins.top;
-                               if(ls) ui.position.left = inst._convertPositionTo("relative", { top: 0, left: l - inst.helperProportions.width }).left - inst.margins.left;
-                               if(rs) ui.position.left = inst._convertPositionTo("relative", { top: 0, left: r }).left - inst.margins.left;
-                       }
-
-                       var first = (ts || bs || ls || rs);
-
-                       if(o.snapMode != 'outer') {
-                               var ts = Math.abs(t - y1) <= d;
-                               var bs = Math.abs(b - y2) <= d;
-                               var ls = Math.abs(l - x1) <= d;
-                               var rs = Math.abs(r - x2) <= d;
-                               if(ts) ui.position.top = inst._convertPositionTo("relative", { top: t, left: 0 }).top - inst.margins.top;
-                               if(bs) ui.position.top = inst._convertPositionTo("relative", { top: b - inst.helperProportions.height, left: 0 }).top - inst.margins.top;
-                               if(ls) ui.position.left = inst._convertPositionTo("relative", { top: 0, left: l }).left - inst.margins.left;
-                               if(rs) ui.position.left = inst._convertPositionTo("relative", { top: 0, left: r - inst.helperProportions.width }).left - inst.margins.left;
-                       }
-
-                       if(!inst.snapElements[i].snapping && (ts || bs || ls || rs || first))
-                               (inst.options.snap.snap && inst.options.snap.snap.call(inst.element, event, $.extend(inst._uiHash(), { snapItem: inst.snapElements[i].item })));
-                       inst.snapElements[i].snapping = (ts || bs || ls || rs || first);
-
-               };
-
-       }
-});
-
-$.ui.plugin.add("draggable", "stack", {
-       start: function(event, ui) {
-
-               var o = $(this).data("draggable").options;
-
-               var group = $.makeArray($(o.stack)).sort(function(a,b) {
-                       return (parseInt($(a).css("zIndex"),10) || 0) - (parseInt($(b).css("zIndex"),10) || 0);
-               });
-               if (!group.length) { return; }
-               
-               var min = parseInt(group[0].style.zIndex) || 0;
-               $(group).each(function(i) {
-                       this.style.zIndex = min + i;
-               });
-
-               this[0].style.zIndex = min + group.length;
-
-       }
-});
-
-$.ui.plugin.add("draggable", "zIndex", {
-       start: function(event, ui) {
-               var t = $(ui.helper), o = $(this).data("draggable").options;
-               if(t.css("zIndex")) o._zIndex = t.css("zIndex");
-               t.css('zIndex', o.zIndex);
-       },
-       stop: function(event, ui) {
-               var o = $(this).data("draggable").options;
-               if(o._zIndex) $(ui.helper).css('zIndex', o._zIndex);
-       }
-});
-
-})(jQuery);
diff --git a/resources/jquery.ui/jquery.ui.droppable.js b/resources/jquery.ui/jquery.ui.droppable.js
deleted file mode 100644 (file)
index f17c222..0000000
+++ /dev/null
@@ -1,301 +0,0 @@
-/*!
- * jQuery UI Droppable 1.8.24
- *
- * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
- * Dual licensed under the MIT or GPL Version 2 licenses.
- * http://jquery.org/license
- *
- * http://docs.jquery.com/UI/Droppables
- *
- * Depends:
- *     jquery.ui.core.js
- *     jquery.ui.widget.js
- *     jquery.ui.mouse.js
- *     jquery.ui.draggable.js
- */
-(function( $, undefined ) {
-
-$.widget("ui.droppable", {
-       widgetEventPrefix: "drop",
-       options: {
-               accept: '*',
-               activeClass: false,
-               addClasses: true,
-               greedy: false,
-               hoverClass: false,
-               scope: 'default',
-               tolerance: 'intersect'
-       },
-       _create: function() {
-
-               var o = this.options, accept = o.accept;
-               this.isover = 0; this.isout = 1;
-
-               this.accept = $.isFunction(accept) ? accept : function(d) {
-                       return d.is(accept);
-               };
-
-               //Store the droppable's proportions
-               this.proportions = { width: this.element[0].offsetWidth, height: this.element[0].offsetHeight };
-
-               // Add the reference and positions to the manager
-               $.ui.ddmanager.droppables[o.scope] = $.ui.ddmanager.droppables[o.scope] || [];
-               $.ui.ddmanager.droppables[o.scope].push(this);
-
-               (o.addClasses && this.element.addClass("ui-droppable"));
-
-       },
-
-       destroy: function() {
-               var drop = $.ui.ddmanager.droppables[this.options.scope];
-               for ( var i = 0; i < drop.length; i++ )
-                       if ( drop[i] == this )
-                               drop.splice(i, 1);
-
-               this.element
-                       .removeClass("ui-droppable ui-droppable-disabled")
-                       .removeData("droppable")
-                       .unbind(".droppable");
-
-               return this;
-       },
-
-       _setOption: function(key, value) {
-
-               if(key == 'accept') {
-                       this.accept = $.isFunction(value) ? value : function(d) {
-                               return d.is(value);
-                       };
-               }
-               $.Widget.prototype._setOption.apply(this, arguments);
-       },
-
-       _activate: function(event) {
-               var draggable = $.ui.ddmanager.current;
-               if(this.options.activeClass) this.element.addClass(this.options.activeClass);
-               (draggable && this._trigger('activate', event, this.ui(draggable)));
-       },
-
-       _deactivate: function(event) {
-               var draggable = $.ui.ddmanager.current;
-               if(this.options.activeClass) this.element.removeClass(this.options.activeClass);
-               (draggable && this._trigger('deactivate', event, this.ui(draggable)));
-       },
-
-       _over: function(event) {
-
-               var draggable = $.ui.ddmanager.current;
-               if (!draggable || (draggable.currentItem || draggable.element)[0] == this.element[0]) return; // Bail if draggable and droppable are same element
-
-               if (this.accept.call(this.element[0],(draggable.currentItem || draggable.element))) {
-                       if(this.options.hoverClass) this.element.addClass(this.options.hoverClass);
-                       this._trigger('over', event, this.ui(draggable));
-               }
-
-       },
-
-       _out: function(event) {
-
-               var draggable = $.ui.ddmanager.current;
-               if (!draggable || (draggable.currentItem || draggable.element)[0] == this.element[0]) return; // Bail if draggable and droppable are same element
-
-               if (this.accept.call(this.element[0],(draggable.currentItem || draggable.element))) {
-                       if(this.options.hoverClass) this.element.removeClass(this.options.hoverClass);
-                       this._trigger('out', event, this.ui(draggable));
-               }
-
-       },
-
-       _drop: function(event,custom) {
-
-               var draggable = custom || $.ui.ddmanager.current;
-               if (!draggable || (draggable.currentItem || draggable.element)[0] == this.element[0]) return false; // Bail if draggable and droppable are same element
-
-               var childrenIntersection = false;
-               this.element.find(":data(droppable)").not(".ui-draggable-dragging").each(function() {
-                       var inst = $.data(this, 'droppable');
-                       if(
-                               inst.options.greedy
-                               && !inst.options.disabled
-                               && inst.options.scope == draggable.options.scope
-                               && inst.accept.call(inst.element[0], (draggable.currentItem || draggable.element))
-                               && $.ui.intersect(draggable, $.extend(inst, { offset: inst.element.offset() }), inst.options.tolerance)
-                       ) { childrenIntersection = true; return false; }
-               });
-               if(childrenIntersection) return false;
-
-               if(this.accept.call(this.element[0],(draggable.currentItem || draggable.element))) {
-                       if(this.options.activeClass) this.element.removeClass(this.options.activeClass);
-                       if(this.options.hoverClass) this.element.removeClass(this.options.hoverClass);
-                       this._trigger('drop', event, this.ui(draggable));
-                       return this.element;
-               }
-
-               return false;
-
-       },
-
-       ui: function(c) {
-               return {
-                       draggable: (c.currentItem || c.element),
-                       helper: c.helper,
-                       position: c.position,
-                       offset: c.positionAbs
-               };
-       }
-
-});
-
-$.extend($.ui.droppable, {
-       version: "1.8.24"
-});
-
-$.ui.intersect = function(draggable, droppable, toleranceMode) {
-
-       if (!droppable.offset) return false;
-
-       var x1 = (draggable.positionAbs || draggable.position.absolute).left, x2 = x1 + draggable.helperProportions.width,
-               y1 = (draggable.positionAbs || draggable.position.absolute).top, y2 = y1 + draggable.helperProportions.height;
-       var l = droppable.offset.left, r = l + droppable.proportions.width,
-               t = droppable.offset.top, b = t + droppable.proportions.height;
-
-       switch (toleranceMode) {
-               case 'fit':
-                       return (l <= x1 && x2 <= r
-                               && t <= y1 && y2 <= b);
-                       break;
-               case 'intersect':
-                       return (l < x1 + (draggable.helperProportions.width / 2) // Right Half
-                               && x2 - (draggable.helperProportions.width / 2) < r // Left Half
-                               && t < y1 + (draggable.helperProportions.height / 2) // Bottom Half
-                               && y2 - (draggable.helperProportions.height / 2) < b ); // Top Half
-                       break;
-               case 'pointer':
-                       var draggableLeft = ((draggable.positionAbs || draggable.position.absolute).left + (draggable.clickOffset || draggable.offset.click).left),
-                               draggableTop = ((draggable.positionAbs || draggable.position.absolute).top + (draggable.clickOffset || draggable.offset.click).top),
-                               isOver = $.ui.isOver(draggableTop, draggableLeft, t, l, droppable.proportions.height, droppable.proportions.width);
-                       return isOver;
-                       break;
-               case 'touch':
-                       return (
-                                       (y1 >= t && y1 <= b) || // Top edge touching
-                                       (y2 >= t && y2 <= b) || // Bottom edge touching
-                                       (y1 < t && y2 > b)              // Surrounded vertically
-                               ) && (
-                                       (x1 >= l && x1 <= r) || // Left edge touching
-                                       (x2 >= l && x2 <= r) || // Right edge touching
-                                       (x1 < l && x2 > r)              // Surrounded horizontally
-                               );
-                       break;
-               default:
-                       return false;
-                       break;
-               }
-
-};
-
-/*
-       This manager tracks offsets of draggables and droppables
-*/
-$.ui.ddmanager = {
-       current: null,
-       droppables: { 'default': [] },
-       prepareOffsets: function(t, event) {
-
-               var m = $.ui.ddmanager.droppables[t.options.scope] || [];
-               var type = event ? event.type : null; // workaround for #2317
-               var list = (t.currentItem || t.element).find(":data(droppable)").andSelf();
-
-               droppablesLoop: for (var i = 0; i < m.length; i++) {
-
-                       if(m[i].options.disabled || (t && !m[i].accept.call(m[i].element[0],(t.currentItem || t.element)))) continue;   //No disabled and non-accepted
-                       for (var j=0; j < list.length; j++) { if(list[j] == m[i].element[0]) { m[i].proportions.height = 0; continue droppablesLoop; } }; //Filter out elements in the current dragged item
-                       m[i].visible = m[i].element.css("display") != "none"; if(!m[i].visible) continue;                                                                       //If the element is not visible, continue
-
-                       if(type == "mousedown") m[i]._activate.call(m[i], event); //Activate the droppable if used directly from draggables
-
-                       m[i].offset = m[i].element.offset();
-                       m[i].proportions = { width: m[i].element[0].offsetWidth, height: m[i].element[0].offsetHeight };
-
-               }
-
-       },
-       drop: function(draggable, event) {
-
-               var dropped = false;
-               $.each($.ui.ddmanager.droppables[draggable.options.scope] || [], function() {
-
-                       if(!this.options) return;
-                       if (!this.options.disabled && this.visible && $.ui.intersect(draggable, this, this.options.tolerance))
-                               dropped = this._drop.call(this, event) || dropped;
-
-                       if (!this.options.disabled && this.visible && this.accept.call(this.element[0],(draggable.currentItem || draggable.element))) {
-                               this.isout = 1; this.isover = 0;
-                               this._deactivate.call(this, event);
-                       }
-
-               });
-               return dropped;
-
-       },
-       dragStart: function( draggable, event ) {
-               //Listen for scrolling so that if the dragging causes scrolling the position of the droppables can be recalculated (see #5003)
-               draggable.element.parents( ":not(body,html)" ).bind( "scroll.droppable", function() {
-                       if( !draggable.options.refreshPositions ) $.ui.ddmanager.prepareOffsets( draggable, event );
-               });
-       },
-       drag: function(draggable, event) {
-
-               //If you have a highly dynamic page, you might try this option. It renders positions every time you move the mouse.
-               if(draggable.options.refreshPositions) $.ui.ddmanager.prepareOffsets(draggable, event);
-
-               //Run through all droppables and check their positions based on specific tolerance options
-               $.each($.ui.ddmanager.droppables[draggable.options.scope] || [], function() {
-
-                       if(this.options.disabled || this.greedyChild || !this.visible) return;
-                       var intersects = $.ui.intersect(draggable, this, this.options.tolerance);
-
-                       var c = !intersects && this.isover == 1 ? 'isout' : (intersects && this.isover == 0 ? 'isover' : null);
-                       if(!c) return;
-
-                       var parentInstance;
-                       if (this.options.greedy) {
-                               // find droppable parents with same scope
-                               var scope = this.options.scope;
-                               var parent = this.element.parents(':data(droppable)').filter(function () {
-                                       return $.data(this, 'droppable').options.scope === scope;
-                               });
-
-                               if (parent.length) {
-                                       parentInstance = $.data(parent[0], 'droppable');
-                                       parentInstance.greedyChild = (c == 'isover' ? 1 : 0);
-                               }
-                       }
-
-                       // we just moved into a greedy child
-                       if (parentInstance && c == 'isover') {
-                               parentInstance['isover'] = 0;
-                               parentInstance['isout'] = 1;
-                               parentInstance._out.call(parentInstance, event);
-                       }
-
-                       this[c] = 1; this[c == 'isout' ? 'isover' : 'isout'] = 0;
-                       this[c == "isover" ? "_over" : "_out"].call(this, event);
-
-                       // we just moved out of a greedy child
-                       if (parentInstance && c == 'isout') {
-                               parentInstance['isout'] = 0;
-                               parentInstance['isover'] = 1;
-                               parentInstance._over.call(parentInstance, event);
-                       }
-               });
-
-       },
-       dragStop: function( draggable, event ) {
-               draggable.element.parents( ":not(body,html)" ).unbind( "scroll.droppable" );
-               //Call prepareOffsets one final time since IE does not fire return scroll events when overflow was caused by drag (see #5003)
-               if( !draggable.options.refreshPositions ) $.ui.ddmanager.prepareOffsets( draggable, event );
-       }
-};
-
-})(jQuery);
diff --git a/resources/jquery.ui/jquery.ui.mouse.js b/resources/jquery.ui/jquery.ui.mouse.js
deleted file mode 100644 (file)
index 52a1786..0000000
+++ /dev/null
@@ -1,167 +0,0 @@
-/*!
- * jQuery UI Mouse 1.8.24
- *
- * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
- * Dual licensed under the MIT or GPL Version 2 licenses.
- * http://jquery.org/license
- *
- * http://docs.jquery.com/UI/Mouse
- *
- * Depends:
- *     jquery.ui.widget.js
- */
-(function( $, undefined ) {
-
-var mouseHandled = false;
-$( document ).mouseup( function( e ) {
-       mouseHandled = false;
-});
-
-$.widget("ui.mouse", {
-       options: {
-               cancel: ':input,option',
-               distance: 1,
-               delay: 0
-       },
-       _mouseInit: function() {
-               var self = this;
-
-               this.element
-                       .bind('mousedown.'+this.widgetName, function(event) {
-                               return self._mouseDown(event);
-                       })
-                       .bind('click.'+this.widgetName, function(event) {
-                               if (true === $.data(event.target, self.widgetName + '.preventClickEvent')) {
-                                   $.removeData(event.target, self.widgetName + '.preventClickEvent');
-                                       event.stopImmediatePropagation();
-                                       return false;
-                               }
-                       });
-
-               this.started = false;
-       },
-
-       // TODO: make sure destroying one instance of mouse doesn't mess with
-       // other instances of mouse
-       _mouseDestroy: function() {
-               this.element.unbind('.'+this.widgetName);
-               if ( this._mouseMoveDelegate ) {
-                       $(document)
-                               .unbind('mousemove.'+this.widgetName, this._mouseMoveDelegate)
-                               .unbind('mouseup.'+this.widgetName, this._mouseUpDelegate);
-               }
-       },
-
-       _mouseDown: function(event) {
-               // don't let more than one widget handle mouseStart
-               if( mouseHandled ) { return };
-
-               // we may have missed mouseup (out of window)
-               (this._mouseStarted && this._mouseUp(event));
-
-               this._mouseDownEvent = event;
-
-               var self = this,
-                       btnIsLeft = (event.which == 1),
-                       // event.target.nodeName works around a bug in IE 8 with
-                       // disabled inputs (#7620)
-                       elIsCancel = (typeof this.options.cancel == "string" && event.target.nodeName ? $(event.target).closest(this.options.cancel).length : false);
-               if (!btnIsLeft || elIsCancel || !this._mouseCapture(event)) {
-                       return true;
-               }
-
-               this.mouseDelayMet = !this.options.delay;
-               if (!this.mouseDelayMet) {
-                       this._mouseDelayTimer = setTimeout(function() {
-                               self.mouseDelayMet = true;
-                       }, this.options.delay);
-               }
-
-               if (this._mouseDistanceMet(event) && this._mouseDelayMet(event)) {
-                       this._mouseStarted = (this._mouseStart(event) !== false);
-                       if (!this._mouseStarted) {
-                               event.preventDefault();
-                               return true;
-                       }
-               }
-
-               // Click event may never have fired (Gecko & Opera)
-               if (true === $.data(event.target, this.widgetName + '.preventClickEvent')) {
-                       $.removeData(event.target, this.widgetName + '.preventClickEvent');
-               }
-
-               // these delegates are required to keep context
-               this._mouseMoveDelegate = function(event) {
-                       return self._mouseMove(event);
-               };
-               this._mouseUpDelegate = function(event) {
-                       return self._mouseUp(event);
-               };
-               $(document)
-                       .bind('mousemove.'+this.widgetName, this._mouseMoveDelegate)
-                       .bind('mouseup.'+this.widgetName, this._mouseUpDelegate);
-
-               event.preventDefault();
-               
-               mouseHandled = true;
-               return true;
-       },
-
-       _mouseMove: function(event) {
-               // IE mouseup check - mouseup happened when mouse was out of window
-               if ($.browser.msie && !(document.documentMode >= 9) && !event.button) {
-                       return this._mouseUp(event);
-               }
-
-               if (this._mouseStarted) {
-                       this._mouseDrag(event);
-                       return event.preventDefault();
-               }
-
-               if (this._mouseDistanceMet(event) && this._mouseDelayMet(event)) {
-                       this._mouseStarted =
-                               (this._mouseStart(this._mouseDownEvent, event) !== false);
-                       (this._mouseStarted ? this._mouseDrag(event) : this._mouseUp(event));
-               }
-
-               return !this._mouseStarted;
-       },
-
-       _mouseUp: function(event) {
-               $(document)
-                       .unbind('mousemove.'+this.widgetName, this._mouseMoveDelegate)
-                       .unbind('mouseup.'+this.widgetName, this._mouseUpDelegate);
-
-               if (this._mouseStarted) {
-                       this._mouseStarted = false;
-
-                       if (event.target == this._mouseDownEvent.target) {
-                           $.data(event.target, this.widgetName + '.preventClickEvent', true);
-                       }
-
-                       this._mouseStop(event);
-               }
-
-               return false;
-       },
-
-       _mouseDistanceMet: function(event) {
-               return (Math.max(
-                               Math.abs(this._mouseDownEvent.pageX - event.pageX),
-                               Math.abs(this._mouseDownEvent.pageY - event.pageY)
-                       ) >= this.options.distance
-               );
-       },
-
-       _mouseDelayMet: function(event) {
-               return this.mouseDelayMet;
-       },
-
-       // These are placeholder methods, to be overriden by extending plugin
-       _mouseStart: function(event) {},
-       _mouseDrag: function(event) {},
-       _mouseStop: function(event) {},
-       _mouseCapture: function(event) { return true; }
-});
-
-})(jQuery);
diff --git a/resources/jquery.ui/jquery.ui.position.js b/resources/jquery.ui/jquery.ui.position.js
deleted file mode 100644 (file)
index 8b20179..0000000
+++ /dev/null
@@ -1,308 +0,0 @@
-/*!
- * jQuery UI Position 1.8.24
- *
- * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
- * Dual licensed under the MIT or GPL Version 2 licenses.
- * http://jquery.org/license
- *
- * http://docs.jquery.com/UI/Position
- */
-(function( $, undefined ) {
-
-$.ui = $.ui || {};
-
-var horizontalPositions = /left|center|right/,
-       verticalPositions = /top|center|bottom/,
-       center = "center",
-       support = {},
-       _position = $.fn.position,
-       _offset = $.fn.offset;
-
-$.fn.position = function( options ) {
-       if ( !options || !options.of ) {
-               return _position.apply( this, arguments );
-       }
-
-       // make a copy, we don't want to modify arguments
-       options = $.extend( {}, options );
-
-       var target = $( options.of ),
-               targetElem = target[0],
-               collision = ( options.collision || "flip" ).split( " " ),
-               offset = options.offset ? options.offset.split( " " ) : [ 0, 0 ],
-               targetWidth,
-               targetHeight,
-               basePosition;
-
-       if ( targetElem.nodeType === 9 ) {
-               targetWidth = target.width();
-               targetHeight = target.height();
-               basePosition = { top: 0, left: 0 };
-       // TODO: use $.isWindow() in 1.9
-       } else if ( targetElem.setTimeout ) {
-               targetWidth = target.width();
-               targetHeight = target.height();
-               basePosition = { top: target.scrollTop(), left: target.scrollLeft() };
-       } else if ( targetElem.preventDefault ) {
-               // force left top to allow flipping
-               options.at = "left top";
-               targetWidth = targetHeight = 0;
-               basePosition = { top: options.of.pageY, left: options.of.pageX };
-       } else {
-               targetWidth = target.outerWidth();
-               targetHeight = target.outerHeight();
-               basePosition = target.offset();
-       }
-
-       // force my and at to have valid horizontal and veritcal positions
-       // if a value is missing or invalid, it will be converted to center 
-       $.each( [ "my", "at" ], function() {
-               var pos = ( options[this] || "" ).split( " " );
-               if ( pos.length === 1) {
-                       pos = horizontalPositions.test( pos[0] ) ?
-                               pos.concat( [center] ) :
-                               verticalPositions.test( pos[0] ) ?
-                                       [ center ].concat( pos ) :
-                                       [ center, center ];
-               }
-               pos[ 0 ] = horizontalPositions.test( pos[0] ) ? pos[ 0 ] : center;
-               pos[ 1 ] = verticalPositions.test( pos[1] ) ? pos[ 1 ] : center;
-               options[ this ] = pos;
-       });
-
-       // normalize collision option
-       if ( collision.length === 1 ) {
-               collision[ 1 ] = collision[ 0 ];
-       }
-
-       // normalize offset option
-       offset[ 0 ] = parseInt( offset[0], 10 ) || 0;
-       if ( offset.length === 1 ) {
-               offset[ 1 ] = offset[ 0 ];
-       }
-       offset[ 1 ] = parseInt( offset[1], 10 ) || 0;
-
-       if ( options.at[0] === "right" ) {
-               basePosition.left += targetWidth;
-       } else if ( options.at[0] === center ) {
-               basePosition.left += targetWidth / 2;
-       }
-
-       if ( options.at[1] === "bottom" ) {
-               basePosition.top += targetHeight;
-       } else if ( options.at[1] === center ) {
-               basePosition.top += targetHeight / 2;
-       }
-
-       basePosition.left += offset[ 0 ];
-       basePosition.top += offset[ 1 ];
-
-       return this.each(function() {
-               var elem = $( this ),
-                       elemWidth = elem.outerWidth(),
-                       elemHeight = elem.outerHeight(),
-                       marginLeft = parseInt( $.curCSS( this, "marginLeft", true ) ) || 0,
-                       marginTop = parseInt( $.curCSS( this, "marginTop", true ) ) || 0,
-                       collisionWidth = elemWidth + marginLeft +
-                               ( parseInt( $.curCSS( this, "marginRight", true ) ) || 0 ),
-                       collisionHeight = elemHeight + marginTop +
-                               ( parseInt( $.curCSS( this, "marginBottom", true ) ) || 0 ),
-                       position = $.extend( {}, basePosition ),
-                       collisionPosition;
-
-               if ( options.my[0] === "right" ) {
-                       position.left -= elemWidth;
-               } else if ( options.my[0] === center ) {
-                       position.left -= elemWidth / 2;
-               }
-
-               if ( options.my[1] === "bottom" ) {
-                       position.top -= elemHeight;
-               } else if ( options.my[1] === center ) {
-                       position.top -= elemHeight / 2;
-               }
-
-               // prevent fractions if jQuery version doesn't support them (see #5280)
-               if ( !support.fractions ) {
-                       position.left = Math.round( position.left );
-                       position.top = Math.round( position.top );
-               }
-
-               collisionPosition = {
-                       left: position.left - marginLeft,
-                       top: position.top - marginTop
-               };
-
-               $.each( [ "left", "top" ], function( i, dir ) {
-                       if ( $.ui.position[ collision[i] ] ) {
-                               $.ui.position[ collision[i] ][ dir ]( position, {
-                                       targetWidth: targetWidth,
-                                       targetHeight: targetHeight,
-                                       elemWidth: elemWidth,
-                                       elemHeight: elemHeight,
-                                       collisionPosition: collisionPosition,
-                                       collisionWidth: collisionWidth,
-                                       collisionHeight: collisionHeight,
-                                       offset: offset,
-                                       my: options.my,
-                                       at: options.at
-                               });
-                       }
-               });
-
-               if ( $.fn.bgiframe ) {
-                       elem.bgiframe();
-               }
-               elem.offset( $.extend( position, { using: options.using } ) );
-       });
-};
-
-$.ui.position = {
-       fit: {
-               left: function( position, data ) {
-                       var win = $( window ),
-                               over = data.collisionPosition.left + data.collisionWidth - win.width() - win.scrollLeft();
-                       position.left = over > 0 ? position.left - over : Math.max( position.left - data.collisionPosition.left, position.left );
-               },
-               top: function( position, data ) {
-                       var win = $( window ),
-                               over = data.collisionPosition.top + data.collisionHeight - win.height() - win.scrollTop();
-                       position.top = over > 0 ? position.top - over : Math.max( position.top - data.collisionPosition.top, position.top );
-               }
-       },
-
-       flip: {
-               left: function( position, data ) {
-                       if ( data.at[0] === center ) {
-                               return;
-                       }
-                       var win = $( window ),
-                               over = data.collisionPosition.left + data.collisionWidth - win.width() - win.scrollLeft(),
-                               myOffset = data.my[ 0 ] === "left" ?
-                                       -data.elemWidth :
-                                       data.my[ 0 ] === "right" ?
-                                               data.elemWidth :
-                                               0,
-                               atOffset = data.at[ 0 ] === "left" ?
-                                       data.targetWidth :
-                                       -data.targetWidth,
-                               offset = -2 * data.offset[ 0 ];
-                       position.left += data.collisionPosition.left < 0 ?
-                               myOffset + atOffset + offset :
-                               over > 0 ?
-                                       myOffset + atOffset + offset :
-                                       0;
-               },
-               top: function( position, data ) {
-                       if ( data.at[1] === center ) {
-                               return;
-                       }
-                       var win = $( window ),
-                               over = data.collisionPosition.top + data.collisionHeight - win.height() - win.scrollTop(),
-                               myOffset = data.my[ 1 ] === "top" ?
-                                       -data.elemHeight :
-                                       data.my[ 1 ] === "bottom" ?
-                                               data.elemHeight :
-                                               0,
-                               atOffset = data.at[ 1 ] === "top" ?
-                                       data.targetHeight :
-                                       -data.targetHeight,
-                               offset = -2 * data.offset[ 1 ];
-                       position.top += data.collisionPosition.top < 0 ?
-                               myOffset + atOffset + offset :
-                               over > 0 ?
-                                       myOffset + atOffset + offset :
-                                       0;
-               }
-       }
-};
-
-// offset setter from jQuery 1.4
-if ( !$.offset.setOffset ) {
-       $.offset.setOffset = function( elem, options ) {
-               // set position first, in-case top/left are set even on static elem
-               if ( /static/.test( $.curCSS( elem, "position" ) ) ) {
-                       elem.style.position = "relative";
-               }
-               var curElem   = $( elem ),
-                       curOffset = curElem.offset(),
-                       curTop    = parseInt( $.curCSS( elem, "top",  true ), 10 ) || 0,
-                       curLeft   = parseInt( $.curCSS( elem, "left", true ), 10)  || 0,
-                       props     = {
-                               top:  (options.top  - curOffset.top)  + curTop,
-                               left: (options.left - curOffset.left) + curLeft
-                       };
-               
-               if ( 'using' in options ) {
-                       options.using.call( elem, props );
-               } else {
-                       curElem.css( props );
-               }
-       };
-
-       $.fn.offset = function( options ) {
-               var elem = this[ 0 ];
-               if ( !elem || !elem.ownerDocument ) { return null; }
-               if ( options ) {
-                       if ( $.isFunction( options ) ) {
-                               return this.each(function( i ) {
-                                       $( this ).offset( options.call( this, i, $( this ).offset() ) );
-                               });
-                       }
-                       return this.each(function() {
-                               $.offset.setOffset( this, options );
-                       });
-               }
-               return _offset.call( this );
-       };
-}
-
-// jQuery <1.4.3 uses curCSS, in 1.4.3 - 1.7.2 curCSS = css, 1.8+ only has css
-if ( !$.curCSS ) {
-       $.curCSS = $.css;
-}
-
-// fraction support test (older versions of jQuery don't support fractions)
-(function () {
-       var body = document.getElementsByTagName( "body" )[ 0 ], 
-               div = document.createElement( "div" ),
-               testElement, testElementParent, testElementStyle, offset, offsetTotal;
-
-       //Create a "fake body" for testing based on method used in jQuery.support
-       testElement = document.createElement( body ? "div" : "body" );
-       testElementStyle = {
-               visibility: "hidden",
-               width: 0,
-               height: 0,
-               border: 0,
-               margin: 0,
-               background: "none"
-       };
-       if ( body ) {
-               $.extend( testElementStyle, {
-                       position: "absolute",
-                       left: "-1000px",
-                       top: "-1000px"
-               });
-       }
-       for ( var i in testElementStyle ) {
-               testElement.style[ i ] = testElementStyle[ i ];
-       }
-       testElement.appendChild( div );
-       testElementParent = body || document.documentElement;
-       testElementParent.insertBefore( testElement, testElementParent.firstChild );
-
-       div.style.cssText = "position: absolute; left: 10.7432222px; top: 10.432325px; height: 30px; width: 201px;";
-
-       offset = $( div ).offset( function( _, offset ) {
-               return offset;
-       }).offset();
-
-       testElement.innerHTML = "";
-       testElementParent.removeChild( testElement );
-
-       offsetTotal = offset.top + offset.left + ( body ? 2000 : 0 );
-       support.fractions = offsetTotal > 21 && offsetTotal < 22;
-})();
-
-}( jQuery ));
diff --git a/resources/jquery.ui/jquery.ui.progressbar.js b/resources/jquery.ui/jquery.ui.progressbar.js
deleted file mode 100644 (file)
index 7cea1ba..0000000
+++ /dev/null
@@ -1,109 +0,0 @@
-/*!
- * jQuery UI Progressbar 1.8.24
- *
- * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
- * Dual licensed under the MIT or GPL Version 2 licenses.
- * http://jquery.org/license
- *
- * http://docs.jquery.com/UI/Progressbar
- *
- * Depends:
- *   jquery.ui.core.js
- *   jquery.ui.widget.js
- */
-(function( $, undefined ) {
-
-$.widget( "ui.progressbar", {
-       options: {
-               value: 0,
-               max: 100
-       },
-
-       min: 0,
-
-       _create: function() {
-               this.element
-                       .addClass( "ui-progressbar ui-widget ui-widget-content ui-corner-all" )
-                       .attr({
-                               role: "progressbar",
-                               "aria-valuemin": this.min,
-                               "aria-valuemax": this.options.max,
-                               "aria-valuenow": this._value()
-                       });
-
-               this.valueDiv = $( "<div class='ui-progressbar-value ui-widget-header ui-corner-left'></div>" )
-                       .appendTo( this.element );
-
-               this.oldValue = this._value();
-               this._refreshValue();
-       },
-
-       destroy: function() {
-               this.element
-                       .removeClass( "ui-progressbar ui-widget ui-widget-content ui-corner-all" )
-                       .removeAttr( "role" )
-                       .removeAttr( "aria-valuemin" )
-                       .removeAttr( "aria-valuemax" )
-                       .removeAttr( "aria-valuenow" );
-
-               this.valueDiv.remove();
-
-               $.Widget.prototype.destroy.apply( this, arguments );
-       },
-
-       value: function( newValue ) {
-               if ( newValue === undefined ) {
-                       return this._value();
-               }
-
-               this._setOption( "value", newValue );
-               return this;
-       },
-
-       _setOption: function( key, value ) {
-               if ( key === "value" ) {
-                       this.options.value = value;
-                       this._refreshValue();
-                       if ( this._value() === this.options.max ) {
-                               this._trigger( "complete" );
-                       }
-               }
-
-               $.Widget.prototype._setOption.apply( this, arguments );
-       },
-
-       _value: function() {
-               var val = this.options.value;
-               // normalize invalid value
-               if ( typeof val !== "number" ) {
-                       val = 0;
-               }
-               return Math.min( this.options.max, Math.max( this.min, val ) );
-       },
-
-       _percentage: function() {
-               return 100 * this._value() / this.options.max;
-       },
-
-       _refreshValue: function() {
-               var value = this.value();
-               var percentage = this._percentage();
-
-               if ( this.oldValue !== value ) {
-                       this.oldValue = value;
-                       this._trigger( "change" );
-               }
-
-               this.valueDiv
-                       .toggle( value > this.min )
-                       .toggleClass( "ui-corner-right", value === this.options.max )
-                       .width( percentage.toFixed(0) + "%" );
-               this.element.attr( "aria-valuenow", value );
-       }
-});
-
-$.extend( $.ui.progressbar, {
-       version: "1.8.24"
-});
-
-})( jQuery );
diff --git a/resources/jquery.ui/jquery.ui.resizable.js b/resources/jquery.ui/jquery.ui.resizable.js
deleted file mode 100644 (file)
index 6cc6f41..0000000
+++ /dev/null
@@ -1,807 +0,0 @@
-/*!
- * jQuery UI Resizable 1.8.24
- *
- * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
- * Dual licensed under the MIT or GPL Version 2 licenses.
- * http://jquery.org/license
- *
- * http://docs.jquery.com/UI/Resizables
- *
- * Depends:
- *     jquery.ui.core.js
- *     jquery.ui.mouse.js
- *     jquery.ui.widget.js
- */
-(function( $, undefined ) {
-
-$.widget("ui.resizable", $.ui.mouse, {
-       widgetEventPrefix: "resize",
-       options: {
-               alsoResize: false,
-               animate: false,
-               animateDuration: "slow",
-               animateEasing: "swing",
-               aspectRatio: false,
-               autoHide: false,
-               containment: false,
-               ghost: false,
-               grid: false,
-               handles: "e,s,se",
-               helper: false,
-               maxHeight: null,
-               maxWidth: null,
-               minHeight: 10,
-               minWidth: 10,
-               zIndex: 1000
-       },
-       _create: function() {
-
-               var self = this, o = this.options;
-               this.element.addClass("ui-resizable");
-
-               $.extend(this, {
-                       _aspectRatio: !!(o.aspectRatio),
-                       aspectRatio: o.aspectRatio,
-                       originalElement: this.element,
-                       _proportionallyResizeElements: [],
-                       _helper: o.helper || o.ghost || o.animate ? o.helper || 'ui-resizable-helper' : null
-               });
-
-               //Wrap the element if it cannot hold child nodes
-               if(this.element[0].nodeName.match(/canvas|textarea|input|select|button|img/i)) {
-
-                       //Create a wrapper element and set the wrapper to the new current internal element
-                       this.element.wrap(
-                               $('<div class="ui-wrapper" style="overflow: hidden;"></div>').css({
-                                       position: this.element.css('position'),
-                                       width: this.element.outerWidth(),
-                                       height: this.element.outerHeight(),
-                                       top: this.element.css('top'),
-                                       left: this.element.css('left')
-                               })
-                       );
-
-                       //Overwrite the original this.element
-                       this.element = this.element.parent().data(
-                               "resizable", this.element.data('resizable')
-                       );
-
-                       this.elementIsWrapper = true;
-
-                       //Move margins to the wrapper
-                       this.element.css({ marginLeft: this.originalElement.css("marginLeft"), marginTop: this.originalElement.css("marginTop"), marginRight: this.originalElement.css("marginRight"), marginBottom: this.originalElement.css("marginBottom") });
-                       this.originalElement.css({ marginLeft: 0, marginTop: 0, marginRight: 0, marginBottom: 0});
-
-                       //Prevent Safari textarea resize
-                       this.originalResizeStyle = this.originalElement.css('resize');
-                       this.originalElement.css('resize', 'none');
-
-                       //Push the actual element to our proportionallyResize internal array
-                       this._proportionallyResizeElements.push(this.originalElement.css({ position: 'static', zoom: 1, display: 'block' }));
-
-                       // avoid IE jump (hard set the margin)
-                       this.originalElement.css({ margin: this.originalElement.css('margin') });
-
-                       // fix handlers offset
-                       this._proportionallyResize();
-
-               }
-
-               this.handles = o.handles || (!$('.ui-resizable-handle', this.element).length ? "e,s,se" : { n: '.ui-resizable-n', e: '.ui-resizable-e', s: '.ui-resizable-s', w: '.ui-resizable-w', se: '.ui-resizable-se', sw: '.ui-resizable-sw', ne: '.ui-resizable-ne', nw: '.ui-resizable-nw' });
-               if(this.handles.constructor == String) {
-
-                       if(this.handles == 'all') this.handles = 'n,e,s,w,se,sw,ne,nw';
-                       var n = this.handles.split(","); this.handles = {};
-
-                       for(var i = 0; i < n.length; i++) {
-
-                               var handle = $.trim(n[i]), hname = 'ui-resizable-'+handle;
-                               var axis = $('<div class="ui-resizable-handle ' + hname + '"></div>');
-
-                               // Apply zIndex to all handles - see #7960
-                               axis.css({ zIndex: o.zIndex });
-
-                               //TODO : What's going on here?
-                               if ('se' == handle) {
-                                       axis.addClass('ui-icon ui-icon-gripsmall-diagonal-se');
-                               };
-
-                               //Insert into internal handles object and append to element
-                               this.handles[handle] = '.ui-resizable-'+handle;
-                               this.element.append(axis);
-                       }
-
-               }
-
-               this._renderAxis = function(target) {
-
-                       target = target || this.element;
-
-                       for(var i in this.handles) {
-
-                               if(this.handles[i].constructor == String)
-                                       this.handles[i] = $(this.handles[i], this.element).show();
-
-                               //Apply pad to wrapper element, needed to fix axis position (textarea, inputs, scrolls)
-                               if (this.elementIsWrapper && this.originalElement[0].nodeName.match(/textarea|input|select|button/i)) {
-
-                                       var axis = $(this.handles[i], this.element), padWrapper = 0;
-
-                                       //Checking the correct pad and border
-                                       padWrapper = /sw|ne|nw|se|n|s/.test(i) ? axis.outerHeight() : axis.outerWidth();
-
-                                       //The padding type i have to apply...
-                                       var padPos = [ 'padding',
-                                               /ne|nw|n/.test(i) ? 'Top' :
-                                               /se|sw|s/.test(i) ? 'Bottom' :
-                                               /^e$/.test(i) ? 'Right' : 'Left' ].join("");
-
-                                       target.css(padPos, padWrapper);
-
-                                       this._proportionallyResize();
-
-                               }
-
-                               //TODO: What's that good for? There's not anything to be executed left
-                               if(!$(this.handles[i]).length)
-                                       continue;
-
-                       }
-               };
-
-               //TODO: make renderAxis a prototype function
-               this._renderAxis(this.element);
-
-               this._handles = $('.ui-resizable-handle', this.element)
-                       .disableSelection();
-
-               //Matching axis name
-               this._handles.mouseover(function() {
-                       if (!self.resizing) {
-                               if (this.className)
-                                       var axis = this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i);
-                               //Axis, default = se
-                               self.axis = axis && axis[1] ? axis[1] : 'se';
-                       }
-               });
-
-               //If we want to auto hide the elements
-               if (o.autoHide) {
-                       this._handles.hide();
-                       $(this.element)
-                               .addClass("ui-resizable-autohide")
-                               .hover(function() {
-                                       if (o.disabled) return;
-                                       $(this).removeClass("ui-resizable-autohide");
-                                       self._handles.show();
-                               },
-                               function(){
-                                       if (o.disabled) return;
-                                       if (!self.resizing) {
-                                               $(this).addClass("ui-resizable-autohide");
-                                               self._handles.hide();
-                                       }
-                               });
-               }
-
-               //Initialize the mouse interaction
-               this._mouseInit();
-
-       },
-
-       destroy: function() {
-
-               this._mouseDestroy();
-
-               var _destroy = function(exp) {
-                       $(exp).removeClass("ui-resizable ui-resizable-disabled ui-resizable-resizing")
-                               .removeData("resizable").unbind(".resizable").find('.ui-resizable-handle').remove();
-               };
-
-               //TODO: Unwrap at same DOM position
-               if (this.elementIsWrapper) {
-                       _destroy(this.element);
-                       var wrapper = this.element;
-                       wrapper.after(
-                               this.originalElement.css({
-                                       position: wrapper.css('position'),
-                                       width: wrapper.outerWidth(),
-                                       height: wrapper.outerHeight(),
-                                       top: wrapper.css('top'),
-                                       left: wrapper.css('left')
-                               })
-                       ).remove();
-               }
-
-               this.originalElement.css('resize', this.originalResizeStyle);
-               _destroy(this.originalElement);
-
-               return this;
-       },
-
-       _mouseCapture: function(event) {
-               var handle = false;
-               for (var i in this.handles) {
-                       if ($(this.handles[i])[0] == event.target) {
-                               handle = true;
-                       }
-               }
-
-               return !this.options.disabled && handle;
-       },
-
-       _mouseStart: function(event) {
-
-               var o = this.options, iniPos = this.element.position(), el = this.element;
-
-               this.resizing = true;
-               this.documentScroll = { top: $(document).scrollTop(), left: $(document).scrollLeft() };
-
-               // bugfix for http://dev.jquery.com/ticket/1749
-               if (el.is('.ui-draggable') || (/absolute/).test(el.css('position'))) {
-                       el.css({ position: 'absolute', top: iniPos.top, left: iniPos.left });
-               }
-
-               this._renderProxy();
-
-               var curleft = num(this.helper.css('left')), curtop = num(this.helper.css('top'));
-
-               if (o.containment) {
-                       curleft += $(o.containment).scrollLeft() || 0;
-                       curtop += $(o.containment).scrollTop() || 0;
-               }
-
-               //Store needed variables
-               this.offset = this.helper.offset();
-               this.position = { left: curleft, top: curtop };
-               this.size = this._helper ? { width: el.outerWidth(), height: el.outerHeight() } : { width: el.width(), height: el.height() };
-               this.originalSize = this._helper ? { width: el.outerWidth(), height: el.outerHeight() } : { width: el.width(), height: el.height() };
-               this.originalPosition = { left: curleft, top: curtop };
-               this.sizeDiff = { width: el.outerWidth() - el.width(), height: el.outerHeight() - el.height() };
-               this.originalMousePosition = { left: event.pageX, top: event.pageY };
-
-               //Aspect Ratio
-               this.aspectRatio = (typeof o.aspectRatio == 'number') ? o.aspectRatio : ((this.originalSize.width / this.originalSize.height) || 1);
-
-           var cursor = $('.ui-resizable-' + this.axis).css('cursor');
-           $('body').css('cursor', cursor == 'auto' ? this.axis + '-resize' : cursor);
-
-               el.addClass("ui-resizable-resizing");
-               this._propagate("start", event);
-               return true;
-       },
-
-       _mouseDrag: function(event) {
-
-               //Increase performance, avoid regex
-               var el = this.helper, o = this.options, props = {},
-                       self = this, smp = this.originalMousePosition, a = this.axis;
-
-               var dx = (event.pageX-smp.left)||0, dy = (event.pageY-smp.top)||0;
-               var trigger = this._change[a];
-               if (!trigger) return false;
-
-               // Calculate the attrs that will be change
-               var data = trigger.apply(this, [event, dx, dy]), ie6 = $.browser.msie && $.browser.version < 7, csdif = this.sizeDiff;
-
-               // Put this in the mouseDrag handler since the user can start pressing shift while resizing
-               this._updateVirtualBoundaries(event.shiftKey);
-               if (this._aspectRatio || event.shiftKey)
-                       data = this._updateRatio(data, event);
-
-               data = this._respectSize(data, event);
-
-               // plugins callbacks need to be called first
-               this._propagate("resize", event);
-
-               el.css({
-                       top: this.position.top + "px", left: this.position.left + "px",
-                       width: this.size.width + "px", height: this.size.height + "px"
-               });
-
-               if (!this._helper && this._proportionallyResizeElements.length)
-                       this._proportionallyResize();
-
-               this._updateCache(data);
-
-               // calling the user callback at the end
-               this._trigger('resize', event, this.ui());
-
-               return false;
-       },
-
-       _mouseStop: function(event) {
-
-               this.resizing = false;
-               var o = this.options, self = this;
-
-               if(this._helper) {
-                       var pr = this._proportionallyResizeElements, ista = pr.length && (/textarea/i).test(pr[0].nodeName),
-                               soffseth = ista && $.ui.hasScroll(pr[0], 'left') /* TODO - jump height */ ? 0 : self.sizeDiff.height,
-                               soffsetw = ista ? 0 : self.sizeDiff.width;
-
-                       var s = { width: (self.helper.width()  - soffsetw), height: (self.helper.height() - soffseth) },
-                               left = (parseInt(self.element.css('left'), 10) + (self.position.left - self.originalPosition.left)) || null,
-                               top = (parseInt(self.element.css('top'), 10) + (self.position.top - self.originalPosition.top)) || null;
-
-                       if (!o.animate)
-                               this.element.css($.extend(s, { top: top, left: left }));
-
-                       self.helper.height(self.size.height);
-                       self.helper.width(self.size.width);
-
-                       if (this._helper && !o.animate) this._proportionallyResize();
-               }
-
-               $('body').css('cursor', 'auto');
-
-               this.element.removeClass("ui-resizable-resizing");
-
-               this._propagate("stop", event);
-
-               if (this._helper) this.helper.remove();
-               return false;
-
-       },
-
-    _updateVirtualBoundaries: function(forceAspectRatio) {
-        var o = this.options, pMinWidth, pMaxWidth, pMinHeight, pMaxHeight, b;
-
-        b = {
-            minWidth: isNumber(o.minWidth) ? o.minWidth : 0,
-            maxWidth: isNumber(o.maxWidth) ? o.maxWidth : Infinity,
-            minHeight: isNumber(o.minHeight) ? o.minHeight : 0,
-            maxHeight: isNumber(o.maxHeight) ? o.maxHeight : Infinity
-        };
-
-        if(this._aspectRatio || forceAspectRatio) {
-            // We want to create an enclosing box whose aspect ration is the requested one
-            // First, compute the "projected" size for each dimension based on the aspect ratio and other dimension
-            pMinWidth = b.minHeight * this.aspectRatio;
-            pMinHeight = b.minWidth / this.aspectRatio;
-            pMaxWidth = b.maxHeight * this.aspectRatio;
-            pMaxHeight = b.maxWidth / this.aspectRatio;
-
-            if(pMinWidth > b.minWidth) b.minWidth = pMinWidth;
-            if(pMinHeight > b.minHeight) b.minHeight = pMinHeight;
-            if(pMaxWidth < b.maxWidth) b.maxWidth = pMaxWidth;
-            if(pMaxHeight < b.maxHeight) b.maxHeight = pMaxHeight;
-        }
-        this._vBoundaries = b;
-    },
-
-       _updateCache: function(data) {
-               var o = this.options;
-               this.offset = this.helper.offset();
-               if (isNumber(data.left)) this.position.left = data.left;
-               if (isNumber(data.top)) this.position.top = data.top;
-               if (isNumber(data.height)) this.size.height = data.height;
-               if (isNumber(data.width)) this.size.width = data.width;
-       },
-
-       _updateRatio: function(data, event) {
-
-               var o = this.options, cpos = this.position, csize = this.size, a = this.axis;
-
-               if (isNumber(data.height)) data.width = (data.height * this.aspectRatio);
-               else if (isNumber(data.width)) data.height = (data.width / this.aspectRatio);
-
-               if (a == 'sw') {
-                       data.left = cpos.left + (csize.width - data.width);
-                       data.top = null;
-               }
-               if (a == 'nw') {
-                       data.top = cpos.top + (csize.height - data.height);
-                       data.left = cpos.left + (csize.width - data.width);
-               }
-
-               return data;
-       },
-
-       _respectSize: function(data, event) {
-
-               var el = this.helper, o = this._vBoundaries, pRatio = this._aspectRatio || event.shiftKey, a = this.axis,
-                               ismaxw = isNumber(data.width) && o.maxWidth && (o.maxWidth < data.width), ismaxh = isNumber(data.height) && o.maxHeight && (o.maxHeight < data.height),
-                                       isminw = isNumber(data.width) && o.minWidth && (o.minWidth > data.width), isminh = isNumber(data.height) && o.minHeight && (o.minHeight > data.height);
-
-               if (isminw) data.width = o.minWidth;
-               if (isminh) data.height = o.minHeight;
-               if (ismaxw) data.width = o.maxWidth;
-               if (ismaxh) data.height = o.maxHeight;
-
-               var dw = this.originalPosition.left + this.originalSize.width, dh = this.position.top + this.size.height;
-               var cw = /sw|nw|w/.test(a), ch = /nw|ne|n/.test(a);
-
-               if (isminw && cw) data.left = dw - o.minWidth;
-               if (ismaxw && cw) data.left = dw - o.maxWidth;
-               if (isminh && ch)       data.top = dh - o.minHeight;
-               if (ismaxh && ch)       data.top = dh - o.maxHeight;
-
-               // fixing jump error on top/left - bug #2330
-               var isNotwh = !data.width && !data.height;
-               if (isNotwh && !data.left && data.top) data.top = null;
-               else if (isNotwh && !data.top && data.left) data.left = null;
-
-               return data;
-       },
-
-       _proportionallyResize: function() {
-
-               var o = this.options;
-               if (!this._proportionallyResizeElements.length) return;
-               var element = this.helper || this.element;
-
-               for (var i=0; i < this._proportionallyResizeElements.length; i++) {
-
-                       var prel = this._proportionallyResizeElements[i];
-
-                       if (!this.borderDif) {
-                               var b = [prel.css('borderTopWidth'), prel.css('borderRightWidth'), prel.css('borderBottomWidth'), prel.css('borderLeftWidth')],
-                                       p = [prel.css('paddingTop'), prel.css('paddingRight'), prel.css('paddingBottom'), prel.css('paddingLeft')];
-
-                               this.borderDif = $.map(b, function(v, i) {
-                                       var border = parseInt(v,10)||0, padding = parseInt(p[i],10)||0;
-                                       return border + padding;
-                               });
-                       }
-
-                       if ($.browser.msie && !(!($(element).is(':hidden') || $(element).parents(':hidden').length)))
-                               continue;
-
-                       prel.css({
-                               height: (element.height() - this.borderDif[0] - this.borderDif[2]) || 0,
-                               width: (element.width() - this.borderDif[1] - this.borderDif[3]) || 0
-                       });
-
-               };
-
-       },
-
-       _renderProxy: function() {
-
-               var el = this.element, o = this.options;
-               this.elementOffset = el.offset();
-
-               if(this._helper) {
-
-                       this.helper = this.helper || $('<div style="overflow:hidden;"></div>');
-
-                       // fix ie6 offset TODO: This seems broken
-                       var ie6 = $.browser.msie && $.browser.version < 7, ie6offset = (ie6 ? 1 : 0),
-                       pxyoffset = ( ie6 ? 2 : -1 );
-
-                       this.helper.addClass(this._helper).css({
-                               width: this.element.outerWidth() + pxyoffset,
-                               height: this.element.outerHeight() + pxyoffset,
-                               position: 'absolute',
-                               left: this.elementOffset.left - ie6offset +'px',
-                               top: this.elementOffset.top - ie6offset +'px',
-                               zIndex: ++o.zIndex //TODO: Don't modify option
-                       });
-
-                       this.helper
-                               .appendTo("body")
-                               .disableSelection();
-
-               } else {
-                       this.helper = this.element;
-               }
-
-       },
-
-       _change: {
-               e: function(event, dx, dy) {
-                       return { width: this.originalSize.width + dx };
-               },
-               w: function(event, dx, dy) {
-                       var o = this.options, cs = this.originalSize, sp = this.originalPosition;
-                       return { left: sp.left + dx, width: cs.width - dx };
-               },
-               n: function(event, dx, dy) {
-                       var o = this.options, cs = this.originalSize, sp = this.originalPosition;
-                       return { top: sp.top + dy, height: cs.height - dy };
-               },
-               s: function(event, dx, dy) {
-                       return { height: this.originalSize.height + dy };
-               },
-               se: function(event, dx, dy) {
-                       return $.extend(this._change.s.apply(this, arguments), this._change.e.apply(this, [event, dx, dy]));
-               },
-               sw: function(event, dx, dy) {
-                       return $.extend(this._change.s.apply(this, arguments), this._change.w.apply(this, [event, dx, dy]));
-               },
-               ne: function(event, dx, dy) {
-                       return $.extend(this._change.n.apply(this, arguments), this._change.e.apply(this, [event, dx, dy]));
-               },
-               nw: function(event, dx, dy) {
-                       return $.extend(this._change.n.apply(this, arguments), this._change.w.apply(this, [event, dx, dy]));
-               }
-       },
-
-       _propagate: function(n, event) {
-               $.ui.plugin.call(this, n, [event, this.ui()]);
-               (n != "resize" && this._trigger(n, event, this.ui()));
-       },
-
-       plugins: {},
-
-       ui: function() {
-               return {
-                       originalElement: this.originalElement,
-                       element: this.element,
-                       helper: this.helper,
-                       position: this.position,
-                       size: this.size,
-                       originalSize: this.originalSize,
-                       originalPosition: this.originalPosition
-               };
-       }
-
-});
-
-$.extend($.ui.resizable, {
-       version: "1.8.24"
-});
-
-/*
- * Resizable Extensions
- */
-
-$.ui.plugin.add("resizable", "alsoResize", {
-
-       start: function (event, ui) {
-               var self = $(this).data("resizable"), o = self.options;
-
-               var _store = function (exp) {
-                       $(exp).each(function() {
-                               var el = $(this);
-                               el.data("resizable-alsoresize", {
-                                       width: parseInt(el.width(), 10), height: parseInt(el.height(), 10),
-                                       left: parseInt(el.css('left'), 10), top: parseInt(el.css('top'), 10)
-                               });
-                       });
-               };
-
-               if (typeof(o.alsoResize) == 'object' && !o.alsoResize.parentNode) {
-                       if (o.alsoResize.length) { o.alsoResize = o.alsoResize[0]; _store(o.alsoResize); }
-                       else { $.each(o.alsoResize, function (exp) { _store(exp); }); }
-               }else{
-                       _store(o.alsoResize);
-               }
-       },
-
-       resize: function (event, ui) {
-               var self = $(this).data("resizable"), o = self.options, os = self.originalSize, op = self.originalPosition;
-
-               var delta = {
-                       height: (self.size.height - os.height) || 0, width: (self.size.width - os.width) || 0,
-                       top: (self.position.top - op.top) || 0, left: (self.position.left - op.left) || 0
-               },
-
-               _alsoResize = function (exp, c) {
-                       $(exp).each(function() {
-                               var el = $(this), start = $(this).data("resizable-alsoresize"), style = {}, 
-                                       css = c && c.length ? c : el.parents(ui.originalElement[0]).length ? ['width', 'height'] : ['width', 'height', 'top', 'left'];
-
-                               $.each(css, function (i, prop) {
-                                       var sum = (start[prop]||0) + (delta[prop]||0);
-                                       if (sum && sum >= 0)
-                                               style[prop] = sum || null;
-                               });
-
-                               el.css(style);
-                       });
-               };
-
-               if (typeof(o.alsoResize) == 'object' && !o.alsoResize.nodeType) {
-                       $.each(o.alsoResize, function (exp, c) { _alsoResize(exp, c); });
-               }else{
-                       _alsoResize(o.alsoResize);
-               }
-       },
-
-       stop: function (event, ui) {
-               $(this).removeData("resizable-alsoresize");
-       }
-});
-
-$.ui.plugin.add("resizable", "animate", {
-
-       stop: function(event, ui) {
-               var self = $(this).data("resizable"), o = self.options;
-
-               var pr = self._proportionallyResizeElements, ista = pr.length && (/textarea/i).test(pr[0].nodeName),
-                                       soffseth = ista && $.ui.hasScroll(pr[0], 'left') /* TODO - jump height */ ? 0 : self.sizeDiff.height,
-                                               soffsetw = ista ? 0 : self.sizeDiff.width;
-
-               var style = { width: (self.size.width - soffsetw), height: (self.size.height - soffseth) },
-                                       left = (parseInt(self.element.css('left'), 10) + (self.position.left - self.originalPosition.left)) || null,
-                                               top = (parseInt(self.element.css('top'), 10) + (self.position.top - self.originalPosition.top)) || null;
-
-               self.element.animate(
-                       $.extend(style, top && left ? { top: top, left: left } : {}), {
-                               duration: o.animateDuration,
-                               easing: o.animateEasing,
-                               step: function() {
-
-                                       var data = {
-                                               width: parseInt(self.element.css('width'), 10),
-                                               height: parseInt(self.element.css('height'), 10),
-                                               top: parseInt(self.element.css('top'), 10),
-                                               left: parseInt(self.element.css('left'), 10)
-                                       };
-
-                                       if (pr && pr.length) $(pr[0]).css({ width: data.width, height: data.height });
-
-                                       // propagating resize, and updating values for each animation step
-                                       self._updateCache(data);
-                                       self._propagate("resize", event);
-
-                               }
-                       }
-               );
-       }
-
-});
-
-$.ui.plugin.add("resizable", "containment", {
-
-       start: function(event, ui) {
-               var self = $(this).data("resizable"), o = self.options, el = self.element;
-               var oc = o.containment, ce = (oc instanceof $) ? oc.get(0) : (/parent/.test(oc)) ? el.parent().get(0) : oc;
-               if (!ce) return;
-
-               self.containerElement = $(ce);
-
-               if (/document/.test(oc) || oc == document) {
-                       self.containerOffset = { left: 0, top: 0 };
-                       self.containerPosition = { left: 0, top: 0 };
-
-                       self.parentData = {
-                               element: $(document), left: 0, top: 0,
-                               width: $(document).width(), height: $(document).height() || document.body.parentNode.scrollHeight
-                       };
-               }
-
-               // i'm a node, so compute top, left, right, bottom
-               else {
-                       var element = $(ce), p = [];
-                       $([ "Top", "Right", "Left", "Bottom" ]).each(function(i, name) { p[i] = num(element.css("padding" + name)); });
-
-                       self.containerOffset = element.offset();
-                       self.containerPosition = element.position();
-                       self.containerSize = { height: (element.innerHeight() - p[3]), width: (element.innerWidth() - p[1]) };
-
-                       var co = self.containerOffset, ch = self.containerSize.height,  cw = self.containerSize.width,
-                                               width = ($.ui.hasScroll(ce, "left") ? ce.scrollWidth : cw ), height = ($.ui.hasScroll(ce) ? ce.scrollHeight : ch);
-
-                       self.parentData = {
-                               element: ce, left: co.left, top: co.top, width: width, height: height
-                       };
-               }
-       },
-
-       resize: function(event, ui) {
-               var self = $(this).data("resizable"), o = self.options,
-                               ps = self.containerSize, co = self.containerOffset, cs = self.size, cp = self.position,
-                               pRatio = self._aspectRatio || event.shiftKey, cop = { top:0, left:0 }, ce = self.containerElement;
-
-               if (ce[0] != document && (/static/).test(ce.css('position'))) cop = co;
-
-               if (cp.left < (self._helper ? co.left : 0)) {
-                       self.size.width = self.size.width + (self._helper ? (self.position.left - co.left) : (self.position.left - cop.left));
-                       if (pRatio) self.size.height = self.size.width / self.aspectRatio;
-                       self.position.left = o.helper ? co.left : 0;
-               }
-
-               if (cp.top < (self._helper ? co.top : 0)) {
-                       self.size.height = self.size.height + (self._helper ? (self.position.top - co.top) : self.position.top);
-                       if (pRatio) self.size.width = self.size.height * self.aspectRatio;
-                       self.position.top = self._helper ? co.top : 0;
-               }
-
-               self.offset.left = self.parentData.left+self.position.left;
-               self.offset.top = self.parentData.top+self.position.top;
-
-               var woset = Math.abs( (self._helper ? self.offset.left - cop.left : (self.offset.left - cop.left)) + self.sizeDiff.width ),
-                                       hoset = Math.abs( (self._helper ? self.offset.top - cop.top : (self.offset.top - co.top)) + self.sizeDiff.height );
-
-               var isParent = self.containerElement.get(0) == self.element.parent().get(0),
-                   isOffsetRelative = /relative|absolute/.test(self.containerElement.css('position'));
-
-               if(isParent && isOffsetRelative) woset -= self.parentData.left;
-
-               if (woset + self.size.width >= self.parentData.width) {
-                       self.size.width = self.parentData.width - woset;
-                       if (pRatio) self.size.height = self.size.width / self.aspectRatio;
-               }
-
-               if (hoset + self.size.height >= self.parentData.height) {
-                       self.size.height = self.parentData.height - hoset;
-                       if (pRatio) self.size.width = self.size.height * self.aspectRatio;
-               }
-       },
-
-       stop: function(event, ui){
-               var self = $(this).data("resizable"), o = self.options, cp = self.position,
-                               co = self.containerOffset, cop = self.containerPosition, ce = self.containerElement;
-
-               var helper = $(self.helper), ho = helper.offset(), w = helper.outerWidth() - self.sizeDiff.width, h = helper.outerHeight() - self.sizeDiff.height;
-
-               if (self._helper && !o.animate && (/relative/).test(ce.css('position')))
-                       $(this).css({ left: ho.left - cop.left - co.left, width: w, height: h });
-
-               if (self._helper && !o.animate && (/static/).test(ce.css('position')))
-                       $(this).css({ left: ho.left - cop.left - co.left, width: w, height: h });
-
-       }
-});
-
-$.ui.plugin.add("resizable", "ghost", {
-
-       start: function(event, ui) {
-
-               var self = $(this).data("resizable"), o = self.options, cs = self.size;
-
-               self.ghost = self.originalElement.clone();
-               self.ghost
-                       .css({ opacity: .25, display: 'block', position: 'relative', height: cs.height, width: cs.width, margin: 0, left: 0, top: 0 })
-                       .addClass('ui-resizable-ghost')
-                       .addClass(typeof o.ghost == 'string' ? o.ghost : '');
-
-               self.ghost.appendTo(self.helper);
-
-       },
-
-       resize: function(event, ui){
-               var self = $(this).data("resizable"), o = self.options;
-               if (self.ghost) self.ghost.css({ position: 'relative', height: self.size.height, width: self.size.width });
-       },
-
-       stop: function(event, ui){
-               var self = $(this).data("resizable"), o = self.options;
-               if (self.ghost && self.helper) self.helper.get(0).removeChild(self.ghost.get(0));
-       }
-
-});
-
-$.ui.plugin.add("resizable", "grid", {
-
-       resize: function(event, ui) {
-               var self = $(this).data("resizable"), o = self.options, cs = self.size, os = self.originalSize, op = self.originalPosition, a = self.axis, ratio = o._aspectRatio || event.shiftKey;
-               o.grid = typeof o.grid == "number" ? [o.grid, o.grid] : o.grid;
-               var ox = Math.round((cs.width - os.width) / (o.grid[0]||1)) * (o.grid[0]||1), oy = Math.round((cs.height - os.height) / (o.grid[1]||1)) * (o.grid[1]||1);
-
-               if (/^(se|s|e)$/.test(a)) {
-                       self.size.width = os.width + ox;
-                       self.size.height = os.height + oy;
-               }
-               else if (/^(ne)$/.test(a)) {
-                       self.size.width = os.width + ox;
-                       self.size.height = os.height + oy;
-                       self.position.top = op.top - oy;
-               }
-               else if (/^(sw)$/.test(a)) {
-                       self.size.width = os.width + ox;
-                       self.size.height = os.height + oy;
-                       self.position.left = op.left - ox;
-               }
-               else {
-                       self.size.width = os.width + ox;
-                       self.size.height = os.height + oy;
-                       self.position.top = op.top - oy;
-                       self.position.left = op.left - ox;
-               }
-       }
-
-});
-
-var num = function(v) {
-       return parseInt(v, 10) || 0;
-};
-
-var isNumber = function(value) {
-       return !isNaN(parseInt(value, 10));
-};
-
-})(jQuery);
diff --git a/resources/jquery.ui/jquery.ui.selectable.js b/resources/jquery.ui/jquery.ui.selectable.js
deleted file mode 100644 (file)
index 44c6e8c..0000000
+++ /dev/null
@@ -1,267 +0,0 @@
-/*!
- * jQuery UI Selectable 1.8.24
- *
- * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
- * Dual licensed under the MIT or GPL Version 2 licenses.
- * http://jquery.org/license
- *
- * http://docs.jquery.com/UI/Selectables
- *
- * Depends:
- *     jquery.ui.core.js
- *     jquery.ui.mouse.js
- *     jquery.ui.widget.js
- */
-(function( $, undefined ) {
-
-$.widget("ui.selectable", $.ui.mouse, {
-       options: {
-               appendTo: 'body',
-               autoRefresh: true,
-               distance: 0,
-               filter: '*',
-               tolerance: 'touch'
-       },
-       _create: function() {
-               var self = this;
-
-               this.element.addClass("ui-selectable");
-
-               this.dragged = false;
-
-               // cache selectee children based on filter
-               var selectees;
-               this.refresh = function() {
-                       selectees = $(self.options.filter, self.element[0]);
-                       selectees.addClass("ui-selectee");
-                       selectees.each(function() {
-                               var $this = $(this);
-                               var pos = $this.offset();
-                               $.data(this, "selectable-item", {
-                                       element: this,
-                                       $element: $this,
-                                       left: pos.left,
-                                       top: pos.top,
-                                       right: pos.left + $this.outerWidth(),
-                                       bottom: pos.top + $this.outerHeight(),
-                                       startselected: false,
-                                       selected: $this.hasClass('ui-selected'),
-                                       selecting: $this.hasClass('ui-selecting'),
-                                       unselecting: $this.hasClass('ui-unselecting')
-                               });
-                       });
-               };
-               this.refresh();
-
-               this.selectees = selectees.addClass("ui-selectee");
-
-               this._mouseInit();
-
-               this.helper = $("<div class='ui-selectable-helper'></div>");
-       },
-
-       destroy: function() {
-               this.selectees
-                       .removeClass("ui-selectee")
-                       .removeData("selectable-item");
-               this.element
-                       .removeClass("ui-selectable ui-selectable-disabled")
-                       .removeData("selectable")
-                       .unbind(".selectable");
-               this._mouseDestroy();
-
-               return this;
-       },
-
-       _mouseStart: function(event) {
-               var self = this;
-
-               this.opos = [event.pageX, event.pageY];
-
-               if (this.options.disabled)
-                       return;
-
-               var options = this.options;
-
-               this.selectees = $(options.filter, this.element[0]);
-
-               this._trigger("start", event);
-
-               $(options.appendTo).append(this.helper);
-               // position helper (lasso)
-               this.helper.css({
-                       "left": event.clientX,
-                       "top": event.clientY,
-                       "width": 0,
-                       "height": 0
-               });
-
-               if (options.autoRefresh) {
-                       this.refresh();
-               }
-
-               this.selectees.filter('.ui-selected').each(function() {
-                       var selectee = $.data(this, "selectable-item");
-                       selectee.startselected = true;
-                       if (!event.metaKey && !event.ctrlKey) {
-                               selectee.$element.removeClass('ui-selected');
-                               selectee.selected = false;
-                               selectee.$element.addClass('ui-unselecting');
-                               selectee.unselecting = true;
-                               // selectable UNSELECTING callback
-                               self._trigger("unselecting", event, {
-                                       unselecting: selectee.element
-                               });
-                       }
-               });
-
-               $(event.target).parents().andSelf().each(function() {
-                       var selectee = $.data(this, "selectable-item");
-                       if (selectee) {
-                               var doSelect = (!event.metaKey && !event.ctrlKey) || !selectee.$element.hasClass('ui-selected');
-                               selectee.$element
-                                       .removeClass(doSelect ? "ui-unselecting" : "ui-selected")
-                                       .addClass(doSelect ? "ui-selecting" : "ui-unselecting");
-                               selectee.unselecting = !doSelect;
-                               selectee.selecting = doSelect;
-                               selectee.selected = doSelect;
-                               // selectable (UN)SELECTING callback
-                               if (doSelect) {
-                                       self._trigger("selecting", event, {
-                                               selecting: selectee.element
-                                       });
-                               } else {
-                                       self._trigger("unselecting", event, {
-                                               unselecting: selectee.element
-                                       });
-                               }
-                               return false;
-                       }
-               });
-
-       },
-
-       _mouseDrag: function(event) {
-               var self = this;
-               this.dragged = true;
-
-               if (this.options.disabled)
-                       return;
-
-               var options = this.options;
-
-               var x1 = this.opos[0], y1 = this.opos[1], x2 = event.pageX, y2 = event.pageY;
-               if (x1 > x2) { var tmp = x2; x2 = x1; x1 = tmp; }
-               if (y1 > y2) { var tmp = y2; y2 = y1; y1 = tmp; }
-               this.helper.css({left: x1, top: y1, width: x2-x1, height: y2-y1});
-
-               this.selectees.each(function() {
-                       var selectee = $.data(this, "selectable-item");
-                       //prevent helper from being selected if appendTo: selectable
-                       if (!selectee || selectee.element == self.element[0])
-                               return;
-                       var hit = false;
-                       if (options.tolerance == 'touch') {
-                               hit = ( !(selectee.left > x2 || selectee.right < x1 || selectee.top > y2 || selectee.bottom < y1) );
-                       } else if (options.tolerance == 'fit') {
-                               hit = (selectee.left > x1 && selectee.right < x2 && selectee.top > y1 && selectee.bottom < y2);
-                       }
-
-                       if (hit) {
-                               // SELECT
-                               if (selectee.selected) {
-                                       selectee.$element.removeClass('ui-selected');
-                                       selectee.selected = false;
-                               }
-                               if (selectee.unselecting) {
-                                       selectee.$element.removeClass('ui-unselecting');
-                                       selectee.unselecting = false;
-                               }
-                               if (!selectee.selecting) {
-                                       selectee.$element.addClass('ui-selecting');
-                                       selectee.selecting = true;
-                                       // selectable SELECTING callback
-                                       self._trigger("selecting", event, {
-                                               selecting: selectee.element
-                                       });
-                               }
-                       } else {
-                               // UNSELECT
-                               if (selectee.selecting) {
-                                       if ((event.metaKey || event.ctrlKey) && selectee.startselected) {
-                                               selectee.$element.removeClass('ui-selecting');
-                                               selectee.selecting = false;
-                                               selectee.$element.addClass('ui-selected');
-                                               selectee.selected = true;
-                                       } else {
-                                               selectee.$element.removeClass('ui-selecting');
-                                               selectee.selecting = false;
-                                               if (selectee.startselected) {
-                                                       selectee.$element.addClass('ui-unselecting');
-                                                       selectee.unselecting = true;
-                                               }
-                                               // selectable UNSELECTING callback
-                                               self._trigger("unselecting", event, {
-                                                       unselecting: selectee.element
-                                               });
-                                       }
-                               }
-                               if (selectee.selected) {
-                                       if (!event.metaKey && !event.ctrlKey && !selectee.startselected) {
-                                               selectee.$element.removeClass('ui-selected');
-                                               selectee.selected = false;
-
-                                               selectee.$element.addClass('ui-unselecting');
-                                               selectee.unselecting = true;
-                                               // selectable UNSELECTING callback
-                                               self._trigger("unselecting", event, {
-                                                       unselecting: selectee.element
-                                               });
-                                       }
-                               }
-                       }
-               });
-
-               return false;
-       },
-
-       _mouseStop: function(event) {
-               var self = this;
-
-               this.dragged = false;
-
-               var options = this.options;
-
-               $('.ui-unselecting', this.element[0]).each(function() {
-                       var selectee = $.data(this, "selectable-item");
-                       selectee.$element.removeClass('ui-unselecting');
-                       selectee.unselecting = false;
-                       selectee.startselected = false;
-                       self._trigger("unselected", event, {
-                               unselected: selectee.element
-                       });
-               });
-               $('.ui-selecting', this.element[0]).each(function() {
-                       var selectee = $.data(this, "selectable-item");
-                       selectee.$element.removeClass('ui-selecting').addClass('ui-selected');
-                       selectee.selecting = false;
-                       selectee.selected = true;
-                       selectee.startselected = true;
-                       self._trigger("selected", event, {
-                               selected: selectee.element
-                       });
-               });
-               this._trigger("stop", event);
-
-               this.helper.remove();
-
-               return false;
-       }
-
-});
-
-$.extend($.ui.selectable, {
-       version: "1.8.24"
-});
-
-})(jQuery);
diff --git a/resources/jquery.ui/jquery.ui.slider.js b/resources/jquery.ui/jquery.ui.slider.js
deleted file mode 100644 (file)
index c554e78..0000000
+++ /dev/null
@@ -1,662 +0,0 @@
-/*!
- * jQuery UI Slider 1.8.24
- *
- * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
- * Dual licensed under the MIT or GPL Version 2 licenses.
- * http://jquery.org/license
- *
- * http://docs.jquery.com/UI/Slider
- *
- * Depends:
- *     jquery.ui.core.js
- *     jquery.ui.mouse.js
- *     jquery.ui.widget.js
- */
-(function( $, undefined ) {
-
-// number of pages in a slider
-// (how many times can you page up/down to go through the whole range)
-var numPages = 5;
-
-$.widget( "ui.slider", $.ui.mouse, {
-
-       widgetEventPrefix: "slide",
-
-       options: {
-               animate: false,
-               distance: 0,
-               max: 100,
-               min: 0,
-               orientation: "horizontal",
-               range: false,
-               step: 1,
-               value: 0,
-               values: null
-       },
-
-       _create: function() {
-               var self = this,
-                       o = this.options,
-                       existingHandles = this.element.find( ".ui-slider-handle" ).addClass( "ui-state-default ui-corner-all" ),
-                       handle = "<a class='ui-slider-handle ui-state-default ui-corner-all' href='#'></a>",
-                       handleCount = ( o.values && o.values.length ) || 1,
-                       handles = [];
-
-               this._keySliding = false;
-               this._mouseSliding = false;
-               this._animateOff = true;
-               this._handleIndex = null;
-               this._detectOrientation();
-               this._mouseInit();
-
-               this.element
-                       .addClass( "ui-slider" +
-                               " ui-slider-" + this.orientation +
-                               " ui-widget" +
-                               " ui-widget-content" +
-                               " ui-corner-all" +
-                               ( o.disabled ? " ui-slider-disabled ui-disabled" : "" ) );
-
-               this.range = $([]);
-
-               if ( o.range ) {
-                       if ( o.range === true ) {
-                               if ( !o.values ) {
-                                       o.values = [ this._valueMin(), this._valueMin() ];
-                               }
-                               if ( o.values.length && o.values.length !== 2 ) {
-                                       o.values = [ o.values[0], o.values[0] ];
-                               }
-                       }
-
-                       this.range = $( "<div></div>" )
-                               .appendTo( this.element )
-                               .addClass( "ui-slider-range" +
-                               // note: this isn't the most fittingly semantic framework class for this element,
-                               // but worked best visually with a variety of themes
-                               " ui-widget-header" + 
-                               ( ( o.range === "min" || o.range === "max" ) ? " ui-slider-range-" + o.range : "" ) );
-               }
-
-               for ( var i = existingHandles.length; i < handleCount; i += 1 ) {
-                       handles.push( handle );
-               }
-
-               this.handles = existingHandles.add( $( handles.join( "" ) ).appendTo( self.element ) );
-
-               this.handle = this.handles.eq( 0 );
-
-               this.handles.add( this.range ).filter( "a" )
-                       .click(function( event ) {
-                               event.preventDefault();
-                       })
-                       .hover(function() {
-                               if ( !o.disabled ) {
-                                       $( this ).addClass( "ui-state-hover" );
-                               }
-                       }, function() {
-                               $( this ).removeClass( "ui-state-hover" );
-                       })
-                       .focus(function() {
-                               if ( !o.disabled ) {
-                                       $( ".ui-slider .ui-state-focus" ).removeClass( "ui-state-focus" );
-                                       $( this ).addClass( "ui-state-focus" );
-                               } else {
-                                       $( this ).blur();
-                               }
-                       })
-                       .blur(function() {
-                               $( this ).removeClass( "ui-state-focus" );
-                       });
-
-               this.handles.each(function( i ) {
-                       $( this ).data( "index.ui-slider-handle", i );
-               });
-
-               this.handles
-                       .keydown(function( event ) {
-                               var index = $( this ).data( "index.ui-slider-handle" ),
-                                       allowed,
-                                       curVal,
-                                       newVal,
-                                       step;
-       
-                               if ( self.options.disabled ) {
-                                       return;
-                               }
-       
-                               switch ( event.keyCode ) {
-                                       case $.ui.keyCode.HOME:
-                                       case $.ui.keyCode.END:
-                                       case $.ui.keyCode.PAGE_UP:
-                                       case $.ui.keyCode.PAGE_DOWN:
-                                       case $.ui.keyCode.UP:
-                                       case $.ui.keyCode.RIGHT:
-                                       case $.ui.keyCode.DOWN:
-                                       case $.ui.keyCode.LEFT:
-                                               event.preventDefault();
-                                               if ( !self._keySliding ) {
-                                                       self._keySliding = true;
-                                                       $( this ).addClass( "ui-state-active" );
-                                                       allowed = self._start( event, index );
-                                                       if ( allowed === false ) {
-                                                               return;
-                                                       }
-                                               }
-                                               break;
-                               }
-       
-                               step = self.options.step;
-                               if ( self.options.values && self.options.values.length ) {
-                                       curVal = newVal = self.values( index );
-                               } else {
-                                       curVal = newVal = self.value();
-                               }
-       
-                               switch ( event.keyCode ) {
-                                       case $.ui.keyCode.HOME:
-                                               newVal = self._valueMin();
-                                               break;
-                                       case $.ui.keyCode.END:
-                                               newVal = self._valueMax();
-                                               break;
-                                       case $.ui.keyCode.PAGE_UP:
-                                               newVal = self._trimAlignValue( curVal + ( (self._valueMax() - self._valueMin()) / numPages ) );
-                                               break;
-                                       case $.ui.keyCode.PAGE_DOWN:
-                                               newVal = self._trimAlignValue( curVal - ( (self._valueMax() - self._valueMin()) / numPages ) );
-                                               break;
-                                       case $.ui.keyCode.UP:
-                                       case $.ui.keyCode.RIGHT:
-                                               if ( curVal === self._valueMax() ) {
-                                                       return;
-                                               }
-                                               newVal = self._trimAlignValue( curVal + step );
-                                               break;
-                                       case $.ui.keyCode.DOWN:
-                                       case $.ui.keyCode.LEFT:
-                                               if ( curVal === self._valueMin() ) {
-                                                       return;
-                                               }
-                                               newVal = self._trimAlignValue( curVal - step );
-                                               break;
-                               }
-       
-                               self._slide( event, index, newVal );
-                       })
-                       .keyup(function( event ) {
-                               var index = $( this ).data( "index.ui-slider-handle" );
-       
-                               if ( self._keySliding ) {
-                                       self._keySliding = false;
-                                       self._stop( event, index );
-                                       self._change( event, index );
-                                       $( this ).removeClass( "ui-state-active" );
-                               }
-       
-                       });
-
-               this._refreshValue();
-
-               this._animateOff = false;
-       },
-
-       destroy: function() {
-               this.handles.remove();
-               this.range.remove();
-
-               this.element
-                       .removeClass( "ui-slider" +
-                               " ui-slider-horizontal" +
-                               " ui-slider-vertical" +
-                               " ui-slider-disabled" +
-                               " ui-widget" +
-                               " ui-widget-content" +
-                               " ui-corner-all" )
-                       .removeData( "slider" )
-                       .unbind( ".slider" );
-
-               this._mouseDestroy();
-
-               return this;
-       },
-
-       _mouseCapture: function( event ) {
-               var o = this.options,
-                       position,
-                       normValue,
-                       distance,
-                       closestHandle,
-                       self,
-                       index,
-                       allowed,
-                       offset,
-                       mouseOverHandle;
-
-               if ( o.disabled ) {
-                       return false;
-               }
-
-               this.elementSize = {
-                       width: this.element.outerWidth(),
-                       height: this.element.outerHeight()
-               };
-               this.elementOffset = this.element.offset();
-
-               position = { x: event.pageX, y: event.pageY };
-               normValue = this._normValueFromMouse( position );
-               distance = this._valueMax() - this._valueMin() + 1;
-               self = this;
-               this.handles.each(function( i ) {
-                       var thisDistance = Math.abs( normValue - self.values(i) );
-                       if ( distance > thisDistance ) {
-                               distance = thisDistance;
-                               closestHandle = $( this );
-                               index = i;
-                       }
-               });
-
-               // workaround for bug #3736 (if both handles of a range are at 0,
-               // the first is always used as the one with least distance,
-               // and moving it is obviously prevented by preventing negative ranges)
-               if( o.range === true && this.values(1) === o.min ) {
-                       index += 1;
-                       closestHandle = $( this.handles[index] );
-               }
-
-               allowed = this._start( event, index );
-               if ( allowed === false ) {
-                       return false;
-               }
-               this._mouseSliding = true;
-
-               self._handleIndex = index;
-
-               closestHandle
-                       .addClass( "ui-state-active" )
-                       .focus();
-               
-               offset = closestHandle.offset();
-               mouseOverHandle = !$( event.target ).parents().andSelf().is( ".ui-slider-handle" );
-               this._clickOffset = mouseOverHandle ? { left: 0, top: 0 } : {
-                       left: event.pageX - offset.left - ( closestHandle.width() / 2 ),
-                       top: event.pageY - offset.top -
-                               ( closestHandle.height() / 2 ) -
-                               ( parseInt( closestHandle.css("borderTopWidth"), 10 ) || 0 ) -
-                               ( parseInt( closestHandle.css("borderBottomWidth"), 10 ) || 0) +
-                               ( parseInt( closestHandle.css("marginTop"), 10 ) || 0)
-               };
-
-               if ( !this.handles.hasClass( "ui-state-hover" ) ) {
-                       this._slide( event, index, normValue );
-               }
-               this._animateOff = true;
-               return true;
-       },
-
-       _mouseStart: function( event ) {
-               return true;
-       },
-
-       _mouseDrag: function( event ) {
-               var position = { x: event.pageX, y: event.pageY },
-                       normValue = this._normValueFromMouse( position );
-               
-               this._slide( event, this._handleIndex, normValue );
-
-               return false;
-       },
-
-       _mouseStop: function( event ) {
-               this.handles.removeClass( "ui-state-active" );
-               this._mouseSliding = false;
-
-               this._stop( event, this._handleIndex );
-               this._change( event, this._handleIndex );
-
-               this._handleIndex = null;
-               this._clickOffset = null;
-               this._animateOff = false;
-
-               return false;
-       },
-       
-       _detectOrientation: function() {
-               this.orientation = ( this.options.orientation === "vertical" ) ? "vertical" : "horizontal";
-       },
-
-       _normValueFromMouse: function( position ) {
-               var pixelTotal,
-                       pixelMouse,
-                       percentMouse,
-                       valueTotal,
-                       valueMouse;
-
-               if ( this.orientation === "horizontal" ) {
-                       pixelTotal = this.elementSize.width;
-                       pixelMouse = position.x - this.elementOffset.left - ( this._clickOffset ? this._clickOffset.left : 0 );
-               } else {
-                       pixelTotal = this.elementSize.height;
-                       pixelMouse = position.y - this.elementOffset.top - ( this._clickOffset ? this._clickOffset.top : 0 );
-               }
-
-               percentMouse = ( pixelMouse / pixelTotal );
-               if ( percentMouse > 1 ) {
-                       percentMouse = 1;
-               }
-               if ( percentMouse < 0 ) {
-                       percentMouse = 0;
-               }
-               if ( this.orientation === "vertical" ) {
-                       percentMouse = 1 - percentMouse;
-               }
-
-               valueTotal = this._valueMax() - this._valueMin();
-               valueMouse = this._valueMin() + percentMouse * valueTotal;
-
-               return this._trimAlignValue( valueMouse );
-       },
-
-       _start: function( event, index ) {
-               var uiHash = {
-                       handle: this.handles[ index ],
-                       value: this.value()
-               };
-               if ( this.options.values && this.options.values.length ) {
-                       uiHash.value = this.values( index );
-                       uiHash.values = this.values();
-               }
-               return this._trigger( "start", event, uiHash );
-       },
-
-       _slide: function( event, index, newVal ) {
-               var otherVal,
-                       newValues,
-                       allowed;
-
-               if ( this.options.values && this.options.values.length ) {
-                       otherVal = this.values( index ? 0 : 1 );
-
-                       if ( ( this.options.values.length === 2 && this.options.range === true ) && 
-                                       ( ( index === 0 && newVal > otherVal) || ( index === 1 && newVal < otherVal ) )
-                               ) {
-                               newVal = otherVal;
-                       }
-
-                       if ( newVal !== this.values( index ) ) {
-                               newValues = this.values();
-                               newValues[ index ] = newVal;
-                               // A slide can be canceled by returning false from the slide callback
-                               allowed = this._trigger( "slide", event, {
-                                       handle: this.handles[ index ],
-                                       value: newVal,
-                                       values: newValues
-                               } );
-                               otherVal = this.values( index ? 0 : 1 );
-                               if ( allowed !== false ) {
-                                       this.values( index, newVal, true );
-                               }
-                       }
-               } else {
-                       if ( newVal !== this.value() ) {
-                               // A slide can be canceled by returning false from the slide callback
-                               allowed = this._trigger( "slide", event, {
-                                       handle: this.handles[ index ],
-                                       value: newVal
-                               } );
-                               if ( allowed !== false ) {
-                                       this.value( newVal );
-                               }
-                       }
-               }
-       },
-
-       _stop: function( event, index ) {
-               var uiHash = {
-                       handle: this.handles[ index ],
-                       value: this.value()
-               };
-               if ( this.options.values && this.options.values.length ) {
-                       uiHash.value = this.values( index );
-                       uiHash.values = this.values();
-               }
-
-               this._trigger( "stop", event, uiHash );
-       },
-
-       _change: function( event, index ) {
-               if ( !this._keySliding && !this._mouseSliding ) {
-                       var uiHash = {
-                               handle: this.handles[ index ],
-                               value: this.value()
-                       };
-                       if ( this.options.values && this.options.values.length ) {
-                               uiHash.value = this.values( index );
-                               uiHash.values = this.values();
-                       }
-
-                       this._trigger( "change", event, uiHash );
-               }
-       },
-
-       value: function( newValue ) {
-               if ( arguments.length ) {
-                       this.options.value = this._trimAlignValue( newValue );
-                       this._refreshValue();
-                       this._change( null, 0 );
-                       return;
-               }
-
-               return this._value();
-       },
-
-       values: function( index, newValue ) {
-               var vals,
-                       newValues,
-                       i;
-
-               if ( arguments.length > 1 ) {
-                       this.options.values[ index ] = this._trimAlignValue( newValue );
-                       this._refreshValue();
-                       this._change( null, index );
-                       return;
-               }
-
-               if ( arguments.length ) {
-                       if ( $.isArray( arguments[ 0 ] ) ) {
-                               vals = this.options.values;
-                               newValues = arguments[ 0 ];
-                               for ( i = 0; i < vals.length; i += 1 ) {
-                                       vals[ i ] = this._trimAlignValue( newValues[ i ] );
-                                       this._change( null, i );
-                               }
-                               this._refreshValue();
-                       } else {
-                               if ( this.options.values && this.options.values.length ) {
-                                       return this._values( index );
-                               } else {
-                                       return this.value();
-                               }
-                       }
-               } else {
-                       return this._values();
-               }
-       },
-
-       _setOption: function( key, value ) {
-               var i,
-                       valsLength = 0;
-
-               if ( $.isArray( this.options.values ) ) {
-                       valsLength = this.options.values.length;
-               }
-
-               $.Widget.prototype._setOption.apply( this, arguments );
-
-               switch ( key ) {
-                       case "disabled":
-                               if ( value ) {
-                                       this.handles.filter( ".ui-state-focus" ).blur();
-                                       this.handles.removeClass( "ui-state-hover" );
-                                       this.handles.propAttr( "disabled", true );
-                                       this.element.addClass( "ui-disabled" );
-                               } else {
-                                       this.handles.propAttr( "disabled", false );
-                                       this.element.removeClass( "ui-disabled" );
-                               }
-                               break;
-                       case "orientation":
-                               this._detectOrientation();
-                               this.element
-                                       .removeClass( "ui-slider-horizontal ui-slider-vertical" )
-                                       .addClass( "ui-slider-" + this.orientation );
-                               this._refreshValue();
-                               break;
-                       case "value":
-                               this._animateOff = true;
-                               this._refreshValue();
-                               this._change( null, 0 );
-                               this._animateOff = false;
-                               break;
-                       case "values":
-                               this._animateOff = true;
-                               this._refreshValue();
-                               for ( i = 0; i < valsLength; i += 1 ) {
-                                       this._change( null, i );
-                               }
-                               this._animateOff = false;
-                               break;
-               }
-       },
-
-       //internal value getter
-       // _value() returns value trimmed by min and max, aligned by step
-       _value: function() {
-               var val = this.options.value;
-               val = this._trimAlignValue( val );
-
-               return val;
-       },
-
-       //internal values getter
-       // _values() returns array of values trimmed by min and max, aligned by step
-       // _values( index ) returns single value trimmed by min and max, aligned by step
-       _values: function( index ) {
-               var val,
-                       vals,
-                       i;
-
-               if ( arguments.length ) {
-                       val = this.options.values[ index ];
-                       val = this._trimAlignValue( val );
-
-                       return val;
-               } else {
-                       // .slice() creates a copy of the array
-                       // this copy gets trimmed by min and max and then returned
-                       vals = this.options.values.slice();
-                       for ( i = 0; i < vals.length; i+= 1) {
-                               vals[ i ] = this._trimAlignValue( vals[ i ] );
-                       }
-
-                       return vals;
-               }
-       },
-       
-       // returns the step-aligned value that val is closest to, between (inclusive) min and max
-       _trimAlignValue: function( val ) {
-               if ( val <= this._valueMin() ) {
-                       return this._valueMin();
-               }
-               if ( val >= this._valueMax() ) {
-                       return this._valueMax();
-               }
-               var step = ( this.options.step > 0 ) ? this.options.step : 1,
-                       valModStep = (val - this._valueMin()) % step,
-                       alignValue = val - valModStep;
-
-               if ( Math.abs(valModStep) * 2 >= step ) {
-                       alignValue += ( valModStep > 0 ) ? step : ( -step );
-               }
-
-               // Since JavaScript has problems with large floats, round
-               // the final value to 5 digits after the decimal point (see #4124)
-               return parseFloat( alignValue.toFixed(5) );
-       },
-
-       _valueMin: function() {
-               return this.options.min;
-       },
-
-       _valueMax: function() {
-               return this.options.max;
-       },
-       
-       _refreshValue: function() {
-               var oRange = this.options.range,
-                       o = this.options,
-                       self = this,
-                       animate = ( !this._animateOff ) ? o.animate : false,
-                       valPercent,
-                       _set = {},
-                       lastValPercent,
-                       value,
-                       valueMin,
-                       valueMax;
-
-               if ( this.options.values && this.options.values.length ) {
-                       this.handles.each(function( i, j ) {
-                               valPercent = ( self.values(i) - self._valueMin() ) / ( self._valueMax() - self._valueMin() ) * 100;
-                               _set[ self.orientation === "horizontal" ? "left" : "bottom" ] = valPercent + "%";
-                               $( this ).stop( 1, 1 )[ animate ? "animate" : "css" ]( _set, o.animate );
-                               if ( self.options.range === true ) {
-                                       if ( self.orientation === "horizontal" ) {
-                                               if ( i === 0 ) {
-                                                       self.range.stop( 1, 1 )[ animate ? "animate" : "css" ]( { left: valPercent + "%" }, o.animate );
-                                               }
-                                               if ( i === 1 ) {
-                                                       self.range[ animate ? "animate" : "css" ]( { width: ( valPercent - lastValPercent ) + "%" }, { queue: false, duration: o.animate } );
-                                               }
-                                       } else {
-                                               if ( i === 0 ) {
-                                                       self.range.stop( 1, 1 )[ animate ? "animate" : "css" ]( { bottom: ( valPercent ) + "%" }, o.animate );
-                                               }
-                                               if ( i === 1 ) {
-                                                       self.range[ animate ? "animate" : "css" ]( { height: ( valPercent - lastValPercent ) + "%" }, { queue: false, duration: o.animate } );
-                                               }
-                                       }
-                               }
-                               lastValPercent = valPercent;
-                       });
-               } else {
-                       value = this.value();
-                       valueMin = this._valueMin();
-                       valueMax = this._valueMax();
-                       valPercent = ( valueMax !== valueMin ) ?
-                                       ( value - valueMin ) / ( valueMax - valueMin ) * 100 :
-                                       0;
-                       _set[ self.orientation === "horizontal" ? "left" : "bottom" ] = valPercent + "%";
-                       this.handle.stop( 1, 1 )[ animate ? "animate" : "css" ]( _set, o.animate );
-
-                       if ( oRange === "min" && this.orientation === "horizontal" ) {
-                               this.range.stop( 1, 1 )[ animate ? "animate" : "css" ]( { width: valPercent + "%" }, o.animate );
-                       }
-                       if ( oRange === "max" && this.orientation === "horizontal" ) {
-                               this.range[ animate ? "animate" : "css" ]( { width: ( 100 - valPercent ) + "%" }, { queue: false, duration: o.animate } );
-                       }
-                       if ( oRange === "min" && this.orientation === "vertical" ) {
-                               this.range.stop( 1, 1 )[ animate ? "animate" : "css" ]( { height: valPercent + "%" }, o.animate );
-                       }
-                       if ( oRange === "max" && this.orientation === "vertical" ) {
-                               this.range[ animate ? "animate" : "css" ]( { height: ( 100 - valPercent ) + "%" }, { queue: false, duration: o.animate } );
-                       }
-               }
-       }
-
-});
-
-$.extend( $.ui.slider, {
-       version: "1.8.24"
-});
-
-}(jQuery));
diff --git a/resources/jquery.ui/jquery.ui.sortable.js b/resources/jquery.ui/jquery.ui.sortable.js
deleted file mode 100644 (file)
index 9e0cac6..0000000
+++ /dev/null
@@ -1,1094 +0,0 @@
-/*!
- * jQuery UI Sortable 1.8.24
- *
- * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
- * Dual licensed under the MIT or GPL Version 2 licenses.
- * http://jquery.org/license
- *
- * http://docs.jquery.com/UI/Sortables
- *
- * Depends:
- *     jquery.ui.core.js
- *     jquery.ui.mouse.js
- *     jquery.ui.widget.js
- */
-(function( $, undefined ) {
-
-$.widget("ui.sortable", $.ui.mouse, {
-       widgetEventPrefix: "sort",
-       ready: false,
-       options: {
-               appendTo: "parent",
-               axis: false,
-               connectWith: false,
-               containment: false,
-               cursor: 'auto',
-               cursorAt: false,
-               dropOnEmpty: true,
-               forcePlaceholderSize: false,
-               forceHelperSize: false,
-               grid: false,
-               handle: false,
-               helper: "original",
-               items: '> *',
-               opacity: false,
-               placeholder: false,
-               revert: false,
-               scroll: true,
-               scrollSensitivity: 20,
-               scrollSpeed: 20,
-               scope: "default",
-               tolerance: "intersect",
-               zIndex: 1000
-       },
-       _create: function() {
-
-               var o = this.options;
-               this.containerCache = {};
-               this.element.addClass("ui-sortable");
-
-               //Get the items
-               this.refresh();
-
-               //Let's determine if the items are being displayed horizontally
-               this.floating = this.items.length ? o.axis === 'x' || (/left|right/).test(this.items[0].item.css('float')) || (/inline|table-cell/).test(this.items[0].item.css('display')) : false;
-
-               //Let's determine the parent's offset
-               this.offset = this.element.offset();
-
-               //Initialize mouse events for interaction
-               this._mouseInit();
-               
-               //We're ready to go
-               this.ready = true
-
-       },
-
-       destroy: function() {
-               $.Widget.prototype.destroy.call( this );
-               this.element
-                       .removeClass("ui-sortable ui-sortable-disabled");
-               this._mouseDestroy();
-
-               for ( var i = this.items.length - 1; i >= 0; i-- )
-                       this.items[i].item.removeData(this.widgetName + "-item");
-
-               return this;
-       },
-
-       _setOption: function(key, value){
-               if ( key === "disabled" ) {
-                       this.options[ key ] = value;
-       
-                       this.widget()
-                               [ value ? "addClass" : "removeClass"]( "ui-sortable-disabled" );
-               } else {
-                       // Don't call widget base _setOption for disable as it adds ui-state-disabled class
-                       $.Widget.prototype._setOption.apply(this, arguments);
-               }
-       },
-
-       _mouseCapture: function(event, overrideHandle) {
-               var that = this;
-
-               if (this.reverting) {
-                       return false;
-               }
-
-               if(this.options.disabled || this.options.type == 'static') return false;
-
-               //We have to refresh the items data once first
-               this._refreshItems(event);
-
-               //Find out if the clicked node (or one of its parents) is a actual item in this.items
-               var currentItem = null, self = this, nodes = $(event.target).parents().each(function() {
-                       if($.data(this, that.widgetName + '-item') == self) {
-                               currentItem = $(this);
-                               return false;
-                       }
-               });
-               if($.data(event.target, that.widgetName + '-item') == self) currentItem = $(event.target);
-
-               if(!currentItem) return false;
-               if(this.options.handle && !overrideHandle) {
-                       var validHandle = false;
-
-                       $(this.options.handle, currentItem).find("*").andSelf().each(function() { if(this == event.target) validHandle = true; });
-                       if(!validHandle) return false;
-               }
-
-               this.currentItem = currentItem;
-               this._removeCurrentsFromItems();
-               return true;
-
-       },
-
-       _mouseStart: function(event, overrideHandle, noActivation) {
-
-               var o = this.options, self = this;
-               this.currentContainer = this;
-
-               //We only need to call refreshPositions, because the refreshItems call has been moved to mouseCapture
-               this.refreshPositions();
-
-               //Create and append the visible helper
-               this.helper = this._createHelper(event);
-
-               //Cache the helper size
-               this._cacheHelperProportions();
-
-               /*
-                * - Position generation -
-                * This block generates everything position related - it's the core of draggables.
-                */
-
-               //Cache the margins of the original element
-               this._cacheMargins();
-
-               //Get the next scrolling parent
-               this.scrollParent = this.helper.scrollParent();
-
-               //The element's absolute position on the page minus margins
-               this.offset = this.currentItem.offset();
-               this.offset = {
-                       top: this.offset.top - this.margins.top,
-                       left: this.offset.left - this.margins.left
-               };
-
-               $.extend(this.offset, {
-                       click: { //Where the click happened, relative to the element
-                               left: event.pageX - this.offset.left,
-                               top: event.pageY - this.offset.top
-                       },
-                       parent: this._getParentOffset(),
-                       relative: this._getRelativeOffset() //This is a relative to absolute position minus the actual position calculation - only used for relative positioned helper
-               });
-
-               // Only after we got the offset, we can change the helper's position to absolute
-               // TODO: Still need to figure out a way to make relative sorting possible
-               this.helper.css("position", "absolute");
-               this.cssPosition = this.helper.css("position");
-               
-               //Generate the original position
-               this.originalPosition = this._generatePosition(event);
-               this.originalPageX = event.pageX;
-               this.originalPageY = event.pageY;
-
-               //Adjust the mouse offset relative to the helper if 'cursorAt' is supplied
-               (o.cursorAt && this._adjustOffsetFromHelper(o.cursorAt));
-
-               //Cache the former DOM position
-               this.domPosition = { prev: this.currentItem.prev()[0], parent: this.currentItem.parent()[0] };
-
-               //If the helper is not the original, hide the original so it's not playing any role during the drag, won't cause anything bad this way
-               if(this.helper[0] != this.currentItem[0]) {
-                       this.currentItem.hide();
-               }
-
-               //Create the placeholder
-               this._createPlaceholder();
-
-               //Set a containment if given in the options
-               if(o.containment)
-                       this._setContainment();
-
-               if(o.cursor) { // cursor option
-                       if ($('body').css("cursor")) this._storedCursor = $('body').css("cursor");
-                       $('body').css("cursor", o.cursor);
-               }
-
-               if(o.opacity) { // opacity option
-                       if (this.helper.css("opacity")) this._storedOpacity = this.helper.css("opacity");
-                       this.helper.css("opacity", o.opacity);
-               }
-
-               if(o.zIndex) { // zIndex option
-                       if (this.helper.css("zIndex")) this._storedZIndex = this.helper.css("zIndex");
-                       this.helper.css("zIndex", o.zIndex);
-               }
-
-               //Prepare scrolling
-               if(this.scrollParent[0] != document && this.scrollParent[0].tagName != 'HTML')
-                       this.overflowOffset = this.scrollParent.offset();
-
-               //Call callbacks
-               this._trigger("start", event, this._uiHash());
-
-               //Recache the helper size
-               if(!this._preserveHelperProportions)
-                       this._cacheHelperProportions();
-
-
-               //Post 'activate' events to possible containers
-               if(!noActivation) {
-                        for (var i = this.containers.length - 1; i >= 0; i--) { this.containers[i]._trigger("activate", event, self._uiHash(this)); }
-               }
-
-               //Prepare possible droppables
-               if($.ui.ddmanager)
-                       $.ui.ddmanager.current = this;
-
-               if ($.ui.ddmanager && !o.dropBehaviour)
-                       $.ui.ddmanager.prepareOffsets(this, event);
-
-               this.dragging = true;
-
-               this.helper.addClass("ui-sortable-helper");
-               this._mouseDrag(event); //Execute the drag once - this causes the helper not to be visible before getting its correct position
-               return true;
-
-       },
-
-       _mouseDrag: function(event) {
-
-               //Compute the helpers position
-               this.position = this._generatePosition(event);
-               this.positionAbs = this._convertPositionTo("absolute");
-
-               if (!this.lastPositionAbs) {
-                       this.lastPositionAbs = this.positionAbs;
-               }
-
-               //Do scrolling
-               if(this.options.scroll) {
-                       var o = this.options, scrolled = false;
-                       if(this.scrollParent[0] != document && this.scrollParent[0].tagName != 'HTML') {
-
-                               if((this.overflowOffset.top + this.scrollParent[0].offsetHeight) - event.pageY < o.scrollSensitivity)
-                                       this.scrollParent[0].scrollTop = scrolled = this.scrollParent[0].scrollTop + o.scrollSpeed;
-                               else if(event.pageY - this.overflowOffset.top < o.scrollSensitivity)
-                                       this.scrollParent[0].scrollTop = scrolled = this.scrollParent[0].scrollTop - o.scrollSpeed;
-
-                               if((this.overflowOffset.left + this.scrollParent[0].offsetWidth) - event.pageX < o.scrollSensitivity)
-                                       this.scrollParent[0].scrollLeft = scrolled = this.scrollParent[0].scrollLeft + o.scrollSpeed;
-                               else if(event.pageX - this.overflowOffset.left < o.scrollSensitivity)
-                                       this.scrollParent[0].scrollLeft = scrolled = this.scrollParent[0].scrollLeft - o.scrollSpeed;
-
-                       } else {
-
-                               if(event.pageY - $(document).scrollTop() < o.scrollSensitivity)
-                                       scrolled = $(document).scrollTop($(document).scrollTop() - o.scrollSpeed);
-                               else if($(window).height() - (event.pageY - $(document).scrollTop()) < o.scrollSensitivity)
-                                       scrolled = $(document).scrollTop($(document).scrollTop() + o.scrollSpeed);
-
-                               if(event.pageX - $(document).scrollLeft() < o.scrollSensitivity)
-                                       scrolled = $(document).scrollLeft($(document).scrollLeft() - o.scrollSpeed);
-                               else if($(window).width() - (event.pageX - $(document).scrollLeft()) < o.scrollSensitivity)
-                                       scrolled = $(document).scrollLeft($(document).scrollLeft() + o.scrollSpeed);
-
-                       }
-
-                       if(scrolled !== false && $.ui.ddmanager && !o.dropBehaviour)
-                               $.ui.ddmanager.prepareOffsets(this, event);
-               }
-
-               //Regenerate the absolute position used for position checks
-               this.positionAbs = this._convertPositionTo("absolute");
-
-               //Set the helper position
-               if(!this.options.axis || this.options.axis != "y") this.helper[0].style.left = this.position.left+'px';
-               if(!this.options.axis || this.options.axis != "x") this.helper[0].style.top = this.position.top+'px';
-
-               //Rearrange
-               for (var i = this.items.length - 1; i >= 0; i--) {
-
-                       //Cache variables and intersection, continue if no intersection
-                       var item = this.items[i], itemElement = item.item[0], intersection = this._intersectsWithPointer(item);
-                       if (!intersection) continue;
-
-                       // Only put the placeholder inside the current Container, skip all
-                       // items form other containers. This works because when moving
-                       // an item from one container to another the
-                       // currentContainer is switched before the placeholder is moved.
-                       //
-                       // Without this moving items in "sub-sortables" can cause the placeholder to jitter
-                       // beetween the outer and inner container.
-                       if (item.instance !== this.currentContainer) continue;
-
-                       if (itemElement != this.currentItem[0] //cannot intersect with itself
-                               &&      this.placeholder[intersection == 1 ? "next" : "prev"]()[0] != itemElement //no useless actions that have been done before
-                               &&      !$.ui.contains(this.placeholder[0], itemElement) //no action if the item moved is the parent of the item checked
-                               && (this.options.type == 'semi-dynamic' ? !$.ui.contains(this.element[0], itemElement) : true)
-                               //&& itemElement.parentNode == this.placeholder[0].parentNode // only rearrange items within the same container
-                       ) {
-
-                               this.direction = intersection == 1 ? "down" : "up";
-
-                               if (this.options.tolerance == "pointer" || this._intersectsWithSides(item)) {
-                                       this._rearrange(event, item);
-                               } else {
-                                       break;
-                               }
-
-                               this._trigger("change", event, this._uiHash());
-                               break;
-                       }
-               }
-
-               //Post events to containers
-               this._contactContainers(event);
-
-               //Interconnect with droppables
-               if($.ui.ddmanager) $.ui.ddmanager.drag(this, event);
-
-               //Call callbacks
-               this._trigger('sort', event, this._uiHash());
-
-               this.lastPositionAbs = this.positionAbs;
-               return false;
-
-       },
-
-       _mouseStop: function(event, noPropagation) {
-
-               if(!event) return;
-
-               //If we are using droppables, inform the manager about the drop
-               if ($.ui.ddmanager && !this.options.dropBehaviour)
-                       $.ui.ddmanager.drop(this, event);
-
-               if(this.options.revert) {
-                       var self = this;
-                       var cur = self.placeholder.offset();
-
-                       self.reverting = true;
-
-                       $(this.helper).animate({
-                               left: cur.left - this.offset.parent.left - self.margins.left + (this.offsetParent[0] == document.body ? 0 : this.offsetParent[0].scrollLeft),
-                               top: cur.top - this.offset.parent.top - self.margins.top + (this.offsetParent[0] == document.body ? 0 : this.offsetParent[0].scrollTop)
-                       }, parseInt(this.options.revert, 10) || 500, function() {
-                               self._clear(event);
-                       });
-               } else {
-                       this._clear(event, noPropagation);
-               }
-
-               return false;
-
-       },
-
-       cancel: function() {
-
-               var self = this;
-
-               if(this.dragging) {
-
-                       this._mouseUp({ target: null });
-
-                       if(this.options.helper == "original")
-                               this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper");
-                       else
-                               this.currentItem.show();
-
-                       //Post deactivating events to containers
-                       for (var i = this.containers.length - 1; i >= 0; i--){
-                               this.containers[i]._trigger("deactivate", null, self._uiHash(this));
-                               if(this.containers[i].containerCache.over) {
-                                       this.containers[i]._trigger("out", null, self._uiHash(this));
-                                       this.containers[i].containerCache.over = 0;
-                               }
-                       }
-
-               }
-
-               if (this.placeholder) {
-                       //$(this.placeholder[0]).remove(); would have been the jQuery way - unfortunately, it unbinds ALL events from the original node!
-                       if(this.placeholder[0].parentNode) this.placeholder[0].parentNode.removeChild(this.placeholder[0]);
-                       if(this.options.helper != "original" && this.helper && this.helper[0].parentNode) this.helper.remove();
-
-                       $.extend(this, {
-                               helper: null,
-                               dragging: false,
-                               reverting: false,
-                               _noFinalSort: null
-                       });
-
-                       if(this.domPosition.prev) {
-                               $(this.domPosition.prev).after(this.currentItem);
-                       } else {
-                               $(this.domPosition.parent).prepend(this.currentItem);
-                       }
-               }
-
-               return this;
-
-       },
-
-       serialize: function(o) {
-
-               var items = this._getItemsAsjQuery(o && o.connected);
-               var str = []; o = o || {};
-
-               $(items).each(function() {
-                       var res = ($(o.item || this).attr(o.attribute || 'id') || '').match(o.expression || (/(.+)[-=_](.+)/));
-                       if(res) str.push((o.key || res[1]+'[]')+'='+(o.key && o.expression ? res[1] : res[2]));
-               });
-
-               if(!str.length && o.key) {
-                       str.push(o.key + '=');
-               }
-
-               return str.join('&');
-
-       },
-
-       toArray: function(o) {
-
-               var items = this._getItemsAsjQuery(o && o.connected);
-               var ret = []; o = o || {};
-
-               items.each(function() { ret.push($(o.item || this).attr(o.attribute || 'id') || ''); });
-               return ret;
-
-       },
-
-       /* Be careful with the following core functions */
-       _intersectsWith: function(item) {
-
-               var x1 = this.positionAbs.left,
-                       x2 = x1 + this.helperProportions.width,
-                       y1 = this.positionAbs.top,
-                       y2 = y1 + this.helperProportions.height;
-
-               var l = item.left,
-                       r = l + item.width,
-                       t = item.top,
-                       b = t + item.height;
-
-               var dyClick = this.offset.click.top,
-                       dxClick = this.offset.click.left;
-
-               var isOverElement = (y1 + dyClick) > t && (y1 + dyClick) < b && (x1 + dxClick) > l && (x1 + dxClick) < r;
-
-               if(        this.options.tolerance == "pointer"
-                       || this.options.forcePointerForContainers
-                       || (this.options.tolerance != "pointer" && this.helperProportions[this.floating ? 'width' : 'height'] > item[this.floating ? 'width' : 'height'])
-               ) {
-                       return isOverElement;
-               } else {
-
-                       return (l < x1 + (this.helperProportions.width / 2) // Right Half
-                               && x2 - (this.helperProportions.width / 2) < r // Left Half
-                               && t < y1 + (this.helperProportions.height / 2) // Bottom Half
-                               && y2 - (this.helperProportions.height / 2) < b ); // Top Half
-
-               }
-       },
-
-       _intersectsWithPointer: function(item) {
-
-               var isOverElementHeight = (this.options.axis === 'x') || $.ui.isOverAxis(this.positionAbs.top + this.offset.click.top, item.top, item.height),
-                       isOverElementWidth = (this.options.axis === 'y') || $.ui.isOverAxis(this.positionAbs.left + this.offset.click.left, item.left, item.width),
-                       isOverElement = isOverElementHeight && isOverElementWidth,
-                       verticalDirection = this._getDragVerticalDirection(),
-                       horizontalDirection = this._getDragHorizontalDirection();
-
-               if (!isOverElement)
-                       return false;
-
-               return this.floating ?
-                       ( ((horizontalDirection && horizontalDirection == "right") || verticalDirection == "down") ? 2 : 1 )
-                       : ( verticalDirection && (verticalDirection == "down" ? 2 : 1) );
-
-       },
-
-       _intersectsWithSides: function(item) {
-
-               var isOverBottomHalf = $.ui.isOverAxis(this.positionAbs.top + this.offset.click.top, item.top + (item.height/2), item.height),
-                       isOverRightHalf = $.ui.isOverAxis(this.positionAbs.left + this.offset.click.left, item.left + (item.width/2), item.width),
-                       verticalDirection = this._getDragVerticalDirection(),
-                       horizontalDirection = this._getDragHorizontalDirection();
-
-               if (this.floating && horizontalDirection) {
-                       return ((horizontalDirection == "right" && isOverRightHalf) || (horizontalDirection == "left" && !isOverRightHalf));
-               } else {
-                       return verticalDirection && ((verticalDirection == "down" && isOverBottomHalf) || (verticalDirection == "up" && !isOverBottomHalf));
-               }
-
-       },
-
-       _getDragVerticalDirection: function() {
-               var delta = this.positionAbs.top - this.lastPositionAbs.top;
-               return delta != 0 && (delta > 0 ? "down" : "up");
-       },
-
-       _getDragHorizontalDirection: function() {
-               var delta = this.positionAbs.left - this.lastPositionAbs.left;
-               return delta != 0 && (delta > 0 ? "right" : "left");
-       },
-
-       refresh: function(event) {
-               this._refreshItems(event);
-               this.refreshPositions();
-               return this;
-       },
-
-       _connectWith: function() {
-               var options = this.options;
-               return options.connectWith.constructor == String
-                       ? [options.connectWith]
-                       : options.connectWith;
-       },
-       
-       _getItemsAsjQuery: function(connected) {
-
-               var self = this;
-               var items = [];
-               var queries = [];
-               var connectWith = this._connectWith();
-
-               if(connectWith && connected) {
-                       for (var i = connectWith.length - 1; i >= 0; i--){
-                               var cur = $(connectWith[i]);
-                               for (var j = cur.length - 1; j >= 0; j--){
-                                       var inst = $.data(cur[j], this.widgetName);
-                                       if(inst && inst != this && !inst.options.disabled) {
-                                               queries.push([$.isFunction(inst.options.items) ? inst.options.items.call(inst.element) : $(inst.options.items, inst.element).not(".ui-sortable-helper").not('.ui-sortable-placeholder'), inst]);
-                                       }
-                               };
-                       };
-               }
-
-               queries.push([$.isFunction(this.options.items) ? this.options.items.call(this.element, null, { options: this.options, item: this.currentItem }) : $(this.options.items, this.element).not(".ui-sortable-helper").not('.ui-sortable-placeholder'), this]);
-
-               for (var i = queries.length - 1; i >= 0; i--){
-                       queries[i][0].each(function() {
-                               items.push(this);
-                       });
-               };
-
-               return $(items);
-
-       },
-
-       _removeCurrentsFromItems: function() {
-
-               var list = this.currentItem.find(":data(" + this.widgetName + "-item)");
-
-               for (var i=0; i < this.items.length; i++) {
-
-                       for (var j=0; j < list.length; j++) {
-                               if(list[j] == this.items[i].item[0])
-                                       this.items.splice(i,1);
-                       };
-
-               };
-
-       },
-
-       _refreshItems: function(event) {
-
-               this.items = [];
-               this.containers = [this];
-               var items = this.items;
-               var self = this;
-               var queries = [[$.isFunction(this.options.items) ? this.options.items.call(this.element[0], event, { item: this.currentItem }) : $(this.options.items, this.element), this]];
-               var connectWith = this._connectWith();
-
-               if(connectWith && this.ready) { //Shouldn't be run the first time through due to massive slow-down
-                       for (var i = connectWith.length - 1; i >= 0; i--){
-                               var cur = $(connectWith[i]);
-                               for (var j = cur.length - 1; j >= 0; j--){
-                                       var inst = $.data(cur[j], this.widgetName);
-                                       if(inst && inst != this && !inst.options.disabled) {
-                                               queries.push([$.isFunction(inst.options.items) ? inst.options.items.call(inst.element[0], event, { item: this.currentItem }) : $(inst.options.items, inst.element), inst]);
-                                               this.containers.push(inst);
-                                       }
-                               };
-                       };
-               }
-
-               for (var i = queries.length - 1; i >= 0; i--) {
-                       var targetData = queries[i][1];
-                       var _queries = queries[i][0];
-
-                       for (var j=0, queriesLength = _queries.length; j < queriesLength; j++) {
-                               var item = $(_queries[j]);
-
-                               item.data(this.widgetName + '-item', targetData); // Data for target checking (mouse manager)
-
-                               items.push({
-                                       item: item,
-                                       instance: targetData,
-                                       width: 0, height: 0,
-                                       left: 0, top: 0
-                               });
-                       };
-               };
-
-       },
-
-       refreshPositions: function(fast) {
-
-               //This has to be redone because due to the item being moved out/into the offsetParent, the offsetParent's position will change
-               if(this.offsetParent && this.helper) {
-                       this.offset.parent = this._getParentOffset();
-               }
-
-               for (var i = this.items.length - 1; i >= 0; i--){
-                       var item = this.items[i];
-
-                       //We ignore calculating positions of all connected containers when we're not over them
-                       if(item.instance != this.currentContainer && this.currentContainer && item.item[0] != this.currentItem[0])
-                               continue;
-
-                       var t = this.options.toleranceElement ? $(this.options.toleranceElement, item.item) : item.item;
-
-                       if (!fast) {
-                               item.width = t.outerWidth();
-                               item.height = t.outerHeight();
-                       }
-
-                       var p = t.offset();
-                       item.left = p.left;
-                       item.top = p.top;
-               };
-
-               if(this.options.custom && this.options.custom.refreshContainers) {
-                       this.options.custom.refreshContainers.call(this);
-               } else {
-                       for (var i = this.containers.length - 1; i >= 0; i--){
-                               var p = this.containers[i].element.offset();
-                               this.containers[i].containerCache.left = p.left;
-                               this.containers[i].containerCache.top = p.top;
-                               this.containers[i].containerCache.width = this.containers[i].element.outerWidth();
-                               this.containers[i].containerCache.height = this.containers[i].element.outerHeight();
-                       };
-               }
-
-               return this;
-       },
-
-       _createPlaceholder: function(that) {
-
-               var self = that || this, o = self.options;
-
-               if(!o.placeholder || o.placeholder.constructor == String) {
-                       var className = o.placeholder;
-                       o.placeholder = {
-                               element: function() {
-
-                                       var el = $(document.createElement(self.currentItem[0].nodeName))
-                                               .addClass(className || self.currentItem[0].className+" ui-sortable-placeholder")
-                                               .removeClass("ui-sortable-helper")[0];
-
-                                       if(!className)
-                                               el.style.visibility = "hidden";
-
-                                       return el;
-                               },
-                               update: function(container, p) {
-
-                                       // 1. If a className is set as 'placeholder option, we don't force sizes - the class is responsible for that
-                                       // 2. The option 'forcePlaceholderSize can be enabled to force it even if a class name is specified
-                                       if(className && !o.forcePlaceholderSize) return;
-
-                                       //If the element doesn't have a actual height by itself (without styles coming from a stylesheet), it receives the inline height from the dragged item
-                                       if(!p.height()) { p.height(self.currentItem.innerHeight() - parseInt(self.currentItem.css('paddingTop')||0, 10) - parseInt(self.currentItem.css('paddingBottom')||0, 10)); };
-                                       if(!p.width()) { p.width(self.currentItem.innerWidth() - parseInt(self.currentItem.css('paddingLeft')||0, 10) - parseInt(self.currentItem.css('paddingRight')||0, 10)); };
-                               }
-                       };
-               }
-
-               //Create the placeholder
-               self.placeholder = $(o.placeholder.element.call(self.element, self.currentItem));
-
-               //Append it after the actual current item
-               self.currentItem.after(self.placeholder);
-
-               //Update the size of the placeholder (TODO: Logic to fuzzy, see line 316/317)
-               o.placeholder.update(self, self.placeholder);
-
-       },
-
-       _contactContainers: function(event) {
-               
-               // get innermost container that intersects with item 
-               var innermostContainer = null, innermostIndex = null;           
-               
-               
-               for (var i = this.containers.length - 1; i >= 0; i--){
-
-                       // never consider a container that's located within the item itself 
-                       if($.ui.contains(this.currentItem[0], this.containers[i].element[0]))
-                               continue;
-
-                       if(this._intersectsWith(this.containers[i].containerCache)) {
-
-                               // if we've already found a container and it's more "inner" than this, then continue 
-                               if(innermostContainer && $.ui.contains(this.containers[i].element[0], innermostContainer.element[0]))
-                                       continue;
-
-                               innermostContainer = this.containers[i]; 
-                               innermostIndex = i;
-                                       
-                       } else {
-                               // container doesn't intersect. trigger "out" event if necessary 
-                               if(this.containers[i].containerCache.over) {
-                                       this.containers[i]._trigger("out", event, this._uiHash(this));
-                                       this.containers[i].containerCache.over = 0;
-                               }
-                       }
-
-               }
-               
-               // if no intersecting containers found, return 
-               if(!innermostContainer) return; 
-
-               // move the item into the container if it's not there already
-               if(this.containers.length === 1) {
-                       this.containers[innermostIndex]._trigger("over", event, this._uiHash(this));
-                       this.containers[innermostIndex].containerCache.over = 1;
-               } else if(this.currentContainer != this.containers[innermostIndex]) {
-
-                       //When entering a new container, we will find the item with the least distance and append our item near it
-                       var dist = 10000; var itemWithLeastDistance = null; var base = this.positionAbs[this.containers[innermostIndex].floating ? 'left' : 'top'];
-                       for (var j = this.items.length - 1; j >= 0; j--) {
-                               if(!$.ui.contains(this.containers[innermostIndex].element[0], this.items[j].item[0])) continue;
-                               var cur = this.containers[innermostIndex].floating ? this.items[j].item.offset().left : this.items[j].item.offset().top;
-                               if(Math.abs(cur - base) < dist) {
-                                       dist = Math.abs(cur - base); itemWithLeastDistance = this.items[j];
-                                       this.direction = (cur - base > 0) ? 'down' : 'up';
-                               }
-                       }
-
-                       if(!itemWithLeastDistance && !this.options.dropOnEmpty) //Check if dropOnEmpty is enabled
-                               return;
-
-                       this.currentContainer = this.containers[innermostIndex];
-                       itemWithLeastDistance ? this._rearrange(event, itemWithLeastDistance, null, true) : this._rearrange(event, null, this.containers[innermostIndex].element, true);
-                       this._trigger("change", event, this._uiHash());
-                       this.containers[innermostIndex]._trigger("change", event, this._uiHash(this));
-
-                       //Update the placeholder
-                       this.options.placeholder.update(this.currentContainer, this.placeholder);
-
-                       this.containers[innermostIndex]._trigger("over", event, this._uiHash(this));
-                       this.containers[innermostIndex].containerCache.over = 1;
-               } 
-       
-               
-       },
-
-       _createHelper: function(event) {
-
-               var o = this.options;
-               var helper = $.isFunction(o.helper) ? $(o.helper.apply(this.element[0], [event, this.currentItem])) : (o.helper == 'clone' ? this.currentItem.clone() : this.currentItem);
-
-               if(!helper.parents('body').length) //Add the helper to the DOM if that didn't happen already
-                       $(o.appendTo != 'parent' ? o.appendTo : this.currentItem[0].parentNode)[0].appendChild(helper[0]);
-
-               if(helper[0] == this.currentItem[0])
-                       this._storedCSS = { width: this.currentItem[0].style.width, height: this.currentItem[0].style.height, position: this.currentItem.css("position"), top: this.currentItem.css("top"), left: this.currentItem.css("left") };
-
-               if(helper[0].style.width == '' || o.forceHelperSize) helper.width(this.currentItem.width());
-               if(helper[0].style.height == '' || o.forceHelperSize) helper.height(this.currentItem.height());
-
-               return helper;
-
-       },
-
-       _adjustOffsetFromHelper: function(obj) {
-               if (typeof obj == 'string') {
-                       obj = obj.split(' ');
-               }
-               if ($.isArray(obj)) {
-                       obj = {left: +obj[0], top: +obj[1] || 0};
-               }
-               if ('left' in obj) {
-                       this.offset.click.left = obj.left + this.margins.left;
-               }
-               if ('right' in obj) {
-                       this.offset.click.left = this.helperProportions.width - obj.right + this.margins.left;
-               }
-               if ('top' in obj) {
-                       this.offset.click.top = obj.top + this.margins.top;
-               }
-               if ('bottom' in obj) {
-                       this.offset.click.top = this.helperProportions.height - obj.bottom + this.margins.top;
-               }
-       },
-
-       _getParentOffset: function() {
-
-
-               //Get the offsetParent and cache its position
-               this.offsetParent = this.helper.offsetParent();
-               var po = this.offsetParent.offset();
-
-               // This is a special case where we need to modify a offset calculated on start, since the following happened:
-               // 1. The position of the helper is absolute, so it's position is calculated based on the next positioned parent
-               // 2. The actual offset parent is a child of the scroll parent, and the scroll parent isn't the document, which means that
-               //    the scroll is included in the initial calculation of the offset of the parent, and never recalculated upon drag
-               if(this.cssPosition == 'absolute' && this.scrollParent[0] != document && $.ui.contains(this.scrollParent[0], this.offsetParent[0])) {
-                       po.left += this.scrollParent.scrollLeft();
-                       po.top += this.scrollParent.scrollTop();
-               }
-
-               if((this.offsetParent[0] == document.body) //This needs to be actually done for all browsers, since pageX/pageY includes this information
-               || (this.offsetParent[0].tagName && this.offsetParent[0].tagName.toLowerCase() == 'html' && $.browser.msie)) //Ugly IE fix
-                       po = { top: 0, left: 0 };
-
-               return {
-                       top: po.top + (parseInt(this.offsetParent.css("borderTopWidth"),10) || 0),
-                       left: po.left + (parseInt(this.offsetParent.css("borderLeftWidth"),10) || 0)
-               };
-
-       },
-
-       _getRelativeOffset: function() {
-
-               if(this.cssPosition == "relative") {
-                       var p = this.currentItem.position();
-                       return {
-                               top: p.top - (parseInt(this.helper.css("top"),10) || 0) + this.scrollParent.scrollTop(),
-                               left: p.left - (parseInt(this.helper.css("left"),10) || 0) + this.scrollParent.scrollLeft()
-                       };
-               } else {
-                       return { top: 0, left: 0 };
-               }
-
-       },
-
-       _cacheMargins: function() {
-               this.margins = {
-                       left: (parseInt(this.currentItem.css("marginLeft"),10) || 0),
-                       top: (parseInt(this.currentItem.css("marginTop"),10) || 0)
-               };
-       },
-
-       _cacheHelperProportions: function() {
-               this.helperProportions = {
-                       width: this.helper.outerWidth(),
-                       height: this.helper.outerHeight()
-               };
-       },
-
-       _setContainment: function() {
-
-               var o = this.options;
-               if(o.containment == 'parent') o.containment = this.helper[0].parentNode;
-               if(o.containment == 'document' || o.containment == 'window') this.containment = [
-                       0 - this.offset.relative.left - this.offset.parent.left,
-                       0 - this.offset.relative.top - this.offset.parent.top,
-                       $(o.containment == 'document' ? document : window).width() - this.helperProportions.width - this.margins.left,
-                       ($(o.containment == 'document' ? document : window).height() || document.body.parentNode.scrollHeight) - this.helperProportions.height - this.margins.top
-               ];
-
-               if(!(/^(document|window|parent)$/).test(o.containment)) {
-                       var ce = $(o.containment)[0];
-                       var co = $(o.containment).offset();
-                       var over = ($(ce).css("overflow") != 'hidden');
-
-                       this.containment = [
-                               co.left + (parseInt($(ce).css("borderLeftWidth"),10) || 0) + (parseInt($(ce).css("paddingLeft"),10) || 0) - this.margins.left,
-                               co.top + (parseInt($(ce).css("borderTopWidth"),10) || 0) + (parseInt($(ce).css("paddingTop"),10) || 0) - this.margins.top,
-                               co.left+(over ? Math.max(ce.scrollWidth,ce.offsetWidth) : ce.offsetWidth) - (parseInt($(ce).css("borderLeftWidth"),10) || 0) - (parseInt($(ce).css("paddingRight"),10) || 0) - this.helperProportions.width - this.margins.left,
-                               co.top+(over ? Math.max(ce.scrollHeight,ce.offsetHeight) : ce.offsetHeight) - (parseInt($(ce).css("borderTopWidth"),10) || 0) - (parseInt($(ce).css("paddingBottom"),10) || 0) - this.helperProportions.height - this.margins.top
-                       ];
-               }
-
-       },
-
-       _convertPositionTo: function(d, pos) {
-
-               if(!pos) pos = this.position;
-               var mod = d == "absolute" ? 1 : -1;
-               var o = this.options, scroll = this.cssPosition == 'absolute' && !(this.scrollParent[0] != document && $.ui.contains(this.scrollParent[0], this.offsetParent[0])) ? this.offsetParent : this.scrollParent, scrollIsRootNode = (/(html|body)/i).test(scroll[0].tagName);
-
-               return {
-                       top: (
-                               pos.top                                                                                                                                 // The absolute mouse position
-                               + this.offset.relative.top * mod                                                                                // Only for relative positioned nodes: Relative offset from element to offset parent
-                               + this.offset.parent.top * mod                                                                                  // The offsetParent's offset without borders (offset + border)
-                               - ($.browser.safari && this.cssPosition == 'fixed' ? 0 : ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollTop() : ( scrollIsRootNode ? 0 : scroll.scrollTop() ) ) * mod)
-                       ),
-                       left: (
-                               pos.left                                                                                                                                // The absolute mouse position
-                               + this.offset.relative.left * mod                                                                               // Only for relative positioned nodes: Relative offset from element to offset parent
-                               + this.offset.parent.left * mod                                                                                 // The offsetParent's offset without borders (offset + border)
-                               - ($.browser.safari && this.cssPosition == 'fixed' ? 0 : ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollLeft() : scrollIsRootNode ? 0 : scroll.scrollLeft() ) * mod)
-                       )
-               };
-
-       },
-
-       _generatePosition: function(event) {
-
-               var o = this.options, scroll = this.cssPosition == 'absolute' && !(this.scrollParent[0] != document && $.ui.contains(this.scrollParent[0], this.offsetParent[0])) ? this.offsetParent : this.scrollParent, scrollIsRootNode = (/(html|body)/i).test(scroll[0].tagName);
-
-               // This is another very weird special case that only happens for relative elements:
-               // 1. If the css position is relative
-               // 2. and the scroll parent is the document or similar to the offset parent
-               // we have to refresh the relative offset during the scroll so there are no jumps
-               if(this.cssPosition == 'relative' && !(this.scrollParent[0] != document && this.scrollParent[0] != this.offsetParent[0])) {
-                       this.offset.relative = this._getRelativeOffset();
-               }
-
-               var pageX = event.pageX;
-               var pageY = event.pageY;
-
-               /*
-                * - Position constraining -
-                * Constrain the position to a mix of grid, containment.
-                */
-
-               if(this.originalPosition) { //If we are not dragging yet, we won't check for options
-
-                       if(this.containment) {
-                               if(event.pageX - this.offset.click.left < this.containment[0]) pageX = this.containment[0] + this.offset.click.left;
-                               if(event.pageY - this.offset.click.top < this.containment[1]) pageY = this.containment[1] + this.offset.click.top;
-                               if(event.pageX - this.offset.click.left > this.containment[2]) pageX = this.containment[2] + this.offset.click.left;
-                               if(event.pageY - this.offset.click.top > this.containment[3]) pageY = this.containment[3] + this.offset.click.top;
-                       }
-
-                       if(o.grid) {
-                               var top = this.originalPageY + Math.round((pageY - this.originalPageY) / o.grid[1]) * o.grid[1];
-                               pageY = this.containment ? (!(top - this.offset.click.top < this.containment[1] || top - this.offset.click.top > this.containment[3]) ? top : (!(top - this.offset.click.top < this.containment[1]) ? top - o.grid[1] : top + o.grid[1])) : top;
-
-                               var left = this.originalPageX + Math.round((pageX - this.originalPageX) / o.grid[0]) * o.grid[0];
-                               pageX = this.containment ? (!(left - this.offset.click.left < this.containment[0] || left - this.offset.click.left > this.containment[2]) ? left : (!(left - this.offset.click.left < this.containment[0]) ? left - o.grid[0] : left + o.grid[0])) : left;
-                       }
-
-               }
-
-               return {
-                       top: (
-                               pageY                                                                                                                           // The absolute mouse position
-                               - this.offset.click.top                                                                                                 // Click offset (relative to the element)
-                               - this.offset.relative.top                                                                                              // Only for relative positioned nodes: Relative offset from element to offset parent
-                               - this.offset.parent.top                                                                                                // The offsetParent's offset without borders (offset + border)
-                               + ($.browser.safari && this.cssPosition == 'fixed' ? 0 : ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollTop() : ( scrollIsRootNode ? 0 : scroll.scrollTop() ) ))
-                       ),
-                       left: (
-                               pageX                                                                                                                           // The absolute mouse position
-                               - this.offset.click.left                                                                                                // Click offset (relative to the element)
-                               - this.offset.relative.left                                                                                             // Only for relative positioned nodes: Relative offset from element to offset parent
-                               - this.offset.parent.left                                                                                               // The offsetParent's offset without borders (offset + border)
-                               + ($.browser.safari && this.cssPosition == 'fixed' ? 0 : ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollLeft() : scrollIsRootNode ? 0 : scroll.scrollLeft() ))
-                       )
-               };
-
-       },
-
-       _rearrange: function(event, i, a, hardRefresh) {
-
-               a ? a[0].appendChild(this.placeholder[0]) : i.item[0].parentNode.insertBefore(this.placeholder[0], (this.direction == 'down' ? i.item[0] : i.item[0].nextSibling));
-
-               //Various things done here to improve the performance:
-               // 1. we create a setTimeout, that calls refreshPositions
-               // 2. on the instance, we have a counter variable, that get's higher after every append
-               // 3. on the local scope, we copy the counter variable, and check in the timeout, if it's still the same
-               // 4. this lets only the last addition to the timeout stack through
-               this.counter = this.counter ? ++this.counter : 1;
-               var self = this, counter = this.counter;
-
-               window.setTimeout(function() {
-                       if(counter == self.counter) self.refreshPositions(!hardRefresh); //Precompute after each DOM insertion, NOT on mousemove
-               },0);
-
-       },
-
-       _clear: function(event, noPropagation) {
-
-               this.reverting = false;
-               // We delay all events that have to be triggered to after the point where the placeholder has been removed and
-               // everything else normalized again
-               var delayedTriggers = [], self = this;
-
-               // We first have to update the dom position of the actual currentItem
-               // Note: don't do it if the current item is already removed (by a user), or it gets reappended (see #4088)
-               if(!this._noFinalSort && this.currentItem.parent().length) this.placeholder.before(this.currentItem);
-               this._noFinalSort = null;
-
-               if(this.helper[0] == this.currentItem[0]) {
-                       for(var i in this._storedCSS) {
-                               if(this._storedCSS[i] == 'auto' || this._storedCSS[i] == 'static') this._storedCSS[i] = '';
-                       }
-                       this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper");
-               } else {
-                       this.currentItem.show();
-               }
-
-               if(this.fromOutside && !noPropagation) delayedTriggers.push(function(event) { this._trigger("receive", event, this._uiHash(this.fromOutside)); });
-               if((this.fromOutside || this.domPosition.prev != this.currentItem.prev().not(".ui-sortable-helper")[0] || this.domPosition.parent != this.currentItem.parent()[0]) && !noPropagation) delayedTriggers.push(function(event) { this._trigger("update", event, this._uiHash()); }); //Trigger update callback if the DOM position has changed
-
-               // Check if the items Container has Changed and trigger appropriate
-               // events.
-               if (this !== this.currentContainer) {
-                       if(!noPropagation) {
-                               delayedTriggers.push(function(event) { this._trigger("remove", event, this._uiHash()); });
-                               delayedTriggers.push((function(c) { return function(event) { c._trigger("receive", event, this._uiHash(this)); };  }).call(this, this.currentContainer));
-                               delayedTriggers.push((function(c) { return function(event) { c._trigger("update", event, this._uiHash(this));  }; }).call(this, this.currentContainer));
-                       }
-               }
-
-               //Post events to containers
-               for (var i = this.containers.length - 1; i >= 0; i--){
-                       if(!noPropagation) delayedTriggers.push((function(c) { return function(event) { c._trigger("deactivate", event, this._uiHash(this)); };  }).call(this, this.containers[i]));
-                       if(this.containers[i].containerCache.over) {
-                               delayedTriggers.push((function(c) { return function(event) { c._trigger("out", event, this._uiHash(this)); };  }).call(this, this.containers[i]));
-                               this.containers[i].containerCache.over = 0;
-                       }
-               }
-
-               //Do what was originally in plugins
-               if(this._storedCursor) $('body').css("cursor", this._storedCursor); //Reset cursor
-               if(this._storedOpacity) this.helper.css("opacity", this._storedOpacity); //Reset opacity
-               if(this._storedZIndex) this.helper.css("zIndex", this._storedZIndex == 'auto' ? '' : this._storedZIndex); //Reset z-index
-
-               this.dragging = false;
-               if(this.cancelHelperRemoval) {
-                       if(!noPropagation) {
-                               this._trigger("beforeStop", event, this._uiHash());
-                               for (var i=0; i < delayedTriggers.length; i++) { delayedTriggers[i].call(this, event); }; //Trigger all delayed events
-                               this._trigger("stop", event, this._uiHash());
-                       }
-
-                       this.fromOutside = false;
-                       return false;
-               }
-
-               if(!noPropagation) this._trigger("beforeStop", event, this._uiHash());
-
-               //$(this.placeholder[0]).remove(); would have been the jQuery way - unfortunately, it unbinds ALL events from the original node!
-               this.placeholder[0].parentNode.removeChild(this.placeholder[0]);
-
-               if(this.helper[0] != this.currentItem[0]) this.helper.remove(); this.helper = null;
-
-               if(!noPropagation) {
-                       for (var i=0; i < delayedTriggers.length; i++) { delayedTriggers[i].call(this, event); }; //Trigger all delayed events
-                       this._trigger("stop", event, this._uiHash());
-               }
-
-               this.fromOutside = false;
-               return true;
-
-       },
-
-       _trigger: function() {
-               if ($.Widget.prototype._trigger.apply(this, arguments) === false) {
-                       this.cancel();
-               }
-       },
-
-       _uiHash: function(inst) {
-               var self = inst || this;
-               return {
-                       helper: self.helper,
-                       placeholder: self.placeholder || $([]),
-                       position: self.position,
-                       originalPosition: self.originalPosition,
-                       offset: self.positionAbs,
-                       item: self.currentItem,
-                       sender: inst ? inst.element : null
-               };
-       }
-
-});
-
-$.extend($.ui.sortable, {
-       version: "1.8.24"
-});
-
-})(jQuery);
diff --git a/resources/jquery.ui/jquery.ui.tabs.js b/resources/jquery.ui/jquery.ui.tabs.js
deleted file mode 100644 (file)
index 0c47f0e..0000000
+++ /dev/null
@@ -1,757 +0,0 @@
-/*!
- * jQuery UI Tabs 1.8.24
- *
- * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
- * Dual licensed under the MIT or GPL Version 2 licenses.
- * http://jquery.org/license
- *
- * http://docs.jquery.com/UI/Tabs
- *
- * Depends:
- *     jquery.ui.core.js
- *     jquery.ui.widget.js
- */
-(function( $, undefined ) {
-
-var tabId = 0,
-       listId = 0;
-
-function getNextTabId() {
-       return ++tabId;
-}
-
-function getNextListId() {
-       return ++listId;
-}
-
-$.widget( "ui.tabs", {
-       options: {
-               add: null,
-               ajaxOptions: null,
-               cache: false,
-               cookie: null, // e.g. { expires: 7, path: '/', domain: 'jquery.com', secure: true }
-               collapsible: false,
-               disable: null,
-               disabled: [],
-               enable: null,
-               event: "click",
-               fx: null, // e.g. { height: 'toggle', opacity: 'toggle', duration: 200 }
-               idPrefix: "ui-tabs-",
-               load: null,
-               panelTemplate: "<div></div>",
-               remove: null,
-               select: null,
-               show: null,
-               spinner: "<em>Loading&#8230;</em>",
-               tabTemplate: "<li><a href='#{href}'><span>#{label}</span></a></li>"
-       },
-
-       _create: function() {
-               this._tabify( true );
-       },
-
-       _setOption: function( key, value ) {
-               if ( key == "selected" ) {
-                       if (this.options.collapsible && value == this.options.selected ) {
-                               return;
-                       }
-                       this.select( value );
-               } else {
-                       this.options[ key ] = value;
-                       this._tabify();
-               }
-       },
-
-       _tabId: function( a ) {
-               return a.title && a.title.replace( /\s/g, "_" ).replace( /[^\w\u00c0-\uFFFF-]/g, "" ) ||
-                       this.options.idPrefix + getNextTabId();
-       },
-
-       _sanitizeSelector: function( hash ) {
-               // we need this because an id may contain a ":"
-               return hash.replace( /:/g, "\\:" );
-       },
-
-       _cookie: function() {
-               var cookie = this.cookie ||
-                       ( this.cookie = this.options.cookie.name || "ui-tabs-" + getNextListId() );
-               return $.cookie.apply( null, [ cookie ].concat( $.makeArray( arguments ) ) );
-       },
-
-       _ui: function( tab, panel ) {
-               return {
-                       tab: tab,
-                       panel: panel,
-                       index: this.anchors.index( tab )
-               };
-       },
-
-       _cleanup: function() {
-               // restore all former loading tabs labels
-               this.lis.filter( ".ui-state-processing" )
-                       .removeClass( "ui-state-processing" )
-                       .find( "span:data(label.tabs)" )
-                               .each(function() {
-                                       var el = $( this );
-                                       el.html( el.data( "label.tabs" ) ).removeData( "label.tabs" );
-                               });
-       },
-
-       _tabify: function( init ) {
-               var self = this,
-                       o = this.options,
-                       fragmentId = /^#.+/; // Safari 2 reports '#' for an empty hash
-
-               this.list = this.element.find( "ol,ul" ).eq( 0 );
-               this.lis = $( " > li:has(a[href])", this.list );
-               this.anchors = this.lis.map(function() {
-                       return $( "a", this )[ 0 ];
-               });
-               this.panels = $( [] );
-
-               this.anchors.each(function( i, a ) {
-                       var href = $( a ).attr( "href" );
-                       // For dynamically created HTML that contains a hash as href IE < 8 expands
-                       // such href to the full page url with hash and then misinterprets tab as ajax.
-                       // Same consideration applies for an added tab with a fragment identifier
-                       // since a[href=#fragment-identifier] does unexpectedly not match.
-                       // Thus normalize href attribute...
-                       var hrefBase = href.split( "#" )[ 0 ],
-                               baseEl;
-                       if ( hrefBase && ( hrefBase === location.toString().split( "#" )[ 0 ] ||
-                                       ( baseEl = $( "base" )[ 0 ]) && hrefBase === baseEl.href ) ) {
-                               href = a.hash;
-                               a.href = href;
-                       }
-
-                       // inline tab
-                       if ( fragmentId.test( href ) ) {
-                               self.panels = self.panels.add( self.element.find( self._sanitizeSelector( href ) ) );
-                       // remote tab
-                       // prevent loading the page itself if href is just "#"
-                       } else if ( href && href !== "#" ) {
-                               // required for restore on destroy
-                               $.data( a, "href.tabs", href );
-
-                               // TODO until #3808 is fixed strip fragment identifier from url
-                               // (IE fails to load from such url)
-                               $.data( a, "load.tabs", href.replace( /#.*$/, "" ) );
-
-                               var id = self._tabId( a );
-                               a.href = "#" + id;
-                               var $panel = self.element.find( "#" + id );
-                               if ( !$panel.length ) {
-                                       $panel = $( o.panelTemplate )
-                                               .attr( "id", id )
-                                               .addClass( "ui-tabs-panel ui-widget-content ui-corner-bottom" )
-                                               .insertAfter( self.panels[ i - 1 ] || self.list );
-                                       $panel.data( "destroy.tabs", true );
-                               }
-                               self.panels = self.panels.add( $panel );
-                       // invalid tab href
-                       } else {
-                               o.disabled.push( i );
-                       }
-               });
-
-               // initialization from scratch
-               if ( init ) {
-                       // attach necessary classes for styling
-                       this.element.addClass( "ui-tabs ui-widget ui-widget-content ui-corner-all" );
-                       this.list.addClass( "ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all" );
-                       this.lis.addClass( "ui-state-default ui-corner-top" );
-                       this.panels.addClass( "ui-tabs-panel ui-widget-content ui-corner-bottom" );
-
-                       // Selected tab
-                       // use "selected" option or try to retrieve:
-                       // 1. from fragment identifier in url
-                       // 2. from cookie
-                       // 3. from selected class attribute on <li>
-                       if ( o.selected === undefined ) {
-                               if ( location.hash ) {
-                                       this.anchors.each(function( i, a ) {
-                                               if ( a.hash == location.hash ) {
-                                                       o.selected = i;
-                                                       return false;
-                                               }
-                                       });
-                               }
-                               if ( typeof o.selected !== "number" && o.cookie ) {
-                                       o.selected = parseInt( self._cookie(), 10 );
-                               }
-                               if ( typeof o.selected !== "number" && this.lis.filter( ".ui-tabs-selected" ).length ) {
-                                       o.selected = this.lis.index( this.lis.filter( ".ui-tabs-selected" ) );
-                               }
-                               o.selected = o.selected || ( this.lis.length ? 0 : -1 );
-                       } else if ( o.selected === null ) { // usage of null is deprecated, TODO remove in next release
-                               o.selected = -1;
-                       }
-
-                       // sanity check - default to first tab...
-                       o.selected = ( ( o.selected >= 0 && this.anchors[ o.selected ] ) || o.selected < 0 )
-                               ? o.selected
-                               : 0;
-
-                       // Take disabling tabs via class attribute from HTML
-                       // into account and update option properly.
-                       // A selected tab cannot become disabled.
-                       o.disabled = $.unique( o.disabled.concat(
-                               $.map( this.lis.filter( ".ui-state-disabled" ), function( n, i ) {
-                                       return self.lis.index( n );
-                               })
-                       ) ).sort();
-
-                       if ( $.inArray( o.selected, o.disabled ) != -1 ) {
-                               o.disabled.splice( $.inArray( o.selected, o.disabled ), 1 );
-                       }
-
-                       // highlight selected tab
-                       this.panels.addClass( "ui-tabs-hide" );
-                       this.lis.removeClass( "ui-tabs-selected ui-state-active" );
-                       // check for length avoids error when initializing empty list
-                       if ( o.selected >= 0 && this.anchors.length ) {
-                               self.element.find( self._sanitizeSelector( self.anchors[ o.selected ].hash ) ).removeClass( "ui-tabs-hide" );
-                               this.lis.eq( o.selected ).addClass( "ui-tabs-selected ui-state-active" );
-
-                               // seems to be expected behavior that the show callback is fired
-                               self.element.queue( "tabs", function() {
-                                       self._trigger( "show", null,
-                                               self._ui( self.anchors[ o.selected ], self.element.find( self._sanitizeSelector( self.anchors[ o.selected ].hash ) )[ 0 ] ) );
-                               });
-
-                               this.load( o.selected );
-                       }
-
-                       // clean up to avoid memory leaks in certain versions of IE 6
-                       // TODO: namespace this event
-                       $( window ).bind( "unload", function() {
-                               self.lis.add( self.anchors ).unbind( ".tabs" );
-                               self.lis = self.anchors = self.panels = null;
-                       });
-               // update selected after add/remove
-               } else {
-                       o.selected = this.lis.index( this.lis.filter( ".ui-tabs-selected" ) );
-               }
-
-               // update collapsible
-               // TODO: use .toggleClass()
-               this.element[ o.collapsible ? "addClass" : "removeClass" ]( "ui-tabs-collapsible" );
-
-               // set or update cookie after init and add/remove respectively
-               if ( o.cookie ) {
-                       this._cookie( o.selected, o.cookie );
-               }
-
-               // disable tabs
-               for ( var i = 0, li; ( li = this.lis[ i ] ); i++ ) {
-                       $( li )[ $.inArray( i, o.disabled ) != -1 &&
-                               // TODO: use .toggleClass()
-                               !$( li ).hasClass( "ui-tabs-selected" ) ? "addClass" : "removeClass" ]( "ui-state-disabled" );
-               }
-
-               // reset cache if switching from cached to not cached
-               if ( o.cache === false ) {
-                       this.anchors.removeData( "cache.tabs" );
-               }
-
-               // remove all handlers before, tabify may run on existing tabs after add or option change
-               this.lis.add( this.anchors ).unbind( ".tabs" );
-
-               if ( o.event !== "mouseover" ) {
-                       var addState = function( state, el ) {
-                               if ( el.is( ":not(.ui-state-disabled)" ) ) {
-                                       el.addClass( "ui-state-" + state );
-                               }
-                       };
-                       var removeState = function( state, el ) {
-                               el.removeClass( "ui-state-" + state );
-                       };
-                       this.lis.bind( "mouseover.tabs" , function() {
-                               addState( "hover", $( this ) );
-                       });
-                       this.lis.bind( "mouseout.tabs", function() {
-                               removeState( "hover", $( this ) );
-                       });
-                       this.anchors.bind( "focus.tabs", function() {
-                               addState( "focus", $( this ).closest( "li" ) );
-                       });
-                       this.anchors.bind( "blur.tabs", function() {
-                               removeState( "focus", $( this ).closest( "li" ) );
-                       });
-               }
-
-               // set up animations
-               var hideFx, showFx;
-               if ( o.fx ) {
-                       if ( $.isArray( o.fx ) ) {
-                               hideFx = o.fx[ 0 ];
-                               showFx = o.fx[ 1 ];
-                       } else {
-                               hideFx = showFx = o.fx;
-                       }
-               }
-
-               // Reset certain styles left over from animation
-               // and prevent IE's ClearType bug...
-               function resetStyle( $el, fx ) {
-                       $el.css( "display", "" );
-                       if ( !$.support.opacity && fx.opacity ) {
-                               $el[ 0 ].style.removeAttribute( "filter" );
-                       }
-               }
-
-               // Show a tab...
-               var showTab = showFx
-                       ? function( clicked, $show ) {
-                               $( clicked ).closest( "li" ).addClass( "ui-tabs-selected ui-state-active" );
-                               $show.hide().removeClass( "ui-tabs-hide" ) // avoid flicker that way
-                                       .animate( showFx, showFx.duration || "normal", function() {
-                                               resetStyle( $show, showFx );
-                                               self._trigger( "show", null, self._ui( clicked, $show[ 0 ] ) );
-                                       });
-                       }
-                       : function( clicked, $show ) {
-                               $( clicked ).closest( "li" ).addClass( "ui-tabs-selected ui-state-active" );
-                               $show.removeClass( "ui-tabs-hide" );
-                               self._trigger( "show", null, self._ui( clicked, $show[ 0 ] ) );
-                       };
-
-               // Hide a tab, $show is optional...
-               var hideTab = hideFx
-                       ? function( clicked, $hide ) {
-                               $hide.animate( hideFx, hideFx.duration || "normal", function() {
-                                       self.lis.removeClass( "ui-tabs-selected ui-state-active" );
-                                       $hide.addClass( "ui-tabs-hide" );
-                                       resetStyle( $hide, hideFx );
-                                       self.element.dequeue( "tabs" );
-                               });
-                       }
-                       : function( clicked, $hide, $show ) {
-                               self.lis.removeClass( "ui-tabs-selected ui-state-active" );
-                               $hide.addClass( "ui-tabs-hide" );
-                               self.element.dequeue( "tabs" );
-                       };
-
-               // attach tab event handler, unbind to avoid duplicates from former tabifying...
-               this.anchors.bind( o.event + ".tabs", function() {
-                       var el = this,
-                               $li = $(el).closest( "li" ),
-                               $hide = self.panels.filter( ":not(.ui-tabs-hide)" ),
-                               $show = self.element.find( self._sanitizeSelector( el.hash ) );
-
-                       // If tab is already selected and not collapsible or tab disabled or
-                       // or is already loading or click callback returns false stop here.
-                       // Check if click handler returns false last so that it is not executed
-                       // for a disabled or loading tab!
-                       if ( ( $li.hasClass( "ui-tabs-selected" ) && !o.collapsible) ||
-                               $li.hasClass( "ui-state-disabled" ) ||
-                               $li.hasClass( "ui-state-processing" ) ||
-                               self.panels.filter( ":animated" ).length ||
-                               self._trigger( "select", null, self._ui( this, $show[ 0 ] ) ) === false ) {
-                               this.blur();
-                               return false;
-                       }
-
-                       o.selected = self.anchors.index( this );
-
-                       self.abort();
-
-                       // if tab may be closed
-                       if ( o.collapsible ) {
-                               if ( $li.hasClass( "ui-tabs-selected" ) ) {
-                                       o.selected = -1;
-
-                                       if ( o.cookie ) {
-                                               self._cookie( o.selected, o.cookie );
-                                       }
-
-                                       self.element.queue( "tabs", function() {
-                                               hideTab( el, $hide );
-                                       }).dequeue( "tabs" );
-
-                                       this.blur();
-                                       return false;
-                               } else if ( !$hide.length ) {
-                                       if ( o.cookie ) {
-                                               self._cookie( o.selected, o.cookie );
-                                       }
-
-                                       self.element.queue( "tabs", function() {
-                                               showTab( el, $show );
-                                       });
-
-                                       // TODO make passing in node possible, see also http://dev.jqueryui.com/ticket/3171
-                                       self.load( self.anchors.index( this ) );
-
-                                       this.blur();
-                                       return false;
-                               }
-                       }
-
-                       if ( o.cookie ) {
-                               self._cookie( o.selected, o.cookie );
-                       }
-
-                       // show new tab
-                       if ( $show.length ) {
-                               if ( $hide.length ) {
-                                       self.element.queue( "tabs", function() {
-                                               hideTab( el, $hide );
-                                       });
-                               }
-                               self.element.queue( "tabs", function() {
-                                       showTab( el, $show );
-                               });
-
-                               self.load( self.anchors.index( this ) );
-                       } else {
-                               throw "jQuery UI Tabs: Mismatching fragment identifier.";
-                       }
-
-                       // Prevent IE from keeping other link focussed when using the back button
-                       // and remove dotted border from clicked link. This is controlled via CSS
-                       // in modern browsers; blur() removes focus from address bar in Firefox
-                       // which can become a usability and annoying problem with tabs('rotate').
-                       if ( $.browser.msie ) {
-                               this.blur();
-                       }
-               });
-
-               // disable click in any case
-               this.anchors.bind( "click.tabs", function(){
-                       return false;
-               });
-       },
-
-    _getIndex: function( index ) {
-               // meta-function to give users option to provide a href string instead of a numerical index.
-               // also sanitizes numerical indexes to valid values.
-               if ( typeof index == "string" ) {
-                       index = this.anchors.index( this.anchors.filter( "[href$='" + index + "']" ) );
-               }
-
-               return index;
-       },
-
-       destroy: function() {
-               var o = this.options;
-
-               this.abort();
-
-               this.element
-                       .unbind( ".tabs" )
-                       .removeClass( "ui-tabs ui-widget ui-widget-content ui-corner-all ui-tabs-collapsible" )
-                       .removeData( "tabs" );
-
-               this.list.removeClass( "ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all" );
-
-               this.anchors.each(function() {
-                       var href = $.data( this, "href.tabs" );
-                       if ( href ) {
-                               this.href = href;
-                       }
-                       var $this = $( this ).unbind( ".tabs" );
-                       $.each( [ "href", "load", "cache" ], function( i, prefix ) {
-                               $this.removeData( prefix + ".tabs" );
-                       });
-               });
-
-               this.lis.unbind( ".tabs" ).add( this.panels ).each(function() {
-                       if ( $.data( this, "destroy.tabs" ) ) {
-                               $( this ).remove();
-                       } else {
-                               $( this ).removeClass([
-                                       "ui-state-default",
-                                       "ui-corner-top",
-                                       "ui-tabs-selected",
-                                       "ui-state-active",
-                                       "ui-state-hover",
-                                       "ui-state-focus",
-                                       "ui-state-disabled",
-                                       "ui-tabs-panel",
-                                       "ui-widget-content",
-                                       "ui-corner-bottom",
-                                       "ui-tabs-hide"
-                               ].join( " " ) );
-                       }
-               });
-
-               if ( o.cookie ) {
-                       this._cookie( null, o.cookie );
-               }
-
-               return this;
-       },
-
-       add: function( url, label, index ) {
-               if ( index === undefined ) {
-                       index = this.anchors.length;
-               }
-
-               var self = this,
-                       o = this.options,
-                       $li = $( o.tabTemplate.replace( /#\{href\}/g, url ).replace( /#\{label\}/g, label ) ),
-                       id = !url.indexOf( "#" ) ? url.replace( "#", "" ) : this._tabId( $( "a", $li )[ 0 ] );
-
-               $li.addClass( "ui-state-default ui-corner-top" ).data( "destroy.tabs", true );
-
-               // try to find an existing element before creating a new one
-               var $panel = self.element.find( "#" + id );
-               if ( !$panel.length ) {
-                       $panel = $( o.panelTemplate )
-                               .attr( "id", id )
-                               .data( "destroy.tabs", true );
-               }
-               $panel.addClass( "ui-tabs-panel ui-widget-content ui-corner-bottom ui-tabs-hide" );
-
-               if ( index >= this.lis.length ) {
-                       $li.appendTo( this.list );
-                       $panel.appendTo( this.list[ 0 ].parentNode );
-               } else {
-                       $li.insertBefore( this.lis[ index ] );
-                       $panel.insertBefore( this.panels[ index ] );
-               }
-
-               o.disabled = $.map( o.disabled, function( n, i ) {
-                       return n >= index ? ++n : n;
-               });
-
-               this._tabify();
-
-               if ( this.anchors.length == 1 ) {
-                       o.selected = 0;
-                       $li.addClass( "ui-tabs-selected ui-state-active" );
-                       $panel.removeClass( "ui-tabs-hide" );
-                       this.element.queue( "tabs", function() {
-                               self._trigger( "show", null, self._ui( self.anchors[ 0 ], self.panels[ 0 ] ) );
-                       });
-
-                       this.load( 0 );
-               }
-
-               this._trigger( "add", null, this._ui( this.anchors[ index ], this.panels[ index ] ) );
-               return this;
-       },
-
-       remove: function( index ) {
-               index = this._getIndex( index );
-               var o = this.options,
-                       $li = this.lis.eq( index ).remove(),
-                       $panel = this.panels.eq( index ).remove();
-
-               // If selected tab was removed focus tab to the right or
-               // in case the last tab was removed the tab to the left.
-               if ( $li.hasClass( "ui-tabs-selected" ) && this.anchors.length > 1) {
-                       this.select( index + ( index + 1 < this.anchors.length ? 1 : -1 ) );
-               }
-
-               o.disabled = $.map(
-                       $.grep( o.disabled, function(n, i) {
-                               return n != index;
-                       }),
-                       function( n, i ) {
-                               return n >= index ? --n : n;
-                       });
-
-               this._tabify();
-
-               this._trigger( "remove", null, this._ui( $li.find( "a" )[ 0 ], $panel[ 0 ] ) );
-               return this;
-       },
-
-       enable: function( index ) {
-               index = this._getIndex( index );
-               var o = this.options;
-               if ( $.inArray( index, o.disabled ) == -1 ) {
-                       return;
-               }
-
-               this.lis.eq( index ).removeClass( "ui-state-disabled" );
-               o.disabled = $.grep( o.disabled, function( n, i ) {
-                       return n != index;
-               });
-
-               this._trigger( "enable", null, this._ui( this.anchors[ index ], this.panels[ index ] ) );
-               return this;
-       },
-
-       disable: function( index ) {
-               index = this._getIndex( index );
-               var self = this, o = this.options;
-               // cannot disable already selected tab
-               if ( index != o.selected ) {
-                       this.lis.eq( index ).addClass( "ui-state-disabled" );
-
-                       o.disabled.push( index );
-                       o.disabled.sort();
-
-                       this._trigger( "disable", null, this._ui( this.anchors[ index ], this.panels[ index ] ) );
-               }
-
-               return this;
-       },
-
-       select: function( index ) {
-               index = this._getIndex( index );
-               if ( index == -1 ) {
-                       if ( this.options.collapsible && this.options.selected != -1 ) {
-                               index = this.options.selected;
-                       } else {
-                               return this;
-                       }
-               }
-               this.anchors.eq( index ).trigger( this.options.event + ".tabs" );
-               return this;
-       },
-
-       load: function( index ) {
-               index = this._getIndex( index );
-               var self = this,
-                       o = this.options,
-                       a = this.anchors.eq( index )[ 0 ],
-                       url = $.data( a, "load.tabs" );
-
-               this.abort();
-
-               // not remote or from cache
-               if ( !url || this.element.queue( "tabs" ).length !== 0 && $.data( a, "cache.tabs" ) ) {
-                       this.element.dequeue( "tabs" );
-                       return;
-               }
-
-               // load remote from here on
-               this.lis.eq( index ).addClass( "ui-state-processing" );
-
-               if ( o.spinner ) {
-                       var span = $( "span", a );
-                       span.data( "label.tabs", span.html() ).html( o.spinner );
-               }
-
-               this.xhr = $.ajax( $.extend( {}, o.ajaxOptions, {
-                       url: url,
-                       success: function( r, s ) {
-                               self.element.find( self._sanitizeSelector( a.hash ) ).html( r );
-
-                               // take care of tab labels
-                               self._cleanup();
-
-                               if ( o.cache ) {
-                                       $.data( a, "cache.tabs", true );
-                               }
-
-                               self._trigger( "load", null, self._ui( self.anchors[ index ], self.panels[ index ] ) );
-                               try {
-                                       o.ajaxOptions.success( r, s );
-                               }
-                               catch ( e ) {}
-                       },
-                       error: function( xhr, s, e ) {
-                               // take care of tab labels
-                               self._cleanup();
-
-                               self._trigger( "load", null, self._ui( self.anchors[ index ], self.panels[ index ] ) );
-                               try {
-                                       // Passing index avoid a race condition when this method is
-                                       // called after the user has selected another tab.
-                                       // Pass the anchor that initiated this request allows
-                                       // loadError to manipulate the tab content panel via $(a.hash)
-                                       o.ajaxOptions.error( xhr, s, index, a );
-                               }
-                               catch ( e ) {}
-                       }
-               } ) );
-
-               // last, so that load event is fired before show...
-               self.element.dequeue( "tabs" );
-
-               return this;
-       },
-
-       abort: function() {
-               // stop possibly running animations
-               this.element.queue( [] );
-               this.panels.stop( false, true );
-
-               // "tabs" queue must not contain more than two elements,
-               // which are the callbacks for the latest clicked tab...
-               this.element.queue( "tabs", this.element.queue( "tabs" ).splice( -2, 2 ) );
-
-               // terminate pending requests from other tabs
-               if ( this.xhr ) {
-                       this.xhr.abort();
-                       delete this.xhr;
-               }
-
-               // take care of tab labels
-               this._cleanup();
-               return this;
-       },
-
-       url: function( index, url ) {
-               this.anchors.eq( index ).removeData( "cache.tabs" ).data( "load.tabs", url );
-               return this;
-       },
-
-       length: function() {
-               return this.anchors.length;
-       }
-});
-
-$.extend( $.ui.tabs, {
-       version: "1.8.24"
-});
-
-/*
- * Tabs Extensions
- */
-
-/*
- * Rotate
- */
-$.extend( $.ui.tabs.prototype, {
-       rotation: null,
-       rotate: function( ms, continuing ) {
-               var self = this,
-                       o = this.options;
-
-               var rotate = self._rotate || ( self._rotate = function( e ) {
-                       clearTimeout( self.rotation );
-                       self.rotation = setTimeout(function() {
-                               var t = o.selected;
-                               self.select( ++t < self.anchors.length ? t : 0 );
-                       }, ms );
-                       
-                       if ( e ) {
-                               e.stopPropagation();
-                       }
-               });
-
-               var stop = self._unrotate || ( self._unrotate = !continuing
-                       ? function(e) {
-                               if (e.clientX) { // in case of a true click
-                                       self.rotate(null);
-                               }
-                       }
-                       : function( e ) {
-                               rotate();
-                       });
-
-               // start rotation
-               if ( ms ) {
-                       this.element.bind( "tabsshow", rotate );
-                       this.anchors.bind( o.event + ".tabs", stop );
-                       rotate();
-               // stop rotation
-               } else {
-                       clearTimeout( self.rotation );
-                       this.element.unbind( "tabsshow", rotate );
-                       this.anchors.unbind( o.event + ".tabs", stop );
-                       delete this._rotate;
-                       delete this._unrotate;
-               }
-
-               return this;
-       }
-});
-
-})( jQuery );
diff --git a/resources/jquery.ui/jquery.ui.widget.js b/resources/jquery.ui/jquery.ui.widget.js
deleted file mode 100644 (file)
index 66ef013..0000000
+++ /dev/null
@@ -1,272 +0,0 @@
-/*!
- * jQuery UI Widget 1.8.24
- *
- * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
- * Dual licensed under the MIT or GPL Version 2 licenses.
- * http://jquery.org/license
- *
- * http://docs.jquery.com/UI/Widget
- */
-(function( $, undefined ) {
-
-// jQuery 1.4+
-if ( $.cleanData ) {
-       var _cleanData = $.cleanData;
-       $.cleanData = function( elems ) {
-               for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {
-                       try {
-                               $( elem ).triggerHandler( "remove" );
-                       // http://bugs.jquery.com/ticket/8235
-                       } catch( e ) {}
-               }
-               _cleanData( elems );
-       };
-} else {
-       var _remove = $.fn.remove;
-       $.fn.remove = function( selector, keepData ) {
-               return this.each(function() {
-                       if ( !keepData ) {
-                               if ( !selector || $.filter( selector, [ this ] ).length ) {
-                                       $( "*", this ).add( [ this ] ).each(function() {
-                                               try {
-                                                       $( this ).triggerHandler( "remove" );
-                                               // http://bugs.jquery.com/ticket/8235
-                                               } catch( e ) {}
-                                       });
-                               }
-                       }
-                       return _remove.call( $(this), selector, keepData );
-               });
-       };
-}
-
-$.widget = function( name, base, prototype ) {
-       var namespace = name.split( "." )[ 0 ],
-               fullName;
-       name = name.split( "." )[ 1 ];
-       fullName = namespace + "-" + name;
-
-       if ( !prototype ) {
-               prototype = base;
-               base = $.Widget;
-       }
-
-       // create selector for plugin
-       $.expr[ ":" ][ fullName ] = function( elem ) {
-               return !!$.data( elem, name );
-       };
-
-       $[ namespace ] = $[ namespace ] || {};
-       $[ namespace ][ name ] = function( options, element ) {
-               // allow instantiation without initializing for simple inheritance
-               if ( arguments.length ) {
-                       this._createWidget( options, element );
-               }
-       };
-
-       var basePrototype = new base();
-       // we need to make the options hash a property directly on the new instance
-       // otherwise we'll modify the options hash on the prototype that we're
-       // inheriting from
-//     $.each( basePrototype, function( key, val ) {
-//             if ( $.isPlainObject(val) ) {
-//                     basePrototype[ key ] = $.extend( {}, val );
-//             }
-//     });
-       basePrototype.options = $.extend( true, {}, basePrototype.options );
-       $[ namespace ][ name ].prototype = $.extend( true, basePrototype, {
-               namespace: namespace,
-               widgetName: name,
-               widgetEventPrefix: $[ namespace ][ name ].prototype.widgetEventPrefix || name,
-               widgetBaseClass: fullName
-       }, prototype );
-
-       $.widget.bridge( name, $[ namespace ][ name ] );
-};
-
-$.widget.bridge = function( name, object ) {
-       $.fn[ name ] = function( options ) {
-               var isMethodCall = typeof options === "string",
-                       args = Array.prototype.slice.call( arguments, 1 ),
-                       returnValue = this;
-
-               // allow multiple hashes to be passed on init
-               options = !isMethodCall && args.length ?
-                       $.extend.apply( null, [ true, options ].concat(args) ) :
-                       options;
-
-               // prevent calls to internal methods
-               if ( isMethodCall && options.charAt( 0 ) === "_" ) {
-                       return returnValue;
-               }
-
-               if ( isMethodCall ) {
-                       this.each(function() {
-                               var instance = $.data( this, name ),
-                                       methodValue = instance && $.isFunction( instance[options] ) ?
-                                               instance[ options ].apply( instance, args ) :
-                                               instance;
-                               // TODO: add this back in 1.9 and use $.error() (see #5972)
-//                             if ( !instance ) {
-//                                     throw "cannot call methods on " + name + " prior to initialization; " +
-//                                             "attempted to call method '" + options + "'";
-//                             }
-//                             if ( !$.isFunction( instance[options] ) ) {
-//                                     throw "no such method '" + options + "' for " + name + " widget instance";
-//                             }
-//                             var methodValue = instance[ options ].apply( instance, args );
-                               if ( methodValue !== instance && methodValue !== undefined ) {
-                                       returnValue = methodValue;
-                                       return false;
-                               }
-                       });
-               } else {
-                       this.each(function() {
-                               var instance = $.data( this, name );
-                               if ( instance ) {
-                                       instance.option( options || {} )._init();
-                               } else {
-                                       $.data( this, name, new object( options, this ) );
-                               }
-                       });
-               }
-
-               return returnValue;
-       };
-};
-
-$.Widget = function( options, element ) {
-       // allow instantiation without initializing for simple inheritance
-       if ( arguments.length ) {
-               this._createWidget( options, element );
-       }
-};
-
-$.Widget.prototype = {
-       widgetName: "widget",
-       widgetEventPrefix: "",
-       options: {
-               disabled: false
-       },
-       _createWidget: function( options, element ) {
-               // $.widget.bridge stores the plugin instance, but we do it anyway
-               // so that it's stored even before the _create function runs
-               $.data( element, this.widgetName, this );
-               this.element = $( element );
-               this.options = $.extend( true, {},
-                       this.options,
-                       this._getCreateOptions(),
-                       options );
-
-               var self = this;
-               this.element.bind( "remove." + this.widgetName, function() {
-                       self.destroy();
-               });
-
-               this._create();
-               this._trigger( "create" );
-               this._init();
-       },
-       _getCreateOptions: function() {
-               return $.metadata && $.metadata.get( this.element[0] )[ this.widgetName ];
-       },
-       _create: function() {},
-       _init: function() {},
-
-       destroy: function() {
-               this.element
-                       .unbind( "." + this.widgetName )
-                       .removeData( this.widgetName );
-               this.widget()
-                       .unbind( "." + this.widgetName )
-                       .removeAttr( "aria-disabled" )
-                       .removeClass(
-                               this.widgetBaseClass + "-disabled " +
-                               "ui-state-disabled" );
-       },
-
-       widget: function() {
-               return this.element;
-       },
-
-       option: function( key, value ) {
-               var options = key;
-
-               if ( arguments.length === 0 ) {
-                       // don't return a reference to the internal hash
-                       return $.extend( {}, this.options );
-               }
-
-               if  (typeof key === "string" ) {
-                       if ( value === undefined ) {
-                               return this.options[ key ];
-                       }
-                       options = {};
-                       options[ key ] = value;
-               }
-
-               this._setOptions( options );
-
-               return this;
-       },
-       _setOptions: function( options ) {
-               var self = this;
-               $.each( options, function( key, value ) {
-                       self._setOption( key, value );
-               });
-
-               return this;
-       },
-       _setOption: function( key, value ) {
-               this.options[ key ] = value;
-
-               if ( key === "disabled" ) {
-                       this.widget()
-                               [ value ? "addClass" : "removeClass"](
-                                       this.widgetBaseClass + "-disabled" + " " +
-                                       "ui-state-disabled" )
-                               .attr( "aria-disabled", value );
-               }
-
-               return this;
-       },
-
-       enable: function() {
-               return this._setOption( "disabled", false );
-       },
-       disable: function() {
-               return this._setOption( "disabled", true );
-       },
-
-       _trigger: function( type, event, data ) {
-               var prop, orig,
-                       callback = this.options[ type ];
-
-               data = data || {};
-               event = $.Event( event );
-               event.type = ( type === this.widgetEventPrefix ?
-                       type :
-                       this.widgetEventPrefix + type ).toLowerCase();
-               // the original event may come from any element
-               // so we need to reset the target on the new event
-               event.target = this.element[ 0 ];
-
-               // copy original event properties over to the new event
-               orig = event.originalEvent;
-               if ( orig ) {
-                       for ( prop in orig ) {
-                               if ( !( prop in event ) ) {
-                                       event[ prop ] = orig[ prop ];
-                               }
-                       }
-               }
-
-               this.element.trigger( event, data );
-
-               return !( $.isFunction(callback) &&
-                       callback.call( this.element[0], event, data ) === false ||
-                       event.isDefaultPrevented() );
-       }
-};
-
-})( jQuery );
diff --git a/resources/jquery.ui/themes/default/images/ui-bg_flat_0_aaaaaa_40x100.png b/resources/jquery.ui/themes/default/images/ui-bg_flat_0_aaaaaa_40x100.png
deleted file mode 100644 (file)
index e425e6e..0000000
Binary files a/resources/jquery.ui/themes/default/images/ui-bg_flat_0_aaaaaa_40x100.png and /dev/null differ
diff --git a/resources/jquery.ui/themes/default/images/ui-bg_flat_75_ffffff_40x100.png b/resources/jquery.ui/themes/default/images/ui-bg_flat_75_ffffff_40x100.png
deleted file mode 100644 (file)
index 72d4757..0000000
Binary files a/resources/jquery.ui/themes/default/images/ui-bg_flat_75_ffffff_40x100.png and /dev/null differ
diff --git a/resources/jquery.ui/themes/default/images/ui-bg_glass_55_fbf9ee_1x400.png b/resources/jquery.ui/themes/default/images/ui-bg_glass_55_fbf9ee_1x400.png
deleted file mode 100644 (file)
index 3b2914a..0000000
Binary files a/resources/jquery.ui/themes/default/images/ui-bg_glass_55_fbf9ee_1x400.png and /dev/null differ
diff --git a/resources/jquery.ui/themes/default/images/ui-bg_glass_65_ffffff_1x400.png b/resources/jquery.ui/themes/default/images/ui-bg_glass_65_ffffff_1x400.png
deleted file mode 100644 (file)
index 8569c1b..0000000
Binary files a/resources/jquery.ui/themes/default/images/ui-bg_glass_65_ffffff_1x400.png and /dev/null differ
diff --git a/resources/jquery.ui/themes/default/images/ui-bg_glass_75_dadada_1x400.png b/resources/jquery.ui/themes/default/images/ui-bg_glass_75_dadada_1x400.png
deleted file mode 100644 (file)
index d6cc3c5..0000000
Binary files a/resources/jquery.ui/themes/default/images/ui-bg_glass_75_dadada_1x400.png and /dev/null differ
diff --git a/resources/jquery.ui/themes/default/images/ui-bg_glass_75_e6e6e6_1x400.png b/resources/jquery.ui/themes/default/images/ui-bg_glass_75_e6e6e6_1x400.png
deleted file mode 100644 (file)
index 86c2baa..0000000
Binary files a/resources/jquery.ui/themes/default/images/ui-bg_glass_75_e6e6e6_1x400.png and /dev/null differ
diff --git a/resources/jquery.ui/themes/default/images/ui-bg_glass_95_fef1ec_1x400.png b/resources/jquery.ui/themes/default/images/ui-bg_glass_95_fef1ec_1x400.png
deleted file mode 100644 (file)
index 4443fdc..0000000
Binary files a/resources/jquery.ui/themes/default/images/ui-bg_glass_95_fef1ec_1x400.png and /dev/null differ
diff --git a/resources/jquery.ui/themes/default/images/ui-bg_highlight-soft_75_cccccc_1x100.png b/resources/jquery.ui/themes/default/images/ui-bg_highlight-soft_75_cccccc_1x100.png
deleted file mode 100644 (file)
index 3cd467e..0000000
Binary files a/resources/jquery.ui/themes/default/images/ui-bg_highlight-soft_75_cccccc_1x100.png and /dev/null differ
diff --git a/resources/jquery.ui/themes/default/images/ui-icons_222222_256x240.png b/resources/jquery.ui/themes/default/images/ui-icons_222222_256x240.png
deleted file mode 100644 (file)
index 9a9606f..0000000
Binary files a/resources/jquery.ui/themes/default/images/ui-icons_222222_256x240.png and /dev/null differ
diff --git a/resources/jquery.ui/themes/default/images/ui-icons_2e83ff_256x240.png b/resources/jquery.ui/themes/default/images/ui-icons_2e83ff_256x240.png
deleted file mode 100644 (file)
index 08d2617..0000000
Binary files a/resources/jquery.ui/themes/default/images/ui-icons_2e83ff_256x240.png and /dev/null differ
diff --git a/resources/jquery.ui/themes/default/images/ui-icons_454545_256x240.png b/resources/jquery.ui/themes/default/images/ui-icons_454545_256x240.png
deleted file mode 100644 (file)
index 80cb644..0000000
Binary files a/resources/jquery.ui/themes/default/images/ui-icons_454545_256x240.png and /dev/null differ
diff --git a/resources/jquery.ui/themes/default/images/ui-icons_888888_256x240.png b/resources/jquery.ui/themes/default/images/ui-icons_888888_256x240.png
deleted file mode 100644 (file)
index 8373712..0000000
Binary files a/resources/jquery.ui/themes/default/images/ui-icons_888888_256x240.png and /dev/null differ
diff --git a/resources/jquery.ui/themes/default/images/ui-icons_cd0a0a_256x240.png b/resources/jquery.ui/themes/default/images/ui-icons_cd0a0a_256x240.png
deleted file mode 100644 (file)
index 34fc893..0000000
Binary files a/resources/jquery.ui/themes/default/images/ui-icons_cd0a0a_256x240.png and /dev/null differ
diff --git a/resources/jquery.ui/themes/default/jquery.ui.accordion.css b/resources/jquery.ui/themes/default/jquery.ui.accordion.css
deleted file mode 100644 (file)
index cd8f971..0000000
+++ /dev/null
@@ -1,19 +0,0 @@
-/*!
- * jQuery UI Accordion 1.8.24
- *
- * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
- * Dual licensed under the MIT or GPL Version 2 licenses.
- * http://jquery.org/license
- *
- * http://docs.jquery.com/UI/Accordion#theming
- */
-/* IE/Win - Fix animation bug - #4615 */
-.ui-accordion { width: 100%; }
-.ui-accordion .ui-accordion-header { cursor: pointer; position: relative; margin-top: 1px; zoom: 1; }
-.ui-accordion .ui-accordion-li-fix { display: inline; }
-.ui-accordion .ui-accordion-header-active { border-bottom: 0 !important; }
-.ui-accordion .ui-accordion-header a { display: block; font-size: 1em; padding: .5em .5em .5em .7em; }
-.ui-accordion-icons .ui-accordion-header a { padding-left: 2.2em; }
-.ui-accordion .ui-accordion-header .ui-icon { position: absolute; left: .5em; top: 50%; margin-top: -8px; }
-.ui-accordion .ui-accordion-content { padding: 1em 2.2em; border-top: 0; margin-top: -2px; position: relative; top: 1px; margin-bottom: 2px; overflow: auto; display: none; zoom: 1; }
-.ui-accordion .ui-accordion-content-active { display: block; }
diff --git a/resources/jquery.ui/themes/default/jquery.ui.autocomplete.css b/resources/jquery.ui/themes/default/jquery.ui.autocomplete.css
deleted file mode 100644 (file)
index c7eaff2..0000000
+++ /dev/null
@@ -1,53 +0,0 @@
-/*!
- * jQuery UI Autocomplete 1.8.24
- *
- * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
- * Dual licensed under the MIT or GPL Version 2 licenses.
- * http://jquery.org/license
- *
- * http://docs.jquery.com/UI/Autocomplete#theming
- */
-.ui-autocomplete { position: absolute; cursor: default; }      
-
-/* workarounds */
-* html .ui-autocomplete { width:1px; } /* without this, the menu expands to 100% in IE6 */
-
-/*
- * jQuery UI Menu 1.8.24
- *
- * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
- * Dual licensed under the MIT or GPL Version 2 licenses.
- * http://jquery.org/license
- *
- * http://docs.jquery.com/UI/Menu#theming
- */
-.ui-menu {
-       list-style:none;
-       padding: 2px;
-       margin: 0;
-       display:block;
-       float: left;
-}
-.ui-menu .ui-menu {
-       margin-top: -3px;
-}
-.ui-menu .ui-menu-item {
-       margin:0;
-       padding: 0;
-       zoom: 1;
-       float: left;
-       clear: left;
-       width: 100%;
-}
-.ui-menu .ui-menu-item a {
-       text-decoration:none;
-       display:block;
-       padding:.2em .4em;
-       line-height:1.5;
-       zoom:1;
-}
-.ui-menu .ui-menu-item a.ui-state-hover,
-.ui-menu .ui-menu-item a.ui-state-active {
-       font-weight: normal;
-       margin: -1px;
-}
diff --git a/resources/jquery.ui/themes/default/jquery.ui.button.css b/resources/jquery.ui/themes/default/jquery.ui.button.css
deleted file mode 100644 (file)
index cd2dbb6..0000000
+++ /dev/null
@@ -1,110 +0,0 @@
-/*!
- * jQuery UI Button 1.8.24
- *
- * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
- * Dual licensed under the MIT or GPL Version 2 licenses.
- * http://jquery.org/license
- *
- * http://docs.jquery.com/UI/Button#theming
- */
-
-.ui-button {
-       display: inline-block;
-       position: relative;
-       padding: 0;
-       margin-right: .1em;
-       text-decoration: none !important;
-       cursor: pointer;
-       text-align: center;
-       zoom: 1;
-       overflow: visible; /* the overflow property removes extra width in IE */
-}
-/* to make room for the icon, a width needs to be set here */
-.ui-button-icon-only {
-       width: 2.2em;
-}
-
-/* button elements seem to need a little more width */
-button.ui-button-icon-only {
-       width: 2.4em;
-}
-.ui-button-icons-only {
-       width: 3.4em;
-}
-button.ui-button-icons-only {
-       width: 3.7em;
-}
-
-/*button text element */
-.ui-button .ui-button-text {
-       display: block;
-       line-height: 1.4;
-}
-.ui-button-text-only .ui-button-text {
-       padding: .4em 1em;
-}
-.ui-button-icon-only .ui-button-text,
-.ui-button-icons-only .ui-button-text {
-       padding: .4em;
-       text-indent: -9999999px;
-}
-.ui-button-text-icon-primary .ui-button-text,
-.ui-button-text-icons .ui-button-text {
-       padding: .4em 1em .4em 2.1em;
-}
-.ui-button-text-icon-secondary .ui-button-text,
-.ui-button-text-icons .ui-button-text {
-       padding: .4em 2.1em .4em 1em;
-}
-.ui-button-text-icons .ui-button-text {
-       padding-left: 2.1em;
-       padding-right: 2.1em;
-}
-/* no icon support for input elements, provide padding by default */
-       input.ui-button {
-       padding: .4em 1em;
-}
-
-/*button icon element(s) */
-.ui-button-icon-only .ui-icon,
-.ui-button-text-icon-primary .ui-icon,
-.ui-button-text-icon-secondary .ui-icon,
-.ui-button-text-icons .ui-icon,
-.ui-button-icons-only .ui-icon {
-       position: absolute;
-       top: 50%;
-       margin-top: -8px;
-}
-.ui-button-icon-only .ui-icon {
-       left: 50%;
-       margin-left: -8px;
-}
-.ui-button-text-icon-primary .ui-button-icon-primary,
-.ui-button-text-icons .ui-button-icon-primary,
-.ui-button-icons-only .ui-button-icon-primary {
-       left: .5em;
-}
-.ui-button-text-icon-secondary .ui-button-icon-secondary,
-.ui-button-text-icons .ui-button-icon-secondary,
-.ui-button-icons-only .ui-button-icon-secondary {
-       right: .5em;
-}
-.ui-button-text-icons .ui-button-icon-secondary,
-.ui-button-icons-only .ui-button-icon-secondary {
-       right: .5em;
-}
-
-/*button sets*/
-.ui-buttonset {
-       margin-right: 7px;
-}
-.ui-buttonset .ui-button {
-       margin-left: 0;
-       margin-right: -.3em;
-}
-
-/* workarounds */
-button.ui-button::-moz-focus-inner {
-       border: 0;
-       padding: 0; /* reset extra padding in Firefox */
-}
diff --git a/resources/jquery.ui/themes/default/jquery.ui.core.css b/resources/jquery.ui/themes/default/jquery.ui.core.css
deleted file mode 100644 (file)
index 8b953a2..0000000
+++ /dev/null
@@ -1,38 +0,0 @@
-/*!
- * jQuery UI CSS Framework 1.8.24
- *
- * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
- * Dual licensed under the MIT or GPL Version 2 licenses.
- * http://jquery.org/license
- *
- * http://docs.jquery.com/UI/Theming/API
- */
-
-/* Layout helpers
-----------------------------------*/
-.ui-helper-hidden { display: none; }
-.ui-helper-hidden-accessible { position: absolute !important; clip: rect(1px 1px 1px 1px); clip: rect(1px,1px,1px,1px); }
-.ui-helper-reset { margin: 0; padding: 0; border: 0; outline: 0; line-height: 1.3; text-decoration: none; font-size: 100%; list-style: none; }
-.ui-helper-clearfix:before, .ui-helper-clearfix:after { content: ""; display: table; }
-.ui-helper-clearfix:after { clear: both; }
-.ui-helper-clearfix { zoom: 1; }
-.ui-helper-zfix { width: 100%; height: 100%; top: 0; left: 0; position: absolute; opacity: 0; filter:Alpha(Opacity=0); }
-
-
-/* Interaction Cues
-----------------------------------*/
-.ui-state-disabled { cursor: default !important; }
-
-
-/* Icons
-----------------------------------*/
-
-/* states and images */
-.ui-icon { display: block; text-indent: -99999px; overflow: hidden; background-repeat: no-repeat; }
-
-
-/* Misc visuals
-----------------------------------*/
-
-/* Overlays */
-.ui-widget-overlay { position: absolute; top: 0; left: 0; width: 100%; height: 100%; }
diff --git a/resources/jquery.ui/themes/default/jquery.ui.datepicker.css b/resources/jquery.ui/themes/default/jquery.ui.datepicker.css
deleted file mode 100644 (file)
index 37d3a98..0000000
+++ /dev/null
@@ -1,66 +0,0 @@
-/*!
- * jQuery UI Datepicker 1.8.24
- *
- * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
- * Dual licensed under the MIT or GPL Version 2 licenses.
- * http://jquery.org/license
- *
- * http://docs.jquery.com/UI/Datepicker#theming
- */
-.ui-datepicker { width: 17em; padding: .2em .2em 0; display: none; }
-.ui-datepicker .ui-datepicker-header { position:relative; padding:.2em 0; }
-.ui-datepicker .ui-datepicker-prev, .ui-datepicker .ui-datepicker-next { position:absolute; top: 2px; width: 1.8em; height: 1.8em; }
-.ui-datepicker .ui-datepicker-prev-hover, .ui-datepicker .ui-datepicker-next-hover { top: 1px; }
-.ui-datepicker .ui-datepicker-prev { left:2px; }
-.ui-datepicker .ui-datepicker-next { right:2px; }
-.ui-datepicker .ui-datepicker-prev-hover { left:1px; }
-.ui-datepicker .ui-datepicker-next-hover { right:1px; }
-.ui-datepicker .ui-datepicker-prev span, .ui-datepicker .ui-datepicker-next span { display: block; position: absolute; left: 50%; margin-left: -8px; top: 50%; margin-top: -8px;  }
-.ui-datepicker .ui-datepicker-title { margin: 0 2.3em; line-height: 1.8em; text-align: center; }
-.ui-datepicker .ui-datepicker-title select { font-size:1em; margin:1px 0; }
-.ui-datepicker select.ui-datepicker-month-year {width: 100%;}
-.ui-datepicker select.ui-datepicker-month, 
-.ui-datepicker select.ui-datepicker-year { width: 49%;}
-.ui-datepicker table {width: 100%; font-size: .9em; border-collapse: collapse; margin:0 0 .4em; }
-.ui-datepicker th { padding: .7em .3em; text-align: center; font-weight: bold; border: 0;  }
-.ui-datepicker td { border: 0; padding: 1px; }
-.ui-datepicker td span, .ui-datepicker td a { display: block; padding: .2em; text-align: right; text-decoration: none; }
-.ui-datepicker .ui-datepicker-buttonpane { background-image: none; margin: .7em 0 0 0; padding:0 .2em; border-left: 0; border-right: 0; border-bottom: 0; }
-.ui-datepicker .ui-datepicker-buttonpane button { float: right; margin: .5em .2em .4em; cursor: pointer; padding: .2em .6em .3em .6em; width:auto; overflow:visible; }
-.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current { float:left; }
-
-/* with multiple calendars */
-.ui-datepicker.ui-datepicker-multi { width:auto; }
-.ui-datepicker-multi .ui-datepicker-group { float:left; }
-.ui-datepicker-multi .ui-datepicker-group table { width:95%; margin:0 auto .4em; }
-.ui-datepicker-multi-2 .ui-datepicker-group { width:50%; }
-.ui-datepicker-multi-3 .ui-datepicker-group { width:33.3%; }
-.ui-datepicker-multi-4 .ui-datepicker-group { width:25%; }
-.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header { border-left-width:0; }
-.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header { border-left-width:0; }
-.ui-datepicker-multi .ui-datepicker-buttonpane { clear:left; }
-.ui-datepicker-row-break { clear:both; width:100%; font-size:0em; }
-
-/* RTL support */
-.ui-datepicker-rtl { direction: rtl; }
-.ui-datepicker-rtl .ui-datepicker-prev { right: 2px; left: auto; }
-.ui-datepicker-rtl .ui-datepicker-next { left: 2px; right: auto; }
-.ui-datepicker-rtl .ui-datepicker-prev:hover { right: 1px; left: auto; }
-.ui-datepicker-rtl .ui-datepicker-next:hover { left: 1px; right: auto; }
-.ui-datepicker-rtl .ui-datepicker-buttonpane { clear:right; }
-.ui-datepicker-rtl .ui-datepicker-buttonpane button { float: left; }
-.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current { float:right; }
-.ui-datepicker-rtl .ui-datepicker-group { float:right; }
-.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header { border-right-width:0; border-left-width:1px; }
-.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header { border-right-width:0; border-left-width:1px; }
-
-/* IE6 IFRAME FIX (taken from datepicker 1.5.3 */
-.ui-datepicker-cover {
-    position: absolute; /*must have*/
-    z-index: -1; /*must have*/
-    filter: mask(); /*must have*/
-    top: -4px; /*must have*/
-    left: -4px; /*must have*/
-    width: 200px; /*must have*/
-    height: 200px; /*must have*/
-}
\ No newline at end of file
diff --git a/resources/jquery.ui/themes/default/jquery.ui.dialog.css b/resources/jquery.ui/themes/default/jquery.ui.dialog.css
deleted file mode 100644 (file)
index 04515f4..0000000
+++ /dev/null
@@ -1,21 +0,0 @@
-/*!
- * jQuery UI Dialog 1.8.24
- *
- * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
- * Dual licensed under the MIT or GPL Version 2 licenses.
- * http://jquery.org/license
- *
- * http://docs.jquery.com/UI/Dialog#theming
- */
-.ui-dialog { position: absolute; padding: .2em; width: 300px; overflow: hidden; }
-.ui-dialog .ui-dialog-titlebar { padding: .4em 1em; position: relative;  }
-.ui-dialog .ui-dialog-title { float: left; margin: .1em 16px .1em 0; } 
-.ui-dialog .ui-dialog-titlebar-close { position: absolute; right: .3em; top: 50%; width: 19px; margin: -10px 0 0 0; padding: 1px; height: 18px; }
-.ui-dialog .ui-dialog-titlebar-close span { display: block; margin: 1px; }
-.ui-dialog .ui-dialog-titlebar-close:hover, .ui-dialog .ui-dialog-titlebar-close:focus { padding: 0; }
-.ui-dialog .ui-dialog-content { position: relative; border: 0; padding: .5em 1em; background: none; overflow: auto; zoom: 1; }
-.ui-dialog .ui-dialog-buttonpane { text-align: left; border-width: 1px 0 0 0; background-image: none; margin: .5em 0 0 0; padding: .3em 1em .5em .4em; }
-.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset { float: right; }
-.ui-dialog .ui-dialog-buttonpane button { margin: .5em .4em .5em 0; cursor: pointer; }
-.ui-dialog .ui-resizable-se { width: 14px; height: 14px; right: 3px; bottom: 3px; }
-.ui-draggable .ui-dialog-titlebar { cursor: move; }
diff --git a/resources/jquery.ui/themes/default/jquery.ui.progressbar.css b/resources/jquery.ui/themes/default/jquery.ui.progressbar.css
deleted file mode 100644 (file)
index 90bf308..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-/*!
- * jQuery UI Progressbar 1.8.24
- *
- * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
- * Dual licensed under the MIT or GPL Version 2 licenses.
- * http://jquery.org/license
- *
- * http://docs.jquery.com/UI/Progressbar#theming
- */
-.ui-progressbar { height:2em; text-align: left; overflow: hidden; }
-.ui-progressbar .ui-progressbar-value {margin: -1px; height:100%; }
\ No newline at end of file
diff --git a/resources/jquery.ui/themes/default/jquery.ui.resizable.css b/resources/jquery.ui/themes/default/jquery.ui.resizable.css
deleted file mode 100644 (file)
index d17873e..0000000
+++ /dev/null
@@ -1,20 +0,0 @@
-/*!
- * jQuery UI Resizable 1.8.24
- *
- * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
- * Dual licensed under the MIT or GPL Version 2 licenses.
- * http://jquery.org/license
- *
- * http://docs.jquery.com/UI/Resizable#theming
- */
-.ui-resizable { position: relative;}
-.ui-resizable-handle { position: absolute;font-size: 0.1px; display: block; }
-.ui-resizable-disabled .ui-resizable-handle, .ui-resizable-autohide .ui-resizable-handle { display: none; }
-.ui-resizable-n { cursor: n-resize; height: 7px; width: 100%; top: -5px; left: 0; }
-.ui-resizable-s { cursor: s-resize; height: 7px; width: 100%; bottom: -5px; left: 0; }
-.ui-resizable-e { cursor: e-resize; width: 7px; right: -5px; top: 0; height: 100%; }
-.ui-resizable-w { cursor: w-resize; width: 7px; left: -5px; top: 0; height: 100%; }
-.ui-resizable-se { cursor: se-resize; width: 12px; height: 12px; right: 1px; bottom: 1px; }
-.ui-resizable-sw { cursor: sw-resize; width: 9px; height: 9px; left: -5px; bottom: -5px; }
-.ui-resizable-nw { cursor: nw-resize; width: 9px; height: 9px; left: -5px; top: -5px; }
-.ui-resizable-ne { cursor: ne-resize; width: 9px; height: 9px; right: -5px; top: -5px;}
\ No newline at end of file
diff --git a/resources/jquery.ui/themes/default/jquery.ui.selectable.css b/resources/jquery.ui/themes/default/jquery.ui.selectable.css
deleted file mode 100644 (file)
index 9850ee7..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-/*!
- * jQuery UI Selectable 1.8.24
- *
- * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
- * Dual licensed under the MIT or GPL Version 2 licenses.
- * http://jquery.org/license
- *
- * http://docs.jquery.com/UI/Selectable#theming
- */
-.ui-selectable-helper { position: absolute; z-index: 100; border:1px dotted black; }
diff --git a/resources/jquery.ui/themes/default/jquery.ui.slider.css b/resources/jquery.ui/themes/default/jquery.ui.slider.css
deleted file mode 100644 (file)
index fbfe665..0000000
+++ /dev/null
@@ -1,24 +0,0 @@
-/*!
- * jQuery UI Slider 1.8.24
- *
- * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
- * Dual licensed under the MIT or GPL Version 2 licenses.
- * http://jquery.org/license
- *
- * http://docs.jquery.com/UI/Slider#theming
- */
-.ui-slider { position: relative; text-align: left; }
-.ui-slider .ui-slider-handle { position: absolute; z-index: 2; width: 1.2em; height: 1.2em; cursor: default; }
-.ui-slider .ui-slider-range { position: absolute; z-index: 1; font-size: .7em; display: block; border: 0; background-position: 0 0; }
-
-.ui-slider-horizontal { height: .8em; }
-.ui-slider-horizontal .ui-slider-handle { top: -.3em; margin-left: -.6em; }
-.ui-slider-horizontal .ui-slider-range { top: 0; height: 100%; }
-.ui-slider-horizontal .ui-slider-range-min { left: 0; }
-.ui-slider-horizontal .ui-slider-range-max { right: 0; }
-
-.ui-slider-vertical { width: .8em; height: 100px; }
-.ui-slider-vertical .ui-slider-handle { left: -.3em; margin-left: 0; margin-bottom: -.6em; }
-.ui-slider-vertical .ui-slider-range { left: 0; width: 100%; }
-.ui-slider-vertical .ui-slider-range-min { bottom: 0; }
-.ui-slider-vertical .ui-slider-range-max { top: 0; }
\ No newline at end of file
diff --git a/resources/jquery.ui/themes/default/jquery.ui.tabs.css b/resources/jquery.ui/themes/default/jquery.ui.tabs.css
deleted file mode 100644 (file)
index f0bee7a..0000000
+++ /dev/null
@@ -1,18 +0,0 @@
-/*!
- * jQuery UI Tabs 1.8.24
- *
- * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
- * Dual licensed under the MIT or GPL Version 2 licenses.
- * http://jquery.org/license
- *
- * http://docs.jquery.com/UI/Tabs#theming
- */
-.ui-tabs { position: relative; padding: .2em; zoom: 1; } /* position: relative prevents IE scroll bug (element with position: relative inside container with overflow: auto appear as "fixed") */
-.ui-tabs .ui-tabs-nav { margin: 0; padding: .2em .2em 0; }
-.ui-tabs .ui-tabs-nav li { list-style: none; float: left; position: relative; top: 1px; margin: 0 .2em 1px 0; border-bottom: 0 !important; padding: 0; white-space: nowrap; }
-.ui-tabs .ui-tabs-nav li a { float: left; padding: .5em 1em; text-decoration: none; }
-.ui-tabs .ui-tabs-nav li.ui-tabs-selected { margin-bottom: 0; padding-bottom: 1px; }
-.ui-tabs .ui-tabs-nav li.ui-tabs-selected a, .ui-tabs .ui-tabs-nav li.ui-state-disabled a, .ui-tabs .ui-tabs-nav li.ui-state-processing a { cursor: text; }
-.ui-tabs .ui-tabs-nav li a, .ui-tabs.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-selected a { cursor: pointer; } /* first selector in group seems obsolete, but required to overcome bug in Opera applying cursor: text overall if defined elsewhere... */
-.ui-tabs .ui-tabs-panel { display: block; border-width: 0; padding: 1em 1.4em; background: none; }
-.ui-tabs .ui-tabs-hide { display: none !important; }
diff --git a/resources/jquery.ui/themes/default/jquery.ui.theme.css b/resources/jquery.ui/themes/default/jquery.ui.theme.css
deleted file mode 100644 (file)
index b7d2f61..0000000
+++ /dev/null
@@ -1,247 +0,0 @@
-/*!
- * jQuery UI CSS Framework 1.8.24
- *
- * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
- * Dual licensed under the MIT or GPL Version 2 licenses.
- * http://jquery.org/license
- *
- * http://docs.jquery.com/UI/Theming/API
- *
- * To view and modify this theme, visit http://jqueryui.com/themeroller/
- */
-
-
-/* Component containers
-----------------------------------*/
-.ui-widget { font-family: Verdana,Arial,sans-serif/*{ffDefault}*/; font-size: 1.1em/*{fsDefault}*/; }
-.ui-widget .ui-widget { font-size: 1em; }
-.ui-widget input, .ui-widget select, .ui-widget textarea, .ui-widget button { font-family: Verdana,Arial,sans-serif/*{ffDefault}*/; font-size: 1em; }
-.ui-widget-content { border: 1px solid #aaaaaa/*{borderColorContent}*/; background: #ffffff/*{bgColorContent}*/ url(images/ui-bg_flat_75_ffffff_40x100.png)/*{bgImgUrlContent}*/ 50%/*{bgContentXPos}*/ 50%/*{bgContentYPos}*/ repeat-x/*{bgContentRepeat}*/; color: #222222/*{fcContent}*/; }
-.ui-widget-content a { color: #222222/*{fcContent}*/; }
-.ui-widget-header { border: 1px solid #aaaaaa/*{borderColorHeader}*/; background: #cccccc/*{bgColorHeader}*/ url(images/ui-bg_highlight-soft_75_cccccc_1x100.png)/*{bgImgUrlHeader}*/ 50%/*{bgHeaderXPos}*/ 50%/*{bgHeaderYPos}*/ repeat-x/*{bgHeaderRepeat}*/; color: #222222/*{fcHeader}*/; font-weight: bold; }
-.ui-widget-header a { color: #222222/*{fcHeader}*/; }
-
-/* Interaction states
-----------------------------------*/
-.ui-state-default, .ui-widget-content .ui-state-default, .ui-widget-header .ui-state-default { border: 1px solid #d3d3d3/*{borderColorDefault}*/; background: #e6e6e6/*{bgColorDefault}*/ url(images/ui-bg_glass_75_e6e6e6_1x400.png)/*{bgImgUrlDefault}*/ 50%/*{bgDefaultXPos}*/ 50%/*{bgDefaultYPos}*/ repeat-x/*{bgDefaultRepeat}*/; font-weight: normal/*{fwDefault}*/; color: #555555/*{fcDefault}*/; }
-.ui-state-default a, .ui-state-default a:link, .ui-state-default a:visited { color: #555555/*{fcDefault}*/; text-decoration: none; }
-.ui-state-hover, .ui-widget-content .ui-state-hover, .ui-widget-header .ui-state-hover, .ui-state-focus, .ui-widget-content .ui-state-focus, .ui-widget-header .ui-state-focus { border: 1px solid #999999/*{borderColorHover}*/; background: #dadada/*{bgColorHover}*/ url(images/ui-bg_glass_75_dadada_1x400.png)/*{bgImgUrlHover}*/ 50%/*{bgHoverXPos}*/ 50%/*{bgHoverYPos}*/ repeat-x/*{bgHoverRepeat}*/; font-weight: normal/*{fwDefault}*/; color: #212121/*{fcHover}*/; }
-.ui-state-hover a, .ui-state-hover a:hover { color: #212121/*{fcHover}*/; text-decoration: none; }
-.ui-state-active, .ui-widget-content .ui-state-active, .ui-widget-header .ui-state-active { border: 1px solid #aaaaaa/*{borderColorActive}*/; background: #ffffff/*{bgColorActive}*/ url(images/ui-bg_glass_65_ffffff_1x400.png)/*{bgImgUrlActive}*/ 50%/*{bgActiveXPos}*/ 50%/*{bgActiveYPos}*/ repeat-x/*{bgActiveRepeat}*/; font-weight: normal/*{fwDefault}*/; color: #212121/*{fcActive}*/; }
-.ui-state-active a, .ui-state-active a:link, .ui-state-active a:visited { color: #212121/*{fcActive}*/; text-decoration: none; }
-.ui-widget :active { outline: none; }
-
-/* Interaction Cues
-----------------------------------*/
-.ui-state-highlight, .ui-widget-content .ui-state-highlight, .ui-widget-header .ui-state-highlight  {border: 1px solid #fcefa1/*{borderColorHighlight}*/; background: #fbf9ee/*{bgColorHighlight}*/ url(images/ui-bg_glass_55_fbf9ee_1x400.png)/*{bgImgUrlHighlight}*/ 50%/*{bgHighlightXPos}*/ 50%/*{bgHighlightYPos}*/ repeat-x/*{bgHighlightRepeat}*/; color: #363636/*{fcHighlight}*/; }
-.ui-state-highlight a, .ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a { color: #363636/*{fcHighlight}*/; }
-.ui-state-error, .ui-widget-content .ui-state-error, .ui-widget-header .ui-state-error {border: 1px solid #cd0a0a/*{borderColorError}*/; background: #fef1ec/*{bgColorError}*/ url(images/ui-bg_glass_95_fef1ec_1x400.png)/*{bgImgUrlError}*/ 50%/*{bgErrorXPos}*/ 50%/*{bgErrorYPos}*/ repeat-x/*{bgErrorRepeat}*/; color: #cd0a0a/*{fcError}*/; }
-.ui-state-error a, .ui-widget-content .ui-state-error a, .ui-widget-header .ui-state-error a { color: #cd0a0a/*{fcError}*/; }
-.ui-state-error-text, .ui-widget-content .ui-state-error-text, .ui-widget-header .ui-state-error-text { color: #cd0a0a/*{fcError}*/; }
-.ui-priority-primary, .ui-widget-content .ui-priority-primary, .ui-widget-header .ui-priority-primary { font-weight: bold; }
-.ui-priority-secondary, .ui-widget-content .ui-priority-secondary,  .ui-widget-header .ui-priority-secondary { opacity: .7; filter:Alpha(Opacity=70); font-weight: normal; }
-.ui-state-disabled, .ui-widget-content .ui-state-disabled, .ui-widget-header .ui-state-disabled { opacity: .35; filter:Alpha(Opacity=35); background-image: none; }
-
-/* Icons
-----------------------------------*/
-
-/* states and images */
-.ui-icon { width: 16px; height: 16px; background-image: url(images/ui-icons_222222_256x240.png)/*{iconsContent}*/; }
-.ui-widget-content .ui-icon {background-image: url(images/ui-icons_222222_256x240.png)/*{iconsContent}*/; }
-.ui-widget-header .ui-icon {background-image: url(images/ui-icons_222222_256x240.png)/*{iconsHeader}*/; }
-.ui-state-default .ui-icon { background-image: url(images/ui-icons_888888_256x240.png)/*{iconsDefault}*/; }
-.ui-state-hover .ui-icon, .ui-state-focus .ui-icon {background-image: url(images/ui-icons_454545_256x240.png)/*{iconsHover}*/; }
-.ui-state-active .ui-icon {background-image: url(images/ui-icons_454545_256x240.png)/*{iconsActive}*/; }
-.ui-state-highlight .ui-icon {background-image: url(images/ui-icons_2e83ff_256x240.png)/*{iconsHighlight}*/; }
-.ui-state-error .ui-icon, .ui-state-error-text .ui-icon {background-image: url(images/ui-icons_cd0a0a_256x240.png)/*{iconsError}*/; }
-
-/* positioning */
-.ui-icon-carat-1-n { background-position: 0 0; }
-.ui-icon-carat-1-ne { background-position: -16px 0; }
-.ui-icon-carat-1-e { background-position: -32px 0; }
-.ui-icon-carat-1-se { background-position: -48px 0; }
-.ui-icon-carat-1-s { background-position: -64px 0; }
-.ui-icon-carat-1-sw { background-position: -80px 0; }
-.ui-icon-carat-1-w { background-position: -96px 0; }
-.ui-icon-carat-1-nw { background-position: -112px 0; }
-.ui-icon-carat-2-n-s { background-position: -128px 0; }
-.ui-icon-carat-2-e-w { background-position: -144px 0; }
-.ui-icon-triangle-1-n { background-position: 0 -16px; }
-.ui-icon-triangle-1-ne { background-position: -16px -16px; }
-.ui-icon-triangle-1-e { background-position: -32px -16px; }
-.ui-icon-triangle-1-se { background-position: -48px -16px; }
-.ui-icon-triangle-1-s { background-position: -64px -16px; }
-.ui-icon-triangle-1-sw { background-position: -80px -16px; }
-.ui-icon-triangle-1-w { background-position: -96px -16px; }
-.ui-icon-triangle-1-nw { background-position: -112px -16px; }
-.ui-icon-triangle-2-n-s { background-position: -128px -16px; }
-.ui-icon-triangle-2-e-w { background-position: -144px -16px; }
-.ui-icon-arrow-1-n { background-position: 0 -32px; }
-.ui-icon-arrow-1-ne { background-position: -16px -32px; }
-.ui-icon-arrow-1-e { background-position: -32px -32px; }
-.ui-icon-arrow-1-se { background-position: -48px -32px; }
-.ui-icon-arrow-1-s { background-position: -64px -32px; }
-.ui-icon-arrow-1-sw { background-position: -80px -32px; }
-.ui-icon-arrow-1-w { background-position: -96px -32px; }
-.ui-icon-arrow-1-nw { background-position: -112px -32px; }
-.ui-icon-arrow-2-n-s { background-position: -128px -32px; }
-.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; }
-.ui-icon-arrow-2-e-w { background-position: -160px -32px; }
-.ui-icon-arrow-2-se-nw { background-position: -176px -32px; }
-.ui-icon-arrowstop-1-n { background-position: -192px -32px; }
-.ui-icon-arrowstop-1-e { background-position: -208px -32px; }
-.ui-icon-arrowstop-1-s { background-position: -224px -32px; }
-.ui-icon-arrowstop-1-w { background-position: -240px -32px; }
-.ui-icon-arrowthick-1-n { background-position: 0 -48px; }
-.ui-icon-arrowthick-1-ne { background-position: -16px -48px; }
-.ui-icon-arrowthick-1-e { background-position: -32px -48px; }
-.ui-icon-arrowthick-1-se { background-position: -48px -48px; }
-.ui-icon-arrowthick-1-s { background-position: -64px -48px; }
-.ui-icon-arrowthick-1-sw { background-position: -80px -48px; }
-.ui-icon-arrowthick-1-w { background-position: -96px -48px; }
-.ui-icon-arrowthick-1-nw { background-position: -112px -48px; }
-.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; }
-.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; }
-.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; }
-.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; }
-.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; }
-.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; }
-.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; }
-.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; }
-.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; }
-.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; }
-.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; }
-.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; }
-.ui-icon-arrowreturn-1-w { background-position: -64px -64px; }
-.ui-icon-arrowreturn-1-n { background-position: -80px -64px; }
-.ui-icon-arrowreturn-1-e { background-position: -96px -64px; }
-.ui-icon-arrowreturn-1-s { background-position: -112px -64px; }
-.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; }
-.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; }
-.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; }
-.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; }
-.ui-icon-arrow-4 { background-position: 0 -80px; }
-.ui-icon-arrow-4-diag { background-position: -16px -80px; }
-.ui-icon-extlink { background-position: -32px -80px; }
-.ui-icon-newwin { background-position: -48px -80px; }
-.ui-icon-refresh { background-position: -64px -80px; }
-.ui-icon-shuffle { background-position: -80px -80px; }
-.ui-icon-transfer-e-w { background-position: -96px -80px; }
-.ui-icon-transferthick-e-w { background-position: -112px -80px; }
-.ui-icon-folder-collapsed { background-position: 0 -96px; }
-.ui-icon-folder-open { background-position: -16px -96px; }
-.ui-icon-document { background-position: -32px -96px; }
-.ui-icon-document-b { background-position: -48px -96px; }
-.ui-icon-note { background-position: -64px -96px; }
-.ui-icon-mail-closed { background-position: -80px -96px; }
-.ui-icon-mail-open { background-position: -96px -96px; }
-.ui-icon-suitcase { background-position: -112px -96px; }
-.ui-icon-comment { background-position: -128px -96px; }
-.ui-icon-person { background-position: -144px -96px; }
-.ui-icon-print { background-position: -160px -96px; }
-.ui-icon-trash { background-position: -176px -96px; }
-.ui-icon-locked { background-position: -192px -96px; }
-.ui-icon-unlocked { background-position: -208px -96px; }
-.ui-icon-bookmark { background-position: -224px -96px; }
-.ui-icon-tag { background-position: -240px -96px; }
-.ui-icon-home { background-position: 0 -112px; }
-.ui-icon-flag { background-position: -16px -112px; }
-.ui-icon-calendar { background-position: -32px -112px; }
-.ui-icon-cart { background-position: -48px -112px; }
-.ui-icon-pencil { background-position: -64px -112px; }
-.ui-icon-clock { background-position: -80px -112px; }
-.ui-icon-disk { background-position: -96px -112px; }
-.ui-icon-calculator { background-position: -112px -112px; }
-.ui-icon-zoomin { background-position: -128px -112px; }
-.ui-icon-zoomout { background-position: -144px -112px; }
-.ui-icon-search { background-position: -160px -112px; }
-.ui-icon-wrench { background-position: -176px -112px; }
-.ui-icon-gear { background-position: -192px -112px; }
-.ui-icon-heart { background-position: -208px -112px; }
-.ui-icon-star { background-position: -224px -112px; }
-.ui-icon-link { background-position: -240px -112px; }
-.ui-icon-cancel { background-position: 0 -128px; }
-.ui-icon-plus { background-position: -16px -128px; }
-.ui-icon-plusthick { background-position: -32px -128px; }
-.ui-icon-minus { background-position: -48px -128px; }
-.ui-icon-minusthick { background-position: -64px -128px; }
-.ui-icon-close { background-position: -80px -128px; }
-.ui-icon-closethick { background-position: -96px -128px; }
-.ui-icon-key { background-position: -112px -128px; }
-.ui-icon-lightbulb { background-position: -128px -128px; }
-.ui-icon-scissors { background-position: -144px -128px; }
-.ui-icon-clipboard { background-position: -160px -128px; }
-.ui-icon-copy { background-position: -176px -128px; }
-.ui-icon-contact { background-position: -192px -128px; }
-.ui-icon-image { background-position: -208px -128px; }
-.ui-icon-video { background-position: -224px -128px; }
-.ui-icon-script { background-position: -240px -128px; }
-.ui-icon-alert { background-position: 0 -144px; }
-.ui-icon-info { background-position: -16px -144px; }
-.ui-icon-notice { background-position: -32px -144px; }
-.ui-icon-help { background-position: -48px -144px; }
-.ui-icon-check { background-position: -64px -144px; }
-.ui-icon-bullet { background-position: -80px -144px; }
-.ui-icon-radio-off { background-position: -96px -144px; }
-.ui-icon-radio-on { background-position: -112px -144px; }
-.ui-icon-pin-w { background-position: -128px -144px; }
-.ui-icon-pin-s { background-position: -144px -144px; }
-.ui-icon-play { background-position: 0 -160px; }
-.ui-icon-pause { background-position: -16px -160px; }
-.ui-icon-seek-next { background-position: -32px -160px; }
-.ui-icon-seek-prev { background-position: -48px -160px; }
-.ui-icon-seek-end { background-position: -64px -160px; }
-.ui-icon-seek-start { background-position: -80px -160px; }
-/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */
-.ui-icon-seek-first { background-position: -80px -160px; }
-.ui-icon-stop { background-position: -96px -160px; }
-.ui-icon-eject { background-position: -112px -160px; }
-.ui-icon-volume-off { background-position: -128px -160px; }
-.ui-icon-volume-on { background-position: -144px -160px; }
-.ui-icon-power { background-position: 0 -176px; }
-.ui-icon-signal-diag { background-position: -16px -176px; }
-.ui-icon-signal { background-position: -32px -176px; }
-.ui-icon-battery-0 { background-position: -48px -176px; }
-.ui-icon-battery-1 { background-position: -64px -176px; }
-.ui-icon-battery-2 { background-position: -80px -176px; }
-.ui-icon-battery-3 { background-position: -96px -176px; }
-.ui-icon-circle-plus { background-position: 0 -192px; }
-.ui-icon-circle-minus { background-position: -16px -192px; }
-.ui-icon-circle-close { background-position: -32px -192px; }
-.ui-icon-circle-triangle-e { background-position: -48px -192px; }
-.ui-icon-circle-triangle-s { background-position: -64px -192px; }
-.ui-icon-circle-triangle-w { background-position: -80px -192px; }
-.ui-icon-circle-triangle-n { background-position: -96px -192px; }
-.ui-icon-circle-arrow-e { background-position: -112px -192px; }
-.ui-icon-circle-arrow-s { background-position: -128px -192px; }
-.ui-icon-circle-arrow-w { background-position: -144px -192px; }
-.ui-icon-circle-arrow-n { background-position: -160px -192px; }
-.ui-icon-circle-zoomin { background-position: -176px -192px; }
-.ui-icon-circle-zoomout { background-position: -192px -192px; }
-.ui-icon-circle-check { background-position: -208px -192px; }
-.ui-icon-circlesmall-plus { background-position: 0 -208px; }
-.ui-icon-circlesmall-minus { background-position: -16px -208px; }
-.ui-icon-circlesmall-close { background-position: -32px -208px; }
-.ui-icon-squaresmall-plus { background-position: -48px -208px; }
-.ui-icon-squaresmall-minus { background-position: -64px -208px; }
-.ui-icon-squaresmall-close { background-position: -80px -208px; }
-.ui-icon-grip-dotted-vertical { background-position: 0 -224px; }
-.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; }
-.ui-icon-grip-solid-vertical { background-position: -32px -224px; }
-.ui-icon-grip-solid-horizontal { background-position: -48px -224px; }
-.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; }
-.ui-icon-grip-diagonal-se { background-position: -80px -224px; }
-
-
-/* Misc visuals
-----------------------------------*/
-
-/* Corner radius */
-.ui-corner-all, .ui-corner-top, .ui-corner-left, .ui-corner-tl { -moz-border-radius-topleft: 4px/*{cornerRadius}*/; -webkit-border-top-left-radius: 4px/*{cornerRadius}*/; -khtml-border-top-left-radius: 4px/*{cornerRadius}*/; border-top-left-radius: 4px/*{cornerRadius}*/; }
-.ui-corner-all, .ui-corner-top, .ui-corner-right, .ui-corner-tr { -moz-border-radius-topright: 4px/*{cornerRadius}*/; -webkit-border-top-right-radius: 4px/*{cornerRadius}*/; -khtml-border-top-right-radius: 4px/*{cornerRadius}*/; border-top-right-radius: 4px/*{cornerRadius}*/; }
-.ui-corner-all, .ui-corner-bottom, .ui-corner-left, .ui-corner-bl { -moz-border-radius-bottomleft: 4px/*{cornerRadius}*/; -webkit-border-bottom-left-radius: 4px/*{cornerRadius}*/; -khtml-border-bottom-left-radius: 4px/*{cornerRadius}*/; border-bottom-left-radius: 4px/*{cornerRadius}*/; }
-.ui-corner-all, .ui-corner-bottom, .ui-corner-right, .ui-corner-br { -moz-border-radius-bottomright: 4px/*{cornerRadius}*/; -webkit-border-bottom-right-radius: 4px/*{cornerRadius}*/; -khtml-border-bottom-right-radius: 4px/*{cornerRadius}*/; border-bottom-right-radius: 4px/*{cornerRadius}*/; }
-
-/* Overlays */
-.ui-widget-overlay { background: #aaaaaa/*{bgColorOverlay}*/ url(images/ui-bg_flat_0_aaaaaa_40x100.png)/*{bgImgUrlOverlay}*/ 50%/*{bgOverlayXPos}*/ 50%/*{bgOverlayYPos}*/ repeat-x/*{bgOverlayRepeat}*/; opacity: .3;filter:Alpha(Opacity=30)/*{opacityOverlay}*/; }
-.ui-widget-shadow { margin: -8px/*{offsetTopShadow}*/ 0 0 -8px/*{offsetLeftShadow}*/; padding: 8px/*{thicknessShadow}*/; background: #aaaaaa/*{bgColorShadow}*/ url(images/ui-bg_flat_0_aaaaaa_40x100.png)/*{bgImgUrlShadow}*/ 50%/*{bgShadowXPos}*/ 50%/*{bgShadowYPos}*/ repeat-x/*{bgShadowRepeat}*/; opacity: .3;filter:Alpha(Opacity=30)/*{opacityShadow}*/; -moz-border-radius: 8px/*{cornerRadiusShadow}*/; -khtml-border-radius: 8px/*{cornerRadiusShadow}*/; -webkit-border-radius: 8px/*{cornerRadiusShadow}*/; border-radius: 8px/*{cornerRadiusShadow}*/; }
\ No newline at end of file
diff --git a/resources/jquery.ui/themes/vector/images/close.png b/resources/jquery.ui/themes/vector/images/close.png
deleted file mode 100644 (file)
index ef0dd9e..0000000
Binary files a/resources/jquery.ui/themes/vector/images/close.png and /dev/null differ
diff --git a/resources/jquery.ui/themes/vector/images/titlebar-fade.png b/resources/jquery.ui/themes/vector/images/titlebar-fade.png
deleted file mode 100644 (file)
index 12a80c8..0000000
Binary files a/resources/jquery.ui/themes/vector/images/titlebar-fade.png and /dev/null differ
diff --git a/resources/jquery.ui/themes/vector/images/ui-anim_basic_16x16.gif b/resources/jquery.ui/themes/vector/images/ui-anim_basic_16x16.gif
deleted file mode 100644 (file)
index 085ccae..0000000
Binary files a/resources/jquery.ui/themes/vector/images/ui-anim_basic_16x16.gif and /dev/null differ
diff --git a/resources/jquery.ui/themes/vector/images/ui-bg_flat_15_cd0a0a_40x100.png b/resources/jquery.ui/themes/vector/images/ui-bg_flat_15_cd0a0a_40x100.png
deleted file mode 100644 (file)
index 09de537..0000000
Binary files a/resources/jquery.ui/themes/vector/images/ui-bg_flat_15_cd0a0a_40x100.png and /dev/null differ
diff --git a/resources/jquery.ui/themes/vector/images/ui-bg_flat_70_000000_40x100.png b/resources/jquery.ui/themes/vector/images/ui-bg_flat_70_000000_40x100.png
deleted file mode 100644 (file)
index c06dd56..0000000
Binary files a/resources/jquery.ui/themes/vector/images/ui-bg_flat_70_000000_40x100.png and /dev/null differ
diff --git a/resources/jquery.ui/themes/vector/images/ui-bg_highlight-hard_100_f2f5f7_1x100.png b/resources/jquery.ui/themes/vector/images/ui-bg_highlight-hard_100_f2f5f7_1x100.png
deleted file mode 100644 (file)
index 5308b46..0000000
Binary files a/resources/jquery.ui/themes/vector/images/ui-bg_highlight-hard_100_f2f5f7_1x100.png and /dev/null differ
diff --git a/resources/jquery.ui/themes/vector/images/ui-bg_highlight-hard_80_d7ebf9_1x100.png b/resources/jquery.ui/themes/vector/images/ui-bg_highlight-hard_80_d7ebf9_1x100.png
deleted file mode 100644 (file)
index 0c8997f..0000000
Binary files a/resources/jquery.ui/themes/vector/images/ui-bg_highlight-hard_80_d7ebf9_1x100.png and /dev/null differ
diff --git a/resources/jquery.ui/themes/vector/images/ui-bg_highlight-soft_100_e4f1fb_1x100.png b/resources/jquery.ui/themes/vector/images/ui-bg_highlight-soft_100_e4f1fb_1x100.png
deleted file mode 100644 (file)
index 3149255..0000000
Binary files a/resources/jquery.ui/themes/vector/images/ui-bg_highlight-soft_100_e4f1fb_1x100.png and /dev/null differ
diff --git a/resources/jquery.ui/themes/vector/images/ui-bg_highlight-soft_100_ffffff_1x100.png b/resources/jquery.ui/themes/vector/images/ui-bg_highlight-soft_100_ffffff_1x100.png
deleted file mode 100644 (file)
index 09b2376..0000000
Binary files a/resources/jquery.ui/themes/vector/images/ui-bg_highlight-soft_100_ffffff_1x100.png and /dev/null differ
diff --git a/resources/jquery.ui/themes/vector/images/ui-bg_highlight-soft_25_ffef8f_1x100.png b/resources/jquery.ui/themes/vector/images/ui-bg_highlight-soft_25_ffef8f_1x100.png
deleted file mode 100644 (file)
index 66627c1..0000000
Binary files a/resources/jquery.ui/themes/vector/images/ui-bg_highlight-soft_25_ffef8f_1x100.png and /dev/null differ
diff --git a/resources/jquery.ui/themes/vector/images/ui-bg_inset-hard_100_f0f0f0_1x100.png b/resources/jquery.ui/themes/vector/images/ui-bg_inset-hard_100_f0f0f0_1x100.png
deleted file mode 100644 (file)
index ccb6dc0..0000000
Binary files a/resources/jquery.ui/themes/vector/images/ui-bg_inset-hard_100_f0f0f0_1x100.png and /dev/null differ
diff --git a/resources/jquery.ui/themes/vector/images/ui-icons_2694e8_256x240.png b/resources/jquery.ui/themes/vector/images/ui-icons_2694e8_256x240.png
deleted file mode 100644 (file)
index 998ac3b..0000000
Binary files a/resources/jquery.ui/themes/vector/images/ui-icons_2694e8_256x240.png and /dev/null differ
diff --git a/resources/jquery.ui/themes/vector/images/ui-icons_2e83ff_256x240.png b/resources/jquery.ui/themes/vector/images/ui-icons_2e83ff_256x240.png
deleted file mode 100644 (file)
index 34e38d1..0000000
Binary files a/resources/jquery.ui/themes/vector/images/ui-icons_2e83ff_256x240.png and /dev/null differ
diff --git a/resources/jquery.ui/themes/vector/images/ui-icons_3d80b3_256x240.png b/resources/jquery.ui/themes/vector/images/ui-icons_3d80b3_256x240.png
deleted file mode 100644 (file)
index ec129a8..0000000
Binary files a/resources/jquery.ui/themes/vector/images/ui-icons_3d80b3_256x240.png and /dev/null differ
diff --git a/resources/jquery.ui/themes/vector/images/ui-icons_666666_256x240.png b/resources/jquery.ui/themes/vector/images/ui-icons_666666_256x240.png
deleted file mode 100644 (file)
index a32c57d..0000000
Binary files a/resources/jquery.ui/themes/vector/images/ui-icons_666666_256x240.png and /dev/null differ
diff --git a/resources/jquery.ui/themes/vector/images/ui-icons_72a7cf_256x240.png b/resources/jquery.ui/themes/vector/images/ui-icons_72a7cf_256x240.png
deleted file mode 100644 (file)
index 88fad1a..0000000
Binary files a/resources/jquery.ui/themes/vector/images/ui-icons_72a7cf_256x240.png and /dev/null differ
diff --git a/resources/jquery.ui/themes/vector/images/ui-icons_ffffff_256x240.png b/resources/jquery.ui/themes/vector/images/ui-icons_ffffff_256x240.png
deleted file mode 100644 (file)
index 29ba7d2..0000000
Binary files a/resources/jquery.ui/themes/vector/images/ui-icons_ffffff_256x240.png and /dev/null differ
diff --git a/resources/jquery.ui/themes/vector/jquery.ui.accordion.css b/resources/jquery.ui/themes/vector/jquery.ui.accordion.css
deleted file mode 100644 (file)
index 8d8a1a6..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
-/* Accordion
-----------------------------------*/
-.ui-accordion .ui-accordion-header { cursor: pointer; position: relative; margin-top: 1px; zoom: 1; }
-.ui-accordion .ui-accordion-li-fix { display: inline; }
-.ui-accordion .ui-accordion-header-active { border-bottom: 0 !important; }
-.ui-accordion .ui-accordion-header a { display: block; font-size: 1em; padding: .5em .5em .5em .7em; }
-/* IE7-/Win - Fix extra vertical space in lists */
-.ui-accordion a { zoom: 1; }
-.ui-accordion-icons .ui-accordion-header a { padding-left: 2.2em; }
-.ui-accordion .ui-accordion-header .ui-icon { position: absolute; left: .5em; top: 50%; margin-top: -8px; }
-.ui-accordion .ui-accordion-content { padding: 1em 2.2em; border-top: 0; margin-top: -2px; position: relative; top: 1px; margin-bottom: 2px; overflow: auto; display: none; zoom: 1; }
-.ui-accordion .ui-accordion-content-active { display: block; }
\ No newline at end of file
diff --git a/resources/jquery.ui/themes/vector/jquery.ui.autocomplete.css b/resources/jquery.ui/themes/vector/jquery.ui.autocomplete.css
deleted file mode 100644 (file)
index c06fd18..0000000
+++ /dev/null
@@ -1,40 +0,0 @@
-/* Autocomplete
-----------------------------------*/
-.ui-autocomplete { position: absolute; cursor: default; }      
-.ui-autocomplete-loading { /* @embed */ background: white url('images/ui-anim_basic_16x16.gif') right center no-repeat; }
-
-/* workarounds */
-* html .ui-autocomplete { width:1px; } /* without this, the menu expands to 100% in IE6 */
-
-/* Menu
-----------------------------------*/
-.ui-menu {
-       list-style:none;
-       padding: 2px;
-       margin: 0;
-       display:block;
-       float: left;
-}
-.ui-menu .ui-menu {
-       margin-top: -3px;
-}
-.ui-menu .ui-menu-item {
-       margin:0;
-       padding: 0;
-       zoom: 1;
-       float: left;
-       clear: left;
-       width: 100%;
-}
-.ui-menu .ui-menu-item a {
-       text-decoration:none;
-       display:block;
-       padding:.2em .4em;
-       line-height:1.5;
-       zoom:1;
-}
-.ui-menu .ui-menu-item a.ui-state-hover,
-.ui-menu .ui-menu-item a.ui-state-active {
-       font-weight: normal;
-       margin: -1px;
-}
diff --git a/resources/jquery.ui/themes/vector/jquery.ui.button.css b/resources/jquery.ui/themes/vector/jquery.ui.button.css
deleted file mode 100644 (file)
index ea14723..0000000
+++ /dev/null
@@ -1,379 +0,0 @@
-/* Button
-----------------------------------*/
-
-.ui-button {
-       display: inline-block;
-       position: relative;
-       padding: 0;
-       margin-right: .1em;
-       text-decoration: none !important;
-       cursor: pointer;
-       text-align: center;
-       zoom: 1;
-       overflow: visible; /* the overflow property removes extra width in IE */
-}
-
-/*button text element */
-.ui-button .ui-button-text {
-       display: block;
-       line-height: 1.4;
-       text-shadow: 0 1px 1px #fff;
-}
-.ui-button-text-only .ui-button-text {
-       padding: 0.3em 1em 0.25em 1em;
-}
-.ui-button-icon-only .ui-button-text,
-.ui-button-icons-only .ui-button-text {
-       padding: 0.3em;
-       text-indent: -9999999px;
-}
-.ui-button-text-icon-primary .ui-button-text,
-.ui-button-text-icons .ui-button-text {
-       padding: 0.3em 1em 0.25em 2.1em;
-}
-.ui-button-text-icon-secondary .ui-button-text,
-.ui-button-text-icons .ui-button-text {
-       padding: 0.3em 2.1em 0.25em 1em;
-}
-.ui-button-text-icons .ui-button-text {
-       padding-left: 2.1em;
-       padding-right: 2.1em;
-}
-
-/* no icon support for input elements, provide padding by default */
-input.ui-button {
-       padding: 0.3em 1em;
-}
-
-/*button icon element(s) */
-.ui-button-icon-only .ui-icon,
-.ui-button-text-icon-primary .ui-icon,
-.ui-button-text-icon-secondary .ui-icon,
-.ui-button-text-icons .ui-icon,
-.ui-button-text-icon .ui-icon,
-.ui-button-icons-only .ui-icon {
-       position: absolute;
-       top: 50%;
-       margin-top: -9px;
-}
-.ui-button-icon-only .ui-icon {
-       left: 50%;
-       margin-left: -8px;
-}
-.ui-button-text-icon-primary .ui-button-icon-primary,
-.ui-button-text-icon .ui-button-icon-primary,
-.ui-button-text-icons .ui-button-icon-primary,
-.ui-button-icons-only .ui-button-icon-primary {
-       left: 0.5em;
-}
-.ui-button-text-icon-secondary .ui-button-icon-secondary,
-.ui-button-text-icon .ui-button-icon-secondary,
-.ui-button-text-icons .ui-button-icon-secondary,
-.ui-button-icons-only .ui-button-icon-secondary {
-       right: 0.5em;
-}
-
-/*button sets*/
-.ui-buttonset {
-       margin-right: 7px;
-}
-.ui-buttonset .ui-button {
-       margin-left: 0;
-       margin-right: -.4em;
-}
-
-/* workarounds */
-button.ui-button::-moz-focus-inner {
-       border: 0;
-       padding: 0; /* reset extra padding in Firefox */
-}
-/* Disables the annoying dashed border Firefox puts on active buttons */
-body button.ui-button::-moz-focus-inner {
-       border: 0;
-}
-/* Give large buttons some extra padding */
-body .ui-button-large {
-       padding: 5px;
-}
-/* Use white icons for colored buttons */
-.ui-button-green .ui-icon,
-.ui-button-blue .ui-icon,
-.ui-button-red .ui-icon,
-.ui-button-orange .ui-icon {
-       /* @embed */
-       background-image: url(images/ui-icons_ffffff_256x240.png) !important;
-}
-
-/* Corner radius */
-/* This is normally handled in jquery.ui.theme.css, but in our case, the corner
-   styling of our buttons doesn't match our default widget corner styling */
-.ui-button.ui-corner-all,
-.ui-button.ui-corner-top,
-.ui-button.ui-corner-left,
-.ui-button.ui-corner-tl {
-       -moz-border-radius-topleft: 4px;
-       -webkit-border-top-left-radius: 4px;
-       border-top-left-radius: 4px;
-}
-.ui-button.ui-corner-all,
-.ui-button.ui-corner-top,
-
-.ui-button.ui-corner-right,
-.ui-button.ui-corner-tr {
-       -moz-border-radius-topright: 4px;
-       -webkit-border-top-right-radius: 4px;
-       border-top-right-radius: 4px;
-}
-.ui-button.ui-corner-all,
-.ui-button.ui-corner-bottom,
-.ui-button.ui-corner-left,
-.ui-button.ui-corner-bl {
-       -moz-border-radius-bottomleft: 4px;
-       -webkit-border-bottom-left-radius: 4px;
-       border-bottom-left-radius: 4px;
-}
-.ui-button.ui-corner-all,
-.ui-button.ui-corner-bottom,
-.ui-button.ui-corner-right,
-.ui-button.ui-corner-br {
-       -moz-border-radius-bottomright: 4px;
-       -webkit-border-bottom-right-radius: 4px;
-       border-bottom-right-radius: 4px;
-}
-
-body .ui-button {
-       color: #2779aa;
-       margin: 0.5em 0 0.5em 0.4em;
-       border: 1px solid #aaa !important;
-       background: #f0f0f0 !important;
-       background: -moz-linear-gradient(top, #fff 0%, #ddd 90%) !important; /* FF3.6+ */
-       background: -webkit-linear-gradient(top, #fff 0%, #ddd 90%) !important; /* Chrome10+, Safari5.1+ */
-       background: -o-linear-gradient(top, #fff 0%, #ddd 90%) !important; /* Opera 11.10+ */
-       background: -ms-linear-gradient(top, #fff 0%, #ddd 90%) !important; /* IE10+ */
-       background: linear-gradient(to bottom, #fff 0%, #ddd 90%) !important;
-       filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#dddddd', GradientType=0); /* IE6-8 */
-       cursor: pointer;
-       font-size: 1em;
-       line-height: 1.4em;
-       width: auto;
-       overflow: visible;
-       -webkit-box-shadow: 0 1px 3px rgba(0,0,0,.2);
-       -moz-box-shadow: 0 1px 3px rgba(0,0,0,.2);
-       box-shadow: 0 1px 3px rgba(0,0,0,.2);
-}
-
-body .ui-button-icon-only {
-       width: 2.2em;
-}
-
-body .ui-button-icons-only {
-       width: 3.4em;
-}
-
-body .ui-button:hover {
-       color: #2779aa;
-       border-color: #bbb !important;
-       background: #fff !important;
-       background: -moz-linear-gradient(top, #fff 0%, #eee 90%) !important; /* FF3.6+ */
-       background: -webkit-linear-gradient(top, #fff 0%, #eee 90%) !important; /* Chrome10+, Safari5.1+ */
-       background: -o-linear-gradient(top, #fff 0%, #eee 90%) !important; /* Opera 11.10+ */
-       background: -ms-linear-gradient(top, #fff 0%, #eee 90%) !important; /* IE10+ */
-       background: linear-gradient(to bottom, #fff 0%, #eee 90%) !important;
-       filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#eeeeee', GradientType=0); /* IE6-8 */
-       -webkit-box-shadow: 0 1px 3px rgba(0,0,0,.1);
-       -moz-box-shadow: 0 1px 3px rgba(0,0,0,.1);
-       box-shadow: 0 1px 3px rgba(0,0,0,.1);
-}
-body .ui-button:active,
-body .ui-button:focus {
-       border-color: #8ad !important;
-       -webkit-box-shadow: 0 0 1px 1px rgba(167,215,249,.5);
-       -moz-box-shadow: 0 0 1px 1px rgba(167,215,249,.5);
-       box-shadow: 0 0 1px 1px rgba(167,215,249,.5);
-}
-body .ui-button:active {
-       background: #e0e0e0 !important;
-       background: -moz-linear-gradient(top, #f0f0f0 0%, #d0d0d0 90%) !important; /* FF3.6+ */
-       background: -webkit-linear-gradient(top, #f0f0f0 0%, #d0d0d0 90%) !important; /* Chrome10+, Safari5.1+ */
-       background: -o-linear-gradient(top, #f0f0f0 0%, #d0d0d0 90%) !important; /* Opera 11.10+ */
-       background: -ms-linear-gradient(top, #f0f0f0 0%, #d0d0d0 90%) !important; /* IE10+ */
-       background: linear-gradient(to bottom, #f0f0f0 0%, #d0d0d0 90%) !important;
-       filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#f0f0f0', endColorstr='#d0d0d0', GradientType=0); /* IE6-8 */
-}
-
-/* Green buttons */
-body .ui-button-green,
-body .ui-button-green .ui-button-text {
-       color: white;
-       text-shadow: 0 -1px 1px #072;
-}
-body .ui-button.ui-button-green {
-       border-color: #294 !important;
-       background: #295 !important;
-       background: -moz-linear-gradient(top, #3c8 0%, #295 90%) !important; /* FF3.6+ */
-       background: -webkit-linear-gradient(top, #3c8 0%, #295 90%) !important; /* Chrome10+, Safari5.1+ */
-       background: -o-linear-gradient(top, #3c8 0%, #295 90%) !important; /* Opera 11.10+ */
-       background: -ms-linear-gradient(top, #3c8 0%, #295 90%) !important; /* IE10+ */
-       background: linear-gradient(to bottom, #3c8 0%, #295 90%) !important;
-       filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#33cc88', endColorstr='#229955', GradientType=0); /* IE6-8 */
-       -webkit-box-shadow: 0 1px 3px rgba(0,0,0,.3);
-       -moz-box-shadow: 0 1px 3px rgba(0,0,0,.3);
-       box-shadow: 0 1px 3px rgba(0,0,0,.3);
-}
-body .ui-button.ui-button-green:hover {
-       background: #33a055 !important;
-       background: -moz-linear-gradient(top, #44d388 0%, #33a055 90%) !important; /* FF3.6+ */
-       background: -webkit-linear-gradient(top, #44d388 0%, #33a055 90%) !important; /* Chrome10+, Safari5.1+ */
-       background: -o-linear-gradient(top, #44d388 0%, #33a055 90%) !important; /* Opera 11.10+ */
-       background: -ms-linear-gradient(top, #44d388 0%, #33a055 90%) !important; /* IE10+ */
-       background: linear-gradient(to bottom, #44d388 0%, #33a055 90%) !important;
-       filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#44d388', endColorstr='#33a055', GradientType=0); /* IE6-8 */
-       -webkit-box-shadow: 0 1px 3px rgba(0,0,0,.25);
-       -moz-box-shadow: 0 1px 3px rgba(0,0,0,.25);
-       box-shadow: 0 1px 3px rgba(0,0,0,.25);
-}
-body .ui-button.ui-button-green:active,
-body .ui-button.ui-button-green:focus {
-       border-color: #172 !important;
-       -webkit-box-shadow: 0 0 2px 2px rgba(167,215,249,.75);
-       -moz-box-shadow: 0 0 2px 2px rgba(167,215,249,.75);
-       box-shadow: 0 0 2px 2px rgba(167,215,249,.75);
-}
-body .ui-button.ui-button-green:active {
-       background: #338855 !important;
-       background: -moz-linear-gradient(top, #30c080 0%, #338855 90%) !important; /* FF3.6+ */
-       background: -webkit-linear-gradient(top, #30c080 0%, #338855 90%) !important; /* Chrome10+, Safari5.1+ */
-       background: -o-linear-gradient(top, #30c080 0%, #338855 90%) !important; /* Opera 11.10+ */
-       background: -ms-linear-gradient(top, #30c080 0%, #338855 90%) !important; /* IE10+ */
-       background: linear-gradient(to bottom, #30c080 0%, #338855 90%) !important;
-       filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#30c080', endColorstr='#338855', GradientType=0); /* IE6-8 */
-}
-
-/* Blue buttons */
-body .ui-button-blue,
-body .ui-button-blue .ui-button-text {
-       color: white;
-       text-shadow: 0 -1px 1px #037;
-}
-body .ui-button.ui-button-blue {
-       border-color: #468 !important;
-       background: #36b !important;
-       background: -moz-linear-gradient(top, #48e 0%, #36b 90%) !important; /* FF3.6+ */
-       background: -webkit-linear-gradient(top, #48e 0%, #36b 90%) !important; /* Chrome10+, Safari5.1+ */
-       background: -o-linear-gradient(top, #48e 0%, #36b 90%) !important; /* Opera 11.10+ */
-       background: -ms-linear-gradient(top, #48e 0%, #36b 90%) !important; /* IE10+ */
-       background: linear-gradient(to bottom, #48e 0%, #36b 90%) !important;
-       filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#4488ee', endColorstr='#3366bb', GradientType=0); /* IE6-8 */
-       -webkit-box-shadow: 0 1px 3px rgba(0,0,0,.35);
-       -moz-box-shadow: 0 1px 3px rgba(0,0,0,.35);
-       box-shadow: 0 1px 3px rgba(0,0,0,.35);
-}
-body .ui-button.ui-button-blue:hover {
-       background: #36c !important;
-       background: -moz-linear-gradient(top, #59e 0%, #36c 90%) !important; /* FF3.6+ */
-       background: -webkit-linear-gradient(top, #59e 0%, #36c 90%) !important; /* Chrome10+, Safari5.1+ */
-       background: -o-linear-gradient(top, #59e 0%, #36c 90%) !important; /* Opera 11.10+ */
-       background: -ms-linear-gradient(top, #59e 0%, #36c 90%) !important; /* IE10+ */
-       background: linear-gradient(to bottom, #59e 0%, #36c 90%) !important;
-       filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#5599ee', endColorstr='#3366cc', GradientType=0); /* IE6-8 */
-}
-body .ui-button.ui-button-blue:active,
-body .ui-button.ui-button-blue:focus {
-       border-color: #357 !important;
-       -webkit-box-shadow: 0 0 2px 2px rgba(167,215,249,.75);
-       -moz-box-shadow: 0 0 2px 2px rgba(167,215,249,.75);
-       box-shadow: 0 0 2px 2px rgba(167,215,249,.75);
-}
-body .ui-button.ui-button-blue:active {
-       background: #3060a0 !important;
-       background: -moz-linear-gradient(top, #4080e0 0%, #3060a0 90%) !important; /* FF3.6+ */
-       background: -webkit-linear-gradient(top, #4080e0 0%, #3060a0 90%) !important; /* Chrome10+, Safari5.1+ */
-       background: -o-linear-gradient(top, #4080e0 0%, #3060a0 90%) !important; /* Opera 11.10+ */
-       background: -ms-linear-gradient(top, #4080e0 0%, #3060a0 90%) !important; /* IE10+ */
-       background: linear-gradient(to bottom, #4080e0 0%, #3060a0 90%) !important;
-       filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#4080e0', endColorstr='#3060a0', GradientType=0); /* IE6-8 */
-}
-
-/* Red buttons */
-body .ui-button-red,
-body .ui-button-red .ui-button-text {
-       color: white;
-       text-shadow: 0 -1px 1px #700;
-}
-body .ui-button.ui-button-red {
-       border-color: #944 !important;
-       background: #a22 !important;
-       background: -moz-linear-gradient(top, #d44 0%, #a22 90%) !important; /* FF3.6+ */
-       background: -webkit-linear-gradient(top, #d44 0%, #a22 90%) !important; /* Chrome10+, Safari5.1+ */
-       background: -o-linear-gradient(top, #d44 0%, #a22 90%) !important; /* Opera 11.10+ */
-       background: -ms-linear-gradient(top, #d44 0%, #a22 90%) !important; /* IE10+ */
-       background: linear-gradient(to bottom, #d44 0%, #a22 90%) !important;
-       filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#dd4444', endColorstr='#aa2222', GradientType=0); /* IE6-8 */
-       -webkit-box-shadow: 0 1px 3px rgba(0,0,0,.35);
-       -moz-box-shadow: 0 1px 3px rgba(0,0,0,.35);
-       box-shadow: 0 1px 3px rgba(0,0,0,.35);
-}
-body .ui-button.ui-button-red:hover {
-       border-color: #a44 !important;
-       background: #b03333 !important;
-       background: -moz-linear-gradient(top, #ee4646 0%, #b03333 90%) !important; /* FF3.6+ */
-       background: -webkit-linear-gradient(top, #ee4646 0%, #b03333 90%) !important; /* Chrome10+, Safari5.1+ */
-       background: -o-linear-gradient(top, #ee4646 0%, #b03333 90%) !important; /* Opera 11.10+ */
-       background: -ms-linear-gradient(top, #ee4646 0%, #b03333 90%) !important; /* IE10+ */
-       background: linear-gradient(to bottom, #ee4646 0%, #b03333 90%) !important;
-       filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ee4646', endColorstr='#b03333', GradientType=0); /* IE6-8 */
-       -webkit-box-shadow: 0 1px 3px rgba(0,0,0,.3);
-       -moz-box-shadow: 0 1px 3px rgba(0,0,0,.3);
-       box-shadow: 0 1px 3px rgba(0,0,0,.3);
-}
-body .ui-button.ui-button-red:active,
-body .ui-button.ui-button-red:focus {
-       border-color: #747 !important;
-       -webkit-box-shadow: 0 0 2px 2px rgba(167,215,249,.7);
-       -moz-box-shadow: 0 0 2px 2px rgba(167,215,249,.7);
-       box-shadow: 0 0 2px 2px rgba(167,215,249,.7);
-}
-body .ui-button.ui-button-red:active {
-       background: #952020 !important;
-       background: -moz-linear-gradient(top, #d04545 0%, #952020 90%) !important; /* FF3.6+ */
-       background: -webkit-linear-gradient(top, #d04545 0%, #952020 90%) !important; /* Chrome10+, Safari5.1+ */
-       background: -o-linear-gradient(top, #d04545 0%, #952020 90%) !important; /* Opera 11.10+ */
-       background: -ms-linear-gradient(top, #d04545 0%, #952020 90%) !important; /* IE10+ */
-       background: linear-gradient(to bottom, #d04545 0%, #952020 90%) !important;
-       filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#d04545', endColorstr='#952020', GradientType=0); /* IE6-8 */
-}
-
-/* Disabled buttons */
-body .ui-button-green.disabled,
-body .ui-button-green.disabled:hover,
-body .ui-button-green.disabled:active,
-body .ui-button-green.disabled:focus,
-body .ui-button-blue.disabled,
-body .ui-button-blue.disabled:hover,
-body .ui-button-blue.disabled:active,
-body .ui-button-blue.disabled:focus,
-body .ui-button-red.disabled,
-body .ui-button-red.disabled:hover,
-body .ui-button-red.disabled:active,
-body .ui-button-red.disabled:focus,
-body .ui-button.disabled,
-body .ui-button.disabled:hover {
-       color: #aaa;
-       border-color: #ccc !important;
-       background: #eee !important;
-       background: -moz-linear-gradient(top, #f6f6f6 0%, #eee 90%) !important; /* FF3.6+ */
-       background: -webkit-linear-gradient(top, #f6f6f6 0%, #eee 90%) !important; /* Chrome10+, Safari5.1+ */
-       background: -o-linear-gradient(top, #f6f6f6 0%, #eee 90%) !important; /* Opera 11.10+ */
-       background: -ms-linear-gradient(top, #f6f6f6 0%, #eee 90%) !important; /* IE10+ */
-       background: linear-gradient(to bottom, #f6f6f6 0%, #eee 90%) !important;
-       filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#f6f6f6', endColorstr='#eeeeee', GradientType=0); /* IE6-8 */
-       -webkit-box-shadow: 0 1px 3px rgba(0,0,0,0);
-       -moz-box-shadow: 0 1px 3px rgba(0,0,0,0);
-       box-shadow: 0 1px 3px rgba(0,0,0,0);
-}
-body .ui-button-green.disabled .ui-button-text,
-body .ui-button-blue.disabled .ui-button-text,
-body .ui-button-red.disabled .ui-button-text {
-       color: #aaa;
-       text-shadow: 0 1px 1px #fff;
-}
diff --git a/resources/jquery.ui/themes/vector/jquery.ui.core.css b/resources/jquery.ui/themes/vector/jquery.ui.core.css
deleted file mode 100644 (file)
index b3e8193..0000000
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
-* jQuery UI CSS Framework
-* Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about)
-* Dual licensed under the MIT (MIT-LICENSE.txt) and GPL (GPL-LICENSE.txt) licenses.
-*/
-
-/* Layout helpers
-----------------------------------*/
-.ui-helper-hidden { display: none; }
-.ui-helper-hidden-accessible { position: absolute; left: -99999999px; }
-.ui-helper-reset { margin: 0; padding: 0; border: 0; outline: 0; line-height: 1.3; text-decoration: none; font-size: 100%; list-style: none; }
-.ui-helper-clearfix:after { content: "."; display: block; height: 0; clear: both; visibility: hidden; }
-.ui-helper-clearfix { display: inline-block; }
-/* required comment for clearfix to work in Opera \*/
-* html .ui-helper-clearfix { height:1%; }
-.ui-helper-clearfix { display:block; }
-/* end clearfix */
-.ui-helper-zfix { width: 100%; height: 100%; top: 0; left: 0; position: absolute; opacity: 0; filter:Alpha(Opacity=0); }
-
-
-/* Interaction Cues
-----------------------------------*/
-.ui-state-disabled { cursor: default !important; }
-
-
-/* Icons
-----------------------------------*/
-
-/* states and images */
-.ui-icon { display: block; text-indent: -99999px; overflow: hidden; background-repeat: no-repeat; }
-
-
-/* Misc visuals
-----------------------------------*/
-
-/* Overlays */
-.ui-widget-overlay { position: absolute; top: 0; left: 0; width: 100%; height: 100%; }
diff --git a/resources/jquery.ui/themes/vector/jquery.ui.datepicker.css b/resources/jquery.ui/themes/vector/jquery.ui.datepicker.css
deleted file mode 100644 (file)
index 871bf69..0000000
+++ /dev/null
@@ -1,61 +0,0 @@
-/* Datepicker
-----------------------------------*/
-.ui-datepicker { width: 17em; padding: .2em .2em 0; display: none; }
-.ui-datepicker .ui-datepicker-header { position:relative; padding:.2em 0; }
-.ui-datepicker .ui-datepicker-prev, .ui-datepicker .ui-datepicker-next { position:absolute; top: 2px; width: 1.8em; height: 1.8em; }
-.ui-datepicker .ui-datepicker-prev-hover, .ui-datepicker .ui-datepicker-next-hover { top: 1px; }
-.ui-datepicker .ui-datepicker-prev { left:2px; }
-.ui-datepicker .ui-datepicker-next { right:2px; }
-.ui-datepicker .ui-datepicker-prev-hover { left:1px; }
-.ui-datepicker .ui-datepicker-next-hover { right:1px; }
-.ui-datepicker .ui-datepicker-prev span, .ui-datepicker .ui-datepicker-next span { display: block; position: absolute; left: 50%; margin-left: -8px; top: 50%; margin-top: -8px;  }
-.ui-datepicker .ui-datepicker-title { margin: 0 2.3em; line-height: 1.8em; text-align: center; }
-.ui-datepicker .ui-datepicker-title select { font-size:1em; margin:1px 0; padding:1px 0; }
-.ui-datepicker select.ui-datepicker-month-year {width: 100%;}
-.ui-datepicker select.ui-datepicker-month, 
-.ui-datepicker select.ui-datepicker-year { width: 49%;}
-.ui-datepicker table {width: 100%; font-size: .9em; border-collapse: collapse; margin:0 0 .4em; }
-.ui-datepicker th { padding: .7em .3em; text-align: center; font-weight: bold; border: 0;  }
-.ui-datepicker td { border: 0; padding: 1px; }
-.ui-datepicker td span, .ui-datepicker td a { display: block; padding: .2em; text-align: right; text-decoration: none; }
-.ui-datepicker .ui-datepicker-buttonpane { background-image: none; margin: .2em 0 0 0; padding: 0 .2em; border-top: 1px solid #DDDDDD; border-left: 0; border-right: 0; border-bottom: 0; }
-.ui-datepicker .ui-datepicker-buttonpane button { float: right; margin: .5em .2em .4em; cursor: pointer; padding: .2em .6em .3em .6em; width:auto; overflow:visible; }
-.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current { float:left; }
-
-/* with multiple calendars */
-.ui-datepicker.ui-datepicker-multi { width:auto; }
-.ui-datepicker-multi .ui-datepicker-group { float:left; }
-.ui-datepicker-multi .ui-datepicker-group table { width:95%; margin:0 auto .4em; }
-.ui-datepicker-multi-2 .ui-datepicker-group { width:50%; }
-.ui-datepicker-multi-3 .ui-datepicker-group { width:33.3%; }
-.ui-datepicker-multi-4 .ui-datepicker-group { width:25%; }
-.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header { border-left-width:0; }
-.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header { border-left-width:0; }
-.ui-datepicker-multi .ui-datepicker-buttonpane { clear:left; }
-.ui-datepicker-row-break { clear:both; width:100%; }
-
-/* RTL support */
-/* @noflip */ .ui-datepicker-rtl { direction: rtl; }
-/* @noflip */ .ui-datepicker-rtl .ui-datepicker-prev { right: 2px; left: auto; }
-/* @noflip */ .ui-datepicker-rtl .ui-datepicker-next { left: 2px; right: auto; }
-/* @noflip */ .ui-datepicker-rtl .ui-datepicker-prev:hover { right: 1px; left: auto; }
-/* @noflip */ .ui-datepicker-rtl .ui-datepicker-next:hover { left: 1px; right: auto; }
-/* @noflip */ .ui-datepicker-rtl .ui-datepicker-buttonpane { clear:right; }
-/* @noflip */ .ui-datepicker-rtl .ui-datepicker-buttonpane button { float: left; }
-/* @noflip */ .ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current { float:right; }
-/* @noflip */ .ui-datepicker-rtl .ui-datepicker-group { float:right; }
-/* @noflip */ .ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header { border-right-width:0; border-left-width:1px; }
-/* @noflip */ .ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header { border-right-width:0; border-left-width:1px; }
-
-/* IE6 IFRAME FIX (taken from datepicker 1.5.3 */
-.ui-datepicker-cover {
-    display: none; /*sorry for IE5*/
-    display/**/: block; /*sorry for IE5*/
-    position: absolute; /*must have*/
-    z-index: -1; /*must have*/
-    filter: mask(); /*must have*/
-    top: -4px; /*must have*/
-    left: -4px; /*must have*/
-    width: 200px; /*must have*/
-    height: 200px; /*must have*/
-}
\ No newline at end of file
diff --git a/resources/jquery.ui/themes/vector/jquery.ui.dialog.css b/resources/jquery.ui/themes/vector/jquery.ui.dialog.css
deleted file mode 100644 (file)
index cd85f14..0000000
+++ /dev/null
@@ -1,37 +0,0 @@
-/* Dialog
-----------------------------------*/
-.ui-dialog { position: absolute; padding: 0; width: 300px; }
-.ui-dialog .ui-dialog-titlebar { padding: .75em; position: relative;  }
-.ui-dialog .ui-dialog-title { float: left; margin: 0; } 
-.ui-dialog .ui-dialog-titlebar-close { position: absolute; right: .75em; top: 50%; width: 19px; margin: -10px 0 0 0; padding: 1px; height: 18px; }
-.ui-dialog .ui-dialog-titlebar-close span { display: block; margin: 1px; }
-.ui-dialog .ui-dialog-titlebar-close:hover, .ui-dialog .ui-dialog-titlebar-close:focus { padding: 0; }
-.ui-dialog .ui-dialog-content { border: 0; padding: .5em 1em; background: none; overflow: auto; zoom: 1; }
-.ui-dialog .ui-dialog-buttonpane { text-align: left; border-width: 1px 0 0 0; background-image: none; margin: .5em 0 0 0; padding: .3em 1em .5em .4em; }
-.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset { float: right; }
-.ui-dialog .ui-resizable-se { width: 14px; height: 14px; right: 3px; bottom: 3px; }
-.ui-draggable .ui-dialog-titlebar { cursor: move; }
-/* Customizations */
-body .ui-dialog .ui-dialog-titlebar-close:hover {
-       text-decoration: none;
-}
-body .ui-dialog .ui-dialog-content .status-invalid input {
-       border: 2px solid red;
-       padding: 2px 1px;
-}
-body .ui-dialog .ui-dialog-titlebar {
-       padding: 0.9em 1.4em 0.6em !important;
-}
-body .ui-dialog .ui-widget-header {
-       /* @embed */
-       background: #f0f0f0 url(images/titlebar-fade.png) repeat-x scroll 50% 100% !important;
-}
-/* FIXME: Should just update the icon sprite if we're keeping this X */
-body .ui-dialog .ui-icon-closethick {
-       /* @embed */
-       background: url(images/close.png) no-repeat 50% 50% !important;
-}
-body .ui-dialog .ui-dialog-buttonpane {
-       margin-top: 0 !important;
-       padding:0.3em 1.4em 0.5em 1.4em !important;
-}
diff --git a/resources/jquery.ui/themes/vector/jquery.ui.progressbar.css b/resources/jquery.ui/themes/vector/jquery.ui.progressbar.css
deleted file mode 100644 (file)
index bc0939e..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-/* Progressbar
-----------------------------------*/
-.ui-progressbar { height:2em; text-align: left; }
-.ui-progressbar .ui-progressbar-value {margin: -1px; height:100%; }
\ No newline at end of file
diff --git a/resources/jquery.ui/themes/vector/jquery.ui.resizable.css b/resources/jquery.ui/themes/vector/jquery.ui.resizable.css
deleted file mode 100644 (file)
index f1bd7c5..0000000
+++ /dev/null
@@ -1,19 +0,0 @@
-/* Resizable
-----------------------------------*/
-.ui-resizable { position: relative;}
-.ui-resizable-handle { position: absolute;font-size: 0.1px;z-index: 99999; display: block;}
-.ui-resizable-disabled .ui-resizable-handle, .ui-resizable-autohide .ui-resizable-handle { display: none; }
-.ui-resizable-n { cursor: n-resize; height: 7px; width: 100%; top: -5px; left: 0; }
-.ui-resizable-s { cursor: s-resize; height: 7px; width: 100%; bottom: -5px; left: 0; }
-/* @noflip */
-.ui-resizable-e { cursor: e-resize; width: 7px; right: -5px; top: 0; height: 100%; }
-/* @noflip */
-.ui-resizable-w { cursor: w-resize; width: 7px; left: -5px; top: 0; height: 100%; }
-/* @noflip */
-.ui-resizable-se { cursor: se-resize; width: 12px; height: 12px; right: 1px; bottom: 1px; }
-/* @noflip */
-.ui-resizable-sw { cursor: sw-resize; width: 9px; height: 9px; left: -5px; bottom: -5px; }
-/* @noflip */
-.ui-resizable-nw { cursor: nw-resize; width: 9px; height: 9px; left: -5px; top: -5px; }
-/* @noflip */
-.ui-resizable-ne { cursor: ne-resize; width: 9px; height: 9px; right: -5px; top: -5px;}
\ No newline at end of file
diff --git a/resources/jquery.ui/themes/vector/jquery.ui.selectable.css b/resources/jquery.ui/themes/vector/jquery.ui.selectable.css
deleted file mode 100644 (file)
index c5d46ce..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-/* Selectable
-----------------------------------*/
-.ui-selectable-helper { border:1px dotted black }
diff --git a/resources/jquery.ui/themes/vector/jquery.ui.slider.css b/resources/jquery.ui/themes/vector/jquery.ui.slider.css
deleted file mode 100644 (file)
index 07c6f4e..0000000
+++ /dev/null
@@ -1,17 +0,0 @@
-/* Slider
-----------------------------------*/
-.ui-slider { position: relative; text-align: left; }
-.ui-slider .ui-slider-handle { position: absolute; z-index: 2; width: 1.2em; height: 1.2em; cursor: default; }
-.ui-slider .ui-slider-range { position: absolute; z-index: 1; font-size: .7em; display: block; border: 0; background-position: 0 0; }
-
-.ui-slider-horizontal { height: .8em; }
-.ui-slider-horizontal .ui-slider-handle { top: -.3em; margin-left: -.6em; }
-.ui-slider-horizontal .ui-slider-range { top: 0; height: 100%; }
-.ui-slider-horizontal .ui-slider-range-min { left: 0; }
-.ui-slider-horizontal .ui-slider-range-max { right: 0; }
-
-.ui-slider-vertical { width: .8em; height: 100px; }
-.ui-slider-vertical .ui-slider-handle { left: -.3em; margin-left: 0; margin-bottom: -.6em; }
-.ui-slider-vertical .ui-slider-range { left: 0; width: 100%; }
-.ui-slider-vertical .ui-slider-range-min { bottom: 0; }
-.ui-slider-vertical .ui-slider-range-max { top: 0; }
\ No newline at end of file
diff --git a/resources/jquery.ui/themes/vector/jquery.ui.tabs.css b/resources/jquery.ui/themes/vector/jquery.ui.tabs.css
deleted file mode 100644 (file)
index 99e16db..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-/* Tabs
-----------------------------------*/
-.ui-tabs { position: relative; padding: .2em; zoom: 1; } /* position: relative prevents IE scroll bug (element with position: relative inside container with overflow: auto appear as "fixed") */
-.ui-tabs .ui-tabs-nav { margin: 0; padding: .2em .2em 0; }
-.ui-tabs .ui-tabs-nav li { list-style: none; float: left; position: relative; top: 1px; margin: 0 .2em 1px 0; border-bottom: 0 !important; padding: 0; white-space: nowrap; }
-.ui-tabs .ui-tabs-nav li a { float: left; padding: .5em 1em; text-decoration: none; }
-.ui-tabs .ui-tabs-nav li.ui-tabs-selected { margin-bottom: 0; padding-bottom: 1px; }
-.ui-tabs .ui-tabs-nav li.ui-tabs-selected a, .ui-tabs .ui-tabs-nav li.ui-state-disabled a, .ui-tabs .ui-tabs-nav li.ui-state-processing a { cursor: text; }
-.ui-tabs .ui-tabs-nav li a, .ui-tabs.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-selected a { cursor: pointer; } /* first selector in group seems obsolete, but required to overcome bug in Opera applying cursor: text overall if defined elsewhere... */
-.ui-tabs .ui-tabs-panel { display: block; border-width: 0; padding: 1em 1.4em; background: none; }
-.ui-tabs .ui-tabs-hide { display: none !important; }
diff --git a/resources/jquery.ui/themes/vector/jquery.ui.theme.css b/resources/jquery.ui/themes/vector/jquery.ui.theme.css
deleted file mode 100644 (file)
index e39371d..0000000
+++ /dev/null
@@ -1,248 +0,0 @@
-
-
-/*
-* jQuery UI CSS Framework
-* Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about)
-* Dual licensed under the MIT (MIT-LICENSE.txt) and GPL (GPL-LICENSE.txt) licenses.
-* To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=sans-serif&fwDefault=normal&fsDefault=1.0em&cornerRadius=3px&bgColorHeader=ffffff&bgTextureHeader=03_highlight_soft.png&bgImgOpacityHeader=100&borderColorHeader=aed0ea&fcHeader=222222&iconColorHeader=72a7cf&bgColorContent=f2f5f7&bgTextureContent=04_highlight_hard.png&bgImgOpacityContent=100&borderColorContent=cccccc&fcContent=362b36&iconColorContent=72a7cf&bgColorDefault=d7ebf9&bgTextureDefault=04_highlight_hard.png&bgImgOpacityDefault=80&borderColorDefault=aed0ea&fcDefault=2779aa&iconColorDefault=3d80b3&bgColorHover=e4f1fb&bgTextureHover=03_highlight_soft.png&bgImgOpacityHover=100&borderColorHover=74b2e2&fcHover=0070a3&iconColorHover=2694e8&bgColorActive=f0f0f0&bgTextureActive=06_inset_hard.png&bgImgOpacityActive=100&borderColorActive=cccccc&fcActive=000000&iconColorActive=666666&bgColorHighlight=ffef8f&bgTextureHighlight=03_highlight_soft.png&bgImgOpacityHighlight=25&borderColorHighlight=f9dd34&fcHighlight=363636&iconColorHighlight=2e83ff&bgColorError=cd0a0a&bgTextureError=01_flat.png&bgImgOpacityError=15&borderColorError=cd0a0a&fcError=ffffff&iconColorError=ffffff&bgColorOverlay=000000&bgTextureOverlay=21_glow_ball.png&bgImgOpacityOverlay=100&opacityOverlay=50&bgColorShadow=000000&bgTextureShadow=01_flat.png&bgImgOpacityShadow=70&opacityShadow=20&thicknessShadow=7px&offsetTopShadow=-7px&offsetLeftShadow=-7px&cornerRadiusShadow=8px
-*/
-
-
-/* Component containers
-----------------------------------*/
-.ui-widget { font-family: sans-serif; font-size: 0.8em; }
-.ui-widget .ui-widget { font-size: 1em; }
-.ui-widget input, .ui-widget select, .ui-widget textarea, .ui-widget button { font-family: sans-serif; font-size: 1em; }
-.ui-widget-content { border: 1px solid #cccccc; /* @embed */ background: #f2f5f7 url(images/ui-bg_highlight-hard_100_f2f5f7_1x100.png) 50% top repeat-x; color: #362b36; }
-.ui-widget-content a { color: #362b36; }
-.ui-widget-header { border-bottom: 1px solid #bbbbbb; line-height: 1em; /* @embed */ background: #ffffff url(images/ui-bg_highlight-soft_100_ffffff_1x100.png) 50% 50% repeat-x; color: #222222; font-weight: bold; }
-.ui-widget-header a { color: #222222; }
-
-/* Interaction states
-----------------------------------*/
-.ui-state-default, .ui-widget-content .ui-state-default, .ui-widget-header .ui-state-default { border: 1px solid #aed0ea; /* @embed */ background: #d7ebf9 url(images/ui-bg_highlight-hard_80_d7ebf9_1x100.png) 50% 50% repeat-x; font-weight: normal; color: #2779aa; }
-.ui-state-default a, .ui-state-default a:link, .ui-state-default a:visited { color: #2779aa; text-decoration: none; }
-.ui-state-hover, .ui-widget-content .ui-state-hover, .ui-widget-header .ui-state-hover, .ui-state-focus, .ui-widget-content .ui-state-focus, .ui-widget-header .ui-state-focus { border: 1px solid #74b2e2; /* @embed */ background: #e4f1fb url(images/ui-bg_highlight-soft_100_e4f1fb_1x100.png) 50% 50% repeat-x; font-weight: normal; color: #0070a3; }
-.ui-state-hover a, .ui-state-hover a:hover { color: #0070a3; text-decoration: none; }
-.ui-state-active, .ui-widget-content .ui-state-active, .ui-widget-header .ui-state-active { border: 1px solid #cccccc; background: #f0f0f0 /* @embed */ url(images/ui-bg_inset-hard_100_f0f0f0_1x100.png) 50% 50% repeat-x; font-weight: normal; color: #000000; }
-.ui-state-active a, .ui-state-active a:link, .ui-state-active a:visited { color: #000000; text-decoration: none; }
-.ui-widget :active { outline: none; }
-
-/* Interaction Cues
-----------------------------------*/
-.ui-state-highlight, .ui-widget-content .ui-state-highlight, .ui-widget-header .ui-state-highlight  {border: 1px solid #f9dd34; background: #ffef8f /* @embed */ url(images/ui-bg_highlight-soft_25_ffef8f_1x100.png) 50% top repeat-x; color: #363636; }
-.ui-state-highlight a, .ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a { color: #363636; }
-.ui-state-error, .ui-widget-content .ui-state-error, .ui-widget-header .ui-state-error {border: 1px solid #cd0a0a; background: #cd0a0a /* @embed */ url(images/ui-bg_flat_15_cd0a0a_40x100.png) 50% 50% repeat-x; color: #ffffff; }
-.ui-state-error a, .ui-widget-content .ui-state-error a, .ui-widget-header .ui-state-error a { color: #ffffff; }
-.ui-state-error-text, .ui-widget-content .ui-state-error-text, .ui-widget-header .ui-state-error-text { color: #ffffff; }
-.ui-priority-primary, .ui-widget-content .ui-priority-primary, .ui-widget-header .ui-priority-primary { font-weight: bold; }
-.ui-priority-secondary, .ui-widget-content .ui-priority-secondary,  .ui-widget-header .ui-priority-secondary { opacity: .7; filter:Alpha(Opacity=70); font-weight: normal; }
-.ui-state-disabled, .ui-widget-content .ui-state-disabled, .ui-widget-header .ui-state-disabled { opacity: .35; filter:Alpha(Opacity=35); background-image: none; }
-
-/* Icons
-----------------------------------*/
-
-/* states and images */
-.ui-icon { width: 16px; height: 16px; }
-.ui-icon, .ui-widget-content .ui-icon, .ui-widget-header .ui-icon { /* @embed */ background-image: url(images/ui-icons_72a7cf_256x240.png); }
-.ui-state-default .ui-icon { /* @embed */ background-image: url(images/ui-icons_3d80b3_256x240.png); }
-.ui-state-hover .ui-icon, .ui-state-focus .ui-icon { /* @embed */ background-image: url(images/ui-icons_2694e8_256x240.png); }
-.ui-state-active .ui-icon { /* @embed */ background-image: url(images/ui-icons_666666_256x240.png); }
-.ui-state-highlight .ui-icon { /* @embed */ background-image: url(images/ui-icons_2e83ff_256x240.png); }
-.ui-state-error .ui-icon, .ui-state-error-text .ui-icon { /* @embed */ background-image: url(images/ui-icons_ffffff_256x240.png); }
-
-/* positioning */
-.ui-icon-carat-1-n { background-position: 0 0; }
-.ui-icon-carat-1-ne { background-position: -16px 0; }
-.ui-icon-carat-1-e { background-position: -32px 0; }
-.ui-icon-carat-1-se { background-position: -48px 0; }
-.ui-icon-carat-1-s { background-position: -64px 0; }
-.ui-icon-carat-1-sw { background-position: -80px 0; }
-.ui-icon-carat-1-w { background-position: -96px 0; }
-.ui-icon-carat-1-nw { background-position: -112px 0; }
-.ui-icon-carat-2-n-s { background-position: -128px 0; }
-.ui-icon-carat-2-e-w { background-position: -144px 0; }
-.ui-icon-triangle-1-n { background-position: 0 -16px; }
-.ui-icon-triangle-1-ne { background-position: -16px -16px; }
-.ui-icon-triangle-1-e { background-position: -32px -16px; }
-.ui-icon-triangle-1-se { background-position: -48px -16px; }
-.ui-icon-triangle-1-s { background-position: -64px -16px; }
-.ui-icon-triangle-1-sw { background-position: -80px -16px; }
-.ui-icon-triangle-1-w { background-position: -96px -16px; }
-.ui-icon-triangle-1-nw { background-position: -112px -16px; }
-.ui-icon-triangle-2-n-s { background-position: -128px -16px; }
-.ui-icon-triangle-2-e-w { background-position: -144px -16px; }
-.ui-icon-arrow-1-n { background-position: 0 -32px; }
-.ui-icon-arrow-1-ne { background-position: -16px -32px; }
-.ui-icon-arrow-1-e { background-position: -32px -32px; }
-.ui-icon-arrow-1-se { background-position: -48px -32px; }
-.ui-icon-arrow-1-s { background-position: -64px -32px; }
-.ui-icon-arrow-1-sw { background-position: -80px -32px; }
-.ui-icon-arrow-1-w { background-position: -96px -32px; }
-.ui-icon-arrow-1-nw { background-position: -112px -32px; }
-.ui-icon-arrow-2-n-s { background-position: -128px -32px; }
-.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; }
-.ui-icon-arrow-2-e-w { background-position: -160px -32px; }
-.ui-icon-arrow-2-se-nw { background-position: -176px -32px; }
-.ui-icon-arrowstop-1-n { background-position: -192px -32px; }
-.ui-icon-arrowstop-1-e { background-position: -208px -32px; }
-.ui-icon-arrowstop-1-s { background-position: -224px -32px; }
-.ui-icon-arrowstop-1-w { background-position: -240px -32px; }
-.ui-icon-arrowthick-1-n { background-position: 0 -48px; }
-.ui-icon-arrowthick-1-ne { background-position: -16px -48px; }
-.ui-icon-arrowthick-1-e { background-position: -32px -48px; }
-.ui-icon-arrowthick-1-se { background-position: -48px -48px; }
-.ui-icon-arrowthick-1-s { background-position: -64px -48px; }
-.ui-icon-arrowthick-1-sw { background-position: -80px -48px; }
-.ui-icon-arrowthick-1-w { background-position: -96px -48px; }
-.ui-icon-arrowthick-1-nw { background-position: -112px -48px; }
-.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; }
-.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; }
-.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; }
-.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; }
-.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; }
-.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; }
-.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; }
-.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; }
-.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; }
-.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; }
-.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; }
-.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; }
-.ui-icon-arrowreturn-1-w { background-position: -64px -64px; }
-.ui-icon-arrowreturn-1-n { background-position: -80px -64px; }
-.ui-icon-arrowreturn-1-e { background-position: -96px -64px; }
-.ui-icon-arrowreturn-1-s { background-position: -112px -64px; }
-.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; }
-.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; }
-.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; }
-.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; }
-.ui-icon-arrow-4 { background-position: 0 -80px; }
-.ui-icon-arrow-4-diag { background-position: -16px -80px; }
-.ui-icon-extlink { background-position: -32px -80px; }
-.ui-icon-newwin { background-position: -48px -80px; }
-.ui-icon-refresh { background-position: -64px -80px; }
-.ui-icon-shuffle { background-position: -80px -80px; }
-.ui-icon-transfer-e-w { background-position: -96px -80px; }
-.ui-icon-transferthick-e-w { background-position: -112px -80px; }
-.ui-icon-folder-collapsed { background-position: 0 -96px; }
-.ui-icon-folder-open { background-position: -16px -96px; }
-.ui-icon-document { background-position: -32px -96px; }
-.ui-icon-document-b { background-position: -48px -96px; }
-.ui-icon-note { background-position: -64px -96px; }
-.ui-icon-mail-closed { background-position: -80px -96px; }
-.ui-icon-mail-open { background-position: -96px -96px; }
-.ui-icon-suitcase { background-position: -112px -96px; }
-.ui-icon-comment { background-position: -128px -96px; }
-.ui-icon-person { background-position: -144px -96px; }
-.ui-icon-print { background-position: -160px -96px; }
-.ui-icon-trash { background-position: -176px -96px; }
-.ui-icon-locked { background-position: -192px -96px; }
-.ui-icon-unlocked { background-position: -208px -96px; }
-.ui-icon-bookmark { background-position: -224px -96px; }
-.ui-icon-tag { background-position: -240px -96px; }
-.ui-icon-home { background-position: 0 -112px; }
-.ui-icon-flag { background-position: -16px -112px; }
-.ui-icon-calendar { background-position: -32px -112px; }
-.ui-icon-cart { background-position: -48px -112px; }
-.ui-icon-pencil { background-position: -64px -112px; }
-.ui-icon-clock { background-position: -80px -112px; }
-.ui-icon-disk { background-position: -96px -112px; }
-.ui-icon-calculator { background-position: -112px -112px; }
-.ui-icon-zoomin { background-position: -128px -112px; }
-.ui-icon-zoomout { background-position: -144px -112px; }
-.ui-icon-search { background-position: -160px -112px; }
-.ui-icon-wrench { background-position: -176px -112px; }
-.ui-icon-gear { background-position: -192px -112px; }
-.ui-icon-heart { background-position: -208px -112px; }
-.ui-icon-star { background-position: -224px -112px; }
-.ui-icon-link { background-position: -240px -112px; }
-.ui-icon-cancel { background-position: 0 -128px; }
-.ui-icon-plus { background-position: -16px -128px; }
-.ui-icon-plusthick { background-position: -32px -128px; }
-.ui-icon-minus { background-position: -48px -128px; }
-.ui-icon-minusthick { background-position: -64px -128px; }
-.ui-icon-close { background-position: -80px -128px; }
-.ui-icon-closethick { background-position: -96px -128px; }
-.ui-icon-key { background-position: -112px -128px; }
-.ui-icon-lightbulb { background-position: -128px -128px; }
-.ui-icon-scissors { background-position: -144px -128px; }
-.ui-icon-clipboard { background-position: -160px -128px; }
-.ui-icon-copy { background-position: -176px -128px; }
-.ui-icon-contact { background-position: -192px -128px; }
-.ui-icon-image { background-position: -208px -128px; }
-.ui-icon-video { background-position: -224px -128px; }
-.ui-icon-script { background-position: -240px -128px; }
-.ui-icon-alert { background-position: 0 -144px; }
-.ui-icon-info { background-position: -16px -144px; }
-.ui-icon-notice { background-position: -32px -144px; }
-.ui-icon-help { background-position: -48px -144px; }
-.ui-icon-check { background-position: -64px -144px; }
-.ui-icon-bullet { background-position: -80px -144px; }
-.ui-icon-radio-off { background-position: -96px -144px; }
-.ui-icon-radio-on { background-position: -112px -144px; }
-.ui-icon-pin-w { background-position: -128px -144px; }
-.ui-icon-pin-s { background-position: -144px -144px; }
-.ui-icon-play { background-position: 0 -160px; }
-.ui-icon-pause { background-position: -16px -160px; }
-.ui-icon-seek-next { background-position: -32px -160px; }
-.ui-icon-seek-prev { background-position: -48px -160px; }
-.ui-icon-seek-end { background-position: -64px -160px; }
-.ui-icon-seek-start { background-position: -80px -160px; }
-/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */
-.ui-icon-seek-first { background-position: -80px -160px; }
-.ui-icon-stop { background-position: -96px -160px; }
-.ui-icon-eject { background-position: -112px -160px; }
-.ui-icon-volume-off { background-position: -128px -160px; }
-.ui-icon-volume-on { background-position: -144px -160px; }
-.ui-icon-power { background-position: 0 -176px; }
-.ui-icon-signal-diag { background-position: -16px -176px; }
-.ui-icon-signal { background-position: -32px -176px; }
-.ui-icon-battery-0 { background-position: -48px -176px; }
-.ui-icon-battery-1 { background-position: -64px -176px; }
-.ui-icon-battery-2 { background-position: -80px -176px; }
-.ui-icon-battery-3 { background-position: -96px -176px; }
-.ui-icon-circle-plus { background-position: 0 -192px; }
-.ui-icon-circle-minus { background-position: -16px -192px; }
-.ui-icon-circle-close { background-position: -32px -192px; }
-.ui-icon-circle-triangle-e { background-position: -48px -192px; }
-.ui-icon-circle-triangle-s { background-position: -64px -192px; }
-.ui-icon-circle-triangle-w { background-position: -80px -192px; }
-.ui-icon-circle-triangle-n { background-position: -96px -192px; }
-.ui-icon-circle-arrow-e { background-position: -112px -192px; }
-.ui-icon-circle-arrow-s { background-position: -128px -192px; }
-.ui-icon-circle-arrow-w { background-position: -144px -192px; }
-.ui-icon-circle-arrow-n { background-position: -160px -192px; }
-.ui-icon-circle-zoomin { background-position: -176px -192px; }
-.ui-icon-circle-zoomout { background-position: -192px -192px; }
-.ui-icon-circle-check { background-position: -208px -192px; }
-.ui-icon-circlesmall-plus { background-position: 0 -208px; }
-.ui-icon-circlesmall-minus { background-position: -16px -208px; }
-.ui-icon-circlesmall-close { background-position: -32px -208px; }
-.ui-icon-squaresmall-plus { background-position: -48px -208px; }
-.ui-icon-squaresmall-minus { background-position: -64px -208px; }
-.ui-icon-squaresmall-close { background-position: -80px -208px; }
-.ui-icon-grip-dotted-vertical { background-position: 0 -224px; }
-.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; }
-.ui-icon-grip-solid-vertical { background-position: -32px -224px; }
-.ui-icon-grip-solid-horizontal { background-position: -48px -224px; }
-.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; }
-.ui-icon-grip-diagonal-se { background-position: -80px -224px; }
-
-
-/* Misc visuals
-----------------------------------*/
-
-/* Corner radius */
-.ui-corner-tl { -moz-border-radius-topleft: 0; -webkit-border-top-left-radius: 0; }
-.ui-corner-tr { -moz-border-radius-topright: 0; -webkit-border-top-right-radius: 0; }
-.ui-corner-bl { -moz-border-radius-bottomleft: 0; -webkit-border-bottom-left-radius: 0; }
-.ui-corner-br { -moz-border-radius-bottomright: 0; -webkit-border-bottom-right-radius: 0; }
-.ui-corner-top { -moz-border-radius-topleft: 0; -webkit-border-top-left-radius: 0; -moz-border-radius-topright: 0; -webkit-border-top-right-radius: 0; }
-.ui-corner-bottom { -moz-border-radius-bottomleft: 0; -webkit-border-bottom-left-radius: 0; -moz-border-radius-bottomright: 0; -webkit-border-bottom-right-radius: 0; }
-.ui-corner-right {  -moz-border-radius-topright: 0; -webkit-border-top-right-radius: 0; -moz-border-radius-bottomright: 0; -webkit-border-bottom-right-radius: 0; }
-.ui-corner-left { -moz-border-radius-topleft: 0; -webkit-border-top-left-radius: 0; -moz-border-radius-bottomleft: 0; -webkit-border-bottom-left-radius: 0; }
-.ui-corner-all { -moz-border-radius: 0; -webkit-border-radius: 0; }
-
-/* Overlays */
-.ui-widget-overlay { background: #000000; opacity: .75;filter:Alpha(Opacity=75); }
-.ui-widget-shadow { margin: -7px 0 0 -7px; padding: 7px; /* @embed */ background: #000000 url(images/ui-bg_flat_70_000000_40x100.png) 50% 50% repeat-x; opacity: .20;filter:Alpha(Opacity=20); -moz-border-radius: 8px; -webkit-border-radius: 8px; border-radius: 8px; }
\ No newline at end of file
diff --git a/resources/jquery/images/jquery.arrowSteps.divider-ltr.png b/resources/jquery/images/jquery.arrowSteps.divider-ltr.png
deleted file mode 100644 (file)
index 84ed2a2..0000000
Binary files a/resources/jquery/images/jquery.arrowSteps.divider-ltr.png and /dev/null differ
diff --git a/resources/jquery/images/jquery.arrowSteps.divider-rtl.png b/resources/jquery/images/jquery.arrowSteps.divider-rtl.png
deleted file mode 100644 (file)
index 7cfbfeb..0000000
Binary files a/resources/jquery/images/jquery.arrowSteps.divider-rtl.png and /dev/null differ
diff --git a/resources/jquery/images/jquery.arrowSteps.head-ltr.png b/resources/jquery/images/jquery.arrowSteps.head-ltr.png
deleted file mode 100644 (file)
index eb07028..0000000
Binary files a/resources/jquery/images/jquery.arrowSteps.head-ltr.png and /dev/null differ
diff --git a/resources/jquery/images/jquery.arrowSteps.head-rtl.png b/resources/jquery/images/jquery.arrowSteps.head-rtl.png
deleted file mode 100644 (file)
index 7ea2fdb..0000000
Binary files a/resources/jquery/images/jquery.arrowSteps.head-rtl.png and /dev/null differ
diff --git a/resources/jquery/images/jquery.arrowSteps.tail-ltr.png b/resources/jquery/images/jquery.arrowSteps.tail-ltr.png
deleted file mode 100644 (file)
index 3ad990b..0000000
Binary files a/resources/jquery/images/jquery.arrowSteps.tail-ltr.png and /dev/null differ
diff --git a/resources/jquery/images/jquery.arrowSteps.tail-rtl.png b/resources/jquery/images/jquery.arrowSteps.tail-rtl.png
deleted file mode 100644 (file)
index 1d3048e..0000000
Binary files a/resources/jquery/images/jquery.arrowSteps.tail-rtl.png and /dev/null differ
diff --git a/resources/jquery/images/marker.png b/resources/jquery/images/marker.png
deleted file mode 100644 (file)
index 19efb6c..0000000
Binary files a/resources/jquery/images/marker.png and /dev/null differ
diff --git a/resources/jquery/images/mask.png b/resources/jquery/images/mask.png
deleted file mode 100644 (file)
index fe08de0..0000000
Binary files a/resources/jquery/images/mask.png and /dev/null differ
diff --git a/resources/jquery/images/sort_both.gif b/resources/jquery/images/sort_both.gif
deleted file mode 100644 (file)
index 50ad15a..0000000
Binary files a/resources/jquery/images/sort_both.gif and /dev/null differ
diff --git a/resources/jquery/images/sort_down.gif b/resources/jquery/images/sort_down.gif
deleted file mode 100644 (file)
index ec4f41b..0000000
Binary files a/resources/jquery/images/sort_down.gif and /dev/null differ
diff --git a/resources/jquery/images/sort_none.gif b/resources/jquery/images/sort_none.gif
deleted file mode 100644 (file)
index edd07e5..0000000
Binary files a/resources/jquery/images/sort_none.gif and /dev/null differ
diff --git a/resources/jquery/images/sort_up.gif b/resources/jquery/images/sort_up.gif
deleted file mode 100644 (file)
index 8018918..0000000
Binary files a/resources/jquery/images/sort_up.gif and /dev/null differ
diff --git a/resources/jquery/images/spinner-large.gif b/resources/jquery/images/spinner-large.gif
deleted file mode 100644 (file)
index 72203fd..0000000
Binary files a/resources/jquery/images/spinner-large.gif and /dev/null differ
diff --git a/resources/jquery/images/spinner.gif b/resources/jquery/images/spinner.gif
deleted file mode 100644 (file)
index 6146be4..0000000
Binary files a/resources/jquery/images/spinner.gif and /dev/null differ
diff --git a/resources/jquery/images/wheel.png b/resources/jquery/images/wheel.png
deleted file mode 100644 (file)
index 7e53103..0000000
Binary files a/resources/jquery/images/wheel.png and /dev/null differ
diff --git a/resources/jquery/jquery.appear.js b/resources/jquery/jquery.appear.js
deleted file mode 100644 (file)
index 4f77886..0000000
+++ /dev/null
@@ -1,138 +0,0 @@
-/*
- * jQuery.appear
- * http://code.google.com/p/jquery-appear/
- *
- * Copyright (c) 2009 Michael Hixson
- * Licensed under the MIT license (http://www.opensource.org/licenses/mit-license.php)
-*/
-(function($) {
-        
-       $.fn.appear = function(fn, options) {
-                
-               var settings = $.extend({
-                       //arbitrary data to pass to fn
-                       data: undefined,
-                       //call fn only on the first appear?
-                       one: true
-                        
-               }, options);
-                
-               return this.each(function() {
-                
-                       var t = $(this);
-                        
-                       //whether the element is currently visible
-                       t.appeared = false;
-                        
-                       if (!fn) {
-                               //trigger the custom event
-                               t.trigger('appear', settings.data);
-                               return;
-                       }
-                        
-                       var w = $(window);
-                        
-                       //fires the appear event when appropriate
-                       var check = function() {
-                               //is the element hidden?
-                               if (!t.is(':visible')) {
-                                        
-                                       //it became hidden
-                                       t.appeared = false;
-                                       return;
-                               }
-                               //is the element inside the visible window?
-                               var a = w.scrollLeft();
-                               var b = w.scrollTop();
-                               var o = t.offset();
-                               var x = o.left;
-                               var y = o.top;
-                                
-                               if (y + t.height() >= b && 
-                                               y <= b + w.height() &&
-                                               x + t.width() >= a && 
-                                               x <= a + w.width()) {
-                                       //trigger the custom event
-                                       if (!t.appeared) t.trigger('appear', settings.data);
-                                        
-                               } else {
-                                       //it scrolled out of view
-                                       t.appeared = false;
-                               }
-                       };
-                       //create a modified fn with some additional logic
-                       var modifiedFn = function() {
-                                
-                               //mark the element as visible
-                               t.appeared = true;
-                               //is this supposed to happen only once?
-                               if (settings.one) {
-                                       //remove the check
-                                       w.unbind('scroll', check);
-                                       var i = $.inArray(check, $.fn.appear.checks);
-                                       if (i >= 0) $.fn.appear.checks.splice(i, 1);
-                               }
-                               //trigger the original fn
-                               fn.apply(this, arguments);
-                       };
-                        
-                       //bind the modified fn to the element
-                       if (settings.one) t.one('appear', settings.data, modifiedFn);
-                       else t.bind('appear', settings.data, modifiedFn);
-                        
-                       //check whenever the window scrolls
-                       w.scroll(check);
-                        
-                       //check whenever the dom changes
-                       $.fn.appear.checks.push(check);
-                        
-                       //check now
-                       (check)();
-               });
-       };
-        
-       //keep a queue of appearance checks
-       $.extend($.fn.appear, {
-                
-               checks: [],
-               timeout: null,
-               //process the queue
-               checkAll: function() {
-                       var length = $.fn.appear.checks.length;
-                       if (length > 0) while (length--) ($.fn.appear.checks[length])();
-               },
-               //check the queue asynchronously
-               run: function() {
-                       if ($.fn.appear.timeout) clearTimeout($.fn.appear.timeout);
-                       $.fn.appear.timeout = setTimeout($.fn.appear.checkAll, 20);
-               }
-       });
-        
-       //run checks when these methods are called
-       $.each(['append', 'prepend', 'after', 'before', 'attr', 
-                                       'removeAttr', 'addClass', 'removeClass', 'toggleClass', 
-                                       'remove', 'css', 'show', 'hide'], function(i, n) {
-               var old = $.fn[n];
-               if (old) {
-                       $.fn[n] = function() {
-                               var r = old.apply(this, arguments);
-                               $.fn.appear.run();
-                               return r;
-                       }
-               }
-       });
-        
-})(jQuery);
\ No newline at end of file
diff --git a/resources/jquery/jquery.arrowSteps.css b/resources/jquery/jquery.arrowSteps.css
deleted file mode 100644 (file)
index f8f6e95..0000000
+++ /dev/null
@@ -1,45 +0,0 @@
-.arrowSteps {
-       list-style-type: none;
-       list-style-image: none;
-       border: 1px solid #666666;
-       position: relative;
-}
-
-.arrowSteps li {
-       float: left;
-       padding: 0px;
-       margin: 0px;
-       border: 0 none;
-}
-
-.arrowSteps li div {
-       padding: 0.5em;
-       text-align: center;
-       white-space: nowrap;
-       overflow: hidden;
-}
-
-.arrowSteps li.arrow div {
-       /* @embed */
-       background: url(images/jquery.arrowSteps.divider-ltr.png) no-repeat right center;
-}
-
-/* applied to the element preceding the highlighted step */
-.arrowSteps li.arrow.tail div {
-       /* @embed */
-       background: url(images/jquery.arrowSteps.tail-ltr.png) no-repeat right center;
-}
-
-/* this applies to all highlighted, including the last */
-.arrowSteps li.head div {
-       /* @embed */
-       background: url(images/jquery.arrowSteps.head-ltr.png) no-repeat left center;
-       font-weight: bold;
-}
-
-/* this applies to all highlighted arrows except the last */
-.arrowSteps li.arrow.head div {
-       /* TODO: eliminate duplication of jquery.arrowSteps.head.png embedding */
-       /* @embed */
-       background: url(images/jquery.arrowSteps.head-ltr.png) no-repeat right center;
-}
diff --git a/resources/jquery/jquery.arrowSteps.js b/resources/jquery/jquery.arrowSteps.js
deleted file mode 100644 (file)
index c44e7c5..0000000
+++ /dev/null
@@ -1,92 +0,0 @@
-/*!
- * jQuery arrowSteps plugin
- * Copyright Neil Kandalgaonkar, 2010
- *
- * This work is licensed under the terms of the GNU General Public License,
- * version 2 or later.
- * (see http://www.fsf.org/licensing/licenses/gpl.html).
- * Derivative works and later versions of the code must be free software
- * licensed under the same or a compatible license.
- */
-
-/**
- * @class jQuery.plugin.arrowSteps
- */
-( function ( $ ) {
-       /**
-        * Show users their progress through a series of steps, via a row of items that fit
-        * together like arrows. One item can be highlighted at a time.
-        *
-        *     <ul id="robin-hood-daffy">
-        *       <li id="guard"><div>Guard!</div></li>
-        *       <li id="turn"><div>Turn!</div></li>
-        *       <li id="parry"><div>Parry!</div></li>
-        *       <li id="dodge"><div>Dodge!</div></li>
-        *       <li id="spin"><div>Spin!</div></li>
-        *       <li id="ha"><div>Ha!</div></li>
-        *       <li id="thrust"><div>Thrust!</div></li>
-        *     </ul>
-        *
-        *     <script>
-        *       $( '#robin-hood-daffy' ).arrowSteps();
-        *     </script>
-        *
-        * @return {jQuery}
-        * @chainable
-        */
-       $.fn.arrowSteps = function () {
-               var $steps, width, arrowWidth,
-                       paddingSide = $( 'body' ).hasClass( 'rtl' ) ? 'padding-left' : 'padding-right';
-
-               this.addClass( 'arrowSteps' );
-               $steps = this.find( 'li' );
-
-               width = parseInt( 100 / $steps.length, 10 );
-               $steps.css( 'width', width + '%' );
-
-               // Every step except the last one has an arrow pointing forward:
-               // at the right hand side in LTR languages, and at the left hand side in RTL.
-               // Also add in the padding for the calculated arrow width.
-               arrowWidth = parseInt( this.outerHeight(), 10 );
-               $steps.filter( ':not(:last-child)' ).addClass( 'arrow' )
-                     .find( 'div' ).css( paddingSide, arrowWidth.toString() + 'px' );
-
-               this.data( 'arrowSteps', $steps );
-               return this;
-       };
-
-       /**
-        * Highlights the element selected by the selector.
-        *
-        *       $( '#robin-hood-daffy' ).arrowStepsHighlight( '#guard' );
-        *       // 'Guard!' is highlighted.
-        *
-        *       // ... user completes the 'guard' step ...
-        *
-        *       $( '#robin-hood-daffy' ).arrowStepsHighlight( '#turn' );
-        *       // 'Turn!' is highlighted.
-        *
-        * @param {string} selector
-        */
-       $.fn.arrowStepsHighlight = function ( selector ) {
-               var $previous,
-                       $steps = this.data( 'arrowSteps' );
-               $.each( $steps, function ( i, step ) {
-                       var $step = $( step );
-                       if ( $step.is( selector ) ) {
-                               if ($previous) {
-                                       $previous.addClass( 'tail' );
-                               }
-                               $step.addClass( 'head' );
-                       } else {
-                               $step.removeClass( 'head tail lasthead' );
-                       }
-                       $previous = $step;
-               } );
-       };
-
-       /**
-        * @class jQuery
-        * @mixins jQuery.plugin.arrowSteps
-        */
-}( jQuery ) );
diff --git a/resources/jquery/jquery.async.js b/resources/jquery/jquery.async.js
deleted file mode 100644 (file)
index 2161f6b..0000000
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * jQuery Asynchronous Plugin 1.0
- *
- * Copyright (c) 2008 Vincent Robert (genezys.net)
- * Dual licensed under the MIT (MIT-LICENSE.txt)
- * and GPL (GPL-LICENSE.txt) licenses.
- *
- */
-(function($){
-
-// opts.delay : (default 10) delay between async call in ms
-// opts.bulk : (default 500) delay during which the loop can continue synchronously without yielding the CPU
-// opts.test : (default true) function to test in the while test part
-// opts.loop : (default empty) function to call in the while loop part
-// opts.end : (default empty) function to call at the end of the while loop
-$.whileAsync = function(opts) {
-       var delay = Math.abs(opts.delay) || 10,
-               bulk = isNaN(opts.bulk) ? 500 : Math.abs(opts.bulk),
-               test = opts.test || function(){ return true; },
-               loop = opts.loop || function(){},
-               end = opts.end || function(){};
-       
-       (function(){
-
-               var t = false,
-                       begin = new Date();
-                       
-               while( t = test() ) {
-                       loop();
-                       if( bulk === 0 || (new Date() - begin) > bulk ) {
-                               break;
-                       }
-               }
-               if( t ) {
-                       setTimeout(arguments.callee, delay);
-               }
-               else {
-                       end();
-               }
-               
-       })();
-};
-
-// opts.delay : (default 10) delay between async call in ms
-// opts.bulk : (default 500) delay during which the loop can continue synchronously without yielding the CPU
-// opts.loop : (default empty) function to call in the each loop part, signature: function(index, value) this = value
-// opts.end : (default empty) function to call at the end of the each loop
-$.eachAsync = function(array, opts) {
-       var     i = 0,
-               l = array.length,
-               loop = opts.loop || function(){};
-       
-       $.whileAsync(
-               $.extend(opts, {
-                       test: function() { return i < l; },
-                       loop: function() {
-                               var val = array[i];
-                               return loop.call(val, i++, val);
-                       }
-               })
-       );
-};
-
-$.fn.eachAsync = function(opts) {
-       $.eachAsync(this, opts);
-       return this;
-}
-
-})(jQuery);
\ No newline at end of file
diff --git a/resources/jquery/jquery.autoEllipsis.js b/resources/jquery/jquery.autoEllipsis.js
deleted file mode 100644 (file)
index 57d8f94..0000000
+++ /dev/null
@@ -1,168 +0,0 @@
-/**
- * @class jQuery.plugin.autoEllipsis
- */
-( function ( $ ) {
-
-var
-       // Cache ellipsed substrings for every string-width-position combination
-       cache = {},
-
-       // Use a separate cache when match highlighting is enabled
-       matchTextCache = {};
-
-/**
- * Automatically truncate the plain text contents of an element and add an ellipsis
- *
- * @param {Object} options
- * @param {'center'|'left'|'right'} [options.position='center'] Where to remove text.
- * @param {boolean} [options.tooltip=false] Whether to show a tooltip with the remainder
- * of the text.
- * @param {boolean} [options.restoreText=false] Whether to save the text for restoring
- * later.
- * @param {boolean} [options.hasSpan=false] Whether the element is already a container,
- * or if the library should create a new container for it.
- * @param {string|null} [options.matchText=null] Text to highlight, e.g. search terms.
- * @return {jQuery}
- * @chainable
- */
-$.fn.autoEllipsis = function ( options ) {
-       options = $.extend( {
-               position: 'center',
-               tooltip: false,
-               restoreText: false,
-               hasSpan: false,
-               matchText: null
-       }, options );
-
-       return this.each( function () {
-               var $trimmableText,
-                       text, trimmableText, w, pw,
-                       l, r, i, side, m,
-                       // container element - used for measuring against
-                       $container = $(this);
-
-               if ( options.restoreText ) {
-                       if ( !$container.data( 'autoEllipsis.originalText' ) ) {
-                               $container.data( 'autoEllipsis.originalText', $container.text() );
-                       } else {
-                               $container.text( $container.data( 'autoEllipsis.originalText' ) );
-                       }
-               }
-
-               // trimmable text element - only the text within this element will be trimmed
-               if ( options.hasSpan ) {
-                       $trimmableText = $container.children( options.selector );
-               } else {
-                       $trimmableText = $( '<span>' )
-                               .css( 'whiteSpace', 'nowrap' )
-                               .text( $container.text() );
-                       $container
-                               .empty()
-                               .append( $trimmableText );
-               }
-
-               text = $container.text();
-               trimmableText = $trimmableText.text();
-               w = $container.width();
-               pw = 0;
-
-               // Try cache
-               if ( options.matchText ) {
-                       if ( !( text in matchTextCache ) ) {
-                               matchTextCache[text] = {};
-                       }
-                       if ( !( options.matchText in matchTextCache[text] ) ) {
-                               matchTextCache[text][options.matchText] = {};
-                       }
-                       if ( !( w in matchTextCache[text][options.matchText] ) ) {
-                               matchTextCache[text][options.matchText][w] = {};
-                       }
-                       if ( options.position in matchTextCache[text][options.matchText][w] ) {
-                               $container.html( matchTextCache[text][options.matchText][w][options.position] );
-                               if ( options.tooltip ) {
-                                       $container.attr( 'title', text );
-                               }
-                               return;
-                       }
-               } else {
-                       if ( !( text in cache ) ) {
-                               cache[text] = {};
-                       }
-                       if ( !( w in cache[text] ) ) {
-                               cache[text][w] = {};
-                       }
-                       if ( options.position in cache[text][w] ) {
-                               $container.html( cache[text][w][options.position] );
-                               if ( options.tooltip ) {
-                                       $container.attr( 'title', text );
-                               }
-                               return;
-                       }
-               }
-
-               if ( $trimmableText.width() + pw > w ) {
-                       switch ( options.position ) {
-                               case 'right':
-                                       // Use binary search-like technique for efficiency
-                                       l = 0;
-                                       r = trimmableText.length;
-                                       do {
-                                               m = Math.ceil( ( l + r ) / 2 );
-                                               $trimmableText.text( trimmableText.substr( 0, m ) + '...' );
-                                               if ( $trimmableText.width() + pw > w ) {
-                                                       // Text is too long
-                                                       r = m - 1;
-                                               } else {
-                                                       l = m;
-                                               }
-                                       } while ( l < r );
-                                       $trimmableText.text( trimmableText.substr( 0, l ) + '...' );
-                                       break;
-                               case 'center':
-                                       // TODO: Use binary search like for 'right'
-                                       i = [Math.round( trimmableText.length / 2 ), Math.round( trimmableText.length / 2 )];
-                                       // Begin with making the end shorter
-                                       side = 1;
-                                       while ( $trimmableText.outerWidth() + pw > w && i[0] > 0 ) {
-                                               $trimmableText.text( trimmableText.substr( 0, i[0] ) + '...' + trimmableText.substr( i[1] ) );
-                                               // Alternate between trimming the end and begining
-                                               if ( side === 0 ) {
-                                                       // Make the begining shorter
-                                                       i[0]--;
-                                                       side = 1;
-                                               } else {
-                                                       // Make the end shorter
-                                                       i[1]++;
-                                                       side = 0;
-                                               }
-                                       }
-                                       break;
-                               case 'left':
-                                       // TODO: Use binary search like for 'right'
-                                       r = 0;
-                                       while ( $trimmableText.outerWidth() + pw > w && r < trimmableText.length ) {
-                                               $trimmableText.text( '...' + trimmableText.substr( r ) );
-                                               r++;
-                                       }
-                                       break;
-                       }
-               }
-               if ( options.tooltip ) {
-                       $container.attr( 'title', text );
-               }
-               if ( options.matchText ) {
-                       $container.highlightText( options.matchText );
-                       matchTextCache[text][options.matchText][w][options.position] = $container.html();
-               } else {
-                       cache[text][w][options.position] = $container.html();
-               }
-
-       } );
-};
-
-/**
- * @class jQuery
- * @mixins jQuery.plugin.autoEllipsis
- */
-
-}( jQuery ) );
diff --git a/resources/jquery/jquery.ba-throttle-debounce.js b/resources/jquery/jquery.ba-throttle-debounce.js
deleted file mode 100644 (file)
index fa30bdf..0000000
+++ /dev/null
@@ -1,252 +0,0 @@
-/*!
- * jQuery throttle / debounce - v1.1 - 3/7/2010
- * http://benalman.com/projects/jquery-throttle-debounce-plugin/
- * 
- * Copyright (c) 2010 "Cowboy" Ben Alman
- * Dual licensed under the MIT and GPL licenses.
- * http://benalman.com/about/license/
- */
-
-// Script: jQuery throttle / debounce: Sometimes, less is more!
-//
-// *Version: 1.1, Last updated: 3/7/2010*
-// 
-// Project Home - http://benalman.com/projects/jquery-throttle-debounce-plugin/
-// GitHub       - http://github.com/cowboy/jquery-throttle-debounce/
-// Source       - http://github.com/cowboy/jquery-throttle-debounce/raw/master/jquery.ba-throttle-debounce.js
-// (Minified)   - http://github.com/cowboy/jquery-throttle-debounce/raw/master/jquery.ba-throttle-debounce.min.js (0.7kb)
-// 
-// About: License
-// 
-// Copyright (c) 2010 "Cowboy" Ben Alman,
-// Dual licensed under the MIT and GPL licenses.
-// http://benalman.com/about/license/
-// 
-// About: Examples
-// 
-// These working examples, complete with fully commented code, illustrate a few
-// ways in which this plugin can be used.
-// 
-// Throttle - http://benalman.com/code/projects/jquery-throttle-debounce/examples/throttle/
-// Debounce - http://benalman.com/code/projects/jquery-throttle-debounce/examples/debounce/
-// 
-// About: Support and Testing
-// 
-// Information about what version or versions of jQuery this plugin has been
-// tested with, what browsers it has been tested in, and where the unit tests
-// reside (so you can test it yourself).
-// 
-// jQuery Versions - none, 1.3.2, 1.4.2
-// Browsers Tested - Internet Explorer 6-8, Firefox 2-3.6, Safari 3-4, Chrome 4-5, Opera 9.6-10.1.
-// Unit Tests      - http://benalman.com/code/projects/jquery-throttle-debounce/unit/
-// 
-// About: Release History
-// 
-// 1.1 - (3/7/2010) Fixed a bug in <jQuery.throttle> where trailing callbacks
-//       executed later than they should. Reworked a fair amount of internal
-//       logic as well.
-// 1.0 - (3/6/2010) Initial release as a stand-alone project. Migrated over
-//       from jquery-misc repo v0.4 to jquery-throttle repo v1.0, added the
-//       no_trailing throttle parameter and debounce functionality.
-// 
-// Topic: Note for non-jQuery users
-// 
-// jQuery isn't actually required for this plugin, because nothing internal
-// uses any jQuery methods or properties. jQuery is just used as a namespace
-// under which these methods can exist.
-// 
-// Since jQuery isn't actually required for this plugin, if jQuery doesn't exist
-// when this plugin is loaded, the method described below will be created in
-// the `Cowboy` namespace. Usage will be exactly the same, but instead of
-// $.method() or jQuery.method(), you'll need to use Cowboy.method().
-
-(function(window,undefined){
-  '$:nomunge'; // Used by YUI compressor.
-  
-  // Since jQuery really isn't required for this plugin, use `jQuery` as the
-  // namespace only if it already exists, otherwise use the `Cowboy` namespace,
-  // creating it if necessary.
-  var $ = window.jQuery || window.Cowboy || ( window.Cowboy = {} ),
-    
-    // Internal method reference.
-    jq_throttle;
-  
-  // Method: jQuery.throttle
-  // 
-  // Throttle execution of a function. Especially useful for rate limiting
-  // execution of handlers on events like resize and scroll. If you want to
-  // rate-limit execution of a function to a single time, see the
-  // <jQuery.debounce> method.
-  // 
-  // In this visualization, | is a throttled-function call and X is the actual
-  // callback execution:
-  // 
-  // > Throttled with `no_trailing` specified as false or unspecified:
-  // > ||||||||||||||||||||||||| (pause) |||||||||||||||||||||||||
-  // > X    X    X    X    X    X        X    X    X    X    X    X
-  // > 
-  // > Throttled with `no_trailing` specified as true:
-  // > ||||||||||||||||||||||||| (pause) |||||||||||||||||||||||||
-  // > X    X    X    X    X             X    X    X    X    X
-  // 
-  // Usage:
-  // 
-  // > var throttled = jQuery.throttle( delay, [ no_trailing, ] callback );
-  // > 
-  // > jQuery('selector').bind( 'someevent', throttled );
-  // > jQuery('selector').unbind( 'someevent', throttled );
-  // 
-  // This also works in jQuery 1.4+:
-  // 
-  // > jQuery('selector').bind( 'someevent', jQuery.throttle( delay, [ no_trailing, ] callback ) );
-  // > jQuery('selector').unbind( 'someevent', callback );
-  // 
-  // Arguments:
-  // 
-  //  delay - (Number) A zero-or-greater delay in milliseconds. For event
-  //    callbacks, values around 100 or 250 (or even higher) are most useful.
-  //  no_trailing - (Boolean) Optional, defaults to false. If no_trailing is
-  //    true, callback will only execute every `delay` milliseconds while the
-  //    throttled-function is being called. If no_trailing is false or
-  //    unspecified, callback will be executed one final time after the last
-  //    throttled-function call. (After the throttled-function has not been
-  //    called for `delay` milliseconds, the internal counter is reset)
-  //  callback - (Function) A function to be executed after delay milliseconds.
-  //    The `this` context and all arguments are passed through, as-is, to
-  //    `callback` when the throttled-function is executed.
-  // 
-  // Returns:
-  // 
-  //  (Function) A new, throttled, function.
-  
-  $.throttle = jq_throttle = function( delay, no_trailing, callback, debounce_mode ) {
-    // After wrapper has stopped being called, this timeout ensures that
-    // `callback` is executed at the proper times in `throttle` and `end`
-    // debounce modes.
-    var timeout_id,
-      
-      // Keep track of the last time `callback` was executed.
-      last_exec = 0;
-    
-    // `no_trailing` defaults to falsy.
-    if ( typeof no_trailing !== 'boolean' ) {
-      debounce_mode = callback;
-      callback = no_trailing;
-      no_trailing = undefined;
-    }
-    
-    // The `wrapper` function encapsulates all of the throttling / debouncing
-    // functionality and when executed will limit the rate at which `callback`
-    // is executed.
-    function wrapper() {
-      var that = this,
-        elapsed = +new Date() - last_exec,
-        args = arguments;
-      
-      // Execute `callback` and update the `last_exec` timestamp.
-      function exec() {
-        last_exec = +new Date();
-        callback.apply( that, args );
-      };
-      
-      // If `debounce_mode` is true (at_begin) this is used to clear the flag
-      // to allow future `callback` executions.
-      function clear() {
-        timeout_id = undefined;
-      };
-      
-      if ( debounce_mode && !timeout_id ) {
-        // Since `wrapper` is being called for the first time and
-        // `debounce_mode` is true (at_begin), execute `callback`.
-        exec();
-      }
-      
-      // Clear any existing timeout.
-      timeout_id && clearTimeout( timeout_id );
-      
-      if ( debounce_mode === undefined && elapsed > delay ) {
-        // In throttle mode, if `delay` time has been exceeded, execute
-        // `callback`.
-        exec();
-        
-      } else if ( no_trailing !== true ) {
-        // In trailing throttle mode, since `delay` time has not been
-        // exceeded, schedule `callback` to execute `delay` ms after most
-        // recent execution.
-        // 
-        // If `debounce_mode` is true (at_begin), schedule `clear` to execute
-        // after `delay` ms.
-        // 
-        // If `debounce_mode` is false (at end), schedule `callback` to
-        // execute after `delay` ms.
-        timeout_id = setTimeout( debounce_mode ? clear : exec, debounce_mode === undefined ? delay - elapsed : delay );
-      }
-    };
-    
-    // Set the guid of `wrapper` function to the same of original callback, so
-    // it can be removed in jQuery 1.4+ .unbind or .die by using the original
-    // callback as a reference.
-    if ( $.guid ) {
-      wrapper.guid = callback.guid = callback.guid || $.guid++;
-    }
-    
-    // Return the wrapper function.
-    return wrapper;
-  };
-  
-  // Method: jQuery.debounce
-  // 
-  // Debounce execution of a function. Debouncing, unlike throttling,
-  // guarantees that a function is only executed a single time, either at the
-  // very beginning of a series of calls, or at the very end. If you want to
-  // simply rate-limit execution of a function, see the <jQuery.throttle>
-  // method.
-  // 
-  // In this visualization, | is a debounced-function call and X is the actual
-  // callback execution:
-  // 
-  // > Debounced with `at_begin` specified as false or unspecified:
-  // > ||||||||||||||||||||||||| (pause) |||||||||||||||||||||||||
-  // >                          X                                 X
-  // > 
-  // > Debounced with `at_begin` specified as true:
-  // > ||||||||||||||||||||||||| (pause) |||||||||||||||||||||||||
-  // > X                                 X
-  // 
-  // Usage:
-  // 
-  // > var debounced = jQuery.debounce( delay, [ at_begin, ] callback );
-  // > 
-  // > jQuery('selector').bind( 'someevent', debounced );
-  // > jQuery('selector').unbind( 'someevent', debounced );
-  // 
-  // This also works in jQuery 1.4+:
-  // 
-  // > jQuery('selector').bind( 'someevent', jQuery.debounce( delay, [ at_begin, ] callback ) );
-  // > jQuery('selector').unbind( 'someevent', callback );
-  // 
-  // Arguments:
-  // 
-  //  delay - (Number) A zero-or-greater delay in milliseconds. For event
-  //    callbacks, values around 100 or 250 (or even higher) are most useful.
-  //  at_begin - (Boolean) Optional, defaults to false. If at_begin is false or
-  //    unspecified, callback will only be executed `delay` milliseconds after
-  //    the last debounced-function call. If at_begin is true, callback will be
-  //    executed only at the first debounced-function call. (After the
-  //    throttled-function has not been called for `delay` milliseconds, the
-  //    internal counter is reset)
-  //  callback - (Function) A function to be executed after delay milliseconds.
-  //    The `this` context and all arguments are passed through, as-is, to
-  //    `callback` when the debounced-function is executed.
-  // 
-  // Returns:
-  // 
-  //  (Function) A new, debounced, function.
-  
-  $.debounce = function( delay, at_begin, callback ) {
-    return callback === undefined
-      ? jq_throttle( delay, at_begin, false )
-      : jq_throttle( delay, callback, at_begin !== false );
-  };
-  
-})(this);
diff --git a/resources/jquery/jquery.badge.css b/resources/jquery/jquery.badge.css
deleted file mode 100644 (file)
index f313663..0000000
+++ /dev/null
@@ -1,37 +0,0 @@
-.mw-badge {
-       min-width: 7px;
-       border-radius: 2px;
-       padding: 1px 4px;
-       text-align: center;
-       font-size: 12px;
-       line-height: 12px;
-       background-color: #d2d2d2;
-       cursor: pointer;
-}
-
-.mw-badge-content {
-       font-weight: bold;
-       color: white;
-       vertical-align: baseline;
-       text-shadow: 0 1px rgba(0, 0, 0, 0.4);
-}
-
-.mw-badge-inline {
-       margin-left: 3px;
-       display: inline-block;
-       /* Hack for IE6 and IE7 (bug 47926) */
-       zoom: 1;
-       *display: inline;
-
-}
-.mw-badge-overlay {
-       position: absolute;
-       bottom: -1px;
-       right: -3px;
-       z-index: 50;
-}
-
-.mw-badge-important {
-       background-color: #cc0000;
-}
-
diff --git a/resources/jquery/jquery.badge.js b/resources/jquery/jquery.badge.js
deleted file mode 100644 (file)
index 023b6e2..0000000
+++ /dev/null
@@ -1,88 +0,0 @@
-/*!
- * jQuery Badge plugin
- *
- * @license MIT
- *
- * @author Ryan Kaldari <rkaldari@wikimedia.org>, 2012
- * @author Andrew Garrett <agarrett@wikimedia.org>, 2012
- * @author Marius Hoch <hoo@online.de>, 2012
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * This program is distributed WITHOUT ANY WARRANTY.
- */
-
-/**
- * @class jQuery.plugin.badge
- */
-( function ( $, mw ) {
-       /**
-        * Put a badge on an item on the page. The badge container will be appended to the selected element(s).
-        *
-        *     $element.badge( text );
-        *     $element.badge( 5 );
-        *     $element.badge( '100+' );
-        *     $element.badge( text, inline );
-        *     $element.badge( 'New', true );
-        *
-        * @param {number|string} text The value to display in the badge. If the value is falsey (0,
-        *  null, false, '', etc.), any existing badge will be removed.
-        * @param {boolean} [inline=true] True if the badge should be displayed inline, false
-        *  if the badge should overlay the parent element.
-        * @param {boolean} [displayZero=false] True if the number zero should be displayed,
-        *  false if the number zero should result in the badge being hidden
-        * @return {jQuery}
-        * @chainable
-        */
-       $.fn.badge = function ( text, inline, displayZero ) {
-               var $badge = this.find( '.mw-badge' ),
-                       badgeStyleClass = 'mw-badge-' + ( inline ? 'inline' : 'overlay' ),
-                       isImportant = true, displayBadge = true;
-
-               // If we're displaying zero, ensure style to be non-important
-               if ( mw.language.convertNumber( text, true ) === 0 ) {
-                       isImportant = false;
-                       if ( !displayZero ) {
-                               displayBadge = false;
-                       }
-               // If text is falsey (besides 0), hide the badge
-               } else if ( !text ) {
-                       displayBadge = false;
-               }
-
-               if ( displayBadge ) {
-                       // If a badge already exists, reuse it
-                       if ( $badge.length ) {
-                               $badge
-                                       .toggleClass( 'mw-badge-important', isImportant )
-                                       .find( '.mw-badge-content' )
-                                               .text( text );
-                       } else {
-                               // Otherwise, create a new badge with the specified text and style
-                               $badge = $( '<div class="mw-badge"></div>' )
-                                       .addClass( badgeStyleClass )
-                                       .toggleClass( 'mw-badge-important', isImportant )
-                                       .append(
-                                               $( '<span class="mw-badge-content"></span>' ).text( text )
-                                       )
-                                       .appendTo( this );
-                       }
-               } else {
-                       $badge.remove();
-               }
-               return this;
-       };
-
-       /**
-        * @class jQuery
-        * @mixins jQuery.plugin.badge
-        */
-}( jQuery, mediaWiki ) );
diff --git a/resources/jquery/jquery.byteLength.js b/resources/jquery/jquery.byteLength.js
deleted file mode 100644 (file)
index 398937e..0000000
+++ /dev/null
@@ -1,31 +0,0 @@
-/**
- * jQuery.byteLength
- *
- * Calculate the byte length of a string (accounting for UTF-8).
- *
- * @author Jan Paul Posma, 2011
- * @author Timo Tijhof, 2012
- * @author David Chan, 2013
- */
-jQuery.byteLength = function ( str ) {
-
-       // This basically figures out how many bytes a UTF-16 string (which is what js sees)
-       // will take in UTF-8 by replacing a 2 byte character with 2 *'s, etc, and counting that.
-       // Note, surrogate (\uD800-\uDFFF) characters are counted as 2 bytes, since there's two of them
-       // and the actual character takes 4 bytes in UTF-8 (2*2=4). Might not work perfectly in
-       // edge cases such as illegal sequences, but that should never happen.
-
-       // https://en.wikipedia.org/wiki/UTF-8#Description
-       // The mapping from UTF-16 code units to UTF-8 bytes is as follows:
-       // > Range 0000-007F: codepoints that become 1 byte of UTF-8
-       // > Range 0080-07FF: codepoints that become 2 bytes of UTF-8
-       // > Range 0800-D7FF: codepoints that become 3 bytes of UTF-8
-       // > Range D800-DFFF: Surrogates (each pair becomes 4 bytes of UTF-8)
-       // > Range E000-FFFF: codepoints that become 3 bytes of UTF-8 (continued)
-
-       return str
-               .replace( /[\u0080-\u07FF\uD800-\uDFFF]/g, '**' )
-               .replace( /[\u0800-\uD7FF\uE000-\uFFFF]/g, '***' )
-               .length;
-
-};
diff --git a/resources/jquery/jquery.byteLimit.js b/resources/jquery/jquery.byteLimit.js
deleted file mode 100644 (file)
index 17c1821..0000000
+++ /dev/null
@@ -1,235 +0,0 @@
-/**
- * @class jQuery.plugin.byteLimit
- */
-( function ( $ ) {
-
-       /**
-        * Utility function to trim down a string, based on byteLimit
-        * and given a safe start position. It supports insertion anywhere
-        * in the string, so "foo" to "fobaro" if limit is 4 will result in
-        * "fobo", not "foba". Basically emulating the native maxlength by
-        * reconstructing where the insertion occured.
-        *
-        * @private
-        * @param {string} safeVal Known value that was previously returned by this
-        * function, if none, pass empty string.
-        * @param {string} newVal New value that may have to be trimmed down.
-        * @param {number} byteLimit Number of bytes the value may be in size.
-        * @param {Function} [fn] See jQuery.byteLimit.
-        * @return {Object}
-        * @return {string} return.newVal
-        * @return {boolean} return.trimmed
-        */
-       function trimValForByteLength( safeVal, newVal, byteLimit, fn ) {
-               var startMatches, endMatches, matchesLen, inpParts,
-                       oldVal = safeVal;
-
-               // Run the hook if one was provided, but only on the length
-               // assessment. The value itself is not to be affected by the hook.
-               if ( $.byteLength( fn ? fn( newVal ) : newVal ) <= byteLimit ) {
-                       // Limit was not reached, just remember the new value
-                       // and let the user continue.
-                       return {
-                               newVal: newVal,
-                               trimmed: false
-                       };
-               }
-
-               // Current input is longer than the active limit.
-               // Figure out what was added and limit the addition.
-               startMatches = 0;
-               endMatches = 0;
-
-               // It is important that we keep the search within the range of
-               // the shortest string's length.
-               // Imagine a user adds text that matches the end of the old value
-               // (e.g. "foo" -> "foofoo"). startMatches would be 3, but without
-               // limiting both searches to the shortest length, endMatches would
-               // also be 3.
-               matchesLen = Math.min( newVal.length, oldVal.length );
-
-               // Count same characters from the left, first.
-               // (if "foo" -> "foofoo", assume addition was at the end).
-               while (
-                       startMatches < matchesLen &&
-                       oldVal.charAt( startMatches ) === newVal.charAt( startMatches )
-               ) {
-                       startMatches += 1;
-               }
-
-               while (
-                       endMatches < ( matchesLen - startMatches ) &&
-                       oldVal.charAt( oldVal.length - 1 - endMatches ) === newVal.charAt( newVal.length - 1 - endMatches )
-               ) {
-                       endMatches += 1;
-               }
-
-               inpParts = [
-                       // Same start
-                       newVal.substring( 0, startMatches ),
-                       // Inserted content
-                       newVal.substring( startMatches, newVal.length - endMatches ),
-                       // Same end
-                       newVal.substring( newVal.length - endMatches )
-               ];
-
-               // Chop off characters from the end of the "inserted content" string
-               // until the limit is statisfied.
-               if ( fn ) {
-                       // stop, when there is nothing to slice - bug 41450
-                       while ( $.byteLength( fn( inpParts.join( '' ) ) ) > byteLimit && inpParts[1].length > 0 ) {
-                               inpParts[1] = inpParts[1].slice( 0, -1 );
-                       }
-               } else {
-                       while ( $.byteLength( inpParts.join( '' ) ) > byteLimit ) {
-                               inpParts[1] = inpParts[1].slice( 0, -1 );
-                       }
-               }
-
-               newVal = inpParts.join( '' );
-
-               return {
-                       newVal: newVal,
-                       trimmed: true
-               };
-       }
-
-       var eventKeys = [
-               'keyup.byteLimit',
-               'keydown.byteLimit',
-               'change.byteLimit',
-               'mouseup.byteLimit',
-               'cut.byteLimit',
-               'paste.byteLimit',
-               'focus.byteLimit',
-               'blur.byteLimit'
-       ].join( ' ' );
-
-       /**
-        * Enforces a byte limit on an input field, so that UTF-8 entries are counted as well,
-        * when, for example, a database field has a byte limit rather than a character limit.
-        * Plugin rationale: Browser has native maxlength for number of characters, this plugin
-        * exists to limit number of bytes instead.
-        *
-        * Can be called with a custom limit (to use that limit instead of the maxlength attribute
-        * value), a filter function (in case the limit should apply to something other than the
-        * exact input value), or both. Order of parameters is important!
-        *
-        * @param {number} [limit] Limit to enforce, fallsback to maxLength-attribute,
-        *  called with fetched value as argument.
-        * @param {Function} [fn] Function to call on the string before assessing the length.
-        * @return {jQuery}
-        * @chainable
-        */
-       $.fn.byteLimit = function ( limit, fn ) {
-               // If the first argument is the function,
-               // set fn to the first argument's value and ignore the second argument.
-               if ( $.isFunction( limit ) ) {
-                       fn = limit;
-                       limit = undefined;
-               // Either way, verify it is a function so we don't have to call
-               // isFunction again after this.
-               } else if ( !fn || !$.isFunction( fn ) ) {
-                       fn = undefined;
-               }
-
-               // The following is specific to each element in the collection.
-               return this.each( function ( i, el ) {
-                       var $el, elLimit, prevSafeVal;
-
-                       $el = $( el );
-
-                       // If no limit was passed to byteLimit(), use the maxlength value.
-                       // Can't re-use 'limit' variable because it's in the higher scope
-                       // that would affect the next each() iteration as well.
-                       // Note that we use attribute to read the value instead of property,
-                       // because in Chrome the maxLength property by default returns the
-                       // highest supported value (no indication that it is being enforced
-                       // by choice). We don't want to bind all of this for some ridiculously
-                       // high default number, unless it was explicitly set in the HTML.
-                       // Also cast to a (primitive) number (most commonly because the maxlength
-                       // attribute contains a string, but theoretically the limit parameter
-                       // could be something else as well).
-                       elLimit = Number( limit === undefined ? $el.attr( 'maxlength' ) : limit );
-
-                       // If there is no (valid) limit passed or found in the property,
-                       // skip this. The < 0 check is required for Firefox, which returns
-                       // -1  (instead of undefined) for maxLength if it is not set.
-                       if ( !elLimit || elLimit < 0 ) {
-                               return;
-                       }
-
-                       if ( fn ) {
-                               // Save function for reference
-                               $el.data( 'byteLimit.callback', fn );
-                       }
-
-                       // Remove old event handlers (if there are any)
-                       $el.off( '.byteLimit' );
-
-                       if ( fn ) {
-                               // Disable the native maxLength (if there is any), because it interferes
-                               // with the (differently calculated) byte limit.
-                               // Aside from being differently calculated (average chars with byteLimit
-                               // is lower), we also support a callback which can make it to allow longer
-                               // values (e.g. count "Foo" from "User:Foo").
-                               // maxLength is a strange property. Removing or setting the property to
-                               // undefined directly doesn't work. Instead, it can only be unset internally
-                               // by the browser when removing the associated attribute (Firefox/Chrome).
-                               // http://code.google.com/p/chromium/issues/detail?id=136004
-                               $el.removeAttr( 'maxlength' );
-
-                       } else {
-                               // If we don't have a callback the bytelimit can only be lower than the charlimit
-                               // (that is, there are no characters less than 1 byte in size). So lets (re-)enforce
-                               // the native limit for efficiency when possible (it will make the while-loop below
-                               // faster by there being less left to interate over).
-                               $el.attr( 'maxlength', elLimit );
-                       }
-
-                       // Safe base value, used to determine the path between the previous state
-                       // and the state that triggered the event handler below - and enforce the
-                       // limit approppiately (e.g. don't chop from the end if text was inserted
-                       // at the beginning of the string).
-                       prevSafeVal = '';
-
-                       // We need to listen to after the change has already happened because we've
-                       // learned that trying to guess the new value and canceling the event
-                       // accordingly doesn't work because the new value is not always as simple as:
-                       // oldValue + String.fromCharCode( e.which ); because of cut, paste, select-drag
-                       // replacements, and custom input methods and what not.
-                       // Even though we only trim input after it was changed (never prevent it), we do
-                       // listen on events that input text, because there are cases where the text has
-                       // changed while text is being entered and keyup/change will not be fired yet
-                       // (such as holding down a single key, fires keydown, and after each keydown,
-                       // we can trim the previous one).
-                       // See http://www.w3.org/TR/DOM-Level-3-Events/#events-keyboard-event-order for
-                       // the order and characteristics of the key events.
-                       $el.on( eventKeys, function () {
-                               var res = trimValForByteLength(
-                                       prevSafeVal,
-                                       this.value,
-                                       elLimit,
-                                       fn
-                               );
-
-                               // Only set value property if it was trimmed, because whenever the
-                               // value property is set, the browser needs to re-initiate the text context,
-                               // which moves the cursor at the end the input, moving it away from wherever it was.
-                               // This is a side-effect of limiting after the fact.
-                               if ( res.trimmed === true ) {
-                                       this.value = res.newVal;
-                               }
-                               // Always adjust prevSafeVal to reflect the input value. Not doing this could cause
-                               // trimValForByteLength to compare the new value to an empty string instead of the
-                               // old value, resulting in trimming always from the end (bug 40850).
-                               prevSafeVal = res.newVal;
-                       } );
-               } );
-       };
-
-       /**
-        * @class jQuery
-        * @mixins jQuery.plugin.byteLimit
-        */
-}( jQuery ) );
diff --git a/resources/jquery/jquery.checkboxShiftClick.js b/resources/jquery/jquery.checkboxShiftClick.js
deleted file mode 100644 (file)
index b206566..0000000
+++ /dev/null
@@ -1,35 +0,0 @@
-/**
- * jQuery checkboxShiftClick
- *
- * This will enable checkboxes to be checked or unchecked in a row by clicking one,
- * holding shift and clicking another one.
- *
- * @author Timo Tijhof, 2011 - 2012
- * @license GPL v2
- */
-( function ( $ ) {
-       $.fn.checkboxShiftClick = function () {
-               var prevCheckbox = null,
-                       $box = this;
-               // When our boxes are clicked..
-               $box.click( function ( e ) {
-                       // And one has been clicked before...
-                       if ( prevCheckbox !== null && e.shiftKey ) {
-                               // Check or uncheck this one and all in-between checkboxes,
-                               // except for disabled ones
-                               $box
-                                       .slice(
-                                               Math.min( $box.index( prevCheckbox ), $box.index( e.target ) ),
-                                               Math.max( $box.index( prevCheckbox ), $box.index( e.target ) ) + 1
-                                       )
-                                       .filter( function () {
-                                               return !this.disabled;
-                                       } )
-                                       .prop( 'checked', !!e.target.checked );
-                       }
-                       // Either way, update the prevCheckbox variable to the one clicked now
-                       prevCheckbox = e.target;
-               } );
-               return $box;
-       };
-}( jQuery ) );
diff --git a/resources/jquery/jquery.client.js b/resources/jquery/jquery.client.js
deleted file mode 100644 (file)
index 6689b7c..0000000
+++ /dev/null
@@ -1,299 +0,0 @@
-/**
- * User-agent detection
- */
-( function ( $ ) {
-
-       /* Private Members */
-
-       /**
-        * @var {Object} profileCache Keyed by userAgent string,
-        * value is the parsed $.client.profile object for that user agent.
-        */
-       var profileCache = {};
-
-       /* Public Methods */
-
-       $.client = {
-
-               /**
-                * Get an object containing information about the client.
-                *
-                * @param {Object} nav An object with atleast a 'userAgent' and 'platform' key.
-                * Defaults to the global Navigator object.
-                * @return {Object} The resulting client object will be in the following format:
-                *  {
-                *   'name': 'firefox',
-                *   'layout': 'gecko',
-                *   'layoutVersion': 20101026,
-                *   'platform': 'linux'
-                *   'version': '3.5.1',
-                *   'versionBase': '3',
-                *   'versionNumber': 3.5,
-                *  }
-                */
-               profile: function ( nav ) {
-                       /*jshint boss: true */
-
-                       if ( nav === undefined ) {
-                               nav = window.navigator;
-                       }
-
-                       // Use the cached version if possible
-                       if ( profileCache[ nav.userAgent + '|' + nav.platform ] !== undefined ) {
-                               return profileCache[ nav.userAgent + '|' + nav.platform ];
-                       }
-
-                       var
-                               versionNumber,
-                               key = nav.userAgent + '|' + nav.platform,
-
-                               /* Configuration */
-
-                               // Name of browsers or layout engines we don't recognize
-                               uk = 'unknown',
-                               // Generic version digit
-                               x = 'x',
-                               // Strings found in user agent strings that need to be conformed
-                               wildUserAgents = ['Opera', 'Navigator', 'Minefield', 'KHTML', 'Chrome', 'PLAYSTATION 3', 'Iceweasel'],
-                               // Translations for conforming user agent strings
-                               userAgentTranslations = [
-                                       // Tons of browsers lie about being something they are not
-                                       [/(Firefox|MSIE|KHTML,?\slike\sGecko|Konqueror)/, ''],
-                                       // Chrome lives in the shadow of Safari still
-                                       ['Chrome Safari', 'Chrome'],
-                                       // KHTML is the layout engine not the browser - LIES!
-                                       ['KHTML', 'Konqueror'],
-                                       // Firefox nightly builds
-                                       ['Minefield', 'Firefox'],
-                                       // This helps keep different versions consistent
-                                       ['Navigator', 'Netscape'],
-                                       // This prevents version extraction issues, otherwise translation would happen later
-                                       ['PLAYSTATION 3', 'PS3']
-                               ],
-                               // Strings which precede a version number in a user agent string - combined and used as
-                               // match 1 in version detection
-                               versionPrefixes = [
-                                       'camino', 'chrome', 'firefox', 'iceweasel', 'netscape', 'netscape6', 'opera', 'version', 'konqueror',
-                                       'lynx', 'msie', 'safari', 'ps3', 'android'
-                               ],
-                               // Used as matches 2, 3 and 4 in version extraction - 3 is used as actual version number
-                               versionSuffix = '(\\/|\\;?\\s|)([a-z0-9\\.\\+]*?)(\\;|dev|rel|\\)|\\s|$)',
-                               // Names of known browsers
-                               names = [
-                                       'camino', 'chrome', 'firefox', 'iceweasel', 'netscape', 'konqueror', 'lynx', 'msie', 'opera',
-                                       'safari', 'ipod', 'iphone', 'blackberry', 'ps3', 'rekonq', 'android'
-                               ],
-                               // Tanslations for conforming browser names
-                               nameTranslations = [],
-                               // Names of known layout engines
-                               layouts = ['gecko', 'konqueror', 'msie', 'trident', 'opera', 'webkit'],
-                               // Translations for conforming layout names
-                               layoutTranslations = [ ['konqueror', 'khtml'], ['msie', 'trident'], ['opera', 'presto'] ],
-                               // Names of supported layout engines for version number
-                               layoutVersions = ['applewebkit', 'gecko', 'trident'],
-                               // Names of known operating systems
-                               platforms = ['win', 'wow64', 'mac', 'linux', 'sunos', 'solaris', 'iphone'],
-                               // Translations for conforming operating system names
-                               platformTranslations = [ ['sunos', 'solaris'], ['wow64', 'win'] ],
-
-                               /* Methods */
-
-                               /**
-                                * Performs multiple replacements on a string
-                                */
-                               translate = function ( source, translations ) {
-                                       var i;
-                                       for ( i = 0; i < translations.length; i++ ) {
-                                               source = source.replace( translations[i][0], translations[i][1] );
-                                       }
-                                       return source;
-                               },
-
-                               /* Pre-processing */
-
-                               ua = nav.userAgent,
-                               match,
-                               name = uk,
-                               layout = uk,
-                               layoutversion = uk,
-                               platform = uk,
-                               version = x;
-
-                       if ( match = new RegExp( '(' + wildUserAgents.join( '|' ) + ')' ).exec( ua ) ) {
-                               // Takes a userAgent string and translates given text into something we can more easily work with
-                               ua = translate( ua, userAgentTranslations );
-                       }
-                       // Everything will be in lowercase from now on
-                       ua = ua.toLowerCase();
-
-                       /* Extraction */
-
-                       if ( match = new RegExp( '(' + names.join( '|' ) + ')' ).exec( ua ) ) {
-                               name = translate( match[1], nameTranslations );
-                       }
-                       if ( match = new RegExp( '(' + layouts.join( '|' ) + ')' ).exec( ua ) ) {
-                               layout = translate( match[1], layoutTranslations );
-                       }
-                       if ( match = new RegExp( '(' + layoutVersions.join( '|' ) + ')\\\/(\\d+)').exec( ua ) ) {
-                               layoutversion = parseInt( match[2], 10 );
-                       }
-                       if ( match = new RegExp( '(' + platforms.join( '|' ) + ')' ).exec( nav.platform.toLowerCase() ) ) {
-                               platform = translate( match[1], platformTranslations );
-                       }
-                       if ( match = new RegExp( '(' + versionPrefixes.join( '|' ) + ')' + versionSuffix ).exec( ua ) ) {
-                               version = match[3];
-                       }
-
-                       /* Edge Cases -- did I mention about how user agent string lie? */
-
-                       // Decode Safari's crazy 400+ version numbers
-                       if ( name === 'safari' && version > 400 ) {
-                               version = '2.0';
-                       }
-                       // Expose Opera 10's lies about being Opera 9.8
-                       if ( name === 'opera' && version >= 9.8 ) {
-                               match = ua.match( /\bversion\/([0-9\.]*)/ );
-                               if ( match && match[1] ) {
-                                       version = match[1];
-                               } else {
-                                       version = '10';
-                               }
-                       }
-                       // And Opera 15's lies about being Chrome
-                       if ( name === 'chrome' && ( match = ua.match( /\bopr\/([0-9\.]*)/ ) ) ) {
-                               if ( match[1] ) {
-                                       name = 'opera';
-                                       version = match[1];
-                               }
-                       }
-                       // And IE 11's lies about being not being IE
-                       if ( layout === 'trident' && layoutversion >= 7 && ( match = ua.match( /\brv[ :\/]([0-9\.]*)/ ) ) ) {
-                               if ( match[1] ) {
-                                       name = 'msie';
-                                       version = match[1];
-                               }
-                       }
-                       // And Amazon Silk's lies about being Android on mobile or Safari on desktop
-                       if ( match = ua.match( /\bsilk\/([0-9.\-_]*)/ ) ) {
-                               if ( match[1] ) {
-                                       name = 'silk';
-                                       version = match[1];
-                               }
-                       }
-
-                       versionNumber = parseFloat( version, 10 ) || 0.0;
-
-                       /* Caching */
-
-                       return profileCache[ key  ] = {
-                               name: name,
-                               layout: layout,
-                               layoutVersion: layoutversion,
-                               platform: platform,
-                               version: version,
-                               versionBase: ( version !== x ? Math.floor( versionNumber ).toString() : x ),
-                               versionNumber: versionNumber
-                       };
-               },
-
-               /**
-                * Checks the current browser against a support map object.
-                *
-                * Version numbers passed as numeric values will be compared like numbers (1.2 > 1.11).
-                * Version numbers passed as string values will be compared using a simple component-wise
-                * algorithm, similar to PHP's version_compare ('1.2' < '1.11').
-                *
-                * A browser map is in the following format:
-                * {
-                *   // Multiple rules with configurable operators
-                *   'msie': [['>=', 7], ['!=', 9]],
-                *    // Match no versions
-                *   'iphone': false,
-                *    // Match any version
-                *   'android': null
-                * }
-                *
-                * It can optionally be split into ltr/rtl sections:
-                * {
-                *   'ltr': {
-                *     'android': null,
-                *     'iphone': false
-                *   },
-                *   'rtl': {
-                *     'android': false,
-                *     // rules are not inherited from ltr
-                *     'iphone': false
-                *   }
-                * }
-                *
-                * @param {Object} map Browser support map
-                * @param {Object} [profile] A client-profile object
-                * @param {boolean} [exactMatchOnly=false] Only return true if the browser is matched, otherwise
-                * returns true if the browser is not found.
-                *
-                * @return {boolean} The current browser is in the support map
-                */
-               test: function ( map, profile, exactMatchOnly ) {
-                       /*jshint evil: true */
-
-                       var conditions, dir, i, op, val, j, pieceVersion, pieceVal, compare;
-                       profile = $.isPlainObject( profile ) ? profile : $.client.profile();
-                       if ( map.ltr && map.rtl ) {
-                               dir = $( 'body' ).is( '.rtl' ) ? 'rtl' : 'ltr';
-                               map = map[dir];
-                       }
-                       // Check over each browser condition to determine if we are running in a compatible client
-                       if ( typeof map !== 'object' || map[profile.name] === undefined ) {
-                               // Not found, return true if exactMatchOnly not set, false otherwise
-                               return !exactMatchOnly;
-                       }
-                       conditions = map[profile.name];
-                       if ( conditions === false ) {
-                               // Match no versions
-                               return false;
-                       }
-                       if ( conditions === null ) {
-                               // Match all versions
-                               return true;
-                       }
-                       for ( i = 0; i < conditions.length; i++ ) {
-                               op = conditions[i][0];
-                               val = conditions[i][1];
-                               if ( typeof val === 'string' ) {
-                                       // Perform a component-wise comparison of versions, similar to PHP's version_compare
-                                       // but simpler. '1.11' is larger than '1.2'.
-                                       pieceVersion = profile.version.toString().split( '.' );
-                                       pieceVal = val.split( '.' );
-                                       // Extend with zeroes to equal length
-                                       while ( pieceVersion.length < pieceVal.length ) {
-                                               pieceVersion.push( '0' );
-                                       }
-                                       while ( pieceVal.length < pieceVersion.length ) {
-                                               pieceVal.push( '0' );
-                                       }
-                                       // Compare components
-                                       compare = 0;
-                                       for ( j = 0; j < pieceVersion.length; j++ ) {
-                                               if ( Number( pieceVersion[j] ) < Number( pieceVal[j] ) ) {
-                                                       compare = -1;
-                                                       break;
-                                               } else if ( Number( pieceVersion[j] ) > Number( pieceVal[j] ) ) {
-                                                       compare = 1;
-                                                       break;
-                                               }
-                                       }
-                                       // compare will be -1, 0 or 1, depending on comparison result
-                                       if ( !( eval( '' + compare + op + '0' ) ) ) {
-                                               return false;
-                                       }
-                               } else if ( typeof val === 'number' ) {
-                                       if ( !( eval( 'profile.versionNumber' + op + val ) ) ) {
-                                               return false;
-                                       }
-                               }
-                       }
-
-                       return true;
-               }
-       };
-}( jQuery ) );
diff --git a/resources/jquery/jquery.color.js b/resources/jquery/jquery.color.js
deleted file mode 100644 (file)
index 04f8047..0000000
+++ /dev/null
@@ -1,55 +0,0 @@
-/**
- * jQuery Color Animations
- *
- * @author John Resig, 2007
- * @author Krinkle, 2011
- * Released under the MIT and GPL licenses.
- *
- * - 2011-01-05: Forked for MediaWiki. See also jQuery.colorUtil plugin
- */
-( function ( $ ) {
-
-       function getColor( elem, attr ) {
-               /*jshint boss:true */
-               var color;
-
-               do {
-                       color = $.css( elem, attr );
-
-                       // Keep going until we find an element that has color, or we hit the body
-                       if ( color !== '' && color !== 'transparent' || $.nodeName( elem, 'body' ) ) {
-                               break;
-                       }
-
-                       attr = 'backgroundColor';
-               } while ( elem = elem.parentNode );
-
-               return $.colorUtil.getRGB( color );
-       }
-
-       // We override the animation for all of these color styles
-       $.each([
-               'backgroundColor',
-               'borderBottomColor',
-               'borderLeftColor',
-               'borderRightColor',
-               'borderTopColor',
-               'color',
-               'outlineColor'
-       ], function ( i, attr ) {
-               $.fx.step[attr] = function ( fx ) {
-                       if ( !fx.colorInit ) {
-                               fx.start = getColor( fx.elem, attr );
-                               fx.end = $.colorUtil.getRGB( fx.end );
-                               fx.colorInit = true;
-                       }
-
-                       fx.elem.style[attr] = 'rgb(' + [
-                               Math.max( Math.min( parseInt( (fx.pos * (fx.end[0] - fx.start[0])) + fx.start[0], 10 ), 255 ), 0 ),
-                               Math.max( Math.min( parseInt( (fx.pos * (fx.end[1] - fx.start[1])) + fx.start[1], 10 ), 255 ), 0 ),
-                               Math.max( Math.min( parseInt( (fx.pos * (fx.end[2] - fx.start[2])) + fx.start[2], 10 ), 255 ), 0 )
-                       ].join( ',' ) + ')';
-               };
-       } );
-
-}( jQuery ) );
diff --git a/resources/jquery/jquery.colorUtil.js b/resources/jquery/jquery.colorUtil.js
deleted file mode 100644 (file)
index 37bf176..0000000
+++ /dev/null
@@ -1,219 +0,0 @@
-/**
- * jQuery Color Utilities
- * Written by Krinkle in 2011
- * Released under the MIT and GPL licenses.
- * Mostly based on other plugins and functions (linted and optimized a little).
- * Sources cited inline.
- */
-( function ( $ ) {
-       $.colorUtil = {
-
-               // Color Conversion function from highlightFade
-               // By Blair Mitchelmore
-               // http://jquery.offput.ca/highlightFade/
-               // Parse strings looking for color tuples [255,255,255]
-               getRGB: function ( color ) {
-                       /*jshint boss:true */
-                       var result;
-
-                       // Check if we're already dealing with an array of colors
-                       if ( color && $.isArray( color ) && color.length === 3 ) {
-                               return color;
-                       }
-
-                       // Look for rgb(num,num,num)
-                       if (result = /rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(color)) {
-                               return [parseInt(result[1],10), parseInt(result[2],10), parseInt(result[3],10)];
-                       }
-
-                       // Look for rgb(num%,num%,num%)
-                       if (result = /rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/.exec(color)) {
-                               return [parseFloat(result[1],10) * 2.55, parseFloat(result[2],10) * 2.55, parseFloat(result[3]) * 2.55];
-                       }
-
-                       // Look for #a0b1c2
-                       if (result = /#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(color)) {
-                               return [parseInt(result[1],16), parseInt(result[2],16), parseInt(result[3],16)];
-                       }
-
-                       // Look for #fff
-                       if (result = /#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(color)) {
-                               return [parseInt(result[1] + result[1],16), parseInt(result[2] + result[2],16), parseInt(result[3] + result[3],16)];
-                       }
-
-                       // Look for rgba(0, 0, 0, 0) == transparent in Safari 3
-                       if (result = /rgba\(0, 0, 0, 0\)/.exec(color)) {
-                               return $.colorUtil.colors.transparent;
-                       }
-
-                       // Otherwise, we're most likely dealing with a named color
-                       return $.colorUtil.colors[$.trim(color).toLowerCase()];
-               },
-
-               // Some named colors to work with
-               // From Interface by Stefan Petre
-               // http://interface.eyecon.ro/
-               colors: {
-                       aqua: [0,255,255],
-                       azure: [240,255,255],
-                       beige: [245,245,220],
-                       black: [0,0,0],
-                       blue: [0,0,255],
-                       brown: [165,42,42],
-                       cyan: [0,255,255],
-                       darkblue: [0,0,139],
-                       darkcyan: [0,139,139],
-                       darkgrey: [169,169,169],
-                       darkgreen: [0,100,0],
-                       darkkhaki: [189,183,107],
-                       darkmagenta: [139,0,139],
-                       darkolivegreen: [85,107,47],
-                       darkorange: [255,140,0],
-                       darkorchid: [153,50,204],
-                       darkred: [139,0,0],
-                       darksalmon: [233,150,122],
-                       darkviolet: [148,0,211],
-                       fuchsia: [255,0,255],
-                       gold: [255,215,0],
-                       green: [0,128,0],
-                       indigo: [75,0,130],
-                       khaki: [240,230,140],
-                       lightblue: [173,216,230],
-                       lightcyan: [224,255,255],
-                       lightgreen: [144,238,144],
-                       lightgrey: [211,211,211],
-                       lightpink: [255,182,193],
-                       lightyellow: [255,255,224],
-                       lime: [0,255,0],
-                       magenta: [255,0,255],
-                       maroon: [128,0,0],
-                       navy: [0,0,128],
-                       olive: [128,128,0],
-                       orange: [255,165,0],
-                       pink: [255,192,203],
-                       purple: [128,0,128],
-                       violet: [128,0,128],
-                       red: [255,0,0],
-                       silver: [192,192,192],
-                       white: [255,255,255],
-                       yellow: [255,255,0],
-                       transparent: [255,255,255]
-               },
-
-               /**
-                * http://mjijackson.com/2008/02/rgb-to-hsl-and-rgb-to-hsv-color-model-conversion-algorithms-in-javascript
-                * Converts an RGB color value to HSL. Conversion formula
-                * adapted from http://en.wikipedia.org/wiki/HSL_color_space.
-                * Assumes r, g, and b are contained in the set [0, 255] and
-                * returns h, s, and l in the set [0, 1].
-                *
-                * @param       Number  R               The red color value
-                * @param       Number  G               The green color value
-                * @param       Number  B               The blue color value
-                * @return      Array                   The HSL representation
-                */
-               rgbToHsl: function ( R, G, B ) {
-                       var d,
-                               r = R / 255,
-                               g = G / 255,
-                               b = B / 255,
-                               max = Math.max( r, g, b ), min = Math.min( r, g, b ),
-                               h,
-                               s,
-                               l = (max + min) / 2;
-
-                       if ( max === min ) {
-                               // achromatic
-                               h = s = 0;
-                       } else {
-                               d = max - min;
-                               s = l > 0.5 ? d / (2 - max - min) : d / (max + min);
-                               switch ( max ) {
-                                       case r:
-                                               h = (g - b) / d + (g < b ? 6 : 0);
-                                               break;
-                                       case g:
-                                               h = (b - r) / d + 2;
-                                               break;
-                                       case b:
-                                               h = (r - g) / d + 4;
-                                               break;
-                               }
-                               h /= 6;
-                       }
-
-                       return [h, s, l];
-               },
-
-               /**
-                * http://mjijackson.com/2008/02/rgb-to-hsl-and-rgb-to-hsv-color-model-conversion-algorithms-in-javascript
-                * Converts an HSL color value to RGB. Conversion formula
-                * adapted from http://en.wikipedia.org/wiki/HSL_color_space.
-                * Assumes h, s, and l are contained in the set [0, 1] and
-                * returns r, g, and b in the set [0, 255].
-                *
-                * @param       Number  h               The hue
-                * @param       Number  s               The saturation
-                * @param       Number  l               The lightness
-                * @return      Array                   The RGB representation
-                */
-               hslToRgb: function ( h, s, l ) {
-                       var r, g, b, hue2rgb, q, p;
-
-                       if ( s === 0 ) {
-                               r = g = b = l; // achromatic
-                       } else {
-                               hue2rgb = function ( p, q, t ) {
-                                       if ( t < 0 ) {
-                                               t += 1;
-                                       }
-                                       if ( t > 1 ) {
-                                               t -= 1;
-                                       }
-                                       if ( t < 1 / 6 ) {
-                                               return p + (q - p) * 6 * t;
-                                       }
-                                       if ( t < 1 / 2 ) {
-                                               return q;
-                                       }
-                                       if ( t < 2 / 3 ) {
-                                               return p + (q - p) * (2 / 3 - t) * 6;
-                                       }
-                                       return p;
-                               };
-
-                               q = l < 0.5 ? l * (1 + s) : l + s - l * s;
-                               p = 2 * l - q;
-                               r = hue2rgb( p, q, h + 1 / 3 );
-                               g = hue2rgb( p, q, h );
-                               b = hue2rgb( p, q, h - 1 / 3 );
-                       }
-
-                       return [r * 255, g * 255, b * 255];
-               },
-
-               /**
-                * Get's a brighter or darker rgb() value string.
-                *
-                * @author Krinkle
-                *
-                * @example     getCSSColorMod( 'red', +0.1 )
-                * @example     getCSSColorMod( 'rgb(200,50,50)', -0.2 )
-                *
-                * @param       Mixed   currentColor current value in css
-                * @param       Number  mod wanted brightness modification between -1 and 1
-                * @return      String 'rgb(r,g,b)'
-                */
-               getColorBrightness: function ( currentColor, mod ) {
-                       var rgbArr = $.colorUtil.getRGB( currentColor ),
-                               hslArr = $.colorUtil.rgbToHsl(rgbArr[0], rgbArr[1], rgbArr[2] );
-                       rgbArr = $.colorUtil.hslToRgb(hslArr[0], hslArr[1], hslArr[2] + mod);
-
-                       return 'rgb(' +
-                               [parseInt( rgbArr[0], 10), parseInt( rgbArr[1], 10 ), parseInt( rgbArr[2], 10 )].join( ',' ) +
-                               ')';
-               }
-
-       };
-
-}( jQuery ) );
diff --git a/resources/jquery/jquery.cookie.js b/resources/jquery/jquery.cookie.js
deleted file mode 100644 (file)
index 6d5974a..0000000
+++ /dev/null
@@ -1,47 +0,0 @@
-/*!
- * jQuery Cookie Plugin
- * https://github.com/carhartl/jquery-cookie
- *
- * Copyright 2011, Klaus Hartl
- * Dual licensed under the MIT or GPL Version 2 licenses.
- * http://www.opensource.org/licenses/mit-license.php
- * http://www.opensource.org/licenses/GPL-2.0
- */
-(function($) {
-    $.cookie = function(key, value, options) {
-
-        // key and at least value given, set cookie...
-        if (arguments.length > 1 && (!/Object/.test(Object.prototype.toString.call(value)) || value === null || value === undefined)) {
-            options = $.extend({}, options);
-
-            if (value === null || value === undefined) {
-                options.expires = -1;
-            }
-
-            if (typeof options.expires === 'number') {
-                var days = options.expires, t = options.expires = new Date();
-                t.setDate(t.getDate() + days);
-            }
-
-            value = String(value);
-
-            return (document.cookie = [
-                encodeURIComponent(key), '=', options.raw ? value : encodeURIComponent(value),
-                options.expires ? '; expires=' + options.expires.toUTCString() : '', // use expires attribute, max-age is not supported by IE
-                options.path    ? '; path=' + options.path : '',
-                options.domain  ? '; domain=' + options.domain : '',
-                options.secure  ? '; secure' : ''
-            ].join(''));
-        }
-
-        // key and possibly options given, get cookie...
-        options = value || {};
-        var decode = options.raw ? function(s) { return s; } : decodeURIComponent;
-
-        var pairs = document.cookie.split('; ');
-        for (var i = 0, pair; pair = pairs[i] && pairs[i].split('='); i++) {
-            if (decode(pair[0]) === key) return decode(pair[1] || ''); // IE saves cookies with empty string as "c; ", e.g. without "=" as opposed to EOMB, thus pair[1] may be undefined
-        }
-        return null;
-    };
-})(jQuery);
diff --git a/resources/jquery/jquery.cycle.all.js b/resources/jquery/jquery.cycle.all.js
deleted file mode 100644 (file)
index d57fb72..0000000
+++ /dev/null
@@ -1,1529 +0,0 @@
-/*!
- * jQuery Cycle Plugin (with Transition Definitions)
- * Examples and documentation at: http://jquery.malsup.com/cycle/
- * Copyright (c) 2007-2010 M. Alsup
- * Version: 2.9999 (13-NOV-2011)
- * Dual licensed under the MIT and GPL licenses.
- * http://jquery.malsup.com/license.html
- * Requires: jQuery v1.3.2 or later
- */
-;(function($, undefined) {
-
-var ver = '2.9999';
-
-// if $.support is not defined (pre jQuery 1.3) add what I need
-if ($.support == undefined) {
-       $.support = {
-               opacity: !($.browser.msie)
-       };
-}
-
-function debug(s) {
-       $.fn.cycle.debug && log(s);
-}              
-function log() {
-       window.console && console.log && console.log('[cycle] ' + Array.prototype.join.call(arguments,' '));
-}
-$.expr[':'].paused = function(el) {
-       return el.cyclePause;
-}
-
-
-// the options arg can be...
-//   a number  - indicates an immediate transition should occur to the given slide index
-//   a string  - 'pause', 'resume', 'toggle', 'next', 'prev', 'stop', 'destroy' or the name of a transition effect (ie, 'fade', 'zoom', etc)
-//   an object - properties to control the slideshow
-//
-// the arg2 arg can be...
-//   the name of an fx (only used in conjunction with a numeric value for 'options')
-//   the value true (only used in first arg == 'resume') and indicates
-//      that the resume should occur immediately (not wait for next timeout)
-
-$.fn.cycle = function(options, arg2) {
-       var o = { s: this.selector, c: this.context };
-
-       // in 1.3+ we can fix mistakes with the ready state
-       if (this.length === 0 && options != 'stop') {
-               if (!$.isReady && o.s) {
-                       log('DOM not ready, queuing slideshow');
-                       $(function() {
-                               $(o.s,o.c).cycle(options,arg2);
-                       });
-                       return this;
-               }
-               // is your DOM ready?  http://docs.jquery.com/Tutorials:Introducing_$(document).ready()
-               log('terminating; zero elements found by selector' + ($.isReady ? '' : ' (DOM not ready)'));
-               return this;
-       }
-
-       // iterate the matched nodeset
-       return this.each(function() {
-               var opts = handleArguments(this, options, arg2);
-               if (opts === false)
-                       return;
-
-               opts.updateActivePagerLink = opts.updateActivePagerLink || $.fn.cycle.updateActivePagerLink;
-               
-               // stop existing slideshow for this container (if there is one)
-               if (this.cycleTimeout)
-                       clearTimeout(this.cycleTimeout);
-               this.cycleTimeout = this.cyclePause = 0;
-
-               var $cont = $(this);
-               var $slides = opts.slideExpr ? $(opts.slideExpr, this) : $cont.children();
-               var els = $slides.get();
-
-               var opts2 = buildOptions($cont, $slides, els, opts, o);
-               if (opts2 === false)
-                       return;
-
-               if (els.length < 2) {
-                       log('terminating; too few slides: ' + els.length);
-                       return;
-               }
-
-               var startTime = opts2.continuous ? 10 : getTimeout(els[opts2.currSlide], els[opts2.nextSlide], opts2, !opts2.backwards);
-
-               // if it's an auto slideshow, kick it off
-               if (startTime) {
-                       startTime += (opts2.delay || 0);
-                       if (startTime < 10)
-                               startTime = 10;
-                       debug('first timeout: ' + startTime);
-                       this.cycleTimeout = setTimeout(function(){go(els,opts2,0,!opts.backwards)}, startTime);
-               }
-       });
-};
-
-function triggerPause(cont, byHover, onPager) {
-       var opts = $(cont).data('cycle.opts');
-       var paused = !!cont.cyclePause;
-       if (paused && opts.paused)
-               opts.paused(cont, opts, byHover, onPager);
-       else if (!paused && opts.resumed)
-               opts.resumed(cont, opts, byHover, onPager);
-}
-
-// process the args that were passed to the plugin fn
-function handleArguments(cont, options, arg2) {
-       if (cont.cycleStop == undefined)
-               cont.cycleStop = 0;
-       if (options === undefined || options === null)
-               options = {};
-       if (options.constructor == String) {
-               switch(options) {
-               case 'destroy':
-               case 'stop':
-                       var opts = $(cont).data('cycle.opts');
-                       if (!opts)
-                               return false;
-                       cont.cycleStop++; // callbacks look for change
-                       if (cont.cycleTimeout)
-                               clearTimeout(cont.cycleTimeout);
-                       cont.cycleTimeout = 0;
-                       opts.elements && $(opts.elements).stop();
-                       $(cont).removeData('cycle.opts');
-                       if (options == 'destroy')
-                               destroy(opts);
-                       return false;
-               case 'toggle':
-                       cont.cyclePause = (cont.cyclePause === 1) ? 0 : 1;
-                       checkInstantResume(cont.cyclePause, arg2, cont);
-                       triggerPause(cont);
-                       return false;
-               case 'pause':
-                       cont.cyclePause = 1;
-                       triggerPause(cont);
-                       return false;
-               case 'resume':
-                       cont.cyclePause = 0;
-                       checkInstantResume(false, arg2, cont);
-                       triggerPause(cont);
-                       return false;
-               case 'prev':
-               case 'next':
-                       var opts = $(cont).data('cycle.opts');
-                       if (!opts) {
-                               log('options not found, "prev/next" ignored');
-                               return false;
-                       }
-                       $.fn.cycle[options](opts);
-                       return false;
-               default:
-                       options = { fx: options };
-               };
-               return options;
-       }
-       else if (options.constructor == Number) {
-               // go to the requested slide
-               var num = options;
-               options = $(cont).data('cycle.opts');
-               if (!options) {
-                       log('options not found, can not advance slide');
-                       return false;
-               }
-               if (num < 0 || num >= options.elements.length) {
-                       log('invalid slide index: ' + num);
-                       return false;
-               }
-               options.nextSlide = num;
-               if (cont.cycleTimeout) {
-                       clearTimeout(cont.cycleTimeout);
-                       cont.cycleTimeout = 0;
-               }
-               if (typeof arg2 == 'string')
-                       options.oneTimeFx = arg2;
-               go(options.elements, options, 1, num >= options.currSlide);
-               return false;
-       }
-       return options;
-       
-       function checkInstantResume(isPaused, arg2, cont) {
-               if (!isPaused && arg2 === true) { // resume now!
-                       var options = $(cont).data('cycle.opts');
-                       if (!options) {
-                               log('options not found, can not resume');
-                               return false;
-                       }
-                       if (cont.cycleTimeout) {
-                               clearTimeout(cont.cycleTimeout);
-                               cont.cycleTimeout = 0;
-                       }
-                       go(options.elements, options, 1, !options.backwards);
-               }
-       }
-};
-
-function removeFilter(el, opts) {
-       if (!$.support.opacity && opts.cleartype && el.style.filter) {
-               try { el.style.removeAttribute('filter'); }
-               catch(smother) {} // handle old opera versions
-       }
-};
-
-// unbind event handlers
-function destroy(opts) {
-       if (opts.next)
-               $(opts.next).unbind(opts.prevNextEvent);
-       if (opts.prev)
-               $(opts.prev).unbind(opts.prevNextEvent);
-       
-       if (opts.pager || opts.pagerAnchorBuilder)
-               $.each(opts.pagerAnchors || [], function() {
-                       this.unbind().remove();
-               });
-       opts.pagerAnchors = null;
-       if (opts.destroy) // callback
-               opts.destroy(opts);
-};
-
-// one-time initialization
-function buildOptions($cont, $slides, els, options, o) {
-       var startingSlideSpecified;
-       // support metadata plugin (v1.0 and v2.0)
-       var opts = $.extend({}, $.fn.cycle.defaults, options || {}, $.metadata ? $cont.metadata() : $.meta ? $cont.data() : {});
-       var meta = $.isFunction($cont.data) ? $cont.data(opts.metaAttr) : null;
-       if (meta)
-               opts = $.extend(opts, meta);
-       if (opts.autostop)
-               opts.countdown = opts.autostopCount || els.length;
-
-       var cont = $cont[0];
-       $cont.data('cycle.opts', opts);
-       opts.$cont = $cont;
-       opts.stopCount = cont.cycleStop;
-       opts.elements = els;
-       opts.before = opts.before ? [opts.before] : [];
-       opts.after = opts.after ? [opts.after] : [];
-
-       // push some after callbacks
-       if (!$.support.opacity && opts.cleartype)
-               opts.after.push(function() { removeFilter(this, opts); });
-       if (opts.continuous)
-               opts.after.push(function() { go(els,opts,0,!opts.backwards); });
-
-       saveOriginalOpts(opts);
-
-       // clearType corrections
-       if (!$.support.opacity && opts.cleartype && !opts.cleartypeNoBg)
-               clearTypeFix($slides);
-
-       // container requires non-static position so that slides can be position within
-       if ($cont.css('position') == 'static')
-               $cont.css('position', 'relative');
-       if (opts.width)
-               $cont.width(opts.width);
-       if (opts.height && opts.height != 'auto')
-               $cont.height(opts.height);
-
-       if (opts.startingSlide != undefined) {
-               opts.startingSlide = parseInt(opts.startingSlide,10);
-               if (opts.startingSlide >= els.length || opts.startSlide < 0)
-                       opts.startingSlide = 0; // catch bogus input
-               else 
-                       startingSlideSpecified = true;
-       }
-       else if (opts.backwards)
-               opts.startingSlide = els.length - 1;
-       else
-               opts.startingSlide = 0;
-
-       // if random, mix up the slide array
-       if (opts.random) {
-               opts.randomMap = [];
-               for (var i = 0; i < els.length; i++)
-                       opts.randomMap.push(i);
-               opts.randomMap.sort(function(a,b) {return Math.random() - 0.5;});
-               if (startingSlideSpecified) {
-                       // try to find the specified starting slide and if found set start slide index in the map accordingly
-                       for ( var cnt = 0; cnt < els.length; cnt++ ) {
-                               if ( opts.startingSlide == opts.randomMap[cnt] ) {
-                                       opts.randomIndex = cnt;
-                               }
-                       }
-               }
-               else {
-                       opts.randomIndex = 1;
-                       opts.startingSlide = opts.randomMap[1];
-               }
-       }
-       else if (opts.startingSlide >= els.length)
-               opts.startingSlide = 0; // catch bogus input
-       opts.currSlide = opts.startingSlide || 0;
-       var first = opts.startingSlide;
-
-       // set position and zIndex on all the slides
-       $slides.css({position: 'absolute', top:0, left:0}).hide().each(function(i) {
-               var z;
-               if (opts.backwards)
-                       z = first ? i <= first ? els.length + (i-first) : first-i : els.length-i;
-               else
-                       z = first ? i >= first ? els.length - (i-first) : first-i : els.length-i;
-               $(this).css('z-index', z)
-       });
-
-       // make sure first slide is visible
-       $(els[first]).css('opacity',1).show(); // opacity bit needed to handle restart use case
-       removeFilter(els[first], opts);
-
-       // stretch slides
-       if (opts.fit) {
-               if (!opts.aspect) {
-               if (opts.width)
-                   $slides.width(opts.width);
-               if (opts.height && opts.height != 'auto')
-                   $slides.height(opts.height);
-               } else {
-                       $slides.each(function(){
-                               var $slide = $(this);
-                               var ratio = (opts.aspect === true) ? $slide.width()/$slide.height() : opts.aspect;
-                               if( opts.width && $slide.width() != opts.width ) {
-                                       $slide.width( opts.width );
-                                       $slide.height( opts.width / ratio );
-                               }
-
-                               if( opts.height && $slide.height() < opts.height ) {
-                                       $slide.height( opts.height );
-                                       $slide.width( opts.height * ratio );
-                               }
-                       });
-               }
-       }
-
-       if (opts.center && ((!opts.fit) || opts.aspect)) {
-               $slides.each(function(){
-                       var $slide = $(this);
-                       $slide.css({
-                               "margin-left": opts.width ?
-                                       ((opts.width - $slide.width()) / 2) + "px" :
-                                       0,
-                               "margin-top": opts.height ?
-                                       ((opts.height - $slide.height()) / 2) + "px" :
-                                       0
-                       });
-               });
-       }
-
-       if (opts.center && !opts.fit && !opts.slideResize) {
-               $slides.each(function(){
-               var $slide = $(this);
-               $slide.css({
-                       "margin-left": opts.width ? ((opts.width - $slide.width()) / 2) + "px" : 0,
-                       "margin-top": opts.height ? ((opts.height - $slide.height()) / 2) + "px" : 0
-               });
-               });
-       }
-               
-       // stretch container
-       var reshape = opts.containerResize && !$cont.innerHeight();
-       if (reshape) { // do this only if container has no size http://tinyurl.com/da2oa9
-               var maxw = 0, maxh = 0;
-               for(var j=0; j < els.length; j++) {
-                       var $e = $(els[j]), e = $e[0], w = $e.outerWidth(), h = $e.outerHeight();
-                       if (!w) w = e.offsetWidth || e.width || $e.attr('width');
-                       if (!h) h = e.offsetHeight || e.height || $e.attr('height');
-                       maxw = w > maxw ? w : maxw;
-                       maxh = h > maxh ? h : maxh;
-               }
-               if (maxw > 0 && maxh > 0)
-                       $cont.css({width:maxw+'px',height:maxh+'px'});
-       }
-
-       var pauseFlag = false;  // https://github.com/malsup/cycle/issues/44
-       if (opts.pause)
-               $cont.hover(
-                       function(){
-                               pauseFlag = true;
-                               this.cyclePause++;
-                               triggerPause(cont, true);
-                       },
-                       function(){
-                               pauseFlag && this.cyclePause--;
-                               triggerPause(cont, true);
-                       }
-               );
-
-       if (supportMultiTransitions(opts) === false)
-               return false;
-
-       // apparently a lot of people use image slideshows without height/width attributes on the images.
-       // Cycle 2.50+ requires the sizing info for every slide; this block tries to deal with that.
-       var requeue = false;
-       options.requeueAttempts = options.requeueAttempts || 0;
-       $slides.each(function() {
-               // try to get height/width of each slide
-               var $el = $(this);
-               this.cycleH = (opts.fit && opts.height) ? opts.height : ($el.height() || this.offsetHeight || this.height || $el.attr('height') || 0);
-               this.cycleW = (opts.fit && opts.width) ? opts.width : ($el.width() || this.offsetWidth || this.width || $el.attr('width') || 0);
-
-               if ( $el.is('img') ) {
-                       // sigh..  sniffing, hacking, shrugging...  this crappy hack tries to account for what browsers do when
-                       // an image is being downloaded and the markup did not include sizing info (height/width attributes);
-                       // there seems to be some "default" sizes used in this situation
-                       var loadingIE   = ($.browser.msie  && this.cycleW == 28 && this.cycleH == 30 && !this.complete);
-                       var loadingFF   = ($.browser.mozilla && this.cycleW == 34 && this.cycleH == 19 && !this.complete);
-                       var loadingOp   = ($.browser.opera && ((this.cycleW == 42 && this.cycleH == 19) || (this.cycleW == 37 && this.cycleH == 17)) && !this.complete);
-                       var loadingOther = (this.cycleH == 0 && this.cycleW == 0 && !this.complete);
-                       // don't requeue for images that are still loading but have a valid size
-                       if (loadingIE || loadingFF || loadingOp || loadingOther) {
-                               if (o.s && opts.requeueOnImageNotLoaded && ++options.requeueAttempts < 100) { // track retry count so we don't loop forever
-                                       log(options.requeueAttempts,' - img slide not loaded, requeuing slideshow: ', this.src, this.cycleW, this.cycleH);
-                                       setTimeout(function() {$(o.s,o.c).cycle(options)}, opts.requeueTimeout);
-                                       requeue = true;
-                                       return false; // break each loop
-                               }
-                               else {
-                                       log('could not determine size of image: '+this.src, this.cycleW, this.cycleH);
-                               }
-                       }
-               }
-               return true;
-       });
-
-       if (requeue)
-               return false;
-
-       opts.cssBefore = opts.cssBefore || {};
-       opts.cssAfter = opts.cssAfter || {};
-       opts.cssFirst = opts.cssFirst || {};
-       opts.animIn = opts.animIn || {};
-       opts.animOut = opts.animOut || {};
-
-       $slides.not(':eq('+first+')').css(opts.cssBefore);
-       $($slides[first]).css(opts.cssFirst);
-
-       if (opts.timeout) {
-               opts.timeout = parseInt(opts.timeout,10);
-               // ensure that timeout and speed settings are sane
-               if (opts.speed.constructor == String)
-                       opts.speed = $.fx.speeds[opts.speed] || parseInt(opts.speed,10);
-               if (!opts.sync)
-                       opts.speed = opts.speed / 2;
-               
-               var buffer = opts.fx == 'none' ? 0 : opts.fx == 'shuffle' ? 500 : 250;
-               while((opts.timeout - opts.speed) < buffer) // sanitize timeout
-                       opts.timeout += opts.speed;
-       }
-       if (opts.easing)
-               opts.easeIn = opts.easeOut = opts.easing;
-       if (!opts.speedIn)
-               opts.speedIn = opts.speed;
-       if (!opts.speedOut)
-               opts.speedOut = opts.speed;
-
-       opts.slideCount = els.length;
-       opts.currSlide = opts.lastSlide = first;
-       if (opts.random) {
-               if (++opts.randomIndex == els.length)
-                       opts.randomIndex = 0;
-               opts.nextSlide = opts.randomMap[opts.randomIndex];
-       }
-       else if (opts.backwards)
-               opts.nextSlide = opts.startingSlide == 0 ? (els.length-1) : opts.startingSlide-1;
-       else
-               opts.nextSlide = opts.startingSlide >= (els.length-1) ? 0 : opts.startingSlide+1;
-
-       // run transition init fn
-       if (!opts.multiFx) {
-               var init = $.fn.cycle.transitions[opts.fx];
-               if ($.isFunction(init))
-                       init($cont, $slides, opts);
-               else if (opts.fx != 'custom' && !opts.multiFx) {
-                       log('unknown transition: ' + opts.fx,'; slideshow terminating');
-                       return false;
-               }
-       }
-
-       // fire artificial events
-       var e0 = $slides[first];
-       if (!opts.skipInitializationCallbacks) {
-               if (opts.before.length)
-                       opts.before[0].apply(e0, [e0, e0, opts, true]);
-               if (opts.after.length)
-                       opts.after[0].apply(e0, [e0, e0, opts, true]);
-       }
-       if (opts.next)
-               $(opts.next).bind(opts.prevNextEvent,function(){return advance(opts,1)});
-       if (opts.prev)
-               $(opts.prev).bind(opts.prevNextEvent,function(){return advance(opts,0)});
-       if (opts.pager || opts.pagerAnchorBuilder)
-               buildPager(els,opts);
-
-       exposeAddSlide(opts, els);
-
-       return opts;
-};
-
-// save off original opts so we can restore after clearing state
-function saveOriginalOpts(opts) {
-       opts.original = { before: [], after: [] };
-       opts.original.cssBefore = $.extend({}, opts.cssBefore);
-       opts.original.cssAfter  = $.extend({}, opts.cssAfter);
-       opts.original.animIn    = $.extend({}, opts.animIn);
-       opts.original.animOut   = $.extend({}, opts.animOut);
-       $.each(opts.before, function() { opts.original.before.push(this); });
-       $.each(opts.after,  function() { opts.original.after.push(this); });
-};
-
-function supportMultiTransitions(opts) {
-       var i, tx, txs = $.fn.cycle.transitions;
-       // look for multiple effects
-       if (opts.fx.indexOf(',') > 0) {
-               opts.multiFx = true;
-               opts.fxs = opts.fx.replace(/\s*/g,'').split(',');
-               // discard any bogus effect names
-               for (i=0; i < opts.fxs.length; i++) {
-                       var fx = opts.fxs[i];
-                       tx = txs[fx];
-                       if (!tx || !txs.hasOwnProperty(fx) || !$.isFunction(tx)) {
-                               log('discarding unknown transition: ',fx);
-                               opts.fxs.splice(i,1);
-                               i--;
-                       }
-               }
-               // if we have an empty list then we threw everything away!
-               if (!opts.fxs.length) {
-                       log('No valid transitions named; slideshow terminating.');
-                       return false;
-               }
-       }
-       else if (opts.fx == 'all') {  // auto-gen the list of transitions
-               opts.multiFx = true;
-               opts.fxs = [];
-               for (p in txs) {
-                       tx = txs[p];
-                       if (txs.hasOwnProperty(p) && $.isFunction(tx))
-                               opts.fxs.push(p);
-               }
-       }
-       if (opts.multiFx && opts.randomizeEffects) {
-               // munge the fxs array to make effect selection random
-               var r1 = Math.floor(Math.random() * 20) + 30;
-               for (i = 0; i < r1; i++) {
-                       var r2 = Math.floor(Math.random() * opts.fxs.length);
-                       opts.fxs.push(opts.fxs.splice(r2,1)[0]);
-               }
-               debug('randomized fx sequence: ',opts.fxs);
-       }
-       return true;
-};
-
-// provide a mechanism for adding slides after the slideshow has started
-function exposeAddSlide(opts, els) {
-       opts.addSlide = function(newSlide, prepend) {
-               var $s = $(newSlide), s = $s[0];
-               if (!opts.autostopCount)
-                       opts.countdown++;
-               els[prepend?'unshift':'push'](s);
-               if (opts.els)
-                       opts.els[prepend?'unshift':'push'](s); // shuffle needs this
-               opts.slideCount = els.length;
-
-               // add the slide to the random map and resort
-               if (opts.random) {
-                       opts.randomMap.push(opts.slideCount-1);
-                       opts.randomMap.sort(function(a,b) {return Math.random() - 0.5;});
-               }
-
-               $s.css('position','absolute');
-               $s[prepend?'prependTo':'appendTo'](opts.$cont);
-
-               if (prepend) {
-                       opts.currSlide++;
-                       opts.nextSlide++;
-               }
-
-               if (!$.support.opacity && opts.cleartype && !opts.cleartypeNoBg)
-                       clearTypeFix($s);
-
-               if (opts.fit && opts.width)
-                       $s.width(opts.width);
-               if (opts.fit && opts.height && opts.height != 'auto')
-                       $s.height(opts.height);
-               s.cycleH = (opts.fit && opts.height) ? opts.height : $s.height();
-               s.cycleW = (opts.fit && opts.width) ? opts.width : $s.width();
-
-               $s.css(opts.cssBefore);
-
-               if (opts.pager || opts.pagerAnchorBuilder)
-                       $.fn.cycle.createPagerAnchor(els.length-1, s, $(opts.pager), els, opts);
-
-               if ($.isFunction(opts.onAddSlide))
-                       opts.onAddSlide($s);
-               else
-                       $s.hide(); // default behavior
-       };
-}
-
-// reset internal state; we do this on every pass in order to support multiple effects
-$.fn.cycle.resetState = function(opts, fx) {
-       fx = fx || opts.fx;
-       opts.before = []; opts.after = [];
-       opts.cssBefore = $.extend({}, opts.original.cssBefore);
-       opts.cssAfter  = $.extend({}, opts.original.cssAfter);
-       opts.animIn     = $.extend({}, opts.original.animIn);
-       opts.animOut   = $.extend({}, opts.original.animOut);
-       opts.fxFn = null;
-       $.each(opts.original.before, function() { opts.before.push(this); });
-       $.each(opts.original.after,  function() { opts.after.push(this); });
-
-       // re-init
-       var init = $.fn.cycle.transitions[fx];
-       if ($.isFunction(init))
-               init(opts.$cont, $(opts.elements), opts);
-};
-
-// this is the main engine fn, it handles the timeouts, callbacks and slide index mgmt
-function go(els, opts, manual, fwd) {
-       // opts.busy is true if we're in the middle of an animation
-       if (manual && opts.busy && opts.manualTrump) {
-               // let manual transitions requests trump active ones
-               debug('manualTrump in go(), stopping active transition');
-               $(els).stop(true,true);
-               opts.busy = 0;
-       }
-       // don't begin another timeout-based transition if there is one active
-       if (opts.busy) {
-               debug('transition active, ignoring new tx request');
-               return;
-       }
-
-       var p = opts.$cont[0], curr = els[opts.currSlide], next = els[opts.nextSlide];
-
-       // stop cycling if we have an outstanding stop request
-       if (p.cycleStop != opts.stopCount || p.cycleTimeout === 0 && !manual)
-               return;
-
-       // check to see if we should stop cycling based on autostop options
-       if (!manual && !p.cyclePause && !opts.bounce &&
-               ((opts.autostop && (--opts.countdown <= 0)) ||
-               (opts.nowrap && !opts.random && opts.nextSlide < opts.currSlide))) {
-               if (opts.end)
-                       opts.end(opts);
-               return;
-       }
-
-       // if slideshow is paused, only transition on a manual trigger
-       var changed = false;
-       if ((manual || !p.cyclePause) && (opts.nextSlide != opts.currSlide)) {
-               changed = true;
-               var fx = opts.fx;
-               // keep trying to get the slide size if we don't have it yet
-               curr.cycleH = curr.cycleH || $(curr).height();
-               curr.cycleW = curr.cycleW || $(curr).width();
-               next.cycleH = next.cycleH || $(next).height();
-               next.cycleW = next.cycleW || $(next).width();
-
-               // support multiple transition types
-               if (opts.multiFx) {
-                       if (fwd && (opts.lastFx == undefined || ++opts.lastFx >= opts.fxs.length))
-                               opts.lastFx = 0;
-                       else if (!fwd && (opts.lastFx == undefined || --opts.lastFx < 0))
-                               opts.lastFx = opts.fxs.length - 1;
-                       fx = opts.fxs[opts.lastFx];
-               }
-
-               // one-time fx overrides apply to:  $('div').cycle(3,'zoom');
-               if (opts.oneTimeFx) {
-                       fx = opts.oneTimeFx;
-                       opts.oneTimeFx = null;
-               }
-
-               $.fn.cycle.resetState(opts, fx);
-
-               // run the before callbacks
-               if (opts.before.length)
-                       $.each(opts.before, function(i,o) {
-                               if (p.cycleStop != opts.stopCount) return;
-                               o.apply(next, [curr, next, opts, fwd]);
-                       });
-
-               // stage the after callacks
-               var after = function() {
-                       opts.busy = 0;
-                       $.each(opts.after, function(i,o) {
-                               if (p.cycleStop != opts.stopCount) return;
-                               o.apply(next, [curr, next, opts, fwd]);
-                       });
-                       if (!p.cycleStop) {
-                               // queue next transition
-                               queueNext();
-                       }
-               };
-
-               debug('tx firing('+fx+'); currSlide: ' + opts.currSlide + '; nextSlide: ' + opts.nextSlide);
-               
-               // get ready to perform the transition
-               opts.busy = 1;
-               if (opts.fxFn) // fx function provided?
-                       opts.fxFn(curr, next, opts, after, fwd, manual && opts.fastOnEvent);
-               else if ($.isFunction($.fn.cycle[opts.fx])) // fx plugin ?
-                       $.fn.cycle[opts.fx](curr, next, opts, after, fwd, manual && opts.fastOnEvent);
-               else
-                       $.fn.cycle.custom(curr, next, opts, after, fwd, manual && opts.fastOnEvent);
-       }
-       else {
-               queueNext();
-       }
-
-       if (changed || opts.nextSlide == opts.currSlide) {
-               // calculate the next slide
-               opts.lastSlide = opts.currSlide;
-               if (opts.random) {
-                       opts.currSlide = opts.nextSlide;
-                       if (++opts.randomIndex == els.length) {
-                               opts.randomIndex = 0;
-                               opts.randomMap.sort(function(a,b) {return Math.random() - 0.5;});
-                       }
-                       opts.nextSlide = opts.randomMap[opts.randomIndex];
-                       if (opts.nextSlide == opts.currSlide)
-                               opts.nextSlide = (opts.currSlide == opts.slideCount - 1) ? 0 : opts.currSlide + 1;
-               }
-               else if (opts.backwards) {
-                       var roll = (opts.nextSlide - 1) < 0;
-                       if (roll && opts.bounce) {
-                               opts.backwards = !opts.backwards;
-                               opts.nextSlide = 1;
-                               opts.currSlide = 0;
-                       }
-                       else {
-                               opts.nextSlide = roll ? (els.length-1) : opts.nextSlide-1;
-                               opts.currSlide = roll ? 0 : opts.nextSlide+1;
-                       }
-               }
-               else { // sequence
-                       var roll = (opts.nextSlide + 1) == els.length;
-                       if (roll && opts.bounce) {
-                               opts.backwards = !opts.backwards;
-                               opts.nextSlide = els.length-2;
-                               opts.currSlide = els.length-1;
-                       }
-                       else {
-                               opts.nextSlide = roll ? 0 : opts.nextSlide+1;
-                               opts.currSlide = roll ? els.length-1 : opts.nextSlide-1;
-                       }
-               }
-       }
-       if (changed && opts.pager)
-               opts.updateActivePagerLink(opts.pager, opts.currSlide, opts.activePagerClass);
-       
-       function queueNext() {
-               // stage the next transition
-               var ms = 0, timeout = opts.timeout;
-               if (opts.timeout && !opts.continuous) {
-                       ms = getTimeout(els[opts.currSlide], els[opts.nextSlide], opts, fwd);
-         if (opts.fx == 'shuffle')
-            ms -= opts.speedOut;
-      }
-               else if (opts.continuous && p.cyclePause) // continuous shows work off an after callback, not this timer logic
-                       ms = 10;
-               if (ms > 0)
-                       p.cycleTimeout = setTimeout(function(){ go(els, opts, 0, !opts.backwards) }, ms);
-       }
-};
-
-// invoked after transition
-$.fn.cycle.updateActivePagerLink = function(pager, currSlide, clsName) {
-   $(pager).each(function() {
-       $(this).children().removeClass(clsName).eq(currSlide).addClass(clsName);
-   });
-};
-
-// calculate timeout value for current transition
-function getTimeout(curr, next, opts, fwd) {
-       if (opts.timeoutFn) {
-               // call user provided calc fn
-               var t = opts.timeoutFn.call(curr,curr,next,opts,fwd);
-               while (opts.fx != 'none' && (t - opts.speed) < 250) // sanitize timeout
-                       t += opts.speed;
-               debug('calculated timeout: ' + t + '; speed: ' + opts.speed);
-               if (t !== false)
-                       return t;
-       }
-       return opts.timeout;
-};
-
-// expose next/prev function, caller must pass in state
-$.fn.cycle.next = function(opts) { advance(opts,1); };
-$.fn.cycle.prev = function(opts) { advance(opts,0);};
-
-// advance slide forward or back
-function advance(opts, moveForward) {
-       var val = moveForward ? 1 : -1;
-       var els = opts.elements;
-       var p = opts.$cont[0], timeout = p.cycleTimeout;
-       if (timeout) {
-               clearTimeout(timeout);
-               p.cycleTimeout = 0;
-       }
-       if (opts.random && val < 0) {
-               // move back to the previously display slide
-               opts.randomIndex--;
-               if (--opts.randomIndex == -2)
-                       opts.randomIndex = els.length-2;
-               else if (opts.randomIndex == -1)
-                       opts.randomIndex = els.length-1;
-               opts.nextSlide = opts.randomMap[opts.randomIndex];
-       }
-       else if (opts.random) {
-               opts.nextSlide = opts.randomMap[opts.randomIndex];
-       }
-       else {
-               opts.nextSlide = opts.currSlide + val;
-               if (opts.nextSlide < 0) {
-                       if (opts.nowrap) return false;
-                       opts.nextSlide = els.length - 1;
-               }
-               else if (opts.nextSlide >= els.length) {
-                       if (opts.nowrap) return false;
-                       opts.nextSlide = 0;
-               }
-       }
-
-       var cb = opts.onPrevNextEvent || opts.prevNextClick; // prevNextClick is deprecated
-       if ($.isFunction(cb))
-               cb(val > 0, opts.nextSlide, els[opts.nextSlide]);
-       go(els, opts, 1, moveForward);
-       return false;
-};
-
-function buildPager(els, opts) {
-       var $p = $(opts.pager);
-       $.each(els, function(i,o) {
-               $.fn.cycle.createPagerAnchor(i,o,$p,els,opts);
-       });
-       opts.updateActivePagerLink(opts.pager, opts.startingSlide, opts.activePagerClass);
-};
-
-$.fn.cycle.createPagerAnchor = function(i, el, $p, els, opts) {
-       var a;
-       if ($.isFunction(opts.pagerAnchorBuilder)) {
-               a = opts.pagerAnchorBuilder(i,el);
-               debug('pagerAnchorBuilder('+i+', el) returned: ' + a);
-       }
-       else
-               a = '<a href="#">'+(i+1)+'</a>';
-               
-       if (!a)
-               return;
-       var $a = $(a);
-       // don't reparent if anchor is in the dom
-       if ($a.parents('body').length === 0) {
-               var arr = [];
-               if ($p.length > 1) {
-                       $p.each(function() {
-                               var $clone = $a.clone(true);
-                               $(this).append($clone);
-                               arr.push($clone[0]);
-                       });
-                       $a = $(arr);
-               }
-               else {
-                       $a.appendTo($p);
-               }
-       }
-
-       opts.pagerAnchors =  opts.pagerAnchors || [];
-       opts.pagerAnchors.push($a);
-       
-       var pagerFn = function(e) {
-               e.preventDefault();
-               opts.nextSlide = i;
-               var p = opts.$cont[0], timeout = p.cycleTimeout;
-               if (timeout) {
-                       clearTimeout(timeout);
-                       p.cycleTimeout = 0;
-               }
-               var cb = opts.onPagerEvent || opts.pagerClick; // pagerClick is deprecated
-               if ($.isFunction(cb))
-                       cb(opts.nextSlide, els[opts.nextSlide]);
-               go(els,opts,1,opts.currSlide < i); // trigger the trans
-//             return false; // <== allow bubble
-       }
-       
-       if ( /mouseenter|mouseover/i.test(opts.pagerEvent) ) {
-               $a.hover(pagerFn, function(){/* no-op */} );
-       }
-       else {
-               $a.bind(opts.pagerEvent, pagerFn);
-       }
-       
-       if ( ! /^click/.test(opts.pagerEvent) && !opts.allowPagerClickBubble)
-               $a.bind('click.cycle', function(){return false;}); // suppress click
-       
-       var cont = opts.$cont[0];
-       var pauseFlag = false; // https://github.com/malsup/cycle/issues/44
-       if (opts.pauseOnPagerHover) {
-               $a.hover(
-                       function() { 
-                               pauseFlag = true;
-                               cont.cyclePause++; 
-                               triggerPause(cont,true,true);
-                       }, function() { 
-                               pauseFlag && cont.cyclePause--; 
-                               triggerPause(cont,true,true);
-                       } 
-               );
-       }
-};
-
-// helper fn to calculate the number of slides between the current and the next
-$.fn.cycle.hopsFromLast = function(opts, fwd) {
-       var hops, l = opts.lastSlide, c = opts.currSlide;
-       if (fwd)
-               hops = c > l ? c - l : opts.slideCount - l;
-       else
-               hops = c < l ? l - c : l + opts.slideCount - c;
-       return hops;
-};
-
-// fix clearType problems in ie6 by setting an explicit bg color
-// (otherwise text slides look horrible during a fade transition)
-function clearTypeFix($slides) {
-       debug('applying clearType background-color hack');
-       function hex(s) {
-               s = parseInt(s,10).toString(16);
-               return s.length < 2 ? '0'+s : s;
-       };
-       function getBg(e) {
-               for ( ; e && e.nodeName.toLowerCase() != 'html'; e = e.parentNode) {
-                       var v = $.css(e,'background-color');
-                       if (v && v.indexOf('rgb') >= 0 ) {
-                               var rgb = v.match(/\d+/g);
-                               return '#'+ hex(rgb[0]) + hex(rgb[1]) + hex(rgb[2]);
-                       }
-                       if (v && v != 'transparent')
-                               return v;
-               }
-               return '#ffffff';
-       };
-       $slides.each(function() { $(this).css('background-color', getBg(this)); });
-};
-
-// reset common props before the next transition
-$.fn.cycle.commonReset = function(curr,next,opts,w,h,rev) {
-       $(opts.elements).not(curr).hide();
-       if (typeof opts.cssBefore.opacity == 'undefined')
-               opts.cssBefore.opacity = 1;
-       opts.cssBefore.display = 'block';
-       if (opts.slideResize && w !== false && next.cycleW > 0)
-               opts.cssBefore.width = next.cycleW;
-       if (opts.slideResize && h !== false && next.cycleH > 0)
-               opts.cssBefore.height = next.cycleH;
-       opts.cssAfter = opts.cssAfter || {};
-       opts.cssAfter.display = 'none';
-       $(curr).css('zIndex',opts.slideCount + (rev === true ? 1 : 0));
-       $(next).css('zIndex',opts.slideCount + (rev === true ? 0 : 1));
-};
-
-// the actual fn for effecting a transition
-$.fn.cycle.custom = function(curr, next, opts, cb, fwd, speedOverride) {
-       var $l = $(curr), $n = $(next);
-       var speedIn = opts.speedIn, speedOut = opts.speedOut, easeIn = opts.easeIn, easeOut = opts.easeOut;
-       $n.css(opts.cssBefore);
-       if (speedOverride) {
-               if (typeof speedOverride == 'number')
-                       speedIn = speedOut = speedOverride;
-               else
-                       speedIn = speedOut = 1;
-               easeIn = easeOut = null;
-       }
-       var fn = function() {
-               $n.animate(opts.animIn, speedIn, easeIn, function() {
-                       cb();
-               });
-       };
-       $l.animate(opts.animOut, speedOut, easeOut, function() {
-               $l.css(opts.cssAfter);
-               if (!opts.sync) 
-                       fn();
-       });
-       if (opts.sync) fn();
-};
-
-// transition definitions - only fade is defined here, transition pack defines the rest
-$.fn.cycle.transitions = {
-       fade: function($cont, $slides, opts) {
-               $slides.not(':eq('+opts.currSlide+')').css('opacity',0);
-               opts.before.push(function(curr,next,opts) {
-                       $.fn.cycle.commonReset(curr,next,opts);
-                       opts.cssBefore.opacity = 0;
-               });
-               opts.animIn        = { opacity: 1 };
-               opts.animOut   = { opacity: 0 };
-               opts.cssBefore = { top: 0, left: 0 };
-       }
-};
-
-$.fn.cycle.ver = function() { return ver; };
-
-// override these globally if you like (they are all optional)
-$.fn.cycle.defaults = {
-       activePagerClass: 'activeSlide', // class name used for the active pager link
-       after:             null,  // transition callback (scope set to element that was shown):  function(currSlideElement, nextSlideElement, options, forwardFlag)
-       allowPagerClickBubble: false, // allows or prevents click event on pager anchors from bubbling
-       animIn:            null,  // properties that define how the slide animates in
-       animOut:           null,  // properties that define how the slide animates out
-       aspect:            false,  // preserve aspect ratio during fit resizing, cropping if necessary (must be used with fit option)
-       autostop:          0,     // true to end slideshow after X transitions (where X == slide count)
-       autostopCount: 0,         // number of transitions (optionally used with autostop to define X)
-       backwards:     false, // true to start slideshow at last slide and move backwards through the stack
-       before:            null,  // transition callback (scope set to element to be shown):     function(currSlideElement, nextSlideElement, options, forwardFlag)
-       center:            null,  // set to true to have cycle add top/left margin to each slide (use with width and height options)
-       cleartype:         !$.support.opacity,  // true if clearType corrections should be applied (for IE)
-       cleartypeNoBg: false, // set to true to disable extra cleartype fixing (leave false to force background color setting on slides)
-       containerResize: 1,       // resize container to fit largest slide
-       continuous:        0,     // true to start next transition immediately after current one completes
-       cssAfter:          null,  // properties that defined the state of the slide after transitioning out
-       cssBefore:         null,  // properties that define the initial state of the slide before transitioning in
-       delay:             0,     // additional delay (in ms) for first transition (hint: can be negative)
-       easeIn:            null,  // easing for "in" transition
-       easeOut:           null,  // easing for "out" transition
-       easing:            null,  // easing method for both in and out transitions
-       end:               null,  // callback invoked when the slideshow terminates (use with autostop or nowrap options): function(options)
-       fastOnEvent:   0,         // force fast transitions when triggered manually (via pager or prev/next); value == time in ms
-       fit:               0,     // force slides to fit container
-       fx:                       'fade', // name of transition effect (or comma separated names, ex: 'fade,scrollUp,shuffle')
-       fxFn:              null,  // function used to control the transition: function(currSlideElement, nextSlideElement, options, afterCalback, forwardFlag)
-       height:           'auto', // container height (if the 'fit' option is true, the slides will be set to this height as well)
-       manualTrump:   true,  // causes manual transition to stop an active transition instead of being ignored
-       metaAttr:     'cycle',// data- attribute that holds the option data for the slideshow
-       next:              null,  // element, jQuery object, or jQuery selector string for the element to use as event trigger for next slide
-       nowrap:            0,     // true to prevent slideshow from wrapping
-       onPagerEvent:  null,  // callback fn for pager events: function(zeroBasedSlideIndex, slideElement)
-       onPrevNextEvent: null,// callback fn for prev/next events: function(isNext, zeroBasedSlideIndex, slideElement)
-       pager:             null,  // element, jQuery object, or jQuery selector string for the element to use as pager container
-       pagerAnchorBuilder: null, // callback fn for building anchor links:  function(index, DOMelement)
-       pagerEvent:       'click.cycle', // name of event which drives the pager navigation
-       pause:             0,     // true to enable "pause on hover"
-       pauseOnPagerHover: 0, // true to pause when hovering over pager link
-       prev:              null,  // element, jQuery object, or jQuery selector string for the element to use as event trigger for previous slide
-       prevNextEvent:'click.cycle',// event which drives the manual transition to the previous or next slide
-       random:            0,     // true for random, false for sequence (not applicable to shuffle fx)
-       randomizeEffects: 1,  // valid when multiple effects are used; true to make the effect sequence random
-       requeueOnImageNotLoaded: true, // requeue the slideshow if any image slides are not yet loaded
-       requeueTimeout: 250,  // ms delay for requeue
-       rev:               0,     // causes animations to transition in reverse (for effects that support it such as scrollHorz/scrollVert/shuffle)
-       shuffle:           null,  // coords for shuffle animation, ex: { top:15, left: 200 }
-       skipInitializationCallbacks: false, // set to true to disable the first before/after callback that occurs prior to any transition
-       slideExpr:         null,  // expression for selecting slides (if something other than all children is required)
-       slideResize:   1,     // force slide width/height to fixed size before every transition
-       speed:             1000,  // speed of the transition (any valid fx speed value)
-       speedIn:           null,  // speed of the 'in' transition
-       speedOut:          null,  // speed of the 'out' transition
-       startingSlide: undefined,         // zero-based index of the first slide to be displayed
-       sync:              1,     // true if in/out transitions should occur simultaneously
-       timeout:           4000,  // milliseconds between slide transitions (0 to disable auto advance)
-       timeoutFn:     null,  // callback for determining per-slide timeout value:  function(currSlideElement, nextSlideElement, options, forwardFlag)
-       updateActivePagerLink: null, // callback fn invoked to update the active pager link (adds/removes activePagerClass style)
-       width:         null   // container width (if the 'fit' option is true, the slides will be set to this width as well)
-};
-
-})(jQuery);
-
-
-/*!
- * jQuery Cycle Plugin Transition Definitions
- * This script is a plugin for the jQuery Cycle Plugin
- * Examples and documentation at: http://malsup.com/jquery/cycle/
- * Copyright (c) 2007-2010 M. Alsup
- * Version:     2.73
- * Dual licensed under the MIT and GPL licenses:
- * http://www.opensource.org/licenses/mit-license.php
- * http://www.gnu.org/licenses/gpl.html
- */
-(function($) {
-
-//
-// These functions define slide initialization and properties for the named
-// transitions. To save file size feel free to remove any of these that you
-// don't need.
-//
-$.fn.cycle.transitions.none = function($cont, $slides, opts) {
-       opts.fxFn = function(curr,next,opts,after){
-               $(next).show();
-               $(curr).hide();
-               after();
-       };
-};
-
-// not a cross-fade, fadeout only fades out the top slide
-$.fn.cycle.transitions.fadeout = function($cont, $slides, opts) {
-       $slides.not(':eq('+opts.currSlide+')').css({ display: 'block', 'opacity': 1 });
-       opts.before.push(function(curr,next,opts,w,h,rev) {
-               $(curr).css('zIndex',opts.slideCount + (!rev === true ? 1 : 0));
-               $(next).css('zIndex',opts.slideCount + (!rev === true ? 0 : 1));
-       });
-       opts.animIn.opacity = 1;
-       opts.animOut.opacity = 0;
-       opts.cssBefore.opacity = 1;
-       opts.cssBefore.display = 'block';
-       opts.cssAfter.zIndex = 0;
-};
-
-// scrollUp/Down/Left/Right
-$.fn.cycle.transitions.scrollUp = function($cont, $slides, opts) {
-       $cont.css('overflow','hidden');
-       opts.before.push($.fn.cycle.commonReset);
-       var h = $cont.height();
-       opts.cssBefore.top = h;
-       opts.cssBefore.left = 0;
-       opts.cssFirst.top = 0;
-       opts.animIn.top = 0;
-       opts.animOut.top = -h;
-};
-$.fn.cycle.transitions.scrollDown = function($cont, $slides, opts) {
-       $cont.css('overflow','hidden');
-       opts.before.push($.fn.cycle.commonReset);
-       var h = $cont.height();
-       opts.cssFirst.top = 0;
-       opts.cssBefore.top = -h;
-       opts.cssBefore.left = 0;
-       opts.animIn.top = 0;
-       opts.animOut.top = h;
-};
-$.fn.cycle.transitions.scrollLeft = function($cont, $slides, opts) {
-       $cont.css('overflow','hidden');
-       opts.before.push($.fn.cycle.commonReset);
-       var w = $cont.width();
-       opts.cssFirst.left = 0;
-       opts.cssBefore.left = w;
-       opts.cssBefore.top = 0;
-       opts.animIn.left = 0;
-       opts.animOut.left = 0-w;
-};
-$.fn.cycle.transitions.scrollRight = function($cont, $slides, opts) {
-       $cont.css('overflow','hidden');
-       opts.before.push($.fn.cycle.commonReset);
-       var w = $cont.width();
-       opts.cssFirst.left = 0;
-       opts.cssBefore.left = -w;
-       opts.cssBefore.top = 0;
-       opts.animIn.left = 0;
-       opts.animOut.left = w;
-};
-$.fn.cycle.transitions.scrollHorz = function($cont, $slides, opts) {
-       $cont.css('overflow','hidden').width();
-       opts.before.push(function(curr, next, opts, fwd) {
-               if (opts.rev)
-                       fwd = !fwd;
-               $.fn.cycle.commonReset(curr,next,opts);
-               opts.cssBefore.left = fwd ? (next.cycleW-1) : (1-next.cycleW);
-               opts.animOut.left = fwd ? -curr.cycleW : curr.cycleW;
-       });
-       opts.cssFirst.left = 0;
-       opts.cssBefore.top = 0;
-       opts.animIn.left = 0;
-       opts.animOut.top = 0;
-};
-$.fn.cycle.transitions.scrollVert = function($cont, $slides, opts) {
-       $cont.css('overflow','hidden');
-       opts.before.push(function(curr, next, opts, fwd) {
-               if (opts.rev)
-                       fwd = !fwd;
-               $.fn.cycle.commonReset(curr,next,opts);
-               opts.cssBefore.top = fwd ? (1-next.cycleH) : (next.cycleH-1);
-               opts.animOut.top = fwd ? curr.cycleH : -curr.cycleH;
-       });
-       opts.cssFirst.top = 0;
-       opts.cssBefore.left = 0;
-       opts.animIn.top = 0;
-       opts.animOut.left = 0;
-};
-
-// slideX/slideY
-$.fn.cycle.transitions.slideX = function($cont, $slides, opts) {
-       opts.before.push(function(curr, next, opts) {
-               $(opts.elements).not(curr).hide();
-               $.fn.cycle.commonReset(curr,next,opts,false,true);
-               opts.animIn.width = next.cycleW;
-       });
-       opts.cssBefore.left = 0;
-       opts.cssBefore.top = 0;
-       opts.cssBefore.width = 0;
-       opts.animIn.width = 'show';
-       opts.animOut.width = 0;
-};
-$.fn.cycle.transitions.slideY = function($cont, $slides, opts) {
-       opts.before.push(function(curr, next, opts) {
-               $(opts.elements).not(curr).hide();
-               $.fn.cycle.commonReset(curr,next,opts,true,false);
-               opts.animIn.height = next.cycleH;
-       });
-       opts.cssBefore.left = 0;
-       opts.cssBefore.top = 0;
-       opts.cssBefore.height = 0;
-       opts.animIn.height = 'show';
-       opts.animOut.height = 0;
-};
-
-// shuffle
-$.fn.cycle.transitions.shuffle = function($cont, $slides, opts) {
-       var i, w = $cont.css('overflow', 'visible').width();
-       $slides.css({left: 0, top: 0});
-       opts.before.push(function(curr,next,opts) {
-               $.fn.cycle.commonReset(curr,next,opts,true,true,true);
-       });
-       // only adjust speed once!
-       if (!opts.speedAdjusted) {
-               opts.speed = opts.speed / 2; // shuffle has 2 transitions
-               opts.speedAdjusted = true;
-       }
-       opts.random = 0;
-       opts.shuffle = opts.shuffle || {left:-w, top:15};
-       opts.els = [];
-       for (i=0; i < $slides.length; i++)
-               opts.els.push($slides[i]);
-
-       for (i=0; i < opts.currSlide; i++)
-               opts.els.push(opts.els.shift());
-
-       // custom transition fn (hat tip to Benjamin Sterling for this bit of sweetness!)
-       opts.fxFn = function(curr, next, opts, cb, fwd) {
-               if (opts.rev)
-                       fwd = !fwd;
-               var $el = fwd ? $(curr) : $(next);
-               $(next).css(opts.cssBefore);
-               var count = opts.slideCount;
-               $el.animate(opts.shuffle, opts.speedIn, opts.easeIn, function() {
-                       var hops = $.fn.cycle.hopsFromLast(opts, fwd);
-                       for (var k=0; k < hops; k++)
-                               fwd ? opts.els.push(opts.els.shift()) : opts.els.unshift(opts.els.pop());
-                       if (fwd) {
-                               for (var i=0, len=opts.els.length; i < len; i++)
-                                       $(opts.els[i]).css('z-index', len-i+count);
-                       }
-                       else {
-                               var z = $(curr).css('z-index');
-                               $el.css('z-index', parseInt(z,10)+1+count);
-                       }
-                       $el.animate({left:0, top:0}, opts.speedOut, opts.easeOut, function() {
-                               $(fwd ? this : curr).hide();
-                               if (cb) cb();
-                       });
-               });
-       };
-       $.extend(opts.cssBefore, { display: 'block', opacity: 1, top: 0, left: 0 });
-};
-
-// turnUp/Down/Left/Right
-$.fn.cycle.transitions.turnUp = function($cont, $slides, opts) {
-       opts.before.push(function(curr, next, opts) {
-               $.fn.cycle.commonReset(curr,next,opts,true,false);
-               opts.cssBefore.top = next.cycleH;
-               opts.animIn.height = next.cycleH;
-               opts.animOut.width = next.cycleW;
-       });
-       opts.cssFirst.top = 0;
-       opts.cssBefore.left = 0;
-       opts.cssBefore.height = 0;
-       opts.animIn.top = 0;
-       opts.animOut.height = 0;
-};
-$.fn.cycle.transitions.turnDown = function($cont, $slides, opts) {
-       opts.before.push(function(curr, next, opts) {
-               $.fn.cycle.commonReset(curr,next,opts,true,false);
-               opts.animIn.height = next.cycleH;
-               opts.animOut.top   = curr.cycleH;
-       });
-       opts.cssFirst.top = 0;
-       opts.cssBefore.left = 0;
-       opts.cssBefore.top = 0;
-       opts.cssBefore.height = 0;
-       opts.animOut.height = 0;
-};
-$.fn.cycle.transitions.turnLeft = function($cont, $slides, opts) {
-       opts.before.push(function(curr, next, opts) {
-               $.fn.cycle.commonReset(curr,next,opts,false,true);
-               opts.cssBefore.left = next.cycleW;
-               opts.animIn.width = next.cycleW;
-       });
-       opts.cssBefore.top = 0;
-       opts.cssBefore.width = 0;
-       opts.animIn.left = 0;
-       opts.animOut.width = 0;
-};
-$.fn.cycle.transitions.turnRight = function($cont, $slides, opts) {
-       opts.before.push(function(curr, next, opts) {
-               $.fn.cycle.commonReset(curr,next,opts,false,true);
-               opts.animIn.width = next.cycleW;
-               opts.animOut.left = curr.cycleW;
-       });
-       $.extend(opts.cssBefore, { top: 0, left: 0, width: 0 });
-       opts.animIn.left = 0;
-       opts.animOut.width = 0;
-};
-
-// zoom
-$.fn.cycle.transitions.zoom = function($cont, $slides, opts) {
-       opts.before.push(function(curr, next, opts) {
-               $.fn.cycle.commonReset(curr,next,opts,false,false,true);
-               opts.cssBefore.top = next.cycleH/2;
-               opts.cssBefore.left = next.cycleW/2;
-               $.extend(opts.animIn, { top: 0, left: 0, width: next.cycleW, height: next.cycleH });
-               $.extend(opts.animOut, { width: 0, height: 0, top: curr.cycleH/2, left: curr.cycleW/2 });
-       });
-       opts.cssFirst.top = 0;
-       opts.cssFirst.left = 0;
-       opts.cssBefore.width = 0;
-       opts.cssBefore.height = 0;
-};
-
-// fadeZoom
-$.fn.cycle.transitions.fadeZoom = function($cont, $slides, opts) {
-       opts.before.push(function(curr, next, opts) {
-               $.fn.cycle.commonReset(curr,next,opts,false,false);
-               opts.cssBefore.left = next.cycleW/2;
-               opts.cssBefore.top = next.cycleH/2;
-               $.extend(opts.animIn, { top: 0, left: 0, width: next.cycleW, height: next.cycleH });
-       });
-       opts.cssBefore.width = 0;
-       opts.cssBefore.height = 0;
-       opts.animOut.opacity = 0;
-};
-
-// blindX
-$.fn.cycle.transitions.blindX = function($cont, $slides, opts) {
-       var w = $cont.css('overflow','hidden').width();
-       opts.before.push(function(curr, next, opts) {
-               $.fn.cycle.commonReset(curr,next,opts);
-               opts.animIn.width = next.cycleW;
-               opts.animOut.left   = curr.cycleW;
-       });
-       opts.cssBefore.left = w;
-       opts.cssBefore.top = 0;
-       opts.animIn.left = 0;
-       opts.animOut.left = w;
-};
-// blindY
-$.fn.cycle.transitions.blindY = function($cont, $slides, opts) {
-       var h = $cont.css('overflow','hidden').height();
-       opts.before.push(function(curr, next, opts) {
-               $.fn.cycle.commonReset(curr,next,opts);
-               opts.animIn.height = next.cycleH;
-               opts.animOut.top   = curr.cycleH;
-       });
-       opts.cssBefore.top = h;
-       opts.cssBefore.left = 0;
-       opts.animIn.top = 0;
-       opts.animOut.top = h;
-};
-// blindZ
-$.fn.cycle.transitions.blindZ = function($cont, $slides, opts) {
-       var h = $cont.css('overflow','hidden').height();
-       var w = $cont.width();
-       opts.before.push(function(curr, next, opts) {
-               $.fn.cycle.commonReset(curr,next,opts);
-               opts.animIn.height = next.cycleH;
-               opts.animOut.top   = curr.cycleH;
-       });
-       opts.cssBefore.top = h;
-       opts.cssBefore.left = w;
-       opts.animIn.top = 0;
-       opts.animIn.left = 0;
-       opts.animOut.top = h;
-       opts.animOut.left = w;
-};
-
-// growX - grow horizontally from centered 0 width
-$.fn.cycle.transitions.growX = function($cont, $slides, opts) {
-       opts.before.push(function(curr, next, opts) {
-               $.fn.cycle.commonReset(curr,next,opts,false,true);
-               opts.cssBefore.left = this.cycleW/2;
-               opts.animIn.left = 0;
-               opts.animIn.width = this.cycleW;
-               opts.animOut.left = 0;
-       });
-       opts.cssBefore.top = 0;
-       opts.cssBefore.width = 0;
-};
-// growY - grow vertically from centered 0 height
-$.fn.cycle.transitions.growY = function($cont, $slides, opts) {
-       opts.before.push(function(curr, next, opts) {
-               $.fn.cycle.commonReset(curr,next,opts,true,false);
-               opts.cssBefore.top = this.cycleH/2;
-               opts.animIn.top = 0;
-               opts.animIn.height = this.cycleH;
-               opts.animOut.top = 0;
-       });
-       opts.cssBefore.height = 0;
-       opts.cssBefore.left = 0;
-};
-
-// curtainX - squeeze in both edges horizontally
-$.fn.cycle.transitions.curtainX = function($cont, $slides, opts) {
-       opts.before.push(function(curr, next, opts) {
-               $.fn.cycle.commonReset(curr,next,opts,false,true,true);
-               opts.cssBefore.left = next.cycleW/2;
-               opts.animIn.left = 0;
-               opts.animIn.width = this.cycleW;
-               opts.animOut.left = curr.cycleW/2;
-               opts.animOut.width = 0;
-       });
-       opts.cssBefore.top = 0;
-       opts.cssBefore.width = 0;
-};
-// curtainY - squeeze in both edges vertically
-$.fn.cycle.transitions.curtainY = function($cont, $slides, opts) {
-       opts.before.push(function(curr, next, opts) {
-               $.fn.cycle.commonReset(curr,next,opts,true,false,true);
-               opts.cssBefore.top = next.cycleH/2;
-               opts.animIn.top = 0;
-               opts.animIn.height = next.cycleH;
-               opts.animOut.top = curr.cycleH/2;
-               opts.animOut.height = 0;
-       });
-       opts.cssBefore.height = 0;
-       opts.cssBefore.left = 0;
-};
-
-// cover - curr slide covered by next slide
-$.fn.cycle.transitions.cover = function($cont, $slides, opts) {
-       var d = opts.direction || 'left';
-       var w = $cont.css('overflow','hidden').width();
-       var h = $cont.height();
-       opts.before.push(function(curr, next, opts) {
-               $.fn.cycle.commonReset(curr,next,opts);
-               if (d == 'right')
-                       opts.cssBefore.left = -w;
-               else if (d == 'up')
-                       opts.cssBefore.top = h;
-               else if (d == 'down')
-                       opts.cssBefore.top = -h;
-               else
-                       opts.cssBefore.left = w;
-       });
-       opts.animIn.left = 0;
-       opts.animIn.top = 0;
-       opts.cssBefore.top = 0;
-       opts.cssBefore.left = 0;
-};
-
-// uncover - curr slide moves off next slide
-$.fn.cycle.transitions.uncover = function($cont, $slides, opts) {
-       var d = opts.direction || 'left';
-       var w = $cont.css('overflow','hidden').width();
-       var h = $cont.height();
-       opts.before.push(function(curr, next, opts) {
-               $.fn.cycle.commonReset(curr,next,opts,true,true,true);
-               if (d == 'right')
-                       opts.animOut.left = w;
-               else if (d == 'up')
-                       opts.animOut.top = -h;
-               else if (d == 'down')
-                       opts.animOut.top = h;
-               else
-                       opts.animOut.left = -w;
-       });
-       opts.animIn.left = 0;
-       opts.animIn.top = 0;
-       opts.cssBefore.top = 0;
-       opts.cssBefore.left = 0;
-};
-
-// toss - move top slide and fade away
-$.fn.cycle.transitions.toss = function($cont, $slides, opts) {
-       var w = $cont.css('overflow','visible').width();
-       var h = $cont.height();
-       opts.before.push(function(curr, next, opts) {
-               $.fn.cycle.commonReset(curr,next,opts,true,true,true);
-               // provide default toss settings if animOut not provided
-               if (!opts.animOut.left && !opts.animOut.top)
-                       $.extend(opts.animOut, { left: w*2, top: -h/2, opacity: 0 });
-               else
-                       opts.animOut.opacity = 0;
-       });
-       opts.cssBefore.left = 0;
-       opts.cssBefore.top = 0;
-       opts.animIn.left = 0;
-};
-
-// wipe - clip animation
-$.fn.cycle.transitions.wipe = function($cont, $slides, opts) {
-       var w = $cont.css('overflow','hidden').width();
-       var h = $cont.height();
-       opts.cssBefore = opts.cssBefore || {};
-       var clip;
-       if (opts.clip) {
-               if (/l2r/.test(opts.clip))
-                       clip = 'rect(0px 0px '+h+'px 0px)';
-               else if (/r2l/.test(opts.clip))
-                       clip = 'rect(0px '+w+'px '+h+'px '+w+'px)';
-               else if (/t2b/.test(opts.clip))
-                       clip = 'rect(0px '+w+'px 0px 0px)';
-               else if (/b2t/.test(opts.clip))
-                       clip = 'rect('+h+'px '+w+'px '+h+'px 0px)';
-               else if (/zoom/.test(opts.clip)) {
-                       var top = parseInt(h/2,10);
-                       var left = parseInt(w/2,10);
-                       clip = 'rect('+top+'px '+left+'px '+top+'px '+left+'px)';
-               }
-       }
-
-       opts.cssBefore.clip = opts.cssBefore.clip || clip || 'rect(0px 0px 0px 0px)';
-
-       var d = opts.cssBefore.clip.match(/(\d+)/g);
-       var t = parseInt(d[0],10), r = parseInt(d[1],10), b = parseInt(d[2],10), l = parseInt(d[3],10);
-
-       opts.before.push(function(curr, next, opts) {
-               if (curr == next) return;
-               var $curr = $(curr), $next = $(next);
-               $.fn.cycle.commonReset(curr,next,opts,true,true,false);
-               opts.cssAfter.display = 'block';
-
-               var step = 1, count = parseInt((opts.speedIn / 13),10) - 1;
-               (function f() {
-                       var tt = t ? t - parseInt(step * (t/count),10) : 0;
-                       var ll = l ? l - parseInt(step * (l/count),10) : 0;
-                       var bb = b < h ? b + parseInt(step * ((h-b)/count || 1),10) : h;
-                       var rr = r < w ? r + parseInt(step * ((w-r)/count || 1),10) : w;
-                       $next.css({ clip: 'rect('+tt+'px '+rr+'px '+bb+'px '+ll+'px)' });
-                       (step++ <= count) ? setTimeout(f, 13) : $curr.css('display', 'none');
-               })();
-       });
-       $.extend(opts.cssBefore, { display: 'block', opacity: 1, top: 0, left: 0 });
-       opts.animIn        = { left: 0 };
-       opts.animOut   = { left: 0 };
-};
-
-})(jQuery);
diff --git a/resources/jquery/jquery.delayedBind.js b/resources/jquery/jquery.delayedBind.js
deleted file mode 100644 (file)
index 874c111..0000000
+++ /dev/null
@@ -1,83 +0,0 @@
-( function ( mw, $ ) {
-/**
- * Function that escapes spaces in event names. This is needed because
- * "_delayedBind-foo bar-1000" refers to two events
- */
-function encodeEvent( event ) {
-       return event.replace( /-/g, '--' ).replace( / /g, '-' );
-}
-
-$.fn.extend( {
-       /**
-        * Bind a callback to an event in a delayed fashion.
-        * In detail, this means that the callback will be called a certain
-        * time after the event fires, but the timer is reset every time
-        * the event fires.
-        * @param timeout Number of milliseconds to wait
-        * @param event Name of the event (string)
-        * @param data Data to pass to the event handler (optional)
-        * @param callback Function to call
-        */
-       delayedBind: function ( timeout, event, data, callback ) {
-               if ( arguments.length === 3 ) {
-                       // Shift optional parameter down
-                       callback = data;
-                       data = undefined;
-               }
-               var encEvent = encodeEvent( event );
-               return this.each( function () {
-                       var that = this;
-                       // Bind the top half
-                       // Do this only once for every (event, timeout) pair
-                       if (  !( $(this).data( '_delayedBindBound-' + encEvent + '-' + timeout ) ) ) {
-                               $(this).data( '_delayedBindBound-' + encEvent + '-' + timeout, true );
-                               $(this).bind( event, function () {
-                                       var timerID = $(this).data( '_delayedBindTimerID-' + encEvent + '-' + timeout );
-                                       // Cancel the running timer
-                                       if ( timerID !== null ) {
-                                               clearTimeout( timerID );
-                                       }
-                                       timerID = setTimeout( function () {
-                                               $(that).trigger( '_delayedBind-' + encEvent + '-' + timeout );
-                                       }, timeout );
-                                       $(this).data( '_delayedBindTimerID-' + encEvent + '-' + timeout, timerID );
-                               } );
-                       }
-
-                       // Bottom half
-                       $(this).bind( '_delayedBind-' + encEvent + '-' + timeout, data, callback );
-               } );
-       },
-
-       /**
-        * Cancel the timers for delayed events on the selected elements.
-        */
-       delayedBindCancel: function ( timeout, event ) {
-               var encEvent = encodeEvent( event );
-               return this.each( function () {
-                       var timerID = $(this).data( '_delayedBindTimerID-' + encEvent + '-' + timeout );
-                       if ( timerID !== null ) {
-                               clearTimeout( timerID );
-                       }
-               } );
-       },
-
-       /**
-        * Unbind an event bound with delayedBind()
-        */
-       delayedBindUnbind: function ( timeout, event, callback ) {
-               var encEvent = encodeEvent( event );
-               return this.each( function () {
-                       $(this).unbind( '_delayedBind-' + encEvent + '-' + timeout, callback );
-               } );
-       }
-} );
-
-mw.log.deprecate( $.fn, 'delayedBind', $.fn.delayedBind,
-       'Use the jquery.throttle-debounce module instead' );
-mw.log.deprecate( $.fn, 'delayedBindCancel', $.fn.delayedBindCancel,
-       'Use the jquery.throttle-debounce module instead' );
-mw.log.deprecate( $.fn, 'delayedBindUnbind', $.fn.delayedBindUnbind,
-       'Use the jquery.throttle-debounce module instead' );
-
-}( mediaWiki, jQuery ) );
diff --git a/resources/jquery/jquery.expandableField.js b/resources/jquery/jquery.expandableField.js
deleted file mode 100644 (file)
index 732cc6e..0000000
+++ /dev/null
@@ -1,140 +0,0 @@
-/**
- * This plugin provides functionality to expand a text box on focus to double it's current width
- *
- * Usage:
- *
- * Set options:
- *             $('#textbox').expandableField( { option1: value1, option2: value2 } );
- *             $('#textbox').expandableField( option, value );
- * Get option:
- *             value = $('#textbox').expandableField( option );
- * Initialize:
- *             $('#textbox').expandableField();
- *
- * Options:
- *
- */
-( function ( $ ) {
-
-       $.expandableField = {
-               /**
-                * Expand the field, make the callback
-                */
-               expandField: function ( e, context ) {
-                       context.config.beforeExpand.call( context.data.$field, context );
-                       context.data.$field
-                               .animate( { 'width': context.data.expandedWidth }, 'fast', function () {
-                                       context.config.afterExpand.call( this, context );
-                               } );
-               },
-               /**
-                * Condense the field, make the callback
-                */
-               condenseField: function ( e, context ) {
-                       context.config.beforeCondense.call( context.data.$field, context );
-                       context.data.$field
-                               .animate( { 'width': context.data.condensedWidth }, 'fast', function () {
-                                       context.config.afterCondense.call( this, context );
-                               } );
-               },
-               /**
-                * Sets the value of a property, and updates the widget accordingly
-                * @param property String Name of property
-                * @param value Mixed Value to set property with
-                */
-               configure: function ( context, property, value ) {
-                       // TODO: Validate creation using fallback values
-                       context.config[property] = value;
-               }
-
-       };
-
-       $.fn.expandableField = function () {
-
-               // Multi-context fields
-               var returnValue,
-                       args = arguments;
-
-               $( this ).each( function () {
-                       var key, context, timeout;
-
-                       /* Construction / Loading */
-
-                       context = $( this ).data( 'expandableField-context' );
-
-                       // TODO: Do we need to check both null and undefined?
-                       if ( context === undefined || context === null ) {
-                               context = {
-                                       config: {
-                                               // callback function for before collapse
-                                               beforeCondense: function () {},
-
-                                               // callback function for before expand
-                                               beforeExpand: function () {},
-
-                                               // callback function for after collapse
-                                               afterCondense: function () {},
-
-                                               // callback function for after expand
-                                               afterExpand: function () {},
-
-                                               // Whether the field should expand to the left or the right -- defaults to left
-                                               expandToLeft: true
-                                       }
-                               };
-                       }
-
-                       /* API */
-                       // Handle various calling styles
-                       if ( args.length > 0 ) {
-                               if ( typeof args[0] === 'object' ) {
-                                       // Apply set of properties
-                                       for ( key in args[0] ) {
-                                               $.expandableField.configure( context, key, args[0][key] );
-                                       }
-                               } else if ( typeof args[0] === 'string' ) {
-                                       if ( args.length > 1 ) {
-                                               // Set property values
-                                               $.expandableField.configure( context, args[0], args[1] );
-
-                                       // TODO: Do we need to check both null and undefined?
-                                       } else if ( returnValue === null || returnValue === undefined ) {
-                                               // Get property values, but don't give access to internal data - returns only the first
-                                               returnValue = ( args[0] in context.config ? undefined : context.config[args[0]] );
-                                       }
-                               }
-                       }
-
-                       /* Initialization */
-
-                       if ( context.data === undefined ) {
-                               context.data = {
-                                       // The width of the field in it's condensed state
-                                       condensedWidth: $( this ).width(),
-
-                                       // The width of the field in it's expanded state
-                                       expandedWidth: $( this ).width() * 2,
-
-                                       // Reference to the field
-                                       $field: $( this )
-                               };
-
-                               $( this )
-                                       .addClass( 'expandableField' )
-                                       .focus( function ( e ) {
-                                               clearTimeout( timeout );
-                                               $.expandableField.expandField( e, context );
-                                       } )
-                                       .blur( function ( e ) {
-                                               timeout = setTimeout( function () {
-                                                       $.expandableField.condenseField( e, context );
-                                               }, 250 );
-                                       } );
-                       }
-                       // Store the context for next time
-                       $( this ).data( 'expandableField-context', context );
-               } );
-               return returnValue !== undefined ? returnValue : $(this);
-       };
-
-}( jQuery ) );
diff --git a/resources/jquery/jquery.farbtastic.css b/resources/jquery/jquery.farbtastic.css
deleted file mode 100644 (file)
index 1c6428f..0000000
+++ /dev/null
@@ -1,54 +0,0 @@
-/**
- * Farbtastic Color Picker 1.2
- * © 2008 Steven Wittens
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
- */
-.farbtastic {
-       position: relative;
-}
-.farbtastic * {
-       position: absolute;
-       cursor: crosshair;
-}
-.farbtastic, .farbtastic .wheel {
-       width: 195px;
-       height: 195px;
-}
-.farbtastic .color, .farbtastic .overlay {
-       top: 47px;
-       left: 47px;
-       width: 101px;
-       height: 101px;
-}
-.farbtastic .wheel {
-       /* @embed */
-       background: url(images/wheel.png) no-repeat;
-       width: 195px;
-       height: 195px;
-}
-.farbtastic .overlay {
-       /* @embed */
-       background: url(images/mask.png) no-repeat;
-}
-.farbtastic .marker {
-       width: 17px;
-       height: 17px;
-       margin: -8px 0 0 -8px;
-       overflow: hidden;
-       /* @embed */
-       background: url(images/marker.png) no-repeat;
-}
-
diff --git a/resources/jquery/jquery.farbtastic.js b/resources/jquery/jquery.farbtastic.js
deleted file mode 100644 (file)
index 1881085..0000000
+++ /dev/null
@@ -1,286 +0,0 @@
-/**
- * Farbtastic Color Picker 1.2
- * © 2008 Steven Wittens
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
- */
-
-//Adapted to uniform style with jQuery UI widgets and slightly change behavior
-//TODO:
-// - remove duplicated code by replacing it with jquery.colorUtils and modern jQuery
-// - uniform code style
-
-jQuery.fn.farbtastic = function (callback) {
-       $.farbtastic(this, callback);
-       return this;
-};
-
-jQuery.farbtastic = function (container, callback) {
-       var container = $(container).get(0);
-       return container.farbtastic || (container.farbtastic = new jQuery._farbtastic(container, callback));
-}
-
-jQuery._farbtastic = function (container, callback) {
-       // Store farbtastic object
-       var fb = this;
-
-       // Insert markup
-       $(container).html('<div class="farbtastic ui-widget-content"><div class="color"></div><div class="wheel"></div><div class="overlay"></div><div class="h-marker marker"></div><div class="sl-marker marker"></div></div>');
-       $(container).addClass('ui-widget');
-       var e = $('.farbtastic', container);
-       fb.wheel = $('.wheel', container).get(0);
-       // Dimensions
-       fb.radius = 84;
-       fb.square = 100;
-       fb.width = 194;
-
-       // Fix background PNGs in IE6
-       if (navigator.appVersion.match(/MSIE [0-6]\./)) {
-               $('*', e).each(function () {
-                       if (this.currentStyle.backgroundImage != 'none') {
-                               var image = this.currentStyle.backgroundImage;
-                               image = this.currentStyle.backgroundImage.substring(5, image.length - 2);
-                               $(this).css({
-                                       'backgroundImage': 'none',
-                                       'filter': "progid:DXImageTransform.Microsoft.AlphaImageLoader(enabled=true, sizingMethod=crop, src='" + image + "')"
-                               });
-                       }
-               });
-       }
-
-       /**
-        * Link to the given element(s) or callback.
-        */
-       fb.linkTo = function (callback) {
-               // Unbind previous nodes
-               if (typeof fb.callback == 'object') {
-                       $(fb.callback).unbind('keyup', fb.updateValue);
-               }
-
-               // Reset color
-               fb.color = null;
-
-               // Bind callback or elements
-               if (typeof callback == 'function') {
-                       fb.callback = callback;
-               }
-               else if (typeof callback == 'object' || typeof callback == 'string') {
-                       fb.callback = $(callback);
-                       fb.callback.bind('keyup', fb.updateValue);
-                       if (fb.callback.get(0).value) {
-                               fb.setColor(fb.callback.get(0).value);
-                       }
-               }
-               return this;
-       }
-       fb.updateValue = function (event) {
-               if (this.value != fb.color) {
-                       fb.setColor(this.value);
-               }
-       }
-
-       /**
-        * Change color with HTML syntax #123456
-        */
-       fb.setColor = function (color) {
-               var rgb = $.colorUtil.getRGB( color );
-               if (fb.color != color && rgb) {
-                       rgb = rgb.slice( 0 ); //make a clone
-                       //TODO: rewrite code so that this is not needed
-                       rgb[0] /= 255;
-                       rgb[1] /= 255;
-                       rgb[2] /= 255;
-                       fb.color = color;
-                       fb.rgb = rgb;
-                       fb.hsl = fb.RGBToHSL(fb.rgb);
-                       fb.updateDisplay();
-               }
-               return this;
-       }
-
-       /**
-        * Change color with HSL triplet [0..1, 0..1, 0..1]
-        */
-       fb.setHSL = function (hsl) {
-               fb.hsl = hsl;
-               fb.rgb = fb.HSLToRGB(hsl);
-               fb.color = fb.pack(fb.rgb);
-               fb.updateDisplay();
-               return this;
-       }
-
-       /////////////////////////////////////////////////////
-
-       /**
-        * Retrieve the coordinates of the given event relative to the center
-        * of the widget.
-        */
-       fb.widgetCoords = function (event) {
-               var ref = $( fb.wheel ).offset();
-               return {
-                       x: event.pageX - ref.left - fb.width / 2,
-                       y: event.pageY - ref.top - fb.width / 2
-               };
-       }
-
-       /**
-        * Mousedown handler
-        */
-       fb.mousedown = function (event) {
-               // Capture mouse
-               if (!document.dragging) {
-                       $(document).bind('mousemove', fb.mousemove).bind('mouseup', fb.mouseup);
-                       document.dragging = true;
-               }
-
-               // Check which area is being dragged
-               var pos = fb.widgetCoords(event);
-               fb.circleDrag = Math.max(Math.abs(pos.x), Math.abs(pos.y)) * 2 > fb.square;
-
-               // Process
-               fb.mousemove(event);
-               return false;
-       }
-
-       /**
-        * Mousemove handler
-        */
-       fb.mousemove = function (event) {
-               // Get coordinates relative to color picker center
-               var pos = fb.widgetCoords(event);
-
-               // Set new HSL parameters
-               if (fb.circleDrag) {
-                       var hue = Math.atan2(pos.x, -pos.y) / 6.28;
-                       if (hue < 0) hue += 1;
-                       fb.setHSL([hue, fb.hsl[1], fb.hsl[2]]);
-               }
-               else {
-                       var sat = Math.max(0, Math.min(1, -(pos.x / fb.square) + .5));
-                       var lum = Math.max(0, Math.min(1, -(pos.y / fb.square) + .5));
-                       fb.setHSL([fb.hsl[0], sat, lum]);
-               }
-               return false;
-       }
-
-       /**
-        * Mouseup handler
-        */
-       fb.mouseup = function () {
-               // Uncapture mouse
-               $(document).unbind('mousemove', fb.mousemove);
-               $(document).unbind('mouseup', fb.mouseup);
-               document.dragging = false;
-       }
-
-       /**
-        * Update the markers and styles
-        */
-       fb.updateDisplay = function () {
-               // Markers
-               var angle = fb.hsl[0] * 6.28;
-               $('.h-marker', e).css({
-                       left: Math.round(Math.sin(angle) * fb.radius + fb.width / 2) + 'px',
-                       top: Math.round(-Math.cos(angle) * fb.radius + fb.width / 2) + 'px'
-               });
-
-               $('.sl-marker', e).css({
-                       left: Math.round(fb.square * (.5 - fb.hsl[1]) + fb.width / 2) + 'px',
-                       top: Math.round(fb.square * (.5 - fb.hsl[2]) + fb.width / 2) + 'px'
-               });
-
-               // Saturation/Luminance gradient
-               $('.color', e).css('backgroundColor', fb.pack(fb.HSLToRGB([fb.hsl[0], 1, 0.5])));
-
-               // Linked elements or callback
-               if (typeof fb.callback == 'object') {
-                       // Set background/foreground color
-                       $(fb.callback).css({
-                               backgroundColor: fb.color,
-                               color: fb.hsl[2] > 0.5 ? '#000' : '#fff'
-                       });
-
-                       // Change linked value
-                       $(fb.callback).each(function() {
-                               if ( $( this ).val() != fb.color) {
-                                       $( this ).val( fb.color ).change();
-                               }
-                       });
-               }
-               else if (typeof fb.callback == 'function') {
-                       fb.callback.call(fb, fb.color);
-               }
-       }
-
-       /* Various color utility functions */
-       fb.pack = function (rgb) {
-               var r = Math.round(rgb[0] * 255);
-               var g = Math.round(rgb[1] * 255);
-               var b = Math.round(rgb[2] * 255);
-               return '#' + (r < 16 ? '0' : '') + r.toString(16) +
-                                        (g < 16 ? '0' : '') + g.toString(16) +
-                                        (b < 16 ? '0' : '') + b.toString(16);
-       }
-
-       fb.HSLToRGB = function (hsl) {
-               var m1, m2, r, g, b;
-               var h = hsl[0], s = hsl[1], l = hsl[2];
-               m2 = (l <= 0.5) ? l * (s + 1) : l + s - l*s;
-               m1 = l * 2 - m2;
-               return [this.hueToRGB(m1, m2, h+0.33333),
-                               this.hueToRGB(m1, m2, h),
-                               this.hueToRGB(m1, m2, h-0.33333)];
-       }
-
-       fb.hueToRGB = function (m1, m2, h) {
-               h = (h < 0) ? h + 1 : ((h > 1) ? h - 1 : h);
-               if (h * 6 < 1) return m1 + (m2 - m1) * h * 6;
-               if (h * 2 < 1) return m2;
-               if (h * 3 < 2) return m1 + (m2 - m1) * (0.66666 - h) * 6;
-               return m1;
-       }
-
-       fb.RGBToHSL = function (rgb) {
-               var min, max, delta, h, s, l;
-               var r = rgb[0], g = rgb[1], b = rgb[2];
-               min = Math.min(r, Math.min(g, b));
-               max = Math.max(r, Math.max(g, b));
-               delta = max - min;
-               l = (min + max) / 2;
-               s = 0;
-               if (l > 0 && l < 1) {
-                       s = delta / (l < 0.5 ? (2 * l) : (2 - 2 * l));
-               }
-               h = 0;
-               if (delta > 0) {
-                       if (max == r && max != g) h += (g - b) / delta;
-                       if (max == g && max != b) h += (2 + (b - r) / delta);
-                       if (max == b && max != r) h += (4 + (r - g) / delta);
-                       h /= 6;
-               }
-               return [h, s, l];
-       }
-
-       // Install mousedown handler (the others are set on the document on-demand)
-       $('*', e).mousedown(fb.mousedown);
-
-               // Init color
-       fb.setColor('#000000');
-
-       // Set linked elements/callback
-       if (callback) {
-               fb.linkTo(callback);
-       }
-}
diff --git a/resources/jquery/jquery.footHovzer.css b/resources/jquery/jquery.footHovzer.css
deleted file mode 100644 (file)
index 77d9514..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-#jquery-foot-hovzer {
-       position: fixed;
-       bottom: 0;
-       width: 100%;
-       z-index: 1000;
-}
diff --git a/resources/jquery/jquery.footHovzer.js b/resources/jquery/jquery.footHovzer.js
deleted file mode 100644 (file)
index 56fc32d..0000000
+++ /dev/null
@@ -1,45 +0,0 @@
-/**
- * Utility to stack stuff in an overlay fixed on the bottom of the page.
- *
- * Usage:
- * <code>
- *     var hovzer = $.getFootHovzer();
- *     hovzer.$.append( $myCollection );
- *     hovzer.update();
- * </code>
- *
- * @author Timo Tijhof, 2012
- */
-( function ( $ ) {
-       var $hovzer, footHovzer, prevHeight, newHeight;
-
-       function getHovzer() {
-               if ( $hovzer === undefined ) {
-                       $hovzer = $( '<div id="jquery-foot-hovzer"></div>' ).appendTo( 'body' );
-               }
-               return $hovzer;
-       }
-
-       footHovzer = {
-               update: function () {
-                       var $body;
-
-                       $body = $( 'body' );
-                       if ( prevHeight === undefined ) {
-                               prevHeight = getHovzer().outerHeight( /*includeMargin=*/true );
-                               $body.css( 'paddingBottom', '+=' + prevHeight + 'px' );
-                       } else {
-                               newHeight = getHovzer().outerHeight( true );
-                               $body.css( 'paddingBottom', ( parseFloat( $body.css( 'paddingBottom' ) ) - prevHeight ) + newHeight );
-
-                               prevHeight = newHeight;
-                       }
-               }
-       };
-
-       $.getFootHovzer = function () {
-               footHovzer.$ = getHovzer();
-               return footHovzer;
-       };
-
-}( jQuery ) );
diff --git a/resources/jquery/jquery.form.js b/resources/jquery/jquery.form.js
deleted file mode 100644 (file)
index 13e9a55..0000000
+++ /dev/null
@@ -1,1089 +0,0 @@
-/*!
- * jQuery Form Plugin
- * version: 3.14 (30-JUL-2012)
- * @requires jQuery v1.3.2 or later
- *
- * Examples and documentation at: http://malsup.com/jquery/form/
- * Project repository: https://github.com/malsup/form
- * Dual licensed under the MIT and GPL licenses:
- *    http://malsup.github.com/mit-license.txt
- *    http://malsup.github.com/gpl-license-v2.txt
- */
-/*global ActiveXObject alert */
-;(function($) {
-"use strict";
-
-/*
-    Usage Note:
-    -----------
-    Do not use both ajaxSubmit and ajaxForm on the same form.  These
-    functions are mutually exclusive.  Use ajaxSubmit if you want
-    to bind your own submit handler to the form.  For example,
-
-    $(document).ready(function() {
-        $('#myForm').on('submit', function(e) {
-            e.preventDefault(); // <-- important
-            $(this).ajaxSubmit({
-                target: '#output'
-            });
-        });
-    });
-
-    Use ajaxForm when you want the plugin to manage all the event binding
-    for you.  For example,
-
-    $(document).ready(function() {
-        $('#myForm').ajaxForm({
-            target: '#output'
-        });
-    });
-    
-    You can also use ajaxForm with delegation (requires jQuery v1.7+), so the
-    form does not have to exist when you invoke ajaxForm:
-
-    $('#myForm').ajaxForm({
-        delegation: true,
-        target: '#output'
-    });
-    
-    When using ajaxForm, the ajaxSubmit function will be invoked for you
-    at the appropriate time.
-*/
-
-/**
- * Feature detection
- */
-var feature = {};
-feature.fileapi = $("<input type='file'/>").get(0).files !== undefined;
-feature.formdata = window.FormData !== undefined;
-
-/**
- * ajaxSubmit() provides a mechanism for immediately submitting
- * an HTML form using AJAX.
- */
-$.fn.ajaxSubmit = function(options) {
-    /*jshint scripturl:true */
-
-    // fast fail if nothing selected (http://dev.jquery.com/ticket/2752)
-    if (!this.length) {
-        log('ajaxSubmit: skipping submit process - no element selected');
-        return this;
-    }
-    
-    var method, action, url, $form = this;
-
-    if (typeof options == 'function') {
-        options = { success: options };
-    }
-
-    method = this.attr('method');
-    action = this.attr('action');
-    url = (typeof action === 'string') ? $.trim(action) : '';
-    url = url || window.location.href || '';
-    if (url) {
-        // clean url (don't include hash vaue)
-        url = (url.match(/^([^#]+)/)||[])[1];
-    }
-
-    options = $.extend(true, {
-        url:  url,
-        success: $.ajaxSettings.success,
-        type: method || 'GET',
-        iframeSrc: /^https/i.test(window.location.href || '') ? 'javascript:false' : 'about:blank'
-    }, options);
-
-    // hook for manipulating the form data before it is extracted;
-    // convenient for use with rich editors like tinyMCE or FCKEditor
-    var veto = {};
-    this.trigger('form-pre-serialize', [this, options, veto]);
-    if (veto.veto) {
-        log('ajaxSubmit: submit vetoed via form-pre-serialize trigger');
-        return this;
-    }
-
-    // provide opportunity to alter form data before it is serialized
-    if (options.beforeSerialize && options.beforeSerialize(this, options) === false) {
-        log('ajaxSubmit: submit aborted via beforeSerialize callback');
-        return this;
-    }
-
-    var traditional = options.traditional;
-    if ( traditional === undefined ) {
-        traditional = $.ajaxSettings.traditional;
-    }
-    
-    var elements = [];
-    var qx, a = this.formToArray(options.semantic, elements);
-    if (options.data) {
-        options.extraData = options.data;
-        qx = $.param(options.data, traditional);
-    }
-
-    // give pre-submit callback an opportunity to abort the submit
-    if (options.beforeSubmit && options.beforeSubmit(a, this, options) === false) {
-        log('ajaxSubmit: submit aborted via beforeSubmit callback');
-        return this;
-    }
-
-    // fire vetoable 'validate' event
-    this.trigger('form-submit-validate', [a, this, options, veto]);
-    if (veto.veto) {
-        log('ajaxSubmit: submit vetoed via form-submit-validate trigger');
-        return this;
-    }
-
-    var q = $.param(a, traditional);
-    if (qx) {
-        q = ( q ? (q + '&' + qx) : qx );
-    }    
-    if (options.type.toUpperCase() == 'GET') {
-        options.url += (options.url.indexOf('?') >= 0 ? '&' : '?') + q;
-        options.data = null;  // data is null for 'get'
-    }
-    else {
-        options.data = q; // data is the query string for 'post'
-    }
-
-    var callbacks = [];
-    if (options.resetForm) {
-        callbacks.push(function() { $form.resetForm(); });
-    }
-    if (options.clearForm) {
-        callbacks.push(function() { $form.clearForm(options.includeHidden); });
-    }
-
-    // perform a load on the target only if dataType is not provided
-    if (!options.dataType && options.target) {
-        var oldSuccess = options.success || function(){};
-        callbacks.push(function(data) {
-            var fn = options.replaceTarget ? 'replaceWith' : 'html';
-            $(options.target)[fn](data).each(oldSuccess, arguments);
-        });
-    }
-    else if (options.success) {
-        callbacks.push(options.success);
-    }
-
-    options.success = function(data, status, xhr) { // jQuery 1.4+ passes xhr as 3rd arg
-        var context = options.context || this ;    // jQuery 1.4+ supports scope context 
-        for (var i=0, max=callbacks.length; i < max; i++) {
-            callbacks[i].apply(context, [data, status, xhr || $form, $form]);
-        }
-    };
-
-    // are there files to upload?
-    var fileInputs = $('input:file:enabled[value]', this); // [value] (issue #113)
-    var hasFileInputs = fileInputs.length > 0;
-    var mp = 'multipart/form-data';
-    var multipart = ($form.attr('enctype') == mp || $form.attr('encoding') == mp);
-
-    var fileAPI = feature.fileapi && feature.formdata;
-    log("fileAPI :" + fileAPI);
-    var shouldUseFrame = (hasFileInputs || multipart) && !fileAPI;
-
-    // options.iframe allows user to force iframe mode
-    // 06-NOV-09: now defaulting to iframe mode if file input is detected
-    if (options.iframe !== false && (options.iframe || shouldUseFrame)) {
-        // hack to fix Safari hang (thanks to Tim Molendijk for this)
-        // see:  http://groups.google.com/group/jquery-dev/browse_thread/thread/36395b7ab510dd5d
-        if (options.closeKeepAlive) {
-            $.get(options.closeKeepAlive, function() {
-                fileUploadIframe(a);
-            });
-        }
-          else {
-            fileUploadIframe(a);
-          }
-    }
-    else if ((hasFileInputs || multipart) && fileAPI) {
-        fileUploadXhr(a);
-    }
-    else {
-        $.ajax(options);
-    }
-
-    // clear element array
-    for (var k=0; k < elements.length; k++)
-        elements[k] = null;
-
-    // fire 'notify' event
-    this.trigger('form-submit-notify', [this, options]);
-    return this;
-
-     // XMLHttpRequest Level 2 file uploads (big hat tip to francois2metz)
-    function fileUploadXhr(a) {
-        var formdata = new FormData();
-
-        for (var i=0; i < a.length; i++) {
-            formdata.append(a[i].name, a[i].value);
-        }
-
-        if (options.extraData) {
-            for (var p in options.extraData)
-                if (options.extraData.hasOwnProperty(p))
-                    formdata.append(p, options.extraData[p]);
-        }
-
-        options.data = null;
-
-        var s = $.extend(true, {}, $.ajaxSettings, options, {
-            contentType: false,
-            processData: false,
-            cache: false,
-            type: 'POST'
-        });
-        
-        if (options.uploadProgress) {
-            // workaround because jqXHR does not expose upload property
-            s.xhr = function() {
-                var xhr = jQuery.ajaxSettings.xhr();
-                if (xhr.upload) {
-                    xhr.upload.onprogress = function(event) {
-                        var percent = 0;
-                        var position = event.loaded || event.position; /*event.position is deprecated*/
-                        var total = event.total;
-                        if (event.lengthComputable) {
-                            percent = Math.ceil(position / total * 100);
-                        }
-                        options.uploadProgress(event, position, total, percent);
-                    };
-                }
-                return xhr;
-            };
-        }
-
-        s.data = null;
-            var beforeSend = s.beforeSend;
-            s.beforeSend = function(xhr, o) {
-                o.data = formdata;
-                if(beforeSend)
-                    beforeSend.call(this, xhr, o);
-        };
-        $.ajax(s);
-    }
-
-    // private function for handling file uploads (hat tip to YAHOO!)
-    function fileUploadIframe(a) {
-        var form = $form[0], el, i, s, g, id, $io, io, xhr, sub, n, timedOut, timeoutHandle;
-        var useProp = !!$.fn.prop;
-
-        if ($(':input[name=submit],:input[id=submit]', form).length) {
-            // if there is an input with a name or id of 'submit' then we won't be
-            // able to invoke the submit fn on the form (at least not x-browser)
-            alert('Error: Form elements must not have name or id of "submit".');
-            return;
-        }
-        
-        if (a) {
-            // ensure that every serialized input is still enabled
-            for (i=0; i < elements.length; i++) {
-                el = $(elements[i]);
-                if ( useProp )
-                    el.prop('disabled', false);
-                else
-                    el.removeAttr('disabled');
-            }
-        }
-
-        s = $.extend(true, {}, $.ajaxSettings, options);
-        s.context = s.context || s;
-        id = 'jqFormIO' + (new Date().getTime());
-        if (s.iframeTarget) {
-            $io = $(s.iframeTarget);
-            n = $io.attr('name');
-            if (!n)
-                 $io.attr('name', id);
-            else
-                id = n;
-        }
-        else {
-            $io = $('<iframe name="' + id + '" src="'+ s.iframeSrc +'" />');
-            $io.css({ position: 'absolute', top: '-1000px', left: '-1000px' });
-        }
-        io = $io[0];
-
-
-        xhr = { // mock object
-            aborted: 0,
-            responseText: null,
-            responseXML: null,
-            status: 0,
-            statusText: 'n/a',
-            getAllResponseHeaders: function() {},
-            getResponseHeader: function() {},
-            setRequestHeader: function() {},
-            abort: function(status) {
-                var e = (status === 'timeout' ? 'timeout' : 'aborted');
-                log('aborting upload... ' + e);
-                this.aborted = 1;
-                // #214
-                if (io.contentWindow.document.execCommand) {
-                    try { // #214
-                        io.contentWindow.document.execCommand('Stop');
-                    } catch(ignore) {}
-                }
-                $io.attr('src', s.iframeSrc); // abort op in progress
-                xhr.error = e;
-                if (s.error)
-                    s.error.call(s.context, xhr, e, status);
-                if (g)
-                    $.event.trigger("ajaxError", [xhr, s, e]);
-                if (s.complete)
-                    s.complete.call(s.context, xhr, e);
-            }
-        };
-
-        g = s.global;
-        // trigger ajax global events so that activity/block indicators work like normal
-        if (g && 0 === $.active++) {
-            $.event.trigger("ajaxStart");
-        }
-        if (g) {
-            $.event.trigger("ajaxSend", [xhr, s]);
-        }
-
-        if (s.beforeSend && s.beforeSend.call(s.context, xhr, s) === false) {
-            if (s.global) {
-                $.active--;
-            }
-            return;
-        }
-        if (xhr.aborted) {
-            return;
-        }
-
-        // add submitting element to data if we know it
-        sub = form.clk;
-        if (sub) {
-            n = sub.name;
-            if (n && !sub.disabled) {
-                s.extraData = s.extraData || {};
-                s.extraData[n] = sub.value;
-                if (sub.type == "image") {
-                    s.extraData[n+'.x'] = form.clk_x;
-                    s.extraData[n+'.y'] = form.clk_y;
-                }
-            }
-        }
-        
-        var CLIENT_TIMEOUT_ABORT = 1;
-        var SERVER_ABORT = 2;
-
-        function getDoc(frame) {
-            var doc = frame.contentWindow ? frame.contentWindow.document : frame.contentDocument ? frame.contentDocument : frame.document;
-            return doc;
-        }
-        
-        // Rails CSRF hack (thanks to Yvan Barthelemy)
-        var csrf_token = $('meta[name=csrf-token]').attr('content');
-        var csrf_param = $('meta[name=csrf-param]').attr('content');
-        if (csrf_param && csrf_token) {
-            s.extraData = s.extraData || {};
-            s.extraData[csrf_param] = csrf_token;
-        }
-
-        // take a breath so that pending repaints get some cpu time before the upload starts
-        function doSubmit() {
-            // make sure form attrs are set
-            var t = $form.attr('target'), a = $form.attr('action');
-
-            // update form attrs in IE friendly way
-            form.setAttribute('target',id);
-            if (!method) {
-                form.setAttribute('method', 'POST');
-            }
-            if (a != s.url) {
-                form.setAttribute('action', s.url);
-            }
-
-            // ie borks in some cases when setting encoding
-            if (! s.skipEncodingOverride && (!method || /post/i.test(method))) {
-                $form.attr({
-                    encoding: 'multipart/form-data',
-                    enctype:  'multipart/form-data'
-                });
-            }
-
-            // support timout
-            if (s.timeout) {
-                timeoutHandle = setTimeout(function() { timedOut = true; cb(CLIENT_TIMEOUT_ABORT); }, s.timeout);
-            }
-            
-            // look for server aborts
-            function checkState() {
-                try {
-                    var state = getDoc(io).readyState;
-                    log('state = ' + state);
-                    if (state && state.toLowerCase() == 'uninitialized')
-                        setTimeout(checkState,50);
-                }
-                catch(e) {
-                    log('Server abort: ' , e, ' (', e.name, ')');
-                    cb(SERVER_ABORT);
-                    if (timeoutHandle)
-                        clearTimeout(timeoutHandle);
-                    timeoutHandle = undefined;
-                }
-            }
-
-            // add "extra" data to form if provided in options
-            var extraInputs = [];
-            try {
-                if (s.extraData) {
-                    for (var n in s.extraData) {
-                        if (s.extraData.hasOwnProperty(n)) {
-                           // if using the $.param format that allows for multiple values with the same name
-                           if($.isPlainObject(s.extraData[n]) && s.extraData[n].hasOwnProperty('name') && s.extraData[n].hasOwnProperty('value')) {
-                               extraInputs.push(
-                               $('<input type="hidden" name="'+s.extraData[n].name+'">').attr('value',s.extraData[n].value)
-                                   .appendTo(form)[0]);
-                           } else {
-                               extraInputs.push(
-                               $('<input type="hidden" name="'+n+'">').attr('value',s.extraData[n])
-                                   .appendTo(form)[0]);
-                           }
-                        }
-                    }
-                }
-
-                if (!s.iframeTarget) {
-                    // add iframe to doc and submit the form
-                    $io.appendTo('body');
-                    if (io.attachEvent)
-                        io.attachEvent('onload', cb);
-                    else
-                        io.addEventListener('load', cb, false);
-                }
-                setTimeout(checkState,15);
-                form.submit();
-            }
-            finally {
-                // reset attrs and remove "extra" input elements
-                form.setAttribute('action',a);
-                if(t) {
-                    form.setAttribute('target', t);
-                } else {
-                    $form.removeAttr('target');
-                }
-                $(extraInputs).remove();
-            }
-        }
-
-        if (s.forceSync) {
-            doSubmit();
-        }
-        else {
-            setTimeout(doSubmit, 10); // this lets dom updates render
-        }
-
-        var data, doc, domCheckCount = 50, callbackProcessed;
-
-        function cb(e) {
-            if (xhr.aborted || callbackProcessed) {
-                return;
-            }
-            try {
-                doc = getDoc(io);
-            }
-            catch(ex) {
-                log('cannot access response document: ', ex);
-                e = SERVER_ABORT;
-            }
-            if (e === CLIENT_TIMEOUT_ABORT && xhr) {
-                xhr.abort('timeout');
-                return;
-            }
-            else if (e == SERVER_ABORT && xhr) {
-                xhr.abort('server abort');
-                return;
-            }
-
-            if (!doc || doc.location.href == s.iframeSrc) {
-                // response not received yet
-                if (!timedOut)
-                    return;
-            }
-            if (io.detachEvent)
-                io.detachEvent('onload', cb);
-            else    
-                io.removeEventListener('load', cb, false);
-
-            var status = 'success', errMsg;
-            try {
-                if (timedOut) {
-                    throw 'timeout';
-                }
-
-                var isXml = s.dataType == 'xml' || doc.XMLDocument || $.isXMLDoc(doc);
-                log('isXml='+isXml);
-                if (!isXml && window.opera && (doc.body === null || !doc.body.innerHTML)) {
-                    if (--domCheckCount) {
-                        // in some browsers (Opera) the iframe DOM is not always traversable when
-                        // the onload callback fires, so we loop a bit to accommodate
-                        log('requeing onLoad callback, DOM not available');
-                        setTimeout(cb, 250);
-                        return;
-                    }
-                    // let this fall through because server response could be an empty document
-                    //log('Could not access iframe DOM after mutiple tries.');
-                    //throw 'DOMException: not available';
-                }
-
-                //log('response detected');
-                var docRoot = doc.body ? doc.body : doc.documentElement;
-                xhr.responseText = docRoot ? docRoot.innerHTML : null;
-                xhr.responseXML = doc.XMLDocument ? doc.XMLDocument : doc;
-                if (isXml)
-                    s.dataType = 'xml';
-                xhr.getResponseHeader = function(header){
-                    var headers = {'content-type': s.dataType};
-                    return headers[header];
-                };
-                // support for XHR 'status' & 'statusText' emulation :
-                if (docRoot) {
-                    xhr.status = Number( docRoot.getAttribute('status') ) || xhr.status;
-                    xhr.statusText = docRoot.getAttribute('statusText') || xhr.statusText;
-                }
-
-                var dt = (s.dataType || '').toLowerCase();
-                var scr = /(json|script|text)/.test(dt);
-                if (scr || s.textarea) {
-                    // see if user embedded response in textarea
-                    var ta = doc.getElementsByTagName('textarea')[0];
-                    if (ta) {
-                        xhr.responseText = ta.value;
-                        // support for XHR 'status' & 'statusText' emulation :
-                        xhr.status = Number( ta.getAttribute('status') ) || xhr.status;
-                        xhr.statusText = ta.getAttribute('statusText') || xhr.statusText;
-                    }
-                    else if (scr) {
-                        // account for browsers injecting pre around json response
-                        var pre = doc.getElementsByTagName('pre')[0];
-                        var b = doc.getElementsByTagName('body')[0];
-                        if (pre) {
-                            xhr.responseText = pre.textContent ? pre.textContent : pre.innerText;
-                        }
-                        else if (b) {
-                            xhr.responseText = b.textContent ? b.textContent : b.innerText;
-                        }
-                    }
-                }
-                else if (dt == 'xml' && !xhr.responseXML && xhr.responseText) {
-                    xhr.responseXML = toXml(xhr.responseText);
-                }
-
-                try {
-                    data = httpData(xhr, dt, s);
-                }
-                catch (e) {
-                    status = 'parsererror';
-                    xhr.error = errMsg = (e || status);
-                }
-            }
-            catch (e) {
-                log('error caught: ',e);
-                status = 'error';
-                xhr.error = errMsg = (e || status);
-            }
-
-            if (xhr.aborted) {
-                log('upload aborted');
-                status = null;
-            }
-
-            if (xhr.status) { // we've set xhr.status
-                status = (xhr.status >= 200 && xhr.status < 300 || xhr.status === 304) ? 'success' : 'error';
-            }
-
-            // ordering of these callbacks/triggers is odd, but that's how $.ajax does it
-            if (status === 'success') {
-                if (s.success)
-                    s.success.call(s.context, data, 'success', xhr);
-                if (g)
-                    $.event.trigger("ajaxSuccess", [xhr, s]);
-            }
-            else if (status) {
-                if (errMsg === undefined)
-                    errMsg = xhr.statusText;
-                if (s.error)
-                    s.error.call(s.context, xhr, status, errMsg);
-                if (g)
-                    $.event.trigger("ajaxError", [xhr, s, errMsg]);
-            }
-
-            if (g)
-                $.event.trigger("ajaxComplete", [xhr, s]);
-
-            if (g && ! --$.active) {
-                $.event.trigger("ajaxStop");
-            }
-
-            if (s.complete)
-                s.complete.call(s.context, xhr, status);
-
-            callbackProcessed = true;
-            if (s.timeout)
-                clearTimeout(timeoutHandle);
-
-            // clean up
-            setTimeout(function() {
-                if (!s.iframeTarget)
-                    $io.remove();
-                xhr.responseXML = null;
-            }, 100);
-        }
-
-        var toXml = $.parseXML || function(s, doc) { // use parseXML if available (jQuery 1.5+)
-            if (window.ActiveXObject) {
-                doc = new ActiveXObject('Microsoft.XMLDOM');
-                doc.async = 'false';
-                doc.loadXML(s);
-            }
-            else {
-                doc = (new DOMParser()).parseFromString(s, 'text/xml');
-            }
-            return (doc && doc.documentElement && doc.documentElement.nodeName != 'parsererror') ? doc : null;
-        };
-        var parseJSON = $.parseJSON || function(s) {
-            /*jslint evil:true */
-            return window['eval']('(' + s + ')');
-        };
-
-        var httpData = function( xhr, type, s ) { // mostly lifted from jq1.4.4
-
-            var ct = xhr.getResponseHeader('content-type') || '',
-                xml = type === 'xml' || !type && ct.indexOf('xml') >= 0,
-                data = xml ? xhr.responseXML : xhr.responseText;
-
-            if (xml && data.documentElement.nodeName === 'parsererror') {
-                if ($.error)
-                    $.error('parsererror');
-            }
-            if (s && s.dataFilter) {
-                data = s.dataFilter(data, type);
-            }
-            if (typeof data === 'string') {
-                if (type === 'json' || !type && ct.indexOf('json') >= 0) {
-                    data = parseJSON(data);
-                } else if (type === "script" || !type && ct.indexOf("javascript") >= 0) {
-                    $.globalEval(data);
-                }
-            }
-            return data;
-        };
-    }
-};
-
-/**
- * ajaxForm() provides a mechanism for fully automating form submission.
- *
- * The advantages of using this method instead of ajaxSubmit() are:
- *
- * 1: This method will include coordinates for <input type="image" /> elements (if the element
- *    is used to submit the form).
- * 2. This method will include the submit element's name/value data (for the element that was
- *    used to submit the form).
- * 3. This method binds the submit() method to the form for you.
- *
- * The options argument for ajaxForm works exactly as it does for ajaxSubmit.  ajaxForm merely
- * passes the options argument along after properly binding events for submit elements and
- * the form itself.
- */
-$.fn.ajaxForm = function(options) {
-    options = options || {};
-    options.delegation = options.delegation && $.isFunction($.fn.on);
-    
-    // in jQuery 1.3+ we can fix mistakes with the ready state
-    if (!options.delegation && this.length === 0) {
-        var o = { s: this.selector, c: this.context };
-        if (!$.isReady && o.s) {
-            log('DOM not ready, queuing ajaxForm');
-            $(function() {
-                $(o.s,o.c).ajaxForm(options);
-            });
-            return this;
-        }
-        // is your DOM ready?  http://docs.jquery.com/Tutorials:Introducing_$(document).ready()
-        log('terminating; zero elements found by selector' + ($.isReady ? '' : ' (DOM not ready)'));
-        return this;
-    }
-
-    if ( options.delegation ) {
-        $(document)
-            .off('submit.form-plugin', this.selector, doAjaxSubmit)
-            .off('click.form-plugin', this.selector, captureSubmittingElement)
-            .on('submit.form-plugin', this.selector, options, doAjaxSubmit)
-            .on('click.form-plugin', this.selector, options, captureSubmittingElement);
-        return this;
-    }
-
-    return this.ajaxFormUnbind()
-        .bind('submit.form-plugin', options, doAjaxSubmit)
-        .bind('click.form-plugin', options, captureSubmittingElement);
-};
-
-// private event handlers    
-function doAjaxSubmit(e) {
-    /*jshint validthis:true */
-    var options = e.data;
-    if (!e.isDefaultPrevented()) { // if event has been canceled, don't proceed
-        e.preventDefault();
-        $(this).ajaxSubmit(options);
-    }
-}
-    
-function captureSubmittingElement(e) {
-    /*jshint validthis:true */
-    var target = e.target;
-    var $el = $(target);
-    if (!($el.is(":submit,input:image"))) {
-        // is this a child element of the submit el?  (ex: a span within a button)
-        var t = $el.closest(':submit');
-        if (t.length === 0) {
-            return;
-        }
-        target = t[0];
-    }
-    var form = this;
-    form.clk = target;
-    if (target.type == 'image') {
-        if (e.offsetX !== undefined) {
-            form.clk_x = e.offsetX;
-            form.clk_y = e.offsetY;
-        } else if (typeof $.fn.offset == 'function') {
-            var offset = $el.offset();
-            form.clk_x = e.pageX - offset.left;
-            form.clk_y = e.pageY - offset.top;
-        } else {
-            form.clk_x = e.pageX - target.offsetLeft;
-            form.clk_y = e.pageY - target.offsetTop;
-        }
-    }
-    // clear form vars
-    setTimeout(function() { form.clk = form.clk_x = form.clk_y = null; }, 100);
-}
-
-
-// ajaxFormUnbind unbinds the event handlers that were bound by ajaxForm
-$.fn.ajaxFormUnbind = function() {
-    return this.unbind('submit.form-plugin click.form-plugin');
-};
-
-/**
- * formToArray() gathers form element data into an array of objects that can
- * be passed to any of the following ajax functions: $.get, $.post, or load.
- * Each object in the array has both a 'name' and 'value' property.  An example of
- * an array for a simple login form might be:
- *
- * [ { name: 'username', value: 'jresig' }, { name: 'password', value: 'secret' } ]
- *
- * It is this array that is passed to pre-submit callback functions provided to the
- * ajaxSubmit() and ajaxForm() methods.
- */
-$.fn.formToArray = function(semantic, elements) {
-    var a = [];
-    if (this.length === 0) {
-        return a;
-    }
-
-    var form = this[0];
-    var els = semantic ? form.getElementsByTagName('*') : form.elements;
-    if (!els) {
-        return a;
-    }
-
-    var i,j,n,v,el,max,jmax;
-    for(i=0, max=els.length; i < max; i++) {
-        el = els[i];
-        n = el.name;
-        if (!n) {
-            continue;
-        }
-
-        if (semantic && form.clk && el.type == "image") {
-            // handle image inputs on the fly when semantic == true
-            if(!el.disabled && form.clk == el) {
-                a.push({name: n, value: $(el).val(), type: el.type });
-                a.push({name: n+'.x', value: form.clk_x}, {name: n+'.y', value: form.clk_y});
-            }
-            continue;
-        }
-
-        v = $.fieldValue(el, true);
-        if (v && v.constructor == Array) {
-            if (elements) 
-                elements.push(el);
-            for(j=0, jmax=v.length; j < jmax; j++) {
-                a.push({name: n, value: v[j]});
-            }
-        }
-        else if (feature.fileapi && el.type == 'file' && !el.disabled) {
-            if (elements) 
-                elements.push(el);
-            var files = el.files;
-            if (files.length) {
-                for (j=0; j < files.length; j++) {
-                    a.push({name: n, value: files[j], type: el.type});
-                }
-            }
-            else {
-                // #180
-                a.push({ name: n, value: '', type: el.type });
-            }
-        }
-        else if (v !== null && typeof v != 'undefined') {
-            if (elements) 
-                elements.push(el);
-            a.push({name: n, value: v, type: el.type, required: el.required});
-        }
-    }
-
-    if (!semantic && form.clk) {
-        // input type=='image' are not found in elements array! handle it here
-        var $input = $(form.clk), input = $input[0];
-        n = input.name;
-        if (n && !input.disabled && input.type == 'image') {
-            a.push({name: n, value: $input.val()});
-            a.push({name: n+'.x', value: form.clk_x}, {name: n+'.y', value: form.clk_y});
-        }
-    }
-    return a;
-};
-
-/**
- * Serializes form data into a 'submittable' string. This method will return a string
- * in the format: name1=value1&amp;name2=value2
- */
-$.fn.formSerialize = function(semantic) {
-    //hand off to jQuery.param for proper encoding
-    return $.param(this.formToArray(semantic));
-};
-
-/**
- * Serializes all field elements in the jQuery object into a query string.
- * This method will return a string in the format: name1=value1&amp;name2=value2
- */
-$.fn.fieldSerialize = function(successful) {
-    var a = [];
-    this.each(function() {
-        var n = this.name;
-        if (!n) {
-            return;
-        }
-        var v = $.fieldValue(this, successful);
-        if (v && v.constructor == Array) {
-            for (var i=0,max=v.length; i < max; i++) {
-                a.push({name: n, value: v[i]});
-            }
-        }
-        else if (v !== null && typeof v != 'undefined') {
-            a.push({name: this.name, value: v});
-        }
-    });
-    //hand off to jQuery.param for proper encoding
-    return $.param(a);
-};
-
-/**
- * Returns the value(s) of the element in the matched set.  For example, consider the following form:
- *
- *  <form><fieldset>
- *      <input name="A" type="text" />
- *      <input name="A" type="text" />
- *      <input name="B" type="checkbox" value="B1" />
- *      <input name="B" type="checkbox" value="B2"/>
- *      <input name="C" type="radio" value="C1" />
- *      <input name="C" type="radio" value="C2" />
- *  </fieldset></form>
- *
- *  var v = $(':text').fieldValue();
- *  // if no values are entered into the text inputs
- *  v == ['','']
- *  // if values entered into the text inputs are 'foo' and 'bar'
- *  v == ['foo','bar']
- *
- *  var v = $(':checkbox').fieldValue();
- *  // if neither checkbox is checked
- *  v === undefined
- *  // if both checkboxes are checked
- *  v == ['B1', 'B2']
- *
- *  var v = $(':radio').fieldValue();
- *  // if neither radio is checked
- *  v === undefined
- *  // if first radio is checked
- *  v == ['C1']
- *
- * The successful argument controls whether or not the field element must be 'successful'
- * (per http://www.w3.org/TR/html4/interact/forms.html#successful-controls).
- * The default value of the successful argument is true.  If this value is false the value(s)
- * for each element is returned.
- *
- * Note: This method *always* returns an array.  If no valid value can be determined the
- *    array will be empty, otherwise it will contain one or more values.
- */
-$.fn.fieldValue = function(successful) {
-    for (var val=[], i=0, max=this.length; i < max; i++) {
-        var el = this[i];
-        var v = $.fieldValue(el, successful);
-        if (v === null || typeof v == 'undefined' || (v.constructor == Array && !v.length)) {
-            continue;
-        }
-        if (v.constructor == Array)
-            $.merge(val, v);
-        else
-            val.push(v);
-    }
-    return val;
-};
-
-/**
- * Returns the value of the field element.
- */
-$.fieldValue = function(el, successful) {
-    var n = el.name, t = el.type, tag = el.tagName.toLowerCase();
-    if (successful === undefined) {
-        successful = true;
-    }
-
-    if (successful && (!n || el.disabled || t == 'reset' || t == 'button' ||
-        (t == 'checkbox' || t == 'radio') && !el.checked ||
-        (t == 'submit' || t == 'image') && el.form && el.form.clk != el ||
-        tag == 'select' && el.selectedIndex == -1)) {
-            return null;
-    }
-
-    if (tag == 'select') {
-        var index = el.selectedIndex;
-        if (index < 0) {
-            return null;
-        }
-        var a = [], ops = el.options;
-        var one = (t == 'select-one');
-        var max = (one ? index+1 : ops.length);
-        for(var i=(one ? index : 0); i < max; i++) {
-            var op = ops[i];
-            if (op.selected) {
-                var v = op.value;
-                if (!v) { // extra pain for IE...
-                    v = (op.attributes && op.attributes['value'] && !(op.attributes['value'].specified)) ? op.text : op.value;
-                }
-                if (one) {
-                    return v;
-                }
-                a.push(v);
-            }
-        }
-        return a;
-    }
-    return $(el).val();
-};
-
-/**
- * Clears the form data.  Takes the following actions on the form's input fields:
- *  - input text fields will have their 'value' property set to the empty string
- *  - select elements will have their 'selectedIndex' property set to -1
- *  - checkbox and radio inputs will have their 'checked' property set to false
- *  - inputs of type submit, button, reset, and hidden will *not* be effected
- *  - button elements will *not* be effected
- */
-$.fn.clearForm = function(includeHidden) {
-    return this.each(function() {
-        $('input,select,textarea', this).clearFields(includeHidden);
-    });
-};
-
-/**
- * Clears the selected form elements.
- */
-$.fn.clearFields = $.fn.clearInputs = function(includeHidden) {
-    var re = /^(?:color|date|datetime|email|month|number|password|range|search|tel|text|time|url|week)$/i; // 'hidden' is not in this list
-    return this.each(function() {
-        var t = this.type, tag = this.tagName.toLowerCase();
-        if (re.test(t) || tag == 'textarea') {
-            this.value = '';
-        }
-        else if (t == 'checkbox' || t == 'radio') {
-            this.checked = false;
-        }
-        else if (tag == 'select') {
-            this.selectedIndex = -1;
-        }
-        else if (includeHidden) {
-            // includeHidden can be the value true, or it can be a selector string
-            // indicating a special test; for example:
-            //  $('#myForm').clearForm('.special:hidden')
-            // the above would clean hidden inputs that have the class of 'special'
-            if ( (includeHidden === true && /hidden/.test(t)) ||
-                 (typeof includeHidden == 'string' && $(this).is(includeHidden)) )
-                this.value = '';
-        }
-    });
-};
-
-/**
- * Resets the form data.  Causes all form elements to be reset to their original value.
- */
-$.fn.resetForm = function() {
-    return this.each(function() {
-        // guard against an input with the name of 'reset'
-        // note that IE reports the reset function as an 'object'
-        if (typeof this.reset == 'function' || (typeof this.reset == 'object' && !this.reset.nodeType)) {
-            this.reset();
-        }
-    });
-};
-
-/**
- * Enables or disables any matching elements.
- */
-$.fn.enable = function(b) {
-    if (b === undefined) {
-        b = true;
-    }
-    return this.each(function() {
-        this.disabled = !b;
-    });
-};
-
-/**
- * Checks/unchecks any matching checkboxes or radio buttons and
- * selects/deselects and matching option elements.
- */
-$.fn.selected = function(select) {
-    if (select === undefined) {
-        select = true;
-    }
-    return this.each(function() {
-        var t = this.type;
-        if (t == 'checkbox' || t == 'radio') {
-            this.checked = select;
-        }
-        else if (this.tagName.toLowerCase() == 'option') {
-            var $sel = $(this).parent('select');
-            if (select && $sel[0] && $sel[0].type == 'select-one') {
-                // deselect all other options
-                $sel.find('option').selected(false);
-            }
-            this.selected = select;
-        }
-    });
-};
-
-// expose debug var
-$.fn.ajaxSubmit.debug = false;
-
-// helper fn for console logging
-function log() {
-    if (!$.fn.ajaxSubmit.debug) 
-        return;
-    var msg = '[jquery.form] ' + Array.prototype.join.call(arguments,'');
-    if (window.console && window.console.log) {
-        window.console.log(msg);
-    }
-    else if (window.opera && window.opera.postError) {
-        window.opera.postError(msg);
-    }
-}
-
-})(jQuery);
diff --git a/resources/jquery/jquery.fullscreen.js b/resources/jquery/jquery.fullscreen.js
deleted file mode 100644 (file)
index 3d1f29a..0000000
+++ /dev/null
@@ -1,177 +0,0 @@
-/**
- * jQuery fullscreen plugin v2.0.0
- * https://github.com/theopolisme/jquery-fullscreen/tree/v2.0.0
- *
- * Documentation at <https://github.com/theopolisme/jquery-fullscreen/blob/v2.0.0/README.md>
- *
- * Copyright (c) 2013 Theopolisme <theopolismewiki@gmail.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-( function ( $ ) {
-       var setupFullscreen,
-               fsClass = 'jq-fullscreened';
-
-       /**
-        * On fullscreenchange, trigger a jq-fullscreen-change event
-        * The event is given an object, which contains the fullscreened DOM element (element), if any
-        * and a boolean value (fullscreen) indicating if we've entered or exited fullscreen mode
-        * Also remove the 'fullscreened' class from elements that are no longer fullscreen
-        */
-       function handleFullscreenChange () {
-               var fullscreenElement = document.fullscreenElement ||
-                       document.mozFullScreenElement ||
-                       document.webkitFullscreenElement ||
-                       document.msFullscreenElement;
-
-               if ( !fullscreenElement ) {
-                       $( '.' + fsClass ).data( 'isFullscreened', false ).removeClass( fsClass );
-               }
-
-               $( document ).trigger( $.Event( 'jq-fullscreen-change', { element: fullscreenElement, fullscreen: !!fullscreenElement } ) );
-       }
-
-       /**
-        * Enters full screen with the "this" element in focus.
-        * Check the .data( 'isFullscreened' ) of the return value to check
-        * success or failure, if you're into that sort of thing.
-        * @chainable
-        * @return {jQuery}
-        */
-       function enterFullscreen () {
-               var element = this.get(0),
-                       $element = this.first();
-               if ( element ) {
-                       if ( element.requestFullscreen ) {
-                               element.requestFullscreen();
-                       } else if ( element.mozRequestFullScreen ) {
-                               element.mozRequestFullScreen();
-                       } else if ( element.webkitRequestFullscreen ) {
-                               element.webkitRequestFullscreen();
-                       } else if ( element.msRequestFullscreen ) {
-                               element.msRequestFullscreen();
-                       } else {
-                               // Unable to make fullscreen
-                               $element.data( 'isFullscreened', false );
-                               return this;
-                       }
-                       // Add the fullscreen class and data attribute to `element`
-                       $element.addClass( fsClass ).data( 'isFullscreened', true );
-                       return this;
-               } else {
-                       $element.data( 'isFullscreened', false );
-                       return this;
-               }
-       }
-
-       /**
-        * Brings the "this" element out of fullscreen.
-        * Check the .data( 'isFullscreened' ) of the return value to check
-        * success or failure, if you're into that sort of thing.
-        * @chainable
-        * @return {jQuery}
-        */
-       function exitFullscreen () {
-               var fullscreenElement = ( document.fullscreenElement ||
-                               document.mozFullScreenElement ||
-                               document.webkitFullscreenElement ||
-                               document.msFullscreenElement );
-
-               // Ensure that we only exit fullscreen if exitFullscreen() is being called on the same element that is currently fullscreen
-               if ( fullscreenElement && this.get(0) === fullscreenElement ) {
-                       if ( document.exitFullscreen ) {
-                               document.exitFullscreen();
-                       } else if ( document.mozCancelFullScreen ) {
-                               document.mozCancelFullScreen();
-                       } else if ( document.webkitCancelFullScreen ) {
-                               document.webkitCancelFullScreen();
-                       } else if ( document.msCancelFullScreen ) {
-                               document.msCancelFullScreen();
-                       } else {
-                               // Unable to cancel fullscreen mode
-                               return this;
-                       }
-                       // We don't need to remove the fullscreen class here,
-                       // because it will be removed in handleFullscreenChange.
-                       // But we should change the data on the element so the
-                       // caller can check for success.
-                       this.first().data( 'isFullscreened', false );
-               }
-
-               return this;
-       }
-
-       /**
-        * Set up fullscreen handling and install necessary event handlers.
-        * Return false if fullscreen is not supported.
-        */
-       setupFullscreen = function () {
-               if ( $.support.fullscreen ) {
-                       // When the fullscreen mode is changed, trigger the
-                       // fullscreen events (and when exiting,
-                       // also remove the fullscreen class)
-                       $( document ).on( 'fullscreenchange webkitfullscreenchange mozfullscreenchange msfullscreenchange', handleFullscreenChange);
-                       // Convenience wrapper so that one only needs to listen for
-                       // 'fullscreenerror', not all of the prefixed versions
-                       $( document ).on( 'webkitfullscreenerror mozfullscreenerror msfullscreenerror', function () {
-                               $( document ).trigger( $.Event( 'fullscreenerror' ) );
-                       } );
-                       // Fullscreen has been set up, so always return true
-                       setupFullscreen = function () { return true; };
-                       return true;
-               } else {
-                       // Always return false from now on, since fullscreen is not supported
-                       setupFullscreen = function() { return false; };
-                       return false;
-               }
-       };
-
-       /**
-        * Set up fullscreen handling if necessary, then make the first element
-        * matching the given selector fullscreen
-        * @chainable
-        * @return {jQuery}
-        */
-       $.fn.enterFullscreen = function () {
-               if ( setupFullscreen() ) {
-                       $.fn.enterFullscreen = enterFullscreen;
-                       return this.enterFullscreen();
-               } else {
-                       $.fn.enterFullscreen = function () { return this; };
-                       return this;
-               }
-       };
-
-       /**
-        * Set up fullscreen handling if necessary, then cancel fullscreen mode
-        * for the first element matching the given selector.
-        * @chainable
-        * @return {jQuery}
-        */
-       $.fn.exitFullscreen = function () {
-               if ( setupFullscreen() ) {
-                       $.fn.exitFullscreen = exitFullscreen;
-                       return this.exitFullscreen();
-               } else {
-                       $.fn.exitFullscreen = function () { return this; };
-                       return this;
-               }
-       };
-       
-       $.support.fullscreen = document.fullscreenEnabled ||
-               document.webkitFullscreenEnabled ||
-               document.mozFullScreenEnabled ||
-               document.msFullscreenEnabled;
-}( jQuery ) );
diff --git a/resources/jquery/jquery.getAttrs.js b/resources/jquery/jquery.getAttrs.js
deleted file mode 100644 (file)
index 25b806b..0000000
+++ /dev/null
@@ -1,24 +0,0 @@
-/**
- * Utility to get all attributes of an element directy as an object.
- *
- * @author Timo Tijhof, 2011
- */
-jQuery.fn.getAttrs = function ( all ) {
-       var map = this[0].attributes,
-               attrs = {},
-               len = map.length,
-               i, v;
-
-       for ( i = 0; i < len; i++ ) {
-               // IE6 includes *all* allowed attributes for thew element (including those
-               // not set). Those have values like undefined, null, 0, false, "" or "inherit".
-               // However there may be genuine attributes set to that. If you need them,
-               // set all to true. They are excluded by default.
-               v = map[i].nodeValue;
-               if ( all || ( v && v !== 'inherit' ) ) {
-                       attrs[ map[i].nodeName ] = v;
-               }
-       }
-
-       return attrs;
-};
diff --git a/resources/jquery/jquery.hidpi.js b/resources/jquery/jquery.hidpi.js
deleted file mode 100644 (file)
index eb29db9..0000000
+++ /dev/null
@@ -1,115 +0,0 @@
-/**
- * Responsive images based on 'srcset' and 'window.devicePixelRatio' emulation where needed.
- *
- * Call $().hidpi() on a document or part of a document to replace image srcs in that section.
- *
- * $.devicePixelRatio() can be used to supplement window.devicePixelRatio with support on
- * some additional browsers.
- */
-( function ( $ ) {
-
-/**
- * Detect reported or approximate device pixel ratio.
- * 1.0 means 1 CSS pixel is 1 hardware pixel
- * 2.0 means 1 CSS pixel is 2 hardware pixels
- * etc
- *
- * Uses window.devicePixelRatio if available, or CSS media queries on IE.
- *
- * @return {number} Device pixel ratio
- */
-$.devicePixelRatio = function () {
-       if ( window.devicePixelRatio !== undefined ) {
-               // Most web browsers:
-               // * WebKit (Safari, Chrome, Android browser, etc)
-               // * Opera
-               // * Firefox 18+
-               return window.devicePixelRatio;
-       } else if ( window.msMatchMedia !== undefined ) {
-               // Windows 8 desktops / tablets, probably Windows Phone 8
-               //
-               // IE 10 doesn't report pixel ratio directly, but we can get the
-               // screen DPI and divide by 96. We'll bracket to [1, 1.5, 2.0] for
-               // simplicity, but you may get different values depending on zoom
-               // factor, size of screen and orientation in Metro IE.
-               if ( window.msMatchMedia( '(min-resolution: 192dpi)' ).matches ) {
-                       return 2;
-               } else if ( window.msMatchMedia( '(min-resolution: 144dpi)' ).matches ) {
-                       return 1.5;
-               } else {
-                       return 1;
-               }
-       } else {
-               // Legacy browsers...
-               // Assume 1 if unknown.
-               return 1;
-       }
-};
-
-/**
- * Implement responsive images based on srcset attributes, if browser has no
- * native srcset support.
- *
- * @return {jQuery} This selection
- */
-$.fn.hidpi = function () {
-       var $target = this,
-               // @todo add support for dpi media query checks on Firefox, IE
-               devicePixelRatio = $.devicePixelRatio(),
-               testImage = new Image();
-
-       if ( devicePixelRatio > 1 && testImage.srcset === undefined ) {
-               // No native srcset support.
-               $target.find( 'img' ).each( function () {
-                       var $img = $( this ),
-                               srcset = $img.attr( 'srcset' ),
-                               match;
-                       if ( typeof srcset === 'string' && srcset !== '' ) {
-                               match = $.matchSrcSet( devicePixelRatio, srcset );
-                               if (match !== null ) {
-                                       $img.attr( 'src', match );
-                               }
-                       }
-               });
-       }
-
-       return $target;
-};
-
-/**
- * Match a srcset entry for the given device pixel ratio
- *
- * Exposed for testing.
- *
- * @param {number} devicePixelRatio
- * @param {string} srcset
- * @return {mixed} null or the matching src string
- */
-$.matchSrcSet = function ( devicePixelRatio, srcset ) {
-       var candidates,
-               candidate,
-               bits,
-               src,
-               i,
-               ratioStr,
-               ratio,
-               selectedRatio = 1,
-               selectedSrc = null;
-       candidates = srcset.split( / *, */ );
-       for ( i = 0; i < candidates.length; i++ ) {
-               candidate = candidates[i];
-               bits = candidate.split( / +/ );
-               src = bits[0];
-               if ( bits.length > 1 && bits[1].charAt( bits[1].length - 1 ) === 'x' ) {
-                       ratioStr = bits[1].substr( 0, bits[1].length - 1 );
-                       ratio = parseFloat( ratioStr );
-                       if ( ratio <= devicePixelRatio && ratio > selectedRatio ) {
-                               selectedRatio = ratio;
-                               selectedSrc = src;
-                       }
-               }
-       }
-       return selectedSrc;
-};
-
-}( jQuery ) );
diff --git a/resources/jquery/jquery.highlightText.js b/resources/jquery/jquery.highlightText.js
deleted file mode 100644 (file)
index 0408151..0000000
+++ /dev/null
@@ -1,68 +0,0 @@
-/**
- * Plugin that highlights matched word partials in a given element.
- * TODO: Add a function for restoring the previous text.
- * TODO: Accept mappings for converting shortcuts like WP: to Wikipedia:.
- */
-( function ( $ ) {
-
-       $.highlightText = {
-
-               // Split our pattern string at spaces and run our highlight function on the results
-               splitAndHighlight: function ( node, pat ) {
-                       var i,
-                               patArray = pat.split( ' ' );
-                       for ( i = 0; i < patArray.length; i++ ) {
-                               if ( patArray[i].length === 0 ) {
-                                       continue;
-                               }
-                               $.highlightText.innerHighlight( node, patArray[i] );
-                       }
-                       return node;
-               },
-
-               // scans a node looking for the pattern and wraps a span around each match
-               innerHighlight: function ( node, pat ) {
-                       var i, match, pos, spannode, middlebit, middleclone;
-                       // if this is a text node
-                       if ( node.nodeType === 3 ) {
-                               // TODO - need to be smarter about the character matching here.
-                               // non latin characters can make regex think a new word has begun: do not use \b
-                               // http://stackoverflow.com/questions/3787072/regex-wordwrap-with-utf8-characters-in-js
-                               // look for an occurrence of our pattern and store the starting position
-                               match = node.data.match( new RegExp( '(^|\\s)' + $.escapeRE( pat ), 'i' ) );
-                               if ( match ) {
-                                       pos = match.index + match[1].length; // include length of any matched spaces
-                                       // create the span wrapper for the matched text
-                                       spannode = document.createElement( 'span' );
-                                       spannode.className = 'highlight';
-                                       // shave off the characters preceding the matched text
-                                       middlebit = node.splitText( pos );
-                                       // shave off any unmatched text off the end
-                                       middlebit.splitText( pat.length );
-                                       // clone for appending to our span
-                                       middleclone = middlebit.cloneNode( true );
-                                       // append the matched text node to the span
-                                       spannode.appendChild( middleclone );
-                                       // replace the matched node, with our span-wrapped clone of the matched node
-                                       middlebit.parentNode.replaceChild( spannode, middlebit );
-                               }
-                       // if this is an element with childnodes, and not a script, style or an element we created
-                       } else if ( node.nodeType === 1 && node.childNodes && !/(script|style)/i.test( node.tagName )
-                                       && !( node.tagName.toLowerCase() === 'span' && node.className.match( /\bhighlight/ ) ) ) {
-                               for ( i = 0; i < node.childNodes.length; ++i ) {
-                                       // call the highlight function for each child node
-                                       $.highlightText.innerHighlight( node.childNodes[i], pat );
-                               }
-                       }
-               }
-       };
-
-       $.fn.highlightText = function ( matchString ) {
-               return this.each( function () {
-                       var $el = $( this );
-                       $el.data( 'highlightText', { originalText: $el.text() } );
-                       $.highlightText.splitAndHighlight( this, matchString );
-               } );
-       };
-
-}( jQuery ) );
diff --git a/resources/jquery/jquery.hoverIntent.js b/resources/jquery/jquery.hoverIntent.js
deleted file mode 100644 (file)
index adf948d..0000000
+++ /dev/null
@@ -1,111 +0,0 @@
-/**
-* hoverIntent is similar to jQuery's built-in "hover" function except that
-* instead of firing the onMouseOver event immediately, hoverIntent checks
-* to see if the user's mouse has slowed down (beneath the sensitivity
-* threshold) before firing the onMouseOver event.
-* 
-* hoverIntent r5 // 2007.03.27 // jQuery 1.1.2+
-* <http://cherne.net/brian/resources/jquery.hoverIntent.html>
-* 
-* hoverIntent is currently available for use in all personal or commercial 
-* projects under both MIT and GPL licenses. This means that you can choose 
-* the license that best suits your project, and use it accordingly.
-* 
-* // basic usage (just like .hover) receives onMouseOver and onMouseOut functions
-* $("ul li").hoverIntent( showNav , hideNav );
-* 
-* // advanced usage receives configuration object only
-* $("ul li").hoverIntent({
-*      sensitivity: 7, // number = sensitivity threshold (must be 1 or higher)
-*      interval: 100,   // number = milliseconds of polling interval
-*      over: showNav,  // function = onMouseOver callback (required)
-*      timeout: 0,   // number = milliseconds delay before onMouseOut function call
-*      out: hideNav    // function = onMouseOut callback (required)
-* });
-* 
-* @param  f  onMouseOver function || An object with configuration options
-* @param  g  onMouseOut function  || Nothing (use configuration options object)
-* @author    Brian Cherne <brian@cherne.net>
-*/
-(function($) {
-       $.fn.hoverIntent = function(f,g) {
-               // default configuration options
-               var cfg = {
-                       sensitivity: 7,
-                       interval: 100,
-                       timeout: 0
-               };
-               // override configuration options with user supplied object
-               cfg = $.extend(cfg, g ? { over: f, out: g } : f );
-
-               // instantiate variables
-               // cX, cY = current X and Y position of mouse, updated by mousemove event
-               // pX, pY = previous X and Y position of mouse, set by mouseover and polling interval
-               var cX, cY, pX, pY;
-
-               // A private function for getting mouse position
-               var track = function(ev) {
-                       cX = ev.pageX;
-                       cY = ev.pageY;
-               };
-
-               // A private function for comparing current and previous mouse position
-               var compare = function(ev,ob) {
-                       ob.hoverIntent_t = clearTimeout(ob.hoverIntent_t);
-                       // compare mouse positions to see if they've crossed the threshold
-                       if ( ( Math.abs(pX-cX) + Math.abs(pY-cY) ) < cfg.sensitivity ) {
-                               $(ob).unbind("mousemove",track);
-                               // set hoverIntent state to true (so mouseOut can be called)
-                               ob.hoverIntent_s = 1;
-                               return cfg.over.apply(ob,[ev]);
-                       } else {
-                               // set previous coordinates for next time
-                               pX = cX; pY = cY;
-                               // use self-calling timeout, guarantees intervals are spaced out properly (avoids JavaScript timer bugs)
-                               ob.hoverIntent_t = setTimeout( function(){compare(ev, ob);} , cfg.interval );
-                       }
-               };
-
-               // A private function for delaying the mouseOut function
-               var delay = function(ev,ob) {
-                       ob.hoverIntent_t = clearTimeout(ob.hoverIntent_t);
-                       ob.hoverIntent_s = 0;
-                       return cfg.out.apply(ob,[ev]);
-               };
-
-               // A private function for handling mouse 'hovering'
-               var handleHover = function(e) {
-                       // next three lines copied from jQuery.hover, ignore children onMouseOver/onMouseOut
-                       var p = (e.type == "mouseover" ? e.fromElement : e.toElement) || e.relatedTarget;
-                       while ( p && p != this ) { try { p = p.parentNode; } catch(e) { p = this; } }
-                       if ( p == this ) { return false; }
-
-                       // copy objects to be passed into t (required for event object to be passed in IE)
-                       var ev = $.extend({},e);
-                       var ob = this;
-
-                       // cancel hoverIntent timer if it exists
-                       if (ob.hoverIntent_t) { ob.hoverIntent_t = clearTimeout(ob.hoverIntent_t); }
-
-                       // else e.type == "onmouseover"
-                       if (e.type == "mouseover") {
-                               // set "previous" X and Y position based on initial entry point
-                               pX = ev.pageX; pY = ev.pageY;
-                               // update "current" X and Y position based on mousemove
-                               $(ob).bind("mousemove",track);
-                               // start polling interval (self-calling timeout) to compare mouse coordinates over time
-                               if (ob.hoverIntent_s != 1) { ob.hoverIntent_t = setTimeout( function(){compare(ev,ob);} , cfg.interval );}
-
-                       // else e.type == "onmouseout"
-                       } else {
-                               // unbind expensive mousemove event
-                               $(ob).unbind("mousemove",track);
-                               // if hoverIntent state is true, then call the mouseOut function after the specified delay
-                               if (ob.hoverIntent_s == 1) { ob.hoverIntent_t = setTimeout( function(){delay(ev,ob);} , cfg.timeout );}
-                       }
-               };
-
-               // bind the function to the two event listeners
-               return this.mouseover(handleHover).mouseout(handleHover);
-       };
-})(jQuery);
\ No newline at end of file
diff --git a/resources/jquery/jquery.jStorage.js b/resources/jquery/jquery.jStorage.js
deleted file mode 100644 (file)
index 324833c..0000000
+++ /dev/null
@@ -1,960 +0,0 @@
-/*
- * ----------------------------- JSTORAGE -------------------------------------
- * Simple local storage wrapper to save data on the browser side, supporting
- * all major browsers - IE6+, Firefox2+, Safari4+, Chrome4+ and Opera 10.5+
- *
- * Author: Andris Reinman, andris.reinman@gmail.com
- * Project homepage: www.jstorage.info
- *
- * Licensed under Unlicense:
- *
- * This is free and unencumbered software released into the public domain.
- * 
- * Anyone is free to copy, modify, publish, use, compile, sell, or
- * distribute this software, either in source code form or as a compiled
- * binary, for any purpose, commercial or non-commercial, and by any
- * means.
- * 
- * In jurisdictions that recognize copyright laws, the author or authors
- * of this software dedicate any and all copyright interest in the
- * software to the public domain. We make this dedication for the benefit
- * of the public at large and to the detriment of our heirs and
- * successors. We intend this dedication to be an overt act of
- * relinquishment in perpetuity of all present and future rights to this
- * software under copyright law.
- * 
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
- * IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
- * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
- * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
- * OTHER DEALINGS IN THE SOFTWARE.
- * 
- * For more information, please refer to <http://unlicense.org/>
- */
-
- (function(){
-    var
-        /* jStorage version */
-        JSTORAGE_VERSION = "0.4.8",
-
-        /* detect a dollar object or create one if not found */
-        $ = window.jQuery || window.$ || (window.$ = {}),
-
-        /* check for a JSON handling support */
-        JSON = {
-            parse:
-                window.JSON && (window.JSON.parse || window.JSON.decode) ||
-                String.prototype.evalJSON && function(str){return String(str).evalJSON();} ||
-                $.parseJSON ||
-                $.evalJSON,
-            stringify:
-                Object.toJSON ||
-                window.JSON && (window.JSON.stringify || window.JSON.encode) ||
-                $.toJSON
-        };
-
-    // Break if no JSON support was found
-    if(!("parse" in JSON) || !("stringify" in JSON)){
-        throw new Error("No JSON support found, include //cdnjs.cloudflare.com/ajax/libs/json2/20110223/json2.js to page");
-    }
-
-    var
-        /* This is the object, that holds the cached values */
-        _storage = {__jstorage_meta:{CRC32:{}}},
-
-        /* Actual browser storage (localStorage or globalStorage["domain"]) */
-        _storage_service = {jStorage:"{}"},
-
-        /* DOM element for older IE versions, holds userData behavior */
-        _storage_elm = null,
-
-        /* How much space does the storage take */
-        _storage_size = 0,
-
-        /* which backend is currently used */
-        _backend = false,
-
-        /* onchange observers */
-        _observers = {},
-
-        /* timeout to wait after onchange event */
-        _observer_timeout = false,
-
-        /* last update time */
-        _observer_update = 0,
-
-        /* pubsub observers */
-        _pubsub_observers = {},
-
-        /* skip published items older than current timestamp */
-        _pubsub_last = +new Date(),
-
-        /* Next check for TTL */
-        _ttl_timeout,
-
-        /**
-         * XML encoding and decoding as XML nodes can't be JSON'ized
-         * XML nodes are encoded and decoded if the node is the value to be saved
-         * but not if it's as a property of another object
-         * Eg. -
-         *   $.jStorage.set("key", xmlNode);        // IS OK
-         *   $.jStorage.set("key", {xml: xmlNode}); // NOT OK
-         */
-        _XMLService = {
-
-            /**
-             * Validates a XML node to be XML
-             * based on jQuery.isXML function
-             */
-            isXML: function(elm){
-                var documentElement = (elm ? elm.ownerDocument || elm : 0).documentElement;
-                return documentElement ? documentElement.nodeName !== "HTML" : false;
-            },
-
-            /**
-             * Encodes a XML node to string
-             * based on http://www.mercurytide.co.uk/news/article/issues-when-working-ajax/
-             */
-            encode: function(xmlNode) {
-                if(!this.isXML(xmlNode)){
-                    return false;
-                }
-                try{ // Mozilla, Webkit, Opera
-                    return new XMLSerializer().serializeToString(xmlNode);
-                }catch(E1) {
-                    try {  // IE
-                        return xmlNode.xml;
-                    }catch(E2){}
-                }
-                return false;
-            },
-
-            /**
-             * Decodes a XML node from string
-             * loosely based on http://outwestmedia.com/jquery-plugins/xmldom/
-             */
-            decode: function(xmlString){
-                var dom_parser = ("DOMParser" in window && (new DOMParser()).parseFromString) ||
-                        (window.ActiveXObject && function(_xmlString) {
-                    var xml_doc = new ActiveXObject("Microsoft.XMLDOM");
-                    xml_doc.async = "false";
-                    xml_doc.loadXML(_xmlString);
-                    return xml_doc;
-                }),
-                resultXML;
-                if(!dom_parser){
-                    return false;
-                }
-                resultXML = dom_parser.call("DOMParser" in window && (new DOMParser()) || window, xmlString, "text/xml");
-                return this.isXML(resultXML)?resultXML:false;
-            }
-        };
-
-
-    ////////////////////////// PRIVATE METHODS ////////////////////////
-
-    /**
-     * Initialization function. Detects if the browser supports DOM Storage
-     * or userData behavior and behaves accordingly.
-     */
-    function _init(){
-        /* Check if browser supports localStorage */
-        var localStorageReallyWorks = false;
-        if("localStorage" in window){
-            try {
-                window.localStorage.setItem("_tmptest", "tmpval");
-                localStorageReallyWorks = true;
-                window.localStorage.removeItem("_tmptest");
-            } catch(BogusQuotaExceededErrorOnIos5) {
-                // Thanks be to iOS5 Private Browsing mode which throws
-                // QUOTA_EXCEEDED_ERRROR DOM Exception 22.
-            }
-        }
-
-        if(localStorageReallyWorks){
-            try {
-                if(window.localStorage) {
-                    _storage_service = window.localStorage;
-                    _backend = "localStorage";
-                    _observer_update = _storage_service.jStorage_update;
-                }
-            } catch(E3) {/* Firefox fails when touching localStorage and cookies are disabled */}
-        }
-        /* Check if browser supports globalStorage */
-        else if("globalStorage" in window){
-            try {
-                if(window.globalStorage) {
-                    if(window.location.hostname == "localhost"){
-                        _storage_service = window.globalStorage["localhost.localdomain"];
-                    }
-                    else{
-                        _storage_service = window.globalStorage[window.location.hostname];
-                    }
-                    _backend = "globalStorage";
-                    _observer_update = _storage_service.jStorage_update;
-                }
-            } catch(E4) {/* Firefox fails when touching localStorage and cookies are disabled */}
-        }
-        /* Check if browser supports userData behavior */
-        else {
-            _storage_elm = document.createElement("link");
-            if(_storage_elm.addBehavior){
-
-                /* Use a DOM element to act as userData storage */
-                _storage_elm.style.behavior = "url(#default#userData)";
-
-                /* userData element needs to be inserted into the DOM! */
-                document.getElementsByTagName("head")[0].appendChild(_storage_elm);
-
-                try{
-                    _storage_elm.load("jStorage");
-                }catch(E){
-                    // try to reset cache
-                    _storage_elm.setAttribute("jStorage", "{}");
-                    _storage_elm.save("jStorage");
-                    _storage_elm.load("jStorage");
-                }
-
-                var data = "{}";
-                try{
-                    data = _storage_elm.getAttribute("jStorage");
-                }catch(E5){}
-
-                try{
-                    _observer_update = _storage_elm.getAttribute("jStorage_update");
-                }catch(E6){}
-
-                _storage_service.jStorage = data;
-                _backend = "userDataBehavior";
-            }else{
-                _storage_elm = null;
-                return;
-            }
-        }
-
-        // Load data from storage
-        _load_storage();
-
-        // remove dead keys
-        _handleTTL();
-
-        // start listening for changes
-        _setupObserver();
-
-        // initialize publish-subscribe service
-        _handlePubSub();
-
-        // handle cached navigation
-        if("addEventListener" in window){
-            window.addEventListener("pageshow", function(event){
-                if(event.persisted){
-                    _storageObserver();
-                }
-            }, false);
-        }
-    }
-
-    /**
-     * Reload data from storage when needed
-     */
-    function _reloadData(){
-        var data = "{}";
-
-        if(_backend == "userDataBehavior"){
-            _storage_elm.load("jStorage");
-
-            try{
-                data = _storage_elm.getAttribute("jStorage");
-            }catch(E5){}
-
-            try{
-                _observer_update = _storage_elm.getAttribute("jStorage_update");
-            }catch(E6){}
-
-            _storage_service.jStorage = data;
-        }
-
-        _load_storage();
-
-        // remove dead keys
-        _handleTTL();
-
-        _handlePubSub();
-    }
-
-    /**
-     * Sets up a storage change observer
-     */
-    function _setupObserver(){
-        if(_backend == "localStorage" || _backend == "globalStorage"){
-            if("addEventListener" in window){
-                window.addEventListener("storage", _storageObserver, false);
-            }else{
-                document.attachEvent("onstorage", _storageObserver);
-            }
-        }else if(_backend == "userDataBehavior"){
-            setInterval(_storageObserver, 1000);
-        }
-    }
-
-    /**
-     * Fired on any kind of data change, needs to check if anything has
-     * really been changed
-     */
-    function _storageObserver(){
-        var updateTime;
-        // cumulate change notifications with timeout
-        clearTimeout(_observer_timeout);
-        _observer_timeout = setTimeout(function(){
-
-            if(_backend == "localStorage" || _backend == "globalStorage"){
-                updateTime = _storage_service.jStorage_update;
-            }else if(_backend == "userDataBehavior"){
-                _storage_elm.load("jStorage");
-                try{
-                    updateTime = _storage_elm.getAttribute("jStorage_update");
-                }catch(E5){}
-            }
-
-            if(updateTime && updateTime != _observer_update){
-                _observer_update = updateTime;
-                _checkUpdatedKeys();
-            }
-
-        }, 25);
-    }
-
-    /**
-     * Reloads the data and checks if any keys are changed
-     */
-    function _checkUpdatedKeys(){
-        var oldCrc32List = JSON.parse(JSON.stringify(_storage.__jstorage_meta.CRC32)),
-            newCrc32List;
-
-        _reloadData();
-        newCrc32List = JSON.parse(JSON.stringify(_storage.__jstorage_meta.CRC32));
-
-        var key,
-            updated = [],
-            removed = [];
-
-        for(key in oldCrc32List){
-            if(oldCrc32List.hasOwnProperty(key)){
-                if(!newCrc32List[key]){
-                    removed.push(key);
-                    continue;
-                }
-                if(oldCrc32List[key] != newCrc32List[key] && String(oldCrc32List[key]).substr(0,2) == "2."){
-                    updated.push(key);
-                }
-            }
-        }
-
-        for(key in newCrc32List){
-            if(newCrc32List.hasOwnProperty(key)){
-                if(!oldCrc32List[key]){
-                    updated.push(key);
-                }
-            }
-        }
-
-        _fireObservers(updated, "updated");
-        _fireObservers(removed, "deleted");
-    }
-
-    /**
-     * Fires observers for updated keys
-     *
-     * @param {Array|String} keys Array of key names or a key
-     * @param {String} action What happened with the value (updated, deleted, flushed)
-     */
-    function _fireObservers(keys, action){
-        keys = [].concat(keys || []);
-        if(action == "flushed"){
-            keys = [];
-            for(var key in _observers){
-                if(_observers.hasOwnProperty(key)){
-                    keys.push(key);
-                }
-            }
-            action = "deleted";
-        }
-        for(var i=0, len = keys.length; i<len; i++){
-            if(_observers[keys[i]]){
-                for(var j=0, jlen = _observers[keys[i]].length; j<jlen; j++){
-                    _observers[keys[i]][j](keys[i], action);
-                }
-            }
-            if(_observers["*"]){
-                for(var j=0, jlen = _observers["*"].length; j<jlen; j++){
-                    _observers["*"][j](keys[i], action);
-                }
-            }
-        }
-    }
-
-    /**
-     * Publishes key change to listeners
-     */
-    function _publishChange(){
-        var updateTime = (+new Date()).toString();
-
-        if(_backend == "localStorage" || _backend == "globalStorage"){
-            try {
-                _storage_service.jStorage_update = updateTime;
-            } catch (E8) {
-                // safari private mode has been enabled after the jStorage initialization
-                _backend = false;
-            }
-        }else if(_backend == "userDataBehavior"){
-            _storage_elm.setAttribute("jStorage_update", updateTime);
-            _storage_elm.save("jStorage");
-        }
-
-        _storageObserver();
-    }
-
-    /**
-     * Loads the data from the storage based on the supported mechanism
-     */
-    function _load_storage(){
-        /* if jStorage string is retrieved, then decode it */
-        if(_storage_service.jStorage){
-            try{
-                _storage = JSON.parse(String(_storage_service.jStorage));
-            }catch(E6){_storage_service.jStorage = "{}";}
-        }else{
-            _storage_service.jStorage = "{}";
-        }
-        _storage_size = _storage_service.jStorage?String(_storage_service.jStorage).length:0;
-
-        if(!_storage.__jstorage_meta){
-            _storage.__jstorage_meta = {};
-        }
-        if(!_storage.__jstorage_meta.CRC32){
-            _storage.__jstorage_meta.CRC32 = {};
-        }
-    }
-
-    /**
-     * This functions provides the "save" mechanism to store the jStorage object
-     */
-    function _save(){
-        _dropOldEvents(); // remove expired events
-        try{
-            _storage_service.jStorage = JSON.stringify(_storage);
-            // If userData is used as the storage engine, additional
-            if(_storage_elm) {
-                _storage_elm.setAttribute("jStorage",_storage_service.jStorage);
-                _storage_elm.save("jStorage");
-            }
-            _storage_size = _storage_service.jStorage?String(_storage_service.jStorage).length:0;
-        }catch(E7){/* probably cache is full, nothing is saved this way*/}
-    }
-
-    /**
-     * Function checks if a key is set and is string or numberic
-     *
-     * @param {String} key Key name
-     */
-    function _checkKey(key){
-        if(typeof key != "string" && typeof key != "number"){
-            throw new TypeError("Key name must be string or numeric");
-        }
-        if(key == "__jstorage_meta"){
-            throw new TypeError("Reserved key name");
-        }
-        return true;
-    }
-
-    /**
-     * Removes expired keys
-     */
-    function _handleTTL(){
-        var curtime, i, TTL, CRC32, nextExpire = Infinity, changed = false, deleted = [];
-
-        clearTimeout(_ttl_timeout);
-
-        if(!_storage.__jstorage_meta || typeof _storage.__jstorage_meta.TTL != "object"){
-            // nothing to do here
-            return;
-        }
-
-        curtime = +new Date();
-        TTL = _storage.__jstorage_meta.TTL;
-
-        CRC32 = _storage.__jstorage_meta.CRC32;
-        for(i in TTL){
-            if(TTL.hasOwnProperty(i)){
-                if(TTL[i] <= curtime){
-                    delete TTL[i];
-                    delete CRC32[i];
-                    delete _storage[i];
-                    changed = true;
-                    deleted.push(i);
-                }else if(TTL[i] < nextExpire){
-                    nextExpire = TTL[i];
-                }
-            }
-        }
-
-        // set next check
-        if(nextExpire != Infinity){
-            _ttl_timeout = setTimeout(_handleTTL, nextExpire - curtime);
-        }
-
-        // save changes
-        if(changed){
-            _save();
-            _publishChange();
-            _fireObservers(deleted, "deleted");
-        }
-    }
-
-    /**
-     * Checks if there's any events on hold to be fired to listeners
-     */
-    function _handlePubSub(){
-        var i, len;
-        if(!_storage.__jstorage_meta.PubSub){
-            return;
-        }
-        var pubelm,
-            _pubsubCurrent = _pubsub_last;
-
-        for(i=len=_storage.__jstorage_meta.PubSub.length-1; i>=0; i--){
-            pubelm = _storage.__jstorage_meta.PubSub[i];
-            if(pubelm[0] > _pubsub_last){
-                _pubsubCurrent = pubelm[0];
-                _fireSubscribers(pubelm[1], pubelm[2]);
-            }
-        }
-
-        _pubsub_last = _pubsubCurrent;
-    }
-
-    /**
-     * Fires all subscriber listeners for a pubsub channel
-     *
-     * @param {String} channel Channel name
-     * @param {Mixed} payload Payload data to deliver
-     */
-    function _fireSubscribers(channel, payload){
-        if(_pubsub_observers[channel]){
-            for(var i=0, len = _pubsub_observers[channel].length; i<len; i++){
-                // send immutable data that can't be modified by listeners
-                try{
-                    _pubsub_observers[channel][i](channel, JSON.parse(JSON.stringify(payload)));
-                }catch(E){};
-            }
-        }
-    }
-
-    /**
-     * Remove old events from the publish stream (at least 2sec old)
-     */
-    function _dropOldEvents(){
-        if(!_storage.__jstorage_meta.PubSub){
-            return;
-        }
-
-        var retire = +new Date() - 2000;
-
-        for(var i=0, len = _storage.__jstorage_meta.PubSub.length; i<len; i++){
-            if(_storage.__jstorage_meta.PubSub[i][0] <= retire){
-                // deleteCount is needed for IE6
-                _storage.__jstorage_meta.PubSub.splice(i, _storage.__jstorage_meta.PubSub.length - i);
-                break;
-            }
-        }
-
-        if(!_storage.__jstorage_meta.PubSub.length){
-            delete _storage.__jstorage_meta.PubSub;
-        }
-
-    }
-
-    /**
-     * Publish payload to a channel
-     *
-     * @param {String} channel Channel name
-     * @param {Mixed} payload Payload to send to the subscribers
-     */
-    function _publish(channel, payload){
-        if(!_storage.__jstorage_meta){
-            _storage.__jstorage_meta = {};
-        }
-        if(!_storage.__jstorage_meta.PubSub){
-            _storage.__jstorage_meta.PubSub = [];
-        }
-
-        _storage.__jstorage_meta.PubSub.unshift([+new Date, channel, payload]);
-
-        _save();
-        _publishChange();
-    }
-
-
-    /**
-     * JS Implementation of MurmurHash2
-     *
-     *  SOURCE: https://github.com/garycourt/murmurhash-js (MIT licensed)
-     *
-     * @author <a href="mailto:gary.court@gmail.com">Gary Court</a>
-     * @see http://github.com/garycourt/murmurhash-js
-     * @author <a href="mailto:aappleby@gmail.com">Austin Appleby</a>
-     * @see http://sites.google.com/site/murmurhash/
-     *
-     * @param {string} str ASCII only
-     * @param {number} seed Positive integer only
-     * @return {number} 32-bit positive integer hash
-     */
-
-    function murmurhash2_32_gc(str, seed) {
-        var
-            l = str.length,
-            h = seed ^ l,
-            i = 0,
-            k;
-
-        while (l >= 4) {
-            k =
-                ((str.charCodeAt(i) & 0xff)) |
-                ((str.charCodeAt(++i) & 0xff) << 8) |
-                ((str.charCodeAt(++i) & 0xff) << 16) |
-                ((str.charCodeAt(++i) & 0xff) << 24);
-
-            k = (((k & 0xffff) * 0x5bd1e995) + ((((k >>> 16) * 0x5bd1e995) & 0xffff) << 16));
-            k ^= k >>> 24;
-            k = (((k & 0xffff) * 0x5bd1e995) + ((((k >>> 16) * 0x5bd1e995) & 0xffff) << 16));
-
-            h = (((h & 0xffff) * 0x5bd1e995) + ((((h >>> 16) * 0x5bd1e995) & 0xffff) << 16)) ^ k;
-
-            l -= 4;
-            ++i;
-        }
-
-        switch (l) {
-            case 3: h ^= (str.charCodeAt(i + 2) & 0xff) << 16;
-            case 2: h ^= (str.charCodeAt(i + 1) & 0xff) << 8;
-            case 1: h ^= (str.charCodeAt(i) & 0xff);
-                h = (((h & 0xffff) * 0x5bd1e995) + ((((h >>> 16) * 0x5bd1e995) & 0xffff) << 16));
-        }
-
-        h ^= h >>> 13;
-        h = (((h & 0xffff) * 0x5bd1e995) + ((((h >>> 16) * 0x5bd1e995) & 0xffff) << 16));
-        h ^= h >>> 15;
-
-        return h >>> 0;
-    }
-
-    ////////////////////////// PUBLIC INTERFACE /////////////////////////
-
-    $.jStorage = {
-        /* Version number */
-        version: JSTORAGE_VERSION,
-
-        /**
-         * Sets a key's value.
-         *
-         * @param {String} key Key to set. If this value is not set or not
-         *              a string an exception is raised.
-         * @param {Mixed} value Value to set. This can be any value that is JSON
-         *              compatible (Numbers, Strings, Objects etc.).
-         * @param {Object} [options] - possible options to use
-         * @param {Number} [options.TTL] - optional TTL value
-         * @return {Mixed} the used value
-         */
-        set: function(key, value, options){
-            _checkKey(key);
-
-            options = options || {};
-
-            // undefined values are deleted automatically
-            if(typeof value == "undefined"){
-                this.deleteKey(key);
-                return value;
-            }
-
-            if(_XMLService.isXML(value)){
-                value = {_is_xml:true,xml:_XMLService.encode(value)};
-            }else if(typeof value == "function"){
-                return undefined; // functions can't be saved!
-            }else if(value && typeof value == "object"){
-                // clone the object before saving to _storage tree
-                value = JSON.parse(JSON.stringify(value));
-            }
-
-            _storage[key] = value;
-
-            _storage.__jstorage_meta.CRC32[key] = "2." + murmurhash2_32_gc(JSON.stringify(value), 0x9747b28c);
-
-            this.setTTL(key, options.TTL || 0); // also handles saving and _publishChange
-
-            _fireObservers(key, "updated");
-            return value;
-        },
-
-        /**
-         * Looks up a key in cache
-         *
-         * @param {String} key - Key to look up.
-         * @param {mixed} def - Default value to return, if key didn't exist.
-         * @return {Mixed} the key value, default value or null
-         */
-        get: function(key, def){
-            _checkKey(key);
-            if(key in _storage){
-                if(_storage[key] && typeof _storage[key] == "object" && _storage[key]._is_xml) {
-                    return _XMLService.decode(_storage[key].xml);
-                }else{
-                    return _storage[key];
-                }
-            }
-            return typeof(def) == "undefined" ? null : def;
-        },
-
-        /**
-         * Deletes a key from cache.
-         *
-         * @param {String} key - Key to delete.
-         * @return {Boolean} true if key existed or false if it didn't
-         */
-        deleteKey: function(key){
-            _checkKey(key);
-            if(key in _storage){
-                delete _storage[key];
-                // remove from TTL list
-                if(typeof _storage.__jstorage_meta.TTL == "object" &&
-                  key in _storage.__jstorage_meta.TTL){
-                    delete _storage.__jstorage_meta.TTL[key];
-                }
-
-                delete _storage.__jstorage_meta.CRC32[key];
-
-                _save();
-                _publishChange();
-                _fireObservers(key, "deleted");
-                return true;
-            }
-            return false;
-        },
-
-        /**
-         * Sets a TTL for a key, or remove it if ttl value is 0 or below
-         *
-         * @param {String} key - key to set the TTL for
-         * @param {Number} ttl - TTL timeout in milliseconds
-         * @return {Boolean} true if key existed or false if it didn't
-         */
-        setTTL: function(key, ttl){
-            var curtime = +new Date();
-            _checkKey(key);
-            ttl = Number(ttl) || 0;
-            if(key in _storage){
-
-                if(!_storage.__jstorage_meta.TTL){
-                    _storage.__jstorage_meta.TTL = {};
-                }
-
-                // Set TTL value for the key
-                if(ttl>0){
-                    _storage.__jstorage_meta.TTL[key] = curtime + ttl;
-                }else{
-                    delete _storage.__jstorage_meta.TTL[key];
-                }
-
-                _save();
-
-                _handleTTL();
-
-                _publishChange();
-                return true;
-            }
-            return false;
-        },
-
-        /**
-         * Gets remaining TTL (in milliseconds) for a key or 0 when no TTL has been set
-         *
-         * @param {String} key Key to check
-         * @return {Number} Remaining TTL in milliseconds
-         */
-        getTTL: function(key){
-            var curtime = +new Date(), ttl;
-            _checkKey(key);
-            if(key in _storage && _storage.__jstorage_meta.TTL && _storage.__jstorage_meta.TTL[key]){
-                ttl = _storage.__jstorage_meta.TTL[key] - curtime;
-                return ttl || 0;
-            }
-            return 0;
-        },
-
-        /**
-         * Deletes everything in cache.
-         *
-         * @return {Boolean} Always true
-         */
-        flush: function(){
-            _storage = {__jstorage_meta:{CRC32:{}}};
-            _save();
-            _publishChange();
-            _fireObservers(null, "flushed");
-            return true;
-        },
-
-        /**
-         * Returns a read-only copy of _storage
-         *
-         * @return {Object} Read-only copy of _storage
-        */
-        storageObj: function(){
-            function F() {}
-            F.prototype = _storage;
-            return new F();
-        },
-
-        /**
-         * Returns an index of all used keys as an array
-         * ["key1", "key2",.."keyN"]
-         *
-         * @return {Array} Used keys
-        */
-        index: function(){
-            var index = [], i;
-            for(i in _storage){
-                if(_storage.hasOwnProperty(i) && i != "__jstorage_meta"){
-                    index.push(i);
-                }
-            }
-            return index;
-        },
-
-        /**
-         * How much space in bytes does the storage take?
-         *
-         * @return {Number} Storage size in chars (not the same as in bytes,
-         *                  since some chars may take several bytes)
-         */
-        storageSize: function(){
-            return _storage_size;
-        },
-
-        /**
-         * Which backend is currently in use?
-         *
-         * @return {String} Backend name
-         */
-        currentBackend: function(){
-            return _backend;
-        },
-
-        /**
-         * Test if storage is available
-         *
-         * @return {Boolean} True if storage can be used
-         */
-        storageAvailable: function(){
-            return !!_backend;
-        },
-
-        /**
-         * Register change listeners
-         *
-         * @param {String} key Key name
-         * @param {Function} callback Function to run when the key changes
-         */
-        listenKeyChange: function(key, callback){
-            _checkKey(key);
-            if(!_observers[key]){
-                _observers[key] = [];
-            }
-            _observers[key].push(callback);
-        },
-
-        /**
-         * Remove change listeners
-         *
-         * @param {String} key Key name to unregister listeners against
-         * @param {Function} [callback] If set, unregister the callback, if not - unregister all
-         */
-        stopListening: function(key, callback){
-            _checkKey(key);
-
-            if(!_observers[key]){
-                return;
-            }
-
-            if(!callback){
-                delete _observers[key];
-                return;
-            }
-
-            for(var i = _observers[key].length - 1; i>=0; i--){
-                if(_observers[key][i] == callback){
-                    _observers[key].splice(i,1);
-                }
-            }
-        },
-
-        /**
-         * Subscribe to a Publish/Subscribe event stream
-         *
-         * @param {String} channel Channel name
-         * @param {Function} callback Function to run when the something is published to the channel
-         */
-        subscribe: function(channel, callback){
-            channel = (channel || "").toString();
-            if(!channel){
-                throw new TypeError("Channel not defined");
-            }
-            if(!_pubsub_observers[channel]){
-                _pubsub_observers[channel] = [];
-            }
-            _pubsub_observers[channel].push(callback);
-        },
-
-        /**
-         * Publish data to an event stream
-         *
-         * @param {String} channel Channel name
-         * @param {Mixed} payload Payload to deliver
-         */
-        publish: function(channel, payload){
-            channel = (channel || "").toString();
-            if(!channel){
-                throw new TypeError("Channel not defined");
-            }
-
-            _publish(channel, payload);
-        },
-
-        /**
-         * Reloads the data from browser storage
-         */
-        reInit: function(){
-            _reloadData();
-        },
-
-        /**
-         * Removes reference from global objects and saves it as jStorage
-         *
-         * @param {Boolean} option if needed to save object as simple "jStorage" in windows context
-         */
-         noConflict: function( saveInGlobal ) {
-            delete window.$.jStorage
-
-            if ( saveInGlobal ) {
-                window.jStorage = this;
-            }
-
-            return this;
-         }
-    };
-
-    // Initialize jStorage
-    _init();
-
-})();
diff --git a/resources/jquery/jquery.js b/resources/jquery/jquery.js
deleted file mode 100644 (file)
index a86bf79..0000000
+++ /dev/null
@@ -1,9472 +0,0 @@
-/*!
- * jQuery JavaScript Library v1.8.3
- * http://jquery.com/
- *
- * Includes Sizzle.js
- * http://sizzlejs.com/
- *
- * Copyright 2012 jQuery Foundation and other contributors
- * Released under the MIT license
- * http://jquery.org/license
- *
- * Date: Tue Nov 13 2012 08:20:33 GMT-0500 (Eastern Standard Time)
- */
-(function( window, undefined ) {
-var
-       // A central reference to the root jQuery(document)
-       rootjQuery,
-
-       // The deferred used on DOM ready
-       readyList,
-
-       // Use the correct document accordingly with window argument (sandbox)
-       document = window.document,
-       location = window.location,
-       navigator = window.navigator,
-
-       // Map over jQuery in case of overwrite
-       _jQuery = window.jQuery,
-
-       // Map over the $ in case of overwrite
-       _$ = window.$,
-
-       // Save a reference to some core methods
-       core_push = Array.prototype.push,
-       core_slice = Array.prototype.slice,
-       core_indexOf = Array.prototype.indexOf,
-       core_toString = Object.prototype.toString,
-       core_hasOwn = Object.prototype.hasOwnProperty,
-       core_trim = String.prototype.trim,
-
-       // Define a local copy of jQuery
-       jQuery = function( selector, context ) {
-               // The jQuery object is actually just the init constructor 'enhanced'
-               return new jQuery.fn.init( selector, context, rootjQuery );
-       },
-
-       // Used for matching numbers
-       core_pnum = /[\-+]?(?:\d*\.|)\d+(?:[eE][\-+]?\d+|)/.source,
-
-       // Used for detecting and trimming whitespace
-       core_rnotwhite = /\S/,
-       core_rspace = /\s+/,
-
-       // Make sure we trim BOM and NBSP (here's looking at you, Safari 5.0 and IE)
-       rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,
-
-       // A simple way to check for HTML strings
-       // Prioritize #id over <tag> to avoid XSS via location.hash (#9521)
-       rquickExpr = /^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,
-
-       // Match a standalone tag
-       rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>|)$/,
-
-       // JSON RegExp
-       rvalidchars = /^[\],:{}\s]*$/,
-       rvalidbraces = /(?:^|:|,)(?:\s*\[)+/g,
-       rvalidescape = /\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g,
-       rvalidtokens = /"[^"\\\r\n]*"|true|false|null|-?(?:\d\d*\.|)\d+(?:[eE][\-+]?\d+|)/g,
-
-       // Matches dashed string for camelizing
-       rmsPrefix = /^-ms-/,
-       rdashAlpha = /-([\da-z])/gi,
-
-       // Used by jQuery.camelCase as callback to replace()
-       fcamelCase = function( all, letter ) {
-               return ( letter + "" ).toUpperCase();
-       },
-
-       // The ready event handler and self cleanup method
-       DOMContentLoaded = function() {
-               if ( document.addEventListener ) {
-                       document.removeEventListener( "DOMContentLoaded", DOMContentLoaded, false );
-                       jQuery.ready();
-               } else if ( document.readyState === "complete" ) {
-                       // we're here because readyState === "complete" in oldIE
-                       // which is good enough for us to call the dom ready!
-                       document.detachEvent( "onreadystatechange", DOMContentLoaded );
-                       jQuery.ready();
-               }
-       },
-
-       // [[Class]] -> type pairs
-       class2type = {};
-
-jQuery.fn = jQuery.prototype = {
-       constructor: jQuery,
-       init: function( selector, context, rootjQuery ) {
-               var match, elem, ret, doc;
-
-               // Handle $(""), $(null), $(undefined), $(false)
-               if ( !selector ) {
-                       return this;
-               }
-
-               // Handle $(DOMElement)
-               if ( selector.nodeType ) {
-                       this.context = this[0] = selector;
-                       this.length = 1;
-                       return this;
-               }
-
-               // Handle HTML strings
-               if ( typeof selector === "string" ) {
-                       if ( selector.charAt(0) === "<" && selector.charAt( selector.length - 1 ) === ">" && selector.length >= 3 ) {
-                               // Assume that strings that start and end with <> are HTML and skip the regex check
-                               match = [ null, selector, null ];
-
-                       } else {
-                               match = rquickExpr.exec( selector );
-                       }
-
-                       // Match html or make sure no context is specified for #id
-                       if ( match && (match[1] || !context) ) {
-
-                               // HANDLE: $(html) -> $(array)
-                               if ( match[1] ) {
-                                       context = context instanceof jQuery ? context[0] : context;
-                                       doc = ( context && context.nodeType ? context.ownerDocument || context : document );
-
-                                       // scripts is true for back-compat
-                                       selector = jQuery.parseHTML( match[1], doc, true );
-                                       if ( rsingleTag.test( match[1] ) && jQuery.isPlainObject( context ) ) {
-                                               this.attr.call( selector, context, true );
-                                       }
-
-                                       return jQuery.merge( this, selector );
-
-                               // HANDLE: $(#id)
-                               } else {
-                                       elem = document.getElementById( match[2] );
-
-                                       // Check parentNode to catch when Blackberry 4.6 returns
-                                       // nodes that are no longer in the document #6963
-                                       if ( elem && elem.parentNode ) {
-                                               // Handle the case where IE and Opera return items
-                                               // by name instead of ID
-                                               if ( elem.id !== match[2] ) {
-                                                       return rootjQuery.find( selector );
-                                               }
-
-                                               // Otherwise, we inject the element directly into the jQuery object
-                                               this.length = 1;
-                                               this[0] = elem;
-                                       }
-
-                                       this.context = document;
-                                       this.selector = selector;
-                                       return this;
-                               }
-
-                       // HANDLE: $(expr, $(...))
-                       } else if ( !context || context.jquery ) {
-                               return ( context || rootjQuery ).find( selector );
-
-                       // HANDLE: $(expr, context)
-                       // (which is just equivalent to: $(context).find(expr)
-                       } else {
-                               return this.constructor( context ).find( selector );
-                       }
-
-               // HANDLE: $(function)
-               // Shortcut for document ready
-               } else if ( jQuery.isFunction( selector ) ) {
-                       return rootjQuery.ready( selector );
-               }
-
-               if ( selector.selector !== undefined ) {
-                       this.selector = selector.selector;
-                       this.context = selector.context;
-               }
-
-               return jQuery.makeArray( selector, this );
-       },
-
-       // Start with an empty selector
-       selector: "",
-
-       // The current version of jQuery being used
-       jquery: "1.8.3",
-
-       // The default length of a jQuery object is 0
-       length: 0,
-
-       // The number of elements contained in the matched element set
-       size: function() {
-               return this.length;
-       },
-
-       toArray: function() {
-               return core_slice.call( this );
-       },
-
-       // Get the Nth element in the matched element set OR
-       // Get the whole matched element set as a clean array
-       get: function( num ) {
-               return num == null ?
-
-                       // Return a 'clean' array
-                       this.toArray() :
-
-                       // Return just the object
-                       ( num < 0 ? this[ this.length + num ] : this[ num ] );
-       },
-
-       // Take an array of elements and push it onto the stack
-       // (returning the new matched element set)
-       pushStack: function( elems, name, selector ) {
-
-               // Build a new jQuery matched element set
-               var ret = jQuery.merge( this.constructor(), elems );
-
-               // Add the old object onto the stack (as a reference)
-               ret.prevObject = this;
-
-               ret.context = this.context;
-
-               if ( name === "find" ) {
-                       ret.selector = this.selector + ( this.selector ? " " : "" ) + selector;
-               } else if ( name ) {
-                       ret.selector = this.selector + "." + name + "(" + selector + ")";
-               }
-
-               // Return the newly-formed element set
-               return ret;
-       },
-
-       // Execute a callback for every element in the matched set.
-       // (You can seed the arguments with an array of args, but this is
-       // only used internally.)
-       each: function( callback, args ) {
-               return jQuery.each( this, callback, args );
-       },
-
-       ready: function( fn ) {
-               // Add the callback
-               jQuery.ready.promise().done( fn );
-
-               return this;
-       },
-
-       eq: function( i ) {
-               i = +i;
-               return i === -1 ?
-                       this.slice( i ) :
-                       this.slice( i, i + 1 );
-       },
-
-       first: function() {
-               return this.eq( 0 );
-       },
-
-       last: function() {
-               return this.eq( -1 );
-       },
-
-       slice: function() {
-               return this.pushStack( core_slice.apply( this, arguments ),
-                       "slice", core_slice.call(arguments).join(",") );
-       },
-
-       map: function( callback ) {
-               return this.pushStack( jQuery.map(this, function( elem, i ) {
-                       return callback.call( elem, i, elem );
-               }));
-       },
-
-       end: function() {
-               return this.prevObject || this.constructor(null);
-       },
-
-       // For internal use only.
-       // Behaves like an Array's method, not like a jQuery method.
-       push: core_push,
-       sort: [].sort,
-       splice: [].splice
-};
-
-// Give the init function the jQuery prototype for later instantiation
-jQuery.fn.init.prototype = jQuery.fn;
-
-jQuery.extend = jQuery.fn.extend = function() {
-       var options, name, src, copy, copyIsArray, clone,
-               target = arguments[0] || {},
-               i = 1,
-               length = arguments.length,
-               deep = false;
-
-       // Handle a deep copy situation
-       if ( typeof target === "boolean" ) {
-               deep = target;
-               target = arguments[1] || {};
-               // skip the boolean and the target
-               i = 2;
-       }
-
-       // Handle case when target is a string or something (possible in deep copy)
-       if ( typeof target !== "object" && !jQuery.isFunction(target) ) {
-               target = {};
-       }
-
-       // extend jQuery itself if only one argument is passed
-       if ( length === i ) {
-               target = this;
-               --i;
-       }
-
-       for ( ; i < length; i++ ) {
-               // Only deal with non-null/undefined values
-               if ( (options = arguments[ i ]) != null ) {
-                       // Extend the base object
-                       for ( name in options ) {
-                               src = target[ name ];
-                               copy = options[ name ];
-
-                               // Prevent never-ending loop
-                               if ( target === copy ) {
-                                       continue;
-                               }
-
-                               // Recurse if we're merging plain objects or arrays
-                               if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) {
-                                       if ( copyIsArray ) {
-                                               copyIsArray = false;
-                                               clone = src && jQuery.isArray(src) ? src : [];
-
-                                       } else {
-                                               clone = src && jQuery.isPlainObject(src) ? src : {};
-                                       }
-
-                                       // Never move original objects, clone them
-                                       target[ name ] = jQuery.extend( deep, clone, copy );
-
-                               // Don't bring in undefined values
-                               } else if ( copy !== undefined ) {
-                                       target[ name ] = copy;
-                               }
-                       }
-               }
-       }
-
-       // Return the modified object
-       return target;
-};
-
-jQuery.extend({
-       noConflict: function( deep ) {
-               if ( window.$ === jQuery ) {
-                       window.$ = _$;
-               }
-
-               if ( deep && window.jQuery === jQuery ) {
-                       window.jQuery = _jQuery;
-               }
-
-               return jQuery;
-       },
-
-       // Is the DOM ready to be used? Set to true once it occurs.
-       isReady: false,
-
-       // A counter to track how many items to wait for before
-       // the ready event fires. See #6781
-       readyWait: 1,
-
-       // Hold (or release) the ready event
-       holdReady: function( hold ) {
-               if ( hold ) {
-                       jQuery.readyWait++;
-               } else {
-                       jQuery.ready( true );
-               }
-       },
-
-       // Handle when the DOM is ready
-       ready: function( wait ) {
-
-               // Abort if there are pending holds or we're already ready
-               if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {
-                       return;
-               }
-
-               // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).
-               if ( !document.body ) {
-                       return setTimeout( jQuery.ready, 1 );
-               }
-
-               // Remember that the DOM is ready
-               jQuery.isReady = true;
-
-               // If a normal DOM Ready event fired, decrement, and wait if need be
-               if ( wait !== true && --jQuery.readyWait > 0 ) {
-                       return;
-               }
-
-               // If there are functions bound, to execute
-               readyList.resolveWith( document, [ jQuery ] );
-
-               // Trigger any bound ready events
-               if ( jQuery.fn.trigger ) {
-                       jQuery( document ).trigger("ready").off("ready");
-               }
-       },
-
-       // See test/unit/core.js for details concerning isFunction.
-       // Since version 1.3, DOM methods and functions like alert
-       // aren't supported. They return false on IE (#2968).
-       isFunction: function( obj ) {
-               return jQuery.type(obj) === "function";
-       },
-
-       isArray: Array.isArray || function( obj ) {
-               return jQuery.type(obj) === "array";
-       },
-
-       isWindow: function( obj ) {
-               return obj != null && obj == obj.window;
-       },
-
-       isNumeric: function( obj ) {
-               return !isNaN( parseFloat(obj) ) && isFinite( obj );
-       },
-
-       type: function( obj ) {
-               return obj == null ?
-                       String( obj ) :
-                       class2type[ core_toString.call(obj) ] || "object";
-       },
-
-       isPlainObject: function( obj ) {
-               // Must be an Object.
-               // Because of IE, we also have to check the presence of the constructor property.
-               // Make sure that DOM nodes and window objects don't pass through, as well
-               if ( !obj || jQuery.type(obj) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) {
-                       return false;
-               }
-
-               try {
-                       // Not own constructor property must be Object
-                       if ( obj.constructor &&
-                               !core_hasOwn.call(obj, "constructor") &&
-                               !core_hasOwn.call(obj.constructor.prototype, "isPrototypeOf") ) {
-                               return false;
-                       }
-               } catch ( e ) {
-                       // IE8,9 Will throw exceptions on certain host objects #9897
-                       return false;
-               }
-
-               // Own properties are enumerated firstly, so to speed up,
-               // if last one is own, then all properties are own.
-
-               var key;
-               for ( key in obj ) {}
-
-               return key === undefined || core_hasOwn.call( obj, key );
-       },
-
-       isEmptyObject: function( obj ) {
-               var name;
-               for ( name in obj ) {
-                       return false;
-               }
-               return true;
-       },
-
-       error: function( msg ) {
-               throw new Error( msg );
-       },
-
-       // data: string of html
-       // context (optional): If specified, the fragment will be created in this context, defaults to document
-       // scripts (optional): If true, will include scripts passed in the html string
-       parseHTML: function( data, context, scripts ) {
-               var parsed;
-               if ( !data || typeof data !== "string" ) {
-                       return null;
-               }
-               if ( typeof context === "boolean" ) {
-                       scripts = context;
-                       context = 0;
-               }
-               context = context || document;
-
-               // Single tag
-               if ( (parsed = rsingleTag.exec( data )) ) {
-                       return [ context.createElement( parsed[1] ) ];
-               }
-
-               parsed = jQuery.buildFragment( [ data ], context, scripts ? null : [] );
-               return jQuery.merge( [],
-                       (parsed.cacheable ? jQuery.clone( parsed.fragment ) : parsed.fragment).childNodes );
-       },
-
-       parseJSON: function( data ) {
-               if ( !data || typeof data !== "string") {
-                       return null;
-               }
-
-               // Make sure leading/trailing whitespace is removed (IE can't handle it)
-               data = jQuery.trim( data );
-
-               // Attempt to parse using the native JSON parser first
-               if ( window.JSON && window.JSON.parse ) {
-                       return window.JSON.parse( data );
-               }
-
-               // Make sure the incoming data is actual JSON
-               // Logic borrowed from http://json.org/json2.js
-               if ( rvalidchars.test( data.replace( rvalidescape, "@" )
-                       .replace( rvalidtokens, "]" )
-                       .replace( rvalidbraces, "")) ) {
-
-                       return ( new Function( "return " + data ) )();
-
-               }
-               jQuery.error( "Invalid JSON: " + data );
-       },
-
-       // Cross-browser xml parsing
-       parseXML: function( data ) {
-               var xml, tmp;
-               if ( !data || typeof data !== "string" ) {
-                       return null;
-               }
-               try {
-                       if ( window.DOMParser ) { // Standard
-                               tmp = new DOMParser();
-                               xml = tmp.parseFromString( data , "text/xml" );
-                       } else { // IE
-                               xml = new ActiveXObject( "Microsoft.XMLDOM" );
-                               xml.async = "false";
-                               xml.loadXML( data );
-                       }
-               } catch( e ) {
-                       xml = undefined;
-               }
-               if ( !xml || !xml.documentElement || xml.getElementsByTagName( "parsererror" ).length ) {
-                       jQuery.error( "Invalid XML: " + data );
-               }
-               return xml;
-       },
-
-       noop: function() {},
-
-       // Evaluates a script in a global context
-       // Workarounds based on findings by Jim Driscoll
-       // http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context
-       globalEval: function( data ) {
-               if ( data && core_rnotwhite.test( data ) ) {
-                       // We use execScript on Internet Explorer
-                       // We use an anonymous function so that context is window
-                       // rather than jQuery in Firefox
-                       ( window.execScript || function( data ) {
-                               window[ "eval" ].call( window, data );
-                       } )( data );
-               }
-       },
-
-       // Convert dashed to camelCase; used by the css and data modules
-       // Microsoft forgot to hump their vendor prefix (#9572)
-       camelCase: function( string ) {
-               return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase );
-       },
-
-       nodeName: function( elem, name ) {
-               return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();
-       },
-
-       // args is for internal usage only
-       each: function( obj, callback, args ) {
-               var name,
-                       i = 0,
-                       length = obj.length,
-                       isObj = length === undefined || jQuery.isFunction( obj );
-
-               if ( args ) {
-                       if ( isObj ) {
-                               for ( name in obj ) {
-                                       if ( callback.apply( obj[ name ], args ) === false ) {
-                                               break;
-                                       }
-                               }
-                       } else {
-                               for ( ; i < length; ) {
-                                       if ( callback.apply( obj[ i++ ], args ) === false ) {
-                                               break;
-                                       }
-                               }
-                       }
-
-               // A special, fast, case for the most common use of each
-               } else {
-                       if ( isObj ) {
-                               for ( name in obj ) {
-                                       if ( callback.call( obj[ name ], name, obj[ name ] ) === false ) {
-                                               break;
-                                       }
-                               }
-                       } else {
-                               for ( ; i < length; ) {
-                                       if ( callback.call( obj[ i ], i, obj[ i++ ] ) === false ) {
-                                               break;
-                                       }
-                               }
-                       }
-               }
-
-               return obj;
-       },
-
-       // Use native String.trim function wherever possible
-       trim: core_trim && !core_trim.call("\uFEFF\xA0") ?
-               function( text ) {
-                       return text == null ?
-                               "" :
-                               core_trim.call( text );
-               } :
-
-               // Otherwise use our own trimming functionality
-               function( text ) {
-                       return text == null ?
-                               "" :
-                               ( text + "" ).replace( rtrim, "" );
-               },
-
-       // results is for internal usage only
-       makeArray: function( arr, results ) {
-               var type,
-                       ret = results || [];
-
-               if ( arr != null ) {
-                       // The window, strings (and functions) also have 'length'
-                       // Tweaked logic slightly to handle Blackberry 4.7 RegExp issues #6930
-                       type = jQuery.type( arr );
-
-                       if ( arr.length == null || type === "string" || type === "function" || type === "regexp" || jQuery.isWindow( arr ) ) {
-                               core_push.call( ret, arr );
-                       } else {
-                               jQuery.merge( ret, arr );
-                       }
-               }
-
-               return ret;
-       },
-
-       inArray: function( elem, arr, i ) {
-               var len;
-
-               if ( arr ) {
-                       if ( core_indexOf ) {
-                               return core_indexOf.call( arr, elem, i );
-                       }
-
-                       len = arr.length;
-                       i = i ? i < 0 ? Math.max( 0, len + i ) : i : 0;
-
-                       for ( ; i < len; i++ ) {
-                               // Skip accessing in sparse arrays
-                               if ( i in arr && arr[ i ] === elem ) {
-                                       return i;
-                               }
-                       }
-               }
-
-               return -1;
-       },
-
-       merge: function( first, second ) {
-               var l = second.length,
-                       i = first.length,
-                       j = 0;
-
-               if ( typeof l === "number" ) {
-                       for ( ; j < l; j++ ) {
-                               first[ i++ ] = second[ j ];
-                       }
-
-               } else {
-                       while ( second[j] !== undefined ) {
-                               first[ i++ ] = second[ j++ ];
-                       }
-               }
-
-               first.length = i;
-
-               return first;
-       },
-
-       grep: function( elems, callback, inv ) {
-               var retVal,
-                       ret = [],
-                       i = 0,
-                       length = elems.length;
-               inv = !!inv;
-
-               // Go through the array, only saving the items
-               // that pass the validator function
-               for ( ; i < length; i++ ) {
-                       retVal = !!callback( elems[ i ], i );
-                       if ( inv !== retVal ) {
-                               ret.push( elems[ i ] );
-                       }
-               }
-
-               return ret;
-       },
-
-       // arg is for internal usage only
-       map: function( elems, callback, arg ) {
-               var value, key,
-                       ret = [],
-                       i = 0,
-                       length = elems.length,
-                       // jquery objects are treated as arrays
-                       isArray = elems instanceof jQuery || length !== undefined && typeof length === "number" && ( ( length > 0 && elems[ 0 ] && elems[ length -1 ] ) || length === 0 || jQuery.isArray( elems ) ) ;
-
-               // Go through the array, translating each of the items to their
-               if ( isArray ) {
-                       for ( ; i < length; i++ ) {
-                               value = callback( elems[ i ], i, arg );
-
-                               if ( value != null ) {
-                                       ret[ ret.length ] = value;
-                               }
-                       }
-
-               // Go through every key on the object,
-               } else {
-                       for ( key in elems ) {
-                               value = callback( elems[ key ], key, arg );
-
-                               if ( value != null ) {
-                                       ret[ ret.length ] = value;
-                               }
-                       }
-               }
-
-               // Flatten any nested arrays
-               return ret.concat.apply( [], ret );
-       },
-
-       // A global GUID counter for objects
-       guid: 1,
-
-       // Bind a function to a context, optionally partially applying any
-       // arguments.
-       proxy: function( fn, context ) {
-               var tmp, args, proxy;
-
-               if ( typeof context === "string" ) {
-                       tmp = fn[ context ];
-                       context = fn;
-                       fn = tmp;
-               }
-
-               // Quick check to determine if target is callable, in the spec
-               // this throws a TypeError, but we will just return undefined.
-               if ( !jQuery.isFunction( fn ) ) {
-                       return undefined;
-               }
-
-               // Simulated bind
-               args = core_slice.call( arguments, 2 );
-               proxy = function() {
-                       return fn.apply( context, args.concat( core_slice.call( arguments ) ) );
-               };
-
-               // Set the guid of unique handler to the same of original handler, so it can be removed
-               proxy.guid = fn.guid = fn.guid || jQuery.guid++;
-
-               return proxy;
-       },
-
-       // Multifunctional method to get and set values of a collection
-       // The value/s can optionally be executed if it's a function
-       access: function( elems, fn, key, value, chainable, emptyGet, pass ) {
-               var exec,
-                       bulk = key == null,
-                       i = 0,
-                       length = elems.length;
-
-               // Sets many values
-               if ( key && typeof key === "object" ) {
-                       for ( i in key ) {
-                               jQuery.access( elems, fn, i, key[i], 1, emptyGet, value );
-                       }
-                       chainable = 1;
-
-               // Sets one value
-               } else if ( value !== undefined ) {
-                       // Optionally, function values get executed if exec is true
-                       exec = pass === undefined && jQuery.isFunction( value );
-
-                       if ( bulk ) {
-                               // Bulk operations only iterate when executing function values
-                               if ( exec ) {
-                                       exec = fn;
-                                       fn = function( elem, key, value ) {
-                                               return exec.call( jQuery( elem ), value );
-                                       };
-
-                               // Otherwise they run against the entire set
-                               } else {
-                                       fn.call( elems, value );
-                                       fn = null;
-                               }
-                       }
-
-                       if ( fn ) {
-                               for (; i < length; i++ ) {
-                                       fn( elems[i], key, exec ? value.call( elems[i], i, fn( elems[i], key ) ) : value, pass );
-                               }
-                       }
-
-                       chainable = 1;
-               }
-
-               return chainable ?
-                       elems :
-
-                       // Gets
-                       bulk ?
-                               fn.call( elems ) :
-                               length ? fn( elems[0], key ) : emptyGet;
-       },
-
-       now: function() {
-               return ( new Date() ).getTime();
-       }
-});
-
-jQuery.ready.promise = function( obj ) {
-       if ( !readyList ) {
-
-               readyList = jQuery.Deferred();
-
-               // Catch cases where $(document).ready() is called after the browser event has already occurred.
-               // we once tried to use readyState "interactive" here, but it caused issues like the one
-               // discovered by ChrisS here: http://bugs.jquery.com/ticket/12282#comment:15
-               if ( document.readyState === "complete" ) {
-                       // Handle it asynchronously to allow scripts the opportunity to delay ready
-                       setTimeout( jQuery.ready, 1 );
-
-               // Standards-based browsers support DOMContentLoaded
-               } else if ( document.addEventListener ) {
-                       // Use the handy event callback
-                       document.addEventListener( "DOMContentLoaded", DOMContentLoaded, false );
-
-                       // A fallback to window.onload, that will always work
-                       window.addEventListener( "load", jQuery.ready, false );
-
-               // If IE event model is used
-               } else {
-                       // Ensure firing before onload, maybe late but safe also for iframes
-                       document.attachEvent( "onreadystatechange", DOMContentLoaded );
-
-                       // A fallback to window.onload, that will always work
-                       window.attachEvent( "onload", jQuery.ready );
-
-                       // If IE and not a frame
-                       // continually check to see if the document is ready
-                       var top = false;
-
-                       try {
-                               top = window.frameElement == null && document.documentElement;
-                       } catch(e) {}
-
-                       if ( top && top.doScroll ) {
-                               (function doScrollCheck() {
-                                       if ( !jQuery.isReady ) {
-
-                                               try {
-                                                       // Use the trick by Diego Perini
-                                                       // http://javascript.nwbox.com/IEContentLoaded/
-                                                       top.doScroll("left");
-                                               } catch(e) {
-                                                       return setTimeout( doScrollCheck, 50 );
-                                               }
-
-                                               // and execute any waiting functions
-                                               jQuery.ready();
-                                       }
-                               })();
-                       }
-               }
-       }
-       return readyList.promise( obj );
-};
-
-// Populate the class2type map
-jQuery.each("Boolean Number String Function Array Date RegExp Object".split(" "), function(i, name) {
-       class2type[ "[object " + name + "]" ] = name.toLowerCase();
-});
-
-// All jQuery objects should point back to these
-rootjQuery = jQuery(document);
-// String to Object options format cache
-var optionsCache = {};
-
-// Convert String-formatted options into Object-formatted ones and store in cache
-function createOptions( options ) {
-       var object = optionsCache[ options ] = {};
-       jQuery.each( options.split( core_rspace ), function( _, flag ) {
-               object[ flag ] = true;
-       });
-       return object;
-}
-
-/*
- * Create a callback list using the following parameters:
- *
- *     options: an optional list of space-separated options that will change how
- *                     the callback list behaves or a more traditional option object
- *
- * By default a callback list will act like an event callback list and can be
- * "fired" multiple times.
- *
- * Possible options:
- *
- *     once:                   will ensure the callback list can only be fired once (like a Deferred)
- *
- *     memory:                 will keep track of previous values and will call any callback added
- *                                     after the list has been fired right away with the latest "memorized"
- *                                     values (like a Deferred)
- *
- *     unique:                 will ensure a callback can only be added once (no duplicate in the list)
- *
- *     stopOnFalse:    interrupt callings when a callback returns false
- *
- */
-jQuery.Callbacks = function( options ) {
-
-       // Convert options from String-formatted to Object-formatted if needed
-       // (we check in cache first)
-       options = typeof options === "string" ?
-               ( optionsCache[ options ] || createOptions( options ) ) :
-               jQuery.extend( {}, options );
-
-       var // Last fire value (for non-forgettable lists)
-               memory,
-               // Flag to know if list was already fired
-               fired,
-               // Flag to know if list is currently firing
-               firing,
-               // First callback to fire (used internally by add and fireWith)
-               firingStart,
-               // End of the loop when firing
-               firingLength,
-               // Index of currently firing callback (modified by remove if needed)
-               firingIndex,
-               // Actual callback list
-               list = [],
-               // Stack of fire calls for repeatable lists
-               stack = !options.once && [],
-               // Fire callbacks
-               fire = function( data ) {
-                       memory = options.memory && data;
-                       fired = true;
-                       firingIndex = firingStart || 0;
-                       firingStart = 0;
-                       firingLength = list.length;
-                       firing = true;
-                       for ( ; list && firingIndex < firingLength; firingIndex++ ) {
-                               if ( list[ firingIndex ].apply( data[ 0 ], data[ 1 ] ) === false && options.stopOnFalse ) {
-                                       memory = false; // To prevent further calls using add
-                                       break;
-                               }
-                       }
-                       firing = false;
-                       if ( list ) {
-                               if ( stack ) {
-                                       if ( stack.length ) {
-                                               fire( stack.shift() );
-                                       }
-                               } else if ( memory ) {
-                                       list = [];
-                               } else {
-                                       self.disable();
-                               }
-                       }
-               },
-               // Actual Callbacks object
-               self = {
-                       // Add a callback or a collection of callbacks to the list
-                       add: function() {
-                               if ( list ) {
-                                       // First, we save the current length
-                                       var start = list.length;
-                                       (function add( args ) {
-                                               jQuery.each( args, function( _, arg ) {
-                                                       var type = jQuery.type( arg );
-                                                       if ( type === "function" ) {
-                                                               if ( !options.unique || !self.has( arg ) ) {
-                                                                       list.push( arg );
-                                                               }
-                                                       } else if ( arg && arg.length && type !== "string" ) {
-                                                               // Inspect recursively
-                                                               add( arg );
-                                                       }
-                                               });
-                                       })( arguments );
-                                       // Do we need to add the callbacks to the
-                                       // current firing batch?
-                                       if ( firing ) {
-                                               firingLength = list.length;
-                                       // With memory, if we're not firing then
-                                       // we should call right away
-                                       } else if ( memory ) {
-                                               firingStart = start;
-                                               fire( memory );
-                                       }
-                               }
-                               return this;
-                       },
-                       // Remove a callback from the list
-                       remove: function() {
-                               if ( list ) {
-                                       jQuery.each( arguments, function( _, arg ) {
-                                               var index;
-                                               while( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) {
-                                                       list.splice( index, 1 );
-                                                       // Handle firing indexes
-                                                       if ( firing ) {
-                                                               if ( index <= firingLength ) {
-                                                                       firingLength--;
-                                                               }
-                                                               if ( index <= firingIndex ) {
-                                                                       firingIndex--;
-                                                               }
-                                                       }
-                                               }
-                                       });
-                               }
-                               return this;
-                       },
-                       // Control if a given callback is in the list
-                       has: function( fn ) {
-                               return jQuery.inArray( fn, list ) > -1;
-                       },
-                       // Remove all callbacks from the list
-                       empty: function() {
-                               list = [];
-                               return this;
-                       },
-                       // Have the list do nothing anymore
-                       disable: function() {
-                               list = stack = memory = undefined;
-                               return this;
-                       },
-                       // Is it disabled?
-                       disabled: function() {
-                               return !list;
-                       },
-                       // Lock the list in its current state
-                       lock: function() {
-                               stack = undefined;
-                               if ( !memory ) {
-                                       self.disable();
-                               }
-                               return this;
-                       },
-                       // Is it locked?
-                       locked: function() {
-                               return !stack;
-                       },
-                       // Call all callbacks with the given context and arguments
-                       fireWith: function( context, args ) {
-                               args = args || [];
-                               args = [ context, args.slice ? args.slice() : args ];
-                               if ( list && ( !fired || stack ) ) {
-                                       if ( firing ) {
-                                               stack.push( args );
-                                       } else {
-                                               fire( args );
-                                       }
-                               }
-                               return this;
-                       },
-                       // Call all the callbacks with the given arguments
-                       fire: function() {
-                               self.fireWith( this, arguments );
-                               return this;
-                       },
-                       // To know if the callbacks have already been called at least once
-                       fired: function() {
-                               return !!fired;
-                       }
-               };
-
-       return self;
-};
-jQuery.extend({
-
-       Deferred: function( func ) {
-               var tuples = [
-                               // action, add listener, listener list, final state
-                               [ "resolve", "done", jQuery.Callbacks("once memory"), "resolved" ],
-                               [ "reject", "fail", jQuery.Callbacks("once memory"), "rejected" ],
-                               [ "notify", "progress", jQuery.Callbacks("memory") ]
-                       ],
-                       state = "pending",
-                       promise = {
-                               state: function() {
-                                       return state;
-                               },
-                               always: function() {
-                                       deferred.done( arguments ).fail( arguments );
-                                       return this;
-                               },
-                               then: function( /* fnDone, fnFail, fnProgress */ ) {
-                                       var fns = arguments;
-                                       return jQuery.Deferred(function( newDefer ) {
-                                               jQuery.each( tuples, function( i, tuple ) {
-                                                       var action = tuple[ 0 ],
-                                                               fn = fns[ i ];
-                                                       // deferred[ done | fail | progress ] for forwarding actions to newDefer
-                                                       deferred[ tuple[1] ]( jQuery.isFunction( fn ) ?
-                                                               function() {
-                                                                       var returned = fn.apply( this, arguments );
-                                                                       if ( returned && jQuery.isFunction( returned.promise ) ) {
-                                                                               returned.promise()
-                                                                                       .done( newDefer.resolve )
-                                                                                       .fail( newDefer.reject )
-                                                                                       .progress( newDefer.notify );
-                                                                       } else {
-                                                                               newDefer[ action + "With" ]( this === deferred ? newDefer : this, [ returned ] );
-                                                                       }
-                                                               } :
-                                                               newDefer[ action ]
-                                                       );
-                                               });
-                                               fns = null;
-                                       }).promise();
-                               },
-                               // Get a promise for this deferred
-                               // If obj is provided, the promise aspect is added to the object
-                               promise: function( obj ) {
-                                       return obj != null ? jQuery.extend( obj, promise ) : promise;
-                               }
-                       },
-                       deferred = {};
-
-               // Keep pipe for back-compat
-               promise.pipe = promise.then;
-
-               // Add list-specific methods
-               jQuery.each( tuples, function( i, tuple ) {
-                       var list = tuple[ 2 ],
-                               stateString = tuple[ 3 ];
-
-                       // promise[ done | fail | progress ] = list.add
-                       promise[ tuple[1] ] = list.add;
-
-                       // Handle state
-                       if ( stateString ) {
-                               list.add(function() {
-                                       // state = [ resolved | rejected ]
-                                       state = stateString;
-
-                               // [ reject_list | resolve_list ].disable; progress_list.lock
-                               }, tuples[ i ^ 1 ][ 2 ].disable, tuples[ 2 ][ 2 ].lock );
-                       }
-
-                       // deferred[ resolve | reject | notify ] = list.fire
-                       deferred[ tuple[0] ] = list.fire;
-                       deferred[ tuple[0] + "With" ] = list.fireWith;
-               });
-
-               // Make the deferred a promise
-               promise.promise( deferred );
-
-               // Call given func if any
-               if ( func ) {
-                       func.call( deferred, deferred );
-               }
-
-               // All done!
-               return deferred;
-       },
-
-       // Deferred helper
-       when: function( subordinate /* , ..., subordinateN */ ) {
-               var i = 0,
-                       resolveValues = core_slice.call( arguments ),
-                       length = resolveValues.length,
-
-                       // the count of uncompleted subordinates
-                       remaining = length !== 1 || ( subordinate && jQuery.isFunction( subordinate.promise ) ) ? length : 0,
-
-                       // the master Deferred. If resolveValues consist of only a single Deferred, just use that.
-                       deferred = remaining === 1 ? subordinate : jQuery.Deferred(),
-
-                       // Update function for both resolve and progress values
-                       updateFunc = function( i, contexts, values ) {
-                               return function( value ) {
-                                       contexts[ i ] = this;
-                                       values[ i ] = arguments.length > 1 ? core_slice.call( arguments ) : value;
-                                       if( values === progressValues ) {
-                                               deferred.notifyWith( contexts, values );
-                                       } else if ( !( --remaining ) ) {
-                                               deferred.resolveWith( contexts, values );
-                                       }
-                               };
-                       },
-
-                       progressValues, progressContexts, resolveContexts;
-
-               // add listeners to Deferred subordinates; treat others as resolved
-               if ( length > 1 ) {
-                       progressValues = new Array( length );
-                       progressContexts = new Array( length );
-                       resolveContexts = new Array( length );
-                       for ( ; i < length; i++ ) {
-                               if ( resolveValues[ i ] && jQuery.isFunction( resolveValues[ i ].promise ) ) {
-                                       resolveValues[ i ].promise()
-                                               .done( updateFunc( i, resolveContexts, resolveValues ) )
-                                               .fail( deferred.reject )
-                                               .progress( updateFunc( i, progressContexts, progressValues ) );
-                               } else {
-                                       --remaining;
-                               }
-                       }
-               }
-
-               // if we're not waiting on anything, resolve the master
-               if ( !remaining ) {
-                       deferred.resolveWith( resolveContexts, resolveValues );
-               }
-
-               return deferred.promise();
-       }
-});
-jQuery.support = (function() {
-
-       var support,
-               all,
-               a,
-               select,
-               opt,
-               input,
-               fragment,
-               eventName,
-               i,
-               isSupported,
-               clickFn,
-               div = document.createElement("div");
-
-       // Setup
-       div.setAttribute( "className", "t" );
-       div.innerHTML = "  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>";
-
-       // Support tests won't run in some limited or non-browser environments
-       all = div.getElementsByTagName("*");
-       a = div.getElementsByTagName("a")[ 0 ];
-       if ( !all || !a || !all.length ) {
-               return {};
-       }
-
-       // First batch of tests
-       select = document.createElement("select");
-       opt = select.appendChild( document.createElement("option") );
-       input = div.getElementsByTagName("input")[ 0 ];
-
-       a.style.cssText = "top:1px;float:left;opacity:.5";
-       support = {
-               // IE strips leading whitespace when .innerHTML is used
-               leadingWhitespace: ( div.firstChild.nodeType === 3 ),
-
-               // Make sure that tbody elements aren't automatically inserted
-               // IE will insert them into empty tables
-               tbody: !div.getElementsByTagName("tbody").length,
-
-               // Make sure that link elements get serialized correctly by innerHTML
-               // This requires a wrapper element in IE
-               htmlSerialize: !!div.getElementsByTagName("link").length,
-
-               // Get the style information from getAttribute
-               // (IE uses .cssText instead)
-               style: /top/.test( a.getAttribute("style") ),
-
-               // Make sure that URLs aren't manipulated
-               // (IE normalizes it by default)
-               hrefNormalized: ( a.getAttribute("href") === "/a" ),
-
-               // Make sure that element opacity exists
-               // (IE uses filter instead)
-               // Use a regex to work around a WebKit issue. See #5145
-               opacity: /^0.5/.test( a.style.opacity ),
-
-               // Verify style float existence
-               // (IE uses styleFloat instead of cssFloat)
-               cssFloat: !!a.style.cssFloat,
-
-               // Make sure that if no value is specified for a checkbox
-               // that it defaults to "on".
-               // (WebKit defaults to "" instead)
-               checkOn: ( input.value === "on" ),
-
-               // Make sure that a selected-by-default option has a working selected property.
-               // (WebKit defaults to false instead of true, IE too, if it's in an optgroup)
-               optSelected: opt.selected,
-
-               // Test setAttribute on camelCase class. If it works, we need attrFixes when doing get/setAttribute (ie6/7)
-               getSetAttribute: div.className !== "t",
-
-               // Tests for enctype support on a form (#6743)
-               enctype: !!document.createElement("form").enctype,
-
-               // Makes sure cloning an html5 element does not cause problems
-               // Where outerHTML is undefined, this still works
-               html5Clone: document.createElement("nav").cloneNode( true ).outerHTML !== "<:nav></:nav>",
-
-               // jQuery.support.boxModel DEPRECATED in 1.8 since we don't support Quirks Mode
-               boxModel: ( document.compatMode === "CSS1Compat" ),
-
-               // Will be defined later
-               submitBubbles: true,
-               changeBubbles: true,
-               focusinBubbles: false,
-               deleteExpando: true,
-               noCloneEvent: true,
-               inlineBlockNeedsLayout: false,
-               shrinkWrapBlocks: false,
-               reliableMarginRight: true,
-               boxSizingReliable: true,
-               pixelPosition: false
-       };
-
-       // Make sure checked status is properly cloned
-       input.checked = true;
-       support.noCloneChecked = input.cloneNode( true ).checked;
-
-       // Make sure that the options inside disabled selects aren't marked as disabled
-       // (WebKit marks them as disabled)
-       select.disabled = true;
-       support.optDisabled = !opt.disabled;
-
-       // Test to see if it's possible to delete an expando from an element
-       // Fails in Internet Explorer
-       try {
-               delete div.test;
-       } catch( e ) {
-               support.deleteExpando = false;
-       }
-
-       if ( !div.addEventListener && div.attachEvent && div.fireEvent ) {
-               div.attachEvent( "onclick", clickFn = function() {
-                       // Cloning a node shouldn't copy over any
-                       // bound event handlers (IE does this)
-                       support.noCloneEvent = false;
-               });
-               div.cloneNode( true ).fireEvent("onclick");
-               div.detachEvent( "onclick", clickFn );
-       }
-
-       // Check if a radio maintains its value
-       // after being appended to the DOM
-       input = document.createElement("input");
-       input.value = "t";
-       input.setAttribute( "type", "radio" );
-       support.radioValue = input.value === "t";
-
-       input.setAttribute( "checked", "checked" );
-
-       // #11217 - WebKit loses check when the name is after the checked attribute
-       input.setAttribute( "name", "t" );
-
-       div.appendChild( input );
-       fragment = document.createDocumentFragment();
-       fragment.appendChild( div.lastChild );
-
-       // WebKit doesn't clone checked state correctly in fragments
-       support.checkClone = fragment.cloneNode( true ).cloneNode( true ).lastChild.checked;
-
-       // Check if a disconnected checkbox will retain its checked
-       // value of true after appended to the DOM (IE6/7)
-       support.appendChecked = input.checked;
-
-       fragment.removeChild( input );
-       fragment.appendChild( div );
-
-       // Technique from Juriy Zaytsev
-       // http://perfectionkills.com/detecting-event-support-without-browser-sniffing/
-       // We only care about the case where non-standard event systems
-       // are used, namely in IE. Short-circuiting here helps us to
-       // avoid an eval call (in setAttribute) which can cause CSP
-       // to go haywire. See: https://developer.mozilla.org/en/Security/CSP
-       if ( div.attachEvent ) {
-               for ( i in {
-                       submit: true,
-                       change: true,
-                       focusin: true
-               }) {
-                       eventName = "on" + i;
-                       isSupported = ( eventName in div );
-                       if ( !isSupported ) {
-                               div.setAttribute( eventName, "return;" );
-                               isSupported = ( typeof div[ eventName ] === "function" );
-                       }
-                       support[ i + "Bubbles" ] = isSupported;
-               }
-       }
-
-       // Run tests that need a body at doc ready
-       jQuery(function() {
-               var container, div, tds, marginDiv,
-                       divReset = "padding:0;margin:0;border:0;display:block;overflow:hidden;",
-                       body = document.getElementsByTagName("body")[0];
-
-               if ( !body ) {
-                       // Return for frameset docs that don't have a body
-                       return;
-               }
-
-               container = document.createElement("div");
-               container.style.cssText = "visibility:hidden;border:0;width:0;height:0;position:static;top:0;margin-top:1px";
-               body.insertBefore( container, body.firstChild );
-
-               // Construct the test element
-               div = document.createElement("div");
-               container.appendChild( div );
-
-               // Check if table cells still have offsetWidth/Height when they are set
-               // to display:none and there are still other visible table cells in a
-               // table row; if so, offsetWidth/Height are not reliable for use when
-               // determining if an element has been hidden directly using
-               // display:none (it is still safe to use offsets if a parent element is
-               // hidden; don safety goggles and see bug #4512 for more information).
-               // (only IE 8 fails this test)
-               div.innerHTML = "<table><tr><td></td><td>t</td></tr></table>";
-               tds = div.getElementsByTagName("td");
-               tds[ 0 ].style.cssText = "padding:0;margin:0;border:0;display:none";
-               isSupported = ( tds[ 0 ].offsetHeight === 0 );
-
-               tds[ 0 ].style.display = "";
-               tds[ 1 ].style.display = "none";
-
-               // Check if empty table cells still have offsetWidth/Height
-               // (IE <= 8 fail this test)
-               support.reliableHiddenOffsets = isSupported && ( tds[ 0 ].offsetHeight === 0 );
-
-               // Check box-sizing and margin behavior
-               div.innerHTML = "";
-               div.style.cssText = "box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;";
-               support.boxSizing = ( div.offsetWidth === 4 );
-               support.doesNotIncludeMarginInBodyOffset = ( body.offsetTop !== 1 );
-
-               // NOTE: To any future maintainer, we've window.getComputedStyle
-               // because jsdom on node.js will break without it.
-               if ( window.getComputedStyle ) {
-                       support.pixelPosition = ( window.getComputedStyle( div, null ) || {} ).top !== "1%";
-                       support.boxSizingReliable = ( window.getComputedStyle( div, null ) || { width: "4px" } ).width === "4px";
-
-                       // Check if div with explicit width and no margin-right incorrectly
-                       // gets computed margin-right based on width of container. For more
-                       // info see bug #3333
-                       // Fails in WebKit before Feb 2011 nightlies
-                       // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
-                       marginDiv = document.createElement("div");
-                       marginDiv.style.cssText = div.style.cssText = divReset;
-                       marginDiv.style.marginRight = marginDiv.style.width = "0";
-                       div.style.width = "1px";
-                       div.appendChild( marginDiv );
-                       support.reliableMarginRight =
-                               !parseFloat( ( window.getComputedStyle( marginDiv, null ) || {} ).marginRight );
-               }
-
-               if ( typeof div.style.zoom !== "undefined" ) {
-                       // Check if natively block-level elements act like inline-block
-                       // elements when setting their display to 'inline' and giving
-                       // them layout
-                       // (IE < 8 does this)
-                       div.innerHTML = "";
-                       div.style.cssText = divReset + "width:1px;padding:1px;display:inline;zoom:1";
-                       support.inlineBlockNeedsLayout = ( div.offsetWidth === 3 );
-
-                       // Check if elements with layout shrink-wrap their children
-                       // (IE 6 does this)
-                       div.style.display = "block";
-                       div.style.overflow = "visible";
-                       div.innerHTML = "<div></div>";
-                       div.firstChild.style.width = "5px";
-                       support.shrinkWrapBlocks = ( div.offsetWidth !== 3 );
-
-                       container.style.zoom = 1;
-               }
-
-               // Null elements to avoid leaks in IE
-               body.removeChild( container );
-               container = div = tds = marginDiv = null;
-       });
-
-       // Null elements to avoid leaks in IE
-       fragment.removeChild( div );
-       all = a = select = opt = input = fragment = div = null;
-
-       return support;
-})();
-var rbrace = /(?:\{[\s\S]*\}|\[[\s\S]*\])$/,
-       rmultiDash = /([A-Z])/g;
-
-jQuery.extend({
-       cache: {},
-
-       deletedIds: [],
-
-       // Remove at next major release (1.9/2.0)
-       uuid: 0,
-
-       // Unique for each copy of jQuery on the page
-       // Non-digits removed to match rinlinejQuery
-       expando: "jQuery" + ( jQuery.fn.jquery + Math.random() ).replace( /\D/g, "" ),
-
-       // The following elements throw uncatchable exceptions if you
-       // attempt to add expando properties to them.
-       noData: {
-               "embed": true,
-               // Ban all objects except for Flash (which handle expandos)
-               "object": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",
-               "applet": true
-       },
-
-       hasData: function( elem ) {
-               elem = elem.nodeType ? jQuery.cache[ elem[jQuery.expando] ] : elem[ jQuery.expando ];
-               return !!elem && !isEmptyDataObject( elem );
-       },
-
-       data: function( elem, name, data, pvt /* Internal Use Only */ ) {
-               if ( !jQuery.acceptData( elem ) ) {
-                       return;
-               }
-
-               var thisCache, ret,
-                       internalKey = jQuery.expando,
-                       getByName = typeof name === "string",
-
-                       // We have to handle DOM nodes and JS objects differently because IE6-7
-                       // can't GC object references properly across the DOM-JS boundary
-                       isNode = elem.nodeType,
-
-                       // Only DOM nodes need the global jQuery cache; JS object data is
-                       // attached directly to the object so GC can occur automatically
-                       cache = isNode ? jQuery.cache : elem,
-
-                       // Only defining an ID for JS objects if its cache already exists allows
-                       // the code to shortcut on the same path as a DOM node with no cache
-                       id = isNode ? elem[ internalKey ] : elem[ internalKey ] && internalKey;
-
-               // Avoid doing any more work than we need to when trying to get data on an
-               // object that has no data at all
-               if ( (!id || !cache[id] || (!pvt && !cache[id].data)) && getByName && data === undefined ) {
-                       return;
-               }
-
-               if ( !id ) {
-                       // Only DOM nodes need a new unique ID for each element since their data
-                       // ends up in the global cache
-                       if ( isNode ) {
-                               elem[ internalKey ] = id = jQuery.deletedIds.pop() || jQuery.guid++;
-                       } else {
-                               id = internalKey;
-                       }
-               }
-
-               if ( !cache[ id ] ) {
-                       cache[ id ] = {};
-
-                       // Avoids exposing jQuery metadata on plain JS objects when the object
-                       // is serialized using JSON.stringify
-                       if ( !isNode ) {
-                               cache[ id ].toJSON = jQuery.noop;
-                       }
-               }
-
-               // An object can be passed to jQuery.data instead of a key/value pair; this gets
-               // shallow copied over onto the existing cache
-               if ( typeof name === "object" || typeof name === "function" ) {
-                       if ( pvt ) {
-                               cache[ id ] = jQuery.extend( cache[ id ], name );
-                       } else {
-                               cache[ id ].data = jQuery.extend( cache[ id ].data, name );
-                       }
-               }
-
-               thisCache = cache[ id ];
-
-               // jQuery data() is stored in a separate object inside the object's internal data
-               // cache in order to avoid key collisions between internal data and user-defined
-               // data.
-               if ( !pvt ) {
-                       if ( !thisCache.data ) {
-                               thisCache.data = {};
-                       }
-
-                       thisCache = thisCache.data;
-               }
-
-               if ( data !== undefined ) {
-                       thisCache[ jQuery.camelCase( name ) ] = data;
-               }
-
-               // Check for both converted-to-camel and non-converted data property names
-               // If a data property was specified
-               if ( getByName ) {
-
-                       // First Try to find as-is property data
-                       ret = thisCache[ name ];
-
-                       // Test for null|undefined property data
-                       if ( ret == null ) {
-
-                               // Try to find the camelCased property
-                               ret = thisCache[ jQuery.camelCase( name ) ];
-                       }
-               } else {
-                       ret = thisCache;
-               }
-
-               return ret;
-       },
-
-       removeData: function( elem, name, pvt /* Internal Use Only */ ) {
-               if ( !jQuery.acceptData( elem ) ) {
-                       return;
-               }
-
-               var thisCache, i, l,
-
-                       isNode = elem.nodeType,
-
-                       // See jQuery.data for more information
-                       cache = isNode ? jQuery.cache : elem,
-                       id = isNode ? elem[ jQuery.expando ] : jQuery.expando;
-
-               // If there is already no cache entry for this object, there is no
-               // purpose in continuing
-               if ( !cache[ id ] ) {
-                       return;
-               }
-
-               if ( name ) {
-
-                       thisCache = pvt ? cache[ id ] : cache[ id ].data;
-
-                       if ( thisCache ) {
-
-                               // Support array or space separated string names for data keys
-                               if ( !jQuery.isArray( name ) ) {
-
-                                       // try the string as a key before any manipulation
-                                       if ( name in thisCache ) {
-                                               name = [ name ];
-                                       } else {
-
-                                               // split the camel cased version by spaces unless a key with the spaces exists
-                                               name = jQuery.camelCase( name );
-                                               if ( name in thisCache ) {
-                                                       name = [ name ];
-                                               } else {
-                                                       name = name.split(" ");
-                                               }
-                                       }
-                               }
-
-                               for ( i = 0, l = name.length; i < l; i++ ) {
-                                       delete thisCache[ name[i] ];
-                               }
-
-                               // If there is no data left in the cache, we want to continue
-                               // and let the cache object itself get destroyed
-                               if ( !( pvt ? isEmptyDataObject : jQuery.isEmptyObject )( thisCache ) ) {
-                                       return;
-                               }
-                       }
-               }
-
-               // See jQuery.data for more information
-               if ( !pvt ) {
-                       delete cache[ id ].data;
-
-                       // Don't destroy the parent cache unless the internal data object
-                       // had been the only thing left in it
-                       if ( !isEmptyDataObject( cache[ id ] ) ) {
-                               return;
-                       }
-               }
-
-               // Destroy the cache
-               if ( isNode ) {
-                       jQuery.cleanData( [ elem ], true );
-
-               // Use delete when supported for expandos or `cache` is not a window per isWindow (#10080)
-               } else if ( jQuery.support.deleteExpando || cache != cache.window ) {
-                       delete cache[ id ];
-
-               // When all else fails, null
-               } else {
-                       cache[ id ] = null;
-               }
-       },
-
-       // For internal use only.
-       _data: function( elem, name, data ) {
-               return jQuery.data( elem, name, data, true );
-       },
-
-       // A method for determining if a DOM node can handle the data expando
-       acceptData: function( elem ) {
-               var noData = elem.nodeName && jQuery.noData[ elem.nodeName.toLowerCase() ];
-
-               // nodes accept data unless otherwise specified; rejection can be conditional
-               return !noData || noData !== true && elem.getAttribute("classid") === noData;
-       }
-});
-
-jQuery.fn.extend({
-       data: function( key, value ) {
-               var parts, part, attr, name, l,
-                       elem = this[0],
-                       i = 0,
-                       data = null;
-
-               // Gets all values
-               if ( key === undefined ) {
-                       if ( this.length ) {
-                               data = jQuery.data( elem );
-
-                               if ( elem.nodeType === 1 && !jQuery._data( elem, "parsedAttrs" ) ) {
-                                       attr = elem.attributes;
-                                       for ( l = attr.length; i < l; i++ ) {
-                                               name = attr[i].name;
-
-                                               if ( !name.indexOf( "data-" ) ) {
-                                                       name = jQuery.camelCase( name.substring(5) );
-
-                                                       dataAttr( elem, name, data[ name ] );
-                                               }
-                                       }
-                                       jQuery._data( elem, "parsedAttrs", true );
-                               }
-                       }
-
-                       return data;
-               }
-
-               // Sets multiple values
-               if ( typeof key === "object" ) {
-                       return this.each(function() {
-                               jQuery.data( this, key );
-                       });
-               }
-
-               parts = key.split( ".", 2 );
-               parts[1] = parts[1] ? "." + parts[1] : "";
-               part = parts[1] + "!";
-
-               return jQuery.access( this, function( value ) {
-
-                       if ( value === undefined ) {
-                               data = this.triggerHandler( "getData" + part, [ parts[0] ] );
-
-                               // Try to fetch any internally stored data first
-                               if ( data === undefined && elem ) {
-                                       data = jQuery.data( elem, key );
-                                       data = dataAttr( elem, key, data );
-                               }
-
-                               return data === undefined && parts[1] ?
-                                       this.data( parts[0] ) :
-                                       data;
-                       }
-
-                       parts[1] = value;
-                       this.each(function() {
-                               var self = jQuery( this );
-
-                               self.triggerHandler( "setData" + part, parts );
-                               jQuery.data( this, key, value );
-                               self.triggerHandler( "changeData" + part, parts );
-                       });
-               }, null, value, arguments.length > 1, null, false );
-       },
-
-       removeData: function( key ) {
-               return this.each(function() {
-                       jQuery.removeData( this, key );
-               });
-       }
-});
-
-function dataAttr( elem, key, data ) {
-       // If nothing was found internally, try to fetch any
-       // data from the HTML5 data-* attribute
-       if ( data === undefined && elem.nodeType === 1 ) {
-
-               var name = "data-" + key.replace( rmultiDash, "-$1" ).toLowerCase();
-
-               data = elem.getAttribute( name );
-
-               if ( typeof data === "string" ) {
-                       try {
-                               data = data === "true" ? true :
-                               data === "false" ? false :
-                               data === "null" ? null :
-                               // Only convert to a number if it doesn't change the string
-                               +data + "" === data ? +data :
-                               rbrace.test( data ) ? jQuery.parseJSON( data ) :
-                                       data;
-                       } catch( e ) {}
-
-                       // Make sure we set the data so it isn't changed later
-                       jQuery.data( elem, key, data );
-
-               } else {
-                       data = undefined;
-               }
-       }
-
-       return data;
-}
-
-// checks a cache object for emptiness
-function isEmptyDataObject( obj ) {
-       var name;
-       for ( name in obj ) {
-
-               // if the public data object is empty, the private is still empty
-               if ( name === "data" && jQuery.isEmptyObject( obj[name] ) ) {
-                       continue;
-               }
-               if ( name !== "toJSON" ) {
-                       return false;
-               }
-       }
-
-       return true;
-}
-jQuery.extend({
-       queue: function( elem, type, data ) {
-               var queue;
-
-               if ( elem ) {
-                       type = ( type || "fx" ) + "queue";
-                       queue = jQuery._data( elem, type );
-
-                       // Speed up dequeue by getting out quickly if this is just a lookup
-                       if ( data ) {
-                               if ( !queue || jQuery.isArray(data) ) {
-                                       queue = jQuery._data( elem, type, jQuery.makeArray(data) );
-                               } else {
-                                       queue.push( data );
-                               }
-                       }
-                       return queue || [];
-               }
-       },
-
-       dequeue: function( elem, type ) {
-               type = type || "fx";
-
-               var queue = jQuery.queue( elem, type ),
-                       startLength = queue.length,
-                       fn = queue.shift(),
-                       hooks = jQuery._queueHooks( elem, type ),
-                       next = function() {
-                               jQuery.dequeue( elem, type );
-                       };
-
-               // If the fx queue is dequeued, always remove the progress sentinel
-               if ( fn === "inprogress" ) {
-                       fn = queue.shift();
-                       startLength--;
-               }
-
-               if ( fn ) {
-
-                       // Add a progress sentinel to prevent the fx queue from being
-                       // automatically dequeued
-                       if ( type === "fx" ) {
-                               queue.unshift( "inprogress" );
-                       }
-
-                       // clear up the last queue stop function
-                       delete hooks.stop;
-                       fn.call( elem, next, hooks );
-               }
-
-               if ( !startLength && hooks ) {
-                       hooks.empty.fire();
-               }
-       },
-
-       // not intended for public consumption - generates a queueHooks object, or returns the current one
-       _queueHooks: function( elem, type ) {
-               var key = type + "queueHooks";
-               return jQuery._data( elem, key ) || jQuery._data( elem, key, {
-                       empty: jQuery.Callbacks("once memory").add(function() {
-                               jQuery.removeData( elem, type + "queue", true );
-                               jQuery.removeData( elem, key, true );
-                       })
-               });
-       }
-});
-
-jQuery.fn.extend({
-       queue: function( type, data ) {
-               var setter = 2;
-
-               if ( typeof type !== "string" ) {
-                       data = type;
-                       type = "fx";
-                       setter--;
-               }
-
-               if ( arguments.length < setter ) {
-                       return jQuery.queue( this[0], type );
-               }
-
-               return data === undefined ?
-                       this :
-                       this.each(function() {
-                               var queue = jQuery.queue( this, type, data );
-
-                               // ensure a hooks for this queue
-                               jQuery._queueHooks( this, type );
-
-                               if ( type === "fx" && queue[0] !== "inprogress" ) {
-                                       jQuery.dequeue( this, type );
-                               }
-                       });
-       },
-       dequeue: function( type ) {
-               return this.each(function() {
-                       jQuery.dequeue( this, type );
-               });
-       },
-       // Based off of the plugin by Clint Helfers, with permission.
-       // http://blindsignals.com/index.php/2009/07/jquery-delay/
-       delay: function( time, type ) {
-               time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;
-               type = type || "fx";
-
-               return this.queue( type, function( next, hooks ) {
-                       var timeout = setTimeout( next, time );
-                       hooks.stop = function() {
-                               clearTimeout( timeout );
-                       };
-               });
-       },
-       clearQueue: function( type ) {
-               return this.queue( type || "fx", [] );
-       },
-       // Get a promise resolved when queues of a certain type
-       // are emptied (fx is the type by default)
-       promise: function( type, obj ) {
-               var tmp,
-                       count = 1,
-                       defer = jQuery.Deferred(),
-                       elements = this,
-                       i = this.length,
-                       resolve = function() {
-                               if ( !( --count ) ) {
-                                       defer.resolveWith( elements, [ elements ] );
-                               }
-                       };
-
-               if ( typeof type !== "string" ) {
-                       obj = type;
-                       type = undefined;
-               }
-               type = type || "fx";
-
-               while( i-- ) {
-                       tmp = jQuery._data( elements[ i ], type + "queueHooks" );
-                       if ( tmp && tmp.empty ) {
-                               count++;
-                               tmp.empty.add( resolve );
-                       }
-               }
-               resolve();
-               return defer.promise( obj );
-       }
-});
-var nodeHook, boolHook, fixSpecified,
-       rclass = /[\t\r\n]/g,
-       rreturn = /\r/g,
-       rtype = /^(?:button|input)$/i,
-       rfocusable = /^(?:button|input|object|select|textarea)$/i,
-       rclickable = /^a(?:rea|)$/i,
-       rboolean = /^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,
-       getSetAttribute = jQuery.support.getSetAttribute;
-
-jQuery.fn.extend({
-       attr: function( name, value ) {
-               return jQuery.access( this, jQuery.attr, name, value, arguments.length > 1 );
-       },
-
-       removeAttr: function( name ) {
-               return this.each(function() {
-                       jQuery.removeAttr( this, name );
-               });
-       },
-
-       prop: function( name, value ) {
-               return jQuery.access( this, jQuery.prop, name, value, arguments.length > 1 );
-       },
-
-       removeProp: function( name ) {
-               name = jQuery.propFix[ name ] || name;
-               return this.each(function() {
-                       // try/catch handles cases where IE balks (such as removing a property on window)
-                       try {
-                               this[ name ] = undefined;
-                               delete this[ name ];
-                       } catch( e ) {}
-               });
-       },
-
-       addClass: function( value ) {
-               var classNames, i, l, elem,
-                       setClass, c, cl;
-
-               if ( jQuery.isFunction( value ) ) {
-                       return this.each(function( j ) {
-                               jQuery( this ).addClass( value.call(this, j, this.className) );
-                       });
-               }
-
-               if ( value && typeof value === "string" ) {
-                       classNames = value.split( core_rspace );
-
-                       for ( i = 0, l = this.length; i < l; i++ ) {
-                               elem = this[ i ];
-
-                               if ( elem.nodeType === 1 ) {
-                                       if ( !elem.className && classNames.length === 1 ) {
-                                               elem.className = value;
-
-                                       } else {
-                                               setClass = " " + elem.className + " ";
-
-                                               for ( c = 0, cl = classNames.length; c < cl; c++ ) {
-                                                       if ( setClass.indexOf( " " + classNames[ c ] + " " ) < 0 ) {
-                                                               setClass += classNames[ c ] + " ";
-                                                       }
-                                               }
-                                               elem.className = jQuery.trim( setClass );
-                                       }
-                               }
-                       }
-               }
-
-               return this;
-       },
-
-       removeClass: function( value ) {
-               var removes, className, elem, c, cl, i, l;
-
-               if ( jQuery.isFunction( value ) ) {
-                       return this.each(function( j ) {
-                               jQuery( this ).removeClass( value.call(this, j, this.className) );
-                       });
-               }
-               if ( (value && typeof value === "string") || value === undefined ) {
-                       removes = ( value || "" ).split( core_rspace );
-
-                       for ( i = 0, l = this.length; i < l; i++ ) {
-                               elem = this[ i ];
-                               if ( elem.nodeType === 1 && elem.className ) {
-
-                                       className = (" " + elem.className + " ").replace( rclass, " " );
-
-                                       // loop over each item in the removal list
-                                       for ( c = 0, cl = removes.length; c < cl; c++ ) {
-                                               // Remove until there is nothing to remove,
-                                               while ( className.indexOf(" " + removes[ c ] + " ") >= 0 ) {
-                                                       className = className.replace( " " + removes[ c ] + " " , " " );
-                                               }
-                                       }
-                                       elem.className = value ? jQuery.trim( className ) : "";
-                               }
-                       }
-               }
-
-               return this;
-       },
-
-       toggleClass: function( value, stateVal ) {
-               var type = typeof value,
-                       isBool = typeof stateVal === "boolean";
-
-               if ( jQuery.isFunction( value ) ) {
-                       return this.each(function( i ) {
-                               jQuery( this ).toggleClass( value.call(this, i, this.className, stateVal), stateVal );
-                       });
-               }
-
-               return this.each(function() {
-                       if ( type === "string" ) {
-                               // toggle individual class names
-                               var className,
-                                       i = 0,
-                                       self = jQuery( this ),
-                                       state = stateVal,
-                                       classNames = value.split( core_rspace );
-
-                               while ( (className = classNames[ i++ ]) ) {
-                                       // check each className given, space separated list
-                                       state = isBool ? state : !self.hasClass( className );
-                                       self[ state ? "addClass" : "removeClass" ]( className );
-                               }
-
-                       } else if ( type === "undefined" || type === "boolean" ) {
-                               if ( this.className ) {
-                                       // store className if set
-                                       jQuery._data( this, "__className__", this.className );
-                               }
-
-                               // toggle whole className
-                               this.className = this.className || value === false ? "" : jQuery._data( this, "__className__" ) || "";
-                       }
-               });
-       },
-
-       hasClass: function( selector ) {
-               var className = " " + selector + " ",
-                       i = 0,
-                       l = this.length;
-               for ( ; i < l; i++ ) {
-                       if ( this[i].nodeType === 1 && (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) >= 0 ) {
-                               return true;
-                       }
-               }
-
-               return false;
-       },
-
-       val: function( value ) {
-               var hooks, ret, isFunction,
-                       elem = this[0];
-
-               if ( !arguments.length ) {
-                       if ( elem ) {
-                               hooks = jQuery.valHooks[ elem.type ] || jQuery.valHooks[ elem.nodeName.toLowerCase() ];
-
-                               if ( hooks && "get" in hooks && (ret = hooks.get( elem, "value" )) !== undefined ) {
-                                       return ret;
-                               }
-
-                               ret = elem.value;
-
-                               return typeof ret === "string" ?
-                                       // handle most common string cases
-                                       ret.replace(rreturn, "") :
-                                       // handle cases where value is null/undef or number
-                                       ret == null ? "" : ret;
-                       }
-
-                       return;
-               }
-
-               isFunction = jQuery.isFunction( value );
-
-               return this.each(function( i ) {
-                       var val,
-                               self = jQuery(this);
-
-                       if ( this.nodeType !== 1 ) {
-                               return;
-                       }
-
-                       if ( isFunction ) {
-                               val = value.call( this, i, self.val() );
-                       } else {
-                               val = value;
-                       }
-
-                       // Treat null/undefined as ""; convert numbers to string
-                       if ( val == null ) {
-                               val = "";
-                       } else if ( typeof val === "number" ) {
-                               val += "";
-                       } else if ( jQuery.isArray( val ) ) {
-                               val = jQuery.map(val, function ( value ) {
-                                       return value == null ? "" : value + "";
-                               });
-                       }
-
-                       hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];
-
-                       // If set returns undefined, fall back to normal setting
-                       if ( !hooks || !("set" in hooks) || hooks.set( this, val, "value" ) === undefined ) {
-                               this.value = val;
-                       }
-               });
-       }
-});
-
-jQuery.extend({
-       valHooks: {
-               option: {
-                       get: function( elem ) {
-                               // attributes.value is undefined in Blackberry 4.7 but
-                               // uses .value. See #6932
-                               var val = elem.attributes.value;
-                               return !val || val.specified ? elem.value : elem.text;
-                       }
-               },
-               select: {
-                       get: function( elem ) {
-                               var value, option,
-                                       options = elem.options,
-                                       index = elem.selectedIndex,
-                                       one = elem.type === "select-one" || index < 0,
-                                       values = one ? null : [],
-                                       max = one ? index + 1 : options.length,
-                                       i = index < 0 ?
-                                               max :
-                                               one ? index : 0;
-
-                               // Loop through all the selected options
-                               for ( ; i < max; i++ ) {
-                                       option = options[ i ];
-
-                                       // oldIE doesn't update selected after form reset (#2551)
-                                       if ( ( option.selected || i === index ) &&
-                                                       // Don't return options that are disabled or in a disabled optgroup
-                                                       ( jQuery.support.optDisabled ? !option.disabled : option.getAttribute("disabled") === null ) &&
-                                                       ( !option.parentNode.disabled || !jQuery.nodeName( option.parentNode, "optgroup" ) ) ) {
-
-                                               // Get the specific value for the option
-                                               value = jQuery( option ).val();
-
-                                               // We don't need an array for one selects
-                                               if ( one ) {
-                                                       return value;
-                                               }
-
-                                               // Multi-Selects return an array
-                                               values.push( value );
-                                       }
-                               }
-
-                               return values;
-                       },
-
-                       set: function( elem, value ) {
-                               var values = jQuery.makeArray( value );
-
-                               jQuery(elem).find("option").each(function() {
-                                       this.selected = jQuery.inArray( jQuery(this).val(), values ) >= 0;
-                               });
-
-                               if ( !values.length ) {
-                                       elem.selectedIndex = -1;
-                               }
-                               return values;
-                       }
-               }
-       },
-
-       // Unused in 1.8, left in so attrFn-stabbers won't die; remove in 1.9
-       attrFn: {},
-
-       attr: function( elem, name, value, pass ) {
-               var ret, hooks, notxml,
-                       nType = elem.nodeType;
-
-               // don't get/set attributes on text, comment and attribute nodes
-               if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
-                       return;
-               }
-
-               if ( pass && jQuery.isFunction( jQuery.fn[ name ] ) ) {
-                       return jQuery( elem )[ name ]( value );
-               }
-
-               // Fallback to prop when attributes are not supported
-               if ( typeof elem.getAttribute === "undefined" ) {
-                       return jQuery.prop( elem, name, value );
-               }
-
-               notxml = nType !== 1 || !jQuery.isXMLDoc( elem );
-
-               // All attributes are lowercase
-               // Grab necessary hook if one is defined
-               if ( notxml ) {
-                       name = name.toLowerCase();
-                       hooks = jQuery.attrHooks[ name ] || ( rboolean.test( name ) ? boolHook : nodeHook );
-               }
-
-               if ( value !== undefined ) {
-
-                       if ( value === null ) {
-                               jQuery.removeAttr( elem, name );
-                               return;
-
-                       } else if ( hooks && "set" in hooks && notxml && (ret = hooks.set( elem, value, name )) !== undefined ) {
-                               return ret;
-
-                       } else {
-                               elem.setAttribute( name, value + "" );
-                               return value;
-                       }
-
-               } else if ( hooks && "get" in hooks && notxml && (ret = hooks.get( elem, name )) !== null ) {
-                       return ret;
-
-               } else {
-
-                       ret = elem.getAttribute( name );
-
-                       // Non-existent attributes return null, we normalize to undefined
-                       return ret === null ?
-                               undefined :
-                               ret;
-               }
-       },
-
-       removeAttr: function( elem, value ) {
-               var propName, attrNames, name, isBool,
-                       i = 0;
-
-               if ( value && elem.nodeType === 1 ) {
-
-                       attrNames = value.split( core_rspace );
-
-                       for ( ; i < attrNames.length; i++ ) {
-                               name = attrNames[ i ];
-
-                               if ( name ) {
-                                       propName = jQuery.propFix[ name ] || name;
-                                       isBool = rboolean.test( name );
-
-                                       // See #9699 for explanation of this approach (setting first, then removal)
-                                       // Do not do this for boolean attributes (see #10870)
-                                       if ( !isBool ) {
-                                               jQuery.attr( elem, name, "" );
-                                       }
-                                       elem.removeAttribute( getSetAttribute ? name : propName );
-
-                                       // Set corresponding property to false for boolean attributes
-                                       if ( isBool && propName in elem ) {
-                                               elem[ propName ] = false;
-                                       }
-                               }
-                       }
-               }
-       },
-
-       attrHooks: {
-               type: {
-                       set: function( elem, value ) {
-                               // We can't allow the type property to be changed (since it causes problems in IE)
-                               if ( rtype.test( elem.nodeName ) && elem.parentNode ) {
-                                       jQuery.error( "type property can't be changed" );
-                               } else if ( !jQuery.support.radioValue && value === "radio" && jQuery.nodeName(elem, "input") ) {
-                                       // Setting the type on a radio button after the value resets the value in IE6-9
-                                       // Reset value to it's default in case type is set after value
-                                       // This is for element creation
-                                       var val = elem.value;
-                                       elem.setAttribute( "type", value );
-                                       if ( val ) {
-                                               elem.value = val;
-                                       }
-                                       return value;
-                               }
-                       }
-               },
-               // Use the value property for back compat
-               // Use the nodeHook for button elements in IE6/7 (#1954)
-               value: {
-                       get: function( elem, name ) {
-                               if ( nodeHook && jQuery.nodeName( elem, "button" ) ) {
-                                       return nodeHook.get( elem, name );
-                               }
-                               return name in elem ?
-                                       elem.value :
-                                       null;
-                       },
-                       set: function( elem, value, name ) {
-                               if ( nodeHook && jQuery.nodeName( elem, "button" ) ) {
-                                       return nodeHook.set( elem, value, name );
-                               }
-                               // Does not return so that setAttribute is also used
-                               elem.value = value;
-                       }
-               }
-       },
-
-       propFix: {
-               tabindex: "tabIndex",
-               readonly: "readOnly",
-               "for": "htmlFor",
-               "class": "className",
-               maxlength: "maxLength",
-               cellspacing: "cellSpacing",
-               cellpadding: "cellPadding",
-               rowspan: "rowSpan",
-               colspan: "colSpan",
-               usemap: "useMap",
-               frameborder: "frameBorder",
-               contenteditable: "contentEditable"
-       },
-
-       prop: function( elem, name, value ) {
-               var ret, hooks, notxml,
-                       nType = elem.nodeType;
-
-               // don't get/set properties on text, comment and attribute nodes
-               if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
-                       return;
-               }
-
-               notxml = nType !== 1 || !jQuery.isXMLDoc( elem );
-
-               if ( notxml ) {
-                       // Fix name and attach hooks
-                       name = jQuery.propFix[ name ] || name;
-                       hooks = jQuery.propHooks[ name ];
-               }
-
-               if ( value !== undefined ) {
-                       if ( hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) {
-                               return ret;
-
-                       } else {
-                               return ( elem[ name ] = value );
-                       }
-
-               } else {
-                       if ( hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ) {
-                               return ret;
-
-                       } else {
-                               return elem[ name ];
-                       }
-               }
-       },
-
-       propHooks: {
-               tabIndex: {
-                       get: function( elem ) {
-                               // elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set
-                               // http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/
-                               var attributeNode = elem.getAttributeNode("tabindex");
-
-                               return attributeNode && attributeNode.specified ?
-                                       parseInt( attributeNode.value, 10 ) :
-                                       rfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ?
-                                               0 :
-                                               undefined;
-                       }
-               }
-       }
-});
-
-// Hook for boolean attributes
-boolHook = {
-       get: function( elem, name ) {
-               // Align boolean attributes with corresponding properties
-               // Fall back to attribute presence where some booleans are not supported
-               var attrNode,
-                       property = jQuery.prop( elem, name );
-               return property === true || typeof property !== "boolean" && ( attrNode = elem.getAttributeNode(name) ) && attrNode.nodeValue !== false ?
-                       name.toLowerCase() :
-                       undefined;
-       },
-       set: function( elem, value, name ) {
-               var propName;
-               if ( value === false ) {
-                       // Remove boolean attributes when set to false
-                       jQuery.removeAttr( elem, name );
-               } else {
-                       // value is true since we know at this point it's type boolean and not false
-                       // Set boolean attributes to the same name and set the DOM property
-                       propName = jQuery.propFix[ name ] || name;
-                       if ( propName in elem ) {
-                               // Only set the IDL specifically if it already exists on the element
-                               elem[ propName ] = true;
-                       }
-
-                       elem.setAttribute( name, name.toLowerCase() );
-               }
-               return name;
-       }
-};
-
-// IE6/7 do not support getting/setting some attributes with get/setAttribute
-if ( !getSetAttribute ) {
-
-       fixSpecified = {
-               name: true,
-               id: true,
-               coords: true
-       };
-
-       // Use this for any attribute in IE6/7
-       // This fixes almost every IE6/7 issue
-       nodeHook = jQuery.valHooks.button = {
-               get: function( elem, name ) {
-                       var ret;
-                       ret = elem.getAttributeNode( name );
-                       return ret && ( fixSpecified[ name ] ? ret.value !== "" : ret.specified ) ?
-                               ret.value :
-                               undefined;
-               },
-               set: function( elem, value, name ) {
-                       // Set the existing or create a new attribute node
-                       var ret = elem.getAttributeNode( name );
-                       if ( !ret ) {
-                               ret = document.createAttribute( name );
-                               elem.setAttributeNode( ret );
-                       }
-                       return ( ret.value = value + "" );
-               }
-       };
-
-       // Set width and height to auto instead of 0 on empty string( Bug #8150 )
-       // This is for removals
-       jQuery.each([ "width", "height" ], function( i, name ) {
-               jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], {
-                       set: function( elem, value ) {
-                               if ( value === "" ) {
-                                       elem.setAttribute( name, "auto" );
-                                       return value;
-                               }
-                       }
-               });
-       });
-
-       // Set contenteditable to false on removals(#10429)
-       // Setting to empty string throws an error as an invalid value
-       jQuery.attrHooks.contenteditable = {
-               get: nodeHook.get,
-               set: function( elem, value, name ) {
-                       if ( value === "" ) {
-                               value = "false";
-                       }
-                       nodeHook.set( elem, value, name );
-               }
-       };
-}
-
-
-// Some attributes require a special call on IE
-if ( !jQuery.support.hrefNormalized ) {
-       jQuery.each([ "href", "src", "width", "height" ], function( i, name ) {
-               jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], {
-                       get: function( elem ) {
-                               var ret = elem.getAttribute( name, 2 );
-                               return ret === null ? undefined : ret;
-                       }
-               });
-       });
-}
-
-if ( !jQuery.support.style ) {
-       jQuery.attrHooks.style = {
-               get: function( elem ) {
-                       // Return undefined in the case of empty string
-                       // Normalize to lowercase since IE uppercases css property names
-                       return elem.style.cssText.toLowerCase() || undefined;
-               },
-               set: function( elem, value ) {
-                       return ( elem.style.cssText = value + "" );
-               }
-       };
-}
-
-// Safari mis-reports the default selected property of an option
-// Accessing the parent's selectedIndex property fixes it
-if ( !jQuery.support.optSelected ) {
-       jQuery.propHooks.selected = jQuery.extend( jQuery.propHooks.selected, {
-               get: function( elem ) {
-                       var parent = elem.parentNode;
-
-                       if ( parent ) {
-                               parent.selectedIndex;
-
-                               // Make sure that it also works with optgroups, see #5701
-                               if ( parent.parentNode ) {
-                                       parent.parentNode.selectedIndex;
-                               }
-                       }
-                       return null;
-               }
-       });
-}
-
-// IE6/7 call enctype encoding
-if ( !jQuery.support.enctype ) {
-       jQuery.propFix.enctype = "encoding";
-}
-
-// Radios and checkboxes getter/setter
-if ( !jQuery.support.checkOn ) {
-       jQuery.each([ "radio", "checkbox" ], function() {
-               jQuery.valHooks[ this ] = {
-                       get: function( elem ) {
-                               // Handle the case where in Webkit "" is returned instead of "on" if a value isn't specified
-                               return elem.getAttribute("value") === null ? "on" : elem.value;
-                       }
-               };
-       });
-}
-jQuery.each([ "radio", "checkbox" ], function() {
-       jQuery.valHooks[ this ] = jQuery.extend( jQuery.valHooks[ this ], {
-               set: function( elem, value ) {
-                       if ( jQuery.isArray( value ) ) {
-                               return ( elem.checked = jQuery.inArray( jQuery(elem).val(), value ) >= 0 );
-                       }
-               }
-       });
-});
-var rformElems = /^(?:textarea|input|select)$/i,
-       rtypenamespace = /^([^\.]*|)(?:\.(.+)|)$/,
-       rhoverHack = /(?:^|\s)hover(\.\S+|)\b/,
-       rkeyEvent = /^key/,
-       rmouseEvent = /^(?:mouse|contextmenu)|click/,
-       rfocusMorph = /^(?:focusinfocus|focusoutblur)$/,
-       hoverHack = function( events ) {
-               return jQuery.event.special.hover ? events : events.replace( rhoverHack, "mouseenter$1 mouseleave$1" );
-       };
-
-/*
- * Helper functions for managing events -- not part of the public interface.
- * Props to Dean Edwards' addEvent library for many of the ideas.
- */
-jQuery.event = {
-
-       add: function( elem, types, handler, data, selector ) {
-
-               var elemData, eventHandle, events,
-                       t, tns, type, namespaces, handleObj,
-                       handleObjIn, handlers, special;
-
-               // Don't attach events to noData or text/comment nodes (allow plain objects tho)
-               if ( elem.nodeType === 3 || elem.nodeType === 8 || !types || !handler || !(elemData = jQuery._data( elem )) ) {
-                       return;
-               }
-
-               // Caller can pass in an object of custom data in lieu of the handler
-               if ( handler.handler ) {
-                       handleObjIn = handler;
-                       handler = handleObjIn.handler;
-                       selector = handleObjIn.selector;
-               }
-
-               // Make sure that the handler has a unique ID, used to find/remove it later
-               if ( !handler.guid ) {
-                       handler.guid = jQuery.guid++;
-               }
-
-               // Init the element's event structure and main handler, if this is the first
-               events = elemData.events;
-               if ( !events ) {
-                       elemData.events = events = {};
-               }
-               eventHandle = elemData.handle;
-               if ( !eventHandle ) {
-                       elemData.handle = eventHandle = function( e ) {
-                               // Discard the second event of a jQuery.event.trigger() and
-                               // when an event is called after a page has unloaded
-                               return typeof jQuery !== "undefined" && (!e || jQuery.event.triggered !== e.type) ?
-                                       jQuery.event.dispatch.apply( eventHandle.elem, arguments ) :
-                                       undefined;
-                       };
-                       // Add elem as a property of the handle fn to prevent a memory leak with IE non-native events
-                       eventHandle.elem = elem;
-               }
-
-               // Handle multiple events separated by a space
-               // jQuery(...).bind("mouseover mouseout", fn);
-               types = jQuery.trim( hoverHack(types) ).split( " " );
-               for ( t = 0; t < types.length; t++ ) {
-
-                       tns = rtypenamespace.exec( types[t] ) || [];
-                       type = tns[1];
-                       namespaces = ( tns[2] || "" ).split( "." ).sort();
-
-                       // If event changes its type, use the special event handlers for the changed type
-                       special = jQuery.event.special[ type ] || {};
-
-                       // If selector defined, determine special event api type, otherwise given type
-                       type = ( selector ? special.delegateType : special.bindType ) || type;
-
-                       // Update special based on newly reset type
-                       special = jQuery.event.special[ type ] || {};
-
-                       // handleObj is passed to all event handlers
-                       handleObj = jQuery.extend({
-                               type: type,
-                               origType: tns[1],
-                               data: data,
-                               handler: handler,
-                               guid: handler.guid,
-                               selector: selector,
-                               needsContext: selector && jQuery.expr.match.needsContext.test( selector ),
-                               namespace: namespaces.join(".")
-                       }, handleObjIn );
-
-                       // Init the event handler queue if we're the first
-                       handlers = events[ type ];
-                       if ( !handlers ) {
-                               handlers = events[ type ] = [];
-                               handlers.delegateCount = 0;
-
-                               // Only use addEventListener/attachEvent if the special events handler returns false
-                               if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) {
-                                       // Bind the global event handler to the element
-                                       if ( elem.addEventListener ) {
-                                               elem.addEventListener( type, eventHandle, false );
-
-                                       } else if ( elem.attachEvent ) {
-                                               elem.attachEvent( "on" + type, eventHandle );
-                                       }
-                               }
-                       }
-
-                       if ( special.add ) {
-                               special.add.call( elem, handleObj );
-
-                               if ( !handleObj.handler.guid ) {
-                                       handleObj.handler.guid = handler.guid;
-                               }
-                       }
-
-                       // Add to the element's handler list, delegates in front
-                       if ( selector ) {
-                               handlers.splice( handlers.delegateCount++, 0, handleObj );
-                       } else {
-                               handlers.push( handleObj );
-                       }
-
-                       // Keep track of which events have ever been used, for event optimization
-                       jQuery.event.global[ type ] = true;
-               }
-
-               // Nullify elem to prevent memory leaks in IE
-               elem = null;
-       },
-
-       global: {},
-
-       // Detach an event or set of events from an element
-       remove: function( elem, types, handler, selector, mappedTypes ) {
-
-               var t, tns, type, origType, namespaces, origCount,
-                       j, events, special, eventType, handleObj,
-                       elemData = jQuery.hasData( elem ) && jQuery._data( elem );
-
-               if ( !elemData || !(events = elemData.events) ) {
-                       return;
-               }
-
-               // Once for each type.namespace in types; type may be omitted
-               types = jQuery.trim( hoverHack( types || "" ) ).split(" ");
-               for ( t = 0; t < types.length; t++ ) {
-                       tns = rtypenamespace.exec( types[t] ) || [];
-                       type = origType = tns[1];
-                       namespaces = tns[2];
-
-                       // Unbind all events (on this namespace, if provided) for the element
-                       if ( !type ) {
-                               for ( type in events ) {
-                                       jQuery.event.remove( elem, type + types[ t ], handler, selector, true );
-                               }
-                               continue;
-                       }
-
-                       special = jQuery.event.special[ type ] || {};
-                       type = ( selector? special.delegateType : special.bindType ) || type;
-                       eventType = events[ type ] || [];
-                       origCount = eventType.length;
-                       namespaces = namespaces ? new RegExp("(^|\\.)" + namespaces.split(".").sort().join("\\.(?:.*\\.|)") + "(\\.|$)") : null;
-
-                       // Remove matching events
-                       for ( j = 0; j < eventType.length; j++ ) {
-                               handleObj = eventType[ j ];
-
-                               if ( ( mappedTypes || origType === handleObj.origType ) &&
-                                        ( !handler || handler.guid === handleObj.guid ) &&
-                                        ( !namespaces || namespaces.test( handleObj.namespace ) ) &&
-                                        ( !selector || selector === handleObj.selector || selector === "**" && handleObj.selector ) ) {
-                                       eventType.splice( j--, 1 );
-
-                                       if ( handleObj.selector ) {
-                                               eventType.delegateCount--;
-                                       }
-                                       if ( special.remove ) {
-                                               special.remove.call( elem, handleObj );
-                                       }
-                               }
-                       }
-
-                       // Remove generic event handler if we removed something and no more handlers exist
-                       // (avoids potential for endless recursion during removal of special event handlers)
-                       if ( eventType.length === 0 && origCount !== eventType.length ) {
-                               if ( !special.teardown || special.teardown.call( elem, namespaces, elemData.handle ) === false ) {
-                                       jQuery.removeEvent( elem, type, elemData.handle );
-                               }
-
-                               delete events[ type ];
-                       }
-               }
-
-               // Remove the expando if it's no longer used
-               if ( jQuery.isEmptyObject( events ) ) {
-                       delete elemData.handle;
-
-                       // removeData also checks for emptiness and clears the expando if empty
-                       // so use it instead of delete
-                       jQuery.removeData( elem, "events", true );
-               }
-       },
-
-       // Events that are safe to short-circuit if no handlers are attached.
-       // Native DOM events should not be added, they may have inline handlers.
-       customEvent: {
-               "getData": true,
-               "setData": true,
-               "changeData": true
-       },
-
-       trigger: function( event, data, elem, onlyHandlers ) {
-               // Don't do events on text and comment nodes
-               if ( elem && (elem.nodeType === 3 || elem.nodeType === 8) ) {
-                       return;
-               }
-
-               // Event object or event type
-               var cache, exclusive, i, cur, old, ontype, special, handle, eventPath, bubbleType,
-                       type = event.type || event,
-                       namespaces = [];
-
-               // focus/blur morphs to focusin/out; ensure we're not firing them right now
-               if ( rfocusMorph.test( type + jQuery.event.triggered ) ) {
-                       return;
-               }
-
-               if ( type.indexOf( "!" ) >= 0 ) {
-                       // Exclusive events trigger only for the exact event (no namespaces)
-                       type = type.slice(0, -1);
-                       exclusive = true;
-               }
-
-               if ( type.indexOf( "." ) >= 0 ) {
-                       // Namespaced trigger; create a regexp to match event type in handle()
-                       namespaces = type.split(".");
-                       type = namespaces.shift();
-                       namespaces.sort();
-               }
-
-               if ( (!elem || jQuery.event.customEvent[ type ]) && !jQuery.event.global[ type ] ) {
-                       // No jQuery handlers for this event type, and it can't have inline handlers
-                       return;
-               }
-
-               // Caller can pass in an Event, Object, or just an event type string
-               event = typeof event === "object" ?
-                       // jQuery.Event object
-                       event[ jQuery.expando ] ? event :
-                       // Object literal
-                       new jQuery.Event( type, event ) :
-                       // Just the event type (string)
-                       new jQuery.Event( type );
-
-               event.type = type;
-               event.isTrigger = true;
-               event.exclusive = exclusive;
-               event.namespace = namespaces.join( "." );
-               event.namespace_re = event.namespace? new RegExp("(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)") : null;
-               ontype = type.indexOf( ":" ) < 0 ? "on" + type : "";
-
-               // Handle a global trigger
-               if ( !elem ) {
-
-                       // TODO: Stop taunting the data cache; remove global events and always attach to document
-                       cache = jQuery.cache;
-                       for ( i in cache ) {
-                               if ( cache[ i ].events && cache[ i ].events[ type ] ) {
-                                       jQuery.event.trigger( event, data, cache[ i ].handle.elem, true );
-                               }
-                       }
-                       return;
-               }
-
-               // Clean up the event in case it is being reused
-               event.result = undefined;
-               if ( !event.target ) {
-                       event.target = elem;
-               }
-
-               // Clone any incoming data and prepend the event, creating the handler arg list
-               data = data != null ? jQuery.makeArray( data ) : [];
-               data.unshift( event );
-
-               // Allow special events to draw outside the lines
-               special = jQuery.event.special[ type ] || {};
-               if ( special.trigger && special.trigger.apply( elem, data ) === false ) {
-                       return;
-               }
-
-               // Determine event propagation path in advance, per W3C events spec (#9951)
-               // Bubble up to document, then to window; watch for a global ownerDocument var (#9724)
-               eventPath = [[ elem, special.bindType || type ]];
-               if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) {
-
-                       bubbleType = special.delegateType || type;
-                       cur = rfocusMorph.test( bubbleType + type ) ? elem : elem.parentNode;
-                       for ( old = elem; cur; cur = cur.parentNode ) {
-                               eventPath.push([ cur, bubbleType ]);
-                               old = cur;
-                       }
-
-                       // Only add window if we got to document (e.g., not plain obj or detached DOM)
-                       if ( old === (elem.ownerDocument || document) ) {
-                               eventPath.push([ old.defaultView || old.parentWindow || window, bubbleType ]);
-                       }
-               }
-
-               // Fire handlers on the event path
-               for ( i = 0; i < eventPath.length && !event.isPropagationStopped(); i++ ) {
-
-                       cur = eventPath[i][0];
-                       event.type = eventPath[i][1];
-
-                       handle = ( jQuery._data( cur, "events" ) || {} )[ event.type ] && jQuery._data( cur, "handle" );
-                       if ( handle ) {
-                               handle.apply( cur, data );
-                       }
-                       // Note that this is a bare JS function and not a jQuery handler
-                       handle = ontype && cur[ ontype ];
-                       if ( handle && jQuery.acceptData( cur ) && handle.apply && handle.apply( cur, data ) === false ) {
-                               event.preventDefault();
-                       }
-               }
-               event.type = type;
-
-               // If nobody prevented the default action, do it now
-               if ( !onlyHandlers && !event.isDefaultPrevented() ) {
-
-                       if ( (!special._default || special._default.apply( elem.ownerDocument, data ) === false) &&
-                               !(type === "click" && jQuery.nodeName( elem, "a" )) && jQuery.acceptData( elem ) ) {
-
-                               // Call a native DOM method on the target with the same name name as the event.
-                               // Can't use an .isFunction() check here because IE6/7 fails that test.
-                               // Don't do default actions on window, that's where global variables be (#6170)
-                               // IE<9 dies on focus/blur to hidden element (#1486)
-                               if ( ontype && elem[ type ] && ((type !== "focus" && type !== "blur") || event.target.offsetWidth !== 0) && !jQuery.isWindow( elem ) ) {
-
-                                       // Don't re-trigger an onFOO event when we call its FOO() method
-                                       old = elem[ ontype ];
-
-                                       if ( old ) {
-                                               elem[ ontype ] = null;
-                                       }
-
-                                       // Prevent re-triggering of the same event, since we already bubbled it above
-                                       jQuery.event.triggered = type;
-                                       elem[ type ]();
-                                       jQuery.event.triggered = undefined;
-
-                                       if ( old ) {
-                                               elem[ ontype ] = old;
-                                       }
-                               }
-                       }
-               }
-
-               return event.result;
-       },
-
-       dispatch: function( event ) {
-
-               // Make a writable jQuery.Event from the native event object
-               event = jQuery.event.fix( event || window.event );
-
-               var i, j, cur, ret, selMatch, matched, matches, handleObj, sel, related,
-                       handlers = ( (jQuery._data( this, "events" ) || {} )[ event.type ] || []),
-                       delegateCount = handlers.delegateCount,
-                       args = core_slice.call( arguments ),
-                       run_all = !event.exclusive && !event.namespace,
-                       special = jQuery.event.special[ event.type ] || {},
-                       handlerQueue = [];
-
-               // Use the fix-ed jQuery.Event rather than the (read-only) native event
-               args[0] = event;
-               event.delegateTarget = this;
-
-               // Call the preDispatch hook for the mapped type, and let it bail if desired
-               if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {
-                       return;
-               }
-
-               // Determine handlers that should run if there are delegated events
-               // Avoid non-left-click bubbling in Firefox (#3861)
-               if ( delegateCount && !(event.button && event.type === "click") ) {
-
-                       for ( cur = event.target; cur != this; cur = cur.parentNode || this ) {
-
-                               // Don't process clicks (ONLY) on disabled elements (#6911, #8165, #11382, #11764)
-                               if ( cur.disabled !== true || event.type !== "click" ) {
-                                       selMatch = {};
-                                       matches = [];
-                                       for ( i = 0; i < delegateCount; i++ ) {
-                                               handleObj = handlers[ i ];
-                                               sel = handleObj.selector;
-
-                                               if ( selMatch[ sel ] === undefined ) {
-                                                       selMatch[ sel ] = handleObj.needsContext ?
-                                                               jQuery( sel, this ).index( cur ) >= 0 :
-                                                               jQuery.find( sel, this, null, [ cur ] ).length;
-                                               }
-                                               if ( selMatch[ sel ] ) {
-                                                       matches.push( handleObj );
-                                               }
-                                       }
-                                       if ( matches.length ) {
-                                               handlerQueue.push({ elem: cur, matches: matches });
-                                       }
-                               }
-                       }
-               }
-
-               // Add the remaining (directly-bound) handlers
-               if ( handlers.length > delegateCount ) {
-                       handlerQueue.push({ elem: this, matches: handlers.slice( delegateCount ) });
-               }
-
-               // Run delegates first; they may want to stop propagation beneath us
-               for ( i = 0; i < handlerQueue.length && !event.isPropagationStopped(); i++ ) {
-                       matched = handlerQueue[ i ];
-                       event.currentTarget = matched.elem;
-
-                       for ( j = 0; j < matched.matches.length && !event.isImmediatePropagationStopped(); j++ ) {
-                               handleObj = matched.matches[ j ];
-
-                               // Triggered event must either 1) be non-exclusive and have no namespace, or
-                               // 2) have namespace(s) a subset or equal to those in the bound event (both can have no namespace).
-                               if ( run_all || (!event.namespace && !handleObj.namespace) || event.namespace_re && event.namespace_re.test( handleObj.namespace ) ) {
-
-                                       event.data = handleObj.data;
-                                       event.handleObj = handleObj;
-
-                                       ret = ( (jQuery.event.special[ handleObj.origType ] || {}).handle || handleObj.handler )
-                                                       .apply( matched.elem, args );
-
-                                       if ( ret !== undefined ) {
-                                               event.result = ret;
-                                               if ( ret === false ) {
-                                                       event.preventDefault();
-                                                       event.stopPropagation();
-                                               }
-                                       }
-                               }
-                       }
-               }
-
-               // Call the postDispatch hook for the mapped type
-               if ( special.postDispatch ) {
-                       special.postDispatch.call( this, event );
-               }
-
-               return event.result;
-       },
-
-       // Includes some event props shared by KeyEvent and MouseEvent
-       // *** attrChange attrName relatedNode srcElement  are not normalized, non-W3C, deprecated, will be removed in 1.8 ***
-       props: "attrChange attrName relatedNode srcElement altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),
-
-       fixHooks: {},
-
-       keyHooks: {
-               props: "char charCode key keyCode".split(" "),
-               filter: function( event, original ) {
-
-                       // Add which for key events
-                       if ( event.which == null ) {
-                               event.which = original.charCode != null ? original.charCode : original.keyCode;
-                       }
-
-                       return event;
-               }
-       },
-
-       mouseHooks: {
-               props: "button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),
-               filter: function( event, original ) {
-                       var eventDoc, doc, body,
-                               button = original.button,
-                               fromElement = original.fromElement;
-
-                       // Calculate pageX/Y if missing and clientX/Y available
-                       if ( event.pageX == null && original.clientX != null ) {
-                               eventDoc = event.target.ownerDocument || document;
-                               doc = eventDoc.documentElement;
-                               body = eventDoc.body;
-
-                               event.pageX = original.clientX + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - ( doc && doc.clientLeft || body && body.clientLeft || 0 );
-                               event.pageY = original.clientY + ( doc && doc.scrollTop  || body && body.scrollTop  || 0 ) - ( doc && doc.clientTop  || body && body.clientTop  || 0 );
-                       }
-
-                       // Add relatedTarget, if necessary
-                       if ( !event.relatedTarget && fromElement ) {
-                               event.relatedTarget = fromElement === event.target ? original.toElement : fromElement;
-                       }
-
-                       // Add which for click: 1 === left; 2 === middle; 3 === right
-                       // Note: button is not normalized, so don't use it
-                       if ( !event.which && button !== undefined ) {
-                               event.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) );
-                       }
-
-                       return event;
-               }
-       },
-
-       fix: function( event ) {
-               if ( event[ jQuery.expando ] ) {
-                       return event;
-               }
-
-               // Create a writable copy of the event object and normalize some properties
-               var i, prop,
-                       originalEvent = event,
-                       fixHook = jQuery.event.fixHooks[ event.type ] || {},
-                       copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props;
-
-               event = jQuery.Event( originalEvent );
-
-               for ( i = copy.length; i; ) {
-                       prop = copy[ --i ];
-                       event[ prop ] = originalEvent[ prop ];
-               }
-
-               // Fix target property, if necessary (#1925, IE 6/7/8 & Safari2)
-               if ( !event.target ) {
-                       event.target = originalEvent.srcElement || document;
-               }
-
-               // Target should not be a text node (#504, Safari)
-               if ( event.target.nodeType === 3 ) {
-                       event.target = event.target.parentNode;
-               }
-
-               // For mouse/key events, metaKey==false if it's undefined (#3368, #11328; IE6/7/8)
-               event.metaKey = !!event.metaKey;
-
-               return fixHook.filter? fixHook.filter( event, originalEvent ) : event;
-       },
-
-       special: {
-               load: {
-                       // Prevent triggered image.load events from bubbling to window.load
-                       noBubble: true
-               },
-
-               focus: {
-                       delegateType: "focusin"
-               },
-               blur: {
-                       delegateType: "focusout"
-               },
-
-               beforeunload: {
-                       setup: function( data, namespaces, eventHandle ) {
-                               // We only want to do this special case on windows
-                               if ( jQuery.isWindow( this ) ) {
-                                       this.onbeforeunload = eventHandle;
-                               }
-                       },
-
-                       teardown: function( namespaces, eventHandle ) {
-                               if ( this.onbeforeunload === eventHandle ) {
-                                       this.onbeforeunload = null;
-                               }
-                       }
-               }
-       },
-
-       simulate: function( type, elem, event, bubble ) {
-               // Piggyback on a donor event to simulate a different one.
-               // Fake originalEvent to avoid donor's stopPropagation, but if the
-               // simulated event prevents default then we do the same on the donor.
-               var e = jQuery.extend(
-                       new jQuery.Event(),
-                       event,
-                       { type: type,
-                               isSimulated: true,
-                               originalEvent: {}
-                       }
-               );
-               if ( bubble ) {
-                       jQuery.event.trigger( e, null, elem );
-               } else {
-                       jQuery.event.dispatch.call( elem, e );
-               }
-               if ( e.isDefaultPrevented() ) {
-                       event.preventDefault();
-               }
-       }
-};
-
-// Some plugins are using, but it's undocumented/deprecated and will be removed.
-// The 1.7 special event interface should provide all the hooks needed now.
-jQuery.event.handle = jQuery.event.dispatch;
-
-jQuery.removeEvent = document.removeEventListener ?
-       function( elem, type, handle ) {
-               if ( elem.removeEventListener ) {
-                       elem.removeEventListener( type, handle, false );
-               }
-       } :
-       function( elem, type, handle ) {
-               var name = "on" + type;
-
-               if ( elem.detachEvent ) {
-
-                       // #8545, #7054, preventing memory leaks for custom events in IE6-8
-                       // detachEvent needed property on element, by name of that event, to properly expose it to GC
-                       if ( typeof elem[ name ] === "undefined" ) {
-                               elem[ name ] = null;
-                       }
-
-                       elem.detachEvent( name, handle );
-               }
-       };
-
-jQuery.Event = function( src, props ) {
-       // Allow instantiation without the 'new' keyword
-       if ( !(this instanceof jQuery.Event) ) {
-               return new jQuery.Event( src, props );
-       }
-
-       // Event object
-       if ( src && src.type ) {
-               this.originalEvent = src;
-               this.type = src.type;
-
-               // Events bubbling up the document may have been marked as prevented
-               // by a handler lower down the tree; reflect the correct value.
-               this.isDefaultPrevented = ( src.defaultPrevented || src.returnValue === false ||
-                       src.getPreventDefault && src.getPreventDefault() ) ? returnTrue : returnFalse;
-
-       // Event type
-       } else {
-               this.type = src;
-       }
-
-       // Put explicitly provided properties onto the event object
-       if ( props ) {
-               jQuery.extend( this, props );
-       }
-
-       // Create a timestamp if incoming event doesn't have one
-       this.timeStamp = src && src.timeStamp || jQuery.now();
-
-       // Mark it as fixed
-       this[ jQuery.expando ] = true;
-};
-
-function returnFalse() {
-       return false;
-}
-function returnTrue() {
-       return true;
-}
-
-// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
-// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
-jQuery.Event.prototype = {
-       preventDefault: function() {
-               this.isDefaultPrevented = returnTrue;
-
-               var e = this.originalEvent;
-               if ( !e ) {
-                       return;
-               }
-
-               // if preventDefault exists run it on the original event
-               if ( e.preventDefault ) {
-                       e.preventDefault();
-
-               // otherwise set the returnValue property of the original event to false (IE)
-               } else {
-                       e.returnValue = false;
-               }
-       },
-       stopPropagation: function() {
-               this.isPropagationStopped = returnTrue;
-
-               var e = this.originalEvent;
-               if ( !e ) {
-                       return;
-               }
-               // if stopPropagation exists run it on the original event
-               if ( e.stopPropagation ) {
-                       e.stopPropagation();
-               }
-               // otherwise set the cancelBubble property of the original event to true (IE)
-               e.cancelBubble = true;
-       },
-       stopImmediatePropagation: function() {
-               this.isImmediatePropagationStopped = returnTrue;
-               this.stopPropagation();
-       },
-       isDefaultPrevented: returnFalse,
-       isPropagationStopped: returnFalse,
-       isImmediatePropagationStopped: returnFalse
-};
-
-// Create mouseenter/leave events using mouseover/out and event-time checks
-jQuery.each({
-       mouseenter: "mouseover",
-       mouseleave: "mouseout"
-}, function( orig, fix ) {
-       jQuery.event.special[ orig ] = {
-               delegateType: fix,
-               bindType: fix,
-
-               handle: function( event ) {
-                       var ret,
-                               target = this,
-                               related = event.relatedTarget,
-                               handleObj = event.handleObj,
-                               selector = handleObj.selector;
-
-                       // For mousenter/leave call the handler if related is outside the target.
-                       // NB: No relatedTarget if the mouse left/entered the browser window
-                       if ( !related || (related !== target && !jQuery.contains( target, related )) ) {
-                               event.type = handleObj.origType;
-                               ret = handleObj.handler.apply( this, arguments );
-                               event.type = fix;
-                       }
-                       return ret;
-               }
-       };
-});
-
-// IE submit delegation
-if ( !jQuery.support.submitBubbles ) {
-
-       jQuery.event.special.submit = {
-               setup: function() {
-                       // Only need this for delegated form submit events
-                       if ( jQuery.nodeName( this, "form" ) ) {
-                               return false;
-                       }
-
-                       // Lazy-add a submit handler when a descendant form may potentially be submitted
-                       jQuery.event.add( this, "click._submit keypress._submit", function( e ) {
-                               // Node name check avoids a VML-related crash in IE (#9807)
-                               var elem = e.target,
-                                       form = jQuery.nodeName( elem, "input" ) || jQuery.nodeName( elem, "button" ) ? elem.form : undefined;
-                               if ( form && !jQuery._data( form, "_submit_attached" ) ) {
-                                       jQuery.event.add( form, "submit._submit", function( event ) {
-                                               event._submit_bubble = true;
-                                       });
-                                       jQuery._data( form, "_submit_attached", true );
-                               }
-                       });
-                       // return undefined since we don't need an event listener
-               },
-
-               postDispatch: function( event ) {
-                       // If form was submitted by the user, bubble the event up the tree
-                       if ( event._submit_bubble ) {
-                               delete event._submit_bubble;
-                               if ( this.parentNode && !event.isTrigger ) {
-                                       jQuery.event.simulate( "submit", this.parentNode, event, true );
-                               }
-                       }
-               },
-
-               teardown: function() {
-                       // Only need this for delegated form submit events
-                       if ( jQuery.nodeName( this, "form" ) ) {
-                               return false;
-                       }
-
-                       // Remove delegated handlers; cleanData eventually reaps submit handlers attached above
-                       jQuery.event.remove( this, "._submit" );
-               }
-       };
-}
-
-// IE change delegation and checkbox/radio fix
-if ( !jQuery.support.changeBubbles ) {
-
-       jQuery.event.special.change = {
-
-               setup: function() {
-
-                       if ( rformElems.test( this.nodeName ) ) {
-                               // IE doesn't fire change on a check/radio until blur; trigger it on click
-                               // after a propertychange. Eat the blur-change in special.change.handle.
-                               // This still fires onchange a second time for check/radio after blur.
-                               if ( this.type === "checkbox" || this.type === "radio" ) {
-                                       jQuery.event.add( this, "propertychange._change", function( event ) {
-                                               if ( event.originalEvent.propertyName === "checked" ) {
-                                                       this._just_changed = true;
-                                               }
-                                       });
-                                       jQuery.event.add( this, "click._change", function( event ) {
-                                               if ( this._just_changed && !event.isTrigger ) {
-                                                       this._just_changed = false;
-                                               }
-                                               // Allow triggered, simulated change events (#11500)
-                                               jQuery.event.simulate( "change", this, event, true );
-                                       });
-                               }
-                               return false;
-                       }
-                       // Delegated event; lazy-add a change handler on descendant inputs
-                       jQuery.event.add( this, "beforeactivate._change", function( e ) {
-                               var elem = e.target;
-
-                               if ( rformElems.test( elem.nodeName ) && !jQuery._data( elem, "_change_attached" ) ) {
-                                       jQuery.event.add( elem, "change._change", function( event ) {
-                                               if ( this.parentNode && !event.isSimulated && !event.isTrigger ) {
-                                                       jQuery.event.simulate( "change", this.parentNode, event, true );
-                                               }
-                                       });
-                                       jQuery._data( elem, "_change_attached", true );
-                               }
-                       });
-               },
-
-               handle: function( event ) {
-                       var elem = event.target;
-
-                       // Swallow native change events from checkbox/radio, we already triggered them above
-                       if ( this !== elem || event.isSimulated || event.isTrigger || (elem.type !== "radio" && elem.type !== "checkbox") ) {
-                               return event.handleObj.handler.apply( this, arguments );
-                       }
-               },
-
-               teardown: function() {
-                       jQuery.event.remove( this, "._change" );
-
-                       return !rformElems.test( this.nodeName );
-               }
-       };
-}
-
-// Create "bubbling" focus and blur events
-if ( !jQuery.support.focusinBubbles ) {
-       jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) {
-
-               // Attach a single capturing handler while someone wants focusin/focusout
-               var attaches = 0,
-                       handler = function( event ) {
-                               jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ), true );
-                       };
-
-               jQuery.event.special[ fix ] = {
-                       setup: function() {
-                               if ( attaches++ === 0 ) {
-                                       document.addEventListener( orig, handler, true );
-                               }
-                       },
-                       teardown: function() {
-                               if ( --attaches === 0 ) {
-                                       document.removeEventListener( orig, handler, true );
-                               }
-                       }
-               };
-       });
-}
-
-jQuery.fn.extend({
-
-       on: function( types, selector, data, fn, /*INTERNAL*/ one ) {
-               var origFn, type;
-
-               // Types can be a map of types/handlers
-               if ( typeof types === "object" ) {
-                       // ( types-Object, selector, data )
-                       if ( typeof selector !== "string" ) { // && selector != null
-                               // ( types-Object, data )
-                               data = data || selector;
-                               selector = undefined;
-                       }
-                       for ( type in types ) {
-                               this.on( type, selector, data, types[ type ], one );
-                       }
-                       return this;
-               }
-
-               if ( data == null && fn == null ) {
-                       // ( types, fn )
-                       fn = selector;
-                       data = selector = undefined;
-               } else if ( fn == null ) {
-                       if ( typeof selector === "string" ) {
-                               // ( types, selector, fn )
-                               fn = data;
-                               data = undefined;
-                       } else {
-                               // ( types, data, fn )
-                               fn = data;
-                               data = selector;
-                               selector = undefined;
-                       }
-               }
-               if ( fn === false ) {
-                       fn = returnFalse;
-               } else if ( !fn ) {
-                       return this;
-               }
-
-               if ( one === 1 ) {
-                       origFn = fn;
-                       fn = function( event ) {
-                               // Can use an empty set, since event contains the info
-                               jQuery().off( event );
-                               return origFn.apply( this, arguments );
-                       };
-                       // Use same guid so caller can remove using origFn
-                       fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );
-               }
-               return this.each( function() {
-                       jQuery.event.add( this, types, fn, data, selector );
-               });
-       },
-       one: function( types, selector, data, fn ) {
-               return this.on( types, selector, data, fn, 1 );
-       },
-       off: function( types, selector, fn ) {
-               var handleObj, type;
-               if ( types && types.preventDefault && types.handleObj ) {
-                       // ( event )  dispatched jQuery.Event
-                       handleObj = types.handleObj;
-                       jQuery( types.delegateTarget ).off(
-                               handleObj.namespace ? handleObj.origType + "." + handleObj.namespace : handleObj.origType,
-                               handleObj.selector,
-                               handleObj.handler
-                       );
-                       return this;
-               }
-               if ( typeof types === "object" ) {
-                       // ( types-object [, selector] )
-                       for ( type in types ) {
-                               this.off( type, selector, types[ type ] );
-                       }
-                       return this;
-               }
-               if ( selector === false || typeof selector === "function" ) {
-                       // ( types [, fn] )
-                       fn = selector;
-                       selector = undefined;
-               }
-               if ( fn === false ) {
-                       fn = returnFalse;
-               }
-               return this.each(function() {
-                       jQuery.event.remove( this, types, fn, selector );
-               });
-       },
-
-       bind: function( types, data, fn ) {
-               return this.on( types, null, data, fn );
-       },
-       unbind: function( types, fn ) {
-               return this.off( types, null, fn );
-       },
-
-       live: function( types, data, fn ) {
-               jQuery( this.context ).on( types, this.selector, data, fn );
-               return this;
-       },
-       die: function( types, fn ) {
-               jQuery( this.context ).off( types, this.selector || "**", fn );
-               return this;
-       },
-
-       delegate: function( selector, types, data, fn ) {
-               return this.on( types, selector, data, fn );
-       },
-       undelegate: function( selector, types, fn ) {
-               // ( namespace ) or ( selector, types [, fn] )
-               return arguments.length === 1 ? this.off( selector, "**" ) : this.off( types, selector || "**", fn );
-       },
-
-       trigger: function( type, data ) {
-               return this.each(function() {
-                       jQuery.event.trigger( type, data, this );
-               });
-       },
-       triggerHandler: function( type, data ) {
-               if ( this[0] ) {
-                       return jQuery.event.trigger( type, data, this[0], true );
-               }
-       },
-
-       toggle: function( fn ) {
-               // Save reference to arguments for access in closure
-               var args = arguments,
-                       guid = fn.guid || jQuery.guid++,
-                       i = 0,
-                       toggler = function( event ) {
-                               // Figure out which function to execute
-                               var lastToggle = ( jQuery._data( this, "lastToggle" + fn.guid ) || 0 ) % i;
-                               jQuery._data( this, "lastToggle" + fn.guid, lastToggle + 1 );
-
-                               // Make sure that clicks stop
-                               event.preventDefault();
-
-                               // and execute the function
-                               return args[ lastToggle ].apply( this, arguments ) || false;
-                       };
-
-               // link all the functions, so any of them can unbind this click handler
-               toggler.guid = guid;
-               while ( i < args.length ) {
-                       args[ i++ ].guid = guid;
-               }
-
-               return this.click( toggler );
-       },
-
-       hover: function( fnOver, fnOut ) {
-               return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );
-       }
-});
-
-jQuery.each( ("blur focus focusin focusout load resize scroll unload click dblclick " +
-       "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +
-       "change select submit keydown keypress keyup error contextmenu").split(" "), function( i, name ) {
-
-       // Handle event binding
-       jQuery.fn[ name ] = function( data, fn ) {
-               if ( fn == null ) {
-                       fn = data;
-                       data = null;
-               }
-
-               return arguments.length > 0 ?
-                       this.on( name, null, data, fn ) :
-                       this.trigger( name );
-       };
-
-       if ( rkeyEvent.test( name ) ) {
-               jQuery.event.fixHooks[ name ] = jQuery.event.keyHooks;
-       }
-
-       if ( rmouseEvent.test( name ) ) {
-               jQuery.event.fixHooks[ name ] = jQuery.event.mouseHooks;
-       }
-});
-/*!\r
- * Sizzle CSS Selector Engine\r
- * Copyright 2012 jQuery Foundation and other contributors\r
- * Released under the MIT license\r
- * http://sizzlejs.com/\r
- */\r
-(function( window, undefined ) {\r
-\r
-var cachedruns,\r
-       assertGetIdNotName,\r
-       Expr,\r
-       getText,\r
-       isXML,\r
-       contains,\r
-       compile,\r
-       sortOrder,\r
-       hasDuplicate,\r
-       outermostContext,\r
-\r
-       baseHasDuplicate = true,\r
-       strundefined = "undefined",\r
-\r
-       expando = ( "sizcache" + Math.random() ).replace( ".", "" ),\r
-\r
-       Token = String,\r
-       document = window.document,\r
-       docElem = document.documentElement,\r
-       dirruns = 0,\r
-       done = 0,\r
-       pop = [].pop,\r
-       push = [].push,\r
-       slice = [].slice,\r
-       // Use a stripped-down indexOf if a native one is unavailable\r
-       indexOf = [].indexOf || function( elem ) {\r
-               var i = 0,\r
-                       len = this.length;\r
-               for ( ; i < len; i++ ) {\r
-                       if ( this[i] === elem ) {\r
-                               return i;\r
-                       }\r
-               }\r
-               return -1;\r
-       },\r
-\r
-       // Augment a function for special use by Sizzle\r
-       markFunction = function( fn, value ) {\r
-               fn[ expando ] = value == null || value;\r
-               return fn;\r
-       },\r
-\r
-       createCache = function() {\r
-               var cache = {},\r
-                       keys = [];\r
-\r
-               return markFunction(function( key, value ) {\r
-                       // Only keep the most recent entries\r
-                       if ( keys.push( key ) > Expr.cacheLength ) {\r
-                               delete cache[ keys.shift() ];\r
-                       }\r
-\r
-                       // Retrieve with (key + " ") to avoid collision with native Object.prototype properties (see Issue #157)\r
-                       return (cache[ key + " " ] = value);\r
-               }, cache );\r
-       },\r
-\r
-       classCache = createCache(),\r
-       tokenCache = createCache(),\r
-       compilerCache = createCache(),\r
-\r
-       // Regex\r
-\r
-       // Whitespace characters http://www.w3.org/TR/css3-selectors/#whitespace\r
-       whitespace = "[\\x20\\t\\r\\n\\f]",\r
-       // http://www.w3.org/TR/css3-syntax/#characters\r
-       characterEncoding = "(?:\\\\.|[-\\w]|[^\\x00-\\xa0])+",\r
-\r
-       // Loosely modeled on CSS identifier characters\r
-       // An unquoted value should be a CSS identifier (http://www.w3.org/TR/css3-selectors/#attribute-selectors)\r
-       // Proper syntax: http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier\r
-       identifier = characterEncoding.replace( "w", "w#" ),\r
-\r
-       // Acceptable operators http://www.w3.org/TR/selectors/#attribute-selectors\r
-       operators = "([*^$|!~]?=)",\r
-       attributes = "\\[" + whitespace + "*(" + characterEncoding + ")" + whitespace +\r
-               "*(?:" + operators + whitespace + "*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|(" + identifier + ")|)|)" + whitespace + "*\\]",\r
-\r
-       // Prefer arguments not in parens/brackets,\r
-       //   then attribute selectors and non-pseudos (denoted by :),\r
-       //   then anything else\r
-       // These preferences are here to reduce the number of selectors\r
-       //   needing tokenize in the PSEUDO preFilter\r
-       pseudos = ":(" + characterEncoding + ")(?:\\((?:(['\"])((?:\\\\.|[^\\\\])*?)\\2|([^()[\\]]*|(?:(?:" + attributes + ")|[^:]|\\\\.)*|.*))\\)|)",\r
-\r
-       // For matchExpr.POS and matchExpr.needsContext\r
-       pos = ":(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + whitespace +\r
-               "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)",\r
-\r
-       // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter\r
-       rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ),\r
-\r
-       rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ),\r
-       rcombinators = new RegExp( "^" + whitespace + "*([\\x20\\t\\r\\n\\f>+~])" + whitespace + "*" ),\r
-       rpseudo = new RegExp( pseudos ),\r
-\r
-       // Easily-parseable/retrievable ID or TAG or CLASS selectors\r
-       rquickExpr = /^(?:#([\w\-]+)|(\w+)|\.([\w\-]+))$/,\r
-\r
-       rnot = /^:not/,\r
-       rsibling = /[\x20\t\r\n\f]*[+~]/,\r
-       rendsWithNot = /:not\($/,\r
-\r
-       rheader = /h\d/i,\r
-       rinputs = /input|select|textarea|button/i,\r
-\r
-       rbackslash = /\\(?!\\)/g,\r
-\r
-       matchExpr = {\r
-               "ID": new RegExp( "^#(" + characterEncoding + ")" ),\r
-               "CLASS": new RegExp( "^\\.(" + characterEncoding + ")" ),\r
-               "NAME": new RegExp( "^\\[name=['\"]?(" + characterEncoding + ")['\"]?\\]" ),\r
-               "TAG": new RegExp( "^(" + characterEncoding.replace( "w", "w*" ) + ")" ),\r
-               "ATTR": new RegExp( "^" + attributes ),\r
-               "PSEUDO": new RegExp( "^" + pseudos ),\r
-               "POS": new RegExp( pos, "i" ),\r
-               "CHILD": new RegExp( "^:(only|nth|first|last)-child(?:\\(" + whitespace +\r
-                       "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace +\r
-                       "*(\\d+)|))" + whitespace + "*\\)|)", "i" ),\r
-               // For use in libraries implementing .is()\r
-               "needsContext": new RegExp( "^" + whitespace + "*[>+~]|" + pos, "i" )\r
-       },\r
-\r
-       // Support\r
-\r
-       // Used for testing something on an element\r
-       assert = function( fn ) {\r
-               var div = document.createElement("div");\r
-\r
-               try {\r
-                       return fn( div );\r
-               } catch (e) {\r
-                       return false;\r
-               } finally {\r
-                       // release memory in IE\r
-                       div = null;\r
-               }\r
-       },\r
-\r
-       // Check if getElementsByTagName("*") returns only elements\r
-       assertTagNameNoComments = assert(function( div ) {\r
-               div.appendChild( document.createComment("") );\r
-               return !div.getElementsByTagName("*").length;\r
-       }),\r
-\r
-       // Check if getAttribute returns normalized href attributes\r
-       assertHrefNotNormalized = assert(function( div ) {\r
-               div.innerHTML = "<a href='#'></a>";\r
-               return div.firstChild && typeof div.firstChild.getAttribute !== strundefined &&\r
-                       div.firstChild.getAttribute("href") === "#";\r
-       }),\r
-\r
-       // Check if attributes should be retrieved by attribute nodes\r
-       assertAttributes = assert(function( div ) {\r
-               div.innerHTML = "<select></select>";\r
-               var type = typeof div.lastChild.getAttribute("multiple");\r
-               // IE8 returns a string for some attributes even when not present\r
-               return type !== "boolean" && type !== "string";\r
-       }),\r
-\r
-       // Check if getElementsByClassName can be trusted\r
-       assertUsableClassName = assert(function( div ) {\r
-               // Opera can't find a second classname (in 9.6)\r
-               div.innerHTML = "<div class='hidden e'></div><div class='hidden'></div>";\r
-               if ( !div.getElementsByClassName || !div.getElementsByClassName("e").length ) {\r
-                       return false;\r
-               }\r
-\r
-               // Safari 3.2 caches class attributes and doesn't catch changes\r
-               div.lastChild.className = "e";\r
-               return div.getElementsByClassName("e").length === 2;\r
-       }),\r
-\r
-       // Check if getElementById returns elements by name\r
-       // Check if getElementsByName privileges form controls or returns elements by ID\r
-       assertUsableName = assert(function( div ) {\r
-               // Inject content\r
-               div.id = expando + 0;\r
-               div.innerHTML = "<a name='" + expando + "'></a><div name='" + expando + "'></div>";\r
-               docElem.insertBefore( div, docElem.firstChild );\r
-\r
-               // Test\r
-               var pass = document.getElementsByName &&\r
-                       // buggy browsers will return fewer than the correct 2\r
-                       document.getElementsByName( expando ).length === 2 +\r
-                       // buggy browsers will return more than the correct 0\r
-                       document.getElementsByName( expando + 0 ).length;\r
-               assertGetIdNotName = !document.getElementById( expando );\r
-\r
-               // Cleanup\r
-               docElem.removeChild( div );\r
-\r
-               return pass;\r
-       });\r
-\r
-// If slice is not available, provide a backup\r
-try {\r
-       slice.call( docElem.childNodes, 0 )[0].nodeType;\r
-} catch ( e ) {\r
-       slice = function( i ) {\r
-               var elem,\r
-                       results = [];\r
-               for ( ; (elem = this[i]); i++ ) {\r
-                       results.push( elem );\r
-               }\r
-               return results;\r
-       };\r
-}\r
-\r
-function Sizzle( selector, context, results, seed ) {\r
-       results = results || [];\r
-       context = context || document;\r
-       var match, elem, xml, m,\r
-               nodeType = context.nodeType;\r
-\r
-       if ( !selector || typeof selector !== "string" ) {\r
-               return results;\r
-       }\r
-\r
-       if ( nodeType !== 1 && nodeType !== 9 ) {\r
-               return [];\r
-       }\r
-\r
-       xml = isXML( context );\r
-\r
-       if ( !xml && !seed ) {\r
-               if ( (match = rquickExpr.exec( selector )) ) {\r
-                       // Speed-up: Sizzle("#ID")\r
-                       if ( (m = match[1]) ) {\r
-                               if ( nodeType === 9 ) {\r
-                                       elem = context.getElementById( m );\r
-                                       // Check parentNode to catch when Blackberry 4.6 returns\r
-                                       // nodes that are no longer in the document #6963\r
-                                       if ( elem && elem.parentNode ) {\r
-                                               // Handle the case where IE, Opera, and Webkit return items\r
-                                               // by name instead of ID\r
-                                               if ( elem.id === m ) {\r
-                                                       results.push( elem );\r
-                                                       return results;\r
-                                               }\r
-                                       } else {\r
-                                               return results;\r
-                                       }\r
-                               } else {\r
-                                       // Context is not a document\r
-                                       if ( context.ownerDocument && (elem = context.ownerDocument.getElementById( m )) &&\r
-                                               contains( context, elem ) && elem.id === m ) {\r
-                                               results.push( elem );\r
-                                               return results;\r
-                                       }\r
-                               }\r
-\r
-                       // Speed-up: Sizzle("TAG")\r
-                       } else if ( match[2] ) {\r
-                               push.apply( results, slice.call(context.getElementsByTagName( selector ), 0) );\r
-                               return results;\r
-\r
-                       // Speed-up: Sizzle(".CLASS")\r
-                       } else if ( (m = match[3]) && assertUsableClassName && context.getElementsByClassName ) {\r
-                               push.apply( results, slice.call(context.getElementsByClassName( m ), 0) );\r
-                               return results;\r
-                       }\r
-               }\r
-       }\r
-\r
-       // All others\r
-       return select( selector.replace( rtrim, "$1" ), context, results, seed, xml );\r
-}\r
-\r
-Sizzle.matches = function( expr, elements ) {\r
-       return Sizzle( expr, null, null, elements );\r
-};\r
-\r
-Sizzle.matchesSelector = function( elem, expr ) {\r
-       return Sizzle( expr, null, null, [ elem ] ).length > 0;\r
-};\r
-\r
-// Returns a function to use in pseudos for input types\r
-function createInputPseudo( type ) {\r
-       return function( elem ) {\r
-               var name = elem.nodeName.toLowerCase();\r
-               return name === "input" && elem.type === type;\r
-       };\r
-}\r
-\r
-// Returns a function to use in pseudos for buttons\r
-function createButtonPseudo( type ) {\r
-       return function( elem ) {\r
-               var name = elem.nodeName.toLowerCase();\r
-               return (name === "input" || name === "button") && elem.type === type;\r
-       };\r
-}\r
-\r
-// Returns a function to use in pseudos for positionals\r
-function createPositionalPseudo( fn ) {\r
-       return markFunction(function( argument ) {\r
-               argument = +argument;\r
-               return markFunction(function( seed, matches ) {\r
-                       var j,\r
-                               matchIndexes = fn( [], seed.length, argument ),\r
-                               i = matchIndexes.length;\r
-\r
-                       // Match elements found at the specified indexes\r
-                       while ( i-- ) {\r
-                               if ( seed[ (j = matchIndexes[i]) ] ) {\r
-                                       seed[j] = !(matches[j] = seed[j]);\r
-                               }\r
-                       }\r
-               });\r
-       });\r
-}\r
-\r
-/**\r
- * Utility function for retrieving the text value of an array of DOM nodes\r
- * @param {Array|Element} elem\r
- */\r
-getText = Sizzle.getText = function( elem ) {\r
-       var node,\r
-               ret = "",\r
-               i = 0,\r
-               nodeType = elem.nodeType;\r
-\r
-       if ( nodeType ) {\r
-               if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {\r
-                       // Use textContent for elements\r
-                       // innerText usage removed for consistency of new lines (see #11153)\r
-                       if ( typeof elem.textContent === "string" ) {\r
-                               return elem.textContent;\r
-                       } else {\r
-                               // Traverse its children\r
-                               for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {\r
-                                       ret += getText( elem );\r
-                               }\r
-                       }\r
-               } else if ( nodeType === 3 || nodeType === 4 ) {\r
-                       return elem.nodeValue;\r
-               }\r
-               // Do not include comment or processing instruction nodes\r
-       } else {\r
-\r
-               // If no nodeType, this is expected to be an array\r
-               for ( ; (node = elem[i]); i++ ) {\r
-                       // Do not traverse comment nodes\r
-                       ret += getText( node );\r
-               }\r
-       }\r
-       return ret;\r
-};\r
-\r
-isXML = Sizzle.isXML = function( elem ) {\r
-       // documentElement is verified for cases where it doesn't yet exist\r
-       // (such as loading iframes in IE - #4833)\r
-       var documentElement = elem && (elem.ownerDocument || elem).documentElement;\r
-       return documentElement ? documentElement.nodeName !== "HTML" : false;\r
-};\r
-\r
-// Element contains another\r
-contains = Sizzle.contains = docElem.contains ?\r
-       function( a, b ) {\r
-               var adown = a.nodeType === 9 ? a.documentElement : a,\r
-                       bup = b && b.parentNode;\r
-               return a === bup || !!( bup && bup.nodeType === 1 && adown.contains && adown.contains(bup) );\r
-       } :\r
-       docElem.compareDocumentPosition ?\r
-       function( a, b ) {\r
-               return b && !!( a.compareDocumentPosition( b ) & 16 );\r
-       } :\r
-       function( a, b ) {\r
-               while ( (b = b.parentNode) ) {\r
-                       if ( b === a ) {\r
-                               return true;\r
-                       }\r
-               }\r
-               return false;\r
-       };\r
-\r
-Sizzle.attr = function( elem, name ) {\r
-       var val,\r
-               xml = isXML( elem );\r
-\r
-       if ( !xml ) {\r
-               name = name.toLowerCase();\r
-       }\r
-       if ( (val = Expr.attrHandle[ name ]) ) {\r
-               return val( elem );\r
-       }\r
-       if ( xml || assertAttributes ) {\r
-               return elem.getAttribute( name );\r
-       }\r
-       val = elem.getAttributeNode( name );\r
-       return val ?\r
-               typeof elem[ name ] === "boolean" ?\r
-                       elem[ name ] ? name : null :\r
-                       val.specified ? val.value : null :\r
-               null;\r
-};\r
-\r
-Expr = Sizzle.selectors = {\r
-\r
-       // Can be adjusted by the user\r
-       cacheLength: 50,\r
-\r
-       createPseudo: markFunction,\r
-\r
-       match: matchExpr,\r
-\r
-       // IE6/7 return a modified href\r
-       attrHandle: assertHrefNotNormalized ?\r
-               {} :\r
-               {\r
-                       "href": function( elem ) {\r
-                               return elem.getAttribute( "href", 2 );\r
-                       },\r
-                       "type": function( elem ) {\r
-                               return elem.getAttribute("type");\r
-                       }\r
-               },\r
-\r
-       find: {\r
-               "ID": assertGetIdNotName ?\r
-                       function( id, context, xml ) {\r
-                               if ( typeof context.getElementById !== strundefined && !xml ) {\r
-                                       var m = context.getElementById( id );\r
-                                       // Check parentNode to catch when Blackberry 4.6 returns\r
-                                       // nodes that are no longer in the document #6963\r
-                                       return m && m.parentNode ? [m] : [];\r
-                               }\r
-                       } :\r
-                       function( id, context, xml ) {\r
-                               if ( typeof context.getElementById !== strundefined && !xml ) {\r
-                                       var m = context.getElementById( id );\r
-\r
-                                       return m ?\r
-                                               m.id === id || typeof m.getAttributeNode !== strundefined && m.getAttributeNode("id").value === id ?\r
-                                                       [m] :\r
-                                                       undefined :\r
-                                               [];\r
-                               }\r
-                       },\r
-\r
-               "TAG": assertTagNameNoComments ?\r
-                       function( tag, context ) {\r
-                               if ( typeof context.getElementsByTagName !== strundefined ) {\r
-                                       return context.getElementsByTagName( tag );\r
-                               }\r
-                       } :\r
-                       function( tag, context ) {\r
-                               var results = context.getElementsByTagName( tag );\r
-\r
-                               // Filter out possible comments\r
-                               if ( tag === "*" ) {\r
-                                       var elem,\r
-                                               tmp = [],\r
-                                               i = 0;\r
-\r
-                                       for ( ; (elem = results[i]); i++ ) {\r
-                                               if ( elem.nodeType === 1 ) {\r
-                                                       tmp.push( elem );\r
-                                               }\r
-                                       }\r
-\r
-                                       return tmp;\r
-                               }\r
-                               return results;\r
-                       },\r
-\r
-               "NAME": assertUsableName && function( tag, context ) {\r
-                       if ( typeof context.getElementsByName !== strundefined ) {\r
-                               return context.getElementsByName( name );\r
-                       }\r
-               },\r
-\r
-               "CLASS": assertUsableClassName && function( className, context, xml ) {\r
-                       if ( typeof context.getElementsByClassName !== strundefined && !xml ) {\r
-                               return context.getElementsByClassName( className );\r
-                       }\r
-               }\r
-       },\r
-\r
-       relative: {\r
-               ">": { dir: "parentNode", first: true },\r
-               " ": { dir: "parentNode" },\r
-               "+": { dir: "previousSibling", first: true },\r
-               "~": { dir: "previousSibling" }\r
-       },\r
-\r
-       preFilter: {\r
-               "ATTR": function( match ) {\r
-                       match[1] = match[1].replace( rbackslash, "" );\r
-\r
-                       // Move the given value to match[3] whether quoted or unquoted\r
-                       match[3] = ( match[4] || match[5] || "" ).replace( rbackslash, "" );\r
-\r
-                       if ( match[2] === "~=" ) {\r
-                               match[3] = " " + match[3] + " ";\r
-                       }\r
-\r
-                       return match.slice( 0, 4 );\r
-               },\r
-\r
-               "CHILD": function( match ) {\r
-                       /* matches from matchExpr["CHILD"]\r
-                               1 type (only|nth|...)\r
-                               2 argument (even|odd|\d*|\d*n([+-]\d+)?|...)\r
-                               3 xn-component of xn+y argument ([+-]?\d*n|)\r
-                               4 sign of xn-component\r
-                               5 x of xn-component\r
-                               6 sign of y-component\r
-                               7 y of y-component\r
-                       */\r
-                       match[1] = match[1].toLowerCase();\r
-\r
-                       if ( match[1] === "nth" ) {\r
-                               // nth-child requires argument\r
-                               if ( !match[2] ) {\r
-                                       Sizzle.error( match[0] );\r
-                               }\r
-\r
-                               // numeric x and y parameters for Expr.filter.CHILD\r
-                               // remember that false/true cast respectively to 0/1\r
-                               match[3] = +( match[3] ? match[4] + (match[5] || 1) : 2 * ( match[2] === "even" || match[2] === "odd" ) );\r
-                               match[4] = +( ( match[6] + match[7] ) || match[2] === "odd" );\r
-\r
-                       // other types prohibit arguments\r
-                       } else if ( match[2] ) {\r
-                               Sizzle.error( match[0] );\r
-                       }\r
-\r
-                       return match;\r
-               },\r
-\r
-               "PSEUDO": function( match ) {\r
-                       var unquoted, excess;\r
-                       if ( matchExpr["CHILD"].test( match[0] ) ) {\r
-                               return null;\r
-                       }\r
-\r
-                       if ( match[3] ) {\r
-                               match[2] = match[3];\r
-                       } else if ( (unquoted = match[4]) ) {\r
-                               // Only check arguments that contain a pseudo\r
-                               if ( rpseudo.test(unquoted) &&\r
-                                       // Get excess from tokenize (recursively)\r
-                                       (excess = tokenize( unquoted, true )) &&\r
-                                       // advance to the next closing parenthesis\r
-                                       (excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length) ) {\r
-\r
-                                       // excess is a negative index\r
-                                       unquoted = unquoted.slice( 0, excess );\r
-                                       match[0] = match[0].slice( 0, excess );\r
-                               }\r
-                               match[2] = unquoted;\r
-                       }\r
-\r
-                       // Return only captures needed by the pseudo filter method (type and argument)\r
-                       return match.slice( 0, 3 );\r
-               }\r
-       },\r
-\r
-       filter: {\r
-               "ID": assertGetIdNotName ?\r
-                       function( id ) {\r
-                               id = id.replace( rbackslash, "" );\r
-                               return function( elem ) {\r
-                                       return elem.getAttribute("id") === id;\r
-                               };\r
-                       } :\r
-                       function( id ) {\r
-                               id = id.replace( rbackslash, "" );\r
-                               return function( elem ) {\r
-                                       var node = typeof elem.getAttributeNode !== strundefined && elem.getAttributeNode("id");\r
-                                       return node && node.value === id;\r
-                               };\r
-                       },\r
-\r
-               "TAG": function( nodeName ) {\r
-                       if ( nodeName === "*" ) {\r
-                               return function() { return true; };\r
-                       }\r
-                       nodeName = nodeName.replace( rbackslash, "" ).toLowerCase();\r
-\r
-                       return function( elem ) {\r
-                               return elem.nodeName && elem.nodeName.toLowerCase() === nodeName;\r
-                       };\r
-               },\r
-\r
-               "CLASS": function( className ) {\r
-                       var pattern = classCache[ expando ][ className + " " ];\r
-\r
-                       return pattern ||\r
-                               (pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" )) &&\r
-                               classCache( className, function( elem ) {\r
-                                       return pattern.test( elem.className || (typeof elem.getAttribute !== strundefined && elem.getAttribute("class")) || "" );\r
-                               });\r
-               },\r
-\r
-               "ATTR": function( name, operator, check ) {\r
-                       return function( elem, context ) {\r
-                               var result = Sizzle.attr( elem, name );\r
-\r
-                               if ( result == null ) {\r
-                                       return operator === "!=";\r
-                               }\r
-                               if ( !operator ) {\r
-                                       return true;\r
-                               }\r
-\r
-                               result += "";\r
-\r
-                               return operator === "=" ? result === check :\r
-                                       operator === "!=" ? result !== check :\r
-                                       operator === "^=" ? check && result.indexOf( check ) === 0 :\r
-                                       operator === "*=" ? check && result.indexOf( check ) > -1 :\r
-                                       operator === "$=" ? check && result.substr( result.length - check.length ) === check :\r
-                                       operator === "~=" ? ( " " + result + " " ).indexOf( check ) > -1 :\r
-                                       operator === "|=" ? result === check || result.substr( 0, check.length + 1 ) === check + "-" :\r
-                                       false;\r
-                       };\r
-               },\r
-\r
-               "CHILD": function( type, argument, first, last ) {\r
-\r
-                       if ( type === "nth" ) {\r
-                               return function( elem ) {\r
-                                       var node, diff,\r
-                                               parent = elem.parentNode;\r
-\r
-                                       if ( first === 1 && last === 0 ) {\r
-                                               return true;\r
-                                       }\r
-\r
-                                       if ( parent ) {\r
-                                               diff = 0;\r
-                                               for ( node = parent.firstChild; node; node = node.nextSibling ) {\r
-                                                       if ( node.nodeType === 1 ) {\r
-                                                               diff++;\r
-                                                               if ( elem === node ) {\r
-                                                                       break;\r
-                                                               }\r
-                                                       }\r
-                                               }\r
-                                       }\r
-\r
-                                       // Incorporate the offset (or cast to NaN), then check against cycle size\r
-                                       diff -= last;\r
-                                       return diff === first || ( diff % first === 0 && diff / first >= 0 );\r
-                               };\r
-                       }\r
-\r
-                       return function( elem ) {\r
-                               var node = elem;\r
-\r
-                               switch ( type ) {\r
-                                       case "only":\r
-                                       case "first":\r
-                                               while ( (node = node.previousSibling) ) {\r
-                                                       if ( node.nodeType === 1 ) {\r
-                                                               return false;\r
-                                                       }\r
-                                               }\r
-\r
-                                               if ( type === "first" ) {\r
-                                                       return true;\r
-                                               }\r
-\r
-                                               node = elem;\r
-\r
-                                               /* falls through */\r
-                                       case "last":\r
-                                               while ( (node = node.nextSibling) ) {\r
-                                                       if ( node.nodeType === 1 ) {\r
-                                                               return false;\r
-                                                       }\r
-                                               }\r
-\r
-                                               return true;\r
-                               }\r
-                       };\r
-               },\r
-\r
-               "PSEUDO": function( pseudo, argument ) {\r
-                       // pseudo-class names are case-insensitive\r
-                       // http://www.w3.org/TR/selectors/#pseudo-classes\r
-                       // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters\r
-                       // Remember that setFilters inherits from pseudos\r
-                       var args,\r
-                               fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] ||\r
-                                       Sizzle.error( "unsupported pseudo: " + pseudo );\r
-\r
-                       // The user may use createPseudo to indicate that\r
-                       // arguments are needed to create the filter function\r
-                       // just as Sizzle does\r
-                       if ( fn[ expando ] ) {\r
-                               return fn( argument );\r
-                       }\r
-\r
-                       // But maintain support for old signatures\r
-                       if ( fn.length > 1 ) {\r
-                               args = [ pseudo, pseudo, "", argument ];\r
-                               return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?\r
-                                       markFunction(function( seed, matches ) {\r
-                                               var idx,\r
-                                                       matched = fn( seed, argument ),\r
-                                                       i = matched.length;\r
-                                               while ( i-- ) {\r
-                                                       idx = indexOf.call( seed, matched[i] );\r
-                                                       seed[ idx ] = !( matches[ idx ] = matched[i] );\r
-                                               }\r
-                                       }) :\r
-                                       function( elem ) {\r
-                                               return fn( elem, 0, args );\r
-                                       };\r
-                       }\r
-\r
-                       return fn;\r
-               }\r
-       },\r
-\r
-       pseudos: {\r
-               "not": markFunction(function( selector ) {\r
-                       // Trim the selector passed to compile\r
-                       // to avoid treating leading and trailing\r
-                       // spaces as combinators\r
-                       var input = [],\r
-                               results = [],\r
-                               matcher = compile( selector.replace( rtrim, "$1" ) );\r
-\r
-                       return matcher[ expando ] ?\r
-                               markFunction(function( seed, matches, context, xml ) {\r
-                                       var elem,\r
-                                               unmatched = matcher( seed, null, xml, [] ),\r
-                                               i = seed.length;\r
-\r
-                                       // Match elements unmatched by `matcher`\r
-                                       while ( i-- ) {\r
-                                               if ( (elem = unmatched[i]) ) {\r
-                                                       seed[i] = !(matches[i] = elem);\r
-                                               }\r
-                                       }\r
-                               }) :\r
-                               function( elem, context, xml ) {\r
-                                       input[0] = elem;\r
-                                       matcher( input, null, xml, results );\r
-                                       return !results.pop();\r
-                               };\r
-               }),\r
-\r
-               "has": markFunction(function( selector ) {\r
-                       return function( elem ) {\r
-                               return Sizzle( selector, elem ).length > 0;\r
-                       };\r
-               }),\r
-\r
-               "contains": markFunction(function( text ) {\r
-                       return function( elem ) {\r
-                               return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1;\r
-                       };\r
-               }),\r
-\r
-               "enabled": function( elem ) {\r
-                       return elem.disabled === false;\r
-               },\r
-\r
-               "disabled": function( elem ) {\r
-                       return elem.disabled === true;\r
-               },\r
-\r
-               "checked": function( elem ) {\r
-                       // In CSS3, :checked should return both checked and selected elements\r
-                       // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked\r
-                       var nodeName = elem.nodeName.toLowerCase();\r
-                       return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected);\r
-               },\r
-\r
-               "selected": function( elem ) {\r
-                       // Accessing this property makes selected-by-default\r
-                       // options in Safari work properly\r
-                       if ( elem.parentNode ) {\r
-                               elem.parentNode.selectedIndex;\r
-                       }\r
-\r
-                       return elem.selected === true;\r
-               },\r
-\r
-               "parent": function( elem ) {\r
-                       return !Expr.pseudos["empty"]( elem );\r
-               },\r
-\r
-               "empty": function( elem ) {\r
-                       // http://www.w3.org/TR/selectors/#empty-pseudo\r
-                       // :empty is only affected by element nodes and content nodes(including text(3), cdata(4)),\r
-                       //   not comment, processing instructions, or others\r
-                       // Thanks to Diego Perini for the nodeName shortcut\r
-                       //   Greater than "@" means alpha characters (specifically not starting with "#" or "?")\r
-                       var nodeType;\r
-                       elem = elem.firstChild;\r
-                       while ( elem ) {\r
-                               if ( elem.nodeName > "@" || (nodeType = elem.nodeType) === 3 || nodeType === 4 ) {\r
-                                       return false;\r
-                               }\r
-                               elem = elem.nextSibling;\r
-                       }\r
-                       return true;\r
-               },\r
-\r
-               "header": function( elem ) {\r
-                       return rheader.test( elem.nodeName );\r
-               },\r
-\r
-               "text": function( elem ) {\r
-                       var type, attr;\r
-                       // IE6 and 7 will map elem.type to 'text' for new HTML5 types (search, etc)\r
-                       // use getAttribute instead to test this case\r
-                       return elem.nodeName.toLowerCase() === "input" &&\r
-                               (type = elem.type) === "text" &&\r
-                               ( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === type );\r
-               },\r
-\r
-               // Input types\r
-               "radio": createInputPseudo("radio"),\r
-               "checkbox": createInputPseudo("checkbox"),\r
-               "file": createInputPseudo("file"),\r
-               "password": createInputPseudo("password"),\r
-               "image": createInputPseudo("image"),\r
-\r
-               "submit": createButtonPseudo("submit"),\r
-               "reset": createButtonPseudo("reset"),\r
-\r
-               "button": function( elem ) {\r
-                       var name = elem.nodeName.toLowerCase();\r
-                       return name === "input" && elem.type === "button" || name === "button";\r
-               },\r
-\r
-               "input": function( elem ) {\r
-                       return rinputs.test( elem.nodeName );\r
-               },\r
-\r
-               "focus": function( elem ) {\r
-                       var doc = elem.ownerDocument;\r
-                       return elem === doc.activeElement && (!doc.hasFocus || doc.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex);\r
-               },\r
-\r
-               "active": function( elem ) {\r
-                       return elem === elem.ownerDocument.activeElement;\r
-               },\r
-\r
-               // Positional types\r
-               "first": createPositionalPseudo(function() {\r
-                       return [ 0 ];\r
-               }),\r
-\r
-               "last": createPositionalPseudo(function( matchIndexes, length ) {\r
-                       return [ length - 1 ];\r
-               }),\r
-\r
-               "eq": createPositionalPseudo(function( matchIndexes, length, argument ) {\r
-                       return [ argument < 0 ? argument + length : argument ];\r
-               }),\r
-\r
-               "even": createPositionalPseudo(function( matchIndexes, length ) {\r
-                       for ( var i = 0; i < length; i += 2 ) {\r
-                               matchIndexes.push( i );\r
-                       }\r
-                       return matchIndexes;\r
-               }),\r
-\r
-               "odd": createPositionalPseudo(function( matchIndexes, length ) {\r
-                       for ( var i = 1; i < length; i += 2 ) {\r
-                               matchIndexes.push( i );\r
-                       }\r
-                       return matchIndexes;\r
-               }),\r
-\r
-               "lt": createPositionalPseudo(function( matchIndexes, length, argument ) {\r
-                       for ( var i = argument < 0 ? argument + length : argument; --i >= 0; ) {\r
-                               matchIndexes.push( i );\r
-                       }\r
-                       return matchIndexes;\r
-               }),\r
-\r
-               "gt": createPositionalPseudo(function( matchIndexes, length, argument ) {\r
-                       for ( var i = argument < 0 ? argument + length : argument; ++i < length; ) {\r
-                               matchIndexes.push( i );\r
-                       }\r
-                       return matchIndexes;\r
-               })\r
-       }\r
-};\r
-\r
-function siblingCheck( a, b, ret ) {\r
-       if ( a === b ) {\r
-               return ret;\r
-       }\r
-\r
-       var cur = a.nextSibling;\r
-\r
-       while ( cur ) {\r
-               if ( cur === b ) {\r
-                       return -1;\r
-               }\r
-\r
-               cur = cur.nextSibling;\r
-       }\r
-\r
-       return 1;\r
-}\r
-\r
-sortOrder = docElem.compareDocumentPosition ?\r
-       function( a, b ) {\r
-               if ( a === b ) {\r
-                       hasDuplicate = true;\r
-                       return 0;\r
-               }\r
-\r
-               return ( !a.compareDocumentPosition || !b.compareDocumentPosition ?\r
-                       a.compareDocumentPosition :\r
-                       a.compareDocumentPosition(b) & 4\r
-               ) ? -1 : 1;\r
-       } :\r
-       function( a, b ) {\r
-               // The nodes are identical, we can exit early\r
-               if ( a === b ) {\r
-                       hasDuplicate = true;\r
-                       return 0;\r
-\r
-               // Fallback to using sourceIndex (in IE) if it's available on both nodes\r
-               } else if ( a.sourceIndex && b.sourceIndex ) {\r
-                       return a.sourceIndex - b.sourceIndex;\r
-               }\r
-\r
-               var al, bl,\r
-                       ap = [],\r
-                       bp = [],\r
-                       aup = a.parentNode,\r
-                       bup = b.parentNode,\r
-                       cur = aup;\r
-\r
-               // If the nodes are siblings (or identical) we can do a quick check\r
-               if ( aup === bup ) {\r
-                       return siblingCheck( a, b );\r
-\r
-               // If no parents were found then the nodes are disconnected\r
-               } else if ( !aup ) {\r
-                       return -1;\r
-\r
-               } else if ( !bup ) {\r
-                       return 1;\r
-               }\r
-\r
-               // Otherwise they're somewhere else in the tree so we need\r
-               // to build up a full list of the parentNodes for comparison\r
-               while ( cur ) {\r
-                       ap.unshift( cur );\r
-                       cur = cur.parentNode;\r
-               }\r
-\r
-               cur = bup;\r
-\r
-               while ( cur ) {\r
-                       bp.unshift( cur );\r
-                       cur = cur.parentNode;\r
-               }\r
-\r
-               al = ap.length;\r
-               bl = bp.length;\r
-\r
-               // Start walking down the tree looking for a discrepancy\r
-               for ( var i = 0; i < al && i < bl; i++ ) {\r
-                       if ( ap[i] !== bp[i] ) {\r
-                               return siblingCheck( ap[i], bp[i] );\r
-                       }\r
-               }\r
-\r
-               // We ended someplace up the tree so do a sibling check\r
-               return i === al ?\r
-                       siblingCheck( a, bp[i], -1 ) :\r
-                       siblingCheck( ap[i], b, 1 );\r
-       };\r
-\r
-// Always assume the presence of duplicates if sort doesn't\r
-// pass them to our comparison function (as in Google Chrome).\r
-[0, 0].sort( sortOrder );\r
-baseHasDuplicate = !hasDuplicate;\r
-\r
-// Document sorting and removing duplicates\r
-Sizzle.uniqueSort = function( results ) {\r
-       var elem,\r
-               duplicates = [],\r
-               i = 1,\r
-               j = 0;\r
-\r
-       hasDuplicate = baseHasDuplicate;\r
-       results.sort( sortOrder );\r
-\r
-       if ( hasDuplicate ) {\r
-               for ( ; (elem = results[i]); i++ ) {\r
-                       if ( elem === results[ i - 1 ] ) {\r
-                               j = duplicates.push( i );\r
-                       }\r
-               }\r
-               while ( j-- ) {\r
-                       results.splice( duplicates[ j ], 1 );\r
-               }\r
-       }\r
-\r
-       return results;\r
-};\r
-\r
-Sizzle.error = function( msg ) {\r
-       throw new Error( "Syntax error, unrecognized expression: " + msg );\r
-};\r
-\r
-function tokenize( selector, parseOnly ) {\r
-       var matched, match, tokens, type,\r
-               soFar, groups, preFilters,\r
-               cached = tokenCache[ expando ][ selector + " " ];\r
-\r
-       if ( cached ) {\r
-               return parseOnly ? 0 : cached.slice( 0 );\r
-       }\r
-\r
-       soFar = selector;\r
-       groups = [];\r
-       preFilters = Expr.preFilter;\r
-\r
-       while ( soFar ) {\r
-\r
-               // Comma and first run\r
-               if ( !matched || (match = rcomma.exec( soFar )) ) {\r
-                       if ( match ) {\r
-                               // Don't consume trailing commas as valid\r
-                               soFar = soFar.slice( match[0].length ) || soFar;\r
-                       }\r
-                       groups.push( tokens = [] );\r
-               }\r
-\r
-               matched = false;\r
-\r
-               // Combinators\r
-               if ( (match = rcombinators.exec( soFar )) ) {\r
-                       tokens.push( matched = new Token( match.shift() ) );\r
-                       soFar = soFar.slice( matched.length );\r
-\r
-                       // Cast descendant combinators to space\r
-                       matched.type = match[0].replace( rtrim, " " );\r
-               }\r
-\r
-               // Filters\r
-               for ( type in Expr.filter ) {\r
-                       if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] ||\r
-                               (match = preFilters[ type ]( match ))) ) {\r
-\r
-                               tokens.push( matched = new Token( match.shift() ) );\r
-                               soFar = soFar.slice( matched.length );\r
-                               matched.type = type;\r
-                               matched.matches = match;\r
-                       }\r
-               }\r
-\r
-               if ( !matched ) {\r
-                       break;\r
-               }\r
-       }\r
-\r
-       // Return the length of the invalid excess\r
-       // if we're just parsing\r
-       // Otherwise, throw an error or return tokens\r
-       return parseOnly ?\r
-               soFar.length :\r
-               soFar ?\r
-                       Sizzle.error( selector ) :\r
-                       // Cache the tokens\r
-                       tokenCache( selector, groups ).slice( 0 );\r
-}\r
-\r
-function addCombinator( matcher, combinator, base ) {\r
-       var dir = combinator.dir,\r
-               checkNonElements = base && combinator.dir === "parentNode",\r
-               doneName = done++;\r
-\r
-       return combinator.first ?\r
-               // Check against closest ancestor/preceding element\r
-               function( elem, context, xml ) {\r
-                       while ( (elem = elem[ dir ]) ) {\r
-                               if ( checkNonElements || elem.nodeType === 1  ) {\r
-                                       return matcher( elem, context, xml );\r
-                               }\r
-                       }\r
-               } :\r
-\r
-               // Check against all ancestor/preceding elements\r
-               function( elem, context, xml ) {\r
-                       // We can't set arbitrary data on XML nodes, so they don't benefit from dir caching\r
-                       if ( !xml ) {\r
-                               var cache,\r
-                                       dirkey = dirruns + " " + doneName + " ",\r
-                                       cachedkey = dirkey + cachedruns;\r
-                               while ( (elem = elem[ dir ]) ) {\r
-                                       if ( checkNonElements || elem.nodeType === 1 ) {\r
-                                               if ( (cache = elem[ expando ]) === cachedkey ) {\r
-                                                       return elem.sizset;\r
-                                               } else if ( typeof cache === "string" && cache.indexOf(dirkey) === 0 ) {\r
-                                                       if ( elem.sizset ) {\r
-                                                               return elem;\r
-                                                       }\r
-                                               } else {\r
-                                                       elem[ expando ] = cachedkey;\r
-                                                       if ( matcher( elem, context, xml ) ) {\r
-                                                               elem.sizset = true;\r
-                                                               return elem;\r
-                                                       }\r
-                                                       elem.sizset = false;\r
-                                               }\r
-                                       }\r
-                               }\r
-                       } else {\r
-                               while ( (elem = elem[ dir ]) ) {\r
-                                       if ( checkNonElements || elem.nodeType === 1 ) {\r
-                                               if ( matcher( elem, context, xml ) ) {\r
-                                                       return elem;\r
-                                               }\r
-                                       }\r
-                               }\r
-                       }\r
-               };\r
-}\r
-\r
-function elementMatcher( matchers ) {\r
-       return matchers.length > 1 ?\r
-               function( elem, context, xml ) {\r
-                       var i = matchers.length;\r
-                       while ( i-- ) {\r
-                               if ( !matchers[i]( elem, context, xml ) ) {\r
-                                       return false;\r
-                               }\r
-                       }\r
-                       return true;\r
-               } :\r
-               matchers[0];\r
-}\r
-\r
-function condense( unmatched, map, filter, context, xml ) {\r
-       var elem,\r
-               newUnmatched = [],\r
-               i = 0,\r
-               len = unmatched.length,\r
-               mapped = map != null;\r
-\r
-       for ( ; i < len; i++ ) {\r
-               if ( (elem = unmatched[i]) ) {\r
-                       if ( !filter || filter( elem, context, xml ) ) {\r
-                               newUnmatched.push( elem );\r
-                               if ( mapped ) {\r
-                                       map.push( i );\r
-                               }\r
-                       }\r
-               }\r
-       }\r
-\r
-       return newUnmatched;\r
-}\r
-\r
-function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) {\r
-       if ( postFilter && !postFilter[ expando ] ) {\r
-               postFilter = setMatcher( postFilter );\r
-       }\r
-       if ( postFinder && !postFinder[ expando ] ) {\r
-               postFinder = setMatcher( postFinder, postSelector );\r
-       }\r
-       return markFunction(function( seed, results, context, xml ) {\r
-               var temp, i, elem,\r
-                       preMap = [],\r
-                       postMap = [],\r
-                       preexisting = results.length,\r
-\r
-                       // Get initial elements from seed or context\r
-                       elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [] ),\r
-\r
-                       // Prefilter to get matcher input, preserving a map for seed-results synchronization\r
-                       matcherIn = preFilter && ( seed || !selector ) ?\r
-                               condense( elems, preMap, preFilter, context, xml ) :\r
-                               elems,\r
-\r
-                       matcherOut = matcher ?\r
-                               // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,\r
-                               postFinder || ( seed ? preFilter : preexisting || postFilter ) ?\r
-\r
-                                       // ...intermediate processing is necessary\r
-                                       [] :\r
-\r
-                                       // ...otherwise use results directly\r
-                                       results :\r
-                               matcherIn;\r
-\r
-               // Find primary matches\r
-               if ( matcher ) {\r
-                       matcher( matcherIn, matcherOut, context, xml );\r
-               }\r
-\r
-               // Apply postFilter\r
-               if ( postFilter ) {\r
-                       temp = condense( matcherOut, postMap );\r
-                       postFilter( temp, [], context, xml );\r
-\r
-                       // Un-match failing elements by moving them back to matcherIn\r
-                       i = temp.length;\r
-                       while ( i-- ) {\r
-                               if ( (elem = temp[i]) ) {\r
-                                       matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem);\r
-                               }\r
-                       }\r
-               }\r
-\r
-               if ( seed ) {\r
-                       if ( postFinder || preFilter ) {\r
-                               if ( postFinder ) {\r
-                                       // Get the final matcherOut by condensing this intermediate into postFinder contexts\r
-                                       temp = [];\r
-                                       i = matcherOut.length;\r
-                                       while ( i-- ) {\r
-                                               if ( (elem = matcherOut[i]) ) {\r
-                                                       // Restore matcherIn since elem is not yet a final match\r
-                                                       temp.push( (matcherIn[i] = elem) );\r
-                                               }\r
-                                       }\r
-                                       postFinder( null, (matcherOut = []), temp, xml );\r
-                               }\r
-\r
-                               // Move matched elements from seed to results to keep them synchronized\r
-                               i = matcherOut.length;\r
-                               while ( i-- ) {\r
-                                       if ( (elem = matcherOut[i]) &&\r
-                                               (temp = postFinder ? indexOf.call( seed, elem ) : preMap[i]) > -1 ) {\r
-\r
-                                               seed[temp] = !(results[temp] = elem);\r
-                                       }\r
-                               }\r
-                       }\r
-\r
-               // Add elements to results, through postFinder if defined\r
-               } else {\r
-                       matcherOut = condense(\r
-                               matcherOut === results ?\r
-                                       matcherOut.splice( preexisting, matcherOut.length ) :\r
-                                       matcherOut\r
-                       );\r
-                       if ( postFinder ) {\r
-                               postFinder( null, results, matcherOut, xml );\r
-                       } else {\r
-                               push.apply( results, matcherOut );\r
-                       }\r
-               }\r
-       });\r
-}\r
-\r
-function matcherFromTokens( tokens ) {\r
-       var checkContext, matcher, j,\r
-               len = tokens.length,\r
-               leadingRelative = Expr.relative[ tokens[0].type ],\r
-               implicitRelative = leadingRelative || Expr.relative[" "],\r
-               i = leadingRelative ? 1 : 0,\r
-\r
-               // The foundational matcher ensures that elements are reachable from top-level context(s)\r
-               matchContext = addCombinator( function( elem ) {\r
-                       return elem === checkContext;\r
-               }, implicitRelative, true ),\r
-               matchAnyContext = addCombinator( function( elem ) {\r
-                       return indexOf.call( checkContext, elem ) > -1;\r
-               }, implicitRelative, true ),\r
-               matchers = [ function( elem, context, xml ) {\r
-                       return ( !leadingRelative && ( xml || context !== outermostContext ) ) || (\r
-                               (checkContext = context).nodeType ?\r
-                                       matchContext( elem, context, xml ) :\r
-                                       matchAnyContext( elem, context, xml ) );\r
-               } ];\r
-\r
-       for ( ; i < len; i++ ) {\r
-               if ( (matcher = Expr.relative[ tokens[i].type ]) ) {\r
-                       matchers = [ addCombinator( elementMatcher( matchers ), matcher ) ];\r
-               } else {\r
-                       matcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches );\r
-\r
-                       // Return special upon seeing a positional matcher\r
-                       if ( matcher[ expando ] ) {\r
-                               // Find the next relative operator (if any) for proper handling\r
-                               j = ++i;\r
-                               for ( ; j < len; j++ ) {\r
-                                       if ( Expr.relative[ tokens[j].type ] ) {\r
-                                               break;\r
-                                       }\r
-                               }\r
-                               return setMatcher(\r
-                                       i > 1 && elementMatcher( matchers ),\r
-                                       i > 1 && tokens.slice( 0, i - 1 ).join("").replace( rtrim, "$1" ),\r
-                                       matcher,\r
-                                       i < j && matcherFromTokens( tokens.slice( i, j ) ),\r
-                                       j < len && matcherFromTokens( (tokens = tokens.slice( j )) ),\r
-                                       j < len && tokens.join("")\r
-                               );\r
-                       }\r
-                       matchers.push( matcher );\r
-               }\r
-       }\r
-\r
-       return elementMatcher( matchers );\r
-}\r
-\r
-function matcherFromGroupMatchers( elementMatchers, setMatchers ) {\r
-       var bySet = setMatchers.length > 0,\r
-               byElement = elementMatchers.length > 0,\r
-               superMatcher = function( seed, context, xml, results, expandContext ) {\r
-                       var elem, j, matcher,\r
-                               setMatched = [],\r
-                               matchedCount = 0,\r
-                               i = "0",\r
-                               unmatched = seed && [],\r
-                               outermost = expandContext != null,\r
-                               contextBackup = outermostContext,\r
-                               // We must always have either seed elements or context\r
-                               elems = seed || byElement && Expr.find["TAG"]( "*", expandContext && context.parentNode || context ),\r
-                               // Nested matchers should use non-integer dirruns\r
-                               dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.E);\r
-\r
-                       if ( outermost ) {\r
-                               outermostContext = context !== document && context;\r
-                               cachedruns = superMatcher.el;\r
-                       }\r
-\r
-                       // Add elements passing elementMatchers directly to results\r
-                       for ( ; (elem = elems[i]) != null; i++ ) {\r
-                               if ( byElement && elem ) {\r
-                                       for ( j = 0; (matcher = elementMatchers[j]); j++ ) {\r
-                                               if ( matcher( elem, context, xml ) ) {\r
-                                                       results.push( elem );\r
-                                                       break;\r
-                                               }\r
-                                       }\r
-                                       if ( outermost ) {\r
-                                               dirruns = dirrunsUnique;\r
-                                               cachedruns = ++superMatcher.el;\r
-                                       }\r
-                               }\r
-\r
-                               // Track unmatched elements for set filters\r
-                               if ( bySet ) {\r
-                                       // They will have gone through all possible matchers\r
-                                       if ( (elem = !matcher && elem) ) {\r
-                                               matchedCount--;\r
-                                       }\r
-\r
-                                       // Lengthen the array for every element, matched or not\r
-                                       if ( seed ) {\r
-                                               unmatched.push( elem );\r
-                                       }\r
-                               }\r
-                       }\r
-\r
-                       // Apply set filters to unmatched elements\r
-                       matchedCount += i;\r
-                       if ( bySet && i !== matchedCount ) {\r
-                               for ( j = 0; (matcher = setMatchers[j]); j++ ) {\r
-                                       matcher( unmatched, setMatched, context, xml );\r
-                               }\r
-\r
-                               if ( seed ) {\r
-                                       // Reintegrate element matches to eliminate the need for sorting\r
-                                       if ( matchedCount > 0 ) {\r
-                                               while ( i-- ) {\r
-                                                       if ( !(unmatched[i] || setMatched[i]) ) {\r
-                                                               setMatched[i] = pop.call( results );\r
-                                                       }\r
-                                               }\r
-                                       }\r
-\r
-                                       // Discard index placeholder values to get only actual matches\r
-                                       setMatched = condense( setMatched );\r
-                               }\r
-\r
-                               // Add matches to results\r
-                               push.apply( results, setMatched );\r
-\r
-                               // Seedless set matches succeeding multiple successful matchers stipulate sorting\r
-                               if ( outermost && !seed && setMatched.length > 0 &&\r
-                                       ( matchedCount + setMatchers.length ) > 1 ) {\r
-\r
-                                       Sizzle.uniqueSort( results );\r
-                               }\r
-                       }\r
-\r
-                       // Override manipulation of globals by nested matchers\r
-                       if ( outermost ) {\r
-                               dirruns = dirrunsUnique;\r
-                               outermostContext = contextBackup;\r
-                       }\r
-\r
-                       return unmatched;\r
-               };\r
-\r
-       superMatcher.el = 0;\r
-       return bySet ?\r
-               markFunction( superMatcher ) :\r
-               superMatcher;\r
-}\r
-\r
-compile = Sizzle.compile = function( selector, group /* Internal Use Only */ ) {\r
-       var i,\r
-               setMatchers = [],\r
-               elementMatchers = [],\r
-               cached = compilerCache[ expando ][ selector + " " ];\r
-\r
-       if ( !cached ) {\r
-               // Generate a function of recursive functions that can be used to check each element\r
-               if ( !group ) {\r
-                       group = tokenize( selector );\r
-               }\r
-               i = group.length;\r
-               while ( i-- ) {\r
-                       cached = matcherFromTokens( group[i] );\r
-                       if ( cached[ expando ] ) {\r
-                               setMatchers.push( cached );\r
-                       } else {\r
-                               elementMatchers.push( cached );\r
-                       }\r
-               }\r
-\r
-               // Cache the compiled function\r
-               cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) );\r
-       }\r
-       return cached;\r
-};\r
-\r
-function multipleContexts( selector, contexts, results ) {\r
-       var i = 0,\r
-               len = contexts.length;\r
-       for ( ; i < len; i++ ) {\r
-               Sizzle( selector, contexts[i], results );\r
-       }\r
-       return results;\r
-}\r
-\r
-function select( selector, context, results, seed, xml ) {\r
-       var i, tokens, token, type, find,\r
-               match = tokenize( selector ),\r
-               j = match.length;\r
-\r
-       if ( !seed ) {\r
-               // Try to minimize operations if there is only one group\r
-               if ( match.length === 1 ) {\r
-\r
-                       // Take a shortcut and set the context if the root selector is an ID\r
-                       tokens = match[0] = match[0].slice( 0 );\r
-                       if ( tokens.length > 2 && (token = tokens[0]).type === "ID" &&\r
-                                       context.nodeType === 9 && !xml &&\r
-                                       Expr.relative[ tokens[1].type ] ) {\r
-\r
-                               context = Expr.find["ID"]( token.matches[0].replace( rbackslash, "" ), context, xml )[0];\r
-                               if ( !context ) {\r
-                                       return results;\r
-                               }\r
-\r
-                               selector = selector.slice( tokens.shift().length );\r
-                       }\r
-\r
-                       // Fetch a seed set for right-to-left matching\r
-                       for ( i = matchExpr["POS"].test( selector ) ? -1 : tokens.length - 1; i >= 0; i-- ) {\r
-                               token = tokens[i];\r
-\r
-                               // Abort if we hit a combinator\r
-                               if ( Expr.relative[ (type = token.type) ] ) {\r
-                                       break;\r
-                               }\r
-                               if ( (find = Expr.find[ type ]) ) {\r
-                                       // Search, expanding context for leading sibling combinators\r
-                                       if ( (seed = find(\r
-                                               token.matches[0].replace( rbackslash, "" ),\r
-                                               rsibling.test( tokens[0].type ) && context.parentNode || context,\r
-                                               xml\r
-                                       )) ) {\r
-\r
-                                               // If seed is empty or no tokens remain, we can return early\r
-                                               tokens.splice( i, 1 );\r
-                                               selector = seed.length && tokens.join("");\r
-                                               if ( !selector ) {\r
-                                                       push.apply( results, slice.call( seed, 0 ) );\r
-                                                       return results;\r
-                                               }\r
-\r
-                                               break;\r
-                                       }\r
-                               }\r
-                       }\r
-               }\r
-       }\r
-\r
-       // Compile and execute a filtering function\r
-       // Provide `match` to avoid retokenization if we modified the selector above\r
-       compile( selector, match )(\r
-               seed,\r
-               context,\r
-               xml,\r
-               results,\r
-               rsibling.test( selector )\r
-       );\r
-       return results;\r
-}\r
-\r
-if ( document.querySelectorAll ) {\r
-       (function() {\r
-               var disconnectedMatch,\r
-                       oldSelect = select,\r
-                       rescape = /'|\\/g,\r
-                       rattributeQuotes = /\=[\x20\t\r\n\f]*([^'"\]]*)[\x20\t\r\n\f]*\]/g,\r
-\r
-                       // qSa(:focus) reports false when true (Chrome 21), no need to also add to buggyMatches since matches checks buggyQSA\r
-                       // A support test would require too much code (would include document ready)\r
-                       rbuggyQSA = [ ":focus" ],\r
-\r
-                       // matchesSelector(:active) reports false when true (IE9/Opera 11.5)\r
-                       // A support test would require too much code (would include document ready)\r
-                       // just skip matchesSelector for :active\r
-                       rbuggyMatches = [ ":active" ],\r
-                       matches = docElem.matchesSelector ||\r
-                               docElem.mozMatchesSelector ||\r
-                               docElem.webkitMatchesSelector ||\r
-                               docElem.oMatchesSelector ||\r
-                               docElem.msMatchesSelector;\r
-\r
-               // Build QSA regex\r
-               // Regex strategy adopted from Diego Perini\r
-               assert(function( div ) {\r
-                       // Select is set to empty string on purpose\r
-                       // This is to test IE's treatment of not explictly\r
-                       // setting a boolean content attribute,\r
-                       // since its presence should be enough\r
-                       // http://bugs.jquery.com/ticket/12359\r
-                       div.innerHTML = "<select><option selected=''></option></select>";\r
-\r
-                       // IE8 - Some boolean attributes are not treated correctly\r
-                       if ( !div.querySelectorAll("[selected]").length ) {\r
-                               rbuggyQSA.push( "\\[" + whitespace + "*(?:checked|disabled|ismap|multiple|readonly|selected|value)" );\r
-                       }\r
-\r
-                       // Webkit/Opera - :checked should return selected option elements\r
-                       // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked\r
-                       // IE8 throws error here (do not put tests after this one)\r
-                       if ( !div.querySelectorAll(":checked").length ) {\r
-                               rbuggyQSA.push(":checked");\r
-                       }\r
-               });\r
-\r
-               assert(function( div ) {\r
-\r
-                       // Opera 10-12/IE9 - ^= $= *= and empty values\r
-                       // Should not select anything\r
-                       div.innerHTML = "<p test=''></p>";\r
-                       if ( div.querySelectorAll("[test^='']").length ) {\r
-                               rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:\"\"|'')" );\r
-                       }\r
-\r
-                       // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)\r
-                       // IE8 throws error here (do not put tests after this one)\r
-                       div.innerHTML = "<input type='hidden'/>";\r
-                       if ( !div.querySelectorAll(":enabled").length ) {\r
-                               rbuggyQSA.push(":enabled", ":disabled");\r
-                       }\r
-               });\r
-\r
-               // rbuggyQSA always contains :focus, so no need for a length check\r
-               rbuggyQSA = /* rbuggyQSA.length && */ new RegExp( rbuggyQSA.join("|") );\r
-\r
-               select = function( selector, context, results, seed, xml ) {\r
-                       // Only use querySelectorAll when not filtering,\r
-                       // when this is not xml,\r
-                       // and when no QSA bugs apply\r
-                       if ( !seed && !xml && !rbuggyQSA.test( selector ) ) {\r
-                               var groups, i,\r
-                                       old = true,\r
-                                       nid = expando,\r
-                                       newContext = context,\r
-                                       newSelector = context.nodeType === 9 && selector;\r
-\r
-                               // qSA works strangely on Element-rooted queries\r
-                               // We can work around this by specifying an extra ID on the root\r
-                               // and working up from there (Thanks to Andrew Dupont for the technique)\r
-                               // IE 8 doesn't work on object elements\r
-                               if ( context.nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) {\r
-                                       groups = tokenize( selector );\r
-\r
-                                       if ( (old = context.getAttribute("id")) ) {\r
-                                               nid = old.replace( rescape, "\\$&" );\r
-                                       } else {\r
-                                               context.setAttribute( "id", nid );\r
-                                       }\r
-                                       nid = "[id='" + nid + "'] ";\r
-\r
-                                       i = groups.length;\r
-                                       while ( i-- ) {\r
-                                               groups[i] = nid + groups[i].join("");\r
-                                       }\r
-                                       newContext = rsibling.test( selector ) && context.parentNode || context;\r
-                                       newSelector = groups.join(",");\r
-                               }\r
-\r
-                               if ( newSelector ) {\r
-                                       try {\r
-                                               push.apply( results, slice.call( newContext.querySelectorAll(\r
-                                                       newSelector\r
-                                               ), 0 ) );\r
-                                               return results;\r
-                                       } catch(qsaError) {\r
-                                       } finally {\r
-                                               if ( !old ) {\r
-                                                       context.removeAttribute("id");\r
-                                               }\r
-                                       }\r
-                               }\r
-                       }\r
-\r
-                       return oldSelect( selector, context, results, seed, xml );\r
-               };\r
-\r
-               if ( matches ) {\r
-                       assert(function( div ) {\r
-                               // Check to see if it's possible to do matchesSelector\r
-                               // on a disconnected node (IE 9)\r
-                               disconnectedMatch = matches.call( div, "div" );\r
-\r
-                               // This should fail with an exception\r
-                               // Gecko does not error, returns false instead\r
-                               try {\r
-                                       matches.call( div, "[test!='']:sizzle" );\r
-                                       rbuggyMatches.push( "!=", pseudos );\r
-                               } catch ( e ) {}\r
-                       });\r
-\r
-                       // rbuggyMatches always contains :active and :focus, so no need for a length check\r
-                       rbuggyMatches = /* rbuggyMatches.length && */ new RegExp( rbuggyMatches.join("|") );\r
-\r
-                       Sizzle.matchesSelector = function( elem, expr ) {\r
-                               // Make sure that attribute selectors are quoted\r
-                               expr = expr.replace( rattributeQuotes, "='$1']" );\r
-\r
-                               // rbuggyMatches always contains :active, so no need for an existence check\r
-                               if ( !isXML( elem ) && !rbuggyMatches.test( expr ) && !rbuggyQSA.test( expr ) ) {\r
-                                       try {\r
-                                               var ret = matches.call( elem, expr );\r
-\r
-                                               // IE 9's matchesSelector returns false on disconnected nodes\r
-                                               if ( ret || disconnectedMatch ||\r
-                                                               // As well, disconnected nodes are said to be in a document\r
-                                                               // fragment in IE 9\r
-                                                               elem.document && elem.document.nodeType !== 11 ) {\r
-                                                       return ret;\r
-                                               }\r
-                                       } catch(e) {}\r
-                               }\r
-\r
-                               return Sizzle( expr, null, null, [ elem ] ).length > 0;\r
-                       };\r
-               }\r
-       })();\r
-}\r
-\r
-// Deprecated\r
-Expr.pseudos["nth"] = Expr.pseudos["eq"];\r
-\r
-// Back-compat\r
-function setFilters() {}\r
-Expr.filters = setFilters.prototype = Expr.pseudos;\r
-Expr.setFilters = new setFilters();\r
-\r
-// Override sizzle attribute retrieval
-Sizzle.attr = jQuery.attr;
-jQuery.find = Sizzle;
-jQuery.expr = Sizzle.selectors;
-jQuery.expr[":"] = jQuery.expr.pseudos;
-jQuery.unique = Sizzle.uniqueSort;
-jQuery.text = Sizzle.getText;
-jQuery.isXMLDoc = Sizzle.isXML;
-jQuery.contains = Sizzle.contains;
-\r
-\r
-})( window );\r
-var runtil = /Until$/,
-       rparentsprev = /^(?:parents|prev(?:Until|All))/,
-       isSimple = /^.[^:#\[\.,]*$/,
-       rneedsContext = jQuery.expr.match.needsContext,
-       // methods guaranteed to produce a unique set when starting from a unique set
-       guaranteedUnique = {
-               children: true,
-               contents: true,
-               next: true,
-               prev: true
-       };
-
-jQuery.fn.extend({
-       find: function( selector ) {
-               var i, l, length, n, r, ret,
-                       self = this;
-
-               if ( typeof selector !== "string" ) {
-                       return jQuery( selector ).filter(function() {
-                               for ( i = 0, l = self.length; i < l; i++ ) {
-                                       if ( jQuery.contains( self[ i ], this ) ) {
-                                               return true;
-                                       }
-                               }
-                       });
-               }
-
-               ret = this.pushStack( "", "find", selector );
-
-               for ( i = 0, l = this.length; i < l; i++ ) {
-                       length = ret.length;
-                       jQuery.find( selector, this[i], ret );
-
-                       if ( i > 0 ) {
-                               // Make sure that the results are unique
-                               for ( n = length; n < ret.length; n++ ) {
-                                       for ( r = 0; r < length; r++ ) {
-                                               if ( ret[r] === ret[n] ) {
-                                                       ret.splice(n--, 1);
-                                                       break;
-                                               }
-                                       }
-                               }
-                       }
-               }
-
-               return ret;
-       },
-
-       has: function( target ) {
-               var i,
-                       targets = jQuery( target, this ),
-                       len = targets.length;
-
-               return this.filter(function() {
-                       for ( i = 0; i < len; i++ ) {
-                               if ( jQuery.contains( this, targets[i] ) ) {
-                                       return true;
-                               }
-                       }
-               });
-       },
-
-       not: function( selector ) {
-               return this.pushStack( winnow(this, selector, false), "not", selector);
-       },
-
-       filter: function( selector ) {
-               return this.pushStack( winnow(this, selector, true), "filter", selector );
-       },
-
-       is: function( selector ) {
-               return !!selector && (
-                       typeof selector === "string" ?
-                               // If this is a positional/relative selector, check membership in the returned set
-                               // so $("p:first").is("p:last") won't return true for a doc with two "p".
-                               rneedsContext.test( selector ) ?
-                                       jQuery( selector, this.context ).index( this[0] ) >= 0 :
-                                       jQuery.filter( selector, this ).length > 0 :
-                               this.filter( selector ).length > 0 );
-       },
-
-       closest: function( selectors, context ) {
-               var cur,
-                       i = 0,
-                       l = this.length,
-                       ret = [],
-                       pos = rneedsContext.test( selectors ) || typeof selectors !== "string" ?
-                               jQuery( selectors, context || this.context ) :
-                               0;
-
-               for ( ; i < l; i++ ) {
-                       cur = this[i];
-
-                       while ( cur && cur.ownerDocument && cur !== context && cur.nodeType !== 11 ) {
-                               if ( pos ? pos.index(cur) > -1 : jQuery.find.matchesSelector(cur, selectors) ) {
-                                       ret.push( cur );
-                                       break;
-                               }
-                               cur = cur.parentNode;
-                       }
-               }
-
-               ret = ret.length > 1 ? jQuery.unique( ret ) : ret;
-
-               return this.pushStack( ret, "closest", selectors );
-       },
-
-       // Determine the position of an element within
-       // the matched set of elements
-       index: function( elem ) {
-
-               // No argument, return index in parent
-               if ( !elem ) {
-                       return ( this[0] && this[0].parentNode ) ? this.prevAll().length : -1;
-               }
-
-               // index in selector
-               if ( typeof elem === "string" ) {
-                       return jQuery.inArray( this[0], jQuery( elem ) );
-               }
-
-               // Locate the position of the desired element
-               return jQuery.inArray(
-                       // If it receives a jQuery object, the first element is used
-                       elem.jquery ? elem[0] : elem, this );
-       },
-
-       add: function( selector, context ) {
-               var set = typeof selector === "string" ?
-                               jQuery( selector, context ) :
-                               jQuery.makeArray( selector && selector.nodeType ? [ selector ] : selector ),
-                       all = jQuery.merge( this.get(), set );
-
-               return this.pushStack( isDisconnected( set[0] ) || isDisconnected( all[0] ) ?
-                       all :
-                       jQuery.unique( all ) );
-       },
-
-       addBack: function( selector ) {
-               return this.add( selector == null ?
-                       this.prevObject : this.prevObject.filter(selector)
-               );
-       }
-});
-
-jQuery.fn.andSelf = jQuery.fn.addBack;
-
-// A painfully simple check to see if an element is disconnected
-// from a document (should be improved, where feasible).
-function isDisconnected( node ) {
-       return !node || !node.parentNode || node.parentNode.nodeType === 11;
-}
-
-function sibling( cur, dir ) {
-       do {
-               cur = cur[ dir ];
-       } while ( cur && cur.nodeType !== 1 );
-
-       return cur;
-}
-
-jQuery.each({
-       parent: function( elem ) {
-               var parent = elem.parentNode;
-               return parent && parent.nodeType !== 11 ? parent : null;
-       },
-       parents: function( elem ) {
-               return jQuery.dir( elem, "parentNode" );
-       },
-       parentsUntil: function( elem, i, until ) {
-               return jQuery.dir( elem, "parentNode", until );
-       },
-       next: function( elem ) {
-               return sibling( elem, "nextSibling" );
-       },
-       prev: function( elem ) {
-               return sibling( elem, "previousSibling" );
-       },
-       nextAll: function( elem ) {
-               return jQuery.dir( elem, "nextSibling" );
-       },
-       prevAll: function( elem ) {
-               return jQuery.dir( elem, "previousSibling" );
-       },
-       nextUntil: function( elem, i, until ) {
-               return jQuery.dir( elem, "nextSibling", until );
-       },
-       prevUntil: function( elem, i, until ) {
-               return jQuery.dir( elem, "previousSibling", until );
-       },
-       siblings: function( elem ) {
-               return jQuery.sibling( ( elem.parentNode || {} ).firstChild, elem );
-       },
-       children: function( elem ) {
-               return jQuery.sibling( elem.firstChild );
-       },
-       contents: function( elem ) {
-               return jQuery.nodeName( elem, "iframe" ) ?
-                       elem.contentDocument || elem.contentWindow.document :
-                       jQuery.merge( [], elem.childNodes );
-       }
-}, function( name, fn ) {
-       jQuery.fn[ name ] = function( until, selector ) {
-               var ret = jQuery.map( this, fn, until );
-
-               if ( !runtil.test( name ) ) {
-                       selector = until;
-               }
-
-               if ( selector && typeof selector === "string" ) {
-                       ret = jQuery.filter( selector, ret );
-               }
-
-               ret = this.length > 1 && !guaranteedUnique[ name ] ? jQuery.unique( ret ) : ret;
-
-               if ( this.length > 1 && rparentsprev.test( name ) ) {
-                       ret = ret.reverse();
-               }
-
-               return this.pushStack( ret, name, core_slice.call( arguments ).join(",") );
-       };
-});
-
-jQuery.extend({
-       filter: function( expr, elems, not ) {
-               if ( not ) {
-                       expr = ":not(" + expr + ")";
-               }
-
-               return elems.length === 1 ?
-                       jQuery.find.matchesSelector(elems[0], expr) ? [ elems[0] ] : [] :
-                       jQuery.find.matches(expr, elems);
-       },
-
-       dir: function( elem, dir, until ) {
-               var matched = [],
-                       cur = elem[ dir ];
-
-               while ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) {
-                       if ( cur.nodeType === 1 ) {
-                               matched.push( cur );
-                       }
-                       cur = cur[dir];
-               }
-               return matched;
-       },
-
-       sibling: function( n, elem ) {
-               var r = [];
-
-               for ( ; n; n = n.nextSibling ) {
-                       if ( n.nodeType === 1 && n !== elem ) {
-                               r.push( n );
-                       }
-               }
-
-               return r;
-       }
-});
-
-// Implement the identical functionality for filter and not
-function winnow( elements, qualifier, keep ) {
-
-       // Can't pass null or undefined to indexOf in Firefox 4
-       // Set to 0 to skip string check
-       qualifier = qualifier || 0;
-
-       if ( jQuery.isFunction( qualifier ) ) {
-               return jQuery.grep(elements, function( elem, i ) {
-                       var retVal = !!qualifier.call( elem, i, elem );
-                       return retVal === keep;
-               });
-
-       } else if ( qualifier.nodeType ) {
-               return jQuery.grep(elements, function( elem, i ) {
-                       return ( elem === qualifier ) === keep;
-               });
-
-       } else if ( typeof qualifier === "string" ) {
-               var filtered = jQuery.grep(elements, function( elem ) {
-                       return elem.nodeType === 1;
-               });
-
-               if ( isSimple.test( qualifier ) ) {
-                       return jQuery.filter(qualifier, filtered, !keep);
-               } else {
-                       qualifier = jQuery.filter( qualifier, filtered );
-               }
-       }
-
-       return jQuery.grep(elements, function( elem, i ) {
-               return ( jQuery.inArray( elem, qualifier ) >= 0 ) === keep;
-       });
-}
-function createSafeFragment( document ) {
-       var list = nodeNames.split( "|" ),
-       safeFrag = document.createDocumentFragment();
-
-       if ( safeFrag.createElement ) {
-               while ( list.length ) {
-                       safeFrag.createElement(
-                               list.pop()
-                       );
-               }
-       }
-       return safeFrag;
-}
-
-var nodeNames = "abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|" +
-               "header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",
-       rinlinejQuery = / jQuery\d+="(?:null|\d+)"/g,
-       rleadingWhitespace = /^\s+/,
-       rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,
-       rtagName = /<([\w:]+)/,
-       rtbody = /<tbody/i,
-       rhtml = /<|&#?\w+;/,
-       rnoInnerhtml = /<(?:script|style|link)/i,
-       rnocache = /<(?:script|object|embed|option|style)/i,
-       rnoshimcache = new RegExp("<(?:" + nodeNames + ")[\\s/>]", "i"),
-       rcheckableType = /^(?:checkbox|radio)$/,
-       // checked="checked" or checked
-       rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,
-       rscriptType = /\/(java|ecma)script/i,
-       rcleanScript = /^\s*<!(?:\[CDATA\[|\-\-)|[\]\-]{2}>\s*$/g,
-       wrapMap = {
-               option: [ 1, "<select multiple='multiple'>", "</select>" ],
-               legend: [ 1, "<fieldset>", "</fieldset>" ],
-               thead: [ 1, "<table>", "</table>" ],
-               tr: [ 2, "<table><tbody>", "</tbody></table>" ],
-               td: [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ],
-               col: [ 2, "<table><tbody></tbody><colgroup>", "</colgroup></table>" ],
-               area: [ 1, "<map>", "</map>" ],
-               _default: [ 0, "", "" ]
-       },
-       safeFragment = createSafeFragment( document ),
-       fragmentDiv = safeFragment.appendChild( document.createElement("div") );
-
-wrapMap.optgroup = wrapMap.option;
-wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
-wrapMap.th = wrapMap.td;
-
-// IE6-8 can't serialize link, script, style, or any html5 (NoScope) tags,
-// unless wrapped in a div with non-breaking characters in front of it.
-if ( !jQuery.support.htmlSerialize ) {
-       wrapMap._default = [ 1, "X<div>", "</div>" ];
-}
-
-jQuery.fn.extend({
-       text: function( value ) {
-               return jQuery.access( this, function( value ) {
-                       return value === undefined ?
-                               jQuery.text( this ) :
-                               this.empty().append( ( this[0] && this[0].ownerDocument || document ).createTextNode( value ) );
-               }, null, value, arguments.length );
-       },
-
-       wrapAll: function( html ) {
-               if ( jQuery.isFunction( html ) ) {
-                       return this.each(function(i) {
-                               jQuery(this).wrapAll( html.call(this, i) );
-                       });
-               }
-
-               if ( this[0] ) {
-                       // The elements to wrap the target around
-                       var wrap = jQuery( html, this[0].ownerDocument ).eq(0).clone(true);
-
-                       if ( this[0].parentNode ) {
-                               wrap.insertBefore( this[0] );
-                       }
-
-                       wrap.map(function() {
-                               var elem = this;
-
-                               while ( elem.firstChild && elem.firstChild.nodeType === 1 ) {
-                                       elem = elem.firstChild;
-                               }
-
-                               return elem;
-                       }).append( this );
-               }
-
-               return this;
-       },
-
-       wrapInner: function( html ) {
-               if ( jQuery.isFunction( html ) ) {
-                       return this.each(function(i) {
-                               jQuery(this).wrapInner( html.call(this, i) );
-                       });
-               }
-
-               return this.each(function() {
-                       var self = jQuery( this ),
-                               contents = self.contents();
-
-                       if ( contents.length ) {
-                               contents.wrapAll( html );
-
-                       } else {
-                               self.append( html );
-                       }
-               });
-       },
-
-       wrap: function( html ) {
-               var isFunction = jQuery.isFunction( html );
-
-               return this.each(function(i) {
-                       jQuery( this ).wrapAll( isFunction ? html.call(this, i) : html );
-               });
-       },
-
-       unwrap: function() {
-               return this.parent().each(function() {
-                       if ( !jQuery.nodeName( this, "body" ) ) {
-                               jQuery( this ).replaceWith( this.childNodes );
-                       }
-               }).end();
-       },
-
-       append: function() {
-               return this.domManip(arguments, true, function( elem ) {
-                       if ( this.nodeType === 1 || this.nodeType === 11 ) {
-                               this.appendChild( elem );
-                       }
-               });
-       },
-
-       prepend: function() {
-               return this.domManip(arguments, true, function( elem ) {
-                       if ( this.nodeType === 1 || this.nodeType === 11 ) {
-                               this.insertBefore( elem, this.firstChild );
-                       }
-               });
-       },
-
-       before: function() {
-               if ( !isDisconnected( this[0] ) ) {
-                       return this.domManip(arguments, false, function( elem ) {
-                               this.parentNode.insertBefore( elem, this );
-                       });
-               }
-
-               if ( arguments.length ) {
-                       var set = jQuery.clean( arguments );
-                       return this.pushStack( jQuery.merge( set, this ), "before", this.selector );
-               }
-       },
-
-       after: function() {
-               if ( !isDisconnected( this[0] ) ) {
-                       return this.domManip(arguments, false, function( elem ) {
-                               this.parentNode.insertBefore( elem, this.nextSibling );
-                       });
-               }
-
-               if ( arguments.length ) {
-                       var set = jQuery.clean( arguments );
-                       return this.pushStack( jQuery.merge( this, set ), "after", this.selector );
-               }
-       },
-
-       // keepData is for internal use only--do not document
-       remove: function( selector, keepData ) {
-               var elem,
-                       i = 0;
-
-               for ( ; (elem = this[i]) != null; i++ ) {
-                       if ( !selector || jQuery.filter( selector, [ elem ] ).length ) {
-                               if ( !keepData && elem.nodeType === 1 ) {
-                                       jQuery.cleanData( elem.getElementsByTagName("*") );
-                                       jQuery.cleanData( [ elem ] );
-                               }
-
-                               if ( elem.parentNode ) {
-                                       elem.parentNode.removeChild( elem );
-                               }
-                       }
-               }
-
-               return this;
-       },
-
-       empty: function() {
-               var elem,
-                       i = 0;
-
-               for ( ; (elem = this[i]) != null; i++ ) {
-                       // Remove element nodes and prevent memory leaks
-                       if ( elem.nodeType === 1 ) {
-                               jQuery.cleanData( elem.getElementsByTagName("*") );
-                       }
-
-                       // Remove any remaining nodes
-                       while ( elem.firstChild ) {
-                               elem.removeChild( elem.firstChild );
-                       }
-               }
-
-               return this;
-       },
-
-       clone: function( dataAndEvents, deepDataAndEvents ) {
-               dataAndEvents = dataAndEvents == null ? false : dataAndEvents;
-               deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;
-
-               return this.map( function () {
-                       return jQuery.clone( this, dataAndEvents, deepDataAndEvents );
-               });
-       },
-
-       html: function( value ) {
-               return jQuery.access( this, function( value ) {
-                       var elem = this[0] || {},
-                               i = 0,
-                               l = this.length;
-
-                       if ( value === undefined ) {
-                               return elem.nodeType === 1 ?
-                                       elem.innerHTML.replace( rinlinejQuery, "" ) :
-                                       undefined;
-                       }
-
-                       // See if we can take a shortcut and just use innerHTML
-                       if ( typeof value === "string" && !rnoInnerhtml.test( value ) &&
-                               ( jQuery.support.htmlSerialize || !rnoshimcache.test( value )  ) &&
-                               ( jQuery.support.leadingWhitespace || !rleadingWhitespace.test( value ) ) &&
-                               !wrapMap[ ( rtagName.exec( value ) || ["", ""] )[1].toLowerCase() ] ) {
-
-                               value = value.replace( rxhtmlTag, "<$1></$2>" );
-
-                               try {
-                                       for (; i < l; i++ ) {
-                                               // Remove element nodes and prevent memory leaks
-                                               elem = this[i] || {};
-                                               if ( elem.nodeType === 1 ) {
-                                                       jQuery.cleanData( elem.getElementsByTagName( "*" ) );
-                                                       elem.innerHTML = value;
-                                               }
-                                       }
-
-                                       elem = 0;
-
-                               // If using innerHTML throws an exception, use the fallback method
-                               } catch(e) {}
-                       }
-
-                       if ( elem ) {
-                               this.empty().append( value );
-                       }
-               }, null, value, arguments.length );
-       },
-
-       replaceWith: function( value ) {
-               if ( !isDisconnected( this[0] ) ) {
-                       // Make sure that the elements are removed from the DOM before they are inserted
-                       // this can help fix replacing a parent with child elements
-                       if ( jQuery.isFunction( value ) ) {
-                               return this.each(function(i) {
-                                       var self = jQuery(this), old = self.html();
-                                       self.replaceWith( value.call( this, i, old ) );
-                               });
-                       }
-
-                       if ( typeof value !== "string" ) {
-                               value = jQuery( value ).detach();
-                       }
-
-                       return this.each(function() {
-                               var next = this.nextSibling,
-                                       parent = this.parentNode;
-
-                               jQuery( this ).remove();
-
-                               if ( next ) {
-                                       jQuery(next).before( value );
-                               } else {
-                                       jQuery(parent).append( value );
-                               }
-                       });
-               }
-
-               return this.length ?
-                       this.pushStack( jQuery(jQuery.isFunction(value) ? value() : value), "replaceWith", value ) :
-                       this;
-       },
-
-       detach: function( selector ) {
-               return this.remove( selector, true );
-       },
-
-       domManip: function( args, table, callback ) {
-
-               // Flatten any nested arrays
-               args = [].concat.apply( [], args );
-
-               var results, first, fragment, iNoClone,
-                       i = 0,
-                       value = args[0],
-                       scripts = [],
-                       l = this.length;
-
-               // We can't cloneNode fragments that contain checked, in WebKit
-               if ( !jQuery.support.checkClone && l > 1 && typeof value === "string" && rchecked.test( value ) ) {
-                       return this.each(function() {
-                               jQuery(this).domManip( args, table, callback );
-                       });
-               }
-
-               if ( jQuery.isFunction(value) ) {
-                       return this.each(function(i) {
-                               var self = jQuery(this);
-                               args[0] = value.call( this, i, table ? self.html() : undefined );
-                               self.domManip( args, table, callback );
-                       });
-               }
-
-               if ( this[0] ) {
-                       results = jQuery.buildFragment( args, this, scripts );
-                       fragment = results.fragment;
-                       first = fragment.firstChild;
-
-                       if ( fragment.childNodes.length === 1 ) {
-                               fragment = first;
-                       }
-
-                       if ( first ) {
-                               table = table && jQuery.nodeName( first, "tr" );
-
-                               // Use the original fragment for the last item instead of the first because it can end up
-                               // being emptied incorrectly in certain situations (#8070).
-                               // Fragments from the fragment cache must always be cloned and never used in place.
-                               for ( iNoClone = results.cacheable || l - 1; i < l; i++ ) {
-                                       callback.call(
-                                               table && jQuery.nodeName( this[i], "table" ) ?
-                                                       findOrAppend( this[i], "tbody" ) :
-                                                       this[i],
-                                               i === iNoClone ?
-                                                       fragment :
-                                                       jQuery.clone( fragment, true, true )
-                                       );
-                               }
-                       }
-
-                       // Fix #11809: Avoid leaking memory
-                       fragment = first = null;
-
-                       if ( scripts.length ) {
-                               jQuery.each( scripts, function( i, elem ) {
-                                       if ( elem.src ) {
-                                               if ( jQuery.ajax ) {
-                                                       jQuery.ajax({
-                                                               url: elem.src,
-                                                               type: "GET",
-                                                               dataType: "script",
-                                                               async: false,
-                                                               global: false,
-                                                               "throws": true
-                                                       });
-                                               } else {
-                                                       jQuery.error("no ajax");
-                                               }
-                                       } else {
-                                               jQuery.globalEval( ( elem.text || elem.textContent || elem.innerHTML || "" ).replace( rcleanScript, "" ) );
-                                       }
-
-                                       if ( elem.parentNode ) {
-                                               elem.parentNode.removeChild( elem );
-                                       }
-                               });
-                       }
-               }
-
-               return this;
-       }
-});
-
-function findOrAppend( elem, tag ) {
-       return elem.getElementsByTagName( tag )[0] || elem.appendChild( elem.ownerDocument.createElement( tag ) );
-}
-
-function cloneCopyEvent( src, dest ) {
-
-       if ( dest.nodeType !== 1 || !jQuery.hasData( src ) ) {
-               return;
-       }
-
-       var type, i, l,
-               oldData = jQuery._data( src ),
-               curData = jQuery._data( dest, oldData ),
-               events = oldData.events;
-
-       if ( events ) {
-               delete curData.handle;
-               curData.events = {};
-
-               for ( type in events ) {
-                       for ( i = 0, l = events[ type ].length; i < l; i++ ) {
-                               jQuery.event.add( dest, type, events[ type ][ i ] );
-                       }
-               }
-       }
-
-       // make the cloned public data object a copy from the original
-       if ( curData.data ) {
-               curData.data = jQuery.extend( {}, curData.data );
-       }
-}
-
-function cloneFixAttributes( src, dest ) {
-       var nodeName;
-
-       // We do not need to do anything for non-Elements
-       if ( dest.nodeType !== 1 ) {
-               return;
-       }
-
-       // clearAttributes removes the attributes, which we don't want,
-       // but also removes the attachEvent events, which we *do* want
-       if ( dest.clearAttributes ) {
-               dest.clearAttributes();
-       }
-
-       // mergeAttributes, in contrast, only merges back on the
-       // original attributes, not the events
-       if ( dest.mergeAttributes ) {
-               dest.mergeAttributes( src );
-       }
-
-       nodeName = dest.nodeName.toLowerCase();
-
-       if ( nodeName === "object" ) {
-               // IE6-10 improperly clones children of object elements using classid.
-               // IE10 throws NoModificationAllowedError if parent is null, #12132.
-               if ( dest.parentNode ) {
-                       dest.outerHTML = src.outerHTML;
-               }
-
-               // This path appears unavoidable for IE9. When cloning an object
-               // element in IE9, the outerHTML strategy above is not sufficient.
-               // If the src has innerHTML and the destination does not,
-               // copy the src.innerHTML into the dest.innerHTML. #10324
-               if ( jQuery.support.html5Clone && (src.innerHTML && !jQuery.trim(dest.innerHTML)) ) {
-                       dest.innerHTML = src.innerHTML;
-               }
-
-       } else if ( nodeName === "input" && rcheckableType.test( src.type ) ) {
-               // IE6-8 fails to persist the checked state of a cloned checkbox
-               // or radio button. Worse, IE6-7 fail to give the cloned element
-               // a checked appearance if the defaultChecked value isn't also set
-
-               dest.defaultChecked = dest.checked = src.checked;
-
-               // IE6-7 get confused and end up setting the value of a cloned
-               // checkbox/radio button to an empty string instead of "on"
-               if ( dest.value !== src.value ) {
-                       dest.value = src.value;
-               }
-
-       // IE6-8 fails to return the selected option to the default selected
-       // state when cloning options
-       } else if ( nodeName === "option" ) {
-               dest.selected = src.defaultSelected;
-
-       // IE6-8 fails to set the defaultValue to the correct value when
-       // cloning other types of input fields
-       } else if ( nodeName === "input" || nodeName === "textarea" ) {
-               dest.defaultValue = src.defaultValue;
-
-       // IE blanks contents when cloning scripts
-       } else if ( nodeName === "script" && dest.text !== src.text ) {
-               dest.text = src.text;
-       }
-
-       // Event data gets referenced instead of copied if the expando
-       // gets copied too
-       dest.removeAttribute( jQuery.expando );
-}
-
-jQuery.buildFragment = function( args, context, scripts ) {
-       var fragment, cacheable, cachehit,
-               first = args[ 0 ];
-
-       // Set context from what may come in as undefined or a jQuery collection or a node
-       // Updated to fix #12266 where accessing context[0] could throw an exception in IE9/10 &
-       // also doubles as fix for #8950 where plain objects caused createDocumentFragment exception
-       context = context || document;
-       context = !context.nodeType && context[0] || context;
-       context = context.ownerDocument || context;
-
-       // Only cache "small" (1/2 KB) HTML strings that are associated with the main document
-       // Cloning options loses the selected state, so don't cache them
-       // IE 6 doesn't like it when you put <object> or <embed> elements in a fragment
-       // Also, WebKit does not clone 'checked' attributes on cloneNode, so don't cache
-       // Lastly, IE6,7,8 will not correctly reuse cached fragments that were created from unknown elems #10501
-       if ( args.length === 1 && typeof first === "string" && first.length < 512 && context === document &&
-               first.charAt(0) === "<" && !rnocache.test( first ) &&
-               (jQuery.support.checkClone || !rchecked.test( first )) &&
-               (jQuery.support.html5Clone || !rnoshimcache.test( first )) ) {
-
-               // Mark cacheable and look for a hit
-               cacheable = true;
-               fragment = jQuery.fragments[ first ];
-               cachehit = fragment !== undefined;
-       }
-
-       if ( !fragment ) {
-               fragment = context.createDocumentFragment();
-               jQuery.clean( args, context, fragment, scripts );
-
-               // Update the cache, but only store false
-               // unless this is a second parsing of the same content
-               if ( cacheable ) {
-                       jQuery.fragments[ first ] = cachehit && fragment;
-               }
-       }
-
-       return { fragment: fragment, cacheable: cacheable };
-};
-
-jQuery.fragments = {};
-
-jQuery.each({
-       appendTo: "append",
-       prependTo: "prepend",
-       insertBefore: "before",
-       insertAfter: "after",
-       replaceAll: "replaceWith"
-}, function( name, original ) {
-       jQuery.fn[ name ] = function( selector ) {
-               var elems,
-                       i = 0,
-                       ret = [],
-                       insert = jQuery( selector ),
-                       l = insert.length,
-                       parent = this.length === 1 && this[0].parentNode;
-
-               if ( (parent == null || parent && parent.nodeType === 11 && parent.childNodes.length === 1) && l === 1 ) {
-                       insert[ original ]( this[0] );
-                       return this;
-               } else {
-                       for ( ; i < l; i++ ) {
-                               elems = ( i > 0 ? this.clone(true) : this ).get();
-                               jQuery( insert[i] )[ original ]( elems );
-                               ret = ret.concat( elems );
-                       }
-
-                       return this.pushStack( ret, name, insert.selector );
-               }
-       };
-});
-
-function getAll( elem ) {
-       if ( typeof elem.getElementsByTagName !== "undefined" ) {
-               return elem.getElementsByTagName( "*" );
-
-       } else if ( typeof elem.querySelectorAll !== "undefined" ) {
-               return elem.querySelectorAll( "*" );
-
-       } else {
-               return [];
-       }
-}
-
-// Used in clean, fixes the defaultChecked property
-function fixDefaultChecked( elem ) {
-       if ( rcheckableType.test( elem.type ) ) {
-               elem.defaultChecked = elem.checked;
-       }
-}
-
-jQuery.extend({
-       clone: function( elem, dataAndEvents, deepDataAndEvents ) {
-               var srcElements,
-                       destElements,
-                       i,
-                       clone;
-
-               if ( jQuery.support.html5Clone || jQuery.isXMLDoc(elem) || !rnoshimcache.test( "<" + elem.nodeName + ">" ) ) {
-                       clone = elem.cloneNode( true );
-
-               // IE<=8 does not properly clone detached, unknown element nodes
-               } else {
-                       fragmentDiv.innerHTML = elem.outerHTML;
-                       fragmentDiv.removeChild( clone = fragmentDiv.firstChild );
-               }
-
-               if ( (!jQuery.support.noCloneEvent || !jQuery.support.noCloneChecked) &&
-                               (elem.nodeType === 1 || elem.nodeType === 11) && !jQuery.isXMLDoc(elem) ) {
-                       // IE copies events bound via attachEvent when using cloneNode.
-                       // Calling detachEvent on the clone will also remove the events
-                       // from the original. In order to get around this, we use some
-                       // proprietary methods to clear the events. Thanks to MooTools
-                       // guys for this hotness.
-
-                       cloneFixAttributes( elem, clone );
-
-                       // Using Sizzle here is crazy slow, so we use getElementsByTagName instead
-                       srcElements = getAll( elem );
-                       destElements = getAll( clone );
-
-                       // Weird iteration because IE will replace the length property
-                       // with an element if you are cloning the body and one of the
-                       // elements on the page has a name or id of "length"
-                       for ( i = 0; srcElements[i]; ++i ) {
-                               // Ensure that the destination node is not null; Fixes #9587
-                               if ( destElements[i] ) {
-                                       cloneFixAttributes( srcElements[i], destElements[i] );
-                               }
-                       }
-               }
-
-               // Copy the events from the original to the clone
-               if ( dataAndEvents ) {
-                       cloneCopyEvent( elem, clone );
-
-                       if ( deepDataAndEvents ) {
-                               srcElements = getAll( elem );
-                               destElements = getAll( clone );
-
-                               for ( i = 0; srcElements[i]; ++i ) {
-                                       cloneCopyEvent( srcElements[i], destElements[i] );
-                               }
-                       }
-               }
-
-               srcElements = destElements = null;
-
-               // Return the cloned set
-               return clone;
-       },
-
-       clean: function( elems, context, fragment, scripts ) {
-               var i, j, elem, tag, wrap, depth, div, hasBody, tbody, len, handleScript, jsTags,
-                       safe = context === document && safeFragment,
-                       ret = [];
-
-               // Ensure that context is a document
-               if ( !context || typeof context.createDocumentFragment === "undefined" ) {
-                       context = document;
-               }
-
-               // Use the already-created safe fragment if context permits
-               for ( i = 0; (elem = elems[i]) != null; i++ ) {
-                       if ( typeof elem === "number" ) {
-                               elem += "";
-                       }
-
-                       if ( !elem ) {
-                               continue;
-                       }
-
-                       // Convert html string into DOM nodes
-                       if ( typeof elem === "string" ) {
-                               if ( !rhtml.test( elem ) ) {
-                                       elem = context.createTextNode( elem );
-                               } else {
-                                       // Ensure a safe container in which to render the html
-                                       safe = safe || createSafeFragment( context );
-                                       div = context.createElement("div");
-                                       safe.appendChild( div );
-
-                                       // Fix "XHTML"-style tags in all browsers
-                                       elem = elem.replace(rxhtmlTag, "<$1></$2>");
-
-                                       // Go to html and back, then peel off extra wrappers
-                                       tag = ( rtagName.exec( elem ) || ["", ""] )[1].toLowerCase();
-                                       wrap = wrapMap[ tag ] || wrapMap._default;
-                                       depth = wrap[0];
-                                       div.innerHTML = wrap[1] + elem + wrap[2];
-
-                                       // Move to the right depth
-                                       while ( depth-- ) {
-                                               div = div.lastChild;
-                                       }
-
-                                       // Remove IE's autoinserted <tbody> from table fragments
-                                       if ( !jQuery.support.tbody ) {
-
-                                               // String was a <table>, *may* have spurious <tbody>
-                                               hasBody = rtbody.test(elem);
-                                                       tbody = tag === "table" && !hasBody ?
-                                                               div.firstChild && div.firstChild.childNodes :
-
-                                                               // String was a bare <thead> or <tfoot>
-                                                               wrap[1] === "<table>" && !hasBody ?
-                                                                       div.childNodes :
-                                                                       [];
-
-                                               for ( j = tbody.length - 1; j >= 0 ; --j ) {
-                                                       if ( jQuery.nodeName( tbody[ j ], "tbody" ) && !tbody[ j ].childNodes.length ) {
-                                                               tbody[ j ].parentNode.removeChild( tbody[ j ] );
-                                                       }
-                                               }
-                                       }
-
-                                       // IE completely kills leading whitespace when innerHTML is used
-                                       if ( !jQuery.support.leadingWhitespace && rleadingWhitespace.test( elem ) ) {
-                                               div.insertBefore( context.createTextNode( rleadingWhitespace.exec(elem)[0] ), div.firstChild );
-                                       }
-
-                                       elem = div.childNodes;
-
-                                       // Take out of fragment container (we need a fresh div each time)
-                                       div.parentNode.removeChild( div );
-                               }
-                       }
-
-                       if ( elem.nodeType ) {
-                               ret.push( elem );
-                       } else {
-                               jQuery.merge( ret, elem );
-                       }
-               }
-
-               // Fix #11356: Clear elements from safeFragment
-               if ( div ) {
-                       elem = div = safe = null;
-               }
-
-               // Reset defaultChecked for any radios and checkboxes
-               // about to be appended to the DOM in IE 6/7 (#8060)
-               if ( !jQuery.support.appendChecked ) {
-                       for ( i = 0; (elem = ret[i]) != null; i++ ) {
-                               if ( jQuery.nodeName( elem, "input" ) ) {
-                                       fixDefaultChecked( elem );
-                               } else if ( typeof elem.getElementsByTagName !== "undefined" ) {
-                                       jQuery.grep( elem.getElementsByTagName("input"), fixDefaultChecked );
-                               }
-                       }
-               }
-
-               // Append elements to a provided document fragment
-               if ( fragment ) {
-                       // Special handling of each script element
-                       handleScript = function( elem ) {
-                               // Check if we consider it executable
-                               if ( !elem.type || rscriptType.test( elem.type ) ) {
-                                       // Detach the script and store it in the scripts array (if provided) or the fragment
-                                       // Return truthy to indicate that it has been handled
-                                       return scripts ?
-                                               scripts.push( elem.parentNode ? elem.parentNode.removeChild( elem ) : elem ) :
-                                               fragment.appendChild( elem );
-                               }
-                       };
-
-                       for ( i = 0; (elem = ret[i]) != null; i++ ) {
-                               // Check if we're done after handling an executable script
-                               if ( !( jQuery.nodeName( elem, "script" ) && handleScript( elem ) ) ) {
-                                       // Append to fragment and handle embedded scripts
-                                       fragment.appendChild( elem );
-                                       if ( typeof elem.getElementsByTagName !== "undefined" ) {
-                                               // handleScript alters the DOM, so use jQuery.merge to ensure snapshot iteration
-                                               jsTags = jQuery.grep( jQuery.merge( [], elem.getElementsByTagName("script") ), handleScript );
-
-                                               // Splice the scripts into ret after their former ancestor and advance our index beyond them
-                                               ret.splice.apply( ret, [i + 1, 0].concat( jsTags ) );
-                                               i += jsTags.length;
-                                       }
-                               }
-                       }
-               }
-
-               return ret;
-       },
-
-       cleanData: function( elems, /* internal */ acceptData ) {
-               var data, id, elem, type,
-                       i = 0,
-                       internalKey = jQuery.expando,
-                       cache = jQuery.cache,
-                       deleteExpando = jQuery.support.deleteExpando,
-                       special = jQuery.event.special;
-
-               for ( ; (elem = elems[i]) != null; i++ ) {
-
-                       if ( acceptData || jQuery.acceptData( elem ) ) {
-
-                               id = elem[ internalKey ];
-                               data = id && cache[ id ];
-
-                               if ( data ) {
-                                       if ( data.events ) {
-                                               for ( type in data.events ) {
-                                                       if ( special[ type ] ) {
-                                                               jQuery.event.remove( elem, type );
-
-                                                       // This is a shortcut to avoid jQuery.event.remove's overhead
-                                                       } else {
-                                                               jQuery.removeEvent( elem, type, data.handle );
-                                                       }
-                                               }
-                                       }
-
-                                       // Remove cache only if it was not already removed by jQuery.event.remove
-                                       if ( cache[ id ] ) {
-
-                                               delete cache[ id ];
-
-                                               // IE does not allow us to delete expando properties from nodes,
-                                               // nor does it have a removeAttribute function on Document nodes;
-                                               // we must handle all of these cases
-                                               if ( deleteExpando ) {
-                                                       delete elem[ internalKey ];
-
-                                               } else if ( elem.removeAttribute ) {
-                                                       elem.removeAttribute( internalKey );
-
-                                               } else {
-                                                       elem[ internalKey ] = null;
-                                               }
-
-                                               jQuery.deletedIds.push( id );
-                                       }
-                               }
-                       }
-               }
-       }
-});
-// Limit scope pollution from any deprecated API
-(function() {
-
-var matched, browser;
-
-// Use of jQuery.browser is frowned upon.
-// More details: http://api.jquery.com/jQuery.browser
-// jQuery.uaMatch maintained for back-compat
-jQuery.uaMatch = function( ua ) {
-       ua = ua.toLowerCase();
-
-       var match = /(chrome)[ \/]([\w.]+)/.exec( ua ) ||
-               /(webkit)[ \/]([\w.]+)/.exec( ua ) ||
-               /(opera)(?:.*version|)[ \/]([\w.]+)/.exec( ua ) ||
-               /(msie) ([\w.]+)/.exec( ua ) ||
-               ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec( ua ) ||
-               [];
-
-       return {
-               browser: match[ 1 ] || "",
-               version: match[ 2 ] || "0"
-       };
-};
-
-matched = jQuery.uaMatch( navigator.userAgent );
-browser = {};
-
-if ( matched.browser ) {
-       browser[ matched.browser ] = true;
-       browser.version = matched.version;
-}
-
-// Chrome is Webkit, but Webkit is also Safari.
-if ( browser.chrome ) {
-       browser.webkit = true;
-} else if ( browser.webkit ) {
-       browser.safari = true;
-}
-
-jQuery.browser = browser;
-
-jQuery.sub = function() {
-       function jQuerySub( selector, context ) {
-               return new jQuerySub.fn.init( selector, context );
-       }
-       jQuery.extend( true, jQuerySub, this );
-       jQuerySub.superclass = this;
-       jQuerySub.fn = jQuerySub.prototype = this();
-       jQuerySub.fn.constructor = jQuerySub;
-       jQuerySub.sub = this.sub;
-       jQuerySub.fn.init = function init( selector, context ) {
-               if ( context && context instanceof jQuery && !(context instanceof jQuerySub) ) {
-                       context = jQuerySub( context );
-               }
-
-               return jQuery.fn.init.call( this, selector, context, rootjQuerySub );
-       };
-       jQuerySub.fn.init.prototype = jQuerySub.fn;
-       var rootjQuerySub = jQuerySub(document);
-       return jQuerySub;
-};
-
-})();
-var curCSS, iframe, iframeDoc,
-       ralpha = /alpha\([^)]*\)/i,
-       ropacity = /opacity=([^)]*)/,
-       rposition = /^(top|right|bottom|left)$/,
-       // swappable if display is none or starts with table except "table", "table-cell", or "table-caption"
-       // see here for display values: https://developer.mozilla.org/en-US/docs/CSS/display
-       rdisplayswap = /^(none|table(?!-c[ea]).+)/,
-       rmargin = /^margin/,
-       rnumsplit = new RegExp( "^(" + core_pnum + ")(.*)$", "i" ),
-       rnumnonpx = new RegExp( "^(" + core_pnum + ")(?!px)[a-z%]+$", "i" ),
-       rrelNum = new RegExp( "^([-+])=(" + core_pnum + ")", "i" ),
-       elemdisplay = { BODY: "block" },
-
-       cssShow = { position: "absolute", visibility: "hidden", display: "block" },
-       cssNormalTransform = {
-               letterSpacing: 0,
-               fontWeight: 400
-       },
-
-       cssExpand = [ "Top", "Right", "Bottom", "Left" ],
-       cssPrefixes = [ "Webkit", "O", "Moz", "ms" ],
-
-       eventsToggle = jQuery.fn.toggle;
-
-// return a css property mapped to a potentially vendor prefixed property
-function vendorPropName( style, name ) {
-
-       // shortcut for names that are not vendor prefixed
-       if ( name in style ) {
-               return name;
-       }
-
-       // check for vendor prefixed names
-       var capName = name.charAt(0).toUpperCase() + name.slice(1),
-               origName = name,
-               i = cssPrefixes.length;
-
-       while ( i-- ) {
-               name = cssPrefixes[ i ] + capName;
-               if ( name in style ) {
-                       return name;
-               }
-       }
-
-       return origName;
-}
-
-function isHidden( elem, el ) {
-       elem = el || elem;
-       return jQuery.css( elem, "display" ) === "none" || !jQuery.contains( elem.ownerDocument, elem );
-}
-
-function showHide( elements, show ) {
-       var elem, display,
-               values = [],
-               index = 0,
-               length = elements.length;
-
-       for ( ; index < length; index++ ) {
-               elem = elements[ index ];
-               if ( !elem.style ) {
-                       continue;
-               }
-               values[ index ] = jQuery._data( elem, "olddisplay" );
-               if ( show ) {
-                       // Reset the inline display of this element to learn if it is
-                       // being hidden by cascaded rules or not
-                       if ( !values[ index ] && elem.style.display === "none" ) {
-                               elem.style.display = "";
-                       }
-
-                       // Set elements which have been overridden with display: none
-                       // in a stylesheet to whatever the default browser style is
-                       // for such an element
-                       if ( elem.style.display === "" && isHidden( elem ) ) {
-                               values[ index ] = jQuery._data( elem, "olddisplay", css_defaultDisplay(elem.nodeName) );
-                       }
-               } else {
-                       display = curCSS( elem, "display" );
-
-                       if ( !values[ index ] && display !== "none" ) {
-                               jQuery._data( elem, "olddisplay", display );
-                       }
-               }
-       }
-
-       // Set the display of most of the elements in a second loop
-       // to avoid the constant reflow
-       for ( index = 0; index < length; index++ ) {
-               elem = elements[ index ];
-               if ( !elem.style ) {
-                       continue;
-               }
-               if ( !show || elem.style.display === "none" || elem.style.display === "" ) {
-                       elem.style.display = show ? values[ index ] || "" : "none";
-               }
-       }
-
-       return elements;
-}
-
-jQuery.fn.extend({
-       css: function( name, value ) {
-               return jQuery.access( this, function( elem, name, value ) {
-                       return value !== undefined ?
-                               jQuery.style( elem, name, value ) :
-                               jQuery.css( elem, name );
-               }, name, value, arguments.length > 1 );
-       },
-       show: function() {
-               return showHide( this, true );
-       },
-       hide: function() {
-               return showHide( this );
-       },
-       toggle: function( state, fn2 ) {
-               var bool = typeof state === "boolean";
-
-               if ( jQuery.isFunction( state ) && jQuery.isFunction( fn2 ) ) {
-                       return eventsToggle.apply( this, arguments );
-               }
-
-               return this.each(function() {
-                       if ( bool ? state : isHidden( this ) ) {
-                               jQuery( this ).show();
-                       } else {
-                               jQuery( this ).hide();
-                       }
-               });
-       }
-});
-
-jQuery.extend({
-       // Add in style property hooks for overriding the default
-       // behavior of getting and setting a style property
-       cssHooks: {
-               opacity: {
-                       get: function( elem, computed ) {
-                               if ( computed ) {
-                                       // We should always get a number back from opacity
-                                       var ret = curCSS( elem, "opacity" );
-                                       return ret === "" ? "1" : ret;
-
-                               }
-                       }
-               }
-       },
-
-       // Exclude the following css properties to add px
-       cssNumber: {
-               "fillOpacity": true,
-               "fontWeight": true,
-               "lineHeight": true,
-               "opacity": true,
-               "orphans": true,
-               "widows": true,
-               "zIndex": true,
-               "zoom": true
-       },
-
-       // Add in properties whose names you wish to fix before
-       // setting or getting the value
-       cssProps: {
-               // normalize float css property
-               "float": jQuery.support.cssFloat ? "cssFloat" : "styleFloat"
-       },
-
-       // Get and set the style property on a DOM Node
-       style: function( elem, name, value, extra ) {
-               // Don't set styles on text and comment nodes
-               if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {
-                       return;
-               }
-
-               // Make sure that we're working with the right name
-               var ret, type, hooks,
-                       origName = jQuery.camelCase( name ),
-                       style = elem.style;
-
-               name = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( style, origName ) );
-
-               // gets hook for the prefixed version
-               // followed by the unprefixed version
-               hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
-
-               // Check if we're setting a value
-               if ( value !== undefined ) {
-                       type = typeof value;
-
-                       // convert relative number strings (+= or -=) to relative numbers. #7345
-                       if ( type === "string" && (ret = rrelNum.exec( value )) ) {
-                               value = ( ret[1] + 1 ) * ret[2] + parseFloat( jQuery.css( elem, name ) );
-                               // Fixes bug #9237
-                               type = "number";
-                       }
-
-                       // Make sure that NaN and null values aren't set. See: #7116
-                       if ( value == null || type === "number" && isNaN( value ) ) {
-                               return;
-                       }
-
-                       // If a number was passed in, add 'px' to the (except for certain CSS properties)
-                       if ( type === "number" && !jQuery.cssNumber[ origName ] ) {
-                               value += "px";
-                       }
-
-                       // If a hook was provided, use that value, otherwise just set the specified value
-                       if ( !hooks || !("set" in hooks) || (value = hooks.set( elem, value, extra )) !== undefined ) {
-                               // Wrapped to prevent IE from throwing errors when 'invalid' values are provided
-                               // Fixes bug #5509
-                               try {
-                                       style[ name ] = value;
-                               } catch(e) {}
-                       }
-
-               } else {
-                       // If a hook was provided get the non-computed value from there
-                       if ( hooks && "get" in hooks && (ret = hooks.get( elem, false, extra )) !== undefined ) {
-                               return ret;
-                       }
-
-                       // Otherwise just get the value from the style object
-                       return style[ name ];
-               }
-       },
-
-       css: function( elem, name, numeric, extra ) {
-               var val, num, hooks,
-                       origName = jQuery.camelCase( name );
-
-               // Make sure that we're working with the right name
-               name = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( elem.style, origName ) );
-
-               // gets hook for the prefixed version
-               // followed by the unprefixed version
-               hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
-
-               // If a hook was provided get the computed value from there
-               if ( hooks && "get" in hooks ) {
-                       val = hooks.get( elem, true, extra );
-               }
-
-               // Otherwise, if a way to get the computed value exists, use that
-               if ( val === undefined ) {
-                       val = curCSS( elem, name );
-               }
-
-               //convert "normal" to computed value
-               if ( val === "normal" && name in cssNormalTransform ) {
-                       val = cssNormalTransform[ name ];
-               }
-
-               // Return, converting to number if forced or a qualifier was provided and val looks numeric
-               if ( numeric || extra !== undefined ) {
-                       num = parseFloat( val );
-                       return numeric || jQuery.isNumeric( num ) ? num || 0 : val;
-               }
-               return val;
-       },
-
-       // A method for quickly swapping in/out CSS properties to get correct calculations
-       swap: function( elem, options, callback ) {
-               var ret, name,
-                       old = {};
-
-               // Remember the old values, and insert the new ones
-               for ( name in options ) {
-                       old[ name ] = elem.style[ name ];
-                       elem.style[ name ] = options[ name ];
-               }
-
-               ret = callback.call( elem );
-
-               // Revert the old values
-               for ( name in options ) {
-                       elem.style[ name ] = old[ name ];
-               }
-
-               return ret;
-       }
-});
-
-// NOTE: To any future maintainer, we've window.getComputedStyle
-// because jsdom on node.js will break without it.
-if ( window.getComputedStyle ) {
-       curCSS = function( elem, name ) {
-               var ret, width, minWidth, maxWidth,
-                       computed = window.getComputedStyle( elem, null ),
-                       style = elem.style;
-
-               if ( computed ) {
-
-                       // getPropertyValue is only needed for .css('filter') in IE9, see #12537
-                       ret = computed.getPropertyValue( name ) || computed[ name ];
-
-                       if ( ret === "" && !jQuery.contains( elem.ownerDocument, elem ) ) {
-                               ret = jQuery.style( elem, name );
-                       }
-
-                       // A tribute to the "awesome hack by Dean Edwards"
-                       // Chrome < 17 and Safari 5.0 uses "computed value" instead of "used value" for margin-right
-                       // Safari 5.1.7 (at least) returns percentage for a larger set of values, but width seems to be reliably pixels
-                       // this is against the CSSOM draft spec: http://dev.w3.org/csswg/cssom/#resolved-values
-                       if ( rnumnonpx.test( ret ) && rmargin.test( name ) ) {
-                               width = style.width;
-                               minWidth = style.minWidth;
-                               maxWidth = style.maxWidth;
-
-                               style.minWidth = style.maxWidth = style.width = ret;
-                               ret = computed.width;
-
-                               style.width = width;
-                               style.minWidth = minWidth;
-                               style.maxWidth = maxWidth;
-                       }
-               }
-
-               return ret;
-       };
-} else if ( document.documentElement.currentStyle ) {
-       curCSS = function( elem, name ) {
-               var left, rsLeft,
-                       ret = elem.currentStyle && elem.currentStyle[ name ],
-                       style = elem.style;
-
-               // Avoid setting ret to empty string here
-               // so we don't default to auto
-               if ( ret == null && style && style[ name ] ) {
-                       ret = style[ name ];
-               }
-
-               // From the awesome hack by Dean Edwards
-               // http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291
-
-               // If we're not dealing with a regular pixel number
-               // but a number that has a weird ending, we need to convert it to pixels
-               // but not position css attributes, as those are proportional to the parent element instead
-               // and we can't measure the parent instead because it might trigger a "stacking dolls" problem
-               if ( rnumnonpx.test( ret ) && !rposition.test( name ) ) {
-
-                       // Remember the original values
-                       left = style.left;
-                       rsLeft = elem.runtimeStyle && elem.runtimeStyle.left;
-
-                       // Put in the new values to get a computed value out
-                       if ( rsLeft ) {
-                               elem.runtimeStyle.left = elem.currentStyle.left;
-                       }
-                       style.left = name === "fontSize" ? "1em" : ret;
-                       ret = style.pixelLeft + "px";
-
-                       // Revert the changed values
-                       style.left = left;
-                       if ( rsLeft ) {
-                               elem.runtimeStyle.left = rsLeft;
-                       }
-               }
-
-               return ret === "" ? "auto" : ret;
-       };
-}
-
-function setPositiveNumber( elem, value, subtract ) {
-       var matches = rnumsplit.exec( value );
-       return matches ?
-                       Math.max( 0, matches[ 1 ] - ( subtract || 0 ) ) + ( matches[ 2 ] || "px" ) :
-                       value;
-}
-
-function augmentWidthOrHeight( elem, name, extra, isBorderBox ) {
-       var i = extra === ( isBorderBox ? "border" : "content" ) ?
-               // If we already have the right measurement, avoid augmentation
-               4 :
-               // Otherwise initialize for horizontal or vertical properties
-               name === "width" ? 1 : 0,
-
-               val = 0;
-
-       for ( ; i < 4; i += 2 ) {
-               // both box models exclude margin, so add it if we want it
-               if ( extra === "margin" ) {
-                       // we use jQuery.css instead of curCSS here
-                       // because of the reliableMarginRight CSS hook!
-                       val += jQuery.css( elem, extra + cssExpand[ i ], true );
-               }
-
-               // From this point on we use curCSS for maximum performance (relevant in animations)
-               if ( isBorderBox ) {
-                       // border-box includes padding, so remove it if we want content
-                       if ( extra === "content" ) {
-                               val -= parseFloat( curCSS( elem, "padding" + cssExpand[ i ] ) ) || 0;
-                       }
-
-                       // at this point, extra isn't border nor margin, so remove border
-                       if ( extra !== "margin" ) {
-                               val -= parseFloat( curCSS( elem, "border" + cssExpand[ i ] + "Width" ) ) || 0;
-                       }
-               } else {
-                       // at this point, extra isn't content, so add padding
-                       val += parseFloat( curCSS( elem, "padding" + cssExpand[ i ] ) ) || 0;
-
-                       // at this point, extra isn't content nor padding, so add border
-                       if ( extra !== "padding" ) {
-                               val += parseFloat( curCSS( elem, "border" + cssExpand[ i ] + "Width" ) ) || 0;
-                       }
-               }
-       }
-
-       return val;
-}
-
-function getWidthOrHeight( elem, name, extra ) {
-
-       // Start with offset property, which is equivalent to the border-box value
-       var val = name === "width" ? elem.offsetWidth : elem.offsetHeight,
-               valueIsBorderBox = true,
-               isBorderBox = jQuery.support.boxSizing && jQuery.css( elem, "boxSizing" ) === "border-box";
-
-       // some non-html elements return undefined for offsetWidth, so check for null/undefined
-       // svg - https://bugzilla.mozilla.org/show_bug.cgi?id=649285
-       // MathML - https://bugzilla.mozilla.org/show_bug.cgi?id=491668
-       if ( val <= 0 || val == null ) {
-               // Fall back to computed then uncomputed css if necessary
-               val = curCSS( elem, name );
-               if ( val < 0 || val == null ) {
-                       val = elem.style[ name ];
-               }
-
-               // Computed unit is not pixels. Stop here and return.
-               if ( rnumnonpx.test(val) ) {
-                       return val;
-               }
-
-               // we need the check for style in case a browser which returns unreliable values
-               // for getComputedStyle silently falls back to the reliable elem.style
-               valueIsBorderBox = isBorderBox && ( jQuery.support.boxSizingReliable || val === elem.style[ name ] );
-
-               // Normalize "", auto, and prepare for extra
-               val = parseFloat( val ) || 0;
-       }
-
-       // use the active box-sizing model to add/subtract irrelevant styles
-       return ( val +
-               augmentWidthOrHeight(
-                       elem,
-                       name,
-                       extra || ( isBorderBox ? "border" : "content" ),
-                       valueIsBorderBox
-               )
-       ) + "px";
-}
-
-
-// Try to determine the default display value of an element
-function css_defaultDisplay( nodeName ) {
-       if ( elemdisplay[ nodeName ] ) {
-               return elemdisplay[ nodeName ];
-       }
-
-       var elem = jQuery( "<" + nodeName + ">" ).appendTo( document.body ),
-               display = elem.css("display");
-       elem.remove();
-
-       // If the simple way fails,
-       // get element's real default display by attaching it to a temp iframe
-       if ( display === "none" || display === "" ) {
-               // Use the already-created iframe if possible
-               iframe = document.body.appendChild(
-                       iframe || jQuery.extend( document.createElement("iframe"), {
-                               frameBorder: 0,
-                               width: 0,
-                               height: 0
-                       })
-               );
-
-               // Create a cacheable copy of the iframe document on first call.
-               // IE and Opera will allow us to reuse the iframeDoc without re-writing the fake HTML
-               // document to it; WebKit & Firefox won't allow reusing the iframe document.
-               if ( !iframeDoc || !iframe.createElement ) {
-                       iframeDoc = ( iframe.contentWindow || iframe.contentDocument ).document;
-                       iframeDoc.write("<!doctype html><html><body>");
-                       iframeDoc.close();
-               }
-
-               elem = iframeDoc.body.appendChild( iframeDoc.createElement(nodeName) );
-
-               display = curCSS( elem, "display" );
-               document.body.removeChild( iframe );
-       }
-
-       // Store the correct default display
-       elemdisplay[ nodeName ] = display;
-
-       return display;
-}
-
-jQuery.each([ "height", "width" ], function( i, name ) {
-       jQuery.cssHooks[ name ] = {
-               get: function( elem, computed, extra ) {
-                       if ( computed ) {
-                               // certain elements can have dimension info if we invisibly show them
-                               // however, it must have a current display style that would benefit from this
-                               if ( elem.offsetWidth === 0 && rdisplayswap.test( curCSS( elem, "display" ) ) ) {
-                                       return jQuery.swap( elem, cssShow, function() {
-                                               return getWidthOrHeight( elem, name, extra );
-                                       });
-                               } else {
-                                       return getWidthOrHeight( elem, name, extra );
-                               }
-                       }
-               },
-
-               set: function( elem, value, extra ) {
-                       return setPositiveNumber( elem, value, extra ?
-                               augmentWidthOrHeight(
-                                       elem,
-                                       name,
-                                       extra,
-                                       jQuery.support.boxSizing && jQuery.css( elem, "boxSizing" ) === "border-box"
-                               ) : 0
-                       );
-               }
-       };
-});
-
-if ( !jQuery.support.opacity ) {
-       jQuery.cssHooks.opacity = {
-               get: function( elem, computed ) {
-                       // IE uses filters for opacity
-                       return ropacity.test( (computed && elem.currentStyle ? elem.currentStyle.filter : elem.style.filter) || "" ) ?
-                               ( 0.01 * parseFloat( RegExp.$1 ) ) + "" :
-                               computed ? "1" : "";
-               },
-
-               set: function( elem, value ) {
-                       var style = elem.style,
-                               currentStyle = elem.currentStyle,
-                               opacity = jQuery.isNumeric( value ) ? "alpha(opacity=" + value * 100 + ")" : "",
-                               filter = currentStyle && currentStyle.filter || style.filter || "";
-
-                       // IE has trouble with opacity if it does not have layout
-                       // Force it by setting the zoom level
-                       style.zoom = 1;
-
-                       // if setting opacity to 1, and no other filters exist - attempt to remove filter attribute #6652
-                       if ( value >= 1 && jQuery.trim( filter.replace( ralpha, "" ) ) === "" &&
-                               style.removeAttribute ) {
-
-                               // Setting style.filter to null, "" & " " still leave "filter:" in the cssText
-                               // if "filter:" is present at all, clearType is disabled, we want to avoid this
-                               // style.removeAttribute is IE Only, but so apparently is this code path...
-                               style.removeAttribute( "filter" );
-
-                               // if there there is no filter style applied in a css rule, we are done
-                               if ( currentStyle && !currentStyle.filter ) {
-                                       return;
-                               }
-                       }
-
-                       // otherwise, set new filter values
-                       style.filter = ralpha.test( filter ) ?
-                               filter.replace( ralpha, opacity ) :
-                               filter + " " + opacity;
-               }
-       };
-}
-
-// These hooks cannot be added until DOM ready because the support test
-// for it is not run until after DOM ready
-jQuery(function() {
-       if ( !jQuery.support.reliableMarginRight ) {
-               jQuery.cssHooks.marginRight = {
-                       get: function( elem, computed ) {
-                               // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
-                               // Work around by temporarily setting element display to inline-block
-                               return jQuery.swap( elem, { "display": "inline-block" }, function() {
-                                       if ( computed ) {
-                                               return curCSS( elem, "marginRight" );
-                                       }
-                               });
-                       }
-               };
-       }
-
-       // Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084
-       // getComputedStyle returns percent when specified for top/left/bottom/right
-       // rather than make the css module depend on the offset module, we just check for it here
-       if ( !jQuery.support.pixelPosition && jQuery.fn.position ) {
-               jQuery.each( [ "top", "left" ], function( i, prop ) {
-                       jQuery.cssHooks[ prop ] = {
-                               get: function( elem, computed ) {
-                                       if ( computed ) {
-                                               var ret = curCSS( elem, prop );
-                                               // if curCSS returns percentage, fallback to offset
-                                               return rnumnonpx.test( ret ) ? jQuery( elem ).position()[ prop ] + "px" : ret;
-                                       }
-                               }
-                       };
-               });
-       }
-
-});
-
-if ( jQuery.expr && jQuery.expr.filters ) {
-       jQuery.expr.filters.hidden = function( elem ) {
-               return ( elem.offsetWidth === 0 && elem.offsetHeight === 0 ) || (!jQuery.support.reliableHiddenOffsets && ((elem.style && elem.style.display) || curCSS( elem, "display" )) === "none");
-       };
-
-       jQuery.expr.filters.visible = function( elem ) {
-               return !jQuery.expr.filters.hidden( elem );
-       };
-}
-
-// These hooks are used by animate to expand properties
-jQuery.each({
-       margin: "",
-       padding: "",
-       border: "Width"
-}, function( prefix, suffix ) {
-       jQuery.cssHooks[ prefix + suffix ] = {
-               expand: function( value ) {
-                       var i,
-
-                               // assumes a single number if not a string
-                               parts = typeof value === "string" ? value.split(" ") : [ value ],
-                               expanded = {};
-
-                       for ( i = 0; i < 4; i++ ) {
-                               expanded[ prefix + cssExpand[ i ] + suffix ] =
-                                       parts[ i ] || parts[ i - 2 ] || parts[ 0 ];
-                       }
-
-                       return expanded;
-               }
-       };
-
-       if ( !rmargin.test( prefix ) ) {
-               jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber;
-       }
-});
-var r20 = /%20/g,
-       rbracket = /\[\]$/,
-       rCRLF = /\r?\n/g,
-       rinput = /^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,
-       rselectTextarea = /^(?:select|textarea)/i;
-
-jQuery.fn.extend({
-       serialize: function() {
-               return jQuery.param( this.serializeArray() );
-       },
-       serializeArray: function() {
-               return this.map(function(){
-                       return this.elements ? jQuery.makeArray( this.elements ) : this;
-               })
-               .filter(function(){
-                       return this.name && !this.disabled &&
-                               ( this.checked || rselectTextarea.test( this.nodeName ) ||
-                                       rinput.test( this.type ) );
-               })
-               .map(function( i, elem ){
-                       var val = jQuery( this ).val();
-
-                       return val == null ?
-                               null :
-                               jQuery.isArray( val ) ?
-                                       jQuery.map( val, function( val, i ){
-                                               return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
-                                       }) :
-                                       { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
-               }).get();
-       }
-});
-
-//Serialize an array of form elements or a set of
-//key/values into a query string
-jQuery.param = function( a, traditional ) {
-       var prefix,
-               s = [],
-               add = function( key, value ) {
-                       // If value is a function, invoke it and return its value
-                       value = jQuery.isFunction( value ) ? value() : ( value == null ? "" : value );
-                       s[ s.length ] = encodeURIComponent( key ) + "=" + encodeURIComponent( value );
-               };
-
-       // Set traditional to true for jQuery <= 1.3.2 behavior.
-       if ( traditional === undefined ) {
-               traditional = jQuery.ajaxSettings && jQuery.ajaxSettings.traditional;
-       }
-
-       // If an array was passed in, assume that it is an array of form elements.
-       if ( jQuery.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {
-               // Serialize the form elements
-               jQuery.each( a, function() {
-                       add( this.name, this.value );
-               });
-
-       } else {
-               // If traditional, encode the "old" way (the way 1.3.2 or older
-               // did it), otherwise encode params recursively.
-               for ( prefix in a ) {
-                       buildParams( prefix, a[ prefix ], traditional, add );
-               }
-       }
-
-       // Return the resulting serialization
-       return s.join( "&" ).replace( r20, "+" );
-};
-
-function buildParams( prefix, obj, traditional, add ) {
-       var name;
-
-       if ( jQuery.isArray( obj ) ) {
-               // Serialize array item.
-               jQuery.each( obj, function( i, v ) {
-                       if ( traditional || rbracket.test( prefix ) ) {
-                               // Treat each array item as a scalar.
-                               add( prefix, v );
-
-                       } else {
-                               // If array item is non-scalar (array or object), encode its
-                               // numeric index to resolve deserialization ambiguity issues.
-                               // Note that rack (as of 1.0.0) can't currently deserialize
-                               // nested arrays properly, and attempting to do so may cause
-                               // a server error. Possible fixes are to modify rack's
-                               // deserialization algorithm or to provide an option or flag
-                               // to force array serialization to be shallow.
-                               buildParams( prefix + "[" + ( typeof v === "object" ? i : "" ) + "]", v, traditional, add );
-                       }
-               });
-
-       } else if ( !traditional && jQuery.type( obj ) === "object" ) {
-               // Serialize object item.
-               for ( name in obj ) {
-                       buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add );
-               }
-
-       } else {
-               // Serialize scalar item.
-               add( prefix, obj );
-       }
-}
-var
-       // Document location
-       ajaxLocParts,
-       ajaxLocation,
-
-       rhash = /#.*$/,
-       rheaders = /^(.*?):[ \t]*([^\r\n]*)\r?$/mg, // IE leaves an \r character at EOL
-       // #7653, #8125, #8152: local protocol detection
-       rlocalProtocol = /^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,
-       rnoContent = /^(?:GET|HEAD)$/,
-       rprotocol = /^\/\//,
-       rquery = /\?/,
-       rscript = /<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,
-       rts = /([?&])_=[^&]*/,
-       rurl = /^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+)|)|)/,
-
-       // Keep a copy of the old load method
-       _load = jQuery.fn.load,
-
-       /* Prefilters
-        * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)
-        * 2) These are called:
-        *    - BEFORE asking for a transport
-        *    - AFTER param serialization (s.data is a string if s.processData is true)
-        * 3) key is the dataType
-        * 4) the catchall symbol "*" can be used
-        * 5) execution will start with transport dataType and THEN continue down to "*" if needed
-        */
-       prefilters = {},
-
-       /* Transports bindings
-        * 1) key is the dataType
-        * 2) the catchall symbol "*" can be used
-        * 3) selection will start with transport dataType and THEN go to "*" if needed
-        */
-       transports = {},
-
-       // Avoid comment-prolog char sequence (#10098); must appease lint and evade compression
-       allTypes = ["*/"] + ["*"];
-
-// #8138, IE may throw an exception when accessing
-// a field from window.location if document.domain has been set
-try {
-       ajaxLocation = location.href;
-} catch( e ) {
-       // Use the href attribute of an A element
-       // since IE will modify it given document.location
-       ajaxLocation = document.createElement( "a" );
-       ajaxLocation.href = "";
-       ajaxLocation = ajaxLocation.href;
-}
-
-// Segment location into parts
-ajaxLocParts = rurl.exec( ajaxLocation.toLowerCase() ) || [];
-
-// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport
-function addToPrefiltersOrTransports( structure ) {
-
-       // dataTypeExpression is optional and defaults to "*"
-       return function( dataTypeExpression, func ) {
-
-               if ( typeof dataTypeExpression !== "string" ) {
-                       func = dataTypeExpression;
-                       dataTypeExpression = "*";
-               }
-
-               var dataType, list, placeBefore,
-                       dataTypes = dataTypeExpression.toLowerCase().split( core_rspace ),
-                       i = 0,
-                       length = dataTypes.length;
-
-               if ( jQuery.isFunction( func ) ) {
-                       // For each dataType in the dataTypeExpression
-                       for ( ; i < length; i++ ) {
-                               dataType = dataTypes[ i ];
-                               // We control if we're asked to add before
-                               // any existing element
-                               placeBefore = /^\+/.test( dataType );
-                               if ( placeBefore ) {
-                                       dataType = dataType.substr( 1 ) || "*";
-                               }
-                               list = structure[ dataType ] = structure[ dataType ] || [];
-                               // then we add to the structure accordingly
-                               list[ placeBefore ? "unshift" : "push" ]( func );
-                       }
-               }
-       };
-}
-
-// Base inspection function for prefilters and transports
-function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR,
-               dataType /* internal */, inspected /* internal */ ) {
-
-       dataType = dataType || options.dataTypes[ 0 ];
-       inspected = inspected || {};
-
-       inspected[ dataType ] = true;
-
-       var selection,
-               list = structure[ dataType ],
-               i = 0,
-               length = list ? list.length : 0,
-               executeOnly = ( structure === prefilters );
-
-       for ( ; i < length && ( executeOnly || !selection ); i++ ) {
-               selection = list[ i ]( options, originalOptions, jqXHR );
-               // If we got redirected to another dataType
-               // we try there if executing only and not done already
-               if ( typeof selection === "string" ) {
-                       if ( !executeOnly || inspected[ selection ] ) {
-                               selection = undefined;
-                       } else {
-                               options.dataTypes.unshift( selection );
-                               selection = inspectPrefiltersOrTransports(
-                                               structure, options, originalOptions, jqXHR, selection, inspected );
-                       }
-               }
-       }
-       // If we're only executing or nothing was selected
-       // we try the catchall dataType if not done already
-       if ( ( executeOnly || !selection ) && !inspected[ "*" ] ) {
-               selection = inspectPrefiltersOrTransports(
-                               structure, options, originalOptions, jqXHR, "*", inspected );
-       }
-       // unnecessary when only executing (prefilters)
-       // but it'll be ignored by the caller in that case
-       return selection;
-}
-
-// A special extend for ajax options
-// that takes "flat" options (not to be deep extended)
-// Fixes #9887
-function ajaxExtend( target, src ) {
-       var key, deep,
-               flatOptions = jQuery.ajaxSettings.flatOptions || {};
-       for ( key in src ) {
-               if ( src[ key ] !== undefined ) {
-                       ( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ];
-               }
-       }
-       if ( deep ) {
-               jQuery.extend( true, target, deep );
-       }
-}
-
-jQuery.fn.load = function( url, params, callback ) {
-       if ( typeof url !== "string" && _load ) {
-               return _load.apply( this, arguments );
-       }
-
-       // Don't do a request if no elements are being requested
-       if ( !this.length ) {
-               return this;
-       }
-
-       var selector, type, response,
-               self = this,
-               off = url.indexOf(" ");
-
-       if ( off >= 0 ) {
-               selector = url.slice( off, url.length );
-               url = url.slice( 0, off );
-       }
-
-       // If it's a function
-       if ( jQuery.isFunction( params ) ) {
-
-               // We assume that it's the callback
-               callback = params;
-               params = undefined;
-
-       // Otherwise, build a param string
-       } else if ( params && typeof params === "object" ) {
-               type = "POST";
-       }
-
-       // Request the remote document
-       jQuery.ajax({
-               url: url,
-
-               // if "type" variable is undefined, then "GET" method will be used
-               type: type,
-               dataType: "html",
-               data: params,
-               complete: function( jqXHR, status ) {
-                       if ( callback ) {
-                               self.each( callback, response || [ jqXHR.responseText, status, jqXHR ] );
-                       }
-               }
-       }).done(function( responseText ) {
-
-               // Save response for use in complete callback
-               response = arguments;
-
-               // See if a selector was specified
-               self.html( selector ?
-
-                       // Create a dummy div to hold the results
-                       jQuery("<div>")
-
-                               // inject the contents of the document in, removing the scripts
-                               // to avoid any 'Permission Denied' errors in IE
-                               .append( responseText.replace( rscript, "" ) )
-
-                               // Locate the specified elements
-                               .find( selector ) :
-
-                       // If not, just inject the full result
-                       responseText );
-
-       });
-
-       return this;
-};
-
-// Attach a bunch of functions for handling common AJAX events
-jQuery.each( "ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split( " " ), function( i, o ){
-       jQuery.fn[ o ] = function( f ){
-               return this.on( o, f );
-       };
-});
-
-jQuery.each( [ "get", "post" ], function( i, method ) {
-       jQuery[ method ] = function( url, data, callback, type ) {
-               // shift arguments if data argument was omitted
-               if ( jQuery.isFunction( data ) ) {
-                       type = type || callback;
-                       callback = data;
-                       data = undefined;
-               }
-
-               return jQuery.ajax({
-                       type: method,
-                       url: url,
-                       data: data,
-                       success: callback,
-                       dataType: type
-               });
-       };
-});
-
-jQuery.extend({
-
-       getScript: function( url, callback ) {
-               return jQuery.get( url, undefined, callback, "script" );
-       },
-
-       getJSON: function( url, data, callback ) {
-               return jQuery.get( url, data, callback, "json" );
-       },
-
-       // Creates a full fledged settings object into target
-       // with both ajaxSettings and settings fields.
-       // If target is omitted, writes into ajaxSettings.
-       ajaxSetup: function( target, settings ) {
-               if ( settings ) {
-                       // Building a settings object
-                       ajaxExtend( target, jQuery.ajaxSettings );
-               } else {
-                       // Extending ajaxSettings
-                       settings = target;
-                       target = jQuery.ajaxSettings;
-               }
-               ajaxExtend( target, settings );
-               return target;
-       },
-
-       ajaxSettings: {
-               url: ajaxLocation,
-               isLocal: rlocalProtocol.test( ajaxLocParts[ 1 ] ),
-               global: true,
-               type: "GET",
-               contentType: "application/x-www-form-urlencoded; charset=UTF-8",
-               processData: true,
-               async: true,
-               /*
-               timeout: 0,
-               data: null,
-               dataType: null,
-               username: null,
-               password: null,
-               cache: null,
-               throws: false,
-               traditional: false,
-               headers: {},
-               */
-
-               accepts: {
-                       xml: "application/xml, text/xml",
-                       html: "text/html",
-                       text: "text/plain",
-                       json: "application/json, text/javascript",
-                       "*": allTypes
-               },
-
-               contents: {
-                       xml: /xml/,
-                       html: /html/,
-                       json: /json/
-               },
-
-               responseFields: {
-                       xml: "responseXML",
-                       text: "responseText"
-               },
-
-               // List of data converters
-               // 1) key format is "source_type destination_type" (a single space in-between)
-               // 2) the catchall symbol "*" can be used for source_type
-               converters: {
-
-                       // Convert anything to text
-                       "* text": window.String,
-
-                       // Text to html (true = no transformation)
-                       "text html": true,
-
-                       // Evaluate text as a json expression
-                       "text json": jQuery.parseJSON,
-
-                       // Parse text as xml
-                       "text xml": jQuery.parseXML
-               },
-
-               // For options that shouldn't be deep extended:
-               // you can add your own custom options here if
-               // and when you create one that shouldn't be
-               // deep extended (see ajaxExtend)
-               flatOptions: {
-                       context: true,
-                       url: true
-               }
-       },
-
-       ajaxPrefilter: addToPrefiltersOrTransports( prefilters ),
-       ajaxTransport: addToPrefiltersOrTransports( transports ),
-
-       // Main method
-       ajax: function( url, options ) {
-
-               // If url is an object, simulate pre-1.5 signature
-               if ( typeof url === "object" ) {
-                       options = url;
-                       url = undefined;
-               }
-
-               // Force options to be an object
-               options = options || {};
-
-               var // ifModified key
-                       ifModifiedKey,
-                       // Response headers
-                       responseHeadersString,
-                       responseHeaders,
-                       // transport
-                       transport,
-                       // timeout handle
-                       timeoutTimer,
-                       // Cross-domain detection vars
-                       parts,
-                       // To know if global events are to be dispatched
-                       fireGlobals,
-                       // Loop variable
-                       i,
-                       // Create the final options object
-                       s = jQuery.ajaxSetup( {}, options ),
-                       // Callbacks context
-                       callbackContext = s.context || s,
-                       // Context for global events
-                       // It's the callbackContext if one was provided in the options
-                       // and if it's a DOM node or a jQuery collection
-                       globalEventContext = callbackContext !== s &&
-                               ( callbackContext.nodeType || callbackContext instanceof jQuery ) ?
-                                               jQuery( callbackContext ) : jQuery.event,
-                       // Deferreds
-                       deferred = jQuery.Deferred(),
-                       completeDeferred = jQuery.Callbacks( "once memory" ),
-                       // Status-dependent callbacks
-                       statusCode = s.statusCode || {},
-                       // Headers (they are sent all at once)
-                       requestHeaders = {},
-                       requestHeadersNames = {},
-                       // The jqXHR state
-                       state = 0,
-                       // Default abort message
-                       strAbort = "canceled",
-                       // Fake xhr
-                       jqXHR = {
-
-                               readyState: 0,
-
-                               // Caches the header
-                               setRequestHeader: function( name, value ) {
-                                       if ( !state ) {
-                                               var lname = name.toLowerCase();
-                                               name = requestHeadersNames[ lname ] = requestHeadersNames[ lname ] || name;
-                                               requestHeaders[ name ] = value;
-                                       }
-                                       return this;
-                               },
-
-                               // Raw string
-                               getAllResponseHeaders: function() {
-                                       return state === 2 ? responseHeadersString : null;
-                               },
-
-                               // Builds headers hashtable if needed
-                               getResponseHeader: function( key ) {
-                                       var match;
-                                       if ( state === 2 ) {
-                                               if ( !responseHeaders ) {
-                                                       responseHeaders = {};
-                                                       while( ( match = rheaders.exec( responseHeadersString ) ) ) {
-                                                               responseHeaders[ match[1].toLowerCase() ] = match[ 2 ];
-                                                       }
-                                               }
-                                               match = responseHeaders[ key.toLowerCase() ];
-                                       }
-                                       return match === undefined ? null : match;
-                               },
-
-                               // Overrides response content-type header
-                               overrideMimeType: function( type ) {
-                                       if ( !state ) {
-                                               s.mimeType = type;
-                                       }
-                                       return this;
-                               },
-
-                               // Cancel the request
-                               abort: function( statusText ) {
-                                       statusText = statusText || strAbort;
-                                       if ( transport ) {
-                                               transport.abort( statusText );
-                                       }
-                                       done( 0, statusText );
-                                       return this;
-                               }
-                       };
-
-               // Callback for when everything is done
-               // It is defined here because jslint complains if it is declared
-               // at the end of the function (which would be more logical and readable)
-               function done( status, nativeStatusText, responses, headers ) {
-                       var isSuccess, success, error, response, modified,
-                               statusText = nativeStatusText;
-
-                       // Called once
-                       if ( state === 2 ) {
-                               return;
-                       }
-
-                       // State is "done" now
-                       state = 2;
-
-                       // Clear timeout if it exists
-                       if ( timeoutTimer ) {
-                               clearTimeout( timeoutTimer );
-                       }
-
-                       // Dereference transport for early garbage collection
-                       // (no matter how long the jqXHR object will be used)
-                       transport = undefined;
-
-                       // Cache response headers
-                       responseHeadersString = headers || "";
-
-                       // Set readyState
-                       jqXHR.readyState = status > 0 ? 4 : 0;
-
-                       // Get response data
-                       if ( responses ) {
-                               response = ajaxHandleResponses( s, jqXHR, responses );
-                       }
-
-                       // If successful, handle type chaining
-                       if ( status >= 200 && status < 300 || status === 304 ) {
-
-                               // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
-                               if ( s.ifModified ) {
-
-                                       modified = jqXHR.getResponseHeader("Last-Modified");
-                                       if ( modified ) {
-                                               jQuery.lastModified[ ifModifiedKey ] = modified;
-                                       }
-                                       modified = jqXHR.getResponseHeader("Etag");
-                                       if ( modified ) {
-                                               jQuery.etag[ ifModifiedKey ] = modified;
-                                       }
-                               }
-
-                               // If not modified
-                               if ( status === 304 ) {
-
-                                       statusText = "notmodified";
-                                       isSuccess = true;
-
-                               // If we have data
-                               } else {
-
-                                       isSuccess = ajaxConvert( s, response );
-                                       statusText = isSuccess.state;
-                                       success = isSuccess.data;
-                                       error = isSuccess.error;
-                                       isSuccess = !error;
-                               }
-                       } else {
-                               // We extract error from statusText
-                               // then normalize statusText and status for non-aborts
-                               error = statusText;
-                               if ( !statusText || status ) {
-                                       statusText = "error";
-                                       if ( status < 0 ) {
-                                               status = 0;
-                                       }
-                               }
-                       }
-
-                       // Set data for the fake xhr object
-                       jqXHR.status = status;
-                       jqXHR.statusText = ( nativeStatusText || statusText ) + "";
-
-                       // Success/Error
-                       if ( isSuccess ) {
-                               deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );
-                       } else {
-                               deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );
-                       }
-
-                       // Status-dependent callbacks
-                       jqXHR.statusCode( statusCode );
-                       statusCode = undefined;
-
-                       if ( fireGlobals ) {
-                               globalEventContext.trigger( "ajax" + ( isSuccess ? "Success" : "Error" ),
-                                               [ jqXHR, s, isSuccess ? success : error ] );
-                       }
-
-                       // Complete
-                       completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );
-
-                       if ( fireGlobals ) {
-                               globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] );
-                               // Handle the global AJAX counter
-                               if ( !( --jQuery.active ) ) {
-                                       jQuery.event.trigger( "ajaxStop" );
-                               }
-                       }
-               }
-
-               // Attach deferreds
-               deferred.promise( jqXHR );
-               jqXHR.success = jqXHR.done;
-               jqXHR.error = jqXHR.fail;
-               jqXHR.complete = completeDeferred.add;
-
-               // Status-dependent callbacks
-               jqXHR.statusCode = function( map ) {
-                       if ( map ) {
-                               var tmp;
-                               if ( state < 2 ) {
-                                       for ( tmp in map ) {
-                                               statusCode[ tmp ] = [ statusCode[tmp], map[tmp] ];
-                                       }
-                               } else {
-                                       tmp = map[ jqXHR.status ];
-                                       jqXHR.always( tmp );
-                               }
-                       }
-                       return this;
-               };
-
-               // Remove hash character (#7531: and string promotion)
-               // Add protocol if not provided (#5866: IE7 issue with protocol-less urls)
-               // We also use the url parameter if available
-               s.url = ( ( url || s.url ) + "" ).replace( rhash, "" ).replace( rprotocol, ajaxLocParts[ 1 ] + "//" );
-
-               // Extract dataTypes list
-               s.dataTypes = jQuery.trim( s.dataType || "*" ).toLowerCase().split( core_rspace );
-
-               // A cross-domain request is in order when we have a protocol:host:port mismatch
-               if ( s.crossDomain == null ) {
-                       parts = rurl.exec( s.url.toLowerCase() );
-                       s.crossDomain = !!( parts &&
-                               ( parts[ 1 ] !== ajaxLocParts[ 1 ] || parts[ 2 ] !== ajaxLocParts[ 2 ] ||
-                                       ( parts[ 3 ] || ( parts[ 1 ] === "http:" ? 80 : 443 ) ) !=
-                                               ( ajaxLocParts[ 3 ] || ( ajaxLocParts[ 1 ] === "http:" ? 80 : 443 ) ) )
-                       );
-               }
-
-               // Convert data if not already a string
-               if ( s.data && s.processData && typeof s.data !== "string" ) {
-                       s.data = jQuery.param( s.data, s.traditional );
-               }
-
-               // Apply prefilters
-               inspectPrefiltersOrTransports( prefilters, s, options, jqXHR );
-
-               // If request was aborted inside a prefilter, stop there
-               if ( state === 2 ) {
-                       return jqXHR;
-               }
-
-               // We can fire global events as of now if asked to
-               fireGlobals = s.global;
-
-               // Uppercase the type
-               s.type = s.type.toUpperCase();
-
-               // Determine if request has content
-               s.hasContent = !rnoContent.test( s.type );
-
-               // Watch for a new set of requests
-               if ( fireGlobals && jQuery.active++ === 0 ) {
-                       jQuery.event.trigger( "ajaxStart" );
-               }
-
-               // More options handling for requests with no content
-               if ( !s.hasContent ) {
-
-                       // If data is available, append data to url
-                       if ( s.data ) {
-                               s.url += ( rquery.test( s.url ) ? "&" : "?" ) + s.data;
-                               // #9682: remove data so that it's not used in an eventual retry
-                               delete s.data;
-                       }
-
-                       // Get ifModifiedKey before adding the anti-cache parameter
-                       ifModifiedKey = s.url;
-
-                       // Add anti-cache in url if needed
-                       if ( s.cache === false ) {
-
-                               var ts = jQuery.now(),
-                                       // try replacing _= if it is there
-                                       ret = s.url.replace( rts, "$1_=" + ts );
-
-                               // if nothing was replaced, add timestamp to the end
-                               s.url = ret + ( ( ret === s.url ) ? ( rquery.test( s.url ) ? "&" : "?" ) + "_=" + ts : "" );
-                       }
-               }
-
-               // Set the correct header, if data is being sent
-               if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {
-                       jqXHR.setRequestHeader( "Content-Type", s.contentType );
-               }
-
-               // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
-               if ( s.ifModified ) {
-                       ifModifiedKey = ifModifiedKey || s.url;
-                       if ( jQuery.lastModified[ ifModifiedKey ] ) {
-                               jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ ifModifiedKey ] );
-                       }
-                       if ( jQuery.etag[ ifModifiedKey ] ) {
-                               jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ ifModifiedKey ] );
-                       }
-               }
-
-               // Set the Accepts header for the server, depending on the dataType
-               jqXHR.setRequestHeader(
-                       "Accept",
-                       s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[0] ] ?
-                               s.accepts[ s.dataTypes[0] ] + ( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) :
-                               s.accepts[ "*" ]
-               );
-
-               // Check for headers option
-               for ( i in s.headers ) {
-                       jqXHR.setRequestHeader( i, s.headers[ i ] );
-               }
-
-               // Allow custom headers/mimetypes and early abort
-               if ( s.beforeSend && ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || state === 2 ) ) {
-                               // Abort if not done already and return
-                               return jqXHR.abort();
-
-               }
-
-               // aborting is no longer a cancellation
-               strAbort = "abort";
-
-               // Install callbacks on deferreds
-               for ( i in { success: 1, error: 1, complete: 1 } ) {
-                       jqXHR[ i ]( s[ i ] );
-               }
-
-               // Get transport
-               transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );
-
-               // If no transport, we auto-abort
-               if ( !transport ) {
-                       done( -1, "No Transport" );
-               } else {
-                       jqXHR.readyState = 1;
-                       // Send global event
-                       if ( fireGlobals ) {
-                               globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] );
-                       }
-                       // Timeout
-                       if ( s.async && s.timeout > 0 ) {
-                               timeoutTimer = setTimeout( function(){
-                                       jqXHR.abort( "timeout" );
-                               }, s.timeout );
-                       }
-
-                       try {
-                               state = 1;
-                               transport.send( requestHeaders, done );
-                       } catch (e) {
-                               // Propagate exception as error if not done
-                               if ( state < 2 ) {
-                                       done( -1, e );
-                               // Simply rethrow otherwise
-                               } else {
-                                       throw e;
-                               }
-                       }
-               }
-
-               return jqXHR;
-       },
-
-       // Counter for holding the number of active queries
-       active: 0,
-
-       // Last-Modified header cache for next request
-       lastModified: {},
-       etag: {}
-
-});
-
-/* Handles responses to an ajax request:
- * - sets all responseXXX fields accordingly
- * - finds the right dataType (mediates between content-type and expected dataType)
- * - returns the corresponding response
- */
-function ajaxHandleResponses( s, jqXHR, responses ) {
-
-       var ct, type, finalDataType, firstDataType,
-               contents = s.contents,
-               dataTypes = s.dataTypes,
-               responseFields = s.responseFields;
-
-       // Fill responseXXX fields
-       for ( type in responseFields ) {
-               if ( type in responses ) {
-                       jqXHR[ responseFields[type] ] = responses[ type ];
-               }
-       }
-
-       // Remove auto dataType and get content-type in the process
-       while( dataTypes[ 0 ] === "*" ) {
-               dataTypes.shift();
-               if ( ct === undefined ) {
-                       ct = s.mimeType || jqXHR.getResponseHeader( "content-type" );
-               }
-       }
-
-       // Check if we're dealing with a known content-type
-       if ( ct ) {
-               for ( type in contents ) {
-                       if ( contents[ type ] && contents[ type ].test( ct ) ) {
-                               dataTypes.unshift( type );
-                               break;
-                       }
-               }
-       }
-
-       // Check to see if we have a response for the expected dataType
-       if ( dataTypes[ 0 ] in responses ) {
-               finalDataType = dataTypes[ 0 ];
-       } else {
-               // Try convertible dataTypes
-               for ( type in responses ) {
-                       if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[0] ] ) {
-                               finalDataType = type;
-                               break;
-                       }
-                       if ( !firstDataType ) {
-                               firstDataType = type;
-                       }
-               }
-               // Or just use first one
-               finalDataType = finalDataType || firstDataType;
-       }
-
-       // If we found a dataType
-       // We add the dataType to the list if needed
-       // and return the corresponding response
-       if ( finalDataType ) {
-               if ( finalDataType !== dataTypes[ 0 ] ) {
-                       dataTypes.unshift( finalDataType );
-               }
-               return responses[ finalDataType ];
-       }
-}
-
-// Chain conversions given the request and the original response
-function ajaxConvert( s, response ) {
-
-       var conv, conv2, current, tmp,
-               // Work with a copy of dataTypes in case we need to modify it for conversion
-               dataTypes = s.dataTypes.slice(),
-               prev = dataTypes[ 0 ],
-               converters = {},
-               i = 0;
-
-       // Apply the dataFilter if provided
-       if ( s.dataFilter ) {
-               response = s.dataFilter( response, s.dataType );
-       }
-
-       // Create converters map with lowercased keys
-       if ( dataTypes[ 1 ] ) {
-               for ( conv in s.converters ) {
-                       converters[ conv.toLowerCase() ] = s.converters[ conv ];
-               }
-       }
-
-       // Convert to each sequential dataType, tolerating list modification
-       for ( ; (current = dataTypes[++i]); ) {
-
-               // There's only work to do if current dataType is non-auto
-               if ( current !== "*" ) {
-
-                       // Convert response if prev dataType is non-auto and differs from current
-                       if ( prev !== "*" && prev !== current ) {
-
-                               // Seek a direct converter
-                               conv = converters[ prev + " " + current ] || converters[ "* " + current ];
-
-                               // If none found, seek a pair
-                               if ( !conv ) {
-                                       for ( conv2 in converters ) {
-
-                                               // If conv2 outputs current
-                                               tmp = conv2.split(" ");
-                                               if ( tmp[ 1 ] === current ) {
-
-                                                       // If prev can be converted to accepted input
-                                                       conv = converters[ prev + " " + tmp[ 0 ] ] ||
-                                                               converters[ "* " + tmp[ 0 ] ];
-                                                       if ( conv ) {
-                                                               // Condense equivalence converters
-                                                               if ( conv === true ) {
-                                                                       conv = converters[ conv2 ];
-
-                                                               // Otherwise, insert the intermediate dataType
-                                                               } else if ( converters[ conv2 ] !== true ) {
-                                                                       current = tmp[ 0 ];
-                                                                       dataTypes.splice( i--, 0, current );
-                                                               }
-
-                                                               break;
-                                                       }
-                                               }
-                                       }
-                               }
-
-                               // Apply converter (if not an equivalence)
-                               if ( conv !== true ) {
-
-                                       // Unless errors are allowed to bubble, catch and return them
-                                       if ( conv && s["throws"] ) {
-                                               response = conv( response );
-                                       } else {
-                                               try {
-                                                       response = conv( response );
-                                               } catch ( e ) {
-                                                       return { state: "parsererror", error: conv ? e : "No conversion from " + prev + " to " + current };
-                                               }
-                                       }
-                               }
-                       }
-
-                       // Update prev for next iteration
-                       prev = current;
-               }
-       }
-
-       return { state: "success", data: response };
-}
-var oldCallbacks = [],
-       rquestion = /\?/,
-       rjsonp = /(=)\?(?=&|$)|\?\?/,
-       nonce = jQuery.now();
-
-// Default jsonp settings
-jQuery.ajaxSetup({
-       jsonp: "callback",
-       jsonpCallback: function() {
-               var callback = oldCallbacks.pop() || ( jQuery.expando + "_" + ( nonce++ ) );
-               this[ callback ] = true;
-               return callback;
-       }
-});
-
-// Detect, normalize options and install callbacks for jsonp requests
-jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) {
-
-       var callbackName, overwritten, responseContainer,
-               data = s.data,
-               url = s.url,
-               hasCallback = s.jsonp !== false,
-               replaceInUrl = hasCallback && rjsonp.test( url ),
-               replaceInData = hasCallback && !replaceInUrl && typeof data === "string" &&
-                       !( s.contentType || "" ).indexOf("application/x-www-form-urlencoded") &&
-                       rjsonp.test( data );
-
-       // Handle iff the expected data type is "jsonp" or we have a parameter to set
-       if ( s.dataTypes[ 0 ] === "jsonp" || replaceInUrl || replaceInData ) {
-
-               // Get callback name, remembering preexisting value associated with it
-               callbackName = s.jsonpCallback = jQuery.isFunction( s.jsonpCallback ) ?
-                       s.jsonpCallback() :
-                       s.jsonpCallback;
-               overwritten = window[ callbackName ];
-
-               // Insert callback into url or form data
-               if ( replaceInUrl ) {
-                       s.url = url.replace( rjsonp, "$1" + callbackName );
-               } else if ( replaceInData ) {
-                       s.data = data.replace( rjsonp, "$1" + callbackName );
-               } else if ( hasCallback ) {
-                       s.url += ( rquestion.test( url ) ? "&" : "?" ) + s.jsonp + "=" + callbackName;
-               }
-
-               // Use data converter to retrieve json after script execution
-               s.converters["script json"] = function() {
-                       if ( !responseContainer ) {
-                               jQuery.error( callbackName + " was not called" );
-                       }
-                       return responseContainer[ 0 ];
-               };
-
-               // force json dataType
-               s.dataTypes[ 0 ] = "json";
-
-               // Install callback
-               window[ callbackName ] = function() {
-                       responseContainer = arguments;
-               };
-
-               // Clean-up function (fires after converters)
-               jqXHR.always(function() {
-                       // Restore preexisting value
-                       window[ callbackName ] = overwritten;
-
-                       // Save back as free
-                       if ( s[ callbackName ] ) {
-                               // make sure that re-using the options doesn't screw things around
-                               s.jsonpCallback = originalSettings.jsonpCallback;
-
-                               // save the callback name for future use
-                               oldCallbacks.push( callbackName );
-                       }
-
-                       // Call if it was a function and we have a response
-                       if ( responseContainer && jQuery.isFunction( overwritten ) ) {
-                               overwritten( responseContainer[ 0 ] );
-                       }
-
-                       responseContainer = overwritten = undefined;
-               });
-
-               // Delegate to script
-               return "script";
-       }
-});
-// Install script dataType
-jQuery.ajaxSetup({
-       accepts: {
-               script: "text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"
-       },
-       contents: {
-               script: /javascript|ecmascript/
-       },
-       converters: {
-               "text script": function( text ) {
-                       jQuery.globalEval( text );
-                       return text;
-               }
-       }
-});
-
-// Handle cache's special case and global
-jQuery.ajaxPrefilter( "script", function( s ) {
-       if ( s.cache === undefined ) {
-               s.cache = false;
-       }
-       if ( s.crossDomain ) {
-               s.type = "GET";
-               s.global = false;
-       }
-});
-
-// Bind script tag hack transport
-jQuery.ajaxTransport( "script", function(s) {
-
-       // This transport only deals with cross domain requests
-       if ( s.crossDomain ) {
-
-               var script,
-                       head = document.head || document.getElementsByTagName( "head" )[0] || document.documentElement;
-
-               return {
-
-                       send: function( _, callback ) {
-
-                               script = document.createElement( "script" );
-
-                               script.async = "async";
-
-                               if ( s.scriptCharset ) {
-                                       script.charset = s.scriptCharset;
-                               }
-
-                               script.src = s.url;
-
-                               // Attach handlers for all browsers
-                               script.onload = script.onreadystatechange = function( _, isAbort ) {
-
-                                       if ( isAbort || !script.readyState || /loaded|complete/.test( script.readyState ) ) {
-
-                                               // Handle memory leak in IE
-                                               script.onload = script.onreadystatechange = null;
-
-                                               // Remove the script
-                                               if ( head && script.parentNode ) {
-                                                       head.removeChild( script );
-                                               }
-
-                                               // Dereference the script
-                                               script = undefined;
-
-                                               // Callback if not abort
-                                               if ( !isAbort ) {
-                                                       callback( 200, "success" );
-                                               }
-                                       }
-                               };
-                               // Use insertBefore instead of appendChild  to circumvent an IE6 bug.
-                               // This arises when a base node is used (#2709 and #4378).
-                               head.insertBefore( script, head.firstChild );
-                       },
-
-                       abort: function() {
-                               if ( script ) {
-                                       script.onload( 0, 1 );
-                               }
-                       }
-               };
-       }
-});
-var xhrCallbacks,
-       // #5280: Internet Explorer will keep connections alive if we don't abort on unload
-       xhrOnUnloadAbort = window.ActiveXObject ? function() {
-               // Abort all pending requests
-               for ( var key in xhrCallbacks ) {
-                       xhrCallbacks[ key ]( 0, 1 );
-               }
-       } : false,
-       xhrId = 0;
-
-// Functions to create xhrs
-function createStandardXHR() {
-       try {
-               return new window.XMLHttpRequest();
-       } catch( e ) {}
-}
-
-function createActiveXHR() {
-       try {
-               return new window.ActiveXObject( "Microsoft.XMLHTTP" );
-       } catch( e ) {}
-}
-
-// Create the request object
-// (This is still attached to ajaxSettings for backward compatibility)
-jQuery.ajaxSettings.xhr = window.ActiveXObject ?
-       /* Microsoft failed to properly
-        * implement the XMLHttpRequest in IE7 (can't request local files),
-        * so we use the ActiveXObject when it is available
-        * Additionally XMLHttpRequest can be disabled in IE7/IE8 so
-        * we need a fallback.
-        */
-       function() {
-               return !this.isLocal && createStandardXHR() || createActiveXHR();
-       } :
-       // For all other browsers, use the standard XMLHttpRequest object
-       createStandardXHR;
-
-// Determine support properties
-(function( xhr ) {
-       jQuery.extend( jQuery.support, {
-               ajax: !!xhr,
-               cors: !!xhr && ( "withCredentials" in xhr )
-       });
-})( jQuery.ajaxSettings.xhr() );
-
-// Create transport if the browser can provide an xhr
-if ( jQuery.support.ajax ) {
-
-       jQuery.ajaxTransport(function( s ) {
-               // Cross domain only allowed if supported through XMLHttpRequest
-               if ( !s.crossDomain || jQuery.support.cors ) {
-
-                       var callback;
-
-                       return {
-                               send: function( headers, complete ) {
-
-                                       // Get a new xhr
-                                       var handle, i,
-                                               xhr = s.xhr();
-
-                                       // Open the socket
-                                       // Passing null username, generates a login popup on Opera (#2865)
-                                       if ( s.username ) {
-                                               xhr.open( s.type, s.url, s.async, s.username, s.password );
-                                       } else {
-                                               xhr.open( s.type, s.url, s.async );
-                                       }
-
-                                       // Apply custom fields if provided
-                                       if ( s.xhrFields ) {
-                                               for ( i in s.xhrFields ) {
-                                                       xhr[ i ] = s.xhrFields[ i ];
-                                               }
-                                       }
-
-                                       // Override mime type if needed
-                                       if ( s.mimeType && xhr.overrideMimeType ) {
-                                               xhr.overrideMimeType( s.mimeType );
-                                       }
-
-                                       // X-Requested-With header
-                                       // For cross-domain requests, seeing as conditions for a preflight are
-                                       // akin to a jigsaw puzzle, we simply never set it to be sure.
-                                       // (it can always be set on a per-request basis or even using ajaxSetup)
-                                       // For same-domain requests, won't change header if already provided.
-                                       if ( !s.crossDomain && !headers["X-Requested-With"] ) {
-                                               headers[ "X-Requested-With" ] = "XMLHttpRequest";
-                                       }
-
-                                       // Need an extra try/catch for cross domain requests in Firefox 3
-                                       try {
-                                               for ( i in headers ) {
-                                                       xhr.setRequestHeader( i, headers[ i ] );
-                                               }
-                                       } catch( _ ) {}
-
-                                       // Do send the request
-                                       // This may raise an exception which is actually
-                                       // handled in jQuery.ajax (so no try/catch here)
-                                       xhr.send( ( s.hasContent && s.data ) || null );
-
-                                       // Listener
-                                       callback = function( _, isAbort ) {
-
-                                               var status,
-                                                       statusText,
-                                                       responseHeaders,
-                                                       responses,
-                                                       xml;
-
-                                               // Firefox throws exceptions when accessing properties
-                                               // of an xhr when a network error occurred
-                                               // http://helpful.knobs-dials.com/index.php/Component_returned_failure_code:_0x80040111_(NS_ERROR_NOT_AVAILABLE)
-                                               try {
-
-                                                       // Was never called and is aborted or complete
-                                                       if ( callback && ( isAbort || xhr.readyState === 4 ) ) {
-
-                                                               // Only called once
-                                                               callback = undefined;
-
-                                                               // Do not keep as active anymore
-                                                               if ( handle ) {
-                                                                       xhr.onreadystatechange = jQuery.noop;
-                                                                       if ( xhrOnUnloadAbort ) {
-                                                                               delete xhrCallbacks[ handle ];
-                                                                       }
-                                                               }
-
-                                                               // If it's an abort
-                                                               if ( isAbort ) {
-                                                                       // Abort it manually if needed
-                                                                       if ( xhr.readyState !== 4 ) {
-                                                                               xhr.abort();
-                                                                       }
-                                                               } else {
-                                                                       status = xhr.status;
-                                                                       responseHeaders = xhr.getAllResponseHeaders();
-                                                                       responses = {};
-                                                                       xml = xhr.responseXML;
-
-                                                                       // Construct response list
-                                                                       if ( xml && xml.documentElement /* #4958 */ ) {
-                                                                               responses.xml = xml;
-                                                                       }
-
-                                                                       // When requesting binary data, IE6-9 will throw an exception
-                                                                       // on any attempt to access responseText (#11426)
-                                                                       try {
-                                                                               responses.text = xhr.responseText;
-                                                                       } catch( e ) {
-                                                                       }
-
-                                                                       // Firefox throws an exception when accessing
-                                                                       // statusText for faulty cross-domain requests
-                                                                       try {
-                                                                               statusText = xhr.statusText;
-                                                                       } catch( e ) {
-                                                                               // We normalize with Webkit giving an empty statusText
-                                                                               statusText = "";
-                                                                       }
-
-                                                                       // Filter status for non standard behaviors
-
-                                                                       // If the request is local and we have data: assume a success
-                                                                       // (success with no data won't get notified, that's the best we
-                                                                       // can do given current implementations)
-                                                                       if ( !status && s.isLocal && !s.crossDomain ) {
-                                                                               status = responses.text ? 200 : 404;
-                                                                       // IE - #1450: sometimes returns 1223 when it should be 204
-                                                                       } else if ( status === 1223 ) {
-                                                                               status = 204;
-                                                                       }
-                                                               }
-                                                       }
-                                               } catch( firefoxAccessException ) {
-                                                       if ( !isAbort ) {
-                                                               complete( -1, firefoxAccessException );
-                                                       }
-                                               }
-
-                                               // Call complete if needed
-                                               if ( responses ) {
-                                                       complete( status, statusText, responses, responseHeaders );
-                                               }
-                                       };
-
-                                       if ( !s.async ) {
-                                               // if we're in sync mode we fire the callback
-                                               callback();
-                                       } else if ( xhr.readyState === 4 ) {
-                                               // (IE6 & IE7) if it's in cache and has been
-                                               // retrieved directly we need to fire the callback
-                                               setTimeout( callback, 0 );
-                                       } else {
-                                               handle = ++xhrId;
-                                               if ( xhrOnUnloadAbort ) {
-                                                       // Create the active xhrs callbacks list if needed
-                                                       // and attach the unload handler
-                                                       if ( !xhrCallbacks ) {
-                                                               xhrCallbacks = {};
-                                                               jQuery( window ).unload( xhrOnUnloadAbort );
-                                                       }
-                                                       // Add to list of active xhrs callbacks
-                                                       xhrCallbacks[ handle ] = callback;
-                                               }
-                                               xhr.onreadystatechange = callback;
-                                       }
-                               },
-
-                               abort: function() {
-                                       if ( callback ) {
-                                               callback(0,1);
-                                       }
-                               }
-                       };
-               }
-       });
-}
-var fxNow, timerId,
-       rfxtypes = /^(?:toggle|show|hide)$/,
-       rfxnum = new RegExp( "^(?:([-+])=|)(" + core_pnum + ")([a-z%]*)$", "i" ),
-       rrun = /queueHooks$/,
-       animationPrefilters = [ defaultPrefilter ],
-       tweeners = {
-               "*": [function( prop, value ) {
-                       var end, unit,
-                               tween = this.createTween( prop, value ),
-                               parts = rfxnum.exec( value ),
-                               target = tween.cur(),
-                               start = +target || 0,
-                               scale = 1,
-                               maxIterations = 20;
-
-                       if ( parts ) {
-                               end = +parts[2];
-                               unit = parts[3] || ( jQuery.cssNumber[ prop ] ? "" : "px" );
-
-                               // We need to compute starting value
-                               if ( unit !== "px" && start ) {
-                                       // Iteratively approximate from a nonzero starting point
-                                       // Prefer the current property, because this process will be trivial if it uses the same units
-                                       // Fallback to end or a simple constant
-                                       start = jQuery.css( tween.elem, prop, true ) || end || 1;
-
-                                       do {
-                                               // If previous iteration zeroed out, double until we get *something*
-                                               // Use a string for doubling factor so we don't accidentally see scale as unchanged below
-                                               scale = scale || ".5";
-
-                                               // Adjust and apply
-                                               start = start / scale;
-                                               jQuery.style( tween.elem, prop, start + unit );
-
-                                       // Update scale, tolerating zero or NaN from tween.cur()
-                                       // And breaking the loop if scale is unchanged or perfect, or if we've just had enough
-                                       } while ( scale !== (scale = tween.cur() / target) && scale !== 1 && --maxIterations );
-                               }
-
-                               tween.unit = unit;
-                               tween.start = start;
-                               // If a +=/-= token was provided, we're doing a relative animation
-                               tween.end = parts[1] ? start + ( parts[1] + 1 ) * end : end;
-                       }
-                       return tween;
-               }]
-       };
-
-// Animations created synchronously will run synchronously
-function createFxNow() {
-       setTimeout(function() {
-               fxNow = undefined;
-       }, 0 );
-       return ( fxNow = jQuery.now() );
-}
-
-function createTweens( animation, props ) {
-       jQuery.each( props, function( prop, value ) {
-               var collection = ( tweeners[ prop ] || [] ).concat( tweeners[ "*" ] ),
-                       index = 0,
-                       length = collection.length;
-               for ( ; index < length; index++ ) {
-                       if ( collection[ index ].call( animation, prop, value ) ) {
-
-                               // we're done with this property
-                               return;
-                       }
-               }
-       });
-}
-
-function Animation( elem, properties, options ) {
-       var result,
-               index = 0,
-               tweenerIndex = 0,
-               length = animationPrefilters.length,
-               deferred = jQuery.Deferred().always( function() {
-                       // don't match elem in the :animated selector
-                       delete tick.elem;
-               }),
-               tick = function() {
-                       var currentTime = fxNow || createFxNow(),
-                               remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ),
-                               // archaic crash bug won't allow us to use 1 - ( 0.5 || 0 ) (#12497)
-                               temp = remaining / animation.duration || 0,
-                               percent = 1 - temp,
-                               index = 0,
-                               length = animation.tweens.length;
-
-                       for ( ; index < length ; index++ ) {
-                               animation.tweens[ index ].run( percent );
-                       }
-
-                       deferred.notifyWith( elem, [ animation, percent, remaining ]);
-
-                       if ( percent < 1 && length ) {
-                               return remaining;
-                       } else {
-                               deferred.resolveWith( elem, [ animation ] );
-                               return false;
-                       }
-               },
-               animation = deferred.promise({
-                       elem: elem,
-                       props: jQuery.extend( {}, properties ),
-                       opts: jQuery.extend( true, { specialEasing: {} }, options ),
-                       originalProperties: properties,
-                       originalOptions: options,
-                       startTime: fxNow || createFxNow(),
-                       duration: options.duration,
-                       tweens: [],
-                       createTween: function( prop, end, easing ) {
-                               var tween = jQuery.Tween( elem, animation.opts, prop, end,
-                                               animation.opts.specialEasing[ prop ] || animation.opts.easing );
-                               animation.tweens.push( tween );
-                               return tween;
-                       },
-                       stop: function( gotoEnd ) {
-                               var index = 0,
-                                       // if we are going to the end, we want to run all the tweens
-                                       // otherwise we skip this part
-                                       length = gotoEnd ? animation.tweens.length : 0;
-
-                               for ( ; index < length ; index++ ) {
-                                       animation.tweens[ index ].run( 1 );
-                               }
-
-                               // resolve when we played the last frame
-                               // otherwise, reject
-                               if ( gotoEnd ) {
-                                       deferred.resolveWith( elem, [ animation, gotoEnd ] );
-                               } else {
-                                       deferred.rejectWith( elem, [ animation, gotoEnd ] );
-                               }
-                               return this;
-                       }
-               }),
-               props = animation.props;
-
-       propFilter( props, animation.opts.specialEasing );
-
-       for ( ; index < length ; index++ ) {
-               result = animationPrefilters[ index ].call( animation, elem, props, animation.opts );
-               if ( result ) {
-                       return result;
-               }
-       }
-
-       createTweens( animation, props );
-
-       if ( jQuery.isFunction( animation.opts.start ) ) {
-               animation.opts.start.call( elem, animation );
-       }
-
-       jQuery.fx.timer(
-               jQuery.extend( tick, {
-                       anim: animation,
-                       queue: animation.opts.queue,
-                       elem: elem
-               })
-       );
-
-       // attach callbacks from options
-       return animation.progress( animation.opts.progress )
-               .done( animation.opts.done, animation.opts.complete )
-               .fail( animation.opts.fail )
-               .always( animation.opts.always );
-}
-
-function propFilter( props, specialEasing ) {
-       var index, name, easing, value, hooks;
-
-       // camelCase, specialEasing and expand cssHook pass
-       for ( index in props ) {
-               name = jQuery.camelCase( index );
-               easing = specialEasing[ name ];
-               value = props[ index ];
-               if ( jQuery.isArray( value ) ) {
-                       easing = value[ 1 ];
-                       value = props[ index ] = value[ 0 ];
-               }
-
-               if ( index !== name ) {
-                       props[ name ] = value;
-                       delete props[ index ];
-               }
-
-               hooks = jQuery.cssHooks[ name ];
-               if ( hooks && "expand" in hooks ) {
-                       value = hooks.expand( value );
-                       delete props[ name ];
-
-                       // not quite $.extend, this wont overwrite keys already present.
-                       // also - reusing 'index' from above because we have the correct "name"
-                       for ( index in value ) {
-                               if ( !( index in props ) ) {
-                                       props[ index ] = value[ index ];
-                                       specialEasing[ index ] = easing;
-                               }
-                       }
-               } else {
-                       specialEasing[ name ] = easing;
-               }
-       }
-}
-
-jQuery.Animation = jQuery.extend( Animation, {
-
-       tweener: function( props, callback ) {
-               if ( jQuery.isFunction( props ) ) {
-                       callback = props;
-                       props = [ "*" ];
-               } else {
-                       props = props.split(" ");
-               }
-
-               var prop,
-                       index = 0,
-                       length = props.length;
-
-               for ( ; index < length ; index++ ) {
-                       prop = props[ index ];
-                       tweeners[ prop ] = tweeners[ prop ] || [];
-                       tweeners[ prop ].unshift( callback );
-               }
-       },
-
-       prefilter: function( callback, prepend ) {
-               if ( prepend ) {
-                       animationPrefilters.unshift( callback );
-               } else {
-                       animationPrefilters.push( callback );
-               }
-       }
-});
-
-function defaultPrefilter( elem, props, opts ) {
-       var index, prop, value, length, dataShow, toggle, tween, hooks, oldfire,
-               anim = this,
-               style = elem.style,
-               orig = {},
-               handled = [],
-               hidden = elem.nodeType && isHidden( elem );
-
-       // handle queue: false promises
-       if ( !opts.queue ) {
-               hooks = jQuery._queueHooks( elem, "fx" );
-               if ( hooks.unqueued == null ) {
-                       hooks.unqueued = 0;
-                       oldfire = hooks.empty.fire;
-                       hooks.empty.fire = function() {
-                               if ( !hooks.unqueued ) {
-                                       oldfire();
-                               }
-                       };
-               }
-               hooks.unqueued++;
-
-               anim.always(function() {
-                       // doing this makes sure that the complete handler will be called
-                       // before this completes
-                       anim.always(function() {
-                               hooks.unqueued--;
-                               if ( !jQuery.queue( elem, "fx" ).length ) {
-                                       hooks.empty.fire();
-                               }
-                       });
-               });
-       }
-
-       // height/width overflow pass
-       if ( elem.nodeType === 1 && ( "height" in props || "width" in props ) ) {
-               // Make sure that nothing sneaks out
-               // Record all 3 overflow attributes because IE does not
-               // change the overflow attribute when overflowX and
-               // overflowY are set to the same value
-               opts.overflow = [ style.overflow, style.overflowX, style.overflowY ];
-
-               // Set display property to inline-block for height/width
-               // animations on inline elements that are having width/height animated
-               if ( jQuery.css( elem, "display" ) === "inline" &&
-                               jQuery.css( elem, "float" ) === "none" ) {
-
-                       // inline-level elements accept inline-block;
-                       // block-level elements need to be inline with layout
-                       if ( !jQuery.support.inlineBlockNeedsLayout || css_defaultDisplay( elem.nodeName ) === "inline" ) {
-                               style.display = "inline-block";
-
-                       } else {
-                               style.zoom = 1;
-                       }
-               }
-       }
-
-       if ( opts.overflow ) {
-               style.overflow = "hidden";
-               if ( !jQuery.support.shrinkWrapBlocks ) {
-                       anim.done(function() {
-                               style.overflow = opts.overflow[ 0 ];
-                               style.overflowX = opts.overflow[ 1 ];
-                               style.overflowY = opts.overflow[ 2 ];
-                       });
-               }
-       }
-
-
-       // show/hide pass
-       for ( index in props ) {
-               value = props[ index ];
-               if ( rfxtypes.exec( value ) ) {
-                       delete props[ index ];
-                       toggle = toggle || value === "toggle";
-                       if ( value === ( hidden ? "hide" : "show" ) ) {
-                               continue;
-                       }
-                       handled.push( index );
-               }
-       }
-
-       length = handled.length;
-       if ( length ) {
-               dataShow = jQuery._data( elem, "fxshow" ) || jQuery._data( elem, "fxshow", {} );
-               if ( "hidden" in dataShow ) {
-                       hidden = dataShow.hidden;
-               }
-
-               // store state if its toggle - enables .stop().toggle() to "reverse"
-               if ( toggle ) {
-                       dataShow.hidden = !hidden;
-               }
-               if ( hidden ) {
-                       jQuery( elem ).show();
-               } else {
-                       anim.done(function() {
-                               jQuery( elem ).hide();
-                       });
-               }
-               anim.done(function() {
-                       var prop;
-                       jQuery.removeData( elem, "fxshow", true );
-                       for ( prop in orig ) {
-                               jQuery.style( elem, prop, orig[ prop ] );
-                       }
-               });
-               for ( index = 0 ; index < length ; index++ ) {
-                       prop = handled[ index ];
-                       tween = anim.createTween( prop, hidden ? dataShow[ prop ] : 0 );
-                       orig[ prop ] = dataShow[ prop ] || jQuery.style( elem, prop );
-
-                       if ( !( prop in dataShow ) ) {
-                               dataShow[ prop ] = tween.start;
-                               if ( hidden ) {
-                                       tween.end = tween.start;
-                                       tween.start = prop === "width" || prop === "height" ? 1 : 0;
-                               }
-                       }
-               }
-       }
-}
-
-function Tween( elem, options, prop, end, easing ) {
-       return new Tween.prototype.init( elem, options, prop, end, easing );
-}
-jQuery.Tween = Tween;
-
-Tween.prototype = {
-       constructor: Tween,
-       init: function( elem, options, prop, end, easing, unit ) {
-               this.elem = elem;
-               this.prop = prop;
-               this.easing = easing || "swing";
-               this.options = options;
-               this.start = this.now = this.cur();
-               this.end = end;
-               this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" );
-       },
-       cur: function() {
-               var hooks = Tween.propHooks[ this.prop ];
-
-               return hooks && hooks.get ?
-                       hooks.get( this ) :
-                       Tween.propHooks._default.get( this );
-       },
-       run: function( percent ) {
-               var eased,
-                       hooks = Tween.propHooks[ this.prop ];
-
-               if ( this.options.duration ) {
-                       this.pos = eased = jQuery.easing[ this.easing ](
-                               percent, this.options.duration * percent, 0, 1, this.options.duration
-                       );
-               } else {
-                       this.pos = eased = percent;
-               }
-               this.now = ( this.end - this.start ) * eased + this.start;
-
-               if ( this.options.step ) {
-                       this.options.step.call( this.elem, this.now, this );
-               }
-
-               if ( hooks && hooks.set ) {
-                       hooks.set( this );
-               } else {
-                       Tween.propHooks._default.set( this );
-               }
-               return this;
-       }
-};
-
-Tween.prototype.init.prototype = Tween.prototype;
-
-Tween.propHooks = {
-       _default: {
-               get: function( tween ) {
-                       var result;
-
-                       if ( tween.elem[ tween.prop ] != null &&
-                               (!tween.elem.style || tween.elem.style[ tween.prop ] == null) ) {
-                               return tween.elem[ tween.prop ];
-                       }
-
-                       // passing any value as a 4th parameter to .css will automatically
-                       // attempt a parseFloat and fallback to a string if the parse fails
-                       // so, simple values such as "10px" are parsed to Float.
-                       // complex values such as "rotate(1rad)" are returned as is.
-                       result = jQuery.css( tween.elem, tween.prop, false, "" );
-                       // Empty strings, null, undefined and "auto" are converted to 0.
-                       return !result || result === "auto" ? 0 : result;
-               },
-               set: function( tween ) {
-                       // use step hook for back compat - use cssHook if its there - use .style if its
-                       // available and use plain properties where available
-                       if ( jQuery.fx.step[ tween.prop ] ) {
-                               jQuery.fx.step[ tween.prop ]( tween );
-                       } else if ( tween.elem.style && ( tween.elem.style[ jQuery.cssProps[ tween.prop ] ] != null || jQuery.cssHooks[ tween.prop ] ) ) {
-                               jQuery.style( tween.elem, tween.prop, tween.now + tween.unit );
-                       } else {
-                               tween.elem[ tween.prop ] = tween.now;
-                       }
-               }
-       }
-};
-
-// Remove in 2.0 - this supports IE8's panic based approach
-// to setting things on disconnected nodes
-
-Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {
-       set: function( tween ) {
-               if ( tween.elem.nodeType && tween.elem.parentNode ) {
-                       tween.elem[ tween.prop ] = tween.now;
-               }
-       }
-};
-
-jQuery.each([ "toggle", "show", "hide" ], function( i, name ) {
-       var cssFn = jQuery.fn[ name ];
-       jQuery.fn[ name ] = function( speed, easing, callback ) {
-               return speed == null || typeof speed === "boolean" ||
-                       // special check for .toggle( handler, handler, ... )
-                       ( !i && jQuery.isFunction( speed ) && jQuery.isFunction( easing ) ) ?
-                       cssFn.apply( this, arguments ) :
-                       this.animate( genFx( name, true ), speed, easing, callback );
-       };
-});
-
-jQuery.fn.extend({
-       fadeTo: function( speed, to, easing, callback ) {
-
-               // show any hidden elements after setting opacity to 0
-               return this.filter( isHidden ).css( "opacity", 0 ).show()
-
-                       // animate to the value specified
-                       .end().animate({ opacity: to }, speed, easing, callback );
-       },
-       animate: function( prop, speed, easing, callback ) {
-               var empty = jQuery.isEmptyObject( prop ),
-                       optall = jQuery.speed( speed, easing, callback ),
-                       doAnimation = function() {
-                               // Operate on a copy of prop so per-property easing won't be lost
-                               var anim = Animation( this, jQuery.extend( {}, prop ), optall );
-
-                               // Empty animations resolve immediately
-                               if ( empty ) {
-                                       anim.stop( true );
-                               }
-                       };
-
-               return empty || optall.queue === false ?
-                       this.each( doAnimation ) :
-                       this.queue( optall.queue, doAnimation );
-       },
-       stop: function( type, clearQueue, gotoEnd ) {
-               var stopQueue = function( hooks ) {
-                       var stop = hooks.stop;
-                       delete hooks.stop;
-                       stop( gotoEnd );
-               };
-
-               if ( typeof type !== "string" ) {
-                       gotoEnd = clearQueue;
-                       clearQueue = type;
-                       type = undefined;
-               }
-               if ( clearQueue && type !== false ) {
-                       this.queue( type || "fx", [] );
-               }
-
-               return this.each(function() {
-                       var dequeue = true,
-                               index = type != null && type + "queueHooks",
-                               timers = jQuery.timers,
-                               data = jQuery._data( this );
-
-                       if ( index ) {
-                               if ( data[ index ] && data[ index ].stop ) {
-                                       stopQueue( data[ index ] );
-                               }
-                       } else {
-                               for ( index in data ) {
-                                       if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) {
-                                               stopQueue( data[ index ] );
-                                       }
-                               }
-                       }
-
-                       for ( index = timers.length; index--; ) {
-                               if ( timers[ index ].elem === this && (type == null || timers[ index ].queue === type) ) {
-                                       timers[ index ].anim.stop( gotoEnd );
-                                       dequeue = false;
-                                       timers.splice( index, 1 );
-                               }
-                       }
-
-                       // start the next in the queue if the last step wasn't forced
-                       // timers currently will call their complete callbacks, which will dequeue
-                       // but only if they were gotoEnd
-                       if ( dequeue || !gotoEnd ) {
-                               jQuery.dequeue( this, type );
-                       }
-               });
-       }
-});
-
-// Generate parameters to create a standard animation
-function genFx( type, includeWidth ) {
-       var which,
-               attrs = { height: type },
-               i = 0;
-
-       // if we include width, step value is 1 to do all cssExpand values,
-       // if we don't include width, step value is 2 to skip over Left and Right
-       includeWidth = includeWidth? 1 : 0;
-       for( ; i < 4 ; i += 2 - includeWidth ) {
-               which = cssExpand[ i ];
-               attrs[ "margin" + which ] = attrs[ "padding" + which ] = type;
-       }
-
-       if ( includeWidth ) {
-               attrs.opacity = attrs.width = type;
-       }
-
-       return attrs;
-}
-
-// Generate shortcuts for custom animations
-jQuery.each({
-       slideDown: genFx("show"),
-       slideUp: genFx("hide"),
-       slideToggle: genFx("toggle"),
-       fadeIn: { opacity: "show" },
-       fadeOut: { opacity: "hide" },
-       fadeToggle: { opacity: "toggle" }
-}, function( name, props ) {
-       jQuery.fn[ name ] = function( speed, easing, callback ) {
-               return this.animate( props, speed, easing, callback );
-       };
-});
-
-jQuery.speed = function( speed, easing, fn ) {
-       var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : {
-               complete: fn || !fn && easing ||
-                       jQuery.isFunction( speed ) && speed,
-               duration: speed,
-               easing: fn && easing || easing && !jQuery.isFunction( easing ) && easing
-       };
-
-       opt.duration = jQuery.fx.off ? 0 : typeof opt.duration === "number" ? opt.duration :
-               opt.duration in jQuery.fx.speeds ? jQuery.fx.speeds[ opt.duration ] : jQuery.fx.speeds._default;
-
-       // normalize opt.queue - true/undefined/null -> "fx"
-       if ( opt.queue == null || opt.queue === true ) {
-               opt.queue = "fx";
-       }
-
-       // Queueing
-       opt.old = opt.complete;
-
-       opt.complete = function() {
-               if ( jQuery.isFunction( opt.old ) ) {
-                       opt.old.call( this );
-               }
-
-               if ( opt.queue ) {
-                       jQuery.dequeue( this, opt.queue );
-               }
-       };
-
-       return opt;
-};
-
-jQuery.easing = {
-       linear: function( p ) {
-               return p;
-       },
-       swing: function( p ) {
-               return 0.5 - Math.cos( p*Math.PI ) / 2;
-       }
-};
-
-jQuery.timers = [];
-jQuery.fx = Tween.prototype.init;
-jQuery.fx.tick = function() {
-       var timer,
-               timers = jQuery.timers,
-               i = 0;
-
-       fxNow = jQuery.now();
-
-       for ( ; i < timers.length; i++ ) {
-               timer = timers[ i ];
-               // Checks the timer has not already been removed
-               if ( !timer() && timers[ i ] === timer ) {
-                       timers.splice( i--, 1 );
-               }
-       }
-
-       if ( !timers.length ) {
-               jQuery.fx.stop();
-       }
-       fxNow = undefined;
-};
-
-jQuery.fx.timer = function( timer ) {
-       if ( timer() && jQuery.timers.push( timer ) && !timerId ) {
-               timerId = setInterval( jQuery.fx.tick, jQuery.fx.interval );
-       }
-};
-
-jQuery.fx.interval = 13;
-
-jQuery.fx.stop = function() {
-       clearInterval( timerId );
-       timerId = null;
-};
-
-jQuery.fx.speeds = {
-       slow: 600,
-       fast: 200,
-       // Default speed
-       _default: 400
-};
-
-// Back Compat <1.8 extension point
-jQuery.fx.step = {};
-
-if ( jQuery.expr && jQuery.expr.filters ) {
-       jQuery.expr.filters.animated = function( elem ) {
-               return jQuery.grep(jQuery.timers, function( fn ) {
-                       return elem === fn.elem;
-               }).length;
-       };
-}
-var rroot = /^(?:body|html)$/i;
-
-jQuery.fn.offset = function( options ) {
-       if ( arguments.length ) {
-               return options === undefined ?
-                       this :
-                       this.each(function( i ) {
-                               jQuery.offset.setOffset( this, options, i );
-                       });
-       }
-
-       var docElem, body, win, clientTop, clientLeft, scrollTop, scrollLeft,
-               box = { top: 0, left: 0 },
-               elem = this[ 0 ],
-               doc = elem && elem.ownerDocument;
-
-       if ( !doc ) {
-               return;
-       }
-
-       if ( (body = doc.body) === elem ) {
-               return jQuery.offset.bodyOffset( elem );
-       }
-
-       docElem = doc.documentElement;
-
-       // Make sure it's not a disconnected DOM node
-       if ( !jQuery.contains( docElem, elem ) ) {
-               return box;
-       }
-
-       // If we don't have gBCR, just use 0,0 rather than error
-       // BlackBerry 5, iOS 3 (original iPhone)
-       if ( typeof elem.getBoundingClientRect !== "undefined" ) {
-               box = elem.getBoundingClientRect();
-       }
-       win = getWindow( doc );
-       clientTop  = docElem.clientTop  || body.clientTop  || 0;
-       clientLeft = docElem.clientLeft || body.clientLeft || 0;
-       scrollTop  = win.pageYOffset || docElem.scrollTop;
-       scrollLeft = win.pageXOffset || docElem.scrollLeft;
-       return {
-               top: box.top  + scrollTop  - clientTop,
-               left: box.left + scrollLeft - clientLeft
-       };
-};
-
-jQuery.offset = {
-
-       bodyOffset: function( body ) {
-               var top = body.offsetTop,
-                       left = body.offsetLeft;
-
-               if ( jQuery.support.doesNotIncludeMarginInBodyOffset ) {
-                       top  += parseFloat( jQuery.css(body, "marginTop") ) || 0;
-                       left += parseFloat( jQuery.css(body, "marginLeft") ) || 0;
-               }
-
-               return { top: top, left: left };
-       },
-
-       setOffset: function( elem, options, i ) {
-               var position = jQuery.css( elem, "position" );
-
-               // set position first, in-case top/left are set even on static elem
-               if ( position === "static" ) {
-                       elem.style.position = "relative";
-               }
-
-               var curElem = jQuery( elem ),
-                       curOffset = curElem.offset(),
-                       curCSSTop = jQuery.css( elem, "top" ),
-                       curCSSLeft = jQuery.css( elem, "left" ),
-                       calculatePosition = ( position === "absolute" || position === "fixed" ) && jQuery.inArray("auto", [curCSSTop, curCSSLeft]) > -1,
-                       props = {}, curPosition = {}, curTop, curLeft;
-
-               // need to be able to calculate position if either top or left is auto and position is either absolute or fixed
-               if ( calculatePosition ) {
-                       curPosition = curElem.position();
-                       curTop = curPosition.top;
-                       curLeft = curPosition.left;
-               } else {
-                       curTop = parseFloat( curCSSTop ) || 0;
-                       curLeft = parseFloat( curCSSLeft ) || 0;
-               }
-
-               if ( jQuery.isFunction( options ) ) {
-                       options = options.call( elem, i, curOffset );
-               }
-
-               if ( options.top != null ) {
-                       props.top = ( options.top - curOffset.top ) + curTop;
-               }
-               if ( options.left != null ) {
-                       props.left = ( options.left - curOffset.left ) + curLeft;
-               }
-
-               if ( "using" in options ) {
-                       options.using.call( elem, props );
-               } else {
-                       curElem.css( props );
-               }
-       }
-};
-
-
-jQuery.fn.extend({
-
-       position: function() {
-               if ( !this[0] ) {
-                       return;
-               }
-
-               var elem = this[0],
-
-               // Get *real* offsetParent
-               offsetParent = this.offsetParent(),
-
-               // Get correct offsets
-               offset       = this.offset(),
-               parentOffset = rroot.test(offsetParent[0].nodeName) ? { top: 0, left: 0 } : offsetParent.offset();
-
-               // Subtract element margins
-               // note: when an element has margin: auto the offsetLeft and marginLeft
-               // are the same in Safari causing offset.left to incorrectly be 0
-               offset.top  -= parseFloat( jQuery.css(elem, "marginTop") ) || 0;
-               offset.left -= parseFloat( jQuery.css(elem, "marginLeft") ) || 0;
-
-               // Add offsetParent borders
-               parentOffset.top  += parseFloat( jQuery.css(offsetParent[0], "borderTopWidth") ) || 0;
-               parentOffset.left += parseFloat( jQuery.css(offsetParent[0], "borderLeftWidth") ) || 0;
-
-               // Subtract the two offsets
-               return {
-                       top:  offset.top  - parentOffset.top,
-                       left: offset.left - parentOffset.left
-               };
-       },
-
-       offsetParent: function() {
-               return this.map(function() {
-                       var offsetParent = this.offsetParent || document.body;
-                       while ( offsetParent && (!rroot.test(offsetParent.nodeName) && jQuery.css(offsetParent, "position") === "static") ) {
-                               offsetParent = offsetParent.offsetParent;
-                       }
-                       return offsetParent || document.body;
-               });
-       }
-});
-
-
-// Create scrollLeft and scrollTop methods
-jQuery.each( {scrollLeft: "pageXOffset", scrollTop: "pageYOffset"}, function( method, prop ) {
-       var top = /Y/.test( prop );
-
-       jQuery.fn[ method ] = function( val ) {
-               return jQuery.access( this, function( elem, method, val ) {
-                       var win = getWindow( elem );
-
-                       if ( val === undefined ) {
-                               return win ? (prop in win) ? win[ prop ] :
-                                       win.document.documentElement[ method ] :
-                                       elem[ method ];
-                       }
-
-                       if ( win ) {
-                               win.scrollTo(
-                                       !top ? val : jQuery( win ).scrollLeft(),
-                                        top ? val : jQuery( win ).scrollTop()
-                               );
-
-                       } else {
-                               elem[ method ] = val;
-                       }
-               }, method, val, arguments.length, null );
-       };
-});
-
-function getWindow( elem ) {
-       return jQuery.isWindow( elem ) ?
-               elem :
-               elem.nodeType === 9 ?
-                       elem.defaultView || elem.parentWindow :
-                       false;
-}
-// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods
-jQuery.each( { Height: "height", Width: "width" }, function( name, type ) {
-       jQuery.each( { padding: "inner" + name, content: type, "": "outer" + name }, function( defaultExtra, funcName ) {
-               // margin is only for outerHeight, outerWidth
-               jQuery.fn[ funcName ] = function( margin, value ) {
-                       var chainable = arguments.length && ( defaultExtra || typeof margin !== "boolean" ),
-                               extra = defaultExtra || ( margin === true || value === true ? "margin" : "border" );
-
-                       return jQuery.access( this, function( elem, type, value ) {
-                               var doc;
-
-                               if ( jQuery.isWindow( elem ) ) {
-                                       // As of 5/8/2012 this will yield incorrect results for Mobile Safari, but there
-                                       // isn't a whole lot we can do. See pull request at this URL for discussion:
-                                       // https://github.com/jquery/jquery/pull/764
-                                       return elem.document.documentElement[ "client" + name ];
-                               }
-
-                               // Get document width or height
-                               if ( elem.nodeType === 9 ) {
-                                       doc = elem.documentElement;
-
-                                       // Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height], whichever is greatest
-                                       // unfortunately, this causes bug #3838 in IE6/8 only, but there is currently no good, small way to fix it.
-                                       return Math.max(
-                                               elem.body[ "scroll" + name ], doc[ "scroll" + name ],
-                                               elem.body[ "offset" + name ], doc[ "offset" + name ],
-                                               doc[ "client" + name ]
-                                       );
-                               }
-
-                               return value === undefined ?
-                                       // Get width or height on the element, requesting but not forcing parseFloat
-                                       jQuery.css( elem, type, value, extra ) :
-
-                                       // Set width or height on the element
-                                       jQuery.style( elem, type, value, extra );
-                       }, type, chainable ? margin : undefined, chainable, null );
-               };
-       });
-});
-// Expose jQuery to the global object
-window.jQuery = window.$ = jQuery;
-
-// Expose jQuery as an AMD module, but only for AMD loaders that
-// understand the issues with loading multiple versions of jQuery
-// in a page that all might call define(). The loader will indicate
-// they have special allowances for multiple jQuery versions by
-// specifying define.amd.jQuery = true. Register as a named module,
-// since jQuery can be concatenated with other files that may use define,
-// but not use a proper concatenation script that understands anonymous
-// AMD modules. A named AMD is safest and most robust way to register.
-// Lowercase jquery is used because AMD module names are derived from
-// file names, and jQuery is normally delivered in a lowercase file name.
-// Do this after creating the global so that if an AMD module wants to call
-// noConflict to hide this version of jQuery, it will work.
-if ( typeof define === "function" && define.amd && define.amd.jQuery ) {
-       define( "jquery", [], function () { return jQuery; } );
-}
-
-})( window );
diff --git a/resources/jquery/jquery.json.js b/resources/jquery/jquery.json.js
deleted file mode 100644 (file)
index 75953f4..0000000
+++ /dev/null
@@ -1,199 +0,0 @@
-/**
- * jQuery JSON plugin 2.4.0
- *
- * @author Brantley Harris, 2009-2011
- * @author Timo Tijhof, 2011-2012
- * @source This plugin is heavily influenced by MochiKit's serializeJSON, which is
- *         copyrighted 2005 by Bob Ippolito.
- * @source Brantley Harris wrote this plugin. It is based somewhat on the JSON.org
- *         website's http://www.json.org/json2.js, which proclaims:
- *         "NO WARRANTY EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK.", a sentiment that
- *         I uphold.
- * @license MIT License <http://www.opensource.org/licenses/mit-license.php>
- */
-(function ($) {
-       'use strict';
-
-       var escape = /["\\\x00-\x1f\x7f-\x9f]/g,
-               meta = {
-                       '\b': '\\b',
-                       '\t': '\\t',
-                       '\n': '\\n',
-                       '\f': '\\f',
-                       '\r': '\\r',
-                       '"' : '\\"',
-                       '\\': '\\\\'
-               },
-               hasOwn = Object.prototype.hasOwnProperty;
-
-       /**
-        * jQuery.toJSON
-        * Converts the given argument into a JSON representation.
-        *
-        * @param o {Mixed} The json-serializable *thing* to be converted
-        *
-        * If an object has a toJSON prototype, that will be used to get the representation.
-        * Non-integer/string keys are skipped in the object, as are keys that point to a
-        * function.
-        *
-        */
-       $.toJSON = typeof JSON === 'object' && JSON.stringify ? JSON.stringify : function (o) {
-               if (o === null) {
-                       return 'null';
-               }
-
-               var pairs, k, name, val,
-                       type = $.type(o);
-
-               if (type === 'undefined') {
-                       return undefined;
-               }
-
-               // Also covers instantiated Number and Boolean objects,
-               // which are typeof 'object' but thanks to $.type, we
-               // catch them here. I don't know whether it is right
-               // or wrong that instantiated primitives are not
-               // exported to JSON as an {"object":..}.
-               // We choose this path because that's what the browsers did.
-               if (type === 'number' || type === 'boolean') {
-                       return String(o);
-               }
-               if (type === 'string') {
-                       return $.quoteString(o);
-               }
-               if (typeof o.toJSON === 'function') {
-                       return $.toJSON(o.toJSON());
-               }
-               if (type === 'date') {
-                       var month = o.getUTCMonth() + 1,
-                               day = o.getUTCDate(),
-                               year = o.getUTCFullYear(),
-                               hours = o.getUTCHours(),
-                               minutes = o.getUTCMinutes(),
-                               seconds = o.getUTCSeconds(),
-                               milli = o.getUTCMilliseconds();
-
-                       if (month < 10) {
-                               month = '0' + month;
-                       }
-                       if (day < 10) {
-                               day = '0' + day;
-                       }
-                       if (hours < 10) {
-                               hours = '0' + hours;
-                       }
-                       if (minutes < 10) {
-                               minutes = '0' + minutes;
-                       }
-                       if (seconds < 10) {
-                               seconds = '0' + seconds;
-                       }
-                       if (milli < 100) {
-                               milli = '0' + milli;
-                       }
-                       if (milli < 10) {
-                               milli = '0' + milli;
-                       }
-                       return '"' + year + '-' + month + '-' + day + 'T' +
-                               hours + ':' + minutes + ':' + seconds +
-                               '.' + milli + 'Z"';
-               }
-
-               pairs = [];
-
-               if ($.isArray(o)) {
-                       for (k = 0; k < o.length; k++) {
-                               pairs.push($.toJSON(o[k]) || 'null');
-                       }
-                       return '[' + pairs.join(',') + ']';
-               }
-
-               // Any other object (plain object, RegExp, ..)
-               // Need to do typeof instead of $.type, because we also
-               // want to catch non-plain objects.
-               if (typeof o === 'object') {
-                       for (k in o) {
-                               // Only include own properties,
-                               // Filter out inherited prototypes
-                               if (hasOwn.call(o, k)) {
-                                       // Keys must be numerical or string. Skip others
-                                       type = typeof k;
-                                       if (type === 'number') {
-                                               name = '"' + k + '"';
-                                       } else if (type === 'string') {
-                                               name = $.quoteString(k);
-                                       } else {
-                                               continue;
-                                       }
-                                       type = typeof o[k];
-
-                                       // Invalid values like these return undefined
-                                       // from toJSON, however those object members
-                                       // shouldn't be included in the JSON string at all.
-                                       if (type !== 'function' && type !== 'undefined') {
-                                               val = $.toJSON(o[k]);
-                                               pairs.push(name + ':' + val);
-                                       }
-                               }
-                       }
-                       return '{' + pairs.join(',') + '}';
-               }
-       };
-
-       /**
-        * jQuery.evalJSON
-        * Evaluates a given json string.
-        *
-        * @param str {String}
-        */
-       $.evalJSON = typeof JSON === 'object' && JSON.parse ? JSON.parse : function (str) {
-               /*jshint evil: true */
-               return eval('(' + str + ')');
-       };
-
-       /**
-        * jQuery.secureEvalJSON
-        * Evals JSON in a way that is *more* secure.
-        *
-        * @param str {String}
-        */
-       $.secureEvalJSON = typeof JSON === 'object' && JSON.parse ? JSON.parse : function (str) {
-               var filtered =
-                       str
-                       .replace(/\\["\\\/bfnrtu]/g, '@')
-                       .replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']')
-                       .replace(/(?:^|:|,)(?:\s*\[)+/g, '');
-
-               if (/^[\],:{}\s]*$/.test(filtered)) {
-                       /*jshint evil: true */
-                       return eval('(' + str + ')');
-               }
-               throw new SyntaxError('Error parsing JSON, source is not valid.');
-       };
-
-       /**
-        * jQuery.quoteString
-        * Returns a string-repr of a string, escaping quotes intelligently.
-        * Mostly a support function for toJSON.
-        * Examples:
-        * >>> jQuery.quoteString('apple')
-        * "apple"
-        *
-        * >>> jQuery.quoteString('"Where are we going?", she asked.')
-        * "\"Where are we going?\", she asked."
-        */
-       $.quoteString = function (str) {
-               if (str.match(escape)) {
-                       return '"' + str.replace(escape, function (a) {
-                               var c = meta[a];
-                               if (typeof c === 'string') {
-                                       return c;
-                               }
-                               c = a.charCodeAt();
-                               return '\\u00' + Math.floor(c / 16).toString(16) + (c % 16).toString(16);
-                       }) + '"';
-               }
-               return '"' + str + '"';
-       };
-
-}(jQuery));
diff --git a/resources/jquery/jquery.localize.js b/resources/jquery/jquery.localize.js
deleted file mode 100644 (file)
index f499e10..0000000
+++ /dev/null
@@ -1,170 +0,0 @@
-/**
- * @class jQuery.plugin.localize
- */
-( function ( $, mw ) {
-
-/**
- * Gets a localized message, using parameters from options if present.
- * @ignore
- *
- * @param {Object} options
- * @param {string} key
- * @return {string} Localized message
- */
-function msg( options, key ) {
-       var args = options.params[key] || [];
-       // Format: mw.msg( key [, p1, p2, ...] )
-       args.unshift( options.prefix + ( options.keys[key] || key ) );
-       return mw.msg.apply( mw, args );
-}
-
-/**
- * Localizes a DOM selection by replacing <html:msg /> elements with localized text and adding
- * localized title and alt attributes to elements with title-msg and alt-msg attributes
- * respectively.
- *
- * Call on a selection of HTML which contains `<html:msg key="message-key" />` elements or elements
- * with title-msg="message-key", alt-msg="message-key" or placeholder-msg="message-key" attributes.
- * `<html:msg />` elements will be replaced with localized text, *-msg attributes will be replaced
- * with attributes that do not have the "-msg" suffix and contain a localized message.
- *
- * Example:
- *     // Messages: { 'title': 'Awesome', 'desc': 'Cat doing backflip' 'search' contains 'Search' }
- *     var html = '\
- *         <p>\
- *             <html:msg key="title" />\
- *             <img src="something.jpg" title-msg="title" alt-msg="desc" />\
- *             <input type="text" placeholder-msg="search" />\
- *         </p>';
- *     $( 'body' ).append( $( html ).localize() );
- *
- * Appends something like this to the body...
- *     <p>
- *         Awesome
- *         <img src="something.jpg" title="Awesome" alt="Cat doing backflip" />
- *         <input type="text" placeholder="Search" />
- *     </p>
- *
- * Arguments can be passed into uses of a message using the params property of the options object
- * given to .localize(). Multiple messages can be given parameters, because the params property is
- * an object keyed by the message key to apply the parameters to, each containing an array of
- * parameters to use. The limitation is that you can not use different parameters to individual uses
- * of a message in the same selection being localized - they will all recieve the same parameters.
- *
- * Example:
- *     // Messages: { 'easy-as': 'Easy as $1 $2 $3.' }
- *     var html = '<p><html:msg key="easy-as" /></p>';
- *     $( 'body' ).append( $( html ).localize( { 'params': { 'easy-as': ['a', 'b', 'c'] } } ) );
- *
- * Appends something like this to the body...
- *     <p>Easy as a, b, c</p>
- *
- * Raw HTML content can be used, instead of it being escaped as text. To do this, just use the raw
- * attribute on a msg element.
- *
- * Example:
- *     // Messages: { 'hello': '<b><i>Hello</i> $1!</b>' }
- *     var html = '\
- *         <p>\
- *             <!-- escaped: --><html:msg key="hello" />\
- *             <!-- raw: --><html:msg key="hello" raw />\
- *         </p>';
- *     $( 'body' ).append( $( html ).localize( { 'params': { 'hello': ['world'] } } ) );
- *
- * Appends something like this to the body...
- *     <p>
- *         <!-- escaped: -->&lt;b&gt;&lt;i&gt;Hello&lt;/i&gt; world!&lt;/b&gt;
- *         <!-- raw: --><b><i>Hello</i> world!</b>
- *     </p>
- *
- * Message keys can also be remapped, allowing the same generic template to be used with a variety
- * of messages. This is important for improving re-usability of templates.
- *
- * Example:
- *     // Messages: { 'good-afternoon': 'Good afternoon' }
- *     var html = '<p><html:msg key="greeting" /></p>';
- *     $( 'body' ).append( $( html ).localize( { 'keys': { 'greeting': 'good-afternoon' } } ) );
- *
- * Appends something like this to the body...
- *     <p>Good afternoon</p>
- *
- * Message keys can also be prefixed globally, which is handy when writing extensions, where by
- * convention all messages are prefixed with the extension's name.
- *
- * Example:
- *     // Messages: { 'teleportation-warning': 'You may not get there all in one piece.' }
- *     var html = '<p><html:msg key="warning" /></p>';
- *     $( 'body' ).append( $( html ).localize( { 'prefix': 'teleportation-' } ) );
- *
- * Appends something like this to the body...
- *     <p>You may not get there all in one piece.</p>
- *
- * @param {Object} options Map of options to be used while localizing
- * @param {string} options.prefix String to prepend to all message keys
- * @param {Object} options.keys Message key aliases, used for remapping keys to a template
- * @param {Object} options.params Lists of parameters to use with certain message keys
- * @return {jQuery}
- * @chainable
- */
-$.fn.localize = function ( options ) {
-       var $target = this,
-               attributes = ['title', 'alt', 'placeholder'];
-
-       // Extend options
-       options = $.extend( {
-               prefix: '',
-               keys: {},
-               params: {}
-       }, options );
-
-       // Elements
-       // Ok, so here's the story on this selector. In IE 6/7, searching for 'msg' turns up the
-       // 'html:msg', but searching for 'html:msg' doesn't. In later IE and other browsers, searching
-       // for 'html:msg' turns up the 'html:msg', but searching for 'msg' doesn't. So searching for
-       // both 'msg' and 'html:msg' seems to get the job done. This feels pretty icky, though.
-       $target.find( 'msg,html\\:msg' ).each( function () {
-               var $el = $(this);
-               // Escape by default
-               if ( $el.attr( 'raw' ) ) {
-                       $el.html( msg( options, $el.attr( 'key' ) ) );
-               } else {
-                       $el.text( msg( options, $el.attr( 'key' ) ) );
-               }
-               // Remove wrapper
-               $el.replaceWith( $el.html() );
-       } );
-
-       // Attributes
-       // Note: there's no way to prevent escaping of values being injected into attributes, this is
-       // on purpose, not a design flaw.
-       $.each( attributes, function ( i, attr ) {
-               var msgAttr = attr + '-msg';
-               $target.find( '[' + msgAttr + ']' ).each( function () {
-                       var $el = $(this);
-                       $el.attr( attr, msg( options, $el.attr( msgAttr ) ) ).removeAttr( msgAttr );
-               } );
-       } );
-
-       // HTML, Text for elements which cannot have children e.g. OPTION
-       $target.find( '[data-msg-text]' ).each( function () {
-               var $el = $( this );
-               $el.text( msg( options, $el.attr( 'data-msg-text' ) ) );
-       } );
-
-       $target.find( '[data-msg-html]' ).each( function () {
-               var $el = $( this );
-               $el.html( msg( options, $el.attr( 'data-msg-html' ) ) );
-       } );
-
-       return $target;
-};
-
-// Let IE know about the msg tag before it's used...
-document.createElement( 'msg' );
-
-/**
- * @class jQuery
- * @mixins jQuery.plugin.localize
- */
-
-}( jQuery, mediaWiki ) );
diff --git a/resources/jquery/jquery.makeCollapsible.css b/resources/jquery/jquery.makeCollapsible.css
deleted file mode 100644 (file)
index 55ea7c9..0000000
+++ /dev/null
@@ -1,23 +0,0 @@
-/* See also jquery.makeCollapsible.js */
-.mw-collapsible-toggle {
-       float: right;
-       -moz-user-select: none;
-       -webkit-user-select: none;
-       -ms-user-select: none;
-       user-select: none;
-}
-
-/* collapse links in captions should be inline */
-caption .mw-collapsible-toggle {
-       float: none;
-}
-
-/* list-items go as wide as their parent element, don't float them inside list items */
-li .mw-collapsible-toggle {
-       float: none;
-}
-
-/* the added list item should have no list-style */
-.mw-collapsible-toggle-li {
-       list-style: none;
-}
diff --git a/resources/jquery/jquery.makeCollapsible.js b/resources/jquery/jquery.makeCollapsible.js
deleted file mode 100644 (file)
index 01fde4c..0000000
+++ /dev/null
@@ -1,394 +0,0 @@
-/**
- * jQuery makeCollapsible
- *
- * This will enable collapsible-functionality on all passed elements.
- * - Will prevent binding twice to the same element.
- * - Initial state is expanded by default, this can be overriden by adding class
- *   "mw-collapsed" to the "mw-collapsible" element.
- * - Elements made collapsible have jQuery data "mw-made-collapsible" set to true.
- * - The inner content is wrapped in a "div.mw-collapsible-content" (except for tables and lists).
- *
- * @author Krinkle, 2011-2012
- *
- * Dual license:
- * @license CC BY 3.0 <http://creativecommons.org/licenses/by/3.0>
- * @license GPL2 <http://www.gnu.org/licenses/old-licenses/gpl-2.0.html>
- */
-( function ( $, mw ) {
-       /**
-        * Handler for a click on a collapsible toggler.
-        *
-        * @param {jQuery} $collapsible
-        * @param {string} action The action this function will take ('expand' or 'collapse').
-        * @param {jQuery|null} [optional] $defaultToggle
-        * @param {Object|undefined} options
-        */
-       function toggleElement( $collapsible, action, $defaultToggle, options ) {
-               var $collapsibleContent, $containers, hookCallback;
-               options = options || {};
-
-               // Validate parameters
-
-               // $collapsible must be an instance of jQuery
-               if ( !$collapsible.jquery ) {
-                       return;
-               }
-               if ( action !== 'expand' && action !== 'collapse' ) {
-                       // action must be string with 'expand' or 'collapse'
-                       return;
-               }
-               if ( $defaultToggle === undefined ) {
-                       $defaultToggle = null;
-               }
-               if ( $defaultToggle !== null && !$defaultToggle.jquery ) {
-                       // is optional (may be undefined), but if defined it must be an instance of jQuery.
-                       // If it's not, abort right away.
-                       // After this $defaultToggle is either null or a valid jQuery instance.
-                       return;
-               }
-
-               // Trigger a custom event to allow callers to hook to the collapsing/expanding,
-               // allowing the module to be testable, and making it possible to
-               // e.g. implement persistence via cookies
-               $collapsible.trigger( action === 'expand' ? 'beforeExpand.mw-collapsible' : 'beforeCollapse.mw-collapsible' );
-               hookCallback = function () {
-                       $collapsible.trigger( action === 'expand' ? 'afterExpand.mw-collapsible' : 'afterCollapse.mw-collapsible' );
-               };
-
-               // Handle different kinds of elements
-
-               if ( !options.plainMode && $collapsible.is( 'table' ) ) {
-                       // Tables
-                       // If there is a caption, hide all rows; otherwise, only hide body rows
-                       if ( $collapsible.find( '> caption' ).length ) {
-                               $containers = $collapsible.find( '> * > tr' );
-                       } else {
-                               $containers = $collapsible.find( '> tbody > tr' );
-                       }
-                       if ( $defaultToggle ) {
-                               // Exclude table row containing togglelink
-                               $containers = $containers.not( $defaultToggle.closest( 'tr' ) );
-                       }
-
-                       if ( action === 'collapse' ) {
-                               // Hide all table rows of this table
-                               // Slide doesn't work with tables, but fade does as of jQuery 1.1.3
-                               // http://stackoverflow.com/questions/467336#920480
-                               if ( options.instantHide ) {
-                                       $containers.hide();
-                                       hookCallback();
-                               } else {
-                                       $containers.stop( true, true ).fadeOut().promise().done( hookCallback );
-                               }
-                       } else {
-                               $containers.stop( true, true ).fadeIn().promise().done( hookCallback );
-                       }
-
-               } else if ( !options.plainMode && ( $collapsible.is( 'ul' ) || $collapsible.is( 'ol' ) ) ) {
-                       // Lists
-                       $containers = $collapsible.find( '> li' );
-                       if ( $defaultToggle ) {
-                               // Exclude list-item containing togglelink
-                               $containers = $containers.not( $defaultToggle.parent() );
-                       }
-
-                       if ( action === 'collapse' ) {
-                               if ( options.instantHide ) {
-                                       $containers.hide();
-                                       hookCallback();
-                               } else {
-                                       $containers.stop( true, true ).slideUp().promise().done( hookCallback );
-                               }
-                       } else {
-                               $containers.stop( true, true ).slideDown().promise().done( hookCallback );
-                       }
-
-               } else {
-                       // Everything else: <div>, <p> etc.
-                       $collapsibleContent = $collapsible.find( '> .mw-collapsible-content' );
-
-                       // If a collapsible-content is defined, act on it
-                       if ( !options.plainMode && $collapsibleContent.length ) {
-                               if ( action === 'collapse' ) {
-                                       if ( options.instantHide ) {
-                                               $collapsibleContent.hide();
-                                               hookCallback();
-                                       } else {
-                                               $collapsibleContent.slideUp().promise().done( hookCallback );
-                                       }
-                               } else {
-                                       $collapsibleContent.slideDown().promise().done( hookCallback );
-                               }
-
-                       // Otherwise assume this is a customcollapse with a remote toggle
-                       // .. and there is no collapsible-content because the entire element should be toggled
-                       } else {
-                               if ( action === 'collapse' ) {
-                                       if ( options.instantHide ) {
-                                               $collapsible.hide();
-                                               hookCallback();
-                                       } else {
-                                               if ( $collapsible.is( 'tr' ) || $collapsible.is( 'td' ) || $collapsible.is( 'th' ) ) {
-                                                       $collapsible.fadeOut().promise().done( hookCallback );
-                                               } else {
-                                                       $collapsible.slideUp().promise().done( hookCallback );
-                                               }
-                                       }
-                               } else {
-                                       if ( $collapsible.is( 'tr' ) || $collapsible.is( 'td' ) || $collapsible.is( 'th' ) ) {
-                                               $collapsible.fadeIn().promise().done( hookCallback );
-                                       } else {
-                                               $collapsible.slideDown().promise().done( hookCallback );
-                                       }
-                               }
-                       }
-               }
-       }
-
-       /**
-        * Handles clicking/keypressing on the collapsible element toggle and other
-        * situations where a collapsible element is toggled (e.g. the initial
-        * toggle for collapsed ones).
-        *
-        * @param {jQuery} $toggle the clickable toggle itself
-        * @param {jQuery} $collapsible the collapsible element
-        * @param {jQuery.Event|null} e either the event or null if unavailable
-        * @param {Object|undefined} options
-        */
-       function togglingHandler( $toggle, $collapsible, e, options ) {
-               var wasCollapsed, $textContainer, collapseText, expandText;
-
-               if ( options === undefined ) {
-                       options = {};
-               }
-
-               if ( e ) {
-                       if ( e.type === 'click' && options.linksPassthru && $.nodeName( e.target, 'a' ) ) {
-                               // Don't fire if a link was clicked, if requested  (for premade togglers by default)
-                               return;
-                       } else if ( e.type === 'keypress' && e.which !== 13 && e.which !== 32 ) {
-                               // Only handle keypresses on the "Enter" or "Space" keys
-                               return;
-                       } else {
-                               e.preventDefault();
-                               e.stopPropagation();
-                       }
-               }
-
-               // This allows the element to be hidden on initial toggle without fiddling with the class
-               if ( options.wasCollapsed !== undefined ) {
-                       wasCollapsed = options.wasCollapsed;
-               } else {
-                       wasCollapsed = $collapsible.hasClass( 'mw-collapsed' );
-               }
-
-               // Toggle the state of the collapsible element (that is, expand or collapse)
-               $collapsible.toggleClass( 'mw-collapsed', !wasCollapsed );
-
-               // Toggle the mw-collapsible-toggle classes, if requested (for default and premade togglers by default)
-               if ( options.toggleClasses ) {
-                       $toggle
-                               .toggleClass( 'mw-collapsible-toggle-collapsed', !wasCollapsed )
-                               .toggleClass( 'mw-collapsible-toggle-expanded', wasCollapsed );
-               }
-
-               // Toggle the text ("Show"/"Hide"), if requested (for default togglers by default)
-               if ( options.toggleText ) {
-                       collapseText = options.toggleText.collapseText;
-                       expandText = options.toggleText.expandText;
-
-                       $textContainer = $toggle.find( '> a' );
-                       if ( !$textContainer.length ) {
-                               $textContainer = $toggle;
-                       }
-                       $textContainer.text( wasCollapsed ? collapseText : expandText );
-               }
-
-               // And finally toggle the element state itself
-               toggleElement( $collapsible, wasCollapsed ? 'expand' : 'collapse', $toggle, options );
-       }
-
-       /**
-        * Make any element collapsible.
-        *
-        * Supported options:
-        * - collapseText: text to be used for the toggler when clicking it would
-        *   collapse the element. Default: the 'data-collapsetext' attribute of
-        *   the collapsible element or the content of 'collapsible-collapse'
-        *   message.
-        * - expandText: text to be used for the toggler when clicking it would
-        *   expand the element. Default: the 'data-expandtext' attribute of
-        *   the collapsible element or the content of 'collapsible-expand'
-        *   message.
-        * - collapsed: boolean, whether to collapse immediately. By default
-        *   collapse only if the elements has the 'mw-collapsible' class.
-        * - $customTogglers: jQuerified list of elements to be used as togglers
-        *   for this collapsible element. By default, if the collapsible element
-        *   has an id attribute like 'mw-customcollapsible-XXX', elements with a
-        *   *class* of 'mw-customtoggle-XXX' are made togglers for it.
-        * - plainMode: boolean, whether to use a "plain mode" when making the
-        *   element collapsible - that is, hide entire tables and lists (instead
-        *   of hiding only all rows but first of tables, and hiding each list
-        *   item separately for lists) and don't wrap other elements in
-        *   div.mw-collapsible-content. May only be used with custom togglers.
-        */
-       $.fn.makeCollapsible = function ( options ) {
-               if ( options === undefined ) {
-                       options = {};
-               }
-
-               return this.each( function () {
-                       var $collapsible, collapseText, expandText, $caption, $toggle, actionHandler, buildDefaultToggleLink,
-                               premadeToggleHandler, $toggleLink, $firstItem, collapsibleId, $customTogglers, firstval;
-
-                       // Ensure class "mw-collapsible" is present in case .makeCollapsible()
-                       // is called on element(s) that don't have it yet.
-                       $collapsible = $( this ).addClass( 'mw-collapsible' );
-
-                       // Return if it has been enabled already.
-                       if ( $collapsible.data( 'mw-made-collapsible' ) ) {
-                               return;
-                       } else {
-                               $collapsible.data( 'mw-made-collapsible', true );
-                       }
-
-                       // Use custom text or default?
-                       collapseText = options.collapseText || $collapsible.attr( 'data-collapsetext' ) || mw.msg( 'collapsible-collapse' );
-                       expandText = options.expandText || $collapsible.attr( 'data-expandtext' ) || mw.msg( 'collapsible-expand' );
-
-                       // Default click/keypress handler and toggle link to use when none is present
-                       actionHandler = function ( e, opts ) {
-                               var defaultOpts = {
-                                       toggleClasses: true,
-                                       toggleText: { collapseText: collapseText, expandText: expandText }
-                               };
-                               opts = $.extend( defaultOpts, options, opts );
-                               togglingHandler( $( this ), $collapsible, e, opts );
-                       };
-                       // Default toggle link. Only build it when needed to avoid jQuery memory leaks (event data).
-                       buildDefaultToggleLink = function () {
-                               return $( '<a href="#"></a>' )
-                                       .text( collapseText )
-                                       .wrap( '<span class="mw-collapsible-toggle"></span>' )
-                                               .parent()
-                                               .prepend( '&nbsp;[' )
-                                               .append( ']&nbsp;' )
-                                               .on( 'click.mw-collapsible keypress.mw-collapsible', actionHandler );
-                       };
-
-                       // Default handler for clicking on premade toggles
-                       premadeToggleHandler = function ( e, opts ) {
-                               var defaultOpts = { toggleClasses: true, linksPassthru: true };
-                               opts = $.extend( defaultOpts, options, opts );
-                               togglingHandler( $( this ), $collapsible, e, opts );
-                       };
-
-                       // Check if this element has a custom position for the toggle link
-                       // (ie. outside the container or deeper inside the tree)
-                       if ( options.$customTogglers ) {
-                               $customTogglers = $( options.$customTogglers );
-                       } else {
-                               collapsibleId = $collapsible.attr( 'id' ) || '';
-                               if ( collapsibleId.indexOf( 'mw-customcollapsible-' ) === 0 ) {
-                                       $customTogglers = $( '.' + collapsibleId.replace( 'mw-customcollapsible', 'mw-customtoggle' ) );
-                               }
-                       }
-
-                       // Add event handlers to custom togglers or create our own ones
-                       if ( $customTogglers && $customTogglers.length ) {
-                               actionHandler = function ( e, opts ) {
-                                       var defaultOpts = {};
-                                       opts = $.extend( defaultOpts, options, opts );
-                                       togglingHandler( $( this ), $collapsible, e, opts );
-                               };
-
-                               $toggleLink = $customTogglers;
-                               $toggleLink.on( 'click.mw-collapsible keypress.mw-collapsible', actionHandler );
-
-                       } else {
-                               // If this is not a custom case, do the default: wrap the
-                               // contents and add the toggle link. Different elements are
-                               // treated differently.
-                               if ( $collapsible.is( 'table' ) ) {
-
-                                       // If the table has a caption, collapse to the caption
-                                       // as opposed to the first row
-                                       $caption = $collapsible.find( '> caption' );
-                                       if ( $caption.length ) {
-                                               $toggle = $caption.find( '> .mw-collapsible-toggle' );
-
-                                               // If there is no toggle link, add it to the end of the caption
-                                               if ( !$toggle.length ) {
-                                                       $toggleLink = buildDefaultToggleLink().appendTo( $caption );
-                                               } else {
-                                                       actionHandler = premadeToggleHandler;
-                                                       $toggleLink = $toggle.on( 'click.mw-collapsible keypress.mw-collapsible', actionHandler );
-                                               }
-                                       } else {
-                                               // The toggle-link will be in one the the cells (td or th) of the first row
-                                               $firstItem = $collapsible.find( 'tr:first th, tr:first td' );
-                                               $toggle = $firstItem.find( '> .mw-collapsible-toggle' );
-
-                                               // If theres no toggle link, add it to the last cell
-                                               if ( !$toggle.length ) {
-                                                       $toggleLink = buildDefaultToggleLink().prependTo( $firstItem.eq( -1 ) );
-                                               } else {
-                                                       actionHandler = premadeToggleHandler;
-                                                       $toggleLink = $toggle.on( 'click.mw-collapsible keypress.mw-collapsible', actionHandler );
-                                               }
-                                       }
-
-                               } else if ( $collapsible.is( 'ul' ) || $collapsible.is( 'ol' ) ) {
-                                       // The toggle-link will be in the first list-item
-                                       $firstItem = $collapsible.find( 'li:first' );
-                                       $toggle = $firstItem.find( '> .mw-collapsible-toggle' );
-
-                                       // If theres no toggle link, add it
-                                       if ( !$toggle.length ) {
-                                               // Make sure the numeral order doesn't get messed up, force the first (soon to be second) item
-                                               // to be "1". Except if the value-attribute is already used.
-                                               // If no value was set WebKit returns "", Mozilla returns '-1', others return 0, null or undefined.
-                                               firstval = $firstItem.attr( 'value' );
-                                               if ( firstval === undefined || !firstval || firstval === '-1' || firstval === -1 ) {
-                                                       $firstItem.attr( 'value', '1' );
-                                               }
-                                               $toggleLink = buildDefaultToggleLink();
-                                               $toggleLink.wrap( '<li class="mw-collapsible-toggle-li"></li>' ).parent().prependTo( $collapsible );
-                                       } else {
-                                               actionHandler = premadeToggleHandler;
-                                               $toggleLink = $toggle.on( 'click.mw-collapsible keypress.mw-collapsible', actionHandler );
-                                       }
-
-                               } else { // <div>, <p> etc.
-
-                                       // The toggle-link will be the first child of the element
-                                       $toggle = $collapsible.find( '> .mw-collapsible-toggle' );
-
-                                       // If a direct child .content-wrapper does not exists, create it
-                                       if ( !$collapsible.find( '> .mw-collapsible-content' ).length ) {
-                                               $collapsible.wrapInner( '<div class="mw-collapsible-content"></div>' );
-                                       }
-
-                                       // If theres no toggle link, add it
-                                       if ( !$toggle.length ) {
-                                               $toggleLink = buildDefaultToggleLink().prependTo( $collapsible );
-                                       } else {
-                                               actionHandler = premadeToggleHandler;
-                                               $toggleLink = $toggle.on( 'click.mw-collapsible keypress.mw-collapsible', actionHandler );
-                                       }
-                               }
-                       }
-
-                       // Attributes for accessibility. This isn't necessary when the toggler is already
-                       // an <a> or a <button> etc., but it doesn't hurt either, and it's consistent.
-                       $toggleLink.prop( 'tabIndex', 0 );
-
-                       // Initial state
-                       if ( options.collapsed || $collapsible.hasClass( 'mw-collapsed' ) ) {
-                               // One toggler can hook to multiple elements, and one element can have
-                               // multiple togglers. This is the sanest way to handle that.
-                               actionHandler.call( $toggleLink.get( 0 ), null, { instantHide: true, wasCollapsed: false } );
-                       }
-               } );
-       };
-}( jQuery, mediaWiki ) );
diff --git a/resources/jquery/jquery.mockjax.js b/resources/jquery/jquery.mockjax.js
deleted file mode 100644 (file)
index 5f6e130..0000000
+++ /dev/null
@@ -1,382 +0,0 @@
-/*!
- * MockJax - jQuery Plugin to Mock Ajax requests
- *
- * Version:  1.4.0
- * Released: 2011-02-04
- * Source:   http://github.com/appendto/jquery-mockjax
- * Docs:     http://enterprisejquery.com/2010/07/mock-your-ajax-requests-with-mockjax-for-rapid-development
- * Plugin:   mockjax
- * Author:   Jonathan Sharp (http://jdsharp.com)
- * License:  MIT,GPL
- * 
- * Copyright (c) 2010 appendTo LLC.
- * Dual licensed under the MIT or GPL licenses.
- * http://appendto.com/open-source-licenses
- */
-(function($) {
-       var _ajax = $.ajax,
-               mockHandlers = [];
-       
-       function parseXML(xml) {
-               if ( window['DOMParser'] == undefined && window.ActiveXObject ) {
-                       DOMParser = function() { };
-                       DOMParser.prototype.parseFromString = function( xmlString ) {
-                               var doc = new ActiveXObject('Microsoft.XMLDOM');
-                       doc.async = 'false';
-                       doc.loadXML( xmlString );
-                               return doc;
-                       };
-               }
-               
-               try {
-                       var xmlDoc      = ( new DOMParser() ).parseFromString( xml, 'text/xml' );
-                       if ( $.isXMLDoc( xmlDoc ) ) {
-                               var err = $('parsererror', xmlDoc);
-                               if ( err.length == 1 ) {
-                                       throw('Error: ' + $(xmlDoc).text() );
-                               }
-                       } else {
-                               throw('Unable to parse XML');
-                       }
-               } catch( e ) {
-                       var msg = ( e.name == undefined ? e : e.name + ': ' + e.message );
-                       $(document).trigger('xmlParseError', [ msg ]);
-                       return undefined;
-               }
-               return xmlDoc;
-       }
-       
-       $.extend({
-               ajax: function(origSettings) {
-                       var s = jQuery.extend(true, {}, jQuery.ajaxSettings, origSettings),
-                           mock = false;
-                       // Iterate over our mock handlers (in registration order) until we find
-                       // one that is willing to intercept the request
-                       $.each(mockHandlers, function(k, v) {
-                               if ( !mockHandlers[k] ) {
-                                       return;
-                               }
-                               var m = null;
-                               // If the mock was registered with a function, let the function decide if we 
-                               // want to mock this request
-                               if ( $.isFunction(mockHandlers[k]) ) {
-                                       m = mockHandlers[k](s);
-                               } else {
-                                       m = mockHandlers[k];
-                                       // Inspect the URL of the request and check if the mock handler's url 
-                                       // matches the url for this ajax request
-                                       if ( $.isFunction(m.url.test) ) {
-                                               // The user provided a regex for the url, test it
-                                               if ( !m.url.test( s.url ) ) {
-                                                       m = null;
-                                               }
-                                       } else {
-                                               // Look for a simple wildcard '*' or a direct URL match
-                                               var star = m.url.indexOf('*');
-                                               if ( ( m.url != '*' && m.url != s.url && star == -1 ) ||
-                                                       ( star > -1 && m.url.substr(0, star) != s.url.substr(0, star) ) ) {
-                                                        // The url we tested did not match the wildcard *
-                                                        m = null;
-                                               }
-                                       }
-                                       if ( m ) {
-                                               // Inspect the data submitted in the request (either POST body or GET query string)
-                                               if ( m.data && s.data ) {
-                                                       var identical = false;
-                                                       // Deep inspect the identity of the objects
-                                                       (function ident(mock, live) {
-                                                               // Test for situations where the data is a querystring (not an object)
-                                                               if (typeof live === 'string') {
-                                                                       // Querystring may be a regex
-                                                                       identical = $.isFunction( mock.test ) ? mock.test(live) : mock == live;
-                                                                       return identical;
-                                                               }
-                                                               $.each(mock, function(k, v) {
-                                                                       if ( live[k] === undefined ) {
-                                                                               identical = false;
-                                                                               return false;
-                                                                       } else {
-                                                                               identical = true;
-                                                                               if ( typeof live[k] == 'object' ) {
-                                                                                       return ident(mock[k], live[k]);
-                                                                               } else {
-                                                                                       if ( $.isFunction( mock[k].test ) ) {
-                                                                                               identical = mock[k].test(live[k]);
-                                                                                       } else {
-                                                                                               identical = ( mock[k] == live[k] );
-                                                                                       }
-                                                                                       return identical;
-                                                                               }
-                                                                       }
-                                                               });
-                                                       })(m.data, s.data);
-                                                       // They're not identical, do not mock this request
-                                                       if ( identical == false ) {
-                                                               m = null;
-                                                       }
-                                               }
-                                               // Inspect the request type
-                                               if ( m && m.type && m.type != s.type ) {
-                                                       // The request type doesn't match (GET vs. POST)
-                                                       m = null;
-                                               }
-                                       }
-                               }
-                               if ( m ) {
-                                       mock = true;
-
-                                       // Handle console logging
-                                       var c = $.extend({}, $.mockjaxSettings, m);
-                                       if ( c.log && $.isFunction(c.log) ) {
-                                               c.log('MOCK ' + s.type.toUpperCase() + ': ' + s.url, $.extend({}, s));
-                                       }
-                                       
-                                       var jsre = /=\?(&|$)/, jsc = (new Date()).getTime();
-
-                                       // Handle JSONP Parameter Callbacks, we need to replicate some of the jQuery core here
-                                       // because there isn't an easy hook for the cross domain script tag of jsonp
-                                       if ( s.dataType === "jsonp" ) {
-                                               if ( s.type.toUpperCase() === "GET" ) {
-                                                       if ( !jsre.test( s.url ) ) {
-                                                               s.url += (rquery.test( s.url ) ? "&" : "?") + (s.jsonp || "callback") + "=?";
-                                                       }
-                                               } else if ( !s.data || !jsre.test(s.data) ) {
-                                                       s.data = (s.data ? s.data + "&" : "") + (s.jsonp || "callback") + "=?";
-                                               }
-                                               s.dataType = "json";
-                                       }
-                       
-                                       // Build temporary JSONP function
-                                       if ( s.dataType === "json" && (s.data && jsre.test(s.data) || jsre.test(s.url)) ) {
-                                               jsonp = s.jsonpCallback || ("jsonp" + jsc++);
-                       
-                                               // Replace the =? sequence both in the query string and the data
-                                               if ( s.data ) {
-                                                       s.data = (s.data + "").replace(jsre, "=" + jsonp + "$1");
-                                               }
-                       
-                                               s.url = s.url.replace(jsre, "=" + jsonp + "$1");
-                       
-                                               // We need to make sure
-                                               // that a JSONP style response is executed properly
-                                               s.dataType = "script";
-                       
-                                               // Handle JSONP-style loading
-                                               window[ jsonp ] = window[ jsonp ] || function( tmp ) {
-                                                       data = tmp;
-                                                       success();
-                                                       complete();
-                                                       // Garbage collect
-                                                       window[ jsonp ] = undefined;
-                       
-                                                       try {
-                                                               delete window[ jsonp ];
-                                                       } catch(e) {}
-                       
-                                                       if ( head ) {
-                                                               head.removeChild( script );
-                                                       }
-                                               };
-                                       }
-                                       
-                                       var rurl = /^(\w+:)?\/\/([^\/?#]+)/,
-                                               parts = rurl.exec( s.url ),
-                                               remote = parts && (parts[1] && parts[1] !== location.protocol || parts[2] !== location.host);
-                                       
-                                       // Test if we are going to create a script tag (if so, intercept & mock)
-                                       if ( s.dataType === "script" && s.type.toUpperCase() === "GET" && remote ) {
-                                               // Synthesize the mock request for adding a script tag
-                                               var callbackContext = origSettings && origSettings.context || s;
-                                               
-                                               function success() {
-                                                       // If a local callback was specified, fire it and pass it the data
-                                                       if ( s.success ) {
-                                                               s.success.call( callbackContext, ( m.response ? m.response.toString() : m.responseText || ''), status, {} );
-                                                       }
-                               
-                                                       // Fire the global callback
-                                                       if ( s.global ) {
-                                                               trigger( "ajaxSuccess", [{}, s] );
-                                                       }
-                                               }
-                               
-                                               function complete() {
-                                                       // Process result
-                                                       if ( s.complete ) {
-                                                               s.complete.call( callbackContext, {} , status );
-                                                       }
-                               
-                                                       // The request was completed
-                                                       if ( s.global ) {
-                                                               trigger( "ajaxComplete", [{}, s] );
-                                                       }
-                               
-                                                       // Handle the global AJAX counter
-                                                       if ( s.global && ! --jQuery.active ) {
-                                                               jQuery.event.trigger( "ajaxStop" );
-                                                       }
-                                               }
-                                               
-                                               function trigger(type, args) {
-                                                       (s.context ? jQuery(s.context) : jQuery.event).trigger(type, args);
-                                               }
-                                               
-                                               if ( m.response && $.isFunction(m.response) ) {
-                                                       m.response(origSettings);
-                                               } else {
-                                                       $.globalEval(m.responseText);
-                                               }
-                                               success();
-                                               complete();
-                                               return false;
-                                       }
-                                       mock = _ajax.call($, $.extend(true, {}, origSettings, {
-                                               // Mock the XHR object
-                                               xhr: function() {
-                                                       // Extend with our default mockjax settings
-                                                       m = $.extend({}, $.mockjaxSettings, m);
-
-                                                       if ( m.contentType ) {
-                                                               m.headers['content-type'] = m.contentType;
-                                                       }
-
-                                                       // Return our mock xhr object
-                                                       return {
-                                                               status: m.status,
-                                                               readyState: 1,
-                                                               open: function() { },
-                                                               send: function() {
-                                                                       // This is a substitute for < 1.4 which lacks $.proxy
-                                                                       var process = (function(that) {
-                                                                               return function() {
-                                                                                       return (function() {
-                                                                                               // The request has returned
-                                                                                               this.status             = m.status;
-                                                                                               this.readyState         = 4;
-                                                                               
-                                                                                               // We have an executable function, call it to give 
-                                                                                               // the mock handler a chance to update it's data
-                                                                                               if ( $.isFunction(m.response) ) {
-                                                                                                       m.response(origSettings);
-                                                                                               }
-                                                                                               // Copy over our mock to our xhr object before passing control back to 
-                                                                                               // jQuery's onreadystatechange callback
-                                                                                               if ( s.dataType == 'json' && ( typeof m.responseText == 'object' ) ) {
-                                                                                                       this.responseText = JSON.stringify(m.responseText);
-                                                                                               } else if ( s.dataType == 'xml' ) {
-                                                                                                       if ( typeof m.responseXML == 'string' ) {
-                                                                                                               this.responseXML = parseXML(m.responseXML);
-                                                                                                       } else {
-                                                                                                               this.responseXML = m.responseXML;
-                                                                                                       }
-                                                                                               } else {
-                                                                                                       this.responseText = m.responseText;
-                                                                                               }
-                                                                                               // jQuery < 1.4 doesn't have onreadystate change for xhr
-                                                                                               if ( $.isFunction(this.onreadystatechange) ) {
-                                                                                                       this.onreadystatechange( m.isTimeout ? 'timeout' : undefined );
-                                                                                               }
-                                                                                       }).apply(that);
-                                                                               };
-                                                                       })(this);
-
-                                                                       if ( m.proxy ) {
-                                                                               // We're proxying this request and loading in an external file instead
-                                                                               _ajax({
-                                                                                       global: false,
-                                                                                       url: m.proxy,
-                                                                                       type: m.proxyType,
-                                                                                       data: m.data,
-                                                                                       dataType: s.dataType,
-                                                                                       complete: function(xhr, txt) {
-                                                                                               m.responseXML = xhr.responseXML;
-                                                                                               m.responseText = xhr.responseText;
-                                                                                               this.responseTimer = setTimeout(process, m.responseTime || 0);
-                                                                                       }
-                                                                               });
-                                                                       } else {
-                                                                               // type == 'POST' || 'GET' || 'DELETE'
-                                                                               if ( s.async === false ) {
-                                                                                       // TODO: Blocking delay
-                                                                                       process();
-                                                                               } else {
-                                                                                       this.responseTimer = setTimeout(process, m.responseTime || 50);
-                                                                               }
-                                                                       }
-                                                               },
-                                                               abort: function() {
-                                                                       clearTimeout(this.responseTimer);
-                                                               },
-                                                               setRequestHeader: function() { },
-                                                               getResponseHeader: function(header) {
-                                                                       // 'Last-modified', 'Etag', 'content-type' are all checked by jQuery
-                                                                       if ( m.headers && m.headers[header] ) {
-                                                                               // Return arbitrary headers
-                                                                               return m.headers[header];
-                                                                       } else if ( header.toLowerCase() == 'last-modified' ) {
-                                                                               return m.lastModified || (new Date()).toString();
-                                                                       } else if ( header.toLowerCase() == 'etag' ) {
-                                                                               return m.etag || '';
-                                                                       } else if ( header.toLowerCase() == 'content-type' ) {
-                                                                               return m.contentType || 'text/plain';
-                                                                       }
-                                                               },
-                                                               getAllResponseHeaders: function() {
-                                                                       var headers = '';
-                                                                       $.each(m.headers, function(k, v) {
-                                                                               headers += k + ': ' + v + "\n";
-                                                                       });
-                                                                       return headers;
-                                                               }
-                                                       };
-                                               }
-                                       }));
-                                       return false;
-                               }
-                       });
-                       // We don't have a mock request, trigger a normal request
-                       if ( !mock ) {
-                               return _ajax.apply($, arguments);
-                       } else {
-                               return mock;
-                       }
-               }
-       });
-
-       $.mockjaxSettings = {
-               //url:        null,
-               //type:       'GET',
-               log:          function(msg) {
-                               window['console'] && window.console.log && window.console.log(msg);
-                             },
-               status:       200,
-               responseTime: 500,
-               isTimeout:    false,
-               contentType:  'text/plain',
-               response:     '', 
-               responseText: '',
-               responseXML:  '',
-               proxy:        '',
-               proxyType:    'GET',
-               
-               lastModified: null,
-               etag:         '',
-               headers: {
-                       etag: 'IJF@H#@923uf8023hFO@I#H#',
-                       'content-type' : 'text/plain'
-               }
-       };
-
-       $.mockjax = function(settings) {
-               var i = mockHandlers.length;
-               mockHandlers[i] = settings;
-               return i;
-       };
-       $.mockjaxClear = function(i) {
-               if ( arguments.length == 1 ) {
-                       mockHandlers[i] = null;
-               } else {
-                       mockHandlers = [];
-               }
-       };
-})(jQuery);
diff --git a/resources/jquery/jquery.mw-jump.js b/resources/jquery/jquery.mw-jump.js
deleted file mode 100644 (file)
index e286834..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-/**
- * JavaScript to show jump links to motor-impaired users when they are focused.
- */
-jQuery( function ( $ ) {
-
-       $( '.mw-jump' ).on( 'focus blur', 'a', function ( e ) {
-               // Confusingly jQuery leaves e.type as focusout for delegated blur events
-               if ( e.type === 'blur' || e.type === 'focusout' ) {
-                       $( this ).closest( '.mw-jump' ).css({ height: 0 });
-               } else {
-                       $( this ).closest( '.mw-jump' ).css({ height: 'auto' });
-               }
-       } );
-
-} );
diff --git a/resources/jquery/jquery.mwExtension.js b/resources/jquery/jquery.mwExtension.js
deleted file mode 100644 (file)
index 03c1c85..0000000
+++ /dev/null
@@ -1,122 +0,0 @@
-/*
- * JavaScript backwards-compatibility alternatives and other convenience functions
- */
-( function ( $ ) {
-
-       $.extend({
-               trimLeft: function ( str ) {
-                       return str === null ? '' : str.toString().replace( /^\s+/, '' );
-               },
-               trimRight: function ( str ) {
-                       return str === null ?
-                                       '' : str.toString().replace( /\s+$/, '' );
-               },
-               ucFirst: function ( str ) {
-                       return str.charAt( 0 ).toUpperCase() + str.substr( 1 );
-               },
-               escapeRE: function ( str ) {
-                       return str.replace ( /([\\{}()|.?*+\-\^$\[\]])/g, '\\$1' );
-               },
-               isDomElement: function ( el ) {
-                       return !!el && !!el.nodeType;
-               },
-               isEmpty: function ( v ) {
-                       var key;
-                       if ( v === '' || v === 0 || v === '0' || v === null
-                               || v === false || v === undefined )
-                       {
-                               return true;
-                       }
-                       // the for-loop could potentially contain prototypes
-                       // to avoid that we check it's length first
-                       if ( v.length === 0 ) {
-                               return true;
-                       }
-                       if ( typeof v === 'object' ) {
-                               for ( key in v ) {
-                                       return false;
-                               }
-                               return true;
-                       }
-                       return false;
-               },
-               compareArray: function ( arrThis, arrAgainst ) {
-                       if ( arrThis.length !== arrAgainst.length ) {
-                               return false;
-                       }
-                       for ( var i = 0; i < arrThis.length; i++ ) {
-                               if ( $.isArray( arrThis[i] ) ) {
-                                       if ( !$.compareArray( arrThis[i], arrAgainst[i] ) ) {
-                                               return false;
-                                       }
-                               } else if ( arrThis[i] !== arrAgainst[i] ) {
-                                       return false;
-                               }
-                       }
-                       return true;
-               },
-               compareObject: function ( objectA, objectB ) {
-                       var prop, type;
-
-                       // Do a simple check if the types match
-                       if ( typeof objectA === typeof objectB ) {
-
-                               // Only loop over the contents if it really is an object
-                               if ( typeof objectA === 'object' ) {
-                                       // If they are aliases of the same object (ie. mw and mediaWiki) return now
-                                       if ( objectA === objectB ) {
-                                               return true;
-                                       } else {
-                                               // Iterate over each property
-                                               for ( prop in objectA ) {
-                                                       // Check if this property is also present in the other object
-                                                       if ( prop in objectB ) {
-                                                               // Compare the types of the properties
-                                                               type = typeof objectA[prop];
-                                                               if ( type === typeof objectB[prop] ) {
-                                                                       // Recursively check objects inside this one
-                                                                       switch ( type ) {
-                                                                               case 'object' :
-                                                                                       if ( !$.compareObject( objectA[prop], objectB[prop] ) ) {
-                                                                                               return false;
-                                                                                       }
-                                                                                       break;
-                                                                               case 'function' :
-                                                                                       // Functions need to be strings to compare them properly
-                                                                                       if ( objectA[prop].toString() !== objectB[prop].toString() ) {
-                                                                                               return false;
-                                                                                       }
-                                                                                       break;
-                                                                               default:
-                                                                                       // Strings, numbers
-                                                                                       if ( objectA[prop] !== objectB[prop] ) {
-                                                                                               return false;
-                                                                                       }
-                                                                                       break;
-                                                                       }
-                                                               } else {
-                                                                       return false;
-                                                               }
-                                                       } else {
-                                                               return false;
-                                                       }
-                                               }
-                                               // Check for properties in B but not in A
-                                               // This is about 15% faster (tested in Safari 5 and Firefox 3.6)
-                                               // ...than incrementing a count variable in the above and below loops
-                                               // See also: https://www.mediawiki.org/wiki/ResourceLoader/Default_modules/compareObject_test#Results
-                                               for ( prop in objectB ) {
-                                                       if ( !( prop in objectA ) ) {
-                                                               return false;
-                                                       }
-                                               }
-                                       }
-                               }
-                       } else {
-                               return false;
-                       }
-                       return true;
-               }
-       });
-
-}( jQuery ) );
diff --git a/resources/jquery/jquery.placeholder.js b/resources/jquery/jquery.placeholder.js
deleted file mode 100644 (file)
index 6f7ada3..0000000
+++ /dev/null
@@ -1,229 +0,0 @@
-/**
- * HTML5 placeholder emulation for jQuery plugin
- *
- * This will automatically use the HTML5 placeholder attribute if supported, or emulate this behavior if not.
- *
- * This is a fork from Mathias Bynens' jquery.placeholder as of this commit
- * https://github.com/mathiasbynens/jquery-placeholder/blob/47f05d400e2dd16b59d144141a2cf54a9a77c502/jquery.placeholder.js
- *
- * @author Mathias Bynens <http://mathiasbynens.be/>
- * @author Trevor Parscal <tparscal@wikimedia.org>, 2012
- * @author Krinkle <krinklemail@gmail.com>, 2012
- * @author Alex Ivanov <alexivanov97@gmail.com>, 2013
- * @version 2.1.0
- * @license MIT
- */
-(function ($) {
-
-       var isInputSupported = 'placeholder' in document.createElement('input'),
-               isTextareaSupported = 'placeholder' in document.createElement('textarea'),
-               prototype = $.fn,
-               valHooks = $.valHooks,
-               propHooks = $.propHooks,
-               hooks,
-               placeholder;
-
-       if (isInputSupported && isTextareaSupported) {
-
-               placeholder = prototype.placeholder = function (text) {
-                       var hasArgs = arguments.length;
-
-                       if (hasArgs) {
-                               changePlaceholder.call(this, text);
-                       }
-
-                       return this;
-               };
-
-               placeholder.input = placeholder.textarea = true;
-
-       } else {
-
-               placeholder = prototype.placeholder = function (text) {
-                       var $this = this,
-                               hasArgs = arguments.length;
-
-                       if (hasArgs) {
-                               changePlaceholder.call(this, text);
-                       }
-
-                       $this
-                               .filter((isInputSupported ? 'textarea' : ':input') + '[placeholder]')
-                               .filter(function () {
-                                       return !$(this).data('placeholder-enabled');
-                               })
-                               .bind({
-                                       'focus.placeholder drop.placeholder': clearPlaceholder,
-                                       'blur.placeholder': setPlaceholder
-                               })
-                               .data('placeholder-enabled', true)
-                               .trigger('blur.placeholder');
-                       return $this;
-               };
-
-               placeholder.input = isInputSupported;
-               placeholder.textarea = isTextareaSupported;
-
-               hooks = {
-                       'get': function (element) {
-                               var $element = $(element),
-                                       $passwordInput = $element.data('placeholder-password');
-                               if ($passwordInput) {
-                                       return $passwordInput[0].value;
-                               }
-
-                               return $element.data('placeholder-enabled') && $element.hasClass('placeholder') ? '' : element.value;
-                       },
-                       'set': function (element, value) {
-                               var $element = $(element),
-                                       $passwordInput = $element.data('placeholder-password');
-                               if ($passwordInput) {
-                                       $passwordInput[0].value = value;
-                                       return value;
-                               }
-
-                               if (!$element.data('placeholder-enabled')) {
-                                       element.value = value;
-                                       return value;
-                               }
-                               if (!value) {
-                                       element.value = value;
-                                       // Issue #56: Setting the placeholder causes problems if the element continues to have focus.
-                                       if (element !== safeActiveElement()) {
-                                               // We can't use `triggerHandler` here because of dummy text/password inputs :(
-                                               setPlaceholder.call(element);
-                                       }
-                               } else if ($element.hasClass('placeholder')) {
-                                       if (!clearPlaceholder.call(element, true, value)) {
-                                               element.value = value;
-                                       }
-                               } else {
-                                       element.value = value;
-                               }
-                               // `set` can not return `undefined`; see http://jsapi.info/jquery/1.7.1/val#L2363
-                               return $element;
-                       }
-               };
-
-               if (!isInputSupported) {
-                       valHooks.input = hooks;
-                       propHooks.value = hooks;
-               }
-               if (!isTextareaSupported) {
-                       valHooks.textarea = hooks;
-                       propHooks.value = hooks;
-               }
-
-               $(function () {
-                       // Look for forms
-                       $(document).delegate('form', 'submit.placeholder', function () {
-                               // Clear the placeholder values so they don't get submitted
-                               var $inputs = $('.placeholder', this).each(clearPlaceholder);
-                               setTimeout(function () {
-                                       $inputs.each(setPlaceholder);
-                               }, 10);
-                       });
-               });
-
-               // Clear placeholder values upon page reload
-               $(window).bind('beforeunload.placeholder', function () {
-                       $('.placeholder').each(function () {
-                               this.value = '';
-                       });
-               });
-
-       }
-
-       function args(elem) {
-               // Return an object of element attributes
-               var newAttrs = {},
-                       rinlinejQuery = /^jQuery\d+$/;
-               $.each(elem.attributes, function (i, attr) {
-                       if (attr.specified && !rinlinejQuery.test(attr.name)) {
-                               newAttrs[attr.name] = attr.value;
-                       }
-               });
-               return newAttrs;
-       }
-
-       function clearPlaceholder(event, value) {
-               var input = this,
-                       $input = $(input);
-               if (input.value === $input.attr('placeholder') && $input.hasClass('placeholder')) {
-                       if ($input.data('placeholder-password')) {
-                               $input = $input.hide().next().show().attr('id', $input.removeAttr('id').data('placeholder-id'));
-                               // If `clearPlaceholder` was called from `$.valHooks.input.set`
-                               if (event === true) {
-                                       $input[0].value = value;
-                                       return value;
-                               }
-                               $input.focus();
-                       } else {
-                               input.value = '';
-                               $input.removeClass('placeholder');
-                               if (input === safeActiveElement()) {
-                                       input.select();
-                               }
-                       }
-               }
-       }
-
-       function setPlaceholder() {
-               var $replacement,
-                       input = this,
-                       $input = $(input),
-                       id = this.id;
-               if (!input.value) {
-                       if (input.type === 'password') {
-                               if (!$input.data('placeholder-textinput')) {
-                                       try {
-                                               $replacement = $input.clone().attr({ 'type': 'text' });
-                                       } catch(e) {
-                                               $replacement = $('<input>').attr($.extend(args(this), { 'type': 'text' }));
-                                       }
-                                       $replacement
-                                               .removeAttr('name')
-                                               .data({
-                                                       'placeholder-password': $input,
-                                                       'placeholder-id': id
-                                               })
-                                               .bind('focus.placeholder drop.placeholder', clearPlaceholder);
-                                       $input
-                                               .data({
-                                                       'placeholder-textinput': $replacement,
-                                                       'placeholder-id': id
-                                               })
-                                               .before($replacement);
-                               }
-                               $input = $input.removeAttr('id').hide().prev().attr('id', id).show();
-                               // Note: `$input[0] != input` now!
-                       }
-                       $input.addClass('placeholder');
-                       $input[0].value = $input.attr('placeholder');
-               } else {
-                       $input.removeClass('placeholder');
-               }
-       }
-
-       function safeActiveElement() {
-               // Avoid IE9 `document.activeElement` of death
-               // https://github.com/mathiasbynens/jquery-placeholder/pull/99
-               try {
-                       return document.activeElement;
-               } catch (err) {}
-       }
-
-       function changePlaceholder(text) {
-               var hasArgs = arguments.length,
-                       $input = this;
-               if (hasArgs) {
-                       if ($input.attr('placeholder') !== text) {
-                               $input.prop('placeholder', text);
-                               if ($input.hasClass('placeholder')) {
-                                       $input[0].value = text;
-                               }
-                       }
-               }
-       }
-
-}(jQuery));
diff --git a/resources/jquery/jquery.qunit.completenessTest.js b/resources/jquery/jquery.qunit.completenessTest.js
deleted file mode 100644 (file)
index 86fcaea..0000000
+++ /dev/null
@@ -1,359 +0,0 @@
-/**
- * jQuery QUnit CompletenessTest 0.4
- *
- * Tests the completeness of test suites for object oriented javascript
- * libraries. Written to be used in environments with jQuery and QUnit.
- * Requires jQuery 1.7.2 or higher.
- *
- * Built for and tested with:
- * - Chrome 19
- * - Firefox 4
- * - Safari 5
- *
- * @author Timo Tijhof, 2011-2012
- */
-( function ( $ ) {
-       'use strict';
-
-       var util,
-               hasOwn = Object.prototype.hasOwnProperty,
-               log = (window.console && window.console.log)
-                       ? function () { return window.console.log.apply(window.console, arguments); }
-                       : function () {};
-
-       // Simplified version of a few jQuery methods, except that they don't
-       // call other jQuery methods. Required to be able to run the CompletenessTest
-       // on jQuery itself as well.
-       util = {
-               keys: Object.keys || function ( object ) {
-                       var key, keys = [];
-                       for ( key in object ) {
-                               if ( hasOwn.call( object, key ) ) {
-                                       keys.push( key );
-                               }
-                       }
-                       return keys;
-               },
-               extend: function () {
-                       var options, name, src, copy,
-                               target = arguments[0] || {},
-                               i = 1,
-                               length = arguments.length;
-
-                       for ( ; i < length; i++ ) {
-                               options = arguments[ i ];
-                               // Only deal with non-null/undefined values
-                               if ( options !== null && options !== undefined ) {
-                                       // Extend the base object
-                                       for ( name in options ) {
-                                               src = target[ name ];
-                                               copy = options[ name ];
-
-                                               // Prevent never-ending loop
-                                               if ( target === copy ) {
-                                                       continue;
-                                               }
-
-                                               if ( copy !== undefined ) {
-                                                       target[ name ] = copy;
-                                               }
-                                       }
-                               }
-                       }
-
-                       // Return the modified object
-                       return target;
-               },
-               each: function ( object, callback ) {
-                       var name;
-                       for ( name in object ) {
-                               if ( callback.call( object[ name ], name, object[ name ] ) === false ) {
-                                       break;
-                               }
-                       }
-               },
-               // $.type and $.isEmptyObject are safe as is, they don't call
-               // other $.* methods. Still need to be derefenced into `util`
-               // since the CompletenessTest will overload them with spies.
-               type: $.type,
-               isEmptyObject: $.isEmptyObject
-       };
-
-       /**
-        * CompletenessTest
-        * @constructor
-        *
-        * @example
-        *  var myTester = new CompletenessTest( myLib );
-        * @param masterVariable {Object} The root variable that contains all object
-        *  members. CompletenessTest will recursively traverse objects and keep track
-        *  of all methods.
-        * @param ignoreFn {Function} Optionally pass a function to filter out certain
-        *  methods. Example: You may want to filter out instances of jQuery or some
-        *  other constructor. Otherwise "missingTests" will include all methods that
-        *  were not called from that instance.
-        */
-       function CompletenessTest( masterVariable, ignoreFn ) {
-
-               // Keep track in these objects. Keyed by strings with the
-               // method names (ie. 'my.foo', 'my.bar', etc.) values are boolean true.
-               this.injectionTracker = {};
-               this.methodCallTracker = {};
-               this.missingTests = {};
-
-               this.ignoreFn = undefined === ignoreFn ? function () { return false; } : ignoreFn;
-
-               // Lazy limit in case something weird happends (like recurse (part of) ourself).
-               this.lazyLimit = 2000;
-               this.lazyCounter = 0;
-
-               var that = this;
-
-               // Bind begin and end to QUnit.
-               QUnit.begin( function () {
-                       that.walkTheObject( null, masterVariable, masterVariable, [], CompletenessTest.ACTION_INJECT );
-                       log( 'CompletenessTest/walkTheObject/ACTION_INJECT', that );
-               });
-
-               QUnit.done( function () {
-                       that.populateMissingTests();
-                       log( 'CompletenessTest/populateMissingTests', that );
-
-                       var toolbar, testResults, cntTotal, cntCalled, cntMissing;
-
-                       cntTotal = util.keys( that.injectionTracker ).length;
-                       cntCalled = util.keys( that.methodCallTracker ).length;
-                       cntMissing = util.keys( that.missingTests ).length;
-
-                       function makeTestResults( blob, title, style ) {
-                               var elOutputWrapper, elTitle, elContainer, elList, elFoot;
-
-                               elTitle = document.createElement( 'strong' );
-                               elTitle.textContent = title || 'Values';
-
-                               elList = document.createElement( 'ul' );
-                               util.each( blob, function ( key ) {
-                                       var elItem = document.createElement( 'li' );
-                                       elItem.textContent = key;
-                                       elList.appendChild( elItem );
-                               });
-
-                               elFoot = document.createElement( 'p' );
-                               elFoot.innerHTML = '<em>&mdash; CompletenessTest</em>';
-
-                               elContainer = document.createElement( 'div' );
-                               elContainer.appendChild( elTitle );
-                               elContainer.appendChild( elList );
-                               elContainer.appendChild( elFoot );
-
-                               elOutputWrapper = document.getElementById( 'qunit-completenesstest' );
-                               if ( !elOutputWrapper ) {
-                                       elOutputWrapper = document.createElement( 'div' );
-                                       elOutputWrapper.id = 'qunit-completenesstest';
-                               }
-                               elOutputWrapper.appendChild( elContainer );
-
-                               util.each( style, function ( key, value ) {
-                                       elOutputWrapper.style[key] = value;
-                               });
-                               return elOutputWrapper;
-                       }
-
-                       if ( cntMissing === 0 ) {
-                               // Good
-                               testResults = makeTestResults(
-                                       {},
-                                       'Detected calls to ' + cntCalled + '/' + cntTotal + ' methods. No missing tests!',
-                                       {
-                                               backgroundColor: '#D2E0E6',
-                                               color: '#366097',
-                                               paddingTop: '1em',
-                                               paddingRight: '1em',
-                                               paddingBottom: '1em',
-                                               paddingLeft: '1em'
-                                       }
-                               );
-                       } else {
-                               // Bad
-                               testResults = makeTestResults(
-                                       that.missingTests,
-                                       'Detected calls to ' + cntCalled + '/' + cntTotal + ' methods. ' + cntMissing + ' methods not covered:',
-                                       {
-                                               backgroundColor: '#EE5757',
-                                               color: 'black',
-                                               paddingTop: '1em',
-                                               paddingRight: '1em',
-                                               paddingBottom: '1em',
-                                               paddingLeft: '1em'
-                                       }
-                               );
-                       }
-
-                       toolbar = document.getElementById( 'qunit-testrunner-toolbar' );
-                       if ( toolbar ) {
-                               toolbar.insertBefore( testResults, toolbar.firstChild );
-                       }
-               });
-
-               return this;
-       }
-
-       /* Static members */
-       CompletenessTest.ACTION_INJECT = 500;
-       CompletenessTest.ACTION_CHECK = 501;
-
-       /* Public methods */
-       CompletenessTest.fn = CompletenessTest.prototype = {
-
-               /**
-                * CompletenessTest.fn.walkTheObject
-                *
-                * This function recursively walks through the given object, calling itself as it goes.
-                * Depending on the action it either injects our listener into the methods, or
-                * reads from our tracker and records which methods have not been called by the test suite.
-                *
-                * @param currName {String|Null} Name of the given object member (Initially this is null).
-                * @param currVar {mixed} The variable to check (initially an object,
-                *  further down it could be anything).
-                * @param masterVariable {Object} Throughout our interation, always keep track of the master/root.
-                *  Initially this is the same as currVar.
-                * @param parentPathArray {Array} Array of names that indicate our breadcrumb path starting at
-                *  masterVariable. Not including currName.
-                * @param action {Number} What is this function supposed to do (ACTION_INJECT or ACTION_CHECK)
-                */
-               walkTheObject: function ( currName, currVar, masterVariable, parentPathArray, action ) {
-
-                       var key, value, tmpPathArray,
-                               type = util.type( currVar ),
-                               that = this;
-
-                       // Hard ignores
-                       if ( this.ignoreFn( currVar, that, parentPathArray ) ) {
-                               return null;
-                       }
-
-                       // Handle the lazy limit
-                       this.lazyCounter++;
-                       if ( this.lazyCounter > this.lazyLimit ) {
-                               log( 'CompletenessTest.fn.walkTheObject> Limit reached: ' + this.lazyCounter, parentPathArray );
-                               return null;
-                       }
-
-                       // Functions
-                       if ( type === 'function' ) {
-
-                               if ( !currVar.prototype || util.isEmptyObject( currVar.prototype ) ) {
-
-                                       if ( action === CompletenessTest.ACTION_INJECT ) {
-
-                                               that.injectionTracker[ parentPathArray.join( '.' ) ] = true;
-                                               that.injectCheck( masterVariable, parentPathArray, function () {
-                                                       that.methodCallTracker[ parentPathArray.join( '.' ) ] = true;
-                                               } );
-                                       }
-
-                               // We don't support checking object constructors yet...
-                               // ...we can check the prototypes fine, though.
-                               } else {
-                                       if ( action === CompletenessTest.ACTION_INJECT ) {
-
-                                               for ( key in currVar.prototype ) {
-                                                       if ( hasOwn.call( currVar.prototype, key ) ) {
-                                                               value = currVar.prototype[key];
-                                                               if ( key === 'constructor' ) {
-                                                                       continue;
-                                                               }
-
-                                                               // Clone and break reference to parentPathArray
-                                                               tmpPathArray = util.extend( [], parentPathArray );
-                                                               tmpPathArray.push( 'prototype' );
-                                                               tmpPathArray.push( key );
-
-                                                               that.walkTheObject( key, value, masterVariable, tmpPathArray, action );
-                                                       }
-                                               }
-
-                                       }
-                               }
-
-                       }
-
-                       // Recursively. After all, this is the *completeness* test
-                       if ( type === 'function' || type === 'object' ) {
-                               for ( key in currVar ) {
-                                       if ( hasOwn.call( currVar, key ) ) {
-                                               value = currVar[key];
-
-                                               // Clone and break reference to parentPathArray
-                                               tmpPathArray = util.extend( [], parentPathArray );
-                                               tmpPathArray.push( key );
-
-                                               that.walkTheObject( key, value, masterVariable, tmpPathArray, action );
-                                       }
-                               }
-                       }
-               },
-
-               populateMissingTests: function () {
-                       var ct = this;
-                       util.each( ct.injectionTracker, function ( key ) {
-                               ct.hasTest( key );
-                       });
-               },
-
-               /**
-                * CompletenessTest.fn.hasTest
-                *
-                * Checks if the given method name (ie. 'my.foo.bar')
-                * was called during the test suite (as far as the tracker knows).
-                * If not it adds it to missingTests.
-                *
-                * @param fnName {String}
-                * @return {Boolean}
-                */
-               hasTest: function ( fnName ) {
-                       if ( !( fnName in this.methodCallTracker ) ) {
-                               this.missingTests[fnName] = true;
-                               return false;
-                       }
-                       return true;
-               },
-
-               /**
-                * CompletenessTest.fn.injectCheck
-                *
-                * Injects a function (such as a spy that updates methodCallTracker when
-                * it's called) inside another function.
-                *
-                * @param masterVariable {Object}
-                * @param objectPathArray {Array}
-                * @param injectFn {Function}
-                */
-               injectCheck: function ( masterVariable, objectPathArray, injectFn ) {
-                       var i, len, prev, memberName, lastMember,
-                               curr = masterVariable;
-
-                       // Get the object in question through the path from the master variable,
-                       // We can't pass the value directly because we need to re-define the object
-                       // member and keep references to the parent object, member name and member
-                       // value at all times.
-                       for ( i = 0, len = objectPathArray.length; i < len; i++ ) {
-                               memberName = objectPathArray[i];
-
-                               prev = curr;
-                               curr = prev[memberName];
-                               lastMember = memberName;
-                       }
-
-                       // Objects are by reference, members (unless objects) are not.
-                       prev[lastMember] = function () {
-                               injectFn();
-                               return curr.apply( this, arguments );
-                       };
-               }
-       };
-
-       /* Expose */
-       window.CompletenessTest = CompletenessTest;
-
-}( jQuery ) );
diff --git a/resources/jquery/jquery.qunit.css b/resources/jquery/jquery.qunit.css
deleted file mode 100644 (file)
index d7fc0c8..0000000
+++ /dev/null
@@ -1,244 +0,0 @@
-/**
- * QUnit v1.11.0 - A JavaScript Unit Testing Framework
- *
- * http://qunitjs.com
- *
- * Copyright 2012 jQuery Foundation and other contributors
- * Released under the MIT license.
- * http://jquery.org/license
- */
-
-/** Font Family and Sizes */
-
-#qunit-tests, #qunit-header, #qunit-banner, #qunit-testrunner-toolbar, #qunit-userAgent, #qunit-testresult {
-       font-family: "Helvetica Neue Light", "HelveticaNeue-Light", "Helvetica Neue", Calibri, Helvetica, Arial, sans-serif;
-}
-
-#qunit-testrunner-toolbar, #qunit-userAgent, #qunit-testresult, #qunit-tests li { font-size: small; }
-#qunit-tests { font-size: smaller; }
-
-
-/** Resets */
-
-#qunit-tests, #qunit-header, #qunit-banner, #qunit-userAgent, #qunit-testresult, #qunit-modulefilter {
-       margin: 0;
-       padding: 0;
-}
-
-
-/** Header */
-
-#qunit-header {
-       padding: 0.5em 0 0.5em 1em;
-
-       color: #8699a4;
-       background-color: #0d3349;
-
-       font-size: 1.5em;
-       line-height: 1em;
-       font-weight: normal;
-
-       border-radius: 5px 5px 0 0;
-       -moz-border-radius: 5px 5px 0 0;
-       -webkit-border-top-right-radius: 5px;
-       -webkit-border-top-left-radius: 5px;
-}
-
-#qunit-header a {
-       text-decoration: none;
-       color: #c2ccd1;
-}
-
-#qunit-header a:hover,
-#qunit-header a:focus {
-       color: #fff;
-}
-
-#qunit-testrunner-toolbar label {
-       display: inline-block;
-       padding: 0 .5em 0 .1em;
-}
-
-#qunit-banner {
-       height: 5px;
-}
-
-#qunit-testrunner-toolbar {
-       padding: 0.5em 0 0.5em 2em;
-       color: #5E740B;
-       background-color: #eee;
-       overflow: hidden;
-}
-
-#qunit-userAgent {
-       padding: 0.5em 0 0.5em 2.5em;
-       background-color: #2b81af;
-       color: #fff;
-       text-shadow: rgba(0, 0, 0, 0.5) 2px 2px 1px;
-}
-
-#qunit-modulefilter-container {
-       float: right;
-}
-
-/** Tests: Pass/Fail */
-
-#qunit-tests {
-       list-style-position: inside;
-}
-
-#qunit-tests li {
-       padding: 0.4em 0.5em 0.4em 2.5em;
-       border-bottom: 1px solid #fff;
-       list-style-position: inside;
-}
-
-#qunit-tests.hidepass li.pass, #qunit-tests.hidepass li.running  {
-       display: none;
-}
-
-#qunit-tests li strong {
-       cursor: pointer;
-}
-
-#qunit-tests li a {
-       padding: 0.5em;
-       color: #c2ccd1;
-       text-decoration: none;
-}
-#qunit-tests li a:hover,
-#qunit-tests li a:focus {
-       color: #000;
-}
-
-#qunit-tests li .runtime {
-       float: right;
-       font-size: smaller;
-}
-
-.qunit-assert-list {
-       margin-top: 0.5em;
-       padding: 0.5em;
-
-       background-color: #fff;
-
-       border-radius: 5px;
-       -moz-border-radius: 5px;
-       -webkit-border-radius: 5px;
-}
-
-.qunit-collapsed {
-       display: none;
-}
-
-#qunit-tests table {
-       border-collapse: collapse;
-       margin-top: .2em;
-}
-
-#qunit-tests th {
-       text-align: right;
-       vertical-align: top;
-       padding: 0 .5em 0 0;
-}
-
-#qunit-tests td {
-       vertical-align: top;
-}
-
-#qunit-tests pre {
-       margin: 0;
-       white-space: pre-wrap;
-       word-wrap: break-word;
-}
-
-#qunit-tests del {
-       background-color: #e0f2be;
-       color: #374e0c;
-       text-decoration: none;
-}
-
-#qunit-tests ins {
-       background-color: #ffcaca;
-       color: #500;
-       text-decoration: none;
-}
-
-/*** Test Counts */
-
-#qunit-tests b.counts                       { color: black; }
-#qunit-tests b.passed                       { color: #5E740B; }
-#qunit-tests b.failed                       { color: #710909; }
-
-#qunit-tests li li {
-       padding: 5px;
-       background-color: #fff;
-       border-bottom: none;
-       list-style-position: inside;
-}
-
-/*** Passing Styles */
-
-#qunit-tests li li.pass {
-       color: #3c510c;
-       background-color: #fff;
-       border-left: 10px solid #C6E746;
-}
-
-#qunit-tests .pass                          { color: #528CE0; background-color: #D2E0E6; }
-#qunit-tests .pass .test-name               { color: #366097; }
-
-#qunit-tests .pass .test-actual,
-#qunit-tests .pass .test-expected           { color: #999999; }
-
-#qunit-banner.qunit-pass                    { background-color: #C6E746; }
-
-/*** Failing Styles */
-
-#qunit-tests li li.fail {
-       color: #710909;
-       background-color: #fff;
-       border-left: 10px solid #EE5757;
-       white-space: pre;
-}
-
-#qunit-tests > li:last-child {
-       border-radius: 0 0 5px 5px;
-       -moz-border-radius: 0 0 5px 5px;
-       -webkit-border-bottom-right-radius: 5px;
-       -webkit-border-bottom-left-radius: 5px;
-}
-
-#qunit-tests .fail                          { color: #000000; background-color: #EE5757; }
-#qunit-tests .fail .test-name,
-#qunit-tests .fail .module-name             { color: #000000; }
-
-#qunit-tests .fail .test-actual             { color: #EE5757; }
-#qunit-tests .fail .test-expected           { color: green;   }
-
-#qunit-banner.qunit-fail                    { background-color: #EE5757; }
-
-
-/** Result */
-
-#qunit-testresult {
-       padding: 0.5em 0.5em 0.5em 2.5em;
-
-       color: #2b81af;
-       background-color: #D2E0E6;
-
-       border-bottom: 1px solid white;
-}
-#qunit-testresult .module-name {
-       font-weight: bold;
-}
-
-/** Fixture */
-
-#qunit-fixture {
-       position: absolute;
-       top: -10000px;
-       left: -10000px;
-       width: 1000px;
-       height: 1000px;
-}
diff --git a/resources/jquery/jquery.qunit.js b/resources/jquery/jquery.qunit.js
deleted file mode 100644 (file)
index 302545f..0000000
+++ /dev/null
@@ -1,2152 +0,0 @@
-/**
- * QUnit v1.11.0 - A JavaScript Unit Testing Framework
- *
- * http://qunitjs.com
- *
- * Copyright 2012 jQuery Foundation and other contributors
- * Released under the MIT license.
- * http://jquery.org/license
- */
-
-(function( window ) {
-
-var QUnit,
-       assert,
-       config,
-       onErrorFnPrev,
-       testId = 0,
-       fileName = (sourceFromStacktrace( 0 ) || "" ).replace(/(:\d+)+\)?/, "").replace(/.+\//, ""),
-       toString = Object.prototype.toString,
-       hasOwn = Object.prototype.hasOwnProperty,
-       // Keep a local reference to Date (GH-283)
-       Date = window.Date,
-       defined = {
-               setTimeout: typeof window.setTimeout !== "undefined",
-               sessionStorage: (function() {
-                       var x = "qunit-test-string";
-                       try {
-                               sessionStorage.setItem( x, x );
-                               sessionStorage.removeItem( x );
-                               return true;
-                       } catch( e ) {
-                               return false;
-                       }
-               }())
-       },
-       /**
-        * Provides a normalized error string, correcting an issue
-        * with IE 7 (and prior) where Error.prototype.toString is
-        * not properly implemented
-        *
-        * Based on http://es5.github.com/#x15.11.4.4
-        *
-        * @param {String|Error} error
-        * @return {String} error message
-        */
-       errorString = function( error ) {
-               var name, message,
-                       errorString = error.toString();
-               if ( errorString.substring( 0, 7 ) === "[object" ) {
-                       name = error.name ? error.name.toString() : "Error";
-                       message = error.message ? error.message.toString() : "";
-                       if ( name && message ) {
-                               return name + ": " + message;
-                       } else if ( name ) {
-                               return name;
-                       } else if ( message ) {
-                               return message;
-                       } else {
-                               return "Error";
-                       }
-               } else {
-                       return errorString;
-               }
-       },
-       /**
-        * Makes a clone of an object using only Array or Object as base,
-        * and copies over the own enumerable properties.
-        *
-        * @param {Object} obj
-        * @return {Object} New object with only the own properties (recursively).
-        */
-       objectValues = function( obj ) {
-               // Grunt 0.3.x uses an older version of jshint that still has jshint/jshint#392.
-               /*jshint newcap: false */
-               var key, val,
-                       vals = QUnit.is( "array", obj ) ? [] : {};
-               for ( key in obj ) {
-                       if ( hasOwn.call( obj, key ) ) {
-                               val = obj[key];
-                               vals[key] = val === Object(val) ? objectValues(val) : val;
-                       }
-               }
-               return vals;
-       };
-
-function Test( settings ) {
-       extend( this, settings );
-       this.assertions = [];
-       this.testNumber = ++Test.count;
-}
-
-Test.count = 0;
-
-Test.prototype = {
-       init: function() {
-               var a, b, li,
-                       tests = id( "qunit-tests" );
-
-               if ( tests ) {
-                       b = document.createElement( "strong" );
-                       b.innerHTML = this.nameHtml;
-
-                       // `a` initialized at top of scope
-                       a = document.createElement( "a" );
-                       a.innerHTML = "Rerun";
-                       a.href = QUnit.url({ testNumber: this.testNumber });
-
-                       li = document.createElement( "li" );
-                       li.appendChild( b );
-                       li.appendChild( a );
-                       li.className = "running";
-                       li.id = this.id = "qunit-test-output" + testId++;
-
-                       tests.appendChild( li );
-               }
-       },
-       setup: function() {
-               if ( this.module !== config.previousModule ) {
-                       if ( config.previousModule ) {
-                               runLoggingCallbacks( "moduleDone", QUnit, {
-                                       name: config.previousModule,
-                                       failed: config.moduleStats.bad,
-                                       passed: config.moduleStats.all - config.moduleStats.bad,
-                                       total: config.moduleStats.all
-                               });
-                       }
-                       config.previousModule = this.module;
-                       config.moduleStats = { all: 0, bad: 0 };
-                       runLoggingCallbacks( "moduleStart", QUnit, {
-                               name: this.module
-                       });
-               } else if ( config.autorun ) {
-                       runLoggingCallbacks( "moduleStart", QUnit, {
-                               name: this.module
-                       });
-               }
-
-               config.current = this;
-
-               this.testEnvironment = extend({
-                       setup: function() {},
-                       teardown: function() {}
-               }, this.moduleTestEnvironment );
-
-               this.started = +new Date();
-               runLoggingCallbacks( "testStart", QUnit, {
-                       name: this.testName,
-                       module: this.module
-               });
-
-               // allow utility functions to access the current test environment
-               // TODO why??
-               QUnit.current_testEnvironment = this.testEnvironment;
-
-               if ( !config.pollution ) {
-                       saveGlobal();
-               }
-               if ( config.notrycatch ) {
-                       this.testEnvironment.setup.call( this.testEnvironment );
-                       return;
-               }
-               try {
-                       this.testEnvironment.setup.call( this.testEnvironment );
-               } catch( e ) {
-                       QUnit.pushFailure( "Setup failed on " + this.testName + ": " + ( e.message || e ), extractStacktrace( e, 1 ) );
-               }
-       },
-       run: function() {
-               config.current = this;
-
-               var running = id( "qunit-testresult" );
-
-               if ( running ) {
-                       running.innerHTML = "Running: <br/>" + this.nameHtml;
-               }
-
-               if ( this.async ) {
-                       QUnit.stop();
-               }
-
-               this.callbackStarted = +new Date();
-
-               if ( config.notrycatch ) {
-                       this.callback.call( this.testEnvironment, QUnit.assert );
-                       this.callbackRuntime = +new Date() - this.callbackStarted;
-                       return;
-               }
-
-               try {
-                       this.callback.call( this.testEnvironment, QUnit.assert );
-                       this.callbackRuntime = +new Date() - this.callbackStarted;
-               } catch( e ) {
-                       this.callbackRuntime = +new Date() - this.callbackStarted;
-
-                       QUnit.pushFailure( "Died on test #" + (this.assertions.length + 1) + " " + this.stack + ": " + ( e.message || e ), extractStacktrace( e, 0 ) );
-                       // else next test will carry the responsibility
-                       saveGlobal();
-
-                       // Restart the tests if they're blocking
-                       if ( config.blocking ) {
-                               QUnit.start();
-                       }
-               }
-       },
-       teardown: function() {
-               config.current = this;
-               if ( config.notrycatch ) {
-                       if ( typeof this.callbackRuntime === "undefined" ) {
-                               this.callbackRuntime = +new Date() - this.callbackStarted;
-                       }
-                       this.testEnvironment.teardown.call( this.testEnvironment );
-                       return;
-               } else {
-                       try {
-                               this.testEnvironment.teardown.call( this.testEnvironment );
-                       } catch( e ) {
-                               QUnit.pushFailure( "Teardown failed on " + this.testName + ": " + ( e.message || e ), extractStacktrace( e, 1 ) );
-                       }
-               }
-               checkPollution();
-       },
-       finish: function() {
-               config.current = this;
-               if ( config.requireExpects && this.expected === null ) {
-                       QUnit.pushFailure( "Expected number of assertions to be defined, but expect() was not called.", this.stack );
-               } else if ( this.expected !== null && this.expected !== this.assertions.length ) {
-                       QUnit.pushFailure( "Expected " + this.expected + " assertions, but " + this.assertions.length + " were run", this.stack );
-               } else if ( this.expected === null && !this.assertions.length ) {
-                       QUnit.pushFailure( "Expected at least one assertion, but none were run - call expect(0) to accept zero assertions.", this.stack );
-               }
-
-               var i, assertion, a, b, time, li, ol,
-                       test = this,
-                       good = 0,
-                       bad = 0,
-                       tests = id( "qunit-tests" );
-
-               this.runtime = +new Date() - this.started;
-               config.stats.all += this.assertions.length;
-               config.moduleStats.all += this.assertions.length;
-
-               if ( tests ) {
-                       ol = document.createElement( "ol" );
-                       ol.className = "qunit-assert-list";
-
-                       for ( i = 0; i < this.assertions.length; i++ ) {
-                               assertion = this.assertions[i];
-
-                               li = document.createElement( "li" );
-                               li.className = assertion.result ? "pass" : "fail";
-                               li.innerHTML = assertion.message || ( assertion.result ? "okay" : "failed" );
-                               ol.appendChild( li );
-
-                               if ( assertion.result ) {
-                                       good++;
-                               } else {
-                                       bad++;
-                                       config.stats.bad++;
-                                       config.moduleStats.bad++;
-                               }
-                       }
-
-                       // store result when possible
-                       if ( QUnit.config.reorder && defined.sessionStorage ) {
-                               if ( bad ) {
-                                       sessionStorage.setItem( "qunit-test-" + this.module + "-" + this.testName, bad );
-                               } else {
-                                       sessionStorage.removeItem( "qunit-test-" + this.module + "-" + this.testName );
-                               }
-                       }
-
-                       if ( bad === 0 ) {
-                               addClass( ol, "qunit-collapsed" );
-                       }
-
-                       // `b` initialized at top of scope
-                       b = document.createElement( "strong" );
-                       b.innerHTML = this.nameHtml + " <b class='counts'>(<b class='failed'>" + bad + "</b>, <b class='passed'>" + good + "</b>, " + this.assertions.length + ")</b>";
-
-                       addEvent(b, "click", function() {
-                               var next = b.parentNode.lastChild,
-                                       collapsed = hasClass( next, "qunit-collapsed" );
-                               ( collapsed ? removeClass : addClass )( next, "qunit-collapsed" );
-                       });
-
-                       addEvent(b, "dblclick", function( e ) {
-                               var target = e && e.target ? e.target : window.event.srcElement;
-                               if ( target.nodeName.toLowerCase() === "span" || target.nodeName.toLowerCase() === "b" ) {
-                                       target = target.parentNode;
-                               }
-                               if ( window.location && target.nodeName.toLowerCase() === "strong" ) {
-                                       window.location = QUnit.url({ testNumber: test.testNumber });
-                               }
-                       });
-
-                       // `time` initialized at top of scope
-                       time = document.createElement( "span" );
-                       time.className = "runtime";
-                       time.innerHTML = this.runtime + " ms";
-
-                       // `li` initialized at top of scope
-                       li = id( this.id );
-                       li.className = bad ? "fail" : "pass";
-                       li.removeChild( li.firstChild );
-                       a = li.firstChild;
-                       li.appendChild( b );
-                       li.appendChild( a );
-                       li.appendChild( time );
-                       li.appendChild( ol );
-
-               } else {
-                       for ( i = 0; i < this.assertions.length; i++ ) {
-                               if ( !this.assertions[i].result ) {
-                                       bad++;
-                                       config.stats.bad++;
-                                       config.moduleStats.bad++;
-                               }
-                       }
-               }
-
-               runLoggingCallbacks( "testDone", QUnit, {
-                       name: this.testName,
-                       module: this.module,
-                       failed: bad,
-                       passed: this.assertions.length - bad,
-                       total: this.assertions.length,
-                       duration: this.runtime
-               });
-
-               QUnit.reset();
-
-               config.current = undefined;
-       },
-
-       queue: function() {
-               var bad,
-                       test = this;
-
-               synchronize(function() {
-                       test.init();
-               });
-               function run() {
-                       // each of these can by async
-                       synchronize(function() {
-                               test.setup();
-                       });
-                       synchronize(function() {
-                               test.run();
-                       });
-                       synchronize(function() {
-                               test.teardown();
-                       });
-                       synchronize(function() {
-                               test.finish();
-                       });
-               }
-
-               // `bad` initialized at top of scope
-               // defer when previous test run passed, if storage is available
-               bad = QUnit.config.reorder && defined.sessionStorage &&
-                                               +sessionStorage.getItem( "qunit-test-" + this.module + "-" + this.testName );
-
-               if ( bad ) {
-                       run();
-               } else {
-                       synchronize( run, true );
-               }
-       }
-};
-
-// Root QUnit object.
-// `QUnit` initialized at top of scope
-QUnit = {
-
-       // call on start of module test to prepend name to all tests
-       module: function( name, testEnvironment ) {
-               config.currentModule = name;
-               config.currentModuleTestEnvironment = testEnvironment;
-               config.modules[name] = true;
-       },
-
-       asyncTest: function( testName, expected, callback ) {
-               if ( arguments.length === 2 ) {
-                       callback = expected;
-                       expected = null;
-               }
-
-               QUnit.test( testName, expected, callback, true );
-       },
-
-       test: function( testName, expected, callback, async ) {
-               var test,
-                       nameHtml = "<span class='test-name'>" + escapeText( testName ) + "</span>";
-
-               if ( arguments.length === 2 ) {
-                       callback = expected;
-                       expected = null;
-               }
-
-               if ( config.currentModule ) {
-                       nameHtml = "<span class='module-name'>" + escapeText( config.currentModule ) + "</span>: " + nameHtml;
-               }
-
-               test = new Test({
-                       nameHtml: nameHtml,
-                       testName: testName,
-                       expected: expected,
-                       async: async,
-                       callback: callback,
-                       module: config.currentModule,
-                       moduleTestEnvironment: config.currentModuleTestEnvironment,
-                       stack: sourceFromStacktrace( 2 )
-               });
-
-               if ( !validTest( test ) ) {
-                       return;
-               }
-
-               test.queue();
-       },
-
-       // Specify the number of expected assertions to gurantee that failed test (no assertions are run at all) don't slip through.
-       expect: function( asserts ) {
-               if (arguments.length === 1) {
-                       config.current.expected = asserts;
-               } else {
-                       return config.current.expected;
-               }
-       },
-
-       start: function( count ) {
-               // QUnit hasn't been initialized yet.
-               // Note: RequireJS (et al) may delay onLoad
-               if ( config.semaphore === undefined ) {
-                       QUnit.begin(function() {
-                               // This is triggered at the top of QUnit.load, push start() to the event loop, to allow QUnit.load to finish first
-                               setTimeout(function() {
-                                       QUnit.start( count );
-                               });
-                       });
-                       return;
-               }
-
-               config.semaphore -= count || 1;
-               // don't start until equal number of stop-calls
-               if ( config.semaphore > 0 ) {
-                       return;
-               }
-               // ignore if start is called more often then stop
-               if ( config.semaphore < 0 ) {
-                       config.semaphore = 0;
-                       QUnit.pushFailure( "Called start() while already started (QUnit.config.semaphore was 0 already)", null, sourceFromStacktrace(2) );
-                       return;
-               }
-               // A slight delay, to avoid any current callbacks
-               if ( defined.setTimeout ) {
-                       window.setTimeout(function() {
-                               if ( config.semaphore > 0 ) {
-                                       return;
-                               }
-                               if ( config.timeout ) {
-                                       clearTimeout( config.timeout );
-                               }
-
-                               config.blocking = false;
-                               process( true );
-                       }, 13);
-               } else {
-                       config.blocking = false;
-                       process( true );
-               }
-       },
-
-       stop: function( count ) {
-               config.semaphore += count || 1;
-               config.blocking = true;
-
-               if ( config.testTimeout && defined.setTimeout ) {
-                       clearTimeout( config.timeout );
-                       config.timeout = window.setTimeout(function() {
-                               QUnit.ok( false, "Test timed out" );
-                               config.semaphore = 1;
-                               QUnit.start();
-                       }, config.testTimeout );
-               }
-       }
-};
-
-// `assert` initialized at top of scope
-// Asssert helpers
-// All of these must either call QUnit.push() or manually do:
-// - runLoggingCallbacks( "log", .. );
-// - config.current.assertions.push({ .. });
-// We attach it to the QUnit object *after* we expose the public API,
-// otherwise `assert` will become a global variable in browsers (#341).
-assert = {
-       /**
-        * Asserts rough true-ish result.
-        * @name ok
-        * @function
-        * @example ok( "asdfasdf".length > 5, "There must be at least 5 chars" );
-        */
-       ok: function( result, msg ) {
-               if ( !config.current ) {
-                       throw new Error( "ok() assertion outside test context, was " + sourceFromStacktrace(2) );
-               }
-               result = !!result;
-
-               var source,
-                       details = {
-                               module: config.current.module,
-                               name: config.current.testName,
-                               result: result,
-                               message: msg
-                       };
-
-               msg = escapeText( msg || (result ? "okay" : "failed" ) );
-               msg = "<span class='test-message'>" + msg + "</span>";
-
-               if ( !result ) {
-                       source = sourceFromStacktrace( 2 );
-                       if ( source ) {
-                               details.source = source;
-                               msg += "<table><tr class='test-source'><th>Source: </th><td><pre>" + escapeText( source ) + "</pre></td></tr></table>";
-                       }
-               }
-               runLoggingCallbacks( "log", QUnit, details );
-               config.current.assertions.push({
-                       result: result,
-                       message: msg
-               });
-       },
-
-       /**
-        * Assert that the first two arguments are equal, with an optional message.
-        * Prints out both actual and expected values.
-        * @name equal
-        * @function
-        * @example equal( format( "Received {0} bytes.", 2), "Received 2 bytes.", "format() replaces {0} with next argument" );
-        */
-       equal: function( actual, expected, message ) {
-               /*jshint eqeqeq:false */
-               QUnit.push( expected == actual, actual, expected, message );
-       },
-
-       /**
-        * @name notEqual
-        * @function
-        */
-       notEqual: function( actual, expected, message ) {
-               /*jshint eqeqeq:false */
-               QUnit.push( expected != actual, actual, expected, message );
-       },
-
-       /**
-        * @name propEqual
-        * @function
-        */
-       propEqual: function( actual, expected, message ) {
-               actual = objectValues(actual);
-               expected = objectValues(expected);
-               QUnit.push( QUnit.equiv(actual, expected), actual, expected, message );
-       },
-
-       /**
-        * @name notPropEqual
-        * @function
-        */
-       notPropEqual: function( actual, expected, message ) {
-               actual = objectValues(actual);
-               expected = objectValues(expected);
-               QUnit.push( !QUnit.equiv(actual, expected), actual, expected, message );
-       },
-
-       /**
-        * @name deepEqual
-        * @function
-        */
-       deepEqual: function( actual, expected, message ) {
-               QUnit.push( QUnit.equiv(actual, expected), actual, expected, message );
-       },
-
-       /**
-        * @name notDeepEqual
-        * @function
-        */
-       notDeepEqual: function( actual, expected, message ) {
-               QUnit.push( !QUnit.equiv(actual, expected), actual, expected, message );
-       },
-
-       /**
-        * @name strictEqual
-        * @function
-        */
-       strictEqual: function( actual, expected, message ) {
-               QUnit.push( expected === actual, actual, expected, message );
-       },
-
-       /**
-        * @name notStrictEqual
-        * @function
-        */
-       notStrictEqual: function( actual, expected, message ) {
-               QUnit.push( expected !== actual, actual, expected, message );
-       },
-
-       "throws": function( block, expected, message ) {
-               var actual,
-                       expectedOutput = expected,
-                       ok = false;
-
-               // 'expected' is optional
-               if ( typeof expected === "string" ) {
-                       message = expected;
-                       expected = null;
-               }
-
-               config.current.ignoreGlobalErrors = true;
-               try {
-                       block.call( config.current.testEnvironment );
-               } catch (e) {
-                       actual = e;
-               }
-               config.current.ignoreGlobalErrors = false;
-
-               if ( actual ) {
-                       // we don't want to validate thrown error
-                       if ( !expected ) {
-                               ok = true;
-                               expectedOutput = null;
-                       // expected is a regexp
-                       } else if ( QUnit.objectType( expected ) === "regexp" ) {
-                               ok = expected.test( errorString( actual ) );
-                       // expected is a constructor
-                       } else if ( actual instanceof expected ) {
-                               ok = true;
-                       // expected is a validation function which returns true is validation passed
-                       } else if ( expected.call( {}, actual ) === true ) {
-                               expectedOutput = null;
-                               ok = true;
-                       }
-
-                       QUnit.push( ok, actual, expectedOutput, message );
-               } else {
-                       QUnit.pushFailure( message, null, 'No exception was thrown.' );
-               }
-       }
-};
-
-/**
- * @deprecate since 1.8.0
- * Kept assertion helpers in root for backwards compatibility.
- */
-extend( QUnit, assert );
-
-/**
- * @deprecated since 1.9.0
- * Kept root "raises()" for backwards compatibility.
- * (Note that we don't introduce assert.raises).
- */
-QUnit.raises = assert[ "throws" ];
-
-/**
- * @deprecated since 1.0.0, replaced with error pushes since 1.3.0
- * Kept to avoid TypeErrors for undefined methods.
- */
-QUnit.equals = function() {
-       QUnit.push( false, false, false, "QUnit.equals has been deprecated since 2009 (e88049a0), use QUnit.equal instead" );
-};
-QUnit.same = function() {
-       QUnit.push( false, false, false, "QUnit.same has been deprecated since 2009 (e88049a0), use QUnit.deepEqual instead" );
-};
-
-// We want access to the constructor's prototype
-(function() {
-       function F() {}
-       F.prototype = QUnit;
-       QUnit = new F();
-       // Make F QUnit's constructor so that we can add to the prototype later
-       QUnit.constructor = F;
-}());
-
-/**
- * Config object: Maintain internal state
- * Later exposed as QUnit.config
- * `config` initialized at top of scope
- */
-config = {
-       // The queue of tests to run
-       queue: [],
-
-       // block until document ready
-       blocking: true,
-
-       // when enabled, show only failing tests
-       // gets persisted through sessionStorage and can be changed in UI via checkbox
-       hidepassed: false,
-
-       // by default, run previously failed tests first
-       // very useful in combination with "Hide passed tests" checked
-       reorder: true,
-
-       // by default, modify document.title when suite is done
-       altertitle: true,
-
-       // when enabled, all tests must call expect()
-       requireExpects: false,
-
-       // add checkboxes that are persisted in the query-string
-       // when enabled, the id is set to `true` as a `QUnit.config` property
-       urlConfig: [
-               {
-                       id: "noglobals",
-                       label: "Check for Globals",
-                       tooltip: "Enabling this will test if any test introduces new properties on the `window` object. Stored as query-strings."
-               },
-               {
-                       id: "notrycatch",
-                       label: "No try-catch",
-                       tooltip: "Enabling this will run tests outside of a try-catch block. Makes debugging exceptions in IE reasonable. Stored as query-strings."
-               }
-       ],
-
-       // Set of all modules.
-       modules: {},
-
-       // logging callback queues
-       begin: [],
-       done: [],
-       log: [],
-       testStart: [],
-       testDone: [],
-       moduleStart: [],
-       moduleDone: []
-};
-
-// Export global variables, unless an 'exports' object exists,
-// in that case we assume we're in CommonJS (dealt with on the bottom of the script)
-if ( typeof exports === "undefined" ) {
-       extend( window, QUnit );
-
-       // Expose QUnit object
-       window.QUnit = QUnit;
-}
-
-// Initialize more QUnit.config and QUnit.urlParams
-(function() {
-       var i,
-               location = window.location || { search: "", protocol: "file:" },
-               params = location.search.slice( 1 ).split( "&" ),
-               length = params.length,
-               urlParams = {},
-               current;
-
-       if ( params[ 0 ] ) {
-               for ( i = 0; i < length; i++ ) {
-                       current = params[ i ].split( "=" );
-                       current[ 0 ] = decodeURIComponent( current[ 0 ] );
-                       // allow just a key to turn on a flag, e.g., test.html?noglobals
-                       current[ 1 ] = current[ 1 ] ? decodeURIComponent( current[ 1 ] ) : true;
-                       urlParams[ current[ 0 ] ] = current[ 1 ];
-               }
-       }
-
-       QUnit.urlParams = urlParams;
-
-       // String search anywhere in moduleName+testName
-       config.filter = urlParams.filter;
-
-       // Exact match of the module name
-       config.module = urlParams.module;
-
-       config.testNumber = parseInt( urlParams.testNumber, 10 ) || null;
-
-       // Figure out if we're running the tests from a server or not
-       QUnit.isLocal = location.protocol === "file:";
-}());
-
-// Extend QUnit object,
-// these after set here because they should not be exposed as global functions
-extend( QUnit, {
-       assert: assert,
-
-       config: config,
-
-       // Initialize the configuration options
-       init: function() {
-               extend( config, {
-                       stats: { all: 0, bad: 0 },
-                       moduleStats: { all: 0, bad: 0 },
-                       started: +new Date(),
-                       updateRate: 1000,
-                       blocking: false,
-                       autostart: true,
-                       autorun: false,
-                       filter: "",
-                       queue: [],
-                       semaphore: 1
-               });
-
-               var tests, banner, result,
-                       qunit = id( "qunit" );
-
-               if ( qunit ) {
-                       qunit.innerHTML =
-                               "<h1 id='qunit-header'>" + escapeText( document.title ) + "</h1>" +
-                               "<h2 id='qunit-banner'></h2>" +
-                               "<div id='qunit-testrunner-toolbar'></div>" +
-                               "<h2 id='qunit-userAgent'></h2>" +
-                               "<ol id='qunit-tests'></ol>";
-               }
-
-               tests = id( "qunit-tests" );
-               banner = id( "qunit-banner" );
-               result = id( "qunit-testresult" );
-
-               if ( tests ) {
-                       tests.innerHTML = "";
-               }
-
-               if ( banner ) {
-                       banner.className = "";
-               }
-
-               if ( result ) {
-                       result.parentNode.removeChild( result );
-               }
-
-               if ( tests ) {
-                       result = document.createElement( "p" );
-                       result.id = "qunit-testresult";
-                       result.className = "result";
-                       tests.parentNode.insertBefore( result, tests );
-                       result.innerHTML = "Running...<br/>&nbsp;";
-               }
-       },
-
-       // Resets the test setup. Useful for tests that modify the DOM.
-       reset: function() {
-               var fixture = id( "qunit-fixture" );
-               if ( fixture ) {
-                       fixture.innerHTML = config.fixture;
-               }
-       },
-
-       // Trigger an event on an element.
-       // @example triggerEvent( document.body, "click" );
-       triggerEvent: function( elem, type, event ) {
-               if ( document.createEvent ) {
-                       event = document.createEvent( "MouseEvents" );
-                       event.initMouseEvent(type, true, true, elem.ownerDocument.defaultView,
-                               0, 0, 0, 0, 0, false, false, false, false, 0, null);
-
-                       elem.dispatchEvent( event );
-               } else if ( elem.fireEvent ) {
-                       elem.fireEvent( "on" + type );
-               }
-       },
-
-       // Safe object type checking
-       is: function( type, obj ) {
-               return QUnit.objectType( obj ) === type;
-       },
-
-       objectType: function( obj ) {
-               if ( typeof obj === "undefined" ) {
-                               return "undefined";
-               // consider: typeof null === object
-               }
-               if ( obj === null ) {
-                               return "null";
-               }
-
-               var match = toString.call( obj ).match(/^\[object\s(.*)\]$/),
-                       type = match && match[1] || "";
-
-               switch ( type ) {
-                       case "Number":
-                               if ( isNaN(obj) ) {
-                                       return "nan";
-                               }
-                               return "number";
-                       case "String":
-                       case "Boolean":
-                       case "Array":
-                       case "Date":
-                       case "RegExp":
-                       case "Function":
-                               return type.toLowerCase();
-               }
-               if ( typeof obj === "object" ) {
-                       return "object";
-               }
-               return undefined;
-       },
-
-       push: function( result, actual, expected, message ) {
-               if ( !config.current ) {
-                       throw new Error( "assertion outside test context, was " + sourceFromStacktrace() );
-               }
-
-               var output, source,
-                       details = {
-                               module: config.current.module,
-                               name: config.current.testName,
-                               result: result,
-                               message: message,
-                               actual: actual,
-                               expected: expected
-                       };
-
-               message = escapeText( message ) || ( result ? "okay" : "failed" );
-               message = "<span class='test-message'>" + message + "</span>";
-               output = message;
-
-               if ( !result ) {
-                       expected = escapeText( QUnit.jsDump.parse(expected) );
-                       actual = escapeText( QUnit.jsDump.parse(actual) );
-                       output += "<table><tr class='test-expected'><th>Expected: </th><td><pre>" + expected + "</pre></td></tr>";
-
-                       if ( actual !== expected ) {
-                               output += "<tr class='test-actual'><th>Result: </th><td><pre>" + actual + "</pre></td></tr>";
-                               output += "<tr class='test-diff'><th>Diff: </th><td><pre>" + QUnit.diff( expected, actual ) + "</pre></td></tr>";
-                       }
-
-                       source = sourceFromStacktrace();
-
-                       if ( source ) {
-                               details.source = source;
-                               output += "<tr class='test-source'><th>Source: </th><td><pre>" + escapeText( source ) + "</pre></td></tr>";
-                       }
-
-                       output += "</table>";
-               }
-
-               runLoggingCallbacks( "log", QUnit, details );
-
-               config.current.assertions.push({
-                       result: !!result,
-                       message: output
-               });
-       },
-
-       pushFailure: function( message, source, actual ) {
-               if ( !config.current ) {
-                       throw new Error( "pushFailure() assertion outside test context, was " + sourceFromStacktrace(2) );
-               }
-
-               var output,
-                       details = {
-                               module: config.current.module,
-                               name: config.current.testName,
-                               result: false,
-                               message: message
-                       };
-
-               message = escapeText( message ) || "error";
-               message = "<span class='test-message'>" + message + "</span>";
-               output = message;
-
-               output += "<table>";
-
-               if ( actual ) {
-                       output += "<tr class='test-actual'><th>Result: </th><td><pre>" + escapeText( actual ) + "</pre></td></tr>";
-               }
-
-               if ( source ) {
-                       details.source = source;
-                       output += "<tr class='test-source'><th>Source: </th><td><pre>" + escapeText( source ) + "</pre></td></tr>";
-               }
-
-               output += "</table>";
-
-               runLoggingCallbacks( "log", QUnit, details );
-
-               config.current.assertions.push({
-                       result: false,
-                       message: output
-               });
-       },
-
-       url: function( params ) {
-               params = extend( extend( {}, QUnit.urlParams ), params );
-               var key,
-                       querystring = "?";
-
-               for ( key in params ) {
-                       if ( !hasOwn.call( params, key ) ) {
-                               continue;
-                       }
-                       querystring += encodeURIComponent( key ) + "=" +
-                               encodeURIComponent( params[ key ] ) + "&";
-               }
-               return window.location.protocol + "//" + window.location.host +
-                       window.location.pathname + querystring.slice( 0, -1 );
-       },
-
-       extend: extend,
-       id: id,
-       addEvent: addEvent
-       // load, equiv, jsDump, diff: Attached later
-});
-
-/**
- * @deprecated: Created for backwards compatibility with test runner that set the hook function
- * into QUnit.{hook}, instead of invoking it and passing the hook function.
- * QUnit.constructor is set to the empty F() above so that we can add to it's prototype here.
- * Doing this allows us to tell if the following methods have been overwritten on the actual
- * QUnit object.
- */
-extend( QUnit.constructor.prototype, {
-
-       // Logging callbacks; all receive a single argument with the listed properties
-       // run test/logs.html for any related changes
-       begin: registerLoggingCallback( "begin" ),
-
-       // done: { failed, passed, total, runtime }
-       done: registerLoggingCallback( "done" ),
-
-       // log: { result, actual, expected, message }
-       log: registerLoggingCallback( "log" ),
-
-       // testStart: { name }
-       testStart: registerLoggingCallback( "testStart" ),
-
-       // testDone: { name, failed, passed, total, duration }
-       testDone: registerLoggingCallback( "testDone" ),
-
-       // moduleStart: { name }
-       moduleStart: registerLoggingCallback( "moduleStart" ),
-
-       // moduleDone: { name, failed, passed, total }
-       moduleDone: registerLoggingCallback( "moduleDone" )
-});
-
-if ( typeof document === "undefined" || document.readyState === "complete" ) {
-       config.autorun = true;
-}
-
-QUnit.load = function() {
-       runLoggingCallbacks( "begin", QUnit, {} );
-
-       // Initialize the config, saving the execution queue
-       var banner, filter, i, label, len, main, ol, toolbar, userAgent, val,
-               urlConfigCheckboxesContainer, urlConfigCheckboxes, moduleFilter,
-               numModules = 0,
-               moduleFilterHtml = "",
-               urlConfigHtml = "",
-               oldconfig = extend( {}, config );
-
-       QUnit.init();
-       extend(config, oldconfig);
-
-       config.blocking = false;
-
-       len = config.urlConfig.length;
-
-       for ( i = 0; i < len; i++ ) {
-               val = config.urlConfig[i];
-               if ( typeof val === "string" ) {
-                       val = {
-                               id: val,
-                               label: val,
-                               tooltip: "[no tooltip available]"
-                       };
-               }
-               config[ val.id ] = QUnit.urlParams[ val.id ];
-               urlConfigHtml += "<input id='qunit-urlconfig-" + escapeText( val.id ) +
-                       "' name='" + escapeText( val.id ) +
-                       "' type='checkbox'" + ( config[ val.id ] ? " checked='checked'" : "" ) +
-                       " title='" + escapeText( val.tooltip ) +
-                       "'><label for='qunit-urlconfig-" + escapeText( val.id ) +
-                       "' title='" + escapeText( val.tooltip ) + "'>" + val.label + "</label>";
-       }
-
-       moduleFilterHtml += "<label for='qunit-modulefilter'>Module: </label><select id='qunit-modulefilter' name='modulefilter'><option value='' " +
-               ( config.module === undefined  ? "selected='selected'" : "" ) +
-               ">< All Modules ></option>";
-
-       for ( i in config.modules ) {
-               if ( config.modules.hasOwnProperty( i ) ) {
-                       numModules += 1;
-                       moduleFilterHtml += "<option value='" + escapeText( encodeURIComponent(i) ) + "' " +
-                               ( config.module === i ? "selected='selected'" : "" ) +
-                               ">" + escapeText(i) + "</option>";
-               }
-       }
-       moduleFilterHtml += "</select>";
-
-       // `userAgent` initialized at top of scope
-       userAgent = id( "qunit-userAgent" );
-       if ( userAgent ) {
-               userAgent.innerHTML = navigator.userAgent;
-       }
-
-       // `banner` initialized at top of scope
-       banner = id( "qunit-header" );
-       if ( banner ) {
-               banner.innerHTML = "<a href='" + QUnit.url({ filter: undefined, module: undefined, testNumber: undefined }) + "'>" + banner.innerHTML + "</a> ";
-       }
-
-       // `toolbar` initialized at top of scope
-       toolbar = id( "qunit-testrunner-toolbar" );
-       if ( toolbar ) {
-               // `filter` initialized at top of scope
-               filter = document.createElement( "input" );
-               filter.type = "checkbox";
-               filter.id = "qunit-filter-pass";
-
-               addEvent( filter, "click", function() {
-                       var tmp,
-                               ol = document.getElementById( "qunit-tests" );
-
-                       if ( filter.checked ) {
-                               ol.className = ol.className + " hidepass";
-                       } else {
-                               tmp = " " + ol.className.replace( /[\n\t\r]/g, " " ) + " ";
-                               ol.className = tmp.replace( / hidepass /, " " );
-                       }
-                       if ( defined.sessionStorage ) {
-                               if (filter.checked) {
-                                       sessionStorage.setItem( "qunit-filter-passed-tests", "true" );
-                               } else {
-                                       sessionStorage.removeItem( "qunit-filter-passed-tests" );
-                               }
-                       }
-               });
-
-               if ( config.hidepassed || defined.sessionStorage && sessionStorage.getItem( "qunit-filter-passed-tests" ) ) {
-                       filter.checked = true;
-                       // `ol` initialized at top of scope
-                       ol = document.getElementById( "qunit-tests" );
-                       ol.className = ol.className + " hidepass";
-               }
-               toolbar.appendChild( filter );
-
-               // `label` initialized at top of scope
-               label = document.createElement( "label" );
-               label.setAttribute( "for", "qunit-filter-pass" );
-               label.setAttribute( "title", "Only show tests and assertons that fail. Stored in sessionStorage." );
-               label.innerHTML = "Hide passed tests";
-               toolbar.appendChild( label );
-
-               urlConfigCheckboxesContainer = document.createElement("span");
-               urlConfigCheckboxesContainer.innerHTML = urlConfigHtml;
-               urlConfigCheckboxes = urlConfigCheckboxesContainer.getElementsByTagName("input");
-               // For oldIE support:
-               // * Add handlers to the individual elements instead of the container
-               // * Use "click" instead of "change"
-               // * Fallback from event.target to event.srcElement
-               addEvents( urlConfigCheckboxes, "click", function( event ) {
-                       var params = {},
-                               target = event.target || event.srcElement;
-                       params[ target.name ] = target.checked ? true : undefined;
-                       window.location = QUnit.url( params );
-               });
-               toolbar.appendChild( urlConfigCheckboxesContainer );
-
-               if (numModules > 1) {
-                       moduleFilter = document.createElement( 'span' );
-                       moduleFilter.setAttribute( 'id', 'qunit-modulefilter-container' );
-                       moduleFilter.innerHTML = moduleFilterHtml;
-                       addEvent( moduleFilter.lastChild, "change", function() {
-                               var selectBox = moduleFilter.getElementsByTagName("select")[0],
-                                       selectedModule = decodeURIComponent(selectBox.options[selectBox.selectedIndex].value);
-
-                               window.location = QUnit.url( { module: ( selectedModule === "" ) ? undefined : selectedModule } );
-                       });
-                       toolbar.appendChild(moduleFilter);
-               }
-       }
-
-       // `main` initialized at top of scope
-       main = id( "qunit-fixture" );
-       if ( main ) {
-               config.fixture = main.innerHTML;
-       }
-
-       if ( config.autostart ) {
-               QUnit.start();
-       }
-};
-
-addEvent( window, "load", QUnit.load );
-
-// `onErrorFnPrev` initialized at top of scope
-// Preserve other handlers
-onErrorFnPrev = window.onerror;
-
-// Cover uncaught exceptions
-// Returning true will surpress the default browser handler,
-// returning false will let it run.
-window.onerror = function ( error, filePath, linerNr ) {
-       var ret = false;
-       if ( onErrorFnPrev ) {
-               ret = onErrorFnPrev( error, filePath, linerNr );
-       }
-
-       // Treat return value as window.onerror itself does,
-       // Only do our handling if not surpressed.
-       if ( ret !== true ) {
-               if ( QUnit.config.current ) {
-                       if ( QUnit.config.current.ignoreGlobalErrors ) {
-                               return true;
-                       }
-                       QUnit.pushFailure( error, filePath + ":" + linerNr );
-               } else {
-                       QUnit.test( "global failure", extend( function() {
-                               QUnit.pushFailure( error, filePath + ":" + linerNr );
-                       }, { validTest: validTest } ) );
-               }
-               return false;
-       }
-
-       return ret;
-};
-
-function done() {
-       config.autorun = true;
-
-       // Log the last module results
-       if ( config.currentModule ) {
-               runLoggingCallbacks( "moduleDone", QUnit, {
-                       name: config.currentModule,
-                       failed: config.moduleStats.bad,
-                       passed: config.moduleStats.all - config.moduleStats.bad,
-                       total: config.moduleStats.all
-               });
-       }
-
-       var i, key,
-               banner = id( "qunit-banner" ),
-               tests = id( "qunit-tests" ),
-               runtime = +new Date() - config.started,
-               passed = config.stats.all - config.stats.bad,
-               html = [
-                       "Tests completed in ",
-                       runtime,
-                       " milliseconds.<br/>",
-                       "<span class='passed'>",
-                       passed,
-                       "</span> assertions of <span class='total'>",
-                       config.stats.all,
-                       "</span> passed, <span class='failed'>",
-                       config.stats.bad,
-                       "</span> failed."
-               ].join( "" );
-
-       if ( banner ) {
-               banner.className = ( config.stats.bad ? "qunit-fail" : "qunit-pass" );
-       }
-
-       if ( tests ) {
-               id( "qunit-testresult" ).innerHTML = html;
-       }
-
-       if ( config.altertitle && typeof document !== "undefined" && document.title ) {
-               // show ✖ for good, ✔ for bad suite result in title
-               // use escape sequences in case file gets loaded with non-utf-8-charset
-               document.title = [
-                       ( config.stats.bad ? "\u2716" : "\u2714" ),
-                       document.title.replace( /^[\u2714\u2716] /i, "" )
-               ].join( " " );
-       }
-
-       // clear own sessionStorage items if all tests passed
-       if ( config.reorder && defined.sessionStorage && config.stats.bad === 0 ) {
-               // `key` & `i` initialized at top of scope
-               for ( i = 0; i < sessionStorage.length; i++ ) {
-                       key = sessionStorage.key( i++ );
-                       if ( key.indexOf( "qunit-test-" ) === 0 ) {
-                               sessionStorage.removeItem( key );
-                       }
-               }
-       }
-
-       // scroll back to top to show results
-       if ( window.scrollTo ) {
-               window.scrollTo(0, 0);
-       }
-
-       runLoggingCallbacks( "done", QUnit, {
-               failed: config.stats.bad,
-               passed: passed,
-               total: config.stats.all,
-               runtime: runtime
-       });
-}
-
-/** @return Boolean: true if this test should be ran */
-function validTest( test ) {
-       var include,
-               filter = config.filter && config.filter.toLowerCase(),
-               module = config.module && config.module.toLowerCase(),
-               fullName = (test.module + ": " + test.testName).toLowerCase();
-
-       // Internally-generated tests are always valid
-       if ( test.callback && test.callback.validTest === validTest ) {
-               delete test.callback.validTest;
-               return true;
-       }
-
-       if ( config.testNumber ) {
-               return test.testNumber === config.testNumber;
-       }
-
-       if ( module && ( !test.module || test.module.toLowerCase() !== module ) ) {
-               return false;
-       }
-
-       if ( !filter ) {
-               return true;
-       }
-
-       include = filter.charAt( 0 ) !== "!";
-       if ( !include ) {
-               filter = filter.slice( 1 );
-       }
-
-       // If the filter matches, we need to honour include
-       if ( fullName.indexOf( filter ) !== -1 ) {
-               return include;
-       }
-
-       // Otherwise, do the opposite
-       return !include;
-}
-
-// so far supports only Firefox, Chrome and Opera (buggy), Safari (for real exceptions)
-// Later Safari and IE10 are supposed to support error.stack as well
-// See also https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Error/Stack
-function extractStacktrace( e, offset ) {
-       offset = offset === undefined ? 3 : offset;
-
-       var stack, include, i;
-
-       if ( e.stacktrace ) {
-               // Opera
-               return e.stacktrace.split( "\n" )[ offset + 3 ];
-       } else if ( e.stack ) {
-               // Firefox, Chrome
-               stack = e.stack.split( "\n" );
-               if (/^error$/i.test( stack[0] ) ) {
-                       stack.shift();
-               }
-               if ( fileName ) {
-                       include = [];
-                       for ( i = offset; i < stack.length; i++ ) {
-                               if ( stack[ i ].indexOf( fileName ) !== -1 ) {
-                                       break;
-                               }
-                               include.push( stack[ i ] );
-                       }
-                       if ( include.length ) {
-                               return include.join( "\n" );
-                       }
-               }
-               return stack[ offset ];
-       } else if ( e.sourceURL ) {
-               // Safari, PhantomJS
-               // hopefully one day Safari provides actual stacktraces
-               // exclude useless self-reference for generated Error objects
-               if ( /qunit.js$/.test( e.sourceURL ) ) {
-                       return;
-               }
-               // for actual exceptions, this is useful
-               return e.sourceURL + ":" + e.line;
-       }
-}
-function sourceFromStacktrace( offset ) {
-       try {
-               throw new Error();
-       } catch ( e ) {
-               return extractStacktrace( e, offset );
-       }
-}
-
-/**
- * Escape text for attribute or text content.
- */
-function escapeText( s ) {
-       if ( !s ) {
-               return "";
-       }
-       s = s + "";
-       // Both single quotes and double quotes (for attributes)
-       return s.replace( /['"<>&]/g, function( s ) {
-               switch( s ) {
-                       case '\'':
-                               return '&#039;';
-                       case '"':
-                               return '&quot;';
-                       case '<':
-                               return '&lt;';
-                       case '>':
-                               return '&gt;';
-                       case '&':
-                               return '&amp;';
-               }
-       });
-}
-
-function synchronize( callback, last ) {
-       config.queue.push( callback );
-
-       if ( config.autorun && !config.blocking ) {
-               process( last );
-       }
-}
-
-function process( last ) {
-       function next() {
-               process( last );
-       }
-       var start = new Date().getTime();
-       config.depth = config.depth ? config.depth + 1 : 1;
-
-       while ( config.queue.length && !config.blocking ) {
-               if ( !defined.setTimeout || config.updateRate <= 0 || ( ( new Date().getTime() - start ) < config.updateRate ) ) {
-                       config.queue.shift()();
-               } else {
-                       window.setTimeout( next, 13 );
-                       break;
-               }
-       }
-       config.depth--;
-       if ( last && !config.blocking && !config.queue.length && config.depth === 0 ) {
-               done();
-       }
-}
-
-function saveGlobal() {
-       config.pollution = [];
-
-       if ( config.noglobals ) {
-               for ( var key in window ) {
-                       // in Opera sometimes DOM element ids show up here, ignore them
-                       if ( !hasOwn.call( window, key ) || /^qunit-test-output/.test( key ) ) {
-                               continue;
-                       }
-                       config.pollution.push( key );
-               }
-       }
-}
-
-function checkPollution() {
-       var newGlobals,
-               deletedGlobals,
-               old = config.pollution;
-
-       saveGlobal();
-
-       newGlobals = diff( config.pollution, old );
-       if ( newGlobals.length > 0 ) {
-               QUnit.pushFailure( "Introduced global variable(s): " + newGlobals.join(", ") );
-       }
-
-       deletedGlobals = diff( old, config.pollution );
-       if ( deletedGlobals.length > 0 ) {
-               QUnit.pushFailure( "Deleted global variable(s): " + deletedGlobals.join(", ") );
-       }
-}
-
-// returns a new Array with the elements that are in a but not in b
-function diff( a, b ) {
-       var i, j,
-               result = a.slice();
-
-       for ( i = 0; i < result.length; i++ ) {
-               for ( j = 0; j < b.length; j++ ) {
-                       if ( result[i] === b[j] ) {
-                               result.splice( i, 1 );
-                               i--;
-                               break;
-                       }
-               }
-       }
-       return result;
-}
-
-function extend( a, b ) {
-       for ( var prop in b ) {
-               if ( b[ prop ] === undefined ) {
-                       delete a[ prop ];
-
-               // Avoid "Member not found" error in IE8 caused by setting window.constructor
-               } else if ( prop !== "constructor" || a !== window ) {
-                       a[ prop ] = b[ prop ];
-               }
-       }
-
-       return a;
-}
-
-/**
- * @param {HTMLElement} elem
- * @param {string} type
- * @param {Function} fn
- */
-function addEvent( elem, type, fn ) {
-       // Standards-based browsers
-       if ( elem.addEventListener ) {
-               elem.addEventListener( type, fn, false );
-       // IE
-       } else {
-               elem.attachEvent( "on" + type, fn );
-       }
-}
-
-/**
- * @param {Array|NodeList} elems
- * @param {string} type
- * @param {Function} fn
- */
-function addEvents( elems, type, fn ) {
-       var i = elems.length;
-       while ( i-- ) {
-               addEvent( elems[i], type, fn );
-       }
-}
-
-function hasClass( elem, name ) {
-       return (" " + elem.className + " ").indexOf(" " + name + " ") > -1;
-}
-
-function addClass( elem, name ) {
-       if ( !hasClass( elem, name ) ) {
-               elem.className += (elem.className ? " " : "") + name;
-       }
-}
-
-function removeClass( elem, name ) {
-       var set = " " + elem.className + " ";
-       // Class name may appear multiple times
-       while ( set.indexOf(" " + name + " ") > -1 ) {
-               set = set.replace(" " + name + " " , " ");
-       }
-       // If possible, trim it for prettiness, but not neccecarily
-       elem.className = window.jQuery ? jQuery.trim( set ) : ( set.trim ? set.trim() : set );
-}
-
-function id( name ) {
-       return !!( typeof document !== "undefined" && document && document.getElementById ) &&
-               document.getElementById( name );
-}
-
-function registerLoggingCallback( key ) {
-       return function( callback ) {
-               config[key].push( callback );
-       };
-}
-
-// Supports deprecated method of completely overwriting logging callbacks
-function runLoggingCallbacks( key, scope, args ) {
-       var i, callbacks;
-       if ( QUnit.hasOwnProperty( key ) ) {
-               QUnit[ key ].call(scope, args );
-       } else {
-               callbacks = config[ key ];
-               for ( i = 0; i < callbacks.length; i++ ) {
-                       callbacks[ i ].call( scope, args );
-               }
-       }
-}
-
-// Test for equality any JavaScript type.
-// Author: Philippe Rathé <prathe@gmail.com>
-QUnit.equiv = (function() {
-
-       // Call the o related callback with the given arguments.
-       function bindCallbacks( o, callbacks, args ) {
-               var prop = QUnit.objectType( o );
-               if ( prop ) {
-                       if ( QUnit.objectType( callbacks[ prop ] ) === "function" ) {
-                               return callbacks[ prop ].apply( callbacks, args );
-                       } else {
-                               return callbacks[ prop ]; // or undefined
-                       }
-               }
-       }
-
-       // the real equiv function
-       var innerEquiv,
-               // stack to decide between skip/abort functions
-               callers = [],
-               // stack to avoiding loops from circular referencing
-               parents = [],
-
-               getProto = Object.getPrototypeOf || function ( obj ) {
-                       return obj.__proto__;
-               },
-               callbacks = (function () {
-
-                       // for string, boolean, number and null
-                       function useStrictEquality( b, a ) {
-                               /*jshint eqeqeq:false */
-                               if ( b instanceof a.constructor || a instanceof b.constructor ) {
-                                       // to catch short annotaion VS 'new' annotation of a
-                                       // declaration
-                                       // e.g. var i = 1;
-                                       // var j = new Number(1);
-                                       return a == b;
-                               } else {
-                                       return a === b;
-                               }
-                       }
-
-                       return {
-                               "string": useStrictEquality,
-                               "boolean": useStrictEquality,
-                               "number": useStrictEquality,
-                               "null": useStrictEquality,
-                               "undefined": useStrictEquality,
-
-                               "nan": function( b ) {
-                                       return isNaN( b );
-                               },
-
-                               "date": function( b, a ) {
-                                       return QUnit.objectType( b ) === "date" && a.valueOf() === b.valueOf();
-                               },
-
-                               "regexp": function( b, a ) {
-                                       return QUnit.objectType( b ) === "regexp" &&
-                                               // the regex itself
-                                               a.source === b.source &&
-                                               // and its modifers
-                                               a.global === b.global &&
-                                               // (gmi) ...
-                                               a.ignoreCase === b.ignoreCase &&
-                                               a.multiline === b.multiline &&
-                                               a.sticky === b.sticky;
-                               },
-
-                               // - skip when the property is a method of an instance (OOP)
-                               // - abort otherwise,
-                               // initial === would have catch identical references anyway
-                               "function": function() {
-                                       var caller = callers[callers.length - 1];
-                                       return caller !== Object && typeof caller !== "undefined";
-                               },
-
-                               "array": function( b, a ) {
-                                       var i, j, len, loop;
-
-                                       // b could be an object literal here
-                                       if ( QUnit.objectType( b ) !== "array" ) {
-                                               return false;
-                                       }
-
-                                       len = a.length;
-                                       if ( len !== b.length ) {
-                                               // safe and faster
-                                               return false;
-                                       }
-
-                                       // track reference to avoid circular references
-                                       parents.push( a );
-                                       for ( i = 0; i < len; i++ ) {
-                                               loop = false;
-                                               for ( j = 0; j < parents.length; j++ ) {
-                                                       if ( parents[j] === a[i] ) {
-                                                               loop = true;// dont rewalk array
-                                                       }
-                                               }
-                                               if ( !loop && !innerEquiv(a[i], b[i]) ) {
-                                                       parents.pop();
-                                                       return false;
-                                               }
-                                       }
-                                       parents.pop();
-                                       return true;
-                               },
-
-                               "object": function( b, a ) {
-                                       var i, j, loop,
-                                               // Default to true
-                                               eq = true,
-                                               aProperties = [],
-                                               bProperties = [];
-
-                                       // comparing constructors is more strict than using
-                                       // instanceof
-                                       if ( a.constructor !== b.constructor ) {
-                                               // Allow objects with no prototype to be equivalent to
-                                               // objects with Object as their constructor.
-                                               if ( !(( getProto(a) === null && getProto(b) === Object.prototype ) ||
-                                                       ( getProto(b) === null && getProto(a) === Object.prototype ) ) ) {
-                                                               return false;
-                                               }
-                                       }
-
-                                       // stack constructor before traversing properties
-                                       callers.push( a.constructor );
-                                       // track reference to avoid circular references
-                                       parents.push( a );
-
-                                       for ( i in a ) { // be strict: don't ensures hasOwnProperty
-                                                                       // and go deep
-                                               loop = false;
-                                               for ( j = 0; j < parents.length; j++ ) {
-                                                       if ( parents[j] === a[i] ) {
-                                                               // don't go down the same path twice
-                                                               loop = true;
-                                                       }
-                                               }
-                                               aProperties.push(i); // collect a's properties
-
-                                               if (!loop && !innerEquiv( a[i], b[i] ) ) {
-                                                       eq = false;
-                                                       break;
-                                               }
-                                       }
-
-                                       callers.pop(); // unstack, we are done
-                                       parents.pop();
-
-                                       for ( i in b ) {
-                                               bProperties.push( i ); // collect b's properties
-                                       }
-
-                                       // Ensures identical properties name
-                                       return eq && innerEquiv( aProperties.sort(), bProperties.sort() );
-                               }
-                       };
-               }());
-
-       innerEquiv = function() { // can take multiple arguments
-               var args = [].slice.apply( arguments );
-               if ( args.length < 2 ) {
-                       return true; // end transition
-               }
-
-               return (function( a, b ) {
-                       if ( a === b ) {
-                               return true; // catch the most you can
-                       } else if ( a === null || b === null || typeof a === "undefined" ||
-                                       typeof b === "undefined" ||
-                                       QUnit.objectType(a) !== QUnit.objectType(b) ) {
-                               return false; // don't lose time with error prone cases
-                       } else {
-                               return bindCallbacks(a, callbacks, [ b, a ]);
-                       }
-
-                       // apply transition with (1..n) arguments
-               }( args[0], args[1] ) && arguments.callee.apply( this, args.splice(1, args.length - 1 )) );
-       };
-
-       return innerEquiv;
-}());
-
-/**
- * jsDump Copyright (c) 2008 Ariel Flesler - aflesler(at)gmail(dot)com |
- * http://flesler.blogspot.com Licensed under BSD
- * (http://www.opensource.org/licenses/bsd-license.php) Date: 5/15/2008
- *
- * @projectDescription Advanced and extensible data dumping for Javascript.
- * @version 1.0.0
- * @author Ariel Flesler
- * @link {http://flesler.blogspot.com/2008/05/jsdump-pretty-dump-of-any-javascript.html}
- */
-QUnit.jsDump = (function() {
-       function quote( str ) {
-               return '"' + str.toString().replace( /"/g, '\\"' ) + '"';
-       }
-       function literal( o ) {
-               return o + "";
-       }
-       function join( pre, arr, post ) {
-               var s = jsDump.separator(),
-                       base = jsDump.indent(),
-                       inner = jsDump.indent(1);
-               if ( arr.join ) {
-                       arr = arr.join( "," + s + inner );
-               }
-               if ( !arr ) {
-                       return pre + post;
-               }
-               return [ pre, inner + arr, base + post ].join(s);
-       }
-       function array( arr, stack ) {
-               var i = arr.length, ret = new Array(i);
-               this.up();
-               while ( i-- ) {
-                       ret[i] = this.parse( arr[i] , undefined , stack);
-               }
-               this.down();
-               return join( "[", ret, "]" );
-       }
-
-       var reName = /^function (\w+)/,
-               jsDump = {
-                       // type is used mostly internally, you can fix a (custom)type in advance
-                       parse: function( obj, type, stack ) {
-                               stack = stack || [ ];
-                               var inStack, res,
-                                       parser = this.parsers[ type || this.typeOf(obj) ];
-
-                               type = typeof parser;
-                               inStack = inArray( obj, stack );
-
-                               if ( inStack !== -1 ) {
-                                       return "recursion(" + (inStack - stack.length) + ")";
-                               }
-                               if ( type === "function" )  {
-                                       stack.push( obj );
-                                       res = parser.call( this, obj, stack );
-                                       stack.pop();
-                                       return res;
-                               }
-                               return ( type === "string" ) ? parser : this.parsers.error;
-                       },
-                       typeOf: function( obj ) {
-                               var type;
-                               if ( obj === null ) {
-                                       type = "null";
-                               } else if ( typeof obj === "undefined" ) {
-                                       type = "undefined";
-                               } else if ( QUnit.is( "regexp", obj) ) {
-                                       type = "regexp";
-                               } else if ( QUnit.is( "date", obj) ) {
-                                       type = "date";
-                               } else if ( QUnit.is( "function", obj) ) {
-                                       type = "function";
-                               } else if ( typeof obj.setInterval !== undefined && typeof obj.document !== "undefined" && typeof obj.nodeType === "undefined" ) {
-                                       type = "window";
-                               } else if ( obj.nodeType === 9 ) {
-                                       type = "document";
-                               } else if ( obj.nodeType ) {
-                                       type = "node";
-                               } else if (
-                                       // native arrays
-                                       toString.call( obj ) === "[object Array]" ||
-                                       // NodeList objects
-                                       ( typeof obj.length === "number" && typeof obj.item !== "undefined" && ( obj.length ? obj.item(0) === obj[0] : ( obj.item( 0 ) === null && typeof obj[0] === "undefined" ) ) )
-                               ) {
-                                       type = "array";
-                               } else if ( obj.constructor === Error.prototype.constructor ) {
-                                       type = "error";
-                               } else {
-                                       type = typeof obj;
-                               }
-                               return type;
-                       },
-                       separator: function() {
-                               return this.multiline ? this.HTML ? "<br />" : "\n" : this.HTML ? "&nbsp;" : " ";
-                       },
-                       // extra can be a number, shortcut for increasing-calling-decreasing
-                       indent: function( extra ) {
-                               if ( !this.multiline ) {
-                                       return "";
-                               }
-                               var chr = this.indentChar;
-                               if ( this.HTML ) {
-                                       chr = chr.replace( /\t/g, "   " ).replace( / /g, "&nbsp;" );
-                               }
-                               return new Array( this._depth_ + (extra||0) ).join(chr);
-                       },
-                       up: function( a ) {
-                               this._depth_ += a || 1;
-                       },
-                       down: function( a ) {
-                               this._depth_ -= a || 1;
-                       },
-                       setParser: function( name, parser ) {
-                               this.parsers[name] = parser;
-                       },
-                       // The next 3 are exposed so you can use them
-                       quote: quote,
-                       literal: literal,
-                       join: join,
-                       //
-                       _depth_: 1,
-                       // This is the list of parsers, to modify them, use jsDump.setParser
-                       parsers: {
-                               window: "[Window]",
-                               document: "[Document]",
-                               error: function(error) {
-                                       return "Error(\"" + error.message + "\")";
-                               },
-                               unknown: "[Unknown]",
-                               "null": "null",
-                               "undefined": "undefined",
-                               "function": function( fn ) {
-                                       var ret = "function",
-                                               // functions never have name in IE
-                                               name = "name" in fn ? fn.name : (reName.exec(fn) || [])[1];
-
-                                       if ( name ) {
-                                               ret += " " + name;
-                                       }
-                                       ret += "( ";
-
-                                       ret = [ ret, QUnit.jsDump.parse( fn, "functionArgs" ), "){" ].join( "" );
-                                       return join( ret, QUnit.jsDump.parse(fn,"functionCode" ), "}" );
-                               },
-                               array: array,
-                               nodelist: array,
-                               "arguments": array,
-                               object: function( map, stack ) {
-                                       var ret = [ ], keys, key, val, i;
-                                       QUnit.jsDump.up();
-                                       keys = [];
-                                       for ( key in map ) {
-                                               keys.push( key );
-                                       }
-                                       keys.sort();
-                                       for ( i = 0; i < keys.length; i++ ) {
-                                               key = keys[ i ];
-                                               val = map[ key ];
-                                               ret.push( QUnit.jsDump.parse( key, "key" ) + ": " + QUnit.jsDump.parse( val, undefined, stack ) );
-                                       }
-                                       QUnit.jsDump.down();
-                                       return join( "{", ret, "}" );
-                               },
-                               node: function( node ) {
-                                       var len, i, val,
-                                               open = QUnit.jsDump.HTML ? "&lt;" : "<",
-                                               close = QUnit.jsDump.HTML ? "&gt;" : ">",
-                                               tag = node.nodeName.toLowerCase(),
-                                               ret = open + tag,
-                                               attrs = node.attributes;
-
-                                       if ( attrs ) {
-                                               for ( i = 0, len = attrs.length; i < len; i++ ) {
-                                                       val = attrs[i].nodeValue;
-                                                       // IE6 includes all attributes in .attributes, even ones not explicitly set.
-                                                       // Those have values like undefined, null, 0, false, "" or "inherit".
-                                                       if ( val && val !== "inherit" ) {
-                                                               ret += " " + attrs[i].nodeName + "=" + QUnit.jsDump.parse( val, "attribute" );
-                                                       }
-                                               }
-                                       }
-                                       ret += close;
-
-                                       // Show content of TextNode or CDATASection
-                                       if ( node.nodeType === 3 || node.nodeType === 4 ) {
-                                               ret += node.nodeValue;
-                                       }
-
-                                       return ret + open + "/" + tag + close;
-                               },
-                               // function calls it internally, it's the arguments part of the function
-                               functionArgs: function( fn ) {
-                                       var args,
-                                               l = fn.length;
-
-                                       if ( !l ) {
-                                               return "";
-                                       }
-
-                                       args = new Array(l);
-                                       while ( l-- ) {
-                                               // 97 is 'a'
-                                               args[l] = String.fromCharCode(97+l);
-                                       }
-                                       return " " + args.join( ", " ) + " ";
-                               },
-                               // object calls it internally, the key part of an item in a map
-                               key: quote,
-                               // function calls it internally, it's the content of the function
-                               functionCode: "[code]",
-                               // node calls it internally, it's an html attribute value
-                               attribute: quote,
-                               string: quote,
-                               date: quote,
-                               regexp: literal,
-                               number: literal,
-                               "boolean": literal
-                       },
-                       // if true, entities are escaped ( <, >, \t, space and \n )
-                       HTML: false,
-                       // indentation unit
-                       indentChar: "  ",
-                       // if true, items in a collection, are separated by a \n, else just a space.
-                       multiline: true
-               };
-
-       return jsDump;
-}());
-
-// from jquery.js
-function inArray( elem, array ) {
-       if ( array.indexOf ) {
-               return array.indexOf( elem );
-       }
-
-       for ( var i = 0, length = array.length; i < length; i++ ) {
-               if ( array[ i ] === elem ) {
-                       return i;
-               }
-       }
-
-       return -1;
-}
-
-/*
- * Javascript Diff Algorithm
- *  By John Resig (http://ejohn.org/)
- *  Modified by Chu Alan "sprite"
- *
- * Released under the MIT license.
- *
- * More Info:
- *  http://ejohn.org/projects/javascript-diff-algorithm/
- *
- * Usage: QUnit.diff(expected, actual)
- *
- * QUnit.diff( "the quick brown fox jumped over", "the quick fox jumps over" ) == "the  quick <del>brown </del> fox <del>jumped </del><ins>jumps </ins> over"
- */
-QUnit.diff = (function() {
-       /*jshint eqeqeq:false, eqnull:true */
-       function diff( o, n ) {
-               var i,
-                       ns = {},
-                       os = {};
-
-               for ( i = 0; i < n.length; i++ ) {
-                       if ( !hasOwn.call( ns, n[i] ) ) {
-                               ns[ n[i] ] = {
-                                       rows: [],
-                                       o: null
-                               };
-                       }
-                       ns[ n[i] ].rows.push( i );
-               }
-
-               for ( i = 0; i < o.length; i++ ) {
-                       if ( !hasOwn.call( os, o[i] ) ) {
-                               os[ o[i] ] = {
-                                       rows: [],
-                                       n: null
-                               };
-                       }
-                       os[ o[i] ].rows.push( i );
-               }
-
-               for ( i in ns ) {
-                       if ( !hasOwn.call( ns, i ) ) {
-                               continue;
-                       }
-                       if ( ns[i].rows.length === 1 && hasOwn.call( os, i ) && os[i].rows.length === 1 ) {
-                               n[ ns[i].rows[0] ] = {
-                                       text: n[ ns[i].rows[0] ],
-                                       row: os[i].rows[0]
-                               };
-                               o[ os[i].rows[0] ] = {
-                                       text: o[ os[i].rows[0] ],
-                                       row: ns[i].rows[0]
-                               };
-                       }
-               }
-
-               for ( i = 0; i < n.length - 1; i++ ) {
-                       if ( n[i].text != null && n[ i + 1 ].text == null && n[i].row + 1 < o.length && o[ n[i].row + 1 ].text == null &&
-                                               n[ i + 1 ] == o[ n[i].row + 1 ] ) {
-
-                               n[ i + 1 ] = {
-                                       text: n[ i + 1 ],
-                                       row: n[i].row + 1
-                               };
-                               o[ n[i].row + 1 ] = {
-                                       text: o[ n[i].row + 1 ],
-                                       row: i + 1
-                               };
-                       }
-               }
-
-               for ( i = n.length - 1; i > 0; i-- ) {
-                       if ( n[i].text != null && n[ i - 1 ].text == null && n[i].row > 0 && o[ n[i].row - 1 ].text == null &&
-                                               n[ i - 1 ] == o[ n[i].row - 1 ]) {
-
-                               n[ i - 1 ] = {
-                                       text: n[ i - 1 ],
-                                       row: n[i].row - 1
-                               };
-                               o[ n[i].row - 1 ] = {
-                                       text: o[ n[i].row - 1 ],
-                                       row: i - 1
-                               };
-                       }
-               }
-
-               return {
-                       o: o,
-                       n: n
-               };
-       }
-
-       return function( o, n ) {
-               o = o.replace( /\s+$/, "" );
-               n = n.replace( /\s+$/, "" );
-
-               var i, pre,
-                       str = "",
-                       out = diff( o === "" ? [] : o.split(/\s+/), n === "" ? [] : n.split(/\s+/) ),
-                       oSpace = o.match(/\s+/g),
-                       nSpace = n.match(/\s+/g);
-
-               if ( oSpace == null ) {
-                       oSpace = [ " " ];
-               }
-               else {
-                       oSpace.push( " " );
-               }
-
-               if ( nSpace == null ) {
-                       nSpace = [ " " ];
-               }
-               else {
-                       nSpace.push( " " );
-               }
-
-               if ( out.n.length === 0 ) {
-                       for ( i = 0; i < out.o.length; i++ ) {
-                               str += "<del>" + out.o[i] + oSpace[i] + "</del>";
-                       }
-               }
-               else {
-                       if ( out.n[0].text == null ) {
-                               for ( n = 0; n < out.o.length && out.o[n].text == null; n++ ) {
-                                       str += "<del>" + out.o[n] + oSpace[n] + "</del>";
-                               }
-                       }
-
-                       for ( i = 0; i < out.n.length; i++ ) {
-                               if (out.n[i].text == null) {
-                                       str += "<ins>" + out.n[i] + nSpace[i] + "</ins>";
-                               }
-                               else {
-                                       // `pre` initialized at top of scope
-                                       pre = "";
-
-                                       for ( n = out.n[i].row + 1; n < out.o.length && out.o[n].text == null; n++ ) {
-                                               pre += "<del>" + out.o[n] + oSpace[n] + "</del>";
-                                       }
-                                       str += " " + out.n[i].text + nSpace[i] + pre;
-                               }
-                       }
-               }
-
-               return str;
-       };
-}());
-
-// for CommonJS enviroments, export everything
-if ( typeof exports !== "undefined" ) {
-       extend( exports, QUnit );
-}
-
-// get at whatever the global object is, like window in browsers
-}( (function() {return this;}.call()) ));
diff --git a/resources/jquery/jquery.spinner.css b/resources/jquery/jquery.spinner.css
deleted file mode 100644 (file)
index a9e06db..0000000
+++ /dev/null
@@ -1,40 +0,0 @@
-.mw-spinner {
-       background-color: transparent;
-       background-position: center center;
-       background-repeat: no-repeat;
-}
-
-.mw-spinner-small {
-       /* @embed */
-       background-image: url(images/spinner.gif);
-       height: 20px;
-       width: 20px;
-       /* Avoid issues with .mw-spinner-block when floated without width. */
-       min-width: 20px;
-}
-
-.mw-spinner-large {
-       /* @embed */
-       background-image: url(images/spinner-large.gif);
-       height: 32px;
-       width: 32px;
-       /* Avoid issues with .mw-spinner-block when floated without width. */
-       min-width: 32px;
-}
-
-.mw-spinner-block {
-       display: block;
-       /* This overrides width from .mw-spinner-large / .mw-spinner-small,
-        * This is where the min-width kicks in.
-        */
-       width: 100%;
-}
-
-.mw-spinner-inline {
-       display: inline-block;
-       vertical-align: middle;
-
-       /* IE < 8 */
-       zoom: 1;
-       *display: inline;
-}
diff --git a/resources/jquery/jquery.spinner.js b/resources/jquery/jquery.spinner.js
deleted file mode 100644 (file)
index 073fb3d..0000000
+++ /dev/null
@@ -1,112 +0,0 @@
-/**
- * jQuery Spinner
- *
- * Simple jQuery plugin to create, inject and remove spinners.
- *
- * @class jQuery.plugin.spinner
- */
-( function ( $ ) {
-
-       // Default options for new spinners,
-       // stored outside the function to share between calls.
-       var defaults = {
-               id: undefined,
-               size: 'small',
-               type: 'inline'
-       };
-
-       $.extend({
-               /**
-                * Create a spinner element
-                *
-                * The argument is an object with options used to construct the spinner (see below).
-                *
-                * It is a good practice to keep a reference to the created spinner to be able to remove it
-                * later. Alternatively, one can use the 'id' option and #removeSpinner (but make sure to choose
-                * an id that's unlikely to cause conflicts, e.g. with extensions, gadgets or user scripts).
-                *
-                * CSS classes used:
-                *
-                * - .mw-spinner for every spinner
-                * - .mw-spinner-small / .mw-spinner-large for size
-                * - .mw-spinner-block / .mw-spinner-inline for display types
-                *
-                * Example:
-                *
-                *     // Create a large spinner reserving all available horizontal space.
-                *     var $spinner = $.createSpinner({ size: 'large', type: 'block' });
-                *     // Insert above page content.
-                *     $( '#mw-content-text' ).prepend( $spinner );
-                *
-                *     // Place a small inline spinner next to the "Save" button
-                *     var $spinner = $.createSpinner({ size: 'small', type: 'inline' });
-                *     // Alternatively, just `$.createSpinner();` as these are the default options.
-                *     $( '#wpSave' ).after( $spinner );
-                *
-                *     // The following two are equivalent:
-                *     $.createSpinner( 'magic' );
-                *     $.createSpinner({ id: 'magic' });
-                *
-                * @static
-                * @inheritable
-                * @param {Object|string} [opts] Options. If a string is given, it will be treated as the value
-                *   of the `id` option. If an object is given, the possible option keys are:
-                * @param {string} [opts.id] If given, spinner will be given an id of "mw-spinner-{id}".
-                * @param {string} [opts.size='small'] 'small' or 'large' for a 20-pixel or 32-pixel spinner.
-                * @param {string} [opts.type='inline'] 'inline' or 'block'. Inline creates an inline-block with
-                *   width and height equal to spinner size. Block is a block-level element with width 100%,
-                *   height equal to spinner size.
-                * @return {jQuery}
-                */
-               createSpinner: function ( opts ) {
-                       if ( opts !== undefined && $.type( opts ) !== 'object' ) {
-                               opts = {
-                                       id: opts
-                               };
-                       }
-
-                       opts = $.extend( {}, defaults, opts );
-
-                       var $spinner = $( '<div>', { 'class': 'mw-spinner', 'title': '...' } );
-                       if ( opts.id !== undefined ) {
-                               $spinner.attr( 'id', 'mw-spinner-' + opts.id );
-                       }
-
-                       $spinner.addClass( opts.size === 'large' ? 'mw-spinner-large' : 'mw-spinner-small' );
-                       $spinner.addClass( opts.type === 'block' ? 'mw-spinner-block' : 'mw-spinner-inline' );
-
-                       return $spinner;
-               },
-
-               /**
-                * Remove a spinner element
-                *
-                * @static
-                * @inheritable
-                * @param {string} id Id of the spinner, as passed to #createSpinner
-                * @return {jQuery} The (now detached) spinner element
-                */
-               removeSpinner: function ( id ) {
-                       return $( '#mw-spinner-' + id ).remove();
-               }
-       });
-
-       /**
-        * Inject a spinner after each element in the collection
-        *
-        * Inserts spinner as siblings (not children) of the target elements.
-        * Collection contents remain unchanged.
-        *
-        * @param {Object|string} [opts] See #createSpinner
-        * @return {jQuery}
-        */
-       $.fn.injectSpinner = function ( opts ) {
-               return this.after( $.createSpinner( opts ) );
-       };
-
-       /**
-        * @class jQuery
-        * @mixins jQuery.plugin.spinner
-        */
-
-}( jQuery ) );
diff --git a/resources/jquery/jquery.suggestions.css b/resources/jquery/jquery.suggestions.css
deleted file mode 100644 (file)
index e0ba647..0000000
+++ /dev/null
@@ -1,77 +0,0 @@
-/* suggestions plugin */
-
-.suggestions {
-       overflow: hidden;
-       position: absolute;
-       top: 0;
-       left: 0;
-       width: 0;
-       border: none;
-       z-index: 1099;
-       padding: 0;
-       margin: -1px -1px 0 0;
-}
-
-/* IGNORED BY IE6 */
-html > body .suggestions {
-       margin: -1px 0 0 0;
-}
-
-.suggestions-special {
-       position: relative;
-       background-color: white;
-       cursor: pointer;
-       border: solid 1px #aaaaaa;
-       padding: 0;
-       margin: 0;
-       margin-top: -2px;
-       display: none;
-       padding: 0.25em 0.25em;
-       line-height: 1.25em;
-}
-
-.suggestions-results {
-       background-color: white;
-       cursor: pointer;
-       border: solid 1px #aaaaaa;
-       padding: 0;
-       margin: 0;
-}
-
-.suggestions-result {
-       color: black;
-       margin: 0;
-       line-height: 1.5em;
-       padding: 0.01em 0.25em;
-       text-align: left;
-}
-
-.suggestions-result-current {
-       background-color: #4C59A6;
-       color: white;
-}
-
-.suggestions-special .special-label {
-       color: gray;
-       text-align: left;
-}
-
-.suggestions-special .special-query {
-       color: black;
-       font-style: italic;
-       text-align: left;
-}
-
-.suggestions-special .special-hover {
-       background-color: silver;
-}
-
-.suggestions-result-current .special-label,
-.suggestions-result-current .special-query {
-       color: white;
-}
-
-.autoellipsis-matched,
-.highlight {
-       font-weight: bold;
-}
diff --git a/resources/jquery/jquery.suggestions.js b/resources/jquery/jquery.suggestions.js
deleted file mode 100644 (file)
index f9a225f..0000000
+++ /dev/null
@@ -1,629 +0,0 @@
-/**
- * This plugin provides a generic way to add suggestions to a text box.
- *
- * Usage:
- *
- * Set options:
- *             $( '#textbox' ).suggestions( { option1: value1, option2: value2 } );
- *             $( '#textbox' ).suggestions( option, value );
- * Get option:
- *             value = $( '#textbox' ).suggestions( option );
- * Initialize:
- *             $( '#textbox' ).suggestions();
- *
- * Options:
- *
- * fetch(query): Callback that should fetch suggestions and set the suggestions property.
- *      Executed in the context of the textbox
- *             Type: Function
- * cancel: Callback function to call when any pending asynchronous suggestions fetches
- *      should be canceled. Executed in the context of the textbox
- *             Type: Function
- * special: Set of callbacks for rendering and selecting
- *             Type: Object of Functions 'render' and 'select'
- * result: Set of callbacks for rendering and selecting
- *             Type: Object of Functions 'render' and 'select'
- * $region: jQuery selection of element to place the suggestions below and match width of
- *             Type: jQuery Object, Default: $(this)
- * suggestions: Suggestions to display
- *             Type: Array of strings
- * maxRows: Maximum number of suggestions to display at one time
- *             Type: Number, Range: 1 - 100, Default: 7
- * delay: Number of ms to wait for the user to stop typing
- *             Type: Number, Range: 0 - 1200, Default: 120
- * submitOnClick: Whether to submit the form containing the textbox when a suggestion is clicked
- *             Type: Boolean, Default: false
- * maxExpandFactor: Maximum suggestions box width relative to the textbox width. If set
- *      to e.g. 2, the suggestions box will never be grown beyond 2 times the width of the textbox.
- *             Type: Number, Range: 1 - infinity, Default: 3
- * expandFrom: Which direction to offset the suggestion box from.
- *      Values 'start' and 'end' translate to left and right respectively depending on the
- *      directionality of the current document, according to $( 'html' ).css( 'direction' ).
- *      Type: String, default: 'auto', options: 'left', 'right', 'start', 'end', 'auto'.
- * positionFromLeft: Sets expandFrom=left, for backwards compatibility
- *             Type: Boolean, Default: true
- * highlightInput: Whether to hightlight matched portions of the input or not
- *             Type: Boolean, Default: false
- */
-( function ( $ ) {
-
-$.suggestions = {
-       /**
-        * Cancel any delayed maybeFetch() call and callback the context so
-        * they can cancel any async fetching if they use AJAX or something.
-        */
-       cancel: function ( context ) {
-               if ( context.data.timerID !== null ) {
-                       clearTimeout( context.data.timerID );
-               }
-               if ( $.isFunction( context.config.cancel ) ) {
-                       context.config.cancel.call( context.data.$textbox );
-               }
-       },
-
-       /**
-        * Hide the element with suggestions and clean up some state.
-        */
-       hide: function ( context ) {
-               // Remove any highlights, including on "special" items
-               context.data.$container.find( '.suggestions-result-current' ).removeClass( 'suggestions-result-current' );
-               // Hide the container
-               context.data.$container.hide();
-       },
-
-       /**
-        * Restore the text the user originally typed in the textbox, before it
-        * was overwritten by highlight(). This restores the value the currently
-        * displayed suggestions are based on, rather than the value just before
-        * highlight() overwrote it; the former is arguably slightly more sensible.
-        */
-       restore: function ( context ) {
-               context.data.$textbox.val( context.data.prevText );
-       },
-
-       /**
-        * Ask the user-specified callback for new suggestions. Any previous delayed
-        * call to this function still pending will be canceled. If the value in the
-        * textbox is empty or hasn't changed since the last time suggestions were fetched,
-        * this function does nothing.
-        * @param {Boolean} delayed Whether or not to delay this by the currently configured amount of time
-        */
-       update: function ( context, delayed ) {
-               // Only fetch if the value in the textbox changed and is not empty, or if the results were hidden
-               // if the textbox is empty then clear the result div, but leave other settings intouched
-               function maybeFetch() {
-                       if ( context.data.$textbox.val().length === 0 ) {
-                               $.suggestions.hide( context );
-                               context.data.prevText = '';
-                       } else if (
-                               context.data.$textbox.val() !== context.data.prevText ||
-                               !context.data.$container.is( ':visible' )
-                       ) {
-                               if ( typeof context.config.fetch === 'function' ) {
-                                       context.data.prevText = context.data.$textbox.val();
-                                       context.config.fetch.call( context.data.$textbox, context.data.$textbox.val() );
-                               }
-                       }
-               }
-
-               // Cancels any delayed maybeFetch call, and invokes context.config.cancel.
-               $.suggestions.cancel( context );
-
-               if ( delayed ) {
-                       // To avoid many started/aborted requests while typing, we're gonna take a short
-                       // break before trying to fetch data.
-                       context.data.timerID = setTimeout( maybeFetch, context.config.delay );
-               } else {
-                       maybeFetch();
-               }
-               $.suggestions.special( context );
-       },
-
-       special: function ( context ) {
-               // Allow custom rendering - but otherwise don't do any rendering
-               if ( typeof context.config.special.render === 'function' ) {
-                       // Wait for the browser to update the value
-                       setTimeout( function () {
-                               // Render special
-                               var $special = context.data.$container.find( '.suggestions-special' );
-                               context.config.special.render.call( $special, context.data.$textbox.val(), context );
-                       }, 1 );
-               }
-       },
-
-       /**
-        * Sets the value of a property, and updates the widget accordingly
-        * @param property String Name of property
-        * @param value Mixed Value to set property with
-        */
-       configure: function ( context, property, value ) {
-               var newCSS,
-                       $autoEllipseMe, $result, $results, childrenWidth,
-                       i, expWidth, matchedText, maxWidth, text;
-
-               // Validate creation using fallback values
-               switch ( property ) {
-                       case 'fetch':
-                       case 'cancel':
-                       case 'special':
-                       case 'result':
-                       case '$region':
-                       case 'expandFrom':
-                               context.config[property] = value;
-                               break;
-                       case 'suggestions':
-                               context.config[property] = value;
-                               // Update suggestions
-                               if ( context.data !== undefined ) {
-                                       if ( context.data.$textbox.val().length === 0 ) {
-                                               // Hide the div when no suggestion exist
-                                               $.suggestions.hide( context );
-                                       } else {
-                                               // Rebuild the suggestions list
-                                               context.data.$container.show();
-                                               // Update the size and position of the list
-                                               newCSS = {
-                                                       top: context.config.$region.offset().top + context.config.$region.outerHeight(),
-                                                       bottom: 'auto',
-                                                       width: context.config.$region.outerWidth(),
-                                                       height: 'auto'
-                                               };
-
-                                               // Process expandFrom, after this it is set to left or right.
-                                               context.config.expandFrom = ( function ( expandFrom ) {
-                                                       var regionWidth, docWidth, regionCenter, docCenter,
-                                                               docDir = $( document.documentElement ).css( 'direction' ),
-                                                               $region = context.config.$region;
-
-                                                       // Backwards compatible
-                                                       if ( context.config.positionFromLeft ) {
-                                                               expandFrom = 'left';
-
-                                                       // Catch invalid values, default to 'auto'
-                                                       } else if ( $.inArray( expandFrom, ['left', 'right', 'start', 'end', 'auto'] ) === -1 ) {
-                                                               expandFrom = 'auto';
-                                                       }
-
-                                                       if ( expandFrom === 'auto' ) {
-                                                               if ( $region.data( 'searchsuggest-expand-dir' ) ) {
-                                                                       // If the markup explicitly contains a direction, use it.
-                                                                       expandFrom = $region.data( 'searchsuggest-expand-dir' );
-                                                               } else {
-                                                                       regionWidth = $region.outerWidth();
-                                                                       docWidth = $( document ).width();
-                                                                       if ( ( regionWidth / docWidth  ) > 0.85 ) {
-                                                                               // If the input size takes up more than 85% of the document horizontally
-                                                                               // expand the suggestions to the writing direction's native end.
-                                                                               expandFrom = 'start';
-                                                                       } else {
-                                                                               // Calculate the center points of the input and document
-                                                                               regionCenter = $region.offset().left + regionWidth / 2;
-                                                                               docCenter = docWidth / 2;
-                                                                               if ( Math.abs( regionCenter - docCenter ) / docCenter < 0.10 ) {
-                                                                                       // If the input's center is within 10% of the document center
-                                                                                       // use the writing direction's native end.
-                                                                                       expandFrom = 'start';
-                                                                               } else {
-                                                                                       // Otherwise expand the input from the closest side of the page,
-                                                                                       // towards the side of the page with the most free open space
-                                                                                       expandFrom = regionCenter > docCenter ? 'right' : 'left';
-                                                                               }
-                                                                       }
-                                                               }
-                                                       }
-
-                                                       if ( expandFrom === 'start' ) {
-                                                               expandFrom = docDir === 'rtl' ? 'right': 'left';
-
-                                                       } else if ( expandFrom === 'end' ) {
-                                                               expandFrom = docDir === 'rtl' ? 'left': 'right';
-                                                       }
-
-                                                       return expandFrom;
-
-                                               }( context.config.expandFrom ) );
-
-                                               if ( context.config.expandFrom === 'left' ) {
-                                                       // Expand from left
-                                                       newCSS.left = context.config.$region.offset().left;
-                                                       newCSS.right = 'auto';
-                                               } else {
-                                                       // Expand from right
-                                                       newCSS.left = 'auto';
-                                                       newCSS.right = $( document ).width() - ( context.config.$region.offset().left + context.config.$region.outerWidth() );
-                                               }
-
-                                               context.data.$container.css( newCSS );
-                                               $results = context.data.$container.children( '.suggestions-results' );
-                                               $results.empty();
-                                               expWidth = -1;
-                                               $autoEllipseMe = $( [] );
-                                               matchedText = null;
-                                               for ( i = 0; i < context.config.suggestions.length; i++ ) {
-                                                       /*jshint loopfunc:true */
-                                                       text = context.config.suggestions[i];
-                                                       $result = $( '<div>' )
-                                                               .addClass( 'suggestions-result' )
-                                                               .attr( 'rel', i )
-                                                               .data( 'text', context.config.suggestions[i] )
-                                                               .mousemove( function () {
-                                                                       context.data.selectedWithMouse = true;
-                                                                       $.suggestions.highlight(
-                                                                               context,
-                                                                               $(this).closest( '.suggestions-results .suggestions-result' ),
-                                                                               false
-                                                                       );
-                                                               } )
-                                                               .appendTo( $results );
-                                                       // Allow custom rendering
-                                                       if ( typeof context.config.result.render === 'function' ) {
-                                                               context.config.result.render.call( $result, context.config.suggestions[i], context );
-                                                       } else {
-                                                               // Add <span> with text
-                                                               $result.append( $( '<span>' )
-                                                                               .css( 'whiteSpace', 'nowrap' )
-                                                                               .text( text )
-                                                                       );
-                                                       }
-
-                                                       if ( context.config.highlightInput ) {
-                                                               matchedText = context.data.prevText;
-                                                       }
-
-                                                       // Widen results box if needed
-                                                       // New width is only calculated here, applied later
-                                                       childrenWidth = $result.children().outerWidth();
-                                                       if ( childrenWidth > $result.width() && childrenWidth > expWidth ) {
-                                                               // factor in any padding, margin, or border space on the parent
-                                                               expWidth = childrenWidth + ( context.data.$container.width() - $result.width() );
-                                                       }
-                                                       $autoEllipseMe = $autoEllipseMe.add( $result );
-                                               }
-                                               // Apply new width for results box, if any
-                                               if ( expWidth > context.data.$container.width() ) {
-                                                       maxWidth = context.config.maxExpandFactor * context.data.$textbox.width();
-                                                       context.data.$container.width( Math.min( expWidth, maxWidth ) );
-                                               }
-                                               // autoEllipse the results. Has to be done after changing the width
-                                               $autoEllipseMe.autoEllipsis( {
-                                                       hasSpan: true,
-                                                       tooltip: true,
-                                                       matchText: matchedText
-                                               } );
-                                       }
-                               }
-                               break;
-                       case 'maxRows':
-                               context.config[property] = Math.max( 1, Math.min( 100, value ) );
-                               break;
-                       case 'delay':
-                               context.config[property] = Math.max( 0, Math.min( 1200, value ) );
-                               break;
-                       case 'maxExpandFactor':
-                               context.config[property] = Math.max( 1, value );
-                               break;
-                       case 'submitOnClick':
-                       case 'positionFromLeft':
-                       case 'highlightInput':
-                               context.config[property] = value ? true : false;
-                               break;
-               }
-       },
-
-       /**
-        * Highlight a result in the results table
-        * @param result <tr> to highlight: jQuery object, or 'prev' or 'next'
-        * @param updateTextbox If true, put the suggestion in the textbox
-        */
-       highlight: function ( context, result, updateTextbox ) {
-               var selected = context.data.$container.find( '.suggestions-result-current' );
-               if ( !result.get || selected.get( 0 ) !== result.get( 0 ) ) {
-                       if ( result === 'prev' ) {
-                               if( selected.hasClass( 'suggestions-special' ) ) {
-                                       result = context.data.$container.find( '.suggestions-result:last' );
-                               } else {
-                                       result = selected.prev();
-                                       if ( !( result.length && result.hasClass( 'suggestions-result' ) ) ) {
-                                               // there is something in the DOM between selected element and the wrapper, bypass it
-                                               result = selected.parents( '.suggestions-results > *' ).prev().find( '.suggestions-result' ).eq(0);
-                                       }
-
-                                       if ( selected.length === 0 ) {
-                                               // we are at the beginning, so lets jump to the last item
-                                               if ( context.data.$container.find( '.suggestions-special' ).html() !== '' ) {
-                                                       result = context.data.$container.find( '.suggestions-special' );
-                                               } else {
-                                                       result = context.data.$container.find( '.suggestions-results .suggestions-result:last' );
-                                               }
-                                       }
-                               }
-                       } else if ( result === 'next' ) {
-                               if ( selected.length === 0 ) {
-                                       // No item selected, go to the first one
-                                       result = context.data.$container.find( '.suggestions-results .suggestions-result:first' );
-                                       if ( result.length === 0 && context.data.$container.find( '.suggestions-special' ).html() !== '' ) {
-                                               // No suggestion exists, go to the special one directly
-                                               result = context.data.$container.find( '.suggestions-special' );
-                                       }
-                               } else {
-                                       result = selected.next();
-                                       if ( !( result.length && result.hasClass( 'suggestions-result' ) ) ) {
-                                               // there is something in the DOM between selected element and the wrapper, bypass it
-                                               result = selected.parents( '.suggestions-results > *' ).next().find( '.suggestions-result' ).eq(0);
-                                       }
-
-                                       if ( selected.hasClass( 'suggestions-special' ) ) {
-                                               result = $( [] );
-                                       } else if (
-                                               result.length === 0 &&
-                                               context.data.$container.find( '.suggestions-special' ).html() !== ''
-                                       ) {
-                                               // We were at the last item, jump to the specials!
-                                               result = context.data.$container.find( '.suggestions-special' );
-                                       }
-                               }
-                       }
-                       selected.removeClass( 'suggestions-result-current' );
-                       result.addClass( 'suggestions-result-current' );
-               }
-               if ( updateTextbox ) {
-                       if ( result.length === 0 || result.is( '.suggestions-special' ) ) {
-                               $.suggestions.restore( context );
-                       } else {
-                               context.data.$textbox.val( result.data( 'text' ) );
-                               // .val() doesn't call any event handlers, so
-                               // let the world know what happened
-                               context.data.$textbox.change();
-                       }
-                       context.data.$textbox.trigger( 'change' );
-               }
-       },
-
-       /**
-        * Respond to keypress event
-        * @param key Integer Code of key pressed
-        */
-       keypress: function ( e, context, key ) {
-               var selected,
-                       wasVisible = context.data.$container.is( ':visible' ),
-                       preventDefault = false;
-
-               switch ( key ) {
-                       // Arrow down
-                       case 40:
-                               if ( wasVisible ) {
-                                       $.suggestions.highlight( context, 'next', true );
-                                       context.data.selectedWithMouse = false;
-                               } else {
-                                       $.suggestions.update( context, false );
-                               }
-                               preventDefault = true;
-                               break;
-                       // Arrow up
-                       case 38:
-                               if ( wasVisible ) {
-                                       $.suggestions.highlight( context, 'prev', true );
-                                       context.data.selectedWithMouse = false;
-                               }
-                               preventDefault = wasVisible;
-                               break;
-                       // Escape
-                       case 27:
-                               $.suggestions.hide( context );
-                               $.suggestions.restore( context );
-                               $.suggestions.cancel( context );
-                               context.data.$textbox.trigger( 'change' );
-                               preventDefault = wasVisible;
-                               break;
-                       // Enter
-                       case 13:
-                               preventDefault = wasVisible;
-                               selected = context.data.$container.find( '.suggestions-result-current' );
-                               $.suggestions.hide( context );
-                               if ( selected.length === 0 || context.data.selectedWithMouse ) {
-                                       // If nothing is selected or if something was selected with the mouse
-                                       // cancel any current requests and allow the form to be submitted
-                                       // (simply don't prevent default behavior).
-                                       $.suggestions.cancel( context );
-                                       preventDefault = false;
-                               } else if ( selected.is( '.suggestions-special' ) ) {
-                                       if ( typeof context.config.special.select === 'function' ) {
-                                               // Allow the callback to decide whether to prevent default or not
-                                               if ( context.config.special.select.call( selected, context.data.$textbox ) === true ) {
-                                                       preventDefault = false;
-                                               }
-                                       }
-                               } else {
-                                       $.suggestions.highlight( context, selected, true );
-
-                                       if ( typeof context.config.result.select === 'function' ) {
-                                               // Allow the callback to decide whether to prevent default or not
-                                               if ( context.config.result.select.call( selected, context.data.$textbox ) === true ) {
-                                                       preventDefault = false;
-                                               }
-                                       }
-                               }
-                               break;
-                       default:
-                               $.suggestions.update( context, true );
-                               break;
-               }
-               if ( preventDefault ) {
-                       e.preventDefault();
-                       e.stopPropagation();
-               }
-       }
-};
-$.fn.suggestions = function () {
-
-       // Multi-context fields
-       var returnValue,
-               args = arguments;
-
-       $(this).each( function () {
-               var context, key;
-
-               /* Construction / Loading */
-
-               context = $(this).data( 'suggestions-context' );
-               if ( context === undefined || context === null ) {
-                       context = {
-                               config: {
-                                       fetch: function () {},
-                                       cancel: function () {},
-                                       special: {},
-                                       result: {},
-                                       $region: $(this),
-                                       suggestions: [],
-                                       maxRows: 7,
-                                       delay: 120,
-                                       submitOnClick: false,
-                                       maxExpandFactor: 3,
-                                       expandFrom: 'auto',
-                                       highlightInput: false
-                               }
-                       };
-               }
-
-               /* API */
-
-               // Handle various calling styles
-               if ( args.length > 0 ) {
-                       if ( typeof args[0] === 'object' ) {
-                               // Apply set of properties
-                               for ( key in args[0] ) {
-                                       $.suggestions.configure( context, key, args[0][key] );
-                               }
-                       } else if ( typeof args[0] === 'string' ) {
-                               if ( args.length > 1 ) {
-                                       // Set property values
-                                       $.suggestions.configure( context, args[0], args[1] );
-                               } else if ( returnValue === null || returnValue === undefined ) {
-                                       // Get property values, but don't give access to internal data - returns only the first
-                                       returnValue = ( args[0] in context.config ? undefined : context.config[args[0]] );
-                               }
-                       }
-               }
-
-               /* Initialization */
-
-               if ( context.data === undefined ) {
-                       context.data = {
-                               // ID of running timer
-                               timerID: null,
-
-                               // Text in textbox when suggestions were last fetched
-                               prevText: null,
-
-                               // Number of results visible without scrolling
-                               visibleResults: 0,
-
-                               // Suggestion the last mousedown event occured on
-                               mouseDownOn: $( [] ),
-                               $textbox: $(this),
-                               selectedWithMouse: false
-                       };
-
-                       context.data.$container = $( '<div>' )
-                               .css( 'display', 'none' )
-                               .addClass( 'suggestions' )
-                               .append(
-                                       $( '<div>' ).addClass( 'suggestions-results' )
-                                               // Can't use click() because the container div is hidden when the
-                                               // textbox loses focus. Instead, listen for a mousedown followed
-                                               // by a mouseup on the same div.
-                                               .mousedown( function ( e ) {
-                                                       context.data.mouseDownOn = $( e.target ).closest( '.suggestions-results .suggestions-result' );
-                                               } )
-                                               .mouseup( function ( e ) {
-                                                       var $result = $( e.target ).closest( '.suggestions-results .suggestions-result' ),
-                                                               $other = context.data.mouseDownOn;
-
-                                                       context.data.mouseDownOn = $( [] );
-                                                       if ( $result.get( 0 ) !== $other.get( 0 ) ) {
-                                                               return;
-                                                       }
-                                                       // do not interfere with non-left clicks or if modifier keys are pressed (e.g. ctrl-click)
-                                                       if ( !( e.which !== 1 || e.altKey || e.ctrlKey || e.shiftKey || e.metaKey ) ) {
-                                                               $.suggestions.highlight( context, $result, true );
-                                                               $.suggestions.hide( context );
-                                                               if ( typeof context.config.result.select === 'function' ) {
-                                                                       context.config.result.select.call( $result, context.data.$textbox );
-                                                               }
-                                                       }
-                                                       // but still restore focus to the textbox, so that the suggestions will be hidden properly
-                                                       context.data.$textbox.focus();
-                                               } )
-                               )
-                               .append(
-                                       $( '<div>' ).addClass( 'suggestions-special' )
-                                               // Can't use click() because the container div is hidden when the
-                                               // textbox loses focus. Instead, listen for a mousedown followed
-                                               // by a mouseup on the same div.
-                                               .mousedown( function ( e ) {
-                                                       context.data.mouseDownOn = $( e.target ).closest( '.suggestions-special' );
-                                               } )
-                                               .mouseup( function ( e ) {
-                                                       var $special = $( e.target ).closest( '.suggestions-special' ),
-                                                               $other = context.data.mouseDownOn;
-
-                                                       context.data.mouseDownOn = $( [] );
-                                                       if ( $special.get( 0 ) !== $other.get( 0 ) ) {
-                                                               return;
-                                                       }
-                                                       // do not interfere with non-left clicks or if modifier keys are pressed (e.g. ctrl-click)
-                                                       if ( !( e.which !== 1 || e.altKey || e.ctrlKey || e.shiftKey || e.metaKey ) ) {
-                                                               $.suggestions.hide( context );
-                                                               if ( typeof context.config.special.select === 'function' ) {
-                                                                       context.config.special.select.call( $special, context.data.$textbox );
-                                                               }
-                                                       }
-                                                       // but still restore focus to the textbox, so that the suggestions will be hidden properly
-                                                       context.data.$textbox.focus();
-                                               } )
-                                               .mousemove( function ( e ) {
-                                                       context.data.selectedWithMouse = true;
-                                                       $.suggestions.highlight(
-                                                               context, $( e.target ).closest( '.suggestions-special' ), false
-                                                       );
-                                               } )
-                               )
-                               .appendTo( $( 'body' ) );
-
-                       $(this)
-                               // Stop browser autocomplete from interfering
-                               .attr( 'autocomplete', 'off')
-                               .keydown( function ( e ) {
-                                       // Store key pressed to handle later
-                                       context.data.keypressed = e.which;
-                                       context.data.keypressedCount = 0;
-                               } )
-                               .keypress( function ( e ) {
-                                       context.data.keypressedCount++;
-                                       $.suggestions.keypress( e, context, context.data.keypressed );
-                               } )
-                               .keyup( function ( e ) {
-                                       // Some browsers won't throw keypress() for arrow keys. If we got a keydown and a keyup without a
-                                       // keypress in between, solve it
-                                       if ( context.data.keypressedCount === 0 ) {
-                                               $.suggestions.keypress( e, context, context.data.keypressed );
-                                       }
-                               } )
-                               .blur( function () {
-                                       // When losing focus because of a mousedown
-                                       // on a suggestion, don't hide the suggestions
-                                       if ( context.data.mouseDownOn.length > 0 ) {
-                                               return;
-                                       }
-                                       $.suggestions.hide( context );
-                                       $.suggestions.cancel( context );
-                               } );
-               }
-
-               // Store the context for next time
-               $(this).data( 'suggestions-context', context );
-       } );
-       return returnValue !== undefined ? returnValue : $(this);
-};
-
-}( jQuery ) );
diff --git a/resources/jquery/jquery.tabIndex.js b/resources/jquery/jquery.tabIndex.js
deleted file mode 100644 (file)
index cdae0ba..0000000
+++ /dev/null
@@ -1,52 +0,0 @@
-/**
- * jQuery tabIndex
- */
-( function ( $ ) {
-
-       /**
-        * Finds the lowerst tabindex in use within a selection
-        *
-        * @return number Lowest tabindex on the page
-        */
-       $.fn.firstTabIndex = function () {
-               var minTabIndex = null;
-               $(this).find( '[tabindex]' ).each( function () {
-                       var tabIndex = parseInt( $(this).prop( 'tabindex' ), 10 );
-                       // In IE6/IE7 the above jQuery selector returns all elements,
-                       // becuase it has a default value for tabIndex in IE6/IE7 of 0
-                       // (rather than null/undefined). Therefore check "> 0" as well.
-                       // Under IE7 under Windows NT 5.2 is also capable of returning NaN.
-                       if ( tabIndex > 0 && !isNaN( tabIndex ) ) {
-                               // Initial value
-                               if ( minTabIndex === null ) {
-                                       minTabIndex = tabIndex;
-                               } else if ( tabIndex < minTabIndex ) {
-                                       minTabIndex = tabIndex;
-                               }
-                       }
-               } );
-               return minTabIndex;
-       };
-
-       /**
-        * Finds the highest tabindex in use within a selection
-        *
-        * @return number Highest tabindex on the page
-        */
-       $.fn.lastTabIndex = function () {
-               var maxTabIndex = null;
-               $(this).find( '[tabindex]' ).each( function () {
-                       var tabIndex = parseInt( $(this).prop( 'tabindex' ), 10 );
-                       if ( tabIndex > 0 && !isNaN( tabIndex ) ) {
-                               // Initial value
-                               if ( maxTabIndex === null ) {
-                                       maxTabIndex = tabIndex;
-                               } else if ( tabIndex > maxTabIndex ) {
-                                       maxTabIndex = tabIndex;
-                               }
-                       }
-               } );
-               return maxTabIndex;
-       };
-
-}( jQuery ) );
diff --git a/resources/jquery/jquery.tablesorter.css b/resources/jquery/jquery.tablesorter.css
deleted file mode 100644 (file)
index a88acc0..0000000
+++ /dev/null
@@ -1,17 +0,0 @@
-/* Table Sorting */
-table.jquery-tablesorter th.headerSort {
-       /* @embed */
-       background-image: url(images/sort_both.gif);
-       cursor: pointer;
-       background-repeat: no-repeat;
-       background-position: center right;
-       padding-right: 21px;
-}
-table.jquery-tablesorter th.headerSortUp {
-       /* @embed */
-       background-image: url(images/sort_up.gif);
-}
-table.jquery-tablesorter th.headerSortDown {
-       /* @embed */
-       background-image: url(images/sort_down.gif);
-}
diff --git a/resources/jquery/jquery.tablesorter.js b/resources/jquery/jquery.tablesorter.js
deleted file mode 100644 (file)
index af0d897..0000000
+++ /dev/null
@@ -1,1154 +0,0 @@
-/**
- * TableSorter for MediaWiki
- *
- * Written 2011 Leo Koppelkamm
- * Based on tablesorter.com plugin, written (c) 2007 Christian Bach.
- *
- * Dual licensed under the MIT and GPL licenses:
- * http://www.opensource.org/licenses/mit-license.php
- * http://www.gnu.org/licenses/gpl.html
- *
- * Depends on mw.config (wgDigitTransformTable, wgDefaultDateFormat, wgContentLanguage)
- * and mw.language.months.
- *
- * Uses 'tableSorterCollation' in mw.config (if available)
- */
-/**
- *
- * @description Create a sortable table with multi-column sorting capabilitys
- *
- * @example $( 'table' ).tablesorter();
- * @desc Create a simple tablesorter interface.
- *
- * @example $( 'table' ).tablesorter( { sortList: [ { 0: 'desc' }, { 1: 'asc' } ] } );
- * @desc Create a tablesorter interface initially sorting on the first and second column.
- *
- * @option String cssHeader ( optional ) A string of the class name to be appended
- *         to sortable tr elements in the thead of the table. Default value:
- *         "header"
- *
- * @option String cssAsc ( optional ) A string of the class name to be appended to
- *         sortable tr elements in the thead on a ascending sort. Default value:
- *         "headerSortUp"
- *
- * @option String cssDesc ( optional ) A string of the class name to be appended
- *         to sortable tr elements in the thead on a descending sort. Default
- *         value: "headerSortDown"
- *
- * @option String sortInitialOrder ( optional ) A string of the inital sorting
- *         order can be asc or desc. Default value: "asc"
- *
- * @option String sortMultisortKey ( optional ) A string of the multi-column sort
- *         key. Default value: "shiftKey"
- *
- * @option Boolean sortLocaleCompare ( optional ) Boolean flag indicating whatever
- *         to use String.localeCampare method or not. Set to false.
- *
- * @option Boolean cancelSelection ( optional ) Boolean flag indicating if
- *         tablesorter should cancel selection of the table headers text.
- *         Default value: true
- *
- * @option Array sortList ( optional ) An array containing objects specifying sorting.
- *         By passing more than one object, multi-sorting will be applied. Object structure:
- *         { <Integer column index>: <String 'asc' or 'desc'> }
- *         Default value: []
- *
- * @option Boolean debug ( optional ) Boolean flag indicating if tablesorter
- *         should display debuging information usefull for development.
- *
- * @event sortEnd.tablesorter: Triggered as soon as any sorting has been applied.
- *
- * @type jQuery
- *
- * @name tablesorter
- *
- * @cat Plugins/Tablesorter
- *
- * @author Christian Bach/christian.bach@polyester.se
- */
-
-( function ( $, mw ) {
-       /* Local scope */
-
-       var ts,
-               parsers = [];
-
-       /* Parser utility functions */
-
-       function getParserById( name ) {
-               var i,
-                       len = parsers.length;
-               for ( i = 0; i < len; i++ ) {
-                       if ( parsers[i].id.toLowerCase() === name.toLowerCase() ) {
-                               return parsers[i];
-                       }
-               }
-               return false;
-       }
-
-       function getElementSortKey( node ) {
-               var $node = $( node ),
-                       // Use data-sort-value attribute.
-                       // Use data() instead of attr() so that live value changes
-                       // are processed as well (bug 38152).
-                       data = $node.data( 'sortValue' );
-
-               if ( data !== null && data !== undefined ) {
-                       // Cast any numbers or other stuff to a string, methods
-                       // like charAt, toLowerCase and split are expected.
-                       return String( data );
-               } else {
-                       if ( !node ) {
-                               return $node.text();
-                       } else if ( node.tagName.toLowerCase() === 'img' ) {
-                               return $node.attr( 'alt' ) || ''; // handle undefined alt
-                       } else {
-                               return $.map( $.makeArray( node.childNodes ), function( elem ) {
-                                       // 1 is for document.ELEMENT_NODE (the constant is undefined on old browsers)
-                                       if ( elem.nodeType === 1 ) {
-                                               return getElementSortKey( elem );
-                                       } else {
-                                               return $.text( elem );
-                                       }
-                               } ).join( '' );
-                       }
-               }
-       }
-
-       function detectParserForColumn( table, rows, cellIndex ) {
-               var l = parsers.length,
-                       nodeValue,
-                       // Start with 1 because 0 is the fallback parser
-                       i = 1,
-                       rowIndex = 0,
-                       concurrent = 0,
-                       needed = ( rows.length > 4 ) ? 5 : rows.length;
-
-               while ( i < l ) {
-                       if ( rows[rowIndex] && rows[rowIndex].cells[cellIndex] ) {
-                               nodeValue = $.trim( getElementSortKey( rows[rowIndex].cells[cellIndex] ) );
-                       } else {
-                               nodeValue = '';
-                       }
-
-                       if ( nodeValue !== '') {
-                               if ( parsers[i].is( nodeValue, table ) ) {
-                                       concurrent++;
-                                       rowIndex++;
-                                       if ( concurrent >= needed ) {
-                                               // Confirmed the parser for multiple cells, let's return it
-                                               return parsers[i];
-                                       }
-                               } else {
-                                       // Check next parser, reset rows
-                                       i++;
-                                       rowIndex = 0;
-                                       concurrent = 0;
-                               }
-                       } else {
-                               // Empty cell
-                               rowIndex++;
-                               if ( rowIndex > rows.length ) {
-                                       rowIndex = 0;
-                                       i++;
-                               }
-                       }
-               }
-
-               // 0 is always the generic parser (text)
-               return parsers[0];
-       }
-
-       function buildParserCache( table, $headers ) {
-               var rows = table.tBodies[0].rows,
-                       sortType,
-                       parsers = [];
-
-               if ( rows[0] ) {
-
-                       var cells = rows[0].cells,
-                               len = cells.length,
-                               i, parser;
-
-                       for ( i = 0; i < len; i++ ) {
-                               parser = false;
-                               sortType = $headers.eq( i ).data( 'sortType' );
-                               if ( sortType !== undefined ) {
-                                       parser = getParserById( sortType );
-                               }
-
-                               if ( parser === false ) {
-                                       parser = detectParserForColumn( table, rows, i );
-                               }
-
-                               parsers.push( parser );
-                       }
-               }
-               return parsers;
-       }
-
-       /* Other utility functions */
-
-       function buildCache( table ) {
-               var totalRows = ( table.tBodies[0] && table.tBodies[0].rows.length ) || 0,
-                       totalCells = ( table.tBodies[0].rows[0] && table.tBodies[0].rows[0].cells.length ) || 0,
-                       parsers = table.config.parsers,
-                       cache = {
-                               row: [],
-                               normalized: []
-                       };
-
-               for ( var i = 0; i < totalRows; ++i ) {
-
-                       // Add the table data to main data array
-                       var $row = $( table.tBodies[0].rows[i] ),
-                               cols = [];
-
-                       // if this is a child row, add it to the last row's children and
-                       // continue to the next row
-                       if ( $row.hasClass( table.config.cssChildRow ) ) {
-                               cache.row[cache.row.length - 1] = cache.row[cache.row.length - 1].add( $row );
-                               // go to the next for loop
-                               continue;
-                       }
-
-                       cache.row.push( $row );
-
-                       for ( var j = 0; j < totalCells; ++j ) {
-                               cols.push( parsers[j].format( getElementSortKey( $row[0].cells[j] ), table, $row[0].cells[j] ) );
-                       }
-
-                       cols.push( cache.normalized.length ); // add position for rowCache
-                       cache.normalized.push( cols );
-                       cols = null;
-               }
-
-               return cache;
-       }
-
-       function appendToTable( table, cache ) {
-               var i, pos, l, j,
-                       row = cache.row,
-                       normalized = cache.normalized,
-                       totalRows = normalized.length,
-                       checkCell = ( normalized[0].length - 1 ),
-                       fragment = document.createDocumentFragment();
-
-               for ( i = 0; i < totalRows; i++ ) {
-                       pos = normalized[i][checkCell];
-
-                       l = row[pos].length;
-
-                       for ( j = 0; j < l; j++ ) {
-                               fragment.appendChild( row[pos][j] );
-                       }
-
-               }
-               table.tBodies[0].appendChild( fragment );
-
-               $( table ).trigger( 'sortEnd.tablesorter' );
-       }
-
-       /**
-        * Find all header rows in a thead-less table and put them in a <thead> tag.
-        * This only treats a row as a header row if it contains only <th>s (no <td>s)
-        * and if it is preceded entirely by header rows. The algorithm stops when
-        * it encounters the first non-header row.
-        *
-        * After this, it will look at all rows at the bottom for footer rows
-        * And place these in a tfoot using similar rules.
-        * @param $table jQuery object for a <table>
-        */
-       function emulateTHeadAndFoot( $table ) {
-               var $thead, $tfoot, i, len,
-                       $rows = $table.find( '> tbody > tr' );
-               if ( !$table.get(0).tHead ) {
-                       $thead = $( '<thead>' );
-                       $rows.each( function () {
-                               if ( $(this).children( 'td' ).length ) {
-                                       // This row contains a <td>, so it's not a header row
-                                       // Stop here
-                                       return false;
-                               }
-                               $thead.append( this );
-                       } );
-                       $table.find(' > tbody:first').before( $thead );
-               }
-               if ( !$table.get(0).tFoot ) {
-                       $tfoot = $( '<tfoot>' );
-                       len = $rows.length;
-                       for ( i = len - 1; i >= 0; i-- ) {
-                               if ( $( $rows[i] ).children( 'td' ).length ){
-                                       break;
-                               }
-                               $tfoot.prepend( $( $rows[i] ));
-                       }
-                       $table.append( $tfoot );
-               }
-       }
-
-       function buildHeaders( table, msg ) {
-               var maxSeen = 0,
-                       colspanOffset = 0,
-                       columns,
-                       i,
-                       $tableHeaders = $( [] ),
-                       $tableRows = $( 'thead:eq(0) > tr', table );
-               if ( $tableRows.length <= 1 ) {
-                       $tableHeaders = $tableRows.children( 'th' );
-               } else {
-                       var rowspan,
-                               colspan,
-                               headerCount,
-                               longestTR,
-                               matrixRowIndex,
-                               matrixColumnIndex,
-                               exploded = [];
-
-                       // Loop through all the dom cells of the thead
-                       $tableRows.each( function ( rowIndex, row ) {
-                               $.each( row.cells, function( columnIndex, cell ) {
-                                       rowspan = Number( cell.rowSpan );
-                                       colspan = Number( cell.colSpan );
-
-                                       // Skip the spots in the exploded matrix that are already filled
-                                       while ( exploded[rowIndex] && exploded[rowIndex][columnIndex] !== undefined ) {
-                                               ++columnIndex;
-                                       }
-
-                                       // Find the actual dimensions of the thead, by placing each cell
-                                       // in the exploded matrix rowspan times colspan times, with the proper offsets
-                                       for ( matrixColumnIndex = columnIndex; matrixColumnIndex < columnIndex + colspan; ++matrixColumnIndex ) {
-                                               for ( matrixRowIndex = rowIndex; matrixRowIndex < rowIndex + rowspan; ++matrixRowIndex ) {
-                                                       if ( !exploded[matrixRowIndex] ) {
-                                                               exploded[matrixRowIndex] = [];
-                                                       }
-                                                       exploded[matrixRowIndex][matrixColumnIndex] = cell;
-                                               }
-                                       }
-                               } );
-                       } );
-                       // We want to find the row that has the most columns (ignoring colspan)
-                       $.each( exploded, function ( index, cellArray ) {
-                               headerCount = $.unique( $(cellArray) ).length;
-                               if ( headerCount >= maxSeen ) {
-                                       maxSeen = headerCount;
-                                       longestTR = index;
-                               }
-                       } );
-                       // We cannot use $.unique() here because it sorts into dom order, which is undesirable
-                       $tableHeaders = $( uniqueElements( exploded[longestTR] ) );
-               }
-
-               // as each header can span over multiple columns (using colspan=N),
-               // we have to bidirectionally map headers to their columns and columns to their headers
-               table.headerToColumns = [];
-               table.columnToHeader = [];
-
-               $tableHeaders.each( function ( headerIndex ) {
-                       columns = [];
-                       for ( i = 0; i < this.colSpan; i++ ) {
-                               table.columnToHeader[ colspanOffset + i ] = headerIndex;
-                               columns.push( colspanOffset + i );
-                       }
-
-                       table.headerToColumns[ headerIndex ] = columns;
-                       colspanOffset += this.colSpan;
-
-                       this.headerIndex = headerIndex;
-                       this.order = 0;
-                       this.count = 0;
-
-                       if ( $( this ).hasClass( table.config.unsortableClass ) ) {
-                               this.sortDisabled = true;
-                       }
-
-                       if ( !this.sortDisabled ) {
-                               $( this )
-                                       .addClass( table.config.cssHeader )
-                                       .prop( 'tabIndex', 0 )
-                                       .attr( {
-                                               role: 'columnheader button',
-                                               title: msg[1]
-                                       } );
-                       }
-
-                       // add cell to headerList
-                       table.config.headerList[headerIndex] = this;
-               } );
-
-               return $tableHeaders;
-
-       }
-
-       /**
-        * Sets the sort count of the columns that are not affected by the sorting to have them sorted
-        * in default (ascending) order when their header cell is clicked the next time.
-        *
-        * @param {jQuery} $headers
-        * @param {Number[][]} sortList
-        * @param {Number[][]} headerToColumns
-        */
-       function setHeadersOrder( $headers, sortList, headerToColumns ) {
-               // Loop through all headers to retrieve the indices of the columns the header spans across:
-               $.each( headerToColumns, function( headerIndex, columns ) {
-
-                       $.each( columns, function( i, columnIndex ) {
-                               var header = $headers[headerIndex];
-
-                               if ( !isValueInArray( columnIndex, sortList ) ) {
-                                       // Column shall not be sorted: Reset header count and order.
-                                       header.order = 0;
-                                       header.count = 0;
-                               } else {
-                                       // Column shall be sorted: Apply designated count and order.
-                                       $.each( sortList, function( j, sortColumn ) {
-                                               if ( sortColumn[0] === i ) {
-                                                       header.order = sortColumn[1];
-                                                       header.count = sortColumn[1] + 1;
-                                                       return false;
-                                               }
-                                       } );
-                               }
-                       } );
-
-               } );
-       }
-
-       function isValueInArray( v, a ) {
-               var l = a.length;
-               for ( var i = 0; i < l; i++ ) {
-                       if ( a[i][0] === v ) {
-                               return true;
-                       }
-               }
-               return false;
-       }
-
-       function uniqueElements( array ) {
-               var uniques = [];
-               $.each( array, function( index, elem ) {
-                       if ( elem !== undefined && $.inArray( elem, uniques ) === -1 ) {
-                               uniques.push( elem );
-                       }
-               } );
-               return uniques;
-       }
-
-       function setHeadersCss( table, $headers, list, css, msg, columnToHeader ) {
-               // Remove all header information and reset titles to default message
-               $headers.removeClass( css[0] ).removeClass( css[1] ).attr( 'title', msg[1] );
-
-               for ( var i = 0; i < list.length; i++ ) {
-                       $headers.eq( columnToHeader[ list[i][0] ] )
-                               .addClass( css[ list[i][1] ] )
-                               .attr( 'title', msg[ list[i][1] ] );
-               }
-       }
-
-       function sortText( a, b ) {
-               return ( (a < b) ? -1 : ((a > b) ? 1 : 0) );
-       }
-
-       function sortTextDesc( a, b ) {
-               return ( (b < a) ? -1 : ((b > a) ? 1 : 0) );
-       }
-
-       function multisort( table, sortList, cache ) {
-               var i,
-                       sortFn = [],
-                       len = sortList.length;
-               for ( i = 0; i < len; i++ ) {
-                       sortFn[i] = ( sortList[i][1] ) ? sortTextDesc : sortText;
-               }
-               cache.normalized.sort( function ( array1, array2 ) {
-                       var i, col, ret;
-                       for ( i = 0; i < len; i++ ) {
-                               col = sortList[i][0];
-                               ret = sortFn[i].call( this, array1[col], array2[col] );
-                               if ( ret !== 0 ) {
-                                       return ret;
-                               }
-                       }
-                       // Fall back to index number column to ensure stable sort
-                       return sortText.call( this, array1[array1.length - 1], array2[array2.length - 1] );
-               } );
-               return cache;
-       }
-
-       function buildTransformTable() {
-               var ascii, localised, i, digitClass,
-                       digits = '0123456789,.'.split( '' ),
-                       separatorTransformTable = mw.config.get( 'wgSeparatorTransformTable' ),
-                       digitTransformTable = mw.config.get( 'wgDigitTransformTable' );
-
-               if ( separatorTransformTable === null || ( separatorTransformTable[0] === '' && digitTransformTable[2] === '' ) ) {
-                       ts.transformTable = false;
-               } else {
-                       ts.transformTable = {};
-
-                       // Unpack the transform table
-                       ascii = separatorTransformTable[0].split( '\t' ).concat( digitTransformTable[0].split( '\t' ) );
-                       localised = separatorTransformTable[1].split( '\t' ).concat( digitTransformTable[1].split( '\t' ) );
-
-                       // Construct regex for number identification
-                       for ( i = 0; i < ascii.length; i++ ) {
-                               ts.transformTable[localised[i]] = ascii[i];
-                               digits.push( $.escapeRE( localised[i] ) );
-                       }
-               }
-               digitClass = '[' + digits.join( '', digits ) + ']';
-
-               // We allow a trailing percent sign, which we just strip. This works fine
-               // if percents and regular numbers aren't being mixed.
-               ts.numberRegex = new RegExp('^(' + '[-+\u2212]?[0-9][0-9,]*(\\.[0-9,]*)?(E[-+\u2212]?[0-9][0-9,]*)?' + // Fortran-style scientific
-               '|' + '[-+\u2212]?' + digitClass + '+[\\s\\xa0]*%?' + // Generic localised
-               ')$', 'i');
-       }
-
-       function buildDateTable() {
-               var i, name,
-                       regex = [];
-
-               ts.monthNames = {};
-
-               for ( i = 0; i < 12; i++ ) {
-                       name = mw.language.months.names[i].toLowerCase();
-                       ts.monthNames[name] = i + 1;
-                       regex.push( $.escapeRE( name ) );
-                       name = mw.language.months.genitive[i].toLowerCase();
-                       ts.monthNames[name] = i + 1;
-                       regex.push( $.escapeRE( name ) );
-                       name = mw.language.months.abbrev[i].toLowerCase().replace( '.', '' );
-                       ts.monthNames[name] = i + 1;
-                       regex.push( $.escapeRE( name ) );
-               }
-
-               // Build piped string
-               regex = regex.join( '|' );
-
-               // Build RegEx
-               // Any date formated with . , ' - or /
-               ts.dateRegex[0] = new RegExp( /^\s*(\d{1,2})[\,\.\-\/'\s]{1,2}(\d{1,2})[\,\.\-\/'\s]{1,2}(\d{2,4})\s*?/i);
-
-               // Written Month name, dmy
-               ts.dateRegex[1] = new RegExp( '^\\s*(\\d{1,2})[\\,\\.\\-\\/\'\\s]+(' + regex + ')' + '[\\,\\.\\-\\/\'\\s]+(\\d{2,4})\\s*$', 'i' );
-
-               // Written Month name, mdy
-               ts.dateRegex[2] = new RegExp( '^\\s*(' + regex + ')' + '[\\,\\.\\-\\/\'\\s]+(\\d{1,2})[\\,\\.\\-\\/\'\\s]+(\\d{2,4})\\s*$', 'i' );
-
-       }
-
-       /**
-        * Replace all rowspanned cells in the body with clones in each row, so sorting
-        * need not worry about them.
-        *
-        * @param $table jQuery object for a <table>
-        */
-       function explodeRowspans( $table ) {
-               var spanningRealCellIndex, rowSpan, colSpan,
-                       cell, i, $tds, $clone, $nextRows,
-                       rowspanCells = $table.find( '> tbody > tr > [rowspan]' ).get();
-
-               // Short circuit
-               if ( !rowspanCells.length ) {
-                       return;
-               }
-
-               // First, we need to make a property like cellIndex but taking into
-               // account colspans. We also cache the rowIndex to avoid having to take
-               // cell.parentNode.rowIndex in the sorting function below.
-               $table.find( '> tbody > tr' ).each( function () {
-                       var i,
-                               col = 0,
-                               l = this.cells.length;
-                       for ( i = 0; i < l; i++ ) {
-                               this.cells[i].realCellIndex = col;
-                               this.cells[i].realRowIndex = this.rowIndex;
-                               col += this.cells[i].colSpan;
-                       }
-               } );
-
-               // Split multi row cells into multiple cells with the same content.
-               // Sort by column then row index to avoid problems with odd table structures.
-               // Re-sort whenever a rowspanned cell's realCellIndex is changed, because it
-               // might change the sort order.
-               function resortCells() {
-                       rowspanCells = rowspanCells.sort( function ( a, b ) {
-                               var ret = a.realCellIndex - b.realCellIndex;
-                               if ( !ret ) {
-                                       ret = a.realRowIndex - b.realRowIndex;
-                               }
-                               return ret;
-                       } );
-                       $.each( rowspanCells, function () {
-                               this.needResort = false;
-                       } );
-               }
-               resortCells();
-
-               function filterfunc() {
-                       return this.realCellIndex >= spanningRealCellIndex;
-               }
-
-               function fixTdCellIndex() {
-                       this.realCellIndex += colSpan;
-                       if ( this.rowSpan > 1 ) {
-                               this.needResort = true;
-                       }
-               }
-
-               while ( rowspanCells.length ) {
-                       if ( rowspanCells[0].needResort ) {
-                               resortCells();
-                       }
-
-                       cell = rowspanCells.shift();
-                       rowSpan = cell.rowSpan;
-                       colSpan = cell.colSpan;
-                       spanningRealCellIndex = cell.realCellIndex;
-                       cell.rowSpan = 1;
-                       $nextRows = $( cell ).parent().nextAll();
-                       for ( i = 0; i < rowSpan - 1; i++ ) {
-                               $tds = $( $nextRows[i].cells ).filter( filterfunc );
-                               $clone = $( cell ).clone();
-                               $clone[0].realCellIndex = spanningRealCellIndex;
-                               if ( $tds.length ) {
-                                       $tds.each( fixTdCellIndex );
-                                       $tds.first().before( $clone );
-                               } else {
-                                       $nextRows.eq( i ).append( $clone );
-                               }
-                       }
-               }
-       }
-
-       function buildCollationTable() {
-               ts.collationTable = mw.config.get( 'tableSorterCollation' );
-               ts.collationRegex = null;
-               if ( ts.collationTable ) {
-                       var key,
-                               keys = [];
-
-                       // Build array of key names
-                       for ( key in ts.collationTable ) {
-                               // Check hasOwn to be safe
-                               if ( ts.collationTable.hasOwnProperty(key) ) {
-                                       keys.push(key);
-                               }
-                       }
-                       if ( keys.length ) {
-                               ts.collationRegex = new RegExp( '[' + keys.join( '' ) + ']', 'ig' );
-                       }
-               }
-       }
-
-       function cacheRegexs() {
-               if ( ts.rgx ) {
-                       return;
-               }
-               ts.rgx = {
-                       IPAddress: [
-                               new RegExp( /^\d{1,3}[\.]\d{1,3}[\.]\d{1,3}[\.]\d{1,3}$/)
-                       ],
-                       currency: [
-                               new RegExp( /(^[£$€¥]|[£$€¥]$)/),
-                               new RegExp( /[£$€¥]/g)
-                       ],
-                       url: [
-                               new RegExp( /^(https?|ftp|file):\/\/$/),
-                               new RegExp( /(https?|ftp|file):\/\//)
-                       ],
-                       isoDate: [
-                               new RegExp( /^\d{4}[\/\-]\d{1,2}[\/\-]\d{1,2}$/)
-                       ],
-                       usLongDate: [
-                               new RegExp( /^[A-Za-z]{3,10}\.? [0-9]{1,2}, ([0-9]{4}|'?[0-9]{2}) (([0-2]?[0-9]:[0-5][0-9])|([0-1]?[0-9]:[0-5][0-9]\s(AM|PM)))$/)
-                       ],
-                       time: [
-                               new RegExp( /^(([0-2]?[0-9]:[0-5][0-9])|([0-1]?[0-9]:[0-5][0-9]\s(am|pm)))$/)
-                       ]
-               };
-       }
-
-       /**
-        * Converts sort objects [ { Integer: String }, ... ] to the internally used nested array
-        * structure [ [ Integer , Integer ], ... ]
-        *
-        * @param sortObjects {Array} List of sort objects.
-        * @return {Array} List of internal sort definitions.
-        */
-
-       function convertSortList( sortObjects ) {
-               var sortList = [];
-               $.each( sortObjects, function( i, sortObject ) {
-                       $.each ( sortObject, function( columnIndex, order ) {
-                               var orderIndex = ( order === 'desc' ) ? 1 : 0;
-                               sortList.push( [parseInt( columnIndex, 10 ), orderIndex] );
-                       } );
-               } );
-               return sortList;
-       }
-
-       /* Public scope */
-
-       $.tablesorter = {
-
-                       defaultOptions: {
-                               cssHeader: 'headerSort',
-                               cssAsc: 'headerSortUp',
-                               cssDesc: 'headerSortDown',
-                               cssChildRow: 'expand-child',
-                               sortInitialOrder: 'asc',
-                               sortMultiSortKey: 'shiftKey',
-                               sortLocaleCompare: false,
-                               unsortableClass: 'unsortable',
-                               parsers: {},
-                               widgets: [],
-                               headers: {},
-                               cancelSelection: true,
-                               sortList: [],
-                               headerList: [],
-                               selectorHeaders: 'thead tr:eq(0) th',
-                               debug: false
-                       },
-
-                       dateRegex: [],
-                       monthNames: {},
-
-                       /**
-                        * @param $tables {jQuery}
-                        * @param settings {Object} (optional)
-                        */
-                       construct: function ( $tables, settings ) {
-                               return $tables.each( function ( i, table ) {
-                                       // Declare and cache.
-                                       var $headers, cache, config, sortCSS, sortMsg,
-                                               $table = $( table ),
-                                               firstTime = true;
-
-                                       // Quit if no tbody
-                                       if ( !table.tBodies ) {
-                                               return;
-                                       }
-                                       if ( !table.tHead ) {
-                                               // No thead found. Look for rows with <th>s and
-                                               // move them into a <thead> tag or a <tfoot> tag
-                                               emulateTHeadAndFoot( $table );
-
-                                               // Still no thead? Then quit
-                                               if ( !table.tHead ) {
-                                                       return;
-                                               }
-                                       }
-                                       $table.addClass( 'jquery-tablesorter' );
-
-                                       // FIXME config should probably not be stored in the plain table node
-                                       // New config object.
-                                       table.config = {};
-
-                                       // Merge and extend.
-                                       config = $.extend( table.config, $.tablesorter.defaultOptions, settings );
-
-                                       // Save the settings where they read
-                                       $.data( table, 'tablesorter', { config: config } );
-
-                                       // Get the CSS class names, could be done else where.
-                                       sortCSS = [ config.cssDesc, config.cssAsc ];
-                                       sortMsg = [ mw.msg( 'sort-descending' ), mw.msg( 'sort-ascending' ) ];
-
-                                       // Build headers
-                                       $headers = buildHeaders( table, sortMsg );
-
-                                       // Grab and process locale settings.
-                                       buildTransformTable();
-                                       buildDateTable();
-
-                                       // Precaching regexps can bring 10 fold
-                                       // performance improvements in some browsers.
-                                       cacheRegexs();
-
-                                       function setupForFirstSort() {
-                                               firstTime = false;
-
-                                               // Defer buildCollationTable to first sort. As user and site scripts
-                                               // may customize tableSorterCollation but load after $.ready(), other
-                                               // scripts may call .tablesorter() before they have done the
-                                               // tableSorterCollation customizations.
-                                               buildCollationTable();
-
-                                               // Legacy fix of .sortbottoms
-                                               // Wrap them inside inside a tfoot (because that's what they actually want to be) &
-                                               // and put the <tfoot> at the end of the <table>
-                                               var $sortbottoms = $table.find( '> tbody > tr.sortbottom' );
-                                               if ( $sortbottoms.length ) {
-                                                       var $tfoot = $table.children( 'tfoot' );
-                                                       if ( $tfoot.length ) {
-                                                               $tfoot.eq(0).prepend( $sortbottoms );
-                                                       } else {
-                                                               $table.append( $( '<tfoot>' ).append( $sortbottoms ) );
-                                                       }
-                                               }
-
-                                               explodeRowspans( $table );
-
-                                               // try to auto detect column type, and store in tables config
-                                               table.config.parsers = buildParserCache( table, $headers );
-                                       }
-
-                                       // Apply event handling to headers
-                                       // this is too big, perhaps break it out?
-                                       $headers.not( '.' + table.config.unsortableClass ).on( 'keypress click', function ( e ) {
-                                               if ( e.type === 'click' && e.target.nodeName.toLowerCase() === 'a' ) {
-                                                       // The user clicked on a link inside a table header.
-                                                       // Do nothing and let the default link click action continue.
-                                                       return true;
-                                               }
-
-                                               if ( e.type === 'keypress' && e.which !== 13 ) {
-                                                       // Only handle keypresses on the "Enter" key.
-                                                       return true;
-                                               }
-
-                                               if ( firstTime ) {
-                                                       setupForFirstSort();
-                                               }
-
-                                               // Build the cache for the tbody cells
-                                               // to share between calculations for this sort action.
-                                               // Re-calculated each time a sort action is performed due to possiblity
-                                               // that sort values change. Shouldn't be too expensive, but if it becomes
-                                               // too slow an event based system should be implemented somehow where
-                                               // cells get event .change() and bubbles up to the <table> here
-                                               cache = buildCache( table );
-
-                                               var totalRows = ( $table[0].tBodies[0] && $table[0].tBodies[0].rows.length ) || 0;
-                                               if ( !table.sortDisabled && totalRows > 0 ) {
-                                                       // Get current column sort order
-                                                       this.order = this.count % 2;
-                                                       this.count++;
-
-                                                       var cell, columns, newSortList, i;
-
-                                                       cell = this;
-                                                       // Get current column index
-                                                       columns = table.headerToColumns[ this.headerIndex ];
-                                                       newSortList = $.map( columns, function ( c ) {
-                                                               // jQuery "helpfully" flattens the arrays...
-                                                               return [[c, cell.order]];
-                                                       });
-                                                       // Index of first column belonging to this header
-                                                       i = columns[0];
-
-                                                       if ( !e[config.sortMultiSortKey] ) {
-                                                               // User only wants to sort on one column set
-                                                               // Flush the sort list and add new columns
-                                                               config.sortList = newSortList;
-                                                       } else {
-                                                               // Multi column sorting
-                                                               // It is not possible for one column to belong to multiple headers,
-                                                               // so this is okay - we don't need to check for every value in the columns array
-                                                               if ( isValueInArray( i, config.sortList ) ) {
-                                                                       // The user has clicked on an already sorted column.
-                                                                       // Reverse the sorting direction for all tables.
-                                                                       for ( var j = 0; j < config.sortList.length; j++ ) {
-                                                                               var s = config.sortList[j],
-                                                                                       o = config.headerList[s[0]];
-                                                                               if ( isValueInArray( s[0], newSortList ) ) {
-                                                                                       o.count = s[1];
-                                                                                       o.count++;
-                                                                                       s[1] = o.count % 2;
-                                                                               }
-                                                                       }
-                                                               } else {
-                                                                       // Add columns to sort list array
-                                                                       config.sortList = config.sortList.concat( newSortList );
-                                                               }
-                                                       }
-
-                                                       // Reset order/counts of cells not affected by sorting
-                                                       setHeadersOrder( $headers, config.sortList, table.headerToColumns );
-
-                                                       // Set CSS for headers
-                                                       setHeadersCss( $table[0], $headers, config.sortList, sortCSS, sortMsg, table.columnToHeader );
-                                                       appendToTable(
-                                                               $table[0], multisort( $table[0], config.sortList, cache )
-                                                       );
-
-                                                       // Stop normal event by returning false
-                                                       return false;
-                                               }
-
-                                       // Cancel selection
-                                       } ).mousedown( function () {
-                                               if ( config.cancelSelection ) {
-                                                       this.onselectstart = function () {
-                                                               return false;
-                                                       };
-                                                       return false;
-                                               }
-                                       } );
-
-                                       /**
-                                        * Sorts the table. If no sorting is specified by passing a list of sort
-                                        * objects, the table is sorted according to the initial sorting order.
-                                        * Passing an empty array will reset sorting (basically just reset the headers
-                                        * making the table appear unsorted).
-                                        *
-                                        * @param sortList {Array} (optional) List of sort objects.
-                                        */
-                                       $table.data( 'tablesorter' ).sort = function ( sortList ) {
-
-                                               if ( firstTime ) {
-                                                       setupForFirstSort();
-                                               }
-
-                                               if ( sortList === undefined ) {
-                                                       sortList = config.sortList;
-                                               } else if ( sortList.length > 0 ) {
-                                                       sortList = convertSortList( sortList );
-                                               }
-
-                                               // Set each column's sort count to be able to determine the correct sort
-                                               // order when clicking on a header cell the next time
-                                               setHeadersOrder( $headers, sortList, table.headerToColumns );
-
-                                               // re-build the cache for the tbody cells
-                                               cache = buildCache( table );
-
-                                               // set css for headers
-                                               setHeadersCss( table, $headers, sortList, sortCSS, sortMsg, table.columnToHeader );
-
-                                               // sort the table and append it to the dom
-                                               appendToTable( table, multisort( table, sortList, cache ) );
-                                       };
-
-                                       // sort initially
-                                       if ( config.sortList.length > 0 ) {
-                                               setupForFirstSort();
-                                               config.sortList = convertSortList( config.sortList );
-                                               $table.data( 'tablesorter' ).sort();
-                                       }
-
-                               } );
-                       },
-
-                       addParser: function ( parser ) {
-                               var l = parsers.length,
-                                       a = true;
-                               for ( var i = 0; i < l; i++ ) {
-                                       if ( parsers[i].id.toLowerCase() === parser.id.toLowerCase() ) {
-                                               a = false;
-                                       }
-                               }
-                               if ( a ) {
-                                       parsers.push( parser );
-                               }
-                       },
-
-                       formatDigit: function ( s ) {
-                               var out, c, p, i;
-                               if ( ts.transformTable !== false ) {
-                                       out = '';
-                                       for ( p = 0; p < s.length; p++ ) {
-                                               c = s.charAt(p);
-                                               if ( c in ts.transformTable ) {
-                                                       out += ts.transformTable[c];
-                                               } else {
-                                                       out += c;
-                                               }
-                                       }
-                                       s = out;
-                               }
-                               i = parseFloat( s.replace( /[, ]/g, '' ).replace( '\u2212', '-' ) );
-                               return isNaN( i ) ? 0 : i;
-                       },
-
-                       formatFloat: function ( s ) {
-                               var i = parseFloat(s);
-                               return isNaN( i ) ? 0 : i;
-                       },
-
-                       formatInt: function ( s ) {
-                               var i = parseInt( s, 10 );
-                               return isNaN( i ) ? 0 : i;
-                       },
-
-                       clearTableBody: function ( table ) {
-                               $( table.tBodies[0] ).empty();
-                       }
-               };
-
-       // Shortcut
-       ts = $.tablesorter;
-
-       // Register as jQuery prototype method
-       $.fn.tablesorter = function ( settings ) {
-               return ts.construct( this, settings );
-       };
-
-       // Add default parsers
-       ts.addParser( {
-               id: 'text',
-               is: function () {
-                       return true;
-               },
-               format: function ( s ) {
-                       s = $.trim( s.toLowerCase() );
-                       if ( ts.collationRegex ) {
-                               var tsc = ts.collationTable;
-                               s = s.replace( ts.collationRegex, function ( match ) {
-                                       var r = tsc[match] ? tsc[match] : tsc[match.toUpperCase()];
-                                       return r.toLowerCase();
-                               } );
-                       }
-                       return s;
-               },
-               type: 'text'
-       } );
-
-       ts.addParser( {
-               id: 'IPAddress',
-               is: function ( s ) {
-                       return ts.rgx.IPAddress[0].test(s);
-               },
-               format: function ( s ) {
-                       var a = s.split( '.' ),
-                               r = '',
-                               l = a.length;
-                       for ( var i = 0; i < l; i++ ) {
-                               var item = a[i];
-                               if ( item.length === 1 ) {
-                                       r += '00' + item;
-                               } else if ( item.length === 2 ) {
-                                       r += '0' + item;
-                               } else {
-                                       r += item;
-                               }
-                       }
-                       return $.tablesorter.formatFloat(r);
-               },
-               type: 'numeric'
-       } );
-
-       ts.addParser( {
-               id: 'currency',
-               is: function ( s ) {
-                       return ts.rgx.currency[0].test(s);
-               },
-               format: function ( s ) {
-                       return $.tablesorter.formatDigit( s.replace( ts.rgx.currency[1], '' ) );
-               },
-               type: 'numeric'
-       } );
-
-       ts.addParser( {
-               id: 'url',
-               is: function ( s ) {
-                       return ts.rgx.url[0].test(s);
-               },
-               format: function ( s ) {
-                       return $.trim( s.replace( ts.rgx.url[1], '' ) );
-               },
-               type: 'text'
-       } );
-
-       ts.addParser( {
-               id: 'isoDate',
-               is: function ( s ) {
-                       return ts.rgx.isoDate[0].test(s);
-               },
-               format: function ( s ) {
-                       return $.tablesorter.formatFloat((s !== '') ? new Date(s.replace(
-                       new RegExp( /-/g), '/')).getTime() : '0' );
-               },
-               type: 'numeric'
-       } );
-
-       ts.addParser( {
-               id: 'usLongDate',
-               is: function ( s ) {
-                       return ts.rgx.usLongDate[0].test(s);
-               },
-               format: function ( s ) {
-                       return $.tablesorter.formatFloat( new Date(s).getTime() );
-               },
-               type: 'numeric'
-       } );
-
-       ts.addParser( {
-               id: 'date',
-               is: function ( s ) {
-                       return ( ts.dateRegex[0].test(s) || ts.dateRegex[1].test(s) || ts.dateRegex[2].test(s ));
-               },
-               format: function ( s ) {
-                       var match;
-                       s = $.trim( s.toLowerCase() );
-
-                       if ( ( match = s.match( ts.dateRegex[0] ) ) !== null ) {
-                               if ( mw.config.get( 'wgDefaultDateFormat' ) === 'mdy' || mw.config.get( 'wgContentLanguage' ) === 'en' ) {
-                                       s = [ match[3], match[1], match[2] ];
-                               } else if ( mw.config.get( 'wgDefaultDateFormat' ) === 'dmy' ) {
-                                       s = [ match[3], match[2], match[1] ];
-                               } else {
-                                       // If we get here, we don't know which order the dd-dd-dddd
-                                       // date is in. So return something not entirely invalid.
-                                       return '99999999';
-                               }
-                       } else if ( ( match = s.match( ts.dateRegex[1] ) ) !== null ) {
-                               s = [ match[3], '' + ts.monthNames[match[2]], match[1] ];
-                       } else if ( ( match = s.match( ts.dateRegex[2] ) ) !== null ) {
-                               s = [ match[3], '' + ts.monthNames[match[1]], match[2] ];
-                       } else {
-                               // Should never get here
-                               return '99999999';
-                       }
-
-                       // Pad Month and Day
-                       if ( s[1].length === 1 ) {
-                               s[1] = '0' + s[1];
-                       }
-                       if ( s[2].length === 1 ) {
-                               s[2] = '0' + s[2];
-                       }
-
-                       var y;
-                       if ( ( y = parseInt( s[0], 10) ) < 100 ) {
-                               // Guestimate years without centuries
-                               if ( y < 30 ) {
-                                       s[0] = 2000 + y;
-                               } else {
-                                       s[0] = 1900 + y;
-                               }
-                       }
-                       while ( s[0].length < 4 ) {
-                               s[0] = '0' + s[0];
-                       }
-                       return parseInt( s.join( '' ), 10 );
-               },
-               type: 'numeric'
-       } );
-
-       ts.addParser( {
-               id: 'time',
-               is: function ( s ) {
-                       return ts.rgx.time[0].test(s);
-               },
-               format: function ( s ) {
-                       return $.tablesorter.formatFloat( new Date( '2000/01/01 ' + s ).getTime() );
-               },
-               type: 'numeric'
-       } );
-
-       ts.addParser( {
-               id: 'number',
-               is: function ( s ) {
-                       return $.tablesorter.numberRegex.test( $.trim( s ));
-               },
-               format: function ( s ) {
-                       return $.tablesorter.formatDigit(s);
-               },
-               type: 'numeric'
-       } );
-
-}( jQuery, mediaWiki ) );
diff --git a/resources/jquery/jquery.textSelection.js b/resources/jquery/jquery.textSelection.js
deleted file mode 100644 (file)
index 7262fe6..0000000
+++ /dev/null
@@ -1,573 +0,0 @@
-/**
- * These plugins provide extra functionality for interaction with textareas.
- */
-( function ( $ ) {
-       if ( document.selection && document.selection.createRange ) {
-               // On IE, patch the focus() method to restore the windows' scroll position
-               // (bug 32241)
-               $.fn.extend({
-                       focus: ( function ( jqFocus ) {
-                               return function () {
-                                       var $w, state, result;
-                                       if ( arguments.length === 0 ) {
-                                               $w = $( window );
-                                               state = { top: $w.scrollTop(), left: $w.scrollLeft() };
-                                               result = jqFocus.apply( this, arguments );
-                                               window.scrollTo( state.top, state.left );
-                                               return result;
-                                       }
-                                       return jqFocus.apply( this, arguments );
-                               };
-                       }( $.fn.focus ) )
-               });
-       }
-
-       $.fn.textSelection = function ( command, options ) {
-               var fn,
-                       context,
-                       hasIframe,
-                       needSave,
-                       retval;
-
-               /**
-                * Helper function to get an IE TextRange object for an element
-                */
-               function rangeForElementIE( e ) {
-                       if ( e.nodeName.toLowerCase() === 'input' ) {
-                               return e.createTextRange();
-                       } else {
-                               var sel = document.body.createTextRange();
-                               sel.moveToElementText( e );
-                               return sel;
-                       }
-               }
-
-               /**
-                * Helper function for IE for activating the textarea. Called only in the
-                * IE-specific code paths below; makes use of IE-specific non-standard
-                * function setActive() if possible to avoid screen flicker.
-                */
-               function activateElementOnIE( element ) {
-                       if ( element.setActive ) {
-                               element.setActive(); // bug 32241: doesn't scroll
-                       } else {
-                               $( element ).focus(); // may scroll (but we patched it above)
-                       }
-               }
-
-               fn = {
-                       /**
-                        * Get the contents of the textarea
-                        */
-                       getContents: function () {
-                               return this.val();
-                       },
-                       /**
-                        * Get the currently selected text in this textarea. Will focus the textarea
-                        * in some browsers (IE/Opera)
-                        */
-                       getSelection: function () {
-                               var retval, range,
-                                       el = this.get( 0 );
-
-                               if ( $(el).is( ':hidden' ) ) {
-                                       retval = '';
-                               } else if ( document.selection && document.selection.createRange ) {
-                                       activateElementOnIE( el );
-                                       range = document.selection.createRange();
-                                       retval = range.text;
-                               } else if ( el.selectionStart || el.selectionStart === 0 ) {
-                                       retval = el.value.substring( el.selectionStart, el.selectionEnd );
-                               }
-
-                               return retval;
-                       },
-                       /**
-                        * Ported from skins/common/edit.js by Trevor Parscal
-                        * (c) 2009 Wikimedia Foundation (GPLv2) - http://www.wikimedia.org
-                        *
-                        * Inserts text at the beginning and end of a text selection, optionally
-                        * inserting text at the caret when selection is empty.
-                        *
-                        * @fixme document the options parameters
-                        */
-                       encapsulateSelection: function ( options ) {
-                               return this.each( function () {
-                                       var selText, scrollTop, insertText,
-                                               isSample, range, range2, range3, startPos, endPos,
-                                               pre = options.pre,
-                                               post = options.post;
-
-                                       /**
-                                        * Check if the selected text is the same as the insert text
-                                        */
-                                       function checkSelectedText() {
-                                               if ( !selText ) {
-                                                       selText = options.peri;
-                                                       isSample = true;
-                                               } else if ( options.replace ) {
-                                                       selText = options.peri;
-                                               } else {
-                                                       while ( selText.charAt( selText.length - 1 ) === ' ' ) {
-                                                               // Exclude ending space char
-                                                               selText = selText.substring( 0, selText.length - 1 );
-                                                               post += ' ';
-                                                       }
-                                                       while ( selText.charAt( 0 ) === ' ' ) {
-                                                               // Exclude prepending space char
-                                                               selText = selText.substring( 1, selText.length );
-                                                               pre = ' ' + pre;
-                                                       }
-                                               }
-                                       }
-
-                                       /**
-                                        * Do the splitlines stuff.
-                                        *
-                                        * Wrap each line of the selected text with pre and post
-                                        */
-                                       function doSplitLines( selText, pre, post ) {
-                                               var i,
-                                                       insertText = '',
-                                                       selTextArr = selText.split( '\n' );
-                                               for ( i = 0; i < selTextArr.length; i++ ) {
-                                                       insertText += pre + selTextArr[i] + post;
-                                                       if ( i !== selTextArr.length - 1 ) {
-                                                               insertText += '\n';
-                                                       }
-                                               }
-                                               return insertText;
-                                       }
-
-                                       isSample = false;
-                                       // Do nothing if display none
-                                       if ( this.style.display !== 'none' ) {
-                                               if ( document.selection && document.selection.createRange ) {
-                                                       // IE
-
-                                                       // Note that IE9 will trigger the next section unless we check this first.
-                                                       // See bug 35201.
-
-                                                       activateElementOnIE( this );
-                                                       if ( context ) {
-                                                               context.fn.restoreCursorAndScrollTop();
-                                                       }
-                                                       if ( options.selectionStart !== undefined ) {
-                                                               $(this).textSelection( 'setSelection', { 'start': options.selectionStart, 'end': options.selectionEnd } );
-                                                       }
-
-                                                       selText = $(this).textSelection( 'getSelection' );
-                                                       scrollTop = this.scrollTop;
-                                                       range = document.selection.createRange();
-
-                                                       checkSelectedText();
-                                                       insertText = pre + selText + post;
-                                                       if ( options.splitlines ) {
-                                                               insertText = doSplitLines( selText, pre, post );
-                                                       }
-                                                       if ( options.ownline && range.moveStart ) {
-                                                               range2 = document.selection.createRange();
-                                                               range2.collapse();
-                                                               range2.moveStart( 'character', -1 );
-                                                               // FIXME: Which check is correct?
-                                                               if ( range2.text !== '\r' && range2.text !== '\n' && range2.text !== '' ) {
-                                                                       insertText = '\n' + insertText;
-                                                                       pre += '\n';
-                                                               }
-                                                               range3 = document.selection.createRange();
-                                                               range3.collapse( false );
-                                                               range3.moveEnd( 'character', 1 );
-                                                               if ( range3.text !== '\r' && range3.text !== '\n' && range3.text !== '' ) {
-                                                                       insertText += '\n';
-                                                                       post += '\n';
-                                                               }
-                                                       }
-
-                                                       range.text = insertText;
-                                                       if ( isSample && options.selectPeri && range.moveStart ) {
-                                                               range.moveStart( 'character', -post.length - selText.length );
-                                                               range.moveEnd( 'character', -post.length );
-                                                       }
-                                                       range.select();
-                                                       // Restore the scroll position
-                                                       this.scrollTop = scrollTop;
-                                               } else if ( this.selectionStart || this.selectionStart === 0 ) {
-                                                       // Mozilla/Opera
-
-                                                       $(this).focus();
-                                                       if ( options.selectionStart !== undefined ) {
-                                                               $(this).textSelection( 'setSelection', { 'start': options.selectionStart, 'end': options.selectionEnd } );
-                                                       }
-
-                                                       selText = $(this).textSelection( 'getSelection' );
-                                                       startPos = this.selectionStart;
-                                                       endPos = this.selectionEnd;
-                                                       scrollTop = this.scrollTop;
-                                                       checkSelectedText();
-                                                       if ( options.selectionStart !== undefined
-                                                                       && endPos - startPos !== options.selectionEnd - options.selectionStart )
-                                                       {
-                                                               // This means there is a difference in the selection range returned by browser and what we passed.
-                                                               // This happens for Chrome in the case of composite characters. Ref bug #30130
-                                                               // Set the startPos to the correct position.
-                                                               startPos = options.selectionStart;
-                                                       }
-
-                                                       insertText = pre + selText + post;
-                                                       if ( options.splitlines ) {
-                                                               insertText = doSplitLines( selText, pre, post );
-                                                       }
-                                                       if ( options.ownline ) {
-                                                               if ( startPos !== 0 && this.value.charAt( startPos - 1 ) !== '\n' && this.value.charAt( startPos - 1 ) !== '\r' ) {
-                                                                       insertText = '\n' + insertText;
-                                                                       pre += '\n';
-                                                               }
-                                                               if ( this.value.charAt( endPos ) !== '\n' && this.value.charAt( endPos ) !== '\r' ) {
-                                                                       insertText += '\n';
-                                                                       post += '\n';
-                                                               }
-                                                       }
-                                                       this.value = this.value.substring( 0, startPos ) + insertText +
-                                                               this.value.substring( endPos, this.value.length );
-                                                       // Setting this.value scrolls the textarea to the top, restore the scroll position
-                                                       this.scrollTop = scrollTop;
-                                                       if ( window.opera ) {
-                                                               pre = pre.replace( /\r?\n/g, '\r\n' );
-                                                               selText = selText.replace( /\r?\n/g, '\r\n' );
-                                                               post = post.replace( /\r?\n/g, '\r\n' );
-                                                       }
-                                                       if ( isSample && options.selectPeri && !options.splitlines ) {
-                                                               this.selectionStart = startPos + pre.length;
-                                                               this.selectionEnd = startPos + pre.length + selText.length;
-                                                       } else {
-                                                               this.selectionStart = startPos + insertText.length;
-                                                               this.selectionEnd = this.selectionStart;
-                                                       }
-                                               }
-                                       }
-                                       $(this).trigger( 'encapsulateSelection', [ options.pre, options.peri, options.post, options.ownline,
-                                               options.replace, options.spitlines ] );
-                               });
-                       },
-                       /**
-                        * Ported from Wikia's LinkSuggest extension
-                        * https://svn.wikia-code.com/wikia/trunk/extensions/wikia/LinkSuggest
-                        * Some code copied from
-                        * http://www.dedestruct.com/2008/03/22/howto-cross-browser-cursor-position-in-textareas/
-                        *
-                        * Get the position (in resolution of bytes not necessarily characters)
-                        * in a textarea
-                        *
-                        * Will focus the textarea in some browsers (IE/Opera)
-                        *
-                        * @fixme document the options parameters
-                        */
-                        getCaretPosition: function ( options ) {
-                               function getCaret( e ) {
-                                       var caretPos = 0,
-                                               endPos = 0,
-                                               preText, rawPreText, periText,
-                                               rawPeriText, postText, rawPostText,
-                                               // IE Support
-                                               preFinished,
-                                               periFinished,
-                                               postFinished,
-                                               // Range containing text in the selection
-                                               periRange,
-                                               // Range containing text before the selection
-                                               preRange,
-                                               // Range containing text after the selection
-                                               postRange;
-
-                                       if ( document.selection && document.selection.createRange ) {
-                                               // IE doesn't properly report non-selected caret position through
-                                               // the selection ranges when textarea isn't focused. This can
-                                               // lead to saving a bogus empty selection, which then screws up
-                                               // whatever we do later (bug 31847).
-                                               activateElementOnIE( e );
-
-                                               preFinished = false;
-                                               periFinished = false;
-                                               postFinished = false;
-                                               periRange = document.selection.createRange().duplicate();
-
-                                               preRange = rangeForElementIE( e );
-                                               // Move the end where we need it
-                                               preRange.setEndPoint( 'EndToStart', periRange );
-
-                                               postRange = rangeForElementIE( e );
-                                               // Move the start where we need it
-                                               postRange.setEndPoint( 'StartToEnd', periRange );
-
-                                               // Load the text values we need to compare
-                                               preText = rawPreText = preRange.text;
-                                               periText = rawPeriText = periRange.text;
-                                               postText = rawPostText = postRange.text;
-
-                                               /*
-                                                * Check each range for trimmed newlines by shrinking the range by 1
-                                                * character and seeing if the text property has changed. If it has
-                                                * not changed then we know that IE has trimmed a \r\n from the end.
-                                                */
-                                               do {
-                                                       if ( !preFinished ) {
-                                                               if ( preRange.compareEndPoints( 'StartToEnd', preRange ) === 0 ) {
-                                                                       preFinished = true;
-                                                               } else {
-                                                                       preRange.moveEnd( 'character', -1 );
-                                                                       if ( preRange.text === preText ) {
-                                                                               rawPreText += '\r\n';
-                                                                       } else {
-                                                                               preFinished = true;
-                                                                       }
-                                                               }
-                                                       }
-                                                       if ( !periFinished ) {
-                                                               if ( periRange.compareEndPoints( 'StartToEnd', periRange ) === 0 ) {
-                                                                       periFinished = true;
-                                                               } else {
-                                                                       periRange.moveEnd( 'character', -1 );
-                                                                       if ( periRange.text === periText ) {
-                                                                               rawPeriText += '\r\n';
-                                                                       } else {
-                                                                               periFinished = true;
-                                                                       }
-                                                               }
-                                                       }
-                                                       if ( !postFinished ) {
-                                                               if ( postRange.compareEndPoints( 'StartToEnd', postRange ) === 0 ) {
-                                                                       postFinished = true;
-                                                               } else {
-                                                                       postRange.moveEnd( 'character', -1 );
-                                                                       if ( postRange.text === postText ) {
-                                                                               rawPostText += '\r\n';
-                                                                       } else {
-                                                                               postFinished = true;
-                                                                       }
-                                                               }
-                                                       }
-                                               } while ( ( !preFinished || !periFinished || !postFinished ) );
-                                               caretPos = rawPreText.replace( /\r\n/g, '\n' ).length;
-                                               endPos = caretPos + rawPeriText.replace( /\r\n/g, '\n' ).length;
-                                       } else if ( e.selectionStart || e.selectionStart === 0 ) {
-                                               // Firefox support
-                                               caretPos = e.selectionStart;
-                                               endPos = e.selectionEnd;
-                                       }
-                                       return options.startAndEnd ? [ caretPos, endPos ] : caretPos;
-                               }
-                               return getCaret( this.get( 0 ) );
-                       },
-                       /**
-                        * @fixme document the options parameters
-                        */
-                       setSelection: function ( options ) {
-                               return this.each( function () {
-                                       var selection, length, newLines;
-                                       // Do nothing if hidden
-                                       if ( !$(this).is( ':hidden' ) ) {
-                                               if ( this.selectionStart || this.selectionStart === 0 ) {
-                                                       // Opera 9.0 doesn't allow setting selectionStart past
-                                                       // selectionEnd; any attempts to do that will be ignored
-                                                       // Make sure to set them in the right order
-                                                       if ( options.start > this.selectionEnd ) {
-                                                               this.selectionEnd = options.end;
-                                                               this.selectionStart = options.start;
-                                                       } else {
-                                                               this.selectionStart = options.start;
-                                                               this.selectionEnd = options.end;
-                                                       }
-                                               } else if ( document.body.createTextRange ) {
-                                                       selection = rangeForElementIE( this );
-                                                       length = this.value.length;
-                                                       // IE doesn't count \n when computing the offset, so we won't either
-                                                       newLines = this.value.match( /\n/g );
-                                                       if ( newLines ) {
-                                                               length = length - newLines.length;
-                                                       }
-                                                       selection.moveStart( 'character', options.start );
-                                                       selection.moveEnd( 'character', -length + options.end );
-
-                                                       // This line can cause an error under certain circumstances (textarea empty, no selection)
-                                                       // Silence that error
-                                                       try {
-                                                               selection.select();
-                                                       } catch ( e ) { }
-                                               }
-                                       }
-                               });
-                       },
-                       /**
-                        * Ported from Wikia's LinkSuggest extension
-                        * https://svn.wikia-code.com/wikia/trunk/extensions/wikia/LinkSuggest
-                        *
-                        * Scroll a textarea to the current cursor position. You can set the cursor
-                        * position with setSelection()
-                        * @param options boolean Whether to force a scroll even if the caret position
-                        *  is already visible. Defaults to false
-                        *
-                        * @fixme document the options parameters (function body suggests options.force is a boolean, not options itself)
-                        */
-                       scrollToCaretPosition: function ( options ) {
-                               function getLineLength( e ) {
-                                       return Math.floor( e.scrollWidth / ( $.client.profile().platform === 'linux' ? 7 : 8 ) );
-                               }
-                               function getCaretScrollPosition( e ) {
-                                       // FIXME: This functions sucks and is off by a few lines most
-                                       // of the time. It should be replaced by something decent.
-                                       var i, j,
-                                               nextSpace,
-                                               text = e.value.replace( /\r/g, '' ),
-                                               caret = $( e ).textSelection( 'getCaretPosition' ),
-                                               lineLength = getLineLength( e ),
-                                               row = 0,
-                                               charInLine = 0,
-                                               lastSpaceInLine = 0;
-
-                                       for ( i = 0; i < caret; i++ ) {
-                                               charInLine++;
-                                               if ( text.charAt( i ) === ' ' ) {
-                                                       lastSpaceInLine = charInLine;
-                                               } else if ( text.charAt( i ) === '\n' ) {
-                                                       lastSpaceInLine = 0;
-                                                       charInLine = 0;
-                                                       row++;
-                                               }
-                                               if ( charInLine > lineLength ) {
-                                                       if ( lastSpaceInLine > 0 ) {
-                                                               charInLine = charInLine - lastSpaceInLine;
-                                                               lastSpaceInLine = 0;
-                                                               row++;
-                                                       }
-                                               }
-                                       }
-                                       nextSpace = 0;
-                                       for ( j = caret; j < caret + lineLength; j++ ) {
-                                               if (
-                                                       text.charAt( j ) === ' ' ||
-                                                       text.charAt( j ) === '\n' ||
-                                                       caret === text.length
-                                               ) {
-                                                       nextSpace = j;
-                                                       break;
-                                               }
-                                       }
-                                       if ( nextSpace > lineLength && caret <= lineLength ) {
-                                               charInLine = caret - lastSpaceInLine;
-                                               row++;
-                                       }
-                                       return ( $.client.profile().platform === 'mac' ? 13 : ( $.client.profile().platform === 'linux' ? 15 : 16 ) ) * row;
-                               }
-                               return this.each(function () {
-                                       var scroll, range, savedRange, pos, oldScrollTop;
-                                       // Do nothing if hidden
-                                       if ( !$(this).is( ':hidden' ) ) {
-                                               if ( this.selectionStart || this.selectionStart === 0 ) {
-                                                       // Mozilla
-                                                       scroll = getCaretScrollPosition( this );
-                                                       if ( options.force || scroll < $(this).scrollTop() ||
-                                                                       scroll > $(this).scrollTop() + $(this).height() ) {
-                                                               $(this).scrollTop( scroll );
-                                                       }
-                                               } else if ( document.selection && document.selection.createRange ) {
-                                                       // IE / Opera
-                                                       /*
-                                                        * IE automatically scrolls the selected text to the
-                                                        * bottom of the textarea at range.select() time, except
-                                                        * if it was already in view and the cursor position
-                                                        * wasn't changed, in which case it does nothing. To
-                                                        * cover that case, we'll force it to act by moving one
-                                                        * character back and forth.
-                                                        */
-                                                       range = document.body.createTextRange();
-                                                       savedRange = document.selection.createRange();
-                                                       pos = $(this).textSelection( 'getCaretPosition' );
-                                                       oldScrollTop = this.scrollTop;
-                                                       range.moveToElementText( this );
-                                                       range.collapse();
-                                                       range.move( 'character', pos + 1);
-                                                       range.select();
-                                                       if ( this.scrollTop !== oldScrollTop ) {
-                                                               this.scrollTop += range.offsetTop;
-                                                       } else if ( options.force ) {
-                                                               range.move( 'character', -1 );
-                                                               range.select();
-                                                       }
-                                                       savedRange.select();
-                                               }
-                                       }
-                                       $(this).trigger( 'scrollToPosition' );
-                               } );
-                       }
-               };
-
-               // Apply defaults
-               switch ( command ) {
-                       //case 'getContents': // no params
-                       //case 'setContents': // no params with defaults
-                       //case 'getSelection': // no params
-                       case 'encapsulateSelection':
-                               options = $.extend( {
-                                       pre: '', // Text to insert before the cursor/selection
-                                       peri: '', // Text to insert between pre and post and select afterwards
-                                       post: '', // Text to insert after the cursor/selection
-                                       ownline: false, // Put the inserted text on a line of its own
-                                       replace: false, // If there is a selection, replace it with peri instead of leaving it alone
-                                       selectPeri: true, // Select the peri text if it was inserted (but not if there was a selection and replace==false, or if splitlines==true)
-                                       splitlines: false, // If multiple lines are selected, encapsulate each line individually
-                                       selectionStart: undefined, // Position to start selection at
-                                       selectionEnd: undefined // Position to end selection at. Defaults to start
-                               }, options );
-                               break;
-                       case 'getCaretPosition':
-                               options = $.extend( {
-                                       // Return [start, end] instead of just start
-                                       startAndEnd: false
-                               }, options );
-                               // FIXME: We may not need character position-based functions if we insert markers in the right places
-                               break;
-                       case 'setSelection':
-                               options = $.extend( {
-                                       // Position to start selection at
-                                       start: undefined,
-                                       // Position to end selection at. Defaults to start
-                                       end: undefined,
-                                       // Element to start selection in (iframe only)
-                                       startContainer: undefined,
-                                       // Element to end selection in (iframe only). Defaults to startContainer
-                                       endContainer: undefined
-                               }, options );
-
-                               if ( options.end === undefined ) {
-                                       options.end = options.start;
-                               }
-                               if ( options.endContainer === undefined ) {
-                                       options.endContainer = options.startContainer;
-                               }
-                               // FIXME: We may not need character position-based functions if we insert markers in the right places
-                               break;
-                       case 'scrollToCaretPosition':
-                               options = $.extend( {
-                                       force: false // Force a scroll even if the caret position is already visible
-                               }, options );
-                               break;
-               }
-
-               context = $(this).data( 'wikiEditor-context' );
-               hasIframe = context !== undefined && context && context.$iframe !== undefined;
-
-               // IE selection restore voodoo
-               needSave = false;
-               if ( hasIframe && context.savedSelection !== null ) {
-                       context.fn.restoreSelection();
-                       needSave = true;
-               }
-               retval = ( hasIframe ? context.fn : fn )[command].call( this, options );
-               if ( hasIframe && needSave ) {
-                       context.fn.saveSelection();
-               }
-
-               return retval;
-       };
-
-}( jQuery ) );
diff --git a/resources/jquery/jquery.validate.js b/resources/jquery/jquery.validate.js
deleted file mode 100644 (file)
index 72296a6..0000000
+++ /dev/null
@@ -1,1166 +0,0 @@
-/**
- * jQuery Validation Plugin 1.8.1
- *
- * http://bassistance.de/jquery-plugins/jquery-plugin-validation/
- * http://docs.jquery.com/Plugins/Validation
- *
- * Copyright (c) 2006 - 2011 Jörn Zaefferer
- *
- * Dual licensed under the MIT and GPL licenses:
- *   http://www.opensource.org/licenses/mit-license.php
- *   http://www.gnu.org/licenses/gpl.html
- */
-
-(function($) {
-
-$.extend($.fn, {
-       // http://docs.jquery.com/Plugins/Validation/validate
-       validate: function( options ) {
-
-               // if nothing is selected, return nothing; can't chain anyway
-               if (!this.length) {
-                       options && options.debug && window.console && console.warn( "nothing selected, can't validate, returning nothing" );
-                       return;
-               }
-
-               // check if a validator for this form was already created
-               var validator = $.data(this[0], 'validator');
-               if ( validator ) {
-                       return validator;
-               }
-
-               validator = new $.validator( options, this[0] );
-               $.data(this[0], 'validator', validator);
-
-               if ( validator.settings.onsubmit ) {
-
-                       // allow suppresing validation by adding a cancel class to the submit button
-                       this.find("input, button").filter(".cancel").click(function() {
-                               validator.cancelSubmit = true;
-                       });
-
-                       // when a submitHandler is used, capture the submitting button
-                       if (validator.settings.submitHandler) {
-                               this.find("input, button").filter(":submit").click(function() {
-                                       validator.submitButton = this;
-                               });
-                       }
-
-                       // validate the form on submit
-                       this.submit( function( event ) {
-                               if ( validator.settings.debug )
-                                       // prevent form submit to be able to see console output
-                                       event.preventDefault();
-
-                               function handle() {
-                                       if ( validator.settings.submitHandler ) {
-                                               if (validator.submitButton) {
-                                                       // insert a hidden input as a replacement for the missing submit button
-                                                       var hidden = $("<input type='hidden'/>").attr("name", validator.submitButton.name).val(validator.submitButton.value).appendTo(validator.currentForm);
-                                               }
-                                               validator.settings.submitHandler.call( validator, validator.currentForm );
-                                               if (validator.submitButton) {
-                                                       // and clean up afterwards; thanks to no-block-scope, hidden can be referenced
-                                                       hidden.remove();
-                                               }
-                                               return false;
-                                       }
-                                       return true;
-                               }
-
-                               // prevent submit for invalid forms or custom submit handlers
-                               if ( validator.cancelSubmit ) {
-                                       validator.cancelSubmit = false;
-                                       return handle();
-                               }
-                               if ( validator.form() ) {
-                                       if ( validator.pendingRequest ) {
-                                               validator.formSubmitted = true;
-                                               return false;
-                                       }
-                                       return handle();
-                               } else {
-                                       validator.focusInvalid();
-                                       return false;
-                               }
-                       });
-               }
-
-               return validator;
-       },
-       // http://docs.jquery.com/Plugins/Validation/valid
-       valid: function() {
-        if ( $(this[0]).is('form')) {
-            return this.validate().form();
-        } else {
-            var valid = true;
-            var validator = $(this[0].form).validate();
-            this.each(function() {
-                               valid &= validator.element(this);
-            });
-            return valid;
-        }
-    },
-       // attributes: space seperated list of attributes to retrieve and remove
-       removeAttrs: function(attributes) {
-               var result = {},
-                       $element = this;
-               $.each(attributes.split(/\s/), function(index, value) {
-                       result[value] = $element.attr(value);
-                       $element.removeAttr(value);
-               });
-               return result;
-       },
-       // http://docs.jquery.com/Plugins/Validation/rules
-       rules: function(command, argument) {
-               var element = this[0];
-
-               if (command) {
-                       var settings = $.data(element.form, 'validator').settings;
-                       var staticRules = settings.rules;
-                       var existingRules = $.validator.staticRules(element);
-                       switch(command) {
-                       case "add":
-                               $.extend(existingRules, $.validator.normalizeRule(argument));
-                               staticRules[element.name] = existingRules;
-                               if (argument.messages)
-                                       settings.messages[element.name] = $.extend( settings.messages[element.name], argument.messages );
-                               break;
-                       case "remove":
-                               if (!argument) {
-                                       delete staticRules[element.name];
-                                       return existingRules;
-                               }
-                               var filtered = {};
-                               $.each(argument.split(/\s/), function(index, method) {
-                                       filtered[method] = existingRules[method];
-                                       delete existingRules[method];
-                               });
-                               return filtered;
-                       }
-               }
-
-               var data = $.validator.normalizeRules(
-               $.extend(
-                       {},
-                       $.validator.metadataRules(element),
-                       $.validator.classRules(element),
-                       $.validator.attributeRules(element),
-                       $.validator.staticRules(element)
-               ), element);
-
-               // make sure required is at front
-               if (data.required) {
-                       var param = data.required;
-                       delete data.required;
-                       data = $.extend({required: param}, data);
-               }
-
-               return data;
-       }
-});
-
-// Custom selectors
-$.extend($.expr[":"], {
-       // http://docs.jquery.com/Plugins/Validation/blank
-       blank: function(a) {return !$.trim("" + a.value);},
-       // http://docs.jquery.com/Plugins/Validation/filled
-       filled: function(a) {return !!$.trim("" + a.value);},
-       // http://docs.jquery.com/Plugins/Validation/unchecked
-       unchecked: function(a) {return !a.checked;}
-});
-
-// constructor for validator
-$.validator = function( options, form ) {
-       this.settings = $.extend( true, {}, $.validator.defaults, options );
-       this.currentForm = form;
-       this.init();
-};
-
-$.validator.format = function(source, params) {
-       if ( arguments.length == 1 )
-               return function() {
-                       var args = $.makeArray(arguments);
-                       args.unshift(source);
-                       return $.validator.format.apply( this, args );
-               };
-       if ( arguments.length > 2 && params.constructor != Array  ) {
-               params = $.makeArray(arguments).slice(1);
-       }
-       if ( params.constructor != Array ) {
-               params = [ params ];
-       }
-       $.each(params, function(i, n) {
-               source = source.replace(new RegExp("\\{" + i + "\\}", "g"), n);
-       });
-       return source;
-};
-
-$.extend($.validator, {
-
-       defaults: {
-               messages: {},
-               groups: {},
-               rules: {},
-               errorClass: "error",
-               validClass: "valid",
-               errorElement: "label",
-               focusInvalid: true,
-               errorContainer: $( [] ),
-               errorLabelContainer: $( [] ),
-               onsubmit: true,
-               ignore: [],
-               ignoreTitle: false,
-               onfocusin: function(element) {
-                       this.lastActive = element;
-
-                       // hide error label and remove error class on focus if enabled
-                       if ( this.settings.focusCleanup && !this.blockFocusCleanup ) {
-                               this.settings.unhighlight && this.settings.unhighlight.call( this, element, this.settings.errorClass, this.settings.validClass );
-                               this.addWrapper(this.errorsFor(element)).hide();
-                       }
-               },
-               onfocusout: function(element) {
-                       if ( !this.checkable(element) && (element.name in this.submitted || !this.optional(element)) ) {
-                               this.element(element);
-                       }
-               },
-               onkeyup: function(element) {
-                       if ( element.name in this.submitted || element == this.lastElement ) {
-                               this.element(element);
-                       }
-               },
-               onclick: function(element) {
-                       // click on selects, radiobuttons and checkboxes
-                       if ( element.name in this.submitted )
-                               this.element(element);
-                       // or option elements, check parent select in that case
-                       else if (element.parentNode.name in this.submitted)
-                               this.element(element.parentNode);
-               },
-               highlight: function(element, errorClass, validClass) {
-                       if (element.type === 'radio') {
-                               this.findByName(element.name).addClass(errorClass).removeClass(validClass);
-                       } else {
-                               $(element).addClass(errorClass).removeClass(validClass);
-                       }
-               },
-               unhighlight: function(element, errorClass, validClass) {
-                       if (element.type === 'radio') {
-                               this.findByName(element.name).removeClass(errorClass).addClass(validClass);
-                       } else {
-                               $(element).removeClass(errorClass).addClass(validClass);
-                       }
-               }
-       },
-
-       // http://docs.jquery.com/Plugins/Validation/Validator/setDefaults
-       setDefaults: function(settings) {
-               $.extend( $.validator.defaults, settings );
-       },
-
-       messages: {
-               required: "This field is required.",
-               remote: "Please fix this field.",
-               email: "Please enter a valid email address.",
-               url: "Please enter a valid URL.",
-               date: "Please enter a valid date.",
-               dateISO: "Please enter a valid date (ISO).",
-               number: "Please enter a valid number.",
-               digits: "Please enter only digits.",
-               creditcard: "Please enter a valid credit card number.",
-               equalTo: "Please enter the same value again.",
-               accept: "Please enter a value with a valid extension.",
-               maxlength: $.validator.format("Please enter no more than {0} characters."),
-               minlength: $.validator.format("Please enter at least {0} characters."),
-               rangelength: $.validator.format("Please enter a value between {0} and {1} characters long."),
-               range: $.validator.format("Please enter a value between {0} and {1}."),
-               max: $.validator.format("Please enter a value less than or equal to {0}."),
-               min: $.validator.format("Please enter a value greater than or equal to {0}.")
-       },
-
-       autoCreateRanges: false,
-
-       prototype: {
-
-               init: function() {
-                       this.labelContainer = $(this.settings.errorLabelContainer);
-                       this.errorContext = this.labelContainer.length && this.labelContainer || $(this.currentForm);
-                       this.containers = $(this.settings.errorContainer).add( this.settings.errorLabelContainer );
-                       this.submitted = {};
-                       this.valueCache = {};
-                       this.pendingRequest = 0;
-                       this.pending = {};
-                       this.invalid = {};
-                       this.reset();
-
-                       var groups = (this.groups = {});
-                       $.each(this.settings.groups, function(key, value) {
-                               $.each(value.split(/\s/), function(index, name) {
-                                       groups[name] = key;
-                               });
-                       });
-                       var rules = this.settings.rules;
-                       $.each(rules, function(key, value) {
-                               rules[key] = $.validator.normalizeRule(value);
-                       });
-
-                       function delegate(event) {
-                               var validator = $.data(this[0].form, "validator"),
-                                       eventType = "on" + event.type.replace(/^validate/, "");
-                               validator.settings[eventType] && validator.settings[eventType].call(validator, this[0] );
-                       }
-                       $(this.currentForm)
-                               .validateDelegate(":text, :password, :file, select, textarea", "focusin focusout keyup", delegate)
-                               .validateDelegate(":radio, :checkbox, select, option", "click", delegate);
-
-                       if (this.settings.invalidHandler)
-                               $(this.currentForm).bind("invalid-form.validate", this.settings.invalidHandler);
-               },
-
-               // http://docs.jquery.com/Plugins/Validation/Validator/form
-               form: function() {
-                       this.checkForm();
-                       $.extend(this.submitted, this.errorMap);
-                       this.invalid = $.extend({}, this.errorMap);
-                       if (!this.valid())
-                               $(this.currentForm).triggerHandler("invalid-form", [this]);
-                       this.showErrors();
-                       return this.valid();
-               },
-
-               checkForm: function() {
-                       this.prepareForm();
-                       for ( var i = 0, elements = (this.currentElements = this.elements()); elements[i]; i++ ) {
-                               this.check( elements[i] );
-                       }
-                       return this.valid();
-               },
-
-               // http://docs.jquery.com/Plugins/Validation/Validator/element
-               element: function( element ) {
-                       element = this.clean( element );
-                       this.lastElement = element;
-                       this.prepareElement( element );
-                       this.currentElements = $(element);
-                       var result = this.check( element );
-                       if ( result ) {
-                               delete this.invalid[element.name];
-                       } else {
-                               this.invalid[element.name] = true;
-                       }
-                       if ( !this.numberOfInvalids() ) {
-                               // Hide error containers on last error
-                               this.toHide = this.toHide.add( this.containers );
-                       }
-                       this.showErrors();
-                       return result;
-               },
-
-               // http://docs.jquery.com/Plugins/Validation/Validator/showErrors
-               showErrors: function(errors) {
-                       if(errors) {
-                               // add items to error list and map
-                               $.extend( this.errorMap, errors );
-                               this.errorList = [];
-                               for ( var name in errors ) {
-                                       this.errorList.push({
-                                               message: errors[name],
-                                               element: this.findByName(name)[0]
-                                       });
-                               }
-                               // remove items from success list
-                               this.successList = $.grep( this.successList, function(element) {
-                                       return !(element.name in errors);
-                               });
-                       }
-                       this.settings.showErrors
-                               ? this.settings.showErrors.call( this, this.errorMap, this.errorList )
-                               : this.defaultShowErrors();
-               },
-
-               // http://docs.jquery.com/Plugins/Validation/Validator/resetForm
-               resetForm: function() {
-                       if ( $.fn.resetForm )
-                               $( this.currentForm ).resetForm();
-                       this.submitted = {};
-                       this.prepareForm();
-                       this.hideErrors();
-                       this.elements().removeClass( this.settings.errorClass );
-               },
-
-               numberOfInvalids: function() {
-                       return this.objectLength(this.invalid);
-               },
-
-               objectLength: function( obj ) {
-                       var count = 0;
-                       for ( var i in obj )
-                               count++;
-                       return count;
-               },
-
-               hideErrors: function() {
-                       this.addWrapper( this.toHide ).hide();
-               },
-
-               valid: function() {
-                       return this.size() == 0;
-               },
-
-               size: function() {
-                       return this.errorList.length;
-               },
-
-               focusInvalid: function() {
-                       if( this.settings.focusInvalid ) {
-                               try {
-                                       $(this.findLastActive() || this.errorList.length && this.errorList[0].element || [])
-                                       .filter(":visible")
-                                       .focus()
-                                       // manually trigger focusin event; without it, focusin handler isn't called, findLastActive won't have anything to find
-                                       .trigger("focusin");
-                               } catch(e) {
-                                       // ignore IE throwing errors when focusing hidden elements
-                               }
-                       }
-               },
-
-               findLastActive: function() {
-                       var lastActive = this.lastActive;
-                       return lastActive && $.grep(this.errorList, function(n) {
-                               return n.element.name == lastActive.name;
-                       }).length == 1 && lastActive;
-               },
-
-               elements: function() {
-                       var validator = this,
-                               rulesCache = {};
-
-                       // select all valid inputs inside the form (no submit or reset buttons)
-                       return $(this.currentForm)
-                       .find("input, select, textarea")
-                       .not(":submit, :reset, :image, [disabled]")
-                       .not( this.settings.ignore )
-                       .filter(function() {
-                               !this.name && validator.settings.debug && window.console && console.error( "%o has no name assigned", this);
-
-                               // select only the first element for each name, and only those with rules specified
-                               if ( this.name in rulesCache || !validator.objectLength($(this).rules()) )
-                                       return false;
-
-                               rulesCache[this.name] = true;
-                               return true;
-                       });
-               },
-
-               clean: function( selector ) {
-                       return $( selector )[0];
-               },
-
-               errors: function() {
-                       return $( this.settings.errorElement + "." + this.settings.errorClass, this.errorContext );
-               },
-
-               reset: function() {
-                       this.successList = [];
-                       this.errorList = [];
-                       this.errorMap = {};
-                       this.toShow = $([]);
-                       this.toHide = $([]);
-                       this.currentElements = $([]);
-               },
-
-               prepareForm: function() {
-                       this.reset();
-                       this.toHide = this.errors().add( this.containers );
-               },
-
-               prepareElement: function( element ) {
-                       this.reset();
-                       this.toHide = this.errorsFor(element);
-               },
-
-               check: function( element ) {
-                       element = this.clean( element );
-
-                       // if radio/checkbox, validate first element in group instead
-                       if (this.checkable(element)) {
-                               element = this.findByName( element.name ).not(this.settings.ignore)[0];
-                       }
-
-                       var rules = $(element).rules();
-                       var dependencyMismatch = false;
-                       for (var method in rules ) {
-                               var rule = { method: method, parameters: rules[method] };
-                               try {
-                                       var result = $.validator.methods[method].call( this, element.value.replace(/\r/g, ""), element, rule.parameters );
-
-                                       // if a method indicates that the field is optional and therefore valid,
-                                       // don't mark it as valid when there are no other rules
-                                       if ( result == "dependency-mismatch" ) {
-                                               dependencyMismatch = true;
-                                               continue;
-                                       }
-                                       dependencyMismatch = false;
-
-                                       if ( result == "pending" ) {
-                                               this.toHide = this.toHide.not( this.errorsFor(element) );
-                                               return;
-                                       }
-
-                                       if( !result ) {
-                                               this.formatAndAdd( element, rule );
-                                               return false;
-                                       }
-                               } catch(e) {
-                                       this.settings.debug && window.console && console.log("exception occured when checking element " + element.id
-                                                + ", check the '" + rule.method + "' method", e);
-                                       throw e;
-                               }
-                       }
-                       if (dependencyMismatch)
-                               return;
-                       if ( this.objectLength(rules) )
-                               this.successList.push(element);
-                       return true;
-               },
-
-               // return the custom message for the given element and validation method
-               // specified in the element's "messages" metadata
-               customMetaMessage: function(element, method) {
-                       if (!$.metadata)
-                               return;
-
-                       var meta = this.settings.meta
-                               ? $(element).metadata()[this.settings.meta]
-                               : $(element).metadata();
-
-                       return meta && meta.messages && meta.messages[method];
-               },
-
-               // return the custom message for the given element name and validation method
-               customMessage: function( name, method ) {
-                       var m = this.settings.messages[name];
-                       return m && (m.constructor == String
-                               ? m
-                               : m[method]);
-               },
-
-               // return the first defined argument, allowing empty strings
-               findDefined: function() {
-                       for(var i = 0; i < arguments.length; i++) {
-                               if (arguments[i] !== undefined)
-                                       return arguments[i];
-                       }
-                       return undefined;
-               },
-
-               defaultMessage: function( element, method) {
-                       return this.findDefined(
-                               this.customMessage( element.name, method ),
-                               this.customMetaMessage( element, method ),
-                               // title is never undefined, so handle empty string as undefined
-                               !this.settings.ignoreTitle && element.title || undefined,
-                               $.validator.messages[method],
-                               "<strong>Warning: No message defined for " + element.name + "</strong>"
-                       );
-               },
-
-               formatAndAdd: function( element, rule ) {
-                       var message = this.defaultMessage( element, rule.method ),
-                               theregex = /\$?\{(\d+)\}/g;
-                       if ( typeof message == "function" ) {
-                               message = message.call(this, rule.parameters, element);
-                       } else if (theregex.test(message)) {
-                               message = jQuery.format(message.replace(theregex, '{$1}'), rule.parameters);
-                       }
-                       this.errorList.push({
-                               message: message,
-                               element: element
-                       });
-
-                       this.errorMap[element.name] = message;
-                       this.submitted[element.name] = message;
-               },
-
-               addWrapper: function(toToggle) {
-                       if ( this.settings.wrapper )
-                               toToggle = toToggle.add( toToggle.parent( this.settings.wrapper ) );
-                       return toToggle;
-               },
-
-               defaultShowErrors: function() {
-                       for ( var i = 0; this.errorList[i]; i++ ) {
-                               var error = this.errorList[i];
-                               this.settings.highlight && this.settings.highlight.call( this, error.element, this.settings.errorClass, this.settings.validClass );
-                               this.showLabel( error.element, error.message );
-                       }
-                       if( this.errorList.length ) {
-                               this.toShow = this.toShow.add( this.containers );
-                       }
-                       if (this.settings.success) {
-                               for ( var i = 0; this.successList[i]; i++ ) {
-                                       this.showLabel( this.successList[i] );
-                               }
-                       }
-                       if (this.settings.unhighlight) {
-                               for ( var i = 0, elements = this.validElements(); elements[i]; i++ ) {
-                                       this.settings.unhighlight.call( this, elements[i], this.settings.errorClass, this.settings.validClass );
-                               }
-                       }
-                       this.toHide = this.toHide.not( this.toShow );
-                       this.hideErrors();
-                       this.addWrapper( this.toShow ).show();
-               },
-
-               validElements: function() {
-                       return this.currentElements.not(this.invalidElements());
-               },
-
-               invalidElements: function() {
-                       return $(this.errorList).map(function() {
-                               return this.element;
-                       });
-               },
-
-               showLabel: function(element, message) {
-                       var label = this.errorsFor( element );
-                       if ( label.length ) {
-                               // refresh error/success class
-                               label.removeClass().addClass( this.settings.errorClass );
-
-                               // check if we have a generated label, replace the message then
-                               label.attr("generated") && label.html(message);
-                       } else {
-                               // create label
-                               label = $("<" + this.settings.errorElement + "/>")
-                                       .attr({"for":  this.idOrName(element), generated: true})
-                                       .addClass(this.settings.errorClass)
-                                       .html(message || "");
-                               if ( this.settings.wrapper ) {
-                                       // make sure the element is visible, even in IE
-                                       // actually showing the wrapped element is handled elsewhere
-                                       label = label.hide().show().wrap("<" + this.settings.wrapper + "/>").parent();
-                               }
-                               if ( !this.labelContainer.append(label).length )
-                                       this.settings.errorPlacement
-                                               ? this.settings.errorPlacement(label, $(element) )
-                                               : label.insertAfter(element);
-                       }
-                       if ( !message && this.settings.success ) {
-                               label.text("");
-                               typeof this.settings.success == "string"
-                                       ? label.addClass( this.settings.success )
-                                       : this.settings.success( label );
-                       }
-                       this.toShow = this.toShow.add(label);
-               },
-
-               errorsFor: function(element) {
-                       var name = this.idOrName(element);
-               return this.errors().filter(function() {
-                               return $(this).attr('for') == name;
-                       });
-               },
-
-               idOrName: function(element) {
-                       return this.groups[element.name] || (this.checkable(element) ? element.name : element.id || element.name);
-               },
-
-               checkable: function( element ) {
-                       return /radio|checkbox/i.test(element.type);
-               },
-
-               findByName: function( name ) {
-                       // select by name and filter by form for performance over form.find("[name=...]")
-                       var form = this.currentForm;
-                       return $(document.getElementsByName(name)).map(function(index, element) {
-                               return element.form == form && element.name == name && element  || null;
-                       });
-               },
-
-               getLength: function(value, element) {
-                       switch( element.nodeName.toLowerCase() ) {
-                       case 'select':
-                               return $("option:selected", element).length;
-                       case 'input':
-                               if( this.checkable( element) )
-                                       return this.findByName(element.name).filter(':checked').length;
-                       }
-                       return value.length;
-               },
-
-               depend: function(param, element) {
-                       return this.dependTypes[typeof param]
-                               ? this.dependTypes[typeof param](param, element)
-                               : true;
-               },
-
-               dependTypes: {
-                       "boolean": function(param, element) {
-                               return param;
-                       },
-                       "string": function(param, element) {
-                               return !!$(param, element.form).length;
-                       },
-                       "function": function(param, element) {
-                               return param(element);
-                       }
-               },
-
-               optional: function(element) {
-                       return !$.validator.methods.required.call(this, $.trim(element.value), element) && "dependency-mismatch";
-               },
-
-               startRequest: function(element) {
-                       if (!this.pending[element.name]) {
-                               this.pendingRequest++;
-                               this.pending[element.name] = true;
-                       }
-               },
-
-               stopRequest: function(element, valid) {
-                       this.pendingRequest--;
-                       // sometimes synchronization fails, make sure pendingRequest is never < 0
-                       if (this.pendingRequest < 0)
-                               this.pendingRequest = 0;
-                       delete this.pending[element.name];
-                       if ( valid && this.pendingRequest == 0 && this.formSubmitted && this.form() ) {
-                               $(this.currentForm).submit();
-                               this.formSubmitted = false;
-                       } else if (!valid && this.pendingRequest == 0 && this.formSubmitted) {
-                               $(this.currentForm).triggerHandler("invalid-form", [this]);
-                               this.formSubmitted = false;
-                       }
-               },
-
-               previousValue: function(element) {
-                       return $.data(element, "previousValue") || $.data(element, "previousValue", {
-                               old: null,
-                               valid: true,
-                               message: this.defaultMessage( element, "remote" )
-                       });
-               }
-
-       },
-
-       classRuleSettings: {
-               required: {required: true},
-               email: {email: true},
-               url: {url: true},
-               date: {date: true},
-               dateISO: {dateISO: true},
-               dateDE: {dateDE: true},
-               number: {number: true},
-               numberDE: {numberDE: true},
-               digits: {digits: true},
-               creditcard: {creditcard: true}
-       },
-
-       addClassRules: function(className, rules) {
-               className.constructor == String ?
-                       this.classRuleSettings[className] = rules :
-                       $.extend(this.classRuleSettings, className);
-       },
-
-       classRules: function(element) {
-               var rules = {};
-               var classes = $(element).attr('class');
-               classes && $.each(classes.split(' '), function() {
-                       if (this in $.validator.classRuleSettings) {
-                               $.extend(rules, $.validator.classRuleSettings[this]);
-                       }
-               });
-               return rules;
-       },
-
-       attributeRules: function(element) {
-               var rules = {};
-               var $element = $(element);
-
-               for (var method in $.validator.methods) {
-                       var value = $element.attr(method);
-                       if (value) {
-                               rules[method] = value;
-                       }
-               }
-
-               // maxlength may be returned as -1, 2147483647 (IE) and 524288 (safari) for text inputs
-               if (rules.maxlength && /-1|2147483647|524288/.test(rules.maxlength)) {
-                       delete rules.maxlength;
-               }
-
-               return rules;
-       },
-
-       metadataRules: function(element) {
-               if (!$.metadata) return {};
-
-               var meta = $.data(element.form, 'validator').settings.meta;
-               return meta ?
-                       $(element).metadata()[meta] :
-                       $(element).metadata();
-       },
-
-       staticRules: function(element) {
-               var rules = {};
-               var validator = $.data(element.form, 'validator');
-               if (validator.settings.rules) {
-                       rules = $.validator.normalizeRule(validator.settings.rules[element.name]) || {};
-               }
-               return rules;
-       },
-
-       normalizeRules: function(rules, element) {
-               // handle dependency check
-               $.each(rules, function(prop, val) {
-                       // ignore rule when param is explicitly false, eg. required:false
-                       if (val === false) {
-                               delete rules[prop];
-                               return;
-                       }
-                       if (val.param || val.depends) {
-                               var keepRule = true;
-                               switch (typeof val.depends) {
-                                       case "string":
-                                               keepRule = !!$(val.depends, element.form).length;
-                                               break;
-                                       case "function":
-                                               keepRule = val.depends.call(element, element);
-                                               break;
-                               }
-                               if (keepRule) {
-                                       rules[prop] = val.param !== undefined ? val.param : true;
-                               } else {
-                                       delete rules[prop];
-                               }
-                       }
-               });
-
-               // evaluate parameters
-               $.each(rules, function(rule, parameter) {
-                       rules[rule] = $.isFunction(parameter) ? parameter(element) : parameter;
-               });
-
-               // clean number parameters
-               $.each(['minlength', 'maxlength', 'min', 'max'], function() {
-                       if (rules[this]) {
-                               rules[this] = Number(rules[this]);
-                       }
-               });
-               $.each(['rangelength', 'range'], function() {
-                       if (rules[this]) {
-                               rules[this] = [Number(rules[this][0]), Number(rules[this][1])];
-                       }
-               });
-
-               if ($.validator.autoCreateRanges) {
-                       // auto-create ranges
-                       if (rules.min && rules.max) {
-                               rules.range = [rules.min, rules.max];
-                               delete rules.min;
-                               delete rules.max;
-                       }
-                       if (rules.minlength && rules.maxlength) {
-                               rules.rangelength = [rules.minlength, rules.maxlength];
-                               delete rules.minlength;
-                               delete rules.maxlength;
-                       }
-               }
-
-               // To support custom messages in metadata ignore rule methods titled "messages"
-               if (rules.messages) {
-                       delete rules.messages;
-               }
-
-               return rules;
-       },
-
-       // Converts a simple string to a {string: true} rule, e.g., "required" to {required:true}
-       normalizeRule: function(data) {
-               if( typeof data == "string" ) {
-                       var transformed = {};
-                       $.each(data.split(/\s/), function() {
-                               transformed[this] = true;
-                       });
-                       data = transformed;
-               }
-               return data;
-       },
-
-       // http://docs.jquery.com/Plugins/Validation/Validator/addMethod
-       addMethod: function(name, method, message) {
-               $.validator.methods[name] = method;
-               $.validator.messages[name] = message != undefined ? message : $.validator.messages[name];
-               if (method.length < 3) {
-                       $.validator.addClassRules(name, $.validator.normalizeRule(name));
-               }
-       },
-
-       methods: {
-
-               // http://docs.jquery.com/Plugins/Validation/Methods/required
-               required: function(value, element, param) {
-                       // check if dependency is met
-                       if ( !this.depend(param, element) )
-                               return "dependency-mismatch";
-                       switch( element.nodeName.toLowerCase() ) {
-                       case 'select':
-                               // could be an array for select-multiple or a string, both are fine this way
-                               var val = $(element).val();
-                               return val && val.length > 0;
-                       case 'input':
-                               if ( this.checkable(element) )
-                                       return this.getLength(value, element) > 0;
-                       default:
-                               return $.trim(value).length > 0;
-                       }
-               },
-
-               // http://docs.jquery.com/Plugins/Validation/Methods/remote
-               remote: function(value, element, param) {
-                       if ( this.optional(element) )
-                               return "dependency-mismatch";
-
-                       var previous = this.previousValue(element);
-                       if (!this.settings.messages[element.name] )
-                               this.settings.messages[element.name] = {};
-                       previous.originalMessage = this.settings.messages[element.name].remote;
-                       this.settings.messages[element.name].remote = previous.message;
-
-                       param = typeof param == "string" && {url:param} || param;
-
-                       if ( this.pending[element.name] ) {
-                               return "pending";
-                       }
-                       if ( previous.old === value ) {
-                               return previous.valid;
-                       }
-
-                       previous.old = value;
-                       var validator = this;
-                       this.startRequest(element);
-                       var data = {};
-                       data[element.name] = value;
-                       $.ajax($.extend(true, {
-                               url: param,
-                               mode: "abort",
-                               port: "validate" + element.name,
-                               dataType: "json",
-                               data: data,
-                               success: function(response) {
-                                       validator.settings.messages[element.name].remote = previous.originalMessage;
-                                       var valid = response === true;
-                                       if ( valid ) {
-                                               var submitted = validator.formSubmitted;
-                                               validator.prepareElement(element);
-                                               validator.formSubmitted = submitted;
-                                               validator.successList.push(element);
-                                               validator.showErrors();
-                                       } else {
-                                               var errors = {};
-                                               var message = response || validator.defaultMessage( element, "remote" );
-                                               errors[element.name] = previous.message = $.isFunction(message) ? message(value) : message;
-                                               validator.showErrors(errors);
-                                       }
-                                       previous.valid = valid;
-                                       validator.stopRequest(element, valid);
-                               }
-                       }, param));
-                       return "pending";
-               },
-
-               // http://docs.jquery.com/Plugins/Validation/Methods/minlength
-               minlength: function(value, element, param) {
-                       return this.optional(element) || this.getLength($.trim(value), element) >= param;
-               },
-
-               // http://docs.jquery.com/Plugins/Validation/Methods/maxlength
-               maxlength: function(value, element, param) {
-                       return this.optional(element) || this.getLength($.trim(value), element) <= param;
-               },
-
-               // http://docs.jquery.com/Plugins/Validation/Methods/rangelength
-               rangelength: function(value, element, param) {
-                       var length = this.getLength($.trim(value), element);
-                       return this.optional(element) || ( length >= param[0] && length <= param[1] );
-               },
-
-               // http://docs.jquery.com/Plugins/Validation/Methods/min
-               min: function( value, element, param ) {
-                       return this.optional(element) || value >= param;
-               },
-
-               // http://docs.jquery.com/Plugins/Validation/Methods/max
-               max: function( value, element, param ) {
-                       return this.optional(element) || value <= param;
-               },
-
-               // http://docs.jquery.com/Plugins/Validation/Methods/range
-               range: function( value, element, param ) {
-                       return this.optional(element) || ( value >= param[0] && value <= param[1] );
-               },
-
-               // http://docs.jquery.com/Plugins/Validation/Methods/email
-               email: function(value, element) {
-                       // contributed by Scott Gonzalez: http://projects.scottsplayground.com/email_address_validation/
-                       return this.optional(element) || /^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?$/i.test(value);
-               },
-
-               // http://docs.jquery.com/Plugins/Validation/Methods/url
-               url: function(value, element) {
-                       // contributed by Scott Gonzalez: http://projects.scottsplayground.com/iri/
-                       return this.optional(element) || /^(https?|ftp):\/\/(((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:)*@)?(((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5]))|((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?)(:\d*)?)(\/((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)+(\/(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*)?)?(\?((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|[\uE000-\uF8FF]|\/|\?)*)?(\#((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|\/|\?)*)?$/i.test(value);
-               },
-
-               // http://docs.jquery.com/Plugins/Validation/Methods/date
-               date: function(value, element) {
-                       return this.optional(element) || !/Invalid|NaN/.test(new Date(value));
-               },
-
-               // http://docs.jquery.com/Plugins/Validation/Methods/dateISO
-               dateISO: function(value, element) {
-                       return this.optional(element) || /^\d{4}[\/-]\d{1,2}[\/-]\d{1,2}$/.test(value);
-               },
-
-               // http://docs.jquery.com/Plugins/Validation/Methods/number
-               number: function(value, element) {
-                       return this.optional(element) || /^-?(?:\d+|\d{1,3}(?:,\d{3})+)(?:\.\d+)?$/.test(value);
-               },
-
-               // http://docs.jquery.com/Plugins/Validation/Methods/digits
-               digits: function(value, element) {
-                       return this.optional(element) || /^\d+$/.test(value);
-               },
-
-               // http://docs.jquery.com/Plugins/Validation/Methods/creditcard
-               // based on http://en.wikipedia.org/wiki/Luhn
-               creditcard: function(value, element) {
-                       if ( this.optional(element) )
-                               return "dependency-mismatch";
-                       // accept only digits and dashes
-                       if (/[^0-9-]+/.test(value))
-                               return false;
-                       var nCheck = 0,
-                               nDigit = 0,
-                               bEven = false;
-
-                       value = value.replace(/\D/g, "");
-
-                       for (var n = value.length - 1; n >= 0; n--) {
-                               var cDigit = value.charAt(n);
-                               var nDigit = parseInt(cDigit, 10);
-                               if (bEven) {
-                                       if ((nDigit *= 2) > 9)
-                                               nDigit -= 9;
-                               }
-                               nCheck += nDigit;
-                               bEven = !bEven;
-                       }
-
-                       return (nCheck % 10) == 0;
-               },
-
-               // http://docs.jquery.com/Plugins/Validation/Methods/accept
-               accept: function(value, element, param) {
-                       param = typeof param == "string" ? param.replace(/,/g, '|') : "png|jpe?g|gif";
-                       return this.optional(element) || value.match(new RegExp(".(" + param + ")$", "i"));
-               },
-
-               // http://docs.jquery.com/Plugins/Validation/Methods/equalTo
-               equalTo: function(value, element, param) {
-                       // bind to the blur event of the target in order to revalidate whenever the target field is updated
-                       // TODO find a way to bind the event just once, avoiding the unbind-rebind overhead
-                       var target = $(param).unbind(".validate-equalTo").bind("blur.validate-equalTo", function() {
-                               $(element).valid();
-                       });
-                       return value == target.val();
-               }
-
-       }
-
-});
-
-// deprecated, use $.validator.format instead
-$.format = $.validator.format;
-
-})(jQuery);
-
-// ajax mode: abort
-// usage: $.ajax({ mode: "abort"[, port: "uniqueport"]});
-// if mode:"abort" is used, the previous request on that port (port can be undefined) is aborted via XMLHttpRequest.abort()
-;(function($) {
-       var pendingRequests = {};
-       // Use a prefilter if available (1.5+)
-       if ( $.ajaxPrefilter ) {
-               $.ajaxPrefilter(function(settings, _, xhr) {
-                       var port = settings.port;
-                       if (settings.mode == "abort") {
-                               if ( pendingRequests[port] ) {
-                                       pendingRequests[port].abort();
-                               }
-                               pendingRequests[port] = xhr;
-                       }
-               });
-       } else {
-               // Proxy ajax
-               var ajax = $.ajax;
-               $.ajax = function(settings) {
-                       var mode = ( "mode" in settings ? settings : $.ajaxSettings ).mode,
-                               port = ( "port" in settings ? settings : $.ajaxSettings ).port;
-                       if (mode == "abort") {
-                               if ( pendingRequests[port] ) {
-                                       pendingRequests[port].abort();
-                               }
-                               return (pendingRequests[port] = ajax.apply(this, arguments));
-                       }
-                       return ajax.apply(this, arguments);
-               };
-       }
-})(jQuery);
-
-// provides cross-browser focusin and focusout events
-// IE has native support, in other browsers, use event caputuring (neither bubbles)
-
-// provides delegate(type: String, delegate: Selector, handler: Callback) plugin for easier event delegation
-// handler is only called when $(event.target).is(delegate), in the scope of the jquery-object for event.target
-;(function($) {
-       // only implement if not provided by jQuery core (since 1.4)
-       // TODO verify if jQuery 1.4's implementation is compatible with older jQuery special-event APIs
-       if (!jQuery.event.special.focusin && !jQuery.event.special.focusout && document.addEventListener) {
-               $.each({
-                       focus: 'focusin',
-                       blur: 'focusout'
-               }, function( original, fix ){
-                       $.event.special[fix] = {
-                               setup:function() {
-                                       this.addEventListener( original, handler, true );
-                               },
-                               teardown:function() {
-                                       this.removeEventListener( original, handler, true );
-                               },
-                               handler: function(e) {
-                                       arguments[0] = $.event.fix(e);
-                                       arguments[0].type = fix;
-                                       return $.event.handle.apply(this, arguments);
-                               }
-                       };
-                       function handler(e) {
-                               e = $.event.fix(e);
-                               e.type = fix;
-                               return $.event.handle.call(this, e);
-                       }
-               });
-       };
-       $.extend($.fn, {
-               validateDelegate: function(delegate, type, handler) {
-                       return this.bind(type, function(event) {
-                               var target = $(event.target);
-                               if (target.is(delegate)) {
-                                       return handler.apply(target, arguments);
-                               }
-                       });
-               }
-       });
-})(jQuery);
diff --git a/resources/jquery/jquery.xmldom.js b/resources/jquery/jquery.xmldom.js
deleted file mode 100644 (file)
index 85d0083..0000000
+++ /dev/null
@@ -1,46 +0,0 @@
-/*!
- * jQuery xmlDOM Plugin v1.0
- * http://outwestmedia.com/jquery-plugins/xmldom/
- *
- * Released: 2009-04-06
- * Version: 1.0
- *
- * Copyright (c) 2009 Jonathan Sharp, Out West Media LLC.
- * Dual licensed under the MIT and GPL licenses.
- * http://docs.jquery.com/License
- */
-(function($) {
-       // IE DOMParser wrapper
-       if ( window['DOMParser'] == undefined && window.ActiveXObject ) {
-               DOMParser = function() { };
-               DOMParser.prototype.parseFromString = function( xmlString ) {
-                       var doc = new ActiveXObject('Microsoft.XMLDOM');
-               doc.async = 'false';
-               doc.loadXML( xmlString );
-                       return doc;
-               };
-       }
-       
-       $.xmlDOM = function(xml, onErrorFn) {
-               try {
-                       var xmlDoc      = ( new DOMParser() ).parseFromString( xml, 'text/xml' );
-                       if ( $.isXMLDoc( xmlDoc ) ) {
-                               var err = $('parsererror', xmlDoc);
-                               if ( err.length == 1 ) {
-                                       throw('Error: ' + $(xmlDoc).text() );
-                               }
-                       } else {
-                               throw('Unable to parse XML');
-                       }
-               } catch( e ) {
-                       var msg = ( e.name == undefined ? e : e.name + ': ' + e.message );
-                       if ( $.isFunction( onErrorFn ) ) {
-                               onErrorFn( msg );
-                       } else {
-                               $(document).trigger('xmlParseError', [ msg ]);
-                       }
-                       return $([]);
-               }
-               return $( xmlDoc );
-       };
-})(jQuery);
\ No newline at end of file
diff --git a/resources/lib/jquery.chosen/LICENSE b/resources/lib/jquery.chosen/LICENSE
new file mode 100644 (file)
index 0000000..0675dc5
--- /dev/null
@@ -0,0 +1,24 @@
+# Chosen, a Select Box Enhancer for jQuery and Protoype
+## by Patrick Filler for [Harvest](http://getharvest.com)
+
+Available for use under the [MIT License](http://en.wikipedia.org/wiki/MIT_License)
+
+Copyright (c) 2011-2013 by Harvest
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/resources/lib/jquery.chosen/chosen-sprite.png b/resources/lib/jquery.chosen/chosen-sprite.png
new file mode 100644 (file)
index 0000000..3611ae4
Binary files /dev/null and b/resources/lib/jquery.chosen/chosen-sprite.png differ
diff --git a/resources/lib/jquery.chosen/chosen-sprite@2x.png b/resources/lib/jquery.chosen/chosen-sprite@2x.png
new file mode 100644 (file)
index 0000000..bd61d96
Binary files /dev/null and b/resources/lib/jquery.chosen/chosen-sprite@2x.png differ
diff --git a/resources/lib/jquery.chosen/chosen.css b/resources/lib/jquery.chosen/chosen.css
new file mode 100644 (file)
index 0000000..17793ed
--- /dev/null
@@ -0,0 +1,440 @@
+/* @group Base */
+.chzn-container {
+  font-size: 13px;
+  position: relative;
+  display: inline-block;
+  vertical-align: middle;
+  zoom: 1;
+  *display: inline;
+}
+.chzn-container .chzn-drop {
+  background: #fff;
+  border: 1px solid #aaa;
+  border-top: 0;
+  position: absolute;
+  top: 100%;
+  left: -9999px;
+  -webkit-box-shadow: 0 4px 5px rgba(0,0,0,.15);
+  -moz-box-shadow   : 0 4px 5px rgba(0,0,0,.15);
+  box-shadow        : 0 4px 5px rgba(0,0,0,.15);
+  z-index: 1010;
+  width: 100%;
+  -moz-box-sizing   : border-box;
+  -ms-box-sizing    : border-box;
+  -webkit-box-sizing: border-box;
+  -khtml-box-sizing : border-box;
+  box-sizing        : border-box;
+}
+
+.chzn-container.chzn-with-drop .chzn-drop {
+  left: 0;
+}
+
+/* @end */
+
+/* @group Single Chosen */
+.chzn-container-single .chzn-single {
+  background-color: #ffffff;
+  filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#ffffff', endColorstr='#eeeeee', GradientType=0 );   
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, color-stop(20%, #ffffff), color-stop(50%, #f6f6f6), color-stop(52%, #eeeeee), color-stop(100%, #f4f4f4));
+  background-image: -webkit-linear-gradient(top, #ffffff 20%, #f6f6f6 50%, #eeeeee 52%, #f4f4f4 100%);
+  background-image: -moz-linear-gradient(top, #ffffff 20%, #f6f6f6 50%, #eeeeee 52%, #f4f4f4 100%);
+  background-image: -o-linear-gradient(top, #ffffff 20%, #f6f6f6 50%, #eeeeee 52%, #f4f4f4 100%);
+  background-image: linear-gradient(#ffffff 20%, #f6f6f6 50%, #eeeeee 52%, #f4f4f4 100%); 
+  -webkit-border-radius: 5px;
+  -moz-border-radius   : 5px;
+  border-radius        : 5px;
+  -moz-background-clip   : padding;
+  -webkit-background-clip: padding-box;
+  background-clip        : padding-box;
+  border: 1px solid #aaaaaa;
+  -webkit-box-shadow: 0 0 3px #ffffff inset, 0 1px 1px rgba(0,0,0,0.1);
+  -moz-box-shadow   : 0 0 3px #ffffff inset, 0 1px 1px rgba(0,0,0,0.1);
+  box-shadow        : 0 0 3px #ffffff inset, 0 1px 1px rgba(0,0,0,0.1);
+  display: block;
+  overflow: hidden;
+  white-space: nowrap;
+  position: relative;
+  height: 23px;
+  line-height: 24px;
+  padding: 0 0 0 8px;
+  color: #444444;
+  text-decoration: none;
+}
+.chzn-container-single .chzn-default {
+  color: #999;
+}
+.chzn-container-single .chzn-single span {
+  margin-right: 26px;
+  display: block;
+  overflow: hidden;
+  white-space: nowrap;
+  -o-text-overflow: ellipsis;
+  -ms-text-overflow: ellipsis;
+  text-overflow: ellipsis;
+}
+.chzn-container-single .chzn-single abbr {
+  display: block;
+  position: absolute;
+  right: 26px;
+  top: 6px;
+  width: 12px;
+  height: 12px;
+  font-size: 1px;
+  background: url('chosen-sprite.png') -42px 1px no-repeat;
+}
+.chzn-container-single .chzn-single abbr:hover {
+  background-position: -42px -10px;
+}
+.chzn-container-single.chzn-disabled .chzn-single abbr:hover {
+  background-position: -42px -10px;
+}
+.chzn-container-single .chzn-single div {
+  position: absolute;
+  right: 0;
+  top: 0;
+  display: block;
+  height: 100%;
+  width: 18px;
+}
+.chzn-container-single .chzn-single div b {
+  background: url('chosen-sprite.png') no-repeat 0px 2px;
+  display: block;
+  width: 100%;
+  height: 100%;
+}
+.chzn-container-single .chzn-search {
+  padding: 3px 4px;
+  position: relative;
+  margin: 0;
+  white-space: nowrap;
+  z-index: 1010;
+}
+.chzn-container-single .chzn-search input {
+  background: #fff url('chosen-sprite.png') no-repeat 100% -20px;
+  background: url('chosen-sprite.png') no-repeat 100% -20px, -webkit-gradient(linear, 0 0, 0 100%, color-stop(1%, #eeeeee), color-stop(15%, #ffffff));
+  background: url('chosen-sprite.png') no-repeat 100% -20px, -webkit-linear-gradient(top, #eeeeee 1%, #ffffff 15%);
+  background: url('chosen-sprite.png') no-repeat 100% -20px, -moz-linear-gradient(top, #eeeeee 1%, #ffffff 15%);
+  background: url('chosen-sprite.png') no-repeat 100% -20px, -o-linear-gradient(top, #eeeeee 1%, #ffffff 15%);
+  background: url('chosen-sprite.png') no-repeat 100% -20px, linear-gradient(#eeeeee 1%, #ffffff 15%);
+  margin: 1px 0;
+  padding: 4px 20px 4px 5px;
+  outline: 0;
+  border: 1px solid #aaa;
+  font-family: sans-serif;
+  font-size: 1em;
+  width: 100%;
+  -moz-box-sizing   : border-box;
+  -ms-box-sizing    : border-box;
+  -webkit-box-sizing: border-box;
+  -khtml-box-sizing : border-box;
+  box-sizing        : border-box;
+}
+.chzn-container-single .chzn-drop {
+  margin-top: -1px;
+  -webkit-border-radius: 0 0 4px 4px;
+  -moz-border-radius   : 0 0 4px 4px;
+  border-radius        : 0 0 4px 4px;
+  -moz-background-clip   : padding;
+  -webkit-background-clip: padding-box;
+  background-clip        : padding-box;
+}
+.chzn-container-single-nosearch .chzn-search {
+  position: absolute;
+  left: -9999px;
+}
+/* @end */
+
+/* @group Multi Chosen */
+.chzn-container-multi .chzn-choices {
+  background-color: #fff;
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, color-stop(1%, #eeeeee), color-stop(15%, #ffffff));
+  background-image: -webkit-linear-gradient(top, #eeeeee 1%, #ffffff 15%);
+  background-image: -moz-linear-gradient(top, #eeeeee 1%, #ffffff 15%);
+  background-image: -o-linear-gradient(top, #eeeeee 1%, #ffffff 15%);
+  background-image: linear-gradient(#eeeeee 1%, #ffffff 15%);
+  border: 1px solid #aaa;
+  margin: 0;
+  padding: 0;
+  cursor: text;
+  overflow: hidden;
+  height: auto !important;
+  height: 1%;
+  position: relative;
+  width: 100%;
+  -moz-box-sizing   : border-box;
+  -ms-box-sizing    : border-box;
+  -webkit-box-sizing: border-box;
+  -khtml-box-sizing : border-box;
+  box-sizing        : border-box;
+}
+.chzn-container-multi .chzn-choices li {
+  float: left;
+  list-style: none;
+}
+.chzn-container-multi .chzn-choices .search-field {
+  white-space: nowrap;
+  margin: 0;
+  padding: 0;
+}
+.chzn-container-multi .chzn-choices .search-field input {
+  color: #666;
+  background: transparent !important;
+  border: 0 !important;
+  font-family: sans-serif;
+  font-size: 100%;
+  height: 15px;
+  padding: 5px;
+  margin: 1px 0;
+  outline: 0;
+  -webkit-box-shadow: none;
+  -moz-box-shadow   : none;
+  box-shadow        : none;
+}
+.chzn-container-multi .chzn-choices .search-field .default {
+  color: #999;
+}
+.chzn-container-multi .chzn-choices .search-choice {
+  -webkit-border-radius: 3px;
+  -moz-border-radius   : 3px;
+  border-radius        : 3px;
+  -moz-background-clip   : padding;
+  -webkit-background-clip: padding-box;
+  background-clip        : padding-box;
+  background-color: #e4e4e4;
+  filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#f4f4f4', endColorstr='#eeeeee', GradientType=0 ); 
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, color-stop(20%, #f4f4f4), color-stop(50%, #f0f0f0), color-stop(52%, #e8e8e8), color-stop(100%, #eeeeee));
+  background-image: -webkit-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);
+  background-image: -moz-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);
+  background-image: -o-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);
+  background-image: linear-gradient(#f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%); 
+  -webkit-box-shadow: 0 0 2px #ffffff inset, 0 1px 0 rgba(0,0,0,0.05);
+  -moz-box-shadow   : 0 0 2px #ffffff inset, 0 1px 0 rgba(0,0,0,0.05);
+  box-shadow        : 0 0 2px #ffffff inset, 0 1px 0 rgba(0,0,0,0.05);
+  color: #333;
+  border: 1px solid #aaaaaa;
+  line-height: 13px;
+  padding: 3px 20px 3px 5px;
+  margin: 3px 0 3px 5px;
+  position: relative;
+  cursor: default;
+}
+.chzn-container-multi .chzn-choices .search-choice.search-choice-disabled {
+  background-color: #e4e4e4;
+  filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#f4f4f4', endColorstr='#eeeeee', GradientType=0 );
+  background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, color-stop(20%, #f4f4f4), color-stop(50%, #f0f0f0), color-stop(52%, #e8e8e8), color-stop(100%, #eeeeee));
+  background-image: -webkit-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);
+  background-image: -moz-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);
+  background-image: -o-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);
+  background-image: -ms-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);
+  background-image: linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);
+  color: #666;
+  border: 1px solid #cccccc;
+  padding-right: 5px;
+}
+.chzn-container-multi .chzn-choices .search-choice-focus {
+  background: #d4d4d4;
+}
+.chzn-container-multi .chzn-choices .search-choice .search-choice-close {
+  display: block;
+  position: absolute;
+  right: 3px;
+  top: 4px;
+  width: 12px;
+  height: 12px;
+  font-size: 1px;
+  background: url('chosen-sprite.png') -42px 1px no-repeat;
+}
+.chzn-container-multi .chzn-choices .search-choice .search-choice-close:hover {
+  background-position: -42px -10px;
+}
+.chzn-container-multi .chzn-choices .search-choice-focus .search-choice-close {
+  background-position: -42px -10px;
+}
+/* @end */
+
+/* @group Results */
+.chzn-container .chzn-results {
+  margin: 0 4px 4px 0;
+  max-height: 240px;
+  padding: 0 0 0 4px;
+  position: relative;
+  overflow-x: hidden;
+  overflow-y: auto;
+  -webkit-overflow-scrolling: touch;
+}
+.chzn-container-multi .chzn-results {
+  margin: 0;
+  padding: 0;
+}
+.chzn-container .chzn-results li {
+  display: none;
+  line-height: 15px;
+  padding: 5px 6px;
+  margin: 0;
+  list-style: none;
+}
+.chzn-container .chzn-results .active-result {
+  cursor: pointer;
+  display: list-item;
+}
+.chzn-container .chzn-results .highlighted {
+  background-color: #3875d7;
+  filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#3875d7', endColorstr='#2a62bc', GradientType=0 );  
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, color-stop(20%, #3875d7), color-stop(90%, #2a62bc));
+  background-image: -webkit-linear-gradient(top, #3875d7 20%, #2a62bc 90%);
+  background-image: -moz-linear-gradient(top, #3875d7 20%, #2a62bc 90%);
+  background-image: -o-linear-gradient(top, #3875d7 20%, #2a62bc 90%);
+  background-image: linear-gradient(#3875d7 20%, #2a62bc 90%);
+  color: #fff;
+}
+.chzn-container .chzn-results li em {
+  background: #feffde;
+  font-style: normal;
+}
+.chzn-container .chzn-results .highlighted em {
+  background: transparent;
+}
+.chzn-container .chzn-results .no-results {
+  background: #f4f4f4;
+  display: list-item;
+}
+.chzn-container .chzn-results .group-result {
+  cursor: default;
+  color: #999;
+  font-weight: bold;
+}
+.chzn-container .chzn-results .group-option {
+  padding-left: 15px;
+}
+.chzn-container-multi .chzn-drop .result-selected {
+  display: none;
+}
+.chzn-container .chzn-results-scroll {
+  background: white;
+  margin: 0 4px;
+  position: absolute;
+  text-align: center;
+  width: 321px; /* This should by dynamic with js */
+  z-index: 1;
+}
+.chzn-container .chzn-results-scroll span {
+  display: inline-block;
+  height: 17px;
+  text-indent: -5000px;
+  width: 9px;
+}
+.chzn-container .chzn-results-scroll-down {
+  bottom: 0;
+}
+.chzn-container .chzn-results-scroll-down span {
+  background: url('chosen-sprite.png') no-repeat -4px -3px;
+}
+.chzn-container .chzn-results-scroll-up span {
+  background: url('chosen-sprite.png') no-repeat -22px -3px;
+}
+/* @end */
+
+/* @group Active  */
+.chzn-container-active .chzn-single {
+  -webkit-box-shadow: 0 0 5px rgba(0,0,0,.3);
+  -moz-box-shadow   : 0 0 5px rgba(0,0,0,.3);
+  box-shadow        : 0 0 5px rgba(0,0,0,.3);
+  border: 1px solid #5897fb;
+}
+.chzn-container-active.chzn-with-drop .chzn-single {
+  border: 1px solid #aaa;
+  -webkit-box-shadow: 0 1px 0 #fff inset;
+  -moz-box-shadow   : 0 1px 0 #fff inset;
+  box-shadow        : 0 1px 0 #fff inset;
+  background-color: #eee;
+  filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#eeeeee', endColorstr='#ffffff', GradientType=0 );
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, color-stop(20%, #eeeeee), color-stop(80%, #ffffff));
+  background-image: -webkit-linear-gradient(top, #eeeeee 20%, #ffffff 80%);
+  background-image: -moz-linear-gradient(top, #eeeeee 20%, #ffffff 80%);
+  background-image: -o-linear-gradient(top, #eeeeee 20%, #ffffff 80%);
+  background-image: linear-gradient(#eeeeee 20%, #ffffff 80%);
+  -webkit-border-bottom-left-radius : 0;
+  -webkit-border-bottom-right-radius: 0;
+  -moz-border-radius-bottomleft : 0;
+  -moz-border-radius-bottomright: 0;
+  border-bottom-left-radius : 0;
+  border-bottom-right-radius: 0;
+}
+.chzn-container-active.chzn-with-drop .chzn-single div {
+  background: transparent;
+  border-left: none;
+}
+.chzn-container-active.chzn-with-drop .chzn-single div b {
+  background-position: -18px 2px;
+}
+.chzn-container-active .chzn-choices {
+  -webkit-box-shadow: 0 0 5px rgba(0,0,0,.3);
+  -moz-box-shadow   : 0 0 5px rgba(0,0,0,.3);
+  box-shadow        : 0 0 5px rgba(0,0,0,.3);
+  border: 1px solid #5897fb;
+}
+.chzn-container-active .chzn-choices .search-field input {
+  color: #111 !important;
+}
+/* @end */
+
+/* @group Disabled Support */
+.chzn-disabled {
+  cursor: default;
+  opacity:0.5 !important;
+}
+.chzn-disabled .chzn-single {
+  cursor: default;
+}
+.chzn-disabled .chzn-choices .search-choice .search-choice-close {
+  cursor: default;
+}
+
+/* @group Right to Left */
+.chzn-rtl { text-align: right; }
+.chzn-rtl .chzn-single { padding: 0 8px 0 0; overflow: visible; }
+.chzn-rtl .chzn-single span { margin-left: 26px; margin-right: 0; direction: rtl; }
+
+.chzn-rtl .chzn-single div { left: 3px; right: auto; }
+.chzn-rtl .chzn-single abbr {
+  left: 26px;
+  right: auto;
+}
+.chzn-rtl .chzn-choices .search-field input { direction: rtl; }
+.chzn-rtl .chzn-choices li { float: right; }
+.chzn-rtl .chzn-choices .search-choice { padding: 3px 5px 3px 19px; margin: 3px 5px 3px 0; }
+.chzn-rtl .chzn-choices .search-choice .search-choice-close { left: 4px; right: auto; }
+.chzn-rtl .chzn-search { left: 9999px; }
+.chzn-rtl.chzn-with-drop .chzn-search { left: 0px; }
+.chzn-rtl .chzn-drop { left: 9999px; }
+.chzn-rtl.chzn-container-single .chzn-results { margin: 0 0 4px 4px; padding: 0 4px 0 0; }
+.chzn-rtl .chzn-results .group-option { padding-left: 0; padding-right: 15px; }
+.chzn-rtl.chzn-container-active.chzn-with-drop .chzn-single div { border-right: none; }
+.chzn-rtl .chzn-search input {
+  background: #fff url('chosen-sprite.png') no-repeat -30px -20px;
+  background: url('chosen-sprite.png') no-repeat -30px -20px, -webkit-gradient(linear, 0 0, 0 100%, color-stop(1%, #eeeeee), color-stop(15%, #ffffff));
+  background: url('chosen-sprite.png') no-repeat -30px -20px, -webkit-linear-gradient(top, #eeeeee 1%, #ffffff 15%);  
+  background: url('chosen-sprite.png') no-repeat -30px -20px, -moz-linear-gradient(top, #eeeeee 1%, #ffffff 15%);
+  background: url('chosen-sprite.png') no-repeat -30px -20px, -o-linear-gradient(top, #eeeeee 1%, #ffffff 15%);
+  background: url('chosen-sprite.png') no-repeat -30px -20px, linear-gradient(#eeeeee 1%, #ffffff 15%);
+  padding: 4px 5px 4px 20px;
+  direction: rtl;
+}
+.chzn-container-single.chzn-rtl .chzn-single div b {
+  background-position: 6px 2px;
+}
+.chzn-container-single.chzn-rtl.chzn-with-drop .chzn-single div b {
+  background-position: -12px 2px;
+}
+/* @end */
+
+/* @group Retina compatibility */
+@media only screen and (-webkit-min-device-pixel-ratio: 2), only screen and (min-resolution: 144dpi)  {
+  .chzn-rtl .chzn-search input, .chzn-container-single .chzn-single abbr, .chzn-container-single .chzn-single div b, .chzn-container-single .chzn-search input, .chzn-container-multi .chzn-choices .search-choice .search-choice-close, .chzn-container .chzn-results-scroll-down span, .chzn-container .chzn-results-scroll-up span {
+      background-image: url('chosen-sprite@2x.png') !important;
+      background-repeat: no-repeat !important;
+      background-size: 52px 37px !important;
+  }
+}
+/* @end */
diff --git a/resources/lib/jquery.chosen/chosen.jquery.js b/resources/lib/jquery.chosen/chosen.jquery.js
new file mode 100644 (file)
index 0000000..745174f
--- /dev/null
@@ -0,0 +1,1103 @@
+// Chosen, a Select Box Enhancer for jQuery and Protoype
+// by Patrick Filler for Harvest, http://getharvest.com
+//
+// Version 0.9.14
+// Full source at https://github.com/harvesthq/chosen
+// Copyright (c) 2011 Harvest http://getharvest.com
+
+// MIT License, https://github.com/harvesthq/chosen/blob/master/LICENSE.md
+// This file is generated by `cake build`, do not edit it by hand.
+(function() {
+  var SelectParser;
+
+  SelectParser = (function() {
+
+    function SelectParser() {
+      this.options_index = 0;
+      this.parsed = [];
+    }
+
+    SelectParser.prototype.add_node = function(child) {
+      if (child.nodeName.toUpperCase() === "OPTGROUP") {
+        return this.add_group(child);
+      } else {
+        return this.add_option(child);
+      }
+    };
+
+    SelectParser.prototype.add_group = function(group) {
+      var group_position, option, _i, _len, _ref, _results;
+      group_position = this.parsed.length;
+      this.parsed.push({
+        array_index: group_position,
+        group: true,
+        label: group.label,
+        children: 0,
+        disabled: group.disabled
+      });
+      _ref = group.childNodes;
+      _results = [];
+      for (_i = 0, _len = _ref.length; _i < _len; _i++) {
+        option = _ref[_i];
+        _results.push(this.add_option(option, group_position, group.disabled));
+      }
+      return _results;
+    };
+
+    SelectParser.prototype.add_option = function(option, group_position, group_disabled) {
+      if (option.nodeName.toUpperCase() === "OPTION") {
+        if (option.text !== "") {
+          if (group_position != null) {
+            this.parsed[group_position].children += 1;
+          }
+          this.parsed.push({
+            array_index: this.parsed.length,
+            options_index: this.options_index,
+            value: option.value,
+            text: option.text,
+            html: option.innerHTML,
+            selected: option.selected,
+            disabled: group_disabled === true ? group_disabled : option.disabled,
+            group_array_index: group_position,
+            classes: option.className,
+            style: option.style.cssText
+          });
+        } else {
+          this.parsed.push({
+            array_index: this.parsed.length,
+            options_index: this.options_index,
+            empty: true
+          });
+        }
+        return this.options_index += 1;
+      }
+    };
+
+    return SelectParser;
+
+  })();
+
+  SelectParser.select_to_array = function(select) {
+    var child, parser, _i, _len, _ref;
+    parser = new SelectParser();
+    _ref = select.childNodes;
+    for (_i = 0, _len = _ref.length; _i < _len; _i++) {
+      child = _ref[_i];
+      parser.add_node(child);
+    }
+    return parser.parsed;
+  };
+
+  this.SelectParser = SelectParser;
+
+}).call(this);
+
+/*
+Chosen source: generate output using 'cake build'
+Copyright (c) 2011 by Harvest
+*/
+
+
+(function() {
+  var AbstractChosen, root;
+
+  root = this;
+
+  AbstractChosen = (function() {
+
+    function AbstractChosen(form_field, options) {
+      this.form_field = form_field;
+      this.options = options != null ? options : {};
+      if (!AbstractChosen.browser_is_supported()) {
+        return;
+      }
+      this.is_multiple = this.form_field.multiple;
+      this.set_default_text();
+      this.set_default_values();
+      this.setup();
+      this.set_up_html();
+      this.register_observers();
+      this.finish_setup();
+    }
+
+    AbstractChosen.prototype.set_default_values = function() {
+      var _this = this;
+      this.click_test_action = function(evt) {
+        return _this.test_active_click(evt);
+      };
+      this.activate_action = function(evt) {
+        return _this.activate_field(evt);
+      };
+      this.active_field = false;
+      this.mouse_on_container = false;
+      this.results_showing = false;
+      this.result_highlighted = null;
+      this.result_single_selected = null;
+      this.allow_single_deselect = (this.options.allow_single_deselect != null) && (this.form_field.options[0] != null) && this.form_field.options[0].text === "" ? this.options.allow_single_deselect : false;
+      this.disable_search_threshold = this.options.disable_search_threshold || 0;
+      this.disable_search = this.options.disable_search || false;
+      this.enable_split_word_search = this.options.enable_split_word_search != null ? this.options.enable_split_word_search : true;
+      this.search_contains = this.options.search_contains || false;
+      this.choices = 0;
+      this.single_backstroke_delete = this.options.single_backstroke_delete || false;
+      this.max_selected_options = this.options.max_selected_options || Infinity;
+      return this.inherit_select_classes = this.options.inherit_select_classes || false;
+    };
+
+    AbstractChosen.prototype.set_default_text = function() {
+      if (this.form_field.getAttribute("data-placeholder")) {
+        this.default_text = this.form_field.getAttribute("data-placeholder");
+      } else if (this.is_multiple) {
+        this.default_text = this.options.placeholder_text_multiple || this.options.placeholder_text || AbstractChosen.default_multiple_text;
+      } else {
+        this.default_text = this.options.placeholder_text_single || this.options.placeholder_text || AbstractChosen.default_single_text;
+      }
+      return this.results_none_found = this.form_field.getAttribute("data-no_results_text") || this.options.no_results_text || AbstractChosen.default_no_result_text;
+    };
+
+    AbstractChosen.prototype.mouse_enter = function() {
+      return this.mouse_on_container = true;
+    };
+
+    AbstractChosen.prototype.mouse_leave = function() {
+      return this.mouse_on_container = false;
+    };
+
+    AbstractChosen.prototype.input_focus = function(evt) {
+      var _this = this;
+      if (this.is_multiple) {
+        if (!this.active_field) {
+          return setTimeout((function() {
+            return _this.container_mousedown();
+          }), 50);
+        }
+      } else {
+        if (!this.active_field) {
+          return this.activate_field();
+        }
+      }
+    };
+
+    AbstractChosen.prototype.input_blur = function(evt) {
+      var _this = this;
+      if (!this.mouse_on_container) {
+        this.active_field = false;
+        return setTimeout((function() {
+          return _this.blur_test();
+        }), 100);
+      }
+    };
+
+    AbstractChosen.prototype.result_add_option = function(option) {
+      var classes, style;
+      if (!option.disabled) {
+        option.dom_id = this.container_id + "_o_" + option.array_index;
+        classes = option.selected && this.is_multiple ? [] : ["active-result"];
+        if (option.selected) {
+          classes.push("result-selected");
+        }
+        if (option.group_array_index != null) {
+          classes.push("group-option");
+        }
+        if (option.classes !== "") {
+          classes.push(option.classes);
+        }
+        style = option.style.cssText !== "" ? " style=\"" + option.style + "\"" : "";
+        return '<li id="' + option.dom_id + '" class="' + classes.join(' ') + '"' + style + '>' + option.html + '</li>';
+      } else {
+        return "";
+      }
+    };
+
+    AbstractChosen.prototype.results_update_field = function() {
+      this.set_default_text();
+      if (!this.is_multiple) {
+        this.results_reset_cleanup();
+      }
+      this.result_clear_highlight();
+      this.result_single_selected = null;
+      return this.results_build();
+    };
+
+    AbstractChosen.prototype.results_toggle = function() {
+      if (this.results_showing) {
+        return this.results_hide();
+      } else {
+        return this.results_show();
+      }
+    };
+
+    AbstractChosen.prototype.results_search = function(evt) {
+      if (this.results_showing) {
+        return this.winnow_results();
+      } else {
+        return this.results_show();
+      }
+    };
+
+    AbstractChosen.prototype.choices_click = function(evt) {
+      evt.preventDefault();
+      if (!this.results_showing) {
+        return this.results_show();
+      }
+    };
+
+    AbstractChosen.prototype.keyup_checker = function(evt) {
+      var stroke, _ref;
+      stroke = (_ref = evt.which) != null ? _ref : evt.keyCode;
+      this.search_field_scale();
+      switch (stroke) {
+        case 8:
+          if (this.is_multiple && this.backstroke_length < 1 && this.choices > 0) {
+            return this.keydown_backstroke();
+          } else if (!this.pending_backstroke) {
+            this.result_clear_highlight();
+            return this.results_search();
+          }
+          break;
+        case 13:
+          evt.preventDefault();
+          if (this.results_showing) {
+            return this.result_select(evt);
+          }
+          break;
+        case 27:
+          if (this.results_showing) {
+            this.results_hide();
+          }
+          return true;
+        case 9:
+        case 38:
+        case 40:
+        case 16:
+        case 91:
+        case 17:
+          break;
+        default:
+          return this.results_search();
+      }
+    };
+
+    AbstractChosen.prototype.generate_field_id = function() {
+      var new_id;
+      new_id = this.generate_random_id();
+      this.form_field.id = new_id;
+      return new_id;
+    };
+
+    AbstractChosen.prototype.generate_random_char = function() {
+      var chars, newchar, rand;
+      chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
+      rand = Math.floor(Math.random() * chars.length);
+      return newchar = chars.substring(rand, rand + 1);
+    };
+
+    AbstractChosen.prototype.container_width = function() {
+      var width;
+      if (this.options.width != null) {
+        return this.options.width;
+      }
+      width = window.getComputedStyle != null ? parseFloat(window.getComputedStyle(this.form_field).getPropertyValue('width')) : (typeof jQuery !== "undefined" && jQuery !== null) && (this.form_field_jq != null) ? this.form_field_jq.outerWidth() : this.form_field.getWidth();
+      return width + "px";
+    };
+
+    AbstractChosen.browser_is_supported = function() {
+      var _ref;
+      if (window.navigator.appName === "Microsoft Internet Explorer") {
+        return (null !== (_ref = document.documentMode) && _ref >= 8);
+      }
+      return true;
+    };
+
+    AbstractChosen.default_multiple_text = "Select Some Options";
+
+    AbstractChosen.default_single_text = "Select an Option";
+
+    AbstractChosen.default_no_result_text = "No results match";
+
+    return AbstractChosen;
+
+  })();
+
+  root.AbstractChosen = AbstractChosen;
+
+}).call(this);
+
+/*
+Chosen source: generate output using 'cake build'
+Copyright (c) 2011 by Harvest
+*/
+
+
+(function() {
+  var $, Chosen, root,
+    __hasProp = {}.hasOwnProperty,
+    __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; };
+
+  root = this;
+
+  $ = jQuery;
+
+  $.fn.extend({
+    chosen: function(options) {
+      if (!AbstractChosen.browser_is_supported()) {
+        return this;
+      }
+      return this.each(function(input_field) {
+        var $this;
+        $this = $(this);
+        if (!$this.hasClass("chzn-done")) {
+          return $this.data('chosen', new Chosen(this, options));
+        }
+      });
+    }
+  });
+
+  Chosen = (function(_super) {
+
+    __extends(Chosen, _super);
+
+    function Chosen() {
+      return Chosen.__super__.constructor.apply(this, arguments);
+    }
+
+    Chosen.prototype.setup = function() {
+      this.form_field_jq = $(this.form_field);
+      this.current_selectedIndex = this.form_field.selectedIndex;
+      return this.is_rtl = this.form_field_jq.hasClass("chzn-rtl");
+    };
+
+    Chosen.prototype.finish_setup = function() {
+      return this.form_field_jq.addClass("chzn-done");
+    };
+
+    Chosen.prototype.set_up_html = function() {
+      var container_classes, container_props;
+      this.container_id = this.form_field.id.length ? this.form_field.id.replace(/[^\w]/g, '_') : this.generate_field_id();
+      this.container_id += "_chzn";
+      container_classes = ["chzn-container"];
+      container_classes.push("chzn-container-" + (this.is_multiple ? "multi" : "single"));
+      if (this.inherit_select_classes && this.form_field.className) {
+        container_classes.push(this.form_field.className);
+      }
+      if (this.is_rtl) {
+        container_classes.push("chzn-rtl");
+      }
+      container_props = {
+        'id': this.container_id,
+        'class': container_classes.join(' '),
+        'style': "width: " + (this.container_width()) + ";",
+        'title': this.form_field.title
+      };
+      this.container = $("<div />", container_props);
+      if (this.is_multiple) {
+        this.container.html('<ul class="chzn-choices"><li class="search-field"><input type="text" value="' + this.default_text + '" class="default" autocomplete="off" style="width:auto;" /></li></ul><div class="chzn-drop"><ul class="chzn-results"></ul></div>');
+      } else {
+        this.container.html('<a href="javascript:void(0)" class="chzn-single chzn-default" tabindex="-1"><span>' + this.default_text + '</span><div><b></b></div></a><div class="chzn-drop"><div class="chzn-search"><input type="text" autocomplete="off" /></div><ul class="chzn-results"></ul></div>');
+      }
+      this.form_field_jq.hide().after(this.container);
+      this.dropdown = this.container.find('div.chzn-drop').first();
+      this.search_field = this.container.find('input').first();
+      this.search_results = this.container.find('ul.chzn-results').first();
+      this.search_field_scale();
+      this.search_no_results = this.container.find('li.no-results').first();
+      if (this.is_multiple) {
+        this.search_choices = this.container.find('ul.chzn-choices').first();
+        this.search_container = this.container.find('li.search-field').first();
+      } else {
+        this.search_container = this.container.find('div.chzn-search').first();
+        this.selected_item = this.container.find('.chzn-single').first();
+      }
+      this.results_build();
+      this.set_tab_index();
+      this.set_label_behavior();
+      return this.form_field_jq.trigger("liszt:ready", {
+        chosen: this
+      });
+    };
+
+    Chosen.prototype.register_observers = function() {
+      var _this = this;
+      this.container.mousedown(function(evt) {
+        _this.container_mousedown(evt);
+      });
+      this.container.mouseup(function(evt) {
+        _this.container_mouseup(evt);
+      });
+      this.container.mouseenter(function(evt) {
+        _this.mouse_enter(evt);
+      });
+      this.container.mouseleave(function(evt) {
+        _this.mouse_leave(evt);
+      });
+      this.search_results.mouseup(function(evt) {
+        _this.search_results_mouseup(evt);
+      });
+      this.search_results.mouseover(function(evt) {
+        _this.search_results_mouseover(evt);
+      });
+      this.search_results.mouseout(function(evt) {
+        _this.search_results_mouseout(evt);
+      });
+      this.search_results.bind('mousewheel DOMMouseScroll', function(evt) {
+        _this.search_results_mousewheel(evt);
+      });
+      this.form_field_jq.bind("liszt:updated", function(evt) {
+        _this.results_update_field(evt);
+      });
+      this.form_field_jq.bind("liszt:activate", function(evt) {
+        _this.activate_field(evt);
+      });
+      this.form_field_jq.bind("liszt:open", function(evt) {
+        _this.container_mousedown(evt);
+      });
+      this.search_field.blur(function(evt) {
+        _this.input_blur(evt);
+      });
+      this.search_field.keyup(function(evt) {
+        _this.keyup_checker(evt);
+      });
+      this.search_field.keydown(function(evt) {
+        _this.keydown_checker(evt);
+      });
+      this.search_field.focus(function(evt) {
+        _this.input_focus(evt);
+      });
+      if (this.is_multiple) {
+        return this.search_choices.click(function(evt) {
+          _this.choices_click(evt);
+        });
+      } else {
+        return this.container.click(function(evt) {
+          evt.preventDefault();
+        });
+      }
+    };
+
+    Chosen.prototype.search_field_disabled = function() {
+      this.is_disabled = this.form_field_jq[0].disabled;
+      if (this.is_disabled) {
+        this.container.addClass('chzn-disabled');
+        this.search_field[0].disabled = true;
+        if (!this.is_multiple) {
+          this.selected_item.unbind("focus", this.activate_action);
+        }
+        return this.close_field();
+      } else {
+        this.container.removeClass('chzn-disabled');
+        this.search_field[0].disabled = false;
+        if (!this.is_multiple) {
+          return this.selected_item.bind("focus", this.activate_action);
+        }
+      }
+    };
+
+    Chosen.prototype.container_mousedown = function(evt) {
+      if (!this.is_disabled) {
+        if (evt && evt.type === "mousedown" && !this.results_showing) {
+          evt.preventDefault();
+        }
+        if (!((evt != null) && ($(evt.target)).hasClass("search-choice-close"))) {
+          if (!this.active_field) {
+            if (this.is_multiple) {
+              this.search_field.val("");
+            }
+            $(document).click(this.click_test_action);
+            this.results_show();
+          } else if (!this.is_multiple && evt && (($(evt.target)[0] === this.selected_item[0]) || $(evt.target).parents("a.chzn-single").length)) {
+            evt.preventDefault();
+            this.results_toggle();
+          }
+          return this.activate_field();
+        }
+      }
+    };
+
+    Chosen.prototype.container_mouseup = function(evt) {
+      if (evt.target.nodeName === "ABBR" && !this.is_disabled) {
+        return this.results_reset(evt);
+      }
+    };
+
+    Chosen.prototype.search_results_mousewheel = function(evt) {
+      var delta, _ref, _ref1;
+      delta = -((_ref = evt.originalEvent) != null ? _ref.wheelDelta : void 0) || ((_ref1 = evt.originialEvent) != null ? _ref1.detail : void 0);
+      if (delta != null) {
+        evt.preventDefault();
+        if (evt.type === 'DOMMouseScroll') {
+          delta = delta * 40;
+        }
+        return this.search_results.scrollTop(delta + this.search_results.scrollTop());
+      }
+    };
+
+    Chosen.prototype.blur_test = function(evt) {
+      if (!this.active_field && this.container.hasClass("chzn-container-active")) {
+        return this.close_field();
+      }
+    };
+
+    Chosen.prototype.close_field = function() {
+      $(document).unbind("click", this.click_test_action);
+      this.active_field = false;
+      this.results_hide();
+      this.container.removeClass("chzn-container-active");
+      this.winnow_results_clear();
+      this.clear_backstroke();
+      this.show_search_field_default();
+      return this.search_field_scale();
+    };
+
+    Chosen.prototype.activate_field = function() {
+      this.container.addClass("chzn-container-active");
+      this.active_field = true;
+      this.search_field.val(this.search_field.val());
+      return this.search_field.focus();
+    };
+
+    Chosen.prototype.test_active_click = function(evt) {
+      if ($(evt.target).parents('#' + this.container_id).length) {
+        return this.active_field = true;
+      } else {
+        return this.close_field();
+      }
+    };
+
+    Chosen.prototype.results_build = function() {
+      var content, data, _i, _len, _ref;
+      this.parsing = true;
+      this.results_data = root.SelectParser.select_to_array(this.form_field);
+      if (this.is_multiple && this.choices > 0) {
+        this.search_choices.find("li.search-choice").remove();
+        this.choices = 0;
+      } else if (!this.is_multiple) {
+        this.selected_item.addClass("chzn-default").find("span").text(this.default_text);
+        if (this.disable_search || this.form_field.options.length <= this.disable_search_threshold) {
+          this.container.addClass("chzn-container-single-nosearch");
+        } else {
+          this.container.removeClass("chzn-container-single-nosearch");
+        }
+      }
+      content = '';
+      _ref = this.results_data;
+      for (_i = 0, _len = _ref.length; _i < _len; _i++) {
+        data = _ref[_i];
+        if (data.group) {
+          content += this.result_add_group(data);
+        } else if (!data.empty) {
+          content += this.result_add_option(data);
+          if (data.selected && this.is_multiple) {
+            this.choice_build(data);
+          } else if (data.selected && !this.is_multiple) {
+            this.selected_item.removeClass("chzn-default").find("span").text(data.text);
+            if (this.allow_single_deselect) {
+              this.single_deselect_control_build();
+            }
+          }
+        }
+      }
+      this.search_field_disabled();
+      this.show_search_field_default();
+      this.search_field_scale();
+      this.search_results.html(content);
+      return this.parsing = false;
+    };
+
+    Chosen.prototype.result_add_group = function(group) {
+      if (!group.disabled) {
+        group.dom_id = this.container_id + "_g_" + group.array_index;
+        return '<li id="' + group.dom_id + '" class="group-result">' + $("<div />").text(group.label).html() + '</li>';
+      } else {
+        return "";
+      }
+    };
+
+    Chosen.prototype.result_do_highlight = function(el) {
+      var high_bottom, high_top, maxHeight, visible_bottom, visible_top;
+      if (el.length) {
+        this.result_clear_highlight();
+        this.result_highlight = el;
+        this.result_highlight.addClass("highlighted");
+        maxHeight = parseInt(this.search_results.css("maxHeight"), 10);
+        visible_top = this.search_results.scrollTop();
+        visible_bottom = maxHeight + visible_top;
+        high_top = this.result_highlight.position().top + this.search_results.scrollTop();
+        high_bottom = high_top + this.result_highlight.outerHeight();
+        if (high_bottom >= visible_bottom) {
+          return this.search_results.scrollTop((high_bottom - maxHeight) > 0 ? high_bottom - maxHeight : 0);
+        } else if (high_top < visible_top) {
+          return this.search_results.scrollTop(high_top);
+        }
+      }
+    };
+
+    Chosen.prototype.result_clear_highlight = function() {
+      if (this.result_highlight) {
+        this.result_highlight.removeClass("highlighted");
+      }
+      return this.result_highlight = null;
+    };
+
+    Chosen.prototype.results_show = function() {
+      if (this.result_single_selected != null) {
+        this.result_do_highlight(this.result_single_selected);
+      } else if (this.is_multiple && this.max_selected_options <= this.choices) {
+        this.form_field_jq.trigger("liszt:maxselected", {
+          chosen: this
+        });
+        return false;
+      }
+      this.container.addClass("chzn-with-drop");
+      this.form_field_jq.trigger("liszt:showing_dropdown", {
+        chosen: this
+      });
+      this.results_showing = true;
+      this.search_field.focus();
+      this.search_field.val(this.search_field.val());
+      return this.winnow_results();
+    };
+
+    Chosen.prototype.results_hide = function() {
+      this.result_clear_highlight();
+      this.container.removeClass("chzn-with-drop");
+      this.form_field_jq.trigger("liszt:hiding_dropdown", {
+        chosen: this
+      });
+      return this.results_showing = false;
+    };
+
+    Chosen.prototype.set_tab_index = function(el) {
+      var ti;
+      if (this.form_field_jq.attr("tabindex")) {
+        ti = this.form_field_jq.attr("tabindex");
+        this.form_field_jq.attr("tabindex", -1);
+        return this.search_field.attr("tabindex", ti);
+      }
+    };
+
+    Chosen.prototype.set_label_behavior = function() {
+      var _this = this;
+      this.form_field_label = this.form_field_jq.parents("label");
+      if (!this.form_field_label.length && this.form_field.id.length) {
+        this.form_field_label = $("label[for=" + this.form_field.id + "]");
+      }
+      if (this.form_field_label.length > 0) {
+        return this.form_field_label.click(function(evt) {
+          if (_this.is_multiple) {
+            return _this.container_mousedown(evt);
+          } else {
+            return _this.activate_field();
+          }
+        });
+      }
+    };
+
+    Chosen.prototype.show_search_field_default = function() {
+      if (this.is_multiple && this.choices < 1 && !this.active_field) {
+        this.search_field.val(this.default_text);
+        return this.search_field.addClass("default");
+      } else {
+        this.search_field.val("");
+        return this.search_field.removeClass("default");
+      }
+    };
+
+    Chosen.prototype.search_results_mouseup = function(evt) {
+      var target;
+      target = $(evt.target).hasClass("active-result") ? $(evt.target) : $(evt.target).parents(".active-result").first();
+      if (target.length) {
+        this.result_highlight = target;
+        this.result_select(evt);
+        return this.search_field.focus();
+      }
+    };
+
+    Chosen.prototype.search_results_mouseover = function(evt) {
+      var target;
+      target = $(evt.target).hasClass("active-result") ? $(evt.target) : $(evt.target).parents(".active-result").first();
+      if (target) {
+        return this.result_do_highlight(target);
+      }
+    };
+
+    Chosen.prototype.search_results_mouseout = function(evt) {
+      if ($(evt.target).hasClass("active-result" || $(evt.target).parents('.active-result').first())) {
+        return this.result_clear_highlight();
+      }
+    };
+
+    Chosen.prototype.choice_build = function(item) {
+      var choice_id, html, link,
+        _this = this;
+      if (this.is_multiple && this.max_selected_options <= this.choices) {
+        this.form_field_jq.trigger("liszt:maxselected", {
+          chosen: this
+        });
+        return false;
+      }
+      choice_id = this.container_id + "_c_" + item.array_index;
+      this.choices += 1;
+      if (item.disabled) {
+        html = '<li class="search-choice search-choice-disabled" id="' + choice_id + '"><span>' + item.html + '</span></li>';
+      } else {
+        html = '<li class="search-choice" id="' + choice_id + '"><span>' + item.html + '</span><a href="javascript:void(0)" class="search-choice-close" rel="' + item.array_index + '"></a></li>';
+      }
+      this.search_container.before(html);
+      link = $('#' + choice_id).find("a").first();
+      return link.click(function(evt) {
+        return _this.choice_destroy_link_click(evt);
+      });
+    };
+
+    Chosen.prototype.choice_destroy_link_click = function(evt) {
+      evt.preventDefault();
+      evt.stopPropagation();
+      if (!this.is_disabled) {
+        return this.choice_destroy($(evt.target));
+      }
+    };
+
+    Chosen.prototype.choice_destroy = function(link) {
+      if (this.result_deselect(link.attr("rel"))) {
+        this.choices -= 1;
+        this.show_search_field_default();
+        if (this.is_multiple && this.choices > 0 && this.search_field.val().length < 1) {
+          this.results_hide();
+        }
+        link.parents('li').first().remove();
+        return this.search_field_scale();
+      }
+    };
+
+    Chosen.prototype.results_reset = function() {
+      this.form_field.options[0].selected = true;
+      this.selected_item.find("span").text(this.default_text);
+      if (!this.is_multiple) {
+        this.selected_item.addClass("chzn-default");
+      }
+      this.show_search_field_default();
+      this.results_reset_cleanup();
+      this.form_field_jq.trigger("change");
+      if (this.active_field) {
+        return this.results_hide();
+      }
+    };
+
+    Chosen.prototype.results_reset_cleanup = function() {
+      this.current_selectedIndex = this.form_field.selectedIndex;
+      return this.selected_item.find("abbr").remove();
+    };
+
+    Chosen.prototype.result_select = function(evt) {
+      var high, high_id, item, position;
+      if (this.result_highlight) {
+        high = this.result_highlight;
+        high_id = high.attr("id");
+        this.result_clear_highlight();
+        if (this.is_multiple) {
+          this.result_deactivate(high);
+        } else {
+          this.search_results.find(".result-selected").removeClass("result-selected");
+          this.result_single_selected = high;
+          this.selected_item.removeClass("chzn-default");
+        }
+        high.addClass("result-selected");
+        position = high_id.substr(high_id.lastIndexOf("_") + 1);
+        item = this.results_data[position];
+        item.selected = true;
+        this.form_field.options[item.options_index].selected = true;
+        if (this.is_multiple) {
+          this.choice_build(item);
+        } else {
+          this.selected_item.find("span").first().text(item.text);
+          if (this.allow_single_deselect) {
+            this.single_deselect_control_build();
+          }
+        }
+        if (!((evt.metaKey || evt.ctrlKey) && this.is_multiple)) {
+          this.results_hide();
+        }
+        this.search_field.val("");
+        if (this.is_multiple || this.form_field.selectedIndex !== this.current_selectedIndex) {
+          this.form_field_jq.trigger("change", {
+            'selected': this.form_field.options[item.options_index].value
+          });
+        }
+        this.current_selectedIndex = this.form_field.selectedIndex;
+        return this.search_field_scale();
+      }
+    };
+
+    Chosen.prototype.result_activate = function(el) {
+      return el.addClass("active-result");
+    };
+
+    Chosen.prototype.result_deactivate = function(el) {
+      return el.removeClass("active-result");
+    };
+
+    Chosen.prototype.result_deselect = function(pos) {
+      var result, result_data;
+      result_data = this.results_data[pos];
+      if (!this.form_field.options[result_data.options_index].disabled) {
+        result_data.selected = false;
+        this.form_field.options[result_data.options_index].selected = false;
+        result = $("#" + this.container_id + "_o_" + pos);
+        result.removeClass("result-selected").addClass("active-result").show();
+        this.result_clear_highlight();
+        this.winnow_results();
+        this.form_field_jq.trigger("change", {
+          deselected: this.form_field.options[result_data.options_index].value
+        });
+        this.search_field_scale();
+        return true;
+      } else {
+        return false;
+      }
+    };
+
+    Chosen.prototype.single_deselect_control_build = function() {
+      if (this.allow_single_deselect && this.selected_item.find("abbr").length < 1) {
+        return this.selected_item.find("span").first().after("<abbr class=\"search-choice-close\"></abbr>");
+      }
+    };
+
+    Chosen.prototype.winnow_results = function() {
+      var found, option, part, parts, regex, regexAnchor, result, result_id, results, searchText, startpos, text, zregex, _i, _j, _len, _len1, _ref;
+      this.no_results_clear();
+      results = 0;
+      searchText = this.search_field.val() === this.default_text ? "" : $('<div/>').text($.trim(this.search_field.val())).html();
+      regexAnchor = this.search_contains ? "" : "^";
+      regex = new RegExp(regexAnchor + searchText.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&"), 'i');
+      zregex = new RegExp(searchText.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&"), 'i');
+      _ref = this.results_data;
+      for (_i = 0, _len = _ref.length; _i < _len; _i++) {
+        option = _ref[_i];
+        if (!option.disabled && !option.empty) {
+          if (option.group) {
+            $('#' + option.dom_id).css('display', 'none');
+          } else if (!(this.is_multiple && option.selected)) {
+            found = false;
+            result_id = option.dom_id;
+            result = $("#" + result_id);
+            if (regex.test(option.html)) {
+              found = true;
+              results += 1;
+            } else if (this.enable_split_word_search && (option.html.indexOf(" ") >= 0 || option.html.indexOf("[") === 0)) {
+              parts = option.html.replace(/\[|\]/g, "").split(" ");
+              if (parts.length) {
+                for (_j = 0, _len1 = parts.length; _j < _len1; _j++) {
+                  part = parts[_j];
+                  if (regex.test(part)) {
+                    found = true;
+                    results += 1;
+                  }
+                }
+              }
+            }
+            if (found) {
+              if (searchText.length) {
+                startpos = option.html.search(zregex);
+                text = option.html.substr(0, startpos + searchText.length) + '</em>' + option.html.substr(startpos + searchText.length);
+                text = text.substr(0, startpos) + '<em>' + text.substr(startpos);
+              } else {
+                text = option.html;
+              }
+              result.html(text);
+              this.result_activate(result);
+              if (option.group_array_index != null) {
+                $("#" + this.results_data[option.group_array_index].dom_id).css('display', 'list-item');
+              }
+            } else {
+              if (this.result_highlight && result_id === this.result_highlight.attr('id')) {
+                this.result_clear_highlight();
+              }
+              this.result_deactivate(result);
+            }
+          }
+        }
+      }
+      if (results < 1 && searchText.length) {
+        return this.no_results(searchText);
+      } else {
+        return this.winnow_results_set_highlight();
+      }
+    };
+
+    Chosen.prototype.winnow_results_clear = function() {
+      var li, lis, _i, _len, _results;
+      this.search_field.val("");
+      lis = this.search_results.find("li");
+      _results = [];
+      for (_i = 0, _len = lis.length; _i < _len; _i++) {
+        li = lis[_i];
+        li = $(li);
+        if (li.hasClass("group-result")) {
+          _results.push(li.css('display', 'auto'));
+        } else if (!this.is_multiple || !li.hasClass("result-selected")) {
+          _results.push(this.result_activate(li));
+        } else {
+          _results.push(void 0);
+        }
+      }
+      return _results;
+    };
+
+    Chosen.prototype.winnow_results_set_highlight = function() {
+      var do_high, selected_results;
+      if (!this.result_highlight) {
+        selected_results = !this.is_multiple ? this.search_results.find(".result-selected.active-result") : [];
+        do_high = selected_results.length ? selected_results.first() : this.search_results.find(".active-result").first();
+        if (do_high != null) {
+          return this.result_do_highlight(do_high);
+        }
+      }
+    };
+
+    Chosen.prototype.no_results = function(terms) {
+      var no_results_html;
+      no_results_html = $('<li class="no-results">' + this.results_none_found + ' "<span></span>"</li>');
+      no_results_html.find("span").first().html(terms);
+      return this.search_results.append(no_results_html);
+    };
+
+    Chosen.prototype.no_results_clear = function() {
+      return this.search_results.find(".no-results").remove();
+    };
+
+    Chosen.prototype.keydown_arrow = function() {
+      var first_active, next_sib;
+      if (!this.result_highlight) {
+        first_active = this.search_results.find("li.active-result").first();
+        if (first_active) {
+          this.result_do_highlight($(first_active));
+        }
+      } else if (this.results_showing) {
+        next_sib = this.result_highlight.nextAll("li.active-result").first();
+        if (next_sib) {
+          this.result_do_highlight(next_sib);
+        }
+      }
+      if (!this.results_showing) {
+        return this.results_show();
+      }
+    };
+
+    Chosen.prototype.keyup_arrow = function() {
+      var prev_sibs;
+      if (!this.results_showing && !this.is_multiple) {
+        return this.results_show();
+      } else if (this.result_highlight) {
+        prev_sibs = this.result_highlight.prevAll("li.active-result");
+        if (prev_sibs.length) {
+          return this.result_do_highlight(prev_sibs.first());
+        } else {
+          if (this.choices > 0) {
+            this.results_hide();
+          }
+          return this.result_clear_highlight();
+        }
+      }
+    };
+
+    Chosen.prototype.keydown_backstroke = function() {
+      var next_available_destroy;
+      if (this.pending_backstroke) {
+        this.choice_destroy(this.pending_backstroke.find("a").first());
+        return this.clear_backstroke();
+      } else {
+        next_available_destroy = this.search_container.siblings("li.search-choice").last();
+        if (next_available_destroy.length && !next_available_destroy.hasClass("search-choice-disabled")) {
+          this.pending_backstroke = next_available_destroy;
+          if (this.single_backstroke_delete) {
+            return this.keydown_backstroke();
+          } else {
+            return this.pending_backstroke.addClass("search-choice-focus");
+          }
+        }
+      }
+    };
+
+    Chosen.prototype.clear_backstroke = function() {
+      if (this.pending_backstroke) {
+        this.pending_backstroke.removeClass("search-choice-focus");
+      }
+      return this.pending_backstroke = null;
+    };
+
+    Chosen.prototype.keydown_checker = function(evt) {
+      var stroke, _ref;
+      stroke = (_ref = evt.which) != null ? _ref : evt.keyCode;
+      this.search_field_scale();
+      if (stroke !== 8 && this.pending_backstroke) {
+        this.clear_backstroke();
+      }
+      switch (stroke) {
+        case 8:
+          this.backstroke_length = this.search_field.val().length;
+          break;
+        case 9:
+          if (this.results_showing && !this.is_multiple) {
+            this.result_select(evt);
+          }
+          this.mouse_on_container = false;
+          break;
+        case 13:
+          evt.preventDefault();
+          break;
+        case 38:
+          evt.preventDefault();
+          this.keyup_arrow();
+          break;
+        case 40:
+          this.keydown_arrow();
+          break;
+      }
+    };
+
+    Chosen.prototype.search_field_scale = function() {
+      var div, h, style, style_block, styles, w, _i, _len;
+      if (this.is_multiple) {
+        h = 0;
+        w = 0;
+        style_block = "position:absolute; left: -1000px; top: -1000px; display:none;";
+        styles = ['font-size', 'font-style', 'font-weight', 'font-family', 'line-height', 'text-transform', 'letter-spacing'];
+        for (_i = 0, _len = styles.length; _i < _len; _i++) {
+          style = styles[_i];
+          style_block += style + ":" + this.search_field.css(style) + ";";
+        }
+        div = $('<div />', {
+          'style': style_block
+        });
+        div.text(this.search_field.val());
+        $('body').append(div);
+        w = div.width() + 25;
+        div.remove();
+        if (!this.f_width) {
+          this.f_width = this.container.outerWidth();
+        }
+        if (w > this.f_width - 10) {
+          w = this.f_width - 10;
+        }
+        return this.search_field.css({
+          'width': w + 'px'
+        });
+      }
+    };
+
+    Chosen.prototype.generate_random_id = function() {
+      var string;
+      string = "sel" + this.generate_random_char() + this.generate_random_char() + this.generate_random_char();
+      while ($("#" + string).length > 0) {
+        string += this.generate_random_char();
+      }
+      return string;
+    };
+
+    return Chosen;
+
+  })(AbstractChosen);
+
+  root.Chosen = Chosen;
+
+}).call(this);
diff --git a/resources/lib/jquery.effects/jquery.effects.blind.js b/resources/lib/jquery.effects/jquery.effects.blind.js
new file mode 100644 (file)
index 0000000..ac25bbd
--- /dev/null
@@ -0,0 +1,49 @@
+/*!
+ * jQuery UI Effects Blind 1.8.24
+ *
+ * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Blind
+ *
+ * Depends:
+ *     jquery.effects.core.js
+ */
+(function( $, undefined ) {
+
+$.effects.blind = function(o) {
+
+       return this.queue(function() {
+
+               // Create element
+               var el = $(this), props = ['position','top','bottom','left','right'];
+
+               // Set options
+               var mode = $.effects.setMode(el, o.options.mode || 'hide'); // Set Mode
+               var direction = o.options.direction || 'vertical'; // Default direction
+
+               // Adjust
+               $.effects.save(el, props); el.show(); // Save & Show
+               var wrapper = $.effects.createWrapper(el).css({overflow:'hidden'}); // Create Wrapper
+               var ref = (direction == 'vertical') ? 'height' : 'width';
+               var distance = (direction == 'vertical') ? wrapper.height() : wrapper.width();
+               if(mode == 'show') wrapper.css(ref, 0); // Shift
+
+               // Animation
+               var animation = {};
+               animation[ref] = mode == 'show' ? distance : 0;
+
+               // Animate
+               wrapper.animate(animation, o.duration, o.options.easing, function() {
+                       if(mode == 'hide') el.hide(); // Hide
+                       $.effects.restore(el, props); $.effects.removeWrapper(el); // Restore
+                       if(o.callback) o.callback.apply(el[0], arguments); // Callback
+                       el.dequeue();
+               });
+
+       });
+
+};
+
+})(jQuery);
diff --git a/resources/lib/jquery.effects/jquery.effects.bounce.js b/resources/lib/jquery.effects/jquery.effects.bounce.js
new file mode 100644 (file)
index 0000000..1169d77
--- /dev/null
@@ -0,0 +1,78 @@
+/*!
+ * jQuery UI Effects Bounce 1.8.24
+ *
+ * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Bounce
+ *
+ * Depends:
+ *     jquery.effects.core.js
+ */
+(function( $, undefined ) {
+
+$.effects.bounce = function(o) {
+
+       return this.queue(function() {
+
+               // Create element
+               var el = $(this), props = ['position','top','bottom','left','right'];
+
+               // Set options
+               var mode = $.effects.setMode(el, o.options.mode || 'effect'); // Set Mode
+               var direction = o.options.direction || 'up'; // Default direction
+               var distance = o.options.distance || 20; // Default distance
+               var times = o.options.times || 5; // Default # of times
+               var speed = o.duration || 250; // Default speed per bounce
+               if (/show|hide/.test(mode)) props.push('opacity'); // Avoid touching opacity to prevent clearType and PNG issues in IE
+
+               // Adjust
+               $.effects.save(el, props); el.show(); // Save & Show
+               $.effects.createWrapper(el); // Create Wrapper
+               var ref = (direction == 'up' || direction == 'down') ? 'top' : 'left';
+               var motion = (direction == 'up' || direction == 'left') ? 'pos' : 'neg';
+               var distance = o.options.distance || (ref == 'top' ? el.outerHeight(true) / 3 : el.outerWidth(true) / 3);
+               if (mode == 'show') el.css('opacity', 0).css(ref, motion == 'pos' ? -distance : distance); // Shift
+               if (mode == 'hide') distance = distance / (times * 2);
+               if (mode != 'hide') times--;
+
+               // Animate
+               if (mode == 'show') { // Show Bounce
+                       var animation = {opacity: 1};
+                       animation[ref] = (motion == 'pos' ? '+=' : '-=') + distance;
+                       el.animate(animation, speed / 2, o.options.easing);
+                       distance = distance / 2;
+                       times--;
+               };
+               for (var i = 0; i < times; i++) { // Bounces
+                       var animation1 = {}, animation2 = {};
+                       animation1[ref] = (motion == 'pos' ? '-=' : '+=') + distance;
+                       animation2[ref] = (motion == 'pos' ? '+=' : '-=') + distance;
+                       el.animate(animation1, speed / 2, o.options.easing).animate(animation2, speed / 2, o.options.easing);
+                       distance = (mode == 'hide') ? distance * 2 : distance / 2;
+               };
+               if (mode == 'hide') { // Last Bounce
+                       var animation = {opacity: 0};
+                       animation[ref] = (motion == 'pos' ? '-=' : '+=')  + distance;
+                       el.animate(animation, speed / 2, o.options.easing, function(){
+                               el.hide(); // Hide
+                               $.effects.restore(el, props); $.effects.removeWrapper(el); // Restore
+                               if(o.callback) o.callback.apply(this, arguments); // Callback
+                       });
+               } else {
+                       var animation1 = {}, animation2 = {};
+                       animation1[ref] = (motion == 'pos' ? '-=' : '+=') + distance;
+                       animation2[ref] = (motion == 'pos' ? '+=' : '-=') + distance;
+                       el.animate(animation1, speed / 2, o.options.easing).animate(animation2, speed / 2, o.options.easing, function(){
+                               $.effects.restore(el, props); $.effects.removeWrapper(el); // Restore
+                               if(o.callback) o.callback.apply(this, arguments); // Callback
+                       });
+               };
+               el.queue('fx', function() { el.dequeue(); });
+               el.dequeue();
+       });
+
+};
+
+})(jQuery);
diff --git a/resources/lib/jquery.effects/jquery.effects.clip.js b/resources/lib/jquery.effects/jquery.effects.clip.js
new file mode 100644 (file)
index 0000000..edd51a6
--- /dev/null
@@ -0,0 +1,54 @@
+/*!
+ * jQuery UI Effects Clip 1.8.24
+ *
+ * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Clip
+ *
+ * Depends:
+ *     jquery.effects.core.js
+ */
+(function( $, undefined ) {
+
+$.effects.clip = function(o) {
+
+       return this.queue(function() {
+
+               // Create element
+               var el = $(this), props = ['position','top','bottom','left','right','height','width'];
+
+               // Set options
+               var mode = $.effects.setMode(el, o.options.mode || 'hide'); // Set Mode
+               var direction = o.options.direction || 'vertical'; // Default direction
+
+               // Adjust
+               $.effects.save(el, props); el.show(); // Save & Show
+               var wrapper = $.effects.createWrapper(el).css({overflow:'hidden'}); // Create Wrapper
+               var animate = el[0].tagName == 'IMG' ? wrapper : el;
+               var ref = {
+                       size: (direction == 'vertical') ? 'height' : 'width',
+                       position: (direction == 'vertical') ? 'top' : 'left'
+               };
+               var distance = (direction == 'vertical') ? animate.height() : animate.width();
+               if(mode == 'show') { animate.css(ref.size, 0); animate.css(ref.position, distance / 2); } // Shift
+
+               // Animation
+               var animation = {};
+               animation[ref.size] = mode == 'show' ? distance : 0;
+               animation[ref.position] = mode == 'show' ? 0 : distance / 2;
+
+               // Animate
+               animate.animate(animation, { queue: false, duration: o.duration, easing: o.options.easing, complete: function() {
+                       if(mode == 'hide') el.hide(); // Hide
+                       $.effects.restore(el, props); $.effects.removeWrapper(el); // Restore
+                       if(o.callback) o.callback.apply(el[0], arguments); // Callback
+                       el.dequeue();
+               }});
+
+       });
+
+};
+
+})(jQuery);
diff --git a/resources/lib/jquery.effects/jquery.effects.core.js b/resources/lib/jquery.effects/jquery.effects.core.js
new file mode 100644 (file)
index 0000000..7fd946f
--- /dev/null
@@ -0,0 +1,612 @@
+/*!
+ * jQuery UI Effects 1.8.24
+ *
+ * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/
+ */
+;jQuery.effects || (function($, undefined) {
+
+$.effects = {};
+
+
+
+/******************************************************************************/
+/****************************** COLOR ANIMATIONS ******************************/
+/******************************************************************************/
+
+// override the animation for color styles
+$.each(['backgroundColor', 'borderBottomColor', 'borderLeftColor',
+       'borderRightColor', 'borderTopColor', 'borderColor', 'color', 'outlineColor'],
+function(i, attr) {
+       $.fx.step[attr] = function(fx) {
+               if (!fx.colorInit) {
+                       fx.start = getColor(fx.elem, attr);
+                       fx.end = getRGB(fx.end);
+                       fx.colorInit = true;
+               }
+
+               fx.elem.style[attr] = 'rgb(' +
+                       Math.max(Math.min(parseInt((fx.pos * (fx.end[0] - fx.start[0])) + fx.start[0], 10), 255), 0) + ',' +
+                       Math.max(Math.min(parseInt((fx.pos * (fx.end[1] - fx.start[1])) + fx.start[1], 10), 255), 0) + ',' +
+                       Math.max(Math.min(parseInt((fx.pos * (fx.end[2] - fx.start[2])) + fx.start[2], 10), 255), 0) + ')';
+       };
+});
+
+// Color Conversion functions from highlightFade
+// By Blair Mitchelmore
+// http://jquery.offput.ca/highlightFade/
+
+// Parse strings looking for color tuples [255,255,255]
+function getRGB(color) {
+               var result;
+
+               // Check if we're already dealing with an array of colors
+               if ( color && color.constructor == Array && color.length == 3 )
+                               return color;
+
+               // Look for rgb(num,num,num)
+               if (result = /rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(color))
+                               return [parseInt(result[1],10), parseInt(result[2],10), parseInt(result[3],10)];
+
+               // Look for rgb(num%,num%,num%)
+               if (result = /rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/.exec(color))
+                               return [parseFloat(result[1])*2.55, parseFloat(result[2])*2.55, parseFloat(result[3])*2.55];
+
+               // Look for #a0b1c2
+               if (result = /#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(color))
+                               return [parseInt(result[1],16), parseInt(result[2],16), parseInt(result[3],16)];
+
+               // Look for #fff
+               if (result = /#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(color))
+                               return [parseInt(result[1]+result[1],16), parseInt(result[2]+result[2],16), parseInt(result[3]+result[3],16)];
+
+               // Look for rgba(0, 0, 0, 0) == transparent in Safari 3
+               if (result = /rgba\(0, 0, 0, 0\)/.exec(color))
+                               return colors['transparent'];
+
+               // Otherwise, we're most likely dealing with a named color
+               return colors[$.trim(color).toLowerCase()];
+}
+
+function getColor(elem, attr) {
+               var color;
+
+               do {
+                               // jQuery <1.4.3 uses curCSS, in 1.4.3 - 1.7.2 curCSS = css, 1.8+ only has css
+                               color = ($.curCSS || $.css)(elem, attr);
+
+                               // Keep going until we find an element that has color, or we hit the body
+                               if ( color != '' && color != 'transparent' || $.nodeName(elem, "body") )
+                                               break;
+
+                               attr = "backgroundColor";
+               } while ( elem = elem.parentNode );
+
+               return getRGB(color);
+};
+
+// Some named colors to work with
+// From Interface by Stefan Petre
+// http://interface.eyecon.ro/
+
+var colors = {
+       aqua:[0,255,255],
+       azure:[240,255,255],
+       beige:[245,245,220],
+       black:[0,0,0],
+       blue:[0,0,255],
+       brown:[165,42,42],
+       cyan:[0,255,255],
+       darkblue:[0,0,139],
+       darkcyan:[0,139,139],
+       darkgrey:[169,169,169],
+       darkgreen:[0,100,0],
+       darkkhaki:[189,183,107],
+       darkmagenta:[139,0,139],
+       darkolivegreen:[85,107,47],
+       darkorange:[255,140,0],
+       darkorchid:[153,50,204],
+       darkred:[139,0,0],
+       darksalmon:[233,150,122],
+       darkviolet:[148,0,211],
+       fuchsia:[255,0,255],
+       gold:[255,215,0],
+       green:[0,128,0],
+       indigo:[75,0,130],
+       khaki:[240,230,140],
+       lightblue:[173,216,230],
+       lightcyan:[224,255,255],
+       lightgreen:[144,238,144],
+       lightgrey:[211,211,211],
+       lightpink:[255,182,193],
+       lightyellow:[255,255,224],
+       lime:[0,255,0],
+       magenta:[255,0,255],
+       maroon:[128,0,0],
+       navy:[0,0,128],
+       olive:[128,128,0],
+       orange:[255,165,0],
+       pink:[255,192,203],
+       purple:[128,0,128],
+       violet:[128,0,128],
+       red:[255,0,0],
+       silver:[192,192,192],
+       white:[255,255,255],
+       yellow:[255,255,0],
+       transparent: [255,255,255]
+};
+
+
+
+/******************************************************************************/
+/****************************** CLASS ANIMATIONS ******************************/
+/******************************************************************************/
+
+var classAnimationActions = ['add', 'remove', 'toggle'],
+       shorthandStyles = {
+               border: 1,
+               borderBottom: 1,
+               borderColor: 1,
+               borderLeft: 1,
+               borderRight: 1,
+               borderTop: 1,
+               borderWidth: 1,
+               margin: 1,
+               padding: 1
+       };
+
+function getElementStyles() {
+       var style = document.defaultView
+                       ? document.defaultView.getComputedStyle(this, null)
+                       : this.currentStyle,
+               newStyle = {},
+               key,
+               camelCase;
+
+       // webkit enumerates style porperties
+       if (style && style.length && style[0] && style[style[0]]) {
+               var len = style.length;
+               while (len--) {
+                       key = style[len];
+                       if (typeof style[key] == 'string') {
+                               camelCase = key.replace(/\-(\w)/g, function(all, letter){
+                                       return letter.toUpperCase();
+                               });
+                               newStyle[camelCase] = style[key];
+                       }
+               }
+       } else {
+               for (key in style) {
+                       if (typeof style[key] === 'string') {
+                               newStyle[key] = style[key];
+                       }
+               }
+       }
+       
+       return newStyle;
+}
+
+function filterStyles(styles) {
+       var name, value;
+       for (name in styles) {
+               value = styles[name];
+               if (
+                       // ignore null and undefined values
+                       value == null ||
+                       // ignore functions (when does this occur?)
+                       $.isFunction(value) ||
+                       // shorthand styles that need to be expanded
+                       name in shorthandStyles ||
+                       // ignore scrollbars (break in IE)
+                       (/scrollbar/).test(name) ||
+
+                       // only colors or values that can be converted to numbers
+                       (!(/color/i).test(name) && isNaN(parseFloat(value)))
+               ) {
+                       delete styles[name];
+               }
+       }
+       
+       return styles;
+}
+
+function styleDifference(oldStyle, newStyle) {
+       var diff = { _: 0 }, // http://dev.jquery.com/ticket/5459
+               name;
+
+       for (name in newStyle) {
+               if (oldStyle[name] != newStyle[name]) {
+                       diff[name] = newStyle[name];
+               }
+       }
+
+       return diff;
+}
+
+$.effects.animateClass = function(value, duration, easing, callback) {
+       if ($.isFunction(easing)) {
+               callback = easing;
+               easing = null;
+       }
+
+       return this.queue(function() {
+               var that = $(this),
+                       originalStyleAttr = that.attr('style') || ' ',
+                       originalStyle = filterStyles(getElementStyles.call(this)),
+                       newStyle,
+                       className = that.attr('class') || "";
+
+               $.each(classAnimationActions, function(i, action) {
+                       if (value[action]) {
+                               that[action + 'Class'](value[action]);
+                       }
+               });
+               newStyle = filterStyles(getElementStyles.call(this));
+               that.attr('class', className);
+
+               that.animate(styleDifference(originalStyle, newStyle), {
+                       queue: false,
+                       duration: duration,
+                       easing: easing,
+                       complete: function() {
+                               $.each(classAnimationActions, function(i, action) {
+                                       if (value[action]) { that[action + 'Class'](value[action]); }
+                               });
+                               // work around bug in IE by clearing the cssText before setting it
+                               if (typeof that.attr('style') == 'object') {
+                                       that.attr('style').cssText = '';
+                                       that.attr('style').cssText = originalStyleAttr;
+                               } else {
+                                       that.attr('style', originalStyleAttr);
+                               }
+                               if (callback) { callback.apply(this, arguments); }
+                               $.dequeue( this );
+                       }
+               });
+       });
+};
+
+$.fn.extend({
+       _addClass: $.fn.addClass,
+       addClass: function(classNames, speed, easing, callback) {
+               return speed ? $.effects.animateClass.apply(this, [{ add: classNames },speed,easing,callback]) : this._addClass(classNames);
+       },
+
+       _removeClass: $.fn.removeClass,
+       removeClass: function(classNames,speed,easing,callback) {
+               return speed ? $.effects.animateClass.apply(this, [{ remove: classNames },speed,easing,callback]) : this._removeClass(classNames);
+       },
+
+       _toggleClass: $.fn.toggleClass,
+       toggleClass: function(classNames, force, speed, easing, callback) {
+               if ( typeof force == "boolean" || force === undefined ) {
+                       if ( !speed ) {
+                               // without speed parameter;
+                               return this._toggleClass(classNames, force);
+                       } else {
+                               return $.effects.animateClass.apply(this, [(force?{add:classNames}:{remove:classNames}),speed,easing,callback]);
+                       }
+               } else {
+                       // without switch parameter;
+                       return $.effects.animateClass.apply(this, [{ toggle: classNames },force,speed,easing]);
+               }
+       },
+
+       switchClass: function(remove,add,speed,easing,callback) {
+               return $.effects.animateClass.apply(this, [{ add: add, remove: remove },speed,easing,callback]);
+       }
+});
+
+
+
+/******************************************************************************/
+/*********************************** EFFECTS **********************************/
+/******************************************************************************/
+
+$.extend($.effects, {
+       version: "1.8.24",
+
+       // Saves a set of properties in a data storage
+       save: function(element, set) {
+               for(var i=0; i < set.length; i++) {
+                       if(set[i] !== null) element.data("ec.storage."+set[i], element[0].style[set[i]]);
+               }
+       },
+
+       // Restores a set of previously saved properties from a data storage
+       restore: function(element, set) {
+               for(var i=0; i < set.length; i++) {
+                       if(set[i] !== null) element.css(set[i], element.data("ec.storage."+set[i]));
+               }
+       },
+
+       setMode: function(el, mode) {
+               if (mode == 'toggle') mode = el.is(':hidden') ? 'show' : 'hide'; // Set for toggle
+               return mode;
+       },
+
+       getBaseline: function(origin, original) { // Translates a [top,left] array into a baseline value
+               // this should be a little more flexible in the future to handle a string & hash
+               var y, x;
+               switch (origin[0]) {
+                       case 'top': y = 0; break;
+                       case 'middle': y = 0.5; break;
+                       case 'bottom': y = 1; break;
+                       default: y = origin[0] / original.height;
+               };
+               switch (origin[1]) {
+                       case 'left': x = 0; break;
+                       case 'center': x = 0.5; break;
+                       case 'right': x = 1; break;
+                       default: x = origin[1] / original.width;
+               };
+               return {x: x, y: y};
+       },
+
+       // Wraps the element around a wrapper that copies position properties
+       createWrapper: function(element) {
+
+               // if the element is already wrapped, return it
+               if (element.parent().is('.ui-effects-wrapper')) {
+                       return element.parent();
+               }
+
+               // wrap the element
+               var props = {
+                               width: element.outerWidth(true),
+                               height: element.outerHeight(true),
+                               'float': element.css('float')
+                       },
+                       wrapper = $('<div></div>')
+                               .addClass('ui-effects-wrapper')
+                               .css({
+                                       fontSize: '100%',
+                                       background: 'transparent',
+                                       border: 'none',
+                                       margin: 0,
+                                       padding: 0
+                               }),
+                       active = document.activeElement;
+
+               // support: Firefox
+               // Firefox incorrectly exposes anonymous content
+               // https://bugzilla.mozilla.org/show_bug.cgi?id=561664
+               try {
+                       active.id;
+               } catch( e ) {
+                       active = document.body;
+               }
+
+               element.wrap( wrapper );
+
+               // Fixes #7595 - Elements lose focus when wrapped.
+               if ( element[ 0 ] === active || $.contains( element[ 0 ], active ) ) {
+                       $( active ).focus();
+               }
+               
+               wrapper = element.parent(); //Hotfix for jQuery 1.4 since some change in wrap() seems to actually loose the reference to the wrapped element
+
+               // transfer positioning properties to the wrapper
+               if (element.css('position') == 'static') {
+                       wrapper.css({ position: 'relative' });
+                       element.css({ position: 'relative' });
+               } else {
+                       $.extend(props, {
+                               position: element.css('position'),
+                               zIndex: element.css('z-index')
+                       });
+                       $.each(['top', 'left', 'bottom', 'right'], function(i, pos) {
+                               props[pos] = element.css(pos);
+                               if (isNaN(parseInt(props[pos], 10))) {
+                                       props[pos] = 'auto';
+                               }
+                       });
+                       element.css({position: 'relative', top: 0, left: 0, right: 'auto', bottom: 'auto' });
+               }
+
+               return wrapper.css(props).show();
+       },
+
+       removeWrapper: function(element) {
+               var parent,
+                       active = document.activeElement;
+               
+               if (element.parent().is('.ui-effects-wrapper')) {
+                       parent = element.parent().replaceWith(element);
+                       // Fixes #7595 - Elements lose focus when wrapped.
+                       if ( element[ 0 ] === active || $.contains( element[ 0 ], active ) ) {
+                               $( active ).focus();
+                       }
+                       return parent;
+               }
+                       
+               return element;
+       },
+
+       setTransition: function(element, list, factor, value) {
+               value = value || {};
+               $.each(list, function(i, x){
+                       var unit = element.cssUnit(x);
+                       if (unit[0] > 0) value[x] = unit[0] * factor + unit[1];
+               });
+               return value;
+       }
+});
+
+
+function _normalizeArguments(effect, options, speed, callback) {
+       // shift params for method overloading
+       if (typeof effect == 'object') {
+               callback = options;
+               speed = null;
+               options = effect;
+               effect = options.effect;
+       }
+       if ($.isFunction(options)) {
+               callback = options;
+               speed = null;
+               options = {};
+       }
+        if (typeof options == 'number' || $.fx.speeds[options]) {
+               callback = speed;
+               speed = options;
+               options = {};
+       }
+       if ($.isFunction(speed)) {
+               callback = speed;
+               speed = null;
+       }
+
+       options = options || {};
+
+       speed = speed || options.duration;
+       speed = $.fx.off ? 0 : typeof speed == 'number'
+               ? speed : speed in $.fx.speeds ? $.fx.speeds[speed] : $.fx.speeds._default;
+
+       callback = callback || options.complete;
+
+       return [effect, options, speed, callback];
+}
+
+function standardSpeed( speed ) {
+       // valid standard speeds
+       if ( !speed || typeof speed === "number" || $.fx.speeds[ speed ] ) {
+               return true;
+       }
+       
+       // invalid strings - treat as "normal" speed
+       if ( typeof speed === "string" && !$.effects[ speed ] ) {
+               return true;
+       }
+       
+       return false;
+}
+
+$.fn.extend({
+       effect: function(effect, options, speed, callback) {
+               var args = _normalizeArguments.apply(this, arguments),
+                       // TODO: make effects take actual parameters instead of a hash
+                       args2 = {
+                               options: args[1],
+                               duration: args[2],
+                               callback: args[3]
+                       },
+                       mode = args2.options.mode,
+                       effectMethod = $.effects[effect];
+               
+               if ( $.fx.off || !effectMethod ) {
+                       // delegate to the original method (e.g., .show()) if possible
+                       if ( mode ) {
+                               return this[ mode ]( args2.duration, args2.callback );
+                       } else {
+                               return this.each(function() {
+                                       if ( args2.callback ) {
+                                               args2.callback.call( this );
+                                       }
+                               });
+                       }
+               }
+               
+               return effectMethod.call(this, args2);
+       },
+
+       _show: $.fn.show,
+       show: function(speed) {
+               if ( standardSpeed( speed ) ) {
+                       return this._show.apply(this, arguments);
+               } else {
+                       var args = _normalizeArguments.apply(this, arguments);
+                       args[1].mode = 'show';
+                       return this.effect.apply(this, args);
+               }
+       },
+
+       _hide: $.fn.hide,
+       hide: function(speed) {
+               if ( standardSpeed( speed ) ) {
+                       return this._hide.apply(this, arguments);
+               } else {
+                       var args = _normalizeArguments.apply(this, arguments);
+                       args[1].mode = 'hide';
+                       return this.effect.apply(this, args);
+               }
+       },
+
+       // jQuery core overloads toggle and creates _toggle
+       __toggle: $.fn.toggle,
+       toggle: function(speed) {
+               if ( standardSpeed( speed ) || typeof speed === "boolean" || $.isFunction( speed ) ) {
+                       return this.__toggle.apply(this, arguments);
+               } else {
+                       var args = _normalizeArguments.apply(this, arguments);
+                       args[1].mode = 'toggle';
+                       return this.effect.apply(this, args);
+               }
+       },
+
+       // helper functions
+       cssUnit: function(key) {
+               var style = this.css(key), val = [];
+               $.each( ['em','px','%','pt'], function(i, unit){
+                       if(style.indexOf(unit) > 0)
+                               val = [parseFloat(style), unit];
+               });
+               return val;
+       }
+});
+
+
+
+/******************************************************************************/
+/*********************************** EASING ***********************************/
+/******************************************************************************/
+
+// based on easing equations from Robert Penner (http://www.robertpenner.com/easing)
+
+var baseEasings = {};
+
+$.each( [ "Quad", "Cubic", "Quart", "Quint", "Expo" ], function( i, name ) {
+       baseEasings[ name ] = function( p ) {
+               return Math.pow( p, i + 2 );
+       };
+});
+
+$.extend( baseEasings, {
+       Sine: function ( p ) {
+               return 1 - Math.cos( p * Math.PI / 2 );
+       },
+       Circ: function ( p ) {
+               return 1 - Math.sqrt( 1 - p * p );
+       },
+       Elastic: function( p ) {
+               return p === 0 || p === 1 ? p :
+                       -Math.pow( 2, 8 * (p - 1) ) * Math.sin( ( (p - 1) * 80 - 7.5 ) * Math.PI / 15 );
+       },
+       Back: function( p ) {
+               return p * p * ( 3 * p - 2 );
+       },
+       Bounce: function ( p ) {
+               var pow2,
+                       bounce = 4;
+
+               while ( p < ( ( pow2 = Math.pow( 2, --bounce ) ) - 1 ) / 11 ) {}
+               return 1 / Math.pow( 4, 3 - bounce ) - 7.5625 * Math.pow( ( pow2 * 3 - 2 ) / 22 - p, 2 );
+       }
+});
+
+$.each( baseEasings, function( name, easeIn ) {
+       $.easing[ "easeIn" + name ] = easeIn;
+       $.easing[ "easeOut" + name ] = function( p ) {
+               return 1 - easeIn( 1 - p );
+       };
+       $.easing[ "easeInOut" + name ] = function( p ) {
+               return p < .5 ?
+                       easeIn( p * 2 ) / 2 :
+                       easeIn( p * -2 + 2 ) / -2 + 1;
+       };
+});
+
+})(jQuery);
diff --git a/resources/lib/jquery.effects/jquery.effects.drop.js b/resources/lib/jquery.effects/jquery.effects.drop.js
new file mode 100644 (file)
index 0000000..97e5abd
--- /dev/null
@@ -0,0 +1,50 @@
+/*!
+ * jQuery UI Effects Drop 1.8.24
+ *
+ * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Drop
+ *
+ * Depends:
+ *     jquery.effects.core.js
+ */
+(function( $, undefined ) {
+
+$.effects.drop = function(o) {
+
+       return this.queue(function() {
+
+               // Create element
+               var el = $(this), props = ['position','top','bottom','left','right','opacity'];
+
+               // Set options
+               var mode = $.effects.setMode(el, o.options.mode || 'hide'); // Set Mode
+               var direction = o.options.direction || 'left'; // Default Direction
+
+               // Adjust
+               $.effects.save(el, props); el.show(); // Save & Show
+               $.effects.createWrapper(el); // Create Wrapper
+               var ref = (direction == 'up' || direction == 'down') ? 'top' : 'left';
+               var motion = (direction == 'up' || direction == 'left') ? 'pos' : 'neg';
+               var distance = o.options.distance || (ref == 'top' ? el.outerHeight( true ) / 2 : el.outerWidth( true ) / 2);
+               if (mode == 'show') el.css('opacity', 0).css(ref, motion == 'pos' ? -distance : distance); // Shift
+
+               // Animation
+               var animation = {opacity: mode == 'show' ? 1 : 0};
+               animation[ref] = (mode == 'show' ? (motion == 'pos' ? '+=' : '-=') : (motion == 'pos' ? '-=' : '+=')) + distance;
+
+               // Animate
+               el.animate(animation, { queue: false, duration: o.duration, easing: o.options.easing, complete: function() {
+                       if(mode == 'hide') el.hide(); // Hide
+                       $.effects.restore(el, props); $.effects.removeWrapper(el); // Restore
+                       if(o.callback) o.callback.apply(this, arguments); // Callback
+                       el.dequeue();
+               }});
+
+       });
+
+};
+
+})(jQuery);
diff --git a/resources/lib/jquery.effects/jquery.effects.explode.js b/resources/lib/jquery.effects/jquery.effects.explode.js
new file mode 100644 (file)
index 0000000..f63e47a
--- /dev/null
@@ -0,0 +1,79 @@
+/*!
+ * jQuery UI Effects Explode 1.8.24
+ *
+ * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Explode
+ *
+ * Depends:
+ *     jquery.effects.core.js
+ */
+(function( $, undefined ) {
+
+$.effects.explode = function(o) {
+
+       return this.queue(function() {
+
+       var rows = o.options.pieces ? Math.round(Math.sqrt(o.options.pieces)) : 3;
+       var cells = o.options.pieces ? Math.round(Math.sqrt(o.options.pieces)) : 3;
+
+       o.options.mode = o.options.mode == 'toggle' ? ($(this).is(':visible') ? 'hide' : 'show') : o.options.mode;
+       var el = $(this).show().css('visibility', 'hidden');
+       var offset = el.offset();
+
+       //Substract the margins - not fixing the problem yet.
+       offset.top -= parseInt(el.css("marginTop"),10) || 0;
+       offset.left -= parseInt(el.css("marginLeft"),10) || 0;
+
+       var width = el.outerWidth(true);
+       var height = el.outerHeight(true);
+
+       for(var i=0;i<rows;i++) { // =
+               for(var j=0;j<cells;j++) { // ||
+                       el
+                               .clone()
+                               .appendTo('body')
+                               .wrap('<div></div>')
+                               .css({
+                                       position: 'absolute',
+                                       visibility: 'visible',
+                                       left: -j*(width/cells),
+                                       top: -i*(height/rows)
+                               })
+                               .parent()
+                               .addClass('ui-effects-explode')
+                               .css({
+                                       position: 'absolute',
+                                       overflow: 'hidden',
+                                       width: width/cells,
+                                       height: height/rows,
+                                       left: offset.left + j*(width/cells) + (o.options.mode == 'show' ? (j-Math.floor(cells/2))*(width/cells) : 0),
+                                       top: offset.top + i*(height/rows) + (o.options.mode == 'show' ? (i-Math.floor(rows/2))*(height/rows) : 0),
+                                       opacity: o.options.mode == 'show' ? 0 : 1
+                               }).animate({
+                                       left: offset.left + j*(width/cells) + (o.options.mode == 'show' ? 0 : (j-Math.floor(cells/2))*(width/cells)),
+                                       top: offset.top + i*(height/rows) + (o.options.mode == 'show' ? 0 : (i-Math.floor(rows/2))*(height/rows)),
+                                       opacity: o.options.mode == 'show' ? 1 : 0
+                               }, o.duration || 500);
+               }
+       }
+
+       // Set a timeout, to call the callback approx. when the other animations have finished
+       setTimeout(function() {
+
+               o.options.mode == 'show' ? el.css({ visibility: 'visible' }) : el.css({ visibility: 'visible' }).hide();
+                               if(o.callback) o.callback.apply(el[0]); // Callback
+                               el.dequeue();
+
+                               $('div.ui-effects-explode').remove();
+
+       }, o.duration || 500);
+
+
+       });
+
+};
+
+})(jQuery);
diff --git a/resources/lib/jquery.effects/jquery.effects.fade.js b/resources/lib/jquery.effects/jquery.effects.fade.js
new file mode 100644 (file)
index 0000000..7aa37b1
--- /dev/null
@@ -0,0 +1,32 @@
+/*!
+ * jQuery UI Effects Fade 1.8.24
+ *
+ * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Fade
+ *
+ * Depends:
+ *     jquery.effects.core.js
+ */
+(function( $, undefined ) {
+
+$.effects.fade = function(o) {
+       return this.queue(function() {
+               var elem = $(this),
+                       mode = $.effects.setMode(elem, o.options.mode || 'hide');
+
+               elem.animate({ opacity: mode }, {
+                       queue: false,
+                       duration: o.duration,
+                       easing: o.options.easing,
+                       complete: function() {
+                               (o.callback && o.callback.apply(this, arguments));
+                               elem.dequeue();
+                       }
+               });
+       });
+};
+
+})(jQuery);
diff --git a/resources/lib/jquery.effects/jquery.effects.fold.js b/resources/lib/jquery.effects/jquery.effects.fold.js
new file mode 100644 (file)
index 0000000..06cc553
--- /dev/null
@@ -0,0 +1,56 @@
+/*!
+ * jQuery UI Effects Fold 1.8.24
+ *
+ * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Fold
+ *
+ * Depends:
+ *     jquery.effects.core.js
+ */
+(function( $, undefined ) {
+
+$.effects.fold = function(o) {
+
+       return this.queue(function() {
+
+               // Create element
+               var el = $(this), props = ['position','top','bottom','left','right'];
+
+               // Set options
+               var mode = $.effects.setMode(el, o.options.mode || 'hide'); // Set Mode
+               var size = o.options.size || 15; // Default fold size
+               var horizFirst = !(!o.options.horizFirst); // Ensure a boolean value
+               var duration = o.duration ? o.duration / 2 : $.fx.speeds._default / 2;
+
+               // Adjust
+               $.effects.save(el, props); el.show(); // Save & Show
+               var wrapper = $.effects.createWrapper(el).css({overflow:'hidden'}); // Create Wrapper
+               var widthFirst = ((mode == 'show') != horizFirst);
+               var ref = widthFirst ? ['width', 'height'] : ['height', 'width'];
+               var distance = widthFirst ? [wrapper.width(), wrapper.height()] : [wrapper.height(), wrapper.width()];
+               var percent = /([0-9]+)%/.exec(size);
+               if(percent) size = parseInt(percent[1],10) / 100 * distance[mode == 'hide' ? 0 : 1];
+               if(mode == 'show') wrapper.css(horizFirst ? {height: 0, width: size} : {height: size, width: 0}); // Shift
+
+               // Animation
+               var animation1 = {}, animation2 = {};
+               animation1[ref[0]] = mode == 'show' ? distance[0] : size;
+               animation2[ref[1]] = mode == 'show' ? distance[1] : 0;
+
+               // Animate
+               wrapper.animate(animation1, duration, o.options.easing)
+               .animate(animation2, duration, o.options.easing, function() {
+                       if(mode == 'hide') el.hide(); // Hide
+                       $.effects.restore(el, props); $.effects.removeWrapper(el); // Restore
+                       if(o.callback) o.callback.apply(el[0], arguments); // Callback
+                       el.dequeue();
+               });
+
+       });
+
+};
+
+})(jQuery);
diff --git a/resources/lib/jquery.effects/jquery.effects.highlight.js b/resources/lib/jquery.effects/jquery.effects.highlight.js
new file mode 100644 (file)
index 0000000..ad9e7bd
--- /dev/null
@@ -0,0 +1,50 @@
+/*!
+ * jQuery UI Effects Highlight 1.8.24
+ *
+ * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Highlight
+ *
+ * Depends:
+ *     jquery.effects.core.js
+ */
+(function( $, undefined ) {
+
+$.effects.highlight = function(o) {
+       return this.queue(function() {
+               var elem = $(this),
+                       props = ['backgroundImage', 'backgroundColor', 'opacity'],
+                       mode = $.effects.setMode(elem, o.options.mode || 'show'),
+                       animation = {
+                               backgroundColor: elem.css('backgroundColor')
+                       };
+
+               if (mode == 'hide') {
+                       animation.opacity = 0;
+               }
+
+               $.effects.save(elem, props);
+               elem
+                       .show()
+                       .css({
+                               backgroundImage: 'none',
+                               backgroundColor: o.options.color || '#ffff99'
+                       })
+                       .animate(animation, {
+                               queue: false,
+                               duration: o.duration,
+                               easing: o.options.easing,
+                               complete: function() {
+                                       (mode == 'hide' && elem.hide());
+                                       $.effects.restore(elem, props);
+                                       (mode == 'show' && !$.support.opacity && this.style.removeAttribute('filter'));
+                                       (o.callback && o.callback.apply(this, arguments));
+                                       elem.dequeue();
+                               }
+                       });
+       });
+};
+
+})(jQuery);
diff --git a/resources/lib/jquery.effects/jquery.effects.pulsate.js b/resources/lib/jquery.effects/jquery.effects.pulsate.js
new file mode 100644 (file)
index 0000000..d730bee
--- /dev/null
@@ -0,0 +1,51 @@
+/*!
+ * jQuery UI Effects Pulsate 1.8.24
+ *
+ * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Pulsate
+ *
+ * Depends:
+ *     jquery.effects.core.js
+ */
+(function( $, undefined ) {
+
+$.effects.pulsate = function(o) {
+       return this.queue(function() {
+               var elem = $(this),
+                       mode = $.effects.setMode(elem, o.options.mode || 'show'),
+                       times = ((o.options.times || 5) * 2) - 1,
+                       duration = o.duration ? o.duration / 2 : $.fx.speeds._default / 2,
+                       isVisible = elem.is(':visible'),
+                       animateTo = 0;
+
+               if (!isVisible) {
+                       elem.css('opacity', 0).show();
+                       animateTo = 1;
+               }
+
+               if ((mode == 'hide' && isVisible) || (mode == 'show' && !isVisible)) {
+                       times--;
+               }
+
+               for (var i = 0; i < times; i++) {
+                       elem.animate({ opacity: animateTo }, duration, o.options.easing);
+                       animateTo = (animateTo + 1) % 2;
+               }
+
+               elem.animate({ opacity: animateTo }, duration, o.options.easing, function() {
+                       if (animateTo == 0) {
+                               elem.hide();
+                       }
+                       (o.callback && o.callback.apply(this, arguments));
+               });
+
+               elem
+                       .queue('fx', function() { elem.dequeue(); })
+                       .dequeue();
+       });
+};
+
+})(jQuery);
diff --git a/resources/lib/jquery.effects/jquery.effects.scale.js b/resources/lib/jquery.effects/jquery.effects.scale.js
new file mode 100644 (file)
index 0000000..52d1871
--- /dev/null
@@ -0,0 +1,178 @@
+/*!
+ * jQuery UI Effects Scale 1.8.24
+ *
+ * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Scale
+ *
+ * Depends:
+ *     jquery.effects.core.js
+ */
+(function( $, undefined ) {
+
+$.effects.puff = function(o) {
+       return this.queue(function() {
+               var elem = $(this),
+                       mode = $.effects.setMode(elem, o.options.mode || 'hide'),
+                       percent = parseInt(o.options.percent, 10) || 150,
+                       factor = percent / 100,
+                       original = { height: elem.height(), width: elem.width() };
+
+               $.extend(o.options, {
+                       fade: true,
+                       mode: mode,
+                       percent: mode == 'hide' ? percent : 100,
+                       from: mode == 'hide'
+                               ? original
+                               : {
+                                       height: original.height * factor,
+                                       width: original.width * factor
+                               }
+               });
+
+               elem.effect('scale', o.options, o.duration, o.callback);
+               elem.dequeue();
+       });
+};
+
+$.effects.scale = function(o) {
+
+       return this.queue(function() {
+
+               // Create element
+               var el = $(this);
+
+               // Set options
+               var options = $.extend(true, {}, o.options);
+               var mode = $.effects.setMode(el, o.options.mode || 'effect'); // Set Mode
+               var percent = parseInt(o.options.percent,10) || (parseInt(o.options.percent,10) == 0 ? 0 : (mode == 'hide' ? 0 : 100)); // Set default scaling percent
+               var direction = o.options.direction || 'both'; // Set default axis
+               var origin = o.options.origin; // The origin of the scaling
+               if (mode != 'effect') { // Set default origin and restore for show/hide
+                       options.origin = origin || ['middle','center'];
+                       options.restore = true;
+               }
+               var original = {height: el.height(), width: el.width()}; // Save original
+               el.from = o.options.from || (mode == 'show' ? {height: 0, width: 0} : original); // Default from state
+
+               // Adjust
+               var factor = { // Set scaling factor
+                       y: direction != 'horizontal' ? (percent / 100) : 1,
+                       x: direction != 'vertical' ? (percent / 100) : 1
+               };
+               el.to = {height: original.height * factor.y, width: original.width * factor.x}; // Set to state
+
+               if (o.options.fade) { // Fade option to support puff
+                       if (mode == 'show') {el.from.opacity = 0; el.to.opacity = 1;};
+                       if (mode == 'hide') {el.from.opacity = 1; el.to.opacity = 0;};
+               };
+
+               // Animation
+               options.from = el.from; options.to = el.to; options.mode = mode;
+
+               // Animate
+               el.effect('size', options, o.duration, o.callback);
+               el.dequeue();
+       });
+
+};
+
+$.effects.size = function(o) {
+
+       return this.queue(function() {
+
+               // Create element
+               var el = $(this), props = ['position','top','bottom','left','right','width','height','overflow','opacity'];
+               var props1 = ['position','top','bottom','left','right','overflow','opacity']; // Always restore
+               var props2 = ['width','height','overflow']; // Copy for children
+               var cProps = ['fontSize'];
+               var vProps = ['borderTopWidth', 'borderBottomWidth', 'paddingTop', 'paddingBottom'];
+               var hProps = ['borderLeftWidth', 'borderRightWidth', 'paddingLeft', 'paddingRight'];
+
+               // Set options
+               var mode = $.effects.setMode(el, o.options.mode || 'effect'); // Set Mode
+               var restore = o.options.restore || false; // Default restore
+               var scale = o.options.scale || 'both'; // Default scale mode
+               var origin = o.options.origin; // The origin of the sizing
+               var original = {height: el.height(), width: el.width()}; // Save original
+               el.from = o.options.from || original; // Default from state
+               el.to = o.options.to || original; // Default to state
+               // Adjust
+               if (origin) { // Calculate baseline shifts
+                       var baseline = $.effects.getBaseline(origin, original);
+                       el.from.top = (original.height - el.from.height) * baseline.y;
+                       el.from.left = (original.width - el.from.width) * baseline.x;
+                       el.to.top = (original.height - el.to.height) * baseline.y;
+                       el.to.left = (original.width - el.to.width) * baseline.x;
+               };
+               var factor = { // Set scaling factor
+                       from: {y: el.from.height / original.height, x: el.from.width / original.width},
+                       to: {y: el.to.height / original.height, x: el.to.width / original.width}
+               };
+               if (scale == 'box' || scale == 'both') { // Scale the css box
+                       if (factor.from.y != factor.to.y) { // Vertical props scaling
+                               props = props.concat(vProps);
+                               el.from = $.effects.setTransition(el, vProps, factor.from.y, el.from);
+                               el.to = $.effects.setTransition(el, vProps, factor.to.y, el.to);
+                       };
+                       if (factor.from.x != factor.to.x) { // Horizontal props scaling
+                               props = props.concat(hProps);
+                               el.from = $.effects.setTransition(el, hProps, factor.from.x, el.from);
+                               el.to = $.effects.setTransition(el, hProps, factor.to.x, el.to);
+                       };
+               };
+               if (scale == 'content' || scale == 'both') { // Scale the content
+                       if (factor.from.y != factor.to.y) { // Vertical props scaling
+                               props = props.concat(cProps);
+                               el.from = $.effects.setTransition(el, cProps, factor.from.y, el.from);
+                               el.to = $.effects.setTransition(el, cProps, factor.to.y, el.to);
+                       };
+               };
+               $.effects.save(el, restore ? props : props1); el.show(); // Save & Show
+               $.effects.createWrapper(el); // Create Wrapper
+               el.css('overflow','hidden').css(el.from); // Shift
+
+               // Animate
+               if (scale == 'content' || scale == 'both') { // Scale the children
+                       vProps = vProps.concat(['marginTop','marginBottom']).concat(cProps); // Add margins/font-size
+                       hProps = hProps.concat(['marginLeft','marginRight']); // Add margins
+                       props2 = props.concat(vProps).concat(hProps); // Concat
+                       el.find("*[width]").each(function(){
+                               var child = $(this);
+                               if (restore) $.effects.save(child, props2);
+                               var c_original = {height: child.height(), width: child.width()}; // Save original
+                               child.from = {height: c_original.height * factor.from.y, width: c_original.width * factor.from.x};
+                               child.to = {height: c_original.height * factor.to.y, width: c_original.width * factor.to.x};
+                               if (factor.from.y != factor.to.y) { // Vertical props scaling
+                                       child.from = $.effects.setTransition(child, vProps, factor.from.y, child.from);
+                                       child.to = $.effects.setTransition(child, vProps, factor.to.y, child.to);
+                               };
+                               if (factor.from.x != factor.to.x) { // Horizontal props scaling
+                                       child.from = $.effects.setTransition(child, hProps, factor.from.x, child.from);
+                                       child.to = $.effects.setTransition(child, hProps, factor.to.x, child.to);
+                               };
+                               child.css(child.from); // Shift children
+                               child.animate(child.to, o.duration, o.options.easing, function(){
+                                       if (restore) $.effects.restore(child, props2); // Restore children
+                               }); // Animate children
+                       });
+               };
+
+               // Animate
+               el.animate(el.to, { queue: false, duration: o.duration, easing: o.options.easing, complete: function() {
+                       if (el.to.opacity === 0) {
+                               el.css('opacity', el.from.opacity);
+                       }
+                       if(mode == 'hide') el.hide(); // Hide
+                       $.effects.restore(el, restore ? props : props1); $.effects.removeWrapper(el); // Restore
+                       if(o.callback) o.callback.apply(this, arguments); // Callback
+                       el.dequeue();
+               }});
+
+       });
+
+};
+
+})(jQuery);
diff --git a/resources/lib/jquery.effects/jquery.effects.shake.js b/resources/lib/jquery.effects/jquery.effects.shake.js
new file mode 100644 (file)
index 0000000..44b8ea4
--- /dev/null
@@ -0,0 +1,57 @@
+/*!
+ * jQuery UI Effects Shake 1.8.24
+ *
+ * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Shake
+ *
+ * Depends:
+ *     jquery.effects.core.js
+ */
+(function( $, undefined ) {
+
+$.effects.shake = function(o) {
+
+       return this.queue(function() {
+
+               // Create element
+               var el = $(this), props = ['position','top','bottom','left','right'];
+
+               // Set options
+               var mode = $.effects.setMode(el, o.options.mode || 'effect'); // Set Mode
+               var direction = o.options.direction || 'left'; // Default direction
+               var distance = o.options.distance || 20; // Default distance
+               var times = o.options.times || 3; // Default # of times
+               var speed = o.duration || o.options.duration || 140; // Default speed per shake
+
+               // Adjust
+               $.effects.save(el, props); el.show(); // Save & Show
+               $.effects.createWrapper(el); // Create Wrapper
+               var ref = (direction == 'up' || direction == 'down') ? 'top' : 'left';
+               var motion = (direction == 'up' || direction == 'left') ? 'pos' : 'neg';
+
+               // Animation
+               var animation = {}, animation1 = {}, animation2 = {};
+               animation[ref] = (motion == 'pos' ? '-=' : '+=')  + distance;
+               animation1[ref] = (motion == 'pos' ? '+=' : '-=')  + distance * 2;
+               animation2[ref] = (motion == 'pos' ? '-=' : '+=')  + distance * 2;
+
+               // Animate
+               el.animate(animation, speed, o.options.easing);
+               for (var i = 1; i < times; i++) { // Shakes
+                       el.animate(animation1, speed, o.options.easing).animate(animation2, speed, o.options.easing);
+               };
+               el.animate(animation1, speed, o.options.easing).
+               animate(animation, speed / 2, o.options.easing, function(){ // Last shake
+                       $.effects.restore(el, props); $.effects.removeWrapper(el); // Restore
+                       if(o.callback) o.callback.apply(this, arguments); // Callback
+               });
+               el.queue('fx', function() { el.dequeue(); });
+               el.dequeue();
+       });
+
+};
+
+})(jQuery);
diff --git a/resources/lib/jquery.effects/jquery.effects.slide.js b/resources/lib/jquery.effects/jquery.effects.slide.js
new file mode 100644 (file)
index 0000000..502e6c9
--- /dev/null
@@ -0,0 +1,50 @@
+/*!
+ * jQuery UI Effects Slide 1.8.24
+ *
+ * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Slide
+ *
+ * Depends:
+ *     jquery.effects.core.js
+ */
+(function( $, undefined ) {
+
+$.effects.slide = function(o) {
+
+       return this.queue(function() {
+
+               // Create element
+               var el = $(this), props = ['position','top','bottom','left','right'];
+
+               // Set options
+               var mode = $.effects.setMode(el, o.options.mode || 'show'); // Set Mode
+               var direction = o.options.direction || 'left'; // Default Direction
+
+               // Adjust
+               $.effects.save(el, props); el.show(); // Save & Show
+               $.effects.createWrapper(el).css({overflow:'hidden'}); // Create Wrapper
+               var ref = (direction == 'up' || direction == 'down') ? 'top' : 'left';
+               var motion = (direction == 'up' || direction == 'left') ? 'pos' : 'neg';
+               var distance = o.options.distance || (ref == 'top' ? el.outerHeight( true ) : el.outerWidth( true ));
+               if (mode == 'show') el.css(ref, motion == 'pos' ? (isNaN(distance) ? "-" + distance : -distance) : distance); // Shift
+
+               // Animation
+               var animation = {};
+               animation[ref] = (mode == 'show' ? (motion == 'pos' ? '+=' : '-=') : (motion == 'pos' ? '-=' : '+=')) + distance;
+
+               // Animate
+               el.animate(animation, { queue: false, duration: o.duration, easing: o.options.easing, complete: function() {
+                       if(mode == 'hide') el.hide(); // Hide
+                       $.effects.restore(el, props); $.effects.removeWrapper(el); // Restore
+                       if(o.callback) o.callback.apply(this, arguments); // Callback
+                       el.dequeue();
+               }});
+
+       });
+
+};
+
+})(jQuery);
diff --git a/resources/lib/jquery.effects/jquery.effects.transfer.js b/resources/lib/jquery.effects/jquery.effects.transfer.js
new file mode 100644 (file)
index 0000000..4ee4ae8
--- /dev/null
@@ -0,0 +1,45 @@
+/*!
+ * jQuery UI Effects Transfer 1.8.24
+ *
+ * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Transfer
+ *
+ * Depends:
+ *     jquery.effects.core.js
+ */
+(function( $, undefined ) {
+
+$.effects.transfer = function(o) {
+       return this.queue(function() {
+               var elem = $(this),
+                       target = $(o.options.to),
+                       endPosition = target.offset(),
+                       animation = {
+                               top: endPosition.top,
+                               left: endPosition.left,
+                               height: target.innerHeight(),
+                               width: target.innerWidth()
+                       },
+                       startPosition = elem.offset(),
+                       transfer = $('<div class="ui-effects-transfer"></div>')
+                               .appendTo(document.body)
+                               .addClass(o.options.className)
+                               .css({
+                                       top: startPosition.top,
+                                       left: startPosition.left,
+                                       height: elem.innerHeight(),
+                                       width: elem.innerWidth(),
+                                       position: 'absolute'
+                               })
+                               .animate(animation, o.duration, o.options.easing, function() {
+                                       transfer.remove();
+                                       (o.callback && o.callback.apply(elem[0], arguments));
+                                       elem.dequeue();
+                               });
+       });
+};
+
+})(jQuery);
diff --git a/resources/lib/jquery.ui/i18n/jquery.ui.datepicker-af.js b/resources/lib/jquery.ui/i18n/jquery.ui.datepicker-af.js
new file mode 100644 (file)
index 0000000..0922ef7
--- /dev/null
@@ -0,0 +1,23 @@
+/* Afrikaans initialisation for the jQuery UI date picker plugin. */
+/* Written by Renier Pretorius. */
+jQuery(function($){
+       $.datepicker.regional['af'] = {
+               closeText: 'Selekteer',
+               prevText: 'Vorige',
+               nextText: 'Volgende',
+               currentText: 'Vandag',
+               monthNames: ['Januarie','Februarie','Maart','April','Mei','Junie',
+               'Julie','Augustus','September','Oktober','November','Desember'],
+               monthNamesShort: ['Jan', 'Feb', 'Mrt', 'Apr', 'Mei', 'Jun',
+               'Jul', 'Aug', 'Sep', 'Okt', 'Nov', 'Des'],
+               dayNames: ['Sondag', 'Maandag', 'Dinsdag', 'Woensdag', 'Donderdag', 'Vrydag', 'Saterdag'],
+               dayNamesShort: ['Son', 'Maa', 'Din', 'Woe', 'Don', 'Vry', 'Sat'],
+               dayNamesMin: ['So','Ma','Di','Wo','Do','Vr','Sa'],
+               weekHeader: 'Wk',
+               dateFormat: 'dd/mm/yy',
+               firstDay: 1,
+               isRTL: false,
+               showMonthAfterYear: false,
+               yearSuffix: ''};
+       $.datepicker.setDefaults($.datepicker.regional['af']);
+});
diff --git a/resources/lib/jquery.ui/i18n/jquery.ui.datepicker-ar.js b/resources/lib/jquery.ui/i18n/jquery.ui.datepicker-ar.js
new file mode 100644 (file)
index 0000000..8a9218d
--- /dev/null
@@ -0,0 +1,23 @@
+/* Arabic Translation for jQuery UI date picker plugin. */
+/* Khaled Alhourani -- me@khaledalhourani.com */
+/* NOTE: monthNames are the original months names and they are the Arabic names, not the new months name فبراير - يناير and there isn't any Arabic roots for these months */
+jQuery(function($){
+       $.datepicker.regional['ar'] = {
+               closeText: 'إغلاق',
+               prevText: '&#x3c;السابق',
+               nextText: 'التالي&#x3e;',
+               currentText: 'اليوم',
+               monthNames: ['كانون الثاني', 'شباط', 'آذار', 'نيسان', 'مايو', 'حزيران',
+               'تموز', 'آب', 'أيلول',       'تشرين الأول', 'تشرين الثاني', 'كانون الأول'],
+               monthNamesShort: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'],
+               dayNames: ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'],
+               dayNamesShort: ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'],
+               dayNamesMin: ['ح', 'ن', 'ث', 'ر', 'خ', 'ج', 'س'],
+               weekHeader: 'أسبوع',
+               dateFormat: 'dd/mm/yy',
+               firstDay: 6,
+               isRTL: true,
+               showMonthAfterYear: false,
+               yearSuffix: ''};
+       $.datepicker.setDefaults($.datepicker.regional['ar']);
+});
\ No newline at end of file
diff --git a/resources/lib/jquery.ui/i18n/jquery.ui.datepicker-az.js b/resources/lib/jquery.ui/i18n/jquery.ui.datepicker-az.js
new file mode 100644 (file)
index 0000000..57802a4
--- /dev/null
@@ -0,0 +1,23 @@
+/* Azerbaijani (UTF-8) initialisation for the jQuery UI date picker plugin. */
+/* Written by Jamil Najafov (necefov33@gmail.com). */
+jQuery(function($) {
+       $.datepicker.regional['az'] = {
+               closeText: 'Bağla',
+               prevText: '&#x3c;Geri',
+               nextText: 'İrəli&#x3e;',
+               currentText: 'Bugün',
+               monthNames: ['Yanvar','Fevral','Mart','Aprel','May','İyun',
+               'İyul','Avqust','Sentyabr','Oktyabr','Noyabr','Dekabr'],
+               monthNamesShort: ['Yan','Fev','Mar','Apr','May','İyun',
+               'İyul','Avq','Sen','Okt','Noy','Dek'],
+               dayNames: ['Bazar','Bazar ertəsi','Çərşənbə axşamı','Çərşənbə','Cümə axşamı','Cümə','Şənbə'],
+               dayNamesShort: ['B','Be','Ça','Ç','Ca','C','Ş'],
+               dayNamesMin: ['B','B','Ç','С','Ç','C','Ş'],
+               weekHeader: 'Hf',
+               dateFormat: 'dd.mm.yy',
+               firstDay: 1,
+               isRTL: false,
+               showMonthAfterYear: false,
+               yearSuffix: ''};
+       $.datepicker.setDefaults($.datepicker.regional['az']);
+});
\ No newline at end of file
diff --git a/resources/lib/jquery.ui/i18n/jquery.ui.datepicker-bg.js b/resources/lib/jquery.ui/i18n/jquery.ui.datepicker-bg.js
new file mode 100644 (file)
index 0000000..c19d20f
--- /dev/null
@@ -0,0 +1,24 @@
+/* Bulgarian initialisation for the jQuery UI date picker plugin. */
+/* Written by Stoyan Kyosev (http://svest.org). */
+jQuery(function($){
+    $.datepicker.regional['bg'] = {
+        closeText: 'затвори',
+        prevText: '&#x3c;назад',
+        nextText: 'напред&#x3e;',
+               nextBigText: '&#x3e;&#x3e;',
+        currentText: 'днес',
+        monthNames: ['Януари','Февруари','Март','Април','Май','Юни',
+        'Юли','Август','Септември','Октомври','Ноември','Декември'],
+        monthNamesShort: ['Яну','Фев','Мар','Апр','Май','Юни',
+        'Юли','Авг','Сеп','Окт','Нов','Дек'],
+        dayNames: ['Неделя','Понеделник','Вторник','Сряда','Четвъртък','Петък','Събота'],
+        dayNamesShort: ['Нед','Пон','Вто','Сря','Чет','Пет','Съб'],
+        dayNamesMin: ['Не','По','Вт','Ср','Че','Пе','Съ'],
+               weekHeader: 'Wk',
+        dateFormat: 'dd.mm.yy',
+               firstDay: 1,
+        isRTL: false,
+               showMonthAfterYear: false,
+               yearSuffix: ''};
+    $.datepicker.setDefaults($.datepicker.regional['bg']);
+});
diff --git a/resources/lib/jquery.ui/i18n/jquery.ui.datepicker-bs.js b/resources/lib/jquery.ui/i18n/jquery.ui.datepicker-bs.js
new file mode 100644 (file)
index 0000000..d4dc8b0
--- /dev/null
@@ -0,0 +1,23 @@
+/* Bosnian i18n for the jQuery UI date picker plugin. */
+/* Written by Kenan Konjo. */
+jQuery(function($){
+       $.datepicker.regional['bs'] = {
+               closeText: 'Zatvori', 
+               prevText: '&#x3c;', 
+               nextText: '&#x3e;', 
+               currentText: 'Danas', 
+               monthNames: ['Januar','Februar','Mart','April','Maj','Juni',
+               'Juli','August','Septembar','Oktobar','Novembar','Decembar'],
+               monthNamesShort: ['Jan','Feb','Mar','Apr','Maj','Jun',
+               'Jul','Aug','Sep','Okt','Nov','Dec'],
+               dayNames: ['Nedelja','Ponedeljak','Utorak','Srijeda','Četvrtak','Petak','Subota'],
+               dayNamesShort: ['Ned','Pon','Uto','Sri','Čet','Pet','Sub'],
+               dayNamesMin: ['Ne','Po','Ut','Sr','Če','Pe','Su'],
+               weekHeader: 'Wk',
+               dateFormat: 'dd.mm.yy',
+               firstDay: 1,
+               isRTL: false,
+               showMonthAfterYear: false,
+               yearSuffix: ''};
+       $.datepicker.setDefaults($.datepicker.regional['bs']);
+});
\ No newline at end of file
diff --git a/resources/lib/jquery.ui/i18n/jquery.ui.datepicker-ca.js b/resources/lib/jquery.ui/i18n/jquery.ui.datepicker-ca.js
new file mode 100644 (file)
index 0000000..b128e69
--- /dev/null
@@ -0,0 +1,23 @@
+/* Inicialització en català per a l'extenció 'calendar' per jQuery. */
+/* Writers: (joan.leon@gmail.com). */
+jQuery(function($){
+       $.datepicker.regional['ca'] = {
+               closeText: 'Tancar',
+               prevText: '&#x3c;Ant',
+               nextText: 'Seg&#x3e;',
+               currentText: 'Avui',
+               monthNames: ['Gener','Febrer','Mar&ccedil;','Abril','Maig','Juny',
+               'Juliol','Agost','Setembre','Octubre','Novembre','Desembre'],
+               monthNamesShort: ['Gen','Feb','Mar','Abr','Mai','Jun',
+               'Jul','Ago','Set','Oct','Nov','Des'],
+               dayNames: ['Diumenge','Dilluns','Dimarts','Dimecres','Dijous','Divendres','Dissabte'],
+               dayNamesShort: ['Dug','Dln','Dmt','Dmc','Djs','Dvn','Dsb'],
+               dayNamesMin: ['Dg','Dl','Dt','Dc','Dj','Dv','Ds'],
+               weekHeader: 'Sm',
+               dateFormat: 'dd/mm/yy',
+               firstDay: 1,
+               isRTL: false,
+               showMonthAfterYear: false,
+               yearSuffix: ''};
+       $.datepicker.setDefaults($.datepicker.regional['ca']);
+});
\ No newline at end of file
diff --git a/resources/lib/jquery.ui/i18n/jquery.ui.datepicker-cs.js b/resources/lib/jquery.ui/i18n/jquery.ui.datepicker-cs.js
new file mode 100644 (file)
index 0000000..9805bcd
--- /dev/null
@@ -0,0 +1,23 @@
+/* Czech initialisation for the jQuery UI date picker plugin. */
+/* Written by Tomas Muller (tomas@tomas-muller.net). */
+jQuery(function($){
+       $.datepicker.regional['cs'] = {
+               closeText: 'Zavřít',
+               prevText: '&#x3c;Dříve',
+               nextText: 'Později&#x3e;',
+               currentText: 'Nyní',
+               monthNames: ['leden','únor','březen','duben','květen','červen',
+        'červenec','srpen','září','říjen','listopad','prosinec'],
+               monthNamesShort: ['led','úno','bře','dub','kvě','čer',
+               'čvc','srp','zář','říj','lis','pro'],
+               dayNames: ['neděle', 'pondělí', 'úterý', 'středa', 'čtvrtek', 'pátek', 'sobota'],
+               dayNamesShort: ['ne', 'po', 'út', 'st', 'čt', 'pá', 'so'],
+               dayNamesMin: ['ne','po','út','st','čt','pá','so'],
+               weekHeader: 'Týd',
+               dateFormat: 'dd.mm.yy',
+               firstDay: 1,
+               isRTL: false,
+               showMonthAfterYear: false,
+               yearSuffix: ''};
+       $.datepicker.setDefaults($.datepicker.regional['cs']);
+});
diff --git a/resources/lib/jquery.ui/i18n/jquery.ui.datepicker-da.js b/resources/lib/jquery.ui/i18n/jquery.ui.datepicker-da.js
new file mode 100644 (file)
index 0000000..176044e
--- /dev/null
@@ -0,0 +1,23 @@
+/* Danish initialisation for the jQuery UI date picker plugin. */
+/* Written by Jan Christensen ( deletestuff@gmail.com). */
+jQuery(function($){
+    $.datepicker.regional['da'] = {
+               closeText: 'Luk',
+        prevText: '&#x3c;Forrige',
+               nextText: 'Næste&#x3e;',
+               currentText: 'Idag',
+        monthNames: ['Januar','Februar','Marts','April','Maj','Juni',
+        'Juli','August','September','Oktober','November','December'],
+        monthNamesShort: ['Jan','Feb','Mar','Apr','Maj','Jun',
+        'Jul','Aug','Sep','Okt','Nov','Dec'],
+               dayNames: ['Søndag','Mandag','Tirsdag','Onsdag','Torsdag','Fredag','Lørdag'],
+               dayNamesShort: ['Søn','Man','Tir','Ons','Tor','Fre','Lør'],
+               dayNamesMin: ['Sø','Ma','Ti','On','To','Fr','Lø'],
+               weekHeader: 'Uge',
+        dateFormat: 'dd-mm-yy',
+               firstDay: 1,
+               isRTL: false,
+               showMonthAfterYear: false,
+               yearSuffix: ''};
+    $.datepicker.setDefaults($.datepicker.regional['da']);
+});
diff --git a/resources/lib/jquery.ui/i18n/jquery.ui.datepicker-de.js b/resources/lib/jquery.ui/i18n/jquery.ui.datepicker-de.js
new file mode 100644 (file)
index 0000000..f3ef9e8
--- /dev/null
@@ -0,0 +1,23 @@
+/* German initialisation for the jQuery UI date picker plugin. */
+/* Written by Milian Wolff (mail@milianw.de). */
+jQuery(function($){
+       $.datepicker.regional['de'] = {
+               closeText: 'schließen',
+               prevText: '&#x3c;zurück',
+               nextText: 'Vor&#x3e;',
+               currentText: 'heute',
+               monthNames: ['Januar','Februar','März','April','Mai','Juni',
+               'Juli','August','September','Oktober','November','Dezember'],
+               monthNamesShort: ['Jan','Feb','Mär','Apr','Mai','Jun',
+               'Jul','Aug','Sep','Okt','Nov','Dez'],
+               dayNames: ['Sonntag','Montag','Dienstag','Mittwoch','Donnerstag','Freitag','Samstag'],
+               dayNamesShort: ['So','Mo','Di','Mi','Do','Fr','Sa'],
+               dayNamesMin: ['So','Mo','Di','Mi','Do','Fr','Sa'],
+               weekHeader: 'KW',
+               dateFormat: 'dd.mm.yy',
+               firstDay: 1,
+               isRTL: false,
+               showMonthAfterYear: false,
+               yearSuffix: ''};
+       $.datepicker.setDefaults($.datepicker.regional['de']);
+});
diff --git a/resources/lib/jquery.ui/i18n/jquery.ui.datepicker-el.js b/resources/lib/jquery.ui/i18n/jquery.ui.datepicker-el.js
new file mode 100644 (file)
index 0000000..6d775f9
--- /dev/null
@@ -0,0 +1,23 @@
+/* Greek (el) initialisation for the jQuery UI date picker plugin. */
+/* Written by Alex Cicovic (http://www.alexcicovic.com) */
+jQuery(function($){
+       $.datepicker.regional['el'] = {
+               closeText: 'Κλείσιμο',
+               prevText: 'Προηγούμενος',
+               nextText: 'Επόμενος',
+               currentText: 'Τρέχων Μήνας',
+               monthNames: ['Ιανουάριος','Φεβρουάριος','Μάρτιος','Απρίλιος','Μάιος','Ιούνιος',
+               'Ιούλιος','Αύγουστος','Σεπτέμβριος','Οκτώβριος','Νοέμβριος','Δεκέμβριος'],
+               monthNamesShort: ['Ιαν','Φεβ','Μαρ','Απρ','Μαι','Ιουν',
+               'Ιουλ','Αυγ','Σεπ','Οκτ','Νοε','Δεκ'],
+               dayNames: ['Κυριακή','Δευτέρα','Τρίτη','Τετάρτη','Πέμπτη','Παρασκευή','Σάββατο'],
+               dayNamesShort: ['Κυρ','Δευ','Τρι','Τετ','Πεμ','Παρ','Σαβ'],
+               dayNamesMin: ['Κυ','Δε','Τρ','Τε','Πε','Πα','Σα'],
+               weekHeader: 'Εβδ',
+               dateFormat: 'dd/mm/yy',
+               firstDay: 1,
+               isRTL: false,
+               showMonthAfterYear: false,
+               yearSuffix: ''};
+       $.datepicker.setDefaults($.datepicker.regional['el']);
+});
\ No newline at end of file
diff --git a/resources/lib/jquery.ui/i18n/jquery.ui.datepicker-en-GB.js b/resources/lib/jquery.ui/i18n/jquery.ui.datepicker-en-GB.js
new file mode 100644 (file)
index 0000000..16a096e
--- /dev/null
@@ -0,0 +1,23 @@
+/* English/UK initialisation for the jQuery UI date picker plugin. */
+/* Written by Stuart. */
+jQuery(function($){
+       $.datepicker.regional['en-GB'] = {
+               closeText: 'Done',
+               prevText: 'Prev',
+               nextText: 'Next',
+               currentText: 'Today',
+               monthNames: ['January','February','March','April','May','June',
+               'July','August','September','October','November','December'],
+               monthNamesShort: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',
+               'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],
+               dayNames: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],
+               dayNamesShort: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],
+               dayNamesMin: ['Su','Mo','Tu','We','Th','Fr','Sa'],
+               weekHeader: 'Wk',
+               dateFormat: 'dd/mm/yy',
+               firstDay: 1,
+               isRTL: false,
+               showMonthAfterYear: false,
+               yearSuffix: ''};
+       $.datepicker.setDefaults($.datepicker.regional['en-GB']);
+});
diff --git a/resources/lib/jquery.ui/i18n/jquery.ui.datepicker-eo.js b/resources/lib/jquery.ui/i18n/jquery.ui.datepicker-eo.js
new file mode 100644 (file)
index 0000000..6cabc2c
--- /dev/null
@@ -0,0 +1,23 @@
+/* Esperanto initialisation for the jQuery UI date picker plugin. */
+/* Written by Olivier M. (olivierweb@ifrance.com). */
+jQuery(function($){
+       $.datepicker.regional['eo'] = {
+               closeText: 'Fermi',
+               prevText: '&lt;Anta',
+               nextText: 'Sekv&gt;',
+               currentText: 'Nuna',
+               monthNames: ['Januaro','Februaro','Marto','Aprilo','Majo','Junio',
+               'Julio','Aŭgusto','Septembro','Oktobro','Novembro','Decembro'],
+               monthNamesShort: ['Jan','Feb','Mar','Apr','Maj','Jun',
+               'Jul','Aŭg','Sep','Okt','Nov','Dec'],
+               dayNames: ['Dimanĉo','Lundo','Mardo','Merkredo','Ĵaŭdo','Vendredo','Sabato'],
+               dayNamesShort: ['Dim','Lun','Mar','Mer','Ĵaŭ','Ven','Sab'],
+               dayNamesMin: ['Di','Lu','Ma','Me','Ĵa','Ve','Sa'],
+               weekHeader: 'Sb',
+               dateFormat: 'dd/mm/yy',
+               firstDay: 0,
+               isRTL: false,
+               showMonthAfterYear: false,
+               yearSuffix: ''};
+       $.datepicker.setDefaults($.datepicker.regional['eo']);
+});
diff --git a/resources/lib/jquery.ui/i18n/jquery.ui.datepicker-es.js b/resources/lib/jquery.ui/i18n/jquery.ui.datepicker-es.js
new file mode 100644 (file)
index 0000000..a02133d
--- /dev/null
@@ -0,0 +1,23 @@
+/* Inicialización en español para la extensión 'UI date picker' para jQuery. */
+/* Traducido por Vester (xvester@gmail.com). */
+jQuery(function($){
+       $.datepicker.regional['es'] = {
+               closeText: 'Cerrar',
+               prevText: '&#x3c;Ant',
+               nextText: 'Sig&#x3e;',
+               currentText: 'Hoy',
+               monthNames: ['Enero','Febrero','Marzo','Abril','Mayo','Junio',
+               'Julio','Agosto','Septiembre','Octubre','Noviembre','Diciembre'],
+               monthNamesShort: ['Ene','Feb','Mar','Abr','May','Jun',
+               'Jul','Ago','Sep','Oct','Nov','Dic'],
+               dayNames: ['Domingo','Lunes','Martes','Mi&eacute;rcoles','Jueves','Viernes','S&aacute;bado'],
+               dayNamesShort: ['Dom','Lun','Mar','Mi&eacute;','Juv','Vie','S&aacute;b'],
+               dayNamesMin: ['Do','Lu','Ma','Mi','Ju','Vi','S&aacute;'],
+               weekHeader: 'Sm',
+               dateFormat: 'dd/mm/yy',
+               firstDay: 1,
+               isRTL: false,
+               showMonthAfterYear: false,
+               yearSuffix: ''};
+       $.datepicker.setDefaults($.datepicker.regional['es']);
+});
\ No newline at end of file
diff --git a/resources/lib/jquery.ui/i18n/jquery.ui.datepicker-et.js b/resources/lib/jquery.ui/i18n/jquery.ui.datepicker-et.js
new file mode 100644 (file)
index 0000000..32702b2
--- /dev/null
@@ -0,0 +1,23 @@
+/* Estonian initialisation for the jQuery UI date picker plugin. */
+/* Written by Mart Sõmermaa (mrts.pydev at gmail com). */
+jQuery(function($){
+       $.datepicker.regional['et'] = {
+               closeText: 'Sulge',
+               prevText: 'Eelnev',
+               nextText: 'Järgnev',
+               currentText: 'Täna',
+               monthNames: ['Jaanuar','Veebruar','Märts','Aprill','Mai','Juuni',
+               'Juuli','August','September','Oktoober','November','Detsember'],
+               monthNamesShort: ['Jaan', 'Veebr', 'Märts', 'Apr', 'Mai', 'Juuni',
+               'Juuli', 'Aug', 'Sept', 'Okt', 'Nov', 'Dets'],
+               dayNames: ['Pühapäev', 'Esmaspäev', 'Teisipäev', 'Kolmapäev', 'Neljapäev', 'Reede', 'Laupäev'],
+               dayNamesShort: ['Pühap', 'Esmasp', 'Teisip', 'Kolmap', 'Neljap', 'Reede', 'Laup'],
+               dayNamesMin: ['P','E','T','K','N','R','L'],
+               weekHeader: 'näd',
+               dateFormat: 'dd.mm.yy',
+               firstDay: 1,
+               isRTL: false,
+               showMonthAfterYear: false,
+               yearSuffix: ''};
+       $.datepicker.setDefaults($.datepicker.regional['et']);
+}); 
\ No newline at end of file
diff --git a/resources/lib/jquery.ui/i18n/jquery.ui.datepicker-eu.js b/resources/lib/jquery.ui/i18n/jquery.ui.datepicker-eu.js
new file mode 100644 (file)
index 0000000..ff66e49
--- /dev/null
@@ -0,0 +1,23 @@
+/* Euskarako oinarria 'UI date picker' jquery-ko extentsioarentzat */
+/* Karrikas-ek itzulia (karrikas@karrikas.com) */
+jQuery(function($){
+       $.datepicker.regional['eu'] = {
+               closeText: 'Egina',
+               prevText: '&#x3c;Aur',
+               nextText: 'Hur&#x3e;',
+               currentText: 'Gaur',
+               monthNames: ['urtarrila','otsaila','martxoa','apirila','maiatza','ekaina',
+                       'uztaila','abuztua','iraila','urria','azaroa','abendua'],
+               monthNamesShort: ['urt.','ots.','mar.','api.','mai.','eka.',
+                       'uzt.','abu.','ira.','urr.','aza.','abe.'],
+               dayNames: ['igandea','astelehena','asteartea','asteazkena','osteguna','ostirala','larunbata'],
+               dayNamesShort: ['ig.','al.','ar.','az.','og.','ol.','lr.'],
+               dayNamesMin: ['ig','al','ar','az','og','ol','lr'],
+               weekHeader: 'As',
+               dateFormat: 'yy-mm-dd',
+               firstDay: 1,
+               isRTL: false,
+               showMonthAfterYear: false,
+               yearSuffix: ''};
+       $.datepicker.setDefaults($.datepicker.regional['eu']);
+});
\ No newline at end of file
diff --git a/resources/lib/jquery.ui/i18n/jquery.ui.datepicker-fa.js b/resources/lib/jquery.ui/i18n/jquery.ui.datepicker-fa.js
new file mode 100644 (file)
index 0000000..be8acd2
--- /dev/null
@@ -0,0 +1,59 @@
+/* Persian (Farsi) Translation for the jQuery UI date picker plugin. */
+/* Javad Mowlanezhad -- jmowla@gmail.com */
+/* Jalali calendar should supported soon! (Its implemented but I have to test it) */
+jQuery(function($) {
+       $.datepicker.regional['fa'] = {
+               closeText: 'بستن',
+               prevText: '&#x3C;قبلی',
+               nextText: 'بعدی&#x3E;',
+               currentText: 'امروز',
+               monthNames: [
+                       'فروردين',
+                       'ارديبهشت',
+                       'خرداد',
+                       'تير',
+                       'مرداد',
+                       'شهريور',
+                       'مهر',
+                       'آبان',
+                       'آذر',
+                       'دی',
+                       'بهمن',
+                       'اسفند'
+               ],
+               monthNamesShort: ['1','2','3','4','5','6','7','8','9','10','11','12'],
+               dayNames: [
+                       'يکشنبه',
+                       'دوشنبه',
+                       'سه‌شنبه',
+                       'چهارشنبه',
+                       'پنجشنبه',
+                       'جمعه',
+                       'شنبه'
+               ],
+               dayNamesShort: [
+                       'ی',
+                       'د',
+                       'س',
+                       'چ',
+                       'پ',
+                       'ج', 
+                       'ش'
+               ],
+               dayNamesMin: [
+                       'ی',
+                       'د',
+                       'س',
+                       'چ',
+                       'پ',
+                       'ج', 
+                       'ش'
+               ],
+               weekHeader: 'هف',
+               dateFormat: 'yy/mm/dd',
+               firstDay: 6,
+               isRTL: true,
+               showMonthAfterYear: false,
+               yearSuffix: ''};
+       $.datepicker.setDefaults($.datepicker.regional['fa']);
+});
\ No newline at end of file
diff --git a/resources/lib/jquery.ui/i18n/jquery.ui.datepicker-fi.js b/resources/lib/jquery.ui/i18n/jquery.ui.datepicker-fi.js
new file mode 100644 (file)
index 0000000..4c5adda
--- /dev/null
@@ -0,0 +1,23 @@
+/* Finnish initialisation for the jQuery UI date picker plugin. */
+/* Written by Harri Kilpiö (harrikilpio@gmail.com). */
+jQuery(function($){
+       $.datepicker.regional['fi'] = {
+               closeText: 'Sulje',
+               prevText: '&#xAB;Edellinen',
+               nextText: 'Seuraava&#xBB;',
+               currentText: 'T&#xE4;n&#xE4;&#xE4;n',
+               monthNames: ['Tammikuu','Helmikuu','Maaliskuu','Huhtikuu','Toukokuu','Kes&#xE4;kuu',
+               'Hein&#xE4;kuu','Elokuu','Syyskuu','Lokakuu','Marraskuu','Joulukuu'],
+               monthNamesShort: ['Tammi','Helmi','Maalis','Huhti','Touko','Kes&#xE4;',
+               'Hein&#xE4;','Elo','Syys','Loka','Marras','Joulu'],
+               dayNamesShort: ['Su','Ma','Ti','Ke','To','Pe','La'],
+               dayNames: ['Sunnuntai','Maanantai','Tiistai','Keskiviikko','Torstai','Perjantai','Lauantai'],
+               dayNamesMin: ['Su','Ma','Ti','Ke','To','Pe','La'],
+               weekHeader: 'Vk',
+               dateFormat: 'dd.mm.yy',
+               firstDay: 1,
+               isRTL: false,
+               showMonthAfterYear: false,
+               yearSuffix: ''};
+       $.datepicker.setDefaults($.datepicker.regional['fi']);
+});
diff --git a/resources/lib/jquery.ui/i18n/jquery.ui.datepicker-fo.js b/resources/lib/jquery.ui/i18n/jquery.ui.datepicker-fo.js
new file mode 100644 (file)
index 0000000..8a6cb99
--- /dev/null
@@ -0,0 +1,23 @@
+/* Faroese initialisation for the jQuery UI date picker plugin */
+/* Written by Sverri Mohr Olsen, sverrimo@gmail.com */
+jQuery(function($){
+       $.datepicker.regional['fo'] = {
+               closeText: 'Lat aftur',
+               prevText: '&#x3c;Fyrra',
+               nextText: 'Næsta&#x3e;',
+               currentText: 'Í dag',
+               monthNames: ['Januar','Februar','Mars','Apríl','Mei','Juni',
+               'Juli','August','September','Oktober','November','Desember'],
+               monthNamesShort: ['Jan','Feb','Mar','Apr','Mei','Jun',
+               'Jul','Aug','Sep','Okt','Nov','Des'],
+               dayNames: ['Sunnudagur','Mánadagur','Týsdagur','Mikudagur','Hósdagur','Fríggjadagur','Leyardagur'],
+               dayNamesShort: ['Sun','Mán','Týs','Mik','Hós','Frí','Ley'],
+               dayNamesMin: ['Su','Má','Tý','Mi','Hó','Fr','Le'],
+               weekHeader: 'Vk',
+               dateFormat: 'dd-mm-yy',
+               firstDay: 0,
+               isRTL: false,
+               showMonthAfterYear: false,
+               yearSuffix: ''};
+       $.datepicker.setDefaults($.datepicker.regional['fo']);
+});
diff --git a/resources/lib/jquery.ui/i18n/jquery.ui.datepicker-fr.js b/resources/lib/jquery.ui/i18n/jquery.ui.datepicker-fr.js
new file mode 100644 (file)
index 0000000..7e79363
--- /dev/null
@@ -0,0 +1,25 @@
+/* French initialisation for the jQuery UI date picker plugin. */
+/* Written by Keith Wood (kbwood{at}iinet.com.au),
+              Stéphane Nahmani (sholby@sholby.net),
+              Stéphane Raimbault <stephane.raimbault@gmail.com> */
+jQuery(function($){
+       $.datepicker.regional['fr'] = {
+               closeText: 'Fermer',
+               prevText: 'Précédent',
+               nextText: 'Suivant',
+               currentText: 'Aujourd\'hui',
+               monthNames: ['Janvier','Février','Mars','Avril','Mai','Juin',
+               'Juillet','Août','Septembre','Octobre','Novembre','Décembre'],
+               monthNamesShort: ['Janv.','Févr.','Mars','Avril','Mai','Juin',
+               'Juil.','Août','Sept.','Oct.','Nov.','Déc.'],
+               dayNames: ['Dimanche','Lundi','Mardi','Mercredi','Jeudi','Vendredi','Samedi'],
+               dayNamesShort: ['Dim.','Lun.','Mar.','Mer.','Jeu.','Ven.','Sam.'],
+               dayNamesMin: ['D','L','M','M','J','V','S'],
+               weekHeader: 'Sem.',
+               dateFormat: 'dd/mm/yy',
+               firstDay: 1,
+               isRTL: false,
+               showMonthAfterYear: false,
+               yearSuffix: ''};
+       $.datepicker.setDefaults($.datepicker.regional['fr']);
+});
diff --git a/resources/lib/jquery.ui/i18n/jquery.ui.datepicker-gl.js b/resources/lib/jquery.ui/i18n/jquery.ui.datepicker-gl.js
new file mode 100644 (file)
index 0000000..278403e
--- /dev/null
@@ -0,0 +1,23 @@
+/* Galician localization for 'UI date picker' jQuery extension. */
+/* Translated by Jorge Barreiro <yortx.barry@gmail.com>. */
+jQuery(function($){
+       $.datepicker.regional['gl'] = {
+               closeText: 'Pechar',
+               prevText: '&#x3c;Ant',
+               nextText: 'Seg&#x3e;',
+               currentText: 'Hoxe',
+               monthNames: ['Xaneiro','Febreiro','Marzo','Abril','Maio','Xuño',
+               'Xullo','Agosto','Setembro','Outubro','Novembro','Decembro'],
+               monthNamesShort: ['Xan','Feb','Mar','Abr','Mai','Xuñ',
+               'Xul','Ago','Set','Out','Nov','Dec'],
+               dayNames: ['Domingo','Luns','Martes','M&eacute;rcores','Xoves','Venres','S&aacute;bado'],
+               dayNamesShort: ['Dom','Lun','Mar','M&eacute;r','Xov','Ven','S&aacute;b'],
+               dayNamesMin: ['Do','Lu','Ma','M&eacute;','Xo','Ve','S&aacute;'],
+               weekHeader: 'Sm',
+               dateFormat: 'dd/mm/yy',
+               firstDay: 1,
+               isRTL: false,
+               showMonthAfterYear: false,
+               yearSuffix: ''};
+       $.datepicker.setDefaults($.datepicker.regional['gl']);
+});
\ No newline at end of file
diff --git a/resources/lib/jquery.ui/i18n/jquery.ui.datepicker-he.js b/resources/lib/jquery.ui/i18n/jquery.ui.datepicker-he.js
new file mode 100644 (file)
index 0000000..135cdec
--- /dev/null
@@ -0,0 +1,23 @@
+/* Hebrew initialisation for the UI Datepicker extension. */
+/* Written by Amir Hardon (ahardon at gmail dot com). */
+jQuery(function($){
+       $.datepicker.regional['he'] = {
+               closeText: 'סגור',
+               prevText: '&#x3c;הקודם',
+               nextText: 'הבא&#x3e;',
+               currentText: 'היום',
+               monthNames: ['ינואר','פברואר','מרץ','אפריל','מאי','יוני',
+               'יולי','אוגוסט','ספטמבר','אוקטובר','נובמבר','דצמבר'],
+               monthNamesShort: ['ינו','פבר','מרץ','אפר','מאי','יוני',
+               'יולי','אוג','ספט','אוק','נוב','דצמ'],
+               dayNames: ['ראשון','שני','שלישי','רביעי','חמישי','שישי','שבת'],
+               dayNamesShort: ['א\'','ב\'','ג\'','ד\'','ה\'','ו\'','שבת'],
+               dayNamesMin: ['א\'','ב\'','ג\'','ד\'','ה\'','ו\'','שבת'],
+               weekHeader: 'Wk',
+               dateFormat: 'dd/mm/yy',
+               firstDay: 0,
+               isRTL: true,
+               showMonthAfterYear: false,
+               yearSuffix: ''};
+       $.datepicker.setDefaults($.datepicker.regional['he']);
+});
diff --git a/resources/lib/jquery.ui/i18n/jquery.ui.datepicker-hi.js b/resources/lib/jquery.ui/i18n/jquery.ui.datepicker-hi.js
new file mode 100644 (file)
index 0000000..6c563b9
--- /dev/null
@@ -0,0 +1,23 @@
+/* Hindi initialisation for the jQuery UI date picker plugin. */
+/* Written by Michael Dawart. */
+jQuery(function($){
+       $.datepicker.regional['hi'] = {
+               closeText: 'बंद',
+               prevText: 'पिछला',
+               nextText: 'अगला',
+               currentText: 'आज',
+               monthNames: ['जनवरी ','फरवरी','मार्च','अप्रेल','मई','जून',
+               'जूलाई','अगस्त ','सितम्बर','अक्टूबर','नवम्बर','दिसम्बर'],
+               monthNamesShort: ['जन', 'फर', 'मार्च', 'अप्रेल', 'मई', 'जून',
+               'जूलाई', 'अग', 'सित', 'अक्ट', 'नव', 'दि'],
+               dayNames: ['रविवार', 'सोमवार', 'मंगलवार', 'बुधवार', 'गुरुवार', 'शुक्रवार', 'शनिवार'],
+               dayNamesShort: ['रवि', 'सोम', 'मंगल', 'बुध', 'गुरु', 'शुक्र', 'शनि'],
+               dayNamesMin: ['रवि', 'सोम', 'मंगल', 'बुध', 'गुरु', 'शुक्र', 'शनि'],
+               weekHeader: 'हफ्ता',
+               dateFormat: 'dd/mm/yy',
+               firstDay: 1,
+               isRTL: false,
+               showMonthAfterYear: false,
+               yearSuffix: ''};
+       $.datepicker.setDefaults($.datepicker.regional['hi']);
+});
diff --git a/resources/lib/jquery.ui/i18n/jquery.ui.datepicker-hr.js b/resources/lib/jquery.ui/i18n/jquery.ui.datepicker-hr.js
new file mode 100644 (file)
index 0000000..1eb3dd9
--- /dev/null
@@ -0,0 +1,23 @@
+/* Croatian i18n for the jQuery UI date picker plugin. */
+/* Written by Vjekoslav Nesek. */
+jQuery(function($){
+       $.datepicker.regional['hr'] = {
+               closeText: 'Zatvori',
+               prevText: '&#x3c;',
+               nextText: '&#x3e;',
+               currentText: 'Danas',
+               monthNames: ['Siječanj','Veljača','Ožujak','Travanj','Svibanj','Lipanj',
+               'Srpanj','Kolovoz','Rujan','Listopad','Studeni','Prosinac'],
+               monthNamesShort: ['Sij','Velj','Ožu','Tra','Svi','Lip',
+               'Srp','Kol','Ruj','Lis','Stu','Pro'],
+               dayNames: ['Nedjelja','Ponedjeljak','Utorak','Srijeda','Četvrtak','Petak','Subota'],
+               dayNamesShort: ['Ned','Pon','Uto','Sri','Čet','Pet','Sub'],
+               dayNamesMin: ['Ne','Po','Ut','Sr','Če','Pe','Su'],
+               weekHeader: 'Tje',
+               dateFormat: 'dd.mm.yy.',
+               firstDay: 1,
+               isRTL: false,
+               showMonthAfterYear: false,
+               yearSuffix: ''};
+       $.datepicker.setDefaults($.datepicker.regional['hr']);
+});
\ No newline at end of file
diff --git a/resources/lib/jquery.ui/i18n/jquery.ui.datepicker-hu.js b/resources/lib/jquery.ui/i18n/jquery.ui.datepicker-hu.js
new file mode 100644 (file)
index 0000000..b28c268
--- /dev/null
@@ -0,0 +1,23 @@
+/* Hungarian initialisation for the jQuery UI date picker plugin. */
+/* Written by Istvan Karaszi (jquery@spam.raszi.hu). */
+jQuery(function($){
+       $.datepicker.regional['hu'] = {
+               closeText: 'bezár',
+               prevText: 'vissza',
+               nextText: 'előre',
+               currentText: 'ma',
+               monthNames: ['Január', 'Február', 'Március', 'Április', 'Május', 'Június',
+               'Július', 'Augusztus', 'Szeptember', 'Október', 'November', 'December'],
+               monthNamesShort: ['Jan', 'Feb', 'Már', 'Ápr', 'Máj', 'Jún',
+               'Júl', 'Aug', 'Szep', 'Okt', 'Nov', 'Dec'],
+               dayNames: ['Vasárnap', 'Hétfő', 'Kedd', 'Szerda', 'Csütörtök', 'Péntek', 'Szombat'],
+               dayNamesShort: ['Vas', 'Hét', 'Ked', 'Sze', 'Csü', 'Pén', 'Szo'],
+               dayNamesMin: ['V', 'H', 'K', 'Sze', 'Cs', 'P', 'Szo'],
+               weekHeader: 'Hét',
+               dateFormat: 'yy.mm.dd.',
+               firstDay: 1,
+               isRTL: false,
+               showMonthAfterYear: true,
+               yearSuffix: ''};
+       $.datepicker.setDefaults($.datepicker.regional['hu']);
+});
diff --git a/resources/lib/jquery.ui/i18n/jquery.ui.datepicker-hy.js b/resources/lib/jquery.ui/i18n/jquery.ui.datepicker-hy.js
new file mode 100644 (file)
index 0000000..c6cc194
--- /dev/null
@@ -0,0 +1,23 @@
+/* Armenian(UTF-8) initialisation for the jQuery UI date picker plugin. */
+/* Written by Levon Zakaryan (levon.zakaryan@gmail.com)*/
+jQuery(function($){
+       $.datepicker.regional['hy'] = {
+               closeText: 'Փակել',
+               prevText: '&#x3c;Նախ.',
+               nextText: 'Հաջ.&#x3e;',
+               currentText: 'Այսօր',
+               monthNames: ['Հունվար','Փետրվար','Մարտ','Ապրիլ','Մայիս','Հունիս',
+               'Հուլիս','Օգոստոս','Սեպտեմբեր','Հոկտեմբեր','Նոյեմբեր','Դեկտեմբեր'],
+               monthNamesShort: ['Հունվ','Փետր','Մարտ','Ապր','Մայիս','Հունիս',
+               'Հուլ','Օգս','Սեպ','Հոկ','Նոյ','Դեկ'],
+               dayNames: ['կիրակի','եկուշաբթի','երեքշաբթի','չորեքշաբթի','հինգշաբթի','ուրբաթ','շաբաթ'],
+               dayNamesShort: ['կիր','երկ','երք','չրք','հնգ','ուրբ','շբթ'],
+               dayNamesMin: ['կիր','երկ','երք','չրք','հնգ','ուրբ','շբթ'],
+               weekHeader: 'ՇԲՏ',
+               dateFormat: 'dd.mm.yy',
+               firstDay: 1,
+               isRTL: false,
+               showMonthAfterYear: false,
+               yearSuffix: ''};
+       $.datepicker.setDefaults($.datepicker.regional['hy']);
+});
\ No newline at end of file
diff --git a/resources/lib/jquery.ui/i18n/jquery.ui.datepicker-id.js b/resources/lib/jquery.ui/i18n/jquery.ui.datepicker-id.js
new file mode 100644 (file)
index 0000000..c626fbb
--- /dev/null
@@ -0,0 +1,23 @@
+/* Indonesian initialisation for the jQuery UI date picker plugin. */
+/* Written by Deden Fathurahman (dedenf@gmail.com). */
+jQuery(function($){
+       $.datepicker.regional['id'] = {
+               closeText: 'Tutup',
+               prevText: '&#x3c;mundur',
+               nextText: 'maju&#x3e;',
+               currentText: 'hari ini',
+               monthNames: ['Januari','Februari','Maret','April','Mei','Juni',
+               'Juli','Agustus','September','Oktober','Nopember','Desember'],
+               monthNamesShort: ['Jan','Feb','Mar','Apr','Mei','Jun',
+               'Jul','Agus','Sep','Okt','Nop','Des'],
+               dayNames: ['Minggu','Senin','Selasa','Rabu','Kamis','Jumat','Sabtu'],
+               dayNamesShort: ['Min','Sen','Sel','Rab','kam','Jum','Sab'],
+               dayNamesMin: ['Mg','Sn','Sl','Rb','Km','jm','Sb'],
+               weekHeader: 'Mg',
+               dateFormat: 'dd/mm/yy',
+               firstDay: 0,
+               isRTL: false,
+               showMonthAfterYear: false,
+               yearSuffix: ''};
+       $.datepicker.setDefaults($.datepicker.regional['id']);
+});
\ No newline at end of file
diff --git a/resources/lib/jquery.ui/i18n/jquery.ui.datepicker-is.js b/resources/lib/jquery.ui/i18n/jquery.ui.datepicker-is.js
new file mode 100644 (file)
index 0000000..c53235a
--- /dev/null
@@ -0,0 +1,23 @@
+/* Icelandic initialisation for the jQuery UI date picker plugin. */
+/* Written by Haukur H. Thorsson (haukur@eskill.is). */
+jQuery(function($){
+       $.datepicker.regional['is'] = {
+               closeText: 'Loka',
+               prevText: '&#x3c; Fyrri',
+               nextText: 'N&aelig;sti &#x3e;',
+               currentText: '&Iacute; dag',
+               monthNames: ['Jan&uacute;ar','Febr&uacute;ar','Mars','Apr&iacute;l','Ma&iacute','J&uacute;n&iacute;',
+               'J&uacute;l&iacute;','&Aacute;g&uacute;st','September','Okt&oacute;ber','N&oacute;vember','Desember'],
+               monthNamesShort: ['Jan','Feb','Mar','Apr','Ma&iacute;','J&uacute;n',
+               'J&uacute;l','&Aacute;g&uacute;','Sep','Okt','N&oacute;v','Des'],
+               dayNames: ['Sunnudagur','M&aacute;nudagur','&THORN;ri&eth;judagur','Mi&eth;vikudagur','Fimmtudagur','F&ouml;studagur','Laugardagur'],
+               dayNamesShort: ['Sun','M&aacute;n','&THORN;ri','Mi&eth;','Fim','F&ouml;s','Lau'],
+               dayNamesMin: ['Su','M&aacute;','&THORN;r','Mi','Fi','F&ouml;','La'],
+               weekHeader: 'Vika',
+               dateFormat: 'dd/mm/yy',
+               firstDay: 0,
+               isRTL: false,
+               showMonthAfterYear: false,
+               yearSuffix: ''};
+       $.datepicker.setDefaults($.datepicker.regional['is']);
+});
\ No newline at end of file
diff --git a/resources/lib/jquery.ui/i18n/jquery.ui.datepicker-it.js b/resources/lib/jquery.ui/i18n/jquery.ui.datepicker-it.js
new file mode 100644 (file)
index 0000000..59da2df
--- /dev/null
@@ -0,0 +1,23 @@
+/* Italian initialisation for the jQuery UI date picker plugin. */
+/* Written by Antonello Pasella (antonello.pasella@gmail.com). */
+jQuery(function($){
+       $.datepicker.regional['it'] = {
+               closeText: 'Chiudi',
+               prevText: '&#x3c;Prec',
+               nextText: 'Succ&#x3e;',
+               currentText: 'Oggi',
+               monthNames: ['Gennaio','Febbraio','Marzo','Aprile','Maggio','Giugno',
+                       'Luglio','Agosto','Settembre','Ottobre','Novembre','Dicembre'],
+               monthNamesShort: ['Gen','Feb','Mar','Apr','Mag','Giu',
+                       'Lug','Ago','Set','Ott','Nov','Dic'],
+               dayNames: ['Domenica','Luned&#236','Marted&#236','Mercoled&#236','Gioved&#236','Venerd&#236','Sabato'],
+               dayNamesShort: ['Dom','Lun','Mar','Mer','Gio','Ven','Sab'],
+               dayNamesMin: ['Do','Lu','Ma','Me','Gi','Ve','Sa'],
+               weekHeader: 'Sm',
+               dateFormat: 'dd/mm/yy',
+               firstDay: 1,
+               isRTL: false,
+               showMonthAfterYear: false,
+               yearSuffix: ''};
+       $.datepicker.setDefaults($.datepicker.regional['it']);
+});
diff --git a/resources/lib/jquery.ui/i18n/jquery.ui.datepicker-ja.js b/resources/lib/jquery.ui/i18n/jquery.ui.datepicker-ja.js
new file mode 100644 (file)
index 0000000..7eb4268
--- /dev/null
@@ -0,0 +1,23 @@
+/* Japanese initialisation for the jQuery UI date picker plugin. */
+/* Written by Kentaro SATO (kentaro@ranvis.com). */
+jQuery(function($){
+       $.datepicker.regional['ja'] = {
+               closeText: '閉じる',
+               prevText: '&#x3c;前',
+               nextText: '次&#x3e;',
+               currentText: '今日',
+               monthNames: ['1月','2月','3月','4月','5月','6月',
+               '7月','8月','9月','10月','11月','12月'],
+               monthNamesShort: ['1月','2月','3月','4月','5月','6月',
+               '7月','8月','9月','10月','11月','12月'],
+               dayNames: ['日曜日','月曜日','火曜日','水曜日','木曜日','金曜日','土曜日'],
+               dayNamesShort: ['日','月','火','水','木','金','土'],
+               dayNamesMin: ['日','月','火','水','木','金','土'],
+               weekHeader: '週',
+               dateFormat: 'yy/mm/dd',
+               firstDay: 0,
+               isRTL: false,
+               showMonthAfterYear: true,
+               yearSuffix: '年'};
+       $.datepicker.setDefaults($.datepicker.regional['ja']);
+});
\ No newline at end of file
diff --git a/resources/lib/jquery.ui/i18n/jquery.ui.datepicker-ka.js b/resources/lib/jquery.ui/i18n/jquery.ui.datepicker-ka.js
new file mode 100644 (file)
index 0000000..c10658d
--- /dev/null
@@ -0,0 +1,21 @@
+/* Georgian (UTF-8) initialisation for the jQuery UI date picker plugin. */
+/* Written by Lado Lomidze (lado.lomidze@gmail.com). */
+jQuery(function($){
+       $.datepicker.regional['ka'] = {
+               closeText: 'დახურვა',
+               prevText: '&#x3c; წინა',
+               nextText: 'შემდეგი &#x3e;',
+               currentText: 'დღეს',
+               monthNames: ['იანვარი','თებერვალი','მარტი','აპრილი','მაისი','ივნისი', 'ივლისი','აგვისტო','სექტემბერი','ოქტომბერი','ნოემბერი','დეკემბერი'],
+               monthNamesShort: ['იან','თებ','მარ','აპრ','მაი','ივნ', 'ივლ','აგვ','სექ','ოქტ','ნოე','დეკ'],
+               dayNames: ['კვირა','ორშაბათი','სამშაბათი','ოთხშაბათი','ხუთშაბათი','პარასკევი','შაბათი'],
+               dayNamesShort: ['კვ','ორშ','სამ','ოთხ','ხუთ','პარ','შაბ'],
+               dayNamesMin: ['კვ','ორშ','სამ','ოთხ','ხუთ','პარ','შაბ'],
+               weekHeader: 'კვირა',
+               dateFormat: 'dd-mm-yy',
+               firstDay: 1,
+               isRTL: false,
+               showMonthAfterYear: false,
+               yearSuffix: ''};
+       $.datepicker.setDefaults($.datepicker.regional['ka']);
+});
diff --git a/resources/lib/jquery.ui/i18n/jquery.ui.datepicker-kk.js b/resources/lib/jquery.ui/i18n/jquery.ui.datepicker-kk.js
new file mode 100644 (file)
index 0000000..79e3f24
--- /dev/null
@@ -0,0 +1,23 @@
+/* Kazakh (UTF-8) initialisation for the jQuery UI date picker plugin. */
+/* Written by Dmitriy Karasyov (dmitriy.karasyov@gmail.com). */
+jQuery(function($){
+       $.datepicker.regional['kk'] = {
+               closeText: 'Жабу',
+               prevText: '&#x3c;Алдыңғы',
+               nextText: 'Келесі&#x3e;',
+               currentText: 'Бүгін',
+               monthNames: ['Қаңтар','Ақпан','Наурыз','Сәуір','Мамыр','Маусым',
+               'Шілде','Тамыз','Қыркүйек','Қазан','Қараша','Желтоқсан'],
+               monthNamesShort: ['Қаң','Ақп','Нау','Сәу','Мам','Мау',
+               'Шіл','Там','Қыр','Қаз','Қар','Жел'],
+               dayNames: ['Жексенбі','Дүйсенбі','Сейсенбі','Сәрсенбі','Бейсенбі','Жұма','Сенбі'],
+               dayNamesShort: ['жкс','дсн','ссн','срс','бсн','жма','снб'],
+               dayNamesMin: ['Жк','Дс','Сс','Ср','Бс','Жм','Сн'],
+               weekHeader: 'Не',
+               dateFormat: 'dd.mm.yy',
+               firstDay: 1,
+               isRTL: false,
+               showMonthAfterYear: false,
+               yearSuffix: ''};
+       $.datepicker.setDefaults($.datepicker.regional['kk']);
+});
diff --git a/resources/lib/jquery.ui/i18n/jquery.ui.datepicker-km.js b/resources/lib/jquery.ui/i18n/jquery.ui.datepicker-km.js
new file mode 100644 (file)
index 0000000..f9c4e3a
--- /dev/null
@@ -0,0 +1,23 @@
+/* Khmer initialisation for the jQuery calendar extension. */
+/* Written by Chandara Om (chandara.teacher@gmail.com). */
+jQuery(function($){
+       $.datepicker.regional['km'] = {
+               closeText: 'ធ្វើ​រួច',
+               prevText: 'មុន',
+               nextText: 'បន្ទាប់',
+               currentText: 'ថ្ងៃ​នេះ',
+               monthNames: ['មករា','កុម្ភៈ','មីនា','មេសា','ឧសភា','មិថុនា',
+               'កក្កដា','សីហា','កញ្ញា','តុលា','វិច្ឆិកា','ធ្នូ'],
+               monthNamesShort: ['មករា','កុម្ភៈ','មីនា','មេសា','ឧសភា','មិថុនា',
+               'កក្កដា','សីហា','កញ្ញា','តុលា','វិច្ឆិកា','ធ្នូ'],
+               dayNames: ['អាទិត្យ', 'ចន្ទ', 'អង្គារ', 'ពុធ', 'ព្រហស្បតិ៍', 'សុក្រ', 'សៅរ៍'],
+               dayNamesShort: ['អា', 'ច', 'អ', 'ពុ', 'ព្រហ', 'សុ', 'សៅ'],
+               dayNamesMin: ['អា', 'ច', 'អ', 'ពុ', 'ព្រហ', 'សុ', 'សៅ'],
+               weekHeader: 'សប្ដាហ៍',
+               dateFormat: 'dd-mm-yy',
+               firstDay: 1,
+               isRTL: false,
+               showMonthAfterYear: false,
+               yearSuffix: ''};
+       $.datepicker.setDefaults($.datepicker.regional['km']);
+});
diff --git a/resources/lib/jquery.ui/i18n/jquery.ui.datepicker-ko.js b/resources/lib/jquery.ui/i18n/jquery.ui.datepicker-ko.js
new file mode 100644 (file)
index 0000000..0411242
--- /dev/null
@@ -0,0 +1,23 @@
+/* Korean initialisation for the jQuery calendar extension. */
+/* Written by DaeKwon Kang (ncrash.dk@gmail.com), Edited by Genie. */
+jQuery(function($){
+       $.datepicker.regional['ko'] = {
+               closeText: '닫기',
+               prevText: '이전달',
+               nextText: '다음달',
+               currentText: '오늘',
+               monthNames: ['1월','2월','3월','4월','5월','6월',
+               '7월','8월','9월','10월','11월','12월'],
+               monthNamesShort: ['1월','2월','3월','4월','5월','6월',
+               '7월','8월','9월','10월','11월','12월'],
+               dayNames: ['일요일','월요일','화요일','수요일','목요일','금요일','토요일'],
+               dayNamesShort: ['일','월','화','수','목','금','토'],
+               dayNamesMin: ['일','월','화','수','목','금','토'],
+               weekHeader: 'Wk',
+               dateFormat: 'yy-mm-dd',
+               firstDay: 0,
+               isRTL: false,
+               showMonthAfterYear: true,
+               yearSuffix: '년'};
+       $.datepicker.setDefaults($.datepicker.regional['ko']);
+});
\ No newline at end of file
diff --git a/resources/lib/jquery.ui/i18n/jquery.ui.datepicker-lb.js b/resources/lib/jquery.ui/i18n/jquery.ui.datepicker-lb.js
new file mode 100644 (file)
index 0000000..87c79d5
--- /dev/null
@@ -0,0 +1,23 @@
+/* Luxembourgish initialisation for the jQuery UI date picker plugin. */
+/* Written by Michel Weimerskirch <michel@weimerskirch.net> */
+jQuery(function($){
+       $.datepicker.regional['lb'] = {
+               closeText: 'Fäerdeg',
+               prevText: 'Zréck',
+               nextText: 'Weider',
+               currentText: 'Haut',
+               monthNames: ['Januar','Februar','Mäerz','Abrëll','Mee','Juni',
+               'Juli','August','September','Oktober','November','Dezember'],
+               monthNamesShort: ['Jan', 'Feb', 'Mäe', 'Abr', 'Mee', 'Jun',
+               'Jul', 'Aug', 'Sep', 'Okt', 'Nov', 'Dez'],
+               dayNames: ['Sonndeg', 'Méindeg', 'Dënschdeg', 'Mëttwoch', 'Donneschdeg', 'Freideg', 'Samschdeg'],
+               dayNamesShort: ['Son', 'Méi', 'Dën', 'Mët', 'Don', 'Fre', 'Sam'],
+               dayNamesMin: ['So','Mé','Dë','Më','Do','Fr','Sa'],
+               weekHeader: 'W',
+               dateFormat: 'dd.mm.yy',
+               firstDay: 1,
+               isRTL: false,
+               showMonthAfterYear: false,
+               yearSuffix: ''};
+       $.datepicker.setDefaults($.datepicker.regional['lb']);
+});
diff --git a/resources/lib/jquery.ui/i18n/jquery.ui.datepicker-lt.js b/resources/lib/jquery.ui/i18n/jquery.ui.datepicker-lt.js
new file mode 100644 (file)
index 0000000..67d5119
--- /dev/null
@@ -0,0 +1,23 @@
+/* Lithuanian (UTF-8) initialisation for the jQuery UI date picker plugin. */
+/* @author Arturas Paleicikas <arturas@avalon.lt> */
+jQuery(function($){
+       $.datepicker.regional['lt'] = {
+               closeText: 'Uždaryti',
+               prevText: '&#x3c;Atgal',
+               nextText: 'Pirmyn&#x3e;',
+               currentText: 'Šiandien',
+               monthNames: ['Sausis','Vasaris','Kovas','Balandis','Gegužė','Birželis',
+               'Liepa','Rugpjūtis','Rugsėjis','Spalis','Lapkritis','Gruodis'],
+               monthNamesShort: ['Sau','Vas','Kov','Bal','Geg','Bir',
+               'Lie','Rugp','Rugs','Spa','Lap','Gru'],
+               dayNames: ['sekmadienis','pirmadienis','antradienis','trečiadienis','ketvirtadienis','penktadienis','šeštadienis'],
+               dayNamesShort: ['sek','pir','ant','tre','ket','pen','šeš'],
+               dayNamesMin: ['Se','Pr','An','Tr','Ke','Pe','Še'],
+               weekHeader: 'Wk',
+               dateFormat: 'yy-mm-dd',
+               firstDay: 1,
+               isRTL: false,
+               showMonthAfterYear: false,
+               yearSuffix: ''};
+       $.datepicker.setDefaults($.datepicker.regional['lt']);
+});
\ No newline at end of file
diff --git a/resources/lib/jquery.ui/i18n/jquery.ui.datepicker-lv.js b/resources/lib/jquery.ui/i18n/jquery.ui.datepicker-lv.js
new file mode 100644 (file)
index 0000000..003934e
--- /dev/null
@@ -0,0 +1,23 @@
+/* Latvian (UTF-8) initialisation for the jQuery UI date picker plugin. */
+/* @author Arturas Paleicikas <arturas.paleicikas@metasite.net> */
+jQuery(function($){
+       $.datepicker.regional['lv'] = {
+               closeText: 'Aizvērt',
+               prevText: 'Iepr',
+               nextText: 'Nāka',
+               currentText: 'Šodien',
+               monthNames: ['Janvāris','Februāris','Marts','Aprīlis','Maijs','Jūnijs',
+               'Jūlijs','Augusts','Septembris','Oktobris','Novembris','Decembris'],
+               monthNamesShort: ['Jan','Feb','Mar','Apr','Mai','Jūn',
+               'Jūl','Aug','Sep','Okt','Nov','Dec'],
+               dayNames: ['svētdiena','pirmdiena','otrdiena','trešdiena','ceturtdiena','piektdiena','sestdiena'],
+               dayNamesShort: ['svt','prm','otr','tre','ctr','pkt','sst'],
+               dayNamesMin: ['Sv','Pr','Ot','Tr','Ct','Pk','Ss'],
+               weekHeader: 'Nav',
+               dateFormat: 'dd-mm-yy',
+               firstDay: 1,
+               isRTL: false,
+               showMonthAfterYear: false,
+               yearSuffix: ''};
+       $.datepicker.setDefaults($.datepicker.regional['lv']);
+});
\ No newline at end of file
diff --git a/resources/lib/jquery.ui/i18n/jquery.ui.datepicker-mk.js b/resources/lib/jquery.ui/i18n/jquery.ui.datepicker-mk.js
new file mode 100644 (file)
index 0000000..0285325
--- /dev/null
@@ -0,0 +1,23 @@
+/* Macedonian i18n for the jQuery UI date picker plugin. */
+/* Written by Stojce Slavkovski. */
+jQuery(function($){
+       $.datepicker.regional['mk'] = {
+               closeText: 'Затвори',
+               prevText: '&#x3C;',
+               nextText: '&#x3E;',
+               currentText: 'Денес',
+               monthNames: ['Јануари','Февруари','Март','Април','Мај','Јуни',
+               'Јули','Август','Септември','Октомври','Ноември','Декември'],
+               monthNamesShort: ['Јан','Фев','Мар','Апр','Мај','Јун',
+               'Јул','Авг','Сеп','Окт','Ное','Дек'],
+               dayNames: ['Недела','Понеделник','Вторник','Среда','Четврток','Петок','Сабота'],
+               dayNamesShort: ['Нед','Пон','Вто','Сре','Чет','Пет','Саб'],
+               dayNamesMin: ['Не','По','Вт','Ср','Че','Пе','Са'],
+               weekHeader: 'Сед',
+               dateFormat: 'dd.mm.yy',
+               firstDay: 1,
+               isRTL: false,
+               showMonthAfterYear: false,
+               yearSuffix: ''};
+       $.datepicker.setDefaults($.datepicker.regional['mk']);
+});
diff --git a/resources/lib/jquery.ui/i18n/jquery.ui.datepicker-ml.js b/resources/lib/jquery.ui/i18n/jquery.ui.datepicker-ml.js
new file mode 100644 (file)
index 0000000..1e3432c
--- /dev/null
@@ -0,0 +1,23 @@
+/* Malayalam (UTF-8) initialisation for the jQuery UI date picker plugin. */
+/* Written by Saji Nediyanchath (saji89@gmail.com). */
+jQuery(function($){
+       $.datepicker.regional['ml'] = {
+               closeText: 'ശരി',
+               prevText: 'മുന്നത്തെ',  
+               nextText: 'അടുത്തത് ',
+               currentText: 'ഇന്ന്',
+               monthNames: ['ജനുവരി','ഫെബ്രുവരി','മാര്‍ച്ച്','ഏപ്രില്‍','മേയ്','ജൂണ്‍',
+               'ജൂലൈ','ആഗസ്റ്റ്','സെപ്റ്റംബര്‍','ഒക്ടോബര്‍','നവംബര്‍','ഡിസംബര്‍'],
+               monthNamesShort: ['ജനു', 'ഫെബ്', 'മാര്‍', 'ഏപ്രി', 'മേയ്', 'ജൂണ്‍',
+               'ജൂലാ', 'ആഗ', 'സെപ്', 'ഒക്ടോ', 'നവം', 'ഡിസ'],
+               dayNames: ['ഞായര്‍', 'തിങ്കള്‍', 'ചൊവ്വ', 'ബുധന്‍', 'വ്യാഴം', 'വെള്ളി', 'ശനി'],
+               dayNamesShort: ['ഞായ', 'തിങ്ക', 'ചൊവ്വ', 'ബുധ', 'വ്യാഴം', 'വെള്ളി', 'ശനി'],
+               dayNamesMin: ['ഞാ','തി','ചൊ','ബു','വ്യാ','വെ','ശ'],
+               weekHeader: 'ആ',
+               dateFormat: 'dd/mm/yy',
+               firstDay: 1,
+               isRTL: false,
+               showMonthAfterYear: false,
+               yearSuffix: ''};
+       $.datepicker.setDefaults($.datepicker.regional['ml']);
+});
diff --git a/resources/lib/jquery.ui/i18n/jquery.ui.datepicker-ms.js b/resources/lib/jquery.ui/i18n/jquery.ui.datepicker-ms.js
new file mode 100644 (file)
index 0000000..e953ac0
--- /dev/null
@@ -0,0 +1,23 @@
+/* Malaysian initialisation for the jQuery UI date picker plugin. */
+/* Written by Mohd Nawawi Mohamad Jamili (nawawi@ronggeng.net). */
+jQuery(function($){
+       $.datepicker.regional['ms'] = {
+               closeText: 'Tutup',
+               prevText: '&#x3c;Sebelum',
+               nextText: 'Selepas&#x3e;',
+               currentText: 'hari ini',
+               monthNames: ['Januari','Februari','Mac','April','Mei','Jun',
+               'Julai','Ogos','September','Oktober','November','Disember'],
+               monthNamesShort: ['Jan','Feb','Mac','Apr','Mei','Jun',
+               'Jul','Ogo','Sep','Okt','Nov','Dis'],
+               dayNames: ['Ahad','Isnin','Selasa','Rabu','Khamis','Jumaat','Sabtu'],
+               dayNamesShort: ['Aha','Isn','Sel','Rab','kha','Jum','Sab'],
+               dayNamesMin: ['Ah','Is','Se','Ra','Kh','Ju','Sa'],
+               weekHeader: 'Mg',
+               dateFormat: 'dd/mm/yy',
+               firstDay: 0,
+               isRTL: false,
+               showMonthAfterYear: false,
+               yearSuffix: ''};
+       $.datepicker.setDefaults($.datepicker.regional['ms']);
+});
\ No newline at end of file
diff --git a/resources/lib/jquery.ui/i18n/jquery.ui.datepicker-nl.js b/resources/lib/jquery.ui/i18n/jquery.ui.datepicker-nl.js
new file mode 100644 (file)
index 0000000..781fe61
--- /dev/null
@@ -0,0 +1,23 @@
+/* Dutch (UTF-8) initialisation for the jQuery UI date picker plugin. */
+/* Written by Mathias Bynens <http://mathiasbynens.be/> */
+jQuery(function($){
+       $.datepicker.regional.nl = {
+               closeText: 'Sluiten',
+               prevText: '←',
+               nextText: '→',
+               currentText: 'Vandaag',
+               monthNames: ['januari', 'februari', 'maart', 'april', 'mei', 'juni',
+               'juli', 'augustus', 'september', 'oktober', 'november', 'december'],
+               monthNamesShort: ['jan', 'feb', 'mrt', 'apr', 'mei', 'jun',
+               'jul', 'aug', 'sep', 'okt', 'nov', 'dec'],
+               dayNames: ['zondag', 'maandag', 'dinsdag', 'woensdag', 'donderdag', 'vrijdag', 'zaterdag'],
+               dayNamesShort: ['zon', 'maa', 'din', 'woe', 'don', 'vri', 'zat'],
+               dayNamesMin: ['zo', 'ma', 'di', 'wo', 'do', 'vr', 'za'],
+               weekHeader: 'Wk',
+               dateFormat: 'dd-mm-yy',
+               firstDay: 1,
+               isRTL: false,
+               showMonthAfterYear: false,
+               yearSuffix: ''};
+       $.datepicker.setDefaults($.datepicker.regional.nl);
+});
\ No newline at end of file
diff --git a/resources/lib/jquery.ui/i18n/jquery.ui.datepicker-no.js b/resources/lib/jquery.ui/i18n/jquery.ui.datepicker-no.js
new file mode 100644 (file)
index 0000000..2507043
--- /dev/null
@@ -0,0 +1,23 @@
+/* Norwegian initialisation for the jQuery UI date picker plugin. */
+/* Written by Naimdjon Takhirov (naimdjon@gmail.com). */
+
+jQuery(function($){
+  $.datepicker.regional['no'] = {
+    closeText: 'Lukk',
+    prevText: '&laquo;Forrige',
+    nextText: 'Neste&raquo;',
+    currentText: 'I dag',
+    monthNames: ['januar','februar','mars','april','mai','juni','juli','august','september','oktober','november','desember'],
+    monthNamesShort: ['jan','feb','mar','apr','mai','jun','jul','aug','sep','okt','nov','des'],
+    dayNamesShort: ['søn','man','tir','ons','tor','fre','lør'],
+    dayNames: ['søndag','mandag','tirsdag','onsdag','torsdag','fredag','lørdag'],
+    dayNamesMin: ['sø','ma','ti','on','to','fr','lø'],
+    weekHeader: 'Uke',
+    dateFormat: 'dd.mm.yy',
+    firstDay: 1,
+    isRTL: false,
+    showMonthAfterYear: false,
+    yearSuffix: ''
+  };
+  $.datepicker.setDefaults($.datepicker.regional['no']);
+});
diff --git a/resources/lib/jquery.ui/i18n/jquery.ui.datepicker-pl.js b/resources/lib/jquery.ui/i18n/jquery.ui.datepicker-pl.js
new file mode 100644 (file)
index 0000000..61fa29c
--- /dev/null
@@ -0,0 +1,23 @@
+/* Polish initialisation for the jQuery UI date picker plugin. */
+/* Written by Jacek Wysocki (jacek.wysocki@gmail.com). */
+jQuery(function($){
+       $.datepicker.regional['pl'] = {
+               closeText: 'Zamknij',
+               prevText: '&#x3c;Poprzedni',
+               nextText: 'Następny&#x3e;',
+               currentText: 'Dziś',
+               monthNames: ['Styczeń','Luty','Marzec','Kwiecień','Maj','Czerwiec',
+               'Lipiec','Sierpień','Wrzesień','Październik','Listopad','Grudzień'],
+               monthNamesShort: ['Sty','Lu','Mar','Kw','Maj','Cze',
+               'Lip','Sie','Wrz','Pa','Lis','Gru'],
+               dayNames: ['Niedziela','Poniedziałek','Wtorek','Środa','Czwartek','Piątek','Sobota'],
+               dayNamesShort: ['Nie','Pn','Wt','Śr','Czw','Pt','So'],
+               dayNamesMin: ['N','Pn','Wt','Śr','Cz','Pt','So'],
+               weekHeader: 'Tydz',
+               dateFormat: 'dd.mm.yy',
+               firstDay: 1,
+               isRTL: false,
+               showMonthAfterYear: false,
+               yearSuffix: ''};
+       $.datepicker.setDefaults($.datepicker.regional['pl']);
+});
diff --git a/resources/lib/jquery.ui/i18n/jquery.ui.datepicker-pt-BR.js b/resources/lib/jquery.ui/i18n/jquery.ui.datepicker-pt-BR.js
new file mode 100644 (file)
index 0000000..3cc8c79
--- /dev/null
@@ -0,0 +1,23 @@
+/* Brazilian initialisation for the jQuery UI date picker plugin. */
+/* Written by Leonildo Costa Silva (leocsilva@gmail.com). */
+jQuery(function($){
+       $.datepicker.regional['pt-BR'] = {
+               closeText: 'Fechar',
+               prevText: '&#x3c;Anterior',
+               nextText: 'Pr&oacute;ximo&#x3e;',
+               currentText: 'Hoje',
+               monthNames: ['Janeiro','Fevereiro','Mar&ccedil;o','Abril','Maio','Junho',
+               'Julho','Agosto','Setembro','Outubro','Novembro','Dezembro'],
+               monthNamesShort: ['Jan','Fev','Mar','Abr','Mai','Jun',
+               'Jul','Ago','Set','Out','Nov','Dez'],
+               dayNames: ['Domingo','Segunda-feira','Ter&ccedil;a-feira','Quarta-feira','Quinta-feira','Sexta-feira','S&aacute;bado'],
+               dayNamesShort: ['Dom','Seg','Ter','Qua','Qui','Sex','S&aacute;b'],
+               dayNamesMin: ['Dom','Seg','Ter','Qua','Qui','Sex','S&aacute;b'],
+               weekHeader: 'Sm',
+               dateFormat: 'dd/mm/yy',
+               firstDay: 0,
+               isRTL: false,
+               showMonthAfterYear: false,
+               yearSuffix: ''};
+       $.datepicker.setDefaults($.datepicker.regional['pt-BR']);
+});
\ No newline at end of file
diff --git a/resources/lib/jquery.ui/i18n/jquery.ui.datepicker-pt.js b/resources/lib/jquery.ui/i18n/jquery.ui.datepicker-pt.js
new file mode 100644 (file)
index 0000000..f09f5ae
--- /dev/null
@@ -0,0 +1,22 @@
+/* Portuguese initialisation for the jQuery UI date picker plugin. */
+jQuery(function($){
+       $.datepicker.regional['pt'] = {
+               closeText: 'Fechar',
+               prevText: '&#x3c;Anterior',
+               nextText: 'Seguinte',
+               currentText: 'Hoje',
+               monthNames: ['Janeiro','Fevereiro','Mar&ccedil;o','Abril','Maio','Junho',
+               'Julho','Agosto','Setembro','Outubro','Novembro','Dezembro'],
+               monthNamesShort: ['Jan','Fev','Mar','Abr','Mai','Jun',
+               'Jul','Ago','Set','Out','Nov','Dez'],
+               dayNames: ['Domingo','Segunda-feira','Ter&ccedil;a-feira','Quarta-feira','Quinta-feira','Sexta-feira','S&aacute;bado'],
+               dayNamesShort: ['Dom','Seg','Ter','Qua','Qui','Sex','S&aacute;b'],
+               dayNamesMin: ['Dom','Seg','Ter','Qua','Qui','Sex','S&aacute;b'],
+               weekHeader: 'Sem',
+               dateFormat: 'dd/mm/yy',
+               firstDay: 0,
+               isRTL: false,
+               showMonthAfterYear: false,
+               yearSuffix: ''};
+       $.datepicker.setDefaults($.datepicker.regional['pt']);
+});
\ No newline at end of file
diff --git a/resources/lib/jquery.ui/i18n/jquery.ui.datepicker-rm.js b/resources/lib/jquery.ui/i18n/jquery.ui.datepicker-rm.js
new file mode 100644 (file)
index 0000000..cf03cd4
--- /dev/null
@@ -0,0 +1,21 @@
+/* Romansh initialisation for the jQuery UI date picker plugin. */
+/* Written by Yvonne Gienal (yvonne.gienal@educa.ch). */
+jQuery(function($){
+       $.datepicker.regional['rm'] = {
+               closeText: 'Serrar',
+               prevText: '&#x3c;Suandant',
+               nextText: 'Precedent&#x3e;',
+               currentText: 'Actual',
+               monthNames: ['Schaner','Favrer','Mars','Avrigl','Matg','Zercladur', 'Fanadur','Avust','Settember','October','November','December'],
+               monthNamesShort: ['Scha','Fev','Mar','Avr','Matg','Zer', 'Fan','Avu','Sett','Oct','Nov','Dec'],
+               dayNames: ['Dumengia','Glindesdi','Mardi','Mesemna','Gievgia','Venderdi','Sonda'],
+               dayNamesShort: ['Dum','Gli','Mar','Mes','Gie','Ven','Som'],
+               dayNamesMin: ['Du','Gl','Ma','Me','Gi','Ve','So'],
+               weekHeader: 'emna',
+               dateFormat: 'dd/mm/yy',
+               firstDay: 1,
+               isRTL: false,
+               showMonthAfterYear: false,
+               yearSuffix: ''};
+       $.datepicker.setDefaults($.datepicker.regional['rm']);
+});
diff --git a/resources/lib/jquery.ui/i18n/jquery.ui.datepicker-ro.js b/resources/lib/jquery.ui/i18n/jquery.ui.datepicker-ro.js
new file mode 100644 (file)
index 0000000..6b140af
--- /dev/null
@@ -0,0 +1,26 @@
+/* Romanian initialisation for the jQuery UI date picker plugin.
+ *
+ * Written by Edmond L. (ll_edmond@walla.com)
+ * and Ionut G. Stan (ionut.g.stan@gmail.com)
+ */
+jQuery(function($){
+       $.datepicker.regional['ro'] = {
+               closeText: 'Închide',
+               prevText: '&laquo; Luna precedentă',
+               nextText: 'Luna următoare &raquo;',
+               currentText: 'Azi',
+               monthNames: ['Ianuarie','Februarie','Martie','Aprilie','Mai','Iunie',
+               'Iulie','August','Septembrie','Octombrie','Noiembrie','Decembrie'],
+               monthNamesShort: ['Ian', 'Feb', 'Mar', 'Apr', 'Mai', 'Iun',
+               'Iul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],
+               dayNames: ['Duminică', 'Luni', 'Marţi', 'Miercuri', 'Joi', 'Vineri', 'Sâmbătă'],
+               dayNamesShort: ['Dum', 'Lun', 'Mar', 'Mie', 'Joi', 'Vin', 'Sâm'],
+               dayNamesMin: ['Du','Lu','Ma','Mi','Jo','Vi','Sâ'],
+               weekHeader: 'Săpt',
+               dateFormat: 'dd.mm.yy',
+               firstDay: 1,
+               isRTL: false,
+               showMonthAfterYear: false,
+               yearSuffix: ''};
+       $.datepicker.setDefaults($.datepicker.regional['ro']);
+});
diff --git a/resources/lib/jquery.ui/i18n/jquery.ui.datepicker-ru.js b/resources/lib/jquery.ui/i18n/jquery.ui.datepicker-ru.js
new file mode 100644 (file)
index 0000000..50a4613
--- /dev/null
@@ -0,0 +1,23 @@
+/* Russian (UTF-8) initialisation for the jQuery UI date picker plugin. */
+/* Written by Andrew Stromnov (stromnov@gmail.com). */
+jQuery(function($){
+       $.datepicker.regional['ru'] = {
+               closeText: 'Закрыть',
+               prevText: '&#x3c;Пред',
+               nextText: 'След&#x3e;',
+               currentText: 'Сегодня',
+               monthNames: ['Январь','Февраль','Март','Апрель','Май','Июнь',
+               'Июль','Август','Сентябрь','Октябрь','Ноябрь','Декабрь'],
+               monthNamesShort: ['Янв','Фев','Мар','Апр','Май','Июн',
+               'Июл','Авг','Сен','Окт','Ноя','Дек'],
+               dayNames: ['воскресенье','понедельник','вторник','среда','четверг','пятница','суббота'],
+               dayNamesShort: ['вск','пнд','втр','срд','чтв','птн','сбт'],
+               dayNamesMin: ['Вс','Пн','Вт','Ср','Чт','Пт','Сб'],
+               weekHeader: 'Нед',
+               dateFormat: 'dd.mm.yy',
+               firstDay: 1,
+               isRTL: false,
+               showMonthAfterYear: false,
+               yearSuffix: ''};
+       $.datepicker.setDefaults($.datepicker.regional['ru']);
+});
\ No newline at end of file
diff --git a/resources/lib/jquery.ui/i18n/jquery.ui.datepicker-sk.js b/resources/lib/jquery.ui/i18n/jquery.ui.datepicker-sk.js
new file mode 100644 (file)
index 0000000..078d1b0
--- /dev/null
@@ -0,0 +1,23 @@
+/* Slovak initialisation for the jQuery UI date picker plugin. */
+/* Written by Vojtech Rinik (vojto@hmm.sk). */
+jQuery(function($){
+       $.datepicker.regional['sk'] = {
+               closeText: 'Zavrieť',
+               prevText: '&#x3c;Predchádzajúci',
+               nextText: 'Nasledujúci&#x3e;',
+               currentText: 'Dnes',
+               monthNames: ['Január','Február','Marec','Apríl','Máj','Jún',
+               'Júl','August','September','Október','November','December'],
+               monthNamesShort: ['Jan','Feb','Mar','Apr','Máj','Jún',
+               'Júl','Aug','Sep','Okt','Nov','Dec'],
+               dayNames: ['Nedeľa','Pondelok','Utorok','Streda','Štvrtok','Piatok','Sobota'],
+               dayNamesShort: ['Ned','Pon','Uto','Str','Štv','Pia','Sob'],
+               dayNamesMin: ['Ne','Po','Ut','St','Št','Pia','So'],
+               weekHeader: 'Ty',
+               dateFormat: 'dd.mm.yy',
+               firstDay: 1,
+               isRTL: false,
+               showMonthAfterYear: false,
+               yearSuffix: ''};
+       $.datepicker.setDefaults($.datepicker.regional['sk']);
+});
diff --git a/resources/lib/jquery.ui/i18n/jquery.ui.datepicker-sl.js b/resources/lib/jquery.ui/i18n/jquery.ui.datepicker-sl.js
new file mode 100644 (file)
index 0000000..5165501
--- /dev/null
@@ -0,0 +1,24 @@
+/* Slovenian initialisation for the jQuery UI date picker plugin. */
+/* Written by Jaka Jancar (jaka@kubje.org). */
+/* c = &#x10D;, s = &#x161; z = &#x17E; C = &#x10C; S = &#x160; Z = &#x17D; */
+jQuery(function($){
+       $.datepicker.regional['sl'] = {
+               closeText: 'Zapri',
+               prevText: '&lt;Prej&#x161;nji',
+               nextText: 'Naslednji&gt;',
+               currentText: 'Trenutni',
+               monthNames: ['Januar','Februar','Marec','April','Maj','Junij',
+               'Julij','Avgust','September','Oktober','November','December'],
+               monthNamesShort: ['Jan','Feb','Mar','Apr','Maj','Jun',
+               'Jul','Avg','Sep','Okt','Nov','Dec'],
+               dayNames: ['Nedelja','Ponedeljek','Torek','Sreda','&#x10C;etrtek','Petek','Sobota'],
+               dayNamesShort: ['Ned','Pon','Tor','Sre','&#x10C;et','Pet','Sob'],
+               dayNamesMin: ['Ne','Po','To','Sr','&#x10C;e','Pe','So'],
+               weekHeader: 'Teden',
+               dateFormat: 'dd.mm.yy',
+               firstDay: 1,
+               isRTL: false,
+               showMonthAfterYear: false,
+               yearSuffix: ''};
+       $.datepicker.setDefaults($.datepicker.regional['sl']);
+});
diff --git a/resources/lib/jquery.ui/i18n/jquery.ui.datepicker-sq.js b/resources/lib/jquery.ui/i18n/jquery.ui.datepicker-sq.js
new file mode 100644 (file)
index 0000000..21974c5
--- /dev/null
@@ -0,0 +1,23 @@
+/* Albanian initialisation for the jQuery UI date picker plugin. */
+/* Written by Flakron Bytyqi (flakron@gmail.com). */
+jQuery(function($){
+       $.datepicker.regional['sq'] = {
+               closeText: 'mbylle',
+               prevText: '&#x3c;mbrapa',
+               nextText: 'Përpara&#x3e;',
+               currentText: 'sot',
+               monthNames: ['Janar','Shkurt','Mars','Prill','Maj','Qershor',
+               'Korrik','Gusht','Shtator','Tetor','Nëntor','Dhjetor'],
+               monthNamesShort: ['Jan','Shk','Mar','Pri','Maj','Qer',
+               'Kor','Gus','Sht','Tet','Nën','Dhj'],
+               dayNames: ['E Diel','E Hënë','E Martë','E Mërkurë','E Enjte','E Premte','E Shtune'],
+               dayNamesShort: ['Di','Hë','Ma','Më','En','Pr','Sh'],
+               dayNamesMin: ['Di','Hë','Ma','Më','En','Pr','Sh'],
+               weekHeader: 'Ja',
+               dateFormat: 'dd.mm.yy',
+               firstDay: 1,
+               isRTL: false,
+               showMonthAfterYear: false,
+               yearSuffix: ''};
+       $.datepicker.setDefaults($.datepicker.regional['sq']);
+});
diff --git a/resources/lib/jquery.ui/i18n/jquery.ui.datepicker-sr-SR.js b/resources/lib/jquery.ui/i18n/jquery.ui.datepicker-sr-SR.js
new file mode 100644 (file)
index 0000000..e7a8683
--- /dev/null
@@ -0,0 +1,23 @@
+/* Serbian i18n for the jQuery UI date picker plugin. */
+/* Written by Dejan Dimić. */
+jQuery(function($){
+       $.datepicker.regional['sr-SR'] = {
+               closeText: 'Zatvori',
+               prevText: '&#x3c;',
+               nextText: '&#x3e;',
+               currentText: 'Danas',
+               monthNames: ['Januar','Februar','Mart','April','Maj','Jun',
+               'Jul','Avgust','Septembar','Oktobar','Novembar','Decembar'],
+               monthNamesShort: ['Jan','Feb','Mar','Apr','Maj','Jun',
+               'Jul','Avg','Sep','Okt','Nov','Dec'],
+               dayNames: ['Nedelja','Ponedeljak','Utorak','Sreda','Četvrtak','Petak','Subota'],
+               dayNamesShort: ['Ned','Pon','Uto','Sre','Čet','Pet','Sub'],
+               dayNamesMin: ['Ne','Po','Ut','Sr','Če','Pe','Su'],
+               weekHeader: 'Sed',
+               dateFormat: 'dd/mm/yy',
+               firstDay: 1,
+               isRTL: false,
+               showMonthAfterYear: false,
+               yearSuffix: ''};
+       $.datepicker.setDefaults($.datepicker.regional['sr-SR']);
+});
diff --git a/resources/lib/jquery.ui/i18n/jquery.ui.datepicker-sr.js b/resources/lib/jquery.ui/i18n/jquery.ui.datepicker-sr.js
new file mode 100644 (file)
index 0000000..0bd240e
--- /dev/null
@@ -0,0 +1,23 @@
+/* Serbian i18n for the jQuery UI date picker plugin. */
+/* Written by Dejan Dimić. */
+jQuery(function($){
+       $.datepicker.regional['sr'] = {
+               closeText: 'Затвори',
+               prevText: '&#x3c;',
+               nextText: '&#x3e;',
+               currentText: 'Данас',
+               monthNames: ['Јануар','Фебруар','Март','Април','Мај','Јун',
+               'Јул','Август','Септембар','Октобар','Новембар','Децембар'],
+               monthNamesShort: ['Јан','Феб','Мар','Апр','Мај','Јун',
+               'Јул','Авг','Сеп','Окт','Нов','Дец'],
+               dayNames: ['Недеља','Понедељак','Уторак','Среда','Четвртак','Петак','Субота'],
+               dayNamesShort: ['Нед','Пон','Уто','Сре','Чет','Пет','Суб'],
+               dayNamesMin: ['Не','По','Ут','Ср','Че','Пе','Су'],
+               weekHeader: 'Сед',
+               dateFormat: 'dd/mm/yy',
+               firstDay: 1,
+               isRTL: false,
+               showMonthAfterYear: false,
+               yearSuffix: ''};
+       $.datepicker.setDefaults($.datepicker.regional['sr']);
+});
diff --git a/resources/lib/jquery.ui/i18n/jquery.ui.datepicker-sv.js b/resources/lib/jquery.ui/i18n/jquery.ui.datepicker-sv.js
new file mode 100644 (file)
index 0000000..e5f549f
--- /dev/null
@@ -0,0 +1,23 @@
+/* Swedish initialisation for the jQuery UI date picker plugin. */
+/* Written by Anders Ekdahl ( anders@nomadiz.se). */
+jQuery(function($){
+    $.datepicker.regional['sv'] = {
+               closeText: 'Stäng',
+        prevText: '&laquo;Förra',
+               nextText: 'Nästa&raquo;',
+               currentText: 'Idag',
+        monthNames: ['Januari','Februari','Mars','April','Maj','Juni',
+        'Juli','Augusti','September','Oktober','November','December'],
+        monthNamesShort: ['Jan','Feb','Mar','Apr','Maj','Jun',
+        'Jul','Aug','Sep','Okt','Nov','Dec'],
+               dayNamesShort: ['Sön','Mån','Tis','Ons','Tor','Fre','Lör'],
+               dayNames: ['Söndag','Måndag','Tisdag','Onsdag','Torsdag','Fredag','Lördag'],
+               dayNamesMin: ['Sö','Må','Ti','On','To','Fr','Lö'],
+               weekHeader: 'Ve',
+        dateFormat: 'yy-mm-dd',
+               firstDay: 1,
+               isRTL: false,
+               showMonthAfterYear: false,
+               yearSuffix: ''};
+    $.datepicker.setDefaults($.datepicker.regional['sv']);
+});
diff --git a/resources/lib/jquery.ui/i18n/jquery.ui.datepicker-ta.js b/resources/lib/jquery.ui/i18n/jquery.ui.datepicker-ta.js
new file mode 100644 (file)
index 0000000..40431ed
--- /dev/null
@@ -0,0 +1,23 @@
+/* Tamil (UTF-8) initialisation for the jQuery UI date picker plugin. */
+/* Written by S A Sureshkumar (saskumar@live.com). */
+jQuery(function($){
+       $.datepicker.regional['ta'] = {
+               closeText: 'மூடு',
+               prevText: 'முன்னையது',
+               nextText: 'அடுத்தது',
+               currentText: 'இன்று',
+               monthNames: ['தை','மாசி','பங்குனி','சித்திரை','வைகாசி','ஆனி',
+               'ஆடி','ஆவணி','புரட்டாசி','ஐப்பசி','கார்த்திகை','மார்கழி'],
+               monthNamesShort: ['தை','மாசி','பங்','சித்','வைகா','ஆனி',
+               'ஆடி','ஆவ','புர','ஐப்','கார்','மார்'],
+               dayNames: ['ஞாயிற்றுக்கிழமை','திங்கட்கிழமை','செவ்வாய்க்கிழமை','புதன்கிழமை','வியாழக்கிழமை','வெள்ளிக்கிழமை','சனிக்கிழமை'],
+               dayNamesShort: ['ஞாயிறு','திங்கள்','செவ்வாய்','புதன்','வியாழன்','வெள்ளி','சனி'],
+               dayNamesMin: ['ஞா','தி','செ','பு','வி','வெ','ச'],
+               weekHeader: 'Не',
+               dateFormat: 'dd/mm/yy',
+               firstDay: 1,
+               isRTL: false,
+               showMonthAfterYear: false,
+               yearSuffix: ''};
+       $.datepicker.setDefaults($.datepicker.regional['ta']);
+});
diff --git a/resources/lib/jquery.ui/i18n/jquery.ui.datepicker-th.js b/resources/lib/jquery.ui/i18n/jquery.ui.datepicker-th.js
new file mode 100644 (file)
index 0000000..2e5300c
--- /dev/null
@@ -0,0 +1,23 @@
+/* Thai initialisation for the jQuery UI date picker plugin. */
+/* Written by pipo (pipo@sixhead.com). */
+jQuery(function($){
+       $.datepicker.regional['th'] = {
+               closeText: 'ปิด',
+               prevText: '&laquo;&nbsp;ย้อน',
+               nextText: 'ถัดไป&nbsp;&raquo;',
+               currentText: 'วันนี้',
+               monthNames: ['มกราคม','กุมภาพันธ์','มีนาคม','เมษายน','พฤษภาคม','มิถุนายน',
+               'กรกฎาคม','สิงหาคม','กันยายน','ตุลาคม','พฤศจิกายน','ธันวาคม'],
+               monthNamesShort: ['ม.ค.','ก.พ.','มี.ค.','เม.ย.','พ.ค.','มิ.ย.',
+               'ก.ค.','ส.ค.','ก.ย.','ต.ค.','พ.ย.','ธ.ค.'],
+               dayNames: ['อาทิตย์','จันทร์','อังคาร','พุธ','พฤหัสบดี','ศุกร์','เสาร์'],
+               dayNamesShort: ['อา.','จ.','อ.','พ.','พฤ.','ศ.','ส.'],
+               dayNamesMin: ['อา.','จ.','อ.','พ.','พฤ.','ศ.','ส.'],
+               weekHeader: 'Wk',
+               dateFormat: 'dd/mm/yy',
+               firstDay: 0,
+               isRTL: false,
+               showMonthAfterYear: false,
+               yearSuffix: ''};
+       $.datepicker.setDefaults($.datepicker.regional['th']);
+});
\ No newline at end of file
diff --git a/resources/lib/jquery.ui/i18n/jquery.ui.datepicker-tr.js b/resources/lib/jquery.ui/i18n/jquery.ui.datepicker-tr.js
new file mode 100644 (file)
index 0000000..dedfc7f
--- /dev/null
@@ -0,0 +1,23 @@
+/* Turkish initialisation for the jQuery UI date picker plugin. */
+/* Written by Izzet Emre Erkan (kara@karalamalar.net). */
+jQuery(function($){
+       $.datepicker.regional['tr'] = {
+               closeText: 'kapat',
+               prevText: '&#x3c;geri',
+               nextText: 'ileri&#x3e',
+               currentText: 'bugün',
+               monthNames: ['Ocak','Şubat','Mart','Nisan','Mayıs','Haziran',
+               'Temmuz','Ağustos','Eylül','Ekim','Kasım','Aralık'],
+               monthNamesShort: ['Oca','Şub','Mar','Nis','May','Haz',
+               'Tem','Ağu','Eyl','Eki','Kas','Ara'],
+               dayNames: ['Pazar','Pazartesi','Salı','Çarşamba','Perşembe','Cuma','Cumartesi'],
+               dayNamesShort: ['Pz','Pt','Sa','Ça','Pe','Cu','Ct'],
+               dayNamesMin: ['Pz','Pt','Sa','Ça','Pe','Cu','Ct'],
+               weekHeader: 'Hf',
+               dateFormat: 'dd.mm.yy',
+               firstDay: 1,
+               isRTL: false,
+               showMonthAfterYear: false,
+               yearSuffix: ''};
+       $.datepicker.setDefaults($.datepicker.regional['tr']);
+});
\ No newline at end of file
diff --git a/resources/lib/jquery.ui/i18n/jquery.ui.datepicker-uk.js b/resources/lib/jquery.ui/i18n/jquery.ui.datepicker-uk.js
new file mode 100644 (file)
index 0000000..2718f5d
--- /dev/null
@@ -0,0 +1,24 @@
+/* Ukrainian (UTF-8) initialisation for the jQuery UI date picker plugin. */
+/* Written by Maxim Drogobitskiy (maxdao@gmail.com). */
+/* Corrected by Igor Milla (igor.fsp.milla@gmail.com). */
+jQuery(function($){
+       $.datepicker.regional['uk'] = {
+               closeText: 'Закрити',
+               prevText: '&#x3c;',
+               nextText: '&#x3e;',
+               currentText: 'Сьогодні',
+               monthNames: ['Січень','Лютий','Березень','Квітень','Травень','Червень',
+               'Липень','Серпень','Вересень','Жовтень','Листопад','Грудень'],
+               monthNamesShort: ['Січ','Лют','Бер','Кві','Тра','Чер',
+               'Лип','Сер','Вер','Жов','Лис','Гру'],
+               dayNames: ['неділя','понеділок','вівторок','середа','четвер','п’ятниця','субота'],
+               dayNamesShort: ['нед','пнд','вів','срд','чтв','птн','сбт'],
+               dayNamesMin: ['Нд','Пн','Вт','Ср','Чт','Пт','Сб'],
+               weekHeader: 'Тиж',
+               dateFormat: 'dd/mm/yy',
+               firstDay: 1,
+               isRTL: false,
+               showMonthAfterYear: false,
+               yearSuffix: ''};
+       $.datepicker.setDefaults($.datepicker.regional['uk']);
+});
\ No newline at end of file
diff --git a/resources/lib/jquery.ui/i18n/jquery.ui.datepicker-vi.js b/resources/lib/jquery.ui/i18n/jquery.ui.datepicker-vi.js
new file mode 100644 (file)
index 0000000..1d8f7bb
--- /dev/null
@@ -0,0 +1,23 @@
+/* Vietnamese initialisation for the jQuery UI date picker plugin. */
+/* Translated by Le Thanh Huy (lthanhhuy@cit.ctu.edu.vn). */
+jQuery(function($){
+       $.datepicker.regional['vi'] = {
+               closeText: 'Đóng',
+               prevText: '&#x3c;Trước',
+               nextText: 'Tiếp&#x3e;',
+               currentText: 'Hôm nay',
+               monthNames: ['Tháng Một', 'Tháng Hai', 'Tháng Ba', 'Tháng Tư', 'Tháng Năm', 'Tháng Sáu',
+               'Tháng Bảy', 'Tháng Tám', 'Tháng Chín', 'Tháng Mười', 'Tháng Mười Một', 'Tháng Mười Hai'],
+               monthNamesShort: ['Tháng 1', 'Tháng 2', 'Tháng 3', 'Tháng 4', 'Tháng 5', 'Tháng 6',
+               'Tháng 7', 'Tháng 8', 'Tháng 9', 'Tháng 10', 'Tháng 11', 'Tháng 12'],
+               dayNames: ['Chủ Nhật', 'Thứ Hai', 'Thứ Ba', 'Thứ Tư', 'Thứ Năm', 'Thứ Sáu', 'Thứ Bảy'],
+               dayNamesShort: ['CN', 'T2', 'T3', 'T4', 'T5', 'T6', 'T7'],
+               dayNamesMin: ['CN', 'T2', 'T3', 'T4', 'T5', 'T6', 'T7'],
+               weekHeader: 'Tu',
+               dateFormat: 'dd/mm/yy',
+               firstDay: 0,
+               isRTL: false,
+               showMonthAfterYear: false,
+               yearSuffix: ''};
+       $.datepicker.setDefaults($.datepicker.regional['vi']);
+});
diff --git a/resources/lib/jquery.ui/i18n/jquery.ui.datepicker-zh-CN.js b/resources/lib/jquery.ui/i18n/jquery.ui.datepicker-zh-CN.js
new file mode 100644 (file)
index 0000000..83f2825
--- /dev/null
@@ -0,0 +1,23 @@
+/* Chinese initialisation for the jQuery UI date picker plugin. */
+/* Written by Cloudream (cloudream@gmail.com). */
+jQuery(function($){
+       $.datepicker.regional['zh-CN'] = {
+               closeText: '关闭',
+               prevText: '&#x3c;上月',
+               nextText: '下月&#x3e;',
+               currentText: '今天',
+               monthNames: ['一月','二月','三月','四月','五月','六月',
+               '七月','八月','九月','十月','十一月','十二月'],
+               monthNamesShort: ['一月','二月','三月','四月','五月','六月',
+               '七月','八月','九月','十月','十一月','十二月'],
+               dayNames: ['星期日','星期一','星期二','星期三','星期四','星期五','星期六'],
+               dayNamesShort: ['周日','周一','周二','周三','周四','周五','周六'],
+               dayNamesMin: ['日','一','二','三','四','五','六'],
+               weekHeader: '周',
+               dateFormat: 'yy-mm-dd',
+               firstDay: 1,
+               isRTL: false,
+               showMonthAfterYear: true,
+               yearSuffix: '年'};
+       $.datepicker.setDefaults($.datepicker.regional['zh-CN']);
+});
diff --git a/resources/lib/jquery.ui/i18n/jquery.ui.datepicker-zh-HK.js b/resources/lib/jquery.ui/i18n/jquery.ui.datepicker-zh-HK.js
new file mode 100644 (file)
index 0000000..11189d3
--- /dev/null
@@ -0,0 +1,23 @@
+/* Chinese initialisation for the jQuery UI date picker plugin. */
+/* Written by SCCY (samuelcychan@gmail.com). */
+jQuery(function($){
+       $.datepicker.regional['zh-HK'] = {
+               closeText: '關閉',
+               prevText: '&#x3c;上月',
+               nextText: '下月&#x3e;',
+               currentText: '今天',
+               monthNames: ['一月','二月','三月','四月','五月','六月',
+               '七月','八月','九月','十月','十一月','十二月'],
+               monthNamesShort: ['一月','二月','三月','四月','五月','六月',
+               '七月','八月','九月','十月','十一月','十二月'],
+               dayNames: ['星期日','星期一','星期二','星期三','星期四','星期五','星期六'],
+               dayNamesShort: ['周日','周一','周二','周三','周四','周五','周六'],
+               dayNamesMin: ['日','一','二','三','四','五','六'],
+               weekHeader: '周',
+               dateFormat: 'dd-mm-yy',
+               firstDay: 0,
+               isRTL: false,
+               showMonthAfterYear: true,
+               yearSuffix: '年'};
+       $.datepicker.setDefaults($.datepicker.regional['zh-HK']);
+});
diff --git a/resources/lib/jquery.ui/i18n/jquery.ui.datepicker-zh-TW.js b/resources/lib/jquery.ui/i18n/jquery.ui.datepicker-zh-TW.js
new file mode 100644 (file)
index 0000000..089498b
--- /dev/null
@@ -0,0 +1,23 @@
+/* Chinese initialisation for the jQuery UI date picker plugin. */
+/* Written by Ressol (ressol@gmail.com). */
+jQuery(function($){
+       $.datepicker.regional['zh-TW'] = {
+               closeText: '關閉',
+               prevText: '&#x3c;上月',
+               nextText: '下月&#x3e;',
+               currentText: '今天',
+               monthNames: ['一月','二月','三月','四月','五月','六月',
+               '七月','八月','九月','十月','十一月','十二月'],
+               monthNamesShort: ['一月','二月','三月','四月','五月','六月',
+               '七月','八月','九月','十月','十一月','十二月'],
+               dayNames: ['星期日','星期一','星期二','星期三','星期四','星期五','星期六'],
+               dayNamesShort: ['周日','周一','周二','周三','周四','周五','周六'],
+               dayNamesMin: ['日','一','二','三','四','五','六'],
+               weekHeader: '周',
+               dateFormat: 'yy/mm/dd',
+               firstDay: 1,
+               isRTL: false,
+               showMonthAfterYear: true,
+               yearSuffix: '年'};
+       $.datepicker.setDefaults($.datepicker.regional['zh-TW']);
+});
diff --git a/resources/lib/jquery.ui/jquery.ui.accordion.js b/resources/lib/jquery.ui/jquery.ui.accordion.js
new file mode 100644 (file)
index 0000000..dc1ba60
--- /dev/null
@@ -0,0 +1,611 @@
+/*!
+ * jQuery UI Accordion 1.8.24
+ *
+ * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Accordion
+ *
+ * Depends:
+ *     jquery.ui.core.js
+ *     jquery.ui.widget.js
+ */
+(function( $, undefined ) {
+
+$.widget( "ui.accordion", {
+       options: {
+               active: 0,
+               animated: "slide",
+               autoHeight: true,
+               clearStyle: false,
+               collapsible: false,
+               event: "click",
+               fillSpace: false,
+               header: "> li > :first-child,> :not(li):even",
+               icons: {
+                       header: "ui-icon-triangle-1-e",
+                       headerSelected: "ui-icon-triangle-1-s"
+               },
+               navigation: false,
+               navigationFilter: function() {
+                       return this.href.toLowerCase() === location.href.toLowerCase();
+               }
+       },
+
+       _create: function() {
+               var self = this,
+                       options = self.options;
+
+               self.running = 0;
+
+               self.element
+                       .addClass( "ui-accordion ui-widget ui-helper-reset" )
+                       // in lack of child-selectors in CSS
+                       // we need to mark top-LIs in a UL-accordion for some IE-fix
+                       .children( "li" )
+                               .addClass( "ui-accordion-li-fix" );
+
+               self.headers = self.element.find( options.header )
+                       .addClass( "ui-accordion-header ui-helper-reset ui-state-default ui-corner-all" )
+                       .bind( "mouseenter.accordion", function() {
+                               if ( options.disabled ) {
+                                       return;
+                               }
+                               $( this ).addClass( "ui-state-hover" );
+                       })
+                       .bind( "mouseleave.accordion", function() {
+                               if ( options.disabled ) {
+                                       return;
+                               }
+                               $( this ).removeClass( "ui-state-hover" );
+                       })
+                       .bind( "focus.accordion", function() {
+                               if ( options.disabled ) {
+                                       return;
+                               }
+                               $( this ).addClass( "ui-state-focus" );
+                       })
+                       .bind( "blur.accordion", function() {
+                               if ( options.disabled ) {
+                                       return;
+                               }
+                               $( this ).removeClass( "ui-state-focus" );
+                       });
+
+               self.headers.next()
+                       .addClass( "ui-accordion-content ui-helper-reset ui-widget-content ui-corner-bottom" );
+
+               if ( options.navigation ) {
+                       var current = self.element.find( "a" ).filter( options.navigationFilter ).eq( 0 );
+                       if ( current.length ) {
+                               var header = current.closest( ".ui-accordion-header" );
+                               if ( header.length ) {
+                                       // anchor within header
+                                       self.active = header;
+                               } else {
+                                       // anchor within content
+                                       self.active = current.closest( ".ui-accordion-content" ).prev();
+                               }
+                       }
+               }
+
+               self.active = self._findActive( self.active || options.active )
+                       .addClass( "ui-state-default ui-state-active" )
+                       .toggleClass( "ui-corner-all" )
+                       .toggleClass( "ui-corner-top" );
+               self.active.next().addClass( "ui-accordion-content-active" );
+
+               self._createIcons();
+               self.resize();
+               
+               // ARIA
+               self.element.attr( "role", "tablist" );
+
+               self.headers
+                       .attr( "role", "tab" )
+                       .bind( "keydown.accordion", function( event ) {
+                               return self._keydown( event );
+                       })
+                       .next()
+                               .attr( "role", "tabpanel" );
+
+               self.headers
+                       .not( self.active || "" )
+                       .attr({
+                               "aria-expanded": "false",
+                               "aria-selected": "false",
+                               tabIndex: -1
+                       })
+                       .next()
+                               .hide();
+
+               // make sure at least one header is in the tab order
+               if ( !self.active.length ) {
+                       self.headers.eq( 0 ).attr( "tabIndex", 0 );
+               } else {
+                       self.active
+                               .attr({
+                                       "aria-expanded": "true",
+                                       "aria-selected": "true",
+                                       tabIndex: 0
+                               });
+               }
+
+               // only need links in tab order for Safari
+               if ( !$.browser.safari ) {
+                       self.headers.find( "a" ).attr( "tabIndex", -1 );
+               }
+
+               if ( options.event ) {
+                       self.headers.bind( options.event.split(" ").join(".accordion ") + ".accordion", function(event) {
+                               self._clickHandler.call( self, event, this );
+                               event.preventDefault();
+                       });
+               }
+       },
+
+       _createIcons: function() {
+               var options = this.options;
+               if ( options.icons ) {
+                       $( "<span></span>" )
+                               .addClass( "ui-icon " + options.icons.header )
+                               .prependTo( this.headers );
+                       this.active.children( ".ui-icon" )
+                               .toggleClass(options.icons.header)
+                               .toggleClass(options.icons.headerSelected);
+                       this.element.addClass( "ui-accordion-icons" );
+               }
+       },
+
+       _destroyIcons: function() {
+               this.headers.children( ".ui-icon" ).remove();
+               this.element.removeClass( "ui-accordion-icons" );
+       },
+
+       destroy: function() {
+               var options = this.options;
+
+               this.element
+                       .removeClass( "ui-accordion ui-widget ui-helper-reset" )
+                       .removeAttr( "role" );
+
+               this.headers
+                       .unbind( ".accordion" )
+                       .removeClass( "ui-accordion-header ui-accordion-disabled ui-helper-reset ui-state-default ui-corner-all ui-state-active ui-state-disabled ui-corner-top" )
+                       .removeAttr( "role" )
+                       .removeAttr( "aria-expanded" )
+                       .removeAttr( "aria-selected" )
+                       .removeAttr( "tabIndex" );
+
+               this.headers.find( "a" ).removeAttr( "tabIndex" );
+               this._destroyIcons();
+               var contents = this.headers.next()
+                       .css( "display", "" )
+                       .removeAttr( "role" )
+                       .removeClass( "ui-helper-reset ui-widget-content ui-corner-bottom ui-accordion-content ui-accordion-content-active ui-accordion-disabled ui-state-disabled" );
+               if ( options.autoHeight || options.fillHeight ) {
+                       contents.css( "height", "" );
+               }
+
+               return $.Widget.prototype.destroy.call( this );
+       },
+
+       _setOption: function( key, value ) {
+               $.Widget.prototype._setOption.apply( this, arguments );
+                       
+               if ( key == "active" ) {
+                       this.activate( value );
+               }
+               if ( key == "icons" ) {
+                       this._destroyIcons();
+                       if ( value ) {
+                               this._createIcons();
+                       }
+               }
+               // #5332 - opacity doesn't cascade to positioned elements in IE
+               // so we need to add the disabled class to the headers and panels
+               if ( key == "disabled" ) {
+                       this.headers.add(this.headers.next())
+                               [ value ? "addClass" : "removeClass" ](
+                                       "ui-accordion-disabled ui-state-disabled" );
+               }
+       },
+
+       _keydown: function( event ) {
+               if ( this.options.disabled || event.altKey || event.ctrlKey ) {
+                       return;
+               }
+
+               var keyCode = $.ui.keyCode,
+                       length = this.headers.length,
+                       currentIndex = this.headers.index( event.target ),
+                       toFocus = false;
+
+               switch ( event.keyCode ) {
+                       case keyCode.RIGHT:
+                       case keyCode.DOWN:
+                               toFocus = this.headers[ ( currentIndex + 1 ) % length ];
+                               break;
+                       case keyCode.LEFT:
+                       case keyCode.UP:
+                               toFocus = this.headers[ ( currentIndex - 1 + length ) % length ];
+                               break;
+                       case keyCode.SPACE:
+                       case keyCode.ENTER:
+                               this._clickHandler( { target: event.target }, event.target );
+                               event.preventDefault();
+               }
+
+               if ( toFocus ) {
+                       $( event.target ).attr( "tabIndex", -1 );
+                       $( toFocus ).attr( "tabIndex", 0 );
+                       toFocus.focus();
+                       return false;
+               }
+
+               return true;
+       },
+
+       resize: function() {
+               var options = this.options,
+                       maxHeight;
+
+               if ( options.fillSpace ) {
+                       if ( $.browser.msie ) {
+                               var defOverflow = this.element.parent().css( "overflow" );
+                               this.element.parent().css( "overflow", "hidden");
+                       }
+                       maxHeight = this.element.parent().height();
+                       if ($.browser.msie) {
+                               this.element.parent().css( "overflow", defOverflow );
+                       }
+
+                       this.headers.each(function() {
+                               maxHeight -= $( this ).outerHeight( true );
+                       });
+
+                       this.headers.next()
+                               .each(function() {
+                                       $( this ).height( Math.max( 0, maxHeight -
+                                               $( this ).innerHeight() + $( this ).height() ) );
+                               })
+                               .css( "overflow", "auto" );
+               } else if ( options.autoHeight ) {
+                       maxHeight = 0;
+                       this.headers.next()
+                               .each(function() {
+                                       maxHeight = Math.max( maxHeight, $( this ).height( "" ).height() );
+                               })
+                               .height( maxHeight );
+               }
+
+               return this;
+       },
+
+       activate: function( index ) {
+               // TODO this gets called on init, changing the option without an explicit call for that
+               this.options.active = index;
+               // call clickHandler with custom event
+               var active = this._findActive( index )[ 0 ];
+               this._clickHandler( { target: active }, active );
+
+               return this;
+       },
+
+       _findActive: function( selector ) {
+               return selector
+                       ? typeof selector === "number"
+                               ? this.headers.filter( ":eq(" + selector + ")" )
+                               : this.headers.not( this.headers.not( selector ) )
+                       : selector === false
+                               ? $( [] )
+                               : this.headers.filter( ":eq(0)" );
+       },
+
+       // TODO isn't event.target enough? why the separate target argument?
+       _clickHandler: function( event, target ) {
+               var options = this.options;
+               if ( options.disabled ) {
+                       return;
+               }
+
+               // called only when using activate(false) to close all parts programmatically
+               if ( !event.target ) {
+                       if ( !options.collapsible ) {
+                               return;
+                       }
+                       this.active
+                               .removeClass( "ui-state-active ui-corner-top" )
+                               .addClass( "ui-state-default ui-corner-all" )
+                               .children( ".ui-icon" )
+                                       .removeClass( options.icons.headerSelected )
+                                       .addClass( options.icons.header );
+                       this.active.next().addClass( "ui-accordion-content-active" );
+                       var toHide = this.active.next(),
+                               data = {
+                                       options: options,
+                                       newHeader: $( [] ),
+                                       oldHeader: options.active,
+                                       newContent: $( [] ),
+                                       oldContent: toHide
+                               },
+                               toShow = ( this.active = $( [] ) );
+                       this._toggle( toShow, toHide, data );
+                       return;
+               }
+
+               // get the click target
+               var clicked = $( event.currentTarget || target ),
+                       clickedIsActive = clicked[0] === this.active[0];
+
+               // TODO the option is changed, is that correct?
+               // TODO if it is correct, shouldn't that happen after determining that the click is valid?
+               options.active = options.collapsible && clickedIsActive ?
+                       false :
+                       this.headers.index( clicked );
+
+               // if animations are still active, or the active header is the target, ignore click
+               if ( this.running || ( !options.collapsible && clickedIsActive ) ) {
+                       return;
+               }
+
+               // find elements to show and hide
+               var active = this.active,
+                       toShow = clicked.next(),
+                       toHide = this.active.next(),
+                       data = {
+                               options: options,
+                               newHeader: clickedIsActive && options.collapsible ? $([]) : clicked,
+                               oldHeader: this.active,
+                               newContent: clickedIsActive && options.collapsible ? $([]) : toShow,
+                               oldContent: toHide
+                       },
+                       down = this.headers.index( this.active[0] ) > this.headers.index( clicked[0] );
+
+               // when the call to ._toggle() comes after the class changes
+               // it causes a very odd bug in IE 8 (see #6720)
+               this.active = clickedIsActive ? $([]) : clicked;
+               this._toggle( toShow, toHide, data, clickedIsActive, down );
+
+               // switch classes
+               active
+                       .removeClass( "ui-state-active ui-corner-top" )
+                       .addClass( "ui-state-default ui-corner-all" )
+                       .children( ".ui-icon" )
+                               .removeClass( options.icons.headerSelected )
+                               .addClass( options.icons.header );
+               if ( !clickedIsActive ) {
+                       clicked
+                               .removeClass( "ui-state-default ui-corner-all" )
+                               .addClass( "ui-state-active ui-corner-top" )
+                               .children( ".ui-icon" )
+                                       .removeClass( options.icons.header )
+                                       .addClass( options.icons.headerSelected );
+                       clicked
+                               .next()
+                               .addClass( "ui-accordion-content-active" );
+               }
+
+               return;
+       },
+
+       _toggle: function( toShow, toHide, data, clickedIsActive, down ) {
+               var self = this,
+                       options = self.options;
+
+               self.toShow = toShow;
+               self.toHide = toHide;
+               self.data = data;
+
+               var complete = function() {
+                       if ( !self ) {
+                               return;
+                       }
+                       return self._completed.apply( self, arguments );
+               };
+
+               // trigger changestart event
+               self._trigger( "changestart", null, self.data );
+
+               // count elements to animate
+               self.running = toHide.size() === 0 ? toShow.size() : toHide.size();
+
+               if ( options.animated ) {
+                       var animOptions = {};
+
+                       if ( options.collapsible && clickedIsActive ) {
+                               animOptions = {
+                                       toShow: $( [] ),
+                                       toHide: toHide,
+                                       complete: complete,
+                                       down: down,
+                                       autoHeight: options.autoHeight || options.fillSpace
+                               };
+                       } else {
+                               animOptions = {
+                                       toShow: toShow,
+                                       toHide: toHide,
+                                       complete: complete,
+                                       down: down,
+                                       autoHeight: options.autoHeight || options.fillSpace
+                               };
+                       }
+
+                       if ( !options.proxied ) {
+                               options.proxied = options.animated;
+                       }
+
+                       if ( !options.proxiedDuration ) {
+                               options.proxiedDuration = options.duration;
+                       }
+
+                       options.animated = $.isFunction( options.proxied ) ?
+                               options.proxied( animOptions ) :
+                               options.proxied;
+
+                       options.duration = $.isFunction( options.proxiedDuration ) ?
+                               options.proxiedDuration( animOptions ) :
+                               options.proxiedDuration;
+
+                       var animations = $.ui.accordion.animations,
+                               duration = options.duration,
+                               easing = options.animated;
+
+                       if ( easing && !animations[ easing ] && !$.easing[ easing ] ) {
+                               easing = "slide";
+                       }
+                       if ( !animations[ easing ] ) {
+                               animations[ easing ] = function( options ) {
+                                       this.slide( options, {
+                                               easing: easing,
+                                               duration: duration || 700
+                                       });
+                               };
+                       }
+
+                       animations[ easing ]( animOptions );
+               } else {
+                       if ( options.collapsible && clickedIsActive ) {
+                               toShow.toggle();
+                       } else {
+                               toHide.hide();
+                               toShow.show();
+                       }
+
+                       complete( true );
+               }
+
+               // TODO assert that the blur and focus triggers are really necessary, remove otherwise
+               toHide.prev()
+                       .attr({
+                               "aria-expanded": "false",
+                               "aria-selected": "false",
+                               tabIndex: -1
+                       })
+                       .blur();
+               toShow.prev()
+                       .attr({
+                               "aria-expanded": "true",
+                               "aria-selected": "true",
+                               tabIndex: 0
+                       })
+                       .focus();
+       },
+
+       _completed: function( cancel ) {
+               this.running = cancel ? 0 : --this.running;
+               if ( this.running ) {
+                       return;
+               }
+
+               if ( this.options.clearStyle ) {
+                       this.toShow.add( this.toHide ).css({
+                               height: "",
+                               overflow: ""
+                       });
+               }
+
+               // other classes are removed before the animation; this one needs to stay until completed
+               this.toHide.removeClass( "ui-accordion-content-active" );
+               // Work around for rendering bug in IE (#5421)
+               if ( this.toHide.length ) {
+                       this.toHide.parent()[0].className = this.toHide.parent()[0].className;
+               }
+
+               this._trigger( "change", null, this.data );
+       }
+});
+
+$.extend( $.ui.accordion, {
+       version: "1.8.24",
+       animations: {
+               slide: function( options, additions ) {
+                       options = $.extend({
+                               easing: "swing",
+                               duration: 300
+                       }, options, additions );
+                       if ( !options.toHide.size() ) {
+                               options.toShow.animate({
+                                       height: "show",
+                                       paddingTop: "show",
+                                       paddingBottom: "show"
+                               }, options );
+                               return;
+                       }
+                       if ( !options.toShow.size() ) {
+                               options.toHide.animate({
+                                       height: "hide",
+                                       paddingTop: "hide",
+                                       paddingBottom: "hide"
+                               }, options );
+                               return;
+                       }
+                       var overflow = options.toShow.css( "overflow" ),
+                               percentDone = 0,
+                               showProps = {},
+                               hideProps = {},
+                               fxAttrs = [ "height", "paddingTop", "paddingBottom" ],
+                               originalWidth;
+                       // fix width before calculating height of hidden element
+                       var s = options.toShow;
+                       originalWidth = s[0].style.width;
+                       s.width( s.parent().width()
+                               - parseFloat( s.css( "paddingLeft" ) )
+                               - parseFloat( s.css( "paddingRight" ) )
+                               - ( parseFloat( s.css( "borderLeftWidth" ) ) || 0 )
+                               - ( parseFloat( s.css( "borderRightWidth" ) ) || 0 ) );
+
+                       $.each( fxAttrs, function( i, prop ) {
+                               hideProps[ prop ] = "hide";
+
+                               var parts = ( "" + $.css( options.toShow[0], prop ) ).match( /^([\d+-.]+)(.*)$/ );
+                               showProps[ prop ] = {
+                                       value: parts[ 1 ],
+                                       unit: parts[ 2 ] || "px"
+                               };
+                       });
+                       options.toShow.css({ height: 0, overflow: "hidden" }).show();
+                       options.toHide
+                               .filter( ":hidden" )
+                                       .each( options.complete )
+                               .end()
+                               .filter( ":visible" )
+                               .animate( hideProps, {
+                               step: function( now, settings ) {
+                                       // only calculate the percent when animating height
+                                       // IE gets very inconsistent results when animating elements
+                                       // with small values, which is common for padding
+                                       if ( settings.prop == "height" ) {
+                                               percentDone = ( settings.end - settings.start === 0 ) ? 0 :
+                                                       ( settings.now - settings.start ) / ( settings.end - settings.start );
+                                       }
+
+                                       options.toShow[ 0 ].style[ settings.prop ] =
+                                               ( percentDone * showProps[ settings.prop ].value )
+                                               + showProps[ settings.prop ].unit;
+                               },
+                               duration: options.duration,
+                               easing: options.easing,
+                               complete: function() {
+                                       if ( !options.autoHeight ) {
+                                               options.toShow.css( "height", "" );
+                                       }
+                                       options.toShow.css({
+                                               width: originalWidth,
+                                               overflow: overflow
+                                       });
+                                       options.complete();
+                               }
+                       });
+               },
+               bounceslide: function( options ) {
+                       this.slide( options, {
+                               easing: options.down ? "easeOutBounce" : "swing",
+                               duration: options.down ? 1000 : 200
+                       });
+               }
+       }
+});
+
+})( jQuery );
diff --git a/resources/lib/jquery.ui/jquery.ui.autocomplete.js b/resources/lib/jquery.ui/jquery.ui.autocomplete.js
new file mode 100644 (file)
index 0000000..8d69be2
--- /dev/null
@@ -0,0 +1,631 @@
+/*!
+ * jQuery UI Autocomplete 1.8.24
+ *
+ * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Autocomplete
+ *
+ * Depends:
+ *     jquery.ui.core.js
+ *     jquery.ui.widget.js
+ *     jquery.ui.position.js
+ */
+(function( $, undefined ) {
+
+// used to prevent race conditions with remote data sources
+var requestIndex = 0;
+
+$.widget( "ui.autocomplete", {
+       options: {
+               appendTo: "body",
+               autoFocus: false,
+               delay: 300,
+               minLength: 1,
+               position: {
+                       my: "left top",
+                       at: "left bottom",
+                       collision: "none"
+               },
+               source: null
+       },
+
+       pending: 0,
+
+       _create: function() {
+               var self = this,
+                       doc = this.element[ 0 ].ownerDocument,
+                       suppressKeyPress;
+               this.isMultiLine = this.element.is( "textarea" );
+
+               this.element
+                       .addClass( "ui-autocomplete-input" )
+                       .attr( "autocomplete", "off" )
+                       // TODO verify these actually work as intended
+                       .attr({
+                               role: "textbox",
+                               "aria-autocomplete": "list",
+                               "aria-haspopup": "true"
+                       })
+                       .bind( "keydown.autocomplete", function( event ) {
+                               if ( self.options.disabled || self.element.propAttr( "readOnly" ) ) {
+                                       return;
+                               }
+
+                               suppressKeyPress = false;
+                               var keyCode = $.ui.keyCode;
+                               switch( event.keyCode ) {
+                               case keyCode.PAGE_UP:
+                                       self._move( "previousPage", event );
+                                       break;
+                               case keyCode.PAGE_DOWN:
+                                       self._move( "nextPage", event );
+                                       break;
+                               case keyCode.UP:
+                                       self._keyEvent( "previous", event );
+                                       break;
+                               case keyCode.DOWN:
+                                       self._keyEvent( "next", event );
+                                       break;
+                               case keyCode.ENTER:
+                               case keyCode.NUMPAD_ENTER:
+                                       // when menu is open and has focus
+                                       if ( self.menu.active ) {
+                                               // #6055 - Opera still allows the keypress to occur
+                                               // which causes forms to submit
+                                               suppressKeyPress = true;
+                                               event.preventDefault();
+                                       }
+                                       //passthrough - ENTER and TAB both select the current element
+                               case keyCode.TAB:
+                                       if ( !self.menu.active ) {
+                                               return;
+                                       }
+                                       self.menu.select( event );
+                                       break;
+                               case keyCode.ESCAPE:
+                                       self.element.val( self.term );
+                                       self.close( event );
+                                       break;
+                               default:
+                                       // keypress is triggered before the input value is changed
+                                       clearTimeout( self.searching );
+                                       self.searching = setTimeout(function() {
+                                               // only search if the value has changed
+                                               if ( self.term != self.element.val() ) {
+                                                       self.selectedItem = null;
+                                                       self.search( null, event );
+                                               }
+                                       }, self.options.delay );
+                                       break;
+                               }
+                       })
+                       .bind( "keypress.autocomplete", function( event ) {
+                               if ( suppressKeyPress ) {
+                                       suppressKeyPress = false;
+                                       event.preventDefault();
+                               }
+                       })
+                       .bind( "focus.autocomplete", function() {
+                               if ( self.options.disabled ) {
+                                       return;
+                               }
+
+                               self.selectedItem = null;
+                               self.previous = self.element.val();
+                       })
+                       .bind( "blur.autocomplete", function( event ) {
+                               if ( self.options.disabled ) {
+                                       return;
+                               }
+
+                               clearTimeout( self.searching );
+                               // clicks on the menu (or a button to trigger a search) will cause a blur event
+                               self.closing = setTimeout(function() {
+                                       self.close( event );
+                                       self._change( event );
+                               }, 150 );
+                       });
+               this._initSource();
+               this.menu = $( "<ul></ul>" )
+                       .addClass( "ui-autocomplete" )
+                       .appendTo( $( this.options.appendTo || "body", doc )[0] )
+                       // prevent the close-on-blur in case of a "slow" click on the menu (long mousedown)
+                       .mousedown(function( event ) {
+                               // clicking on the scrollbar causes focus to shift to the body
+                               // but we can't detect a mouseup or a click immediately afterward
+                               // so we have to track the next mousedown and close the menu if
+                               // the user clicks somewhere outside of the autocomplete
+                               var menuElement = self.menu.element[ 0 ];
+                               if ( !$( event.target ).closest( ".ui-menu-item" ).length ) {
+                                       setTimeout(function() {
+                                               $( document ).one( 'mousedown', function( event ) {
+                                                       if ( event.target !== self.element[ 0 ] &&
+                                                               event.target !== menuElement &&
+                                                               !$.ui.contains( menuElement, event.target ) ) {
+                                                               self.close();
+                                                       }
+                                               });
+                                       }, 1 );
+                               }
+
+                               // use another timeout to make sure the blur-event-handler on the input was already triggered
+                               setTimeout(function() {
+                                       clearTimeout( self.closing );
+                               }, 13);
+                       })
+                       .menu({
+                               focus: function( event, ui ) {
+                                       var item = ui.item.data( "item.autocomplete" );
+                                       if ( false !== self._trigger( "focus", event, { item: item } ) ) {
+                                               // use value to match what will end up in the input, if it was a key event
+                                               if ( /^key/.test(event.originalEvent.type) ) {
+                                                       self.element.val( item.value );
+                                               }
+                                       }
+                               },
+                               selected: function( event, ui ) {
+                                       var item = ui.item.data( "item.autocomplete" ),
+                                               previous = self.previous;
+
+                                       // only trigger when focus was lost (click on menu)
+                                       if ( self.element[0] !== doc.activeElement ) {
+                                               self.element.focus();
+                                               self.previous = previous;
+                                               // #6109 - IE triggers two focus events and the second
+                                               // is asynchronous, so we need to reset the previous
+                                               // term synchronously and asynchronously :-(
+                                               setTimeout(function() {
+                                                       self.previous = previous;
+                                                       self.selectedItem = item;
+                                               }, 1);
+                                       }
+
+                                       if ( false !== self._trigger( "select", event, { item: item } ) ) {
+                                               self.element.val( item.value );
+                                       }
+                                       // reset the term after the select event
+                                       // this allows custom select handling to work properly
+                                       self.term = self.element.val();
+
+                                       self.close( event );
+                                       self.selectedItem = item;
+                               },
+                               blur: function( event, ui ) {
+                                       // don't set the value of the text field if it's already correct
+                                       // this prevents moving the cursor unnecessarily
+                                       if ( self.menu.element.is(":visible") &&
+                                               ( self.element.val() !== self.term ) ) {
+                                               self.element.val( self.term );
+                                       }
+                               }
+                       })
+                       .zIndex( this.element.zIndex() + 1 )
+                       // workaround for jQuery bug #5781 http://dev.jquery.com/ticket/5781
+                       .css({ top: 0, left: 0 })
+                       .hide()
+                       .data( "menu" );
+               if ( $.fn.bgiframe ) {
+                        this.menu.element.bgiframe();
+               }
+               // turning off autocomplete prevents the browser from remembering the
+               // value when navigating through history, so we re-enable autocomplete
+               // if the page is unloaded before the widget is destroyed. #7790
+               self.beforeunloadHandler = function() {
+                       self.element.removeAttr( "autocomplete" );
+               };
+               $( window ).bind( "beforeunload", self.beforeunloadHandler );
+       },
+
+       destroy: function() {
+               this.element
+                       .removeClass( "ui-autocomplete-input" )
+                       .removeAttr( "autocomplete" )
+                       .removeAttr( "role" )
+                       .removeAttr( "aria-autocomplete" )
+                       .removeAttr( "aria-haspopup" );
+               this.menu.element.remove();
+               $( window ).unbind( "beforeunload", this.beforeunloadHandler );
+               $.Widget.prototype.destroy.call( this );
+       },
+
+       _setOption: function( key, value ) {
+               $.Widget.prototype._setOption.apply( this, arguments );
+               if ( key === "source" ) {
+                       this._initSource();
+               }
+               if ( key === "appendTo" ) {
+                       this.menu.element.appendTo( $( value || "body", this.element[0].ownerDocument )[0] )
+               }
+               if ( key === "disabled" && value && this.xhr ) {
+                       this.xhr.abort();
+               }
+       },
+
+       _initSource: function() {
+               var self = this,
+                       array,
+                       url;
+               if ( $.isArray(this.options.source) ) {
+                       array = this.options.source;
+                       this.source = function( request, response ) {
+                               response( $.ui.autocomplete.filter(array, request.term) );
+                       };
+               } else if ( typeof this.options.source === "string" ) {
+                       url = this.options.source;
+                       this.source = function( request, response ) {
+                               if ( self.xhr ) {
+                                       self.xhr.abort();
+                               }
+                               self.xhr = $.ajax({
+                                       url: url,
+                                       data: request,
+                                       dataType: "json",
+                                       success: function( data, status ) {
+                                               response( data );
+                                       },
+                                       error: function() {
+                                               response( [] );
+                                       }
+                               });
+                       };
+               } else {
+                       this.source = this.options.source;
+               }
+       },
+
+       search: function( value, event ) {
+               value = value != null ? value : this.element.val();
+
+               // always save the actual value, not the one passed as an argument
+               this.term = this.element.val();
+
+               if ( value.length < this.options.minLength ) {
+                       return this.close( event );
+               }
+
+               clearTimeout( this.closing );
+               if ( this._trigger( "search", event ) === false ) {
+                       return;
+               }
+
+               return this._search( value );
+       },
+
+       _search: function( value ) {
+               this.pending++;
+               this.element.addClass( "ui-autocomplete-loading" );
+
+               this.source( { term: value }, this._response() );
+       },
+
+       _response: function() {
+               var that = this,
+                       index = ++requestIndex;
+
+               return function( content ) {
+                       if ( index === requestIndex ) {
+                               that.__response( content );
+                       }
+
+                       that.pending--;
+                       if ( !that.pending ) {
+                               that.element.removeClass( "ui-autocomplete-loading" );
+                       }
+               };
+       },
+
+       __response: function( content ) {
+               if ( !this.options.disabled && content && content.length ) {
+                       content = this._normalize( content );
+                       this._suggest( content );
+                       this._trigger( "open" );
+               } else {
+                       this.close();
+               }
+       },
+
+       close: function( event ) {
+               clearTimeout( this.closing );
+               if ( this.menu.element.is(":visible") ) {
+                       this.menu.element.hide();
+                       this.menu.deactivate();
+                       this._trigger( "close", event );
+               }
+       },
+       
+       _change: function( event ) {
+               if ( this.previous !== this.element.val() ) {
+                       this._trigger( "change", event, { item: this.selectedItem } );
+               }
+       },
+
+       _normalize: function( items ) {
+               // assume all items have the right format when the first item is complete
+               if ( items.length && items[0].label && items[0].value ) {
+                       return items;
+               }
+               return $.map( items, function(item) {
+                       if ( typeof item === "string" ) {
+                               return {
+                                       label: item,
+                                       value: item
+                               };
+                       }
+                       return $.extend({
+                               label: item.label || item.value,
+                               value: item.value || item.label
+                       }, item );
+               });
+       },
+
+       _suggest: function( items ) {
+               var ul = this.menu.element
+                       .empty()
+                       .zIndex( this.element.zIndex() + 1 );
+               this._renderMenu( ul, items );
+               // TODO refresh should check if the active item is still in the dom, removing the need for a manual deactivate
+               this.menu.deactivate();
+               this.menu.refresh();
+
+               // size and position menu
+               ul.show();
+               this._resizeMenu();
+               ul.position( $.extend({
+                       of: this.element
+               }, this.options.position ));
+
+               if ( this.options.autoFocus ) {
+                       this.menu.next( new $.Event("mouseover") );
+               }
+       },
+
+       _resizeMenu: function() {
+               var ul = this.menu.element;
+               ul.outerWidth( Math.max(
+                       // Firefox wraps long text (possibly a rounding bug)
+                       // so we add 1px to avoid the wrapping (#7513)
+                       ul.width( "" ).outerWidth() + 1,
+                       this.element.outerWidth()
+               ) );
+       },
+
+       _renderMenu: function( ul, items ) {
+               var self = this;
+               $.each( items, function( index, item ) {
+                       self._renderItem( ul, item );
+               });
+       },
+
+       _renderItem: function( ul, item) {
+               return $( "<li></li>" )
+                       .data( "item.autocomplete", item )
+                       .append( $( "<a></a>" ).text( item.label ) )
+                       .appendTo( ul );
+       },
+
+       _move: function( direction, event ) {
+               if ( !this.menu.element.is(":visible") ) {
+                       this.search( null, event );
+                       return;
+               }
+               if ( this.menu.first() && /^previous/.test(direction) ||
+                               this.menu.last() && /^next/.test(direction) ) {
+                       this.element.val( this.term );
+                       this.menu.deactivate();
+                       return;
+               }
+               this.menu[ direction ]( event );
+       },
+
+       widget: function() {
+               return this.menu.element;
+       },
+       _keyEvent: function( keyEvent, event ) {
+               if ( !this.isMultiLine || this.menu.element.is( ":visible" ) ) {
+                       this._move( keyEvent, event );
+
+                       // prevents moving cursor to beginning/end of the text field in some browsers
+                       event.preventDefault();
+               }
+       }
+});
+
+$.extend( $.ui.autocomplete, {
+       escapeRegex: function( value ) {
+               return value.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&");
+       },
+       filter: function(array, term) {
+               var matcher = new RegExp( $.ui.autocomplete.escapeRegex(term), "i" );
+               return $.grep( array, function(value) {
+                       return matcher.test( value.label || value.value || value );
+               });
+       }
+});
+
+}( jQuery ));
+
+/*
+ * jQuery UI Menu (not officially released)
+ * 
+ * This widget isn't yet finished and the API is subject to change. We plan to finish
+ * it for the next release. You're welcome to give it a try anyway and give us feedback,
+ * as long as you're okay with migrating your code later on. We can help with that, too.
+ *
+ * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Menu
+ *
+ * Depends:
+ *     jquery.ui.core.js
+ *  jquery.ui.widget.js
+ */
+(function($) {
+
+$.widget("ui.menu", {
+       _create: function() {
+               var self = this;
+               this.element
+                       .addClass("ui-menu ui-widget ui-widget-content ui-corner-all")
+                       .attr({
+                               role: "listbox",
+                               "aria-activedescendant": "ui-active-menuitem"
+                       })
+                       .click(function( event ) {
+                               if ( !$( event.target ).closest( ".ui-menu-item a" ).length ) {
+                                       return;
+                               }
+                               // temporary
+                               event.preventDefault();
+                               self.select( event );
+                       });
+               this.refresh();
+       },
+       
+       refresh: function() {
+               var self = this;
+
+               // don't refresh list items that are already adapted
+               var items = this.element.children("li:not(.ui-menu-item):has(a)")
+                       .addClass("ui-menu-item")
+                       .attr("role", "menuitem");
+               
+               items.children("a")
+                       .addClass("ui-corner-all")
+                       .attr("tabindex", -1)
+                       // mouseenter doesn't work with event delegation
+                       .mouseenter(function( event ) {
+                               self.activate( event, $(this).parent() );
+                       })
+                       .mouseleave(function() {
+                               self.deactivate();
+                       });
+       },
+
+       activate: function( event, item ) {
+               this.deactivate();
+               if (this.hasScroll()) {
+                       var offset = item.offset().top - this.element.offset().top,
+                               scroll = this.element.scrollTop(),
+                               elementHeight = this.element.height();
+                       if (offset < 0) {
+                               this.element.scrollTop( scroll + offset);
+                       } else if (offset >= elementHeight) {
+                               this.element.scrollTop( scroll + offset - elementHeight + item.height());
+                       }
+               }
+               this.active = item.eq(0)
+                       .children("a")
+                               .addClass("ui-state-hover")
+                               .attr("id", "ui-active-menuitem")
+                       .end();
+               this._trigger("focus", event, { item: item });
+       },
+
+       deactivate: function() {
+               if (!this.active) { return; }
+
+               this.active.children("a")
+                       .removeClass("ui-state-hover")
+                       .removeAttr("id");
+               this._trigger("blur");
+               this.active = null;
+       },
+
+       next: function(event) {
+               this.move("next", ".ui-menu-item:first", event);
+       },
+
+       previous: function(event) {
+               this.move("prev", ".ui-menu-item:last", event);
+       },
+
+       first: function() {
+               return this.active && !this.active.prevAll(".ui-menu-item").length;
+       },
+
+       last: function() {
+               return this.active && !this.active.nextAll(".ui-menu-item").length;
+       },
+
+       move: function(direction, edge, event) {
+               if (!this.active) {
+                       this.activate(event, this.element.children(edge));
+                       return;
+               }
+               var next = this.active[direction + "All"](".ui-menu-item").eq(0);
+               if (next.length) {
+                       this.activate(event, next);
+               } else {
+                       this.activate(event, this.element.children(edge));
+               }
+       },
+
+       // TODO merge with previousPage
+       nextPage: function(event) {
+               if (this.hasScroll()) {
+                       // TODO merge with no-scroll-else
+                       if (!this.active || this.last()) {
+                               this.activate(event, this.element.children(".ui-menu-item:first"));
+                               return;
+                       }
+                       var base = this.active.offset().top,
+                               height = this.element.height(),
+                               result = this.element.children(".ui-menu-item").filter(function() {
+                                       var close = $(this).offset().top - base - height + $(this).height();
+                                       // TODO improve approximation
+                                       return close < 10 && close > -10;
+                               });
+
+                       // TODO try to catch this earlier when scrollTop indicates the last page anyway
+                       if (!result.length) {
+                               result = this.element.children(".ui-menu-item:last");
+                       }
+                       this.activate(event, result);
+               } else {
+                       this.activate(event, this.element.children(".ui-menu-item")
+                               .filter(!this.active || this.last() ? ":first" : ":last"));
+               }
+       },
+
+       // TODO merge with nextPage
+       previousPage: function(event) {
+               if (this.hasScroll()) {
+                       // TODO merge with no-scroll-else
+                       if (!this.active || this.first()) {
+                               this.activate(event, this.element.children(".ui-menu-item:last"));
+                               return;
+                       }
+
+                       var base = this.active.offset().top,
+                               height = this.element.height(),
+                               result = this.element.children(".ui-menu-item").filter(function() {
+                                       var close = $(this).offset().top - base + height - $(this).height();
+                                       // TODO improve approximation
+                                       return close < 10 && close > -10;
+                               });
+
+                       // TODO try to catch this earlier when scrollTop indicates the last page anyway
+                       if (!result.length) {
+                               result = this.element.children(".ui-menu-item:first");
+                       }
+                       this.activate(event, result);
+               } else {
+                       this.activate(event, this.element.children(".ui-menu-item")
+                               .filter(!this.active || this.first() ? ":last" : ":first"));
+               }
+       },
+
+       hasScroll: function() {
+               return this.element.height() < this.element[ $.fn.prop ? "prop" : "attr" ]("scrollHeight");
+       },
+
+       select: function( event ) {
+               this._trigger("selected", event, { item: this.active });
+       }
+});
+
+}(jQuery));
diff --git a/resources/lib/jquery.ui/jquery.ui.button.js b/resources/lib/jquery.ui/jquery.ui.button.js
new file mode 100644 (file)
index 0000000..8326262
--- /dev/null
@@ -0,0 +1,414 @@
+/*!
+ * jQuery UI Button 1.8.24
+ *
+ * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Button
+ *
+ * Depends:
+ *     jquery.ui.core.js
+ *     jquery.ui.widget.js
+ */
+(function( $, undefined ) {
+
+var lastActive, startXPos, startYPos, clickDragged,
+       baseClasses = "ui-button ui-widget ui-state-default ui-corner-all",
+       stateClasses = "ui-state-hover ui-state-active ",
+       typeClasses = "ui-button-icons-only ui-button-icon-only ui-button-text-icons ui-button-text-icon-primary ui-button-text-icon-secondary ui-button-text-only",
+       formResetHandler = function() {
+               var buttons = $( this ).find( ":ui-button" );
+               setTimeout(function() {
+                       buttons.button( "refresh" );
+               }, 1 );
+       },
+       radioGroup = function( radio ) {
+               var name = radio.name,
+                       form = radio.form,
+                       radios = $( [] );
+               if ( name ) {
+                       if ( form ) {
+                               radios = $( form ).find( "[name='" + name + "']" );
+                       } else {
+                               radios = $( "[name='" + name + "']", radio.ownerDocument )
+                                       .filter(function() {
+                                               return !this.form;
+                                       });
+                       }
+               }
+               return radios;
+       };
+
+$.widget( "ui.button", {
+       options: {
+               disabled: null,
+               text: true,
+               label: null,
+               icons: {
+                       primary: null,
+                       secondary: null
+               }
+       },
+       _create: function() {
+               this.element.closest( "form" )
+                       .unbind( "reset.button" )
+                       .bind( "reset.button", formResetHandler );
+
+               if ( typeof this.options.disabled !== "boolean" ) {
+                       this.options.disabled = !!this.element.propAttr( "disabled" );
+               } else {
+                       this.element.propAttr( "disabled", this.options.disabled );
+               }
+
+               this._determineButtonType();
+               this.hasTitle = !!this.buttonElement.attr( "title" );
+
+               var self = this,
+                       options = this.options,
+                       toggleButton = this.type === "checkbox" || this.type === "radio",
+                       hoverClass = "ui-state-hover" + ( !toggleButton ? " ui-state-active" : "" ),
+                       focusClass = "ui-state-focus";
+
+               if ( options.label === null ) {
+                       options.label = this.buttonElement.html();
+               }
+
+               this.buttonElement
+                       .addClass( baseClasses )
+                       .attr( "role", "button" )
+                       .bind( "mouseenter.button", function() {
+                               if ( options.disabled ) {
+                                       return;
+                               }
+                               $( this ).addClass( "ui-state-hover" );
+                               if ( this === lastActive ) {
+                                       $( this ).addClass( "ui-state-active" );
+                               }
+                       })
+                       .bind( "mouseleave.button", function() {
+                               if ( options.disabled ) {
+                                       return;
+                               }
+                               $( this ).removeClass( hoverClass );
+                       })
+                       .bind( "click.button", function( event ) {
+                               if ( options.disabled ) {
+                                       event.preventDefault();
+                                       event.stopImmediatePropagation();
+                               }
+                       });
+
+               this.element
+                       .bind( "focus.button", function() {
+                               // no need to check disabled, focus won't be triggered anyway
+                               self.buttonElement.addClass( focusClass );
+                       })
+                       .bind( "blur.button", function() {
+                               self.buttonElement.removeClass( focusClass );
+                       });
+
+               if ( toggleButton ) {
+                       this.element.bind( "change.button", function() {
+                               if ( clickDragged ) {
+                                       return;
+                               }
+                               self.refresh();
+                       });
+                       // if mouse moves between mousedown and mouseup (drag) set clickDragged flag
+                       // prevents issue where button state changes but checkbox/radio checked state
+                       // does not in Firefox (see ticket #6970)
+                       this.buttonElement
+                               .bind( "mousedown.button", function( event ) {
+                                       if ( options.disabled ) {
+                                               return;
+                                       }
+                                       clickDragged = false;
+                                       startXPos = event.pageX;
+                                       startYPos = event.pageY;
+                               })
+                               .bind( "mouseup.button", function( event ) {
+                                       if ( options.disabled ) {
+                                               return;
+                                       }
+                                       if ( startXPos !== event.pageX || startYPos !== event.pageY ) {
+                                               clickDragged = true;
+                                       }
+                       });
+               }
+
+               if ( this.type === "checkbox" ) {
+                       this.buttonElement.bind( "click.button", function() {
+                               if ( options.disabled || clickDragged ) {
+                                       return false;
+                               }
+                               $( this ).toggleClass( "ui-state-active" );
+                               self.buttonElement.attr( "aria-pressed", self.element[0].checked );
+                       });
+               } else if ( this.type === "radio" ) {
+                       this.buttonElement.bind( "click.button", function() {
+                               if ( options.disabled || clickDragged ) {
+                                       return false;
+                               }
+                               $( this ).addClass( "ui-state-active" );
+                               self.buttonElement.attr( "aria-pressed", "true" );
+
+                               var radio = self.element[ 0 ];
+                               radioGroup( radio )
+                                       .not( radio )
+                                       .map(function() {
+                                               return $( this ).button( "widget" )[ 0 ];
+                                       })
+                                       .removeClass( "ui-state-active" )
+                                       .attr( "aria-pressed", "false" );
+                       });
+               } else {
+                       this.buttonElement
+                               .bind( "mousedown.button", function() {
+                                       if ( options.disabled ) {
+                                               return false;
+                                       }
+                                       $( this ).addClass( "ui-state-active" );
+                                       lastActive = this;
+                                       $( document ).one( "mouseup", function() {
+                                               lastActive = null;
+                                       });
+                               })
+                               .bind( "mouseup.button", function() {
+                                       if ( options.disabled ) {
+                                               return false;
+                                       }
+                                       $( this ).removeClass( "ui-state-active" );
+                               })
+                               .bind( "keydown.button", function(event) {
+                                       if ( options.disabled ) {
+                                               return false;
+                                       }
+                                       if ( event.keyCode == $.ui.keyCode.SPACE || event.keyCode == $.ui.keyCode.ENTER ) {
+                                               $( this ).addClass( "ui-state-active" );
+                                       }
+                               })
+                               .bind( "keyup.button", function() {
+                                       $( this ).removeClass( "ui-state-active" );
+                               });
+
+                       if ( this.buttonElement.is("a") ) {
+                               this.buttonElement.keyup(function(event) {
+                                       if ( event.keyCode === $.ui.keyCode.SPACE ) {
+                                               // TODO pass through original event correctly (just as 2nd argument doesn't work)
+                                               $( this ).click();
+                                       }
+                               });
+                       }
+               }
+
+               // TODO: pull out $.Widget's handling for the disabled option into
+               // $.Widget.prototype._setOptionDisabled so it's easy to proxy and can
+               // be overridden by individual plugins
+               this._setOption( "disabled", options.disabled );
+               this._resetButton();
+       },
+
+       _determineButtonType: function() {
+
+               if ( this.element.is(":checkbox") ) {
+                       this.type = "checkbox";
+               } else if ( this.element.is(":radio") ) {
+                       this.type = "radio";
+               } else if ( this.element.is("input") ) {
+                       this.type = "input";
+               } else {
+                       this.type = "button";
+               }
+
+               if ( this.type === "checkbox" || this.type === "radio" ) {
+                       // we don't search against the document in case the element
+                       // is disconnected from the DOM
+                       var ancestor = this.element.parents().filter(":last"),
+                               labelSelector = "label[for='" + this.element.attr("id") + "']";
+                       this.buttonElement = ancestor.find( labelSelector );
+                       if ( !this.buttonElement.length ) {
+                               ancestor = ancestor.length ? ancestor.siblings() : this.element.siblings();
+                               this.buttonElement = ancestor.filter( labelSelector );
+                               if ( !this.buttonElement.length ) {
+                                       this.buttonElement = ancestor.find( labelSelector );
+                               }
+                       }
+                       this.element.addClass( "ui-helper-hidden-accessible" );
+
+                       var checked = this.element.is( ":checked" );
+                       if ( checked ) {
+                               this.buttonElement.addClass( "ui-state-active" );
+                       }
+                       this.buttonElement.attr( "aria-pressed", checked );
+               } else {
+                       this.buttonElement = this.element;
+               }
+       },
+
+       widget: function() {
+               return this.buttonElement;
+       },
+
+       destroy: function() {
+               this.element
+                       .removeClass( "ui-helper-hidden-accessible" );
+               this.buttonElement
+                       .removeClass( baseClasses + " " + stateClasses + " " + typeClasses )
+                       .removeAttr( "role" )
+                       .removeAttr( "aria-pressed" )
+                       .html( this.buttonElement.find(".ui-button-text").html() );
+
+               if ( !this.hasTitle ) {
+                       this.buttonElement.removeAttr( "title" );
+               }
+
+               $.Widget.prototype.destroy.call( this );
+       },
+
+       _setOption: function( key, value ) {
+               $.Widget.prototype._setOption.apply( this, arguments );
+               if ( key === "disabled" ) {
+                       if ( value ) {
+                               this.element.propAttr( "disabled", true );
+                       } else {
+                               this.element.propAttr( "disabled", false );
+                       }
+                       return;
+               }
+               this._resetButton();
+       },
+
+       refresh: function() {
+               var isDisabled = this.element.is( ":disabled" );
+               if ( isDisabled !== this.options.disabled ) {
+                       this._setOption( "disabled", isDisabled );
+               }
+               if ( this.type === "radio" ) {
+                       radioGroup( this.element[0] ).each(function() {
+                               if ( $( this ).is( ":checked" ) ) {
+                                       $( this ).button( "widget" )
+                                               .addClass( "ui-state-active" )
+                                               .attr( "aria-pressed", "true" );
+                               } else {
+                                       $( this ).button( "widget" )
+                                               .removeClass( "ui-state-active" )
+                                               .attr( "aria-pressed", "false" );
+                               }
+                       });
+               } else if ( this.type === "checkbox" ) {
+                       if ( this.element.is( ":checked" ) ) {
+                               this.buttonElement
+                                       .addClass( "ui-state-active" )
+                                       .attr( "aria-pressed", "true" );
+                       } else {
+                               this.buttonElement
+                                       .removeClass( "ui-state-active" )
+                                       .attr( "aria-pressed", "false" );
+                       }
+               }
+       },
+
+       _resetButton: function() {
+               if ( this.type === "input" ) {
+                       if ( this.options.label ) {
+                               this.element.val( this.options.label );
+                       }
+                       return;
+               }
+               var buttonElement = this.buttonElement.removeClass( typeClasses ),
+                       buttonText = $( "<span></span>", this.element[0].ownerDocument )
+                               .addClass( "ui-button-text" )
+                               .html( this.options.label )
+                               .appendTo( buttonElement.empty() )
+                               .text(),
+                       icons = this.options.icons,
+                       multipleIcons = icons.primary && icons.secondary,
+                       buttonClasses = [];  
+
+               if ( icons.primary || icons.secondary ) {
+                       if ( this.options.text ) {
+                               buttonClasses.push( "ui-button-text-icon" + ( multipleIcons ? "s" : ( icons.primary ? "-primary" : "-secondary" ) ) );
+                       }
+
+                       if ( icons.primary ) {
+                               buttonElement.prepend( "<span class='ui-button-icon-primary ui-icon " + icons.primary + "'></span>" );
+                       }
+
+                       if ( icons.secondary ) {
+                               buttonElement.append( "<span class='ui-button-icon-secondary ui-icon " + icons.secondary + "'></span>" );
+                       }
+
+                       if ( !this.options.text ) {
+                               buttonClasses.push( multipleIcons ? "ui-button-icons-only" : "ui-button-icon-only" );
+
+                               if ( !this.hasTitle ) {
+                                       buttonElement.attr( "title", buttonText );
+                               }
+                       }
+               } else {
+                       buttonClasses.push( "ui-button-text-only" );
+               }
+               buttonElement.addClass( buttonClasses.join( " " ) );
+       }
+});
+
+$.widget( "ui.buttonset", {
+       options: {
+               items: ":button, :submit, :reset, :checkbox, :radio, a, :data(button)"
+       },
+
+       _create: function() {
+               this.element.addClass( "ui-buttonset" );
+       },
+       
+       _init: function() {
+               this.refresh();
+       },
+
+       _setOption: function( key, value ) {
+               if ( key === "disabled" ) {
+                       this.buttons.button( "option", key, value );
+               }
+
+               $.Widget.prototype._setOption.apply( this, arguments );
+       },
+       
+       refresh: function() {
+               var rtl = this.element.css( "direction" ) === "rtl";
+               
+               this.buttons = this.element.find( this.options.items )
+                       .filter( ":ui-button" )
+                               .button( "refresh" )
+                       .end()
+                       .not( ":ui-button" )
+                               .button()
+                       .end()
+                       .map(function() {
+                               return $( this ).button( "widget" )[ 0 ];
+                       })
+                               .removeClass( "ui-corner-all ui-corner-left ui-corner-right" )
+                               .filter( ":first" )
+                                       .addClass( rtl ? "ui-corner-right" : "ui-corner-left" )
+                               .end()
+                               .filter( ":last" )
+                                       .addClass( rtl ? "ui-corner-left" : "ui-corner-right" )
+                               .end()
+                       .end();
+       },
+
+       destroy: function() {
+               this.element.removeClass( "ui-buttonset" );
+               this.buttons
+                       .map(function() {
+                               return $( this ).button( "widget" )[ 0 ];
+                       })
+                               .removeClass( "ui-corner-left ui-corner-right" )
+                       .end()
+                       .button( "destroy" );
+
+               $.Widget.prototype.destroy.call( this );
+       }
+});
+
+}( jQuery ) );
diff --git a/resources/lib/jquery.ui/jquery.ui.core.js b/resources/lib/jquery.ui/jquery.ui.core.js
new file mode 100644 (file)
index 0000000..b36c1ac
--- /dev/null
@@ -0,0 +1,334 @@
+/*!
+ * jQuery UI 1.8.24
+ *
+ * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI
+ */
+(function( $, undefined ) {
+
+// prevent duplicate loading
+// this is only a problem because we proxy existing functions
+// and we don't want to double proxy them
+$.ui = $.ui || {};
+if ( $.ui.version ) {
+       return;
+}
+
+$.extend( $.ui, {
+       version: "1.8.24",
+
+       keyCode: {
+               ALT: 18,
+               BACKSPACE: 8,
+               CAPS_LOCK: 20,
+               COMMA: 188,
+               COMMAND: 91,
+               COMMAND_LEFT: 91, // COMMAND
+               COMMAND_RIGHT: 93,
+               CONTROL: 17,
+               DELETE: 46,
+               DOWN: 40,
+               END: 35,
+               ENTER: 13,
+               ESCAPE: 27,
+               HOME: 36,
+               INSERT: 45,
+               LEFT: 37,
+               MENU: 93, // COMMAND_RIGHT
+               NUMPAD_ADD: 107,
+               NUMPAD_DECIMAL: 110,
+               NUMPAD_DIVIDE: 111,
+               NUMPAD_ENTER: 108,
+               NUMPAD_MULTIPLY: 106,
+               NUMPAD_SUBTRACT: 109,
+               PAGE_DOWN: 34,
+               PAGE_UP: 33,
+               PERIOD: 190,
+               RIGHT: 39,
+               SHIFT: 16,
+               SPACE: 32,
+               TAB: 9,
+               UP: 38,
+               WINDOWS: 91 // COMMAND
+       }
+});
+
+// plugins
+$.fn.extend({
+       propAttr: $.fn.prop || $.fn.attr,
+
+       _focus: $.fn.focus,
+       focus: function( delay, fn ) {
+               return typeof delay === "number" ?
+                       this.each(function() {
+                               var elem = this;
+                               setTimeout(function() {
+                                       $( elem ).focus();
+                                       if ( fn ) {
+                                               fn.call( elem );
+                                       }
+                               }, delay );
+                       }) :
+                       this._focus.apply( this, arguments );
+       },
+
+       scrollParent: function() {
+               var scrollParent;
+               if (($.browser.msie && (/(static|relative)/).test(this.css('position'))) || (/absolute/).test(this.css('position'))) {
+                       scrollParent = this.parents().filter(function() {
+                               return (/(relative|absolute|fixed)/).test($.curCSS(this,'position',1)) && (/(auto|scroll)/).test($.curCSS(this,'overflow',1)+$.curCSS(this,'overflow-y',1)+$.curCSS(this,'overflow-x',1));
+                       }).eq(0);
+               } else {
+                       scrollParent = this.parents().filter(function() {
+                               return (/(auto|scroll)/).test($.curCSS(this,'overflow',1)+$.curCSS(this,'overflow-y',1)+$.curCSS(this,'overflow-x',1));
+                       }).eq(0);
+               }
+
+               return (/fixed/).test(this.css('position')) || !scrollParent.length ? $(document) : scrollParent;
+       },
+
+       zIndex: function( zIndex ) {
+               if ( zIndex !== undefined ) {
+                       return this.css( "zIndex", zIndex );
+               }
+
+               if ( this.length ) {
+                       var elem = $( this[ 0 ] ), position, value;
+                       while ( elem.length && elem[ 0 ] !== document ) {
+                               // Ignore z-index if position is set to a value where z-index is ignored by the browser
+                               // This makes behavior of this function consistent across browsers
+                               // WebKit always returns auto if the element is positioned
+                               position = elem.css( "position" );
+                               if ( position === "absolute" || position === "relative" || position === "fixed" ) {
+                                       // IE returns 0 when zIndex is not specified
+                                       // other browsers return a string
+                                       // we ignore the case of nested elements with an explicit value of 0
+                                       // <div style="z-index: -10;"><div style="z-index: 0;"></div></div>
+                                       value = parseInt( elem.css( "zIndex" ), 10 );
+                                       if ( !isNaN( value ) && value !== 0 ) {
+                                               return value;
+                                       }
+                               }
+                               elem = elem.parent();
+                       }
+               }
+
+               return 0;
+       },
+
+       disableSelection: function() {
+               return this.bind( ( $.support.selectstart ? "selectstart" : "mousedown" ) +
+                       ".ui-disableSelection", function( event ) {
+                               event.preventDefault();
+                       });
+       },
+
+       enableSelection: function() {
+               return this.unbind( ".ui-disableSelection" );
+       }
+});
+
+// support: jQuery <1.8
+if ( !$( "<a>" ).outerWidth( 1 ).jquery ) {
+       $.each( [ "Width", "Height" ], function( i, name ) {
+               var side = name === "Width" ? [ "Left", "Right" ] : [ "Top", "Bottom" ],
+                       type = name.toLowerCase(),
+                       orig = {
+                               innerWidth: $.fn.innerWidth,
+                               innerHeight: $.fn.innerHeight,
+                               outerWidth: $.fn.outerWidth,
+                               outerHeight: $.fn.outerHeight
+                       };
+
+               function reduce( elem, size, border, margin ) {
+                       $.each( side, function() {
+                               size -= parseFloat( $.curCSS( elem, "padding" + this, true) ) || 0;
+                               if ( border ) {
+                                       size -= parseFloat( $.curCSS( elem, "border" + this + "Width", true) ) || 0;
+                               }
+                               if ( margin ) {
+                                       size -= parseFloat( $.curCSS( elem, "margin" + this, true) ) || 0;
+                               }
+                       });
+                       return size;
+               }
+
+               $.fn[ "inner" + name ] = function( size ) {
+                       if ( size === undefined ) {
+                               return orig[ "inner" + name ].call( this );
+                       }
+
+                       return this.each(function() {
+                               $( this ).css( type, reduce( this, size ) + "px" );
+                       });
+               };
+
+               $.fn[ "outer" + name] = function( size, margin ) {
+                       if ( typeof size !== "number" ) {
+                               return orig[ "outer" + name ].call( this, size );
+                       }
+
+                       return this.each(function() {
+                               $( this).css( type, reduce( this, size, true, margin ) + "px" );
+                       });
+               };
+       });
+}
+
+// selectors
+function focusable( element, isTabIndexNotNaN ) {
+       var nodeName = element.nodeName.toLowerCase();
+       if ( "area" === nodeName ) {
+               var map = element.parentNode,
+                       mapName = map.name,
+                       img;
+               if ( !element.href || !mapName || map.nodeName.toLowerCase() !== "map" ) {
+                       return false;
+               }
+               img = $( "img[usemap=#" + mapName + "]" )[0];
+               return !!img && visible( img );
+       }
+       return ( /input|select|textarea|button|object/.test( nodeName )
+               ? !element.disabled
+               : "a" == nodeName
+                       ? element.href || isTabIndexNotNaN
+                       : isTabIndexNotNaN)
+               // the element and all of its ancestors must be visible
+               && visible( element );
+}
+
+function visible( element ) {
+       return !$( element ).parents().andSelf().filter(function() {
+               return $.curCSS( this, "visibility" ) === "hidden" ||
+                       $.expr.filters.hidden( this );
+       }).length;
+}
+
+$.extend( $.expr[ ":" ], {
+       data: $.expr.createPseudo ?
+               $.expr.createPseudo(function( dataName ) {
+                       return function( elem ) {
+                               return !!$.data( elem, dataName );
+                       };
+               }) :
+               // support: jQuery <1.8
+               function( elem, i, match ) {
+                       return !!$.data( elem, match[ 3 ] );
+               },
+
+       focusable: function( element ) {
+               return focusable( element, !isNaN( $.attr( element, "tabindex" ) ) );
+       },
+
+       tabbable: function( element ) {
+               var tabIndex = $.attr( element, "tabindex" ),
+                       isTabIndexNaN = isNaN( tabIndex );
+               return ( isTabIndexNaN || tabIndex >= 0 ) && focusable( element, !isTabIndexNaN );
+       }
+});
+
+// support
+$(function() {
+       var body = document.body,
+               div = body.appendChild( div = document.createElement( "div" ) );
+
+       // access offsetHeight before setting the style to prevent a layout bug
+       // in IE 9 which causes the elemnt to continue to take up space even
+       // after it is removed from the DOM (#8026)
+       div.offsetHeight;
+
+       $.extend( div.style, {
+               minHeight: "100px",
+               height: "auto",
+               padding: 0,
+               borderWidth: 0
+       });
+
+       $.support.minHeight = div.offsetHeight === 100;
+       $.support.selectstart = "onselectstart" in div;
+
+       // set display to none to avoid a layout bug in IE
+       // http://dev.jquery.com/ticket/4014
+       body.removeChild( div ).style.display = "none";
+});
+
+// jQuery <1.4.3 uses curCSS, in 1.4.3 - 1.7.2 curCSS = css, 1.8+ only has css
+if ( !$.curCSS ) {
+       $.curCSS = $.css;
+}
+
+
+
+
+
+// deprecated
+$.extend( $.ui, {
+       // $.ui.plugin is deprecated.  Use the proxy pattern instead.
+       plugin: {
+               add: function( module, option, set ) {
+                       var proto = $.ui[ module ].prototype;
+                       for ( var i in set ) {
+                               proto.plugins[ i ] = proto.plugins[ i ] || [];
+                               proto.plugins[ i ].push( [ option, set[ i ] ] );
+                       }
+               },
+               call: function( instance, name, args ) {
+                       var set = instance.plugins[ name ];
+                       if ( !set || !instance.element[ 0 ].parentNode ) {
+                               return;
+                       }
+       
+                       for ( var i = 0; i < set.length; i++ ) {
+                               if ( instance.options[ set[ i ][ 0 ] ] ) {
+                                       set[ i ][ 1 ].apply( instance.element, args );
+                               }
+                       }
+               }
+       },
+       
+       // will be deprecated when we switch to jQuery 1.4 - use jQuery.contains()
+       contains: function( a, b ) {
+               return document.compareDocumentPosition ?
+                       a.compareDocumentPosition( b ) & 16 :
+                       a !== b && a.contains( b );
+       },
+       
+       // only used by resizable
+       hasScroll: function( el, a ) {
+       
+               //If overflow is hidden, the element might have extra content, but the user wants to hide it
+               if ( $( el ).css( "overflow" ) === "hidden") {
+                       return false;
+               }
+       
+               var scroll = ( a && a === "left" ) ? "scrollLeft" : "scrollTop",
+                       has = false;
+       
+               if ( el[ scroll ] > 0 ) {
+                       return true;
+               }
+       
+               // TODO: determine which cases actually cause this to happen
+               // if the element doesn't have the scroll set, see if it's possible to
+               // set the scroll
+               el[ scroll ] = 1;
+               has = ( el[ scroll ] > 0 );
+               el[ scroll ] = 0;
+               return has;
+       },
+       
+       // these are odd functions, fix the API or move into individual plugins
+       isOverAxis: function( x, reference, size ) {
+               //Determines when x coordinate is over "b" element axis
+               return ( x > reference ) && ( x < ( reference + size ) );
+       },
+       isOver: function( y, x, top, left, height, width ) {
+               //Determines when x, y coordinates is over "b" element
+               return $.ui.isOverAxis( y, top, height ) && $.ui.isOverAxis( x, left, width );
+       }
+});
+
+})( jQuery );
diff --git a/resources/lib/jquery.ui/jquery.ui.datepicker.js b/resources/lib/jquery.ui/jquery.ui.datepicker.js
new file mode 100644 (file)
index 0000000..1fcea12
--- /dev/null
@@ -0,0 +1,1854 @@
+/*!
+ * jQuery UI Datepicker 1.8.24
+ *
+ * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Datepicker
+ *
+ * Depends:
+ *     jquery.ui.core.js
+ */
+(function( $, undefined ) {
+
+$.extend($.ui, { datepicker: { version: "1.8.24" } });
+
+var PROP_NAME = 'datepicker';
+var dpuuid = new Date().getTime();
+var instActive;
+
+/* Date picker manager.
+   Use the singleton instance of this class, $.datepicker, to interact with the date picker.
+   Settings for (groups of) date pickers are maintained in an instance object,
+   allowing multiple different settings on the same page. */
+
+function Datepicker() {
+       this.debug = false; // Change this to true to start debugging
+       this._curInst = null; // The current instance in use
+       this._keyEvent = false; // If the last event was a key event
+       this._disabledInputs = []; // List of date picker inputs that have been disabled
+       this._datepickerShowing = false; // True if the popup picker is showing , false if not
+       this._inDialog = false; // True if showing within a "dialog", false if not
+       this._mainDivId = 'ui-datepicker-div'; // The ID of the main datepicker division
+       this._inlineClass = 'ui-datepicker-inline'; // The name of the inline marker class
+       this._appendClass = 'ui-datepicker-append'; // The name of the append marker class
+       this._triggerClass = 'ui-datepicker-trigger'; // The name of the trigger marker class
+       this._dialogClass = 'ui-datepicker-dialog'; // The name of the dialog marker class
+       this._disableClass = 'ui-datepicker-disabled'; // The name of the disabled covering marker class
+       this._unselectableClass = 'ui-datepicker-unselectable'; // The name of the unselectable cell marker class
+       this._currentClass = 'ui-datepicker-current-day'; // The name of the current day marker class
+       this._dayOverClass = 'ui-datepicker-days-cell-over'; // The name of the day hover marker class
+       this.regional = []; // Available regional settings, indexed by language code
+       this.regional[''] = { // Default regional settings
+               closeText: 'Done', // Display text for close link
+               prevText: 'Prev', // Display text for previous month link
+               nextText: 'Next', // Display text for next month link
+               currentText: 'Today', // Display text for current month link
+               monthNames: ['January','February','March','April','May','June',
+                       'July','August','September','October','November','December'], // Names of months for drop-down and formatting
+               monthNamesShort: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'], // For formatting
+               dayNames: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'], // For formatting
+               dayNamesShort: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'], // For formatting
+               dayNamesMin: ['Su','Mo','Tu','We','Th','Fr','Sa'], // Column headings for days starting at Sunday
+               weekHeader: 'Wk', // Column header for week of the year
+               dateFormat: 'mm/dd/yy', // See format options on parseDate
+               firstDay: 0, // The first day of the week, Sun = 0, Mon = 1, ...
+               isRTL: false, // True if right-to-left language, false if left-to-right
+               showMonthAfterYear: false, // True if the year select precedes month, false for month then year
+               yearSuffix: '' // Additional text to append to the year in the month headers
+       };
+       this._defaults = { // Global defaults for all the date picker instances
+               showOn: 'focus', // 'focus' for popup on focus,
+                       // 'button' for trigger button, or 'both' for either
+               showAnim: 'fadeIn', // Name of jQuery animation for popup
+               showOptions: {}, // Options for enhanced animations
+               defaultDate: null, // Used when field is blank: actual date,
+                       // +/-number for offset from today, null for today
+               appendText: '', // Display text following the input box, e.g. showing the format
+               buttonText: '...', // Text for trigger button
+               buttonImage: '', // URL for trigger button image
+               buttonImageOnly: false, // True if the image appears alone, false if it appears on a button
+               hideIfNoPrevNext: false, // True to hide next/previous month links
+                       // if not applicable, false to just disable them
+               navigationAsDateFormat: false, // True if date formatting applied to prev/today/next links
+               gotoCurrent: false, // True if today link goes back to current selection instead
+               changeMonth: false, // True if month can be selected directly, false if only prev/next
+               changeYear: false, // True if year can be selected directly, false if only prev/next
+               yearRange: 'c-10:c+10', // Range of years to display in drop-down,
+                       // either relative to today's year (-nn:+nn), relative to currently displayed year
+                       // (c-nn:c+nn), absolute (nnnn:nnnn), or a combination of the above (nnnn:-n)
+               showOtherMonths: false, // True to show dates in other months, false to leave blank
+               selectOtherMonths: false, // True to allow selection of dates in other months, false for unselectable
+               showWeek: false, // True to show week of the year, false to not show it
+               calculateWeek: this.iso8601Week, // How to calculate the week of the year,
+                       // takes a Date and returns the number of the week for it
+               shortYearCutoff: '+10', // Short year values < this are in the current century,
+                       // > this are in the previous century,
+                       // string value starting with '+' for current year + value
+               minDate: null, // The earliest selectable date, or null for no limit
+               maxDate: null, // The latest selectable date, or null for no limit
+               duration: 'fast', // Duration of display/closure
+               beforeShowDay: null, // Function that takes a date and returns an array with
+                       // [0] = true if selectable, false if not, [1] = custom CSS class name(s) or '',
+                       // [2] = cell title (optional), e.g. $.datepicker.noWeekends
+               beforeShow: null, // Function that takes an input field and
+                       // returns a set of custom settings for the date picker
+               onSelect: null, // Define a callback function when a date is selected
+               onChangeMonthYear: null, // Define a callback function when the month or year is changed
+               onClose: null, // Define a callback function when the datepicker is closed
+               numberOfMonths: 1, // Number of months to show at a time
+               showCurrentAtPos: 0, // The position in multipe months at which to show the current month (starting at 0)
+               stepMonths: 1, // Number of months to step back/forward
+               stepBigMonths: 12, // Number of months to step back/forward for the big links
+               altField: '', // Selector for an alternate field to store selected dates into
+               altFormat: '', // The date format to use for the alternate field
+               constrainInput: true, // The input is constrained by the current date format
+               showButtonPanel: false, // True to show button panel, false to not show it
+               autoSize: false, // True to size the input for the date format, false to leave as is
+               disabled: false // The initial disabled state
+       };
+       $.extend(this._defaults, this.regional['']);
+       this.dpDiv = bindHover($('<div id="' + this._mainDivId + '" class="ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all"></div>'));
+}
+
+$.extend(Datepicker.prototype, {
+       /* Class name added to elements to indicate already configured with a date picker. */
+       markerClassName: 'hasDatepicker',
+       
+       //Keep track of the maximum number of rows displayed (see #7043)
+       maxRows: 4,
+
+       /* Debug logging (if enabled). */
+       log: function () {
+               if (this.debug)
+                       console.log.apply('', arguments);
+       },
+       
+       // TODO rename to "widget" when switching to widget factory
+       _widgetDatepicker: function() {
+               return this.dpDiv;
+       },
+
+       /* Override the default settings for all instances of the date picker.
+          @param  settings  object - the new settings to use as defaults (anonymous object)
+          @return the manager object */
+       setDefaults: function(settings) {
+               extendRemove(this._defaults, settings || {});
+               return this;
+       },
+
+       /* Attach the date picker to a jQuery selection.
+          @param  target    element - the target input field or division or span
+          @param  settings  object - the new settings to use for this date picker instance (anonymous) */
+       _attachDatepicker: function(target, settings) {
+               // check for settings on the control itself - in namespace 'date:'
+               var inlineSettings = null;
+               for (var attrName in this._defaults) {
+                       var attrValue = target.getAttribute('date:' + attrName);
+                       if (attrValue) {
+                               inlineSettings = inlineSettings || {};
+                               try {
+                                       inlineSettings[attrName] = eval(attrValue);
+                               } catch (err) {
+                                       inlineSettings[attrName] = attrValue;
+                               }
+                       }
+               }
+               var nodeName = target.nodeName.toLowerCase();
+               var inline = (nodeName == 'div' || nodeName == 'span');
+               if (!target.id) {
+                       this.uuid += 1;
+                       target.id = 'dp' + this.uuid;
+               }
+               var inst = this._newInst($(target), inline);
+               inst.settings = $.extend({}, settings || {}, inlineSettings || {});
+               if (nodeName == 'input') {
+                       this._connectDatepicker(target, inst);
+               } else if (inline) {
+                       this._inlineDatepicker(target, inst);
+               }
+       },
+
+       /* Create a new instance object. */
+       _newInst: function(target, inline) {
+               var id = target[0].id.replace(/([^A-Za-z0-9_-])/g, '\\\\$1'); // escape jQuery meta chars
+               return {id: id, input: target, // associated target
+                       selectedDay: 0, selectedMonth: 0, selectedYear: 0, // current selection
+                       drawMonth: 0, drawYear: 0, // month being drawn
+                       inline: inline, // is datepicker inline or not
+                       dpDiv: (!inline ? this.dpDiv : // presentation div
+                       bindHover($('<div class="' + this._inlineClass + ' ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all"></div>')))};
+       },
+
+       /* Attach the date picker to an input field. */
+       _connectDatepicker: function(target, inst) {
+               var input = $(target);
+               inst.append = $([]);
+               inst.trigger = $([]);
+               if (input.hasClass(this.markerClassName))
+                       return;
+               this._attachments(input, inst);
+               input.addClass(this.markerClassName).keydown(this._doKeyDown).
+                       keypress(this._doKeyPress).keyup(this._doKeyUp).
+                       bind("setData.datepicker", function(event, key, value) {
+                               inst.settings[key] = value;
+                       }).bind("getData.datepicker", function(event, key) {
+                               return this._get(inst, key);
+                       });
+               this._autoSize(inst);
+               $.data(target, PROP_NAME, inst);
+               //If disabled option is true, disable the datepicker once it has been attached to the input (see ticket #5665)
+               if( inst.settings.disabled ) {
+                       this._disableDatepicker( target );
+               }
+       },
+
+       /* Make attachments based on settings. */
+       _attachments: function(input, inst) {
+               var appendText = this._get(inst, 'appendText');
+               var isRTL = this._get(inst, 'isRTL');
+               if (inst.append)
+                       inst.append.remove();
+               if (appendText) {
+                       inst.append = $('<span class="' + this._appendClass + '">' + appendText + '</span>');
+                       input[isRTL ? 'before' : 'after'](inst.append);
+               }
+               input.unbind('focus', this._showDatepicker);
+               if (inst.trigger)
+                       inst.trigger.remove();
+               var showOn = this._get(inst, 'showOn');
+               if (showOn == 'focus' || showOn == 'both') // pop-up date picker when in the marked field
+                       input.focus(this._showDatepicker);
+               if (showOn == 'button' || showOn == 'both') { // pop-up date picker when button clicked
+                       var buttonText = this._get(inst, 'buttonText');
+                       var buttonImage = this._get(inst, 'buttonImage');
+                       inst.trigger = $(this._get(inst, 'buttonImageOnly') ?
+                               $('<img/>').addClass(this._triggerClass).
+                                       attr({ src: buttonImage, alt: buttonText, title: buttonText }) :
+                               $('<button type="button"></button>').addClass(this._triggerClass).
+                                       html(buttonImage == '' ? buttonText : $('<img/>').attr(
+                                       { src:buttonImage, alt:buttonText, title:buttonText })));
+                       input[isRTL ? 'before' : 'after'](inst.trigger);
+                       inst.trigger.click(function() {
+                               if ($.datepicker._datepickerShowing && $.datepicker._lastInput == input[0])
+                                       $.datepicker._hideDatepicker();
+                               else if ($.datepicker._datepickerShowing && $.datepicker._lastInput != input[0]) {
+                                       $.datepicker._hideDatepicker(); 
+                                       $.datepicker._showDatepicker(input[0]);
+                               } else
+                                       $.datepicker._showDatepicker(input[0]);
+                               return false;
+                       });
+               }
+       },
+
+       /* Apply the maximum length for the date format. */
+       _autoSize: function(inst) {
+               if (this._get(inst, 'autoSize') && !inst.inline) {
+                       var date = new Date(2009, 12 - 1, 20); // Ensure double digits
+                       var dateFormat = this._get(inst, 'dateFormat');
+                       if (dateFormat.match(/[DM]/)) {
+                               var findMax = function(names) {
+                                       var max = 0;
+                                       var maxI = 0;
+                                       for (var i = 0; i < names.length; i++) {
+                                               if (names[i].length > max) {
+                                                       max = names[i].length;
+                                                       maxI = i;
+                                               }
+                                       }
+                                       return maxI;
+                               };
+                               date.setMonth(findMax(this._get(inst, (dateFormat.match(/MM/) ?
+                                       'monthNames' : 'monthNamesShort'))));
+                               date.setDate(findMax(this._get(inst, (dateFormat.match(/DD/) ?
+                                       'dayNames' : 'dayNamesShort'))) + 20 - date.getDay());
+                       }
+                       inst.input.attr('size', this._formatDate(inst, date).length);
+               }
+       },
+
+       /* Attach an inline date picker to a div. */
+       _inlineDatepicker: function(target, inst) {
+               var divSpan = $(target);
+               if (divSpan.hasClass(this.markerClassName))
+                       return;
+               divSpan.addClass(this.markerClassName).append(inst.dpDiv).
+                       bind("setData.datepicker", function(event, key, value){
+                               inst.settings[key] = value;
+                       }).bind("getData.datepicker", function(event, key){
+                               return this._get(inst, key);
+                       });
+               $.data(target, PROP_NAME, inst);
+               this._setDate(inst, this._getDefaultDate(inst), true);
+               this._updateDatepicker(inst);
+               this._updateAlternate(inst);
+               //If disabled option is true, disable the datepicker before showing it (see ticket #5665)
+               if( inst.settings.disabled ) {
+                       this._disableDatepicker( target );
+               }
+               // Set display:block in place of inst.dpDiv.show() which won't work on disconnected elements
+               // http://bugs.jqueryui.com/ticket/7552 - A Datepicker created on a detached div has zero height
+               inst.dpDiv.css( "display", "block" );
+       },
+
+       /* Pop-up the date picker in a "dialog" box.
+          @param  input     element - ignored
+          @param  date      string or Date - the initial date to display
+          @param  onSelect  function - the function to call when a date is selected
+          @param  settings  object - update the dialog date picker instance's settings (anonymous object)
+          @param  pos       int[2] - coordinates for the dialog's position within the screen or
+                            event - with x/y coordinates or
+                            leave empty for default (screen centre)
+          @return the manager object */
+       _dialogDatepicker: function(input, date, onSelect, settings, pos) {
+               var inst = this._dialogInst; // internal instance
+               if (!inst) {
+                       this.uuid += 1;
+                       var id = 'dp' + this.uuid;
+                       this._dialogInput = $('<input type="text" id="' + id +
+                               '" style="position: absolute; top: -100px; width: 0px;"/>');
+                       this._dialogInput.keydown(this._doKeyDown);
+                       $('body').append(this._dialogInput);
+                       inst = this._dialogInst = this._newInst(this._dialogInput, false);
+                       inst.settings = {};
+                       $.data(this._dialogInput[0], PROP_NAME, inst);
+               }
+               extendRemove(inst.settings, settings || {});
+               date = (date && date.constructor == Date ? this._formatDate(inst, date) : date);
+               this._dialogInput.val(date);
+
+               this._pos = (pos ? (pos.length ? pos : [pos.pageX, pos.pageY]) : null);
+               if (!this._pos) {
+                       var browserWidth = document.documentElement.clientWidth;
+                       var browserHeight = document.documentElement.clientHeight;
+                       var scrollX = document.documentElement.scrollLeft || document.body.scrollLeft;
+                       var scrollY = document.documentElement.scrollTop || document.body.scrollTop;
+                       this._pos = // should use actual width/height below
+                               [(browserWidth / 2) - 100 + scrollX, (browserHeight / 2) - 150 + scrollY];
+               }
+
+               // move input on screen for focus, but hidden behind dialog
+               this._dialogInput.css('left', (this._pos[0] + 20) + 'px').css('top', this._pos[1] + 'px');
+               inst.settings.onSelect = onSelect;
+               this._inDialog = true;
+               this.dpDiv.addClass(this._dialogClass);
+               this._showDatepicker(this._dialogInput[0]);
+               if ($.blockUI)
+                       $.blockUI(this.dpDiv);
+               $.data(this._dialogInput[0], PROP_NAME, inst);
+               return this;
+       },
+
+       /* Detach a datepicker from its control.
+          @param  target    element - the target input field or division or span */
+       _destroyDatepicker: function(target) {
+               var $target = $(target);
+               var inst = $.data(target, PROP_NAME);
+               if (!$target.hasClass(this.markerClassName)) {
+                       return;
+               }
+               var nodeName = target.nodeName.toLowerCase();
+               $.removeData(target, PROP_NAME);
+               if (nodeName == 'input') {
+                       inst.append.remove();
+                       inst.trigger.remove();
+                       $target.removeClass(this.markerClassName).
+                               unbind('focus', this._showDatepicker).
+                               unbind('keydown', this._doKeyDown).
+                               unbind('keypress', this._doKeyPress).
+                               unbind('keyup', this._doKeyUp);
+               } else if (nodeName == 'div' || nodeName == 'span')
+                       $target.removeClass(this.markerClassName).empty();
+       },
+
+       /* Enable the date picker to a jQuery selection.
+          @param  target    element - the target input field or division or span */
+       _enableDatepicker: function(target) {
+               var $target = $(target);
+               var inst = $.data(target, PROP_NAME);
+               if (!$target.hasClass(this.markerClassName)) {
+                       return;
+               }
+               var nodeName = target.nodeName.toLowerCase();
+               if (nodeName == 'input') {
+                       target.disabled = false;
+                       inst.trigger.filter('button').
+                               each(function() { this.disabled = false; }).end().
+                               filter('img').css({opacity: '1.0', cursor: ''});
+               }
+               else if (nodeName == 'div' || nodeName == 'span') {
+                       var inline = $target.children('.' + this._inlineClass);
+                       inline.children().removeClass('ui-state-disabled');
+                       inline.find("select.ui-datepicker-month, select.ui-datepicker-year").
+                               removeAttr("disabled");
+               }
+               this._disabledInputs = $.map(this._disabledInputs,
+                       function(value) { return (value == target ? null : value); }); // delete entry
+       },
+
+       /* Disable the date picker to a jQuery selection.
+          @param  target    element - the target input field or division or span */
+       _disableDatepicker: function(target) {
+               var $target = $(target);
+               var inst = $.data(target, PROP_NAME);
+               if (!$target.hasClass(this.markerClassName)) {
+                       return;
+               }
+               var nodeName = target.nodeName.toLowerCase();
+               if (nodeName == 'input') {
+                       target.disabled = true;
+                       inst.trigger.filter('button').
+                               each(function() { this.disabled = true; }).end().
+                               filter('img').css({opacity: '0.5', cursor: 'default'});
+               }
+               else if (nodeName == 'div' || nodeName == 'span') {
+                       var inline = $target.children('.' + this._inlineClass);
+                       inline.children().addClass('ui-state-disabled');
+                       inline.find("select.ui-datepicker-month, select.ui-datepicker-year").
+                               attr("disabled", "disabled");
+               }
+               this._disabledInputs = $.map(this._disabledInputs,
+                       function(value) { return (value == target ? null : value); }); // delete entry
+               this._disabledInputs[this._disabledInputs.length] = target;
+       },
+
+       /* Is the first field in a jQuery collection disabled as a datepicker?
+          @param  target    element - the target input field or division or span
+          @return boolean - true if disabled, false if enabled */
+       _isDisabledDatepicker: function(target) {
+               if (!target) {
+                       return false;
+               }
+               for (var i = 0; i < this._disabledInputs.length; i++) {
+                       if (this._disabledInputs[i] == target)
+                               return true;
+               }
+               return false;
+       },
+
+       /* Retrieve the instance data for the target control.
+          @param  target  element - the target input field or division or span
+          @return  object - the associated instance data
+          @throws  error if a jQuery problem getting data */
+       _getInst: function(target) {
+               try {
+                       return $.data(target, PROP_NAME);
+               }
+               catch (err) {
+                       throw 'Missing instance data for this datepicker';
+               }
+       },
+
+       /* Update or retrieve the settings for a date picker attached to an input field or division.
+          @param  target  element - the target input field or division or span
+          @param  name    object - the new settings to update or
+                          string - the name of the setting to change or retrieve,
+                          when retrieving also 'all' for all instance settings or
+                          'defaults' for all global defaults
+          @param  value   any - the new value for the setting
+                          (omit if above is an object or to retrieve a value) */
+       _optionDatepicker: function(target, name, value) {
+               var inst = this._getInst(target);
+               if (arguments.length == 2 && typeof name == 'string') {
+                       return (name == 'defaults' ? $.extend({}, $.datepicker._defaults) :
+                               (inst ? (name == 'all' ? $.extend({}, inst.settings) :
+                               this._get(inst, name)) : null));
+               }
+               var settings = name || {};
+               if (typeof name == 'string') {
+                       settings = {};
+                       settings[name] = value;
+               }
+               if (inst) {
+                       if (this._curInst == inst) {
+                               this._hideDatepicker();
+                       }
+                       var date = this._getDateDatepicker(target, true);
+                       var minDate = this._getMinMaxDate(inst, 'min');
+                       var maxDate = this._getMinMaxDate(inst, 'max');
+                       extendRemove(inst.settings, settings);
+                       // reformat the old minDate/maxDate values if dateFormat changes and a new minDate/maxDate isn't provided
+                       if (minDate !== null && settings['dateFormat'] !== undefined && settings['minDate'] === undefined)
+                               inst.settings.minDate = this._formatDate(inst, minDate);
+                       if (maxDate !== null && settings['dateFormat'] !== undefined && settings['maxDate'] === undefined)
+                               inst.settings.maxDate = this._formatDate(inst, maxDate);
+                       this._attachments($(target), inst);
+                       this._autoSize(inst);
+                       this._setDate(inst, date);
+                       this._updateAlternate(inst);
+                       this._updateDatepicker(inst);
+               }
+       },
+
+       // change method deprecated
+       _changeDatepicker: function(target, name, value) {
+               this._optionDatepicker(target, name, value);
+       },
+
+       /* Redraw the date picker attached to an input field or division.
+          @param  target  element - the target input field or division or span */
+       _refreshDatepicker: function(target) {
+               var inst = this._getInst(target);
+               if (inst) {
+                       this._updateDatepicker(inst);
+               }
+       },
+
+       /* Set the dates for a jQuery selection.
+          @param  target   element - the target input field or division or span
+          @param  date     Date - the new date */
+       _setDateDatepicker: function(target, date) {
+               var inst = this._getInst(target);
+               if (inst) {
+                       this._setDate(inst, date);
+                       this._updateDatepicker(inst);
+                       this._updateAlternate(inst);
+               }
+       },
+
+       /* Get the date(s) for the first entry in a jQuery selection.
+          @param  target     element - the target input field or division or span
+          @param  noDefault  boolean - true if no default date is to be used
+          @return Date - the current date */
+       _getDateDatepicker: function(target, noDefault) {
+               var inst = this._getInst(target);
+               if (inst && !inst.inline)
+                       this._setDateFromField(inst, noDefault);
+               return (inst ? this._getDate(inst) : null);
+       },
+
+       /* Handle keystrokes. */
+       _doKeyDown: function(event) {
+               var inst = $.datepicker._getInst(event.target);
+               var handled = true;
+               var isRTL = inst.dpDiv.is('.ui-datepicker-rtl');
+               inst._keyEvent = true;
+               if ($.datepicker._datepickerShowing)
+                       switch (event.keyCode) {
+                               case 9: $.datepicker._hideDatepicker();
+                                               handled = false;
+                                               break; // hide on tab out
+                               case 13: var sel = $('td.' + $.datepicker._dayOverClass + ':not(.' + 
+                                                                       $.datepicker._currentClass + ')', inst.dpDiv);
+                                               if (sel[0])
+                                                       $.datepicker._selectDay(event.target, inst.selectedMonth, inst.selectedYear, sel[0]);
+                                                       var onSelect = $.datepicker._get(inst, 'onSelect');
+                                                       if (onSelect) {
+                                                               var dateStr = $.datepicker._formatDate(inst);
+
+                                                               // trigger custom callback
+                                                               onSelect.apply((inst.input ? inst.input[0] : null), [dateStr, inst]);
+                                                       }
+                                               else
+                                                       $.datepicker._hideDatepicker();
+                                               return false; // don't submit the form
+                                               break; // select the value on enter
+                               case 27: $.datepicker._hideDatepicker();
+                                               break; // hide on escape
+                               case 33: $.datepicker._adjustDate(event.target, (event.ctrlKey ?
+                                                       -$.datepicker._get(inst, 'stepBigMonths') :
+                                                       -$.datepicker._get(inst, 'stepMonths')), 'M');
+                                               break; // previous month/year on page up/+ ctrl
+                               case 34: $.datepicker._adjustDate(event.target, (event.ctrlKey ?
+                                                       +$.datepicker._get(inst, 'stepBigMonths') :
+                                                       +$.datepicker._get(inst, 'stepMonths')), 'M');
+                                               break; // next month/year on page down/+ ctrl
+                               case 35: if (event.ctrlKey || event.metaKey) $.datepicker._clearDate(event.target);
+                                               handled = event.ctrlKey || event.metaKey;
+                                               break; // clear on ctrl or command +end
+                               case 36: if (event.ctrlKey || event.metaKey) $.datepicker._gotoToday(event.target);
+                                               handled = event.ctrlKey || event.metaKey;
+                                               break; // current on ctrl or command +home
+                               case 37: if (event.ctrlKey || event.metaKey) $.datepicker._adjustDate(event.target, (isRTL ? +1 : -1), 'D');
+                                               handled = event.ctrlKey || event.metaKey;
+                                               // -1 day on ctrl or command +left
+                                               if (event.originalEvent.altKey) $.datepicker._adjustDate(event.target, (event.ctrlKey ?
+                                                                       -$.datepicker._get(inst, 'stepBigMonths') :
+                                                                       -$.datepicker._get(inst, 'stepMonths')), 'M');
+                                               // next month/year on alt +left on Mac
+                                               break;
+                               case 38: if (event.ctrlKey || event.metaKey) $.datepicker._adjustDate(event.target, -7, 'D');
+                                               handled = event.ctrlKey || event.metaKey;
+                                               break; // -1 week on ctrl or command +up
+                               case 39: if (event.ctrlKey || event.metaKey) $.datepicker._adjustDate(event.target, (isRTL ? -1 : +1), 'D');
+                                               handled = event.ctrlKey || event.metaKey;
+                                               // +1 day on ctrl or command +right
+                                               if (event.originalEvent.altKey) $.datepicker._adjustDate(event.target, (event.ctrlKey ?
+                                                                       +$.datepicker._get(inst, 'stepBigMonths') :
+                                                                       +$.datepicker._get(inst, 'stepMonths')), 'M');
+                                               // next month/year on alt +right
+                                               break;
+                               case 40: if (event.ctrlKey || event.metaKey) $.datepicker._adjustDate(event.target, +7, 'D');
+                                               handled = event.ctrlKey || event.metaKey;
+                                               break; // +1 week on ctrl or command +down
+                               default: handled = false;
+                       }
+               else if (event.keyCode == 36 && event.ctrlKey) // display the date picker on ctrl+home
+                       $.datepicker._showDatepicker(this);
+               else {
+                       handled = false;
+               }
+               if (handled) {
+                       event.preventDefault();
+                       event.stopPropagation();
+               }
+       },
+
+       /* Filter entered characters - based on date format. */
+       _doKeyPress: function(event) {
+               var inst = $.datepicker._getInst(event.target);
+               if ($.datepicker._get(inst, 'constrainInput')) {
+                       var chars = $.datepicker._possibleChars($.datepicker._get(inst, 'dateFormat'));
+                       var chr = String.fromCharCode(event.charCode == undefined ? event.keyCode : event.charCode);
+                       return event.ctrlKey || event.metaKey || (chr < ' ' || !chars || chars.indexOf(chr) > -1);
+               }
+       },
+
+       /* Synchronise manual entry and field/alternate field. */
+       _doKeyUp: function(event) {
+               var inst = $.datepicker._getInst(event.target);
+               if (inst.input.val() != inst.lastVal) {
+                       try {
+                               var date = $.datepicker.parseDate($.datepicker._get(inst, 'dateFormat'),
+                                       (inst.input ? inst.input.val() : null),
+                                       $.datepicker._getFormatConfig(inst));
+                               if (date) { // only if valid
+                                       $.datepicker._setDateFromField(inst);
+                                       $.datepicker._updateAlternate(inst);
+                                       $.datepicker._updateDatepicker(inst);
+                               }
+                       }
+                       catch (err) {
+                               $.datepicker.log(err);
+                       }
+               }
+               return true;
+       },
+
+       /* Pop-up the date picker for a given input field.
+       If false returned from beforeShow event handler do not show. 
+          @param  input  element - the input field attached to the date picker or
+                         event - if triggered by focus */
+       _showDatepicker: function(input) {
+               input = input.target || input;
+               if (input.nodeName.toLowerCase() != 'input') // find from button/image trigger
+                       input = $('input', input.parentNode)[0];
+               if ($.datepicker._isDisabledDatepicker(input) || $.datepicker._lastInput == input) // already here
+                       return;
+               var inst = $.datepicker._getInst(input);
+               if ($.datepicker._curInst && $.datepicker._curInst != inst) {
+                       $.datepicker._curInst.dpDiv.stop(true, true);
+                       if ( inst && $.datepicker._datepickerShowing ) {
+                               $.datepicker._hideDatepicker( $.datepicker._curInst.input[0] );
+                       }
+               }
+               var beforeShow = $.datepicker._get(inst, 'beforeShow');
+               var beforeShowSettings = beforeShow ? beforeShow.apply(input, [input, inst]) : {};
+               if(beforeShowSettings === false){
+            //false
+                       return;
+               }
+               extendRemove(inst.settings, beforeShowSettings);
+               inst.lastVal = null;
+               $.datepicker._lastInput = input;
+               $.datepicker._setDateFromField(inst);
+               if ($.datepicker._inDialog) // hide cursor
+                       input.value = '';
+               if (!$.datepicker._pos) { // position below input
+                       $.datepicker._pos = $.datepicker._findPos(input);
+                       $.datepicker._pos[1] += input.offsetHeight; // add the height
+               }
+               var isFixed = false;
+               $(input).parents().each(function() {
+                       isFixed |= $(this).css('position') == 'fixed';
+                       return !isFixed;
+               });
+               if (isFixed && $.browser.opera) { // correction for Opera when fixed and scrolled
+                       $.datepicker._pos[0] -= document.documentElement.scrollLeft;
+                       $.datepicker._pos[1] -= document.documentElement.scrollTop;
+               }
+               var offset = {left: $.datepicker._pos[0], top: $.datepicker._pos[1]};
+               $.datepicker._pos = null;
+               //to avoid flashes on Firefox
+               inst.dpDiv.empty();
+               // determine sizing offscreen
+               inst.dpDiv.css({position: 'absolute', display: 'block', top: '-1000px'});
+               $.datepicker._updateDatepicker(inst);
+               // fix width for dynamic number of date pickers
+               // and adjust position before showing
+               offset = $.datepicker._checkOffset(inst, offset, isFixed);
+               inst.dpDiv.css({position: ($.datepicker._inDialog && $.blockUI ?
+                       'static' : (isFixed ? 'fixed' : 'absolute')), display: 'none',
+                       left: offset.left + 'px', top: offset.top + 'px'});
+               if (!inst.inline) {
+                       var showAnim = $.datepicker._get(inst, 'showAnim');
+                       var duration = $.datepicker._get(inst, 'duration');
+                       var postProcess = function() {
+                               var cover = inst.dpDiv.find('iframe.ui-datepicker-cover'); // IE6- only
+                               if( !! cover.length ){
+                                       var borders = $.datepicker._getBorders(inst.dpDiv);
+                                       cover.css({left: -borders[0], top: -borders[1],
+                                               width: inst.dpDiv.outerWidth(), height: inst.dpDiv.outerHeight()});
+                               }
+                       };
+                       inst.dpDiv.zIndex($(input).zIndex()+1);
+                       $.datepicker._datepickerShowing = true;
+                       if ($.effects && $.effects[showAnim])
+                               inst.dpDiv.show(showAnim, $.datepicker._get(inst, 'showOptions'), duration, postProcess);
+                       else
+                               inst.dpDiv[showAnim || 'show']((showAnim ? duration : null), postProcess);
+                       if (!showAnim || !duration)
+                               postProcess();
+                       if (inst.input.is(':visible') && !inst.input.is(':disabled'))
+                               inst.input.focus();
+                       $.datepicker._curInst = inst;
+               }
+       },
+
+       /* Generate the date picker content. */
+       _updateDatepicker: function(inst) {
+               var self = this;
+               self.maxRows = 4; //Reset the max number of rows being displayed (see #7043)
+               var borders = $.datepicker._getBorders(inst.dpDiv);
+               instActive = inst; // for delegate hover events
+               inst.dpDiv.empty().append(this._generateHTML(inst));
+               this._attachHandlers(inst);
+               var cover = inst.dpDiv.find('iframe.ui-datepicker-cover'); // IE6- only
+               if( !!cover.length ){ //avoid call to outerXXXX() when not in IE6
+                       cover.css({left: -borders[0], top: -borders[1], width: inst.dpDiv.outerWidth(), height: inst.dpDiv.outerHeight()})
+               }
+               inst.dpDiv.find('.' + this._dayOverClass + ' a').mouseover();
+               var numMonths = this._getNumberOfMonths(inst);
+               var cols = numMonths[1];
+               var width = 17;
+               inst.dpDiv.removeClass('ui-datepicker-multi-2 ui-datepicker-multi-3 ui-datepicker-multi-4').width('');
+               if (cols > 1)
+                       inst.dpDiv.addClass('ui-datepicker-multi-' + cols).css('width', (width * cols) + 'em');
+               inst.dpDiv[(numMonths[0] != 1 || numMonths[1] != 1 ? 'add' : 'remove') +
+                       'Class']('ui-datepicker-multi');
+               inst.dpDiv[(this._get(inst, 'isRTL') ? 'add' : 'remove') +
+                       'Class']('ui-datepicker-rtl');
+               if (inst == $.datepicker._curInst && $.datepicker._datepickerShowing && inst.input &&
+                               // #6694 - don't focus the input if it's already focused
+                               // this breaks the change event in IE
+                               inst.input.is(':visible') && !inst.input.is(':disabled') && inst.input[0] != document.activeElement)
+                       inst.input.focus();
+               // deffered render of the years select (to avoid flashes on Firefox) 
+               if( inst.yearshtml ){
+                       var origyearshtml = inst.yearshtml;
+                       setTimeout(function(){
+                               //assure that inst.yearshtml didn't change.
+                               if( origyearshtml === inst.yearshtml && inst.yearshtml ){
+                                       inst.dpDiv.find('select.ui-datepicker-year:first').replaceWith(inst.yearshtml);
+                               }
+                               origyearshtml = inst.yearshtml = null;
+                       }, 0);
+               }
+       },
+
+       /* Retrieve the size of left and top borders for an element.
+          @param  elem  (jQuery object) the element of interest
+          @return  (number[2]) the left and top borders */
+       _getBorders: function(elem) {
+               var convert = function(value) {
+                       return {thin: 1, medium: 2, thick: 3}[value] || value;
+               };
+               return [parseFloat(convert(elem.css('border-left-width'))),
+                       parseFloat(convert(elem.css('border-top-width')))];
+       },
+
+       /* Check positioning to remain on screen. */
+       _checkOffset: function(inst, offset, isFixed) {
+               var dpWidth = inst.dpDiv.outerWidth();
+               var dpHeight = inst.dpDiv.outerHeight();
+               var inputWidth = inst.input ? inst.input.outerWidth() : 0;
+               var inputHeight = inst.input ? inst.input.outerHeight() : 0;
+               var viewWidth = document.documentElement.clientWidth + (isFixed ? 0 : $(document).scrollLeft());
+               var viewHeight = document.documentElement.clientHeight + (isFixed ? 0 : $(document).scrollTop());
+
+               offset.left -= (this._get(inst, 'isRTL') ? (dpWidth - inputWidth) : 0);
+               offset.left -= (isFixed && offset.left == inst.input.offset().left) ? $(document).scrollLeft() : 0;
+               offset.top -= (isFixed && offset.top == (inst.input.offset().top + inputHeight)) ? $(document).scrollTop() : 0;
+
+               // now check if datepicker is showing outside window viewport - move to a better place if so.
+               offset.left -= Math.min(offset.left, (offset.left + dpWidth > viewWidth && viewWidth > dpWidth) ?
+                       Math.abs(offset.left + dpWidth - viewWidth) : 0);
+               offset.top -= Math.min(offset.top, (offset.top + dpHeight > viewHeight && viewHeight > dpHeight) ?
+                       Math.abs(dpHeight + inputHeight) : 0);
+
+               return offset;
+       },
+
+       /* Find an object's position on the screen. */
+       _findPos: function(obj) {
+               var inst = this._getInst(obj);
+               var isRTL = this._get(inst, 'isRTL');
+        while (obj && (obj.type == 'hidden' || obj.nodeType != 1 || $.expr.filters.hidden(obj))) {
+            obj = obj[isRTL ? 'previousSibling' : 'nextSibling'];
+        }
+        var position = $(obj).offset();
+           return [position.left, position.top];
+       },
+
+       /* Hide the date picker from view.
+          @param  input  element - the input field attached to the date picker */
+       _hideDatepicker: function(input) {
+               var inst = this._curInst;
+               if (!inst || (input && inst != $.data(input, PROP_NAME)))
+                       return;
+               if (this._datepickerShowing) {
+                       var showAnim = this._get(inst, 'showAnim');
+                       var duration = this._get(inst, 'duration');
+                       var postProcess = function() {
+                               $.datepicker._tidyDialog(inst);
+                       };
+                       if ($.effects && $.effects[showAnim])
+                               inst.dpDiv.hide(showAnim, $.datepicker._get(inst, 'showOptions'), duration, postProcess);
+                       else
+                               inst.dpDiv[(showAnim == 'slideDown' ? 'slideUp' :
+                                       (showAnim == 'fadeIn' ? 'fadeOut' : 'hide'))]((showAnim ? duration : null), postProcess);
+                       if (!showAnim)
+                               postProcess();
+                       this._datepickerShowing = false;
+                       var onClose = this._get(inst, 'onClose');
+                       if (onClose)
+                               onClose.apply((inst.input ? inst.input[0] : null),
+                                       [(inst.input ? inst.input.val() : ''), inst]);
+                       this._lastInput = null;
+                       if (this._inDialog) {
+                               this._dialogInput.css({ position: 'absolute', left: '0', top: '-100px' });
+                               if ($.blockUI) {
+                                       $.unblockUI();
+                                       $('body').append(this.dpDiv);
+                               }
+                       }
+                       this._inDialog = false;
+               }
+       },
+
+       /* Tidy up after a dialog display. */
+       _tidyDialog: function(inst) {
+               inst.dpDiv.removeClass(this._dialogClass).unbind('.ui-datepicker-calendar');
+       },
+
+       /* Close date picker if clicked elsewhere. */
+       _checkExternalClick: function(event) {
+               if (!$.datepicker._curInst)
+                       return;
+
+               var $target = $(event.target),
+                       inst = $.datepicker._getInst($target[0]);
+
+               if ( ( ( $target[0].id != $.datepicker._mainDivId &&
+                               $target.parents('#' + $.datepicker._mainDivId).length == 0 &&
+                               !$target.hasClass($.datepicker.markerClassName) &&
+                               !$target.closest("." + $.datepicker._triggerClass).length &&
+                               $.datepicker._datepickerShowing && !($.datepicker._inDialog && $.blockUI) ) ) ||
+                       ( $target.hasClass($.datepicker.markerClassName) && $.datepicker._curInst != inst ) )
+                       $.datepicker._hideDatepicker();
+       },
+
+       /* Adjust one of the date sub-fields. */
+       _adjustDate: function(id, offset, period) {
+               var target = $(id);
+               var inst = this._getInst(target[0]);
+               if (this._isDisabledDatepicker(target[0])) {
+                       return;
+               }
+               this._adjustInstDate(inst, offset +
+                       (period == 'M' ? this._get(inst, 'showCurrentAtPos') : 0), // undo positioning
+                       period);
+               this._updateDatepicker(inst);
+       },
+
+       /* Action for current link. */
+       _gotoToday: function(id) {
+               var target = $(id);
+               var inst = this._getInst(target[0]);
+               if (this._get(inst, 'gotoCurrent') && inst.currentDay) {
+                       inst.selectedDay = inst.currentDay;
+                       inst.drawMonth = inst.selectedMonth = inst.currentMonth;
+                       inst.drawYear = inst.selectedYear = inst.currentYear;
+               }
+               else {
+                       var date = new Date();
+                       inst.selectedDay = date.getDate();
+                       inst.drawMonth = inst.selectedMonth = date.getMonth();
+                       inst.drawYear = inst.selectedYear = date.getFullYear();
+               }
+               this._notifyChange(inst);
+               this._adjustDate(target);
+       },
+
+       /* Action for selecting a new month/year. */
+       _selectMonthYear: function(id, select, period) {
+               var target = $(id);
+               var inst = this._getInst(target[0]);
+               inst['selected' + (period == 'M' ? 'Month' : 'Year')] =
+               inst['draw' + (period == 'M' ? 'Month' : 'Year')] =
+                       parseInt(select.options[select.selectedIndex].value,10);
+               this._notifyChange(inst);
+               this._adjustDate(target);
+       },
+
+       /* Action for selecting a day. */
+       _selectDay: function(id, month, year, td) {
+               var target = $(id);
+               if ($(td).hasClass(this._unselectableClass) || this._isDisabledDatepicker(target[0])) {
+                       return;
+               }
+               var inst = this._getInst(target[0]);
+               inst.selectedDay = inst.currentDay = $('a', td).html();
+               inst.selectedMonth = inst.currentMonth = month;
+               inst.selectedYear = inst.currentYear = year;
+               this._selectDate(id, this._formatDate(inst,
+                       inst.currentDay, inst.currentMonth, inst.currentYear));
+       },
+
+       /* Erase the input field and hide the date picker. */
+       _clearDate: function(id) {
+               var target = $(id);
+               var inst = this._getInst(target[0]);
+               this._selectDate(target, '');
+       },
+
+       /* Update the input field with the selected date. */
+       _selectDate: function(id, dateStr) {
+               var target = $(id);
+               var inst = this._getInst(target[0]);
+               dateStr = (dateStr != null ? dateStr : this._formatDate(inst));
+               if (inst.input)
+                       inst.input.val(dateStr);
+               this._updateAlternate(inst);
+               var onSelect = this._get(inst, 'onSelect');
+               if (onSelect)
+                       onSelect.apply((inst.input ? inst.input[0] : null), [dateStr, inst]);  // trigger custom callback
+               else if (inst.input)
+                       inst.input.trigger('change'); // fire the change event
+               if (inst.inline)
+                       this._updateDatepicker(inst);
+               else {
+                       this._hideDatepicker();
+                       this._lastInput = inst.input[0];
+                       if (typeof(inst.input[0]) != 'object')
+                               inst.input.focus(); // restore focus
+                       this._lastInput = null;
+               }
+       },
+
+       /* Update any alternate field to synchronise with the main field. */
+       _updateAlternate: function(inst) {
+               var altField = this._get(inst, 'altField');
+               if (altField) { // update alternate field too
+                       var altFormat = this._get(inst, 'altFormat') || this._get(inst, 'dateFormat');
+                       var date = this._getDate(inst);
+                       var dateStr = this.formatDate(altFormat, date, this._getFormatConfig(inst));
+                       $(altField).each(function() { $(this).val(dateStr); });
+               }
+       },
+
+       /* Set as beforeShowDay function to prevent selection of weekends.
+          @param  date  Date - the date to customise
+          @return [boolean, string] - is this date selectable?, what is its CSS class? */
+       noWeekends: function(date) {
+               var day = date.getDay();
+               return [(day > 0 && day < 6), ''];
+       },
+
+       /* Set as calculateWeek to determine the week of the year based on the ISO 8601 definition.
+          @param  date  Date - the date to get the week for
+          @return  number - the number of the week within the year that contains this date */
+       iso8601Week: function(date) {
+               var checkDate = new Date(date.getTime());
+               // Find Thursday of this week starting on Monday
+               checkDate.setDate(checkDate.getDate() + 4 - (checkDate.getDay() || 7));
+               var time = checkDate.getTime();
+               checkDate.setMonth(0); // Compare with Jan 1
+               checkDate.setDate(1);
+               return Math.floor(Math.round((time - checkDate) / 86400000) / 7) + 1;
+       },
+
+       /* Parse a string value into a date object.
+          See formatDate below for the possible formats.
+
+          @param  format    string - the expected format of the date
+          @param  value     string - the date in the above format
+          @param  settings  Object - attributes include:
+                            shortYearCutoff  number - the cutoff year for determining the century (optional)
+                            dayNamesShort    string[7] - abbreviated names of the days from Sunday (optional)
+                            dayNames         string[7] - names of the days from Sunday (optional)
+                            monthNamesShort  string[12] - abbreviated names of the months (optional)
+                            monthNames       string[12] - names of the months (optional)
+          @return  Date - the extracted date value or null if value is blank */
+       parseDate: function (format, value, settings) {
+               if (format == null || value == null)
+                       throw 'Invalid arguments';
+               value = (typeof value == 'object' ? value.toString() : value + '');
+               if (value == '')
+                       return null;
+               var shortYearCutoff = (settings ? settings.shortYearCutoff : null) || this._defaults.shortYearCutoff;
+               shortYearCutoff = (typeof shortYearCutoff != 'string' ? shortYearCutoff :
+                               new Date().getFullYear() % 100 + parseInt(shortYearCutoff, 10));
+               var dayNamesShort = (settings ? settings.dayNamesShort : null) || this._defaults.dayNamesShort;
+               var dayNames = (settings ? settings.dayNames : null) || this._defaults.dayNames;
+               var monthNamesShort = (settings ? settings.monthNamesShort : null) || this._defaults.monthNamesShort;
+               var monthNames = (settings ? settings.monthNames : null) || this._defaults.monthNames;
+               var year = -1;
+               var month = -1;
+               var day = -1;
+               var doy = -1;
+               var literal = false;
+               // Check whether a format character is doubled
+               var lookAhead = function(match) {
+                       var matches = (iFormat + 1 < format.length && format.charAt(iFormat + 1) == match);
+                       if (matches)
+                               iFormat++;
+                       return matches;
+               };
+               // Extract a number from the string value
+               var getNumber = function(match) {
+                       var isDoubled = lookAhead(match);
+                       var size = (match == '@' ? 14 : (match == '!' ? 20 :
+                               (match == 'y' && isDoubled ? 4 : (match == 'o' ? 3 : 2))));
+                       var digits = new RegExp('^\\d{1,' + size + '}');
+                       var num = value.substring(iValue).match(digits);
+                       if (!num)
+                               throw 'Missing number at position ' + iValue;
+                       iValue += num[0].length;
+                       return parseInt(num[0], 10);
+               };
+               // Extract a name from the string value and convert to an index
+               var getName = function(match, shortNames, longNames) {
+                       var names = $.map(lookAhead(match) ? longNames : shortNames, function (v, k) {
+                               return [ [k, v] ];
+                       }).sort(function (a, b) {
+                               return -(a[1].length - b[1].length);
+                       });
+                       var index = -1;
+                       $.each(names, function (i, pair) {
+                               var name = pair[1];
+                               if (value.substr(iValue, name.length).toLowerCase() == name.toLowerCase()) {
+                                       index = pair[0];
+                                       iValue += name.length;
+                                       return false;
+                               }
+                       });
+                       if (index != -1)
+                               return index + 1;
+                       else
+                               throw 'Unknown name at position ' + iValue;
+               };
+               // Confirm that a literal character matches the string value
+               var checkLiteral = function() {
+                       if (value.charAt(iValue) != format.charAt(iFormat))
+                               throw 'Unexpected literal at position ' + iValue;
+                       iValue++;
+               };
+               var iValue = 0;
+               for (var iFormat = 0; iFormat < format.length; iFormat++) {
+                       if (literal)
+                               if (format.charAt(iFormat) == "'" && !lookAhead("'"))
+                                       literal = false;
+                               else
+                                       checkLiteral();
+                       else
+                               switch (format.charAt(iFormat)) {
+                                       case 'd':
+                                               day = getNumber('d');
+                                               break;
+                                       case 'D':
+                                               getName('D', dayNamesShort, dayNames);
+                                               break;
+                                       case 'o':
+                                               doy = getNumber('o');
+                                               break;
+                                       case 'm':
+                                               month = getNumber('m');
+                                               break;
+                                       case 'M':
+                                               month = getName('M', monthNamesShort, monthNames);
+                                               break;
+                                       case 'y':
+                                               year = getNumber('y');
+                                               break;
+                                       case '@':
+                                               var date = new Date(getNumber('@'));
+                                               year = date.getFullYear();
+                                               month = date.getMonth() + 1;
+                                               day = date.getDate();
+                                               break;
+                                       case '!':
+                                               var date = new Date((getNumber('!') - this._ticksTo1970) / 10000);
+                                               year = date.getFullYear();
+                                               month = date.getMonth() + 1;
+                                               day = date.getDate();
+                                               break;
+                                       case "'":
+                                               if (lookAhead("'"))
+                                                       checkLiteral();
+                                               else
+                                                       literal = true;
+                                               break;
+                                       default:
+                                               checkLiteral();
+                               }
+               }
+               if (iValue < value.length){
+                       throw "Extra/unparsed characters found in date: " + value.substring(iValue);
+               }
+               if (year == -1)
+                       year = new Date().getFullYear();
+               else if (year < 100)
+                       year += new Date().getFullYear() - new Date().getFullYear() % 100 +
+                               (year <= shortYearCutoff ? 0 : -100);
+               if (doy > -1) {
+                       month = 1;
+                       day = doy;
+                       do {
+                               var dim = this._getDaysInMonth(year, month - 1);
+                               if (day <= dim)
+                                       break;
+                               month++;
+                               day -= dim;
+                       } while (true);
+               }
+               var date = this._daylightSavingAdjust(new Date(year, month - 1, day));
+               if (date.getFullYear() != year || date.getMonth() + 1 != month || date.getDate() != day)
+                       throw 'Invalid date'; // E.g. 31/02/00
+               return date;
+       },
+
+       /* Standard date formats. */
+       ATOM: 'yy-mm-dd', // RFC 3339 (ISO 8601)
+       COOKIE: 'D, dd M yy',
+       ISO_8601: 'yy-mm-dd',
+       RFC_822: 'D, d M y',
+       RFC_850: 'DD, dd-M-y',
+       RFC_1036: 'D, d M y',
+       RFC_1123: 'D, d M yy',
+       RFC_2822: 'D, d M yy',
+       RSS: 'D, d M y', // RFC 822
+       TICKS: '!',
+       TIMESTAMP: '@',
+       W3C: 'yy-mm-dd', // ISO 8601
+
+       _ticksTo1970: (((1970 - 1) * 365 + Math.floor(1970 / 4) - Math.floor(1970 / 100) +
+               Math.floor(1970 / 400)) * 24 * 60 * 60 * 10000000),
+
+       /* Format a date object into a string value.
+          The format can be combinations of the following:
+          d  - day of month (no leading zero)
+          dd - day of month (two digit)
+          o  - day of year (no leading zeros)
+          oo - day of year (three digit)
+          D  - day name short
+          DD - day name long
+          m  - month of year (no leading zero)
+          mm - month of year (two digit)
+          M  - month name short
+          MM - month name long
+          y  - year (two digit)
+          yy - year (four digit)
+          @ - Unix timestamp (ms since 01/01/1970)
+          ! - Windows ticks (100ns since 01/01/0001)
+          '...' - literal text
+          '' - single quote
+
+          @param  format    string - the desired format of the date
+          @param  date      Date - the date value to format
+          @param  settings  Object - attributes include:
+                            dayNamesShort    string[7] - abbreviated names of the days from Sunday (optional)
+                            dayNames         string[7] - names of the days from Sunday (optional)
+                            monthNamesShort  string[12] - abbreviated names of the months (optional)
+                            monthNames       string[12] - names of the months (optional)
+          @return  string - the date in the above format */
+       formatDate: function (format, date, settings) {
+               if (!date)
+                       return '';
+               var dayNamesShort = (settings ? settings.dayNamesShort : null) || this._defaults.dayNamesShort;
+               var dayNames = (settings ? settings.dayNames : null) || this._defaults.dayNames;
+               var monthNamesShort = (settings ? settings.monthNamesShort : null) || this._defaults.monthNamesShort;
+               var monthNames = (settings ? settings.monthNames : null) || this._defaults.monthNames;
+               // Check whether a format character is doubled
+               var lookAhead = function(match) {
+                       var matches = (iFormat + 1 < format.length && format.charAt(iFormat + 1) == match);
+                       if (matches)
+                               iFormat++;
+                       return matches;
+               };
+               // Format a number, with leading zero if necessary
+               var formatNumber = function(match, value, len) {
+                       var num = '' + value;
+                       if (lookAhead(match))
+                               while (num.length < len)
+                                       num = '0' + num;
+                       return num;
+               };
+               // Format a name, short or long as requested
+               var formatName = function(match, value, shortNames, longNames) {
+                       return (lookAhead(match) ? longNames[value] : shortNames[value]);
+               };
+               var output = '';
+               var literal = false;
+               if (date)
+                       for (var iFormat = 0; iFormat < format.length; iFormat++) {
+                               if (literal)
+                                       if (format.charAt(iFormat) == "'" && !lookAhead("'"))
+                                               literal = false;
+                                       else
+                                               output += format.charAt(iFormat);
+                               else
+                                       switch (format.charAt(iFormat)) {
+                                               case 'd':
+                                                       output += formatNumber('d', date.getDate(), 2);
+                                                       break;
+                                               case 'D':
+                                                       output += formatName('D', date.getDay(), dayNamesShort, dayNames);
+                                                       break;
+                                               case 'o':
+                                                       output += formatNumber('o',
+                                                               Math.round((new Date(date.getFullYear(), date.getMonth(), date.getDate()).getTime() - new Date(date.getFullYear(), 0, 0).getTime()) / 86400000), 3);
+                                                       break;
+                                               case 'm':
+                                                       output += formatNumber('m', date.getMonth() + 1, 2);
+                                                       break;
+                                               case 'M':
+                                                       output += formatName('M', date.getMonth(), monthNamesShort, monthNames);
+                                                       break;
+                                               case 'y':
+                                                       output += (lookAhead('y') ? date.getFullYear() :
+                                                               (date.getYear() % 100 < 10 ? '0' : '') + date.getYear() % 100);
+                                                       break;
+                                               case '@':
+                                                       output += date.getTime();
+                                                       break;
+                                               case '!':
+                                                       output += date.getTime() * 10000 + this._ticksTo1970;
+                                                       break;
+                                               case "'":
+                                                       if (lookAhead("'"))
+                                                               output += "'";
+                                                       else
+                                                               literal = true;
+                                                       break;
+                                               default:
+                                                       output += format.charAt(iFormat);
+                                       }
+                       }
+               return output;
+       },
+
+       /* Extract all possible characters from the date format. */
+       _possibleChars: function (format) {
+               var chars = '';
+               var literal = false;
+               // Check whether a format character is doubled
+               var lookAhead = function(match) {
+                       var matches = (iFormat + 1 < format.length && format.charAt(iFormat + 1) == match);
+                       if (matches)
+                               iFormat++;
+                       return matches;
+               };
+               for (var iFormat = 0; iFormat < format.length; iFormat++)
+                       if (literal)
+                               if (format.charAt(iFormat) == "'" && !lookAhead("'"))
+                                       literal = false;
+                               else
+                                       chars += format.charAt(iFormat);
+                       else
+                               switch (format.charAt(iFormat)) {
+                                       case 'd': case 'm': case 'y': case '@':
+                                               chars += '0123456789';
+                                               break;
+                                       case 'D': case 'M':
+                                               return null; // Accept anything
+                                       case "'":
+                                               if (lookAhead("'"))
+                                                       chars += "'";
+                                               else
+                                                       literal = true;
+                                               break;
+                                       default:
+                                               chars += format.charAt(iFormat);
+                               }
+               return chars;
+       },
+
+       /* Get a setting value, defaulting if necessary. */
+       _get: function(inst, name) {
+               return inst.settings[name] !== undefined ?
+                       inst.settings[name] : this._defaults[name];
+       },
+
+       /* Parse existing date and initialise date picker. */
+       _setDateFromField: function(inst, noDefault) {
+               if (inst.input.val() == inst.lastVal) {
+                       return;
+               }
+               var dateFormat = this._get(inst, 'dateFormat');
+               var dates = inst.lastVal = inst.input ? inst.input.val() : null;
+               var date, defaultDate;
+               date = defaultDate = this._getDefaultDate(inst);
+               var settings = this._getFormatConfig(inst);
+               try {
+                       date = this.parseDate(dateFormat, dates, settings) || defaultDate;
+               } catch (event) {
+                       this.log(event);
+                       dates = (noDefault ? '' : dates);
+               }
+               inst.selectedDay = date.getDate();
+               inst.drawMonth = inst.selectedMonth = date.getMonth();
+               inst.drawYear = inst.selectedYear = date.getFullYear();
+               inst.currentDay = (dates ? date.getDate() : 0);
+               inst.currentMonth = (dates ? date.getMonth() : 0);
+               inst.currentYear = (dates ? date.getFullYear() : 0);
+               this._adjustInstDate(inst);
+       },
+
+       /* Retrieve the default date shown on opening. */
+       _getDefaultDate: function(inst) {
+               return this._restrictMinMax(inst,
+                       this._determineDate(inst, this._get(inst, 'defaultDate'), new Date()));
+       },
+
+       /* A date may be specified as an exact value or a relative one. */
+       _determineDate: function(inst, date, defaultDate) {
+               var offsetNumeric = function(offset) {
+                       var date = new Date();
+                       date.setDate(date.getDate() + offset);
+                       return date;
+               };
+               var offsetString = function(offset) {
+                       try {
+                               return $.datepicker.parseDate($.datepicker._get(inst, 'dateFormat'),
+                                       offset, $.datepicker._getFormatConfig(inst));
+                       }
+                       catch (e) {
+                               // Ignore
+                       }
+                       var date = (offset.toLowerCase().match(/^c/) ?
+                               $.datepicker._getDate(inst) : null) || new Date();
+                       var year = date.getFullYear();
+                       var month = date.getMonth();
+                       var day = date.getDate();
+                       var pattern = /([+-]?[0-9]+)\s*(d|D|w|W|m|M|y|Y)?/g;
+                       var matches = pattern.exec(offset);
+                       while (matches) {
+                               switch (matches[2] || 'd') {
+                                       case 'd' : case 'D' :
+                                               day += parseInt(matches[1],10); break;
+                                       case 'w' : case 'W' :
+                                               day += parseInt(matches[1],10) * 7; break;
+                                       case 'm' : case 'M' :
+                                               month += parseInt(matches[1],10);
+                                               day = Math.min(day, $.datepicker._getDaysInMonth(year, month));
+                                               break;
+                                       case 'y': case 'Y' :
+                                               year += parseInt(matches[1],10);
+                                               day = Math.min(day, $.datepicker._getDaysInMonth(year, month));
+                                               break;
+                               }
+                               matches = pattern.exec(offset);
+                       }
+                       return new Date(year, month, day);
+               };
+               var newDate = (date == null || date === '' ? defaultDate : (typeof date == 'string' ? offsetString(date) :
+                       (typeof date == 'number' ? (isNaN(date) ? defaultDate : offsetNumeric(date)) : new Date(date.getTime()))));
+               newDate = (newDate && newDate.toString() == 'Invalid Date' ? defaultDate : newDate);
+               if (newDate) {
+                       newDate.setHours(0);
+                       newDate.setMinutes(0);
+                       newDate.setSeconds(0);
+                       newDate.setMilliseconds(0);
+               }
+               return this._daylightSavingAdjust(newDate);
+       },
+
+       /* Handle switch to/from daylight saving.
+          Hours may be non-zero on daylight saving cut-over:
+          > 12 when midnight changeover, but then cannot generate
+          midnight datetime, so jump to 1AM, otherwise reset.
+          @param  date  (Date) the date to check
+          @return  (Date) the corrected date */
+       _daylightSavingAdjust: function(date) {
+               if (!date) return null;
+               date.setHours(date.getHours() > 12 ? date.getHours() + 2 : 0);
+               return date;
+       },
+
+       /* Set the date(s) directly. */
+       _setDate: function(inst, date, noChange) {
+               var clear = !date;
+               var origMonth = inst.selectedMonth;
+               var origYear = inst.selectedYear;
+               var newDate = this._restrictMinMax(inst, this._determineDate(inst, date, new Date()));
+               inst.selectedDay = inst.currentDay = newDate.getDate();
+               inst.drawMonth = inst.selectedMonth = inst.currentMonth = newDate.getMonth();
+               inst.drawYear = inst.selectedYear = inst.currentYear = newDate.getFullYear();
+               if ((origMonth != inst.selectedMonth || origYear != inst.selectedYear) && !noChange)
+                       this._notifyChange(inst);
+               this._adjustInstDate(inst);
+               if (inst.input) {
+                       inst.input.val(clear ? '' : this._formatDate(inst));
+               }
+       },
+
+       /* Retrieve the date(s) directly. */
+       _getDate: function(inst) {
+               var startDate = (!inst.currentYear || (inst.input && inst.input.val() == '') ? null :
+                       this._daylightSavingAdjust(new Date(
+                       inst.currentYear, inst.currentMonth, inst.currentDay)));
+                       return startDate;
+       },
+
+       /* Attach the onxxx handlers.  These are declared statically so
+        * they work with static code transformers like Caja.
+        */
+       _attachHandlers: function(inst) {
+               var stepMonths = this._get(inst, 'stepMonths');
+               var id = '#' + inst.id.replace( /\\\\/g, "\\" );
+               inst.dpDiv.find('[data-handler]').map(function () {
+                       var handler = {
+                               prev: function () {
+                                       window['DP_jQuery_' + dpuuid].datepicker._adjustDate(id, -stepMonths, 'M');
+                               },
+                               next: function () {
+                                       window['DP_jQuery_' + dpuuid].datepicker._adjustDate(id, +stepMonths, 'M');
+                               },
+                               hide: function () {
+                                       window['DP_jQuery_' + dpuuid].datepicker._hideDatepicker();
+                               },
+                               today: function () {
+                                       window['DP_jQuery_' + dpuuid].datepicker._gotoToday(id);
+                               },
+                               selectDay: function () {
+                                       window['DP_jQuery_' + dpuuid].datepicker._selectDay(id, +this.getAttribute('data-month'), +this.getAttribute('data-year'), this);
+                                       return false;
+                               },
+                               selectMonth: function () {
+                                       window['DP_jQuery_' + dpuuid].datepicker._selectMonthYear(id, this, 'M');
+                                       return false;
+                               },
+                               selectYear: function () {
+                                       window['DP_jQuery_' + dpuuid].datepicker._selectMonthYear(id, this, 'Y');
+                                       return false;
+                               }
+                       };
+                       $(this).bind(this.getAttribute('data-event'), handler[this.getAttribute('data-handler')]);
+               });
+       },
+       
+       /* Generate the HTML for the current state of the date picker. */
+       _generateHTML: function(inst) {
+               var today = new Date();
+               today = this._daylightSavingAdjust(
+                       new Date(today.getFullYear(), today.getMonth(), today.getDate())); // clear time
+               var isRTL = this._get(inst, 'isRTL');
+               var showButtonPanel = this._get(inst, 'showButtonPanel');
+               var hideIfNoPrevNext = this._get(inst, 'hideIfNoPrevNext');
+               var navigationAsDateFormat = this._get(inst, 'navigationAsDateFormat');
+               var numMonths = this._getNumberOfMonths(inst);
+               var showCurrentAtPos = this._get(inst, 'showCurrentAtPos');
+               var stepMonths = this._get(inst, 'stepMonths');
+               var isMultiMonth = (numMonths[0] != 1 || numMonths[1] != 1);
+               var currentDate = this._daylightSavingAdjust((!inst.currentDay ? new Date(9999, 9, 9) :
+                       new Date(inst.currentYear, inst.currentMonth, inst.currentDay)));
+               var minDate = this._getMinMaxDate(inst, 'min');
+               var maxDate = this._getMinMaxDate(inst, 'max');
+               var drawMonth = inst.drawMonth - showCurrentAtPos;
+               var drawYear = inst.drawYear;
+               if (drawMonth < 0) {
+                       drawMonth += 12;
+                       drawYear--;
+               }
+               if (maxDate) {
+                       var maxDraw = this._daylightSavingAdjust(new Date(maxDate.getFullYear(),
+                               maxDate.getMonth() - (numMonths[0] * numMonths[1]) + 1, maxDate.getDate()));
+                       maxDraw = (minDate && maxDraw < minDate ? minDate : maxDraw);
+                       while (this._daylightSavingAdjust(new Date(drawYear, drawMonth, 1)) > maxDraw) {
+                               drawMonth--;
+                               if (drawMonth < 0) {
+                                       drawMonth = 11;
+                                       drawYear--;
+                               }
+                       }
+               }
+               inst.drawMonth = drawMonth;
+               inst.drawYear = drawYear;
+               var prevText = this._get(inst, 'prevText');
+               prevText = (!navigationAsDateFormat ? prevText : this.formatDate(prevText,
+                       this._daylightSavingAdjust(new Date(drawYear, drawMonth - stepMonths, 1)),
+                       this._getFormatConfig(inst)));
+               var prev = (this._canAdjustMonth(inst, -1, drawYear, drawMonth) ?
+                       '<a class="ui-datepicker-prev ui-corner-all" data-handler="prev" data-event="click"' +
+                       ' title="' + prevText + '"><span class="ui-icon ui-icon-circle-triangle-' + ( isRTL ? 'e' : 'w') + '">' + prevText + '</span></a>' :
+                       (hideIfNoPrevNext ? '' : '<a class="ui-datepicker-prev ui-corner-all ui-state-disabled" title="'+ prevText +'"><span class="ui-icon ui-icon-circle-triangle-' + ( isRTL ? 'e' : 'w') + '">' + prevText + '</span></a>'));
+               var nextText = this._get(inst, 'nextText');
+               nextText = (!navigationAsDateFormat ? nextText : this.formatDate(nextText,
+                       this._daylightSavingAdjust(new Date(drawYear, drawMonth + stepMonths, 1)),
+                       this._getFormatConfig(inst)));
+               var next = (this._canAdjustMonth(inst, +1, drawYear, drawMonth) ?
+                       '<a class="ui-datepicker-next ui-corner-all" data-handler="next" data-event="click"' +
+                       ' title="' + nextText + '"><span class="ui-icon ui-icon-circle-triangle-' + ( isRTL ? 'w' : 'e') + '">' + nextText + '</span></a>' :
+                       (hideIfNoPrevNext ? '' : '<a class="ui-datepicker-next ui-corner-all ui-state-disabled" title="'+ nextText + '"><span class="ui-icon ui-icon-circle-triangle-' + ( isRTL ? 'w' : 'e') + '">' + nextText + '</span></a>'));
+               var currentText = this._get(inst, 'currentText');
+               var gotoDate = (this._get(inst, 'gotoCurrent') && inst.currentDay ? currentDate : today);
+               currentText = (!navigationAsDateFormat ? currentText :
+                       this.formatDate(currentText, gotoDate, this._getFormatConfig(inst)));
+               var controls = (!inst.inline ? '<button type="button" class="ui-datepicker-close ui-state-default ui-priority-primary ui-corner-all" data-handler="hide" data-event="click">' +
+                       this._get(inst, 'closeText') + '</button>' : '');
+               var buttonPanel = (showButtonPanel) ? '<div class="ui-datepicker-buttonpane ui-widget-content">' + (isRTL ? controls : '') +
+                       (this._isInRange(inst, gotoDate) ? '<button type="button" class="ui-datepicker-current ui-state-default ui-priority-secondary ui-corner-all" data-handler="today" data-event="click"' +
+                       '>' + currentText + '</button>' : '') + (isRTL ? '' : controls) + '</div>' : '';
+               var firstDay = parseInt(this._get(inst, 'firstDay'),10);
+               firstDay = (isNaN(firstDay) ? 0 : firstDay);
+               var showWeek = this._get(inst, 'showWeek');
+               var dayNames = this._get(inst, 'dayNames');
+               var dayNamesShort = this._get(inst, 'dayNamesShort');
+               var dayNamesMin = this._get(inst, 'dayNamesMin');
+               var monthNames = this._get(inst, 'monthNames');
+               var monthNamesShort = this._get(inst, 'monthNamesShort');
+               var beforeShowDay = this._get(inst, 'beforeShowDay');
+               var showOtherMonths = this._get(inst, 'showOtherMonths');
+               var selectOtherMonths = this._get(inst, 'selectOtherMonths');
+               var calculateWeek = this._get(inst, 'calculateWeek') || this.iso8601Week;
+               var defaultDate = this._getDefaultDate(inst);
+               var html = '';
+               for (var row = 0; row < numMonths[0]; row++) {
+                       var group = '';
+                       this.maxRows = 4;
+                       for (var col = 0; col < numMonths[1]; col++) {
+                               var selectedDate = this._daylightSavingAdjust(new Date(drawYear, drawMonth, inst.selectedDay));
+                               var cornerClass = ' ui-corner-all';
+                               var calender = '';
+                               if (isMultiMonth) {
+                                       calender += '<div class="ui-datepicker-group';
+                                       if (numMonths[1] > 1)
+                                               switch (col) {
+                                                       case 0: calender += ' ui-datepicker-group-first';
+                                                               cornerClass = ' ui-corner-' + (isRTL ? 'right' : 'left'); break;
+                                                       case numMonths[1]-1: calender += ' ui-datepicker-group-last';
+                                                               cornerClass = ' ui-corner-' + (isRTL ? 'left' : 'right'); break;
+                                                       default: calender += ' ui-datepicker-group-middle'; cornerClass = ''; break;
+                                               }
+                                       calender += '">';
+                               }
+                               calender += '<div class="ui-datepicker-header ui-widget-header ui-helper-clearfix' + cornerClass + '">' +
+                                       (/all|left/.test(cornerClass) && row == 0 ? (isRTL ? next : prev) : '') +
+                                       (/all|right/.test(cornerClass) && row == 0 ? (isRTL ? prev : next) : '') +
+                                       this._generateMonthYearHeader(inst, drawMonth, drawYear, minDate, maxDate,
+                                       row > 0 || col > 0, monthNames, monthNamesShort) + // draw month headers
+                                       '</div><table class="ui-datepicker-calendar"><thead>' +
+                                       '<tr>';
+                               var thead = (showWeek ? '<th class="ui-datepicker-week-col">' + this._get(inst, 'weekHeader') + '</th>' : '');
+                               for (var dow = 0; dow < 7; dow++) { // days of the week
+                                       var day = (dow + firstDay) % 7;
+                                       thead += '<th' + ((dow + firstDay + 6) % 7 >= 5 ? ' class="ui-datepicker-week-end"' : '') + '>' +
+                                               '<span title="' + dayNames[day] + '">' + dayNamesMin[day] + '</span></th>';
+                               }
+                               calender += thead + '</tr></thead><tbody>';
+                               var daysInMonth = this._getDaysInMonth(drawYear, drawMonth);
+                               if (drawYear == inst.selectedYear && drawMonth == inst.selectedMonth)
+                                       inst.selectedDay = Math.min(inst.selectedDay, daysInMonth);
+                               var leadDays = (this._getFirstDayOfMonth(drawYear, drawMonth) - firstDay + 7) % 7;
+                               var curRows = Math.ceil((leadDays + daysInMonth) / 7); // calculate the number of rows to generate
+                               var numRows = (isMultiMonth ? this.maxRows > curRows ? this.maxRows : curRows : curRows); //If multiple months, use the higher number of rows (see #7043)
+                               this.maxRows = numRows;
+                               var printDate = this._daylightSavingAdjust(new Date(drawYear, drawMonth, 1 - leadDays));
+                               for (var dRow = 0; dRow < numRows; dRow++) { // create date picker rows
+                                       calender += '<tr>';
+                                       var tbody = (!showWeek ? '' : '<td class="ui-datepicker-week-col">' +
+                                               this._get(inst, 'calculateWeek')(printDate) + '</td>');
+                                       for (var dow = 0; dow < 7; dow++) { // create date picker days
+                                               var daySettings = (beforeShowDay ?
+                                                       beforeShowDay.apply((inst.input ? inst.input[0] : null), [printDate]) : [true, '']);
+                                               var otherMonth = (printDate.getMonth() != drawMonth);
+                                               var unselectable = (otherMonth && !selectOtherMonths) || !daySettings[0] ||
+                                                       (minDate && printDate < minDate) || (maxDate && printDate > maxDate);
+                                               tbody += '<td class="' +
+                                                       ((dow + firstDay + 6) % 7 >= 5 ? ' ui-datepicker-week-end' : '') + // highlight weekends
+                                                       (otherMonth ? ' ui-datepicker-other-month' : '') + // highlight days from other months
+                                                       ((printDate.getTime() == selectedDate.getTime() && drawMonth == inst.selectedMonth && inst._keyEvent) || // user pressed key
+                                                       (defaultDate.getTime() == printDate.getTime() && defaultDate.getTime() == selectedDate.getTime()) ?
+                                                       // or defaultDate is current printedDate and defaultDate is selectedDate
+                                                       ' ' + this._dayOverClass : '') + // highlight selected day
+                                                       (unselectable ? ' ' + this._unselectableClass + ' ui-state-disabled': '') +  // highlight unselectable days
+                                                       (otherMonth && !showOtherMonths ? '' : ' ' + daySettings[1] + // highlight custom dates
+                                                       (printDate.getTime() == currentDate.getTime() ? ' ' + this._currentClass : '') + // highlight selected day
+                                                       (printDate.getTime() == today.getTime() ? ' ui-datepicker-today' : '')) + '"' + // highlight today (if different)
+                                                       ((!otherMonth || showOtherMonths) && daySettings[2] ? ' title="' + daySettings[2] + '"' : '') + // cell title
+                                                       (unselectable ? '' : ' data-handler="selectDay" data-event="click" data-month="' + printDate.getMonth() + '" data-year="' + printDate.getFullYear() + '"') + '>' + // actions
+                                                       (otherMonth && !showOtherMonths ? '&#xa0;' : // display for other months
+                                                       (unselectable ? '<span class="ui-state-default">' + printDate.getDate() + '</span>' : '<a class="ui-state-default' +
+                                                       (printDate.getTime() == today.getTime() ? ' ui-state-highlight' : '') +
+                                                       (printDate.getTime() == currentDate.getTime() ? ' ui-state-active' : '') + // highlight selected day
+                                                       (otherMonth ? ' ui-priority-secondary' : '') + // distinguish dates from other months
+                                                       '" href="#">' + printDate.getDate() + '</a>')) + '</td>'; // display selectable date
+                                               printDate.setDate(printDate.getDate() + 1);
+                                               printDate = this._daylightSavingAdjust(printDate);
+                                       }
+                                       calender += tbody + '</tr>';
+                               }
+                               drawMonth++;
+                               if (drawMonth > 11) {
+                                       drawMonth = 0;
+                                       drawYear++;
+                               }
+                               calender += '</tbody></table>' + (isMultiMonth ? '</div>' + 
+                                                       ((numMonths[0] > 0 && col == numMonths[1]-1) ? '<div class="ui-datepicker-row-break"></div>' : '') : '');
+                               group += calender;
+                       }
+                       html += group;
+               }
+               html += buttonPanel + ($.browser.msie && parseInt($.browser.version,10) < 7 && !inst.inline ?
+                       '<iframe src="javascript:false;" class="ui-datepicker-cover" frameborder="0"></iframe>' : '');
+               inst._keyEvent = false;
+               return html;
+       },
+
+       /* Generate the month and year header. */
+       _generateMonthYearHeader: function(inst, drawMonth, drawYear, minDate, maxDate,
+                       secondary, monthNames, monthNamesShort) {
+               var changeMonth = this._get(inst, 'changeMonth');
+               var changeYear = this._get(inst, 'changeYear');
+               var showMonthAfterYear = this._get(inst, 'showMonthAfterYear');
+               var html = '<div class="ui-datepicker-title">';
+               var monthHtml = '';
+               // month selection
+               if (secondary || !changeMonth)
+                       monthHtml += '<span class="ui-datepicker-month">' + monthNames[drawMonth] + '</span>';
+               else {
+                       var inMinYear = (minDate && minDate.getFullYear() == drawYear);
+                       var inMaxYear = (maxDate && maxDate.getFullYear() == drawYear);
+                       monthHtml += '<select class="ui-datepicker-month" data-handler="selectMonth" data-event="change">';
+                       for (var month = 0; month < 12; month++) {
+                               if ((!inMinYear || month >= minDate.getMonth()) &&
+                                               (!inMaxYear || month <= maxDate.getMonth()))
+                                       monthHtml += '<option value="' + month + '"' +
+                                               (month == drawMonth ? ' selected="selected"' : '') +
+                                               '>' + monthNamesShort[month] + '</option>';
+                       }
+                       monthHtml += '</select>';
+               }
+               if (!showMonthAfterYear)
+                       html += monthHtml + (secondary || !(changeMonth && changeYear) ? '&#xa0;' : '');
+               // year selection
+               if ( !inst.yearshtml ) {
+                       inst.yearshtml = '';
+                       if (secondary || !changeYear)
+                               html += '<span class="ui-datepicker-year">' + drawYear + '</span>';
+                       else {
+                               // determine range of years to display
+                               var years = this._get(inst, 'yearRange').split(':');
+                               var thisYear = new Date().getFullYear();
+                               var determineYear = function(value) {
+                                       var year = (value.match(/c[+-].*/) ? drawYear + parseInt(value.substring(1), 10) :
+                                               (value.match(/[+-].*/) ? thisYear + parseInt(value, 10) :
+                                               parseInt(value, 10)));
+                                       return (isNaN(year) ? thisYear : year);
+                               };
+                               var year = determineYear(years[0]);
+                               var endYear = Math.max(year, determineYear(years[1] || ''));
+                               year = (minDate ? Math.max(year, minDate.getFullYear()) : year);
+                               endYear = (maxDate ? Math.min(endYear, maxDate.getFullYear()) : endYear);
+                               inst.yearshtml += '<select class="ui-datepicker-year" data-handler="selectYear" data-event="change">';
+                               for (; year <= endYear; year++) {
+                                       inst.yearshtml += '<option value="' + year + '"' +
+                                               (year == drawYear ? ' selected="selected"' : '') +
+                                               '>' + year + '</option>';
+                               }
+                               inst.yearshtml += '</select>';
+                               
+                               html += inst.yearshtml;
+                               inst.yearshtml = null;
+                       }
+               }
+               html += this._get(inst, 'yearSuffix');
+               if (showMonthAfterYear)
+                       html += (secondary || !(changeMonth && changeYear) ? '&#xa0;' : '') + monthHtml;
+               html += '</div>'; // Close datepicker_header
+               return html;
+       },
+
+       /* Adjust one of the date sub-fields. */
+       _adjustInstDate: function(inst, offset, period) {
+               var year = inst.drawYear + (period == 'Y' ? offset : 0);
+               var month = inst.drawMonth + (period == 'M' ? offset : 0);
+               var day = Math.min(inst.selectedDay, this._getDaysInMonth(year, month)) +
+                       (period == 'D' ? offset : 0);
+               var date = this._restrictMinMax(inst,
+                       this._daylightSavingAdjust(new Date(year, month, day)));
+               inst.selectedDay = date.getDate();
+               inst.drawMonth = inst.selectedMonth = date.getMonth();
+               inst.drawYear = inst.selectedYear = date.getFullYear();
+               if (period == 'M' || period == 'Y')
+                       this._notifyChange(inst);
+       },
+
+       /* Ensure a date is within any min/max bounds. */
+       _restrictMinMax: function(inst, date) {
+               var minDate = this._getMinMaxDate(inst, 'min');
+               var maxDate = this._getMinMaxDate(inst, 'max');
+               var newDate = (minDate && date < minDate ? minDate : date);
+               newDate = (maxDate && newDate > maxDate ? maxDate : newDate);
+               return newDate;
+       },
+
+       /* Notify change of month/year. */
+       _notifyChange: function(inst) {
+               var onChange = this._get(inst, 'onChangeMonthYear');
+               if (onChange)
+                       onChange.apply((inst.input ? inst.input[0] : null),
+                               [inst.selectedYear, inst.selectedMonth + 1, inst]);
+       },
+
+       /* Determine the number of months to show. */
+       _getNumberOfMonths: function(inst) {
+               var numMonths = this._get(inst, 'numberOfMonths');
+               return (numMonths == null ? [1, 1] : (typeof numMonths == 'number' ? [1, numMonths] : numMonths));
+       },
+
+       /* Determine the current maximum date - ensure no time components are set. */
+       _getMinMaxDate: function(inst, minMax) {
+               return this._determineDate(inst, this._get(inst, minMax + 'Date'), null);
+       },
+
+       /* Find the number of days in a given month. */
+       _getDaysInMonth: function(year, month) {
+               return 32 - this._daylightSavingAdjust(new Date(year, month, 32)).getDate();
+       },
+
+       /* Find the day of the week of the first of a month. */
+       _getFirstDayOfMonth: function(year, month) {
+               return new Date(year, month, 1).getDay();
+       },
+
+       /* Determines if we should allow a "next/prev" month display change. */
+       _canAdjustMonth: function(inst, offset, curYear, curMonth) {
+               var numMonths = this._getNumberOfMonths(inst);
+               var date = this._daylightSavingAdjust(new Date(curYear,
+                       curMonth + (offset < 0 ? offset : numMonths[0] * numMonths[1]), 1));
+               if (offset < 0)
+                       date.setDate(this._getDaysInMonth(date.getFullYear(), date.getMonth()));
+               return this._isInRange(inst, date);
+       },
+
+       /* Is the given date in the accepted range? */
+       _isInRange: function(inst, date) {
+               var minDate = this._getMinMaxDate(inst, 'min');
+               var maxDate = this._getMinMaxDate(inst, 'max');
+               return ((!minDate || date.getTime() >= minDate.getTime()) &&
+                       (!maxDate || date.getTime() <= maxDate.getTime()));
+       },
+
+       /* Provide the configuration settings for formatting/parsing. */
+       _getFormatConfig: function(inst) {
+               var shortYearCutoff = this._get(inst, 'shortYearCutoff');
+               shortYearCutoff = (typeof shortYearCutoff != 'string' ? shortYearCutoff :
+                       new Date().getFullYear() % 100 + parseInt(shortYearCutoff, 10));
+               return {shortYearCutoff: shortYearCutoff,
+                       dayNamesShort: this._get(inst, 'dayNamesShort'), dayNames: this._get(inst, 'dayNames'),
+                       monthNamesShort: this._get(inst, 'monthNamesShort'), monthNames: this._get(inst, 'monthNames')};
+       },
+
+       /* Format the given date for display. */
+       _formatDate: function(inst, day, month, year) {
+               if (!day) {
+                       inst.currentDay = inst.selectedDay;
+                       inst.currentMonth = inst.selectedMonth;
+                       inst.currentYear = inst.selectedYear;
+               }
+               var date = (day ? (typeof day == 'object' ? day :
+                       this._daylightSavingAdjust(new Date(year, month, day))) :
+                       this._daylightSavingAdjust(new Date(inst.currentYear, inst.currentMonth, inst.currentDay)));
+               return this.formatDate(this._get(inst, 'dateFormat'), date, this._getFormatConfig(inst));
+       }
+});
+
+/*
+ * Bind hover events for datepicker elements.
+ * Done via delegate so the binding only occurs once in the lifetime of the parent div.
+ * Global instActive, set by _updateDatepicker allows the handlers to find their way back to the active picker.
+ */ 
+function bindHover(dpDiv) {
+       var selector = 'button, .ui-datepicker-prev, .ui-datepicker-next, .ui-datepicker-calendar td a';
+       return dpDiv.bind('mouseout', function(event) {
+                       var elem = $( event.target ).closest( selector );
+                       if ( !elem.length ) {
+                               return;
+                       }
+                       elem.removeClass( "ui-state-hover ui-datepicker-prev-hover ui-datepicker-next-hover" );
+               })
+               .bind('mouseover', function(event) {
+                       var elem = $( event.target ).closest( selector );
+                       if ($.datepicker._isDisabledDatepicker( instActive.inline ? dpDiv.parent()[0] : instActive.input[0]) ||
+                                       !elem.length ) {
+                               return;
+                       }
+                       elem.parents('.ui-datepicker-calendar').find('a').removeClass('ui-state-hover');
+                       elem.addClass('ui-state-hover');
+                       if (elem.hasClass('ui-datepicker-prev')) elem.addClass('ui-datepicker-prev-hover');
+                       if (elem.hasClass('ui-datepicker-next')) elem.addClass('ui-datepicker-next-hover');
+               });
+}
+
+/* jQuery extend now ignores nulls! */
+function extendRemove(target, props) {
+       $.extend(target, props);
+       for (var name in props)
+               if (props[name] == null || props[name] == undefined)
+                       target[name] = props[name];
+       return target;
+};
+
+/* Determine whether an object is an array. */
+function isArray(a) {
+       return (a && (($.browser.safari && typeof a == 'object' && a.length) ||
+               (a.constructor && a.constructor.toString().match(/\Array\(\)/))));
+};
+
+/* Invoke the datepicker functionality.
+   @param  options  string - a command, optionally followed by additional parameters or
+                    Object - settings for attaching new datepicker functionality
+   @return  jQuery object */
+$.fn.datepicker = function(options){
+       
+       /* Verify an empty collection wasn't passed - Fixes #6976 */
+       if ( !this.length ) {
+               return this;
+       }
+       
+       /* Initialise the date picker. */
+       if (!$.datepicker.initialized) {
+               $(document).mousedown($.datepicker._checkExternalClick).
+                       find('body').append($.datepicker.dpDiv);
+               $.datepicker.initialized = true;
+       }
+
+       var otherArgs = Array.prototype.slice.call(arguments, 1);
+       if (typeof options == 'string' && (options == 'isDisabled' || options == 'getDate' || options == 'widget'))
+               return $.datepicker['_' + options + 'Datepicker'].
+                       apply($.datepicker, [this[0]].concat(otherArgs));
+       if (options == 'option' && arguments.length == 2 && typeof arguments[1] == 'string')
+               return $.datepicker['_' + options + 'Datepicker'].
+                       apply($.datepicker, [this[0]].concat(otherArgs));
+       return this.each(function() {
+               typeof options == 'string' ?
+                       $.datepicker['_' + options + 'Datepicker'].
+                               apply($.datepicker, [this].concat(otherArgs)) :
+                       $.datepicker._attachDatepicker(this, options);
+       });
+};
+
+$.datepicker = new Datepicker(); // singleton instance
+$.datepicker.initialized = false;
+$.datepicker.uuid = new Date().getTime();
+$.datepicker.version = "1.8.24";
+
+// Workaround for #4055
+// Add another global to avoid noConflict issues with inline event handlers
+window['DP_jQuery_' + dpuuid] = $;
+
+})(jQuery);
diff --git a/resources/lib/jquery.ui/jquery.ui.dialog.js b/resources/lib/jquery.ui/jquery.ui.dialog.js
new file mode 100644 (file)
index 0000000..06b85f2
--- /dev/null
@@ -0,0 +1,866 @@
+/*!
+ * jQuery UI Dialog 1.8.24
+ *
+ * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Dialog
+ *
+ * Depends:
+ *     jquery.ui.core.js
+ *     jquery.ui.widget.js
+ *  jquery.ui.button.js
+ *     jquery.ui.draggable.js
+ *     jquery.ui.mouse.js
+ *     jquery.ui.position.js
+ *     jquery.ui.resizable.js
+ */
+(function( $, undefined ) {
+
+var uiDialogClasses =
+               'ui-dialog ' +
+               'ui-widget ' +
+               'ui-widget-content ' +
+               'ui-corner-all ',
+       sizeRelatedOptions = {
+               buttons: true,
+               height: true,
+               maxHeight: true,
+               maxWidth: true,
+               minHeight: true,
+               minWidth: true,
+               width: true
+       },
+       resizableRelatedOptions = {
+               maxHeight: true,
+               maxWidth: true,
+               minHeight: true,
+               minWidth: true
+       };
+
+$.widget("ui.dialog", {
+       options: {
+               autoOpen: true,
+               buttons: {},
+               closeOnEscape: true,
+               closeText: 'close',
+               dialogClass: '',
+               draggable: true,
+               hide: null,
+               height: 'auto',
+               maxHeight: false,
+               maxWidth: false,
+               minHeight: 150,
+               minWidth: 150,
+               modal: false,
+               position: {
+                       my: 'center',
+                       at: 'center',
+                       collision: 'fit',
+                       // ensure that the titlebar is never outside the document
+                       using: function(pos) {
+                               var topOffset = $(this).css(pos).offset().top;
+                               if (topOffset < 0) {
+                                       $(this).css('top', pos.top - topOffset);
+                               }
+                       }
+               },
+               resizable: true,
+               show: null,
+               stack: true,
+               title: '',
+               width: 300,
+               zIndex: 1000
+       },
+
+       _create: function() {
+               this.originalTitle = this.element.attr('title');
+               // #5742 - .attr() might return a DOMElement
+               if ( typeof this.originalTitle !== "string" ) {
+                       this.originalTitle = "";
+               }
+
+               this.options.title = this.options.title || this.originalTitle;
+               var self = this,
+                       options = self.options,
+
+                       title = options.title || '&#160;',
+                       titleId = $.ui.dialog.getTitleId(self.element),
+
+                       uiDialog = (self.uiDialog = $('<div></div>'))
+                               .appendTo(document.body)
+                               .hide()
+                               .addClass(uiDialogClasses + options.dialogClass)
+                               .css({
+                                       zIndex: options.zIndex
+                               })
+                               // setting tabIndex makes the div focusable
+                               // setting outline to 0 prevents a border on focus in Mozilla
+                               .attr('tabIndex', -1).css('outline', 0).keydown(function(event) {
+                                       if (options.closeOnEscape && !event.isDefaultPrevented() && event.keyCode &&
+                                               event.keyCode === $.ui.keyCode.ESCAPE) {
+                                               
+                                               self.close(event);
+                                               event.preventDefault();
+                                       }
+                               })
+                               .attr({
+                                       role: 'dialog',
+                                       'aria-labelledby': titleId
+                               })
+                               .mousedown(function(event) {
+                                       self.moveToTop(false, event);
+                               }),
+
+                       uiDialogContent = self.element
+                               .show()
+                               .removeAttr('title')
+                               .addClass(
+                                       'ui-dialog-content ' +
+                                       'ui-widget-content')
+                               .appendTo(uiDialog),
+
+                       uiDialogTitlebar = (self.uiDialogTitlebar = $('<div></div>'))
+                               .addClass(
+                                       'ui-dialog-titlebar ' +
+                                       'ui-widget-header ' +
+                                       'ui-corner-all ' +
+                                       'ui-helper-clearfix'
+                               )
+                               .prependTo(uiDialog),
+
+                       uiDialogTitlebarClose = $('<a href="#"></a>')
+                               .addClass(
+                                       'ui-dialog-titlebar-close ' +
+                                       'ui-corner-all'
+                               )
+                               .attr('role', 'button')
+                               .hover(
+                                       function() {
+                                               uiDialogTitlebarClose.addClass('ui-state-hover');
+                                       },
+                                       function() {
+                                               uiDialogTitlebarClose.removeClass('ui-state-hover');
+                                       }
+                               )
+                               .focus(function() {
+                                       uiDialogTitlebarClose.addClass('ui-state-focus');
+                               })
+                               .blur(function() {
+                                       uiDialogTitlebarClose.removeClass('ui-state-focus');
+                               })
+                               .click(function(event) {
+                                       self.close(event);
+                                       return false;
+                               })
+                               .appendTo(uiDialogTitlebar),
+
+                       uiDialogTitlebarCloseText = (self.uiDialogTitlebarCloseText = $('<span></span>'))
+                               .addClass(
+                                       'ui-icon ' +
+                                       'ui-icon-closethick'
+                               )
+                               .text(options.closeText)
+                               .appendTo(uiDialogTitlebarClose),
+
+                       uiDialogTitle = $('<span></span>')
+                               .addClass('ui-dialog-title')
+                               .attr('id', titleId)
+                               .html(title)
+                               .prependTo(uiDialogTitlebar);
+
+               //handling of deprecated beforeclose (vs beforeClose) option
+               //Ticket #4669 http://dev.jqueryui.com/ticket/4669
+               //TODO: remove in 1.9pre
+               if ($.isFunction(options.beforeclose) && !$.isFunction(options.beforeClose)) {
+                       options.beforeClose = options.beforeclose;
+               }
+
+               uiDialogTitlebar.find("*").add(uiDialogTitlebar).disableSelection();
+
+               if (options.draggable && $.fn.draggable) {
+                       self._makeDraggable();
+               }
+               if (options.resizable && $.fn.resizable) {
+                       self._makeResizable();
+               }
+
+               self._createButtons(options.buttons);
+               self._isOpen = false;
+
+               if ($.fn.bgiframe) {
+                       uiDialog.bgiframe();
+               }
+       },
+
+       _init: function() {
+               if ( this.options.autoOpen ) {
+                       this.open();
+               }
+       },
+
+       destroy: function() {
+               var self = this;
+               
+               if (self.overlay) {
+                       self.overlay.destroy();
+               }
+               self.uiDialog.hide();
+               self.element
+                       .unbind('.dialog')
+                       .removeData('dialog')
+                       .removeClass('ui-dialog-content ui-widget-content')
+                       .hide().appendTo('body');
+               self.uiDialog.remove();
+
+               if (self.originalTitle) {
+                       self.element.attr('title', self.originalTitle);
+               }
+
+               return self;
+       },
+
+       widget: function() {
+               return this.uiDialog;
+       },
+
+       close: function(event) {
+               var self = this,
+                       maxZ, thisZ;
+               
+               if (false === self._trigger('beforeClose', event)) {
+                       return;
+               }
+
+               if (self.overlay) {
+                       self.overlay.destroy();
+               }
+               self.uiDialog.unbind('keypress.ui-dialog');
+
+               self._isOpen = false;
+
+               if (self.options.hide) {
+                       self.uiDialog.hide(self.options.hide, function() {
+                               self._trigger('close', event);
+                       });
+               } else {
+                       self.uiDialog.hide();
+                       self._trigger('close', event);
+               }
+
+               $.ui.dialog.overlay.resize();
+
+               // adjust the maxZ to allow other modal dialogs to continue to work (see #4309)
+               if (self.options.modal) {
+                       maxZ = 0;
+                       $('.ui-dialog').each(function() {
+                               if (this !== self.uiDialog[0]) {
+                                       thisZ = $(this).css('z-index');
+                                       if(!isNaN(thisZ)) {
+                                               maxZ = Math.max(maxZ, thisZ);
+                                       }
+                               }
+                       });
+                       $.ui.dialog.maxZ = maxZ;
+               }
+
+               return self;
+       },
+
+       isOpen: function() {
+               return this._isOpen;
+       },
+
+       // the force parameter allows us to move modal dialogs to their correct
+       // position on open
+       moveToTop: function(force, event) {
+               var self = this,
+                       options = self.options,
+                       saveScroll;
+
+               if ((options.modal && !force) ||
+                       (!options.stack && !options.modal)) {
+                       return self._trigger('focus', event);
+               }
+
+               if (options.zIndex > $.ui.dialog.maxZ) {
+                       $.ui.dialog.maxZ = options.zIndex;
+               }
+               if (self.overlay) {
+                       $.ui.dialog.maxZ += 1;
+                       self.overlay.$el.css('z-index', $.ui.dialog.overlay.maxZ = $.ui.dialog.maxZ);
+               }
+
+               //Save and then restore scroll since Opera 9.5+ resets when parent z-Index is changed.
+               //  http://ui.jquery.com/bugs/ticket/3193
+               saveScroll = { scrollTop: self.element.scrollTop(), scrollLeft: self.element.scrollLeft() };
+               $.ui.dialog.maxZ += 1;
+               self.uiDialog.css('z-index', $.ui.dialog.maxZ);
+               self.element.attr(saveScroll);
+               self._trigger('focus', event);
+
+               return self;
+       },
+
+       open: function() {
+               if (this._isOpen) { return; }
+
+               var self = this,
+                       options = self.options,
+                       uiDialog = self.uiDialog;
+
+               self.overlay = options.modal ? new $.ui.dialog.overlay(self) : null;
+               self._size();
+               self._position(options.position);
+               uiDialog.show(options.show);
+               self.moveToTop(true);
+
+               // prevent tabbing out of modal dialogs
+               if ( options.modal ) {
+                       uiDialog.bind( "keydown.ui-dialog", function( event ) {
+                               if ( event.keyCode !== $.ui.keyCode.TAB ) {
+                                       return;
+                               }
+
+                               var tabbables = $(':tabbable', this),
+                                       first = tabbables.filter(':first'),
+                                       last  = tabbables.filter(':last');
+
+                               if (event.target === last[0] && !event.shiftKey) {
+                                       first.focus(1);
+                                       return false;
+                               } else if (event.target === first[0] && event.shiftKey) {
+                                       last.focus(1);
+                                       return false;
+                               }
+                       });
+               }
+
+               // set focus to the first tabbable element in the content area or the first button
+               // if there are no tabbable elements, set focus on the dialog itself
+               $(self.element.find(':tabbable').get().concat(
+                       uiDialog.find('.ui-dialog-buttonpane :tabbable').get().concat(
+                               uiDialog.get()))).eq(0).focus();
+
+               self._isOpen = true;
+               self._trigger('open');
+
+               return self;
+       },
+
+       _createButtons: function(buttons) {
+               var self = this,
+                       hasButtons = false,
+                       uiDialogButtonPane = $('<div></div>')
+                               .addClass(
+                                       'ui-dialog-buttonpane ' +
+                                       'ui-widget-content ' +
+                                       'ui-helper-clearfix'
+                               ),
+                       uiButtonSet = $( "<div></div>" )
+                               .addClass( "ui-dialog-buttonset" )
+                               .appendTo( uiDialogButtonPane );
+
+               // if we already have a button pane, remove it
+               self.uiDialog.find('.ui-dialog-buttonpane').remove();
+
+               if (typeof buttons === 'object' && buttons !== null) {
+                       $.each(buttons, function() {
+                               return !(hasButtons = true);
+                       });
+               }
+               if (hasButtons) {
+                       $.each(buttons, function(name, props) {
+                               props = $.isFunction( props ) ?
+                                       { click: props, text: name } :
+                                       props;
+                               var button = $('<button type="button"></button>')
+                                       .click(function() {
+                                               props.click.apply(self.element[0], arguments);
+                                       })
+                                       .appendTo(uiButtonSet);
+                               // can't use .attr( props, true ) with jQuery 1.3.2.
+                               $.each( props, function( key, value ) {
+                                       if ( key === "click" ) {
+                                               return;
+                                       }
+                                       if ( key in button ) {
+                                               button[ key ]( value );
+                                       } else {
+                                               button.attr( key, value );
+                                       }
+                               });
+                               if ($.fn.button) {
+                                       button.button();
+                               }
+                       });
+                       uiDialogButtonPane.appendTo(self.uiDialog);
+               }
+       },
+
+       _makeDraggable: function() {
+               var self = this,
+                       options = self.options,
+                       doc = $(document),
+                       heightBeforeDrag;
+
+               function filteredUi(ui) {
+                       return {
+                               position: ui.position,
+                               offset: ui.offset
+                       };
+               }
+
+               self.uiDialog.draggable({
+                       cancel: '.ui-dialog-content, .ui-dialog-titlebar-close',
+                       handle: '.ui-dialog-titlebar',
+                       containment: 'document',
+                       start: function(event, ui) {
+                               heightBeforeDrag = options.height === "auto" ? "auto" : $(this).height();
+                               $(this).height($(this).height()).addClass("ui-dialog-dragging");
+                               self._trigger('dragStart', event, filteredUi(ui));
+                       },
+                       drag: function(event, ui) {
+                               self._trigger('drag', event, filteredUi(ui));
+                       },
+                       stop: function(event, ui) {
+                               options.position = [ui.position.left - doc.scrollLeft(),
+                                       ui.position.top - doc.scrollTop()];
+                               $(this).removeClass("ui-dialog-dragging").height(heightBeforeDrag);
+                               self._trigger('dragStop', event, filteredUi(ui));
+                               $.ui.dialog.overlay.resize();
+                       }
+               });
+       },
+
+       _makeResizable: function(handles) {
+               handles = (handles === undefined ? this.options.resizable : handles);
+               var self = this,
+                       options = self.options,
+                       // .ui-resizable has position: relative defined in the stylesheet
+                       // but dialogs have to use absolute or fixed positioning
+                       position = self.uiDialog.css('position'),
+                       resizeHandles = (typeof handles === 'string' ?
+                               handles :
+                               'n,e,s,w,se,sw,ne,nw'
+                       );
+
+               function filteredUi(ui) {
+                       return {
+                               originalPosition: ui.originalPosition,
+                               originalSize: ui.originalSize,
+                               position: ui.position,
+                               size: ui.size
+                       };
+               }
+
+               self.uiDialog.resizable({
+                       cancel: '.ui-dialog-content',
+                       containment: 'document',
+                       alsoResize: self.element,
+                       maxWidth: options.maxWidth,
+                       maxHeight: options.maxHeight,
+                       minWidth: options.minWidth,
+                       minHeight: self._minHeight(),
+                       handles: resizeHandles,
+                       start: function(event, ui) {
+                               $(this).addClass("ui-dialog-resizing");
+                               self._trigger('resizeStart', event, filteredUi(ui));
+                       },
+                       resize: function(event, ui) {
+                               self._trigger('resize', event, filteredUi(ui));
+                       },
+                       stop: function(event, ui) {
+                               $(this).removeClass("ui-dialog-resizing");
+                               options.height = $(this).height();
+                               options.width = $(this).width();
+                               self._trigger('resizeStop', event, filteredUi(ui));
+                               $.ui.dialog.overlay.resize();
+                       }
+               })
+               .css('position', position)
+               .find('.ui-resizable-se').addClass('ui-icon ui-icon-grip-diagonal-se');
+       },
+
+       _minHeight: function() {
+               var options = this.options;
+
+               if (options.height === 'auto') {
+                       return options.minHeight;
+               } else {
+                       return Math.min(options.minHeight, options.height);
+               }
+       },
+
+       _position: function(position) {
+               var myAt = [],
+                       offset = [0, 0],
+                       isVisible;
+
+               if (position) {
+                       // deep extending converts arrays to objects in jQuery <= 1.3.2 :-(
+       //              if (typeof position == 'string' || $.isArray(position)) {
+       //                      myAt = $.isArray(position) ? position : position.split(' ');
+
+                       if (typeof position === 'string' || (typeof position === 'object' && '0' in position)) {
+                               myAt = position.split ? position.split(' ') : [position[0], position[1]];
+                               if (myAt.length === 1) {
+                                       myAt[1] = myAt[0];
+                               }
+
+                               $.each(['left', 'top'], function(i, offsetPosition) {
+                                       if (+myAt[i] === myAt[i]) {
+                                               offset[i] = myAt[i];
+                                               myAt[i] = offsetPosition;
+                                       }
+                               });
+
+                               position = {
+                                       my: myAt.join(" "),
+                                       at: myAt.join(" "),
+                                       offset: offset.join(" ")
+                               };
+                       } 
+
+                       position = $.extend({}, $.ui.dialog.prototype.options.position, position);
+               } else {
+                       position = $.ui.dialog.prototype.options.position;
+               }
+
+               // need to show the dialog to get the actual offset in the position plugin
+               isVisible = this.uiDialog.is(':visible');
+               if (!isVisible) {
+                       this.uiDialog.show();
+               }
+               this.uiDialog
+                       // workaround for jQuery bug #5781 http://dev.jquery.com/ticket/5781
+                       .css({ top: 0, left: 0 })
+                       .position($.extend({ of: window }, position));
+               if (!isVisible) {
+                       this.uiDialog.hide();
+               }
+       },
+
+       _setOptions: function( options ) {
+               var self = this,
+                       resizableOptions = {},
+                       resize = false;
+
+               $.each( options, function( key, value ) {
+                       self._setOption( key, value );
+                       
+                       if ( key in sizeRelatedOptions ) {
+                               resize = true;
+                       }
+                       if ( key in resizableRelatedOptions ) {
+                               resizableOptions[ key ] = value;
+                       }
+               });
+
+               if ( resize ) {
+                       this._size();
+               }
+               if ( this.uiDialog.is( ":data(resizable)" ) ) {
+                       this.uiDialog.resizable( "option", resizableOptions );
+               }
+       },
+
+       _setOption: function(key, value){
+               var self = this,
+                       uiDialog = self.uiDialog;
+
+               switch (key) {
+                       //handling of deprecated beforeclose (vs beforeClose) option
+                       //Ticket #4669 http://dev.jqueryui.com/ticket/4669
+                       //TODO: remove in 1.9pre
+                       case "beforeclose":
+                               key = "beforeClose";
+                               break;
+                       case "buttons":
+                               self._createButtons(value);
+                               break;
+                       case "closeText":
+                               // ensure that we always pass a string
+                               self.uiDialogTitlebarCloseText.text("" + value);
+                               break;
+                       case "dialogClass":
+                               uiDialog
+                                       .removeClass(self.options.dialogClass)
+                                       .addClass(uiDialogClasses + value);
+                               break;
+                       case "disabled":
+                               if (value) {
+                                       uiDialog.addClass('ui-dialog-disabled');
+                               } else {
+                                       uiDialog.removeClass('ui-dialog-disabled');
+                               }
+                               break;
+                       case "draggable":
+                               var isDraggable = uiDialog.is( ":data(draggable)" );
+                               if ( isDraggable && !value ) {
+                                       uiDialog.draggable( "destroy" );
+                               }
+                               
+                               if ( !isDraggable && value ) {
+                                       self._makeDraggable();
+                               }
+                               break;
+                       case "position":
+                               self._position(value);
+                               break;
+                       case "resizable":
+                               // currently resizable, becoming non-resizable
+                               var isResizable = uiDialog.is( ":data(resizable)" );
+                               if (isResizable && !value) {
+                                       uiDialog.resizable('destroy');
+                               }
+
+                               // currently resizable, changing handles
+                               if (isResizable && typeof value === 'string') {
+                                       uiDialog.resizable('option', 'handles', value);
+                               }
+
+                               // currently non-resizable, becoming resizable
+                               if (!isResizable && value !== false) {
+                                       self._makeResizable(value);
+                               }
+                               break;
+                       case "title":
+                               // convert whatever was passed in o a string, for html() to not throw up
+                               $(".ui-dialog-title", self.uiDialogTitlebar).html("" + (value || '&#160;'));
+                               break;
+               }
+
+               $.Widget.prototype._setOption.apply(self, arguments);
+       },
+
+       _size: function() {
+               /* If the user has resized the dialog, the .ui-dialog and .ui-dialog-content
+                * divs will both have width and height set, so we need to reset them
+                */
+               var options = this.options,
+                       nonContentHeight,
+                       minContentHeight,
+                       isVisible = this.uiDialog.is( ":visible" );
+
+               // reset content sizing
+               this.element.show().css({
+                       width: 'auto',
+                       minHeight: 0,
+                       height: 0
+               });
+
+               if (options.minWidth > options.width) {
+                       options.width = options.minWidth;
+               }
+
+               // reset wrapper sizing
+               // determine the height of all the non-content elements
+               nonContentHeight = this.uiDialog.css({
+                               height: 'auto',
+                               width: options.width
+                       })
+                       .height();
+               minContentHeight = Math.max( 0, options.minHeight - nonContentHeight );
+               
+               if ( options.height === "auto" ) {
+                       // only needed for IE6 support
+                       if ( $.support.minHeight ) {
+                               this.element.css({
+                                       minHeight: minContentHeight,
+                                       height: "auto"
+                               });
+                       } else {
+                               this.uiDialog.show();
+                               var autoHeight = this.element.css( "height", "auto" ).height();
+                               if ( !isVisible ) {
+                                       this.uiDialog.hide();
+                               }
+                               this.element.height( Math.max( autoHeight, minContentHeight ) );
+                       }
+               } else {
+                       this.element.height( Math.max( options.height - nonContentHeight, 0 ) );
+               }
+
+               if (this.uiDialog.is(':data(resizable)')) {
+                       this.uiDialog.resizable('option', 'minHeight', this._minHeight());
+               }
+       }
+});
+
+$.extend($.ui.dialog, {
+       version: "1.8.24",
+
+       uuid: 0,
+       maxZ: 0,
+
+       getTitleId: function($el) {
+               var id = $el.attr('id');
+               if (!id) {
+                       this.uuid += 1;
+                       id = this.uuid;
+               }
+               return 'ui-dialog-title-' + id;
+       },
+
+       overlay: function(dialog) {
+               this.$el = $.ui.dialog.overlay.create(dialog);
+       }
+});
+
+$.extend($.ui.dialog.overlay, {
+       instances: [],
+       // reuse old instances due to IE memory leak with alpha transparency (see #5185)
+       oldInstances: [],
+       maxZ: 0,
+       events: $.map('focus,mousedown,mouseup,keydown,keypress,click'.split(','),
+               function(event) { return event + '.dialog-overlay'; }).join(' '),
+       create: function(dialog) {
+               if (this.instances.length === 0) {
+                       // prevent use of anchors and inputs
+                       // we use a setTimeout in case the overlay is created from an
+                       // event that we're going to be cancelling (see #2804)
+                       setTimeout(function() {
+                               // handle $(el).dialog().dialog('close') (see #4065)
+                               if ($.ui.dialog.overlay.instances.length) {
+                                       $(document).bind($.ui.dialog.overlay.events, function(event) {
+                                               // stop events if the z-index of the target is < the z-index of the overlay
+                                               // we cannot return true when we don't want to cancel the event (#3523)
+                                               if ($(event.target).zIndex() < $.ui.dialog.overlay.maxZ) {
+                                                       return false;
+                                               }
+                                       });
+                               }
+                       }, 1);
+
+                       // allow closing by pressing the escape key
+                       $(document).bind('keydown.dialog-overlay', function(event) {
+                               if (dialog.options.closeOnEscape && !event.isDefaultPrevented() && event.keyCode &&
+                                       event.keyCode === $.ui.keyCode.ESCAPE) {
+                                       
+                                       dialog.close(event);
+                                       event.preventDefault();
+                               }
+                       });
+
+                       // handle window resize
+                       $(window).bind('resize.dialog-overlay', $.ui.dialog.overlay.resize);
+               }
+
+               var $el = (this.oldInstances.pop() || $('<div></div>').addClass('ui-widget-overlay'))
+                       .appendTo(document.body)
+                       .css({
+                               width: this.width(),
+                               height: this.height()
+                       });
+
+               if ($.fn.bgiframe) {
+                       $el.bgiframe();
+               }
+
+               this.instances.push($el);
+               return $el;
+       },
+
+       destroy: function($el) {
+               var indexOf = $.inArray($el, this.instances);
+               if (indexOf != -1){
+                       this.oldInstances.push(this.instances.splice(indexOf, 1)[0]);
+               }
+
+               if (this.instances.length === 0) {
+                       $([document, window]).unbind('.dialog-overlay');
+               }
+
+               $el.remove();
+               
+               // adjust the maxZ to allow other modal dialogs to continue to work (see #4309)
+               var maxZ = 0;
+               $.each(this.instances, function() {
+                       maxZ = Math.max(maxZ, this.css('z-index'));
+               });
+               this.maxZ = maxZ;
+       },
+
+       height: function() {
+               var scrollHeight,
+                       offsetHeight;
+               // handle IE 6
+               if ($.browser.msie && $.browser.version < 7) {
+                       scrollHeight = Math.max(
+                               document.documentElement.scrollHeight,
+                               document.body.scrollHeight
+                       );
+                       offsetHeight = Math.max(
+                               document.documentElement.offsetHeight,
+                               document.body.offsetHeight
+                       );
+
+                       if (scrollHeight < offsetHeight) {
+                               return $(window).height() + 'px';
+                       } else {
+                               return scrollHeight + 'px';
+                       }
+               // handle "good" browsers
+               } else {
+                       return $(document).height() + 'px';
+               }
+       },
+
+       width: function() {
+               var scrollWidth,
+                       offsetWidth;
+               // handle IE
+               if ( $.browser.msie ) {
+                       scrollWidth = Math.max(
+                               document.documentElement.scrollWidth,
+                               document.body.scrollWidth
+                       );
+                       offsetWidth = Math.max(
+                               document.documentElement.offsetWidth,
+                               document.body.offsetWidth
+                       );
+
+                       if (scrollWidth < offsetWidth) {
+                               return $(window).width() + 'px';
+                       } else {
+                               return scrollWidth + 'px';
+                       }
+               // handle "good" browsers
+               } else {
+                       return $(document).width() + 'px';
+               }
+       },
+
+       resize: function() {
+               /* If the dialog is draggable and the user drags it past the
+                * right edge of the window, the document becomes wider so we
+                * need to stretch the overlay. If the user then drags the
+                * dialog back to the left, the document will become narrower,
+                * so we need to shrink the overlay to the appropriate size.
+                * This is handled by shrinking the overlay before setting it
+                * to the full document size.
+                */
+               var $overlays = $([]);
+               $.each($.ui.dialog.overlay.instances, function() {
+                       $overlays = $overlays.add(this);
+               });
+
+               $overlays.css({
+                       width: 0,
+                       height: 0
+               }).css({
+                       width: $.ui.dialog.overlay.width(),
+                       height: $.ui.dialog.overlay.height()
+               });
+       }
+});
+
+$.extend($.ui.dialog.overlay.prototype, {
+       destroy: function() {
+               $.ui.dialog.overlay.destroy(this.$el);
+       }
+});
+
+}(jQuery));
diff --git a/resources/lib/jquery.ui/jquery.ui.draggable.js b/resources/lib/jquery.ui/jquery.ui.draggable.js
new file mode 100644 (file)
index 0000000..149035c
--- /dev/null
@@ -0,0 +1,832 @@
+/*!
+ * jQuery UI Draggable 1.8.24
+ *
+ * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Draggables
+ *
+ * Depends:
+ *     jquery.ui.core.js
+ *     jquery.ui.mouse.js
+ *     jquery.ui.widget.js
+ */
+(function( $, undefined ) {
+
+$.widget("ui.draggable", $.ui.mouse, {
+       widgetEventPrefix: "drag",
+       options: {
+               addClasses: true,
+               appendTo: "parent",
+               axis: false,
+               connectToSortable: false,
+               containment: false,
+               cursor: "auto",
+               cursorAt: false,
+               grid: false,
+               handle: false,
+               helper: "original",
+               iframeFix: false,
+               opacity: false,
+               refreshPositions: false,
+               revert: false,
+               revertDuration: 500,
+               scope: "default",
+               scroll: true,
+               scrollSensitivity: 20,
+               scrollSpeed: 20,
+               snap: false,
+               snapMode: "both",
+               snapTolerance: 20,
+               stack: false,
+               zIndex: false
+       },
+       _create: function() {
+
+               if (this.options.helper == 'original' && !(/^(?:r|a|f)/).test(this.element.css("position")))
+                       this.element[0].style.position = 'relative';
+
+               (this.options.addClasses && this.element.addClass("ui-draggable"));
+               (this.options.disabled && this.element.addClass("ui-draggable-disabled"));
+
+               this._mouseInit();
+
+       },
+
+       destroy: function() {
+               if(!this.element.data('draggable')) return;
+               this.element
+                       .removeData("draggable")
+                       .unbind(".draggable")
+                       .removeClass("ui-draggable"
+                               + " ui-draggable-dragging"
+                               + " ui-draggable-disabled");
+               this._mouseDestroy();
+
+               return this;
+       },
+
+       _mouseCapture: function(event) {
+
+               var o = this.options;
+
+               // among others, prevent a drag on a resizable-handle
+               if (this.helper || o.disabled || $(event.target).is('.ui-resizable-handle'))
+                       return false;
+
+               //Quit if we're not on a valid handle
+               this.handle = this._getHandle(event);
+               if (!this.handle)
+                       return false;
+               
+               if ( o.iframeFix ) {
+                       $(o.iframeFix === true ? "iframe" : o.iframeFix).each(function() {
+                               $('<div class="ui-draggable-iframeFix" style="background: #fff;"></div>')
+                               .css({
+                                       width: this.offsetWidth+"px", height: this.offsetHeight+"px",
+                                       position: "absolute", opacity: "0.001", zIndex: 1000
+                               })
+                               .css($(this).offset())
+                               .appendTo("body");
+                       });
+               }
+
+               return true;
+
+       },
+
+       _mouseStart: function(event) {
+
+               var o = this.options;
+
+               //Create and append the visible helper
+               this.helper = this._createHelper(event);
+
+               this.helper.addClass("ui-draggable-dragging");
+
+               //Cache the helper size
+               this._cacheHelperProportions();
+
+               //If ddmanager is used for droppables, set the global draggable
+               if($.ui.ddmanager)
+                       $.ui.ddmanager.current = this;
+
+               /*
+                * - Position generation -
+                * This block generates everything position related - it's the core of draggables.
+                */
+
+               //Cache the margins of the original element
+               this._cacheMargins();
+
+               //Store the helper's css position
+               this.cssPosition = this.helper.css("position");
+               this.scrollParent = this.helper.scrollParent();
+
+               //The element's absolute position on the page minus margins
+               this.offset = this.positionAbs = this.element.offset();
+               this.offset = {
+                       top: this.offset.top - this.margins.top,
+                       left: this.offset.left - this.margins.left
+               };
+
+               $.extend(this.offset, {
+                       click: { //Where the click happened, relative to the element
+                               left: event.pageX - this.offset.left,
+                               top: event.pageY - this.offset.top
+                       },
+                       parent: this._getParentOffset(),
+                       relative: this._getRelativeOffset() //This is a relative to absolute position minus the actual position calculation - only used for relative positioned helper
+               });
+
+               //Generate the original position
+               this.originalPosition = this.position = this._generatePosition(event);
+               this.originalPageX = event.pageX;
+               this.originalPageY = event.pageY;
+
+               //Adjust the mouse offset relative to the helper if 'cursorAt' is supplied
+               (o.cursorAt && this._adjustOffsetFromHelper(o.cursorAt));
+
+               //Set a containment if given in the options
+               if(o.containment)
+                       this._setContainment();
+
+               //Trigger event + callbacks
+               if(this._trigger("start", event) === false) {
+                       this._clear();
+                       return false;
+               }
+
+               //Recache the helper size
+               this._cacheHelperProportions();
+
+               //Prepare the droppable offsets
+               if ($.ui.ddmanager && !o.dropBehaviour)
+                       $.ui.ddmanager.prepareOffsets(this, event);
+
+               
+               this._mouseDrag(event, true); //Execute the drag once - this causes the helper not to be visible before getting its correct position
+               
+               //If the ddmanager is used for droppables, inform the manager that dragging has started (see #5003)
+               if ( $.ui.ddmanager ) $.ui.ddmanager.dragStart(this, event);
+               
+               return true;
+       },
+
+       _mouseDrag: function(event, noPropagation) {
+
+               //Compute the helpers position
+               this.position = this._generatePosition(event);
+               this.positionAbs = this._convertPositionTo("absolute");
+
+               //Call plugins and callbacks and use the resulting position if something is returned
+               if (!noPropagation) {
+                       var ui = this._uiHash();
+                       if(this._trigger('drag', event, ui) === false) {
+                               this._mouseUp({});
+                               return false;
+                       }
+                       this.position = ui.position;
+               }
+
+               if(!this.options.axis || this.options.axis != "y") this.helper[0].style.left = this.position.left+'px';
+               if(!this.options.axis || this.options.axis != "x") this.helper[0].style.top = this.position.top+'px';
+               if($.ui.ddmanager) $.ui.ddmanager.drag(this, event);
+
+               return false;
+       },
+
+       _mouseStop: function(event) {
+
+               //If we are using droppables, inform the manager about the drop
+               var dropped = false;
+               if ($.ui.ddmanager && !this.options.dropBehaviour)
+                       dropped = $.ui.ddmanager.drop(this, event);
+
+               //if a drop comes from outside (a sortable)
+               if(this.dropped) {
+                       dropped = this.dropped;
+                       this.dropped = false;
+               }
+               
+               //if the original element is no longer in the DOM don't bother to continue (see #8269)
+               var element = this.element[0], elementInDom = false;
+               while ( element && (element = element.parentNode) ) {
+                       if (element == document ) {
+                               elementInDom = true;
+                       }
+               }
+               if ( !elementInDom && this.options.helper === "original" )
+                       return false;
+
+               if((this.options.revert == "invalid" && !dropped) || (this.options.revert == "valid" && dropped) || this.options.revert === true || ($.isFunction(this.options.revert) && this.options.revert.call(this.element, dropped))) {
+                       var self = this;
+                       $(this.helper).animate(this.originalPosition, parseInt(this.options.revertDuration, 10), function() {
+                               if(self._trigger("stop", event) !== false) {
+                                       self._clear();
+                               }
+                       });
+               } else {
+                       if(this._trigger("stop", event) !== false) {
+                               this._clear();
+                       }
+               }
+
+               return false;
+       },
+       
+       _mouseUp: function(event) {
+               //Remove frame helpers
+               $("div.ui-draggable-iframeFix").each(function() { 
+                       this.parentNode.removeChild(this); 
+               });
+               
+               //If the ddmanager is used for droppables, inform the manager that dragging has stopped (see #5003)
+               if( $.ui.ddmanager ) $.ui.ddmanager.dragStop(this, event);
+               
+               return $.ui.mouse.prototype._mouseUp.call(this, event);
+       },
+       
+       cancel: function() {
+               
+               if(this.helper.is(".ui-draggable-dragging")) {
+                       this._mouseUp({});
+               } else {
+                       this._clear();
+               }
+               
+               return this;
+               
+       },
+
+       _getHandle: function(event) {
+
+               var handle = !this.options.handle || !$(this.options.handle, this.element).length ? true : false;
+               $(this.options.handle, this.element)
+                       .find("*")
+                       .andSelf()
+                       .each(function() {
+                               if(this == event.target) handle = true;
+                       });
+
+               return handle;
+
+       },
+
+       _createHelper: function(event) {
+
+               var o = this.options;
+               var helper = $.isFunction(o.helper) ? $(o.helper.apply(this.element[0], [event])) : (o.helper == 'clone' ? this.element.clone().removeAttr('id') : this.element);
+
+               if(!helper.parents('body').length)
+                       helper.appendTo((o.appendTo == 'parent' ? this.element[0].parentNode : o.appendTo));
+
+               if(helper[0] != this.element[0] && !(/(fixed|absolute)/).test(helper.css("position")))
+                       helper.css("position", "absolute");
+
+               return helper;
+
+       },
+
+       _adjustOffsetFromHelper: function(obj) {
+               if (typeof obj == 'string') {
+                       obj = obj.split(' ');
+               }
+               if ($.isArray(obj)) {
+                       obj = {left: +obj[0], top: +obj[1] || 0};
+               }
+               if ('left' in obj) {
+                       this.offset.click.left = obj.left + this.margins.left;
+               }
+               if ('right' in obj) {
+                       this.offset.click.left = this.helperProportions.width - obj.right + this.margins.left;
+               }
+               if ('top' in obj) {
+                       this.offset.click.top = obj.top + this.margins.top;
+               }
+               if ('bottom' in obj) {
+                       this.offset.click.top = this.helperProportions.height - obj.bottom + this.margins.top;
+               }
+       },
+
+       _getParentOffset: function() {
+
+               //Get the offsetParent and cache its position
+               this.offsetParent = this.helper.offsetParent();
+               var po = this.offsetParent.offset();
+
+               // This is a special case where we need to modify a offset calculated on start, since the following happened:
+               // 1. The position of the helper is absolute, so it's position is calculated based on the next positioned parent
+               // 2. The actual offset parent is a child of the scroll parent, and the scroll parent isn't the document, which means that
+               //    the scroll is included in the initial calculation of the offset of the parent, and never recalculated upon drag
+               if(this.cssPosition == 'absolute' && this.scrollParent[0] != document && $.ui.contains(this.scrollParent[0], this.offsetParent[0])) {
+                       po.left += this.scrollParent.scrollLeft();
+                       po.top += this.scrollParent.scrollTop();
+               }
+
+               if((this.offsetParent[0] == document.body) //This needs to be actually done for all browsers, since pageX/pageY includes this information
+               || (this.offsetParent[0].tagName && this.offsetParent[0].tagName.toLowerCase() == 'html' && $.browser.msie)) //Ugly IE fix
+                       po = { top: 0, left: 0 };
+
+               return {
+                       top: po.top + (parseInt(this.offsetParent.css("borderTopWidth"),10) || 0),
+                       left: po.left + (parseInt(this.offsetParent.css("borderLeftWidth"),10) || 0)
+               };
+
+       },
+
+       _getRelativeOffset: function() {
+
+               if(this.cssPosition == "relative") {
+                       var p = this.element.position();
+                       return {
+                               top: p.top - (parseInt(this.helper.css("top"),10) || 0) + this.scrollParent.scrollTop(),
+                               left: p.left - (parseInt(this.helper.css("left"),10) || 0) + this.scrollParent.scrollLeft()
+                       };
+               } else {
+                       return { top: 0, left: 0 };
+               }
+
+       },
+
+       _cacheMargins: function() {
+               this.margins = {
+                       left: (parseInt(this.element.css("marginLeft"),10) || 0),
+                       top: (parseInt(this.element.css("marginTop"),10) || 0),
+                       right: (parseInt(this.element.css("marginRight"),10) || 0),
+                       bottom: (parseInt(this.element.css("marginBottom"),10) || 0)
+               };
+       },
+
+       _cacheHelperProportions: function() {
+               this.helperProportions = {
+                       width: this.helper.outerWidth(),
+                       height: this.helper.outerHeight()
+               };
+       },
+
+       _setContainment: function() {
+
+               var o = this.options;
+               if(o.containment == 'parent') o.containment = this.helper[0].parentNode;
+               if(o.containment == 'document' || o.containment == 'window') this.containment = [
+                       o.containment == 'document' ? 0 : $(window).scrollLeft() - this.offset.relative.left - this.offset.parent.left,
+                       o.containment == 'document' ? 0 : $(window).scrollTop() - this.offset.relative.top - this.offset.parent.top,
+                       (o.containment == 'document' ? 0 : $(window).scrollLeft()) + $(o.containment == 'document' ? document : window).width() - this.helperProportions.width - this.margins.left,
+                       (o.containment == 'document' ? 0 : $(window).scrollTop()) + ($(o.containment == 'document' ? document : window).height() || document.body.parentNode.scrollHeight) - this.helperProportions.height - this.margins.top
+               ];
+
+               if(!(/^(document|window|parent)$/).test(o.containment) && o.containment.constructor != Array) {
+                       var c = $(o.containment);
+                       var ce = c[0]; if(!ce) return;
+                       var co = c.offset();
+                       var over = ($(ce).css("overflow") != 'hidden');
+
+                       this.containment = [
+                               (parseInt($(ce).css("borderLeftWidth"),10) || 0) + (parseInt($(ce).css("paddingLeft"),10) || 0),
+                               (parseInt($(ce).css("borderTopWidth"),10) || 0) + (parseInt($(ce).css("paddingTop"),10) || 0),
+                               (over ? Math.max(ce.scrollWidth,ce.offsetWidth) : ce.offsetWidth) - (parseInt($(ce).css("borderLeftWidth"),10) || 0) - (parseInt($(ce).css("paddingRight"),10) || 0) - this.helperProportions.width - this.margins.left - this.margins.right,
+                               (over ? Math.max(ce.scrollHeight,ce.offsetHeight) : ce.offsetHeight) - (parseInt($(ce).css("borderTopWidth"),10) || 0) - (parseInt($(ce).css("paddingBottom"),10) || 0) - this.helperProportions.height - this.margins.top  - this.margins.bottom
+                       ];
+                       this.relative_container = c;
+
+               } else if(o.containment.constructor == Array) {
+                       this.containment = o.containment;
+               }
+
+       },
+
+       _convertPositionTo: function(d, pos) {
+
+               if(!pos) pos = this.position;
+               var mod = d == "absolute" ? 1 : -1;
+               var o = this.options, scroll = this.cssPosition == 'absolute' && !(this.scrollParent[0] != document && $.ui.contains(this.scrollParent[0], this.offsetParent[0])) ? this.offsetParent : this.scrollParent, scrollIsRootNode = (/(html|body)/i).test(scroll[0].tagName);
+
+               return {
+                       top: (
+                               pos.top                                                                                                                                 // The absolute mouse position
+                               + this.offset.relative.top * mod                                                                                // Only for relative positioned nodes: Relative offset from element to offset parent
+                               + this.offset.parent.top * mod                                                                                  // The offsetParent's offset without borders (offset + border)
+                               - ($.browser.safari && $.browser.version < 526 && this.cssPosition == 'fixed' ? 0 : ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollTop() : ( scrollIsRootNode ? 0 : scroll.scrollTop() ) ) * mod)
+                       ),
+                       left: (
+                               pos.left                                                                                                                                // The absolute mouse position
+                               + this.offset.relative.left * mod                                                                               // Only for relative positioned nodes: Relative offset from element to offset parent
+                               + this.offset.parent.left * mod                                                                                 // The offsetParent's offset without borders (offset + border)
+                               - ($.browser.safari && $.browser.version < 526 && this.cssPosition == 'fixed' ? 0 : ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollLeft() : scrollIsRootNode ? 0 : scroll.scrollLeft() ) * mod)
+                       )
+               };
+
+       },
+
+       _generatePosition: function(event) {
+
+               var o = this.options, scroll = this.cssPosition == 'absolute' && !(this.scrollParent[0] != document && $.ui.contains(this.scrollParent[0], this.offsetParent[0])) ? this.offsetParent : this.scrollParent, scrollIsRootNode = (/(html|body)/i).test(scroll[0].tagName);
+               var pageX = event.pageX;
+               var pageY = event.pageY;
+
+               /*
+                * - Position constraining -
+                * Constrain the position to a mix of grid, containment.
+                */
+
+               if(this.originalPosition) { //If we are not dragging yet, we won't check for options
+                        var containment;
+                        if(this.containment) {
+                                if (this.relative_container){
+                                    var co = this.relative_container.offset();
+                                    containment = [ this.containment[0] + co.left,
+                                                    this.containment[1] + co.top,
+                                                    this.containment[2] + co.left,
+                                                    this.containment[3] + co.top ];
+                                }
+                                else {
+                                    containment = this.containment;
+                                }
+
+                               if(event.pageX - this.offset.click.left < containment[0]) pageX = containment[0] + this.offset.click.left;
+                               if(event.pageY - this.offset.click.top < containment[1]) pageY = containment[1] + this.offset.click.top;
+                               if(event.pageX - this.offset.click.left > containment[2]) pageX = containment[2] + this.offset.click.left;
+                               if(event.pageY - this.offset.click.top > containment[3]) pageY = containment[3] + this.offset.click.top;
+                       }
+
+                       if(o.grid) {
+                               //Check for grid elements set to 0 to prevent divide by 0 error causing invalid argument errors in IE (see ticket #6950)
+                               var top = o.grid[1] ? this.originalPageY + Math.round((pageY - this.originalPageY) / o.grid[1]) * o.grid[1] : this.originalPageY;
+                               pageY = containment ? (!(top - this.offset.click.top < containment[1] || top - this.offset.click.top > containment[3]) ? top : (!(top - this.offset.click.top < containment[1]) ? top - o.grid[1] : top + o.grid[1])) : top;
+
+                               var left = o.grid[0] ? this.originalPageX + Math.round((pageX - this.originalPageX) / o.grid[0]) * o.grid[0] : this.originalPageX;
+                               pageX = containment ? (!(left - this.offset.click.left < containment[0] || left - this.offset.click.left > containment[2]) ? left : (!(left - this.offset.click.left < containment[0]) ? left - o.grid[0] : left + o.grid[0])) : left;
+                       }
+
+               }
+
+               return {
+                       top: (
+                               pageY                                                                                                                           // The absolute mouse position
+                               - this.offset.click.top                                                                                                 // Click offset (relative to the element)
+                               - this.offset.relative.top                                                                                              // Only for relative positioned nodes: Relative offset from element to offset parent
+                               - this.offset.parent.top                                                                                                // The offsetParent's offset without borders (offset + border)
+                               + ($.browser.safari && $.browser.version < 526 && this.cssPosition == 'fixed' ? 0 : ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollTop() : ( scrollIsRootNode ? 0 : scroll.scrollTop() ) ))
+                       ),
+                       left: (
+                               pageX                                                                                                                           // The absolute mouse position
+                               - this.offset.click.left                                                                                                // Click offset (relative to the element)
+                               - this.offset.relative.left                                                                                             // Only for relative positioned nodes: Relative offset from element to offset parent
+                               - this.offset.parent.left                                                                                               // The offsetParent's offset without borders (offset + border)
+                               + ($.browser.safari && $.browser.version < 526 && this.cssPosition == 'fixed' ? 0 : ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollLeft() : scrollIsRootNode ? 0 : scroll.scrollLeft() ))
+                       )
+               };
+
+       },
+
+       _clear: function() {
+               this.helper.removeClass("ui-draggable-dragging");
+               if(this.helper[0] != this.element[0] && !this.cancelHelperRemoval) this.helper.remove();
+               //if($.ui.ddmanager) $.ui.ddmanager.current = null;
+               this.helper = null;
+               this.cancelHelperRemoval = false;
+       },
+
+       // From now on bulk stuff - mainly helpers
+
+       _trigger: function(type, event, ui) {
+               ui = ui || this._uiHash();
+               $.ui.plugin.call(this, type, [event, ui]);
+               if(type == "drag") this.positionAbs = this._convertPositionTo("absolute"); //The absolute position has to be recalculated after plugins
+               return $.Widget.prototype._trigger.call(this, type, event, ui);
+       },
+
+       plugins: {},
+
+       _uiHash: function(event) {
+               return {
+                       helper: this.helper,
+                       position: this.position,
+                       originalPosition: this.originalPosition,
+                       offset: this.positionAbs
+               };
+       }
+
+});
+
+$.extend($.ui.draggable, {
+       version: "1.8.24"
+});
+
+$.ui.plugin.add("draggable", "connectToSortable", {
+       start: function(event, ui) {
+
+               var inst = $(this).data("draggable"), o = inst.options,
+                       uiSortable = $.extend({}, ui, { item: inst.element });
+               inst.sortables = [];
+               $(o.connectToSortable).each(function() {
+                       var sortable = $.data(this, 'sortable');
+                       if (sortable && !sortable.options.disabled) {
+                               inst.sortables.push({
+                                       instance: sortable,
+                                       shouldRevert: sortable.options.revert
+                               });
+                               sortable.refreshPositions();    // Call the sortable's refreshPositions at drag start to refresh the containerCache since the sortable container cache is used in drag and needs to be up to date (this will ensure it's initialised as well as being kept in step with any changes that might have happened on the page).
+                               sortable._trigger("activate", event, uiSortable);
+                       }
+               });
+
+       },
+       stop: function(event, ui) {
+
+               //If we are still over the sortable, we fake the stop event of the sortable, but also remove helper
+               var inst = $(this).data("draggable"),
+                       uiSortable = $.extend({}, ui, { item: inst.element });
+
+               $.each(inst.sortables, function() {
+                       if(this.instance.isOver) {
+
+                               this.instance.isOver = 0;
+
+                               inst.cancelHelperRemoval = true; //Don't remove the helper in the draggable instance
+                               this.instance.cancelHelperRemoval = false; //Remove it in the sortable instance (so sortable plugins like revert still work)
+
+                               //The sortable revert is supported, and we have to set a temporary dropped variable on the draggable to support revert: 'valid/invalid'
+                               if(this.shouldRevert) this.instance.options.revert = true;
+
+                               //Trigger the stop of the sortable
+                               this.instance._mouseStop(event);
+
+                               this.instance.options.helper = this.instance.options._helper;
+
+                               //If the helper has been the original item, restore properties in the sortable
+                               if(inst.options.helper == 'original')
+                                       this.instance.currentItem.css({ top: 'auto', left: 'auto' });
+
+                       } else {
+                               this.instance.cancelHelperRemoval = false; //Remove the helper in the sortable instance
+                               this.instance._trigger("deactivate", event, uiSortable);
+                       }
+
+               });
+
+       },
+       drag: function(event, ui) {
+
+               var inst = $(this).data("draggable"), self = this;
+
+               var checkPos = function(o) {
+                       var dyClick = this.offset.click.top, dxClick = this.offset.click.left;
+                       var helperTop = this.positionAbs.top, helperLeft = this.positionAbs.left;
+                       var itemHeight = o.height, itemWidth = o.width;
+                       var itemTop = o.top, itemLeft = o.left;
+
+                       return $.ui.isOver(helperTop + dyClick, helperLeft + dxClick, itemTop, itemLeft, itemHeight, itemWidth);
+               };
+
+               $.each(inst.sortables, function(i) {
+                       
+                       //Copy over some variables to allow calling the sortable's native _intersectsWith
+                       this.instance.positionAbs = inst.positionAbs;
+                       this.instance.helperProportions = inst.helperProportions;
+                       this.instance.offset.click = inst.offset.click;
+                       
+                       if(this.instance._intersectsWith(this.instance.containerCache)) {
+
+                               //If it intersects, we use a little isOver variable and set it once, so our move-in stuff gets fired only once
+                               if(!this.instance.isOver) {
+
+                                       this.instance.isOver = 1;
+                                       //Now we fake the start of dragging for the sortable instance,
+                                       //by cloning the list group item, appending it to the sortable and using it as inst.currentItem
+                                       //We can then fire the start event of the sortable with our passed browser event, and our own helper (so it doesn't create a new one)
+                                       this.instance.currentItem = $(self).clone().removeAttr('id').appendTo(this.instance.element).data("sortable-item", true);
+                                       this.instance.options._helper = this.instance.options.helper; //Store helper option to later restore it
+                                       this.instance.options.helper = function() { return ui.helper[0]; };
+
+                                       event.target = this.instance.currentItem[0];
+                                       this.instance._mouseCapture(event, true);
+                                       this.instance._mouseStart(event, true, true);
+
+                                       //Because the browser event is way off the new appended portlet, we modify a couple of variables to reflect the changes
+                                       this.instance.offset.click.top = inst.offset.click.top;
+                                       this.instance.offset.click.left = inst.offset.click.left;
+                                       this.instance.offset.parent.left -= inst.offset.parent.left - this.instance.offset.parent.left;
+                                       this.instance.offset.parent.top -= inst.offset.parent.top - this.instance.offset.parent.top;
+
+                                       inst._trigger("toSortable", event);
+                                       inst.dropped = this.instance.element; //draggable revert needs that
+                                       //hack so receive/update callbacks work (mostly)
+                                       inst.currentItem = inst.element;
+                                       this.instance.fromOutside = inst;
+
+                               }
+
+                               //Provided we did all the previous steps, we can fire the drag event of the sortable on every draggable drag, when it intersects with the sortable
+                               if(this.instance.currentItem) this.instance._mouseDrag(event);
+
+                       } else {
+
+                               //If it doesn't intersect with the sortable, and it intersected before,
+                               //we fake the drag stop of the sortable, but make sure it doesn't remove the helper by using cancelHelperRemoval
+                               if(this.instance.isOver) {
+
+                                       this.instance.isOver = 0;
+                                       this.instance.cancelHelperRemoval = true;
+                                       
+                                       //Prevent reverting on this forced stop
+                                       this.instance.options.revert = false;
+                                       
+                                       // The out event needs to be triggered independently
+                                       this.instance._trigger('out', event, this.instance._uiHash(this.instance));
+                                       
+                                       this.instance._mouseStop(event, true);
+                                       this.instance.options.helper = this.instance.options._helper;
+
+                                       //Now we remove our currentItem, the list group clone again, and the placeholder, and animate the helper back to it's original size
+                                       this.instance.currentItem.remove();
+                                       if(this.instance.placeholder) this.instance.placeholder.remove();
+
+                                       inst._trigger("fromSortable", event);
+                                       inst.dropped = false; //draggable revert needs that
+                               }
+
+                       };
+
+               });
+
+       }
+});
+
+$.ui.plugin.add("draggable", "cursor", {
+       start: function(event, ui) {
+               var t = $('body'), o = $(this).data('draggable').options;
+               if (t.css("cursor")) o._cursor = t.css("cursor");
+               t.css("cursor", o.cursor);
+       },
+       stop: function(event, ui) {
+               var o = $(this).data('draggable').options;
+               if (o._cursor) $('body').css("cursor", o._cursor);
+       }
+});
+
+$.ui.plugin.add("draggable", "opacity", {
+       start: function(event, ui) {
+               var t = $(ui.helper), o = $(this).data('draggable').options;
+               if(t.css("opacity")) o._opacity = t.css("opacity");
+               t.css('opacity', o.opacity);
+       },
+       stop: function(event, ui) {
+               var o = $(this).data('draggable').options;
+               if(o._opacity) $(ui.helper).css('opacity', o._opacity);
+       }
+});
+
+$.ui.plugin.add("draggable", "scroll", {
+       start: function(event, ui) {
+               var i = $(this).data("draggable");
+               if(i.scrollParent[0] != document && i.scrollParent[0].tagName != 'HTML') i.overflowOffset = i.scrollParent.offset();
+       },
+       drag: function(event, ui) {
+
+               var i = $(this).data("draggable"), o = i.options, scrolled = false;
+
+               if(i.scrollParent[0] != document && i.scrollParent[0].tagName != 'HTML') {
+
+                       if(!o.axis || o.axis != 'x') {
+                               if((i.overflowOffset.top + i.scrollParent[0].offsetHeight) - event.pageY < o.scrollSensitivity)
+                                       i.scrollParent[0].scrollTop = scrolled = i.scrollParent[0].scrollTop + o.scrollSpeed;
+                               else if(event.pageY - i.overflowOffset.top < o.scrollSensitivity)
+                                       i.scrollParent[0].scrollTop = scrolled = i.scrollParent[0].scrollTop - o.scrollSpeed;
+                       }
+
+                       if(!o.axis || o.axis != 'y') {
+                               if((i.overflowOffset.left + i.scrollParent[0].offsetWidth) - event.pageX < o.scrollSensitivity)
+                                       i.scrollParent[0].scrollLeft = scrolled = i.scrollParent[0].scrollLeft + o.scrollSpeed;
+                               else if(event.pageX - i.overflowOffset.left < o.scrollSensitivity)
+                                       i.scrollParent[0].scrollLeft = scrolled = i.scrollParent[0].scrollLeft - o.scrollSpeed;
+                       }
+
+               } else {
+
+                       if(!o.axis || o.axis != 'x') {
+                               if(event.pageY - $(document).scrollTop() < o.scrollSensitivity)
+                                       scrolled = $(document).scrollTop($(document).scrollTop() - o.scrollSpeed);
+                               else if($(window).height() - (event.pageY - $(document).scrollTop()) < o.scrollSensitivity)
+                                       scrolled = $(document).scrollTop($(document).scrollTop() + o.scrollSpeed);
+                       }
+
+                       if(!o.axis || o.axis != 'y') {
+                               if(event.pageX - $(document).scrollLeft() < o.scrollSensitivity)
+                                       scrolled = $(document).scrollLeft($(document).scrollLeft() - o.scrollSpeed);
+                               else if($(window).width() - (event.pageX - $(document).scrollLeft()) < o.scrollSensitivity)
+                                       scrolled = $(document).scrollLeft($(document).scrollLeft() + o.scrollSpeed);
+                       }
+
+               }
+
+               if(scrolled !== false && $.ui.ddmanager && !o.dropBehaviour)
+                       $.ui.ddmanager.prepareOffsets(i, event);
+
+       }
+});
+
+$.ui.plugin.add("draggable", "snap", {
+       start: function(event, ui) {
+
+               var i = $(this).data("draggable"), o = i.options;
+               i.snapElements = [];
+
+               $(o.snap.constructor != String ? ( o.snap.items || ':data(draggable)' ) : o.snap).each(function() {
+                       var $t = $(this); var $o = $t.offset();
+                       if(this != i.element[0]) i.snapElements.push({
+                               item: this,
+                               width: $t.outerWidth(), height: $t.outerHeight(),
+                               top: $o.top, left: $o.left
+                       });
+               });
+
+       },
+       drag: function(event, ui) {
+
+               var inst = $(this).data("draggable"), o = inst.options;
+               var d = o.snapTolerance;
+
+               var x1 = ui.offset.left, x2 = x1 + inst.helperProportions.width,
+                       y1 = ui.offset.top, y2 = y1 + inst.helperProportions.height;
+
+               for (var i = inst.snapElements.length - 1; i >= 0; i--){
+
+                       var l = inst.snapElements[i].left, r = l + inst.snapElements[i].width,
+                               t = inst.snapElements[i].top, b = t + inst.snapElements[i].height;
+
+                       //Yes, I know, this is insane ;)
+                       if(!((l-d < x1 && x1 < r+d && t-d < y1 && y1 < b+d) || (l-d < x1 && x1 < r+d && t-d < y2 && y2 < b+d) || (l-d < x2 && x2 < r+d && t-d < y1 && y1 < b+d) || (l-d < x2 && x2 < r+d && t-d < y2 && y2 < b+d))) {
+                               if(inst.snapElements[i].snapping) (inst.options.snap.release && inst.options.snap.release.call(inst.element, event, $.extend(inst._uiHash(), { snapItem: inst.snapElements[i].item })));
+                               inst.snapElements[i].snapping = false;
+                               continue;
+                       }
+
+                       if(o.snapMode != 'inner') {
+                               var ts = Math.abs(t - y2) <= d;
+                               var bs = Math.abs(b - y1) <= d;
+                               var ls = Math.abs(l - x2) <= d;
+                               var rs = Math.abs(r - x1) <= d;
+                               if(ts) ui.position.top = inst._convertPositionTo("relative", { top: t - inst.helperProportions.height, left: 0 }).top - inst.margins.top;
+                               if(bs) ui.position.top = inst._convertPositionTo("relative", { top: b, left: 0 }).top - inst.margins.top;
+                               if(ls) ui.position.left = inst._convertPositionTo("relative", { top: 0, left: l - inst.helperProportions.width }).left - inst.margins.left;
+                               if(rs) ui.position.left = inst._convertPositionTo("relative", { top: 0, left: r }).left - inst.margins.left;
+                       }
+
+                       var first = (ts || bs || ls || rs);
+
+                       if(o.snapMode != 'outer') {
+                               var ts = Math.abs(t - y1) <= d;
+                               var bs = Math.abs(b - y2) <= d;
+                               var ls = Math.abs(l - x1) <= d;
+                               var rs = Math.abs(r - x2) <= d;
+                               if(ts) ui.position.top = inst._convertPositionTo("relative", { top: t, left: 0 }).top - inst.margins.top;
+                               if(bs) ui.position.top = inst._convertPositionTo("relative", { top: b - inst.helperProportions.height, left: 0 }).top - inst.margins.top;
+                               if(ls) ui.position.left = inst._convertPositionTo("relative", { top: 0, left: l }).left - inst.margins.left;
+                               if(rs) ui.position.left = inst._convertPositionTo("relative", { top: 0, left: r - inst.helperProportions.width }).left - inst.margins.left;
+                       }
+
+                       if(!inst.snapElements[i].snapping && (ts || bs || ls || rs || first))
+                               (inst.options.snap.snap && inst.options.snap.snap.call(inst.element, event, $.extend(inst._uiHash(), { snapItem: inst.snapElements[i].item })));
+                       inst.snapElements[i].snapping = (ts || bs || ls || rs || first);
+
+               };
+
+       }
+});
+
+$.ui.plugin.add("draggable", "stack", {
+       start: function(event, ui) {
+
+               var o = $(this).data("draggable").options;
+
+               var group = $.makeArray($(o.stack)).sort(function(a,b) {
+                       return (parseInt($(a).css("zIndex"),10) || 0) - (parseInt($(b).css("zIndex"),10) || 0);
+               });
+               if (!group.length) { return; }
+               
+               var min = parseInt(group[0].style.zIndex) || 0;
+               $(group).each(function(i) {
+                       this.style.zIndex = min + i;
+               });
+
+               this[0].style.zIndex = min + group.length;
+
+       }
+});
+
+$.ui.plugin.add("draggable", "zIndex", {
+       start: function(event, ui) {
+               var t = $(ui.helper), o = $(this).data("draggable").options;
+               if(t.css("zIndex")) o._zIndex = t.css("zIndex");
+               t.css('zIndex', o.zIndex);
+       },
+       stop: function(event, ui) {
+               var o = $(this).data("draggable").options;
+               if(o._zIndex) $(ui.helper).css('zIndex', o._zIndex);
+       }
+});
+
+})(jQuery);
diff --git a/resources/lib/jquery.ui/jquery.ui.droppable.js b/resources/lib/jquery.ui/jquery.ui.droppable.js
new file mode 100644 (file)
index 0000000..f17c222
--- /dev/null
@@ -0,0 +1,301 @@
+/*!
+ * jQuery UI Droppable 1.8.24
+ *
+ * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Droppables
+ *
+ * Depends:
+ *     jquery.ui.core.js
+ *     jquery.ui.widget.js
+ *     jquery.ui.mouse.js
+ *     jquery.ui.draggable.js
+ */
+(function( $, undefined ) {
+
+$.widget("ui.droppable", {
+       widgetEventPrefix: "drop",
+       options: {
+               accept: '*',
+               activeClass: false,
+               addClasses: true,
+               greedy: false,
+               hoverClass: false,
+               scope: 'default',
+               tolerance: 'intersect'
+       },
+       _create: function() {
+
+               var o = this.options, accept = o.accept;
+               this.isover = 0; this.isout = 1;
+
+               this.accept = $.isFunction(accept) ? accept : function(d) {
+                       return d.is(accept);
+               };
+
+               //Store the droppable's proportions
+               this.proportions = { width: this.element[0].offsetWidth, height: this.element[0].offsetHeight };
+
+               // Add the reference and positions to the manager
+               $.ui.ddmanager.droppables[o.scope] = $.ui.ddmanager.droppables[o.scope] || [];
+               $.ui.ddmanager.droppables[o.scope].push(this);
+
+               (o.addClasses && this.element.addClass("ui-droppable"));
+
+       },
+
+       destroy: function() {
+               var drop = $.ui.ddmanager.droppables[this.options.scope];
+               for ( var i = 0; i < drop.length; i++ )
+                       if ( drop[i] == this )
+                               drop.splice(i, 1);
+
+               this.element
+                       .removeClass("ui-droppable ui-droppable-disabled")
+                       .removeData("droppable")
+                       .unbind(".droppable");
+
+               return this;
+       },
+
+       _setOption: function(key, value) {
+
+               if(key == 'accept') {
+                       this.accept = $.isFunction(value) ? value : function(d) {
+                               return d.is(value);
+                       };
+               }
+               $.Widget.prototype._setOption.apply(this, arguments);
+       },
+
+       _activate: function(event) {
+               var draggable = $.ui.ddmanager.current;
+               if(this.options.activeClass) this.element.addClass(this.options.activeClass);
+               (draggable && this._trigger('activate', event, this.ui(draggable)));
+       },
+
+       _deactivate: function(event) {
+               var draggable = $.ui.ddmanager.current;
+               if(this.options.activeClass) this.element.removeClass(this.options.activeClass);
+               (draggable && this._trigger('deactivate', event, this.ui(draggable)));
+       },
+
+       _over: function(event) {
+
+               var draggable = $.ui.ddmanager.current;
+               if (!draggable || (draggable.currentItem || draggable.element)[0] == this.element[0]) return; // Bail if draggable and droppable are same element
+
+               if (this.accept.call(this.element[0],(draggable.currentItem || draggable.element))) {
+                       if(this.options.hoverClass) this.element.addClass(this.options.hoverClass);
+                       this._trigger('over', event, this.ui(draggable));
+               }
+
+       },
+
+       _out: function(event) {
+
+               var draggable = $.ui.ddmanager.current;
+               if (!draggable || (draggable.currentItem || draggable.element)[0] == this.element[0]) return; // Bail if draggable and droppable are same element
+
+               if (this.accept.call(this.element[0],(draggable.currentItem || draggable.element))) {
+                       if(this.options.hoverClass) this.element.removeClass(this.options.hoverClass);
+                       this._trigger('out', event, this.ui(draggable));
+               }
+
+       },
+
+       _drop: function(event,custom) {
+
+               var draggable = custom || $.ui.ddmanager.current;
+               if (!draggable || (draggable.currentItem || draggable.element)[0] == this.element[0]) return false; // Bail if draggable and droppable are same element
+
+               var childrenIntersection = false;
+               this.element.find(":data(droppable)").not(".ui-draggable-dragging").each(function() {
+                       var inst = $.data(this, 'droppable');
+                       if(
+                               inst.options.greedy
+                               && !inst.options.disabled
+                               && inst.options.scope == draggable.options.scope
+                               && inst.accept.call(inst.element[0], (draggable.currentItem || draggable.element))
+                               && $.ui.intersect(draggable, $.extend(inst, { offset: inst.element.offset() }), inst.options.tolerance)
+                       ) { childrenIntersection = true; return false; }
+               });
+               if(childrenIntersection) return false;
+
+               if(this.accept.call(this.element[0],(draggable.currentItem || draggable.element))) {
+                       if(this.options.activeClass) this.element.removeClass(this.options.activeClass);
+                       if(this.options.hoverClass) this.element.removeClass(this.options.hoverClass);
+                       this._trigger('drop', event, this.ui(draggable));
+                       return this.element;
+               }
+
+               return false;
+
+       },
+
+       ui: function(c) {
+               return {
+                       draggable: (c.currentItem || c.element),
+                       helper: c.helper,
+                       position: c.position,
+                       offset: c.positionAbs
+               };
+       }
+
+});
+
+$.extend($.ui.droppable, {
+       version: "1.8.24"
+});
+
+$.ui.intersect = function(draggable, droppable, toleranceMode) {
+
+       if (!droppable.offset) return false;
+
+       var x1 = (draggable.positionAbs || draggable.position.absolute).left, x2 = x1 + draggable.helperProportions.width,
+               y1 = (draggable.positionAbs || draggable.position.absolute).top, y2 = y1 + draggable.helperProportions.height;
+       var l = droppable.offset.left, r = l + droppable.proportions.width,
+               t = droppable.offset.top, b = t + droppable.proportions.height;
+
+       switch (toleranceMode) {
+               case 'fit':
+                       return (l <= x1 && x2 <= r
+                               && t <= y1 && y2 <= b);
+                       break;
+               case 'intersect':
+                       return (l < x1 + (draggable.helperProportions.width / 2) // Right Half
+                               && x2 - (draggable.helperProportions.width / 2) < r // Left Half
+                               && t < y1 + (draggable.helperProportions.height / 2) // Bottom Half
+                               && y2 - (draggable.helperProportions.height / 2) < b ); // Top Half
+                       break;
+               case 'pointer':
+                       var draggableLeft = ((draggable.positionAbs || draggable.position.absolute).left + (draggable.clickOffset || draggable.offset.click).left),
+                               draggableTop = ((draggable.positionAbs || draggable.position.absolute).top + (draggable.clickOffset || draggable.offset.click).top),
+                               isOver = $.ui.isOver(draggableTop, draggableLeft, t, l, droppable.proportions.height, droppable.proportions.width);
+                       return isOver;
+                       break;
+               case 'touch':
+                       return (
+                                       (y1 >= t && y1 <= b) || // Top edge touching
+                                       (y2 >= t && y2 <= b) || // Bottom edge touching
+                                       (y1 < t && y2 > b)              // Surrounded vertically
+                               ) && (
+                                       (x1 >= l && x1 <= r) || // Left edge touching
+                                       (x2 >= l && x2 <= r) || // Right edge touching
+                                       (x1 < l && x2 > r)              // Surrounded horizontally
+                               );
+                       break;
+               default:
+                       return false;
+                       break;
+               }
+
+};
+
+/*
+       This manager tracks offsets of draggables and droppables
+*/
+$.ui.ddmanager = {
+       current: null,
+       droppables: { 'default': [] },
+       prepareOffsets: function(t, event) {
+
+               var m = $.ui.ddmanager.droppables[t.options.scope] || [];
+               var type = event ? event.type : null; // workaround for #2317
+               var list = (t.currentItem || t.element).find(":data(droppable)").andSelf();
+
+               droppablesLoop: for (var i = 0; i < m.length; i++) {
+
+                       if(m[i].options.disabled || (t && !m[i].accept.call(m[i].element[0],(t.currentItem || t.element)))) continue;   //No disabled and non-accepted
+                       for (var j=0; j < list.length; j++) { if(list[j] == m[i].element[0]) { m[i].proportions.height = 0; continue droppablesLoop; } }; //Filter out elements in the current dragged item
+                       m[i].visible = m[i].element.css("display") != "none"; if(!m[i].visible) continue;                                                                       //If the element is not visible, continue
+
+                       if(type == "mousedown") m[i]._activate.call(m[i], event); //Activate the droppable if used directly from draggables
+
+                       m[i].offset = m[i].element.offset();
+                       m[i].proportions = { width: m[i].element[0].offsetWidth, height: m[i].element[0].offsetHeight };
+
+               }
+
+       },
+       drop: function(draggable, event) {
+
+               var dropped = false;
+               $.each($.ui.ddmanager.droppables[draggable.options.scope] || [], function() {
+
+                       if(!this.options) return;
+                       if (!this.options.disabled && this.visible && $.ui.intersect(draggable, this, this.options.tolerance))
+                               dropped = this._drop.call(this, event) || dropped;
+
+                       if (!this.options.disabled && this.visible && this.accept.call(this.element[0],(draggable.currentItem || draggable.element))) {
+                               this.isout = 1; this.isover = 0;
+                               this._deactivate.call(this, event);
+                       }
+
+               });
+               return dropped;
+
+       },
+       dragStart: function( draggable, event ) {
+               //Listen for scrolling so that if the dragging causes scrolling the position of the droppables can be recalculated (see #5003)
+               draggable.element.parents( ":not(body,html)" ).bind( "scroll.droppable", function() {
+                       if( !draggable.options.refreshPositions ) $.ui.ddmanager.prepareOffsets( draggable, event );
+               });
+       },
+       drag: function(draggable, event) {
+
+               //If you have a highly dynamic page, you might try this option. It renders positions every time you move the mouse.
+               if(draggable.options.refreshPositions) $.ui.ddmanager.prepareOffsets(draggable, event);
+
+               //Run through all droppables and check their positions based on specific tolerance options
+               $.each($.ui.ddmanager.droppables[draggable.options.scope] || [], function() {
+
+                       if(this.options.disabled || this.greedyChild || !this.visible) return;
+                       var intersects = $.ui.intersect(draggable, this, this.options.tolerance);
+
+                       var c = !intersects && this.isover == 1 ? 'isout' : (intersects && this.isover == 0 ? 'isover' : null);
+                       if(!c) return;
+
+                       var parentInstance;
+                       if (this.options.greedy) {
+                               // find droppable parents with same scope
+                               var scope = this.options.scope;
+                               var parent = this.element.parents(':data(droppable)').filter(function () {
+                                       return $.data(this, 'droppable').options.scope === scope;
+                               });
+
+                               if (parent.length) {
+                                       parentInstance = $.data(parent[0], 'droppable');
+                                       parentInstance.greedyChild = (c == 'isover' ? 1 : 0);
+                               }
+                       }
+
+                       // we just moved into a greedy child
+                       if (parentInstance && c == 'isover') {
+                               parentInstance['isover'] = 0;
+                               parentInstance['isout'] = 1;
+                               parentInstance._out.call(parentInstance, event);
+                       }
+
+                       this[c] = 1; this[c == 'isout' ? 'isover' : 'isout'] = 0;
+                       this[c == "isover" ? "_over" : "_out"].call(this, event);
+
+                       // we just moved out of a greedy child
+                       if (parentInstance && c == 'isout') {
+                               parentInstance['isout'] = 0;
+                               parentInstance['isover'] = 1;
+                               parentInstance._over.call(parentInstance, event);
+                       }
+               });
+
+       },
+       dragStop: function( draggable, event ) {
+               draggable.element.parents( ":not(body,html)" ).unbind( "scroll.droppable" );
+               //Call prepareOffsets one final time since IE does not fire return scroll events when overflow was caused by drag (see #5003)
+               if( !draggable.options.refreshPositions ) $.ui.ddmanager.prepareOffsets( draggable, event );
+       }
+};
+
+})(jQuery);
diff --git a/resources/lib/jquery.ui/jquery.ui.mouse.js b/resources/lib/jquery.ui/jquery.ui.mouse.js
new file mode 100644 (file)
index 0000000..52a1786
--- /dev/null
@@ -0,0 +1,167 @@
+/*!
+ * jQuery UI Mouse 1.8.24
+ *
+ * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Mouse
+ *
+ * Depends:
+ *     jquery.ui.widget.js
+ */
+(function( $, undefined ) {
+
+var mouseHandled = false;
+$( document ).mouseup( function( e ) {
+       mouseHandled = false;
+});
+
+$.widget("ui.mouse", {
+       options: {
+               cancel: ':input,option',
+               distance: 1,
+               delay: 0
+       },
+       _mouseInit: function() {
+               var self = this;
+
+               this.element
+                       .bind('mousedown.'+this.widgetName, function(event) {
+                               return self._mouseDown(event);
+                       })
+                       .bind('click.'+this.widgetName, function(event) {
+                               if (true === $.data(event.target, self.widgetName + '.preventClickEvent')) {
+                                   $.removeData(event.target, self.widgetName + '.preventClickEvent');
+                                       event.stopImmediatePropagation();
+                                       return false;
+                               }
+                       });
+
+               this.started = false;
+       },
+
+       // TODO: make sure destroying one instance of mouse doesn't mess with
+       // other instances of mouse
+       _mouseDestroy: function() {
+               this.element.unbind('.'+this.widgetName);
+               if ( this._mouseMoveDelegate ) {
+                       $(document)
+                               .unbind('mousemove.'+this.widgetName, this._mouseMoveDelegate)
+                               .unbind('mouseup.'+this.widgetName, this._mouseUpDelegate);
+               }
+       },
+
+       _mouseDown: function(event) {
+               // don't let more than one widget handle mouseStart
+               if( mouseHandled ) { return };
+
+               // we may have missed mouseup (out of window)
+               (this._mouseStarted && this._mouseUp(event));
+
+               this._mouseDownEvent = event;
+
+               var self = this,
+                       btnIsLeft = (event.which == 1),
+                       // event.target.nodeName works around a bug in IE 8 with
+                       // disabled inputs (#7620)
+                       elIsCancel = (typeof this.options.cancel == "string" && event.target.nodeName ? $(event.target).closest(this.options.cancel).length : false);
+               if (!btnIsLeft || elIsCancel || !this._mouseCapture(event)) {
+                       return true;
+               }
+
+               this.mouseDelayMet = !this.options.delay;
+               if (!this.mouseDelayMet) {
+                       this._mouseDelayTimer = setTimeout(function() {
+                               self.mouseDelayMet = true;
+                       }, this.options.delay);
+               }
+
+               if (this._mouseDistanceMet(event) && this._mouseDelayMet(event)) {
+                       this._mouseStarted = (this._mouseStart(event) !== false);
+                       if (!this._mouseStarted) {
+                               event.preventDefault();
+                               return true;
+                       }
+               }
+
+               // Click event may never have fired (Gecko & Opera)
+               if (true === $.data(event.target, this.widgetName + '.preventClickEvent')) {
+                       $.removeData(event.target, this.widgetName + '.preventClickEvent');
+               }
+
+               // these delegates are required to keep context
+               this._mouseMoveDelegate = function(event) {
+                       return self._mouseMove(event);
+               };
+               this._mouseUpDelegate = function(event) {
+                       return self._mouseUp(event);
+               };
+               $(document)
+                       .bind('mousemove.'+this.widgetName, this._mouseMoveDelegate)
+                       .bind('mouseup.'+this.widgetName, this._mouseUpDelegate);
+
+               event.preventDefault();
+               
+               mouseHandled = true;
+               return true;
+       },
+
+       _mouseMove: function(event) {
+               // IE mouseup check - mouseup happened when mouse was out of window
+               if ($.browser.msie && !(document.documentMode >= 9) && !event.button) {
+                       return this._mouseUp(event);
+               }
+
+               if (this._mouseStarted) {
+                       this._mouseDrag(event);
+                       return event.preventDefault();
+               }
+
+               if (this._mouseDistanceMet(event) && this._mouseDelayMet(event)) {
+                       this._mouseStarted =
+                               (this._mouseStart(this._mouseDownEvent, event) !== false);
+                       (this._mouseStarted ? this._mouseDrag(event) : this._mouseUp(event));
+               }
+
+               return !this._mouseStarted;
+       },
+
+       _mouseUp: function(event) {
+               $(document)
+                       .unbind('mousemove.'+this.widgetName, this._mouseMoveDelegate)
+                       .unbind('mouseup.'+this.widgetName, this._mouseUpDelegate);
+
+               if (this._mouseStarted) {
+                       this._mouseStarted = false;
+
+                       if (event.target == this._mouseDownEvent.target) {
+                           $.data(event.target, this.widgetName + '.preventClickEvent', true);
+                       }
+
+                       this._mouseStop(event);
+               }
+
+               return false;
+       },
+
+       _mouseDistanceMet: function(event) {
+               return (Math.max(
+                               Math.abs(this._mouseDownEvent.pageX - event.pageX),
+                               Math.abs(this._mouseDownEvent.pageY - event.pageY)
+                       ) >= this.options.distance
+               );
+       },
+
+       _mouseDelayMet: function(event) {
+               return this.mouseDelayMet;
+       },
+
+       // These are placeholder methods, to be overriden by extending plugin
+       _mouseStart: function(event) {},
+       _mouseDrag: function(event) {},
+       _mouseStop: function(event) {},
+       _mouseCapture: function(event) { return true; }
+});
+
+})(jQuery);
diff --git a/resources/lib/jquery.ui/jquery.ui.position.js b/resources/lib/jquery.ui/jquery.ui.position.js
new file mode 100644 (file)
index 0000000..8b20179
--- /dev/null
@@ -0,0 +1,308 @@
+/*!
+ * jQuery UI Position 1.8.24
+ *
+ * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Position
+ */
+(function( $, undefined ) {
+
+$.ui = $.ui || {};
+
+var horizontalPositions = /left|center|right/,
+       verticalPositions = /top|center|bottom/,
+       center = "center",
+       support = {},
+       _position = $.fn.position,
+       _offset = $.fn.offset;
+
+$.fn.position = function( options ) {
+       if ( !options || !options.of ) {
+               return _position.apply( this, arguments );
+       }
+
+       // make a copy, we don't want to modify arguments
+       options = $.extend( {}, options );
+
+       var target = $( options.of ),
+               targetElem = target[0],
+               collision = ( options.collision || "flip" ).split( " " ),
+               offset = options.offset ? options.offset.split( " " ) : [ 0, 0 ],
+               targetWidth,
+               targetHeight,
+               basePosition;
+
+       if ( targetElem.nodeType === 9 ) {
+               targetWidth = target.width();
+               targetHeight = target.height();
+               basePosition = { top: 0, left: 0 };
+       // TODO: use $.isWindow() in 1.9
+       } else if ( targetElem.setTimeout ) {
+               targetWidth = target.width();
+               targetHeight = target.height();
+               basePosition = { top: target.scrollTop(), left: target.scrollLeft() };
+       } else if ( targetElem.preventDefault ) {
+               // force left top to allow flipping
+               options.at = "left top";
+               targetWidth = targetHeight = 0;
+               basePosition = { top: options.of.pageY, left: options.of.pageX };
+       } else {
+               targetWidth = target.outerWidth();
+               targetHeight = target.outerHeight();
+               basePosition = target.offset();
+       }
+
+       // force my and at to have valid horizontal and veritcal positions
+       // if a value is missing or invalid, it will be converted to center 
+       $.each( [ "my", "at" ], function() {
+               var pos = ( options[this] || "" ).split( " " );
+               if ( pos.length === 1) {
+                       pos = horizontalPositions.test( pos[0] ) ?
+                               pos.concat( [center] ) :
+                               verticalPositions.test( pos[0] ) ?
+                                       [ center ].concat( pos ) :
+                                       [ center, center ];
+               }
+               pos[ 0 ] = horizontalPositions.test( pos[0] ) ? pos[ 0 ] : center;
+               pos[ 1 ] = verticalPositions.test( pos[1] ) ? pos[ 1 ] : center;
+               options[ this ] = pos;
+       });
+
+       // normalize collision option
+       if ( collision.length === 1 ) {
+               collision[ 1 ] = collision[ 0 ];
+       }
+
+       // normalize offset option
+       offset[ 0 ] = parseInt( offset[0], 10 ) || 0;
+       if ( offset.length === 1 ) {
+               offset[ 1 ] = offset[ 0 ];
+       }
+       offset[ 1 ] = parseInt( offset[1], 10 ) || 0;
+
+       if ( options.at[0] === "right" ) {
+               basePosition.left += targetWidth;
+       } else if ( options.at[0] === center ) {
+               basePosition.left += targetWidth / 2;
+       }
+
+       if ( options.at[1] === "bottom" ) {
+               basePosition.top += targetHeight;
+       } else if ( options.at[1] === center ) {
+               basePosition.top += targetHeight / 2;
+       }
+
+       basePosition.left += offset[ 0 ];
+       basePosition.top += offset[ 1 ];
+
+       return this.each(function() {
+               var elem = $( this ),
+                       elemWidth = elem.outerWidth(),
+                       elemHeight = elem.outerHeight(),
+                       marginLeft = parseInt( $.curCSS( this, "marginLeft", true ) ) || 0,
+                       marginTop = parseInt( $.curCSS( this, "marginTop", true ) ) || 0,
+                       collisionWidth = elemWidth + marginLeft +
+                               ( parseInt( $.curCSS( this, "marginRight", true ) ) || 0 ),
+                       collisionHeight = elemHeight + marginTop +
+                               ( parseInt( $.curCSS( this, "marginBottom", true ) ) || 0 ),
+                       position = $.extend( {}, basePosition ),
+                       collisionPosition;
+
+               if ( options.my[0] === "right" ) {
+                       position.left -= elemWidth;
+               } else if ( options.my[0] === center ) {
+                       position.left -= elemWidth / 2;
+               }
+
+               if ( options.my[1] === "bottom" ) {
+                       position.top -= elemHeight;
+               } else if ( options.my[1] === center ) {
+                       position.top -= elemHeight / 2;
+               }
+
+               // prevent fractions if jQuery version doesn't support them (see #5280)
+               if ( !support.fractions ) {
+                       position.left = Math.round( position.left );
+                       position.top = Math.round( position.top );
+               }
+
+               collisionPosition = {
+                       left: position.left - marginLeft,
+                       top: position.top - marginTop
+               };
+
+               $.each( [ "left", "top" ], function( i, dir ) {
+                       if ( $.ui.position[ collision[i] ] ) {
+                               $.ui.position[ collision[i] ][ dir ]( position, {
+                                       targetWidth: targetWidth,
+                                       targetHeight: targetHeight,
+                                       elemWidth: elemWidth,
+                                       elemHeight: elemHeight,
+                                       collisionPosition: collisionPosition,
+                                       collisionWidth: collisionWidth,
+                                       collisionHeight: collisionHeight,
+                                       offset: offset,
+                                       my: options.my,
+                                       at: options.at
+                               });
+                       }
+               });
+
+               if ( $.fn.bgiframe ) {
+                       elem.bgiframe();
+               }
+               elem.offset( $.extend( position, { using: options.using } ) );
+       });
+};
+
+$.ui.position = {
+       fit: {
+               left: function( position, data ) {
+                       var win = $( window ),
+                               over = data.collisionPosition.left + data.collisionWidth - win.width() - win.scrollLeft();
+                       position.left = over > 0 ? position.left - over : Math.max( position.left - data.collisionPosition.left, position.left );
+               },
+               top: function( position, data ) {
+                       var win = $( window ),
+                               over = data.collisionPosition.top + data.collisionHeight - win.height() - win.scrollTop();
+                       position.top = over > 0 ? position.top - over : Math.max( position.top - data.collisionPosition.top, position.top );
+               }
+       },
+
+       flip: {
+               left: function( position, data ) {
+                       if ( data.at[0] === center ) {
+                               return;
+                       }
+                       var win = $( window ),
+                               over = data.collisionPosition.left + data.collisionWidth - win.width() - win.scrollLeft(),
+                               myOffset = data.my[ 0 ] === "left" ?
+                                       -data.elemWidth :
+                                       data.my[ 0 ] === "right" ?
+                                               data.elemWidth :
+                                               0,
+                               atOffset = data.at[ 0 ] === "left" ?
+                                       data.targetWidth :
+                                       -data.targetWidth,
+                               offset = -2 * data.offset[ 0 ];
+                       position.left += data.collisionPosition.left < 0 ?
+                               myOffset + atOffset + offset :
+                               over > 0 ?
+                                       myOffset + atOffset + offset :
+                                       0;
+               },
+               top: function( position, data ) {
+                       if ( data.at[1] === center ) {
+                               return;
+                       }
+                       var win = $( window ),
+                               over = data.collisionPosition.top + data.collisionHeight - win.height() - win.scrollTop(),
+                               myOffset = data.my[ 1 ] === "top" ?
+                                       -data.elemHeight :
+                                       data.my[ 1 ] === "bottom" ?
+                                               data.elemHeight :
+                                               0,
+                               atOffset = data.at[ 1 ] === "top" ?
+                                       data.targetHeight :
+                                       -data.targetHeight,
+                               offset = -2 * data.offset[ 1 ];
+                       position.top += data.collisionPosition.top < 0 ?
+                               myOffset + atOffset + offset :
+                               over > 0 ?
+                                       myOffset + atOffset + offset :
+                                       0;
+               }
+       }
+};
+
+// offset setter from jQuery 1.4
+if ( !$.offset.setOffset ) {
+       $.offset.setOffset = function( elem, options ) {
+               // set position first, in-case top/left are set even on static elem
+               if ( /static/.test( $.curCSS( elem, "position" ) ) ) {
+                       elem.style.position = "relative";
+               }
+               var curElem   = $( elem ),
+                       curOffset = curElem.offset(),
+                       curTop    = parseInt( $.curCSS( elem, "top",  true ), 10 ) || 0,
+                       curLeft   = parseInt( $.curCSS( elem, "left", true ), 10)  || 0,
+                       props     = {
+                               top:  (options.top  - curOffset.top)  + curTop,
+                               left: (options.left - curOffset.left) + curLeft
+                       };
+               
+               if ( 'using' in options ) {
+                       options.using.call( elem, props );
+               } else {
+                       curElem.css( props );
+               }
+       };
+
+       $.fn.offset = function( options ) {
+               var elem = this[ 0 ];
+               if ( !elem || !elem.ownerDocument ) { return null; }
+               if ( options ) {
+                       if ( $.isFunction( options ) ) {
+                               return this.each(function( i ) {
+                                       $( this ).offset( options.call( this, i, $( this ).offset() ) );
+                               });
+                       }
+                       return this.each(function() {
+                               $.offset.setOffset( this, options );
+                       });
+               }
+               return _offset.call( this );
+       };
+}
+
+// jQuery <1.4.3 uses curCSS, in 1.4.3 - 1.7.2 curCSS = css, 1.8+ only has css
+if ( !$.curCSS ) {
+       $.curCSS = $.css;
+}
+
+// fraction support test (older versions of jQuery don't support fractions)
+(function () {
+       var body = document.getElementsByTagName( "body" )[ 0 ], 
+               div = document.createElement( "div" ),
+               testElement, testElementParent, testElementStyle, offset, offsetTotal;
+
+       //Create a "fake body" for testing based on method used in jQuery.support
+       testElement = document.createElement( body ? "div" : "body" );
+       testElementStyle = {
+               visibility: "hidden",
+               width: 0,
+               height: 0,
+               border: 0,
+               margin: 0,
+               background: "none"
+       };
+       if ( body ) {
+               $.extend( testElementStyle, {
+                       position: "absolute",
+                       left: "-1000px",
+                       top: "-1000px"
+               });
+       }
+       for ( var i in testElementStyle ) {
+               testElement.style[ i ] = testElementStyle[ i ];
+       }
+       testElement.appendChild( div );
+       testElementParent = body || document.documentElement;
+       testElementParent.insertBefore( testElement, testElementParent.firstChild );
+
+       div.style.cssText = "position: absolute; left: 10.7432222px; top: 10.432325px; height: 30px; width: 201px;";
+
+       offset = $( div ).offset( function( _, offset ) {
+               return offset;
+       }).offset();
+
+       testElement.innerHTML = "";
+       testElementParent.removeChild( testElement );
+
+       offsetTotal = offset.top + offset.left + ( body ? 2000 : 0 );
+       support.fractions = offsetTotal > 21 && offsetTotal < 22;
+})();
+
+}( jQuery ));
diff --git a/resources/lib/jquery.ui/jquery.ui.progressbar.js b/resources/lib/jquery.ui/jquery.ui.progressbar.js
new file mode 100644 (file)
index 0000000..7cea1ba
--- /dev/null
@@ -0,0 +1,109 @@
+/*!
+ * jQuery UI Progressbar 1.8.24
+ *
+ * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Progressbar
+ *
+ * Depends:
+ *   jquery.ui.core.js
+ *   jquery.ui.widget.js
+ */
+(function( $, undefined ) {
+
+$.widget( "ui.progressbar", {
+       options: {
+               value: 0,
+               max: 100
+       },
+
+       min: 0,
+
+       _create: function() {
+               this.element
+                       .addClass( "ui-progressbar ui-widget ui-widget-content ui-corner-all" )
+                       .attr({
+                               role: "progressbar",
+                               "aria-valuemin": this.min,
+                               "aria-valuemax": this.options.max,
+                               "aria-valuenow": this._value()
+                       });
+
+               this.valueDiv = $( "<div class='ui-progressbar-value ui-widget-header ui-corner-left'></div>" )
+                       .appendTo( this.element );
+
+               this.oldValue = this._value();
+               this._refreshValue();
+       },
+
+       destroy: function() {
+               this.element
+                       .removeClass( "ui-progressbar ui-widget ui-widget-content ui-corner-all" )
+                       .removeAttr( "role" )
+                       .removeAttr( "aria-valuemin" )
+                       .removeAttr( "aria-valuemax" )
+                       .removeAttr( "aria-valuenow" );
+
+               this.valueDiv.remove();
+
+               $.Widget.prototype.destroy.apply( this, arguments );
+       },
+
+       value: function( newValue ) {
+               if ( newValue === undefined ) {
+                       return this._value();
+               }
+
+               this._setOption( "value", newValue );
+               return this;
+       },
+
+       _setOption: function( key, value ) {
+               if ( key === "value" ) {
+                       this.options.value = value;
+                       this._refreshValue();
+                       if ( this._value() === this.options.max ) {
+                               this._trigger( "complete" );
+                       }
+               }
+
+               $.Widget.prototype._setOption.apply( this, arguments );
+       },
+
+       _value: function() {
+               var val = this.options.value;
+               // normalize invalid value
+               if ( typeof val !== "number" ) {
+                       val = 0;
+               }
+               return Math.min( this.options.max, Math.max( this.min, val ) );
+       },
+
+       _percentage: function() {
+               return 100 * this._value() / this.options.max;
+       },
+
+       _refreshValue: function() {
+               var value = this.value();
+               var percentage = this._percentage();
+
+               if ( this.oldValue !== value ) {
+                       this.oldValue = value;
+                       this._trigger( "change" );
+               }
+
+               this.valueDiv
+                       .toggle( value > this.min )
+                       .toggleClass( "ui-corner-right", value === this.options.max )
+                       .width( percentage.toFixed(0) + "%" );
+               this.element.attr( "aria-valuenow", value );
+       }
+});
+
+$.extend( $.ui.progressbar, {
+       version: "1.8.24"
+});
+
+})( jQuery );
diff --git a/resources/lib/jquery.ui/jquery.ui.resizable.js b/resources/lib/jquery.ui/jquery.ui.resizable.js
new file mode 100644 (file)
index 0000000..6cc6f41
--- /dev/null
@@ -0,0 +1,807 @@
+/*!
+ * jQuery UI Resizable 1.8.24
+ *
+ * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Resizables
+ *
+ * Depends:
+ *     jquery.ui.core.js
+ *     jquery.ui.mouse.js
+ *     jquery.ui.widget.js
+ */
+(function( $, undefined ) {
+
+$.widget("ui.resizable", $.ui.mouse, {
+       widgetEventPrefix: "resize",
+       options: {
+               alsoResize: false,
+               animate: false,
+               animateDuration: "slow",
+               animateEasing: "swing",
+               aspectRatio: false,
+               autoHide: false,
+               containment: false,
+               ghost: false,
+               grid: false,
+               handles: "e,s,se",
+               helper: false,
+               maxHeight: null,
+               maxWidth: null,
+               minHeight: 10,
+               minWidth: 10,
+               zIndex: 1000
+       },
+       _create: function() {
+
+               var self = this, o = this.options;
+               this.element.addClass("ui-resizable");
+
+               $.extend(this, {
+                       _aspectRatio: !!(o.aspectRatio),
+                       aspectRatio: o.aspectRatio,
+                       originalElement: this.element,
+                       _proportionallyResizeElements: [],
+                       _helper: o.helper || o.ghost || o.animate ? o.helper || 'ui-resizable-helper' : null
+               });
+
+               //Wrap the element if it cannot hold child nodes
+               if(this.element[0].nodeName.match(/canvas|textarea|input|select|button|img/i)) {
+
+                       //Create a wrapper element and set the wrapper to the new current internal element
+                       this.element.wrap(
+                               $('<div class="ui-wrapper" style="overflow: hidden;"></div>').css({
+                                       position: this.element.css('position'),
+                                       width: this.element.outerWidth(),
+                                       height: this.element.outerHeight(),
+                                       top: this.element.css('top'),
+                                       left: this.element.css('left')
+                               })
+                       );
+
+                       //Overwrite the original this.element
+                       this.element = this.element.parent().data(
+                               "resizable", this.element.data('resizable')
+                       );
+
+                       this.elementIsWrapper = true;
+
+                       //Move margins to the wrapper
+                       this.element.css({ marginLeft: this.originalElement.css("marginLeft"), marginTop: this.originalElement.css("marginTop"), marginRight: this.originalElement.css("marginRight"), marginBottom: this.originalElement.css("marginBottom") });
+                       this.originalElement.css({ marginLeft: 0, marginTop: 0, marginRight: 0, marginBottom: 0});
+
+                       //Prevent Safari textarea resize
+                       this.originalResizeStyle = this.originalElement.css('resize');
+                       this.originalElement.css('resize', 'none');
+
+                       //Push the actual element to our proportionallyResize internal array
+                       this._proportionallyResizeElements.push(this.originalElement.css({ position: 'static', zoom: 1, display: 'block' }));
+
+                       // avoid IE jump (hard set the margin)
+                       this.originalElement.css({ margin: this.originalElement.css('margin') });
+
+                       // fix handlers offset
+                       this._proportionallyResize();
+
+               }
+
+               this.handles = o.handles || (!$('.ui-resizable-handle', this.element).length ? "e,s,se" : { n: '.ui-resizable-n', e: '.ui-resizable-e', s: '.ui-resizable-s', w: '.ui-resizable-w', se: '.ui-resizable-se', sw: '.ui-resizable-sw', ne: '.ui-resizable-ne', nw: '.ui-resizable-nw' });
+               if(this.handles.constructor == String) {
+
+                       if(this.handles == 'all') this.handles = 'n,e,s,w,se,sw,ne,nw';
+                       var n = this.handles.split(","); this.handles = {};
+
+                       for(var i = 0; i < n.length; i++) {
+
+                               var handle = $.trim(n[i]), hname = 'ui-resizable-'+handle;
+                               var axis = $('<div class="ui-resizable-handle ' + hname + '"></div>');
+
+                               // Apply zIndex to all handles - see #7960
+                               axis.css({ zIndex: o.zIndex });
+
+                               //TODO : What's going on here?
+                               if ('se' == handle) {
+                                       axis.addClass('ui-icon ui-icon-gripsmall-diagonal-se');
+                               };
+
+                               //Insert into internal handles object and append to element
+                               this.handles[handle] = '.ui-resizable-'+handle;
+                               this.element.append(axis);
+                       }
+
+               }
+
+               this._renderAxis = function(target) {
+
+                       target = target || this.element;
+
+                       for(var i in this.handles) {
+
+                               if(this.handles[i].constructor == String)
+                                       this.handles[i] = $(this.handles[i], this.element).show();
+
+                               //Apply pad to wrapper element, needed to fix axis position (textarea, inputs, scrolls)
+                               if (this.elementIsWrapper && this.originalElement[0].nodeName.match(/textarea|input|select|button/i)) {
+
+                                       var axis = $(this.handles[i], this.element), padWrapper = 0;
+
+                                       //Checking the correct pad and border
+                                       padWrapper = /sw|ne|nw|se|n|s/.test(i) ? axis.outerHeight() : axis.outerWidth();
+
+                                       //The padding type i have to apply...
+                                       var padPos = [ 'padding',
+                                               /ne|nw|n/.test(i) ? 'Top' :
+                                               /se|sw|s/.test(i) ? 'Bottom' :
+                                               /^e$/.test(i) ? 'Right' : 'Left' ].join("");
+
+                                       target.css(padPos, padWrapper);
+
+                                       this._proportionallyResize();
+
+                               }
+
+                               //TODO: What's that good for? There's not anything to be executed left
+                               if(!$(this.handles[i]).length)
+                                       continue;
+
+                       }
+               };
+
+               //TODO: make renderAxis a prototype function
+               this._renderAxis(this.element);
+
+               this._handles = $('.ui-resizable-handle', this.element)
+                       .disableSelection();
+
+               //Matching axis name
+               this._handles.mouseover(function() {
+                       if (!self.resizing) {
+                               if (this.className)
+                                       var axis = this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i);
+                               //Axis, default = se
+                               self.axis = axis && axis[1] ? axis[1] : 'se';
+                       }
+               });
+
+               //If we want to auto hide the elements
+               if (o.autoHide) {
+                       this._handles.hide();
+                       $(this.element)
+                               .addClass("ui-resizable-autohide")
+                               .hover(function() {
+                                       if (o.disabled) return;
+                                       $(this).removeClass("ui-resizable-autohide");
+                                       self._handles.show();
+                               },
+                               function(){
+                                       if (o.disabled) return;
+                                       if (!self.resizing) {
+                                               $(this).addClass("ui-resizable-autohide");
+                                               self._handles.hide();
+                                       }
+                               });
+               }
+
+               //Initialize the mouse interaction
+               this._mouseInit();
+
+       },
+
+       destroy: function() {
+
+               this._mouseDestroy();
+
+               var _destroy = function(exp) {
+                       $(exp).removeClass("ui-resizable ui-resizable-disabled ui-resizable-resizing")
+                               .removeData("resizable").unbind(".resizable").find('.ui-resizable-handle').remove();
+               };
+
+               //TODO: Unwrap at same DOM position
+               if (this.elementIsWrapper) {
+                       _destroy(this.element);
+                       var wrapper = this.element;
+                       wrapper.after(
+                               this.originalElement.css({
+                                       position: wrapper.css('position'),
+                                       width: wrapper.outerWidth(),
+                                       height: wrapper.outerHeight(),
+                                       top: wrapper.css('top'),
+                                       left: wrapper.css('left')
+                               })
+                       ).remove();
+               }
+
+               this.originalElement.css('resize', this.originalResizeStyle);
+               _destroy(this.originalElement);
+
+               return this;
+       },
+
+       _mouseCapture: function(event) {
+               var handle = false;
+               for (var i in this.handles) {
+                       if ($(this.handles[i])[0] == event.target) {
+                               handle = true;
+                       }
+               }
+
+               return !this.options.disabled && handle;
+       },
+
+       _mouseStart: function(event) {
+
+               var o = this.options, iniPos = this.element.position(), el = this.element;
+
+               this.resizing = true;
+               this.documentScroll = { top: $(document).scrollTop(), left: $(document).scrollLeft() };
+
+               // bugfix for http://dev.jquery.com/ticket/1749
+               if (el.is('.ui-draggable') || (/absolute/).test(el.css('position'))) {
+                       el.css({ position: 'absolute', top: iniPos.top, left: iniPos.left });
+               }
+
+               this._renderProxy();
+
+               var curleft = num(this.helper.css('left')), curtop = num(this.helper.css('top'));
+
+               if (o.containment) {
+                       curleft += $(o.containment).scrollLeft() || 0;
+                       curtop += $(o.containment).scrollTop() || 0;
+               }
+
+               //Store needed variables
+               this.offset = this.helper.offset();
+               this.position = { left: curleft, top: curtop };
+               this.size = this._helper ? { width: el.outerWidth(), height: el.outerHeight() } : { width: el.width(), height: el.height() };
+               this.originalSize = this._helper ? { width: el.outerWidth(), height: el.outerHeight() } : { width: el.width(), height: el.height() };
+               this.originalPosition = { left: curleft, top: curtop };
+               this.sizeDiff = { width: el.outerWidth() - el.width(), height: el.outerHeight() - el.height() };
+               this.originalMousePosition = { left: event.pageX, top: event.pageY };
+
+               //Aspect Ratio
+               this.aspectRatio = (typeof o.aspectRatio == 'number') ? o.aspectRatio : ((this.originalSize.width / this.originalSize.height) || 1);
+
+           var cursor = $('.ui-resizable-' + this.axis).css('cursor');
+           $('body').css('cursor', cursor == 'auto' ? this.axis + '-resize' : cursor);
+
+               el.addClass("ui-resizable-resizing");
+               this._propagate("start", event);
+               return true;
+       },
+
+       _mouseDrag: function(event) {
+
+               //Increase performance, avoid regex
+               var el = this.helper, o = this.options, props = {},
+                       self = this, smp = this.originalMousePosition, a = this.axis;
+
+               var dx = (event.pageX-smp.left)||0, dy = (event.pageY-smp.top)||0;
+               var trigger = this._change[a];
+               if (!trigger) return false;
+
+               // Calculate the attrs that will be change
+               var data = trigger.apply(this, [event, dx, dy]), ie6 = $.browser.msie && $.browser.version < 7, csdif = this.sizeDiff;
+
+               // Put this in the mouseDrag handler since the user can start pressing shift while resizing
+               this._updateVirtualBoundaries(event.shiftKey);
+               if (this._aspectRatio || event.shiftKey)
+                       data = this._updateRatio(data, event);
+
+               data = this._respectSize(data, event);
+
+               // plugins callbacks need to be called first
+               this._propagate("resize", event);
+
+               el.css({
+                       top: this.position.top + "px", left: this.position.left + "px",
+                       width: this.size.width + "px", height: this.size.height + "px"
+               });
+
+               if (!this._helper && this._proportionallyResizeElements.length)
+                       this._proportionallyResize();
+
+               this._updateCache(data);
+
+               // calling the user callback at the end
+               this._trigger('resize', event, this.ui());
+
+               return false;
+       },
+
+       _mouseStop: function(event) {
+
+               this.resizing = false;
+               var o = this.options, self = this;
+
+               if(this._helper) {
+                       var pr = this._proportionallyResizeElements, ista = pr.length && (/textarea/i).test(pr[0].nodeName),
+                               soffseth = ista && $.ui.hasScroll(pr[0], 'left') /* TODO - jump height */ ? 0 : self.sizeDiff.height,
+                               soffsetw = ista ? 0 : self.sizeDiff.width;
+
+                       var s = { width: (self.helper.width()  - soffsetw), height: (self.helper.height() - soffseth) },
+                               left = (parseInt(self.element.css('left'), 10) + (self.position.left - self.originalPosition.left)) || null,
+                               top = (parseInt(self.element.css('top'), 10) + (self.position.top - self.originalPosition.top)) || null;
+
+                       if (!o.animate)
+                               this.element.css($.extend(s, { top: top, left: left }));
+
+                       self.helper.height(self.size.height);
+                       self.helper.width(self.size.width);
+
+                       if (this._helper && !o.animate) this._proportionallyResize();
+               }
+
+               $('body').css('cursor', 'auto');
+
+               this.element.removeClass("ui-resizable-resizing");
+
+               this._propagate("stop", event);
+
+               if (this._helper) this.helper.remove();
+               return false;
+
+       },
+
+    _updateVirtualBoundaries: function(forceAspectRatio) {
+        var o = this.options, pMinWidth, pMaxWidth, pMinHeight, pMaxHeight, b;
+
+        b = {
+            minWidth: isNumber(o.minWidth) ? o.minWidth : 0,
+            maxWidth: isNumber(o.maxWidth) ? o.maxWidth : Infinity,
+            minHeight: isNumber(o.minHeight) ? o.minHeight : 0,
+            maxHeight: isNumber(o.maxHeight) ? o.maxHeight : Infinity
+        };
+
+        if(this._aspectRatio || forceAspectRatio) {
+            // We want to create an enclosing box whose aspect ration is the requested one
+            // First, compute the "projected" size for each dimension based on the aspect ratio and other dimension
+            pMinWidth = b.minHeight * this.aspectRatio;
+            pMinHeight = b.minWidth / this.aspectRatio;
+            pMaxWidth = b.maxHeight * this.aspectRatio;
+            pMaxHeight = b.maxWidth / this.aspectRatio;
+
+            if(pMinWidth > b.minWidth) b.minWidth = pMinWidth;
+            if(pMinHeight > b.minHeight) b.minHeight = pMinHeight;
+            if(pMaxWidth < b.maxWidth) b.maxWidth = pMaxWidth;
+            if(pMaxHeight < b.maxHeight) b.maxHeight = pMaxHeight;
+        }
+        this._vBoundaries = b;
+    },
+
+       _updateCache: function(data) {
+               var o = this.options;
+               this.offset = this.helper.offset();
+               if (isNumber(data.left)) this.position.left = data.left;
+               if (isNumber(data.top)) this.position.top = data.top;
+               if (isNumber(data.height)) this.size.height = data.height;
+               if (isNumber(data.width)) this.size.width = data.width;
+       },
+
+       _updateRatio: function(data, event) {
+
+               var o = this.options, cpos = this.position, csize = this.size, a = this.axis;
+
+               if (isNumber(data.height)) data.width = (data.height * this.aspectRatio);
+               else if (isNumber(data.width)) data.height = (data.width / this.aspectRatio);
+
+               if (a == 'sw') {
+                       data.left = cpos.left + (csize.width - data.width);
+                       data.top = null;
+               }
+               if (a == 'nw') {
+                       data.top = cpos.top + (csize.height - data.height);
+                       data.left = cpos.left + (csize.width - data.width);
+               }
+
+               return data;
+       },
+
+       _respectSize: function(data, event) {
+
+               var el = this.helper, o = this._vBoundaries, pRatio = this._aspectRatio || event.shiftKey, a = this.axis,
+                               ismaxw = isNumber(data.width) && o.maxWidth && (o.maxWidth < data.width), ismaxh = isNumber(data.height) && o.maxHeight && (o.maxHeight < data.height),
+                                       isminw = isNumber(data.width) && o.minWidth && (o.minWidth > data.width), isminh = isNumber(data.height) && o.minHeight && (o.minHeight > data.height);
+
+               if (isminw) data.width = o.minWidth;
+               if (isminh) data.height = o.minHeight;
+               if (ismaxw) data.width = o.maxWidth;
+               if (ismaxh) data.height = o.maxHeight;
+
+               var dw = this.originalPosition.left + this.originalSize.width, dh = this.position.top + this.size.height;
+               var cw = /sw|nw|w/.test(a), ch = /nw|ne|n/.test(a);
+
+               if (isminw && cw) data.left = dw - o.minWidth;
+               if (ismaxw && cw) data.left = dw - o.maxWidth;
+               if (isminh && ch)       data.top = dh - o.minHeight;
+               if (ismaxh && ch)       data.top = dh - o.maxHeight;
+
+               // fixing jump error on top/left - bug #2330
+               var isNotwh = !data.width && !data.height;
+               if (isNotwh && !data.left && data.top) data.top = null;
+               else if (isNotwh && !data.top && data.left) data.left = null;
+
+               return data;
+       },
+
+       _proportionallyResize: function() {
+
+               var o = this.options;
+               if (!this._proportionallyResizeElements.length) return;
+               var element = this.helper || this.element;
+
+               for (var i=0; i < this._proportionallyResizeElements.length; i++) {
+
+                       var prel = this._proportionallyResizeElements[i];
+
+                       if (!this.borderDif) {
+                               var b = [prel.css('borderTopWidth'), prel.css('borderRightWidth'), prel.css('borderBottomWidth'), prel.css('borderLeftWidth')],
+                                       p = [prel.css('paddingTop'), prel.css('paddingRight'), prel.css('paddingBottom'), prel.css('paddingLeft')];
+
+                               this.borderDif = $.map(b, function(v, i) {
+                                       var border = parseInt(v,10)||0, padding = parseInt(p[i],10)||0;
+                                       return border + padding;
+                               });
+                       }
+
+                       if ($.browser.msie && !(!($(element).is(':hidden') || $(element).parents(':hidden').length)))
+                               continue;
+
+                       prel.css({
+                               height: (element.height() - this.borderDif[0] - this.borderDif[2]) || 0,
+                               width: (element.width() - this.borderDif[1] - this.borderDif[3]) || 0
+                       });
+
+               };
+
+       },
+
+       _renderProxy: function() {
+
+               var el = this.element, o = this.options;
+               this.elementOffset = el.offset();
+
+               if(this._helper) {
+
+                       this.helper = this.helper || $('<div style="overflow:hidden;"></div>');
+
+                       // fix ie6 offset TODO: This seems broken
+                       var ie6 = $.browser.msie && $.browser.version < 7, ie6offset = (ie6 ? 1 : 0),
+                       pxyoffset = ( ie6 ? 2 : -1 );
+
+                       this.helper.addClass(this._helper).css({
+                               width: this.element.outerWidth() + pxyoffset,
+                               height: this.element.outerHeight() + pxyoffset,
+                               position: 'absolute',
+                               left: this.elementOffset.left - ie6offset +'px',
+                               top: this.elementOffset.top - ie6offset +'px',
+                               zIndex: ++o.zIndex //TODO: Don't modify option
+                       });
+
+                       this.helper
+                               .appendTo("body")
+                               .disableSelection();
+
+               } else {
+                       this.helper = this.element;
+               }
+
+       },
+
+       _change: {
+               e: function(event, dx, dy) {
+                       return { width: this.originalSize.width + dx };
+               },
+               w: function(event, dx, dy) {
+                       var o = this.options, cs = this.originalSize, sp = this.originalPosition;
+                       return { left: sp.left + dx, width: cs.width - dx };
+               },
+               n: function(event, dx, dy) {
+                       var o = this.options, cs = this.originalSize, sp = this.originalPosition;
+                       return { top: sp.top + dy, height: cs.height - dy };
+               },
+               s: function(event, dx, dy) {
+                       return { height: this.originalSize.height + dy };
+               },
+               se: function(event, dx, dy) {
+                       return $.extend(this._change.s.apply(this, arguments), this._change.e.apply(this, [event, dx, dy]));
+               },
+               sw: function(event, dx, dy) {
+                       return $.extend(this._change.s.apply(this, arguments), this._change.w.apply(this, [event, dx, dy]));
+               },
+               ne: function(event, dx, dy) {
+                       return $.extend(this._change.n.apply(this, arguments), this._change.e.apply(this, [event, dx, dy]));
+               },
+               nw: function(event, dx, dy) {
+                       return $.extend(this._change.n.apply(this, arguments), this._change.w.apply(this, [event, dx, dy]));
+               }
+       },
+
+       _propagate: function(n, event) {
+               $.ui.plugin.call(this, n, [event, this.ui()]);
+               (n != "resize" && this._trigger(n, event, this.ui()));
+       },
+
+       plugins: {},
+
+       ui: function() {
+               return {
+                       originalElement: this.originalElement,
+                       element: this.element,
+                       helper: this.helper,
+                       position: this.position,
+                       size: this.size,
+                       originalSize: this.originalSize,
+                       originalPosition: this.originalPosition
+               };
+       }
+
+});
+
+$.extend($.ui.resizable, {
+       version: "1.8.24"
+});
+
+/*
+ * Resizable Extensions
+ */
+
+$.ui.plugin.add("resizable", "alsoResize", {
+
+       start: function (event, ui) {
+               var self = $(this).data("resizable"), o = self.options;
+
+               var _store = function (exp) {
+                       $(exp).each(function() {
+                               var el = $(this);
+                               el.data("resizable-alsoresize", {
+                                       width: parseInt(el.width(), 10), height: parseInt(el.height(), 10),
+                                       left: parseInt(el.css('left'), 10), top: parseInt(el.css('top'), 10)
+                               });
+                       });
+               };
+
+               if (typeof(o.alsoResize) == 'object' && !o.alsoResize.parentNode) {
+                       if (o.alsoResize.length) { o.alsoResize = o.alsoResize[0]; _store(o.alsoResize); }
+                       else { $.each(o.alsoResize, function (exp) { _store(exp); }); }
+               }else{
+                       _store(o.alsoResize);
+               }
+       },
+
+       resize: function (event, ui) {
+               var self = $(this).data("resizable"), o = self.options, os = self.originalSize, op = self.originalPosition;
+
+               var delta = {
+                       height: (self.size.height - os.height) || 0, width: (self.size.width - os.width) || 0,
+                       top: (self.position.top - op.top) || 0, left: (self.position.left - op.left) || 0
+               },
+
+               _alsoResize = function (exp, c) {
+                       $(exp).each(function() {
+                               var el = $(this), start = $(this).data("resizable-alsoresize"), style = {}, 
+                                       css = c && c.length ? c : el.parents(ui.originalElement[0]).length ? ['width', 'height'] : ['width', 'height', 'top', 'left'];
+
+                               $.each(css, function (i, prop) {
+                                       var sum = (start[prop]||0) + (delta[prop]||0);
+                                       if (sum && sum >= 0)
+                                               style[prop] = sum || null;
+                               });
+
+                               el.css(style);
+                       });
+               };
+
+               if (typeof(o.alsoResize) == 'object' && !o.alsoResize.nodeType) {
+                       $.each(o.alsoResize, function (exp, c) { _alsoResize(exp, c); });
+               }else{
+                       _alsoResize(o.alsoResize);
+               }
+       },
+
+       stop: function (event, ui) {
+               $(this).removeData("resizable-alsoresize");
+       }
+});
+
+$.ui.plugin.add("resizable", "animate", {
+
+       stop: function(event, ui) {
+               var self = $(this).data("resizable"), o = self.options;
+
+               var pr = self._proportionallyResizeElements, ista = pr.length && (/textarea/i).test(pr[0].nodeName),
+                                       soffseth = ista && $.ui.hasScroll(pr[0], 'left') /* TODO - jump height */ ? 0 : self.sizeDiff.height,
+                                               soffsetw = ista ? 0 : self.sizeDiff.width;
+
+               var style = { width: (self.size.width - soffsetw), height: (self.size.height - soffseth) },
+                                       left = (parseInt(self.element.css('left'), 10) + (self.position.left - self.originalPosition.left)) || null,
+                                               top = (parseInt(self.element.css('top'), 10) + (self.position.top - self.originalPosition.top)) || null;
+
+               self.element.animate(
+                       $.extend(style, top && left ? { top: top, left: left } : {}), {
+                               duration: o.animateDuration,
+                               easing: o.animateEasing,
+                               step: function() {
+
+                                       var data = {
+                                               width: parseInt(self.element.css('width'), 10),
+                                               height: parseInt(self.element.css('height'), 10),
+                                               top: parseInt(self.element.css('top'), 10),
+                                               left: parseInt(self.element.css('left'), 10)
+                                       };
+
+                                       if (pr && pr.length) $(pr[0]).css({ width: data.width, height: data.height });
+
+                                       // propagating resize, and updating values for each animation step
+                                       self._updateCache(data);
+                                       self._propagate("resize", event);
+
+                               }
+                       }
+               );
+       }
+
+});
+
+$.ui.plugin.add("resizable", "containment", {
+
+       start: function(event, ui) {
+               var self = $(this).data("resizable"), o = self.options, el = self.element;
+               var oc = o.containment, ce = (oc instanceof $) ? oc.get(0) : (/parent/.test(oc)) ? el.parent().get(0) : oc;
+               if (!ce) return;
+
+               self.containerElement = $(ce);
+
+               if (/document/.test(oc) || oc == document) {
+                       self.containerOffset = { left: 0, top: 0 };
+                       self.containerPosition = { left: 0, top: 0 };
+
+                       self.parentData = {
+                               element: $(document), left: 0, top: 0,
+                               width: $(document).width(), height: $(document).height() || document.body.parentNode.scrollHeight
+                       };
+               }
+
+               // i'm a node, so compute top, left, right, bottom
+               else {
+                       var element = $(ce), p = [];
+                       $([ "Top", "Right", "Left", "Bottom" ]).each(function(i, name) { p[i] = num(element.css("padding" + name)); });
+
+                       self.containerOffset = element.offset();
+                       self.containerPosition = element.position();
+                       self.containerSize = { height: (element.innerHeight() - p[3]), width: (element.innerWidth() - p[1]) };
+
+                       var co = self.containerOffset, ch = self.containerSize.height,  cw = self.containerSize.width,
+                                               width = ($.ui.hasScroll(ce, "left") ? ce.scrollWidth : cw ), height = ($.ui.hasScroll(ce) ? ce.scrollHeight : ch);
+
+                       self.parentData = {
+                               element: ce, left: co.left, top: co.top, width: width, height: height
+                       };
+               }
+       },
+
+       resize: function(event, ui) {
+               var self = $(this).data("resizable"), o = self.options,
+                               ps = self.containerSize, co = self.containerOffset, cs = self.size, cp = self.position,
+                               pRatio = self._aspectRatio || event.shiftKey, cop = { top:0, left:0 }, ce = self.containerElement;
+
+               if (ce[0] != document && (/static/).test(ce.css('position'))) cop = co;
+
+               if (cp.left < (self._helper ? co.left : 0)) {
+                       self.size.width = self.size.width + (self._helper ? (self.position.left - co.left) : (self.position.left - cop.left));
+                       if (pRatio) self.size.height = self.size.width / self.aspectRatio;
+                       self.position.left = o.helper ? co.left : 0;
+               }
+
+               if (cp.top < (self._helper ? co.top : 0)) {
+                       self.size.height = self.size.height + (self._helper ? (self.position.top - co.top) : self.position.top);
+                       if (pRatio) self.size.width = self.size.height * self.aspectRatio;
+                       self.position.top = self._helper ? co.top : 0;
+               }
+
+               self.offset.left = self.parentData.left+self.position.left;
+               self.offset.top = self.parentData.top+self.position.top;
+
+               var woset = Math.abs( (self._helper ? self.offset.left - cop.left : (self.offset.left - cop.left)) + self.sizeDiff.width ),
+                                       hoset = Math.abs( (self._helper ? self.offset.top - cop.top : (self.offset.top - co.top)) + self.sizeDiff.height );
+
+               var isParent = self.containerElement.get(0) == self.element.parent().get(0),
+                   isOffsetRelative = /relative|absolute/.test(self.containerElement.css('position'));
+
+               if(isParent && isOffsetRelative) woset -= self.parentData.left;
+
+               if (woset + self.size.width >= self.parentData.width) {
+                       self.size.width = self.parentData.width - woset;
+                       if (pRatio) self.size.height = self.size.width / self.aspectRatio;
+               }
+
+               if (hoset + self.size.height >= self.parentData.height) {
+                       self.size.height = self.parentData.height - hoset;
+                       if (pRatio) self.size.width = self.size.height * self.aspectRatio;
+               }
+       },
+
+       stop: function(event, ui){
+               var self = $(this).data("resizable"), o = self.options, cp = self.position,
+                               co = self.containerOffset, cop = self.containerPosition, ce = self.containerElement;
+
+               var helper = $(self.helper), ho = helper.offset(), w = helper.outerWidth() - self.sizeDiff.width, h = helper.outerHeight() - self.sizeDiff.height;
+
+               if (self._helper && !o.animate && (/relative/).test(ce.css('position')))
+                       $(this).css({ left: ho.left - cop.left - co.left, width: w, height: h });
+
+               if (self._helper && !o.animate && (/static/).test(ce.css('position')))
+                       $(this).css({ left: ho.left - cop.left - co.left, width: w, height: h });
+
+       }
+});
+
+$.ui.plugin.add("resizable", "ghost", {
+
+       start: function(event, ui) {
+
+               var self = $(this).data("resizable"), o = self.options, cs = self.size;
+
+               self.ghost = self.originalElement.clone();
+               self.ghost
+                       .css({ opacity: .25, display: 'block', position: 'relative', height: cs.height, width: cs.width, margin: 0, left: 0, top: 0 })
+                       .addClass('ui-resizable-ghost')
+                       .addClass(typeof o.ghost == 'string' ? o.ghost : '');
+
+               self.ghost.appendTo(self.helper);
+
+       },
+
+       resize: function(event, ui){
+               var self = $(this).data("resizable"), o = self.options;
+               if (self.ghost) self.ghost.css({ position: 'relative', height: self.size.height, width: self.size.width });
+       },
+
+       stop: function(event, ui){
+               var self = $(this).data("resizable"), o = self.options;
+               if (self.ghost && self.helper) self.helper.get(0).removeChild(self.ghost.get(0));
+       }
+
+});
+
+$.ui.plugin.add("resizable", "grid", {
+
+       resize: function(event, ui) {
+               var self = $(this).data("resizable"), o = self.options, cs = self.size, os = self.originalSize, op = self.originalPosition, a = self.axis, ratio = o._aspectRatio || event.shiftKey;
+               o.grid = typeof o.grid == "number" ? [o.grid, o.grid] : o.grid;
+               var ox = Math.round((cs.width - os.width) / (o.grid[0]||1)) * (o.grid[0]||1), oy = Math.round((cs.height - os.height) / (o.grid[1]||1)) * (o.grid[1]||1);
+
+               if (/^(se|s|e)$/.test(a)) {
+                       self.size.width = os.width + ox;
+                       self.size.height = os.height + oy;
+               }
+               else if (/^(ne)$/.test(a)) {
+                       self.size.width = os.width + ox;
+                       self.size.height = os.height + oy;
+                       self.position.top = op.top - oy;
+               }
+               else if (/^(sw)$/.test(a)) {
+                       self.size.width = os.width + ox;
+                       self.size.height = os.height + oy;
+                       self.position.left = op.left - ox;
+               }
+               else {
+                       self.size.width = os.width + ox;
+                       self.size.height = os.height + oy;
+                       self.position.top = op.top - oy;
+                       self.position.left = op.left - ox;
+               }
+       }
+
+});
+
+var num = function(v) {
+       return parseInt(v, 10) || 0;
+};
+
+var isNumber = function(value) {
+       return !isNaN(parseInt(value, 10));
+};
+
+})(jQuery);
diff --git a/resources/lib/jquery.ui/jquery.ui.selectable.js b/resources/lib/jquery.ui/jquery.ui.selectable.js
new file mode 100644 (file)
index 0000000..44c6e8c
--- /dev/null
@@ -0,0 +1,267 @@
+/*!
+ * jQuery UI Selectable 1.8.24
+ *
+ * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Selectables
+ *
+ * Depends:
+ *     jquery.ui.core.js
+ *     jquery.ui.mouse.js
+ *     jquery.ui.widget.js
+ */
+(function( $, undefined ) {
+
+$.widget("ui.selectable", $.ui.mouse, {
+       options: {
+               appendTo: 'body',
+               autoRefresh: true,
+               distance: 0,
+               filter: '*',
+               tolerance: 'touch'
+       },
+       _create: function() {
+               var self = this;
+
+               this.element.addClass("ui-selectable");
+
+               this.dragged = false;
+
+               // cache selectee children based on filter
+               var selectees;
+               this.refresh = function() {
+                       selectees = $(self.options.filter, self.element[0]);
+                       selectees.addClass("ui-selectee");
+                       selectees.each(function() {
+                               var $this = $(this);
+                               var pos = $this.offset();
+                               $.data(this, "selectable-item", {
+                                       element: this,
+                                       $element: $this,
+                                       left: pos.left,
+                                       top: pos.top,
+                                       right: pos.left + $this.outerWidth(),
+                                       bottom: pos.top + $this.outerHeight(),
+                                       startselected: false,
+                                       selected: $this.hasClass('ui-selected'),
+                                       selecting: $this.hasClass('ui-selecting'),
+                                       unselecting: $this.hasClass('ui-unselecting')
+                               });
+                       });
+               };
+               this.refresh();
+
+               this.selectees = selectees.addClass("ui-selectee");
+
+               this._mouseInit();
+
+               this.helper = $("<div class='ui-selectable-helper'></div>");
+       },
+
+       destroy: function() {
+               this.selectees
+                       .removeClass("ui-selectee")
+                       .removeData("selectable-item");
+               this.element
+                       .removeClass("ui-selectable ui-selectable-disabled")
+                       .removeData("selectable")
+                       .unbind(".selectable");
+               this._mouseDestroy();
+
+               return this;
+       },
+
+       _mouseStart: function(event) {
+               var self = this;
+
+               this.opos = [event.pageX, event.pageY];
+
+               if (this.options.disabled)
+                       return;
+
+               var options = this.options;
+
+               this.selectees = $(options.filter, this.element[0]);
+
+               this._trigger("start", event);
+
+               $(options.appendTo).append(this.helper);
+               // position helper (lasso)
+               this.helper.css({
+                       "left": event.clientX,
+                       "top": event.clientY,
+                       "width": 0,
+                       "height": 0
+               });
+
+               if (options.autoRefresh) {
+                       this.refresh();
+               }
+
+               this.selectees.filter('.ui-selected').each(function() {
+                       var selectee = $.data(this, "selectable-item");
+                       selectee.startselected = true;
+                       if (!event.metaKey && !event.ctrlKey) {
+                               selectee.$element.removeClass('ui-selected');
+                               selectee.selected = false;
+                               selectee.$element.addClass('ui-unselecting');
+                               selectee.unselecting = true;
+                               // selectable UNSELECTING callback
+                               self._trigger("unselecting", event, {
+                                       unselecting: selectee.element
+                               });
+                       }
+               });
+
+               $(event.target).parents().andSelf().each(function() {
+                       var selectee = $.data(this, "selectable-item");
+                       if (selectee) {
+                               var doSelect = (!event.metaKey && !event.ctrlKey) || !selectee.$element.hasClass('ui-selected');
+                               selectee.$element
+                                       .removeClass(doSelect ? "ui-unselecting" : "ui-selected")
+                                       .addClass(doSelect ? "ui-selecting" : "ui-unselecting");
+                               selectee.unselecting = !doSelect;
+                               selectee.selecting = doSelect;
+                               selectee.selected = doSelect;
+                               // selectable (UN)SELECTING callback
+                               if (doSelect) {
+                                       self._trigger("selecting", event, {
+                                               selecting: selectee.element
+                                       });
+                               } else {
+                                       self._trigger("unselecting", event, {
+                                               unselecting: selectee.element
+                                       });
+                               }
+                               return false;
+                       }
+               });
+
+       },
+
+       _mouseDrag: function(event) {
+               var self = this;
+               this.dragged = true;
+
+               if (this.options.disabled)
+                       return;
+
+               var options = this.options;
+
+               var x1 = this.opos[0], y1 = this.opos[1], x2 = event.pageX, y2 = event.pageY;
+               if (x1 > x2) { var tmp = x2; x2 = x1; x1 = tmp; }
+               if (y1 > y2) { var tmp = y2; y2 = y1; y1 = tmp; }
+               this.helper.css({left: x1, top: y1, width: x2-x1, height: y2-y1});
+
+               this.selectees.each(function() {
+                       var selectee = $.data(this, "selectable-item");
+                       //prevent helper from being selected if appendTo: selectable
+                       if (!selectee || selectee.element == self.element[0])
+                               return;
+                       var hit = false;
+                       if (options.tolerance == 'touch') {
+                               hit = ( !(selectee.left > x2 || selectee.right < x1 || selectee.top > y2 || selectee.bottom < y1) );
+                       } else if (options.tolerance == 'fit') {
+                               hit = (selectee.left > x1 && selectee.right < x2 && selectee.top > y1 && selectee.bottom < y2);
+                       }
+
+                       if (hit) {
+                               // SELECT
+                               if (selectee.selected) {
+                                       selectee.$element.removeClass('ui-selected');
+                                       selectee.selected = false;
+                               }
+                               if (selectee.unselecting) {
+                                       selectee.$element.removeClass('ui-unselecting');
+                                       selectee.unselecting = false;
+                               }
+                               if (!selectee.selecting) {
+                                       selectee.$element.addClass('ui-selecting');
+                                       selectee.selecting = true;
+                                       // selectable SELECTING callback
+                                       self._trigger("selecting", event, {
+                                               selecting: selectee.element
+                                       });
+                               }
+                       } else {
+                               // UNSELECT
+                               if (selectee.selecting) {
+                                       if ((event.metaKey || event.ctrlKey) && selectee.startselected) {
+                                               selectee.$element.removeClass('ui-selecting');
+                                               selectee.selecting = false;
+                                               selectee.$element.addClass('ui-selected');
+                                               selectee.selected = true;
+                                       } else {
+                                               selectee.$element.removeClass('ui-selecting');
+                                               selectee.selecting = false;
+                                               if (selectee.startselected) {
+                                                       selectee.$element.addClass('ui-unselecting');
+                                                       selectee.unselecting = true;
+                                               }
+                                               // selectable UNSELECTING callback
+                                               self._trigger("unselecting", event, {
+                                                       unselecting: selectee.element
+                                               });
+                                       }
+                               }
+                               if (selectee.selected) {
+                                       if (!event.metaKey && !event.ctrlKey && !selectee.startselected) {
+                                               selectee.$element.removeClass('ui-selected');
+                                               selectee.selected = false;
+
+                                               selectee.$element.addClass('ui-unselecting');
+                                               selectee.unselecting = true;
+                                               // selectable UNSELECTING callback
+                                               self._trigger("unselecting", event, {
+                                                       unselecting: selectee.element
+                                               });
+                                       }
+                               }
+                       }
+               });
+
+               return false;
+       },
+
+       _mouseStop: function(event) {
+               var self = this;
+
+               this.dragged = false;
+
+               var options = this.options;
+
+               $('.ui-unselecting', this.element[0]).each(function() {
+                       var selectee = $.data(this, "selectable-item");
+                       selectee.$element.removeClass('ui-unselecting');
+                       selectee.unselecting = false;
+                       selectee.startselected = false;
+                       self._trigger("unselected", event, {
+                               unselected: selectee.element
+                       });
+               });
+               $('.ui-selecting', this.element[0]).each(function() {
+                       var selectee = $.data(this, "selectable-item");
+                       selectee.$element.removeClass('ui-selecting').addClass('ui-selected');
+                       selectee.selecting = false;
+                       selectee.selected = true;
+                       selectee.startselected = true;
+                       self._trigger("selected", event, {
+                               selected: selectee.element
+                       });
+               });
+               this._trigger("stop", event);
+
+               this.helper.remove();
+
+               return false;
+       }
+
+});
+
+$.extend($.ui.selectable, {
+       version: "1.8.24"
+});
+
+})(jQuery);
diff --git a/resources/lib/jquery.ui/jquery.ui.slider.js b/resources/lib/jquery.ui/jquery.ui.slider.js
new file mode 100644 (file)
index 0000000..c554e78
--- /dev/null
@@ -0,0 +1,662 @@
+/*!
+ * jQuery UI Slider 1.8.24
+ *
+ * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Slider
+ *
+ * Depends:
+ *     jquery.ui.core.js
+ *     jquery.ui.mouse.js
+ *     jquery.ui.widget.js
+ */
+(function( $, undefined ) {
+
+// number of pages in a slider
+// (how many times can you page up/down to go through the whole range)
+var numPages = 5;
+
+$.widget( "ui.slider", $.ui.mouse, {
+
+       widgetEventPrefix: "slide",
+
+       options: {
+               animate: false,
+               distance: 0,
+               max: 100,
+               min: 0,
+               orientation: "horizontal",
+               range: false,
+               step: 1,
+               value: 0,
+               values: null
+       },
+
+       _create: function() {
+               var self = this,
+                       o = this.options,
+                       existingHandles = this.element.find( ".ui-slider-handle" ).addClass( "ui-state-default ui-corner-all" ),
+                       handle = "<a class='ui-slider-handle ui-state-default ui-corner-all' href='#'></a>",
+                       handleCount = ( o.values && o.values.length ) || 1,
+                       handles = [];
+
+               this._keySliding = false;
+               this._mouseSliding = false;
+               this._animateOff = true;
+               this._handleIndex = null;
+               this._detectOrientation();
+               this._mouseInit();
+
+               this.element
+                       .addClass( "ui-slider" +
+                               " ui-slider-" + this.orientation +
+                               " ui-widget" +
+                               " ui-widget-content" +
+                               " ui-corner-all" +
+                               ( o.disabled ? " ui-slider-disabled ui-disabled" : "" ) );
+
+               this.range = $([]);
+
+               if ( o.range ) {
+                       if ( o.range === true ) {
+                               if ( !o.values ) {
+                                       o.values = [ this._valueMin(), this._valueMin() ];
+                               }
+                               if ( o.values.length && o.values.length !== 2 ) {
+                                       o.values = [ o.values[0], o.values[0] ];
+                               }
+                       }
+
+                       this.range = $( "<div></div>" )
+                               .appendTo( this.element )
+                               .addClass( "ui-slider-range" +
+                               // note: this isn't the most fittingly semantic framework class for this element,
+                               // but worked best visually with a variety of themes
+                               " ui-widget-header" + 
+                               ( ( o.range === "min" || o.range === "max" ) ? " ui-slider-range-" + o.range : "" ) );
+               }
+
+               for ( var i = existingHandles.length; i < handleCount; i += 1 ) {
+                       handles.push( handle );
+               }
+
+               this.handles = existingHandles.add( $( handles.join( "" ) ).appendTo( self.element ) );
+
+               this.handle = this.handles.eq( 0 );
+
+               this.handles.add( this.range ).filter( "a" )
+                       .click(function( event ) {
+                               event.preventDefault();
+                       })
+                       .hover(function() {
+                               if ( !o.disabled ) {
+                                       $( this ).addClass( "ui-state-hover" );
+                               }
+                       }, function() {
+                               $( this ).removeClass( "ui-state-hover" );
+                       })
+                       .focus(function() {
+                               if ( !o.disabled ) {
+                                       $( ".ui-slider .ui-state-focus" ).removeClass( "ui-state-focus" );
+                                       $( this ).addClass( "ui-state-focus" );
+                               } else {
+                                       $( this ).blur();
+                               }
+                       })
+                       .blur(function() {
+                               $( this ).removeClass( "ui-state-focus" );
+                       });
+
+               this.handles.each(function( i ) {
+                       $( this ).data( "index.ui-slider-handle", i );
+               });
+
+               this.handles
+                       .keydown(function( event ) {
+                               var index = $( this ).data( "index.ui-slider-handle" ),
+                                       allowed,
+                                       curVal,
+                                       newVal,
+                                       step;
+       
+                               if ( self.options.disabled ) {
+                                       return;
+                               }
+       
+                               switch ( event.keyCode ) {
+                                       case $.ui.keyCode.HOME:
+                                       case $.ui.keyCode.END:
+                                       case $.ui.keyCode.PAGE_UP:
+                                       case $.ui.keyCode.PAGE_DOWN:
+                                       case $.ui.keyCode.UP:
+                                       case $.ui.keyCode.RIGHT:
+                                       case $.ui.keyCode.DOWN:
+                                       case $.ui.keyCode.LEFT:
+                                               event.preventDefault();
+                                               if ( !self._keySliding ) {
+                                                       self._keySliding = true;
+                                                       $( this ).addClass( "ui-state-active" );
+                                                       allowed = self._start( event, index );
+                                                       if ( allowed === false ) {
+                                                               return;
+                                                       }
+                                               }
+                                               break;
+                               }
+       
+                               step = self.options.step;
+                               if ( self.options.values && self.options.values.length ) {
+                                       curVal = newVal = self.values( index );
+                               } else {
+                                       curVal = newVal = self.value();
+                               }
+       
+                               switch ( event.keyCode ) {
+                                       case $.ui.keyCode.HOME:
+                                               newVal = self._valueMin();
+                                               break;
+                                       case $.ui.keyCode.END:
+                                               newVal = self._valueMax();
+                                               break;
+                                       case $.ui.keyCode.PAGE_UP:
+                                               newVal = self._trimAlignValue( curVal + ( (self._valueMax() - self._valueMin()) / numPages ) );
+                                               break;
+                                       case $.ui.keyCode.PAGE_DOWN:
+                                               newVal = self._trimAlignValue( curVal - ( (self._valueMax() - self._valueMin()) / numPages ) );
+                                               break;
+                                       case $.ui.keyCode.UP:
+                                       case $.ui.keyCode.RIGHT:
+                                               if ( curVal === self._valueMax() ) {
+                                                       return;
+                                               }
+                                               newVal = self._trimAlignValue( curVal + step );
+                                               break;
+                                       case $.ui.keyCode.DOWN:
+                                       case $.ui.keyCode.LEFT:
+                                               if ( curVal === self._valueMin() ) {
+                                                       return;
+                                               }
+                                               newVal = self._trimAlignValue( curVal - step );
+                                               break;
+                               }
+       
+                               self._slide( event, index, newVal );
+                       })
+                       .keyup(function( event ) {
+                               var index = $( this ).data( "index.ui-slider-handle" );
+       
+                               if ( self._keySliding ) {
+                                       self._keySliding = false;
+                                       self._stop( event, index );
+                                       self._change( event, index );
+                                       $( this ).removeClass( "ui-state-active" );
+                               }
+       
+                       });
+
+               this._refreshValue();
+
+               this._animateOff = false;
+       },
+
+       destroy: function() {
+               this.handles.remove();
+               this.range.remove();
+
+               this.element
+                       .removeClass( "ui-slider" +
+                               " ui-slider-horizontal" +
+                               " ui-slider-vertical" +
+                               " ui-slider-disabled" +
+                               " ui-widget" +
+                               " ui-widget-content" +
+                               " ui-corner-all" )
+                       .removeData( "slider" )
+                       .unbind( ".slider" );
+
+               this._mouseDestroy();
+
+               return this;
+       },
+
+       _mouseCapture: function( event ) {
+               var o = this.options,
+                       position,
+                       normValue,
+                       distance,
+                       closestHandle,
+                       self,
+                       index,
+                       allowed,
+                       offset,
+                       mouseOverHandle;
+
+               if ( o.disabled ) {
+                       return false;
+               }
+
+               this.elementSize = {
+                       width: this.element.outerWidth(),
+                       height: this.element.outerHeight()
+               };
+               this.elementOffset = this.element.offset();
+
+               position = { x: event.pageX, y: event.pageY };
+               normValue = this._normValueFromMouse( position );
+               distance = this._valueMax() - this._valueMin() + 1;
+               self = this;
+               this.handles.each(function( i ) {
+                       var thisDistance = Math.abs( normValue - self.values(i) );
+                       if ( distance > thisDistance ) {
+                               distance = thisDistance;
+                               closestHandle = $( this );
+                               index = i;
+                       }
+               });
+
+               // workaround for bug #3736 (if both handles of a range are at 0,
+               // the first is always used as the one with least distance,
+               // and moving it is obviously prevented by preventing negative ranges)
+               if( o.range === true && this.values(1) === o.min ) {
+                       index += 1;
+                       closestHandle = $( this.handles[index] );
+               }
+
+               allowed = this._start( event, index );
+               if ( allowed === false ) {
+                       return false;
+               }
+               this._mouseSliding = true;
+
+               self._handleIndex = index;
+
+               closestHandle
+                       .addClass( "ui-state-active" )
+                       .focus();
+               
+               offset = closestHandle.offset();
+               mouseOverHandle = !$( event.target ).parents().andSelf().is( ".ui-slider-handle" );
+               this._clickOffset = mouseOverHandle ? { left: 0, top: 0 } : {
+                       left: event.pageX - offset.left - ( closestHandle.width() / 2 ),
+                       top: event.pageY - offset.top -
+                               ( closestHandle.height() / 2 ) -
+                               ( parseInt( closestHandle.css("borderTopWidth"), 10 ) || 0 ) -
+                               ( parseInt( closestHandle.css("borderBottomWidth"), 10 ) || 0) +
+                               ( parseInt( closestHandle.css("marginTop"), 10 ) || 0)
+               };
+
+               if ( !this.handles.hasClass( "ui-state-hover" ) ) {
+                       this._slide( event, index, normValue );
+               }
+               this._animateOff = true;
+               return true;
+       },
+
+       _mouseStart: function( event ) {
+               return true;
+       },
+
+       _mouseDrag: function( event ) {
+               var position = { x: event.pageX, y: event.pageY },
+                       normValue = this._normValueFromMouse( position );
+               
+               this._slide( event, this._handleIndex, normValue );
+
+               return false;
+       },
+
+       _mouseStop: function( event ) {
+               this.handles.removeClass( "ui-state-active" );
+               this._mouseSliding = false;
+
+               this._stop( event, this._handleIndex );
+               this._change( event, this._handleIndex );
+
+               this._handleIndex = null;
+               this._clickOffset = null;
+               this._animateOff = false;
+
+               return false;
+       },
+       
+       _detectOrientation: function() {
+               this.orientation = ( this.options.orientation === "vertical" ) ? "vertical" : "horizontal";
+       },
+
+       _normValueFromMouse: function( position ) {
+               var pixelTotal,
+                       pixelMouse,
+                       percentMouse,
+                       valueTotal,
+                       valueMouse;
+
+               if ( this.orientation === "horizontal" ) {
+                       pixelTotal = this.elementSize.width;
+                       pixelMouse = position.x - this.elementOffset.left - ( this._clickOffset ? this._clickOffset.left : 0 );
+               } else {
+                       pixelTotal = this.elementSize.height;
+                       pixelMouse = position.y - this.elementOffset.top - ( this._clickOffset ? this._clickOffset.top : 0 );
+               }
+
+               percentMouse = ( pixelMouse / pixelTotal );
+               if ( percentMouse > 1 ) {
+                       percentMouse = 1;
+               }
+               if ( percentMouse < 0 ) {
+                       percentMouse = 0;
+               }
+               if ( this.orientation === "vertical" ) {
+                       percentMouse = 1 - percentMouse;
+               }
+
+               valueTotal = this._valueMax() - this._valueMin();
+               valueMouse = this._valueMin() + percentMouse * valueTotal;
+
+               return this._trimAlignValue( valueMouse );
+       },
+
+       _start: function( event, index ) {
+               var uiHash = {
+                       handle: this.handles[ index ],
+                       value: this.value()
+               };
+               if ( this.options.values && this.options.values.length ) {
+                       uiHash.value = this.values( index );
+                       uiHash.values = this.values();
+               }
+               return this._trigger( "start", event, uiHash );
+       },
+
+       _slide: function( event, index, newVal ) {
+               var otherVal,
+                       newValues,
+                       allowed;
+
+               if ( this.options.values && this.options.values.length ) {
+                       otherVal = this.values( index ? 0 : 1 );
+
+                       if ( ( this.options.values.length === 2 && this.options.range === true ) && 
+                                       ( ( index === 0 && newVal > otherVal) || ( index === 1 && newVal < otherVal ) )
+                               ) {
+                               newVal = otherVal;
+                       }
+
+                       if ( newVal !== this.values( index ) ) {
+                               newValues = this.values();
+                               newValues[ index ] = newVal;
+                               // A slide can be canceled by returning false from the slide callback
+                               allowed = this._trigger( "slide", event, {
+                                       handle: this.handles[ index ],
+                                       value: newVal,
+                                       values: newValues
+                               } );
+                               otherVal = this.values( index ? 0 : 1 );
+                               if ( allowed !== false ) {
+                                       this.values( index, newVal, true );
+                               }
+                       }
+               } else {
+                       if ( newVal !== this.value() ) {
+                               // A slide can be canceled by returning false from the slide callback
+                               allowed = this._trigger( "slide", event, {
+                                       handle: this.handles[ index ],
+                                       value: newVal
+                               } );
+                               if ( allowed !== false ) {
+                                       this.value( newVal );
+                               }
+                       }
+               }
+       },
+
+       _stop: function( event, index ) {
+               var uiHash = {
+                       handle: this.handles[ index ],
+                       value: this.value()
+               };
+               if ( this.options.values && this.options.values.length ) {
+                       uiHash.value = this.values( index );
+                       uiHash.values = this.values();
+               }
+
+               this._trigger( "stop", event, uiHash );
+       },
+
+       _change: function( event, index ) {
+               if ( !this._keySliding && !this._mouseSliding ) {
+                       var uiHash = {
+                               handle: this.handles[ index ],
+                               value: this.value()
+                       };
+                       if ( this.options.values && this.options.values.length ) {
+                               uiHash.value = this.values( index );
+                               uiHash.values = this.values();
+                       }
+
+                       this._trigger( "change", event, uiHash );
+               }
+       },
+
+       value: function( newValue ) {
+               if ( arguments.length ) {
+                       this.options.value = this._trimAlignValue( newValue );
+                       this._refreshValue();
+                       this._change( null, 0 );
+                       return;
+               }
+
+               return this._value();
+       },
+
+       values: function( index, newValue ) {
+               var vals,
+                       newValues,
+                       i;
+
+               if ( arguments.length > 1 ) {
+                       this.options.values[ index ] = this._trimAlignValue( newValue );
+                       this._refreshValue();
+                       this._change( null, index );
+                       return;
+               }
+
+               if ( arguments.length ) {
+                       if ( $.isArray( arguments[ 0 ] ) ) {
+                               vals = this.options.values;
+                               newValues = arguments[ 0 ];
+                               for ( i = 0; i < vals.length; i += 1 ) {
+                                       vals[ i ] = this._trimAlignValue( newValues[ i ] );
+                                       this._change( null, i );
+                               }
+                               this._refreshValue();
+                       } else {
+                               if ( this.options.values && this.options.values.length ) {
+                                       return this._values( index );
+                               } else {
+                                       return this.value();
+                               }
+                       }
+               } else {
+                       return this._values();
+               }
+       },
+
+       _setOption: function( key, value ) {
+               var i,
+                       valsLength = 0;
+
+               if ( $.isArray( this.options.values ) ) {
+                       valsLength = this.options.values.length;
+               }
+
+               $.Widget.prototype._setOption.apply( this, arguments );
+
+               switch ( key ) {
+                       case "disabled":
+                               if ( value ) {
+                                       this.handles.filter( ".ui-state-focus" ).blur();
+                                       this.handles.removeClass( "ui-state-hover" );
+                                       this.handles.propAttr( "disabled", true );
+                                       this.element.addClass( "ui-disabled" );
+                               } else {
+                                       this.handles.propAttr( "disabled", false );
+                                       this.element.removeClass( "ui-disabled" );
+                               }
+                               break;
+                       case "orientation":
+                               this._detectOrientation();
+                               this.element
+                                       .removeClass( "ui-slider-horizontal ui-slider-vertical" )
+                                       .addClass( "ui-slider-" + this.orientation );
+                               this._refreshValue();
+                               break;
+                       case "value":
+                               this._animateOff = true;
+                               this._refreshValue();
+                               this._change( null, 0 );
+                               this._animateOff = false;
+                               break;
+                       case "values":
+                               this._animateOff = true;
+                               this._refreshValue();
+                               for ( i = 0; i < valsLength; i += 1 ) {
+                                       this._change( null, i );
+                               }
+                               this._animateOff = false;
+                               break;
+               }
+       },
+
+       //internal value getter
+       // _value() returns value trimmed by min and max, aligned by step
+       _value: function() {
+               var val = this.options.value;
+               val = this._trimAlignValue( val );
+
+               return val;
+       },
+
+       //internal values getter
+       // _values() returns array of values trimmed by min and max, aligned by step
+       // _values( index ) returns single value trimmed by min and max, aligned by step
+       _values: function( index ) {
+               var val,
+                       vals,
+                       i;
+
+               if ( arguments.length ) {
+                       val = this.options.values[ index ];
+                       val = this._trimAlignValue( val );
+
+                       return val;
+               } else {
+                       // .slice() creates a copy of the array
+                       // this copy gets trimmed by min and max and then returned
+                       vals = this.options.values.slice();
+                       for ( i = 0; i < vals.length; i+= 1) {
+                               vals[ i ] = this._trimAlignValue( vals[ i ] );
+                       }
+
+                       return vals;
+               }
+       },
+       
+       // returns the step-aligned value that val is closest to, between (inclusive) min and max
+       _trimAlignValue: function( val ) {
+               if ( val <= this._valueMin() ) {
+                       return this._valueMin();
+               }
+               if ( val >= this._valueMax() ) {
+                       return this._valueMax();
+               }
+               var step = ( this.options.step > 0 ) ? this.options.step : 1,
+                       valModStep = (val - this._valueMin()) % step,
+                       alignValue = val - valModStep;
+
+               if ( Math.abs(valModStep) * 2 >= step ) {
+                       alignValue += ( valModStep > 0 ) ? step : ( -step );
+               }
+
+               // Since JavaScript has problems with large floats, round
+               // the final value to 5 digits after the decimal point (see #4124)
+               return parseFloat( alignValue.toFixed(5) );
+       },
+
+       _valueMin: function() {
+               return this.options.min;
+       },
+
+       _valueMax: function() {
+               return this.options.max;
+       },
+       
+       _refreshValue: function() {
+               var oRange = this.options.range,
+                       o = this.options,
+                       self = this,
+                       animate = ( !this._animateOff ) ? o.animate : false,
+                       valPercent,
+                       _set = {},
+                       lastValPercent,
+                       value,
+                       valueMin,
+                       valueMax;
+
+               if ( this.options.values && this.options.values.length ) {
+                       this.handles.each(function( i, j ) {
+                               valPercent = ( self.values(i) - self._valueMin() ) / ( self._valueMax() - self._valueMin() ) * 100;
+                               _set[ self.orientation === "horizontal" ? "left" : "bottom" ] = valPercent + "%";
+                               $( this ).stop( 1, 1 )[ animate ? "animate" : "css" ]( _set, o.animate );
+                               if ( self.options.range === true ) {
+                                       if ( self.orientation === "horizontal" ) {
+                                               if ( i === 0 ) {
+                                                       self.range.stop( 1, 1 )[ animate ? "animate" : "css" ]( { left: valPercent + "%" }, o.animate );
+                                               }
+                                               if ( i === 1 ) {
+                                                       self.range[ animate ? "animate" : "css" ]( { width: ( valPercent - lastValPercent ) + "%" }, { queue: false, duration: o.animate } );
+                                               }
+                                       } else {
+                                               if ( i === 0 ) {
+                                                       self.range.stop( 1, 1 )[ animate ? "animate" : "css" ]( { bottom: ( valPercent ) + "%" }, o.animate );
+                                               }
+                                               if ( i === 1 ) {
+                                                       self.range[ animate ? "animate" : "css" ]( { height: ( valPercent - lastValPercent ) + "%" }, { queue: false, duration: o.animate } );
+                                               }
+                                       }
+                               }
+                               lastValPercent = valPercent;
+                       });
+               } else {
+                       value = this.value();
+                       valueMin = this._valueMin();
+                       valueMax = this._valueMax();
+                       valPercent = ( valueMax !== valueMin ) ?
+                                       ( value - valueMin ) / ( valueMax - valueMin ) * 100 :
+                                       0;
+                       _set[ self.orientation === "horizontal" ? "left" : "bottom" ] = valPercent + "%";
+                       this.handle.stop( 1, 1 )[ animate ? "animate" : "css" ]( _set, o.animate );
+
+                       if ( oRange === "min" && this.orientation === "horizontal" ) {
+                               this.range.stop( 1, 1 )[ animate ? "animate" : "css" ]( { width: valPercent + "%" }, o.animate );
+                       }
+                       if ( oRange === "max" && this.orientation === "horizontal" ) {
+                               this.range[ animate ? "animate" : "css" ]( { width: ( 100 - valPercent ) + "%" }, { queue: false, duration: o.animate } );
+                       }
+                       if ( oRange === "min" && this.orientation === "vertical" ) {
+                               this.range.stop( 1, 1 )[ animate ? "animate" : "css" ]( { height: valPercent + "%" }, o.animate );
+                       }
+                       if ( oRange === "max" && this.orientation === "vertical" ) {
+                               this.range[ animate ? "animate" : "css" ]( { height: ( 100 - valPercent ) + "%" }, { queue: false, duration: o.animate } );
+                       }
+               }
+       }
+
+});
+
+$.extend( $.ui.slider, {
+       version: "1.8.24"
+});
+
+}(jQuery));
diff --git a/resources/lib/jquery.ui/jquery.ui.sortable.js b/resources/lib/jquery.ui/jquery.ui.sortable.js
new file mode 100644 (file)
index 0000000..9e0cac6
--- /dev/null
@@ -0,0 +1,1094 @@
+/*!
+ * jQuery UI Sortable 1.8.24
+ *
+ * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Sortables
+ *
+ * Depends:
+ *     jquery.ui.core.js
+ *     jquery.ui.mouse.js
+ *     jquery.ui.widget.js
+ */
+(function( $, undefined ) {
+
+$.widget("ui.sortable", $.ui.mouse, {
+       widgetEventPrefix: "sort",
+       ready: false,
+       options: {
+               appendTo: "parent",
+               axis: false,
+               connectWith: false,
+               containment: false,
+               cursor: 'auto',
+               cursorAt: false,
+               dropOnEmpty: true,
+               forcePlaceholderSize: false,
+               forceHelperSize: false,
+               grid: false,
+               handle: false,
+               helper: "original",
+               items: '> *',
+               opacity: false,
+               placeholder: false,
+               revert: false,
+               scroll: true,
+               scrollSensitivity: 20,
+               scrollSpeed: 20,
+               scope: "default",
+               tolerance: "intersect",
+               zIndex: 1000
+       },
+       _create: function() {
+
+               var o = this.options;
+               this.containerCache = {};
+               this.element.addClass("ui-sortable");
+
+               //Get the items
+               this.refresh();
+
+               //Let's determine if the items are being displayed horizontally
+               this.floating = this.items.length ? o.axis === 'x' || (/left|right/).test(this.items[0].item.css('float')) || (/inline|table-cell/).test(this.items[0].item.css('display')) : false;
+
+               //Let's determine the parent's offset
+               this.offset = this.element.offset();
+
+               //Initialize mouse events for interaction
+               this._mouseInit();
+               
+               //We're ready to go
+               this.ready = true
+
+       },
+
+       destroy: function() {
+               $.Widget.prototype.destroy.call( this );
+               this.element
+                       .removeClass("ui-sortable ui-sortable-disabled");
+               this._mouseDestroy();
+
+               for ( var i = this.items.length - 1; i >= 0; i-- )
+                       this.items[i].item.removeData(this.widgetName + "-item");
+
+               return this;
+       },
+
+       _setOption: function(key, value){
+               if ( key === "disabled" ) {
+                       this.options[ key ] = value;
+       
+                       this.widget()
+                               [ value ? "addClass" : "removeClass"]( "ui-sortable-disabled" );
+               } else {
+                       // Don't call widget base _setOption for disable as it adds ui-state-disabled class
+                       $.Widget.prototype._setOption.apply(this, arguments);
+               }
+       },
+
+       _mouseCapture: function(event, overrideHandle) {
+               var that = this;
+
+               if (this.reverting) {
+                       return false;
+               }
+
+               if(this.options.disabled || this.options.type == 'static') return false;
+
+               //We have to refresh the items data once first
+               this._refreshItems(event);
+
+               //Find out if the clicked node (or one of its parents) is a actual item in this.items
+               var currentItem = null, self = this, nodes = $(event.target).parents().each(function() {
+                       if($.data(this, that.widgetName + '-item') == self) {
+                               currentItem = $(this);
+                               return false;
+                       }
+               });
+               if($.data(event.target, that.widgetName + '-item') == self) currentItem = $(event.target);
+
+               if(!currentItem) return false;
+               if(this.options.handle && !overrideHandle) {
+                       var validHandle = false;
+
+                       $(this.options.handle, currentItem).find("*").andSelf().each(function() { if(this == event.target) validHandle = true; });
+                       if(!validHandle) return false;
+               }
+
+               this.currentItem = currentItem;
+               this._removeCurrentsFromItems();
+               return true;
+
+       },
+
+       _mouseStart: function(event, overrideHandle, noActivation) {
+
+               var o = this.options, self = this;
+               this.currentContainer = this;
+
+               //We only need to call refreshPositions, because the refreshItems call has been moved to mouseCapture
+               this.refreshPositions();
+
+               //Create and append the visible helper
+               this.helper = this._createHelper(event);
+
+               //Cache the helper size
+               this._cacheHelperProportions();
+
+               /*
+                * - Position generation -
+                * This block generates everything position related - it's the core of draggables.
+                */
+
+               //Cache the margins of the original element
+               this._cacheMargins();
+
+               //Get the next scrolling parent
+               this.scrollParent = this.helper.scrollParent();
+
+               //The element's absolute position on the page minus margins
+               this.offset = this.currentItem.offset();
+               this.offset = {
+                       top: this.offset.top - this.margins.top,
+                       left: this.offset.left - this.margins.left
+               };
+
+               $.extend(this.offset, {
+                       click: { //Where the click happened, relative to the element
+                               left: event.pageX - this.offset.left,
+                               top: event.pageY - this.offset.top
+                       },
+                       parent: this._getParentOffset(),
+                       relative: this._getRelativeOffset() //This is a relative to absolute position minus the actual position calculation - only used for relative positioned helper
+               });
+
+               // Only after we got the offset, we can change the helper's position to absolute
+               // TODO: Still need to figure out a way to make relative sorting possible
+               this.helper.css("position", "absolute");
+               this.cssPosition = this.helper.css("position");
+               
+               //Generate the original position
+               this.originalPosition = this._generatePosition(event);
+               this.originalPageX = event.pageX;
+               this.originalPageY = event.pageY;
+
+               //Adjust the mouse offset relative to the helper if 'cursorAt' is supplied
+               (o.cursorAt && this._adjustOffsetFromHelper(o.cursorAt));
+
+               //Cache the former DOM position
+               this.domPosition = { prev: this.currentItem.prev()[0], parent: this.currentItem.parent()[0] };
+
+               //If the helper is not the original, hide the original so it's not playing any role during the drag, won't cause anything bad this way
+               if(this.helper[0] != this.currentItem[0]) {
+                       this.currentItem.hide();
+               }
+
+               //Create the placeholder
+               this._createPlaceholder();
+
+               //Set a containment if given in the options
+               if(o.containment)
+                       this._setContainment();
+
+               if(o.cursor) { // cursor option
+                       if ($('body').css("cursor")) this._storedCursor = $('body').css("cursor");
+                       $('body').css("cursor", o.cursor);
+               }
+
+               if(o.opacity) { // opacity option
+                       if (this.helper.css("opacity")) this._storedOpacity = this.helper.css("opacity");
+                       this.helper.css("opacity", o.opacity);
+               }
+
+               if(o.zIndex) { // zIndex option
+                       if (this.helper.css("zIndex")) this._storedZIndex = this.helper.css("zIndex");
+                       this.helper.css("zIndex", o.zIndex);
+               }
+
+               //Prepare scrolling
+               if(this.scrollParent[0] != document && this.scrollParent[0].tagName != 'HTML')
+                       this.overflowOffset = this.scrollParent.offset();
+
+               //Call callbacks
+               this._trigger("start", event, this._uiHash());
+
+               //Recache the helper size
+               if(!this._preserveHelperProportions)
+                       this._cacheHelperProportions();
+
+
+               //Post 'activate' events to possible containers
+               if(!noActivation) {
+                        for (var i = this.containers.length - 1; i >= 0; i--) { this.containers[i]._trigger("activate", event, self._uiHash(this)); }
+               }
+
+               //Prepare possible droppables
+               if($.ui.ddmanager)
+                       $.ui.ddmanager.current = this;
+
+               if ($.ui.ddmanager && !o.dropBehaviour)
+                       $.ui.ddmanager.prepareOffsets(this, event);
+
+               this.dragging = true;
+
+               this.helper.addClass("ui-sortable-helper");
+               this._mouseDrag(event); //Execute the drag once - this causes the helper not to be visible before getting its correct position
+               return true;
+
+       },
+
+       _mouseDrag: function(event) {
+
+               //Compute the helpers position
+               this.position = this._generatePosition(event);
+               this.positionAbs = this._convertPositionTo("absolute");
+
+               if (!this.lastPositionAbs) {
+                       this.lastPositionAbs = this.positionAbs;
+               }
+
+               //Do scrolling
+               if(this.options.scroll) {
+                       var o = this.options, scrolled = false;
+                       if(this.scrollParent[0] != document && this.scrollParent[0].tagName != 'HTML') {
+
+                               if((this.overflowOffset.top + this.scrollParent[0].offsetHeight) - event.pageY < o.scrollSensitivity)
+                                       this.scrollParent[0].scrollTop = scrolled = this.scrollParent[0].scrollTop + o.scrollSpeed;
+                               else if(event.pageY - this.overflowOffset.top < o.scrollSensitivity)
+                                       this.scrollParent[0].scrollTop = scrolled = this.scrollParent[0].scrollTop - o.scrollSpeed;
+
+                               if((this.overflowOffset.left + this.scrollParent[0].offsetWidth) - event.pageX < o.scrollSensitivity)
+                                       this.scrollParent[0].scrollLeft = scrolled = this.scrollParent[0].scrollLeft + o.scrollSpeed;
+                               else if(event.pageX - this.overflowOffset.left < o.scrollSensitivity)
+                                       this.scrollParent[0].scrollLeft = scrolled = this.scrollParent[0].scrollLeft - o.scrollSpeed;
+
+                       } else {
+
+                               if(event.pageY - $(document).scrollTop() < o.scrollSensitivity)
+                                       scrolled = $(document).scrollTop($(document).scrollTop() - o.scrollSpeed);
+                               else if($(window).height() - (event.pageY - $(document).scrollTop()) < o.scrollSensitivity)
+                                       scrolled = $(document).scrollTop($(document).scrollTop() + o.scrollSpeed);
+
+                               if(event.pageX - $(document).scrollLeft() < o.scrollSensitivity)
+                                       scrolled = $(document).scrollLeft($(document).scrollLeft() - o.scrollSpeed);
+                               else if($(window).width() - (event.pageX - $(document).scrollLeft()) < o.scrollSensitivity)
+                                       scrolled = $(document).scrollLeft($(document).scrollLeft() + o.scrollSpeed);
+
+                       }
+
+                       if(scrolled !== false && $.ui.ddmanager && !o.dropBehaviour)
+                               $.ui.ddmanager.prepareOffsets(this, event);
+               }
+
+               //Regenerate the absolute position used for position checks
+               this.positionAbs = this._convertPositionTo("absolute");
+
+               //Set the helper position
+               if(!this.options.axis || this.options.axis != "y") this.helper[0].style.left = this.position.left+'px';
+               if(!this.options.axis || this.options.axis != "x") this.helper[0].style.top = this.position.top+'px';
+
+               //Rearrange
+               for (var i = this.items.length - 1; i >= 0; i--) {
+
+                       //Cache variables and intersection, continue if no intersection
+                       var item = this.items[i], itemElement = item.item[0], intersection = this._intersectsWithPointer(item);
+                       if (!intersection) continue;
+
+                       // Only put the placeholder inside the current Container, skip all
+                       // items form other containers. This works because when moving
+                       // an item from one container to another the
+                       // currentContainer is switched before the placeholder is moved.
+                       //
+                       // Without this moving items in "sub-sortables" can cause the placeholder to jitter
+                       // beetween the outer and inner container.
+                       if (item.instance !== this.currentContainer) continue;
+
+                       if (itemElement != this.currentItem[0] //cannot intersect with itself
+                               &&      this.placeholder[intersection == 1 ? "next" : "prev"]()[0] != itemElement //no useless actions that have been done before
+                               &&      !$.ui.contains(this.placeholder[0], itemElement) //no action if the item moved is the parent of the item checked
+                               && (this.options.type == 'semi-dynamic' ? !$.ui.contains(this.element[0], itemElement) : true)
+                               //&& itemElement.parentNode == this.placeholder[0].parentNode // only rearrange items within the same container
+                       ) {
+
+                               this.direction = intersection == 1 ? "down" : "up";
+
+                               if (this.options.tolerance == "pointer" || this._intersectsWithSides(item)) {
+                                       this._rearrange(event, item);
+                               } else {
+                                       break;
+                               }
+
+                               this._trigger("change", event, this._uiHash());
+                               break;
+                       }
+               }
+
+               //Post events to containers
+               this._contactContainers(event);
+
+               //Interconnect with droppables
+               if($.ui.ddmanager) $.ui.ddmanager.drag(this, event);
+
+               //Call callbacks
+               this._trigger('sort', event, this._uiHash());
+
+               this.lastPositionAbs = this.positionAbs;
+               return false;
+
+       },
+
+       _mouseStop: function(event, noPropagation) {
+
+               if(!event) return;
+
+               //If we are using droppables, inform the manager about the drop
+               if ($.ui.ddmanager && !this.options.dropBehaviour)
+                       $.ui.ddmanager.drop(this, event);
+
+               if(this.options.revert) {
+                       var self = this;
+                       var cur = self.placeholder.offset();
+
+                       self.reverting = true;
+
+                       $(this.helper).animate({
+                               left: cur.left - this.offset.parent.left - self.margins.left + (this.offsetParent[0] == document.body ? 0 : this.offsetParent[0].scrollLeft),
+                               top: cur.top - this.offset.parent.top - self.margins.top + (this.offsetParent[0] == document.body ? 0 : this.offsetParent[0].scrollTop)
+                       }, parseInt(this.options.revert, 10) || 500, function() {
+                               self._clear(event);
+                       });
+               } else {
+                       this._clear(event, noPropagation);
+               }
+
+               return false;
+
+       },
+
+       cancel: function() {
+
+               var self = this;
+
+               if(this.dragging) {
+
+                       this._mouseUp({ target: null });
+
+                       if(this.options.helper == "original")
+                               this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper");
+                       else
+                               this.currentItem.show();
+
+                       //Post deactivating events to containers
+                       for (var i = this.containers.length - 1; i >= 0; i--){
+                               this.containers[i]._trigger("deactivate", null, self._uiHash(this));
+                               if(this.containers[i].containerCache.over) {
+                                       this.containers[i]._trigger("out", null, self._uiHash(this));
+                                       this.containers[i].containerCache.over = 0;
+                               }
+                       }
+
+               }
+
+               if (this.placeholder) {
+                       //$(this.placeholder[0]).remove(); would have been the jQuery way - unfortunately, it unbinds ALL events from the original node!
+                       if(this.placeholder[0].parentNode) this.placeholder[0].parentNode.removeChild(this.placeholder[0]);
+                       if(this.options.helper != "original" && this.helper && this.helper[0].parentNode) this.helper.remove();
+
+                       $.extend(this, {
+                               helper: null,
+                               dragging: false,
+                               reverting: false,
+                               _noFinalSort: null
+                       });
+
+                       if(this.domPosition.prev) {
+                               $(this.domPosition.prev).after(this.currentItem);
+                       } else {
+                               $(this.domPosition.parent).prepend(this.currentItem);
+                       }
+               }
+
+               return this;
+
+       },
+
+       serialize: function(o) {
+
+               var items = this._getItemsAsjQuery(o && o.connected);
+               var str = []; o = o || {};
+
+               $(items).each(function() {
+                       var res = ($(o.item || this).attr(o.attribute || 'id') || '').match(o.expression || (/(.+)[-=_](.+)/));
+                       if(res) str.push((o.key || res[1]+'[]')+'='+(o.key && o.expression ? res[1] : res[2]));
+               });
+
+               if(!str.length && o.key) {
+                       str.push(o.key + '=');
+               }
+
+               return str.join('&');
+
+       },
+
+       toArray: function(o) {
+
+               var items = this._getItemsAsjQuery(o && o.connected);
+               var ret = []; o = o || {};
+
+               items.each(function() { ret.push($(o.item || this).attr(o.attribute || 'id') || ''); });
+               return ret;
+
+       },
+
+       /* Be careful with the following core functions */
+       _intersectsWith: function(item) {
+
+               var x1 = this.positionAbs.left,
+                       x2 = x1 + this.helperProportions.width,
+                       y1 = this.positionAbs.top,
+                       y2 = y1 + this.helperProportions.height;
+
+               var l = item.left,
+                       r = l + item.width,
+                       t = item.top,
+                       b = t + item.height;
+
+               var dyClick = this.offset.click.top,
+                       dxClick = this.offset.click.left;
+
+               var isOverElement = (y1 + dyClick) > t && (y1 + dyClick) < b && (x1 + dxClick) > l && (x1 + dxClick) < r;
+
+               if(        this.options.tolerance == "pointer"
+                       || this.options.forcePointerForContainers
+                       || (this.options.tolerance != "pointer" && this.helperProportions[this.floating ? 'width' : 'height'] > item[this.floating ? 'width' : 'height'])
+               ) {
+                       return isOverElement;
+               } else {
+
+                       return (l < x1 + (this.helperProportions.width / 2) // Right Half
+                               && x2 - (this.helperProportions.width / 2) < r // Left Half
+                               && t < y1 + (this.helperProportions.height / 2) // Bottom Half
+                               && y2 - (this.helperProportions.height / 2) < b ); // Top Half
+
+               }
+       },
+
+       _intersectsWithPointer: function(item) {
+
+               var isOverElementHeight = (this.options.axis === 'x') || $.ui.isOverAxis(this.positionAbs.top + this.offset.click.top, item.top, item.height),
+                       isOverElementWidth = (this.options.axis === 'y') || $.ui.isOverAxis(this.positionAbs.left + this.offset.click.left, item.left, item.width),
+                       isOverElement = isOverElementHeight && isOverElementWidth,
+                       verticalDirection = this._getDragVerticalDirection(),
+                       horizontalDirection = this._getDragHorizontalDirection();
+
+               if (!isOverElement)
+                       return false;
+
+               return this.floating ?
+                       ( ((horizontalDirection && horizontalDirection == "right") || verticalDirection == "down") ? 2 : 1 )
+                       : ( verticalDirection && (verticalDirection == "down" ? 2 : 1) );
+
+       },
+
+       _intersectsWithSides: function(item) {
+
+               var isOverBottomHalf = $.ui.isOverAxis(this.positionAbs.top + this.offset.click.top, item.top + (item.height/2), item.height),
+                       isOverRightHalf = $.ui.isOverAxis(this.positionAbs.left + this.offset.click.left, item.left + (item.width/2), item.width),
+                       verticalDirection = this._getDragVerticalDirection(),
+                       horizontalDirection = this._getDragHorizontalDirection();
+
+               if (this.floating && horizontalDirection) {
+                       return ((horizontalDirection == "right" && isOverRightHalf) || (horizontalDirection == "left" && !isOverRightHalf));
+               } else {
+                       return verticalDirection && ((verticalDirection == "down" && isOverBottomHalf) || (verticalDirection == "up" && !isOverBottomHalf));
+               }
+
+       },
+
+       _getDragVerticalDirection: function() {
+               var delta = this.positionAbs.top - this.lastPositionAbs.top;
+               return delta != 0 && (delta > 0 ? "down" : "up");
+       },
+
+       _getDragHorizontalDirection: function() {
+               var delta = this.positionAbs.left - this.lastPositionAbs.left;
+               return delta != 0 && (delta > 0 ? "right" : "left");
+       },
+
+       refresh: function(event) {
+               this._refreshItems(event);
+               this.refreshPositions();
+               return this;
+       },
+
+       _connectWith: function() {
+               var options = this.options;
+               return options.connectWith.constructor == String
+                       ? [options.connectWith]
+                       : options.connectWith;
+       },
+       
+       _getItemsAsjQuery: function(connected) {
+
+               var self = this;
+               var items = [];
+               var queries = [];
+               var connectWith = this._connectWith();
+
+               if(connectWith && connected) {
+                       for (var i = connectWith.length - 1; i >= 0; i--){
+                               var cur = $(connectWith[i]);
+                               for (var j = cur.length - 1; j >= 0; j--){
+                                       var inst = $.data(cur[j], this.widgetName);
+                                       if(inst && inst != this && !inst.options.disabled) {
+                                               queries.push([$.isFunction(inst.options.items) ? inst.options.items.call(inst.element) : $(inst.options.items, inst.element).not(".ui-sortable-helper").not('.ui-sortable-placeholder'), inst]);
+                                       }
+                               };
+                       };
+               }
+
+               queries.push([$.isFunction(this.options.items) ? this.options.items.call(this.element, null, { options: this.options, item: this.currentItem }) : $(this.options.items, this.element).not(".ui-sortable-helper").not('.ui-sortable-placeholder'), this]);
+
+               for (var i = queries.length - 1; i >= 0; i--){
+                       queries[i][0].each(function() {
+                               items.push(this);
+                       });
+               };
+
+               return $(items);
+
+       },
+
+       _removeCurrentsFromItems: function() {
+
+               var list = this.currentItem.find(":data(" + this.widgetName + "-item)");
+
+               for (var i=0; i < this.items.length; i++) {
+
+                       for (var j=0; j < list.length; j++) {
+                               if(list[j] == this.items[i].item[0])
+                                       this.items.splice(i,1);
+                       };
+
+               };
+
+       },
+
+       _refreshItems: function(event) {
+
+               this.items = [];
+               this.containers = [this];
+               var items = this.items;
+               var self = this;
+               var queries = [[$.isFunction(this.options.items) ? this.options.items.call(this.element[0], event, { item: this.currentItem }) : $(this.options.items, this.element), this]];
+               var connectWith = this._connectWith();
+
+               if(connectWith && this.ready) { //Shouldn't be run the first time through due to massive slow-down
+                       for (var i = connectWith.length - 1; i >= 0; i--){
+                               var cur = $(connectWith[i]);
+                               for (var j = cur.length - 1; j >= 0; j--){
+                                       var inst = $.data(cur[j], this.widgetName);
+                                       if(inst && inst != this && !inst.options.disabled) {
+                                               queries.push([$.isFunction(inst.options.items) ? inst.options.items.call(inst.element[0], event, { item: this.currentItem }) : $(inst.options.items, inst.element), inst]);
+                                               this.containers.push(inst);
+                                       }
+                               };
+                       };
+               }
+
+               for (var i = queries.length - 1; i >= 0; i--) {
+                       var targetData = queries[i][1];
+                       var _queries = queries[i][0];
+
+                       for (var j=0, queriesLength = _queries.length; j < queriesLength; j++) {
+                               var item = $(_queries[j]);
+
+                               item.data(this.widgetName + '-item', targetData); // Data for target checking (mouse manager)
+
+                               items.push({
+                                       item: item,
+                                       instance: targetData,
+                                       width: 0, height: 0,
+                                       left: 0, top: 0
+                               });
+                       };
+               };
+
+       },
+
+       refreshPositions: function(fast) {
+
+               //This has to be redone because due to the item being moved out/into the offsetParent, the offsetParent's position will change
+               if(this.offsetParent && this.helper) {
+                       this.offset.parent = this._getParentOffset();
+               }
+
+               for (var i = this.items.length - 1; i >= 0; i--){
+                       var item = this.items[i];
+
+                       //We ignore calculating positions of all connected containers when we're not over them
+                       if(item.instance != this.currentContainer && this.currentContainer && item.item[0] != this.currentItem[0])
+                               continue;
+
+                       var t = this.options.toleranceElement ? $(this.options.toleranceElement, item.item) : item.item;
+
+                       if (!fast) {
+                               item.width = t.outerWidth();
+                               item.height = t.outerHeight();
+                       }
+
+                       var p = t.offset();
+                       item.left = p.left;
+                       item.top = p.top;
+               };
+
+               if(this.options.custom && this.options.custom.refreshContainers) {
+                       this.options.custom.refreshContainers.call(this);
+               } else {
+                       for (var i = this.containers.length - 1; i >= 0; i--){
+                               var p = this.containers[i].element.offset();
+                               this.containers[i].containerCache.left = p.left;
+                               this.containers[i].containerCache.top = p.top;
+                               this.containers[i].containerCache.width = this.containers[i].element.outerWidth();
+                               this.containers[i].containerCache.height = this.containers[i].element.outerHeight();
+                       };
+               }
+
+               return this;
+       },
+
+       _createPlaceholder: function(that) {
+
+               var self = that || this, o = self.options;
+
+               if(!o.placeholder || o.placeholder.constructor == String) {
+                       var className = o.placeholder;
+                       o.placeholder = {
+                               element: function() {
+
+                                       var el = $(document.createElement(self.currentItem[0].nodeName))
+                                               .addClass(className || self.currentItem[0].className+" ui-sortable-placeholder")
+                                               .removeClass("ui-sortable-helper")[0];
+
+                                       if(!className)
+                                               el.style.visibility = "hidden";
+
+                                       return el;
+                               },
+                               update: function(container, p) {
+
+                                       // 1. If a className is set as 'placeholder option, we don't force sizes - the class is responsible for that
+                                       // 2. The option 'forcePlaceholderSize can be enabled to force it even if a class name is specified
+                                       if(className && !o.forcePlaceholderSize) return;
+
+                                       //If the element doesn't have a actual height by itself (without styles coming from a stylesheet), it receives the inline height from the dragged item
+                                       if(!p.height()) { p.height(self.currentItem.innerHeight() - parseInt(self.currentItem.css('paddingTop')||0, 10) - parseInt(self.currentItem.css('paddingBottom')||0, 10)); };
+                                       if(!p.width()) { p.width(self.currentItem.innerWidth() - parseInt(self.currentItem.css('paddingLeft')||0, 10) - parseInt(self.currentItem.css('paddingRight')||0, 10)); };
+                               }
+                       };
+               }
+
+               //Create the placeholder
+               self.placeholder = $(o.placeholder.element.call(self.element, self.currentItem));
+
+               //Append it after the actual current item
+               self.currentItem.after(self.placeholder);
+
+               //Update the size of the placeholder (TODO: Logic to fuzzy, see line 316/317)
+               o.placeholder.update(self, self.placeholder);
+
+       },
+
+       _contactContainers: function(event) {
+               
+               // get innermost container that intersects with item 
+               var innermostContainer = null, innermostIndex = null;           
+               
+               
+               for (var i = this.containers.length - 1; i >= 0; i--){
+
+                       // never consider a container that's located within the item itself 
+                       if($.ui.contains(this.currentItem[0], this.containers[i].element[0]))
+                               continue;
+
+                       if(this._intersectsWith(this.containers[i].containerCache)) {
+
+                               // if we've already found a container and it's more "inner" than this, then continue 
+                               if(innermostContainer && $.ui.contains(this.containers[i].element[0], innermostContainer.element[0]))
+                                       continue;
+
+                               innermostContainer = this.containers[i]; 
+                               innermostIndex = i;
+                                       
+                       } else {
+                               // container doesn't intersect. trigger "out" event if necessary 
+                               if(this.containers[i].containerCache.over) {
+                                       this.containers[i]._trigger("out", event, this._uiHash(this));
+                                       this.containers[i].containerCache.over = 0;
+                               }
+                       }
+
+               }
+               
+               // if no intersecting containers found, return 
+               if(!innermostContainer) return; 
+
+               // move the item into the container if it's not there already
+               if(this.containers.length === 1) {
+                       this.containers[innermostIndex]._trigger("over", event, this._uiHash(this));
+                       this.containers[innermostIndex].containerCache.over = 1;
+               } else if(this.currentContainer != this.containers[innermostIndex]) {
+
+                       //When entering a new container, we will find the item with the least distance and append our item near it
+                       var dist = 10000; var itemWithLeastDistance = null; var base = this.positionAbs[this.containers[innermostIndex].floating ? 'left' : 'top'];
+                       for (var j = this.items.length - 1; j >= 0; j--) {
+                               if(!$.ui.contains(this.containers[innermostIndex].element[0], this.items[j].item[0])) continue;
+                               var cur = this.containers[innermostIndex].floating ? this.items[j].item.offset().left : this.items[j].item.offset().top;
+                               if(Math.abs(cur - base) < dist) {
+                                       dist = Math.abs(cur - base); itemWithLeastDistance = this.items[j];
+                                       this.direction = (cur - base > 0) ? 'down' : 'up';
+                               }
+                       }
+
+                       if(!itemWithLeastDistance && !this.options.dropOnEmpty) //Check if dropOnEmpty is enabled
+                               return;
+
+                       this.currentContainer = this.containers[innermostIndex];
+                       itemWithLeastDistance ? this._rearrange(event, itemWithLeastDistance, null, true) : this._rearrange(event, null, this.containers[innermostIndex].element, true);
+                       this._trigger("change", event, this._uiHash());
+                       this.containers[innermostIndex]._trigger("change", event, this._uiHash(this));
+
+                       //Update the placeholder
+                       this.options.placeholder.update(this.currentContainer, this.placeholder);
+
+                       this.containers[innermostIndex]._trigger("over", event, this._uiHash(this));
+                       this.containers[innermostIndex].containerCache.over = 1;
+               } 
+       
+               
+       },
+
+       _createHelper: function(event) {
+
+               var o = this.options;
+               var helper = $.isFunction(o.helper) ? $(o.helper.apply(this.element[0], [event, this.currentItem])) : (o.helper == 'clone' ? this.currentItem.clone() : this.currentItem);
+
+               if(!helper.parents('body').length) //Add the helper to the DOM if that didn't happen already
+                       $(o.appendTo != 'parent' ? o.appendTo : this.currentItem[0].parentNode)[0].appendChild(helper[0]);
+
+               if(helper[0] == this.currentItem[0])
+                       this._storedCSS = { width: this.currentItem[0].style.width, height: this.currentItem[0].style.height, position: this.currentItem.css("position"), top: this.currentItem.css("top"), left: this.currentItem.css("left") };
+
+               if(helper[0].style.width == '' || o.forceHelperSize) helper.width(this.currentItem.width());
+               if(helper[0].style.height == '' || o.forceHelperSize) helper.height(this.currentItem.height());
+
+               return helper;
+
+       },
+
+       _adjustOffsetFromHelper: function(obj) {
+               if (typeof obj == 'string') {
+                       obj = obj.split(' ');
+               }
+               if ($.isArray(obj)) {
+                       obj = {left: +obj[0], top: +obj[1] || 0};
+               }
+               if ('left' in obj) {
+                       this.offset.click.left = obj.left + this.margins.left;
+               }
+               if ('right' in obj) {
+                       this.offset.click.left = this.helperProportions.width - obj.right + this.margins.left;
+               }
+               if ('top' in obj) {
+                       this.offset.click.top = obj.top + this.margins.top;
+               }
+               if ('bottom' in obj) {
+                       this.offset.click.top = this.helperProportions.height - obj.bottom + this.margins.top;
+               }
+       },
+
+       _getParentOffset: function() {
+
+
+               //Get the offsetParent and cache its position
+               this.offsetParent = this.helper.offsetParent();
+               var po = this.offsetParent.offset();
+
+               // This is a special case where we need to modify a offset calculated on start, since the following happened:
+               // 1. The position of the helper is absolute, so it's position is calculated based on the next positioned parent
+               // 2. The actual offset parent is a child of the scroll parent, and the scroll parent isn't the document, which means that
+               //    the scroll is included in the initial calculation of the offset of the parent, and never recalculated upon drag
+               if(this.cssPosition == 'absolute' && this.scrollParent[0] != document && $.ui.contains(this.scrollParent[0], this.offsetParent[0])) {
+                       po.left += this.scrollParent.scrollLeft();
+                       po.top += this.scrollParent.scrollTop();
+               }
+
+               if((this.offsetParent[0] == document.body) //This needs to be actually done for all browsers, since pageX/pageY includes this information
+               || (this.offsetParent[0].tagName && this.offsetParent[0].tagName.toLowerCase() == 'html' && $.browser.msie)) //Ugly IE fix
+                       po = { top: 0, left: 0 };
+
+               return {
+                       top: po.top + (parseInt(this.offsetParent.css("borderTopWidth"),10) || 0),
+                       left: po.left + (parseInt(this.offsetParent.css("borderLeftWidth"),10) || 0)
+               };
+
+       },
+
+       _getRelativeOffset: function() {
+
+               if(this.cssPosition == "relative") {
+                       var p = this.currentItem.position();
+                       return {
+                               top: p.top - (parseInt(this.helper.css("top"),10) || 0) + this.scrollParent.scrollTop(),
+                               left: p.left - (parseInt(this.helper.css("left"),10) || 0) + this.scrollParent.scrollLeft()
+                       };
+               } else {
+                       return { top: 0, left: 0 };
+               }
+
+       },
+
+       _cacheMargins: function() {
+               this.margins = {
+                       left: (parseInt(this.currentItem.css("marginLeft"),10) || 0),
+                       top: (parseInt(this.currentItem.css("marginTop"),10) || 0)
+               };
+       },
+
+       _cacheHelperProportions: function() {
+               this.helperProportions = {
+                       width: this.helper.outerWidth(),
+                       height: this.helper.outerHeight()
+               };
+       },
+
+       _setContainment: function() {
+
+               var o = this.options;
+               if(o.containment == 'parent') o.containment = this.helper[0].parentNode;
+               if(o.containment == 'document' || o.containment == 'window') this.containment = [
+                       0 - this.offset.relative.left - this.offset.parent.left,
+                       0 - this.offset.relative.top - this.offset.parent.top,
+                       $(o.containment == 'document' ? document : window).width() - this.helperProportions.width - this.margins.left,
+                       ($(o.containment == 'document' ? document : window).height() || document.body.parentNode.scrollHeight) - this.helperProportions.height - this.margins.top
+               ];
+
+               if(!(/^(document|window|parent)$/).test(o.containment)) {
+                       var ce = $(o.containment)[0];
+                       var co = $(o.containment).offset();
+                       var over = ($(ce).css("overflow") != 'hidden');
+
+                       this.containment = [
+                               co.left + (parseInt($(ce).css("borderLeftWidth"),10) || 0) + (parseInt($(ce).css("paddingLeft"),10) || 0) - this.margins.left,
+                               co.top + (parseInt($(ce).css("borderTopWidth"),10) || 0) + (parseInt($(ce).css("paddingTop"),10) || 0) - this.margins.top,
+                               co.left+(over ? Math.max(ce.scrollWidth,ce.offsetWidth) : ce.offsetWidth) - (parseInt($(ce).css("borderLeftWidth"),10) || 0) - (parseInt($(ce).css("paddingRight"),10) || 0) - this.helperProportions.width - this.margins.left,
+                               co.top+(over ? Math.max(ce.scrollHeight,ce.offsetHeight) : ce.offsetHeight) - (parseInt($(ce).css("borderTopWidth"),10) || 0) - (parseInt($(ce).css("paddingBottom"),10) || 0) - this.helperProportions.height - this.margins.top
+                       ];
+               }
+
+       },
+
+       _convertPositionTo: function(d, pos) {
+
+               if(!pos) pos = this.position;
+               var mod = d == "absolute" ? 1 : -1;
+               var o = this.options, scroll = this.cssPosition == 'absolute' && !(this.scrollParent[0] != document && $.ui.contains(this.scrollParent[0], this.offsetParent[0])) ? this.offsetParent : this.scrollParent, scrollIsRootNode = (/(html|body)/i).test(scroll[0].tagName);
+
+               return {
+                       top: (
+                               pos.top                                                                                                                                 // The absolute mouse position
+                               + this.offset.relative.top * mod                                                                                // Only for relative positioned nodes: Relative offset from element to offset parent
+                               + this.offset.parent.top * mod                                                                                  // The offsetParent's offset without borders (offset + border)
+                               - ($.browser.safari && this.cssPosition == 'fixed' ? 0 : ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollTop() : ( scrollIsRootNode ? 0 : scroll.scrollTop() ) ) * mod)
+                       ),
+                       left: (
+                               pos.left                                                                                                                                // The absolute mouse position
+                               + this.offset.relative.left * mod                                                                               // Only for relative positioned nodes: Relative offset from element to offset parent
+                               + this.offset.parent.left * mod                                                                                 // The offsetParent's offset without borders (offset + border)
+                               - ($.browser.safari && this.cssPosition == 'fixed' ? 0 : ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollLeft() : scrollIsRootNode ? 0 : scroll.scrollLeft() ) * mod)
+                       )
+               };
+
+       },
+
+       _generatePosition: function(event) {
+
+               var o = this.options, scroll = this.cssPosition == 'absolute' && !(this.scrollParent[0] != document && $.ui.contains(this.scrollParent[0], this.offsetParent[0])) ? this.offsetParent : this.scrollParent, scrollIsRootNode = (/(html|body)/i).test(scroll[0].tagName);
+
+               // This is another very weird special case that only happens for relative elements:
+               // 1. If the css position is relative
+               // 2. and the scroll parent is the document or similar to the offset parent
+               // we have to refresh the relative offset during the scroll so there are no jumps
+               if(this.cssPosition == 'relative' && !(this.scrollParent[0] != document && this.scrollParent[0] != this.offsetParent[0])) {
+                       this.offset.relative = this._getRelativeOffset();
+               }
+
+               var pageX = event.pageX;
+               var pageY = event.pageY;
+
+               /*
+                * - Position constraining -
+                * Constrain the position to a mix of grid, containment.
+                */
+
+               if(this.originalPosition) { //If we are not dragging yet, we won't check for options
+
+                       if(this.containment) {
+                               if(event.pageX - this.offset.click.left < this.containment[0]) pageX = this.containment[0] + this.offset.click.left;
+                               if(event.pageY - this.offset.click.top < this.containment[1]) pageY = this.containment[1] + this.offset.click.top;
+                               if(event.pageX - this.offset.click.left > this.containment[2]) pageX = this.containment[2] + this.offset.click.left;
+                               if(event.pageY - this.offset.click.top > this.containment[3]) pageY = this.containment[3] + this.offset.click.top;
+                       }
+
+                       if(o.grid) {
+                               var top = this.originalPageY + Math.round((pageY - this.originalPageY) / o.grid[1]) * o.grid[1];
+                               pageY = this.containment ? (!(top - this.offset.click.top < this.containment[1] || top - this.offset.click.top > this.containment[3]) ? top : (!(top - this.offset.click.top < this.containment[1]) ? top - o.grid[1] : top + o.grid[1])) : top;
+
+                               var left = this.originalPageX + Math.round((pageX - this.originalPageX) / o.grid[0]) * o.grid[0];
+                               pageX = this.containment ? (!(left - this.offset.click.left < this.containment[0] || left - this.offset.click.left > this.containment[2]) ? left : (!(left - this.offset.click.left < this.containment[0]) ? left - o.grid[0] : left + o.grid[0])) : left;
+                       }
+
+               }
+
+               return {
+                       top: (
+                               pageY                                                                                                                           // The absolute mouse position
+                               - this.offset.click.top                                                                                                 // Click offset (relative to the element)
+                               - this.offset.relative.top                                                                                              // Only for relative positioned nodes: Relative offset from element to offset parent
+                               - this.offset.parent.top                                                                                                // The offsetParent's offset without borders (offset + border)
+                               + ($.browser.safari && this.cssPosition == 'fixed' ? 0 : ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollTop() : ( scrollIsRootNode ? 0 : scroll.scrollTop() ) ))
+                       ),
+                       left: (
+                               pageX                                                                                                                           // The absolute mouse position
+                               - this.offset.click.left                                                                                                // Click offset (relative to the element)
+                               - this.offset.relative.left                                                                                             // Only for relative positioned nodes: Relative offset from element to offset parent
+                               - this.offset.parent.left                                                                                               // The offsetParent's offset without borders (offset + border)
+                               + ($.browser.safari && this.cssPosition == 'fixed' ? 0 : ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollLeft() : scrollIsRootNode ? 0 : scroll.scrollLeft() ))
+                       )
+               };
+
+       },
+
+       _rearrange: function(event, i, a, hardRefresh) {
+
+               a ? a[0].appendChild(this.placeholder[0]) : i.item[0].parentNode.insertBefore(this.placeholder[0], (this.direction == 'down' ? i.item[0] : i.item[0].nextSibling));
+
+               //Various things done here to improve the performance:
+               // 1. we create a setTimeout, that calls refreshPositions
+               // 2. on the instance, we have a counter variable, that get's higher after every append
+               // 3. on the local scope, we copy the counter variable, and check in the timeout, if it's still the same
+               // 4. this lets only the last addition to the timeout stack through
+               this.counter = this.counter ? ++this.counter : 1;
+               var self = this, counter = this.counter;
+
+               window.setTimeout(function() {
+                       if(counter == self.counter) self.refreshPositions(!hardRefresh); //Precompute after each DOM insertion, NOT on mousemove
+               },0);
+
+       },
+
+       _clear: function(event, noPropagation) {
+
+               this.reverting = false;
+               // We delay all events that have to be triggered to after the point where the placeholder has been removed and
+               // everything else normalized again
+               var delayedTriggers = [], self = this;
+
+               // We first have to update the dom position of the actual currentItem
+               // Note: don't do it if the current item is already removed (by a user), or it gets reappended (see #4088)
+               if(!this._noFinalSort && this.currentItem.parent().length) this.placeholder.before(this.currentItem);
+               this._noFinalSort = null;
+
+               if(this.helper[0] == this.currentItem[0]) {
+                       for(var i in this._storedCSS) {
+                               if(this._storedCSS[i] == 'auto' || this._storedCSS[i] == 'static') this._storedCSS[i] = '';
+                       }
+                       this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper");
+               } else {
+                       this.currentItem.show();
+               }
+
+               if(this.fromOutside && !noPropagation) delayedTriggers.push(function(event) { this._trigger("receive", event, this._uiHash(this.fromOutside)); });
+               if((this.fromOutside || this.domPosition.prev != this.currentItem.prev().not(".ui-sortable-helper")[0] || this.domPosition.parent != this.currentItem.parent()[0]) && !noPropagation) delayedTriggers.push(function(event) { this._trigger("update", event, this._uiHash()); }); //Trigger update callback if the DOM position has changed
+
+               // Check if the items Container has Changed and trigger appropriate
+               // events.
+               if (this !== this.currentContainer) {
+                       if(!noPropagation) {
+                               delayedTriggers.push(function(event) { this._trigger("remove", event, this._uiHash()); });
+                               delayedTriggers.push((function(c) { return function(event) { c._trigger("receive", event, this._uiHash(this)); };  }).call(this, this.currentContainer));
+                               delayedTriggers.push((function(c) { return function(event) { c._trigger("update", event, this._uiHash(this));  }; }).call(this, this.currentContainer));
+                       }
+               }
+
+               //Post events to containers
+               for (var i = this.containers.length - 1; i >= 0; i--){
+                       if(!noPropagation) delayedTriggers.push((function(c) { return function(event) { c._trigger("deactivate", event, this._uiHash(this)); };  }).call(this, this.containers[i]));
+                       if(this.containers[i].containerCache.over) {
+                               delayedTriggers.push((function(c) { return function(event) { c._trigger("out", event, this._uiHash(this)); };  }).call(this, this.containers[i]));
+                               this.containers[i].containerCache.over = 0;
+                       }
+               }
+
+               //Do what was originally in plugins
+               if(this._storedCursor) $('body').css("cursor", this._storedCursor); //Reset cursor
+               if(this._storedOpacity) this.helper.css("opacity", this._storedOpacity); //Reset opacity
+               if(this._storedZIndex) this.helper.css("zIndex", this._storedZIndex == 'auto' ? '' : this._storedZIndex); //Reset z-index
+
+               this.dragging = false;
+               if(this.cancelHelperRemoval) {
+                       if(!noPropagation) {
+                               this._trigger("beforeStop", event, this._uiHash());
+                               for (var i=0; i < delayedTriggers.length; i++) { delayedTriggers[i].call(this, event); }; //Trigger all delayed events
+                               this._trigger("stop", event, this._uiHash());
+                       }
+
+                       this.fromOutside = false;
+                       return false;
+               }
+
+               if(!noPropagation) this._trigger("beforeStop", event, this._uiHash());
+
+               //$(this.placeholder[0]).remove(); would have been the jQuery way - unfortunately, it unbinds ALL events from the original node!
+               this.placeholder[0].parentNode.removeChild(this.placeholder[0]);
+
+               if(this.helper[0] != this.currentItem[0]) this.helper.remove(); this.helper = null;
+
+               if(!noPropagation) {
+                       for (var i=0; i < delayedTriggers.length; i++) { delayedTriggers[i].call(this, event); }; //Trigger all delayed events
+                       this._trigger("stop", event, this._uiHash());
+               }
+
+               this.fromOutside = false;
+               return true;
+
+       },
+
+       _trigger: function() {
+               if ($.Widget.prototype._trigger.apply(this, arguments) === false) {
+                       this.cancel();
+               }
+       },
+
+       _uiHash: function(inst) {
+               var self = inst || this;
+               return {
+                       helper: self.helper,
+                       placeholder: self.placeholder || $([]),
+                       position: self.position,
+                       originalPosition: self.originalPosition,
+                       offset: self.positionAbs,
+                       item: self.currentItem,
+                       sender: inst ? inst.element : null
+               };
+       }
+
+});
+
+$.extend($.ui.sortable, {
+       version: "1.8.24"
+});
+
+})(jQuery);
diff --git a/resources/lib/jquery.ui/jquery.ui.tabs.js b/resources/lib/jquery.ui/jquery.ui.tabs.js
new file mode 100644 (file)
index 0000000..0c47f0e
--- /dev/null
@@ -0,0 +1,757 @@
+/*!
+ * jQuery UI Tabs 1.8.24
+ *
+ * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Tabs
+ *
+ * Depends:
+ *     jquery.ui.core.js
+ *     jquery.ui.widget.js
+ */
+(function( $, undefined ) {
+
+var tabId = 0,
+       listId = 0;
+
+function getNextTabId() {
+       return ++tabId;
+}
+
+function getNextListId() {
+       return ++listId;
+}
+
+$.widget( "ui.tabs", {
+       options: {
+               add: null,
+               ajaxOptions: null,
+               cache: false,
+               cookie: null, // e.g. { expires: 7, path: '/', domain: 'jquery.com', secure: true }
+               collapsible: false,
+               disable: null,
+               disabled: [],
+               enable: null,
+               event: "click",
+               fx: null, // e.g. { height: 'toggle', opacity: 'toggle', duration: 200 }
+               idPrefix: "ui-tabs-",
+               load: null,
+               panelTemplate: "<div></div>",
+               remove: null,
+               select: null,
+               show: null,
+               spinner: "<em>Loading&#8230;</em>",
+               tabTemplate: "<li><a href='#{href}'><span>#{label}</span></a></li>"
+       },
+
+       _create: function() {
+               this._tabify( true );
+       },
+
+       _setOption: function( key, value ) {
+               if ( key == "selected" ) {
+                       if (this.options.collapsible && value == this.options.selected ) {
+                               return;
+                       }
+                       this.select( value );
+               } else {
+                       this.options[ key ] = value;
+                       this._tabify();
+               }
+       },
+
+       _tabId: function( a ) {
+               return a.title && a.title.replace( /\s/g, "_" ).replace( /[^\w\u00c0-\uFFFF-]/g, "" ) ||
+                       this.options.idPrefix + getNextTabId();
+       },
+
+       _sanitizeSelector: function( hash ) {
+               // we need this because an id may contain a ":"
+               return hash.replace( /:/g, "\\:" );
+       },
+
+       _cookie: function() {
+               var cookie = this.cookie ||
+                       ( this.cookie = this.options.cookie.name || "ui-tabs-" + getNextListId() );
+               return $.cookie.apply( null, [ cookie ].concat( $.makeArray( arguments ) ) );
+       },
+
+       _ui: function( tab, panel ) {
+               return {
+                       tab: tab,
+                       panel: panel,
+                       index: this.anchors.index( tab )
+               };
+       },
+
+       _cleanup: function() {
+               // restore all former loading tabs labels
+               this.lis.filter( ".ui-state-processing" )
+                       .removeClass( "ui-state-processing" )
+                       .find( "span:data(label.tabs)" )
+                               .each(function() {
+                                       var el = $( this );
+                                       el.html( el.data( "label.tabs" ) ).removeData( "label.tabs" );
+                               });
+       },
+
+       _tabify: function( init ) {
+               var self = this,
+                       o = this.options,
+                       fragmentId = /^#.+/; // Safari 2 reports '#' for an empty hash
+
+               this.list = this.element.find( "ol,ul" ).eq( 0 );
+               this.lis = $( " > li:has(a[href])", this.list );
+               this.anchors = this.lis.map(function() {
+                       return $( "a", this )[ 0 ];
+               });
+               this.panels = $( [] );
+
+               this.anchors.each(function( i, a ) {
+                       var href = $( a ).attr( "href" );
+                       // For dynamically created HTML that contains a hash as href IE < 8 expands
+                       // such href to the full page url with hash and then misinterprets tab as ajax.
+                       // Same consideration applies for an added tab with a fragment identifier
+                       // since a[href=#fragment-identifier] does unexpectedly not match.
+                       // Thus normalize href attribute...
+                       var hrefBase = href.split( "#" )[ 0 ],
+                               baseEl;
+                       if ( hrefBase && ( hrefBase === location.toString().split( "#" )[ 0 ] ||
+                                       ( baseEl = $( "base" )[ 0 ]) && hrefBase === baseEl.href ) ) {
+                               href = a.hash;
+                               a.href = href;
+                       }
+
+                       // inline tab
+                       if ( fragmentId.test( href ) ) {
+                               self.panels = self.panels.add( self.element.find( self._sanitizeSelector( href ) ) );
+                       // remote tab
+                       // prevent loading the page itself if href is just "#"
+                       } else if ( href && href !== "#" ) {
+                               // required for restore on destroy
+                               $.data( a, "href.tabs", href );
+
+                               // TODO until #3808 is fixed strip fragment identifier from url
+                               // (IE fails to load from such url)
+                               $.data( a, "load.tabs", href.replace( /#.*$/, "" ) );
+
+                               var id = self._tabId( a );
+                               a.href = "#" + id;
+                               var $panel = self.element.find( "#" + id );
+                               if ( !$panel.length ) {
+                                       $panel = $( o.panelTemplate )
+                                               .attr( "id", id )
+                                               .addClass( "ui-tabs-panel ui-widget-content ui-corner-bottom" )
+                                               .insertAfter( self.panels[ i - 1 ] || self.list );
+                                       $panel.data( "destroy.tabs", true );
+                               }
+                               self.panels = self.panels.add( $panel );
+                       // invalid tab href
+                       } else {
+                               o.disabled.push( i );
+                       }
+               });
+
+               // initialization from scratch
+               if ( init ) {
+                       // attach necessary classes for styling
+                       this.element.addClass( "ui-tabs ui-widget ui-widget-content ui-corner-all" );
+                       this.list.addClass( "ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all" );
+                       this.lis.addClass( "ui-state-default ui-corner-top" );
+                       this.panels.addClass( "ui-tabs-panel ui-widget-content ui-corner-bottom" );
+
+                       // Selected tab
+                       // use "selected" option or try to retrieve:
+                       // 1. from fragment identifier in url
+                       // 2. from cookie
+                       // 3. from selected class attribute on <li>
+                       if ( o.selected === undefined ) {
+                               if ( location.hash ) {
+                                       this.anchors.each(function( i, a ) {
+                                               if ( a.hash == location.hash ) {
+                                                       o.selected = i;
+                                                       return false;
+                                               }
+                                       });
+                               }
+                               if ( typeof o.selected !== "number" && o.cookie ) {
+                                       o.selected = parseInt( self._cookie(), 10 );
+                               }
+                               if ( typeof o.selected !== "number" && this.lis.filter( ".ui-tabs-selected" ).length ) {
+                                       o.selected = this.lis.index( this.lis.filter( ".ui-tabs-selected" ) );
+                               }
+                               o.selected = o.selected || ( this.lis.length ? 0 : -1 );
+                       } else if ( o.selected === null ) { // usage of null is deprecated, TODO remove in next release
+                               o.selected = -1;
+                       }
+
+                       // sanity check - default to first tab...
+                       o.selected = ( ( o.selected >= 0 && this.anchors[ o.selected ] ) || o.selected < 0 )
+                               ? o.selected
+                               : 0;
+
+                       // Take disabling tabs via class attribute from HTML
+                       // into account and update option properly.
+                       // A selected tab cannot become disabled.
+                       o.disabled = $.unique( o.disabled.concat(
+                               $.map( this.lis.filter( ".ui-state-disabled" ), function( n, i ) {
+                                       return self.lis.index( n );
+                               })
+                       ) ).sort();
+
+                       if ( $.inArray( o.selected, o.disabled ) != -1 ) {
+                               o.disabled.splice( $.inArray( o.selected, o.disabled ), 1 );
+                       }
+
+                       // highlight selected tab
+                       this.panels.addClass( "ui-tabs-hide" );
+                       this.lis.removeClass( "ui-tabs-selected ui-state-active" );
+                       // check for length avoids error when initializing empty list
+                       if ( o.selected >= 0 && this.anchors.length ) {
+                               self.element.find( self._sanitizeSelector( self.anchors[ o.selected ].hash ) ).removeClass( "ui-tabs-hide" );
+                               this.lis.eq( o.selected ).addClass( "ui-tabs-selected ui-state-active" );
+
+                               // seems to be expected behavior that the show callback is fired
+                               self.element.queue( "tabs", function() {
+                                       self._trigger( "show", null,
+                                               self._ui( self.anchors[ o.selected ], self.element.find( self._sanitizeSelector( self.anchors[ o.selected ].hash ) )[ 0 ] ) );
+                               });
+
+                               this.load( o.selected );
+                       }
+
+                       // clean up to avoid memory leaks in certain versions of IE 6
+                       // TODO: namespace this event
+                       $( window ).bind( "unload", function() {
+                               self.lis.add( self.anchors ).unbind( ".tabs" );
+                               self.lis = self.anchors = self.panels = null;
+                       });
+               // update selected after add/remove
+               } else {
+                       o.selected = this.lis.index( this.lis.filter( ".ui-tabs-selected" ) );
+               }
+
+               // update collapsible
+               // TODO: use .toggleClass()
+               this.element[ o.collapsible ? "addClass" : "removeClass" ]( "ui-tabs-collapsible" );
+
+               // set or update cookie after init and add/remove respectively
+               if ( o.cookie ) {
+                       this._cookie( o.selected, o.cookie );
+               }
+
+               // disable tabs
+               for ( var i = 0, li; ( li = this.lis[ i ] ); i++ ) {
+                       $( li )[ $.inArray( i, o.disabled ) != -1 &&
+                               // TODO: use .toggleClass()
+                               !$( li ).hasClass( "ui-tabs-selected" ) ? "addClass" : "removeClass" ]( "ui-state-disabled" );
+               }
+
+               // reset cache if switching from cached to not cached
+               if ( o.cache === false ) {
+                       this.anchors.removeData( "cache.tabs" );
+               }
+
+               // remove all handlers before, tabify may run on existing tabs after add or option change
+               this.lis.add( this.anchors ).unbind( ".tabs" );
+
+               if ( o.event !== "mouseover" ) {
+                       var addState = function( state, el ) {
+                               if ( el.is( ":not(.ui-state-disabled)" ) ) {
+                                       el.addClass( "ui-state-" + state );
+                               }
+                       };
+                       var removeState = function( state, el ) {
+                               el.removeClass( "ui-state-" + state );
+                       };
+                       this.lis.bind( "mouseover.tabs" , function() {
+                               addState( "hover", $( this ) );
+                       });
+                       this.lis.bind( "mouseout.tabs", function() {
+                               removeState( "hover", $( this ) );
+                       });
+                       this.anchors.bind( "focus.tabs", function() {
+                               addState( "focus", $( this ).closest( "li" ) );
+                       });
+                       this.anchors.bind( "blur.tabs", function() {
+                               removeState( "focus", $( this ).closest( "li" ) );
+                       });
+               }
+
+               // set up animations
+               var hideFx, showFx;
+               if ( o.fx ) {
+                       if ( $.isArray( o.fx ) ) {
+                               hideFx = o.fx[ 0 ];
+                               showFx = o.fx[ 1 ];
+                       } else {
+                               hideFx = showFx = o.fx;
+                       }
+               }
+
+               // Reset certain styles left over from animation
+               // and prevent IE's ClearType bug...
+               function resetStyle( $el, fx ) {
+                       $el.css( "display", "" );
+                       if ( !$.support.opacity && fx.opacity ) {
+                               $el[ 0 ].style.removeAttribute( "filter" );
+                       }
+               }
+
+               // Show a tab...
+               var showTab = showFx
+                       ? function( clicked, $show ) {
+                               $( clicked ).closest( "li" ).addClass( "ui-tabs-selected ui-state-active" );
+                               $show.hide().removeClass( "ui-tabs-hide" ) // avoid flicker that way
+                                       .animate( showFx, showFx.duration || "normal", function() {
+                                               resetStyle( $show, showFx );
+                                               self._trigger( "show", null, self._ui( clicked, $show[ 0 ] ) );
+                                       });
+                       }
+                       : function( clicked, $show ) {
+                               $( clicked ).closest( "li" ).addClass( "ui-tabs-selected ui-state-active" );
+                               $show.removeClass( "ui-tabs-hide" );
+                               self._trigger( "show", null, self._ui( clicked, $show[ 0 ] ) );
+                       };
+
+               // Hide a tab, $show is optional...
+               var hideTab = hideFx
+                       ? function( clicked, $hide ) {
+                               $hide.animate( hideFx, hideFx.duration || "normal", function() {
+                                       self.lis.removeClass( "ui-tabs-selected ui-state-active" );
+                                       $hide.addClass( "ui-tabs-hide" );
+                                       resetStyle( $hide, hideFx );
+                                       self.element.dequeue( "tabs" );
+                               });
+                       }
+                       : function( clicked, $hide, $show ) {
+                               self.lis.removeClass( "ui-tabs-selected ui-state-active" );
+                               $hide.addClass( "ui-tabs-hide" );
+                               self.element.dequeue( "tabs" );
+                       };
+
+               // attach tab event handler, unbind to avoid duplicates from former tabifying...
+               this.anchors.bind( o.event + ".tabs", function() {
+                       var el = this,
+                               $li = $(el).closest( "li" ),
+                               $hide = self.panels.filter( ":not(.ui-tabs-hide)" ),
+                               $show = self.element.find( self._sanitizeSelector( el.hash ) );
+
+                       // If tab is already selected and not collapsible or tab disabled or
+                       // or is already loading or click callback returns false stop here.
+                       // Check if click handler returns false last so that it is not executed
+                       // for a disabled or loading tab!
+                       if ( ( $li.hasClass( "ui-tabs-selected" ) && !o.collapsible) ||
+                               $li.hasClass( "ui-state-disabled" ) ||
+                               $li.hasClass( "ui-state-processing" ) ||
+                               self.panels.filter( ":animated" ).length ||
+                               self._trigger( "select", null, self._ui( this, $show[ 0 ] ) ) === false ) {
+                               this.blur();
+                               return false;
+                       }
+
+                       o.selected = self.anchors.index( this );
+
+                       self.abort();
+
+                       // if tab may be closed
+                       if ( o.collapsible ) {
+                               if ( $li.hasClass( "ui-tabs-selected" ) ) {
+                                       o.selected = -1;
+
+                                       if ( o.cookie ) {
+                                               self._cookie( o.selected, o.cookie );
+                                       }
+
+                                       self.element.queue( "tabs", function() {
+                                               hideTab( el, $hide );
+                                       }).dequeue( "tabs" );
+
+                                       this.blur();
+                                       return false;
+                               } else if ( !$hide.length ) {
+                                       if ( o.cookie ) {
+                                               self._cookie( o.selected, o.cookie );
+                                       }
+
+                                       self.element.queue( "tabs", function() {
+                                               showTab( el, $show );
+                                       });
+
+                                       // TODO make passing in node possible, see also http://dev.jqueryui.com/ticket/3171
+                                       self.load( self.anchors.index( this ) );
+
+                                       this.blur();
+                                       return false;
+                               }
+                       }
+
+                       if ( o.cookie ) {
+                               self._cookie( o.selected, o.cookie );
+                       }
+
+                       // show new tab
+                       if ( $show.length ) {
+                               if ( $hide.length ) {
+                                       self.element.queue( "tabs", function() {
+                                               hideTab( el, $hide );
+                                       });
+                               }
+                               self.element.queue( "tabs", function() {
+                                       showTab( el, $show );
+                               });
+
+                               self.load( self.anchors.index( this ) );
+                       } else {
+                               throw "jQuery UI Tabs: Mismatching fragment identifier.";
+                       }
+
+                       // Prevent IE from keeping other link focussed when using the back button
+                       // and remove dotted border from clicked link. This is controlled via CSS
+                       // in modern browsers; blur() removes focus from address bar in Firefox
+                       // which can become a usability and annoying problem with tabs('rotate').
+                       if ( $.browser.msie ) {
+                               this.blur();
+                       }
+               });
+
+               // disable click in any case
+               this.anchors.bind( "click.tabs", function(){
+                       return false;
+               });
+       },
+
+    _getIndex: function( index ) {
+               // meta-function to give users option to provide a href string instead of a numerical index.
+               // also sanitizes numerical indexes to valid values.
+               if ( typeof index == "string" ) {
+                       index = this.anchors.index( this.anchors.filter( "[href$='" + index + "']" ) );
+               }
+
+               return index;
+       },
+
+       destroy: function() {
+               var o = this.options;
+
+               this.abort();
+
+               this.element
+                       .unbind( ".tabs" )
+                       .removeClass( "ui-tabs ui-widget ui-widget-content ui-corner-all ui-tabs-collapsible" )
+                       .removeData( "tabs" );
+
+               this.list.removeClass( "ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all" );
+
+               this.anchors.each(function() {
+                       var href = $.data( this, "href.tabs" );
+                       if ( href ) {
+                               this.href = href;
+                       }
+                       var $this = $( this ).unbind( ".tabs" );
+                       $.each( [ "href", "load", "cache" ], function( i, prefix ) {
+                               $this.removeData( prefix + ".tabs" );
+                       });
+               });
+
+               this.lis.unbind( ".tabs" ).add( this.panels ).each(function() {
+                       if ( $.data( this, "destroy.tabs" ) ) {
+                               $( this ).remove();
+                       } else {
+                               $( this ).removeClass([
+                                       "ui-state-default",
+                                       "ui-corner-top",
+                                       "ui-tabs-selected",
+                                       "ui-state-active",
+                                       "ui-state-hover",
+                                       "ui-state-focus",
+                                       "ui-state-disabled",
+                                       "ui-tabs-panel",
+                                       "ui-widget-content",
+                                       "ui-corner-bottom",
+                                       "ui-tabs-hide"
+                               ].join( " " ) );
+                       }
+               });
+
+               if ( o.cookie ) {
+                       this._cookie( null, o.cookie );
+               }
+
+               return this;
+       },
+
+       add: function( url, label, index ) {
+               if ( index === undefined ) {
+                       index = this.anchors.length;
+               }
+
+               var self = this,
+                       o = this.options,
+                       $li = $( o.tabTemplate.replace( /#\{href\}/g, url ).replace( /#\{label\}/g, label ) ),
+                       id = !url.indexOf( "#" ) ? url.replace( "#", "" ) : this._tabId( $( "a", $li )[ 0 ] );
+
+               $li.addClass( "ui-state-default ui-corner-top" ).data( "destroy.tabs", true );
+
+               // try to find an existing element before creating a new one
+               var $panel = self.element.find( "#" + id );
+               if ( !$panel.length ) {
+                       $panel = $( o.panelTemplate )
+                               .attr( "id", id )
+                               .data( "destroy.tabs", true );
+               }
+               $panel.addClass( "ui-tabs-panel ui-widget-content ui-corner-bottom ui-tabs-hide" );
+
+               if ( index >= this.lis.length ) {
+                       $li.appendTo( this.list );
+                       $panel.appendTo( this.list[ 0 ].parentNode );
+               } else {
+                       $li.insertBefore( this.lis[ index ] );
+                       $panel.insertBefore( this.panels[ index ] );
+               }
+
+               o.disabled = $.map( o.disabled, function( n, i ) {
+                       return n >= index ? ++n : n;
+               });
+
+               this._tabify();
+
+               if ( this.anchors.length == 1 ) {
+                       o.selected = 0;
+                       $li.addClass( "ui-tabs-selected ui-state-active" );
+                       $panel.removeClass( "ui-tabs-hide" );
+                       this.element.queue( "tabs", function() {
+                               self._trigger( "show", null, self._ui( self.anchors[ 0 ], self.panels[ 0 ] ) );
+                       });
+
+                       this.load( 0 );
+               }
+
+               this._trigger( "add", null, this._ui( this.anchors[ index ], this.panels[ index ] ) );
+               return this;
+       },
+
+       remove: function( index ) {
+               index = this._getIndex( index );
+               var o = this.options,
+                       $li = this.lis.eq( index ).remove(),
+                       $panel = this.panels.eq( index ).remove();
+
+               // If selected tab was removed focus tab to the right or
+               // in case the last tab was removed the tab to the left.
+               if ( $li.hasClass( "ui-tabs-selected" ) && this.anchors.length > 1) {
+                       this.select( index + ( index + 1 < this.anchors.length ? 1 : -1 ) );
+               }
+
+               o.disabled = $.map(
+                       $.grep( o.disabled, function(n, i) {
+                               return n != index;
+                       }),
+                       function( n, i ) {
+                               return n >= index ? --n : n;
+                       });
+
+               this._tabify();
+
+               this._trigger( "remove", null, this._ui( $li.find( "a" )[ 0 ], $panel[ 0 ] ) );
+               return this;
+       },
+
+       enable: function( index ) {
+               index = this._getIndex( index );
+               var o = this.options;
+               if ( $.inArray( index, o.disabled ) == -1 ) {
+                       return;
+               }
+
+               this.lis.eq( index ).removeClass( "ui-state-disabled" );
+               o.disabled = $.grep( o.disabled, function( n, i ) {
+                       return n != index;
+               });
+
+               this._trigger( "enable", null, this._ui( this.anchors[ index ], this.panels[ index ] ) );
+               return this;
+       },
+
+       disable: function( index ) {
+               index = this._getIndex( index );
+               var self = this, o = this.options;
+               // cannot disable already selected tab
+               if ( index != o.selected ) {
+                       this.lis.eq( index ).addClass( "ui-state-disabled" );
+
+                       o.disabled.push( index );
+                       o.disabled.sort();
+
+                       this._trigger( "disable", null, this._ui( this.anchors[ index ], this.panels[ index ] ) );
+               }
+
+               return this;
+       },
+
+       select: function( index ) {
+               index = this._getIndex( index );
+               if ( index == -1 ) {
+                       if ( this.options.collapsible && this.options.selected != -1 ) {
+                               index = this.options.selected;
+                       } else {
+                               return this;
+                       }
+               }
+               this.anchors.eq( index ).trigger( this.options.event + ".tabs" );
+               return this;
+       },
+
+       load: function( index ) {
+               index = this._getIndex( index );
+               var self = this,
+                       o = this.options,
+                       a = this.anchors.eq( index )[ 0 ],
+                       url = $.data( a, "load.tabs" );
+
+               this.abort();
+
+               // not remote or from cache
+               if ( !url || this.element.queue( "tabs" ).length !== 0 && $.data( a, "cache.tabs" ) ) {
+                       this.element.dequeue( "tabs" );
+                       return;
+               }
+
+               // load remote from here on
+               this.lis.eq( index ).addClass( "ui-state-processing" );
+
+               if ( o.spinner ) {
+                       var span = $( "span", a );
+                       span.data( "label.tabs", span.html() ).html( o.spinner );
+               }
+
+               this.xhr = $.ajax( $.extend( {}, o.ajaxOptions, {
+                       url: url,
+                       success: function( r, s ) {
+                               self.element.find( self._sanitizeSelector( a.hash ) ).html( r );
+
+                               // take care of tab labels
+                               self._cleanup();
+
+                               if ( o.cache ) {
+                                       $.data( a, "cache.tabs", true );
+                               }
+
+                               self._trigger( "load", null, self._ui( self.anchors[ index ], self.panels[ index ] ) );
+                               try {
+                                       o.ajaxOptions.success( r, s );
+                               }
+                               catch ( e ) {}
+                       },
+                       error: function( xhr, s, e ) {
+                               // take care of tab labels
+                               self._cleanup();
+
+                               self._trigger( "load", null, self._ui( self.anchors[ index ], self.panels[ index ] ) );
+                               try {
+                                       // Passing index avoid a race condition when this method is
+                                       // called after the user has selected another tab.
+                                       // Pass the anchor that initiated this request allows
+                                       // loadError to manipulate the tab content panel via $(a.hash)
+                                       o.ajaxOptions.error( xhr, s, index, a );
+                               }
+                               catch ( e ) {}
+                       }
+               } ) );
+
+               // last, so that load event is fired before show...
+               self.element.dequeue( "tabs" );
+
+               return this;
+       },
+
+       abort: function() {
+               // stop possibly running animations
+               this.element.queue( [] );
+               this.panels.stop( false, true );
+
+               // "tabs" queue must not contain more than two elements,
+               // which are the callbacks for the latest clicked tab...
+               this.element.queue( "tabs", this.element.queue( "tabs" ).splice( -2, 2 ) );
+
+               // terminate pending requests from other tabs
+               if ( this.xhr ) {
+                       this.xhr.abort();
+                       delete this.xhr;
+               }
+
+               // take care of tab labels
+               this._cleanup();
+               return this;
+       },
+
+       url: function( index, url ) {
+               this.anchors.eq( index ).removeData( "cache.tabs" ).data( "load.tabs", url );
+               return this;
+       },
+
+       length: function() {
+               return this.anchors.length;
+       }
+});
+
+$.extend( $.ui.tabs, {
+       version: "1.8.24"
+});
+
+/*
+ * Tabs Extensions
+ */
+
+/*
+ * Rotate
+ */
+$.extend( $.ui.tabs.prototype, {
+       rotation: null,
+       rotate: function( ms, continuing ) {
+               var self = this,
+                       o = this.options;
+
+               var rotate = self._rotate || ( self._rotate = function( e ) {
+                       clearTimeout( self.rotation );
+                       self.rotation = setTimeout(function() {
+                               var t = o.selected;
+                               self.select( ++t < self.anchors.length ? t : 0 );
+                       }, ms );
+                       
+                       if ( e ) {
+                               e.stopPropagation();
+                       }
+               });
+
+               var stop = self._unrotate || ( self._unrotate = !continuing
+                       ? function(e) {
+                               if (e.clientX) { // in case of a true click
+                                       self.rotate(null);
+                               }
+                       }
+                       : function( e ) {
+                               rotate();
+                       });
+
+               // start rotation
+               if ( ms ) {
+                       this.element.bind( "tabsshow", rotate );
+                       this.anchors.bind( o.event + ".tabs", stop );
+                       rotate();
+               // stop rotation
+               } else {
+                       clearTimeout( self.rotation );
+                       this.element.unbind( "tabsshow", rotate );
+                       this.anchors.unbind( o.event + ".tabs", stop );
+                       delete this._rotate;
+                       delete this._unrotate;
+               }
+
+               return this;
+       }
+});
+
+})( jQuery );
diff --git a/resources/lib/jquery.ui/jquery.ui.widget.js b/resources/lib/jquery.ui/jquery.ui.widget.js
new file mode 100644 (file)
index 0000000..66ef013
--- /dev/null
@@ -0,0 +1,272 @@
+/*!
+ * jQuery UI Widget 1.8.24
+ *
+ * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Widget
+ */
+(function( $, undefined ) {
+
+// jQuery 1.4+
+if ( $.cleanData ) {
+       var _cleanData = $.cleanData;
+       $.cleanData = function( elems ) {
+               for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {
+                       try {
+                               $( elem ).triggerHandler( "remove" );
+                       // http://bugs.jquery.com/ticket/8235
+                       } catch( e ) {}
+               }
+               _cleanData( elems );
+       };
+} else {
+       var _remove = $.fn.remove;
+       $.fn.remove = function( selector, keepData ) {
+               return this.each(function() {
+                       if ( !keepData ) {
+                               if ( !selector || $.filter( selector, [ this ] ).length ) {
+                                       $( "*", this ).add( [ this ] ).each(function() {
+                                               try {
+                                                       $( this ).triggerHandler( "remove" );
+                                               // http://bugs.jquery.com/ticket/8235
+                                               } catch( e ) {}
+                                       });
+                               }
+                       }
+                       return _remove.call( $(this), selector, keepData );
+               });
+       };
+}
+
+$.widget = function( name, base, prototype ) {
+       var namespace = name.split( "." )[ 0 ],
+               fullName;
+       name = name.split( "." )[ 1 ];
+       fullName = namespace + "-" + name;
+
+       if ( !prototype ) {
+               prototype = base;
+               base = $.Widget;
+       }
+
+       // create selector for plugin
+       $.expr[ ":" ][ fullName ] = function( elem ) {
+               return !!$.data( elem, name );
+       };
+
+       $[ namespace ] = $[ namespace ] || {};
+       $[ namespace ][ name ] = function( options, element ) {
+               // allow instantiation without initializing for simple inheritance
+               if ( arguments.length ) {
+                       this._createWidget( options, element );
+               }
+       };
+
+       var basePrototype = new base();
+       // we need to make the options hash a property directly on the new instance
+       // otherwise we'll modify the options hash on the prototype that we're
+       // inheriting from
+//     $.each( basePrototype, function( key, val ) {
+//             if ( $.isPlainObject(val) ) {
+//                     basePrototype[ key ] = $.extend( {}, val );
+//             }
+//     });
+       basePrototype.options = $.extend( true, {}, basePrototype.options );
+       $[ namespace ][ name ].prototype = $.extend( true, basePrototype, {
+               namespace: namespace,
+               widgetName: name,
+               widgetEventPrefix: $[ namespace ][ name ].prototype.widgetEventPrefix || name,
+               widgetBaseClass: fullName
+       }, prototype );
+
+       $.widget.bridge( name, $[ namespace ][ name ] );
+};
+
+$.widget.bridge = function( name, object ) {
+       $.fn[ name ] = function( options ) {
+               var isMethodCall = typeof options === "string",
+                       args = Array.prototype.slice.call( arguments, 1 ),
+                       returnValue = this;
+
+               // allow multiple hashes to be passed on init
+               options = !isMethodCall && args.length ?
+                       $.extend.apply( null, [ true, options ].concat(args) ) :
+                       options;
+
+               // prevent calls to internal methods
+               if ( isMethodCall && options.charAt( 0 ) === "_" ) {
+                       return returnValue;
+               }
+
+               if ( isMethodCall ) {
+                       this.each(function() {
+                               var instance = $.data( this, name ),
+                                       methodValue = instance && $.isFunction( instance[options] ) ?
+                                               instance[ options ].apply( instance, args ) :
+                                               instance;
+                               // TODO: add this back in 1.9 and use $.error() (see #5972)
+//                             if ( !instance ) {
+//                                     throw "cannot call methods on " + name + " prior to initialization; " +
+//                                             "attempted to call method '" + options + "'";
+//                             }
+//                             if ( !$.isFunction( instance[options] ) ) {
+//                                     throw "no such method '" + options + "' for " + name + " widget instance";
+//                             }
+//                             var methodValue = instance[ options ].apply( instance, args );
+                               if ( methodValue !== instance && methodValue !== undefined ) {
+                                       returnValue = methodValue;
+                                       return false;
+                               }
+                       });
+               } else {
+                       this.each(function() {
+                               var instance = $.data( this, name );
+                               if ( instance ) {
+                                       instance.option( options || {} )._init();
+                               } else {
+                                       $.data( this, name, new object( options, this ) );
+                               }
+                       });
+               }
+
+               return returnValue;
+       };
+};
+
+$.Widget = function( options, element ) {
+       // allow instantiation without initializing for simple inheritance
+       if ( arguments.length ) {
+               this._createWidget( options, element );
+       }
+};
+
+$.Widget.prototype = {
+       widgetName: "widget",
+       widgetEventPrefix: "",
+       options: {
+               disabled: false
+       },
+       _createWidget: function( options, element ) {
+               // $.widget.bridge stores the plugin instance, but we do it anyway
+               // so that it's stored even before the _create function runs
+               $.data( element, this.widgetName, this );
+               this.element = $( element );
+               this.options = $.extend( true, {},
+                       this.options,
+                       this._getCreateOptions(),
+                       options );
+
+               var self = this;
+               this.element.bind( "remove." + this.widgetName, function() {
+                       self.destroy();
+               });
+
+               this._create();
+               this._trigger( "create" );
+               this._init();
+       },
+       _getCreateOptions: function() {
+               return $.metadata && $.metadata.get( this.element[0] )[ this.widgetName ];
+       },
+       _create: function() {},
+       _init: function() {},
+
+       destroy: function() {
+               this.element
+                       .unbind( "." + this.widgetName )
+                       .removeData( this.widgetName );
+               this.widget()
+                       .unbind( "." + this.widgetName )
+                       .removeAttr( "aria-disabled" )
+                       .removeClass(
+                               this.widgetBaseClass + "-disabled " +
+                               "ui-state-disabled" );
+       },
+
+       widget: function() {
+               return this.element;
+       },
+
+       option: function( key, value ) {
+               var options = key;
+
+               if ( arguments.length === 0 ) {
+                       // don't return a reference to the internal hash
+                       return $.extend( {}, this.options );
+               }
+
+               if  (typeof key === "string" ) {
+                       if ( value === undefined ) {
+                               return this.options[ key ];
+                       }
+                       options = {};
+                       options[ key ] = value;
+               }
+
+               this._setOptions( options );
+
+               return this;
+       },
+       _setOptions: function( options ) {
+               var self = this;
+               $.each( options, function( key, value ) {
+                       self._setOption( key, value );
+               });
+
+               return this;
+       },
+       _setOption: function( key, value ) {
+               this.options[ key ] = value;
+
+               if ( key === "disabled" ) {
+                       this.widget()
+                               [ value ? "addClass" : "removeClass"](
+                                       this.widgetBaseClass + "-disabled" + " " +
+                                       "ui-state-disabled" )
+                               .attr( "aria-disabled", value );
+               }
+
+               return this;
+       },
+
+       enable: function() {
+               return this._setOption( "disabled", false );
+       },
+       disable: function() {
+               return this._setOption( "disabled", true );
+       },
+
+       _trigger: function( type, event, data ) {
+               var prop, orig,
+                       callback = this.options[ type ];
+
+               data = data || {};
+               event = $.Event( event );
+               event.type = ( type === this.widgetEventPrefix ?
+                       type :
+                       this.widgetEventPrefix + type ).toLowerCase();
+               // the original event may come from any element
+               // so we need to reset the target on the new event
+               event.target = this.element[ 0 ];
+
+               // copy original event properties over to the new event
+               orig = event.originalEvent;
+               if ( orig ) {
+                       for ( prop in orig ) {
+                               if ( !( prop in event ) ) {
+                                       event[ prop ] = orig[ prop ];
+                               }
+                       }
+               }
+
+               this.element.trigger( event, data );
+
+               return !( $.isFunction(callback) &&
+                       callback.call( this.element[0], event, data ) === false ||
+                       event.isDefaultPrevented() );
+       }
+};
+
+})( jQuery );
diff --git a/resources/lib/jquery.ui/themes/default/images/ui-bg_flat_0_aaaaaa_40x100.png b/resources/lib/jquery.ui/themes/default/images/ui-bg_flat_0_aaaaaa_40x100.png
new file mode 100644 (file)
index 0000000..e425e6e
Binary files /dev/null and b/resources/lib/jquery.ui/themes/default/images/ui-bg_flat_0_aaaaaa_40x100.png differ
diff --git a/resources/lib/jquery.ui/themes/default/images/ui-bg_flat_75_ffffff_40x100.png b/resources/lib/jquery.ui/themes/default/images/ui-bg_flat_75_ffffff_40x100.png
new file mode 100644 (file)
index 0000000..72d4757
Binary files /dev/null and b/resources/lib/jquery.ui/themes/default/images/ui-bg_flat_75_ffffff_40x100.png differ
diff --git a/resources/lib/jquery.ui/themes/default/images/ui-bg_glass_55_fbf9ee_1x400.png b/resources/lib/jquery.ui/themes/default/images/ui-bg_glass_55_fbf9ee_1x400.png
new file mode 100644 (file)
index 0000000..3b2914a
Binary files /dev/null and b/resources/lib/jquery.ui/themes/default/images/ui-bg_glass_55_fbf9ee_1x400.png differ
diff --git a/resources/lib/jquery.ui/themes/default/images/ui-bg_glass_65_ffffff_1x400.png b/resources/lib/jquery.ui/themes/default/images/ui-bg_glass_65_ffffff_1x400.png
new file mode 100644 (file)
index 0000000..8569c1b
Binary files /dev/null and b/resources/lib/jquery.ui/themes/default/images/ui-bg_glass_65_ffffff_1x400.png differ
diff --git a/resources/lib/jquery.ui/themes/default/images/ui-bg_glass_75_dadada_1x400.png b/resources/lib/jquery.ui/themes/default/images/ui-bg_glass_75_dadada_1x400.png
new file mode 100644 (file)
index 0000000..d6cc3c5
Binary files /dev/null and b/resources/lib/jquery.ui/themes/default/images/ui-bg_glass_75_dadada_1x400.png differ
diff --git a/resources/lib/jquery.ui/themes/default/images/ui-bg_glass_75_e6e6e6_1x400.png b/resources/lib/jquery.ui/themes/default/images/ui-bg_glass_75_e6e6e6_1x400.png
new file mode 100644 (file)
index 0000000..86c2baa
Binary files /dev/null and b/resources/lib/jquery.ui/themes/default/images/ui-bg_glass_75_e6e6e6_1x400.png differ
diff --git a/resources/lib/jquery.ui/themes/default/images/ui-bg_glass_95_fef1ec_1x400.png b/resources/lib/jquery.ui/themes/default/images/ui-bg_glass_95_fef1ec_1x400.png
new file mode 100644 (file)
index 0000000..4443fdc
Binary files /dev/null and b/resources/lib/jquery.ui/themes/default/images/ui-bg_glass_95_fef1ec_1x400.png differ
diff --git a/resources/lib/jquery.ui/themes/default/images/ui-bg_highlight-soft_75_cccccc_1x100.png b/resources/lib/jquery.ui/themes/default/images/ui-bg_highlight-soft_75_cccccc_1x100.png
new file mode 100644 (file)
index 0000000..3cd467e
Binary files /dev/null and b/resources/lib/jquery.ui/themes/default/images/ui-bg_highlight-soft_75_cccccc_1x100.png differ
diff --git a/resources/lib/jquery.ui/themes/default/images/ui-icons_222222_256x240.png b/resources/lib/jquery.ui/themes/default/images/ui-icons_222222_256x240.png
new file mode 100644 (file)
index 0000000..9a9606f
Binary files /dev/null and b/resources/lib/jquery.ui/themes/default/images/ui-icons_222222_256x240.png differ
diff --git a/resources/lib/jquery.ui/themes/default/images/ui-icons_2e83ff_256x240.png b/resources/lib/jquery.ui/themes/default/images/ui-icons_2e83ff_256x240.png
new file mode 100644 (file)
index 0000000..08d2617
Binary files /dev/null and b/resources/lib/jquery.ui/themes/default/images/ui-icons_2e83ff_256x240.png differ
diff --git a/resources/lib/jquery.ui/themes/default/images/ui-icons_454545_256x240.png b/resources/lib/jquery.ui/themes/default/images/ui-icons_454545_256x240.png
new file mode 100644 (file)
index 0000000..80cb644
Binary files /dev/null and b/resources/lib/jquery.ui/themes/default/images/ui-icons_454545_256x240.png differ
diff --git a/resources/lib/jquery.ui/themes/default/images/ui-icons_888888_256x240.png b/resources/lib/jquery.ui/themes/default/images/ui-icons_888888_256x240.png
new file mode 100644 (file)
index 0000000..8373712
Binary files /dev/null and b/resources/lib/jquery.ui/themes/default/images/ui-icons_888888_256x240.png differ
diff --git a/resources/lib/jquery.ui/themes/default/images/ui-icons_cd0a0a_256x240.png b/resources/lib/jquery.ui/themes/default/images/ui-icons_cd0a0a_256x240.png
new file mode 100644 (file)
index 0000000..34fc893
Binary files /dev/null and b/resources/lib/jquery.ui/themes/default/images/ui-icons_cd0a0a_256x240.png differ
diff --git a/resources/lib/jquery.ui/themes/default/jquery.ui.accordion.css b/resources/lib/jquery.ui/themes/default/jquery.ui.accordion.css
new file mode 100644 (file)
index 0000000..cd8f971
--- /dev/null
@@ -0,0 +1,19 @@
+/*!
+ * jQuery UI Accordion 1.8.24
+ *
+ * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Accordion#theming
+ */
+/* IE/Win - Fix animation bug - #4615 */
+.ui-accordion { width: 100%; }
+.ui-accordion .ui-accordion-header { cursor: pointer; position: relative; margin-top: 1px; zoom: 1; }
+.ui-accordion .ui-accordion-li-fix { display: inline; }
+.ui-accordion .ui-accordion-header-active { border-bottom: 0 !important; }
+.ui-accordion .ui-accordion-header a { display: block; font-size: 1em; padding: .5em .5em .5em .7em; }
+.ui-accordion-icons .ui-accordion-header a { padding-left: 2.2em; }
+.ui-accordion .ui-accordion-header .ui-icon { position: absolute; left: .5em; top: 50%; margin-top: -8px; }
+.ui-accordion .ui-accordion-content { padding: 1em 2.2em; border-top: 0; margin-top: -2px; position: relative; top: 1px; margin-bottom: 2px; overflow: auto; display: none; zoom: 1; }
+.ui-accordion .ui-accordion-content-active { display: block; }
diff --git a/resources/lib/jquery.ui/themes/default/jquery.ui.autocomplete.css b/resources/lib/jquery.ui/themes/default/jquery.ui.autocomplete.css
new file mode 100644 (file)
index 0000000..c7eaff2
--- /dev/null
@@ -0,0 +1,53 @@
+/*!
+ * jQuery UI Autocomplete 1.8.24
+ *
+ * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Autocomplete#theming
+ */
+.ui-autocomplete { position: absolute; cursor: default; }      
+
+/* workarounds */
+* html .ui-autocomplete { width:1px; } /* without this, the menu expands to 100% in IE6 */
+
+/*
+ * jQuery UI Menu 1.8.24
+ *
+ * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Menu#theming
+ */
+.ui-menu {
+       list-style:none;
+       padding: 2px;
+       margin: 0;
+       display:block;
+       float: left;
+}
+.ui-menu .ui-menu {
+       margin-top: -3px;
+}
+.ui-menu .ui-menu-item {
+       margin:0;
+       padding: 0;
+       zoom: 1;
+       float: left;
+       clear: left;
+       width: 100%;
+}
+.ui-menu .ui-menu-item a {
+       text-decoration:none;
+       display:block;
+       padding:.2em .4em;
+       line-height:1.5;
+       zoom:1;
+}
+.ui-menu .ui-menu-item a.ui-state-hover,
+.ui-menu .ui-menu-item a.ui-state-active {
+       font-weight: normal;
+       margin: -1px;
+}
diff --git a/resources/lib/jquery.ui/themes/default/jquery.ui.button.css b/resources/lib/jquery.ui/themes/default/jquery.ui.button.css
new file mode 100644 (file)
index 0000000..cd2dbb6
--- /dev/null
@@ -0,0 +1,110 @@
+/*!
+ * jQuery UI Button 1.8.24
+ *
+ * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Button#theming
+ */
+
+.ui-button {
+       display: inline-block;
+       position: relative;
+       padding: 0;
+       margin-right: .1em;
+       text-decoration: none !important;
+       cursor: pointer;
+       text-align: center;
+       zoom: 1;
+       overflow: visible; /* the overflow property removes extra width in IE */
+}
+/* to make room for the icon, a width needs to be set here */
+.ui-button-icon-only {
+       width: 2.2em;
+}
+
+/* button elements seem to need a little more width */
+button.ui-button-icon-only {
+       width: 2.4em;
+}
+.ui-button-icons-only {
+       width: 3.4em;
+}
+button.ui-button-icons-only {
+       width: 3.7em;
+}
+
+/*button text element */
+.ui-button .ui-button-text {
+       display: block;
+       line-height: 1.4;
+}
+.ui-button-text-only .ui-button-text {
+       padding: .4em 1em;
+}
+.ui-button-icon-only .ui-button-text,
+.ui-button-icons-only .ui-button-text {
+       padding: .4em;
+       text-indent: -9999999px;
+}
+.ui-button-text-icon-primary .ui-button-text,
+.ui-button-text-icons .ui-button-text {
+       padding: .4em 1em .4em 2.1em;
+}
+.ui-button-text-icon-secondary .ui-button-text,
+.ui-button-text-icons .ui-button-text {
+       padding: .4em 2.1em .4em 1em;
+}
+.ui-button-text-icons .ui-button-text {
+       padding-left: 2.1em;
+       padding-right: 2.1em;
+}
+/* no icon support for input elements, provide padding by default */
+       input.ui-button {
+       padding: .4em 1em;
+}
+
+/*button icon element(s) */
+.ui-button-icon-only .ui-icon,
+.ui-button-text-icon-primary .ui-icon,
+.ui-button-text-icon-secondary .ui-icon,
+.ui-button-text-icons .ui-icon,
+.ui-button-icons-only .ui-icon {
+       position: absolute;
+       top: 50%;
+       margin-top: -8px;
+}
+.ui-button-icon-only .ui-icon {
+       left: 50%;
+       margin-left: -8px;
+}
+.ui-button-text-icon-primary .ui-button-icon-primary,
+.ui-button-text-icons .ui-button-icon-primary,
+.ui-button-icons-only .ui-button-icon-primary {
+       left: .5em;
+}
+.ui-button-text-icon-secondary .ui-button-icon-secondary,
+.ui-button-text-icons .ui-button-icon-secondary,
+.ui-button-icons-only .ui-button-icon-secondary {
+       right: .5em;
+}
+.ui-button-text-icons .ui-button-icon-secondary,
+.ui-button-icons-only .ui-button-icon-secondary {
+       right: .5em;
+}
+
+/*button sets*/
+.ui-buttonset {
+       margin-right: 7px;
+}
+.ui-buttonset .ui-button {
+       margin-left: 0;
+       margin-right: -.3em;
+}
+
+/* workarounds */
+button.ui-button::-moz-focus-inner {
+       border: 0;
+       padding: 0; /* reset extra padding in Firefox */
+}
diff --git a/resources/lib/jquery.ui/themes/default/jquery.ui.core.css b/resources/lib/jquery.ui/themes/default/jquery.ui.core.css
new file mode 100644 (file)
index 0000000..8b953a2
--- /dev/null
@@ -0,0 +1,38 @@
+/*!
+ * jQuery UI CSS Framework 1.8.24
+ *
+ * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Theming/API
+ */
+
+/* Layout helpers
+----------------------------------*/
+.ui-helper-hidden { display: none; }
+.ui-helper-hidden-accessible { position: absolute !important; clip: rect(1px 1px 1px 1px); clip: rect(1px,1px,1px,1px); }
+.ui-helper-reset { margin: 0; padding: 0; border: 0; outline: 0; line-height: 1.3; text-decoration: none; font-size: 100%; list-style: none; }
+.ui-helper-clearfix:before, .ui-helper-clearfix:after { content: ""; display: table; }
+.ui-helper-clearfix:after { clear: both; }
+.ui-helper-clearfix { zoom: 1; }
+.ui-helper-zfix { width: 100%; height: 100%; top: 0; left: 0; position: absolute; opacity: 0; filter:Alpha(Opacity=0); }
+
+
+/* Interaction Cues
+----------------------------------*/
+.ui-state-disabled { cursor: default !important; }
+
+
+/* Icons
+----------------------------------*/
+
+/* states and images */
+.ui-icon { display: block; text-indent: -99999px; overflow: hidden; background-repeat: no-repeat; }
+
+
+/* Misc visuals
+----------------------------------*/
+
+/* Overlays */
+.ui-widget-overlay { position: absolute; top: 0; left: 0; width: 100%; height: 100%; }
diff --git a/resources/lib/jquery.ui/themes/default/jquery.ui.datepicker.css b/resources/lib/jquery.ui/themes/default/jquery.ui.datepicker.css
new file mode 100644 (file)
index 0000000..37d3a98
--- /dev/null
@@ -0,0 +1,66 @@
+/*!
+ * jQuery UI Datepicker 1.8.24
+ *
+ * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Datepicker#theming
+ */
+.ui-datepicker { width: 17em; padding: .2em .2em 0; display: none; }
+.ui-datepicker .ui-datepicker-header { position:relative; padding:.2em 0; }
+.ui-datepicker .ui-datepicker-prev, .ui-datepicker .ui-datepicker-next { position:absolute; top: 2px; width: 1.8em; height: 1.8em; }
+.ui-datepicker .ui-datepicker-prev-hover, .ui-datepicker .ui-datepicker-next-hover { top: 1px; }
+.ui-datepicker .ui-datepicker-prev { left:2px; }
+.ui-datepicker .ui-datepicker-next { right:2px; }
+.ui-datepicker .ui-datepicker-prev-hover { left:1px; }
+.ui-datepicker .ui-datepicker-next-hover { right:1px; }
+.ui-datepicker .ui-datepicker-prev span, .ui-datepicker .ui-datepicker-next span { display: block; position: absolute; left: 50%; margin-left: -8px; top: 50%; margin-top: -8px;  }
+.ui-datepicker .ui-datepicker-title { margin: 0 2.3em; line-height: 1.8em; text-align: center; }
+.ui-datepicker .ui-datepicker-title select { font-size:1em; margin:1px 0; }
+.ui-datepicker select.ui-datepicker-month-year {width: 100%;}
+.ui-datepicker select.ui-datepicker-month, 
+.ui-datepicker select.ui-datepicker-year { width: 49%;}
+.ui-datepicker table {width: 100%; font-size: .9em; border-collapse: collapse; margin:0 0 .4em; }
+.ui-datepicker th { padding: .7em .3em; text-align: center; font-weight: bold; border: 0;  }
+.ui-datepicker td { border: 0; padding: 1px; }
+.ui-datepicker td span, .ui-datepicker td a { display: block; padding: .2em; text-align: right; text-decoration: none; }
+.ui-datepicker .ui-datepicker-buttonpane { background-image: none; margin: .7em 0 0 0; padding:0 .2em; border-left: 0; border-right: 0; border-bottom: 0; }
+.ui-datepicker .ui-datepicker-buttonpane button { float: right; margin: .5em .2em .4em; cursor: pointer; padding: .2em .6em .3em .6em; width:auto; overflow:visible; }
+.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current { float:left; }
+
+/* with multiple calendars */
+.ui-datepicker.ui-datepicker-multi { width:auto; }
+.ui-datepicker-multi .ui-datepicker-group { float:left; }
+.ui-datepicker-multi .ui-datepicker-group table { width:95%; margin:0 auto .4em; }
+.ui-datepicker-multi-2 .ui-datepicker-group { width:50%; }
+.ui-datepicker-multi-3 .ui-datepicker-group { width:33.3%; }
+.ui-datepicker-multi-4 .ui-datepicker-group { width:25%; }
+.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header { border-left-width:0; }
+.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header { border-left-width:0; }
+.ui-datepicker-multi .ui-datepicker-buttonpane { clear:left; }
+.ui-datepicker-row-break { clear:both; width:100%; font-size:0em; }
+
+/* RTL support */
+.ui-datepicker-rtl { direction: rtl; }
+.ui-datepicker-rtl .ui-datepicker-prev { right: 2px; left: auto; }
+.ui-datepicker-rtl .ui-datepicker-next { left: 2px; right: auto; }
+.ui-datepicker-rtl .ui-datepicker-prev:hover { right: 1px; left: auto; }
+.ui-datepicker-rtl .ui-datepicker-next:hover { left: 1px; right: auto; }
+.ui-datepicker-rtl .ui-datepicker-buttonpane { clear:right; }
+.ui-datepicker-rtl .ui-datepicker-buttonpane button { float: left; }
+.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current { float:right; }
+.ui-datepicker-rtl .ui-datepicker-group { float:right; }
+.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header { border-right-width:0; border-left-width:1px; }
+.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header { border-right-width:0; border-left-width:1px; }
+
+/* IE6 IFRAME FIX (taken from datepicker 1.5.3 */
+.ui-datepicker-cover {
+    position: absolute; /*must have*/
+    z-index: -1; /*must have*/
+    filter: mask(); /*must have*/
+    top: -4px; /*must have*/
+    left: -4px; /*must have*/
+    width: 200px; /*must have*/
+    height: 200px; /*must have*/
+}
\ No newline at end of file
diff --git a/resources/lib/jquery.ui/themes/default/jquery.ui.dialog.css b/resources/lib/jquery.ui/themes/default/jquery.ui.dialog.css
new file mode 100644 (file)
index 0000000..04515f4
--- /dev/null
@@ -0,0 +1,21 @@
+/*!
+ * jQuery UI Dialog 1.8.24
+ *
+ * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Dialog#theming
+ */
+.ui-dialog { position: absolute; padding: .2em; width: 300px; overflow: hidden; }
+.ui-dialog .ui-dialog-titlebar { padding: .4em 1em; position: relative;  }
+.ui-dialog .ui-dialog-title { float: left; margin: .1em 16px .1em 0; } 
+.ui-dialog .ui-dialog-titlebar-close { position: absolute; right: .3em; top: 50%; width: 19px; margin: -10px 0 0 0; padding: 1px; height: 18px; }
+.ui-dialog .ui-dialog-titlebar-close span { display: block; margin: 1px; }
+.ui-dialog .ui-dialog-titlebar-close:hover, .ui-dialog .ui-dialog-titlebar-close:focus { padding: 0; }
+.ui-dialog .ui-dialog-content { position: relative; border: 0; padding: .5em 1em; background: none; overflow: auto; zoom: 1; }
+.ui-dialog .ui-dialog-buttonpane { text-align: left; border-width: 1px 0 0 0; background-image: none; margin: .5em 0 0 0; padding: .3em 1em .5em .4em; }
+.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset { float: right; }
+.ui-dialog .ui-dialog-buttonpane button { margin: .5em .4em .5em 0; cursor: pointer; }
+.ui-dialog .ui-resizable-se { width: 14px; height: 14px; right: 3px; bottom: 3px; }
+.ui-draggable .ui-dialog-titlebar { cursor: move; }
diff --git a/resources/lib/jquery.ui/themes/default/jquery.ui.progressbar.css b/resources/lib/jquery.ui/themes/default/jquery.ui.progressbar.css
new file mode 100644 (file)
index 0000000..90bf308
--- /dev/null
@@ -0,0 +1,11 @@
+/*!
+ * jQuery UI Progressbar 1.8.24
+ *
+ * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Progressbar#theming
+ */
+.ui-progressbar { height:2em; text-align: left; overflow: hidden; }
+.ui-progressbar .ui-progressbar-value {margin: -1px; height:100%; }
\ No newline at end of file
diff --git a/resources/lib/jquery.ui/themes/default/jquery.ui.resizable.css b/resources/lib/jquery.ui/themes/default/jquery.ui.resizable.css
new file mode 100644 (file)
index 0000000..d17873e
--- /dev/null
@@ -0,0 +1,20 @@
+/*!
+ * jQuery UI Resizable 1.8.24
+ *
+ * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Resizable#theming
+ */
+.ui-resizable { position: relative;}
+.ui-resizable-handle { position: absolute;font-size: 0.1px; display: block; }
+.ui-resizable-disabled .ui-resizable-handle, .ui-resizable-autohide .ui-resizable-handle { display: none; }
+.ui-resizable-n { cursor: n-resize; height: 7px; width: 100%; top: -5px; left: 0; }
+.ui-resizable-s { cursor: s-resize; height: 7px; width: 100%; bottom: -5px; left: 0; }
+.ui-resizable-e { cursor: e-resize; width: 7px; right: -5px; top: 0; height: 100%; }
+.ui-resizable-w { cursor: w-resize; width: 7px; left: -5px; top: 0; height: 100%; }
+.ui-resizable-se { cursor: se-resize; width: 12px; height: 12px; right: 1px; bottom: 1px; }
+.ui-resizable-sw { cursor: sw-resize; width: 9px; height: 9px; left: -5px; bottom: -5px; }
+.ui-resizable-nw { cursor: nw-resize; width: 9px; height: 9px; left: -5px; top: -5px; }
+.ui-resizable-ne { cursor: ne-resize; width: 9px; height: 9px; right: -5px; top: -5px;}
\ No newline at end of file
diff --git a/resources/lib/jquery.ui/themes/default/jquery.ui.selectable.css b/resources/lib/jquery.ui/themes/default/jquery.ui.selectable.css
new file mode 100644 (file)
index 0000000..9850ee7
--- /dev/null
@@ -0,0 +1,10 @@
+/*!
+ * jQuery UI Selectable 1.8.24
+ *
+ * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Selectable#theming
+ */
+.ui-selectable-helper { position: absolute; z-index: 100; border:1px dotted black; }
diff --git a/resources/lib/jquery.ui/themes/default/jquery.ui.slider.css b/resources/lib/jquery.ui/themes/default/jquery.ui.slider.css
new file mode 100644 (file)
index 0000000..fbfe665
--- /dev/null
@@ -0,0 +1,24 @@
+/*!
+ * jQuery UI Slider 1.8.24
+ *
+ * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Slider#theming
+ */
+.ui-slider { position: relative; text-align: left; }
+.ui-slider .ui-slider-handle { position: absolute; z-index: 2; width: 1.2em; height: 1.2em; cursor: default; }
+.ui-slider .ui-slider-range { position: absolute; z-index: 1; font-size: .7em; display: block; border: 0; background-position: 0 0; }
+
+.ui-slider-horizontal { height: .8em; }
+.ui-slider-horizontal .ui-slider-handle { top: -.3em; margin-left: -.6em; }
+.ui-slider-horizontal .ui-slider-range { top: 0; height: 100%; }
+.ui-slider-horizontal .ui-slider-range-min { left: 0; }
+.ui-slider-horizontal .ui-slider-range-max { right: 0; }
+
+.ui-slider-vertical { width: .8em; height: 100px; }
+.ui-slider-vertical .ui-slider-handle { left: -.3em; margin-left: 0; margin-bottom: -.6em; }
+.ui-slider-vertical .ui-slider-range { left: 0; width: 100%; }
+.ui-slider-vertical .ui-slider-range-min { bottom: 0; }
+.ui-slider-vertical .ui-slider-range-max { top: 0; }
\ No newline at end of file
diff --git a/resources/lib/jquery.ui/themes/default/jquery.ui.tabs.css b/resources/lib/jquery.ui/themes/default/jquery.ui.tabs.css
new file mode 100644 (file)
index 0000000..f0bee7a
--- /dev/null
@@ -0,0 +1,18 @@
+/*!
+ * jQuery UI Tabs 1.8.24
+ *
+ * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Tabs#theming
+ */
+.ui-tabs { position: relative; padding: .2em; zoom: 1; } /* position: relative prevents IE scroll bug (element with position: relative inside container with overflow: auto appear as "fixed") */
+.ui-tabs .ui-tabs-nav { margin: 0; padding: .2em .2em 0; }
+.ui-tabs .ui-tabs-nav li { list-style: none; float: left; position: relative; top: 1px; margin: 0 .2em 1px 0; border-bottom: 0 !important; padding: 0; white-space: nowrap; }
+.ui-tabs .ui-tabs-nav li a { float: left; padding: .5em 1em; text-decoration: none; }
+.ui-tabs .ui-tabs-nav li.ui-tabs-selected { margin-bottom: 0; padding-bottom: 1px; }
+.ui-tabs .ui-tabs-nav li.ui-tabs-selected a, .ui-tabs .ui-tabs-nav li.ui-state-disabled a, .ui-tabs .ui-tabs-nav li.ui-state-processing a { cursor: text; }
+.ui-tabs .ui-tabs-nav li a, .ui-tabs.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-selected a { cursor: pointer; } /* first selector in group seems obsolete, but required to overcome bug in Opera applying cursor: text overall if defined elsewhere... */
+.ui-tabs .ui-tabs-panel { display: block; border-width: 0; padding: 1em 1.4em; background: none; }
+.ui-tabs .ui-tabs-hide { display: none !important; }
diff --git a/resources/lib/jquery.ui/themes/default/jquery.ui.theme.css b/resources/lib/jquery.ui/themes/default/jquery.ui.theme.css
new file mode 100644 (file)
index 0000000..b7d2f61
--- /dev/null
@@ -0,0 +1,247 @@
+/*!
+ * jQuery UI CSS Framework 1.8.24
+ *
+ * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Theming/API
+ *
+ * To view and modify this theme, visit http://jqueryui.com/themeroller/
+ */
+
+
+/* Component containers
+----------------------------------*/
+.ui-widget { font-family: Verdana,Arial,sans-serif/*{ffDefault}*/; font-size: 1.1em/*{fsDefault}*/; }
+.ui-widget .ui-widget { font-size: 1em; }
+.ui-widget input, .ui-widget select, .ui-widget textarea, .ui-widget button { font-family: Verdana,Arial,sans-serif/*{ffDefault}*/; font-size: 1em; }
+.ui-widget-content { border: 1px solid #aaaaaa/*{borderColorContent}*/; background: #ffffff/*{bgColorContent}*/ url(images/ui-bg_flat_75_ffffff_40x100.png)/*{bgImgUrlContent}*/ 50%/*{bgContentXPos}*/ 50%/*{bgContentYPos}*/ repeat-x/*{bgContentRepeat}*/; color: #222222/*{fcContent}*/; }
+.ui-widget-content a { color: #222222/*{fcContent}*/; }
+.ui-widget-header { border: 1px solid #aaaaaa/*{borderColorHeader}*/; background: #cccccc/*{bgColorHeader}*/ url(images/ui-bg_highlight-soft_75_cccccc_1x100.png)/*{bgImgUrlHeader}*/ 50%/*{bgHeaderXPos}*/ 50%/*{bgHeaderYPos}*/ repeat-x/*{bgHeaderRepeat}*/; color: #222222/*{fcHeader}*/; font-weight: bold; }
+.ui-widget-header a { color: #222222/*{fcHeader}*/; }
+
+/* Interaction states
+----------------------------------*/
+.ui-state-default, .ui-widget-content .ui-state-default, .ui-widget-header .ui-state-default { border: 1px solid #d3d3d3/*{borderColorDefault}*/; background: #e6e6e6/*{bgColorDefault}*/ url(images/ui-bg_glass_75_e6e6e6_1x400.png)/*{bgImgUrlDefault}*/ 50%/*{bgDefaultXPos}*/ 50%/*{bgDefaultYPos}*/ repeat-x/*{bgDefaultRepeat}*/; font-weight: normal/*{fwDefault}*/; color: #555555/*{fcDefault}*/; }
+.ui-state-default a, .ui-state-default a:link, .ui-state-default a:visited { color: #555555/*{fcDefault}*/; text-decoration: none; }
+.ui-state-hover, .ui-widget-content .ui-state-hover, .ui-widget-header .ui-state-hover, .ui-state-focus, .ui-widget-content .ui-state-focus, .ui-widget-header .ui-state-focus { border: 1px solid #999999/*{borderColorHover}*/; background: #dadada/*{bgColorHover}*/ url(images/ui-bg_glass_75_dadada_1x400.png)/*{bgImgUrlHover}*/ 50%/*{bgHoverXPos}*/ 50%/*{bgHoverYPos}*/ repeat-x/*{bgHoverRepeat}*/; font-weight: normal/*{fwDefault}*/; color: #212121/*{fcHover}*/; }
+.ui-state-hover a, .ui-state-hover a:hover { color: #212121/*{fcHover}*/; text-decoration: none; }
+.ui-state-active, .ui-widget-content .ui-state-active, .ui-widget-header .ui-state-active { border: 1px solid #aaaaaa/*{borderColorActive}*/; background: #ffffff/*{bgColorActive}*/ url(images/ui-bg_glass_65_ffffff_1x400.png)/*{bgImgUrlActive}*/ 50%/*{bgActiveXPos}*/ 50%/*{bgActiveYPos}*/ repeat-x/*{bgActiveRepeat}*/; font-weight: normal/*{fwDefault}*/; color: #212121/*{fcActive}*/; }
+.ui-state-active a, .ui-state-active a:link, .ui-state-active a:visited { color: #212121/*{fcActive}*/; text-decoration: none; }
+.ui-widget :active { outline: none; }
+
+/* Interaction Cues
+----------------------------------*/
+.ui-state-highlight, .ui-widget-content .ui-state-highlight, .ui-widget-header .ui-state-highlight  {border: 1px solid #fcefa1/*{borderColorHighlight}*/; background: #fbf9ee/*{bgColorHighlight}*/ url(images/ui-bg_glass_55_fbf9ee_1x400.png)/*{bgImgUrlHighlight}*/ 50%/*{bgHighlightXPos}*/ 50%/*{bgHighlightYPos}*/ repeat-x/*{bgHighlightRepeat}*/; color: #363636/*{fcHighlight}*/; }
+.ui-state-highlight a, .ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a { color: #363636/*{fcHighlight}*/; }
+.ui-state-error, .ui-widget-content .ui-state-error, .ui-widget-header .ui-state-error {border: 1px solid #cd0a0a/*{borderColorError}*/; background: #fef1ec/*{bgColorError}*/ url(images/ui-bg_glass_95_fef1ec_1x400.png)/*{bgImgUrlError}*/ 50%/*{bgErrorXPos}*/ 50%/*{bgErrorYPos}*/ repeat-x/*{bgErrorRepeat}*/; color: #cd0a0a/*{fcError}*/; }
+.ui-state-error a, .ui-widget-content .ui-state-error a, .ui-widget-header .ui-state-error a { color: #cd0a0a/*{fcError}*/; }
+.ui-state-error-text, .ui-widget-content .ui-state-error-text, .ui-widget-header .ui-state-error-text { color: #cd0a0a/*{fcError}*/; }
+.ui-priority-primary, .ui-widget-content .ui-priority-primary, .ui-widget-header .ui-priority-primary { font-weight: bold; }
+.ui-priority-secondary, .ui-widget-content .ui-priority-secondary,  .ui-widget-header .ui-priority-secondary { opacity: .7; filter:Alpha(Opacity=70); font-weight: normal; }
+.ui-state-disabled, .ui-widget-content .ui-state-disabled, .ui-widget-header .ui-state-disabled { opacity: .35; filter:Alpha(Opacity=35); background-image: none; }
+
+/* Icons
+----------------------------------*/
+
+/* states and images */
+.ui-icon { width: 16px; height: 16px; background-image: url(images/ui-icons_222222_256x240.png)/*{iconsContent}*/; }
+.ui-widget-content .ui-icon {background-image: url(images/ui-icons_222222_256x240.png)/*{iconsContent}*/; }
+.ui-widget-header .ui-icon {background-image: url(images/ui-icons_222222_256x240.png)/*{iconsHeader}*/; }
+.ui-state-default .ui-icon { background-image: url(images/ui-icons_888888_256x240.png)/*{iconsDefault}*/; }
+.ui-state-hover .ui-icon, .ui-state-focus .ui-icon {background-image: url(images/ui-icons_454545_256x240.png)/*{iconsHover}*/; }
+.ui-state-active .ui-icon {background-image: url(images/ui-icons_454545_256x240.png)/*{iconsActive}*/; }
+.ui-state-highlight .ui-icon {background-image: url(images/ui-icons_2e83ff_256x240.png)/*{iconsHighlight}*/; }
+.ui-state-error .ui-icon, .ui-state-error-text .ui-icon {background-image: url(images/ui-icons_cd0a0a_256x240.png)/*{iconsError}*/; }
+
+/* positioning */
+.ui-icon-carat-1-n { background-position: 0 0; }
+.ui-icon-carat-1-ne { background-position: -16px 0; }
+.ui-icon-carat-1-e { background-position: -32px 0; }
+.ui-icon-carat-1-se { background-position: -48px 0; }
+.ui-icon-carat-1-s { background-position: -64px 0; }
+.ui-icon-carat-1-sw { background-position: -80px 0; }
+.ui-icon-carat-1-w { background-position: -96px 0; }
+.ui-icon-carat-1-nw { background-position: -112px 0; }
+.ui-icon-carat-2-n-s { background-position: -128px 0; }
+.ui-icon-carat-2-e-w { background-position: -144px 0; }
+.ui-icon-triangle-1-n { background-position: 0 -16px; }
+.ui-icon-triangle-1-ne { background-position: -16px -16px; }
+.ui-icon-triangle-1-e { background-position: -32px -16px; }
+.ui-icon-triangle-1-se { background-position: -48px -16px; }
+.ui-icon-triangle-1-s { background-position: -64px -16px; }
+.ui-icon-triangle-1-sw { background-position: -80px -16px; }
+.ui-icon-triangle-1-w { background-position: -96px -16px; }
+.ui-icon-triangle-1-nw { background-position: -112px -16px; }
+.ui-icon-triangle-2-n-s { background-position: -128px -16px; }
+.ui-icon-triangle-2-e-w { background-position: -144px -16px; }
+.ui-icon-arrow-1-n { background-position: 0 -32px; }
+.ui-icon-arrow-1-ne { background-position: -16px -32px; }
+.ui-icon-arrow-1-e { background-position: -32px -32px; }
+.ui-icon-arrow-1-se { background-position: -48px -32px; }
+.ui-icon-arrow-1-s { background-position: -64px -32px; }
+.ui-icon-arrow-1-sw { background-position: -80px -32px; }
+.ui-icon-arrow-1-w { background-position: -96px -32px; }
+.ui-icon-arrow-1-nw { background-position: -112px -32px; }
+.ui-icon-arrow-2-n-s { background-position: -128px -32px; }
+.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; }
+.ui-icon-arrow-2-e-w { background-position: -160px -32px; }
+.ui-icon-arrow-2-se-nw { background-position: -176px -32px; }
+.ui-icon-arrowstop-1-n { background-position: -192px -32px; }
+.ui-icon-arrowstop-1-e { background-position: -208px -32px; }
+.ui-icon-arrowstop-1-s { background-position: -224px -32px; }
+.ui-icon-arrowstop-1-w { background-position: -240px -32px; }
+.ui-icon-arrowthick-1-n { background-position: 0 -48px; }
+.ui-icon-arrowthick-1-ne { background-position: -16px -48px; }
+.ui-icon-arrowthick-1-e { background-position: -32px -48px; }
+.ui-icon-arrowthick-1-se { background-position: -48px -48px; }
+.ui-icon-arrowthick-1-s { background-position: -64px -48px; }
+.ui-icon-arrowthick-1-sw { background-position: -80px -48px; }
+.ui-icon-arrowthick-1-w { background-position: -96px -48px; }
+.ui-icon-arrowthick-1-nw { background-position: -112px -48px; }
+.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; }
+.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; }
+.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; }
+.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; }
+.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; }
+.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; }
+.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; }
+.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; }
+.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; }
+.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; }
+.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; }
+.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; }
+.ui-icon-arrowreturn-1-w { background-position: -64px -64px; }
+.ui-icon-arrowreturn-1-n { background-position: -80px -64px; }
+.ui-icon-arrowreturn-1-e { background-position: -96px -64px; }
+.ui-icon-arrowreturn-1-s { background-position: -112px -64px; }
+.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; }
+.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; }
+.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; }
+.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; }
+.ui-icon-arrow-4 { background-position: 0 -80px; }
+.ui-icon-arrow-4-diag { background-position: -16px -80px; }
+.ui-icon-extlink { background-position: -32px -80px; }
+.ui-icon-newwin { background-position: -48px -80px; }
+.ui-icon-refresh { background-position: -64px -80px; }
+.ui-icon-shuffle { background-position: -80px -80px; }
+.ui-icon-transfer-e-w { background-position: -96px -80px; }
+.ui-icon-transferthick-e-w { background-position: -112px -80px; }
+.ui-icon-folder-collapsed { background-position: 0 -96px; }
+.ui-icon-folder-open { background-position: -16px -96px; }
+.ui-icon-document { background-position: -32px -96px; }
+.ui-icon-document-b { background-position: -48px -96px; }
+.ui-icon-note { background-position: -64px -96px; }
+.ui-icon-mail-closed { background-position: -80px -96px; }
+.ui-icon-mail-open { background-position: -96px -96px; }
+.ui-icon-suitcase { background-position: -112px -96px; }
+.ui-icon-comment { background-position: -128px -96px; }
+.ui-icon-person { background-position: -144px -96px; }
+.ui-icon-print { background-position: -160px -96px; }
+.ui-icon-trash { background-position: -176px -96px; }
+.ui-icon-locked { background-position: -192px -96px; }
+.ui-icon-unlocked { background-position: -208px -96px; }
+.ui-icon-bookmark { background-position: -224px -96px; }
+.ui-icon-tag { background-position: -240px -96px; }
+.ui-icon-home { background-position: 0 -112px; }
+.ui-icon-flag { background-position: -16px -112px; }
+.ui-icon-calendar { background-position: -32px -112px; }
+.ui-icon-cart { background-position: -48px -112px; }
+.ui-icon-pencil { background-position: -64px -112px; }
+.ui-icon-clock { background-position: -80px -112px; }
+.ui-icon-disk { background-position: -96px -112px; }
+.ui-icon-calculator { background-position: -112px -112px; }
+.ui-icon-zoomin { background-position: -128px -112px; }
+.ui-icon-zoomout { background-position: -144px -112px; }
+.ui-icon-search { background-position: -160px -112px; }
+.ui-icon-wrench { background-position: -176px -112px; }
+.ui-icon-gear { background-position: -192px -112px; }
+.ui-icon-heart { background-position: -208px -112px; }
+.ui-icon-star { background-position: -224px -112px; }
+.ui-icon-link { background-position: -240px -112px; }
+.ui-icon-cancel { background-position: 0 -128px; }
+.ui-icon-plus { background-position: -16px -128px; }
+.ui-icon-plusthick { background-position: -32px -128px; }
+.ui-icon-minus { background-position: -48px -128px; }
+.ui-icon-minusthick { background-position: -64px -128px; }
+.ui-icon-close { background-position: -80px -128px; }
+.ui-icon-closethick { background-position: -96px -128px; }
+.ui-icon-key { background-position: -112px -128px; }
+.ui-icon-lightbulb { background-position: -128px -128px; }
+.ui-icon-scissors { background-position: -144px -128px; }
+.ui-icon-clipboard { background-position: -160px -128px; }
+.ui-icon-copy { background-position: -176px -128px; }
+.ui-icon-contact { background-position: -192px -128px; }
+.ui-icon-image { background-position: -208px -128px; }
+.ui-icon-video { background-position: -224px -128px; }
+.ui-icon-script { background-position: -240px -128px; }
+.ui-icon-alert { background-position: 0 -144px; }
+.ui-icon-info { background-position: -16px -144px; }
+.ui-icon-notice { background-position: -32px -144px; }
+.ui-icon-help { background-position: -48px -144px; }
+.ui-icon-check { background-position: -64px -144px; }
+.ui-icon-bullet { background-position: -80px -144px; }
+.ui-icon-radio-off { background-position: -96px -144px; }
+.ui-icon-radio-on { background-position: -112px -144px; }
+.ui-icon-pin-w { background-position: -128px -144px; }
+.ui-icon-pin-s { background-position: -144px -144px; }
+.ui-icon-play { background-position: 0 -160px; }
+.ui-icon-pause { background-position: -16px -160px; }
+.ui-icon-seek-next { background-position: -32px -160px; }
+.ui-icon-seek-prev { background-position: -48px -160px; }
+.ui-icon-seek-end { background-position: -64px -160px; }
+.ui-icon-seek-start { background-position: -80px -160px; }
+/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */
+.ui-icon-seek-first { background-position: -80px -160px; }
+.ui-icon-stop { background-position: -96px -160px; }
+.ui-icon-eject { background-position: -112px -160px; }
+.ui-icon-volume-off { background-position: -128px -160px; }
+.ui-icon-volume-on { background-position: -144px -160px; }
+.ui-icon-power { background-position: 0 -176px; }
+.ui-icon-signal-diag { background-position: -16px -176px; }
+.ui-icon-signal { background-position: -32px -176px; }
+.ui-icon-battery-0 { background-position: -48px -176px; }
+.ui-icon-battery-1 { background-position: -64px -176px; }
+.ui-icon-battery-2 { background-position: -80px -176px; }
+.ui-icon-battery-3 { background-position: -96px -176px; }
+.ui-icon-circle-plus { background-position: 0 -192px; }
+.ui-icon-circle-minus { background-position: -16px -192px; }
+.ui-icon-circle-close { background-position: -32px -192px; }
+.ui-icon-circle-triangle-e { background-position: -48px -192px; }
+.ui-icon-circle-triangle-s { background-position: -64px -192px; }
+.ui-icon-circle-triangle-w { background-position: -80px -192px; }
+.ui-icon-circle-triangle-n { background-position: -96px -192px; }
+.ui-icon-circle-arrow-e { background-position: -112px -192px; }
+.ui-icon-circle-arrow-s { background-position: -128px -192px; }
+.ui-icon-circle-arrow-w { background-position: -144px -192px; }
+.ui-icon-circle-arrow-n { background-position: -160px -192px; }
+.ui-icon-circle-zoomin { background-position: -176px -192px; }
+.ui-icon-circle-zoomout { background-position: -192px -192px; }
+.ui-icon-circle-check { background-position: -208px -192px; }
+.ui-icon-circlesmall-plus { background-position: 0 -208px; }
+.ui-icon-circlesmall-minus { background-position: -16px -208px; }
+.ui-icon-circlesmall-close { background-position: -32px -208px; }
+.ui-icon-squaresmall-plus { background-position: -48px -208px; }
+.ui-icon-squaresmall-minus { background-position: -64px -208px; }
+.ui-icon-squaresmall-close { background-position: -80px -208px; }
+.ui-icon-grip-dotted-vertical { background-position: 0 -224px; }
+.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; }
+.ui-icon-grip-solid-vertical { background-position: -32px -224px; }
+.ui-icon-grip-solid-horizontal { background-position: -48px -224px; }
+.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; }
+.ui-icon-grip-diagonal-se { background-position: -80px -224px; }
+
+
+/* Misc visuals
+----------------------------------*/
+
+/* Corner radius */
+.ui-corner-all, .ui-corner-top, .ui-corner-left, .ui-corner-tl { -moz-border-radius-topleft: 4px/*{cornerRadius}*/; -webkit-border-top-left-radius: 4px/*{cornerRadius}*/; -khtml-border-top-left-radius: 4px/*{cornerRadius}*/; border-top-left-radius: 4px/*{cornerRadius}*/; }
+.ui-corner-all, .ui-corner-top, .ui-corner-right, .ui-corner-tr { -moz-border-radius-topright: 4px/*{cornerRadius}*/; -webkit-border-top-right-radius: 4px/*{cornerRadius}*/; -khtml-border-top-right-radius: 4px/*{cornerRadius}*/; border-top-right-radius: 4px/*{cornerRadius}*/; }
+.ui-corner-all, .ui-corner-bottom, .ui-corner-left, .ui-corner-bl { -moz-border-radius-bottomleft: 4px/*{cornerRadius}*/; -webkit-border-bottom-left-radius: 4px/*{cornerRadius}*/; -khtml-border-bottom-left-radius: 4px/*{cornerRadius}*/; border-bottom-left-radius: 4px/*{cornerRadius}*/; }
+.ui-corner-all, .ui-corner-bottom, .ui-corner-right, .ui-corner-br { -moz-border-radius-bottomright: 4px/*{cornerRadius}*/; -webkit-border-bottom-right-radius: 4px/*{cornerRadius}*/; -khtml-border-bottom-right-radius: 4px/*{cornerRadius}*/; border-bottom-right-radius: 4px/*{cornerRadius}*/; }
+
+/* Overlays */
+.ui-widget-overlay { background: #aaaaaa/*{bgColorOverlay}*/ url(images/ui-bg_flat_0_aaaaaa_40x100.png)/*{bgImgUrlOverlay}*/ 50%/*{bgOverlayXPos}*/ 50%/*{bgOverlayYPos}*/ repeat-x/*{bgOverlayRepeat}*/; opacity: .3;filter:Alpha(Opacity=30)/*{opacityOverlay}*/; }
+.ui-widget-shadow { margin: -8px/*{offsetTopShadow}*/ 0 0 -8px/*{offsetLeftShadow}*/; padding: 8px/*{thicknessShadow}*/; background: #aaaaaa/*{bgColorShadow}*/ url(images/ui-bg_flat_0_aaaaaa_40x100.png)/*{bgImgUrlShadow}*/ 50%/*{bgShadowXPos}*/ 50%/*{bgShadowYPos}*/ repeat-x/*{bgShadowRepeat}*/; opacity: .3;filter:Alpha(Opacity=30)/*{opacityShadow}*/; -moz-border-radius: 8px/*{cornerRadiusShadow}*/; -khtml-border-radius: 8px/*{cornerRadiusShadow}*/; -webkit-border-radius: 8px/*{cornerRadiusShadow}*/; border-radius: 8px/*{cornerRadiusShadow}*/; }
\ No newline at end of file
diff --git a/resources/lib/jquery/jquery.appear.js b/resources/lib/jquery/jquery.appear.js
new file mode 100644 (file)
index 0000000..4f77886
--- /dev/null
@@ -0,0 +1,138 @@
+/*
+ * jQuery.appear
+ * http://code.google.com/p/jquery-appear/
+ *
+ * Copyright (c) 2009 Michael Hixson
+ * Licensed under the MIT license (http://www.opensource.org/licenses/mit-license.php)
+*/
+(function($) {
+        
+       $.fn.appear = function(fn, options) {
+                
+               var settings = $.extend({
+                       //arbitrary data to pass to fn
+                       data: undefined,
+                       //call fn only on the first appear?
+                       one: true
+                        
+               }, options);
+                
+               return this.each(function() {
+                
+                       var t = $(this);
+                        
+                       //whether the element is currently visible
+                       t.appeared = false;
+                        
+                       if (!fn) {
+                               //trigger the custom event
+                               t.trigger('appear', settings.data);
+                               return;
+                       }
+                        
+                       var w = $(window);
+                        
+                       //fires the appear event when appropriate
+                       var check = function() {
+                               //is the element hidden?
+                               if (!t.is(':visible')) {
+                                        
+                                       //it became hidden
+                                       t.appeared = false;
+                                       return;
+                               }
+                               //is the element inside the visible window?
+                               var a = w.scrollLeft();
+                               var b = w.scrollTop();
+                               var o = t.offset();
+                               var x = o.left;
+                               var y = o.top;
+                                
+                               if (y + t.height() >= b && 
+                                               y <= b + w.height() &&
+                                               x + t.width() >= a && 
+                                               x <= a + w.width()) {
+                                       //trigger the custom event
+                                       if (!t.appeared) t.trigger('appear', settings.data);
+                                        
+                               } else {
+                                       //it scrolled out of view
+                                       t.appeared = false;
+                               }
+                       };
+                       //create a modified fn with some additional logic
+                       var modifiedFn = function() {
+                                
+                               //mark the element as visible
+                               t.appeared = true;
+                               //is this supposed to happen only once?
+                               if (settings.one) {
+                                       //remove the check
+                                       w.unbind('scroll', check);
+                                       var i = $.inArray(check, $.fn.appear.checks);
+                                       if (i >= 0) $.fn.appear.checks.splice(i, 1);
+                               }
+                               //trigger the original fn
+                               fn.apply(this, arguments);
+                       };
+                        
+                       //bind the modified fn to the element
+                       if (settings.one) t.one('appear', settings.data, modifiedFn);
+                       else t.bind('appear', settings.data, modifiedFn);
+                        
+                       //check whenever the window scrolls
+                       w.scroll(check);
+                        
+                       //check whenever the dom changes
+                       $.fn.appear.checks.push(check);
+                        
+                       //check now
+                       (check)();
+               });
+       };
+        
+       //keep a queue of appearance checks
+       $.extend($.fn.appear, {
+                
+               checks: [],
+               timeout: null,
+               //process the queue
+               checkAll: function() {
+                       var length = $.fn.appear.checks.length;
+                       if (length > 0) while (length--) ($.fn.appear.checks[length])();
+               },
+               //check the queue asynchronously
+               run: function() {
+                       if ($.fn.appear.timeout) clearTimeout($.fn.appear.timeout);
+                       $.fn.appear.timeout = setTimeout($.fn.appear.checkAll, 20);
+               }
+       });
+        
+       //run checks when these methods are called
+       $.each(['append', 'prepend', 'after', 'before', 'attr', 
+                                       'removeAttr', 'addClass', 'removeClass', 'toggleClass', 
+                                       'remove', 'css', 'show', 'hide'], function(i, n) {
+               var old = $.fn[n];
+               if (old) {
+                       $.fn[n] = function() {
+                               var r = old.apply(this, arguments);
+                               $.fn.appear.run();
+                               return r;
+                       }
+               }
+       });
+        
+})(jQuery);
\ No newline at end of file
diff --git a/resources/lib/jquery/jquery.async.js b/resources/lib/jquery/jquery.async.js
new file mode 100644 (file)
index 0000000..2161f6b
--- /dev/null
@@ -0,0 +1,69 @@
+/*
+ * jQuery Asynchronous Plugin 1.0
+ *
+ * Copyright (c) 2008 Vincent Robert (genezys.net)
+ * Dual licensed under the MIT (MIT-LICENSE.txt)
+ * and GPL (GPL-LICENSE.txt) licenses.
+ *
+ */
+(function($){
+
+// opts.delay : (default 10) delay between async call in ms
+// opts.bulk : (default 500) delay during which the loop can continue synchronously without yielding the CPU
+// opts.test : (default true) function to test in the while test part
+// opts.loop : (default empty) function to call in the while loop part
+// opts.end : (default empty) function to call at the end of the while loop
+$.whileAsync = function(opts) {
+       var delay = Math.abs(opts.delay) || 10,
+               bulk = isNaN(opts.bulk) ? 500 : Math.abs(opts.bulk),
+               test = opts.test || function(){ return true; },
+               loop = opts.loop || function(){},
+               end = opts.end || function(){};
+       
+       (function(){
+
+               var t = false,
+                       begin = new Date();
+                       
+               while( t = test() ) {
+                       loop();
+                       if( bulk === 0 || (new Date() - begin) > bulk ) {
+                               break;
+                       }
+               }
+               if( t ) {
+                       setTimeout(arguments.callee, delay);
+               }
+               else {
+                       end();
+               }
+               
+       })();
+};
+
+// opts.delay : (default 10) delay between async call in ms
+// opts.bulk : (default 500) delay during which the loop can continue synchronously without yielding the CPU
+// opts.loop : (default empty) function to call in the each loop part, signature: function(index, value) this = value
+// opts.end : (default empty) function to call at the end of the each loop
+$.eachAsync = function(array, opts) {
+       var     i = 0,
+               l = array.length,
+               loop = opts.loop || function(){};
+       
+       $.whileAsync(
+               $.extend(opts, {
+                       test: function() { return i < l; },
+                       loop: function() {
+                               var val = array[i];
+                               return loop.call(val, i++, val);
+                       }
+               })
+       );
+};
+
+$.fn.eachAsync = function(opts) {
+       $.eachAsync(this, opts);
+       return this;
+}
+
+})(jQuery);
\ No newline at end of file
diff --git a/resources/lib/jquery/jquery.ba-throttle-debounce.js b/resources/lib/jquery/jquery.ba-throttle-debounce.js
new file mode 100644 (file)
index 0000000..fa30bdf
--- /dev/null
@@ -0,0 +1,252 @@
+/*!
+ * jQuery throttle / debounce - v1.1 - 3/7/2010
+ * http://benalman.com/projects/jquery-throttle-debounce-plugin/
+ * 
+ * Copyright (c) 2010 "Cowboy" Ben Alman
+ * Dual licensed under the MIT and GPL licenses.
+ * http://benalman.com/about/license/
+ */
+
+// Script: jQuery throttle / debounce: Sometimes, less is more!
+//
+// *Version: 1.1, Last updated: 3/7/2010*
+// 
+// Project Home - http://benalman.com/projects/jquery-throttle-debounce-plugin/
+// GitHub       - http://github.com/cowboy/jquery-throttle-debounce/
+// Source       - http://github.com/cowboy/jquery-throttle-debounce/raw/master/jquery.ba-throttle-debounce.js
+// (Minified)   - http://github.com/cowboy/jquery-throttle-debounce/raw/master/jquery.ba-throttle-debounce.min.js (0.7kb)
+// 
+// About: License
+// 
+// Copyright (c) 2010 "Cowboy" Ben Alman,
+// Dual licensed under the MIT and GPL licenses.
+// http://benalman.com/about/license/
+// 
+// About: Examples
+// 
+// These working examples, complete with fully commented code, illustrate a few
+// ways in which this plugin can be used.
+// 
+// Throttle - http://benalman.com/code/projects/jquery-throttle-debounce/examples/throttle/
+// Debounce - http://benalman.com/code/projects/jquery-throttle-debounce/examples/debounce/
+// 
+// About: Support and Testing
+// 
+// Information about what version or versions of jQuery this plugin has been
+// tested with, what browsers it has been tested in, and where the unit tests
+// reside (so you can test it yourself).
+// 
+// jQuery Versions - none, 1.3.2, 1.4.2
+// Browsers Tested - Internet Explorer 6-8, Firefox 2-3.6, Safari 3-4, Chrome 4-5, Opera 9.6-10.1.
+// Unit Tests      - http://benalman.com/code/projects/jquery-throttle-debounce/unit/
+// 
+// About: Release History
+// 
+// 1.1 - (3/7/2010) Fixed a bug in <jQuery.throttle> where trailing callbacks
+//       executed later than they should. Reworked a fair amount of internal
+//       logic as well.
+// 1.0 - (3/6/2010) Initial release as a stand-alone project. Migrated over
+//       from jquery-misc repo v0.4 to jquery-throttle repo v1.0, added the
+//       no_trailing throttle parameter and debounce functionality.
+// 
+// Topic: Note for non-jQuery users
+// 
+// jQuery isn't actually required for this plugin, because nothing internal
+// uses any jQuery methods or properties. jQuery is just used as a namespace
+// under which these methods can exist.
+// 
+// Since jQuery isn't actually required for this plugin, if jQuery doesn't exist
+// when this plugin is loaded, the method described below will be created in
+// the `Cowboy` namespace. Usage will be exactly the same, but instead of
+// $.method() or jQuery.method(), you'll need to use Cowboy.method().
+
+(function(window,undefined){
+  '$:nomunge'; // Used by YUI compressor.
+  
+  // Since jQuery really isn't required for this plugin, use `jQuery` as the
+  // namespace only if it already exists, otherwise use the `Cowboy` namespace,
+  // creating it if necessary.
+  var $ = window.jQuery || window.Cowboy || ( window.Cowboy = {} ),
+    
+    // Internal method reference.
+    jq_throttle;
+  
+  // Method: jQuery.throttle
+  // 
+  // Throttle execution of a function. Especially useful for rate limiting
+  // execution of handlers on events like resize and scroll. If you want to
+  // rate-limit execution of a function to a single time, see the
+  // <jQuery.debounce> method.
+  // 
+  // In this visualization, | is a throttled-function call and X is the actual
+  // callback execution:
+  // 
+  // > Throttled with `no_trailing` specified as false or unspecified:
+  // > ||||||||||||||||||||||||| (pause) |||||||||||||||||||||||||
+  // > X    X    X    X    X    X        X    X    X    X    X    X
+  // > 
+  // > Throttled with `no_trailing` specified as true:
+  // > ||||||||||||||||||||||||| (pause) |||||||||||||||||||||||||
+  // > X    X    X    X    X             X    X    X    X    X
+  // 
+  // Usage:
+  // 
+  // > var throttled = jQuery.throttle( delay, [ no_trailing, ] callback );
+  // > 
+  // > jQuery('selector').bind( 'someevent', throttled );
+  // > jQuery('selector').unbind( 'someevent', throttled );
+  // 
+  // This also works in jQuery 1.4+:
+  // 
+  // > jQuery('selector').bind( 'someevent', jQuery.throttle( delay, [ no_trailing, ] callback ) );
+  // > jQuery('selector').unbind( 'someevent', callback );
+  // 
+  // Arguments:
+  // 
+  //  delay - (Number) A zero-or-greater delay in milliseconds. For event
+  //    callbacks, values around 100 or 250 (or even higher) are most useful.
+  //  no_trailing - (Boolean) Optional, defaults to false. If no_trailing is
+  //    true, callback will only execute every `delay` milliseconds while the
+  //    throttled-function is being called. If no_trailing is false or
+  //    unspecified, callback will be executed one final time after the last
+  //    throttled-function call. (After the throttled-function has not been
+  //    called for `delay` milliseconds, the internal counter is reset)
+  //  callback - (Function) A function to be executed after delay milliseconds.
+  //    The `this` context and all arguments are passed through, as-is, to
+  //    `callback` when the throttled-function is executed.
+  // 
+  // Returns:
+  // 
+  //  (Function) A new, throttled, function.
+  
+  $.throttle = jq_throttle = function( delay, no_trailing, callback, debounce_mode ) {
+    // After wrapper has stopped being called, this timeout ensures that
+    // `callback` is executed at the proper times in `throttle` and `end`
+    // debounce modes.
+    var timeout_id,
+      
+      // Keep track of the last time `callback` was executed.
+      last_exec = 0;
+    
+    // `no_trailing` defaults to falsy.
+    if ( typeof no_trailing !== 'boolean' ) {
+      debounce_mode = callback;
+      callback = no_trailing;
+      no_trailing = undefined;
+    }
+    
+    // The `wrapper` function encapsulates all of the throttling / debouncing
+    // functionality and when executed will limit the rate at which `callback`
+    // is executed.
+    function wrapper() {
+      var that = this,
+        elapsed = +new Date() - last_exec,
+        args = arguments;
+      
+      // Execute `callback` and update the `last_exec` timestamp.
+      function exec() {
+        last_exec = +new Date();
+        callback.apply( that, args );
+      };
+      
+      // If `debounce_mode` is true (at_begin) this is used to clear the flag
+      // to allow future `callback` executions.
+      function clear() {
+        timeout_id = undefined;
+      };
+      
+      if ( debounce_mode && !timeout_id ) {
+        // Since `wrapper` is being called for the first time and
+        // `debounce_mode` is true (at_begin), execute `callback`.
+        exec();
+      }
+      
+      // Clear any existing timeout.
+      timeout_id && clearTimeout( timeout_id );
+      
+      if ( debounce_mode === undefined && elapsed > delay ) {
+        // In throttle mode, if `delay` time has been exceeded, execute
+        // `callback`.
+        exec();
+        
+      } else if ( no_trailing !== true ) {
+        // In trailing throttle mode, since `delay` time has not been
+        // exceeded, schedule `callback` to execute `delay` ms after most
+        // recent execution.
+        // 
+        // If `debounce_mode` is true (at_begin), schedule `clear` to execute
+        // after `delay` ms.
+        // 
+        // If `debounce_mode` is false (at end), schedule `callback` to
+        // execute after `delay` ms.
+        timeout_id = setTimeout( debounce_mode ? clear : exec, debounce_mode === undefined ? delay - elapsed : delay );
+      }
+    };
+    
+    // Set the guid of `wrapper` function to the same of original callback, so
+    // it can be removed in jQuery 1.4+ .unbind or .die by using the original
+    // callback as a reference.
+    if ( $.guid ) {
+      wrapper.guid = callback.guid = callback.guid || $.guid++;
+    }
+    
+    // Return the wrapper function.
+    return wrapper;
+  };
+  
+  // Method: jQuery.debounce
+  // 
+  // Debounce execution of a function. Debouncing, unlike throttling,
+  // guarantees that a function is only executed a single time, either at the
+  // very beginning of a series of calls, or at the very end. If you want to
+  // simply rate-limit execution of a function, see the <jQuery.throttle>
+  // method.
+  // 
+  // In this visualization, | is a debounced-function call and X is the actual
+  // callback execution:
+  // 
+  // > Debounced with `at_begin` specified as false or unspecified:
+  // > ||||||||||||||||||||||||| (pause) |||||||||||||||||||||||||
+  // >                          X                                 X
+  // > 
+  // > Debounced with `at_begin` specified as true:
+  // > ||||||||||||||||||||||||| (pause) |||||||||||||||||||||||||
+  // > X                                 X
+  // 
+  // Usage:
+  // 
+  // > var debounced = jQuery.debounce( delay, [ at_begin, ] callback );
+  // > 
+  // > jQuery('selector').bind( 'someevent', debounced );
+  // > jQuery('selector').unbind( 'someevent', debounced );
+  // 
+  // This also works in jQuery 1.4+:
+  // 
+  // > jQuery('selector').bind( 'someevent', jQuery.debounce( delay, [ at_begin, ] callback ) );
+  // > jQuery('selector').unbind( 'someevent', callback );
+  // 
+  // Arguments:
+  // 
+  //  delay - (Number) A zero-or-greater delay in milliseconds. For event
+  //    callbacks, values around 100 or 250 (or even higher) are most useful.
+  //  at_begin - (Boolean) Optional, defaults to false. If at_begin is false or
+  //    unspecified, callback will only be executed `delay` milliseconds after
+  //    the last debounced-function call. If at_begin is true, callback will be
+  //    executed only at the first debounced-function call. (After the
+  //    throttled-function has not been called for `delay` milliseconds, the
+  //    internal counter is reset)
+  //  callback - (Function) A function to be executed after delay milliseconds.
+  //    The `this` context and all arguments are passed through, as-is, to
+  //    `callback` when the debounced-function is executed.
+  // 
+  // Returns:
+  // 
+  //  (Function) A new, debounced, function.
+  
+  $.debounce = function( delay, at_begin, callback ) {
+    return callback === undefined
+      ? jq_throttle( delay, at_begin, false )
+      : jq_throttle( delay, callback, at_begin !== false );
+  };
+  
+})(this);
diff --git a/resources/lib/jquery/jquery.cookie.js b/resources/lib/jquery/jquery.cookie.js
new file mode 100644 (file)
index 0000000..6d5974a
--- /dev/null
@@ -0,0 +1,47 @@
+/*!
+ * jQuery Cookie Plugin
+ * https://github.com/carhartl/jquery-cookie
+ *
+ * Copyright 2011, Klaus Hartl
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://www.opensource.org/licenses/mit-license.php
+ * http://www.opensource.org/licenses/GPL-2.0
+ */
+(function($) {
+    $.cookie = function(key, value, options) {
+
+        // key and at least value given, set cookie...
+        if (arguments.length > 1 && (!/Object/.test(Object.prototype.toString.call(value)) || value === null || value === undefined)) {
+            options = $.extend({}, options);
+
+            if (value === null || value === undefined) {
+                options.expires = -1;
+            }
+
+            if (typeof options.expires === 'number') {
+                var days = options.expires, t = options.expires = new Date();
+                t.setDate(t.getDate() + days);
+            }
+
+            value = String(value);
+
+            return (document.cookie = [
+                encodeURIComponent(key), '=', options.raw ? value : encodeURIComponent(value),
+                options.expires ? '; expires=' + options.expires.toUTCString() : '', // use expires attribute, max-age is not supported by IE
+                options.path    ? '; path=' + options.path : '',
+                options.domain  ? '; domain=' + options.domain : '',
+                options.secure  ? '; secure' : ''
+            ].join(''));
+        }
+
+        // key and possibly options given, get cookie...
+        options = value || {};
+        var decode = options.raw ? function(s) { return s; } : decodeURIComponent;
+
+        var pairs = document.cookie.split('; ');
+        for (var i = 0, pair; pair = pairs[i] && pairs[i].split('='); i++) {
+            if (decode(pair[0]) === key) return decode(pair[1] || ''); // IE saves cookies with empty string as "c; ", e.g. without "=" as opposed to EOMB, thus pair[1] may be undefined
+        }
+        return null;
+    };
+})(jQuery);
diff --git a/resources/lib/jquery/jquery.cycle.all.js b/resources/lib/jquery/jquery.cycle.all.js
new file mode 100644 (file)
index 0000000..d57fb72
--- /dev/null
@@ -0,0 +1,1529 @@
+/*!
+ * jQuery Cycle Plugin (with Transition Definitions)
+ * Examples and documentation at: http://jquery.malsup.com/cycle/
+ * Copyright (c) 2007-2010 M. Alsup
+ * Version: 2.9999 (13-NOV-2011)
+ * Dual licensed under the MIT and GPL licenses.
+ * http://jquery.malsup.com/license.html
+ * Requires: jQuery v1.3.2 or later
+ */
+;(function($, undefined) {
+
+var ver = '2.9999';
+
+// if $.support is not defined (pre jQuery 1.3) add what I need
+if ($.support == undefined) {
+       $.support = {
+               opacity: !($.browser.msie)
+       };
+}
+
+function debug(s) {
+       $.fn.cycle.debug && log(s);
+}              
+function log() {
+       window.console && console.log && console.log('[cycle] ' + Array.prototype.join.call(arguments,' '));
+}
+$.expr[':'].paused = function(el) {
+       return el.cyclePause;
+}
+
+
+// the options arg can be...
+//   a number  - indicates an immediate transition should occur to the given slide index
+//   a string  - 'pause', 'resume', 'toggle', 'next', 'prev', 'stop', 'destroy' or the name of a transition effect (ie, 'fade', 'zoom', etc)
+//   an object - properties to control the slideshow
+//
+// the arg2 arg can be...
+//   the name of an fx (only used in conjunction with a numeric value for 'options')
+//   the value true (only used in first arg == 'resume') and indicates
+//      that the resume should occur immediately (not wait for next timeout)
+
+$.fn.cycle = function(options, arg2) {
+       var o = { s: this.selector, c: this.context };
+
+       // in 1.3+ we can fix mistakes with the ready state
+       if (this.length === 0 && options != 'stop') {
+               if (!$.isReady && o.s) {
+                       log('DOM not ready, queuing slideshow');
+                       $(function() {
+                               $(o.s,o.c).cycle(options,arg2);
+                       });
+                       return this;
+               }
+               // is your DOM ready?  http://docs.jquery.com/Tutorials:Introducing_$(document).ready()
+               log('terminating; zero elements found by selector' + ($.isReady ? '' : ' (DOM not ready)'));
+               return this;
+       }
+
+       // iterate the matched nodeset
+       return this.each(function() {
+               var opts = handleArguments(this, options, arg2);
+               if (opts === false)
+                       return;
+
+               opts.updateActivePagerLink = opts.updateActivePagerLink || $.fn.cycle.updateActivePagerLink;
+               
+               // stop existing slideshow for this container (if there is one)
+               if (this.cycleTimeout)
+                       clearTimeout(this.cycleTimeout);
+               this.cycleTimeout = this.cyclePause = 0;
+
+               var $cont = $(this);
+               var $slides = opts.slideExpr ? $(opts.slideExpr, this) : $cont.children();
+               var els = $slides.get();
+
+               var opts2 = buildOptions($cont, $slides, els, opts, o);
+               if (opts2 === false)
+                       return;
+
+               if (els.length < 2) {
+                       log('terminating; too few slides: ' + els.length);
+                       return;
+               }
+
+               var startTime = opts2.continuous ? 10 : getTimeout(els[opts2.currSlide], els[opts2.nextSlide], opts2, !opts2.backwards);
+
+               // if it's an auto slideshow, kick it off
+               if (startTime) {
+                       startTime += (opts2.delay || 0);
+                       if (startTime < 10)
+                               startTime = 10;
+                       debug('first timeout: ' + startTime);
+                       this.cycleTimeout = setTimeout(function(){go(els,opts2,0,!opts.backwards)}, startTime);
+               }
+       });
+};
+
+function triggerPause(cont, byHover, onPager) {
+       var opts = $(cont).data('cycle.opts');
+       var paused = !!cont.cyclePause;
+       if (paused && opts.paused)
+               opts.paused(cont, opts, byHover, onPager);
+       else if (!paused && opts.resumed)
+               opts.resumed(cont, opts, byHover, onPager);
+}
+
+// process the args that were passed to the plugin fn
+function handleArguments(cont, options, arg2) {
+       if (cont.cycleStop == undefined)
+               cont.cycleStop = 0;
+       if (options === undefined || options === null)
+               options = {};
+       if (options.constructor == String) {
+               switch(options) {
+               case 'destroy':
+               case 'stop':
+                       var opts = $(cont).data('cycle.opts');
+                       if (!opts)
+                               return false;
+                       cont.cycleStop++; // callbacks look for change
+                       if (cont.cycleTimeout)
+                               clearTimeout(cont.cycleTimeout);
+                       cont.cycleTimeout = 0;
+                       opts.elements && $(opts.elements).stop();
+                       $(cont).removeData('cycle.opts');
+                       if (options == 'destroy')
+                               destroy(opts);
+                       return false;
+               case 'toggle':
+                       cont.cyclePause = (cont.cyclePause === 1) ? 0 : 1;
+                       checkInstantResume(cont.cyclePause, arg2, cont);
+                       triggerPause(cont);
+                       return false;
+               case 'pause':
+                       cont.cyclePause = 1;
+                       triggerPause(cont);
+                       return false;
+               case 'resume':
+                       cont.cyclePause = 0;
+                       checkInstantResume(false, arg2, cont);
+                       triggerPause(cont);
+                       return false;
+               case 'prev':
+               case 'next':
+                       var opts = $(cont).data('cycle.opts');
+                       if (!opts) {
+                               log('options not found, "prev/next" ignored');
+                               return false;
+                       }
+                       $.fn.cycle[options](opts);
+                       return false;
+               default:
+                       options = { fx: options };
+               };
+               return options;
+       }
+       else if (options.constructor == Number) {
+               // go to the requested slide
+               var num = options;
+               options = $(cont).data('cycle.opts');
+               if (!options) {
+                       log('options not found, can not advance slide');
+                       return false;
+               }
+               if (num < 0 || num >= options.elements.length) {
+                       log('invalid slide index: ' + num);
+                       return false;
+               }
+               options.nextSlide = num;
+               if (cont.cycleTimeout) {
+                       clearTimeout(cont.cycleTimeout);
+                       cont.cycleTimeout = 0;
+               }
+               if (typeof arg2 == 'string')
+                       options.oneTimeFx = arg2;
+               go(options.elements, options, 1, num >= options.currSlide);
+               return false;
+       }
+       return options;
+       
+       function checkInstantResume(isPaused, arg2, cont) {
+               if (!isPaused && arg2 === true) { // resume now!
+                       var options = $(cont).data('cycle.opts');
+                       if (!options) {
+                               log('options not found, can not resume');
+                               return false;
+                       }
+                       if (cont.cycleTimeout) {
+                               clearTimeout(cont.cycleTimeout);
+                               cont.cycleTimeout = 0;
+                       }
+                       go(options.elements, options, 1, !options.backwards);
+               }
+       }
+};
+
+function removeFilter(el, opts) {
+       if (!$.support.opacity && opts.cleartype && el.style.filter) {
+               try { el.style.removeAttribute('filter'); }
+               catch(smother) {} // handle old opera versions
+       }
+};
+
+// unbind event handlers
+function destroy(opts) {
+       if (opts.next)
+               $(opts.next).unbind(opts.prevNextEvent);
+       if (opts.prev)
+               $(opts.prev).unbind(opts.prevNextEvent);
+       
+       if (opts.pager || opts.pagerAnchorBuilder)
+               $.each(opts.pagerAnchors || [], function() {
+                       this.unbind().remove();
+               });
+       opts.pagerAnchors = null;
+       if (opts.destroy) // callback
+               opts.destroy(opts);
+};
+
+// one-time initialization
+function buildOptions($cont, $slides, els, options, o) {
+       var startingSlideSpecified;
+       // support metadata plugin (v1.0 and v2.0)
+       var opts = $.extend({}, $.fn.cycle.defaults, options || {}, $.metadata ? $cont.metadata() : $.meta ? $cont.data() : {});
+       var meta = $.isFunction($cont.data) ? $cont.data(opts.metaAttr) : null;
+       if (meta)
+               opts = $.extend(opts, meta);
+       if (opts.autostop)
+               opts.countdown = opts.autostopCount || els.length;
+
+       var cont = $cont[0];
+       $cont.data('cycle.opts', opts);
+       opts.$cont = $cont;
+       opts.stopCount = cont.cycleStop;
+       opts.elements = els;
+       opts.before = opts.before ? [opts.before] : [];
+       opts.after = opts.after ? [opts.after] : [];
+
+       // push some after callbacks
+       if (!$.support.opacity && opts.cleartype)
+               opts.after.push(function() { removeFilter(this, opts); });
+       if (opts.continuous)
+               opts.after.push(function() { go(els,opts,0,!opts.backwards); });
+
+       saveOriginalOpts(opts);
+
+       // clearType corrections
+       if (!$.support.opacity && opts.cleartype && !opts.cleartypeNoBg)
+               clearTypeFix($slides);
+
+       // container requires non-static position so that slides can be position within
+       if ($cont.css('position') == 'static')
+               $cont.css('position', 'relative');
+       if (opts.width)
+               $cont.width(opts.width);
+       if (opts.height && opts.height != 'auto')
+               $cont.height(opts.height);
+
+       if (opts.startingSlide != undefined) {
+               opts.startingSlide = parseInt(opts.startingSlide,10);
+               if (opts.startingSlide >= els.length || opts.startSlide < 0)
+                       opts.startingSlide = 0; // catch bogus input
+               else 
+                       startingSlideSpecified = true;
+       }
+       else if (opts.backwards)
+               opts.startingSlide = els.length - 1;
+       else
+               opts.startingSlide = 0;
+
+       // if random, mix up the slide array
+       if (opts.random) {
+               opts.randomMap = [];
+               for (var i = 0; i < els.length; i++)
+                       opts.randomMap.push(i);
+               opts.randomMap.sort(function(a,b) {return Math.random() - 0.5;});
+               if (startingSlideSpecified) {
+                       // try to find the specified starting slide and if found set start slide index in the map accordingly
+                       for ( var cnt = 0; cnt < els.length; cnt++ ) {
+                               if ( opts.startingSlide == opts.randomMap[cnt] ) {
+                                       opts.randomIndex = cnt;
+                               }
+                       }
+               }
+               else {
+                       opts.randomIndex = 1;
+                       opts.startingSlide = opts.randomMap[1];
+               }
+       }
+       else if (opts.startingSlide >= els.length)
+               opts.startingSlide = 0; // catch bogus input
+       opts.currSlide = opts.startingSlide || 0;
+       var first = opts.startingSlide;
+
+       // set position and zIndex on all the slides
+       $slides.css({position: 'absolute', top:0, left:0}).hide().each(function(i) {
+               var z;
+               if (opts.backwards)
+                       z = first ? i <= first ? els.length + (i-first) : first-i : els.length-i;
+               else
+                       z = first ? i >= first ? els.length - (i-first) : first-i : els.length-i;
+               $(this).css('z-index', z)
+       });
+
+       // make sure first slide is visible
+       $(els[first]).css('opacity',1).show(); // opacity bit needed to handle restart use case
+       removeFilter(els[first], opts);
+
+       // stretch slides
+       if (opts.fit) {
+               if (!opts.aspect) {
+               if (opts.width)
+                   $slides.width(opts.width);
+               if (opts.height && opts.height != 'auto')
+                   $slides.height(opts.height);
+               } else {
+                       $slides.each(function(){
+                               var $slide = $(this);
+                               var ratio = (opts.aspect === true) ? $slide.width()/$slide.height() : opts.aspect;
+                               if( opts.width && $slide.width() != opts.width ) {
+                                       $slide.width( opts.width );
+                                       $slide.height( opts.width / ratio );
+                               }
+
+                               if( opts.height && $slide.height() < opts.height ) {
+                                       $slide.height( opts.height );
+                                       $slide.width( opts.height * ratio );
+                               }
+                       });
+               }
+       }
+
+       if (opts.center && ((!opts.fit) || opts.aspect)) {
+               $slides.each(function(){
+                       var $slide = $(this);
+                       $slide.css({
+                               "margin-left": opts.width ?
+                                       ((opts.width - $slide.width()) / 2) + "px" :
+                                       0,
+                               "margin-top": opts.height ?
+                                       ((opts.height - $slide.height()) / 2) + "px" :
+                                       0
+                       });
+               });
+       }
+
+       if (opts.center && !opts.fit && !opts.slideResize) {
+               $slides.each(function(){
+               var $slide = $(this);
+               $slide.css({
+                       "margin-left": opts.width ? ((opts.width - $slide.width()) / 2) + "px" : 0,
+                       "margin-top": opts.height ? ((opts.height - $slide.height()) / 2) + "px" : 0
+               });
+               });
+       }
+               
+       // stretch container
+       var reshape = opts.containerResize && !$cont.innerHeight();
+       if (reshape) { // do this only if container has no size http://tinyurl.com/da2oa9
+               var maxw = 0, maxh = 0;
+               for(var j=0; j < els.length; j++) {
+                       var $e = $(els[j]), e = $e[0], w = $e.outerWidth(), h = $e.outerHeight();
+                       if (!w) w = e.offsetWidth || e.width || $e.attr('width');
+                       if (!h) h = e.offsetHeight || e.height || $e.attr('height');
+                       maxw = w > maxw ? w : maxw;
+                       maxh = h > maxh ? h : maxh;
+               }
+               if (maxw > 0 && maxh > 0)
+                       $cont.css({width:maxw+'px',height:maxh+'px'});
+       }
+
+       var pauseFlag = false;  // https://github.com/malsup/cycle/issues/44
+       if (opts.pause)
+               $cont.hover(
+                       function(){
+                               pauseFlag = true;
+                               this.cyclePause++;
+                               triggerPause(cont, true);
+                       },
+                       function(){
+                               pauseFlag && this.cyclePause--;
+                               triggerPause(cont, true);
+                       }
+               );
+
+       if (supportMultiTransitions(opts) === false)
+               return false;
+
+       // apparently a lot of people use image slideshows without height/width attributes on the images.
+       // Cycle 2.50+ requires the sizing info for every slide; this block tries to deal with that.
+       var requeue = false;
+       options.requeueAttempts = options.requeueAttempts || 0;
+       $slides.each(function() {
+               // try to get height/width of each slide
+               var $el = $(this);
+               this.cycleH = (opts.fit && opts.height) ? opts.height : ($el.height() || this.offsetHeight || this.height || $el.attr('height') || 0);
+               this.cycleW = (opts.fit && opts.width) ? opts.width : ($el.width() || this.offsetWidth || this.width || $el.attr('width') || 0);
+
+               if ( $el.is('img') ) {
+                       // sigh..  sniffing, hacking, shrugging...  this crappy hack tries to account for what browsers do when
+                       // an image is being downloaded and the markup did not include sizing info (height/width attributes);
+                       // there seems to be some "default" sizes used in this situation
+                       var loadingIE   = ($.browser.msie  && this.cycleW == 28 && this.cycleH == 30 && !this.complete);
+                       var loadingFF   = ($.browser.mozilla && this.cycleW == 34 && this.cycleH == 19 && !this.complete);
+                       var loadingOp   = ($.browser.opera && ((this.cycleW == 42 && this.cycleH == 19) || (this.cycleW == 37 && this.cycleH == 17)) && !this.complete);
+                       var loadingOther = (this.cycleH == 0 && this.cycleW == 0 && !this.complete);
+                       // don't requeue for images that are still loading but have a valid size
+                       if (loadingIE || loadingFF || loadingOp || loadingOther) {
+                               if (o.s && opts.requeueOnImageNotLoaded && ++options.requeueAttempts < 100) { // track retry count so we don't loop forever
+                                       log(options.requeueAttempts,' - img slide not loaded, requeuing slideshow: ', this.src, this.cycleW, this.cycleH);
+                                       setTimeout(function() {$(o.s,o.c).cycle(options)}, opts.requeueTimeout);
+                                       requeue = true;
+                                       return false; // break each loop
+                               }
+                               else {
+                                       log('could not determine size of image: '+this.src, this.cycleW, this.cycleH);
+                               }
+                       }
+               }
+               return true;
+       });
+
+       if (requeue)
+               return false;
+
+       opts.cssBefore = opts.cssBefore || {};
+       opts.cssAfter = opts.cssAfter || {};
+       opts.cssFirst = opts.cssFirst || {};
+       opts.animIn = opts.animIn || {};
+       opts.animOut = opts.animOut || {};
+
+       $slides.not(':eq('+first+')').css(opts.cssBefore);
+       $($slides[first]).css(opts.cssFirst);
+
+       if (opts.timeout) {
+               opts.timeout = parseInt(opts.timeout,10);
+               // ensure that timeout and speed settings are sane
+               if (opts.speed.constructor == String)
+                       opts.speed = $.fx.speeds[opts.speed] || parseInt(opts.speed,10);
+               if (!opts.sync)
+                       opts.speed = opts.speed / 2;
+               
+               var buffer = opts.fx == 'none' ? 0 : opts.fx == 'shuffle' ? 500 : 250;
+               while((opts.timeout - opts.speed) < buffer) // sanitize timeout
+                       opts.timeout += opts.speed;
+       }
+       if (opts.easing)
+               opts.easeIn = opts.easeOut = opts.easing;
+       if (!opts.speedIn)
+               opts.speedIn = opts.speed;
+       if (!opts.speedOut)
+               opts.speedOut = opts.speed;
+
+       opts.slideCount = els.length;
+       opts.currSlide = opts.lastSlide = first;
+       if (opts.random) {
+               if (++opts.randomIndex == els.length)
+                       opts.randomIndex = 0;
+               opts.nextSlide = opts.randomMap[opts.randomIndex];
+       }
+       else if (opts.backwards)
+               opts.nextSlide = opts.startingSlide == 0 ? (els.length-1) : opts.startingSlide-1;
+       else
+               opts.nextSlide = opts.startingSlide >= (els.length-1) ? 0 : opts.startingSlide+1;
+
+       // run transition init fn
+       if (!opts.multiFx) {
+               var init = $.fn.cycle.transitions[opts.fx];
+               if ($.isFunction(init))
+                       init($cont, $slides, opts);
+               else if (opts.fx != 'custom' && !opts.multiFx) {
+                       log('unknown transition: ' + opts.fx,'; slideshow terminating');
+                       return false;
+               }
+       }
+
+       // fire artificial events
+       var e0 = $slides[first];
+       if (!opts.skipInitializationCallbacks) {
+               if (opts.before.length)
+                       opts.before[0].apply(e0, [e0, e0, opts, true]);
+               if (opts.after.length)
+                       opts.after[0].apply(e0, [e0, e0, opts, true]);
+       }
+       if (opts.next)
+               $(opts.next).bind(opts.prevNextEvent,function(){return advance(opts,1)});
+       if (opts.prev)
+               $(opts.prev).bind(opts.prevNextEvent,function(){return advance(opts,0)});
+       if (opts.pager || opts.pagerAnchorBuilder)
+               buildPager(els,opts);
+
+       exposeAddSlide(opts, els);
+
+       return opts;
+};
+
+// save off original opts so we can restore after clearing state
+function saveOriginalOpts(opts) {
+       opts.original = { before: [], after: [] };
+       opts.original.cssBefore = $.extend({}, opts.cssBefore);
+       opts.original.cssAfter  = $.extend({}, opts.cssAfter);
+       opts.original.animIn    = $.extend({}, opts.animIn);
+       opts.original.animOut   = $.extend({}, opts.animOut);
+       $.each(opts.before, function() { opts.original.before.push(this); });
+       $.each(opts.after,  function() { opts.original.after.push(this); });
+};
+
+function supportMultiTransitions(opts) {
+       var i, tx, txs = $.fn.cycle.transitions;
+       // look for multiple effects
+       if (opts.fx.indexOf(',') > 0) {
+               opts.multiFx = true;
+               opts.fxs = opts.fx.replace(/\s*/g,'').split(',');
+               // discard any bogus effect names
+               for (i=0; i < opts.fxs.length; i++) {
+                       var fx = opts.fxs[i];
+                       tx = txs[fx];
+                       if (!tx || !txs.hasOwnProperty(fx) || !$.isFunction(tx)) {
+                               log('discarding unknown transition: ',fx);
+                               opts.fxs.splice(i,1);
+                               i--;
+                       }
+               }
+               // if we have an empty list then we threw everything away!
+               if (!opts.fxs.length) {
+                       log('No valid transitions named; slideshow terminating.');
+                       return false;
+               }
+       }
+       else if (opts.fx == 'all') {  // auto-gen the list of transitions
+               opts.multiFx = true;
+               opts.fxs = [];
+               for (p in txs) {
+                       tx = txs[p];
+                       if (txs.hasOwnProperty(p) && $.isFunction(tx))
+                               opts.fxs.push(p);
+               }
+       }
+       if (opts.multiFx && opts.randomizeEffects) {
+               // munge the fxs array to make effect selection random
+               var r1 = Math.floor(Math.random() * 20) + 30;
+               for (i = 0; i < r1; i++) {
+                       var r2 = Math.floor(Math.random() * opts.fxs.length);
+                       opts.fxs.push(opts.fxs.splice(r2,1)[0]);
+               }
+               debug('randomized fx sequence: ',opts.fxs);
+       }
+       return true;
+};
+
+// provide a mechanism for adding slides after the slideshow has started
+function exposeAddSlide(opts, els) {
+       opts.addSlide = function(newSlide, prepend) {
+               var $s = $(newSlide), s = $s[0];
+               if (!opts.autostopCount)
+                       opts.countdown++;
+               els[prepend?'unshift':'push'](s);
+               if (opts.els)
+                       opts.els[prepend?'unshift':'push'](s); // shuffle needs this
+               opts.slideCount = els.length;
+
+               // add the slide to the random map and resort
+               if (opts.random) {
+                       opts.randomMap.push(opts.slideCount-1);
+                       opts.randomMap.sort(function(a,b) {return Math.random() - 0.5;});
+               }
+
+               $s.css('position','absolute');
+               $s[prepend?'prependTo':'appendTo'](opts.$cont);
+
+               if (prepend) {
+                       opts.currSlide++;
+                       opts.nextSlide++;
+               }
+
+               if (!$.support.opacity && opts.cleartype && !opts.cleartypeNoBg)
+                       clearTypeFix($s);
+
+               if (opts.fit && opts.width)
+                       $s.width(opts.width);
+               if (opts.fit && opts.height && opts.height != 'auto')
+                       $s.height(opts.height);
+               s.cycleH = (opts.fit && opts.height) ? opts.height : $s.height();
+               s.cycleW = (opts.fit && opts.width) ? opts.width : $s.width();
+
+               $s.css(opts.cssBefore);
+
+               if (opts.pager || opts.pagerAnchorBuilder)
+                       $.fn.cycle.createPagerAnchor(els.length-1, s, $(opts.pager), els, opts);
+
+               if ($.isFunction(opts.onAddSlide))
+                       opts.onAddSlide($s);
+               else
+                       $s.hide(); // default behavior
+       };
+}
+
+// reset internal state; we do this on every pass in order to support multiple effects
+$.fn.cycle.resetState = function(opts, fx) {
+       fx = fx || opts.fx;
+       opts.before = []; opts.after = [];
+       opts.cssBefore = $.extend({}, opts.original.cssBefore);
+       opts.cssAfter  = $.extend({}, opts.original.cssAfter);
+       opts.animIn     = $.extend({}, opts.original.animIn);
+       opts.animOut   = $.extend({}, opts.original.animOut);
+       opts.fxFn = null;
+       $.each(opts.original.before, function() { opts.before.push(this); });
+       $.each(opts.original.after,  function() { opts.after.push(this); });
+
+       // re-init
+       var init = $.fn.cycle.transitions[fx];
+       if ($.isFunction(init))
+               init(opts.$cont, $(opts.elements), opts);
+};
+
+// this is the main engine fn, it handles the timeouts, callbacks and slide index mgmt
+function go(els, opts, manual, fwd) {
+       // opts.busy is true if we're in the middle of an animation
+       if (manual && opts.busy && opts.manualTrump) {
+               // let manual transitions requests trump active ones
+               debug('manualTrump in go(), stopping active transition');
+               $(els).stop(true,true);
+               opts.busy = 0;
+       }
+       // don't begin another timeout-based transition if there is one active
+       if (opts.busy) {
+               debug('transition active, ignoring new tx request');
+               return;
+       }
+
+       var p = opts.$cont[0], curr = els[opts.currSlide], next = els[opts.nextSlide];
+
+       // stop cycling if we have an outstanding stop request
+       if (p.cycleStop != opts.stopCount || p.cycleTimeout === 0 && !manual)
+               return;
+
+       // check to see if we should stop cycling based on autostop options
+       if (!manual && !p.cyclePause && !opts.bounce &&
+               ((opts.autostop && (--opts.countdown <= 0)) ||
+               (opts.nowrap && !opts.random && opts.nextSlide < opts.currSlide))) {
+               if (opts.end)
+                       opts.end(opts);
+               return;
+       }
+
+       // if slideshow is paused, only transition on a manual trigger
+       var changed = false;
+       if ((manual || !p.cyclePause) && (opts.nextSlide != opts.currSlide)) {
+               changed = true;
+               var fx = opts.fx;
+               // keep trying to get the slide size if we don't have it yet
+               curr.cycleH = curr.cycleH || $(curr).height();
+               curr.cycleW = curr.cycleW || $(curr).width();
+               next.cycleH = next.cycleH || $(next).height();
+               next.cycleW = next.cycleW || $(next).width();
+
+               // support multiple transition types
+               if (opts.multiFx) {
+                       if (fwd && (opts.lastFx == undefined || ++opts.lastFx >= opts.fxs.length))
+                               opts.lastFx = 0;
+                       else if (!fwd && (opts.lastFx == undefined || --opts.lastFx < 0))
+                               opts.lastFx = opts.fxs.length - 1;
+                       fx = opts.fxs[opts.lastFx];
+               }
+
+               // one-time fx overrides apply to:  $('div').cycle(3,'zoom');
+               if (opts.oneTimeFx) {
+                       fx = opts.oneTimeFx;
+                       opts.oneTimeFx = null;
+               }
+
+               $.fn.cycle.resetState(opts, fx);
+
+               // run the before callbacks
+               if (opts.before.length)
+                       $.each(opts.before, function(i,o) {
+                               if (p.cycleStop != opts.stopCount) return;
+                               o.apply(next, [curr, next, opts, fwd]);
+                       });
+
+               // stage the after callacks
+               var after = function() {
+                       opts.busy = 0;
+                       $.each(opts.after, function(i,o) {
+                               if (p.cycleStop != opts.stopCount) return;
+                               o.apply(next, [curr, next, opts, fwd]);
+                       });
+                       if (!p.cycleStop) {
+                               // queue next transition
+                               queueNext();
+                       }
+               };
+
+               debug('tx firing('+fx+'); currSlide: ' + opts.currSlide + '; nextSlide: ' + opts.nextSlide);
+               
+               // get ready to perform the transition
+               opts.busy = 1;
+               if (opts.fxFn) // fx function provided?
+                       opts.fxFn(curr, next, opts, after, fwd, manual && opts.fastOnEvent);
+               else if ($.isFunction($.fn.cycle[opts.fx])) // fx plugin ?
+                       $.fn.cycle[opts.fx](curr, next, opts, after, fwd, manual && opts.fastOnEvent);
+               else
+                       $.fn.cycle.custom(curr, next, opts, after, fwd, manual && opts.fastOnEvent);
+       }
+       else {
+               queueNext();
+       }
+
+       if (changed || opts.nextSlide == opts.currSlide) {
+               // calculate the next slide
+               opts.lastSlide = opts.currSlide;
+               if (opts.random) {
+                       opts.currSlide = opts.nextSlide;
+                       if (++opts.randomIndex == els.length) {
+                               opts.randomIndex = 0;
+                               opts.randomMap.sort(function(a,b) {return Math.random() - 0.5;});
+                       }
+                       opts.nextSlide = opts.randomMap[opts.randomIndex];
+                       if (opts.nextSlide == opts.currSlide)
+                               opts.nextSlide = (opts.currSlide == opts.slideCount - 1) ? 0 : opts.currSlide + 1;
+               }
+               else if (opts.backwards) {
+                       var roll = (opts.nextSlide - 1) < 0;
+                       if (roll && opts.bounce) {
+                               opts.backwards = !opts.backwards;
+                               opts.nextSlide = 1;
+                               opts.currSlide = 0;
+                       }
+                       else {
+                               opts.nextSlide = roll ? (els.length-1) : opts.nextSlide-1;
+                               opts.currSlide = roll ? 0 : opts.nextSlide+1;
+                       }
+               }
+               else { // sequence
+                       var roll = (opts.nextSlide + 1) == els.length;
+                       if (roll && opts.bounce) {
+                               opts.backwards = !opts.backwards;
+                               opts.nextSlide = els.length-2;
+                               opts.currSlide = els.length-1;
+                       }
+                       else {
+                               opts.nextSlide = roll ? 0 : opts.nextSlide+1;
+                               opts.currSlide = roll ? els.length-1 : opts.nextSlide-1;
+                       }
+               }
+       }
+       if (changed && opts.pager)
+               opts.updateActivePagerLink(opts.pager, opts.currSlide, opts.activePagerClass);
+       
+       function queueNext() {
+               // stage the next transition
+               var ms = 0, timeout = opts.timeout;
+               if (opts.timeout && !opts.continuous) {
+                       ms = getTimeout(els[opts.currSlide], els[opts.nextSlide], opts, fwd);
+         if (opts.fx == 'shuffle')
+            ms -= opts.speedOut;
+      }
+               else if (opts.continuous && p.cyclePause) // continuous shows work off an after callback, not this timer logic
+                       ms = 10;
+               if (ms > 0)
+                       p.cycleTimeout = setTimeout(function(){ go(els, opts, 0, !opts.backwards) }, ms);
+       }
+};
+
+// invoked after transition
+$.fn.cycle.updateActivePagerLink = function(pager, currSlide, clsName) {
+   $(pager).each(function() {
+       $(this).children().removeClass(clsName).eq(currSlide).addClass(clsName);
+   });
+};
+
+// calculate timeout value for current transition
+function getTimeout(curr, next, opts, fwd) {
+       if (opts.timeoutFn) {
+               // call user provided calc fn
+               var t = opts.timeoutFn.call(curr,curr,next,opts,fwd);
+               while (opts.fx != 'none' && (t - opts.speed) < 250) // sanitize timeout
+                       t += opts.speed;
+               debug('calculated timeout: ' + t + '; speed: ' + opts.speed);
+               if (t !== false)
+                       return t;
+       }
+       return opts.timeout;
+};
+
+// expose next/prev function, caller must pass in state
+$.fn.cycle.next = function(opts) { advance(opts,1); };
+$.fn.cycle.prev = function(opts) { advance(opts,0);};
+
+// advance slide forward or back
+function advance(opts, moveForward) {
+       var val = moveForward ? 1 : -1;
+       var els = opts.elements;
+       var p = opts.$cont[0], timeout = p.cycleTimeout;
+       if (timeout) {
+               clearTimeout(timeout);
+               p.cycleTimeout = 0;
+       }
+       if (opts.random && val < 0) {
+               // move back to the previously display slide
+               opts.randomIndex--;
+               if (--opts.randomIndex == -2)
+                       opts.randomIndex = els.length-2;
+               else if (opts.randomIndex == -1)
+                       opts.randomIndex = els.length-1;
+               opts.nextSlide = opts.randomMap[opts.randomIndex];
+       }
+       else if (opts.random) {
+               opts.nextSlide = opts.randomMap[opts.randomIndex];
+       }
+       else {
+               opts.nextSlide = opts.currSlide + val;
+               if (opts.nextSlide < 0) {
+                       if (opts.nowrap) return false;
+                       opts.nextSlide = els.length - 1;
+               }
+               else if (opts.nextSlide >= els.length) {
+                       if (opts.nowrap) return false;
+                       opts.nextSlide = 0;
+               }
+       }
+
+       var cb = opts.onPrevNextEvent || opts.prevNextClick; // prevNextClick is deprecated
+       if ($.isFunction(cb))
+               cb(val > 0, opts.nextSlide, els[opts.nextSlide]);
+       go(els, opts, 1, moveForward);
+       return false;
+};
+
+function buildPager(els, opts) {
+       var $p = $(opts.pager);
+       $.each(els, function(i,o) {
+               $.fn.cycle.createPagerAnchor(i,o,$p,els,opts);
+       });
+       opts.updateActivePagerLink(opts.pager, opts.startingSlide, opts.activePagerClass);
+};
+
+$.fn.cycle.createPagerAnchor = function(i, el, $p, els, opts) {
+       var a;
+       if ($.isFunction(opts.pagerAnchorBuilder)) {
+               a = opts.pagerAnchorBuilder(i,el);
+               debug('pagerAnchorBuilder('+i+', el) returned: ' + a);
+       }
+       else
+               a = '<a href="#">'+(i+1)+'</a>';
+               
+       if (!a)
+               return;
+       var $a = $(a);
+       // don't reparent if anchor is in the dom
+       if ($a.parents('body').length === 0) {
+               var arr = [];
+               if ($p.length > 1) {
+                       $p.each(function() {
+                               var $clone = $a.clone(true);
+                               $(this).append($clone);
+                               arr.push($clone[0]);
+                       });
+                       $a = $(arr);
+               }
+               else {
+                       $a.appendTo($p);
+               }
+       }
+
+       opts.pagerAnchors =  opts.pagerAnchors || [];
+       opts.pagerAnchors.push($a);
+       
+       var pagerFn = function(e) {
+               e.preventDefault();
+               opts.nextSlide = i;
+               var p = opts.$cont[0], timeout = p.cycleTimeout;
+               if (timeout) {
+                       clearTimeout(timeout);
+                       p.cycleTimeout = 0;
+               }
+               var cb = opts.onPagerEvent || opts.pagerClick; // pagerClick is deprecated
+               if ($.isFunction(cb))
+                       cb(opts.nextSlide, els[opts.nextSlide]);
+               go(els,opts,1,opts.currSlide < i); // trigger the trans
+//             return false; // <== allow bubble
+       }
+       
+       if ( /mouseenter|mouseover/i.test(opts.pagerEvent) ) {
+               $a.hover(pagerFn, function(){/* no-op */} );
+       }
+       else {
+               $a.bind(opts.pagerEvent, pagerFn);
+       }
+       
+       if ( ! /^click/.test(opts.pagerEvent) && !opts.allowPagerClickBubble)
+               $a.bind('click.cycle', function(){return false;}); // suppress click
+       
+       var cont = opts.$cont[0];
+       var pauseFlag = false; // https://github.com/malsup/cycle/issues/44
+       if (opts.pauseOnPagerHover) {
+               $a.hover(
+                       function() { 
+                               pauseFlag = true;
+                               cont.cyclePause++; 
+                               triggerPause(cont,true,true);
+                       }, function() { 
+                               pauseFlag && cont.cyclePause--; 
+                               triggerPause(cont,true,true);
+                       } 
+               );
+       }
+};
+
+// helper fn to calculate the number of slides between the current and the next
+$.fn.cycle.hopsFromLast = function(opts, fwd) {
+       var hops, l = opts.lastSlide, c = opts.currSlide;
+       if (fwd)
+               hops = c > l ? c - l : opts.slideCount - l;
+       else
+               hops = c < l ? l - c : l + opts.slideCount - c;
+       return hops;
+};
+
+// fix clearType problems in ie6 by setting an explicit bg color
+// (otherwise text slides look horrible during a fade transition)
+function clearTypeFix($slides) {
+       debug('applying clearType background-color hack');
+       function hex(s) {
+               s = parseInt(s,10).toString(16);
+               return s.length < 2 ? '0'+s : s;
+       };
+       function getBg(e) {
+               for ( ; e && e.nodeName.toLowerCase() != 'html'; e = e.parentNode) {
+                       var v = $.css(e,'background-color');
+                       if (v && v.indexOf('rgb') >= 0 ) {
+                               var rgb = v.match(/\d+/g);
+                               return '#'+ hex(rgb[0]) + hex(rgb[1]) + hex(rgb[2]);
+                       }
+                       if (v && v != 'transparent')
+                               return v;
+               }
+               return '#ffffff';
+       };
+       $slides.each(function() { $(this).css('background-color', getBg(this)); });
+};
+
+// reset common props before the next transition
+$.fn.cycle.commonReset = function(curr,next,opts,w,h,rev) {
+       $(opts.elements).not(curr).hide();
+       if (typeof opts.cssBefore.opacity == 'undefined')
+               opts.cssBefore.opacity = 1;
+       opts.cssBefore.display = 'block';
+       if (opts.slideResize && w !== false && next.cycleW > 0)
+               opts.cssBefore.width = next.cycleW;
+       if (opts.slideResize && h !== false && next.cycleH > 0)
+               opts.cssBefore.height = next.cycleH;
+       opts.cssAfter = opts.cssAfter || {};
+       opts.cssAfter.display = 'none';
+       $(curr).css('zIndex',opts.slideCount + (rev === true ? 1 : 0));
+       $(next).css('zIndex',opts.slideCount + (rev === true ? 0 : 1));
+};
+
+// the actual fn for effecting a transition
+$.fn.cycle.custom = function(curr, next, opts, cb, fwd, speedOverride) {
+       var $l = $(curr), $n = $(next);
+       var speedIn = opts.speedIn, speedOut = opts.speedOut, easeIn = opts.easeIn, easeOut = opts.easeOut;
+       $n.css(opts.cssBefore);
+       if (speedOverride) {
+               if (typeof speedOverride == 'number')
+                       speedIn = speedOut = speedOverride;
+               else
+                       speedIn = speedOut = 1;
+               easeIn = easeOut = null;
+       }
+       var fn = function() {
+               $n.animate(opts.animIn, speedIn, easeIn, function() {
+                       cb();
+               });
+       };
+       $l.animate(opts.animOut, speedOut, easeOut, function() {
+               $l.css(opts.cssAfter);
+               if (!opts.sync) 
+                       fn();
+       });
+       if (opts.sync) fn();
+};
+
+// transition definitions - only fade is defined here, transition pack defines the rest
+$.fn.cycle.transitions = {
+       fade: function($cont, $slides, opts) {
+               $slides.not(':eq('+opts.currSlide+')').css('opacity',0);
+               opts.before.push(function(curr,next,opts) {
+                       $.fn.cycle.commonReset(curr,next,opts);
+                       opts.cssBefore.opacity = 0;
+               });
+               opts.animIn        = { opacity: 1 };
+               opts.animOut   = { opacity: 0 };
+               opts.cssBefore = { top: 0, left: 0 };
+       }
+};
+
+$.fn.cycle.ver = function() { return ver; };
+
+// override these globally if you like (they are all optional)
+$.fn.cycle.defaults = {
+       activePagerClass: 'activeSlide', // class name used for the active pager link
+       after:             null,  // transition callback (scope set to element that was shown):  function(currSlideElement, nextSlideElement, options, forwardFlag)
+       allowPagerClickBubble: false, // allows or prevents click event on pager anchors from bubbling
+       animIn:            null,  // properties that define how the slide animates in
+       animOut:           null,  // properties that define how the slide animates out
+       aspect:            false,  // preserve aspect ratio during fit resizing, cropping if necessary (must be used with fit option)
+       autostop:          0,     // true to end slideshow after X transitions (where X == slide count)
+       autostopCount: 0,         // number of transitions (optionally used with autostop to define X)
+       backwards:     false, // true to start slideshow at last slide and move backwards through the stack
+       before:            null,  // transition callback (scope set to element to be shown):     function(currSlideElement, nextSlideElement, options, forwardFlag)
+       center:            null,  // set to true to have cycle add top/left margin to each slide (use with width and height options)
+       cleartype:         !$.support.opacity,  // true if clearType corrections should be applied (for IE)
+       cleartypeNoBg: false, // set to true to disable extra cleartype fixing (leave false to force background color setting on slides)
+       containerResize: 1,       // resize container to fit largest slide
+       continuous:        0,     // true to start next transition immediately after current one completes
+       cssAfter:          null,  // properties that defined the state of the slide after transitioning out
+       cssBefore:         null,  // properties that define the initial state of the slide before transitioning in
+       delay:             0,     // additional delay (in ms) for first transition (hint: can be negative)
+       easeIn:            null,  // easing for "in" transition
+       easeOut:           null,  // easing for "out" transition
+       easing:            null,  // easing method for both in and out transitions
+       end:               null,  // callback invoked when the slideshow terminates (use with autostop or nowrap options): function(options)
+       fastOnEvent:   0,         // force fast transitions when triggered manually (via pager or prev/next); value == time in ms
+       fit:               0,     // force slides to fit container
+       fx:                       'fade', // name of transition effect (or comma separated names, ex: 'fade,scrollUp,shuffle')
+       fxFn:              null,  // function used to control the transition: function(currSlideElement, nextSlideElement, options, afterCalback, forwardFlag)
+       height:           'auto', // container height (if the 'fit' option is true, the slides will be set to this height as well)
+       manualTrump:   true,  // causes manual transition to stop an active transition instead of being ignored
+       metaAttr:     'cycle',// data- attribute that holds the option data for the slideshow
+       next:              null,  // element, jQuery object, or jQuery selector string for the element to use as event trigger for next slide
+       nowrap:            0,     // true to prevent slideshow from wrapping
+       onPagerEvent:  null,  // callback fn for pager events: function(zeroBasedSlideIndex, slideElement)
+       onPrevNextEvent: null,// callback fn for prev/next events: function(isNext, zeroBasedSlideIndex, slideElement)
+       pager:             null,  // element, jQuery object, or jQuery selector string for the element to use as pager container
+       pagerAnchorBuilder: null, // callback fn for building anchor links:  function(index, DOMelement)
+       pagerEvent:       'click.cycle', // name of event which drives the pager navigation
+       pause:             0,     // true to enable "pause on hover"
+       pauseOnPagerHover: 0, // true to pause when hovering over pager link
+       prev:              null,  // element, jQuery object, or jQuery selector string for the element to use as event trigger for previous slide
+       prevNextEvent:'click.cycle',// event which drives the manual transition to the previous or next slide
+       random:            0,     // true for random, false for sequence (not applicable to shuffle fx)
+       randomizeEffects: 1,  // valid when multiple effects are used; true to make the effect sequence random
+       requeueOnImageNotLoaded: true, // requeue the slideshow if any image slides are not yet loaded
+       requeueTimeout: 250,  // ms delay for requeue
+       rev:               0,     // causes animations to transition in reverse (for effects that support it such as scrollHorz/scrollVert/shuffle)
+       shuffle:           null,  // coords for shuffle animation, ex: { top:15, left: 200 }
+       skipInitializationCallbacks: false, // set to true to disable the first before/after callback that occurs prior to any transition
+       slideExpr:         null,  // expression for selecting slides (if something other than all children is required)
+       slideResize:   1,     // force slide width/height to fixed size before every transition
+       speed:             1000,  // speed of the transition (any valid fx speed value)
+       speedIn:           null,  // speed of the 'in' transition
+       speedOut:          null,  // speed of the 'out' transition
+       startingSlide: undefined,         // zero-based index of the first slide to be displayed
+       sync:              1,     // true if in/out transitions should occur simultaneously
+       timeout:           4000,  // milliseconds between slide transitions (0 to disable auto advance)
+       timeoutFn:     null,  // callback for determining per-slide timeout value:  function(currSlideElement, nextSlideElement, options, forwardFlag)
+       updateActivePagerLink: null, // callback fn invoked to update the active pager link (adds/removes activePagerClass style)
+       width:         null   // container width (if the 'fit' option is true, the slides will be set to this width as well)
+};
+
+})(jQuery);
+
+
+/*!
+ * jQuery Cycle Plugin Transition Definitions
+ * This script is a plugin for the jQuery Cycle Plugin
+ * Examples and documentation at: http://malsup.com/jquery/cycle/
+ * Copyright (c) 2007-2010 M. Alsup
+ * Version:     2.73
+ * Dual licensed under the MIT and GPL licenses:
+ * http://www.opensource.org/licenses/mit-license.php
+ * http://www.gnu.org/licenses/gpl.html
+ */
+(function($) {
+
+//
+// These functions define slide initialization and properties for the named
+// transitions. To save file size feel free to remove any of these that you
+// don't need.
+//
+$.fn.cycle.transitions.none = function($cont, $slides, opts) {
+       opts.fxFn = function(curr,next,opts,after){
+               $(next).show();
+               $(curr).hide();
+               after();
+       };
+};
+
+// not a cross-fade, fadeout only fades out the top slide
+$.fn.cycle.transitions.fadeout = function($cont, $slides, opts) {
+       $slides.not(':eq('+opts.currSlide+')').css({ display: 'block', 'opacity': 1 });
+       opts.before.push(function(curr,next,opts,w,h,rev) {
+               $(curr).css('zIndex',opts.slideCount + (!rev === true ? 1 : 0));
+               $(next).css('zIndex',opts.slideCount + (!rev === true ? 0 : 1));
+       });
+       opts.animIn.opacity = 1;
+       opts.animOut.opacity = 0;
+       opts.cssBefore.opacity = 1;
+       opts.cssBefore.display = 'block';
+       opts.cssAfter.zIndex = 0;
+};
+
+// scrollUp/Down/Left/Right
+$.fn.cycle.transitions.scrollUp = function($cont, $slides, opts) {
+       $cont.css('overflow','hidden');
+       opts.before.push($.fn.cycle.commonReset);
+       var h = $cont.height();
+       opts.cssBefore.top = h;
+       opts.cssBefore.left = 0;
+       opts.cssFirst.top = 0;
+       opts.animIn.top = 0;
+       opts.animOut.top = -h;
+};
+$.fn.cycle.transitions.scrollDown = function($cont, $slides, opts) {
+       $cont.css('overflow','hidden');
+       opts.before.push($.fn.cycle.commonReset);
+       var h = $cont.height();
+       opts.cssFirst.top = 0;
+       opts.cssBefore.top = -h;
+       opts.cssBefore.left = 0;
+       opts.animIn.top = 0;
+       opts.animOut.top = h;
+};
+$.fn.cycle.transitions.scrollLeft = function($cont, $slides, opts) {
+       $cont.css('overflow','hidden');
+       opts.before.push($.fn.cycle.commonReset);
+       var w = $cont.width();
+       opts.cssFirst.left = 0;
+       opts.cssBefore.left = w;
+       opts.cssBefore.top = 0;
+       opts.animIn.left = 0;
+       opts.animOut.left = 0-w;
+};
+$.fn.cycle.transitions.scrollRight = function($cont, $slides, opts) {
+       $cont.css('overflow','hidden');
+       opts.before.push($.fn.cycle.commonReset);
+       var w = $cont.width();
+       opts.cssFirst.left = 0;
+       opts.cssBefore.left = -w;
+       opts.cssBefore.top = 0;
+       opts.animIn.left = 0;
+       opts.animOut.left = w;
+};
+$.fn.cycle.transitions.scrollHorz = function($cont, $slides, opts) {
+       $cont.css('overflow','hidden').width();
+       opts.before.push(function(curr, next, opts, fwd) {
+               if (opts.rev)
+                       fwd = !fwd;
+               $.fn.cycle.commonReset(curr,next,opts);
+               opts.cssBefore.left = fwd ? (next.cycleW-1) : (1-next.cycleW);
+               opts.animOut.left = fwd ? -curr.cycleW : curr.cycleW;
+       });
+       opts.cssFirst.left = 0;
+       opts.cssBefore.top = 0;
+       opts.animIn.left = 0;
+       opts.animOut.top = 0;
+};
+$.fn.cycle.transitions.scrollVert = function($cont, $slides, opts) {
+       $cont.css('overflow','hidden');
+       opts.before.push(function(curr, next, opts, fwd) {
+               if (opts.rev)
+                       fwd = !fwd;
+               $.fn.cycle.commonReset(curr,next,opts);
+               opts.cssBefore.top = fwd ? (1-next.cycleH) : (next.cycleH-1);
+               opts.animOut.top = fwd ? curr.cycleH : -curr.cycleH;
+       });
+       opts.cssFirst.top = 0;
+       opts.cssBefore.left = 0;
+       opts.animIn.top = 0;
+       opts.animOut.left = 0;
+};
+
+// slideX/slideY
+$.fn.cycle.transitions.slideX = function($cont, $slides, opts) {
+       opts.before.push(function(curr, next, opts) {
+               $(opts.elements).not(curr).hide();
+               $.fn.cycle.commonReset(curr,next,opts,false,true);
+               opts.animIn.width = next.cycleW;
+       });
+       opts.cssBefore.left = 0;
+       opts.cssBefore.top = 0;
+       opts.cssBefore.width = 0;
+       opts.animIn.width = 'show';
+       opts.animOut.width = 0;
+};
+$.fn.cycle.transitions.slideY = function($cont, $slides, opts) {
+       opts.before.push(function(curr, next, opts) {
+               $(opts.elements).not(curr).hide();
+               $.fn.cycle.commonReset(curr,next,opts,true,false);
+               opts.animIn.height = next.cycleH;
+       });
+       opts.cssBefore.left = 0;
+       opts.cssBefore.top = 0;
+       opts.cssBefore.height = 0;
+       opts.animIn.height = 'show';
+       opts.animOut.height = 0;
+};
+
+// shuffle
+$.fn.cycle.transitions.shuffle = function($cont, $slides, opts) {
+       var i, w = $cont.css('overflow', 'visible').width();
+       $slides.css({left: 0, top: 0});
+       opts.before.push(function(curr,next,opts) {
+               $.fn.cycle.commonReset(curr,next,opts,true,true,true);
+       });
+       // only adjust speed once!
+       if (!opts.speedAdjusted) {
+               opts.speed = opts.speed / 2; // shuffle has 2 transitions
+               opts.speedAdjusted = true;
+       }
+       opts.random = 0;
+       opts.shuffle = opts.shuffle || {left:-w, top:15};
+       opts.els = [];
+       for (i=0; i < $slides.length; i++)
+               opts.els.push($slides[i]);
+
+       for (i=0; i < opts.currSlide; i++)
+               opts.els.push(opts.els.shift());
+
+       // custom transition fn (hat tip to Benjamin Sterling for this bit of sweetness!)
+       opts.fxFn = function(curr, next, opts, cb, fwd) {
+               if (opts.rev)
+                       fwd = !fwd;
+               var $el = fwd ? $(curr) : $(next);
+               $(next).css(opts.cssBefore);
+               var count = opts.slideCount;
+               $el.animate(opts.shuffle, opts.speedIn, opts.easeIn, function() {
+                       var hops = $.fn.cycle.hopsFromLast(opts, fwd);
+                       for (var k=0; k < hops; k++)
+                               fwd ? opts.els.push(opts.els.shift()) : opts.els.unshift(opts.els.pop());
+                       if (fwd) {
+                               for (var i=0, len=opts.els.length; i < len; i++)
+                                       $(opts.els[i]).css('z-index', len-i+count);
+                       }
+                       else {
+                               var z = $(curr).css('z-index');
+                               $el.css('z-index', parseInt(z,10)+1+count);
+                       }
+                       $el.animate({left:0, top:0}, opts.speedOut, opts.easeOut, function() {
+                               $(fwd ? this : curr).hide();
+                               if (cb) cb();
+                       });
+               });
+       };
+       $.extend(opts.cssBefore, { display: 'block', opacity: 1, top: 0, left: 0 });
+};
+
+// turnUp/Down/Left/Right
+$.fn.cycle.transitions.turnUp = function($cont, $slides, opts) {
+       opts.before.push(function(curr, next, opts) {
+               $.fn.cycle.commonReset(curr,next,opts,true,false);
+               opts.cssBefore.top = next.cycleH;
+               opts.animIn.height = next.cycleH;
+               opts.animOut.width = next.cycleW;
+       });
+       opts.cssFirst.top = 0;
+       opts.cssBefore.left = 0;
+       opts.cssBefore.height = 0;
+       opts.animIn.top = 0;
+       opts.animOut.height = 0;
+};
+$.fn.cycle.transitions.turnDown = function($cont, $slides, opts) {
+       opts.before.push(function(curr, next, opts) {
+               $.fn.cycle.commonReset(curr,next,opts,true,false);
+               opts.animIn.height = next.cycleH;
+               opts.animOut.top   = curr.cycleH;
+       });
+       opts.cssFirst.top = 0;
+       opts.cssBefore.left = 0;
+       opts.cssBefore.top = 0;
+       opts.cssBefore.height = 0;
+       opts.animOut.height = 0;
+};
+$.fn.cycle.transitions.turnLeft = function($cont, $slides, opts) {
+       opts.before.push(function(curr, next, opts) {
+               $.fn.cycle.commonReset(curr,next,opts,false,true);
+               opts.cssBefore.left = next.cycleW;
+               opts.animIn.width = next.cycleW;
+       });
+       opts.cssBefore.top = 0;
+       opts.cssBefore.width = 0;
+       opts.animIn.left = 0;
+       opts.animOut.width = 0;
+};
+$.fn.cycle.transitions.turnRight = function($cont, $slides, opts) {
+       opts.before.push(function(curr, next, opts) {
+               $.fn.cycle.commonReset(curr,next,opts,false,true);
+               opts.animIn.width = next.cycleW;
+               opts.animOut.left = curr.cycleW;
+       });
+       $.extend(opts.cssBefore, { top: 0, left: 0, width: 0 });
+       opts.animIn.left = 0;
+       opts.animOut.width = 0;
+};
+
+// zoom
+$.fn.cycle.transitions.zoom = function($cont, $slides, opts) {
+       opts.before.push(function(curr, next, opts) {
+               $.fn.cycle.commonReset(curr,next,opts,false,false,true);
+               opts.cssBefore.top = next.cycleH/2;
+               opts.cssBefore.left = next.cycleW/2;
+               $.extend(opts.animIn, { top: 0, left: 0, width: next.cycleW, height: next.cycleH });
+               $.extend(opts.animOut, { width: 0, height: 0, top: curr.cycleH/2, left: curr.cycleW/2 });
+       });
+       opts.cssFirst.top = 0;
+       opts.cssFirst.left = 0;
+       opts.cssBefore.width = 0;
+       opts.cssBefore.height = 0;
+};
+
+// fadeZoom
+$.fn.cycle.transitions.fadeZoom = function($cont, $slides, opts) {
+       opts.before.push(function(curr, next, opts) {
+               $.fn.cycle.commonReset(curr,next,opts,false,false);
+               opts.cssBefore.left = next.cycleW/2;
+               opts.cssBefore.top = next.cycleH/2;
+               $.extend(opts.animIn, { top: 0, left: 0, width: next.cycleW, height: next.cycleH });
+       });
+       opts.cssBefore.width = 0;
+       opts.cssBefore.height = 0;
+       opts.animOut.opacity = 0;
+};
+
+// blindX
+$.fn.cycle.transitions.blindX = function($cont, $slides, opts) {
+       var w = $cont.css('overflow','hidden').width();
+       opts.before.push(function(curr, next, opts) {
+               $.fn.cycle.commonReset(curr,next,opts);
+               opts.animIn.width = next.cycleW;
+               opts.animOut.left   = curr.cycleW;
+       });
+       opts.cssBefore.left = w;
+       opts.cssBefore.top = 0;
+       opts.animIn.left = 0;
+       opts.animOut.left = w;
+};
+// blindY
+$.fn.cycle.transitions.blindY = function($cont, $slides, opts) {
+       var h = $cont.css('overflow','hidden').height();
+       opts.before.push(function(curr, next, opts) {
+               $.fn.cycle.commonReset(curr,next,opts);
+               opts.animIn.height = next.cycleH;
+               opts.animOut.top   = curr.cycleH;
+       });
+       opts.cssBefore.top = h;
+       opts.cssBefore.left = 0;
+       opts.animIn.top = 0;
+       opts.animOut.top = h;
+};
+// blindZ
+$.fn.cycle.transitions.blindZ = function($cont, $slides, opts) {
+       var h = $cont.css('overflow','hidden').height();
+       var w = $cont.width();
+       opts.before.push(function(curr, next, opts) {
+               $.fn.cycle.commonReset(curr,next,opts);
+               opts.animIn.height = next.cycleH;
+               opts.animOut.top   = curr.cycleH;
+       });
+       opts.cssBefore.top = h;
+       opts.cssBefore.left = w;
+       opts.animIn.top = 0;
+       opts.animIn.left = 0;
+       opts.animOut.top = h;
+       opts.animOut.left = w;
+};
+
+// growX - grow horizontally from centered 0 width
+$.fn.cycle.transitions.growX = function($cont, $slides, opts) {
+       opts.before.push(function(curr, next, opts) {
+               $.fn.cycle.commonReset(curr,next,opts,false,true);
+               opts.cssBefore.left = this.cycleW/2;
+               opts.animIn.left = 0;
+               opts.animIn.width = this.cycleW;
+               opts.animOut.left = 0;
+       });
+       opts.cssBefore.top = 0;
+       opts.cssBefore.width = 0;
+};
+// growY - grow vertically from centered 0 height
+$.fn.cycle.transitions.growY = function($cont, $slides, opts) {
+       opts.before.push(function(curr, next, opts) {
+               $.fn.cycle.commonReset(curr,next,opts,true,false);
+               opts.cssBefore.top = this.cycleH/2;
+               opts.animIn.top = 0;
+               opts.animIn.height = this.cycleH;
+               opts.animOut.top = 0;
+       });
+       opts.cssBefore.height = 0;
+       opts.cssBefore.left = 0;
+};
+
+// curtainX - squeeze in both edges horizontally
+$.fn.cycle.transitions.curtainX = function($cont, $slides, opts) {
+       opts.before.push(function(curr, next, opts) {
+               $.fn.cycle.commonReset(curr,next,opts,false,true,true);
+               opts.cssBefore.left = next.cycleW/2;
+               opts.animIn.left = 0;
+               opts.animIn.width = this.cycleW;
+               opts.animOut.left = curr.cycleW/2;
+               opts.animOut.width = 0;
+       });
+       opts.cssBefore.top = 0;
+       opts.cssBefore.width = 0;
+};
+// curtainY - squeeze in both edges vertically
+$.fn.cycle.transitions.curtainY = function($cont, $slides, opts) {
+       opts.before.push(function(curr, next, opts) {
+               $.fn.cycle.commonReset(curr,next,opts,true,false,true);
+               opts.cssBefore.top = next.cycleH/2;
+               opts.animIn.top = 0;
+               opts.animIn.height = next.cycleH;
+               opts.animOut.top = curr.cycleH/2;
+               opts.animOut.height = 0;
+       });
+       opts.cssBefore.height = 0;
+       opts.cssBefore.left = 0;
+};
+
+// cover - curr slide covered by next slide
+$.fn.cycle.transitions.cover = function($cont, $slides, opts) {
+       var d = opts.direction || 'left';
+       var w = $cont.css('overflow','hidden').width();
+       var h = $cont.height();
+       opts.before.push(function(curr, next, opts) {
+               $.fn.cycle.commonReset(curr,next,opts);
+               if (d == 'right')
+                       opts.cssBefore.left = -w;
+               else if (d == 'up')
+                       opts.cssBefore.top = h;
+               else if (d == 'down')
+                       opts.cssBefore.top = -h;
+               else
+                       opts.cssBefore.left = w;
+       });
+       opts.animIn.left = 0;
+       opts.animIn.top = 0;
+       opts.cssBefore.top = 0;
+       opts.cssBefore.left = 0;
+};
+
+// uncover - curr slide moves off next slide
+$.fn.cycle.transitions.uncover = function($cont, $slides, opts) {
+       var d = opts.direction || 'left';
+       var w = $cont.css('overflow','hidden').width();
+       var h = $cont.height();
+       opts.before.push(function(curr, next, opts) {
+               $.fn.cycle.commonReset(curr,next,opts,true,true,true);
+               if (d == 'right')
+                       opts.animOut.left = w;
+               else if (d == 'up')
+                       opts.animOut.top = -h;
+               else if (d == 'down')
+                       opts.animOut.top = h;
+               else
+                       opts.animOut.left = -w;
+       });
+       opts.animIn.left = 0;
+       opts.animIn.top = 0;
+       opts.cssBefore.top = 0;
+       opts.cssBefore.left = 0;
+};
+
+// toss - move top slide and fade away
+$.fn.cycle.transitions.toss = function($cont, $slides, opts) {
+       var w = $cont.css('overflow','visible').width();
+       var h = $cont.height();
+       opts.before.push(function(curr, next, opts) {
+               $.fn.cycle.commonReset(curr,next,opts,true,true,true);
+               // provide default toss settings if animOut not provided
+               if (!opts.animOut.left && !opts.animOut.top)
+                       $.extend(opts.animOut, { left: w*2, top: -h/2, opacity: 0 });
+               else
+                       opts.animOut.opacity = 0;
+       });
+       opts.cssBefore.left = 0;
+       opts.cssBefore.top = 0;
+       opts.animIn.left = 0;
+};
+
+// wipe - clip animation
+$.fn.cycle.transitions.wipe = function($cont, $slides, opts) {
+       var w = $cont.css('overflow','hidden').width();
+       var h = $cont.height();
+       opts.cssBefore = opts.cssBefore || {};
+       var clip;
+       if (opts.clip) {
+               if (/l2r/.test(opts.clip))
+                       clip = 'rect(0px 0px '+h+'px 0px)';
+               else if (/r2l/.test(opts.clip))
+                       clip = 'rect(0px '+w+'px '+h+'px '+w+'px)';
+               else if (/t2b/.test(opts.clip))
+                       clip = 'rect(0px '+w+'px 0px 0px)';
+               else if (/b2t/.test(opts.clip))
+                       clip = 'rect('+h+'px '+w+'px '+h+'px 0px)';
+               else if (/zoom/.test(opts.clip)) {
+                       var top = parseInt(h/2,10);
+                       var left = parseInt(w/2,10);
+                       clip = 'rect('+top+'px '+left+'px '+top+'px '+left+'px)';
+               }
+       }
+
+       opts.cssBefore.clip = opts.cssBefore.clip || clip || 'rect(0px 0px 0px 0px)';
+
+       var d = opts.cssBefore.clip.match(/(\d+)/g);
+       var t = parseInt(d[0],10), r = parseInt(d[1],10), b = parseInt(d[2],10), l = parseInt(d[3],10);
+
+       opts.before.push(function(curr, next, opts) {
+               if (curr == next) return;
+               var $curr = $(curr), $next = $(next);
+               $.fn.cycle.commonReset(curr,next,opts,true,true,false);
+               opts.cssAfter.display = 'block';
+
+               var step = 1, count = parseInt((opts.speedIn / 13),10) - 1;
+               (function f() {
+                       var tt = t ? t - parseInt(step * (t/count),10) : 0;
+                       var ll = l ? l - parseInt(step * (l/count),10) : 0;
+                       var bb = b < h ? b + parseInt(step * ((h-b)/count || 1),10) : h;
+                       var rr = r < w ? r + parseInt(step * ((w-r)/count || 1),10) : w;
+                       $next.css({ clip: 'rect('+tt+'px '+rr+'px '+bb+'px '+ll+'px)' });
+                       (step++ <= count) ? setTimeout(f, 13) : $curr.css('display', 'none');
+               })();
+       });
+       $.extend(opts.cssBefore, { display: 'block', opacity: 1, top: 0, left: 0 });
+       opts.animIn        = { left: 0 };
+       opts.animOut   = { left: 0 };
+};
+
+})(jQuery);
diff --git a/resources/lib/jquery/jquery.form.js b/resources/lib/jquery/jquery.form.js
new file mode 100644 (file)
index 0000000..13e9a55
--- /dev/null
@@ -0,0 +1,1089 @@
+/*!
+ * jQuery Form Plugin
+ * version: 3.14 (30-JUL-2012)
+ * @requires jQuery v1.3.2 or later
+ *
+ * Examples and documentation at: http://malsup.com/jquery/form/
+ * Project repository: https://github.com/malsup/form
+ * Dual licensed under the MIT and GPL licenses:
+ *    http://malsup.github.com/mit-license.txt
+ *    http://malsup.github.com/gpl-license-v2.txt
+ */
+/*global ActiveXObject alert */
+;(function($) {
+"use strict";
+
+/*
+    Usage Note:
+    -----------
+    Do not use both ajaxSubmit and ajaxForm on the same form.  These
+    functions are mutually exclusive.  Use ajaxSubmit if you want
+    to bind your own submit handler to the form.  For example,
+
+    $(document).ready(function() {
+        $('#myForm').on('submit', function(e) {
+            e.preventDefault(); // <-- important
+            $(this).ajaxSubmit({
+                target: '#output'
+            });
+        });
+    });
+
+    Use ajaxForm when you want the plugin to manage all the event binding
+    for you.  For example,
+
+    $(document).ready(function() {
+        $('#myForm').ajaxForm({
+            target: '#output'
+        });
+    });
+    
+    You can also use ajaxForm with delegation (requires jQuery v1.7+), so the
+    form does not have to exist when you invoke ajaxForm:
+
+    $('#myForm').ajaxForm({
+        delegation: true,
+        target: '#output'
+    });
+    
+    When using ajaxForm, the ajaxSubmit function will be invoked for you
+    at the appropriate time.
+*/
+
+/**
+ * Feature detection
+ */
+var feature = {};
+feature.fileapi = $("<input type='file'/>").get(0).files !== undefined;
+feature.formdata = window.FormData !== undefined;
+
+/**
+ * ajaxSubmit() provides a mechanism for immediately submitting
+ * an HTML form using AJAX.
+ */
+$.fn.ajaxSubmit = function(options) {
+    /*jshint scripturl:true */
+
+    // fast fail if nothing selected (http://dev.jquery.com/ticket/2752)
+    if (!this.length) {
+        log('ajaxSubmit: skipping submit process - no element selected');
+        return this;
+    }
+    
+    var method, action, url, $form = this;
+
+    if (typeof options == 'function') {
+        options = { success: options };
+    }
+
+    method = this.attr('method');
+    action = this.attr('action');
+    url = (typeof action === 'string') ? $.trim(action) : '';
+    url = url || window.location.href || '';
+    if (url) {
+        // clean url (don't include hash vaue)
+        url = (url.match(/^([^#]+)/)||[])[1];
+    }
+
+    options = $.extend(true, {
+        url:  url,
+        success: $.ajaxSettings.success,
+        type: method || 'GET',
+        iframeSrc: /^https/i.test(window.location.href || '') ? 'javascript:false' : 'about:blank'
+    }, options);
+
+    // hook for manipulating the form data before it is extracted;
+    // convenient for use with rich editors like tinyMCE or FCKEditor
+    var veto = {};
+    this.trigger('form-pre-serialize', [this, options, veto]);
+    if (veto.veto) {
+        log('ajaxSubmit: submit vetoed via form-pre-serialize trigger');
+        return this;
+    }
+
+    // provide opportunity to alter form data before it is serialized
+    if (options.beforeSerialize && options.beforeSerialize(this, options) === false) {
+        log('ajaxSubmit: submit aborted via beforeSerialize callback');
+        return this;
+    }
+
+    var traditional = options.traditional;
+    if ( traditional === undefined ) {
+        traditional = $.ajaxSettings.traditional;
+    }
+    
+    var elements = [];
+    var qx, a = this.formToArray(options.semantic, elements);
+    if (options.data) {
+        options.extraData = options.data;
+        qx = $.param(options.data, traditional);
+    }
+
+    // give pre-submit callback an opportunity to abort the submit
+    if (options.beforeSubmit && options.beforeSubmit(a, this, options) === false) {
+        log('ajaxSubmit: submit aborted via beforeSubmit callback');
+        return this;
+    }
+
+    // fire vetoable 'validate' event
+    this.trigger('form-submit-validate', [a, this, options, veto]);
+    if (veto.veto) {
+        log('ajaxSubmit: submit vetoed via form-submit-validate trigger');
+        return this;
+    }
+
+    var q = $.param(a, traditional);
+    if (qx) {
+        q = ( q ? (q + '&' + qx) : qx );
+    }    
+    if (options.type.toUpperCase() == 'GET') {
+        options.url += (options.url.indexOf('?') >= 0 ? '&' : '?') + q;
+        options.data = null;  // data is null for 'get'
+    }
+    else {
+        options.data = q; // data is the query string for 'post'
+    }
+
+    var callbacks = [];
+    if (options.resetForm) {
+        callbacks.push(function() { $form.resetForm(); });
+    }
+    if (options.clearForm) {
+        callbacks.push(function() { $form.clearForm(options.includeHidden); });
+    }
+
+    // perform a load on the target only if dataType is not provided
+    if (!options.dataType && options.target) {
+        var oldSuccess = options.success || function(){};
+        callbacks.push(function(data) {
+            var fn = options.replaceTarget ? 'replaceWith' : 'html';
+            $(options.target)[fn](data).each(oldSuccess, arguments);
+        });
+    }
+    else if (options.success) {
+        callbacks.push(options.success);
+    }
+
+    options.success = function(data, status, xhr) { // jQuery 1.4+ passes xhr as 3rd arg
+        var context = options.context || this ;    // jQuery 1.4+ supports scope context 
+        for (var i=0, max=callbacks.length; i < max; i++) {
+            callbacks[i].apply(context, [data, status, xhr || $form, $form]);
+        }
+    };
+
+    // are there files to upload?
+    var fileInputs = $('input:file:enabled[value]', this); // [value] (issue #113)
+    var hasFileInputs = fileInputs.length > 0;
+    var mp = 'multipart/form-data';
+    var multipart = ($form.attr('enctype') == mp || $form.attr('encoding') == mp);
+
+    var fileAPI = feature.fileapi && feature.formdata;
+    log("fileAPI :" + fileAPI);
+    var shouldUseFrame = (hasFileInputs || multipart) && !fileAPI;
+
+    // options.iframe allows user to force iframe mode
+    // 06-NOV-09: now defaulting to iframe mode if file input is detected
+    if (options.iframe !== false && (options.iframe || shouldUseFrame)) {
+        // hack to fix Safari hang (thanks to Tim Molendijk for this)
+        // see:  http://groups.google.com/group/jquery-dev/browse_thread/thread/36395b7ab510dd5d
+        if (options.closeKeepAlive) {
+            $.get(options.closeKeepAlive, function() {
+                fileUploadIframe(a);
+            });
+        }
+          else {
+            fileUploadIframe(a);
+          }
+    }
+    else if ((hasFileInputs || multipart) && fileAPI) {
+        fileUploadXhr(a);
+    }
+    else {
+        $.ajax(options);
+    }
+
+    // clear element array
+    for (var k=0; k < elements.length; k++)
+        elements[k] = null;
+
+    // fire 'notify' event
+    this.trigger('form-submit-notify', [this, options]);
+    return this;
+
+     // XMLHttpRequest Level 2 file uploads (big hat tip to francois2metz)
+    function fileUploadXhr(a) {
+        var formdata = new FormData();
+
+        for (var i=0; i < a.length; i++) {
+            formdata.append(a[i].name, a[i].value);
+        }
+
+        if (options.extraData) {
+            for (var p in options.extraData)
+                if (options.extraData.hasOwnProperty(p))
+                    formdata.append(p, options.extraData[p]);
+        }
+
+        options.data = null;
+
+        var s = $.extend(true, {}, $.ajaxSettings, options, {
+            contentType: false,
+            processData: false,
+            cache: false,
+            type: 'POST'
+        });
+        
+        if (options.uploadProgress) {
+            // workaround because jqXHR does not expose upload property
+            s.xhr = function() {
+                var xhr = jQuery.ajaxSettings.xhr();
+                if (xhr.upload) {
+                    xhr.upload.onprogress = function(event) {
+                        var percent = 0;
+                        var position = event.loaded || event.position; /*event.position is deprecated*/
+                        var total = event.total;
+                        if (event.lengthComputable) {
+                            percent = Math.ceil(position / total * 100);
+                        }
+                        options.uploadProgress(event, position, total, percent);
+                    };
+                }
+                return xhr;
+            };
+        }
+
+        s.data = null;
+            var beforeSend = s.beforeSend;
+            s.beforeSend = function(xhr, o) {
+                o.data = formdata;
+                if(beforeSend)
+                    beforeSend.call(this, xhr, o);
+        };
+        $.ajax(s);
+    }
+
+    // private function for handling file uploads (hat tip to YAHOO!)
+    function fileUploadIframe(a) {
+        var form = $form[0], el, i, s, g, id, $io, io, xhr, sub, n, timedOut, timeoutHandle;
+        var useProp = !!$.fn.prop;
+
+        if ($(':input[name=submit],:input[id=submit]', form).length) {
+            // if there is an input with a name or id of 'submit' then we won't be
+            // able to invoke the submit fn on the form (at least not x-browser)
+            alert('Error: Form elements must not have name or id of "submit".');
+            return;
+        }
+        
+        if (a) {
+            // ensure that every serialized input is still enabled
+            for (i=0; i < elements.length; i++) {
+                el = $(elements[i]);
+                if ( useProp )
+                    el.prop('disabled', false);
+                else
+                    el.removeAttr('disabled');
+            }
+        }
+
+        s = $.extend(true, {}, $.ajaxSettings, options);
+        s.context = s.context || s;
+        id = 'jqFormIO' + (new Date().getTime());
+        if (s.iframeTarget) {
+            $io = $(s.iframeTarget);
+            n = $io.attr('name');
+            if (!n)
+                 $io.attr('name', id);
+            else
+                id = n;
+        }
+        else {
+            $io = $('<iframe name="' + id + '" src="'+ s.iframeSrc +'" />');
+            $io.css({ position: 'absolute', top: '-1000px', left: '-1000px' });
+        }
+        io = $io[0];
+
+
+        xhr = { // mock object
+            aborted: 0,
+            responseText: null,
+            responseXML: null,
+            status: 0,
+            statusText: 'n/a',
+            getAllResponseHeaders: function() {},
+            getResponseHeader: function() {},
+            setRequestHeader: function() {},
+            abort: function(status) {
+                var e = (status === 'timeout' ? 'timeout' : 'aborted');
+                log('aborting upload... ' + e);
+                this.aborted = 1;
+                // #214
+                if (io.contentWindow.document.execCommand) {
+                    try { // #214
+                        io.contentWindow.document.execCommand('Stop');
+                    } catch(ignore) {}
+                }
+                $io.attr('src', s.iframeSrc); // abort op in progress
+                xhr.error = e;
+                if (s.error)
+                    s.error.call(s.context, xhr, e, status);
+                if (g)
+                    $.event.trigger("ajaxError", [xhr, s, e]);
+                if (s.complete)
+                    s.complete.call(s.context, xhr, e);
+            }
+        };
+
+        g = s.global;
+        // trigger ajax global events so that activity/block indicators work like normal
+        if (g && 0 === $.active++) {
+            $.event.trigger("ajaxStart");
+        }
+        if (g) {
+            $.event.trigger("ajaxSend", [xhr, s]);
+        }
+
+        if (s.beforeSend && s.beforeSend.call(s.context, xhr, s) === false) {
+            if (s.global) {
+                $.active--;
+            }
+            return;
+        }
+        if (xhr.aborted) {
+            return;
+        }
+
+        // add submitting element to data if we know it
+        sub = form.clk;
+        if (sub) {
+            n = sub.name;
+            if (n && !sub.disabled) {
+                s.extraData = s.extraData || {};
+                s.extraData[n] = sub.value;
+                if (sub.type == "image") {
+                    s.extraData[n+'.x'] = form.clk_x;
+                    s.extraData[n+'.y'] = form.clk_y;
+                }
+            }
+        }
+        
+        var CLIENT_TIMEOUT_ABORT = 1;
+        var SERVER_ABORT = 2;
+
+        function getDoc(frame) {
+            var doc = frame.contentWindow ? frame.contentWindow.document : frame.contentDocument ? frame.contentDocument : frame.document;
+            return doc;
+        }
+        
+        // Rails CSRF hack (thanks to Yvan Barthelemy)
+        var csrf_token = $('meta[name=csrf-token]').attr('content');
+        var csrf_param = $('meta[name=csrf-param]').attr('content');
+        if (csrf_param && csrf_token) {
+            s.extraData = s.extraData || {};
+            s.extraData[csrf_param] = csrf_token;
+        }
+
+        // take a breath so that pending repaints get some cpu time before the upload starts
+        function doSubmit() {
+            // make sure form attrs are set
+            var t = $form.attr('target'), a = $form.attr('action');
+
+            // update form attrs in IE friendly way
+            form.setAttribute('target',id);
+            if (!method) {
+                form.setAttribute('method', 'POST');
+            }
+            if (a != s.url) {
+                form.setAttribute('action', s.url);
+            }
+
+            // ie borks in some cases when setting encoding
+            if (! s.skipEncodingOverride && (!method || /post/i.test(method))) {
+                $form.attr({
+                    encoding: 'multipart/form-data',
+                    enctype:  'multipart/form-data'
+                });
+            }
+
+            // support timout
+            if (s.timeout) {
+                timeoutHandle = setTimeout(function() { timedOut = true; cb(CLIENT_TIMEOUT_ABORT); }, s.timeout);
+            }
+            
+            // look for server aborts
+            function checkState() {
+                try {
+                    var state = getDoc(io).readyState;
+                    log('state = ' + state);
+                    if (state && state.toLowerCase() == 'uninitialized')
+                        setTimeout(checkState,50);
+                }
+                catch(e) {
+                    log('Server abort: ' , e, ' (', e.name, ')');
+                    cb(SERVER_ABORT);
+                    if (timeoutHandle)
+                        clearTimeout(timeoutHandle);
+                    timeoutHandle = undefined;
+                }
+            }
+
+            // add "extra" data to form if provided in options
+            var extraInputs = [];
+            try {
+                if (s.extraData) {
+                    for (var n in s.extraData) {
+                        if (s.extraData.hasOwnProperty(n)) {
+                           // if using the $.param format that allows for multiple values with the same name
+                           if($.isPlainObject(s.extraData[n]) && s.extraData[n].hasOwnProperty('name') && s.extraData[n].hasOwnProperty('value')) {
+                               extraInputs.push(
+                               $('<input type="hidden" name="'+s.extraData[n].name+'">').attr('value',s.extraData[n].value)
+                                   .appendTo(form)[0]);
+                           } else {
+                               extraInputs.push(
+                               $('<input type="hidden" name="'+n+'">').attr('value',s.extraData[n])
+                                   .appendTo(form)[0]);
+                           }
+                        }
+                    }
+                }
+
+                if (!s.iframeTarget) {
+                    // add iframe to doc and submit the form
+                    $io.appendTo('body');
+                    if (io.attachEvent)
+                        io.attachEvent('onload', cb);
+                    else
+                        io.addEventListener('load', cb, false);
+                }
+                setTimeout(checkState,15);
+                form.submit();
+            }
+            finally {
+                // reset attrs and remove "extra" input elements
+                form.setAttribute('action',a);
+                if(t) {
+                    form.setAttribute('target', t);
+                } else {
+                    $form.removeAttr('target');
+                }
+                $(extraInputs).remove();
+            }
+        }
+
+        if (s.forceSync) {
+            doSubmit();
+        }
+        else {
+            setTimeout(doSubmit, 10); // this lets dom updates render
+        }
+
+        var data, doc, domCheckCount = 50, callbackProcessed;
+
+        function cb(e) {
+            if (xhr.aborted || callbackProcessed) {
+                return;
+            }
+            try {
+                doc = getDoc(io);
+            }
+            catch(ex) {
+                log('cannot access response document: ', ex);
+                e = SERVER_ABORT;
+            }
+            if (e === CLIENT_TIMEOUT_ABORT && xhr) {
+                xhr.abort('timeout');
+                return;
+            }
+            else if (e == SERVER_ABORT && xhr) {
+                xhr.abort('server abort');
+                return;
+            }
+
+            if (!doc || doc.location.href == s.iframeSrc) {
+                // response not received yet
+                if (!timedOut)
+                    return;
+            }
+            if (io.detachEvent)
+                io.detachEvent('onload', cb);
+            else    
+                io.removeEventListener('load', cb, false);
+
+            var status = 'success', errMsg;
+            try {
+                if (timedOut) {
+                    throw 'timeout';
+                }
+
+                var isXml = s.dataType == 'xml' || doc.XMLDocument || $.isXMLDoc(doc);
+                log('isXml='+isXml);
+                if (!isXml && window.opera && (doc.body === null || !doc.body.innerHTML)) {
+                    if (--domCheckCount) {
+                        // in some browsers (Opera) the iframe DOM is not always traversable when
+                        // the onload callback fires, so we loop a bit to accommodate
+                        log('requeing onLoad callback, DOM not available');
+                        setTimeout(cb, 250);
+                        return;
+                    }
+                    // let this fall through because server response could be an empty document
+                    //log('Could not access iframe DOM after mutiple tries.');
+                    //throw 'DOMException: not available';
+                }
+
+                //log('response detected');
+                var docRoot = doc.body ? doc.body : doc.documentElement;
+                xhr.responseText = docRoot ? docRoot.innerHTML : null;
+                xhr.responseXML = doc.XMLDocument ? doc.XMLDocument : doc;
+                if (isXml)
+                    s.dataType = 'xml';
+                xhr.getResponseHeader = function(header){
+                    var headers = {'content-type': s.dataType};
+                    return headers[header];
+                };
+                // support for XHR 'status' & 'statusText' emulation :
+                if (docRoot) {
+                    xhr.status = Number( docRoot.getAttribute('status') ) || xhr.status;
+                    xhr.statusText = docRoot.getAttribute('statusText') || xhr.statusText;
+                }
+
+                var dt = (s.dataType || '').toLowerCase();
+                var scr = /(json|script|text)/.test(dt);
+                if (scr || s.textarea) {
+                    // see if user embedded response in textarea
+                    var ta = doc.getElementsByTagName('textarea')[0];
+                    if (ta) {
+                        xhr.responseText = ta.value;
+                        // support for XHR 'status' & 'statusText' emulation :
+                        xhr.status = Number( ta.getAttribute('status') ) || xhr.status;
+                        xhr.statusText = ta.getAttribute('statusText') || xhr.statusText;
+                    }
+                    else if (scr) {
+                        // account for browsers injecting pre around json response
+                        var pre = doc.getElementsByTagName('pre')[0];
+                        var b = doc.getElementsByTagName('body')[0];
+                        if (pre) {
+                            xhr.responseText = pre.textContent ? pre.textContent : pre.innerText;
+                        }
+                        else if (b) {
+                            xhr.responseText = b.textContent ? b.textContent : b.innerText;
+                        }
+                    }
+                }
+                else if (dt == 'xml' && !xhr.responseXML && xhr.responseText) {
+                    xhr.responseXML = toXml(xhr.responseText);
+                }
+
+                try {
+                    data = httpData(xhr, dt, s);
+                }
+                catch (e) {
+                    status = 'parsererror';
+                    xhr.error = errMsg = (e || status);
+                }
+            }
+            catch (e) {
+                log('error caught: ',e);
+                status = 'error';
+                xhr.error = errMsg = (e || status);
+            }
+
+            if (xhr.aborted) {
+                log('upload aborted');
+                status = null;
+            }
+
+            if (xhr.status) { // we've set xhr.status
+                status = (xhr.status >= 200 && xhr.status < 300 || xhr.status === 304) ? 'success' : 'error';
+            }
+
+            // ordering of these callbacks/triggers is odd, but that's how $.ajax does it
+            if (status === 'success') {
+                if (s.success)
+                    s.success.call(s.context, data, 'success', xhr);
+                if (g)
+                    $.event.trigger("ajaxSuccess", [xhr, s]);
+            }
+            else if (status) {
+                if (errMsg === undefined)
+                    errMsg = xhr.statusText;
+                if (s.error)
+                    s.error.call(s.context, xhr, status, errMsg);
+                if (g)
+                    $.event.trigger("ajaxError", [xhr, s, errMsg]);
+            }
+
+            if (g)
+                $.event.trigger("ajaxComplete", [xhr, s]);
+
+            if (g && ! --$.active) {
+                $.event.trigger("ajaxStop");
+            }
+
+            if (s.complete)
+                s.complete.call(s.context, xhr, status);
+
+            callbackProcessed = true;
+            if (s.timeout)
+                clearTimeout(timeoutHandle);
+
+            // clean up
+            setTimeout(function() {
+                if (!s.iframeTarget)
+                    $io.remove();
+                xhr.responseXML = null;
+            }, 100);
+        }
+
+        var toXml = $.parseXML || function(s, doc) { // use parseXML if available (jQuery 1.5+)
+            if (window.ActiveXObject) {
+                doc = new ActiveXObject('Microsoft.XMLDOM');
+                doc.async = 'false';
+                doc.loadXML(s);
+            }
+            else {
+                doc = (new DOMParser()).parseFromString(s, 'text/xml');
+            }
+            return (doc && doc.documentElement && doc.documentElement.nodeName != 'parsererror') ? doc : null;
+        };
+        var parseJSON = $.parseJSON || function(s) {
+            /*jslint evil:true */
+            return window['eval']('(' + s + ')');
+        };
+
+        var httpData = function( xhr, type, s ) { // mostly lifted from jq1.4.4
+
+            var ct = xhr.getResponseHeader('content-type') || '',
+                xml = type === 'xml' || !type && ct.indexOf('xml') >= 0,
+                data = xml ? xhr.responseXML : xhr.responseText;
+
+            if (xml && data.documentElement.nodeName === 'parsererror') {
+                if ($.error)
+                    $.error('parsererror');
+            }
+            if (s && s.dataFilter) {
+                data = s.dataFilter(data, type);
+            }
+            if (typeof data === 'string') {
+                if (type === 'json' || !type && ct.indexOf('json') >= 0) {
+                    data = parseJSON(data);
+                } else if (type === "script" || !type && ct.indexOf("javascript") >= 0) {
+                    $.globalEval(data);
+                }
+            }
+            return data;
+        };
+    }
+};
+
+/**
+ * ajaxForm() provides a mechanism for fully automating form submission.
+ *
+ * The advantages of using this method instead of ajaxSubmit() are:
+ *
+ * 1: This method will include coordinates for <input type="image" /> elements (if the element
+ *    is used to submit the form).
+ * 2. This method will include the submit element's name/value data (for the element that was
+ *    used to submit the form).
+ * 3. This method binds the submit() method to the form for you.
+ *
+ * The options argument for ajaxForm works exactly as it does for ajaxSubmit.  ajaxForm merely
+ * passes the options argument along after properly binding events for submit elements and
+ * the form itself.
+ */
+$.fn.ajaxForm = function(options) {
+    options = options || {};
+    options.delegation = options.delegation && $.isFunction($.fn.on);
+    
+    // in jQuery 1.3+ we can fix mistakes with the ready state
+    if (!options.delegation && this.length === 0) {
+        var o = { s: this.selector, c: this.context };
+        if (!$.isReady && o.s) {
+            log('DOM not ready, queuing ajaxForm');
+            $(function() {
+                $(o.s,o.c).ajaxForm(options);
+            });
+            return this;
+        }
+        // is your DOM ready?  http://docs.jquery.com/Tutorials:Introducing_$(document).ready()
+        log('terminating; zero elements found by selector' + ($.isReady ? '' : ' (DOM not ready)'));
+        return this;
+    }
+
+    if ( options.delegation ) {
+        $(document)
+            .off('submit.form-plugin', this.selector, doAjaxSubmit)
+            .off('click.form-plugin', this.selector, captureSubmittingElement)
+            .on('submit.form-plugin', this.selector, options, doAjaxSubmit)
+            .on('click.form-plugin', this.selector, options, captureSubmittingElement);
+        return this;
+    }
+
+    return this.ajaxFormUnbind()
+        .bind('submit.form-plugin', options, doAjaxSubmit)
+        .bind('click.form-plugin', options, captureSubmittingElement);
+};
+
+// private event handlers    
+function doAjaxSubmit(e) {
+    /*jshint validthis:true */
+    var options = e.data;
+    if (!e.isDefaultPrevented()) { // if event has been canceled, don't proceed
+        e.preventDefault();
+        $(this).ajaxSubmit(options);
+    }
+}
+    
+function captureSubmittingElement(e) {
+    /*jshint validthis:true */
+    var target = e.target;
+    var $el = $(target);
+    if (!($el.is(":submit,input:image"))) {
+        // is this a child element of the submit el?  (ex: a span within a button)
+        var t = $el.closest(':submit');
+        if (t.length === 0) {
+            return;
+        }
+        target = t[0];
+    }
+    var form = this;
+    form.clk = target;
+    if (target.type == 'image') {
+        if (e.offsetX !== undefined) {
+            form.clk_x = e.offsetX;
+            form.clk_y = e.offsetY;
+        } else if (typeof $.fn.offset == 'function') {
+            var offset = $el.offset();
+            form.clk_x = e.pageX - offset.left;
+            form.clk_y = e.pageY - offset.top;
+        } else {
+            form.clk_x = e.pageX - target.offsetLeft;
+            form.clk_y = e.pageY - target.offsetTop;
+        }
+    }
+    // clear form vars
+    setTimeout(function() { form.clk = form.clk_x = form.clk_y = null; }, 100);
+}
+
+
+// ajaxFormUnbind unbinds the event handlers that were bound by ajaxForm
+$.fn.ajaxFormUnbind = function() {
+    return this.unbind('submit.form-plugin click.form-plugin');
+};
+
+/**
+ * formToArray() gathers form element data into an array of objects that can
+ * be passed to any of the following ajax functions: $.get, $.post, or load.
+ * Each object in the array has both a 'name' and 'value' property.  An example of
+ * an array for a simple login form might be:
+ *
+ * [ { name: 'username', value: 'jresig' }, { name: 'password', value: 'secret' } ]
+ *
+ * It is this array that is passed to pre-submit callback functions provided to the
+ * ajaxSubmit() and ajaxForm() methods.
+ */
+$.fn.formToArray = function(semantic, elements) {
+    var a = [];
+    if (this.length === 0) {
+        return a;
+    }
+
+    var form = this[0];
+    var els = semantic ? form.getElementsByTagName('*') : form.elements;
+    if (!els) {
+        return a;
+    }
+
+    var i,j,n,v,el,max,jmax;
+    for(i=0, max=els.length; i < max; i++) {
+        el = els[i];
+        n = el.name;
+        if (!n) {
+            continue;
+        }
+
+        if (semantic && form.clk && el.type == "image") {
+            // handle image inputs on the fly when semantic == true
+            if(!el.disabled && form.clk == el) {
+                a.push({name: n, value: $(el).val(), type: el.type });
+                a.push({name: n+'.x', value: form.clk_x}, {name: n+'.y', value: form.clk_y});
+            }
+            continue;
+        }
+
+        v = $.fieldValue(el, true);
+        if (v && v.constructor == Array) {
+            if (elements) 
+                elements.push(el);
+            for(j=0, jmax=v.length; j < jmax; j++) {
+                a.push({name: n, value: v[j]});
+            }
+        }
+        else if (feature.fileapi && el.type == 'file' && !el.disabled) {
+            if (elements) 
+                elements.push(el);
+            var files = el.files;
+            if (files.length) {
+                for (j=0; j < files.length; j++) {
+                    a.push({name: n, value: files[j], type: el.type});
+                }
+            }
+            else {
+                // #180
+                a.push({ name: n, value: '', type: el.type });
+            }
+        }
+        else if (v !== null && typeof v != 'undefined') {
+            if (elements) 
+                elements.push(el);
+            a.push({name: n, value: v, type: el.type, required: el.required});
+        }
+    }
+
+    if (!semantic && form.clk) {
+        // input type=='image' are not found in elements array! handle it here
+        var $input = $(form.clk), input = $input[0];
+        n = input.name;
+        if (n && !input.disabled && input.type == 'image') {
+            a.push({name: n, value: $input.val()});
+            a.push({name: n+'.x', value: form.clk_x}, {name: n+'.y', value: form.clk_y});
+        }
+    }
+    return a;
+};
+
+/**
+ * Serializes form data into a 'submittable' string. This method will return a string
+ * in the format: name1=value1&amp;name2=value2
+ */
+$.fn.formSerialize = function(semantic) {
+    //hand off to jQuery.param for proper encoding
+    return $.param(this.formToArray(semantic));
+};
+
+/**
+ * Serializes all field elements in the jQuery object into a query string.
+ * This method will return a string in the format: name1=value1&amp;name2=value2
+ */
+$.fn.fieldSerialize = function(successful) {
+    var a = [];
+    this.each(function() {
+        var n = this.name;
+        if (!n) {
+            return;
+        }
+        var v = $.fieldValue(this, successful);
+        if (v && v.constructor == Array) {
+            for (var i=0,max=v.length; i < max; i++) {
+                a.push({name: n, value: v[i]});
+            }
+        }
+        else if (v !== null && typeof v != 'undefined') {
+            a.push({name: this.name, value: v});
+        }
+    });
+    //hand off to jQuery.param for proper encoding
+    return $.param(a);
+};
+
+/**
+ * Returns the value(s) of the element in the matched set.  For example, consider the following form:
+ *
+ *  <form><fieldset>
+ *      <input name="A" type="text" />
+ *      <input name="A" type="text" />
+ *      <input name="B" type="checkbox" value="B1" />
+ *      <input name="B" type="checkbox" value="B2"/>
+ *      <input name="C" type="radio" value="C1" />
+ *      <input name="C" type="radio" value="C2" />
+ *  </fieldset></form>
+ *
+ *  var v = $(':text').fieldValue();
+ *  // if no values are entered into the text inputs
+ *  v == ['','']
+ *  // if values entered into the text inputs are 'foo' and 'bar'
+ *  v == ['foo','bar']
+ *
+ *  var v = $(':checkbox').fieldValue();
+ *  // if neither checkbox is checked
+ *  v === undefined
+ *  // if both checkboxes are checked
+ *  v == ['B1', 'B2']
+ *
+ *  var v = $(':radio').fieldValue();
+ *  // if neither radio is checked
+ *  v === undefined
+ *  // if first radio is checked
+ *  v == ['C1']
+ *
+ * The successful argument controls whether or not the field element must be 'successful'
+ * (per http://www.w3.org/TR/html4/interact/forms.html#successful-controls).
+ * The default value of the successful argument is true.  If this value is false the value(s)
+ * for each element is returned.
+ *
+ * Note: This method *always* returns an array.  If no valid value can be determined the
+ *    array will be empty, otherwise it will contain one or more values.
+ */
+$.fn.fieldValue = function(successful) {
+    for (var val=[], i=0, max=this.length; i < max; i++) {
+        var el = this[i];
+        var v = $.fieldValue(el, successful);
+        if (v === null || typeof v == 'undefined' || (v.constructor == Array && !v.length)) {
+            continue;
+        }
+        if (v.constructor == Array)
+            $.merge(val, v);
+        else
+            val.push(v);
+    }
+    return val;
+};
+
+/**
+ * Returns the value of the field element.
+ */
+$.fieldValue = function(el, successful) {
+    var n = el.name, t = el.type, tag = el.tagName.toLowerCase();
+    if (successful === undefined) {
+        successful = true;
+    }
+
+    if (successful && (!n || el.disabled || t == 'reset' || t == 'button' ||
+        (t == 'checkbox' || t == 'radio') && !el.checked ||
+        (t == 'submit' || t == 'image') && el.form && el.form.clk != el ||
+        tag == 'select' && el.selectedIndex == -1)) {
+            return null;
+    }
+
+    if (tag == 'select') {
+        var index = el.selectedIndex;
+        if (index < 0) {
+            return null;
+        }
+        var a = [], ops = el.options;
+        var one = (t == 'select-one');
+        var max = (one ? index+1 : ops.length);
+        for(var i=(one ? index : 0); i < max; i++) {
+            var op = ops[i];
+            if (op.selected) {
+                var v = op.value;
+                if (!v) { // extra pain for IE...
+                    v = (op.attributes && op.attributes['value'] && !(op.attributes['value'].specified)) ? op.text : op.value;
+                }
+                if (one) {
+                    return v;
+                }
+                a.push(v);
+            }
+        }
+        return a;
+    }
+    return $(el).val();
+};
+
+/**
+ * Clears the form data.  Takes the following actions on the form's input fields:
+ *  - input text fields will have their 'value' property set to the empty string
+ *  - select elements will have their 'selectedIndex' property set to -1
+ *  - checkbox and radio inputs will have their 'checked' property set to false
+ *  - inputs of type submit, button, reset, and hidden will *not* be effected
+ *  - button elements will *not* be effected
+ */
+$.fn.clearForm = function(includeHidden) {
+    return this.each(function() {
+        $('input,select,textarea', this).clearFields(includeHidden);
+    });
+};
+
+/**
+ * Clears the selected form elements.
+ */
+$.fn.clearFields = $.fn.clearInputs = function(includeHidden) {
+    var re = /^(?:color|date|datetime|email|month|number|password|range|search|tel|text|time|url|week)$/i; // 'hidden' is not in this list
+    return this.each(function() {
+        var t = this.type, tag = this.tagName.toLowerCase();
+        if (re.test(t) || tag == 'textarea') {
+            this.value = '';
+        }
+        else if (t == 'checkbox' || t == 'radio') {
+            this.checked = false;
+        }
+        else if (tag == 'select') {
+            this.selectedIndex = -1;
+        }
+        else if (includeHidden) {
+            // includeHidden can be the value true, or it can be a selector string
+            // indicating a special test; for example:
+            //  $('#myForm').clearForm('.special:hidden')
+            // the above would clean hidden inputs that have the class of 'special'
+            if ( (includeHidden === true && /hidden/.test(t)) ||
+                 (typeof includeHidden == 'string' && $(this).is(includeHidden)) )
+                this.value = '';
+        }
+    });
+};
+
+/**
+ * Resets the form data.  Causes all form elements to be reset to their original value.
+ */
+$.fn.resetForm = function() {
+    return this.each(function() {
+        // guard against an input with the name of 'reset'
+        // note that IE reports the reset function as an 'object'
+        if (typeof this.reset == 'function' || (typeof this.reset == 'object' && !this.reset.nodeType)) {
+            this.reset();
+        }
+    });
+};
+
+/**
+ * Enables or disables any matching elements.
+ */
+$.fn.enable = function(b) {
+    if (b === undefined) {
+        b = true;
+    }
+    return this.each(function() {
+        this.disabled = !b;
+    });
+};
+
+/**
+ * Checks/unchecks any matching checkboxes or radio buttons and
+ * selects/deselects and matching option elements.
+ */
+$.fn.selected = function(select) {
+    if (select === undefined) {
+        select = true;
+    }
+    return this.each(function() {
+        var t = this.type;
+        if (t == 'checkbox' || t == 'radio') {
+            this.checked = select;
+        }
+        else if (this.tagName.toLowerCase() == 'option') {
+            var $sel = $(this).parent('select');
+            if (select && $sel[0] && $sel[0].type == 'select-one') {
+                // deselect all other options
+                $sel.find('option').selected(false);
+            }
+            this.selected = select;
+        }
+    });
+};
+
+// expose debug var
+$.fn.ajaxSubmit.debug = false;
+
+// helper fn for console logging
+function log() {
+    if (!$.fn.ajaxSubmit.debug) 
+        return;
+    var msg = '[jquery.form] ' + Array.prototype.join.call(arguments,'');
+    if (window.console && window.console.log) {
+        window.console.log(msg);
+    }
+    else if (window.opera && window.opera.postError) {
+        window.opera.postError(msg);
+    }
+}
+
+})(jQuery);
diff --git a/resources/lib/jquery/jquery.fullscreen.js b/resources/lib/jquery/jquery.fullscreen.js
new file mode 100644 (file)
index 0000000..30e4484
--- /dev/null
@@ -0,0 +1,175 @@
+/**
+ * jQuery fullscreen plugin v2.0.0-git (9f8f97d127)
+ * https://github.com/theopolisme/jquery-fullscreen
+ *
+ * Copyright (c) 2013 Theopolisme <theopolismewiki@gmail.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ */
+( function ( $ ) {
+       var setupFullscreen,
+               fsClass = 'jq-fullscreened';
+
+       /**
+        * On fullscreenchange, trigger a jq-fullscreen-change event
+        * The event is given an object, which contains the fullscreened DOM element (element), if any
+        * and a boolean value (fullscreen) indicating if we've entered or exited fullscreen mode
+        * Also remove the 'fullscreened' class from elements that are no longer fullscreen
+        */
+       function handleFullscreenChange () {
+               var fullscreenElement = document.fullscreenElement ||
+                       document.mozFullScreenElement ||
+                       document.webkitFullscreenElement ||
+                       document.msFullscreenElement;
+
+               if ( !fullscreenElement ) {
+                       $( '.' + fsClass ).data( 'isFullscreened', false ).removeClass( fsClass );
+               }
+
+               $( document ).trigger( $.Event( 'jq-fullscreen-change', { element: fullscreenElement, fullscreen: !!fullscreenElement } ) );
+       }
+
+       /**
+        * Enters full screen with the "this" element in focus.
+        * Check the .data( 'isFullscreened' ) of the return value to check
+        * success or failure, if you're into that sort of thing.
+        * @chainable
+        * @return {jQuery}
+        */
+       function enterFullscreen () {
+               var element = this.get(0),
+                       $element = this.first();
+               if ( element ) {
+                       if ( element.requestFullscreen ) {
+                               element.requestFullscreen();
+                       } else if ( element.mozRequestFullScreen ) {
+                               element.mozRequestFullScreen();
+                       } else if ( element.webkitRequestFullscreen ) {
+                               element.webkitRequestFullscreen();
+                       } else if ( element.msRequestFullscreen ) {
+                               element.msRequestFullscreen();
+                       } else {
+                               // Unable to make fullscreen
+                               $element.data( 'isFullscreened', false );
+                               return this;
+                       }
+                       // Add the fullscreen class and data attribute to `element`
+                       $element.addClass( fsClass ).data( 'isFullscreened', true );
+                       return this;
+               } else {
+                       $element.data( 'isFullscreened', false );
+                       return this;
+               }
+       }
+
+       /**
+        * Brings the "this" element out of fullscreen.
+        * Check the .data( 'isFullscreened' ) of the return value to check
+        * success or failure, if you're into that sort of thing.
+        * @chainable
+        * @return {jQuery}
+        */
+       function exitFullscreen () {
+               var fullscreenElement = ( document.fullscreenElement ||
+                               document.mozFullScreenElement ||
+                               document.webkitFullscreenElement ||
+                               document.msFullscreenElement );
+
+               // Ensure that we only exit fullscreen if exitFullscreen() is being called on the same element that is currently fullscreen
+               if ( fullscreenElement && this.get(0) === fullscreenElement ) {
+                       if ( document.exitFullscreen ) {
+                               document.exitFullscreen();
+                       } else if ( document.mozCancelFullScreen ) {
+                               document.mozCancelFullScreen();
+                       } else if ( document.webkitCancelFullScreen ) {
+                               document.webkitCancelFullScreen();
+                       } else if ( document.msExitFullscreen ) {
+                               document.msExitFullscreen();
+                       } else {
+                               // Unable to cancel fullscreen mode
+                               return this;
+                       }
+                       // We don't need to remove the fullscreen class here,
+                       // because it will be removed in handleFullscreenChange.
+                       // But we should change the data on the element so the
+                       // caller can check for success.
+                       this.first().data( 'isFullscreened', false );
+               }
+
+               return this;
+       }
+
+       /**
+        * Set up fullscreen handling and install necessary event handlers.
+        * Return false if fullscreen is not supported.
+        */
+       setupFullscreen = function () {
+               if ( $.support.fullscreen ) {
+                       // When the fullscreen mode is changed, trigger the
+                       // fullscreen events (and when exiting,
+                       // also remove the fullscreen class)
+                       $( document ).on( 'fullscreenchange webkitfullscreenchange mozfullscreenchange MSFullscreenChange', handleFullscreenChange);
+                       // Convenience wrapper so that one only needs to listen for
+                       // 'fullscreenerror', not all of the prefixed versions
+                       $( document ).on( 'webkitfullscreenerror mozfullscreenerror MSFullscreenError', function () {
+                               $( document ).trigger( $.Event( 'fullscreenerror' ) );
+                       } );
+                       // Fullscreen has been set up, so always return true
+                       setupFullscreen = function () { return true; };
+                       return true;
+               } else {
+                       // Always return false from now on, since fullscreen is not supported
+                       setupFullscreen = function () { return false; };
+                       return false;
+               }
+       };
+
+       /**
+        * Set up fullscreen handling if necessary, then make the first element
+        * matching the given selector fullscreen
+        * @chainable
+        * @return {jQuery}
+        */
+       $.fn.enterFullscreen = function () {
+               if ( setupFullscreen() ) {
+                       $.fn.enterFullscreen = enterFullscreen;
+                       return this.enterFullscreen();
+               } else {
+                       $.fn.enterFullscreen = function () { return this; };
+                       return this;
+               }
+       };
+
+       /**
+        * Set up fullscreen handling if necessary, then cancel fullscreen mode
+        * for the first element matching the given selector.
+        * @chainable
+        * @return {jQuery}
+        */
+       $.fn.exitFullscreen = function () {
+               if ( setupFullscreen() ) {
+                       $.fn.exitFullscreen = exitFullscreen;
+                       return this.exitFullscreen();
+               } else {
+                       $.fn.exitFullscreen = function () { return this; };
+                       return this;
+               }
+       };
+
+       $.support.fullscreen = document.fullscreenEnabled ||
+               document.webkitFullscreenEnabled ||
+               document.mozFullScreenEnabled ||
+               document.msFullscreenEnabled;
+}( jQuery ) );
diff --git a/resources/lib/jquery/jquery.hoverIntent.js b/resources/lib/jquery/jquery.hoverIntent.js
new file mode 100644 (file)
index 0000000..adf948d
--- /dev/null
@@ -0,0 +1,111 @@
+/**
+* hoverIntent is similar to jQuery's built-in "hover" function except that
+* instead of firing the onMouseOver event immediately, hoverIntent checks
+* to see if the user's mouse has slowed down (beneath the sensitivity
+* threshold) before firing the onMouseOver event.
+* 
+* hoverIntent r5 // 2007.03.27 // jQuery 1.1.2+
+* <http://cherne.net/brian/resources/jquery.hoverIntent.html>
+* 
+* hoverIntent is currently available for use in all personal or commercial 
+* projects under both MIT and GPL licenses. This means that you can choose 
+* the license that best suits your project, and use it accordingly.
+* 
+* // basic usage (just like .hover) receives onMouseOver and onMouseOut functions
+* $("ul li").hoverIntent( showNav , hideNav );
+* 
+* // advanced usage receives configuration object only
+* $("ul li").hoverIntent({
+*      sensitivity: 7, // number = sensitivity threshold (must be 1 or higher)
+*      interval: 100,   // number = milliseconds of polling interval
+*      over: showNav,  // function = onMouseOver callback (required)
+*      timeout: 0,   // number = milliseconds delay before onMouseOut function call
+*      out: hideNav    // function = onMouseOut callback (required)
+* });
+* 
+* @param  f  onMouseOver function || An object with configuration options
+* @param  g  onMouseOut function  || Nothing (use configuration options object)
+* @author    Brian Cherne <brian@cherne.net>
+*/
+(function($) {
+       $.fn.hoverIntent = function(f,g) {
+               // default configuration options
+               var cfg = {
+                       sensitivity: 7,
+                       interval: 100,
+                       timeout: 0
+               };
+               // override configuration options with user supplied object
+               cfg = $.extend(cfg, g ? { over: f, out: g } : f );
+
+               // instantiate variables
+               // cX, cY = current X and Y position of mouse, updated by mousemove event
+               // pX, pY = previous X and Y position of mouse, set by mouseover and polling interval
+               var cX, cY, pX, pY;
+
+               // A private function for getting mouse position
+               var track = function(ev) {
+                       cX = ev.pageX;
+                       cY = ev.pageY;
+               };
+
+               // A private function for comparing current and previous mouse position
+               var compare = function(ev,ob) {
+                       ob.hoverIntent_t = clearTimeout(ob.hoverIntent_t);
+                       // compare mouse positions to see if they've crossed the threshold
+                       if ( ( Math.abs(pX-cX) + Math.abs(pY-cY) ) < cfg.sensitivity ) {
+                               $(ob).unbind("mousemove",track);
+                               // set hoverIntent state to true (so mouseOut can be called)
+                               ob.hoverIntent_s = 1;
+                               return cfg.over.apply(ob,[ev]);
+                       } else {
+                               // set previous coordinates for next time
+                               pX = cX; pY = cY;
+                               // use self-calling timeout, guarantees intervals are spaced out properly (avoids JavaScript timer bugs)
+                               ob.hoverIntent_t = setTimeout( function(){compare(ev, ob);} , cfg.interval );
+                       }
+               };
+
+               // A private function for delaying the mouseOut function
+               var delay = function(ev,ob) {
+                       ob.hoverIntent_t = clearTimeout(ob.hoverIntent_t);
+                       ob.hoverIntent_s = 0;
+                       return cfg.out.apply(ob,[ev]);
+               };
+
+               // A private function for handling mouse 'hovering'
+               var handleHover = function(e) {
+                       // next three lines copied from jQuery.hover, ignore children onMouseOver/onMouseOut
+                       var p = (e.type == "mouseover" ? e.fromElement : e.toElement) || e.relatedTarget;
+                       while ( p && p != this ) { try { p = p.parentNode; } catch(e) { p = this; } }
+                       if ( p == this ) { return false; }
+
+                       // copy objects to be passed into t (required for event object to be passed in IE)
+                       var ev = $.extend({},e);
+                       var ob = this;
+
+                       // cancel hoverIntent timer if it exists
+                       if (ob.hoverIntent_t) { ob.hoverIntent_t = clearTimeout(ob.hoverIntent_t); }
+
+                       // else e.type == "onmouseover"
+                       if (e.type == "mouseover") {
+                               // set "previous" X and Y position based on initial entry point
+                               pX = ev.pageX; pY = ev.pageY;
+                               // update "current" X and Y position based on mousemove
+                               $(ob).bind("mousemove",track);
+                               // start polling interval (self-calling timeout) to compare mouse coordinates over time
+                               if (ob.hoverIntent_s != 1) { ob.hoverIntent_t = setTimeout( function(){compare(ev,ob);} , cfg.interval );}
+
+                       // else e.type == "onmouseout"
+                       } else {
+                               // unbind expensive mousemove event
+                               $(ob).unbind("mousemove",track);
+                               // if hoverIntent state is true, then call the mouseOut function after the specified delay
+                               if (ob.hoverIntent_s == 1) { ob.hoverIntent_t = setTimeout( function(){delay(ev,ob);} , cfg.timeout );}
+                       }
+               };
+
+               // bind the function to the two event listeners
+               return this.mouseover(handleHover).mouseout(handleHover);
+       };
+})(jQuery);
\ No newline at end of file
diff --git a/resources/lib/jquery/jquery.jStorage.js b/resources/lib/jquery/jquery.jStorage.js
new file mode 100644 (file)
index 0000000..324833c
--- /dev/null
@@ -0,0 +1,960 @@
+/*
+ * ----------------------------- JSTORAGE -------------------------------------
+ * Simple local storage wrapper to save data on the browser side, supporting
+ * all major browsers - IE6+, Firefox2+, Safari4+, Chrome4+ and Opera 10.5+
+ *
+ * Author: Andris Reinman, andris.reinman@gmail.com
+ * Project homepage: www.jstorage.info
+ *
+ * Licensed under Unlicense:
+ *
+ * This is free and unencumbered software released into the public domain.
+ * 
+ * Anyone is free to copy, modify, publish, use, compile, sell, or
+ * distribute this software, either in source code form or as a compiled
+ * binary, for any purpose, commercial or non-commercial, and by any
+ * means.
+ * 
+ * In jurisdictions that recognize copyright laws, the author or authors
+ * of this software dedicate any and all copyright interest in the
+ * software to the public domain. We make this dedication for the benefit
+ * of the public at large and to the detriment of our heirs and
+ * successors. We intend this dedication to be an overt act of
+ * relinquishment in perpetuity of all present and future rights to this
+ * software under copyright law.
+ * 
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+ * IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
+ * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ * 
+ * For more information, please refer to <http://unlicense.org/>
+ */
+
+ (function(){
+    var
+        /* jStorage version */
+        JSTORAGE_VERSION = "0.4.8",
+
+        /* detect a dollar object or create one if not found */
+        $ = window.jQuery || window.$ || (window.$ = {}),
+
+        /* check for a JSON handling support */
+        JSON = {
+            parse:
+                window.JSON && (window.JSON.parse || window.JSON.decode) ||
+                String.prototype.evalJSON && function(str){return String(str).evalJSON();} ||
+                $.parseJSON ||
+                $.evalJSON,
+            stringify:
+                Object.toJSON ||
+                window.JSON && (window.JSON.stringify || window.JSON.encode) ||
+                $.toJSON
+        };
+
+    // Break if no JSON support was found
+    if(!("parse" in JSON) || !("stringify" in JSON)){
+        throw new Error("No JSON support found, include //cdnjs.cloudflare.com/ajax/libs/json2/20110223/json2.js to page");
+    }
+
+    var
+        /* This is the object, that holds the cached values */
+        _storage = {__jstorage_meta:{CRC32:{}}},
+
+        /* Actual browser storage (localStorage or globalStorage["domain"]) */
+        _storage_service = {jStorage:"{}"},
+
+        /* DOM element for older IE versions, holds userData behavior */
+        _storage_elm = null,
+
+        /* How much space does the storage take */
+        _storage_size = 0,
+
+        /* which backend is currently used */
+        _backend = false,
+
+        /* onchange observers */
+        _observers = {},
+
+        /* timeout to wait after onchange event */
+        _observer_timeout = false,
+
+        /* last update time */
+        _observer_update = 0,
+
+        /* pubsub observers */
+        _pubsub_observers = {},
+
+        /* skip published items older than current timestamp */
+        _pubsub_last = +new Date(),
+
+        /* Next check for TTL */
+        _ttl_timeout,
+
+        /**
+         * XML encoding and decoding as XML nodes can't be JSON'ized
+         * XML nodes are encoded and decoded if the node is the value to be saved
+         * but not if it's as a property of another object
+         * Eg. -
+         *   $.jStorage.set("key", xmlNode);        // IS OK
+         *   $.jStorage.set("key", {xml: xmlNode}); // NOT OK
+         */
+        _XMLService = {
+
+            /**
+             * Validates a XML node to be XML
+             * based on jQuery.isXML function
+             */
+            isXML: function(elm){
+                var documentElement = (elm ? elm.ownerDocument || elm : 0).documentElement;
+                return documentElement ? documentElement.nodeName !== "HTML" : false;
+            },
+
+            /**
+             * Encodes a XML node to string
+             * based on http://www.mercurytide.co.uk/news/article/issues-when-working-ajax/
+             */
+            encode: function(xmlNode) {
+                if(!this.isXML(xmlNode)){
+                    return false;
+                }
+                try{ // Mozilla, Webkit, Opera
+                    return new XMLSerializer().serializeToString(xmlNode);
+                }catch(E1) {
+                    try {  // IE
+                        return xmlNode.xml;
+                    }catch(E2){}
+                }
+                return false;
+            },
+
+            /**
+             * Decodes a XML node from string
+             * loosely based on http://outwestmedia.com/jquery-plugins/xmldom/
+             */
+            decode: function(xmlString){
+                var dom_parser = ("DOMParser" in window && (new DOMParser()).parseFromString) ||
+                        (window.ActiveXObject && function(_xmlString) {
+                    var xml_doc = new ActiveXObject("Microsoft.XMLDOM");
+                    xml_doc.async = "false";
+                    xml_doc.loadXML(_xmlString);
+                    return xml_doc;
+                }),
+                resultXML;
+                if(!dom_parser){
+                    return false;
+                }
+                resultXML = dom_parser.call("DOMParser" in window && (new DOMParser()) || window, xmlString, "text/xml");
+                return this.isXML(resultXML)?resultXML:false;
+            }
+        };
+
+
+    ////////////////////////// PRIVATE METHODS ////////////////////////
+
+    /**
+     * Initialization function. Detects if the browser supports DOM Storage
+     * or userData behavior and behaves accordingly.
+     */
+    function _init(){
+        /* Check if browser supports localStorage */
+        var localStorageReallyWorks = false;
+        if("localStorage" in window){
+            try {
+                window.localStorage.setItem("_tmptest", "tmpval");
+                localStorageReallyWorks = true;
+                window.localStorage.removeItem("_tmptest");
+            } catch(BogusQuotaExceededErrorOnIos5) {
+                // Thanks be to iOS5 Private Browsing mode which throws
+                // QUOTA_EXCEEDED_ERRROR DOM Exception 22.
+            }
+        }
+
+        if(localStorageReallyWorks){
+            try {
+                if(window.localStorage) {
+                    _storage_service = window.localStorage;
+                    _backend = "localStorage";
+                    _observer_update = _storage_service.jStorage_update;
+                }
+            } catch(E3) {/* Firefox fails when touching localStorage and cookies are disabled */}
+        }
+        /* Check if browser supports globalStorage */
+        else if("globalStorage" in window){
+            try {
+                if(window.globalStorage) {
+                    if(window.location.hostname == "localhost"){
+                        _storage_service = window.globalStorage["localhost.localdomain"];
+                    }
+                    else{
+                        _storage_service = window.globalStorage[window.location.hostname];
+                    }
+                    _backend = "globalStorage";
+                    _observer_update = _storage_service.jStorage_update;
+                }
+            } catch(E4) {/* Firefox fails when touching localStorage and cookies are disabled */}
+        }
+        /* Check if browser supports userData behavior */
+        else {
+            _storage_elm = document.createElement("link");
+            if(_storage_elm.addBehavior){
+
+                /* Use a DOM element to act as userData storage */
+                _storage_elm.style.behavior = "url(#default#userData)";
+
+                /* userData element needs to be inserted into the DOM! */
+                document.getElementsByTagName("head")[0].appendChild(_storage_elm);
+
+                try{
+                    _storage_elm.load("jStorage");
+                }catch(E){
+                    // try to reset cache
+                    _storage_elm.setAttribute("jStorage", "{}");
+                    _storage_elm.save("jStorage");
+                    _storage_elm.load("jStorage");
+                }
+
+                var data = "{}";
+                try{
+                    data = _storage_elm.getAttribute("jStorage");
+                }catch(E5){}
+
+                try{
+                    _observer_update = _storage_elm.getAttribute("jStorage_update");
+                }catch(E6){}
+
+                _storage_service.jStorage = data;
+                _backend = "userDataBehavior";
+            }else{
+                _storage_elm = null;
+                return;
+            }
+        }
+
+        // Load data from storage
+        _load_storage();
+
+        // remove dead keys
+        _handleTTL();
+
+        // start listening for changes
+        _setupObserver();
+
+        // initialize publish-subscribe service
+        _handlePubSub();
+
+        // handle cached navigation
+        if("addEventListener" in window){
+            window.addEventListener("pageshow", function(event){
+                if(event.persisted){
+                    _storageObserver();
+                }
+            }, false);
+        }
+    }
+
+    /**
+     * Reload data from storage when needed
+     */
+    function _reloadData(){
+        var data = "{}";
+
+        if(_backend == "userDataBehavior"){
+            _storage_elm.load("jStorage");
+
+            try{
+                data = _storage_elm.getAttribute("jStorage");
+            }catch(E5){}
+
+            try{
+                _observer_update = _storage_elm.getAttribute("jStorage_update");
+            }catch(E6){}
+
+            _storage_service.jStorage = data;
+        }
+
+        _load_storage();
+
+        // remove dead keys
+        _handleTTL();
+
+        _handlePubSub();
+    }
+
+    /**
+     * Sets up a storage change observer
+     */
+    function _setupObserver(){
+        if(_backend == "localStorage" || _backend == "globalStorage"){
+            if("addEventListener" in window){
+                window.addEventListener("storage", _storageObserver, false);
+            }else{
+                document.attachEvent("onstorage", _storageObserver);
+            }
+        }else if(_backend == "userDataBehavior"){
+            setInterval(_storageObserver, 1000);
+        }
+    }
+
+    /**
+     * Fired on any kind of data change, needs to check if anything has
+     * really been changed
+     */
+    function _storageObserver(){
+        var updateTime;
+        // cumulate change notifications with timeout
+        clearTimeout(_observer_timeout);
+        _observer_timeout = setTimeout(function(){
+
+            if(_backend == "localStorage" || _backend == "globalStorage"){
+                updateTime = _storage_service.jStorage_update;
+            }else if(_backend == "userDataBehavior"){
+                _storage_elm.load("jStorage");
+                try{
+                    updateTime = _storage_elm.getAttribute("jStorage_update");
+                }catch(E5){}
+            }
+
+            if(updateTime && updateTime != _observer_update){
+                _observer_update = updateTime;
+                _checkUpdatedKeys();
+            }
+
+        }, 25);
+    }
+
+    /**
+     * Reloads the data and checks if any keys are changed
+     */
+    function _checkUpdatedKeys(){
+        var oldCrc32List = JSON.parse(JSON.stringify(_storage.__jstorage_meta.CRC32)),
+            newCrc32List;
+
+        _reloadData();
+        newCrc32List = JSON.parse(JSON.stringify(_storage.__jstorage_meta.CRC32));
+
+        var key,
+            updated = [],
+            removed = [];
+
+        for(key in oldCrc32List){
+            if(oldCrc32List.hasOwnProperty(key)){
+                if(!newCrc32List[key]){
+                    removed.push(key);
+                    continue;
+                }
+                if(oldCrc32List[key] != newCrc32List[key] && String(oldCrc32List[key]).substr(0,2) == "2."){
+                    updated.push(key);
+                }
+            }
+        }
+
+        for(key in newCrc32List){
+            if(newCrc32List.hasOwnProperty(key)){
+                if(!oldCrc32List[key]){
+                    updated.push(key);
+                }
+            }
+        }
+
+        _fireObservers(updated, "updated");
+        _fireObservers(removed, "deleted");
+    }
+
+    /**
+     * Fires observers for updated keys
+     *
+     * @param {Array|String} keys Array of key names or a key
+     * @param {String} action What happened with the value (updated, deleted, flushed)
+     */
+    function _fireObservers(keys, action){
+        keys = [].concat(keys || []);
+        if(action == "flushed"){
+            keys = [];
+            for(var key in _observers){
+                if(_observers.hasOwnProperty(key)){
+                    keys.push(key);
+                }
+            }
+            action = "deleted";
+        }
+        for(var i=0, len = keys.length; i<len; i++){
+            if(_observers[keys[i]]){
+                for(var j=0, jlen = _observers[keys[i]].length; j<jlen; j++){
+                    _observers[keys[i]][j](keys[i], action);
+                }
+            }
+            if(_observers["*"]){
+                for(var j=0, jlen = _observers["*"].length; j<jlen; j++){
+                    _observers["*"][j](keys[i], action);
+                }
+            }
+        }
+    }
+
+    /**
+     * Publishes key change to listeners
+     */
+    function _publishChange(){
+        var updateTime = (+new Date()).toString();
+
+        if(_backend == "localStorage" || _backend == "globalStorage"){
+            try {
+                _storage_service.jStorage_update = updateTime;
+            } catch (E8) {
+                // safari private mode has been enabled after the jStorage initialization
+                _backend = false;
+            }
+        }else if(_backend == "userDataBehavior"){
+            _storage_elm.setAttribute("jStorage_update", updateTime);
+            _storage_elm.save("jStorage");
+        }
+
+        _storageObserver();
+    }
+
+    /**
+     * Loads the data from the storage based on the supported mechanism
+     */
+    function _load_storage(){
+        /* if jStorage string is retrieved, then decode it */
+        if(_storage_service.jStorage){
+            try{
+                _storage = JSON.parse(String(_storage_service.jStorage));
+            }catch(E6){_storage_service.jStorage = "{}";}
+        }else{
+            _storage_service.jStorage = "{}";
+        }
+        _storage_size = _storage_service.jStorage?String(_storage_service.jStorage).length:0;
+
+        if(!_storage.__jstorage_meta){
+            _storage.__jstorage_meta = {};
+        }
+        if(!_storage.__jstorage_meta.CRC32){
+            _storage.__jstorage_meta.CRC32 = {};
+        }
+    }
+
+    /**
+     * This functions provides the "save" mechanism to store the jStorage object
+     */
+    function _save(){
+        _dropOldEvents(); // remove expired events
+        try{
+            _storage_service.jStorage = JSON.stringify(_storage);
+            // If userData is used as the storage engine, additional
+            if(_storage_elm) {
+                _storage_elm.setAttribute("jStorage",_storage_service.jStorage);
+                _storage_elm.save("jStorage");
+            }
+            _storage_size = _storage_service.jStorage?String(_storage_service.jStorage).length:0;
+        }catch(E7){/* probably cache is full, nothing is saved this way*/}
+    }
+
+    /**
+     * Function checks if a key is set and is string or numberic
+     *
+     * @param {String} key Key name
+     */
+    function _checkKey(key){
+        if(typeof key != "string" && typeof key != "number"){
+            throw new TypeError("Key name must be string or numeric");
+        }
+        if(key == "__jstorage_meta"){
+            throw new TypeError("Reserved key name");
+        }
+        return true;
+    }
+
+    /**
+     * Removes expired keys
+     */
+    function _handleTTL(){
+        var curtime, i, TTL, CRC32, nextExpire = Infinity, changed = false, deleted = [];
+
+        clearTimeout(_ttl_timeout);
+
+        if(!_storage.__jstorage_meta || typeof _storage.__jstorage_meta.TTL != "object"){
+            // nothing to do here
+            return;
+        }
+
+        curtime = +new Date();
+        TTL = _storage.__jstorage_meta.TTL;
+
+        CRC32 = _storage.__jstorage_meta.CRC32;
+        for(i in TTL){
+            if(TTL.hasOwnProperty(i)){
+                if(TTL[i] <= curtime){
+                    delete TTL[i];
+                    delete CRC32[i];
+                    delete _storage[i];
+                    changed = true;
+                    deleted.push(i);
+                }else if(TTL[i] < nextExpire){
+                    nextExpire = TTL[i];
+                }
+            }
+        }
+
+        // set next check
+        if(nextExpire != Infinity){
+            _ttl_timeout = setTimeout(_handleTTL, nextExpire - curtime);
+        }
+
+        // save changes
+        if(changed){
+            _save();
+            _publishChange();
+            _fireObservers(deleted, "deleted");
+        }
+    }
+
+    /**
+     * Checks if there's any events on hold to be fired to listeners
+     */
+    function _handlePubSub(){
+        var i, len;
+        if(!_storage.__jstorage_meta.PubSub){
+            return;
+        }
+        var pubelm,
+            _pubsubCurrent = _pubsub_last;
+
+        for(i=len=_storage.__jstorage_meta.PubSub.length-1; i>=0; i--){
+            pubelm = _storage.__jstorage_meta.PubSub[i];
+            if(pubelm[0] > _pubsub_last){
+                _pubsubCurrent = pubelm[0];
+                _fireSubscribers(pubelm[1], pubelm[2]);
+            }
+        }
+
+        _pubsub_last = _pubsubCurrent;
+    }
+
+    /**
+     * Fires all subscriber listeners for a pubsub channel
+     *
+     * @param {String} channel Channel name
+     * @param {Mixed} payload Payload data to deliver
+     */
+    function _fireSubscribers(channel, payload){
+        if(_pubsub_observers[channel]){
+            for(var i=0, len = _pubsub_observers[channel].length; i<len; i++){
+                // send immutable data that can't be modified by listeners
+                try{
+                    _pubsub_observers[channel][i](channel, JSON.parse(JSON.stringify(payload)));
+                }catch(E){};
+            }
+        }
+    }
+
+    /**
+     * Remove old events from the publish stream (at least 2sec old)
+     */
+    function _dropOldEvents(){
+        if(!_storage.__jstorage_meta.PubSub){
+            return;
+        }
+
+        var retire = +new Date() - 2000;
+
+        for(var i=0, len = _storage.__jstorage_meta.PubSub.length; i<len; i++){
+            if(_storage.__jstorage_meta.PubSub[i][0] <= retire){
+                // deleteCount is needed for IE6
+                _storage.__jstorage_meta.PubSub.splice(i, _storage.__jstorage_meta.PubSub.length - i);
+                break;
+            }
+        }
+
+        if(!_storage.__jstorage_meta.PubSub.length){
+            delete _storage.__jstorage_meta.PubSub;
+        }
+
+    }
+
+    /**
+     * Publish payload to a channel
+     *
+     * @param {String} channel Channel name
+     * @param {Mixed} payload Payload to send to the subscribers
+     */
+    function _publish(channel, payload){
+        if(!_storage.__jstorage_meta){
+            _storage.__jstorage_meta = {};
+        }
+        if(!_storage.__jstorage_meta.PubSub){
+            _storage.__jstorage_meta.PubSub = [];
+        }
+
+        _storage.__jstorage_meta.PubSub.unshift([+new Date, channel, payload]);
+
+        _save();
+        _publishChange();
+    }
+
+
+    /**
+     * JS Implementation of MurmurHash2
+     *
+     *  SOURCE: https://github.com/garycourt/murmurhash-js (MIT licensed)
+     *
+     * @author <a href="mailto:gary.court@gmail.com">Gary Court</a>
+     * @see http://github.com/garycourt/murmurhash-js
+     * @author <a href="mailto:aappleby@gmail.com">Austin Appleby</a>
+     * @see http://sites.google.com/site/murmurhash/
+     *
+     * @param {string} str ASCII only
+     * @param {number} seed Positive integer only
+     * @return {number} 32-bit positive integer hash
+     */
+
+    function murmurhash2_32_gc(str, seed) {
+        var
+            l = str.length,
+            h = seed ^ l,
+            i = 0,
+            k;
+
+        while (l >= 4) {
+            k =
+                ((str.charCodeAt(i) & 0xff)) |
+                ((str.charCodeAt(++i) & 0xff) << 8) |
+                ((str.charCodeAt(++i) & 0xff) << 16) |
+                ((str.charCodeAt(++i) & 0xff) << 24);
+
+            k = (((k & 0xffff) * 0x5bd1e995) + ((((k >>> 16) * 0x5bd1e995) & 0xffff) << 16));
+            k ^= k >>> 24;
+            k = (((k & 0xffff) * 0x5bd1e995) + ((((k >>> 16) * 0x5bd1e995) & 0xffff) << 16));
+
+            h = (((h & 0xffff) * 0x5bd1e995) + ((((h >>> 16) * 0x5bd1e995) & 0xffff) << 16)) ^ k;
+
+            l -= 4;
+            ++i;
+        }
+
+        switch (l) {
+            case 3: h ^= (str.charCodeAt(i + 2) & 0xff) << 16;
+            case 2: h ^= (str.charCodeAt(i + 1) & 0xff) << 8;
+            case 1: h ^= (str.charCodeAt(i) & 0xff);
+                h = (((h & 0xffff) * 0x5bd1e995) + ((((h >>> 16) * 0x5bd1e995) & 0xffff) << 16));
+        }
+
+        h ^= h >>> 13;
+        h = (((h & 0xffff) * 0x5bd1e995) + ((((h >>> 16) * 0x5bd1e995) & 0xffff) << 16));
+        h ^= h >>> 15;
+
+        return h >>> 0;
+    }
+
+    ////////////////////////// PUBLIC INTERFACE /////////////////////////
+
+    $.jStorage = {
+        /* Version number */
+        version: JSTORAGE_VERSION,
+
+        /**
+         * Sets a key's value.
+         *
+         * @param {String} key Key to set. If this value is not set or not
+         *              a string an exception is raised.
+         * @param {Mixed} value Value to set. This can be any value that is JSON
+         *              compatible (Numbers, Strings, Objects etc.).
+         * @param {Object} [options] - possible options to use
+         * @param {Number} [options.TTL] - optional TTL value
+         * @return {Mixed} the used value
+         */
+        set: function(key, value, options){
+            _checkKey(key);
+
+            options = options || {};
+
+            // undefined values are deleted automatically
+            if(typeof value == "undefined"){
+                this.deleteKey(key);
+                return value;
+            }
+
+            if(_XMLService.isXML(value)){
+                value = {_is_xml:true,xml:_XMLService.encode(value)};
+            }else if(typeof value == "function"){
+                return undefined; // functions can't be saved!
+            }else if(value && typeof value == "object"){
+                // clone the object before saving to _storage tree
+                value = JSON.parse(JSON.stringify(value));
+            }
+
+            _storage[key] = value;
+
+            _storage.__jstorage_meta.CRC32[key] = "2." + murmurhash2_32_gc(JSON.stringify(value), 0x9747b28c);
+
+            this.setTTL(key, options.TTL || 0); // also handles saving and _publishChange
+
+            _fireObservers(key, "updated");
+            return value;
+        },
+
+        /**
+         * Looks up a key in cache
+         *
+         * @param {String} key - Key to look up.
+         * @param {mixed} def - Default value to return, if key didn't exist.
+         * @return {Mixed} the key value, default value or null
+         */
+        get: function(key, def){
+            _checkKey(key);
+            if(key in _storage){
+                if(_storage[key] && typeof _storage[key] == "object" && _storage[key]._is_xml) {
+                    return _XMLService.decode(_storage[key].xml);
+                }else{
+                    return _storage[key];
+                }
+            }
+            return typeof(def) == "undefined" ? null : def;
+        },
+
+        /**
+         * Deletes a key from cache.
+         *
+         * @param {String} key - Key to delete.
+         * @return {Boolean} true if key existed or false if it didn't
+         */
+        deleteKey: function(key){
+            _checkKey(key);
+            if(key in _storage){
+                delete _storage[key];
+                // remove from TTL list
+                if(typeof _storage.__jstorage_meta.TTL == "object" &&
+                  key in _storage.__jstorage_meta.TTL){
+                    delete _storage.__jstorage_meta.TTL[key];
+                }
+
+                delete _storage.__jstorage_meta.CRC32[key];
+
+                _save();
+                _publishChange();
+                _fireObservers(key, "deleted");
+                return true;
+            }
+            return false;
+        },
+
+        /**
+         * Sets a TTL for a key, or remove it if ttl value is 0 or below
+         *
+         * @param {String} key - key to set the TTL for
+         * @param {Number} ttl - TTL timeout in milliseconds
+         * @return {Boolean} true if key existed or false if it didn't
+         */
+        setTTL: function(key, ttl){
+            var curtime = +new Date();
+            _checkKey(key);
+            ttl = Number(ttl) || 0;
+            if(key in _storage){
+
+                if(!_storage.__jstorage_meta.TTL){
+                    _storage.__jstorage_meta.TTL = {};
+                }
+
+                // Set TTL value for the key
+                if(ttl>0){
+                    _storage.__jstorage_meta.TTL[key] = curtime + ttl;
+                }else{
+                    delete _storage.__jstorage_meta.TTL[key];
+                }
+
+                _save();
+
+                _handleTTL();
+
+                _publishChange();
+                return true;
+            }
+            return false;
+        },
+
+        /**
+         * Gets remaining TTL (in milliseconds) for a key or 0 when no TTL has been set
+         *
+         * @param {String} key Key to check
+         * @return {Number} Remaining TTL in milliseconds
+         */
+        getTTL: function(key){
+            var curtime = +new Date(), ttl;
+            _checkKey(key);
+            if(key in _storage && _storage.__jstorage_meta.TTL && _storage.__jstorage_meta.TTL[key]){
+                ttl = _storage.__jstorage_meta.TTL[key] - curtime;
+                return ttl || 0;
+            }
+            return 0;
+        },
+
+        /**
+         * Deletes everything in cache.
+         *
+         * @return {Boolean} Always true
+         */
+        flush: function(){
+            _storage = {__jstorage_meta:{CRC32:{}}};
+            _save();
+            _publishChange();
+            _fireObservers(null, "flushed");
+            return true;
+        },
+
+        /**
+         * Returns a read-only copy of _storage
+         *
+         * @return {Object} Read-only copy of _storage
+        */
+        storageObj: function(){
+            function F() {}
+            F.prototype = _storage;
+            return new F();
+        },
+
+        /**
+         * Returns an index of all used keys as an array
+         * ["key1", "key2",.."keyN"]
+         *
+         * @return {Array} Used keys
+        */
+        index: function(){
+            var index = [], i;
+            for(i in _storage){
+                if(_storage.hasOwnProperty(i) && i != "__jstorage_meta"){
+                    index.push(i);
+                }
+            }
+            return index;
+        },
+
+        /**
+         * How much space in bytes does the storage take?
+         *
+         * @return {Number} Storage size in chars (not the same as in bytes,
+         *                  since some chars may take several bytes)
+         */
+        storageSize: function(){
+            return _storage_size;
+        },
+
+        /**
+         * Which backend is currently in use?
+         *
+         * @return {String} Backend name
+         */
+        currentBackend: function(){
+            return _backend;
+        },
+
+        /**
+         * Test if storage is available
+         *
+         * @return {Boolean} True if storage can be used
+         */
+        storageAvailable: function(){
+            return !!_backend;
+        },
+
+        /**
+         * Register change listeners
+         *
+         * @param {String} key Key name
+         * @param {Function} callback Function to run when the key changes
+         */
+        listenKeyChange: function(key, callback){
+            _checkKey(key);
+            if(!_observers[key]){
+                _observers[key] = [];
+            }
+            _observers[key].push(callback);
+        },
+
+        /**
+         * Remove change listeners
+         *
+         * @param {String} key Key name to unregister listeners against
+         * @param {Function} [callback] If set, unregister the callback, if not - unregister all
+         */
+        stopListening: function(key, callback){
+            _checkKey(key);
+
+            if(!_observers[key]){
+                return;
+            }
+
+            if(!callback){
+                delete _observers[key];
+                return;
+            }
+
+            for(var i = _observers[key].length - 1; i>=0; i--){
+                if(_observers[key][i] == callback){
+                    _observers[key].splice(i,1);
+                }
+            }
+        },
+
+        /**
+         * Subscribe to a Publish/Subscribe event stream
+         *
+         * @param {String} channel Channel name
+         * @param {Function} callback Function to run when the something is published to the channel
+         */
+        subscribe: function(channel, callback){
+            channel = (channel || "").toString();
+            if(!channel){
+                throw new TypeError("Channel not defined");
+            }
+            if(!_pubsub_observers[channel]){
+                _pubsub_observers[channel] = [];
+            }
+            _pubsub_observers[channel].push(callback);
+        },
+
+        /**
+         * Publish data to an event stream
+         *
+         * @param {String} channel Channel name
+         * @param {Mixed} payload Payload to deliver
+         */
+        publish: function(channel, payload){
+            channel = (channel || "").toString();
+            if(!channel){
+                throw new TypeError("Channel not defined");
+            }
+
+            _publish(channel, payload);
+        },
+
+        /**
+         * Reloads the data from browser storage
+         */
+        reInit: function(){
+            _reloadData();
+        },
+
+        /**
+         * Removes reference from global objects and saves it as jStorage
+         *
+         * @param {Boolean} option if needed to save object as simple "jStorage" in windows context
+         */
+         noConflict: function( saveInGlobal ) {
+            delete window.$.jStorage
+
+            if ( saveInGlobal ) {
+                window.jStorage = this;
+            }
+
+            return this;
+         }
+    };
+
+    // Initialize jStorage
+    _init();
+
+})();
diff --git a/resources/lib/jquery/jquery.js b/resources/lib/jquery/jquery.js
new file mode 100644 (file)
index 0000000..a86bf79
--- /dev/null
@@ -0,0 +1,9472 @@
+/*!
+ * jQuery JavaScript Library v1.8.3
+ * http://jquery.com/
+ *
+ * Includes Sizzle.js
+ * http://sizzlejs.com/
+ *
+ * Copyright 2012 jQuery Foundation and other contributors
+ * Released under the MIT license
+ * http://jquery.org/license
+ *
+ * Date: Tue Nov 13 2012 08:20:33 GMT-0500 (Eastern Standard Time)
+ */
+(function( window, undefined ) {
+var
+       // A central reference to the root jQuery(document)
+       rootjQuery,
+
+       // The deferred used on DOM ready
+       readyList,
+
+       // Use the correct document accordingly with window argument (sandbox)
+       document = window.document,
+       location = window.location,
+       navigator = window.navigator,
+
+       // Map over jQuery in case of overwrite
+       _jQuery = window.jQuery,
+
+       // Map over the $ in case of overwrite
+       _$ = window.$,
+
+       // Save a reference to some core methods
+       core_push = Array.prototype.push,
+       core_slice = Array.prototype.slice,
+       core_indexOf = Array.prototype.indexOf,
+       core_toString = Object.prototype.toString,
+       core_hasOwn = Object.prototype.hasOwnProperty,
+       core_trim = String.prototype.trim,
+
+       // Define a local copy of jQuery
+       jQuery = function( selector, context ) {
+               // The jQuery object is actually just the init constructor 'enhanced'
+               return new jQuery.fn.init( selector, context, rootjQuery );
+       },
+
+       // Used for matching numbers
+       core_pnum = /[\-+]?(?:\d*\.|)\d+(?:[eE][\-+]?\d+|)/.source,
+
+       // Used for detecting and trimming whitespace
+       core_rnotwhite = /\S/,
+       core_rspace = /\s+/,
+
+       // Make sure we trim BOM and NBSP (here's looking at you, Safari 5.0 and IE)
+       rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,
+
+       // A simple way to check for HTML strings
+       // Prioritize #id over <tag> to avoid XSS via location.hash (#9521)
+       rquickExpr = /^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,
+
+       // Match a standalone tag
+       rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>|)$/,
+
+       // JSON RegExp
+       rvalidchars = /^[\],:{}\s]*$/,
+       rvalidbraces = /(?:^|:|,)(?:\s*\[)+/g,
+       rvalidescape = /\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g,
+       rvalidtokens = /"[^"\\\r\n]*"|true|false|null|-?(?:\d\d*\.|)\d+(?:[eE][\-+]?\d+|)/g,
+
+       // Matches dashed string for camelizing
+       rmsPrefix = /^-ms-/,
+       rdashAlpha = /-([\da-z])/gi,
+
+       // Used by jQuery.camelCase as callback to replace()
+       fcamelCase = function( all, letter ) {
+               return ( letter + "" ).toUpperCase();
+       },
+
+       // The ready event handler and self cleanup method
+       DOMContentLoaded = function() {
+               if ( document.addEventListener ) {
+                       document.removeEventListener( "DOMContentLoaded", DOMContentLoaded, false );
+                       jQuery.ready();
+               } else if ( document.readyState === "complete" ) {
+                       // we're here because readyState === "complete" in oldIE
+                       // which is good enough for us to call the dom ready!
+                       document.detachEvent( "onreadystatechange", DOMContentLoaded );
+                       jQuery.ready();
+               }
+       },
+
+       // [[Class]] -> type pairs
+       class2type = {};
+
+jQuery.fn = jQuery.prototype = {
+       constructor: jQuery,
+       init: function( selector, context, rootjQuery ) {
+               var match, elem, ret, doc;
+
+               // Handle $(""), $(null), $(undefined), $(false)
+               if ( !selector ) {
+                       return this;
+               }
+
+               // Handle $(DOMElement)
+               if ( selector.nodeType ) {
+                       this.context = this[0] = selector;
+                       this.length = 1;
+                       return this;
+               }
+
+               // Handle HTML strings
+               if ( typeof selector === "string" ) {
+                       if ( selector.charAt(0) === "<" && selector.charAt( selector.length - 1 ) === ">" && selector.length >= 3 ) {
+                               // Assume that strings that start and end with <> are HTML and skip the regex check
+                               match = [ null, selector, null ];
+
+                       } else {
+                               match = rquickExpr.exec( selector );
+                       }
+
+                       // Match html or make sure no context is specified for #id
+                       if ( match && (match[1] || !context) ) {
+
+                               // HANDLE: $(html) -> $(array)
+                               if ( match[1] ) {
+                                       context = context instanceof jQuery ? context[0] : context;
+                                       doc = ( context && context.nodeType ? context.ownerDocument || context : document );
+
+                                       // scripts is true for back-compat
+                                       selector = jQuery.parseHTML( match[1], doc, true );
+                                       if ( rsingleTag.test( match[1] ) && jQuery.isPlainObject( context ) ) {
+                                               this.attr.call( selector, context, true );
+                                       }
+
+                                       return jQuery.merge( this, selector );
+
+                               // HANDLE: $(#id)
+                               } else {
+                                       elem = document.getElementById( match[2] );
+
+                                       // Check parentNode to catch when Blackberry 4.6 returns
+                                       // nodes that are no longer in the document #6963
+                                       if ( elem && elem.parentNode ) {
+                                               // Handle the case where IE and Opera return items
+                                               // by name instead of ID
+                                               if ( elem.id !== match[2] ) {
+                                                       return rootjQuery.find( selector );
+                                               }
+
+                                               // Otherwise, we inject the element directly into the jQuery object
+                                               this.length = 1;
+                                               this[0] = elem;
+                                       }
+
+                                       this.context = document;
+                                       this.selector = selector;
+                                       return this;
+                               }
+
+                       // HANDLE: $(expr, $(...))
+                       } else if ( !context || context.jquery ) {
+                               return ( context || rootjQuery ).find( selector );
+
+                       // HANDLE: $(expr, context)
+                       // (which is just equivalent to: $(context).find(expr)
+                       } else {
+                               return this.constructor( context ).find( selector );
+                       }
+
+               // HANDLE: $(function)
+               // Shortcut for document ready
+               } else if ( jQuery.isFunction( selector ) ) {
+                       return rootjQuery.ready( selector );
+               }
+
+               if ( selector.selector !== undefined ) {
+                       this.selector = selector.selector;
+                       this.context = selector.context;
+               }
+
+               return jQuery.makeArray( selector, this );
+       },
+
+       // Start with an empty selector
+       selector: "",
+
+       // The current version of jQuery being used
+       jquery: "1.8.3",
+
+       // The default length of a jQuery object is 0
+       length: 0,
+
+       // The number of elements contained in the matched element set
+       size: function() {
+               return this.length;
+       },
+
+       toArray: function() {
+               return core_slice.call( this );
+       },
+
+       // Get the Nth element in the matched element set OR
+       // Get the whole matched element set as a clean array
+       get: function( num ) {
+               return num == null ?
+
+                       // Return a 'clean' array
+                       this.toArray() :
+
+                       // Return just the object
+                       ( num < 0 ? this[ this.length + num ] : this[ num ] );
+       },
+
+       // Take an array of elements and push it onto the stack
+       // (returning the new matched element set)
+       pushStack: function( elems, name, selector ) {
+
+               // Build a new jQuery matched element set
+               var ret = jQuery.merge( this.constructor(), elems );
+
+               // Add the old object onto the stack (as a reference)
+               ret.prevObject = this;
+
+               ret.context = this.context;
+
+               if ( name === "find" ) {
+                       ret.selector = this.selector + ( this.selector ? " " : "" ) + selector;
+               } else if ( name ) {
+                       ret.selector = this.selector + "." + name + "(" + selector + ")";
+               }
+
+               // Return the newly-formed element set
+               return ret;
+       },
+
+       // Execute a callback for every element in the matched set.
+       // (You can seed the arguments with an array of args, but this is
+       // only used internally.)
+       each: function( callback, args ) {
+               return jQuery.each( this, callback, args );
+       },
+
+       ready: function( fn ) {
+               // Add the callback
+               jQuery.ready.promise().done( fn );
+
+               return this;
+       },
+
+       eq: function( i ) {
+               i = +i;
+               return i === -1 ?
+                       this.slice( i ) :
+                       this.slice( i, i + 1 );
+       },
+
+       first: function() {
+               return this.eq( 0 );
+       },
+
+       last: function() {
+               return this.eq( -1 );
+       },
+
+       slice: function() {
+               return this.pushStack( core_slice.apply( this, arguments ),
+                       "slice", core_slice.call(arguments).join(",") );
+       },
+
+       map: function( callback ) {
+               return this.pushStack( jQuery.map(this, function( elem, i ) {
+                       return callback.call( elem, i, elem );
+               }));
+       },
+
+       end: function() {
+               return this.prevObject || this.constructor(null);
+       },
+
+       // For internal use only.
+       // Behaves like an Array's method, not like a jQuery method.
+       push: core_push,
+       sort: [].sort,
+       splice: [].splice
+};
+
+// Give the init function the jQuery prototype for later instantiation
+jQuery.fn.init.prototype = jQuery.fn;
+
+jQuery.extend = jQuery.fn.extend = function() {
+       var options, name, src, copy, copyIsArray, clone,
+               target = arguments[0] || {},
+               i = 1,
+               length = arguments.length,
+               deep = false;
+
+       // Handle a deep copy situation
+       if ( typeof target === "boolean" ) {
+               deep = target;
+               target = arguments[1] || {};
+               // skip the boolean and the target
+               i = 2;
+       }
+
+       // Handle case when target is a string or something (possible in deep copy)
+       if ( typeof target !== "object" && !jQuery.isFunction(target) ) {
+               target = {};
+       }
+
+       // extend jQuery itself if only one argument is passed
+       if ( length === i ) {
+               target = this;
+               --i;
+       }
+
+       for ( ; i < length; i++ ) {
+               // Only deal with non-null/undefined values
+               if ( (options = arguments[ i ]) != null ) {
+                       // Extend the base object
+                       for ( name in options ) {
+                               src = target[ name ];
+                               copy = options[ name ];
+
+                               // Prevent never-ending loop
+                               if ( target === copy ) {
+                                       continue;
+                               }
+
+                               // Recurse if we're merging plain objects or arrays
+                               if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) {
+                                       if ( copyIsArray ) {
+                                               copyIsArray = false;
+                                               clone = src && jQuery.isArray(src) ? src : [];
+
+                                       } else {
+                                               clone = src && jQuery.isPlainObject(src) ? src : {};
+                                       }
+
+                                       // Never move original objects, clone them
+                                       target[ name ] = jQuery.extend( deep, clone, copy );
+
+                               // Don't bring in undefined values
+                               } else if ( copy !== undefined ) {
+                                       target[ name ] = copy;
+                               }
+                       }
+               }
+       }
+
+       // Return the modified object
+       return target;
+};
+
+jQuery.extend({
+       noConflict: function( deep ) {
+               if ( window.$ === jQuery ) {
+                       window.$ = _$;
+               }
+
+               if ( deep && window.jQuery === jQuery ) {
+                       window.jQuery = _jQuery;
+               }
+
+               return jQuery;
+       },
+
+       // Is the DOM ready to be used? Set to true once it occurs.
+       isReady: false,
+
+       // A counter to track how many items to wait for before
+       // the ready event fires. See #6781
+       readyWait: 1,
+
+       // Hold (or release) the ready event
+       holdReady: function( hold ) {
+               if ( hold ) {
+                       jQuery.readyWait++;
+               } else {
+                       jQuery.ready( true );
+               }
+       },
+
+       // Handle when the DOM is ready
+       ready: function( wait ) {
+
+               // Abort if there are pending holds or we're already ready
+               if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {
+                       return;
+               }
+
+               // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).
+               if ( !document.body ) {
+                       return setTimeout( jQuery.ready, 1 );
+               }
+
+               // Remember that the DOM is ready
+               jQuery.isReady = true;
+
+               // If a normal DOM Ready event fired, decrement, and wait if need be
+               if ( wait !== true && --jQuery.readyWait > 0 ) {
+                       return;
+               }
+
+               // If there are functions bound, to execute
+               readyList.resolveWith( document, [ jQuery ] );
+
+               // Trigger any bound ready events
+               if ( jQuery.fn.trigger ) {
+                       jQuery( document ).trigger("ready").off("ready");
+               }
+       },
+
+       // See test/unit/core.js for details concerning isFunction.
+       // Since version 1.3, DOM methods and functions like alert
+       // aren't supported. They return false on IE (#2968).
+       isFunction: function( obj ) {
+               return jQuery.type(obj) === "function";
+       },
+
+       isArray: Array.isArray || function( obj ) {
+               return jQuery.type(obj) === "array";
+       },
+
+       isWindow: function( obj ) {
+               return obj != null && obj == obj.window;
+       },
+
+       isNumeric: function( obj ) {
+               return !isNaN( parseFloat(obj) ) && isFinite( obj );
+       },
+
+       type: function( obj ) {
+               return obj == null ?
+                       String( obj ) :
+                       class2type[ core_toString.call(obj) ] || "object";
+       },
+
+       isPlainObject: function( obj ) {
+               // Must be an Object.
+               // Because of IE, we also have to check the presence of the constructor property.
+               // Make sure that DOM nodes and window objects don't pass through, as well
+               if ( !obj || jQuery.type(obj) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) {
+                       return false;
+               }
+
+               try {
+                       // Not own constructor property must be Object
+                       if ( obj.constructor &&
+                               !core_hasOwn.call(obj, "constructor") &&
+                               !core_hasOwn.call(obj.constructor.prototype, "isPrototypeOf") ) {
+                               return false;
+                       }
+               } catch ( e ) {
+                       // IE8,9 Will throw exceptions on certain host objects #9897
+                       return false;
+               }
+
+               // Own properties are enumerated firstly, so to speed up,
+               // if last one is own, then all properties are own.
+
+               var key;
+               for ( key in obj ) {}
+
+               return key === undefined || core_hasOwn.call( obj, key );
+       },
+
+       isEmptyObject: function( obj ) {
+               var name;
+               for ( name in obj ) {
+                       return false;
+               }
+               return true;
+       },
+
+       error: function( msg ) {
+               throw new Error( msg );
+       },
+
+       // data: string of html
+       // context (optional): If specified, the fragment will be created in this context, defaults to document
+       // scripts (optional): If true, will include scripts passed in the html string
+       parseHTML: function( data, context, scripts ) {
+               var parsed;
+               if ( !data || typeof data !== "string" ) {
+                       return null;
+               }
+               if ( typeof context === "boolean" ) {
+                       scripts = context;
+                       context = 0;
+               }
+               context = context || document;
+
+               // Single tag
+               if ( (parsed = rsingleTag.exec( data )) ) {
+                       return [ context.createElement( parsed[1] ) ];
+               }
+
+               parsed = jQuery.buildFragment( [ data ], context, scripts ? null : [] );
+               return jQuery.merge( [],
+                       (parsed.cacheable ? jQuery.clone( parsed.fragment ) : parsed.fragment).childNodes );
+       },
+
+       parseJSON: function( data ) {
+               if ( !data || typeof data !== "string") {
+                       return null;
+               }
+
+               // Make sure leading/trailing whitespace is removed (IE can't handle it)
+               data = jQuery.trim( data );
+
+               // Attempt to parse using the native JSON parser first
+               if ( window.JSON && window.JSON.parse ) {
+                       return window.JSON.parse( data );
+               }
+
+               // Make sure the incoming data is actual JSON
+               // Logic borrowed from http://json.org/json2.js
+               if ( rvalidchars.test( data.replace( rvalidescape, "@" )
+                       .replace( rvalidtokens, "]" )
+                       .replace( rvalidbraces, "")) ) {
+
+                       return ( new Function( "return " + data ) )();
+
+               }
+               jQuery.error( "Invalid JSON: " + data );
+       },
+
+       // Cross-browser xml parsing
+       parseXML: function( data ) {
+               var xml, tmp;
+               if ( !data || typeof data !== "string" ) {
+                       return null;
+               }
+               try {
+                       if ( window.DOMParser ) { // Standard
+                               tmp = new DOMParser();
+                               xml = tmp.parseFromString( data , "text/xml" );
+                       } else { // IE
+                               xml = new ActiveXObject( "Microsoft.XMLDOM" );
+                               xml.async = "false";
+                               xml.loadXML( data );
+                       }
+               } catch( e ) {
+                       xml = undefined;
+               }
+               if ( !xml || !xml.documentElement || xml.getElementsByTagName( "parsererror" ).length ) {
+                       jQuery.error( "Invalid XML: " + data );
+               }
+               return xml;
+       },
+
+       noop: function() {},
+
+       // Evaluates a script in a global context
+       // Workarounds based on findings by Jim Driscoll
+       // http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context
+       globalEval: function( data ) {
+               if ( data && core_rnotwhite.test( data ) ) {
+                       // We use execScript on Internet Explorer
+                       // We use an anonymous function so that context is window
+                       // rather than jQuery in Firefox
+                       ( window.execScript || function( data ) {
+                               window[ "eval" ].call( window, data );
+                       } )( data );
+               }
+       },
+
+       // Convert dashed to camelCase; used by the css and data modules
+       // Microsoft forgot to hump their vendor prefix (#9572)
+       camelCase: function( string ) {
+               return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase );
+       },
+
+       nodeName: function( elem, name ) {
+               return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();
+       },
+
+       // args is for internal usage only
+       each: function( obj, callback, args ) {
+               var name,
+                       i = 0,
+                       length = obj.length,
+                       isObj = length === undefined || jQuery.isFunction( obj );
+
+               if ( args ) {
+                       if ( isObj ) {
+                               for ( name in obj ) {
+                                       if ( callback.apply( obj[ name ], args ) === false ) {
+                                               break;
+                                       }
+                               }
+                       } else {
+                               for ( ; i < length; ) {
+                                       if ( callback.apply( obj[ i++ ], args ) === false ) {
+                                               break;
+                                       }
+                               }
+                       }
+
+               // A special, fast, case for the most common use of each
+               } else {
+                       if ( isObj ) {
+                               for ( name in obj ) {
+                                       if ( callback.call( obj[ name ], name, obj[ name ] ) === false ) {
+                                               break;
+                                       }
+                               }
+                       } else {
+                               for ( ; i < length; ) {
+                                       if ( callback.call( obj[ i ], i, obj[ i++ ] ) === false ) {
+                                               break;
+                                       }
+                               }
+                       }
+               }
+
+               return obj;
+       },
+
+       // Use native String.trim function wherever possible
+       trim: core_trim && !core_trim.call("\uFEFF\xA0") ?
+               function( text ) {
+                       return text == null ?
+                               "" :
+                               core_trim.call( text );
+               } :
+
+               // Otherwise use our own trimming functionality
+               function( text ) {
+                       return text == null ?
+                               "" :
+                               ( text + "" ).replace( rtrim, "" );
+               },
+
+       // results is for internal usage only
+       makeArray: function( arr, results ) {
+               var type,
+                       ret = results || [];
+
+               if ( arr != null ) {
+                       // The window, strings (and functions) also have 'length'
+                       // Tweaked logic slightly to handle Blackberry 4.7 RegExp issues #6930
+                       type = jQuery.type( arr );
+
+                       if ( arr.length == null || type === "string" || type === "function" || type === "regexp" || jQuery.isWindow( arr ) ) {
+                               core_push.call( ret, arr );
+                       } else {
+                               jQuery.merge( ret, arr );
+                       }
+               }
+
+               return ret;
+       },
+
+       inArray: function( elem, arr, i ) {
+               var len;
+
+               if ( arr ) {
+                       if ( core_indexOf ) {
+                               return core_indexOf.call( arr, elem, i );
+                       }
+
+                       len = arr.length;
+                       i = i ? i < 0 ? Math.max( 0, len + i ) : i : 0;
+
+                       for ( ; i < len; i++ ) {
+                               // Skip accessing in sparse arrays
+                               if ( i in arr && arr[ i ] === elem ) {
+                                       return i;
+                               }
+                       }
+               }
+
+               return -1;
+       },
+
+       merge: function( first, second ) {
+               var l = second.length,
+                       i = first.length,
+                       j = 0;
+
+               if ( typeof l === "number" ) {
+                       for ( ; j < l; j++ ) {
+                               first[ i++ ] = second[ j ];
+                       }
+
+               } else {
+                       while ( second[j] !== undefined ) {
+                               first[ i++ ] = second[ j++ ];
+                       }
+               }
+
+               first.length = i;
+
+               return first;
+       },
+
+       grep: function( elems, callback, inv ) {
+               var retVal,
+                       ret = [],
+                       i = 0,
+                       length = elems.length;
+               inv = !!inv;
+
+               // Go through the array, only saving the items
+               // that pass the validator function
+               for ( ; i < length; i++ ) {
+                       retVal = !!callback( elems[ i ], i );
+                       if ( inv !== retVal ) {
+                               ret.push( elems[ i ] );
+                       }
+               }
+
+               return ret;
+       },
+
+       // arg is for internal usage only
+       map: function( elems, callback, arg ) {
+               var value, key,
+                       ret = [],
+                       i = 0,
+                       length = elems.length,
+                       // jquery objects are treated as arrays
+                       isArray = elems instanceof jQuery || length !== undefined && typeof length === "number" && ( ( length > 0 && elems[ 0 ] && elems[ length -1 ] ) || length === 0 || jQuery.isArray( elems ) ) ;
+
+               // Go through the array, translating each of the items to their
+               if ( isArray ) {
+                       for ( ; i < length; i++ ) {
+                               value = callback( elems[ i ], i, arg );
+
+                               if ( value != null ) {
+                                       ret[ ret.length ] = value;
+                               }
+                       }
+
+               // Go through every key on the object,
+               } else {
+                       for ( key in elems ) {
+                               value = callback( elems[ key ], key, arg );
+
+                               if ( value != null ) {
+                                       ret[ ret.length ] = value;
+                               }
+                       }
+               }
+
+               // Flatten any nested arrays
+               return ret.concat.apply( [], ret );
+       },
+
+       // A global GUID counter for objects
+       guid: 1,
+
+       // Bind a function to a context, optionally partially applying any
+       // arguments.
+       proxy: function( fn, context ) {
+               var tmp, args, proxy;
+
+               if ( typeof context === "string" ) {
+                       tmp = fn[ context ];
+                       context = fn;
+                       fn = tmp;
+               }
+
+               // Quick check to determine if target is callable, in the spec
+               // this throws a TypeError, but we will just return undefined.
+               if ( !jQuery.isFunction( fn ) ) {
+                       return undefined;
+               }
+
+               // Simulated bind
+               args = core_slice.call( arguments, 2 );
+               proxy = function() {
+                       return fn.apply( context, args.concat( core_slice.call( arguments ) ) );
+               };
+
+               // Set the guid of unique handler to the same of original handler, so it can be removed
+               proxy.guid = fn.guid = fn.guid || jQuery.guid++;
+
+               return proxy;
+       },
+
+       // Multifunctional method to get and set values of a collection
+       // The value/s can optionally be executed if it's a function
+       access: function( elems, fn, key, value, chainable, emptyGet, pass ) {
+               var exec,
+                       bulk = key == null,
+                       i = 0,
+                       length = elems.length;
+
+               // Sets many values
+               if ( key && typeof key === "object" ) {
+                       for ( i in key ) {
+                               jQuery.access( elems, fn, i, key[i], 1, emptyGet, value );
+                       }
+                       chainable = 1;
+
+               // Sets one value
+               } else if ( value !== undefined ) {
+                       // Optionally, function values get executed if exec is true
+                       exec = pass === undefined && jQuery.isFunction( value );
+
+                       if ( bulk ) {
+                               // Bulk operations only iterate when executing function values
+                               if ( exec ) {
+                                       exec = fn;
+                                       fn = function( elem, key, value ) {
+                                               return exec.call( jQuery( elem ), value );
+                                       };
+
+                               // Otherwise they run against the entire set
+                               } else {
+                                       fn.call( elems, value );
+                                       fn = null;
+                               }
+                       }
+
+                       if ( fn ) {
+                               for (; i < length; i++ ) {
+                                       fn( elems[i], key, exec ? value.call( elems[i], i, fn( elems[i], key ) ) : value, pass );
+                               }
+                       }
+
+                       chainable = 1;
+               }
+
+               return chainable ?
+                       elems :
+
+                       // Gets
+                       bulk ?
+                               fn.call( elems ) :
+                               length ? fn( elems[0], key ) : emptyGet;
+       },
+
+       now: function() {
+               return ( new Date() ).getTime();
+       }
+});
+
+jQuery.ready.promise = function( obj ) {
+       if ( !readyList ) {
+
+               readyList = jQuery.Deferred();
+
+               // Catch cases where $(document).ready() is called after the browser event has already occurred.
+               // we once tried to use readyState "interactive" here, but it caused issues like the one
+               // discovered by ChrisS here: http://bugs.jquery.com/ticket/12282#comment:15
+               if ( document.readyState === "complete" ) {
+                       // Handle it asynchronously to allow scripts the opportunity to delay ready
+                       setTimeout( jQuery.ready, 1 );
+
+               // Standards-based browsers support DOMContentLoaded
+               } else if ( document.addEventListener ) {
+                       // Use the handy event callback
+                       document.addEventListener( "DOMContentLoaded", DOMContentLoaded, false );
+
+                       // A fallback to window.onload, that will always work
+                       window.addEventListener( "load", jQuery.ready, false );
+
+               // If IE event model is used
+               } else {
+                       // Ensure firing before onload, maybe late but safe also for iframes
+                       document.attachEvent( "onreadystatechange", DOMContentLoaded );
+
+                       // A fallback to window.onload, that will always work
+                       window.attachEvent( "onload", jQuery.ready );
+
+                       // If IE and not a frame
+                       // continually check to see if the document is ready
+                       var top = false;
+
+                       try {
+                               top = window.frameElement == null && document.documentElement;
+                       } catch(e) {}
+
+                       if ( top && top.doScroll ) {
+                               (function doScrollCheck() {
+                                       if ( !jQuery.isReady ) {
+
+                                               try {
+                                                       // Use the trick by Diego Perini
+                                                       // http://javascript.nwbox.com/IEContentLoaded/
+                                                       top.doScroll("left");
+                                               } catch(e) {
+                                                       return setTimeout( doScrollCheck, 50 );
+                                               }
+
+                                               // and execute any waiting functions
+                                               jQuery.ready();
+                                       }
+                               })();
+                       }
+               }
+       }
+       return readyList.promise( obj );
+};
+
+// Populate the class2type map
+jQuery.each("Boolean Number String Function Array Date RegExp Object".split(" "), function(i, name) {
+       class2type[ "[object " + name + "]" ] = name.toLowerCase();
+});
+
+// All jQuery objects should point back to these
+rootjQuery = jQuery(document);
+// String to Object options format cache
+var optionsCache = {};
+
+// Convert String-formatted options into Object-formatted ones and store in cache
+function createOptions( options ) {
+       var object = optionsCache[ options ] = {};
+       jQuery.each( options.split( core_rspace ), function( _, flag ) {
+               object[ flag ] = true;
+       });
+       return object;
+}
+
+/*
+ * Create a callback list using the following parameters:
+ *
+ *     options: an optional list of space-separated options that will change how
+ *                     the callback list behaves or a more traditional option object
+ *
+ * By default a callback list will act like an event callback list and can be
+ * "fired" multiple times.
+ *
+ * Possible options:
+ *
+ *     once:                   will ensure the callback list can only be fired once (like a Deferred)
+ *
+ *     memory:                 will keep track of previous values and will call any callback added
+ *                                     after the list has been fired right away with the latest "memorized"
+ *                                     values (like a Deferred)
+ *
+ *     unique:                 will ensure a callback can only be added once (no duplicate in the list)
+ *
+ *     stopOnFalse:    interrupt callings when a callback returns false
+ *
+ */
+jQuery.Callbacks = function( options ) {
+
+       // Convert options from String-formatted to Object-formatted if needed
+       // (we check in cache first)
+       options = typeof options === "string" ?
+               ( optionsCache[ options ] || createOptions( options ) ) :
+               jQuery.extend( {}, options );
+
+       var // Last fire value (for non-forgettable lists)
+               memory,
+               // Flag to know if list was already fired
+               fired,
+               // Flag to know if list is currently firing
+               firing,
+               // First callback to fire (used internally by add and fireWith)
+               firingStart,
+               // End of the loop when firing
+               firingLength,
+               // Index of currently firing callback (modified by remove if needed)
+               firingIndex,
+               // Actual callback list
+               list = [],
+               // Stack of fire calls for repeatable lists
+               stack = !options.once && [],
+               // Fire callbacks
+               fire = function( data ) {
+                       memory = options.memory && data;
+                       fired = true;
+                       firingIndex = firingStart || 0;
+                       firingStart = 0;
+                       firingLength = list.length;
+                       firing = true;
+                       for ( ; list && firingIndex < firingLength; firingIndex++ ) {
+                               if ( list[ firingIndex ].apply( data[ 0 ], data[ 1 ] ) === false && options.stopOnFalse ) {
+                                       memory = false; // To prevent further calls using add
+                                       break;
+                               }
+                       }
+                       firing = false;
+                       if ( list ) {
+                               if ( stack ) {
+                                       if ( stack.length ) {
+                                               fire( stack.shift() );
+                                       }
+                               } else if ( memory ) {
+                                       list = [];
+                               } else {
+                                       self.disable();
+                               }
+                       }
+               },
+               // Actual Callbacks object
+               self = {
+                       // Add a callback or a collection of callbacks to the list
+                       add: function() {
+                               if ( list ) {
+                                       // First, we save the current length
+                                       var start = list.length;
+                                       (function add( args ) {
+                                               jQuery.each( args, function( _, arg ) {
+                                                       var type = jQuery.type( arg );
+                                                       if ( type === "function" ) {
+                                                               if ( !options.unique || !self.has( arg ) ) {
+                                                                       list.push( arg );
+                                                               }
+                                                       } else if ( arg && arg.length && type !== "string" ) {
+                                                               // Inspect recursively
+                                                               add( arg );
+                                                       }
+                                               });
+                                       })( arguments );
+                                       // Do we need to add the callbacks to the
+                                       // current firing batch?
+                                       if ( firing ) {
+                                               firingLength = list.length;
+                                       // With memory, if we're not firing then
+                                       // we should call right away
+                                       } else if ( memory ) {
+                                               firingStart = start;
+                                               fire( memory );
+                                       }
+                               }
+                               return this;
+                       },
+                       // Remove a callback from the list
+                       remove: function() {
+                               if ( list ) {
+                                       jQuery.each( arguments, function( _, arg ) {
+                                               var index;
+                                               while( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) {
+                                                       list.splice( index, 1 );
+                                                       // Handle firing indexes
+                                                       if ( firing ) {
+                                                               if ( index <= firingLength ) {
+                                                                       firingLength--;
+                                                               }
+                                                               if ( index <= firingIndex ) {
+                                                                       firingIndex--;
+                                                               }
+                                                       }
+                                               }
+                                       });
+                               }
+                               return this;
+                       },
+                       // Control if a given callback is in the list
+                       has: function( fn ) {
+                               return jQuery.inArray( fn, list ) > -1;
+                       },
+                       // Remove all callbacks from the list
+                       empty: function() {
+                               list = [];
+                               return this;
+                       },
+                       // Have the list do nothing anymore
+                       disable: function() {
+                               list = stack = memory = undefined;
+                               return this;
+                       },
+                       // Is it disabled?
+                       disabled: function() {
+                               return !list;
+                       },
+                       // Lock the list in its current state
+                       lock: function() {
+                               stack = undefined;
+                               if ( !memory ) {
+                                       self.disable();
+                               }
+                               return this;
+                       },
+                       // Is it locked?
+                       locked: function() {
+                               return !stack;
+                       },
+                       // Call all callbacks with the given context and arguments
+                       fireWith: function( context, args ) {
+                               args = args || [];
+                               args = [ context, args.slice ? args.slice() : args ];
+                               if ( list && ( !fired || stack ) ) {
+                                       if ( firing ) {
+                                               stack.push( args );
+                                       } else {
+                                               fire( args );
+                                       }
+                               }
+                               return this;
+                       },
+                       // Call all the callbacks with the given arguments
+                       fire: function() {
+                               self.fireWith( this, arguments );
+                               return this;
+                       },
+                       // To know if the callbacks have already been called at least once
+                       fired: function() {
+                               return !!fired;
+                       }
+               };
+
+       return self;
+};
+jQuery.extend({
+
+       Deferred: function( func ) {
+               var tuples = [
+                               // action, add listener, listener list, final state
+                               [ "resolve", "done", jQuery.Callbacks("once memory"), "resolved" ],
+                               [ "reject", "fail", jQuery.Callbacks("once memory"), "rejected" ],
+                               [ "notify", "progress", jQuery.Callbacks("memory") ]
+                       ],
+                       state = "pending",
+                       promise = {
+                               state: function() {
+                                       return state;
+                               },
+                               always: function() {
+                                       deferred.done( arguments ).fail( arguments );
+                                       return this;
+                               },
+                               then: function( /* fnDone, fnFail, fnProgress */ ) {
+                                       var fns = arguments;
+                                       return jQuery.Deferred(function( newDefer ) {
+                                               jQuery.each( tuples, function( i, tuple ) {
+                                                       var action = tuple[ 0 ],
+                                                               fn = fns[ i ];
+                                                       // deferred[ done | fail | progress ] for forwarding actions to newDefer
+                                                       deferred[ tuple[1] ]( jQuery.isFunction( fn ) ?
+                                                               function() {
+                                                                       var returned = fn.apply( this, arguments );
+                                                                       if ( returned && jQuery.isFunction( returned.promise ) ) {
+                                                                               returned.promise()
+                                                                                       .done( newDefer.resolve )
+                                                                                       .fail( newDefer.reject )
+                                                                                       .progress( newDefer.notify );
+                                                                       } else {
+                                                                               newDefer[ action + "With" ]( this === deferred ? newDefer : this, [ returned ] );
+                                                                       }
+                                                               } :
+                                                               newDefer[ action ]
+                                                       );
+                                               });
+                                               fns = null;
+                                       }).promise();
+                               },
+                               // Get a promise for this deferred
+                               // If obj is provided, the promise aspect is added to the object
+                               promise: function( obj ) {
+                                       return obj != null ? jQuery.extend( obj, promise ) : promise;
+                               }
+                       },
+                       deferred = {};
+
+               // Keep pipe for back-compat
+               promise.pipe = promise.then;
+
+               // Add list-specific methods
+               jQuery.each( tuples, function( i, tuple ) {
+                       var list = tuple[ 2 ],
+                               stateString = tuple[ 3 ];
+
+                       // promise[ done | fail | progress ] = list.add
+                       promise[ tuple[1] ] = list.add;
+
+                       // Handle state
+                       if ( stateString ) {
+                               list.add(function() {
+                                       // state = [ resolved | rejected ]
+                                       state = stateString;
+
+                               // [ reject_list | resolve_list ].disable; progress_list.lock
+                               }, tuples[ i ^ 1 ][ 2 ].disable, tuples[ 2 ][ 2 ].lock );
+                       }
+
+                       // deferred[ resolve | reject | notify ] = list.fire
+                       deferred[ tuple[0] ] = list.fire;
+                       deferred[ tuple[0] + "With" ] = list.fireWith;
+               });
+
+               // Make the deferred a promise
+               promise.promise( deferred );
+
+               // Call given func if any
+               if ( func ) {
+                       func.call( deferred, deferred );
+               }
+
+               // All done!
+               return deferred;
+       },
+
+       // Deferred helper
+       when: function( subordinate /* , ..., subordinateN */ ) {
+               var i = 0,
+                       resolveValues = core_slice.call( arguments ),
+                       length = resolveValues.length,
+
+                       // the count of uncompleted subordinates
+                       remaining = length !== 1 || ( subordinate && jQuery.isFunction( subordinate.promise ) ) ? length : 0,
+
+                       // the master Deferred. If resolveValues consist of only a single Deferred, just use that.
+                       deferred = remaining === 1 ? subordinate : jQuery.Deferred(),
+
+                       // Update function for both resolve and progress values
+                       updateFunc = function( i, contexts, values ) {
+                               return function( value ) {
+                                       contexts[ i ] = this;
+                                       values[ i ] = arguments.length > 1 ? core_slice.call( arguments ) : value;
+                                       if( values === progressValues ) {
+                                               deferred.notifyWith( contexts, values );
+                                       } else if ( !( --remaining ) ) {
+                                               deferred.resolveWith( contexts, values );
+                                       }
+                               };
+                       },
+
+                       progressValues, progressContexts, resolveContexts;
+
+               // add listeners to Deferred subordinates; treat others as resolved
+               if ( length > 1 ) {
+                       progressValues = new Array( length );
+                       progressContexts = new Array( length );
+                       resolveContexts = new Array( length );
+                       for ( ; i < length; i++ ) {
+                               if ( resolveValues[ i ] && jQuery.isFunction( resolveValues[ i ].promise ) ) {
+                                       resolveValues[ i ].promise()
+                                               .done( updateFunc( i, resolveContexts, resolveValues ) )
+                                               .fail( deferred.reject )
+                                               .progress( updateFunc( i, progressContexts, progressValues ) );
+                               } else {
+                                       --remaining;
+                               }
+                       }
+               }
+
+               // if we're not waiting on anything, resolve the master
+               if ( !remaining ) {
+                       deferred.resolveWith( resolveContexts, resolveValues );
+               }
+
+               return deferred.promise();
+       }
+});
+jQuery.support = (function() {
+
+       var support,
+               all,
+               a,
+               select,
+               opt,
+               input,
+               fragment,
+               eventName,
+               i,
+               isSupported,
+               clickFn,
+               div = document.createElement("div");
+
+       // Setup
+       div.setAttribute( "className", "t" );
+       div.innerHTML = "  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>";
+
+       // Support tests won't run in some limited or non-browser environments
+       all = div.getElementsByTagName("*");
+       a = div.getElementsByTagName("a")[ 0 ];
+       if ( !all || !a || !all.length ) {
+               return {};
+       }
+
+       // First batch of tests
+       select = document.createElement("select");
+       opt = select.appendChild( document.createElement("option") );
+       input = div.getElementsByTagName("input")[ 0 ];
+
+       a.style.cssText = "top:1px;float:left;opacity:.5";
+       support = {
+               // IE strips leading whitespace when .innerHTML is used
+               leadingWhitespace: ( div.firstChild.nodeType === 3 ),
+
+               // Make sure that tbody elements aren't automatically inserted
+               // IE will insert them into empty tables
+               tbody: !div.getElementsByTagName("tbody").length,
+
+               // Make sure that link elements get serialized correctly by innerHTML
+               // This requires a wrapper element in IE
+               htmlSerialize: !!div.getElementsByTagName("link").length,
+
+               // Get the style information from getAttribute
+               // (IE uses .cssText instead)
+               style: /top/.test( a.getAttribute("style") ),
+
+               // Make sure that URLs aren't manipulated
+               // (IE normalizes it by default)
+               hrefNormalized: ( a.getAttribute("href") === "/a" ),
+
+               // Make sure that element opacity exists
+               // (IE uses filter instead)
+               // Use a regex to work around a WebKit issue. See #5145
+               opacity: /^0.5/.test( a.style.opacity ),
+
+               // Verify style float existence
+               // (IE uses styleFloat instead of cssFloat)
+               cssFloat: !!a.style.cssFloat,
+
+               // Make sure that if no value is specified for a checkbox
+               // that it defaults to "on".
+               // (WebKit defaults to "" instead)
+               checkOn: ( input.value === "on" ),
+
+               // Make sure that a selected-by-default option has a working selected property.
+               // (WebKit defaults to false instead of true, IE too, if it's in an optgroup)
+               optSelected: opt.selected,
+
+               // Test setAttribute on camelCase class. If it works, we need attrFixes when doing get/setAttribute (ie6/7)
+               getSetAttribute: div.className !== "t",
+
+               // Tests for enctype support on a form (#6743)
+               enctype: !!document.createElement("form").enctype,
+
+               // Makes sure cloning an html5 element does not cause problems
+               // Where outerHTML is undefined, this still works
+               html5Clone: document.createElement("nav").cloneNode( true ).outerHTML !== "<:nav></:nav>",
+
+               // jQuery.support.boxModel DEPRECATED in 1.8 since we don't support Quirks Mode
+               boxModel: ( document.compatMode === "CSS1Compat" ),
+
+               // Will be defined later
+               submitBubbles: true,
+               changeBubbles: true,
+               focusinBubbles: false,
+               deleteExpando: true,
+               noCloneEvent: true,
+               inlineBlockNeedsLayout: false,
+               shrinkWrapBlocks: false,
+               reliableMarginRight: true,
+               boxSizingReliable: true,
+               pixelPosition: false
+       };
+
+       // Make sure checked status is properly cloned
+       input.checked = true;
+       support.noCloneChecked = input.cloneNode( true ).checked;
+
+       // Make sure that the options inside disabled selects aren't marked as disabled
+       // (WebKit marks them as disabled)
+       select.disabled = true;
+       support.optDisabled = !opt.disabled;
+
+       // Test to see if it's possible to delete an expando from an element
+       // Fails in Internet Explorer
+       try {
+               delete div.test;
+       } catch( e ) {
+               support.deleteExpando = false;
+       }
+
+       if ( !div.addEventListener && div.attachEvent && div.fireEvent ) {
+               div.attachEvent( "onclick", clickFn = function() {
+                       // Cloning a node shouldn't copy over any
+                       // bound event handlers (IE does this)
+                       support.noCloneEvent = false;
+               });
+               div.cloneNode( true ).fireEvent("onclick");
+               div.detachEvent( "onclick", clickFn );
+       }
+
+       // Check if a radio maintains its value
+       // after being appended to the DOM
+       input = document.createElement("input");
+       input.value = "t";
+       input.setAttribute( "type", "radio" );
+       support.radioValue = input.value === "t";
+
+       input.setAttribute( "checked", "checked" );
+
+       // #11217 - WebKit loses check when the name is after the checked attribute
+       input.setAttribute( "name", "t" );
+
+       div.appendChild( input );
+       fragment = document.createDocumentFragment();
+       fragment.appendChild( div.lastChild );
+
+       // WebKit doesn't clone checked state correctly in fragments
+       support.checkClone = fragment.cloneNode( true ).cloneNode( true ).lastChild.checked;
+
+       // Check if a disconnected checkbox will retain its checked
+       // value of true after appended to the DOM (IE6/7)
+       support.appendChecked = input.checked;
+
+       fragment.removeChild( input );
+       fragment.appendChild( div );
+
+       // Technique from Juriy Zaytsev
+       // http://perfectionkills.com/detecting-event-support-without-browser-sniffing/
+       // We only care about the case where non-standard event systems
+       // are used, namely in IE. Short-circuiting here helps us to
+       // avoid an eval call (in setAttribute) which can cause CSP
+       // to go haywire. See: https://developer.mozilla.org/en/Security/CSP
+       if ( div.attachEvent ) {
+               for ( i in {
+                       submit: true,
+                       change: true,
+                       focusin: true
+               }) {
+                       eventName = "on" + i;
+                       isSupported = ( eventName in div );
+                       if ( !isSupported ) {
+                               div.setAttribute( eventName, "return;" );
+                               isSupported = ( typeof div[ eventName ] === "function" );
+                       }
+                       support[ i + "Bubbles" ] = isSupported;
+               }
+       }
+
+       // Run tests that need a body at doc ready
+       jQuery(function() {
+               var container, div, tds, marginDiv,
+                       divReset = "padding:0;margin:0;border:0;display:block;overflow:hidden;",
+                       body = document.getElementsByTagName("body")[0];
+
+               if ( !body ) {
+                       // Return for frameset docs that don't have a body
+                       return;
+               }
+
+               container = document.createElement("div");
+               container.style.cssText = "visibility:hidden;border:0;width:0;height:0;position:static;top:0;margin-top:1px";
+               body.insertBefore( container, body.firstChild );
+
+               // Construct the test element
+               div = document.createElement("div");
+               container.appendChild( div );
+
+               // Check if table cells still have offsetWidth/Height when they are set
+               // to display:none and there are still other visible table cells in a
+               // table row; if so, offsetWidth/Height are not reliable for use when
+               // determining if an element has been hidden directly using
+               // display:none (it is still safe to use offsets if a parent element is
+               // hidden; don safety goggles and see bug #4512 for more information).
+               // (only IE 8 fails this test)
+               div.innerHTML = "<table><tr><td></td><td>t</td></tr></table>";
+               tds = div.getElementsByTagName("td");
+               tds[ 0 ].style.cssText = "padding:0;margin:0;border:0;display:none";
+               isSupported = ( tds[ 0 ].offsetHeight === 0 );
+
+               tds[ 0 ].style.display = "";
+               tds[ 1 ].style.display = "none";
+
+               // Check if empty table cells still have offsetWidth/Height
+               // (IE <= 8 fail this test)
+               support.reliableHiddenOffsets = isSupported && ( tds[ 0 ].offsetHeight === 0 );
+
+               // Check box-sizing and margin behavior
+               div.innerHTML = "";
+               div.style.cssText = "box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;";
+               support.boxSizing = ( div.offsetWidth === 4 );
+               support.doesNotIncludeMarginInBodyOffset = ( body.offsetTop !== 1 );
+
+               // NOTE: To any future maintainer, we've window.getComputedStyle
+               // because jsdom on node.js will break without it.
+               if ( window.getComputedStyle ) {
+                       support.pixelPosition = ( window.getComputedStyle( div, null ) || {} ).top !== "1%";
+                       support.boxSizingReliable = ( window.getComputedStyle( div, null ) || { width: "4px" } ).width === "4px";
+
+                       // Check if div with explicit width and no margin-right incorrectly
+                       // gets computed margin-right based on width of container. For more
+                       // info see bug #3333
+                       // Fails in WebKit before Feb 2011 nightlies
+                       // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
+                       marginDiv = document.createElement("div");
+                       marginDiv.style.cssText = div.style.cssText = divReset;
+                       marginDiv.style.marginRight = marginDiv.style.width = "0";
+                       div.style.width = "1px";
+                       div.appendChild( marginDiv );
+                       support.reliableMarginRight =
+                               !parseFloat( ( window.getComputedStyle( marginDiv, null ) || {} ).marginRight );
+               }
+
+               if ( typeof div.style.zoom !== "undefined" ) {
+                       // Check if natively block-level elements act like inline-block
+                       // elements when setting their display to 'inline' and giving
+                       // them layout
+                       // (IE < 8 does this)
+                       div.innerHTML = "";
+                       div.style.cssText = divReset + "width:1px;padding:1px;display:inline;zoom:1";
+                       support.inlineBlockNeedsLayout = ( div.offsetWidth === 3 );
+
+                       // Check if elements with layout shrink-wrap their children
+                       // (IE 6 does this)
+                       div.style.display = "block";
+                       div.style.overflow = "visible";
+                       div.innerHTML = "<div></div>";
+                       div.firstChild.style.width = "5px";
+                       support.shrinkWrapBlocks = ( div.offsetWidth !== 3 );
+
+                       container.style.zoom = 1;
+               }
+
+               // Null elements to avoid leaks in IE
+               body.removeChild( container );
+               container = div = tds = marginDiv = null;
+       });
+
+       // Null elements to avoid leaks in IE
+       fragment.removeChild( div );
+       all = a = select = opt = input = fragment = div = null;
+
+       return support;
+})();
+var rbrace = /(?:\{[\s\S]*\}|\[[\s\S]*\])$/,
+       rmultiDash = /([A-Z])/g;
+
+jQuery.extend({
+       cache: {},
+
+       deletedIds: [],
+
+       // Remove at next major release (1.9/2.0)
+       uuid: 0,
+
+       // Unique for each copy of jQuery on the page
+       // Non-digits removed to match rinlinejQuery
+       expando: "jQuery" + ( jQuery.fn.jquery + Math.random() ).replace( /\D/g, "" ),
+
+       // The following elements throw uncatchable exceptions if you
+       // attempt to add expando properties to them.
+       noData: {
+               "embed": true,
+               // Ban all objects except for Flash (which handle expandos)
+               "object": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",
+               "applet": true
+       },
+
+       hasData: function( elem ) {
+               elem = elem.nodeType ? jQuery.cache[ elem[jQuery.expando] ] : elem[ jQuery.expando ];
+               return !!elem && !isEmptyDataObject( elem );
+       },
+
+       data: function( elem, name, data, pvt /* Internal Use Only */ ) {
+               if ( !jQuery.acceptData( elem ) ) {
+                       return;
+               }
+
+               var thisCache, ret,
+                       internalKey = jQuery.expando,
+                       getByName = typeof name === "string",
+
+                       // We have to handle DOM nodes and JS objects differently because IE6-7
+                       // can't GC object references properly across the DOM-JS boundary
+                       isNode = elem.nodeType,
+
+                       // Only DOM nodes need the global jQuery cache; JS object data is
+                       // attached directly to the object so GC can occur automatically
+                       cache = isNode ? jQuery.cache : elem,
+
+                       // Only defining an ID for JS objects if its cache already exists allows
+                       // the code to shortcut on the same path as a DOM node with no cache
+                       id = isNode ? elem[ internalKey ] : elem[ internalKey ] && internalKey;
+
+               // Avoid doing any more work than we need to when trying to get data on an
+               // object that has no data at all
+               if ( (!id || !cache[id] || (!pvt && !cache[id].data)) && getByName && data === undefined ) {
+                       return;
+               }
+
+               if ( !id ) {
+                       // Only DOM nodes need a new unique ID for each element since their data
+                       // ends up in the global cache
+                       if ( isNode ) {
+                               elem[ internalKey ] = id = jQuery.deletedIds.pop() || jQuery.guid++;
+                       } else {
+                               id = internalKey;
+                       }
+               }
+
+               if ( !cache[ id ] ) {
+                       cache[ id ] = {};
+
+                       // Avoids exposing jQuery metadata on plain JS objects when the object
+                       // is serialized using JSON.stringify
+                       if ( !isNode ) {
+                               cache[ id ].toJSON = jQuery.noop;
+                       }
+               }
+
+               // An object can be passed to jQuery.data instead of a key/value pair; this gets
+               // shallow copied over onto the existing cache
+               if ( typeof name === "object" || typeof name === "function" ) {
+                       if ( pvt ) {
+                               cache[ id ] = jQuery.extend( cache[ id ], name );
+                       } else {
+                               cache[ id ].data = jQuery.extend( cache[ id ].data, name );
+                       }
+               }
+
+               thisCache = cache[ id ];
+
+               // jQuery data() is stored in a separate object inside the object's internal data
+               // cache in order to avoid key collisions between internal data and user-defined
+               // data.
+               if ( !pvt ) {
+                       if ( !thisCache.data ) {
+                               thisCache.data = {};
+                       }
+
+                       thisCache = thisCache.data;
+               }
+
+               if ( data !== undefined ) {
+                       thisCache[ jQuery.camelCase( name ) ] = data;
+               }
+
+               // Check for both converted-to-camel and non-converted data property names
+               // If a data property was specified
+               if ( getByName ) {
+
+                       // First Try to find as-is property data
+                       ret = thisCache[ name ];
+
+                       // Test for null|undefined property data
+                       if ( ret == null ) {
+
+                               // Try to find the camelCased property
+                               ret = thisCache[ jQuery.camelCase( name ) ];
+                       }
+               } else {
+                       ret = thisCache;
+               }
+
+               return ret;
+       },
+
+       removeData: function( elem, name, pvt /* Internal Use Only */ ) {
+               if ( !jQuery.acceptData( elem ) ) {
+                       return;
+               }
+
+               var thisCache, i, l,
+
+                       isNode = elem.nodeType,
+
+                       // See jQuery.data for more information
+                       cache = isNode ? jQuery.cache : elem,
+                       id = isNode ? elem[ jQuery.expando ] : jQuery.expando;
+
+               // If there is already no cache entry for this object, there is no
+               // purpose in continuing
+               if ( !cache[ id ] ) {
+                       return;
+               }
+
+               if ( name ) {
+
+                       thisCache = pvt ? cache[ id ] : cache[ id ].data;
+
+                       if ( thisCache ) {
+
+                               // Support array or space separated string names for data keys
+                               if ( !jQuery.isArray( name ) ) {
+
+                                       // try the string as a key before any manipulation
+                                       if ( name in thisCache ) {
+                                               name = [ name ];
+                                       } else {
+
+                                               // split the camel cased version by spaces unless a key with the spaces exists
+                                               name = jQuery.camelCase( name );
+                                               if ( name in thisCache ) {
+                                                       name = [ name ];
+                                               } else {
+                                                       name = name.split(" ");
+                                               }
+                                       }
+                               }
+
+                               for ( i = 0, l = name.length; i < l; i++ ) {
+                                       delete thisCache[ name[i] ];
+                               }
+
+                               // If there is no data left in the cache, we want to continue
+                               // and let the cache object itself get destroyed
+                               if ( !( pvt ? isEmptyDataObject : jQuery.isEmptyObject )( thisCache ) ) {
+                                       return;
+                               }
+                       }
+               }
+
+               // See jQuery.data for more information
+               if ( !pvt ) {
+                       delete cache[ id ].data;
+
+                       // Don't destroy the parent cache unless the internal data object
+                       // had been the only thing left in it
+                       if ( !isEmptyDataObject( cache[ id ] ) ) {
+                               return;
+                       }
+               }
+
+               // Destroy the cache
+               if ( isNode ) {
+                       jQuery.cleanData( [ elem ], true );
+
+               // Use delete when supported for expandos or `cache` is not a window per isWindow (#10080)
+               } else if ( jQuery.support.deleteExpando || cache != cache.window ) {
+                       delete cache[ id ];
+
+               // When all else fails, null
+               } else {
+                       cache[ id ] = null;
+               }
+       },
+
+       // For internal use only.
+       _data: function( elem, name, data ) {
+               return jQuery.data( elem, name, data, true );
+       },
+
+       // A method for determining if a DOM node can handle the data expando
+       acceptData: function( elem ) {
+               var noData = elem.nodeName && jQuery.noData[ elem.nodeName.toLowerCase() ];
+
+               // nodes accept data unless otherwise specified; rejection can be conditional
+               return !noData || noData !== true && elem.getAttribute("classid") === noData;
+       }
+});
+
+jQuery.fn.extend({
+       data: function( key, value ) {
+               var parts, part, attr, name, l,
+                       elem = this[0],
+                       i = 0,
+                       data = null;
+
+               // Gets all values
+               if ( key === undefined ) {
+                       if ( this.length ) {
+                               data = jQuery.data( elem );
+
+                               if ( elem.nodeType === 1 && !jQuery._data( elem, "parsedAttrs" ) ) {
+                                       attr = elem.attributes;
+                                       for ( l = attr.length; i < l; i++ ) {
+                                               name = attr[i].name;
+
+                                               if ( !name.indexOf( "data-" ) ) {
+                                                       name = jQuery.camelCase( name.substring(5) );
+
+                                                       dataAttr( elem, name, data[ name ] );
+                                               }
+                                       }
+                                       jQuery._data( elem, "parsedAttrs", true );
+                               }
+                       }
+
+                       return data;
+               }
+
+               // Sets multiple values
+               if ( typeof key === "object" ) {
+                       return this.each(function() {
+                               jQuery.data( this, key );
+                       });
+               }
+
+               parts = key.split( ".", 2 );
+               parts[1] = parts[1] ? "." + parts[1] : "";
+               part = parts[1] + "!";
+
+               return jQuery.access( this, function( value ) {
+
+                       if ( value === undefined ) {
+                               data = this.triggerHandler( "getData" + part, [ parts[0] ] );
+
+                               // Try to fetch any internally stored data first
+                               if ( data === undefined && elem ) {
+                                       data = jQuery.data( elem, key );
+                                       data = dataAttr( elem, key, data );
+                               }
+
+                               return data === undefined && parts[1] ?
+                                       this.data( parts[0] ) :
+                                       data;
+                       }
+
+                       parts[1] = value;
+                       this.each(function() {
+                               var self = jQuery( this );
+
+                               self.triggerHandler( "setData" + part, parts );
+                               jQuery.data( this, key, value );
+                               self.triggerHandler( "changeData" + part, parts );
+                       });
+               }, null, value, arguments.length > 1, null, false );
+       },
+
+       removeData: function( key ) {
+               return this.each(function() {
+                       jQuery.removeData( this, key );
+               });
+       }
+});
+
+function dataAttr( elem, key, data ) {
+       // If nothing was found internally, try to fetch any
+       // data from the HTML5 data-* attribute
+       if ( data === undefined && elem.nodeType === 1 ) {
+
+               var name = "data-" + key.replace( rmultiDash, "-$1" ).toLowerCase();
+
+               data = elem.getAttribute( name );
+
+               if ( typeof data === "string" ) {
+                       try {
+                               data = data === "true" ? true :
+                               data === "false" ? false :
+                               data === "null" ? null :
+                               // Only convert to a number if it doesn't change the string
+                               +data + "" === data ? +data :
+                               rbrace.test( data ) ? jQuery.parseJSON( data ) :
+                                       data;
+                       } catch( e ) {}
+
+                       // Make sure we set the data so it isn't changed later
+                       jQuery.data( elem, key, data );
+
+               } else {
+                       data = undefined;
+               }
+       }
+
+       return data;
+}
+
+// checks a cache object for emptiness
+function isEmptyDataObject( obj ) {
+       var name;
+       for ( name in obj ) {
+
+               // if the public data object is empty, the private is still empty
+               if ( name === "data" && jQuery.isEmptyObject( obj[name] ) ) {
+                       continue;
+               }
+               if ( name !== "toJSON" ) {
+                       return false;
+               }
+       }
+
+       return true;
+}
+jQuery.extend({
+       queue: function( elem, type, data ) {
+               var queue;
+
+               if ( elem ) {
+                       type = ( type || "fx" ) + "queue";
+                       queue = jQuery._data( elem, type );
+
+                       // Speed up dequeue by getting out quickly if this is just a lookup
+                       if ( data ) {
+                               if ( !queue || jQuery.isArray(data) ) {
+                                       queue = jQuery._data( elem, type, jQuery.makeArray(data) );
+                               } else {
+                                       queue.push( data );
+                               }
+                       }
+                       return queue || [];
+               }
+       },
+
+       dequeue: function( elem, type ) {
+               type = type || "fx";
+
+               var queue = jQuery.queue( elem, type ),
+                       startLength = queue.length,
+                       fn = queue.shift(),
+                       hooks = jQuery._queueHooks( elem, type ),
+                       next = function() {
+                               jQuery.dequeue( elem, type );
+                       };
+
+               // If the fx queue is dequeued, always remove the progress sentinel
+               if ( fn === "inprogress" ) {
+                       fn = queue.shift();
+                       startLength--;
+               }
+
+               if ( fn ) {
+
+                       // Add a progress sentinel to prevent the fx queue from being
+                       // automatically dequeued
+                       if ( type === "fx" ) {
+                               queue.unshift( "inprogress" );
+                       }
+
+                       // clear up the last queue stop function
+                       delete hooks.stop;
+                       fn.call( elem, next, hooks );
+               }
+
+               if ( !startLength && hooks ) {
+                       hooks.empty.fire();
+               }
+       },
+
+       // not intended for public consumption - generates a queueHooks object, or returns the current one
+       _queueHooks: function( elem, type ) {
+               var key = type + "queueHooks";
+               return jQuery._data( elem, key ) || jQuery._data( elem, key, {
+                       empty: jQuery.Callbacks("once memory").add(function() {
+                               jQuery.removeData( elem, type + "queue", true );
+                               jQuery.removeData( elem, key, true );
+                       })
+               });
+       }
+});
+
+jQuery.fn.extend({
+       queue: function( type, data ) {
+               var setter = 2;
+
+               if ( typeof type !== "string" ) {
+                       data = type;
+                       type = "fx";
+                       setter--;
+               }
+
+               if ( arguments.length < setter ) {
+                       return jQuery.queue( this[0], type );
+               }
+
+               return data === undefined ?
+                       this :
+                       this.each(function() {
+                               var queue = jQuery.queue( this, type, data );
+
+                               // ensure a hooks for this queue
+                               jQuery._queueHooks( this, type );
+
+                               if ( type === "fx" && queue[0] !== "inprogress" ) {
+                                       jQuery.dequeue( this, type );
+                               }
+                       });
+       },
+       dequeue: function( type ) {
+               return this.each(function() {
+                       jQuery.dequeue( this, type );
+               });
+       },
+       // Based off of the plugin by Clint Helfers, with permission.
+       // http://blindsignals.com/index.php/2009/07/jquery-delay/
+       delay: function( time, type ) {
+               time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;
+               type = type || "fx";
+
+               return this.queue( type, function( next, hooks ) {
+                       var timeout = setTimeout( next, time );
+                       hooks.stop = function() {
+                               clearTimeout( timeout );
+                       };
+               });
+       },
+       clearQueue: function( type ) {
+               return this.queue( type || "fx", [] );
+       },
+       // Get a promise resolved when queues of a certain type
+       // are emptied (fx is the type by default)
+       promise: function( type, obj ) {
+               var tmp,
+                       count = 1,
+                       defer = jQuery.Deferred(),
+                       elements = this,
+                       i = this.length,
+                       resolve = function() {
+                               if ( !( --count ) ) {
+                                       defer.resolveWith( elements, [ elements ] );
+                               }
+                       };
+
+               if ( typeof type !== "string" ) {
+                       obj = type;
+                       type = undefined;
+               }
+               type = type || "fx";
+
+               while( i-- ) {
+                       tmp = jQuery._data( elements[ i ], type + "queueHooks" );
+                       if ( tmp && tmp.empty ) {
+                               count++;
+                               tmp.empty.add( resolve );
+                       }
+               }
+               resolve();
+               return defer.promise( obj );
+       }
+});
+var nodeHook, boolHook, fixSpecified,
+       rclass = /[\t\r\n]/g,
+       rreturn = /\r/g,
+       rtype = /^(?:button|input)$/i,
+       rfocusable = /^(?:button|input|object|select|textarea)$/i,
+       rclickable = /^a(?:rea|)$/i,
+       rboolean = /^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,
+       getSetAttribute = jQuery.support.getSetAttribute;
+
+jQuery.fn.extend({
+       attr: function( name, value ) {
+               return jQuery.access( this, jQuery.attr, name, value, arguments.length > 1 );
+       },
+
+       removeAttr: function( name ) {
+               return this.each(function() {
+                       jQuery.removeAttr( this, name );
+               });
+       },
+
+       prop: function( name, value ) {
+               return jQuery.access( this, jQuery.prop, name, value, arguments.length > 1 );
+       },
+
+       removeProp: function( name ) {
+               name = jQuery.propFix[ name ] || name;
+               return this.each(function() {
+                       // try/catch handles cases where IE balks (such as removing a property on window)
+                       try {
+                               this[ name ] = undefined;
+                               delete this[ name ];
+                       } catch( e ) {}
+               });
+       },
+
+       addClass: function( value ) {
+               var classNames, i, l, elem,
+                       setClass, c, cl;
+
+               if ( jQuery.isFunction( value ) ) {
+                       return this.each(function( j ) {
+                               jQuery( this ).addClass( value.call(this, j, this.className) );
+                       });
+               }
+
+               if ( value && typeof value === "string" ) {
+                       classNames = value.split( core_rspace );
+
+                       for ( i = 0, l = this.length; i < l; i++ ) {
+                               elem = this[ i ];
+
+                               if ( elem.nodeType === 1 ) {
+                                       if ( !elem.className && classNames.length === 1 ) {
+                                               elem.className = value;
+
+                                       } else {
+                                               setClass = " " + elem.className + " ";
+
+                                               for ( c = 0, cl = classNames.length; c < cl; c++ ) {
+                                                       if ( setClass.indexOf( " " + classNames[ c ] + " " ) < 0 ) {
+                                                               setClass += classNames[ c ] + " ";
+                                                       }
+                                               }
+                                               elem.className = jQuery.trim( setClass );
+                                       }
+                               }
+                       }
+               }
+
+               return this;
+       },
+
+       removeClass: function( value ) {
+               var removes, className, elem, c, cl, i, l;
+
+               if ( jQuery.isFunction( value ) ) {
+                       return this.each(function( j ) {
+                               jQuery( this ).removeClass( value.call(this, j, this.className) );
+                       });
+               }
+               if ( (value && typeof value === "string") || value === undefined ) {
+                       removes = ( value || "" ).split( core_rspace );
+
+                       for ( i = 0, l = this.length; i < l; i++ ) {
+                               elem = this[ i ];
+                               if ( elem.nodeType === 1 && elem.className ) {
+
+                                       className = (" " + elem.className + " ").replace( rclass, " " );
+
+                                       // loop over each item in the removal list
+                                       for ( c = 0, cl = removes.length; c < cl; c++ ) {
+                                               // Remove until there is nothing to remove,
+                                               while ( className.indexOf(" " + removes[ c ] + " ") >= 0 ) {
+                                                       className = className.replace( " " + removes[ c ] + " " , " " );
+                                               }
+                                       }
+                                       elem.className = value ? jQuery.trim( className ) : "";
+                               }
+                       }
+               }
+
+               return this;
+       },
+
+       toggleClass: function( value, stateVal ) {
+               var type = typeof value,
+                       isBool = typeof stateVal === "boolean";
+
+               if ( jQuery.isFunction( value ) ) {
+                       return this.each(function( i ) {
+                               jQuery( this ).toggleClass( value.call(this, i, this.className, stateVal), stateVal );
+                       });
+               }
+
+               return this.each(function() {
+                       if ( type === "string" ) {
+                               // toggle individual class names
+                               var className,
+                                       i = 0,
+                                       self = jQuery( this ),
+                                       state = stateVal,
+                                       classNames = value.split( core_rspace );
+
+                               while ( (className = classNames[ i++ ]) ) {
+                                       // check each className given, space separated list
+                                       state = isBool ? state : !self.hasClass( className );
+                                       self[ state ? "addClass" : "removeClass" ]( className );
+                               }
+
+                       } else if ( type === "undefined" || type === "boolean" ) {
+                               if ( this.className ) {
+                                       // store className if set
+                                       jQuery._data( this, "__className__", this.className );
+                               }
+
+                               // toggle whole className
+                               this.className = this.className || value === false ? "" : jQuery._data( this, "__className__" ) || "";
+                       }
+               });
+       },
+
+       hasClass: function( selector ) {
+               var className = " " + selector + " ",
+                       i = 0,
+                       l = this.length;
+               for ( ; i < l; i++ ) {
+                       if ( this[i].nodeType === 1 && (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) >= 0 ) {
+                               return true;
+                       }
+               }
+
+               return false;
+       },
+
+       val: function( value ) {
+               var hooks, ret, isFunction,
+                       elem = this[0];
+
+               if ( !arguments.length ) {
+                       if ( elem ) {
+                               hooks = jQuery.valHooks[ elem.type ] || jQuery.valHooks[ elem.nodeName.toLowerCase() ];
+
+                               if ( hooks && "get" in hooks && (ret = hooks.get( elem, "value" )) !== undefined ) {
+                                       return ret;
+                               }
+
+                               ret = elem.value;
+
+                               return typeof ret === "string" ?
+                                       // handle most common string cases
+                                       ret.replace(rreturn, "") :
+                                       // handle cases where value is null/undef or number
+                                       ret == null ? "" : ret;
+                       }
+
+                       return;
+               }
+
+               isFunction = jQuery.isFunction( value );
+
+               return this.each(function( i ) {
+                       var val,
+                               self = jQuery(this);
+
+                       if ( this.nodeType !== 1 ) {
+                               return;
+                       }
+
+                       if ( isFunction ) {
+                               val = value.call( this, i, self.val() );
+                       } else {
+                               val = value;
+                       }
+
+                       // Treat null/undefined as ""; convert numbers to string
+                       if ( val == null ) {
+                               val = "";
+                       } else if ( typeof val === "number" ) {
+                               val += "";
+                       } else if ( jQuery.isArray( val ) ) {
+                               val = jQuery.map(val, function ( value ) {
+                                       return value == null ? "" : value + "";
+                               });
+                       }
+
+                       hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];
+
+                       // If set returns undefined, fall back to normal setting
+                       if ( !hooks || !("set" in hooks) || hooks.set( this, val, "value" ) === undefined ) {
+                               this.value = val;
+                       }
+               });
+       }
+});
+
+jQuery.extend({
+       valHooks: {
+               option: {
+                       get: function( elem ) {
+                               // attributes.value is undefined in Blackberry 4.7 but
+                               // uses .value. See #6932
+                               var val = elem.attributes.value;
+                               return !val || val.specified ? elem.value : elem.text;
+                       }
+               },
+               select: {
+                       get: function( elem ) {
+                               var value, option,
+                                       options = elem.options,
+                                       index = elem.selectedIndex,
+                                       one = elem.type === "select-one" || index < 0,
+                                       values = one ? null : [],
+                                       max = one ? index + 1 : options.length,
+                                       i = index < 0 ?
+                                               max :
+                                               one ? index : 0;
+
+                               // Loop through all the selected options
+                               for ( ; i < max; i++ ) {
+                                       option = options[ i ];
+
+                                       // oldIE doesn't update selected after form reset (#2551)
+                                       if ( ( option.selected || i === index ) &&
+                                                       // Don't return options that are disabled or in a disabled optgroup
+                                                       ( jQuery.support.optDisabled ? !option.disabled : option.getAttribute("disabled") === null ) &&
+                                                       ( !option.parentNode.disabled || !jQuery.nodeName( option.parentNode, "optgroup" ) ) ) {
+
+                                               // Get the specific value for the option
+                                               value = jQuery( option ).val();
+
+                                               // We don't need an array for one selects
+                                               if ( one ) {
+                                                       return value;
+                                               }
+
+                                               // Multi-Selects return an array
+                                               values.push( value );
+                                       }
+                               }
+
+                               return values;
+                       },
+
+                       set: function( elem, value ) {
+                               var values = jQuery.makeArray( value );
+
+                               jQuery(elem).find("option").each(function() {
+                                       this.selected = jQuery.inArray( jQuery(this).val(), values ) >= 0;
+                               });
+
+                               if ( !values.length ) {
+                                       elem.selectedIndex = -1;
+                               }
+                               return values;
+                       }
+               }
+       },
+
+       // Unused in 1.8, left in so attrFn-stabbers won't die; remove in 1.9
+       attrFn: {},
+
+       attr: function( elem, name, value, pass ) {
+               var ret, hooks, notxml,
+                       nType = elem.nodeType;
+
+               // don't get/set attributes on text, comment and attribute nodes
+               if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
+                       return;
+               }
+
+               if ( pass && jQuery.isFunction( jQuery.fn[ name ] ) ) {
+                       return jQuery( elem )[ name ]( value );
+               }
+
+               // Fallback to prop when attributes are not supported
+               if ( typeof elem.getAttribute === "undefined" ) {
+                       return jQuery.prop( elem, name, value );
+               }
+
+               notxml = nType !== 1 || !jQuery.isXMLDoc( elem );
+
+               // All attributes are lowercase
+               // Grab necessary hook if one is defined
+               if ( notxml ) {
+                       name = name.toLowerCase();
+                       hooks = jQuery.attrHooks[ name ] || ( rboolean.test( name ) ? boolHook : nodeHook );
+               }
+
+               if ( value !== undefined ) {
+
+                       if ( value === null ) {
+                               jQuery.removeAttr( elem, name );
+                               return;
+
+                       } else if ( hooks && "set" in hooks && notxml && (ret = hooks.set( elem, value, name )) !== undefined ) {
+                               return ret;
+
+                       } else {
+                               elem.setAttribute( name, value + "" );
+                               return value;
+                       }
+
+               } else if ( hooks && "get" in hooks && notxml && (ret = hooks.get( elem, name )) !== null ) {
+                       return ret;
+
+               } else {
+
+                       ret = elem.getAttribute( name );
+
+                       // Non-existent attributes return null, we normalize to undefined
+                       return ret === null ?
+                               undefined :
+                               ret;
+               }
+       },
+
+       removeAttr: function( elem, value ) {
+               var propName, attrNames, name, isBool,
+                       i = 0;
+
+               if ( value && elem.nodeType === 1 ) {
+
+                       attrNames = value.split( core_rspace );
+
+                       for ( ; i < attrNames.length; i++ ) {
+                               name = attrNames[ i ];
+
+                               if ( name ) {
+                                       propName = jQuery.propFix[ name ] || name;
+                                       isBool = rboolean.test( name );
+
+                                       // See #9699 for explanation of this approach (setting first, then removal)
+                                       // Do not do this for boolean attributes (see #10870)
+                                       if ( !isBool ) {
+                                               jQuery.attr( elem, name, "" );
+                                       }
+                                       elem.removeAttribute( getSetAttribute ? name : propName );
+
+                                       // Set corresponding property to false for boolean attributes
+                                       if ( isBool && propName in elem ) {
+                                               elem[ propName ] = false;
+                                       }
+                               }
+                       }
+               }
+       },
+
+       attrHooks: {
+               type: {
+                       set: function( elem, value ) {
+                               // We can't allow the type property to be changed (since it causes problems in IE)
+                               if ( rtype.test( elem.nodeName ) && elem.parentNode ) {
+                                       jQuery.error( "type property can't be changed" );
+                               } else if ( !jQuery.support.radioValue && value === "radio" && jQuery.nodeName(elem, "input") ) {
+                                       // Setting the type on a radio button after the value resets the value in IE6-9
+                                       // Reset value to it's default in case type is set after value
+                                       // This is for element creation
+                                       var val = elem.value;
+                                       elem.setAttribute( "type", value );
+                                       if ( val ) {
+                                               elem.value = val;
+                                       }
+                                       return value;
+                               }
+                       }
+               },
+               // Use the value property for back compat
+               // Use the nodeHook for button elements in IE6/7 (#1954)
+               value: {
+                       get: function( elem, name ) {
+                               if ( nodeHook && jQuery.nodeName( elem, "button" ) ) {
+                                       return nodeHook.get( elem, name );
+                               }
+                               return name in elem ?
+                                       elem.value :
+                                       null;
+                       },
+                       set: function( elem, value, name ) {
+                               if ( nodeHook && jQuery.nodeName( elem, "button" ) ) {
+                                       return nodeHook.set( elem, value, name );
+                               }
+                               // Does not return so that setAttribute is also used
+                               elem.value = value;
+                       }
+               }
+       },
+
+       propFix: {
+               tabindex: "tabIndex",
+               readonly: "readOnly",
+               "for": "htmlFor",
+               "class": "className",
+               maxlength: "maxLength",
+               cellspacing: "cellSpacing",
+               cellpadding: "cellPadding",
+               rowspan: "rowSpan",
+               colspan: "colSpan",
+               usemap: "useMap",
+               frameborder: "frameBorder",
+               contenteditable: "contentEditable"
+       },
+
+       prop: function( elem, name, value ) {
+               var ret, hooks, notxml,
+                       nType = elem.nodeType;
+
+               // don't get/set properties on text, comment and attribute nodes
+               if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
+                       return;
+               }
+
+               notxml = nType !== 1 || !jQuery.isXMLDoc( elem );
+
+               if ( notxml ) {
+                       // Fix name and attach hooks
+                       name = jQuery.propFix[ name ] || name;
+                       hooks = jQuery.propHooks[ name ];
+               }
+
+               if ( value !== undefined ) {
+                       if ( hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) {
+                               return ret;
+
+                       } else {
+                               return ( elem[ name ] = value );
+                       }
+
+               } else {
+                       if ( hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ) {
+                               return ret;
+
+                       } else {
+                               return elem[ name ];
+                       }
+               }
+       },
+
+       propHooks: {
+               tabIndex: {
+                       get: function( elem ) {
+                               // elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set
+                               // http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/
+                               var attributeNode = elem.getAttributeNode("tabindex");
+
+                               return attributeNode && attributeNode.specified ?
+                                       parseInt( attributeNode.value, 10 ) :
+                                       rfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ?
+                                               0 :
+                                               undefined;
+                       }
+               }
+       }
+});
+
+// Hook for boolean attributes
+boolHook = {
+       get: function( elem, name ) {
+               // Align boolean attributes with corresponding properties
+               // Fall back to attribute presence where some booleans are not supported
+               var attrNode,
+                       property = jQuery.prop( elem, name );
+               return property === true || typeof property !== "boolean" && ( attrNode = elem.getAttributeNode(name) ) && attrNode.nodeValue !== false ?
+                       name.toLowerCase() :
+                       undefined;
+       },
+       set: function( elem, value, name ) {
+               var propName;
+               if ( value === false ) {
+                       // Remove boolean attributes when set to false
+                       jQuery.removeAttr( elem, name );
+               } else {
+                       // value is true since we know at this point it's type boolean and not false
+                       // Set boolean attributes to the same name and set the DOM property
+                       propName = jQuery.propFix[ name ] || name;
+                       if ( propName in elem ) {
+                               // Only set the IDL specifically if it already exists on the element
+                               elem[ propName ] = true;
+                       }
+
+                       elem.setAttribute( name, name.toLowerCase() );
+               }
+               return name;
+       }
+};
+
+// IE6/7 do not support getting/setting some attributes with get/setAttribute
+if ( !getSetAttribute ) {
+
+       fixSpecified = {
+               name: true,
+               id: true,
+               coords: true
+       };
+
+       // Use this for any attribute in IE6/7
+       // This fixes almost every IE6/7 issue
+       nodeHook = jQuery.valHooks.button = {
+               get: function( elem, name ) {
+                       var ret;
+                       ret = elem.getAttributeNode( name );
+                       return ret && ( fixSpecified[ name ] ? ret.value !== "" : ret.specified ) ?
+                               ret.value :
+                               undefined;
+               },
+               set: function( elem, value, name ) {
+                       // Set the existing or create a new attribute node
+                       var ret = elem.getAttributeNode( name );
+                       if ( !ret ) {
+                               ret = document.createAttribute( name );
+                               elem.setAttributeNode( ret );
+                       }
+                       return ( ret.value = value + "" );
+               }
+       };
+
+       // Set width and height to auto instead of 0 on empty string( Bug #8150 )
+       // This is for removals
+       jQuery.each([ "width", "height" ], function( i, name ) {
+               jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], {
+                       set: function( elem, value ) {
+                               if ( value === "" ) {
+                                       elem.setAttribute( name, "auto" );
+                                       return value;
+                               }
+                       }
+               });
+       });
+
+       // Set contenteditable to false on removals(#10429)
+       // Setting to empty string throws an error as an invalid value
+       jQuery.attrHooks.contenteditable = {
+               get: nodeHook.get,
+               set: function( elem, value, name ) {
+                       if ( value === "" ) {
+                               value = "false";
+                       }
+                       nodeHook.set( elem, value, name );
+               }
+       };
+}
+
+
+// Some attributes require a special call on IE
+if ( !jQuery.support.hrefNormalized ) {
+       jQuery.each([ "href", "src", "width", "height" ], function( i, name ) {
+               jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], {
+                       get: function( elem ) {
+                               var ret = elem.getAttribute( name, 2 );
+                               return ret === null ? undefined : ret;
+                       }
+               });
+       });
+}
+
+if ( !jQuery.support.style ) {
+       jQuery.attrHooks.style = {
+               get: function( elem ) {
+                       // Return undefined in the case of empty string
+                       // Normalize to lowercase since IE uppercases css property names
+                       return elem.style.cssText.toLowerCase() || undefined;
+               },
+               set: function( elem, value ) {
+                       return ( elem.style.cssText = value + "" );
+               }
+       };
+}
+
+// Safari mis-reports the default selected property of an option
+// Accessing the parent's selectedIndex property fixes it
+if ( !jQuery.support.optSelected ) {
+       jQuery.propHooks.selected = jQuery.extend( jQuery.propHooks.selected, {
+               get: function( elem ) {
+                       var parent = elem.parentNode;
+
+                       if ( parent ) {
+                               parent.selectedIndex;
+
+                               // Make sure that it also works with optgroups, see #5701
+                               if ( parent.parentNode ) {
+                                       parent.parentNode.selectedIndex;
+                               }
+                       }
+                       return null;
+               }
+       });
+}
+
+// IE6/7 call enctype encoding
+if ( !jQuery.support.enctype ) {
+       jQuery.propFix.enctype = "encoding";
+}
+
+// Radios and checkboxes getter/setter
+if ( !jQuery.support.checkOn ) {
+       jQuery.each([ "radio", "checkbox" ], function() {
+               jQuery.valHooks[ this ] = {
+                       get: function( elem ) {
+                               // Handle the case where in Webkit "" is returned instead of "on" if a value isn't specified
+                               return elem.getAttribute("value") === null ? "on" : elem.value;
+                       }
+               };
+       });
+}
+jQuery.each([ "radio", "checkbox" ], function() {
+       jQuery.valHooks[ this ] = jQuery.extend( jQuery.valHooks[ this ], {
+               set: function( elem, value ) {
+                       if ( jQuery.isArray( value ) ) {
+                               return ( elem.checked = jQuery.inArray( jQuery(elem).val(), value ) >= 0 );
+                       }
+               }
+       });
+});
+var rformElems = /^(?:textarea|input|select)$/i,
+       rtypenamespace = /^([^\.]*|)(?:\.(.+)|)$/,
+       rhoverHack = /(?:^|\s)hover(\.\S+|)\b/,
+       rkeyEvent = /^key/,
+       rmouseEvent = /^(?:mouse|contextmenu)|click/,
+       rfocusMorph = /^(?:focusinfocus|focusoutblur)$/,
+       hoverHack = function( events ) {
+               return jQuery.event.special.hover ? events : events.replace( rhoverHack, "mouseenter$1 mouseleave$1" );
+       };
+
+/*
+ * Helper functions for managing events -- not part of the public interface.
+ * Props to Dean Edwards' addEvent library for many of the ideas.
+ */
+jQuery.event = {
+
+       add: function( elem, types, handler, data, selector ) {
+
+               var elemData, eventHandle, events,
+                       t, tns, type, namespaces, handleObj,
+                       handleObjIn, handlers, special;
+
+               // Don't attach events to noData or text/comment nodes (allow plain objects tho)
+               if ( elem.nodeType === 3 || elem.nodeType === 8 || !types || !handler || !(elemData = jQuery._data( elem )) ) {
+                       return;
+               }
+
+               // Caller can pass in an object of custom data in lieu of the handler
+               if ( handler.handler ) {
+                       handleObjIn = handler;
+                       handler = handleObjIn.handler;
+                       selector = handleObjIn.selector;
+               }
+
+               // Make sure that the handler has a unique ID, used to find/remove it later
+               if ( !handler.guid ) {
+                       handler.guid = jQuery.guid++;
+               }
+
+               // Init the element's event structure and main handler, if this is the first
+               events = elemData.events;
+               if ( !events ) {
+                       elemData.events = events = {};
+               }
+               eventHandle = elemData.handle;
+               if ( !eventHandle ) {
+                       elemData.handle = eventHandle = function( e ) {
+                               // Discard the second event of a jQuery.event.trigger() and
+                               // when an event is called after a page has unloaded
+                               return typeof jQuery !== "undefined" && (!e || jQuery.event.triggered !== e.type) ?
+                                       jQuery.event.dispatch.apply( eventHandle.elem, arguments ) :
+                                       undefined;
+                       };
+                       // Add elem as a property of the handle fn to prevent a memory leak with IE non-native events
+                       eventHandle.elem = elem;
+               }
+
+               // Handle multiple events separated by a space
+               // jQuery(...).bind("mouseover mouseout", fn);
+               types = jQuery.trim( hoverHack(types) ).split( " " );
+               for ( t = 0; t < types.length; t++ ) {
+
+                       tns = rtypenamespace.exec( types[t] ) || [];
+                       type = tns[1];
+                       namespaces = ( tns[2] || "" ).split( "." ).sort();
+
+                       // If event changes its type, use the special event handlers for the changed type
+                       special = jQuery.event.special[ type ] || {};
+
+                       // If selector defined, determine special event api type, otherwise given type
+                       type = ( selector ? special.delegateType : special.bindType ) || type;
+
+                       // Update special based on newly reset type
+                       special = jQuery.event.special[ type ] || {};
+
+                       // handleObj is passed to all event handlers
+                       handleObj = jQuery.extend({
+                               type: type,
+                               origType: tns[1],
+                               data: data,
+                               handler: handler,
+                               guid: handler.guid,
+                               selector: selector,
+                               needsContext: selector && jQuery.expr.match.needsContext.test( selector ),
+                               namespace: namespaces.join(".")
+                       }, handleObjIn );
+
+                       // Init the event handler queue if we're the first
+                       handlers = events[ type ];
+                       if ( !handlers ) {
+                               handlers = events[ type ] = [];
+                               handlers.delegateCount = 0;
+
+                               // Only use addEventListener/attachEvent if the special events handler returns false
+                               if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) {
+                                       // Bind the global event handler to the element
+                                       if ( elem.addEventListener ) {
+                                               elem.addEventListener( type, eventHandle, false );
+
+                                       } else if ( elem.attachEvent ) {
+                                               elem.attachEvent( "on" + type, eventHandle );
+                                       }
+                               }
+                       }
+
+                       if ( special.add ) {
+                               special.add.call( elem, handleObj );
+
+                               if ( !handleObj.handler.guid ) {
+                                       handleObj.handler.guid = handler.guid;
+                               }
+                       }
+
+                       // Add to the element's handler list, delegates in front
+                       if ( selector ) {
+                               handlers.splice( handlers.delegateCount++, 0, handleObj );
+                       } else {
+                               handlers.push( handleObj );
+                       }
+
+                       // Keep track of which events have ever been used, for event optimization
+                       jQuery.event.global[ type ] = true;
+               }
+
+               // Nullify elem to prevent memory leaks in IE
+               elem = null;
+       },
+
+       global: {},
+
+       // Detach an event or set of events from an element
+       remove: function( elem, types, handler, selector, mappedTypes ) {
+
+               var t, tns, type, origType, namespaces, origCount,
+                       j, events, special, eventType, handleObj,
+                       elemData = jQuery.hasData( elem ) && jQuery._data( elem );
+
+               if ( !elemData || !(events = elemData.events) ) {
+                       return;
+               }
+
+               // Once for each type.namespace in types; type may be omitted
+               types = jQuery.trim( hoverHack( types || "" ) ).split(" ");
+               for ( t = 0; t < types.length; t++ ) {
+                       tns = rtypenamespace.exec( types[t] ) || [];
+                       type = origType = tns[1];
+                       namespaces = tns[2];
+
+                       // Unbind all events (on this namespace, if provided) for the element
+                       if ( !type ) {
+                               for ( type in events ) {
+                                       jQuery.event.remove( elem, type + types[ t ], handler, selector, true );
+                               }
+                               continue;
+                       }
+
+                       special = jQuery.event.special[ type ] || {};
+                       type = ( selector? special.delegateType : special.bindType ) || type;
+                       eventType = events[ type ] || [];
+                       origCount = eventType.length;
+                       namespaces = namespaces ? new RegExp("(^|\\.)" + namespaces.split(".").sort().join("\\.(?:.*\\.|)") + "(\\.|$)") : null;
+
+                       // Remove matching events
+                       for ( j = 0; j < eventType.length; j++ ) {
+                               handleObj = eventType[ j ];
+
+                               if ( ( mappedTypes || origType === handleObj.origType ) &&
+                                        ( !handler || handler.guid === handleObj.guid ) &&
+                                        ( !namespaces || namespaces.test( handleObj.namespace ) ) &&
+                                        ( !selector || selector === handleObj.selector || selector === "**" && handleObj.selector ) ) {
+                                       eventType.splice( j--, 1 );
+
+                                       if ( handleObj.selector ) {
+                                               eventType.delegateCount--;
+                                       }
+                                       if ( special.remove ) {
+                                               special.remove.call( elem, handleObj );
+                                       }
+                               }
+                       }
+
+                       // Remove generic event handler if we removed something and no more handlers exist
+                       // (avoids potential for endless recursion during removal of special event handlers)
+                       if ( eventType.length === 0 && origCount !== eventType.length ) {
+                               if ( !special.teardown || special.teardown.call( elem, namespaces, elemData.handle ) === false ) {
+                                       jQuery.removeEvent( elem, type, elemData.handle );
+                               }
+
+                               delete events[ type ];
+                       }
+               }
+
+               // Remove the expando if it's no longer used
+               if ( jQuery.isEmptyObject( events ) ) {
+                       delete elemData.handle;
+
+                       // removeData also checks for emptiness and clears the expando if empty
+                       // so use it instead of delete
+                       jQuery.removeData( elem, "events", true );
+               }
+       },
+
+       // Events that are safe to short-circuit if no handlers are attached.
+       // Native DOM events should not be added, they may have inline handlers.
+       customEvent: {
+               "getData": true,
+               "setData": true,
+               "changeData": true
+       },
+
+       trigger: function( event, data, elem, onlyHandlers ) {
+               // Don't do events on text and comment nodes
+               if ( elem && (elem.nodeType === 3 || elem.nodeType === 8) ) {
+                       return;
+               }
+
+               // Event object or event type
+               var cache, exclusive, i, cur, old, ontype, special, handle, eventPath, bubbleType,
+                       type = event.type || event,
+                       namespaces = [];
+
+               // focus/blur morphs to focusin/out; ensure we're not firing them right now
+               if ( rfocusMorph.test( type + jQuery.event.triggered ) ) {
+                       return;
+               }
+
+               if ( type.indexOf( "!" ) >= 0 ) {
+                       // Exclusive events trigger only for the exact event (no namespaces)
+                       type = type.slice(0, -1);
+                       exclusive = true;
+               }
+
+               if ( type.indexOf( "." ) >= 0 ) {
+                       // Namespaced trigger; create a regexp to match event type in handle()
+                       namespaces = type.split(".");
+                       type = namespaces.shift();
+                       namespaces.sort();
+               }
+
+               if ( (!elem || jQuery.event.customEvent[ type ]) && !jQuery.event.global[ type ] ) {
+                       // No jQuery handlers for this event type, and it can't have inline handlers
+                       return;
+               }
+
+               // Caller can pass in an Event, Object, or just an event type string
+               event = typeof event === "object" ?
+                       // jQuery.Event object
+                       event[ jQuery.expando ] ? event :
+                       // Object literal
+                       new jQuery.Event( type, event ) :
+                       // Just the event type (string)
+                       new jQuery.Event( type );
+
+               event.type = type;
+               event.isTrigger = true;
+               event.exclusive = exclusive;
+               event.namespace = namespaces.join( "." );
+               event.namespace_re = event.namespace? new RegExp("(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)") : null;
+               ontype = type.indexOf( ":" ) < 0 ? "on" + type : "";
+
+               // Handle a global trigger
+               if ( !elem ) {
+
+                       // TODO: Stop taunting the data cache; remove global events and always attach to document
+                       cache = jQuery.cache;
+                       for ( i in cache ) {
+                               if ( cache[ i ].events && cache[ i ].events[ type ] ) {
+                                       jQuery.event.trigger( event, data, cache[ i ].handle.elem, true );
+                               }
+                       }
+                       return;
+               }
+
+               // Clean up the event in case it is being reused
+               event.result = undefined;
+               if ( !event.target ) {
+                       event.target = elem;
+               }
+
+               // Clone any incoming data and prepend the event, creating the handler arg list
+               data = data != null ? jQuery.makeArray( data ) : [];
+               data.unshift( event );
+
+               // Allow special events to draw outside the lines
+               special = jQuery.event.special[ type ] || {};
+               if ( special.trigger && special.trigger.apply( elem, data ) === false ) {
+                       return;
+               }
+
+               // Determine event propagation path in advance, per W3C events spec (#9951)
+               // Bubble up to document, then to window; watch for a global ownerDocument var (#9724)
+               eventPath = [[ elem, special.bindType || type ]];
+               if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) {
+
+                       bubbleType = special.delegateType || type;
+                       cur = rfocusMorph.test( bubbleType + type ) ? elem : elem.parentNode;
+                       for ( old = elem; cur; cur = cur.parentNode ) {
+                               eventPath.push([ cur, bubbleType ]);
+                               old = cur;
+                       }
+
+                       // Only add window if we got to document (e.g., not plain obj or detached DOM)
+                       if ( old === (elem.ownerDocument || document) ) {
+                               eventPath.push([ old.defaultView || old.parentWindow || window, bubbleType ]);
+                       }
+               }
+
+               // Fire handlers on the event path
+               for ( i = 0; i < eventPath.length && !event.isPropagationStopped(); i++ ) {
+
+                       cur = eventPath[i][0];
+                       event.type = eventPath[i][1];
+
+                       handle = ( jQuery._data( cur, "events" ) || {} )[ event.type ] && jQuery._data( cur, "handle" );
+                       if ( handle ) {
+                               handle.apply( cur, data );
+                       }
+                       // Note that this is a bare JS function and not a jQuery handler
+                       handle = ontype && cur[ ontype ];
+                       if ( handle && jQuery.acceptData( cur ) && handle.apply && handle.apply( cur, data ) === false ) {
+                               event.preventDefault();
+                       }
+               }
+               event.type = type;
+
+               // If nobody prevented the default action, do it now
+               if ( !onlyHandlers && !event.isDefaultPrevented() ) {
+
+                       if ( (!special._default || special._default.apply( elem.ownerDocument, data ) === false) &&
+                               !(type === "click" && jQuery.nodeName( elem, "a" )) && jQuery.acceptData( elem ) ) {
+
+                               // Call a native DOM method on the target with the same name name as the event.
+                               // Can't use an .isFunction() check here because IE6/7 fails that test.
+                               // Don't do default actions on window, that's where global variables be (#6170)
+                               // IE<9 dies on focus/blur to hidden element (#1486)
+                               if ( ontype && elem[ type ] && ((type !== "focus" && type !== "blur") || event.target.offsetWidth !== 0) && !jQuery.isWindow( elem ) ) {
+
+                                       // Don't re-trigger an onFOO event when we call its FOO() method
+                                       old = elem[ ontype ];
+
+                                       if ( old ) {
+                                               elem[ ontype ] = null;
+                                       }
+
+                                       // Prevent re-triggering of the same event, since we already bubbled it above
+                                       jQuery.event.triggered = type;
+                                       elem[ type ]();
+                                       jQuery.event.triggered = undefined;
+
+                                       if ( old ) {
+                                               elem[ ontype ] = old;
+                                       }
+                               }
+                       }
+               }
+
+               return event.result;
+       },
+
+       dispatch: function( event ) {
+
+               // Make a writable jQuery.Event from the native event object
+               event = jQuery.event.fix( event || window.event );
+
+               var i, j, cur, ret, selMatch, matched, matches, handleObj, sel, related,
+                       handlers = ( (jQuery._data( this, "events" ) || {} )[ event.type ] || []),
+                       delegateCount = handlers.delegateCount,
+                       args = core_slice.call( arguments ),
+                       run_all = !event.exclusive && !event.namespace,
+                       special = jQuery.event.special[ event.type ] || {},
+                       handlerQueue = [];
+
+               // Use the fix-ed jQuery.Event rather than the (read-only) native event
+               args[0] = event;
+               event.delegateTarget = this;
+
+               // Call the preDispatch hook for the mapped type, and let it bail if desired
+               if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {
+                       return;
+               }
+
+               // Determine handlers that should run if there are delegated events
+               // Avoid non-left-click bubbling in Firefox (#3861)
+               if ( delegateCount && !(event.button && event.type === "click") ) {
+
+                       for ( cur = event.target; cur != this; cur = cur.parentNode || this ) {
+
+                               // Don't process clicks (ONLY) on disabled elements (#6911, #8165, #11382, #11764)
+                               if ( cur.disabled !== true || event.type !== "click" ) {
+                                       selMatch = {};
+                                       matches = [];
+                                       for ( i = 0; i < delegateCount; i++ ) {
+                                               handleObj = handlers[ i ];
+                                               sel = handleObj.selector;
+
+                                               if ( selMatch[ sel ] === undefined ) {
+                                                       selMatch[ sel ] = handleObj.needsContext ?
+                                                               jQuery( sel, this ).index( cur ) >= 0 :
+                                                               jQuery.find( sel, this, null, [ cur ] ).length;
+                                               }
+                                               if ( selMatch[ sel ] ) {
+                                                       matches.push( handleObj );
+                                               }
+                                       }
+                                       if ( matches.length ) {
+                                               handlerQueue.push({ elem: cur, matches: matches });
+                                       }
+                               }
+                       }
+               }
+
+               // Add the remaining (directly-bound) handlers
+               if ( handlers.length > delegateCount ) {
+                       handlerQueue.push({ elem: this, matches: handlers.slice( delegateCount ) });
+               }
+
+               // Run delegates first; they may want to stop propagation beneath us
+               for ( i = 0; i < handlerQueue.length && !event.isPropagationStopped(); i++ ) {
+                       matched = handlerQueue[ i ];
+                       event.currentTarget = matched.elem;
+
+                       for ( j = 0; j < matched.matches.length && !event.isImmediatePropagationStopped(); j++ ) {
+                               handleObj = matched.matches[ j ];
+
+                               // Triggered event must either 1) be non-exclusive and have no namespace, or
+                               // 2) have namespace(s) a subset or equal to those in the bound event (both can have no namespace).
+                               if ( run_all || (!event.namespace && !handleObj.namespace) || event.namespace_re && event.namespace_re.test( handleObj.namespace ) ) {
+
+                                       event.data = handleObj.data;
+                                       event.handleObj = handleObj;
+
+                                       ret = ( (jQuery.event.special[ handleObj.origType ] || {}).handle || handleObj.handler )
+                                                       .apply( matched.elem, args );
+
+                                       if ( ret !== undefined ) {
+                                               event.result = ret;
+                                               if ( ret === false ) {
+                                                       event.preventDefault();
+                                                       event.stopPropagation();
+                                               }
+                                       }
+                               }
+                       }
+               }
+
+               // Call the postDispatch hook for the mapped type
+               if ( special.postDispatch ) {
+                       special.postDispatch.call( this, event );
+               }
+
+               return event.result;
+       },
+
+       // Includes some event props shared by KeyEvent and MouseEvent
+       // *** attrChange attrName relatedNode srcElement  are not normalized, non-W3C, deprecated, will be removed in 1.8 ***
+       props: "attrChange attrName relatedNode srcElement altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),
+
+       fixHooks: {},
+
+       keyHooks: {
+               props: "char charCode key keyCode".split(" "),
+               filter: function( event, original ) {
+
+                       // Add which for key events
+                       if ( event.which == null ) {
+                               event.which = original.charCode != null ? original.charCode : original.keyCode;
+                       }
+
+                       return event;
+               }
+       },
+
+       mouseHooks: {
+               props: "button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),
+               filter: function( event, original ) {
+                       var eventDoc, doc, body,
+                               button = original.button,
+                               fromElement = original.fromElement;
+
+                       // Calculate pageX/Y if missing and clientX/Y available
+                       if ( event.pageX == null && original.clientX != null ) {
+                               eventDoc = event.target.ownerDocument || document;
+                               doc = eventDoc.documentElement;
+                               body = eventDoc.body;
+
+                               event.pageX = original.clientX + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - ( doc && doc.clientLeft || body && body.clientLeft || 0 );
+                               event.pageY = original.clientY + ( doc && doc.scrollTop  || body && body.scrollTop  || 0 ) - ( doc && doc.clientTop  || body && body.clientTop  || 0 );
+                       }
+
+                       // Add relatedTarget, if necessary
+                       if ( !event.relatedTarget && fromElement ) {
+                               event.relatedTarget = fromElement === event.target ? original.toElement : fromElement;
+                       }
+
+                       // Add which for click: 1 === left; 2 === middle; 3 === right
+                       // Note: button is not normalized, so don't use it
+                       if ( !event.which && button !== undefined ) {
+                               event.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) );
+                       }
+
+                       return event;
+               }
+       },
+
+       fix: function( event ) {
+               if ( event[ jQuery.expando ] ) {
+                       return event;
+               }
+
+               // Create a writable copy of the event object and normalize some properties
+               var i, prop,
+                       originalEvent = event,
+                       fixHook = jQuery.event.fixHooks[ event.type ] || {},
+                       copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props;
+
+               event = jQuery.Event( originalEvent );
+
+               for ( i = copy.length; i; ) {
+                       prop = copy[ --i ];
+                       event[ prop ] = originalEvent[ prop ];
+               }
+
+               // Fix target property, if necessary (#1925, IE 6/7/8 & Safari2)
+               if ( !event.target ) {
+                       event.target = originalEvent.srcElement || document;
+               }
+
+               // Target should not be a text node (#504, Safari)
+               if ( event.target.nodeType === 3 ) {
+                       event.target = event.target.parentNode;
+               }
+
+               // For mouse/key events, metaKey==false if it's undefined (#3368, #11328; IE6/7/8)
+               event.metaKey = !!event.metaKey;
+
+               return fixHook.filter? fixHook.filter( event, originalEvent ) : event;
+       },
+
+       special: {
+               load: {
+                       // Prevent triggered image.load events from bubbling to window.load
+                       noBubble: true
+               },
+
+               focus: {
+                       delegateType: "focusin"
+               },
+               blur: {
+                       delegateType: "focusout"
+               },
+
+               beforeunload: {
+                       setup: function( data, namespaces, eventHandle ) {
+                               // We only want to do this special case on windows
+                               if ( jQuery.isWindow( this ) ) {
+                                       this.onbeforeunload = eventHandle;
+                               }
+                       },
+
+                       teardown: function( namespaces, eventHandle ) {
+                               if ( this.onbeforeunload === eventHandle ) {
+                                       this.onbeforeunload = null;
+                               }
+                       }
+               }
+       },
+
+       simulate: function( type, elem, event, bubble ) {
+               // Piggyback on a donor event to simulate a different one.
+               // Fake originalEvent to avoid donor's stopPropagation, but if the
+               // simulated event prevents default then we do the same on the donor.
+               var e = jQuery.extend(
+                       new jQuery.Event(),
+                       event,
+                       { type: type,
+                               isSimulated: true,
+                               originalEvent: {}
+                       }
+               );
+               if ( bubble ) {
+                       jQuery.event.trigger( e, null, elem );
+               } else {
+                       jQuery.event.dispatch.call( elem, e );
+               }
+               if ( e.isDefaultPrevented() ) {
+                       event.preventDefault();
+               }
+       }
+};
+
+// Some plugins are using, but it's undocumented/deprecated and will be removed.
+// The 1.7 special event interface should provide all the hooks needed now.
+jQuery.event.handle = jQuery.event.dispatch;
+
+jQuery.removeEvent = document.removeEventListener ?
+       function( elem, type, handle ) {
+               if ( elem.removeEventListener ) {
+                       elem.removeEventListener( type, handle, false );
+               }
+       } :
+       function( elem, type, handle ) {
+               var name = "on" + type;
+
+               if ( elem.detachEvent ) {
+
+                       // #8545, #7054, preventing memory leaks for custom events in IE6-8
+                       // detachEvent needed property on element, by name of that event, to properly expose it to GC
+                       if ( typeof elem[ name ] === "undefined" ) {
+                               elem[ name ] = null;
+                       }
+
+                       elem.detachEvent( name, handle );
+               }
+       };
+
+jQuery.Event = function( src, props ) {
+       // Allow instantiation without the 'new' keyword
+       if ( !(this instanceof jQuery.Event) ) {
+               return new jQuery.Event( src, props );
+       }
+
+       // Event object
+       if ( src && src.type ) {
+               this.originalEvent = src;
+               this.type = src.type;
+
+               // Events bubbling up the document may have been marked as prevented
+               // by a handler lower down the tree; reflect the correct value.
+               this.isDefaultPrevented = ( src.defaultPrevented || src.returnValue === false ||
+                       src.getPreventDefault && src.getPreventDefault() ) ? returnTrue : returnFalse;
+
+       // Event type
+       } else {
+               this.type = src;
+       }
+
+       // Put explicitly provided properties onto the event object
+       if ( props ) {
+               jQuery.extend( this, props );
+       }
+
+       // Create a timestamp if incoming event doesn't have one
+       this.timeStamp = src && src.timeStamp || jQuery.now();
+
+       // Mark it as fixed
+       this[ jQuery.expando ] = true;
+};
+
+function returnFalse() {
+       return false;
+}
+function returnTrue() {
+       return true;
+}
+
+// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
+// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
+jQuery.Event.prototype = {
+       preventDefault: function() {
+               this.isDefaultPrevented = returnTrue;
+
+               var e = this.originalEvent;
+               if ( !e ) {
+                       return;
+               }
+
+               // if preventDefault exists run it on the original event
+               if ( e.preventDefault ) {
+                       e.preventDefault();
+
+               // otherwise set the returnValue property of the original event to false (IE)
+               } else {
+                       e.returnValue = false;
+               }
+       },
+       stopPropagation: function() {
+               this.isPropagationStopped = returnTrue;
+
+               var e = this.originalEvent;
+               if ( !e ) {
+                       return;
+               }
+               // if stopPropagation exists run it on the original event
+               if ( e.stopPropagation ) {
+                       e.stopPropagation();
+               }
+               // otherwise set the cancelBubble property of the original event to true (IE)
+               e.cancelBubble = true;
+       },
+       stopImmediatePropagation: function() {
+               this.isImmediatePropagationStopped = returnTrue;
+               this.stopPropagation();
+       },
+       isDefaultPrevented: returnFalse,
+       isPropagationStopped: returnFalse,
+       isImmediatePropagationStopped: returnFalse
+};
+
+// Create mouseenter/leave events using mouseover/out and event-time checks
+jQuery.each({
+       mouseenter: "mouseover",
+       mouseleave: "mouseout"
+}, function( orig, fix ) {
+       jQuery.event.special[ orig ] = {
+               delegateType: fix,
+               bindType: fix,
+
+               handle: function( event ) {
+                       var ret,
+                               target = this,
+                               related = event.relatedTarget,
+                               handleObj = event.handleObj,
+                               selector = handleObj.selector;
+
+                       // For mousenter/leave call the handler if related is outside the target.
+                       // NB: No relatedTarget if the mouse left/entered the browser window
+                       if ( !related || (related !== target && !jQuery.contains( target, related )) ) {
+                               event.type = handleObj.origType;
+                               ret = handleObj.handler.apply( this, arguments );
+                               event.type = fix;
+                       }
+                       return ret;
+               }
+       };
+});
+
+// IE submit delegation
+if ( !jQuery.support.submitBubbles ) {
+
+       jQuery.event.special.submit = {
+               setup: function() {
+                       // Only need this for delegated form submit events
+                       if ( jQuery.nodeName( this, "form" ) ) {
+                               return false;
+                       }
+
+                       // Lazy-add a submit handler when a descendant form may potentially be submitted
+                       jQuery.event.add( this, "click._submit keypress._submit", function( e ) {
+                               // Node name check avoids a VML-related crash in IE (#9807)
+                               var elem = e.target,
+                                       form = jQuery.nodeName( elem, "input" ) || jQuery.nodeName( elem, "button" ) ? elem.form : undefined;
+                               if ( form && !jQuery._data( form, "_submit_attached" ) ) {
+                                       jQuery.event.add( form, "submit._submit", function( event ) {
+                                               event._submit_bubble = true;
+                                       });
+                                       jQuery._data( form, "_submit_attached", true );
+                               }
+                       });
+                       // return undefined since we don't need an event listener
+               },
+
+               postDispatch: function( event ) {
+                       // If form was submitted by the user, bubble the event up the tree
+                       if ( event._submit_bubble ) {
+                               delete event._submit_bubble;
+                               if ( this.parentNode && !event.isTrigger ) {
+                                       jQuery.event.simulate( "submit", this.parentNode, event, true );
+                               }
+                       }
+               },
+
+               teardown: function() {
+                       // Only need this for delegated form submit events
+                       if ( jQuery.nodeName( this, "form" ) ) {
+                               return false;
+                       }
+
+                       // Remove delegated handlers; cleanData eventually reaps submit handlers attached above
+                       jQuery.event.remove( this, "._submit" );
+               }
+       };
+}
+
+// IE change delegation and checkbox/radio fix
+if ( !jQuery.support.changeBubbles ) {
+
+       jQuery.event.special.change = {
+
+               setup: function() {
+
+                       if ( rformElems.test( this.nodeName ) ) {
+                               // IE doesn't fire change on a check/radio until blur; trigger it on click
+                               // after a propertychange. Eat the blur-change in special.change.handle.
+                               // This still fires onchange a second time for check/radio after blur.
+                               if ( this.type === "checkbox" || this.type === "radio" ) {
+                                       jQuery.event.add( this, "propertychange._change", function( event ) {
+                                               if ( event.originalEvent.propertyName === "checked" ) {
+                                                       this._just_changed = true;
+                                               }
+                                       });
+                                       jQuery.event.add( this, "click._change", function( event ) {
+                                               if ( this._just_changed && !event.isTrigger ) {
+                                                       this._just_changed = false;
+                                               }
+                                               // Allow triggered, simulated change events (#11500)
+                                               jQuery.event.simulate( "change", this, event, true );
+                                       });
+                               }
+                               return false;
+                       }
+                       // Delegated event; lazy-add a change handler on descendant inputs
+                       jQuery.event.add( this, "beforeactivate._change", function( e ) {
+                               var elem = e.target;
+
+                               if ( rformElems.test( elem.nodeName ) && !jQuery._data( elem, "_change_attached" ) ) {
+                                       jQuery.event.add( elem, "change._change", function( event ) {
+                                               if ( this.parentNode && !event.isSimulated && !event.isTrigger ) {
+                                                       jQuery.event.simulate( "change", this.parentNode, event, true );
+                                               }
+                                       });
+                                       jQuery._data( elem, "_change_attached", true );
+                               }
+                       });
+               },
+
+               handle: function( event ) {
+                       var elem = event.target;
+
+                       // Swallow native change events from checkbox/radio, we already triggered them above
+                       if ( this !== elem || event.isSimulated || event.isTrigger || (elem.type !== "radio" && elem.type !== "checkbox") ) {
+                               return event.handleObj.handler.apply( this, arguments );
+                       }
+               },
+
+               teardown: function() {
+                       jQuery.event.remove( this, "._change" );
+
+                       return !rformElems.test( this.nodeName );
+               }
+       };
+}
+
+// Create "bubbling" focus and blur events
+if ( !jQuery.support.focusinBubbles ) {
+       jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) {
+
+               // Attach a single capturing handler while someone wants focusin/focusout
+               var attaches = 0,
+                       handler = function( event ) {
+                               jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ), true );
+                       };
+
+               jQuery.event.special[ fix ] = {
+                       setup: function() {
+                               if ( attaches++ === 0 ) {
+                                       document.addEventListener( orig, handler, true );
+                               }
+                       },
+                       teardown: function() {
+                               if ( --attaches === 0 ) {
+                                       document.removeEventListener( orig, handler, true );
+                               }
+                       }
+               };
+       });
+}
+
+jQuery.fn.extend({
+
+       on: function( types, selector, data, fn, /*INTERNAL*/ one ) {
+               var origFn, type;
+
+               // Types can be a map of types/handlers
+               if ( typeof types === "object" ) {
+                       // ( types-Object, selector, data )
+                       if ( typeof selector !== "string" ) { // && selector != null
+                               // ( types-Object, data )
+                               data = data || selector;
+                               selector = undefined;
+                       }
+                       for ( type in types ) {
+                               this.on( type, selector, data, types[ type ], one );
+                       }
+                       return this;
+               }
+
+               if ( data == null && fn == null ) {
+                       // ( types, fn )
+                       fn = selector;
+                       data = selector = undefined;
+               } else if ( fn == null ) {
+                       if ( typeof selector === "string" ) {
+                               // ( types, selector, fn )
+                               fn = data;
+                               data = undefined;
+                       } else {
+                               // ( types, data, fn )
+                               fn = data;
+                               data = selector;
+                               selector = undefined;
+                       }
+               }
+               if ( fn === false ) {
+                       fn = returnFalse;
+               } else if ( !fn ) {
+                       return this;
+               }
+
+               if ( one === 1 ) {
+                       origFn = fn;
+                       fn = function( event ) {
+                               // Can use an empty set, since event contains the info
+                               jQuery().off( event );
+                               return origFn.apply( this, arguments );
+                       };
+                       // Use same guid so caller can remove using origFn
+                       fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );
+               }
+               return this.each( function() {
+                       jQuery.event.add( this, types, fn, data, selector );
+               });
+       },
+       one: function( types, selector, data, fn ) {
+               return this.on( types, selector, data, fn, 1 );
+       },
+       off: function( types, selector, fn ) {
+               var handleObj, type;
+               if ( types && types.preventDefault && types.handleObj ) {
+                       // ( event )  dispatched jQuery.Event
+                       handleObj = types.handleObj;
+                       jQuery( types.delegateTarget ).off(
+                               handleObj.namespace ? handleObj.origType + "." + handleObj.namespace : handleObj.origType,
+                               handleObj.selector,
+                               handleObj.handler
+                       );
+                       return this;
+               }
+               if ( typeof types === "object" ) {
+                       // ( types-object [, selector] )
+                       for ( type in types ) {
+                               this.off( type, selector, types[ type ] );
+                       }
+                       return this;
+               }
+               if ( selector === false || typeof selector === "function" ) {
+                       // ( types [, fn] )
+                       fn = selector;
+                       selector = undefined;
+               }
+               if ( fn === false ) {
+                       fn = returnFalse;
+               }
+               return this.each(function() {
+                       jQuery.event.remove( this, types, fn, selector );
+               });
+       },
+
+       bind: function( types, data, fn ) {
+               return this.on( types, null, data, fn );
+       },
+       unbind: function( types, fn ) {
+               return this.off( types, null, fn );
+       },
+
+       live: function( types, data, fn ) {
+               jQuery( this.context ).on( types, this.selector, data, fn );
+               return this;
+       },
+       die: function( types, fn ) {
+               jQuery( this.context ).off( types, this.selector || "**", fn );
+               return this;
+       },
+
+       delegate: function( selector, types, data, fn ) {
+               return this.on( types, selector, data, fn );
+       },
+       undelegate: function( selector, types, fn ) {
+               // ( namespace ) or ( selector, types [, fn] )
+               return arguments.length === 1 ? this.off( selector, "**" ) : this.off( types, selector || "**", fn );
+       },
+
+       trigger: function( type, data ) {
+               return this.each(function() {
+                       jQuery.event.trigger( type, data, this );
+               });
+       },
+       triggerHandler: function( type, data ) {
+               if ( this[0] ) {
+                       return jQuery.event.trigger( type, data, this[0], true );
+               }
+       },
+
+       toggle: function( fn ) {
+               // Save reference to arguments for access in closure
+               var args = arguments,
+                       guid = fn.guid || jQuery.guid++,
+                       i = 0,
+                       toggler = function( event ) {
+                               // Figure out which function to execute
+                               var lastToggle = ( jQuery._data( this, "lastToggle" + fn.guid ) || 0 ) % i;
+                               jQuery._data( this, "lastToggle" + fn.guid, lastToggle + 1 );
+
+                               // Make sure that clicks stop
+                               event.preventDefault();
+
+                               // and execute the function
+                               return args[ lastToggle ].apply( this, arguments ) || false;
+                       };
+
+               // link all the functions, so any of them can unbind this click handler
+               toggler.guid = guid;
+               while ( i < args.length ) {
+                       args[ i++ ].guid = guid;
+               }
+
+               return this.click( toggler );
+       },
+
+       hover: function( fnOver, fnOut ) {
+               return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );
+       }
+});
+
+jQuery.each( ("blur focus focusin focusout load resize scroll unload click dblclick " +
+       "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +
+       "change select submit keydown keypress keyup error contextmenu").split(" "), function( i, name ) {
+
+       // Handle event binding
+       jQuery.fn[ name ] = function( data, fn ) {
+               if ( fn == null ) {
+                       fn = data;
+                       data = null;
+               }
+
+               return arguments.length > 0 ?
+                       this.on( name, null, data, fn ) :
+                       this.trigger( name );
+       };
+
+       if ( rkeyEvent.test( name ) ) {
+               jQuery.event.fixHooks[ name ] = jQuery.event.keyHooks;
+       }
+
+       if ( rmouseEvent.test( name ) ) {
+               jQuery.event.fixHooks[ name ] = jQuery.event.mouseHooks;
+       }
+});
+/*!\r
+ * Sizzle CSS Selector Engine\r
+ * Copyright 2012 jQuery Foundation and other contributors\r
+ * Released under the MIT license\r
+ * http://sizzlejs.com/\r
+ */\r
+(function( window, undefined ) {\r
+\r
+var cachedruns,\r
+       assertGetIdNotName,\r
+       Expr,\r
+       getText,\r
+       isXML,\r
+       contains,\r
+       compile,\r
+       sortOrder,\r
+       hasDuplicate,\r
+       outermostContext,\r
+\r
+       baseHasDuplicate = true,\r
+       strundefined = "undefined",\r
+\r
+       expando = ( "sizcache" + Math.random() ).replace( ".", "" ),\r
+\r
+       Token = String,\r
+       document = window.document,\r
+       docElem = document.documentElement,\r
+       dirruns = 0,\r
+       done = 0,\r
+       pop = [].pop,\r
+       push = [].push,\r
+       slice = [].slice,\r
+       // Use a stripped-down indexOf if a native one is unavailable\r
+       indexOf = [].indexOf || function( elem ) {\r
+               var i = 0,\r
+                       len = this.length;\r
+               for ( ; i < len; i++ ) {\r
+                       if ( this[i] === elem ) {\r
+                               return i;\r
+                       }\r
+               }\r
+               return -1;\r
+       },\r
+\r
+       // Augment a function for special use by Sizzle\r
+       markFunction = function( fn, value ) {\r
+               fn[ expando ] = value == null || value;\r
+               return fn;\r
+       },\r
+\r
+       createCache = function() {\r
+               var cache = {},\r
+                       keys = [];\r
+\r
+               return markFunction(function( key, value ) {\r
+                       // Only keep the most recent entries\r
+                       if ( keys.push( key ) > Expr.cacheLength ) {\r
+                               delete cache[ keys.shift() ];\r
+                       }\r
+\r
+                       // Retrieve with (key + " ") to avoid collision with native Object.prototype properties (see Issue #157)\r
+                       return (cache[ key + " " ] = value);\r
+               }, cache );\r
+       },\r
+\r
+       classCache = createCache(),\r
+       tokenCache = createCache(),\r
+       compilerCache = createCache(),\r
+\r
+       // Regex\r
+\r
+       // Whitespace characters http://www.w3.org/TR/css3-selectors/#whitespace\r
+       whitespace = "[\\x20\\t\\r\\n\\f]",\r
+       // http://www.w3.org/TR/css3-syntax/#characters\r
+       characterEncoding = "(?:\\\\.|[-\\w]|[^\\x00-\\xa0])+",\r
+\r
+       // Loosely modeled on CSS identifier characters\r
+       // An unquoted value should be a CSS identifier (http://www.w3.org/TR/css3-selectors/#attribute-selectors)\r
+       // Proper syntax: http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier\r
+       identifier = characterEncoding.replace( "w", "w#" ),\r
+\r
+       // Acceptable operators http://www.w3.org/TR/selectors/#attribute-selectors\r
+       operators = "([*^$|!~]?=)",\r
+       attributes = "\\[" + whitespace + "*(" + characterEncoding + ")" + whitespace +\r
+               "*(?:" + operators + whitespace + "*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|(" + identifier + ")|)|)" + whitespace + "*\\]",\r
+\r
+       // Prefer arguments not in parens/brackets,\r
+       //   then attribute selectors and non-pseudos (denoted by :),\r
+       //   then anything else\r
+       // These preferences are here to reduce the number of selectors\r
+       //   needing tokenize in the PSEUDO preFilter\r
+       pseudos = ":(" + characterEncoding + ")(?:\\((?:(['\"])((?:\\\\.|[^\\\\])*?)\\2|([^()[\\]]*|(?:(?:" + attributes + ")|[^:]|\\\\.)*|.*))\\)|)",\r
+\r
+       // For matchExpr.POS and matchExpr.needsContext\r
+       pos = ":(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + whitespace +\r
+               "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)",\r
+\r
+       // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter\r
+       rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ),\r
+\r
+       rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ),\r
+       rcombinators = new RegExp( "^" + whitespace + "*([\\x20\\t\\r\\n\\f>+~])" + whitespace + "*" ),\r
+       rpseudo = new RegExp( pseudos ),\r
+\r
+       // Easily-parseable/retrievable ID or TAG or CLASS selectors\r
+       rquickExpr = /^(?:#([\w\-]+)|(\w+)|\.([\w\-]+))$/,\r
+\r
+       rnot = /^:not/,\r
+       rsibling = /[\x20\t\r\n\f]*[+~]/,\r
+       rendsWithNot = /:not\($/,\r
+\r
+       rheader = /h\d/i,\r
+       rinputs = /input|select|textarea|button/i,\r
+\r
+       rbackslash = /\\(?!\\)/g,\r
+\r
+       matchExpr = {\r
+               "ID": new RegExp( "^#(" + characterEncoding + ")" ),\r
+               "CLASS": new RegExp( "^\\.(" + characterEncoding + ")" ),\r
+               "NAME": new RegExp( "^\\[name=['\"]?(" + characterEncoding + ")['\"]?\\]" ),\r
+               "TAG": new RegExp( "^(" + characterEncoding.replace( "w", "w*" ) + ")" ),\r
+               "ATTR": new RegExp( "^" + attributes ),\r
+               "PSEUDO": new RegExp( "^" + pseudos ),\r
+               "POS": new RegExp( pos, "i" ),\r
+               "CHILD": new RegExp( "^:(only|nth|first|last)-child(?:\\(" + whitespace +\r
+                       "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace +\r
+                       "*(\\d+)|))" + whitespace + "*\\)|)", "i" ),\r
+               // For use in libraries implementing .is()\r
+               "needsContext": new RegExp( "^" + whitespace + "*[>+~]|" + pos, "i" )\r
+       },\r
+\r
+       // Support\r
+\r
+       // Used for testing something on an element\r
+       assert = function( fn ) {\r
+               var div = document.createElement("div");\r
+\r
+               try {\r
+                       return fn( div );\r
+               } catch (e) {\r
+                       return false;\r
+               } finally {\r
+                       // release memory in IE\r
+                       div = null;\r
+               }\r
+       },\r
+\r
+       // Check if getElementsByTagName("*") returns only elements\r
+       assertTagNameNoComments = assert(function( div ) {\r
+               div.appendChild( document.createComment("") );\r
+               return !div.getElementsByTagName("*").length;\r
+       }),\r
+\r
+       // Check if getAttribute returns normalized href attributes\r
+       assertHrefNotNormalized = assert(function( div ) {\r
+               div.innerHTML = "<a href='#'></a>";\r
+               return div.firstChild && typeof div.firstChild.getAttribute !== strundefined &&\r
+                       div.firstChild.getAttribute("href") === "#";\r
+       }),\r
+\r
+       // Check if attributes should be retrieved by attribute nodes\r
+       assertAttributes = assert(function( div ) {\r
+               div.innerHTML = "<select></select>";\r
+               var type = typeof div.lastChild.getAttribute("multiple");\r
+               // IE8 returns a string for some attributes even when not present\r
+               return type !== "boolean" && type !== "string";\r
+       }),\r
+\r
+       // Check if getElementsByClassName can be trusted\r
+       assertUsableClassName = assert(function( div ) {\r
+               // Opera can't find a second classname (in 9.6)\r
+               div.innerHTML = "<div class='hidden e'></div><div class='hidden'></div>";\r
+               if ( !div.getElementsByClassName || !div.getElementsByClassName("e").length ) {\r
+                       return false;\r
+               }\r
+\r
+               // Safari 3.2 caches class attributes and doesn't catch changes\r
+               div.lastChild.className = "e";\r
+               return div.getElementsByClassName("e").length === 2;\r
+       }),\r
+\r
+       // Check if getElementById returns elements by name\r
+       // Check if getElementsByName privileges form controls or returns elements by ID\r
+       assertUsableName = assert(function( div ) {\r
+               // Inject content\r
+               div.id = expando + 0;\r
+               div.innerHTML = "<a name='" + expando + "'></a><div name='" + expando + "'></div>";\r
+               docElem.insertBefore( div, docElem.firstChild );\r
+\r
+               // Test\r
+               var pass = document.getElementsByName &&\r
+                       // buggy browsers will return fewer than the correct 2\r
+                       document.getElementsByName( expando ).length === 2 +\r
+                       // buggy browsers will return more than the correct 0\r
+                       document.getElementsByName( expando + 0 ).length;\r
+               assertGetIdNotName = !document.getElementById( expando );\r
+\r
+               // Cleanup\r
+               docElem.removeChild( div );\r
+\r
+               return pass;\r
+       });\r
+\r
+// If slice is not available, provide a backup\r
+try {\r
+       slice.call( docElem.childNodes, 0 )[0].nodeType;\r
+} catch ( e ) {\r
+       slice = function( i ) {\r
+               var elem,\r
+                       results = [];\r
+               for ( ; (elem = this[i]); i++ ) {\r
+                       results.push( elem );\r
+               }\r
+               return results;\r
+       };\r
+}\r
+\r
+function Sizzle( selector, context, results, seed ) {\r
+       results = results || [];\r
+       context = context || document;\r
+       var match, elem, xml, m,\r
+               nodeType = context.nodeType;\r
+\r
+       if ( !selector || typeof selector !== "string" ) {\r
+               return results;\r
+       }\r
+\r
+       if ( nodeType !== 1 && nodeType !== 9 ) {\r
+               return [];\r
+       }\r
+\r
+       xml = isXML( context );\r
+\r
+       if ( !xml && !seed ) {\r
+               if ( (match = rquickExpr.exec( selector )) ) {\r
+                       // Speed-up: Sizzle("#ID")\r
+                       if ( (m = match[1]) ) {\r
+                               if ( nodeType === 9 ) {\r
+                                       elem = context.getElementById( m );\r
+                                       // Check parentNode to catch when Blackberry 4.6 returns\r
+                                       // nodes that are no longer in the document #6963\r
+                                       if ( elem && elem.parentNode ) {\r
+                                               // Handle the case where IE, Opera, and Webkit return items\r
+                                               // by name instead of ID\r
+                                               if ( elem.id === m ) {\r
+                                                       results.push( elem );\r
+                                                       return results;\r
+                                               }\r
+                                       } else {\r
+                                               return results;\r
+                                       }\r
+                               } else {\r
+                                       // Context is not a document\r
+                                       if ( context.ownerDocument && (elem = context.ownerDocument.getElementById( m )) &&\r
+                                               contains( context, elem ) && elem.id === m ) {\r
+                                               results.push( elem );\r
+                                               return results;\r
+                                       }\r
+                               }\r
+\r
+                       // Speed-up: Sizzle("TAG")\r
+                       } else if ( match[2] ) {\r
+                               push.apply( results, slice.call(context.getElementsByTagName( selector ), 0) );\r
+                               return results;\r
+\r
+                       // Speed-up: Sizzle(".CLASS")\r
+                       } else if ( (m = match[3]) && assertUsableClassName && context.getElementsByClassName ) {\r
+                               push.apply( results, slice.call(context.getElementsByClassName( m ), 0) );\r
+                               return results;\r
+                       }\r
+               }\r
+       }\r
+\r
+       // All others\r
+       return select( selector.replace( rtrim, "$1" ), context, results, seed, xml );\r
+}\r
+\r
+Sizzle.matches = function( expr, elements ) {\r
+       return Sizzle( expr, null, null, elements );\r
+};\r
+\r
+Sizzle.matchesSelector = function( elem, expr ) {\r
+       return Sizzle( expr, null, null, [ elem ] ).length > 0;\r
+};\r
+\r
+// Returns a function to use in pseudos for input types\r
+function createInputPseudo( type ) {\r
+       return function( elem ) {\r
+               var name = elem.nodeName.toLowerCase();\r
+               return name === "input" && elem.type === type;\r
+       };\r
+}\r
+\r
+// Returns a function to use in pseudos for buttons\r
+function createButtonPseudo( type ) {\r
+       return function( elem ) {\r
+               var name = elem.nodeName.toLowerCase();\r
+               return (name === "input" || name === "button") && elem.type === type;\r
+       };\r
+}\r
+\r
+// Returns a function to use in pseudos for positionals\r
+function createPositionalPseudo( fn ) {\r
+       return markFunction(function( argument ) {\r
+               argument = +argument;\r
+               return markFunction(function( seed, matches ) {\r
+                       var j,\r
+                               matchIndexes = fn( [], seed.length, argument ),\r
+                               i = matchIndexes.length;\r
+\r
+                       // Match elements found at the specified indexes\r
+                       while ( i-- ) {\r
+                               if ( seed[ (j = matchIndexes[i]) ] ) {\r
+                                       seed[j] = !(matches[j] = seed[j]);\r
+                               }\r
+                       }\r
+               });\r
+       });\r
+}\r
+\r
+/**\r
+ * Utility function for retrieving the text value of an array of DOM nodes\r
+ * @param {Array|Element} elem\r
+ */\r
+getText = Sizzle.getText = function( elem ) {\r
+       var node,\r
+               ret = "",\r
+               i = 0,\r
+               nodeType = elem.nodeType;\r
+\r
+       if ( nodeType ) {\r
+               if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {\r
+                       // Use textContent for elements\r
+                       // innerText usage removed for consistency of new lines (see #11153)\r
+                       if ( typeof elem.textContent === "string" ) {\r
+                               return elem.textContent;\r
+                       } else {\r
+                               // Traverse its children\r
+                               for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {\r
+                                       ret += getText( elem );\r
+                               }\r
+                       }\r
+               } else if ( nodeType === 3 || nodeType === 4 ) {\r
+                       return elem.nodeValue;\r
+               }\r
+               // Do not include comment or processing instruction nodes\r
+       } else {\r
+\r
+               // If no nodeType, this is expected to be an array\r
+               for ( ; (node = elem[i]); i++ ) {\r
+                       // Do not traverse comment nodes\r
+                       ret += getText( node );\r
+               }\r
+       }\r
+       return ret;\r
+};\r
+\r
+isXML = Sizzle.isXML = function( elem ) {\r
+       // documentElement is verified for cases where it doesn't yet exist\r
+       // (such as loading iframes in IE - #4833)\r
+       var documentElement = elem && (elem.ownerDocument || elem).documentElement;\r
+       return documentElement ? documentElement.nodeName !== "HTML" : false;\r
+};\r
+\r
+// Element contains another\r
+contains = Sizzle.contains = docElem.contains ?\r
+       function( a, b ) {\r
+               var adown = a.nodeType === 9 ? a.documentElement : a,\r
+                       bup = b && b.parentNode;\r
+               return a === bup || !!( bup && bup.nodeType === 1 && adown.contains && adown.contains(bup) );\r
+       } :\r
+       docElem.compareDocumentPosition ?\r
+       function( a, b ) {\r
+               return b && !!( a.compareDocumentPosition( b ) & 16 );\r
+       } :\r
+       function( a, b ) {\r
+               while ( (b = b.parentNode) ) {\r
+                       if ( b === a ) {\r
+                               return true;\r
+                       }\r
+               }\r
+               return false;\r
+       };\r
+\r
+Sizzle.attr = function( elem, name ) {\r
+       var val,\r
+               xml = isXML( elem );\r
+\r
+       if ( !xml ) {\r
+               name = name.toLowerCase();\r
+       }\r
+       if ( (val = Expr.attrHandle[ name ]) ) {\r
+               return val( elem );\r
+       }\r
+       if ( xml || assertAttributes ) {\r
+               return elem.getAttribute( name );\r
+       }\r
+       val = elem.getAttributeNode( name );\r
+       return val ?\r
+               typeof elem[ name ] === "boolean" ?\r
+                       elem[ name ] ? name : null :\r
+                       val.specified ? val.value : null :\r
+               null;\r
+};\r
+\r
+Expr = Sizzle.selectors = {\r
+\r
+       // Can be adjusted by the user\r
+       cacheLength: 50,\r
+\r
+       createPseudo: markFunction,\r
+\r
+       match: matchExpr,\r
+\r
+       // IE6/7 return a modified href\r
+       attrHandle: assertHrefNotNormalized ?\r
+               {} :\r
+               {\r
+                       "href": function( elem ) {\r
+                               return elem.getAttribute( "href", 2 );\r
+                       },\r
+                       "type": function( elem ) {\r
+                               return elem.getAttribute("type");\r
+                       }\r
+               },\r
+\r
+       find: {\r
+               "ID": assertGetIdNotName ?\r
+                       function( id, context, xml ) {\r
+                               if ( typeof context.getElementById !== strundefined && !xml ) {\r
+                                       var m = context.getElementById( id );\r
+                                       // Check parentNode to catch when Blackberry 4.6 returns\r
+                                       // nodes that are no longer in the document #6963\r
+                                       return m && m.parentNode ? [m] : [];\r
+                               }\r
+                       } :\r
+                       function( id, context, xml ) {\r
+                               if ( typeof context.getElementById !== strundefined && !xml ) {\r
+                                       var m = context.getElementById( id );\r
+\r
+                                       return m ?\r
+                                               m.id === id || typeof m.getAttributeNode !== strundefined && m.getAttributeNode("id").value === id ?\r
+                                                       [m] :\r
+                                                       undefined :\r
+                                               [];\r
+                               }\r
+                       },\r
+\r
+               "TAG": assertTagNameNoComments ?\r
+                       function( tag, context ) {\r
+                               if ( typeof context.getElementsByTagName !== strundefined ) {\r
+                                       return context.getElementsByTagName( tag );\r
+                               }\r
+                       } :\r
+                       function( tag, context ) {\r
+                               var results = context.getElementsByTagName( tag );\r
+\r
+                               // Filter out possible comments\r
+                               if ( tag === "*" ) {\r
+                                       var elem,\r
+                                               tmp = [],\r
+                                               i = 0;\r
+\r
+                                       for ( ; (elem = results[i]); i++ ) {\r
+                                               if ( elem.nodeType === 1 ) {\r
+                                                       tmp.push( elem );\r
+                                               }\r
+                                       }\r
+\r
+                                       return tmp;\r
+                               }\r
+                               return results;\r
+                       },\r
+\r
+               "NAME": assertUsableName && function( tag, context ) {\r
+                       if ( typeof context.getElementsByName !== strundefined ) {\r
+                               return context.getElementsByName( name );\r
+                       }\r
+               },\r
+\r
+               "CLASS": assertUsableClassName && function( className, context, xml ) {\r
+                       if ( typeof context.getElementsByClassName !== strundefined && !xml ) {\r
+                               return context.getElementsByClassName( className );\r
+                       }\r
+               }\r
+       },\r
+\r
+       relative: {\r
+               ">": { dir: "parentNode", first: true },\r
+               " ": { dir: "parentNode" },\r
+               "+": { dir: "previousSibling", first: true },\r
+               "~": { dir: "previousSibling" }\r
+       },\r
+\r
+       preFilter: {\r
+               "ATTR": function( match ) {\r
+                       match[1] = match[1].replace( rbackslash, "" );\r
+\r
+                       // Move the given value to match[3] whether quoted or unquoted\r
+                       match[3] = ( match[4] || match[5] || "" ).replace( rbackslash, "" );\r
+\r
+                       if ( match[2] === "~=" ) {\r
+                               match[3] = " " + match[3] + " ";\r
+                       }\r
+\r
+                       return match.slice( 0, 4 );\r
+               },\r
+\r
+               "CHILD": function( match ) {\r
+                       /* matches from matchExpr["CHILD"]\r
+                               1 type (only|nth|...)\r
+                               2 argument (even|odd|\d*|\d*n([+-]\d+)?|...)\r
+                               3 xn-component of xn+y argument ([+-]?\d*n|)\r
+                               4 sign of xn-component\r
+                               5 x of xn-component\r
+                               6 sign of y-component\r
+                               7 y of y-component\r
+                       */\r
+                       match[1] = match[1].toLowerCase();\r
+\r
+                       if ( match[1] === "nth" ) {\r
+                               // nth-child requires argument\r
+                               if ( !match[2] ) {\r
+                                       Sizzle.error( match[0] );\r
+                               }\r
+\r
+                               // numeric x and y parameters for Expr.filter.CHILD\r
+                               // remember that false/true cast respectively to 0/1\r
+                               match[3] = +( match[3] ? match[4] + (match[5] || 1) : 2 * ( match[2] === "even" || match[2] === "odd" ) );\r
+                               match[4] = +( ( match[6] + match[7] ) || match[2] === "odd" );\r
+\r
+                       // other types prohibit arguments\r
+                       } else if ( match[2] ) {\r
+                               Sizzle.error( match[0] );\r
+                       }\r
+\r
+                       return match;\r
+               },\r
+\r
+               "PSEUDO": function( match ) {\r
+                       var unquoted, excess;\r
+                       if ( matchExpr["CHILD"].test( match[0] ) ) {\r
+                               return null;\r
+                       }\r
+\r
+                       if ( match[3] ) {\r
+                               match[2] = match[3];\r
+                       } else if ( (unquoted = match[4]) ) {\r
+                               // Only check arguments that contain a pseudo\r
+                               if ( rpseudo.test(unquoted) &&\r
+                                       // Get excess from tokenize (recursively)\r
+                                       (excess = tokenize( unquoted, true )) &&\r
+                                       // advance to the next closing parenthesis\r
+                                       (excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length) ) {\r
+\r
+                                       // excess is a negative index\r
+                                       unquoted = unquoted.slice( 0, excess );\r
+                                       match[0] = match[0].slice( 0, excess );\r
+                               }\r
+                               match[2] = unquoted;\r
+                       }\r
+\r
+                       // Return only captures needed by the pseudo filter method (type and argument)\r
+                       return match.slice( 0, 3 );\r
+               }\r
+       },\r
+\r
+       filter: {\r
+               "ID": assertGetIdNotName ?\r
+                       function( id ) {\r
+                               id = id.replace( rbackslash, "" );\r
+                               return function( elem ) {\r
+                                       return elem.getAttribute("id") === id;\r
+                               };\r
+                       } :\r
+                       function( id ) {\r
+                               id = id.replace( rbackslash, "" );\r
+                               return function( elem ) {\r
+                                       var node = typeof elem.getAttributeNode !== strundefined && elem.getAttributeNode("id");\r
+                                       return node && node.value === id;\r
+                               };\r
+                       },\r
+\r
+               "TAG": function( nodeName ) {\r
+                       if ( nodeName === "*" ) {\r
+                               return function() { return true; };\r
+                       }\r
+                       nodeName = nodeName.replace( rbackslash, "" ).toLowerCase();\r
+\r
+                       return function( elem ) {\r
+                               return elem.nodeName && elem.nodeName.toLowerCase() === nodeName;\r
+                       };\r
+               },\r
+\r
+               "CLASS": function( className ) {\r
+                       var pattern = classCache[ expando ][ className + " " ];\r
+\r
+                       return pattern ||\r
+                               (pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" )) &&\r
+                               classCache( className, function( elem ) {\r
+                                       return pattern.test( elem.className || (typeof elem.getAttribute !== strundefined && elem.getAttribute("class")) || "" );\r
+                               });\r
+               },\r
+\r
+               "ATTR": function( name, operator, check ) {\r
+                       return function( elem, context ) {\r
+                               var result = Sizzle.attr( elem, name );\r
+\r
+                               if ( result == null ) {\r
+                                       return operator === "!=";\r
+                               }\r
+                               if ( !operator ) {\r
+                                       return true;\r
+                               }\r
+\r
+                               result += "";\r
+\r
+                               return operator === "=" ? result === check :\r
+                                       operator === "!=" ? result !== check :\r
+                                       operator === "^=" ? check && result.indexOf( check ) === 0 :\r
+                                       operator === "*=" ? check && result.indexOf( check ) > -1 :\r
+                                       operator === "$=" ? check && result.substr( result.length - check.length ) === check :\r
+                                       operator === "~=" ? ( " " + result + " " ).indexOf( check ) > -1 :\r
+                                       operator === "|=" ? result === check || result.substr( 0, check.length + 1 ) === check + "-" :\r
+                                       false;\r
+                       };\r
+               },\r
+\r
+               "CHILD": function( type, argument, first, last ) {\r
+\r
+                       if ( type === "nth" ) {\r
+                               return function( elem ) {\r
+                                       var node, diff,\r
+                                               parent = elem.parentNode;\r
+\r
+                                       if ( first === 1 && last === 0 ) {\r
+                                               return true;\r
+                                       }\r
+\r
+                                       if ( parent ) {\r
+                                               diff = 0;\r
+                                               for ( node = parent.firstChild; node; node = node.nextSibling ) {\r
+                                                       if ( node.nodeType === 1 ) {\r
+                                                               diff++;\r
+                                                               if ( elem === node ) {\r
+                                                                       break;\r
+                                                               }\r
+                                                       }\r
+                                               }\r
+                                       }\r
+\r
+                                       // Incorporate the offset (or cast to NaN), then check against cycle size\r
+                                       diff -= last;\r
+                                       return diff === first || ( diff % first === 0 && diff / first >= 0 );\r
+                               };\r
+                       }\r
+\r
+                       return function( elem ) {\r
+                               var node = elem;\r
+\r
+                               switch ( type ) {\r
+                                       case "only":\r
+                                       case "first":\r
+                                               while ( (node = node.previousSibling) ) {\r
+                                                       if ( node.nodeType === 1 ) {\r
+                                                               return false;\r
+                                                       }\r
+                                               }\r
+\r
+                                               if ( type === "first" ) {\r
+                                                       return true;\r
+                                               }\r
+\r
+                                               node = elem;\r
+\r
+                                               /* falls through */\r
+                                       case "last":\r
+                                               while ( (node = node.nextSibling) ) {\r
+                                                       if ( node.nodeType === 1 ) {\r
+                                                               return false;\r
+                                                       }\r
+                                               }\r
+\r
+                                               return true;\r
+                               }\r
+                       };\r
+               },\r
+\r
+               "PSEUDO": function( pseudo, argument ) {\r
+                       // pseudo-class names are case-insensitive\r
+                       // http://www.w3.org/TR/selectors/#pseudo-classes\r
+                       // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters\r
+                       // Remember that setFilters inherits from pseudos\r
+                       var args,\r
+                               fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] ||\r
+                                       Sizzle.error( "unsupported pseudo: " + pseudo );\r
+\r
+                       // The user may use createPseudo to indicate that\r
+                       // arguments are needed to create the filter function\r
+                       // just as Sizzle does\r
+                       if ( fn[ expando ] ) {\r
+                               return fn( argument );\r
+                       }\r
+\r
+                       // But maintain support for old signatures\r
+                       if ( fn.length > 1 ) {\r
+                               args = [ pseudo, pseudo, "", argument ];\r
+                               return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?\r
+                                       markFunction(function( seed, matches ) {\r
+                                               var idx,\r
+                                                       matched = fn( seed, argument ),\r
+                                                       i = matched.length;\r
+                                               while ( i-- ) {\r
+                                                       idx = indexOf.call( seed, matched[i] );\r
+                                                       seed[ idx ] = !( matches[ idx ] = matched[i] );\r
+                                               }\r
+                                       }) :\r
+                                       function( elem ) {\r
+                                               return fn( elem, 0, args );\r
+                                       };\r
+                       }\r
+\r
+                       return fn;\r
+               }\r
+       },\r
+\r
+       pseudos: {\r
+               "not": markFunction(function( selector ) {\r
+                       // Trim the selector passed to compile\r
+                       // to avoid treating leading and trailing\r
+                       // spaces as combinators\r
+                       var input = [],\r
+                               results = [],\r
+                               matcher = compile( selector.replace( rtrim, "$1" ) );\r
+\r
+                       return matcher[ expando ] ?\r
+                               markFunction(function( seed, matches, context, xml ) {\r
+                                       var elem,\r
+                                               unmatched = matcher( seed, null, xml, [] ),\r
+                                               i = seed.length;\r
+\r
+                                       // Match elements unmatched by `matcher`\r
+                                       while ( i-- ) {\r
+                                               if ( (elem = unmatched[i]) ) {\r
+                                                       seed[i] = !(matches[i] = elem);\r
+                                               }\r
+                                       }\r
+                               }) :\r
+                               function( elem, context, xml ) {\r
+                                       input[0] = elem;\r
+                                       matcher( input, null, xml, results );\r
+                                       return !results.pop();\r
+                               };\r
+               }),\r
+\r
+               "has": markFunction(function( selector ) {\r
+                       return function( elem ) {\r
+                               return Sizzle( selector, elem ).length > 0;\r
+                       };\r
+               }),\r
+\r
+               "contains": markFunction(function( text ) {\r
+                       return function( elem ) {\r
+                               return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1;\r
+                       };\r
+               }),\r
+\r
+               "enabled": function( elem ) {\r
+                       return elem.disabled === false;\r
+               },\r
+\r
+               "disabled": function( elem ) {\r
+                       return elem.disabled === true;\r
+               },\r
+\r
+               "checked": function( elem ) {\r
+                       // In CSS3, :checked should return both checked and selected elements\r
+                       // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked\r
+                       var nodeName = elem.nodeName.toLowerCase();\r
+                       return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected);\r
+               },\r
+\r
+               "selected": function( elem ) {\r
+                       // Accessing this property makes selected-by-default\r
+                       // options in Safari work properly\r
+                       if ( elem.parentNode ) {\r
+                               elem.parentNode.selectedIndex;\r
+                       }\r
+\r
+                       return elem.selected === true;\r
+               },\r
+\r
+               "parent": function( elem ) {\r
+                       return !Expr.pseudos["empty"]( elem );\r
+               },\r
+\r
+               "empty": function( elem ) {\r
+                       // http://www.w3.org/TR/selectors/#empty-pseudo\r
+                       // :empty is only affected by element nodes and content nodes(including text(3), cdata(4)),\r
+                       //   not comment, processing instructions, or others\r
+                       // Thanks to Diego Perini for the nodeName shortcut\r
+                       //   Greater than "@" means alpha characters (specifically not starting with "#" or "?")\r
+                       var nodeType;\r
+                       elem = elem.firstChild;\r
+                       while ( elem ) {\r
+                               if ( elem.nodeName > "@" || (nodeType = elem.nodeType) === 3 || nodeType === 4 ) {\r
+                                       return false;\r
+                               }\r
+                               elem = elem.nextSibling;\r
+                       }\r
+                       return true;\r
+               },\r
+\r
+               "header": function( elem ) {\r
+                       return rheader.test( elem.nodeName );\r
+               },\r
+\r
+               "text": function( elem ) {\r
+                       var type, attr;\r
+                       // IE6 and 7 will map elem.type to 'text' for new HTML5 types (search, etc)\r
+                       // use getAttribute instead to test this case\r
+                       return elem.nodeName.toLowerCase() === "input" &&\r
+                               (type = elem.type) === "text" &&\r
+                               ( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === type );\r
+               },\r
+\r
+               // Input types\r
+               "radio": createInputPseudo("radio"),\r
+               "checkbox": createInputPseudo("checkbox"),\r
+               "file": createInputPseudo("file"),\r
+               "password": createInputPseudo("password"),\r
+               "image": createInputPseudo("image"),\r
+\r
+               "submit": createButtonPseudo("submit"),\r
+               "reset": createButtonPseudo("reset"),\r
+\r
+               "button": function( elem ) {\r
+                       var name = elem.nodeName.toLowerCase();\r
+                       return name === "input" && elem.type === "button" || name === "button";\r
+               },\r
+\r
+               "input": function( elem ) {\r
+                       return rinputs.test( elem.nodeName );\r
+               },\r
+\r
+               "focus": function( elem ) {\r
+                       var doc = elem.ownerDocument;\r
+                       return elem === doc.activeElement && (!doc.hasFocus || doc.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex);\r
+               },\r
+\r
+               "active": function( elem ) {\r
+                       return elem === elem.ownerDocument.activeElement;\r
+               },\r
+\r
+               // Positional types\r
+               "first": createPositionalPseudo(function() {\r
+                       return [ 0 ];\r
+               }),\r
+\r
+               "last": createPositionalPseudo(function( matchIndexes, length ) {\r
+                       return [ length - 1 ];\r
+               }),\r
+\r
+               "eq": createPositionalPseudo(function( matchIndexes, length, argument ) {\r
+                       return [ argument < 0 ? argument + length : argument ];\r
+               }),\r
+\r
+               "even": createPositionalPseudo(function( matchIndexes, length ) {\r
+                       for ( var i = 0; i < length; i += 2 ) {\r
+                               matchIndexes.push( i );\r
+                       }\r
+                       return matchIndexes;\r
+               }),\r
+\r
+               "odd": createPositionalPseudo(function( matchIndexes, length ) {\r
+                       for ( var i = 1; i < length; i += 2 ) {\r
+                               matchIndexes.push( i );\r
+                       }\r
+                       return matchIndexes;\r
+               }),\r
+\r
+               "lt": createPositionalPseudo(function( matchIndexes, length, argument ) {\r
+                       for ( var i = argument < 0 ? argument + length : argument; --i >= 0; ) {\r
+                               matchIndexes.push( i );\r
+                       }\r
+                       return matchIndexes;\r
+               }),\r
+\r
+               "gt": createPositionalPseudo(function( matchIndexes, length, argument ) {\r
+                       for ( var i = argument < 0 ? argument + length : argument; ++i < length; ) {\r
+                               matchIndexes.push( i );\r
+                       }\r
+                       return matchIndexes;\r
+               })\r
+       }\r
+};\r
+\r
+function siblingCheck( a, b, ret ) {\r
+       if ( a === b ) {\r
+               return ret;\r
+       }\r
+\r
+       var cur = a.nextSibling;\r
+\r
+       while ( cur ) {\r
+               if ( cur === b ) {\r
+                       return -1;\r
+               }\r
+\r
+               cur = cur.nextSibling;\r
+       }\r
+\r
+       return 1;\r
+}\r
+\r
+sortOrder = docElem.compareDocumentPosition ?\r
+       function( a, b ) {\r
+               if ( a === b ) {\r
+                       hasDuplicate = true;\r
+                       return 0;\r
+               }\r
+\r
+               return ( !a.compareDocumentPosition || !b.compareDocumentPosition ?\r
+                       a.compareDocumentPosition :\r
+                       a.compareDocumentPosition(b) & 4\r
+               ) ? -1 : 1;\r
+       } :\r
+       function( a, b ) {\r
+               // The nodes are identical, we can exit early\r
+               if ( a === b ) {\r
+                       hasDuplicate = true;\r
+                       return 0;\r
+\r
+               // Fallback to using sourceIndex (in IE) if it's available on both nodes\r
+               } else if ( a.sourceIndex && b.sourceIndex ) {\r
+                       return a.sourceIndex - b.sourceIndex;\r
+               }\r
+\r
+               var al, bl,\r
+                       ap = [],\r
+                       bp = [],\r
+                       aup = a.parentNode,\r
+                       bup = b.parentNode,\r
+                       cur = aup;\r
+\r
+               // If the nodes are siblings (or identical) we can do a quick check\r
+               if ( aup === bup ) {\r
+                       return siblingCheck( a, b );\r
+\r
+               // If no parents were found then the nodes are disconnected\r
+               } else if ( !aup ) {\r
+                       return -1;\r
+\r
+               } else if ( !bup ) {\r
+                       return 1;\r
+               }\r
+\r
+               // Otherwise they're somewhere else in the tree so we need\r
+               // to build up a full list of the parentNodes for comparison\r
+               while ( cur ) {\r
+                       ap.unshift( cur );\r
+                       cur = cur.parentNode;\r
+               }\r
+\r
+               cur = bup;\r
+\r
+               while ( cur ) {\r
+                       bp.unshift( cur );\r
+                       cur = cur.parentNode;\r
+               }\r
+\r
+               al = ap.length;\r
+               bl = bp.length;\r
+\r
+               // Start walking down the tree looking for a discrepancy\r
+               for ( var i = 0; i < al && i < bl; i++ ) {\r
+                       if ( ap[i] !== bp[i] ) {\r
+                               return siblingCheck( ap[i], bp[i] );\r
+                       }\r
+               }\r
+\r
+               // We ended someplace up the tree so do a sibling check\r
+               return i === al ?\r
+                       siblingCheck( a, bp[i], -1 ) :\r
+                       siblingCheck( ap[i], b, 1 );\r
+       };\r
+\r
+// Always assume the presence of duplicates if sort doesn't\r
+// pass them to our comparison function (as in Google Chrome).\r
+[0, 0].sort( sortOrder );\r
+baseHasDuplicate = !hasDuplicate;\r
+\r
+// Document sorting and removing duplicates\r
+Sizzle.uniqueSort = function( results ) {\r
+       var elem,\r
+               duplicates = [],\r
+               i = 1,\r
+               j = 0;\r
+\r
+       hasDuplicate = baseHasDuplicate;\r
+       results.sort( sortOrder );\r
+\r
+       if ( hasDuplicate ) {\r
+               for ( ; (elem = results[i]); i++ ) {\r
+                       if ( elem === results[ i - 1 ] ) {\r
+                               j = duplicates.push( i );\r
+                       }\r
+               }\r
+               while ( j-- ) {\r
+                       results.splice( duplicates[ j ], 1 );\r
+               }\r
+       }\r
+\r
+       return results;\r
+};\r
+\r
+Sizzle.error = function( msg ) {\r
+       throw new Error( "Syntax error, unrecognized expression: " + msg );\r
+};\r
+\r
+function tokenize( selector, parseOnly ) {\r
+       var matched, match, tokens, type,\r
+               soFar, groups, preFilters,\r
+               cached = tokenCache[ expando ][ selector + " " ];\r
+\r
+       if ( cached ) {\r
+               return parseOnly ? 0 : cached.slice( 0 );\r
+       }\r
+\r
+       soFar = selector;\r
+       groups = [];\r
+       preFilters = Expr.preFilter;\r
+\r
+       while ( soFar ) {\r
+\r
+               // Comma and first run\r
+               if ( !matched || (match = rcomma.exec( soFar )) ) {\r
+                       if ( match ) {\r
+                               // Don't consume trailing commas as valid\r
+                               soFar = soFar.slice( match[0].length ) || soFar;\r
+                       }\r
+                       groups.push( tokens = [] );\r
+               }\r
+\r
+               matched = false;\r
+\r
+               // Combinators\r
+               if ( (match = rcombinators.exec( soFar )) ) {\r
+                       tokens.push( matched = new Token( match.shift() ) );\r
+                       soFar = soFar.slice( matched.length );\r
+\r
+                       // Cast descendant combinators to space\r
+                       matched.type = match[0].replace( rtrim, " " );\r
+               }\r
+\r
+               // Filters\r
+               for ( type in Expr.filter ) {\r
+                       if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] ||\r
+                               (match = preFilters[ type ]( match ))) ) {\r
+\r
+                               tokens.push( matched = new Token( match.shift() ) );\r
+                               soFar = soFar.slice( matched.length );\r
+                               matched.type = type;\r
+                               matched.matches = match;\r
+                       }\r
+               }\r
+\r
+               if ( !matched ) {\r
+                       break;\r
+               }\r
+       }\r
+\r
+       // Return the length of the invalid excess\r
+       // if we're just parsing\r
+       // Otherwise, throw an error or return tokens\r
+       return parseOnly ?\r
+               soFar.length :\r
+               soFar ?\r
+                       Sizzle.error( selector ) :\r
+                       // Cache the tokens\r
+                       tokenCache( selector, groups ).slice( 0 );\r
+}\r
+\r
+function addCombinator( matcher, combinator, base ) {\r
+       var dir = combinator.dir,\r
+               checkNonElements = base && combinator.dir === "parentNode",\r
+               doneName = done++;\r
+\r
+       return combinator.first ?\r
+               // Check against closest ancestor/preceding element\r
+               function( elem, context, xml ) {\r
+                       while ( (elem = elem[ dir ]) ) {\r
+                               if ( checkNonElements || elem.nodeType === 1  ) {\r
+                                       return matcher( elem, context, xml );\r
+                               }\r
+                       }\r
+               } :\r
+\r
+               // Check against all ancestor/preceding elements\r
+               function( elem, context, xml ) {\r
+                       // We can't set arbitrary data on XML nodes, so they don't benefit from dir caching\r
+                       if ( !xml ) {\r
+                               var cache,\r
+                                       dirkey = dirruns + " " + doneName + " ",\r
+                                       cachedkey = dirkey + cachedruns;\r
+                               while ( (elem = elem[ dir ]) ) {\r
+                                       if ( checkNonElements || elem.nodeType === 1 ) {\r
+                                               if ( (cache = elem[ expando ]) === cachedkey ) {\r
+                                                       return elem.sizset;\r
+                                               } else if ( typeof cache === "string" && cache.indexOf(dirkey) === 0 ) {\r
+                                                       if ( elem.sizset ) {\r
+                                                               return elem;\r
+                                                       }\r
+                                               } else {\r
+                                                       elem[ expando ] = cachedkey;\r
+                                                       if ( matcher( elem, context, xml ) ) {\r
+                                                               elem.sizset = true;\r
+                                                               return elem;\r
+                                                       }\r
+                                                       elem.sizset = false;\r
+                                               }\r
+                                       }\r
+                               }\r
+                       } else {\r
+                               while ( (elem = elem[ dir ]) ) {\r
+                                       if ( checkNonElements || elem.nodeType === 1 ) {\r
+                                               if ( matcher( elem, context, xml ) ) {\r
+                                                       return elem;\r
+                                               }\r
+                                       }\r
+                               }\r
+                       }\r
+               };\r
+}\r
+\r
+function elementMatcher( matchers ) {\r
+       return matchers.length > 1 ?\r
+               function( elem, context, xml ) {\r
+                       var i = matchers.length;\r
+                       while ( i-- ) {\r
+                               if ( !matchers[i]( elem, context, xml ) ) {\r
+                                       return false;\r
+                               }\r
+                       }\r
+                       return true;\r
+               } :\r
+               matchers[0];\r
+}\r
+\r
+function condense( unmatched, map, filter, context, xml ) {\r
+       var elem,\r
+               newUnmatched = [],\r
+               i = 0,\r
+               len = unmatched.length,\r
+               mapped = map != null;\r
+\r
+       for ( ; i < len; i++ ) {\r
+               if ( (elem = unmatched[i]) ) {\r
+                       if ( !filter || filter( elem, context, xml ) ) {\r
+                               newUnmatched.push( elem );\r
+                               if ( mapped ) {\r
+                                       map.push( i );\r
+                               }\r
+                       }\r
+               }\r
+       }\r
+\r
+       return newUnmatched;\r
+}\r
+\r
+function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) {\r
+       if ( postFilter && !postFilter[ expando ] ) {\r
+               postFilter = setMatcher( postFilter );\r
+       }\r
+       if ( postFinder && !postFinder[ expando ] ) {\r
+               postFinder = setMatcher( postFinder, postSelector );\r
+       }\r
+       return markFunction(function( seed, results, context, xml ) {\r
+               var temp, i, elem,\r
+                       preMap = [],\r
+                       postMap = [],\r
+                       preexisting = results.length,\r
+\r
+                       // Get initial elements from seed or context\r
+                       elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [] ),\r
+\r
+                       // Prefilter to get matcher input, preserving a map for seed-results synchronization\r
+                       matcherIn = preFilter && ( seed || !selector ) ?\r
+                               condense( elems, preMap, preFilter, context, xml ) :\r
+                               elems,\r
+\r
+                       matcherOut = matcher ?\r
+                               // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,\r
+                               postFinder || ( seed ? preFilter : preexisting || postFilter ) ?\r
+\r
+                                       // ...intermediate processing is necessary\r
+                                       [] :\r
+\r
+                                       // ...otherwise use results directly\r
+                                       results :\r
+                               matcherIn;\r
+\r
+               // Find primary matches\r
+               if ( matcher ) {\r
+                       matcher( matcherIn, matcherOut, context, xml );\r
+               }\r
+\r
+               // Apply postFilter\r
+               if ( postFilter ) {\r
+                       temp = condense( matcherOut, postMap );\r
+                       postFilter( temp, [], context, xml );\r
+\r
+                       // Un-match failing elements by moving them back to matcherIn\r
+                       i = temp.length;\r
+                       while ( i-- ) {\r
+                               if ( (elem = temp[i]) ) {\r
+                                       matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem);\r
+                               }\r
+                       }\r
+               }\r
+\r
+               if ( seed ) {\r
+                       if ( postFinder || preFilter ) {\r
+                               if ( postFinder ) {\r
+                                       // Get the final matcherOut by condensing this intermediate into postFinder contexts\r
+                                       temp = [];\r
+                                       i = matcherOut.length;\r
+                                       while ( i-- ) {\r
+                                               if ( (elem = matcherOut[i]) ) {\r
+                                                       // Restore matcherIn since elem is not yet a final match\r
+                                                       temp.push( (matcherIn[i] = elem) );\r
+                                               }\r
+                                       }\r
+                                       postFinder( null, (matcherOut = []), temp, xml );\r
+                               }\r
+\r
+                               // Move matched elements from seed to results to keep them synchronized\r
+                               i = matcherOut.length;\r
+                               while ( i-- ) {\r
+                                       if ( (elem = matcherOut[i]) &&\r
+                                               (temp = postFinder ? indexOf.call( seed, elem ) : preMap[i]) > -1 ) {\r
+\r
+                                               seed[temp] = !(results[temp] = elem);\r
+                                       }\r
+                               }\r
+                       }\r
+\r
+               // Add elements to results, through postFinder if defined\r
+               } else {\r
+                       matcherOut = condense(\r
+                               matcherOut === results ?\r
+                                       matcherOut.splice( preexisting, matcherOut.length ) :\r
+                                       matcherOut\r
+                       );\r
+                       if ( postFinder ) {\r
+                               postFinder( null, results, matcherOut, xml );\r
+                       } else {\r
+                               push.apply( results, matcherOut );\r
+                       }\r
+               }\r
+       });\r
+}\r
+\r
+function matcherFromTokens( tokens ) {\r
+       var checkContext, matcher, j,\r
+               len = tokens.length,\r
+               leadingRelative = Expr.relative[ tokens[0].type ],\r
+               implicitRelative = leadingRelative || Expr.relative[" "],\r
+               i = leadingRelative ? 1 : 0,\r
+\r
+               // The foundational matcher ensures that elements are reachable from top-level context(s)\r
+               matchContext = addCombinator( function( elem ) {\r
+                       return elem === checkContext;\r
+               }, implicitRelative, true ),\r
+               matchAnyContext = addCombinator( function( elem ) {\r
+                       return indexOf.call( checkContext, elem ) > -1;\r
+               }, implicitRelative, true ),\r
+               matchers = [ function( elem, context, xml ) {\r
+                       return ( !leadingRelative && ( xml || context !== outermostContext ) ) || (\r
+                               (checkContext = context).nodeType ?\r
+                                       matchContext( elem, context, xml ) :\r
+                                       matchAnyContext( elem, context, xml ) );\r
+               } ];\r
+\r
+       for ( ; i < len; i++ ) {\r
+               if ( (matcher = Expr.relative[ tokens[i].type ]) ) {\r
+                       matchers = [ addCombinator( elementMatcher( matchers ), matcher ) ];\r
+               } else {\r
+                       matcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches );\r
+\r
+                       // Return special upon seeing a positional matcher\r
+                       if ( matcher[ expando ] ) {\r
+                               // Find the next relative operator (if any) for proper handling\r
+                               j = ++i;\r
+                               for ( ; j < len; j++ ) {\r
+                                       if ( Expr.relative[ tokens[j].type ] ) {\r
+                                               break;\r
+                                       }\r
+                               }\r
+                               return setMatcher(\r
+                                       i > 1 && elementMatcher( matchers ),\r
+                                       i > 1 && tokens.slice( 0, i - 1 ).join("").replace( rtrim, "$1" ),\r
+                                       matcher,\r
+                                       i < j && matcherFromTokens( tokens.slice( i, j ) ),\r
+                                       j < len && matcherFromTokens( (tokens = tokens.slice( j )) ),\r
+                                       j < len && tokens.join("")\r
+                               );\r
+                       }\r
+                       matchers.push( matcher );\r
+               }\r
+       }\r
+\r
+       return elementMatcher( matchers );\r
+}\r
+\r
+function matcherFromGroupMatchers( elementMatchers, setMatchers ) {\r
+       var bySet = setMatchers.length > 0,\r
+               byElement = elementMatchers.length > 0,\r
+               superMatcher = function( seed, context, xml, results, expandContext ) {\r
+                       var elem, j, matcher,\r
+                               setMatched = [],\r
+                               matchedCount = 0,\r
+                               i = "0",\r
+                               unmatched = seed && [],\r
+                               outermost = expandContext != null,\r
+                               contextBackup = outermostContext,\r
+                               // We must always have either seed elements or context\r
+                               elems = seed || byElement && Expr.find["TAG"]( "*", expandContext && context.parentNode || context ),\r
+                               // Nested matchers should use non-integer dirruns\r
+                               dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.E);\r
+\r
+                       if ( outermost ) {\r
+                               outermostContext = context !== document && context;\r
+                               cachedruns = superMatcher.el;\r
+                       }\r
+\r
+                       // Add elements passing elementMatchers directly to results\r
+                       for ( ; (elem = elems[i]) != null; i++ ) {\r
+                               if ( byElement && elem ) {\r
+                                       for ( j = 0; (matcher = elementMatchers[j]); j++ ) {\r
+                                               if ( matcher( elem, context, xml ) ) {\r
+                                                       results.push( elem );\r
+                                                       break;\r
+                                               }\r
+                                       }\r
+                                       if ( outermost ) {\r
+                                               dirruns = dirrunsUnique;\r
+                                               cachedruns = ++superMatcher.el;\r
+                                       }\r
+                               }\r
+\r
+                               // Track unmatched elements for set filters\r
+                               if ( bySet ) {\r
+                                       // They will have gone through all possible matchers\r
+                                       if ( (elem = !matcher && elem) ) {\r
+                                               matchedCount--;\r
+                                       }\r
+\r
+                                       // Lengthen the array for every element, matched or not\r
+                                       if ( seed ) {\r
+                                               unmatched.push( elem );\r
+                                       }\r
+                               }\r
+                       }\r
+\r
+                       // Apply set filters to unmatched elements\r
+                       matchedCount += i;\r
+                       if ( bySet && i !== matchedCount ) {\r
+                               for ( j = 0; (matcher = setMatchers[j]); j++ ) {\r
+                                       matcher( unmatched, setMatched, context, xml );\r
+                               }\r
+\r
+                               if ( seed ) {\r
+                                       // Reintegrate element matches to eliminate the need for sorting\r
+                                       if ( matchedCount > 0 ) {\r
+                                               while ( i-- ) {\r
+                                                       if ( !(unmatched[i] || setMatched[i]) ) {\r
+                                                               setMatched[i] = pop.call( results );\r
+                                                       }\r
+                                               }\r
+                                       }\r
+\r
+                                       // Discard index placeholder values to get only actual matches\r
+                                       setMatched = condense( setMatched );\r
+                               }\r
+\r
+                               // Add matches to results\r
+                               push.apply( results, setMatched );\r
+\r
+                               // Seedless set matches succeeding multiple successful matchers stipulate sorting\r
+                               if ( outermost && !seed && setMatched.length > 0 &&\r
+                                       ( matchedCount + setMatchers.length ) > 1 ) {\r
+\r
+                                       Sizzle.uniqueSort( results );\r
+                               }\r
+                       }\r
+\r
+                       // Override manipulation of globals by nested matchers\r
+                       if ( outermost ) {\r
+                               dirruns = dirrunsUnique;\r
+                               outermostContext = contextBackup;\r
+                       }\r
+\r
+                       return unmatched;\r
+               };\r
+\r
+       superMatcher.el = 0;\r
+       return bySet ?\r
+               markFunction( superMatcher ) :\r
+               superMatcher;\r
+}\r
+\r
+compile = Sizzle.compile = function( selector, group /* Internal Use Only */ ) {\r
+       var i,\r
+               setMatchers = [],\r
+               elementMatchers = [],\r
+               cached = compilerCache[ expando ][ selector + " " ];\r
+\r
+       if ( !cached ) {\r
+               // Generate a function of recursive functions that can be used to check each element\r
+               if ( !group ) {\r
+                       group = tokenize( selector );\r
+               }\r
+               i = group.length;\r
+               while ( i-- ) {\r
+                       cached = matcherFromTokens( group[i] );\r
+                       if ( cached[ expando ] ) {\r
+                               setMatchers.push( cached );\r
+                       } else {\r
+                               elementMatchers.push( cached );\r
+                       }\r
+               }\r
+\r
+               // Cache the compiled function\r
+               cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) );\r
+       }\r
+       return cached;\r
+};\r
+\r
+function multipleContexts( selector, contexts, results ) {\r
+       var i = 0,\r
+               len = contexts.length;\r
+       for ( ; i < len; i++ ) {\r
+               Sizzle( selector, contexts[i], results );\r
+       }\r
+       return results;\r
+}\r
+\r
+function select( selector, context, results, seed, xml ) {\r
+       var i, tokens, token, type, find,\r
+               match = tokenize( selector ),\r
+               j = match.length;\r
+\r
+       if ( !seed ) {\r
+               // Try to minimize operations if there is only one group\r
+               if ( match.length === 1 ) {\r
+\r
+                       // Take a shortcut and set the context if the root selector is an ID\r
+                       tokens = match[0] = match[0].slice( 0 );\r
+                       if ( tokens.length > 2 && (token = tokens[0]).type === "ID" &&\r
+                                       context.nodeType === 9 && !xml &&\r
+                                       Expr.relative[ tokens[1].type ] ) {\r
+\r
+                               context = Expr.find["ID"]( token.matches[0].replace( rbackslash, "" ), context, xml )[0];\r
+                               if ( !context ) {\r
+                                       return results;\r
+                               }\r
+\r
+                               selector = selector.slice( tokens.shift().length );\r
+                       }\r
+\r
+                       // Fetch a seed set for right-to-left matching\r
+                       for ( i = matchExpr["POS"].test( selector ) ? -1 : tokens.length - 1; i >= 0; i-- ) {\r
+                               token = tokens[i];\r
+\r
+                               // Abort if we hit a combinator\r
+                               if ( Expr.relative[ (type = token.type) ] ) {\r
+                                       break;\r
+                               }\r
+                               if ( (find = Expr.find[ type ]) ) {\r
+                                       // Search, expanding context for leading sibling combinators\r
+                                       if ( (seed = find(\r
+                                               token.matches[0].replace( rbackslash, "" ),\r
+                                               rsibling.test( tokens[0].type ) && context.parentNode || context,\r
+                                               xml\r
+                                       )) ) {\r
+\r
+                                               // If seed is empty or no tokens remain, we can return early\r
+                                               tokens.splice( i, 1 );\r
+                                               selector = seed.length && tokens.join("");\r
+                                               if ( !selector ) {\r
+                                                       push.apply( results, slice.call( seed, 0 ) );\r
+                                                       return results;\r
+                                               }\r
+\r
+                                               break;\r
+                                       }\r
+                               }\r
+                       }\r
+               }\r
+       }\r
+\r
+       // Compile and execute a filtering function\r
+       // Provide `match` to avoid retokenization if we modified the selector above\r
+       compile( selector, match )(\r
+               seed,\r
+               context,\r
+               xml,\r
+               results,\r
+               rsibling.test( selector )\r
+       );\r
+       return results;\r
+}\r
+\r
+if ( document.querySelectorAll ) {\r
+       (function() {\r
+               var disconnectedMatch,\r
+                       oldSelect = select,\r
+                       rescape = /'|\\/g,\r
+                       rattributeQuotes = /\=[\x20\t\r\n\f]*([^'"\]]*)[\x20\t\r\n\f]*\]/g,\r
+\r
+                       // qSa(:focus) reports false when true (Chrome 21), no need to also add to buggyMatches since matches checks buggyQSA\r
+                       // A support test would require too much code (would include document ready)\r
+                       rbuggyQSA = [ ":focus" ],\r
+\r
+                       // matchesSelector(:active) reports false when true (IE9/Opera 11.5)\r
+                       // A support test would require too much code (would include document ready)\r
+                       // just skip matchesSelector for :active\r
+                       rbuggyMatches = [ ":active" ],\r
+                       matches = docElem.matchesSelector ||\r
+                               docElem.mozMatchesSelector ||\r
+                               docElem.webkitMatchesSelector ||\r
+                               docElem.oMatchesSelector ||\r
+                               docElem.msMatchesSelector;\r
+\r
+               // Build QSA regex\r
+               // Regex strategy adopted from Diego Perini\r
+               assert(function( div ) {\r
+                       // Select is set to empty string on purpose\r
+                       // This is to test IE's treatment of not explictly\r
+                       // setting a boolean content attribute,\r
+                       // since its presence should be enough\r
+                       // http://bugs.jquery.com/ticket/12359\r
+                       div.innerHTML = "<select><option selected=''></option></select>";\r
+\r
+                       // IE8 - Some boolean attributes are not treated correctly\r
+                       if ( !div.querySelectorAll("[selected]").length ) {\r
+                               rbuggyQSA.push( "\\[" + whitespace + "*(?:checked|disabled|ismap|multiple|readonly|selected|value)" );\r
+                       }\r
+\r
+                       // Webkit/Opera - :checked should return selected option elements\r
+                       // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked\r
+                       // IE8 throws error here (do not put tests after this one)\r
+                       if ( !div.querySelectorAll(":checked").length ) {\r
+                               rbuggyQSA.push(":checked");\r
+                       }\r
+               });\r
+\r
+               assert(function( div ) {\r
+\r
+                       // Opera 10-12/IE9 - ^= $= *= and empty values\r
+                       // Should not select anything\r
+                       div.innerHTML = "<p test=''></p>";\r
+                       if ( div.querySelectorAll("[test^='']").length ) {\r
+                               rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:\"\"|'')" );\r
+                       }\r
+\r
+                       // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)\r
+                       // IE8 throws error here (do not put tests after this one)\r
+                       div.innerHTML = "<input type='hidden'/>";\r
+                       if ( !div.querySelectorAll(":enabled").length ) {\r
+                               rbuggyQSA.push(":enabled", ":disabled");\r
+                       }\r
+               });\r
+\r
+               // rbuggyQSA always contains :focus, so no need for a length check\r
+               rbuggyQSA = /* rbuggyQSA.length && */ new RegExp( rbuggyQSA.join("|") );\r
+\r
+               select = function( selector, context, results, seed, xml ) {\r
+                       // Only use querySelectorAll when not filtering,\r
+                       // when this is not xml,\r
+                       // and when no QSA bugs apply\r
+                       if ( !seed && !xml && !rbuggyQSA.test( selector ) ) {\r
+                               var groups, i,\r
+                                       old = true,\r
+                                       nid = expando,\r
+                                       newContext = context,\r
+                                       newSelector = context.nodeType === 9 && selector;\r
+\r
+                               // qSA works strangely on Element-rooted queries\r
+                               // We can work around this by specifying an extra ID on the root\r
+                               // and working up from there (Thanks to Andrew Dupont for the technique)\r
+                               // IE 8 doesn't work on object elements\r
+                               if ( context.nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) {\r
+                                       groups = tokenize( selector );\r
+\r
+                                       if ( (old = context.getAttribute("id")) ) {\r
+                                               nid = old.replace( rescape, "\\$&" );\r
+                                       } else {\r
+                                               context.setAttribute( "id", nid );\r
+                                       }\r
+                                       nid = "[id='" + nid + "'] ";\r
+\r
+                                       i = groups.length;\r
+                                       while ( i-- ) {\r
+                                               groups[i] = nid + groups[i].join("");\r
+                                       }\r
+                                       newContext = rsibling.test( selector ) && context.parentNode || context;\r
+                                       newSelector = groups.join(",");\r
+                               }\r
+\r
+                               if ( newSelector ) {\r
+                                       try {\r
+                                               push.apply( results, slice.call( newContext.querySelectorAll(\r
+                                                       newSelector\r
+                                               ), 0 ) );\r
+                                               return results;\r
+                                       } catch(qsaError) {\r
+                                       } finally {\r
+                                               if ( !old ) {\r
+                                                       context.removeAttribute("id");\r
+                                               }\r
+                                       }\r
+                               }\r
+                       }\r
+\r
+                       return oldSelect( selector, context, results, seed, xml );\r
+               };\r
+\r
+               if ( matches ) {\r
+                       assert(function( div ) {\r
+                               // Check to see if it's possible to do matchesSelector\r
+                               // on a disconnected node (IE 9)\r
+                               disconnectedMatch = matches.call( div, "div" );\r
+\r
+                               // This should fail with an exception\r
+                               // Gecko does not error, returns false instead\r
+                               try {\r
+                                       matches.call( div, "[test!='']:sizzle" );\r
+                                       rbuggyMatches.push( "!=", pseudos );\r
+                               } catch ( e ) {}\r
+                       });\r
+\r
+                       // rbuggyMatches always contains :active and :focus, so no need for a length check\r
+                       rbuggyMatches = /* rbuggyMatches.length && */ new RegExp( rbuggyMatches.join("|") );\r
+\r
+                       Sizzle.matchesSelector = function( elem, expr ) {\r
+                               // Make sure that attribute selectors are quoted\r
+                               expr = expr.replace( rattributeQuotes, "='$1']" );\r
+\r
+                               // rbuggyMatches always contains :active, so no need for an existence check\r
+                               if ( !isXML( elem ) && !rbuggyMatches.test( expr ) && !rbuggyQSA.test( expr ) ) {\r
+                                       try {\r
+                                               var ret = matches.call( elem, expr );\r
+\r
+                                               // IE 9's matchesSelector returns false on disconnected nodes\r
+                                               if ( ret || disconnectedMatch ||\r
+                                                               // As well, disconnected nodes are said to be in a document\r
+                                                               // fragment in IE 9\r
+                                                               elem.document && elem.document.nodeType !== 11 ) {\r
+                                                       return ret;\r
+                                               }\r
+                                       } catch(e) {}\r
+                               }\r
+\r
+                               return Sizzle( expr, null, null, [ elem ] ).length > 0;\r
+                       };\r
+               }\r
+       })();\r
+}\r
+\r
+// Deprecated\r
+Expr.pseudos["nth"] = Expr.pseudos["eq"];\r
+\r
+// Back-compat\r
+function setFilters() {}\r
+Expr.filters = setFilters.prototype = Expr.pseudos;\r
+Expr.setFilters = new setFilters();\r
+\r
+// Override sizzle attribute retrieval
+Sizzle.attr = jQuery.attr;
+jQuery.find = Sizzle;
+jQuery.expr = Sizzle.selectors;
+jQuery.expr[":"] = jQuery.expr.pseudos;
+jQuery.unique = Sizzle.uniqueSort;
+jQuery.text = Sizzle.getText;
+jQuery.isXMLDoc = Sizzle.isXML;
+jQuery.contains = Sizzle.contains;
+\r
+\r
+})( window );\r
+var runtil = /Until$/,
+       rparentsprev = /^(?:parents|prev(?:Until|All))/,
+       isSimple = /^.[^:#\[\.,]*$/,
+       rneedsContext = jQuery.expr.match.needsContext,
+       // methods guaranteed to produce a unique set when starting from a unique set
+       guaranteedUnique = {
+               children: true,
+               contents: true,
+               next: true,
+               prev: true
+       };
+
+jQuery.fn.extend({
+       find: function( selector ) {
+               var i, l, length, n, r, ret,
+                       self = this;
+
+               if ( typeof selector !== "string" ) {
+                       return jQuery( selector ).filter(function() {
+                               for ( i = 0, l = self.length; i < l; i++ ) {
+                                       if ( jQuery.contains( self[ i ], this ) ) {
+                                               return true;
+                                       }
+                               }
+                       });
+               }
+
+               ret = this.pushStack( "", "find", selector );
+
+               for ( i = 0, l = this.length; i < l; i++ ) {
+                       length = ret.length;
+                       jQuery.find( selector, this[i], ret );
+
+                       if ( i > 0 ) {
+                               // Make sure that the results are unique
+                               for ( n = length; n < ret.length; n++ ) {
+                                       for ( r = 0; r < length; r++ ) {
+                                               if ( ret[r] === ret[n] ) {
+                                                       ret.splice(n--, 1);
+                                                       break;
+                                               }
+                                       }
+                               }
+                       }
+               }
+
+               return ret;
+       },
+
+       has: function( target ) {
+               var i,
+                       targets = jQuery( target, this ),
+                       len = targets.length;
+
+               return this.filter(function() {
+                       for ( i = 0; i < len; i++ ) {
+                               if ( jQuery.contains( this, targets[i] ) ) {
+                                       return true;
+                               }
+                       }
+               });
+       },
+
+       not: function( selector ) {
+               return this.pushStack( winnow(this, selector, false), "not", selector);
+       },
+
+       filter: function( selector ) {
+               return this.pushStack( winnow(this, selector, true), "filter", selector );
+       },
+
+       is: function( selector ) {
+               return !!selector && (
+                       typeof selector === "string" ?
+                               // If this is a positional/relative selector, check membership in the returned set
+                               // so $("p:first").is("p:last") won't return true for a doc with two "p".
+                               rneedsContext.test( selector ) ?
+                                       jQuery( selector, this.context ).index( this[0] ) >= 0 :
+                                       jQuery.filter( selector, this ).length > 0 :
+                               this.filter( selector ).length > 0 );
+       },
+
+       closest: function( selectors, context ) {
+               var cur,
+                       i = 0,
+                       l = this.length,
+                       ret = [],
+                       pos = rneedsContext.test( selectors ) || typeof selectors !== "string" ?
+                               jQuery( selectors, context || this.context ) :
+                               0;
+
+               for ( ; i < l; i++ ) {
+                       cur = this[i];
+
+                       while ( cur && cur.ownerDocument && cur !== context && cur.nodeType !== 11 ) {
+                               if ( pos ? pos.index(cur) > -1 : jQuery.find.matchesSelector(cur, selectors) ) {
+                                       ret.push( cur );
+                                       break;
+                               }
+                               cur = cur.parentNode;
+                       }
+               }
+
+               ret = ret.length > 1 ? jQuery.unique( ret ) : ret;
+
+               return this.pushStack( ret, "closest", selectors );
+       },
+
+       // Determine the position of an element within
+       // the matched set of elements
+       index: function( elem ) {
+
+               // No argument, return index in parent
+               if ( !elem ) {
+                       return ( this[0] && this[0].parentNode ) ? this.prevAll().length : -1;
+               }
+
+               // index in selector
+               if ( typeof elem === "string" ) {
+                       return jQuery.inArray( this[0], jQuery( elem ) );
+               }
+
+               // Locate the position of the desired element
+               return jQuery.inArray(
+                       // If it receives a jQuery object, the first element is used
+                       elem.jquery ? elem[0] : elem, this );
+       },
+
+       add: function( selector, context ) {
+               var set = typeof selector === "string" ?
+                               jQuery( selector, context ) :
+                               jQuery.makeArray( selector && selector.nodeType ? [ selector ] : selector ),
+                       all = jQuery.merge( this.get(), set );
+
+               return this.pushStack( isDisconnected( set[0] ) || isDisconnected( all[0] ) ?
+                       all :
+                       jQuery.unique( all ) );
+       },
+
+       addBack: function( selector ) {
+               return this.add( selector == null ?
+                       this.prevObject : this.prevObject.filter(selector)
+               );
+       }
+});
+
+jQuery.fn.andSelf = jQuery.fn.addBack;
+
+// A painfully simple check to see if an element is disconnected
+// from a document (should be improved, where feasible).
+function isDisconnected( node ) {
+       return !node || !node.parentNode || node.parentNode.nodeType === 11;
+}
+
+function sibling( cur, dir ) {
+       do {
+               cur = cur[ dir ];
+       } while ( cur && cur.nodeType !== 1 );
+
+       return cur;
+}
+
+jQuery.each({
+       parent: function( elem ) {
+               var parent = elem.parentNode;
+               return parent && parent.nodeType !== 11 ? parent : null;
+       },
+       parents: function( elem ) {
+               return jQuery.dir( elem, "parentNode" );
+       },
+       parentsUntil: function( elem, i, until ) {
+               return jQuery.dir( elem, "parentNode", until );
+       },
+       next: function( elem ) {
+               return sibling( elem, "nextSibling" );
+       },
+       prev: function( elem ) {
+               return sibling( elem, "previousSibling" );
+       },
+       nextAll: function( elem ) {
+               return jQuery.dir( elem, "nextSibling" );
+       },
+       prevAll: function( elem ) {
+               return jQuery.dir( elem, "previousSibling" );
+       },
+       nextUntil: function( elem, i, until ) {
+               return jQuery.dir( elem, "nextSibling", until );
+       },
+       prevUntil: function( elem, i, until ) {
+               return jQuery.dir( elem, "previousSibling", until );
+       },
+       siblings: function( elem ) {
+               return jQuery.sibling( ( elem.parentNode || {} ).firstChild, elem );
+       },
+       children: function( elem ) {
+               return jQuery.sibling( elem.firstChild );
+       },
+       contents: function( elem ) {
+               return jQuery.nodeName( elem, "iframe" ) ?
+                       elem.contentDocument || elem.contentWindow.document :
+                       jQuery.merge( [], elem.childNodes );
+       }
+}, function( name, fn ) {
+       jQuery.fn[ name ] = function( until, selector ) {
+               var ret = jQuery.map( this, fn, until );
+
+               if ( !runtil.test( name ) ) {
+                       selector = until;
+               }
+
+               if ( selector && typeof selector === "string" ) {
+                       ret = jQuery.filter( selector, ret );
+               }
+
+               ret = this.length > 1 && !guaranteedUnique[ name ] ? jQuery.unique( ret ) : ret;
+
+               if ( this.length > 1 && rparentsprev.test( name ) ) {
+                       ret = ret.reverse();
+               }
+
+               return this.pushStack( ret, name, core_slice.call( arguments ).join(",") );
+       };
+});
+
+jQuery.extend({
+       filter: function( expr, elems, not ) {
+               if ( not ) {
+                       expr = ":not(" + expr + ")";
+               }
+
+               return elems.length === 1 ?
+                       jQuery.find.matchesSelector(elems[0], expr) ? [ elems[0] ] : [] :
+                       jQuery.find.matches(expr, elems);
+       },
+
+       dir: function( elem, dir, until ) {
+               var matched = [],
+                       cur = elem[ dir ];
+
+               while ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) {
+                       if ( cur.nodeType === 1 ) {
+                               matched.push( cur );
+                       }
+                       cur = cur[dir];
+               }
+               return matched;
+       },
+
+       sibling: function( n, elem ) {
+               var r = [];
+
+               for ( ; n; n = n.nextSibling ) {
+                       if ( n.nodeType === 1 && n !== elem ) {
+                               r.push( n );
+                       }
+               }
+
+               return r;
+       }
+});
+
+// Implement the identical functionality for filter and not
+function winnow( elements, qualifier, keep ) {
+
+       // Can't pass null or undefined to indexOf in Firefox 4
+       // Set to 0 to skip string check
+       qualifier = qualifier || 0;
+
+       if ( jQuery.isFunction( qualifier ) ) {
+               return jQuery.grep(elements, function( elem, i ) {
+                       var retVal = !!qualifier.call( elem, i, elem );
+                       return retVal === keep;
+               });
+
+       } else if ( qualifier.nodeType ) {
+               return jQuery.grep(elements, function( elem, i ) {
+                       return ( elem === qualifier ) === keep;
+               });
+
+       } else if ( typeof qualifier === "string" ) {
+               var filtered = jQuery.grep(elements, function( elem ) {
+                       return elem.nodeType === 1;
+               });
+
+               if ( isSimple.test( qualifier ) ) {
+                       return jQuery.filter(qualifier, filtered, !keep);
+               } else {
+                       qualifier = jQuery.filter( qualifier, filtered );
+               }
+       }
+
+       return jQuery.grep(elements, function( elem, i ) {
+               return ( jQuery.inArray( elem, qualifier ) >= 0 ) === keep;
+       });
+}
+function createSafeFragment( document ) {
+       var list = nodeNames.split( "|" ),
+       safeFrag = document.createDocumentFragment();
+
+       if ( safeFrag.createElement ) {
+               while ( list.length ) {
+                       safeFrag.createElement(
+                               list.pop()
+                       );
+               }
+       }
+       return safeFrag;
+}
+
+var nodeNames = "abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|" +
+               "header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",
+       rinlinejQuery = / jQuery\d+="(?:null|\d+)"/g,
+       rleadingWhitespace = /^\s+/,
+       rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,
+       rtagName = /<([\w:]+)/,
+       rtbody = /<tbody/i,
+       rhtml = /<|&#?\w+;/,
+       rnoInnerhtml = /<(?:script|style|link)/i,
+       rnocache = /<(?:script|object|embed|option|style)/i,
+       rnoshimcache = new RegExp("<(?:" + nodeNames + ")[\\s/>]", "i"),
+       rcheckableType = /^(?:checkbox|radio)$/,
+       // checked="checked" or checked
+       rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,
+       rscriptType = /\/(java|ecma)script/i,
+       rcleanScript = /^\s*<!(?:\[CDATA\[|\-\-)|[\]\-]{2}>\s*$/g,
+       wrapMap = {
+               option: [ 1, "<select multiple='multiple'>", "</select>" ],
+               legend: [ 1, "<fieldset>", "</fieldset>" ],
+               thead: [ 1, "<table>", "</table>" ],
+               tr: [ 2, "<table><tbody>", "</tbody></table>" ],
+               td: [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ],
+               col: [ 2, "<table><tbody></tbody><colgroup>", "</colgroup></table>" ],
+               area: [ 1, "<map>", "</map>" ],
+               _default: [ 0, "", "" ]
+       },
+       safeFragment = createSafeFragment( document ),
+       fragmentDiv = safeFragment.appendChild( document.createElement("div") );
+
+wrapMap.optgroup = wrapMap.option;
+wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
+wrapMap.th = wrapMap.td;
+
+// IE6-8 can't serialize link, script, style, or any html5 (NoScope) tags,
+// unless wrapped in a div with non-breaking characters in front of it.
+if ( !jQuery.support.htmlSerialize ) {
+       wrapMap._default = [ 1, "X<div>", "</div>" ];
+}
+
+jQuery.fn.extend({
+       text: function( value ) {
+               return jQuery.access( this, function( value ) {
+                       return value === undefined ?
+                               jQuery.text( this ) :
+                               this.empty().append( ( this[0] && this[0].ownerDocument || document ).createTextNode( value ) );
+               }, null, value, arguments.length );
+       },
+
+       wrapAll: function( html ) {
+               if ( jQuery.isFunction( html ) ) {
+                       return this.each(function(i) {
+                               jQuery(this).wrapAll( html.call(this, i) );
+                       });
+               }
+
+               if ( this[0] ) {
+                       // The elements to wrap the target around
+                       var wrap = jQuery( html, this[0].ownerDocument ).eq(0).clone(true);
+
+                       if ( this[0].parentNode ) {
+                               wrap.insertBefore( this[0] );
+                       }
+
+                       wrap.map(function() {
+                               var elem = this;
+
+                               while ( elem.firstChild && elem.firstChild.nodeType === 1 ) {
+                                       elem = elem.firstChild;
+                               }
+
+                               return elem;
+                       }).append( this );
+               }
+
+               return this;
+       },
+
+       wrapInner: function( html ) {
+               if ( jQuery.isFunction( html ) ) {
+                       return this.each(function(i) {
+                               jQuery(this).wrapInner( html.call(this, i) );
+                       });
+               }
+
+               return this.each(function() {
+                       var self = jQuery( this ),
+                               contents = self.contents();
+
+                       if ( contents.length ) {
+                               contents.wrapAll( html );
+
+                       } else {
+                               self.append( html );
+                       }
+               });
+       },
+
+       wrap: function( html ) {
+               var isFunction = jQuery.isFunction( html );
+
+               return this.each(function(i) {
+                       jQuery( this ).wrapAll( isFunction ? html.call(this, i) : html );
+               });
+       },
+
+       unwrap: function() {
+               return this.parent().each(function() {
+                       if ( !jQuery.nodeName( this, "body" ) ) {
+                               jQuery( this ).replaceWith( this.childNodes );
+                       }
+               }).end();
+       },
+
+       append: function() {
+               return this.domManip(arguments, true, function( elem ) {
+                       if ( this.nodeType === 1 || this.nodeType === 11 ) {
+                               this.appendChild( elem );
+                       }
+               });
+       },
+
+       prepend: function() {
+               return this.domManip(arguments, true, function( elem ) {
+                       if ( this.nodeType === 1 || this.nodeType === 11 ) {
+                               this.insertBefore( elem, this.firstChild );
+                       }
+               });
+       },
+
+       before: function() {
+               if ( !isDisconnected( this[0] ) ) {
+                       return this.domManip(arguments, false, function( elem ) {
+                               this.parentNode.insertBefore( elem, this );
+                       });
+               }
+
+               if ( arguments.length ) {
+                       var set = jQuery.clean( arguments );
+                       return this.pushStack( jQuery.merge( set, this ), "before", this.selector );
+               }
+       },
+
+       after: function() {
+               if ( !isDisconnected( this[0] ) ) {
+                       return this.domManip(arguments, false, function( elem ) {
+                               this.parentNode.insertBefore( elem, this.nextSibling );
+                       });
+               }
+
+               if ( arguments.length ) {
+                       var set = jQuery.clean( arguments );
+                       return this.pushStack( jQuery.merge( this, set ), "after", this.selector );
+               }
+       },
+
+       // keepData is for internal use only--do not document
+       remove: function( selector, keepData ) {
+               var elem,
+                       i = 0;
+
+               for ( ; (elem = this[i]) != null; i++ ) {
+                       if ( !selector || jQuery.filter( selector, [ elem ] ).length ) {
+                               if ( !keepData && elem.nodeType === 1 ) {
+                                       jQuery.cleanData( elem.getElementsByTagName("*") );
+                                       jQuery.cleanData( [ elem ] );
+                               }
+
+                               if ( elem.parentNode ) {
+                                       elem.parentNode.removeChild( elem );
+                               }
+                       }
+               }
+
+               return this;
+       },
+
+       empty: function() {
+               var elem,
+                       i = 0;
+
+               for ( ; (elem = this[i]) != null; i++ ) {
+                       // Remove element nodes and prevent memory leaks
+                       if ( elem.nodeType === 1 ) {
+                               jQuery.cleanData( elem.getElementsByTagName("*") );
+                       }
+
+                       // Remove any remaining nodes
+                       while ( elem.firstChild ) {
+                               elem.removeChild( elem.firstChild );
+                       }
+               }
+
+               return this;
+       },
+
+       clone: function( dataAndEvents, deepDataAndEvents ) {
+               dataAndEvents = dataAndEvents == null ? false : dataAndEvents;
+               deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;
+
+               return this.map( function () {
+                       return jQuery.clone( this, dataAndEvents, deepDataAndEvents );
+               });
+       },
+
+       html: function( value ) {
+               return jQuery.access( this, function( value ) {
+                       var elem = this[0] || {},
+                               i = 0,
+                               l = this.length;
+
+                       if ( value === undefined ) {
+                               return elem.nodeType === 1 ?
+                                       elem.innerHTML.replace( rinlinejQuery, "" ) :
+                                       undefined;
+                       }
+
+                       // See if we can take a shortcut and just use innerHTML
+                       if ( typeof value === "string" && !rnoInnerhtml.test( value ) &&
+                               ( jQuery.support.htmlSerialize || !rnoshimcache.test( value )  ) &&
+                               ( jQuery.support.leadingWhitespace || !rleadingWhitespace.test( value ) ) &&
+                               !wrapMap[ ( rtagName.exec( value ) || ["", ""] )[1].toLowerCase() ] ) {
+
+                               value = value.replace( rxhtmlTag, "<$1></$2>" );
+
+                               try {
+                                       for (; i < l; i++ ) {
+                                               // Remove element nodes and prevent memory leaks
+                                               elem = this[i] || {};
+                                               if ( elem.nodeType === 1 ) {
+                                                       jQuery.cleanData( elem.getElementsByTagName( "*" ) );
+                                                       elem.innerHTML = value;
+                                               }
+                                       }
+
+                                       elem = 0;
+
+                               // If using innerHTML throws an exception, use the fallback method
+                               } catch(e) {}
+                       }
+
+                       if ( elem ) {
+                               this.empty().append( value );
+                       }
+               }, null, value, arguments.length );
+       },
+
+       replaceWith: function( value ) {
+               if ( !isDisconnected( this[0] ) ) {
+                       // Make sure that the elements are removed from the DOM before they are inserted
+                       // this can help fix replacing a parent with child elements
+                       if ( jQuery.isFunction( value ) ) {
+                               return this.each(function(i) {
+                                       var self = jQuery(this), old = self.html();
+                                       self.replaceWith( value.call( this, i, old ) );
+                               });
+                       }
+
+                       if ( typeof value !== "string" ) {
+                               value = jQuery( value ).detach();
+                       }
+
+                       return this.each(function() {
+                               var next = this.nextSibling,
+                                       parent = this.parentNode;
+
+                               jQuery( this ).remove();
+
+                               if ( next ) {
+                                       jQuery(next).before( value );
+                               } else {
+                                       jQuery(parent).append( value );
+                               }
+                       });
+               }
+
+               return this.length ?
+                       this.pushStack( jQuery(jQuery.isFunction(value) ? value() : value), "replaceWith", value ) :
+                       this;
+       },
+
+       detach: function( selector ) {
+               return this.remove( selector, true );
+       },
+
+       domManip: function( args, table, callback ) {
+
+               // Flatten any nested arrays
+               args = [].concat.apply( [], args );
+
+               var results, first, fragment, iNoClone,
+                       i = 0,
+                       value = args[0],
+                       scripts = [],
+                       l = this.length;
+
+               // We can't cloneNode fragments that contain checked, in WebKit
+               if ( !jQuery.support.checkClone && l > 1 && typeof value === "string" && rchecked.test( value ) ) {
+                       return this.each(function() {
+                               jQuery(this).domManip( args, table, callback );
+                       });
+               }
+
+               if ( jQuery.isFunction(value) ) {
+                       return this.each(function(i) {
+                               var self = jQuery(this);
+                               args[0] = value.call( this, i, table ? self.html() : undefined );
+                               self.domManip( args, table, callback );
+                       });
+               }
+
+               if ( this[0] ) {
+                       results = jQuery.buildFragment( args, this, scripts );
+                       fragment = results.fragment;
+                       first = fragment.firstChild;
+
+                       if ( fragment.childNodes.length === 1 ) {
+                               fragment = first;
+                       }
+
+                       if ( first ) {
+                               table = table && jQuery.nodeName( first, "tr" );
+
+                               // Use the original fragment for the last item instead of the first because it can end up
+                               // being emptied incorrectly in certain situations (#8070).
+                               // Fragments from the fragment cache must always be cloned and never used in place.
+                               for ( iNoClone = results.cacheable || l - 1; i < l; i++ ) {
+                                       callback.call(
+                                               table && jQuery.nodeName( this[i], "table" ) ?
+                                                       findOrAppend( this[i], "tbody" ) :
+                                                       this[i],
+                                               i === iNoClone ?
+                                                       fragment :
+                                                       jQuery.clone( fragment, true, true )
+                                       );
+                               }
+                       }
+
+                       // Fix #11809: Avoid leaking memory
+                       fragment = first = null;
+
+                       if ( scripts.length ) {
+                               jQuery.each( scripts, function( i, elem ) {
+                                       if ( elem.src ) {
+                                               if ( jQuery.ajax ) {
+                                                       jQuery.ajax({
+                                                               url: elem.src,
+                                                               type: "GET",
+                                                               dataType: "script",
+                                                               async: false,
+                                                               global: false,
+                                                               "throws": true
+                                                       });
+                                               } else {
+                                                       jQuery.error("no ajax");
+                                               }
+                                       } else {
+                                               jQuery.globalEval( ( elem.text || elem.textContent || elem.innerHTML || "" ).replace( rcleanScript, "" ) );
+                                       }
+
+                                       if ( elem.parentNode ) {
+                                               elem.parentNode.removeChild( elem );
+                                       }
+                               });
+                       }
+               }
+
+               return this;
+       }
+});
+
+function findOrAppend( elem, tag ) {
+       return elem.getElementsByTagName( tag )[0] || elem.appendChild( elem.ownerDocument.createElement( tag ) );
+}
+
+function cloneCopyEvent( src, dest ) {
+
+       if ( dest.nodeType !== 1 || !jQuery.hasData( src ) ) {
+               return;
+       }
+
+       var type, i, l,
+               oldData = jQuery._data( src ),
+               curData = jQuery._data( dest, oldData ),
+               events = oldData.events;
+
+       if ( events ) {
+               delete curData.handle;
+               curData.events = {};
+
+               for ( type in events ) {
+                       for ( i = 0, l = events[ type ].length; i < l; i++ ) {
+                               jQuery.event.add( dest, type, events[ type ][ i ] );
+                       }
+               }
+       }
+
+       // make the cloned public data object a copy from the original
+       if ( curData.data ) {
+               curData.data = jQuery.extend( {}, curData.data );
+       }
+}
+
+function cloneFixAttributes( src, dest ) {
+       var nodeName;
+
+       // We do not need to do anything for non-Elements
+       if ( dest.nodeType !== 1 ) {
+               return;
+       }
+
+       // clearAttributes removes the attributes, which we don't want,
+       // but also removes the attachEvent events, which we *do* want
+       if ( dest.clearAttributes ) {
+               dest.clearAttributes();
+       }
+
+       // mergeAttributes, in contrast, only merges back on the
+       // original attributes, not the events
+       if ( dest.mergeAttributes ) {
+               dest.mergeAttributes( src );
+       }
+
+       nodeName = dest.nodeName.toLowerCase();
+
+       if ( nodeName === "object" ) {
+               // IE6-10 improperly clones children of object elements using classid.
+               // IE10 throws NoModificationAllowedError if parent is null, #12132.
+               if ( dest.parentNode ) {
+                       dest.outerHTML = src.outerHTML;
+               }
+
+               // This path appears unavoidable for IE9. When cloning an object
+               // element in IE9, the outerHTML strategy above is not sufficient.
+               // If the src has innerHTML and the destination does not,
+               // copy the src.innerHTML into the dest.innerHTML. #10324
+               if ( jQuery.support.html5Clone && (src.innerHTML && !jQuery.trim(dest.innerHTML)) ) {
+                       dest.innerHTML = src.innerHTML;
+               }
+
+       } else if ( nodeName === "input" && rcheckableType.test( src.type ) ) {
+               // IE6-8 fails to persist the checked state of a cloned checkbox
+               // or radio button. Worse, IE6-7 fail to give the cloned element
+               // a checked appearance if the defaultChecked value isn't also set
+
+               dest.defaultChecked = dest.checked = src.checked;
+
+               // IE6-7 get confused and end up setting the value of a cloned
+               // checkbox/radio button to an empty string instead of "on"
+               if ( dest.value !== src.value ) {
+                       dest.value = src.value;
+               }
+
+       // IE6-8 fails to return the selected option to the default selected
+       // state when cloning options
+       } else if ( nodeName === "option" ) {
+               dest.selected = src.defaultSelected;
+
+       // IE6-8 fails to set the defaultValue to the correct value when
+       // cloning other types of input fields
+       } else if ( nodeName === "input" || nodeName === "textarea" ) {
+               dest.defaultValue = src.defaultValue;
+
+       // IE blanks contents when cloning scripts
+       } else if ( nodeName === "script" && dest.text !== src.text ) {
+               dest.text = src.text;
+       }
+
+       // Event data gets referenced instead of copied if the expando
+       // gets copied too
+       dest.removeAttribute( jQuery.expando );
+}
+
+jQuery.buildFragment = function( args, context, scripts ) {
+       var fragment, cacheable, cachehit,
+               first = args[ 0 ];
+
+       // Set context from what may come in as undefined or a jQuery collection or a node
+       // Updated to fix #12266 where accessing context[0] could throw an exception in IE9/10 &
+       // also doubles as fix for #8950 where plain objects caused createDocumentFragment exception
+       context = context || document;
+       context = !context.nodeType && context[0] || context;
+       context = context.ownerDocument || context;
+
+       // Only cache "small" (1/2 KB) HTML strings that are associated with the main document
+       // Cloning options loses the selected state, so don't cache them
+       // IE 6 doesn't like it when you put <object> or <embed> elements in a fragment
+       // Also, WebKit does not clone 'checked' attributes on cloneNode, so don't cache
+       // Lastly, IE6,7,8 will not correctly reuse cached fragments that were created from unknown elems #10501
+       if ( args.length === 1 && typeof first === "string" && first.length < 512 && context === document &&
+               first.charAt(0) === "<" && !rnocache.test( first ) &&
+               (jQuery.support.checkClone || !rchecked.test( first )) &&
+               (jQuery.support.html5Clone || !rnoshimcache.test( first )) ) {
+
+               // Mark cacheable and look for a hit
+               cacheable = true;
+               fragment = jQuery.fragments[ first ];
+               cachehit = fragment !== undefined;
+       }
+
+       if ( !fragment ) {
+               fragment = context.createDocumentFragment();
+               jQuery.clean( args, context, fragment, scripts );
+
+               // Update the cache, but only store false
+               // unless this is a second parsing of the same content
+               if ( cacheable ) {
+                       jQuery.fragments[ first ] = cachehit && fragment;
+               }
+       }
+
+       return { fragment: fragment, cacheable: cacheable };
+};
+
+jQuery.fragments = {};
+
+jQuery.each({
+       appendTo: "append",
+       prependTo: "prepend",
+       insertBefore: "before",
+       insertAfter: "after",
+       replaceAll: "replaceWith"
+}, function( name, original ) {
+       jQuery.fn[ name ] = function( selector ) {
+               var elems,
+                       i = 0,
+                       ret = [],
+                       insert = jQuery( selector ),
+                       l = insert.length,
+                       parent = this.length === 1 && this[0].parentNode;
+
+               if ( (parent == null || parent && parent.nodeType === 11 && parent.childNodes.length === 1) && l === 1 ) {
+                       insert[ original ]( this[0] );
+                       return this;
+               } else {
+                       for ( ; i < l; i++ ) {
+                               elems = ( i > 0 ? this.clone(true) : this ).get();
+                               jQuery( insert[i] )[ original ]( elems );
+                               ret = ret.concat( elems );
+                       }
+
+                       return this.pushStack( ret, name, insert.selector );
+               }
+       };
+});
+
+function getAll( elem ) {
+       if ( typeof elem.getElementsByTagName !== "undefined" ) {
+               return elem.getElementsByTagName( "*" );
+
+       } else if ( typeof elem.querySelectorAll !== "undefined" ) {
+               return elem.querySelectorAll( "*" );
+
+       } else {
+               return [];
+       }
+}
+
+// Used in clean, fixes the defaultChecked property
+function fixDefaultChecked( elem ) {
+       if ( rcheckableType.test( elem.type ) ) {
+               elem.defaultChecked = elem.checked;
+       }
+}
+
+jQuery.extend({
+       clone: function( elem, dataAndEvents, deepDataAndEvents ) {
+               var srcElements,
+                       destElements,
+                       i,
+                       clone;
+
+               if ( jQuery.support.html5Clone || jQuery.isXMLDoc(elem) || !rnoshimcache.test( "<" + elem.nodeName + ">" ) ) {
+                       clone = elem.cloneNode( true );
+
+               // IE<=8 does not properly clone detached, unknown element nodes
+               } else {
+                       fragmentDiv.innerHTML = elem.outerHTML;
+                       fragmentDiv.removeChild( clone = fragmentDiv.firstChild );
+               }
+
+               if ( (!jQuery.support.noCloneEvent || !jQuery.support.noCloneChecked) &&
+                               (elem.nodeType === 1 || elem.nodeType === 11) && !jQuery.isXMLDoc(elem) ) {
+                       // IE copies events bound via attachEvent when using cloneNode.
+                       // Calling detachEvent on the clone will also remove the events
+                       // from the original. In order to get around this, we use some
+                       // proprietary methods to clear the events. Thanks to MooTools
+                       // guys for this hotness.
+
+                       cloneFixAttributes( elem, clone );
+
+                       // Using Sizzle here is crazy slow, so we use getElementsByTagName instead
+                       srcElements = getAll( elem );
+                       destElements = getAll( clone );
+
+                       // Weird iteration because IE will replace the length property
+                       // with an element if you are cloning the body and one of the
+                       // elements on the page has a name or id of "length"
+                       for ( i = 0; srcElements[i]; ++i ) {
+                               // Ensure that the destination node is not null; Fixes #9587
+                               if ( destElements[i] ) {
+                                       cloneFixAttributes( srcElements[i], destElements[i] );
+                               }
+                       }
+               }
+
+               // Copy the events from the original to the clone
+               if ( dataAndEvents ) {
+                       cloneCopyEvent( elem, clone );
+
+                       if ( deepDataAndEvents ) {
+                               srcElements = getAll( elem );
+                               destElements = getAll( clone );
+
+                               for ( i = 0; srcElements[i]; ++i ) {
+                                       cloneCopyEvent( srcElements[i], destElements[i] );
+                               }
+                       }
+               }
+
+               srcElements = destElements = null;
+
+               // Return the cloned set
+               return clone;
+       },
+
+       clean: function( elems, context, fragment, scripts ) {
+               var i, j, elem, tag, wrap, depth, div, hasBody, tbody, len, handleScript, jsTags,
+                       safe = context === document && safeFragment,
+                       ret = [];
+
+               // Ensure that context is a document
+               if ( !context || typeof context.createDocumentFragment === "undefined" ) {
+                       context = document;
+               }
+
+               // Use the already-created safe fragment if context permits
+               for ( i = 0; (elem = elems[i]) != null; i++ ) {
+                       if ( typeof elem === "number" ) {
+                               elem += "";
+                       }
+
+                       if ( !elem ) {
+                               continue;
+                       }
+
+                       // Convert html string into DOM nodes
+                       if ( typeof elem === "string" ) {
+                               if ( !rhtml.test( elem ) ) {
+                                       elem = context.createTextNode( elem );
+                               } else {
+                                       // Ensure a safe container in which to render the html
+                                       safe = safe || createSafeFragment( context );
+                                       div = context.createElement("div");
+                                       safe.appendChild( div );
+
+                                       // Fix "XHTML"-style tags in all browsers
+                                       elem = elem.replace(rxhtmlTag, "<$1></$2>");
+
+                                       // Go to html and back, then peel off extra wrappers
+                                       tag = ( rtagName.exec( elem ) || ["", ""] )[1].toLowerCase();
+                                       wrap = wrapMap[ tag ] || wrapMap._default;
+                                       depth = wrap[0];
+                                       div.innerHTML = wrap[1] + elem + wrap[2];
+
+                                       // Move to the right depth
+                                       while ( depth-- ) {
+                                               div = div.lastChild;
+                                       }
+
+                                       // Remove IE's autoinserted <tbody> from table fragments
+                                       if ( !jQuery.support.tbody ) {
+
+                                               // String was a <table>, *may* have spurious <tbody>
+                                               hasBody = rtbody.test(elem);
+                                                       tbody = tag === "table" && !hasBody ?
+                                                               div.firstChild && div.firstChild.childNodes :
+
+                                                               // String was a bare <thead> or <tfoot>
+                                                               wrap[1] === "<table>" && !hasBody ?
+                                                                       div.childNodes :
+                                                                       [];
+
+                                               for ( j = tbody.length - 1; j >= 0 ; --j ) {
+                                                       if ( jQuery.nodeName( tbody[ j ], "tbody" ) && !tbody[ j ].childNodes.length ) {
+                                                               tbody[ j ].parentNode.removeChild( tbody[ j ] );
+                                                       }
+                                               }
+                                       }
+
+                                       // IE completely kills leading whitespace when innerHTML is used
+                                       if ( !jQuery.support.leadingWhitespace && rleadingWhitespace.test( elem ) ) {
+                                               div.insertBefore( context.createTextNode( rleadingWhitespace.exec(elem)[0] ), div.firstChild );
+                                       }
+
+                                       elem = div.childNodes;
+
+                                       // Take out of fragment container (we need a fresh div each time)
+                                       div.parentNode.removeChild( div );
+                               }
+                       }
+
+                       if ( elem.nodeType ) {
+                               ret.push( elem );
+                       } else {
+                               jQuery.merge( ret, elem );
+                       }
+               }
+
+               // Fix #11356: Clear elements from safeFragment
+               if ( div ) {
+                       elem = div = safe = null;
+               }
+
+               // Reset defaultChecked for any radios and checkboxes
+               // about to be appended to the DOM in IE 6/7 (#8060)
+               if ( !jQuery.support.appendChecked ) {
+                       for ( i = 0; (elem = ret[i]) != null; i++ ) {
+                               if ( jQuery.nodeName( elem, "input" ) ) {
+                                       fixDefaultChecked( elem );
+                               } else if ( typeof elem.getElementsByTagName !== "undefined" ) {
+                                       jQuery.grep( elem.getElementsByTagName("input"), fixDefaultChecked );
+                               }
+                       }
+               }
+
+               // Append elements to a provided document fragment
+               if ( fragment ) {
+                       // Special handling of each script element
+                       handleScript = function( elem ) {
+                               // Check if we consider it executable
+                               if ( !elem.type || rscriptType.test( elem.type ) ) {
+                                       // Detach the script and store it in the scripts array (if provided) or the fragment
+                                       // Return truthy to indicate that it has been handled
+                                       return scripts ?
+                                               scripts.push( elem.parentNode ? elem.parentNode.removeChild( elem ) : elem ) :
+                                               fragment.appendChild( elem );
+                               }
+                       };
+
+                       for ( i = 0; (elem = ret[i]) != null; i++ ) {
+                               // Check if we're done after handling an executable script
+                               if ( !( jQuery.nodeName( elem, "script" ) && handleScript( elem ) ) ) {
+                                       // Append to fragment and handle embedded scripts
+                                       fragment.appendChild( elem );
+                                       if ( typeof elem.getElementsByTagName !== "undefined" ) {
+                                               // handleScript alters the DOM, so use jQuery.merge to ensure snapshot iteration
+                                               jsTags = jQuery.grep( jQuery.merge( [], elem.getElementsByTagName("script") ), handleScript );
+
+                                               // Splice the scripts into ret after their former ancestor and advance our index beyond them
+                                               ret.splice.apply( ret, [i + 1, 0].concat( jsTags ) );
+                                               i += jsTags.length;
+                                       }
+                               }
+                       }
+               }
+
+               return ret;
+       },
+
+       cleanData: function( elems, /* internal */ acceptData ) {
+               var data, id, elem, type,
+                       i = 0,
+                       internalKey = jQuery.expando,
+                       cache = jQuery.cache,
+                       deleteExpando = jQuery.support.deleteExpando,
+                       special = jQuery.event.special;
+
+               for ( ; (elem = elems[i]) != null; i++ ) {
+
+                       if ( acceptData || jQuery.acceptData( elem ) ) {
+
+                               id = elem[ internalKey ];
+                               data = id && cache[ id ];
+
+                               if ( data ) {
+                                       if ( data.events ) {
+                                               for ( type in data.events ) {
+                                                       if ( special[ type ] ) {
+                                                               jQuery.event.remove( elem, type );
+
+                                                       // This is a shortcut to avoid jQuery.event.remove's overhead
+                                                       } else {
+                                                               jQuery.removeEvent( elem, type, data.handle );
+                                                       }
+                                               }
+                                       }
+
+                                       // Remove cache only if it was not already removed by jQuery.event.remove
+                                       if ( cache[ id ] ) {
+
+                                               delete cache[ id ];
+
+                                               // IE does not allow us to delete expando properties from nodes,
+                                               // nor does it have a removeAttribute function on Document nodes;
+                                               // we must handle all of these cases
+                                               if ( deleteExpando ) {
+                                                       delete elem[ internalKey ];
+
+                                               } else if ( elem.removeAttribute ) {
+                                                       elem.removeAttribute( internalKey );
+
+                                               } else {
+                                                       elem[ internalKey ] = null;
+                                               }
+
+                                               jQuery.deletedIds.push( id );
+                                       }
+                               }
+                       }
+               }
+       }
+});
+// Limit scope pollution from any deprecated API
+(function() {
+
+var matched, browser;
+
+// Use of jQuery.browser is frowned upon.
+// More details: http://api.jquery.com/jQuery.browser
+// jQuery.uaMatch maintained for back-compat
+jQuery.uaMatch = function( ua ) {
+       ua = ua.toLowerCase();
+
+       var match = /(chrome)[ \/]([\w.]+)/.exec( ua ) ||
+               /(webkit)[ \/]([\w.]+)/.exec( ua ) ||
+               /(opera)(?:.*version|)[ \/]([\w.]+)/.exec( ua ) ||
+               /(msie) ([\w.]+)/.exec( ua ) ||
+               ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec( ua ) ||
+               [];
+
+       return {
+               browser: match[ 1 ] || "",
+               version: match[ 2 ] || "0"
+       };
+};
+
+matched = jQuery.uaMatch( navigator.userAgent );
+browser = {};
+
+if ( matched.browser ) {
+       browser[ matched.browser ] = true;
+       browser.version = matched.version;
+}
+
+// Chrome is Webkit, but Webkit is also Safari.
+if ( browser.chrome ) {
+       browser.webkit = true;
+} else if ( browser.webkit ) {
+       browser.safari = true;
+}
+
+jQuery.browser = browser;
+
+jQuery.sub = function() {
+       function jQuerySub( selector, context ) {
+               return new jQuerySub.fn.init( selector, context );
+       }
+       jQuery.extend( true, jQuerySub, this );
+       jQuerySub.superclass = this;
+       jQuerySub.fn = jQuerySub.prototype = this();
+       jQuerySub.fn.constructor = jQuerySub;
+       jQuerySub.sub = this.sub;
+       jQuerySub.fn.init = function init( selector, context ) {
+               if ( context && context instanceof jQuery && !(context instanceof jQuerySub) ) {
+                       context = jQuerySub( context );
+               }
+
+               return jQuery.fn.init.call( this, selector, context, rootjQuerySub );
+       };
+       jQuerySub.fn.init.prototype = jQuerySub.fn;
+       var rootjQuerySub = jQuerySub(document);
+       return jQuerySub;
+};
+
+})();
+var curCSS, iframe, iframeDoc,
+       ralpha = /alpha\([^)]*\)/i,
+       ropacity = /opacity=([^)]*)/,
+       rposition = /^(top|right|bottom|left)$/,
+       // swappable if display is none or starts with table except "table", "table-cell", or "table-caption"
+       // see here for display values: https://developer.mozilla.org/en-US/docs/CSS/display
+       rdisplayswap = /^(none|table(?!-c[ea]).+)/,
+       rmargin = /^margin/,
+       rnumsplit = new RegExp( "^(" + core_pnum + ")(.*)$", "i" ),
+       rnumnonpx = new RegExp( "^(" + core_pnum + ")(?!px)[a-z%]+$", "i" ),
+       rrelNum = new RegExp( "^([-+])=(" + core_pnum + ")", "i" ),
+       elemdisplay = { BODY: "block" },
+
+       cssShow = { position: "absolute", visibility: "hidden", display: "block" },
+       cssNormalTransform = {
+               letterSpacing: 0,
+               fontWeight: 400
+       },
+
+       cssExpand = [ "Top", "Right", "Bottom", "Left" ],
+       cssPrefixes = [ "Webkit", "O", "Moz", "ms" ],
+
+       eventsToggle = jQuery.fn.toggle;
+
+// return a css property mapped to a potentially vendor prefixed property
+function vendorPropName( style, name ) {
+
+       // shortcut for names that are not vendor prefixed
+       if ( name in style ) {
+               return name;
+       }
+
+       // check for vendor prefixed names
+       var capName = name.charAt(0).toUpperCase() + name.slice(1),
+               origName = name,
+               i = cssPrefixes.length;
+
+       while ( i-- ) {
+               name = cssPrefixes[ i ] + capName;
+               if ( name in style ) {
+                       return name;
+               }
+       }
+
+       return origName;
+}
+
+function isHidden( elem, el ) {
+       elem = el || elem;
+       return jQuery.css( elem, "display" ) === "none" || !jQuery.contains( elem.ownerDocument, elem );
+}
+
+function showHide( elements, show ) {
+       var elem, display,
+               values = [],
+               index = 0,
+               length = elements.length;
+
+       for ( ; index < length; index++ ) {
+               elem = elements[ index ];
+               if ( !elem.style ) {
+                       continue;
+               }
+               values[ index ] = jQuery._data( elem, "olddisplay" );
+               if ( show ) {
+                       // Reset the inline display of this element to learn if it is
+                       // being hidden by cascaded rules or not
+                       if ( !values[ index ] && elem.style.display === "none" ) {
+                               elem.style.display = "";
+                       }
+
+                       // Set elements which have been overridden with display: none
+                       // in a stylesheet to whatever the default browser style is
+                       // for such an element
+                       if ( elem.style.display === "" && isHidden( elem ) ) {
+                               values[ index ] = jQuery._data( elem, "olddisplay", css_defaultDisplay(elem.nodeName) );
+                       }
+               } else {
+                       display = curCSS( elem, "display" );
+
+                       if ( !values[ index ] && display !== "none" ) {
+                               jQuery._data( elem, "olddisplay", display );
+                       }
+               }
+       }
+
+       // Set the display of most of the elements in a second loop
+       // to avoid the constant reflow
+       for ( index = 0; index < length; index++ ) {
+               elem = elements[ index ];
+               if ( !elem.style ) {
+                       continue;
+               }
+               if ( !show || elem.style.display === "none" || elem.style.display === "" ) {
+                       elem.style.display = show ? values[ index ] || "" : "none";
+               }
+       }
+
+       return elements;
+}
+
+jQuery.fn.extend({
+       css: function( name, value ) {
+               return jQuery.access( this, function( elem, name, value ) {
+                       return value !== undefined ?
+                               jQuery.style( elem, name, value ) :
+                               jQuery.css( elem, name );
+               }, name, value, arguments.length > 1 );
+       },
+       show: function() {
+               return showHide( this, true );
+       },
+       hide: function() {
+               return showHide( this );
+       },
+       toggle: function( state, fn2 ) {
+               var bool = typeof state === "boolean";
+
+               if ( jQuery.isFunction( state ) && jQuery.isFunction( fn2 ) ) {
+                       return eventsToggle.apply( this, arguments );
+               }
+
+               return this.each(function() {
+                       if ( bool ? state : isHidden( this ) ) {
+                               jQuery( this ).show();
+                       } else {
+                               jQuery( this ).hide();
+                       }
+               });
+       }
+});
+
+jQuery.extend({
+       // Add in style property hooks for overriding the default
+       // behavior of getting and setting a style property
+       cssHooks: {
+               opacity: {
+                       get: function( elem, computed ) {
+                               if ( computed ) {
+                                       // We should always get a number back from opacity
+                                       var ret = curCSS( elem, "opacity" );
+                                       return ret === "" ? "1" : ret;
+
+                               }
+                       }
+               }
+       },
+
+       // Exclude the following css properties to add px
+       cssNumber: {
+               "fillOpacity": true,
+               "fontWeight": true,
+               "lineHeight": true,
+               "opacity": true,
+               "orphans": true,
+               "widows": true,
+               "zIndex": true,
+               "zoom": true
+       },
+
+       // Add in properties whose names you wish to fix before
+       // setting or getting the value
+       cssProps: {
+               // normalize float css property
+               "float": jQuery.support.cssFloat ? "cssFloat" : "styleFloat"
+       },
+
+       // Get and set the style property on a DOM Node
+       style: function( elem, name, value, extra ) {
+               // Don't set styles on text and comment nodes
+               if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {
+                       return;
+               }
+
+               // Make sure that we're working with the right name
+               var ret, type, hooks,
+                       origName = jQuery.camelCase( name ),
+                       style = elem.style;
+
+               name = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( style, origName ) );
+
+               // gets hook for the prefixed version
+               // followed by the unprefixed version
+               hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
+
+               // Check if we're setting a value
+               if ( value !== undefined ) {
+                       type = typeof value;
+
+                       // convert relative number strings (+= or -=) to relative numbers. #7345
+                       if ( type === "string" && (ret = rrelNum.exec( value )) ) {
+                               value = ( ret[1] + 1 ) * ret[2] + parseFloat( jQuery.css( elem, name ) );
+                               // Fixes bug #9237
+                               type = "number";
+                       }
+
+                       // Make sure that NaN and null values aren't set. See: #7116
+                       if ( value == null || type === "number" && isNaN( value ) ) {
+                               return;
+                       }
+
+                       // If a number was passed in, add 'px' to the (except for certain CSS properties)
+                       if ( type === "number" && !jQuery.cssNumber[ origName ] ) {
+                               value += "px";
+                       }
+
+                       // If a hook was provided, use that value, otherwise just set the specified value
+                       if ( !hooks || !("set" in hooks) || (value = hooks.set( elem, value, extra )) !== undefined ) {
+                               // Wrapped to prevent IE from throwing errors when 'invalid' values are provided
+                               // Fixes bug #5509
+                               try {
+                                       style[ name ] = value;
+                               } catch(e) {}
+                       }
+
+               } else {
+                       // If a hook was provided get the non-computed value from there
+                       if ( hooks && "get" in hooks && (ret = hooks.get( elem, false, extra )) !== undefined ) {
+                               return ret;
+                       }
+
+                       // Otherwise just get the value from the style object
+                       return style[ name ];
+               }
+       },
+
+       css: function( elem, name, numeric, extra ) {
+               var val, num, hooks,
+                       origName = jQuery.camelCase( name );
+
+               // Make sure that we're working with the right name
+               name = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( elem.style, origName ) );
+
+               // gets hook for the prefixed version
+               // followed by the unprefixed version
+               hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
+
+               // If a hook was provided get the computed value from there
+               if ( hooks && "get" in hooks ) {
+                       val = hooks.get( elem, true, extra );
+               }
+
+               // Otherwise, if a way to get the computed value exists, use that
+               if ( val === undefined ) {
+                       val = curCSS( elem, name );
+               }
+
+               //convert "normal" to computed value
+               if ( val === "normal" && name in cssNormalTransform ) {
+                       val = cssNormalTransform[ name ];
+               }
+
+               // Return, converting to number if forced or a qualifier was provided and val looks numeric
+               if ( numeric || extra !== undefined ) {
+                       num = parseFloat( val );
+                       return numeric || jQuery.isNumeric( num ) ? num || 0 : val;
+               }
+               return val;
+       },
+
+       // A method for quickly swapping in/out CSS properties to get correct calculations
+       swap: function( elem, options, callback ) {
+               var ret, name,
+                       old = {};
+
+               // Remember the old values, and insert the new ones
+               for ( name in options ) {
+                       old[ name ] = elem.style[ name ];
+                       elem.style[ name ] = options[ name ];
+               }
+
+               ret = callback.call( elem );
+
+               // Revert the old values
+               for ( name in options ) {
+                       elem.style[ name ] = old[ name ];
+               }
+
+               return ret;
+       }
+});
+
+// NOTE: To any future maintainer, we've window.getComputedStyle
+// because jsdom on node.js will break without it.
+if ( window.getComputedStyle ) {
+       curCSS = function( elem, name ) {
+               var ret, width, minWidth, maxWidth,
+                       computed = window.getComputedStyle( elem, null ),
+                       style = elem.style;
+
+               if ( computed ) {
+
+                       // getPropertyValue is only needed for .css('filter') in IE9, see #12537
+                       ret = computed.getPropertyValue( name ) || computed[ name ];
+
+                       if ( ret === "" && !jQuery.contains( elem.ownerDocument, elem ) ) {
+                               ret = jQuery.style( elem, name );
+                       }
+
+                       // A tribute to the "awesome hack by Dean Edwards"
+                       // Chrome < 17 and Safari 5.0 uses "computed value" instead of "used value" for margin-right
+                       // Safari 5.1.7 (at least) returns percentage for a larger set of values, but width seems to be reliably pixels
+                       // this is against the CSSOM draft spec: http://dev.w3.org/csswg/cssom/#resolved-values
+                       if ( rnumnonpx.test( ret ) && rmargin.test( name ) ) {
+                               width = style.width;
+                               minWidth = style.minWidth;
+                               maxWidth = style.maxWidth;
+
+                               style.minWidth = style.maxWidth = style.width = ret;
+                               ret = computed.width;
+
+                               style.width = width;
+                               style.minWidth = minWidth;
+                               style.maxWidth = maxWidth;
+                       }
+               }
+
+               return ret;
+       };
+} else if ( document.documentElement.currentStyle ) {
+       curCSS = function( elem, name ) {
+               var left, rsLeft,
+                       ret = elem.currentStyle && elem.currentStyle[ name ],
+                       style = elem.style;
+
+               // Avoid setting ret to empty string here
+               // so we don't default to auto
+               if ( ret == null && style && style[ name ] ) {
+                       ret = style[ name ];
+               }
+
+               // From the awesome hack by Dean Edwards
+               // http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291
+
+               // If we're not dealing with a regular pixel number
+               // but a number that has a weird ending, we need to convert it to pixels
+               // but not position css attributes, as those are proportional to the parent element instead
+               // and we can't measure the parent instead because it might trigger a "stacking dolls" problem
+               if ( rnumnonpx.test( ret ) && !rposition.test( name ) ) {
+
+                       // Remember the original values
+                       left = style.left;
+                       rsLeft = elem.runtimeStyle && elem.runtimeStyle.left;
+
+                       // Put in the new values to get a computed value out
+                       if ( rsLeft ) {
+                               elem.runtimeStyle.left = elem.currentStyle.left;
+                       }
+                       style.left = name === "fontSize" ? "1em" : ret;
+                       ret = style.pixelLeft + "px";
+
+                       // Revert the changed values
+                       style.left = left;
+                       if ( rsLeft ) {
+                               elem.runtimeStyle.left = rsLeft;
+                       }
+               }
+
+               return ret === "" ? "auto" : ret;
+       };
+}
+
+function setPositiveNumber( elem, value, subtract ) {
+       var matches = rnumsplit.exec( value );
+       return matches ?
+                       Math.max( 0, matches[ 1 ] - ( subtract || 0 ) ) + ( matches[ 2 ] || "px" ) :
+                       value;
+}
+
+function augmentWidthOrHeight( elem, name, extra, isBorderBox ) {
+       var i = extra === ( isBorderBox ? "border" : "content" ) ?
+               // If we already have the right measurement, avoid augmentation
+               4 :
+               // Otherwise initialize for horizontal or vertical properties
+               name === "width" ? 1 : 0,
+
+               val = 0;
+
+       for ( ; i < 4; i += 2 ) {
+               // both box models exclude margin, so add it if we want it
+               if ( extra === "margin" ) {
+                       // we use jQuery.css instead of curCSS here
+                       // because of the reliableMarginRight CSS hook!
+                       val += jQuery.css( elem, extra + cssExpand[ i ], true );
+               }
+
+               // From this point on we use curCSS for maximum performance (relevant in animations)
+               if ( isBorderBox ) {
+                       // border-box includes padding, so remove it if we want content
+                       if ( extra === "content" ) {
+                               val -= parseFloat( curCSS( elem, "padding" + cssExpand[ i ] ) ) || 0;
+                       }
+
+                       // at this point, extra isn't border nor margin, so remove border
+                       if ( extra !== "margin" ) {
+                               val -= parseFloat( curCSS( elem, "border" + cssExpand[ i ] + "Width" ) ) || 0;
+                       }
+               } else {
+                       // at this point, extra isn't content, so add padding
+                       val += parseFloat( curCSS( elem, "padding" + cssExpand[ i ] ) ) || 0;
+
+                       // at this point, extra isn't content nor padding, so add border
+                       if ( extra !== "padding" ) {
+                               val += parseFloat( curCSS( elem, "border" + cssExpand[ i ] + "Width" ) ) || 0;
+                       }
+               }
+       }
+
+       return val;
+}
+
+function getWidthOrHeight( elem, name, extra ) {
+
+       // Start with offset property, which is equivalent to the border-box value
+       var val = name === "width" ? elem.offsetWidth : elem.offsetHeight,
+               valueIsBorderBox = true,
+               isBorderBox = jQuery.support.boxSizing && jQuery.css( elem, "boxSizing" ) === "border-box";
+
+       // some non-html elements return undefined for offsetWidth, so check for null/undefined
+       // svg - https://bugzilla.mozilla.org/show_bug.cgi?id=649285
+       // MathML - https://bugzilla.mozilla.org/show_bug.cgi?id=491668
+       if ( val <= 0 || val == null ) {
+               // Fall back to computed then uncomputed css if necessary
+               val = curCSS( elem, name );
+               if ( val < 0 || val == null ) {
+                       val = elem.style[ name ];
+               }
+
+               // Computed unit is not pixels. Stop here and return.
+               if ( rnumnonpx.test(val) ) {
+                       return val;
+               }
+
+               // we need the check for style in case a browser which returns unreliable values
+               // for getComputedStyle silently falls back to the reliable elem.style
+               valueIsBorderBox = isBorderBox && ( jQuery.support.boxSizingReliable || val === elem.style[ name ] );
+
+               // Normalize "", auto, and prepare for extra
+               val = parseFloat( val ) || 0;
+       }
+
+       // use the active box-sizing model to add/subtract irrelevant styles
+       return ( val +
+               augmentWidthOrHeight(
+                       elem,
+                       name,
+                       extra || ( isBorderBox ? "border" : "content" ),
+                       valueIsBorderBox
+               )
+       ) + "px";
+}
+
+
+// Try to determine the default display value of an element
+function css_defaultDisplay( nodeName ) {
+       if ( elemdisplay[ nodeName ] ) {
+               return elemdisplay[ nodeName ];
+       }
+
+       var elem = jQuery( "<" + nodeName + ">" ).appendTo( document.body ),
+               display = elem.css("display");
+       elem.remove();
+
+       // If the simple way fails,
+       // get element's real default display by attaching it to a temp iframe
+       if ( display === "none" || display === "" ) {
+               // Use the already-created iframe if possible
+               iframe = document.body.appendChild(
+                       iframe || jQuery.extend( document.createElement("iframe"), {
+                               frameBorder: 0,
+                               width: 0,
+                               height: 0
+                       })
+               );
+
+               // Create a cacheable copy of the iframe document on first call.
+               // IE and Opera will allow us to reuse the iframeDoc without re-writing the fake HTML
+               // document to it; WebKit & Firefox won't allow reusing the iframe document.
+               if ( !iframeDoc || !iframe.createElement ) {
+                       iframeDoc = ( iframe.contentWindow || iframe.contentDocument ).document;
+                       iframeDoc.write("<!doctype html><html><body>");
+                       iframeDoc.close();
+               }
+
+               elem = iframeDoc.body.appendChild( iframeDoc.createElement(nodeName) );
+
+               display = curCSS( elem, "display" );
+               document.body.removeChild( iframe );
+       }
+
+       // Store the correct default display
+       elemdisplay[ nodeName ] = display;
+
+       return display;
+}
+
+jQuery.each([ "height", "width" ], function( i, name ) {
+       jQuery.cssHooks[ name ] = {
+               get: function( elem, computed, extra ) {
+                       if ( computed ) {
+                               // certain elements can have dimension info if we invisibly show them
+                               // however, it must have a current display style that would benefit from this
+                               if ( elem.offsetWidth === 0 && rdisplayswap.test( curCSS( elem, "display" ) ) ) {
+                                       return jQuery.swap( elem, cssShow, function() {
+                                               return getWidthOrHeight( elem, name, extra );
+                                       });
+                               } else {
+                                       return getWidthOrHeight( elem, name, extra );
+                               }
+                       }
+               },
+
+               set: function( elem, value, extra ) {
+                       return setPositiveNumber( elem, value, extra ?
+                               augmentWidthOrHeight(
+                                       elem,
+                                       name,
+                                       extra,
+                                       jQuery.support.boxSizing && jQuery.css( elem, "boxSizing" ) === "border-box"
+                               ) : 0
+                       );
+               }
+       };
+});
+
+if ( !jQuery.support.opacity ) {
+       jQuery.cssHooks.opacity = {
+               get: function( elem, computed ) {
+                       // IE uses filters for opacity
+                       return ropacity.test( (computed && elem.currentStyle ? elem.currentStyle.filter : elem.style.filter) || "" ) ?
+                               ( 0.01 * parseFloat( RegExp.$1 ) ) + "" :
+                               computed ? "1" : "";
+               },
+
+               set: function( elem, value ) {
+                       var style = elem.style,
+                               currentStyle = elem.currentStyle,
+                               opacity = jQuery.isNumeric( value ) ? "alpha(opacity=" + value * 100 + ")" : "",
+                               filter = currentStyle && currentStyle.filter || style.filter || "";
+
+                       // IE has trouble with opacity if it does not have layout
+                       // Force it by setting the zoom level
+                       style.zoom = 1;
+
+                       // if setting opacity to 1, and no other filters exist - attempt to remove filter attribute #6652
+                       if ( value >= 1 && jQuery.trim( filter.replace( ralpha, "" ) ) === "" &&
+                               style.removeAttribute ) {
+
+                               // Setting style.filter to null, "" & " " still leave "filter:" in the cssText
+                               // if "filter:" is present at all, clearType is disabled, we want to avoid this
+                               // style.removeAttribute is IE Only, but so apparently is this code path...
+                               style.removeAttribute( "filter" );
+
+                               // if there there is no filter style applied in a css rule, we are done
+                               if ( currentStyle && !currentStyle.filter ) {
+                                       return;
+                               }
+                       }
+
+                       // otherwise, set new filter values
+                       style.filter = ralpha.test( filter ) ?
+                               filter.replace( ralpha, opacity ) :
+                               filter + " " + opacity;
+               }
+       };
+}
+
+// These hooks cannot be added until DOM ready because the support test
+// for it is not run until after DOM ready
+jQuery(function() {
+       if ( !jQuery.support.reliableMarginRight ) {
+               jQuery.cssHooks.marginRight = {
+                       get: function( elem, computed ) {
+                               // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
+                               // Work around by temporarily setting element display to inline-block
+                               return jQuery.swap( elem, { "display": "inline-block" }, function() {
+                                       if ( computed ) {
+                                               return curCSS( elem, "marginRight" );
+                                       }
+                               });
+                       }
+               };
+       }
+
+       // Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084
+       // getComputedStyle returns percent when specified for top/left/bottom/right
+       // rather than make the css module depend on the offset module, we just check for it here
+       if ( !jQuery.support.pixelPosition && jQuery.fn.position ) {
+               jQuery.each( [ "top", "left" ], function( i, prop ) {
+                       jQuery.cssHooks[ prop ] = {
+                               get: function( elem, computed ) {
+                                       if ( computed ) {
+                                               var ret = curCSS( elem, prop );
+                                               // if curCSS returns percentage, fallback to offset
+                                               return rnumnonpx.test( ret ) ? jQuery( elem ).position()[ prop ] + "px" : ret;
+                                       }
+                               }
+                       };
+               });
+       }
+
+});
+
+if ( jQuery.expr && jQuery.expr.filters ) {
+       jQuery.expr.filters.hidden = function( elem ) {
+               return ( elem.offsetWidth === 0 && elem.offsetHeight === 0 ) || (!jQuery.support.reliableHiddenOffsets && ((elem.style && elem.style.display) || curCSS( elem, "display" )) === "none");
+       };
+
+       jQuery.expr.filters.visible = function( elem ) {
+               return !jQuery.expr.filters.hidden( elem );
+       };
+}
+
+// These hooks are used by animate to expand properties
+jQuery.each({
+       margin: "",
+       padding: "",
+       border: "Width"
+}, function( prefix, suffix ) {
+       jQuery.cssHooks[ prefix + suffix ] = {
+               expand: function( value ) {
+                       var i,
+
+                               // assumes a single number if not a string
+                               parts = typeof value === "string" ? value.split(" ") : [ value ],
+                               expanded = {};
+
+                       for ( i = 0; i < 4; i++ ) {
+                               expanded[ prefix + cssExpand[ i ] + suffix ] =
+                                       parts[ i ] || parts[ i - 2 ] || parts[ 0 ];
+                       }
+
+                       return expanded;
+               }
+       };
+
+       if ( !rmargin.test( prefix ) ) {
+               jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber;
+       }
+});
+var r20 = /%20/g,
+       rbracket = /\[\]$/,
+       rCRLF = /\r?\n/g,
+       rinput = /^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,
+       rselectTextarea = /^(?:select|textarea)/i;
+
+jQuery.fn.extend({
+       serialize: function() {
+               return jQuery.param( this.serializeArray() );
+       },
+       serializeArray: function() {
+               return this.map(function(){
+                       return this.elements ? jQuery.makeArray( this.elements ) : this;
+               })
+               .filter(function(){
+                       return this.name && !this.disabled &&
+                               ( this.checked || rselectTextarea.test( this.nodeName ) ||
+                                       rinput.test( this.type ) );
+               })
+               .map(function( i, elem ){
+                       var val = jQuery( this ).val();
+
+                       return val == null ?
+                               null :
+                               jQuery.isArray( val ) ?
+                                       jQuery.map( val, function( val, i ){
+                                               return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
+                                       }) :
+                                       { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
+               }).get();
+       }
+});
+
+//Serialize an array of form elements or a set of
+//key/values into a query string
+jQuery.param = function( a, traditional ) {
+       var prefix,
+               s = [],
+               add = function( key, value ) {
+                       // If value is a function, invoke it and return its value
+                       value = jQuery.isFunction( value ) ? value() : ( value == null ? "" : value );
+                       s[ s.length ] = encodeURIComponent( key ) + "=" + encodeURIComponent( value );
+               };
+
+       // Set traditional to true for jQuery <= 1.3.2 behavior.
+       if ( traditional === undefined ) {
+               traditional = jQuery.ajaxSettings && jQuery.ajaxSettings.traditional;
+       }
+
+       // If an array was passed in, assume that it is an array of form elements.
+       if ( jQuery.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {
+               // Serialize the form elements
+               jQuery.each( a, function() {
+                       add( this.name, this.value );
+               });
+
+       } else {
+               // If traditional, encode the "old" way (the way 1.3.2 or older
+               // did it), otherwise encode params recursively.
+               for ( prefix in a ) {
+                       buildParams( prefix, a[ prefix ], traditional, add );
+               }
+       }
+
+       // Return the resulting serialization
+       return s.join( "&" ).replace( r20, "+" );
+};
+
+function buildParams( prefix, obj, traditional, add ) {
+       var name;
+
+       if ( jQuery.isArray( obj ) ) {
+               // Serialize array item.
+               jQuery.each( obj, function( i, v ) {
+                       if ( traditional || rbracket.test( prefix ) ) {
+                               // Treat each array item as a scalar.
+                               add( prefix, v );
+
+                       } else {
+                               // If array item is non-scalar (array or object), encode its
+                               // numeric index to resolve deserialization ambiguity issues.
+                               // Note that rack (as of 1.0.0) can't currently deserialize
+                               // nested arrays properly, and attempting to do so may cause
+                               // a server error. Possible fixes are to modify rack's
+                               // deserialization algorithm or to provide an option or flag
+                               // to force array serialization to be shallow.
+                               buildParams( prefix + "[" + ( typeof v === "object" ? i : "" ) + "]", v, traditional, add );
+                       }
+               });
+
+       } else if ( !traditional && jQuery.type( obj ) === "object" ) {
+               // Serialize object item.
+               for ( name in obj ) {
+                       buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add );
+               }
+
+       } else {
+               // Serialize scalar item.
+               add( prefix, obj );
+       }
+}
+var
+       // Document location
+       ajaxLocParts,
+       ajaxLocation,
+
+       rhash = /#.*$/,
+       rheaders = /^(.*?):[ \t]*([^\r\n]*)\r?$/mg, // IE leaves an \r character at EOL
+       // #7653, #8125, #8152: local protocol detection
+       rlocalProtocol = /^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,
+       rnoContent = /^(?:GET|HEAD)$/,
+       rprotocol = /^\/\//,
+       rquery = /\?/,
+       rscript = /<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,
+       rts = /([?&])_=[^&]*/,
+       rurl = /^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+)|)|)/,
+
+       // Keep a copy of the old load method
+       _load = jQuery.fn.load,
+
+       /* Prefilters
+        * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)
+        * 2) These are called:
+        *    - BEFORE asking for a transport
+        *    - AFTER param serialization (s.data is a string if s.processData is true)
+        * 3) key is the dataType
+        * 4) the catchall symbol "*" can be used
+        * 5) execution will start with transport dataType and THEN continue down to "*" if needed
+        */
+       prefilters = {},
+
+       /* Transports bindings
+        * 1) key is the dataType
+        * 2) the catchall symbol "*" can be used
+        * 3) selection will start with transport dataType and THEN go to "*" if needed
+        */
+       transports = {},
+
+       // Avoid comment-prolog char sequence (#10098); must appease lint and evade compression
+       allTypes = ["*/"] + ["*"];
+
+// #8138, IE may throw an exception when accessing
+// a field from window.location if document.domain has been set
+try {
+       ajaxLocation = location.href;
+} catch( e ) {
+       // Use the href attribute of an A element
+       // since IE will modify it given document.location
+       ajaxLocation = document.createElement( "a" );
+       ajaxLocation.href = "";
+       ajaxLocation = ajaxLocation.href;
+}
+
+// Segment location into parts
+ajaxLocParts = rurl.exec( ajaxLocation.toLowerCase() ) || [];
+
+// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport
+function addToPrefiltersOrTransports( structure ) {
+
+       // dataTypeExpression is optional and defaults to "*"
+       return function( dataTypeExpression, func ) {
+
+               if ( typeof dataTypeExpression !== "string" ) {
+                       func = dataTypeExpression;
+                       dataTypeExpression = "*";
+               }
+
+               var dataType, list, placeBefore,
+                       dataTypes = dataTypeExpression.toLowerCase().split( core_rspace ),
+                       i = 0,
+                       length = dataTypes.length;
+
+               if ( jQuery.isFunction( func ) ) {
+                       // For each dataType in the dataTypeExpression
+                       for ( ; i < length; i++ ) {
+                               dataType = dataTypes[ i ];
+                               // We control if we're asked to add before
+                               // any existing element
+                               placeBefore = /^\+/.test( dataType );
+                               if ( placeBefore ) {
+                                       dataType = dataType.substr( 1 ) || "*";
+                               }
+                               list = structure[ dataType ] = structure[ dataType ] || [];
+                               // then we add to the structure accordingly
+                               list[ placeBefore ? "unshift" : "push" ]( func );
+                       }
+               }
+       };
+}
+
+// Base inspection function for prefilters and transports
+function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR,
+               dataType /* internal */, inspected /* internal */ ) {
+
+       dataType = dataType || options.dataTypes[ 0 ];
+       inspected = inspected || {};
+
+       inspected[ dataType ] = true;
+
+       var selection,
+               list = structure[ dataType ],
+               i = 0,
+               length = list ? list.length : 0,
+               executeOnly = ( structure === prefilters );
+
+       for ( ; i < length && ( executeOnly || !selection ); i++ ) {
+               selection = list[ i ]( options, originalOptions, jqXHR );
+               // If we got redirected to another dataType
+               // we try there if executing only and not done already
+               if ( typeof selection === "string" ) {
+                       if ( !executeOnly || inspected[ selection ] ) {
+                               selection = undefined;
+                       } else {
+                               options.dataTypes.unshift( selection );
+                               selection = inspectPrefiltersOrTransports(
+                                               structure, options, originalOptions, jqXHR, selection, inspected );
+                       }
+               }
+       }
+       // If we're only executing or nothing was selected
+       // we try the catchall dataType if not done already
+       if ( ( executeOnly || !selection ) && !inspected[ "*" ] ) {
+               selection = inspectPrefiltersOrTransports(
+                               structure, options, originalOptions, jqXHR, "*", inspected );
+       }
+       // unnecessary when only executing (prefilters)
+       // but it'll be ignored by the caller in that case
+       return selection;
+}
+
+// A special extend for ajax options
+// that takes "flat" options (not to be deep extended)
+// Fixes #9887
+function ajaxExtend( target, src ) {
+       var key, deep,
+               flatOptions = jQuery.ajaxSettings.flatOptions || {};
+       for ( key in src ) {
+               if ( src[ key ] !== undefined ) {
+                       ( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ];
+               }
+       }
+       if ( deep ) {
+               jQuery.extend( true, target, deep );
+       }
+}
+
+jQuery.fn.load = function( url, params, callback ) {
+       if ( typeof url !== "string" && _load ) {
+               return _load.apply( this, arguments );
+       }
+
+       // Don't do a request if no elements are being requested
+       if ( !this.length ) {
+               return this;
+       }
+
+       var selector, type, response,
+               self = this,
+               off = url.indexOf(" ");
+
+       if ( off >= 0 ) {
+               selector = url.slice( off, url.length );
+               url = url.slice( 0, off );
+       }
+
+       // If it's a function
+       if ( jQuery.isFunction( params ) ) {
+
+               // We assume that it's the callback
+               callback = params;
+               params = undefined;
+
+       // Otherwise, build a param string
+       } else if ( params && typeof params === "object" ) {
+               type = "POST";
+       }
+
+       // Request the remote document
+       jQuery.ajax({
+               url: url,
+
+               // if "type" variable is undefined, then "GET" method will be used
+               type: type,
+               dataType: "html",
+               data: params,
+               complete: function( jqXHR, status ) {
+                       if ( callback ) {
+                               self.each( callback, response || [ jqXHR.responseText, status, jqXHR ] );
+                       }
+               }
+       }).done(function( responseText ) {
+
+               // Save response for use in complete callback
+               response = arguments;
+
+               // See if a selector was specified
+               self.html( selector ?
+
+                       // Create a dummy div to hold the results
+                       jQuery("<div>")
+
+                               // inject the contents of the document in, removing the scripts
+                               // to avoid any 'Permission Denied' errors in IE
+                               .append( responseText.replace( rscript, "" ) )
+
+                               // Locate the specified elements
+                               .find( selector ) :
+
+                       // If not, just inject the full result
+                       responseText );
+
+       });
+
+       return this;
+};
+
+// Attach a bunch of functions for handling common AJAX events
+jQuery.each( "ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split( " " ), function( i, o ){
+       jQuery.fn[ o ] = function( f ){
+               return this.on( o, f );
+       };
+});
+
+jQuery.each( [ "get", "post" ], function( i, method ) {
+       jQuery[ method ] = function( url, data, callback, type ) {
+               // shift arguments if data argument was omitted
+               if ( jQuery.isFunction( data ) ) {
+                       type = type || callback;
+                       callback = data;
+                       data = undefined;
+               }
+
+               return jQuery.ajax({
+                       type: method,
+                       url: url,
+                       data: data,
+                       success: callback,
+                       dataType: type
+               });
+       };
+});
+
+jQuery.extend({
+
+       getScript: function( url, callback ) {
+               return jQuery.get( url, undefined, callback, "script" );
+       },
+
+       getJSON: function( url, data, callback ) {
+               return jQuery.get( url, data, callback, "json" );
+       },
+
+       // Creates a full fledged settings object into target
+       // with both ajaxSettings and settings fields.
+       // If target is omitted, writes into ajaxSettings.
+       ajaxSetup: function( target, settings ) {
+               if ( settings ) {
+                       // Building a settings object
+                       ajaxExtend( target, jQuery.ajaxSettings );
+               } else {
+                       // Extending ajaxSettings
+                       settings = target;
+                       target = jQuery.ajaxSettings;
+               }
+               ajaxExtend( target, settings );
+               return target;
+       },
+
+       ajaxSettings: {
+               url: ajaxLocation,
+               isLocal: rlocalProtocol.test( ajaxLocParts[ 1 ] ),
+               global: true,
+               type: "GET",
+               contentType: "application/x-www-form-urlencoded; charset=UTF-8",
+               processData: true,
+               async: true,
+               /*
+               timeout: 0,
+               data: null,
+               dataType: null,
+               username: null,
+               password: null,
+               cache: null,
+               throws: false,
+               traditional: false,
+               headers: {},
+               */
+
+               accepts: {
+                       xml: "application/xml, text/xml",
+                       html: "text/html",
+                       text: "text/plain",
+                       json: "application/json, text/javascript",
+                       "*": allTypes
+               },
+
+               contents: {
+                       xml: /xml/,
+                       html: /html/,
+                       json: /json/
+               },
+
+               responseFields: {
+                       xml: "responseXML",
+                       text: "responseText"
+               },
+
+               // List of data converters
+               // 1) key format is "source_type destination_type" (a single space in-between)
+               // 2) the catchall symbol "*" can be used for source_type
+               converters: {
+
+                       // Convert anything to text
+                       "* text": window.String,
+
+                       // Text to html (true = no transformation)
+                       "text html": true,
+
+                       // Evaluate text as a json expression
+                       "text json": jQuery.parseJSON,
+
+                       // Parse text as xml
+                       "text xml": jQuery.parseXML
+               },
+
+               // For options that shouldn't be deep extended:
+               // you can add your own custom options here if
+               // and when you create one that shouldn't be
+               // deep extended (see ajaxExtend)
+               flatOptions: {
+                       context: true,
+                       url: true
+               }
+       },
+
+       ajaxPrefilter: addToPrefiltersOrTransports( prefilters ),
+       ajaxTransport: addToPrefiltersOrTransports( transports ),
+
+       // Main method
+       ajax: function( url, options ) {
+
+               // If url is an object, simulate pre-1.5 signature
+               if ( typeof url === "object" ) {
+                       options = url;
+                       url = undefined;
+               }
+
+               // Force options to be an object
+               options = options || {};
+
+               var // ifModified key
+                       ifModifiedKey,
+                       // Response headers
+                       responseHeadersString,
+                       responseHeaders,
+                       // transport
+                       transport,
+                       // timeout handle
+                       timeoutTimer,
+                       // Cross-domain detection vars
+                       parts,
+                       // To know if global events are to be dispatched
+                       fireGlobals,
+                       // Loop variable
+                       i,
+                       // Create the final options object
+                       s = jQuery.ajaxSetup( {}, options ),
+                       // Callbacks context
+                       callbackContext = s.context || s,
+                       // Context for global events
+                       // It's the callbackContext if one was provided in the options
+                       // and if it's a DOM node or a jQuery collection
+                       globalEventContext = callbackContext !== s &&
+                               ( callbackContext.nodeType || callbackContext instanceof jQuery ) ?
+                                               jQuery( callbackContext ) : jQuery.event,
+                       // Deferreds
+                       deferred = jQuery.Deferred(),
+                       completeDeferred = jQuery.Callbacks( "once memory" ),
+                       // Status-dependent callbacks
+                       statusCode = s.statusCode || {},
+                       // Headers (they are sent all at once)
+                       requestHeaders = {},
+                       requestHeadersNames = {},
+                       // The jqXHR state
+                       state = 0,
+                       // Default abort message
+                       strAbort = "canceled",
+                       // Fake xhr
+                       jqXHR = {
+
+                               readyState: 0,
+
+                               // Caches the header
+                               setRequestHeader: function( name, value ) {
+                                       if ( !state ) {
+                                               var lname = name.toLowerCase();
+                                               name = requestHeadersNames[ lname ] = requestHeadersNames[ lname ] || name;
+                                               requestHeaders[ name ] = value;
+                                       }
+                                       return this;
+                               },
+
+                               // Raw string
+                               getAllResponseHeaders: function() {
+                                       return state === 2 ? responseHeadersString : null;
+                               },
+
+                               // Builds headers hashtable if needed
+                               getResponseHeader: function( key ) {
+                                       var match;
+                                       if ( state === 2 ) {
+                                               if ( !responseHeaders ) {
+                                                       responseHeaders = {};
+                                                       while( ( match = rheaders.exec( responseHeadersString ) ) ) {
+                                                               responseHeaders[ match[1].toLowerCase() ] = match[ 2 ];
+                                                       }
+                                               }
+                                               match = responseHeaders[ key.toLowerCase() ];
+                                       }
+                                       return match === undefined ? null : match;
+                               },
+
+                               // Overrides response content-type header
+                               overrideMimeType: function( type ) {
+                                       if ( !state ) {
+                                               s.mimeType = type;
+                                       }
+                                       return this;
+                               },
+
+                               // Cancel the request
+                               abort: function( statusText ) {
+                                       statusText = statusText || strAbort;
+                                       if ( transport ) {
+                                               transport.abort( statusText );
+                                       }
+                                       done( 0, statusText );
+                                       return this;
+                               }
+                       };
+
+               // Callback for when everything is done
+               // It is defined here because jslint complains if it is declared
+               // at the end of the function (which would be more logical and readable)
+               function done( status, nativeStatusText, responses, headers ) {
+                       var isSuccess, success, error, response, modified,
+                               statusText = nativeStatusText;
+
+                       // Called once
+                       if ( state === 2 ) {
+                               return;
+                       }
+
+                       // State is "done" now
+                       state = 2;
+
+                       // Clear timeout if it exists
+                       if ( timeoutTimer ) {
+                               clearTimeout( timeoutTimer );
+                       }
+
+                       // Dereference transport for early garbage collection
+                       // (no matter how long the jqXHR object will be used)
+                       transport = undefined;
+
+                       // Cache response headers
+                       responseHeadersString = headers || "";
+
+                       // Set readyState
+                       jqXHR.readyState = status > 0 ? 4 : 0;
+
+                       // Get response data
+                       if ( responses ) {
+                               response = ajaxHandleResponses( s, jqXHR, responses );
+                       }
+
+                       // If successful, handle type chaining
+                       if ( status >= 200 && status < 300 || status === 304 ) {
+
+                               // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
+                               if ( s.ifModified ) {
+
+                                       modified = jqXHR.getResponseHeader("Last-Modified");
+                                       if ( modified ) {
+                                               jQuery.lastModified[ ifModifiedKey ] = modified;
+                                       }
+                                       modified = jqXHR.getResponseHeader("Etag");
+                                       if ( modified ) {
+                                               jQuery.etag[ ifModifiedKey ] = modified;
+                                       }
+                               }
+
+                               // If not modified
+                               if ( status === 304 ) {
+
+                                       statusText = "notmodified";
+                                       isSuccess = true;
+
+                               // If we have data
+                               } else {
+
+                                       isSuccess = ajaxConvert( s, response );
+                                       statusText = isSuccess.state;
+                                       success = isSuccess.data;
+                                       error = isSuccess.error;
+                                       isSuccess = !error;
+                               }
+                       } else {
+                               // We extract error from statusText
+                               // then normalize statusText and status for non-aborts
+                               error = statusText;
+                               if ( !statusText || status ) {
+                                       statusText = "error";
+                                       if ( status < 0 ) {
+                                               status = 0;
+                                       }
+                               }
+                       }
+
+                       // Set data for the fake xhr object
+                       jqXHR.status = status;
+                       jqXHR.statusText = ( nativeStatusText || statusText ) + "";
+
+                       // Success/Error
+                       if ( isSuccess ) {
+                               deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );
+                       } else {
+                               deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );
+                       }
+
+                       // Status-dependent callbacks
+                       jqXHR.statusCode( statusCode );
+                       statusCode = undefined;
+
+                       if ( fireGlobals ) {
+                               globalEventContext.trigger( "ajax" + ( isSuccess ? "Success" : "Error" ),
+                                               [ jqXHR, s, isSuccess ? success : error ] );
+                       }
+
+                       // Complete
+                       completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );
+
+                       if ( fireGlobals ) {
+                               globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] );
+                               // Handle the global AJAX counter
+                               if ( !( --jQuery.active ) ) {
+                                       jQuery.event.trigger( "ajaxStop" );
+                               }
+                       }
+               }
+
+               // Attach deferreds
+               deferred.promise( jqXHR );
+               jqXHR.success = jqXHR.done;
+               jqXHR.error = jqXHR.fail;
+               jqXHR.complete = completeDeferred.add;
+
+               // Status-dependent callbacks
+               jqXHR.statusCode = function( map ) {
+                       if ( map ) {
+                               var tmp;
+                               if ( state < 2 ) {
+                                       for ( tmp in map ) {
+                                               statusCode[ tmp ] = [ statusCode[tmp], map[tmp] ];
+                                       }
+                               } else {
+                                       tmp = map[ jqXHR.status ];
+                                       jqXHR.always( tmp );
+                               }
+                       }
+                       return this;
+               };
+
+               // Remove hash character (#7531: and string promotion)
+               // Add protocol if not provided (#5866: IE7 issue with protocol-less urls)
+               // We also use the url parameter if available
+               s.url = ( ( url || s.url ) + "" ).replace( rhash, "" ).replace( rprotocol, ajaxLocParts[ 1 ] + "//" );
+
+               // Extract dataTypes list
+               s.dataTypes = jQuery.trim( s.dataType || "*" ).toLowerCase().split( core_rspace );
+
+               // A cross-domain request is in order when we have a protocol:host:port mismatch
+               if ( s.crossDomain == null ) {
+                       parts = rurl.exec( s.url.toLowerCase() );
+                       s.crossDomain = !!( parts &&
+                               ( parts[ 1 ] !== ajaxLocParts[ 1 ] || parts[ 2 ] !== ajaxLocParts[ 2 ] ||
+                                       ( parts[ 3 ] || ( parts[ 1 ] === "http:" ? 80 : 443 ) ) !=
+                                               ( ajaxLocParts[ 3 ] || ( ajaxLocParts[ 1 ] === "http:" ? 80 : 443 ) ) )
+                       );
+               }
+
+               // Convert data if not already a string
+               if ( s.data && s.processData && typeof s.data !== "string" ) {
+                       s.data = jQuery.param( s.data, s.traditional );
+               }
+
+               // Apply prefilters
+               inspectPrefiltersOrTransports( prefilters, s, options, jqXHR );
+
+               // If request was aborted inside a prefilter, stop there
+               if ( state === 2 ) {
+                       return jqXHR;
+               }
+
+               // We can fire global events as of now if asked to
+               fireGlobals = s.global;
+
+               // Uppercase the type
+               s.type = s.type.toUpperCase();
+
+               // Determine if request has content
+               s.hasContent = !rnoContent.test( s.type );
+
+               // Watch for a new set of requests
+               if ( fireGlobals && jQuery.active++ === 0 ) {
+                       jQuery.event.trigger( "ajaxStart" );
+               }
+
+               // More options handling for requests with no content
+               if ( !s.hasContent ) {
+
+                       // If data is available, append data to url
+                       if ( s.data ) {
+                               s.url += ( rquery.test( s.url ) ? "&" : "?" ) + s.data;
+                               // #9682: remove data so that it's not used in an eventual retry
+                               delete s.data;
+                       }
+
+                       // Get ifModifiedKey before adding the anti-cache parameter
+                       ifModifiedKey = s.url;
+
+                       // Add anti-cache in url if needed
+                       if ( s.cache === false ) {
+
+                               var ts = jQuery.now(),
+                                       // try replacing _= if it is there
+                                       ret = s.url.replace( rts, "$1_=" + ts );
+
+                               // if nothing was replaced, add timestamp to the end
+                               s.url = ret + ( ( ret === s.url ) ? ( rquery.test( s.url ) ? "&" : "?" ) + "_=" + ts : "" );
+                       }
+               }
+
+               // Set the correct header, if data is being sent
+               if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {
+                       jqXHR.setRequestHeader( "Content-Type", s.contentType );
+               }
+
+               // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
+               if ( s.ifModified ) {
+                       ifModifiedKey = ifModifiedKey || s.url;
+                       if ( jQuery.lastModified[ ifModifiedKey ] ) {
+                               jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ ifModifiedKey ] );
+                       }
+                       if ( jQuery.etag[ ifModifiedKey ] ) {
+                               jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ ifModifiedKey ] );
+                       }
+               }
+
+               // Set the Accepts header for the server, depending on the dataType
+               jqXHR.setRequestHeader(
+                       "Accept",
+                       s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[0] ] ?
+                               s.accepts[ s.dataTypes[0] ] + ( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) :
+                               s.accepts[ "*" ]
+               );
+
+               // Check for headers option
+               for ( i in s.headers ) {
+                       jqXHR.setRequestHeader( i, s.headers[ i ] );
+               }
+
+               // Allow custom headers/mimetypes and early abort
+               if ( s.beforeSend && ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || state === 2 ) ) {
+                               // Abort if not done already and return
+                               return jqXHR.abort();
+
+               }
+
+               // aborting is no longer a cancellation
+               strAbort = "abort";
+
+               // Install callbacks on deferreds
+               for ( i in { success: 1, error: 1, complete: 1 } ) {
+                       jqXHR[ i ]( s[ i ] );
+               }
+
+               // Get transport
+               transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );
+
+               // If no transport, we auto-abort
+               if ( !transport ) {
+                       done( -1, "No Transport" );
+               } else {
+                       jqXHR.readyState = 1;
+                       // Send global event
+                       if ( fireGlobals ) {
+                               globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] );
+                       }
+                       // Timeout
+                       if ( s.async && s.timeout > 0 ) {
+                               timeoutTimer = setTimeout( function(){
+                                       jqXHR.abort( "timeout" );
+                               }, s.timeout );
+                       }
+
+                       try {
+                               state = 1;
+                               transport.send( requestHeaders, done );
+                       } catch (e) {
+                               // Propagate exception as error if not done
+                               if ( state < 2 ) {
+                                       done( -1, e );
+                               // Simply rethrow otherwise
+                               } else {
+                                       throw e;
+                               }
+                       }
+               }
+
+               return jqXHR;
+       },
+
+       // Counter for holding the number of active queries
+       active: 0,
+
+       // Last-Modified header cache for next request
+       lastModified: {},
+       etag: {}
+
+});
+
+/* Handles responses to an ajax request:
+ * - sets all responseXXX fields accordingly
+ * - finds the right dataType (mediates between content-type and expected dataType)
+ * - returns the corresponding response
+ */
+function ajaxHandleResponses( s, jqXHR, responses ) {
+
+       var ct, type, finalDataType, firstDataType,
+               contents = s.contents,
+               dataTypes = s.dataTypes,
+               responseFields = s.responseFields;
+
+       // Fill responseXXX fields
+       for ( type in responseFields ) {
+               if ( type in responses ) {
+                       jqXHR[ responseFields[type] ] = responses[ type ];
+               }
+       }
+
+       // Remove auto dataType and get content-type in the process
+       while( dataTypes[ 0 ] === "*" ) {
+               dataTypes.shift();
+               if ( ct === undefined ) {
+                       ct = s.mimeType || jqXHR.getResponseHeader( "content-type" );
+               }
+       }
+
+       // Check if we're dealing with a known content-type
+       if ( ct ) {
+               for ( type in contents ) {
+                       if ( contents[ type ] && contents[ type ].test( ct ) ) {
+                               dataTypes.unshift( type );
+                               break;
+                       }
+               }
+       }
+
+       // Check to see if we have a response for the expected dataType
+       if ( dataTypes[ 0 ] in responses ) {
+               finalDataType = dataTypes[ 0 ];
+       } else {
+               // Try convertible dataTypes
+               for ( type in responses ) {
+                       if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[0] ] ) {
+                               finalDataType = type;
+                               break;
+                       }
+                       if ( !firstDataType ) {
+                               firstDataType = type;
+                       }
+               }
+               // Or just use first one
+               finalDataType = finalDataType || firstDataType;
+       }
+
+       // If we found a dataType
+       // We add the dataType to the list if needed
+       // and return the corresponding response
+       if ( finalDataType ) {
+               if ( finalDataType !== dataTypes[ 0 ] ) {
+                       dataTypes.unshift( finalDataType );
+               }
+               return responses[ finalDataType ];
+       }
+}
+
+// Chain conversions given the request and the original response
+function ajaxConvert( s, response ) {
+
+       var conv, conv2, current, tmp,
+               // Work with a copy of dataTypes in case we need to modify it for conversion
+               dataTypes = s.dataTypes.slice(),
+               prev = dataTypes[ 0 ],
+               converters = {},
+               i = 0;
+
+       // Apply the dataFilter if provided
+       if ( s.dataFilter ) {
+               response = s.dataFilter( response, s.dataType );
+       }
+
+       // Create converters map with lowercased keys
+       if ( dataTypes[ 1 ] ) {
+               for ( conv in s.converters ) {
+                       converters[ conv.toLowerCase() ] = s.converters[ conv ];
+               }
+       }
+
+       // Convert to each sequential dataType, tolerating list modification
+       for ( ; (current = dataTypes[++i]); ) {
+
+               // There's only work to do if current dataType is non-auto
+               if ( current !== "*" ) {
+
+                       // Convert response if prev dataType is non-auto and differs from current
+                       if ( prev !== "*" && prev !== current ) {
+
+                               // Seek a direct converter
+                               conv = converters[ prev + " " + current ] || converters[ "* " + current ];
+
+                               // If none found, seek a pair
+                               if ( !conv ) {
+                                       for ( conv2 in converters ) {
+
+                                               // If conv2 outputs current
+                                               tmp = conv2.split(" ");
+                                               if ( tmp[ 1 ] === current ) {
+
+                                                       // If prev can be converted to accepted input
+                                                       conv = converters[ prev + " " + tmp[ 0 ] ] ||
+                                                               converters[ "* " + tmp[ 0 ] ];
+                                                       if ( conv ) {
+                                                               // Condense equivalence converters
+                                                               if ( conv === true ) {
+                                                                       conv = converters[ conv2 ];
+
+                                                               // Otherwise, insert the intermediate dataType
+                                                               } else if ( converters[ conv2 ] !== true ) {
+                                                                       current = tmp[ 0 ];
+                                                                       dataTypes.splice( i--, 0, current );
+                                                               }
+
+                                                               break;
+                                                       }
+                                               }
+                                       }
+                               }
+
+                               // Apply converter (if not an equivalence)
+                               if ( conv !== true ) {
+
+                                       // Unless errors are allowed to bubble, catch and return them
+                                       if ( conv && s["throws"] ) {
+                                               response = conv( response );
+                                       } else {
+                                               try {
+                                                       response = conv( response );
+                                               } catch ( e ) {
+                                                       return { state: "parsererror", error: conv ? e : "No conversion from " + prev + " to " + current };
+                                               }
+                                       }
+                               }
+                       }
+
+                       // Update prev for next iteration
+                       prev = current;
+               }
+       }
+
+       return { state: "success", data: response };
+}
+var oldCallbacks = [],
+       rquestion = /\?/,
+       rjsonp = /(=)\?(?=&|$)|\?\?/,
+       nonce = jQuery.now();
+
+// Default jsonp settings
+jQuery.ajaxSetup({
+       jsonp: "callback",
+       jsonpCallback: function() {
+               var callback = oldCallbacks.pop() || ( jQuery.expando + "_" + ( nonce++ ) );
+               this[ callback ] = true;
+               return callback;
+       }
+});
+
+// Detect, normalize options and install callbacks for jsonp requests
+jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) {
+
+       var callbackName, overwritten, responseContainer,
+               data = s.data,
+               url = s.url,
+               hasCallback = s.jsonp !== false,
+               replaceInUrl = hasCallback && rjsonp.test( url ),
+               replaceInData = hasCallback && !replaceInUrl && typeof data === "string" &&
+                       !( s.contentType || "" ).indexOf("application/x-www-form-urlencoded") &&
+                       rjsonp.test( data );
+
+       // Handle iff the expected data type is "jsonp" or we have a parameter to set
+       if ( s.dataTypes[ 0 ] === "jsonp" || replaceInUrl || replaceInData ) {
+
+               // Get callback name, remembering preexisting value associated with it
+               callbackName = s.jsonpCallback = jQuery.isFunction( s.jsonpCallback ) ?
+                       s.jsonpCallback() :
+                       s.jsonpCallback;
+               overwritten = window[ callbackName ];
+
+               // Insert callback into url or form data
+               if ( replaceInUrl ) {
+                       s.url = url.replace( rjsonp, "$1" + callbackName );
+               } else if ( replaceInData ) {
+                       s.data = data.replace( rjsonp, "$1" + callbackName );
+               } else if ( hasCallback ) {
+                       s.url += ( rquestion.test( url ) ? "&" : "?" ) + s.jsonp + "=" + callbackName;
+               }
+
+               // Use data converter to retrieve json after script execution
+               s.converters["script json"] = function() {
+                       if ( !responseContainer ) {
+                               jQuery.error( callbackName + " was not called" );
+                       }
+                       return responseContainer[ 0 ];
+               };
+
+               // force json dataType
+               s.dataTypes[ 0 ] = "json";
+
+               // Install callback
+               window[ callbackName ] = function() {
+                       responseContainer = arguments;
+               };
+
+               // Clean-up function (fires after converters)
+               jqXHR.always(function() {
+                       // Restore preexisting value
+                       window[ callbackName ] = overwritten;
+
+                       // Save back as free
+                       if ( s[ callbackName ] ) {
+                               // make sure that re-using the options doesn't screw things around
+                               s.jsonpCallback = originalSettings.jsonpCallback;
+
+                               // save the callback name for future use
+                               oldCallbacks.push( callbackName );
+                       }
+
+                       // Call if it was a function and we have a response
+                       if ( responseContainer && jQuery.isFunction( overwritten ) ) {
+                               overwritten( responseContainer[ 0 ] );
+                       }
+
+                       responseContainer = overwritten = undefined;
+               });
+
+               // Delegate to script
+               return "script";
+       }
+});
+// Install script dataType
+jQuery.ajaxSetup({
+       accepts: {
+               script: "text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"
+       },
+       contents: {
+               script: /javascript|ecmascript/
+       },
+       converters: {
+               "text script": function( text ) {
+                       jQuery.globalEval( text );
+                       return text;
+               }
+       }
+});
+
+// Handle cache's special case and global
+jQuery.ajaxPrefilter( "script", function( s ) {
+       if ( s.cache === undefined ) {
+               s.cache = false;
+       }
+       if ( s.crossDomain ) {
+               s.type = "GET";
+               s.global = false;
+       }
+});
+
+// Bind script tag hack transport
+jQuery.ajaxTransport( "script", function(s) {
+
+       // This transport only deals with cross domain requests
+       if ( s.crossDomain ) {
+
+               var script,
+                       head = document.head || document.getElementsByTagName( "head" )[0] || document.documentElement;
+
+               return {
+
+                       send: function( _, callback ) {
+
+                               script = document.createElement( "script" );
+
+                               script.async = "async";
+
+                               if ( s.scriptCharset ) {
+                                       script.charset = s.scriptCharset;
+                               }
+
+                               script.src = s.url;
+
+                               // Attach handlers for all browsers
+                               script.onload = script.onreadystatechange = function( _, isAbort ) {
+
+                                       if ( isAbort || !script.readyState || /loaded|complete/.test( script.readyState ) ) {
+
+                                               // Handle memory leak in IE
+                                               script.onload = script.onreadystatechange = null;
+
+                                               // Remove the script
+                                               if ( head && script.parentNode ) {
+                                                       head.removeChild( script );
+                                               }
+
+                                               // Dereference the script
+                                               script = undefined;
+
+                                               // Callback if not abort
+                                               if ( !isAbort ) {
+                                                       callback( 200, "success" );
+                                               }
+                                       }
+                               };
+                               // Use insertBefore instead of appendChild  to circumvent an IE6 bug.
+                               // This arises when a base node is used (#2709 and #4378).
+                               head.insertBefore( script, head.firstChild );
+                       },
+
+                       abort: function() {
+                               if ( script ) {
+                                       script.onload( 0, 1 );
+                               }
+                       }
+               };
+       }
+});
+var xhrCallbacks,
+       // #5280: Internet Explorer will keep connections alive if we don't abort on unload
+       xhrOnUnloadAbort = window.ActiveXObject ? function() {
+               // Abort all pending requests
+               for ( var key in xhrCallbacks ) {
+                       xhrCallbacks[ key ]( 0, 1 );
+               }
+       } : false,
+       xhrId = 0;
+
+// Functions to create xhrs
+function createStandardXHR() {
+       try {
+               return new window.XMLHttpRequest();
+       } catch( e ) {}
+}
+
+function createActiveXHR() {
+       try {
+               return new window.ActiveXObject( "Microsoft.XMLHTTP" );
+       } catch( e ) {}
+}
+
+// Create the request object
+// (This is still attached to ajaxSettings for backward compatibility)
+jQuery.ajaxSettings.xhr = window.ActiveXObject ?
+       /* Microsoft failed to properly
+        * implement the XMLHttpRequest in IE7 (can't request local files),
+        * so we use the ActiveXObject when it is available
+        * Additionally XMLHttpRequest can be disabled in IE7/IE8 so
+        * we need a fallback.
+        */
+       function() {
+               return !this.isLocal && createStandardXHR() || createActiveXHR();
+       } :
+       // For all other browsers, use the standard XMLHttpRequest object
+       createStandardXHR;
+
+// Determine support properties
+(function( xhr ) {
+       jQuery.extend( jQuery.support, {
+               ajax: !!xhr,
+               cors: !!xhr && ( "withCredentials" in xhr )
+       });
+})( jQuery.ajaxSettings.xhr() );
+
+// Create transport if the browser can provide an xhr
+if ( jQuery.support.ajax ) {
+
+       jQuery.ajaxTransport(function( s ) {
+               // Cross domain only allowed if supported through XMLHttpRequest
+               if ( !s.crossDomain || jQuery.support.cors ) {
+
+                       var callback;
+
+                       return {
+                               send: function( headers, complete ) {
+
+                                       // Get a new xhr
+                                       var handle, i,
+                                               xhr = s.xhr();
+
+                                       // Open the socket
+                                       // Passing null username, generates a login popup on Opera (#2865)
+                                       if ( s.username ) {
+                                               xhr.open( s.type, s.url, s.async, s.username, s.password );
+                                       } else {
+                                               xhr.open( s.type, s.url, s.async );
+                                       }
+
+                                       // Apply custom fields if provided
+                                       if ( s.xhrFields ) {
+                                               for ( i in s.xhrFields ) {
+                                                       xhr[ i ] = s.xhrFields[ i ];
+                                               }
+                                       }
+
+                                       // Override mime type if needed
+                                       if ( s.mimeType && xhr.overrideMimeType ) {
+                                               xhr.overrideMimeType( s.mimeType );
+                                       }
+
+                                       // X-Requested-With header
+                                       // For cross-domain requests, seeing as conditions for a preflight are
+                                       // akin to a jigsaw puzzle, we simply never set it to be sure.
+                                       // (it can always be set on a per-request basis or even using ajaxSetup)
+                                       // For same-domain requests, won't change header if already provided.
+                                       if ( !s.crossDomain && !headers["X-Requested-With"] ) {
+                                               headers[ "X-Requested-With" ] = "XMLHttpRequest";
+                                       }
+
+                                       // Need an extra try/catch for cross domain requests in Firefox 3
+                                       try {
+                                               for ( i in headers ) {
+                                                       xhr.setRequestHeader( i, headers[ i ] );
+                                               }
+                                       } catch( _ ) {}
+
+                                       // Do send the request
+                                       // This may raise an exception which is actually
+                                       // handled in jQuery.ajax (so no try/catch here)
+                                       xhr.send( ( s.hasContent && s.data ) || null );
+
+                                       // Listener
+                                       callback = function( _, isAbort ) {
+
+                                               var status,
+                                                       statusText,
+                                                       responseHeaders,
+                                                       responses,
+                                                       xml;
+
+                                               // Firefox throws exceptions when accessing properties
+                                               // of an xhr when a network error occurred
+                                               // http://helpful.knobs-dials.com/index.php/Component_returned_failure_code:_0x80040111_(NS_ERROR_NOT_AVAILABLE)
+                                               try {
+
+                                                       // Was never called and is aborted or complete
+                                                       if ( callback && ( isAbort || xhr.readyState === 4 ) ) {
+
+                                                               // Only called once
+                                                               callback = undefined;
+
+                                                               // Do not keep as active anymore
+                                                               if ( handle ) {
+                                                                       xhr.onreadystatechange = jQuery.noop;
+                                                                       if ( xhrOnUnloadAbort ) {
+                                                                               delete xhrCallbacks[ handle ];
+                                                                       }
+                                                               }
+
+                                                               // If it's an abort
+                                                               if ( isAbort ) {
+                                                                       // Abort it manually if needed
+                                                                       if ( xhr.readyState !== 4 ) {
+                                                                               xhr.abort();
+                                                                       }
+                                                               } else {
+                                                                       status = xhr.status;
+                                                                       responseHeaders = xhr.getAllResponseHeaders();
+                                                                       responses = {};
+                                                                       xml = xhr.responseXML;
+
+                                                                       // Construct response list
+                                                                       if ( xml && xml.documentElement /* #4958 */ ) {
+                                                                               responses.xml = xml;
+                                                                       }
+
+                                                                       // When requesting binary data, IE6-9 will throw an exception
+                                                                       // on any attempt to access responseText (#11426)
+                                                                       try {
+                                                                               responses.text = xhr.responseText;
+                                                                       } catch( e ) {
+                                                                       }
+
+                                                                       // Firefox throws an exception when accessing
+                                                                       // statusText for faulty cross-domain requests
+                                                                       try {
+                                                                               statusText = xhr.statusText;
+                                                                       } catch( e ) {
+                                                                               // We normalize with Webkit giving an empty statusText
+                                                                               statusText = "";
+                                                                       }
+
+                                                                       // Filter status for non standard behaviors
+
+                                                                       // If the request is local and we have data: assume a success
+                                                                       // (success with no data won't get notified, that's the best we
+                                                                       // can do given current implementations)
+                                                                       if ( !status && s.isLocal && !s.crossDomain ) {
+                                                                               status = responses.text ? 200 : 404;
+                                                                       // IE - #1450: sometimes returns 1223 when it should be 204
+                                                                       } else if ( status === 1223 ) {
+                                                                               status = 204;
+                                                                       }
+                                                               }
+                                                       }
+                                               } catch( firefoxAccessException ) {
+                                                       if ( !isAbort ) {
+                                                               complete( -1, firefoxAccessException );
+                                                       }
+                                               }
+
+                                               // Call complete if needed
+                                               if ( responses ) {
+                                                       complete( status, statusText, responses, responseHeaders );
+                                               }
+                                       };
+
+                                       if ( !s.async ) {
+                                               // if we're in sync mode we fire the callback
+                                               callback();
+                                       } else if ( xhr.readyState === 4 ) {
+                                               // (IE6 & IE7) if it's in cache and has been
+                                               // retrieved directly we need to fire the callback
+                                               setTimeout( callback, 0 );
+                                       } else {
+                                               handle = ++xhrId;
+                                               if ( xhrOnUnloadAbort ) {
+                                                       // Create the active xhrs callbacks list if needed
+                                                       // and attach the unload handler
+                                                       if ( !xhrCallbacks ) {
+                                                               xhrCallbacks = {};
+                                                               jQuery( window ).unload( xhrOnUnloadAbort );
+                                                       }
+                                                       // Add to list of active xhrs callbacks
+                                                       xhrCallbacks[ handle ] = callback;
+                                               }
+                                               xhr.onreadystatechange = callback;
+                                       }
+                               },
+
+                               abort: function() {
+                                       if ( callback ) {
+                                               callback(0,1);
+                                       }
+                               }
+                       };
+               }
+       });
+}
+var fxNow, timerId,
+       rfxtypes = /^(?:toggle|show|hide)$/,
+       rfxnum = new RegExp( "^(?:([-+])=|)(" + core_pnum + ")([a-z%]*)$", "i" ),
+       rrun = /queueHooks$/,
+       animationPrefilters = [ defaultPrefilter ],
+       tweeners = {
+               "*": [function( prop, value ) {
+                       var end, unit,
+                               tween = this.createTween( prop, value ),
+                               parts = rfxnum.exec( value ),
+                               target = tween.cur(),
+                               start = +target || 0,
+                               scale = 1,
+                               maxIterations = 20;
+
+                       if ( parts ) {
+                               end = +parts[2];
+                               unit = parts[3] || ( jQuery.cssNumber[ prop ] ? "" : "px" );
+
+                               // We need to compute starting value
+                               if ( unit !== "px" && start ) {
+                                       // Iteratively approximate from a nonzero starting point
+                                       // Prefer the current property, because this process will be trivial if it uses the same units
+                                       // Fallback to end or a simple constant
+                                       start = jQuery.css( tween.elem, prop, true ) || end || 1;
+
+                                       do {
+                                               // If previous iteration zeroed out, double until we get *something*
+                                               // Use a string for doubling factor so we don't accidentally see scale as unchanged below
+                                               scale = scale || ".5";
+
+                                               // Adjust and apply
+                                               start = start / scale;
+                                               jQuery.style( tween.elem, prop, start + unit );
+
+                                       // Update scale, tolerating zero or NaN from tween.cur()
+                                       // And breaking the loop if scale is unchanged or perfect, or if we've just had enough
+                                       } while ( scale !== (scale = tween.cur() / target) && scale !== 1 && --maxIterations );
+                               }
+
+                               tween.unit = unit;
+                               tween.start = start;
+                               // If a +=/-= token was provided, we're doing a relative animation
+                               tween.end = parts[1] ? start + ( parts[1] + 1 ) * end : end;
+                       }
+                       return tween;
+               }]
+       };
+
+// Animations created synchronously will run synchronously
+function createFxNow() {
+       setTimeout(function() {
+               fxNow = undefined;
+       }, 0 );
+       return ( fxNow = jQuery.now() );
+}
+
+function createTweens( animation, props ) {
+       jQuery.each( props, function( prop, value ) {
+               var collection = ( tweeners[ prop ] || [] ).concat( tweeners[ "*" ] ),
+                       index = 0,
+                       length = collection.length;
+               for ( ; index < length; index++ ) {
+                       if ( collection[ index ].call( animation, prop, value ) ) {
+
+                               // we're done with this property
+                               return;
+                       }
+               }
+       });
+}
+
+function Animation( elem, properties, options ) {
+       var result,
+               index = 0,
+               tweenerIndex = 0,
+               length = animationPrefilters.length,
+               deferred = jQuery.Deferred().always( function() {
+                       // don't match elem in the :animated selector
+                       delete tick.elem;
+               }),
+               tick = function() {
+                       var currentTime = fxNow || createFxNow(),
+                               remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ),
+                               // archaic crash bug won't allow us to use 1 - ( 0.5 || 0 ) (#12497)
+                               temp = remaining / animation.duration || 0,
+                               percent = 1 - temp,
+                               index = 0,
+                               length = animation.tweens.length;
+
+                       for ( ; index < length ; index++ ) {
+                               animation.tweens[ index ].run( percent );
+                       }
+
+                       deferred.notifyWith( elem, [ animation, percent, remaining ]);
+
+                       if ( percent < 1 && length ) {
+                               return remaining;
+                       } else {
+                               deferred.resolveWith( elem, [ animation ] );
+                               return false;
+                       }
+               },
+               animation = deferred.promise({
+                       elem: elem,
+                       props: jQuery.extend( {}, properties ),
+                       opts: jQuery.extend( true, { specialEasing: {} }, options ),
+                       originalProperties: properties,
+                       originalOptions: options,
+                       startTime: fxNow || createFxNow(),
+                       duration: options.duration,
+                       tweens: [],
+                       createTween: function( prop, end, easing ) {
+                               var tween = jQuery.Tween( elem, animation.opts, prop, end,
+                                               animation.opts.specialEasing[ prop ] || animation.opts.easing );
+                               animation.tweens.push( tween );
+                               return tween;
+                       },
+                       stop: function( gotoEnd ) {
+                               var index = 0,
+                                       // if we are going to the end, we want to run all the tweens
+                                       // otherwise we skip this part
+                                       length = gotoEnd ? animation.tweens.length : 0;
+
+                               for ( ; index < length ; index++ ) {
+                                       animation.tweens[ index ].run( 1 );
+                               }
+
+                               // resolve when we played the last frame
+                               // otherwise, reject
+                               if ( gotoEnd ) {
+                                       deferred.resolveWith( elem, [ animation, gotoEnd ] );
+                               } else {
+                                       deferred.rejectWith( elem, [ animation, gotoEnd ] );
+                               }
+                               return this;
+                       }
+               }),
+               props = animation.props;
+
+       propFilter( props, animation.opts.specialEasing );
+
+       for ( ; index < length ; index++ ) {
+               result = animationPrefilters[ index ].call( animation, elem, props, animation.opts );
+               if ( result ) {
+                       return result;
+               }
+       }
+
+       createTweens( animation, props );
+
+       if ( jQuery.isFunction( animation.opts.start ) ) {
+               animation.opts.start.call( elem, animation );
+       }
+
+       jQuery.fx.timer(
+               jQuery.extend( tick, {
+                       anim: animation,
+                       queue: animation.opts.queue,
+                       elem: elem
+               })
+       );
+
+       // attach callbacks from options
+       return animation.progress( animation.opts.progress )
+               .done( animation.opts.done, animation.opts.complete )
+               .fail( animation.opts.fail )
+               .always( animation.opts.always );
+}
+
+function propFilter( props, specialEasing ) {
+       var index, name, easing, value, hooks;
+
+       // camelCase, specialEasing and expand cssHook pass
+       for ( index in props ) {
+               name = jQuery.camelCase( index );
+               easing = specialEasing[ name ];
+               value = props[ index ];
+               if ( jQuery.isArray( value ) ) {
+                       easing = value[ 1 ];
+                       value = props[ index ] = value[ 0 ];
+               }
+
+               if ( index !== name ) {
+                       props[ name ] = value;
+                       delete props[ index ];
+               }
+
+               hooks = jQuery.cssHooks[ name ];
+               if ( hooks && "expand" in hooks ) {
+                       value = hooks.expand( value );
+                       delete props[ name ];
+
+                       // not quite $.extend, this wont overwrite keys already present.
+                       // also - reusing 'index' from above because we have the correct "name"
+                       for ( index in value ) {
+                               if ( !( index in props ) ) {
+                                       props[ index ] = value[ index ];
+                                       specialEasing[ index ] = easing;
+                               }
+                       }
+               } else {
+                       specialEasing[ name ] = easing;
+               }
+       }
+}
+
+jQuery.Animation = jQuery.extend( Animation, {
+
+       tweener: function( props, callback ) {
+               if ( jQuery.isFunction( props ) ) {
+                       callback = props;
+                       props = [ "*" ];
+               } else {
+                       props = props.split(" ");
+               }
+
+               var prop,
+                       index = 0,
+                       length = props.length;
+
+               for ( ; index < length ; index++ ) {
+                       prop = props[ index ];
+                       tweeners[ prop ] = tweeners[ prop ] || [];
+                       tweeners[ prop ].unshift( callback );
+               }
+       },
+
+       prefilter: function( callback, prepend ) {
+               if ( prepend ) {
+                       animationPrefilters.unshift( callback );
+               } else {
+                       animationPrefilters.push( callback );
+               }
+       }
+});
+
+function defaultPrefilter( elem, props, opts ) {
+       var index, prop, value, length, dataShow, toggle, tween, hooks, oldfire,
+               anim = this,
+               style = elem.style,
+               orig = {},
+               handled = [],
+               hidden = elem.nodeType && isHidden( elem );
+
+       // handle queue: false promises
+       if ( !opts.queue ) {
+               hooks = jQuery._queueHooks( elem, "fx" );
+               if ( hooks.unqueued == null ) {
+                       hooks.unqueued = 0;
+                       oldfire = hooks.empty.fire;
+                       hooks.empty.fire = function() {
+                               if ( !hooks.unqueued ) {
+                                       oldfire();
+                               }
+                       };
+               }
+               hooks.unqueued++;
+
+               anim.always(function() {
+                       // doing this makes sure that the complete handler will be called
+                       // before this completes
+                       anim.always(function() {
+                               hooks.unqueued--;
+                               if ( !jQuery.queue( elem, "fx" ).length ) {
+                                       hooks.empty.fire();
+                               }
+                       });
+               });
+       }
+
+       // height/width overflow pass
+       if ( elem.nodeType === 1 && ( "height" in props || "width" in props ) ) {
+               // Make sure that nothing sneaks out
+               // Record all 3 overflow attributes because IE does not
+               // change the overflow attribute when overflowX and
+               // overflowY are set to the same value
+               opts.overflow = [ style.overflow, style.overflowX, style.overflowY ];
+
+               // Set display property to inline-block for height/width
+               // animations on inline elements that are having width/height animated
+               if ( jQuery.css( elem, "display" ) === "inline" &&
+                               jQuery.css( elem, "float" ) === "none" ) {
+
+                       // inline-level elements accept inline-block;
+                       // block-level elements need to be inline with layout
+                       if ( !jQuery.support.inlineBlockNeedsLayout || css_defaultDisplay( elem.nodeName ) === "inline" ) {
+                               style.display = "inline-block";
+
+                       } else {
+                               style.zoom = 1;
+                       }
+               }
+       }
+
+       if ( opts.overflow ) {
+               style.overflow = "hidden";
+               if ( !jQuery.support.shrinkWrapBlocks ) {
+                       anim.done(function() {
+                               style.overflow = opts.overflow[ 0 ];
+                               style.overflowX = opts.overflow[ 1 ];
+                               style.overflowY = opts.overflow[ 2 ];
+                       });
+               }
+       }
+
+
+       // show/hide pass
+       for ( index in props ) {
+               value = props[ index ];
+               if ( rfxtypes.exec( value ) ) {
+                       delete props[ index ];
+                       toggle = toggle || value === "toggle";
+                       if ( value === ( hidden ? "hide" : "show" ) ) {
+                               continue;
+                       }
+                       handled.push( index );
+               }
+       }
+
+       length = handled.length;
+       if ( length ) {
+               dataShow = jQuery._data( elem, "fxshow" ) || jQuery._data( elem, "fxshow", {} );
+               if ( "hidden" in dataShow ) {
+                       hidden = dataShow.hidden;
+               }
+
+               // store state if its toggle - enables .stop().toggle() to "reverse"
+               if ( toggle ) {
+                       dataShow.hidden = !hidden;
+               }
+               if ( hidden ) {
+                       jQuery( elem ).show();
+               } else {
+                       anim.done(function() {
+                               jQuery( elem ).hide();
+                       });
+               }
+               anim.done(function() {
+                       var prop;
+                       jQuery.removeData( elem, "fxshow", true );
+                       for ( prop in orig ) {
+                               jQuery.style( elem, prop, orig[ prop ] );
+                       }
+               });
+               for ( index = 0 ; index < length ; index++ ) {
+                       prop = handled[ index ];
+                       tween = anim.createTween( prop, hidden ? dataShow[ prop ] : 0 );
+                       orig[ prop ] = dataShow[ prop ] || jQuery.style( elem, prop );
+
+                       if ( !( prop in dataShow ) ) {
+                               dataShow[ prop ] = tween.start;
+                               if ( hidden ) {
+                                       tween.end = tween.start;
+                                       tween.start = prop === "width" || prop === "height" ? 1 : 0;
+                               }
+                       }
+               }
+       }
+}
+
+function Tween( elem, options, prop, end, easing ) {
+       return new Tween.prototype.init( elem, options, prop, end, easing );
+}
+jQuery.Tween = Tween;
+
+Tween.prototype = {
+       constructor: Tween,
+       init: function( elem, options, prop, end, easing, unit ) {
+               this.elem = elem;
+               this.prop = prop;
+               this.easing = easing || "swing";
+               this.options = options;
+               this.start = this.now = this.cur();
+               this.end = end;
+               this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" );
+       },
+       cur: function() {
+               var hooks = Tween.propHooks[ this.prop ];
+
+               return hooks && hooks.get ?
+                       hooks.get( this ) :
+                       Tween.propHooks._default.get( this );
+       },
+       run: function( percent ) {
+               var eased,
+                       hooks = Tween.propHooks[ this.prop ];
+
+               if ( this.options.duration ) {
+                       this.pos = eased = jQuery.easing[ this.easing ](
+                               percent, this.options.duration * percent, 0, 1, this.options.duration
+                       );
+               } else {
+                       this.pos = eased = percent;
+               }
+               this.now = ( this.end - this.start ) * eased + this.start;
+
+               if ( this.options.step ) {
+                       this.options.step.call( this.elem, this.now, this );
+               }
+
+               if ( hooks && hooks.set ) {
+                       hooks.set( this );
+               } else {
+                       Tween.propHooks._default.set( this );
+               }
+               return this;
+       }
+};
+
+Tween.prototype.init.prototype = Tween.prototype;
+
+Tween.propHooks = {
+       _default: {
+               get: function( tween ) {
+                       var result;
+
+                       if ( tween.elem[ tween.prop ] != null &&
+                               (!tween.elem.style || tween.elem.style[ tween.prop ] == null) ) {
+                               return tween.elem[ tween.prop ];
+                       }
+
+                       // passing any value as a 4th parameter to .css will automatically
+                       // attempt a parseFloat and fallback to a string if the parse fails
+                       // so, simple values such as "10px" are parsed to Float.
+                       // complex values such as "rotate(1rad)" are returned as is.
+                       result = jQuery.css( tween.elem, tween.prop, false, "" );
+                       // Empty strings, null, undefined and "auto" are converted to 0.
+                       return !result || result === "auto" ? 0 : result;
+               },
+               set: function( tween ) {
+                       // use step hook for back compat - use cssHook if its there - use .style if its
+                       // available and use plain properties where available
+                       if ( jQuery.fx.step[ tween.prop ] ) {
+                               jQuery.fx.step[ tween.prop ]( tween );
+                       } else if ( tween.elem.style && ( tween.elem.style[ jQuery.cssProps[ tween.prop ] ] != null || jQuery.cssHooks[ tween.prop ] ) ) {
+                               jQuery.style( tween.elem, tween.prop, tween.now + tween.unit );
+                       } else {
+                               tween.elem[ tween.prop ] = tween.now;
+                       }
+               }
+       }
+};
+
+// Remove in 2.0 - this supports IE8's panic based approach
+// to setting things on disconnected nodes
+
+Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {
+       set: function( tween ) {
+               if ( tween.elem.nodeType && tween.elem.parentNode ) {
+                       tween.elem[ tween.prop ] = tween.now;
+               }
+       }
+};
+
+jQuery.each([ "toggle", "show", "hide" ], function( i, name ) {
+       var cssFn = jQuery.fn[ name ];
+       jQuery.fn[ name ] = function( speed, easing, callback ) {
+               return speed == null || typeof speed === "boolean" ||
+                       // special check for .toggle( handler, handler, ... )
+                       ( !i && jQuery.isFunction( speed ) && jQuery.isFunction( easing ) ) ?
+                       cssFn.apply( this, arguments ) :
+                       this.animate( genFx( name, true ), speed, easing, callback );
+       };
+});
+
+jQuery.fn.extend({
+       fadeTo: function( speed, to, easing, callback ) {
+
+               // show any hidden elements after setting opacity to 0
+               return this.filter( isHidden ).css( "opacity", 0 ).show()
+
+                       // animate to the value specified
+                       .end().animate({ opacity: to }, speed, easing, callback );
+       },
+       animate: function( prop, speed, easing, callback ) {
+               var empty = jQuery.isEmptyObject( prop ),
+                       optall = jQuery.speed( speed, easing, callback ),
+                       doAnimation = function() {
+                               // Operate on a copy of prop so per-property easing won't be lost
+                               var anim = Animation( this, jQuery.extend( {}, prop ), optall );
+
+                               // Empty animations resolve immediately
+                               if ( empty ) {
+                                       anim.stop( true );
+                               }
+                       };
+
+               return empty || optall.queue === false ?
+                       this.each( doAnimation ) :
+                       this.queue( optall.queue, doAnimation );
+       },
+       stop: function( type, clearQueue, gotoEnd ) {
+               var stopQueue = function( hooks ) {
+                       var stop = hooks.stop;
+                       delete hooks.stop;
+                       stop( gotoEnd );
+               };
+
+               if ( typeof type !== "string" ) {
+                       gotoEnd = clearQueue;
+                       clearQueue = type;
+                       type = undefined;
+               }
+               if ( clearQueue && type !== false ) {
+                       this.queue( type || "fx", [] );
+               }
+
+               return this.each(function() {
+                       var dequeue = true,
+                               index = type != null && type + "queueHooks",
+                               timers = jQuery.timers,
+                               data = jQuery._data( this );
+
+                       if ( index ) {
+                               if ( data[ index ] && data[ index ].stop ) {
+                                       stopQueue( data[ index ] );
+                               }
+                       } else {
+                               for ( index in data ) {
+                                       if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) {
+                                               stopQueue( data[ index ] );
+                                       }
+                               }
+                       }
+
+                       for ( index = timers.length; index--; ) {
+                               if ( timers[ index ].elem === this && (type == null || timers[ index ].queue === type) ) {
+                                       timers[ index ].anim.stop( gotoEnd );
+                                       dequeue = false;
+                                       timers.splice( index, 1 );
+                               }
+                       }
+
+                       // start the next in the queue if the last step wasn't forced
+                       // timers currently will call their complete callbacks, which will dequeue
+                       // but only if they were gotoEnd
+                       if ( dequeue || !gotoEnd ) {
+                               jQuery.dequeue( this, type );
+                       }
+               });
+       }
+});
+
+// Generate parameters to create a standard animation
+function genFx( type, includeWidth ) {
+       var which,
+               attrs = { height: type },
+               i = 0;
+
+       // if we include width, step value is 1 to do all cssExpand values,
+       // if we don't include width, step value is 2 to skip over Left and Right
+       includeWidth = includeWidth? 1 : 0;
+       for( ; i < 4 ; i += 2 - includeWidth ) {
+               which = cssExpand[ i ];
+               attrs[ "margin" + which ] = attrs[ "padding" + which ] = type;
+       }
+
+       if ( includeWidth ) {
+               attrs.opacity = attrs.width = type;
+       }
+
+       return attrs;
+}
+
+// Generate shortcuts for custom animations
+jQuery.each({
+       slideDown: genFx("show"),
+       slideUp: genFx("hide"),
+       slideToggle: genFx("toggle"),
+       fadeIn: { opacity: "show" },
+       fadeOut: { opacity: "hide" },
+       fadeToggle: { opacity: "toggle" }
+}, function( name, props ) {
+       jQuery.fn[ name ] = function( speed, easing, callback ) {
+               return this.animate( props, speed, easing, callback );
+       };
+});
+
+jQuery.speed = function( speed, easing, fn ) {
+       var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : {
+               complete: fn || !fn && easing ||
+                       jQuery.isFunction( speed ) && speed,
+               duration: speed,
+               easing: fn && easing || easing && !jQuery.isFunction( easing ) && easing
+       };
+
+       opt.duration = jQuery.fx.off ? 0 : typeof opt.duration === "number" ? opt.duration :
+               opt.duration in jQuery.fx.speeds ? jQuery.fx.speeds[ opt.duration ] : jQuery.fx.speeds._default;
+
+       // normalize opt.queue - true/undefined/null -> "fx"
+       if ( opt.queue == null || opt.queue === true ) {
+               opt.queue = "fx";
+       }
+
+       // Queueing
+       opt.old = opt.complete;
+
+       opt.complete = function() {
+               if ( jQuery.isFunction( opt.old ) ) {
+                       opt.old.call( this );
+               }
+
+               if ( opt.queue ) {
+                       jQuery.dequeue( this, opt.queue );
+               }
+       };
+
+       return opt;
+};
+
+jQuery.easing = {
+       linear: function( p ) {
+               return p;
+       },
+       swing: function( p ) {
+               return 0.5 - Math.cos( p*Math.PI ) / 2;
+       }
+};
+
+jQuery.timers = [];
+jQuery.fx = Tween.prototype.init;
+jQuery.fx.tick = function() {
+       var timer,
+               timers = jQuery.timers,
+               i = 0;
+
+       fxNow = jQuery.now();
+
+       for ( ; i < timers.length; i++ ) {
+               timer = timers[ i ];
+               // Checks the timer has not already been removed
+               if ( !timer() && timers[ i ] === timer ) {
+                       timers.splice( i--, 1 );
+               }
+       }
+
+       if ( !timers.length ) {
+               jQuery.fx.stop();
+       }
+       fxNow = undefined;
+};
+
+jQuery.fx.timer = function( timer ) {
+       if ( timer() && jQuery.timers.push( timer ) && !timerId ) {
+               timerId = setInterval( jQuery.fx.tick, jQuery.fx.interval );
+       }
+};
+
+jQuery.fx.interval = 13;
+
+jQuery.fx.stop = function() {
+       clearInterval( timerId );
+       timerId = null;
+};
+
+jQuery.fx.speeds = {
+       slow: 600,
+       fast: 200,
+       // Default speed
+       _default: 400
+};
+
+// Back Compat <1.8 extension point
+jQuery.fx.step = {};
+
+if ( jQuery.expr && jQuery.expr.filters ) {
+       jQuery.expr.filters.animated = function( elem ) {
+               return jQuery.grep(jQuery.timers, function( fn ) {
+                       return elem === fn.elem;
+               }).length;
+       };
+}
+var rroot = /^(?:body|html)$/i;
+
+jQuery.fn.offset = function( options ) {
+       if ( arguments.length ) {
+               return options === undefined ?
+                       this :
+                       this.each(function( i ) {
+                               jQuery.offset.setOffset( this, options, i );
+                       });
+       }
+
+       var docElem, body, win, clientTop, clientLeft, scrollTop, scrollLeft,
+               box = { top: 0, left: 0 },
+               elem = this[ 0 ],
+               doc = elem && elem.ownerDocument;
+
+       if ( !doc ) {
+               return;
+       }
+
+       if ( (body = doc.body) === elem ) {
+               return jQuery.offset.bodyOffset( elem );
+       }
+
+       docElem = doc.documentElement;
+
+       // Make sure it's not a disconnected DOM node
+       if ( !jQuery.contains( docElem, elem ) ) {
+               return box;
+       }
+
+       // If we don't have gBCR, just use 0,0 rather than error
+       // BlackBerry 5, iOS 3 (original iPhone)
+       if ( typeof elem.getBoundingClientRect !== "undefined" ) {
+               box = elem.getBoundingClientRect();
+       }
+       win = getWindow( doc );
+       clientTop  = docElem.clientTop  || body.clientTop  || 0;
+       clientLeft = docElem.clientLeft || body.clientLeft || 0;
+       scrollTop  = win.pageYOffset || docElem.scrollTop;
+       scrollLeft = win.pageXOffset || docElem.scrollLeft;
+       return {
+               top: box.top  + scrollTop  - clientTop,
+               left: box.left + scrollLeft - clientLeft
+       };
+};
+
+jQuery.offset = {
+
+       bodyOffset: function( body ) {
+               var top = body.offsetTop,
+                       left = body.offsetLeft;
+
+               if ( jQuery.support.doesNotIncludeMarginInBodyOffset ) {
+                       top  += parseFloat( jQuery.css(body, "marginTop") ) || 0;
+                       left += parseFloat( jQuery.css(body, "marginLeft") ) || 0;
+               }
+
+               return { top: top, left: left };
+       },
+
+       setOffset: function( elem, options, i ) {
+               var position = jQuery.css( elem, "position" );
+
+               // set position first, in-case top/left are set even on static elem
+               if ( position === "static" ) {
+                       elem.style.position = "relative";
+               }
+
+               var curElem = jQuery( elem ),
+                       curOffset = curElem.offset(),
+                       curCSSTop = jQuery.css( elem, "top" ),
+                       curCSSLeft = jQuery.css( elem, "left" ),
+                       calculatePosition = ( position === "absolute" || position === "fixed" ) && jQuery.inArray("auto", [curCSSTop, curCSSLeft]) > -1,
+                       props = {}, curPosition = {}, curTop, curLeft;
+
+               // need to be able to calculate position if either top or left is auto and position is either absolute or fixed
+               if ( calculatePosition ) {
+                       curPosition = curElem.position();
+                       curTop = curPosition.top;
+                       curLeft = curPosition.left;
+               } else {
+                       curTop = parseFloat( curCSSTop ) || 0;
+                       curLeft = parseFloat( curCSSLeft ) || 0;
+               }
+
+               if ( jQuery.isFunction( options ) ) {
+                       options = options.call( elem, i, curOffset );
+               }
+
+               if ( options.top != null ) {
+                       props.top = ( options.top - curOffset.top ) + curTop;
+               }
+               if ( options.left != null ) {
+                       props.left = ( options.left - curOffset.left ) + curLeft;
+               }
+
+               if ( "using" in options ) {
+                       options.using.call( elem, props );
+               } else {
+                       curElem.css( props );
+               }
+       }
+};
+
+
+jQuery.fn.extend({
+
+       position: function() {
+               if ( !this[0] ) {
+                       return;
+               }
+
+               var elem = this[0],
+
+               // Get *real* offsetParent
+               offsetParent = this.offsetParent(),
+
+               // Get correct offsets
+               offset       = this.offset(),
+               parentOffset = rroot.test(offsetParent[0].nodeName) ? { top: 0, left: 0 } : offsetParent.offset();
+
+               // Subtract element margins
+               // note: when an element has margin: auto the offsetLeft and marginLeft
+               // are the same in Safari causing offset.left to incorrectly be 0
+               offset.top  -= parseFloat( jQuery.css(elem, "marginTop") ) || 0;
+               offset.left -= parseFloat( jQuery.css(elem, "marginLeft") ) || 0;
+
+               // Add offsetParent borders
+               parentOffset.top  += parseFloat( jQuery.css(offsetParent[0], "borderTopWidth") ) || 0;
+               parentOffset.left += parseFloat( jQuery.css(offsetParent[0], "borderLeftWidth") ) || 0;
+
+               // Subtract the two offsets
+               return {
+                       top:  offset.top  - parentOffset.top,
+                       left: offset.left - parentOffset.left
+               };
+       },
+
+       offsetParent: function() {
+               return this.map(function() {
+                       var offsetParent = this.offsetParent || document.body;
+                       while ( offsetParent && (!rroot.test(offsetParent.nodeName) && jQuery.css(offsetParent, "position") === "static") ) {
+                               offsetParent = offsetParent.offsetParent;
+                       }
+                       return offsetParent || document.body;
+               });
+       }
+});
+
+
+// Create scrollLeft and scrollTop methods
+jQuery.each( {scrollLeft: "pageXOffset", scrollTop: "pageYOffset"}, function( method, prop ) {
+       var top = /Y/.test( prop );
+
+       jQuery.fn[ method ] = function( val ) {
+               return jQuery.access( this, function( elem, method, val ) {
+                       var win = getWindow( elem );
+
+                       if ( val === undefined ) {
+                               return win ? (prop in win) ? win[ prop ] :
+                                       win.document.documentElement[ method ] :
+                                       elem[ method ];
+                       }
+
+                       if ( win ) {
+                               win.scrollTo(
+                                       !top ? val : jQuery( win ).scrollLeft(),
+                                        top ? val : jQuery( win ).scrollTop()
+                               );
+
+                       } else {
+                               elem[ method ] = val;
+                       }
+               }, method, val, arguments.length, null );
+       };
+});
+
+function getWindow( elem ) {
+       return jQuery.isWindow( elem ) ?
+               elem :
+               elem.nodeType === 9 ?
+                       elem.defaultView || elem.parentWindow :
+                       false;
+}
+// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods
+jQuery.each( { Height: "height", Width: "width" }, function( name, type ) {
+       jQuery.each( { padding: "inner" + name, content: type, "": "outer" + name }, function( defaultExtra, funcName ) {
+               // margin is only for outerHeight, outerWidth
+               jQuery.fn[ funcName ] = function( margin, value ) {
+                       var chainable = arguments.length && ( defaultExtra || typeof margin !== "boolean" ),
+                               extra = defaultExtra || ( margin === true || value === true ? "margin" : "border" );
+
+                       return jQuery.access( this, function( elem, type, value ) {
+                               var doc;
+
+                               if ( jQuery.isWindow( elem ) ) {
+                                       // As of 5/8/2012 this will yield incorrect results for Mobile Safari, but there
+                                       // isn't a whole lot we can do. See pull request at this URL for discussion:
+                                       // https://github.com/jquery/jquery/pull/764
+                                       return elem.document.documentElement[ "client" + name ];
+                               }
+
+                               // Get document width or height
+                               if ( elem.nodeType === 9 ) {
+                                       doc = elem.documentElement;
+
+                                       // Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height], whichever is greatest
+                                       // unfortunately, this causes bug #3838 in IE6/8 only, but there is currently no good, small way to fix it.
+                                       return Math.max(
+                                               elem.body[ "scroll" + name ], doc[ "scroll" + name ],
+                                               elem.body[ "offset" + name ], doc[ "offset" + name ],
+                                               doc[ "client" + name ]
+                                       );
+                               }
+
+                               return value === undefined ?
+                                       // Get width or height on the element, requesting but not forcing parseFloat
+                                       jQuery.css( elem, type, value, extra ) :
+
+                                       // Set width or height on the element
+                                       jQuery.style( elem, type, value, extra );
+                       }, type, chainable ? margin : undefined, chainable, null );
+               };
+       });
+});
+// Expose jQuery to the global object
+window.jQuery = window.$ = jQuery;
+
+// Expose jQuery as an AMD module, but only for AMD loaders that
+// understand the issues with loading multiple versions of jQuery
+// in a page that all might call define(). The loader will indicate
+// they have special allowances for multiple jQuery versions by
+// specifying define.amd.jQuery = true. Register as a named module,
+// since jQuery can be concatenated with other files that may use define,
+// but not use a proper concatenation script that understands anonymous
+// AMD modules. A named AMD is safest and most robust way to register.
+// Lowercase jquery is used because AMD module names are derived from
+// file names, and jQuery is normally delivered in a lowercase file name.
+// Do this after creating the global so that if an AMD module wants to call
+// noConflict to hide this version of jQuery, it will work.
+if ( typeof define === "function" && define.amd && define.amd.jQuery ) {
+       define( "jquery", [], function () { return jQuery; } );
+}
+
+})( window );
diff --git a/resources/lib/jquery/jquery.json.js b/resources/lib/jquery/jquery.json.js
new file mode 100644 (file)
index 0000000..75953f4
--- /dev/null
@@ -0,0 +1,199 @@
+/**
+ * jQuery JSON plugin 2.4.0
+ *
+ * @author Brantley Harris, 2009-2011
+ * @author Timo Tijhof, 2011-2012
+ * @source This plugin is heavily influenced by MochiKit's serializeJSON, which is
+ *         copyrighted 2005 by Bob Ippolito.
+ * @source Brantley Harris wrote this plugin. It is based somewhat on the JSON.org
+ *         website's http://www.json.org/json2.js, which proclaims:
+ *         "NO WARRANTY EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK.", a sentiment that
+ *         I uphold.
+ * @license MIT License <http://www.opensource.org/licenses/mit-license.php>
+ */
+(function ($) {
+       'use strict';
+
+       var escape = /["\\\x00-\x1f\x7f-\x9f]/g,
+               meta = {
+                       '\b': '\\b',
+                       '\t': '\\t',
+                       '\n': '\\n',
+                       '\f': '\\f',
+                       '\r': '\\r',
+                       '"' : '\\"',
+                       '\\': '\\\\'
+               },
+               hasOwn = Object.prototype.hasOwnProperty;
+
+       /**
+        * jQuery.toJSON
+        * Converts the given argument into a JSON representation.
+        *
+        * @param o {Mixed} The json-serializable *thing* to be converted
+        *
+        * If an object has a toJSON prototype, that will be used to get the representation.
+        * Non-integer/string keys are skipped in the object, as are keys that point to a
+        * function.
+        *
+        */
+       $.toJSON = typeof JSON === 'object' && JSON.stringify ? JSON.stringify : function (o) {
+               if (o === null) {
+                       return 'null';
+               }
+
+               var pairs, k, name, val,
+                       type = $.type(o);
+
+               if (type === 'undefined') {
+                       return undefined;
+               }
+
+               // Also covers instantiated Number and Boolean objects,
+               // which are typeof 'object' but thanks to $.type, we
+               // catch them here. I don't know whether it is right
+               // or wrong that instantiated primitives are not
+               // exported to JSON as an {"object":..}.
+               // We choose this path because that's what the browsers did.
+               if (type === 'number' || type === 'boolean') {
+                       return String(o);
+               }
+               if (type === 'string') {
+                       return $.quoteString(o);
+               }
+               if (typeof o.toJSON === 'function') {
+                       return $.toJSON(o.toJSON());
+               }
+               if (type === 'date') {
+                       var month = o.getUTCMonth() + 1,
+                               day = o.getUTCDate(),
+                               year = o.getUTCFullYear(),
+                               hours = o.getUTCHours(),
+                               minutes = o.getUTCMinutes(),
+                               seconds = o.getUTCSeconds(),
+                               milli = o.getUTCMilliseconds();
+
+                       if (month < 10) {
+                               month = '0' + month;
+                       }
+                       if (day < 10) {
+                               day = '0' + day;
+                       }
+                       if (hours < 10) {
+                               hours = '0' + hours;
+                       }
+                       if (minutes < 10) {
+                               minutes = '0' + minutes;
+                       }
+                       if (seconds < 10) {
+                               seconds = '0' + seconds;
+                       }
+                       if (milli < 100) {
+                               milli = '0' + milli;
+                       }
+                       if (milli < 10) {
+                               milli = '0' + milli;
+                       }
+                       return '"' + year + '-' + month + '-' + day + 'T' +
+                               hours + ':' + minutes + ':' + seconds +
+                               '.' + milli + 'Z"';
+               }
+
+               pairs = [];
+
+               if ($.isArray(o)) {
+                       for (k = 0; k < o.length; k++) {
+                               pairs.push($.toJSON(o[k]) || 'null');
+                       }
+                       return '[' + pairs.join(',') + ']';
+               }
+
+               // Any other object (plain object, RegExp, ..)
+               // Need to do typeof instead of $.type, because we also
+               // want to catch non-plain objects.
+               if (typeof o === 'object') {
+                       for (k in o) {
+                               // Only include own properties,
+                               // Filter out inherited prototypes
+                               if (hasOwn.call(o, k)) {
+                                       // Keys must be numerical or string. Skip others
+                                       type = typeof k;
+                                       if (type === 'number') {
+                                               name = '"' + k + '"';
+                                       } else if (type === 'string') {
+                                               name = $.quoteString(k);
+                                       } else {
+                                               continue;
+                                       }
+                                       type = typeof o[k];
+
+                                       // Invalid values like these return undefined
+                                       // from toJSON, however those object members
+                                       // shouldn't be included in the JSON string at all.
+                                       if (type !== 'function' && type !== 'undefined') {
+                                               val = $.toJSON(o[k]);
+                                               pairs.push(name + ':' + val);
+                                       }
+                               }
+                       }
+                       return '{' + pairs.join(',') + '}';
+               }
+       };
+
+       /**
+        * jQuery.evalJSON
+        * Evaluates a given json string.
+        *
+        * @param str {String}
+        */
+       $.evalJSON = typeof JSON === 'object' && JSON.parse ? JSON.parse : function (str) {
+               /*jshint evil: true */
+               return eval('(' + str + ')');
+       };
+
+       /**
+        * jQuery.secureEvalJSON
+        * Evals JSON in a way that is *more* secure.
+        *
+        * @param str {String}
+        */
+       $.secureEvalJSON = typeof JSON === 'object' && JSON.parse ? JSON.parse : function (str) {
+               var filtered =
+                       str
+                       .replace(/\\["\\\/bfnrtu]/g, '@')
+                       .replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']')
+                       .replace(/(?:^|:|,)(?:\s*\[)+/g, '');
+
+               if (/^[\],:{}\s]*$/.test(filtered)) {
+                       /*jshint evil: true */
+                       return eval('(' + str + ')');
+               }
+               throw new SyntaxError('Error parsing JSON, source is not valid.');
+       };
+
+       /**
+        * jQuery.quoteString
+        * Returns a string-repr of a string, escaping quotes intelligently.
+        * Mostly a support function for toJSON.
+        * Examples:
+        * >>> jQuery.quoteString('apple')
+        * "apple"
+        *
+        * >>> jQuery.quoteString('"Where are we going?", she asked.')
+        * "\"Where are we going?\", she asked."
+        */
+       $.quoteString = function (str) {
+               if (str.match(escape)) {
+                       return '"' + str.replace(escape, function (a) {
+                               var c = meta[a];
+                               if (typeof c === 'string') {
+                                       return c;
+                               }
+                               c = a.charCodeAt();
+                               return '\\u00' + Math.floor(c / 16).toString(16) + (c % 16).toString(16);
+                       }) + '"';
+               }
+               return '"' + str + '"';
+       };
+
+}(jQuery));
diff --git a/resources/lib/jquery/jquery.mockjax.js b/resources/lib/jquery/jquery.mockjax.js
new file mode 100644 (file)
index 0000000..5f6e130
--- /dev/null
@@ -0,0 +1,382 @@
+/*!
+ * MockJax - jQuery Plugin to Mock Ajax requests
+ *
+ * Version:  1.4.0
+ * Released: 2011-02-04
+ * Source:   http://github.com/appendto/jquery-mockjax
+ * Docs:     http://enterprisejquery.com/2010/07/mock-your-ajax-requests-with-mockjax-for-rapid-development
+ * Plugin:   mockjax
+ * Author:   Jonathan Sharp (http://jdsharp.com)
+ * License:  MIT,GPL
+ * 
+ * Copyright (c) 2010 appendTo LLC.
+ * Dual licensed under the MIT or GPL licenses.
+ * http://appendto.com/open-source-licenses
+ */
+(function($) {
+       var _ajax = $.ajax,
+               mockHandlers = [];
+       
+       function parseXML(xml) {
+               if ( window['DOMParser'] == undefined && window.ActiveXObject ) {
+                       DOMParser = function() { };
+                       DOMParser.prototype.parseFromString = function( xmlString ) {
+                               var doc = new ActiveXObject('Microsoft.XMLDOM');
+                       doc.async = 'false';
+                       doc.loadXML( xmlString );
+                               return doc;
+                       };
+               }
+               
+               try {
+                       var xmlDoc      = ( new DOMParser() ).parseFromString( xml, 'text/xml' );
+                       if ( $.isXMLDoc( xmlDoc ) ) {
+                               var err = $('parsererror', xmlDoc);
+                               if ( err.length == 1 ) {
+                                       throw('Error: ' + $(xmlDoc).text() );
+                               }
+                       } else {
+                               throw('Unable to parse XML');
+                       }
+               } catch( e ) {
+                       var msg = ( e.name == undefined ? e : e.name + ': ' + e.message );
+                       $(document).trigger('xmlParseError', [ msg ]);
+                       return undefined;
+               }
+               return xmlDoc;
+       }
+       
+       $.extend({
+               ajax: function(origSettings) {
+                       var s = jQuery.extend(true, {}, jQuery.ajaxSettings, origSettings),
+                           mock = false;
+                       // Iterate over our mock handlers (in registration order) until we find
+                       // one that is willing to intercept the request
+                       $.each(mockHandlers, function(k, v) {
+                               if ( !mockHandlers[k] ) {
+                                       return;
+                               }
+                               var m = null;
+                               // If the mock was registered with a function, let the function decide if we 
+                               // want to mock this request
+                               if ( $.isFunction(mockHandlers[k]) ) {
+                                       m = mockHandlers[k](s);
+                               } else {
+                                       m = mockHandlers[k];
+                                       // Inspect the URL of the request and check if the mock handler's url 
+                                       // matches the url for this ajax request
+                                       if ( $.isFunction(m.url.test) ) {
+                                               // The user provided a regex for the url, test it
+                                               if ( !m.url.test( s.url ) ) {
+                                                       m = null;
+                                               }
+                                       } else {
+                                               // Look for a simple wildcard '*' or a direct URL match
+                                               var star = m.url.indexOf('*');
+                                               if ( ( m.url != '*' && m.url != s.url && star == -1 ) ||
+                                                       ( star > -1 && m.url.substr(0, star) != s.url.substr(0, star) ) ) {
+                                                        // The url we tested did not match the wildcard *
+                                                        m = null;
+                                               }
+                                       }
+                                       if ( m ) {
+                                               // Inspect the data submitted in the request (either POST body or GET query string)
+                                               if ( m.data && s.data ) {
+                                                       var identical = false;
+                                                       // Deep inspect the identity of the objects
+                                                       (function ident(mock, live) {
+                                                               // Test for situations where the data is a querystring (not an object)
+                                                               if (typeof live === 'string') {
+                                                                       // Querystring may be a regex
+                                                                       identical = $.isFunction( mock.test ) ? mock.test(live) : mock == live;
+                                                                       return identical;
+                                                               }
+                                                               $.each(mock, function(k, v) {
+                                                                       if ( live[k] === undefined ) {
+                                                                               identical = false;
+                                                                               return false;
+                                                                       } else {
+                                                                               identical = true;
+                                                                               if ( typeof live[k] == 'object' ) {
+                                                                                       return ident(mock[k], live[k]);
+                                                                               } else {
+                                                                                       if ( $.isFunction( mock[k].test ) ) {
+                                                                                               identical = mock[k].test(live[k]);
+                                                                                       } else {
+                                                                                               identical = ( mock[k] == live[k] );
+                                                                                       }
+                                                                                       return identical;
+                                                                               }
+                                                                       }
+                                                               });
+                                                       })(m.data, s.data);
+                                                       // They're not identical, do not mock this request
+                                                       if ( identical == false ) {
+                                                               m = null;
+                                                       }
+                                               }
+                                               // Inspect the request type
+                                               if ( m && m.type && m.type != s.type ) {
+                                                       // The request type doesn't match (GET vs. POST)
+                                                       m = null;
+                                               }
+                                       }
+                               }
+                               if ( m ) {
+                                       mock = true;
+
+                                       // Handle console logging
+                                       var c = $.extend({}, $.mockjaxSettings, m);
+                                       if ( c.log && $.isFunction(c.log) ) {
+                                               c.log('MOCK ' + s.type.toUpperCase() + ': ' + s.url, $.extend({}, s));
+                                       }
+                                       
+                                       var jsre = /=\?(&|$)/, jsc = (new Date()).getTime();
+
+                                       // Handle JSONP Parameter Callbacks, we need to replicate some of the jQuery core here
+                                       // because there isn't an easy hook for the cross domain script tag of jsonp
+                                       if ( s.dataType === "jsonp" ) {
+                                               if ( s.type.toUpperCase() === "GET" ) {
+                                                       if ( !jsre.test( s.url ) ) {
+                                                               s.url += (rquery.test( s.url ) ? "&" : "?") + (s.jsonp || "callback") + "=?";
+                                                       }
+                                               } else if ( !s.data || !jsre.test(s.data) ) {
+                                                       s.data = (s.data ? s.data + "&" : "") + (s.jsonp || "callback") + "=?";
+                                               }
+                                               s.dataType = "json";
+                                       }
+                       
+                                       // Build temporary JSONP function
+                                       if ( s.dataType === "json" && (s.data && jsre.test(s.data) || jsre.test(s.url)) ) {
+                                               jsonp = s.jsonpCallback || ("jsonp" + jsc++);
+                       
+                                               // Replace the =? sequence both in the query string and the data
+                                               if ( s.data ) {
+                                                       s.data = (s.data + "").replace(jsre, "=" + jsonp + "$1");
+                                               }
+                       
+                                               s.url = s.url.replace(jsre, "=" + jsonp + "$1");
+                       
+                                               // We need to make sure
+                                               // that a JSONP style response is executed properly
+                                               s.dataType = "script";
+                       
+                                               // Handle JSONP-style loading
+                                               window[ jsonp ] = window[ jsonp ] || function( tmp ) {
+                                                       data = tmp;
+                                                       success();
+                                                       complete();
+                                                       // Garbage collect
+                                                       window[ jsonp ] = undefined;
+                       
+                                                       try {
+                                                               delete window[ jsonp ];
+                                                       } catch(e) {}
+                       
+                                                       if ( head ) {
+                                                               head.removeChild( script );
+                                                       }
+                                               };
+                                       }
+                                       
+                                       var rurl = /^(\w+:)?\/\/([^\/?#]+)/,
+                                               parts = rurl.exec( s.url ),
+                                               remote = parts && (parts[1] && parts[1] !== location.protocol || parts[2] !== location.host);
+                                       
+                                       // Test if we are going to create a script tag (if so, intercept & mock)
+                                       if ( s.dataType === "script" && s.type.toUpperCase() === "GET" && remote ) {
+                                               // Synthesize the mock request for adding a script tag
+                                               var callbackContext = origSettings && origSettings.context || s;
+                                               
+                                               function success() {
+                                                       // If a local callback was specified, fire it and pass it the data
+                                                       if ( s.success ) {
+                                                               s.success.call( callbackContext, ( m.response ? m.response.toString() : m.responseText || ''), status, {} );
+                                                       }
+                               
+                                                       // Fire the global callback
+                                                       if ( s.global ) {
+                                                               trigger( "ajaxSuccess", [{}, s] );
+                                                       }
+                                               }
+                               
+                                               function complete() {
+                                                       // Process result
+                                                       if ( s.complete ) {
+                                                               s.complete.call( callbackContext, {} , status );
+                                                       }
+                               
+                                                       // The request was completed
+                                                       if ( s.global ) {
+                                                               trigger( "ajaxComplete", [{}, s] );
+                                                       }
+                               
+                                                       // Handle the global AJAX counter
+                                                       if ( s.global && ! --jQuery.active ) {
+                                                               jQuery.event.trigger( "ajaxStop" );
+                                                       }
+                                               }
+                                               
+                                               function trigger(type, args) {
+                                                       (s.context ? jQuery(s.context) : jQuery.event).trigger(type, args);
+                                               }
+                                               
+                                               if ( m.response && $.isFunction(m.response) ) {
+                                                       m.response(origSettings);
+                                               } else {
+                                                       $.globalEval(m.responseText);
+                                               }
+                                               success();
+                                               complete();
+                                               return false;
+                                       }
+                                       mock = _ajax.call($, $.extend(true, {}, origSettings, {
+                                               // Mock the XHR object
+                                               xhr: function() {
+                                                       // Extend with our default mockjax settings
+                                                       m = $.extend({}, $.mockjaxSettings, m);
+
+                                                       if ( m.contentType ) {
+                                                               m.headers['content-type'] = m.contentType;
+                                                       }
+
+                                                       // Return our mock xhr object
+                                                       return {
+                                                               status: m.status,
+                                                               readyState: 1,
+                                                               open: function() { },
+                                                               send: function() {
+                                                                       // This is a substitute for < 1.4 which lacks $.proxy
+                                                                       var process = (function(that) {
+                                                                               return function() {
+                                                                                       return (function() {
+                                                                                               // The request has returned
+                                                                                               this.status             = m.status;
+                                                                                               this.readyState         = 4;
+                                                                               
+                                                                                               // We have an executable function, call it to give 
+                                                                                               // the mock handler a chance to update it's data
+                                                                                               if ( $.isFunction(m.response) ) {
+                                                                                                       m.response(origSettings);
+                                                                                               }
+                                                                                               // Copy over our mock to our xhr object before passing control back to 
+                                                                                               // jQuery's onreadystatechange callback
+                                                                                               if ( s.dataType == 'json' && ( typeof m.responseText == 'object' ) ) {
+                                                                                                       this.responseText = JSON.stringify(m.responseText);
+                                                                                               } else if ( s.dataType == 'xml' ) {
+                                                                                                       if ( typeof m.responseXML == 'string' ) {
+                                                                                                               this.responseXML = parseXML(m.responseXML);
+                                                                                                       } else {
+                                                                                                               this.responseXML = m.responseXML;
+                                                                                                       }
+                                                                                               } else {
+                                                                                                       this.responseText = m.responseText;
+                                                                                               }
+                                                                                               // jQuery < 1.4 doesn't have onreadystate change for xhr
+                                                                                               if ( $.isFunction(this.onreadystatechange) ) {
+                                                                                                       this.onreadystatechange( m.isTimeout ? 'timeout' : undefined );
+                                                                                               }
+                                                                                       }).apply(that);
+                                                                               };
+                                                                       })(this);
+
+                                                                       if ( m.proxy ) {
+                                                                               // We're proxying this request and loading in an external file instead
+                                                                               _ajax({
+                                                                                       global: false,
+                                                                                       url: m.proxy,
+                                                                                       type: m.proxyType,
+                                                                                       data: m.data,
+                                                                                       dataType: s.dataType,
+                                                                                       complete: function(xhr, txt) {
+                                                                                               m.responseXML = xhr.responseXML;
+                                                                                               m.responseText = xhr.responseText;
+                                                                                               this.responseTimer = setTimeout(process, m.responseTime || 0);
+                                                                                       }
+                                                                               });
+                                                                       } else {
+                                                                               // type == 'POST' || 'GET' || 'DELETE'
+                                                                               if ( s.async === false ) {
+                                                                                       // TODO: Blocking delay
+                                                                                       process();
+                                                                               } else {
+                                                                                       this.responseTimer = setTimeout(process, m.responseTime || 50);
+                                                                               }
+                                                                       }
+                                                               },
+                                                               abort: function() {
+                                                                       clearTimeout(this.responseTimer);
+                                                               },
+                                                               setRequestHeader: function() { },
+                                                               getResponseHeader: function(header) {
+                                                                       // 'Last-modified', 'Etag', 'content-type' are all checked by jQuery
+                                                                       if ( m.headers && m.headers[header] ) {
+                                                                               // Return arbitrary headers
+                                                                               return m.headers[header];
+                                                                       } else if ( header.toLowerCase() == 'last-modified' ) {
+                                                                               return m.lastModified || (new Date()).toString();
+                                                                       } else if ( header.toLowerCase() == 'etag' ) {
+                                                                               return m.etag || '';
+                                                                       } else if ( header.toLowerCase() == 'content-type' ) {
+                                                                               return m.contentType || 'text/plain';
+                                                                       }
+                                                               },
+                                                               getAllResponseHeaders: function() {
+                                                                       var headers = '';
+                                                                       $.each(m.headers, function(k, v) {
+                                                                               headers += k + ': ' + v + "\n";
+                                                                       });
+                                                                       return headers;
+                                                               }
+                                                       };
+                                               }
+                                       }));
+                                       return false;
+                               }
+                       });
+                       // We don't have a mock request, trigger a normal request
+                       if ( !mock ) {
+                               return _ajax.apply($, arguments);
+                       } else {
+                               return mock;
+                       }
+               }
+       });
+
+       $.mockjaxSettings = {
+               //url:        null,
+               //type:       'GET',
+               log:          function(msg) {
+                               window['console'] && window.console.log && window.console.log(msg);
+                             },
+               status:       200,
+               responseTime: 500,
+               isTimeout:    false,
+               contentType:  'text/plain',
+               response:     '', 
+               responseText: '',
+               responseXML:  '',
+               proxy:        '',
+               proxyType:    'GET',
+               
+               lastModified: null,
+               etag:         '',
+               headers: {
+                       etag: 'IJF@H#@923uf8023hFO@I#H#',
+                       'content-type' : 'text/plain'
+               }
+       };
+
+       $.mockjax = function(settings) {
+               var i = mockHandlers.length;
+               mockHandlers[i] = settings;
+               return i;
+       };
+       $.mockjaxClear = function(i) {
+               if ( arguments.length == 1 ) {
+                       mockHandlers[i] = null;
+               } else {
+                       mockHandlers = [];
+               }
+       };
+})(jQuery);
diff --git a/resources/lib/jquery/jquery.qunit.css b/resources/lib/jquery/jquery.qunit.css
new file mode 100644 (file)
index 0000000..93026e3
--- /dev/null
@@ -0,0 +1,237 @@
+/*!
+ * QUnit 1.14.0
+ * http://qunitjs.com/
+ *
+ * Copyright 2013 jQuery Foundation and other contributors
+ * Released under the MIT license
+ * http://jquery.org/license
+ *
+ * Date: 2014-01-31T16:40Z
+ */
+
+/** Font Family and Sizes */
+
+#qunit-tests, #qunit-header, #qunit-banner, #qunit-testrunner-toolbar, #qunit-userAgent, #qunit-testresult {
+       font-family: "Helvetica Neue Light", "HelveticaNeue-Light", "Helvetica Neue", Calibri, Helvetica, Arial, sans-serif;
+}
+
+#qunit-testrunner-toolbar, #qunit-userAgent, #qunit-testresult, #qunit-tests li { font-size: small; }
+#qunit-tests { font-size: smaller; }
+
+
+/** Resets */
+
+#qunit-tests, #qunit-header, #qunit-banner, #qunit-userAgent, #qunit-testresult, #qunit-modulefilter {
+       margin: 0;
+       padding: 0;
+}
+
+
+/** Header */
+
+#qunit-header {
+       padding: 0.5em 0 0.5em 1em;
+
+       color: #8699A4;
+       background-color: #0D3349;
+
+       font-size: 1.5em;
+       line-height: 1em;
+       font-weight: 400;
+
+       border-radius: 5px 5px 0 0;
+}
+
+#qunit-header a {
+       text-decoration: none;
+       color: #C2CCD1;
+}
+
+#qunit-header a:hover,
+#qunit-header a:focus {
+       color: #FFF;
+}
+
+#qunit-testrunner-toolbar label {
+       display: inline-block;
+       padding: 0 0.5em 0 0.1em;
+}
+
+#qunit-banner {
+       height: 5px;
+}
+
+#qunit-testrunner-toolbar {
+       padding: 0.5em 0 0.5em 2em;
+       color: #5E740B;
+       background-color: #EEE;
+       overflow: hidden;
+}
+
+#qunit-userAgent {
+       padding: 0.5em 0 0.5em 2.5em;
+       background-color: #2B81AF;
+       color: #FFF;
+       text-shadow: rgba(0, 0, 0, 0.5) 2px 2px 1px;
+}
+
+#qunit-modulefilter-container {
+       float: right;
+}
+
+/** Tests: Pass/Fail */
+
+#qunit-tests {
+       list-style-position: inside;
+}
+
+#qunit-tests li {
+       padding: 0.4em 0.5em 0.4em 2.5em;
+       border-bottom: 1px solid #FFF;
+       list-style-position: inside;
+}
+
+#qunit-tests.hidepass li.pass, #qunit-tests.hidepass li.running  {
+       display: none;
+}
+
+#qunit-tests li strong {
+       cursor: pointer;
+}
+
+#qunit-tests li a {
+       padding: 0.5em;
+       color: #C2CCD1;
+       text-decoration: none;
+}
+#qunit-tests li a:hover,
+#qunit-tests li a:focus {
+       color: #000;
+}
+
+#qunit-tests li .runtime {
+       float: right;
+       font-size: smaller;
+}
+
+.qunit-assert-list {
+       margin-top: 0.5em;
+       padding: 0.5em;
+
+       background-color: #FFF;
+
+       border-radius: 5px;
+}
+
+.qunit-collapsed {
+       display: none;
+}
+
+#qunit-tests table {
+       border-collapse: collapse;
+       margin-top: 0.2em;
+}
+
+#qunit-tests th {
+       text-align: right;
+       vertical-align: top;
+       padding: 0 0.5em 0 0;
+}
+
+#qunit-tests td {
+       vertical-align: top;
+}
+
+#qunit-tests pre {
+       margin: 0;
+       white-space: pre-wrap;
+       word-wrap: break-word;
+}
+
+#qunit-tests del {
+       background-color: #E0F2BE;
+       color: #374E0C;
+       text-decoration: none;
+}
+
+#qunit-tests ins {
+       background-color: #FFCACA;
+       color: #500;
+       text-decoration: none;
+}
+
+/*** Test Counts */
+
+#qunit-tests b.counts                       { color: #000; }
+#qunit-tests b.passed                       { color: #5E740B; }
+#qunit-tests b.failed                       { color: #710909; }
+
+#qunit-tests li li {
+       padding: 5px;
+       background-color: #FFF;
+       border-bottom: none;
+       list-style-position: inside;
+}
+
+/*** Passing Styles */
+
+#qunit-tests li li.pass {
+       color: #3C510C;
+       background-color: #FFF;
+       border-left: 10px solid #C6E746;
+}
+
+#qunit-tests .pass                          { color: #528CE0; background-color: #D2E0E6; }
+#qunit-tests .pass .test-name               { color: #366097; }
+
+#qunit-tests .pass .test-actual,
+#qunit-tests .pass .test-expected           { color: #999; }
+
+#qunit-banner.qunit-pass                    { background-color: #C6E746; }
+
+/*** Failing Styles */
+
+#qunit-tests li li.fail {
+       color: #710909;
+       background-color: #FFF;
+       border-left: 10px solid #EE5757;
+       white-space: pre;
+}
+
+#qunit-tests > li:last-child {
+       border-radius: 0 0 5px 5px;
+}
+
+#qunit-tests .fail                          { color: #000; background-color: #EE5757; }
+#qunit-tests .fail .test-name,
+#qunit-tests .fail .module-name             { color: #000; }
+
+#qunit-tests .fail .test-actual             { color: #EE5757; }
+#qunit-tests .fail .test-expected           { color: #008000; }
+
+#qunit-banner.qunit-fail                    { background-color: #EE5757; }
+
+
+/** Result */
+
+#qunit-testresult {
+       padding: 0.5em 0.5em 0.5em 2.5em;
+
+       color: #2B81AF;
+       background-color: #D2E0E6;
+
+       border-bottom: 1px solid #FFF;
+}
+#qunit-testresult .module-name {
+       font-weight: 700;
+}
+
+/** Fixture */
+
+#qunit-fixture {
+       position: absolute;
+       top: -10000px;
+       left: -10000px;
+       width: 1000px;
+       height: 1000px;
+}
diff --git a/resources/lib/jquery/jquery.qunit.js b/resources/lib/jquery/jquery.qunit.js
new file mode 100644 (file)
index 0000000..0e279fd
--- /dev/null
@@ -0,0 +1,2288 @@
+/*!
+ * QUnit 1.14.0
+ * http://qunitjs.com/
+ *
+ * Copyright 2013 jQuery Foundation and other contributors
+ * Released under the MIT license
+ * http://jquery.org/license
+ *
+ * Date: 2014-01-31T16:40Z
+ */
+
+(function( window ) {
+
+var QUnit,
+       assert,
+       config,
+       onErrorFnPrev,
+       testId = 0,
+       fileName = (sourceFromStacktrace( 0 ) || "" ).replace(/(:\d+)+\)?/, "").replace(/.+\//, ""),
+       toString = Object.prototype.toString,
+       hasOwn = Object.prototype.hasOwnProperty,
+       // Keep a local reference to Date (GH-283)
+       Date = window.Date,
+       setTimeout = window.setTimeout,
+       clearTimeout = window.clearTimeout,
+       defined = {
+               document: typeof window.document !== "undefined",
+               setTimeout: typeof window.setTimeout !== "undefined",
+               sessionStorage: (function() {
+                       var x = "qunit-test-string";
+                       try {
+                               sessionStorage.setItem( x, x );
+                               sessionStorage.removeItem( x );
+                               return true;
+                       } catch( e ) {
+                               return false;
+                       }
+               }())
+       },
+       /**
+        * Provides a normalized error string, correcting an issue
+        * with IE 7 (and prior) where Error.prototype.toString is
+        * not properly implemented
+        *
+        * Based on http://es5.github.com/#x15.11.4.4
+        *
+        * @param {String|Error} error
+        * @return {String} error message
+        */
+       errorString = function( error ) {
+               var name, message,
+                       errorString = error.toString();
+               if ( errorString.substring( 0, 7 ) === "[object" ) {
+                       name = error.name ? error.name.toString() : "Error";
+                       message = error.message ? error.message.toString() : "";
+                       if ( name && message ) {
+                               return name + ": " + message;
+                       } else if ( name ) {
+                               return name;
+                       } else if ( message ) {
+                               return message;
+                       } else {
+                               return "Error";
+                       }
+               } else {
+                       return errorString;
+               }
+       },
+       /**
+        * Makes a clone of an object using only Array or Object as base,
+        * and copies over the own enumerable properties.
+        *
+        * @param {Object} obj
+        * @return {Object} New object with only the own properties (recursively).
+        */
+       objectValues = function( obj ) {
+               // Grunt 0.3.x uses an older version of jshint that still has jshint/jshint#392.
+               /*jshint newcap: false */
+               var key, val,
+                       vals = QUnit.is( "array", obj ) ? [] : {};
+               for ( key in obj ) {
+                       if ( hasOwn.call( obj, key ) ) {
+                               val = obj[key];
+                               vals[key] = val === Object(val) ? objectValues(val) : val;
+                       }
+               }
+               return vals;
+       };
+
+
+// Root QUnit object.
+// `QUnit` initialized at top of scope
+QUnit = {
+
+       // call on start of module test to prepend name to all tests
+       module: function( name, testEnvironment ) {
+               config.currentModule = name;
+               config.currentModuleTestEnvironment = testEnvironment;
+               config.modules[name] = true;
+       },
+
+       asyncTest: function( testName, expected, callback ) {
+               if ( arguments.length === 2 ) {
+                       callback = expected;
+                       expected = null;
+               }
+
+               QUnit.test( testName, expected, callback, true );
+       },
+
+       test: function( testName, expected, callback, async ) {
+               var test,
+                       nameHtml = "<span class='test-name'>" + escapeText( testName ) + "</span>";
+
+               if ( arguments.length === 2 ) {
+                       callback = expected;
+                       expected = null;
+               }
+
+               if ( config.currentModule ) {
+                       nameHtml = "<span class='module-name'>" + escapeText( config.currentModule ) + "</span>: " + nameHtml;
+               }
+
+               test = new Test({
+                       nameHtml: nameHtml,
+                       testName: testName,
+                       expected: expected,
+                       async: async,
+                       callback: callback,
+                       module: config.currentModule,
+                       moduleTestEnvironment: config.currentModuleTestEnvironment,
+                       stack: sourceFromStacktrace( 2 )
+               });
+
+               if ( !validTest( test ) ) {
+                       return;
+               }
+
+               test.queue();
+       },
+
+       // Specify the number of expected assertions to guarantee that failed test (no assertions are run at all) don't slip through.
+       expect: function( asserts ) {
+               if (arguments.length === 1) {
+                       config.current.expected = asserts;
+               } else {
+                       return config.current.expected;
+               }
+       },
+
+       start: function( count ) {
+               // QUnit hasn't been initialized yet.
+               // Note: RequireJS (et al) may delay onLoad
+               if ( config.semaphore === undefined ) {
+                       QUnit.begin(function() {
+                               // This is triggered at the top of QUnit.load, push start() to the event loop, to allow QUnit.load to finish first
+                               setTimeout(function() {
+                                       QUnit.start( count );
+                               });
+                       });
+                       return;
+               }
+
+               config.semaphore -= count || 1;
+               // don't start until equal number of stop-calls
+               if ( config.semaphore > 0 ) {
+                       return;
+               }
+               // ignore if start is called more often then stop
+               if ( config.semaphore < 0 ) {
+                       config.semaphore = 0;
+                       QUnit.pushFailure( "Called start() while already started (QUnit.config.semaphore was 0 already)", null, sourceFromStacktrace(2) );
+                       return;
+               }
+               // A slight delay, to avoid any current callbacks
+               if ( defined.setTimeout ) {
+                       setTimeout(function() {
+                               if ( config.semaphore > 0 ) {
+                                       return;
+                               }
+                               if ( config.timeout ) {
+                                       clearTimeout( config.timeout );
+                               }
+
+                               config.blocking = false;
+                               process( true );
+                       }, 13);
+               } else {
+                       config.blocking = false;
+                       process( true );
+               }
+       },
+
+       stop: function( count ) {
+               config.semaphore += count || 1;
+               config.blocking = true;
+
+               if ( config.testTimeout && defined.setTimeout ) {
+                       clearTimeout( config.timeout );
+                       config.timeout = setTimeout(function() {
+                               QUnit.ok( false, "Test timed out" );
+                               config.semaphore = 1;
+                               QUnit.start();
+                       }, config.testTimeout );
+               }
+       }
+};
+
+// We use the prototype to distinguish between properties that should
+// be exposed as globals (and in exports) and those that shouldn't
+(function() {
+       function F() {}
+       F.prototype = QUnit;
+       QUnit = new F();
+       // Make F QUnit's constructor so that we can add to the prototype later
+       QUnit.constructor = F;
+}());
+
+/**
+ * Config object: Maintain internal state
+ * Later exposed as QUnit.config
+ * `config` initialized at top of scope
+ */
+config = {
+       // The queue of tests to run
+       queue: [],
+
+       // block until document ready
+       blocking: true,
+
+       // when enabled, show only failing tests
+       // gets persisted through sessionStorage and can be changed in UI via checkbox
+       hidepassed: false,
+
+       // by default, run previously failed tests first
+       // very useful in combination with "Hide passed tests" checked
+       reorder: true,
+
+       // by default, modify document.title when suite is done
+       altertitle: true,
+
+       // by default, scroll to top of the page when suite is done
+       scrolltop: true,
+
+       // when enabled, all tests must call expect()
+       requireExpects: false,
+
+       // add checkboxes that are persisted in the query-string
+       // when enabled, the id is set to `true` as a `QUnit.config` property
+       urlConfig: [
+               {
+                       id: "noglobals",
+                       label: "Check for Globals",
+                       tooltip: "Enabling this will test if any test introduces new properties on the `window` object. Stored as query-strings."
+               },
+               {
+                       id: "notrycatch",
+                       label: "No try-catch",
+                       tooltip: "Enabling this will run tests outside of a try-catch block. Makes debugging exceptions in IE reasonable. Stored as query-strings."
+               }
+       ],
+
+       // Set of all modules.
+       modules: {},
+
+       // logging callback queues
+       begin: [],
+       done: [],
+       log: [],
+       testStart: [],
+       testDone: [],
+       moduleStart: [],
+       moduleDone: []
+};
+
+// Initialize more QUnit.config and QUnit.urlParams
+(function() {
+       var i, current,
+               location = window.location || { search: "", protocol: "file:" },
+               params = location.search.slice( 1 ).split( "&" ),
+               length = params.length,
+               urlParams = {};
+
+       if ( params[ 0 ] ) {
+               for ( i = 0; i < length; i++ ) {
+                       current = params[ i ].split( "=" );
+                       current[ 0 ] = decodeURIComponent( current[ 0 ] );
+
+                       // allow just a key to turn on a flag, e.g., test.html?noglobals
+                       current[ 1 ] = current[ 1 ] ? decodeURIComponent( current[ 1 ] ) : true;
+                       if ( urlParams[ current[ 0 ] ] ) {
+                               urlParams[ current[ 0 ] ] = [].concat( urlParams[ current[ 0 ] ], current[ 1 ] );
+                       } else {
+                               urlParams[ current[ 0 ] ] = current[ 1 ];
+                       }
+               }
+       }
+
+       QUnit.urlParams = urlParams;
+
+       // String search anywhere in moduleName+testName
+       config.filter = urlParams.filter;
+
+       // Exact match of the module name
+       config.module = urlParams.module;
+
+       config.testNumber = [];
+       if ( urlParams.testNumber ) {
+
+               // Ensure that urlParams.testNumber is an array
+               urlParams.testNumber = [].concat( urlParams.testNumber );
+               for ( i = 0; i < urlParams.testNumber.length; i++ ) {
+                       current = urlParams.testNumber[ i ];
+                       config.testNumber.push( parseInt( current, 10 ) );
+               }
+       }
+
+       // Figure out if we're running the tests from a server or not
+       QUnit.isLocal = location.protocol === "file:";
+}());
+
+extend( QUnit, {
+
+       config: config,
+
+       // Initialize the configuration options
+       init: function() {
+               extend( config, {
+                       stats: { all: 0, bad: 0 },
+                       moduleStats: { all: 0, bad: 0 },
+                       started: +new Date(),
+                       updateRate: 1000,
+                       blocking: false,
+                       autostart: true,
+                       autorun: false,
+                       filter: "",
+                       queue: [],
+                       semaphore: 1
+               });
+
+               var tests, banner, result,
+                       qunit = id( "qunit" );
+
+               if ( qunit ) {
+                       qunit.innerHTML =
+                               "<h1 id='qunit-header'>" + escapeText( document.title ) + "</h1>" +
+                               "<h2 id='qunit-banner'></h2>" +
+                               "<div id='qunit-testrunner-toolbar'></div>" +
+                               "<h2 id='qunit-userAgent'></h2>" +
+                               "<ol id='qunit-tests'></ol>";
+               }
+
+               tests = id( "qunit-tests" );
+               banner = id( "qunit-banner" );
+               result = id( "qunit-testresult" );
+
+               if ( tests ) {
+                       tests.innerHTML = "";
+               }
+
+               if ( banner ) {
+                       banner.className = "";
+               }
+
+               if ( result ) {
+                       result.parentNode.removeChild( result );
+               }
+
+               if ( tests ) {
+                       result = document.createElement( "p" );
+                       result.id = "qunit-testresult";
+                       result.className = "result";
+                       tests.parentNode.insertBefore( result, tests );
+                       result.innerHTML = "Running...<br/>&nbsp;";
+               }
+       },
+
+       // Resets the test setup. Useful for tests that modify the DOM.
+       /*
+       DEPRECATED: Use multiple tests instead of resetting inside a test.
+       Use testStart or testDone for custom cleanup.
+       This method will throw an error in 2.0, and will be removed in 2.1
+       */
+       reset: function() {
+               var fixture = id( "qunit-fixture" );
+               if ( fixture ) {
+                       fixture.innerHTML = config.fixture;
+               }
+       },
+
+       // Safe object type checking
+       is: function( type, obj ) {
+               return QUnit.objectType( obj ) === type;
+       },
+
+       objectType: function( obj ) {
+               if ( typeof obj === "undefined" ) {
+                       return "undefined";
+               }
+
+               // Consider: typeof null === object
+               if ( obj === null ) {
+                       return "null";
+               }
+
+               var match = toString.call( obj ).match(/^\[object\s(.*)\]$/),
+                       type = match && match[1] || "";
+
+               switch ( type ) {
+                       case "Number":
+                               if ( isNaN(obj) ) {
+                                       return "nan";
+                               }
+                               return "number";
+                       case "String":
+                       case "Boolean":
+                       case "Array":
+                       case "Date":
+                       case "RegExp":
+                       case "Function":
+                               return type.toLowerCase();
+               }
+               if ( typeof obj === "object" ) {
+                       return "object";
+               }
+               return undefined;
+       },
+
+       push: function( result, actual, expected, message ) {
+               if ( !config.current ) {
+                       throw new Error( "assertion outside test context, was " + sourceFromStacktrace() );
+               }
+
+               var output, source,
+                       details = {
+                               module: config.current.module,
+                               name: config.current.testName,
+                               result: result,
+                               message: message,
+                               actual: actual,
+                               expected: expected
+                       };
+
+               message = escapeText( message ) || ( result ? "okay" : "failed" );
+               message = "<span class='test-message'>" + message + "</span>";
+               output = message;
+
+               if ( !result ) {
+                       expected = escapeText( QUnit.jsDump.parse(expected) );
+                       actual = escapeText( QUnit.jsDump.parse(actual) );
+                       output += "<table><tr class='test-expected'><th>Expected: </th><td><pre>" + expected + "</pre></td></tr>";
+
+                       if ( actual !== expected ) {
+                               output += "<tr class='test-actual'><th>Result: </th><td><pre>" + actual + "</pre></td></tr>";
+                               output += "<tr class='test-diff'><th>Diff: </th><td><pre>" + QUnit.diff( expected, actual ) + "</pre></td></tr>";
+                       }
+
+                       source = sourceFromStacktrace();
+
+                       if ( source ) {
+                               details.source = source;
+                               output += "<tr class='test-source'><th>Source: </th><td><pre>" + escapeText( source ) + "</pre></td></tr>";
+                       }
+
+                       output += "</table>";
+               }
+
+               runLoggingCallbacks( "log", QUnit, details );
+
+               config.current.assertions.push({
+                       result: !!result,
+                       message: output
+               });
+       },
+
+       pushFailure: function( message, source, actual ) {
+               if ( !config.current ) {
+                       throw new Error( "pushFailure() assertion outside test context, was " + sourceFromStacktrace(2) );
+               }
+
+               var output,
+                       details = {
+                               module: config.current.module,
+                               name: config.current.testName,
+                               result: false,
+                               message: message
+                       };
+
+               message = escapeText( message ) || "error";
+               message = "<span class='test-message'>" + message + "</span>";
+               output = message;
+
+               output += "<table>";
+
+               if ( actual ) {
+                       output += "<tr class='test-actual'><th>Result: </th><td><pre>" + escapeText( actual ) + "</pre></td></tr>";
+               }
+
+               if ( source ) {
+                       details.source = source;
+                       output += "<tr class='test-source'><th>Source: </th><td><pre>" + escapeText( source ) + "</pre></td></tr>";
+               }
+
+               output += "</table>";
+
+               runLoggingCallbacks( "log", QUnit, details );
+
+               config.current.assertions.push({
+                       result: false,
+                       message: output
+               });
+       },
+
+       url: function( params ) {
+               params = extend( extend( {}, QUnit.urlParams ), params );
+               var key,
+                       querystring = "?";
+
+               for ( key in params ) {
+                       if ( hasOwn.call( params, key ) ) {
+                               querystring += encodeURIComponent( key ) + "=" +
+                                       encodeURIComponent( params[ key ] ) + "&";
+                       }
+               }
+               return window.location.protocol + "//" + window.location.host +
+                       window.location.pathname + querystring.slice( 0, -1 );
+       },
+
+       extend: extend,
+       id: id,
+       addEvent: addEvent,
+       addClass: addClass,
+       hasClass: hasClass,
+       removeClass: removeClass
+       // load, equiv, jsDump, diff: Attached later
+});
+
+/**
+ * @deprecated: Created for backwards compatibility with test runner that set the hook function
+ * into QUnit.{hook}, instead of invoking it and passing the hook function.
+ * QUnit.constructor is set to the empty F() above so that we can add to it's prototype here.
+ * Doing this allows us to tell if the following methods have been overwritten on the actual
+ * QUnit object.
+ */
+extend( QUnit.constructor.prototype, {
+
+       // Logging callbacks; all receive a single argument with the listed properties
+       // run test/logs.html for any related changes
+       begin: registerLoggingCallback( "begin" ),
+
+       // done: { failed, passed, total, runtime }
+       done: registerLoggingCallback( "done" ),
+
+       // log: { result, actual, expected, message }
+       log: registerLoggingCallback( "log" ),
+
+       // testStart: { name }
+       testStart: registerLoggingCallback( "testStart" ),
+
+       // testDone: { name, failed, passed, total, runtime }
+       testDone: registerLoggingCallback( "testDone" ),
+
+       // moduleStart: { name }
+       moduleStart: registerLoggingCallback( "moduleStart" ),
+
+       // moduleDone: { name, failed, passed, total }
+       moduleDone: registerLoggingCallback( "moduleDone" )
+});
+
+if ( !defined.document || document.readyState === "complete" ) {
+       config.autorun = true;
+}
+
+QUnit.load = function() {
+       runLoggingCallbacks( "begin", QUnit, {} );
+
+       // Initialize the config, saving the execution queue
+       var banner, filter, i, j, label, len, main, ol, toolbar, val, selection,
+               urlConfigContainer, moduleFilter, userAgent,
+               numModules = 0,
+               moduleNames = [],
+               moduleFilterHtml = "",
+               urlConfigHtml = "",
+               oldconfig = extend( {}, config );
+
+       QUnit.init();
+       extend(config, oldconfig);
+
+       config.blocking = false;
+
+       len = config.urlConfig.length;
+
+       for ( i = 0; i < len; i++ ) {
+               val = config.urlConfig[i];
+               if ( typeof val === "string" ) {
+                       val = {
+                               id: val,
+                               label: val
+                       };
+               }
+               config[ val.id ] = QUnit.urlParams[ val.id ];
+               if ( !val.value || typeof val.value === "string" ) {
+                       urlConfigHtml += "<input id='qunit-urlconfig-" + escapeText( val.id ) +
+                               "' name='" + escapeText( val.id ) +
+                               "' type='checkbox'" +
+                               ( val.value ? " value='" + escapeText( val.value ) + "'" : "" ) +
+                               ( config[ val.id ] ? " checked='checked'" : "" ) +
+                               " title='" + escapeText( val.tooltip ) +
+                               "'><label for='qunit-urlconfig-" + escapeText( val.id ) +
+                               "' title='" + escapeText( val.tooltip ) + "'>" + val.label + "</label>";
+               } else {
+                       urlConfigHtml += "<label for='qunit-urlconfig-" + escapeText( val.id ) +
+                               "' title='" + escapeText( val.tooltip ) +
+                               "'>" + val.label +
+                               ": </label><select id='qunit-urlconfig-" + escapeText( val.id ) +
+                               "' name='" + escapeText( val.id ) +
+                               "' title='" + escapeText( val.tooltip ) +
+                               "'><option></option>";
+                       selection = false;
+                       if ( QUnit.is( "array", val.value ) ) {
+                               for ( j = 0; j < val.value.length; j++ ) {
+                                       urlConfigHtml += "<option value='" + escapeText( val.value[j] ) + "'" +
+                                               ( config[ val.id ] === val.value[j] ?
+                                                       (selection = true) && " selected='selected'" :
+                                                       "" ) +
+                                               ">" + escapeText( val.value[j] ) + "</option>";
+                               }
+                       } else {
+                               for ( j in val.value ) {
+                                       if ( hasOwn.call( val.value, j ) ) {
+                                               urlConfigHtml += "<option value='" + escapeText( j ) + "'" +
+                                                       ( config[ val.id ] === j ?
+                                                               (selection = true) && " selected='selected'" :
+                                                               "" ) +
+                                                       ">" + escapeText( val.value[j] ) + "</option>";
+                                       }
+                               }
+                       }
+                       if ( config[ val.id ] && !selection ) {
+                               urlConfigHtml += "<option value='" + escapeText( config[ val.id ] ) +
+                                       "' selected='selected' disabled='disabled'>" +
+                                       escapeText( config[ val.id ] ) +
+                                       "</option>";
+                       }
+                       urlConfigHtml += "</select>";
+               }
+       }
+       for ( i in config.modules ) {
+               if ( config.modules.hasOwnProperty( i ) ) {
+                       moduleNames.push(i);
+               }
+       }
+       numModules = moduleNames.length;
+       moduleNames.sort( function( a, b ) {
+               return a.localeCompare( b );
+       });
+       moduleFilterHtml += "<label for='qunit-modulefilter'>Module: </label><select id='qunit-modulefilter' name='modulefilter'><option value='' " +
+               ( config.module === undefined  ? "selected='selected'" : "" ) +
+               ">< All Modules ></option>";
+
+
+       for ( i = 0; i < numModules; i++) {
+                       moduleFilterHtml += "<option value='" + escapeText( encodeURIComponent(moduleNames[i]) ) + "' " +
+                               ( config.module === moduleNames[i] ? "selected='selected'" : "" ) +
+                               ">" + escapeText(moduleNames[i]) + "</option>";
+       }
+       moduleFilterHtml += "</select>";
+
+       // `userAgent` initialized at top of scope
+       userAgent = id( "qunit-userAgent" );
+       if ( userAgent ) {
+               userAgent.innerHTML = navigator.userAgent;
+       }
+
+       // `banner` initialized at top of scope
+       banner = id( "qunit-header" );
+       if ( banner ) {
+               banner.innerHTML = "<a href='" + QUnit.url({ filter: undefined, module: undefined, testNumber: undefined }) + "'>" + banner.innerHTML + "</a> ";
+       }
+
+       // `toolbar` initialized at top of scope
+       toolbar = id( "qunit-testrunner-toolbar" );
+       if ( toolbar ) {
+               // `filter` initialized at top of scope
+               filter = document.createElement( "input" );
+               filter.type = "checkbox";
+               filter.id = "qunit-filter-pass";
+
+               addEvent( filter, "click", function() {
+                       var tmp,
+                               ol = id( "qunit-tests" );
+
+                       if ( filter.checked ) {
+                               ol.className = ol.className + " hidepass";
+                       } else {
+                               tmp = " " + ol.className.replace( /[\n\t\r]/g, " " ) + " ";
+                               ol.className = tmp.replace( / hidepass /, " " );
+                       }
+                       if ( defined.sessionStorage ) {
+                               if (filter.checked) {
+                                       sessionStorage.setItem( "qunit-filter-passed-tests", "true" );
+                               } else {
+                                       sessionStorage.removeItem( "qunit-filter-passed-tests" );
+                               }
+                       }
+               });
+
+               if ( config.hidepassed || defined.sessionStorage && sessionStorage.getItem( "qunit-filter-passed-tests" ) ) {
+                       filter.checked = true;
+                       // `ol` initialized at top of scope
+                       ol = id( "qunit-tests" );
+                       ol.className = ol.className + " hidepass";
+               }
+               toolbar.appendChild( filter );
+
+               // `label` initialized at top of scope
+               label = document.createElement( "label" );
+               label.setAttribute( "for", "qunit-filter-pass" );
+               label.setAttribute( "title", "Only show tests and assertions that fail. Stored in sessionStorage." );
+               label.innerHTML = "Hide passed tests";
+               toolbar.appendChild( label );
+
+               urlConfigContainer = document.createElement("span");
+               urlConfigContainer.innerHTML = urlConfigHtml;
+               // For oldIE support:
+               // * Add handlers to the individual elements instead of the container
+               // * Use "click" instead of "change" for checkboxes
+               // * Fallback from event.target to event.srcElement
+               addEvents( urlConfigContainer.getElementsByTagName("input"), "click", function( event ) {
+                       var params = {},
+                               target = event.target || event.srcElement;
+                       params[ target.name ] = target.checked ?
+                               target.defaultValue || true :
+                               undefined;
+                       window.location = QUnit.url( params );
+               });
+               addEvents( urlConfigContainer.getElementsByTagName("select"), "change", function( event ) {
+                       var params = {},
+                               target = event.target || event.srcElement;
+                       params[ target.name ] = target.options[ target.selectedIndex ].value || undefined;
+                       window.location = QUnit.url( params );
+               });
+               toolbar.appendChild( urlConfigContainer );
+
+               if (numModules > 1) {
+                       moduleFilter = document.createElement( "span" );
+                       moduleFilter.setAttribute( "id", "qunit-modulefilter-container" );
+                       moduleFilter.innerHTML = moduleFilterHtml;
+                       addEvent( moduleFilter.lastChild, "change", function() {
+                               var selectBox = moduleFilter.getElementsByTagName("select")[0],
+                                       selectedModule = decodeURIComponent(selectBox.options[selectBox.selectedIndex].value);
+
+                               window.location = QUnit.url({
+                                       module: ( selectedModule === "" ) ? undefined : selectedModule,
+                                       // Remove any existing filters
+                                       filter: undefined,
+                                       testNumber: undefined
+                               });
+                       });
+                       toolbar.appendChild(moduleFilter);
+               }
+       }
+
+       // `main` initialized at top of scope
+       main = id( "qunit-fixture" );
+       if ( main ) {
+               config.fixture = main.innerHTML;
+       }
+
+       if ( config.autostart ) {
+               QUnit.start();
+       }
+};
+
+if ( defined.document ) {
+       addEvent( window, "load", QUnit.load );
+}
+
+// `onErrorFnPrev` initialized at top of scope
+// Preserve other handlers
+onErrorFnPrev = window.onerror;
+
+// Cover uncaught exceptions
+// Returning true will suppress the default browser handler,
+// returning false will let it run.
+window.onerror = function ( error, filePath, linerNr ) {
+       var ret = false;
+       if ( onErrorFnPrev ) {
+               ret = onErrorFnPrev( error, filePath, linerNr );
+       }
+
+       // Treat return value as window.onerror itself does,
+       // Only do our handling if not suppressed.
+       if ( ret !== true ) {
+               if ( QUnit.config.current ) {
+                       if ( QUnit.config.current.ignoreGlobalErrors ) {
+                               return true;
+                       }
+                       QUnit.pushFailure( error, filePath + ":" + linerNr );
+               } else {
+                       QUnit.test( "global failure", extend( function() {
+                               QUnit.pushFailure( error, filePath + ":" + linerNr );
+                       }, { validTest: validTest } ) );
+               }
+               return false;
+       }
+
+       return ret;
+};
+
+function done() {
+       config.autorun = true;
+
+       // Log the last module results
+       if ( config.previousModule ) {
+               runLoggingCallbacks( "moduleDone", QUnit, {
+                       name: config.previousModule,
+                       failed: config.moduleStats.bad,
+                       passed: config.moduleStats.all - config.moduleStats.bad,
+                       total: config.moduleStats.all
+               });
+       }
+       delete config.previousModule;
+
+       var i, key,
+               banner = id( "qunit-banner" ),
+               tests = id( "qunit-tests" ),
+               runtime = +new Date() - config.started,
+               passed = config.stats.all - config.stats.bad,
+               html = [
+                       "Tests completed in ",
+                       runtime,
+                       " milliseconds.<br/>",
+                       "<span class='passed'>",
+                       passed,
+                       "</span> assertions of <span class='total'>",
+                       config.stats.all,
+                       "</span> passed, <span class='failed'>",
+                       config.stats.bad,
+                       "</span> failed."
+               ].join( "" );
+
+       if ( banner ) {
+               banner.className = ( config.stats.bad ? "qunit-fail" : "qunit-pass" );
+       }
+
+       if ( tests ) {
+               id( "qunit-testresult" ).innerHTML = html;
+       }
+
+       if ( config.altertitle && defined.document && document.title ) {
+               // show ✖ for good, ✔ for bad suite result in title
+               // use escape sequences in case file gets loaded with non-utf-8-charset
+               document.title = [
+                       ( config.stats.bad ? "\u2716" : "\u2714" ),
+                       document.title.replace( /^[\u2714\u2716] /i, "" )
+               ].join( " " );
+       }
+
+       // clear own sessionStorage items if all tests passed
+       if ( config.reorder && defined.sessionStorage && config.stats.bad === 0 ) {
+               // `key` & `i` initialized at top of scope
+               for ( i = 0; i < sessionStorage.length; i++ ) {
+                       key = sessionStorage.key( i++ );
+                       if ( key.indexOf( "qunit-test-" ) === 0 ) {
+                               sessionStorage.removeItem( key );
+                       }
+               }
+       }
+
+       // scroll back to top to show results
+       if ( config.scrolltop && window.scrollTo ) {
+               window.scrollTo(0, 0);
+       }
+
+       runLoggingCallbacks( "done", QUnit, {
+               failed: config.stats.bad,
+               passed: passed,
+               total: config.stats.all,
+               runtime: runtime
+       });
+}
+
+/** @return Boolean: true if this test should be ran */
+function validTest( test ) {
+       var include,
+               filter = config.filter && config.filter.toLowerCase(),
+               module = config.module && config.module.toLowerCase(),
+               fullName = ( test.module + ": " + test.testName ).toLowerCase();
+
+       // Internally-generated tests are always valid
+       if ( test.callback && test.callback.validTest === validTest ) {
+               delete test.callback.validTest;
+               return true;
+       }
+
+       if ( config.testNumber.length > 0 ) {
+               if ( inArray( test.testNumber, config.testNumber ) < 0 ) {
+                       return false;
+               }
+       }
+
+       if ( module && ( !test.module || test.module.toLowerCase() !== module ) ) {
+               return false;
+       }
+
+       if ( !filter ) {
+               return true;
+       }
+
+       include = filter.charAt( 0 ) !== "!";
+       if ( !include ) {
+               filter = filter.slice( 1 );
+       }
+
+       // If the filter matches, we need to honour include
+       if ( fullName.indexOf( filter ) !== -1 ) {
+               return include;
+       }
+
+       // Otherwise, do the opposite
+       return !include;
+}
+
+// so far supports only Firefox, Chrome and Opera (buggy), Safari (for real exceptions)
+// Later Safari and IE10 are supposed to support error.stack as well
+// See also https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Error/Stack
+function extractStacktrace( e, offset ) {
+       offset = offset === undefined ? 3 : offset;
+
+       var stack, include, i;
+
+       if ( e.stacktrace ) {
+               // Opera
+               return e.stacktrace.split( "\n" )[ offset + 3 ];
+       } else if ( e.stack ) {
+               // Firefox, Chrome
+               stack = e.stack.split( "\n" );
+               if (/^error$/i.test( stack[0] ) ) {
+                       stack.shift();
+               }
+               if ( fileName ) {
+                       include = [];
+                       for ( i = offset; i < stack.length; i++ ) {
+                               if ( stack[ i ].indexOf( fileName ) !== -1 ) {
+                                       break;
+                               }
+                               include.push( stack[ i ] );
+                       }
+                       if ( include.length ) {
+                               return include.join( "\n" );
+                       }
+               }
+               return stack[ offset ];
+       } else if ( e.sourceURL ) {
+               // Safari, PhantomJS
+               // hopefully one day Safari provides actual stacktraces
+               // exclude useless self-reference for generated Error objects
+               if ( /qunit.js$/.test( e.sourceURL ) ) {
+                       return;
+               }
+               // for actual exceptions, this is useful
+               return e.sourceURL + ":" + e.line;
+       }
+}
+function sourceFromStacktrace( offset ) {
+       try {
+               throw new Error();
+       } catch ( e ) {
+               return extractStacktrace( e, offset );
+       }
+}
+
+/**
+ * Escape text for attribute or text content.
+ */
+function escapeText( s ) {
+       if ( !s ) {
+               return "";
+       }
+       s = s + "";
+       // Both single quotes and double quotes (for attributes)
+       return s.replace( /['"<>&]/g, function( s ) {
+               switch( s ) {
+                       case "'":
+                               return "&#039;";
+                       case "\"":
+                               return "&quot;";
+                       case "<":
+                               return "&lt;";
+                       case ">":
+                               return "&gt;";
+                       case "&":
+                               return "&amp;";
+               }
+       });
+}
+
+function synchronize( callback, last ) {
+       config.queue.push( callback );
+
+       if ( config.autorun && !config.blocking ) {
+               process( last );
+       }
+}
+
+function process( last ) {
+       function next() {
+               process( last );
+       }
+       var start = new Date().getTime();
+       config.depth = config.depth ? config.depth + 1 : 1;
+
+       while ( config.queue.length && !config.blocking ) {
+               if ( !defined.setTimeout || config.updateRate <= 0 || ( ( new Date().getTime() - start ) < config.updateRate ) ) {
+                       config.queue.shift()();
+               } else {
+                       setTimeout( next, 13 );
+                       break;
+               }
+       }
+       config.depth--;
+       if ( last && !config.blocking && !config.queue.length && config.depth === 0 ) {
+               done();
+       }
+}
+
+function saveGlobal() {
+       config.pollution = [];
+
+       if ( config.noglobals ) {
+               for ( var key in window ) {
+                       if ( hasOwn.call( window, key ) ) {
+                               // in Opera sometimes DOM element ids show up here, ignore them
+                               if ( /^qunit-test-output/.test( key ) ) {
+                                       continue;
+                               }
+                               config.pollution.push( key );
+                       }
+               }
+       }
+}
+
+function checkPollution() {
+       var newGlobals,
+               deletedGlobals,
+               old = config.pollution;
+
+       saveGlobal();
+
+       newGlobals = diff( config.pollution, old );
+       if ( newGlobals.length > 0 ) {
+               QUnit.pushFailure( "Introduced global variable(s): " + newGlobals.join(", ") );
+       }
+
+       deletedGlobals = diff( old, config.pollution );
+       if ( deletedGlobals.length > 0 ) {
+               QUnit.pushFailure( "Deleted global variable(s): " + deletedGlobals.join(", ") );
+       }
+}
+
+// returns a new Array with the elements that are in a but not in b
+function diff( a, b ) {
+       var i, j,
+               result = a.slice();
+
+       for ( i = 0; i < result.length; i++ ) {
+               for ( j = 0; j < b.length; j++ ) {
+                       if ( result[i] === b[j] ) {
+                               result.splice( i, 1 );
+                               i--;
+                               break;
+                       }
+               }
+       }
+       return result;
+}
+
+function extend( a, b ) {
+       for ( var prop in b ) {
+               if ( hasOwn.call( b, prop ) ) {
+                       // Avoid "Member not found" error in IE8 caused by messing with window.constructor
+                       if ( !( prop === "constructor" && a === window ) ) {
+                               if ( b[ prop ] === undefined ) {
+                                       delete a[ prop ];
+                               } else {
+                                       a[ prop ] = b[ prop ];
+                               }
+                       }
+               }
+       }
+
+       return a;
+}
+
+/**
+ * @param {HTMLElement} elem
+ * @param {string} type
+ * @param {Function} fn
+ */
+function addEvent( elem, type, fn ) {
+       if ( elem.addEventListener ) {
+
+               // Standards-based browsers
+               elem.addEventListener( type, fn, false );
+       } else if ( elem.attachEvent ) {
+
+               // support: IE <9
+               elem.attachEvent( "on" + type, fn );
+       } else {
+
+               // Caller must ensure support for event listeners is present
+               throw new Error( "addEvent() was called in a context without event listener support" );
+       }
+}
+
+/**
+ * @param {Array|NodeList} elems
+ * @param {string} type
+ * @param {Function} fn
+ */
+function addEvents( elems, type, fn ) {
+       var i = elems.length;
+       while ( i-- ) {
+               addEvent( elems[i], type, fn );
+       }
+}
+
+function hasClass( elem, name ) {
+       return (" " + elem.className + " ").indexOf(" " + name + " ") > -1;
+}
+
+function addClass( elem, name ) {
+       if ( !hasClass( elem, name ) ) {
+               elem.className += (elem.className ? " " : "") + name;
+       }
+}
+
+function removeClass( elem, name ) {
+       var set = " " + elem.className + " ";
+       // Class name may appear multiple times
+       while ( set.indexOf(" " + name + " ") > -1 ) {
+               set = set.replace(" " + name + " " , " ");
+       }
+       // If possible, trim it for prettiness, but not necessarily
+       elem.className = typeof set.trim === "function" ? set.trim() : set.replace(/^\s+|\s+$/g, "");
+}
+
+function id( name ) {
+       return defined.document && document.getElementById && document.getElementById( name );
+}
+
+function registerLoggingCallback( key ) {
+       return function( callback ) {
+               config[key].push( callback );
+       };
+}
+
+// Supports deprecated method of completely overwriting logging callbacks
+function runLoggingCallbacks( key, scope, args ) {
+       var i, callbacks;
+       if ( QUnit.hasOwnProperty( key ) ) {
+               QUnit[ key ].call(scope, args );
+       } else {
+               callbacks = config[ key ];
+               for ( i = 0; i < callbacks.length; i++ ) {
+                       callbacks[ i ].call( scope, args );
+               }
+       }
+}
+
+// from jquery.js
+function inArray( elem, array ) {
+       if ( array.indexOf ) {
+               return array.indexOf( elem );
+       }
+
+       for ( var i = 0, length = array.length; i < length; i++ ) {
+               if ( array[ i ] === elem ) {
+                       return i;
+               }
+       }
+
+       return -1;
+}
+
+function Test( settings ) {
+       extend( this, settings );
+       this.assertions = [];
+       this.testNumber = ++Test.count;
+}
+
+Test.count = 0;
+
+Test.prototype = {
+       init: function() {
+               var a, b, li,
+                       tests = id( "qunit-tests" );
+
+               if ( tests ) {
+                       b = document.createElement( "strong" );
+                       b.innerHTML = this.nameHtml;
+
+                       // `a` initialized at top of scope
+                       a = document.createElement( "a" );
+                       a.innerHTML = "Rerun";
+                       a.href = QUnit.url({ testNumber: this.testNumber });
+
+                       li = document.createElement( "li" );
+                       li.appendChild( b );
+                       li.appendChild( a );
+                       li.className = "running";
+                       li.id = this.id = "qunit-test-output" + testId++;
+
+                       tests.appendChild( li );
+               }
+       },
+       setup: function() {
+               if (
+                       // Emit moduleStart when we're switching from one module to another
+                       this.module !== config.previousModule ||
+                               // They could be equal (both undefined) but if the previousModule property doesn't
+                               // yet exist it means this is the first test in a suite that isn't wrapped in a
+                               // module, in which case we'll just emit a moduleStart event for 'undefined'.
+                               // Without this, reporters can get testStart before moduleStart  which is a problem.
+                               !hasOwn.call( config, "previousModule" )
+               ) {
+                       if ( hasOwn.call( config, "previousModule" ) ) {
+                               runLoggingCallbacks( "moduleDone", QUnit, {
+                                       name: config.previousModule,
+                                       failed: config.moduleStats.bad,
+                                       passed: config.moduleStats.all - config.moduleStats.bad,
+                                       total: config.moduleStats.all
+                               });
+                       }
+                       config.previousModule = this.module;
+                       config.moduleStats = { all: 0, bad: 0 };
+                       runLoggingCallbacks( "moduleStart", QUnit, {
+                               name: this.module
+                       });
+               }
+
+               config.current = this;
+
+               this.testEnvironment = extend({
+                       setup: function() {},
+                       teardown: function() {}
+               }, this.moduleTestEnvironment );
+
+               this.started = +new Date();
+               runLoggingCallbacks( "testStart", QUnit, {
+                       name: this.testName,
+                       module: this.module
+               });
+
+               /*jshint camelcase:false */
+
+
+               /**
+                * Expose the current test environment.
+                *
+                * @deprecated since 1.12.0: Use QUnit.config.current.testEnvironment instead.
+                */
+               QUnit.current_testEnvironment = this.testEnvironment;
+
+               /*jshint camelcase:true */
+
+               if ( !config.pollution ) {
+                       saveGlobal();
+               }
+               if ( config.notrycatch ) {
+                       this.testEnvironment.setup.call( this.testEnvironment, QUnit.assert );
+                       return;
+               }
+               try {
+                       this.testEnvironment.setup.call( this.testEnvironment, QUnit.assert );
+               } catch( e ) {
+                       QUnit.pushFailure( "Setup failed on " + this.testName + ": " + ( e.message || e ), extractStacktrace( e, 1 ) );
+               }
+       },
+       run: function() {
+               config.current = this;
+
+               var running = id( "qunit-testresult" );
+
+               if ( running ) {
+                       running.innerHTML = "Running: <br/>" + this.nameHtml;
+               }
+
+               if ( this.async ) {
+                       QUnit.stop();
+               }
+
+               this.callbackStarted = +new Date();
+
+               if ( config.notrycatch ) {
+                       this.callback.call( this.testEnvironment, QUnit.assert );
+                       this.callbackRuntime = +new Date() - this.callbackStarted;
+                       return;
+               }
+
+               try {
+                       this.callback.call( this.testEnvironment, QUnit.assert );
+                       this.callbackRuntime = +new Date() - this.callbackStarted;
+               } catch( e ) {
+                       this.callbackRuntime = +new Date() - this.callbackStarted;
+
+                       QUnit.pushFailure( "Died on test #" + (this.assertions.length + 1) + " " + this.stack + ": " + ( e.message || e ), extractStacktrace( e, 0 ) );
+                       // else next test will carry the responsibility
+                       saveGlobal();
+
+                       // Restart the tests if they're blocking
+                       if ( config.blocking ) {
+                               QUnit.start();
+                       }
+               }
+       },
+       teardown: function() {
+               config.current = this;
+               if ( config.notrycatch ) {
+                       if ( typeof this.callbackRuntime === "undefined" ) {
+                               this.callbackRuntime = +new Date() - this.callbackStarted;
+                       }
+                       this.testEnvironment.teardown.call( this.testEnvironment, QUnit.assert );
+                       return;
+               } else {
+                       try {
+                               this.testEnvironment.teardown.call( this.testEnvironment, QUnit.assert );
+                       } catch( e ) {
+                               QUnit.pushFailure( "Teardown failed on " + this.testName + ": " + ( e.message || e ), extractStacktrace( e, 1 ) );
+                       }
+               }
+               checkPollution();
+       },
+       finish: function() {
+               config.current = this;
+               if ( config.requireExpects && this.expected === null ) {
+                       QUnit.pushFailure( "Expected number of assertions to be defined, but expect() was not called.", this.stack );
+               } else if ( this.expected !== null && this.expected !== this.assertions.length ) {
+                       QUnit.pushFailure( "Expected " + this.expected + " assertions, but " + this.assertions.length + " were run", this.stack );
+               } else if ( this.expected === null && !this.assertions.length ) {
+                       QUnit.pushFailure( "Expected at least one assertion, but none were run - call expect(0) to accept zero assertions.", this.stack );
+               }
+
+               var i, assertion, a, b, time, li, ol,
+                       test = this,
+                       good = 0,
+                       bad = 0,
+                       tests = id( "qunit-tests" );
+
+               this.runtime = +new Date() - this.started;
+               config.stats.all += this.assertions.length;
+               config.moduleStats.all += this.assertions.length;
+
+               if ( tests ) {
+                       ol = document.createElement( "ol" );
+                       ol.className = "qunit-assert-list";
+
+                       for ( i = 0; i < this.assertions.length; i++ ) {
+                               assertion = this.assertions[i];
+
+                               li = document.createElement( "li" );
+                               li.className = assertion.result ? "pass" : "fail";
+                               li.innerHTML = assertion.message || ( assertion.result ? "okay" : "failed" );
+                               ol.appendChild( li );
+
+                               if ( assertion.result ) {
+                                       good++;
+                               } else {
+                                       bad++;
+                                       config.stats.bad++;
+                                       config.moduleStats.bad++;
+                               }
+                       }
+
+                       // store result when possible
+                       if ( QUnit.config.reorder && defined.sessionStorage ) {
+                               if ( bad ) {
+                                       sessionStorage.setItem( "qunit-test-" + this.module + "-" + this.testName, bad );
+                               } else {
+                                       sessionStorage.removeItem( "qunit-test-" + this.module + "-" + this.testName );
+                               }
+                       }
+
+                       if ( bad === 0 ) {
+                               addClass( ol, "qunit-collapsed" );
+                       }
+
+                       // `b` initialized at top of scope
+                       b = document.createElement( "strong" );
+                       b.innerHTML = this.nameHtml + " <b class='counts'>(<b class='failed'>" + bad + "</b>, <b class='passed'>" + good + "</b>, " + this.assertions.length + ")</b>";
+
+                       addEvent(b, "click", function() {
+                               var next = b.parentNode.lastChild,
+                                       collapsed = hasClass( next, "qunit-collapsed" );
+                               ( collapsed ? removeClass : addClass )( next, "qunit-collapsed" );
+                       });
+
+                       addEvent(b, "dblclick", function( e ) {
+                               var target = e && e.target ? e.target : window.event.srcElement;
+                               if ( target.nodeName.toLowerCase() === "span" || target.nodeName.toLowerCase() === "b" ) {
+                                       target = target.parentNode;
+                               }
+                               if ( window.location && target.nodeName.toLowerCase() === "strong" ) {
+                                       window.location = QUnit.url({ testNumber: test.testNumber });
+                               }
+                       });
+
+                       // `time` initialized at top of scope
+                       time = document.createElement( "span" );
+                       time.className = "runtime";
+                       time.innerHTML = this.runtime + " ms";
+
+                       // `li` initialized at top of scope
+                       li = id( this.id );
+                       li.className = bad ? "fail" : "pass";
+                       li.removeChild( li.firstChild );
+                       a = li.firstChild;
+                       li.appendChild( b );
+                       li.appendChild( a );
+                       li.appendChild( time );
+                       li.appendChild( ol );
+
+               } else {
+                       for ( i = 0; i < this.assertions.length; i++ ) {
+                               if ( !this.assertions[i].result ) {
+                                       bad++;
+                                       config.stats.bad++;
+                                       config.moduleStats.bad++;
+                               }
+                       }
+               }
+
+               runLoggingCallbacks( "testDone", QUnit, {
+                       name: this.testName,
+                       module: this.module,
+                       failed: bad,
+                       passed: this.assertions.length - bad,
+                       total: this.assertions.length,
+                       runtime: this.runtime,
+                       // DEPRECATED: this property will be removed in 2.0.0, use runtime instead
+                       duration: this.runtime
+               });
+
+               QUnit.reset();
+
+               config.current = undefined;
+       },
+
+       queue: function() {
+               var bad,
+                       test = this;
+
+               synchronize(function() {
+                       test.init();
+               });
+               function run() {
+                       // each of these can by async
+                       synchronize(function() {
+                               test.setup();
+                       });
+                       synchronize(function() {
+                               test.run();
+                       });
+                       synchronize(function() {
+                               test.teardown();
+                       });
+                       synchronize(function() {
+                               test.finish();
+                       });
+               }
+
+               // `bad` initialized at top of scope
+               // defer when previous test run passed, if storage is available
+               bad = QUnit.config.reorder && defined.sessionStorage &&
+                                               +sessionStorage.getItem( "qunit-test-" + this.module + "-" + this.testName );
+
+               if ( bad ) {
+                       run();
+               } else {
+                       synchronize( run, true );
+               }
+       }
+};
+
+// `assert` initialized at top of scope
+// Assert helpers
+// All of these must either call QUnit.push() or manually do:
+// - runLoggingCallbacks( "log", .. );
+// - config.current.assertions.push({ .. });
+assert = QUnit.assert = {
+       /**
+        * Asserts rough true-ish result.
+        * @name ok
+        * @function
+        * @example ok( "asdfasdf".length > 5, "There must be at least 5 chars" );
+        */
+       ok: function( result, msg ) {
+               if ( !config.current ) {
+                       throw new Error( "ok() assertion outside test context, was " + sourceFromStacktrace(2) );
+               }
+               result = !!result;
+               msg = msg || ( result ? "okay" : "failed" );
+
+               var source,
+                       details = {
+                               module: config.current.module,
+                               name: config.current.testName,
+                               result: result,
+                               message: msg
+                       };
+
+               msg = "<span class='test-message'>" + escapeText( msg ) + "</span>";
+
+               if ( !result ) {
+                       source = sourceFromStacktrace( 2 );
+                       if ( source ) {
+                               details.source = source;
+                               msg += "<table><tr class='test-source'><th>Source: </th><td><pre>" +
+                                       escapeText( source ) +
+                                       "</pre></td></tr></table>";
+                       }
+               }
+               runLoggingCallbacks( "log", QUnit, details );
+               config.current.assertions.push({
+                       result: result,
+                       message: msg
+               });
+       },
+
+       /**
+        * Assert that the first two arguments are equal, with an optional message.
+        * Prints out both actual and expected values.
+        * @name equal
+        * @function
+        * @example equal( format( "Received {0} bytes.", 2), "Received 2 bytes.", "format() replaces {0} with next argument" );
+        */
+       equal: function( actual, expected, message ) {
+               /*jshint eqeqeq:false */
+               QUnit.push( expected == actual, actual, expected, message );
+       },
+
+       /**
+        * @name notEqual
+        * @function
+        */
+       notEqual: function( actual, expected, message ) {
+               /*jshint eqeqeq:false */
+               QUnit.push( expected != actual, actual, expected, message );
+       },
+
+       /**
+        * @name propEqual
+        * @function
+        */
+       propEqual: function( actual, expected, message ) {
+               actual = objectValues(actual);
+               expected = objectValues(expected);
+               QUnit.push( QUnit.equiv(actual, expected), actual, expected, message );
+       },
+
+       /**
+        * @name notPropEqual
+        * @function
+        */
+       notPropEqual: function( actual, expected, message ) {
+               actual = objectValues(actual);
+               expected = objectValues(expected);
+               QUnit.push( !QUnit.equiv(actual, expected), actual, expected, message );
+       },
+
+       /**
+        * @name deepEqual
+        * @function
+        */
+       deepEqual: function( actual, expected, message ) {
+               QUnit.push( QUnit.equiv(actual, expected), actual, expected, message );
+       },
+
+       /**
+        * @name notDeepEqual
+        * @function
+        */
+       notDeepEqual: function( actual, expected, message ) {
+               QUnit.push( !QUnit.equiv(actual, expected), actual, expected, message );
+       },
+
+       /**
+        * @name strictEqual
+        * @function
+        */
+       strictEqual: function( actual, expected, message ) {
+               QUnit.push( expected === actual, actual, expected, message );
+       },
+
+       /**
+        * @name notStrictEqual
+        * @function
+        */
+       notStrictEqual: function( actual, expected, message ) {
+               QUnit.push( expected !== actual, actual, expected, message );
+       },
+
+       "throws": function( block, expected, message ) {
+               var actual,
+                       expectedOutput = expected,
+                       ok = false;
+
+               // 'expected' is optional
+               if ( !message && typeof expected === "string" ) {
+                       message = expected;
+                       expected = null;
+               }
+
+               config.current.ignoreGlobalErrors = true;
+               try {
+                       block.call( config.current.testEnvironment );
+               } catch (e) {
+                       actual = e;
+               }
+               config.current.ignoreGlobalErrors = false;
+
+               if ( actual ) {
+
+                       // we don't want to validate thrown error
+                       if ( !expected ) {
+                               ok = true;
+                               expectedOutput = null;
+
+                       // expected is an Error object
+                       } else if ( expected instanceof Error ) {
+                               ok = actual instanceof Error &&
+                                        actual.name === expected.name &&
+                                        actual.message === expected.message;
+
+                       // expected is a regexp
+                       } else if ( QUnit.objectType( expected ) === "regexp" ) {
+                               ok = expected.test( errorString( actual ) );
+
+                       // expected is a string
+                       } else if ( QUnit.objectType( expected ) === "string" ) {
+                               ok = expected === errorString( actual );
+
+                       // expected is a constructor
+                       } else if ( actual instanceof expected ) {
+                               ok = true;
+
+                       // expected is a validation function which returns true is validation passed
+                       } else if ( expected.call( {}, actual ) === true ) {
+                               expectedOutput = null;
+                               ok = true;
+                       }
+
+                       QUnit.push( ok, actual, expectedOutput, message );
+               } else {
+                       QUnit.pushFailure( message, null, "No exception was thrown." );
+               }
+       }
+};
+
+/**
+ * @deprecated since 1.8.0
+ * Kept assertion helpers in root for backwards compatibility.
+ */
+extend( QUnit.constructor.prototype, assert );
+
+/**
+ * @deprecated since 1.9.0
+ * Kept to avoid TypeErrors for undefined methods.
+ */
+QUnit.constructor.prototype.raises = function() {
+       QUnit.push( false, false, false, "QUnit.raises has been deprecated since 2012 (fad3c1ea), use QUnit.throws instead" );
+};
+
+/**
+ * @deprecated since 1.0.0, replaced with error pushes since 1.3.0
+ * Kept to avoid TypeErrors for undefined methods.
+ */
+QUnit.constructor.prototype.equals = function() {
+       QUnit.push( false, false, false, "QUnit.equals has been deprecated since 2009 (e88049a0), use QUnit.equal instead" );
+};
+QUnit.constructor.prototype.same = function() {
+       QUnit.push( false, false, false, "QUnit.same has been deprecated since 2009 (e88049a0), use QUnit.deepEqual instead" );
+};
+
+// Test for equality any JavaScript type.
+// Author: Philippe Rathé <prathe@gmail.com>
+QUnit.equiv = (function() {
+
+       // Call the o related callback with the given arguments.
+       function bindCallbacks( o, callbacks, args ) {
+               var prop = QUnit.objectType( o );
+               if ( prop ) {
+                       if ( QUnit.objectType( callbacks[ prop ] ) === "function" ) {
+                               return callbacks[ prop ].apply( callbacks, args );
+                       } else {
+                               return callbacks[ prop ]; // or undefined
+                       }
+               }
+       }
+
+       // the real equiv function
+       var innerEquiv,
+               // stack to decide between skip/abort functions
+               callers = [],
+               // stack to avoiding loops from circular referencing
+               parents = [],
+               parentsB = [],
+
+               getProto = Object.getPrototypeOf || function ( obj ) {
+                       /*jshint camelcase:false */
+                       return obj.__proto__;
+               },
+               callbacks = (function () {
+
+                       // for string, boolean, number and null
+                       function useStrictEquality( b, a ) {
+                               /*jshint eqeqeq:false */
+                               if ( b instanceof a.constructor || a instanceof b.constructor ) {
+                                       // to catch short annotation VS 'new' annotation of a
+                                       // declaration
+                                       // e.g. var i = 1;
+                                       // var j = new Number(1);
+                                       return a == b;
+                               } else {
+                                       return a === b;
+                               }
+                       }
+
+                       return {
+                               "string": useStrictEquality,
+                               "boolean": useStrictEquality,
+                               "number": useStrictEquality,
+                               "null": useStrictEquality,
+                               "undefined": useStrictEquality,
+
+                               "nan": function( b ) {
+                                       return isNaN( b );
+                               },
+
+                               "date": function( b, a ) {
+                                       return QUnit.objectType( b ) === "date" && a.valueOf() === b.valueOf();
+                               },
+
+                               "regexp": function( b, a ) {
+                                       return QUnit.objectType( b ) === "regexp" &&
+                                               // the regex itself
+                                               a.source === b.source &&
+                                               // and its modifiers
+                                               a.global === b.global &&
+                                               // (gmi) ...
+                                               a.ignoreCase === b.ignoreCase &&
+                                               a.multiline === b.multiline &&
+                                               a.sticky === b.sticky;
+                               },
+
+                               // - skip when the property is a method of an instance (OOP)
+                               // - abort otherwise,
+                               // initial === would have catch identical references anyway
+                               "function": function() {
+                                       var caller = callers[callers.length - 1];
+                                       return caller !== Object && typeof caller !== "undefined";
+                               },
+
+                               "array": function( b, a ) {
+                                       var i, j, len, loop, aCircular, bCircular;
+
+                                       // b could be an object literal here
+                                       if ( QUnit.objectType( b ) !== "array" ) {
+                                               return false;
+                                       }
+
+                                       len = a.length;
+                                       if ( len !== b.length ) {
+                                               // safe and faster
+                                               return false;
+                                       }
+
+                                       // track reference to avoid circular references
+                                       parents.push( a );
+                                       parentsB.push( b );
+                                       for ( i = 0; i < len; i++ ) {
+                                               loop = false;
+                                               for ( j = 0; j < parents.length; j++ ) {
+                                                       aCircular = parents[j] === a[i];
+                                                       bCircular = parentsB[j] === b[i];
+                                                       if ( aCircular || bCircular ) {
+                                                               if ( a[i] === b[i] || aCircular && bCircular ) {
+                                                                       loop = true;
+                                                               } else {
+                                                                       parents.pop();
+                                                                       parentsB.pop();
+                                                                       return false;
+                                                               }
+                                                       }
+                                               }
+                                               if ( !loop && !innerEquiv(a[i], b[i]) ) {
+                                                       parents.pop();
+                                                       parentsB.pop();
+                                                       return false;
+                                               }
+                                       }
+                                       parents.pop();
+                                       parentsB.pop();
+                                       return true;
+                               },
+
+                               "object": function( b, a ) {
+                                       /*jshint forin:false */
+                                       var i, j, loop, aCircular, bCircular,
+                                               // Default to true
+                                               eq = true,
+                                               aProperties = [],
+                                               bProperties = [];
+
+                                       // comparing constructors is more strict than using
+                                       // instanceof
+                                       if ( a.constructor !== b.constructor ) {
+                                               // Allow objects with no prototype to be equivalent to
+                                               // objects with Object as their constructor.
+                                               if ( !(( getProto(a) === null && getProto(b) === Object.prototype ) ||
+                                                       ( getProto(b) === null && getProto(a) === Object.prototype ) ) ) {
+                                                               return false;
+                                               }
+                                       }
+
+                                       // stack constructor before traversing properties
+                                       callers.push( a.constructor );
+
+                                       // track reference to avoid circular references
+                                       parents.push( a );
+                                       parentsB.push( b );
+
+                                       // be strict: don't ensure hasOwnProperty and go deep
+                                       for ( i in a ) {
+                                               loop = false;
+                                               for ( j = 0; j < parents.length; j++ ) {
+                                                       aCircular = parents[j] === a[i];
+                                                       bCircular = parentsB[j] === b[i];
+                                                       if ( aCircular || bCircular ) {
+                                                               if ( a[i] === b[i] || aCircular && bCircular ) {
+                                                                       loop = true;
+                                                               } else {
+                                                                       eq = false;
+                                                                       break;
+                                                               }
+                                                       }
+                                               }
+                                               aProperties.push(i);
+                                               if ( !loop && !innerEquiv(a[i], b[i]) ) {
+                                                       eq = false;
+                                                       break;
+                                               }
+                                       }
+
+                                       parents.pop();
+                                       parentsB.pop();
+                                       callers.pop(); // unstack, we are done
+
+                                       for ( i in b ) {
+                                               bProperties.push( i ); // collect b's properties
+                                       }
+
+                                       // Ensures identical properties name
+                                       return eq && innerEquiv( aProperties.sort(), bProperties.sort() );
+                               }
+                       };
+               }());
+
+       innerEquiv = function() { // can take multiple arguments
+               var args = [].slice.apply( arguments );
+               if ( args.length < 2 ) {
+                       return true; // end transition
+               }
+
+               return (function( a, b ) {
+                       if ( a === b ) {
+                               return true; // catch the most you can
+                       } else if ( a === null || b === null || typeof a === "undefined" ||
+                                       typeof b === "undefined" ||
+                                       QUnit.objectType(a) !== QUnit.objectType(b) ) {
+                               return false; // don't lose time with error prone cases
+                       } else {
+                               return bindCallbacks(a, callbacks, [ b, a ]);
+                       }
+
+                       // apply transition with (1..n) arguments
+               }( args[0], args[1] ) && innerEquiv.apply( this, args.splice(1, args.length - 1 )) );
+       };
+
+       return innerEquiv;
+}());
+
+/**
+ * jsDump Copyright (c) 2008 Ariel Flesler - aflesler(at)gmail(dot)com |
+ * http://flesler.blogspot.com Licensed under BSD
+ * (http://www.opensource.org/licenses/bsd-license.php) Date: 5/15/2008
+ *
+ * @projectDescription Advanced and extensible data dumping for Javascript.
+ * @version 1.0.0
+ * @author Ariel Flesler
+ * @link {http://flesler.blogspot.com/2008/05/jsdump-pretty-dump-of-any-javascript.html}
+ */
+QUnit.jsDump = (function() {
+       function quote( str ) {
+               return "\"" + str.toString().replace( /"/g, "\\\"" ) + "\"";
+       }
+       function literal( o ) {
+               return o + "";
+       }
+       function join( pre, arr, post ) {
+               var s = jsDump.separator(),
+                       base = jsDump.indent(),
+                       inner = jsDump.indent(1);
+               if ( arr.join ) {
+                       arr = arr.join( "," + s + inner );
+               }
+               if ( !arr ) {
+                       return pre + post;
+               }
+               return [ pre, inner + arr, base + post ].join(s);
+       }
+       function array( arr, stack ) {
+               var i = arr.length, ret = new Array(i);
+               this.up();
+               while ( i-- ) {
+                       ret[i] = this.parse( arr[i] , undefined , stack);
+               }
+               this.down();
+               return join( "[", ret, "]" );
+       }
+
+       var reName = /^function (\w+)/,
+               jsDump = {
+                       // type is used mostly internally, you can fix a (custom)type in advance
+                       parse: function( obj, type, stack ) {
+                               stack = stack || [ ];
+                               var inStack, res,
+                                       parser = this.parsers[ type || this.typeOf(obj) ];
+
+                               type = typeof parser;
+                               inStack = inArray( obj, stack );
+
+                               if ( inStack !== -1 ) {
+                                       return "recursion(" + (inStack - stack.length) + ")";
+                               }
+                               if ( type === "function" )  {
+                                       stack.push( obj );
+                                       res = parser.call( this, obj, stack );
+                                       stack.pop();
+                                       return res;
+                               }
+                               return ( type === "string" ) ? parser : this.parsers.error;
+                       },
+                       typeOf: function( obj ) {
+                               var type;
+                               if ( obj === null ) {
+                                       type = "null";
+                               } else if ( typeof obj === "undefined" ) {
+                                       type = "undefined";
+                               } else if ( QUnit.is( "regexp", obj) ) {
+                                       type = "regexp";
+                               } else if ( QUnit.is( "date", obj) ) {
+                                       type = "date";
+                               } else if ( QUnit.is( "function", obj) ) {
+                                       type = "function";
+                               } else if ( typeof obj.setInterval !== undefined && typeof obj.document !== "undefined" && typeof obj.nodeType === "undefined" ) {
+                                       type = "window";
+                               } else if ( obj.nodeType === 9 ) {
+                                       type = "document";
+                               } else if ( obj.nodeType ) {
+                                       type = "node";
+                               } else if (
+                                       // native arrays
+                                       toString.call( obj ) === "[object Array]" ||
+                                       // NodeList objects
+                                       ( typeof obj.length === "number" && typeof obj.item !== "undefined" && ( obj.length ? obj.item(0) === obj[0] : ( obj.item( 0 ) === null && typeof obj[0] === "undefined" ) ) )
+                               ) {
+                                       type = "array";
+                               } else if ( obj.constructor === Error.prototype.constructor ) {
+                                       type = "error";
+                               } else {
+                                       type = typeof obj;
+                               }
+                               return type;
+                       },
+                       separator: function() {
+                               return this.multiline ? this.HTML ? "<br />" : "\n" : this.HTML ? "&nbsp;" : " ";
+                       },
+                       // extra can be a number, shortcut for increasing-calling-decreasing
+                       indent: function( extra ) {
+                               if ( !this.multiline ) {
+                                       return "";
+                               }
+                               var chr = this.indentChar;
+                               if ( this.HTML ) {
+                                       chr = chr.replace( /\t/g, "   " ).replace( / /g, "&nbsp;" );
+                               }
+                               return new Array( this.depth + ( extra || 0 ) ).join(chr);
+                       },
+                       up: function( a ) {
+                               this.depth += a || 1;
+                       },
+                       down: function( a ) {
+                               this.depth -= a || 1;
+                       },
+                       setParser: function( name, parser ) {
+                               this.parsers[name] = parser;
+                       },
+                       // The next 3 are exposed so you can use them
+                       quote: quote,
+                       literal: literal,
+                       join: join,
+                       //
+                       depth: 1,
+                       // This is the list of parsers, to modify them, use jsDump.setParser
+                       parsers: {
+                               window: "[Window]",
+                               document: "[Document]",
+                               error: function(error) {
+                                       return "Error(\"" + error.message + "\")";
+                               },
+                               unknown: "[Unknown]",
+                               "null": "null",
+                               "undefined": "undefined",
+                               "function": function( fn ) {
+                                       var ret = "function",
+                                               // functions never have name in IE
+                                               name = "name" in fn ? fn.name : (reName.exec(fn) || [])[1];
+
+                                       if ( name ) {
+                                               ret += " " + name;
+                                       }
+                                       ret += "( ";
+
+                                       ret = [ ret, QUnit.jsDump.parse( fn, "functionArgs" ), "){" ].join( "" );
+                                       return join( ret, QUnit.jsDump.parse(fn,"functionCode" ), "}" );
+                               },
+                               array: array,
+                               nodelist: array,
+                               "arguments": array,
+                               object: function( map, stack ) {
+                                       /*jshint forin:false */
+                                       var ret = [ ], keys, key, val, i;
+                                       QUnit.jsDump.up();
+                                       keys = [];
+                                       for ( key in map ) {
+                                               keys.push( key );
+                                       }
+                                       keys.sort();
+                                       for ( i = 0; i < keys.length; i++ ) {
+                                               key = keys[ i ];
+                                               val = map[ key ];
+                                               ret.push( QUnit.jsDump.parse( key, "key" ) + ": " + QUnit.jsDump.parse( val, undefined, stack ) );
+                                       }
+                                       QUnit.jsDump.down();
+                                       return join( "{", ret, "}" );
+                               },
+                               node: function( node ) {
+                                       var len, i, val,
+                                               open = QUnit.jsDump.HTML ? "&lt;" : "<",
+                                               close = QUnit.jsDump.HTML ? "&gt;" : ">",
+                                               tag = node.nodeName.toLowerCase(),
+                                               ret = open + tag,
+                                               attrs = node.attributes;
+
+                                       if ( attrs ) {
+                                               for ( i = 0, len = attrs.length; i < len; i++ ) {
+                                                       val = attrs[i].nodeValue;
+                                                       // IE6 includes all attributes in .attributes, even ones not explicitly set.
+                                                       // Those have values like undefined, null, 0, false, "" or "inherit".
+                                                       if ( val && val !== "inherit" ) {
+                                                               ret += " " + attrs[i].nodeName + "=" + QUnit.jsDump.parse( val, "attribute" );
+                                                       }
+                                               }
+                                       }
+                                       ret += close;
+
+                                       // Show content of TextNode or CDATASection
+                                       if ( node.nodeType === 3 || node.nodeType === 4 ) {
+                                               ret += node.nodeValue;
+                                       }
+
+                                       return ret + open + "/" + tag + close;
+                               },
+                               // function calls it internally, it's the arguments part of the function
+                               functionArgs: function( fn ) {
+                                       var args,
+                                               l = fn.length;
+
+                                       if ( !l ) {
+                                               return "";
+                                       }
+
+                                       args = new Array(l);
+                                       while ( l-- ) {
+                                               // 97 is 'a'
+                                               args[l] = String.fromCharCode(97+l);
+                                       }
+                                       return " " + args.join( ", " ) + " ";
+                               },
+                               // object calls it internally, the key part of an item in a map
+                               key: quote,
+                               // function calls it internally, it's the content of the function
+                               functionCode: "[code]",
+                               // node calls it internally, it's an html attribute value
+                               attribute: quote,
+                               string: quote,
+                               date: quote,
+                               regexp: literal,
+                               number: literal,
+                               "boolean": literal
+                       },
+                       // if true, entities are escaped ( <, >, \t, space and \n )
+                       HTML: false,
+                       // indentation unit
+                       indentChar: "  ",
+                       // if true, items in a collection, are separated by a \n, else just a space.
+                       multiline: true
+               };
+
+       return jsDump;
+}());
+
+/*
+ * Javascript Diff Algorithm
+ *  By John Resig (http://ejohn.org/)
+ *  Modified by Chu Alan "sprite"
+ *
+ * Released under the MIT license.
+ *
+ * More Info:
+ *  http://ejohn.org/projects/javascript-diff-algorithm/
+ *
+ * Usage: QUnit.diff(expected, actual)
+ *
+ * QUnit.diff( "the quick brown fox jumped over", "the quick fox jumps over" ) == "the  quick <del>brown </del> fox <del>jumped </del><ins>jumps </ins> over"
+ */
+QUnit.diff = (function() {
+       /*jshint eqeqeq:false, eqnull:true */
+       function diff( o, n ) {
+               var i,
+                       ns = {},
+                       os = {};
+
+               for ( i = 0; i < n.length; i++ ) {
+                       if ( !hasOwn.call( ns, n[i] ) ) {
+                               ns[ n[i] ] = {
+                                       rows: [],
+                                       o: null
+                               };
+                       }
+                       ns[ n[i] ].rows.push( i );
+               }
+
+               for ( i = 0; i < o.length; i++ ) {
+                       if ( !hasOwn.call( os, o[i] ) ) {
+                               os[ o[i] ] = {
+                                       rows: [],
+                                       n: null
+                               };
+                       }
+                       os[ o[i] ].rows.push( i );
+               }
+
+               for ( i in ns ) {
+                       if ( hasOwn.call( ns, i ) ) {
+                               if ( ns[i].rows.length === 1 && hasOwn.call( os, i ) && os[i].rows.length === 1 ) {
+                                       n[ ns[i].rows[0] ] = {
+                                               text: n[ ns[i].rows[0] ],
+                                               row: os[i].rows[0]
+                                       };
+                                       o[ os[i].rows[0] ] = {
+                                               text: o[ os[i].rows[0] ],
+                                               row: ns[i].rows[0]
+                                       };
+                               }
+                       }
+               }
+
+               for ( i = 0; i < n.length - 1; i++ ) {
+                       if ( n[i].text != null && n[ i + 1 ].text == null && n[i].row + 1 < o.length && o[ n[i].row + 1 ].text == null &&
+                                               n[ i + 1 ] == o[ n[i].row + 1 ] ) {
+
+                               n[ i + 1 ] = {
+                                       text: n[ i + 1 ],
+                                       row: n[i].row + 1
+                               };
+                               o[ n[i].row + 1 ] = {
+                                       text: o[ n[i].row + 1 ],
+                                       row: i + 1
+                               };
+                       }
+               }
+
+               for ( i = n.length - 1; i > 0; i-- ) {
+                       if ( n[i].text != null && n[ i - 1 ].text == null && n[i].row > 0 && o[ n[i].row - 1 ].text == null &&
+                                               n[ i - 1 ] == o[ n[i].row - 1 ]) {
+
+                               n[ i - 1 ] = {
+                                       text: n[ i - 1 ],
+                                       row: n[i].row - 1
+                               };
+                               o[ n[i].row - 1 ] = {
+                                       text: o[ n[i].row - 1 ],
+                                       row: i - 1
+                               };
+                       }
+               }
+
+               return {
+                       o: o,
+                       n: n
+               };
+       }
+
+       return function( o, n ) {
+               o = o.replace( /\s+$/, "" );
+               n = n.replace( /\s+$/, "" );
+
+               var i, pre,
+                       str = "",
+                       out = diff( o === "" ? [] : o.split(/\s+/), n === "" ? [] : n.split(/\s+/) ),
+                       oSpace = o.match(/\s+/g),
+                       nSpace = n.match(/\s+/g);
+
+               if ( oSpace == null ) {
+                       oSpace = [ " " ];
+               }
+               else {
+                       oSpace.push( " " );
+               }
+
+               if ( nSpace == null ) {
+                       nSpace = [ " " ];
+               }
+               else {
+                       nSpace.push( " " );
+               }
+
+               if ( out.n.length === 0 ) {
+                       for ( i = 0; i < out.o.length; i++ ) {
+                               str += "<del>" + out.o[i] + oSpace[i] + "</del>";
+                       }
+               }
+               else {
+                       if ( out.n[0].text == null ) {
+                               for ( n = 0; n < out.o.length && out.o[n].text == null; n++ ) {
+                                       str += "<del>" + out.o[n] + oSpace[n] + "</del>";
+                               }
+                       }
+
+                       for ( i = 0; i < out.n.length; i++ ) {
+                               if (out.n[i].text == null) {
+                                       str += "<ins>" + out.n[i] + nSpace[i] + "</ins>";
+                               }
+                               else {
+                                       // `pre` initialized at top of scope
+                                       pre = "";
+
+                                       for ( n = out.n[i].row + 1; n < out.o.length && out.o[n].text == null; n++ ) {
+                                               pre += "<del>" + out.o[n] + oSpace[n] + "</del>";
+                                       }
+                                       str += " " + out.n[i].text + nSpace[i] + pre;
+                               }
+                       }
+               }
+
+               return str;
+       };
+}());
+
+// For browser, export only select globals
+if ( typeof window !== "undefined" ) {
+       extend( window, QUnit.constructor.prototype );
+       window.QUnit = QUnit;
+}
+
+// For CommonJS environments, export everything
+if ( typeof module !== "undefined" && module.exports ) {
+       module.exports = QUnit;
+}
+
+
+// Get a reference to the global object, like window in browsers
+}( (function() {
+       return this;
+})() ));
diff --git a/resources/lib/jquery/jquery.validate.js b/resources/lib/jquery/jquery.validate.js
new file mode 100644 (file)
index 0000000..72296a6
--- /dev/null
@@ -0,0 +1,1166 @@
+/**
+ * jQuery Validation Plugin 1.8.1
+ *
+ * http://bassistance.de/jquery-plugins/jquery-plugin-validation/
+ * http://docs.jquery.com/Plugins/Validation
+ *
+ * Copyright (c) 2006 - 2011 Jörn Zaefferer
+ *
+ * Dual licensed under the MIT and GPL licenses:
+ *   http://www.opensource.org/licenses/mit-license.php
+ *   http://www.gnu.org/licenses/gpl.html
+ */
+
+(function($) {
+
+$.extend($.fn, {
+       // http://docs.jquery.com/Plugins/Validation/validate
+       validate: function( options ) {
+
+               // if nothing is selected, return nothing; can't chain anyway
+               if (!this.length) {
+                       options && options.debug && window.console && console.warn( "nothing selected, can't validate, returning nothing" );
+                       return;
+               }
+
+               // check if a validator for this form was already created
+               var validator = $.data(this[0], 'validator');
+               if ( validator ) {
+                       return validator;
+               }
+
+               validator = new $.validator( options, this[0] );
+               $.data(this[0], 'validator', validator);
+
+               if ( validator.settings.onsubmit ) {
+
+                       // allow suppresing validation by adding a cancel class to the submit button
+                       this.find("input, button").filter(".cancel").click(function() {
+                               validator.cancelSubmit = true;
+                       });
+
+                       // when a submitHandler is used, capture the submitting button
+                       if (validator.settings.submitHandler) {
+                               this.find("input, button").filter(":submit").click(function() {
+                                       validator.submitButton = this;
+                               });
+                       }
+
+                       // validate the form on submit
+                       this.submit( function( event ) {
+                               if ( validator.settings.debug )
+                                       // prevent form submit to be able to see console output
+                                       event.preventDefault();
+
+                               function handle() {
+                                       if ( validator.settings.submitHandler ) {
+                                               if (validator.submitButton) {
+                                                       // insert a hidden input as a replacement for the missing submit button
+                                                       var hidden = $("<input type='hidden'/>").attr("name", validator.submitButton.name).val(validator.submitButton.value).appendTo(validator.currentForm);
+                                               }
+                                               validator.settings.submitHandler.call( validator, validator.currentForm );
+                                               if (validator.submitButton) {
+                                                       // and clean up afterwards; thanks to no-block-scope, hidden can be referenced
+                                                       hidden.remove();
+                                               }
+                                               return false;
+                                       }
+                                       return true;
+                               }
+
+                               // prevent submit for invalid forms or custom submit handlers
+                               if ( validator.cancelSubmit ) {
+                                       validator.cancelSubmit = false;
+                                       return handle();
+                               }
+                               if ( validator.form() ) {
+                                       if ( validator.pendingRequest ) {
+                                               validator.formSubmitted = true;
+                                               return false;
+                                       }
+                                       return handle();
+                               } else {
+                                       validator.focusInvalid();
+                                       return false;
+                               }
+                       });
+               }
+
+               return validator;
+       },
+       // http://docs.jquery.com/Plugins/Validation/valid
+       valid: function() {
+        if ( $(this[0]).is('form')) {
+            return this.validate().form();
+        } else {
+            var valid = true;
+            var validator = $(this[0].form).validate();
+            this.each(function() {
+                               valid &= validator.element(this);
+            });
+            return valid;
+        }
+    },
+       // attributes: space seperated list of attributes to retrieve and remove
+       removeAttrs: function(attributes) {
+               var result = {},
+                       $element = this;
+               $.each(attributes.split(/\s/), function(index, value) {
+                       result[value] = $element.attr(value);
+                       $element.removeAttr(value);
+               });
+               return result;
+       },
+       // http://docs.jquery.com/Plugins/Validation/rules
+       rules: function(command, argument) {
+               var element = this[0];
+
+               if (command) {
+                       var settings = $.data(element.form, 'validator').settings;
+                       var staticRules = settings.rules;
+                       var existingRules = $.validator.staticRules(element);
+                       switch(command) {
+                       case "add":
+                               $.extend(existingRules, $.validator.normalizeRule(argument));
+                               staticRules[element.name] = existingRules;
+                               if (argument.messages)
+                                       settings.messages[element.name] = $.extend( settings.messages[element.name], argument.messages );
+                               break;
+                       case "remove":
+                               if (!argument) {
+                                       delete staticRules[element.name];
+                                       return existingRules;
+                               }
+                               var filtered = {};
+                               $.each(argument.split(/\s/), function(index, method) {
+                                       filtered[method] = existingRules[method];
+                                       delete existingRules[method];
+                               });
+                               return filtered;
+                       }
+               }
+
+               var data = $.validator.normalizeRules(
+               $.extend(
+                       {},
+                       $.validator.metadataRules(element),
+                       $.validator.classRules(element),
+                       $.validator.attributeRules(element),
+                       $.validator.staticRules(element)
+               ), element);
+
+               // make sure required is at front
+               if (data.required) {
+                       var param = data.required;
+                       delete data.required;
+                       data = $.extend({required: param}, data);
+               }
+
+               return data;
+       }
+});
+
+// Custom selectors
+$.extend($.expr[":"], {
+       // http://docs.jquery.com/Plugins/Validation/blank
+       blank: function(a) {return !$.trim("" + a.value);},
+       // http://docs.jquery.com/Plugins/Validation/filled
+       filled: function(a) {return !!$.trim("" + a.value);},
+       // http://docs.jquery.com/Plugins/Validation/unchecked
+       unchecked: function(a) {return !a.checked;}
+});
+
+// constructor for validator
+$.validator = function( options, form ) {
+       this.settings = $.extend( true, {}, $.validator.defaults, options );
+       this.currentForm = form;
+       this.init();
+};
+
+$.validator.format = function(source, params) {
+       if ( arguments.length == 1 )
+               return function() {
+                       var args = $.makeArray(arguments);
+                       args.unshift(source);
+                       return $.validator.format.apply( this, args );
+               };
+       if ( arguments.length > 2 && params.constructor != Array  ) {
+               params = $.makeArray(arguments).slice(1);
+       }
+       if ( params.constructor != Array ) {
+               params = [ params ];
+       }
+       $.each(params, function(i, n) {
+               source = source.replace(new RegExp("\\{" + i + "\\}", "g"), n);
+       });
+       return source;
+};
+
+$.extend($.validator, {
+
+       defaults: {
+               messages: {},
+               groups: {},
+               rules: {},
+               errorClass: "error",
+               validClass: "valid",
+               errorElement: "label",
+               focusInvalid: true,
+               errorContainer: $( [] ),
+               errorLabelContainer: $( [] ),
+               onsubmit: true,
+               ignore: [],
+               ignoreTitle: false,
+               onfocusin: function(element) {
+                       this.lastActive = element;
+
+                       // hide error label and remove error class on focus if enabled
+                       if ( this.settings.focusCleanup && !this.blockFocusCleanup ) {
+                               this.settings.unhighlight && this.settings.unhighlight.call( this, element, this.settings.errorClass, this.settings.validClass );
+                               this.addWrapper(this.errorsFor(element)).hide();
+                       }
+               },
+               onfocusout: function(element) {
+                       if ( !this.checkable(element) && (element.name in this.submitted || !this.optional(element)) ) {
+                               this.element(element);
+                       }
+               },
+               onkeyup: function(element) {
+                       if ( element.name in this.submitted || element == this.lastElement ) {
+                               this.element(element);
+                       }
+               },
+               onclick: function(element) {
+                       // click on selects, radiobuttons and checkboxes
+                       if ( element.name in this.submitted )
+                               this.element(element);
+                       // or option elements, check parent select in that case
+                       else if (element.parentNode.name in this.submitted)
+                               this.element(element.parentNode);
+               },
+               highlight: function(element, errorClass, validClass) {
+                       if (element.type === 'radio') {
+                               this.findByName(element.name).addClass(errorClass).removeClass(validClass);
+                       } else {
+                               $(element).addClass(errorClass).removeClass(validClass);
+                       }
+               },
+               unhighlight: function(element, errorClass, validClass) {
+                       if (element.type === 'radio') {
+                               this.findByName(element.name).removeClass(errorClass).addClass(validClass);
+                       } else {
+                               $(element).removeClass(errorClass).addClass(validClass);
+                       }
+               }
+       },
+
+       // http://docs.jquery.com/Plugins/Validation/Validator/setDefaults
+       setDefaults: function(settings) {
+               $.extend( $.validator.defaults, settings );
+       },
+
+       messages: {
+               required: "This field is required.",
+               remote: "Please fix this field.",
+               email: "Please enter a valid email address.",
+               url: "Please enter a valid URL.",
+               date: "Please enter a valid date.",
+               dateISO: "Please enter a valid date (ISO).",
+               number: "Please enter a valid number.",
+               digits: "Please enter only digits.",
+               creditcard: "Please enter a valid credit card number.",
+               equalTo: "Please enter the same value again.",
+               accept: "Please enter a value with a valid extension.",
+               maxlength: $.validator.format("Please enter no more than {0} characters."),
+               minlength: $.validator.format("Please enter at least {0} characters."),
+               rangelength: $.validator.format("Please enter a value between {0} and {1} characters long."),
+               range: $.validator.format("Please enter a value between {0} and {1}."),
+               max: $.validator.format("Please enter a value less than or equal to {0}."),
+               min: $.validator.format("Please enter a value greater than or equal to {0}.")
+       },
+
+       autoCreateRanges: false,
+
+       prototype: {
+
+               init: function() {
+                       this.labelContainer = $(this.settings.errorLabelContainer);
+                       this.errorContext = this.labelContainer.length && this.labelContainer || $(this.currentForm);
+                       this.containers = $(this.settings.errorContainer).add( this.settings.errorLabelContainer );
+                       this.submitted = {};
+                       this.valueCache = {};
+                       this.pendingRequest = 0;
+                       this.pending = {};
+                       this.invalid = {};
+                       this.reset();
+
+                       var groups = (this.groups = {});
+                       $.each(this.settings.groups, function(key, value) {
+                               $.each(value.split(/\s/), function(index, name) {
+                                       groups[name] = key;
+                               });
+                       });
+                       var rules = this.settings.rules;
+                       $.each(rules, function(key, value) {
+                               rules[key] = $.validator.normalizeRule(value);
+                       });
+
+                       function delegate(event) {
+                               var validator = $.data(this[0].form, "validator"),
+                                       eventType = "on" + event.type.replace(/^validate/, "");
+                               validator.settings[eventType] && validator.settings[eventType].call(validator, this[0] );
+                       }
+                       $(this.currentForm)
+                               .validateDelegate(":text, :password, :file, select, textarea", "focusin focusout keyup", delegate)
+                               .validateDelegate(":radio, :checkbox, select, option", "click", delegate);
+
+                       if (this.settings.invalidHandler)
+                               $(this.currentForm).bind("invalid-form.validate", this.settings.invalidHandler);
+               },
+
+               // http://docs.jquery.com/Plugins/Validation/Validator/form
+               form: function() {
+                       this.checkForm();
+                       $.extend(this.submitted, this.errorMap);
+                       this.invalid = $.extend({}, this.errorMap);
+                       if (!this.valid())
+                               $(this.currentForm).triggerHandler("invalid-form", [this]);
+                       this.showErrors();
+                       return this.valid();
+               },
+
+               checkForm: function() {
+                       this.prepareForm();
+                       for ( var i = 0, elements = (this.currentElements = this.elements()); elements[i]; i++ ) {
+                               this.check( elements[i] );
+                       }
+                       return this.valid();
+               },
+
+               // http://docs.jquery.com/Plugins/Validation/Validator/element
+               element: function( element ) {
+                       element = this.clean( element );
+                       this.lastElement = element;
+                       this.prepareElement( element );
+                       this.currentElements = $(element);
+                       var result = this.check( element );
+                       if ( result ) {
+                               delete this.invalid[element.name];
+                       } else {
+                               this.invalid[element.name] = true;
+                       }
+                       if ( !this.numberOfInvalids() ) {
+                               // Hide error containers on last error
+                               this.toHide = this.toHide.add( this.containers );
+                       }
+                       this.showErrors();
+                       return result;
+               },
+
+               // http://docs.jquery.com/Plugins/Validation/Validator/showErrors
+               showErrors: function(errors) {
+                       if(errors) {
+                               // add items to error list and map
+                               $.extend( this.errorMap, errors );
+                               this.errorList = [];
+                               for ( var name in errors ) {
+                                       this.errorList.push({
+                                               message: errors[name],
+                                               element: this.findByName(name)[0]
+                                       });
+                               }
+                               // remove items from success list
+                               this.successList = $.grep( this.successList, function(element) {
+                                       return !(element.name in errors);
+                               });
+                       }
+                       this.settings.showErrors
+                               ? this.settings.showErrors.call( this, this.errorMap, this.errorList )
+                               : this.defaultShowErrors();
+               },
+
+               // http://docs.jquery.com/Plugins/Validation/Validator/resetForm
+               resetForm: function() {
+                       if ( $.fn.resetForm )
+                               $( this.currentForm ).resetForm();
+                       this.submitted = {};
+                       this.prepareForm();
+                       this.hideErrors();
+                       this.elements().removeClass( this.settings.errorClass );
+               },
+
+               numberOfInvalids: function() {
+                       return this.objectLength(this.invalid);
+               },
+
+               objectLength: function( obj ) {
+                       var count = 0;
+                       for ( var i in obj )
+                               count++;
+                       return count;
+               },
+
+               hideErrors: function() {
+                       this.addWrapper( this.toHide ).hide();
+               },
+
+               valid: function() {
+                       return this.size() == 0;
+               },
+
+               size: function() {
+                       return this.errorList.length;
+               },
+
+               focusInvalid: function() {
+                       if( this.settings.focusInvalid ) {
+                               try {
+                                       $(this.findLastActive() || this.errorList.length && this.errorList[0].element || [])
+                                       .filter(":visible")
+                                       .focus()
+                                       // manually trigger focusin event; without it, focusin handler isn't called, findLastActive won't have anything to find
+                                       .trigger("focusin");
+                               } catch(e) {
+                                       // ignore IE throwing errors when focusing hidden elements
+                               }
+                       }
+               },
+
+               findLastActive: function() {
+                       var lastActive = this.lastActive;
+                       return lastActive && $.grep(this.errorList, function(n) {
+                               return n.element.name == lastActive.name;
+                       }).length == 1 && lastActive;
+               },
+
+               elements: function() {
+                       var validator = this,
+                               rulesCache = {};
+
+                       // select all valid inputs inside the form (no submit or reset buttons)
+                       return $(this.currentForm)
+                       .find("input, select, textarea")
+                       .not(":submit, :reset, :image, [disabled]")
+                       .not( this.settings.ignore )
+                       .filter(function() {
+                               !this.name && validator.settings.debug && window.console && console.error( "%o has no name assigned", this);
+
+                               // select only the first element for each name, and only those with rules specified
+                               if ( this.name in rulesCache || !validator.objectLength($(this).rules()) )
+                                       return false;
+
+                               rulesCache[this.name] = true;
+                               return true;
+                       });
+               },
+
+               clean: function( selector ) {
+                       return $( selector )[0];
+               },
+
+               errors: function() {
+                       return $( this.settings.errorElement + "." + this.settings.errorClass, this.errorContext );
+               },
+
+               reset: function() {
+                       this.successList = [];
+                       this.errorList = [];
+                       this.errorMap = {};
+                       this.toShow = $([]);
+                       this.toHide = $([]);
+                       this.currentElements = $([]);
+               },
+
+               prepareForm: function() {
+                       this.reset();
+                       this.toHide = this.errors().add( this.containers );
+               },
+
+               prepareElement: function( element ) {
+                       this.reset();
+                       this.toHide = this.errorsFor(element);
+               },
+
+               check: function( element ) {
+                       element = this.clean( element );
+
+                       // if radio/checkbox, validate first element in group instead
+                       if (this.checkable(element)) {
+                               element = this.findByName( element.name ).not(this.settings.ignore)[0];
+                       }
+
+                       var rules = $(element).rules();
+                       var dependencyMismatch = false;
+                       for (var method in rules ) {
+                               var rule = { method: method, parameters: rules[method] };
+                               try {
+                                       var result = $.validator.methods[method].call( this, element.value.replace(/\r/g, ""), element, rule.parameters );
+
+                                       // if a method indicates that the field is optional and therefore valid,
+                                       // don't mark it as valid when there are no other rules
+                                       if ( result == "dependency-mismatch" ) {
+                                               dependencyMismatch = true;
+                                               continue;
+                                       }
+                                       dependencyMismatch = false;
+
+                                       if ( result == "pending" ) {
+                                               this.toHide = this.toHide.not( this.errorsFor(element) );
+                                               return;
+                                       }
+
+                                       if( !result ) {
+                                               this.formatAndAdd( element, rule );
+                                               return false;
+                                       }
+                               } catch(e) {
+                                       this.settings.debug && window.console && console.log("exception occured when checking element " + element.id
+                                                + ", check the '" + rule.method + "' method", e);
+                                       throw e;
+                               }
+                       }
+                       if (dependencyMismatch)
+                               return;
+                       if ( this.objectLength(rules) )
+                               this.successList.push(element);
+                       return true;
+               },
+
+               // return the custom message for the given element and validation method
+               // specified in the element's "messages" metadata
+               customMetaMessage: function(element, method) {
+                       if (!$.metadata)
+                               return;
+
+                       var meta = this.settings.meta
+                               ? $(element).metadata()[this.settings.meta]
+                               : $(element).metadata();
+
+                       return meta && meta.messages && meta.messages[method];
+               },
+
+               // return the custom message for the given element name and validation method
+               customMessage: function( name, method ) {
+                       var m = this.settings.messages[name];
+                       return m && (m.constructor == String
+                               ? m
+                               : m[method]);
+               },
+
+               // return the first defined argument, allowing empty strings
+               findDefined: function() {
+                       for(var i = 0; i < arguments.length; i++) {
+                               if (arguments[i] !== undefined)
+                                       return arguments[i];
+                       }
+                       return undefined;
+               },
+
+               defaultMessage: function( element, method) {
+                       return this.findDefined(
+                               this.customMessage( element.name, method ),
+                               this.customMetaMessage( element, method ),
+                               // title is never undefined, so handle empty string as undefined
+                               !this.settings.ignoreTitle && element.title || undefined,
+                               $.validator.messages[method],
+                               "<strong>Warning: No message defined for " + element.name + "</strong>"
+                       );
+               },
+
+               formatAndAdd: function( element, rule ) {
+                       var message = this.defaultMessage( element, rule.method ),
+                               theregex = /\$?\{(\d+)\}/g;
+                       if ( typeof message == "function" ) {
+                               message = message.call(this, rule.parameters, element);
+                       } else if (theregex.test(message)) {
+                               message = jQuery.format(message.replace(theregex, '{$1}'), rule.parameters);
+                       }
+                       this.errorList.push({
+                               message: message,
+                               element: element
+                       });
+
+                       this.errorMap[element.name] = message;
+                       this.submitted[element.name] = message;
+               },
+
+               addWrapper: function(toToggle) {
+                       if ( this.settings.wrapper )
+                               toToggle = toToggle.add( toToggle.parent( this.settings.wrapper ) );
+                       return toToggle;
+               },
+
+               defaultShowErrors: function() {
+                       for ( var i = 0; this.errorList[i]; i++ ) {
+                               var error = this.errorList[i];
+                               this.settings.highlight && this.settings.highlight.call( this, error.element, this.settings.errorClass, this.settings.validClass );
+                               this.showLabel( error.element, error.message );
+                       }
+                       if( this.errorList.length ) {
+                               this.toShow = this.toShow.add( this.containers );
+                       }
+                       if (this.settings.success) {
+                               for ( var i = 0; this.successList[i]; i++ ) {
+                                       this.showLabel( this.successList[i] );
+                               }
+                       }
+                       if (this.settings.unhighlight) {
+                               for ( var i = 0, elements = this.validElements(); elements[i]; i++ ) {
+                                       this.settings.unhighlight.call( this, elements[i], this.settings.errorClass, this.settings.validClass );
+                               }
+                       }
+                       this.toHide = this.toHide.not( this.toShow );
+                       this.hideErrors();
+                       this.addWrapper( this.toShow ).show();
+               },
+
+               validElements: function() {
+                       return this.currentElements.not(this.invalidElements());
+               },
+
+               invalidElements: function() {
+                       return $(this.errorList).map(function() {
+                               return this.element;
+                       });
+               },
+
+               showLabel: function(element, message) {
+                       var label = this.errorsFor( element );
+                       if ( label.length ) {
+                               // refresh error/success class
+                               label.removeClass().addClass( this.settings.errorClass );
+
+                               // check if we have a generated label, replace the message then
+                               label.attr("generated") && label.html(message);
+                       } else {
+                               // create label
+                               label = $("<" + this.settings.errorElement + "/>")
+                                       .attr({"for":  this.idOrName(element), generated: true})
+                                       .addClass(this.settings.errorClass)
+                                       .html(message || "");
+                               if ( this.settings.wrapper ) {
+                                       // make sure the element is visible, even in IE
+                                       // actually showing the wrapped element is handled elsewhere
+                                       label = label.hide().show().wrap("<" + this.settings.wrapper + "/>").parent();
+                               }
+                               if ( !this.labelContainer.append(label).length )
+                                       this.settings.errorPlacement
+                                               ? this.settings.errorPlacement(label, $(element) )
+                                               : label.insertAfter(element);
+                       }
+                       if ( !message && this.settings.success ) {
+                               label.text("");
+                               typeof this.settings.success == "string"
+                                       ? label.addClass( this.settings.success )
+                                       : this.settings.success( label );
+                       }
+                       this.toShow = this.toShow.add(label);
+               },
+
+               errorsFor: function(element) {
+                       var name = this.idOrName(element);
+               return this.errors().filter(function() {
+                               return $(this).attr('for') == name;
+                       });
+               },
+
+               idOrName: function(element) {
+                       return this.groups[element.name] || (this.checkable(element) ? element.name : element.id || element.name);
+               },
+
+               checkable: function( element ) {
+                       return /radio|checkbox/i.test(element.type);
+               },
+
+               findByName: function( name ) {
+                       // select by name and filter by form for performance over form.find("[name=...]")
+                       var form = this.currentForm;
+                       return $(document.getElementsByName(name)).map(function(index, element) {
+                               return element.form == form && element.name == name && element  || null;
+                       });
+               },
+
+               getLength: function(value, element) {
+                       switch( element.nodeName.toLowerCase() ) {
+                       case 'select':
+                               return $("option:selected", element).length;
+                       case 'input':
+                               if( this.checkable( element) )
+                                       return this.findByName(element.name).filter(':checked').length;
+                       }
+                       return value.length;
+               },
+
+               depend: function(param, element) {
+                       return this.dependTypes[typeof param]
+                               ? this.dependTypes[typeof param](param, element)
+                               : true;
+               },
+
+               dependTypes: {
+                       "boolean": function(param, element) {
+                               return param;
+                       },
+                       "string": function(param, element) {
+                               return !!$(param, element.form).length;
+                       },
+                       "function": function(param, element) {
+                               return param(element);
+                       }
+               },
+
+               optional: function(element) {
+                       return !$.validator.methods.required.call(this, $.trim(element.value), element) && "dependency-mismatch";
+               },
+
+               startRequest: function(element) {
+                       if (!this.pending[element.name]) {
+                               this.pendingRequest++;
+                               this.pending[element.name] = true;
+                       }
+               },
+
+               stopRequest: function(element, valid) {
+                       this.pendingRequest--;
+                       // sometimes synchronization fails, make sure pendingRequest is never < 0
+                       if (this.pendingRequest < 0)
+                               this.pendingRequest = 0;
+                       delete this.pending[element.name];
+                       if ( valid && this.pendingRequest == 0 && this.formSubmitted && this.form() ) {
+                               $(this.currentForm).submit();
+                               this.formSubmitted = false;
+                       } else if (!valid && this.pendingRequest == 0 && this.formSubmitted) {
+                               $(this.currentForm).triggerHandler("invalid-form", [this]);
+                               this.formSubmitted = false;
+                       }
+               },
+
+               previousValue: function(element) {
+                       return $.data(element, "previousValue") || $.data(element, "previousValue", {
+                               old: null,
+                               valid: true,
+                               message: this.defaultMessage( element, "remote" )
+                       });
+               }
+
+       },
+
+       classRuleSettings: {
+               required: {required: true},
+               email: {email: true},
+               url: {url: true},
+               date: {date: true},
+               dateISO: {dateISO: true},
+               dateDE: {dateDE: true},
+               number: {number: true},
+               numberDE: {numberDE: true},
+               digits: {digits: true},
+               creditcard: {creditcard: true}
+       },
+
+       addClassRules: function(className, rules) {
+               className.constructor == String ?
+                       this.classRuleSettings[className] = rules :
+                       $.extend(this.classRuleSettings, className);
+       },
+
+       classRules: function(element) {
+               var rules = {};
+               var classes = $(element).attr('class');
+               classes && $.each(classes.split(' '), function() {
+                       if (this in $.validator.classRuleSettings) {
+                               $.extend(rules, $.validator.classRuleSettings[this]);
+                       }
+               });
+               return rules;
+       },
+
+       attributeRules: function(element) {
+               var rules = {};
+               var $element = $(element);
+
+               for (var method in $.validator.methods) {
+                       var value = $element.attr(method);
+                       if (value) {
+                               rules[method] = value;
+                       }
+               }
+
+               // maxlength may be returned as -1, 2147483647 (IE) and 524288 (safari) for text inputs
+               if (rules.maxlength && /-1|2147483647|524288/.test(rules.maxlength)) {
+                       delete rules.maxlength;
+               }
+
+               return rules;
+       },
+
+       metadataRules: function(element) {
+               if (!$.metadata) return {};
+
+               var meta = $.data(element.form, 'validator').settings.meta;
+               return meta ?
+                       $(element).metadata()[meta] :
+                       $(element).metadata();
+       },
+
+       staticRules: function(element) {
+               var rules = {};
+               var validator = $.data(element.form, 'validator');
+               if (validator.settings.rules) {
+                       rules = $.validator.normalizeRule(validator.settings.rules[element.name]) || {};
+               }
+               return rules;
+       },
+
+       normalizeRules: function(rules, element) {
+               // handle dependency check
+               $.each(rules, function(prop, val) {
+                       // ignore rule when param is explicitly false, eg. required:false
+                       if (val === false) {
+                               delete rules[prop];
+                               return;
+                       }
+                       if (val.param || val.depends) {
+                               var keepRule = true;
+                               switch (typeof val.depends) {
+                                       case "string":
+                                               keepRule = !!$(val.depends, element.form).length;
+                                               break;
+                                       case "function":
+                                               keepRule = val.depends.call(element, element);
+                                               break;
+                               }
+                               if (keepRule) {
+                                       rules[prop] = val.param !== undefined ? val.param : true;
+                               } else {
+                                       delete rules[prop];
+                               }
+                       }
+               });
+
+               // evaluate parameters
+               $.each(rules, function(rule, parameter) {
+                       rules[rule] = $.isFunction(parameter) ? parameter(element) : parameter;
+               });
+
+               // clean number parameters
+               $.each(['minlength', 'maxlength', 'min', 'max'], function() {
+                       if (rules[this]) {
+                               rules[this] = Number(rules[this]);
+                       }
+               });
+               $.each(['rangelength', 'range'], function() {
+                       if (rules[this]) {
+                               rules[this] = [Number(rules[this][0]), Number(rules[this][1])];
+                       }
+               });
+
+               if ($.validator.autoCreateRanges) {
+                       // auto-create ranges
+                       if (rules.min && rules.max) {
+                               rules.range = [rules.min, rules.max];
+                               delete rules.min;
+                               delete rules.max;
+                       }
+                       if (rules.minlength && rules.maxlength) {
+                               rules.rangelength = [rules.minlength, rules.maxlength];
+                               delete rules.minlength;
+                               delete rules.maxlength;
+                       }
+               }
+
+               // To support custom messages in metadata ignore rule methods titled "messages"
+               if (rules.messages) {
+                       delete rules.messages;
+               }
+
+               return rules;
+       },
+
+       // Converts a simple string to a {string: true} rule, e.g., "required" to {required:true}
+       normalizeRule: function(data) {
+               if( typeof data == "string" ) {
+                       var transformed = {};
+                       $.each(data.split(/\s/), function() {
+                               transformed[this] = true;
+                       });
+                       data = transformed;
+               }
+               return data;
+       },
+
+       // http://docs.jquery.com/Plugins/Validation/Validator/addMethod
+       addMethod: function(name, method, message) {
+               $.validator.methods[name] = method;
+               $.validator.messages[name] = message != undefined ? message : $.validator.messages[name];
+               if (method.length < 3) {
+                       $.validator.addClassRules(name, $.validator.normalizeRule(name));
+               }
+       },
+
+       methods: {
+
+               // http://docs.jquery.com/Plugins/Validation/Methods/required
+               required: function(value, element, param) {
+                       // check if dependency is met
+                       if ( !this.depend(param, element) )
+                               return "dependency-mismatch";
+                       switch( element.nodeName.toLowerCase() ) {
+                       case 'select':
+                               // could be an array for select-multiple or a string, both are fine this way
+                               var val = $(element).val();
+                               return val && val.length > 0;
+                       case 'input':
+                               if ( this.checkable(element) )
+                                       return this.getLength(value, element) > 0;
+                       default:
+                               return $.trim(value).length > 0;
+                       }
+               },
+
+               // http://docs.jquery.com/Plugins/Validation/Methods/remote
+               remote: function(value, element, param) {
+                       if ( this.optional(element) )
+                               return "dependency-mismatch";
+
+                       var previous = this.previousValue(element);
+                       if (!this.settings.messages[element.name] )
+                               this.settings.messages[element.name] = {};
+                       previous.originalMessage = this.settings.messages[element.name].remote;
+                       this.settings.messages[element.name].remote = previous.message;
+
+                       param = typeof param == "string" && {url:param} || param;
+
+                       if ( this.pending[element.name] ) {
+                               return "pending";
+                       }
+                       if ( previous.old === value ) {
+                               return previous.valid;
+                       }
+
+                       previous.old = value;
+                       var validator = this;
+                       this.startRequest(element);
+                       var data = {};
+                       data[element.name] = value;
+                       $.ajax($.extend(true, {
+                               url: param,
+                               mode: "abort",
+                               port: "validate" + element.name,
+                               dataType: "json",
+                               data: data,
+                               success: function(response) {
+                                       validator.settings.messages[element.name].remote = previous.originalMessage;
+                                       var valid = response === true;
+                                       if ( valid ) {
+                                               var submitted = validator.formSubmitted;
+                                               validator.prepareElement(element);
+                                               validator.formSubmitted = submitted;
+                                               validator.successList.push(element);
+                                               validator.showErrors();
+                                       } else {
+                                               var errors = {};
+                                               var message = response || validator.defaultMessage( element, "remote" );
+                                               errors[element.name] = previous.message = $.isFunction(message) ? message(value) : message;
+                                               validator.showErrors(errors);
+                                       }
+                                       previous.valid = valid;
+                                       validator.stopRequest(element, valid);
+                               }
+                       }, param));
+                       return "pending";
+               },
+
+               // http://docs.jquery.com/Plugins/Validation/Methods/minlength
+               minlength: function(value, element, param) {
+                       return this.optional(element) || this.getLength($.trim(value), element) >= param;
+               },
+
+               // http://docs.jquery.com/Plugins/Validation/Methods/maxlength
+               maxlength: function(value, element, param) {
+                       return this.optional(element) || this.getLength($.trim(value), element) <= param;
+               },
+
+               // http://docs.jquery.com/Plugins/Validation/Methods/rangelength
+               rangelength: function(value, element, param) {
+                       var length = this.getLength($.trim(value), element);
+                       return this.optional(element) || ( length >= param[0] && length <= param[1] );
+               },
+
+               // http://docs.jquery.com/Plugins/Validation/Methods/min
+               min: function( value, element, param ) {
+                       return this.optional(element) || value >= param;
+               },
+
+               // http://docs.jquery.com/Plugins/Validation/Methods/max
+               max: function( value, element, param ) {
+                       return this.optional(element) || value <= param;
+               },
+
+               // http://docs.jquery.com/Plugins/Validation/Methods/range
+               range: function( value, element, param ) {
+                       return this.optional(element) || ( value >= param[0] && value <= param[1] );
+               },
+
+               // http://docs.jquery.com/Plugins/Validation/Methods/email
+               email: function(value, element) {
+                       // contributed by Scott Gonzalez: http://projects.scottsplayground.com/email_address_validation/
+                       return this.optional(element) || /^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?$/i.test(value);
+               },
+
+               // http://docs.jquery.com/Plugins/Validation/Methods/url
+               url: function(value, element) {
+                       // contributed by Scott Gonzalez: http://projects.scottsplayground.com/iri/
+                       return this.optional(element) || /^(https?|ftp):\/\/(((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:)*@)?(((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5]))|((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?)(:\d*)?)(\/((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)+(\/(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*)?)?(\?((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|[\uE000-\uF8FF]|\/|\?)*)?(\#((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|\/|\?)*)?$/i.test(value);
+               },
+
+               // http://docs.jquery.com/Plugins/Validation/Methods/date
+               date: function(value, element) {
+                       return this.optional(element) || !/Invalid|NaN/.test(new Date(value));
+               },
+
+               // http://docs.jquery.com/Plugins/Validation/Methods/dateISO
+               dateISO: function(value, element) {
+                       return this.optional(element) || /^\d{4}[\/-]\d{1,2}[\/-]\d{1,2}$/.test(value);
+               },
+
+               // http://docs.jquery.com/Plugins/Validation/Methods/number
+               number: function(value, element) {
+                       return this.optional(element) || /^-?(?:\d+|\d{1,3}(?:,\d{3})+)(?:\.\d+)?$/.test(value);
+               },
+
+               // http://docs.jquery.com/Plugins/Validation/Methods/digits
+               digits: function(value, element) {
+                       return this.optional(element) || /^\d+$/.test(value);
+               },
+
+               // http://docs.jquery.com/Plugins/Validation/Methods/creditcard
+               // based on http://en.wikipedia.org/wiki/Luhn
+               creditcard: function(value, element) {
+                       if ( this.optional(element) )
+                               return "dependency-mismatch";
+                       // accept only digits and dashes
+                       if (/[^0-9-]+/.test(value))
+                               return false;
+                       var nCheck = 0,
+                               nDigit = 0,
+                               bEven = false;
+
+                       value = value.replace(/\D/g, "");
+
+                       for (var n = value.length - 1; n >= 0; n--) {
+                               var cDigit = value.charAt(n);
+                               var nDigit = parseInt(cDigit, 10);
+                               if (bEven) {
+                                       if ((nDigit *= 2) > 9)
+                                               nDigit -= 9;
+                               }
+                               nCheck += nDigit;
+                               bEven = !bEven;
+                       }
+
+                       return (nCheck % 10) == 0;
+               },
+
+               // http://docs.jquery.com/Plugins/Validation/Methods/accept
+               accept: function(value, element, param) {
+                       param = typeof param == "string" ? param.replace(/,/g, '|') : "png|jpe?g|gif";
+                       return this.optional(element) || value.match(new RegExp(".(" + param + ")$", "i"));
+               },
+
+               // http://docs.jquery.com/Plugins/Validation/Methods/equalTo
+               equalTo: function(value, element, param) {
+                       // bind to the blur event of the target in order to revalidate whenever the target field is updated
+                       // TODO find a way to bind the event just once, avoiding the unbind-rebind overhead
+                       var target = $(param).unbind(".validate-equalTo").bind("blur.validate-equalTo", function() {
+                               $(element).valid();
+                       });
+                       return value == target.val();
+               }
+
+       }
+
+});
+
+// deprecated, use $.validator.format instead
+$.format = $.validator.format;
+
+})(jQuery);
+
+// ajax mode: abort
+// usage: $.ajax({ mode: "abort"[, port: "uniqueport"]});
+// if mode:"abort" is used, the previous request on that port (port can be undefined) is aborted via XMLHttpRequest.abort()
+;(function($) {
+       var pendingRequests = {};
+       // Use a prefilter if available (1.5+)
+       if ( $.ajaxPrefilter ) {
+               $.ajaxPrefilter(function(settings, _, xhr) {
+                       var port = settings.port;
+                       if (settings.mode == "abort") {
+                               if ( pendingRequests[port] ) {
+                                       pendingRequests[port].abort();
+                               }
+                               pendingRequests[port] = xhr;
+                       }
+               });
+       } else {
+               // Proxy ajax
+               var ajax = $.ajax;
+               $.ajax = function(settings) {
+                       var mode = ( "mode" in settings ? settings : $.ajaxSettings ).mode,
+                               port = ( "port" in settings ? settings : $.ajaxSettings ).port;
+                       if (mode == "abort") {
+                               if ( pendingRequests[port] ) {
+                                       pendingRequests[port].abort();
+                               }
+                               return (pendingRequests[port] = ajax.apply(this, arguments));
+                       }
+                       return ajax.apply(this, arguments);
+               };
+       }
+})(jQuery);
+
+// provides cross-browser focusin and focusout events
+// IE has native support, in other browsers, use event caputuring (neither bubbles)
+
+// provides delegate(type: String, delegate: Selector, handler: Callback) plugin for easier event delegation
+// handler is only called when $(event.target).is(delegate), in the scope of the jquery-object for event.target
+;(function($) {
+       // only implement if not provided by jQuery core (since 1.4)
+       // TODO verify if jQuery 1.4's implementation is compatible with older jQuery special-event APIs
+       if (!jQuery.event.special.focusin && !jQuery.event.special.focusout && document.addEventListener) {
+               $.each({
+                       focus: 'focusin',
+                       blur: 'focusout'
+               }, function( original, fix ){
+                       $.event.special[fix] = {
+                               setup:function() {
+                                       this.addEventListener( original, handler, true );
+                               },
+                               teardown:function() {
+                                       this.removeEventListener( original, handler, true );
+                               },
+                               handler: function(e) {
+                                       arguments[0] = $.event.fix(e);
+                                       arguments[0].type = fix;
+                                       return $.event.handle.apply(this, arguments);
+                               }
+                       };
+                       function handler(e) {
+                               e = $.event.fix(e);
+                               e.type = fix;
+                               return $.event.handle.call(this, e);
+                       }
+               });
+       };
+       $.extend($.fn, {
+               validateDelegate: function(delegate, type, handler) {
+                       return this.bind(type, function(event) {
+                               var target = $(event.target);
+                               if (target.is(delegate)) {
+                                       return handler.apply(target, arguments);
+                               }
+                       });
+               }
+       });
+})(jQuery);
diff --git a/resources/lib/jquery/jquery.xmldom.js b/resources/lib/jquery/jquery.xmldom.js
new file mode 100644 (file)
index 0000000..85d0083
--- /dev/null
@@ -0,0 +1,46 @@
+/*!
+ * jQuery xmlDOM Plugin v1.0
+ * http://outwestmedia.com/jquery-plugins/xmldom/
+ *
+ * Released: 2009-04-06
+ * Version: 1.0
+ *
+ * Copyright (c) 2009 Jonathan Sharp, Out West Media LLC.
+ * Dual licensed under the MIT and GPL licenses.
+ * http://docs.jquery.com/License
+ */
+(function($) {
+       // IE DOMParser wrapper
+       if ( window['DOMParser'] == undefined && window.ActiveXObject ) {
+               DOMParser = function() { };
+               DOMParser.prototype.parseFromString = function( xmlString ) {
+                       var doc = new ActiveXObject('Microsoft.XMLDOM');
+               doc.async = 'false';
+               doc.loadXML( xmlString );
+                       return doc;
+               };
+       }
+       
+       $.xmlDOM = function(xml, onErrorFn) {
+               try {
+                       var xmlDoc      = ( new DOMParser() ).parseFromString( xml, 'text/xml' );
+                       if ( $.isXMLDoc( xmlDoc ) ) {
+                               var err = $('parsererror', xmlDoc);
+                               if ( err.length == 1 ) {
+                                       throw('Error: ' + $(xmlDoc).text() );
+                               }
+                       } else {
+                               throw('Unable to parse XML');
+                       }
+               } catch( e ) {
+                       var msg = ( e.name == undefined ? e : e.name + ': ' + e.message );
+                       if ( $.isFunction( onErrorFn ) ) {
+                               onErrorFn( msg );
+                       } else {
+                               $(document).trigger('xmlParseError', [ msg ]);
+                       }
+                       return $([]);
+               }
+               return $( xmlDoc );
+       };
+})(jQuery);
\ No newline at end of file
diff --git a/resources/lib/moment/LICENSE b/resources/lib/moment/LICENSE
new file mode 100644 (file)
index 0000000..b44e3a6
--- /dev/null
@@ -0,0 +1,22 @@
+Copyright (c) 2011-2013 Tim Wood, Iskren Chernev, Moment.js contributors
+
+Permission is hereby granted, free of charge, to any person
+obtaining a copy of this software and associated documentation
+files (the "Software"), to deal in the Software without
+restriction, including without limitation the rights to use,
+copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the
+Software is furnished to do so, subject to the following
+conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
diff --git a/resources/lib/moment/lang/ar-ma.js b/resources/lib/moment/lang/ar-ma.js
new file mode 100644 (file)
index 0000000..1c159f1
--- /dev/null
@@ -0,0 +1,56 @@
+// moment.js language configuration
+// language : Moroccan Arabic (ar-ma)
+// author : ElFadili Yassine : https://github.com/ElFadiliY
+// author : Abdel Said : https://github.com/abdelsaid
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+    return moment.lang('ar-ma', {
+        months : "يناير_فبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر".split("_"),
+        monthsShort : "يناير_فبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر".split("_"),
+        weekdays : "الأحد_الإتنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت".split("_"),
+        weekdaysShort : "احد_اتنين_ثلاثاء_اربعاء_خميس_جمعة_سبت".split("_"),
+        weekdaysMin : "ح_ن_ث_ر_خ_ج_س".split("_"),
+        longDateFormat : {
+            LT : "HH:mm",
+            L : "DD/MM/YYYY",
+            LL : "D MMMM YYYY",
+            LLL : "D MMMM YYYY LT",
+            LLLL : "dddd D MMMM YYYY LT"
+        },
+        calendar : {
+            sameDay: "[اليوم على الساعة] LT",
+            nextDay: '[غدا على الساعة] LT',
+            nextWeek: 'dddd [على الساعة] LT',
+            lastDay: '[أمس على الساعة] LT',
+            lastWeek: 'dddd [على الساعة] LT',
+            sameElse: 'L'
+        },
+        relativeTime : {
+            future : "في %s",
+            past : "منذ %s",
+            s : "ثوان",
+            m : "دقيقة",
+            mm : "%d دقائق",
+            h : "ساعة",
+            hh : "%d ساعات",
+            d : "يوم",
+            dd : "%d أيام",
+            M : "شهر",
+            MM : "%d أشهر",
+            y : "سنة",
+            yy : "%d سنوات"
+        },
+        week : {
+            dow : 6, // Saturday is the first day of the week.
+            doy : 12  // The week that contains Jan 1st is the first week of the year.
+        }
+    });
+}));
diff --git a/resources/lib/moment/lang/ar.js b/resources/lib/moment/lang/ar.js
new file mode 100644 (file)
index 0000000..6e27d29
--- /dev/null
@@ -0,0 +1,56 @@
+// moment.js language configuration
+// language : Arabic (ar)
+// author : Abdel Said : https://github.com/abdelsaid
+// changes in months, weekdays : Ahmed Elkhatib
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+    return moment.lang('ar', {
+        months : "يناير/ كانون الثاني_فبراير/ شباط_مارس/ آذار_أبريل/ نيسان_مايو/ أيار_يونيو/ حزيران_يوليو/ تموز_أغسطس/ آب_سبتمبر/ أيلول_أكتوبر/ تشرين الأول_نوفمبر/ تشرين الثاني_ديسمبر/ كانون الأول".split("_"),
+        monthsShort : "يناير/ كانون الثاني_فبراير/ شباط_مارس/ آذار_أبريل/ نيسان_مايو/ أيار_يونيو/ حزيران_يوليو/ تموز_أغسطس/ آب_سبتمبر/ أيلول_أكتوبر/ تشرين الأول_نوفمبر/ تشرين الثاني_ديسمبر/ كانون الأول".split("_"),
+        weekdays : "الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت".split("_"),
+        weekdaysShort : "الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت".split("_"),
+        weekdaysMin : "ح_ن_ث_ر_خ_ج_س".split("_"),
+        longDateFormat : {
+            LT : "HH:mm",
+            L : "DD/MM/YYYY",
+            LL : "D MMMM YYYY",
+            LLL : "D MMMM YYYY LT",
+            LLLL : "dddd D MMMM YYYY LT"
+        },
+        calendar : {
+            sameDay: "[اليوم على الساعة] LT",
+            nextDay: '[غدا على الساعة] LT',
+            nextWeek: 'dddd [على الساعة] LT',
+            lastDay: '[أمس على الساعة] LT',
+            lastWeek: 'dddd [على الساعة] LT',
+            sameElse: 'L'
+        },
+        relativeTime : {
+            future : "في %s",
+            past : "منذ %s",
+            s : "ثوان",
+            m : "دقيقة",
+            mm : "%d دقائق",
+            h : "ساعة",
+            hh : "%d ساعات",
+            d : "يوم",
+            dd : "%d أيام",
+            M : "شهر",
+            MM : "%d أشهر",
+            y : "سنة",
+            yy : "%d سنوات"
+        },
+        week : {
+            dow : 6, // Saturday is the first day of the week.
+            doy : 12  // The week that contains Jan 1st is the first week of the year.
+        }
+    });
+}));
diff --git a/resources/lib/moment/lang/bg.js b/resources/lib/moment/lang/bg.js
new file mode 100644 (file)
index 0000000..f47ed65
--- /dev/null
@@ -0,0 +1,86 @@
+// moment.js language configuration
+// language : bulgarian (bg)
+// author : Krasen Borisov : https://github.com/kraz
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+    return moment.lang('bg', {
+        months : "януари_февруари_март_април_май_юни_юли_август_септември_октомври_ноември_декември".split("_"),
+        monthsShort : "янр_фев_мар_апр_май_юни_юли_авг_сеп_окт_ное_дек".split("_"),
+        weekdays : "неделя_понеделник_вторник_сряда_четвъртък_петък_събота".split("_"),
+        weekdaysShort : "нед_пон_вто_сря_чет_пет_съб".split("_"),
+        weekdaysMin : "нд_пн_вт_ср_чт_пт_сб".split("_"),
+        longDateFormat : {
+            LT : "H:mm",
+            L : "D.MM.YYYY",
+            LL : "D MMMM YYYY",
+            LLL : "D MMMM YYYY LT",
+            LLLL : "dddd, D MMMM YYYY LT"
+        },
+        calendar : {
+            sameDay : '[Днес в] LT',
+            nextDay : '[Утре в] LT',
+            nextWeek : 'dddd [в] LT',
+            lastDay : '[Вчера в] LT',
+            lastWeek : function () {
+                switch (this.day()) {
+                case 0:
+                case 3:
+                case 6:
+                    return '[В изминалата] dddd [в] LT';
+                case 1:
+                case 2:
+                case 4:
+                case 5:
+                    return '[В изминалия] dddd [в] LT';
+                }
+            },
+            sameElse : 'L'
+        },
+        relativeTime : {
+            future : "след %s",
+            past : "преди %s",
+            s : "няколко секунди",
+            m : "минута",
+            mm : "%d минути",
+            h : "час",
+            hh : "%d часа",
+            d : "ден",
+            dd : "%d дни",
+            M : "месец",
+            MM : "%d месеца",
+            y : "година",
+            yy : "%d години"
+        },
+        ordinal : function (number) {
+            var lastDigit = number % 10,
+                last2Digits = number % 100;
+            if (number === 0) {
+                return number + '-ев';
+            } else if (last2Digits === 0) {
+                return number + '-ен';
+            } else if (last2Digits > 10 && last2Digits < 20) {
+                return number + '-ти';
+            } else if (lastDigit === 1) {
+                return number + '-ви';
+            } else if (lastDigit === 2) {
+                return number + '-ри';
+            } else if (lastDigit === 7 || lastDigit === 8) {
+                return number + '-ми';
+            } else {
+                return number + '-ти';
+            }
+        },
+        week : {
+            dow : 1, // Monday is the first day of the week.
+            doy : 7  // The week that contains Jan 1st is the first week of the year.
+        }
+    });
+}));
diff --git a/resources/lib/moment/lang/br.js b/resources/lib/moment/lang/br.js
new file mode 100644 (file)
index 0000000..39c60df
--- /dev/null
@@ -0,0 +1,107 @@
+// moment.js language configuration
+// language : breton (br)
+// author : Jean-Baptiste Le Duigou : https://github.com/jbleduigou
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+    function relativeTimeWithMutation(number, withoutSuffix, key) {
+        var format = {
+            'mm': "munutenn",
+            'MM': "miz",
+            'dd': "devezh"
+        };
+        return number + ' ' + mutation(format[key], number);
+    }
+
+    function specialMutationForYears(number) {
+        switch (lastNumber(number)) {
+        case 1:
+        case 3:
+        case 4:
+        case 5:
+        case 9:
+            return number + ' bloaz';
+        default:
+            return number + ' vloaz';
+        }
+    }
+
+    function lastNumber(number) {
+        if (number > 9) {
+            return lastNumber(number % 10);
+        }
+        return number;
+    }
+
+    function mutation(text, number) {
+        if (number === 2) {
+            return softMutation(text);
+        }
+        return text;
+    }
+
+    function softMutation(text) {
+        var mutationTable = {
+            'm': 'v',
+            'b': 'v',
+            'd': 'z'
+        };
+        if (mutationTable[text.charAt(0)] === undefined) {
+            return text;
+        }
+        return mutationTable[text.charAt(0)] + text.substring(1);
+    }
+
+    return moment.lang('br', {
+        months : "Genver_C'hwevrer_Meurzh_Ebrel_Mae_Mezheven_Gouere_Eost_Gwengolo_Here_Du_Kerzu".split("_"),
+        monthsShort : "Gen_C'hwe_Meu_Ebr_Mae_Eve_Gou_Eos_Gwe_Her_Du_Ker".split("_"),
+        weekdays : "Sul_Lun_Meurzh_Merc'her_Yaou_Gwener_Sadorn".split("_"),
+        weekdaysShort : "Sul_Lun_Meu_Mer_Yao_Gwe_Sad".split("_"),
+        weekdaysMin : "Su_Lu_Me_Mer_Ya_Gw_Sa".split("_"),
+        longDateFormat : {
+            LT : "h[e]mm A",
+            L : "DD/MM/YYYY",
+            LL : "D [a viz] MMMM YYYY",
+            LLL : "D [a viz] MMMM YYYY LT",
+            LLLL : "dddd, D [a viz] MMMM YYYY LT"
+        },
+        calendar : {
+            sameDay : '[Hiziv da] LT',
+            nextDay : '[Warc\'hoazh da] LT',
+            nextWeek : 'dddd [da] LT',
+            lastDay : '[Dec\'h da] LT',
+            lastWeek : 'dddd [paset da] LT',
+            sameElse : 'L'
+        },
+        relativeTime : {
+            future : "a-benn %s",
+            past : "%s 'zo",
+            s : "un nebeud segondennoù",
+            m : "ur vunutenn",
+            mm : relativeTimeWithMutation,
+            h : "un eur",
+            hh : "%d eur",
+            d : "un devezh",
+            dd : relativeTimeWithMutation,
+            M : "ur miz",
+            MM : relativeTimeWithMutation,
+            y : "ur bloaz",
+            yy : specialMutationForYears
+        },
+        ordinal : function (number) {
+            var output = (number === 1) ? 'añ' : 'vet';
+            return number + output;
+        },
+        week : {
+            dow : 1, // Monday is the first day of the week.
+            doy : 4  // The week that contains Jan 4th is the first week of the year.
+        }
+    });
+}));
diff --git a/resources/lib/moment/lang/bs.js b/resources/lib/moment/lang/bs.js
new file mode 100644 (file)
index 0000000..83a9b4c
--- /dev/null
@@ -0,0 +1,139 @@
+// moment.js language configuration
+// language : bosnian (bs)
+// author : Nedim Cholich : https://github.com/frontyard
+// based on (hr) translation by Bojan Marković
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+
+    function translate(number, withoutSuffix, key) {
+        var result = number + " ";
+        switch (key) {
+        case 'm':
+            return withoutSuffix ? 'jedna minuta' : 'jedne minute';
+        case 'mm':
+            if (number === 1) {
+                result += 'minuta';
+            } else if (number === 2 || number === 3 || number === 4) {
+                result += 'minute';
+            } else {
+                result += 'minuta';
+            }
+            return result;
+        case 'h':
+            return withoutSuffix ? 'jedan sat' : 'jednog sata';
+        case 'hh':
+            if (number === 1) {
+                result += 'sat';
+            } else if (number === 2 || number === 3 || number === 4) {
+                result += 'sata';
+            } else {
+                result += 'sati';
+            }
+            return result;
+        case 'dd':
+            if (number === 1) {
+                result += 'dan';
+            } else {
+                result += 'dana';
+            }
+            return result;
+        case 'MM':
+            if (number === 1) {
+                result += 'mjesec';
+            } else if (number === 2 || number === 3 || number === 4) {
+                result += 'mjeseca';
+            } else {
+                result += 'mjeseci';
+            }
+            return result;
+        case 'yy':
+            if (number === 1) {
+                result += 'godina';
+            } else if (number === 2 || number === 3 || number === 4) {
+                result += 'godine';
+            } else {
+                result += 'godina';
+            }
+            return result;
+        }
+    }
+
+    return moment.lang('bs', {
+               months : "januar_februar_mart_april_maj_juni_juli_avgust_septembar_oktobar_novembar_decembar".split("_"),
+               monthsShort : "jan._feb._mar._apr._maj._jun._jul._avg._sep._okt._nov._dec.".split("_"),
+        weekdays : "nedjelja_ponedjeljak_utorak_srijeda_četvrtak_petak_subota".split("_"),
+        weekdaysShort : "ned._pon._uto._sri._čet._pet._sub.".split("_"),
+        weekdaysMin : "ne_po_ut_sr_če_pe_su".split("_"),
+        longDateFormat : {
+            LT : "H:mm",
+            L : "DD. MM. YYYY",
+            LL : "D. MMMM YYYY",
+            LLL : "D. MMMM YYYY LT",
+            LLLL : "dddd, D. MMMM YYYY LT"
+        },
+        calendar : {
+            sameDay  : '[danas u] LT',
+            nextDay  : '[sutra u] LT',
+
+            nextWeek : function () {
+                switch (this.day()) {
+                case 0:
+                    return '[u] [nedjelju] [u] LT';
+                case 3:
+                    return '[u] [srijedu] [u] LT';
+                case 6:
+                    return '[u] [subotu] [u] LT';
+                case 1:
+                case 2:
+                case 4:
+                case 5:
+                    return '[u] dddd [u] LT';
+                }
+            },
+            lastDay  : '[jučer u] LT',
+            lastWeek : function () {
+                switch (this.day()) {
+                case 0:
+                case 3:
+                    return '[prošlu] dddd [u] LT';
+                case 6:
+                    return '[prošle] [subote] [u] LT';
+                case 1:
+                case 2:
+                case 4:
+                case 5:
+                    return '[prošli] dddd [u] LT';
+                }
+            },
+            sameElse : 'L'
+        },
+        relativeTime : {
+            future : "za %s",
+            past   : "prije %s",
+            s      : "par sekundi",
+            m      : translate,
+            mm     : translate,
+            h      : translate,
+            hh     : translate,
+            d      : "dan",
+            dd     : translate,
+            M      : "mjesec",
+            MM     : translate,
+            y      : "godinu",
+            yy     : translate
+        },
+        ordinal : '%d.',
+        week : {
+            dow : 1, // Monday is the first day of the week.
+            doy : 7  // The week that contains Jan 1st is the first week of the year.
+        }
+    });
+}));
diff --git a/resources/lib/moment/lang/ca.js b/resources/lib/moment/lang/ca.js
new file mode 100644 (file)
index 0000000..cf47113
--- /dev/null
@@ -0,0 +1,66 @@
+// moment.js language configuration
+// language : catalan (ca)
+// author : Juan G. Hurtado : https://github.com/juanghurtado
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+    return moment.lang('ca', {
+        months : "gener_febrer_març_abril_maig_juny_juliol_agost_setembre_octubre_novembre_desembre".split("_"),
+        monthsShort : "gen._febr._mar._abr._mai._jun._jul._ag._set._oct._nov._des.".split("_"),
+        weekdays : "diumenge_dilluns_dimarts_dimecres_dijous_divendres_dissabte".split("_"),
+        weekdaysShort : "dg._dl._dt._dc._dj._dv._ds.".split("_"),
+        weekdaysMin : "Dg_Dl_Dt_Dc_Dj_Dv_Ds".split("_"),
+        longDateFormat : {
+            LT : "H:mm",
+            L : "DD/MM/YYYY",
+            LL : "D MMMM YYYY",
+            LLL : "D MMMM YYYY LT",
+            LLLL : "dddd D MMMM YYYY LT"
+        },
+        calendar : {
+            sameDay : function () {
+                return '[avui a ' + ((this.hours() !== 1) ? 'les' : 'la') + '] LT';
+            },
+            nextDay : function () {
+                return '[demà a ' + ((this.hours() !== 1) ? 'les' : 'la') + '] LT';
+            },
+            nextWeek : function () {
+                return 'dddd [a ' + ((this.hours() !== 1) ? 'les' : 'la') + '] LT';
+            },
+            lastDay : function () {
+                return '[ahir a ' + ((this.hours() !== 1) ? 'les' : 'la') + '] LT';
+            },
+            lastWeek : function () {
+                return '[el] dddd [passat a ' + ((this.hours() !== 1) ? 'les' : 'la') + '] LT';
+            },
+            sameElse : 'L'
+        },
+        relativeTime : {
+            future : "en %s",
+            past : "fa %s",
+            s : "uns segons",
+            m : "un minut",
+            mm : "%d minuts",
+            h : "una hora",
+            hh : "%d hores",
+            d : "un dia",
+            dd : "%d dies",
+            M : "un mes",
+            MM : "%d mesos",
+            y : "un any",
+            yy : "%d anys"
+        },
+        ordinal : '%dº',
+        week : {
+            dow : 1, // Monday is the first day of the week.
+            doy : 4  // The week that contains Jan 4th is the first week of the year.
+        }
+    });
+}));
diff --git a/resources/lib/moment/lang/cs.js b/resources/lib/moment/lang/cs.js
new file mode 100644 (file)
index 0000000..c1396cf
--- /dev/null
@@ -0,0 +1,155 @@
+// moment.js language configuration
+// language : czech (cs)
+// author : petrbela : https://github.com/petrbela
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+    var months = "leden_únor_březen_duben_květen_červen_červenec_srpen_září_říjen_listopad_prosinec".split("_"),
+        monthsShort = "led_úno_bře_dub_kvě_čvn_čvc_srp_zář_říj_lis_pro".split("_");
+
+    function plural(n) {
+        return (n > 1) && (n < 5) && (~~(n / 10) !== 1);
+    }
+
+    function translate(number, withoutSuffix, key, isFuture) {
+        var result = number + " ";
+        switch (key) {
+        case 's':  // a few seconds / in a few seconds / a few seconds ago
+            return (withoutSuffix || isFuture) ? 'pár vteřin' : 'pár vteřinami';
+        case 'm':  // a minute / in a minute / a minute ago
+            return withoutSuffix ? 'minuta' : (isFuture ? 'minutu' : 'minutou');
+        case 'mm': // 9 minutes / in 9 minutes / 9 minutes ago
+            if (withoutSuffix || isFuture) {
+                return result + (plural(number) ? 'minuty' : 'minut');
+            } else {
+                return result + 'minutami';
+            }
+            break;
+        case 'h':  // an hour / in an hour / an hour ago
+            return withoutSuffix ? 'hodina' : (isFuture ? 'hodinu' : 'hodinou');
+        case 'hh': // 9 hours / in 9 hours / 9 hours ago
+            if (withoutSuffix || isFuture) {
+                return result + (plural(number) ? 'hodiny' : 'hodin');
+            } else {
+                return result + 'hodinami';
+            }
+            break;
+        case 'd':  // a day / in a day / a day ago
+            return (withoutSuffix || isFuture) ? 'den' : 'dnem';
+        case 'dd': // 9 days / in 9 days / 9 days ago
+            if (withoutSuffix || isFuture) {
+                return result + (plural(number) ? 'dny' : 'dní');
+            } else {
+                return result + 'dny';
+            }
+            break;
+        case 'M':  // a month / in a month / a month ago
+            return (withoutSuffix || isFuture) ? 'měsíc' : 'měsícem';
+        case 'MM': // 9 months / in 9 months / 9 months ago
+            if (withoutSuffix || isFuture) {
+                return result + (plural(number) ? 'měsíce' : 'měsíců');
+            } else {
+                return result + 'měsíci';
+            }
+            break;
+        case 'y':  // a year / in a year / a year ago
+            return (withoutSuffix || isFuture) ? 'rok' : 'rokem';
+        case 'yy': // 9 years / in 9 years / 9 years ago
+            if (withoutSuffix || isFuture) {
+                return result + (plural(number) ? 'roky' : 'let');
+            } else {
+                return result + 'lety';
+            }
+            break;
+        }
+    }
+
+    return moment.lang('cs', {
+        months : months,
+        monthsShort : monthsShort,
+        monthsParse : (function (months, monthsShort) {
+            var i, _monthsParse = [];
+            for (i = 0; i < 12; i++) {
+                // use custom parser to solve problem with July (červenec)
+                _monthsParse[i] = new RegExp('^' + months[i] + '$|^' + monthsShort[i] + '$', 'i');
+            }
+            return _monthsParse;
+        }(months, monthsShort)),
+        weekdays : "neděle_pondělí_úterý_středa_čtvrtek_pátek_sobota".split("_"),
+        weekdaysShort : "ne_po_út_st_čt_pá_so".split("_"),
+        weekdaysMin : "ne_po_út_st_čt_pá_so".split("_"),
+        longDateFormat : {
+            LT: "H:mm",
+            L : "DD.MM.YYYY",
+            LL : "D. MMMM YYYY",
+            LLL : "D. MMMM YYYY LT",
+            LLLL : "dddd D. MMMM YYYY LT"
+        },
+        calendar : {
+            sameDay: "[dnes v] LT",
+            nextDay: '[zítra v] LT',
+            nextWeek: function () {
+                switch (this.day()) {
+                case 0:
+                    return '[v neděli v] LT';
+                case 1:
+                case 2:
+                    return '[v] dddd [v] LT';
+                case 3:
+                    return '[ve středu v] LT';
+                case 4:
+                    return '[ve čtvrtek v] LT';
+                case 5:
+                    return '[v pátek v] LT';
+                case 6:
+                    return '[v sobotu v] LT';
+                }
+            },
+            lastDay: '[včera v] LT',
+            lastWeek: function () {
+                switch (this.day()) {
+                case 0:
+                    return '[minulou neděli v] LT';
+                case 1:
+                case 2:
+                    return '[minulé] dddd [v] LT';
+                case 3:
+                    return '[minulou středu v] LT';
+                case 4:
+                case 5:
+                    return '[minulý] dddd [v] LT';
+                case 6:
+                    return '[minulou sobotu v] LT';
+                }
+            },
+            sameElse: "L"
+        },
+        relativeTime : {
+            future : "za %s",
+            past : "před %s",
+            s : translate,
+            m : translate,
+            mm : translate,
+            h : translate,
+            hh : translate,
+            d : translate,
+            dd : translate,
+            M : translate,
+            MM : translate,
+            y : translate,
+            yy : translate
+        },
+        ordinal : '%d.',
+        week : {
+            dow : 1, // Monday is the first day of the week.
+            doy : 4  // The week that contains Jan 4th is the first week of the year.
+        }
+    });
+}));
diff --git a/resources/lib/moment/lang/cv.js b/resources/lib/moment/lang/cv.js
new file mode 100644 (file)
index 0000000..a5812de
--- /dev/null
@@ -0,0 +1,59 @@
+// moment.js language configuration
+// language : chuvash (cv)
+// author : Anatoly Mironov : https://github.com/mirontoli
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+    return moment.lang('cv', {
+        months : "кăрлач_нарăс_пуш_ака_май_çĕртме_утă_çурла_авăн_юпа_чӳк_раштав".split("_"),
+        monthsShort : "кăр_нар_пуш_ака_май_çĕр_утă_çур_ав_юпа_чӳк_раш".split("_"),
+        weekdays : "вырсарникун_тунтикун_ытларикун_юнкун_кĕçнерникун_эрнекун_шăматкун".split("_"),
+        weekdaysShort : "выр_тун_ытл_юн_кĕç_эрн_шăм".split("_"),
+        weekdaysMin : "вр_тн_ыт_юн_кç_эр_шм".split("_"),
+        longDateFormat : {
+            LT : "HH:mm",
+            L : "DD-MM-YYYY",
+            LL : "YYYY [çулхи] MMMM [уйăхĕн] D[-мĕшĕ]",
+            LLL : "YYYY [çулхи] MMMM [уйăхĕн] D[-мĕшĕ], LT",
+            LLLL : "dddd, YYYY [çулхи] MMMM [уйăхĕн] D[-мĕшĕ], LT"
+        },
+        calendar : {
+            sameDay: '[Паян] LT [сехетре]',
+            nextDay: '[Ыран] LT [сехетре]',
+            lastDay: '[Ĕнер] LT [сехетре]',
+            nextWeek: '[Çитес] dddd LT [сехетре]',
+            lastWeek: '[Иртнĕ] dddd LT [сехетре]',
+            sameElse: 'L'
+        },
+        relativeTime : {
+            future : function (output) {
+                var affix = /сехет$/i.exec(output) ? "рен" : /çул$/i.exec(output) ? "тан" : "ран";
+                return output + affix;
+            },
+            past : "%s каялла",
+            s : "пĕр-ик çеккунт",
+            m : "пĕр минут",
+            mm : "%d минут",
+            h : "пĕр сехет",
+            hh : "%d сехет",
+            d : "пĕр кун",
+            dd : "%d кун",
+            M : "пĕр уйăх",
+            MM : "%d уйăх",
+            y : "пĕр çул",
+            yy : "%d çул"
+        },
+        ordinal : '%d-мĕш',
+        week : {
+            dow : 1, // Monday is the first day of the week.
+            doy : 7  // The week that contains Jan 1st is the first week of the year.
+        }
+    });
+}));
diff --git a/resources/lib/moment/lang/cy.js b/resources/lib/moment/lang/cy.js
new file mode 100644 (file)
index 0000000..b47d7c2
--- /dev/null
@@ -0,0 +1,77 @@
+// moment.js language configuration
+// language : Welsh (cy)
+// author : Robert Allen
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+    return moment.lang("cy", {
+        months: "Ionawr_Chwefror_Mawrth_Ebrill_Mai_Mehefin_Gorffennaf_Awst_Medi_Hydref_Tachwedd_Rhagfyr".split("_"),
+        monthsShort: "Ion_Chwe_Maw_Ebr_Mai_Meh_Gor_Aws_Med_Hyd_Tach_Rhag".split("_"),
+        weekdays: "Dydd Sul_Dydd Llun_Dydd Mawrth_Dydd Mercher_Dydd Iau_Dydd Gwener_Dydd Sadwrn".split("_"),
+        weekdaysShort: "Sul_Llun_Maw_Mer_Iau_Gwe_Sad".split("_"),
+        weekdaysMin: "Su_Ll_Ma_Me_Ia_Gw_Sa".split("_"),
+        // time formats are the same as en-gb
+        longDateFormat: {
+            LT: "HH:mm",
+            L: "DD/MM/YYYY",
+            LL: "D MMMM YYYY",
+            LLL: "D MMMM YYYY LT",
+            LLLL: "dddd, D MMMM YYYY LT"
+        },
+        calendar: {
+            sameDay: '[Heddiw am] LT',
+            nextDay: '[Yfory am] LT',
+            nextWeek: 'dddd [am] LT',
+            lastDay: '[Ddoe am] LT',
+            lastWeek: 'dddd [diwethaf am] LT',
+            sameElse: 'L'
+        },
+        relativeTime: {
+            future: "mewn %s",
+            past: "%s yn àl",
+            s: "ychydig eiliadau",
+            m: "munud",
+            mm: "%d munud",
+            h: "awr",
+            hh: "%d awr",
+            d: "diwrnod",
+            dd: "%d diwrnod",
+            M: "mis",
+            MM: "%d mis",
+            y: "blwyddyn",
+            yy: "%d flynedd"
+        },
+        // traditional ordinal numbers above 31 are not commonly used in colloquial Welsh
+        ordinal: function (number) {
+            var b = number,
+                output = '',
+                lookup = [
+                    '', 'af', 'il', 'ydd', 'ydd', 'ed', 'ed', 'ed', 'fed', 'fed', 'fed', // 1af to 10fed
+                    'eg', 'fed', 'eg', 'eg', 'fed', 'eg', 'eg', 'fed', 'eg', 'fed' // 11eg to 20fed
+                ];
+
+            if (b > 20) {
+                if (b === 40 || b === 50 || b === 60 || b === 80 || b === 100) {
+                    output = 'fed'; // not 30ain, 70ain or 90ain
+                } else {
+                    output = 'ain';
+                }
+            } else if (b > 0) {
+                output = lookup[b];
+            }
+
+            return number + output;
+        },
+        week : {
+            dow : 1, // Monday is the first day of the week.
+            doy : 4  // The week that contains Jan 4th is the first week of the year.
+        }
+    });
+}));
diff --git a/resources/lib/moment/lang/da.js b/resources/lib/moment/lang/da.js
new file mode 100644 (file)
index 0000000..2fa8244
--- /dev/null
@@ -0,0 +1,56 @@
+// moment.js language configuration
+// language : danish (da)
+// author : Ulrik Nielsen : https://github.com/mrbase
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+    return moment.lang('da', {
+        months : "januar_februar_marts_april_maj_juni_juli_august_september_oktober_november_december".split("_"),
+        monthsShort : "jan_feb_mar_apr_maj_jun_jul_aug_sep_okt_nov_dec".split("_"),
+        weekdays : "søndag_mandag_tirsdag_onsdag_torsdag_fredag_lørdag".split("_"),
+        weekdaysShort : "søn_man_tir_ons_tor_fre_lør".split("_"),
+        weekdaysMin : "sø_ma_ti_on_to_fr_lø".split("_"),
+        longDateFormat : {
+            LT : "HH:mm",
+            L : "DD/MM/YYYY",
+            LL : "D MMMM YYYY",
+            LLL : "D MMMM YYYY LT",
+            LLLL : "dddd D. MMMM, YYYY LT"
+        },
+        calendar : {
+            sameDay : '[I dag kl.] LT',
+            nextDay : '[I morgen kl.] LT',
+            nextWeek : 'dddd [kl.] LT',
+            lastDay : '[I går kl.] LT',
+            lastWeek : '[sidste] dddd [kl] LT',
+            sameElse : 'L'
+        },
+        relativeTime : {
+            future : "om %s",
+            past : "%s siden",
+            s : "få sekunder",
+            m : "et minut",
+            mm : "%d minutter",
+            h : "en time",
+            hh : "%d timer",
+            d : "en dag",
+            dd : "%d dage",
+            M : "en måned",
+            MM : "%d måneder",
+            y : "et år",
+            yy : "%d år"
+        },
+        ordinal : '%d.',
+        week : {
+            dow : 1, // Monday is the first day of the week.
+            doy : 4  // The week that contains Jan 4th is the first week of the year.
+        }
+    });
+}));
diff --git a/resources/lib/moment/lang/de.js b/resources/lib/moment/lang/de.js
new file mode 100644 (file)
index 0000000..988f328
--- /dev/null
@@ -0,0 +1,71 @@
+// moment.js language configuration
+// language : german (de)
+// author : lluchs : https://github.com/lluchs
+// author: Menelion Elensúle: https://github.com/Oire
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+    function processRelativeTime(number, withoutSuffix, key, isFuture) {
+        var format = {
+            'm': ['eine Minute', 'einer Minute'],
+            'h': ['eine Stunde', 'einer Stunde'],
+            'd': ['ein Tag', 'einem Tag'],
+            'dd': [number + ' Tage', number + ' Tagen'],
+            'M': ['ein Monat', 'einem Monat'],
+            'MM': [number + ' Monate', number + ' Monaten'],
+            'y': ['ein Jahr', 'einem Jahr'],
+            'yy': [number + ' Jahre', number + ' Jahren']
+        };
+        return withoutSuffix ? format[key][0] : format[key][1];
+    }
+
+    return moment.lang('de', {
+        months : "Januar_Februar_März_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember".split("_"),
+        monthsShort : "Jan._Febr._Mrz._Apr._Mai_Jun._Jul._Aug._Sept._Okt._Nov._Dez.".split("_"),
+        weekdays : "Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag".split("_"),
+        weekdaysShort : "So._Mo._Di._Mi._Do._Fr._Sa.".split("_"),
+        weekdaysMin : "So_Mo_Di_Mi_Do_Fr_Sa".split("_"),
+        longDateFormat : {
+            LT: "H:mm [Uhr]",
+            L : "DD.MM.YYYY",
+            LL : "D. MMMM YYYY",
+            LLL : "D. MMMM YYYY LT",
+            LLLL : "dddd, D. MMMM YYYY LT"
+        },
+        calendar : {
+            sameDay: "[Heute um] LT",
+            sameElse: "L",
+            nextDay: '[Morgen um] LT',
+            nextWeek: 'dddd [um] LT',
+            lastDay: '[Gestern um] LT',
+            lastWeek: '[letzten] dddd [um] LT'
+        },
+        relativeTime : {
+            future : "in %s",
+            past : "vor %s",
+            s : "ein paar Sekunden",
+            m : processRelativeTime,
+            mm : "%d Minuten",
+            h : processRelativeTime,
+            hh : "%d Stunden",
+            d : processRelativeTime,
+            dd : processRelativeTime,
+            M : processRelativeTime,
+            MM : processRelativeTime,
+            y : processRelativeTime,
+            yy : processRelativeTime
+        },
+        ordinal : '%d.',
+        week : {
+            dow : 1, // Monday is the first day of the week.
+            doy : 4  // The week that contains Jan 4th is the first week of the year.
+        }
+    });
+}));
diff --git a/resources/lib/moment/lang/el.js b/resources/lib/moment/lang/el.js
new file mode 100644 (file)
index 0000000..9dfea23
--- /dev/null
@@ -0,0 +1,79 @@
+// moment.js language configuration
+// language : modern greek (el)
+// author : Aggelos Karalias : https://github.com/mehiel
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+    return moment.lang('el', {
+        monthsNominativeEl : "Ιανουάριος_Φεβρουάριος_Μάρτιος_Απρίλιος_Μάιος_Ιούνιος_Ιούλιος_Αύγουστος_Σεπτέμβριος_Οκτώβριος_Νοέμβριος_Δεκέμβριος".split("_"),
+        monthsGenitiveEl : "Ιανουαρίου_Φεβρουαρίου_Μαρτίου_Απριλίου_Μαΐου_Ιουνίου_Ιουλίου_Αυγούστου_Σεπτεμβρίου_Οκτωβρίου_Νοεμβρίου_Δεκεμβρίου".split("_"),
+        months : function (momentToFormat, format) {
+            if (/D/.test(format.substring(0, format.indexOf("MMMM")))) { // if there is a day number before 'MMMM'
+                return this._monthsGenitiveEl[momentToFormat.month()];
+            } else {
+                return this._monthsNominativeEl[momentToFormat.month()];
+            }
+        },
+        monthsShort : "Ιαν_Φεβ_Μαρ_Απρ_Μαϊ_Ιουν_Ιουλ_Αυγ_Σεπ_Οκτ_Νοε_Δεκ".split("_"),
+        weekdays : "Κυριακή_Δευτέρα_Τρίτη_Τετάρτη_Πέμπτη_Παρασκευή_Σάββατο".split("_"),
+        weekdaysShort : "Κυρ_Δευ_Τρι_Τετ_Πεμ_Παρ_Σαβ".split("_"),
+        weekdaysMin : "Κυ_Δε_Τρ_Τε_Πε_Πα_Σα".split("_"),
+        meridiem : function (hours, minutes, isLower) {
+            if (hours > 11) {
+                return isLower ? 'μμ' : 'ΜΜ';
+            } else {
+                return isLower ? 'πμ' : 'ΠΜ';
+            }
+        },
+        longDateFormat : {
+            LT : "h:mm A",
+            L : "DD/MM/YYYY",
+            LL : "D MMMM YYYY",
+            LLL : "D MMMM YYYY LT",
+            LLLL : "dddd, D MMMM YYYY LT"
+        },
+        calendarEl : {
+            sameDay : '[Σήμερα {}] LT',
+            nextDay : '[Αύριο {}] LT',
+            nextWeek : 'dddd [{}] LT',
+            lastDay : '[Χθες {}] LT',
+            lastWeek : '[την προηγούμενη] dddd [{}] LT',
+            sameElse : 'L'
+        },
+        calendar : function (key, mom) {
+            var output = this._calendarEl[key],
+                hours = mom && mom.hours();
+
+            return output.replace("{}", (hours % 12 === 1 ? "στη" : "στις"));
+        },
+        relativeTime : {
+            future : "σε %s",
+            past : "%s πριν",
+            s : "δευτερόλεπτα",
+            m : "ένα λεπτό",
+            mm : "%d λεπτά",
+            h : "μία ώρα",
+            hh : "%d ώρες",
+            d : "μία μέρα",
+            dd : "%d μέρες",
+            M : "ένας μήνας",
+            MM : "%d μήνες",
+            y : "ένας χρόνος",
+            yy : "%d χρόνια"
+        },
+        ordinal : function (number) {
+            return number + 'η';
+        },
+        week : {
+            dow : 1, // Monday is the first day of the week.
+            doy : 4  // The week that contains Jan 4st is the first week of the year.
+        }
+    });
+}));
diff --git a/resources/lib/moment/lang/en-au.js b/resources/lib/moment/lang/en-au.js
new file mode 100644 (file)
index 0000000..4d91e25
--- /dev/null
@@ -0,0 +1,62 @@
+// moment.js language configuration
+// language : australian english (en-au)
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+    return moment.lang('en-au', {
+        months : "January_February_March_April_May_June_July_August_September_October_November_December".split("_"),
+        monthsShort : "Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),
+        weekdays : "Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),
+        weekdaysShort : "Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),
+        weekdaysMin : "Su_Mo_Tu_We_Th_Fr_Sa".split("_"),
+        longDateFormat : {
+            LT : "h:mm A",
+            L : "DD/MM/YYYY",
+            LL : "D MMMM YYYY",
+            LLL : "D MMMM YYYY LT",
+            LLLL : "dddd, D MMMM YYYY LT"
+        },
+        calendar : {
+            sameDay : '[Today at] LT',
+            nextDay : '[Tomorrow at] LT',
+            nextWeek : 'dddd [at] LT',
+            lastDay : '[Yesterday at] LT',
+            lastWeek : '[Last] dddd [at] LT',
+            sameElse : 'L'
+        },
+        relativeTime : {
+            future : "in %s",
+            past : "%s ago",
+            s : "a few seconds",
+            m : "a minute",
+            mm : "%d minutes",
+            h : "an hour",
+            hh : "%d hours",
+            d : "a day",
+            dd : "%d days",
+            M : "a month",
+            MM : "%d months",
+            y : "a year",
+            yy : "%d years"
+        },
+        ordinal : function (number) {
+            var b = number % 10,
+                output = (~~ (number % 100 / 10) === 1) ? 'th' :
+                (b === 1) ? 'st' :
+                (b === 2) ? 'nd' :
+                (b === 3) ? 'rd' : 'th';
+            return number + output;
+        },
+        week : {
+            dow : 1, // Monday is the first day of the week.
+            doy : 4  // The week that contains Jan 4th is the first week of the year.
+        }
+    });
+}));
diff --git a/resources/lib/moment/lang/en-ca.js b/resources/lib/moment/lang/en-ca.js
new file mode 100644 (file)
index 0000000..a97e9f3
--- /dev/null
@@ -0,0 +1,59 @@
+// moment.js language configuration
+// language : canadian english (en-ca)
+// author : Jonathan Abourbih : https://github.com/jonbca
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+    return moment.lang('en-ca', {
+        months : "January_February_March_April_May_June_July_August_September_October_November_December".split("_"),
+        monthsShort : "Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),
+        weekdays : "Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),
+        weekdaysShort : "Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),
+        weekdaysMin : "Su_Mo_Tu_We_Th_Fr_Sa".split("_"),
+        longDateFormat : {
+            LT : "h:mm A",
+            L : "YYYY-MM-DD",
+            LL : "D MMMM, YYYY",
+            LLL : "D MMMM, YYYY LT",
+            LLLL : "dddd, D MMMM, YYYY LT"
+        },
+        calendar : {
+            sameDay : '[Today at] LT',
+            nextDay : '[Tomorrow at] LT',
+            nextWeek : 'dddd [at] LT',
+            lastDay : '[Yesterday at] LT',
+            lastWeek : '[Last] dddd [at] LT',
+            sameElse : 'L'
+        },
+        relativeTime : {
+            future : "in %s",
+            past : "%s ago",
+            s : "a few seconds",
+            m : "a minute",
+            mm : "%d minutes",
+            h : "an hour",
+            hh : "%d hours",
+            d : "a day",
+            dd : "%d days",
+            M : "a month",
+            MM : "%d months",
+            y : "a year",
+            yy : "%d years"
+        },
+        ordinal : function (number) {
+            var b = number % 10,
+                output = (~~ (number % 100 / 10) === 1) ? 'th' :
+                (b === 1) ? 'st' :
+                (b === 2) ? 'nd' :
+                (b === 3) ? 'rd' : 'th';
+            return number + output;
+        }
+    });
+}));
diff --git a/resources/lib/moment/lang/en-gb.js b/resources/lib/moment/lang/en-gb.js
new file mode 100644 (file)
index 0000000..3a7907b
--- /dev/null
@@ -0,0 +1,63 @@
+// moment.js language configuration
+// language : great britain english (en-gb)
+// author : Chris Gedrim : https://github.com/chrisgedrim
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+    return moment.lang('en-gb', {
+        months : "January_February_March_April_May_June_July_August_September_October_November_December".split("_"),
+        monthsShort : "Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),
+        weekdays : "Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),
+        weekdaysShort : "Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),
+        weekdaysMin : "Su_Mo_Tu_We_Th_Fr_Sa".split("_"),
+        longDateFormat : {
+            LT : "HH:mm",
+            L : "DD/MM/YYYY",
+            LL : "D MMMM YYYY",
+            LLL : "D MMMM YYYY LT",
+            LLLL : "dddd, D MMMM YYYY LT"
+        },
+        calendar : {
+            sameDay : '[Today at] LT',
+            nextDay : '[Tomorrow at] LT',
+            nextWeek : 'dddd [at] LT',
+            lastDay : '[Yesterday at] LT',
+            lastWeek : '[Last] dddd [at] LT',
+            sameElse : 'L'
+        },
+        relativeTime : {
+            future : "in %s",
+            past : "%s ago",
+            s : "a few seconds",
+            m : "a minute",
+            mm : "%d minutes",
+            h : "an hour",
+            hh : "%d hours",
+            d : "a day",
+            dd : "%d days",
+            M : "a month",
+            MM : "%d months",
+            y : "a year",
+            yy : "%d years"
+        },
+        ordinal : function (number) {
+            var b = number % 10,
+                output = (~~ (number % 100 / 10) === 1) ? 'th' :
+                (b === 1) ? 'st' :
+                (b === 2) ? 'nd' :
+                (b === 3) ? 'rd' : 'th';
+            return number + output;
+        },
+        week : {
+            dow : 1, // Monday is the first day of the week.
+            doy : 4  // The week that contains Jan 4th is the first week of the year.
+        }
+    });
+}));
diff --git a/resources/lib/moment/lang/eo.js b/resources/lib/moment/lang/eo.js
new file mode 100644 (file)
index 0000000..03b1abf
--- /dev/null
@@ -0,0 +1,65 @@
+// moment.js language configuration
+// language : esperanto (eo)
+// author : Colin Dean : https://github.com/colindean
+// komento: Mi estas malcerta se mi korekte traktis akuzativojn en tiu traduko.
+//          Se ne, bonvolu korekti kaj avizi min por ke mi povas lerni!
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+    return moment.lang('eo', {
+        months : "januaro_februaro_marto_aprilo_majo_junio_julio_aŭgusto_septembro_oktobro_novembro_decembro".split("_"),
+        monthsShort : "jan_feb_mar_apr_maj_jun_jul_aŭg_sep_okt_nov_dec".split("_"),
+        weekdays : "Dimanĉo_Lundo_Mardo_Merkredo_Ĵaŭdo_Vendredo_Sabato".split("_"),
+        weekdaysShort : "Dim_Lun_Mard_Merk_Ĵaŭ_Ven_Sab".split("_"),
+        weekdaysMin : "Di_Lu_Ma_Me_Ĵa_Ve_Sa".split("_"),
+        longDateFormat : {
+            LT : "HH:mm",
+            L : "YYYY-MM-DD",
+            LL : "D[-an de] MMMM, YYYY",
+            LLL : "D[-an de] MMMM, YYYY LT",
+            LLLL : "dddd, [la] D[-an de] MMMM, YYYY LT"
+        },
+        meridiem : function (hours, minutes, isLower) {
+            if (hours > 11) {
+                return isLower ? 'p.t.m.' : 'P.T.M.';
+            } else {
+                return isLower ? 'a.t.m.' : 'A.T.M.';
+            }
+        },
+        calendar : {
+            sameDay : '[Hodiaŭ je] LT',
+            nextDay : '[Morgaŭ je] LT',
+            nextWeek : 'dddd [je] LT',
+            lastDay : '[Hieraŭ je] LT',
+            lastWeek : '[pasinta] dddd [je] LT',
+            sameElse : 'L'
+        },
+        relativeTime : {
+            future : "je %s",
+            past : "antaŭ %s",
+            s : "sekundoj",
+            m : "minuto",
+            mm : "%d minutoj",
+            h : "horo",
+            hh : "%d horoj",
+            d : "tago",//ne 'diurno', ĉar estas uzita por proksimumo
+            dd : "%d tagoj",
+            M : "monato",
+            MM : "%d monatoj",
+            y : "jaro",
+            yy : "%d jaroj"
+        },
+        ordinal : "%da",
+        week : {
+            dow : 1, // Monday is the first day of the week.
+            doy : 7  // The week that contains Jan 1st is the first week of the year.
+        }
+    });
+}));
diff --git a/resources/lib/moment/lang/es.js b/resources/lib/moment/lang/es.js
new file mode 100644 (file)
index 0000000..0a38396
--- /dev/null
@@ -0,0 +1,66 @@
+// moment.js language configuration
+// language : spanish (es)
+// author : Julio Napurí : https://github.com/julionc
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+    return moment.lang('es', {
+        months : "enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre".split("_"),
+        monthsShort : "ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.".split("_"),
+        weekdays : "domingo_lunes_martes_miércoles_jueves_viernes_sábado".split("_"),
+        weekdaysShort : "dom._lun._mar._mié._jue._vie._sáb.".split("_"),
+        weekdaysMin : "Do_Lu_Ma_Mi_Ju_Vi_Sá".split("_"),
+        longDateFormat : {
+            LT : "H:mm",
+            L : "DD/MM/YYYY",
+            LL : "D [de] MMMM [de] YYYY",
+            LLL : "D [de] MMMM [de] YYYY LT",
+            LLLL : "dddd, D [de] MMMM [de] YYYY LT"
+        },
+        calendar : {
+            sameDay : function () {
+                return '[hoy a la' + ((this.hours() !== 1) ? 's' : '') + '] LT';
+            },
+            nextDay : function () {
+                return '[mañana a la' + ((this.hours() !== 1) ? 's' : '') + '] LT';
+            },
+            nextWeek : function () {
+                return 'dddd [a la' + ((this.hours() !== 1) ? 's' : '') + '] LT';
+            },
+            lastDay : function () {
+                return '[ayer a la' + ((this.hours() !== 1) ? 's' : '') + '] LT';
+            },
+            lastWeek : function () {
+                return '[el] dddd [pasado a la' + ((this.hours() !== 1) ? 's' : '') + '] LT';
+            },
+            sameElse : 'L'
+        },
+        relativeTime : {
+            future : "en %s",
+            past : "hace %s",
+            s : "unos segundos",
+            m : "un minuto",
+            mm : "%d minutos",
+            h : "una hora",
+            hh : "%d horas",
+            d : "un día",
+            dd : "%d días",
+            M : "un mes",
+            MM : "%d meses",
+            y : "un año",
+            yy : "%d años"
+        },
+        ordinal : '%dº',
+        week : {
+            dow : 1, // Monday is the first day of the week.
+            doy : 4  // The week that contains Jan 4th is the first week of the year.
+        }
+    });
+}));
diff --git a/resources/lib/moment/lang/et.js b/resources/lib/moment/lang/et.js
new file mode 100644 (file)
index 0000000..fb410ef
--- /dev/null
@@ -0,0 +1,76 @@
+// moment.js language configuration
+// language : estonian (et)
+// author : Henry Kehlmann : https://github.com/madhenry
+// improvements : Illimar Tambek : https://github.com/ragulka
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+    function processRelativeTime(number, withoutSuffix, key, isFuture) {
+        var format = {
+            's' : ['mõne sekundi', 'mõni sekund', 'paar sekundit'],
+            'm' : ['ühe minuti', 'üks minut'],
+            'mm': [number + ' minuti', number + ' minutit'],
+            'h' : ['ühe tunni', 'tund aega', 'üks tund'],
+            'hh': [number + ' tunni', number + ' tundi'],
+            'd' : ['ühe päeva', 'üks päev'],
+            'M' : ['kuu aja', 'kuu aega', 'üks kuu'],
+            'MM': [number + ' kuu', number + ' kuud'],
+            'y' : ['ühe aasta', 'aasta', 'üks aasta'],
+            'yy': [number + ' aasta', number + ' aastat']
+        };
+        if (withoutSuffix) {
+            return format[key][2] ? format[key][2] : format[key][1];
+        }
+        return isFuture ? format[key][0] : format[key][1];
+    }
+
+    return moment.lang('et', {
+        months        : "jaanuar_veebruar_märts_aprill_mai_juuni_juuli_august_september_oktoober_november_detsember".split("_"),
+        monthsShort   : "jaan_veebr_märts_apr_mai_juuni_juuli_aug_sept_okt_nov_dets".split("_"),
+        weekdays      : "pühapäev_esmaspäev_teisipäev_kolmapäev_neljapäev_reede_laupäev".split("_"),
+        weekdaysShort : "P_E_T_K_N_R_L".split("_"),
+        weekdaysMin   : "P_E_T_K_N_R_L".split("_"),
+        longDateFormat : {
+            LT   : "H:mm",
+            L    : "DD.MM.YYYY",
+            LL   : "D. MMMM YYYY",
+            LLL  : "D. MMMM YYYY LT",
+            LLLL : "dddd, D. MMMM YYYY LT"
+        },
+        calendar : {
+            sameDay  : '[Täna,] LT',
+            nextDay  : '[Homme,] LT',
+            nextWeek : '[Järgmine] dddd LT',
+            lastDay  : '[Eile,] LT',
+            lastWeek : '[Eelmine] dddd LT',
+            sameElse : 'L'
+        },
+        relativeTime : {
+            future : "%s pärast",
+            past   : "%s tagasi",
+            s      : processRelativeTime,
+            m      : processRelativeTime,
+            mm     : processRelativeTime,
+            h      : processRelativeTime,
+            hh     : processRelativeTime,
+            d      : processRelativeTime,
+            dd     : '%d päeva',
+            M      : processRelativeTime,
+            MM     : processRelativeTime,
+            y      : processRelativeTime,
+            yy     : processRelativeTime
+        },
+        ordinal : '%d.',
+        week : {
+            dow : 1, // Monday is the first day of the week.
+            doy : 4  // The week that contains Jan 4th is the first week of the year.
+        }
+    });
+}));
diff --git a/resources/lib/moment/lang/eu.js b/resources/lib/moment/lang/eu.js
new file mode 100644 (file)
index 0000000..659b739
--- /dev/null
@@ -0,0 +1,60 @@
+// moment.js language configuration
+// language : euskara (eu)
+// author : Eneko Illarramendi : https://github.com/eillarra
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+    return moment.lang('eu', {
+        months : "urtarrila_otsaila_martxoa_apirila_maiatza_ekaina_uztaila_abuztua_iraila_urria_azaroa_abendua".split("_"),
+        monthsShort : "urt._ots._mar._api._mai._eka._uzt._abu._ira._urr._aza._abe.".split("_"),
+        weekdays : "igandea_astelehena_asteartea_asteazkena_osteguna_ostirala_larunbata".split("_"),
+        weekdaysShort : "ig._al._ar._az._og._ol._lr.".split("_"),
+        weekdaysMin : "ig_al_ar_az_og_ol_lr".split("_"),
+        longDateFormat : {
+            LT : "HH:mm",
+            L : "YYYY-MM-DD",
+            LL : "YYYY[ko] MMMM[ren] D[a]",
+            LLL : "YYYY[ko] MMMM[ren] D[a] LT",
+            LLLL : "dddd, YYYY[ko] MMMM[ren] D[a] LT",
+            l : "YYYY-M-D",
+            ll : "YYYY[ko] MMM D[a]",
+            lll : "YYYY[ko] MMM D[a] LT",
+            llll : "ddd, YYYY[ko] MMM D[a] LT"
+        },
+        calendar : {
+            sameDay : '[gaur] LT[etan]',
+            nextDay : '[bihar] LT[etan]',
+            nextWeek : 'dddd LT[etan]',
+            lastDay : '[atzo] LT[etan]',
+            lastWeek : '[aurreko] dddd LT[etan]',
+            sameElse : 'L'
+        },
+        relativeTime : {
+            future : "%s barru",
+            past : "duela %s",
+            s : "segundo batzuk",
+            m : "minutu bat",
+            mm : "%d minutu",
+            h : "ordu bat",
+            hh : "%d ordu",
+            d : "egun bat",
+            dd : "%d egun",
+            M : "hilabete bat",
+            MM : "%d hilabete",
+            y : "urte bat",
+            yy : "%d urte"
+        },
+        ordinal : '%d.',
+        week : {
+            dow : 1, // Monday is the first day of the week.
+            doy : 7  // The week that contains Jan 1st is the first week of the year.
+        }
+    });
+}));
diff --git a/resources/lib/moment/lang/fa.js b/resources/lib/moment/lang/fa.js
new file mode 100644 (file)
index 0000000..4a690c4
--- /dev/null
@@ -0,0 +1,97 @@
+// moment.js language configuration
+// language : Persian Language
+// author : Ebrahim Byagowi : https://github.com/ebraminio
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+    var symbolMap = {
+        '1': '۱',
+        '2': '۲',
+        '3': '۳',
+        '4': '۴',
+        '5': '۵',
+        '6': '۶',
+        '7': '۷',
+        '8': '۸',
+        '9': '۹',
+        '0': '۰'
+    }, numberMap = {
+        '۱': '1',
+        '۲': '2',
+        '۳': '3',
+        '۴': '4',
+        '۵': '5',
+        '۶': '6',
+        '۷': '7',
+        '۸': '8',
+        '۹': '9',
+        '۰': '0'
+    };
+
+    return moment.lang('fa', {
+        months : 'ژانویه_فوریه_مارس_آوریل_مه_ژوئن_ژوئیه_اوت_سپتامبر_اکتبر_نوامبر_دسامبر'.split('_'),
+        monthsShort : 'ژانویه_فوریه_مارس_آوریل_مه_ژوئن_ژوئیه_اوت_سپتامبر_اکتبر_نوامبر_دسامبر'.split('_'),
+        weekdays : 'یک\u200cشنبه_دوشنبه_سه\u200cشنبه_چهارشنبه_پنج\u200cشنبه_جمعه_شنبه'.split('_'),
+        weekdaysShort : 'یک\u200cشنبه_دوشنبه_سه\u200cشنبه_چهارشنبه_پنج\u200cشنبه_جمعه_شنبه'.split('_'),
+        weekdaysMin : 'ی_د_س_چ_پ_ج_ش'.split('_'),
+        longDateFormat : {
+            LT : 'HH:mm',
+            L : 'DD/MM/YYYY',
+            LL : 'D MMMM YYYY',
+            LLL : 'D MMMM YYYY LT',
+            LLLL : 'dddd, D MMMM YYYY LT'
+        },
+        meridiem : function (hour, minute, isLower) {
+            if (hour < 12) {
+                return "قبل از ظهر";
+            } else {
+                return "بعد از ظهر";
+            }
+        },
+        calendar : {
+            sameDay : '[امروز ساعت] LT',
+            nextDay : '[فردا ساعت] LT',
+            nextWeek : 'dddd [ساعت] LT',
+            lastDay : '[دیروز ساعت] LT',
+            lastWeek : 'dddd [پیش] [ساعت] LT',
+            sameElse : 'L'
+        },
+        relativeTime : {
+            future : 'در %s',
+            past : '%s پیش',
+            s : 'چندین ثانیه',
+            m : 'یک دقیقه',
+            mm : '%d دقیقه',
+            h : 'یک ساعت',
+            hh : '%d ساعت',
+            d : 'یک روز',
+            dd : '%d روز',
+            M : 'یک ماه',
+            MM : '%d ماه',
+            y : 'یک سال',
+            yy : '%d سال'
+        },
+        preparse: function (string) {
+            return string.replace(/[۰-۹]/g, function (match) {
+                return numberMap[match];
+            }).replace(/،/g, ',');
+        },
+        postformat: function (string) {
+            return string.replace(/\d/g, function (match) {
+                return symbolMap[match];
+            }).replace(/,/g, '،');
+        },
+        ordinal : '%dم',
+        week : {
+            dow : 6, // Saturday is the first day of the week.
+            doy : 12 // The week that contains Jan 1st is the first week of the year.
+        }
+    });
+}));
diff --git a/resources/lib/moment/lang/fi.js b/resources/lib/moment/lang/fi.js
new file mode 100644 (file)
index 0000000..18529c1
--- /dev/null
@@ -0,0 +1,103 @@
+// moment.js language configuration
+// language : finnish (fi)
+// author : Tarmo Aidantausta : https://github.com/bleadof
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+    var numbers_past = 'nolla yksi kaksi kolme neljä viisi kuusi seitsemän kahdeksan yhdeksän'.split(' '),
+        numbers_future = ['nolla', 'yhden', 'kahden', 'kolmen', 'neljän', 'viiden', 'kuuden',
+                          numbers_past[7], numbers_past[8], numbers_past[9]];
+
+    function translate(number, withoutSuffix, key, isFuture) {
+        var result = "";
+        switch (key) {
+        case 's':
+            return isFuture ? 'muutaman sekunnin' : 'muutama sekunti';
+        case 'm':
+            return isFuture ? 'minuutin' : 'minuutti';
+        case 'mm':
+            result = isFuture ? 'minuutin' : 'minuuttia';
+            break;
+        case 'h':
+            return isFuture ? 'tunnin' : 'tunti';
+        case 'hh':
+            result = isFuture ? 'tunnin' : 'tuntia';
+            break;
+        case 'd':
+            return isFuture ? 'päivän' : 'päivä';
+        case 'dd':
+            result = isFuture ? 'päivän' : 'päivää';
+            break;
+        case 'M':
+            return isFuture ? 'kuukauden' : 'kuukausi';
+        case 'MM':
+            result = isFuture ? 'kuukauden' : 'kuukautta';
+            break;
+        case 'y':
+            return isFuture ? 'vuoden' : 'vuosi';
+        case 'yy':
+            result = isFuture ? 'vuoden' : 'vuotta';
+            break;
+        }
+        result = verbal_number(number, isFuture) + " " + result;
+        return result;
+    }
+
+    function verbal_number(number, isFuture) {
+        return number < 10 ? (isFuture ? numbers_future[number] : numbers_past[number]) : number;
+    }
+
+    return moment.lang('fi', {
+        months : "tammikuu_helmikuu_maaliskuu_huhtikuu_toukokuu_kesäkuu_heinäkuu_elokuu_syyskuu_lokakuu_marraskuu_joulukuu".split("_"),
+        monthsShort : "tammi_helmi_maalis_huhti_touko_kesä_heinä_elo_syys_loka_marras_joulu".split("_"),
+        weekdays : "sunnuntai_maanantai_tiistai_keskiviikko_torstai_perjantai_lauantai".split("_"),
+        weekdaysShort : "su_ma_ti_ke_to_pe_la".split("_"),
+        weekdaysMin : "su_ma_ti_ke_to_pe_la".split("_"),
+        longDateFormat : {
+            LT : "HH.mm",
+            L : "DD.MM.YYYY",
+            LL : "Do MMMM[ta] YYYY",
+            LLL : "Do MMMM[ta] YYYY, [klo] LT",
+            LLLL : "dddd, Do MMMM[ta] YYYY, [klo] LT",
+            l : "D.M.YYYY",
+            ll : "Do MMM YYYY",
+            lll : "Do MMM YYYY, [klo] LT",
+            llll : "ddd, Do MMM YYYY, [klo] LT"
+        },
+        calendar : {
+            sameDay : '[tänään] [klo] LT',
+            nextDay : '[huomenna] [klo] LT',
+            nextWeek : 'dddd [klo] LT',
+            lastDay : '[eilen] [klo] LT',
+            lastWeek : '[viime] dddd[na] [klo] LT',
+            sameElse : 'L'
+        },
+        relativeTime : {
+            future : "%s päästä",
+            past : "%s sitten",
+            s : translate,
+            m : translate,
+            mm : translate,
+            h : translate,
+            hh : translate,
+            d : translate,
+            dd : translate,
+            M : translate,
+            MM : translate,
+            y : translate,
+            yy : translate
+        },
+        ordinal : "%d.",
+        week : {
+            dow : 1, // Monday is the first day of the week.
+            doy : 4  // The week that contains Jan 4th is the first week of the year.
+        }
+    });
+}));
diff --git a/resources/lib/moment/lang/fo.js b/resources/lib/moment/lang/fo.js
new file mode 100644 (file)
index 0000000..2f1cbb8
--- /dev/null
@@ -0,0 +1,56 @@
+// moment.js language configuration
+// language : faroese (fo)
+// author : Ragnar Johannesen : https://github.com/ragnar123
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+    return moment.lang('fo', {
+        months : "januar_februar_mars_apríl_mai_juni_juli_august_september_oktober_november_desember".split("_"),
+        monthsShort : "jan_feb_mar_apr_mai_jun_jul_aug_sep_okt_nov_des".split("_"),
+        weekdays : "sunnudagur_mánadagur_týsdagur_mikudagur_hósdagur_fríggjadagur_leygardagur".split("_"),
+        weekdaysShort : "sun_mán_týs_mik_hós_frí_ley".split("_"),
+        weekdaysMin : "su_má_tý_mi_hó_fr_le".split("_"),
+        longDateFormat : {
+            LT : "HH:mm",
+            L : "DD/MM/YYYY",
+            LL : "D MMMM YYYY",
+            LLL : "D MMMM YYYY LT",
+            LLLL : "dddd D. MMMM, YYYY LT"
+        },
+        calendar : {
+            sameDay : '[Í dag kl.] LT',
+            nextDay : '[Í morgin kl.] LT',
+            nextWeek : 'dddd [kl.] LT',
+            lastDay : '[Í gjár kl.] LT',
+            lastWeek : '[síðstu] dddd [kl] LT',
+            sameElse : 'L'
+        },
+        relativeTime : {
+            future : "um %s",
+            past : "%s síðani",
+            s : "fá sekund",
+            m : "ein minutt",
+            mm : "%d minuttir",
+            h : "ein tími",
+            hh : "%d tímar",
+            d : "ein dagur",
+            dd : "%d dagar",
+            M : "ein mánaði",
+            MM : "%d mánaðir",
+            y : "eitt ár",
+            yy : "%d ár"
+        },
+        ordinal : '%d.',
+        week : {
+            dow : 1, // Monday is the first day of the week.
+            doy : 4  // The week that contains Jan 4th is the first week of the year.
+        }
+    });
+}));
diff --git a/resources/lib/moment/lang/fr-ca.js b/resources/lib/moment/lang/fr-ca.js
new file mode 100644 (file)
index 0000000..3280d79
--- /dev/null
@@ -0,0 +1,54 @@
+// moment.js language configuration
+// language : canadian french (fr-ca)
+// author : Jonathan Abourbih : https://github.com/jonbca
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+    return moment.lang('fr-ca', {
+        months : "janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre".split("_"),
+        monthsShort : "janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.".split("_"),
+        weekdays : "dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi".split("_"),
+        weekdaysShort : "dim._lun._mar._mer._jeu._ven._sam.".split("_"),
+        weekdaysMin : "Di_Lu_Ma_Me_Je_Ve_Sa".split("_"),
+        longDateFormat : {
+            LT : "HH:mm",
+            L : "YYYY-MM-DD",
+            LL : "D MMMM YYYY",
+            LLL : "D MMMM YYYY LT",
+            LLLL : "dddd D MMMM YYYY LT"
+        },
+        calendar : {
+            sameDay: "[Aujourd'hui à] LT",
+            nextDay: '[Demain à] LT',
+            nextWeek: 'dddd [à] LT',
+            lastDay: '[Hier à] LT',
+            lastWeek: 'dddd [dernier à] LT',
+            sameElse: 'L'
+        },
+        relativeTime : {
+            future : "dans %s",
+            past : "il y a %s",
+            s : "quelques secondes",
+            m : "une minute",
+            mm : "%d minutes",
+            h : "une heure",
+            hh : "%d heures",
+            d : "un jour",
+            dd : "%d jours",
+            M : "un mois",
+            MM : "%d mois",
+            y : "un an",
+            yy : "%d ans"
+        },
+        ordinal : function (number) {
+            return number + (number === 1 ? 'er' : '');
+        }
+    });
+}));
diff --git a/resources/lib/moment/lang/fr.js b/resources/lib/moment/lang/fr.js
new file mode 100644 (file)
index 0000000..6b3dc52
--- /dev/null
@@ -0,0 +1,58 @@
+// moment.js language configuration
+// language : french (fr)
+// author : John Fischer : https://github.com/jfroffice
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+    return moment.lang('fr', {
+        months : "janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre".split("_"),
+        monthsShort : "janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.".split("_"),
+        weekdays : "dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi".split("_"),
+        weekdaysShort : "dim._lun._mar._mer._jeu._ven._sam.".split("_"),
+        weekdaysMin : "Di_Lu_Ma_Me_Je_Ve_Sa".split("_"),
+        longDateFormat : {
+            LT : "HH:mm",
+            L : "DD/MM/YYYY",
+            LL : "D MMMM YYYY",
+            LLL : "D MMMM YYYY LT",
+            LLLL : "dddd D MMMM YYYY LT"
+        },
+        calendar : {
+            sameDay: "[Aujourd'hui à] LT",
+            nextDay: '[Demain à] LT',
+            nextWeek: 'dddd [à] LT',
+            lastDay: '[Hier à] LT',
+            lastWeek: 'dddd [dernier à] LT',
+            sameElse: 'L'
+        },
+        relativeTime : {
+            future : "dans %s",
+            past : "il y a %s",
+            s : "quelques secondes",
+            m : "une minute",
+            mm : "%d minutes",
+            h : "une heure",
+            hh : "%d heures",
+            d : "un jour",
+            dd : "%d jours",
+            M : "un mois",
+            MM : "%d mois",
+            y : "un an",
+            yy : "%d ans"
+        },
+        ordinal : function (number) {
+            return number + (number === 1 ? 'er' : '');
+        },
+        week : {
+            dow : 1, // Monday is the first day of the week.
+            doy : 4  // The week that contains Jan 4th is the first week of the year.
+        }
+    });
+}));
diff --git a/resources/lib/moment/lang/gl.js b/resources/lib/moment/lang/gl.js
new file mode 100644 (file)
index 0000000..8b14127
--- /dev/null
@@ -0,0 +1,71 @@
+// moment.js language configuration
+// language : galician (gl)
+// author : Juan G. Hurtado : https://github.com/juanghurtado
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+    return moment.lang('gl', {
+        months : "Xaneiro_Febreiro_Marzo_Abril_Maio_Xuño_Xullo_Agosto_Setembro_Outubro_Novembro_Decembro".split("_"),
+        monthsShort : "Xan._Feb._Mar._Abr._Mai._Xuñ._Xul._Ago._Set._Out._Nov._Dec.".split("_"),
+        weekdays : "Domingo_Luns_Martes_Mércores_Xoves_Venres_Sábado".split("_"),
+        weekdaysShort : "Dom._Lun._Mar._Mér._Xov._Ven._Sáb.".split("_"),
+        weekdaysMin : "Do_Lu_Ma_Mé_Xo_Ve_Sá".split("_"),
+        longDateFormat : {
+            LT : "H:mm",
+            L : "DD/MM/YYYY",
+            LL : "D MMMM YYYY",
+            LLL : "D MMMM YYYY LT",
+            LLLL : "dddd D MMMM YYYY LT"
+        },
+        calendar : {
+            sameDay : function () {
+                return '[hoxe ' + ((this.hours() !== 1) ? 'ás' : 'á') + '] LT';
+            },
+            nextDay : function () {
+                return '[mañá ' + ((this.hours() !== 1) ? 'ás' : 'á') + '] LT';
+            },
+            nextWeek : function () {
+                return 'dddd [' + ((this.hours() !== 1) ? 'ás' : 'a') + '] LT';
+            },
+            lastDay : function () {
+                return '[onte ' + ((this.hours() !== 1) ? 'á' : 'a') + '] LT';
+            },
+            lastWeek : function () {
+                return '[o] dddd [pasado ' + ((this.hours() !== 1) ? 'ás' : 'a') + '] LT';
+            },
+            sameElse : 'L'
+        },
+        relativeTime : {
+            future : function (str) {
+                if (str === "uns segundos") {
+                    return "nuns segundos";
+                }
+                return "en " + str;
+            },
+            past : "hai %s",
+            s : "uns segundos",
+            m : "un minuto",
+            mm : "%d minutos",
+            h : "unha hora",
+            hh : "%d horas",
+            d : "un día",
+            dd : "%d días",
+            M : "un mes",
+            MM : "%d meses",
+            y : "un ano",
+            yy : "%d anos"
+        },
+        ordinal : '%dº',
+        week : {
+            dow : 1, // Monday is the first day of the week.
+            doy : 7  // The week that contains Jan 1st is the first week of the year.
+        }
+    });
+}));
diff --git a/resources/lib/moment/lang/he.js b/resources/lib/moment/lang/he.js
new file mode 100644 (file)
index 0000000..b85dbe8
--- /dev/null
@@ -0,0 +1,77 @@
+// moment.js language configuration
+// language : Hebrew (he)
+// author : Tomer Cohen : https://github.com/tomer
+// author : Moshe Simantov : https://github.com/DevelopmentIL
+// author : Tal Ater : https://github.com/TalAter
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+    return moment.lang('he', {
+        months : "ינואר_פברואר_מרץ_אפריל_מאי_יוני_יולי_אוגוסט_ספטמבר_אוקטובר_נובמבר_דצמבר".split("_"),
+        monthsShort : "ינו׳_פבר׳_מרץ_אפר׳_מאי_יוני_יולי_אוג׳_ספט׳_אוק׳_נוב׳_דצמ׳".split("_"),
+        weekdays : "ראשון_שני_שלישי_רביעי_חמישי_שישי_שבת".split("_"),
+        weekdaysShort : "א׳_ב׳_ג׳_ד׳_ה׳_ו׳_ש׳".split("_"),
+        weekdaysMin : "א_ב_ג_ד_ה_ו_ש".split("_"),
+        longDateFormat : {
+            LT : "HH:mm",
+            L : "DD/MM/YYYY",
+            LL : "D [ב]MMMM YYYY",
+            LLL : "D [ב]MMMM YYYY LT",
+            LLLL : "dddd, D [ב]MMMM YYYY LT",
+            l : "D/M/YYYY",
+            ll : "D MMM YYYY",
+            lll : "D MMM YYYY LT",
+            llll : "ddd, D MMM YYYY LT"
+        },
+        calendar : {
+            sameDay : '[היום ב־]LT',
+            nextDay : '[מחר ב־]LT',
+            nextWeek : 'dddd [בשעה] LT',
+            lastDay : '[אתמול ב־]LT',
+            lastWeek : '[ביום] dddd [האחרון בשעה] LT',
+            sameElse : 'L'
+        },
+        relativeTime : {
+            future : "בעוד %s",
+            past : "לפני %s",
+            s : "מספר שניות",
+            m : "דקה",
+            mm : "%d דקות",
+            h : "שעה",
+            hh : function (number) {
+                if (number === 2) {
+                    return "שעתיים";
+                }
+                return number + " שעות";
+            },
+            d : "יום",
+            dd : function (number) {
+                if (number === 2) {
+                    return "יומיים";
+                }
+                return number + " ימים";
+            },
+            M : "חודש",
+            MM : function (number) {
+                if (number === 2) {
+                    return "חודשיים";
+                }
+                return number + " חודשים";
+            },
+            y : "שנה",
+            yy : function (number) {
+                if (number === 2) {
+                    return "שנתיים";
+                }
+                return number + " שנים";
+            }
+        }
+    });
+}));
diff --git a/resources/lib/moment/lang/hi.js b/resources/lib/moment/lang/hi.js
new file mode 100644 (file)
index 0000000..8e6e99c
--- /dev/null
@@ -0,0 +1,105 @@
+// moment.js language configuration
+// language : hindi (hi)
+// author : Mayank Singhal : https://github.com/mayanksinghal
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+    var symbolMap = {
+        '1': '१',
+        '2': '२',
+        '3': '३',
+        '4': '४',
+        '5': '५',
+        '6': '६',
+        '7': '७',
+        '8': '८',
+        '9': '९',
+        '0': '०'
+    },
+    numberMap = {
+        '१': '1',
+        '२': '2',
+        '३': '3',
+        '४': '4',
+        '५': '5',
+        '६': '6',
+        '७': '7',
+        '८': '8',
+        '९': '9',
+        '०': '0'
+    };
+
+    return moment.lang('hi', {
+        months : 'जनवरी_फ़रवरी_मार्च_अप्रैल_मई_जून_जुलाई_अगस्त_सितम्बर_अक्टूबर_नवम्बर_दिसम्बर'.split("_"),
+        monthsShort : 'जन._फ़र._मार्च_अप्रै._मई_जून_जुल._अग._सित._अक्टू._नव._दिस.'.split("_"),
+        weekdays : 'रविवार_सोमवार_मंगलवार_बुधवार_गुरूवार_शुक्रवार_शनिवार'.split("_"),
+        weekdaysShort : 'रवि_सोम_मंगल_बुध_गुरू_शुक्र_शनि'.split("_"),
+        weekdaysMin : 'र_सो_मं_बु_गु_शु_श'.split("_"),
+        longDateFormat : {
+            LT : "A h:mm बजे",
+            L : "DD/MM/YYYY",
+            LL : "D MMMM YYYY",
+            LLL : "D MMMM YYYY, LT",
+            LLLL : "dddd, D MMMM YYYY, LT"
+        },
+        calendar : {
+            sameDay : '[आज] LT',
+            nextDay : '[कल] LT',
+            nextWeek : 'dddd, LT',
+            lastDay : '[कल] LT',
+            lastWeek : '[पिछले] dddd, LT',
+            sameElse : 'L'
+        },
+        relativeTime : {
+            future : "%s में",
+            past : "%s पहले",
+            s : "कुछ ही क्षण",
+            m : "एक मिनट",
+            mm : "%d मिनट",
+            h : "एक घंटा",
+            hh : "%d घंटे",
+            d : "एक दिन",
+            dd : "%d दिन",
+            M : "एक महीने",
+            MM : "%d महीने",
+            y : "एक वर्ष",
+            yy : "%d वर्ष"
+        },
+        preparse: function (string) {
+            return string.replace(/[१२३४५६७८९०]/g, function (match) {
+                return numberMap[match];
+            });
+        },
+        postformat: function (string) {
+            return string.replace(/\d/g, function (match) {
+                return symbolMap[match];
+            });
+        },
+        // Hindi notation for meridiems are quite fuzzy in practice. While there exists
+        // a rigid notion of a 'Pahar' it is not used as rigidly in modern Hindi.
+        meridiem : function (hour, minute, isLower) {
+            if (hour < 4) {
+                return "रात";
+            } else if (hour < 10) {
+                return "सुबह";
+            } else if (hour < 17) {
+                return "दोपहर";
+            } else if (hour < 20) {
+                return "शाम";
+            } else {
+                return "रात";
+            }
+        },
+        week : {
+            dow : 0, // Sunday is the first day of the week.
+            doy : 6  // The week that contains Jan 1st is the first week of the year.
+        }
+    });
+}));
diff --git a/resources/lib/moment/lang/hr.js b/resources/lib/moment/lang/hr.js
new file mode 100644 (file)
index 0000000..2e3bf11
--- /dev/null
@@ -0,0 +1,140 @@
+// moment.js language configuration
+// language : hrvatski (hr)
+// author : Bojan Marković : https://github.com/bmarkovic
+
+// based on (sl) translation by Robert Sedovšek
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+
+    function translate(number, withoutSuffix, key) {
+        var result = number + " ";
+        switch (key) {
+        case 'm':
+            return withoutSuffix ? 'jedna minuta' : 'jedne minute';
+        case 'mm':
+            if (number === 1) {
+                result += 'minuta';
+            } else if (number === 2 || number === 3 || number === 4) {
+                result += 'minute';
+            } else {
+                result += 'minuta';
+            }
+            return result;
+        case 'h':
+            return withoutSuffix ? 'jedan sat' : 'jednog sata';
+        case 'hh':
+            if (number === 1) {
+                result += 'sat';
+            } else if (number === 2 || number === 3 || number === 4) {
+                result += 'sata';
+            } else {
+                result += 'sati';
+            }
+            return result;
+        case 'dd':
+            if (number === 1) {
+                result += 'dan';
+            } else {
+                result += 'dana';
+            }
+            return result;
+        case 'MM':
+            if (number === 1) {
+                result += 'mjesec';
+            } else if (number === 2 || number === 3 || number === 4) {
+                result += 'mjeseca';
+            } else {
+                result += 'mjeseci';
+            }
+            return result;
+        case 'yy':
+            if (number === 1) {
+                result += 'godina';
+            } else if (number === 2 || number === 3 || number === 4) {
+                result += 'godine';
+            } else {
+                result += 'godina';
+            }
+            return result;
+        }
+    }
+
+    return moment.lang('hr', {
+        months : "sječanj_veljača_ožujak_travanj_svibanj_lipanj_srpanj_kolovoz_rujan_listopad_studeni_prosinac".split("_"),
+        monthsShort : "sje._vel._ožu._tra._svi._lip._srp._kol._ruj._lis._stu._pro.".split("_"),
+        weekdays : "nedjelja_ponedjeljak_utorak_srijeda_četvrtak_petak_subota".split("_"),
+        weekdaysShort : "ned._pon._uto._sri._čet._pet._sub.".split("_"),
+        weekdaysMin : "ne_po_ut_sr_če_pe_su".split("_"),
+        longDateFormat : {
+            LT : "H:mm",
+            L : "DD. MM. YYYY",
+            LL : "D. MMMM YYYY",
+            LLL : "D. MMMM YYYY LT",
+            LLLL : "dddd, D. MMMM YYYY LT"
+        },
+        calendar : {
+            sameDay  : '[danas u] LT',
+            nextDay  : '[sutra u] LT',
+
+            nextWeek : function () {
+                switch (this.day()) {
+                case 0:
+                    return '[u] [nedjelju] [u] LT';
+                case 3:
+                    return '[u] [srijedu] [u] LT';
+                case 6:
+                    return '[u] [subotu] [u] LT';
+                case 1:
+                case 2:
+                case 4:
+                case 5:
+                    return '[u] dddd [u] LT';
+                }
+            },
+            lastDay  : '[jučer u] LT',
+            lastWeek : function () {
+                switch (this.day()) {
+                case 0:
+                case 3:
+                    return '[prošlu] dddd [u] LT';
+                case 6:
+                    return '[prošle] [subote] [u] LT';
+                case 1:
+                case 2:
+                case 4:
+                case 5:
+                    return '[prošli] dddd [u] LT';
+                }
+            },
+            sameElse : 'L'
+        },
+        relativeTime : {
+            future : "za %s",
+            past   : "prije %s",
+            s      : "par sekundi",
+            m      : translate,
+            mm     : translate,
+            h      : translate,
+            hh     : translate,
+            d      : "dan",
+            dd     : translate,
+            M      : "mjesec",
+            MM     : translate,
+            y      : "godinu",
+            yy     : translate
+        },
+        ordinal : '%d.',
+        week : {
+            dow : 1, // Monday is the first day of the week.
+            doy : 7  // The week that contains Jan 1st is the first week of the year.
+        }
+    });
+}));
diff --git a/resources/lib/moment/lang/hu.js b/resources/lib/moment/lang/hu.js
new file mode 100644 (file)
index 0000000..4d84ebd
--- /dev/null
@@ -0,0 +1,98 @@
+// moment.js language configuration
+// language : hungarian (hu)
+// author : Adam Brunner : https://github.com/adambrunner
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+    var weekEndings = 'vasárnap hétfőn kedden szerdán csütörtökön pénteken szombaton'.split(' ');
+
+    function translate(number, withoutSuffix, key, isFuture) {
+        var num = number,
+            suffix;
+
+        switch (key) {
+        case 's':
+            return (isFuture || withoutSuffix) ? 'néhány másodperc' : 'néhány másodperce';
+        case 'm':
+            return 'egy' + (isFuture || withoutSuffix ? ' perc' : ' perce');
+        case 'mm':
+            return num + (isFuture || withoutSuffix ? ' perc' : ' perce');
+        case 'h':
+            return 'egy' + (isFuture || withoutSuffix ? ' óra' : ' órája');
+        case 'hh':
+            return num + (isFuture || withoutSuffix ? ' óra' : ' órája');
+        case 'd':
+            return 'egy' + (isFuture || withoutSuffix ? ' nap' : ' napja');
+        case 'dd':
+            return num + (isFuture || withoutSuffix ? ' nap' : ' napja');
+        case 'M':
+            return 'egy' + (isFuture || withoutSuffix ? ' hónap' : ' hónapja');
+        case 'MM':
+            return num + (isFuture || withoutSuffix ? ' hónap' : ' hónapja');
+        case 'y':
+            return 'egy' + (isFuture || withoutSuffix ? ' év' : ' éve');
+        case 'yy':
+            return num + (isFuture || withoutSuffix ? ' év' : ' éve');
+        }
+
+        return '';
+    }
+
+    function week(isFuture) {
+        return (isFuture ? '' : '[múlt] ') + '[' + weekEndings[this.day()] + '] LT[-kor]';
+    }
+
+    return moment.lang('hu', {
+        months : "január_február_március_április_május_június_július_augusztus_szeptember_október_november_december".split("_"),
+        monthsShort : "jan_feb_márc_ápr_máj_jún_júl_aug_szept_okt_nov_dec".split("_"),
+        weekdays : "vasárnap_hétfő_kedd_szerda_csütörtök_péntek_szombat".split("_"),
+        weekdaysShort : "vas_hét_kedd_sze_csüt_pén_szo".split("_"),
+        weekdaysMin : "v_h_k_sze_cs_p_szo".split("_"),
+        longDateFormat : {
+            LT : "H:mm",
+            L : "YYYY.MM.DD.",
+            LL : "YYYY. MMMM D.",
+            LLL : "YYYY. MMMM D., LT",
+            LLLL : "YYYY. MMMM D., dddd LT"
+        },
+        calendar : {
+            sameDay : '[ma] LT[-kor]',
+            nextDay : '[holnap] LT[-kor]',
+            nextWeek : function () {
+                return week.call(this, true);
+            },
+            lastDay : '[tegnap] LT[-kor]',
+            lastWeek : function () {
+                return week.call(this, false);
+            },
+            sameElse : 'L'
+        },
+        relativeTime : {
+            future : "%s múlva",
+            past : "%s",
+            s : translate,
+            m : translate,
+            mm : translate,
+            h : translate,
+            hh : translate,
+            d : translate,
+            dd : translate,
+            M : translate,
+            MM : translate,
+            y : translate,
+            yy : translate
+        },
+        ordinal : '%d.',
+        week : {
+            dow : 1, // Monday is the first day of the week.
+            doy : 7  // The week that contains Jan 1st is the first week of the year.
+        }
+    });
+}));
diff --git a/resources/lib/moment/lang/hy-am.js b/resources/lib/moment/lang/hy-am.js
new file mode 100644 (file)
index 0000000..951655b
--- /dev/null
@@ -0,0 +1,113 @@
+// moment.js language configuration
+// language : Armenian (hy-am)
+// author : Armendarabyan : https://github.com/armendarabyan
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+
+    function monthsCaseReplace(m, format) {
+        var months = {
+            'nominative': 'հունվար_փետրվար_մարտ_ապրիլ_մայիս_հունիս_հուլիս_օգոստոս_սեպտեմբեր_հոկտեմբեր_նոյեմբեր_դեկտեմբեր'.split('_'),
+            'accusative': 'հունվարի_փետրվարի_մարտի_ապրիլի_մայիսի_հունիսի_հուլիսի_օգոստոսի_սեպտեմբերի_հոկտեմբերի_նոյեմբերի_դեկտեմբերի'.split('_')
+        },
+
+        nounCase = (/D[oD]?(\[[^\[\]]*\]|\s+)+MMMM?/).test(format) ?
+            'accusative' :
+            'nominative';
+
+        return months[nounCase][m.month()];
+    }
+
+    function monthsShortCaseReplace(m, format) {
+        var monthsShort = 'հնվ_փտր_մրտ_ապր_մյս_հնս_հլս_օգս_սպտ_հկտ_նմբ_դկտ'.split('_');
+
+        return monthsShort[m.month()];
+    }
+
+    function weekdaysCaseReplace(m, format) {
+        var weekdays = 'կիրակի_երկուշաբթի_երեքշաբթի_չորեքշաբթի_հինգշաբթի_ուրբաթ_շաբաթ'.split('_');
+
+        return weekdays[m.day()];
+    }
+
+    return moment.lang('hy-am', {
+        months : monthsCaseReplace,
+        monthsShort : monthsShortCaseReplace,
+        weekdays : weekdaysCaseReplace,
+        weekdaysShort : "կրկ_երկ_երք_չրք_հնգ_ուրբ_շբթ".split("_"),
+        weekdaysMin : "կրկ_երկ_երք_չրք_հնգ_ուրբ_շբթ".split("_"),
+        longDateFormat : {
+            LT : "HH:mm",
+            L : "DD.MM.YYYY",
+            LL : "D MMMM YYYY թ.",
+            LLL : "D MMMM YYYY թ., LT",
+            LLLL : "dddd, D MMMM YYYY թ., LT"
+        },
+        calendar : {
+            sameDay: '[այսօր] LT',
+            nextDay: '[վաղը] LT',
+            lastDay: '[երեկ] LT',
+            nextWeek: function () {
+                return 'dddd [օրը ժամը] LT';
+            },
+            lastWeek: function () {
+                return '[անցած] dddd [օրը ժամը] LT';
+            },
+            sameElse: 'L'
+        },
+        relativeTime : {
+            future : "%s հետո",
+            past : "%s առաջ",
+            s : "մի քանի վայրկյան",
+            m : "րոպե",
+            mm : "%d րոպե",
+            h : "ժամ",
+            hh : "%d ժամ",
+            d : "օր",
+            dd : "%d օր",
+            M : "ամիս",
+            MM : "%d ամիս",
+            y : "տարի",
+            yy : "%d տարի"
+        },
+
+        meridiem : function (hour) {
+            if (hour < 4) {
+                return "գիշերվա";
+            } else if (hour < 12) {
+                return "առավոտվա";
+            } else if (hour < 17) {
+                return "ցերեկվա";
+            } else {
+                return "երեկոյան";
+            }
+        },
+
+        ordinal: function (number, period) {
+            switch (period) {
+            case 'DDD':
+            case 'w':
+            case 'W':
+            case 'DDDo':
+                if (number === 1) {
+                    return number + '-ին';
+                }
+                return number + '-րդ';
+            default:
+                return number;
+            }
+        },
+
+        week : {
+            dow : 1, // Monday is the first day of the week.
+            doy : 7  // The week that contains Jan 1st is the first week of the year.
+        }
+    });
+}));
diff --git a/resources/lib/moment/lang/id.js b/resources/lib/moment/lang/id.js
new file mode 100644 (file)
index 0000000..f186280
--- /dev/null
@@ -0,0 +1,67 @@
+// moment.js language configuration
+// language : Bahasa Indonesia (id)
+// author : Mohammad Satrio Utomo : https://github.com/tyok
+// reference: http://id.wikisource.org/wiki/Pedoman_Umum_Ejaan_Bahasa_Indonesia_yang_Disempurnakan
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+    return moment.lang('id', {
+        months : "Januari_Februari_Maret_April_Mei_Juni_Juli_Agustus_September_Oktober_November_Desember".split("_"),
+        monthsShort : "Jan_Feb_Mar_Apr_Mei_Jun_Jul_Ags_Sep_Okt_Nov_Des".split("_"),
+        weekdays : "Minggu_Senin_Selasa_Rabu_Kamis_Jumat_Sabtu".split("_"),
+        weekdaysShort : "Min_Sen_Sel_Rab_Kam_Jum_Sab".split("_"),
+        weekdaysMin : "Mg_Sn_Sl_Rb_Km_Jm_Sb".split("_"),
+        longDateFormat : {
+            LT : "HH.mm",
+            L : "DD/MM/YYYY",
+            LL : "D MMMM YYYY",
+            LLL : "D MMMM YYYY [pukul] LT",
+            LLLL : "dddd, D MMMM YYYY [pukul] LT"
+        },
+        meridiem : function (hours, minutes, isLower) {
+            if (hours < 11) {
+                return 'pagi';
+            } else if (hours < 15) {
+                return 'siang';
+            } else if (hours < 19) {
+                return 'sore';
+            } else {
+                return 'malam';
+            }
+        },
+        calendar : {
+            sameDay : '[Hari ini pukul] LT',
+            nextDay : '[Besok pukul] LT',
+            nextWeek : 'dddd [pukul] LT',
+            lastDay : '[Kemarin pukul] LT',
+            lastWeek : 'dddd [lalu pukul] LT',
+            sameElse : 'L'
+        },
+        relativeTime : {
+            future : "dalam %s",
+            past : "%s yang lalu",
+            s : "beberapa detik",
+            m : "semenit",
+            mm : "%d menit",
+            h : "sejam",
+            hh : "%d jam",
+            d : "sehari",
+            dd : "%d hari",
+            M : "sebulan",
+            MM : "%d bulan",
+            y : "setahun",
+            yy : "%d tahun"
+        },
+        week : {
+            dow : 1, // Monday is the first day of the week.
+            doy : 7  // The week that contains Jan 1st is the first week of the year.
+        }
+    });
+}));
diff --git a/resources/lib/moment/lang/is.js b/resources/lib/moment/lang/is.js
new file mode 100644 (file)
index 0000000..5b6b2a8
--- /dev/null
@@ -0,0 +1,124 @@
+// moment.js language configuration
+// language : icelandic (is)
+// author : Hinrik Örn Sigurðsson : https://github.com/hinrik
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+    function plural(n) {
+        if (n % 100 === 11) {
+            return true;
+        } else if (n % 10 === 1) {
+            return false;
+        }
+        return true;
+    }
+
+    function translate(number, withoutSuffix, key, isFuture) {
+        var result = number + " ";
+        switch (key) {
+        case 's':
+            return withoutSuffix || isFuture ? 'nokkrar sekúndur' : 'nokkrum sekúndum';
+        case 'm':
+            return withoutSuffix ? 'mínúta' : 'mínútu';
+        case 'mm':
+            if (plural(number)) {
+                return result + (withoutSuffix || isFuture ? 'mínútur' : 'mínútum');
+            } else if (withoutSuffix) {
+                return result + 'mínúta';
+            }
+            return result + 'mínútu';
+        case 'hh':
+            if (plural(number)) {
+                return result + (withoutSuffix || isFuture ? 'klukkustundir' : 'klukkustundum');
+            }
+            return result + 'klukkustund';
+        case 'd':
+            if (withoutSuffix) {
+                return 'dagur';
+            }
+            return isFuture ? 'dag' : 'degi';
+        case 'dd':
+            if (plural(number)) {
+                if (withoutSuffix) {
+                    return result + 'dagar';
+                }
+                return result + (isFuture ? 'daga' : 'dögum');
+            } else if (withoutSuffix) {
+                return result + 'dagur';
+            }
+            return result + (isFuture ? 'dag' : 'degi');
+        case 'M':
+            if (withoutSuffix) {
+                return 'mánuður';
+            }
+            return isFuture ? 'mánuð' : 'mánuði';
+        case 'MM':
+            if (plural(number)) {
+                if (withoutSuffix) {
+                    return result + 'mánuðir';
+                }
+                return result + (isFuture ? 'mánuði' : 'mánuðum');
+            } else if (withoutSuffix) {
+                return result + 'mánuður';
+            }
+            return result + (isFuture ? 'mánuð' : 'mánuði');
+        case 'y':
+            return withoutSuffix || isFuture ? 'ár' : 'ári';
+        case 'yy':
+            if (plural(number)) {
+                return result + (withoutSuffix || isFuture ? 'ár' : 'árum');
+            }
+            return result + (withoutSuffix || isFuture ? 'ár' : 'ári');
+        }
+    }
+
+    return moment.lang('is', {
+        months : "janúar_febrúar_mars_apríl_maí_júní_júlí_ágúst_september_október_nóvember_desember".split("_"),
+        monthsShort : "jan_feb_mar_apr_maí_jún_júl_ágú_sep_okt_nóv_des".split("_"),
+        weekdays : "sunnudagur_mánudagur_þriðjudagur_miðvikudagur_fimmtudagur_föstudagur_laugardagur".split("_"),
+        weekdaysShort : "sun_mán_þri_mið_fim_fös_lau".split("_"),
+        weekdaysMin : "Su_Má_Þr_Mi_Fi_Fö_La".split("_"),
+        longDateFormat : {
+            LT : "H:mm",
+            L : "DD/MM/YYYY",
+            LL : "D. MMMM YYYY",
+            LLL : "D. MMMM YYYY [kl.] LT",
+            LLLL : "dddd, D. MMMM YYYY [kl.] LT"
+        },
+        calendar : {
+            sameDay : '[í dag kl.] LT',
+            nextDay : '[á morgun kl.] LT',
+            nextWeek : 'dddd [kl.] LT',
+            lastDay : '[í gær kl.] LT',
+            lastWeek : '[síðasta] dddd [kl.] LT',
+            sameElse : 'L'
+        },
+        relativeTime : {
+            future : "eftir %s",
+            past : "fyrir %s síðan",
+            s : translate,
+            m : translate,
+            mm : translate,
+            h : "klukkustund",
+            hh : translate,
+            d : translate,
+            dd : translate,
+            M : translate,
+            MM : translate,
+            y : translate,
+            yy : translate
+        },
+        ordinal : '%d.',
+        week : {
+            dow : 1, // Monday is the first day of the week.
+            doy : 4  // The week that contains Jan 4th is the first week of the year.
+        }
+    });
+}));
diff --git a/resources/lib/moment/lang/it.js b/resources/lib/moment/lang/it.js
new file mode 100644 (file)
index 0000000..84b7698
--- /dev/null
@@ -0,0 +1,59 @@
+// moment.js language configuration
+// language : italian (it)
+// author : Lorenzo : https://github.com/aliem
+// author: Mattia Larentis: https://github.com/nostalgiaz
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+    return moment.lang('it', {
+        months : "Gennaio_Febbraio_Marzo_Aprile_Maggio_Giugno_Luglio_Agosto_Settembre_Ottobre_Novembre_Dicembre".split("_"),
+        monthsShort : "Gen_Feb_Mar_Apr_Mag_Giu_Lug_Ago_Set_Ott_Nov_Dic".split("_"),
+        weekdays : "Domenica_Lunedì_Martedì_Mercoledì_Giovedì_Venerdì_Sabato".split("_"),
+        weekdaysShort : "Dom_Lun_Mar_Mer_Gio_Ven_Sab".split("_"),
+        weekdaysMin : "D_L_Ma_Me_G_V_S".split("_"),
+        longDateFormat : {
+            LT : "HH:mm",
+            L : "DD/MM/YYYY",
+            LL : "D MMMM YYYY",
+            LLL : "D MMMM YYYY LT",
+            LLLL : "dddd, D MMMM YYYY LT"
+        },
+        calendar : {
+            sameDay: '[Oggi alle] LT',
+            nextDay: '[Domani alle] LT',
+            nextWeek: 'dddd [alle] LT',
+            lastDay: '[Ieri alle] LT',
+            lastWeek: '[lo scorso] dddd [alle] LT',
+            sameElse: 'L'
+        },
+        relativeTime : {
+            future : function (s) {
+                return ((/^[0-9].+$/).test(s) ? "tra" : "in") + " " + s;
+            },
+            past : "%s fa",
+            s : "alcuni secondi",
+            m : "un minuto",
+            mm : "%d minuti",
+            h : "un'ora",
+            hh : "%d ore",
+            d : "un giorno",
+            dd : "%d giorni",
+            M : "un mese",
+            MM : "%d mesi",
+            y : "un anno",
+            yy : "%d anni"
+        },
+        ordinal: '%dº',
+        week : {
+            dow : 1, // Monday is the first day of the week.
+            doy : 4  // The week that contains Jan 4th is the first week of the year.
+        }
+    });
+}));
diff --git a/resources/lib/moment/lang/ja.js b/resources/lib/moment/lang/ja.js
new file mode 100644 (file)
index 0000000..9cd7e9e
--- /dev/null
@@ -0,0 +1,58 @@
+// moment.js language configuration
+// language : japanese (ja)
+// author : LI Long : https://github.com/baryon
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+    return moment.lang('ja', {
+        months : "1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月".split("_"),
+        monthsShort : "1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月".split("_"),
+        weekdays : "日曜日_月曜日_火曜日_水曜日_木曜日_金曜日_土曜日".split("_"),
+        weekdaysShort : "日_月_火_水_木_金_土".split("_"),
+        weekdaysMin : "日_月_火_水_木_金_土".split("_"),
+        longDateFormat : {
+            LT : "Ah時m分",
+            L : "YYYY/MM/DD",
+            LL : "YYYY年M月D日",
+            LLL : "YYYY年M月D日LT",
+            LLLL : "YYYY年M月D日LT dddd"
+        },
+        meridiem : function (hour, minute, isLower) {
+            if (hour < 12) {
+                return "午前";
+            } else {
+                return "午後";
+            }
+        },
+        calendar : {
+            sameDay : '[今日] LT',
+            nextDay : '[明日] LT',
+            nextWeek : '[来週]dddd LT',
+            lastDay : '[昨日] LT',
+            lastWeek : '[前週]dddd LT',
+            sameElse : 'L'
+        },
+        relativeTime : {
+            future : "%s後",
+            past : "%s前",
+            s : "数秒",
+            m : "1分",
+            mm : "%d分",
+            h : "1時間",
+            hh : "%d時間",
+            d : "1日",
+            dd : "%d日",
+            M : "1ヶ月",
+            MM : "%dヶ月",
+            y : "1年",
+            yy : "%d年"
+        }
+    });
+}));
diff --git a/resources/lib/moment/lang/ka.js b/resources/lib/moment/lang/ka.js
new file mode 100644 (file)
index 0000000..0cebdaa
--- /dev/null
@@ -0,0 +1,108 @@
+// moment.js language configuration
+// language : Georgian (ka)
+// author : Irakli Janiashvili : https://github.com/irakli-janiashvili
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+
+    function monthsCaseReplace(m, format) {
+        var months = {
+            'nominative': 'იანვარი_თებერვალი_მარტი_აპრილი_მაისი_ივნისი_ივლისი_აგვისტო_სექტემბერი_ოქტომბერი_ნოემბერი_დეკემბერი'.split('_'),
+            'accusative': 'იანვარს_თებერვალს_მარტს_აპრილის_მაისს_ივნისს_ივლისს_აგვისტს_სექტემბერს_ოქტომბერს_ნოემბერს_დეკემბერს'.split('_')
+        },
+
+        nounCase = (/D[oD] *MMMM?/).test(format) ?
+            'accusative' :
+            'nominative';
+
+        return months[nounCase][m.month()];
+    }
+
+    function weekdaysCaseReplace(m, format) {
+        var weekdays = {
+            'nominative': 'კვირა_ორშაბათი_სამშაბათი_ოთხშაბათი_ხუთშაბათი_პარასკევი_შაბათი'.split('_'),
+            'accusative': 'კვირას_ორშაბათს_სამშაბათს_ოთხშაბათს_ხუთშაბათს_პარასკევს_შაბათს'.split('_')
+        },
+
+        nounCase = (/(წინა|შემდეგ)/).test(format) ?
+            'accusative' :
+            'nominative';
+
+        return weekdays[nounCase][m.day()];
+    }
+
+    return moment.lang('ka', {
+        months : monthsCaseReplace,
+        monthsShort : "იან_თებ_მარ_აპრ_მაი_ივნ_ივლ_აგვ_სექ_ოქტ_ნოე_დეკ".split("_"),
+        weekdays : weekdaysCaseReplace,
+        weekdaysShort : "კვი_ორშ_სამ_ოთხ_ხუთ_პარ_შაბ".split("_"),
+        weekdaysMin : "კვ_ორ_სა_ოთ_ხუ_პა_შა".split("_"),
+        longDateFormat : {
+            LT : "h:mm A",
+            L : "DD/MM/YYYY",
+            LL : "D MMMM YYYY",
+            LLL : "D MMMM YYYY LT",
+            LLLL : "dddd, D MMMM YYYY LT"
+        },
+        calendar : {
+            sameDay : '[დღეს] LT[-ზე]',
+            nextDay : '[ხვალ] LT[-ზე]',
+            lastDay : '[გუშინ] LT[-ზე]',
+            nextWeek : '[შემდეგ] dddd LT[-ზე]',
+            lastWeek : '[წინა] dddd LT-ზე',
+            sameElse : 'L'
+        },
+        relativeTime : {
+            future : function (s) {
+                return (/(წამი|წუთი|საათი|წელი)/).test(s) ?
+                    s.replace(/ი$/, "ში") :
+                    s + "ში";
+            },
+            past : function (s) {
+                if ((/(წამი|წუთი|საათი|დღე|თვე)/).test(s)) {
+                    return s.replace(/(ი|ე)$/, "ის წინ");
+                }
+                if ((/წელი/).test(s)) {
+                    return s.replace(/წელი$/, "წლის წინ");
+                }
+            },
+            s : "რამდენიმე წამი",
+            m : "წუთი",
+            mm : "%d წუთი",
+            h : "საათი",
+            hh : "%d საათი",
+            d : "დღე",
+            dd : "%d დღე",
+            M : "თვე",
+            MM : "%d თვე",
+            y : "წელი",
+            yy : "%d წელი"
+        },
+        ordinal : function (number) {
+            if (number === 0) {
+                return number;
+            }
+
+            if (number === 1) {
+                return number + "-ლი";
+            }
+
+            if ((number < 20) || (number <= 100 && (number % 20 === 0)) || (number % 100 === 0)) {
+                return "მე-" + number;
+            }
+
+            return number + "-ე";
+        },
+        week : {
+            dow : 1,
+            doy : 7
+        }
+    });
+}));
diff --git a/resources/lib/moment/lang/ko.js b/resources/lib/moment/lang/ko.js
new file mode 100644 (file)
index 0000000..3b469df
--- /dev/null
@@ -0,0 +1,63 @@
+// moment.js language configuration
+// language : korean (ko)
+//
+// authors 
+//
+// - Kyungwook, Park : https://github.com/kyungw00k
+// - Jeeeyul Lee <jeeeyul@gmail.com>
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+    return moment.lang('ko', {
+        months : "1월_2월_3월_4월_5월_6월_7월_8월_9월_10월_11월_12월".split("_"),
+        monthsShort : "1월_2월_3월_4월_5월_6월_7월_8월_9월_10월_11월_12월".split("_"),
+        weekdays : "일요일_월요일_화요일_수요일_목요일_금요일_토요일".split("_"),
+        weekdaysShort : "일_월_화_수_목_금_토".split("_"),
+        weekdaysMin : "일_월_화_수_목_금_토".split("_"),
+        longDateFormat : {
+            LT : "A h시 mm분",
+            L : "YYYY.MM.DD",
+            LL : "YYYY년 MMMM D일",
+            LLL : "YYYY년 MMMM D일 LT",
+            LLLL : "YYYY년 MMMM D일 dddd LT"
+        },
+        meridiem : function (hour, minute, isUpper) {
+            return hour < 12 ? '오전' : '오후';
+        },
+        calendar : {
+            sameDay : '오늘 LT',
+            nextDay : '내일 LT',
+            nextWeek : 'dddd LT',
+            lastDay : '어제 LT',
+            lastWeek : '지난주 dddd LT',
+            sameElse : 'L'
+        },
+        relativeTime : {
+            future : "%s 후",
+            past : "%s 전",
+            s : "몇초",
+            ss : "%d초",
+            m : "일분",
+            mm : "%d분",
+            h : "한시간",
+            hh : "%d시간",
+            d : "하루",
+            dd : "%d일",
+            M : "한달",
+            MM : "%d달",
+            y : "일년",
+            yy : "%d년"
+        },
+        ordinal : '%d일',
+        meridiemParse : /(오전|오후)/,
+        isPM : function (token) {
+            return token === "오후";
+        }
+    });
+}));
diff --git a/resources/lib/moment/lang/lb.js b/resources/lib/moment/lang/lb.js
new file mode 100644 (file)
index 0000000..946ba13
--- /dev/null
@@ -0,0 +1,160 @@
+// moment.js language configuration
+// language : Luxembourgish (lb)
+// author : mweimerskirch : https://github.com/mweimerskirch
+
+// Note: Luxembourgish has a very particular phonological rule ("Eifeler Regel") that causes the
+// deletion of the final "n" in certain contexts. That's what the "eifelerRegelAppliesToWeekday"
+// and "eifelerRegelAppliesToNumber" methods are meant for
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+    function processRelativeTime(number, withoutSuffix, key, isFuture) {
+        var format = {
+            'm': ['eng Minutt', 'enger Minutt'],
+            'h': ['eng Stonn', 'enger Stonn'],
+            'd': ['een Dag', 'engem Dag'],
+            'dd': [number + ' Deeg', number + ' Deeg'],
+            'M': ['ee Mount', 'engem Mount'],
+            'MM': [number + ' Méint', number + ' Méint'],
+            'y': ['ee Joer', 'engem Joer'],
+            'yy': [number + ' Joer', number + ' Joer']
+        };
+        return withoutSuffix ? format[key][0] : format[key][1];
+    }
+
+    function processFutureTime(string) {
+        var number = string.substr(0, string.indexOf(' '));
+        if (eifelerRegelAppliesToNumber(number)) {
+            return "a " + string;
+        }
+        return "an " + string;
+    }
+
+    function processPastTime(string) {
+        var number = string.substr(0, string.indexOf(' '));
+        if (eifelerRegelAppliesToNumber(number)) {
+            return "viru " + string;
+        }
+        return "virun " + string;
+    }
+
+    function processLastWeek(string1) {
+        var weekday = this.format('d');
+        if (eifelerRegelAppliesToWeekday(weekday)) {
+            return '[Leschte] dddd [um] LT';
+        }
+        return '[Leschten] dddd [um] LT';
+    }
+
+    /**
+     * Returns true if the word before the given week day loses the "-n" ending.
+     * e.g. "Leschten Dënschdeg" but "Leschte Méindeg"
+     *
+     * @param weekday {integer}
+     * @returns {boolean}
+     */
+    function eifelerRegelAppliesToWeekday(weekday) {
+        weekday = parseInt(weekday, 10);
+        switch (weekday) {
+        case 0: // Sonndeg
+        case 1: // Méindeg
+        case 3: // Mëttwoch
+        case 5: // Freideg
+        case 6: // Samschdeg
+            return true;
+        default: // 2 Dënschdeg, 4 Donneschdeg
+            return false;
+        }
+    }
+
+    /**
+     * Returns true if the word before the given number loses the "-n" ending.
+     * e.g. "an 10 Deeg" but "a 5 Deeg"
+     *
+     * @param number {integer}
+     * @returns {boolean}
+     */
+    function eifelerRegelAppliesToNumber(number) {
+        number = parseInt(number, 10);
+        if (isNaN(number)) {
+            return false;
+        }
+        if (number < 0) {
+            // Negative Number --> always true
+            return true;
+        } else if (number < 10) {
+            // Only 1 digit
+            if (4 <= number && number <= 7) {
+                return true;
+            }
+            return false;
+        } else if (number < 100) {
+            // 2 digits
+            var lastDigit = number % 10, firstDigit = number / 10;
+            if (lastDigit === 0) {
+                return eifelerRegelAppliesToNumber(firstDigit);
+            }
+            return eifelerRegelAppliesToNumber(lastDigit);
+        } else if (number < 10000) {
+            // 3 or 4 digits --> recursively check first digit
+            while (number >= 10) {
+                number = number / 10;
+            }
+            return eifelerRegelAppliesToNumber(number);
+        } else {
+            // Anything larger than 4 digits: recursively check first n-3 digits
+            number = number / 1000;
+            return eifelerRegelAppliesToNumber(number);
+        }
+    }
+
+    return moment.lang('lb', {
+        months: "Januar_Februar_Mäerz_Abrëll_Mee_Juni_Juli_August_September_Oktober_November_Dezember".split("_"),
+        monthsShort: "Jan._Febr._Mrz._Abr._Mee_Jun._Jul._Aug._Sept._Okt._Nov._Dez.".split("_"),
+        weekdays: "Sonndeg_Méindeg_Dënschdeg_Mëttwoch_Donneschdeg_Freideg_Samschdeg".split("_"),
+        weekdaysShort: "So._Mé._Dë._Më._Do._Fr._Sa.".split("_"),
+        weekdaysMin: "So_Mé_Dë_Më_Do_Fr_Sa".split("_"),
+        longDateFormat: {
+            LT: "H:mm [Auer]",
+            L: "DD.MM.YYYY",
+            LL: "D. MMMM YYYY",
+            LLL: "D. MMMM YYYY LT",
+            LLLL: "dddd, D. MMMM YYYY LT"
+        },
+        calendar: {
+            sameDay: "[Haut um] LT",
+            sameElse: "L",
+            nextDay: '[Muer um] LT',
+            nextWeek: 'dddd [um] LT',
+            lastDay: '[Gëschter um] LT',
+            lastWeek: processLastWeek
+        },
+        relativeTime: {
+            future: processFutureTime,
+            past: processPastTime,
+            s: "e puer Sekonnen",
+            m: processRelativeTime,
+            mm: "%d Minutten",
+            h: processRelativeTime,
+            hh: "%d Stonnen",
+            d: processRelativeTime,
+            dd: processRelativeTime,
+            M: processRelativeTime,
+            MM: processRelativeTime,
+            y: processRelativeTime,
+            yy: processRelativeTime
+        },
+        ordinal: '%d.',
+        week: {
+            dow: 1, // Monday is the first day of the week.
+            doy: 4  // The week that contains Jan 4th is the first week of the year.
+        }
+    });
+}));
diff --git a/resources/lib/moment/lang/lt.js b/resources/lib/moment/lang/lt.js
new file mode 100644 (file)
index 0000000..1cf6457
--- /dev/null
@@ -0,0 +1,118 @@
+// moment.js language configuration
+// language : Lithuanian (lt)
+// author : Mindaugas Mozūras : https://github.com/mmozuras
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+    var units = {
+        "m" : "minutė_minutės_minutę",
+        "mm": "minutės_minučių_minutes",
+        "h" : "valanda_valandos_valandą",
+        "hh": "valandos_valandų_valandas",
+        "d" : "diena_dienos_dieną",
+        "dd": "dienos_dienų_dienas",
+        "M" : "mėnuo_mėnesio_mėnesį",
+        "MM": "mėnesiai_mėnesių_mėnesius",
+        "y" : "metai_metų_metus",
+        "yy": "metai_metų_metus"
+    },
+    weekDays = "pirmadienis_antradienis_trečiadienis_ketvirtadienis_penktadienis_šeštadienis_sekmadienis".split("_");
+
+    function translateSeconds(number, withoutSuffix, key, isFuture) {
+        if (withoutSuffix) {
+            return "kelios sekundės";
+        } else {
+            return isFuture ? "kelių sekundžių" : "kelias sekundes";
+        }
+    }
+
+    function translateSingular(number, withoutSuffix, key, isFuture) {
+        return withoutSuffix ? forms(key)[0] : (isFuture ? forms(key)[1] : forms(key)[2]);
+    }
+
+    function special(number) {
+        return number % 10 === 0 || (number > 10 && number < 20);
+    }
+
+    function forms(key) {
+        return units[key].split("_");
+    }
+
+    function translate(number, withoutSuffix, key, isFuture) {
+        var result = number + " ";
+        if (number === 1) {
+            return result + translateSingular(number, withoutSuffix, key[0], isFuture);
+        } else if (withoutSuffix) {
+            return result + (special(number) ? forms(key)[1] : forms(key)[0]);
+        } else {
+            if (isFuture) {
+                return result + forms(key)[1];
+            } else {
+                return result + (special(number) ? forms(key)[1] : forms(key)[2]);
+            }
+        }
+    }
+
+    function relativeWeekDay(moment, format) {
+        var nominative = format.indexOf('dddd LT') === -1,
+            weekDay = weekDays[moment.weekday()];
+
+        return nominative ? weekDay : weekDay.substring(0, weekDay.length - 2) + "į";
+    }
+
+    return moment.lang("lt", {
+        months : "sausio_vasario_kovo_balandžio_gegužės_biržėlio_liepos_rugpjūčio_rugsėjo_spalio_lapkričio_gruodžio".split("_"),
+        monthsShort : "sau_vas_kov_bal_geg_bir_lie_rgp_rgs_spa_lap_grd".split("_"),
+        weekdays : relativeWeekDay,
+        weekdaysShort : "Sek_Pir_Ant_Tre_Ket_Pen_Šeš".split("_"),
+        weekdaysMin : "S_P_A_T_K_Pn_Š".split("_"),
+        longDateFormat : {
+            LT : "HH:mm",
+            L : "YYYY-MM-DD",
+            LL : "YYYY [m.] MMMM D [d.]",
+            LLL : "YYYY [m.] MMMM D [d.], LT [val.]",
+            LLLL : "YYYY [m.] MMMM D [d.], dddd, LT [val.]",
+            l : "YYYY-MM-DD",
+            ll : "YYYY [m.] MMMM D [d.]",
+            lll : "YYYY [m.] MMMM D [d.], LT [val.]",
+            llll : "YYYY [m.] MMMM D [d.], ddd, LT [val.]"
+        },
+        calendar : {
+            sameDay : "[Šiandien] LT",
+            nextDay : "[Rytoj] LT",
+            nextWeek : "dddd LT",
+            lastDay : "[Vakar] LT",
+            lastWeek : "[Praėjusį] dddd LT",
+            sameElse : "L"
+        },
+        relativeTime : {
+            future : "po %s",
+            past : "prieš %s",
+            s : translateSeconds,
+            m : translateSingular,
+            mm : translate,
+            h : translateSingular,
+            hh : translate,
+            d : translateSingular,
+            dd : translate,
+            M : translateSingular,
+            MM : translate,
+            y : translateSingular,
+            yy : translate
+        },
+        ordinal : function (number) {
+            return number + '-oji';
+        },
+        week : {
+            dow : 1, // Monday is the first day of the week.
+            doy : 4  // The week that contains Jan 4th is the first week of the year.
+        }
+    });
+}));
diff --git a/resources/lib/moment/lang/lv.js b/resources/lib/moment/lang/lv.js
new file mode 100644 (file)
index 0000000..ffe25cf
--- /dev/null
@@ -0,0 +1,77 @@
+// moment.js language configuration
+// language : latvian (lv)
+// author : Kristaps Karlsons : https://github.com/skakri
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+    var units = {
+        'mm': 'minūti_minūtes_minūte_minūtes',
+        'hh': 'stundu_stundas_stunda_stundas',
+        'dd': 'dienu_dienas_diena_dienas',
+        'MM': 'mēnesi_mēnešus_mēnesis_mēneši',
+        'yy': 'gadu_gadus_gads_gadi'
+    };
+
+    function format(word, number, withoutSuffix) {
+        var forms = word.split('_');
+        if (withoutSuffix) {
+            return number % 10 === 1 && number !== 11 ? forms[2] : forms[3];
+        } else {
+            return number % 10 === 1 && number !== 11 ? forms[0] : forms[1];
+        }
+    }
+
+    function relativeTimeWithPlural(number, withoutSuffix, key) {
+        return number + ' ' + format(units[key], number, withoutSuffix);
+    }
+
+    return moment.lang('lv', {
+        months : "janvāris_februāris_marts_aprīlis_maijs_jūnijs_jūlijs_augusts_septembris_oktobris_novembris_decembris".split("_"),
+        monthsShort : "jan_feb_mar_apr_mai_jūn_jūl_aug_sep_okt_nov_dec".split("_"),
+        weekdays : "svētdiena_pirmdiena_otrdiena_trešdiena_ceturtdiena_piektdiena_sestdiena".split("_"),
+        weekdaysShort : "Sv_P_O_T_C_Pk_S".split("_"),
+        weekdaysMin : "Sv_P_O_T_C_Pk_S".split("_"),
+        longDateFormat : {
+            LT : "HH:mm",
+            L : "DD.MM.YYYY",
+            LL : "YYYY. [gada] D. MMMM",
+            LLL : "YYYY. [gada] D. MMMM, LT",
+            LLLL : "YYYY. [gada] D. MMMM, dddd, LT"
+        },
+        calendar : {
+            sameDay : '[Šodien pulksten] LT',
+            nextDay : '[Rīt pulksten] LT',
+            nextWeek : 'dddd [pulksten] LT',
+            lastDay : '[Vakar pulksten] LT',
+            lastWeek : '[Pagājušā] dddd [pulksten] LT',
+            sameElse : 'L'
+        },
+        relativeTime : {
+            future : "%s vēlāk",
+            past : "%s agrāk",
+            s : "dažas sekundes",
+            m : "minūti",
+            mm : relativeTimeWithPlural,
+            h : "stundu",
+            hh : relativeTimeWithPlural,
+            d : "dienu",
+            dd : relativeTimeWithPlural,
+            M : "mēnesi",
+            MM : relativeTimeWithPlural,
+            y : "gadu",
+            yy : relativeTimeWithPlural
+        },
+        ordinal : '%d.',
+        week : {
+            dow : 1, // Monday is the first day of the week.
+            doy : 4  // The week that contains Jan 4th is the first week of the year.
+        }
+    });
+}));
diff --git a/resources/lib/moment/lang/mk.js b/resources/lib/moment/lang/mk.js
new file mode 100644 (file)
index 0000000..5f272fa
--- /dev/null
@@ -0,0 +1,86 @@
+// moment.js language configuration
+// language : macedonian (mk)
+// author : Borislav Mickov : https://github.com/B0k0
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+    return moment.lang('mk', {
+        months : "јануари_февруари_март_април_мај_јуни_јули_август_септември_октомври_ноември_декември".split("_"),
+        monthsShort : "јан_фев_мар_апр_мај_јун_јул_авг_сеп_окт_ное_дек".split("_"),
+        weekdays : "недела_понеделник_вторник_среда_четврток_петок_сабота".split("_"),
+        weekdaysShort : "нед_пон_вто_сре_чет_пет_саб".split("_"),
+        weekdaysMin : "нe_пo_вт_ср_че_пе_сa".split("_"),
+        longDateFormat : {
+            LT : "H:mm",
+            L : "D.MM.YYYY",
+            LL : "D MMMM YYYY",
+            LLL : "D MMMM YYYY LT",
+            LLLL : "dddd, D MMMM YYYY LT"
+        },
+        calendar : {
+            sameDay : '[Денес во] LT',
+            nextDay : '[Утре во] LT',
+            nextWeek : 'dddd [во] LT',
+            lastDay : '[Вчера во] LT',
+            lastWeek : function () {
+                switch (this.day()) {
+                case 0:
+                case 3:
+                case 6:
+                    return '[Во изминатата] dddd [во] LT';
+                case 1:
+                case 2:
+                case 4:
+                case 5:
+                    return '[Во изминатиот] dddd [во] LT';
+                }
+            },
+            sameElse : 'L'
+        },
+        relativeTime : {
+            future : "после %s",
+            past : "пред %s",
+            s : "неколку секунди",
+            m : "минута",
+            mm : "%d минути",
+            h : "час",
+            hh : "%d часа",
+            d : "ден",
+            dd : "%d дена",
+            M : "месец",
+            MM : "%d месеци",
+            y : "година",
+            yy : "%d години"
+        },
+        ordinal : function (number) {
+            var lastDigit = number % 10,
+                last2Digits = number % 100;
+            if (number === 0) {
+                return number + '-ев';
+            } else if (last2Digits === 0) {
+                return number + '-ен';
+            } else if (last2Digits > 10 && last2Digits < 20) {
+                return number + '-ти';
+            } else if (lastDigit === 1) {
+                return number + '-ви';
+            } else if (lastDigit === 2) {
+                return number + '-ри';
+            } else if (lastDigit === 7 || lastDigit === 8) {
+                return number + '-ми';
+            } else {
+                return number + '-ти';
+            }
+        },
+        week : {
+            dow : 1, // Monday is the first day of the week.
+            doy : 7  // The week that contains Jan 1st is the first week of the year.
+        }
+    });
+}));
diff --git a/resources/lib/moment/lang/ml.js b/resources/lib/moment/lang/ml.js
new file mode 100644 (file)
index 0000000..cc7db9a
--- /dev/null
@@ -0,0 +1,64 @@
+// moment.js language configuration
+// language : malayalam (ml)
+// author : Floyd Pink : https://github.com/floydpink
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+    return moment.lang('ml', {
+        months : 'ജനുവരി_ഫെബ്രുവരി_മാർച്ച്_ഏപ്രിൽ_മേയ്_ജൂൺ_ജൂലൈ_ഓഗസ്റ്റ്_സെപ്റ്റംബർ_ഒക്ടോബർ_നവംബർ_ഡിസംബർ'.split("_"),
+        monthsShort : 'ജനു._ഫെബ്രു._മാർ._ഏപ്രി._മേയ്_ജൂൺ_ജൂലൈ._ഓഗ._സെപ്റ്റ._ഒക്ടോ._നവം._ഡിസം.'.split("_"),
+        weekdays : 'ഞായറാഴ്ച_തിങ്കളാഴ്ച_ചൊവ്വാഴ്ച_ബുധനാഴ്ച_വ്യാഴാഴ്ച_വെള്ളിയാഴ്ച_ശനിയാഴ്ച'.split("_"),
+        weekdaysShort : 'ഞായർ_തിങ്കൾ_ചൊവ്വ_ബുധൻ_വ്യാഴം_വെള്ളി_ശനി'.split("_"),
+        weekdaysMin : 'ഞാ_തി_ചൊ_ബു_വ്യാ_വെ_ശ'.split("_"),
+        longDateFormat : {
+            LT : "A h:mm -നു",
+            L : "DD/MM/YYYY",
+            LL : "D MMMM YYYY",
+            LLL : "D MMMM YYYY, LT",
+            LLLL : "dddd, D MMMM YYYY, LT"
+        },
+        calendar : {
+            sameDay : '[ഇന്ന്] LT',
+            nextDay : '[നാളെ] LT',
+            nextWeek : 'dddd, LT',
+            lastDay : '[ഇന്നലെ] LT',
+            lastWeek : '[കഴിഞ്ഞ] dddd, LT',
+            sameElse : 'L'
+        },
+        relativeTime : {
+            future : "%s കഴിഞ്ഞ്",
+            past : "%s മുൻപ്",
+            s : "അൽപ നിമിഷങ്ങൾ",
+            m : "ഒരു മിനിറ്റ്",
+            mm : "%d മിനിറ്റ്",
+            h : "ഒരു മണിക്കൂർ",
+            hh : "%d മണിക്കൂർ",
+            d : "ഒരു ദിവസം",
+            dd : "%d ദിവസം",
+            M : "ഒരു മാസം",
+            MM : "%d മാസം",
+            y : "ഒരു വർഷം",
+            yy : "%d വർഷം"
+        },
+        meridiem : function (hour, minute, isLower) {
+            if (hour < 4) {
+                return "രാത്രി";
+            } else if (hour < 12) {
+                return "രാവിലെ";
+            } else if (hour < 17) {
+                return "ഉച്ച കഴിഞ്ഞ്";
+            } else if (hour < 20) {
+                return "വൈകുന്നേരം";
+            } else {
+                return "രാത്രി";
+            }
+        }
+    });
+}));
diff --git a/resources/lib/moment/lang/mr.js b/resources/lib/moment/lang/mr.js
new file mode 100644 (file)
index 0000000..0d1adfd
--- /dev/null
@@ -0,0 +1,104 @@
+// moment.js language configuration
+// language : Marathi (mr)
+// author : Harshad Kale : https://github.com/kalehv
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+    var symbolMap = {
+        '1': '१',
+        '2': '२',
+        '3': '३',
+        '4': '४',
+        '5': '५',
+        '6': '६',
+        '7': '७',
+        '8': '८',
+        '9': '९',
+        '0': '०'
+    },
+    numberMap = {
+        '१': '1',
+        '२': '2',
+        '३': '3',
+        '४': '4',
+        '५': '5',
+        '६': '6',
+        '७': '7',
+        '८': '8',
+        '९': '9',
+        '०': '0'
+    };
+
+    return moment.lang('mr', {
+        months : 'जानेवारी_फेब्रुवारी_मार्च_एप्रिल_मे_जून_जुलै_ऑगस्ट_सप्टेंबर_ऑक्टोबर_नोव्हेंबर_डिसेंबर'.split("_"),
+        monthsShort: 'जाने._फेब्रु._मार्च._एप्रि._मे._जून._जुलै._ऑग._सप्टें._ऑक्टो._नोव्हें._डिसें.'.split("_"),
+        weekdays : 'रविवार_सोमवार_मंगळवार_बुधवार_गुरूवार_शुक्रवार_शनिवार'.split("_"),
+        weekdaysShort : 'रवि_सोम_मंगळ_बुध_गुरू_शुक्र_शनि'.split("_"),
+        weekdaysMin : 'र_सो_मं_बु_गु_शु_श'.split("_"),
+        longDateFormat : {
+            LT : "A h:mm वाजता",
+            L : "DD/MM/YYYY",
+            LL : "D MMMM YYYY",
+            LLL : "D MMMM YYYY, LT",
+            LLLL : "dddd, D MMMM YYYY, LT"
+        },
+        calendar : {
+            sameDay : '[आज] LT',
+            nextDay : '[उद्या] LT',
+            nextWeek : 'dddd, LT',
+            lastDay : '[काल] LT',
+            lastWeek: '[मागील] dddd, LT',
+            sameElse : 'L'
+        },
+        relativeTime : {
+            future : "%s नंतर",
+            past : "%s पूर्वी",
+            s : "सेकंद",
+            m: "एक मिनिट",
+            mm: "%d मिनिटे",
+            h : "एक तास",
+            hh : "%d तास",
+            d : "एक दिवस",
+            dd : "%d दिवस",
+            M : "एक महिना",
+            MM : "%d महिने",
+            y : "एक वर्ष",
+            yy : "%d वर्षे"
+        },
+        preparse: function (string) {
+            return string.replace(/[१२३४५६७८९०]/g, function (match) {
+                return numberMap[match];
+            });
+        },
+        postformat: function (string) {
+            return string.replace(/\d/g, function (match) {
+                return symbolMap[match];
+            });
+        },
+        meridiem: function (hour, minute, isLower)
+        {
+            if (hour < 4) {
+                return "रात्री";
+            } else if (hour < 10) {
+                return "सकाळी";
+            } else if (hour < 17) {
+                return "दुपारी";
+            } else if (hour < 20) {
+                return "सायंकाळी";
+            } else {
+                return "रात्री";
+            }
+        },
+        week : {
+            dow : 0, // Sunday is the first day of the week.
+            doy : 6  // The week that contains Jan 1st is the first week of the year.
+        }
+    });
+}));
diff --git a/resources/lib/moment/lang/ms-my.js b/resources/lib/moment/lang/ms-my.js
new file mode 100644 (file)
index 0000000..501d5aa
--- /dev/null
@@ -0,0 +1,66 @@
+// moment.js language configuration
+// language : Bahasa Malaysia (ms-MY)
+// author : Weldan Jamili : https://github.com/weldan
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+    return moment.lang('ms-my', {
+        months : "Januari_Februari_Mac_April_Mei_Jun_Julai_Ogos_September_Oktober_November_Disember".split("_"),
+        monthsShort : "Jan_Feb_Mac_Apr_Mei_Jun_Jul_Ogs_Sep_Okt_Nov_Dis".split("_"),
+        weekdays : "Ahad_Isnin_Selasa_Rabu_Khamis_Jumaat_Sabtu".split("_"),
+        weekdaysShort : "Ahd_Isn_Sel_Rab_Kha_Jum_Sab".split("_"),
+        weekdaysMin : "Ah_Is_Sl_Rb_Km_Jm_Sb".split("_"),
+        longDateFormat : {
+            LT : "HH.mm",
+            L : "DD/MM/YYYY",
+            LL : "D MMMM YYYY",
+            LLL : "D MMMM YYYY [pukul] LT",
+            LLLL : "dddd, D MMMM YYYY [pukul] LT"
+        },
+        meridiem : function (hours, minutes, isLower) {
+            if (hours < 11) {
+                return 'pagi';
+            } else if (hours < 15) {
+                return 'tengahari';
+            } else if (hours < 19) {
+                return 'petang';
+            } else {
+                return 'malam';
+            }
+        },
+        calendar : {
+            sameDay : '[Hari ini pukul] LT',
+            nextDay : '[Esok pukul] LT',
+            nextWeek : 'dddd [pukul] LT',
+            lastDay : '[Kelmarin pukul] LT',
+            lastWeek : 'dddd [lepas pukul] LT',
+            sameElse : 'L'
+        },
+        relativeTime : {
+            future : "dalam %s",
+            past : "%s yang lepas",
+            s : "beberapa saat",
+            m : "seminit",
+            mm : "%d minit",
+            h : "sejam",
+            hh : "%d jam",
+            d : "sehari",
+            dd : "%d hari",
+            M : "sebulan",
+            MM : "%d bulan",
+            y : "setahun",
+            yy : "%d tahun"
+        },
+        week : {
+            dow : 1, // Monday is the first day of the week.
+            doy : 7  // The week that contains Jan 1st is the first week of the year.
+        }
+    });
+}));
diff --git a/resources/lib/moment/lang/nb.js b/resources/lib/moment/lang/nb.js
new file mode 100644 (file)
index 0000000..2f652ef
--- /dev/null
@@ -0,0 +1,57 @@
+// moment.js language configuration
+// language : norwegian bokmål (nb)
+// authors : Espen Hovlandsdal : https://github.com/rexxars
+//           Sigurd Gartmann : https://github.com/sigurdga
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+    return moment.lang('nb', {
+        months : "januar_februar_mars_april_mai_juni_juli_august_september_oktober_november_desember".split("_"),
+        monthsShort : "jan._feb._mars_april_mai_juni_juli_aug._sep._okt._nov._des.".split("_"),
+        weekdays : "søndag_mandag_tirsdag_onsdag_torsdag_fredag_lørdag".split("_"),
+        weekdaysShort : "sø._ma._ti._on._to._fr._lø.".split("_"),
+        weekdaysMin : "sø_ma_ti_on_to_fr_lø".split("_"),
+        longDateFormat : {
+            LT : "H.mm",
+            L : "DD.MM.YYYY",
+            LL : "D. MMMM YYYY",
+            LLL : "D. MMMM YYYY [kl.] LT",
+            LLLL : "dddd D. MMMM YYYY [kl.] LT"
+        },
+        calendar : {
+            sameDay: '[i dag kl.] LT',
+            nextDay: '[i morgen kl.] LT',
+            nextWeek: 'dddd [kl.] LT',
+            lastDay: '[i går kl.] LT',
+            lastWeek: '[forrige] dddd [kl.] LT',
+            sameElse: 'L'
+        },
+        relativeTime : {
+            future : "om %s",
+            past : "for %s siden",
+            s : "noen sekunder",
+            m : "ett minutt",
+            mm : "%d minutter",
+            h : "en time",
+            hh : "%d timer",
+            d : "en dag",
+            dd : "%d dager",
+            M : "en måned",
+            MM : "%d måneder",
+            y : "ett år",
+            yy : "%d år"
+        },
+        ordinal : '%d.',
+        week : {
+            dow : 1, // Monday is the first day of the week.
+            doy : 4  // The week that contains Jan 4th is the first week of the year.
+        }
+    });
+}));
diff --git a/resources/lib/moment/lang/ne.js b/resources/lib/moment/lang/ne.js
new file mode 100644 (file)
index 0000000..1d57b8c
--- /dev/null
@@ -0,0 +1,105 @@
+// moment.js language configuration
+// language : nepali/nepalese
+// author : suvash : https://github.com/suvash
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+    var symbolMap = {
+        '1': '१',
+        '2': '२',
+        '3': '३',
+        '4': '४',
+        '5': '५',
+        '6': '६',
+        '7': '७',
+        '8': '८',
+        '9': '९',
+        '0': '०'
+    },
+    numberMap = {
+        '१': '1',
+        '२': '2',
+        '३': '3',
+        '४': '4',
+        '५': '5',
+        '६': '6',
+        '७': '7',
+        '८': '8',
+        '९': '9',
+        '०': '0'
+    };
+
+    return moment.lang('ne', {
+        months : 'जनवरी_फेब्रुवरी_मार्च_अप्रिल_मई_जुन_जुलाई_अगष्ट_सेप्टेम्बर_अक्टोबर_नोभेम्बर_डिसेम्बर'.split("_"),
+        monthsShort : 'जन._फेब्रु._मार्च_अप्रि._मई_जुन_जुलाई._अग._सेप्ट._अक्टो._नोभे._डिसे.'.split("_"),
+        weekdays : 'आइतबार_सोमबार_मङ्गलबार_बुधबार_बिहिबार_शुक्रबार_शनिबार'.split("_"),
+        weekdaysShort : 'आइत._सोम._मङ्गल._बुध._बिहि._शुक्र._शनि.'.split("_"),
+        weekdaysMin : 'आइ._सो._मङ्_बु._बि._शु._श.'.split("_"),
+        longDateFormat : {
+            LT : "Aको h:mm बजे",
+            L : "DD/MM/YYYY",
+            LL : "D MMMM YYYY",
+            LLL : "D MMMM YYYY, LT",
+            LLLL : "dddd, D MMMM YYYY, LT"
+        },
+        preparse: function (string) {
+            return string.replace(/[१२३४५६७८९०]/g, function (match) {
+                return numberMap[match];
+            });
+        },
+        postformat: function (string) {
+            return string.replace(/\d/g, function (match) {
+                return symbolMap[match];
+            });
+        },
+        meridiem : function (hour, minute, isLower) {
+            if (hour < 3) {
+                return "राती";
+            } else if (hour < 10) {
+                return "बिहान";
+            } else if (hour < 15) {
+                return "दिउँसो";
+            } else if (hour < 18) {
+                return "बेलुका";
+            } else if (hour < 20) {
+                return "साँझ";
+            } else {
+                return "राती";
+            }
+        },
+        calendar : {
+            sameDay : '[आज] LT',
+            nextDay : '[भोली] LT',
+            nextWeek : '[आउँदो] dddd[,] LT',
+            lastDay : '[हिजो] LT',
+            lastWeek : '[गएको] dddd[,] LT',
+            sameElse : 'L'
+        },
+        relativeTime : {
+            future : "%sमा",
+            past : "%s अगाडी",
+            s : "केही समय",
+            m : "एक मिनेट",
+            mm : "%d मिनेट",
+            h : "एक घण्टा",
+            hh : "%d घण्टा",
+            d : "एक दिन",
+            dd : "%d दिन",
+            M : "एक महिना",
+            MM : "%d महिना",
+            y : "एक बर्ष",
+            yy : "%d बर्ष"
+        },
+        week : {
+            dow : 1, // Monday is the first day of the week.
+            doy : 7  // The week that contains Jan 1st is the first week of the year.
+        }
+    });
+}));
diff --git a/resources/lib/moment/lang/nl.js b/resources/lib/moment/lang/nl.js
new file mode 100644 (file)
index 0000000..ffd454f
--- /dev/null
@@ -0,0 +1,67 @@
+// moment.js language configuration
+// language : dutch (nl)
+// author : Joris Röling : https://github.com/jjupiter
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+    var monthsShortWithDots = "jan._feb._mrt._apr._mei_jun._jul._aug._sep._okt._nov._dec.".split("_"),
+        monthsShortWithoutDots = "jan_feb_mrt_apr_mei_jun_jul_aug_sep_okt_nov_dec".split("_");
+
+    return moment.lang('nl', {
+        months : "januari_februari_maart_april_mei_juni_juli_augustus_september_oktober_november_december".split("_"),
+        monthsShort : function (m, format) {
+            if (/-MMM-/.test(format)) {
+                return monthsShortWithoutDots[m.month()];
+            } else {
+                return monthsShortWithDots[m.month()];
+            }
+        },
+        weekdays : "zondag_maandag_dinsdag_woensdag_donderdag_vrijdag_zaterdag".split("_"),
+        weekdaysShort : "zo._ma._di._wo._do._vr._za.".split("_"),
+        weekdaysMin : "Zo_Ma_Di_Wo_Do_Vr_Za".split("_"),
+        longDateFormat : {
+            LT : "HH:mm",
+            L : "DD-MM-YYYY",
+            LL : "D MMMM YYYY",
+            LLL : "D MMMM YYYY LT",
+            LLLL : "dddd D MMMM YYYY LT"
+        },
+        calendar : {
+            sameDay: '[vandaag om] LT',
+            nextDay: '[morgen om] LT',
+            nextWeek: 'dddd [om] LT',
+            lastDay: '[gisteren om] LT',
+            lastWeek: '[afgelopen] dddd [om] LT',
+            sameElse: 'L'
+        },
+        relativeTime : {
+            future : "over %s",
+            past : "%s geleden",
+            s : "een paar seconden",
+            m : "één minuut",
+            mm : "%d minuten",
+            h : "één uur",
+            hh : "%d uur",
+            d : "één dag",
+            dd : "%d dagen",
+            M : "één maand",
+            MM : "%d maanden",
+            y : "één jaar",
+            yy : "%d jaar"
+        },
+        ordinal : function (number) {
+            return number + ((number === 1 || number === 8 || number >= 20) ? 'ste' : 'de');
+        },
+        week : {
+            dow : 1, // Monday is the first day of the week.
+            doy : 4  // The week that contains Jan 4th is the first week of the year.
+        }
+    });
+}));
diff --git a/resources/lib/moment/lang/nn.js b/resources/lib/moment/lang/nn.js
new file mode 100644 (file)
index 0000000..f59c415
--- /dev/null
@@ -0,0 +1,56 @@
+// moment.js language configuration
+// language : norwegian nynorsk (nn)
+// author : https://github.com/mechuwind
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+    return moment.lang('nn', {
+        months : "januar_februar_mars_april_mai_juni_juli_august_september_oktober_november_desember".split("_"),
+        monthsShort : "jan_feb_mar_apr_mai_jun_jul_aug_sep_okt_nov_des".split("_"),
+        weekdays : "sundag_måndag_tysdag_onsdag_torsdag_fredag_laurdag".split("_"),
+        weekdaysShort : "sun_mån_tys_ons_tor_fre_lau".split("_"),
+        weekdaysMin : "su_må_ty_on_to_fr_lø".split("_"),
+        longDateFormat : {
+            LT : "HH:mm",
+            L : "DD.MM.YYYY",
+            LL : "D MMMM YYYY",
+            LLL : "D MMMM YYYY LT",
+            LLLL : "dddd D MMMM YYYY LT"
+        },
+        calendar : {
+            sameDay: '[I dag klokka] LT',
+            nextDay: '[I morgon klokka] LT',
+            nextWeek: 'dddd [klokka] LT',
+            lastDay: '[I går klokka] LT',
+            lastWeek: '[Føregående] dddd [klokka] LT',
+            sameElse: 'L'
+        },
+        relativeTime : {
+            future : "om %s",
+            past : "for %s siden",
+            s : "noen sekund",
+            m : "ett minutt",
+            mm : "%d minutt",
+            h : "en time",
+            hh : "%d timar",
+            d : "en dag",
+            dd : "%d dagar",
+            M : "en månad",
+            MM : "%d månader",
+            y : "ett år",
+            yy : "%d år"
+        },
+        ordinal : '%d.',
+        week : {
+            dow : 1, // Monday is the first day of the week.
+            doy : 4  // The week that contains Jan 4th is the first week of the year.
+        }
+    });
+}));
diff --git a/resources/lib/moment/lang/pl.js b/resources/lib/moment/lang/pl.js
new file mode 100644 (file)
index 0000000..97770d2
--- /dev/null
@@ -0,0 +1,98 @@
+// moment.js language configuration
+// language : polish (pl)
+// author : Rafal Hirsz : https://github.com/evoL
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+    var monthsNominative = "styczeń_luty_marzec_kwiecień_maj_czerwiec_lipiec_sierpień_wrzesień_październik_listopad_grudzień".split("_"),
+        monthsSubjective = "stycznia_lutego_marca_kwietnia_maja_czerwca_lipca_sierpnia_września_października_listopada_grudnia".split("_");
+
+    function plural(n) {
+        return (n % 10 < 5) && (n % 10 > 1) && ((~~(n / 10) % 10) !== 1);
+    }
+
+    function translate(number, withoutSuffix, key) {
+        var result = number + " ";
+        switch (key) {
+        case 'm':
+            return withoutSuffix ? 'minuta' : 'minutę';
+        case 'mm':
+            return result + (plural(number) ? 'minuty' : 'minut');
+        case 'h':
+            return withoutSuffix  ? 'godzina'  : 'godzinę';
+        case 'hh':
+            return result + (plural(number) ? 'godziny' : 'godzin');
+        case 'MM':
+            return result + (plural(number) ? 'miesiące' : 'miesięcy');
+        case 'yy':
+            return result + (plural(number) ? 'lata' : 'lat');
+        }
+    }
+
+    return moment.lang('pl', {
+        months : function (momentToFormat, format) {
+            if (/D MMMM/.test(format)) {
+                return monthsSubjective[momentToFormat.month()];
+            } else {
+                return monthsNominative[momentToFormat.month()];
+            }
+        },
+        monthsShort : "sty_lut_mar_kwi_maj_cze_lip_sie_wrz_paź_lis_gru".split("_"),
+        weekdays : "niedziela_poniedziałek_wtorek_środa_czwartek_piątek_sobota".split("_"),
+        weekdaysShort : "nie_pon_wt_śr_czw_pt_sb".split("_"),
+        weekdaysMin : "N_Pn_Wt_Śr_Cz_Pt_So".split("_"),
+        longDateFormat : {
+            LT : "HH:mm",
+            L : "DD.MM.YYYY",
+            LL : "D MMMM YYYY",
+            LLL : "D MMMM YYYY LT",
+            LLLL : "dddd, D MMMM YYYY LT"
+        },
+        calendar : {
+            sameDay: '[Dziś o] LT',
+            nextDay: '[Jutro o] LT',
+            nextWeek: '[W] dddd [o] LT',
+            lastDay: '[Wczoraj o] LT',
+            lastWeek: function () {
+                switch (this.day()) {
+                case 0:
+                    return '[W zeszłą niedzielę o] LT';
+                case 3:
+                    return '[W zeszłą środę o] LT';
+                case 6:
+                    return '[W zeszłą sobotę o] LT';
+                default:
+                    return '[W zeszły] dddd [o] LT';
+                }
+            },
+            sameElse: 'L'
+        },
+        relativeTime : {
+            future : "za %s",
+            past : "%s temu",
+            s : "kilka sekund",
+            m : translate,
+            mm : translate,
+            h : translate,
+            hh : translate,
+            d : "1 dzień",
+            dd : '%d dni',
+            M : "miesiąc",
+            MM : translate,
+            y : "rok",
+            yy : translate
+        },
+        ordinal : '%d.',
+        week : {
+            dow : 1, // Monday is the first day of the week.
+            doy : 4  // The week that contains Jan 4th is the first week of the year.
+        }
+    });
+}));
diff --git a/resources/lib/moment/lang/pt-br.js b/resources/lib/moment/lang/pt-br.js
new file mode 100644 (file)
index 0000000..5cac19b
--- /dev/null
@@ -0,0 +1,56 @@
+// moment.js language configuration
+// language : brazilian portuguese (pt-br)
+// author : Caio Ribeiro Pereira : https://github.com/caio-ribeiro-pereira
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+    return moment.lang('pt-br', {
+        months : "Janeiro_Fevereiro_Março_Abril_Maio_Junho_Julho_Agosto_Setembro_Outubro_Novembro_Dezembro".split("_"),
+        monthsShort : "Jan_Fev_Mar_Abr_Mai_Jun_Jul_Ago_Set_Out_Nov_Dez".split("_"),
+        weekdays : "Domingo_Segunda-feira_Terça-feira_Quarta-feira_Quinta-feira_Sexta-feira_Sábado".split("_"),
+        weekdaysShort : "Dom_Seg_Ter_Qua_Qui_Sex_Sáb".split("_"),
+        weekdaysMin : "Dom_2ª_3ª_4ª_5ª_6ª_Sáb".split("_"),
+        longDateFormat : {
+            LT : "HH:mm",
+            L : "DD/MM/YYYY",
+            LL : "D [de] MMMM [de] YYYY",
+            LLL : "D [de] MMMM [de] YYYY LT",
+            LLLL : "dddd, D [de] MMMM [de] YYYY LT"
+        },
+        calendar : {
+            sameDay: '[Hoje às] LT',
+            nextDay: '[Amanhã às] LT',
+            nextWeek: 'dddd [às] LT',
+            lastDay: '[Ontem às] LT',
+            lastWeek: function () {
+                return (this.day() === 0 || this.day() === 6) ?
+                    '[Último] dddd [às] LT' : // Saturday + Sunday
+                    '[Última] dddd [às] LT'; // Monday - Friday
+            },
+            sameElse: 'L'
+        },
+        relativeTime : {
+            future : "em %s",
+            past : "%s atrás",
+            s : "segundos",
+            m : "um minuto",
+            mm : "%d minutos",
+            h : "uma hora",
+            hh : "%d horas",
+            d : "um dia",
+            dd : "%d dias",
+            M : "um mês",
+            MM : "%d meses",
+            y : "um ano",
+            yy : "%d anos"
+        },
+        ordinal : '%dº'
+    });
+}));
diff --git a/resources/lib/moment/lang/pt.js b/resources/lib/moment/lang/pt.js
new file mode 100644 (file)
index 0000000..7c1f2b5
--- /dev/null
@@ -0,0 +1,60 @@
+// moment.js language configuration
+// language : portuguese (pt)
+// author : Jefferson : https://github.com/jalex79
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+    return moment.lang('pt', {
+        months : "Janeiro_Fevereiro_Março_Abril_Maio_Junho_Julho_Agosto_Setembro_Outubro_Novembro_Dezembro".split("_"),
+        monthsShort : "Jan_Fev_Mar_Abr_Mai_Jun_Jul_Ago_Set_Out_Nov_Dez".split("_"),
+        weekdays : "Domingo_Segunda-feira_Terça-feira_Quarta-feira_Quinta-feira_Sexta-feira_Sábado".split("_"),
+        weekdaysShort : "Dom_Seg_Ter_Qua_Qui_Sex_Sáb".split("_"),
+        weekdaysMin : "Dom_2ª_3ª_4ª_5ª_6ª_Sáb".split("_"),
+        longDateFormat : {
+            LT : "HH:mm",
+            L : "DD/MM/YYYY",
+            LL : "D [de] MMMM [de] YYYY",
+            LLL : "D [de] MMMM [de] YYYY LT",
+            LLLL : "dddd, D [de] MMMM [de] YYYY LT"
+        },
+        calendar : {
+            sameDay: '[Hoje às] LT',
+            nextDay: '[Amanhã às] LT',
+            nextWeek: 'dddd [às] LT',
+            lastDay: '[Ontem às] LT',
+            lastWeek: function () {
+                return (this.day() === 0 || this.day() === 6) ?
+                    '[Último] dddd [às] LT' : // Saturday + Sunday
+                    '[Última] dddd [às] LT'; // Monday - Friday
+            },
+            sameElse: 'L'
+        },
+        relativeTime : {
+            future : "em %s",
+            past : "%s atrás",
+            s : "segundos",
+            m : "um minuto",
+            mm : "%d minutos",
+            h : "uma hora",
+            hh : "%d horas",
+            d : "um dia",
+            dd : "%d dias",
+            M : "um mês",
+            MM : "%d meses",
+            y : "um ano",
+            yy : "%d anos"
+        },
+        ordinal : '%dº',
+        week : {
+            dow : 1, // Monday is the first day of the week.
+            doy : 4  // The week that contains Jan 4th is the first week of the year.
+        }
+    });
+}));
diff --git a/resources/lib/moment/lang/ro.js b/resources/lib/moment/lang/ro.js
new file mode 100644 (file)
index 0000000..77d7355
--- /dev/null
@@ -0,0 +1,72 @@
+// moment.js language configuration
+// language : romanian (ro)
+// author : Vlad Gurdiga : https://github.com/gurdiga
+// author : Valentin Agachi : https://github.com/avaly
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+    function relativeTimeWithPlural(number, withoutSuffix, key) {
+        var format = {
+            'mm': 'minute',
+            'hh': 'ore',
+            'dd': 'zile',
+            'MM': 'luni',
+            'yy': 'ani'
+        },
+            separator = ' ';
+        if (number % 100 >= 20 || (number >= 100 && number % 100 === 0)) {
+            separator = ' de ';
+        }
+
+        return number + separator + format[key];
+    }
+
+    return moment.lang('ro', {
+        months : "ianuarie_februarie_martie_aprilie_mai_iunie_iulie_august_septembrie_octombrie_noiembrie_decembrie".split("_"),
+        monthsShort : "ian_feb_mar_apr_mai_iun_iul_aug_sep_oct_noi_dec".split("_"),
+        weekdays : "duminică_luni_marți_miercuri_joi_vineri_sâmbătă".split("_"),
+        weekdaysShort : "Dum_Lun_Mar_Mie_Joi_Vin_Sâm".split("_"),
+        weekdaysMin : "Du_Lu_Ma_Mi_Jo_Vi_Sâ".split("_"),
+        longDateFormat : {
+            LT : "H:mm",
+            L : "DD.MM.YYYY",
+            LL : "D MMMM YYYY",
+            LLL : "D MMMM YYYY H:mm",
+            LLLL : "dddd, D MMMM YYYY H:mm"
+        },
+        calendar : {
+            sameDay: "[azi la] LT",
+            nextDay: '[mâine la] LT',
+            nextWeek: 'dddd [la] LT',
+            lastDay: '[ieri la] LT',
+            lastWeek: '[fosta] dddd [la] LT',
+            sameElse: 'L'
+        },
+        relativeTime : {
+            future : "peste %s",
+            past : "%s în urmă",
+            s : "câteva secunde",
+            m : "un minut",
+            mm : relativeTimeWithPlural,
+            h : "o oră",
+            hh : relativeTimeWithPlural,
+            d : "o zi",
+            dd : relativeTimeWithPlural,
+            M : "o lună",
+            MM : relativeTimeWithPlural,
+            y : "un an",
+            yy : relativeTimeWithPlural
+        },
+        week : {
+            dow : 1, // Monday is the first day of the week.
+            doy : 7  // The week that contains Jan 1st is the first week of the year.
+        }
+    });
+}));
diff --git a/resources/lib/moment/lang/rs.js b/resources/lib/moment/lang/rs.js
new file mode 100644 (file)
index 0000000..8627553
--- /dev/null
@@ -0,0 +1,139 @@
+// moment.js language configuration
+// language : serbian (rs)
+// author : Limon Monte : https://github.com/limonte
+// based on (bs) translation by Nedim Cholich
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+
+    function translate(number, withoutSuffix, key) {
+        var result = number + " ";
+        switch (key) {
+        case 'm':
+            return withoutSuffix ? 'jedna minuta' : 'jedne minute';
+        case 'mm':
+            if (number === 1) {
+                result += 'minuta';
+            } else if (number === 2 || number === 3 || number === 4) {
+                result += 'minute';
+            } else {
+                result += 'minuta';
+            }
+            return result;
+        case 'h':
+            return withoutSuffix ? 'jedan sat' : 'jednog sata';
+        case 'hh':
+            if (number === 1) {
+                result += 'sat';
+            } else if (number === 2 || number === 3 || number === 4) {
+                result += 'sata';
+            } else {
+                result += 'sati';
+            }
+            return result;
+        case 'dd':
+            if (number === 1) {
+                result += 'dan';
+            } else {
+                result += 'dana';
+            }
+            return result;
+        case 'MM':
+            if (number === 1) {
+                result += 'mesec';
+            } else if (number === 2 || number === 3 || number === 4) {
+                result += 'meseca';
+            } else {
+                result += 'meseci';
+            }
+            return result;
+        case 'yy':
+            if (number === 1) {
+                result += 'godina';
+            } else if (number === 2 || number === 3 || number === 4) {
+                result += 'godine';
+            } else {
+                result += 'godina';
+            }
+            return result;
+        }
+    }
+
+    return moment.lang('rs', {
+        months : "januar_februar_mart_april_maj_jun_jul_avgust_septembar_oktobar_novembar_decembar".split("_"),
+        monthsShort : "jan._feb._mar._apr._maj._jun._jul._avg._sep._okt._nov._dec.".split("_"),
+        weekdays : "nedelja_ponedeljak_utorak_sreda_četvrtak_petak_subota".split("_"),
+        weekdaysShort : "ned._pon._uto._sre._čet._pet._sub.".split("_"),
+        weekdaysMin : "ne_po_ut_sr_če_pe_su".split("_"),
+        longDateFormat : {
+            LT : "H:mm",
+            L : "DD. MM. YYYY",
+            LL : "D. MMMM YYYY",
+            LLL : "D. MMMM YYYY LT",
+            LLLL : "dddd, D. MMMM YYYY LT"
+        },
+        calendar : {
+            sameDay  : '[danas u] LT',
+            nextDay  : '[sutra u] LT',
+
+            nextWeek : function () {
+                switch (this.day()) {
+                case 0:
+                    return '[u] [nedelju] [u] LT';
+                case 3:
+                    return '[u] [sredu] [u] LT';
+                case 6:
+                    return '[u] [subotu] [u] LT';
+                case 1:
+                case 2:
+                case 4:
+                case 5:
+                    return '[u] dddd [u] LT';
+                }
+            },
+            lastDay  : '[juče u] LT',
+            lastWeek : function () {
+                switch (this.day()) {
+                case 0:
+                case 3:
+                    return '[prošlu] dddd [u] LT';
+                case 6:
+                    return '[prošle] [subote] [u] LT';
+                case 1:
+                case 2:
+                case 4:
+                case 5:
+                    return '[prošli] dddd [u] LT';
+                }
+            },
+            sameElse : 'L'
+        },
+        relativeTime : {
+            future : "za %s",
+            past   : "pre %s",
+            s      : "par sekundi",
+            m      : translate,
+            mm     : translate,
+            h      : translate,
+            hh     : translate,
+            d      : "dan",
+            dd     : translate,
+            M      : "mesec",
+            MM     : translate,
+            y      : "godinu",
+            yy     : translate
+        },
+        ordinal : '%d.',
+        week : {
+            dow : 1, // Monday is the first day of the week.
+            doy : 7  // The week that contains Jan 1st is the first week of the year.
+        }
+    });
+}));
diff --git a/resources/lib/moment/lang/ru.js b/resources/lib/moment/lang/ru.js
new file mode 100644 (file)
index 0000000..1d1816c
--- /dev/null
@@ -0,0 +1,163 @@
+// moment.js language configuration
+// language : russian (ru)
+// author : Viktorminator : https://github.com/Viktorminator
+// Author : Menelion Elensúle : https://github.com/Oire
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+    function plural(word, num) {
+        var forms = word.split('_');
+        return num % 10 === 1 && num % 100 !== 11 ? forms[0] : (num % 10 >= 2 && num % 10 <= 4 && (num % 100 < 10 || num % 100 >= 20) ? forms[1] : forms[2]);
+    }
+
+    function relativeTimeWithPlural(number, withoutSuffix, key) {
+        var format = {
+            'mm': 'минута_минуты_минут',
+            'hh': 'час_часа_часов',
+            'dd': 'день_дня_дней',
+            'MM': 'месяц_месяца_месяцев',
+            'yy': 'год_года_лет'
+        };
+        if (key === 'm') {
+            return withoutSuffix ? 'минута' : 'минуту';
+        }
+        else {
+            return number + ' ' + plural(format[key], +number);
+        }
+    }
+
+    function monthsCaseReplace(m, format) {
+        var months = {
+            'nominative': 'январь_февраль_март_апрель_май_июнь_июль_август_сентябрь_октябрь_ноябрь_декабрь'.split('_'),
+            'accusative': 'января_февраля_марта_апреля_мая_июня_июля_августа_сентября_октября_ноября_декабря'.split('_')
+        },
+
+        nounCase = (/D[oD]?(\[[^\[\]]*\]|\s+)+MMMM?/).test(format) ?
+            'accusative' :
+            'nominative';
+
+        return months[nounCase][m.month()];
+    }
+
+    function monthsShortCaseReplace(m, format) {
+        var monthsShort = {
+            'nominative': 'янв_фев_мар_апр_май_июнь_июль_авг_сен_окт_ноя_дек'.split('_'),
+            'accusative': 'янв_фев_мар_апр_мая_июня_июля_авг_сен_окт_ноя_дек'.split('_')
+        },
+
+        nounCase = (/D[oD]?(\[[^\[\]]*\]|\s+)+MMMM?/).test(format) ?
+            'accusative' :
+            'nominative';
+
+        return monthsShort[nounCase][m.month()];
+    }
+
+    function weekdaysCaseReplace(m, format) {
+        var weekdays = {
+            'nominative': 'воскресенье_понедельник_вторник_среда_четверг_пятница_суббота'.split('_'),
+            'accusative': 'воскресенье_понедельник_вторник_среду_четверг_пятницу_субботу'.split('_')
+        },
+
+        nounCase = (/\[ ?[Вв] ?(?:прошлую|следующую)? ?\] ?dddd/).test(format) ?
+            'accusative' :
+            'nominative';
+
+        return weekdays[nounCase][m.day()];
+    }
+
+    return moment.lang('ru', {
+        months : monthsCaseReplace,
+        monthsShort : monthsShortCaseReplace,
+        weekdays : weekdaysCaseReplace,
+        weekdaysShort : "вс_пн_вт_ср_чт_пт_сб".split("_"),
+        weekdaysMin : "вс_пн_вт_ср_чт_пт_сб".split("_"),
+        monthsParse : [/^янв/i, /^фев/i, /^мар/i, /^апр/i, /^ма[й|я]/i, /^июн/i, /^июл/i, /^авг/i, /^сен/i, /^окт/i, /^ноя/i, /^дек/i],
+        longDateFormat : {
+            LT : "HH:mm",
+            L : "DD.MM.YYYY",
+            LL : "D MMMM YYYY г.",
+            LLL : "D MMMM YYYY г., LT",
+            LLLL : "dddd, D MMMM YYYY г., LT"
+        },
+        calendar : {
+            sameDay: '[Сегодня в] LT',
+            nextDay: '[Завтра в] LT',
+            lastDay: '[Вчера в] LT',
+            nextWeek: function () {
+                return this.day() === 2 ? '[Во] dddd [в] LT' : '[В] dddd [в] LT';
+            },
+            lastWeek: function () {
+                switch (this.day()) {
+                case 0:
+                    return '[В прошлое] dddd [в] LT';
+                case 1:
+                case 2:
+                case 4:
+                    return '[В прошлый] dddd [в] LT';
+                case 3:
+                case 5:
+                case 6:
+                    return '[В прошлую] dddd [в] LT';
+                }
+            },
+            sameElse: 'L'
+        },
+        relativeTime : {
+            future : "через %s",
+            past : "%s назад",
+            s : "несколько секунд",
+            m : relativeTimeWithPlural,
+            mm : relativeTimeWithPlural,
+            h : "час",
+            hh : relativeTimeWithPlural,
+            d : "день",
+            dd : relativeTimeWithPlural,
+            M : "месяц",
+            MM : relativeTimeWithPlural,
+            y : "год",
+            yy : relativeTimeWithPlural
+        },
+
+        // M. E.: those two are virtually unused but a user might want to implement them for his/her website for some reason
+
+        meridiem : function (hour, minute, isLower) {
+            if (hour < 4) {
+                return "ночи";
+            } else if (hour < 12) {
+                return "утра";
+            } else if (hour < 17) {
+                return "дня";
+            } else {
+                return "вечера";
+            }
+        },
+
+        ordinal: function (number, period) {
+            switch (period) {
+            case 'M':
+            case 'd':
+            case 'DDD':
+                return number + '-й';
+            case 'D':
+                return number + '-го';
+            case 'w':
+            case 'W':
+                return number + '-я';
+            default:
+                return number;
+            }
+        },
+
+        week : {
+            dow : 1, // Monday is the first day of the week.
+            doy : 7  // The week that contains Jan 1st is the first week of the year.
+        }
+    });
+}));
diff --git a/resources/lib/moment/lang/sk.js b/resources/lib/moment/lang/sk.js
new file mode 100644 (file)
index 0000000..ed8a41d
--- /dev/null
@@ -0,0 +1,156 @@
+// moment.js language configuration
+// language : slovak (sk)
+// author : Martin Minka : https://github.com/k2s
+// based on work of petrbela : https://github.com/petrbela
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+    var months = "január_február_marec_apríl_máj_jún_júl_august_september_október_november_december".split("_"),
+        monthsShort = "jan_feb_mar_apr_máj_jún_júl_aug_sep_okt_nov_dec".split("_");
+
+    function plural(n) {
+        return (n > 1) && (n < 5);
+    }
+
+    function translate(number, withoutSuffix, key, isFuture) {
+        var result = number + " ";
+        switch (key) {
+        case 's':  // a few seconds / in a few seconds / a few seconds ago
+            return (withoutSuffix || isFuture) ? 'pár sekúnd' : 'pár sekundami';
+        case 'm':  // a minute / in a minute / a minute ago
+            return withoutSuffix ? 'minúta' : (isFuture ? 'minútu' : 'minútou');
+        case 'mm': // 9 minutes / in 9 minutes / 9 minutes ago
+            if (withoutSuffix || isFuture) {
+                return result + (plural(number) ? 'minúty' : 'minút');
+            } else {
+                return result + 'minútami';
+            }
+            break;
+        case 'h':  // an hour / in an hour / an hour ago
+            return withoutSuffix ? 'hodina' : (isFuture ? 'hodinu' : 'hodinou');
+        case 'hh': // 9 hours / in 9 hours / 9 hours ago
+            if (withoutSuffix || isFuture) {
+                return result + (plural(number) ? 'hodiny' : 'hodín');
+            } else {
+                return result + 'hodinami';
+            }
+            break;
+        case 'd':  // a day / in a day / a day ago
+            return (withoutSuffix || isFuture) ? 'deň' : 'dňom';
+        case 'dd': // 9 days / in 9 days / 9 days ago
+            if (withoutSuffix || isFuture) {
+                return result + (plural(number) ? 'dni' : 'dní');
+            } else {
+                return result + 'dňami';
+            }
+            break;
+        case 'M':  // a month / in a month / a month ago
+            return (withoutSuffix || isFuture) ? 'mesiac' : 'mesiacom';
+        case 'MM': // 9 months / in 9 months / 9 months ago
+            if (withoutSuffix || isFuture) {
+                return result + (plural(number) ? 'mesiace' : 'mesiacov');
+            } else {
+                return result + 'mesiacmi';
+            }
+            break;
+        case 'y':  // a year / in a year / a year ago
+            return (withoutSuffix || isFuture) ? 'rok' : 'rokom';
+        case 'yy': // 9 years / in 9 years / 9 years ago
+            if (withoutSuffix || isFuture) {
+                return result + (plural(number) ? 'roky' : 'rokov');
+            } else {
+                return result + 'rokmi';
+            }
+            break;
+        }
+    }
+
+    return moment.lang('sk', {
+        months : months,
+        monthsShort : monthsShort,
+        monthsParse : (function (months, monthsShort) {
+            var i, _monthsParse = [];
+            for (i = 0; i < 12; i++) {
+                // use custom parser to solve problem with July (červenec)
+                _monthsParse[i] = new RegExp('^' + months[i] + '$|^' + monthsShort[i] + '$', 'i');
+            }
+            return _monthsParse;
+        }(months, monthsShort)),
+        weekdays : "nedeľa_pondelok_utorok_streda_štvrtok_piatok_sobota".split("_"),
+        weekdaysShort : "ne_po_ut_st_št_pi_so".split("_"),
+        weekdaysMin : "ne_po_ut_st_št_pi_so".split("_"),
+        longDateFormat : {
+            LT: "H:mm",
+            L : "DD.MM.YYYY",
+            LL : "D. MMMM YYYY",
+            LLL : "D. MMMM YYYY LT",
+            LLLL : "dddd D. MMMM YYYY LT"
+        },
+        calendar : {
+            sameDay: "[dnes o] LT",
+            nextDay: '[zajtra o] LT',
+            nextWeek: function () {
+                switch (this.day()) {
+                case 0:
+                    return '[v nedeľu o] LT';
+                case 1:
+                case 2:
+                    return '[v] dddd [o] LT';
+                case 3:
+                    return '[v stredu o] LT';
+                case 4:
+                    return '[vo štvrtok o] LT';
+                case 5:
+                    return '[v piatok o] LT';
+                case 6:
+                    return '[v sobotu o] LT';
+                }
+            },
+            lastDay: '[včera o] LT',
+            lastWeek: function () {
+                switch (this.day()) {
+                case 0:
+                    return '[minulú nedeľu o] LT';
+                case 1:
+                case 2:
+                    return '[minulý] dddd [o] LT';
+                case 3:
+                    return '[minulú stredu o] LT';
+                case 4:
+                case 5:
+                    return '[minulý] dddd [o] LT';
+                case 6:
+                    return '[minulú sobotu o] LT';
+                }
+            },
+            sameElse: "L"
+        },
+        relativeTime : {
+            future : "za %s",
+            past : "pred %s",
+            s : translate,
+            m : translate,
+            mm : translate,
+            h : translate,
+            hh : translate,
+            d : translate,
+            dd : translate,
+            M : translate,
+            MM : translate,
+            y : translate,
+            yy : translate
+        },
+        ordinal : '%d.',
+        week : {
+            dow : 1, // Monday is the first day of the week.
+            doy : 4  // The week that contains Jan 4th is the first week of the year.
+        }
+    });
+}));
diff --git a/resources/lib/moment/lang/sl.js b/resources/lib/moment/lang/sl.js
new file mode 100644 (file)
index 0000000..d260f80
--- /dev/null
@@ -0,0 +1,144 @@
+// moment.js language configuration
+// language : slovenian (sl)
+// author : Robert Sedovšek : https://github.com/sedovsek
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+    function translate(number, withoutSuffix, key) {
+        var result = number + " ";
+        switch (key) {
+        case 'm':
+            return withoutSuffix ? 'ena minuta' : 'eno minuto';
+        case 'mm':
+            if (number === 1) {
+                result += 'minuta';
+            } else if (number === 2) {
+                result += 'minuti';
+            } else if (number === 3 || number === 4) {
+                result += 'minute';
+            } else {
+                result += 'minut';
+            }
+            return result;
+        case 'h':
+            return withoutSuffix ? 'ena ura' : 'eno uro';
+        case 'hh':
+            if (number === 1) {
+                result += 'ura';
+            } else if (number === 2) {
+                result += 'uri';
+            } else if (number === 3 || number === 4) {
+                result += 'ure';
+            } else {
+                result += 'ur';
+            }
+            return result;
+        case 'dd':
+            if (number === 1) {
+                result += 'dan';
+            } else {
+                result += 'dni';
+            }
+            return result;
+        case 'MM':
+            if (number === 1) {
+                result += 'mesec';
+            } else if (number === 2) {
+                result += 'meseca';
+            } else if (number === 3 || number === 4) {
+                result += 'mesece';
+            } else {
+                result += 'mesecev';
+            }
+            return result;
+        case 'yy':
+            if (number === 1) {
+                result += 'leto';
+            } else if (number === 2) {
+                result += 'leti';
+            } else if (number === 3 || number === 4) {
+                result += 'leta';
+            } else {
+                result += 'let';
+            }
+            return result;
+        }
+    }
+
+    return moment.lang('sl', {
+        months : "januar_februar_marec_april_maj_junij_julij_avgust_september_oktober_november_december".split("_"),
+        monthsShort : "jan._feb._mar._apr._maj._jun._jul._avg._sep._okt._nov._dec.".split("_"),
+        weekdays : "nedelja_ponedeljek_torek_sreda_četrtek_petek_sobota".split("_"),
+        weekdaysShort : "ned._pon._tor._sre._čet._pet._sob.".split("_"),
+        weekdaysMin : "ne_po_to_sr_če_pe_so".split("_"),
+        longDateFormat : {
+            LT : "H:mm",
+            L : "DD. MM. YYYY",
+            LL : "D. MMMM YYYY",
+            LLL : "D. MMMM YYYY LT",
+            LLLL : "dddd, D. MMMM YYYY LT"
+        },
+        calendar : {
+            sameDay  : '[danes ob] LT',
+            nextDay  : '[jutri ob] LT',
+
+            nextWeek : function () {
+                switch (this.day()) {
+                case 0:
+                    return '[v] [nedeljo] [ob] LT';
+                case 3:
+                    return '[v] [sredo] [ob] LT';
+                case 6:
+                    return '[v] [soboto] [ob] LT';
+                case 1:
+                case 2:
+                case 4:
+                case 5:
+                    return '[v] dddd [ob] LT';
+                }
+            },
+            lastDay  : '[včeraj ob] LT',
+            lastWeek : function () {
+                switch (this.day()) {
+                case 0:
+                case 3:
+                case 6:
+                    return '[prejšnja] dddd [ob] LT';
+                case 1:
+                case 2:
+                case 4:
+                case 5:
+                    return '[prejšnji] dddd [ob] LT';
+                }
+            },
+            sameElse : 'L'
+        },
+        relativeTime : {
+            future : "čez %s",
+            past   : "%s nazaj",
+            s      : "nekaj sekund",
+            m      : translate,
+            mm     : translate,
+            h      : translate,
+            hh     : translate,
+            d      : "en dan",
+            dd     : translate,
+            M      : "en mesec",
+            MM     : translate,
+            y      : "eno leto",
+            yy     : translate
+        },
+        ordinal : '%d.',
+        week : {
+            dow : 1, // Monday is the first day of the week.
+            doy : 7  // The week that contains Jan 1st is the first week of the year.
+        }
+    });
+}));
diff --git a/resources/lib/moment/lang/sq.js b/resources/lib/moment/lang/sq.js
new file mode 100644 (file)
index 0000000..a5e44b5
--- /dev/null
@@ -0,0 +1,57 @@
+// moment.js language configuration
+// language : Albanian (sq)
+// author : Flakërim Ismani : https://github.com/flakerimi
+// author: Menelion Elensúle: https://github.com/Oire (tests)
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+    return moment.lang('sq', {
+        months : "Janar_Shkurt_Mars_Prill_Maj_Qershor_Korrik_Gusht_Shtator_Tetor_Nëntor_Dhjetor".split("_"),
+        monthsShort : "Jan_Shk_Mar_Pri_Maj_Qer_Kor_Gus_Sht_Tet_Nën_Dhj".split("_"),
+        weekdays : "E Diel_E Hënë_E Marte_E Mërkure_E Enjte_E Premte_E Shtunë".split("_"),
+        weekdaysShort : "Die_Hën_Mar_Mër_Enj_Pre_Sht".split("_"),
+        weekdaysMin : "D_H_Ma_Më_E_P_Sh".split("_"),
+        longDateFormat : {
+            LT : "HH:mm",
+            L : "DD/MM/YYYY",
+            LL : "D MMMM YYYY",
+            LLL : "D MMMM YYYY LT",
+            LLLL : "dddd, D MMMM YYYY LT"
+        },
+        calendar : {
+            sameDay : '[Sot në] LT',
+            nextDay : '[Neser në] LT',
+            nextWeek : 'dddd [në] LT',
+            lastDay : '[Dje në] LT',
+            lastWeek : 'dddd [e kaluar në] LT',
+            sameElse : 'L'
+        },
+        relativeTime : {
+            future : "në %s",
+            past : "%s me parë",
+            s : "disa sekonda",
+            m : "një minut",
+            mm : "%d minuta",
+            h : "një orë",
+            hh : "%d orë",
+            d : "një ditë",
+            dd : "%d ditë",
+            M : "një muaj",
+            MM : "%d muaj",
+            y : "një vit",
+            yy : "%d vite"
+        },
+        ordinal : '%d.',
+        week : {
+            dow : 1, // Monday is the first day of the week.
+            doy : 4  // The week that contains Jan 4th is the first week of the year.
+        }
+    });
+}));
diff --git a/resources/lib/moment/lang/sv.js b/resources/lib/moment/lang/sv.js
new file mode 100644 (file)
index 0000000..0de8c40
--- /dev/null
@@ -0,0 +1,63 @@
+// moment.js language configuration
+// language : swedish (sv)
+// author : Jens Alm : https://github.com/ulmus
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+    return moment.lang('sv', {
+        months : "januari_februari_mars_april_maj_juni_juli_augusti_september_oktober_november_december".split("_"),
+        monthsShort : "jan_feb_mar_apr_maj_jun_jul_aug_sep_okt_nov_dec".split("_"),
+        weekdays : "söndag_måndag_tisdag_onsdag_torsdag_fredag_lördag".split("_"),
+        weekdaysShort : "sön_mån_tis_ons_tor_fre_lör".split("_"),
+        weekdaysMin : "sö_må_ti_on_to_fr_lö".split("_"),
+        longDateFormat : {
+            LT : "HH:mm",
+            L : "YYYY-MM-DD",
+            LL : "D MMMM YYYY",
+            LLL : "D MMMM YYYY LT",
+            LLLL : "dddd D MMMM YYYY LT"
+        },
+        calendar : {
+            sameDay: '[Idag] LT',
+            nextDay: '[Imorgon] LT',
+            lastDay: '[Igår] LT',
+            nextWeek: 'dddd LT',
+            lastWeek: '[Förra] dddd[en] LT',
+            sameElse: 'L'
+        },
+        relativeTime : {
+            future : "om %s",
+            past : "för %s sedan",
+            s : "några sekunder",
+            m : "en minut",
+            mm : "%d minuter",
+            h : "en timme",
+            hh : "%d timmar",
+            d : "en dag",
+            dd : "%d dagar",
+            M : "en månad",
+            MM : "%d månader",
+            y : "ett år",
+            yy : "%d år"
+        },
+        ordinal : function (number) {
+            var b = number % 10,
+                output = (~~ (number % 100 / 10) === 1) ? 'e' :
+                (b === 1) ? 'a' :
+                (b === 2) ? 'a' :
+                (b === 3) ? 'e' : 'e';
+            return number + output;
+        },
+        week : {
+            dow : 1, // Monday is the first day of the week.
+            doy : 4  // The week that contains Jan 4th is the first week of the year.
+        }
+    });
+}));
diff --git a/resources/lib/moment/lang/ta.js b/resources/lib/moment/lang/ta.js
new file mode 100644 (file)
index 0000000..cc742c9
--- /dev/null
@@ -0,0 +1,112 @@
+// moment.js language configuration
+// language : tamil (ta)
+// author : Arjunkumar Krishnamoorthy : https://github.com/tk120404
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+    /*var symbolMap = {
+            '1': '௧',
+            '2': '௨',
+            '3': '௩',
+            '4': '௪',
+            '5': '௫',
+            '6': '௬',
+            '7': '௭',
+            '8': '௮',
+            '9': '௯',
+            '0': '௦'
+        },
+        numberMap = {
+            '௧': '1',
+            '௨': '2',
+            '௩': '3',
+            '௪': '4',
+            '௫': '5',
+            '௬': '6',
+            '௭': '7',
+            '௮': '8',
+            '௯': '9',
+            '௦': '0'
+        }; */
+
+    return moment.lang('ta', {
+        months : 'ஜனவரி_பிப்ரவரி_மார்ச்_ஏப்ரல்_மே_ஜூன்_ஜூலை_ஆகஸ்ட்_செப்டெம்பர்_அக்டோபர்_நவம்பர்_டிசம்பர்'.split("_"),
+        monthsShort : 'ஜனவரி_பிப்ரவரி_மார்ச்_ஏப்ரல்_மே_ஜூன்_ஜூலை_ஆகஸ்ட்_செப்டெம்பர்_அக்டோபர்_நவம்பர்_டிசம்பர்'.split("_"),
+        weekdays : 'ஞாயிற்றுக்கிழமை_திங்கட்கிழமை_செவ்வாய்கிழமை_புதன்கிழமை_வியாழக்கிழமை_வெள்ளிக்கிழமை_சனிக்கிழமை'.split("_"),
+        weekdaysShort : 'ஞாயிறு_திங்கள்_செவ்வாய்_புதன்_வியாழன்_வெள்ளி_சனி'.split("_"),
+        weekdaysMin : 'ஞா_தி_செ_பு_வி_வெ_ச'.split("_"),
+        longDateFormat : {
+            LT : "HH:mm",
+            L : "DD/MM/YYYY",
+            LL : "D MMMM YYYY",
+            LLL : "D MMMM YYYY, LT",
+            LLLL : "dddd, D MMMM YYYY, LT"
+        },
+        calendar : {
+            sameDay : '[இன்று] LT',
+            nextDay : '[நாளை] LT',
+            nextWeek : 'dddd, LT',
+            lastDay : '[நேற்று] LT',
+            lastWeek : '[கடந்த வாரம்] dddd, LT',
+            sameElse : 'L'
+        },
+        relativeTime : {
+            future : "%s இல்",
+            past : "%s முன்",
+            s : "ஒரு சில விநாடிகள்",
+            m : "ஒரு நிமிடம்",
+            mm : "%d நிமிடங்கள்",
+            h : "ஒரு மணி நேரம்",
+            hh : "%d மணி நேரம்",
+            d : "ஒரு நாள்",
+            dd : "%d நாட்கள்",
+            M : "ஒரு மாதம்",
+            MM : "%d மாதங்கள்",
+            y : "ஒரு வருடம்",
+            yy : "%d ஆண்டுகள்"
+        },
+/*        preparse: function (string) {
+            return string.replace(/[௧௨௩௪௫௬௭௮௯௦]/g, function (match) {
+                return numberMap[match];
+            });
+        },
+        postformat: function (string) {
+            return string.replace(/\d/g, function (match) {
+                return symbolMap[match];
+            });
+        },*/
+        ordinal : function (number) {
+            return number + 'வது';
+        },
+
+
+// refer http://ta.wikipedia.org/s/1er1      
+
+        meridiem : function (hour, minute, isLower) {
+            if (hour >= 6 && hour <= 10) {
+                return " காலை";
+            } else   if (hour >= 10 && hour <= 14) {
+                return " நண்பகல்";
+            } else    if (hour >= 14 && hour <= 18) {
+                return " எற்பாடு";
+            } else   if (hour >= 18 && hour <= 20) {
+                return " மாலை";
+            } else  if (hour >= 20 && hour <= 24) {
+                return " இரவு";
+            } else  if (hour >= 0 && hour <= 6) {
+                return " வைகறை";
+            }
+        },
+        week : {
+            dow : 0, // Sunday is the first day of the week.
+            doy : 6  // The week that contains Jan 1st is the first week of the year.
+        }
+    });
+}));
diff --git a/resources/lib/moment/lang/th.js b/resources/lib/moment/lang/th.js
new file mode 100644 (file)
index 0000000..70336c8
--- /dev/null
@@ -0,0 +1,58 @@
+// moment.js language configuration
+// language : thai (th)
+// author : Kridsada Thanabulpong : https://github.com/sirn
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+    return moment.lang('th', {
+        months : "มกราคม_กุมภาพันธ์_มีนาคม_เมษายน_พฤษภาคม_มิถุนายน_กรกฎาคม_สิงหาคม_กันยายน_ตุลาคม_พฤศจิกายน_ธันวาคม".split("_"),
+        monthsShort : "มกรา_กุมภา_มีนา_เมษา_พฤษภา_มิถุนา_กรกฎา_สิงหา_กันยา_ตุลา_พฤศจิกา_ธันวา".split("_"),
+        weekdays : "อาทิตย์_จันทร์_อังคาร_พุธ_พฤหัสบดี_ศุกร์_เสาร์".split("_"),
+        weekdaysShort : "อาทิตย์_จันทร์_อังคาร_พุธ_พฤหัส_ศุกร์_เสาร์".split("_"), // yes, three characters difference
+        weekdaysMin : "อา._จ._อ._พ._พฤ._ศ._ส.".split("_"),
+        longDateFormat : {
+            LT : "H นาฬิกา m นาที",
+            L : "YYYY/MM/DD",
+            LL : "D MMMM YYYY",
+            LLL : "D MMMM YYYY เวลา LT",
+            LLLL : "วันddddที่ D MMMM YYYY เวลา LT"
+        },
+        meridiem : function (hour, minute, isLower) {
+            if (hour < 12) {
+                return "ก่อนเที่ยง";
+            } else {
+                return "หลังเที่ยง";
+            }
+        },
+        calendar : {
+            sameDay : '[วันนี้ เวลา] LT',
+            nextDay : '[พรุ่งนี้ เวลา] LT',
+            nextWeek : 'dddd[หน้า เวลา] LT',
+            lastDay : '[เมื่อวานนี้ เวลา] LT',
+            lastWeek : '[วัน]dddd[ที่แล้ว เวลา] LT',
+            sameElse : 'L'
+        },
+        relativeTime : {
+            future : "อีก %s",
+            past : "%sที่แล้ว",
+            s : "ไม่กี่วินาที",
+            m : "1 นาที",
+            mm : "%d นาที",
+            h : "1 ชั่วโมง",
+            hh : "%d ชั่วโมง",
+            d : "1 วัน",
+            dd : "%d วัน",
+            M : "1 เดือน",
+            MM : "%d เดือน",
+            y : "1 ปี",
+            yy : "%d ปี"
+        }
+    });
+}));
diff --git a/resources/lib/moment/lang/tl-ph.js b/resources/lib/moment/lang/tl-ph.js
new file mode 100644 (file)
index 0000000..8044483
--- /dev/null
@@ -0,0 +1,58 @@
+// moment.js language configuration
+// language : Tagalog/Filipino (tl-ph)
+// author : Dan Hagman
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+    return moment.lang('tl-ph', {
+        months : "Enero_Pebrero_Marso_Abril_Mayo_Hunyo_Hulyo_Agosto_Setyembre_Oktubre_Nobyembre_Disyembre".split("_"),
+        monthsShort : "Ene_Peb_Mar_Abr_May_Hun_Hul_Ago_Set_Okt_Nob_Dis".split("_"),
+        weekdays : "Linggo_Lunes_Martes_Miyerkules_Huwebes_Biyernes_Sabado".split("_"),
+        weekdaysShort : "Lin_Lun_Mar_Miy_Huw_Biy_Sab".split("_"),
+        weekdaysMin : "Li_Lu_Ma_Mi_Hu_Bi_Sab".split("_"),
+        longDateFormat : {
+            LT : "HH:mm",
+            L : "MM/D/YYYY",
+            LL : "MMMM D, YYYY",
+            LLL : "MMMM D, YYYY LT",
+            LLLL : "dddd, MMMM DD, YYYY LT"
+        },
+        calendar : {
+            sameDay: "[Ngayon sa] LT",
+            nextDay: '[Bukas sa] LT',
+            nextWeek: 'dddd [sa] LT',
+            lastDay: '[Kahapon sa] LT',
+            lastWeek: 'dddd [huling linggo] LT',
+            sameElse: 'L'
+        },
+        relativeTime : {
+            future : "sa loob ng %s",
+            past : "%s ang nakalipas",
+            s : "ilang segundo",
+            m : "isang minuto",
+            mm : "%d minuto",
+            h : "isang oras",
+            hh : "%d oras",
+            d : "isang araw",
+            dd : "%d araw",
+            M : "isang buwan",
+            MM : "%d buwan",
+            y : "isang taon",
+            yy : "%d taon"
+        },
+        ordinal : function (number) {
+            return number;
+        },
+        week : {
+            dow : 1, // Monday is the first day of the week.
+            doy : 4  // The week that contains Jan 4th is the first week of the year.
+        }
+    });
+}));
diff --git a/resources/lib/moment/lang/tr.js b/resources/lib/moment/lang/tr.js
new file mode 100644 (file)
index 0000000..e90f250
--- /dev/null
@@ -0,0 +1,93 @@
+// moment.js language configuration
+// language : turkish (tr)
+// authors : Erhan Gundogan : https://github.com/erhangundogan,
+//           Burak Yiğit Kaya: https://github.com/BYK
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+
+    var suffixes = {
+        1: "'inci",
+        5: "'inci",
+        8: "'inci",
+        70: "'inci",
+        80: "'inci",
+
+        2: "'nci",
+        7: "'nci",
+        20: "'nci",
+        50: "'nci",
+
+        3: "'üncü",
+        4: "'üncü",
+        100: "'üncü",
+
+        6: "'ncı",
+
+        9: "'uncu",
+        10: "'uncu",
+        30: "'uncu",
+
+        60: "'ıncı",
+        90: "'ıncı"
+    };
+
+    return moment.lang('tr', {
+        months : "Ocak_Şubat_Mart_Nisan_Mayıs_Haziran_Temmuz_Ağustos_Eylül_Ekim_Kasım_Aralık".split("_"),
+        monthsShort : "Oca_Şub_Mar_Nis_May_Haz_Tem_Ağu_Eyl_Eki_Kas_Ara".split("_"),
+        weekdays : "Pazar_Pazartesi_Salı_Çarşamba_Perşembe_Cuma_Cumartesi".split("_"),
+        weekdaysShort : "Paz_Pts_Sal_Çar_Per_Cum_Cts".split("_"),
+        weekdaysMin : "Pz_Pt_Sa_Ça_Pe_Cu_Ct".split("_"),
+        longDateFormat : {
+            LT : "HH:mm",
+            L : "DD.MM.YYYY",
+            LL : "D MMMM YYYY",
+            LLL : "D MMMM YYYY LT",
+            LLLL : "dddd, D MMMM YYYY LT"
+        },
+        calendar : {
+            sameDay : '[bugün saat] LT',
+            nextDay : '[yarın saat] LT',
+            nextWeek : '[haftaya] dddd [saat] LT',
+            lastDay : '[dün] LT',
+            lastWeek : '[geçen hafta] dddd [saat] LT',
+            sameElse : 'L'
+        },
+        relativeTime : {
+            future : "%s sonra",
+            past : "%s önce",
+            s : "birkaç saniye",
+            m : "bir dakika",
+            mm : "%d dakika",
+            h : "bir saat",
+            hh : "%d saat",
+            d : "bir gün",
+            dd : "%d gün",
+            M : "bir ay",
+            MM : "%d ay",
+            y : "bir yıl",
+            yy : "%d yıl"
+        },
+        ordinal : function (number) {
+            if (number === 0) {  // special case for zero
+                return number + "'ıncı";
+            }
+            var a = number % 10,
+                b = number % 100 - a,
+                c = number >= 100 ? 100 : null;
+
+            return number + (suffixes[a] || suffixes[b] || suffixes[c]);
+        },
+        week : {
+            dow : 1, // Monday is the first day of the week.
+            doy : 7  // The week that contains Jan 1st is the first week of the year.
+        }
+    });
+}));
diff --git a/resources/lib/moment/lang/tzm-la.js b/resources/lib/moment/lang/tzm-la.js
new file mode 100644 (file)
index 0000000..be1d878
--- /dev/null
@@ -0,0 +1,55 @@
+// moment.js language configuration
+// language : Morocco Central Atlas Tamaziɣt in Latin (tzm-la)
+// author : Abdel Said : https://github.com/abdelsaid
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+    return moment.lang('tzm-la', {
+        months : "innayr_brˤayrˤ_marˤsˤ_ibrir_mayyw_ywnyw_ywlywz_ɣwšt_šwtanbir_ktˤwbrˤ_nwwanbir_dwjnbir".split("_"),
+        monthsShort : "innayr_brˤayrˤ_marˤsˤ_ibrir_mayyw_ywnyw_ywlywz_ɣwšt_šwtanbir_ktˤwbrˤ_nwwanbir_dwjnbir".split("_"),
+        weekdays : "asamas_aynas_asinas_akras_akwas_asimwas_asiḍyas".split("_"),
+        weekdaysShort : "asamas_aynas_asinas_akras_akwas_asimwas_asiḍyas".split("_"),
+        weekdaysMin : "asamas_aynas_asinas_akras_akwas_asimwas_asiḍyas".split("_"),
+        longDateFormat : {
+            LT : "HH:mm",
+            L : "DD/MM/YYYY",
+            LL : "D MMMM YYYY",
+            LLL : "D MMMM YYYY LT",
+            LLLL : "dddd D MMMM YYYY LT"
+        },
+        calendar : {
+            sameDay: "[asdkh g] LT",
+            nextDay: '[aska g] LT',
+            nextWeek: 'dddd [g] LT',
+            lastDay: '[assant g] LT',
+            lastWeek: 'dddd [g] LT',
+            sameElse: 'L'
+        },
+        relativeTime : {
+            future : "dadkh s yan %s",
+            past : "yan %s",
+            s : "imik",
+            m : "minuḍ",
+            mm : "%d minuḍ",
+            h : "saɛa",
+            hh : "%d tassaɛin",
+            d : "ass",
+            dd : "%d ossan",
+            M : "ayowr",
+            MM : "%d iyyirn",
+            y : "asgas",
+            yy : "%d isgasn"
+        },
+        week : {
+            dow : 6, // Saturday is the first day of the week.
+            doy : 12  // The week that contains Jan 1st is the first week of the year.
+        }
+    });
+}));
diff --git a/resources/lib/moment/lang/tzm.js b/resources/lib/moment/lang/tzm.js
new file mode 100644 (file)
index 0000000..c7c76bd
--- /dev/null
@@ -0,0 +1,55 @@
+// moment.js language configuration
+// language : Morocco Central Atlas Tamaziɣt (tzm)
+// author : Abdel Said : https://github.com/abdelsaid
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+    return moment.lang('tzm', {
+        months : "ⵉⵏⵏⴰⵢⵔ_ⴱⵕⴰⵢⵕ_ⵎⴰⵕⵚ_ⵉⴱⵔⵉⵔ_ⵎⴰⵢⵢⵓ_ⵢⵓⵏⵢⵓ_ⵢⵓⵍⵢⵓⵣ_ⵖⵓⵛⵜ_ⵛⵓⵜⴰⵏⴱⵉⵔ_ⴽⵟⵓⴱⵕ_ⵏⵓⵡⴰⵏⴱⵉⵔ_ⴷⵓⵊⵏⴱⵉⵔ".split("_"),
+        monthsShort : "ⵉⵏⵏⴰⵢⵔ_ⴱⵕⴰⵢⵕ_ⵎⴰⵕⵚ_ⵉⴱⵔⵉⵔ_ⵎⴰⵢⵢⵓ_ⵢⵓⵏⵢⵓ_ⵢⵓⵍⵢⵓⵣ_ⵖⵓⵛⵜ_ⵛⵓⵜⴰⵏⴱⵉⵔ_ⴽⵟⵓⴱⵕ_ⵏⵓⵡⴰⵏⴱⵉⵔ_ⴷⵓⵊⵏⴱⵉⵔ".split("_"),
+        weekdays : "ⴰⵙⴰⵎⴰⵙ_ⴰⵢⵏⴰⵙ_ⴰⵙⵉⵏⴰⵙ_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ".split("_"),
+        weekdaysShort : "ⴰⵙⴰⵎⴰⵙ_ⴰⵢⵏⴰⵙ_ⴰⵙⵉⵏⴰⵙ_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ".split("_"),
+        weekdaysMin : "ⴰⵙⴰⵎⴰⵙ_ⴰⵢⵏⴰⵙ_ⴰⵙⵉⵏⴰⵙ_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ".split("_"),
+        longDateFormat : {
+            LT : "HH:mm",
+            L : "DD/MM/YYYY",
+            LL : "D MMMM YYYY",
+            LLL : "D MMMM YYYY LT",
+            LLLL : "dddd D MMMM YYYY LT"
+        },
+        calendar : {
+            sameDay: "[ⴰⵙⴷⵅ ⴴ] LT",
+            nextDay: '[ⴰⵙⴽⴰ ⴴ] LT',
+            nextWeek: 'dddd [ⴴ] LT',
+            lastDay: '[ⴰⵚⴰⵏⵜ ⴴ] LT',
+            lastWeek: 'dddd [ⴴ] LT',
+            sameElse: 'L'
+        },
+        relativeTime : {
+            future : "ⴷⴰⴷⵅ ⵙ ⵢⴰⵏ %s",
+            past : "ⵢⴰⵏ %s",
+            s : "ⵉⵎⵉⴽ",
+            m : "ⵎⵉⵏⵓⴺ",
+            mm : "%d ⵎⵉⵏⵓⴺ",
+            h : "ⵙⴰⵄⴰ",
+            hh : "%d ⵜⴰⵙⵙⴰⵄⵉⵏ",
+            d : "ⴰⵙⵙ",
+            dd : "%d oⵙⵙⴰⵏ",
+            M : "ⴰⵢoⵓⵔ",
+            MM : "%d ⵉⵢⵢⵉⵔⵏ",
+            y : "ⴰⵙⴳⴰⵙ",
+            yy : "%d ⵉⵙⴳⴰⵙⵏ"
+        },
+        week : {
+            dow : 6, // Saturday is the first day of the week.
+            doy : 12  // The week that contains Jan 1st is the first week of the year.
+        }
+    });
+}));
diff --git a/resources/lib/moment/lang/uk.js b/resources/lib/moment/lang/uk.js
new file mode 100644 (file)
index 0000000..47056cb
--- /dev/null
@@ -0,0 +1,157 @@
+// moment.js language configuration
+// language : ukrainian (uk)
+// author : zemlanin : https://github.com/zemlanin
+// Author : Menelion Elensúle : https://github.com/Oire
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+    function plural(word, num) {
+        var forms = word.split('_');
+        return num % 10 === 1 && num % 100 !== 11 ? forms[0] : (num % 10 >= 2 && num % 10 <= 4 && (num % 100 < 10 || num % 100 >= 20) ? forms[1] : forms[2]);
+    }
+
+    function relativeTimeWithPlural(number, withoutSuffix, key) {
+        var format = {
+            'mm': 'хвилина_хвилини_хвилин',
+            'hh': 'година_години_годин',
+            'dd': 'день_дні_днів',
+            'MM': 'місяць_місяці_місяців',
+            'yy': 'рік_роки_років'
+        };
+        if (key === 'm') {
+            return withoutSuffix ? 'хвилина' : 'хвилину';
+        }
+        else if (key === 'h') {
+            return withoutSuffix ? 'година' : 'годину';
+        }
+        else {
+            return number + ' ' + plural(format[key], +number);
+        }
+    }
+
+    function monthsCaseReplace(m, format) {
+        var months = {
+            'nominative': 'січень_лютий_березень_квітень_травень_червень_липень_серпень_вересень_жовтень_листопад_грудень'.split('_'),
+            'accusative': 'січня_лютого_березня_квітня_травня_червня_липня_серпня_вересня_жовтня_листопада_грудня'.split('_')
+        },
+
+        nounCase = (/D[oD]? *MMMM?/).test(format) ?
+            'accusative' :
+            'nominative';
+
+        return months[nounCase][m.month()];
+    }
+
+    function weekdaysCaseReplace(m, format) {
+        var weekdays = {
+            'nominative': 'неділя_понеділок_вівторок_середа_четвер_п’ятниця_субота'.split('_'),
+            'accusative': 'неділю_понеділок_вівторок_середу_четвер_п’ятницю_суботу'.split('_'),
+            'genitive': 'неділі_понеділка_вівторка_середи_четверга_п’ятниці_суботи'.split('_')
+        },
+
+        nounCase = (/(\[[ВвУу]\]) ?dddd/).test(format) ?
+            'accusative' :
+            ((/\[?(?:минулої|наступної)? ?\] ?dddd/).test(format) ?
+                'genitive' :
+                'nominative');
+
+        return weekdays[nounCase][m.day()];
+    }
+
+    function processHoursFunction(str) {
+        return function () {
+            return str + 'о' + (this.hours() === 11 ? 'б' : '') + '] LT';
+        };
+    }
+
+    return moment.lang('uk', {
+        months : monthsCaseReplace,
+        monthsShort : "січ_лют_бер_квіт_трав_черв_лип_серп_вер_жовт_лист_груд".split("_"),
+        weekdays : weekdaysCaseReplace,
+        weekdaysShort : "нд_пн_вт_ср_чт_пт_сб".split("_"),
+        weekdaysMin : "нд_пн_вт_ср_чт_пт_сб".split("_"),
+        longDateFormat : {
+            LT : "HH:mm",
+            L : "DD.MM.YYYY",
+            LL : "D MMMM YYYY р.",
+            LLL : "D MMMM YYYY р., LT",
+            LLLL : "dddd, D MMMM YYYY р., LT"
+        },
+        calendar : {
+            sameDay: processHoursFunction('[Сьогодні '),
+            nextDay: processHoursFunction('[Завтра '),
+            lastDay: processHoursFunction('[Вчора '),
+            nextWeek: processHoursFunction('[У] dddd ['),
+            lastWeek: function () {
+                switch (this.day()) {
+                case 0:
+                case 3:
+                case 5:
+                case 6:
+                    return processHoursFunction('[Минулої] dddd [').call(this);
+                case 1:
+                case 2:
+                case 4:
+                    return processHoursFunction('[Минулого] dddd [').call(this);
+                }
+            },
+            sameElse: 'L'
+        },
+        relativeTime : {
+            future : "за %s",
+            past : "%s тому",
+            s : "декілька секунд",
+            m : relativeTimeWithPlural,
+            mm : relativeTimeWithPlural,
+            h : "годину",
+            hh : relativeTimeWithPlural,
+            d : "день",
+            dd : relativeTimeWithPlural,
+            M : "місяць",
+            MM : relativeTimeWithPlural,
+            y : "рік",
+            yy : relativeTimeWithPlural
+        },
+
+        // M. E.: those two are virtually unused but a user might want to implement them for his/her website for some reason
+
+        meridiem : function (hour, minute, isLower) {
+            if (hour < 4) {
+                return "ночі";
+            } else if (hour < 12) {
+                return "ранку";
+            } else if (hour < 17) {
+                return "дня";
+            } else {
+                return "вечора";
+            }
+        },
+
+        ordinal: function (number, period) {
+            switch (period) {
+            case 'M':
+            case 'd':
+            case 'DDD':
+            case 'w':
+            case 'W':
+                return number + '-й';
+            case 'D':
+                return number + '-го';
+            default:
+                return number;
+            }
+        },
+
+        week : {
+            dow : 1, // Monday is the first day of the week.
+            doy : 7  // The week that contains Jan 1st is the first week of the year.
+        }
+    });
+}));
diff --git a/resources/lib/moment/lang/uz.js b/resources/lib/moment/lang/uz.js
new file mode 100644 (file)
index 0000000..a5b06fa
--- /dev/null
@@ -0,0 +1,55 @@
+// moment.js language configuration
+// language : uzbek
+// author : Sardor Muminov : https://github.com/muminoff
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+    return moment.lang('uz', {
+        months : "январь_февраль_март_апрель_май_июнь_июль_август_сентябрь_октябрь_ноябрь_декабрь".split("_"),
+        monthsShort : "янв_фев_мар_апр_май_июн_июл_авг_сен_окт_ноя_дек".split("_"),
+        weekdays : "Якшанба_Душанба_Сешанба_Чоршанба_Пайшанба_Жума_Шанба".split("_"),
+        weekdaysShort : "Якш_Душ_Сеш_Чор_Пай_Жум_Шан".split("_"),
+        weekdaysMin : "Як_Ду_Се_Чо_Па_Жу_Ша".split("_"),
+        longDateFormat : {
+            LT : "HH:mm",
+            L : "DD/MM/YYYY",
+            LL : "D MMMM YYYY",
+            LLL : "D MMMM YYYY LT",
+            LLLL : "D MMMM YYYY, dddd LT"
+        },
+        calendar : {
+            sameDay : '[Бугун соат] LT [да]',
+            nextDay : '[Эртага] LT [да]',
+            nextWeek : 'dddd [куни соат] LT [да]',
+            lastDay : '[Кеча соат] LT [да]',
+            lastWeek : '[Утган] dddd [куни соат] LT [да]',
+            sameElse : 'L'
+        },
+        relativeTime : {
+            future : "Якин %s ичида",
+            past : "Бир неча %s олдин",
+            s : "фурсат",
+            m : "бир дакика",
+            mm : "%d дакика",
+            h : "бир соат",
+            hh : "%d соат",
+            d : "бир кун",
+            dd : "%d кун",
+            M : "бир ой",
+            MM : "%d ой",
+            y : "бир йил",
+            yy : "%d йил"
+        },
+        week : {
+            dow : 1, // Monday is the first day of the week.
+            doy : 7  // The week that contains Jan 4th is the first week of the year.
+        }
+    });
+}));
diff --git a/resources/lib/moment/lang/vn.js b/resources/lib/moment/lang/vn.js
new file mode 100644 (file)
index 0000000..f28e7c3
--- /dev/null
@@ -0,0 +1,62 @@
+// moment.js language configuration
+// language : vietnamese (vn)
+// author : Bang Nguyen : https://github.com/bangnk
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+    return moment.lang('vn', {
+        months : "tháng 1_tháng 2_tháng 3_tháng 4_tháng 5_tháng 6_tháng 7_tháng 8_tháng 9_tháng 10_tháng 11_tháng 12".split("_"),
+        monthsShort : "Th01_Th02_Th03_Th04_Th05_Th06_Th07_Th08_Th09_Th10_Th11_Th12".split("_"),
+        weekdays : "chủ nhật_thứ hai_thứ ba_thứ tư_thứ năm_thứ sáu_thứ bảy".split("_"),
+        weekdaysShort : "CN_T2_T3_T4_T5_T6_T7".split("_"),
+        weekdaysMin : "CN_T2_T3_T4_T5_T6_T7".split("_"),
+        longDateFormat : {
+            LT : "HH:mm",
+            L : "DD/MM/YYYY",
+            LL : "D MMMM [năm] YYYY",
+            LLL : "D MMMM [năm] YYYY LT",
+            LLLL : "dddd, D MMMM [năm] YYYY LT",
+            l : "DD/M/YYYY",
+            ll : "D MMM YYYY",
+            lll : "D MMM YYYY LT",
+            llll : "ddd, D MMM YYYY LT"
+        },
+        calendar : {
+            sameDay: "[Hôm nay lúc] LT",
+            nextDay: '[Ngày mai lúc] LT',
+            nextWeek: 'dddd [tuần tới lúc] LT',
+            lastDay: '[Hôm qua lúc] LT',
+            lastWeek: 'dddd [tuần rồi lúc] LT',
+            sameElse: 'L'
+        },
+        relativeTime : {
+            future : "%s tới",
+            past : "%s trước",
+            s : "vài giây",
+            m : "một phút",
+            mm : "%d phút",
+            h : "một giờ",
+            hh : "%d giờ",
+            d : "một ngày",
+            dd : "%d ngày",
+            M : "một tháng",
+            MM : "%d tháng",
+            y : "một năm",
+            yy : "%d năm"
+        },
+        ordinal : function (number) {
+            return number;
+        },
+        week : {
+            dow : 1, // Monday is the first day of the week.
+            doy : 4  // The week that contains Jan 4th is the first week of the year.
+        }
+    });
+}));
diff --git a/resources/lib/moment/lang/zh-cn.js b/resources/lib/moment/lang/zh-cn.js
new file mode 100644 (file)
index 0000000..50a3ed9
--- /dev/null
@@ -0,0 +1,108 @@
+// moment.js language configuration
+// language : chinese
+// author : suupic : https://github.com/suupic
+// author : Zeno Zeng : https://github.com/zenozeng
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+    return moment.lang('zh-cn', {
+        months : "一月_二月_三月_四月_五月_六月_七月_八月_九月_十月_十一月_十二月".split("_"),
+        monthsShort : "1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月".split("_"),
+        weekdays : "星期日_星期一_星期二_星期三_星期四_星期五_星期六".split("_"),
+        weekdaysShort : "周日_周一_周二_周三_周四_周五_周六".split("_"),
+        weekdaysMin : "日_一_二_三_四_五_六".split("_"),
+        longDateFormat : {
+            LT : "Ah点mm",
+            L : "YYYY-MM-DD",
+            LL : "YYYY年MMMD日",
+            LLL : "YYYY年MMMD日LT",
+            LLLL : "YYYY年MMMD日ddddLT",
+            l : "YYYY-MM-DD",
+            ll : "YYYY年MMMD日",
+            lll : "YYYY年MMMD日LT",
+            llll : "YYYY年MMMD日ddddLT"
+        },
+        meridiem : function (hour, minute, isLower) {
+            var hm = hour * 100 + minute;
+            if (hm < 600) {
+                return "凌晨";
+            } else if (hm < 900) {
+                return "早上";
+            } else if (hm < 1130) {
+                return "上午";
+            } else if (hm < 1230) {
+                return "中午";
+            } else if (hm < 1800) {
+                return "下午";
+            } else {
+                return "晚上";
+            }
+        },
+        calendar : {
+            sameDay : function () {
+                return this.minutes() === 0 ? "[今天]Ah[点整]" : "[今天]LT";
+            },
+            nextDay : function () {
+                return this.minutes() === 0 ? "[明天]Ah[点整]" : "[明天]LT";
+            },
+            lastDay : function () {
+                return this.minutes() === 0 ? "[昨天]Ah[点整]" : "[昨天]LT";
+            },
+            nextWeek : function () {
+                var startOfWeek, prefix;
+                startOfWeek = moment().startOf('week');
+                prefix = this.unix() - startOfWeek.unix() >= 7 * 24 * 3600 ? '[下]' : '[本]';
+                return this.minutes() === 0 ? prefix + "dddAh点整" : prefix + "dddAh点mm";
+            },
+            lastWeek : function () {
+                var startOfWeek, prefix;
+                startOfWeek = moment().startOf('week');
+                prefix = this.unix() < startOfWeek.unix()  ? '[上]' : '[本]';
+                return this.minutes() === 0 ? prefix + "dddAh点整" : prefix + "dddAh点mm";
+            },
+            sameElse : 'LL'
+        },
+        ordinal : function (number, period) {
+            switch (period) {
+            case "d":
+            case "D":
+            case "DDD":
+                return number + "日";
+            case "M":
+                return number + "月";
+            case "w":
+            case "W":
+                return number + "周";
+            default:
+                return number;
+            }
+        },
+        relativeTime : {
+            future : "%s内",
+            past : "%s前",
+            s : "几秒",
+            m : "1分钟",
+            mm : "%d分钟",
+            h : "1小时",
+            hh : "%d小时",
+            d : "1天",
+            dd : "%d天",
+            M : "1个月",
+            MM : "%d个月",
+            y : "1年",
+            yy : "%d年"
+        },
+        week : {
+            // GB/T 7408-1994《数据元和交换格式·信息交换·日期和时间表示法》与ISO 8601:1988等效
+            dow : 1, // Monday is the first day of the week.
+            doy : 4  // The week that contains Jan 4th is the first week of the year.
+        }
+    });
+}));
diff --git a/resources/lib/moment/lang/zh-tw.js b/resources/lib/moment/lang/zh-tw.js
new file mode 100644 (file)
index 0000000..bbb0737
--- /dev/null
@@ -0,0 +1,84 @@
+// moment.js language configuration
+// language : traditional chinese (zh-tw)
+// author : Ben : https://github.com/ben-lin
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+    return moment.lang('zh-tw', {
+        months : "一月_二月_三月_四月_五月_六月_七月_八月_九月_十月_十一月_十二月".split("_"),
+        monthsShort : "1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月".split("_"),
+        weekdays : "星期日_星期一_星期二_星期三_星期四_星期五_星期六".split("_"),
+        weekdaysShort : "週日_週一_週二_週三_週四_週五_週六".split("_"),
+        weekdaysMin : "日_一_二_三_四_五_六".split("_"),
+        longDateFormat : {
+            LT : "Ah點mm",
+            L : "YYYY年MMMD日",
+            LL : "YYYY年MMMD日",
+            LLL : "YYYY年MMMD日LT",
+            LLLL : "YYYY年MMMD日ddddLT",
+            l : "YYYY年MMMD日",
+            ll : "YYYY年MMMD日",
+            lll : "YYYY年MMMD日LT",
+            llll : "YYYY年MMMD日ddddLT"
+        },
+        meridiem : function (hour, minute, isLower) {
+            var hm = hour * 100 + minute;
+            if (hm < 900) {
+                return "早上";
+            } else if (hm < 1130) {
+                return "上午";
+            } else if (hm < 1230) {
+                return "中午";
+            } else if (hm < 1800) {
+                return "下午";
+            } else {
+                return "晚上";
+            }
+        },
+        calendar : {
+            sameDay : '[今天]LT',
+            nextDay : '[明天]LT',
+            nextWeek : '[下]ddddLT',
+            lastDay : '[昨天]LT',
+            lastWeek : '[上]ddddLT',
+            sameElse : 'L'
+        },
+        ordinal : function (number, period) {
+            switch (period) {
+            case "d" :
+            case "D" :
+            case "DDD" :
+                return number + "日";
+            case "M" :
+                return number + "月";
+            case "w" :
+            case "W" :
+                return number + "週";
+            default :
+                return number;
+            }
+        },
+        relativeTime : {
+            future : "%s內",
+            past : "%s前",
+            s : "幾秒",
+            m : "一分鐘",
+            mm : "%d分鐘",
+            h : "一小時",
+            hh : "%d小時",
+            d : "一天",
+            dd : "%d天",
+            M : "一個月",
+            MM : "%d個月",
+            y : "一年",
+            yy : "%d年"
+        }
+    });
+}));
diff --git a/resources/lib/moment/moment.js b/resources/lib/moment/moment.js
new file mode 100644 (file)
index 0000000..b79da7f
--- /dev/null
@@ -0,0 +1,2400 @@
+//! moment.js
+//! version : 2.5.1
+//! authors : Tim Wood, Iskren Chernev, Moment.js contributors
+//! license : MIT
+//! momentjs.com
+
+(function (undefined) {
+
+    /************************************
+        Constants
+    ************************************/
+
+    var moment,
+        VERSION = "2.5.1",
+        global = this,
+        round = Math.round,
+        i,
+
+        YEAR = 0,
+        MONTH = 1,
+        DATE = 2,
+        HOUR = 3,
+        MINUTE = 4,
+        SECOND = 5,
+        MILLISECOND = 6,
+
+        // internal storage for language config files
+        languages = {},
+
+        // moment internal properties
+        momentProperties = {
+            _isAMomentObject: null,
+            _i : null,
+            _f : null,
+            _l : null,
+            _strict : null,
+            _isUTC : null,
+            _offset : null,  // optional. Combine with _isUTC
+            _pf : null,
+            _lang : null  // optional
+        },
+
+        // check for nodeJS
+        hasModule = (typeof module !== 'undefined' && module.exports && typeof require !== 'undefined'),
+
+        // ASP.NET json date format regex
+        aspNetJsonRegex = /^\/?Date\((\-?\d+)/i,
+        aspNetTimeSpanJsonRegex = /(\-)?(?:(\d*)\.)?(\d+)\:(\d+)(?:\:(\d+)\.?(\d{3})?)?/,
+
+        // from http://docs.closure-library.googlecode.com/git/closure_goog_date_date.js.source.html
+        // somewhat more in line with 4.4.3.2 2004 spec, but allows decimal anywhere
+        isoDurationRegex = /^(-)?P(?:(?:([0-9,.]*)Y)?(?:([0-9,.]*)M)?(?:([0-9,.]*)D)?(?:T(?:([0-9,.]*)H)?(?:([0-9,.]*)M)?(?:([0-9,.]*)S)?)?|([0-9,.]*)W)$/,
+
+        // format tokens
+        formattingTokens = /(\[[^\[]*\])|(\\)?(Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|YYYYYY|YYYYY|YYYY|YY|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|mm?|ss?|S{1,4}|X|zz?|ZZ?|.)/g,
+        localFormattingTokens = /(\[[^\[]*\])|(\\)?(LT|LL?L?L?|l{1,4})/g,
+
+        // parsing token regexes
+        parseTokenOneOrTwoDigits = /\d\d?/, // 0 - 99
+        parseTokenOneToThreeDigits = /\d{1,3}/, // 0 - 999
+        parseTokenOneToFourDigits = /\d{1,4}/, // 0 - 9999
+        parseTokenOneToSixDigits = /[+\-]?\d{1,6}/, // -999,999 - 999,999
+        parseTokenDigits = /\d+/, // nonzero number of digits
+        parseTokenWord = /[0-9]*['a-z\u00A0-\u05FF\u0700-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]+|[\u0600-\u06FF\/]+(\s*?[\u0600-\u06FF]+){1,2}/i, // any word (or two) characters or numbers including two/three word month in arabic.
+        parseTokenTimezone = /Z|[\+\-]\d\d:?\d\d/gi, // +00:00 -00:00 +0000 -0000 or Z
+        parseTokenT = /T/i, // T (ISO separator)
+        parseTokenTimestampMs = /[\+\-]?\d+(\.\d{1,3})?/, // 123456789 123456789.123
+
+        //strict parsing regexes
+        parseTokenOneDigit = /\d/, // 0 - 9
+        parseTokenTwoDigits = /\d\d/, // 00 - 99
+        parseTokenThreeDigits = /\d{3}/, // 000 - 999
+        parseTokenFourDigits = /\d{4}/, // 0000 - 9999
+        parseTokenSixDigits = /[+-]?\d{6}/, // -999,999 - 999,999
+        parseTokenSignedNumber = /[+-]?\d+/, // -inf - inf
+
+        // iso 8601 regex
+        // 0000-00-00 0000-W00 or 0000-W00-0 + T + 00 or 00:00 or 00:00:00 or 00:00:00.000 + +00:00 or +0000 or +00)
+        isoRegex = /^\s*(?:[+-]\d{6}|\d{4})-(?:(\d\d-\d\d)|(W\d\d$)|(W\d\d-\d)|(\d\d\d))((T| )(\d\d(:\d\d(:\d\d(\.\d+)?)?)?)?([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/,
+
+        isoFormat = 'YYYY-MM-DDTHH:mm:ssZ',
+
+        isoDates = [
+            ['YYYYYY-MM-DD', /[+-]\d{6}-\d{2}-\d{2}/],
+            ['YYYY-MM-DD', /\d{4}-\d{2}-\d{2}/],
+            ['GGGG-[W]WW-E', /\d{4}-W\d{2}-\d/],
+            ['GGGG-[W]WW', /\d{4}-W\d{2}/],
+            ['YYYY-DDD', /\d{4}-\d{3}/]
+        ],
+
+        // iso time formats and regexes
+        isoTimes = [
+            ['HH:mm:ss.SSSS', /(T| )\d\d:\d\d:\d\d\.\d{1,3}/],
+            ['HH:mm:ss', /(T| )\d\d:\d\d:\d\d/],
+            ['HH:mm', /(T| )\d\d:\d\d/],
+            ['HH', /(T| )\d\d/]
+        ],
+
+        // timezone chunker "+10:00" > ["10", "00"] or "-1530" > ["-15", "30"]
+        parseTimezoneChunker = /([\+\-]|\d\d)/gi,
+
+        // getter and setter names
+        proxyGettersAndSetters = 'Date|Hours|Minutes|Seconds|Milliseconds'.split('|'),
+        unitMillisecondFactors = {
+            'Milliseconds' : 1,
+            'Seconds' : 1e3,
+            'Minutes' : 6e4,
+            'Hours' : 36e5,
+            'Days' : 864e5,
+            'Months' : 2592e6,
+            'Years' : 31536e6
+        },
+
+        unitAliases = {
+            ms : 'millisecond',
+            s : 'second',
+            m : 'minute',
+            h : 'hour',
+            d : 'day',
+            D : 'date',
+            w : 'week',
+            W : 'isoWeek',
+            M : 'month',
+            y : 'year',
+            DDD : 'dayOfYear',
+            e : 'weekday',
+            E : 'isoWeekday',
+            gg: 'weekYear',
+            GG: 'isoWeekYear'
+        },
+
+        camelFunctions = {
+            dayofyear : 'dayOfYear',
+            isoweekday : 'isoWeekday',
+            isoweek : 'isoWeek',
+            weekyear : 'weekYear',
+            isoweekyear : 'isoWeekYear'
+        },
+
+        // format function strings
+        formatFunctions = {},
+
+        // tokens to ordinalize and pad
+        ordinalizeTokens = 'DDD w W M D d'.split(' '),
+        paddedTokens = 'M D H h m s w W'.split(' '),
+
+        formatTokenFunctions = {
+            M    : function () {
+                return this.month() + 1;
+            },
+            MMM  : function (format) {
+                return this.lang().monthsShort(this, format);
+            },
+            MMMM : function (format) {
+                return this.lang().months(this, format);
+            },
+            D    : function () {
+                return this.date();
+            },
+            DDD  : function () {
+                return this.dayOfYear();
+            },
+            d    : function () {
+                return this.day();
+            },
+            dd   : function (format) {
+                return this.lang().weekdaysMin(this, format);
+            },
+            ddd  : function (format) {
+                return this.lang().weekdaysShort(this, format);
+            },
+            dddd : function (format) {
+                return this.lang().weekdays(this, format);
+            },
+            w    : function () {
+                return this.week();
+            },
+            W    : function () {
+                return this.isoWeek();
+            },
+            YY   : function () {
+                return leftZeroFill(this.year() % 100, 2);
+            },
+            YYYY : function () {
+                return leftZeroFill(this.year(), 4);
+            },
+            YYYYY : function () {
+                return leftZeroFill(this.year(), 5);
+            },
+            YYYYYY : function () {
+                var y = this.year(), sign = y >= 0 ? '+' : '-';
+                return sign + leftZeroFill(Math.abs(y), 6);
+            },
+            gg   : function () {
+                return leftZeroFill(this.weekYear() % 100, 2);
+            },
+            gggg : function () {
+                return leftZeroFill(this.weekYear(), 4);
+            },
+            ggggg : function () {
+                return leftZeroFill(this.weekYear(), 5);
+            },
+            GG   : function () {
+                return leftZeroFill(this.isoWeekYear() % 100, 2);
+            },
+            GGGG : function () {
+                return leftZeroFill(this.isoWeekYear(), 4);
+            },
+            GGGGG : function () {
+                return leftZeroFill(this.isoWeekYear(), 5);
+            },
+            e : function () {
+                return this.weekday();
+            },
+            E : function () {
+                return this.isoWeekday();
+            },
+            a    : function () {
+                return this.lang().meridiem(this.hours(), this.minutes(), true);
+            },
+            A    : function () {
+                return this.lang().meridiem(this.hours(), this.minutes(), false);
+            },
+            H    : function () {
+                return this.hours();
+            },
+            h    : function () {
+                return this.hours() % 12 || 12;
+            },
+            m    : function () {
+                return this.minutes();
+            },
+            s    : function () {
+                return this.seconds();
+            },
+            S    : function () {
+                return toInt(this.milliseconds() / 100);
+            },
+            SS   : function () {
+                return leftZeroFill(toInt(this.milliseconds() / 10), 2);
+            },
+            SSS  : function () {
+                return leftZeroFill(this.milliseconds(), 3);
+            },
+            SSSS : function () {
+                return leftZeroFill(this.milliseconds(), 3);
+            },
+            Z    : function () {
+                var a = -this.zone(),
+                    b = "+";
+                if (a < 0) {
+                    a = -a;
+                    b = "-";
+                }
+                return b + leftZeroFill(toInt(a / 60), 2) + ":" + leftZeroFill(toInt(a) % 60, 2);
+            },
+            ZZ   : function () {
+                var a = -this.zone(),
+                    b = "+";
+                if (a < 0) {
+                    a = -a;
+                    b = "-";
+                }
+                return b + leftZeroFill(toInt(a / 60), 2) + leftZeroFill(toInt(a) % 60, 2);
+            },
+            z : function () {
+                return this.zoneAbbr();
+            },
+            zz : function () {
+                return this.zoneName();
+            },
+            X    : function () {
+                return this.unix();
+            },
+            Q : function () {
+                return this.quarter();
+            }
+        },
+
+        lists = ['months', 'monthsShort', 'weekdays', 'weekdaysShort', 'weekdaysMin'];
+
+    function defaultParsingFlags() {
+        // We need to deep clone this object, and es5 standard is not very
+        // helpful.
+        return {
+            empty : false,
+            unusedTokens : [],
+            unusedInput : [],
+            overflow : -2,
+            charsLeftOver : 0,
+            nullInput : false,
+            invalidMonth : null,
+            invalidFormat : false,
+            userInvalidated : false,
+            iso: false
+        };
+    }
+
+    function padToken(func, count) {
+        return function (a) {
+            return leftZeroFill(func.call(this, a), count);
+        };
+    }
+    function ordinalizeToken(func, period) {
+        return function (a) {
+            return this.lang().ordinal(func.call(this, a), period);
+        };
+    }
+
+    while (ordinalizeTokens.length) {
+        i = ordinalizeTokens.pop();
+        formatTokenFunctions[i + 'o'] = ordinalizeToken(formatTokenFunctions[i], i);
+    }
+    while (paddedTokens.length) {
+        i = paddedTokens.pop();
+        formatTokenFunctions[i + i] = padToken(formatTokenFunctions[i], 2);
+    }
+    formatTokenFunctions.DDDD = padToken(formatTokenFunctions.DDD, 3);
+
+
+    /************************************
+        Constructors
+    ************************************/
+
+    function Language() {
+
+    }
+
+    // Moment prototype object
+    function Moment(config) {
+        checkOverflow(config);
+        extend(this, config);
+    }
+
+    // Duration Constructor
+    function Duration(duration) {
+        var normalizedInput = normalizeObjectUnits(duration),
+            years = normalizedInput.year || 0,
+            months = normalizedInput.month || 0,
+            weeks = normalizedInput.week || 0,
+            days = normalizedInput.day || 0,
+            hours = normalizedInput.hour || 0,
+            minutes = normalizedInput.minute || 0,
+            seconds = normalizedInput.second || 0,
+            milliseconds = normalizedInput.millisecond || 0;
+
+        // representation for dateAddRemove
+        this._milliseconds = +milliseconds +
+            seconds * 1e3 + // 1000
+            minutes * 6e4 + // 1000 * 60
+            hours * 36e5; // 1000 * 60 * 60
+        // Because of dateAddRemove treats 24 hours as different from a
+        // day when working around DST, we need to store them separately
+        this._days = +days +
+            weeks * 7;
+        // It is impossible translate months into days without knowing
+        // which months you are are talking about, so we have to store
+        // it separately.
+        this._months = +months +
+            years * 12;
+
+        this._data = {};
+
+        this._bubble();
+    }
+
+    /************************************
+        Helpers
+    ************************************/
+
+
+    function extend(a, b) {
+        for (var i in b) {
+            if (b.hasOwnProperty(i)) {
+                a[i] = b[i];
+            }
+        }
+
+        if (b.hasOwnProperty("toString")) {
+            a.toString = b.toString;
+        }
+
+        if (b.hasOwnProperty("valueOf")) {
+            a.valueOf = b.valueOf;
+        }
+
+        return a;
+    }
+
+    function cloneMoment(m) {
+        var result = {}, i;
+        for (i in m) {
+            if (m.hasOwnProperty(i) && momentProperties.hasOwnProperty(i)) {
+                result[i] = m[i];
+            }
+        }
+
+        return result;
+    }
+
+    function absRound(number) {
+        if (number < 0) {
+            return Math.ceil(number);
+        } else {
+            return Math.floor(number);
+        }
+    }
+
+    // left zero fill a number
+    // see http://jsperf.com/left-zero-filling for performance comparison
+    function leftZeroFill(number, targetLength, forceSign) {
+        var output = '' + Math.abs(number),
+            sign = number >= 0;
+
+        while (output.length < targetLength) {
+            output = '0' + output;
+        }
+        return (sign ? (forceSign ? '+' : '') : '-') + output;
+    }
+
+    // helper function for _.addTime and _.subtractTime
+    function addOrSubtractDurationFromMoment(mom, duration, isAdding, ignoreUpdateOffset) {
+        var milliseconds = duration._milliseconds,
+            days = duration._days,
+            months = duration._months,
+            minutes,
+            hours;
+
+        if (milliseconds) {
+            mom._d.setTime(+mom._d + milliseconds * isAdding);
+        }
+        // store the minutes and hours so we can restore them
+        if (days || months) {
+            minutes = mom.minute();
+            hours = mom.hour();
+        }
+        if (days) {
+            mom.date(mom.date() + days * isAdding);
+        }
+        if (months) {
+            mom.month(mom.month() + months * isAdding);
+        }
+        if (milliseconds && !ignoreUpdateOffset) {
+            moment.updateOffset(mom);
+        }
+        // restore the minutes and hours after possibly changing dst
+        if (days || months) {
+            mom.minute(minutes);
+            mom.hour(hours);
+        }
+    }
+
+    // check if is an array
+    function isArray(input) {
+        return Object.prototype.toString.call(input) === '[object Array]';
+    }
+
+    function isDate(input) {
+        return  Object.prototype.toString.call(input) === '[object Date]' ||
+                input instanceof Date;
+    }
+
+    // compare two arrays, return the number of differences
+    function compareArrays(array1, array2, dontConvert) {
+        var len = Math.min(array1.length, array2.length),
+            lengthDiff = Math.abs(array1.length - array2.length),
+            diffs = 0,
+            i;
+        for (i = 0; i < len; i++) {
+            if ((dontConvert && array1[i] !== array2[i]) ||
+                (!dontConvert && toInt(array1[i]) !== toInt(array2[i]))) {
+                diffs++;
+            }
+        }
+        return diffs + lengthDiff;
+    }
+
+    function normalizeUnits(units) {
+        if (units) {
+            var lowered = units.toLowerCase().replace(/(.)s$/, '$1');
+            units = unitAliases[units] || camelFunctions[lowered] || lowered;
+        }
+        return units;
+    }
+
+    function normalizeObjectUnits(inputObject) {
+        var normalizedInput = {},
+            normalizedProp,
+            prop;
+
+        for (prop in inputObject) {
+            if (inputObject.hasOwnProperty(prop)) {
+                normalizedProp = normalizeUnits(prop);
+                if (normalizedProp) {
+                    normalizedInput[normalizedProp] = inputObject[prop];
+                }
+            }
+        }
+
+        return normalizedInput;
+    }
+
+    function makeList(field) {
+        var count, setter;
+
+        if (field.indexOf('week') === 0) {
+            count = 7;
+            setter = 'day';
+        }
+        else if (field.indexOf('month') === 0) {
+            count = 12;
+            setter = 'month';
+        }
+        else {
+            return;
+        }
+
+        moment[field] = function (format, index) {
+            var i, getter,
+                method = moment.fn._lang[field],
+                results = [];
+
+            if (typeof format === 'number') {
+                index = format;
+                format = undefined;
+            }
+
+            getter = function (i) {
+                var m = moment().utc().set(setter, i);
+                return method.call(moment.fn._lang, m, format || '');
+            };
+
+            if (index != null) {
+                return getter(index);
+            }
+            else {
+                for (i = 0; i < count; i++) {
+                    results.push(getter(i));
+                }
+                return results;
+            }
+        };
+    }
+
+    function toInt(argumentForCoercion) {
+        var coercedNumber = +argumentForCoercion,
+            value = 0;
+
+        if (coercedNumber !== 0 && isFinite(coercedNumber)) {
+            if (coercedNumber >= 0) {
+                value = Math.floor(coercedNumber);
+            } else {
+                value = Math.ceil(coercedNumber);
+            }
+        }
+
+        return value;
+    }
+
+    function daysInMonth(year, month) {
+        return new Date(Date.UTC(year, month + 1, 0)).getUTCDate();
+    }
+
+    function daysInYear(year) {
+        return isLeapYear(year) ? 366 : 365;
+    }
+
+    function isLeapYear(year) {
+        return (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0;
+    }
+
+    function checkOverflow(m) {
+        var overflow;
+        if (m._a && m._pf.overflow === -2) {
+            overflow =
+                m._a[MONTH] < 0 || m._a[MONTH] > 11 ? MONTH :
+                m._a[DATE] < 1 || m._a[DATE] > daysInMonth(m._a[YEAR], m._a[MONTH]) ? DATE :
+                m._a[HOUR] < 0 || m._a[HOUR] > 23 ? HOUR :
+                m._a[MINUTE] < 0 || m._a[MINUTE] > 59 ? MINUTE :
+                m._a[SECOND] < 0 || m._a[SECOND] > 59 ? SECOND :
+                m._a[MILLISECOND] < 0 || m._a[MILLISECOND] > 999 ? MILLISECOND :
+                -1;
+
+            if (m._pf._overflowDayOfYear && (overflow < YEAR || overflow > DATE)) {
+                overflow = DATE;
+            }
+
+            m._pf.overflow = overflow;
+        }
+    }
+
+    function isValid(m) {
+        if (m._isValid == null) {
+            m._isValid = !isNaN(m._d.getTime()) &&
+                m._pf.overflow < 0 &&
+                !m._pf.empty &&
+                !m._pf.invalidMonth &&
+                !m._pf.nullInput &&
+                !m._pf.invalidFormat &&
+                !m._pf.userInvalidated;
+
+            if (m._strict) {
+                m._isValid = m._isValid &&
+                    m._pf.charsLeftOver === 0 &&
+                    m._pf.unusedTokens.length === 0;
+            }
+        }
+        return m._isValid;
+    }
+
+    function normalizeLanguage(key) {
+        return key ? key.toLowerCase().replace('_', '-') : key;
+    }
+
+    // Return a moment from input, that is local/utc/zone equivalent to model.
+    function makeAs(input, model) {
+        return model._isUTC ? moment(input).zone(model._offset || 0) :
+            moment(input).local();
+    }
+
+    /************************************
+        Languages
+    ************************************/
+
+
+    extend(Language.prototype, {
+
+        set : function (config) {
+            var prop, i;
+            for (i in config) {
+                prop = config[i];
+                if (typeof prop === 'function') {
+                    this[i] = prop;
+                } else {
+                    this['_' + i] = prop;
+                }
+            }
+        },
+
+        _months : "January_February_March_April_May_June_July_August_September_October_November_December".split("_"),
+        months : function (m) {
+            return this._months[m.month()];
+        },
+
+        _monthsShort : "Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),
+        monthsShort : function (m) {
+            return this._monthsShort[m.month()];
+        },
+
+        monthsParse : function (monthName) {
+            var i, mom, regex;
+
+            if (!this._monthsParse) {
+                this._monthsParse = [];
+            }
+
+            for (i = 0; i < 12; i++) {
+                // make the regex if we don't have it already
+                if (!this._monthsParse[i]) {
+                    mom = moment.utc([2000, i]);
+                    regex = '^' + this.months(mom, '') + '|^' + this.monthsShort(mom, '');
+                    this._monthsParse[i] = new RegExp(regex.replace('.', ''), 'i');
+                }
+                // test the regex
+                if (this._monthsParse[i].test(monthName)) {
+                    return i;
+                }
+            }
+        },
+
+        _weekdays : "Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),
+        weekdays : function (m) {
+            return this._weekdays[m.day()];
+        },
+
+        _weekdaysShort : "Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),
+        weekdaysShort : function (m) {
+            return this._weekdaysShort[m.day()];
+        },
+
+        _weekdaysMin : "Su_Mo_Tu_We_Th_Fr_Sa".split("_"),
+        weekdaysMin : function (m) {
+            return this._weekdaysMin[m.day()];
+        },
+
+        weekdaysParse : function (weekdayName) {
+            var i, mom, regex;
+
+            if (!this._weekdaysParse) {
+                this._weekdaysParse = [];
+            }
+
+            for (i = 0; i < 7; i++) {
+                // make the regex if we don't have it already
+                if (!this._weekdaysParse[i]) {
+                    mom = moment([2000, 1]).day(i);
+                    regex = '^' + this.weekdays(mom, '') + '|^' + this.weekdaysShort(mom, '') + '|^' + this.weekdaysMin(mom, '');
+                    this._weekdaysParse[i] = new RegExp(regex.replace('.', ''), 'i');
+                }
+                // test the regex
+                if (this._weekdaysParse[i].test(weekdayName)) {
+                    return i;
+                }
+            }
+        },
+
+        _longDateFormat : {
+            LT : "h:mm A",
+            L : "MM/DD/YYYY",
+            LL : "MMMM D YYYY",
+            LLL : "MMMM D YYYY LT",
+            LLLL : "dddd, MMMM D YYYY LT"
+        },
+        longDateFormat : function (key) {
+            var output = this._longDateFormat[key];
+            if (!output && this._longDateFormat[key.toUpperCase()]) {
+                output = this._longDateFormat[key.toUpperCase()].replace(/MMMM|MM|DD|dddd/g, function (val) {
+                    return val.slice(1);
+                });
+                this._longDateFormat[key] = output;
+            }
+            return output;
+        },
+
+        isPM : function (input) {
+            // IE8 Quirks Mode & IE7 Standards Mode do not allow accessing strings like arrays
+            // Using charAt should be more compatible.
+            return ((input + '').toLowerCase().charAt(0) === 'p');
+        },
+
+        _meridiemParse : /[ap]\.?m?\.?/i,
+        meridiem : function (hours, minutes, isLower) {
+            if (hours > 11) {
+                return isLower ? 'pm' : 'PM';
+            } else {
+                return isLower ? 'am' : 'AM';
+            }
+        },
+
+        _calendar : {
+            sameDay : '[Today at] LT',
+            nextDay : '[Tomorrow at] LT',
+            nextWeek : 'dddd [at] LT',
+            lastDay : '[Yesterday at] LT',
+            lastWeek : '[Last] dddd [at] LT',
+            sameElse : 'L'
+        },
+        calendar : function (key, mom) {
+            var output = this._calendar[key];
+            return typeof output === 'function' ? output.apply(mom) : output;
+        },
+
+        _relativeTime : {
+            future : "in %s",
+            past : "%s ago",
+            s : "a few seconds",
+            m : "a minute",
+            mm : "%d minutes",
+            h : "an hour",
+            hh : "%d hours",
+            d : "a day",
+            dd : "%d days",
+            M : "a month",
+            MM : "%d months",
+            y : "a year",
+            yy : "%d years"
+        },
+        relativeTime : function (number, withoutSuffix, string, isFuture) {
+            var output = this._relativeTime[string];
+            return (typeof output === 'function') ?
+                output(number, withoutSuffix, string, isFuture) :
+                output.replace(/%d/i, number);
+        },
+        pastFuture : function (diff, output) {
+            var format = this._relativeTime[diff > 0 ? 'future' : 'past'];
+            return typeof format === 'function' ? format(output) : format.replace(/%s/i, output);
+        },
+
+        ordinal : function (number) {
+            return this._ordinal.replace("%d", number);
+        },
+        _ordinal : "%d",
+
+        preparse : function (string) {
+            return string;
+        },
+
+        postformat : function (string) {
+            return string;
+        },
+
+        week : function (mom) {
+            return weekOfYear(mom, this._week.dow, this._week.doy).week;
+        },
+
+        _week : {
+            dow : 0, // Sunday is the first day of the week.
+            doy : 6  // The week that contains Jan 1st is the first week of the year.
+        },
+
+        _invalidDate: 'Invalid date',
+        invalidDate: function () {
+            return this._invalidDate;
+        }
+    });
+
+    // Loads a language definition into the `languages` cache.  The function
+    // takes a key and optionally values.  If not in the browser and no values
+    // are provided, it will load the language file module.  As a convenience,
+    // this function also returns the language values.
+    function loadLang(key, values) {
+        values.abbr = key;
+        if (!languages[key]) {
+            languages[key] = new Language();
+        }
+        languages[key].set(values);
+        return languages[key];
+    }
+
+    // Remove a language from the `languages` cache. Mostly useful in tests.
+    function unloadLang(key) {
+        delete languages[key];
+    }
+
+    // Determines which language definition to use and returns it.
+    //
+    // With no parameters, it will return the global language.  If you
+    // pass in a language key, such as 'en', it will return the
+    // definition for 'en', so long as 'en' has already been loaded using
+    // moment.lang.
+    function getLangDefinition(key) {
+        var i = 0, j, lang, next, split,
+            get = function (k) {
+                if (!languages[k] && hasModule) {
+                    try {
+                        require('./lang/' + k);
+                    } catch (e) { }
+                }
+                return languages[k];
+            };
+
+        if (!key) {
+            return moment.fn._lang;
+        }
+
+        if (!isArray(key)) {
+            //short-circuit everything else
+            lang = get(key);
+            if (lang) {
+                return lang;
+            }
+            key = [key];
+        }
+
+        //pick the language from the array
+        //try ['en-au', 'en-gb'] as 'en-au', 'en-gb', 'en', as in move through the list trying each
+        //substring from most specific to least, but move to the next array item if it's a more specific variant than the current root
+        while (i < key.length) {
+            split = normalizeLanguage(key[i]).split('-');
+            j = split.length;
+            next = normalizeLanguage(key[i + 1]);
+            next = next ? next.split('-') : null;
+            while (j > 0) {
+                lang = get(split.slice(0, j).join('-'));
+                if (lang) {
+                    return lang;
+                }
+                if (next && next.length >= j && compareArrays(split, next, true) >= j - 1) {
+                    //the next array item is better than a shallower substring of this one
+                    break;
+                }
+                j--;
+            }
+            i++;
+        }
+        return moment.fn._lang;
+    }
+
+    /************************************
+        Formatting
+    ************************************/
+
+
+    function removeFormattingTokens(input) {
+        if (input.match(/\[[\s\S]/)) {
+            return input.replace(/^\[|\]$/g, "");
+        }
+        return input.replace(/\\/g, "");
+    }
+
+    function makeFormatFunction(format) {
+        var array = format.match(formattingTokens), i, length;
+
+        for (i = 0, length = array.length; i < length; i++) {
+            if (formatTokenFunctions[array[i]]) {
+                array[i] = formatTokenFunctions[array[i]];
+            } else {
+                array[i] = removeFormattingTokens(array[i]);
+            }
+        }
+
+        return function (mom) {
+            var output = "";
+            for (i = 0; i < length; i++) {
+                output += array[i] instanceof Function ? array[i].call(mom, format) : array[i];
+            }
+            return output;
+        };
+    }
+
+    // format date using native date object
+    function formatMoment(m, format) {
+
+        if (!m.isValid()) {
+            return m.lang().invalidDate();
+        }
+
+        format = expandFormat(format, m.lang());
+
+        if (!formatFunctions[format]) {
+            formatFunctions[format] = makeFormatFunction(format);
+        }
+
+        return formatFunctions[format](m);
+    }
+
+    function expandFormat(format, lang) {
+        var i = 5;
+
+        function replaceLongDateFormatTokens(input) {
+            return lang.longDateFormat(input) || input;
+        }
+
+        localFormattingTokens.lastIndex = 0;
+        while (i >= 0 && localFormattingTokens.test(format)) {
+            format = format.replace(localFormattingTokens, replaceLongDateFormatTokens);
+            localFormattingTokens.lastIndex = 0;
+            i -= 1;
+        }
+
+        return format;
+    }
+
+
+    /************************************
+        Parsing
+    ************************************/
+
+
+    // get the regex to find the next token
+    function getParseRegexForToken(token, config) {
+        var a, strict = config._strict;
+        switch (token) {
+        case 'DDDD':
+            return parseTokenThreeDigits;
+        case 'YYYY':
+        case 'GGGG':
+        case 'gggg':
+            return strict ? parseTokenFourDigits : parseTokenOneToFourDigits;
+        case 'Y':
+        case 'G':
+        case 'g':
+            return parseTokenSignedNumber;
+        case 'YYYYYY':
+        case 'YYYYY':
+        case 'GGGGG':
+        case 'ggggg':
+            return strict ? parseTokenSixDigits : parseTokenOneToSixDigits;
+        case 'S':
+            if (strict) { return parseTokenOneDigit; }
+            /* falls through */
+        case 'SS':
+            if (strict) { return parseTokenTwoDigits; }
+            /* falls through */
+        case 'SSS':
+            if (strict) { return parseTokenThreeDigits; }
+            /* falls through */
+        case 'DDD':
+            return parseTokenOneToThreeDigits;
+        case 'MMM':
+        case 'MMMM':
+        case 'dd':
+        case 'ddd':
+        case 'dddd':
+            return parseTokenWord;
+        case 'a':
+        case 'A':
+            return getLangDefinition(config._l)._meridiemParse;
+        case 'X':
+            return parseTokenTimestampMs;
+        case 'Z':
+        case 'ZZ':
+            return parseTokenTimezone;
+        case 'T':
+            return parseTokenT;
+        case 'SSSS':
+            return parseTokenDigits;
+        case 'MM':
+        case 'DD':
+        case 'YY':
+        case 'GG':
+        case 'gg':
+        case 'HH':
+        case 'hh':
+        case 'mm':
+        case 'ss':
+        case 'ww':
+        case 'WW':
+            return strict ? parseTokenTwoDigits : parseTokenOneOrTwoDigits;
+        case 'M':
+        case 'D':
+        case 'd':
+        case 'H':
+        case 'h':
+        case 'm':
+        case 's':
+        case 'w':
+        case 'W':
+        case 'e':
+        case 'E':
+            return parseTokenOneOrTwoDigits;
+        default :
+            a = new RegExp(regexpEscape(unescapeFormat(token.replace('\\', '')), "i"));
+            return a;
+        }
+    }
+
+    function timezoneMinutesFromString(string) {
+        string = string || "";
+        var possibleTzMatches = (string.match(parseTokenTimezone) || []),
+            tzChunk = possibleTzMatches[possibleTzMatches.length - 1] || [],
+            parts = (tzChunk + '').match(parseTimezoneChunker) || ['-', 0, 0],
+            minutes = +(parts[1] * 60) + toInt(parts[2]);
+
+        return parts[0] === '+' ? -minutes : minutes;
+    }
+
+    // function to convert string input to date
+    function addTimeToArrayFromToken(token, input, config) {
+        var a, datePartArray = config._a;
+
+        switch (token) {
+        // MONTH
+        case 'M' : // fall through to MM
+        case 'MM' :
+            if (input != null) {
+                datePartArray[MONTH] = toInt(input) - 1;
+            }
+            break;
+        case 'MMM' : // fall through to MMMM
+        case 'MMMM' :
+            a = getLangDefinition(config._l).monthsParse(input);
+            // if we didn't find a month name, mark the date as invalid.
+            if (a != null) {
+                datePartArray[MONTH] = a;
+            } else {
+                config._pf.invalidMonth = input;
+            }
+            break;
+        // DAY OF MONTH
+        case 'D' : // fall through to DD
+        case 'DD' :
+            if (input != null) {
+                datePartArray[DATE] = toInt(input);
+            }
+            break;
+        // DAY OF YEAR
+        case 'DDD' : // fall through to DDDD
+        case 'DDDD' :
+            if (input != null) {
+                config._dayOfYear = toInt(input);
+            }
+
+            break;
+        // YEAR
+        case 'YY' :
+            datePartArray[YEAR] = toInt(input) + (toInt(input) > 68 ? 1900 : 2000);
+            break;
+        case 'YYYY' :
+        case 'YYYYY' :
+        case 'YYYYYY' :
+            datePartArray[YEAR] = toInt(input);
+            break;
+        // AM / PM
+        case 'a' : // fall through to A
+        case 'A' :
+            config._isPm = getLangDefinition(config._l).isPM(input);
+            break;
+        // 24 HOUR
+        case 'H' : // fall through to hh
+        case 'HH' : // fall through to hh
+        case 'h' : // fall through to hh
+        case 'hh' :
+            datePartArray[HOUR] = toInt(input);
+            break;
+        // MINUTE
+        case 'm' : // fall through to mm
+        case 'mm' :
+            datePartArray[MINUTE] = toInt(input);
+            break;
+        // SECOND
+        case 's' : // fall through to ss
+        case 'ss' :
+            datePartArray[SECOND] = toInt(input);
+            break;
+        // MILLISECOND
+        case 'S' :
+        case 'SS' :
+        case 'SSS' :
+        case 'SSSS' :
+            datePartArray[MILLISECOND] = toInt(('0.' + input) * 1000);
+            break;
+        // UNIX TIMESTAMP WITH MS
+        case 'X':
+            config._d = new Date(parseFloat(input) * 1000);
+            break;
+        // TIMEZONE
+        case 'Z' : // fall through to ZZ
+        case 'ZZ' :
+            config._useUTC = true;
+            config._tzm = timezoneMinutesFromString(input);
+            break;
+        case 'w':
+        case 'ww':
+        case 'W':
+        case 'WW':
+        case 'd':
+        case 'dd':
+        case 'ddd':
+        case 'dddd':
+        case 'e':
+        case 'E':
+            token = token.substr(0, 1);
+            /* falls through */
+        case 'gg':
+        case 'gggg':
+        case 'GG':
+        case 'GGGG':
+        case 'GGGGG':
+            token = token.substr(0, 2);
+            if (input) {
+                config._w = config._w || {};
+                config._w[token] = input;
+            }
+            break;
+        }
+    }
+
+    // convert an array to a date.
+    // the array should mirror the parameters below
+    // note: all values past the year are optional and will default to the lowest possible value.
+    // [year, month, day , hour, minute, second, millisecond]
+    function dateFromConfig(config) {
+        var i, date, input = [], currentDate,
+            yearToUse, fixYear, w, temp, lang, weekday, week;
+
+        if (config._d) {
+            return;
+        }
+
+        currentDate = currentDateArray(config);
+
+        //compute day of the year from weeks and weekdays
+        if (config._w && config._a[DATE] == null && config._a[MONTH] == null) {
+            fixYear = function (val) {
+                var int_val = parseInt(val, 10);
+                return val ?
+                  (val.length < 3 ? (int_val > 68 ? 1900 + int_val : 2000 + int_val) : int_val) :
+                  (config._a[YEAR] == null ? moment().weekYear() : config._a[YEAR]);
+            };
+
+            w = config._w;
+            if (w.GG != null || w.W != null || w.E != null) {
+                temp = dayOfYearFromWeeks(fixYear(w.GG), w.W || 1, w.E, 4, 1);
+            }
+            else {
+                lang = getLangDefinition(config._l);
+                weekday = w.d != null ?  parseWeekday(w.d, lang) :
+                  (w.e != null ?  parseInt(w.e, 10) + lang._week.dow : 0);
+
+                week = parseInt(w.w, 10) || 1;
+
+                //if we're parsing 'd', then the low day numbers may be next week
+                if (w.d != null && weekday < lang._week.dow) {
+                    week++;
+                }
+
+                temp = dayOfYearFromWeeks(fixYear(w.gg), week, weekday, lang._week.doy, lang._week.dow);
+            }
+
+            config._a[YEAR] = temp.year;
+            config._dayOfYear = temp.dayOfYear;
+        }
+
+        //if the day of the year is set, figure out what it is
+        if (config._dayOfYear) {
+            yearToUse = config._a[YEAR] == null ? currentDate[YEAR] : config._a[YEAR];
+
+            if (config._dayOfYear > daysInYear(yearToUse)) {
+                config._pf._overflowDayOfYear = true;
+            }
+
+            date = makeUTCDate(yearToUse, 0, config._dayOfYear);
+            config._a[MONTH] = date.getUTCMonth();
+            config._a[DATE] = date.getUTCDate();
+        }
+
+        // Default to current date.
+        // * if no year, month, day of month are given, default to today
+        // * if day of month is given, default month and year
+        // * if month is given, default only year
+        // * if year is given, don't default anything
+        for (i = 0; i < 3 && config._a[i] == null; ++i) {
+            config._a[i] = input[i] = currentDate[i];
+        }
+
+        // Zero out whatever was not defaulted, including time
+        for (; i < 7; i++) {
+            config._a[i] = input[i] = (config._a[i] == null) ? (i === 2 ? 1 : 0) : config._a[i];
+        }
+
+        // add the offsets to the time to be parsed so that we can have a clean array for checking isValid
+        input[HOUR] += toInt((config._tzm || 0) / 60);
+        input[MINUTE] += toInt((config._tzm || 0) % 60);
+
+        config._d = (config._useUTC ? makeUTCDate : makeDate).apply(null, input);
+    }
+
+    function dateFromObject(config) {
+        var normalizedInput;
+
+        if (config._d) {
+            return;
+        }
+
+        normalizedInput = normalizeObjectUnits(config._i);
+        config._a = [
+            normalizedInput.year,
+            normalizedInput.month,
+            normalizedInput.day,
+            normalizedInput.hour,
+            normalizedInput.minute,
+            normalizedInput.second,
+            normalizedInput.millisecond
+        ];
+
+        dateFromConfig(config);
+    }
+
+    function currentDateArray(config) {
+        var now = new Date();
+        if (config._useUTC) {
+            return [
+                now.getUTCFullYear(),
+                now.getUTCMonth(),
+                now.getUTCDate()
+            ];
+        } else {
+            return [now.getFullYear(), now.getMonth(), now.getDate()];
+        }
+    }
+
+    // date from string and format string
+    function makeDateFromStringAndFormat(config) {
+
+        config._a = [];
+        config._pf.empty = true;
+
+        // This array is used to make a Date, either with `new Date` or `Date.UTC`
+        var lang = getLangDefinition(config._l),
+            string = '' + config._i,
+            i, parsedInput, tokens, token, skipped,
+            stringLength = string.length,
+            totalParsedInputLength = 0;
+
+        tokens = expandFormat(config._f, lang).match(formattingTokens) || [];
+
+        for (i = 0; i < tokens.length; i++) {
+            token = tokens[i];
+            parsedInput = (string.match(getParseRegexForToken(token, config)) || [])[0];
+            if (parsedInput) {
+                skipped = string.substr(0, string.indexOf(parsedInput));
+                if (skipped.length > 0) {
+                    config._pf.unusedInput.push(skipped);
+                }
+                string = string.slice(string.indexOf(parsedInput) + parsedInput.length);
+                totalParsedInputLength += parsedInput.length;
+            }
+            // don't parse if it's not a known token
+            if (formatTokenFunctions[token]) {
+                if (parsedInput) {
+                    config._pf.empty = false;
+                }
+                else {
+                    config._pf.unusedTokens.push(token);
+                }
+                addTimeToArrayFromToken(token, parsedInput, config);
+            }
+            else if (config._strict && !parsedInput) {
+                config._pf.unusedTokens.push(token);
+            }
+        }
+
+        // add remaining unparsed input length to the string
+        config._pf.charsLeftOver = stringLength - totalParsedInputLength;
+        if (string.length > 0) {
+            config._pf.unusedInput.push(string);
+        }
+
+        // handle am pm
+        if (config._isPm && config._a[HOUR] < 12) {
+            config._a[HOUR] += 12;
+        }
+        // if is 12 am, change hours to 0
+        if (config._isPm === false && config._a[HOUR] === 12) {
+            config._a[HOUR] = 0;
+        }
+
+        dateFromConfig(config);
+        checkOverflow(config);
+    }
+
+    function unescapeFormat(s) {
+        return s.replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g, function (matched, p1, p2, p3, p4) {
+            return p1 || p2 || p3 || p4;
+        });
+    }
+
+    // Code from http://stackoverflow.com/questions/3561493/is-there-a-regexp-escape-function-in-javascript
+    function regexpEscape(s) {
+        return s.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&');
+    }
+
+    // date from string and array of format strings
+    function makeDateFromStringAndArray(config) {
+        var tempConfig,
+            bestMoment,
+
+            scoreToBeat,
+            i,
+            currentScore;
+
+        if (config._f.length === 0) {
+            config._pf.invalidFormat = true;
+            config._d = new Date(NaN);
+            return;
+        }
+
+        for (i = 0; i < config._f.length; i++) {
+            currentScore = 0;
+            tempConfig = extend({}, config);
+            tempConfig._pf = defaultParsingFlags();
+            tempConfig._f = config._f[i];
+            makeDateFromStringAndFormat(tempConfig);
+
+            if (!isValid(tempConfig)) {
+                continue;
+            }
+
+            // if there is any input that was not parsed add a penalty for that format
+            currentScore += tempConfig._pf.charsLeftOver;
+
+            //or tokens
+            currentScore += tempConfig._pf.unusedTokens.length * 10;
+
+            tempConfig._pf.score = currentScore;
+
+            if (scoreToBeat == null || currentScore < scoreToBeat) {
+                scoreToBeat = currentScore;
+                bestMoment = tempConfig;
+            }
+        }
+
+        extend(config, bestMoment || tempConfig);
+    }
+
+    // date from iso format
+    function makeDateFromString(config) {
+        var i, l,
+            string = config._i,
+            match = isoRegex.exec(string);
+
+        if (match) {
+            config._pf.iso = true;
+            for (i = 0, l = isoDates.length; i < l; i++) {
+                if (isoDates[i][1].exec(string)) {
+                    // match[5] should be "T" or undefined
+                    config._f = isoDates[i][0] + (match[6] || " ");
+                    break;
+                }
+            }
+            for (i = 0, l = isoTimes.length; i < l; i++) {
+                if (isoTimes[i][1].exec(string)) {
+                    config._f += isoTimes[i][0];
+                    break;
+                }
+            }
+            if (string.match(parseTokenTimezone)) {
+                config._f += "Z";
+            }
+            makeDateFromStringAndFormat(config);
+        }
+        else {
+            config._d = new Date(string);
+        }
+    }
+
+    function makeDateFromInput(config) {
+        var input = config._i,
+            matched = aspNetJsonRegex.exec(input);
+
+        if (input === undefined) {
+            config._d = new Date();
+        } else if (matched) {
+            config._d = new Date(+matched[1]);
+        } else if (typeof input === 'string') {
+            makeDateFromString(config);
+        } else if (isArray(input)) {
+            config._a = input.slice(0);
+            dateFromConfig(config);
+        } else if (isDate(input)) {
+            config._d = new Date(+input);
+        } else if (typeof(input) === 'object') {
+            dateFromObject(config);
+        } else {
+            config._d = new Date(input);
+        }
+    }
+
+    function makeDate(y, m, d, h, M, s, ms) {
+        //can't just apply() to create a date:
+        //http://stackoverflow.com/questions/181348/instantiating-a-javascript-object-by-calling-prototype-constructor-apply
+        var date = new Date(y, m, d, h, M, s, ms);
+
+        //the date constructor doesn't accept years < 1970
+        if (y < 1970) {
+            date.setFullYear(y);
+        }
+        return date;
+    }
+
+    function makeUTCDate(y) {
+        var date = new Date(Date.UTC.apply(null, arguments));
+        if (y < 1970) {
+            date.setUTCFullYear(y);
+        }
+        return date;
+    }
+
+    function parseWeekday(input, language) {
+        if (typeof input === 'string') {
+            if (!isNaN(input)) {
+                input = parseInt(input, 10);
+            }
+            else {
+                input = language.weekdaysParse(input);
+                if (typeof input !== 'number') {
+                    return null;
+                }
+            }
+        }
+        return input;
+    }
+
+    /************************************
+        Relative Time
+    ************************************/
+
+
+    // helper function for moment.fn.from, moment.fn.fromNow, and moment.duration.fn.humanize
+    function substituteTimeAgo(string, number, withoutSuffix, isFuture, lang) {
+        return lang.relativeTime(number || 1, !!withoutSuffix, string, isFuture);
+    }
+
+    function relativeTime(milliseconds, withoutSuffix, lang) {
+        var seconds = round(Math.abs(milliseconds) / 1000),
+            minutes = round(seconds / 60),
+            hours = round(minutes / 60),
+            days = round(hours / 24),
+            years = round(days / 365),
+            args = seconds < 45 && ['s', seconds] ||
+                minutes === 1 && ['m'] ||
+                minutes < 45 && ['mm', minutes] ||
+                hours === 1 && ['h'] ||
+                hours < 22 && ['hh', hours] ||
+                days === 1 && ['d'] ||
+                days <= 25 && ['dd', days] ||
+                days <= 45 && ['M'] ||
+                days < 345 && ['MM', round(days / 30)] ||
+                years === 1 && ['y'] || ['yy', years];
+        args[2] = withoutSuffix;
+        args[3] = milliseconds > 0;
+        args[4] = lang;
+        return substituteTimeAgo.apply({}, args);
+    }
+
+
+    /************************************
+        Week of Year
+    ************************************/
+
+
+    // firstDayOfWeek       0 = sun, 6 = sat
+    //                      the day of the week that starts the week
+    //                      (usually sunday or monday)
+    // firstDayOfWeekOfYear 0 = sun, 6 = sat
+    //                      the first week is the week that contains the first
+    //                      of this day of the week
+    //                      (eg. ISO weeks use thursday (4))
+    function weekOfYear(mom, firstDayOfWeek, firstDayOfWeekOfYear) {
+        var end = firstDayOfWeekOfYear - firstDayOfWeek,
+            daysToDayOfWeek = firstDayOfWeekOfYear - mom.day(),
+            adjustedMoment;
+
+
+        if (daysToDayOfWeek > end) {
+            daysToDayOfWeek -= 7;
+        }
+
+        if (daysToDayOfWeek < end - 7) {
+            daysToDayOfWeek += 7;
+        }
+
+        adjustedMoment = moment(mom).add('d', daysToDayOfWeek);
+        return {
+            week: Math.ceil(adjustedMoment.dayOfYear() / 7),
+            year: adjustedMoment.year()
+        };
+    }
+
+    //http://en.wikipedia.org/wiki/ISO_week_date#Calculating_a_date_given_the_year.2C_week_number_and_weekday
+    function dayOfYearFromWeeks(year, week, weekday, firstDayOfWeekOfYear, firstDayOfWeek) {
+        var d = makeUTCDate(year, 0, 1).getUTCDay(), daysToAdd, dayOfYear;
+
+        weekday = weekday != null ? weekday : firstDayOfWeek;
+        daysToAdd = firstDayOfWeek - d + (d > firstDayOfWeekOfYear ? 7 : 0) - (d < firstDayOfWeek ? 7 : 0);
+        dayOfYear = 7 * (week - 1) + (weekday - firstDayOfWeek) + daysToAdd + 1;
+
+        return {
+            year: dayOfYear > 0 ? year : year - 1,
+            dayOfYear: dayOfYear > 0 ?  dayOfYear : daysInYear(year - 1) + dayOfYear
+        };
+    }
+
+    /************************************
+        Top Level Functions
+    ************************************/
+
+    function makeMoment(config) {
+        var input = config._i,
+            format = config._f;
+
+        if (input === null) {
+            return moment.invalid({nullInput: true});
+        }
+
+        if (typeof input === 'string') {
+            config._i = input = getLangDefinition().preparse(input);
+        }
+
+        if (moment.isMoment(input)) {
+            config = cloneMoment(input);
+
+            config._d = new Date(+input._d);
+        } else if (format) {
+            if (isArray(format)) {
+                makeDateFromStringAndArray(config);
+            } else {
+                makeDateFromStringAndFormat(config);
+            }
+        } else {
+            makeDateFromInput(config);
+        }
+
+        return new Moment(config);
+    }
+
+    moment = function (input, format, lang, strict) {
+        var c;
+
+        if (typeof(lang) === "boolean") {
+            strict = lang;
+            lang = undefined;
+        }
+        // object construction must be done this way.
+        // https://github.com/moment/moment/issues/1423
+        c = {};
+        c._isAMomentObject = true;
+        c._i = input;
+        c._f = format;
+        c._l = lang;
+        c._strict = strict;
+        c._isUTC = false;
+        c._pf = defaultParsingFlags();
+
+        return makeMoment(c);
+    };
+
+    // creating with utc
+    moment.utc = function (input, format, lang, strict) {
+        var c;
+
+        if (typeof(lang) === "boolean") {
+            strict = lang;
+            lang = undefined;
+        }
+        // object construction must be done this way.
+        // https://github.com/moment/moment/issues/1423
+        c = {};
+        c._isAMomentObject = true;
+        c._useUTC = true;
+        c._isUTC = true;
+        c._l = lang;
+        c._i = input;
+        c._f = format;
+        c._strict = strict;
+        c._pf = defaultParsingFlags();
+
+        return makeMoment(c).utc();
+    };
+
+    // creating with unix timestamp (in seconds)
+    moment.unix = function (input) {
+        return moment(input * 1000);
+    };
+
+    // duration
+    moment.duration = function (input, key) {
+        var duration = input,
+            // matching against regexp is expensive, do it on demand
+            match = null,
+            sign,
+            ret,
+            parseIso;
+
+        if (moment.isDuration(input)) {
+            duration = {
+                ms: input._milliseconds,
+                d: input._days,
+                M: input._months
+            };
+        } else if (typeof input === 'number') {
+            duration = {};
+            if (key) {
+                duration[key] = input;
+            } else {
+                duration.milliseconds = input;
+            }
+        } else if (!!(match = aspNetTimeSpanJsonRegex.exec(input))) {
+            sign = (match[1] === "-") ? -1 : 1;
+            duration = {
+                y: 0,
+                d: toInt(match[DATE]) * sign,
+                h: toInt(match[HOUR]) * sign,
+                m: toInt(match[MINUTE]) * sign,
+                s: toInt(match[SECOND]) * sign,
+                ms: toInt(match[MILLISECOND]) * sign
+            };
+        } else if (!!(match = isoDurationRegex.exec(input))) {
+            sign = (match[1] === "-") ? -1 : 1;
+            parseIso = function (inp) {
+                // We'd normally use ~~inp for this, but unfortunately it also
+                // converts floats to ints.
+                // inp may be undefined, so careful calling replace on it.
+                var res = inp && parseFloat(inp.replace(',', '.'));
+                // apply sign while we're at it
+                return (isNaN(res) ? 0 : res) * sign;
+            };
+            duration = {
+                y: parseIso(match[2]),
+                M: parseIso(match[3]),
+                d: parseIso(match[4]),
+                h: parseIso(match[5]),
+                m: parseIso(match[6]),
+                s: parseIso(match[7]),
+                w: parseIso(match[8])
+            };
+        }
+
+        ret = new Duration(duration);
+
+        if (moment.isDuration(input) && input.hasOwnProperty('_lang')) {
+            ret._lang = input._lang;
+        }
+
+        return ret;
+    };
+
+    // version number
+    moment.version = VERSION;
+
+    // default format
+    moment.defaultFormat = isoFormat;
+
+    // This function will be called whenever a moment is mutated.
+    // It is intended to keep the offset in sync with the timezone.
+    moment.updateOffset = function () {};
+
+    // This function will load languages and then set the global language.  If
+    // no arguments are passed in, it will simply return the current global
+    // language key.
+    moment.lang = function (key, values) {
+        var r;
+        if (!key) {
+            return moment.fn._lang._abbr;
+        }
+        if (values) {
+            loadLang(normalizeLanguage(key), values);
+        } else if (values === null) {
+            unloadLang(key);
+            key = 'en';
+        } else if (!languages[key]) {
+            getLangDefinition(key);
+        }
+        r = moment.duration.fn._lang = moment.fn._lang = getLangDefinition(key);
+        return r._abbr;
+    };
+
+    // returns language data
+    moment.langData = function (key) {
+        if (key && key._lang && key._lang._abbr) {
+            key = key._lang._abbr;
+        }
+        return getLangDefinition(key);
+    };
+
+    // compare moment object
+    moment.isMoment = function (obj) {
+        return obj instanceof Moment ||
+            (obj != null &&  obj.hasOwnProperty('_isAMomentObject'));
+    };
+
+    // for typechecking Duration objects
+    moment.isDuration = function (obj) {
+        return obj instanceof Duration;
+    };
+
+    for (i = lists.length - 1; i >= 0; --i) {
+        makeList(lists[i]);
+    }
+
+    moment.normalizeUnits = function (units) {
+        return normalizeUnits(units);
+    };
+
+    moment.invalid = function (flags) {
+        var m = moment.utc(NaN);
+        if (flags != null) {
+            extend(m._pf, flags);
+        }
+        else {
+            m._pf.userInvalidated = true;
+        }
+
+        return m;
+    };
+
+    moment.parseZone = function (input) {
+        return moment(input).parseZone();
+    };
+
+    /************************************
+        Moment Prototype
+    ************************************/
+
+
+    extend(moment.fn = Moment.prototype, {
+
+        clone : function () {
+            return moment(this);
+        },
+
+        valueOf : function () {
+            return +this._d + ((this._offset || 0) * 60000);
+        },
+
+        unix : function () {
+            return Math.floor(+this / 1000);
+        },
+
+        toString : function () {
+            return this.clone().lang('en').format("ddd MMM DD YYYY HH:mm:ss [GMT]ZZ");
+        },
+
+        toDate : function () {
+            return this._offset ? new Date(+this) : this._d;
+        },
+
+        toISOString : function () {
+            var m = moment(this).utc();
+            if (0 < m.year() && m.year() <= 9999) {
+                return formatMoment(m, 'YYYY-MM-DD[T]HH:mm:ss.SSS[Z]');
+            } else {
+                return formatMoment(m, 'YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]');
+            }
+        },
+
+        toArray : function () {
+            var m = this;
+            return [
+                m.year(),
+                m.month(),
+                m.date(),
+                m.hours(),
+                m.minutes(),
+                m.seconds(),
+                m.milliseconds()
+            ];
+        },
+
+        isValid : function () {
+            return isValid(this);
+        },
+
+        isDSTShifted : function () {
+
+            if (this._a) {
+                return this.isValid() && compareArrays(this._a, (this._isUTC ? moment.utc(this._a) : moment(this._a)).toArray()) > 0;
+            }
+
+            return false;
+        },
+
+        parsingFlags : function () {
+            return extend({}, this._pf);
+        },
+
+        invalidAt: function () {
+            return this._pf.overflow;
+        },
+
+        utc : function () {
+            return this.zone(0);
+        },
+
+        local : function () {
+            this.zone(0);
+            this._isUTC = false;
+            return this;
+        },
+
+        format : function (inputString) {
+            var output = formatMoment(this, inputString || moment.defaultFormat);
+            return this.lang().postformat(output);
+        },
+
+        add : function (input, val) {
+            var dur;
+            // switch args to support add('s', 1) and add(1, 's')
+            if (typeof input === 'string') {
+                dur = moment.duration(+val, input);
+            } else {
+                dur = moment.duration(input, val);
+            }
+            addOrSubtractDurationFromMoment(this, dur, 1);
+            return this;
+        },
+
+        subtract : function (input, val) {
+            var dur;
+            // switch args to support subtract('s', 1) and subtract(1, 's')
+            if (typeof input === 'string') {
+                dur = moment.duration(+val, input);
+            } else {
+                dur = moment.duration(input, val);
+            }
+            addOrSubtractDurationFromMoment(this, dur, -1);
+            return this;
+        },
+
+        diff : function (input, units, asFloat) {
+            var that = makeAs(input, this),
+                zoneDiff = (this.zone() - that.zone()) * 6e4,
+                diff, output;
+
+            units = normalizeUnits(units);
+
+            if (units === 'year' || units === 'month') {
+                // average number of days in the months in the given dates
+                diff = (this.daysInMonth() + that.daysInMonth()) * 432e5; // 24 * 60 * 60 * 1000 / 2
+                // difference in months
+                output = ((this.year() - that.year()) * 12) + (this.month() - that.month());
+                // adjust by taking difference in days, average number of days
+                // and dst in the given months.
+                output += ((this - moment(this).startOf('month')) -
+                        (that - moment(that).startOf('month'))) / diff;
+                // same as above but with zones, to negate all dst
+                output -= ((this.zone() - moment(this).startOf('month').zone()) -
+                        (that.zone() - moment(that).startOf('month').zone())) * 6e4 / diff;
+                if (units === 'year') {
+                    output = output / 12;
+                }
+            } else {
+                diff = (this - that);
+                output = units === 'second' ? diff / 1e3 : // 1000
+                    units === 'minute' ? diff / 6e4 : // 1000 * 60
+                    units === 'hour' ? diff / 36e5 : // 1000 * 60 * 60
+                    units === 'day' ? (diff - zoneDiff) / 864e5 : // 1000 * 60 * 60 * 24, negate dst
+                    units === 'week' ? (diff - zoneDiff) / 6048e5 : // 1000 * 60 * 60 * 24 * 7, negate dst
+                    diff;
+            }
+            return asFloat ? output : absRound(output);
+        },
+
+        from : function (time, withoutSuffix) {
+            return moment.duration(this.diff(time)).lang(this.lang()._abbr).humanize(!withoutSuffix);
+        },
+
+        fromNow : function (withoutSuffix) {
+            return this.from(moment(), withoutSuffix);
+        },
+
+        calendar : function () {
+            // We want to compare the start of today, vs this.
+            // Getting start-of-today depends on whether we're zone'd or not.
+            var sod = makeAs(moment(), this).startOf('day'),
+                diff = this.diff(sod, 'days', true),
+                format = diff < -6 ? 'sameElse' :
+                    diff < -1 ? 'lastWeek' :
+                    diff < 0 ? 'lastDay' :
+                    diff < 1 ? 'sameDay' :
+                    diff < 2 ? 'nextDay' :
+                    diff < 7 ? 'nextWeek' : 'sameElse';
+            return this.format(this.lang().calendar(format, this));
+        },
+
+        isLeapYear : function () {
+            return isLeapYear(this.year());
+        },
+
+        isDST : function () {
+            return (this.zone() < this.clone().month(0).zone() ||
+                this.zone() < this.clone().month(5).zone());
+        },
+
+        day : function (input) {
+            var day = this._isUTC ? this._d.getUTCDay() : this._d.getDay();
+            if (input != null) {
+                input = parseWeekday(input, this.lang());
+                return this.add({ d : input - day });
+            } else {
+                return day;
+            }
+        },
+
+        month : function (input) {
+            var utc = this._isUTC ? 'UTC' : '',
+                dayOfMonth;
+
+            if (input != null) {
+                if (typeof input === 'string') {
+                    input = this.lang().monthsParse(input);
+                    if (typeof input !== 'number') {
+                        return this;
+                    }
+                }
+
+                dayOfMonth = this.date();
+                this.date(1);
+                this._d['set' + utc + 'Month'](input);
+                this.date(Math.min(dayOfMonth, this.daysInMonth()));
+
+                moment.updateOffset(this);
+                return this;
+            } else {
+                return this._d['get' + utc + 'Month']();
+            }
+        },
+
+        startOf: function (units) {
+            units = normalizeUnits(units);
+            // the following switch intentionally omits break keywords
+            // to utilize falling through the cases.
+            switch (units) {
+            case 'year':
+                this.month(0);
+                /* falls through */
+            case 'month':
+                this.date(1);
+                /* falls through */
+            case 'week':
+            case 'isoWeek':
+            case 'day':
+                this.hours(0);
+                /* falls through */
+            case 'hour':
+                this.minutes(0);
+                /* falls through */
+            case 'minute':
+                this.seconds(0);
+                /* falls through */
+            case 'second':
+                this.milliseconds(0);
+                /* falls through */
+            }
+
+            // weeks are a special case
+            if (units === 'week') {
+                this.weekday(0);
+            } else if (units === 'isoWeek') {
+                this.isoWeekday(1);
+            }
+
+            return this;
+        },
+
+        endOf: function (units) {
+            units = normalizeUnits(units);
+            return this.startOf(units).add((units === 'isoWeek' ? 'week' : units), 1).subtract('ms', 1);
+        },
+
+        isAfter: function (input, units) {
+            units = typeof units !== 'undefined' ? units : 'millisecond';
+            return +this.clone().startOf(units) > +moment(input).startOf(units);
+        },
+
+        isBefore: function (input, units) {
+            units = typeof units !== 'undefined' ? units : 'millisecond';
+            return +this.clone().startOf(units) < +moment(input).startOf(units);
+        },
+
+        isSame: function (input, units) {
+            units = units || 'ms';
+            return +this.clone().startOf(units) === +makeAs(input, this).startOf(units);
+        },
+
+        min: function (other) {
+            other = moment.apply(null, arguments);
+            return other < this ? this : other;
+        },
+
+        max: function (other) {
+            other = moment.apply(null, arguments);
+            return other > this ? this : other;
+        },
+
+        zone : function (input) {
+            var offset = this._offset || 0;
+            if (input != null) {
+                if (typeof input === "string") {
+                    input = timezoneMinutesFromString(input);
+                }
+                if (Math.abs(input) < 16) {
+                    input = input * 60;
+                }
+                this._offset = input;
+                this._isUTC = true;
+                if (offset !== input) {
+                    addOrSubtractDurationFromMoment(this, moment.duration(offset - input, 'm'), 1, true);
+                }
+            } else {
+                return this._isUTC ? offset : this._d.getTimezoneOffset();
+            }
+            return this;
+        },
+
+        zoneAbbr : function () {
+            return this._isUTC ? "UTC" : "";
+        },
+
+        zoneName : function () {
+            return this._isUTC ? "Coordinated Universal Time" : "";
+        },
+
+        parseZone : function () {
+            if (this._tzm) {
+                this.zone(this._tzm);
+            } else if (typeof this._i === 'string') {
+                this.zone(this._i);
+            }
+            return this;
+        },
+
+        hasAlignedHourOffset : function (input) {
+            if (!input) {
+                input = 0;
+            }
+            else {
+                input = moment(input).zone();
+            }
+
+            return (this.zone() - input) % 60 === 0;
+        },
+
+        daysInMonth : function () {
+            return daysInMonth(this.year(), this.month());
+        },
+
+        dayOfYear : function (input) {
+            var dayOfYear = round((moment(this).startOf('day') - moment(this).startOf('year')) / 864e5) + 1;
+            return input == null ? dayOfYear : this.add("d", (input - dayOfYear));
+        },
+
+        quarter : function () {
+            return Math.ceil((this.month() + 1.0) / 3.0);
+        },
+
+        weekYear : function (input) {
+            var year = weekOfYear(this, this.lang()._week.dow, this.lang()._week.doy).year;
+            return input == null ? year : this.add("y", (input - year));
+        },
+
+        isoWeekYear : function (input) {
+            var year = weekOfYear(this, 1, 4).year;
+            return input == null ? year : this.add("y", (input - year));
+        },
+
+        week : function (input) {
+            var week = this.lang().week(this);
+            return input == null ? week : this.add("d", (input - week) * 7);
+        },
+
+        isoWeek : function (input) {
+            var week = weekOfYear(this, 1, 4).week;
+            return input == null ? week : this.add("d", (input - week) * 7);
+        },
+
+        weekday : function (input) {
+            var weekday = (this.day() + 7 - this.lang()._week.dow) % 7;
+            return input == null ? weekday : this.add("d", input - weekday);
+        },
+
+        isoWeekday : function (input) {
+            // behaves the same as moment#day except
+            // as a getter, returns 7 instead of 0 (1-7 range instead of 0-6)
+            // as a setter, sunday should belong to the previous week.
+            return input == null ? this.day() || 7 : this.day(this.day() % 7 ? input : input - 7);
+        },
+
+        get : function (units) {
+            units = normalizeUnits(units);
+            return this[units]();
+        },
+
+        set : function (units, value) {
+            units = normalizeUnits(units);
+            if (typeof this[units] === 'function') {
+                this[units](value);
+            }
+            return this;
+        },
+
+        // If passed a language key, it will set the language for this
+        // instance.  Otherwise, it will return the language configuration
+        // variables for this instance.
+        lang : function (key) {
+            if (key === undefined) {
+                return this._lang;
+            } else {
+                this._lang = getLangDefinition(key);
+                return this;
+            }
+        }
+    });
+
+    // helper for adding shortcuts
+    function makeGetterAndSetter(name, key) {
+        moment.fn[name] = moment.fn[name + 's'] = function (input) {
+            var utc = this._isUTC ? 'UTC' : '';
+            if (input != null) {
+                this._d['set' + utc + key](input);
+                moment.updateOffset(this);
+                return this;
+            } else {
+                return this._d['get' + utc + key]();
+            }
+        };
+    }
+
+    // loop through and add shortcuts (Month, Date, Hours, Minutes, Seconds, Milliseconds)
+    for (i = 0; i < proxyGettersAndSetters.length; i ++) {
+        makeGetterAndSetter(proxyGettersAndSetters[i].toLowerCase().replace(/s$/, ''), proxyGettersAndSetters[i]);
+    }
+
+    // add shortcut for year (uses different syntax than the getter/setter 'year' == 'FullYear')
+    makeGetterAndSetter('year', 'FullYear');
+
+    // add plural methods
+    moment.fn.days = moment.fn.day;
+    moment.fn.months = moment.fn.month;
+    moment.fn.weeks = moment.fn.week;
+    moment.fn.isoWeeks = moment.fn.isoWeek;
+
+    // add aliased format methods
+    moment.fn.toJSON = moment.fn.toISOString;
+
+    /************************************
+        Duration Prototype
+    ************************************/
+
+
+    extend(moment.duration.fn = Duration.prototype, {
+
+        _bubble : function () {
+            var milliseconds = this._milliseconds,
+                days = this._days,
+                months = this._months,
+                data = this._data,
+                seconds, minutes, hours, years;
+
+            // The following code bubbles up values, see the tests for
+            // examples of what that means.
+            data.milliseconds = milliseconds % 1000;
+
+            seconds = absRound(milliseconds / 1000);
+            data.seconds = seconds % 60;
+
+            minutes = absRound(seconds / 60);
+            data.minutes = minutes % 60;
+
+            hours = absRound(minutes / 60);
+            data.hours = hours % 24;
+
+            days += absRound(hours / 24);
+            data.days = days % 30;
+
+            months += absRound(days / 30);
+            data.months = months % 12;
+
+            years = absRound(months / 12);
+            data.years = years;
+        },
+
+        weeks : function () {
+            return absRound(this.days() / 7);
+        },
+
+        valueOf : function () {
+            return this._milliseconds +
+              this._days * 864e5 +
+              (this._months % 12) * 2592e6 +
+              toInt(this._months / 12) * 31536e6;
+        },
+
+        humanize : function (withSuffix) {
+            var difference = +this,
+                output = relativeTime(difference, !withSuffix, this.lang());
+
+            if (withSuffix) {
+                output = this.lang().pastFuture(difference, output);
+            }
+
+            return this.lang().postformat(output);
+        },
+
+        add : function (input, val) {
+            // supports only 2.0-style add(1, 's') or add(moment)
+            var dur = moment.duration(input, val);
+
+            this._milliseconds += dur._milliseconds;
+            this._days += dur._days;
+            this._months += dur._months;
+
+            this._bubble();
+
+            return this;
+        },
+
+        subtract : function (input, val) {
+            var dur = moment.duration(input, val);
+
+            this._milliseconds -= dur._milliseconds;
+            this._days -= dur._days;
+            this._months -= dur._months;
+
+            this._bubble();
+
+            return this;
+        },
+
+        get : function (units) {
+            units = normalizeUnits(units);
+            return this[units.toLowerCase() + 's']();
+        },
+
+        as : function (units) {
+            units = normalizeUnits(units);
+            return this['as' + units.charAt(0).toUpperCase() + units.slice(1) + 's']();
+        },
+
+        lang : moment.fn.lang,
+
+        toIsoString : function () {
+            // inspired by https://github.com/dordille/moment-isoduration/blob/master/moment.isoduration.js
+            var years = Math.abs(this.years()),
+                months = Math.abs(this.months()),
+                days = Math.abs(this.days()),
+                hours = Math.abs(this.hours()),
+                minutes = Math.abs(this.minutes()),
+                seconds = Math.abs(this.seconds() + this.milliseconds() / 1000);
+
+            if (!this.asSeconds()) {
+                // this is the same as C#'s (Noda) and python (isodate)...
+                // but not other JS (goog.date)
+                return 'P0D';
+            }
+
+            return (this.asSeconds() < 0 ? '-' : '') +
+                'P' +
+                (years ? years + 'Y' : '') +
+                (months ? months + 'M' : '') +
+                (days ? days + 'D' : '') +
+                ((hours || minutes || seconds) ? 'T' : '') +
+                (hours ? hours + 'H' : '') +
+                (minutes ? minutes + 'M' : '') +
+                (seconds ? seconds + 'S' : '');
+        }
+    });
+
+    function makeDurationGetter(name) {
+        moment.duration.fn[name] = function () {
+            return this._data[name];
+        };
+    }
+
+    function makeDurationAsGetter(name, factor) {
+        moment.duration.fn['as' + name] = function () {
+            return +this / factor;
+        };
+    }
+
+    for (i in unitMillisecondFactors) {
+        if (unitMillisecondFactors.hasOwnProperty(i)) {
+            makeDurationAsGetter(i, unitMillisecondFactors[i]);
+            makeDurationGetter(i.toLowerCase());
+        }
+    }
+
+    makeDurationAsGetter('Weeks', 6048e5);
+    moment.duration.fn.asMonths = function () {
+        return (+this - this.years() * 31536e6) / 2592e6 + this.years() * 12;
+    };
+
+
+    /************************************
+        Default Lang
+    ************************************/
+
+
+    // Set default language, other languages will inherit from English.
+    moment.lang('en', {
+        ordinal : function (number) {
+            var b = number % 10,
+                output = (toInt(number % 100 / 10) === 1) ? 'th' :
+                (b === 1) ? 'st' :
+                (b === 2) ? 'nd' :
+                (b === 3) ? 'rd' : 'th';
+            return number + output;
+        }
+    });
+
+    /* EMBED_LANGUAGES */
+
+    /************************************
+        Exposing Moment
+    ************************************/
+
+    function makeGlobal(deprecate) {
+        var warned = false, local_moment = moment;
+        /*global ender:false */
+        if (typeof ender !== 'undefined') {
+            return;
+        }
+        // here, `this` means `window` in the browser, or `global` on the server
+        // add `moment` as a global object via a string identifier,
+        // for Closure Compiler "advanced" mode
+        if (deprecate) {
+            global.moment = function () {
+                if (!warned && console && console.warn) {
+                    warned = true;
+                    console.warn(
+                            "Accessing Moment through the global scope is " +
+                            "deprecated, and will be removed in an upcoming " +
+                            "release.");
+                }
+                return local_moment.apply(null, arguments);
+            };
+            extend(global.moment, local_moment);
+        } else {
+            global['moment'] = moment;
+        }
+    }
+
+    // CommonJS module is defined
+    if (hasModule) {
+        module.exports = moment;
+        makeGlobal(true);
+    } else if (typeof define === "function" && define.amd) {
+        define("moment", function (require, exports, module) {
+            if (module.config && module.config() && module.config().noGlobal !== true) {
+                // If user provided noGlobal, he is aware of global
+                makeGlobal(module.config().noGlobal === undefined);
+            }
+
+            return moment;
+        });
+    } else {
+        makeGlobal();
+    }
+}).call(this);
diff --git a/resources/lib/oojs-ui/i18n/ace.json b/resources/lib/oojs-ui/i18n/ace.json
new file mode 100644 (file)
index 0000000..554ae57
--- /dev/null
@@ -0,0 +1,11 @@
+{
+    "@metadata": {
+        "authors": [
+            "Si Gam Acèh"
+        ]
+    },
+    "ooui-dialog-action-close": "Tôp",
+    "ooui-outline-control-move-down": "Pinah item u yup",
+    "ooui-outline-control-move-up": "Pinah item u ateuëh",
+    "ooui-toolbar-more": "Lom"
+}
\ No newline at end of file
diff --git a/resources/lib/oojs-ui/i18n/af.json b/resources/lib/oojs-ui/i18n/af.json
new file mode 100644 (file)
index 0000000..a622f89
--- /dev/null
@@ -0,0 +1,10 @@
+{
+    "@metadata": {
+        "authors": [
+            "Naudefj"
+        ]
+    },
+    "ooui-dialog-action-close": "Sluit",
+    "ooui-outline-control-move-down": "Skuif item af",
+    "ooui-outline-control-move-up": "Skuif item op"
+}
\ No newline at end of file
diff --git a/resources/lib/oojs-ui/i18n/am.json b/resources/lib/oojs-ui/i18n/am.json
new file mode 100644 (file)
index 0000000..61e4ff6
--- /dev/null
@@ -0,0 +1,8 @@
+{
+    "@metadata": {
+        "authors": [
+            "Elfalem"
+        ]
+    },
+    "ooui-dialog-action-close": "ለመዝጋት"
+}
\ No newline at end of file
diff --git a/resources/lib/oojs-ui/i18n/ar.json b/resources/lib/oojs-ui/i18n/ar.json
new file mode 100644 (file)
index 0000000..65e1364
--- /dev/null
@@ -0,0 +1,18 @@
+{
+    "@metadata": {
+        "authors": [
+            "Ciphers",
+            "Claw eg",
+            "Elfalem",
+            "Jdforrester",
+            "Mido",
+            "OsamaK",
+            "زكريا",
+            "مشعل الحربي"
+        ]
+    },
+    "ooui-dialog-action-close": "أغلق",
+    "ooui-outline-control-move-down": "انقل العنصر للأسفل",
+    "ooui-outline-control-move-up": "انقل العنصر للأعلى",
+    "ooui-toolbar-more": "مزيد"
+}
\ No newline at end of file
diff --git a/resources/lib/oojs-ui/i18n/arc.json b/resources/lib/oojs-ui/i18n/arc.json
new file mode 100644 (file)
index 0000000..0f9e75d
--- /dev/null
@@ -0,0 +1,8 @@
+{
+    "@metadata": {
+        "authors": [
+            "Basharh"
+        ]
+    },
+    "ooui-dialog-action-close": "ܣܟܘܪ"
+}
\ No newline at end of file
diff --git a/resources/lib/oojs-ui/i18n/ast.json b/resources/lib/oojs-ui/i18n/ast.json
new file mode 100644 (file)
index 0000000..fe6ea0a
--- /dev/null
@@ -0,0 +1,14 @@
+{
+    "@metadata": {
+        "authors": [
+            "Basharh",
+            "Bishnu Saikia",
+            "Xuacu"
+        ]
+    },
+    "ooui-dialog-action-close": "Zarrar",
+    "ooui-outline-control-move-down": "Mover abaxo l'elementu",
+    "ooui-outline-control-move-up": "Mover arriba l'elementu",
+    "ooui-outline-control-remove": "Desaniciar elementu",
+    "ooui-toolbar-more": "Más"
+}
\ No newline at end of file
diff --git a/resources/lib/oojs-ui/i18n/az.json b/resources/lib/oojs-ui/i18n/az.json
new file mode 100644 (file)
index 0000000..257680b
--- /dev/null
@@ -0,0 +1,14 @@
+{
+    "@metadata": {
+        "authors": [
+            "Cekli829",
+            "Interfase",
+            "Jduranboger"
+        ]
+    },
+    "ooui-dialog-action-close": "Bağla",
+    "ooui-outline-control-move-down": "Bəndi aşağı apar",
+    "ooui-outline-control-move-up": "Bəndi yuxarı apar",
+    "ooui-outline-control-remove": "Bəndi sil",
+    "ooui-toolbar-more": "Daha artıq"
+}
\ No newline at end of file
diff --git a/resources/lib/oojs-ui/i18n/ba.json b/resources/lib/oojs-ui/i18n/ba.json
new file mode 100644 (file)
index 0000000..4af0114
--- /dev/null
@@ -0,0 +1,15 @@
+{
+    "@metadata": {
+        "authors": [
+            "AiseluRB",
+            "Amire80",
+            "Assele",
+            "Haqmar",
+            "Sagan",
+            "Рустам Нурыев"
+        ]
+    },
+    "ooui-dialog-action-close": "Ябырға",
+    "ooui-outline-control-move-down": "Аҫҡа күсерергә",
+    "ooui-outline-control-move-up": "Өҫкә күсерергә"
+}
\ No newline at end of file
diff --git a/resources/lib/oojs-ui/i18n/bcl.json b/resources/lib/oojs-ui/i18n/bcl.json
new file mode 100644 (file)
index 0000000..aff451e
--- /dev/null
@@ -0,0 +1,12 @@
+{
+    "@metadata": {
+        "authors": [
+            "Geopoet",
+            "Sky Harbor"
+        ]
+    },
+    "ooui-dialog-action-close": "Seraduhon",
+    "ooui-outline-control-move-down": "Balyuhon an aytem paibaba",
+    "ooui-outline-control-move-up": "Balyuhon an aytem paitaas",
+    "ooui-toolbar-more": "Kadugangan"
+}
\ No newline at end of file
diff --git a/resources/lib/oojs-ui/i18n/be-tarask.json b/resources/lib/oojs-ui/i18n/be-tarask.json
new file mode 100644 (file)
index 0000000..5922f61
--- /dev/null
@@ -0,0 +1,14 @@
+{
+    "@metadata": {
+        "authors": [
+            "EugeneZelenko",
+            "Wizardist",
+            "Чаховіч Уладзіслаў",
+            "Zedlik"
+        ]
+    },
+    "ooui-dialog-action-close": "Закрыць",
+    "ooui-outline-control-move-down": "Перасунуць ніжэй",
+    "ooui-outline-control-move-up": "Перасунуць вышэй",
+    "ooui-toolbar-more": "Болей"
+}
\ No newline at end of file
diff --git a/resources/lib/oojs-ui/i18n/be.json b/resources/lib/oojs-ui/i18n/be.json
new file mode 100644 (file)
index 0000000..3058ab8
--- /dev/null
@@ -0,0 +1,8 @@
+{
+    "@metadata": {
+        "authors": [
+            "Чаховіч Уладзіслаў"
+        ]
+    },
+    "ooui-dialog-action-close": "Закрыць"
+}
\ No newline at end of file
diff --git a/resources/lib/oojs-ui/i18n/bg.json b/resources/lib/oojs-ui/i18n/bg.json
new file mode 100644 (file)
index 0000000..6006244
--- /dev/null
@@ -0,0 +1,13 @@
+{
+    "@metadata": {
+        "authors": [
+            "DCLXVI",
+            "Hristofor.mirchev",
+            "පසිඳු කාවින්ද",
+            "Mitzev"
+        ]
+    },
+    "ooui-dialog-action-close": "Затваряне",
+    "ooui-outline-control-remove": "Премахване на обекта",
+    "ooui-toolbar-more": "Още"
+}
diff --git a/resources/lib/oojs-ui/i18n/bn.json b/resources/lib/oojs-ui/i18n/bn.json
new file mode 100644 (file)
index 0000000..409022a
--- /dev/null
@@ -0,0 +1,17 @@
+{
+    "@metadata": {
+        "authors": [
+            "Aftab1995",
+            "Bellayet",
+            "Jayantanth",
+            "Nasir8891",
+            "Runab",
+            "Sayak Sarkar"
+        ]
+    },
+    "ooui-dialog-action-close": "বন্ধ",
+    "ooui-outline-control-move-down": "আইটেম নিচে স্থানান্তর",
+    "ooui-outline-control-move-up": "আইটেম উপরে স্থানান্তর",
+    "ooui-outline-control-remove": "আইটেম সরান",
+    "ooui-toolbar-more": "আরও"
+}
diff --git a/resources/lib/oojs-ui/i18n/br.json b/resources/lib/oojs-ui/i18n/br.json
new file mode 100644 (file)
index 0000000..38eb9e8
--- /dev/null
@@ -0,0 +1,12 @@
+{
+    "@metadata": {
+        "authors": [
+            "Fohanno",
+            "Fulup",
+            "Y-M D"
+        ]
+    },
+    "ooui-dialog-action-close": "Serriñ",
+    "ooui-outline-control-move-down": "Lakaat an elfenn da ziskenn",
+    "ooui-outline-control-move-up": "Lakaat an elfenn da bignat"
+}
\ No newline at end of file
diff --git a/resources/lib/oojs-ui/i18n/bs.json b/resources/lib/oojs-ui/i18n/bs.json
new file mode 100644 (file)
index 0000000..95ba48d
--- /dev/null
@@ -0,0 +1,12 @@
+{
+    "@metadata": {
+        "authors": [
+            "DzWiki"
+        ]
+    },
+    "ooui-dialog-action-close": "Zatvori",
+    "ooui-outline-control-move-down": "Premjesti stavku dole",
+    "ooui-outline-control-move-up": "Premjesti stavku gore",
+    "ooui-outline-control-remove": "Ukloni stavku",
+    "ooui-toolbar-more": "Više"
+}
\ No newline at end of file
diff --git a/resources/lib/oojs-ui/i18n/ca.json b/resources/lib/oojs-ui/i18n/ca.json
new file mode 100644 (file)
index 0000000..61bb1f6
--- /dev/null
@@ -0,0 +1,17 @@
+{
+    "@metadata": {
+        "authors": [
+            "Alvaro Vidal-Abarca",
+            "Amire80",
+            "Arnaugir",
+            "Pginer",
+            "QuimGil",
+            "SMP",
+            "Vriullop"
+        ]
+    },
+    "ooui-dialog-action-close": "Tanca",
+    "ooui-outline-control-move-down": "Baixa element",
+    "ooui-outline-control-move-up": "Puja element",
+    "ooui-toolbar-more": "Més"
+}
\ No newline at end of file
diff --git a/resources/lib/oojs-ui/i18n/ce.json b/resources/lib/oojs-ui/i18n/ce.json
new file mode 100644 (file)
index 0000000..ff14ff3
--- /dev/null
@@ -0,0 +1,13 @@
+{
+    "@metadata": {
+        "authors": [
+            "Amire80",
+            "Умар"
+        ]
+    },
+    "ooui-dialog-action-close": "ДӀачӀагӀа",
+    "ooui-outline-control-move-down": "Лаха яккха элемент",
+    "ooui-outline-control-move-up": "Лаккха яккха элемент",
+    "ooui-outline-control-remove": "ДӀадаха меттиг",
+    "ooui-toolbar-more": "Кхин тӀе"
+}
\ No newline at end of file
diff --git a/resources/lib/oojs-ui/i18n/ckb.json b/resources/lib/oojs-ui/i18n/ckb.json
new file mode 100644 (file)
index 0000000..839f4a8
--- /dev/null
@@ -0,0 +1,9 @@
+{
+    "@metadata": {
+        "authors": [
+            "Calak",
+            "Muhammed taha"
+        ]
+    },
+    "ooui-dialog-action-close": "دایخە"
+}
\ No newline at end of file
diff --git a/resources/lib/oojs-ui/i18n/co.json b/resources/lib/oojs-ui/i18n/co.json
new file mode 100644 (file)
index 0000000..e5edb21
--- /dev/null
@@ -0,0 +1,10 @@
+{
+    "@metadata": {
+        "authors": [
+            "Paulu"
+        ]
+    },
+    "ooui-dialog-action-close": "Chjude",
+    "ooui-outline-control-move-down": "Fà falà l'ogettu",
+    "ooui-outline-control-move-up": "Fà cullà l'ogettu"
+}
\ No newline at end of file
diff --git a/resources/lib/oojs-ui/i18n/cs.json b/resources/lib/oojs-ui/i18n/cs.json
new file mode 100644 (file)
index 0000000..670073f
--- /dev/null
@@ -0,0 +1,21 @@
+{
+    "@metadata": {
+        "authors": [
+            "Chmee2",
+            "Jkjk",
+            "Juandev",
+            "Koo6",
+            "Littledogboy",
+            "Michaelbrabec",
+            "Mormegil",
+            "Polda18",
+            "Tchoř",
+            "ශ්වෙත"
+        ]
+    },
+    "ooui-dialog-action-close": "Zavřít",
+    "ooui-outline-control-move-down": "Přesunout položku dolů",
+    "ooui-outline-control-move-up": "Přesunout položku nahoru",
+    "ooui-outline-control-remove": "Odstranit položku",
+    "ooui-toolbar-more": "Další"
+}
\ No newline at end of file
diff --git a/resources/lib/oojs-ui/i18n/cu.json b/resources/lib/oojs-ui/i18n/cu.json
new file mode 100644 (file)
index 0000000..55594c1
--- /dev/null
@@ -0,0 +1,9 @@
+{
+    "@metadata": {
+        "authors": [
+            "ОйЛ"
+        ]
+    },
+    "ooui-dialog-action-close": "ꙁакрꙑи",
+    "ooui-toolbar-more": "вѧщє"
+}
\ No newline at end of file
diff --git a/resources/lib/oojs-ui/i18n/cy.json b/resources/lib/oojs-ui/i18n/cy.json
new file mode 100644 (file)
index 0000000..d37912d
--- /dev/null
@@ -0,0 +1,13 @@
+{
+    "@metadata": {
+        "authors": [
+            "Lloffiwr",
+            "Robin Owain",
+            "ОйЛ"
+        ]
+    },
+    "ooui-dialog-action-close": "Caeer",
+    "ooui-outline-control-move-down": "Symud yr eitem lawr",
+    "ooui-outline-control-move-up": "Symud yr eitem lan",
+    "ooui-toolbar-more": "Rhagor"
+}
\ No newline at end of file
diff --git a/resources/lib/oojs-ui/i18n/da.json b/resources/lib/oojs-ui/i18n/da.json
new file mode 100644 (file)
index 0000000..bf47bcb
--- /dev/null
@@ -0,0 +1,17 @@
+{
+    "@metadata": {
+        "authors": [
+            "Cgtdk",
+            "Christian List",
+            "EileenSanda",
+            "Laketown",
+            "Palnatoke",
+            "Simeondahl",
+            "Tehnix"
+        ]
+    },
+    "ooui-dialog-action-close": "Luk",
+    "ooui-outline-control-move-down": "Flyt ned",
+    "ooui-outline-control-move-up": "Flyt op",
+    "ooui-toolbar-more": "Mere"
+}
\ No newline at end of file
diff --git a/resources/lib/oojs-ui/i18n/de.json b/resources/lib/oojs-ui/i18n/de.json
new file mode 100644 (file)
index 0000000..bed2b2c
--- /dev/null
@@ -0,0 +1,21 @@
+{
+    "@metadata": {
+        "authors": [
+            "APPER",
+            "G.Hagedorn",
+            "Inkowik",
+            "Jcornelius",
+            "Jdforrester",
+            "Kghbln",
+            "Metalhead64",
+            "Murma174",
+            "Se4598",
+            "Tomabrafix"
+        ]
+    },
+    "ooui-dialog-action-close": "Schließen",
+    "ooui-outline-control-move-down": "Element nach unten verschieben",
+    "ooui-outline-control-move-up": "Element nach oben verschieben",
+    "ooui-outline-control-remove": "Element entfernen",
+    "ooui-toolbar-more": "Mehr"
+}
\ No newline at end of file
diff --git a/resources/lib/oojs-ui/i18n/diq.json b/resources/lib/oojs-ui/i18n/diq.json
new file mode 100644 (file)
index 0000000..bb0ac35
--- /dev/null
@@ -0,0 +1,16 @@
+{
+    "@metadata": {
+        "authors": [
+            "Erdemaslancan",
+            "Gorizon",
+            "Kghbln",
+            "Marmase",
+            "Mirzali",
+            "Se4598"
+        ]
+    },
+    "ooui-dialog-action-close": "Racnê",
+    "ooui-outline-control-move-down": "Bendi bere cêr",
+    "ooui-outline-control-move-up": "Bendi bere cor",
+    "ooui-toolbar-more": "Zewbi"
+}
\ No newline at end of file
diff --git a/resources/lib/oojs-ui/i18n/dsb.json b/resources/lib/oojs-ui/i18n/dsb.json
new file mode 100644 (file)
index 0000000..ef60093
--- /dev/null
@@ -0,0 +1,12 @@
+{
+    "@metadata": {
+        "authors": [
+            "Michawiki"
+        ]
+    },
+    "ooui-dialog-action-close": "Zacyniś",
+    "ooui-outline-control-move-down": "Element dołoj pśesunuś",
+    "ooui-outline-control-move-up": "Element górjej pśesunuś",
+    "ooui-outline-control-remove": "Zapisk wótpóraś",
+    "ooui-toolbar-more": "Wěcej"
+}
diff --git a/resources/lib/oojs-ui/i18n/el.json b/resources/lib/oojs-ui/i18n/el.json
new file mode 100644 (file)
index 0000000..d1ef8b2
--- /dev/null
@@ -0,0 +1,19 @@
+{
+    "@metadata": {
+        "authors": [
+            "Astralnet",
+            "Dipa1965",
+            "Evropi",
+            "FocalPoint",
+            "Geraki",
+            "Glavkos",
+            "Nikosguard",
+            "Tifa93"
+        ]
+    },
+    "ooui-dialog-action-close": "Κλείσιμο",
+    "ooui-outline-control-move-down": "Μετακίνηση στοιχείου προς τα κάτω",
+    "ooui-outline-control-move-up": "Μετακίνηση στοιχείου προς τα επάνω",
+    "ooui-outline-control-remove": "Αφαίρεση στοιχείου",
+    "ooui-toolbar-more": "Περισσότερα"
+}
diff --git a/resources/lib/oojs-ui/i18n/eml.json b/resources/lib/oojs-ui/i18n/eml.json
new file mode 100644 (file)
index 0000000..5dd09f5
--- /dev/null
@@ -0,0 +1,12 @@
+{
+    "@metadata": {
+        "authors": [
+            "Gloria sah",
+            "Lévi"
+        ]
+    },
+    "ooui-dialog-action-close": "Sèra",
+    "ooui-outline-control-move-down": "Spôsta in bâs",
+    "ooui-outline-control-move-up": "Spôsta in êlt",
+    "ooui-toolbar-more": "Êter"
+}
\ No newline at end of file
diff --git a/resources/lib/oojs-ui/i18n/en.json b/resources/lib/oojs-ui/i18n/en.json
new file mode 100644 (file)
index 0000000..5ff9915
--- /dev/null
@@ -0,0 +1,24 @@
+{
+    "@metadata": {
+        "authors": [
+            "Trevor Parscal",
+            "Ed Sanders",
+            "James D. Forrester",
+            "Raimond Spekking",
+            "Erik Moeller",
+            "Moriel Schottlender",
+            "Yuki Shira",
+            "Siebrand Mazeland",
+            "Rob Moen",
+            "Timo Tijhof",
+            "Roan Kattouw",
+            "Christian Williams",
+            "Amir E. Aharoni"
+        ]
+    },
+    "ooui-dialog-action-close": "Close",
+    "ooui-outline-control-move-down": "Move item down",
+    "ooui-outline-control-move-up": "Move item up",
+    "ooui-outline-control-remove": "Remove item",
+    "ooui-toolbar-more": "More"
+}
diff --git a/resources/lib/oojs-ui/i18n/eo.json b/resources/lib/oojs-ui/i18n/eo.json
new file mode 100644 (file)
index 0000000..51f3261
--- /dev/null
@@ -0,0 +1,14 @@
+{
+    "@metadata": {
+        "authors": [
+            "Happy5214",
+            "KuboF",
+            "Shirayuki",
+            "Yekrats"
+        ]
+    },
+    "ooui-dialog-action-close": "Fermi",
+    "ooui-outline-control-move-down": "Movi eron suben",
+    "ooui-outline-control-move-up": "Movi eron supren",
+    "ooui-toolbar-more": "Pli"
+}
\ No newline at end of file
diff --git a/resources/lib/oojs-ui/i18n/es.json b/resources/lib/oojs-ui/i18n/es.json
new file mode 100644 (file)
index 0000000..a3be749
--- /dev/null
@@ -0,0 +1,24 @@
+{
+    "@metadata": {
+        "authors": [
+            "Armando-Martin",
+            "Aruizdr",
+            "Benfutbol10",
+            "DJ Nietzsche",
+            "Erdemaslancan",
+            "Fitoschido",
+            "Imre",
+            "Invadinado",
+            "Jdforrester",
+            "Jduranboger",
+            "PoLuX124",
+            "Ralgis",
+            "Thehelpfulone"
+        ]
+    },
+    "ooui-dialog-action-close": "Cerrar",
+    "ooui-outline-control-move-down": "Mover abajo",
+    "ooui-outline-control-move-up": "Mover arriba",
+    "ooui-outline-control-remove": "Eliminar elemento",
+    "ooui-toolbar-more": "Más"
+}
diff --git a/resources/lib/oojs-ui/i18n/et.json b/resources/lib/oojs-ui/i18n/et.json
new file mode 100644 (file)
index 0000000..f0ddc39
--- /dev/null
@@ -0,0 +1,13 @@
+{
+    "@metadata": {
+        "authors": [
+            "Avjoska",
+            "Pikne"
+        ]
+    },
+    "ooui-dialog-action-close": "Sule",
+    "ooui-outline-control-move-down": "Liiguta üksust allapoole",
+    "ooui-outline-control-move-up": "Liiguta üksust ülespoole",
+    "ooui-outline-control-remove": "Eemalda üksus",
+    "ooui-toolbar-more": "Veel"
+}
diff --git a/resources/lib/oojs-ui/i18n/eu.json b/resources/lib/oojs-ui/i18n/eu.json
new file mode 100644 (file)
index 0000000..5d3f08b
--- /dev/null
@@ -0,0 +1,13 @@
+{
+    "@metadata": {
+        "authors": [
+            "An13sa",
+            "Unai Fdz. de Betoño",
+            "Xabier Armendaritz"
+        ]
+    },
+    "ooui-dialog-action-close": "Itxi",
+    "ooui-outline-control-move-down": "Mugitu itema beherantz",
+    "ooui-outline-control-move-up": "Mugitu itema gorantz",
+    "ooui-toolbar-more": "Gehiago"
+}
\ No newline at end of file
diff --git a/resources/lib/oojs-ui/i18n/fa.json b/resources/lib/oojs-ui/i18n/fa.json
new file mode 100644 (file)
index 0000000..3f1ad0c
--- /dev/null
@@ -0,0 +1,21 @@
+{
+    "@metadata": {
+        "authors": [
+            "Dalba",
+            "Ebraminio",
+            "Jdforrester",
+            "Ladsgroup",
+            "Mjbmr",
+            "Nojan Madinehi",
+            "Reza1615",
+            "Taha",
+            "درفش کاویانی",
+            "Armin1392"
+        ]
+    },
+    "ooui-dialog-action-close": "بستن",
+    "ooui-outline-control-move-down": "انتقال مورد به پایین",
+    "ooui-outline-control-move-up": "انتقال مورد به بالا",
+    "ooui-outline-control-remove": "حذف مورد",
+    "ooui-toolbar-more": "بیشتر"
+}
\ No newline at end of file
diff --git a/resources/lib/oojs-ui/i18n/fi.json b/resources/lib/oojs-ui/i18n/fi.json
new file mode 100644 (file)
index 0000000..ce2f6d0
--- /dev/null
@@ -0,0 +1,24 @@
+{
+    "@metadata": {
+        "authors": [
+            "Beluga",
+            "Crt",
+            "Harriv",
+            "Linnea",
+            "Nedergard",
+            "Nike",
+            "Olli",
+            "Pxos",
+            "Samoasambia",
+            "Silvonen",
+            "Skalman",
+            "Stryn",
+            "VezonThunder"
+        ]
+    },
+    "ooui-dialog-action-close": "Sulje",
+    "ooui-outline-control-move-down": "Siirrä kohdetta alaspäin",
+    "ooui-outline-control-move-up": "Siirrä kohdetta ylöspäin",
+    "ooui-outline-control-remove": "Poista kohde",
+    "ooui-toolbar-more": "Lisää"
+}
\ No newline at end of file
diff --git a/resources/lib/oojs-ui/i18n/fo.json b/resources/lib/oojs-ui/i18n/fo.json
new file mode 100644 (file)
index 0000000..00a48ff
--- /dev/null
@@ -0,0 +1,11 @@
+{
+    "@metadata": {
+        "authors": [
+            "EileenSanda"
+        ]
+    },
+    "ooui-dialog-action-close": "Lat aftur",
+    "ooui-outline-control-move-down": "Flyt lutin niður",
+    "ooui-outline-control-move-up": "Flyt lutin upp",
+    "ooui-toolbar-more": "Meira"
+}
\ No newline at end of file
diff --git a/resources/lib/oojs-ui/i18n/fr.json b/resources/lib/oojs-ui/i18n/fr.json
new file mode 100644 (file)
index 0000000..7674d2f
--- /dev/null
@@ -0,0 +1,36 @@
+{
+    "@metadata": {
+        "authors": [
+            "Automatik",
+            "Benoit Rochon",
+            "Boniface",
+            "Brunoperel",
+            "Crochet.david",
+            "DavidL",
+            "Dereckson",
+            "Gomoko",
+            "Guillom",
+            "Hello71",
+            "Jean-Frédéric",
+            "Linedwell",
+            "Ltrlg",
+            "Metroitendo",
+            "NemesisIII",
+            "Nicolas NALLET",
+            "Npettiaux",
+            "Rastus Vernon",
+            "Seb35",
+            "Sherbrooke",
+            "Tpt",
+            "Trizek",
+            "Urhixidur",
+            "Verdy p",
+            "Wyz"
+        ]
+    },
+    "ooui-dialog-action-close": "Fermer",
+    "ooui-outline-control-move-down": "Faire descendre l’élément",
+    "ooui-outline-control-move-up": "Faire monter l’élément",
+    "ooui-outline-control-remove": "Supprimer l’élément",
+    "ooui-toolbar-more": "Plus"
+}
\ No newline at end of file
diff --git a/resources/lib/oojs-ui/i18n/frr.json b/resources/lib/oojs-ui/i18n/frr.json
new file mode 100644 (file)
index 0000000..adf8ce8
--- /dev/null
@@ -0,0 +1,13 @@
+{
+    "@metadata": {
+        "authors": [
+            "ChrisPtDe",
+            "Murma174"
+        ]
+    },
+    "ooui-dialog-action-close": "Slütj",
+    "ooui-outline-control-move-down": "Element efter onern sküüw",
+    "ooui-outline-control-move-up": "Element efter boowen sküüw",
+    "ooui-outline-control-remove": "Element wechnem",
+    "ooui-toolbar-more": "Muar"
+}
\ No newline at end of file
diff --git a/resources/lib/oojs-ui/i18n/fur.json b/resources/lib/oojs-ui/i18n/fur.json
new file mode 100644 (file)
index 0000000..18ea383
--- /dev/null
@@ -0,0 +1,12 @@
+{
+    "@metadata": {
+        "authors": [
+            "Klenje",
+            "Tocaibon"
+        ]
+    },
+    "ooui-dialog-action-close": "Siere",
+    "ooui-outline-control-move-down": "sposte sot",
+    "ooui-outline-control-move-up": "sposte in su",
+    "ooui-toolbar-more": "Altri"
+}
\ No newline at end of file
diff --git a/resources/lib/oojs-ui/i18n/gl.json b/resources/lib/oojs-ui/i18n/gl.json
new file mode 100644 (file)
index 0000000..a029456
--- /dev/null
@@ -0,0 +1,14 @@
+{
+    "@metadata": {
+        "authors": [
+            "Alison",
+            "Kscanne",
+            "Toliño"
+        ]
+    },
+    "ooui-dialog-action-close": "Pechar",
+    "ooui-outline-control-move-down": "Mover o elemento abaixo",
+    "ooui-outline-control-move-up": "Mover o elemento arriba",
+    "ooui-outline-control-remove": "Eliminar o elemento",
+    "ooui-toolbar-more": "Máis"
+}
\ No newline at end of file
diff --git a/resources/lib/oojs-ui/i18n/gu.json b/resources/lib/oojs-ui/i18n/gu.json
new file mode 100644 (file)
index 0000000..ccabf8d
--- /dev/null
@@ -0,0 +1,14 @@
+{
+    "@metadata": {
+        "authors": [
+            "Ashok modhvadia",
+            "KartikMistry",
+            "The Discoverer"
+        ]
+    },
+    "ooui-dialog-action-close": "બંધ કરો",
+    "ooui-outline-control-move-down": "વસ્તુ નીચે ખસેડો",
+    "ooui-outline-control-move-up": "વસ્તુ ઉપર ખસેડો",
+    "ooui-outline-control-remove": "વસ્તુ હટાવો",
+    "ooui-toolbar-more": "વધુ"
+}
\ No newline at end of file
diff --git a/resources/lib/oojs-ui/i18n/he.json b/resources/lib/oojs-ui/i18n/he.json
new file mode 100644 (file)
index 0000000..404dc82
--- /dev/null
@@ -0,0 +1,23 @@
+{
+    "@metadata": {
+        "authors": [
+            "Amire80",
+            "ExampleTomer",
+            "Guycn2",
+            "Matanya",
+            "Mooeypoo",
+            "Orsa",
+            "Shimmin Beg",
+            "אור שפירא",
+            "חיים",
+            "ערן",
+            "פוילישער",
+            "קיפודנחש"
+        ]
+    },
+    "ooui-dialog-action-close": "סגירה",
+    "ooui-outline-control-move-down": "להזיז את הפריט מטה",
+    "ooui-outline-control-move-up": "להזיז את הפריט מעלה",
+    "ooui-outline-control-remove": "הסרת פריט",
+    "ooui-toolbar-more": "עוד"
+}
\ No newline at end of file
diff --git a/resources/lib/oojs-ui/i18n/hi.json b/resources/lib/oojs-ui/i18n/hi.json
new file mode 100644 (file)
index 0000000..ae895d1
--- /dev/null
@@ -0,0 +1,16 @@
+{
+    "@metadata": {
+        "authors": [
+            "Ansumang",
+            "Devayon",
+            "Rajesh",
+            "Siddhartha Ghai",
+            "Goelujjwal"
+        ]
+    },
+    "ooui-dialog-action-close": "बंद करें",
+    "ooui-outline-control-move-down": "प्रविष्टि नीचे ले जाएँ",
+    "ooui-outline-control-move-up": "प्रविष्टि ऊपर ले जाएँ",
+    "ooui-outline-control-remove": "आइटम हटाएँ",
+    "ooui-toolbar-more": "अधिक"
+}
diff --git a/resources/lib/oojs-ui/i18n/hr.json b/resources/lib/oojs-ui/i18n/hr.json
new file mode 100644 (file)
index 0000000..1c3f925
--- /dev/null
@@ -0,0 +1,13 @@
+{
+    "@metadata": {
+        "authors": [
+            "MaGa",
+            "Roberta F.",
+            "SpeedyGonsales"
+        ]
+    },
+    "ooui-dialog-action-close": "zatvori",
+    "ooui-outline-control-move-down": "Premjesti stavku dolje",
+    "ooui-outline-control-move-up": "Premjesti stavku gore",
+    "ooui-toolbar-more": "Više mogućnosti"
+}
\ No newline at end of file
diff --git a/resources/lib/oojs-ui/i18n/hsb.json b/resources/lib/oojs-ui/i18n/hsb.json
new file mode 100644 (file)
index 0000000..f674cd2
--- /dev/null
@@ -0,0 +1,13 @@
+{
+    "@metadata": {
+        "authors": [
+            "J budissin",
+            "Michawiki"
+        ]
+    },
+    "ooui-dialog-action-close": "Začinić",
+    "ooui-outline-control-move-down": "Zapisk dele přesunyć",
+    "ooui-outline-control-move-up": "Zapisk horje přesunyć",
+    "ooui-outline-control-remove": "Zapisk wotstronić",
+    "ooui-toolbar-more": "Wjace"
+}
\ No newline at end of file
diff --git a/resources/lib/oojs-ui/i18n/hu.json b/resources/lib/oojs-ui/i18n/hu.json
new file mode 100644 (file)
index 0000000..b2cf2c0
--- /dev/null
@@ -0,0 +1,16 @@
+{
+    "@metadata": {
+        "authors": [
+            "Dj",
+            "Einstein2",
+            "Misibacsi",
+            "ViDam",
+            "Tacsipacsi"
+        ]
+    },
+    "ooui-dialog-action-close": "Bezár",
+    "ooui-outline-control-move-down": "Elem mozgatása lefelé",
+    "ooui-outline-control-move-up": "Elem mozgatása felfelé",
+    "ooui-outline-control-remove": "Elem eltávolítása",
+    "ooui-toolbar-more": "Tovább..."
+}
\ No newline at end of file
diff --git a/resources/lib/oojs-ui/i18n/hy.json b/resources/lib/oojs-ui/i18n/hy.json
new file mode 100644 (file)
index 0000000..4cb8821
--- /dev/null
@@ -0,0 +1,13 @@
+{
+    "@metadata": {
+        "authors": [
+            "Vacio",
+            "Xelgen"
+        ]
+    },
+    "ooui-dialog-action-close": "Փակել",
+    "ooui-outline-control-move-down": "Իջեցնել կետը",
+    "ooui-outline-control-move-up": "Բարձրացնել կետը",
+    "ooui-outline-control-remove": "Հեռացնել տարրը",
+    "ooui-toolbar-more": "Ավելին"
+}
\ No newline at end of file
diff --git a/resources/lib/oojs-ui/i18n/ia.json b/resources/lib/oojs-ui/i18n/ia.json
new file mode 100644 (file)
index 0000000..e335553
--- /dev/null
@@ -0,0 +1,8 @@
+{
+    "@metadata": {
+        "authors": [
+            "McDutchie"
+        ]
+    },
+    "ooui-dialog-action-close": "Clauder"
+}
\ No newline at end of file
diff --git a/resources/lib/oojs-ui/i18n/id.json b/resources/lib/oojs-ui/i18n/id.json
new file mode 100644 (file)
index 0000000..6d3ba4d
--- /dev/null
@@ -0,0 +1,18 @@
+{
+    "@metadata": {
+        "authors": [
+            "Farras",
+            "Ilham151096",
+            "Iwan Novirion",
+            "Iyan",
+            "Kenrick95",
+            "McDutchie",
+            "Rv77ax",
+            "William Surya Permana"
+        ]
+    },
+    "ooui-dialog-action-close": "Tutup",
+    "ooui-outline-control-move-down": "Pindahkan butir ke bawah",
+    "ooui-outline-control-move-up": "Pindahkan butir ke atas",
+    "ooui-toolbar-more": "Lainnya"
+}
\ No newline at end of file
diff --git a/resources/lib/oojs-ui/i18n/ie.json b/resources/lib/oojs-ui/i18n/ie.json
new file mode 100644 (file)
index 0000000..84d002d
--- /dev/null
@@ -0,0 +1,11 @@
+{
+    "@metadata": {
+        "authors": [
+            "Makuba"
+        ]
+    },
+    "ooui-dialog-action-close": "Terminar",
+    "ooui-outline-control-move-down": "Mover element a infra",
+    "ooui-outline-control-move-up": "Mover element a supra",
+    "ooui-toolbar-more": "Plu"
+}
\ No newline at end of file
diff --git a/resources/lib/oojs-ui/i18n/ilo.json b/resources/lib/oojs-ui/i18n/ilo.json
new file mode 100644 (file)
index 0000000..838face
--- /dev/null
@@ -0,0 +1,12 @@
+{
+    "@metadata": {
+        "authors": [
+            "Lam-ang"
+        ]
+    },
+    "ooui-dialog-action-close": "Irekep",
+    "ooui-outline-control-move-down": "Ipababa ti banag",
+    "ooui-outline-control-move-up": "Ipangato ti banag",
+    "ooui-outline-control-remove": "Ikkaten ti banag",
+    "ooui-toolbar-more": "Adu pay"
+}
\ No newline at end of file
diff --git a/resources/lib/oojs-ui/i18n/is.json b/resources/lib/oojs-ui/i18n/is.json
new file mode 100644 (file)
index 0000000..fbdb5d1
--- /dev/null
@@ -0,0 +1,12 @@
+{
+    "@metadata": {
+        "authors": [
+            "Maxí",
+            "Snævar"
+        ]
+    },
+    "ooui-dialog-action-close": "Loka",
+    "ooui-outline-control-move-down": "Færa atriði niður",
+    "ooui-outline-control-move-up": "Færa atriði upp",
+    "ooui-toolbar-more": "Fleira"
+}
\ No newline at end of file
diff --git a/resources/lib/oojs-ui/i18n/it.json b/resources/lib/oojs-ui/i18n/it.json
new file mode 100644 (file)
index 0000000..747ec79
--- /dev/null
@@ -0,0 +1,22 @@
+{
+    "@metadata": {
+        "authors": [
+            "Beta16",
+            "Darth Kule",
+            "Doc.mari",
+            "Eleonora negri",
+            "Elitre",
+            "F. Cosoleto",
+            "FRacco",
+            "Gianfranco",
+            "Minerva Titani",
+            "Raoli",
+            "Una giornata uggiosa '94"
+        ]
+    },
+    "ooui-dialog-action-close": "Chiudi",
+    "ooui-outline-control-move-down": "Sposta in basso",
+    "ooui-outline-control-move-up": "Sposta in alto",
+    "ooui-outline-control-remove": "Rimuovi elemento",
+    "ooui-toolbar-more": "Altro"
+}
\ No newline at end of file
diff --git a/resources/lib/oojs-ui/i18n/ja.json b/resources/lib/oojs-ui/i18n/ja.json
new file mode 100644 (file)
index 0000000..c7c0851
--- /dev/null
@@ -0,0 +1,15 @@
+{
+    "@metadata": {
+        "authors": [
+            "Fryed-peach",
+            "Miya",
+            "Penn Station",
+            "Shirayuki"
+        ]
+    },
+    "ooui-dialog-action-close": "閉じる",
+    "ooui-outline-control-move-down": "項目を下に移動させる",
+    "ooui-outline-control-move-up": "項目を上に移動させる",
+    "ooui-outline-control-remove": "項目を除去",
+    "ooui-toolbar-more": "その他"
+}
\ No newline at end of file
diff --git a/resources/lib/oojs-ui/i18n/jv.json b/resources/lib/oojs-ui/i18n/jv.json
new file mode 100644 (file)
index 0000000..a362079
--- /dev/null
@@ -0,0 +1,11 @@
+{
+    "@metadata": {
+        "authors": [
+            "Gleki",
+            "NoiX180",
+            "Pras"
+        ]
+    },
+    "ooui-dialog-action-close": "Tutup",
+    "ooui-outline-control-move-down": "Pindhahaken butir mangandhap"
+}
\ No newline at end of file
diff --git a/resources/lib/oojs-ui/i18n/ka.json b/resources/lib/oojs-ui/i18n/ka.json
new file mode 100644 (file)
index 0000000..c9d2774
--- /dev/null
@@ -0,0 +1,18 @@
+{
+    "@metadata": {
+        "authors": [
+            "BRUTE",
+            "David1010",
+            "Gleki",
+            "ITshnik",
+            "MIKHEIL",
+            "NoiX180",
+            "Pras",
+            "Tokoko"
+        ]
+    },
+    "ooui-dialog-action-close": "დახურვა",
+    "ooui-outline-control-move-down": "ელემენტის ქვემოთ გადატანა",
+    "ooui-outline-control-move-up": "ელემენტის ზემოთ გადატანა",
+    "ooui-toolbar-more": "მეტი"
+}
\ No newline at end of file
diff --git a/resources/lib/oojs-ui/i18n/kk-cyrl.json b/resources/lib/oojs-ui/i18n/kk-cyrl.json
new file mode 100644 (file)
index 0000000..7213dad
--- /dev/null
@@ -0,0 +1,12 @@
+{
+    "@metadata": {
+        "authors": [
+            "Arystanbek"
+        ]
+    },
+    "ooui-dialog-action-close": "Жабу",
+    "ooui-outline-control-move-down": "Элементті төмен жылжыту",
+    "ooui-outline-control-move-up": "Элементті жоғары жылжыту",
+    "ooui-outline-control-remove": "Элементті алып тастау",
+    "ooui-toolbar-more": "толығырақ"
+}
diff --git a/resources/lib/oojs-ui/i18n/km.json b/resources/lib/oojs-ui/i18n/km.json
new file mode 100644 (file)
index 0000000..5381fd1
--- /dev/null
@@ -0,0 +1,12 @@
+{
+    "@metadata": {
+        "authors": [
+            "Sovichet"
+        ]
+    },
+    "ooui-dialog-action-close": "បិទ",
+    "ooui-outline-control-move-down": "រុញ​ទៅ​ក្រោម",
+    "ooui-outline-control-move-up": "រុញ​ទៅ​លើ",
+    "ooui-outline-control-remove": "ដក​វត្ថុ​ចេញ",
+    "ooui-toolbar-more": "បន្ថែម"
+}
diff --git a/resources/lib/oojs-ui/i18n/kn.json b/resources/lib/oojs-ui/i18n/kn.json
new file mode 100644 (file)
index 0000000..4932f6d
--- /dev/null
@@ -0,0 +1,10 @@
+{
+    "@metadata": {
+        "authors": [
+            "Vikassy"
+        ]
+    },
+    "ooui-dialog-action-close": "ಮುಚ್ಚಿ",
+    "ooui-outline-control-remove": "ವಸ್ತು ತೆಗೆ",
+    "ooui-toolbar-more": "ಹೆಚ್ಚು"
+}
\ No newline at end of file
diff --git a/resources/lib/oojs-ui/i18n/ko.json b/resources/lib/oojs-ui/i18n/ko.json
new file mode 100644 (file)
index 0000000..25749ce
--- /dev/null
@@ -0,0 +1,16 @@
+{
+    "@metadata": {
+        "authors": [
+            "Freebiekr",
+            "Hym411",
+            "Kwj2772",
+            "LFM",
+            "아라"
+        ]
+    },
+    "ooui-dialog-action-close": "닫기",
+    "ooui-outline-control-move-down": "항목을 아래로 옮기기",
+    "ooui-outline-control-move-up": "항목을 위로 옮기기",
+    "ooui-outline-control-remove": "항목 지우기",
+    "ooui-toolbar-more": "더 보기"
+}
\ No newline at end of file
diff --git a/resources/lib/oojs-ui/i18n/krc.json b/resources/lib/oojs-ui/i18n/krc.json
new file mode 100644 (file)
index 0000000..f629139
--- /dev/null
@@ -0,0 +1,10 @@
+{
+    "@metadata": {
+        "authors": [
+            "Iltever"
+        ]
+    },
+    "ooui-dialog-action-close": "Джаб",
+    "ooui-outline-control-move-down": "Элементни тюбюне кёчюр",
+    "ooui-outline-control-move-up": "Элементни башына кёчюр"
+}
\ No newline at end of file
diff --git a/resources/lib/oojs-ui/i18n/kw.json b/resources/lib/oojs-ui/i18n/kw.json
new file mode 100644 (file)
index 0000000..95a9b91
--- /dev/null
@@ -0,0 +1,10 @@
+{
+    "@metadata": {
+        "authors": [
+            "George Animal",
+            "Nrowe",
+            "Purodha"
+        ]
+    },
+    "ooui-dialog-action-close": "Degea"
+}
\ No newline at end of file
diff --git a/resources/lib/oojs-ui/i18n/ky.json b/resources/lib/oojs-ui/i18n/ky.json
new file mode 100644 (file)
index 0000000..2d62bda
--- /dev/null
@@ -0,0 +1,12 @@
+{
+    "@metadata": {
+        "authors": [
+            "Chorobek",
+            "George Animal",
+            "Nrowe",
+            "Tynchtyk Chorotegin",
+            "Викиней"
+        ]
+    },
+    "ooui-dialog-action-close": "Жабуу"
+}
\ No newline at end of file
diff --git a/resources/lib/oojs-ui/i18n/lb.json b/resources/lib/oojs-ui/i18n/lb.json
new file mode 100644 (file)
index 0000000..6359026
--- /dev/null
@@ -0,0 +1,18 @@
+{
+    "@metadata": {
+        "authors": [
+            "Autokrator",
+            "Chorobek",
+            "Robby",
+            "Soued031",
+            "Tynchtyk Chorotegin",
+            "UV",
+            "Викиней"
+        ]
+    },
+    "ooui-dialog-action-close": "Zoumaachen",
+    "ooui-outline-control-move-down": "Element erof réckelen",
+    "ooui-outline-control-move-up": "Element erop réckelen",
+    "ooui-outline-control-remove": "Element ewechhuelen",
+    "ooui-toolbar-more": "Méi"
+}
\ No newline at end of file
diff --git a/resources/lib/oojs-ui/i18n/lmo.json b/resources/lib/oojs-ui/i18n/lmo.json
new file mode 100644 (file)
index 0000000..e506b7a
--- /dev/null
@@ -0,0 +1,11 @@
+{
+    "@metadata": {
+        "authors": [
+            "Ninonino"
+        ]
+    },
+    "ooui-dialog-action-close": "Sèra",
+    "ooui-outline-control-move-down": "Spòsta 'n zó",
+    "ooui-outline-control-move-up": "Spòsta 'n sö",
+    "ooui-toolbar-more": "Amò"
+}
\ No newline at end of file
diff --git a/resources/lib/oojs-ui/i18n/lt.json b/resources/lib/oojs-ui/i18n/lt.json
new file mode 100644 (file)
index 0000000..db679bc
--- /dev/null
@@ -0,0 +1,11 @@
+{
+    "@metadata": {
+        "authors": [
+            "Audriusa",
+            "Eitvys200",
+            "Mantak111"
+        ]
+    },
+    "ooui-dialog-action-close": "Uždaryti",
+    "ooui-outline-control-remove": "Šalinti elementus"
+}
\ No newline at end of file
diff --git a/resources/lib/oojs-ui/i18n/lv.json b/resources/lib/oojs-ui/i18n/lv.json
new file mode 100644 (file)
index 0000000..c633339
--- /dev/null
@@ -0,0 +1,15 @@
+{
+    "@metadata": {
+        "authors": [
+            "Admresdeserv.",
+            "Audriusa",
+            "Eitvys200",
+            "Papuass",
+            "PeterisP"
+        ]
+    },
+    "ooui-dialog-action-close": "Aizvērt",
+    "ooui-outline-control-move-down": "Pārvietot vienumu uz leju",
+    "ooui-outline-control-move-up": "Pārvietot vienumu uz augšu",
+    "ooui-toolbar-more": "Vairāk"
+}
\ No newline at end of file
diff --git a/resources/lib/oojs-ui/i18n/mg.json b/resources/lib/oojs-ui/i18n/mg.json
new file mode 100644 (file)
index 0000000..dcb5fd5
--- /dev/null
@@ -0,0 +1,8 @@
+{
+    "@metadata": {
+        "authors": [
+            "Jagwar"
+        ]
+    },
+    "ooui-dialog-action-close": "Hidiana"
+}
\ No newline at end of file
diff --git a/resources/lib/oojs-ui/i18n/min.json b/resources/lib/oojs-ui/i18n/min.json
new file mode 100644 (file)
index 0000000..55174c0
--- /dev/null
@@ -0,0 +1,9 @@
+{
+    "@metadata": {
+        "authors": [
+            "Iwan Novirion",
+            "Jagwar"
+        ]
+    },
+    "ooui-dialog-action-close": "Tutuik"
+}
\ No newline at end of file
diff --git a/resources/lib/oojs-ui/i18n/mk.json b/resources/lib/oojs-ui/i18n/mk.json
new file mode 100644 (file)
index 0000000..22fd037
--- /dev/null
@@ -0,0 +1,14 @@
+{
+    "@metadata": {
+        "authors": [
+            "Bjankuloski06",
+            "Brest",
+            "Iwan Novirion"
+        ]
+    },
+    "ooui-dialog-action-close": "Затвори",
+    "ooui-outline-control-move-down": "Помести надолу",
+    "ooui-outline-control-move-up": "Помести нагоре",
+    "ooui-outline-control-remove": "Отстрани ставка",
+    "ooui-toolbar-more": "Повеќе"
+}
\ No newline at end of file
diff --git a/resources/lib/oojs-ui/i18n/ml.json b/resources/lib/oojs-ui/i18n/ml.json
new file mode 100644 (file)
index 0000000..355e337
--- /dev/null
@@ -0,0 +1,14 @@
+{
+    "@metadata": {
+        "authors": [
+            "Kavya Manohar",
+            "Praveenp",
+            "Santhosh.thottingal",
+            "Vssun"
+        ]
+    },
+    "ooui-dialog-action-close": "അടയ്ക്കുക",
+    "ooui-outline-control-move-down": "ഇനം താഴേയ്ക്ക് മാറ്റുക",
+    "ooui-outline-control-move-up": "ഇനം മുകളിലേയ്ക്ക് മാറ്റുക",
+    "ooui-toolbar-more": "കൂടുതൽ"
+}
\ No newline at end of file
diff --git a/resources/lib/oojs-ui/i18n/mr.json b/resources/lib/oojs-ui/i18n/mr.json
new file mode 100644 (file)
index 0000000..d4db84f
--- /dev/null
@@ -0,0 +1,16 @@
+{
+    "@metadata": {
+        "authors": [
+            "Kaajawa",
+            "Mahitgar",
+            "Praju23",
+            "V.narsikar",
+            "Ydyashad",
+            "संतोष दहिवळ"
+        ]
+    },
+    "ooui-dialog-action-close": "बंद करा",
+    "ooui-outline-control-move-down": "घटक (आयटम) खाली सरकवा",
+    "ooui-outline-control-move-up": "घटक (आयटम) वर सरकवा",
+    "ooui-toolbar-more": "अधिक"
+}
\ No newline at end of file
diff --git a/resources/lib/oojs-ui/i18n/ms.json b/resources/lib/oojs-ui/i18n/ms.json
new file mode 100644 (file)
index 0000000..4f78aaa
--- /dev/null
@@ -0,0 +1,13 @@
+{
+    "@metadata": {
+        "authors": [
+            "Anakmalaysia",
+            "Aurora"
+        ]
+    },
+    "ooui-dialog-action-close": "Tutup",
+    "ooui-outline-control-move-down": "Alihkan perkara ke bawah",
+    "ooui-outline-control-move-up": "Alihkan perkara ke atas",
+    "ooui-outline-control-remove": "Buang perkara",
+    "ooui-toolbar-more": "Selebihnya"
+}
diff --git a/resources/lib/oojs-ui/i18n/nap.json b/resources/lib/oojs-ui/i18n/nap.json
new file mode 100644 (file)
index 0000000..6b0b3ec
--- /dev/null
@@ -0,0 +1,11 @@
+{
+    "@metadata": {
+        "authors": [
+            "Chelin",
+            "Chrisportelli",
+            "PiRSquared17"
+        ]
+    },
+    "ooui-dialog-action-close": "Chiure",
+    "ooui-toolbar-more": "Atro"
+}
\ No newline at end of file
diff --git a/resources/lib/oojs-ui/i18n/nb.json b/resources/lib/oojs-ui/i18n/nb.json
new file mode 100644 (file)
index 0000000..7cdecaa
--- /dev/null
@@ -0,0 +1,15 @@
+{
+    "@metadata": {
+        "authors": [
+            "Danmichaelo",
+            "Event",
+            "Jeblad",
+            "Laaknor",
+            "Njardarlogar"
+        ]
+    },
+    "ooui-dialog-action-close": "Lukk",
+    "ooui-outline-control-move-down": "Flytt ned",
+    "ooui-outline-control-move-up": "Flytt opp",
+    "ooui-toolbar-more": "Mer"
+}
\ No newline at end of file
diff --git a/resources/lib/oojs-ui/i18n/nds-nl.json b/resources/lib/oojs-ui/i18n/nds-nl.json
new file mode 100644 (file)
index 0000000..81f8a43
--- /dev/null
@@ -0,0 +1,10 @@
+{
+    "@metadata": {
+        "authors": [
+            "Servien"
+        ]
+    },
+    "ooui-dialog-action-close": "Sluten",
+    "ooui-outline-control-move-down": "Onderwarp ummeneer zetten",
+    "ooui-outline-control-move-up": "Onderwarp umhoge zetten"
+}
\ No newline at end of file
diff --git a/resources/lib/oojs-ui/i18n/nds.json b/resources/lib/oojs-ui/i18n/nds.json
new file mode 100644 (file)
index 0000000..d0806d0
--- /dev/null
@@ -0,0 +1,11 @@
+{
+    "@metadata": {
+        "authors": [
+            "Zylbath"
+        ]
+    },
+    "ooui-dialog-action-close": "Dichtmaken",
+    "ooui-outline-control-move-down": "Element na ünnen schuven",
+    "ooui-outline-control-move-up": "Element na baven schuven",
+    "ooui-toolbar-more": "Mehr"
+}
\ No newline at end of file
diff --git a/resources/lib/oojs-ui/i18n/ne.json b/resources/lib/oojs-ui/i18n/ne.json
new file mode 100644 (file)
index 0000000..ae948c6
--- /dev/null
@@ -0,0 +1,8 @@
+{
+    "@metadata": {
+        "authors": [
+            "RajeshPandey",
+            "सरोज कुमार ढकाल"
+        ]
+    }
+}
\ No newline at end of file
diff --git a/resources/lib/oojs-ui/i18n/nl.json b/resources/lib/oojs-ui/i18n/nl.json
new file mode 100644 (file)
index 0000000..549fad2
--- /dev/null
@@ -0,0 +1,27 @@
+{
+    "@metadata": {
+        "authors": [
+            "Bluyten",
+            "Breghtje",
+            "Catrope",
+            "Flightmare",
+            "Hansmuller",
+            "Jdforrester",
+            "Keegan",
+            "Konovalov",
+            "RajeshPandey",
+            "Romaine",
+            "SPQRobin",
+            "Saruman",
+            "Siebrand",
+            "Southparkfan",
+            "सरोज कुमार ढकाल",
+            "Sjoerddebruin"
+        ]
+    },
+    "ooui-dialog-action-close": "Sluiten",
+    "ooui-outline-control-move-down": "Item omlaag verplaatsen",
+    "ooui-outline-control-move-up": "Item omhoog verplaatsen",
+    "ooui-outline-control-remove": "Item verwijderen",
+    "ooui-toolbar-more": "Meer"
+}
\ No newline at end of file
diff --git a/resources/lib/oojs-ui/i18n/nn.json b/resources/lib/oojs-ui/i18n/nn.json
new file mode 100644 (file)
index 0000000..dd86f5e
--- /dev/null
@@ -0,0 +1,12 @@
+{
+    "@metadata": {
+        "authors": [
+            "Jeblad",
+            "Njardarlogar"
+        ]
+    },
+    "ooui-dialog-action-close": "Lat att",
+    "ooui-outline-control-move-down": "Flytt element ned",
+    "ooui-outline-control-move-up": "Flytt element opp",
+    "ooui-toolbar-more": "Fleire"
+}
\ No newline at end of file
diff --git a/resources/lib/oojs-ui/i18n/om.json b/resources/lib/oojs-ui/i18n/om.json
new file mode 100644 (file)
index 0000000..cd22c40
--- /dev/null
@@ -0,0 +1,13 @@
+{
+    "@metadata": {
+        "authors": [
+            "Cedric31",
+            "Tumsaa"
+        ]
+    },
+    "ooui-dialog-action-close": "Cufi",
+    "ooui-outline-control-move-down": "Gad buusi",
+    "ooui-outline-control-move-up": "Ol baasi",
+    "ooui-outline-control-remove": "Balleessi",
+    "ooui-toolbar-more": "Dabalata"
+}
\ No newline at end of file
diff --git a/resources/lib/oojs-ui/i18n/or.json b/resources/lib/oojs-ui/i18n/or.json
new file mode 100644 (file)
index 0000000..35721a1
--- /dev/null
@@ -0,0 +1,10 @@
+{
+    "@metadata": {
+        "authors": [
+            "Odisha1",
+            "Psubhashish",
+            "ଶିତିକଣ୍ଠ ଦାଶ"
+        ]
+    },
+    "ooui-dialog-action-close": "ବନ୍ଦ କରିବେ"
+}
\ No newline at end of file
diff --git a/resources/lib/oojs-ui/i18n/pa.json b/resources/lib/oojs-ui/i18n/pa.json
new file mode 100644 (file)
index 0000000..6c76d7f
--- /dev/null
@@ -0,0 +1,11 @@
+{
+    "@metadata": {
+        "authors": [
+            "Amikeco",
+            "Babanwalia",
+            "Bouron",
+            "Nasir8891"
+        ]
+    },
+    "ooui-dialog-action-close": "বন্ধ"
+}
\ No newline at end of file
diff --git a/resources/lib/oojs-ui/i18n/pfl.json b/resources/lib/oojs-ui/i18n/pfl.json
new file mode 100644 (file)
index 0000000..40cc15d
--- /dev/null
@@ -0,0 +1,12 @@
+{
+    "@metadata": {
+        "authors": [
+            "Manuae"
+        ]
+    },
+    "ooui-dialog-action-close": "Schließe",
+    "ooui-outline-control-move-down": "Bweeschs nunna",
+    "ooui-outline-control-move-up": "Bweeschs nuff",
+    "ooui-outline-control-remove": "Leschs",
+    "ooui-toolbar-more": "Mea"
+}
\ No newline at end of file
diff --git a/resources/lib/oojs-ui/i18n/pl.json b/resources/lib/oojs-ui/i18n/pl.json
new file mode 100644 (file)
index 0000000..2cb7330
--- /dev/null
@@ -0,0 +1,24 @@
+{
+    "@metadata": {
+        "authors": [
+            "Babanwalia",
+            "Chrumps",
+            "Matma Rex",
+            "Mikołka",
+            "Nasir8891",
+            "Odie2",
+            "Rzuwig",
+            "Tar Lócesilion",
+            "Ty221",
+            "WTM",
+            "Woytecr",
+            "Wpedzich",
+            "Jacenty359"
+        ]
+    },
+    "ooui-dialog-action-close": "Zamknij",
+    "ooui-outline-control-move-down": "Przenieś niżej",
+    "ooui-outline-control-move-up": "Przenieś wyżej",
+    "ooui-outline-control-remove": "Usuń element",
+    "ooui-toolbar-more": "Więcej"
+}
diff --git a/resources/lib/oojs-ui/i18n/pms.json b/resources/lib/oojs-ui/i18n/pms.json
new file mode 100644 (file)
index 0000000..bb8f113
--- /dev/null
@@ -0,0 +1,13 @@
+{
+    "@metadata": {
+        "authors": [
+            "Borichèt",
+            "Dragonòt",
+            "පසිඳු කාවින්ද"
+        ]
+    },
+    "ooui-dialog-action-close": "Saré",
+    "ooui-outline-control-move-down": "Fé calé giù l'element",
+    "ooui-outline-control-move-up": "Fé monté l'element",
+    "ooui-toolbar-more": "Ëd pi"
+}
\ No newline at end of file
diff --git a/resources/lib/oojs-ui/i18n/ps.json b/resources/lib/oojs-ui/i18n/ps.json
new file mode 100644 (file)
index 0000000..4f21707
--- /dev/null
@@ -0,0 +1,11 @@
+{
+    "@metadata": {
+        "authors": [
+            "Ahmed-Najib-Biabani-Ibrahimkhel"
+        ]
+    },
+    "ooui-dialog-action-close": "تړل",
+    "ooui-outline-control-move-down": "توکی ښکته راوړل",
+    "ooui-outline-control-move-up": "توکی پورته راوړل",
+    "ooui-toolbar-more": "نور"
+}
\ No newline at end of file
diff --git a/resources/lib/oojs-ui/i18n/pt-br.json b/resources/lib/oojs-ui/i18n/pt-br.json
new file mode 100644 (file)
index 0000000..f758660
--- /dev/null
@@ -0,0 +1,19 @@
+{
+    "@metadata": {
+        "authors": [
+            "Cainamarques",
+            "Dianakc",
+            "Fúlvio",
+            "Helder.wiki",
+            "HenriqueCrang",
+            "Jaideraf",
+            "Luckas",
+            "OTAVIO1981",
+            555
+        ]
+    },
+    "ooui-dialog-action-close": "Fechar",
+    "ooui-outline-control-move-down": "Mover item para baixo",
+    "ooui-outline-control-move-up": "Mover item para cima",
+    "ooui-toolbar-more": "Mais"
+}
\ No newline at end of file
diff --git a/resources/lib/oojs-ui/i18n/pt.json b/resources/lib/oojs-ui/i18n/pt.json
new file mode 100644 (file)
index 0000000..53b5280
--- /dev/null
@@ -0,0 +1,21 @@
+{
+    "@metadata": {
+        "authors": [
+            "Cainamarques",
+            "Fúlvio",
+            "GoEThe",
+            "Hamilton Abreu",
+            "Helder.wiki",
+            "Jaideraf",
+            "Jdforrester",
+            "Luckas",
+            "Vitorvicentevalente",
+            "SandroHc"
+        ]
+    },
+    "ooui-dialog-action-close": "Fechar",
+    "ooui-outline-control-move-down": "Mover item para baixo",
+    "ooui-outline-control-move-up": "Mover item para cima",
+    "ooui-outline-control-remove": "Remover elemento",
+    "ooui-toolbar-more": "Mais"
+}
\ No newline at end of file
diff --git a/resources/lib/oojs-ui/i18n/qqq.json b/resources/lib/oojs-ui/i18n/qqq.json
new file mode 100644 (file)
index 0000000..75bbec4
--- /dev/null
@@ -0,0 +1,27 @@
+{
+    "@metadata": {
+        "authors": [
+            "Amire80",
+            "Beta16",
+            "Erik Moeller",
+            "Jdforrester",
+            "Lloffiwr",
+            "Mooeypoo",
+            "Mormegil",
+            "Nike",
+            "PoLuX124",
+            "Purodha",
+            "Raymond",
+            "Sagan",
+            "Sayak Sarkar",
+            "Shirayuki",
+            "Siebrand",
+            "Trevor Parscal"
+        ]
+    },
+    "ooui-dialog-action-close": "Label text for button to exit from dialog.\n\n{{Identical|Close}}",
+    "ooui-outline-control-move-down": "Tool tip for a button that moves items in a list down one place",
+    "ooui-outline-control-move-up": "Tool tip for a button that moves items in a list up one place",
+    "ooui-outline-control-remove": "Tool tip for a button that removes items from a list.\n{{Identical|Remove item}}",
+    "ooui-toolbar-more": "Label for the toolbar group that contains a list of all other available tools.\n{{Identical|More}}"
+}
\ No newline at end of file
diff --git a/resources/lib/oojs-ui/i18n/qu.json b/resources/lib/oojs-ui/i18n/qu.json
new file mode 100644 (file)
index 0000000..4442528
--- /dev/null
@@ -0,0 +1,13 @@
+{
+    "@metadata": {
+        "authors": [
+            "AlimanRuna",
+            "Jduranboger"
+        ]
+    },
+    "ooui-dialog-action-close": "Wichq'ay",
+    "ooui-outline-control-move-down": "Qallawata uraykuchiy",
+    "ooui-outline-control-move-up": "Qallawata huqariy",
+    "ooui-outline-control-remove": "P'anqa sutikunata qichuy",
+    "ooui-toolbar-more": "Aswan"
+}
diff --git a/resources/lib/oojs-ui/i18n/ro.json b/resources/lib/oojs-ui/i18n/ro.json
new file mode 100644 (file)
index 0000000..4892975
--- /dev/null
@@ -0,0 +1,15 @@
+{
+    "@metadata": {
+        "authors": [
+            "AlimanRuna",
+            "Firilacroco",
+            "Minisarm",
+            "Stelistcristi"
+        ]
+    },
+    "ooui-dialog-action-close": "Închide",
+    "ooui-outline-control-move-down": "Mută elementul mai jos",
+    "ooui-outline-control-move-up": "Mută elementul mai sus",
+    "ooui-outline-control-remove": "Elimină elementul",
+    "ooui-toolbar-more": "Mai mult"
+}
\ No newline at end of file
diff --git a/resources/lib/oojs-ui/i18n/roa-tara.json b/resources/lib/oojs-ui/i18n/roa-tara.json
new file mode 100644 (file)
index 0000000..c7699d6
--- /dev/null
@@ -0,0 +1,11 @@
+{
+    "@metadata": {
+        "authors": [
+            "Joetaras"
+        ]
+    },
+    "ooui-dialog-action-close": "Achiude",
+    "ooui-outline-control-move-down": "Spuèste 'a vôsce sotte",
+    "ooui-outline-control-move-up": "Spuèste 'a vôsce sus",
+    "ooui-toolbar-more": "De cchiù"
+}
\ No newline at end of file
diff --git a/resources/lib/oojs-ui/i18n/ru.json b/resources/lib/oojs-ui/i18n/ru.json
new file mode 100644 (file)
index 0000000..f6e76a6
--- /dev/null
@@ -0,0 +1,26 @@
+{
+    "@metadata": {
+        "authors": [
+            "Amire80",
+            "DR",
+            "Eugrus",
+            "Iluvatar",
+            "KPu3uC B Poccuu",
+            "Kalan",
+            "MaxBioHazard",
+            "NBS",
+            "Niklem",
+            "Okras",
+            "Ole Yves",
+            "Putnik",
+            "Sunpriat",
+            "Yury Katkov",
+            "Умар"
+        ]
+    },
+    "ooui-dialog-action-close": "Закрыть",
+    "ooui-outline-control-move-down": "Переместить элемент вниз",
+    "ooui-outline-control-move-up": "Переместить элемент вверх",
+    "ooui-outline-control-remove": "Удалить пункт",
+    "ooui-toolbar-more": "Ещё"
+}
\ No newline at end of file
diff --git a/resources/lib/oojs-ui/i18n/sah.json b/resources/lib/oojs-ui/i18n/sah.json
new file mode 100644 (file)
index 0000000..9b3fcc8
--- /dev/null
@@ -0,0 +1,9 @@
+{
+    "@metadata": {
+        "authors": [
+            "Gazeb",
+            "HalanTul"
+        ]
+    },
+    "ooui-dialog-action-close": "Сап"
+}
\ No newline at end of file
diff --git a/resources/lib/oojs-ui/i18n/scn.json b/resources/lib/oojs-ui/i18n/scn.json
new file mode 100644 (file)
index 0000000..a699911
--- /dev/null
@@ -0,0 +1,13 @@
+{
+    "@metadata": {
+        "authors": [
+            "Gazeb",
+            "Gmelfi",
+            "HalanTul"
+        ]
+    },
+    "ooui-dialog-action-close": "Chiùi",
+    "ooui-outline-control-move-down": "Sposta di sutta",
+    "ooui-outline-control-move-up": "Sposta di supra",
+    "ooui-toolbar-more": "Àutri cosi"
+}
\ No newline at end of file
diff --git a/resources/lib/oojs-ui/i18n/sco.json b/resources/lib/oojs-ui/i18n/sco.json
new file mode 100644 (file)
index 0000000..f8dc77c
--- /dev/null
@@ -0,0 +1,12 @@
+{
+    "@metadata": {
+        "authors": [
+            "John Reid"
+        ]
+    },
+    "ooui-dialog-action-close": "Claise",
+    "ooui-outline-control-move-down": "Muiv eetem doon",
+    "ooui-outline-control-move-up": "Muiv eetem up",
+    "ooui-outline-control-remove": "Remuiv eitem",
+    "ooui-toolbar-more": "Mair"
+}
\ No newline at end of file
diff --git a/resources/lib/oojs-ui/i18n/sh.json b/resources/lib/oojs-ui/i18n/sh.json
new file mode 100644 (file)
index 0000000..5e29980
--- /dev/null
@@ -0,0 +1,10 @@
+{
+    "@metadata": {
+        "authors": [
+            "OC Ripper"
+        ]
+    },
+    "ooui-dialog-action-close": "Zatvori",
+    "ooui-outline-control-move-down": "Pomakni stavku dolje",
+    "ooui-outline-control-move-up": "Pomakni stavku gore"
+}
\ No newline at end of file
diff --git a/resources/lib/oojs-ui/i18n/si.json b/resources/lib/oojs-ui/i18n/si.json
new file mode 100644 (file)
index 0000000..cf7a9fd
--- /dev/null
@@ -0,0 +1,12 @@
+{
+    "@metadata": {
+        "authors": [
+            "Singhalawap",
+            "පසිඳු කාවින්ද",
+            "ශ්වෙත"
+        ]
+    },
+    "ooui-dialog-action-close": "නිමවන්න",
+    "ooui-outline-control-move-down": "අයිතමය පහලටදමන්න",
+    "ooui-outline-control-move-up": "අයිතමය ඉහලටදමන්න"
+}
\ No newline at end of file
diff --git a/resources/lib/oojs-ui/i18n/sk.json b/resources/lib/oojs-ui/i18n/sk.json
new file mode 100644 (file)
index 0000000..60b6f43
--- /dev/null
@@ -0,0 +1,12 @@
+{
+    "@metadata": {
+        "authors": [
+            "Mimarik",
+            "Teslaton"
+        ]
+    },
+    "ooui-dialog-action-close": "Zatvoriť",
+    "ooui-outline-control-move-down": "Posunúť položku nadol",
+    "ooui-outline-control-move-up": "Posunúť položku nahor",
+    "ooui-toolbar-more": "Viac"
+}
\ No newline at end of file
diff --git a/resources/lib/oojs-ui/i18n/sl.json b/resources/lib/oojs-ui/i18n/sl.json
new file mode 100644 (file)
index 0000000..b14d47b
--- /dev/null
@@ -0,0 +1,15 @@
+{
+    "@metadata": {
+        "authors": [
+            "Dbc334",
+            "Eleassar",
+            "Pinky sl",
+            "Yerpo"
+        ]
+    },
+    "ooui-dialog-action-close": "Zapri",
+    "ooui-outline-control-move-down": "Prestavi predmet nižje",
+    "ooui-outline-control-move-up": "Prestavi predmet višje",
+    "ooui-outline-control-remove": "Odstrani vnos",
+    "ooui-toolbar-more": "Več"
+}
\ No newline at end of file
diff --git a/resources/lib/oojs-ui/i18n/sq.json b/resources/lib/oojs-ui/i18n/sq.json
new file mode 100644 (file)
index 0000000..24a5af2
--- /dev/null
@@ -0,0 +1,14 @@
+{
+    "@metadata": {
+        "authors": [
+            "Euriditi",
+            "Kushtrim",
+            "Elioqoshi"
+        ]
+    },
+    "ooui-dialog-action-close": "Mbylle",
+    "ooui-outline-control-move-down": "Zhvendose artikullin më poshtë",
+    "ooui-outline-control-move-up": "Zhvendose artikullin më lart",
+    "ooui-outline-control-remove": "Hiq artikullin",
+    "ooui-toolbar-more": "Më tepër..."
+}
\ No newline at end of file
diff --git a/resources/lib/oojs-ui/i18n/sr-ec.json b/resources/lib/oojs-ui/i18n/sr-ec.json
new file mode 100644 (file)
index 0000000..7eaaacd
--- /dev/null
@@ -0,0 +1,14 @@
+{
+    "@metadata": {
+        "authors": [
+            "Milicevic01",
+            "Nikola Smolenski",
+            "Милан Јелисавчић"
+        ]
+    },
+    "ooui-dialog-action-close": "Затвори",
+    "ooui-outline-control-move-down": "Премести ставку на доле",
+    "ooui-outline-control-move-up": "Премести ставку на горе",
+    "ooui-outline-control-remove": "Уклони ставку",
+    "ooui-toolbar-more": "Више"
+}
\ No newline at end of file
diff --git a/resources/lib/oojs-ui/i18n/sv.json b/resources/lib/oojs-ui/i18n/sv.json
new file mode 100644 (file)
index 0000000..f7d6f04
--- /dev/null
@@ -0,0 +1,22 @@
+{
+    "@metadata": {
+        "authors": [
+            "Ainali",
+            "Haxpett",
+            "Jopparn",
+            "Knuckles",
+            "Magol",
+            "Milicevic01",
+            "Per",
+            "Sendelbach",
+            "Skalman",
+            "WikiPhoenix",
+            "Lokal Profil"
+        ]
+    },
+    "ooui-dialog-action-close": "Stäng",
+    "ooui-outline-control-move-down": "Flytta ned objekt",
+    "ooui-outline-control-move-up": "Flytta upp objekt",
+    "ooui-outline-control-remove": "Ta bort objekt",
+    "ooui-toolbar-more": "Mer"
+}
\ No newline at end of file
diff --git a/resources/lib/oojs-ui/i18n/sw.json b/resources/lib/oojs-ui/i18n/sw.json
new file mode 100644 (file)
index 0000000..1c61b06
--- /dev/null
@@ -0,0 +1,12 @@
+{
+    "@metadata": {
+        "authors": [
+            "Lloffiwr",
+            "Muddyb Blast Producer"
+        ]
+    },
+    "ooui-dialog-action-close": "Funga",
+    "ooui-outline-control-move-down": "Sogeza kipengee chini",
+    "ooui-outline-control-move-up": "Sogeza kipengee juu",
+    "ooui-toolbar-more": "Zaidi"
+}
\ No newline at end of file
diff --git a/resources/lib/oojs-ui/i18n/ta.json b/resources/lib/oojs-ui/i18n/ta.json
new file mode 100644 (file)
index 0000000..a9795fd
--- /dev/null
@@ -0,0 +1,11 @@
+{
+    "@metadata": {
+        "authors": [
+            "Jayarathina",
+            "Sank",
+            "Shanmugamp7",
+            "மதனாஹரன்"
+        ]
+    },
+    "ooui-dialog-action-close": "மூடுக"
+}
\ No newline at end of file
diff --git a/resources/lib/oojs-ui/i18n/te.json b/resources/lib/oojs-ui/i18n/te.json
new file mode 100644 (file)
index 0000000..a1f1285
--- /dev/null
@@ -0,0 +1,14 @@
+{
+    "@metadata": {
+        "authors": [
+            "Arjunaraoc",
+            "Jayarathina",
+            "Sank",
+            "Shanmugamp7",
+            "Veeven",
+            "Visdaviva",
+            "மதனாஹரன்"
+        ]
+    },
+    "ooui-dialog-action-close": "మూయి"
+}
\ No newline at end of file
diff --git a/resources/lib/oojs-ui/i18n/th.json b/resources/lib/oojs-ui/i18n/th.json
new file mode 100644 (file)
index 0000000..b7ee05a
--- /dev/null
@@ -0,0 +1,11 @@
+{
+    "@metadata": {
+        "authors": [
+            "Supasate",
+            "Taweetham"
+        ]
+    },
+    "ooui-dialog-action-close": "ปิด",
+    "ooui-outline-control-move-down": "เลื่อนรายการลง",
+    "ooui-outline-control-move-up": "ย้ายรายการขึ้น"
+}
\ No newline at end of file
diff --git a/resources/lib/oojs-ui/i18n/tl.json b/resources/lib/oojs-ui/i18n/tl.json
new file mode 100644 (file)
index 0000000..a073882
--- /dev/null
@@ -0,0 +1,12 @@
+{
+    "@metadata": {
+        "authors": [
+            "AnakngAraw",
+            "Sky Harbor"
+        ]
+    },
+    "ooui-dialog-action-close": "Isara",
+    "ooui-outline-control-move-down": "Ilipat ang aytem pababa",
+    "ooui-outline-control-move-up": "Ilipat ang aytem pataas",
+    "ooui-toolbar-more": "Marami pa"
+}
\ No newline at end of file
diff --git a/resources/lib/oojs-ui/i18n/tr.json b/resources/lib/oojs-ui/i18n/tr.json
new file mode 100644 (file)
index 0000000..94d34a2
--- /dev/null
@@ -0,0 +1,17 @@
+{
+    "@metadata": {
+        "authors": [
+            "Emperyan",
+            "Incelemeelemani",
+            "LuCKY",
+            "Maidis",
+            "Rapsar",
+            "Talha Samil Cakir",
+            "TurkishStyles"
+        ]
+    },
+    "ooui-dialog-action-close": "Kapat",
+    "ooui-outline-control-move-down": "Ögeyi aşağı taşı",
+    "ooui-outline-control-move-up": "Ögeyi yukarı taşı",
+    "ooui-toolbar-more": "Daha fazla"
+}
\ No newline at end of file
diff --git a/resources/lib/oojs-ui/i18n/tt-cyrl.json b/resources/lib/oojs-ui/i18n/tt-cyrl.json
new file mode 100644 (file)
index 0000000..1c0bd90
--- /dev/null
@@ -0,0 +1,10 @@
+{
+    "@metadata": {
+        "authors": [
+            "Ajdar"
+        ]
+    },
+    "ooui-dialog-action-close": "Ябу",
+    "ooui-outline-control-move-down": "Элементны аска күчерү",
+    "ooui-outline-control-move-up": "Элементны өскә күчерү"
+}
\ No newline at end of file
diff --git a/resources/lib/oojs-ui/i18n/ug-arab.json b/resources/lib/oojs-ui/i18n/ug-arab.json
new file mode 100644 (file)
index 0000000..efba086
--- /dev/null
@@ -0,0 +1,9 @@
+{
+    "@metadata": {
+        "authors": [
+            "Sahran",
+            "Tel'et",
+            "Tifinaghes"
+        ]
+    }
+}
\ No newline at end of file
diff --git a/resources/lib/oojs-ui/i18n/uk.json b/resources/lib/oojs-ui/i18n/uk.json
new file mode 100644 (file)
index 0000000..42487c9
--- /dev/null
@@ -0,0 +1,25 @@
+{
+    "@metadata": {
+        "authors": [
+            "AS",
+            "Aced",
+            "Ahonc",
+            "Andriykopanytsia",
+            "Base",
+            "Perohanych",
+            "RLuts",
+            "Sahran",
+            "Sergento",
+            "Steve.rusyn",
+            "SteveR",
+            "Tel'et",
+            "Tifinaghes",
+            "Ата"
+        ]
+    },
+    "ooui-dialog-action-close": "Закрити",
+    "ooui-outline-control-move-down": "Перемістити елемент униз",
+    "ooui-outline-control-move-up": "Перемістити елемент вгору",
+    "ooui-outline-control-remove": "Видалити елемент",
+    "ooui-toolbar-more": "Більше"
+}
\ No newline at end of file
diff --git a/resources/lib/oojs-ui/i18n/uz.json b/resources/lib/oojs-ui/i18n/uz.json
new file mode 100644 (file)
index 0000000..473fc75
--- /dev/null
@@ -0,0 +1,14 @@
+{
+    "@metadata": {
+        "authors": [
+            "CoderSI",
+            "Noor2020",
+            "Sociologist",
+            "පසිඳු කාවින්ද"
+        ]
+    },
+    "ooui-dialog-action-close": "Yopish",
+    "ooui-outline-control-move-down": "Elementni pastga koʻchirish",
+    "ooui-outline-control-move-up": "Elementni yuqoriga koʻchirish",
+    "ooui-toolbar-more": "Yana"
+}
\ No newline at end of file
diff --git a/resources/lib/oojs-ui/i18n/vec.json b/resources/lib/oojs-ui/i18n/vec.json
new file mode 100644 (file)
index 0000000..01833f7
--- /dev/null
@@ -0,0 +1,12 @@
+{
+    "@metadata": {
+        "authors": [
+            "Candalua",
+            "GatoSelvadego"
+        ]
+    },
+    "ooui-dialog-action-close": "Sara",
+    "ooui-outline-control-move-down": "Sposta in baso",
+    "ooui-outline-control-move-up": "Sposta in sima",
+    "ooui-toolbar-more": "Altro"
+}
\ No newline at end of file
diff --git a/resources/lib/oojs-ui/i18n/vi.json b/resources/lib/oojs-ui/i18n/vi.json
new file mode 100644 (file)
index 0000000..342ad6f
--- /dev/null
@@ -0,0 +1,14 @@
+{
+    "@metadata": {
+        "authors": [
+            "Cheers!",
+            "Jdforrester",
+            "Minh Nguyen"
+        ]
+    },
+    "ooui-dialog-action-close": "Đóng",
+    "ooui-outline-control-move-down": "Chuyển mục xuống",
+    "ooui-outline-control-move-up": "Chuyển mục lên",
+    "ooui-outline-control-remove": "Xóa khoản",
+    "ooui-toolbar-more": "Thêm"
+}
\ No newline at end of file
diff --git a/resources/lib/oojs-ui/i18n/vo.json b/resources/lib/oojs-ui/i18n/vo.json
new file mode 100644 (file)
index 0000000..2ed7e2f
--- /dev/null
@@ -0,0 +1,9 @@
+{
+    "@metadata": {
+        "authors": [
+            "Malafaya"
+        ]
+    },
+    "ooui-dialog-action-close": "Färmükön",
+    "ooui-toolbar-more": "Pluikos"
+}
\ No newline at end of file
diff --git a/resources/lib/oojs-ui/i18n/wuu.json b/resources/lib/oojs-ui/i18n/wuu.json
new file mode 100644 (file)
index 0000000..72aa48b
--- /dev/null
@@ -0,0 +1,9 @@
+{
+    "@metadata": {
+        "authors": [
+            "Malafaya",
+            "十弌"
+        ]
+    },
+    "ooui-toolbar-more": "還多"
+}
\ No newline at end of file
diff --git a/resources/lib/oojs-ui/i18n/yi.json b/resources/lib/oojs-ui/i18n/yi.json
new file mode 100644 (file)
index 0000000..ab5c510
--- /dev/null
@@ -0,0 +1,13 @@
+{
+    "@metadata": {
+        "authors": [
+            "Malafaya",
+            "פוילישער",
+            "十弌"
+        ]
+    },
+    "ooui-dialog-action-close": "שליסן",
+    "ooui-outline-control-move-down": "רוקן עלעמענט אראפ",
+    "ooui-outline-control-move-up": "רוקן עלעמענט ארויף",
+    "ooui-toolbar-more": "נאך"
+}
\ No newline at end of file
diff --git a/resources/lib/oojs-ui/i18n/yo.json b/resources/lib/oojs-ui/i18n/yo.json
new file mode 100644 (file)
index 0000000..f71d3dd
--- /dev/null
@@ -0,0 +1,11 @@
+{
+    "@metadata": {
+        "authors": [
+            "Demmy"
+        ]
+    },
+    "ooui-dialog-action-close": "Ìpadé",
+    "ooui-outline-control-move-down": "Sún onítòún sí sàlẹ̀",
+    "ooui-outline-control-move-up": "Sún onítòún s'ókè",
+    "ooui-toolbar-more": "Míràn"
+}
\ No newline at end of file
diff --git a/resources/lib/oojs-ui/i18n/zh-hans.json b/resources/lib/oojs-ui/i18n/zh-hans.json
new file mode 100644 (file)
index 0000000..19d9c7e
--- /dev/null
@@ -0,0 +1,26 @@
+{
+    "@metadata": {
+        "authors": [
+            "Anakmalaysia",
+            "Bencmq",
+            "Demmy",
+            "Hydra",
+            "Hzy980512",
+            "Liangent",
+            "Liuxinyu970226",
+            "Qiyue2001",
+            "Shirayuki",
+            "Shizhao",
+            "TianyinLee",
+            "Xiaomingyan",
+            "Yfdyh000",
+            "Zhangjintao",
+            "乌拉跨氪"
+        ]
+    },
+    "ooui-dialog-action-close": "关闭",
+    "ooui-outline-control-move-down": "下移项",
+    "ooui-outline-control-move-up": "上移项",
+    "ooui-outline-control-remove": "删除项",
+    "ooui-toolbar-more": "更多"
+}
diff --git a/resources/lib/oojs-ui/i18n/zh-hant.json b/resources/lib/oojs-ui/i18n/zh-hant.json
new file mode 100644 (file)
index 0000000..6e7b12e
--- /dev/null
@@ -0,0 +1,23 @@
+{
+    "@metadata": {
+        "authors": [
+            "Anakmalaysia",
+            "Ch.Andrew",
+            "Hydra",
+            "Justincheng12345",
+            "Liflon",
+            "Liuxinyu970226",
+            "Qiyue2001",
+            "Radish10cm",
+            "Shirayuki",
+            "Simon Shek",
+            "Spring Roll Conan",
+            "Waihorace"
+        ]
+    },
+    "ooui-dialog-action-close": "關閉",
+    "ooui-outline-control-move-down": "向下移項",
+    "ooui-outline-control-move-up": "向上移項",
+    "ooui-outline-control-remove": "移除項",
+    "ooui-toolbar-more": "更多"
+}
\ No newline at end of file
diff --git a/resources/lib/oojs-ui/images/fade-down.png b/resources/lib/oojs-ui/images/fade-down.png
new file mode 100644 (file)
index 0000000..50c7931
Binary files /dev/null and b/resources/lib/oojs-ui/images/fade-down.png differ
diff --git a/resources/lib/oojs-ui/images/fade-up.png b/resources/lib/oojs-ui/images/fade-up.png
new file mode 100644 (file)
index 0000000..7a0cb87
Binary files /dev/null and b/resources/lib/oojs-ui/images/fade-up.png differ
diff --git a/resources/lib/oojs-ui/images/icons/accept.png b/resources/lib/oojs-ui/images/icons/accept.png
new file mode 100644 (file)
index 0000000..1075110
Binary files /dev/null and b/resources/lib/oojs-ui/images/icons/accept.png differ
diff --git a/resources/lib/oojs-ui/images/icons/accept.svg b/resources/lib/oojs-ui/images/icons/accept.svg
new file mode 100644 (file)
index 0000000..df78186
--- /dev/null
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="iso-8859-1"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="24px"
+        height="24px" viewBox="0 0 24 24" style="enable-background:new 0 0 24 24;" xml:space="preserve">
+<g id="apply" style="opacity:0.75;">
+       <polygon id="check" style="fill-rule:evenodd;clip-rule:evenodd;" points="19.062,5.139 17.418,4 8.867,16.357 5.413,12.903 4,14.316 9.021,19.338"/>
+</g>
+</svg>
diff --git a/resources/lib/oojs-ui/images/icons/add-item.png b/resources/lib/oojs-ui/images/icons/add-item.png
new file mode 100644 (file)
index 0000000..5cf353f
Binary files /dev/null and b/resources/lib/oojs-ui/images/icons/add-item.png differ
diff --git a/resources/lib/oojs-ui/images/icons/add-item.svg b/resources/lib/oojs-ui/images/icons/add-item.svg
new file mode 100644 (file)
index 0000000..2620e76
--- /dev/null
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="iso-8859-1"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="24px"
+        height="24px" viewBox="0 0 24 24" style="enable-background:new 0 0 24 24;" xml:space="preserve">
+<g id="apply" style="opacity:0.75;">
+       <path d="M13,8 L11,8 L11,11 L8,11 L8,13 L11,13 L11,16 L13,16 L13,13 L16,13 L16,11 L13,11 z"/>
+</g>
+</svg>
diff --git a/resources/lib/oojs-ui/images/icons/advanced.png b/resources/lib/oojs-ui/images/icons/advanced.png
new file mode 100644 (file)
index 0000000..7f5ada5
Binary files /dev/null and b/resources/lib/oojs-ui/images/icons/advanced.png differ
diff --git a/resources/lib/oojs-ui/images/icons/advanced.svg b/resources/lib/oojs-ui/images/icons/advanced.svg
new file mode 100644 (file)
index 0000000..3e87cab
--- /dev/null
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="iso-8859-1"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="24px"
+        height="24px" viewBox="0 0 24 24" style="enable-background:new 0 0 24 24;" xml:space="preserve">
+<g id="settings" style="opacity:0.75;">
+       <path id="gear" style="fill-rule:evenodd;clip-rule:evenodd;" d="M20.869,13.476C20.948,12.994,21,12.504,21,12
+               s-0.052-0.994-0.131-1.476l-2.463-0.259c-0.149-0.556-0.367-1.082-0.648-1.57l1.558-1.924c-0.576-0.806-1.281-1.511-2.087-2.087
+               l-1.924,1.558c-0.488-0.281-1.015-0.499-1.57-0.648l-0.259-2.463C12.994,3.052,12.504,3,12,3s-0.994,0.052-1.476,0.131
+               l-0.259,2.463C9.71,5.743,9.184,5.961,8.695,6.242L6.771,4.685C5.966,5.261,5.261,5.966,4.685,6.771l1.558,1.924
+               c-0.281,0.488-0.499,1.015-0.648,1.57l-2.463,0.259C3.052,11.006,3,11.496,3,12s0.052,0.994,0.131,1.476l2.463,0.259
+               c0.149,0.556,0.367,1.082,0.648,1.57l-1.558,1.924c0.576,0.806,1.281,1.511,2.087,2.087l1.924-1.558
+               c0.488,0.281,1.015,0.499,1.57,0.648l0.259,2.463C11.006,20.948,11.496,21,12,21s0.994-0.052,1.476-0.131l0.259-2.463
+               c0.556-0.149,1.082-0.367,1.57-0.648l1.924,1.558c0.806-0.576,1.511-1.281,2.087-2.087l-1.558-1.924
+               c0.281-0.488,0.499-1.015,0.648-1.57L20.869,13.476z M12,15.998c-2.209,0-3.998-1.789-3.998-3.998S9.791,8.002,12,8.002
+               S15.998,9.791,15.998,12S14.209,15.998,12,15.998z"/>
+</g>
+</svg>
diff --git a/resources/lib/oojs-ui/images/icons/alert.png b/resources/lib/oojs-ui/images/icons/alert.png
new file mode 100644 (file)
index 0000000..992ea2a
Binary files /dev/null and b/resources/lib/oojs-ui/images/icons/alert.png differ
diff --git a/resources/lib/oojs-ui/images/icons/alert.svg b/resources/lib/oojs-ui/images/icons/alert.svg
new file mode 100644 (file)
index 0000000..886a7c0
--- /dev/null
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="iso-8859-1"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="24px"
+        height="24px" viewBox="0 0 24 24" style="enable-background:new 0 0 24 24;" xml:space="preserve">
+<g id="alert" style="opacity:0.75;">
+       <rect id="point" x="11" y="16" style="fill-rule:evenodd;clip-rule:evenodd;" width="2" height="2"/>
+       <polygon id="stroke" style="fill-rule:evenodd;clip-rule:evenodd;" points="13.516,10 10.516,10 11,15 13,15"/>
+       <path id="triangle" d="M12.017,5.974L19.536,19H4.496L12.017,5.974 M12.017,3.5c-0.544,0-1.088,0.357-1.5,1.071L2.532,18.402 C1.707,19.831,2.382,21,4.032,21H20c1.65,0,2.325-1.169,1.5-2.599L13.517,4.572C13.104,3.857,12.561,3.5,12.017,3.5L12.017,3.5z"/>
+</g>
+</svg>
diff --git a/resources/lib/oojs-ui/images/icons/arched-arrow-ltr.png b/resources/lib/oojs-ui/images/icons/arched-arrow-ltr.png
new file mode 100644 (file)
index 0000000..5db1c4d
Binary files /dev/null and b/resources/lib/oojs-ui/images/icons/arched-arrow-ltr.png differ
diff --git a/resources/lib/oojs-ui/images/icons/arched-arrow-ltr.svg b/resources/lib/oojs-ui/images/icons/arched-arrow-ltr.svg
new file mode 100644 (file)
index 0000000..5b343a5
--- /dev/null
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="iso-8859-1"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="24px"
+        height="24px" viewBox="0 0 24 24" style="enable-background:new 0 0 24 24;" xml:space="preserve">
+<g id="arched-arrow-ltr" style="opacity:0.75;">
+       <path id="arrow" style="fill-rule:evenodd;clip-rule:evenodd;" d="M19.925,14.937l-2.391-6.901l-1.48,2.329 c-0.964-0.845-2.699-1.85-5.513-1.823c-4.887,0.046-6.524,4.244-6.524,4.244s2.753-2.639,6.925-1.949 c1.729,0.286,3.007,1.206,3.675,1.791l-1.474,2.319L19.925,14.937z"/>
+</g>
+</svg>
diff --git a/resources/lib/oojs-ui/images/icons/arched-arrow-rtl.png b/resources/lib/oojs-ui/images/icons/arched-arrow-rtl.png
new file mode 100644 (file)
index 0000000..7931971
Binary files /dev/null and b/resources/lib/oojs-ui/images/icons/arched-arrow-rtl.png differ
diff --git a/resources/lib/oojs-ui/images/icons/arched-arrow-rtl.svg b/resources/lib/oojs-ui/images/icons/arched-arrow-rtl.svg
new file mode 100644 (file)
index 0000000..bb5f10e
--- /dev/null
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="iso-8859-1"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="24px"
+        height="24px" viewBox="0 0 24 24" style="enable-background:new 0 0 24 24;" xml:space="preserve">
+<g id="arched-arrow-rtl" style="opacity:0.75;">
+       <path id="arrow" style="fill-rule:evenodd;clip-rule:evenodd;" d="M13.401,8.542c-2.814-0.027-4.549,0.978-5.513,1.823 l-1.48-2.329l-2.391,6.901l6.782,0.009l-1.474-2.319c0.668-0.584,1.945-1.504,3.675-1.791c4.172-0.69,6.925,1.949,6.925,1.949 S18.288,8.588,13.401,8.542z"/>
+</g>
+</svg>
diff --git a/resources/lib/oojs-ui/images/icons/check.png b/resources/lib/oojs-ui/images/icons/check.png
new file mode 100644 (file)
index 0000000..82c3cb4
Binary files /dev/null and b/resources/lib/oojs-ui/images/icons/check.png differ
diff --git a/resources/lib/oojs-ui/images/icons/check.svg b/resources/lib/oojs-ui/images/icons/check.svg
new file mode 100644 (file)
index 0000000..e67cd6c
--- /dev/null
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="24" height="24" viewBox="0, 0, 24, 24">
+  <g id="check">
+    <path d="M7.105,13.473 L8.527,12.05 L10.428,13.952 L15.238,7 L16.895,8.148 L10.635,17 z" fill="#000000"/>
+  </g>
+  <defs/>
+</svg>
diff --git a/resources/lib/oojs-ui/images/icons/clear.png b/resources/lib/oojs-ui/images/icons/clear.png
new file mode 100644 (file)
index 0000000..697dd62
Binary files /dev/null and b/resources/lib/oojs-ui/images/icons/clear.png differ
diff --git a/resources/lib/oojs-ui/images/icons/clear.svg b/resources/lib/oojs-ui/images/icons/clear.svg
new file mode 100644 (file)
index 0000000..d83eb02
--- /dev/null
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="iso-8859-1"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="24px"
+        height="24px" viewBox="0 0 24 24" style="enable-background:new 0 0 24 24;" xml:space="preserve">
+<g id="clear" style="opacity:0.75;">
+       <path id="circle_with_strike" style="fill-rule:evenodd;clip-rule:evenodd;" d="M11.999,5.022c-3.853,0-6.977,3.124-6.977,6.978 c0,3.853,3.124,6.978,6.977,6.978c3.854,0,6.979-3.125,6.979-6.978C18.978,8.146,15.853,5.022,11.999,5.022z M6.886,12 c0-1.092,0.572-3.25,0.93-2.929l7.113,7.113c0.488,0.525-1.837,0.931-2.93,0.931C9.174,17.114,6.886,14.824,6.886,12z M16.184,14.929L9.07,7.816c-0.445-0.483,1.837-0.931,2.929-0.931c2.827,0,5.115,2.289,5.115,5.114 C17.114,13.092,16.75,15.542,16.184,14.929z"/>
+</g>
+</svg>
diff --git a/resources/lib/oojs-ui/images/icons/close.png b/resources/lib/oojs-ui/images/icons/close.png
new file mode 100644 (file)
index 0000000..f7eed9f
Binary files /dev/null and b/resources/lib/oojs-ui/images/icons/close.png differ
diff --git a/resources/lib/oojs-ui/images/icons/close.svg b/resources/lib/oojs-ui/images/icons/close.svg
new file mode 100644 (file)
index 0000000..a0118c2
--- /dev/null
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="iso-8859-1"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="24px"
+        height="24px" viewBox="0 0 24 24" style="enable-background:new 0 0 24 24;" xml:space="preserve">
+<g id="close" style="opacity:0.75;">
+       <polygon id="x" style="fill-rule:evenodd;clip-rule:evenodd;" points="18.717,6.697 17.303,5.283 12,10.586 6.697,5.283 5.283,6.697 10.586,12 5.283,17.303 6.697,18.717 12,13.414 17.303,18.717 18.717,17.303 13.414,12            "/>
+</g>
+</svg>
diff --git a/resources/lib/oojs-ui/images/icons/code.png b/resources/lib/oojs-ui/images/icons/code.png
new file mode 100644 (file)
index 0000000..a5ebdbf
Binary files /dev/null and b/resources/lib/oojs-ui/images/icons/code.png differ
diff --git a/resources/lib/oojs-ui/images/icons/code.svg b/resources/lib/oojs-ui/images/icons/code.svg
new file mode 100644 (file)
index 0000000..6f1ed53
--- /dev/null
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+        width="24px" height="24px" viewBox="0 0 24 24" enable-background="new 0 0 24 24" xml:space="preserve">
+<g id="code" opacity="0.75">
+       <path id="left-bracket" d="M4,12v-1h1c1,0,1,0,1-1V7.614C6,7.1,6.024,6.718,6.073,6.472C6.127,6.22,6.212,6.009,6.33,5.839
+               C6.534,5.56,6.803,5.364,7.138,5.255C7.473,5.14,8.01,5,8.973,5H10v1H9.248c-0.457,0-0.77,0.191-0.936,0.408
+               C8.145,6.623,8,6.853,8,7.476v1.857c0,0.729-0.041,1.18-0.244,1.493c-0.2,0.307-0.562,0.529-1.09,0.667
+               c0.535,0.155,0.9,0.385,1.096,0.688C7.961,12.484,8,12.938,8,13.665v1.862c0,0.619,0.145,0.848,0.312,1.062
+               c0.166,0.22,0.479,0.407,0.936,0.407L10,17l0,0v1H8.973c-0.963,0-1.5-0.133-1.835-0.248c-0.335-0.109-0.604-0.307-0.808-0.591
+               c-0.118-0.165-0.203-0.374-0.257-0.625C6.024,16.283,6,15.9,6,15.387V13c0-1,0-1-1-1H4z"/>
+       <use transform="matrix(-1,0,0,1,24,0)" id="right-bracket" x="0" y="0" width="24" height="24" xlink:href="#left-bracket" />
+</g>
+</svg>
diff --git a/resources/lib/oojs-ui/images/icons/collapse.png b/resources/lib/oojs-ui/images/icons/collapse.png
new file mode 100644 (file)
index 0000000..38b796f
Binary files /dev/null and b/resources/lib/oojs-ui/images/icons/collapse.png differ
diff --git a/resources/lib/oojs-ui/images/icons/collapse.svg b/resources/lib/oojs-ui/images/icons/collapse.svg
new file mode 100644 (file)
index 0000000..a89cebf
--- /dev/null
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="iso-8859-1"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="24px"
+        height="24px" viewBox="0 0 24 24" style="enable-background:new 0 0 24 24;" xml:space="preserve">
+<g id="collapse" style="opacity:0.75;">
+       <polygon id="arrow" style="fill-rule:evenodd;clip-rule:evenodd;" points="6.697,15.714 12,10.412 17.303,15.714 18.717,14.3 12,7.583 5.283,14.3"/>
+</g>
+</svg>
diff --git a/resources/lib/oojs-ui/images/icons/comment.png b/resources/lib/oojs-ui/images/icons/comment.png
new file mode 100644 (file)
index 0000000..9546455
Binary files /dev/null and b/resources/lib/oojs-ui/images/icons/comment.png differ
diff --git a/resources/lib/oojs-ui/images/icons/comment.svg b/resources/lib/oojs-ui/images/icons/comment.svg
new file mode 100644 (file)
index 0000000..e052935
--- /dev/null
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="iso-8859-1"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="24px"
+        height="24px" viewBox="0 0 24 24" style="enable-background:new 0 0 24 24;" xml:space="preserve">
+<g id="comment" style="opacity:0.75;">
+       <path id="speech_bubble" style="fill-rule:evenodd;clip-rule:evenodd;" d="M15,6H9C7.343,6,6,7.344,6,9v4c0,1.656,1.343,3,3,3v3 l3-3h3c1.657,0,3-1.344,3-3V9C18,7.344,16.657,6,15,6z"/>
+</g>
+</svg>
diff --git a/resources/lib/oojs-ui/images/icons/expand.png b/resources/lib/oojs-ui/images/icons/expand.png
new file mode 100644 (file)
index 0000000..e90aca1
Binary files /dev/null and b/resources/lib/oojs-ui/images/icons/expand.png differ
diff --git a/resources/lib/oojs-ui/images/icons/expand.svg b/resources/lib/oojs-ui/images/icons/expand.svg
new file mode 100644 (file)
index 0000000..b542f5f
--- /dev/null
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="iso-8859-1"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="24px"
+        height="24px" viewBox="0 0 24 24" style="enable-background:new 0 0 24 24;" xml:space="preserve">
+<g id="expand" style="opacity:0.75;">
+       <polygon id="arrow" style="fill-rule:evenodd;clip-rule:evenodd;" points="17.303,8.283 12,13.586 6.697,8.283 5.283,9.697 12,16.414 18.717,9.697"/>
+</g>
+</svg>
diff --git a/resources/lib/oojs-ui/images/icons/help.png b/resources/lib/oojs-ui/images/icons/help.png
new file mode 100644 (file)
index 0000000..dca745b
Binary files /dev/null and b/resources/lib/oojs-ui/images/icons/help.png differ
diff --git a/resources/lib/oojs-ui/images/icons/help.svg b/resources/lib/oojs-ui/images/icons/help.svg
new file mode 100644 (file)
index 0000000..c68bdda
--- /dev/null
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="iso-8859-1"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="24px"
+        height="24px" viewBox="0 0 24 24" style="enable-background:new 0 0 24 24;" xml:space="preserve">
+<g id="help" style="opacity:0.75;">
+       <path id="circle" style="fill-rule:evenodd;clip-rule:evenodd;" d="M12.001,2.085c-5.478,0-9.916,4.438-9.916,9.916 c0,5.476,4.438,9.914,9.916,9.914c5.476,0,9.914-4.438,9.914-9.914C21.915,6.523,17.477,2.085,12.001,2.085z M12.002,20.085 c-4.465,0-8.084-3.619-8.084-8.083c0-4.465,3.619-8.084,8.084-8.084c4.464,0,8.083,3.619,8.083,8.084 C20.085,16.466,16.466,20.085,12.002,20.085z"/>
+       <g id="question_mark">
+               <path id="top" style="fill-rule:evenodd;clip-rule:evenodd;" d="M11.766,6.688c-2.5,0-3.219,2.188-3.219,2.188l1.411,0.854 c0,0,0.298-0.791,0.901-1.229c0.516-0.375,1.625-0.625,2.219,0.125c0.701,0.885-0.17,1.587-1.078,2.719 C11.047,12.531,11,15,11,15h1.969c0,0,0.135-2.318,1.041-3.381c0.603-0.707,1.443-1.338,1.443-2.494S14.266,6.688,11.766,6.688z"/>
+               <rect id="bottom" x="11" y="16" style="fill-rule:evenodd;clip-rule:evenodd;" width="2" height="2"/>
+       </g>
+</g>
+</svg>
diff --git a/resources/lib/oojs-ui/images/icons/history.png b/resources/lib/oojs-ui/images/icons/history.png
new file mode 100644 (file)
index 0000000..c049931
Binary files /dev/null and b/resources/lib/oojs-ui/images/icons/history.png differ
diff --git a/resources/lib/oojs-ui/images/icons/history.svg b/resources/lib/oojs-ui/images/icons/history.svg
new file mode 100644 (file)
index 0000000..40c0ae3
--- /dev/null
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="iso-8859-1"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="24px"
+        height="24px" viewBox="0 0 24 24" style="enable-background:new 0 0 24 24;" xml:space="preserve">
+<g id="history" style="opacity:0.75;">
+       <path id="clock_hands" style="fill-rule:evenodd;clip-rule:evenodd;" d="M17.26,15.076c0,0-2.385-1.935-4.005-3.062 c0.72-2.397,1.702-6.559,1.702-6.559s-4.35,5.363-4.877,6.699c-0.463,1.168,1.459,2.209,2.346,1.678 C14.326,14.383,17.26,15.076,17.26,15.076z"/>
+       <path id="arrow" style="fill-rule:evenodd;clip-rule:evenodd;" d="M12.086,2.085c-5.478,0-9.916,4.438-9.916,9.916 c0,1.783,0.476,3.454,1.301,4.898l-2.223,2.04h5.688v-5.219l-2.066,1.896c-0.55-1.088-0.866-2.312-0.866-3.615 c0-4.465,3.619-8.084,8.084-8.084c4.464,0,8.083,3.619,8.083,8.084c0,4.464-3.619,8.083-8.083,8.083 c-1.145,0-2.228-0.247-3.213-0.678l-0.833,1.634c1.235,0.557,2.602,0.874,4.045,0.874c5.476,0,9.914-4.438,9.914-9.914 C22,6.523,17.562,2.085,12.086,2.085z"/>
+</g>
+</svg>
diff --git a/resources/lib/oojs-ui/images/icons/link.png b/resources/lib/oojs-ui/images/icons/link.png
new file mode 100644 (file)
index 0000000..7dfa268
Binary files /dev/null and b/resources/lib/oojs-ui/images/icons/link.png differ
diff --git a/resources/lib/oojs-ui/images/icons/link.svg b/resources/lib/oojs-ui/images/icons/link.svg
new file mode 100644 (file)
index 0000000..dadf69c
--- /dev/null
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="iso-8859-1"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="24px"
+        height="24px" viewBox="0 0 24 24" style="enable-background:new 0 0 24 24;" xml:space="preserve">
+<g id="link" style="opacity:0.75;">
+       <path id="right" d="M19.188,12.001c0,1.1-0.891,2.015-1.988,2.015l-4.195-0.015C13.543,15.089,13.968,16,15.002,16h3
+               C19.658,16,21,13.657,21,12s-1.342-4-2.998-4h-3c-1.034,0-1.459,0.911-1.998,1.999l4.195-0.015
+               C18.297,9.984,19.188,10.901,19.188,12.001z"/>
+       <path id="center" d="M8,12c0,0.535,0.42,1,0.938,1h6.109c0.518,0,0.938-0.465,0.938-1c0-0.534-0.42-1-0.938-1H8.938
+               C8.42,11,8,11.466,8,12z"/>
+       <path id="left" d="M4.816,11.999c0-1.1,0.891-2.015,1.988-2.015L11,9.999C10.461,8.911,10.036,8,9.002,8h-3
+               c-1.656,0-2.998,2.343-2.998,4s1.342,4,2.998,4h3c1.034,0,1.459-0.911,1.998-1.999l-4.195,0.015
+               C5.707,14.016,4.816,13.099,4.816,11.999z"/>
+</g>
+</svg>
diff --git a/resources/lib/oojs-ui/images/icons/menu.png b/resources/lib/oojs-ui/images/icons/menu.png
new file mode 100644 (file)
index 0000000..b5ac60f
Binary files /dev/null and b/resources/lib/oojs-ui/images/icons/menu.png differ
diff --git a/resources/lib/oojs-ui/images/icons/menu.svg b/resources/lib/oojs-ui/images/icons/menu.svg
new file mode 100644 (file)
index 0000000..657fab2
--- /dev/null
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="iso-8859-1"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="24px"
+        height="24px" viewBox="0 0 24 24" style="enable-background:new 0 0 24 24;" xml:space="preserve">
+<g id="menu" style="opacity:0.75;">
+       <path id="lines" d="M6,15h12c0.553,0,1,0.447,1,1v1c0,0.553-0.447,1-1,1H6c-0.553,0-1-0.447-1-1v-1C5,15.447,5.447,15,6,15z M5,11v1
+               c0,0.553,0.447,1,1,1h12c0.553,0,1-0.447,1-1v-1c0-0.553-0.447-1-1-1H6C5.447,10,5,10.447,5,11z M5,6v1c0,0.553,0.447,1,1,1h12
+               c0.553,0,1-0.447,1-1V6c0-0.553-0.447-1-1-1H6C5.447,5,5,5.447,5,6z"/>
+</g>
+</svg>
diff --git a/resources/lib/oojs-ui/images/icons/move-ltr.png b/resources/lib/oojs-ui/images/icons/move-ltr.png
new file mode 100644 (file)
index 0000000..ded5f05
Binary files /dev/null and b/resources/lib/oojs-ui/images/icons/move-ltr.png differ
diff --git a/resources/lib/oojs-ui/images/icons/move-ltr.svg b/resources/lib/oojs-ui/images/icons/move-ltr.svg
new file mode 100644 (file)
index 0000000..a378a5d
--- /dev/null
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="iso-8859-1"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="24px"
+        height="24px" viewBox="0 0 24 24" style="enable-background:new 0 0 24 24;" xml:space="preserve">
+<g id="move-ltr" style="opacity:0.75;">
+       <polygon id="arrow" style="fill-rule:evenodd;clip-rule:evenodd;" points="8.935,7.181 14.237,12.483 8.935,17.786
+               10.349,19.2 17.065,12.483 10.349,5.767"/>
+</g>
+</svg>
diff --git a/resources/lib/oojs-ui/images/icons/move-rtl.png b/resources/lib/oojs-ui/images/icons/move-rtl.png
new file mode 100644 (file)
index 0000000..fc6e62d
Binary files /dev/null and b/resources/lib/oojs-ui/images/icons/move-rtl.png differ
diff --git a/resources/lib/oojs-ui/images/icons/move-rtl.svg b/resources/lib/oojs-ui/images/icons/move-rtl.svg
new file mode 100644 (file)
index 0000000..c0b334b
--- /dev/null
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="iso-8859-1"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="24px"
+        height="24px" viewBox="0 0 24 24" style="enable-background:new 0 0 24 24;" xml:space="preserve">
+<g id="move-rtl" style="opacity:0.75;">
+       <polygon id="arrow_9_" style="fill-rule:evenodd;clip-rule:evenodd;" points="15.065,17.786 9.763,12.483 15.065,7.181
+               13.651,5.767 6.935,12.483 13.651,19.2"/>
+</g>
+</svg>
diff --git a/resources/lib/oojs-ui/images/icons/picture.png b/resources/lib/oojs-ui/images/icons/picture.png
new file mode 100644 (file)
index 0000000..faf8af9
Binary files /dev/null and b/resources/lib/oojs-ui/images/icons/picture.png differ
diff --git a/resources/lib/oojs-ui/images/icons/picture.svg b/resources/lib/oojs-ui/images/icons/picture.svg
new file mode 100644 (file)
index 0000000..078ce10
--- /dev/null
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="iso-8859-1"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="24px"
+        height="24px" viewBox="0 0 24 24" style="enable-background:new 0 0 24 24;" xml:space="preserve">
+<g id="picture" style="opacity:0.75;">
+       <path id="frame" style="fill-rule:evenodd;clip-rule:evenodd;" d="M18,4H6C4,3.993,3,4.993,3,6.993L3.014,16C3,18,4,18.988,6,19h12
+               c2-0.012,2.994-1,3-3.006V6.993C20.994,4.993,20,3.993,18,4z M19,17H5V6h14V17z"/>
+       <polygon id="mountains" style="fill-rule:evenodd;clip-rule:evenodd;" points="6,13.5 9.5,10 11.828,12.312 10.516,13.406
+               11.391,14.438 15.5,11 18,13 18,16 6,16"/>
+       <polygon id="sky" style="fill-rule:evenodd;clip-rule:evenodd;" points="6,12 9.516,7.844 12.562,11.016 15.5,9 18,11 18,7 6,7"/>
+</g>
+</svg>
diff --git a/resources/lib/oojs-ui/images/icons/remove-item.png b/resources/lib/oojs-ui/images/icons/remove-item.png
new file mode 100644 (file)
index 0000000..2f11db3
Binary files /dev/null and b/resources/lib/oojs-ui/images/icons/remove-item.png differ
diff --git a/resources/lib/oojs-ui/images/icons/remove-item.svg b/resources/lib/oojs-ui/images/icons/remove-item.svg
new file mode 100644 (file)
index 0000000..b95e7d3
--- /dev/null
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="24" height="24" viewBox="0, 0, 24, 24">
+  <g id="remove-item">
+    <path d="M8,11 L16,11 L16,13 L8,13 z" fill="#000000"/>
+  </g>
+  <defs/>
+</svg>
diff --git a/resources/lib/oojs-ui/images/icons/remove.png b/resources/lib/oojs-ui/images/icons/remove.png
new file mode 100644 (file)
index 0000000..d7e116c
Binary files /dev/null and b/resources/lib/oojs-ui/images/icons/remove.png differ
diff --git a/resources/lib/oojs-ui/images/icons/remove.svg b/resources/lib/oojs-ui/images/icons/remove.svg
new file mode 100644 (file)
index 0000000..17c8d39
--- /dev/null
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="iso-8859-1"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="24px"
+        height="24px" viewBox="0 0 24 24" style="enable-background:new 0 0 24 24;" xml:space="preserve">
+<g id="remove" style="opacity:0.75;">
+       <path id="trash_can" style="fill-rule:evenodd;clip-rule:evenodd;" d="M12,10h-1v6h1V10z M10,10H9v6h1V10z M14,10h-1v6h1V10z
+                M14,6V5H9v1H6v3h1v7.966l1,1.031v-0.074V18h6.984L15,17.982v0.015l1-1.031V9h1V6H14z M15,17H8V9h7V17z M16,8H7V7h9V8z"/>
+</g>
+</svg>
diff --git a/resources/lib/oojs-ui/images/icons/search.png b/resources/lib/oojs-ui/images/icons/search.png
new file mode 100644 (file)
index 0000000..df29792
Binary files /dev/null and b/resources/lib/oojs-ui/images/icons/search.png differ
diff --git a/resources/lib/oojs-ui/images/icons/search.svg b/resources/lib/oojs-ui/images/icons/search.svg
new file mode 100644 (file)
index 0000000..37feda4
--- /dev/null
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="iso-8859-1"?>
+<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="24px"
+        height="24px" viewBox="0 0 24 24" style="enable-background:new 0 0 24 24;" xml:space="preserve">
+<g id="search" style="opacity:0.75;">
+       <path id="magnifying_glass" d="M16.021,15.96l-2.374-2.375c-0.048-0.047-0.105-0.079-0.169-0.099c0.403-0.566,0.643-1.26,0.643-2.009
+               C14.12,9.557,12.563,8,10.644,8c-1.921,0-3.478,1.557-3.478,3.478c0,1.92,1.557,3.477,3.478,3.477c0.749,0,1.442-0.239,2.01-0.643
+               c0.019,0.063,0.051,0.121,0.098,0.169l2.375,2.374c0.19,0.189,0.543,0.143,0.79-0.104S16.21,16.15,16.021,15.96z M10.644,13.69
+               c-1.221,0-2.213-0.991-2.213-2.213c0-1.221,0.992-2.213,2.213-2.213c1.222,0,2.213,0.992,2.213,2.213
+               C12.856,12.699,11.865,13.69,10.644,13.69z"/>
+</g>
+</svg>
diff --git a/resources/lib/oojs-ui/images/icons/settings.png b/resources/lib/oojs-ui/images/icons/settings.png
new file mode 100644 (file)
index 0000000..b1b35e9
Binary files /dev/null and b/resources/lib/oojs-ui/images/icons/settings.png differ
diff --git a/resources/lib/oojs-ui/images/icons/settings.svg b/resources/lib/oojs-ui/images/icons/settings.svg
new file mode 100644 (file)
index 0000000..1464a79
--- /dev/null
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="24" height="24" viewBox="0, 0, 24, 24">
+  <g id="settings" opacity="0.75">
+    <path d="M3,4 L6,4 L6,6 L3,6 z" fill="#000000"/>
+    <path d="M12,4 L21,4 L21,6 L12,6 z" fill="#000000"/>
+    <path d="M8,3 L10,3 C10.552,3 11,3.448 11,4 L11,6 C11,6.552 10.552,7 10,7 L8,7 C7.448,7 7,6.552 7,6 L7,4 C7,3.448 7.448,3 8,3 z" fill="#000000"/>
+    <path d="M3,11 L12,11 L12,13 L3,13 z" fill="#000000"/>
+    <path d="M18,11 L21,11 L21,13 L18,13 z" fill="#000000"/>
+    <path d="M14,10 L16,10 C16.552,10 17,10.448 17,11 L17,13 C17,13.552 16.552,14 16,14 L14,14 C13.448,14 13,13.552 13,13 L13,11 C13,10.448 13.448,10 14,10 z" fill="#000000"/>
+    <path d="M3,18 L9,18 L9,20 L3,20 z" fill="#000000"/>
+    <path d="M15,18 L21,18 L21,20 L15,20 z" fill="#000000"/>
+    <path d="M11,17 L13,17 C13.552,17 14,17.448 14,18 L14,20 C14,20.552 13.552,21 13,21 L11,21 C10.448,21 10,20.552 10,20 L10,18 C10,17.448 10.448,17 11,17 z" fill="#000000"/>
+  </g>
+  <defs/>
+</svg>
diff --git a/resources/lib/oojs-ui/images/icons/tag.png b/resources/lib/oojs-ui/images/icons/tag.png
new file mode 100644 (file)
index 0000000..722f4d7
Binary files /dev/null and b/resources/lib/oojs-ui/images/icons/tag.png differ
diff --git a/resources/lib/oojs-ui/images/icons/tag.svg b/resources/lib/oojs-ui/images/icons/tag.svg
new file mode 100644 (file)
index 0000000..d21e5e3
--- /dev/null
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="iso-8859-1"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="24px"
+        height="24px" viewBox="0 0 24 24" style="enable-background:new 0 0 24 24;" xml:space="preserve">
+<g id="tag" style="opacity:0.75;">
+       <path d="M18.748,11.717c0.389,0.389,0.389,1.025,0,1.414l-4.949,4.95c-0.389,0.389-1.025,0.389-1.414,0l-6.01-6.01
+               c-0.389-0.389-0.707-1.157-0.707-1.707L5.667,6c0-0.55,0.45-1,1-1h4.364c0.55,0,1.318,0.318,1.707,0.707L18.748,11.717z
+                M8.104,7.456C7.525,8.032,7.526,8.97,8.103,9.549c0.578,0.577,1.516,0.577,2.095,0.001c0.576-0.578,0.576-1.517,0-2.095
+               C9.617,6.879,8.68,6.878,8.104,7.456z"/>
+</g>
+</svg>
diff --git a/resources/lib/oojs-ui/images/icons/window.png b/resources/lib/oojs-ui/images/icons/window.png
new file mode 100644 (file)
index 0000000..3d48a3c
Binary files /dev/null and b/resources/lib/oojs-ui/images/icons/window.png differ
diff --git a/resources/lib/oojs-ui/images/icons/window.svg b/resources/lib/oojs-ui/images/icons/window.svg
new file mode 100644 (file)
index 0000000..621cf2c
--- /dev/null
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="iso-8859-1"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="24px"
+        height="24px" viewBox="0 0 24 24" style="enable-background:new 0 0 24 24;" xml:space="preserve">
+<g id="window" style="opacity:0.75;">
+       <rect id="title" x="7" y="10" width="10" height="1"/>
+       <path id="window" d="M16,19H8c-2.206,0-4-1.794-4-4V9c0-2.206,1.794-4,4-4h8c2.206,0,4,1.794,4,4v6C20,17.206,18.206,19,16,19z
+                M8,7C6.897,7,6,7.897,6,9v6c0,1.103,0.897,2,2,2h8c1.103,0,2-0.897,2-2V9c0-1.103-0.897-2-2-2H8z"/>
+</g>
+</svg>
diff --git a/resources/lib/oojs-ui/images/indicators/down.png b/resources/lib/oojs-ui/images/indicators/down.png
new file mode 100644 (file)
index 0000000..47ff54c
Binary files /dev/null and b/resources/lib/oojs-ui/images/indicators/down.png differ
diff --git a/resources/lib/oojs-ui/images/indicators/down.svg b/resources/lib/oojs-ui/images/indicators/down.svg
new file mode 100644 (file)
index 0000000..c871f60
--- /dev/null
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="iso-8859-1"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="12px"
+        height="12px" viewBox="0 0 12 12" style="enable-background:new 0 0 12 12;" xml:space="preserve">
+<g id="down" style="opacity:0.75;">
+       <polygon id="arrow" style="fill-rule:evenodd;clip-rule:evenodd;" points="2.023,3 5.512,8.953 9,3"/>
+</g>
+</svg>
diff --git a/resources/lib/oojs-ui/images/indicators/required.png b/resources/lib/oojs-ui/images/indicators/required.png
new file mode 100644 (file)
index 0000000..aeb35a3
Binary files /dev/null and b/resources/lib/oojs-ui/images/indicators/required.png differ
diff --git a/resources/lib/oojs-ui/images/indicators/required.svg b/resources/lib/oojs-ui/images/indicators/required.svg
new file mode 100644 (file)
index 0000000..7c60ec0
--- /dev/null
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="12" height="12" viewBox="0, 0, 12, 12">
+  <g id="required" opacity="0.75">
+    <path d="M7,0 L7,4.268 L10.696,2.134 L11.696,3.866 L8,6 L11.696,8.134 L10.696,9.866 L7,7.732 L7,12 L5,12 L5,7.732 L1.304,9.866 L0.304,8.134 L4,6 L0.304,3.866 L1.304,2.134 L5,4.268 L5,0 z" fill="#000000"/>
+  </g>
+  <defs/>
+</svg>
diff --git a/resources/lib/oojs-ui/images/indicators/up.png b/resources/lib/oojs-ui/images/indicators/up.png
new file mode 100644 (file)
index 0000000..b827f6d
Binary files /dev/null and b/resources/lib/oojs-ui/images/indicators/up.png differ
diff --git a/resources/lib/oojs-ui/images/indicators/up.svg b/resources/lib/oojs-ui/images/indicators/up.svg
new file mode 100644 (file)
index 0000000..a5d7f38
--- /dev/null
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="iso-8859-1"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="12px"
+        height="12px" viewBox="0 0 12 12" style="enable-background:new 0 0 12 12;" xml:space="preserve">
+<g id="up" style="opacity:0.75;">
+       <polygon id="arrow" style="fill-rule:evenodd;clip-rule:evenodd;" points="5.512,2.006 2,8 9.024,8                "/>
+</g>
+</svg>
diff --git a/resources/lib/oojs-ui/images/tail.svg b/resources/lib/oojs-ui/images/tail.svg
new file mode 100644 (file)
index 0000000..4df8bb2
--- /dev/null
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="iso-8859-1"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+        width="15px" height="8px" viewBox="0 0 15 8" style="enable-background:new 0 0 15 8;" xml:space="preserve">
+<g id="tail">
+       <polygon id="outline" style="fill-rule:evenodd;clip-rule:evenodd;fill:#808080;" points="7.609,2.499 2.096,8 13.125,8"/>
+       <polygon id="fill" style="fill-rule:evenodd;clip-rule:evenodd;fill:#FFFFFF;" points="7.609,3 2.598,8 12.622,8"/>
+</g>
+</svg>
diff --git a/resources/lib/oojs-ui/images/textures/pending.gif b/resources/lib/oojs-ui/images/textures/pending.gif
new file mode 100644 (file)
index 0000000..1194eed
Binary files /dev/null and b/resources/lib/oojs-ui/images/textures/pending.gif differ
diff --git a/resources/lib/oojs-ui/images/textures/transparency.png b/resources/lib/oojs-ui/images/textures/transparency.png
new file mode 100644 (file)
index 0000000..b8e36d3
Binary files /dev/null and b/resources/lib/oojs-ui/images/textures/transparency.png differ
diff --git a/resources/lib/oojs-ui/images/toolbar-shadow.png b/resources/lib/oojs-ui/images/toolbar-shadow.png
new file mode 100644 (file)
index 0000000..97e8d13
Binary files /dev/null and b/resources/lib/oojs-ui/images/toolbar-shadow.png differ
diff --git a/resources/lib/oojs-ui/oojs-ui-agora.css b/resources/lib/oojs-ui/oojs-ui-agora.css
new file mode 100644 (file)
index 0000000..8aedde5
--- /dev/null
@@ -0,0 +1,80 @@
+.oo-ui-window-head {
+  height: 3.35em;
+  border-bottom: 1px solid #dddddd;
+}
+
+.oo-ui-window-body {
+  padding: 2em 3.35em;
+}
+
+.oo-ui-window-icon {
+  width: 3.35em;
+  height: 3.35em;
+  background-size: 2em auto;
+  border-left: 1px solid #dddddd;
+}
+
+.oo-ui-window-title {
+  line-height: 3.35em;
+}
+
+.oo-ui-buttonedElement.oo-ui-indicatedElement .oo-ui-buttonedElement-button > .oo-ui-indicatedElement-indicator,
+.oo-ui-buttonedElement.oo-ui-iconedElement .oo-ui-buttonedElement-button > .oo-ui-iconedElement-icon {
+  width: 3.35em;
+  height: 3.35em;
+  background-size: 2em auto;
+}
+
+.oo-ui-optionWidget {
+  padding: 0.8em 1em 0.8em 3.35em;
+  font-weight: bold;
+  border-bottom: 1px solid #dddddd;
+}
+
+.oo-ui-optionWidget.oo-ui-indicatedElement .oo-ui-labeledElement-label {
+  padding-right: 1.5em;
+}
+
+.oo-ui-optionWidget-level-0 {
+  padding-left: 3.5em;
+}
+
+.oo-ui-optionWidget-level-0 .oo-ui-iconedElement-icon {
+  left: 1em;
+}
+
+.oo-ui-optionWidget-level-1 {
+  padding-left: 5em;
+}
+
+.oo-ui-optionWidget-level-1 .oo-ui-iconedElement-icon {
+  left: 2.5em;
+}
+
+.oo-ui-optionWidget-level-2 {
+  padding-left: 6.5em;
+}
+
+.oo-ui-optionWidget-level-2 .oo-ui-iconedElement-icon {
+  left: 4em;
+}
+
+.oo-ui-buttonOptionWidget {
+  padding: 0;
+}
+
+.oo-ui-menuItemWidget.oo-ui-optionWidget-selected {
+  color: #ffffff;
+  background: #347bff;
+}
+
+.oo-ui-menuSectionItemWidget {
+  font-weight: normal;
+  color: #777777;
+  border: none;
+}
+
+.oo-ui-textInputWidget input,
+.oo-ui-textInputWidget textarea {
+  padding: .8em 1em;
+}
\ No newline at end of file
diff --git a/resources/lib/oojs-ui/oojs-ui-apex.css b/resources/lib/oojs-ui/oojs-ui-apex.css
new file mode 100644 (file)
index 0000000..64a8e38
--- /dev/null
@@ -0,0 +1,793 @@
+.oo-ui-dialog {
+  background-color: #fff;
+  background-color: rgba(255, 255, 255, 0.5);
+  opacity: 0;
+  -webkit-transition: all 250ms ease-in-out;
+     -moz-transition: all 250ms ease-in-out;
+      -ms-transition: all 250ms ease-in-out;
+       -o-transition: all 250ms ease-in-out;
+          transition: all 250ms ease-in-out;
+}
+
+.oo-ui-dialog .oo-ui-window-frame {
+  background-color: #fff;
+  border: solid 1px #ccc;
+  border-radius: 0.5em;
+  -webkit-transform: scale(0.5);
+     -moz-transform: scale(0.5);
+      -ms-transform: scale(0.5);
+       -o-transform: scale(0.5);
+          transform: scale(0.5);
+  box-shadow: 0 0.2em 1em rgba(0, 0, 0, 0.3);
+  -webkit-transition: all 250ms ease-in-out;
+     -moz-transition: all 250ms ease-in-out;
+      -ms-transition: all 250ms ease-in-out;
+       -o-transition: all 250ms ease-in-out;
+          transition: all 250ms ease-in-out;
+}
+
+.oo-ui-dialog-open {
+  opacity: 1;
+}
+
+.oo-ui-dialog-open .oo-ui-window-frame {
+  -webkit-transform: scale(1);
+     -moz-transform: scale(1);
+      -ms-transform: scale(1);
+       -o-transform: scale(1);
+          transform: scale(1);
+}
+
+.oo-ui-dialog-content .oo-ui-window-body {
+  box-shadow: 0 0 0.66em rgba(0, 0, 0, 0.25);
+}
+
+.oo-ui-frame-content {
+  font-family: sans-serif;
+  font-size: 0.8em;
+}
+
+.oo-ui-toolbar-bar {
+  background: #f8fbfd;
+  background-image: -webkit-gradient(linear, right top, right bottom, color-stop(0%, #ffffff), color-stop(100%, #f1f7fb));
+  background-image: -webkit-linear-gradient(top, #ffffff 0%, #f1f7fb 100%);
+  background-image: -moz-linear-gradient(top, #ffffff 0%, #f1f7fb 100%);
+  background-image: -ms-linear-gradient(top, #ffffff 0%, #f1f7fb 100%);
+  background-image: -o-linear-gradient(top, #ffffff 0%, #f1f7fb 100%);
+  background-image: linear-gradient(top, #ffffff 0%, #f1f7fb 100%);
+  border-bottom: solid 1px #ccc;
+  filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#ffffff', endColorstr='#f1f7fb');
+}
+
+.oo-ui-toolbar-bar .oo-ui-toolbar-bar {
+  background: none;
+  border: none;
+}
+
+.oo-ui-toolbar-shadow {
+  bottom: -9px;
+  height: 9px;
+  background-image: /* @embed */ url(images/toolbar-shadow.png);
+  opacity: 0.125;
+  -webkit-transition: opacity 500ms ease-in-out;
+     -moz-transition: opacity 500ms ease-in-out;
+      -ms-transition: opacity 500ms ease-in-out;
+       -o-transition: opacity 500ms ease-in-out;
+          transition: opacity 500ms ease-in-out;
+}
+
+.oo-ui-toolGroup {
+  border: solid 1px transparent;
+  border-radius: 0.25em;
+  -webkit-transition: border-color 300ms ease-in-out;
+     -moz-transition: border-color 300ms ease-in-out;
+      -ms-transition: border-color 300ms ease-in-out;
+       -o-transition: border-color 300ms ease-in-out;
+          transition: border-color 300ms ease-in-out;
+}
+
+.oo-ui-toolGroup.oo-ui-widget-enabled:hover {
+  border-color: rgba(0, 0, 0, 0.1);
+}
+
+.oo-ui-toolGroup.oo-ui-widget-enabled .oo-ui-tool-link .oo-ui-tool-title {
+  color: #000;
+}
+
+.oo-ui-window-body {
+  padding: 0 0.75em;
+}
+
+.oo-ui-window-icon {
+  width: 2em;
+  height: 2em;
+  margin-right: 0.5em;
+  line-height: 2em;
+}
+
+.oo-ui-window-title {
+  line-height: 2em;
+  color: #333;
+}
+
+.oo-ui-window-overlay {
+  font-family: sans-serif;
+  font-size: 1em;
+  line-height: 1.5em;
+}
+
+.oo-ui-buttonedElement .oo-ui-buttonedElement-button {
+  color: #333;
+}
+
+.oo-ui-buttonedElement.oo-ui-indicatedElement .oo-ui-buttonedElement-button > .oo-ui-indicatedElement-indicator,
+.oo-ui-buttonedElement.oo-ui-iconedElement .oo-ui-buttonedElement-button > .oo-ui-iconedElement-icon {
+  width: 1.9em;
+  height: 1.9em;
+  opacity: 0.8;
+}
+
+.oo-ui-buttonedElement-frameless .oo-ui-buttonedElement-button > .oo-ui-iconedElement-icon {
+  /* Don't animate opacities for now, causes wiggling in Chrome (bug 63020) */
+
+  /*.oo-ui-transition(opacity 200ms);*/
+
+}
+
+.oo-ui-buttonedElement-frameless .oo-ui-buttonedElement-button:hover > .oo-ui-iconedElement-icon,
+.oo-ui-buttonedElement-frameless .oo-ui-buttonedElement-button:focus > .oo-ui-iconedElement-icon {
+  opacity: 1;
+}
+
+.oo-ui-buttonedElement-frameless .oo-ui-buttonedElement-button:hover > .oo-ui-labeledElement-label,
+.oo-ui-buttonedElement-frameless .oo-ui-buttonedElement-button:focus > .oo-ui-labeledElement-label {
+  color: #000;
+}
+
+.oo-ui-buttonedElement-frameless .oo-ui-buttonedElement-button > .oo-ui-labeledElement-label {
+  color: #333;
+}
+
+.oo-ui-buttonedElement-frameless.oo-ui-widget-disabled .oo-ui-buttonedElement-button > .oo-ui-iconedElement-icon {
+  opacity: 0.2;
+}
+
+.oo-ui-buttonedElement-frameless.oo-ui-widget-disabled .oo-ui-buttonedElement-button > .oo-ui-labeledElement-label {
+  color: #ccc;
+}
+
+.oo-ui-buttonedElement-framed .oo-ui-buttonedElement-button {
+  text-shadow: 0 1px 1px rgba(255, 255, 255, 0.5);
+  background: #eeeeee;
+  background-image: -webkit-gradient(linear, right top, right bottom, color-stop(0%, #ffffff), color-stop(100%, #dddddd));
+  background-image: -webkit-linear-gradient(top, #ffffff 0%, #dddddd 100%);
+  background-image: -moz-linear-gradient(top, #ffffff 0%, #dddddd 100%);
+  background-image: -ms-linear-gradient(top, #ffffff 0%, #dddddd 100%);
+  background-image: -o-linear-gradient(top, #ffffff 0%, #dddddd 100%);
+  background-image: linear-gradient(top, #ffffff 0%, #dddddd 100%);
+  border: 1px #c9c9c9 solid;
+  border-radius: 0.3em;
+  filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#ffffff', endColorstr='#dddddd');
+  -webkit-transition: border-color 100ms ease-in-out;
+     -moz-transition: border-color 100ms ease-in-out;
+      -ms-transition: border-color 100ms ease-in-out;
+       -o-transition: border-color 100ms ease-in-out;
+          transition: border-color 100ms ease-in-out;
+}
+
+.oo-ui-buttonedElement-framed .oo-ui-buttonedElement-button:hover,
+.oo-ui-buttonedElement-framed .oo-ui-buttonedElement-button:focus {
+  border-color: #aaa;
+}
+
+.oo-ui-buttonedElement-framed .oo-ui-buttonedElement-button.oo-ui-buttonedElement-active,
+.oo-ui-buttonedElement-framed .oo-ui-buttonedElement-button.oo-ui-buttonedElement-pressed {
+  color: black;
+  background: #eeeeee;
+  background-image: -webkit-gradient(linear, right top, right bottom, color-stop(0%, #dddddd), color-stop(100%, #ffffff));
+  background-image: -webkit-linear-gradient(top, #dddddd 0%, #ffffff 100%);
+  background-image: -moz-linear-gradient(top, #dddddd 0%, #ffffff 100%);
+  background-image: -ms-linear-gradient(top, #dddddd 0%, #ffffff 100%);
+  background-image: -o-linear-gradient(top, #dddddd 0%, #ffffff 100%);
+  background-image: linear-gradient(top, #dddddd 0%, #ffffff 100%);
+  border-color: #c9c9c9;
+  filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#dddddd', endColorstr='#ffffff');
+  box-shadow: inset 0 1px 4px 0 rgba(0, 0, 0, 0.07);
+}
+
+.oo-ui-buttonedElement-framed.oo-ui-flaggableElement-primary .oo-ui-buttonedElement-button {
+  background: #cde7f4;
+  background-image: -webkit-gradient(linear, right top, right bottom, color-stop(0%, #eaf4fa), color-stop(100%, #b0d9ee));
+  background-image: -webkit-linear-gradient(top, #eaf4fa 0%, #b0d9ee 100%);
+  background-image: -moz-linear-gradient(top, #eaf4fa 0%, #b0d9ee 100%);
+  background-image: -ms-linear-gradient(top, #eaf4fa 0%, #b0d9ee 100%);
+  background-image: -o-linear-gradient(top, #eaf4fa 0%, #b0d9ee 100%);
+  background-image: linear-gradient(top, #eaf4fa 0%, #b0d9ee 100%);
+  border: solid 1px #a6cee1;
+  filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#eaf4fa', endColorstr='#b0d9ee');
+}
+
+.oo-ui-buttonedElement-framed.oo-ui-flaggableElement-primary .oo-ui-buttonedElement-button:hover,
+.oo-ui-buttonedElement-framed.oo-ui-flaggableElement-primary .oo-ui-buttonedElement-button:focus {
+  border-color: #9dc2d4;
+}
+
+.oo-ui-buttonedElement-framed.oo-ui-flaggableElement-primary .oo-ui-buttonedElement-button.oo-ui-buttonedElement-active,
+.oo-ui-buttonedElement-framed.oo-ui-flaggableElement-primary .oo-ui-buttonedElement-button.oo-ui-buttonedElement-pressed {
+  background: #cde7f4;
+  background-image: -webkit-gradient(linear, right top, right bottom, color-stop(0%, #b0d9ee), color-stop(100%, #eaf4fa));
+  background-image: -webkit-linear-gradient(top, #b0d9ee 0%, #eaf4fa 100%);
+  background-image: -moz-linear-gradient(top, #b0d9ee 0%, #eaf4fa 100%);
+  background-image: -ms-linear-gradient(top, #b0d9ee 0%, #eaf4fa 100%);
+  background-image: -o-linear-gradient(top, #b0d9ee 0%, #eaf4fa 100%);
+  background-image: linear-gradient(top, #b0d9ee 0%, #eaf4fa 100%);
+  border: solid 1px #a6cee1;
+  filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#b0d9ee', endColorstr='#eaf4fa');
+}
+
+.oo-ui-buttonedElement-framed.oo-ui-flaggableElement-constructive .oo-ui-buttonedElement-button {
+  background: #daf0be;
+  background-image: -webkit-gradient(linear, right top, right bottom, color-stop(0%, #f0fbe1), color-stop(100%, #c3e59a));
+  background-image: -webkit-linear-gradient(top, #f0fbe1 0%, #c3e59a 100%);
+  background-image: -moz-linear-gradient(top, #f0fbe1 0%, #c3e59a 100%);
+  background-image: -ms-linear-gradient(top, #f0fbe1 0%, #c3e59a 100%);
+  background-image: -o-linear-gradient(top, #f0fbe1 0%, #c3e59a 100%);
+  background-image: linear-gradient(top, #f0fbe1 0%, #c3e59a 100%);
+  border: solid 1px #b8d892;
+  filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#f0fbe1', endColorstr='#c3e59a');
+}
+
+.oo-ui-buttonedElement-framed.oo-ui-flaggableElement-constructive .oo-ui-buttonedElement-button:hover,
+.oo-ui-buttonedElement-framed.oo-ui-flaggableElement-constructive .oo-ui-buttonedElement-button:focus {
+  border-color: #adcb89;
+}
+
+.oo-ui-buttonedElement-framed.oo-ui-flaggableElement-constructive .oo-ui-buttonedElement-button.oo-ui-buttonedElement-active,
+.oo-ui-buttonedElement-framed.oo-ui-flaggableElement-constructive .oo-ui-buttonedElement-button.oo-ui-buttonedElement-pressed {
+  background: #daf0be;
+  background-image: -webkit-gradient(linear, right top, right bottom, color-stop(0%, #c3e59a), color-stop(100%, #f0fbe1));
+  background-image: -webkit-linear-gradient(top, #c3e59a 0%, #f0fbe1 100%);
+  background-image: -moz-linear-gradient(top, #c3e59a 0%, #f0fbe1 100%);
+  background-image: -ms-linear-gradient(top, #c3e59a 0%, #f0fbe1 100%);
+  background-image: -o-linear-gradient(top, #c3e59a 0%, #f0fbe1 100%);
+  background-image: linear-gradient(top, #c3e59a 0%, #f0fbe1 100%);
+  border: solid 1px #b8d892;
+  filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#c3e59a', endColorstr='#f0fbe1');
+}
+
+.oo-ui-buttonedElement-framed.oo-ui-flaggableElement-destructive .oo-ui-buttonedElement-button {
+  color: #d45353;
+}
+
+.oo-ui-buttonedElement-framed.oo-ui-widget-disabled .oo-ui-buttonedElement-button,
+.oo-ui-buttonedElement-framed.oo-ui-widget-disabled .oo-ui-buttonedElement-button.oo-ui-buttonedElement-active,
+.oo-ui-buttonedElement-framed.oo-ui-widget-disabled .oo-ui-buttonedElement-button.oo-ui-buttonedElement-pressed {
+  color: #333;
+  background: #eee;
+  border-color: #ccc;
+  opacity: 0.5;
+  box-shadow: none;
+}
+
+.oo-ui-buttonedElement-framed.oo-ui-widget-disabled .oo-ui-buttonedElement-button:hover,
+.oo-ui-buttonedElement-framed.oo-ui-widget-disabled .oo-ui-buttonedElement-button.oo-ui-buttonedElement-active:hover,
+.oo-ui-buttonedElement-framed.oo-ui-widget-disabled .oo-ui-buttonedElement-button.oo-ui-buttonedElement-pressed:hover,
+.oo-ui-buttonedElement-framed.oo-ui-widget-disabled .oo-ui-buttonedElement-button:focus,
+.oo-ui-buttonedElement-framed.oo-ui-widget-disabled .oo-ui-buttonedElement-button.oo-ui-buttonedElement-active:focus,
+.oo-ui-buttonedElement-framed.oo-ui-widget-disabled .oo-ui-buttonedElement-button.oo-ui-buttonedElement-pressed:focus {
+  border-color: #ccc;
+  box-shadow: none;
+}
+
+.oo-ui-bookletLayout > .oo-ui-gridLayout > .oo-ui-panelLayout {
+  -webkit-transition: width 250ms ease-in-out, height 250ms ease-in-out, top 250ms ease-in-out, left 250ms ease-in-out;
+     -moz-transition: width 250ms ease-in-out, height 250ms ease-in-out, top 250ms ease-in-out, left 250ms ease-in-out;
+      -ms-transition: width 250ms ease-in-out, height 250ms ease-in-out, top 250ms ease-in-out, left 250ms ease-in-out;
+       -o-transition: width 250ms ease-in-out, height 250ms ease-in-out, top 250ms ease-in-out, left 250ms ease-in-out;
+          transition: width 250ms ease-in-out, height 250ms ease-in-out, top 250ms ease-in-out, left 250ms ease-in-out;
+}
+
+.oo-ui-bookletLayout-outlinePanel {
+  border-right: solid 1px #ddd;
+}
+
+.oo-ui-bookletLayout-outlinePanel .oo-ui-outlineControlsWidget {
+  box-shadow: 0 0 0.25em rgba(0, 0, 0, 0.25);
+}
+
+.oo-ui-fieldLayout-disabled .oo-ui-labeledElement-label {
+  color: #ccc;
+}
+
+.oo-ui-fieldsetLayout {
+  border: none;
+}
+
+.oo-ui-fieldsetLayout > legend.oo-ui-labeledElement-label {
+  font-size: 1.5em;
+}
+
+.oo-ui-barToolGroup .oo-ui-tool {
+  margin: -1px 0 -1px -1px;
+  border: solid 1px transparent;
+}
+
+.oo-ui-barToolGroup .oo-ui-tool:first-child {
+  border-bottom-left-radius: 0.25em;
+  border-top-left-radius: 0.25em;
+}
+
+.oo-ui-barToolGroup .oo-ui-tool:last-child {
+  margin-right: -1px;
+  border-top-right-radius: 0.25em;
+  border-bottom-right-radius: 0.25em;
+}
+
+.oo-ui-barToolGroup .oo-ui-tool-link .oo-ui-iconedElement-icon {
+  opacity: 0.8;
+}
+
+.oo-ui-barToolGroup.oo-ui-widget-enabled .oo-ui-tool.oo-ui-widget-enabled:hover {
+  border-color: rgba(0, 0, 0, 0.2);
+}
+
+.oo-ui-barToolGroup.oo-ui-widget-enabled .oo-ui-tool-active.oo-ui-widget-enabled {
+  background: #f8fbfd;
+  background-image: -webkit-gradient(linear, right top, right bottom, color-stop(0%, #f1f7fb), color-stop(100%, #ffffff));
+  background-image: -webkit-linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
+  background-image: -moz-linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
+  background-image: -ms-linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
+  background-image: -o-linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
+  background-image: linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
+  border-color: rgba(0, 0, 0, 0.2);
+  filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#f1f7fb', endColorstr='#ffffff');
+  box-shadow: inset 0 0.07em 0.07em 0 rgba(0, 0, 0, 0.07);
+}
+
+.oo-ui-barToolGroup.oo-ui-widget-enabled .oo-ui-tool-active.oo-ui-widget-enabled + .oo-ui-tool-active.oo-ui-widget-enabled {
+  border-left-color: rgba(0, 0, 0, 0.1);
+}
+
+.oo-ui-barToolGroup.oo-ui-widget-enabled .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link .oo-ui-iconedElement-icon {
+  opacity: 0.2;
+}
+
+.oo-ui-barToolGroup.oo-ui-widget-enabled .oo-ui-tool.oo-ui-widget-enabled .oo-ui-tool-link .oo-ui-iconedElement-icon {
+  opacity: 0.8;
+}
+
+.oo-ui-barToolGroup.oo-ui-widget-enabled .oo-ui-tool.oo-ui-widget-enabled:hover .oo-ui-tool-link .oo-ui-iconedElement-icon {
+  opacity: 1;
+}
+
+.oo-ui-barToolGroup.oo-ui-widget-disabled .oo-ui-tool-link .oo-ui-iconedElement-icon {
+  opacity: 0.2;
+}
+
+.oo-ui-listToolGroup.oo-ui-popupToolGroup-active {
+  border-color: rgba(0, 0, 0, 0.2);
+}
+
+.oo-ui-listToolGroup .oo-ui-tool {
+  margin: -1px 0;
+  border: solid 1px transparent;
+}
+
+.oo-ui-listToolGroup .oo-ui-tool-active.oo-ui-widget-enabled {
+  background: #f8fbfd;
+  background-image: -webkit-gradient(linear, right top, right bottom, color-stop(0%, #f1f7fb), color-stop(100%, #ffffff));
+  background-image: -webkit-linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
+  background-image: -moz-linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
+  background-image: -ms-linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
+  background-image: -o-linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
+  background-image: linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
+  border-color: rgba(0, 0, 0, 0.1);
+  filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#f1f7fb', endColorstr='#ffffff');
+  box-shadow: inset 0 0.07em 0.07em 0 rgba(0, 0, 0, 0.07);
+}
+
+.oo-ui-listToolGroup .oo-ui-tool-active.oo-ui-widget-enabled + .oo-ui-tool-active.oo-ui-widget-enabled {
+  border-top-color: rgba(0, 0, 0, 0.1);
+}
+
+.oo-ui-listToolGroup .oo-ui-tool-active.oo-ui-widget-enabled:hover {
+  border-color: rgba(0, 0, 0, 0.2);
+}
+
+.oo-ui-listToolGroup .oo-ui-tool.oo-ui-widget-enabled:hover {
+  border-color: rgba(0, 0, 0, 0.2);
+}
+
+.oo-ui-listToolGroup .oo-ui-tool.oo-ui-widget-enabled .oo-ui-tool-link .oo-ui-iconedElement-icon {
+  opacity: 0.8;
+}
+
+.oo-ui-listToolGroup .oo-ui-tool.oo-ui-widget-enabled:hover .oo-ui-tool-link .oo-ui-iconedElement-icon {
+  opacity: 1;
+}
+
+.oo-ui-listToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link .oo-ui-tool-title {
+  color: #ccc;
+}
+
+.oo-ui-listToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link .oo-ui-iconedElement-icon {
+  opacity: 0.2;
+}
+
+.oo-ui-listToolGroup.oo-ui-widget-disabled {
+  color: #ccc;
+}
+
+.oo-ui-listToolGroup.oo-ui-widget-disabled .oo-ui-indicatedElement-indicator,
+.oo-ui-listToolGroup.oo-ui-widget-disabled .oo-ui-iconedElement-icon {
+  opacity: 0.2;
+}
+
+.oo-ui-menuToolGroup {
+  border-color: rgba(0, 0, 0, 0.1);
+}
+
+.oo-ui-menuToolGroup.oo-ui-widget-enabled:hover {
+  border-color: rgba(0, 0, 0, 0.2);
+}
+
+.oo-ui-menuToolGroup.oo-ui-popupToolGroup-active {
+  border-color: rgba(0, 0, 0, 0.25);
+}
+
+.oo-ui-menuToolGroup .oo-ui-tool.oo-ui-widget-enabled:hover {
+  background-color: #e1f3ff;
+}
+
+.oo-ui-menuToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link .oo-ui-tool-title {
+  color: #ccc;
+}
+
+.oo-ui-menuToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link .oo-ui-iconedElement-icon {
+  opacity: 0.2;
+}
+
+.oo-ui-menuToolGroup.oo-ui-widget-disabled {
+  color: #ccc;
+  border-color: rgba(0, 0, 0, 0.05);
+}
+
+.oo-ui-menuToolGroup.oo-ui-widget-disabled .oo-ui-indicatedElement-indicator,
+.oo-ui-menuToolGroup.oo-ui-widget-disabled .oo-ui-iconedElement-icon {
+  opacity: 0.2;
+}
+
+.oo-ui-popupToolGroup-handle .oo-ui-indicatedElement-indicator,
+.oo-ui-popupToolGroup-handle .oo-ui-iconedElement-icon {
+  opacity: 0.8;
+}
+
+.oo-ui-popupToolGroup .oo-ui-toolGroup-tools {
+  background-color: white;
+  border: solid 1px #ccc;
+  box-shadow: 0 0.25em 1em rgba(0, 0, 0, 0.25);
+}
+
+.oo-ui-popupToolGroup-active.oo-ui-widget-enabled {
+  background: #f8fbfd;
+  background-image: -webkit-gradient(linear, right top, right bottom, color-stop(0%, #f1f7fb), color-stop(100%, #ffffff));
+  background-image: -webkit-linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
+  background-image: -moz-linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
+  background-image: -ms-linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
+  background-image: -o-linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
+  background-image: linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
+  border-bottom-right-radius: 0;
+  border-bottom-left-radius: 0;
+  filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#f1f7fb', endColorstr='#ffffff');
+  box-shadow: inset 0 0.07em 0.07em 0 rgba(0, 0, 0, 0.07);
+}
+
+.oo-ui-optionWidget {
+  padding: 0.5em 2em 0.5em 3em;
+}
+
+.oo-ui-optionWidget-highlighted {
+  background-color: #e1f3ff;
+}
+
+.oo-ui-selectWidget-depressed .oo-ui-optionWidget-selected {
+  background-color: #a7dcff;
+}
+
+.oo-ui-selectWidget-pressed .oo-ui-optionWidget-pressed {
+  background-color: #a7dcff;
+}
+
+.oo-ui-optionWidget.oo-ui-widget-disabled {
+  color: #ccc;
+}
+
+.oo-ui-menuWidget {
+  margin-top: -1px;
+  background: #fff;
+  border: solid 1px #ccc;
+  border-radius: 0 0 0.25em 0.25em;
+  box-shadow: 0 0.15em 1em 0 rgba(0, 0, 0, 0.2);
+}
+
+.oo-ui-popupWidget-popup {
+  background-color: #fff;
+  border: solid 1px #ccc;
+  border-radius: 0.25em;
+  box-shadow: 0 0.15em 0.5em 0 rgba(0, 0, 0, 0.2);
+}
+
+.oo-ui-popupWidget-tailed .oo-ui-popupWidget-tail {
+  width: 15px;
+  height: 8px;
+  margin-left: -7px;
+  background-image: /* @embed */ url(images/tail.svg);
+}
+
+.oo-ui-popupWidget-transitioning .oo-ui-popupWidget-popup {
+  -webkit-transition: width 100ms ease-in-out, height 100ms ease-in-out, left 100ms ease-in-out;
+     -moz-transition: width 100ms ease-in-out, height 100ms ease-in-out, left 100ms ease-in-out;
+      -ms-transition: width 100ms ease-in-out, height 100ms ease-in-out, left 100ms ease-in-out;
+       -o-transition: width 100ms ease-in-out, height 100ms ease-in-out, left 100ms ease-in-out;
+          transition: width 100ms ease-in-out, height 100ms ease-in-out, left 100ms ease-in-out;
+}
+
+.oo-ui-popupWidget-body {
+  box-shadow: 0 0 0.66em rgba(0, 0, 0, 0.25);
+}
+
+.oo-ui-buttonGroupWidget {
+  display: inline-block;
+  white-space: nowrap;
+}
+
+.oo-ui-buttonOptionWidget {
+  padding: 0;
+}
+
+.oo-ui-buttonOptionWidget.oo-ui-optionWidget-selected,
+.oo-ui-buttonOptionWidget.oo-ui-optionWidget-pressed,
+.oo-ui-buttonOptionWidget.oo-ui-optionWidget-highlighted {
+  background-color: transparent;
+}
+
+.oo-ui-buttonSelectWidget {
+  border-radius: 0.3em;
+}
+
+.oo-ui-buttonSelectWidget .oo-ui-buttonOptionWidget .oo-ui-buttonedElement-button {
+  margin-left: -1px;
+  border-radius: 0;
+}
+
+.oo-ui-buttonSelectWidget .oo-ui-buttonOptionWidget:first-child .oo-ui-buttonedElement-button {
+  margin-left: 0;
+  border-bottom-left-radius: 0.3em;
+  border-top-left-radius: 0.3em;
+}
+
+.oo-ui-buttonSelectWidget .oo-ui-buttonOptionWidget:last-child .oo-ui-buttonedElement-button {
+  border-top-right-radius: 0.3em;
+  border-bottom-right-radius: 0.3em;
+}
+
+.oo-ui-inlineMenuWidget-handle {
+  border: solid 1px rgba(0, 0, 0, 0.1);
+  border-radius: 0.25em;
+}
+
+.oo-ui-inlineMenuWidget-handle:hover {
+  border-color: rgba(0, 0, 0, 0.2);
+}
+
+.oo-ui-inlineMenuWidget-handle .oo-ui-indicatedElement-indicator,
+.oo-ui-inlineMenuWidget-handle .oo-ui-iconedElement-icon {
+  opacity: 0.8;
+}
+
+.oo-ui-inlineMenuWidget.oo-ui-widget-disabled .oo-ui-inlineMenuWidget-handle {
+  color: #ccc;
+  text-shadow: 0 1px 1px #fff;
+  background-color: #f3f3f3;
+  border-color: #ddd;
+}
+
+.oo-ui-inlineMenuWidget.oo-ui-widget-disabled .oo-ui-indicatedElement-indicator {
+  opacity: 0.2;
+}
+
+.oo-ui-menuItemWidget.oo-ui-optionWidget-selected {
+  background-color: transparent;
+}
+
+.oo-ui-menuItemWidget.oo-ui-optionWidget-highlighted,
+.oo-ui-menuItemWidget.oo-ui-optionWidget-highlighted.oo-ui-optionWidget-selected {
+  background-color: #e1f3ff;
+}
+
+.oo-ui-menuSectionItemWidget {
+  padding: 0.33em 0.75em;
+  color: #888;
+}
+
+.oo-ui-outlineControlsWidget {
+  background-color: #fff;
+}
+
+.oo-ui-outlineControlsWidget > .oo-ui-iconedElement-icon {
+  opacity: 0.2;
+}
+
+.oo-ui-outlineItemWidget {
+  font-size: 1.1em;
+}
+
+.oo-ui-outlineItemWidget.oo-ui-indicatedElement .oo-ui-labeledElement-label {
+  padding-right: 1.5em;
+}
+
+.oo-ui-outlineItemWidget-level-0 {
+  padding-left: 3.5em;
+}
+
+.oo-ui-outlineItemWidget-level-0 .oo-ui-iconedElement-icon {
+  left: 1em;
+}
+
+.oo-ui-outlineItemWidget-level-1 {
+  padding-left: 5em;
+}
+
+.oo-ui-outlineItemWidget-level-1 .oo-ui-iconedElement-icon {
+  left: 2.5em;
+}
+
+.oo-ui-outlineItemWidget-level-2 {
+  padding-left: 6.5em;
+}
+
+.oo-ui-outlineItemWidget-level-2 .oo-ui-iconedElement-icon {
+  left: 4em;
+}
+
+.oo-ui-selectWidget-depressed .oo-ui-outlineItemWidget.oo-ui-optionWidget-selected {
+  text-shadow: 0 1px 1px rgba(255, 255, 255, 0.5);
+  background-color: #a7dcff;
+}
+
+.oo-ui-outlineItemWidget.oo-ui-flaggableElement-important {
+  font-weight: bold;
+}
+
+.oo-ui-outlineItemWidget.oo-ui-flaggableElement-placeholder {
+  font-style: italic;
+}
+
+.oo-ui-outlineItemWidget.oo-ui-flaggableElement-empty .oo-ui-iconedElement-icon,
+.oo-ui-outlineItemWidget.oo-ui-flaggableElement-empty .oo-ui-indicatedElement-indicator {
+  opacity: 0.5;
+}
+
+.oo-ui-outlineItemWidget.oo-ui-flaggableElement-empty .oo-ui-labeledElement-label {
+  color: #777;
+}
+
+.oo-ui-searchWidget-query {
+  box-shadow: 0 0 0.5em rgba(0, 0, 0, 0.2);
+}
+
+.oo-ui-textInputWidget {
+  width: 20em;
+}
+
+.oo-ui-textInputWidget input,
+.oo-ui-textInputWidget textarea {
+  padding: 0.5em;
+  font-family: sans-serif;
+  font-size: 1em;
+  background-color: #fff;
+  border: solid 1px #ccc;
+  border-radius: 0.25em;
+  box-shadow: 0 0 0 white, inset 0 0.1em 0.2em #ddd;
+  -webkit-transition: border-color 200ms, box-shadow 200ms;
+     -moz-transition: border-color 200ms, box-shadow 200ms;
+      -ms-transition: border-color 200ms, box-shadow 200ms;
+       -o-transition: border-color 200ms, box-shadow 200ms;
+          transition: border-color 200ms, box-shadow 200ms;
+}
+
+.oo-ui-textInputWidget-decorated input,
+.oo-ui-textInputWidget-decorated textarea {
+  padding-left: 2em;
+}
+
+.oo-ui-textInputWidget-icon {
+  width: 2em;
+}
+
+.oo-ui-textInputWidget.oo-ui-widget-enabled input:focus,
+.oo-ui-textInputWidget.oo-ui-widget-enabled textarea:focus {
+  border-color: #a7dcff;
+  outline: none;
+  box-shadow: 0 0 0.3em #a7dcff, 0 0 0 white;
+}
+
+.oo-ui-textInputWidget input[readonly],
+.oo-ui-textInputWidget textarea[readonly] {
+  color: #777;
+  text-shadow: 0 1px 1px #fff;
+}
+
+.oo-ui-textInputWidget-pending input,
+.oo-ui-textInputWidget-pending textarea {
+  background-color: transparent;
+}
+
+.oo-ui-textInputWidget.oo-ui-widget-disabled input,
+.oo-ui-textInputWidget.oo-ui-widget-disabled input:focus,
+.oo-ui-textInputWidget.oo-ui-widget-disabled textarea,
+.oo-ui-textInputWidget.oo-ui-widget-disabled textarea:focus {
+  color: #ccc;
+  text-shadow: 0 1px 1px #fff;
+  background-color: #f3f3f3;
+  border-color: #ddd;
+}
+
+.oo-ui-toggleSwitchWidget {
+  background: #eeeeee;
+  background-image: -webkit-gradient(linear, right top, right bottom, color-stop(0%, #dddddd), color-stop(100%, #ffffff));
+  background-image: -webkit-linear-gradient(top, #dddddd 0%, #ffffff 100%);
+  background-image: -moz-linear-gradient(top, #dddddd 0%, #ffffff 100%);
+  background-image: -ms-linear-gradient(top, #dddddd 0%, #ffffff 100%);
+  background-image: -o-linear-gradient(top, #dddddd 0%, #ffffff 100%);
+  background-image: linear-gradient(top, #dddddd 0%, #ffffff 100%);
+  border: solid 1px #ccc;
+  border-radius: 1em;
+  filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#dddddd', endColorstr='#ffffff');
+  box-shadow: 0 0 0 white, inset 0 0.1em 0.2em #ddd;
+}
+
+.oo-ui-toggleSwitchWidget.oo-ui-widget-disabled {
+  opacity: 0.5;
+}
+
+.oo-ui-toggleSwitchWidget-grip {
+  background: #eeeeee;
+  background-image: -webkit-gradient(linear, right top, right bottom, color-stop(0%, #ffffff), color-stop(100%, #dddddd));
+  background-image: -webkit-linear-gradient(top, #ffffff 0%, #dddddd 100%);
+  background-image: -moz-linear-gradient(top, #ffffff 0%, #dddddd 100%);
+  background-image: -ms-linear-gradient(top, #ffffff 0%, #dddddd 100%);
+  background-image: -o-linear-gradient(top, #ffffff 0%, #dddddd 100%);
+  background-image: linear-gradient(top, #ffffff 0%, #dddddd 100%);
+  border: 1px #c9c9c9 solid;
+  border-radius: 1em;
+  filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#ffffff', endColorstr='#dddddd');
+  box-shadow: 0 0.1em 0.25em rgba(0, 0, 0, 0.1);
+}
+
+.oo-ui-toggleSwitchWidget.oo-ui-widget-enabled:hover,
+.oo-ui-toggleSwitchWidget.oo-ui-widget-enabled:hover .oo-ui-toggleSwitchWidget-grip {
+  border-color: #aaa;
+}
+
+.oo-ui-toggleSwitchWidget .oo-ui-toggleSwitchWidget-glow {
+  background: #cde7f4;
+  background-image: -webkit-gradient(linear, right top, right bottom, color-stop(0%, #b0d9ee), color-stop(100%, #eaf4fa));
+  background-image: -webkit-linear-gradient(top, #b0d9ee 0%, #eaf4fa 100%);
+  background-image: -moz-linear-gradient(top, #b0d9ee 0%, #eaf4fa 100%);
+  background-image: -ms-linear-gradient(top, #b0d9ee 0%, #eaf4fa 100%);
+  background-image: -o-linear-gradient(top, #b0d9ee 0%, #eaf4fa 100%);
+  background-image: linear-gradient(top, #b0d9ee 0%, #eaf4fa 100%);
+  border-radius: 1em;
+  filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#b0d9ee', endColorstr='#eaf4fa');
+  box-shadow: inset 0 1px 4px 0 rgba(0, 0, 0, 0.07);
+}
+
+.oo-ui-toggleWidget-on .oo-ui-toggleSwitchWidget-glow {
+  opacity: 1;
+}
+
+.oo-ui-toggleWidget-off .oo-ui-toggleSwitchWidget-glow {
+  display: block;
+  opacity: 0;
+}
\ No newline at end of file
diff --git a/resources/lib/oojs-ui/oojs-ui.js b/resources/lib/oojs-ui/oojs-ui.js
new file mode 100644 (file)
index 0000000..3878a65
--- /dev/null
@@ -0,0 +1,8109 @@
+/*!
+ * OOjs UI v0.1.0-pre (8197f2cd2e)
+ * https://www.mediawiki.org/wiki/OOjs_UI
+ *
+ * Copyright 2011–2014 OOjs Team and other contributors.
+ * Released under the MIT license
+ * http://oojs.mit-license.org
+ *
+ * Date: Tue Apr 15 2014 11:07:39 GMT-0700 (PDT)
+ */
+( function ( OO ) {
+
+'use strict';
+/**
+ * Namespace for all classes, static methods and static properties.
+ *
+ * @class
+ * @singleton
+ */
+OO.ui = {};
+
+OO.ui.bind = $.proxy;
+
+/**
+ * @property {Object}
+ */
+OO.ui.Keys = {
+       'UNDEFINED': 0,
+       'BACKSPACE': 8,
+       'DELETE': 46,
+       'LEFT': 37,
+       'RIGHT': 39,
+       'UP': 38,
+       'DOWN': 40,
+       'ENTER': 13,
+       'END': 35,
+       'HOME': 36,
+       'TAB': 9,
+       'PAGEUP': 33,
+       'PAGEDOWN': 34,
+       'ESCAPE': 27,
+       'SHIFT': 16,
+       'SPACE': 32
+};
+
+/**
+ * Get the user's language and any fallback languages.
+ *
+ * These language codes are used to localize user interface elements in the user's language.
+ *
+ * In environments that provide a localization system, this function should be overridden to
+ * return the user's language(s). The default implementation returns English (en) only.
+ *
+ * @return {string[]} Language codes, in descending order of priority
+ */
+OO.ui.getUserLanguages = function () {
+       return [ 'en' ];
+};
+
+/**
+ * Get a value in an object keyed by language code.
+ *
+ * @param {Object.<string,Mixed>} obj Object keyed by language code
+ * @param {string|null} [lang] Language code, if omitted or null defaults to any user language
+ * @param {string} [fallback] Fallback code, used if no matching language can be found
+ * @return {Mixed} Local value
+ */
+OO.ui.getLocalValue = function ( obj, lang, fallback ) {
+       var i, len, langs;
+
+       // Requested language
+       if ( obj[lang] ) {
+               return obj[lang];
+       }
+       // Known user language
+       langs = OO.ui.getUserLanguages();
+       for ( i = 0, len = langs.length; i < len; i++ ) {
+               lang = langs[i];
+               if ( obj[lang] ) {
+                       return obj[lang];
+               }
+       }
+       // Fallback language
+       if ( obj[fallback] ) {
+               return obj[fallback];
+       }
+       // First existing language
+       for ( lang in obj ) {
+               return obj[lang];
+       }
+
+       return undefined;
+};
+
+( function () {
+
+/**
+ * Message store for the default implementation of OO.ui.msg
+ *
+ * Environments that provide a localization system should not use this, but should override
+ * OO.ui.msg altogether.
+ *
+ * @private
+ */
+var messages = {
+       // Label text for button to exit from dialog
+       'ooui-dialog-action-close': 'Close',
+       // Tool tip for a button that moves items in a list down one place
+       'ooui-outline-control-move-down': 'Move item down',
+       // Tool tip for a button that moves items in a list up one place
+       'ooui-outline-control-move-up': 'Move item up',
+       // Tool tip for a button that removes items from a list
+       'ooui-outline-control-remove': 'Remove item',
+       // Label for the toolbar group that contains a list of all other available tools
+       'ooui-toolbar-more': 'More'
+};
+
+/**
+ * Get a localized message.
+ *
+ * In environments that provide a localization system, this function should be overridden to
+ * return the message translated in the user's language. The default implementation always returns
+ * English messages.
+ *
+ * After the message key, message parameters may optionally be passed. In the default implementation,
+ * any occurrences of $1 are replaced with the first parameter, $2 with the second parameter, etc.
+ * Alternative implementations of OO.ui.msg may use any substitution system they like, as long as
+ * they support unnamed, ordered message parameters.
+ *
+ * @abstract
+ * @param {string} key Message key
+ * @param {Mixed...} [params] Message parameters
+ * @return {string} Translated message with parameters substituted
+ */
+OO.ui.msg = function ( key ) {
+       var message = messages[key], params = Array.prototype.slice.call( arguments, 1 );
+       if ( typeof message === 'string' ) {
+               // Perform $1 substitution
+               message = message.replace( /\$(\d+)/g, function ( unused, n ) {
+                       var i = parseInt( n, 10 );
+                       return params[i - 1] !== undefined ? params[i - 1] : '$' + n;
+               } );
+       } else {
+               // Return placeholder if message not found
+               message = '[' + key + ']';
+       }
+       return message;
+};
+
+/** */
+OO.ui.deferMsg = function ( key ) {
+       return function () {
+               return OO.ui.msg( key );
+       };
+};
+
+/** */
+OO.ui.resolveMsg = function ( msg ) {
+       if ( $.isFunction( msg ) ) {
+               return msg();
+       }
+       return msg;
+};
+
+} )();
+/**
+ * DOM element abstraction.
+ *
+ * @abstract
+ * @class
+ *
+ * @constructor
+ * @param {Object} [config] Configuration options
+ * @cfg {Function} [$] jQuery for the frame the widget is in
+ * @cfg {string[]} [classes] CSS class names
+ * @cfg {jQuery} [$content] Content elements to append
+ */
+OO.ui.Element = function OoUiElement( config ) {
+       // Configuration initialization
+       config = config || {};
+
+       // Properties
+       this.$ = config.$ || OO.ui.Element.getJQuery( document );
+       this.$element = this.$( this.$.context.createElement( this.getTagName() ) );
+       this.elementGroup = null;
+
+       // Initialization
+       if ( $.isArray( config.classes ) ) {
+               this.$element.addClass( config.classes.join( ' ' ) );
+       }
+       if ( config.$content ) {
+               this.$element.append( config.$content );
+       }
+};
+
+/* Setup */
+
+OO.initClass( OO.ui.Element );
+
+/* Static Properties */
+
+/**
+ * HTML tag name.
+ *
+ * This may be ignored if getTagName is overridden.
+ *
+ * @static
+ * @inheritable
+ * @property {string}
+ */
+OO.ui.Element.static.tagName = 'div';
+
+/* Static Methods */
+
+/**
+ * Get a jQuery function within a specific document.
+ *
+ * @static
+ * @param {jQuery|HTMLElement|HTMLDocument|Window} context Context to bind the function to
+ * @param {OO.ui.Frame} [frame] Frame of the document context
+ * @return {Function} Bound jQuery function
+ */
+OO.ui.Element.getJQuery = function ( context, frame ) {
+       function wrapper( selector ) {
+               return $( selector, wrapper.context );
+       }
+
+       wrapper.context = this.getDocument( context );
+
+       if ( frame ) {
+               wrapper.frame = frame;
+       }
+
+       return wrapper;
+};
+
+/**
+ * Get the document of an element.
+ *
+ * @static
+ * @param {jQuery|HTMLElement|HTMLDocument|Window} obj Object to get the document for
+ * @return {HTMLDocument|null} Document object
+ */
+OO.ui.Element.getDocument = function ( obj ) {
+       // jQuery - selections created "offscreen" won't have a context, so .context isn't reliable
+       return ( obj[0] && obj[0].ownerDocument ) ||
+               // Empty jQuery selections might have a context
+               obj.context ||
+               // HTMLElement
+               obj.ownerDocument ||
+               // Window
+               obj.document ||
+               // HTMLDocument
+               ( obj.nodeType === 9 && obj ) ||
+               null;
+};
+
+/**
+ * Get the window of an element or document.
+ *
+ * @static
+ * @param {jQuery|HTMLElement|HTMLDocument|Window} obj Context to get the window for
+ * @return {Window} Window object
+ */
+OO.ui.Element.getWindow = function ( obj ) {
+       var doc = this.getDocument( obj );
+       return doc.parentWindow || doc.defaultView;
+};
+
+/**
+ * Get the direction of an element or document.
+ *
+ * @static
+ * @param {jQuery|HTMLElement|HTMLDocument|Window} obj Context to get the direction for
+ * @return {string} Text direction, either `ltr` or `rtl`
+ */
+OO.ui.Element.getDir = function ( obj ) {
+       var isDoc, isWin;
+
+       if ( obj instanceof jQuery ) {
+               obj = obj[0];
+       }
+       isDoc = obj.nodeType === 9;
+       isWin = obj.document !== undefined;
+       if ( isDoc || isWin ) {
+               if ( isWin ) {
+                       obj = obj.document;
+               }
+               obj = obj.body;
+       }
+       return $( obj ).css( 'direction' );
+};
+
+/**
+ * Get the offset between two frames.
+ *
+ * TODO: Make this function not use recursion.
+ *
+ * @static
+ * @param {Window} from Window of the child frame
+ * @param {Window} [to=window] Window of the parent frame
+ * @param {Object} [offset] Offset to start with, used internally
+ * @return {Object} Offset object, containing left and top properties
+ */
+OO.ui.Element.getFrameOffset = function ( from, to, offset ) {
+       var i, len, frames, frame, rect;
+
+       if ( !to ) {
+               to = window;
+       }
+       if ( !offset ) {
+               offset = { 'top': 0, 'left': 0 };
+       }
+       if ( from.parent === from ) {
+               return offset;
+       }
+
+       // Get iframe element
+       frames = from.parent.document.getElementsByTagName( 'iframe' );
+       for ( i = 0, len = frames.length; i < len; i++ ) {
+               if ( frames[i].contentWindow === from ) {
+                       frame = frames[i];
+                       break;
+               }
+       }
+
+       // Recursively accumulate offset values
+       if ( frame ) {
+               rect = frame.getBoundingClientRect();
+               offset.left += rect.left;
+               offset.top += rect.top;
+               if ( from !== to ) {
+                       this.getFrameOffset( from.parent, offset );
+               }
+       }
+       return offset;
+};
+
+/**
+ * Get the offset between two elements.
+ *
+ * @static
+ * @param {jQuery} $from
+ * @param {jQuery} $to
+ * @return {Object} Translated position coordinates, containing top and left properties
+ */
+OO.ui.Element.getRelativePosition = function ( $from, $to ) {
+       var from = $from.offset(),
+               to = $to.offset();
+       return { 'top': Math.round( from.top - to.top ), 'left': Math.round( from.left - to.left ) };
+};
+
+/**
+ * Get element border sizes.
+ *
+ * @static
+ * @param {HTMLElement} el Element to measure
+ * @return {Object} Dimensions object with `top`, `left`, `bottom` and `right` properties
+ */
+OO.ui.Element.getBorders = function ( el ) {
+       var doc = el.ownerDocument,
+               win = doc.parentWindow || doc.defaultView,
+               style = win && win.getComputedStyle ?
+                       win.getComputedStyle( el, null ) :
+                       el.currentStyle,
+               $el = $( el ),
+               top = parseFloat( style ? style.borderTopWidth : $el.css( 'borderTopWidth' ) ) || 0,
+               left = parseFloat( style ? style.borderLeftWidth : $el.css( 'borderLeftWidth' ) ) || 0,
+               bottom = parseFloat( style ? style.borderBottomWidth : $el.css( 'borderBottomWidth' ) ) || 0,
+               right = parseFloat( style ? style.borderRightWidth : $el.css( 'borderRightWidth' ) ) || 0;
+
+       return {
+               'top': Math.round( top ),
+               'left': Math.round( left ),
+               'bottom': Math.round( bottom ),
+               'right': Math.round( right )
+       };
+};
+
+/**
+ * Get dimensions of an element or window.
+ *
+ * @static
+ * @param {HTMLElement|Window} el Element to measure
+ * @return {Object} Dimensions object with `borders`, `scroll`, `scrollbar` and `rect` properties
+ */
+OO.ui.Element.getDimensions = function ( el ) {
+       var $el, $win,
+               doc = el.ownerDocument || el.document,
+               win = doc.parentWindow || doc.defaultView;
+
+       if ( win === el || el === doc.documentElement ) {
+               $win = $( win );
+               return {
+                       'borders': { 'top': 0, 'left': 0, 'bottom': 0, 'right': 0 },
+                       'scroll': {
+                               'top': $win.scrollTop(),
+                               'left': $win.scrollLeft()
+                       },
+                       'scrollbar': { 'right': 0, 'bottom': 0 },
+                       'rect': {
+                               'top': 0,
+                               'left': 0,
+                               'bottom': $win.innerHeight(),
+                               'right': $win.innerWidth()
+                       }
+               };
+       } else {
+               $el = $( el );
+               return {
+                       'borders': this.getBorders( el ),
+                       'scroll': {
+                               'top': $el.scrollTop(),
+                               'left': $el.scrollLeft()
+                       },
+                       'scrollbar': {
+                               'right': $el.innerWidth() - el.clientWidth,
+                               'bottom': $el.innerHeight() - el.clientHeight
+                       },
+                       'rect': el.getBoundingClientRect()
+               };
+       }
+};
+
+/**
+ * Get closest scrollable container.
+ *
+ * Traverses up until either a scrollable element or the root is reached, in which case the window
+ * will be returned.
+ *
+ * @static
+ * @param {HTMLElement} el Element to find scrollable container for
+ * @param {string} [dimension] Dimension of scrolling to look for; `x`, `y` or omit for either
+ * @return {HTMLElement|Window} Closest scrollable container
+ */
+OO.ui.Element.getClosestScrollableContainer = function ( el, dimension ) {
+       var i, val,
+               props = [ 'overflow' ],
+               $parent = $( el ).parent();
+
+       if ( dimension === 'x' || dimension === 'y' ) {
+               props.push( 'overflow-' + dimension );
+       }
+
+       while ( $parent.length ) {
+               if ( $parent[0] === el.ownerDocument.body ) {
+                       return $parent[0];
+               }
+               i = props.length;
+               while ( i-- ) {
+                       val = $parent.css( props[i] );
+                       if ( val === 'auto' || val === 'scroll' ) {
+                               return $parent[0];
+                       }
+               }
+               $parent = $parent.parent();
+       }
+       return this.getDocument( el ).body;
+};
+
+/**
+ * Scroll element into view.
+ *
+ * @static
+ * @param {HTMLElement} el Element to scroll into view
+ * @param {Object} [config={}] Configuration config
+ * @param {string} [config.duration] jQuery animation duration value
+ * @param {string} [config.direction] Scroll in only one direction, e.g. 'x' or 'y', omit
+ *  to scroll in both directions
+ * @param {Function} [config.complete] Function to call when scrolling completes
+ */
+OO.ui.Element.scrollIntoView = function ( el, config ) {
+       // Configuration initialization
+       config = config || {};
+
+       var anim = {},
+               callback = typeof config.complete === 'function' && config.complete,
+               sc = this.getClosestScrollableContainer( el, config.direction ),
+               $sc = $( sc ),
+               eld = this.getDimensions( el ),
+               scd = this.getDimensions( sc ),
+               rel = {
+                       'top': eld.rect.top - ( scd.rect.top + scd.borders.top ),
+                       'bottom': scd.rect.bottom - scd.borders.bottom - scd.scrollbar.bottom - eld.rect.bottom,
+                       'left': eld.rect.left - ( scd.rect.left + scd.borders.left ),
+                       'right': scd.rect.right - scd.borders.right - scd.scrollbar.right - eld.rect.right
+               };
+
+       if ( !config.direction || config.direction === 'y' ) {
+               if ( rel.top < 0 ) {
+                       anim.scrollTop = scd.scroll.top + rel.top;
+               } else if ( rel.top > 0 && rel.bottom < 0 ) {
+                       anim.scrollTop = scd.scroll.top + Math.min( rel.top, -rel.bottom );
+               }
+       }
+       if ( !config.direction || config.direction === 'x' ) {
+               if ( rel.left < 0 ) {
+                       anim.scrollLeft = scd.scroll.left + rel.left;
+               } else if ( rel.left > 0 && rel.right < 0 ) {
+                       anim.scrollLeft = scd.scroll.left + Math.min( rel.left, -rel.right );
+               }
+       }
+       if ( !$.isEmptyObject( anim ) ) {
+               $sc.stop( true ).animate( anim, config.duration || 'fast' );
+               if ( callback ) {
+                       $sc.queue( function ( next ) {
+                               callback();
+                               next();
+                       } );
+               }
+       } else {
+               if ( callback ) {
+                       callback();
+               }
+       }
+};
+
+/* Methods */
+
+/**
+ * Get the HTML tag name.
+ *
+ * Override this method to base the result on instance information.
+ *
+ * @return {string} HTML tag name
+ */
+OO.ui.Element.prototype.getTagName = function () {
+       return this.constructor.static.tagName;
+};
+
+/**
+ * Check if the element is attached to the DOM
+ * @return {boolean} The element is attached to the DOM
+ */
+OO.ui.Element.prototype.isElementAttached = function () {
+       return $.contains( this.getElementDocument(), this.$element[0] );
+};
+
+/**
+ * Get the DOM document.
+ *
+ * @return {HTMLDocument} Document object
+ */
+OO.ui.Element.prototype.getElementDocument = function () {
+       return OO.ui.Element.getDocument( this.$element );
+};
+
+/**
+ * Get the DOM window.
+ *
+ * @return {Window} Window object
+ */
+OO.ui.Element.prototype.getElementWindow = function () {
+       return OO.ui.Element.getWindow( this.$element );
+};
+
+/**
+ * Get closest scrollable container.
+ *
+ * @see #static-method-getClosestScrollableContainer
+ */
+OO.ui.Element.prototype.getClosestScrollableElementContainer = function () {
+       return OO.ui.Element.getClosestScrollableContainer( this.$element[0] );
+};
+
+/**
+ * Get group element is in.
+ *
+ * @return {OO.ui.GroupElement|null} Group element, null if none
+ */
+OO.ui.Element.prototype.getElementGroup = function () {
+       return this.elementGroup;
+};
+
+/**
+ * Set group element is in.
+ *
+ * @param {OO.ui.GroupElement|null} group Group element, null if none
+ * @chainable
+ */
+OO.ui.Element.prototype.setElementGroup = function ( group ) {
+       this.elementGroup = group;
+       return this;
+};
+
+/**
+ * Scroll element into view.
+ *
+ * @see #static-method-scrollIntoView
+ * @param {Object} [config={}]
+ */
+OO.ui.Element.prototype.scrollElementIntoView = function ( config ) {
+       return OO.ui.Element.scrollIntoView( this.$element[0], config );
+};
+
+/**
+ * Bind a handler for an event on this.$element
+ * @see #static-method-onDOMEvent
+ * @param {string} event
+ * @param {Function} callback
+ */
+OO.ui.Element.prototype.onDOMEvent = function ( event, callback ) {
+       OO.ui.Element.onDOMEvent( this.$element, event, callback );
+};
+
+/**
+ * Unbind a handler bound with #offDOMEvent
+ * @see #static-method-offDOMEvent
+ * @param {string} event
+ * @param {Function} callback
+ */
+OO.ui.Element.prototype.offDOMEvent = function ( event, callback ) {
+       OO.ui.Element.offDOMEvent( this.$element, event, callback );
+};
+
+( function () {
+       // Static
+       var specialFocusin;
+
+       function handler( e ) {
+               jQuery.event.simulate( 'focusin', e.target, jQuery.event.fix( e ), /* bubble = */ true );
+       }
+
+       specialFocusin = {
+               setup: function () {
+                       var doc = this.ownerDocument || this,
+                               attaches = $.data( doc, 'ooui-focusin-attaches' );
+                       if ( !attaches ) {
+                               doc.addEventListener( 'focus', handler, true );
+                       }
+                       $.data( doc, 'ooui-focusin-attaches', ( attaches || 0 ) + 1 );
+               },
+               teardown: function () {
+                       var doc = this.ownerDocument || this,
+                               attaches = $.data( doc, 'ooui-focusin-attaches' ) - 1;
+                       if ( !attaches ) {
+                               doc.removeEventListener( 'focus', handler, true );
+                               $.removeData( doc, 'ooui-focusin-attaches' );
+                       } else {
+                               $.data( doc, 'ooui-focusin-attaches', attaches );
+                       }
+               }
+       };
+
+       /**
+        * Bind a handler for an event on a DOM element.
+        *
+        * Uses jQuery internally for everything except for events which are
+        * known to have issues in the browser or in jQuery. This method
+        * should become obsolete eventually.
+        *
+        * @static
+        * @param {HTMLElement|jQuery} el DOM element
+        * @param {string} event Event to bind
+        * @param {Function} callback Callback to call when the event fires
+        */
+       OO.ui.Element.onDOMEvent = function ( el, event, callback ) {
+               var orig;
+
+               if ( event === 'focusin' ) {
+                       // jQuery 1.8.3 has a bug with handling focusin events inside iframes.
+                       // Firefox doesn't support focusin at all, so we listen for 'focus' on the
+                       // document, and simulate a 'focusin' event on the target element and make
+                       // it bubble from there.
+                       //
+                       // - http://jsfiddle.net/sw3hr/
+                       // - http://bugs.jquery.com/ticket/14180
+                       // - https://github.com/jquery/jquery/commit/1cecf64e5aa4153
+
+                       // Replace jQuery's override with our own
+                       orig = $.event.special.focusin;
+                       $.event.special.focusin = specialFocusin;
+
+                       $( el ).on( event, callback );
+
+                       // Restore
+                       $.event.special.focusin = orig;
+
+               } else {
+                       $( el ).on( event, callback );
+               }
+       };
+
+       /**
+        * Unbind a handler bound with #static-method-onDOMEvent.
+        *
+        * @static
+        * @param {HTMLElement|jQuery} el DOM element
+        * @param {string} event Event to unbind
+        * @param {Function} [callback] Callback to unbind
+        */
+       OO.ui.Element.offDOMEvent = function ( el, event, callback ) {
+               var orig;
+               if ( event === 'focusin' ) {
+                       orig = $.event.special.focusin;
+                       $.event.special.focusin = specialFocusin;
+                       $( el ).off( event, callback );
+                       $.event.special.focusin = orig;
+               } else {
+                       $( el ).off( event, callback );
+               }
+       };
+}() );
+/**
+ * Embedded iframe with the same styles as its parent.
+ *
+ * @class
+ * @extends OO.ui.Element
+ * @mixins OO.EventEmitter
+ *
+ * @constructor
+ * @param {Object} [config] Configuration options
+ */
+OO.ui.Frame = function OoUiFrame( config ) {
+       // Parent constructor
+       OO.ui.Frame.super.call( this, config );
+
+       // Mixin constructors
+       OO.EventEmitter.call( this );
+
+       // Properties
+       this.loading = false;
+       this.loaded = false;
+       this.config = config;
+
+       // Initialize
+       this.$element
+               .addClass( 'oo-ui-frame' )
+               .attr( { 'frameborder': 0, 'scrolling': 'no' } );
+
+};
+
+/* Setup */
+
+OO.inheritClass( OO.ui.Frame, OO.ui.Element );
+OO.mixinClass( OO.ui.Frame, OO.EventEmitter );
+
+/* Static Properties */
+
+/**
+ * @static
+ * @inheritdoc
+ */
+OO.ui.Frame.static.tagName = 'iframe';
+
+/* Events */
+
+/**
+ * @event load
+ */
+
+/* Static Methods */
+
+/**
+ * Transplant the CSS styles from as parent document to a frame's document.
+ *
+ * This loops over the style sheets in the parent document, and copies their nodes to the
+ * frame's document. It then polls the document to see when all styles have loaded, and once they
+ * have, invokes the callback.
+ *
+ * If the styles still haven't loaded after a long time (5 seconds by default), we give up waiting
+ * and invoke the callback anyway. This protects against cases like a display: none; iframe in
+ * Firefox, where the styles won't load until the iframe becomes visible.
+ *
+ * For details of how we arrived at the strategy used in this function, see #load.
+ *
+ * @static
+ * @inheritable
+ * @param {HTMLDocument} parentDoc Document to transplant styles from
+ * @param {HTMLDocument} frameDoc Document to transplant styles to
+ * @param {Function} [callback] Callback to execute once styles have loaded
+ * @param {number} [timeout=5000] How long to wait before giving up (in ms). If 0, never give up.
+ */
+OO.ui.Frame.static.transplantStyles = function ( parentDoc, frameDoc, callback, timeout ) {
+       var i, numSheets, styleNode, newNode, timeoutID, pollNodeId, $pendingPollNodes,
+               $pollNodes = $( [] ),
+               // Fake font-family value
+               fontFamily = 'oo-ui-frame-transplantStyles-loaded';
+
+       for ( i = 0, numSheets = parentDoc.styleSheets.length; i < numSheets; i++ ) {
+               styleNode = parentDoc.styleSheets[i].ownerNode;
+               if ( callback && styleNode.nodeName.toLowerCase() === 'link' ) {
+                       // External stylesheet
+                       // Create a node with a unique ID that we're going to monitor to see when the CSS
+                       // has loaded
+                       pollNodeId = 'oo-ui-frame-transplantStyles-loaded-' + i;
+                       $pollNodes = $pollNodes.add( $( '<div>', frameDoc )
+                               .attr( 'id', pollNodeId )
+                               .appendTo( frameDoc.body )
+                       );
+
+                       // Add <style>@import url(...); #pollNodeId { font-family: ... }</style>
+                       // The font-family rule will only take effect once the @import finishes
+                       newNode = frameDoc.createElement( 'style' );
+                       newNode.textContent = '@import url(' + styleNode.href + ');\n' +
+                               '#' + pollNodeId + ' { font-family: ' + fontFamily + '; }';
+               } else {
+                       // Not an external stylesheet, or no polling required; just copy the node over
+                       newNode = frameDoc.importNode( styleNode, true );
+               }
+               frameDoc.head.appendChild( newNode );
+       }
+
+       if ( callback ) {
+               // Poll every 100ms until all external stylesheets have loaded
+               $pendingPollNodes = $pollNodes;
+               timeoutID = setTimeout( function pollExternalStylesheets() {
+                       while (
+                               $pendingPollNodes.length > 0 &&
+                               $pendingPollNodes.eq( 0 ).css( 'font-family' ) === fontFamily
+                       ) {
+                               $pendingPollNodes = $pendingPollNodes.slice( 1 );
+                       }
+
+                       if ( $pendingPollNodes.length === 0 ) {
+                               // We're done!
+                               if ( timeoutID !== null ) {
+                                       timeoutID = null;
+                                       $pollNodes.remove();
+                                       callback();
+                               }
+                       } else {
+                               timeoutID = setTimeout( pollExternalStylesheets, 100 );
+                       }
+               }, 100 );
+               // ...but give up after a while
+               if ( timeout !== 0 ) {
+                       setTimeout( function () {
+                               if ( timeoutID ) {
+                                       clearTimeout( timeoutID );
+                                       timeoutID = null;
+                                       $pollNodes.remove();
+                                       callback();
+                               }
+                       }, timeout || 5000 );
+               }
+       }
+};
+
+/* Methods */
+
+/**
+ * Load the frame contents.
+ *
+ * Once the iframe's stylesheets are loaded, the `initialize` event will be emitted.
+ *
+ * Sounds simple right? Read on...
+ *
+ * When you create a dynamic iframe using open/write/close, the window.load event for the
+ * iframe is triggered when you call close, and there's no further load event to indicate that
+ * everything is actually loaded.
+ *
+ * In Chrome, stylesheets don't show up in document.styleSheets until they have loaded, so we could
+ * just poll that array and wait for it to have the right length. However, in Firefox, stylesheets
+ * are added to document.styleSheets immediately, and the only way you can determine whether they've
+ * loaded is to attempt to access .cssRules and wait for that to stop throwing an exception. But
+ * cross-domain stylesheets never allow .cssRules to be accessed even after they have loaded.
+ *
+ * The workaround is to change all `<link href="...">` tags to `<style>@import url(...)</style>` tags.
+ * Because `@import` is blocking, Chrome won't add the stylesheet to document.styleSheets until
+ * the `@import` has finished, and Firefox won't allow .cssRules to be accessed until the `@import`
+ * has finished. And because the contents of the `<style>` tag are from the same origin, accessing
+ * .cssRules is allowed.
+ *
+ * However, now that we control the styles we're injecting, we might as well do away with
+ * browser-specific polling hacks like document.styleSheets and .cssRules, and instead inject
+ * `<style>@import url(...); #foo { font-family: someValue; }</style>`, then create `<div id="foo">`
+ * and wait for its font-family to change to someValue. Because `@import` is blocking, the font-family
+ * rule is not applied until after the `@import` finishes.
+ *
+ * All this stylesheet injection and polling magic is in #transplantStyles.
+ *
+ * @private
+ * @fires load
+ */
+OO.ui.Frame.prototype.load = function () {
+       var win = this.$element.prop( 'contentWindow' ),
+               doc = win.document,
+               frame = this;
+
+       this.loading = true;
+
+       // Figure out directionality:
+       this.dir = this.$element.closest( '[dir]' ).prop( 'dir' ) || 'ltr';
+
+       // Initialize contents
+       doc.open();
+       doc.write(
+               '<!doctype html>' +
+               '<html>' +
+                       '<body class="oo-ui-frame-body oo-ui-' + this.dir + '" style="direction:' + this.dir + ';" dir="' + this.dir + '">' +
+                               '<div class="oo-ui-frame-content"></div>' +
+                       '</body>' +
+               '</html>'
+       );
+       doc.close();
+
+       // Properties
+       this.$ = OO.ui.Element.getJQuery( doc, this );
+       this.$content = this.$( '.oo-ui-frame-content' ).attr( 'tabIndex', 0 );
+       this.$document = this.$( doc );
+
+       this.constructor.static.transplantStyles(
+               this.getElementDocument(),
+               this.$document[0],
+               function () {
+                       frame.loading = false;
+                       frame.loaded = true;
+                       frame.emit( 'load' );
+               }
+       );
+};
+
+/**
+ * Run a callback as soon as the frame has been loaded.
+ *
+ *
+ * This will start loading if it hasn't already, and runs
+ * immediately if the frame is already loaded.
+ *
+ * Don't call this until the element is attached.
+ *
+ * @param {Function} callback
+ */
+OO.ui.Frame.prototype.run = function ( callback ) {
+       if ( this.loaded ) {
+               callback();
+       } else {
+               if ( !this.loading ) {
+                       this.load();
+               }
+               this.once( 'load', callback );
+       }
+};
+
+/**
+ * Set the size of the frame.
+ *
+ * @param {number} width Frame width in pixels
+ * @param {number} height Frame height in pixels
+ * @chainable
+ */
+OO.ui.Frame.prototype.setSize = function ( width, height ) {
+       this.$element.css( { 'width': width, 'height': height } );
+       return this;
+};
+/**
+ * Container for elements in a child frame.
+ *
+ * There are two ways to specify a title: set the static `title` property or provide a `title`
+ * property in the configuration options. The latter will override the former.
+ *
+ * @abstract
+ * @class
+ * @extends OO.ui.Element
+ * @mixins OO.EventEmitter
+ *
+ * @constructor
+ * @param {Object} [config] Configuration options
+ * @cfg {string|Function} [title] Title string or function that returns a string
+ * @cfg {string} [icon] Symbolic name of icon
+ * @fires initialize
+ */
+OO.ui.Window = function OoUiWindow( config ) {
+       // Parent constructor
+       OO.ui.Window.super.call( this, config );
+
+       // Mixin constructors
+       OO.EventEmitter.call( this );
+
+       // Properties
+       this.visible = false;
+       this.opening = false;
+       this.closing = false;
+       this.title = OO.ui.resolveMsg( config.title || this.constructor.static.title );
+       this.icon = config.icon || this.constructor.static.icon;
+       this.frame = new OO.ui.Frame( { '$': this.$ } );
+       this.$frame = this.$( '<div>' );
+       this.$ = function () {
+               throw new Error( 'this.$() cannot be used until the frame has been initialized.' );
+       };
+
+       // Initialization
+       this.$element
+               .addClass( 'oo-ui-window' )
+               // Hide the window using visibility: hidden; while the iframe is still loading
+               // Can't use display: none; because that prevents the iframe from loading in Firefox
+               .css( 'visibility', 'hidden' )
+               .append( this.$frame );
+       this.$frame
+               .addClass( 'oo-ui-window-frame' )
+               .append( this.frame.$element );
+
+       // Events
+       this.frame.connect( this, { 'load': 'initialize' } );
+};
+
+/* Setup */
+
+OO.inheritClass( OO.ui.Window, OO.ui.Element );
+OO.mixinClass( OO.ui.Window, OO.EventEmitter );
+
+/* Events */
+
+/**
+ * Initialize contents.
+ *
+ * Fired asynchronously after construction when iframe is ready.
+ *
+ * @event initialize
+ */
+
+/**
+ * Open window.
+ *
+ * Fired after window has been opened.
+ *
+ * @event open
+ * @param {Object} data Window opening data
+ */
+
+/**
+ * Close window.
+ *
+ * Fired after window has been closed.
+ *
+ * @event close
+ * @param {Object} data Window closing data
+ */
+
+/* Static Properties */
+
+/**
+ * Symbolic name of icon.
+ *
+ * @static
+ * @inheritable
+ * @property {string}
+ */
+OO.ui.Window.static.icon = 'window';
+
+/**
+ * Window title.
+ *
+ * Subclasses must implement this property before instantiating the window.
+ * Alternatively, override #getTitle with an alternative implementation.
+ *
+ * @static
+ * @abstract
+ * @inheritable
+ * @property {string|Function} Title string or function that returns a string
+ */
+OO.ui.Window.static.title = null;
+
+/* Methods */
+
+/**
+ * Check if window is visible.
+ *
+ * @return {boolean} Window is visible
+ */
+OO.ui.Window.prototype.isVisible = function () {
+       return this.visible;
+};
+
+/**
+ * Check if window is opening.
+ *
+ * @return {boolean} Window is opening
+ */
+OO.ui.Window.prototype.isOpening = function () {
+       return this.opening;
+};
+
+/**
+ * Check if window is closing.
+ *
+ * @return {boolean} Window is closing
+ */
+OO.ui.Window.prototype.isClosing = function () {
+       return this.closing;
+};
+
+/**
+ * Get the window frame.
+ *
+ * @return {OO.ui.Frame} Frame of window
+ */
+OO.ui.Window.prototype.getFrame = function () {
+       return this.frame;
+};
+
+/**
+ * Get the title of the window.
+ *
+ * @return {string} Title text
+ */
+OO.ui.Window.prototype.getTitle = function () {
+       return this.title;
+};
+
+/**
+ * Get the window icon.
+ *
+ * @return {string} Symbolic name of icon
+ */
+OO.ui.Window.prototype.getIcon = function () {
+       return this.icon;
+};
+
+/**
+ * Set the size of window frame.
+ *
+ * @param {number} [width=auto] Custom width
+ * @param {number} [height=auto] Custom height
+ * @chainable
+ */
+OO.ui.Window.prototype.setSize = function ( width, height ) {
+       if ( !this.frame.$content ) {
+               return;
+       }
+
+       this.frame.$element.css( {
+               'width': width === undefined ? 'auto' : width,
+               'height': height === undefined ? 'auto' : height
+       } );
+
+       return this;
+};
+
+/**
+ * Set the title of the window.
+ *
+ * @param {string|Function} title Title text or a function that returns text
+ * @chainable
+ */
+OO.ui.Window.prototype.setTitle = function ( title ) {
+       this.title = OO.ui.resolveMsg( title );
+       if ( this.$title ) {
+               this.$title.text( title );
+       }
+       return this;
+};
+
+/**
+ * Set the icon of the window.
+ *
+ * @param {string} icon Symbolic name of icon
+ * @chainable
+ */
+OO.ui.Window.prototype.setIcon = function ( icon ) {
+       if ( this.$icon ) {
+               this.$icon.removeClass( 'oo-ui-icon-' + this.icon );
+       }
+       this.icon = icon;
+       if ( this.$icon ) {
+               this.$icon.addClass( 'oo-ui-icon-' + this.icon );
+       }
+
+       return this;
+};
+
+/**
+ * Set the position of window to fit with contents.
+ *
+ * @param {string} left Left offset
+ * @param {string} top Top offset
+ * @chainable
+ */
+OO.ui.Window.prototype.setPosition = function ( left, top ) {
+       this.$element.css( { 'left': left, 'top': top } );
+       return this;
+};
+
+/**
+ * Set the height of window to fit with contents.
+ *
+ * @param {number} [min=0] Min height
+ * @param {number} [max] Max height (defaults to content's outer height)
+ * @chainable
+ */
+OO.ui.Window.prototype.fitHeightToContents = function ( min, max ) {
+       var height = this.frame.$content.outerHeight();
+
+       this.frame.$element.css(
+               'height', Math.max( min || 0, max === undefined ? height : Math.min( max, height ) )
+       );
+
+       return this;
+};
+
+/**
+ * Set the width of window to fit with contents.
+ *
+ * @param {number} [min=0] Min height
+ * @param {number} [max] Max height (defaults to content's outer width)
+ * @chainable
+ */
+OO.ui.Window.prototype.fitWidthToContents = function ( min, max ) {
+       var width = this.frame.$content.outerWidth();
+
+       this.frame.$element.css(
+               'width', Math.max( min || 0, max === undefined ? width : Math.min( max, width ) )
+       );
+
+       return this;
+};
+
+/**
+ * Initialize window contents.
+ *
+ * The first time the window is opened, #initialize is called when it's safe to begin populating
+ * its contents. See #setup for a way to make changes each time the window opens.
+ *
+ * Once this method is called, this.$$ can be used to create elements within the frame.
+ *
+ * @fires initialize
+ * @chainable
+ */
+OO.ui.Window.prototype.initialize = function () {
+       // Properties
+       this.$ = this.frame.$;
+       this.$title = this.$( '<div class="oo-ui-window-title"></div>' )
+               .text( this.title );
+       this.$icon = this.$( '<div class="oo-ui-window-icon"></div>' )
+               .addClass( 'oo-ui-icon-' + this.icon );
+       this.$head = this.$( '<div class="oo-ui-window-head"></div>' );
+       this.$body = this.$( '<div class="oo-ui-window-body"></div>' );
+       this.$foot = this.$( '<div class="oo-ui-window-foot"></div>' );
+       this.$overlay = this.$( '<div class="oo-ui-window-overlay"></div>' );
+
+       // Initialization
+       this.frame.$content.append(
+               this.$head.append( this.$icon, this.$title ),
+               this.$body,
+               this.$foot,
+               this.$overlay
+       );
+
+       // Undo the visibility: hidden; hack from the constructor and apply display: none;
+       // We can do this safely now that the iframe has initialized
+       this.$element.hide().css( 'visibility', '' );
+
+       this.emit( 'initialize' );
+
+       return this;
+};
+
+/**
+ * Setup window for use.
+ *
+ * Each time the window is opened, once it's ready to be interacted with, this will set it up for
+ * use in a particular context, based on the `data` argument.
+ *
+ * When you override this method, you must call the parent method at the very beginning.
+ *
+ * @abstract
+ * @param {Object} [data] Window opening data
+ */
+OO.ui.Window.prototype.setup = function () {
+       // Override to do something
+};
+
+/**
+ * Tear down window after use.
+ *
+ * Each time the window is closed, and it's done being interacted with, this will tear it down and
+ * do something with the user's interactions within the window, based on the `data` argument.
+ *
+ * When you override this method, you must call the parent method at the very end.
+ *
+ * @abstract
+ * @param {Object} [data] Window closing data
+ */
+OO.ui.Window.prototype.teardown = function () {
+       // Override to do something
+};
+
+/**
+ * Open window.
+ *
+ * Do not override this method. See #setup for a way to make changes each time the window opens.
+ *
+ * @param {Object} [data] Window opening data
+ * @fires open
+ * @chainable
+ */
+OO.ui.Window.prototype.open = function ( data ) {
+       if ( !this.opening && !this.closing && !this.visible ) {
+               this.opening = true;
+               this.frame.run( OO.ui.bind( function () {
+                       this.$element.show();
+                       this.visible = true;
+                       this.emit( 'opening', data );
+                       this.setup( data );
+                       // Focus the content div (which has a tabIndex) to inactivate
+                       // (but not clear) selections in the parent frame.
+                       // Must happen after setup runs (otherwise focusing it doesn't work)
+                       // but before 'open' is emitted (so subclasses can give focus to something else)
+                       this.frame.$content.focus();
+                       this.emit( 'open', data );
+                       this.opening = false;
+               }, this ) );
+       }
+
+       return this;
+};
+
+/**
+ * Close window.
+ *
+ * See #teardown for a way to do something each time the window closes.
+ *
+ * @param {Object} [data] Window closing data
+ * @fires close
+ * @chainable
+ */
+OO.ui.Window.prototype.close = function ( data ) {
+       if ( !this.opening && !this.closing && this.visible ) {
+               this.frame.$content.find( ':focus' ).blur();
+               this.closing = true;
+               this.$element.hide();
+               this.visible = false;
+               this.emit( 'closing', data );
+               this.teardown( data );
+               this.emit( 'close', data );
+               this.closing = false;
+       }
+
+       return this;
+};
+/**
+ * Set of mutually exclusive windows.
+ *
+ * @class
+ * @extends OO.ui.Element
+ * @mixins OO.EventEmitter
+ *
+ * @constructor
+ * @param {OO.Factory} factory Window factory
+ * @param {Object} [config] Configuration options
+ */
+OO.ui.WindowSet = function OoUiWindowSet( factory, config ) {
+       // Parent constructor
+       OO.ui.WindowSet.super.call( this, config );
+
+       // Mixin constructors
+       OO.EventEmitter.call( this );
+
+       // Properties
+       this.factory = factory;
+
+       /**
+        * List of all windows associated with this window set.
+        *
+        * @property {OO.ui.Window[]}
+        */
+       this.windowList = [];
+
+       /**
+        * Mapping of OO.ui.Window objects created by name from the #factory.
+        *
+        * @property {Object}
+        */
+       this.windows = {};
+       this.currentWindow = null;
+
+       // Initialization
+       this.$element.addClass( 'oo-ui-windowSet' );
+};
+
+/* Setup */
+
+OO.inheritClass( OO.ui.WindowSet, OO.ui.Element );
+OO.mixinClass( OO.ui.WindowSet, OO.EventEmitter );
+
+/* Events */
+
+/**
+ * @event opening
+ * @param {OO.ui.Window} win Window that's being opened
+ * @param {Object} config Window opening information
+ */
+
+/**
+ * @event open
+ * @param {OO.ui.Window} win Window that's been opened
+ * @param {Object} config Window opening information
+ */
+
+/**
+ * @event closing
+ * @param {OO.ui.Window} win Window that's being closed
+ * @param {Object} config Window closing information
+ */
+
+/**
+ * @event close
+ * @param {OO.ui.Window} win Window that's been closed
+ * @param {Object} config Window closing information
+ */
+
+/* Methods */
+
+/**
+ * Handle a window that's being opened.
+ *
+ * @param {OO.ui.Window} win Window that's being opened
+ * @param {Object} [config] Window opening information
+ * @fires opening
+ */
+OO.ui.WindowSet.prototype.onWindowOpening = function ( win, config ) {
+       if ( this.currentWindow && this.currentWindow !== win ) {
+               this.currentWindow.close();
+       }
+       this.currentWindow = win;
+       this.emit( 'opening', win, config );
+};
+
+/**
+ * Handle a window that's been opened.
+ *
+ * @param {OO.ui.Window} win Window that's been opened
+ * @param {Object} [config] Window opening information
+ * @fires open
+ */
+OO.ui.WindowSet.prototype.onWindowOpen = function ( win, config ) {
+       this.emit( 'open', win, config );
+};
+
+/**
+ * Handle a window that's being closed.
+ *
+ * @param {OO.ui.Window} win Window that's being closed
+ * @param {Object} [config] Window closing information
+ * @fires closing
+ */
+OO.ui.WindowSet.prototype.onWindowClosing = function ( win, config ) {
+       this.currentWindow = null;
+       this.emit( 'closing', win, config );
+};
+
+/**
+ * Handle a window that's been closed.
+ *
+ * @param {OO.ui.Window} win Window that's been closed
+ * @param {Object} [config] Window closing information
+ * @fires close
+ */
+OO.ui.WindowSet.prototype.onWindowClose = function ( win, config ) {
+       this.emit( 'close', win, config );
+};
+
+/**
+ * Get the current window.
+ *
+ * @return {OO.ui.Window|null} Current window or null if none open
+ */
+OO.ui.WindowSet.prototype.getCurrentWindow = function () {
+       return this.currentWindow;
+};
+
+/**
+ * Return a given window.
+ *
+ * @param {string} name Symbolic name of window
+ * @return {OO.ui.Window} Window with specified name
+ */
+OO.ui.WindowSet.prototype.getWindow = function ( name ) {
+       var win;
+
+       if ( !this.factory.lookup( name ) ) {
+               throw new Error( 'Unknown window: ' + name );
+       }
+       if ( !( name in this.windows ) ) {
+               win = this.windows[name] = this.createWindow( name );
+               this.addWindow( win );
+       }
+       return this.windows[name];
+};
+
+/**
+ * Create a window for use in this window set.
+ *
+ * @param {string} name Symbolic name of window
+ * @return {OO.ui.Window} Window with specified name
+ */
+OO.ui.WindowSet.prototype.createWindow = function ( name ) {
+       return this.factory.create( name, { '$': this.$ } );
+};
+
+/**
+ * Add a given window to this window set.
+ *
+ * Connects event handlers and attaches it to the DOM. Calling
+ * OO.ui.Window#open will not work until the window is added to the set.
+ *
+ * @param {OO.ui.Window} win
+ */
+OO.ui.WindowSet.prototype.addWindow = function ( win ) {
+       if ( this.windowList.indexOf( win ) !== -1 ) {
+               // Already set up
+               return;
+       }
+       this.windowList.push( win );
+
+       win.connect( this, {
+               'opening': [ 'onWindowOpening', win ],
+               'open': [ 'onWindowOpen', win ],
+               'closing': [ 'onWindowClosing', win ],
+               'close': [ 'onWindowClose', win ]
+       } );
+       this.$element.append( win.$element );
+};
+/**
+ * Modal dialog window.
+ *
+ * @abstract
+ * @class
+ * @extends OO.ui.Window
+ *
+ * @constructor
+ * @param {Object} [config] Configuration options
+ * @cfg {boolean} [footless] Hide foot
+ * @cfg {string} [size='large'] Symbolic name of dialog size, `small`, `medium` or `large`
+ */
+OO.ui.Dialog = function OoUiDialog( config ) {
+       // Configuration initialization
+       config = $.extend( { 'size': 'large' }, config );
+
+       // Parent constructor
+       OO.ui.Dialog.super.call( this, config );
+
+       // Properties
+       this.visible = false;
+       this.footless = !!config.footless;
+       this.size = null;
+       this.onWindowMouseWheelHandler = OO.ui.bind( this.onWindowMouseWheel, this );
+       this.onDocumentKeyDownHandler = OO.ui.bind( this.onDocumentKeyDown, this );
+
+       // Events
+       this.$element.on( 'mousedown', false );
+       this.connect( this, { 'opening': 'onOpening' } );
+
+       // Initialization
+       this.$element.addClass( 'oo-ui-dialog' );
+       this.setSize( config.size );
+};
+
+/* Setup */
+
+OO.inheritClass( OO.ui.Dialog, OO.ui.Window );
+
+/* Static Properties */
+
+/**
+ * Symbolic name of dialog.
+ *
+ * @abstract
+ * @static
+ * @inheritable
+ * @property {string}
+ */
+OO.ui.Dialog.static.name = '';
+
+/**
+ * Map of symbolic size names and CSS classes.
+ *
+ * @static
+ * @inheritable
+ * @property {Object}
+ */
+OO.ui.Dialog.static.sizeCssClasses = {
+       'small': 'oo-ui-dialog-small',
+       'medium': 'oo-ui-dialog-medium',
+       'large': 'oo-ui-dialog-large'
+};
+
+/* Methods */
+
+/**
+ * Handle close button click events.
+ */
+OO.ui.Dialog.prototype.onCloseButtonClick = function () {
+       this.close( { 'action': 'cancel' } );
+};
+
+/**
+ * Handle window mouse wheel events.
+ *
+ * @param {jQuery.Event} e Mouse wheel event
+ */
+OO.ui.Dialog.prototype.onWindowMouseWheel = function () {
+       return false;
+};
+
+/**
+ * Handle document key down events.
+ *
+ * @param {jQuery.Event} e Key down event
+ */
+OO.ui.Dialog.prototype.onDocumentKeyDown = function ( e ) {
+       switch ( e.which ) {
+               case OO.ui.Keys.PAGEUP:
+               case OO.ui.Keys.PAGEDOWN:
+               case OO.ui.Keys.END:
+               case OO.ui.Keys.HOME:
+               case OO.ui.Keys.LEFT:
+               case OO.ui.Keys.UP:
+               case OO.ui.Keys.RIGHT:
+               case OO.ui.Keys.DOWN:
+                       // Prevent any key events that might cause scrolling
+                       return false;
+       }
+};
+
+/**
+ * Handle frame document key down events.
+ *
+ * @param {jQuery.Event} e Key down event
+ */
+OO.ui.Dialog.prototype.onFrameDocumentKeyDown = function ( e ) {
+       if ( e.which === OO.ui.Keys.ESCAPE ) {
+               this.close( { 'action': 'cancel' } );
+               return false;
+       }
+};
+
+/** */
+OO.ui.Dialog.prototype.onOpening = function () {
+       this.$element.addClass( 'oo-ui-dialog-open' );
+};
+
+/**
+ * Set dialog size.
+ *
+ * @param {string} [size='large'] Symbolic name of dialog size, `small`, `medium` or `large`
+ */
+OO.ui.Dialog.prototype.setSize = function ( size ) {
+       var name, state, cssClass,
+               sizeCssClasses = OO.ui.Dialog.static.sizeCssClasses;
+
+       if ( !sizeCssClasses[size] ) {
+               size = 'large';
+       }
+       this.size = size;
+       for ( name in sizeCssClasses ) {
+               state = name === size;
+               cssClass = sizeCssClasses[name];
+               this.$element.toggleClass( cssClass, state );
+               if ( this.frame.$content ) {
+                       this.frame.$content.toggleClass( cssClass, state );
+               }
+       }
+};
+
+/**
+ * @inheritdoc
+ */
+OO.ui.Dialog.prototype.initialize = function () {
+       // Parent method
+       OO.ui.Window.prototype.initialize.call( this );
+
+       // Properties
+       this.closeButton = new OO.ui.ButtonWidget( {
+               '$': this.$,
+               'frameless': true,
+               'icon': 'close',
+               'title': OO.ui.msg( 'ooui-dialog-action-close' )
+       } );
+
+       // Events
+       this.closeButton.connect( this, { 'click': 'onCloseButtonClick' } );
+       this.frame.$document.on( 'keydown', OO.ui.bind( this.onFrameDocumentKeyDown, this ) );
+
+       // Initialization
+       this.frame.$content.addClass( 'oo-ui-dialog-content' );
+       if ( this.footless ) {
+               this.frame.$content.addClass( 'oo-ui-dialog-content-footless' );
+       }
+       this.closeButton.$element.addClass( 'oo-ui-window-closeButton' );
+       this.$head.append( this.closeButton.$element );
+};
+
+/**
+ * @inheritdoc
+ */
+OO.ui.Dialog.prototype.setup = function ( data ) {
+       // Parent method
+       OO.ui.Window.prototype.setup.call( this, data );
+
+       // Prevent scrolling in top-level window
+       this.$( window ).on( 'mousewheel', this.onWindowMouseWheelHandler );
+       this.$( document ).on( 'keydown', this.onDocumentKeyDownHandler );
+};
+
+/**
+ * @inheritdoc
+ */
+OO.ui.Dialog.prototype.teardown = function ( data ) {
+       // Parent method
+       OO.ui.Window.prototype.teardown.call( this, data );
+
+       // Allow scrolling in top-level window
+       this.$( window ).off( 'mousewheel', this.onWindowMouseWheelHandler );
+       this.$( document ).off( 'keydown', this.onDocumentKeyDownHandler );
+};
+
+/**
+ * @inheritdoc
+ */
+OO.ui.Dialog.prototype.close = function ( data ) {
+       var dialog = this;
+       if ( !dialog.opening && !dialog.closing && dialog.visible ) {
+               // Trigger transition
+               dialog.$element.removeClass( 'oo-ui-dialog-open' );
+               // Allow transition to complete before actually closing
+               setTimeout( function () {
+                       // Parent method
+                       OO.ui.Window.prototype.close.call( dialog, data );
+               }, 250 );
+       }
+};
+/**
+ * Container for elements.
+ *
+ * @abstract
+ * @class
+ * @extends OO.ui.Element
+ * @mixins OO.EventEmitter
+ *
+ * @constructor
+ * @param {Object} [config] Configuration options
+ */
+OO.ui.Layout = function OoUiLayout( config ) {
+       // Initialize config
+       config = config || {};
+
+       // Parent constructor
+       OO.ui.Layout.super.call( this, config );
+
+       // Mixin constructors
+       OO.EventEmitter.call( this );
+
+       // Initialization
+       this.$element.addClass( 'oo-ui-layout' );
+};
+
+/* Setup */
+
+OO.inheritClass( OO.ui.Layout, OO.ui.Element );
+OO.mixinClass( OO.ui.Layout, OO.EventEmitter );
+/**
+ * User interface control.
+ *
+ * @abstract
+ * @class
+ * @extends OO.ui.Element
+ * @mixins OO.EventEmitter
+ *
+ * @constructor
+ * @param {Object} [config] Configuration options
+ * @cfg {boolean} [disabled=false] Disable
+ */
+OO.ui.Widget = function OoUiWidget( config ) {
+       // Initialize config
+       config = $.extend( { 'disabled': false }, config );
+
+       // Parent constructor
+       OO.ui.Widget.super.call( this, config );
+
+       // Mixin constructors
+       OO.EventEmitter.call( this );
+
+       // Properties
+       this.disabled = null;
+       this.wasDisabled = null;
+
+       // Initialization
+       this.$element.addClass( 'oo-ui-widget' );
+       this.setDisabled( !!config.disabled );
+};
+
+/* Setup */
+
+OO.inheritClass( OO.ui.Widget, OO.ui.Element );
+OO.mixinClass( OO.ui.Widget, OO.EventEmitter );
+
+/* Events */
+
+/**
+ * @event disable
+ * @param {boolean} disabled Widget is disabled
+ */
+
+/* Methods */
+
+/**
+ * Check if the widget is disabled.
+ *
+ * @param {boolean} Button is disabled
+ */
+OO.ui.Widget.prototype.isDisabled = function () {
+       return this.disabled;
+};
+
+/**
+ * Update the disabled state, in case of changes in parent widget.
+ *
+ * @chainable
+ */
+OO.ui.Widget.prototype.updateDisabled = function () {
+       this.setDisabled( this.disabled );
+       return this;
+};
+
+/**
+ * Set the disabled state of the widget.
+ *
+ * This should probably change the widgets' appearance and prevent it from being used.
+ *
+ * @param {boolean} disabled Disable widget
+ * @chainable
+ */
+OO.ui.Widget.prototype.setDisabled = function ( disabled ) {
+       var isDisabled;
+
+       this.disabled = !!disabled;
+       isDisabled = this.isDisabled();
+       if ( isDisabled !== this.wasDisabled ) {
+               this.$element.toggleClass( 'oo-ui-widget-disabled', isDisabled );
+               this.$element.toggleClass( 'oo-ui-widget-enabled', !isDisabled );
+               this.emit( 'disable', isDisabled );
+       }
+       this.wasDisabled = isDisabled;
+       return this;
+};
+/**
+ * Element with a button.
+ *
+ * @abstract
+ * @class
+ *
+ * @constructor
+ * @param {jQuery} $button Button node, assigned to #$button
+ * @param {Object} [config] Configuration options
+ * @cfg {boolean} [frameless] Render button without a frame
+ * @cfg {number} [tabIndex=0] Button's tab index, use -1 to prevent tab focusing
+ */
+OO.ui.ButtonedElement = function OoUiButtonedElement( $button, config ) {
+       // Configuration initialization
+       config = config || {};
+
+       // Properties
+       this.$button = $button;
+       this.tabIndex = null;
+       this.active = false;
+       this.onMouseUpHandler = OO.ui.bind( this.onMouseUp, this );
+
+       // Events
+       this.$button.on( 'mousedown', OO.ui.bind( this.onMouseDown, this ) );
+
+       // Initialization
+       this.$element.addClass( 'oo-ui-buttonedElement' );
+       this.$button
+               .addClass( 'oo-ui-buttonedElement-button' )
+               .attr( 'role', 'button' )
+               .prop( 'tabIndex', config.tabIndex || 0 );
+       if ( config.frameless ) {
+               this.$element.addClass( 'oo-ui-buttonedElement-frameless' );
+       } else {
+               this.$element.addClass( 'oo-ui-buttonedElement-framed' );
+       }
+};
+
+/* Methods */
+
+/**
+ * Handles mouse down events.
+ *
+ * @param {jQuery.Event} e Mouse down event
+ */
+OO.ui.ButtonedElement.prototype.onMouseDown = function () {
+       // tabIndex should generally be interacted with via the property,
+       // but it's not possible to reliably unset a tabIndex via a property
+       // so we use the (lowercase) "tabindex" attribute instead.
+       this.tabIndex = this.$button.attr( 'tabindex' );
+       // Remove the tab-index while the button is down to prevent the button from stealing focus
+       this.$button
+               .removeAttr( 'tabindex' )
+               .addClass( 'oo-ui-buttonedElement-pressed' );
+       this.getElementDocument().addEventListener( 'mouseup', this.onMouseUpHandler, true );
+};
+
+/**
+ * Handles mouse up events.
+ *
+ * @param {jQuery.Event} e Mouse up event
+ */
+OO.ui.ButtonedElement.prototype.onMouseUp = function () {
+       // Restore the tab-index after the button is up to restore the button's accesssibility
+       this.$button
+               .attr( 'tabindex', this.tabIndex )
+               .removeClass( 'oo-ui-buttonedElement-pressed' );
+       this.getElementDocument().removeEventListener( 'mouseup', this.onMouseUpHandler, true );
+};
+
+/**
+ * Set active state.
+ *
+ * @param {boolean} [value] Make button active
+ * @chainable
+ */
+OO.ui.ButtonedElement.prototype.setActive = function ( value ) {
+       this.$button.toggleClass( 'oo-ui-buttonedElement-active', !!value );
+       return this;
+};
+/**
+ * Element that can be automatically clipped to visible boundaies.
+ *
+ * @abstract
+ * @class
+ *
+ * @constructor
+ * @param {jQuery} $clippable Nodes to clip, assigned to #$clippable
+ * @param {Object} [config] Configuration options
+ */
+OO.ui.ClippableElement = function OoUiClippableElement( $clippable, config ) {
+       // Configuration initialization
+       config = config || {};
+
+       // Properties
+       this.$clippable = $clippable;
+       this.clipping = false;
+       this.clipped = false;
+       this.$clippableContainer = null;
+       this.$clippableScroller = null;
+       this.$clippableWindow = null;
+       this.idealWidth = null;
+       this.idealHeight = null;
+       this.onClippableContainerScrollHandler = OO.ui.bind( this.clip, this );
+       this.onClippableWindowResizeHandler = OO.ui.bind( this.clip, this );
+
+       // Initialization
+       this.$clippable.addClass( 'oo-ui-clippableElement-clippable' );
+};
+
+/* Methods */
+
+/**
+ * Set clipping.
+ *
+ * @param {boolean} value Enable clipping
+ * @chainable
+ */
+OO.ui.ClippableElement.prototype.setClipping = function ( value ) {
+       value = !!value;
+
+       if ( this.clipping !== value ) {
+               this.clipping = value;
+               if ( this.clipping ) {
+                       this.$clippableContainer = this.$( this.getClosestScrollableElementContainer() );
+                       // If the clippable container is the body, we have to listen to scroll events and check
+                       // jQuery.scrollTop on the window because of browser inconsistencies
+                       this.$clippableScroller = this.$clippableContainer.is( 'body' ) ?
+                               this.$( OO.ui.Element.getWindow( this.$clippableContainer ) ) :
+                               this.$clippableContainer;
+                       this.$clippableScroller.on( 'scroll', this.onClippableContainerScrollHandler );
+                       this.$clippableWindow = this.$( this.getElementWindow() )
+                               .on( 'resize', this.onClippableWindowResizeHandler );
+                       // Initial clip after visible
+                       setTimeout( OO.ui.bind( this.clip, this ) );
+               } else {
+                       this.$clippableContainer = null;
+                       this.$clippableScroller.off( 'scroll', this.onClippableContainerScrollHandler );
+                       this.$clippableScroller = null;
+                       this.$clippableWindow.off( 'resize', this.onClippableWindowResizeHandler );
+                       this.$clippableWindow = null;
+               }
+       }
+
+       return this;
+};
+
+/**
+ * Check if the element will be clipped to fit the visible area of the nearest scrollable container.
+ *
+ * @return {boolean} Element will be clipped to the visible area
+ */
+OO.ui.ClippableElement.prototype.isClipping = function () {
+       return this.clipping;
+};
+
+/**
+ * Check if the bottom or right of the element is being clipped by the nearest scrollable container.
+ *
+ * @return {boolean} Part of the element is being clipped
+ */
+OO.ui.ClippableElement.prototype.isClipped = function () {
+       return this.clipped;
+};
+
+/**
+ * Set the ideal size.
+ *
+ * @param {number|string} [width] Width as a number of pixels or CSS string with unit suffix
+ * @param {number|string} [height] Height as a number of pixels or CSS string with unit suffix
+ */
+OO.ui.ClippableElement.prototype.setIdealSize = function ( width, height ) {
+       this.idealWidth = width;
+       this.idealHeight = height;
+};
+
+/**
+ * Clip element to visible boundaries and allow scrolling when needed.
+ *
+ * Element will be clipped the bottom or right of the element is within 10px of the edge of, or
+ * overlapped by, the visible area of the nearest scrollable container.
+ *
+ * @chainable
+ */
+OO.ui.ClippableElement.prototype.clip = function () {
+       if ( !this.clipping ) {
+               // this.$clippableContainer and this.$clippableWindow are null, so the below will fail
+               return this;
+       }
+
+       var buffer = 10,
+               cOffset = this.$clippable.offset(),
+               ccOffset = this.$clippableContainer.offset() || { 'top': 0, 'left': 0 },
+               ccHeight = this.$clippableContainer.innerHeight() - buffer,
+               ccWidth = this.$clippableContainer.innerWidth() - buffer,
+               scrollTop = this.$clippableScroller.scrollTop(),
+               scrollLeft = this.$clippableScroller.scrollLeft(),
+               desiredWidth = ( ccOffset.left + scrollLeft + ccWidth ) - cOffset.left,
+               desiredHeight = ( ccOffset.top + scrollTop + ccHeight ) - cOffset.top,
+               naturalWidth = this.$clippable.prop( 'scrollWidth' ),
+               naturalHeight = this.$clippable.prop( 'scrollHeight' ),
+               clipWidth = desiredWidth < naturalWidth,
+               clipHeight = desiredHeight < naturalHeight;
+
+       if ( clipWidth ) {
+               this.$clippable.css( { 'overflow-x': 'auto', 'width': desiredWidth } );
+       } else {
+               this.$clippable.css( { 'overflow-x': '', 'width': this.idealWidth || '' } );
+       }
+       if ( clipHeight ) {
+               this.$clippable.css( { 'overflow-y': 'auto', 'height': desiredHeight } );
+       } else {
+               this.$clippable.css( { 'overflow-y': '', 'height': this.idealHeight || '' } );
+       }
+
+       this.clipped = clipWidth || clipHeight;
+
+       return this;
+};
+/**
+ * Element with named flags that can be added, removed, listed and checked.
+ *
+ * A flag, when set, adds a CSS class on the `$element` by combing `oo-ui-flaggableElement-` with
+ * the flag name. Flags are primarily useful for styling.
+ *
+ * @abstract
+ * @class
+ *
+ * @constructor
+ * @param {Object} [config] Configuration options
+ * @cfg {string[]} [flags=[]] Styling flags, e.g. 'primary', 'destructive' or 'constructive'
+ */
+OO.ui.FlaggableElement = function OoUiFlaggableElement( config ) {
+       // Config initialization
+       config = config || {};
+
+       // Properties
+       this.flags = {};
+
+       // Initialization
+       this.setFlags( config.flags );
+};
+
+/* Methods */
+
+/**
+ * Check if a flag is set.
+ *
+ * @param {string} flag Name of flag
+ * @return {boolean} Has flag
+ */
+OO.ui.FlaggableElement.prototype.hasFlag = function ( flag ) {
+       return flag in this.flags;
+};
+
+/**
+ * Get the names of all flags set.
+ *
+ * @return {string[]} flags Flag names
+ */
+OO.ui.FlaggableElement.prototype.getFlags = function () {
+       return Object.keys( this.flags );
+};
+
+/**
+ * Add one or more flags.
+ *
+ * @param {string[]|Object.<string, boolean>} flags List of flags to add, or list of set/remove
+ *  values, keyed by flag name
+ * @chainable
+ */
+OO.ui.FlaggableElement.prototype.setFlags = function ( flags ) {
+       var i, len, flag,
+               classPrefix = 'oo-ui-flaggableElement-';
+
+       if ( $.isArray( flags ) ) {
+               for ( i = 0, len = flags.length; i < len; i++ ) {
+                       flag = flags[i];
+                       // Set
+                       this.flags[flag] = true;
+                       this.$element.addClass( classPrefix + flag );
+               }
+       } else if ( OO.isPlainObject( flags ) ) {
+               for ( flag in flags ) {
+                       if ( flags[flag] ) {
+                               // Set
+                               this.flags[flag] = true;
+                               this.$element.addClass( classPrefix + flag );
+                       } else {
+                               // Remove
+                               delete this.flags[flag];
+                               this.$element.removeClass( classPrefix + flag );
+                       }
+               }
+       }
+       return this;
+};
+/**
+ * Element containing a sequence of child elements.
+ *
+ * @abstract
+ * @class
+ *
+ * @constructor
+ * @param {jQuery} $group Container node, assigned to #$group
+ * @param {Object} [config] Configuration options
+ * @cfg {Object.<string,string>} [aggregations] Events to aggregate, keyed by item event name
+ */
+OO.ui.GroupElement = function OoUiGroupElement( $group, config ) {
+       // Configuration
+       config = config || {};
+
+       // Properties
+       this.$group = $group;
+       this.items = [];
+       this.$items = this.$( [] );
+       this.aggregate = !$.isEmptyObject( config.aggregations );
+       this.aggregations = config.aggregations || {};
+};
+
+/* Methods */
+
+/**
+ * Get items.
+ *
+ * @return {OO.ui.Element[]} Items
+ */
+OO.ui.GroupElement.prototype.getItems = function () {
+       return this.items.slice( 0 );
+};
+
+/**
+ * Add items.
+ *
+ * @param {OO.ui.Element[]} items Item
+ * @param {number} [index] Index to insert items at
+ * @chainable
+ */
+OO.ui.GroupElement.prototype.addItems = function ( items, index ) {
+       var i, len, item, event, events, currentIndex,
+               $items = this.$( [] );
+
+       for ( i = 0, len = items.length; i < len; i++ ) {
+               item = items[i];
+
+               // Check if item exists then remove it first, effectively "moving" it
+               currentIndex = $.inArray( item, this.items );
+               if ( currentIndex >= 0 ) {
+                       this.removeItems( [ item ] );
+                       // Adjust index to compensate for removal
+                       if ( currentIndex < index ) {
+                               index--;
+                       }
+               }
+               // Add the item
+               if ( this.aggregate ) {
+                       events = {};
+                       for ( event in this.aggregations ) {
+                               events[event] = [ 'emit', this.aggregations[event], item ];
+                       }
+                       item.connect( this, events );
+               }
+               item.setElementGroup( this );
+               $items = $items.add( item.$element );
+       }
+
+       if ( index === undefined || index < 0 || index >= this.items.length ) {
+               this.$group.append( $items );
+               this.items.push.apply( this.items, items );
+       } else if ( index === 0 ) {
+               this.$group.prepend( $items );
+               this.items.unshift.apply( this.items, items );
+       } else {
+               this.$items.eq( index ).before( $items );
+               this.items.splice.apply( this.items, [ index, 0 ].concat( items ) );
+       }
+
+       this.$items = this.$items.add( $items );
+
+       return this;
+};
+
+/**
+ * Remove items.
+ *
+ * Items will be detached, not removed, so they can be used later.
+ *
+ * @param {OO.ui.Element[]} items Items to remove
+ * @chainable
+ */
+OO.ui.GroupElement.prototype.removeItems = function ( items ) {
+       var i, len, item, index;
+
+       // Remove specific items
+       for ( i = 0, len = items.length; i < len; i++ ) {
+               item = items[i];
+               index = $.inArray( item, this.items );
+               if ( index !== -1 ) {
+                       if ( this.aggregate ) {
+                               item.disconnect( this );
+                       }
+                       item.setElementGroup( null );
+                       this.items.splice( index, 1 );
+                       item.$element.detach();
+                       this.$items = this.$items.not( item.$element );
+               }
+       }
+
+       return this;
+};
+
+/**
+ * Clear all items.
+ *
+ * Items will be detached, not removed, so they can be used later.
+ *
+ * @chainable
+ */
+OO.ui.GroupElement.prototype.clearItems = function () {
+       var i, len, item;
+
+       // Remove all items
+       for ( i = 0, len = this.items.length; i < len; i++ ) {
+               item = this.items[i];
+               if ( this.aggregate ) {
+                       item.disconnect( this );
+               }
+               item.setElementGroup( null );
+       }
+       this.items = [];
+       this.$items.detach();
+       this.$items = this.$( [] );
+
+       return this;
+};
+/**
+ * Element containing an icon.
+ *
+ * @abstract
+ * @class
+ *
+ * @constructor
+ * @param {jQuery} $icon Icon node, assigned to #$icon
+ * @param {Object} [config] Configuration options
+ * @cfg {Object|string} [icon=''] Symbolic icon name, or map of icon names keyed by language ID;
+ *  use the 'default' key to specify the icon to be used when there is no icon in the user's
+ *  language
+ */
+OO.ui.IconedElement = function OoUiIconedElement( $icon, config ) {
+       // Config intialization
+       config = config || {};
+
+       // Properties
+       this.$icon = $icon;
+       this.icon = null;
+
+       // Initialization
+       this.$icon.addClass( 'oo-ui-iconedElement-icon' );
+       this.setIcon( config.icon || this.constructor.static.icon );
+};
+
+/* Setup */
+
+OO.initClass( OO.ui.IconedElement );
+
+/* Static Properties */
+
+/**
+ * Icon.
+ *
+ * Value should be the unique portion of an icon CSS class name, such as 'up' for 'oo-ui-icon-up'.
+ *
+ * For i18n purposes, this property can be an object containing a `default` icon name property and
+ * additional icon names keyed by language code.
+ *
+ * Example of i18n icon definition:
+ *     { 'default': 'bold-a', 'en': 'bold-b', 'de': 'bold-f' }
+ *
+ * @static
+ * @inheritable
+ * @property {Object|string} Symbolic icon name, or map of icon names keyed by language ID;
+ *  use the 'default' key to specify the icon to be used when there is no icon in the user's
+ *  language
+ */
+OO.ui.IconedElement.static.icon = null;
+
+/* Methods */
+
+/**
+ * Set icon.
+ *
+ * @param {Object|string} icon Symbolic icon name, or map of icon names keyed by language ID;
+ *  use the 'default' key to specify the icon to be used when there is no icon in the user's
+ *  language
+ * @chainable
+ */
+OO.ui.IconedElement.prototype.setIcon = function ( icon ) {
+       icon = OO.isPlainObject( icon ) ? OO.ui.getLocalValue( icon, null, 'default' ) : icon;
+
+       if ( this.icon ) {
+               this.$icon.removeClass( 'oo-ui-icon-' + this.icon );
+       }
+       if ( typeof icon === 'string' ) {
+               icon = icon.trim();
+               if ( icon.length ) {
+                       this.$icon.addClass( 'oo-ui-icon-' + icon );
+                       this.icon = icon;
+               }
+       }
+       this.$element.toggleClass( 'oo-ui-iconedElement', !!this.icon );
+
+       return this;
+};
+
+/**
+ * Get icon.
+ *
+ * @return {string} Icon
+ */
+OO.ui.IconedElement.prototype.getIcon = function () {
+       return this.icon;
+};
+/**
+ * Element containing an indicator.
+ *
+ * @abstract
+ * @class
+ *
+ * @constructor
+ * @param {jQuery} $indicator Indicator node, assigned to #$indicator
+ * @param {Object} [config] Configuration options
+ * @cfg {string} [indicator] Symbolic indicator name
+ * @cfg {string} [indicatorTitle] Indicator title text or a function that return text
+ */
+OO.ui.IndicatedElement = function OoUiIndicatedElement( $indicator, config ) {
+       // Config intialization
+       config = config || {};
+
+       // Properties
+       this.$indicator = $indicator;
+       this.indicator = null;
+       this.indicatorLabel = null;
+
+       // Initialization
+       this.$indicator.addClass( 'oo-ui-indicatedElement-indicator' );
+       this.setIndicator( config.indicator || this.constructor.static.indicator );
+       this.setIndicatorTitle( config.indicatorTitle  || this.constructor.static.indicatorTitle );
+};
+
+/* Setup */
+
+OO.initClass( OO.ui.IndicatedElement );
+
+/* Static Properties */
+
+/**
+ * indicator.
+ *
+ * @static
+ * @inheritable
+ * @property {string|null} Symbolic indicator name or null for no indicator
+ */
+OO.ui.IndicatedElement.static.indicator = null;
+
+/**
+ * Indicator title.
+ *
+ * @static
+ * @inheritable
+ * @property {string|Function|null} Indicator title text, a function that return text or null for no
+ *  indicator title
+ */
+OO.ui.IndicatedElement.static.indicatorTitle = null;
+
+/* Methods */
+
+/**
+ * Set indicator.
+ *
+ * @param {string|null} indicator Symbolic name of indicator to use or null for no indicator
+ * @chainable
+ */
+OO.ui.IndicatedElement.prototype.setIndicator = function ( indicator ) {
+       if ( this.indicator ) {
+               this.$indicator.removeClass( 'oo-ui-indicator-' + this.indicator );
+               this.indicator = null;
+       }
+       if ( typeof indicator === 'string' ) {
+               indicator = indicator.trim();
+               if ( indicator.length ) {
+                       this.$indicator.addClass( 'oo-ui-indicator-' + indicator );
+                       this.indicator = indicator;
+               }
+       }
+       this.$element.toggleClass( 'oo-ui-indicatedElement', !!this.indicator );
+
+       return this;
+};
+
+/**
+ * Set indicator label.
+ *
+ * @param {string|Function|null} indicator Indicator title text, a function that return text or null
+ *  for no indicator title
+ * @chainable
+ */
+OO.ui.IndicatedElement.prototype.setIndicatorTitle = function ( indicatorTitle ) {
+       this.indicatorTitle = indicatorTitle = OO.ui.resolveMsg( indicatorTitle );
+
+       if ( typeof indicatorTitle === 'string' && indicatorTitle.length ) {
+               this.$indicator.attr( 'title', indicatorTitle );
+       } else {
+               this.$indicator.removeAttr( 'title' );
+       }
+
+       return this;
+};
+
+/**
+ * Get indicator.
+ *
+ * @return {string} title Symbolic name of indicator
+ */
+OO.ui.IndicatedElement.prototype.getIndicator = function () {
+       return this.indicator;
+};
+
+/**
+ * Get indicator title.
+ *
+ * @return {string} Indicator title text
+ */
+OO.ui.IndicatedElement.prototype.getIndicatorTitle = function () {
+       return this.indicatorTitle;
+};
+/**
+ * Element containing a label.
+ *
+ * @abstract
+ * @class
+ *
+ * @constructor
+ * @param {jQuery} $label Label node, assigned to #$label
+ * @param {Object} [config] Configuration options
+ * @cfg {jQuery|string|Function} [label] Label nodes, text or a function that returns nodes or text
+ * @cfg {boolean} [autoFitLabel=true] Whether to fit the label or not.
+ */
+OO.ui.LabeledElement = function OoUiLabeledElement( $label, config ) {
+       // Config intialization
+       config = config || {};
+
+       // Properties
+       this.$label = $label;
+       this.label = null;
+
+       // Initialization
+       this.$label.addClass( 'oo-ui-labeledElement-label' );
+       this.setLabel( config.label || this.constructor.static.label );
+       this.autoFitLabel = config.autoFitLabel === undefined || !!config.autoFitLabel;
+};
+
+/* Setup */
+
+OO.initClass( OO.ui.LabeledElement );
+
+/* Static Properties */
+
+/**
+ * Label.
+ *
+ * @static
+ * @inheritable
+ * @property {string|Function|null} Label text; a function that returns a nodes or text; or null for
+ *  no label
+ */
+OO.ui.LabeledElement.static.label = null;
+
+/* Methods */
+
+/**
+ * Set the label.
+ *
+ * An empty string will result in the label being hidden. A string containing only whitespace will
+ * be converted to a single &nbsp;
+ *
+ * @param {jQuery|string|Function|null} label Label nodes; text; a function that retuns nodes or
+ *  text; or null for no label
+ * @chainable
+ */
+OO.ui.LabeledElement.prototype.setLabel = function ( label ) {
+       var empty = false;
+
+       this.label = label = OO.ui.resolveMsg( label ) || null;
+       if ( typeof label === 'string' && label.length ) {
+               if ( label.match( /^\s*$/ ) ) {
+                       // Convert whitespace only string to a single non-breaking space
+                       this.$label.html( '&nbsp;' );
+               } else {
+                       this.$label.text( label );
+               }
+       } else if ( label instanceof jQuery ) {
+               this.$label.empty().append( label );
+       } else {
+               this.$label.empty();
+               empty = true;
+       }
+       this.$element.toggleClass( 'oo-ui-labeledElement', !empty );
+       this.$label.css( 'display', empty ? 'none' : '' );
+
+       return this;
+};
+
+/**
+ * Get the label.
+ *
+ * @return {jQuery|string|Function|null} label Label nodes; text; a function that returns nodes or
+ *  text; or null for no label
+ */
+OO.ui.LabeledElement.prototype.getLabel = function () {
+       return this.label;
+};
+
+/**
+ * Fit the label.
+ *
+ * @chainable
+ */
+OO.ui.LabeledElement.prototype.fitLabel = function () {
+       if ( this.$label.autoEllipsis && this.autoFitLabel ) {
+               this.$label.autoEllipsis( { 'hasSpan': false, 'tooltip': true } );
+       }
+       return this;
+};
+/**
+ * Popuppable element.
+ *
+ * @abstract
+ * @class
+ *
+ * @constructor
+ * @param {Object} [config] Configuration options
+ * @cfg {number} [popupWidth=320] Width of popup
+ * @cfg {number} [popupHeight] Height of popup
+ * @cfg {Object} [popup] Configuration to pass to popup
+ */
+OO.ui.PopuppableElement = function OoUiPopuppableElement( config ) {
+       // Configuration initialization
+       config = $.extend( { 'popupWidth': 320 }, config );
+
+       // Properties
+       this.popup = new OO.ui.PopupWidget( $.extend(
+               { 'align': 'center', 'autoClose': true },
+               config.popup,
+               { '$': this.$, '$autoCloseIgnore': this.$element }
+       ) );
+       this.popupWidth = config.popupWidth;
+       this.popupHeight = config.popupHeight;
+};
+
+/* Methods */
+
+/**
+ * Get popup.
+ *
+ * @return {OO.ui.PopupWidget} Popup widget
+ */
+OO.ui.PopuppableElement.prototype.getPopup = function () {
+       return this.popup;
+};
+
+/**
+ * Show popup.
+ */
+OO.ui.PopuppableElement.prototype.showPopup = function () {
+       this.popup.show().display( this.popupWidth, this.popupHeight );
+};
+
+/**
+ * Hide popup.
+ */
+OO.ui.PopuppableElement.prototype.hidePopup = function () {
+       this.popup.hide();
+};
+/**
+ * Element with a title.
+ *
+ * @abstract
+ * @class
+ *
+ * @constructor
+ * @param {jQuery} $label Titled node, assigned to #$titled
+ * @param {Object} [config] Configuration options
+ * @cfg {string|Function} [title] Title text or a function that returns text
+ */
+OO.ui.TitledElement = function OoUiTitledElement( $titled, config ) {
+       // Config intialization
+       config = config || {};
+
+       // Properties
+       this.$titled = $titled;
+       this.title = null;
+
+       // Initialization
+       this.setTitle( config.title || this.constructor.static.title );
+};
+
+/* Setup */
+
+OO.initClass( OO.ui.TitledElement );
+
+/* Static Properties */
+
+/**
+ * Title.
+ *
+ * @static
+ * @inheritable
+ * @property {string|Function} Title text or a function that returns text
+ */
+OO.ui.TitledElement.static.title = null;
+
+/* Methods */
+
+/**
+ * Set title.
+ *
+ * @param {string|Function|null} title Title text, a function that returns text or null for no title
+ * @chainable
+ */
+OO.ui.TitledElement.prototype.setTitle = function ( title ) {
+       this.title = title = OO.ui.resolveMsg( title ) || null;
+
+       if ( typeof title === 'string' && title.length ) {
+               this.$titled.attr( 'title', title );
+       } else {
+               this.$titled.removeAttr( 'title' );
+       }
+
+       return this;
+};
+
+/**
+ * Get title.
+ *
+ * @return {string} Title string
+ */
+OO.ui.TitledElement.prototype.getTitle = function () {
+       return this.title;
+};
+/**
+ * Generic toolbar tool.
+ *
+ * @abstract
+ * @class
+ * @extends OO.ui.Widget
+ * @mixins OO.ui.IconedElement
+ *
+ * @constructor
+ * @param {OO.ui.ToolGroup} toolGroup
+ * @param {Object} [config] Configuration options
+ * @cfg {string|Function} [title] Title text or a function that returns text
+ */
+OO.ui.Tool = function OoUiTool( toolGroup, config ) {
+       // Config intialization
+       config = config || {};
+
+       // Parent constructor
+       OO.ui.Tool.super.call( this, config );
+
+       // Mixin constructors
+       OO.ui.IconedElement.call( this, this.$( '<span>' ), config );
+
+       // Properties
+       this.toolGroup = toolGroup;
+       this.toolbar = this.toolGroup.getToolbar();
+       this.active = false;
+       this.$title = this.$( '<span>' );
+       this.$link = this.$( '<a>' );
+       this.title = null;
+
+       // Events
+       this.toolbar.connect( this, { 'updateState': 'onUpdateState' } );
+
+       // Initialization
+       this.$title.addClass( 'oo-ui-tool-title' );
+       this.$link
+               .addClass( 'oo-ui-tool-link' )
+               .append( this.$icon, this.$title );
+       this.$element
+               .data( 'oo-ui-tool', this )
+               .addClass(
+                       'oo-ui-tool ' + 'oo-ui-tool-name-' +
+                       this.constructor.static.name.replace( /^([^\/]+)\/([^\/]+).*$/, '$1-$2' )
+               )
+               .append( this.$link );
+       this.setTitle( config.title || this.constructor.static.title );
+};
+
+/* Setup */
+
+OO.inheritClass( OO.ui.Tool, OO.ui.Widget );
+OO.mixinClass( OO.ui.Tool, OO.ui.IconedElement );
+
+/* Events */
+
+/**
+ * @event select
+ */
+
+/* Static Properties */
+
+/**
+ * @static
+ * @inheritdoc
+ */
+OO.ui.Tool.static.tagName = 'span';
+
+/**
+ * Symbolic name of tool.
+ *
+ * @abstract
+ * @static
+ * @inheritable
+ * @property {string}
+ */
+OO.ui.Tool.static.name = '';
+
+/**
+ * Tool group.
+ *
+ * @abstract
+ * @static
+ * @inheritable
+ * @property {string}
+ */
+OO.ui.Tool.static.group = '';
+
+/**
+ * Tool title.
+ *
+ * Title is used as a tooltip when the tool is part of a bar tool group, or a label when the tool
+ * is part of a list or menu tool group. If a trigger is associated with an action by the same name
+ * as the tool, a description of its keyboard shortcut for the appropriate platform will be
+ * appended to the title if the tool is part of a bar tool group.
+ *
+ * @abstract
+ * @static
+ * @inheritable
+ * @property {string|Function} Title text or a function that returns text
+ */
+OO.ui.Tool.static.title = '';
+
+/**
+ * Tool can be automatically added to catch-all groups.
+ *
+ * @static
+ * @inheritable
+ * @property {boolean}
+ */
+OO.ui.Tool.static.autoAddToCatchall = true;
+
+/**
+ * Tool can be automatically added to named groups.
+ *
+ * @static
+ * @property {boolean}
+ * @inheritable
+ */
+OO.ui.Tool.static.autoAddToGroup = true;
+
+/**
+ * Check if this tool is compatible with given data.
+ *
+ * @static
+ * @inheritable
+ * @param {Mixed} data Data to check
+ * @return {boolean} Tool can be used with data
+ */
+OO.ui.Tool.static.isCompatibleWith = function () {
+       return false;
+};
+
+/* Methods */
+
+/**
+ * Handle the toolbar state being updated.
+ *
+ * This is an abstract method that must be overridden in a concrete subclass.
+ *
+ * @abstract
+ */
+OO.ui.Tool.prototype.onUpdateState = function () {
+       throw new Error(
+               'OO.ui.Tool.onUpdateState not implemented in this subclass:' + this.constructor
+       );
+};
+
+/**
+ * Handle the tool being selected.
+ *
+ * This is an abstract method that must be overridden in a concrete subclass.
+ *
+ * @abstract
+ */
+OO.ui.Tool.prototype.onSelect = function () {
+       throw new Error(
+               'OO.ui.Tool.onSelect not implemented in this subclass:' + this.constructor
+       );
+};
+
+/**
+ * Check if the button is active.
+ *
+ * @param {boolean} Button is active
+ */
+OO.ui.Tool.prototype.isActive = function () {
+       return this.active;
+};
+
+/**
+ * Make the button appear active or inactive.
+ *
+ * @param {boolean} state Make button appear active
+ */
+OO.ui.Tool.prototype.setActive = function ( state ) {
+       this.active = !!state;
+       if ( this.active ) {
+               this.$element.addClass( 'oo-ui-tool-active' );
+       } else {
+               this.$element.removeClass( 'oo-ui-tool-active' );
+       }
+};
+
+/**
+ * Get the tool title.
+ *
+ * @param {string|Function} title Title text or a function that returns text
+ * @chainable
+ */
+OO.ui.Tool.prototype.setTitle = function ( title ) {
+       this.title = OO.ui.resolveMsg( title );
+       this.updateTitle();
+       return this;
+};
+
+/**
+ * Get the tool title.
+ *
+ * @return {string} Title text
+ */
+OO.ui.Tool.prototype.getTitle = function () {
+       return this.title;
+};
+
+/**
+ * Get the tool's symbolic name.
+ *
+ * @return {string} Symbolic name of tool
+ */
+OO.ui.Tool.prototype.getName = function () {
+       return this.constructor.static.name;
+};
+
+/**
+ * Update the title.
+ */
+OO.ui.Tool.prototype.updateTitle = function () {
+       var titleTooltips = this.toolGroup.constructor.static.titleTooltips,
+               accelTooltips = this.toolGroup.constructor.static.accelTooltips,
+               accel = this.toolbar.getToolAccelerator( this.constructor.static.name ),
+               tooltipParts = [];
+
+       this.$title.empty()
+               .text( this.title )
+               .append(
+                       this.$( '<span>' )
+                               .addClass( 'oo-ui-tool-accel' )
+                               .text( accel )
+               );
+
+       if ( titleTooltips && typeof this.title === 'string' && this.title.length ) {
+               tooltipParts.push( this.title );
+       }
+       if ( accelTooltips && typeof accel === 'string' && accel.length ) {
+               tooltipParts.push( accel );
+       }
+       if ( tooltipParts.length ) {
+               this.$link.attr( 'title', tooltipParts.join( ' ' ) );
+       } else {
+               this.$link.removeAttr( 'title' );
+       }
+};
+
+/**
+ * Destroy tool.
+ */
+OO.ui.Tool.prototype.destroy = function () {
+       this.toolbar.disconnect( this );
+       this.$element.remove();
+};
+/**
+ * Collection of tool groups.
+ *
+ * @class
+ * @extends OO.ui.Element
+ * @mixins OO.EventEmitter
+ * @mixins OO.ui.GroupElement
+ *
+ * @constructor
+ * @param {OO.ui.ToolFactory} toolFactory Factory for creating tools
+ * @param {OO.ui.ToolGroupFactory} toolGroupFactory Factory for creating tool groups
+ * @param {Object} [config] Configuration options
+ * @cfg {boolean} [actions] Add an actions section opposite to the tools
+ * @cfg {boolean} [shadow] Add a shadow below the toolbar
+ */
+OO.ui.Toolbar = function OoUiToolbar( toolFactory, toolGroupFactory, config ) {
+       // Configuration initialization
+       config = config || {};
+
+       // Parent constructor
+       OO.ui.Toolbar.super.call( this, config );
+
+       // Mixin constructors
+       OO.EventEmitter.call( this );
+       OO.ui.GroupElement.call( this, this.$( '<div>' ), config );
+
+       // Properties
+       this.toolFactory = toolFactory;
+       this.toolGroupFactory = toolGroupFactory;
+       this.groups = [];
+       this.tools = {};
+       this.$bar = this.$( '<div>' );
+       this.$actions = this.$( '<div>' );
+       this.initialized = false;
+
+       // Events
+       this.$element
+               .add( this.$bar ).add( this.$group ).add( this.$actions )
+               .on( 'mousedown', OO.ui.bind( this.onMouseDown, this ) );
+
+       // Initialization
+       this.$group.addClass( 'oo-ui-toolbar-tools' );
+       this.$bar.addClass( 'oo-ui-toolbar-bar' ).append( this.$group );
+       if ( config.actions ) {
+               this.$actions.addClass( 'oo-ui-toolbar-actions' );
+               this.$bar.append( this.$actions );
+       }
+       this.$bar.append( '<div style="clear:both"></div>' );
+       if ( config.shadow ) {
+               this.$bar.append( '<div class="oo-ui-toolbar-shadow"></div>' );
+       }
+       this.$element.addClass( 'oo-ui-toolbar' ).append( this.$bar );
+};
+
+/* Setup */
+
+OO.inheritClass( OO.ui.Toolbar, OO.ui.Element );
+OO.mixinClass( OO.ui.Toolbar, OO.EventEmitter );
+OO.mixinClass( OO.ui.Toolbar, OO.ui.GroupElement );
+
+/* Methods */
+
+/**
+ * Get the tool factory.
+ *
+ * @return {OO.ui.ToolFactory} Tool factory
+ */
+OO.ui.Toolbar.prototype.getToolFactory = function () {
+       return this.toolFactory;
+};
+
+/**
+ * Get the tool group factory.
+ *
+ * @return {OO.Factory} Tool group factory
+ */
+OO.ui.Toolbar.prototype.getToolGroupFactory = function () {
+       return this.toolGroupFactory;
+};
+
+/**
+ * Handles mouse down events.
+ *
+ * @param {jQuery.Event} e Mouse down event
+ */
+OO.ui.Toolbar.prototype.onMouseDown = function ( e ) {
+       var $closestWidgetToEvent = this.$( e.target ).closest( '.oo-ui-widget' ),
+               $closestWidgetToToolbar = this.$element.closest( '.oo-ui-widget' );
+       if ( !$closestWidgetToEvent.length || $closestWidgetToEvent[0] === $closestWidgetToToolbar[0] ) {
+               return false;
+       }
+};
+
+/**
+ * Sets up handles and preloads required information for the toolbar to work.
+ * This must be called immediately after it is attached to a visible document.
+ */
+OO.ui.Toolbar.prototype.initialize = function () {
+       this.initialized = true;
+};
+
+/**
+ * Setup toolbar.
+ *
+ * Tools can be specified in the following ways:
+ *
+ * - A specific tool: `{ 'name': 'tool-name' }` or `'tool-name'`
+ * - All tools in a group: `{ 'group': 'group-name' }`
+ * - All tools: `'*'` - Using this will make the group a list with a "More" label by default
+ *
+ * @param {Object.<string,Array>} groups List of tool group configurations
+ * @param {Array|string} [groups.include] Tools to include
+ * @param {Array|string} [groups.exclude] Tools to exclude
+ * @param {Array|string} [groups.promote] Tools to promote to the beginning
+ * @param {Array|string} [groups.demote] Tools to demote to the end
+ */
+OO.ui.Toolbar.prototype.setup = function ( groups ) {
+       var i, len, type, group,
+               items = [],
+               defaultType = 'bar';
+
+       // Cleanup previous groups
+       this.reset();
+
+       // Build out new groups
+       for ( i = 0, len = groups.length; i < len; i++ ) {
+               group = groups[i];
+               if ( group.include === '*' ) {
+                       // Apply defaults to catch-all groups
+                       if ( group.type === undefined ) {
+                               group.type = 'list';
+                       }
+                       if ( group.label === undefined ) {
+                               group.label = 'ooui-toolbar-more';
+                       }
+               }
+               // Check type has been registered
+               type = this.getToolGroupFactory().lookup( group.type ) ? group.type : defaultType;
+               items.push(
+                       this.getToolGroupFactory().create( type, this, $.extend( { '$': this.$ }, group ) )
+               );
+       }
+       this.addItems( items );
+};
+
+/**
+ * Remove all tools and groups from the toolbar.
+ */
+OO.ui.Toolbar.prototype.reset = function () {
+       var i, len;
+
+       this.groups = [];
+       this.tools = {};
+       for ( i = 0, len = this.items.length; i < len; i++ ) {
+               this.items[i].destroy();
+       }
+       this.clearItems();
+};
+
+/**
+ * Destroys toolbar, removing event handlers and DOM elements.
+ *
+ * Call this whenever you are done using a toolbar.
+ */
+OO.ui.Toolbar.prototype.destroy = function () {
+       this.reset();
+       this.$element.remove();
+};
+
+/**
+ * Check if tool has not been used yet.
+ *
+ * @param {string} name Symbolic name of tool
+ * @return {boolean} Tool is available
+ */
+OO.ui.Toolbar.prototype.isToolAvailable = function ( name ) {
+       return !this.tools[name];
+};
+
+/**
+ * Prevent tool from being used again.
+ *
+ * @param {OO.ui.Tool} tool Tool to reserve
+ */
+OO.ui.Toolbar.prototype.reserveTool = function ( tool ) {
+       this.tools[tool.getName()] = tool;
+};
+
+/**
+ * Allow tool to be used again.
+ *
+ * @param {OO.ui.Tool} tool Tool to release
+ */
+OO.ui.Toolbar.prototype.releaseTool = function ( tool ) {
+       delete this.tools[tool.getName()];
+};
+
+/**
+ * Get accelerator label for tool.
+ *
+ * This is a stub that should be overridden to provide access to accelerator information.
+ *
+ * @param {string} name Symbolic name of tool
+ * @return {string|undefined} Tool accelerator label if available
+ */
+OO.ui.Toolbar.prototype.getToolAccelerator = function () {
+       return undefined;
+};
+/**
+ * Factory for tools.
+ *
+ * @class
+ * @extends OO.Factory
+ * @constructor
+ */
+OO.ui.ToolFactory = function OoUiToolFactory() {
+       // Parent constructor
+       OO.ui.ToolFactory.super.call( this );
+};
+
+/* Setup */
+
+OO.inheritClass( OO.ui.ToolFactory, OO.Factory );
+
+/* Methods */
+
+/** */
+OO.ui.ToolFactory.prototype.getTools = function ( include, exclude, promote, demote ) {
+       var i, len, included, promoted, demoted,
+               auto = [],
+               used = {};
+
+       // Collect included and not excluded tools
+       included = OO.simpleArrayDifference( this.extract( include ), this.extract( exclude ) );
+
+       // Promotion
+       promoted = this.extract( promote, used );
+       demoted = this.extract( demote, used );
+
+       // Auto
+       for ( i = 0, len = included.length; i < len; i++ ) {
+               if ( !used[included[i]] ) {
+                       auto.push( included[i] );
+               }
+       }
+
+       return promoted.concat( auto ).concat( demoted );
+};
+
+/**
+ * Get a flat list of names from a list of names or groups.
+ *
+ * Tools can be specified in the following ways:
+ *
+ * - A specific tool: `{ 'name': 'tool-name' }` or `'tool-name'`
+ * - All tools in a group: `{ 'group': 'group-name' }`
+ * - All tools: `'*'`
+ *
+ * @private
+ * @param {Array|string} collection List of tools
+ * @param {Object} [used] Object with names that should be skipped as properties; extracted
+ *  names will be added as properties
+ * @return {string[]} List of extracted names
+ */
+OO.ui.ToolFactory.prototype.extract = function ( collection, used ) {
+       var i, len, item, name, tool,
+               names = [];
+
+       if ( collection === '*' ) {
+               for ( name in this.registry ) {
+                       tool = this.registry[name];
+                       if (
+                               // Only add tools by group name when auto-add is enabled
+                               tool.static.autoAddToCatchall &&
+                               // Exclude already used tools
+                               ( !used || !used[name] )
+                       ) {
+                               names.push( name );
+                               if ( used ) {
+                                       used[name] = true;
+                               }
+                       }
+               }
+       } else if ( $.isArray( collection ) ) {
+               for ( i = 0, len = collection.length; i < len; i++ ) {
+                       item = collection[i];
+                       // Allow plain strings as shorthand for named tools
+                       if ( typeof item === 'string' ) {
+                               item = { 'name': item };
+                       }
+                       if ( OO.isPlainObject( item ) ) {
+                               if ( item.group ) {
+                                       for ( name in this.registry ) {
+                                               tool = this.registry[name];
+                                               if (
+                                                       // Include tools with matching group
+                                                       tool.static.group === item.group &&
+                                                       // Only add tools by group name when auto-add is enabled
+                                                       tool.static.autoAddToGroup &&
+                                                       // Exclude already used tools
+                                                       ( !used || !used[name] )
+                                               ) {
+                                                       names.push( name );
+                                                       if ( used ) {
+                                                               used[name] = true;
+                                                       }
+                                               }
+                                       }
+                               // Include tools with matching name and exclude already used tools
+                               } else if ( item.name && ( !used || !used[item.name] ) ) {
+                                       names.push( item.name );
+                                       if ( used ) {
+                                               used[item.name] = true;
+                                       }
+                               }
+                       }
+               }
+       }
+       return names;
+};
+/**
+ * Collection of tools.
+ *
+ * Tools can be specified in the following ways:
+ *
+ * - A specific tool: `{ 'name': 'tool-name' }` or `'tool-name'`
+ * - All tools in a group: `{ 'group': 'group-name' }`
+ * - All tools: `'*'`
+ *
+ * @abstract
+ * @class
+ * @extends OO.ui.Widget
+ * @mixins OO.ui.GroupElement
+ *
+ * @constructor
+ * @param {OO.ui.Toolbar} toolbar
+ * @param {Object} [config] Configuration options
+ * @cfg {Array|string} [include=[]] List of tools to include
+ * @cfg {Array|string} [exclude=[]] List of tools to exclude
+ * @cfg {Array|string} [promote=[]] List of tools to promote to the beginning
+ * @cfg {Array|string} [demote=[]] List of tools to demote to the end
+ */
+OO.ui.ToolGroup = function OoUiToolGroup( toolbar, config ) {
+       // Configuration initialization
+       config = $.extend( true, {
+               'aggregations': { 'disable': 'itemDisable' }
+       }, config );
+
+       // Parent constructor
+       OO.ui.ToolGroup.super.call( this, config );
+
+       // Mixin constructors
+       OO.ui.GroupElement.call( this, this.$( '<div>' ), config );
+
+       // Properties
+       this.toolbar = toolbar;
+       this.tools = {};
+       this.pressed = null;
+       this.autoDisabled = false;
+       this.include = config.include || [];
+       this.exclude = config.exclude || [];
+       this.promote = config.promote || [];
+       this.demote = config.demote || [];
+       this.onCapturedMouseUpHandler = OO.ui.bind( this.onCapturedMouseUp, this );
+
+       // Events
+       this.$element.on( {
+               'mousedown': OO.ui.bind( this.onMouseDown, this ),
+               'mouseup': OO.ui.bind( this.onMouseUp, this ),
+               'mouseover': OO.ui.bind( this.onMouseOver, this ),
+               'mouseout': OO.ui.bind( this.onMouseOut, this )
+       } );
+       this.toolbar.getToolFactory().connect( this, { 'register': 'onToolFactoryRegister' } );
+       this.connect( this, { 'itemDisable': 'updateDisabled' } );
+
+       // Initialization
+       this.$group.addClass( 'oo-ui-toolGroup-tools' );
+       this.$element
+               .addClass( 'oo-ui-toolGroup' )
+               .append( this.$group );
+       this.populate();
+};
+
+/* Setup */
+
+OO.inheritClass( OO.ui.ToolGroup, OO.ui.Widget );
+OO.mixinClass( OO.ui.ToolGroup, OO.ui.GroupElement );
+
+/* Events */
+
+/**
+ * @event update
+ */
+
+/* Static Properties */
+
+/**
+ * Show labels in tooltips.
+ *
+ * @static
+ * @inheritable
+ * @property {boolean}
+ */
+OO.ui.ToolGroup.static.titleTooltips = false;
+
+/**
+ * Show acceleration labels in tooltips.
+ *
+ * @static
+ * @inheritable
+ * @property {boolean}
+ */
+OO.ui.ToolGroup.static.accelTooltips = false;
+
+/**
+ * Automatically disable the toolgroup when all tools are disabled
+ *
+ * @static
+ * @inheritable
+ * @property {boolean}
+ */
+OO.ui.ToolGroup.static.autoDisable = true;
+
+/* Methods */
+
+/**
+ * @inheritdoc
+ */
+OO.ui.ToolGroup.prototype.isDisabled = function () {
+       return this.autoDisabled || OO.ui.ToolGroup.super.prototype.isDisabled.apply( this, arguments );
+};
+
+/**
+ * @inheritdoc
+ */
+OO.ui.ToolGroup.prototype.updateDisabled = function () {
+       var i, item, allDisabled = true;
+
+       if ( this.constructor.static.autoDisable ) {
+               for ( i = this.items.length - 1; i >= 0; i-- ) {
+                       item = this.items[i];
+                       if ( !item.isDisabled() ) {
+                               allDisabled = false;
+                               break;
+                       }
+               }
+               this.autoDisabled = allDisabled;
+       }
+       OO.ui.ToolGroup.super.prototype.updateDisabled.apply( this, arguments );
+};
+
+/**
+ * Handle mouse down events.
+ *
+ * @param {jQuery.Event} e Mouse down event
+ */
+OO.ui.ToolGroup.prototype.onMouseDown = function ( e ) {
+       if ( !this.disabled && e.which === 1 ) {
+               this.pressed = this.getTargetTool( e );
+               if ( this.pressed ) {
+                       this.pressed.setActive( true );
+                       this.getElementDocument().addEventListener(
+                               'mouseup', this.onCapturedMouseUpHandler, true
+                       );
+                       return false;
+               }
+       }
+};
+
+/**
+ * Handle captured mouse up events.
+ *
+ * @param {Event} e Mouse up event
+ */
+OO.ui.ToolGroup.prototype.onCapturedMouseUp = function ( e ) {
+       this.getElementDocument().removeEventListener( 'mouseup', this.onCapturedMouseUpHandler, true );
+       // onMouseUp may be called a second time, depending on where the mouse is when the button is
+       // released, but since `this.pressed` will no longer be true, the second call will be ignored.
+       this.onMouseUp( e );
+};
+
+/**
+ * Handle mouse up events.
+ *
+ * @param {jQuery.Event} e Mouse up event
+ */
+OO.ui.ToolGroup.prototype.onMouseUp = function ( e ) {
+       var tool = this.getTargetTool( e );
+
+       if ( !this.disabled && e.which === 1 && this.pressed && this.pressed === tool ) {
+               this.pressed.onSelect();
+       }
+
+       this.pressed = null;
+       return false;
+};
+
+/**
+ * Handle mouse over events.
+ *
+ * @param {jQuery.Event} e Mouse over event
+ */
+OO.ui.ToolGroup.prototype.onMouseOver = function ( e ) {
+       var tool = this.getTargetTool( e );
+
+       if ( this.pressed && this.pressed === tool ) {
+               this.pressed.setActive( true );
+       }
+};
+
+/**
+ * Handle mouse out events.
+ *
+ * @param {jQuery.Event} e Mouse out event
+ */
+OO.ui.ToolGroup.prototype.onMouseOut = function ( e ) {
+       var tool = this.getTargetTool( e );
+
+       if ( this.pressed && this.pressed === tool ) {
+               this.pressed.setActive( false );
+       }
+};
+
+/**
+ * Get the closest tool to a jQuery.Event.
+ *
+ * Only tool links are considered, which prevents other elements in the tool such as popups from
+ * triggering tool group interactions.
+ *
+ * @private
+ * @param {jQuery.Event} e
+ * @return {OO.ui.Tool|null} Tool, `null` if none was found
+ */
+OO.ui.ToolGroup.prototype.getTargetTool = function ( e ) {
+       var tool,
+               $item = this.$( e.target ).closest( '.oo-ui-tool-link' );
+
+       if ( $item.length ) {
+               tool = $item.parent().data( 'oo-ui-tool' );
+       }
+
+       return tool && !tool.isDisabled() ? tool : null;
+};
+
+/**
+ * Handle tool registry register events.
+ *
+ * If a tool is registered after the group is created, we must repopulate the list to account for:
+ *
+ * - a tool being added that may be included
+ * - a tool already included being overridden
+ *
+ * @param {string} name Symbolic name of tool
+ */
+OO.ui.ToolGroup.prototype.onToolFactoryRegister = function () {
+       this.populate();
+};
+
+/**
+ * Get the toolbar this group is in.
+ *
+ * @return {OO.ui.Toolbar} Toolbar of group
+ */
+OO.ui.ToolGroup.prototype.getToolbar = function () {
+       return this.toolbar;
+};
+
+/**
+ * Add and remove tools based on configuration.
+ */
+OO.ui.ToolGroup.prototype.populate = function () {
+       var i, len, name, tool,
+               toolFactory = this.toolbar.getToolFactory(),
+               names = {},
+               add = [],
+               remove = [],
+               list = this.toolbar.getToolFactory().getTools(
+                       this.include, this.exclude, this.promote, this.demote
+               );
+
+       // Build a list of needed tools
+       for ( i = 0, len = list.length; i < len; i++ ) {
+               name = list[i];
+               if (
+                       // Tool exists
+                       toolFactory.lookup( name ) &&
+                       // Tool is available or is already in this group
+                       ( this.toolbar.isToolAvailable( name ) || this.tools[name] )
+               ) {
+                       tool = this.tools[name];
+                       if ( !tool ) {
+                               // Auto-initialize tools on first use
+                               this.tools[name] = tool = toolFactory.create( name, this );
+                               tool.updateTitle();
+                       }
+                       this.toolbar.reserveTool( tool );
+                       add.push( tool );
+                       names[name] = true;
+               }
+       }
+       // Remove tools that are no longer needed
+       for ( name in this.tools ) {
+               if ( !names[name] ) {
+                       this.tools[name].destroy();
+                       this.toolbar.releaseTool( this.tools[name] );
+                       remove.push( this.tools[name] );
+                       delete this.tools[name];
+               }
+       }
+       if ( remove.length ) {
+               this.removeItems( remove );
+       }
+       // Update emptiness state
+       if ( add.length ) {
+               this.$element.removeClass( 'oo-ui-toolGroup-empty' );
+       } else {
+               this.$element.addClass( 'oo-ui-toolGroup-empty' );
+       }
+       // Re-add tools (moving existing ones to new locations)
+       this.addItems( add );
+       // Disabled state may depend on items
+       this.updateDisabled();
+};
+
+/**
+ * Destroy tool group.
+ */
+OO.ui.ToolGroup.prototype.destroy = function () {
+       var name;
+
+       this.clearItems();
+       this.toolbar.getToolFactory().disconnect( this );
+       for ( name in this.tools ) {
+               this.toolbar.releaseTool( this.tools[name] );
+               this.tools[name].disconnect( this ).destroy();
+               delete this.tools[name];
+       }
+       this.$element.remove();
+};
+/**
+ * Factory for tool groups.
+ *
+ * @class
+ * @extends OO.Factory
+ * @constructor
+ */
+OO.ui.ToolGroupFactory = function OoUiToolGroupFactory() {
+       // Parent constructor
+       OO.Factory.call( this );
+
+       var i, l,
+               defaultClasses = this.constructor.static.getDefaultClasses();
+
+       // Register default toolgroups
+       for ( i = 0, l = defaultClasses.length; i < l; i++ ) {
+               this.register( defaultClasses[i] );
+       }
+};
+
+/* Setup */
+
+OO.inheritClass( OO.ui.ToolGroupFactory, OO.Factory );
+
+/* Static Methods */
+
+/**
+ * Get a default set of classes to be registered on construction
+ *
+ * @return {Function[]} Default classes
+ */
+OO.ui.ToolGroupFactory.static.getDefaultClasses = function () {
+       return [
+               OO.ui.BarToolGroup,
+               OO.ui.ListToolGroup,
+               OO.ui.MenuToolGroup
+       ];
+};
+/**
+ * Layout made of a fieldset and optional legend.
+ *
+ * Just add OO.ui.FieldLayout items.
+ *
+ * @class
+ * @extends OO.ui.Layout
+ * @mixins OO.ui.LabeledElement
+ * @mixins OO.ui.IconedElement
+ * @mixins OO.ui.GroupElement
+ *
+ * @constructor
+ * @param {Object} [config] Configuration options
+ * @cfg {string} [icon] Symbolic icon name
+ * @cfg {OO.ui.FieldLayout[]} [items] Items to add
+ */
+OO.ui.FieldsetLayout = function OoUiFieldsetLayout( config ) {
+       // Config initialization
+       config = config || {};
+
+       // Parent constructor
+       OO.ui.FieldsetLayout.super.call( this, config );
+
+       // Mixin constructors
+       OO.ui.IconedElement.call( this, this.$( '<div>' ), config );
+       OO.ui.LabeledElement.call( this, this.$( '<legend>' ), config );
+       OO.ui.GroupElement.call( this, this.$( '<div>' ), config );
+
+       // Initialization
+       this.$element
+               .addClass( 'oo-ui-fieldsetLayout' )
+               .append( this.$icon, this.$label, this.$group );
+       if ( $.isArray( config.items ) ) {
+               this.addItems( config.items );
+       }
+};
+
+/* Setup */
+
+OO.inheritClass( OO.ui.FieldsetLayout, OO.ui.Layout );
+OO.mixinClass( OO.ui.FieldsetLayout, OO.ui.IconedElement );
+OO.mixinClass( OO.ui.FieldsetLayout, OO.ui.LabeledElement );
+OO.mixinClass( OO.ui.FieldsetLayout, OO.ui.GroupElement );
+
+/* Static Properties */
+
+OO.ui.FieldsetLayout.static.tagName = 'fieldset';
+/**
+ * Layout made of a field and optional label.
+ *
+ * @class
+ * @extends OO.ui.Layout
+ * @mixins OO.ui.LabeledElement
+ *
+ * Available label alignment modes include:
+ *  - 'left': Label is before the field and aligned away from it, best for when the user will be
+ *    scanning for a specific label in a form with many fields
+ *  - 'right': Label is before the field and aligned toward it, best for forms the user is very
+ *    familiar with and will tab through field checking quickly to verify which field they are in
+ *  - 'top': Label is before the field and above it, best for when the use will need to fill out all
+ *    fields from top to bottom in a form with few fields
+ *  - 'inline': Label is after the field and aligned toward it, best for small boolean fields like
+ *    checkboxes or radio buttons
+ *
+ * @constructor
+ * @param {OO.ui.Widget} field Field widget
+ * @param {Object} [config] Configuration options
+ * @cfg {string} [align='left'] Alignment mode, either 'left', 'right', 'top' or 'inline'
+ */
+OO.ui.FieldLayout = function OoUiFieldLayout( field, config ) {
+       // Config initialization
+       config = $.extend( { 'align': 'left' }, config );
+
+       // Parent constructor
+       OO.ui.FieldLayout.super.call( this, config );
+
+       // Mixin constructors
+       OO.ui.LabeledElement.call( this, this.$( '<label>' ), config );
+
+       // Properties
+       this.$field = this.$( '<div>' );
+       this.field = field;
+       this.align = null;
+
+       // Events
+       if ( this.field instanceof OO.ui.InputWidget ) {
+               this.$label.on( 'click', OO.ui.bind( this.onLabelClick, this ) );
+       }
+       this.field.connect( this, { 'disable': 'onFieldDisable' } );
+
+       // Initialization
+       this.$element.addClass( 'oo-ui-fieldLayout' );
+       this.$field
+               .addClass( 'oo-ui-fieldLayout-field' )
+               .toggleClass( 'oo-ui-fieldLayout-disable', this.field.isDisabled() )
+               .append( this.field.$element );
+       this.setAlignment( config.align );
+};
+
+/* Setup */
+
+OO.inheritClass( OO.ui.FieldLayout, OO.ui.Layout );
+OO.mixinClass( OO.ui.FieldLayout, OO.ui.LabeledElement );
+
+/* Methods */
+
+/**
+ * Handle field disable events.
+ *
+ * @param {boolean} value Field is disabled
+ */
+OO.ui.FieldLayout.prototype.onFieldDisable = function ( value ) {
+       this.$element.toggleClass( 'oo-ui-fieldLayout-disabled', value );
+};
+
+/**
+ * Handle label mouse click events.
+ *
+ * @param {jQuery.Event} e Mouse click event
+ */
+OO.ui.FieldLayout.prototype.onLabelClick = function () {
+       this.field.simulateLabelClick();
+       return false;
+};
+
+/**
+ * Get the field.
+ *
+ * @return {OO.ui.Widget} Field widget
+ */
+OO.ui.FieldLayout.prototype.getField = function () {
+       return this.field;
+};
+
+/**
+ * Set the field alignment mode.
+ *
+ * @param {string} value Alignment mode, either 'left', 'right', 'top' or 'inline'
+ * @chainable
+ */
+OO.ui.FieldLayout.prototype.setAlignment = function ( value ) {
+       if ( value !== this.align ) {
+               // Default to 'left'
+               if ( [ 'left', 'right', 'top', 'inline' ].indexOf( value ) === -1 ) {
+                       value = 'left';
+               }
+               // Reorder elements
+               if ( value === 'inline' ) {
+                       this.$element.append( this.$field, this.$label );
+               } else {
+                       this.$element.append( this.$label, this.$field );
+               }
+               // Set classes
+               if ( this.align ) {
+                       this.$element.removeClass( 'oo-ui-fieldLayout-align-' + this.align );
+               }
+               this.align = value;
+               this.$element.addClass( 'oo-ui-fieldLayout-align-' + this.align );
+       }
+
+       return this;
+};
+/**
+ * Layout made of proportionally sized columns and rows.
+ *
+ * @class
+ * @extends OO.ui.Layout
+ *
+ * @constructor
+ * @param {OO.ui.PanelLayout[]} panels Panels in the grid
+ * @param {Object} [config] Configuration options
+ * @cfg {number[]} [widths] Widths of columns as ratios
+ * @cfg {number[]} [heights] Heights of columns as ratios
+ */
+OO.ui.GridLayout = function OoUiGridLayout( panels, config ) {
+       var i, len, widths;
+
+       // Config initialization
+       config = config || {};
+
+       // Parent constructor
+       OO.ui.GridLayout.super.call( this, config );
+
+       // Properties
+       this.panels = [];
+       this.widths = [];
+       this.heights = [];
+
+       // Initialization
+       this.$element.addClass( 'oo-ui-gridLayout' );
+       for ( i = 0, len = panels.length; i < len; i++ ) {
+               this.panels.push( panels[i] );
+               this.$element.append( panels[i].$element );
+       }
+       if ( config.widths || config.heights ) {
+               this.layout( config.widths || [1], config.heights || [1] );
+       } else {
+               // Arrange in columns by default
+               widths = [];
+               for ( i = 0, len = this.panels.length; i < len; i++ ) {
+                       widths[i] = 1;
+               }
+               this.layout( widths, [1] );
+       }
+};
+
+/* Setup */
+
+OO.inheritClass( OO.ui.GridLayout, OO.ui.Layout );
+
+/* Events */
+
+/**
+ * @event layout
+ */
+
+/**
+ * @event update
+ */
+
+/* Static Properties */
+
+OO.ui.GridLayout.static.tagName = 'div';
+
+/* Methods */
+
+/**
+ * Set grid dimensions.
+ *
+ * @param {number[]} widths Widths of columns as ratios
+ * @param {number[]} heights Heights of rows as ratios
+ * @fires layout
+ * @throws {Error} If grid is not large enough to fit all panels
+ */
+OO.ui.GridLayout.prototype.layout = function ( widths, heights ) {
+       var x, y,
+               xd = 0,
+               yd = 0,
+               cols = widths.length,
+               rows = heights.length;
+
+       // Verify grid is big enough to fit panels
+       if ( cols * rows < this.panels.length ) {
+               throw new Error( 'Grid is not large enough to fit ' + this.panels.length + 'panels' );
+       }
+
+       // Sum up denominators
+       for ( x = 0; x < cols; x++ ) {
+               xd += widths[x];
+       }
+       for ( y = 0; y < rows; y++ ) {
+               yd += heights[y];
+       }
+       // Store factors
+       this.widths = [];
+       this.heights = [];
+       for ( x = 0; x < cols; x++ ) {
+               this.widths[x] = widths[x] / xd;
+       }
+       for ( y = 0; y < rows; y++ ) {
+               this.heights[y] = heights[y] / yd;
+       }
+       // Synchronize view
+       this.update();
+       this.emit( 'layout' );
+};
+
+/**
+ * Update panel positions and sizes.
+ *
+ * @fires update
+ */
+OO.ui.GridLayout.prototype.update = function () {
+       var x, y, panel,
+               i = 0,
+               left = 0,
+               top = 0,
+               dimensions,
+               width = 0,
+               height = 0,
+               cols = this.widths.length,
+               rows = this.heights.length;
+
+       for ( y = 0; y < rows; y++ ) {
+               for ( x = 0; x < cols; x++ ) {
+                       panel = this.panels[i];
+                       width = this.widths[x];
+                       height = this.heights[y];
+                       dimensions = {
+                               'width': Math.round( width * 100 ) + '%',
+                               'height': Math.round( height * 100 ) + '%',
+                               'top': Math.round( top * 100 ) + '%'
+                       };
+                       // If RTL, reverse:
+                       if ( OO.ui.Element.getDir( this.$.context ) === 'rtl' ) {
+                               dimensions.right = Math.round( left * 100 ) + '%';
+                       } else {
+                               dimensions.left = Math.round( left * 100 ) + '%';
+                       }
+                       panel.$element.css( dimensions );
+                       i++;
+                       left += width;
+               }
+               top += height;
+               left = 0;
+       }
+
+       this.emit( 'update' );
+};
+
+/**
+ * Get a panel at a given position.
+ *
+ * The x and y position is affected by the current grid layout.
+ *
+ * @param {number} x Horizontal position
+ * @param {number} y Vertical position
+ * @return {OO.ui.PanelLayout} The panel at the given postion
+ */
+OO.ui.GridLayout.prototype.getPanel = function ( x, y ) {
+       return this.panels[( x * this.widths.length ) + y];
+};
+/**
+ * Layout containing a series of pages.
+ *
+ * @class
+ * @extends OO.ui.Layout
+ *
+ * @constructor
+ * @param {Object} [config] Configuration options
+ * @cfg {boolean} [continuous=false] Show all pages, one after another
+ * @cfg {boolean} [autoFocus=false] Focus on the first focusable element when changing to a page
+ * @cfg {boolean} [outlined=false] Show an outline
+ * @cfg {boolean} [editable=false] Show controls for adding, removing and reordering pages
+ * @cfg {Object[]} [adders] List of adders for controls, each with name, icon and title properties
+ */
+OO.ui.BookletLayout = function OoUiBookletLayout( config ) {
+       // Initialize configuration
+       config = config || {};
+
+       // Parent constructor
+       OO.ui.BookletLayout.super.call( this, config );
+
+       // Properties
+       this.currentPageName = null;
+       this.pages = {};
+       this.ignoreFocus = false;
+       this.stackLayout = new OO.ui.StackLayout( { '$': this.$, 'continuous': !!config.continuous } );
+       this.autoFocus = !!config.autoFocus;
+       this.outlineVisible = false;
+       this.outlined = !!config.outlined;
+       if ( this.outlined ) {
+               this.editable = !!config.editable;
+               this.adders = config.adders || null;
+               this.outlineControlsWidget = null;
+               this.outlineWidget = new OO.ui.OutlineWidget( { '$': this.$ } );
+               this.outlinePanel = new OO.ui.PanelLayout( { '$': this.$, 'scrollable': true } );
+               this.gridLayout = new OO.ui.GridLayout(
+                       [this.outlinePanel, this.stackLayout], { '$': this.$, 'widths': [1, 2] }
+               );
+               this.outlineVisible = true;
+               if ( this.editable ) {
+                       this.outlineControlsWidget = new OO.ui.OutlineControlsWidget(
+                               this.outlineWidget,
+                               { '$': this.$, 'adders': this.adders }
+                       );
+               }
+       }
+
+       // Events
+       this.stackLayout.connect( this, { 'set': 'onStackLayoutSet' } );
+       if ( this.outlined ) {
+               this.outlineWidget.connect( this, { 'select': 'onOutlineWidgetSelect' } );
+       }
+       if ( this.autoFocus ) {
+               // Event 'focus' does not bubble, but 'focusin' does
+               this.stackLayout.onDOMEvent( 'focusin', OO.ui.bind( this.onStackLayoutFocus, this ) );
+       }
+
+       // Initialization
+       this.$element.addClass( 'oo-ui-bookletLayout' );
+       this.stackLayout.$element.addClass( 'oo-ui-bookletLayout-stackLayout' );
+       if ( this.outlined ) {
+               this.outlinePanel.$element
+                       .addClass( 'oo-ui-bookletLayout-outlinePanel' )
+                       .append( this.outlineWidget.$element );
+               if ( this.editable ) {
+                       this.outlinePanel.$element
+                               .addClass( 'oo-ui-bookletLayout-outlinePanel-editable' )
+                               .append( this.outlineControlsWidget.$element );
+               }
+               this.$element.append( this.gridLayout.$element );
+       } else {
+               this.$element.append( this.stackLayout.$element );
+       }
+};
+
+/* Setup */
+
+OO.inheritClass( OO.ui.BookletLayout, OO.ui.Layout );
+
+/* Events */
+
+/**
+ * @event set
+ * @param {OO.ui.PageLayout} page Current page
+ */
+
+/**
+ * @event add
+ * @param {OO.ui.PageLayout[]} page Added pages
+ * @param {number} index Index pages were added at
+ */
+
+/**
+ * @event remove
+ * @param {OO.ui.PageLayout[]} pages Removed pages
+ */
+
+/* Methods */
+
+/**
+ * Handle stack layout focus.
+ *
+ * @param {jQuery.Event} e Focusin event
+ */
+OO.ui.BookletLayout.prototype.onStackLayoutFocus = function ( e ) {
+       var name, $target;
+
+       if ( this.ignoreFocus ) {
+               // Avoid recursion from programmatic focus trigger in #onStackLayoutSet
+               return;
+       }
+
+       $target = $( e.target ).closest( '.oo-ui-pageLayout' );
+       for ( name in this.pages ) {
+               if ( this.pages[ name ].$element[0] === $target[0] ) {
+                       this.setPage( name );
+                       break;
+               }
+       }
+};
+
+/**
+ * Handle stack layout set events.
+ *
+ * @param {OO.ui.PanelLayout|null} page The page panel that is now the current panel
+ */
+OO.ui.BookletLayout.prototype.onStackLayoutSet = function ( page ) {
+       if ( page ) {
+               this.stackLayout.$element.find( ':focus' ).blur();
+               page.scrollElementIntoView( { 'complete': OO.ui.bind( function () {
+                       this.ignoreFocus = true;
+                       if ( this.autoFocus ) {
+                               page.$element.find( ':input:first' ).focus();
+                       }
+                       this.ignoreFocus = false;
+               }, this ) } );
+       }
+};
+
+/**
+ * Handle outline widget select events.
+ *
+ * @param {OO.ui.OptionWidget|null} item Selected item
+ */
+OO.ui.BookletLayout.prototype.onOutlineWidgetSelect = function ( item ) {
+       if ( item ) {
+               this.setPage( item.getData() );
+       }
+};
+
+/**
+ * Check if booklet has an outline.
+ *
+ * @return {boolean}
+ */
+OO.ui.BookletLayout.prototype.isOutlined = function () {
+       return this.outlined;
+};
+
+/**
+ * Check if booklet has editing controls.
+ *
+ * @return {boolean}
+ */
+OO.ui.BookletLayout.prototype.isEditable = function () {
+       return this.editable;
+};
+
+/**
+ * Check if booklet has a visible outline.
+ *
+ * @return {boolean}
+ */
+OO.ui.BookletLayout.prototype.isOutlineVisible = function () {
+       return this.outlined && this.outlineVisible;
+};
+
+/**
+ * Hide or show the outline.
+ *
+ * @param {boolean} [show] Show outline, omit to invert current state
+ * @chainable
+ */
+OO.ui.BookletLayout.prototype.toggleOutline = function ( show ) {
+       if ( this.outlined ) {
+               show = show === undefined ? !this.outlineVisible : !!show;
+               this.outlineVisible = show;
+               this.gridLayout.layout( show ? [ 1, 2 ] : [ 0, 1 ], [ 1 ] );
+       }
+
+       return this;
+};
+
+/**
+ * Get the outline widget.
+ *
+ * @param {OO.ui.PageLayout} page Page to be selected
+ * @return {OO.ui.PageLayout|null} Closest page to another
+ */
+OO.ui.BookletLayout.prototype.getClosestPage = function ( page ) {
+       var next, prev, level,
+               pages = this.stackLayout.getItems(),
+               index = $.inArray( page, pages );
+
+       if ( index !== -1 ) {
+               next = pages[index + 1];
+               prev = pages[index - 1];
+               // Prefer adjacent pages at the same level
+               if ( this.outlined ) {
+                       level = this.outlineWidget.getItemFromData( page.getName() ).getLevel();
+                       if (
+                               prev &&
+                               level === this.outlineWidget.getItemFromData( prev.getName() ).getLevel()
+                       ) {
+                               return prev;
+                       }
+                       if (
+                               next &&
+                               level === this.outlineWidget.getItemFromData( next.getName() ).getLevel()
+                       ) {
+                               return next;
+                       }
+               }
+       }
+       return prev || next || null;
+};
+
+/**
+ * Get the outline widget.
+ *
+ * @return {OO.ui.OutlineWidget|null} Outline widget, or null if boolet has no outline
+ */
+OO.ui.BookletLayout.prototype.getOutline = function () {
+       return this.outlineWidget;
+};
+
+/**
+ * Get the outline controls widget. If the outline is not editable, null is returned.
+ *
+ * @return {OO.ui.OutlineControlsWidget|null} The outline controls widget.
+ */
+OO.ui.BookletLayout.prototype.getOutlineControls = function () {
+       return this.outlineControlsWidget;
+};
+
+/**
+ * Get a page by name.
+ *
+ * @param {string} name Symbolic name of page
+ * @return {OO.ui.PageLayout|undefined} Page, if found
+ */
+OO.ui.BookletLayout.prototype.getPage = function ( name ) {
+       return this.pages[name];
+};
+
+/**
+ * Get the current page name.
+ *
+ * @return {string|null} Current page name
+ */
+OO.ui.BookletLayout.prototype.getPageName = function () {
+       return this.currentPageName;
+};
+
+/**
+ * Add a page to the layout.
+ *
+ * When pages are added with the same names as existing pages, the existing pages will be
+ * automatically removed before the new pages are added.
+ *
+ * @param {OO.ui.PageLayout[]} pages Pages to add
+ * @param {number} index Index to insert pages after
+ * @fires add
+ * @chainable
+ */
+OO.ui.BookletLayout.prototype.addPages = function ( pages, index ) {
+       var i, len, name, page, item, currentIndex,
+               stackLayoutPages = this.stackLayout.getItems(),
+               remove = [],
+               items = [];
+
+       // Remove pages with same names
+       for ( i = 0, len = pages.length; i < len; i++ ) {
+               page = pages[i];
+               name = page.getName();
+
+               if ( Object.prototype.hasOwnProperty.call( this.pages, name ) ) {
+                       // Correct the insertion index
+                       currentIndex = $.inArray( this.pages[name], stackLayoutPages );
+                       if ( currentIndex !== -1 && currentIndex + 1 < index ) {
+                               index--;
+                       }
+                       remove.push( this.pages[name] );
+               }
+       }
+       if ( remove.length ) {
+               this.removePages( remove );
+       }
+
+       // Add new pages
+       for ( i = 0, len = pages.length; i < len; i++ ) {
+               page = pages[i];
+               name = page.getName();
+               this.pages[page.getName()] = page;
+               if ( this.outlined ) {
+                       item = new OO.ui.OutlineItemWidget( name, page, { '$': this.$ } );
+                       page.setOutlineItem( item );
+                       items.push( item );
+               }
+       }
+
+       if ( this.outlined && items.length ) {
+               this.outlineWidget.addItems( items, index );
+               this.updateOutlineWidget();
+       }
+       this.stackLayout.addItems( pages, index );
+       this.emit( 'add', pages, index );
+
+       return this;
+};
+
+/**
+ * Remove a page from the layout.
+ *
+ * @fires remove
+ * @chainable
+ */
+OO.ui.BookletLayout.prototype.removePages = function ( pages ) {
+       var i, len, name, page,
+               items = [];
+
+       for ( i = 0, len = pages.length; i < len; i++ ) {
+               page = pages[i];
+               name = page.getName();
+               delete this.pages[name];
+               if ( this.outlined ) {
+                       items.push( this.outlineWidget.getItemFromData( name ) );
+                       page.setOutlineItem( null );
+               }
+       }
+       if ( this.outlined && items.length ) {
+               this.outlineWidget.removeItems( items );
+               this.updateOutlineWidget();
+       }
+       this.stackLayout.removeItems( pages );
+       this.emit( 'remove', pages );
+
+       return this;
+};
+
+/**
+ * Clear all pages from the layout.
+ *
+ * @fires remove
+ * @chainable
+ */
+OO.ui.BookletLayout.prototype.clearPages = function () {
+       var i, len,
+               pages = this.stackLayout.getItems();
+
+       this.pages = {};
+       this.currentPageName = null;
+       if ( this.outlined ) {
+               this.outlineWidget.clearItems();
+               for ( i = 0, len = pages.length; i < len; i++ ) {
+                       pages[i].setOutlineItem( null );
+               }
+       }
+       this.stackLayout.clearItems();
+
+       this.emit( 'remove', pages );
+
+       return this;
+};
+
+/**
+ * Set the current page by name.
+ *
+ * @fires set
+ * @param {string} name Symbolic name of page
+ */
+OO.ui.BookletLayout.prototype.setPage = function ( name ) {
+       var selectedItem,
+               page = this.pages[name];
+
+       if ( name !== this.currentPageName ) {
+               if ( this.outlined ) {
+                       selectedItem = this.outlineWidget.getSelectedItem();
+                       if ( selectedItem && selectedItem.getData() !== name ) {
+                               this.outlineWidget.selectItem( this.outlineWidget.getItemFromData( name ) );
+                       }
+               }
+               if ( page ) {
+                       if ( this.currentPageName && this.pages[this.currentPageName] ) {
+                               this.pages[this.currentPageName].setActive( false );
+                       }
+                       this.currentPageName = name;
+                       this.stackLayout.setItem( page );
+                       page.setActive( true );
+                       this.emit( 'set', page );
+               }
+       }
+};
+
+/**
+ * Call this after adding or removing items from the OutlineWidget.
+ *
+ * @chainable
+ */
+OO.ui.BookletLayout.prototype.updateOutlineWidget = function () {
+       // Auto-select first item when nothing is selected anymore
+       if ( !this.outlineWidget.getSelectedItem() ) {
+               this.outlineWidget.selectItem( this.outlineWidget.getFirstSelectableItem() );
+       }
+
+       return this;
+};
+/**
+ * Layout that expands to cover the entire area of its parent, with optional scrolling and padding.
+ *
+ * @class
+ * @extends OO.ui.Layout
+ *
+ * @constructor
+ * @param {Object} [config] Configuration options
+ * @cfg {boolean} [scrollable] Allow vertical scrolling
+ * @cfg {boolean} [padded] Pad the content from the edges
+ */
+OO.ui.PanelLayout = function OoUiPanelLayout( config ) {
+       // Config initialization
+       config = config || {};
+
+       // Parent constructor
+       OO.ui.PanelLayout.super.call( this, config );
+
+       // Initialization
+       this.$element.addClass( 'oo-ui-panelLayout' );
+       if ( config.scrollable ) {
+               this.$element.addClass( 'oo-ui-panelLayout-scrollable' );
+       }
+
+       if ( config.padded ) {
+               this.$element.addClass( 'oo-ui-panelLayout-padded' );
+       }
+
+       // Add directionality class:
+       this.$element.addClass( 'oo-ui-' + OO.ui.Element.getDir( this.$.context ) );
+};
+
+/* Setup */
+
+OO.inheritClass( OO.ui.PanelLayout, OO.ui.Layout );
+/**
+ * Page within an booklet layout.
+ *
+ * @class
+ * @extends OO.ui.PanelLayout
+ *
+ * @constructor
+ * @param {string} name Unique symbolic name of page
+ * @param {Object} [config] Configuration options
+ * @param {string} [outlineItem] Outline item widget
+ */
+OO.ui.PageLayout = function OoUiPageLayout( name, config ) {
+       // Configuration initialization
+       config = $.extend( { 'scrollable': true }, config );
+
+       // Parent constructor
+       OO.ui.PageLayout.super.call( this, config );
+
+       // Properties
+       this.name = name;
+       this.outlineItem = config.outlineItem || null;
+       this.active = false;
+
+       // Initialization
+       this.$element.addClass( 'oo-ui-pageLayout' );
+};
+
+/* Setup */
+
+OO.inheritClass( OO.ui.PageLayout, OO.ui.PanelLayout );
+
+/* Events */
+
+/**
+ * @event active
+ * @param {boolean} active Page is active
+ */
+
+/* Methods */
+
+/**
+ * Get page name.
+ *
+ * @return {string} Symbolic name of page
+ */
+OO.ui.PageLayout.prototype.getName = function () {
+       return this.name;
+};
+
+/**
+ * Check if page is active.
+ *
+ * @return {boolean} Page is active
+ */
+OO.ui.PageLayout.prototype.isActive = function () {
+       return this.active;
+};
+
+/**
+ * Get outline item.
+ *
+ * @return {OO.ui.OutlineItemWidget|null} Outline item widget
+ */
+OO.ui.PageLayout.prototype.getOutlineItem = function () {
+       return this.outlineItem;
+};
+
+/**
+ * Get outline item.
+ *
+ * @param {OO.ui.OutlineItemWidget|null} outlineItem Outline item widget, null to clear
+ * @chainable
+ */
+OO.ui.PageLayout.prototype.setOutlineItem = function ( outlineItem ) {
+       this.outlineItem = outlineItem;
+       return this;
+};
+
+/**
+ * Set page active state.
+ *
+ * @param {boolean} Page is active
+ * @fires active
+ */
+OO.ui.PageLayout.prototype.setActive = function ( active ) {
+       active = !!active;
+
+       if ( active !== this.active ) {
+               this.active = active;
+               this.$element.toggleClass( 'oo-ui-pageLayout-active', active );
+               this.emit( 'active', this.active );
+       }
+};
+/**
+ * Layout containing a series of mutually exclusive pages.
+ *
+ * @class
+ * @extends OO.ui.PanelLayout
+ * @mixins OO.ui.GroupElement
+ *
+ * @constructor
+ * @param {Object} [config] Configuration options
+ * @cfg {boolean} [continuous=false] Show all pages, one after another
+ * @cfg {string} [icon=''] Symbolic icon name
+ * @cfg {OO.ui.Layout[]} [items] Layouts to add
+ */
+OO.ui.StackLayout = function OoUiStackLayout( config ) {
+       // Config initialization
+       config = $.extend( { 'scrollable': true }, config );
+
+       // Parent constructor
+       OO.ui.StackLayout.super.call( this, config );
+
+       // Mixin constructors
+       OO.ui.GroupElement.call( this, this.$element, config );
+
+       // Properties
+       this.currentItem = null;
+       this.continuous = !!config.continuous;
+
+       // Initialization
+       this.$element.addClass( 'oo-ui-stackLayout' );
+       if ( this.continuous ) {
+               this.$element.addClass( 'oo-ui-stackLayout-continuous' );
+       }
+       if ( $.isArray( config.items ) ) {
+               this.addItems( config.items );
+       }
+};
+
+/* Setup */
+
+OO.inheritClass( OO.ui.StackLayout, OO.ui.PanelLayout );
+OO.mixinClass( OO.ui.StackLayout, OO.ui.GroupElement );
+
+/* Events */
+
+/**
+ * @event set
+ * @param {OO.ui.PanelLayout|null} [item] Current item
+ */
+
+/* Methods */
+
+/**
+ * Add items.
+ *
+ * Adding an existing item (by value) will move it.
+ *
+ * @param {OO.ui.PanelLayout[]} items Items to add
+ * @param {number} [index] Index to insert items after
+ * @chainable
+ */
+OO.ui.StackLayout.prototype.addItems = function ( items, index ) {
+       OO.ui.GroupElement.prototype.addItems.call( this, items, index );
+
+       if ( !this.currentItem && items.length ) {
+               this.setItem( items[0] );
+       }
+
+       return this;
+};
+
+/**
+ * Remove items.
+ *
+ * Items will be detached, not removed, so they can be used later.
+ *
+ * @param {OO.ui.PanelLayout[]} items Items to remove
+ * @chainable
+ */
+OO.ui.StackLayout.prototype.removeItems = function ( items ) {
+       OO.ui.GroupElement.prototype.removeItems.call( this, items );
+       if ( $.inArray( this.currentItem, items  ) !== -1 ) {
+               this.currentItem = null;
+               if ( !this.currentItem && this.items.length ) {
+                       this.setItem( this.items[0] );
+               }
+       }
+
+       return this;
+};
+
+/**
+ * Clear all items.
+ *
+ * Items will be detached, not removed, so they can be used later.
+ *
+ * @chainable
+ */
+OO.ui.StackLayout.prototype.clearItems = function () {
+       this.currentItem = null;
+       OO.ui.GroupElement.prototype.clearItems.call( this );
+
+       return this;
+};
+
+/**
+ * Show item.
+ *
+ * Any currently shown item will be hidden.
+ *
+ * @param {OO.ui.PanelLayout} item Item to show
+ * @chainable
+ */
+OO.ui.StackLayout.prototype.setItem = function ( item ) {
+       if ( item !== this.currentItem ) {
+               if ( !this.continuous ) {
+                       this.$items.css( 'display', '' );
+               }
+               if ( $.inArray( item, this.items ) !== -1 ) {
+                       if ( !this.continuous ) {
+                               item.$element.css( 'display', 'block' );
+                       }
+               } else {
+                       item = null;
+               }
+               this.currentItem = item;
+               this.emit( 'set', item );
+       }
+
+       return this;
+};
+/**
+ * Horizontal bar layout of tools as icon buttons.
+ *
+ * @abstract
+ * @class
+ * @extends OO.ui.ToolGroup
+ *
+ * @constructor
+ * @param {OO.ui.Toolbar} toolbar
+ * @param {Object} [config] Configuration options
+ */
+OO.ui.BarToolGroup = function OoUiBarToolGroup( toolbar, config ) {
+       // Parent constructor
+       OO.ui.BarToolGroup.super.call( this, toolbar, config );
+
+       // Initialization
+       this.$element.addClass( 'oo-ui-barToolGroup' );
+};
+
+/* Setup */
+
+OO.inheritClass( OO.ui.BarToolGroup, OO.ui.ToolGroup );
+
+/* Static Properties */
+
+OO.ui.BarToolGroup.static.titleTooltips = true;
+
+OO.ui.BarToolGroup.static.accelTooltips = true;
+
+OO.ui.BarToolGroup.static.name = 'bar';
+/**
+ * Popup list of tools with an icon and optional label.
+ *
+ * @abstract
+ * @class
+ * @extends OO.ui.ToolGroup
+ * @mixins OO.ui.IconedElement
+ * @mixins OO.ui.IndicatedElement
+ * @mixins OO.ui.LabeledElement
+ * @mixins OO.ui.TitledElement
+ * @mixins OO.ui.ClippableElement
+ *
+ * @constructor
+ * @param {OO.ui.Toolbar} toolbar
+ * @param {Object} [config] Configuration options
+ */
+OO.ui.PopupToolGroup = function OoUiPopupToolGroup( toolbar, config ) {
+       // Configuration initialization
+       config = config || {};
+
+       // Parent constructor
+       OO.ui.PopupToolGroup.super.call( this, toolbar, config );
+
+       // Mixin constructors
+       OO.ui.IconedElement.call( this, this.$( '<span>' ), config );
+       OO.ui.IndicatedElement.call( this, this.$( '<span>' ), config );
+       OO.ui.LabeledElement.call( this, this.$( '<span>' ), config );
+       OO.ui.TitledElement.call( this, this.$element, config );
+       OO.ui.ClippableElement.call( this, this.$group, config );
+
+       // Properties
+       this.active = false;
+       this.dragging = false;
+       this.onBlurHandler = OO.ui.bind( this.onBlur, this );
+       this.$handle = this.$( '<span>' );
+
+       // Events
+       this.$handle.on( {
+               'mousedown': OO.ui.bind( this.onHandleMouseDown, this ),
+               'mouseup': OO.ui.bind( this.onHandleMouseUp, this )
+       } );
+
+       // Initialization
+       this.$handle
+               .addClass( 'oo-ui-popupToolGroup-handle' )
+               .append( this.$icon, this.$label, this.$indicator );
+       this.$element
+               .addClass( 'oo-ui-popupToolGroup' )
+               .prepend( this.$handle );
+};
+
+/* Setup */
+
+OO.inheritClass( OO.ui.PopupToolGroup, OO.ui.ToolGroup );
+OO.mixinClass( OO.ui.PopupToolGroup, OO.ui.IconedElement );
+OO.mixinClass( OO.ui.PopupToolGroup, OO.ui.IndicatedElement );
+OO.mixinClass( OO.ui.PopupToolGroup, OO.ui.LabeledElement );
+OO.mixinClass( OO.ui.PopupToolGroup, OO.ui.TitledElement );
+OO.mixinClass( OO.ui.PopupToolGroup, OO.ui.ClippableElement );
+
+/* Static Properties */
+
+/* Methods */
+
+/**
+ * @inheritdoc
+ */
+OO.ui.PopupToolGroup.prototype.setDisabled = function () {
+       // Parent method
+       OO.ui.PopupToolGroup.super.prototype.setDisabled.apply( this, arguments );
+
+       if ( this.isDisabled() && this.isElementAttached() ) {
+               this.setActive( false );
+       }
+};
+
+/**
+ * Handle focus being lost.
+ *
+ * The event is actually generated from a mouseup, so it is not a normal blur event object.
+ *
+ * @param {jQuery.Event} e Mouse up event
+ */
+OO.ui.PopupToolGroup.prototype.onBlur = function ( e ) {
+       // Only deactivate when clicking outside the dropdown element
+       if ( this.$( e.target ).closest( '.oo-ui-popupToolGroup' )[0] !== this.$element[0] ) {
+               this.setActive( false );
+       }
+};
+
+/**
+ * @inheritdoc
+ */
+OO.ui.PopupToolGroup.prototype.onMouseUp = function ( e ) {
+       if ( !this.disabled && e.which === 1 ) {
+               this.setActive( false );
+       }
+       return OO.ui.ToolGroup.prototype.onMouseUp.call( this, e );
+};
+
+/**
+ * Handle mouse up events.
+ *
+ * @param {jQuery.Event} e Mouse up event
+ */
+OO.ui.PopupToolGroup.prototype.onHandleMouseUp = function () {
+       return false;
+};
+
+/**
+ * Handle mouse down events.
+ *
+ * @param {jQuery.Event} e Mouse down event
+ */
+OO.ui.PopupToolGroup.prototype.onHandleMouseDown = function ( e ) {
+       if ( !this.disabled && e.which === 1 ) {
+               this.setActive( !this.active );
+       }
+       return false;
+};
+
+/**
+ * Switch into active mode.
+ *
+ * When active, mouseup events anywhere in the document will trigger deactivation.
+ */
+OO.ui.PopupToolGroup.prototype.setActive = function ( value ) {
+       value = !!value;
+       if ( this.active !== value ) {
+               this.active = value;
+               if ( value ) {
+                       this.setClipping( true );
+                       this.$element.addClass( 'oo-ui-popupToolGroup-active' );
+                       this.getElementDocument().addEventListener( 'mouseup', this.onBlurHandler, true );
+               } else {
+                       this.setClipping( false );
+                       this.$element.removeClass( 'oo-ui-popupToolGroup-active' );
+                       this.getElementDocument().removeEventListener( 'mouseup', this.onBlurHandler, true );
+               }
+       }
+};
+/**
+ * Drop down list layout of tools as labeled icon buttons.
+ *
+ * @abstract
+ * @class
+ * @extends OO.ui.PopupToolGroup
+ *
+ * @constructor
+ * @param {OO.ui.Toolbar} toolbar
+ * @param {Object} [config] Configuration options
+ */
+OO.ui.ListToolGroup = function OoUiListToolGroup( toolbar, config ) {
+       // Parent constructor
+       OO.ui.ListToolGroup.super.call( this, toolbar, config );
+
+       // Initialization
+       this.$element.addClass( 'oo-ui-listToolGroup' );
+};
+
+/* Setup */
+
+OO.inheritClass( OO.ui.ListToolGroup, OO.ui.PopupToolGroup );
+
+/* Static Properties */
+
+OO.ui.ListToolGroup.static.accelTooltips = true;
+
+OO.ui.ListToolGroup.static.name = 'list';
+/**
+ * Drop down menu layout of tools as selectable menu items.
+ *
+ * @abstract
+ * @class
+ * @extends OO.ui.PopupToolGroup
+ *
+ * @constructor
+ * @param {OO.ui.Toolbar} toolbar
+ * @param {Object} [config] Configuration options
+ */
+OO.ui.MenuToolGroup = function OoUiMenuToolGroup( toolbar, config ) {
+       // Configuration initialization
+       config = config || {};
+
+       // Parent constructor
+       OO.ui.MenuToolGroup.super.call( this, toolbar, config );
+
+       // Events
+       this.toolbar.connect( this, { 'updateState': 'onUpdateState' } );
+
+       // Initialization
+       this.$element.addClass( 'oo-ui-menuToolGroup' );
+};
+
+/* Setup */
+
+OO.inheritClass( OO.ui.MenuToolGroup, OO.ui.PopupToolGroup );
+
+/* Static Properties */
+
+OO.ui.MenuToolGroup.static.accelTooltips = true;
+
+OO.ui.MenuToolGroup.static.name = 'menu';
+
+/* Methods */
+
+/**
+ * Handle the toolbar state being updated.
+ *
+ * When the state changes, the title of each active item in the menu will be joined together and
+ * used as a label for the group. The label will be empty if none of the items are active.
+ */
+OO.ui.MenuToolGroup.prototype.onUpdateState = function () {
+       var name,
+               labelTexts = [];
+
+       for ( name in this.tools ) {
+               if ( this.tools[name].isActive() ) {
+                       labelTexts.push( this.tools[name].getTitle() );
+               }
+       }
+
+       this.setLabel( labelTexts.join( ', ' ) || ' ' );
+};
+/**
+ * Tool that shows a popup when selected.
+ *
+ * @abstract
+ * @class
+ * @extends OO.ui.Tool
+ * @mixins OO.ui.PopuppableElement
+ *
+ * @constructor
+ * @param {OO.ui.Toolbar} toolbar
+ * @param {Object} [config] Configuration options
+ */
+OO.ui.PopupTool = function OoUiPopupTool( toolbar, config ) {
+       // Parent constructor
+       OO.ui.PopupTool.super.call( this, toolbar, config );
+
+       // Mixin constructors
+       OO.ui.PopuppableElement.call( this, config );
+
+       // Initialization
+       this.$element
+               .addClass( 'oo-ui-popupTool' )
+               .append( this.popup.$element );
+};
+
+/* Setup */
+
+OO.inheritClass( OO.ui.PopupTool, OO.ui.Tool );
+OO.mixinClass( OO.ui.PopupTool, OO.ui.PopuppableElement );
+
+/* Methods */
+
+/**
+ * Handle the tool being selected.
+ *
+ * @inheritdoc
+ */
+OO.ui.PopupTool.prototype.onSelect = function () {
+       if ( !this.disabled ) {
+               if ( this.popup.isVisible() ) {
+                       this.hidePopup();
+               } else {
+                       this.showPopup();
+               }
+       }
+       this.setActive( false );
+       return false;
+};
+
+/**
+ * Handle the toolbar state being updated.
+ *
+ * @inheritdoc
+ */
+OO.ui.PopupTool.prototype.onUpdateState = function () {
+       this.setActive( false );
+};
+/**
+ * Group widget.
+ *
+ * Mixin for OO.ui.Widget subclasses.
+ *
+ * Use together with OO.ui.ItemWidget to make disabled state inheritable.
+ *
+ * @abstract
+ * @class
+ * @extends OO.ui.GroupElement
+ *
+ * @constructor
+ * @param {jQuery} $group Container node, assigned to #$group
+ * @param {Object} [config] Configuration options
+ */
+OO.ui.GroupWidget = function OoUiGroupWidget( $element, config ) {
+       // Parent constructor
+       OO.ui.GroupWidget.super.call( this, $element, config );
+};
+
+/* Setup */
+
+OO.inheritClass( OO.ui.GroupWidget, OO.ui.GroupElement );
+
+/* Methods */
+
+/**
+ * Set the disabled state of the widget.
+ *
+ * This will also update the disabled state of child widgets.
+ *
+ * @param {boolean} disabled Disable widget
+ * @chainable
+ */
+OO.ui.GroupWidget.prototype.setDisabled = function ( disabled ) {
+       var i, len;
+
+       // Parent method
+       // Note this is calling OO.ui.Widget; we're assuming the class this is mixed into
+       // is a subclass of OO.ui.Widget.
+       OO.ui.Widget.prototype.setDisabled.call( this, disabled );
+
+       // During construction, #setDisabled is called before the OO.ui.GroupElement constructor
+       if ( this.items ) {
+               for ( i = 0, len = this.items.length; i < len; i++ ) {
+                       this.items[i].updateDisabled();
+               }
+       }
+
+       return this;
+};
+/**
+ * Item widget.
+ *
+ * Use together with OO.ui.GroupWidget to make disabled state inheritable.
+ *
+ * @abstract
+ * @class
+ *
+ * @constructor
+ */
+OO.ui.ItemWidget = function OoUiItemWidget() {
+       //
+};
+
+/* Methods */
+
+/**
+ * Check if widget is disabled.
+ *
+ * Checks parent if present, making disabled state inheritable.
+ *
+ * @return {boolean} Widget is disabled
+ */
+OO.ui.ItemWidget.prototype.isDisabled = function () {
+       return this.disabled ||
+               ( this.elementGroup instanceof OO.ui.Widget && this.elementGroup.isDisabled() );
+};
+
+/**
+ * Set group element is in.
+ *
+ * @param {OO.ui.GroupElement|null} group Group element, null if none
+ * @chainable
+ */
+OO.ui.ItemWidget.prototype.setElementGroup = function ( group ) {
+       // Parent method
+       OO.ui.Element.prototype.setElementGroup.call( this, group );
+
+       // Initialize item disabled states
+       this.updateDisabled();
+
+       return this;
+};
+/**
+ * Icon widget.
+ *
+ * @class
+ * @extends OO.ui.Widget
+ * @mixins OO.ui.IconedElement
+ * @mixins OO.ui.TitledElement
+ *
+ * @constructor
+ * @param {Object} [config] Configuration options
+ */
+OO.ui.IconWidget = function OoUiIconWidget( config ) {
+       // Config intialization
+       config = config || {};
+
+       // Parent constructor
+       OO.ui.IconWidget.super.call( this, config );
+
+       // Mixin constructors
+       OO.ui.IconedElement.call( this, this.$element, config );
+       OO.ui.TitledElement.call( this, this.$element, config );
+
+       // Initialization
+       this.$element.addClass( 'oo-ui-iconWidget' );
+};
+
+/* Setup */
+
+OO.inheritClass( OO.ui.IconWidget, OO.ui.Widget );
+OO.mixinClass( OO.ui.IconWidget, OO.ui.IconedElement );
+OO.mixinClass( OO.ui.IconWidget, OO.ui.TitledElement );
+
+/* Static Properties */
+
+OO.ui.IconWidget.static.tagName = 'span';
+/**
+ * Indicator widget.
+ *
+ * @class
+ * @extends OO.ui.Widget
+ * @mixins OO.ui.IndicatedElement
+ * @mixins OO.ui.TitledElement
+ *
+ * @constructor
+ * @param {Object} [config] Configuration options
+ */
+OO.ui.IndicatorWidget = function OoUiIndicatorWidget( config ) {
+       // Config intialization
+       config = config || {};
+
+       // Parent constructor
+       OO.ui.IndicatorWidget.super.call( this, config );
+
+       // Mixin constructors
+       OO.ui.IndicatedElement.call( this, this.$element, config );
+       OO.ui.TitledElement.call( this, this.$element, config );
+
+       // Initialization
+       this.$element.addClass( 'oo-ui-indicatorWidget' );
+};
+
+/* Setup */
+
+OO.inheritClass( OO.ui.IndicatorWidget, OO.ui.Widget );
+OO.mixinClass( OO.ui.IndicatorWidget, OO.ui.IndicatedElement );
+OO.mixinClass( OO.ui.IndicatorWidget, OO.ui.TitledElement );
+
+/* Static Properties */
+
+OO.ui.IndicatorWidget.static.tagName = 'span';
+/**
+ * Container for multiple related buttons.
+ *
+ * Use together with OO.ui.ButtonWidget.
+ *
+ * @class
+ * @extends OO.ui.Widget
+ * @mixins OO.ui.GroupElement
+ *
+ * @constructor
+ * @param {Object} [config] Configuration options
+ * @cfg {OO.ui.ButtonWidget} [items] Buttons to add
+ */
+OO.ui.ButtonGroupWidget = function OoUiButtonGroupWidget( config ) {
+       // Parent constructor
+       OO.ui.ButtonGroupWidget.super.call( this, config );
+
+       // Mixin constructors
+       OO.ui.GroupElement.call( this, this.$element, config );
+
+       // Initialization
+       this.$element.addClass( 'oo-ui-buttonGroupWidget' );
+       if ( $.isArray( config.items ) ) {
+               this.addItems( config.items );
+       }
+};
+
+/* Setup */
+
+OO.inheritClass( OO.ui.ButtonGroupWidget, OO.ui.Widget );
+OO.mixinClass( OO.ui.ButtonGroupWidget, OO.ui.GroupElement );
+/**
+ * Button widget.
+ *
+ * @abstract
+ * @class
+ * @extends OO.ui.Widget
+ * @mixins OO.ui.ButtonedElement
+ * @mixins OO.ui.IconedElement
+ * @mixins OO.ui.IndicatedElement
+ * @mixins OO.ui.LabeledElement
+ * @mixins OO.ui.TitledElement
+ * @mixins OO.ui.FlaggableElement
+ *
+ * @constructor
+ * @param {Object} [config] Configuration options
+ * @cfg {string} [title=''] Title text
+ * @cfg {string} [href] Hyperlink to visit when clicked
+ * @cfg {string} [target] Target to open hyperlink in
+ */
+OO.ui.ButtonWidget = function OoUiButtonWidget( config ) {
+       // Configuration initialization
+       config = $.extend( { 'target': '_blank' }, config );
+
+       // Parent constructor
+       OO.ui.ButtonWidget.super.call( this, config );
+
+       // Mixin constructors
+       OO.ui.ButtonedElement.call( this, this.$( '<a>' ), config );
+       OO.ui.IconedElement.call( this, this.$( '<span>' ), config );
+       OO.ui.IndicatedElement.call( this, this.$( '<span>' ), config );
+       OO.ui.LabeledElement.call( this, this.$( '<span>' ), config );
+       OO.ui.TitledElement.call( this, this.$button, config );
+       OO.ui.FlaggableElement.call( this, config );
+
+       // Properties
+       this.isHyperlink = typeof config.href === 'string';
+
+       // Events
+       this.$button.on( {
+               'click': OO.ui.bind( this.onClick, this ),
+               'keypress': OO.ui.bind( this.onKeyPress, this )
+       } );
+
+       // Initialization
+       this.$button
+               .append( this.$icon, this.$label, this.$indicator )
+               .attr( { 'href': config.href, 'target': config.target } );
+       this.$element
+               .addClass( 'oo-ui-buttonWidget' )
+               .append( this.$button );
+};
+
+/* Setup */
+
+OO.inheritClass( OO.ui.ButtonWidget, OO.ui.Widget );
+OO.mixinClass( OO.ui.ButtonWidget, OO.ui.ButtonedElement );
+OO.mixinClass( OO.ui.ButtonWidget, OO.ui.IconedElement );
+OO.mixinClass( OO.ui.ButtonWidget, OO.ui.IndicatedElement );
+OO.mixinClass( OO.ui.ButtonWidget, OO.ui.LabeledElement );
+OO.mixinClass( OO.ui.ButtonWidget, OO.ui.TitledElement );
+OO.mixinClass( OO.ui.ButtonWidget, OO.ui.FlaggableElement );
+
+/* Events */
+
+/**
+ * @event click
+ */
+
+/* Methods */
+
+/**
+ * Handles mouse click events.
+ *
+ * @param {jQuery.Event} e Mouse click event
+ * @fires click
+ */
+OO.ui.ButtonWidget.prototype.onClick = function () {
+       if ( !this.disabled ) {
+               this.emit( 'click' );
+               if ( this.isHyperlink ) {
+                       return true;
+               }
+       }
+       return false;
+};
+
+/**
+ * Handles keypress events.
+ *
+ * @param {jQuery.Event} e Keypress event
+ * @fires click
+ */
+OO.ui.ButtonWidget.prototype.onKeyPress = function ( e ) {
+       if ( !this.disabled && e.which === OO.ui.Keys.SPACE ) {
+               if ( this.isHyperlink ) {
+                       this.onClick();
+                       return true;
+               }
+       }
+       return false;
+};
+/**
+ * Input widget.
+ *
+ * @abstract
+ * @class
+ * @extends OO.ui.Widget
+ *
+ * @constructor
+ * @param {Object} [config] Configuration options
+ * @cfg {string} [name=''] HTML input name
+ * @cfg {string} [value=''] Input value
+ * @cfg {boolean} [readOnly=false] Prevent changes
+ * @cfg {Function} [inputFilter] Filter function to apply to the input. Takes a string argument and returns a string.
+ */
+OO.ui.InputWidget = function OoUiInputWidget( config ) {
+       // Config intialization
+       config = $.extend( { 'readOnly': false }, config );
+
+       // Parent constructor
+       OO.ui.InputWidget.super.call( this, config );
+
+       // Properties
+       this.$input = this.getInputElement( config );
+       this.value = '';
+       this.readOnly = false;
+       this.inputFilter = config.inputFilter;
+
+       // Events
+       this.$input.on( 'keydown mouseup cut paste change input select', OO.ui.bind( this.onEdit, this ) );
+
+       // Initialization
+       this.$input
+               .attr( 'name', config.name )
+               .prop( 'disabled', this.disabled );
+       this.setReadOnly( config.readOnly );
+       this.$element.addClass( 'oo-ui-inputWidget' ).append( this.$input );
+       this.setValue( config.value );
+};
+
+/* Setup */
+
+OO.inheritClass( OO.ui.InputWidget, OO.ui.Widget );
+
+/* Events */
+
+/**
+ * @event change
+ * @param value
+ */
+
+/* Methods */
+
+/**
+ * Get input element.
+ *
+ * @param {Object} [config] Configuration options
+ * @return {jQuery} Input element
+ */
+OO.ui.InputWidget.prototype.getInputElement = function () {
+       return this.$( '<input>' );
+};
+
+/**
+ * Handle potentially value-changing events.
+ *
+ * @param {jQuery.Event} e Key down, mouse up, cut, paste, change, input, or select event
+ */
+OO.ui.InputWidget.prototype.onEdit = function () {
+       if ( !this.disabled ) {
+               // Allow the stack to clear so the value will be updated
+               setTimeout( OO.ui.bind( function () {
+                       this.setValue( this.$input.val() );
+               }, this ) );
+       }
+};
+
+/**
+ * Get the value of the input.
+ *
+ * @return {string} Input value
+ */
+OO.ui.InputWidget.prototype.getValue = function () {
+       return this.value;
+};
+
+/**
+ * Sets the direction of the current input, either RTL or LTR
+ *
+ * @param {boolean} isRTL
+ */
+OO.ui.InputWidget.prototype.setRTL = function ( isRTL ) {
+       if ( isRTL ) {
+               this.$input.removeClass( 'oo-ui-ltr' );
+               this.$input.addClass( 'oo-ui-rtl' );
+       } else {
+               this.$input.removeClass( 'oo-ui-rtl' );
+               this.$input.addClass( 'oo-ui-ltr' );
+       }
+};
+
+/**
+ * Set the value of the input.
+ *
+ * @param {string} value New value
+ * @fires change
+ * @chainable
+ */
+OO.ui.InputWidget.prototype.setValue = function ( value ) {
+       value = this.sanitizeValue( value );
+       if ( this.value !== value ) {
+               this.value = value;
+               this.emit( 'change', this.value );
+       }
+       // Update the DOM if it has changed. Note that with sanitizeValue, it
+       // is possible for the DOM value to change without this.value changing.
+       if ( this.$input.val() !== this.value ) {
+               this.$input.val( this.value );
+       }
+       return this;
+};
+
+/**
+ * Sanitize incoming value.
+ *
+ * Ensures value is a string, and converts undefined and null to empty strings.
+ *
+ * @param {string} value Original value
+ * @return {string} Sanitized value
+ */
+OO.ui.InputWidget.prototype.sanitizeValue = function ( value ) {
+       if ( value === undefined || value === null ) {
+               return '';
+       } else if ( this.inputFilter ) {
+               return this.inputFilter( String( value ) );
+       } else {
+               return String( value );
+       }
+};
+
+/**
+ * Simulate the behavior of clicking on a label bound to this input.
+ */
+OO.ui.InputWidget.prototype.simulateLabelClick = function () {
+       if ( !this.isDisabled() ) {
+               if ( this.$input.is( ':checkbox,:radio' ) ) {
+                       this.$input.click();
+               } else if ( this.$input.is( ':input' ) ) {
+                       this.$input.focus();
+               }
+       }
+};
+
+/**
+ * Check if the widget is read-only.
+ *
+ * @return {boolean}
+ */
+OO.ui.InputWidget.prototype.isReadOnly = function () {
+       return this.readOnly;
+};
+
+/**
+ * Set the read-only state of the widget.
+ *
+ * This should probably change the widgets's appearance and prevent it from being used.
+ *
+ * @param {boolean} state Make input read-only
+ * @chainable
+ */
+OO.ui.InputWidget.prototype.setReadOnly = function ( state ) {
+       this.readOnly = !!state;
+       this.$input.prop( 'readonly', this.readOnly );
+       return this;
+};
+
+/**
+ * @inheritdoc
+ */
+OO.ui.InputWidget.prototype.setDisabled = function ( state ) {
+       OO.ui.Widget.prototype.setDisabled.call( this, state );
+       if ( this.$input ) {
+               this.$input.prop( 'disabled', this.disabled );
+       }
+       return this;
+};
+/**
+ * Checkbox widget.
+ *
+ * @class
+ * @extends OO.ui.InputWidget
+ *
+ * @constructor
+ * @param {Object} [config] Configuration options
+ */
+OO.ui.CheckboxInputWidget = function OoUiCheckboxInputWidget( config ) {
+       // Parent constructor
+       OO.ui.CheckboxInputWidget.super.call( this, config );
+
+       // Initialization
+       this.$element.addClass( 'oo-ui-checkboxInputWidget' );
+};
+
+/* Setup */
+
+OO.inheritClass( OO.ui.CheckboxInputWidget, OO.ui.InputWidget );
+
+/* Events */
+
+/* Methods */
+
+/**
+ * Get input element.
+ *
+ * @return {jQuery} Input element
+ */
+OO.ui.CheckboxInputWidget.prototype.getInputElement = function () {
+       return this.$( '<input type="checkbox" />' );
+};
+
+/**
+ * Get checked state of the checkbox
+ *
+ * @return {boolean} If the checkbox is checked
+ */
+OO.ui.CheckboxInputWidget.prototype.getValue = function () {
+       return this.value;
+};
+
+/**
+ * Set value
+ */
+OO.ui.CheckboxInputWidget.prototype.setValue = function ( value ) {
+       value = !!value;
+       if ( this.value !== value ) {
+               this.value = value;
+               this.$input.prop( 'checked', this.value );
+               this.emit( 'change', this.value );
+       }
+};
+
+/**
+ * @inheritdoc
+ */
+OO.ui.CheckboxInputWidget.prototype.onEdit = function () {
+       if ( !this.disabled ) {
+               // Allow the stack to clear so the value will be updated
+               setTimeout( OO.ui.bind( function () {
+                       this.setValue( this.$input.prop( 'checked' ) );
+               }, this ) );
+       }
+};
+/**
+ * Label widget.
+ *
+ * @class
+ * @extends OO.ui.Widget
+ * @mixins OO.ui.LabeledElement
+ *
+ * @constructor
+ * @param {Object} [config] Configuration options
+ */
+OO.ui.LabelWidget = function OoUiLabelWidget( config ) {
+       // Config intialization
+       config = config || {};
+
+       // Parent constructor
+       OO.ui.LabelWidget.super.call( this, config );
+
+       // Mixin constructors
+       OO.ui.LabeledElement.call( this, this.$element, config );
+
+       // Properties
+       this.input = config.input;
+
+       // Events
+       if ( this.input instanceof OO.ui.InputWidget ) {
+               this.$element.on( 'click', OO.ui.bind( this.onClick, this ) );
+       }
+
+       // Initialization
+       this.$element.addClass( 'oo-ui-labelWidget' );
+};
+
+/* Setup */
+
+OO.inheritClass( OO.ui.LabelWidget, OO.ui.Widget );
+OO.mixinClass( OO.ui.LabelWidget, OO.ui.LabeledElement );
+
+/* Static Properties */
+
+OO.ui.LabelWidget.static.tagName = 'label';
+
+/* Methods */
+
+/**
+ * Handles label mouse click events.
+ *
+ * @param {jQuery.Event} e Mouse click event
+ */
+OO.ui.LabelWidget.prototype.onClick = function () {
+       this.input.simulateLabelClick();
+       return false;
+};
+/**
+ * Lookup input widget.
+ *
+ * Mixin that adds a menu showing suggested values to a text input. Subclasses must handle `select`
+ * and `choose` events on #lookupMenu to make use of selections.
+ *
+ * @class
+ * @abstract
+ *
+ * @constructor
+ * @param {OO.ui.TextInputWidget} input Input widget
+ * @param {Object} [config] Configuration options
+ * @cfg {jQuery} [$overlay=this.$( 'body' )] Overlay layer
+ */
+OO.ui.LookupInputWidget = function OoUiLookupInputWidget( input, config ) {
+       // Config intialization
+       config = config || {};
+
+       // Properties
+       this.lookupInput = input;
+       this.$overlay = config.$overlay || this.$( 'body,.oo-ui-window-overlay' ).last();
+       this.lookupMenu = new OO.ui.TextInputMenuWidget( this, {
+               '$': OO.ui.Element.getJQuery( this.$overlay ),
+               'input': this.lookupInput,
+               '$container': config.$container
+       } );
+       this.lookupCache = {};
+       this.lookupQuery = null;
+       this.lookupRequest = null;
+       this.populating = false;
+
+       // Events
+       this.$overlay.append( this.lookupMenu.$element );
+
+       this.lookupInput.$input.on( {
+               'focus': OO.ui.bind( this.onLookupInputFocus, this ),
+               'blur': OO.ui.bind( this.onLookupInputBlur, this ),
+               'mousedown': OO.ui.bind( this.onLookupInputMouseDown, this )
+       } );
+       this.lookupInput.connect( this, { 'change': 'onLookupInputChange' } );
+
+       // Initialization
+       this.$element.addClass( 'oo-ui-lookupWidget' );
+       this.lookupMenu.$element.addClass( 'oo-ui-lookupWidget-menu' );
+};
+
+/* Methods */
+
+/**
+ * Handle input focus event.
+ *
+ * @param {jQuery.Event} e Input focus event
+ */
+OO.ui.LookupInputWidget.prototype.onLookupInputFocus = function () {
+       this.openLookupMenu();
+};
+
+/**
+ * Handle input blur event.
+ *
+ * @param {jQuery.Event} e Input blur event
+ */
+OO.ui.LookupInputWidget.prototype.onLookupInputBlur = function () {
+       this.lookupMenu.hide();
+};
+
+/**
+ * Handle input mouse down event.
+ *
+ * @param {jQuery.Event} e Input mouse down event
+ */
+OO.ui.LookupInputWidget.prototype.onLookupInputMouseDown = function () {
+       this.openLookupMenu();
+};
+
+/**
+ * Handle input change event.
+ *
+ * @param {string} value New input value
+ */
+OO.ui.LookupInputWidget.prototype.onLookupInputChange = function () {
+       this.openLookupMenu();
+};
+
+/**
+ * Open the menu.
+ *
+ * @chainable
+ */
+OO.ui.LookupInputWidget.prototype.openLookupMenu = function () {
+       var value = this.lookupInput.getValue();
+
+       if ( this.lookupMenu.$input.is( ':focus' ) && $.trim( value ) !== '' ) {
+               this.populateLookupMenu();
+               if ( !this.lookupMenu.isVisible() ) {
+                       this.lookupMenu.show();
+               }
+       } else {
+               this.lookupMenu.clearItems();
+               this.lookupMenu.hide();
+       }
+
+       return this;
+};
+
+/**
+ * Populate lookup menu with current information.
+ *
+ * @chainable
+ */
+OO.ui.LookupInputWidget.prototype.populateLookupMenu = function () {
+       if ( !this.populating ) {
+               this.populating = true;
+               this.getLookupMenuItems()
+                       .done( OO.ui.bind( function ( items ) {
+                               this.lookupMenu.clearItems();
+                               if ( items.length ) {
+                                       this.lookupMenu.show();
+                                       this.lookupMenu.addItems( items );
+                                       this.initializeLookupMenuSelection();
+                                       this.openLookupMenu();
+                               } else {
+                                       this.lookupMenu.hide();
+                               }
+                               this.populating = false;
+                       }, this ) )
+                       .fail( OO.ui.bind( function () {
+                               this.lookupMenu.clearItems();
+                               this.populating = false;
+                       }, this ) );
+       }
+
+       return this;
+};
+
+/**
+ * Set selection in the lookup menu with current information.
+ *
+ * @chainable
+ */
+OO.ui.LookupInputWidget.prototype.initializeLookupMenuSelection = function () {
+       if ( !this.lookupMenu.getSelectedItem() ) {
+               this.lookupMenu.selectItem( this.lookupMenu.getFirstSelectableItem() );
+       }
+       this.lookupMenu.highlightItem( this.lookupMenu.getSelectedItem() );
+};
+
+/**
+ * Get lookup menu items for the current query.
+ *
+ * @return {jQuery.Promise} Promise object which will be passed menu items as the first argument
+ * of the done event
+ */
+OO.ui.LookupInputWidget.prototype.getLookupMenuItems = function () {
+       var value = this.lookupInput.getValue(),
+               deferred = $.Deferred();
+
+       if ( value && value !== this.lookupQuery ) {
+               // Abort current request if query has changed
+               if ( this.lookupRequest ) {
+                       this.lookupRequest.abort();
+                       this.lookupQuery = null;
+                       this.lookupRequest = null;
+               }
+               if ( value in this.lookupCache ) {
+                       deferred.resolve( this.getLookupMenuItemsFromData( this.lookupCache[value] ) );
+               } else {
+                       this.lookupQuery = value;
+                       this.lookupRequest = this.getLookupRequest()
+                               .always( OO.ui.bind( function () {
+                                       this.lookupQuery = null;
+                                       this.lookupRequest = null;
+                               }, this ) )
+                               .done( OO.ui.bind( function ( data ) {
+                                       this.lookupCache[value] = this.getLookupCacheItemFromData( data );
+                                       deferred.resolve( this.getLookupMenuItemsFromData( this.lookupCache[value] ) );
+                               }, this ) )
+                               .fail( function () {
+                                       deferred.reject();
+                               } );
+                       this.pushPending();
+                       this.lookupRequest.always( OO.ui.bind( function () {
+                               this.popPending();
+                       }, this ) );
+               }
+       }
+       return deferred.promise();
+};
+
+/**
+ * Get a new request object of the current lookup query value.
+ *
+ * @abstract
+ * @return {jqXHR} jQuery AJAX object, or promise object with an .abort() method
+ */
+OO.ui.LookupInputWidget.prototype.getLookupRequest = function () {
+       // Stub, implemented in subclass
+       return null;
+};
+
+/**
+ * Handle successful lookup request.
+ *
+ * Overriding methods should call #populateLookupMenu when results are available and cache results
+ * for future lookups in #lookupCache as an array of #OO.ui.MenuItemWidget objects.
+ *
+ * @abstract
+ * @param {Mixed} data Response from server
+ */
+OO.ui.LookupInputWidget.prototype.onLookupRequestDone = function () {
+       // Stub, implemented in subclass
+};
+
+/**
+ * Get a list of menu item widgets from the data stored by the lookup request's done handler.
+ *
+ * @abstract
+ * @param {Mixed} data Cached result data, usually an array
+ * @return {OO.ui.MenuItemWidget[]} Menu items
+ */
+OO.ui.LookupInputWidget.prototype.getLookupMenuItemsFromData = function () {
+       // Stub, implemented in subclass
+       return [];
+};
+/**
+ * Option widget.
+ *
+ * Use with OO.ui.SelectWidget.
+ *
+ * @abstract
+ * @class
+ * @extends OO.ui.Widget
+ * @mixins OO.ui.IconedElement
+ * @mixins OO.ui.LabeledElement
+ * @mixins OO.ui.IndicatedElement
+ * @mixins OO.ui.FlaggableElement
+ *
+ * @constructor
+ * @param {Mixed} data Option data
+ * @param {Object} [config] Configuration options
+ * @cfg {string} [rel] Value for `rel` attribute in DOM, allowing per-option styling
+ */
+OO.ui.OptionWidget = function OoUiOptionWidget( data, config ) {
+       // Config intialization
+       config = config || {};
+
+       // Parent constructor
+       OO.ui.OptionWidget.super.call( this, config );
+
+       // Mixin constructors
+       OO.ui.ItemWidget.call( this );
+       OO.ui.IconedElement.call( this, this.$( '<span>' ), config );
+       OO.ui.LabeledElement.call( this, this.$( '<span>' ), config );
+       OO.ui.IndicatedElement.call( this, this.$( '<span>' ), config );
+       OO.ui.FlaggableElement.call( this, config );
+
+       // Properties
+       this.data = data;
+       this.selected = false;
+       this.highlighted = false;
+       this.pressed = false;
+
+       // Initialization
+       this.$element
+               .data( 'oo-ui-optionWidget', this )
+               .attr( 'rel', config.rel )
+               .addClass( 'oo-ui-optionWidget' )
+               .append( this.$label );
+       this.$element
+               .prepend( this.$icon )
+               .append( this.$indicator );
+};
+
+/* Setup */
+
+OO.inheritClass( OO.ui.OptionWidget, OO.ui.Widget );
+OO.mixinClass( OO.ui.OptionWidget, OO.ui.ItemWidget );
+OO.mixinClass( OO.ui.OptionWidget, OO.ui.IconedElement );
+OO.mixinClass( OO.ui.OptionWidget, OO.ui.LabeledElement );
+OO.mixinClass( OO.ui.OptionWidget, OO.ui.IndicatedElement );
+OO.mixinClass( OO.ui.OptionWidget, OO.ui.FlaggableElement );
+
+/* Static Properties */
+
+OO.ui.OptionWidget.static.tagName = 'li';
+
+OO.ui.OptionWidget.static.selectable = true;
+
+OO.ui.OptionWidget.static.highlightable = true;
+
+OO.ui.OptionWidget.static.pressable = true;
+
+OO.ui.OptionWidget.static.scrollIntoViewOnSelect = false;
+
+/* Methods */
+
+/**
+ * Check if option can be selected.
+ *
+ * @return {boolean} Item is selectable
+ */
+OO.ui.OptionWidget.prototype.isSelectable = function () {
+       return this.constructor.static.selectable && !this.disabled;
+};
+
+/**
+ * Check if option can be highlighted.
+ *
+ * @return {boolean} Item is highlightable
+ */
+OO.ui.OptionWidget.prototype.isHighlightable = function () {
+       return this.constructor.static.highlightable && !this.disabled;
+};
+
+/**
+ * Check if option can be pressed.
+ *
+ * @return {boolean} Item is pressable
+ */
+OO.ui.OptionWidget.prototype.isPressable = function () {
+       return this.constructor.static.pressable && !this.disabled;
+};
+
+/**
+ * Check if option is selected.
+ *
+ * @return {boolean} Item is selected
+ */
+OO.ui.OptionWidget.prototype.isSelected = function () {
+       return this.selected;
+};
+
+/**
+ * Check if option is highlighted.
+ *
+ * @return {boolean} Item is highlighted
+ */
+OO.ui.OptionWidget.prototype.isHighlighted = function () {
+       return this.highlighted;
+};
+
+/**
+ * Check if option is pressed.
+ *
+ * @return {boolean} Item is pressed
+ */
+OO.ui.OptionWidget.prototype.isPressed = function () {
+       return this.pressed;
+};
+
+/**
+ * Set selected state.
+ *
+ * @param {boolean} [state=false] Select option
+ * @chainable
+ */
+OO.ui.OptionWidget.prototype.setSelected = function ( state ) {
+       if ( !this.disabled && this.constructor.static.selectable ) {
+               this.selected = !!state;
+               if ( this.selected ) {
+                       this.$element.addClass( 'oo-ui-optionWidget-selected' );
+                       if ( this.constructor.static.scrollIntoViewOnSelect ) {
+                               this.scrollElementIntoView();
+                       }
+               } else {
+                       this.$element.removeClass( 'oo-ui-optionWidget-selected' );
+               }
+       }
+       return this;
+};
+
+/**
+ * Set highlighted state.
+ *
+ * @param {boolean} [state=false] Highlight option
+ * @chainable
+ */
+OO.ui.OptionWidget.prototype.setHighlighted = function ( state ) {
+       if ( !this.disabled && this.constructor.static.highlightable ) {
+               this.highlighted = !!state;
+               if ( this.highlighted ) {
+                       this.$element.addClass( 'oo-ui-optionWidget-highlighted' );
+               } else {
+                       this.$element.removeClass( 'oo-ui-optionWidget-highlighted' );
+               }
+       }
+       return this;
+};
+
+/**
+ * Set pressed state.
+ *
+ * @param {boolean} [state=false] Press option
+ * @chainable
+ */
+OO.ui.OptionWidget.prototype.setPressed = function ( state ) {
+       if ( !this.disabled && this.constructor.static.pressable ) {
+               this.pressed = !!state;
+               if ( this.pressed ) {
+                       this.$element.addClass( 'oo-ui-optionWidget-pressed' );
+               } else {
+                       this.$element.removeClass( 'oo-ui-optionWidget-pressed' );
+               }
+       }
+       return this;
+};
+
+/**
+ * Make the option's highlight flash.
+ *
+ * While flashing, the visual style of the pressed state is removed if present.
+ *
+ * @param {Function} [done] Callback to execute when flash effect is complete.
+ */
+OO.ui.OptionWidget.prototype.flash = function ( done ) {
+       var $this = this.$element;
+
+       if ( !this.disabled && this.constructor.static.pressable ) {
+               $this.removeClass( 'oo-ui-optionWidget-highlighted oo-ui-optionWidget-pressed' );
+               setTimeout( OO.ui.bind( function () {
+                       $this.addClass( 'oo-ui-optionWidget-highlighted' );
+                       if ( done ) {
+                               // Restore original classes
+                               $this
+                                       .toggleClass( 'oo-ui-optionWidget-highlighted', this.highlighted )
+                                       .toggleClass( 'oo-ui-optionWidget-pressed', this.pressed );
+                               setTimeout( done, 100 );
+                       }
+               }, this ), 100 );
+       }
+};
+
+/**
+ * Get option data.
+ *
+ * @return {Mixed} Option data
+ */
+OO.ui.OptionWidget.prototype.getData = function () {
+       return this.data;
+};
+/**
+ * Selection of options.
+ *
+ * Use together with OO.ui.OptionWidget.
+ *
+ * @abstract
+ * @class
+ * @extends OO.ui.Widget
+ * @mixins OO.ui.GroupElement
+ *
+ * @constructor
+ * @param {Object} [config] Configuration options
+ * @cfg {OO.ui.OptionWidget[]} [items] Options to add
+ */
+OO.ui.SelectWidget = function OoUiSelectWidget( config ) {
+       // Config intialization
+       config = config || {};
+
+       // Parent constructor
+       OO.ui.SelectWidget.super.call( this, config );
+
+       // Mixin constructors
+       OO.ui.GroupWidget.call( this, this.$element, config );
+
+       // Properties
+       this.pressed = false;
+       this.selecting = null;
+       this.hashes = {};
+
+       // Events
+       this.$element.on( {
+               'mousedown': OO.ui.bind( this.onMouseDown, this ),
+               'mouseup': OO.ui.bind( this.onMouseUp, this ),
+               'mousemove': OO.ui.bind( this.onMouseMove, this ),
+               'mouseover': OO.ui.bind( this.onMouseOver, this ),
+               'mouseleave': OO.ui.bind( this.onMouseLeave, this )
+       } );
+
+       // Initialization
+       this.$element.addClass( 'oo-ui-selectWidget oo-ui-selectWidget-depressed' );
+       if ( $.isArray( config.items ) ) {
+               this.addItems( config.items );
+       }
+};
+
+/* Setup */
+
+OO.inheritClass( OO.ui.SelectWidget, OO.ui.Widget );
+
+// Need to mixin base class as well
+OO.mixinClass( OO.ui.SelectWidget, OO.ui.GroupElement );
+OO.mixinClass( OO.ui.SelectWidget, OO.ui.GroupWidget );
+
+/* Events */
+
+/**
+ * @event highlight
+ * @param {OO.ui.OptionWidget|null} item Highlighted item
+ */
+
+/**
+ * @event press
+ * @param {OO.ui.OptionWidget|null} item Pressed item
+ */
+
+/**
+ * @event select
+ * @param {OO.ui.OptionWidget|null} item Selected item
+ */
+
+/**
+ * @event choose
+ * @param {OO.ui.OptionWidget|null} item Chosen item
+ */
+
+/**
+ * @event add
+ * @param {OO.ui.OptionWidget[]} items Added items
+ * @param {number} index Index items were added at
+ */
+
+/**
+ * @event remove
+ * @param {OO.ui.OptionWidget[]} items Removed items
+ */
+
+/* Static Properties */
+
+OO.ui.SelectWidget.static.tagName = 'ul';
+
+/* Methods */
+
+/**
+ * Handle mouse down events.
+ *
+ * @private
+ * @param {jQuery.Event} e Mouse down event
+ */
+OO.ui.SelectWidget.prototype.onMouseDown = function ( e ) {
+       var item;
+
+       if ( !this.disabled && e.which === 1 ) {
+               this.togglePressed( true );
+               item = this.getTargetItem( e );
+               if ( item && item.isSelectable() ) {
+                       this.pressItem( item );
+                       this.selecting = item;
+                       this.$( this.$.context ).one( 'mouseup', OO.ui.bind( this.onMouseUp, this ) );
+               }
+       }
+       return false;
+};
+
+/**
+ * Handle mouse up events.
+ *
+ * @private
+ * @param {jQuery.Event} e Mouse up event
+ */
+OO.ui.SelectWidget.prototype.onMouseUp = function ( e ) {
+       var item;
+
+       this.togglePressed( false );
+       if ( !this.selecting ) {
+               item = this.getTargetItem( e );
+               if ( item && item.isSelectable() ) {
+                       this.selecting = item;
+               }
+       }
+       if ( !this.disabled && e.which === 1 && this.selecting ) {
+               this.pressItem( null );
+               this.chooseItem( this.selecting );
+               this.selecting = null;
+       }
+
+       return false;
+};
+
+/**
+ * Handle mouse move events.
+ *
+ * @private
+ * @param {jQuery.Event} e Mouse move event
+ */
+OO.ui.SelectWidget.prototype.onMouseMove = function ( e ) {
+       var item;
+
+       if ( !this.disabled && this.pressed ) {
+               item = this.getTargetItem( e );
+               if ( item && item !== this.selecting && item.isSelectable() ) {
+                       this.pressItem( item );
+                       this.selecting = item;
+               }
+       }
+       return false;
+};
+
+/**
+ * Handle mouse over events.
+ *
+ * @private
+ * @param {jQuery.Event} e Mouse over event
+ */
+OO.ui.SelectWidget.prototype.onMouseOver = function ( e ) {
+       var item;
+
+       if ( !this.disabled ) {
+               item = this.getTargetItem( e );
+               this.highlightItem( item && item.isHighlightable() ? item : null );
+       }
+       return false;
+};
+
+/**
+ * Handle mouse leave events.
+ *
+ * @private
+ * @param {jQuery.Event} e Mouse over event
+ */
+OO.ui.SelectWidget.prototype.onMouseLeave = function () {
+       if ( !this.disabled ) {
+               this.highlightItem( null );
+       }
+       return false;
+};
+
+/**
+ * Get the closest item to a jQuery.Event.
+ *
+ * @private
+ * @param {jQuery.Event} e
+ * @return {OO.ui.OptionWidget|null} Outline item widget, `null` if none was found
+ */
+OO.ui.SelectWidget.prototype.getTargetItem = function ( e ) {
+       var $item = this.$( e.target ).closest( '.oo-ui-optionWidget' );
+       if ( $item.length ) {
+               return $item.data( 'oo-ui-optionWidget' );
+       }
+       return null;
+};
+
+/**
+ * Get selected item.
+ *
+ * @return {OO.ui.OptionWidget|null} Selected item, `null` if no item is selected
+ */
+OO.ui.SelectWidget.prototype.getSelectedItem = function () {
+       var i, len;
+
+       for ( i = 0, len = this.items.length; i < len; i++ ) {
+               if ( this.items[i].isSelected() ) {
+                       return this.items[i];
+               }
+       }
+       return null;
+};
+
+/**
+ * Get highlighted item.
+ *
+ * @return {OO.ui.OptionWidget|null} Highlighted item, `null` if no item is highlighted
+ */
+OO.ui.SelectWidget.prototype.getHighlightedItem = function () {
+       var i, len;
+
+       for ( i = 0, len = this.items.length; i < len; i++ ) {
+               if ( this.items[i].isHighlighted() ) {
+                       return this.items[i];
+               }
+       }
+       return null;
+};
+
+/**
+ * Get an existing item with equivilant data.
+ *
+ * @param {Object} data Item data to search for
+ * @return {OO.ui.OptionWidget|null} Item with equivilent value, `null` if none exists
+ */
+OO.ui.SelectWidget.prototype.getItemFromData = function ( data ) {
+       var hash = OO.getHash( data );
+
+       if ( hash in this.hashes ) {
+               return this.hashes[hash];
+       }
+
+       return null;
+};
+
+/**
+ * Toggle pressed state.
+ *
+ * @param {boolean} pressed An option is being pressed
+ */
+OO.ui.SelectWidget.prototype.togglePressed = function ( pressed ) {
+       if ( pressed === undefined ) {
+               pressed = !this.pressed;
+       }
+       if ( pressed !== this.pressed ) {
+               this.$element.toggleClass( 'oo-ui-selectWidget-pressed', pressed );
+               this.$element.toggleClass( 'oo-ui-selectWidget-depressed', !pressed );
+               this.pressed = pressed;
+       }
+};
+
+/**
+ * Highlight an item.
+ *
+ * Highlighting is mutually exclusive.
+ *
+ * @param {OO.ui.OptionWidget} [item] Item to highlight, omit to deselect all
+ * @fires highlight
+ * @chainable
+ */
+OO.ui.SelectWidget.prototype.highlightItem = function ( item ) {
+       var i, len, highlighted,
+               changed = false;
+
+       for ( i = 0, len = this.items.length; i < len; i++ ) {
+               highlighted = this.items[i] === item;
+               if ( this.items[i].isHighlighted() !== highlighted ) {
+                       this.items[i].setHighlighted( highlighted );
+                       changed = true;
+               }
+       }
+       if ( changed ) {
+               this.emit( 'highlight', item );
+       }
+
+       return this;
+};
+
+/**
+ * Select an item.
+ *
+ * @param {OO.ui.OptionWidget} [item] Item to select, omit to deselect all
+ * @fires select
+ * @chainable
+ */
+OO.ui.SelectWidget.prototype.selectItem = function ( item ) {
+       var i, len, selected,
+               changed = false;
+
+       for ( i = 0, len = this.items.length; i < len; i++ ) {
+               selected = this.items[i] === item;
+               if ( this.items[i].isSelected() !== selected ) {
+                       this.items[i].setSelected( selected );
+                       changed = true;
+               }
+       }
+       if ( changed ) {
+               this.emit( 'select', item );
+       }
+
+       return this;
+};
+
+/**
+ * Press an item.
+ *
+ * @param {OO.ui.OptionWidget} [item] Item to press, omit to depress all
+ * @fires press
+ * @chainable
+ */
+OO.ui.SelectWidget.prototype.pressItem = function ( item ) {
+       var i, len, pressed,
+               changed = false;
+
+       for ( i = 0, len = this.items.length; i < len; i++ ) {
+               pressed = this.items[i] === item;
+               if ( this.items[i].isPressed() !== pressed ) {
+                       this.items[i].setPressed( pressed );
+                       changed = true;
+               }
+       }
+       if ( changed ) {
+               this.emit( 'press', item );
+       }
+
+       return this;
+};
+
+/**
+ * Choose an item.
+ *
+ * Identical to #selectItem, but may vary in subclasses that want to take additional action when
+ * an item is selected using the keyboard or mouse.
+ *
+ * @param {OO.ui.OptionWidget} item Item to choose
+ * @fires choose
+ * @chainable
+ */
+OO.ui.SelectWidget.prototype.chooseItem = function ( item ) {
+       this.selectItem( item );
+       this.emit( 'choose', item );
+
+       return this;
+};
+
+/**
+ * Get an item relative to another one.
+ *
+ * @param {OO.ui.OptionWidget} item Item to start at
+ * @param {number} direction Direction to move in
+ * @return {OO.ui.OptionWidget|null} Item at position, `null` if there are no items in the menu
+ */
+OO.ui.SelectWidget.prototype.getRelativeSelectableItem = function ( item, direction ) {
+       var inc = direction > 0 ? 1 : -1,
+               len = this.items.length,
+               index = item instanceof OO.ui.OptionWidget ?
+                       $.inArray( item, this.items ) : ( inc > 0 ? -1 : 0 ),
+               stopAt = Math.max( Math.min( index, len - 1 ), 0 ),
+               i = inc > 0 ?
+                       // Default to 0 instead of -1, if nothing is selected let's start at the beginning
+                       Math.max( index, -1 ) :
+                       // Default to n-1 instead of -1, if nothing is selected let's start at the end
+                       Math.min( index, len );
+
+       while ( true ) {
+               i = ( i + inc + len ) % len;
+               item = this.items[i];
+               if ( item instanceof OO.ui.OptionWidget && item.isSelectable() ) {
+                       return item;
+               }
+               // Stop iterating when we've looped all the way around
+               if ( i === stopAt ) {
+                       break;
+               }
+       }
+       return null;
+};
+
+/**
+ * Get the next selectable item.
+ *
+ * @return {OO.ui.OptionWidget|null} Item, `null` if ther aren't any selectable items
+ */
+OO.ui.SelectWidget.prototype.getFirstSelectableItem = function () {
+       var i, len, item;
+
+       for ( i = 0, len = this.items.length; i < len; i++ ) {
+               item = this.items[i];
+               if ( item instanceof OO.ui.OptionWidget && item.isSelectable() ) {
+                       return item;
+               }
+       }
+
+       return null;
+};
+
+/**
+ * Add items.
+ *
+ * When items are added with the same values as existing items, the existing items will be
+ * automatically removed before the new items are added.
+ *
+ * @param {OO.ui.OptionWidget[]} items Items to add
+ * @param {number} [index] Index to insert items after
+ * @fires add
+ * @chainable
+ */
+OO.ui.SelectWidget.prototype.addItems = function ( items, index ) {
+       var i, len, item, hash,
+               remove = [];
+
+       for ( i = 0, len = items.length; i < len; i++ ) {
+               item = items[i];
+               hash = OO.getHash( item.getData() );
+               if ( hash in this.hashes ) {
+                       // Remove item with same value
+                       remove.push( this.hashes[hash] );
+               }
+               this.hashes[hash] = item;
+       }
+       if ( remove.length ) {
+               this.removeItems( remove );
+       }
+
+       OO.ui.GroupElement.prototype.addItems.call( this, items, index );
+
+       // Always provide an index, even if it was omitted
+       this.emit( 'add', items, index === undefined ? this.items.length - items.length - 1 : index );
+
+       return this;
+};
+
+/**
+ * Remove items.
+ *
+ * Items will be detached, not removed, so they can be used later.
+ *
+ * @param {OO.ui.OptionWidget[]} items Items to remove
+ * @fires remove
+ * @chainable
+ */
+OO.ui.SelectWidget.prototype.removeItems = function ( items ) {
+       var i, len, item, hash;
+
+       for ( i = 0, len = items.length; i < len; i++ ) {
+               item = items[i];
+               hash = OO.getHash( item.getData() );
+               if ( hash in this.hashes ) {
+                       // Remove existing item
+                       delete this.hashes[hash];
+               }
+               if ( item.isSelected() ) {
+                       this.selectItem( null );
+               }
+       }
+       OO.ui.GroupElement.prototype.removeItems.call( this, items );
+
+       this.emit( 'remove', items );
+
+       return this;
+};
+
+/**
+ * Clear all items.
+ *
+ * Items will be detached, not removed, so they can be used later.
+ *
+ * @fires remove
+ * @chainable
+ */
+OO.ui.SelectWidget.prototype.clearItems = function () {
+       var items = this.items.slice();
+
+       // Clear all items
+       this.hashes = {};
+       OO.ui.GroupElement.prototype.clearItems.call( this );
+       this.selectItem( null );
+
+       this.emit( 'remove', items );
+
+       return this;
+};
+/**
+ * Menu item widget.
+ *
+ * Use with OO.ui.MenuWidget.
+ *
+ * @class
+ * @extends OO.ui.OptionWidget
+ *
+ * @constructor
+ * @param {Mixed} data Item data
+ * @param {Object} [config] Configuration options
+ */
+OO.ui.MenuItemWidget = function OoUiMenuItemWidget( data, config ) {
+       // Configuration initialization
+       config = $.extend( { 'icon': 'check' }, config );
+
+       // Parent constructor
+       OO.ui.MenuItemWidget.super.call( this, data, config );
+
+       // Initialization
+       this.$element.addClass( 'oo-ui-menuItemWidget' );
+};
+
+/* Setup */
+
+OO.inheritClass( OO.ui.MenuItemWidget, OO.ui.OptionWidget );
+/**
+ * Menu widget.
+ *
+ * Use together with OO.ui.MenuItemWidget.
+ *
+ * @class
+ * @extends OO.ui.SelectWidget
+ * @mixins OO.ui.ClippableElement
+ *
+ * @constructor
+ * @param {Object} [config] Configuration options
+ * @cfg {OO.ui.InputWidget} [input] Input to bind keyboard handlers to
+ */
+OO.ui.MenuWidget = function OoUiMenuWidget( config ) {
+       // Config intialization
+       config = config || {};
+
+       // Parent constructor
+       OO.ui.MenuWidget.super.call( this, config );
+
+       // Mixin constructors
+       OO.ui.ClippableElement.call( this, this.$group, config );
+
+       // Properties
+       this.newItems = null;
+       this.$input = config.input ? config.input.$input : null;
+       this.$previousFocus = null;
+       this.isolated = !config.input;
+       this.visible = false;
+       this.flashing = false;
+       this.onKeyDownHandler = OO.ui.bind( this.onKeyDown, this );
+
+       // Initialization
+       this.$element.hide().addClass( 'oo-ui-menuWidget' );
+};
+
+/* Setup */
+
+OO.inheritClass( OO.ui.MenuWidget, OO.ui.SelectWidget );
+OO.mixinClass( OO.ui.MenuWidget, OO.ui.ClippableElement );
+
+/* Methods */
+
+/**
+ * Handles key down events.
+ *
+ * @param {jQuery.Event} e Key down event
+ */
+OO.ui.MenuWidget.prototype.onKeyDown = function ( e ) {
+       var nextItem,
+               handled = false,
+               highlightItem = this.getHighlightedItem();
+
+       if ( !this.disabled && this.visible ) {
+               if ( !highlightItem ) {
+                       highlightItem = this.getSelectedItem();
+               }
+               switch ( e.keyCode ) {
+                       case OO.ui.Keys.ENTER:
+                               this.chooseItem( highlightItem );
+                               handled = true;
+                               break;
+                       case OO.ui.Keys.UP:
+                               nextItem = this.getRelativeSelectableItem( highlightItem, -1 );
+                               handled = true;
+                               break;
+                       case OO.ui.Keys.DOWN:
+                               nextItem = this.getRelativeSelectableItem( highlightItem, 1 );
+                               handled = true;
+                               break;
+                       case OO.ui.Keys.ESCAPE:
+                               if ( highlightItem ) {
+                                       highlightItem.setHighlighted( false );
+                               }
+                               this.hide();
+                               handled = true;
+                               break;
+               }
+
+               if ( nextItem ) {
+                       this.highlightItem( nextItem );
+                       nextItem.scrollElementIntoView();
+               }
+
+               if ( handled ) {
+                       e.preventDefault();
+                       e.stopPropagation();
+                       return false;
+               }
+       }
+};
+
+/**
+ * Check if the menu is visible.
+ *
+ * @return {boolean} Menu is visible
+ */
+OO.ui.MenuWidget.prototype.isVisible = function () {
+       return this.visible;
+};
+
+/**
+ * Bind key down listener.
+ */
+OO.ui.MenuWidget.prototype.bindKeyDownListener = function () {
+       if ( this.$input ) {
+               this.$input.on( 'keydown', this.onKeyDownHandler );
+       } else {
+               // Capture menu navigation keys
+               this.getElementWindow().addEventListener( 'keydown', this.onKeyDownHandler, true );
+       }
+};
+
+/**
+ * Unbind key down listener.
+ */
+OO.ui.MenuWidget.prototype.unbindKeyDownListener = function () {
+       if ( this.$input ) {
+               this.$input.off( 'keydown' );
+       } else {
+               this.getElementWindow().removeEventListener( 'keydown', this.onKeyDownHandler, true );
+       }
+};
+
+/**
+ * Choose an item.
+ *
+ * This will close the menu when done, unlike selectItem which only changes selection.
+ *
+ * @param {OO.ui.OptionWidget} item Item to choose
+ * @chainable
+ */
+OO.ui.MenuWidget.prototype.chooseItem = function ( item ) {
+       // Parent method
+       OO.ui.MenuWidget.super.prototype.chooseItem.call( this, item );
+
+       if ( item && !this.flashing ) {
+               this.flashing = true;
+               item.flash( OO.ui.bind( function () {
+                       this.hide();
+                       this.flashing = false;
+               }, this ) );
+       } else {
+               this.hide();
+       }
+
+       return this;
+};
+
+/**
+ * Add items.
+ *
+ * Adding an existing item (by value) will move it.
+ *
+ * @param {OO.ui.MenuItemWidget[]} items Items to add
+ * @param {number} [index] Index to insert items after
+ * @chainable
+ */
+OO.ui.MenuWidget.prototype.addItems = function ( items, index ) {
+       var i, len, item;
+
+       // Parent method
+       OO.ui.SelectWidget.prototype.addItems.call( this, items, index );
+
+       // Auto-initialize
+       if ( !this.newItems ) {
+               this.newItems = [];
+       }
+
+       for ( i = 0, len = items.length; i < len; i++ ) {
+               item = items[i];
+               if ( this.visible ) {
+                       // Defer fitting label until
+                       item.fitLabel();
+               } else {
+                       this.newItems.push( item );
+               }
+       }
+
+       return this;
+};
+
+/**
+ * Show the menu.
+ *
+ * @chainable
+ */
+OO.ui.MenuWidget.prototype.show = function () {
+       var i, len;
+
+       if ( this.items.length ) {
+               this.$element.show();
+               this.visible = true;
+               this.bindKeyDownListener();
+
+               // Change focus to enable keyboard navigation
+               if ( this.isolated && this.$input && !this.$input.is( ':focus' ) ) {
+                       this.$previousFocus = this.$( ':focus' );
+                       this.$input.focus();
+               }
+               if ( this.newItems && this.newItems.length ) {
+                       for ( i = 0, len = this.newItems.length; i < len; i++ ) {
+                               this.newItems[i].fitLabel();
+                       }
+                       this.newItems = null;
+               }
+
+               this.setClipping( true );
+       }
+
+       return this;
+};
+
+/**
+ * Hide the menu.
+ *
+ * @chainable
+ */
+OO.ui.MenuWidget.prototype.hide = function () {
+       this.$element.hide();
+       this.visible = false;
+       this.unbindKeyDownListener();
+
+       if ( this.isolated && this.$previousFocus ) {
+               this.$previousFocus.focus();
+               this.$previousFocus = null;
+       }
+
+       this.setClipping( false );
+
+       return this;
+};
+/**
+ * Inline menu of options.
+ *
+ * Use with OO.ui.MenuOptionWidget.
+ *
+ * @class
+ * @extends OO.ui.Widget
+ * @mixins OO.ui.IconedElement
+ * @mixins OO.ui.IndicatedElement
+ * @mixins OO.ui.LabeledElement
+ * @mixins OO.ui.TitledElement
+ *
+ * @constructor
+ * @param {Object} [config] Configuration options
+ * @cfg {Object} [menu] Configuration options to pass to menu widget
+ */
+OO.ui.InlineMenuWidget = function OoUiInlineMenuWidget( config ) {
+       // Configuration initialization
+       config = $.extend( { 'indicator': 'down' }, config );
+
+       // Parent constructor
+       OO.ui.InlineMenuWidget.super.call( this, config );
+
+       // Mixin constructors
+       OO.ui.IconedElement.call( this, this.$( '<span>' ), config );
+       OO.ui.IndicatedElement.call( this, this.$( '<span>' ), config );
+       OO.ui.LabeledElement.call( this, this.$( '<span>' ), config );
+       OO.ui.TitledElement.call( this, this.$label, config );
+
+       // Properties
+       this.menu = new OO.ui.MenuWidget( $.extend( { '$': this.$ }, config.menu ) );
+       this.$handle = this.$( '<span>' );
+
+       // Events
+       this.$element.on( { 'click': OO.ui.bind( this.onClick, this ) } );
+       this.menu.connect( this, { 'select': 'onMenuSelect' } );
+
+       // Initialization
+       this.$handle
+               .addClass( 'oo-ui-inlineMenuWidget-handle' )
+               .append( this.$icon, this.$label, this.$indicator );
+       this.$element
+               .addClass( 'oo-ui-inlineMenuWidget' )
+               .append( this.$handle, this.menu.$element );
+};
+
+/* Setup */
+
+OO.inheritClass( OO.ui.InlineMenuWidget, OO.ui.Widget );
+OO.mixinClass( OO.ui.InlineMenuWidget, OO.ui.IconedElement );
+OO.mixinClass( OO.ui.InlineMenuWidget, OO.ui.IndicatedElement );
+OO.mixinClass( OO.ui.InlineMenuWidget, OO.ui.LabeledElement );
+OO.mixinClass( OO.ui.InlineMenuWidget, OO.ui.TitledElement );
+
+/* Methods */
+
+/**
+ * Get the menu.
+ *
+ * @return {OO.ui.MenuWidget} Menu of widget
+ */
+OO.ui.InlineMenuWidget.prototype.getMenu = function () {
+       return this.menu;
+};
+
+/**
+ * Handles menu select events.
+ *
+ * @param {OO.ui.MenuItemWidget} item Selected menu item
+ */
+OO.ui.InlineMenuWidget.prototype.onMenuSelect = function ( item ) {
+       var selectedLabel;
+
+       if ( !item ) {
+               return;
+       }
+
+       selectedLabel = item.getLabel();
+
+       // If the label is a DOM element, clone it, because setLabel will append() it
+       if ( selectedLabel instanceof jQuery ) {
+               selectedLabel = selectedLabel.clone();
+       }
+
+       this.setLabel( selectedLabel );
+};
+
+/**
+ * Handles mouse click events.
+ *
+ * @param {jQuery.Event} e Mouse click event
+ */
+OO.ui.InlineMenuWidget.prototype.onClick = function ( e ) {
+       // Skip clicks within the menu
+       if ( $.contains( this.menu.$element[0], e.target ) ) {
+               return;
+       }
+
+       if ( !this.disabled ) {
+               if ( this.menu.isVisible() ) {
+                       this.menu.hide();
+               } else {
+                       this.menu.show();
+               }
+       }
+       return false;
+};
+/**
+ * Menu section item widget.
+ *
+ * Use with OO.ui.MenuWidget.
+ *
+ * @class
+ * @extends OO.ui.OptionWidget
+ *
+ * @constructor
+ * @param {Mixed} data Item data
+ * @param {Object} [config] Configuration options
+ */
+OO.ui.MenuSectionItemWidget = function OoUiMenuSectionItemWidget( data, config ) {
+       // Parent constructor
+       OO.ui.MenuSectionItemWidget.super.call( this, data, config );
+
+       // Initialization
+       this.$element.addClass( 'oo-ui-menuSectionItemWidget' );
+};
+
+/* Setup */
+
+OO.inheritClass( OO.ui.MenuSectionItemWidget, OO.ui.OptionWidget );
+
+/* Static Properties */
+
+OO.ui.MenuSectionItemWidget.static.selectable = false;
+
+OO.ui.MenuSectionItemWidget.static.highlightable = false;
+/**
+ * Create an OO.ui.OutlineWidget object.
+ *
+ * Use with OO.ui.OutlineItemWidget.
+ *
+ * @class
+ * @extends OO.ui.SelectWidget
+ *
+ * @constructor
+ * @param {Object} [config] Configuration options
+ */
+OO.ui.OutlineWidget = function OoUiOutlineWidget( config ) {
+       // Config intialization
+       config = config || {};
+
+       // Parent constructor
+       OO.ui.OutlineWidget.super.call( this, config );
+
+       // Initialization
+       this.$element.addClass( 'oo-ui-outlineWidget' );
+};
+
+/* Setup */
+
+OO.inheritClass( OO.ui.OutlineWidget, OO.ui.SelectWidget );
+/**
+ * Creates an OO.ui.OutlineControlsWidget object.
+ *
+ * Use together with OO.ui.OutlineWidget.js
+ *
+ * @class
+ *
+ * @constructor
+ * @param {OO.ui.OutlineWidget} outline Outline to control
+ * @param {Object} [config] Configuration options
+ */
+OO.ui.OutlineControlsWidget = function OoUiOutlineControlsWidget( outline, config ) {
+       // Configuration initialization
+       config = $.extend( { 'icon': 'add-item' }, config );
+
+       // Parent constructor
+       OO.ui.OutlineControlsWidget.super.call( this, config );
+
+       // Mixin constructors
+       OO.ui.GroupElement.call( this, this.$( '<div>' ), config );
+       OO.ui.IconedElement.call( this, this.$( '<div>' ), config );
+
+       // Properties
+       this.outline = outline;
+       this.$movers = this.$( '<div>' );
+       this.upButton = new OO.ui.ButtonWidget( {
+               '$': this.$,
+               'frameless': true,
+               'icon': 'collapse',
+               'title': OO.ui.msg( 'ooui-outline-control-move-up' )
+       } );
+       this.downButton = new OO.ui.ButtonWidget( {
+               '$': this.$,
+               'frameless': true,
+               'icon': 'expand',
+               'title': OO.ui.msg( 'ooui-outline-control-move-down' )
+       } );
+       this.removeButton = new OO.ui.ButtonWidget( {
+               '$': this.$,
+               'frameless': true,
+               'icon': 'remove',
+               'title': OO.ui.msg( 'ooui-outline-control-remove' )
+       } );
+
+       // Events
+       outline.connect( this, {
+               'select': 'onOutlineChange',
+               'add': 'onOutlineChange',
+               'remove': 'onOutlineChange'
+       } );
+       this.upButton.connect( this, { 'click': ['emit', 'move', -1] } );
+       this.downButton.connect( this, { 'click': ['emit', 'move', 1] } );
+       this.removeButton.connect( this, { 'click': ['emit', 'remove'] } );
+
+       // Initialization
+       this.$element.addClass( 'oo-ui-outlineControlsWidget' );
+       this.$group.addClass( 'oo-ui-outlineControlsWidget-adders' );
+       this.$movers
+               .addClass( 'oo-ui-outlineControlsWidget-movers' )
+               .append( this.removeButton.$element, this.upButton.$element, this.downButton.$element );
+       this.$element.append( this.$icon, this.$group, this.$movers );
+};
+
+/* Setup */
+
+OO.inheritClass( OO.ui.OutlineControlsWidget, OO.ui.Widget );
+OO.mixinClass( OO.ui.OutlineControlsWidget, OO.ui.GroupElement );
+OO.mixinClass( OO.ui.OutlineControlsWidget, OO.ui.IconedElement );
+
+/* Events */
+
+/**
+ * @event move
+ * @param {number} places Number of places to move
+ */
+
+/**
+ * @event remove
+ */
+
+/* Methods */
+
+/**
+ * Handle outline change events.
+ */
+OO.ui.OutlineControlsWidget.prototype.onOutlineChange = function () {
+       var i, len, firstMovable, lastMovable,
+               items = this.outline.getItems(),
+               selectedItem = this.outline.getSelectedItem(),
+               movable = selectedItem && selectedItem.isMovable(),
+               removable = selectedItem && selectedItem.isRemovable();
+
+       if ( movable ) {
+               i = -1;
+               len = items.length;
+               while ( ++i < len ) {
+                       if ( items[i].isMovable() ) {
+                               firstMovable = items[i];
+                               break;
+                       }
+               }
+               i = len;
+               while ( i-- ) {
+                       if ( items[i].isMovable() ) {
+                               lastMovable = items[i];
+                               break;
+                       }
+               }
+       }
+       this.upButton.setDisabled( !movable || selectedItem === firstMovable );
+       this.downButton.setDisabled( !movable || selectedItem === lastMovable );
+       this.removeButton.setDisabled( !removable );
+};
+/**
+ * Creates an OO.ui.OutlineItemWidget object.
+ *
+ * Use with OO.ui.OutlineWidget.
+ *
+ * @class
+ * @extends OO.ui.OptionWidget
+ *
+ * @constructor
+ * @param {Mixed} data Item data
+ * @param {Object} [config] Configuration options
+ * @cfg {number} [level] Indentation level
+ * @cfg {boolean} [movable] Allow modification from outline controls
+ */
+OO.ui.OutlineItemWidget = function OoUiOutlineItemWidget( data, config ) {
+       // Config intialization
+       config = config || {};
+
+       // Parent constructor
+       OO.ui.OutlineItemWidget.super.call( this, data, config );
+
+       // Properties
+       this.level = 0;
+       this.movable = !!config.movable;
+       this.removable = !!config.removable;
+
+       // Initialization
+       this.$element.addClass( 'oo-ui-outlineItemWidget' );
+       this.setLevel( config.level );
+};
+
+/* Setup */
+
+OO.inheritClass( OO.ui.OutlineItemWidget, OO.ui.OptionWidget );
+
+/* Static Properties */
+
+OO.ui.OutlineItemWidget.static.highlightable = false;
+
+OO.ui.OutlineItemWidget.static.scrollIntoViewOnSelect = true;
+
+OO.ui.OutlineItemWidget.static.levelClass = 'oo-ui-outlineItemWidget-level-';
+
+OO.ui.OutlineItemWidget.static.levels = 3;
+
+/* Methods */
+
+/**
+ * Check if item is movable.
+ *
+ * Movablilty is used by outline controls.
+ *
+ * @return {boolean} Item is movable
+ */
+OO.ui.OutlineItemWidget.prototype.isMovable = function () {
+       return this.movable;
+};
+
+/**
+ * Check if item is removable.
+ *
+ * Removablilty is used by outline controls.
+ *
+ * @return {boolean} Item is removable
+ */
+OO.ui.OutlineItemWidget.prototype.isRemovable = function () {
+       return this.removable;
+};
+
+/**
+ * Get indentation level.
+ *
+ * @return {number} Indentation level
+ */
+OO.ui.OutlineItemWidget.prototype.getLevel = function () {
+       return this.level;
+};
+
+/**
+ * Set movability.
+ *
+ * Movablilty is used by outline controls.
+ *
+ * @param {boolean} movable Item is movable
+ * @chainable
+ */
+OO.ui.OutlineItemWidget.prototype.setMovable = function ( movable ) {
+       this.movable = !!movable;
+       return this;
+};
+
+/**
+ * Set removability.
+ *
+ * Removablilty is used by outline controls.
+ *
+ * @param {boolean} movable Item is removable
+ * @chainable
+ */
+OO.ui.OutlineItemWidget.prototype.setRemovable = function ( removable ) {
+       this.removable = !!removable;
+       return this;
+};
+
+/**
+ * Set indentation level.
+ *
+ * @param {number} [level=0] Indentation level, in the range of [0,#maxLevel]
+ * @chainable
+ */
+OO.ui.OutlineItemWidget.prototype.setLevel = function ( level ) {
+       var levels = this.constructor.static.levels,
+               levelClass = this.constructor.static.levelClass,
+               i = levels;
+
+       this.level = level ? Math.max( 0, Math.min( levels - 1, level ) ) : 0;
+       while ( i-- ) {
+               if ( this.level === i ) {
+                       this.$element.addClass( levelClass + i );
+               } else {
+                       this.$element.removeClass( levelClass + i );
+               }
+       }
+
+       return this;
+};
+/**
+ * Option widget that looks like a button.
+ *
+ * Use together with OO.ui.ButtonSelectWidget.
+ *
+ * @class
+ * @extends OO.ui.OptionWidget
+ * @mixins OO.ui.ButtonedElement
+ * @mixins OO.ui.FlaggableElement
+ *
+ * @constructor
+ * @param {Mixed} data Option data
+ * @param {Object} [config] Configuration options
+ */
+OO.ui.ButtonOptionWidget = function OoUiButtonOptionWidget( data, config ) {
+       // Parent constructor
+       OO.ui.ButtonOptionWidget.super.call( this, data, config );
+
+       // Mixin constructors
+       OO.ui.ButtonedElement.call( this, this.$( '<a>' ), config );
+       OO.ui.FlaggableElement.call( this, config );
+
+       // Initialization
+       this.$element.addClass( 'oo-ui-buttonOptionWidget' );
+       this.$button.append( this.$element.contents() );
+       this.$element.append( this.$button );
+};
+
+/* Setup */
+
+OO.inheritClass( OO.ui.ButtonOptionWidget, OO.ui.OptionWidget );
+OO.mixinClass( OO.ui.ButtonOptionWidget, OO.ui.ButtonedElement );
+OO.mixinClass( OO.ui.ButtonOptionWidget, OO.ui.FlaggableElement );
+
+/* Methods */
+
+/**
+ * @inheritdoc
+ */
+OO.ui.ButtonOptionWidget.prototype.setSelected = function ( state ) {
+       OO.ui.OptionWidget.prototype.setSelected.call( this, state );
+
+       this.setActive( state );
+
+       return this;
+};
+/**
+ * Select widget containing button options.
+ *
+ * Use together with OO.ui.ButtonOptionWidget.
+ *
+ * @class
+ * @extends OO.ui.SelectWidget
+ *
+ * @constructor
+ * @param {Object} [config] Configuration options
+ */
+OO.ui.ButtonSelectWidget = function OoUiButtonSelectWidget( config ) {
+       // Parent constructor
+       OO.ui.ButtonSelectWidget.super.call( this, config );
+
+       // Initialization
+       this.$element.addClass( 'oo-ui-buttonSelectWidget' );
+};
+
+/* Setup */
+
+OO.inheritClass( OO.ui.ButtonSelectWidget, OO.ui.SelectWidget );
+/**
+ * Container for content that is overlaid and positioned absolutely.
+ *
+ * @class
+ * @extends OO.ui.Widget
+ * @mixins OO.ui.LabeledElement
+ *
+ * @constructor
+ * @param {Object} [config] Configuration options
+ * @cfg {boolean} [tail=true] Show tail pointing to origin of popup
+ * @cfg {string} [align='center'] Alignment of popup to origin
+ * @cfg {jQuery} [$container] Container to prevent popup from rendering outside of
+ * @cfg {boolean} [autoClose=false] Popup auto-closes when it loses focus
+ * @cfg {jQuery} [$autoCloseIgnore] Elements to not auto close when clicked
+ * @cfg {boolean} [head] Show label and close button at the top
+ */
+OO.ui.PopupWidget = function OoUiPopupWidget( config ) {
+       // Config intialization
+       config = config || {};
+
+       // Parent constructor
+       OO.ui.PopupWidget.super.call( this, config );
+
+       // Mixin constructors
+       OO.ui.LabeledElement.call( this, this.$( '<div>' ), config );
+       OO.ui.ClippableElement.call( this, this.$( '<div>' ), config );
+
+       // Properties
+       this.visible = false;
+       this.$popup = this.$( '<div>' );
+       this.$head = this.$( '<div>' );
+       this.$body = this.$clippable;
+       this.$tail = this.$( '<div>' );
+       this.$container = config.$container || this.$( 'body' );
+       this.autoClose = !!config.autoClose;
+       this.$autoCloseIgnore = config.$autoCloseIgnore;
+       this.transitionTimeout = null;
+       this.tail = false;
+       this.align = config.align || 'center';
+       this.closeButton = new OO.ui.ButtonWidget( { '$': this.$, 'frameless': true, 'icon': 'close' } );
+       this.onMouseDownHandler = OO.ui.bind( this.onMouseDown, this );
+
+       // Events
+       this.closeButton.connect( this, { 'click': 'onCloseButtonClick' } );
+
+       // Initialization
+       this.useTail( config.tail !== undefined ? !!config.tail : true );
+       this.$body.addClass( 'oo-ui-popupWidget-body' );
+       this.$tail.addClass( 'oo-ui-popupWidget-tail' );
+       this.$head
+               .addClass( 'oo-ui-popupWidget-head' )
+               .append( this.$label, this.closeButton.$element );
+       if ( !config.head ) {
+               this.$head.hide();
+       }
+       this.$popup
+               .addClass( 'oo-ui-popupWidget-popup' )
+               .append( this.$head, this.$body );
+       this.$element.hide()
+               .addClass( 'oo-ui-popupWidget' )
+               .append( this.$popup, this.$tail );
+};
+
+/* Setup */
+
+OO.inheritClass( OO.ui.PopupWidget, OO.ui.Widget );
+OO.mixinClass( OO.ui.PopupWidget, OO.ui.LabeledElement );
+OO.mixinClass( OO.ui.PopupWidget, OO.ui.ClippableElement );
+
+/* Events */
+
+/**
+ * @event hide
+ */
+
+/**
+ * @event show
+ */
+
+/* Methods */
+
+/**
+ * Handles mouse down events.
+ *
+ * @param {jQuery.Event} e Mouse down event
+ */
+OO.ui.PopupWidget.prototype.onMouseDown = function ( e ) {
+       if (
+               this.visible &&
+               !$.contains( this.$element[0], e.target ) &&
+               ( !this.$autoCloseIgnore || !this.$autoCloseIgnore.has( e.target ).length )
+       ) {
+               this.hide();
+       }
+};
+
+/**
+ * Bind mouse down listener.
+ */
+OO.ui.PopupWidget.prototype.bindMouseDownListener = function () {
+       // Capture clicks outside popup
+       this.getElementWindow().addEventListener( 'mousedown', this.onMouseDownHandler, true );
+};
+
+/**
+ * Handles close button click events.
+ */
+OO.ui.PopupWidget.prototype.onCloseButtonClick = function () {
+       if ( this.visible ) {
+               this.hide();
+       }
+};
+
+/**
+ * Unbind mouse down listener.
+ */
+OO.ui.PopupWidget.prototype.unbindMouseDownListener = function () {
+       this.getElementWindow().removeEventListener( 'mousedown', this.onMouseDownHandler, true );
+};
+
+/**
+ * Check if the popup is visible.
+ *
+ * @return {boolean} Popup is visible
+ */
+OO.ui.PopupWidget.prototype.isVisible = function () {
+       return this.visible;
+};
+
+/**
+ * Set whether to show a tail.
+ *
+ * @return {boolean} Make tail visible
+ */
+OO.ui.PopupWidget.prototype.useTail = function ( value ) {
+       value = !!value;
+       if ( this.tail !== value ) {
+               this.tail = value;
+               if ( value ) {
+                       this.$element.addClass( 'oo-ui-popupWidget-tailed' );
+               } else {
+                       this.$element.removeClass( 'oo-ui-popupWidget-tailed' );
+               }
+       }
+};
+
+/**
+ * Check if showing a tail.
+ *
+ * @return {boolean} tail is visible
+ */
+OO.ui.PopupWidget.prototype.hasTail = function () {
+       return this.tail;
+};
+
+/**
+ * Show the context.
+ *
+ * @fires show
+ * @chainable
+ */
+OO.ui.PopupWidget.prototype.show = function () {
+       if ( !this.visible ) {
+               this.setClipping( true );
+               this.$element.show();
+               this.visible = true;
+               this.emit( 'show' );
+               if ( this.autoClose ) {
+                       this.bindMouseDownListener();
+               }
+       }
+       return this;
+};
+
+/**
+ * Hide the context.
+ *
+ * @fires hide
+ * @chainable
+ */
+OO.ui.PopupWidget.prototype.hide = function () {
+       if ( this.visible ) {
+               this.setClipping( false );
+               this.$element.hide();
+               this.visible = false;
+               this.emit( 'hide' );
+               if ( this.autoClose ) {
+                       this.unbindMouseDownListener();
+               }
+       }
+       return this;
+};
+
+/**
+ * Updates the position and size.
+ *
+ * @param {number} width Width
+ * @param {number} height Height
+ * @param {boolean} [transition=false] Use a smooth transition
+ * @chainable
+ */
+OO.ui.PopupWidget.prototype.display = function ( width, height, transition ) {
+       var padding = 10,
+               originOffset = Math.round( this.$element.offset().left ),
+               containerLeft = Math.round( this.$container.offset().left ),
+               containerWidth = this.$container.innerWidth(),
+               containerRight = containerLeft + containerWidth,
+               popupOffset = width * ( { 'left': 0, 'center': -0.5, 'right': -1 } )[this.align],
+               popupLeft = popupOffset - padding,
+               popupRight = popupOffset + padding + width + padding,
+               overlapLeft = ( originOffset + popupLeft ) - containerLeft,
+               overlapRight = containerRight - ( originOffset + popupRight );
+
+       // Prevent transition from being interrupted
+       clearTimeout( this.transitionTimeout );
+       if ( transition ) {
+               // Enable transition
+               this.$element.addClass( 'oo-ui-popupWidget-transitioning' );
+       }
+
+       if ( overlapRight < 0 ) {
+               popupOffset += overlapRight;
+       } else if ( overlapLeft < 0 ) {
+               popupOffset -= overlapLeft;
+       }
+
+       // Position body relative to anchor and resize
+       this.$popup.css( {
+               'left': popupOffset,
+               'width': width,
+               'height': height === undefined ? 'auto' : height
+       } );
+
+       if ( transition ) {
+               // Prevent transitioning after transition is complete
+               this.transitionTimeout = setTimeout( OO.ui.bind( function () {
+                       this.$element.removeClass( 'oo-ui-popupWidget-transitioning' );
+               }, this ), 200 );
+       } else {
+               // Prevent transitioning immediately
+               this.$element.removeClass( 'oo-ui-popupWidget-transitioning' );
+       }
+
+       return this;
+};
+/**
+ * Button that shows and hides a popup.
+ *
+ * @class
+ * @extends OO.ui.ButtonWidget
+ * @mixins OO.ui.PopuppableElement
+ *
+ * @constructor
+ * @param {Object} [config] Configuration options
+ */
+OO.ui.PopupButtonWidget = function OoUiPopupButtonWidget( config ) {
+       // Parent constructor
+       OO.ui.PopupButtonWidget.super.call( this, config );
+
+       // Mixin constructors
+       OO.ui.PopuppableElement.call( this, config );
+
+       // Initialization
+       this.$element
+               .addClass( 'oo-ui-popupButtonWidget' )
+               .append( this.popup.$element );
+};
+
+/* Setup */
+
+OO.inheritClass( OO.ui.PopupButtonWidget, OO.ui.ButtonWidget );
+OO.mixinClass( OO.ui.PopupButtonWidget, OO.ui.PopuppableElement );
+
+/* Methods */
+
+/**
+ * Handles mouse click events.
+ *
+ * @param {jQuery.Event} e Mouse click event
+ */
+OO.ui.PopupButtonWidget.prototype.onClick = function ( e ) {
+       // Skip clicks within the popup
+       if ( $.contains( this.popup.$element[0], e.target ) ) {
+               return;
+       }
+
+       if ( !this.disabled ) {
+               if ( this.popup.isVisible() ) {
+                       this.hidePopup();
+               } else {
+                       this.showPopup();
+               }
+               OO.ui.ButtonWidget.prototype.onClick.call( this );
+       }
+       return false;
+};
+/**
+ * Search widget.
+ *
+ * Combines query and results selection widgets.
+ *
+ * @class
+ * @extends OO.ui.Widget
+ *
+ * @constructor
+ * @param {Object} [config] Configuration options
+ * @cfg {string|jQuery} [placeholder] Placeholder text for query input
+ * @cfg {string} [value] Initial query value
+ */
+OO.ui.SearchWidget = function OoUiSearchWidget( config ) {
+       // Configuration intialization
+       config = config || {};
+
+       // Parent constructor
+       OO.ui.SearchWidget.super.call( this, config );
+
+       // Properties
+       this.query = new OO.ui.TextInputWidget( {
+               '$': this.$,
+               'icon': 'search',
+               'placeholder': config.placeholder,
+               'value': config.value
+       } );
+       this.results = new OO.ui.SelectWidget( { '$': this.$ } );
+       this.$query = this.$( '<div>' );
+       this.$results = this.$( '<div>' );
+
+       // Events
+       this.query.connect( this, {
+               'change': 'onQueryChange',
+               'enter': 'onQueryEnter'
+       } );
+       this.results.connect( this, {
+               'highlight': 'onResultsHighlight',
+               'select': 'onResultsSelect'
+       } );
+       this.query.$input.on( 'keydown', OO.ui.bind( this.onQueryKeydown, this ) );
+
+       // Initialization
+       this.$query
+               .addClass( 'oo-ui-searchWidget-query' )
+               .append( this.query.$element );
+       this.$results
+               .addClass( 'oo-ui-searchWidget-results' )
+               .append( this.results.$element );
+       this.$element
+               .addClass( 'oo-ui-searchWidget' )
+               .append( this.$results, this.$query );
+};
+
+/* Setup */
+
+OO.inheritClass( OO.ui.SearchWidget, OO.ui.Widget );
+
+/* Events */
+
+/**
+ * @event highlight
+ * @param {Object|null} item Item data or null if no item is highlighted
+ */
+
+/**
+ * @event select
+ * @param {Object|null} item Item data or null if no item is selected
+ */
+
+/* Methods */
+
+/**
+ * Handle query key down events.
+ *
+ * @param {jQuery.Event} e Key down event
+ */
+OO.ui.SearchWidget.prototype.onQueryKeydown = function ( e ) {
+       var highlightedItem, nextItem,
+               dir = e.which === OO.ui.Keys.DOWN ? 1 : ( e.which === OO.ui.Keys.UP ? -1 : 0 );
+
+       if ( dir ) {
+               highlightedItem = this.results.getHighlightedItem();
+               if ( !highlightedItem ) {
+                       highlightedItem = this.results.getSelectedItem();
+               }
+               nextItem = this.results.getRelativeSelectableItem( highlightedItem, dir );
+               this.results.highlightItem( nextItem );
+               nextItem.scrollElementIntoView();
+       }
+};
+
+/**
+ * Handle select widget select events.
+ *
+ * Clears existing results. Subclasses should repopulate items according to new query.
+ *
+ * @param {string} value New value
+ */
+OO.ui.SearchWidget.prototype.onQueryChange = function () {
+       // Reset
+       this.results.clearItems();
+};
+
+/**
+ * Handle select widget enter key events.
+ *
+ * Selects highlighted item.
+ *
+ * @param {string} value New value
+ */
+OO.ui.SearchWidget.prototype.onQueryEnter = function () {
+       // Reset
+       this.results.selectItem( this.results.getHighlightedItem() );
+};
+
+/**
+ * Handle select widget highlight events.
+ *
+ * @param {OO.ui.OptionWidget} item Highlighted item
+ * @fires highlight
+ */
+OO.ui.SearchWidget.prototype.onResultsHighlight = function ( item ) {
+       this.emit( 'highlight', item ? item.getData() : null );
+};
+
+/**
+ * Handle select widget select events.
+ *
+ * @param {OO.ui.OptionWidget} item Selected item
+ * @fires select
+ */
+OO.ui.SearchWidget.prototype.onResultsSelect = function ( item ) {
+       this.emit( 'select', item ? item.getData() : null );
+};
+
+/**
+ * Get the query input.
+ *
+ * @return {OO.ui.TextInputWidget} Query input
+ */
+OO.ui.SearchWidget.prototype.getQuery = function () {
+       return this.query;
+};
+
+/**
+ * Reset the widget to initial value.
+ */
+OO.ui.SearchWidget.prototype.clear = function () {
+       this.query.setValue( '' );
+};
+
+/**
+ * Get the results list.
+ *
+ * @return {OO.ui.SelectWidget} Select list
+ */
+OO.ui.SearchWidget.prototype.getResults = function () {
+       return this.results;
+};
+/**
+ * Text input widget.
+ *
+ * @class
+ * @extends OO.ui.InputWidget
+ *
+ * @constructor
+ * @param {Object} [config] Configuration options
+ * @cfg {string} [placeholder] Placeholder text
+ * @cfg {string} [icon] Symbolic name of icon
+ * @cfg {boolean} [multiline=false] Allow multiple lines of text
+ * @cfg {boolean} [autosize=false] Automatically resize to fit content
+ * @cfg {boolean} [maxRows=10] Maximum number of rows to make visible when autosizing
+ */
+OO.ui.TextInputWidget = function OoUiTextInputWidget( config ) {
+       config = $.extend( { 'maxRows': 10 }, config );
+
+       // Parent constructor
+       OO.ui.TextInputWidget.super.call( this, config );
+
+       // Properties
+       this.pending = 0;
+       this.multiline = !!config.multiline;
+       this.autosize = !!config.autosize;
+       this.maxRows = config.maxRows;
+
+       // Events
+       this.$input.on( 'keypress', OO.ui.bind( this.onKeyPress, this ) );
+       this.$element.on( 'DOMNodeInsertedIntoDocument', OO.ui.bind( this.onElementAttach, this ) );
+
+       // Initialization
+       this.$element.addClass( 'oo-ui-textInputWidget' );
+       if ( config.icon ) {
+               this.$element.addClass( 'oo-ui-textInputWidget-decorated' );
+               this.$element.append(
+                       this.$( '<span>' )
+                               .addClass( 'oo-ui-textInputWidget-icon oo-ui-icon-' + config.icon )
+                               .mousedown( OO.ui.bind( function () {
+                                       this.$input.focus();
+                                       return false;
+                               }, this ) )
+               );
+       }
+       if ( config.placeholder ) {
+               this.$input.attr( 'placeholder', config.placeholder );
+       }
+};
+
+/* Setup */
+
+OO.inheritClass( OO.ui.TextInputWidget, OO.ui.InputWidget );
+
+/* Events */
+
+/**
+ * User presses enter inside the text box.
+ *
+ * Not called if input is multiline.
+ *
+ * @event enter
+ */
+
+/* Methods */
+
+/**
+ * Handle key press events.
+ *
+ * @param {jQuery.Event} e Key press event
+ * @fires enter If enter key is pressed and input is not multiline
+ */
+OO.ui.TextInputWidget.prototype.onKeyPress = function ( e ) {
+       if ( e.which === OO.ui.Keys.ENTER && !this.multiline ) {
+               this.emit( 'enter' );
+       }
+};
+
+/**
+ * Handle element attach events.
+ *
+ * @param {jQuery.Event} e Element attach event
+ */
+OO.ui.TextInputWidget.prototype.onElementAttach = function () {
+       this.adjustSize();
+};
+
+/**
+ * @inheritdoc
+ */
+OO.ui.TextInputWidget.prototype.onEdit = function () {
+       this.adjustSize();
+
+       // Parent method
+       return OO.ui.InputWidget.prototype.onEdit.call( this );
+};
+
+/**
+ * Automatically adjust the size of the text input.
+ *
+ * This only affects multi-line inputs that are auto-sized.
+ *
+ * @chainable
+ */
+OO.ui.TextInputWidget.prototype.adjustSize = function () {
+       var $clone, scrollHeight, innerHeight, outerHeight, maxInnerHeight, idealHeight;
+
+       if ( this.multiline && this.autosize ) {
+               $clone = this.$input.clone()
+                       .val( this.$input.val() )
+                       .css( { 'height': 0 } )
+                       .insertAfter( this.$input );
+               // Set inline height property to 0 to measure scroll height
+               scrollHeight = $clone[0].scrollHeight;
+               // Remove inline height property to measure natural heights
+               $clone.css( 'height', '' );
+               innerHeight = $clone.innerHeight();
+               outerHeight = $clone.outerHeight();
+               // Measure max rows height
+               $clone.attr( 'rows', this.maxRows ).css( 'height', 'auto' );
+               maxInnerHeight = $clone.innerHeight();
+               $clone.removeAttr( 'rows' ).css( 'height', '' );
+               $clone.remove();
+               idealHeight = Math.min( maxInnerHeight, scrollHeight );
+               // Only apply inline height when expansion beyond natural height is needed
+               this.$input.css(
+                       'height',
+                       // Use the difference between the inner and outer height as a buffer
+                       idealHeight > outerHeight ? idealHeight + ( outerHeight - innerHeight ) : ''
+               );
+       }
+       return this;
+};
+
+/**
+ * Get input element.
+ *
+ * @param {Object} [config] Configuration options
+ * @return {jQuery} Input element
+ */
+OO.ui.TextInputWidget.prototype.getInputElement = function ( config ) {
+       return config.multiline ? this.$( '<textarea>' ) : this.$( '<input type="text" />' );
+};
+
+/* Methods */
+
+/**
+ * Check if input supports multiple lines.
+ *
+ * @return {boolean}
+ */
+OO.ui.TextInputWidget.prototype.isMultiline = function () {
+       return !!this.multiline;
+};
+
+/**
+ * Check if input automatically adjusts its size.
+ *
+ * @return {boolean}
+ */
+OO.ui.TextInputWidget.prototype.isAutosizing = function () {
+       return !!this.autosize;
+};
+
+/**
+ * Check if input is pending.
+ *
+ * @return {boolean}
+ */
+OO.ui.TextInputWidget.prototype.isPending = function () {
+       return !!this.pending;
+};
+
+/**
+ * Increase the pending stack.
+ *
+ * @chainable
+ */
+OO.ui.TextInputWidget.prototype.pushPending = function () {
+       this.pending++;
+       this.$element.addClass( 'oo-ui-textInputWidget-pending' );
+       this.$input.addClass( 'oo-ui-texture-pending' );
+       return this;
+};
+
+/**
+ * Reduce the pending stack.
+ *
+ * Clamped at zero.
+ *
+ * @chainable
+ */
+OO.ui.TextInputWidget.prototype.popPending = function () {
+       this.pending = Math.max( 0, this.pending - 1 );
+       if ( !this.pending ) {
+               this.$element.removeClass( 'oo-ui-textInputWidget-pending' );
+               this.$input.removeClass( 'oo-ui-texture-pending' );
+       }
+       return this;
+};
+/**
+ * Menu for a text input widget.
+ *
+ * @class
+ * @extends OO.ui.MenuWidget
+ *
+ * @constructor
+ * @param {OO.ui.TextInputWidget} input Text input widget to provide menu for
+ * @param {Object} [config] Configuration options
+ * @cfg {jQuery} [$container=input.$element] Element to render menu under
+ */
+OO.ui.TextInputMenuWidget = function OoUiTextInputMenuWidget( input, config ) {
+       // Parent constructor
+       OO.ui.TextInputMenuWidget.super.call( this, config );
+
+       // Properties
+       this.input = input;
+       this.$container = config.$container || this.input.$element;
+       this.onWindowResizeHandler = OO.ui.bind( this.onWindowResize, this );
+
+       // Initialization
+       this.$element.addClass( 'oo-ui-textInputMenuWidget' );
+};
+
+/* Setup */
+
+OO.inheritClass( OO.ui.TextInputMenuWidget, OO.ui.MenuWidget );
+
+/* Methods */
+
+/**
+ * Handle window resize event.
+ *
+ * @param {jQuery.Event} e Window resize event
+ */
+OO.ui.TextInputMenuWidget.prototype.onWindowResize = function () {
+       this.position();
+};
+
+/**
+ * Show the menu.
+ *
+ * @chainable
+ */
+OO.ui.TextInputMenuWidget.prototype.show = function () {
+       // Parent method
+       OO.ui.MenuWidget.prototype.show.call( this );
+
+       this.position();
+       this.$( this.getElementWindow() ).on( 'resize', this.onWindowResizeHandler );
+       return this;
+};
+
+/**
+ * Hide the menu.
+ *
+ * @chainable
+ */
+OO.ui.TextInputMenuWidget.prototype.hide = function () {
+       // Parent method
+       OO.ui.MenuWidget.prototype.hide.call( this );
+
+       this.$( this.getElementWindow() ).off( 'resize', this.onWindowResizeHandler );
+       return this;
+};
+
+/**
+ * Position the menu.
+ *
+ * @chainable
+ */
+OO.ui.TextInputMenuWidget.prototype.position = function () {
+       var frameOffset,
+               $container = this.$container,
+               dimensions = $container.offset();
+
+       // Position under input
+       dimensions.top += $container.height();
+
+       // Compensate for frame position if in a differnt frame
+       if ( this.input.$.frame && this.input.$.context !== this.$element[0].ownerDocument ) {
+               frameOffset = OO.ui.Element.getRelativePosition(
+                       this.input.$.frame.$element, this.$element.offsetParent()
+               );
+               dimensions.left += frameOffset.left;
+               dimensions.top += frameOffset.top;
+       } else {
+               // Fix for RTL (for some reason, no need to fix if the frameoffset is set)
+               if ( this.$element.css( 'direction' ) === 'rtl' ) {
+                       dimensions.right = this.$element.parent().position().left -
+                               dimensions.width - dimensions.left;
+                       // Erase the value for 'left':
+                       delete dimensions.left;
+               }
+       }
+
+       this.$element.css( dimensions );
+       this.setIdealSize( $container.width() );
+       return this;
+};
+/**
+ * Width with on and off states.
+ *
+ * Mixin for widgets with a boolean state.
+ *
+ * @abstract
+ * @class
+ *
+ * @constructor
+ * @param {Object} [config] Configuration options
+ * @cfg {boolean} [value=false] Initial value
+ */
+OO.ui.ToggleWidget = function OoUiToggleWidget( config ) {
+       // Configuration initialization
+       config = config || {};
+
+       // Properties
+       this.value = null;
+
+       // Initialization
+       this.$element.addClass( 'oo-ui-toggleWidget' );
+       this.setValue( !!config.value );
+};
+
+/* Events */
+
+/**
+ * @event change
+ * @param {boolean} value Changed value
+ */
+
+/* Methods */
+
+/**
+ * Get the value of the toggle.
+ *
+ * @return {boolean}
+ */
+OO.ui.ToggleWidget.prototype.getValue = function () {
+       return this.value;
+};
+
+/**
+ * Set the value of the toggle.
+ *
+ * @param {boolean} value New value
+ * @fires change
+ * @chainable
+ */
+OO.ui.ToggleWidget.prototype.setValue = function ( value ) {
+       value = !!value;
+       if ( this.value !== value ) {
+               this.value = value;
+               this.emit( 'change', value );
+               this.$element.toggleClass( 'oo-ui-toggleWidget-on', value );
+               this.$element.toggleClass( 'oo-ui-toggleWidget-off', !value );
+       }
+       return this;
+};
+/**
+ * Button that toggles on and off.
+ *
+ * @class
+ * @extends OO.ui.ButtonWidget
+ * @mixins OO.ui.ToggleWidget
+ *
+ * @constructor
+ * @param {Object} [config] Configuration options
+ * @cfg {boolean} [value=false] Initial value
+ */
+OO.ui.ToggleButtonWidget = function OoUiToggleButtonWidget( config ) {
+       // Configuration initialization
+       config = config || {};
+
+       // Parent constructor
+       OO.ui.ToggleButtonWidget.super.call( this, config );
+
+       // Mixin constructors
+       OO.ui.ToggleWidget.call( this, config );
+
+       // Initialization
+       this.$element.addClass( 'oo-ui-toggleButtonWidget' );
+};
+
+/* Setup */
+
+OO.inheritClass( OO.ui.ToggleButtonWidget, OO.ui.ButtonWidget );
+OO.mixinClass( OO.ui.ToggleButtonWidget, OO.ui.ToggleWidget );
+
+/* Methods */
+
+/**
+ * @inheritdoc
+ */
+OO.ui.ToggleButtonWidget.prototype.onClick = function () {
+       if ( !this.disabled ) {
+               this.setValue( !this.value );
+       }
+
+       // Parent method
+       return OO.ui.ButtonWidget.prototype.onClick.call( this );
+};
+
+/**
+ * @inheritdoc
+ */
+OO.ui.ToggleButtonWidget.prototype.setValue = function ( value ) {
+       value = !!value;
+       if ( value !== this.value ) {
+               this.setActive( value );
+       }
+
+       // Parent method
+       OO.ui.ToggleWidget.prototype.setValue.call( this, value );
+
+       return this;
+};
+/**
+ * Switch that slides on and off.
+ *
+ * @abstract
+ * @class
+ * @extends OO.ui.Widget
+ * @mixins OO.ui.ToggleWidget
+ *
+ * @constructor
+ * @param {Object} [config] Configuration options
+ * @cfg {boolean} [value=false] Initial value
+ */
+OO.ui.ToggleSwitchWidget = function OoUiToggleSwitchWidget( config ) {
+       // Parent constructor
+       OO.ui.ToggleSwitchWidget.super.call( this, config );
+
+       // Mixin constructors
+       OO.ui.ToggleWidget.call( this, config );
+
+       // Properties
+       this.dragging = false;
+       this.dragStart = null;
+       this.sliding = false;
+       this.$glow = this.$( '<span>' );
+       this.$grip = this.$( '<span>' );
+
+       // Events
+       this.$element.on( 'click', OO.ui.bind( this.onClick, this ) );
+
+       // Initialization
+       this.$glow.addClass( 'oo-ui-toggleSwitchWidget-glow' );
+       this.$grip.addClass( 'oo-ui-toggleSwitchWidget-grip' );
+       this.$element
+               .addClass( 'oo-ui-toggleSwitchWidget' )
+               .append( this.$glow, this.$grip );
+};
+
+/* Setup */
+
+OO.inheritClass( OO.ui.ToggleSwitchWidget, OO.ui.Widget );
+OO.mixinClass( OO.ui.ToggleSwitchWidget, OO.ui.ToggleWidget );
+
+/* Methods */
+
+/**
+ * Handle mouse down events.
+ *
+ * @param {jQuery.Event} e Mouse down event
+ */
+OO.ui.ToggleSwitchWidget.prototype.onClick = function ( e ) {
+       if ( !this.disabled && e.which === 1 ) {
+               this.setValue( !this.value );
+       }
+};
+}( OO ) );
diff --git a/resources/lib/oojs-ui/oojs-ui.svg.css b/resources/lib/oojs-ui/oojs-ui.svg.css
new file mode 100644 (file)
index 0000000..0353288
--- /dev/null
@@ -0,0 +1,1234 @@
+/*!
+ * OOjs UI v0.1.0-pre (8197f2cd2e)
+ * https://www.mediawiki.org/wiki/OOjs_UI
+ *
+ * Copyright 2011–2014 OOjs Team and other contributors.
+ * Released under the MIT license
+ * http://oojs.mit-license.org
+ *
+ * Date: Tue Apr 15 2014 11:07:39 GMT-0700 (PDT)
+ */
+
+/* Textures */
+
+.oo-ui-texture-pending {
+  background-image: /* @embed */ url(images/textures/pending.gif);
+}
+
+.oo-ui-texture-transparency {
+  background-image: /* @embed */ url(images/textures/transparency.png);
+}
+
+/* RTL Definitions */
+
+/* @noflip */
+
+.oo-ui-rtl {
+  direction: rtl;
+}
+
+/* @noflip */
+
+.oo-ui-ltr {
+  direction: ltr;
+}
+
+.oo-ui-dialog {
+  position: fixed;
+  top: 0;
+  right: 0;
+  bottom: 0;
+  left: 0;
+  padding: 1em;
+  line-height: 1em;
+  /* Fix for strange opacity-related rendering issues.
+          CAUTION: -webkit-backface-visibility: hidden; is EXTREMELY DANGEROUS.
+          If applied to a VE surface directly, it will break selection of
+          FocusableNodes, and in the past it's caused transparent PNGs to
+          render as opaque black images. For some reason applying it to the dialog
+          wrapper in the main document fixes opacity-related behavior in the iframe
+          document, but doesn't break the surface inside the iframe. */
+
+  -webkit-backface-visibility: hidden;
+          backface-visibility: hidden;
+}
+
+.oo-ui-dialog .oo-ui-window-frame {
+  position: fixed;
+  top: 1em;
+  right: 0;
+  bottom: 1em;
+  left: 0;
+  min-height: 12em;
+  margin: auto;
+  overflow: hidden;
+}
+
+.oo-ui-dialog-small .oo-ui-window-frame {
+  width: 400px;
+  max-height: 230px;
+}
+
+.oo-ui-dialog-medium .oo-ui-window-frame {
+  width: 600px;
+  max-height: 460px;
+}
+
+.oo-ui-dialog-large .oo-ui-window-frame {
+  width: 800px;
+  max-height: 690px;
+}
+
+.oo-ui-dialog .oo-ui-frame {
+  width: 100%;
+  height: 100%;
+}
+
+.oo-ui-dialog-content .oo-ui-window-head,
+.oo-ui-dialog-content .oo-ui-window-body,
+.oo-ui-dialog-content .oo-ui-window-foot {
+  position: absolute;
+  right: 0;
+  left: 0;
+  overflow: hidden;
+  -webkit-box-sizing: border-box;
+     -moz-box-sizing: border-box;
+          box-sizing: border-box;
+}
+
+.oo-ui-dialog-content .oo-ui-window-head {
+  top: 0;
+  height: 3.8em;
+  padding: 0.5em;
+}
+
+.oo-ui-dialog-content .oo-ui-window-title {
+  line-height: 2.8em;
+}
+
+.oo-ui-dialog-content .oo-ui-window-icon {
+  width: 2.4em;
+  height: 2.8em;
+  line-height: 2.8em;
+}
+
+.oo-ui-dialog-content .oo-ui-window-closeButton {
+  float: right;
+  margin: 0.25em 0.25em;
+}
+
+.oo-ui-dialog-content .oo-ui-window-body {
+  top: 3.8em;
+  bottom: 4.8em;
+}
+
+.oo-ui-dialog-content .oo-ui-window-foot {
+  bottom: 0;
+  height: 4.8em;
+  padding: 1em;
+}
+
+.oo-ui-dialog-content .oo-ui-window-foot .oo-ui-buttonedElement-framed {
+  float: left;
+  margin: 0.125em 0.25em;
+}
+
+.oo-ui-dialog-content .oo-ui-window-foot .oo-ui-flaggableElement-primary,
+.oo-ui-dialog-content .oo-ui-window-foot .oo-ui-flaggableElement-constructive,
+.oo-ui-dialog-content .oo-ui-window-foot .oo-ui-flaggableElement-destructive {
+  float: right;
+}
+
+.oo-ui-dialog-content-footless .oo-ui-window-body {
+  bottom: 0;
+}
+
+.oo-ui-dialog-content-footless .oo-ui-window-foot {
+  display: none;
+}
+
+.oo-ui-frame {
+  padding: 0;
+  margin: 0;
+}
+
+.oo-ui-frame-body {
+  padding: 0;
+  margin: 0;
+  background: none;
+}
+
+.oo-ui-frame-content:focus {
+  outline: none;
+}
+
+.oo-ui-toolbar {
+  clear: both;
+}
+
+.oo-ui-toolbar-bar {
+  line-height: 1em;
+}
+
+.oo-ui-toolbar-bottom .oo-ui-toolbar-bar {
+  position: absolute;
+}
+
+.oo-ui-toolbar-actions {
+  float: right;
+}
+
+.oo-ui-toolbar-tools {
+  float: left;
+}
+
+.oo-ui-toolbar-tools,
+.oo-ui-toolbar-actions,
+.oo-ui-toolbar-shadow {
+  -webkit-user-select: none;
+     -moz-user-select: none;
+      -ms-user-select: none;
+          user-select: none;
+  -webkit-touch-callout: none;
+}
+
+.oo-ui-toolbar-actions .oo-ui-popupWidget {
+  -webkit-user-select: all;
+     -moz-user-select: all;
+      -ms-user-select: all;
+          user-select: all;
+  -webkit-touch-callout: default;
+}
+
+.oo-ui-toolbar-shadow {
+  position: absolute;
+  width: 100%;
+  pointer-events: none;
+  background-position: left top;
+  background-repeat: repeat-x;
+}
+
+.oo-ui-toolGroup {
+  display: inline-block;
+  margin: 0.3em;
+  vertical-align: middle;
+}
+
+.oo-ui-toolGroup-empty {
+  display: none;
+}
+
+.oo-ui-toolGroup .oo-ui-tool-link .oo-ui-iconedElement-icon {
+  background-position: center center;
+  background-repeat: no-repeat;
+}
+
+.oo-ui-window-head {
+  -webkit-user-select: none;
+     -moz-user-select: none;
+      -ms-user-select: none;
+          user-select: none;
+  -webkit-touch-callout: none;
+}
+
+.oo-ui-window-icon {
+  float: left;
+  background-position: center center;
+  background-repeat: no-repeat;
+}
+
+.oo-ui-window-title {
+  float: left;
+  white-space: nowrap;
+  cursor: default;
+}
+
+.oo-ui-window-overlay {
+  position: absolute;
+  top: 0;
+  left: 0;
+}
+
+.oo-ui-buttonedElement .oo-ui-buttonedElement-button {
+  display: inline-block;
+  vertical-align: middle;
+  cursor: pointer;
+  -webkit-user-select: none;
+     -moz-user-select: none;
+      -ms-user-select: none;
+          user-select: none;
+  -webkit-touch-callout: none;
+}
+
+.oo-ui-buttonedElement .oo-ui-buttonedElement-button > .oo-ui-iconedElement-icon {
+  display: none;
+  margin-left: 0;
+}
+
+.oo-ui-buttonedElement .oo-ui-buttonedElement-button > .oo-ui-indicatedElement-indicator {
+  display: none;
+  margin-right: -0.75em;
+}
+
+.oo-ui-buttonedElement.oo-ui-widget-disabled .oo-ui-buttonedElement-button {
+  cursor: default;
+}
+
+.oo-ui-buttonedElement.oo-ui-indicatedElement .oo-ui-buttonedElement-button > .oo-ui-indicatedElement-indicator,
+.oo-ui-buttonedElement.oo-ui-iconedElement .oo-ui-buttonedElement-button > .oo-ui-iconedElement-icon {
+  display: inline-block;
+  vertical-align: middle;
+  background-position: center center;
+  background-repeat: no-repeat;
+}
+
+.oo-ui-buttonedElement-frameless {
+  position: relative;
+  display: inline-block;
+}
+
+.oo-ui-buttonedElement-frameless .oo-ui-buttonedElement-button > .oo-ui-labeledElement-label {
+  display: inline-block;
+  margin-left: 0.25em;
+  vertical-align: middle;
+}
+
+.oo-ui-buttonedElement-framed .oo-ui-buttonedElement-button {
+  display: inline-block;
+  padding: 0.2em 0.8em;
+  margin: 0.1em 0;
+  text-align: center;
+  vertical-align: top;
+}
+
+.oo-ui-buttonedElement-framed .oo-ui-buttonedElement-button > .oo-ui-labeledElement-label {
+  display: inline-block;
+  line-height: 1.9em;
+  vertical-align: middle;
+}
+
+.oo-ui-buttonedElement-framed.oo-ui-iconedElement .oo-ui-buttonedElement-button > .oo-ui-iconedElement-icon {
+  margin-right: -0.5em;
+  margin-left: -0.5em;
+}
+
+.oo-ui-buttonedElement-framed.oo-ui-iconedElement.oo-ui-labeledElement .oo-ui-buttonedElement-button > .oo-ui-iconedElement-icon {
+  margin-right: 0.3em;
+  margin-left: -0.5em;
+}
+
+.oo-ui-buttonedElement-framed.oo-ui-widget-disabled .oo-ui-buttonedElement-button,
+.oo-ui-buttonedElement-framed.oo-ui-widget-disabled .oo-ui-buttonedElement-button.oo-ui-buttonedElement-active,
+.oo-ui-buttonedElement-framed.oo-ui-widget-disabled .oo-ui-buttonedElement-button.oo-ui-buttonedElement-pressed {
+  cursor: default;
+}
+
+.oo-ui-clippableElement-clippable {
+  -webkit-box-sizing: border-box;
+     -moz-box-sizing: border-box;
+          box-sizing: border-box;
+}
+
+.oo-ui-bookletLayout-stackLayout.oo-ui-stackLayout-continuous .oo-ui-panelLayout-scrollable {
+  overflow-y: hidden;
+}
+
+.oo-ui-bookletLayout-stackLayout .oo-ui-panelLayout {
+  width: 100%;
+  padding: 1.5em;
+  -webkit-box-sizing: border-box;
+     -moz-box-sizing: border-box;
+          box-sizing: border-box;
+}
+
+.oo-ui-bookletLayout-stackLayout .oo-ui-panelLayout-scrollable {
+  overflow-y: auto;
+}
+
+.oo-ui-bookletLayout-stackLayout .oo-ui-panelLayout-padded {
+  padding: 2em;
+}
+
+.oo-ui-bookletLayout-outlinePanel-editable .oo-ui-outlineWidget {
+  position: absolute;
+  top: 0;
+  right: 0;
+  bottom: 3em;
+  left: 0;
+  overflow-y: auto;
+}
+
+.oo-ui-bookletLayout-outlinePanel .oo-ui-outlineControlsWidget {
+  position: absolute;
+  right: 0;
+  bottom: 0;
+  left: 0;
+}
+
+.oo-ui-fieldLayout {
+  margin-bottom: 1em;
+}
+
+.oo-ui-fieldLayout:last-child {
+  margin-bottom: 0;
+}
+
+.oo-ui-fieldLayout:before,
+.oo-ui-fieldLayout:after {
+  display: table;
+  content: " ";
+}
+
+.oo-ui-fieldLayout:after {
+  clear: both;
+}
+
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-left > .oo-ui-labeledElement-label,
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right > .oo-ui-labeledElement-label {
+  display: block;
+  float: left;
+  width: 35%;
+  padding-top: 0.5em;
+  margin-right: 5%;
+}
+
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-left > .oo-ui-fieldLayout-field,
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right > .oo-ui-fieldLayout-field {
+  display: block;
+  float: left;
+  width: 60%;
+}
+
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right > .oo-ui-labeledElement-label {
+  text-align: right;
+}
+
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline > .oo-ui-labeledElement-label {
+  display: inline-block;
+  padding: 0.75em 0.5em 0.5em 0.5em;
+  vertical-align: middle;
+}
+
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline > .oo-ui-fieldLayout-field {
+  display: inline-block;
+  padding: 0.5em 0;
+  vertical-align: middle;
+}
+
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-top > .oo-ui-labeledElement-label {
+  padding: 0.5em 0;
+}
+
+.oo-ui-fieldsetLayout {
+  position: relative;
+  padding: 0;
+  margin: 0;
+}
+
+.oo-ui-fieldsetLayout + .oo-ui-fieldsetLayout {
+  margin-top: 2em;
+}
+
+.oo-ui-fieldsetLayout-labeled {
+  margin-top: -0.75em;
+}
+
+.oo-ui-fieldsetLayout > legend.oo-ui-labeledElement-label {
+  padding: 0.25em 0;
+  margin-bottom: 0.5em;
+}
+
+.oo-ui-fieldsetLayout.oo-ui-iconedElement > legend.oo-ui-labeledElement-label {
+  padding-left: 1.75em;
+}
+
+.oo-ui-fieldsetLayout.oo-ui-iconedElement > .oo-ui-iconedElement-icon {
+  position: absolute;
+  top: 0;
+  left: 0;
+  display: block;
+  width: 2em;
+  height: 2em;
+  background-position: center center;
+  background-repeat: no-repeat;
+}
+
+.oo-ui-gridLayout {
+  position: absolute;
+  top: 0;
+  right: 0;
+  bottom: 0;
+  left: 0;
+}
+
+.oo-ui-labelWidget {
+  padding: 0.5em 0;
+}
+
+.oo-ui-panelLayout {
+  position: absolute;
+  top: 0;
+  right: 0;
+  bottom: 0;
+  left: 0;
+}
+
+.oo-ui-panelLayout-scrollable {
+  overflow-y: auto;
+}
+
+.oo-ui-panelLayout-padded {
+  padding: 2em;
+}
+
+.oo-ui-stackLayout > .oo-ui-panelLayout {
+  display: none;
+}
+
+.oo-ui-stackLayout-continuous > .oo-ui-panelLayout {
+  position: relative;
+  display: block;
+}
+
+.oo-ui-barToolGroup > .oo-ui-iconedElement-icon,
+.oo-ui-barToolGroup > .oo-ui-labeledElement-label {
+  display: none;
+}
+
+.oo-ui-barToolGroup .oo-ui-tool {
+  position: relative;
+  display: inline-block;
+  vertical-align: top;
+}
+
+.oo-ui-barToolGroup .oo-ui-tool-link {
+  display: block;
+  height: 1.5em;
+  padding: 0.25em;
+}
+
+.oo-ui-barToolGroup .oo-ui-tool-link .oo-ui-iconedElement-icon {
+  display: block;
+  width: 1.5em;
+  height: 1.5em;
+}
+
+.oo-ui-barToolGroup .oo-ui-tool-link .oo-ui-tool-title {
+  display: none;
+}
+
+.oo-ui-barToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link {
+  cursor: default;
+}
+
+.oo-ui-barToolGroup .oo-ui-tool-title,
+.oo-ui-barToolGroup .oo-ui-tool-accel {
+  display: none;
+}
+
+.oo-ui-barToolGroup.oo-ui-widget-enabled .oo-ui-tool-link {
+  cursor: pointer;
+}
+
+.oo-ui-listToolGroup .oo-ui-toolGroup-tools {
+  padding: 0.25em;
+}
+
+.oo-ui-listToolGroup .oo-ui-tool {
+  display: inline-block;
+  width: 100%;
+  -webkit-box-sizing: border-box;
+     -moz-box-sizing: border-box;
+          box-sizing: border-box;
+}
+
+.oo-ui-listToolGroup .oo-ui-tool-link {
+  display: block;
+  padding-right: 0.5em;
+  white-space: nowrap;
+  cursor: pointer;
+}
+
+.oo-ui-listToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link {
+  cursor: default;
+}
+
+.oo-ui-menuToolGroup .oo-ui-popupToolGroup-handle {
+  min-width: 8em;
+}
+
+.oo-ui-menuToolGroup .oo-ui-tool {
+  display: block;
+}
+
+.oo-ui-menuToolGroup .oo-ui-tool-link {
+  display: block;
+  padding: 0.25em 1em 0.25em 0.25em;
+  white-space: nowrap;
+  cursor: pointer;
+}
+
+.oo-ui-menuToolGroup .oo-ui-tool-link .oo-ui-iconedElement-icon {
+  background-image: none;
+}
+
+.oo-ui-menuToolGroup .oo-ui-tool-active .oo-ui-tool-link .oo-ui-iconedElement-icon {
+  background-image: /* @embed */ url(images/icons/check.png);
+}
+
+.oo-ui-menuToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link {
+  cursor: default;
+}
+
+.oo-ui-popupToolGroup {
+  position: relative;
+  height: 2em;
+  min-width: 2.5em;
+}
+
+.oo-ui-popupToolGroup.oo-ui-indicatedElement.oo-ui-iconedElement {
+  min-width: 3.5em;
+}
+
+.oo-ui-popupToolGroup-handle {
+  display: block;
+  cursor: pointer;
+}
+
+.oo-ui-popupToolGroup-handle .oo-ui-indicatedElement-indicator,
+.oo-ui-popupToolGroup-handle .oo-ui-iconedElement-icon {
+  position: absolute;
+  top: 0;
+  width: 2em;
+  height: 2em;
+  background-position: center center;
+  background-repeat: no-repeat;
+}
+
+.oo-ui-popupToolGroup-handle .oo-ui-indicatedElement-indicator {
+  right: 0;
+}
+
+.oo-ui-popupToolGroup-handle .oo-ui-iconedElement-icon {
+  left: 0.25em;
+}
+
+.oo-ui-popupToolGroup-handle .oo-ui-labeledElement-label {
+  margin: 0 1em;
+  font-size: 0.8em;
+  line-height: 2.6em;
+}
+
+.oo-ui-popupToolGroup.oo-ui-widget-disabled .oo-ui-popupToolGroup-handle {
+  cursor: default;
+}
+
+.oo-ui-popupToolGroup.oo-ui-iconedElement .oo-ui-popupToolGroup-handle .oo-ui-labeledElement-label {
+  margin-left: 3em;
+}
+
+.oo-ui-popupToolGroup.oo-ui-indicatedElement .oo-ui-popupToolGroup-handle .oo-ui-labeledElement-label {
+  margin-right: 2.25em;
+}
+
+.oo-ui-popupToolGroup .oo-ui-toolGroup-tools {
+  position: absolute;
+  top: 2em;
+  left: -1px;
+  z-index: 4;
+  display: none;
+}
+
+.oo-ui-popupToolGroup .oo-ui-toolGroup-tools .oo-ui-iconedElement-icon {
+  background-position: center center;
+  background-repeat: no-repeat;
+}
+
+.oo-ui-popupToolGroup-active.oo-ui-widget-enabled > .oo-ui-toolGroup-tools {
+  display: block;
+}
+
+.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-iconedElement-icon {
+  display: inline-block;
+  width: 2em;
+  height: 2em;
+  margin-right: 0.25em;
+  vertical-align: middle;
+}
+
+.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-tool-title {
+  display: inline-block;
+  font-size: 0.8em;
+  line-height: 2em;
+  vertical-align: middle;
+}
+
+.oo-ui-popupToolGroup .oo-ui-tool-accel {
+  display: none;
+}
+
+.oo-ui-popupTool .oo-ui-popupWidget {
+  margin-left: 1.25em;
+  font-size: 0.8em;
+}
+
+.oo-ui-popupTool .oo-ui-popupWidget-popup,
+.oo-ui-popupTool .oo-ui-popupWidget-tail {
+  z-index: 4;
+}
+
+.oo-ui-iconWidget {
+  display: inline-block;
+  width: 1.9em;
+  height: 1.9em;
+  line-height: 2.5em;
+  vertical-align: middle;
+  background-position: center center;
+  background-repeat: no-repeat;
+  opacity: 0.8;
+}
+
+.oo-ui-iconWidget.oo-ui-widget-disabled {
+  opacity: 0.2;
+}
+
+.oo-ui-indicatorWidget {
+  display: inline-block;
+  width: 1.9em;
+  height: 1.9em;
+  line-height: 2.5em;
+  vertical-align: middle;
+  background-position: center center;
+  background-repeat: no-repeat;
+  opacity: 0.8;
+}
+
+.oo-ui-indicatorWidget.oo-ui-widget-disabled {
+  opacity: 0.2;
+}
+
+.oo-ui-selectWidget {
+  padding: 0;
+  margin: 0;
+  list-style: none;
+}
+
+.oo-ui-optionWidget {
+  position: relative;
+  display: block;
+  margin: 0;
+  list-style: none;
+  cursor: pointer;
+  border: none;
+}
+
+.oo-ui-optionWidget.oo-ui-widget-disabled {
+  cursor: default;
+}
+
+.oo-ui-optionWidget .oo-ui-labeledElement-label {
+  display: block;
+  overflow: hidden;
+  line-height: 1.5em;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+}
+
+.oo-ui-optionWidget .oo-ui-iconedElement-icon,
+.oo-ui-optionWidget .oo-ui-indicatedElement-indicator {
+  position: absolute;
+  top: 50%;
+  width: 2em;
+  height: 2em;
+  margin-top: -1em;
+  background-position: center center;
+  background-repeat: no-repeat;
+}
+
+.oo-ui-optionWidget .oo-ui-iconedElement-icon {
+  left: 0.5em;
+}
+
+.oo-ui-optionWidget .oo-ui-indicatedElement-indicator {
+  right: 0.5em;
+}
+
+.oo-ui-menuWidget {
+  position: absolute;
+}
+
+.oo-ui-menuWidget input {
+  position: absolute;
+  width: 0;
+  height: 0;
+  overflow: hidden;
+  opacity: 0;
+}
+
+.oo-ui-popupWidget-popup {
+  position: absolute;
+  overflow: hidden;
+}
+
+.oo-ui-popupWidget-tail {
+  display: none;
+}
+
+.oo-ui-popupWidget-tailed .oo-ui-popupWidget-popup {
+  margin-top: 7px;
+}
+
+.oo-ui-popupWidget-tailed .oo-ui-popupWidget-tail {
+  position: absolute;
+  display: block;
+  background-repeat: no-repeat;
+}
+
+.oo-ui-popupWidget-head {
+  height: 2.5em;
+  -webkit-user-select: none;
+     -moz-user-select: none;
+      -ms-user-select: none;
+          user-select: none;
+  -webkit-touch-callout: none;
+}
+
+.oo-ui-popupWidget-head .oo-ui-buttonWidget {
+  float: right;
+  margin: 0.25em;
+}
+
+.oo-ui-popupWidget-head .oo-ui-labeledElement-label {
+  float: left;
+  margin: 0.75em 1em;
+  cursor: default;
+}
+
+.oo-ui-popupWidget-body {
+  clear: both;
+}
+
+.oo-ui-buttonGroupWidget {
+  border-radius: 0.3em;
+}
+
+.oo-ui-buttonGroupWidget .oo-ui-buttonedElement-framed .oo-ui-buttonedElement-button {
+  margin-bottom: -1px;
+  margin-left: -1px;
+  border-radius: 0;
+}
+
+.oo-ui-buttonGroupWidget .oo-ui-buttonedElement-framed:first-child .oo-ui-buttonedElement-button {
+  margin-left: 0;
+  border-bottom-left-radius: 0.3em;
+  border-top-left-radius: 0.3em;
+}
+
+.oo-ui-buttonGroupWidget .oo-ui-buttonedElement-framed:last-child .oo-ui-buttonedElement-button {
+  border-top-right-radius: 0.3em;
+  border-bottom-right-radius: 0.3em;
+}
+
+.oo-ui-buttonOptionWidget {
+  display: inline-block;
+  background-color: transparent;
+}
+
+.oo-ui-buttonOptionWidget .oo-ui-buttonedElement-button {
+  position: relative;
+  height: 1.9em;
+}
+
+.oo-ui-buttonOptionWidget.oo-ui-iconedElement .oo-ui-iconedElement-icon,
+.oo-ui-buttonOptionWidget.oo-ui-indicatedElement .oo-ui-indicatedElement-indicator {
+  position: static;
+  display: inline-block;
+  height: 1.9em;
+  margin-top: 0;
+  vertical-align: middle;
+}
+
+.oo-ui-buttonSelectWidget {
+  display: inline-block;
+  white-space: nowrap;
+}
+
+.oo-ui-buttonWidget {
+  display: inline-block;
+  vertical-align: middle;
+}
+
+.oo-ui-inlineMenuWidget {
+  position: relative;
+  display: inline-block;
+  min-width: 20em;
+  margin: 0.25em 0;
+}
+
+.oo-ui-inlineMenuWidget-handle {
+  display: inline-block;
+  width: 100%;
+  height: 2.5em;
+  cursor: pointer;
+  -webkit-box-sizing: border-box;
+     -moz-box-sizing: border-box;
+          box-sizing: border-box;
+  -webkit-user-select: none;
+     -moz-user-select: none;
+      -ms-user-select: none;
+          user-select: none;
+  -webkit-touch-callout: none;
+}
+
+.oo-ui-inlineMenuWidget-handle .oo-ui-indicatedElement-indicator,
+.oo-ui-inlineMenuWidget-handle .oo-ui-iconedElement-icon {
+  position: absolute;
+  top: 0;
+  width: 2.5em;
+  height: 2.5em;
+  background-position: center center;
+  background-repeat: no-repeat;
+}
+
+.oo-ui-inlineMenuWidget-handle .oo-ui-indicatedElement-indicator {
+  right: 0;
+}
+
+.oo-ui-inlineMenuWidget-handle .oo-ui-iconedElement-icon {
+  left: 0.25em;
+}
+
+.oo-ui-inlineMenuWidget-handle .oo-ui-labeledElement-label {
+  margin: 0 0.5em;
+  line-height: 2.5em;
+}
+
+.oo-ui-inlineMenuWidget.oo-ui-iconedElement .oo-ui-inlineMenuWidget-handle .oo-ui-labeledElement-label {
+  margin-left: 3em;
+}
+
+.oo-ui-inlineMenuWidget.oo-ui-indicatedElement .oo-ui-inlineMenuWidget-handle .oo-ui-labeledElement-label {
+  margin-right: 2em;
+}
+
+.oo-ui-inlineMenuWidget .oo-ui-menuWidget {
+  z-index: 1;
+  width: 100%;
+}
+
+.oo-ui-inlineMenuWidget.oo-ui-widget-disabled .oo-ui-inlineMenuWidget-handle {
+  cursor: default;
+}
+
+.oo-ui-menuItemWidget {
+  position: relative;
+}
+
+.oo-ui-menuItemWidget .oo-ui-iconedElement-icon {
+  display: none;
+}
+
+.oo-ui-menuItemWidget.oo-ui-optionWidget-selected {
+  background-color: transparent;
+}
+
+.oo-ui-menuItemWidget.oo-ui-optionWidget-selected .oo-ui-iconedElement-icon {
+  display: block;
+}
+
+.oo-ui-menuSectionItemWidget {
+  cursor: default;
+}
+
+.oo-ui-outlineControlsWidget {
+  height: 3em;
+}
+
+.oo-ui-outlineControlsWidget-adders,
+.oo-ui-outlineControlsWidget-movers {
+  float: left;
+  height: 2em;
+  padding: 0;
+  margin: 0.5em;
+  -webkit-box-sizing: border-box;
+     -moz-box-sizing: border-box;
+          box-sizing: border-box;
+}
+
+.oo-ui-outlineControlsWidget > .oo-ui-iconedElement-icon {
+  float: left;
+  width: 1.5em;
+  height: 2em;
+  margin: 0.5em 0 0.5em 0.5em;
+  background-position: right center;
+  background-repeat: no-repeat;
+}
+
+.oo-ui-outlineControlsWidget-adders {
+  float: left;
+  margin-left: 0;
+}
+
+.oo-ui-outlineControlsWidget-adders .oo-ui-buttonWidget {
+  float: left;
+}
+
+.oo-ui-outlineControlsWidget-movers {
+  float: right;
+}
+
+.oo-ui-outlineControlsWidget-movers .oo-ui-buttonWidget {
+  float: right;
+}
+
+.oo-ui-outlineItemWidget {
+  position: relative;
+  padding: 0.75em;
+  cursor: pointer;
+  -webkit-user-select: none;
+     -moz-user-select: none;
+      -ms-user-select: none;
+          user-select: none;
+  -webkit-touch-callout: none;
+}
+
+.oo-ui-popupButtonWidget {
+  position: relative;
+}
+
+.oo-ui-popupButtonWidget .oo-ui-popupWidget {
+  position: absolute;
+  left: 1em;
+  cursor: auto;
+}
+
+.oo-ui-searchWidget-query {
+  position: absolute;
+  top: 0;
+  right: 0;
+  left: 0;
+  height: 4em;
+  padding: 0 1em;
+}
+
+.oo-ui-searchWidget-query .oo-ui-textInputWidget {
+  width: 100%;
+  margin: 0.75em 0;
+}
+
+.oo-ui-searchWidget-results {
+  position: absolute;
+  top: 4em;
+  right: 0;
+  bottom: 0;
+  left: 0;
+  padding: 1em;
+  overflow-x: hidden;
+  overflow-y: auto;
+  line-height: 0;
+}
+
+.oo-ui-textInputWidget {
+  position: relative;
+  -webkit-box-sizing: border-box;
+     -moz-box-sizing: border-box;
+          box-sizing: border-box;
+}
+
+.oo-ui-textInputWidget input,
+.oo-ui-textInputWidget textarea {
+  display: inline-block;
+  width: 100%;
+  -webkit-box-sizing: border-box;
+     -moz-box-sizing: border-box;
+          box-sizing: border-box;
+  resize: none;
+}
+
+.oo-ui-textInputWidget-icon {
+  position: absolute;
+  top: 0;
+  left: 0;
+  height: 100%;
+  background-position: right center;
+  background-repeat: no-repeat;
+}
+
+.oo-ui-toggleSwitchWidget {
+  position: relative;
+  display: inline-block;
+  width: 4em;
+  height: 2em;
+  overflow: hidden;
+  vertical-align: middle;
+  cursor: pointer;
+  -webkit-transform: translateZ(0);
+     -moz-transform: translateZ(0);
+      -ms-transform: translateZ(0);
+       -o-transform: translateZ(0);
+          transform: translateZ(0);
+  -webkit-box-sizing: border-box;
+     -moz-box-sizing: border-box;
+          box-sizing: border-box;
+}
+
+.oo-ui-toggleSwitchWidget.oo-ui-widget-disabled {
+  cursor: default;
+}
+
+.oo-ui-toggleSwitchWidget-grip {
+  position: absolute;
+  top: 0.25em;
+  left: 0.25em;
+  display: block;
+  width: 1.5em;
+  height: 1.5em;
+  -webkit-box-sizing: border-box;
+     -moz-box-sizing: border-box;
+          box-sizing: border-box;
+  -webkit-transition: left 200ms ease-in-out, margin-left 200ms ease-in-out;
+     -moz-transition: left 200ms ease-in-out, margin-left 200ms ease-in-out;
+      -ms-transition: left 200ms ease-in-out, margin-left 200ms ease-in-out;
+       -o-transition: left 200ms ease-in-out, margin-left 200ms ease-in-out;
+          transition: left 200ms ease-in-out, margin-left 200ms ease-in-out;
+}
+
+.oo-ui-toggleSwitchWidget .oo-ui-toggleSwitchWidget-glow {
+  position: absolute;
+  top: 0;
+  right: 0;
+  bottom: 0;
+  left: 0;
+  -webkit-transition: opacity 200ms ease-in-out;
+     -moz-transition: opacity 200ms ease-in-out;
+      -ms-transition: opacity 200ms ease-in-out;
+       -o-transition: opacity 200ms ease-in-out;
+          transition: opacity 200ms ease-in-out;
+  -webkit-user-select: none;
+     -moz-user-select: none;
+      -ms-user-select: none;
+          user-select: none;
+  -webkit-touch-callout: none;
+}
+
+.oo-ui-toggleWidget-on .oo-ui-toggleSwitchWidget-grip {
+  left: 2.25em;
+  margin-left: -2px;
+}
+
+.oo-ui-toggleWidget-off .oo-ui-toggleSwitchWidget-grip {
+  left: 0.25em;
+  margin-left: 0;
+}
+
+.oo-ui-toggleWidget-off .oo-ui-toggleSwitchWidget-glow {
+  display: none;
+}
+
+/* Icons */
+
+.oo-ui-icon-add-item {
+  background-image: /* @embed */ url(images/icons/add-item.svg);
+}
+
+.oo-ui-icon-advanced {
+  background-image: /* @embed */ url(images/icons/advanced.svg);
+}
+
+.oo-ui-icon-alert {
+  background-image: /* @embed */ url(images/icons/alert.svg);
+}
+
+.oo-ui-icon-check {
+  background-image: /* @embed */ url(images/icons/check.svg);
+}
+
+.oo-ui-icon-clear {
+  background-image: /* @embed */ url(images/icons/clear.svg);
+}
+
+.oo-ui-icon-close {
+  background-image: /* @embed */ url(images/icons/close.svg);
+}
+
+.oo-ui-icon-code {
+  background-image: /* @embed */ url(images/icons/code.svg);
+}
+
+.oo-ui-icon-collapse {
+  background-image: /* @embed */ url(images/icons/collapse.svg);
+}
+
+.oo-ui-icon-comment {
+  background-image: /* @embed */ url(images/icons/comment.svg);
+}
+
+.oo-ui-icon-expand {
+  background-image: /* @embed */ url(images/icons/expand.svg);
+}
+
+.oo-ui-icon-help {
+  background-image: /* @embed */ url(images/icons/help.svg);
+}
+
+.oo-ui-icon-link {
+  background-image: /* @embed */ url(images/icons/link.svg);
+}
+
+.oo-ui-icon-menu {
+  background-image: /* @embed */ url(images/icons/menu.svg);
+}
+
+.oo-ui-icon-next {
+  background-image: /* @embed */ url(images/icons/move-ltr.svg);
+}
+
+.oo-ui-icon-picture {
+  background-image: /* @embed */ url(images/icons/picture.svg);
+}
+
+.oo-ui-icon-previous {
+  background-image: /* @embed */ url(images/icons/move-rtl.svg);
+}
+
+.oo-ui-icon-redo {
+  background-image: /* @embed */ url(images/icons/arched-arrow-ltr.svg);
+}
+
+.oo-ui-icon-remove {
+  background-image: /* @embed */ url(images/icons/remove.svg);
+}
+
+.oo-ui-icon-search {
+  background-image: /* @embed */ url(images/icons/search.svg);
+}
+
+.oo-ui-icon-settings {
+  background-image: /* @embed */ url(images/icons/settings.svg);
+}
+
+.oo-ui-icon-tag {
+  background-image: /* @embed */ url(images/icons/tag.svg);
+}
+
+.oo-ui-icon-undo {
+  background-image: /* @embed */ url(images/icons/arched-arrow-rtl.svg);
+}
+
+.oo-ui-icon-window {
+  background-image: /* @embed */ url(images/icons/window.svg);
+}
+
+/* Indicators */
+
+.oo-ui-indicator-down {
+  background-image: /* @embed */ url(images/indicators/down.svg);
+}
+
+.oo-ui-indicator-required {
+  background-image: /* @embed */ url(images/indicators/required.svg);
+}
+
+.oo-ui-indicator-up {
+  background-image: /* @embed */ url(images/indicators/up.svg);
+}
\ No newline at end of file
diff --git a/resources/lib/oojs-ui/update-oojs-ui.sh b/resources/lib/oojs-ui/update-oojs-ui.sh
new file mode 100755 (executable)
index 0000000..3c6dca6
--- /dev/null
@@ -0,0 +1,99 @@
+#!/usr/bin/env bash
+
+# FIXME this script is duplicated from update-oojs.sh - factor this out
+
+# This script generates a commit that updates the oojs-ui distribution
+# ./bin/update-oojs-ui.sh path/to/repo/for/oojs-ui
+
+function oojsuihash() {
+       grep "OOjs UI v" resources/lib/oojs-ui/oojs-ui.js \
+               | head -n 1 \
+               | grep -Eo '\([a-z0-9]+\)' \
+               | sed 's/^(//' \
+               | sed 's/)$//'
+}
+
+function oojsuitag() {
+       grep "OOjs UI v" resources/lib/oojs-ui/oojs-ui.js \
+               | head -n 1 \
+               | grep -Eo '\bv[0-9a-z.-]+\b'
+}
+
+function oojsuiversion() {
+       grep "OOjs UI v" resources/lib/oojs-ui/oojs-ui.js \
+               | head -n 1 \
+               | grep -Eo '\bv[0-9a-z.-]+\b.*$'
+}
+
+# cd to the MW root directory
+cd $(cd $(dirname $0)/../../..; pwd)
+
+if [ "x$1" == "x" ]
+then
+       echo >&2 "Usage: update-oojs-ui.sh path/to/repo/for/oojs-ui"
+       exit 1
+fi
+
+# Undo any changes in the oojs-ui directory
+git reset -- resources/lib/oojs-ui/
+git checkout -- resources/lib/oojs-ui/
+
+git fetch origin
+# Create a branch of MW if needed, and reset it to master
+git checkout -B update-oojsui origin/master
+
+# Get the old oojs-ui version
+OLDVERSION=$(oojsuihash)
+if [ "x$OLDVERSION" == "x" ]
+then
+       TAG=$(oojsuitag)
+fi
+
+# cd to the oojs-ui directory
+cd $1 || exit 1
+if [ "x$OLDVERSION" == "x" ]
+then
+       # Try the tag
+       OLDVERSION=$(git rev-parse $TAG)
+       if [ $? != 0 ]
+       then
+               echo Could not find OOjs UI version
+               cd -
+               exit 1
+       fi
+fi
+if [ "$(git rev-parse $OLDVERSION)" == "$(git rev-parse HEAD)" ]
+then
+       echo "No changes (already at $OLDVERSION)"
+       cd -
+       exit 0
+fi
+# Build the distribution
+npm install || exit 1
+grunt || exit 1
+# Get the list of changes
+NEWCHANGES=$(git log $OLDVERSION.. --oneline --no-merges --reverse --color=never)
+NEWCHANGESDISPLAY=$(git log $OLDVERSION.. --oneline --no-merges --reverse --color=always)
+# cd back to the VisualEditor directory
+cd -
+
+# Copy files from dist/ to resources/lib/oojs-ui
+cp -a $1/dist/{oojs-ui.js,oojs-ui.svg.css,oojs-ui-apex.css,oojs-ui-agora.css,images,i18n} resources/lib/oojs-ui/
+# Figure out what the new version is
+NEWVERSION=$(oojsuiversion)
+# Generate commit summary
+COMMITMSG=$(cat <<END
+Update OOjs UI to $NEWVERSION
+
+New changes:
+$NEWCHANGES
+END
+)
+# Commit
+git commit resources/lib/oojs-ui/ -m "$COMMITMSG"
+cat >&2 <<END
+
+
+Created commit with changes:
+$NEWCHANGESDISPLAY
+END
diff --git a/resources/lib/oojs/oojs.js b/resources/lib/oojs/oojs.js
new file mode 100644 (file)
index 0000000..8ca3aed
--- /dev/null
@@ -0,0 +1,844 @@
+/*!
+ * OOjs v1.0.9
+ * https://www.mediawiki.org/wiki/OOjs
+ *
+ * Copyright 2011-2014 OOjs Team and other contributors.
+ * Released under the MIT license
+ * http://oojs.mit-license.org
+ *
+ * Date: Wed Apr 02 2014 14:20:50 GMT-0700 (PDT)
+ */
+( function ( global ) {
+
+'use strict';
+var
+       /**
+        * Namespace for all classes, static methods and static properties.
+        * @class OO
+        * @singleton
+        */
+       oo = {},
+       hasOwn = oo.hasOwnProperty,
+       toString = oo.toString;
+
+/* Class Methods */
+
+/**
+ * Assert whether a value is a plain object or not.
+ *
+ * @param {Mixed} obj
+ * @return {boolean}
+ */
+oo.isPlainObject = function ( obj ) {
+       // Any object or value whose internal [[Class]] property is not "[object Object]"
+       if ( toString.call( obj ) !== '[object Object]' ) {
+               return false;
+       }
+
+       // The try/catch suppresses exceptions thrown when attempting to access
+       // the "constructor" property of certain host objects suich as window.location
+       // in Firefox < 20 (https://bugzilla.mozilla.org/814622)
+       try {
+               if ( obj.constructor &&
+                               !hasOwn.call( obj.constructor.prototype, 'isPrototypeOf' ) ) {
+                       return false;
+               }
+       } catch ( e ) {
+               return false;
+       }
+
+       return true;
+};
+
+/**
+ * Utility to initialize a class for OO inheritance.
+ *
+ * Currently this just initializes an empty static object.
+ *
+ * @param {Function} fn
+ */
+oo.initClass = function ( fn ) {
+       fn.static = fn.static || {};
+};
+
+/**
+ * Utility for common usage of Object#create for inheriting from one
+ * prototype to another.
+ *
+ * Beware: This redefines the prototype, call before setting your prototypes.
+ * Beware: This redefines the prototype, can only be called once on a function.
+ *  If called multiple times on the same function, the previous prototype is lost.
+ *  This is how prototypal inheritance works, it can only be one straight chain
+ *  (just like classical inheritance in PHP for example). If you need to work with
+ *  multiple constructors consider storing an instance of the other constructor in a
+ *  property instead, or perhaps use a mixin (see OO.mixinClass).
+ *
+ *     function Thing() {}
+ *     Thing.prototype.exists = function () {};
+ *
+ *     function Person() {
+ *         Person.super.apply( this, arguments );
+ *     }
+ *     OO.inheritClass( Person, Thing );
+ *     Person.static.defaultEyeCount = 2;
+ *     Person.prototype.walk = function () {};
+ *
+ *     function Jumper() {
+ *         Jumper.super.apply( this, arguments );
+ *     }
+ *     OO.inheritClass( Jumper, Person );
+ *     Jumper.prototype.jump = function () {};
+ *
+ *     Jumper.static.defaultEyeCount === 2;
+ *     var x = new Jumper();
+ *     x.jump();
+ *     x.walk();
+ *     x instanceof Thing && x instanceof Person && x instanceof Jumper;
+ *
+ * @param {Function} targetFn
+ * @param {Function} originFn
+ * @throws {Error} If target already inherits from origin
+ */
+oo.inheritClass = function ( targetFn, originFn ) {
+       if ( targetFn.prototype instanceof originFn ) {
+               throw new Error( 'Target already inherits from origin' );
+       }
+
+       var targetConstructor = targetFn.prototype.constructor;
+
+       targetFn.super = originFn;
+       targetFn.prototype = Object.create( originFn.prototype, {
+               // Restore constructor property of targetFn
+               constructor: {
+                       value: targetConstructor,
+                       enumerable: false,
+                       writable: true,
+                       configurable: true
+               }
+       } );
+
+       // Extend static properties - always initialize both sides
+       oo.initClass( originFn );
+       targetFn.static = Object.create( originFn.static );
+};
+
+/**
+ * Utility to copy over *own* prototype properties of a mixin.
+ * The 'constructor' (whether implicit or explicit) is not copied over.
+ *
+ * This does not create inheritance to the origin. If inheritance is needed
+ * use oo.inheritClass instead.
+ *
+ * Beware: This can redefine a prototype property, call before setting your prototypes.
+ * Beware: Don't call before oo.inheritClass.
+ *
+ *     function Foo() {}
+ *     function Context() {}
+ *
+ *     // Avoid repeating this code
+ *     function ContextLazyLoad() {}
+ *     ContextLazyLoad.prototype.getContext = function () {
+ *         if ( !this.context ) {
+ *             this.context = new Context();
+ *         }
+ *         return this.context;
+ *     };
+ *
+ *     function FooBar() {}
+ *     OO.inheritClass( FooBar, Foo );
+ *     OO.mixinClass( FooBar, ContextLazyLoad );
+ *
+ * @param {Function} targetFn
+ * @param {Function} originFn
+ */
+oo.mixinClass = function ( targetFn, originFn ) {
+       var key;
+
+       // Copy prototype properties
+       for ( key in originFn.prototype ) {
+               if ( key !== 'constructor' && hasOwn.call( originFn.prototype, key ) ) {
+                       targetFn.prototype[key] = originFn.prototype[key];
+               }
+       }
+
+       // Copy static properties - always initialize both sides
+       oo.initClass( targetFn );
+       if ( originFn.static ) {
+               for ( key in originFn.static ) {
+                       if ( hasOwn.call( originFn.static, key ) ) {
+                               targetFn.static[key] = originFn.static[key];
+                       }
+               }
+       } else {
+               oo.initClass( originFn );
+       }
+};
+
+/* Object Methods */
+
+/**
+ * Create a new object that is an instance of the same
+ * constructor as the input, inherits from the same object
+ * and contains the same own properties.
+ *
+ * This makes a shallow non-recursive copy of own properties.
+ * To create a recursive copy of plain objects, use #copy.
+ *
+ *     var foo = new Person( mom, dad );
+ *     foo.setAge( 21 );
+ *     var foo2 = OO.cloneObject( foo );
+ *     foo.setAge( 22 );
+ *
+ *     // Then
+ *     foo2 !== foo; // true
+ *     foo2 instanceof Person; // true
+ *     foo2.getAge(); // 21
+ *     foo.getAge(); // 22
+ *
+ * @param {Object} origin
+ * @return {Object} Clone of origin
+ */
+oo.cloneObject = function ( origin ) {
+       var key, r;
+
+       r = Object.create( origin.constructor.prototype );
+
+       for ( key in origin ) {
+               if ( hasOwn.call( origin, key ) ) {
+                       r[key] = origin[key];
+               }
+       }
+
+       return r;
+};
+
+/**
+ * Get an array of all property values in an object.
+ *
+ * @param {Object} Object to get values from
+ * @return {Array} List of object values
+ */
+oo.getObjectValues = function ( obj ) {
+       var key, values;
+
+       if ( obj !== Object( obj ) ) {
+               throw new TypeError( 'Called on non-object' );
+       }
+
+       values = [];
+       for ( key in obj ) {
+               if ( hasOwn.call( obj, key ) ) {
+                       values[values.length] = obj[key];
+               }
+       }
+
+       return values;
+};
+
+/**
+ * Recursively compares properties between two objects.
+ *
+ * A false result may be caused by property inequality or by properties in one object missing from
+ * the other. An asymmetrical test may also be performed, which checks only that properties in the
+ * first object are present in the second object, but not the inverse.
+ *
+ * @param {Object} a First object to compare
+ * @param {Object} b Second object to compare
+ * @param {boolean} [asymmetrical] Whether to check only that b contains values from a
+ * @return {boolean} If the objects contain the same values as each other
+ */
+oo.compare = function ( a, b, asymmetrical ) {
+       var aValue, bValue, aType, bType, k;
+
+       if ( a === b ) {
+               return true;
+       }
+
+       for ( k in a ) {
+               aValue = a[k];
+               bValue = b[k];
+               aType = typeof aValue;
+               bType = typeof bValue;
+               if ( aType !== bType ||
+                       ( ( aType === 'string' || aType === 'number' ) && aValue !== bValue ) ||
+                       ( aValue === Object( aValue ) && !oo.compare( aValue, bValue, asymmetrical ) ) ) {
+                       return false;
+               }
+       }
+       // If the check is not asymmetrical, recursing with the arguments swapped will verify our result
+       return asymmetrical ? true : oo.compare( b, a, true );
+};
+
+/**
+ * Create a plain deep copy of any kind of object.
+ *
+ * Copies are deep, and will either be an object or an array depending on `source`.
+ *
+ * @param {Object} source Object to copy
+ * @param {Function} [callback] Applied to leaf values before they added to the clone
+ * @return {Object} Copy of source object
+ */
+oo.copy = function ( source, callback ) {
+       var key, sourceValue, sourceType, destination;
+
+       if ( typeof source.clone === 'function' ) {
+               return source.clone();
+       }
+
+       destination = Array.isArray( source ) ? new Array( source.length ) : {};
+
+       for ( key in source ) {
+               sourceValue = source[key];
+               sourceType = typeof sourceValue;
+               if ( Array.isArray( sourceValue ) ) {
+                       // Array
+                       destination[key] = oo.copy( sourceValue, callback );
+               } else if ( sourceValue && typeof sourceValue.clone === 'function' ) {
+                       // Duck type object with custom clone method
+                       destination[key] = callback ?
+                               callback( sourceValue.clone() ) : sourceValue.clone();
+               } else if ( sourceValue && typeof sourceValue.cloneNode === 'function' ) {
+                       // DOM Node
+                       destination[key] = callback ?
+                               callback( sourceValue.cloneNode( true ) ) : sourceValue.cloneNode( true );
+               } else if ( oo.isPlainObject( sourceValue ) ) {
+                       // Plain objects
+                       destination[key] = oo.copy( sourceValue, callback );
+               } else {
+                       // Non-plain objects (incl. functions) and primitive values
+                       destination[key] = callback ? callback( sourceValue ) : sourceValue;
+               }
+       }
+
+       return destination;
+};
+
+/**
+ * Generate a hash of an object based on its name and data.
+ *
+ * Performance optimization: <http://jsperf.com/ve-gethash-201208#/toJson_fnReplacerIfAoForElse>
+ *
+ * To avoid two objects with the same values generating different hashes, we utilize the replacer
+ * argument of JSON.stringify and sort the object by key as it's being serialized. This may or may
+ * not be the fastest way to do this; we should investigate this further.
+ *
+ * Objects and arrays are hashed recursively. When hashing an object that has a .getHash()
+ * function, we call that function and use its return value rather than hashing the object
+ * ourselves. This allows classes to define custom hashing.
+ *
+ * @param {Object} val Object to generate hash for
+ * @return {string} Hash of object
+ */
+oo.getHash = function ( val ) {
+       return JSON.stringify( val, oo.getHash.keySortReplacer );
+};
+
+/**
+ * Helper function for OO.getHash which sorts objects by key.
+ *
+ * This is a callback passed into JSON.stringify.
+ *
+ * @method getHash_keySortReplacer
+ * @param {string} key Property name of value being replaced
+ * @param {Mixed} val Property value to replace
+ * @return {Mixed} Replacement value
+ */
+oo.getHash.keySortReplacer = function ( key, val ) {
+       var normalized, keys, i, len;
+       if ( val && typeof val.getHashObject === 'function' ) {
+               // This object has its own custom hash function, use it
+               val = val.getHashObject();
+       }
+       if ( !Array.isArray( val ) && Object( val ) === val ) {
+               // Only normalize objects when the key-order is ambiguous
+               // (e.g. any object not an array).
+               normalized = {};
+               keys = Object.keys( val ).sort();
+               i = 0;
+               len = keys.length;
+               for ( ; i < len; i += 1 ) {
+                       normalized[keys[i]] = val[keys[i]];
+               }
+               return normalized;
+
+       // Primitive values and arrays get stable hashes
+       // by default. Lets those be stringified as-is.
+       } else {
+               return val;
+       }
+};
+
+/**
+ * Compute the union (duplicate-free merge) of a set of arrays.
+ *
+ * Arrays values must be convertable to object keys (strings).
+ *
+ * By building an object (with the values for keys) in parallel with
+ * the array, a new item's existence in the union can be computed faster.
+ *
+ * @param {Array...} arrays Arrays to union
+ * @return {Array} Union of the arrays
+ */
+oo.simpleArrayUnion = function () {
+       var i, ilen, arr, j, jlen,
+               obj = {},
+               result = [];
+
+       for ( i = 0, ilen = arguments.length; i < ilen; i++ ) {
+               arr = arguments[i];
+               for ( j = 0, jlen = arr.length; j < jlen; j++ ) {
+                       if ( !obj[ arr[j] ] ) {
+                               obj[ arr[j] ] = true;
+                               result.push( arr[j] );
+                       }
+               }
+       }
+
+       return result;
+};
+
+/**
+ * Combine arrays (intersection or difference).
+ *
+ * An intersection checks the item exists in 'b' while difference checks it doesn't.
+ *
+ * Arrays values must be convertable to object keys (strings).
+ *
+ * By building an object (with the values for keys) of 'b' we can
+ * compute the result faster.
+ *
+ * @private
+ * @param {Array} a First array
+ * @param {Array} b Second array
+ * @param {boolean} includeB Whether to items in 'b'
+ * @return {Array} Combination (intersection or difference) of arrays
+ */
+function simpleArrayCombine( a, b, includeB ) {
+       var i, ilen, isInB,
+               bObj = {},
+               result = [];
+
+       for ( i = 0, ilen = b.length; i < ilen; i++ ) {
+               bObj[ b[i] ] = true;
+       }
+
+       for ( i = 0, ilen = a.length; i < ilen; i++ ) {
+               isInB = !!bObj[ a[i] ];
+               if ( isInB === includeB ) {
+                       result.push( a[i] );
+               }
+       }
+
+       return result;
+}
+
+/**
+ * Compute the intersection of two arrays (items in both arrays).
+ *
+ * Arrays values must be convertable to object keys (strings).
+ *
+ * @param {Array} a First array
+ * @param {Array} b Second array
+ * @return {Array} Intersection of arrays
+ */
+oo.simpleArrayIntersection = function ( a, b ) {
+       return simpleArrayCombine( a, b, true );
+};
+
+/**
+ * Compute the difference of two arrays (items in 'a' but not 'b').
+ *
+ * Arrays values must be convertable to object keys (strings).
+ *
+ * @param {Array} a First array
+ * @param {Array} b Second array
+ * @return {Array} Intersection of arrays
+ */
+oo.simpleArrayDifference = function ( a, b ) {
+       return simpleArrayCombine( a, b, false );
+};
+/**
+ * @class OO.EventEmitter
+ *
+ * @constructor
+ */
+oo.EventEmitter = function OoEventEmitter() {
+       // Properties
+
+       /**
+        * Storage of bound event handlers by event name.
+        *
+        * @property
+        */
+       this.bindings = {};
+};
+
+/* Methods */
+
+/**
+ * Add a listener to events of a specific event.
+ *
+ * If the callback/context are already bound to the event, they will not be bound again.
+ *
+ * @param {string} event Type of event to listen to
+ * @param {Function} callback Function to call when event occurs
+ * @param {Array} [args] Arguments to pass to listener, will be prepended to emitted arguments
+ * @param {Object} [context=null] Object to use as context for callback function or call method on
+ * @throws {Error} Listener argument is not a function or method name
+ * @chainable
+ */
+oo.EventEmitter.prototype.on = function ( event, callback, args, context ) {
+       var i, bindings, binding;
+
+       // Validate callback
+       if ( typeof callback !== 'function' ) {
+               throw new Error( 'Invalid callback. Function or method name expected.' );
+       }
+       // Fallback to null context
+       if ( arguments.length < 4 ) {
+               context = null;
+       }
+       if ( this.bindings.hasOwnProperty( event ) ) {
+               // Check for duplicate callback and context for this event
+               bindings = this.bindings[event];
+               i = bindings.length;
+               while ( i-- ) {
+                       binding = bindings[i];
+                       if ( bindings.callback === callback && bindings.context === context ) {
+                               return this;
+                       }
+               }
+       } else {
+               // Auto-initialize bindings list
+               bindings = this.bindings[event] = [];
+       }
+       // Add binding
+       bindings.push( {
+               callback: callback,
+               args: args,
+               context: context
+       } );
+       return this;
+};
+
+/**
+ * Adds a one-time listener to a specific event.
+ *
+ * @param {string} event Type of event to listen to
+ * @param {Function} listener Listener to call when event occurs
+ * @chainable
+ */
+oo.EventEmitter.prototype.once = function ( event, listener ) {
+       var eventEmitter = this;
+       return this.on( event, function listenerWrapper() {
+               eventEmitter.off( event, listenerWrapper );
+               listener.apply( eventEmitter, Array.prototype.slice.call( arguments, 0 ) );
+       } );
+};
+
+/**
+ * Remove a specific listener from a specific event.
+ *
+ * @param {string} event Type of event to remove listener from
+ * @param {Function} [callback] Listener to remove, omit to remove all
+ * @param {Object} [context=null] Object used context for callback function or method
+ * @chainable
+ * @throws {Error} Listener argument is not a function
+ */
+oo.EventEmitter.prototype.off = function ( event, callback, context ) {
+       var i, bindings;
+
+       if ( arguments.length === 1 ) {
+               // Remove all bindings for event
+               if ( event in this.bindings ) {
+                       delete this.bindings[event];
+               }
+       } else {
+               if ( typeof callback !== 'function' ) {
+                       throw new Error( 'Invalid callback. Function expected.' );
+               }
+               if ( !( event in this.bindings ) || !this.bindings[event].length ) {
+                       // No matching bindings
+                       return this;
+               }
+               // Fallback to null context
+               if ( arguments.length < 3 ) {
+                       context = null;
+               }
+               // Remove matching handlers
+               bindings = this.bindings[event];
+               i = bindings.length;
+               while ( i-- ) {
+                       if ( bindings[i].callback === callback && bindings[i].context === context ) {
+                               bindings.splice( i, 1 );
+                       }
+               }
+               // Cleanup if now empty
+               if ( bindings.length === 0 ) {
+                       delete this.bindings[event];
+               }
+       }
+       return this;
+};
+
+/**
+ * Emit an event.
+ *
+ * TODO: Should this be chainable? What is the usefulness of the boolean
+ * return value here?
+ *
+ * @param {string} event Type of event
+ * @param {Mixed} args First in a list of variadic arguments passed to event handler (optional)
+ * @return {boolean} If event was handled by at least one listener
+ */
+oo.EventEmitter.prototype.emit = function ( event ) {
+       var i, len, binding, bindings, args;
+
+       if ( event in this.bindings ) {
+               // Slicing ensures that we don't get tripped up by event handlers that add/remove bindings
+               bindings = this.bindings[event].slice();
+               args = Array.prototype.slice.call( arguments, 1 );
+               for ( i = 0, len = bindings.length; i < len; i++ ) {
+                       binding = bindings[i];
+                       binding.callback.apply(
+                               binding.context,
+                               binding.args ? binding.args.concat( args ) : args
+                       );
+               }
+               return true;
+       }
+       return false;
+};
+
+/**
+ * Connect event handlers to an object.
+ *
+ * @param {Object} context Object to call methods on when events occur
+ * @param {Object.<string,string>|Object.<string,Function>|Object.<string,Array>} methods List of
+ *  event bindings keyed by event name containing either method names, functions or arrays containing
+ *  method name or function followed by a list of arguments to be passed to callback before emitted
+ *  arguments
+ * @chainable
+ */
+oo.EventEmitter.prototype.connect = function ( context, methods ) {
+       var method, callback, args, event;
+
+       for ( event in methods ) {
+               method = methods[event];
+               // Allow providing additional args
+               if ( Array.isArray( method ) ) {
+                       args = method.slice( 1 );
+                       method = method[0];
+               } else {
+                       args = [];
+               }
+               // Allow callback to be a method name
+               if ( typeof method === 'string' ) {
+                       // Validate method
+                       if ( !context[method] || typeof context[method] !== 'function' ) {
+                               throw new Error( 'Method not found: ' + method );
+                       }
+                       // Resolve to function
+                       callback = context[method];
+               } else {
+                       callback = method;
+               }
+               // Add binding
+               this.on.apply( this, [ event, callback, args, context ] );
+       }
+       return this;
+};
+
+/**
+ * Disconnect event handlers from an object.
+ *
+ * @param {Object} context Object to disconnect methods from
+ * @param {Object.<string,string>|Object.<string,Function>|Object.<string,Array>} [methods] List of
+ * event bindings keyed by event name containing either method names or functions
+ * @chainable
+ */
+oo.EventEmitter.prototype.disconnect = function ( context, methods ) {
+       var i, method, callback, event, bindings;
+
+       if ( methods ) {
+               // Remove specific connections to the context
+               for ( event in methods ) {
+                       method = methods[event];
+                       if ( typeof method === 'string' ) {
+                               // Validate method
+                               if ( !context[method] || typeof context[method] !== 'function' ) {
+                                       throw new Error( 'Method not found: ' + method );
+                               }
+                               // Resolve to function
+                               callback = context[method];
+                       } else {
+                               callback = method;
+                       }
+                       this.off( event, callback, context );
+               }
+       } else {
+               // Remove all connections to the context
+               for ( event in this.bindings ) {
+                       bindings = this.bindings[event];
+                       i = bindings.length;
+                       while ( i-- ) {
+                               if ( bindings[i].context === context ) {
+                                       this.off( event, bindings[i].callback, context );
+                               }
+                       }
+               }
+       }
+
+       return this;
+};
+/**
+ * @class OO.Registry
+ * @mixins OO.EventEmitter
+ *
+ * @constructor
+ */
+oo.Registry = function OoRegistry() {
+       // Mixin constructors
+       oo.EventEmitter.call( this );
+
+       // Properties
+       this.registry = {};
+};
+
+/* Inheritance */
+
+oo.mixinClass( oo.Registry, oo.EventEmitter );
+
+/* Events */
+
+/**
+ * @event register
+ * @param {string} name
+ * @param {Mixed} data
+ */
+
+/* Methods */
+
+/**
+ * Associate one or more symbolic names with some data.
+ *
+ * Only the base name will be registered, overriding any existing entry with the same base name.
+ *
+ * @param {string|string[]} name Symbolic name or list of symbolic names
+ * @param {Mixed} data Data to associate with symbolic name
+ * @fires register
+ * @throws {Error} Name argument must be a string or array
+ */
+oo.Registry.prototype.register = function ( name, data ) {
+       var i, len;
+       if ( typeof name === 'string' ) {
+               this.registry[name] = data;
+               this.emit( 'register', name, data );
+       } else if ( Array.isArray( name ) ) {
+               for ( i = 0, len = name.length; i < len; i++ ) {
+                       this.register( name[i], data );
+               }
+       } else {
+               throw new Error( 'Name must be a string or array, cannot be a ' + typeof name );
+       }
+};
+
+/**
+ * Get data for a given symbolic name.
+ *
+ * Lookups are done using the base name.
+ *
+ * @param {string} name Symbolic name
+ * @return {Mixed|undefined} Data associated with symbolic name
+ */
+oo.Registry.prototype.lookup = function ( name ) {
+       return this.registry[name];
+};
+/**
+ * @class OO.Factory
+ * @extends OO.Registry
+ *
+ * @constructor
+ */
+oo.Factory = function OoFactory() {
+       oo.Factory.super.call( this );
+
+       // Properties
+       this.entries = [];
+};
+
+/* Inheritance */
+
+oo.inheritClass( oo.Factory, oo.Registry );
+
+/* Methods */
+
+/**
+ * Register a constructor with the factory.
+ *
+ * Classes must have a static `name` property to be registered.
+ *
+ *     function MyClass() {};
+ *     OO.initClass( MyClass );
+ *     // Adds a static property to the class defining a symbolic name
+ *     MyClass.static.name = 'mine';
+ *     // Registers class with factory, available via symbolic name 'mine'
+ *     factory.register( MyClass );
+ *
+ * @param {Function} constructor Constructor to use when creating object
+ * @throws {Error} Name must be a string and must not be empty
+ * @throws {Error} Constructor must be a function
+ */
+oo.Factory.prototype.register = function ( constructor ) {
+       var name;
+
+       if ( typeof constructor !== 'function' ) {
+               throw new Error( 'constructor must be a function, cannot be a ' + typeof constructor );
+       }
+       name = constructor.static && constructor.static.name;
+       if ( typeof name !== 'string' || name === '' ) {
+               throw new Error( 'Name must be a string and must not be empty' );
+       }
+       this.entries.push( name );
+
+       oo.Factory.super.prototype.register.call( this, name, constructor );
+};
+
+/**
+ * Create an object based on a name.
+ *
+ * Name is used to look up the constructor to use, while all additional arguments are passed to the
+ * constructor directly, so leaving one out will pass an undefined to the constructor.
+ *
+ * @param {string} name Object name
+ * @param {Mixed...} [args] Arguments to pass to the constructor
+ * @return {Object} The new object
+ * @throws {Error} Unknown object name
+ */
+oo.Factory.prototype.create = function ( name ) {
+       var args, obj, constructor;
+
+       if ( !this.registry.hasOwnProperty( name ) ) {
+               throw new Error( 'No class registered by that name: ' + name );
+       }
+       constructor = this.registry[name];
+
+       // Convert arguments to array and shift the first argument (name) off
+       args = Array.prototype.slice.call( arguments, 1 );
+
+       // We can't use the "new" operator with .apply directly because apply needs a
+       // context. So instead just do what "new" does: create an object that inherits from
+       // the constructor's prototype (which also makes it an "instanceof" the constructor),
+       // then invoke the constructor with the object as context, and return it (ignoring
+       // the constructor's return value).
+       obj = Object.create( constructor.prototype );
+       constructor.apply( obj, args );
+       return obj;
+};
+/*jshint node:true */
+if ( typeof module !== 'undefined' && module.exports ) {
+       module.exports = oo;
+} else {
+       global.OO = oo;
+}
+}( this ) );
diff --git a/resources/lib/sinonjs/sinon-1.9.0.js b/resources/lib/sinonjs/sinon-1.9.0.js
new file mode 100644 (file)
index 0000000..428b729
--- /dev/null
@@ -0,0 +1,4794 @@
+/**
+ * Sinon.JS 1.9.0, 2014/03/05
+ *
+ * @author Christian Johansen (christian@cjohansen.no)
+ * @author Contributors: https://github.com/cjohansen/Sinon.JS/blob/master/AUTHORS
+ *
+ * (The BSD License)
+ * 
+ * Copyright (c) 2010-2014, Christian Johansen, christian@cjohansen.no
+ * All rights reserved.
+ * 
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ * 
+ *     * Redistributions of source code must retain the above copyright notice,
+ *       this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above copyright notice,
+ *       this list of conditions and the following disclaimer in the documentation
+ *       and/or other materials provided with the distribution.
+ *     * Neither the name of Christian Johansen nor the names of his contributors
+ *       may be used to endorse or promote products derived from this software
+ *       without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+this.sinon = (function () {
+var samsam, formatio;
+function define(mod, deps, fn) { if (mod == "samsam") { samsam = deps(); } else { formatio = fn(samsam); } }
+define.amd = true;
+((typeof define === "function" && define.amd && function (m) { define("samsam", m); }) ||
+ (typeof module === "object" &&
+      function (m) { module.exports = m(); }) || // Node
+ function (m) { this.samsam = m(); } // Browser globals
+)(function () {
+    var o = Object.prototype;
+    var div = typeof document !== "undefined" && document.createElement("div");
+
+    function isNaN(value) {
+        // Unlike global isNaN, this avoids type coercion
+        // typeof check avoids IE host object issues, hat tip to
+        // lodash
+        var val = value; // JsLint thinks value !== value is "weird"
+        return typeof value === "number" && value !== val;
+    }
+
+    function getClass(value) {
+        // Returns the internal [[Class]] by calling Object.prototype.toString
+        // with the provided value as this. Return value is a string, naming the
+        // internal class, e.g. "Array"
+        return o.toString.call(value).split(/[ \]]/)[1];
+    }
+
+    /**
+     * @name samsam.isArguments
+     * @param Object object
+     *
+     * Returns ``true`` if ``object`` is an ``arguments`` object,
+     * ``false`` otherwise.
+     */
+    function isArguments(object) {
+        if (typeof object !== "object" || typeof object.length !== "number" ||
+                getClass(object) === "Array") {
+            return false;
+        }
+        if (typeof object.callee == "function") { return true; }
+        try {
+            object[object.length] = 6;
+            delete object[object.length];
+        } catch (e) {
+            return true;
+        }
+        return false;
+    }
+
+    /**
+     * @name samsam.isElement
+     * @param Object object
+     *
+     * Returns ``true`` if ``object`` is a DOM element node. Unlike
+     * Underscore.js/lodash, this function will return ``false`` if ``object``
+     * is an *element-like* object, i.e. a regular object with a ``nodeType``
+     * property that holds the value ``1``.
+     */
+    function isElement(object) {
+        if (!object || object.nodeType !== 1 || !div) { return false; }
+        try {
+            object.appendChild(div);
+            object.removeChild(div);
+        } catch (e) {
+            return false;
+        }
+        return true;
+    }
+
+    /**
+     * @name samsam.keys
+     * @param Object object
+     *
+     * Return an array of own property names.
+     */
+    function keys(object) {
+        var ks = [], prop;
+        for (prop in object) {
+            if (o.hasOwnProperty.call(object, prop)) { ks.push(prop); }
+        }
+        return ks;
+    }
+
+    /**
+     * @name samsam.isDate
+     * @param Object value
+     *
+     * Returns true if the object is a ``Date``, or *date-like*. Duck typing
+     * of date objects work by checking that the object has a ``getTime``
+     * function whose return value equals the return value from the object's
+     * ``valueOf``.
+     */
+    function isDate(value) {
+        return typeof value.getTime == "function" &&
+            value.getTime() == value.valueOf();
+    }
+
+    /**
+     * @name samsam.isNegZero
+     * @param Object value
+     *
+     * Returns ``true`` if ``value`` is ``-0``.
+     */
+    function isNegZero(value) {
+        return value === 0 && 1 / value === -Infinity;
+    }
+
+    /**
+     * @name samsam.equal
+     * @param Object obj1
+     * @param Object obj2
+     *
+     * Returns ``true`` if two objects are strictly equal. Compared to
+     * ``===`` there are two exceptions:
+     *
+     *   - NaN is considered equal to NaN
+     *   - -0 and +0 are not considered equal
+     */
+    function identical(obj1, obj2) {
+        if (obj1 === obj2 || (isNaN(obj1) && isNaN(obj2))) {
+            return obj1 !== 0 || isNegZero(obj1) === isNegZero(obj2);
+        }
+    }
+
+
+    /**
+     * @name samsam.deepEqual
+     * @param Object obj1
+     * @param Object obj2
+     *
+     * Deep equal comparison. Two values are "deep equal" if:
+     *
+     *   - They are equal, according to samsam.identical
+     *   - They are both date objects representing the same time
+     *   - They are both arrays containing elements that are all deepEqual
+     *   - They are objects with the same set of properties, and each property
+     *     in ``obj1`` is deepEqual to the corresponding property in ``obj2``
+     *
+     * Supports cyclic objects.
+     */
+    function deepEqualCyclic(obj1, obj2) {
+
+        // used for cyclic comparison
+        // contain already visited objects
+        var objects1 = [],
+            objects2 = [],
+        // contain pathes (position in the object structure)
+        // of the already visited objects
+        // indexes same as in objects arrays
+            paths1 = [],
+            paths2 = [],
+        // contains combinations of already compared objects
+        // in the manner: { "$1['ref']$2['ref']": true }
+            compared = {};
+
+        /**
+         * used to check, if the value of a property is an object
+         * (cyclic logic is only needed for objects)
+         * only needed for cyclic logic
+         */
+        function isObject(value) {
+
+            if (typeof value === 'object' && value !== null &&
+                    !(value instanceof Boolean) &&
+                    !(value instanceof Date)    &&
+                    !(value instanceof Number)  &&
+                    !(value instanceof RegExp)  &&
+                    !(value instanceof String)) {
+
+                return true;
+            }
+
+            return false;
+        }
+
+        /**
+         * returns the index of the given object in the
+         * given objects array, -1 if not contained
+         * only needed for cyclic logic
+         */
+        function getIndex(objects, obj) {
+
+            var i;
+            for (i = 0; i < objects.length; i++) {
+                if (objects[i] === obj) {
+                    return i;
+                }
+            }
+
+            return -1;
+        }
+
+        // does the recursion for the deep equal check
+        return (function deepEqual(obj1, obj2, path1, path2) {
+            var type1 = typeof obj1;
+            var type2 = typeof obj2;
+
+            // == null also matches undefined
+            if (obj1 === obj2 ||
+                    isNaN(obj1) || isNaN(obj2) ||
+                    obj1 == null || obj2 == null ||
+                    type1 !== "object" || type2 !== "object") {
+
+                return identical(obj1, obj2);
+            }
+
+            // Elements are only equal if identical(expected, actual)
+            if (isElement(obj1) || isElement(obj2)) { return false; }
+
+            var isDate1 = isDate(obj1), isDate2 = isDate(obj2);
+            if (isDate1 || isDate2) {
+                if (!isDate1 || !isDate2 || obj1.getTime() !== obj2.getTime()) {
+                    return false;
+                }
+            }
+
+            if (obj1 instanceof RegExp && obj2 instanceof RegExp) {
+                if (obj1.toString() !== obj2.toString()) { return false; }
+            }
+
+            var class1 = getClass(obj1);
+            var class2 = getClass(obj2);
+            var keys1 = keys(obj1);
+            var keys2 = keys(obj2);
+
+            if (isArguments(obj1) || isArguments(obj2)) {
+                if (obj1.length !== obj2.length) { return false; }
+            } else {
+                if (type1 !== type2 || class1 !== class2 ||
+                        keys1.length !== keys2.length) {
+                    return false;
+                }
+            }
+
+            var key, i, l,
+                // following vars are used for the cyclic logic
+                value1, value2,
+                isObject1, isObject2,
+                index1, index2,
+                newPath1, newPath2;
+
+            for (i = 0, l = keys1.length; i < l; i++) {
+                key = keys1[i];
+                if (!o.hasOwnProperty.call(obj2, key)) {
+                    return false;
+                }
+
+                // Start of the cyclic logic
+
+                value1 = obj1[key];
+                value2 = obj2[key];
+
+                isObject1 = isObject(value1);
+                isObject2 = isObject(value2);
+
+                // determine, if the objects were already visited
+                // (it's faster to check for isObject first, than to
+                // get -1 from getIndex for non objects)
+                index1 = isObject1 ? getIndex(objects1, value1) : -1;
+                index2 = isObject2 ? getIndex(objects2, value2) : -1;
+
+                // determine the new pathes of the objects
+                // - for non cyclic objects the current path will be extended
+                //   by current property name
+                // - for cyclic objects the stored path is taken
+                newPath1 = index1 !== -1
+                    ? paths1[index1]
+                    : path1 + '[' + JSON.stringify(key) + ']';
+                newPath2 = index2 !== -1
+                    ? paths2[index2]
+                    : path2 + '[' + JSON.stringify(key) + ']';
+
+                // stop recursion if current objects are already compared
+                if (compared[newPath1 + newPath2]) {
+                    return true;
+                }
+
+                // remember the current objects and their pathes
+                if (index1 === -1 && isObject1) {
+                    objects1.push(value1);
+                    paths1.push(newPath1);
+                }
+                if (index2 === -1 && isObject2) {
+                    objects2.push(value2);
+                    paths2.push(newPath2);
+                }
+
+                // remember that the current objects are already compared
+                if (isObject1 && isObject2) {
+                    compared[newPath1 + newPath2] = true;
+                }
+
+                // End of cyclic logic
+
+                // neither value1 nor value2 is a cycle
+                // continue with next level
+                if (!deepEqual(value1, value2, newPath1, newPath2)) {
+                    return false;
+                }
+            }
+
+            return true;
+
+        }(obj1, obj2, '$1', '$2'));
+    }
+
+    var match;
+
+    function arrayContains(array, subset) {
+        if (subset.length === 0) { return true; }
+        var i, l, j, k;
+        for (i = 0, l = array.length; i < l; ++i) {
+            if (match(array[i], subset[0])) {
+                for (j = 0, k = subset.length; j < k; ++j) {
+                    if (!match(array[i + j], subset[j])) { return false; }
+                }
+                return true;
+            }
+        }
+        return false;
+    }
+
+    /**
+     * @name samsam.match
+     * @param Object object
+     * @param Object matcher
+     *
+     * Compare arbitrary value ``object`` with matcher.
+     */
+    match = function match(object, matcher) {
+        if (matcher && typeof matcher.test === "function") {
+            return matcher.test(object);
+        }
+
+        if (typeof matcher === "function") {
+            return matcher(object) === true;
+        }
+
+        if (typeof matcher === "string") {
+            matcher = matcher.toLowerCase();
+            var notNull = typeof object === "string" || !!object;
+            return notNull &&
+                (String(object)).toLowerCase().indexOf(matcher) >= 0;
+        }
+
+        if (typeof matcher === "number") {
+            return matcher === object;
+        }
+
+        if (typeof matcher === "boolean") {
+            return matcher === object;
+        }
+
+        if (getClass(object) === "Array" && getClass(matcher) === "Array") {
+            return arrayContains(object, matcher);
+        }
+
+        if (matcher && typeof matcher === "object") {
+            var prop;
+            for (prop in matcher) {
+                if (!match(object[prop], matcher[prop])) {
+                    return false;
+                }
+            }
+            return true;
+        }
+
+        throw new Error("Matcher was not a string, a number, a " +
+                        "function, a boolean or an object");
+    };
+
+    return {
+        isArguments: isArguments,
+        isElement: isElement,
+        isDate: isDate,
+        isNegZero: isNegZero,
+        identical: identical,
+        deepEqual: deepEqualCyclic,
+        match: match,
+        keys: keys
+    };
+});
+((typeof define === "function" && define.amd && function (m) {
+    define("formatio", ["samsam"], m);
+}) || (typeof module === "object" && function (m) {
+    module.exports = m(require("samsam"));
+}) || function (m) { this.formatio = m(this.samsam); }
+)(function (samsam) {
+    
+    var formatio = {
+        excludeConstructors: ["Object", /^.$/],
+        quoteStrings: true
+    };
+
+    var hasOwn = Object.prototype.hasOwnProperty;
+
+    var specialObjects = [];
+    if (typeof global !== "undefined") {
+        specialObjects.push({ object: global, value: "[object global]" });
+    }
+    if (typeof document !== "undefined") {
+        specialObjects.push({
+            object: document,
+            value: "[object HTMLDocument]"
+        });
+    }
+    if (typeof window !== "undefined") {
+        specialObjects.push({ object: window, value: "[object Window]" });
+    }
+
+    function functionName(func) {
+        if (!func) { return ""; }
+        if (func.displayName) { return func.displayName; }
+        if (func.name) { return func.name; }
+        var matches = func.toString().match(/function\s+([^\(]+)/m);
+        return (matches && matches[1]) || "";
+    }
+
+    function constructorName(f, object) {
+        var name = functionName(object && object.constructor);
+        var excludes = f.excludeConstructors ||
+                formatio.excludeConstructors || [];
+
+        var i, l;
+        for (i = 0, l = excludes.length; i < l; ++i) {
+            if (typeof excludes[i] === "string" && excludes[i] === name) {
+                return "";
+            } else if (excludes[i].test && excludes[i].test(name)) {
+                return "";
+            }
+        }
+
+        return name;
+    }
+
+    function isCircular(object, objects) {
+        if (typeof object !== "object") { return false; }
+        var i, l;
+        for (i = 0, l = objects.length; i < l; ++i) {
+            if (objects[i] === object) { return true; }
+        }
+        return false;
+    }
+
+    function ascii(f, object, processed, indent) {
+        if (typeof object === "string") {
+            var qs = f.quoteStrings;
+            var quote = typeof qs !== "boolean" || qs;
+            return processed || quote ? '"' + object + '"' : object;
+        }
+
+        if (typeof object === "function" && !(object instanceof RegExp)) {
+            return ascii.func(object);
+        }
+
+        processed = processed || [];
+
+        if (isCircular(object, processed)) { return "[Circular]"; }
+
+        if (Object.prototype.toString.call(object) === "[object Array]") {
+            return ascii.array.call(f, object, processed);
+        }
+
+        if (!object) { return String((1/object) === -Infinity ? "-0" : object); }
+        if (samsam.isElement(object)) { return ascii.element(object); }
+
+        if (typeof object.toString === "function" &&
+                object.toString !== Object.prototype.toString) {
+            return object.toString();
+        }
+
+        var i, l;
+        for (i = 0, l = specialObjects.length; i < l; i++) {
+            if (object === specialObjects[i].object) {
+                return specialObjects[i].value;
+            }
+        }
+
+        return ascii.object.call(f, object, processed, indent);
+    }
+
+    ascii.func = function (func) {
+        return "function " + functionName(func) + "() {}";
+    };
+
+    ascii.array = function (array, processed) {
+        processed = processed || [];
+        processed.push(array);
+        var i, l, pieces = [];
+        for (i = 0, l = array.length; i < l; ++i) {
+            pieces.push(ascii(this, array[i], processed));
+        }
+        return "[" + pieces.join(", ") + "]";
+    };
+
+    ascii.object = function (object, processed, indent) {
+        processed = processed || [];
+        processed.push(object);
+        indent = indent || 0;
+        var pieces = [], properties = samsam.keys(object).sort();
+        var length = 3;
+        var prop, str, obj, i, l;
+
+        for (i = 0, l = properties.length; i < l; ++i) {
+            prop = properties[i];
+            obj = object[prop];
+
+            if (isCircular(obj, processed)) {
+                str = "[Circular]";
+            } else {
+                str = ascii(this, obj, processed, indent + 2);
+            }
+
+            str = (/\s/.test(prop) ? '"' + prop + '"' : prop) + ": " + str;
+            length += str.length;
+            pieces.push(str);
+        }
+
+        var cons = constructorName(this, object);
+        var prefix = cons ? "[" + cons + "] " : "";
+        var is = "";
+        for (i = 0, l = indent; i < l; ++i) { is += " "; }
+
+        if (length + indent > 80) {
+            return prefix + "{\n  " + is + pieces.join(",\n  " + is) + "\n" +
+                is + "}";
+        }
+        return prefix + "{ " + pieces.join(", ") + " }";
+    };
+
+    ascii.element = function (element) {
+        var tagName = element.tagName.toLowerCase();
+        var attrs = element.attributes, attr, pairs = [], attrName, i, l, val;
+
+        for (i = 0, l = attrs.length; i < l; ++i) {
+            attr = attrs.item(i);
+            attrName = attr.nodeName.toLowerCase().replace("html:", "");
+            val = attr.nodeValue;
+            if (attrName !== "contenteditable" || val !== "inherit") {
+                if (!!val) { pairs.push(attrName + "=\"" + val + "\""); }
+            }
+        }
+
+        var formatted = "<" + tagName + (pairs.length > 0 ? " " : "");
+        var content = element.innerHTML;
+
+        if (content.length > 20) {
+            content = content.substr(0, 20) + "[...]";
+        }
+
+        var res = formatted + pairs.join(" ") + ">" + content +
+                "</" + tagName + ">";
+
+        return res.replace(/ contentEditable="inherit"/, "");
+    };
+
+    function Formatio(options) {
+        for (var opt in options) {
+            this[opt] = options[opt];
+        }
+    }
+
+    Formatio.prototype = {
+        functionName: functionName,
+
+        configure: function (options) {
+            return new Formatio(options);
+        },
+
+        constructorName: function (object) {
+            return constructorName(this, object);
+        },
+
+        ascii: function (object, processed, indent) {
+            return ascii(this, object, processed, indent);
+        }
+    };
+
+    return Formatio.prototype;
+});
+/*jslint eqeqeq: false, onevar: false, forin: true, nomen: false, regexp: false, plusplus: false*/
+/*global module, require, __dirname, document*/
+/**
+ * Sinon core utilities. For internal use only.
+ *
+ * @author Christian Johansen (christian@cjohansen.no)
+ * @license BSD
+ *
+ * Copyright (c) 2010-2013 Christian Johansen
+ */
+
+var sinon = (function (formatio) {
+    var div = typeof document != "undefined" && document.createElement("div");
+    var hasOwn = Object.prototype.hasOwnProperty;
+
+    function isDOMNode(obj) {
+        var success = false;
+
+        try {
+            obj.appendChild(div);
+            success = div.parentNode == obj;
+        } catch (e) {
+            return false;
+        } finally {
+            try {
+                obj.removeChild(div);
+            } catch (e) {
+                // Remove failed, not much we can do about that
+            }
+        }
+
+        return success;
+    }
+
+    function isElement(obj) {
+        return div && obj && obj.nodeType === 1 && isDOMNode(obj);
+    }
+
+    function isFunction(obj) {
+        return typeof obj === "function" || !!(obj && obj.constructor && obj.call && obj.apply);
+    }
+
+    function mirrorProperties(target, source) {
+        for (var prop in source) {
+            if (!hasOwn.call(target, prop)) {
+                target[prop] = source[prop];
+            }
+        }
+    }
+
+    function isRestorable (obj) {
+        return typeof obj === "function" && typeof obj.restore === "function" && obj.restore.sinon;
+    }
+
+    var sinon = {
+        wrapMethod: function wrapMethod(object, property, method) {
+            if (!object) {
+                throw new TypeError("Should wrap property of object");
+            }
+
+            if (typeof method != "function") {
+                throw new TypeError("Method wrapper should be function");
+            }
+
+            var wrappedMethod = object[property],
+                error;
+
+            if (!isFunction(wrappedMethod)) {
+                error = new TypeError("Attempted to wrap " + (typeof wrappedMethod) + " property " +
+                                    property + " as function");
+            }
+
+            if (wrappedMethod.restore && wrappedMethod.restore.sinon) {
+                error = new TypeError("Attempted to wrap " + property + " which is already wrapped");
+            }
+
+            if (wrappedMethod.calledBefore) {
+                var verb = !!wrappedMethod.returns ? "stubbed" : "spied on";
+                error = new TypeError("Attempted to wrap " + property + " which is already " + verb);
+            }
+
+            if (error) {
+                if (wrappedMethod._stack) {
+                    error.stack += '\n--------------\n' + wrappedMethod._stack;
+                }
+                throw error;
+            }
+
+            // IE 8 does not support hasOwnProperty on the window object and Firefox has a problem
+            // when using hasOwn.call on objects from other frames.
+            var owned = object.hasOwnProperty ? object.hasOwnProperty(property) : hasOwn.call(object, property);
+            object[property] = method;
+            method.displayName = property;
+            // Set up a stack trace which can be used later to find what line of
+            // code the original method was created on.
+            method._stack = (new Error('Stack Trace for original')).stack;
+
+            method.restore = function () {
+                // For prototype properties try to reset by delete first.
+                // If this fails (ex: localStorage on mobile safari) then force a reset
+                // via direct assignment.
+                if (!owned) {
+                    delete object[property];
+                }
+                if (object[property] === method) {
+                    object[property] = wrappedMethod;
+                }
+            };
+
+            method.restore.sinon = true;
+            mirrorProperties(method, wrappedMethod);
+
+            return method;
+        },
+
+        extend: function extend(target) {
+            for (var i = 1, l = arguments.length; i < l; i += 1) {
+                for (var prop in arguments[i]) {
+                    if (arguments[i].hasOwnProperty(prop)) {
+                        target[prop] = arguments[i][prop];
+                    }
+
+                    // DONT ENUM bug, only care about toString
+                    if (arguments[i].hasOwnProperty("toString") &&
+                        arguments[i].toString != target.toString) {
+                        target.toString = arguments[i].toString;
+                    }
+                }
+            }
+
+            return target;
+        },
+
+        create: function create(proto) {
+            var F = function () {};
+            F.prototype = proto;
+            return new F();
+        },
+
+        deepEqual: function deepEqual(a, b) {
+            if (sinon.match && sinon.match.isMatcher(a)) {
+                return a.test(b);
+            }
+            if (typeof a != "object" || typeof b != "object") {
+                return a === b;
+            }
+
+            if (isElement(a) || isElement(b)) {
+                return a === b;
+            }
+
+            if (a === b) {
+                return true;
+            }
+
+            if ((a === null && b !== null) || (a !== null && b === null)) {
+                return false;
+            }
+
+            if (a instanceof RegExp && b instanceof RegExp) {
+              return (a.source === b.source) && (a.global === b.global) && 
+                (a.ignoreCase === b.ignoreCase) && (a.multiline === b.multiline);
+            }
+
+            var aString = Object.prototype.toString.call(a);
+            if (aString != Object.prototype.toString.call(b)) {
+                return false;
+            }
+
+            if (aString == "[object Date]") {
+                return a.valueOf() === b.valueOf();
+            }
+
+            var prop, aLength = 0, bLength = 0;
+
+            if (aString == "[object Array]" && a.length !== b.length) {
+                return false;
+            }
+
+            for (prop in a) {
+                aLength += 1;
+
+                if (!deepEqual(a[prop], b[prop])) {
+                    return false;
+                }
+            }
+
+            for (prop in b) {
+                bLength += 1;
+            }
+
+            return aLength == bLength;
+        },
+
+        functionName: function functionName(func) {
+            var name = func.displayName || func.name;
+
+            // Use function decomposition as a last resort to get function
+            // name. Does not rely on function decomposition to work - if it
+            // doesn't debugging will be slightly less informative
+            // (i.e. toString will say 'spy' rather than 'myFunc').
+            if (!name) {
+                var matches = func.toString().match(/function ([^\s\(]+)/);
+                name = matches && matches[1];
+            }
+
+            return name;
+        },
+
+        functionToString: function toString() {
+            if (this.getCall && this.callCount) {
+                var thisValue, prop, i = this.callCount;
+
+                while (i--) {
+                    thisValue = this.getCall(i).thisValue;
+
+                    for (prop in thisValue) {
+                        if (thisValue[prop] === this) {
+                            return prop;
+                        }
+                    }
+                }
+            }
+
+            return this.displayName || "sinon fake";
+        },
+
+        getConfig: function (custom) {
+            var config = {};
+            custom = custom || {};
+            var defaults = sinon.defaultConfig;
+
+            for (var prop in defaults) {
+                if (defaults.hasOwnProperty(prop)) {
+                    config[prop] = custom.hasOwnProperty(prop) ? custom[prop] : defaults[prop];
+                }
+            }
+
+            return config;
+        },
+
+        format: function (val) {
+            return "" + val;
+        },
+
+        defaultConfig: {
+            injectIntoThis: true,
+            injectInto: null,
+            properties: ["spy", "stub", "mock", "clock", "server", "requests"],
+            useFakeTimers: true,
+            useFakeServer: true
+        },
+
+        timesInWords: function timesInWords(count) {
+            return count == 1 && "once" ||
+                count == 2 && "twice" ||
+                count == 3 && "thrice" ||
+                (count || 0) + " times";
+        },
+
+        calledInOrder: function (spies) {
+            for (var i = 1, l = spies.length; i < l; i++) {
+                if (!spies[i - 1].calledBefore(spies[i]) || !spies[i].called) {
+                    return false;
+                }
+            }
+
+            return true;
+        },
+
+        orderByFirstCall: function (spies) {
+            return spies.sort(function (a, b) {
+                // uuid, won't ever be equal
+                var aCall = a.getCall(0);
+                var bCall = b.getCall(0);
+                var aId = aCall && aCall.callId || -1;
+                var bId = bCall && bCall.callId || -1;
+
+                return aId < bId ? -1 : 1;
+            });
+        },
+
+        log: function () {},
+
+        logError: function (label, err) {
+            var msg = label + " threw exception: ";
+            sinon.log(msg + "[" + err.name + "] " + err.message);
+            if (err.stack) { sinon.log(err.stack); }
+
+            setTimeout(function () {
+                err.message = msg + err.message;
+                throw err;
+            }, 0);
+        },
+
+        typeOf: function (value) {
+            if (value === null) {
+                return "null";
+            }
+            else if (value === undefined) {
+                return "undefined";
+            }
+            var string = Object.prototype.toString.call(value);
+            return string.substring(8, string.length - 1).toLowerCase();
+        },
+
+        createStubInstance: function (constructor) {
+            if (typeof constructor !== "function") {
+                throw new TypeError("The constructor should be a function.");
+            }
+            return sinon.stub(sinon.create(constructor.prototype));
+        },
+
+        restore: function (object) {
+            if (object !== null && typeof object === "object") {
+                for (var prop in object) {
+                    if (isRestorable(object[prop])) {
+                        object[prop].restore();
+                    }
+                }
+            }
+            else if (isRestorable(object)) {
+                object.restore();
+            }
+        }
+    };
+
+    var isNode = typeof module !== "undefined" && module.exports;
+    var isAMD = typeof define === 'function' && typeof define.amd === 'object' && define.amd;
+
+    if (isAMD) {
+        define(function(){
+            return sinon;
+        });
+    } else if (isNode) {
+        try {
+            formatio = require("formatio");
+        } catch (e) {}
+        module.exports = sinon;
+        module.exports.spy = require("./sinon/spy");
+        module.exports.spyCall = require("./sinon/call");
+        module.exports.behavior = require("./sinon/behavior");
+        module.exports.stub = require("./sinon/stub");
+        module.exports.mock = require("./sinon/mock");
+        module.exports.collection = require("./sinon/collection");
+        module.exports.assert = require("./sinon/assert");
+        module.exports.sandbox = require("./sinon/sandbox");
+        module.exports.test = require("./sinon/test");
+        module.exports.testCase = require("./sinon/test_case");
+        module.exports.assert = require("./sinon/assert");
+        module.exports.match = require("./sinon/match");
+    }
+
+    if (formatio) {
+        var formatter = formatio.configure({ quoteStrings: false });
+        sinon.format = function () {
+            return formatter.ascii.apply(formatter, arguments);
+        };
+    } else if (isNode) {
+        try {
+            var util = require("util");
+            sinon.format = function (value) {
+                return typeof value == "object" && value.toString === Object.prototype.toString ? util.inspect(value) : value;
+            };
+        } catch (e) {
+            /* Node, but no util module - would be very old, but better safe than
+             sorry */
+        }
+    }
+
+    return sinon;
+}(typeof formatio == "object" && formatio));
+
+/* @depend ../sinon.js */
+/*jslint eqeqeq: false, onevar: false, plusplus: false*/
+/*global module, require, sinon*/
+/**
+ * Match functions
+ *
+ * @author Maximilian Antoni (mail@maxantoni.de)
+ * @license BSD
+ *
+ * Copyright (c) 2012 Maximilian Antoni
+ */
+
+(function (sinon) {
+    var commonJSModule = typeof module !== 'undefined' && module.exports;
+
+    if (!sinon && commonJSModule) {
+        sinon = require("../sinon");
+    }
+
+    if (!sinon) {
+        return;
+    }
+
+    function assertType(value, type, name) {
+        var actual = sinon.typeOf(value);
+        if (actual !== type) {
+            throw new TypeError("Expected type of " + name + " to be " +
+                type + ", but was " + actual);
+        }
+    }
+
+    var matcher = {
+        toString: function () {
+            return this.message;
+        }
+    };
+
+    function isMatcher(object) {
+        return matcher.isPrototypeOf(object);
+    }
+
+    function matchObject(expectation, actual) {
+        if (actual === null || actual === undefined) {
+            return false;
+        }
+        for (var key in expectation) {
+            if (expectation.hasOwnProperty(key)) {
+                var exp = expectation[key];
+                var act = actual[key];
+                if (match.isMatcher(exp)) {
+                    if (!exp.test(act)) {
+                        return false;
+                    }
+                } else if (sinon.typeOf(exp) === "object") {
+                    if (!matchObject(exp, act)) {
+                        return false;
+                    }
+                } else if (!sinon.deepEqual(exp, act)) {
+                    return false;
+                }
+            }
+        }
+        return true;
+    }
+
+    matcher.or = function (m2) {
+        if (!arguments.length) {
+            throw new TypeError("Matcher expected");
+        } else if (!isMatcher(m2)) {
+            m2 = match(m2);
+        }
+        var m1 = this;
+        var or = sinon.create(matcher);
+        or.test = function (actual) {
+            return m1.test(actual) || m2.test(actual);
+        };
+        or.message = m1.message + ".or(" + m2.message + ")";
+        return or;
+    };
+
+    matcher.and = function (m2) {
+        if (!arguments.length) {
+            throw new TypeError("Matcher expected");
+        } else if (!isMatcher(m2)) {
+            m2 = match(m2);
+        }
+        var m1 = this;
+        var and = sinon.create(matcher);
+        and.test = function (actual) {
+            return m1.test(actual) && m2.test(actual);
+        };
+        and.message = m1.message + ".and(" + m2.message + ")";
+        return and;
+    };
+
+    var match = function (expectation, message) {
+        var m = sinon.create(matcher);
+        var type = sinon.typeOf(expectation);
+        switch (type) {
+        case "object":
+            if (typeof expectation.test === "function") {
+                m.test = function (actual) {
+                    return expectation.test(actual) === true;
+                };
+                m.message = "match(" + sinon.functionName(expectation.test) + ")";
+                return m;
+            }
+            var str = [];
+            for (var key in expectation) {
+                if (expectation.hasOwnProperty(key)) {
+                    str.push(key + ": " + expectation[key]);
+                }
+            }
+            m.test = function (actual) {
+                return matchObject(expectation, actual);
+            };
+            m.message = "match(" + str.join(", ") + ")";
+            break;
+        case "number":
+            m.test = function (actual) {
+                return expectation == actual;
+            };
+            break;
+        case "string":
+            m.test = function (actual) {
+                if (typeof actual !== "string") {
+                    return false;
+                }
+                return actual.indexOf(expectation) !== -1;
+            };
+            m.message = "match(\"" + expectation + "\")";
+            break;
+        case "regexp":
+            m.test = function (actual) {
+                if (typeof actual !== "string") {
+                    return false;
+                }
+                return expectation.test(actual);
+            };
+            break;
+        case "function":
+            m.test = expectation;
+            if (message) {
+                m.message = message;
+            } else {
+                m.message = "match(" + sinon.functionName(expectation) + ")";
+            }
+            break;
+        default:
+            m.test = function (actual) {
+              return sinon.deepEqual(expectation, actual);
+            };
+        }
+        if (!m.message) {
+            m.message = "match(" + expectation + ")";
+        }
+        return m;
+    };
+
+    match.isMatcher = isMatcher;
+
+    match.any = match(function () {
+        return true;
+    }, "any");
+
+    match.defined = match(function (actual) {
+        return actual !== null && actual !== undefined;
+    }, "defined");
+
+    match.truthy = match(function (actual) {
+        return !!actual;
+    }, "truthy");
+
+    match.falsy = match(function (actual) {
+        return !actual;
+    }, "falsy");
+
+    match.same = function (expectation) {
+        return match(function (actual) {
+            return expectation === actual;
+        }, "same(" + expectation + ")");
+    };
+
+    match.typeOf = function (type) {
+        assertType(type, "string", "type");
+        return match(function (actual) {
+            return sinon.typeOf(actual) === type;
+        }, "typeOf(\"" + type + "\")");
+    };
+
+    match.instanceOf = function (type) {
+        assertType(type, "function", "type");
+        return match(function (actual) {
+            return actual instanceof type;
+        }, "instanceOf(" + sinon.functionName(type) + ")");
+    };
+
+    function createPropertyMatcher(propertyTest, messagePrefix) {
+        return function (property, value) {
+            assertType(property, "string", "property");
+            var onlyProperty = arguments.length === 1;
+            var message = messagePrefix + "(\"" + property + "\"";
+            if (!onlyProperty) {
+                message += ", " + value;
+            }
+            message += ")";
+            return match(function (actual) {
+                if (actual === undefined || actual === null ||
+                        !propertyTest(actual, property)) {
+                    return false;
+                }
+                return onlyProperty || sinon.deepEqual(value, actual[property]);
+            }, message);
+        };
+    }
+
+    match.has = createPropertyMatcher(function (actual, property) {
+        if (typeof actual === "object") {
+            return property in actual;
+        }
+        return actual[property] !== undefined;
+    }, "has");
+
+    match.hasOwn = createPropertyMatcher(function (actual, property) {
+        return actual.hasOwnProperty(property);
+    }, "hasOwn");
+
+    match.bool = match.typeOf("boolean");
+    match.number = match.typeOf("number");
+    match.string = match.typeOf("string");
+    match.object = match.typeOf("object");
+    match.func = match.typeOf("function");
+    match.array = match.typeOf("array");
+    match.regexp = match.typeOf("regexp");
+    match.date = match.typeOf("date");
+
+    if (commonJSModule) {
+        module.exports = match;
+    } else {
+        sinon.match = match;
+    }
+}(typeof sinon == "object" && sinon || null));
+
+/**
+  * @depend ../sinon.js
+  * @depend match.js
+  */
+/*jslint eqeqeq: false, onevar: false, plusplus: false*/
+/*global module, require, sinon*/
+/**
+  * Spy calls
+  *
+  * @author Christian Johansen (christian@cjohansen.no)
+  * @author Maximilian Antoni (mail@maxantoni.de)
+  * @license BSD
+  *
+  * Copyright (c) 2010-2013 Christian Johansen
+  * Copyright (c) 2013 Maximilian Antoni
+  */
+
+(function (sinon) {
+    var commonJSModule = typeof module !== 'undefined' && module.exports;
+    if (!sinon && commonJSModule) {
+        sinon = require("../sinon");
+    }
+
+    if (!sinon) {
+        return;
+    }
+
+    function throwYieldError(proxy, text, args) {
+        var msg = sinon.functionName(proxy) + text;
+        if (args.length) {
+            msg += " Received [" + slice.call(args).join(", ") + "]";
+        }
+        throw new Error(msg);
+    }
+
+    var slice = Array.prototype.slice;
+
+    var callProto = {
+        calledOn: function calledOn(thisValue) {
+            if (sinon.match && sinon.match.isMatcher(thisValue)) {
+                return thisValue.test(this.thisValue);
+            }
+            return this.thisValue === thisValue;
+        },
+
+        calledWith: function calledWith() {
+            for (var i = 0, l = arguments.length; i < l; i += 1) {
+                if (!sinon.deepEqual(arguments[i], this.args[i])) {
+                    return false;
+                }
+            }
+
+            return true;
+        },
+
+        calledWithMatch: function calledWithMatch() {
+            for (var i = 0, l = arguments.length; i < l; i += 1) {
+                var actual = this.args[i];
+                var expectation = arguments[i];
+                if (!sinon.match || !sinon.match(expectation).test(actual)) {
+                    return false;
+                }
+            }
+            return true;
+        },
+
+        calledWithExactly: function calledWithExactly() {
+            return arguments.length == this.args.length &&
+                this.calledWith.apply(this, arguments);
+        },
+
+        notCalledWith: function notCalledWith() {
+            return !this.calledWith.apply(this, arguments);
+        },
+
+        notCalledWithMatch: function notCalledWithMatch() {
+            return !this.calledWithMatch.apply(this, arguments);
+        },
+
+        returned: function returned(value) {
+            return sinon.deepEqual(value, this.returnValue);
+        },
+
+        threw: function threw(error) {
+            if (typeof error === "undefined" || !this.exception) {
+                return !!this.exception;
+            }
+
+            return this.exception === error || this.exception.name === error;
+        },
+
+        calledWithNew: function calledWithNew() {
+            return this.proxy.prototype && this.thisValue instanceof this.proxy;
+        },
+
+        calledBefore: function (other) {
+            return this.callId < other.callId;
+        },
+
+        calledAfter: function (other) {
+            return this.callId > other.callId;
+        },
+
+        callArg: function (pos) {
+            this.args[pos]();
+        },
+
+        callArgOn: function (pos, thisValue) {
+            this.args[pos].apply(thisValue);
+        },
+
+        callArgWith: function (pos) {
+            this.callArgOnWith.apply(this, [pos, null].concat(slice.call(arguments, 1)));
+        },
+
+        callArgOnWith: function (pos, thisValue) {
+            var args = slice.call(arguments, 2);
+            this.args[pos].apply(thisValue, args);
+        },
+
+        "yield": function () {
+            this.yieldOn.apply(this, [null].concat(slice.call(arguments, 0)));
+        },
+
+        yieldOn: function (thisValue) {
+            var args = this.args;
+            for (var i = 0, l = args.length; i < l; ++i) {
+                if (typeof args[i] === "function") {
+                    args[i].apply(thisValue, slice.call(arguments, 1));
+                    return;
+                }
+            }
+            throwYieldError(this.proxy, " cannot yield since no callback was passed.", args);
+        },
+
+        yieldTo: function (prop) {
+            this.yieldToOn.apply(this, [prop, null].concat(slice.call(arguments, 1)));
+        },
+
+        yieldToOn: function (prop, thisValue) {
+            var args = this.args;
+            for (var i = 0, l = args.length; i < l; ++i) {
+                if (args[i] && typeof args[i][prop] === "function") {
+                    args[i][prop].apply(thisValue, slice.call(arguments, 2));
+                    return;
+                }
+            }
+            throwYieldError(this.proxy, " cannot yield to '" + prop +
+                "' since no callback was passed.", args);
+        },
+
+        toString: function () {
+            var callStr = this.proxy.toString() + "(";
+            var args = [];
+
+            for (var i = 0, l = this.args.length; i < l; ++i) {
+                args.push(sinon.format(this.args[i]));
+            }
+
+            callStr = callStr + args.join(", ") + ")";
+
+            if (typeof this.returnValue != "undefined") {
+                callStr += " => " + sinon.format(this.returnValue);
+            }
+
+            if (this.exception) {
+                callStr += " !" + this.exception.name;
+
+                if (this.exception.message) {
+                    callStr += "(" + this.exception.message + ")";
+                }
+            }
+
+            return callStr;
+        }
+    };
+
+    callProto.invokeCallback = callProto.yield;
+
+    function createSpyCall(spy, thisValue, args, returnValue, exception, id) {
+        if (typeof id !== "number") {
+            throw new TypeError("Call id is not a number");
+        }
+        var proxyCall = sinon.create(callProto);
+        proxyCall.proxy = spy;
+        proxyCall.thisValue = thisValue;
+        proxyCall.args = args;
+        proxyCall.returnValue = returnValue;
+        proxyCall.exception = exception;
+        proxyCall.callId = id;
+
+        return proxyCall;
+    }
+    createSpyCall.toString = callProto.toString; // used by mocks
+
+    if (commonJSModule) {
+        module.exports = createSpyCall;
+    } else {
+        sinon.spyCall = createSpyCall;
+    }
+}(typeof sinon == "object" && sinon || null));
+
+
+/**
+  * @depend ../sinon.js
+  * @depend call.js
+  */
+/*jslint eqeqeq: false, onevar: false, plusplus: false*/
+/*global module, require, sinon*/
+/**
+  * Spy functions
+  *
+  * @author Christian Johansen (christian@cjohansen.no)
+  * @license BSD
+  *
+  * Copyright (c) 2010-2013 Christian Johansen
+  */
+
+(function (sinon) {
+    var commonJSModule = typeof module !== 'undefined' && module.exports;
+    var push = Array.prototype.push;
+    var slice = Array.prototype.slice;
+    var callId = 0;
+
+    if (!sinon && commonJSModule) {
+        sinon = require("../sinon");
+    }
+
+    if (!sinon) {
+        return;
+    }
+
+    function spy(object, property) {
+        if (!property && typeof object == "function") {
+            return spy.create(object);
+        }
+
+        if (!object && !property) {
+            return spy.create(function () { });
+        }
+
+        var method = object[property];
+        return sinon.wrapMethod(object, property, spy.create(method));
+    }
+
+    function matchingFake(fakes, args, strict) {
+        if (!fakes) {
+            return;
+        }
+
+        for (var i = 0, l = fakes.length; i < l; i++) {
+            if (fakes[i].matches(args, strict)) {
+                return fakes[i];
+            }
+        }
+    }
+
+    function incrementCallCount() {
+        this.called = true;
+        this.callCount += 1;
+        this.notCalled = false;
+        this.calledOnce = this.callCount == 1;
+        this.calledTwice = this.callCount == 2;
+        this.calledThrice = this.callCount == 3;
+    }
+
+    function createCallProperties() {
+        this.firstCall = this.getCall(0);
+        this.secondCall = this.getCall(1);
+        this.thirdCall = this.getCall(2);
+        this.lastCall = this.getCall(this.callCount - 1);
+    }
+
+    var vars = "a,b,c,d,e,f,g,h,i,j,k,l";
+    function createProxy(func) {
+        // Retain the function length:
+        var p;
+        if (func.length) {
+            eval("p = (function proxy(" + vars.substring(0, func.length * 2 - 1) +
+                ") { return p.invoke(func, this, slice.call(arguments)); });");
+        }
+        else {
+            p = function proxy() {
+                return p.invoke(func, this, slice.call(arguments));
+            };
+        }
+        return p;
+    }
+
+    var uuid = 0;
+
+    // Public API
+    var spyApi = {
+        reset: function () {
+            this.called = false;
+            this.notCalled = true;
+            this.calledOnce = false;
+            this.calledTwice = false;
+            this.calledThrice = false;
+            this.callCount = 0;
+            this.firstCall = null;
+            this.secondCall = null;
+            this.thirdCall = null;
+            this.lastCall = null;
+            this.args = [];
+            this.returnValues = [];
+            this.thisValues = [];
+            this.exceptions = [];
+            this.callIds = [];
+            if (this.fakes) {
+                for (var i = 0; i < this.fakes.length; i++) {
+                    this.fakes[i].reset();
+                }
+            }
+        },
+
+        create: function create(func) {
+            var name;
+
+            if (typeof func != "function") {
+                func = function () { };
+            } else {
+                name = sinon.functionName(func);
+            }
+
+            var proxy = createProxy(func);
+
+            sinon.extend(proxy, spy);
+            delete proxy.create;
+            sinon.extend(proxy, func);
+
+            proxy.reset();
+            proxy.prototype = func.prototype;
+            proxy.displayName = name || "spy";
+            proxy.toString = sinon.functionToString;
+            proxy._create = sinon.spy.create;
+            proxy.id = "spy#" + uuid++;
+
+            return proxy;
+        },
+
+        invoke: function invoke(func, thisValue, args) {
+            var matching = matchingFake(this.fakes, args);
+            var exception, returnValue;
+
+            incrementCallCount.call(this);
+            push.call(this.thisValues, thisValue);
+            push.call(this.args, args);
+            push.call(this.callIds, callId++);
+
+            try {
+                if (matching) {
+                    returnValue = matching.invoke(func, thisValue, args);
+                } else {
+                    returnValue = (this.func || func).apply(thisValue, args);
+                }
+
+                var thisCall = this.getCall(this.callCount - 1);
+                if (thisCall.calledWithNew() && typeof returnValue !== 'object') {
+                    returnValue = thisValue;
+                }
+            } catch (e) {
+                exception = e;
+            }
+
+            push.call(this.exceptions, exception);
+            push.call(this.returnValues, returnValue);
+
+            createCallProperties.call(this);
+
+            if (exception !== undefined) {
+                throw exception;
+            }
+
+            return returnValue;
+        },
+
+        getCall: function getCall(i) {
+            if (i < 0 || i >= this.callCount) {
+                return null;
+            }
+
+            return sinon.spyCall(this, this.thisValues[i], this.args[i],
+                                    this.returnValues[i], this.exceptions[i],
+                                    this.callIds[i]);
+        },
+
+        getCalls: function () {
+            var calls = [];
+            var i;
+
+            for (i = 0; i < this.callCount; i++) {
+                calls.push(this.getCall(i));
+            }
+
+            return calls;
+        },
+
+        calledBefore: function calledBefore(spyFn) {
+            if (!this.called) {
+                return false;
+            }
+
+            if (!spyFn.called) {
+                return true;
+            }
+
+            return this.callIds[0] < spyFn.callIds[spyFn.callIds.length - 1];
+        },
+
+        calledAfter: function calledAfter(spyFn) {
+            if (!this.called || !spyFn.called) {
+                return false;
+            }
+
+            return this.callIds[this.callCount - 1] > spyFn.callIds[spyFn.callCount - 1];
+        },
+
+        withArgs: function () {
+            var args = slice.call(arguments);
+
+            if (this.fakes) {
+                var match = matchingFake(this.fakes, args, true);
+
+                if (match) {
+                    return match;
+                }
+            } else {
+                this.fakes = [];
+            }
+
+            var original = this;
+            var fake = this._create();
+            fake.matchingAguments = args;
+            fake.parent = this;
+            push.call(this.fakes, fake);
+
+            fake.withArgs = function () {
+                return original.withArgs.apply(original, arguments);
+            };
+
+            for (var i = 0; i < this.args.length; i++) {
+                if (fake.matches(this.args[i])) {
+                    incrementCallCount.call(fake);
+                    push.call(fake.thisValues, this.thisValues[i]);
+                    push.call(fake.args, this.args[i]);
+                    push.call(fake.returnValues, this.returnValues[i]);
+                    push.call(fake.exceptions, this.exceptions[i]);
+                    push.call(fake.callIds, this.callIds[i]);
+                }
+            }
+            createCallProperties.call(fake);
+
+            return fake;
+        },
+
+        matches: function (args, strict) {
+            var margs = this.matchingAguments;
+
+            if (margs.length <= args.length &&
+                sinon.deepEqual(margs, args.slice(0, margs.length))) {
+                return !strict || margs.length == args.length;
+            }
+        },
+
+        printf: function (format) {
+            var spy = this;
+            var args = slice.call(arguments, 1);
+            var formatter;
+
+            return (format || "").replace(/%(.)/g, function (match, specifyer) {
+                formatter = spyApi.formatters[specifyer];
+
+                if (typeof formatter == "function") {
+                    return formatter.call(null, spy, args);
+                } else if (!isNaN(parseInt(specifyer, 10))) {
+                    return sinon.format(args[specifyer - 1]);
+                }
+
+                return "%" + specifyer;
+            });
+        }
+    };
+
+    function delegateToCalls(method, matchAny, actual, notCalled) {
+        spyApi[method] = function () {
+            if (!this.called) {
+                if (notCalled) {
+                    return notCalled.apply(this, arguments);
+                }
+                return false;
+            }
+
+            var currentCall;
+            var matches = 0;
+
+            for (var i = 0, l = this.callCount; i < l; i += 1) {
+                currentCall = this.getCall(i);
+
+                if (currentCall[actual || method].apply(currentCall, arguments)) {
+                    matches += 1;
+
+                    if (matchAny) {
+                        return true;
+                    }
+                }
+            }
+
+            return matches === this.callCount;
+        };
+    }
+
+    delegateToCalls("calledOn", true);
+    delegateToCalls("alwaysCalledOn", false, "calledOn");
+    delegateToCalls("calledWith", true);
+    delegateToCalls("calledWithMatch", true);
+    delegateToCalls("alwaysCalledWith", false, "calledWith");
+    delegateToCalls("alwaysCalledWithMatch", false, "calledWithMatch");
+    delegateToCalls("calledWithExactly", true);
+    delegateToCalls("alwaysCalledWithExactly", false, "calledWithExactly");
+    delegateToCalls("neverCalledWith", false, "notCalledWith",
+        function () { return true; });
+    delegateToCalls("neverCalledWithMatch", false, "notCalledWithMatch",
+        function () { return true; });
+    delegateToCalls("threw", true);
+    delegateToCalls("alwaysThrew", false, "threw");
+    delegateToCalls("returned", true);
+    delegateToCalls("alwaysReturned", false, "returned");
+    delegateToCalls("calledWithNew", true);
+    delegateToCalls("alwaysCalledWithNew", false, "calledWithNew");
+    delegateToCalls("callArg", false, "callArgWith", function () {
+        throw new Error(this.toString() + " cannot call arg since it was not yet invoked.");
+    });
+    spyApi.callArgWith = spyApi.callArg;
+    delegateToCalls("callArgOn", false, "callArgOnWith", function () {
+        throw new Error(this.toString() + " cannot call arg since it was not yet invoked.");
+    });
+    spyApi.callArgOnWith = spyApi.callArgOn;
+    delegateToCalls("yield", false, "yield", function () {
+        throw new Error(this.toString() + " cannot yield since it was not yet invoked.");
+    });
+    // "invokeCallback" is an alias for "yield" since "yield" is invalid in strict mode.
+    spyApi.invokeCallback = spyApi.yield;
+    delegateToCalls("yieldOn", false, "yieldOn", function () {
+        throw new Error(this.toString() + " cannot yield since it was not yet invoked.");
+    });
+    delegateToCalls("yieldTo", false, "yieldTo", function (property) {
+        throw new Error(this.toString() + " cannot yield to '" + property +
+            "' since it was not yet invoked.");
+    });
+    delegateToCalls("yieldToOn", false, "yieldToOn", function (property) {
+        throw new Error(this.toString() + " cannot yield to '" + property +
+            "' since it was not yet invoked.");
+    });
+
+    spyApi.formatters = {
+        "c": function (spy) {
+            return sinon.timesInWords(spy.callCount);
+        },
+
+        "n": function (spy) {
+            return spy.toString();
+        },
+
+        "C": function (spy) {
+            var calls = [];
+
+            for (var i = 0, l = spy.callCount; i < l; ++i) {
+                var stringifiedCall = "    " + spy.getCall(i).toString();
+                if (/\n/.test(calls[i - 1])) {
+                    stringifiedCall = "\n" + stringifiedCall;
+                }
+                push.call(calls, stringifiedCall);
+            }
+
+            return calls.length > 0 ? "\n" + calls.join("\n") : "";
+        },
+
+        "t": function (spy) {
+            var objects = [];
+
+            for (var i = 0, l = spy.callCount; i < l; ++i) {
+                push.call(objects, sinon.format(spy.thisValues[i]));
+            }
+
+            return objects.join(", ");
+        },
+
+        "*": function (spy, args) {
+            var formatted = [];
+
+            for (var i = 0, l = args.length; i < l; ++i) {
+                push.call(formatted, sinon.format(args[i]));
+            }
+
+            return formatted.join(", ");
+        }
+    };
+
+    sinon.extend(spy, spyApi);
+
+    spy.spyCall = sinon.spyCall;
+
+    if (commonJSModule) {
+        module.exports = spy;
+    } else {
+        sinon.spy = spy;
+    }
+}(typeof sinon == "object" && sinon || null));
+
+/**
+ * @depend ../sinon.js
+ */
+/*jslint eqeqeq: false, onevar: false*/
+/*global module, require, sinon, process, setImmediate, setTimeout*/
+/**
+ * Stub behavior
+ *
+ * @author Christian Johansen (christian@cjohansen.no)
+ * @author Tim Fischbach (mail@timfischbach.de)
+ * @license BSD
+ *
+ * Copyright (c) 2010-2013 Christian Johansen
+ */
+
+(function (sinon) {
+    var commonJSModule = typeof module !== 'undefined' && module.exports;
+
+    if (!sinon && commonJSModule) {
+        sinon = require("../sinon");
+    }
+
+    if (!sinon) {
+        return;
+    }
+
+    var slice = Array.prototype.slice;
+    var join = Array.prototype.join;
+    var proto;
+
+    var nextTick = (function () {
+        if (typeof process === "object" && typeof process.nextTick === "function") {
+            return process.nextTick;
+        } else if (typeof setImmediate === "function") {
+            return setImmediate;
+        } else {
+            return function (callback) {
+                setTimeout(callback, 0);
+            };
+        }
+    })();
+
+    function throwsException(error, message) {
+        if (typeof error == "string") {
+            this.exception = new Error(message || "");
+            this.exception.name = error;
+        } else if (!error) {
+            this.exception = new Error("Error");
+        } else {
+            this.exception = error;
+        }
+
+        return this;
+    }
+
+    function getCallback(behavior, args) {
+        var callArgAt = behavior.callArgAt;
+
+        if (callArgAt < 0) {
+            var callArgProp = behavior.callArgProp;
+
+            for (var i = 0, l = args.length; i < l; ++i) {
+                if (!callArgProp && typeof args[i] == "function") {
+                    return args[i];
+                }
+
+                if (callArgProp && args[i] &&
+                    typeof args[i][callArgProp] == "function") {
+                    return args[i][callArgProp];
+                }
+            }
+
+            return null;
+        }
+
+        return args[callArgAt];
+    }
+
+    function getCallbackError(behavior, func, args) {
+        if (behavior.callArgAt < 0) {
+            var msg;
+
+            if (behavior.callArgProp) {
+                msg = sinon.functionName(behavior.stub) +
+                    " expected to yield to '" + behavior.callArgProp +
+                    "', but no object with such a property was passed.";
+            } else {
+                msg = sinon.functionName(behavior.stub) +
+                    " expected to yield, but no callback was passed.";
+            }
+
+            if (args.length > 0) {
+                msg += " Received [" + join.call(args, ", ") + "]";
+            }
+
+            return msg;
+        }
+
+        return "argument at index " + behavior.callArgAt + " is not a function: " + func;
+    }
+
+    function callCallback(behavior, args) {
+        if (typeof behavior.callArgAt == "number") {
+            var func = getCallback(behavior, args);
+
+            if (typeof func != "function") {
+                throw new TypeError(getCallbackError(behavior, func, args));
+            }
+
+            if (behavior.callbackAsync) {
+                nextTick(function() {
+                    func.apply(behavior.callbackContext, behavior.callbackArguments);
+                });
+            } else {
+                func.apply(behavior.callbackContext, behavior.callbackArguments);
+            }
+        }
+    }
+
+    proto = {
+        create: function(stub) {
+            var behavior = sinon.extend({}, sinon.behavior);
+            delete behavior.create;
+            behavior.stub = stub;
+
+            return behavior;
+        },
+
+        isPresent: function() {
+            return (typeof this.callArgAt == 'number' ||
+                    this.exception ||
+                    typeof this.returnArgAt == 'number' ||
+                    this.returnThis ||
+                    this.returnValueDefined);
+        },
+
+        invoke: function(context, args) {
+            callCallback(this, args);
+
+            if (this.exception) {
+                throw this.exception;
+            } else if (typeof this.returnArgAt == 'number') {
+                return args[this.returnArgAt];
+            } else if (this.returnThis) {
+                return context;
+            }
+
+            return this.returnValue;
+        },
+
+        onCall: function(index) {
+            return this.stub.onCall(index);
+        },
+
+        onFirstCall: function() {
+            return this.stub.onFirstCall();
+        },
+
+        onSecondCall: function() {
+            return this.stub.onSecondCall();
+        },
+
+        onThirdCall: function() {
+            return this.stub.onThirdCall();
+        },
+
+        withArgs: function(/* arguments */) {
+            throw new Error('Defining a stub by invoking "stub.onCall(...).withArgs(...)" is not supported. ' +
+                            'Use "stub.withArgs(...).onCall(...)" to define sequential behavior for calls with certain arguments.');
+        },
+
+        callsArg: function callsArg(pos) {
+            if (typeof pos != "number") {
+                throw new TypeError("argument index is not number");
+            }
+
+            this.callArgAt = pos;
+            this.callbackArguments = [];
+            this.callbackContext = undefined;
+            this.callArgProp = undefined;
+            this.callbackAsync = false;
+
+            return this;
+        },
+
+        callsArgOn: function callsArgOn(pos, context) {
+            if (typeof pos != "number") {
+                throw new TypeError("argument index is not number");
+            }
+            if (typeof context != "object") {
+                throw new TypeError("argument context is not an object");
+            }
+
+            this.callArgAt = pos;
+            this.callbackArguments = [];
+            this.callbackContext = context;
+            this.callArgProp = undefined;
+            this.callbackAsync = false;
+
+            return this;
+        },
+
+        callsArgWith: function callsArgWith(pos) {
+            if (typeof pos != "number") {
+                throw new TypeError("argument index is not number");
+            }
+
+            this.callArgAt = pos;
+            this.callbackArguments = slice.call(arguments, 1);
+            this.callbackContext = undefined;
+            this.callArgProp = undefined;
+            this.callbackAsync = false;
+
+            return this;
+        },
+
+        callsArgOnWith: function callsArgWith(pos, context) {
+            if (typeof pos != "number") {
+                throw new TypeError("argument index is not number");
+            }
+            if (typeof context != "object") {
+                throw new TypeError("argument context is not an object");
+            }
+
+            this.callArgAt = pos;
+            this.callbackArguments = slice.call(arguments, 2);
+            this.callbackContext = context;
+            this.callArgProp = undefined;
+            this.callbackAsync = false;
+
+            return this;
+        },
+
+        yields: function () {
+            this.callArgAt = -1;
+            this.callbackArguments = slice.call(arguments, 0);
+            this.callbackContext = undefined;
+            this.callArgProp = undefined;
+            this.callbackAsync = false;
+
+            return this;
+        },
+
+        yieldsOn: function (context) {
+            if (typeof context != "object") {
+                throw new TypeError("argument context is not an object");
+            }
+
+            this.callArgAt = -1;
+            this.callbackArguments = slice.call(arguments, 1);
+            this.callbackContext = context;
+            this.callArgProp = undefined;
+            this.callbackAsync = false;
+
+            return this;
+        },
+
+        yieldsTo: function (prop) {
+            this.callArgAt = -1;
+            this.callbackArguments = slice.call(arguments, 1);
+            this.callbackContext = undefined;
+            this.callArgProp = prop;
+            this.callbackAsync = false;
+
+            return this;
+        },
+
+        yieldsToOn: function (prop, context) {
+            if (typeof context != "object") {
+                throw new TypeError("argument context is not an object");
+            }
+
+            this.callArgAt = -1;
+            this.callbackArguments = slice.call(arguments, 2);
+            this.callbackContext = context;
+            this.callArgProp = prop;
+            this.callbackAsync = false;
+
+            return this;
+        },
+
+
+        "throws": throwsException,
+        throwsException: throwsException,
+
+        returns: function returns(value) {
+            this.returnValue = value;
+            this.returnValueDefined = true;
+
+            return this;
+        },
+
+        returnsArg: function returnsArg(pos) {
+            if (typeof pos != "number") {
+                throw new TypeError("argument index is not number");
+            }
+
+            this.returnArgAt = pos;
+
+            return this;
+        },
+
+        returnsThis: function returnsThis() {
+            this.returnThis = true;
+
+            return this;
+        }
+    };
+
+    // create asynchronous versions of callsArg* and yields* methods
+    for (var method in proto) {
+        // need to avoid creating anotherasync versions of the newly added async methods
+        if (proto.hasOwnProperty(method) &&
+            method.match(/^(callsArg|yields)/) &&
+            !method.match(/Async/)) {
+            proto[method + 'Async'] = (function (syncFnName) {
+                return function () {
+                    var result = this[syncFnName].apply(this, arguments);
+                    this.callbackAsync = true;
+                    return result;
+                };
+            })(method);
+        }
+    }
+
+    if (commonJSModule) {
+        module.exports = proto;
+    } else {
+        sinon.behavior = proto;
+    }
+}(typeof sinon == "object" && sinon || null));
+/**
+ * @depend ../sinon.js
+ * @depend spy.js
+ * @depend behavior.js
+ */
+/*jslint eqeqeq: false, onevar: false*/
+/*global module, require, sinon*/
+/**
+ * Stub functions
+ *
+ * @author Christian Johansen (christian@cjohansen.no)
+ * @license BSD
+ *
+ * Copyright (c) 2010-2013 Christian Johansen
+ */
+
+(function (sinon) {
+    var commonJSModule = typeof module !== 'undefined' && module.exports;
+
+    if (!sinon && commonJSModule) {
+        sinon = require("../sinon");
+    }
+
+    if (!sinon) {
+        return;
+    }
+
+    function stub(object, property, func) {
+        if (!!func && typeof func != "function") {
+            throw new TypeError("Custom stub should be function");
+        }
+
+        var wrapper;
+
+        if (func) {
+            wrapper = sinon.spy && sinon.spy.create ? sinon.spy.create(func) : func;
+        } else {
+            wrapper = stub.create();
+        }
+
+        if (!object && typeof property === "undefined") {
+            return sinon.stub.create();
+        }
+
+        if (typeof property === "undefined" && typeof object == "object") {
+            for (var prop in object) {
+                if (typeof object[prop] === "function") {
+                    stub(object, prop);
+                }
+            }
+
+            return object;
+        }
+
+        return sinon.wrapMethod(object, property, wrapper);
+    }
+
+    function getDefaultBehavior(stub) {
+        return stub.defaultBehavior || getParentBehaviour(stub) || sinon.behavior.create(stub);
+    }
+
+    function getParentBehaviour(stub) {
+        return (stub.parent && getCurrentBehavior(stub.parent));
+    }
+
+    function getCurrentBehavior(stub) {
+        var behavior = stub.behaviors[stub.callCount - 1];
+        return behavior && behavior.isPresent() ? behavior : getDefaultBehavior(stub);
+    }
+
+    var uuid = 0;
+
+    sinon.extend(stub, (function () {
+        var proto = {
+            create: function create() {
+                var functionStub = function () {
+                    return getCurrentBehavior(functionStub).invoke(this, arguments);
+                };
+
+                functionStub.id = "stub#" + uuid++;
+                var orig = functionStub;
+                functionStub = sinon.spy.create(functionStub);
+                functionStub.func = orig;
+
+                sinon.extend(functionStub, stub);
+                functionStub._create = sinon.stub.create;
+                functionStub.displayName = "stub";
+                functionStub.toString = sinon.functionToString;
+
+                functionStub.defaultBehavior = null;
+                functionStub.behaviors = [];
+
+                return functionStub;
+            },
+
+            resetBehavior: function () {
+                var i;
+
+                this.defaultBehavior = null;
+                this.behaviors = [];
+
+                delete this.returnValue;
+                delete this.returnArgAt;
+                this.returnThis = false;
+
+                if (this.fakes) {
+                    for (i = 0; i < this.fakes.length; i++) {
+                        this.fakes[i].resetBehavior();
+                    }
+                }
+            },
+
+            onCall: function(index) {
+                if (!this.behaviors[index]) {
+                    this.behaviors[index] = sinon.behavior.create(this);
+                }
+
+                return this.behaviors[index];
+            },
+
+            onFirstCall: function() {
+                return this.onCall(0);
+            },
+
+            onSecondCall: function() {
+                return this.onCall(1);
+            },
+
+            onThirdCall: function() {
+                return this.onCall(2);
+            }
+        };
+
+        for (var method in sinon.behavior) {
+            if (sinon.behavior.hasOwnProperty(method) &&
+                !proto.hasOwnProperty(method) &&
+                method != 'create' &&
+                method != 'withArgs' &&
+                method != 'invoke') {
+                proto[method] = (function(behaviorMethod) {
+                    return function() {
+                        this.defaultBehavior = this.defaultBehavior || sinon.behavior.create(this);
+                        this.defaultBehavior[behaviorMethod].apply(this.defaultBehavior, arguments);
+                        return this;
+                    };
+                }(method));
+            }
+        }
+
+        return proto;
+    }()));
+
+    if (commonJSModule) {
+        module.exports = stub;
+    } else {
+        sinon.stub = stub;
+    }
+}(typeof sinon == "object" && sinon || null));
+
+/**
+ * @depend ../sinon.js
+ * @depend stub.js
+ */
+/*jslint eqeqeq: false, onevar: false, nomen: false*/
+/*global module, require, sinon*/
+/**
+ * Mock functions.
+ *
+ * @author Christian Johansen (christian@cjohansen.no)
+ * @license BSD
+ *
+ * Copyright (c) 2010-2013 Christian Johansen
+ */
+
+(function (sinon) {
+    var commonJSModule = typeof module !== 'undefined' && module.exports;
+    var push = [].push;
+    var match;
+
+    if (!sinon && commonJSModule) {
+        sinon = require("../sinon");
+    }
+
+    if (!sinon) {
+        return;
+    }
+
+    match = sinon.match;
+
+    if (!match && commonJSModule) {
+        match = require("./match");
+    }
+
+    function mock(object) {
+        if (!object) {
+            return sinon.expectation.create("Anonymous mock");
+        }
+
+        return mock.create(object);
+    }
+
+    sinon.mock = mock;
+
+    sinon.extend(mock, (function () {
+        function each(collection, callback) {
+            if (!collection) {
+                return;
+            }
+
+            for (var i = 0, l = collection.length; i < l; i += 1) {
+                callback(collection[i]);
+            }
+        }
+
+        return {
+            create: function create(object) {
+                if (!object) {
+                    throw new TypeError("object is null");
+                }
+
+                var mockObject = sinon.extend({}, mock);
+                mockObject.object = object;
+                delete mockObject.create;
+
+                return mockObject;
+            },
+
+            expects: function expects(method) {
+                if (!method) {
+                    throw new TypeError("method is falsy");
+                }
+
+                if (!this.expectations) {
+                    this.expectations = {};
+                    this.proxies = [];
+                }
+
+                if (!this.expectations[method]) {
+                    this.expectations[method] = [];
+                    var mockObject = this;
+
+                    sinon.wrapMethod(this.object, method, function () {
+                        return mockObject.invokeMethod(method, this, arguments);
+                    });
+
+                    push.call(this.proxies, method);
+                }
+
+                var expectation = sinon.expectation.create(method);
+                push.call(this.expectations[method], expectation);
+
+                return expectation;
+            },
+
+            restore: function restore() {
+                var object = this.object;
+
+                each(this.proxies, function (proxy) {
+                    if (typeof object[proxy].restore == "function") {
+                        object[proxy].restore();
+                    }
+                });
+            },
+
+            verify: function verify() {
+                var expectations = this.expectations || {};
+                var messages = [], met = [];
+
+                each(this.proxies, function (proxy) {
+                    each(expectations[proxy], function (expectation) {
+                        if (!expectation.met()) {
+                            push.call(messages, expectation.toString());
+                        } else {
+                            push.call(met, expectation.toString());
+                        }
+                    });
+                });
+
+                this.restore();
+
+                if (messages.length > 0) {
+                    sinon.expectation.fail(messages.concat(met).join("\n"));
+                } else {
+                    sinon.expectation.pass(messages.concat(met).join("\n"));
+                }
+
+                return true;
+            },
+
+            invokeMethod: function invokeMethod(method, thisValue, args) {
+                var expectations = this.expectations && this.expectations[method];
+                var length = expectations && expectations.length || 0, i;
+
+                for (i = 0; i < length; i += 1) {
+                    if (!expectations[i].met() &&
+                        expectations[i].allowsCall(thisValue, args)) {
+                        return expectations[i].apply(thisValue, args);
+                    }
+                }
+
+                var messages = [], available, exhausted = 0;
+
+                for (i = 0; i < length; i += 1) {
+                    if (expectations[i].allowsCall(thisValue, args)) {
+                        available = available || expectations[i];
+                    } else {
+                        exhausted += 1;
+                    }
+                    push.call(messages, "    " + expectations[i].toString());
+                }
+
+                if (exhausted === 0) {
+                    return available.apply(thisValue, args);
+                }
+
+                messages.unshift("Unexpected call: " + sinon.spyCall.toString.call({
+                    proxy: method,
+                    args: args
+                }));
+
+                sinon.expectation.fail(messages.join("\n"));
+            }
+        };
+    }()));
+
+    var times = sinon.timesInWords;
+
+    sinon.expectation = (function () {
+        var slice = Array.prototype.slice;
+        var _invoke = sinon.spy.invoke;
+
+        function callCountInWords(callCount) {
+            if (callCount == 0) {
+                return "never called";
+            } else {
+                return "called " + times(callCount);
+            }
+        }
+
+        function expectedCallCountInWords(expectation) {
+            var min = expectation.minCalls;
+            var max = expectation.maxCalls;
+
+            if (typeof min == "number" && typeof max == "number") {
+                var str = times(min);
+
+                if (min != max) {
+                    str = "at least " + str + " and at most " + times(max);
+                }
+
+                return str;
+            }
+
+            if (typeof min == "number") {
+                return "at least " + times(min);
+            }
+
+            return "at most " + times(max);
+        }
+
+        function receivedMinCalls(expectation) {
+            var hasMinLimit = typeof expectation.minCalls == "number";
+            return !hasMinLimit || expectation.callCount >= expectation.minCalls;
+        }
+
+        function receivedMaxCalls(expectation) {
+            if (typeof expectation.maxCalls != "number") {
+                return false;
+            }
+
+            return expectation.callCount == expectation.maxCalls;
+        }
+
+        function verifyMatcher(possibleMatcher, arg){
+            if (match && match.isMatcher(possibleMatcher)) {
+                return possibleMatcher.test(arg);
+            } else {
+                return true;
+            }
+        }
+
+        return {
+            minCalls: 1,
+            maxCalls: 1,
+
+            create: function create(methodName) {
+                var expectation = sinon.extend(sinon.stub.create(), sinon.expectation);
+                delete expectation.create;
+                expectation.method = methodName;
+
+                return expectation;
+            },
+
+            invoke: function invoke(func, thisValue, args) {
+                this.verifyCallAllowed(thisValue, args);
+
+                return _invoke.apply(this, arguments);
+            },
+
+            atLeast: function atLeast(num) {
+                if (typeof num != "number") {
+                    throw new TypeError("'" + num + "' is not number");
+                }
+
+                if (!this.limitsSet) {
+                    this.maxCalls = null;
+                    this.limitsSet = true;
+                }
+
+                this.minCalls = num;
+
+                return this;
+            },
+
+            atMost: function atMost(num) {
+                if (typeof num != "number") {
+                    throw new TypeError("'" + num + "' is not number");
+                }
+
+                if (!this.limitsSet) {
+                    this.minCalls = null;
+                    this.limitsSet = true;
+                }
+
+                this.maxCalls = num;
+
+                return this;
+            },
+
+            never: function never() {
+                return this.exactly(0);
+            },
+
+            once: function once() {
+                return this.exactly(1);
+            },
+
+            twice: function twice() {
+                return this.exactly(2);
+            },
+
+            thrice: function thrice() {
+                return this.exactly(3);
+            },
+
+            exactly: function exactly(num) {
+                if (typeof num != "number") {
+                    throw new TypeError("'" + num + "' is not a number");
+                }
+
+                this.atLeast(num);
+                return this.atMost(num);
+            },
+
+            met: function met() {
+                return !this.failed && receivedMinCalls(this);
+            },
+
+            verifyCallAllowed: function verifyCallAllowed(thisValue, args) {
+                if (receivedMaxCalls(this)) {
+                    this.failed = true;
+                    sinon.expectation.fail(this.method + " already called " + times(this.maxCalls));
+                }
+
+                if ("expectedThis" in this && this.expectedThis !== thisValue) {
+                    sinon.expectation.fail(this.method + " called with " + thisValue + " as thisValue, expected " +
+                        this.expectedThis);
+                }
+
+                if (!("expectedArguments" in this)) {
+                    return;
+                }
+
+                if (!args) {
+                    sinon.expectation.fail(this.method + " received no arguments, expected " +
+                        sinon.format(this.expectedArguments));
+                }
+
+                if (args.length < this.expectedArguments.length) {
+                    sinon.expectation.fail(this.method + " received too few arguments (" + sinon.format(args) +
+                        "), expected " + sinon.format(this.expectedArguments));
+                }
+
+                if (this.expectsExactArgCount &&
+                    args.length != this.expectedArguments.length) {
+                    sinon.expectation.fail(this.method + " received too many arguments (" + sinon.format(args) +
+                        "), expected " + sinon.format(this.expectedArguments));
+                }
+
+                for (var i = 0, l = this.expectedArguments.length; i < l; i += 1) {
+
+                    if (!verifyMatcher(this.expectedArguments[i],args[i])) {
+                        sinon.expectation.fail(this.method + " received wrong arguments " + sinon.format(args) +
+                            ", didn't match " + this.expectedArguments.toString());
+                    }
+
+                    if (!sinon.deepEqual(this.expectedArguments[i], args[i])) {
+                        sinon.expectation.fail(this.method + " received wrong arguments " + sinon.format(args) +
+                            ", expected " + sinon.format(this.expectedArguments));
+                    }
+                }
+            },
+
+            allowsCall: function allowsCall(thisValue, args) {
+                if (this.met() && receivedMaxCalls(this)) {
+                    return false;
+                }
+
+                if ("expectedThis" in this && this.expectedThis !== thisValue) {
+                    return false;
+                }
+
+                if (!("expectedArguments" in this)) {
+                    return true;
+                }
+
+                args = args || [];
+
+                if (args.length < this.expectedArguments.length) {
+                    return false;
+                }
+
+                if (this.expectsExactArgCount &&
+                    args.length != this.expectedArguments.length) {
+                    return false;
+                }
+
+                for (var i = 0, l = this.expectedArguments.length; i < l; i += 1) {
+                    if (!verifyMatcher(this.expectedArguments[i],args[i])) {
+                        return false;
+                    }
+
+                    if (!sinon.deepEqual(this.expectedArguments[i], args[i])) {
+                        return false;
+                    }
+                }
+
+                return true;
+            },
+
+            withArgs: function withArgs() {
+                this.expectedArguments = slice.call(arguments);
+                return this;
+            },
+
+            withExactArgs: function withExactArgs() {
+                this.withArgs.apply(this, arguments);
+                this.expectsExactArgCount = true;
+                return this;
+            },
+
+            on: function on(thisValue) {
+                this.expectedThis = thisValue;
+                return this;
+            },
+
+            toString: function () {
+                var args = (this.expectedArguments || []).slice();
+
+                if (!this.expectsExactArgCount) {
+                    push.call(args, "[...]");
+                }
+
+                var callStr = sinon.spyCall.toString.call({
+                    proxy: this.method || "anonymous mock expectation",
+                    args: args
+                });
+
+                var message = callStr.replace(", [...", "[, ...") + " " +
+                    expectedCallCountInWords(this);
+
+                if (this.met()) {
+                    return "Expectation met: " + message;
+                }
+
+                return "Expected " + message + " (" +
+                    callCountInWords(this.callCount) + ")";
+            },
+
+            verify: function verify() {
+                if (!this.met()) {
+                    sinon.expectation.fail(this.toString());
+                } else {
+                    sinon.expectation.pass(this.toString());
+                }
+
+                return true;
+            },
+
+            pass: function(message) {
+              sinon.assert.pass(message);
+            },
+            fail: function (message) {
+                var exception = new Error(message);
+                exception.name = "ExpectationError";
+
+                throw exception;
+            }
+        };
+    }());
+
+    if (commonJSModule) {
+        module.exports = mock;
+    } else {
+        sinon.mock = mock;
+    }
+}(typeof sinon == "object" && sinon || null));
+
+/**
+ * @depend ../sinon.js
+ * @depend stub.js
+ * @depend mock.js
+ */
+/*jslint eqeqeq: false, onevar: false, forin: true*/
+/*global module, require, sinon*/
+/**
+ * Collections of stubs, spies and mocks.
+ *
+ * @author Christian Johansen (christian@cjohansen.no)
+ * @license BSD
+ *
+ * Copyright (c) 2010-2013 Christian Johansen
+ */
+
+(function (sinon) {
+    var commonJSModule = typeof module !== 'undefined' && module.exports;
+    var push = [].push;
+    var hasOwnProperty = Object.prototype.hasOwnProperty;
+
+    if (!sinon && commonJSModule) {
+        sinon = require("../sinon");
+    }
+
+    if (!sinon) {
+        return;
+    }
+
+    function getFakes(fakeCollection) {
+        if (!fakeCollection.fakes) {
+            fakeCollection.fakes = [];
+        }
+
+        return fakeCollection.fakes;
+    }
+
+    function each(fakeCollection, method) {
+        var fakes = getFakes(fakeCollection);
+
+        for (var i = 0, l = fakes.length; i < l; i += 1) {
+            if (typeof fakes[i][method] == "function") {
+                fakes[i][method]();
+            }
+        }
+    }
+
+    function compact(fakeCollection) {
+        var fakes = getFakes(fakeCollection);
+        var i = 0;
+        while (i < fakes.length) {
+          fakes.splice(i, 1);
+        }
+    }
+
+    var collection = {
+        verify: function resolve() {
+            each(this, "verify");
+        },
+
+        restore: function restore() {
+            each(this, "restore");
+            compact(this);
+        },
+
+        verifyAndRestore: function verifyAndRestore() {
+            var exception;
+
+            try {
+                this.verify();
+            } catch (e) {
+                exception = e;
+            }
+
+            this.restore();
+
+            if (exception) {
+                throw exception;
+            }
+        },
+
+        add: function add(fake) {
+            push.call(getFakes(this), fake);
+            return fake;
+        },
+
+        spy: function spy() {
+            return this.add(sinon.spy.apply(sinon, arguments));
+        },
+
+        stub: function stub(object, property, value) {
+            if (property) {
+                var original = object[property];
+
+                if (typeof original != "function") {
+                    if (!hasOwnProperty.call(object, property)) {
+                        throw new TypeError("Cannot stub non-existent own property " + property);
+                    }
+
+                    object[property] = value;
+
+                    return this.add({
+                        restore: function () {
+                            object[property] = original;
+                        }
+                    });
+                }
+            }
+            if (!property && !!object && typeof object == "object") {
+                var stubbedObj = sinon.stub.apply(sinon, arguments);
+
+                for (var prop in stubbedObj) {
+                    if (typeof stubbedObj[prop] === "function") {
+                        this.add(stubbedObj[prop]);
+                    }
+                }
+
+                return stubbedObj;
+            }
+
+            return this.add(sinon.stub.apply(sinon, arguments));
+        },
+
+        mock: function mock() {
+            return this.add(sinon.mock.apply(sinon, arguments));
+        },
+
+        inject: function inject(obj) {
+            var col = this;
+
+            obj.spy = function () {
+                return col.spy.apply(col, arguments);
+            };
+
+            obj.stub = function () {
+                return col.stub.apply(col, arguments);
+            };
+
+            obj.mock = function () {
+                return col.mock.apply(col, arguments);
+            };
+
+            return obj;
+        }
+    };
+
+    if (commonJSModule) {
+        module.exports = collection;
+    } else {
+        sinon.collection = collection;
+    }
+}(typeof sinon == "object" && sinon || null));
+
+/*jslint eqeqeq: false, plusplus: false, evil: true, onevar: false, browser: true, forin: false*/
+/*global module, require, window*/
+/**
+ * Fake timer API
+ * setTimeout
+ * setInterval
+ * clearTimeout
+ * clearInterval
+ * tick
+ * reset
+ * Date
+ *
+ * Inspired by jsUnitMockTimeOut from JsUnit
+ *
+ * @author Christian Johansen (christian@cjohansen.no)
+ * @license BSD
+ *
+ * Copyright (c) 2010-2013 Christian Johansen
+ */
+
+if (typeof sinon == "undefined") {
+    var sinon = {};
+}
+
+(function (global) {
+    var id = 1;
+
+    function addTimer(args, recurring) {
+        if (args.length === 0) {
+            throw new Error("Function requires at least 1 parameter");
+        }
+
+        if (typeof args[0] === "undefined") {
+            throw new Error("Callback must be provided to timer calls");
+        }
+
+        var toId = id++;
+        var delay = args[1] || 0;
+
+        if (!this.timeouts) {
+            this.timeouts = {};
+        }
+
+        this.timeouts[toId] = {
+            id: toId,
+            func: args[0],
+            callAt: this.now + delay,
+            invokeArgs: Array.prototype.slice.call(args, 2)
+        };
+
+        if (recurring === true) {
+            this.timeouts[toId].interval = delay;
+        }
+
+        return toId;
+    }
+
+    function parseTime(str) {
+        if (!str) {
+            return 0;
+        }
+
+        var strings = str.split(":");
+        var l = strings.length, i = l;
+        var ms = 0, parsed;
+
+        if (l > 3 || !/^(\d\d:){0,2}\d\d?$/.test(str)) {
+            throw new Error("tick only understands numbers and 'h:m:s'");
+        }
+
+        while (i--) {
+            parsed = parseInt(strings[i], 10);
+
+            if (parsed >= 60) {
+                throw new Error("Invalid time " + str);
+            }
+
+            ms += parsed * Math.pow(60, (l - i - 1));
+        }
+
+        return ms * 1000;
+    }
+
+    function createObject(object) {
+        var newObject;
+
+        if (Object.create) {
+            newObject = Object.create(object);
+        } else {
+            var F = function () {};
+            F.prototype = object;
+            newObject = new F();
+        }
+
+        newObject.Date.clock = newObject;
+        return newObject;
+    }
+
+    sinon.clock = {
+        now: 0,
+
+        create: function create(now) {
+            var clock = createObject(this);
+
+            if (typeof now == "number") {
+                clock.now = now;
+            }
+
+            if (!!now && typeof now == "object") {
+                throw new TypeError("now should be milliseconds since UNIX epoch");
+            }
+
+            return clock;
+        },
+
+        setTimeout: function setTimeout(callback, timeout) {
+            return addTimer.call(this, arguments, false);
+        },
+
+        clearTimeout: function clearTimeout(timerId) {
+            if (!this.timeouts) {
+                this.timeouts = [];
+            }
+
+            if (timerId in this.timeouts) {
+                delete this.timeouts[timerId];
+            }
+        },
+
+        setInterval: function setInterval(callback, timeout) {
+            return addTimer.call(this, arguments, true);
+        },
+
+        clearInterval: function clearInterval(timerId) {
+            this.clearTimeout(timerId);
+        },
+
+        setImmediate: function setImmediate(callback) {
+            var passThruArgs = Array.prototype.slice.call(arguments, 1);
+
+            return addTimer.call(this, [callback, 0].concat(passThruArgs), false);
+        },
+
+        clearImmediate: function clearImmediate(timerId) {
+            this.clearTimeout(timerId);
+        },
+
+        tick: function tick(ms) {
+            ms = typeof ms == "number" ? ms : parseTime(ms);
+            var tickFrom = this.now, tickTo = this.now + ms, previous = this.now;
+            var timer = this.firstTimerInRange(tickFrom, tickTo);
+
+            var firstException;
+            while (timer && tickFrom <= tickTo) {
+                if (this.timeouts[timer.id]) {
+                    tickFrom = this.now = timer.callAt;
+                    try {
+                      this.callTimer(timer);
+                    } catch (e) {
+                      firstException = firstException || e;
+                    }
+                }
+
+                timer = this.firstTimerInRange(previous, tickTo);
+                previous = tickFrom;
+            }
+
+            this.now = tickTo;
+
+            if (firstException) {
+              throw firstException;
+            }
+
+            return this.now;
+        },
+
+        firstTimerInRange: function (from, to) {
+            var timer, smallest = null, originalTimer;
+
+            for (var id in this.timeouts) {
+                if (this.timeouts.hasOwnProperty(id)) {
+                    if (this.timeouts[id].callAt < from || this.timeouts[id].callAt > to) {
+                        continue;
+                    }
+
+                    if (smallest === null || this.timeouts[id].callAt < smallest) {
+                        originalTimer = this.timeouts[id];
+                        smallest = this.timeouts[id].callAt;
+
+                        timer = {
+                            func: this.timeouts[id].func,
+                            callAt: this.timeouts[id].callAt,
+                            interval: this.timeouts[id].interval,
+                            id: this.timeouts[id].id,
+                            invokeArgs: this.timeouts[id].invokeArgs
+                        };
+                    }
+                }
+            }
+
+            return timer || null;
+        },
+
+        callTimer: function (timer) {
+            if (typeof timer.interval == "number") {
+                this.timeouts[timer.id].callAt += timer.interval;
+            } else {
+                delete this.timeouts[timer.id];
+            }
+
+            try {
+                if (typeof timer.func == "function") {
+                    timer.func.apply(null, timer.invokeArgs);
+                } else {
+                    eval(timer.func);
+                }
+            } catch (e) {
+              var exception = e;
+            }
+
+            if (!this.timeouts[timer.id]) {
+                if (exception) {
+                  throw exception;
+                }
+                return;
+            }
+
+            if (exception) {
+              throw exception;
+            }
+        },
+
+        reset: function reset() {
+            this.timeouts = {};
+        },
+
+        Date: (function () {
+            var NativeDate = Date;
+
+            function ClockDate(year, month, date, hour, minute, second, ms) {
+                // Defensive and verbose to avoid potential harm in passing
+                // explicit undefined when user does not pass argument
+                switch (arguments.length) {
+                case 0:
+                    return new NativeDate(ClockDate.clock.now);
+                case 1:
+                    return new NativeDate(year);
+                case 2:
+                    return new NativeDate(year, month);
+                case 3:
+                    return new NativeDate(year, month, date);
+                case 4:
+                    return new NativeDate(year, month, date, hour);
+                case 5:
+                    return new NativeDate(year, month, date, hour, minute);
+                case 6:
+                    return new NativeDate(year, month, date, hour, minute, second);
+                default:
+                    return new NativeDate(year, month, date, hour, minute, second, ms);
+                }
+            }
+
+            return mirrorDateProperties(ClockDate, NativeDate);
+        }())
+    };
+
+    function mirrorDateProperties(target, source) {
+        if (source.now) {
+            target.now = function now() {
+                return target.clock.now;
+            };
+        } else {
+            delete target.now;
+        }
+
+        if (source.toSource) {
+            target.toSource = function toSource() {
+                return source.toSource();
+            };
+        } else {
+            delete target.toSource;
+        }
+
+        target.toString = function toString() {
+            return source.toString();
+        };
+
+        target.prototype = source.prototype;
+        target.parse = source.parse;
+        target.UTC = source.UTC;
+        target.prototype.toUTCString = source.prototype.toUTCString;
+
+        for (var prop in source) {
+            if (source.hasOwnProperty(prop)) {
+                target[prop] = source[prop];
+            }
+        }
+
+        return target;
+    }
+
+    var methods = ["Date", "setTimeout", "setInterval",
+                   "clearTimeout", "clearInterval"];
+
+    if (typeof global.setImmediate !== "undefined") {
+        methods.push("setImmediate");
+    }
+
+    if (typeof global.clearImmediate !== "undefined") {
+        methods.push("clearImmediate");
+    }
+
+    function restore() {
+        var method;
+
+        for (var i = 0, l = this.methods.length; i < l; i++) {
+            method = this.methods[i];
+
+            if (global[method].hadOwnProperty) {
+                global[method] = this["_" + method];
+            } else {
+                try {
+                    delete global[method];
+                } catch (e) {}
+            }
+        }
+
+        // Prevent multiple executions which will completely remove these props
+        this.methods = [];
+    }
+
+    function stubGlobal(method, clock) {
+        clock[method].hadOwnProperty = Object.prototype.hasOwnProperty.call(global, method);
+        clock["_" + method] = global[method];
+
+        if (method == "Date") {
+            var date = mirrorDateProperties(clock[method], global[method]);
+            global[method] = date;
+        } else {
+            global[method] = function () {
+                return clock[method].apply(clock, arguments);
+            };
+
+            for (var prop in clock[method]) {
+                if (clock[method].hasOwnProperty(prop)) {
+                    global[method][prop] = clock[method][prop];
+                }
+            }
+        }
+
+        global[method].clock = clock;
+    }
+
+    sinon.useFakeTimers = function useFakeTimers(now) {
+        var clock = sinon.clock.create(now);
+        clock.restore = restore;
+        clock.methods = Array.prototype.slice.call(arguments,
+                                                   typeof now == "number" ? 1 : 0);
+
+        if (clock.methods.length === 0) {
+            clock.methods = methods;
+        }
+
+        for (var i = 0, l = clock.methods.length; i < l; i++) {
+            stubGlobal(clock.methods[i], clock);
+        }
+
+        return clock;
+    };
+}(typeof global != "undefined" && typeof global !== "function" ? global : this));
+
+sinon.timers = {
+    setTimeout: setTimeout,
+    clearTimeout: clearTimeout,
+    setImmediate: (typeof setImmediate !== "undefined" ? setImmediate : undefined),
+    clearImmediate: (typeof clearImmediate !== "undefined" ? clearImmediate: undefined),
+    setInterval: setInterval,
+    clearInterval: clearInterval,
+    Date: Date
+};
+
+if (typeof module !== 'undefined' && module.exports) {
+    module.exports = sinon;
+}
+
+/*jslint eqeqeq: false, onevar: false*/
+/*global sinon, module, require, ActiveXObject, XMLHttpRequest, DOMParser*/
+/**
+ * Minimal Event interface implementation
+ *
+ * Original implementation by Sven Fuchs: https://gist.github.com/995028
+ * Modifications and tests by Christian Johansen.
+ *
+ * @author Sven Fuchs (svenfuchs@artweb-design.de)
+ * @author Christian Johansen (christian@cjohansen.no)
+ * @license BSD
+ *
+ * Copyright (c) 2011 Sven Fuchs, Christian Johansen
+ */
+
+if (typeof sinon == "undefined") {
+    this.sinon = {};
+}
+
+(function () {
+    var push = [].push;
+
+    sinon.Event = function Event(type, bubbles, cancelable, target) {
+        this.initEvent(type, bubbles, cancelable, target);
+    };
+
+    sinon.Event.prototype = {
+        initEvent: function(type, bubbles, cancelable, target) {
+            this.type = type;
+            this.bubbles = bubbles;
+            this.cancelable = cancelable;
+            this.target = target;
+        },
+
+        stopPropagation: function () {},
+
+        preventDefault: function () {
+            this.defaultPrevented = true;
+        }
+    };
+
+    sinon.ProgressEvent = function ProgressEvent(type, progressEventRaw, target) {
+        this.initEvent(type, false, false, target);
+        this.loaded = progressEventRaw.loaded || null;
+        this.total = progressEventRaw.total || null;
+    };
+
+    sinon.ProgressEvent.prototype = new sinon.Event();
+
+    sinon.ProgressEvent.prototype.constructor =  sinon.ProgressEvent;
+
+    sinon.CustomEvent = function CustomEvent(type, customData, target) {
+        this.initEvent(type, false, false, target);
+        this.detail = customData.detail || null;
+    };
+
+    sinon.CustomEvent.prototype = new sinon.Event();
+
+    sinon.CustomEvent.prototype.constructor =  sinon.CustomEvent;
+
+    sinon.EventTarget = {
+        addEventListener: function addEventListener(event, listener) {
+            this.eventListeners = this.eventListeners || {};
+            this.eventListeners[event] = this.eventListeners[event] || [];
+            push.call(this.eventListeners[event], listener);
+        },
+
+        removeEventListener: function removeEventListener(event, listener) {
+            var listeners = this.eventListeners && this.eventListeners[event] || [];
+
+            for (var i = 0, l = listeners.length; i < l; ++i) {
+                if (listeners[i] == listener) {
+                    return listeners.splice(i, 1);
+                }
+            }
+        },
+
+        dispatchEvent: function dispatchEvent(event) {
+            var type = event.type;
+            var listeners = this.eventListeners && this.eventListeners[type] || [];
+
+            for (var i = 0; i < listeners.length; i++) {
+                if (typeof listeners[i] == "function") {
+                    listeners[i].call(this, event);
+                } else {
+                    listeners[i].handleEvent(event);
+                }
+            }
+
+            return !!event.defaultPrevented;
+        }
+    };
+}());
+
+/**
+ * @depend ../../sinon.js
+ * @depend event.js
+ */
+/*jslint eqeqeq: false, onevar: false*/
+/*global sinon, module, require, ActiveXObject, XMLHttpRequest, DOMParser*/
+/**
+ * Fake XMLHttpRequest object
+ *
+ * @author Christian Johansen (christian@cjohansen.no)
+ * @license BSD
+ *
+ * Copyright (c) 2010-2013 Christian Johansen
+ */
+
+// wrapper for global
+(function(global) {
+    if (typeof sinon === "undefined") {
+        global.sinon = {};
+    }
+
+    var supportsProgress = typeof ProgressEvent !== "undefined";
+    var supportsCustomEvent = typeof CustomEvent !== "undefined";
+    sinon.xhr = { XMLHttpRequest: global.XMLHttpRequest };
+    var xhr = sinon.xhr;
+    xhr.GlobalXMLHttpRequest = global.XMLHttpRequest;
+    xhr.GlobalActiveXObject = global.ActiveXObject;
+    xhr.supportsActiveX = typeof xhr.GlobalActiveXObject != "undefined";
+    xhr.supportsXHR = typeof xhr.GlobalXMLHttpRequest != "undefined";
+    xhr.workingXHR = xhr.supportsXHR ? xhr.GlobalXMLHttpRequest : xhr.supportsActiveX
+                                     ? function() { return new xhr.GlobalActiveXObject("MSXML2.XMLHTTP.3.0") } : false;
+    xhr.supportsCORS = 'withCredentials' in (new sinon.xhr.GlobalXMLHttpRequest());
+
+    /*jsl:ignore*/
+    var unsafeHeaders = {
+        "Accept-Charset": true,
+        "Accept-Encoding": true,
+        "Connection": true,
+        "Content-Length": true,
+        "Cookie": true,
+        "Cookie2": true,
+        "Content-Transfer-Encoding": true,
+        "Date": true,
+        "Expect": true,
+        "Host": true,
+        "Keep-Alive": true,
+        "Referer": true,
+        "TE": true,
+        "Trailer": true,
+        "Transfer-Encoding": true,
+        "Upgrade": true,
+        "User-Agent": true,
+        "Via": true
+    };
+    /*jsl:end*/
+
+    function FakeXMLHttpRequest() {
+        this.readyState = FakeXMLHttpRequest.UNSENT;
+        this.requestHeaders = {};
+        this.requestBody = null;
+        this.status = 0;
+        this.statusText = "";
+        this.upload = new UploadProgress();
+        if (sinon.xhr.supportsCORS) {
+            this.withCredentials = false;
+        }
+
+
+        var xhr = this;
+        var events = ["loadstart", "load", "abort", "loadend"];
+
+        function addEventListener(eventName) {
+            xhr.addEventListener(eventName, function (event) {
+                var listener = xhr["on" + eventName];
+
+                if (listener && typeof listener == "function") {
+                    listener.call(this, event);
+                }
+            });
+        }
+
+        for (var i = events.length - 1; i >= 0; i--) {
+            addEventListener(events[i]);
+        }
+
+        if (typeof FakeXMLHttpRequest.onCreate == "function") {
+            FakeXMLHttpRequest.onCreate(this);
+        }
+    }
+
+    // An upload object is created for each
+    // FakeXMLHttpRequest and allows upload
+    // events to be simulated using uploadProgress
+    // and uploadError.
+    function UploadProgress() {
+        this.eventListeners = {
+            "progress": [],
+            "load": [],
+            "abort": [],
+            "error": []
+        }
+    }
+
+    UploadProgress.prototype.addEventListener = function(event, listener) {
+        this.eventListeners[event].push(listener);
+    };
+
+    UploadProgress.prototype.removeEventListener = function(event, listener) {
+        var listeners = this.eventListeners[event] || [];
+
+        for (var i = 0, l = listeners.length; i < l; ++i) {
+            if (listeners[i] == listener) {
+                return listeners.splice(i, 1);
+            }
+        }
+    };
+
+    UploadProgress.prototype.dispatchEvent = function(event) {
+        var listeners = this.eventListeners[event.type] || [];
+
+        for (var i = 0, listener; (listener = listeners[i]) != null; i++) {
+            listener(event);
+        }
+    };
+
+    function verifyState(xhr) {
+        if (xhr.readyState !== FakeXMLHttpRequest.OPENED) {
+            throw new Error("INVALID_STATE_ERR");
+        }
+
+        if (xhr.sendFlag) {
+            throw new Error("INVALID_STATE_ERR");
+        }
+    }
+
+    // filtering to enable a white-list version of Sinon FakeXhr,
+    // where whitelisted requests are passed through to real XHR
+    function each(collection, callback) {
+        if (!collection) return;
+        for (var i = 0, l = collection.length; i < l; i += 1) {
+            callback(collection[i]);
+        }
+    }
+    function some(collection, callback) {
+        for (var index = 0; index < collection.length; index++) {
+            if(callback(collection[index]) === true) return true;
+        }
+        return false;
+    }
+    // largest arity in XHR is 5 - XHR#open
+    var apply = function(obj,method,args) {
+        switch(args.length) {
+        case 0: return obj[method]();
+        case 1: return obj[method](args[0]);
+        case 2: return obj[method](args[0],args[1]);
+        case 3: return obj[method](args[0],args[1],args[2]);
+        case 4: return obj[method](args[0],args[1],args[2],args[3]);
+        case 5: return obj[method](args[0],args[1],args[2],args[3],args[4]);
+        }
+    };
+
+    FakeXMLHttpRequest.filters = [];
+    FakeXMLHttpRequest.addFilter = function(fn) {
+        this.filters.push(fn)
+    };
+    var IE6Re = /MSIE 6/;
+    FakeXMLHttpRequest.defake = function(fakeXhr,xhrArgs) {
+        var xhr = new sinon.xhr.workingXHR();
+        each(["open","setRequestHeader","send","abort","getResponseHeader",
+              "getAllResponseHeaders","addEventListener","overrideMimeType","removeEventListener"],
+             function(method) {
+                 fakeXhr[method] = function() {
+                   return apply(xhr,method,arguments);
+                 };
+             });
+
+        var copyAttrs = function(args) {
+            each(args, function(attr) {
+              try {
+                fakeXhr[attr] = xhr[attr]
+              } catch(e) {
+                if(!IE6Re.test(navigator.userAgent)) throw e;
+              }
+            });
+        };
+
+        var stateChange = function() {
+            fakeXhr.readyState = xhr.readyState;
+            if(xhr.readyState >= FakeXMLHttpRequest.HEADERS_RECEIVED) {
+                copyAttrs(["status","statusText"]);
+            }
+            if(xhr.readyState >= FakeXMLHttpRequest.LOADING) {
+                copyAttrs(["responseText"]);
+            }
+            if(xhr.readyState === FakeXMLHttpRequest.DONE) {
+                copyAttrs(["responseXML"]);
+            }
+            if(fakeXhr.onreadystatechange) fakeXhr.onreadystatechange.call(fakeXhr, { target: fakeXhr });
+        };
+        if(xhr.addEventListener) {
+          for(var event in fakeXhr.eventListeners) {
+              if(fakeXhr.eventListeners.hasOwnProperty(event)) {
+                  each(fakeXhr.eventListeners[event],function(handler) {
+                      xhr.addEventListener(event, handler);
+                  });
+              }
+          }
+          xhr.addEventListener("readystatechange",stateChange);
+        } else {
+          xhr.onreadystatechange = stateChange;
+        }
+        apply(xhr,"open",xhrArgs);
+    };
+    FakeXMLHttpRequest.useFilters = false;
+
+    function verifyRequestOpened(xhr) {
+        if (xhr.readyState != FakeXMLHttpRequest.OPENED) {
+            throw new Error("INVALID_STATE_ERR - " + xhr.readyState);
+        }
+    }
+
+    function verifyRequestSent(xhr) {
+        if (xhr.readyState == FakeXMLHttpRequest.DONE) {
+            throw new Error("Request done");
+        }
+    }
+
+    function verifyHeadersReceived(xhr) {
+        if (xhr.async && xhr.readyState != FakeXMLHttpRequest.HEADERS_RECEIVED) {
+            throw new Error("No headers received");
+        }
+    }
+
+    function verifyResponseBodyType(body) {
+        if (typeof body != "string") {
+            var error = new Error("Attempted to respond to fake XMLHttpRequest with " +
+                                 body + ", which is not a string.");
+            error.name = "InvalidBodyException";
+            throw error;
+        }
+    }
+
+    sinon.extend(FakeXMLHttpRequest.prototype, sinon.EventTarget, {
+        async: true,
+
+        open: function open(method, url, async, username, password) {
+            this.method = method;
+            this.url = url;
+            this.async = typeof async == "boolean" ? async : true;
+            this.username = username;
+            this.password = password;
+            this.responseText = null;
+            this.responseXML = null;
+            this.requestHeaders = {};
+            this.sendFlag = false;
+            if(sinon.FakeXMLHttpRequest.useFilters === true) {
+                var xhrArgs = arguments;
+                var defake = some(FakeXMLHttpRequest.filters,function(filter) {
+                    return filter.apply(this,xhrArgs)
+                });
+                if (defake) {
+                  return sinon.FakeXMLHttpRequest.defake(this,arguments);
+                }
+            }
+            this.readyStateChange(FakeXMLHttpRequest.OPENED);
+        },
+
+        readyStateChange: function readyStateChange(state) {
+            this.readyState = state;
+
+            if (typeof this.onreadystatechange == "function") {
+                try {
+                    this.onreadystatechange();
+                } catch (e) {
+                    sinon.logError("Fake XHR onreadystatechange handler", e);
+                }
+            }
+
+            this.dispatchEvent(new sinon.Event("readystatechange"));
+
+            switch (this.readyState) {
+                case FakeXMLHttpRequest.DONE:
+                    this.dispatchEvent(new sinon.Event("load", false, false, this));
+                    this.dispatchEvent(new sinon.Event("loadend", false, false, this));
+                    this.upload.dispatchEvent(new sinon.Event("load", false, false, this));
+                    if (supportsProgress) {
+                        this.upload.dispatchEvent(new sinon.ProgressEvent('progress', {loaded: 100, total: 100}));
+                    }
+                    break;
+            }
+        },
+
+        setRequestHeader: function setRequestHeader(header, value) {
+            verifyState(this);
+
+            if (unsafeHeaders[header] || /^(Sec-|Proxy-)/.test(header)) {
+                throw new Error("Refused to set unsafe header \"" + header + "\"");
+            }
+
+            if (this.requestHeaders[header]) {
+                this.requestHeaders[header] += "," + value;
+            } else {
+                this.requestHeaders[header] = value;
+            }
+        },
+
+        // Helps testing
+        setResponseHeaders: function setResponseHeaders(headers) {
+            verifyRequestOpened(this);
+            this.responseHeaders = {};
+
+            for (var header in headers) {
+                if (headers.hasOwnProperty(header)) {
+                    this.responseHeaders[header] = headers[header];
+                }
+            }
+
+            if (this.async) {
+                this.readyStateChange(FakeXMLHttpRequest.HEADERS_RECEIVED);
+            } else {
+                this.readyState = FakeXMLHttpRequest.HEADERS_RECEIVED;
+            }
+        },
+
+        // Currently treats ALL data as a DOMString (i.e. no Document)
+        send: function send(data) {
+            verifyState(this);
+
+            if (!/^(get|head)$/i.test(this.method)) {
+                if (this.requestHeaders["Content-Type"]) {
+                    var value = this.requestHeaders["Content-Type"].split(";");
+                    this.requestHeaders["Content-Type"] = value[0] + ";charset=utf-8";
+                } else {
+                    this.requestHeaders["Content-Type"] = "text/plain;charset=utf-8";
+                }
+
+                this.requestBody = data;
+            }
+
+            this.errorFlag = false;
+            this.sendFlag = this.async;
+            this.readyStateChange(FakeXMLHttpRequest.OPENED);
+
+            if (typeof this.onSend == "function") {
+                this.onSend(this);
+            }
+
+            this.dispatchEvent(new sinon.Event("loadstart", false, false, this));
+        },
+
+        abort: function abort() {
+            this.aborted = true;
+            this.responseText = null;
+            this.errorFlag = true;
+            this.requestHeaders = {};
+
+            if (this.readyState > sinon.FakeXMLHttpRequest.UNSENT && this.sendFlag) {
+                this.readyStateChange(sinon.FakeXMLHttpRequest.DONE);
+                this.sendFlag = false;
+            }
+
+            this.readyState = sinon.FakeXMLHttpRequest.UNSENT;
+
+            this.dispatchEvent(new sinon.Event("abort", false, false, this));
+
+            this.upload.dispatchEvent(new sinon.Event("abort", false, false, this));
+
+            if (typeof this.onerror === "function") {
+                this.onerror();
+            }
+        },
+
+        getResponseHeader: function getResponseHeader(header) {
+            if (this.readyState < FakeXMLHttpRequest.HEADERS_RECEIVED) {
+                return null;
+            }
+
+            if (/^Set-Cookie2?$/i.test(header)) {
+                return null;
+            }
+
+            header = header.toLowerCase();
+
+            for (var h in this.responseHeaders) {
+                if (h.toLowerCase() == header) {
+                    return this.responseHeaders[h];
+                }
+            }
+
+            return null;
+        },
+
+        getAllResponseHeaders: function getAllResponseHeaders() {
+            if (this.readyState < FakeXMLHttpRequest.HEADERS_RECEIVED) {
+                return "";
+            }
+
+            var headers = "";
+
+            for (var header in this.responseHeaders) {
+                if (this.responseHeaders.hasOwnProperty(header) &&
+                    !/^Set-Cookie2?$/i.test(header)) {
+                    headers += header + ": " + this.responseHeaders[header] + "\r\n";
+                }
+            }
+
+            return headers;
+        },
+
+        setResponseBody: function setResponseBody(body) {
+            verifyRequestSent(this);
+            verifyHeadersReceived(this);
+            verifyResponseBodyType(body);
+
+            var chunkSize = this.chunkSize || 10;
+            var index = 0;
+            this.responseText = "";
+
+            do {
+                if (this.async) {
+                    this.readyStateChange(FakeXMLHttpRequest.LOADING);
+                }
+
+                this.responseText += body.substring(index, index + chunkSize);
+                index += chunkSize;
+            } while (index < body.length);
+
+            var type = this.getResponseHeader("Content-Type");
+
+            if (this.responseText &&
+                (!type || /(text\/xml)|(application\/xml)|(\+xml)/.test(type))) {
+                try {
+                    this.responseXML = FakeXMLHttpRequest.parseXML(this.responseText);
+                } catch (e) {
+                    // Unable to parse XML - no biggie
+                }
+            }
+
+            if (this.async) {
+                this.readyStateChange(FakeXMLHttpRequest.DONE);
+            } else {
+                this.readyState = FakeXMLHttpRequest.DONE;
+            }
+        },
+
+        respond: function respond(status, headers, body) {
+            this.status = typeof status == "number" ? status : 200;
+            this.statusText = FakeXMLHttpRequest.statusCodes[this.status];
+            this.setResponseHeaders(headers || {});
+            this.setResponseBody(body || "");
+        },
+
+        uploadProgress: function uploadProgress(progressEventRaw) {
+            if (supportsProgress) {
+                this.upload.dispatchEvent(new sinon.ProgressEvent("progress", progressEventRaw));
+            }
+        },
+
+        uploadError: function uploadError(error) {
+            if (supportsCustomEvent) {
+                this.upload.dispatchEvent(new sinon.CustomEvent("error", {"detail": error}));
+            }
+        }
+    });
+
+    sinon.extend(FakeXMLHttpRequest, {
+        UNSENT: 0,
+        OPENED: 1,
+        HEADERS_RECEIVED: 2,
+        LOADING: 3,
+        DONE: 4
+    });
+
+    // Borrowed from JSpec
+    FakeXMLHttpRequest.parseXML = function parseXML(text) {
+        var xmlDoc;
+
+        if (typeof DOMParser != "undefined") {
+            var parser = new DOMParser();
+            xmlDoc = parser.parseFromString(text, "text/xml");
+        } else {
+            xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
+            xmlDoc.async = "false";
+            xmlDoc.loadXML(text);
+        }
+
+        return xmlDoc;
+    };
+
+    FakeXMLHttpRequest.statusCodes = {
+        100: "Continue",
+        101: "Switching Protocols",
+        200: "OK",
+        201: "Created",
+        202: "Accepted",
+        203: "Non-Authoritative Information",
+        204: "No Content",
+        205: "Reset Content",
+        206: "Partial Content",
+        300: "Multiple Choice",
+        301: "Moved Permanently",
+        302: "Found",
+        303: "See Other",
+        304: "Not Modified",
+        305: "Use Proxy",
+        307: "Temporary Redirect",
+        400: "Bad Request",
+        401: "Unauthorized",
+        402: "Payment Required",
+        403: "Forbidden",
+        404: "Not Found",
+        405: "Method Not Allowed",
+        406: "Not Acceptable",
+        407: "Proxy Authentication Required",
+        408: "Request Timeout",
+        409: "Conflict",
+        410: "Gone",
+        411: "Length Required",
+        412: "Precondition Failed",
+        413: "Request Entity Too Large",
+        414: "Request-URI Too Long",
+        415: "Unsupported Media Type",
+        416: "Requested Range Not Satisfiable",
+        417: "Expectation Failed",
+        422: "Unprocessable Entity",
+        500: "Internal Server Error",
+        501: "Not Implemented",
+        502: "Bad Gateway",
+        503: "Service Unavailable",
+        504: "Gateway Timeout",
+        505: "HTTP Version Not Supported"
+    };
+
+    sinon.useFakeXMLHttpRequest = function () {
+        sinon.FakeXMLHttpRequest.restore = function restore(keepOnCreate) {
+            if (xhr.supportsXHR) {
+                global.XMLHttpRequest = xhr.GlobalXMLHttpRequest;
+            }
+
+            if (xhr.supportsActiveX) {
+                global.ActiveXObject = xhr.GlobalActiveXObject;
+            }
+
+            delete sinon.FakeXMLHttpRequest.restore;
+
+            if (keepOnCreate !== true) {
+                delete sinon.FakeXMLHttpRequest.onCreate;
+            }
+        };
+        if (xhr.supportsXHR) {
+            global.XMLHttpRequest = sinon.FakeXMLHttpRequest;
+        }
+
+        if (xhr.supportsActiveX) {
+            global.ActiveXObject = function ActiveXObject(objId) {
+                if (objId == "Microsoft.XMLHTTP" || /^Msxml2\.XMLHTTP/i.test(objId)) {
+
+                    return new sinon.FakeXMLHttpRequest();
+                }
+
+                return new xhr.GlobalActiveXObject(objId);
+            };
+        }
+
+        return sinon.FakeXMLHttpRequest;
+    };
+
+    sinon.FakeXMLHttpRequest = FakeXMLHttpRequest;
+
+})(typeof global === "object" ? global : this);
+
+if (typeof module !== 'undefined' && module.exports) {
+    module.exports = sinon;
+}
+
+/**
+ * @depend fake_xml_http_request.js
+ */
+/*jslint eqeqeq: false, onevar: false, regexp: false, plusplus: false*/
+/*global module, require, window*/
+/**
+ * The Sinon "server" mimics a web server that receives requests from
+ * sinon.FakeXMLHttpRequest and provides an API to respond to those requests,
+ * both synchronously and asynchronously. To respond synchronuously, canned
+ * answers have to be provided upfront.
+ *
+ * @author Christian Johansen (christian@cjohansen.no)
+ * @license BSD
+ *
+ * Copyright (c) 2010-2013 Christian Johansen
+ */
+
+if (typeof sinon == "undefined") {
+    var sinon = {};
+}
+
+sinon.fakeServer = (function () {
+    var push = [].push;
+    function F() {}
+
+    function create(proto) {
+        F.prototype = proto;
+        return new F();
+    }
+
+    function responseArray(handler) {
+        var response = handler;
+
+        if (Object.prototype.toString.call(handler) != "[object Array]") {
+            response = [200, {}, handler];
+        }
+
+        if (typeof response[2] != "string") {
+            throw new TypeError("Fake server response body should be string, but was " +
+                                typeof response[2]);
+        }
+
+        return response;
+    }
+
+    var wloc = typeof window !== "undefined" ? window.location : {};
+    var rCurrLoc = new RegExp("^" + wloc.protocol + "//" + wloc.host);
+
+    function matchOne(response, reqMethod, reqUrl) {
+        var rmeth = response.method;
+        var matchMethod = !rmeth || rmeth.toLowerCase() == reqMethod.toLowerCase();
+        var url = response.url;
+        var matchUrl = !url || url == reqUrl || (typeof url.test == "function" && url.test(reqUrl));
+
+        return matchMethod && matchUrl;
+    }
+
+    function match(response, request) {
+        var requestUrl = request.url;
+
+        if (!/^https?:\/\//.test(requestUrl) || rCurrLoc.test(requestUrl)) {
+            requestUrl = requestUrl.replace(rCurrLoc, "");
+        }
+
+        if (matchOne(response, this.getHTTPMethod(request), requestUrl)) {
+            if (typeof response.response == "function") {
+                var ru = response.url;
+                var args = [request].concat(ru && typeof ru.exec == "function" ? ru.exec(requestUrl).slice(1) : []);
+                return response.response.apply(response, args);
+            }
+
+            return true;
+        }
+
+        return false;
+    }
+
+    function log(response, request) {
+        var str;
+
+        str =  "Request:\n"  + sinon.format(request)  + "\n\n";
+        str += "Response:\n" + sinon.format(response) + "\n\n";
+
+        sinon.log(str);
+    }
+
+    return {
+        create: function () {
+            var server = create(this);
+            this.xhr = sinon.useFakeXMLHttpRequest();
+            server.requests = [];
+
+            this.xhr.onCreate = function (xhrObj) {
+                server.addRequest(xhrObj);
+            };
+
+            return server;
+        },
+
+        addRequest: function addRequest(xhrObj) {
+            var server = this;
+            push.call(this.requests, xhrObj);
+
+            xhrObj.onSend = function () {
+                server.handleRequest(this);
+
+                if (server.autoRespond && !server.responding) {
+                    setTimeout(function () {
+                        server.responding = false;
+                        server.respond();
+                    }, server.autoRespondAfter || 10);
+
+                    server.responding = true;
+                }
+            };
+        },
+
+        getHTTPMethod: function getHTTPMethod(request) {
+            if (this.fakeHTTPMethods && /post/i.test(request.method)) {
+                var matches = (request.requestBody || "").match(/_method=([^\b;]+)/);
+                return !!matches ? matches[1] : request.method;
+            }
+
+            return request.method;
+        },
+
+        handleRequest: function handleRequest(xhr) {
+            if (xhr.async) {
+                if (!this.queue) {
+                    this.queue = [];
+                }
+
+                push.call(this.queue, xhr);
+            } else {
+                this.processRequest(xhr);
+            }
+        },
+
+        respondWith: function respondWith(method, url, body) {
+            if (arguments.length == 1 && typeof method != "function") {
+                this.response = responseArray(method);
+                return;
+            }
+
+            if (!this.responses) { this.responses = []; }
+
+            if (arguments.length == 1) {
+                body = method;
+                url = method = null;
+            }
+
+            if (arguments.length == 2) {
+                body = url;
+                url = method;
+                method = null;
+            }
+
+            push.call(this.responses, {
+                method: method,
+                url: url,
+                response: typeof body == "function" ? body : responseArray(body)
+            });
+        },
+
+        respond: function respond() {
+            if (arguments.length > 0) this.respondWith.apply(this, arguments);
+            var queue = this.queue || [];
+            var requests = queue.splice(0);
+            var request;
+
+            while(request = requests.shift()) {
+                this.processRequest(request);
+            }
+        },
+
+        processRequest: function processRequest(request) {
+            try {
+                if (request.aborted) {
+                    return;
+                }
+
+                var response = this.response || [404, {}, ""];
+
+                if (this.responses) {
+                    for (var l = this.responses.length, i = l - 1; i >= 0; i--) {
+                        if (match.call(this, this.responses[i], request)) {
+                            response = this.responses[i].response;
+                            break;
+                        }
+                    }
+                }
+
+                if (request.readyState != 4) {
+                    log(response, request);
+
+                    request.respond(response[0], response[1], response[2]);
+                }
+            } catch (e) {
+                sinon.logError("Fake server request processing", e);
+            }
+        },
+
+        restore: function restore() {
+            return this.xhr.restore && this.xhr.restore.apply(this.xhr, arguments);
+        }
+    };
+}());
+
+if (typeof module !== 'undefined' && module.exports) {
+    module.exports = sinon;
+}
+
+/**
+ * @depend fake_server.js
+ * @depend fake_timers.js
+ */
+/*jslint browser: true, eqeqeq: false, onevar: false*/
+/*global sinon*/
+/**
+ * Add-on for sinon.fakeServer that automatically handles a fake timer along with
+ * the FakeXMLHttpRequest. The direct inspiration for this add-on is jQuery
+ * 1.3.x, which does not use xhr object's onreadystatehandler at all - instead,
+ * it polls the object for completion with setInterval. Dispite the direct
+ * motivation, there is nothing jQuery-specific in this file, so it can be used
+ * in any environment where the ajax implementation depends on setInterval or
+ * setTimeout.
+ *
+ * @author Christian Johansen (christian@cjohansen.no)
+ * @license BSD
+ *
+ * Copyright (c) 2010-2013 Christian Johansen
+ */
+
+(function () {
+    function Server() {}
+    Server.prototype = sinon.fakeServer;
+
+    sinon.fakeServerWithClock = new Server();
+
+    sinon.fakeServerWithClock.addRequest = function addRequest(xhr) {
+        if (xhr.async) {
+            if (typeof setTimeout.clock == "object") {
+                this.clock = setTimeout.clock;
+            } else {
+                this.clock = sinon.useFakeTimers();
+                this.resetClock = true;
+            }
+
+            if (!this.longestTimeout) {
+                var clockSetTimeout = this.clock.setTimeout;
+                var clockSetInterval = this.clock.setInterval;
+                var server = this;
+
+                this.clock.setTimeout = function (fn, timeout) {
+                    server.longestTimeout = Math.max(timeout, server.longestTimeout || 0);
+
+                    return clockSetTimeout.apply(this, arguments);
+                };
+
+                this.clock.setInterval = function (fn, timeout) {
+                    server.longestTimeout = Math.max(timeout, server.longestTimeout || 0);
+
+                    return clockSetInterval.apply(this, arguments);
+                };
+            }
+        }
+
+        return sinon.fakeServer.addRequest.call(this, xhr);
+    };
+
+    sinon.fakeServerWithClock.respond = function respond() {
+        var returnVal = sinon.fakeServer.respond.apply(this, arguments);
+
+        if (this.clock) {
+            this.clock.tick(this.longestTimeout || 0);
+            this.longestTimeout = 0;
+
+            if (this.resetClock) {
+                this.clock.restore();
+                this.resetClock = false;
+            }
+        }
+
+        return returnVal;
+    };
+
+    sinon.fakeServerWithClock.restore = function restore() {
+        if (this.clock) {
+            this.clock.restore();
+        }
+
+        return sinon.fakeServer.restore.apply(this, arguments);
+    };
+}());
+
+/**
+ * @depend ../sinon.js
+ * @depend collection.js
+ * @depend util/fake_timers.js
+ * @depend util/fake_server_with_clock.js
+ */
+/*jslint eqeqeq: false, onevar: false, plusplus: false*/
+/*global require, module*/
+/**
+ * Manages fake collections as well as fake utilities such as Sinon's
+ * timers and fake XHR implementation in one convenient object.
+ *
+ * @author Christian Johansen (christian@cjohansen.no)
+ * @license BSD
+ *
+ * Copyright (c) 2010-2013 Christian Johansen
+ */
+
+if (typeof module !== 'undefined' && module.exports) {
+    var sinon = require("../sinon");
+    sinon.extend(sinon, require("./util/fake_timers"));
+}
+
+(function () {
+    var push = [].push;
+
+    function exposeValue(sandbox, config, key, value) {
+        if (!value) {
+            return;
+        }
+
+        if (config.injectInto && !(key in config.injectInto)) {
+            config.injectInto[key] = value;
+            sandbox.injectedKeys.push(key);
+        } else {
+            push.call(sandbox.args, value);
+        }
+    }
+
+    function prepareSandboxFromConfig(config) {
+        var sandbox = sinon.create(sinon.sandbox);
+
+        if (config.useFakeServer) {
+            if (typeof config.useFakeServer == "object") {
+                sandbox.serverPrototype = config.useFakeServer;
+            }
+
+            sandbox.useFakeServer();
+        }
+
+        if (config.useFakeTimers) {
+            if (typeof config.useFakeTimers == "object") {
+                sandbox.useFakeTimers.apply(sandbox, config.useFakeTimers);
+            } else {
+                sandbox.useFakeTimers();
+            }
+        }
+
+        return sandbox;
+    }
+
+    sinon.sandbox = sinon.extend(sinon.create(sinon.collection), {
+        useFakeTimers: function useFakeTimers() {
+            this.clock = sinon.useFakeTimers.apply(sinon, arguments);
+
+            return this.add(this.clock);
+        },
+
+        serverPrototype: sinon.fakeServer,
+
+        useFakeServer: function useFakeServer() {
+            var proto = this.serverPrototype || sinon.fakeServer;
+
+            if (!proto || !proto.create) {
+                return null;
+            }
+
+            this.server = proto.create();
+            return this.add(this.server);
+        },
+
+        inject: function (obj) {
+            sinon.collection.inject.call(this, obj);
+
+            if (this.clock) {
+                obj.clock = this.clock;
+            }
+
+            if (this.server) {
+                obj.server = this.server;
+                obj.requests = this.server.requests;
+            }
+
+            return obj;
+        },
+
+        restore: function () {
+            sinon.collection.restore.apply(this, arguments);
+            this.restoreContext();
+        },
+
+        restoreContext: function () {
+            if (this.injectedKeys) {
+                for (var i = 0, j = this.injectedKeys.length; i < j; i++) {
+                    delete this.injectInto[this.injectedKeys[i]];
+                }
+                this.injectedKeys = [];
+            }
+        },
+
+        create: function (config) {
+            if (!config) {
+                return sinon.create(sinon.sandbox);
+            }
+
+            var sandbox = prepareSandboxFromConfig(config);
+            sandbox.args = sandbox.args || [];
+            sandbox.injectedKeys = [];
+            sandbox.injectInto = config.injectInto;
+            var prop, value, exposed = sandbox.inject({});
+
+            if (config.properties) {
+                for (var i = 0, l = config.properties.length; i < l; i++) {
+                    prop = config.properties[i];
+                    value = exposed[prop] || prop == "sandbox" && sandbox;
+                    exposeValue(sandbox, config, prop, value);
+                }
+            } else {
+                exposeValue(sandbox, config, "sandbox", value);
+            }
+
+            return sandbox;
+        }
+    });
+
+    sinon.sandbox.useFakeXMLHttpRequest = sinon.sandbox.useFakeServer;
+
+    if (typeof module !== 'undefined' && module.exports) {
+        module.exports = sinon.sandbox;
+    }
+}());
+
+/**
+ * @depend ../sinon.js
+ * @depend stub.js
+ * @depend mock.js
+ * @depend sandbox.js
+ */
+/*jslint eqeqeq: false, onevar: false, forin: true, plusplus: false*/
+/*global module, require, sinon*/
+/**
+ * Test function, sandboxes fakes
+ *
+ * @author Christian Johansen (christian@cjohansen.no)
+ * @license BSD
+ *
+ * Copyright (c) 2010-2013 Christian Johansen
+ */
+
+(function (sinon) {
+    var commonJSModule = typeof module !== 'undefined' && module.exports;
+
+    if (!sinon && commonJSModule) {
+        sinon = require("../sinon");
+    }
+
+    if (!sinon) {
+        return;
+    }
+
+    function test(callback) {
+        var type = typeof callback;
+
+        if (type != "function") {
+            throw new TypeError("sinon.test needs to wrap a test function, got " + type);
+        }
+
+        return function () {
+            var config = sinon.getConfig(sinon.config);
+            config.injectInto = config.injectIntoThis && this || config.injectInto;
+            var sandbox = sinon.sandbox.create(config);
+            var exception, result;
+            var args = Array.prototype.slice.call(arguments).concat(sandbox.args);
+
+            try {
+                result = callback.apply(this, args);
+            } catch (e) {
+                exception = e;
+            }
+
+            if (typeof exception !== "undefined") {
+                sandbox.restore();
+                throw exception;
+            }
+            else {
+                sandbox.verifyAndRestore();
+            }
+
+            return result;
+        };
+    }
+
+    test.config = {
+        injectIntoThis: true,
+        injectInto: null,
+        properties: ["spy", "stub", "mock", "clock", "server", "requests"],
+        useFakeTimers: true,
+        useFakeServer: true
+    };
+
+    if (commonJSModule) {
+        module.exports = test;
+    } else {
+        sinon.test = test;
+    }
+}(typeof sinon == "object" && sinon || null));
+
+/**
+ * @depend ../sinon.js
+ * @depend test.js
+ */
+/*jslint eqeqeq: false, onevar: false, eqeqeq: false*/
+/*global module, require, sinon*/
+/**
+ * Test case, sandboxes all test functions
+ *
+ * @author Christian Johansen (christian@cjohansen.no)
+ * @license BSD
+ *
+ * Copyright (c) 2010-2013 Christian Johansen
+ */
+
+(function (sinon) {
+    var commonJSModule = typeof module !== 'undefined' && module.exports;
+
+    if (!sinon && commonJSModule) {
+        sinon = require("../sinon");
+    }
+
+    if (!sinon || !Object.prototype.hasOwnProperty) {
+        return;
+    }
+
+    function createTest(property, setUp, tearDown) {
+        return function () {
+            if (setUp) {
+                setUp.apply(this, arguments);
+            }
+
+            var exception, result;
+
+            try {
+                result = property.apply(this, arguments);
+            } catch (e) {
+                exception = e;
+            }
+
+            if (tearDown) {
+                tearDown.apply(this, arguments);
+            }
+
+            if (exception) {
+                throw exception;
+            }
+
+            return result;
+        };
+    }
+
+    function testCase(tests, prefix) {
+        /*jsl:ignore*/
+        if (!tests || typeof tests != "object") {
+            throw new TypeError("sinon.testCase needs an object with test functions");
+        }
+        /*jsl:end*/
+
+        prefix = prefix || "test";
+        var rPrefix = new RegExp("^" + prefix);
+        var methods = {}, testName, property, method;
+        var setUp = tests.setUp;
+        var tearDown = tests.tearDown;
+
+        for (testName in tests) {
+            if (tests.hasOwnProperty(testName)) {
+                property = tests[testName];
+
+                if (/^(setUp|tearDown)$/.test(testName)) {
+                    continue;
+                }
+
+                if (typeof property == "function" && rPrefix.test(testName)) {
+                    method = property;
+
+                    if (setUp || tearDown) {
+                        method = createTest(property, setUp, tearDown);
+                    }
+
+                    methods[testName] = sinon.test(method);
+                } else {
+                    methods[testName] = tests[testName];
+                }
+            }
+        }
+
+        return methods;
+    }
+
+    if (commonJSModule) {
+        module.exports = testCase;
+    } else {
+        sinon.testCase = testCase;
+    }
+}(typeof sinon == "object" && sinon || null));
+
+/**
+ * @depend ../sinon.js
+ * @depend stub.js
+ */
+/*jslint eqeqeq: false, onevar: false, nomen: false, plusplus: false*/
+/*global module, require, sinon*/
+/**
+ * Assertions matching the test spy retrieval interface.
+ *
+ * @author Christian Johansen (christian@cjohansen.no)
+ * @license BSD
+ *
+ * Copyright (c) 2010-2013 Christian Johansen
+ */
+
+(function (sinon, global) {
+    var commonJSModule = typeof module !== "undefined" && module.exports;
+    var slice = Array.prototype.slice;
+    var assert;
+
+    if (!sinon && commonJSModule) {
+        sinon = require("../sinon");
+    }
+
+    if (!sinon) {
+        return;
+    }
+
+    function verifyIsStub() {
+        var method;
+
+        for (var i = 0, l = arguments.length; i < l; ++i) {
+            method = arguments[i];
+
+            if (!method) {
+                assert.fail("fake is not a spy");
+            }
+
+            if (typeof method != "function") {
+                assert.fail(method + " is not a function");
+            }
+
+            if (typeof method.getCall != "function") {
+                assert.fail(method + " is not stubbed");
+            }
+        }
+    }
+
+    function failAssertion(object, msg) {
+        object = object || global;
+        var failMethod = object.fail || assert.fail;
+        failMethod.call(object, msg);
+    }
+
+    function mirrorPropAsAssertion(name, method, message) {
+        if (arguments.length == 2) {
+            message = method;
+            method = name;
+        }
+
+        assert[name] = function (fake) {
+            verifyIsStub(fake);
+
+            var args = slice.call(arguments, 1);
+            var failed = false;
+
+            if (typeof method == "function") {
+                failed = !method(fake);
+            } else {
+                failed = typeof fake[method] == "function" ?
+                    !fake[method].apply(fake, args) : !fake[method];
+            }
+
+            if (failed) {
+                failAssertion(this, fake.printf.apply(fake, [message].concat(args)));
+            } else {
+                assert.pass(name);
+            }
+        };
+    }
+
+    function exposedName(prefix, prop) {
+        return !prefix || /^fail/.test(prop) ? prop :
+            prefix + prop.slice(0, 1).toUpperCase() + prop.slice(1);
+    }
+
+    assert = {
+        failException: "AssertError",
+
+        fail: function fail(message) {
+            var error = new Error(message);
+            error.name = this.failException || assert.failException;
+
+            throw error;
+        },
+
+        pass: function pass(assertion) {},
+
+        callOrder: function assertCallOrder() {
+            verifyIsStub.apply(null, arguments);
+            var expected = "", actual = "";
+
+            if (!sinon.calledInOrder(arguments)) {
+                try {
+                    expected = [].join.call(arguments, ", ");
+                    var calls = slice.call(arguments);
+                    var i = calls.length;
+                    while (i) {
+                        if (!calls[--i].called) {
+                            calls.splice(i, 1);
+                        }
+                    }
+                    actual = sinon.orderByFirstCall(calls).join(", ");
+                } catch (e) {
+                    // If this fails, we'll just fall back to the blank string
+                }
+
+                failAssertion(this, "expected " + expected + " to be " +
+                              "called in order but were called as " + actual);
+            } else {
+                assert.pass("callOrder");
+            }
+        },
+
+        callCount: function assertCallCount(method, count) {
+            verifyIsStub(method);
+
+            if (method.callCount != count) {
+                var msg = "expected %n to be called " + sinon.timesInWords(count) +
+                    " but was called %c%C";
+                failAssertion(this, method.printf(msg));
+            } else {
+                assert.pass("callCount");
+            }
+        },
+
+        expose: function expose(target, options) {
+            if (!target) {
+                throw new TypeError("target is null or undefined");
+            }
+
+            var o = options || {};
+            var prefix = typeof o.prefix == "undefined" && "assert" || o.prefix;
+            var includeFail = typeof o.includeFail == "undefined" || !!o.includeFail;
+
+            for (var method in this) {
+                if (method != "export" && (includeFail || !/^(fail)/.test(method))) {
+                    target[exposedName(prefix, method)] = this[method];
+                }
+            }
+
+            return target;
+        },
+
+        match: function match(actual, expectation) {
+            var matcher = sinon.match(expectation);
+            if (matcher.test(actual)) {
+                assert.pass("match");
+            } else {
+                var formatted = [
+                    "expected value to match",
+                    "    expected = " + sinon.format(expectation),
+                    "    actual = " + sinon.format(actual)
+                ]
+                failAssertion(this, formatted.join("\n"));
+            }
+        }
+    };
+
+    mirrorPropAsAssertion("called", "expected %n to have been called at least once but was never called");
+    mirrorPropAsAssertion("notCalled", function (spy) { return !spy.called; },
+                          "expected %n to not have been called but was called %c%C");
+    mirrorPropAsAssertion("calledOnce", "expected %n to be called once but was called %c%C");
+    mirrorPropAsAssertion("calledTwice", "expected %n to be called twice but was called %c%C");
+    mirrorPropAsAssertion("calledThrice", "expected %n to be called thrice but was called %c%C");
+    mirrorPropAsAssertion("calledOn", "expected %n to be called with %1 as this but was called with %t");
+    mirrorPropAsAssertion("alwaysCalledOn", "expected %n to always be called with %1 as this but was called with %t");
+    mirrorPropAsAssertion("calledWithNew", "expected %n to be called with new");
+    mirrorPropAsAssertion("alwaysCalledWithNew", "expected %n to always be called with new");
+    mirrorPropAsAssertion("calledWith", "expected %n to be called with arguments %*%C");
+    mirrorPropAsAssertion("calledWithMatch", "expected %n to be called with match %*%C");
+    mirrorPropAsAssertion("alwaysCalledWith", "expected %n to always be called with arguments %*%C");
+    mirrorPropAsAssertion("alwaysCalledWithMatch", "expected %n to always be called with match %*%C");
+    mirrorPropAsAssertion("calledWithExactly", "expected %n to be called with exact arguments %*%C");
+    mirrorPropAsAssertion("alwaysCalledWithExactly", "expected %n to always be called with exact arguments %*%C");
+    mirrorPropAsAssertion("neverCalledWith", "expected %n to never be called with arguments %*%C");
+    mirrorPropAsAssertion("neverCalledWithMatch", "expected %n to never be called with match %*%C");
+    mirrorPropAsAssertion("threw", "%n did not throw exception%C");
+    mirrorPropAsAssertion("alwaysThrew", "%n did not always throw exception%C");
+
+    if (commonJSModule) {
+        module.exports = assert;
+    } else {
+        sinon.assert = assert;
+    }
+}(typeof sinon == "object" && sinon || null, typeof window != "undefined" ? window : (typeof self != "undefined") ? self : global));
+
+return sinon;}.call(typeof window != 'undefined' && window || {}));
diff --git a/resources/lib/sinonjs/sinon-ie-1.9.0.js b/resources/lib/sinonjs/sinon-ie-1.9.0.js
new file mode 100644 (file)
index 0000000..c9fbd9d
--- /dev/null
@@ -0,0 +1,86 @@
+/**
+ * Sinon.JS 1.9.0, 2014/03/05
+ *
+ * @author Christian Johansen (christian@cjohansen.no)
+ * @author Contributors: https://github.com/cjohansen/Sinon.JS/blob/master/AUTHORS
+ *
+ * (The BSD License)
+ * 
+ * Copyright (c) 2010-2014, Christian Johansen, christian@cjohansen.no
+ * All rights reserved.
+ * 
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ * 
+ *     * Redistributions of source code must retain the above copyright notice,
+ *       this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above copyright notice,
+ *       this list of conditions and the following disclaimer in the documentation
+ *       and/or other materials provided with the distribution.
+ *     * Neither the name of Christian Johansen nor the names of his contributors
+ *       may be used to endorse or promote products derived from this software
+ *       without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*global sinon, setTimeout, setInterval, clearTimeout, clearInterval, Date*/
+/**
+ * Helps IE run the fake timers. By defining global functions, IE allows
+ * them to be overwritten at a later point. If these are not defined like
+ * this, overwriting them will result in anything from an exception to browser
+ * crash.
+ *
+ * If you don't require fake timers to work in IE, don't include this file.
+ *
+ * @author Christian Johansen (christian@cjohansen.no)
+ * @license BSD
+ *
+ * Copyright (c) 2010-2013 Christian Johansen
+ */
+function setTimeout() {}
+function clearTimeout() {}
+function setImmediate() {}
+function clearImmediate() {}
+function setInterval() {}
+function clearInterval() {}
+function Date() {}
+
+// Reassign the original functions. Now their writable attribute
+// should be true. Hackish, I know, but it works.
+setTimeout = sinon.timers.setTimeout;
+clearTimeout = sinon.timers.clearTimeout;
+setImmediate = sinon.timers.setImmediate;
+clearImmediate = sinon.timers.clearImmediate;
+setInterval = sinon.timers.setInterval;
+clearInterval = sinon.timers.clearInterval;
+Date = sinon.timers.Date;
+
+/*global sinon*/
+/**
+ * Helps IE run the fake XMLHttpRequest. By defining global functions, IE allows
+ * them to be overwritten at a later point. If these are not defined like
+ * this, overwriting them will result in anything from an exception to browser
+ * crash.
+ *
+ * If you don't require fake XHR to work in IE, don't include this file.
+ *
+ * @author Christian Johansen (christian@cjohansen.no)
+ * @license BSD
+ *
+ * Copyright (c) 2010-2013 Christian Johansen
+ */
+function XMLHttpRequest() {}
+
+// Reassign the original function. Now its writable attribute
+// should be true. Hackish, I know, but it works.
+XMLHttpRequest = sinon.xhr.XMLHttpRequest || undefined;
diff --git a/resources/mediawiki.action/images/green-checkmark.png b/resources/mediawiki.action/images/green-checkmark.png
deleted file mode 100644 (file)
index 8ec604e..0000000
Binary files a/resources/mediawiki.action/images/green-checkmark.png and /dev/null differ
diff --git a/resources/mediawiki.action/mediawiki.action.edit.collapsibleFooter.css b/resources/mediawiki.action/mediawiki.action.edit.collapsibleFooter.css
deleted file mode 100644 (file)
index 1af4a7a..0000000
+++ /dev/null
@@ -1,17 +0,0 @@
-/* Styles for collapsible lists of templates used and hidden categories */
-.mw-editfooter-toggler {
-       cursor: pointer;
-       background-position: left center;
-       padding-left: 16px;
-}
-
-.mw-editfooter-list {
-       margin-bottom: 1em;
-       margin-left: 2.5em;
-}
-
-/* Show/hide animation is incorrect if the table has a margin set. Extra
- * "table.wikitable" is needed in the selector for CSS specificity. */
-table.wikitable.preview-limit-report {
-       margin: 0;
-}
diff --git a/resources/mediawiki.action/mediawiki.action.edit.collapsibleFooter.js b/resources/mediawiki.action/mediawiki.action.edit.collapsibleFooter.js
deleted file mode 100644 (file)
index 7ae51ab..0000000
+++ /dev/null
@@ -1,54 +0,0 @@
-jQuery( document ).ready( function ( $ ) {
-       var collapsibleLists, i, handleOne;
-
-       // Collapsible lists of categories and templates
-       collapsibleLists = [
-               {
-                       $list: $( '.templatesUsed ul' ),
-                       $toggler: $( '.mw-templatesUsedExplanation' ),
-                       cookieName: 'templates-used-list'
-               },
-               {
-                       $list: $( '.hiddencats ul' ),
-                       $toggler: $( '.mw-hiddenCategoriesExplanation' ),
-                       cookieName: 'hidden-categories-list'
-               },
-               {
-                       $list: $( '.preview-limit-report-wrapper' ),
-                       $toggler: $( '.mw-limitReportExplanation' ),
-                       cookieName: 'preview-limit-report'
-               }
-       ];
-
-       handleOne = function ( $list, $toggler, cookieName ) {
-               var isCollapsed = $.cookie( cookieName ) !== 'expanded';
-
-               // Style the toggler with an arrow icon and add a tabIndex and a role for accessibility
-               $toggler.addClass( 'mw-editfooter-toggler' ).prop( 'tabIndex', 0 ).attr( 'role', 'button' );
-               $list.addClass( 'mw-editfooter-list' );
-
-               $list.makeCollapsible( {
-                       $customTogglers: $toggler,
-                       linksPassthru: true,
-                       plainMode: true,
-                       collapsed: isCollapsed
-               } );
-
-               $toggler.addClass( isCollapsed ? 'mw-icon-arrow-collapsed' : 'mw-icon-arrow-expanded' );
-
-               $list.on( 'beforeExpand.mw-collapsible', function () {
-                       $toggler.removeClass( 'mw-icon-arrow-collapsed' ).addClass( 'mw-icon-arrow-expanded' );
-                       $.cookie( cookieName, 'expanded' );
-               } );
-
-               $list.on( 'beforeCollapse.mw-collapsible', function () {
-                       $toggler.removeClass( 'mw-icon-arrow-expanded' ).addClass( 'mw-icon-arrow-collapsed' );
-                       $.cookie( cookieName, 'collapsed' );
-               } );
-       };
-
-       for ( i = 0; i < collapsibleLists.length; i++ ) {
-               // Pass to a function for iteration-local variables
-               handleOne( collapsibleLists[i].$list, collapsibleLists[i].$toggler, collapsibleLists[i].cookieName );
-       }
-} );
diff --git a/resources/mediawiki.action/mediawiki.action.edit.editWarning.js b/resources/mediawiki.action/mediawiki.action.edit.editWarning.js
deleted file mode 100644 (file)
index f8448e6..0000000
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * Javascript for module editWarning
- */
-( function ( mw, $ ) {
-       $( function () {
-               // Check if EditWarning is enabled and if we need it
-               if ( $( '#wpTextbox1' ).length === 0 ) {
-                       return true;
-               }
-               // Get the original values of some form elements
-               $( '#wpTextbox1, #wpSummary' ).each( function () {
-                       $( this ).data( 'origtext', $( this ).val() );
-               } );
-               var savedWindowOnBeforeUnload;
-               $( window )
-                       .on( 'beforeunload.editwarning', function () {
-                               var retval;
-
-                               // Check if the current values of some form elements are the same as
-                               // the original values
-                               if (
-                                       mw.config.get( 'wgAction' ) === 'submit' ||
-                                               $( '#wpTextbox1' ).data( 'origtext' ) !== $( '#wpTextbox1' ).val() ||
-                                               $( '#wpSummary' ).data( 'origtext' ) !== $( '#wpSummary' ).val()
-                               ) {
-                                       // Return our message
-                                       retval = mw.msg( 'editwarning-warning' );
-                               }
-
-                               // Unset the onbeforeunload handler so we don't break page caching in Firefox
-                               savedWindowOnBeforeUnload = window.onbeforeunload;
-                               window.onbeforeunload = null;
-                               if ( retval !== undefined ) {
-                                       // ...but if the user chooses not to leave the page, we need to rebind it
-                                       setTimeout( function () {
-                                               window.onbeforeunload = savedWindowOnBeforeUnload;
-                                       }, 1 );
-                                       return retval;
-                               }
-                       } )
-                       .on( 'pageshow.editwarning', function () {
-                               // Re-add onbeforeunload handler
-                               if ( !window.onbeforeunload ) {
-                                       window.onbeforeunload = savedWindowOnBeforeUnload;
-                               }
-                       } );
-
-               // Add form submission handler
-               $( '#editform' ).submit( function () {
-                       // Unbind our handlers
-                       $( window ).off( '.editwarning' );
-               } );
-       } );
-
-}( mediaWiki, jQuery ) );
diff --git a/resources/mediawiki.action/mediawiki.action.edit.js b/resources/mediawiki.action/mediawiki.action.edit.js
deleted file mode 100644 (file)
index bbffe79..0000000
+++ /dev/null
@@ -1,204 +0,0 @@
-/**
- * Interface for the classic edit toolbar.
- *
- * @class mw.toolbar
- * @singleton
- */
-( function ( mw, $ ) {
-       var toolbar, isReady, $toolbar, queue, slice, $currentFocused;
-
-       /**
-        * Internal helper that does the actual insertion of the button into the toolbar.
-        *
-        * See #addButton for parameter documentation.
-        *
-        * @private
-        */
-       function insertButton( b, speedTip, tagOpen, tagClose, sampleText, imageId ) {
-               // Backwards compatibility
-               if ( typeof b !== 'object' ) {
-                       b = {
-                               imageFile: b,
-                               speedTip: speedTip,
-                               tagOpen: tagOpen,
-                               tagClose: tagClose,
-                               sampleText: sampleText,
-                               imageId: imageId
-                       };
-               }
-               var $image = $( '<img>' ).attr( {
-                       width: 23,
-                       height: 22,
-                       src: b.imageFile,
-                       alt: b.speedTip,
-                       title: b.speedTip,
-                       id: b.imageId || undefined,
-                       'class': 'mw-toolbar-editbutton'
-               } ).click( function () {
-                       toolbar.insertTags( b.tagOpen, b.tagClose, b.sampleText );
-                       return false;
-               } );
-
-               $toolbar.append( $image );
-       }
-
-       isReady = false;
-       $toolbar = false;
-       /**
-        * @private
-        * @property {Array}
-        * Contains button objects (and for backwards compatibilty, it can
-        * also contains an arguments array for insertButton).
-        */
-       queue = [];
-       slice = queue.slice;
-
-       toolbar = {
-
-               /**
-                * Add buttons to the toolbar.
-                *
-                * Takes care of race conditions and time-based dependencies
-                * by placing buttons in a queue if this method is called before
-                * the toolbar is created.
-                *
-                * For compatiblity, passing the properties listed below as separate arguments
-                * (in the listed order) is also supported.
-                *
-                * @param {Object} button Object with the following properties:
-                * @param {string} button.imageFile
-                * @param {string} button.speedTip
-                * @param {string} button.tagOpen
-                * @param {string} button.tagClose
-                * @param {string} button.sampleText
-                * @param {string} [button.imageId]
-                */
-               addButton: function () {
-                       if ( isReady ) {
-                               insertButton.apply( toolbar, arguments );
-                       } else {
-                               // Convert arguments list to array
-                               queue.push( slice.call( arguments ) );
-                       }
-               },
-               /**
-                * Example usage:
-                *     addButtons( [ { .. }, { .. }, { .. } ] );
-                *     addButtons( { .. }, { .. } );
-                *
-                * @param {Object|Array} [buttons...] An array of button objects or the first
-                *  button object in a list of variadic arguments.
-                */
-               addButtons: function ( buttons ) {
-                       if ( !$.isArray( buttons ) ) {
-                               buttons = slice.call( arguments );
-                       }
-                       if ( isReady ) {
-                               $.each( buttons, function () {
-                                       insertButton( this );
-                               } );
-                       } else {
-                               // Push each button into the queue
-                               queue.push.apply( queue, buttons );
-                       }
-               },
-
-               /**
-                * Apply tagOpen/tagClose to selection in currently focused textarea.
-                *
-                * Uses `sampleText` if selection is empty.
-                *
-                * @param {string} tagOpen
-                * @param {string} tagClose
-                * @param {string} sampleText
-                */
-               insertTags: function ( tagOpen, tagClose, sampleText ) {
-                       if ( $currentFocused && $currentFocused.length ) {
-                               $currentFocused.textSelection(
-                                       'encapsulateSelection', {
-                                               pre: tagOpen,
-                                               peri: sampleText,
-                                               post: tagClose
-                                       }
-                               );
-                       }
-               },
-
-               // For backwards compatibility,
-               // Called from EditPage.php, maybe in other places as well.
-               init: function () {}
-       };
-
-       // Legacy (for compatibility with the code previously in skins/common.edit.js)
-       mw.log.deprecate( window, 'addButton', toolbar.addButton, 'Use mw.toolbar.addButton instead' );
-       mw.log.deprecate( window, 'insertTags', toolbar.insertTags, 'Use mw.toolbar.insertTags instead' );
-
-       // Expose API publicly
-       mw.toolbar = toolbar;
-
-       $( function () {
-               var i, b, $iframe, editBox, scrollTop, $editForm;
-
-               // currentFocus is used to determine where to insert tags
-               $currentFocused = $( '#wpTextbox1' );
-
-               // Populate the selector cache for $toolbar
-               $toolbar = $( '#toolbar' );
-
-               for ( i = 0; i < queue.length; i++ ) {
-                       b = queue[i];
-                       if ( $.isArray( b ) ) {
-                               // Forwarded arguments array from mw.toolbar.addButton
-                               insertButton.apply( toolbar, b );
-                       } else {
-                               // Raw object from mw.toolbar.addButtons
-                               insertButton( b );
-                       }
-               }
-
-               // Clear queue
-               queue.length = 0;
-
-               // This causes further calls to addButton to go to insertion directly
-               // instead of to the queue.
-               // It is important that this is after the one and only loop through
-               // the the queue
-               isReady = true;
-
-               // Make sure edit summary does not exceed byte limit
-               $( '#wpSummary' ).byteLimit( 255 );
-
-               // Restore the edit box scroll state following a preview operation,
-               // and set up a form submission handler to remember this state.
-               editBox = document.getElementById( 'wpTextbox1' );
-               scrollTop = document.getElementById( 'wpScrolltop' );
-               $editForm = $( '#editform' );
-               if ( $editForm.length && editBox && scrollTop ) {
-                       if ( scrollTop.value ) {
-                               editBox.scrollTop = scrollTop.value;
-                       }
-                       $editForm.submit( function () {
-                               scrollTop.value = editBox.scrollTop;
-                       });
-               }
-
-               // Apply to dynamically created textboxes as well as normal ones
-               $( document ).on( 'focus', 'textarea, input:text', function () {
-                       $currentFocused = $( this );
-               } );
-
-               // HACK: make $currentFocused work with the usability iframe
-               // With proper focus detection support (HTML 5!) this'll be much cleaner
-               // TODO: Get rid of this WikiEditor code from MediaWiki core!
-               $iframe = $( '.wikiEditor-ui-text iframe' );
-               if ( $iframe.length > 0 ) {
-                       $( $iframe.get( 0 ).contentWindow.document )
-                               // for IE
-                               .add( $iframe.get( 0 ).contentWindow.document.body )
-                               .focus( function () {
-                                       $currentFocused = $iframe;
-                               } );
-               }
-       });
-
-}( mediaWiki, jQuery ) );
diff --git a/resources/mediawiki.action/mediawiki.action.edit.preview.js b/resources/mediawiki.action/mediawiki.action.edit.preview.js
deleted file mode 100644 (file)
index 4c2fc3a..0000000
+++ /dev/null
@@ -1,164 +0,0 @@
-/**
- * Live edit preview.
- */
-( function ( mw, $ ) {
-
-       /**
-        * @param {jQuery.Event} e
-        */
-       function doLivePreview( e ) {
-               var $wikiPreview, $editform, copySelectors, $copyElements, $spinner,
-                       targetUrl, postData, $previewDataHolder;
-
-               e.preventDefault();
-
-               // Deprecated: Use mw.hook instead
-               $( mw ).trigger( 'LivePreviewPrepare' );
-
-               $wikiPreview = $( '#wikiPreview' );
-               $editform = $( '#editform' );
-
-               // Show #wikiPreview if it's hidden to be able to scroll to it
-               // (if it is hidden, it's also empty, so nothing changes in the rendering)
-               $wikiPreview.show();
-
-               // Jump to where the preview will appear
-               $wikiPreview[0].scrollIntoView();
-
-               // List of selectors matching elements that we will
-               // update from from the ajax-loaded preview page.
-               copySelectors = [
-                       // Main
-                       '#firstHeading',
-                       '#wikiPreview',
-                       '#wikiDiff',
-                       '#catlinks',
-                       '.hiddencats',
-                       '#p-lang',
-                       // Editing-related
-                       '.templatesUsed',
-                       '.limitreport',
-                       '.mw-summary-preview'
-               ];
-               $copyElements = $( copySelectors.join( ',' ) );
-
-               // Not shown during normal preview, to be removed if present
-               $( '.mw-newarticletext' ).remove();
-
-               $spinner = $.createSpinner( {
-                       size: 'large',
-                       type: 'block'
-               } );
-               $wikiPreview.before( $spinner );
-               $spinner.css( {
-                       marginTop: $spinner.height()
-               } );
-
-               // Can't use fadeTo because it calls show(), and we might want to keep some elements hidden
-               // (e.g. empty #catlinks)
-               $copyElements.animate( { opacity: 0.4 }, 'fast' );
-
-               $previewDataHolder = $( '<div>' );
-               targetUrl = $editform.attr( 'action' );
-               targetUrl += targetUrl.indexOf( '?' ) !== -1 ? '&' : '?';
-               targetUrl += $.param( {
-                       debug: mw.config.get( 'debug' ),
-                       uselang: mw.config.get( 'wgUserLanguage' ),
-                       useskin: mw.config.get( 'skin' )
-               } );
-
-               // Gather all the data from the form
-               postData = $editform.formToArray();
-               postData.push( {
-                       name: e.target.name,
-                       value: ''
-               } );
-
-               // Load new preview data.
-               // TODO: This should use the action=parse API instead of loading the entire page,
-               // although that requires figuring out how to convert that raw data into proper HTML.
-               $previewDataHolder.load( targetUrl + ' ' + copySelectors.join( ',' ), postData, function () {
-                       var i, $from, $next, $parent;
-
-                       // Copy the contents of the specified elements from the loaded page to the real page.
-                       // Also copy their class attributes.
-                       for ( i = 0; i < copySelectors.length; i++ ) {
-                               $from = $previewDataHolder.find( copySelectors[i] );
-
-                               if ( copySelectors[i] === '#wikiPreview' ) {
-                                       $next = $wikiPreview.next();
-                                       // If there is no next node, use parent instead.
-                                       // Only query parent if needed, false otherwise.
-                                       $parent = !$next.length && $wikiPreview.parent();
-
-                                       $wikiPreview
-                                               .detach()
-                                               .empty()
-                                               .append( $from.contents() )
-                                               .attr( 'class', $from.attr( 'class' ) );
-
-                                       mw.hook( 'wikipage.content' ).fire( $wikiPreview );
-
-                                       // Reattach
-                                       if ( $parent ) {
-                                               $parent.append( $wikiPreview );
-                                       } else {
-                                               $next.before( $wikiPreview );
-                                       }
-
-                               } else {
-                                       $( copySelectors[i] )
-                                               .empty()
-                                               .append( $from.contents() )
-                                               .attr( 'class', $from.attr( 'class' ) );
-                               }
-                       }
-
-                       // Deprecated: Use mw.hook instead
-                       $( mw ).trigger( 'LivePreviewDone', [copySelectors] );
-
-                       $spinner.remove();
-                       $copyElements.animate( {
-                               opacity: 1
-                       }, 'fast' );
-               } );
-       }
-
-       $( function () {
-               // Do not enable on user .js/.css pages, as there's no sane way of "previewing"
-               // the scripts or styles without reloading the page.
-               if ( $( '#mw-userjsyoucanpreview' ).length || $( '#mw-usercssyoucanpreview' ).length ) {
-                       return;
-               }
-
-               // The following elements can change in a preview but are not output
-               // by the server when they're empty until the preview response.
-               // TODO: Make the server output these always (in a hidden state), so we don't
-               // have to fish and (hopefully) put them in the right place (since skins
-               // can change where they are output).
-
-               if ( !document.getElementById( 'p-lang' ) && document.getElementById( 'p-tb' ) ) {
-                       $( '#p-tb' ).after(
-                               $( '<div>' ).attr( 'id', 'p-lang' )
-                       );
-               }
-
-               if ( !$( '.mw-summary-preview' ).length ) {
-                       $( '.editCheckboxes' ).before(
-                               $( '<div>' ).addClass( 'mw-summary-preview' )
-                       );
-               }
-
-               if ( !document.getElementById( 'wikiDiff' ) && document.getElementById( 'wikiPreview' ) ) {
-                       $( '#wikiPreview' ).after(
-                               $( '<div>' ).attr( 'id', 'wikiDiff' )
-                       );
-               }
-
-               // This should be moved down to '#editform', but is kept on the body for now
-               // because the LiquidThreads extension is re-using this module with only half
-               // the EditPage (doesn't include #editform presumably, bug 55463).
-               $( document.body ).on( 'click', '#wpPreview, #wpDiff', doLivePreview );
-       } );
-
-}( mediaWiki, jQuery ) );
diff --git a/resources/mediawiki.action/mediawiki.action.edit.styles.css b/resources/mediawiki.action/mediawiki.action.edit.styles.css
deleted file mode 100644 (file)
index 4a2bab3..0000000
+++ /dev/null
@@ -1,44 +0,0 @@
-/**
- * Styles for elements of the editing form.
- */
-
-/* General layout */
-#wpTextbox1 {
-       margin: 0;
-       display: block;
-}
-
-.editOptions {
-       background-color: #F0F0F0;
-       border: 1px solid silver;
-       border-top: none;
-       padding: 1em 1em 1.5em 1em;
-       margin-bottom: 2em;
-}
-
-/* Adjustments to edit form elements */
-.editCheckboxes {
-       margin-bottom: 1em;
-}
-
-.editCheckboxes input:first-child {
-       margin-left: 0;
-}
-
-.cancelLink {
-       margin-left: 0.5em;
-}
-
-#editpage-copywarn {
-       font-size: 0.9em;
-}
-
-#wpSummary {
-       display: block;
-       margin-top: 0;
-       margin-bottom: 0.5em;
-}
-
-.editButtons input:first-child {
-       margin-left: .1em;
-}
diff --git a/resources/mediawiki.action/mediawiki.action.history.diff.css b/resources/mediawiki.action/mediawiki.action.history.diff.css
deleted file mode 100644 (file)
index 31ca107..0000000
+++ /dev/null
@@ -1,94 +0,0 @@
-/*
-** Diff rendering
-*/
-table.diff {
-       background-color: white;
-       border: none;
-       border-spacing: 4px;
-       margin: 0;
-       width: 100%;
-       /* Ensure that colums are of equal width */
-       table-layout: fixed;
-}
-
-table.diff td {
-       padding: 0.33em 0.5em;
-}
-
-table.diff td.diff-marker {
-       /* Compensate padding for increased font-size */
-       padding: 0.25em;
-}
-
-table.diff col.diff-marker {
-       width: 2%;
-}
-
-table.diff col.diff-content {
-       width: 48%;
-}
-
-table.diff td div {
-       /* Force-wrap very long lines such as URLs or page-widening char strings */
-       word-wrap: break-word;
-}
-
-td.diff-otitle,
-td.diff-ntitle {
-       text-align: center;
-}
-
-td.diff-lineno {
-       font-weight: bold;
-}
-
-td.diff-marker {
-       text-align: right;
-       font-weight: bold;
-       font-size: 1.25em;
-}
-
-td.diff-addedline,
-td.diff-deletedline,
-td.diff-context {
-       font-size: 88%;
-       vertical-align: top;
-       white-space: -moz-pre-wrap;
-       white-space: pre-wrap;
-       border-style: solid;
-       border-width: 1px 1px 1px 4px;
-       border-radius: 0.33em;
-}
-
-td.diff-addedline {
-       border-color: #a3d3ff;
-}
-
-td.diff-deletedline {
-       border-color: #ffe49c;
-}
-
-td.diff-context {
-       background: #f9f9f9;
-       border-color: #e6e6e6;
-       color: #333333;
-}
-
-.diffchange {
-       font-weight: bold;
-       text-decoration: none;
-}
-
-td.diff-addedline .diffchange,
-td.diff-deletedline .diffchange {
-       border-radius: 0.33em;
-       padding: 0.25em 0;
-}
-
-td.diff-addedline .diffchange {
-       background: #d8ecff;
-}
-
-td.diff-deletedline .diffchange {
-       background: #feeec8;
-}
diff --git a/resources/mediawiki.action/mediawiki.action.history.js b/resources/mediawiki.action/mediawiki.action.history.js
deleted file mode 100644 (file)
index 2a02d87..0000000
+++ /dev/null
@@ -1,125 +0,0 @@
-/**
- * JavaScript for History action
- */
-jQuery( function ( $ ) {
-       var     $historyCompareForm = $( '#mw-history-compare' ),
-               $historySubmitter,
-               $lis = $( '#pagehistory > li' );
-
-       /**
-        * @context {Element} input
-        * @param e {jQuery.Event}
-        */
-       function updateDiffRadios() {
-               var diffLi = false, // the li where the diff radio is checked
-                       oldLi = false; // the li where the oldid radio is checked
-
-               if ( !$lis.length ) {
-                       return true;
-               }
-
-               $lis
-               .removeClass( 'selected' )
-               .each( function () {
-                       var     $li = $( this ),
-                               $inputs = $li.find( 'input[type="radio"]' ),
-                               $oldidRadio = $inputs.filter( '[name="oldid"]' ).eq( 0 ),
-                               $diffRadio = $inputs.filter( '[name="diff"]' ).eq( 0 );
-
-                       if ( !$oldidRadio.length || !$diffRadio.length ) {
-                               return true;
-                       }
-
-                       if ( $oldidRadio.prop( 'checked' ) ) {
-                               oldLi = true;
-                               $li.addClass( 'selected' );
-                               $oldidRadio.css( 'visibility', 'visible' );
-                               $diffRadio.css( 'visibility', 'hidden' );
-
-                       } else if ( $diffRadio.prop( 'checked' ) ) {
-                               diffLi = true;
-                               $li.addClass( 'selected' );
-                               $oldidRadio.css( 'visibility', 'hidden' );
-                               $diffRadio.css( 'visibility', 'visible' );
-
-                       // This list item has neither checked
-                       } else {
-                               // We're below the selected radios
-                               if ( diffLi && oldLi ) {
-                                       $oldidRadio.css( 'visibility', 'visible' );
-                                       $diffRadio.css( 'visibility', 'hidden' );
-
-                               // We're between the selected radios
-                               } else if ( diffLi ) {
-                                       $diffRadio.css( 'visibility', 'visible' );
-                                       $oldidRadio.css( 'visibility', 'visible' );
-
-                               // We're above the selected radios
-                               } else {
-                                       $diffRadio.css( 'visibility', 'visible' );
-                                       $oldidRadio.css( 'visibility', 'hidden' );
-                               }
-                       }
-               } );
-
-               return true;
-       }
-
-       $lis.find( 'input[name="diff"], input[name="oldid"]' ).click( updateDiffRadios );
-
-       // Set initial state
-       updateDiffRadios();
-
-       // Prettify url output for HistoryAction submissions,
-       // to cover up action=historysubmit construction.
-
-       // Ideally we'd use e.target instead of $historySubmitter, but e.target points
-       // to the form element for submit actions, so.
-       $historyCompareForm.find( '.historysubmit' ).click( function () {
-               $historySubmitter = $( this );
-       } );
-
-       // On submit we clone the form element, remove unneeded fields in the clone
-       // that pollute the query parameter with stuff from the other "use case",
-       // and then submit the clone.
-       // Without the cloning we'd be changing the real form, which is slower, could make
-       // the page look broken for a second in slow browsers and might show the form broken
-       // again when coming back from a "next" page.
-       $historyCompareForm.submit( function ( e ) {
-               var     $copyForm, $copyRadios, $copyAction;
-
-               if ( $historySubmitter ) {
-                       $copyForm = $historyCompareForm.clone();
-                       $copyRadios = $copyForm.find( '#pagehistory > li' ).find( 'input[name="diff"], input[name="oldid"]' );
-                       $copyAction = $copyForm.find( '> [name="action"]' );
-
-                       // Remove action=historysubmit and ids[..]=..
-                       if ( $historySubmitter.hasClass( 'mw-history-compareselectedversions-button' ) ) {
-                               $copyAction.remove();
-                               $copyForm.find( 'input[name^="ids["]:checked' ).prop( 'checked', false );
-
-                       // Remove diff=&oldid=, change action=historysubmit to revisiondelete, remove revisiondelete
-                       } else if ( $historySubmitter.hasClass( 'mw-history-revisiondelete-button' ) ) {
-                               $copyRadios.remove();
-                               $copyAction.val( $historySubmitter.attr( 'name' ) );
-                               $copyForm.find( ':submit' ).remove();
-                       }
-
-                       // IE7 doesn't do submission from an off-DOM clone, so insert hidden into document first
-                       // Also remove potentially conflicting id attributes that we don't need anyway
-                       $copyForm
-                               .css( 'display', 'none' )
-                               .find( '[id]' )
-                                       .removeAttr( 'id' )
-                               .end()
-                               .insertAfter( $historyCompareForm )
-                               .submit();
-
-                       e.preventDefault();
-                       return false; // Because the submit is special, return false as well.
-               }
-
-               // Continue natural browser handling other wise
-               return true;
-       } );
-} );
diff --git a/resources/mediawiki.action/mediawiki.action.view.dblClickEdit.js b/resources/mediawiki.action/mediawiki.action.view.dblClickEdit.js
deleted file mode 100644 (file)
index 727a525..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
-/**
- * This module enables double-click-to-edit functionality.
- */
-( function ( mw, $ ) {
-       $( function () {
-               mw.util.$content.dblclick( function ( e ) {
-                       e.preventDefault();
-                       // Trigger native HTMLElement click instead of opening URL (bug 43052)
-                       $( '#ca-edit a' ).get( 0 ).click();
-               } );
-       } );
-}( mediaWiki, jQuery ) );
diff --git a/resources/mediawiki.action/mediawiki.action.view.metadata.js b/resources/mediawiki.action/mediawiki.action.view.metadata.js
deleted file mode 100644 (file)
index 21f40c5..0000000
+++ /dev/null
@@ -1,47 +0,0 @@
-/**
- * Exif metadata display for MediaWiki file uploads
- *
- * Add an expand/collapse link and collapse by default if set to
- * (with JS disabled, user will see all items)
- *
- * See also:
- * - ImagePage.php#makeMetadataTable (creates the HTML)
- * - skins/common/shared.css (hides tr.collapsable inside table.collapsed)
- */
-( function ( mw, $ ) {
-       $( function () {
-               var $row, $col, $link,
-                       showText = mw.msg( 'metadata-expand' ),
-                       hideText = mw.msg( 'metadata-collapse' ),
-                       $table = $( '#mw_metadata' ),
-                       $tbody = $table.find( 'tbody' );
-
-               if ( !$tbody.length || !$tbody.find( '.collapsable' ).length ) {
-                       return;
-               }
-
-               $row = $( '<tr class="mw-metadata-show-hide-extended"></tr>' );
-               $col = $( '<td colspan="2"></td>' );
-
-               $link = $( '<a>', {
-                       text: showText,
-                       href: '#'
-               } ).click( function () {
-                       if ( $table.hasClass( 'collapsed' ) ) {
-                               $( this ).text( hideText );
-                       } else {
-                               $( this ).text( showText );
-                       }
-                       $table.toggleClass( 'expanded collapsed' );
-                       return false;
-               } );
-
-               $col.append( $link );
-               $row.append( $col );
-               $tbody.append( $row );
-
-               // And collapse!
-               $table.addClass( 'collapsed' );
-       } );
-
-}( mediaWiki, jQuery ) );
diff --git a/resources/mediawiki.action/mediawiki.action.view.postEdit.css b/resources/mediawiki.action/mediawiki.action.view.postEdit.css
deleted file mode 100644 (file)
index be88337..0000000
+++ /dev/null
@@ -1,77 +0,0 @@
-.postedit-container {
-       margin: 0 auto;
-       position: fixed;
-       top: 0;
-       height: 0;
-       left: 50%;
-       z-index: 1000;
-       font-size: 13px;
-}
-
-.postedit-container:hover {
-       cursor: pointer;
-}
-
-.postedit {
-       position: relative;
-       top: 0.6em;
-       left: -50%;
-       padding: .6em 3.6em .6em 1.1em;
-       line-height: 1.5625em;
-       color: #626465;
-       background-color: #f4f4f4;
-       border: 1px solid #dcd9d9;
-       text-shadow: 0 0.0625em 0 rgba(255, 255, 255, 0.5);
-       border-radius: 5px;
-       -webkit-box-shadow: 0 2px 5px 0 #ccc;
-       box-shadow: 0 2px 5px 0 #ccc;
-       -webkit-transition: all 0.25s ease-in-out;
-       -moz-transition: all 0.25s ease-in-out;
-       -ms-transition: all 0.25s ease-in-out;
-       -o-transition: all 0.25s ease-in-out;
-       transition: all 0.25s ease-in-out;
-}
-
-.skin-monobook .postedit {
-       top: 6em !important;
-}
-
-.postedit-faded {
-       opacity: 0;
-}
-
-.postedit-icon {
-       padding-left: 41px; /* 25 + 8 + 8 */
-       /* like min-height, but old IE compatible and keeps text vertically aligned, too */
-       line-height: 25px;
-       background-repeat: no-repeat;
-       background-position: 8px 50%;
-}
-
-.postedit-icon-checkmark {
-       /* @embed */
-       background-image: url(images/green-checkmark.png);
-       background-position: left;
-}
-
-.postedit-close {
-       position: absolute;
-       padding: 0 .8em;
-       right: 0;
-       top: 0;
-       font-size: 1.25em;
-       font-weight: bold;
-       line-height: 2.3em;
-       color: black;
-       text-shadow: 0 0.0625em 0 white;
-       text-decoration: none;
-       opacity: 0.2;
-       filter: alpha(opacity=20);
-}
-
-.postedit-close:hover {
-       color: black;
-       text-decoration: none;
-       opacity: 0.4;
-       filter: alpha(opacity=40);
-}
diff --git a/resources/mediawiki.action/mediawiki.action.view.postEdit.js b/resources/mediawiki.action/mediawiki.action.view.postEdit.js
deleted file mode 100644 (file)
index 6e4df9f..0000000
+++ /dev/null
@@ -1,76 +0,0 @@
-( function ( mw, $ ) {
-       'use strict';
-
-       /**
-        * @event postEdit
-        * @member mw.hook
-        * @param {Object} [data] Optional data
-        * @param {string|jQuery|Array} [data.message] Message that listeners
-        *  should use when displaying notifications. String for plain text,
-        *  use array or jQuery object to pass actual nodes.
-        * @param {string|mw.user} [data.user=mw.user] User that made the edit.
-        */
-
-       /**
-        * After the listener for #postEdit removes the notification.
-        *
-        * @event postEdit_afterRemoval
-        * @member mw.hook
-        */
-
-       var config = mw.config.get( [ 'wgAction', 'wgCookiePrefix', 'wgCurRevisionId' ] ),
-               // This should match EditPage::POST_EDIT_COOKIE_KEY_PREFIX:
-               cookieKey = config.wgCookiePrefix + 'PostEditRevision' + config.wgCurRevisionId,
-               $div, id;
-
-       function showConfirmation( data ) {
-               data = data || {};
-               if ( data.message === undefined ) {
-                       data.message = $.parseHTML( mw.message( 'postedit-confirmation', data.user || mw.user ).escaped() );
-               }
-
-               $div = $(
-                       '<div class="postedit-container">' +
-                               '<div class="postedit">' +
-                                       '<div class="postedit-icon postedit-icon-checkmark postedit-content"></div>' +
-                                       '<a href="#" class="postedit-close">&times;</a>' +
-                               '</div>' +
-                       '</div>'
-               );
-
-               if ( typeof data.message === 'string' ) {
-                       $div.find( '.postedit-content' ).text( data.message );
-               } else if ( typeof data.message === 'object' ) {
-                       $div.find( '.postedit-content' ).append( data.message );
-               }
-
-               $div
-                       .click( fadeOutConfirmation )
-                       .prependTo( 'body' );
-
-               id = setTimeout( fadeOutConfirmation, 3000 );
-       }
-
-       function fadeOutConfirmation() {
-               clearTimeout( id );
-               $div.find( '.postedit' ).addClass( 'postedit postedit-faded' );
-               setTimeout( removeConfirmation, 500 );
-
-               return false;
-       }
-
-       function removeConfirmation() {
-               $div.remove();
-               mw.hook( 'postEdit.afterRemoval' ).fire();
-       }
-
-       mw.hook( 'postEdit' ).add( showConfirmation );
-
-       if ( config.wgAction === 'view' && $.cookie( cookieKey ) === '1' ) {
-               $.cookie( cookieKey, null, { path: '/' } );
-               mw.config.set( 'wgPostEdit', true );
-
-               mw.hook( 'postEdit' ).fire();
-       }
-
-} ( mediaWiki, jQuery ) );
diff --git a/resources/mediawiki.action/mediawiki.action.view.redirectToFragment.js b/resources/mediawiki.action/mediawiki.action.view.redirectToFragment.js
deleted file mode 100644 (file)
index 1e2d624..0000000
+++ /dev/null
@@ -1,35 +0,0 @@
-/**
- * JavaScript to scroll the page to an id, when a redirect with fragment is viewed.
- */
-( function ( mw, $ ) {
-       var profile = $.client.profile(),
-               fragment = mw.config.get( 'wgRedirectToFragment' );
-
-       if ( fragment === null ) {
-               // nothing to do
-               return;
-       }
-
-       if ( profile.layout === 'webkit' && profile.layoutVersion < 420 ) {
-               // Released Safari w/ WebKit 418.9.1 messes up horribly
-               // Nightlies of 420+ are ok
-               return;
-       }
-       if ( !window.location.hash ) {
-               window.location.hash = fragment;
-
-               // Mozilla needs to wait until after load, otherwise the window doesn't
-               // scroll.  See <https://bugzilla.mozilla.org/show_bug.cgi?id=516293>.
-               // There's no obvious way to detect this programmatically, so we use
-               // version-testing.  If Firefox fixes the bug, they'll jump twice, but
-               // better twice than not at all, so make the fix hit future versions as
-               // well.
-               if ( profile.layout === 'gecko' ) {
-                       $( function () {
-                               if ( window.location.hash === fragment ) {
-                                       window.location.hash = fragment;
-                               }
-                       } );
-               }
-       }
-}( mediaWiki, jQuery ) );
diff --git a/resources/mediawiki.action/mediawiki.action.view.rightClickEdit.js b/resources/mediawiki.action/mediawiki.action.view.rightClickEdit.js
deleted file mode 100644 (file)
index 93befe3..0000000
+++ /dev/null
@@ -1,26 +0,0 @@
-/**
- * JavaScript to enable right click edit functionality.
- * When the user right-clicks in a heading, it will open the
- * edit screen.
- */
-jQuery( function ( $ ) {
-       // Select all h1-h6 elements that contain editsection links
-       // Don't use the ":has:(.mw-editsection a)" selector because it performs very bad.
-       // http://jsperf.com/jq-1-7-2-vs-jq-1-8-1-performance-of-mw-has/2
-       $( document ).on( 'contextmenu', 'h1, h2, h3, h4, h5, h6', function ( e ) {
-               var $edit = $( this ).find( '.mw-editsection a' );
-               if ( !$edit.length ) {
-                       return;
-               }
-
-               // Headings can contain rich text.
-               // Make sure to not block contextmenu events on (other) anchor tags
-               // inside the heading (e.g. to do things like copy URL, open in new tab, ..).
-               // e.target can be the heading, but it can also be anything inside the heading.
-               if ( e.target.nodeName.toLowerCase() !== 'a' ) {
-                       // Trigger native HTMLElement click instead of opening URL (bug 43052)
-                       e.preventDefault();
-                       $edit.get( 0 ).click();
-               }
-       } );
-} );
diff --git a/resources/mediawiki.api/mediawiki.api.category.js b/resources/mediawiki.api/mediawiki.api.category.js
deleted file mode 100644 (file)
index a90617d..0000000
+++ /dev/null
@@ -1,146 +0,0 @@
-/**
- * @class mw.Api.plugin.category
- */
-( function ( mw, $ ) {
-
-       var msg = 'Use of mediawiki.api callback params is deprecated. Use the Promise instead.';
-       $.extend( mw.Api.prototype, {
-               /**
-                * Determine if a category exists.
-                *
-                * @param {mw.Title|string} title
-                * @param {Function} [ok] Success callback (deprecated)
-                * @param {Function} [err] Error callback (deprecated)
-                * @return {jQuery.Promise}
-                * @return {Function} return.done
-                * @return {boolean} return.done.isCategory Whether the category exists.
-                */
-               isCategory: function ( title, ok, err ) {
-                       var apiPromise = this.get( {
-                               prop: 'categoryinfo',
-                               titles: String( title )
-                       } );
-
-                       if ( ok || err ) {
-                               mw.track( 'mw.deprecate', 'api.cbParam' );
-                               mw.log.warn( msg );
-                       }
-
-                       return apiPromise
-                               .then( function ( data ) {
-                                       var exists = false;
-                                       if ( data.query && data.query.pages ) {
-                                               $.each( data.query.pages, function ( id, page ) {
-                                                       if ( page.categoryinfo ) {
-                                                               exists = true;
-                                                       }
-                                               } );
-                                       }
-                                       return exists;
-                               } )
-                               .done( ok )
-                               .fail( err )
-                               .promise( { abort: apiPromise.abort } );
-               },
-
-               /**
-                * Get a list of categories that match a certain prefix.
-                *
-                * E.g. given "Foo", return "Food", "Foolish people", "Foosball tables"...
-                *
-                * @param {string} prefix Prefix to match.
-                * @param {Function} [ok] Success callback (deprecated)
-                * @param {Function} [err] Error callback (deprecated)
-                * @return {jQuery.Promise}
-                * @return {Function} return.done
-                * @return {string[]} return.done.categories Matched categories
-                */
-               getCategoriesByPrefix: function ( prefix, ok, err ) {
-                       // Fetch with allpages to only get categories that have a corresponding description page.
-                       var apiPromise = this.get( {
-                               list: 'allpages',
-                               apprefix: prefix,
-                               apnamespace: mw.config.get( 'wgNamespaceIds' ).category
-                       } );
-
-                       if ( ok || err ) {
-                               mw.track( 'mw.deprecate', 'api.cbParam' );
-                               mw.log.warn( msg );
-                       }
-
-                       return apiPromise
-                               .then( function ( data ) {
-                                       var texts = [];
-                                       if ( data.query && data.query.allpages ) {
-                                               $.each( data.query.allpages, function ( i, category ) {
-                                                       texts.push( new mw.Title( category.title ).getNameText() );
-                                               } );
-                                       }
-                                       return texts;
-                               } )
-                               .done( ok )
-                               .fail( err )
-                               .promise( { abort: apiPromise.abort } );
-               },
-
-               /**
-                * Get the categories that a particular page on the wiki belongs to.
-                *
-                * @param {mw.Title|string} title
-                * @param {Function} [ok] Success callback (deprecated)
-                * @param {Function} [err] Error callback (deprecated)
-                * @param {boolean} [async=true] Asynchronousness (deprecated)
-                * @return {jQuery.Promise}
-                * @return {Function} return.done
-                * @return {boolean|mw.Title[]} return.done.categories List of category titles or false
-                *  if title was not found.
-                */
-               getCategories: function ( title, ok, err, async ) {
-                       var apiPromise = this.get( {
-                               prop: 'categories',
-                               titles: String( title )
-                       }, {
-                               async: async === undefined ? true : async
-                       } );
-
-                       if ( ok || err ) {
-                               mw.track( 'mw.deprecate', 'api.cbParam' );
-                               mw.log.warn( msg );
-                       }
-                       if ( async !== undefined ) {
-                               mw.track( 'mw.deprecate', 'api.async' );
-                               mw.log.warn(
-                                       'Use of mediawiki.api async=false param is deprecated. ' +
-                                       'The sychronous mode will be removed in the future.'
-                               );
-                       }
-
-                       return apiPromise
-                               .then( function ( data ) {
-                                       var titles = false;
-                                       if ( data.query && data.query.pages ) {
-                                               $.each( data.query.pages, function ( id, page ) {
-                                                       if ( page.categories ) {
-                                                               if ( titles === false ) {
-                                                                       titles = [];
-                                                               }
-                                                               $.each( page.categories, function ( i, cat ) {
-                                                                       titles.push( new mw.Title( cat.title ) );
-                                                               } );
-                                                       }
-                                               } );
-                                       }
-                                       return titles;
-                               } )
-                               .done( ok )
-                               .fail( err )
-                               .promise( { abort: apiPromise.abort } );
-               }
-       } );
-
-       /**
-        * @class mw.Api
-        * @mixins mw.Api.plugin.category
-        */
-
-}( mediaWiki, jQuery ) );
diff --git a/resources/mediawiki.api/mediawiki.api.edit.js b/resources/mediawiki.api/mediawiki.api.edit.js
deleted file mode 100644 (file)
index edfb34a..0000000
+++ /dev/null
@@ -1,75 +0,0 @@
-/**
- * @class mw.Api.plugin.edit
- */
-( function ( mw, $ ) {
-
-       var msg = 'Use of mediawiki.api callback params is deprecated. Use the Promise instead.';
-       $.extend( mw.Api.prototype, {
-
-               /**
-                * Post to API with edit token. If we have no token, get one and try to post.
-                * If we have a cached token try using that, and if it fails, blank out the
-                * cached token and start over.
-                *
-                * @param {Object} params API parameters
-                * @param {Function} [ok] Success callback (deprecated)
-                * @param {Function} [err] Error callback (deprecated)
-                * @return {jQuery.Promise} See #post
-                */
-               postWithEditToken: function ( params, ok, err ) {
-                       if ( ok || err ) {
-                               mw.track( 'mw.deprecate', 'api.cbParam' );
-                               mw.log.warn( msg );
-                       }
-                       return this.postWithToken( 'edit', params ).done( ok ).fail( err );
-               },
-
-               /**
-                * Api helper to grab an edit token.
-                *
-                * @param {Function} [ok] Success callback (deprecated)
-                * @param {Function} [err] Error callback (deprecated)
-                * @return {jQuery.Promise}
-                * @return {Function} return.done
-                * @return {string} return.done.token Received token.
-                */
-               getEditToken: function ( ok, err ) {
-                       if ( ok || err ) {
-                               mw.track( 'mw.deprecate', 'api.cbParam' );
-                               mw.log.warn( msg );
-                       }
-                       return this.getToken( 'edit' ).done( ok ).fail( err );
-               },
-
-               /**
-                * Create a new section of the page.
-                * @see #postWithEditToken
-                * @param {mw.Title|String} title Target page
-                * @param {string} header
-                * @param {string} message wikitext message
-                * @param {Function} [ok] Success handler (deprecated)
-                * @param {Function} [err] Error handler (deprecated)
-                * @return {jQuery.Promise}
-                */
-               newSection: function ( title, header, message, ok, err ) {
-                       if ( ok || err ) {
-                               mw.track( 'mw.deprecate', 'api.cbParam' );
-                               mw.log.warn( msg );
-                       }
-                       return this.postWithEditToken( {
-                               action: 'edit',
-                               section: 'new',
-                               format: 'json',
-                               title: String( title ),
-                               summary: header,
-                               text: message
-                       } ).done( ok ).fail( err );
-               }
-       } );
-
-       /**
-        * @class mw.Api
-        * @mixins mw.Api.plugin.edit
-        */
-
-}( mediaWiki, jQuery ) );
diff --git a/resources/mediawiki.api/mediawiki.api.js b/resources/mediawiki.api/mediawiki.api.js
deleted file mode 100644 (file)
index 04919d3..0000000
+++ /dev/null
@@ -1,324 +0,0 @@
-( function ( mw, $ ) {
-
-       // We allow people to omit these default parameters from API requests
-       // there is very customizable error handling here, on a per-call basis
-       // wondering, would it be simpler to make it easy to clone the api object,
-       // change error handling, and use that instead?
-       var defaultOptions = {
-
-                       // Query parameters for API requests
-                       parameters: {
-                               action: 'query',
-                               format: 'json'
-                       },
-
-                       // Ajax options for jQuery.ajax()
-                       ajax: {
-                               url: mw.util.wikiScript( 'api' ),
-
-                               timeout: 30 * 1000, // 30 seconds
-
-                               dataType: 'json'
-                       }
-               },
-               tokenCache = {};
-
-       /**
-        * Constructor to create an object to interact with the API of a particular MediaWiki server.
-        * mw.Api objects represent the API of a particular MediaWiki server.
-        *
-        * TODO: Share API objects with exact same config.
-        *
-        *     var api = new mw.Api();
-        *     api.get( {
-        *         action: 'query',
-        *         meta: 'userinfo'
-        *     } ).done ( function ( data ) {
-        *         console.log( data );
-        *     } );
-        *
-        * @class
-        *
-        * @constructor
-        * @param {Object} options See defaultOptions documentation above. Ajax options can also be
-        *  overridden for each individual request to {@link jQuery#ajax} later on.
-        */
-       mw.Api = function ( options ) {
-
-               if ( options === undefined ) {
-                       options = {};
-               }
-
-               // Force a string if we got a mw.Uri object
-               if ( options.ajax && options.ajax.url !== undefined ) {
-                       options.ajax.url = String( options.ajax.url );
-               }
-
-               options.parameters = $.extend( {}, defaultOptions.parameters, options.parameters );
-               options.ajax = $.extend( {}, defaultOptions.ajax, options.ajax );
-
-               this.defaults = options;
-       };
-
-       mw.Api.prototype = {
-
-               /**
-                * Normalize the ajax options for compatibility and/or convenience methods.
-                *
-                * @param {Object} [arg] An object contaning one or more of options.ajax.
-                * @return {Object} Normalized ajax options.
-                */
-               normalizeAjaxOptions: function ( arg ) {
-                       // Arg argument is usually empty
-                       // (before MW 1.20 it was used to pass ok callbacks)
-                       var opts = arg || {};
-                       // Options can also be a success callback handler
-                       if ( typeof arg === 'function' ) {
-                               opts = { ok: arg };
-                       }
-                       return opts;
-               },
-
-               /**
-                * Perform API get request
-                *
-                * @param {Object} parameters
-                * @param {Object|Function} [ajaxOptions]
-                * @return {jQuery.Promise}
-                */
-               get: function ( parameters, ajaxOptions ) {
-                       ajaxOptions = this.normalizeAjaxOptions( ajaxOptions );
-                       ajaxOptions.type = 'GET';
-                       return this.ajax( parameters, ajaxOptions );
-               },
-
-               /**
-                * Perform API post request
-                *
-                * TODO: Post actions for non-local hostnames will need proxy.
-                *
-                * @param {Object} parameters
-                * @param {Object|Function} [ajaxOptions]
-                * @return {jQuery.Promise}
-                */
-               post: function ( parameters, ajaxOptions ) {
-                       ajaxOptions = this.normalizeAjaxOptions( ajaxOptions );
-                       ajaxOptions.type = 'POST';
-                       return this.ajax( parameters, ajaxOptions );
-               },
-
-               /**
-                * Perform the API call.
-                *
-                * @param {Object} parameters
-                * @param {Object} [ajaxOptions]
-                * @return {jQuery.Promise} Done: API response data and the jqXHR object.
-                *  Fail: Error code
-                */
-               ajax: function ( parameters, ajaxOptions ) {
-                       var token,
-                               apiDeferred = $.Deferred(),
-                               msg = 'Use of mediawiki.api callback params is deprecated. Use the Promise instead.',
-                               xhr;
-
-                       parameters = $.extend( {}, this.defaults.parameters, parameters );
-                       ajaxOptions = $.extend( {}, this.defaults.ajax, ajaxOptions );
-
-                       // Ensure that token parameter is last (per [[mw:API:Edit#Token]]).
-                       if ( parameters.token ) {
-                               token = parameters.token;
-                               delete parameters.token;
-                       }
-                       // Some deployed MediaWiki >= 1.17 forbid periods in URLs, due to an IE XSS bug
-                       // So let's escape them here. See bug #28235
-                       // This works because jQuery accepts data as a query string or as an Object
-                       ajaxOptions.data = $.param( parameters ).replace( /\./g, '%2E' );
-
-                       // If we extracted a token parameter, add it back in.
-                       if ( token ) {
-                               ajaxOptions.data += '&token=' + encodeURIComponent( token );
-                       }
-
-                       // Backwards compatibility: Before MediaWiki 1.20,
-                       // callbacks were done with the 'ok' and 'err' property in ajaxOptions.
-                       if ( ajaxOptions.ok ) {
-                               mw.track( 'mw.deprecate', 'api.cbParam' );
-                               mw.log.warn( msg );
-                               apiDeferred.done( ajaxOptions.ok );
-                               delete ajaxOptions.ok;
-                       }
-                       if ( ajaxOptions.err ) {
-                               mw.track( 'mw.deprecate', 'api.cbParam' );
-                               mw.log.warn( msg );
-                               apiDeferred.fail( ajaxOptions.err );
-                               delete ajaxOptions.err;
-                       }
-
-                       // Make the AJAX request
-                       xhr = $.ajax( ajaxOptions )
-                               // If AJAX fails, reject API call with error code 'http'
-                               // and details in second argument.
-                               .fail( function ( xhr, textStatus, exception ) {
-                                       apiDeferred.reject( 'http', {
-                                               xhr: xhr,
-                                               textStatus: textStatus,
-                                               exception: exception
-                                       } );
-                               } )
-                               // AJAX success just means "200 OK" response, also check API error codes
-                               .done( function ( result, textStatus, jqXHR ) {
-                                       if ( result === undefined || result === null || result === '' ) {
-                                               apiDeferred.reject( 'ok-but-empty',
-                                                       'OK response but empty result (check HTTP headers?)'
-                                               );
-                                       } else if ( result.error ) {
-                                               var code = result.error.code === undefined ? 'unknown' : result.error.code;
-                                               apiDeferred.reject( code, result );
-                                       } else {
-                                               apiDeferred.resolve( result, jqXHR );
-                                       }
-                               } );
-
-                       // Return the Promise
-                       return apiDeferred.promise( { abort: xhr.abort } ).fail( function ( code, details ) {
-                               mw.log( 'mw.Api error: ', code, details );
-                       } );
-               },
-
-               /**
-                * Post to API with specified type of token. If we have no token, get one and try to post.
-                * If we have a cached token try using that, and if it fails, blank out the
-                * cached token and start over. For example to change an user option you could do:
-                *
-                *     new mw.Api().postWithToken( 'options', {
-                *         action: 'options',
-                *         optionname: 'gender',
-                *         optionvalue: 'female'
-                *     } );
-                *
-                * @param {string} tokenType The name of the token, like options or edit.
-                * @param {Object} params API parameters
-                * @return {jQuery.Promise} See #post
-                * @since 1.22
-                */
-               postWithToken: function ( tokenType, params ) {
-                       var api = this, hasOwn = tokenCache.hasOwnProperty;
-                       if ( hasOwn.call( tokenCache, tokenType ) && tokenCache[tokenType] !== undefined ) {
-                               params.token = tokenCache[tokenType];
-                               return api.post( params ).then(
-                                       null,
-                                       function ( code ) {
-                                               if ( code === 'badtoken' ) {
-                                                       // force a new token, clear any old one
-                                                       tokenCache[tokenType] = params.token = undefined;
-                                                       return api.post( params );
-                                               }
-                                               // Pass the promise forward, so the caller gets error codes
-                                               return this;
-                                       }
-                               );
-                       } else {
-                               return api.getToken( tokenType ).then( function ( token ) {
-                                       tokenCache[tokenType] = params.token = token;
-                                       return api.post( params );
-                               } );
-                       }
-               },
-
-               /**
-                * Api helper to grab any token.
-                *
-                * @param {string} type Token type.
-                * @return {jQuery.Promise}
-                * @return {Function} return.done
-                * @return {string} return.done.token Received token.
-                * @since 1.22
-                */
-               getToken: function ( type ) {
-                       var apiPromise,
-                               d = $.Deferred();
-
-                       apiPromise = this.get( {
-                                       action: 'tokens',
-                                       type: type
-                               } )
-                               .done( function ( data ) {
-                                       // If token type is not available for this user,
-                                       // key '...token' is missing or can contain Boolean false
-                                       if ( data.tokens && data.tokens[type + 'token'] ) {
-                                               d.resolve( data.tokens[type + 'token'] );
-                                       } else {
-                                               d.reject( 'token-missing', data );
-                                       }
-                               } )
-                               .fail( d.reject );
-
-                       return d.promise( { abort: apiPromise.abort } );
-               }
-       };
-
-       /**
-        * @static
-        * @property {Array}
-        * List of errors we might receive from the API.
-        * For now, this just documents our expectation that there should be similar messages
-        * available.
-        */
-       mw.Api.errors = [
-               // occurs when POST aborted
-               // jQuery 1.4 can't distinguish abort or lost connection from 200 OK + empty result
-               'ok-but-empty',
-
-               // timeout
-               'timeout',
-
-               // really a warning, but we treat it like an error
-               'duplicate',
-               'duplicate-archive',
-
-               // upload succeeded, but no image info.
-               // this is probably impossible, but might as well check for it
-               'noimageinfo',
-               // remote errors, defined in API
-               'uploaddisabled',
-               'nomodule',
-               'mustbeposted',
-               'badaccess-groups',
-               'stashfailed',
-               'missingresult',
-               'missingparam',
-               'invalid-file-key',
-               'copyuploaddisabled',
-               'mustbeloggedin',
-               'empty-file',
-               'file-too-large',
-               'filetype-missing',
-               'filetype-banned',
-               'filetype-banned-type',
-               'filename-tooshort',
-               'illegal-filename',
-               'verification-error',
-               'hookaborted',
-               'unknown-error',
-               'internal-error',
-               'overwrite',
-               'badtoken',
-               'fetchfileerror',
-               'fileexists-shared-forbidden',
-               'invalidtitle',
-               'notloggedin'
-       ];
-
-       /**
-        * @static
-        * @property {Array}
-        * List of warnings we might receive from the API.
-        * For now, this just documents our expectation that there should be similar messages
-        * available.
-        */
-       mw.Api.warnings = [
-               'duplicate',
-               'exists'
-       ];
-
-}( mediaWiki, jQuery ) );
diff --git a/resources/mediawiki.api/mediawiki.api.login.js b/resources/mediawiki.api/mediawiki.api.login.js
deleted file mode 100644 (file)
index ccbae06..0000000
+++ /dev/null
@@ -1,54 +0,0 @@
-/**
- * Make the two-step login easier.
- * @author Niklas Laxström
- * @class mw.Api.plugin.login
- * @since 1.22
- */
-( function ( mw, $ ) {
-       'use strict';
-
-       $.extend( mw.Api.prototype, {
-               /**
-                * @param {string} username
-                * @param {string} password
-                * @return {jQuery.Promise} See mw.Api#post
-                */
-               login: function ( username, password ) {
-                       var params, request,
-                               deferred = $.Deferred(),
-                               api = this;
-
-                       params = {
-                               action: 'login',
-                               lgname: username,
-                               lgpassword: password
-                       };
-
-                       request = api.post( params );
-                       request.fail( deferred.reject );
-                       request.done( function ( data ) {
-                               params.lgtoken = data.login.token;
-                               api.post( params )
-                                       .fail( deferred.reject )
-                                       .done( function ( data ) {
-                                               var code;
-                                               if ( data.login && data.login.result === 'Success' ) {
-                                                       deferred.resolve( data );
-                                               } else {
-                                                       // Set proper error code whenever possible
-                                                       code = data.error && data.error.code || 'unknown';
-                                                       deferred.reject( code, data );
-                                               }
-                                       } );
-                       } );
-
-                       return deferred.promise( { abort: request.abort } );
-               }
-       } );
-
-       /**
-        * @class mw.Api
-        * @mixins mw.Api.plugin.login
-        */
-
-}( mediaWiki, jQuery ) );
diff --git a/resources/mediawiki.api/mediawiki.api.parse.js b/resources/mediawiki.api/mediawiki.api.parse.js
deleted file mode 100644 (file)
index b1f1d2b..0000000
+++ /dev/null
@@ -1,45 +0,0 @@
-/**
- * @class mw.Api.plugin.parse
- */
-( function ( mw, $ ) {
-
-       $.extend( mw.Api.prototype, {
-               /**
-                * Convenience method for 'action=parse'.
-                *
-                * @param {string} wikitext
-                * @param {Function} [ok] Success callback (deprecated)
-                * @param {Function} [err] Error callback (deprecated)
-                * @return {jQuery.Promise}
-                * @return {Function} return.done
-                * @return {string} return.done.data Parsed HTML of `wikitext`.
-                */
-               parse: function ( wikitext, ok, err ) {
-                       var apiPromise = this.get( {
-                               action: 'parse',
-                               contentmodel: 'wikitext',
-                               text: wikitext
-                       } );
-
-                       // Backwards compatibility (< MW 1.20)
-                       if ( ok || err ) {
-                               mw.track( 'mw.deprecate', 'api.cbParam' );
-                               mw.log.warn( 'Use of mediawiki.api callback params is deprecated. Use the Promise instead.' );
-                       }
-
-                       return apiPromise
-                               .then( function ( data ) {
-                                       return data.parse.text['*'];
-                               } )
-                               .done( ok )
-                               .fail( err )
-                               .promise( { abort: apiPromise.abort } );
-               }
-       } );
-
-       /**
-        * @class mw.Api
-        * @mixins mw.Api.plugin.parse
-        */
-
-}( mediaWiki, jQuery ) );
diff --git a/resources/mediawiki.api/mediawiki.api.watch.js b/resources/mediawiki.api/mediawiki.api.watch.js
deleted file mode 100644 (file)
index aa33d86..0000000
+++ /dev/null
@@ -1,80 +0,0 @@
-/**
- * @class mw.Api.plugin.watch
- * @since 1.19
- */
-( function ( mw, $ ) {
-
-       /**
-        * @private
-        * @static
-        * @context mw.Api
-        *
-        * @param {string|mw.Title|string[]|mw.Title[]} pages Full page name or instance of mw.Title, or an
-        *  array thereof. If an array is passed, the return value passed to the promise will also be an
-        *  array of appropriate objects.
-        * @param {Function} [ok] Success callback (deprecated)
-        * @param {Function} [err] Error callback (deprecated)
-        * @return {jQuery.Promise}
-        * @return {Function} return.done
-        * @return {Object|Object[]} return.done.watch Object or list of objects (depends on the `pages`
-        *  parameter)
-        * @return {string} return.done.watch.title Full pagename
-        * @return {boolean} return.done.watch.watched Whether the page is now watched or unwatched
-        * @return {string} return.done.watch.message Parsed HTML of the confirmational interface message
-        */
-       function doWatchInternal( pages, ok, err, addParams ) {
-               // XXX: Parameter addParams is undocumented because we inherit this
-               // documentation in the public method...
-               var apiPromise = this.post(
-                       $.extend(
-                               {
-                                       action: 'watch',
-                                       titles: $.isArray( pages ) ? pages.join( '|' ) : String( pages ),
-                                       token: mw.user.tokens.get( 'watchToken' ),
-                                       uselang: mw.config.get( 'wgUserLanguage' )
-                               },
-                               addParams
-                       )
-               );
-
-               // Backwards compatibility (< MW 1.20)
-               if ( ok || err ) {
-                       mw.track( 'mw.deprecate', 'api.cbParam' );
-                       mw.log.warn( 'Use of mediawiki.api callback params is deprecated. Use the Promise instead.' );
-               }
-
-               return apiPromise
-                       .then( function ( data ) {
-                               // If a single page was given (not an array) respond with a single item as well.
-                               return $.isArray( pages ) ? data.watch : data.watch[0];
-                       } )
-                       .done( ok )
-                       .fail( err )
-                       .promise( { abort: apiPromise.abort } );
-       }
-
-       $.extend( mw.Api.prototype, {
-               /**
-                * Convenience method for `action=watch`.
-                *
-                * @inheritdoc #doWatchInternal
-                */
-               watch: function ( pages, ok, err ) {
-                       return doWatchInternal.call( this, pages, ok, err );
-               },
-               /**
-                * Convenience method for `action=watch&unwatch=1`.
-                *
-                * @inheritdoc #doWatchInternal
-                */
-               unwatch: function ( pages, ok, err ) {
-                       return doWatchInternal.call( this, pages, ok, err, { unwatch: 1 } );
-               }
-       } );
-
-       /**
-        * @class mw.Api
-        * @mixins mw.Api.plugin.watch
-        */
-
-}( mediaWiki, jQuery ) );
diff --git a/resources/mediawiki.language/languages/bs.js b/resources/mediawiki.language/languages/bs.js
deleted file mode 100644 (file)
index b56e4b2..0000000
+++ /dev/null
@@ -1,19 +0,0 @@
-/*!
- * Bosnian (bosanski) language functions
- */
-
-mediaWiki.language.convertGrammar = function ( word, form ) {
-       var grammarForms = mediaWiki.language.getData( 'bs', 'grammarForms' );
-       if ( grammarForms && grammarForms[form] ) {
-               return grammarForms[form][word];
-       }
-       switch ( form ) {
-               case 'instrumental': // instrumental
-                       word = 's ' + word;
-                       break;
-               case 'lokativ': // locative
-                       word = 'o ' + word;
-                       break;
-       }
-       return word;
-};
diff --git a/resources/mediawiki.language/languages/dsb.js b/resources/mediawiki.language/languages/dsb.js
deleted file mode 100644 (file)
index 69c36cc..0000000
+++ /dev/null
@@ -1,19 +0,0 @@
-/*!
- * Lower Sorbian (Dolnoserbski) language functions
- */
-
-mediaWiki.language.convertGrammar = function ( word, form ) {
-       var grammarForms = mediaWiki.language.getData( 'dsb', 'grammarForms' );
-       if ( grammarForms && grammarForms[form] ) {
-               return grammarForms[form][word];
-       }
-       switch ( form ) {
-               case 'instrumental': // instrumental
-                       word = 'z ' + word;
-                       break;
-               case 'lokatiw': // lokatiw
-                       word = 'wo ' + word;
-                       break;
-       }
-       return word;
-};
diff --git a/resources/mediawiki.language/languages/fi.js b/resources/mediawiki.language/languages/fi.js
deleted file mode 100644 (file)
index 2382aae..0000000
+++ /dev/null
@@ -1,47 +0,0 @@
-/*!
- * Finnish (Suomi) language functions
- * @author Santhosh Thottingal
- */
-
-mediaWiki.language.convertGrammar = function ( word, form ) {
-       var grammarForms, aou, origWord;
-
-       grammarForms = mediaWiki.language.getData( 'fi', 'grammarForms' );
-       if ( grammarForms && grammarForms[form] ) {
-               return grammarForms[form][word];
-       }
-
-       // vowel harmony flag
-       aou = word.match( /[aou][^äöy]*$/i );
-       origWord = word;
-       if ( word.match( /wiki$/i ) ) {
-               aou = false;
-       }
-       //append i after final consonant
-       if ( word.match( /[bcdfghjklmnpqrstvwxz]$/i ) ) {
-               word += 'i';
-       }
-
-       switch ( form ) {
-               case 'genitive':
-                       word += 'n';
-                       break;
-               case 'elative':
-                       word += ( aou ? 'sta' : 'stä' );
-                       break;
-               case 'partitive':
-                       word += ( aou ? 'a' : 'ä' );
-                       break;
-               case 'illative':
-                       // Double the last letter and add 'n'
-                       word += word.substr(  word.length - 1 ) + 'n';
-                       break;
-               case 'inessive':
-                       word += ( aou ? 'ssa' : 'ssä' );
-                       break;
-               default:
-                       word = origWord;
-                       break;
-       }
-       return word;
-};
diff --git a/resources/mediawiki.language/languages/ga.js b/resources/mediawiki.language/languages/ga.js
deleted file mode 100644 (file)
index fb4e939..0000000
+++ /dev/null
@@ -1,38 +0,0 @@
-/*!
- * Irish (Gaeilge) language functions
- */
-
-mediaWiki.language.convertGrammar = function ( word, form ) {
-       /*jshint onecase:true */
-       var grammarForms = mediaWiki.language.getData( 'ga', 'grammarForms' );
-       if ( grammarForms && grammarForms[form] ) {
-               return grammarForms[form][word];
-       }
-       switch ( form ) {
-               case 'ainmlae':
-                       switch ( word ) {
-                               case 'an Domhnach':
-                                       word = 'Dé Domhnaigh';
-                                       break;
-                               case 'an Luan':
-                                       word = 'Dé Luain';
-                                       break;
-                               case 'an Mháirt':
-                                       word = 'Dé Mháirt';
-                                       break;
-                               case 'an Chéadaoin':
-                                       word = 'Dé Chéadaoin';
-                                       break;
-                               case 'an Déardaoin':
-                                       word = 'Déardaoin';
-                                       break;
-                               case 'an Aoine':
-                                       word = 'Dé hAoine';
-                                       break;
-                               case 'an Satharn':
-                                       word = 'Dé Sathairn';
-                                       break;
-                       }
-       }
-       return word;
-};
diff --git a/resources/mediawiki.language/languages/he.js b/resources/mediawiki.language/languages/he.js
deleted file mode 100644 (file)
index 486e993..0000000
+++ /dev/null
@@ -1,29 +0,0 @@
-/*!
- * Hebrew (עברית) language functions
- */
-
-mediaWiki.language.convertGrammar = function ( word, form ) {
-       var grammarForms = mediaWiki.language.getData( 'he', 'grammarForms' );
-       if ( grammarForms && grammarForms[form] ) {
-               return grammarForms[form][word];
-       }
-       switch ( form ) {
-               case 'prefixed':
-               case 'תחילית': // the same word in Hebrew
-                       // Duplicate prefixed "Waw", but only if it's not already double
-                       if ( word.substr( 0, 1 ) === 'ו' && word.substr( 0, 2 ) !== 'וו' ) {
-                               word = 'ו' + word;
-                       }
-
-                       // Remove the "He" if prefixed
-                       if ( word.substr( 0, 1 ) === 'ה' ) {
-                               word = word.substr( 1, word.length );
-                       }
-
-                       // Add a hyphen (maqaf) before numbers and non-Hebrew letters
-                       if (  word.substr( 0, 1 ) < 'א' ||  word.substr( 0, 1 ) > 'ת' ) {
-                               word = '־' + word;
-                       }
-       }
-       return word;
-};
diff --git a/resources/mediawiki.language/languages/hsb.js b/resources/mediawiki.language/languages/hsb.js
deleted file mode 100644 (file)
index 2d6b733..0000000
+++ /dev/null
@@ -1,19 +0,0 @@
-/*!
- * Upper Sorbian (Hornjoserbsce) language functions
- */
-
-mediaWiki.language.convertGrammar = function ( word, form ) {
-       var grammarForms = mediaWiki.language.getData( 'hsb', 'grammarForms' );
-       if ( grammarForms && grammarForms[form] ) {
-               return grammarForms[form][word];
-       }
-       switch ( form ) {
-               case 'instrumental': // instrumental
-                       word = 'z ' + word;
-                       break;
-               case 'lokatiw': // lokatiw
-                       word = 'wo ' + word;
-                       break;
-               }
-       return word;
-};
diff --git a/resources/mediawiki.language/languages/hu.js b/resources/mediawiki.language/languages/hu.js
deleted file mode 100644 (file)
index d72a1c0..0000000
+++ /dev/null
@@ -1,23 +0,0 @@
-/*!
- * Hungarian language functions
- * @author Santhosh Thottingal
- */
-
-mediaWiki.language.convertGrammar = function ( word, form ) {
-       var grammarForms = mediaWiki.language.getData( 'hu', 'grammarForms' );
-       if ( grammarForms && grammarForms[form] ) {
-               return grammarForms[form][word];
-       }
-       switch ( form ) {
-               case 'rol':
-                       word += 'ról';
-                       break;
-               case 'ba':
-                       word += 'ba';
-                       break;
-               case 'k':
-                       word += 'k';
-                       break;
-       }
-       return word;
-};
diff --git a/resources/mediawiki.language/languages/hy.js b/resources/mediawiki.language/languages/hy.js
deleted file mode 100644 (file)
index ae16f24..0000000
+++ /dev/null
@@ -1,29 +0,0 @@
-/*!
- * Armenian (Հայերեն) language functions
- */
-
-mediaWiki.language.convertGrammar = function ( word, form ) {
-       /*jshint onecase:true */
-       var grammarForms = mediaWiki.language.getData( 'hy', 'grammarForms' );
-       if ( grammarForms && grammarForms[form] ) {
-               return grammarForms[form][word];
-       }
-
-       // These rules are not perfect, but they are currently only used for site names so it doesn't
-       // matter if they are wrong sometimes. Just add a special case for your site name if necessary.
-
-       switch ( form ) {
-               case 'genitive': // սեռական հոլով
-                       if ( word.substr( -1 ) === 'ա' ) {
-                               word = word.substr( 0, word.length - 1 ) + 'այի';
-                       } else if ( word.substr( -1 ) === 'ո' ) {
-                               word = word.substr( 0, word.length - 1 ) + 'ոյի';
-                       } else if ( word.substr( -4 ) === 'գիրք' ) {
-                               word = word.substr( 0, word.length - 4 ) + 'գրքի';
-                       } else {
-                               word = word + 'ի';
-                       }
-                       break;
-               }
-       return word;
-};
diff --git a/resources/mediawiki.language/languages/la.js b/resources/mediawiki.language/languages/la.js
deleted file mode 100644 (file)
index 04b7d0a..0000000
+++ /dev/null
@@ -1,50 +0,0 @@
-/*!
- * Latin (lingua Latina) language functions
- * @author Santhosh Thottingal
- */
-
-mediaWiki.language.convertGrammar = function ( word, form ) {
-       var grammarForms = mediaWiki.language.getData( 'la', 'grammarForms' );
-       if ( grammarForms && grammarForms[form] ) {
-               return grammarForms[form][word];
-       }
-       switch ( form ) {
-               case 'genitive':
-                       // only a few declensions, and even for those mostly the singular only
-                       word = word.replace( /u[ms]$/i, 'i' ); // 2nd declension singular
-                       word = word.replace( /ommunia$/i, 'ommunium' ); // 3rd declension neuter plural (partly)
-                       word = word.replace( /a$/i, 'ae' ); // 1st declension singular
-                       word = word.replace( /libri$/i,'librorum' ); // 2nd declension plural (partly)
-                       word = word.replace( /nuntii$/i, 'nuntiorum' ); // 2nd declension plural (partly)
-                       word = word.replace( /tio$/i,'tionis' ); // 3rd declension singular (partly)
-                       word = word.replace( /ns$/i, 'ntis' );
-                       word = word.replace( /as$/i, 'atis' );
-                       word = word.replace( /es$/i, 'ei' ); // 5th declension singular
-                       break;
-               case 'accusative':
-                       // only a few declensions, and even for those mostly the singular only
-                       word = word.replace( /u[ms]$/i, 'um' ); // 2nd declension singular
-                       word = word.replace( /ommunia$/i, 'am' ); // 3rd declension neuter plural (partly)
-                       word = word.replace( /a$/i, 'ommunia' ); // 1st declension singular
-                       word = word.replace( /libri$/i,'libros' ); // 2nd declension plural (partly)
-                       word = word.replace( /nuntii$/i, 'nuntios' );// 2nd declension plural (partly)
-                       word = word.replace( /tio$/i,'tionem' ); // 3rd declension singular (partly)
-                       word = word.replace( /ns$/i, 'ntem' );
-                       word = word.replace( /as$/i, 'atem');
-                       word = word.replace( /es$/i, 'em' ); // 5th declension singular
-                       break;
-               case 'ablative':
-                       // only a few declensions, and even for those mostly the singular only
-                       word = word.replace( /u[ms]$/i, 'o' ); // 2nd declension singular
-                       word = word.replace( /ommunia$/i, 'ommunibus' ); // 3rd declension neuter plural (partly)
-                       word = word.replace( /a$/i, 'a' ); // 1st declension singular
-                       word = word.replace( /libri$/i,'libris' ); // 2nd declension plural (partly)
-                       word = word.replace( /nuntii$/i, 'nuntiis' ); // 2nd declension plural (partly)
-                       word = word.replace( /tio$/i,'tione' ); // 3rd declension singular (partly)
-                       word = word.replace( /ns$/i, 'nte' );
-                       word = word.replace( /as$/i, 'ate');
-                       word = word.replace( /es$/i, 'e' ); // 5th declension singular
-                       break;
-       }
-       return word;
-};
diff --git a/resources/mediawiki.language/languages/os.js b/resources/mediawiki.language/languages/os.js
deleted file mode 100644 (file)
index bdf59be..0000000
+++ /dev/null
@@ -1,69 +0,0 @@
-/*!
- * Ossetian (Ирон) language functions
- * @author Santhosh Thottingal
- */
-
-mediaWiki.language.convertGrammar = function ( word, form ) {
-       var grammarForms = mediaWiki.language.getData( 'os', 'grammarForms' ),
-               // Ending for allative case
-               endAllative = 'мæ',
-               // Variable for 'j' beetwen vowels
-               jot = '',
-               // Variable for "-" for not Ossetic words
-               hyphen = '',
-               // Variable for ending
-               ending = '';
-
-       if ( grammarForms && grammarForms[form] ) {
-               return grammarForms[form][word];
-       }
-       // Checking if the $word is in plural form
-       if ( word.match( /тæ$/i ) ) {
-               word = word.substring( 0, word.length - 1 );
-               endAllative = 'æм';
-       }
-       // Works if word is in singular form.
-       // Checking if word ends on one of the vowels: е, ё, и, о, ы, э, ю, я.
-       else if ( word.match( /[аæеёиоыэюя]$/i ) ) {
-               jot = 'й';
-       }
-       // Checking if word ends on 'у'. 'У' can be either consonant 'W' or vowel 'U' in cyrillic Ossetic.
-       // Examples: {{grammar:genitive|аунеу}} = аунеуы, {{grammar:genitive|лæппу}} = лæппуйы.
-       else if ( word.match( /у$/i ) ) {
-               if ( !word.substring( word.length - 2, word.length - 1 ).match( /[аæеёиоыэюя]$/i ) ) {
-                       jot = 'й';
-               }
-       } else if ( !word.match( /[бвгджзйклмнопрстфхцчшщьъ]$/i ) ) {
-               hyphen = '-';
-       }
-
-       switch ( form ) {
-               case 'genitive':
-                       ending = hyphen + jot + 'ы';
-                       break;
-               case 'dative':
-                       ending = hyphen + jot + 'æн';
-                       break;
-               case 'allative':
-                       ending = hyphen + endAllative;
-                       break;
-               case 'ablative':
-                       if ( jot === 'й' ) {
-                               ending = hyphen + jot + 'æ';
-                       }
-                       else {
-                               ending = hyphen + jot + 'æй';
-                       }
-                       break;
-               case 'superessive':
-                       ending = hyphen + jot + 'ыл';
-                       break;
-               case 'equative':
-                       ending = hyphen + jot + 'ау';
-                       break;
-               case 'comitative':
-                       ending = hyphen + 'имæ';
-                       break;
-       }
-       return word + ending;
-};
diff --git a/resources/mediawiki.language/languages/ru.js b/resources/mediawiki.language/languages/ru.js
deleted file mode 100644 (file)
index e66b9cd..0000000
+++ /dev/null
@@ -1,53 +0,0 @@
-/*!
- * Russian (Русский) language functions
- */
-
-// These tests were originally made for names of Wikimedia
-// websites, so they don't currently cover all the possible
-// cases.
-
-mediaWiki.language.convertGrammar = function ( word, form ) {
-       'use strict';
-
-       var grammarForms = mediaWiki.language.getData( 'ru', 'grammarForms' );
-       if ( grammarForms && grammarForms[form] ) {
-               return grammarForms[form][word];
-       }
-       switch ( form ) {
-               case 'genitive': // родительный падеж
-                       if ( word.substr( word.length - 1 ) === 'ь' ) {
-                               word = word.substr(0, word.length - 1 ) + 'я';
-                       } else if ( word.substr( word.length - 2 ) === 'ия' ) {
-                               word = word.substr(0, word.length - 2 ) + 'ии';
-                       } else if ( word.substr( word.length - 2 ) === 'ка' ) {
-                               word = word.substr(0, word.length - 2 ) + 'ки';
-                       } else if ( word.substr( word.length - 2 )  === 'ти' ) {
-                               word = word.substr(0, word.length - 2 ) + 'тей';
-                       } else if ( word.substr( word.length - 2 ) === 'ды' ) {
-                               word = word.substr(0, word.length - 2 ) + 'дов';
-                       } else if ( word.substr( word.length - 3 ) === 'ные' ) {
-                               word = word.substr(0, word.length - 3 ) + 'ных';
-                       } else if ( word.substr( word.length - 3 ) === 'ник' ) {
-                               word = word.substr(0, word.length - 3 ) + 'ника';
-                       }
-                       break;
-               case 'prepositional': // предложный падеж
-                       if ( word.substr( word.length - 1 ) === 'ь' ) {
-                               word = word.substr(0, word.length - 1 ) + 'е';
-                       } else if ( word.substr( word.length - 2 ) === 'ия' ) {
-                               word = word.substr(0, word.length - 2 ) + 'ии';
-                       } else if ( word.substr( word.length - 2 ) === 'ка' ) {
-                               word = word.substr(0, word.length - 2 ) + 'ке';
-                       } else if ( word.substr( word.length - 2 )  === 'ти' ) {
-                               word = word.substr(0, word.length - 2 ) + 'тях';
-                       } else if ( word.substr( word.length - 2 ) === 'ды' ) {
-                               word = word.substr(0, word.length - 2 ) + 'дах';
-                       } else if ( word.substr( word.length - 3 ) === 'ные' ) {
-                               word = word.substr(0, word.length - 3 ) + 'ных';
-                       } else if ( word.substr( word.length - 3 ) === 'ник' ) {
-                               word = word.substr(0, word.length - 3 ) + 'нике';
-                       }
-                       break;
-       }
-       return word;
-};
diff --git a/resources/mediawiki.language/languages/sl.js b/resources/mediawiki.language/languages/sl.js
deleted file mode 100644 (file)
index d20d0b3..0000000
+++ /dev/null
@@ -1,19 +0,0 @@
-/*!
- * Slovenian (Slovenščina) language functions
- */
-
-mediaWiki.language.convertGrammar = function ( word, form ) {
-       var grammarForms = mediaWiki.language.getData( 'sl', 'grammarForms' );
-       if ( grammarForms && grammarForms[form] ) {
-               return grammarForms[form][word];
-       }
-       switch ( form ) {
-               case 'mestnik': // locative
-                       word = 'o ' + word;
-                       break;
-               case 'orodnik': // instrumental
-                       word = 'z ' + word;
-                       break;
-       }
-       return word;
-};
diff --git a/resources/mediawiki.language/languages/uk.js b/resources/mediawiki.language/languages/uk.js
deleted file mode 100644 (file)
index 69f7ec5..0000000
+++ /dev/null
@@ -1,37 +0,0 @@
-/*!
- * Ukrainian (Українська) language functions
- */
-
-mediaWiki.language.convertGrammar = function ( word, form ) {
-       var grammarForms = mediaWiki.language.getData( 'uk', 'grammarForms' );
-       if ( grammarForms && grammarForms[form] ) {
-               return grammarForms[form][word];
-       }
-       switch ( form ) {
-               case 'genitive': // родовий відмінок
-                       if ( word.substr( word.length - 4 ) !== 'вікі' && word.substr( word.length - 4 ) !== 'Вікі' ) {
-                               if ( word.substr( word.length - 1 ) === 'ь' ) {
-                                       word = word.substr(0, word.length - 1 ) + 'я';
-                               } else if ( word.substr( word.length - 2 ) === 'ія' ) {
-                                       word = word.substr(0, word.length - 2 ) + 'ії';
-                               } else if ( word.substr( word.length - 2 ) === 'ка' ) {
-                                       word = word.substr(0, word.length - 2 ) + 'ки';
-                               } else if ( word.substr( word.length - 2 ) === 'ти' ) {
-                                       word = word.substr(0, word.length - 2 ) + 'тей';
-                               } else if ( word.substr( word.length - 2 ) === 'ды' ) {
-                                       word = word.substr(0, word.length - 2 ) + 'дов';
-                               } else if ( word.substr( word.length - 3 ) === 'ник' ) {
-                                       word = word.substr(0, word.length - 3 ) + 'ника';
-                               }
-                       }
-                       break;
-               case 'accusative': // знахідний відмінок
-                       if ( word.substr( word.length - 4 ) !== 'вікі' && word.substr( word.length - 4 ) !== 'Вікі' ) {
-                               if ( word.substr( word.length - 2 ) === 'ія' ) {
-                                       word = word.substr(0, word.length - 2 ) + 'ію';
-                               }
-                       }
-                       break;
-       }
-       return word;
-};
diff --git a/resources/mediawiki.language/mediawiki.cldr.js b/resources/mediawiki.language/mediawiki.cldr.js
deleted file mode 100644 (file)
index f6fb8f1..0000000
+++ /dev/null
@@ -1,32 +0,0 @@
-( function ( mw ) {
-       'use strict';
-
-       /**
-        * Namespace for CLDR-related utility methods.
-        *
-        * @class
-        * @singleton
-        */
-       mw.cldr = {
-               /**
-                * Get the plural form index for the number.
-                *
-                * In case none of the rules passed, we return `pluralRules.length` -
-                * that means it is the "other" form.
-                *
-                * @param {number} number
-                * @param {Array} pluralRules
-                * @return {number} plural form index
-                */
-               getPluralForm: function ( number, pluralRules ) {
-                       var i;
-                       for ( i = 0; i < pluralRules.length; i++ ) {
-                               if ( mw.libs.pluralRuleParser( pluralRules[i], number ) ) {
-                                       break;
-                               }
-                       }
-                       return i;
-               }
-       };
-
-}( mediaWiki ) );
diff --git a/resources/mediawiki.language/mediawiki.language.init.js b/resources/mediawiki.language/mediawiki.language.init.js
deleted file mode 100644 (file)
index fd77025..0000000
+++ /dev/null
@@ -1,79 +0,0 @@
-( function ( mw ) {
-       /**
-        * Base language object with methods related to language support, attempting to mirror some of the
-        * functionality of the Language class in MediaWiki:
-        *
-        *   - storing and retrieving language data
-        *   - transforming message syntax (`{{PLURAL:}}`, `{{GRAMMAR:}}`, `{{GENDER:}}`)
-        *   - formatting numbers
-        *
-        * @class
-        * @singleton
-        */
-       mw.language = {
-               /**
-                * Language-related data (keyed by language, contains instances of mw.Map). Loaded dynamically
-                * (see ResourceLoaderLanguageDataModule in PHP docs, aka mediawiki.language.data module).
-                *
-                * To set data:
-                *
-                *     // Override, extend or create the language data object of 'nl'
-                *     mw.language.setData( 'nl', 'myKey', 'My value' );
-                *
-                *     // Set multiple values at once
-                *     mw.language.setData( 'nl', { foo: 'X', bar: 'Y' } );
-                *
-                * To get GrammarForms data for language 'nl':
-                *
-                *     var grammarForms = mw.language.getData( 'nl', 'grammarForms' );
-                *
-                * Possible data keys:
-                *
-                *  - `digitTransformTable`
-                *  - `separatorTransformTable`
-                *  - `grammarForms`
-                *  - `pluralRules`
-                *  - `digitGroupingPattern`
-                *
-                * @property
-                */
-               data: {},
-
-               /**
-                * Convenience method for retrieving language data.
-                *
-                * Structured by language code and data key, covering for the potential inexistence of a
-                * data object for this language.
-                *
-                * @param {string} langCode
-                * @param {string} dataKey
-                * @return {Mixed} Value stored in the mw.Map (or `undefined` if there is no map for the specified
-                *  langCode).
-                */
-               getData: function ( langCode, dataKey ) {
-                       var langData = mw.language.data;
-                       if ( langData && langData[langCode] instanceof mw.Map ) {
-                               return langData[langCode].get( dataKey );
-                       }
-                       return undefined;
-               },
-
-               /**
-                * Convenience method for setting language data.
-                *
-                * Creates the data mw.Map if there isn't one for the specified language already.
-                *
-                * @param {string} langCode
-                * @param {string|Object} dataKey Key or object of key/values.
-                * @param {Mixed} value Value for dataKey, ignored if dataKey is an object.
-                */
-               setData: function ( langCode, dataKey, value ) {
-                       var langData = mw.language.data;
-                       if ( !( langData[langCode] instanceof mw.Map ) ) {
-                               langData[langCode] = new mw.Map();
-                       }
-                       langData[langCode].set( dataKey, value );
-               }
-       };
-
-}( mediaWiki ) );
diff --git a/resources/mediawiki.language/mediawiki.language.js b/resources/mediawiki.language/mediawiki.language.js
deleted file mode 100644 (file)
index a0b5569..0000000
+++ /dev/null
@@ -1,151 +0,0 @@
-/*
- * Methods for transforming message syntax.
- */
-( function ( mw, $ ) {
-
-/**
- * @class mw.language
- */
-$.extend( mw.language, {
-
-       /**
-        * Process the PLURAL template substitution
-        *
-        * @private
-        * @param {Object} template Template object
-        * @param {string} template.title
-        * @param {Array} template.parameters
-        * @return {string}
-        */
-       procPLURAL: function ( template ) {
-               if ( template.title && template.parameters && mw.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 = mw.language.convertNumber( template.title, true );
-                       // Do convertPlural call
-                       return mw.language.convertPlural( parseInt( count, 10 ), 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 {number} count Non-localized quantifier
-        * @param {Array} forms List of plural forms
-        * @return {string} Correct form for quantifier in this language
-        */
-       convertPlural: function ( count, forms ) {
-               var pluralRules,
-                       formCount,
-                       form,
-                       index,
-                       equalsPosition,
-                       pluralFormIndex = 0;
-
-               if ( !forms || forms.length === 0 ) {
-                       return '';
-               }
-
-               // Handle for explicit n= forms
-               for ( index = 0; index < forms.length; index++ ) {
-                       form = forms[index];
-                       if ( /^\d+=/.test( form ) ) {
-                               equalsPosition = form.indexOf( '=' );
-                               formCount = parseInt( form.substring( 0, equalsPosition ), 10 );
-                               if ( formCount === count ) {
-                                       return form.substr( equalsPosition + 1 );
-                               }
-                               forms[index] = undefined;
-                       }
-               }
-
-               // Remove explicit plural forms from the forms.
-               forms = $.map( forms, function ( form ) {
-                       return form;
-               } );
-
-               if ( forms.length === 0 ) {
-                       return '';
-               }
-
-               pluralRules = mw.language.getData( mw.config.get( 'wgUserLanguage' ), 'pluralRules' );
-               if ( !pluralRules ) {
-                       // default fallback.
-                       return ( count === 1 ) ? forms[0] : forms[1];
-               }
-               pluralFormIndex = mw.cldr.getPluralForm( count, pluralRules );
-               pluralFormIndex = Math.min( pluralFormIndex, forms.length - 1 );
-               return forms[pluralFormIndex];
-       },
-
-       /**
-        * Pads an array to a specific length by copying the last one element.
-        *
-        * @private
-        * @param {Array} forms Number of forms given to convertPlural
-        * @param {number} 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;
-       },
-
-       /**
-        * Provides an alternative text depending on specified gender.
-        *
-        * Usage in message text: `{{gender:[gender|user object]|masculine|feminine|neutral}}`.
-        * If second or third parameter are not specified, masculine is used.
-        *
-        * These details may be overriden per language.
-        *
-        * @param {string} gender 'male', 'female', or anything else for neutral.
-        * @param {Array} forms List of gender forms
-        * @return string
-        */
-       gender: function ( gender, forms ) {
-               if ( !forms || forms.length === 0 ) {
-                       return '';
-               }
-               forms = mw.language.preConvertPlural( forms, 2 );
-               if ( gender === 'male' ) {
-                       return forms[0];
-               }
-               if ( gender === 'female' ) {
-                       return forms[1];
-               }
-               return ( forms.length === 3 ) ? forms[2] : forms[0];
-       },
-
-       /**
-        * Grammatical transformations, needed for inflected languages.
-        * Invoked by putting `{{grammar:form|word}}` in a message.
-        *
-        * The rules can be defined in $wgGrammarForms global or computed
-        * dynamically by overriding this method per language.
-        *
-        * @param {string} word
-        * @param {string} form
-        * @return {string}
-        */
-       convertGrammar: function ( word, form ) {
-               var grammarForms = mw.language.getData( mw.config.get( 'wgUserLanguage' ), 'grammarForms' );
-               if ( grammarForms && grammarForms[form] ) {
-                       return grammarForms[form][word] || word;
-               }
-               return word;
-       }
-
-} );
-
-}( mediaWiki, jQuery ) );
diff --git a/resources/mediawiki.language/mediawiki.language.months.js b/resources/mediawiki.language/mediawiki.language.months.js
deleted file mode 100644 (file)
index 5a1a5cb..0000000
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * Transfer of month names from messages into mw.language.
- *
- * Loading this module also ensures the availability of appropriate messages via mw.msg.
- */
-( function ( mw, $ ) {
-       var
-               monthMessages = [
-                       'january', 'february', 'march', 'april',
-                       'may_long', 'june', 'july', 'august',
-                       'september', 'october', 'november', 'december'
-               ],
-               monthGenMessages = [
-                       'january-gen', 'february-gen', 'march-gen', 'april-gen',
-                       'may-gen', 'june-gen', 'july-gen', 'august-gen',
-                       'september-gen', 'october-gen', 'november-gen', 'december-gen'
-               ],
-               monthAbbrevMessages = [
-                       'jan', 'feb', 'mar', 'apr',
-                       'may', 'jun', 'jul', 'aug',
-                       'sep', 'oct', 'nov', 'dec'
-               ];
-
-       // Function suitable for passing to jQuery.map
-       // Can't use mw.msg directly because jQuery.map passes element index as second argument
-       function mwMsgMapper( key ) {
-               return mw.msg( key );
-       }
-
-       /**
-        * Information about month names in current UI language.
-        *
-        * Object keys:
-        *
-        * - `names`: array of month names (in nominative case in languages which have the distinction),
-        *   zero-indexed
-        * - `genitive`: array of month names in genitive case, zero-indexed
-        * - `abbrev`: array of three-letter-long abbreviated month names, zero-indexed
-        * - `keys`: object with three keys like the above, containing zero-indexed arrays of message keys
-        *   for appropriate messages which can be passed to mw.msg.
-        *
-        * @property
-        * @member mw.language
-        */
-       mw.language.months = {
-               keys: {
-                       names: monthMessages,
-                       genitive: monthGenMessages,
-                       abbrev: monthAbbrevMessages
-               },
-               names: $.map( monthMessages, mwMsgMapper ),
-               genitive: $.map( monthGenMessages, mwMsgMapper ),
-               abbrev: $.map( monthAbbrevMessages, mwMsgMapper )
-       };
-
-}( mediaWiki, jQuery ) );
diff --git a/resources/mediawiki.language/mediawiki.language.numbers.js b/resources/mediawiki.language/mediawiki.language.numbers.js
deleted file mode 100644 (file)
index 56fa0da..0000000
+++ /dev/null
@@ -1,259 +0,0 @@
-/*
- * Number-related utilities for mediawiki.language.
- */
-( function ( mw, $ ) {
-       /**
-        * @class mw.language
-        */
-
-       /**
-        * Pad a string to guarantee that it is at least `size` length by
-        * filling with the character `ch` at either the start or end of the
-        * string. Pads at the start, by default.
-        *
-        * Example: Fill the string to length 10 with '+' characters on the right.
-        *
-        *     pad( 'blah', 10, '+', true ); // => 'blah++++++'
-        *
-        * @private
-        * @param {string} text The string to pad
-        * @param {number} size The length to pad to
-        * @param {string} [ch='0'] Character to pad with
-        * @param {boolean} [end=false] Adds padding at the end if true, otherwise pads at start
-        * @return {string}
-        */
-       function pad( text, size, ch, end ) {
-               if ( !ch ) {
-                       ch = '0';
-               }
-
-               var out = String( text ),
-                       padStr = replicate( ch, Math.ceil( ( size - out.length ) / ch.length ) );
-
-               return end ? out + padStr : padStr + out;
-       }
-
-       /**
-        * Efficiently replicate a string `n` times.
-        *
-        * @private
-        * @param {string} str The string to replicate
-        * @param {number} num Number of times to replicate the string
-        * @return {string}
-        */
-       function replicate( str, num ) {
-               if ( num <= 0 || !str ) {
-                       return '';
-               }
-
-               var buf = [];
-               while (num) {
-                       buf.push( str );
-                       str += str;
-               }
-               return buf.join( '' );
-       }
-
-       /**
-        * Apply numeric pattern to absolute value using options. Gives no
-        * consideration to local customs.
-        *
-        * Adapted from dojo/number library with thanks
-        * <http://dojotoolkit.org/reference-guide/1.8/dojo/number.html>
-        *
-        * @private
-        * @param {number} value the number to be formatted, ignores sign
-        * @param {string} pattern the number portion of a pattern (e.g. `#,##0.00`)
-        * @param {Object} [options] If provided, both option keys must be present:
-        * @param {string} options.decimal The decimal separator. Defaults to: `'.'`.
-        * @param {string} options.group The group separator. Defaults to: `','`.
-        * @return {string}
-        */
-       function commafyNumber( value, pattern, options ) {
-               options = options || {
-                       group: ',',
-                       decimal: '.'
-               };
-
-               if ( isNaN( value) ) {
-                       return value;
-               }
-
-               var padLength,
-                       patternDigits,
-                       index,
-                       whole,
-                       off,
-                       remainder,
-                       patternParts = pattern.split( '.' ),
-                       maxPlaces = ( patternParts[1] || [] ).length,
-                       valueParts = String( Math.abs( value ) ).split( '.' ),
-                       fractional = valueParts[1] || '',
-                       groupSize = 0,
-                       groupSize2 = 0,
-                       pieces = [];
-
-               if ( patternParts[1] ) {
-                       // Pad fractional with trailing zeros
-                       padLength = ( patternParts[1] && patternParts[1].lastIndexOf( '0' ) + 1 );
-
-                       if ( padLength > fractional.length ) {
-                               valueParts[1] = pad( fractional, padLength, '0', true );
-                       }
-
-                       // Truncate fractional
-                       if ( maxPlaces < fractional.length ) {
-                               valueParts[1] = fractional.substr( 0, maxPlaces );
-                       }
-               } else {
-                       if ( valueParts[1] ) {
-                               valueParts.pop();
-                       }
-               }
-
-               // Pad whole with leading zeros
-               patternDigits = patternParts[0].replace( ',', '' );
-
-               padLength = patternDigits.indexOf( '0' );
-
-               if ( padLength !== -1 ) {
-                       padLength = patternDigits.length - padLength;
-
-                       if ( padLength > valueParts[0].length ) {
-                               valueParts[0] = pad( valueParts[0], padLength );
-                       }
-
-                       // Truncate whole
-                       if ( patternDigits.indexOf( '#' ) === -1 ) {
-                               valueParts[0] = valueParts[0].substr( valueParts[0].length - padLength );
-                       }
-               }
-
-               // Add group separators
-               index = patternParts[0].lastIndexOf( ',' );
-
-               if ( index !== -1 ) {
-                       groupSize = patternParts[0].length - index - 1;
-                       remainder = patternParts[0].substr( 0, index );
-                       index = remainder.lastIndexOf( ',' );
-                       if ( index !== -1 ) {
-                               groupSize2 = remainder.length - index - 1;
-                       }
-               }
-
-               for ( whole = valueParts[0]; whole; ) {
-                       off = whole.length - groupSize;
-
-                       pieces.push( ( off > 0 ) ? whole.substr( off ) : whole );
-                       whole = ( off > 0 ) ? whole.slice( 0, off ) : '';
-
-                       if ( groupSize2 ) {
-                               groupSize = groupSize2;
-                       }
-               }
-               valueParts[0] = pieces.reverse().join( options.group );
-
-               return valueParts.join( options.decimal );
-       }
-
-       $.extend( mw.language, {
-
-               /**
-                * Converts a number using #getDigitTransformTable.
-                *
-                * @param {number} num Value to be converted
-                * @param {boolean} [integer=false] Whether to convert the return value to an integer
-                * @return {number|string} Formatted number
-                */
-               convertNumber: function ( num, integer ) {
-                       var i, tmp, transformTable, numberString, convertedNumber, pattern;
-
-                       pattern = mw.language.getData( mw.config.get( 'wgUserLanguage' ),
-                               'digitGroupingPattern' ) || '#,##0.###';
-
-                       // Set the target transform table:
-                       transformTable = mw.language.getDigitTransformTable();
-
-                       if ( !transformTable ) {
-                               return num;
-                       }
-
-                       // Check if the 'restore' to Latin number flag is set:
-                       if ( integer ) {
-                               if ( parseInt( num, 10 ) === num ) {
-                                       return num;
-                               }
-                               tmp = [];
-                               for ( i in transformTable ) {
-                                       tmp[ transformTable[ i ] ] = i;
-                               }
-                               transformTable = tmp;
-                               numberString = num + '';
-                       } else {
-                               numberString = mw.language.commafy( num, pattern );
-                       }
-
-                       convertedNumber = '';
-                       for ( i = 0; i < numberString.length; i++ ) {
-                               if ( transformTable[ numberString[i] ] ) {
-                                       convertedNumber += transformTable[numberString[i]];
-                               } else {
-                                       convertedNumber += numberString[i];
-                               }
-                       }
-                       return integer ? parseInt( convertedNumber, 10 ) : convertedNumber;
-               },
-
-               /**
-                * Get the  digit transform table for current UI language.
-                * @return {Object|Array}
-                */
-               getDigitTransformTable: function () {
-                       return mw.language.getData( mw.config.get( 'wgUserLanguage' ),
-                               'digitTransformTable' ) || [];
-               },
-
-               /**
-                * Get the  separator transform table for current UI language.
-                * @return {Object|Array}
-                */
-               getSeparatorTransformTable: function () {
-                       return mw.language.getData( mw.config.get( 'wgUserLanguage' ),
-                               'separatorTransformTable' ) || [];
-               },
-
-               /**
-                * Apply pattern to format value as a string.
-                *
-                * Using patterns from [Unicode TR35](http://www.unicode.org/reports/tr35/#Number_Format_Patterns).
-                *
-                * @param {number} value
-                * @param {string} pattern Pattern string as described by Unicode TR35
-                * @throws {Error} If unable to find a number expression in `pattern`.
-                * @return {string}
-                */
-               commafy: function ( value, pattern ) {
-                       var numberPattern,
-                               transformTable = mw.language.getSeparatorTransformTable(),
-                               group = transformTable[','] || ',',
-                               numberPatternRE = /[#0,]*[#0](?:\.0*#*)?/, // not precise, but good enough
-                               decimal = transformTable['.'] || '.',
-                               patternList = pattern.split( ';' ),
-                               positivePattern = patternList[0];
-
-                       pattern = patternList[ ( value < 0 ) ? 1 : 0] || ( '-' + positivePattern );
-                       numberPattern = positivePattern.match( numberPatternRE );
-
-                       if ( !numberPattern ) {
-                               throw new Error( 'unable to find a number expression in pattern: ' + pattern );
-                       }
-
-                       return pattern.replace( numberPatternRE, commafyNumber( value, numberPattern[0], {
-                               decimal: decimal,
-                               group: group
-                       } ) );
-               }
-
-       } );
-
-}( mediaWiki, jQuery ) );
diff --git a/resources/mediawiki.less/mediawiki.mixins.animation.less b/resources/mediawiki.less/mediawiki.mixins.animation.less
deleted file mode 100644 (file)
index ec3cddc..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
-.animation (...) {
-       -webkit-animation: @arguments;
-       -moz-animation: @arguments;
-       -o-animation: @arguments;
-       animation: @arguments;
-}
-
-.transform-rotate (@deg) {
-       -webkit-transform: rotate(@deg);
-       -moz-transform: rotate(@deg);
-       transform: rotate(@deg);
-}
\ No newline at end of file
diff --git a/resources/mediawiki.less/mediawiki.mixins.less b/resources/mediawiki.less/mediawiki.mixins.less
deleted file mode 100644 (file)
index 80b68cc..0000000
+++ /dev/null
@@ -1,53 +0,0 @@
-/**
- * Common LESS mixin library for MediaWiki
- *
- * By default the folder containing this file is included in $wgResourceLoaderLESSImportPaths,
- * which makes this file importable by all less files via '@import "mediawiki.mixins";'.
- *
- * The mixins included below are considered a public interface for MediaWiki extensions.
- * The signatures of parametrized mixins should be kept as stable as possible.
- *
- * See <http://lesscss.org/#-mixins> for more information about how to write mixins.
- */
-
-.background-image(@url) when (embeddable(@url)) {
-       background-image: embed(@url);
-       background-image: url(@url)!ie;
-}
-
-.background-image(@url) when not (embeddable(@url)) {
-       background-image: url(@url);
-}
-
-.vertical-gradient ( @startColor: gray, @endColor: white, @startPos: 0, @endPos: 100% ) {
-       background-color: @endColor;
-       background-image: -moz-linear-gradient( top, @startColor @startPos, @endColor @endPos ); // Firefox 3.6+
-       background-image: -webkit-gradient( linear, left top, left bottom, color-stop( @startPos, @startColor ), color-stop( @endPos, @endColor ) ); // Safari 4+, Chrome 2+
-       background-image: -webkit-linear-gradient( top, @startColor @startPos, @endColor @endPos ); // Safari 5.1+, Chrome 10+
-       background-image: linear-gradient( @startColor @startPos, @endColor @endPos ); // Standard
-}
-
-/* Note gzip compression means that it is okay to embed twice */
-/* http://pauginer.tumblr.com/post/36614680636/invisible-gradient-technique */
-.background-image-svg(@svg, @fallback) {
-       background-image: url(@fallback);
-       /* SVG support using a transparent gradient to guarantee cross-browser
-        * compatibility (browsers able to understand gradient syntax support also SVG) */
-       /* @embed */ background-image: -webkit-linear-gradient(transparent, transparent), url(@svg);
-       /* @embed */ background-image: linear-gradient(transparent, transparent), url(@svg);
-}
-
-/* Caution: Does not support localisable images */
-.list-style-image(@url) when (embeddable(@url)) {
-       list-style-image: embed(@url);
-       list-style-image: url(@url)!ie;
-}
-
-.list-style-image(@url) when not (embeddable(@url)) {
-       list-style-image: url(@url);
-}
-
-.transition(@string) {
-       -webkit-transition: @string;
-       transition: @string;
-}
diff --git a/resources/mediawiki.less/mediawiki.mixins.rotation.less b/resources/mediawiki.less/mediawiki.mixins.rotation.less
deleted file mode 100644 (file)
index e28b333..0000000
+++ /dev/null
@@ -1,33 +0,0 @@
-// This is a separate file because importing the mixin causes
-// the keyframes blocks to be included in the output, regardless
-// of whether .rotation is used.
-@import "mediawiki.mixins.animation";
-
-.rotate-frames () {
-       from {
-               .transform-rotate(0deg);
-       }
-       to {
-               .transform-rotate(360deg);
-       }
-}
-
-@-webkit-keyframes rotate {
-       .rotate-frames;
-}
-
-@-moz-keyframes rotate {
-       .rotate-frames;
-}
-
-@-o-keyframes rotate {
-       .rotate-frames;
-}
-
-@keyframes rotate {
-       .rotate-frames;
-}
-
-.rotation( @time ) {
-       .animation(rotate, @time, infinite, linear);
-}
diff --git a/resources/mediawiki.libs/CLDRPluralRuleParser.js b/resources/mediawiki.libs/CLDRPluralRuleParser.js
deleted file mode 100644 (file)
index 83c2524..0000000
+++ /dev/null
@@ -1,475 +0,0 @@
-/* This is CLDRPluralRuleParser v1.1, ported to MediaWiki ResourceLoader */
-
-/**
-* CLDRPluralRuleParser.js
-* A parser engine for CLDR plural rules.
-*
-* Copyright 2012 GPLV3+, Santhosh Thottingal
-*
-* @version 0.1.0-alpha
-* @source https://github.com/santhoshtr/CLDRPluralRuleParser
-* @author Santhosh Thottingal <santhosh.thottingal@gmail.com>
-* @author Timo Tijhof
-* @author Amir Aharoni
-*/
-
-( function ( mw ) {
-/**
- * Evaluates a plural rule in CLDR syntax for a number
- * @param {string} rule
- * @param {integer} number
- * @return {boolean} true if evaluation passed, false if evaluation failed.
- */
-
-function pluralRuleParser(rule, number) {
-       /*
-       Syntax: see http://unicode.org/reports/tr35/#Language_Plural_Rules
-       -----------------------------------------------------------------
-       condition     = and_condition ('or' and_condition)*
-               ('@integer' samples)?
-               ('@decimal' samples)?
-       and_condition = relation ('and' relation)*
-       relation      = is_relation | in_relation | within_relation
-       is_relation   = expr 'is' ('not')? value
-       in_relation   = expr (('not')? 'in' | '=' | '!=') range_list
-       within_relation = expr ('not')? 'within' range_list
-       expr          = operand (('mod' | '%') value)?
-       operand       = 'n' | 'i' | 'f' | 't' | 'v' | 'w'
-       range_list    = (range | value) (',' range_list)*
-       value         = digit+
-       digit         = 0|1|2|3|4|5|6|7|8|9
-       range         = value'..'value
-       samples       = sampleRange (',' sampleRange)* (',' ('…'|'...'))?
-       sampleRange   = decimalValue '~' decimalValue
-       decimalValue  = value ('.' value)?
-       */
-
-       // we don't evaluate the samples section of the rule. Ignore it.
-       rule = rule.split('@')[0].replace(/^\s*/, '').replace(/\s*$/, '');
-
-       if (!rule.length) {
-               // empty rule or 'other' rule.
-               return true;
-       }
-       // Indicates current position in the rule as we parse through it.
-       // Shared among all parsing functions below.
-       var pos = 0,
-               operand,
-               expression,
-               relation,
-               result,
-               whitespace = makeRegexParser(/^\s+/),
-               value = makeRegexParser(/^\d+/),
-               _n_ = makeStringParser('n'),
-               _i_ = makeStringParser('i'),
-               _f_ = makeStringParser('f'),
-               _t_ = makeStringParser('t'),
-               _v_ = makeStringParser('v'),
-               _w_ = makeStringParser('w'),
-               _is_ = makeStringParser('is'),
-               _isnot_ = makeStringParser('is not'),
-               _isnot_sign_ = makeStringParser('!='),
-               _equal_ = makeStringParser('='),
-               _mod_ = makeStringParser('mod'),
-               _percent_ = makeStringParser('%'),
-               _not_ = makeStringParser('not'),
-               _in_ = makeStringParser('in'),
-               _within_ = makeStringParser('within'),
-               _range_ = makeStringParser('..'),
-               _comma_ = makeStringParser(','),
-               _or_ = makeStringParser('or'),
-               _and_ = makeStringParser('and');
-
-       function debug() {
-               // console.log.apply(console, arguments);
-       }
-
-       debug('pluralRuleParser', rule, number);
-
-       // Try parsers until one works, if none work return null
-
-       function choice(parserSyntax) {
-               return function() {
-                       for (var i = 0; i < parserSyntax.length; i++) {
-                               var result = parserSyntax[i]();
-                               if (result !== null) {
-                                       return result;
-                               }
-                       }
-                       return null;
-               };
-       }
-
-       // Try several parserSyntax-es in a row.
-       // All must succeed; otherwise, return null.
-       // This is the only eager one.
-
-       function sequence(parserSyntax) {
-               var originalPos = pos;
-               var result = [];
-               for (var i = 0; i < parserSyntax.length; i++) {
-                       var res = parserSyntax[i]();
-                       if (res === null) {
-                               pos = originalPos;
-                               return null;
-                       }
-                       result.push(res);
-               }
-               return result;
-       }
-
-       // Run the same parser over and over until it fails.
-       // Must succeed a minimum of n times; otherwise, return null.
-
-       function nOrMore(n, p) {
-               return function() {
-                       var originalPos = pos;
-                       var result = [];
-                       var parsed = p();
-                       while (parsed !== null) {
-                               result.push(parsed);
-                               parsed = p();
-                       }
-                       if (result.length < n) {
-                               pos = originalPos;
-                               return null;
-                       }
-                       return result;
-               };
-       }
-
-       // Helpers -- just make parserSyntax out of simpler JS builtin types
-       function makeStringParser(s) {
-               var len = s.length;
-               return function() {
-                       var result = null;
-                       if (rule.substr(pos, len) === s) {
-                               result = s;
-                               pos += len;
-                       }
-
-                       return result;
-               };
-       }
-
-       function makeRegexParser(regex) {
-               return function() {
-                       var matches = rule.substr(pos).match(regex);
-                       if (matches === null) {
-                               return null;
-                       }
-                       pos += matches[0].length;
-                       return matches[0];
-               };
-       }
-
-       /*
-        * integer digits of n.
-        */
-       function i() {
-               var result = _i_();
-               if (result === null) {
-                       debug(' -- failed i', parseInt(number, 10));
-                       return result;
-               }
-               result = parseInt(number, 10);
-               debug(' -- passed i ', result);
-               return result;
-       }
-
-       /*
-        * absolute value of the source number (integer and decimals).
-        */
-       function n() {
-               var result = _n_();
-               if (result === null) {
-                       debug(' -- failed n ', number);
-                       return result;
-               }
-               result = parseFloat(number, 10);
-               debug(' -- passed n ', result);
-               return result;
-       }
-
-       /*
-        * visible fractional digits in n, with trailing zeros.
-        */
-       function f() {
-               var result = _f_();
-               if (result === null) {
-                       debug(' -- failed f ', number);
-                       return result;
-               }
-               result = (number + '.').split('.')[1] || 0;
-               debug(' -- passed f ', result);
-               return result;
-       }
-
-       /*
-        * visible fractional digits in n, without trailing zeros.
-        */
-       function t() {
-               var result = _t_();
-               if (result === null) {
-                       debug(' -- failed t ', number);
-                       return result;
-               }
-               result = (number + '.').split('.')[1].replace(/0$/, '') || 0;
-               debug(' -- passed t ', result);
-               return result;
-       }
-
-       /*
-        * number of visible fraction digits in n, with trailing zeros.
-        */
-       function v() {
-               var result = _v_();
-               if (result === null) {
-                       debug(' -- failed v ', number);
-                       return result;
-               }
-               result = (number + '.').split('.')[1].length || 0;
-               debug(' -- passed v ', result);
-               return result;
-       }
-
-       /*
-        * number of visible fraction digits in n, without trailing zeros.
-        */
-       function w() {
-               var result = _w_();
-               if (result === null) {
-                       debug(' -- failed w ', number);
-                       return result;
-               }
-               result = (number + '.').split('.')[1].replace(/0$/, '').length || 0;
-               debug(' -- passed w ', result);
-               return result;
-       }
-
-       // operand       = 'n' | 'i' | 'f' | 't' | 'v' | 'w'
-       operand = choice([n, i, f, t, v, w]);
-
-       // expr          = operand (('mod' | '%') value)?
-       expression = choice([mod, operand]);
-
-       function mod() {
-               var result = sequence([operand, whitespace, choice([_mod_, _percent_]), whitespace, value]);
-               if (result === null) {
-                       debug(' -- failed mod');
-                       return null;
-               }
-               debug(' -- passed ' + parseInt(result[0], 10) + ' ' + result[2] + ' ' + parseInt(result[4], 10));
-               return parseInt(result[0], 10) % parseInt(result[4], 10);
-       }
-
-       function not() {
-               var result = sequence([whitespace, _not_]);
-               if (result === null) {
-                       debug(' -- failed not');
-                       return null;
-               }
-
-               return result[1];
-       }
-
-       // is_relation   = expr 'is' ('not')? value
-       function is() {
-               var result = sequence([expression, whitespace, choice([_is_]), whitespace, value]);
-               if (result !== null) {
-                       debug(' -- passed is : ' + result[0] + ' == ' + parseInt(result[4], 10));
-                       return result[0] === parseInt(result[4], 10);
-               }
-               debug(' -- failed is');
-               return null;
-       }
-
-       // is_relation   = expr 'is' ('not')? value
-       function isnot() {
-               var result = sequence([expression, whitespace, choice([_isnot_, _isnot_sign_]), whitespace, value]);
-               if (result !== null) {
-                       debug(' -- passed isnot: ' + result[0] + ' != ' + parseInt(result[4], 10));
-                       return result[0] !== parseInt(result[4], 10);
-               }
-               debug(' -- failed isnot');
-               return null;
-       }
-
-       function not_in() {
-               var result = sequence([expression, whitespace, _isnot_sign_, whitespace, rangeList]);
-               if (result !== null) {
-                       debug(' -- passed not_in: ' + result[0] + ' != ' + result[4]);
-                       var range_list = result[4];
-                       for (var i = 0; i < range_list.length; i++) {
-                               if (parseInt(range_list[i], 10) === parseInt(result[0], 10)) {
-                                       return false;
-                               }
-                       }
-                       return true;
-               }
-               debug(' -- failed not_in');
-               return null;
-       }
-
-       // range_list    = (range | value) (',' range_list)*
-       function rangeList() {
-               var result = sequence([choice([range, value]), nOrMore(0, rangeTail)]);
-               var resultList = [];
-               if (result !== null) {
-                       resultList = resultList.concat(result[0]);
-                       if (result[1][0]) {
-                               resultList = resultList.concat(result[1][0]);
-                       }
-                       return resultList;
-               }
-               debug(' -- failed rangeList');
-               return null;
-       }
-
-       function rangeTail() {
-               // ',' range_list
-               var result = sequence([_comma_, rangeList]);
-               if (result !== null) {
-                       return result[1];
-               }
-               debug(' -- failed rangeTail');
-               return null;
-       }
-
-       // range         = value'..'value
-
-       function range() {
-               var i;
-               var result = sequence([value, _range_, value]);
-               if (result !== null) {
-                       debug(' -- passed range');
-                       var array = [];
-                       var left = parseInt(result[0], 10);
-                       var right = parseInt(result[2], 10);
-                       for (i = left; i <= right; i++) {
-                               array.push(i);
-                       }
-                       return array;
-               }
-               debug(' -- failed range');
-               return null;
-       }
-
-       function _in() {
-               // in_relation   = expr ('not')? 'in' range_list
-               var result = sequence([expression, nOrMore(0, not), whitespace, choice([_in_, _equal_]), whitespace, rangeList]);
-               if (result !== null) {
-                       debug(' -- passed _in:' + result);
-                       var range_list = result[5];
-                       for (var i = 0; i < range_list.length; i++) {
-                               if (parseInt(range_list[i], 10) === parseInt(result[0], 10)) {
-                                       return (result[1][0] !== 'not');
-                               }
-                       }
-                       return (result[1][0] === 'not');
-               }
-               debug(' -- failed _in ');
-               return null;
-       }
-
-       /*
-        * The difference between in and within is that in only includes integers in the specified range,
-        * while within includes all values.
-        */
-
-       function within() {
-               // within_relation = expr ('not')? 'within' range_list
-               var result = sequence([expression, nOrMore(0, not), whitespace, _within_, whitespace, rangeList]);
-               if (result !== null) {
-                       debug(' -- passed within');
-                       var range_list = result[5];
-                       if ((result[0] >= parseInt(range_list[0], 10)) &&
-                               (result[0] < parseInt(range_list[range_list.length - 1], 10))) {
-                               return (result[1][0] !== 'not');
-                       }
-                       return (result[1][0] === 'not');
-               }
-               debug(' -- failed within ');
-               return null;
-       }
-
-       // relation      = is_relation | in_relation | within_relation
-       relation = choice([is, not_in, isnot, _in, within]);
-
-       // and_condition = relation ('and' relation)*
-       function and() {
-               var result = sequence([relation, nOrMore(0, andTail)]);
-               if (result) {
-                       if (!result[0]) {
-                               return false;
-                       }
-                       for (var i = 0; i < result[1].length; i++) {
-                               if (!result[1][i]) {
-                                       return false;
-                               }
-                       }
-                       return true;
-               }
-               debug(' -- failed and');
-               return null;
-       }
-
-       // ('and' relation)*
-       function andTail() {
-               var result = sequence([whitespace, _and_, whitespace, relation]);
-               if (result !== null) {
-                       debug(' -- passed andTail' + result);
-                       return result[3];
-               }
-               debug(' -- failed andTail');
-               return null;
-
-       }
-       //  ('or' and_condition)*
-       function orTail() {
-               var result = sequence([whitespace, _or_, whitespace, and]);
-               if (result !== null) {
-                       debug(' -- passed orTail: ' + result[3]);
-                       return result[3];
-               }
-               debug(' -- failed orTail');
-               return null;
-
-       }
-
-       // condition     = and_condition ('or' and_condition)*
-       function condition() {
-               var result = sequence([and, nOrMore(0, orTail)]);
-               if (result) {
-                       for (var i = 0; i < result[1].length; i++) {
-                               if (result[1][i]) {
-                                       return true;
-                               }
-                       }
-                       return result[0];
-
-               }
-               return false;
-       }
-
-       result = condition();
-       /*
-        * For success, the pos must have gotten to the end of the rule
-        * and returned a non-null.
-        * n.b. This is part of language infrastructure, so we do not throw an internationalizable message.
-        */
-       if (result === null) {
-               throw new Error('Parse error at position ' + pos.toString() + ' for rule: ' + rule);
-       }
-
-       if (pos !== rule.length) {
-               debug('Warning: Rule not parsed completely. Parser stopped at ' + rule.substr(0, pos) + ' for rule: ' + rule);
-       }
-
-       return result;
-}
-
-/* pluralRuleParser ends here */
-mw.libs.pluralRuleParser = pluralRuleParser;
-
-} )( mediaWiki );
diff --git a/resources/mediawiki.libs/mediawiki.libs.jpegmeta.js b/resources/mediawiki.libs/mediawiki.libs.jpegmeta.js
deleted file mode 100644 (file)
index b3ed88c..0000000
+++ /dev/null
@@ -1,737 +0,0 @@
-/**
- * This is JsJpegMeta v1.0
- * From: https://code.google.com/p/jsjpegmeta/downloads/list
- * From: https://github.com/bennoleslie/jsjpegmeta/blob/v1.0.0/jpegmeta.js
- *
- * Ported to MediaWiki ResourceLoader by Bryan Tong Minh
- * Changes:
- * - Add closure.
- * - Add this.JpegMeta assignment to expose it as global.
- * - Add mw.libs.jpegmeta wrapper.
- */
-
-( function () {
-       /*
-       Copyright (c) 2009 Ben Leslie
-       
-       Permission is hereby granted, free of charge, to any person obtaining a copy
-       of this software and associated documentation files (the "Software"), to deal
-       in the Software without restriction, including without limitation the rights
-       to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-       copies of the Software, and to permit persons to whom the Software is
-       furnished to do so, subject to the following conditions:
-       
-       The above copyright notice and this permission notice shall be included in
-       all copies or substantial portions of the Software.
-       
-       THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-       IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-       FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-       AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-       LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-       OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-       THE SOFTWARE.
-       */
-       
-       /*
-        This JavaScript library is used to parse meta-data from files 
-        with mime-type image/jpeg.
-       
-        Include it with something like:
-       
-          <script type="text/javascript" src="jpegmeta.js"></script>
-       
-        This adds a single 'module' object called 'JpegMeta' to the global
-        namespace.
-       
-        Public Functions
-        ----------------
-        JpegMeta.parseNum - parse unsigned integers from binary data
-        JpegMeta.parseSnum - parse signed integers from binary data
-       
-        Public Classes
-        --------------
-        JpegMeta.Rational - A rational number class
-        JpegMeta.JfifSegment
-        JpegMeta.ExifSegment
-        JpegMeta.JpegFile - Primary class for Javascript parsing
-       */
-
-       var JpegMeta = {};
-       // MediaWiki: Expose as global
-       this.JpegMeta = JpegMeta;
-       
-       /* 
-          parse an unsigned number of size bytes at offset in some binary string data.
-          If endian
-          is "<" parse the data as little endian, if endian
-          is ">" parse as big-endian.
-       */
-       JpegMeta.parseNum = function parseNum(endian, data, offset, size) {
-           var i;
-           var ret;
-           var big_endian = (endian === ">");
-           if (offset === undefined) offset = 0;
-           if (size === undefined) size = data.length - offset;
-           for (big_endian ? i = offset : i = offset + size - 1; 
-                big_endian ? i < offset + size : i >= offset; 
-                big_endian ? i++ : i--) {
-               ret <<= 8;
-               ret += data.charCodeAt(i);
-           }
-           return ret;
-       };
-       
-       /* 
-          parse an signed number of size bytes at offset in some binary string data.
-          If endian
-          is "<" parse the data as little endian, if endian
-          is ">" parse as big-endian.
-       */
-       JpegMeta.parseSnum = function parseSnum(endian, data, offset, size) {
-           var i;
-           var ret;
-           var neg;
-           var big_endian = (endian === ">");
-           if (offset === undefined) offset = 0;
-           if (size === undefined) size = data.length - offset;
-           for (big_endian ? i = offset : i = offset + size - 1; 
-                big_endian ? i < offset + size : i >= offset; 
-                big_endian ? i++ : i--) {
-               if (neg === undefined) {
-                   /* Negative if top bit is set */
-                   neg = (data.charCodeAt(i) & 0x80) === 0x80;
-               }
-               ret <<= 8;
-               /* If it is negative we invert the bits */
-               ret += neg ? ~data.charCodeAt(i) & 0xff: data.charCodeAt(i);
-           }
-           if (neg) {
-               /* If it is negative we do two's complement */
-               ret += 1;
-               ret *= -1;
-           }
-           return ret;
-       };
-       
-       /* Rational number class */
-       JpegMeta.Rational = function Rational(num, den)
-       {
-           this.num = num;
-           this.den = den || 1;
-           return this;
-       };
-       
-       /* Rational number methods */
-       JpegMeta.Rational.prototype.toString = function toString() {
-           if (this.num === 0) {
-               return "" + this.num;
-           }
-           if (this.den === 1) {
-               return "" + this.num;
-           }
-           if (this.num === 1) {
-               return this.num + " / " + this.den;
-           }
-           return this.num / this.den; // + "/" + this.den;
-       };
-       
-       JpegMeta.Rational.prototype.asFloat = function asFloat() {
-           return this.num / this.den;
-       };
-       
-       /* MetaGroup class */
-       JpegMeta.MetaGroup = function MetaGroup(fieldName, description) {
-           this.fieldName = fieldName;
-           this.description = description;
-           this.metaProps = {};
-           return this;
-       };
-       
-       JpegMeta.MetaGroup.prototype._addProperty = function _addProperty(fieldName, description, value) {
-           var property = new JpegMeta.MetaProp(fieldName, description, value);
-           this[property.fieldName] = property;
-           this.metaProps[property.fieldName] = property;
-       };
-       
-       JpegMeta.MetaGroup.prototype.toString = function toString() {
-           return "[MetaGroup " + this.description + "]";
-       };
-
-       /* MetaProp class */
-       JpegMeta.MetaProp = function MetaProp(fieldName, description, value) {
-           this.fieldName = fieldName;
-           this.description = description;
-           this.value = value;
-           return this;
-       };
-       
-       JpegMeta.MetaProp.prototype.toString = function toString() {
-           return "" + this.value;
-       };
-
-       /* JpegFile class */
-       JpegMeta.JpegFile = function JpegFile(binary_data, filename) {
-           /* Change this to EOI if we want to parse. */
-           var break_segment = this._SOS;
-           
-           this.metaGroups = {};
-           this._binary_data = binary_data;
-           this.filename = filename;
-           
-           /* Go through and parse. */
-           var pos = 0;
-           var pos_start_of_segment = 0;
-           var delim;
-           var mark;
-           var _mark;
-           var segsize;
-           var headersize;
-           var mark_code;
-           var mark_fn;
-       
-           /* Check to see if this looks like a JPEG file */
-           if (this._binary_data.slice(0, 2) !== this._SOI_MARKER) {
-               throw new Error("Doesn't look like a JPEG file. First two bytes are " + 
-                               this._binary_data.charCodeAt(0) + "," + 
-                               this._binary_data.charCodeAt(1) + ".");
-           }
-           
-           pos += 2;
-           
-           while (pos < this._binary_data.length) {
-               delim = this._binary_data.charCodeAt(pos++);
-               mark = this._binary_data.charCodeAt(pos++);
-               
-               pos_start_of_segment = pos;
-               
-               if (delim != this._DELIM) {
-                   break;
-               }
-               
-               if (mark === break_segment) {
-                   break;
-               }
-               
-               headersize = JpegMeta.parseNum(">", this._binary_data, pos, 2);
-               
-               /* Find the end */
-               pos += headersize;
-               while (pos < this._binary_data.length) {
-                   delim = this._binary_data.charCodeAt(pos++);
-                   if (delim == this._DELIM) {
-                       _mark = this._binary_data.charCodeAt(pos++);
-                       if (_mark != 0x0) {
-                           pos -= 2;
-                           break;
-                       }
-                   }
-               }
-               
-               segsize = pos - pos_start_of_segment;
-               
-               if (this._markers[mark]) {
-                   mark_code = this._markers[mark][0];
-                   mark_fn = this._markers[mark][1];
-               } else {
-                   mark_code = "UNKN";
-                   mark_fn = undefined;
-               }
-               
-               if (mark_fn) {
-                   this[mark_fn](mark, pos_start_of_segment + 2);
-               }
-               
-           }
-           
-           if (this.general === undefined) {
-               throw Error("Invalid JPEG file.");
-           }
-           
-           return this;
-       };
-       
-       this.JpegMeta.JpegFile.prototype.toString = function () {
-           return "[JpegFile " + this.filename + " " + 
-               this.general.type + " " + 
-               this.general.pixelWidth + "x" + 
-               this.general.pixelHeight +
-               " Depth: " + this.general.depth + "]";
-       };
-       
-       /* Some useful constants */
-       this.JpegMeta.JpegFile.prototype._SOI_MARKER = '\xff\xd8';
-       this.JpegMeta.JpegFile.prototype._DELIM = 0xff;
-       this.JpegMeta.JpegFile.prototype._EOI = 0xd9;
-       this.JpegMeta.JpegFile.prototype._SOS = 0xda;
-       
-       this.JpegMeta.JpegFile.prototype._sofHandler = function _sofHandler (mark, pos) {
-           if (this.general !== undefined) {
-               throw Error("Unexpected multiple-frame image");
-           }
-       
-           this._addMetaGroup("general", "General");
-           this.general._addProperty("depth", "Depth", JpegMeta.parseNum(">", this._binary_data, pos, 1));
-           this.general._addProperty("pixelHeight", "Pixel Height", JpegMeta.parseNum(">", this._binary_data, pos + 1, 2));
-           this.general._addProperty("pixelWidth", "Pixel Width",JpegMeta.parseNum(">", this._binary_data, pos + 3, 2));
-           this.general._addProperty("type", "Type", this._markers[mark][2]);
-       };
-       
-       /* JFIF idents */
-       this.JpegMeta.JpegFile.prototype._JFIF_IDENT = "JFIF\x00";
-       this.JpegMeta.JpegFile.prototype._JFXX_IDENT = "JFXX\x00";
-       
-       /* Exif idents */
-       this.JpegMeta.JpegFile.prototype._EXIF_IDENT = "Exif\x00";
-       
-       /* TIFF types */
-       this.JpegMeta.JpegFile.prototype._types = {
-           /* The format is identifier : ["type name", type_size_in_bytes ] */
-           1 : ["BYTE", 1],
-           2 : ["ASCII", 1],
-           3 : ["SHORT", 2],
-           4 : ["LONG", 4],
-           5 : ["RATIONAL", 8],
-           6 : ["SBYTE", 1],
-           7 : ["UNDEFINED", 1],
-           8 : ["SSHORT", 2],
-           9 : ["SLONG", 4],
-           10 : ["SRATIONAL", 8],
-           11 : ["FLOAT", 4],
-           12 : ["DOUBLE", 8]
-       };
-       
-       this.JpegMeta.JpegFile.prototype._tifftags = {
-           /* A. Tags relating to image data structure */
-           256 : ["Image width", "ImageWidth"],
-           257 : ["Image height", "ImageLength"],
-           258 : ["Number of bits per component", "BitsPerSample"],
-           259 : ["Compression scheme", "Compression", 
-                  {1 : "uncompressed", 6 : "JPEG compression" }],
-           262 : ["Pixel composition", "PhotmetricInerpretation",
-                  {2 : "RGB", 6 : "YCbCr"}],
-           274 : ["Orientation of image", "Orientation",
-                  /* FIXME: Check the mirror-image / reverse encoding and rotation */
-                  {1 : "Normal", 2 : "Reverse?", 
-                   3 : "Upside-down", 4 : "Upside-down Reverse",
-                   5 : "90 degree CW", 6 : "90 degree CW reverse",
-                   7 : "90 degree CCW", 8 : "90 degree CCW reverse"}],
-           277 : ["Number of components", "SamplesPerPixel"],
-           284 : ["Image data arrangement", "PlanarConfiguration",
-                  {1 : "chunky format", 2 : "planar format"}],
-           530 : ["Subsampling ratio of Y to C", "YCbCrSubSampling"],
-           531 : ["Y and C positioning", "YCbCrPositioning",
-                  {1 : "centered", 2 : "co-sited"}],
-           282 : ["X Resolution", "XResolution"],
-           283 : ["Y Resolution", "YResolution"],
-           296 : ["Resolution Unit", "ResolutionUnit",
-                  {2 : "inches", 3 : "centimeters"}],
-           /* B. Tags realting to recording offset */
-           273 : ["Image data location", "StripOffsets"],
-           278 : ["Number of rows per strip", "RowsPerStrip"],
-           279 : ["Bytes per compressed strip", "StripByteCounts"],
-           513 : ["Offset to JPEG SOI", "JPEGInterchangeFormat"],
-           514 : ["Bytes of JPEG Data", "JPEGInterchangeFormatLength"],
-           /* C. Tags relating to image data characteristics */
-           301 : ["Transfer function", "TransferFunction"],
-           318 : ["White point chromaticity", "WhitePoint"],
-           319 : ["Chromaticities of primaries", "PrimaryChromaticities"],
-           529 : ["Color space transformation matrix coefficients", "YCbCrCoefficients"],
-           532 : ["Pair of black and white reference values", "ReferenceBlackWhite"],
-           /* D. Other tags */
-           306 : ["Date and time", "DateTime"],
-           270 : ["Image title", "ImageDescription"],
-           271 : ["Make", "Make"],
-           272 : ["Model", "Model"],
-           305 : ["Software", "Software"],
-           315 : ["Person who created the image", "Artist"],
-           316 : ["Host Computer", "HostComputer"],
-           33432 : ["Copyright holder", "Copyright"],
-           
-           34665 : ["Exif tag", "ExifIfdPointer"],
-           34853 : ["GPS tag", "GPSInfoIfdPointer"]
-       };
-       
-       this.JpegMeta.JpegFile.prototype._exiftags = {
-           /* Tag Support Levels (2) - 0th IFX Exif Private Tags */
-           /* A. Tags Relating to Version */
-           36864 : ["Exif Version", "ExifVersion"],
-           40960 : ["FlashPix Version", "FlashpixVersion"],
-           
-           /* B. Tag Relating to Image Data Characteristics */
-           40961 : ["Color Space", "ColorSpace"],
-           
-           /* C. Tags Relating to Image Configuration */
-           37121 : ["Meaning of each component", "ComponentsConfiguration"],
-           37122 : ["Compressed Bits Per Pixel", "CompressedBitsPerPixel"],
-           40962 : ["Pixel X Dimension", "PixelXDimension"],
-           40963 : ["Pixel Y Dimension", "PixelYDimension"],
-           
-           /* D. Tags Relating to User Information */
-           37500 : ["Manufacturer notes", "MakerNote"],
-           37510 : ["User comments", "UserComment"],
-           
-           /* E. Tag Relating to Related File Information */
-           40964 : ["Related audio file", "RelatedSoundFile"],
-           
-           /* F. Tags Relating to Date and Time */
-           36867 : ["Date Time Original", "DateTimeOriginal"],
-           36868 : ["Date Time Digitized", "DateTimeDigitized"],
-           37520 : ["DateTime subseconds", "SubSecTime"],
-           37521 : ["DateTimeOriginal subseconds", "SubSecTimeOriginal"],
-           37522 : ["DateTimeDigitized subseconds", "SubSecTimeDigitized"],
-           
-           /* G. Tags Relating to Picture-Taking Conditions */
-           33434 : ["Exposure time", "ExposureTime"],
-           33437 : ["FNumber", "FNumber"],
-           34850 : ["Exposure program", "ExposureProgram"],
-           34852 : ["Spectral sensitivity", "SpectralSensitivity"],
-           34855 : ["ISO Speed Ratings", "ISOSpeedRatings"],
-           34856 : ["Optoelectric coefficient", "OECF"],
-           37377 : ["Shutter Speed",  "ShutterSpeedValue"],
-           37378 : ["Aperture Value", "ApertureValue"],
-           37379 : ["Brightness", "BrightnessValue"],
-           37380 : ["Exposure Bias Value", "ExposureBiasValue"],
-           37381 : ["Max Aperture Value", "MaxApertureValue"],
-           37382 : ["Subject Distance", "SubjectDistance"],
-           37383 : ["Metering Mode", "MeteringMode"],
-           37384 : ["Light Source", "LightSource"],
-           37385 : ["Flash", "Flash"],
-           37386 : ["Focal Length", "FocalLength"],
-           37396 : ["Subject Area", "SubjectArea"],
-           41483 : ["Flash Energy", "FlashEnergy"],
-           41484 : ["Spatial Frequency Response", "SpatialFrequencyResponse"],
-           41486 : ["Focal Plane X Resolution", "FocalPlaneXResolution"],
-           41487 : ["Focal Plane Y Resolution", "FocalPlaneYResolution"],
-           41488 : ["Focal Plane Resolution Unit", "FocalPlaneResolutionUnit"],
-           41492 : ["Subject Location", "SubjectLocation"],
-           41493 : ["Exposure Index", "ExposureIndex"],
-           41495 : ["Sensing Method", "SensingMethod"],
-           41728 : ["File Source", "FileSource"],
-           41729 : ["Scene Type", "SceneType"],
-           41730 : ["CFA Pattern", "CFAPattern"],
-           41985 : ["Custom Rendered", "CustomRendered"],
-           41986 : ["Exposure Mode", "Exposure Mode"],
-           41987 : ["White Balance", "WhiteBalance"],
-           41988 : ["Digital Zoom Ratio", "DigitalZoomRatio"],
-           41990 : ["Scene Capture Type", "SceneCaptureType"],
-           41991 : ["Gain Control", "GainControl"],
-           41992 : ["Contrast", "Contrast"],
-           41993 : ["Saturation", "Saturation"],
-           41994 : ["Sharpness", "Sharpness"],
-           41995 : ["Device settings description", "DeviceSettingDescription"],
-           41996 : ["Subject distance range", "SubjectDistanceRange"],
-           
-           /* H. Other Tags */
-           42016 : ["Unique image ID", "ImageUniqueID"],
-           
-           40965 : ["Interoperability tag", "InteroperabilityIFDPointer"]
-       };
-       
-       this.JpegMeta.JpegFile.prototype._gpstags = {
-           /* A. Tags Relating to GPS */
-           0 : ["GPS tag version", "GPSVersionID"],
-           1 : ["North or South Latitude", "GPSLatitudeRef"],
-           2 : ["Latitude", "GPSLatitude"],
-           3 : ["East or West Longitude", "GPSLongitudeRef"],
-           4 : ["Longitude", "GPSLongitude"],
-           5 : ["Altitude reference", "GPSAltitudeRef"],
-           6 : ["Altitude", "GPSAltitude"],
-           7 : ["GPS time (atomic clock)", "GPSTimeStamp"],
-           8 : ["GPS satellites usedd for measurement", "GPSSatellites"],
-           9 : ["GPS receiver status", "GPSStatus"],
-           10 : ["GPS mesaurement mode", "GPSMeasureMode"],
-           11 : ["Measurement precision", "GPSDOP"],
-           12 : ["Speed unit", "GPSSpeedRef"],
-           13 : ["Speed of GPS receiver", "GPSSpeed"],
-           14 : ["Reference for direction of movement", "GPSTrackRef"],
-           15 : ["Direction of movement", "GPSTrack"],
-           16 : ["Reference for direction of image", "GPSImgDirectionRef"],
-           17 : ["Direction of image", "GPSImgDirection"],
-           18 : ["Geodetic survey data used", "GPSMapDatum"],
-           19 : ["Reference for latitude of destination", "GPSDestLatitudeRef"],
-           20 : ["Latitude of destination", "GPSDestLatitude"],
-           21 : ["Reference for longitude of destination", "GPSDestLongitudeRef"],
-           22 : ["Longitude of destination", "GPSDestLongitude"],
-           23 : ["Reference for bearing of destination", "GPSDestBearingRef"],
-           24 : ["Bearing of destination", "GPSDestBearing"],
-           25 : ["Reference for distance to destination", "GPSDestDistanceRef"],
-           26 : ["Distance to destination", "GPSDestDistance"],
-           27 : ["Name of GPS processing method", "GPSProcessingMethod"],
-           28 : ["Name of GPS area", "GPSAreaInformation"],
-           29 : ["GPS Date", "GPSDateStamp"],
-           30 : ["GPS differential correction", "GPSDifferential"]
-       };
-
-       this.JpegMeta.JpegFile.prototype._markers = {
-           /* Start Of Frame markers, non-differential, Huffman coding */
-           0xc0: ["SOF0", "_sofHandler", "Baseline DCT"],
-           0xc1: ["SOF1", "_sofHandler", "Extended sequential DCT"],
-           0xc2: ["SOF2", "_sofHandler", "Progressive DCT"],
-           0xc3: ["SOF3", "_sofHandler", "Lossless (sequential)"],
-           
-           /* Start Of Frame markers, differential, Huffman coding */
-           0xc5: ["SOF5", "_sofHandler", "Differential sequential DCT"],
-           0xc6: ["SOF6", "_sofHandler", "Differential progressive DCT"],
-           0xc7: ["SOF7", "_sofHandler", "Differential lossless (sequential)"],
-           
-           /* Start Of Frame markers, non-differential, arithmetic coding */
-           0xc8: ["JPG", null, "Reserved for JPEG extensions"],
-           0xc9: ["SOF9", "_sofHandler", "Extended sequential DCT"],
-           0xca: ["SOF10", "_sofHandler", "Progressive DCT"],
-           0xcb: ["SOF11", "_sofHandler", "Lossless (sequential)"],
-           
-           /* Start Of Frame markers, differential, arithmetic coding */
-           0xcd: ["SOF13", "_sofHandler", "Differential sequential DCT"],
-           0xce: ["SOF14", "_sofHandler", "Differential progressive DCT"],
-           0xcf: ["SOF15", "_sofHandler", "Differential lossless (sequential)"],
-           
-           /* Huffman table specification */
-           0xc4: ["DHT", null, "Define Huffman table(s)"],
-           0xcc: ["DAC", null, "Define arithmetic coding conditioning(s)"],
-           
-           /* Restart interval termination" */
-           0xd0: ["RST0", null, "Restart with modulo 8 count “0”"],
-           0xd1: ["RST1", null, "Restart with modulo 8 count “1”"],
-           0xd2: ["RST2", null, "Restart with modulo 8 count “2”"],
-           0xd3: ["RST3", null, "Restart with modulo 8 count “3”"],
-           0xd4: ["RST4", null, "Restart with modulo 8 count “4”"],
-           0xd5: ["RST5", null, "Restart with modulo 8 count “5”"],
-           0xd6: ["RST6", null, "Restart with modulo 8 count “6”"],
-           0xd7: ["RST7", null, "Restart with modulo 8 count “7”"],
-           
-           /* Other markers */
-           0xd8: ["SOI", null, "Start of image"],
-           0xd9: ["EOI", null, "End of image"],
-           0xda: ["SOS", null, "Start of scan"],
-           0xdb: ["DQT", null, "Define quantization table(s)"],
-           0xdc: ["DNL", null, "Define number of lines"],
-           0xdd: ["DRI", null, "Define restart interval"],
-           0xde: ["DHP", null, "Define hierarchical progression"],
-           0xdf: ["EXP", null, "Expand reference component(s)"],
-           0xe0: ["APP0", "_app0Handler", "Reserved for application segments"],
-           0xe1: ["APP1", "_app1Handler"],
-           0xe2: ["APP2", null],
-           0xe3: ["APP3", null],
-           0xe4: ["APP4", null],
-           0xe5: ["APP5", null],
-           0xe6: ["APP6", null],
-           0xe7: ["APP7", null],
-           0xe8: ["APP8", null],
-           0xe9: ["APP9", null],
-           0xea: ["APP10", null],
-           0xeb: ["APP11", null],
-           0xec: ["APP12", null],
-           0xed: ["APP13", null],
-           0xee: ["APP14", null],
-           0xef: ["APP15", null],
-           0xf0: ["JPG0", null], /* Reserved for JPEG extensions */
-           0xf1: ["JPG1", null],
-           0xf2: ["JPG2", null],
-           0xf3: ["JPG3", null],
-           0xf4: ["JPG4", null],
-           0xf5: ["JPG5", null],
-           0xf6: ["JPG6", null],
-           0xf7: ["JPG7", null],
-           0xf8: ["JPG8", null],
-           0xf9: ["JPG9", null],
-           0xfa: ["JPG10", null],
-           0xfb: ["JPG11", null],
-           0xfc: ["JPG12", null],
-           0xfd: ["JPG13", null],
-           0xfe: ["COM", null], /* Comment */
-           
-           /* Reserved markers */
-           0x01: ["JPG13", null] /* For temporary private use in arithmetic coding */
-           /* 02 -> bf are reserverd */
-       };
-
-       /* Private methods */
-       this.JpegMeta.JpegFile.prototype._addMetaGroup = function _addMetaGroup(name, description) {
-           var group = new JpegMeta.MetaGroup(name, description);
-           this[group.fieldName] = group;
-           this.metaGroups[group.fieldName] = group;
-           return group;
-       };
-
-       this.JpegMeta.JpegFile.prototype._parseIfd = function _parseIfd(endian, _binary_data, base, ifd_offset, tags, name, description) {
-           var num_fields = JpegMeta.parseNum(endian, _binary_data, base + ifd_offset, 2);
-           /* Per tag variables */
-           var i, j;
-           var tag_base;
-           var tag_field;
-           var type, type_field, type_size;
-           var num_values;
-           var value_offset;
-           var value;
-           var _val;
-           var num;
-           var den;
-           
-           var group;
-           
-           group = this._addMetaGroup(name, description);
-       
-           for (var i = 0; i < num_fields; i++) {
-               /* parse the field */
-               tag_base = base + ifd_offset + 2 + (i * 12);
-               tag_field = JpegMeta.parseNum(endian, _binary_data, tag_base, 2);
-               type_field = JpegMeta.parseNum(endian, _binary_data, tag_base + 2, 2);
-               num_values = JpegMeta.parseNum(endian, _binary_data, tag_base + 4, 4);
-               value_offset = JpegMeta.parseNum(endian, _binary_data, tag_base + 8, 4);
-               if (this._types[type_field] === undefined) {
-                   continue;
-               }
-               type = this._types[type_field][0];
-               type_size = this._types[type_field][1];
-               
-               if (type_size * num_values <= 4) {
-                   /* Data is in-line */
-                   value_offset = tag_base + 8;
-               } else {
-                   value_offset = base + value_offset;
-               }
-               
-               /* Read the value */
-               if (type == "UNDEFINED") {
-                   value = _binary_data.slice(value_offset, value_offset + num_values);
-               } else if (type == "ASCII") {
-                   value = _binary_data.slice(value_offset, value_offset + num_values);
-                   value = value.split('\x00')[0];
-                   /* strip trail nul */
-               } else {
-                   value = new Array();
-                   for (j = 0; j < num_values; j++, value_offset += type_size) {
-                       if (type == "BYTE" || type == "SHORT" || type == "LONG") {
-                           value.push(JpegMeta.parseNum(endian, _binary_data, value_offset, type_size));
-                       }
-                       if (type == "SBYTE" || type == "SSHORT" || type == "SLONG") {
-                           value.push(JpegMeta.parseSnum(endian, _binary_data, value_offset, type_size));
-                       }
-                       if (type == "RATIONAL") {
-                           num = JpegMeta.parseNum(endian, _binary_data, value_offset, 4);
-                           den = JpegMeta.parseNum(endian, _binary_data, value_offset + 4, 4);
-                           value.push(new JpegMeta.Rational(num, den));
-                       }
-                       if (type == "SRATIONAL") {
-                           num = JpegMeta.parseSnum(endian, _binary_data, value_offset, 4);
-                           den = JpegMeta.parseSnum(endian, _binary_data, value_offset + 4, 4);
-                           value.push(new JpegMeta.Rational(num, den));
-                       }
-                       value.push();
-                   }
-                   if (num_values === 1) {
-                       value = value[0];
-                   }
-               }
-               if (tags[tag_field] !== undefined) {
-                       group._addProperty(tags[tag_field][1], tags[tag_field][0], value);
-               }
-           }
-       };
-
-       this.JpegMeta.JpegFile.prototype._jfifHandler = function _jfifHandler(mark, pos) {
-           if (this.jfif !== undefined) {
-               throw Error("Multiple JFIF segments found");
-           }
-           this._addMetaGroup("jfif", "JFIF");
-           this.jfif._addProperty("version_major", "Version Major", this._binary_data.charCodeAt(pos + 5));
-           this.jfif._addProperty("version_minor", "Version Minor", this._binary_data.charCodeAt(pos + 6));
-           this.jfif._addProperty("version", "JFIF Version", this.jfif.version_major.value + "." + this.jfif.version_minor.value);
-           this.jfif._addProperty("units", "Density Unit", this._binary_data.charCodeAt(pos + 7));
-           this.jfif._addProperty("Xdensity", "X density", JpegMeta.parseNum(">", this._binary_data, pos + 8, 2));
-           this.jfif._addProperty("Ydensity", "Y Density", JpegMeta.parseNum(">", this._binary_data, pos + 10, 2));
-           this.jfif._addProperty("Xthumbnail", "X Thumbnail", JpegMeta.parseNum(">", this._binary_data, pos + 12, 1));
-           this.jfif._addProperty("Ythumbnail", "Y Thumbnail", JpegMeta.parseNum(">", this._binary_data, pos + 13, 1));
-       };
-
-       /* Handle app0 segments */
-       this.JpegMeta.JpegFile.prototype._app0Handler = function app0Handler(mark, pos) {
-           var ident = this._binary_data.slice(pos, pos + 5);
-           if (ident == this._JFIF_IDENT) {
-               this._jfifHandler(mark, pos);
-           } else if (ident == this._JFXX_IDENT) {
-               /* Don't handle JFXX Ident yet */
-           } else {
-               /* Don't know about other idents */
-           }
-       };
-
-       /* Handle app1 segments */
-       this.JpegMeta.JpegFile.prototype._app1Handler = function _app1Handler(mark, pos) {
-           var ident = this._binary_data.slice(pos, pos + 5);
-           if (ident == this._EXIF_IDENT) {
-               this._exifHandler(mark, pos + 6);
-           } else {
-               /* Don't know about other idents */
-           }
-       };
-
-       /* Handle exif segments */
-       JpegMeta.JpegFile.prototype._exifHandler = function _exifHandler(mark, pos) {
-           if (this.exif !== undefined) {
-               throw new Error("Multiple JFIF segments found");
-           }
-           
-           /* Parse this TIFF header */
-           var endian;
-           var magic_field;
-           var ifd_offset;
-           var primary_ifd, exif_ifd, gps_ifd;
-           var endian_field = this._binary_data.slice(pos, pos + 2);
-           
-           /* Trivia: This 'I' is for Intel, the 'M' is for Motorola */
-           if (endian_field === "II") {
-               endian = "<";
-           } else if (endian_field === "MM") {
-               endian = ">";
-           } else {
-               throw new Error("Malformed TIFF meta-data. Unknown endianess: " + endian_field);
-           }
-           
-           magic_field = JpegMeta.parseNum(endian, this._binary_data, pos + 2, 2);
-           
-           if (magic_field !== 42) {
-               throw new Error("Malformed TIFF meta-data. Bad magic: " + magic_field);
-           }
-           
-           ifd_offset = JpegMeta.parseNum(endian, this._binary_data, pos + 4, 4);
-           
-           /* Parse 0th IFD */
-           this._parseIfd(endian, this._binary_data, pos, ifd_offset, this._tifftags, "tiff", "TIFF");
-           
-           if (this.tiff.ExifIfdPointer) {
-               this._parseIfd(endian, this._binary_data, pos, this.tiff.ExifIfdPointer.value, this._exiftags, "exif", "Exif");
-           }
-           
-           if (this.tiff.GPSInfoIfdPointer) {
-               this._parseIfd(endian, this._binary_data, pos, this.tiff.GPSInfoIfdPointer.value, this._gpstags, "gps", "GPS");
-               if (this.gps.GPSLatitude) {
-                   var latitude;
-                   latitude = this.gps.GPSLatitude.value[0].asFloat() + 
-                       (1 / 60) * this.gps.GPSLatitude.value[1].asFloat() + 
-                       (1 / 3600) * this.gps.GPSLatitude.value[2].asFloat();
-                   if (this.gps.GPSLatitudeRef.value === "S") {
-                       latitude = -latitude;
-                   }
-                   this.gps._addProperty("latitude", "Dec. Latitude", latitude);
-               }
-               if (this.gps.GPSLongitude) {
-                   var longitude;
-                   longitude = this.gps.GPSLongitude.value[0].asFloat() + 
-                       (1 / 60) * this.gps.GPSLongitude.value[1].asFloat() + 
-                       (1 / 3600) * this.gps.GPSLongitude.value[2].asFloat();
-                   if (this.gps.GPSLongitudeRef.value === "W") {
-                       longitude = -longitude;
-                   }
-                   this.gps._addProperty("longitude", "Dec. Longitude", longitude);
-               }
-           }
-       };
-
-       // MediaWiki: Add mw.libs wrapper
-       mw.libs.jpegmeta = function( fileReaderResult, fileName ) {
-               return new JpegMeta.JpegFile( fileReaderResult, fileName );
-       };
-
-}() );
diff --git a/resources/mediawiki.page/mediawiki.page.gallery.js b/resources/mediawiki.page/mediawiki.page.gallery.js
deleted file mode 100644 (file)
index f92d372..0000000
+++ /dev/null
@@ -1,253 +0,0 @@
-/**
- * Show gallery captions when focused. Copied directly from jquery.mw-jump.js.
- * Also Dynamically resize images to justify them.
- */
-( function ( $, mw ) {
-       $( function () {
-               var isTouchScreen,
-                       gettingFocus,
-                       galleries = 'ul.mw-gallery-packed-overlay, ul.mw-gallery-packed-hover, ul.mw-gallery-packed';
-
-               // Is there a better way to detect a touchscreen? Current check taken from stack overflow.
-               isTouchScreen = !!( window.ontouchstart !== undefined || window.DocumentTouch !== undefined && document instanceof window.DocumentTouch );
-
-               if ( isTouchScreen ) {
-                       // Always show the caption for a touch screen.
-                       $( 'ul.mw-gallery-packed-hover' )
-                               .addClass( 'mw-gallery-packed-overlay' )
-                               .removeClass( 'mw-gallery-packed-hover' );
-               } else {
-                       // Note use of just "a", not a.image, since we want this to trigger if a link in
-                       // the caption receives focus
-                       $( 'ul.mw-gallery-packed-hover li.gallerybox' ).on( 'focus blur', 'a', function ( e ) {
-                               // Confusingly jQuery leaves e.type as focusout for delegated blur events
-                               gettingFocus = e.type !== 'blur' && e.type !== 'focusout';
-                               $( this ).closest( 'li.gallerybox' ).toggleClass( 'mw-gallery-focused', gettingFocus );
-                       } );
-               }
-
-               // Now on to justification.
-               // We may still get ragged edges if someone resizes their window. Could bind to
-               // that event, otoh do we really want to constantly be resizing galleries?
-               $( galleries ).each( function () {
-                       var lastTop,
-                               $img,
-                               imgWidth,
-                               imgHeight,
-                               rows = [],
-                               $gallery = $( this );
-
-                       $gallery.children( 'li' ).each( function () {
-                               // Math.floor to be paranoid if things are off by 0.00000000001
-                               var top = Math.floor( $( this ).position().top ),
-                                       $this = $( this );
-
-                               if ( top !== lastTop ) {
-                                       rows[rows.length] = [];
-                                       lastTop = top;
-                               }
-
-                               $img = $this.find( 'div.thumb a.image img' );
-                               if ( $img.length && $img[0].height ) {
-                                       imgHeight = $img[0].height;
-                                       imgWidth = $img[0].width;
-                               } else {
-                                       // If we don't have a real image, get the containing divs width/height.
-                                       // Note that if we do have a real image, using this method will generally
-                                       // give the same answer, but can be different in the case of a very
-                                       // narrow image where extra padding is added.
-                                       imgHeight = $this.children().children( 'div:first' ).height();
-                                       imgWidth = $this.children().children( 'div:first' ).width();
-                               }
-
-                               // Hack to make an edge case work ok
-                               if ( imgHeight < 30 ) {
-                                       // Don't try and resize this item.
-                                       imgHeight = 0;
-                               }
-
-                               rows[rows.length - 1][rows[rows.length - 1].length] = {
-                                       $elm: $this,
-                                       width: $this.outerWidth(),
-                                       imgWidth: imgWidth,
-                                       // XXX: can divide by 0 ever happen?
-                                       aspect: imgWidth / imgHeight,
-                                       captionWidth: $this.children().children( 'div.gallerytextwrapper' ).width(),
-                                       height: imgHeight
-                               };
-                       } );
-
-                       ( function () {
-                               var maxWidth,
-                                       combinedAspect,
-                                       combinedPadding,
-                                       curRow,
-                                       curRowHeight,
-                                       wantedWidth,
-                                       preferredHeight,
-                                       newWidth,
-                                       padding,
-                                       $outerDiv,
-                                       $innerDiv,
-                                       $imageDiv,
-                                       $imageElm,
-                                       imageElm,
-                                       $caption,
-                                       hookInfo,
-                                       i,
-                                       j,
-                                       avgZoom,
-                                       totalZoom = 0;
-
-                               for ( i = 0; i < rows.length; i++ ) {
-                                       maxWidth = $gallery.width();
-                                       combinedAspect = 0;
-                                       combinedPadding = 0;
-                                       curRow = rows[i];
-                                       curRowHeight = 0;
-
-                                       for ( j = 0; j < curRow.length; j++ ) {
-                                               if ( curRowHeight === 0 ) {
-                                                       if ( isFinite( curRow[j].height ) ) {
-                                                               // Get the height of this row, by taking the first
-                                                               // non-out of bounds height
-                                                               curRowHeight = curRow[j].height;
-                                                       }
-                                               }
-
-                                               if ( curRow[j].aspect === 0 || !isFinite( curRow[j].aspect ) ) {
-                                                       mw.log( 'Skipping item ' + j + ' due to aspect: ' + curRow[j].aspect );
-                                                       // One of the dimensions are 0. Probably should
-                                                       // not try to resize.
-                                                       combinedPadding += curRow[j].width;
-                                               } else {
-                                                       combinedAspect += curRow[j].aspect;
-                                                       combinedPadding += curRow[j].width - curRow[j].imgWidth;
-                                               }
-                                       }
-
-                                       // Add some padding for inter-element spacing.
-                                       combinedPadding += 5 * curRow.length;
-                                       wantedWidth = maxWidth - combinedPadding;
-                                       preferredHeight = wantedWidth / combinedAspect;
-
-                                       if ( preferredHeight > curRowHeight * 1.5 ) {
-                                               // Only expand at most 1.5 times current size
-                                               // As that's as high a resolution as we have.
-                                               // Also on the off chance there is a bug in this
-                                               // code, would prevent accidentally expanding to
-                                               // be 10 billion pixels wide.
-                                               mw.log( 'mw.page.gallery: Cannot fit row, aspect is ' + preferredHeight / curRowHeight );
-                                               if ( i === rows.length - 1 ) {
-                                                       // If its the last row, and we can't fit it,
-                                                       // don't make the entire row huge.
-                                                       avgZoom = ( totalZoom / ( rows.length - 1 ) ) * curRowHeight;
-                                                       if ( isFinite( avgZoom ) && avgZoom >= 1 && avgZoom <= 1.5 ) {
-                                                               preferredHeight = avgZoom;
-                                                       } else {
-                                                               // Probably a single row gallery
-                                                               preferredHeight = curRowHeight;
-                                                       }
-                                               } else {
-                                                       preferredHeight = 1.5 * curRowHeight;
-                                               }
-                                       }
-                                       if ( !isFinite( preferredHeight ) ) {
-                                               // This *definitely* should not happen.
-                                               mw.log( 'mw.page.gallery: Trying to resize row ' + i + ' to ' + preferredHeight + '?!' );
-                                               // Skip this row.
-                                               continue;
-                                       }
-                                       if ( preferredHeight < 5 ) {
-                                               // Well something clearly went wrong...
-                                               mw.log( {
-                                                       maxWidth: maxWidth,
-                                                       combinedPadding: combinedPadding,
-                                                       combinedAspect: combinedAspect,
-                                                       wantedWidth: wantedWidth
-                                               } );
-                                               mw.log( 'mw.page.gallery: [BUG!] Fitting row ' + i + ' to too small a size: ' + preferredHeight );
-                                               // Skip this row.
-                                               continue;
-                                       }
-
-                                       if ( preferredHeight / curRowHeight > 1 ) {
-                                               totalZoom += preferredHeight / curRowHeight;
-                                       } else {
-                                               // If we shrink, still consider that a zoom of 1
-                                               totalZoom += 1;
-                                       }
-
-                                       for ( j = 0; j < curRow.length; j++ ) {
-                                               newWidth = preferredHeight * curRow[j].aspect;
-                                               padding = curRow[j].width - curRow[j].imgWidth;
-                                               $outerDiv = curRow[j].$elm;
-                                               $innerDiv = $outerDiv.children( 'div' ).first();
-                                               $imageDiv = $innerDiv.children( 'div.thumb' );
-                                               $imageElm = $imageDiv.find( 'img' ).first();
-                                               imageElm = $imageElm.length ? $imageElm[0] : null;
-                                               $caption = $outerDiv.find( 'div.gallerytextwrapper' );
-
-                                               // Since we are going to re-adjust the height, the vertical
-                                               // centering margins need to be reset.
-                                               $imageDiv.children( 'div' ).css( 'margin', '0px auto' );
-
-                                               if ( newWidth < 60 || !isFinite( newWidth ) ) {
-                                                       // Making something skinnier than this will mess up captions,
-                                                       mw.log( 'mw.page.gallery: Tried to make image ' + newWidth + 'px wide but too narrow.' );
-                                                       if ( newWidth < 1 || !isFinite( newWidth ) ) {
-                                                               $innerDiv.height( preferredHeight );
-                                                               // Don't even try and touch the image size if it could mean
-                                                               // making it disappear.
-                                                               continue;
-                                                       }
-                                               } else {
-                                                       $outerDiv.width( newWidth + padding );
-                                                       $innerDiv.width( newWidth + padding );
-                                                       $imageDiv.width( newWidth );
-                                                       $caption.width( curRow[j].captionWidth + ( newWidth - curRow[j].imgWidth ) );
-                                               }
-
-                                               hookInfo = {
-                                                       fullWidth: newWidth + padding,
-                                                       imgWidth: newWidth,
-                                                       imgHeight: preferredHeight,
-                                                       $innerDiv: $innerDiv,
-                                                       $imageDiv: $imageDiv,
-                                                       $outerDiv: $outerDiv,
-                                                       // Whether the hook took action
-                                                       resolved: false
-                                               };
-
-                                               /**
-                                                * Gallery resize.
-                                                *
-                                                * If your handler resizes an image, it should also set the resolved
-                                                * property to true. Additionally, because this module only exposes this
-                                                * logic temporarily, you should load your module in position top to
-                                                * ensure it is registered before this runs (FIXME: Don't use mw.hook)
-                                                *
-                                                * See TimedMediaHandler for an example.
-                                                *
-                                                * @event mediawiki_page_gallery_resize
-                                                * @member mw.hook
-                                                * @param {Object} hookInfo
-                                                */
-                                               mw.hook( 'mediawiki.page.gallery.resize' ).fire( hookInfo );
-
-                                               if ( !hookInfo.resolved ) {
-                                                       if ( imageElm ) {
-                                                               // We don't always have an img, e.g. in the case of an invalid file.
-                                                               imageElm.width = newWidth;
-                                                               imageElm.height = preferredHeight;
-                                                       } else {
-                                                               // Not a file box.
-                                                               $imageDiv.height( preferredHeight );
-                                                       }
-                                               }
-                                       }
-                               }
-                       } )();
-               } );
-       } );
-} )( jQuery, mediaWiki );
diff --git a/resources/mediawiki.page/mediawiki.page.image.pagination.js b/resources/mediawiki.page/mediawiki.page.image.pagination.js
deleted file mode 100644 (file)
index 50301bd..0000000
+++ /dev/null
@@ -1,93 +0,0 @@
-/**
- * Change multi-page image navigation so that the current page display can be changed
- * without a page reload. Currently, the only image formats that can be multi-page images are
- * PDF and DjVu files
- */
-( function ( mw, $ ) {
-
-       // Initialize ajax request variable
-       var xhr;
-
-       // Use jQuery's load function to specifically select and replace table.multipageimage's child
-       // tr with the new page's table.multipageimage's tr element.
-       // table.multipageimage always has only one row.
-       function loadPage( page, hist ) {
-               if ( xhr ) {
-                       // Abort previous requests to prevent backlog created by
-                       // repeatedly pressing back/forwards buttons
-                       xhr.abort();
-               }
-
-               var $multipageimage = $( 'table.multipageimage' ),
-                       $spinner;
-
-               // Add a new spinner if one doesn't already exist
-               if ( !$multipageimage.find( '.mw-spinner' ).length ) {
-
-                       $spinner = $.createSpinner( {
-                               size: 'large',
-                               type: 'block'
-                       } )
-                               // Set the spinner's dimensions equal to the table's dimensions so that
-                               // the current scroll position is not lost after the table is emptied prior to
-                               // its contents being updated
-                               .css( {
-                                       height: $multipageimage.find( 'tr' ).height(),
-                                       width: $multipageimage.find( 'tr' ).width()
-                               } );
-
-                       $multipageimage.empty().append( $spinner );
-               }
-
-               xhr = $.ajax( {
-                       url: page,
-                       success: function ( data ) {
-                               // Load the page
-                               $multipageimage.empty().append( $( data ).find( 'table.multipageimage tr' ) );
-                               // Fire hook because the page's content has changed
-                               mw.hook( 'wikipage.content' ).fire( $multipageimage );
-                               // Set up the new page for pagination
-                               ajaxifyPageNavigation();
-                               // Add new page of image to history.  To preserve the back-forwards chain in the browser,
-                               // if the user gets here via the back/forward button, don't update the history.
-                               if ( window.history && history.pushState && !hist ) {
-                                       history.pushState( { url: page }, document.title, page );
-                               }
-                       }
-               } );
-       }
-
-       function ajaxifyPageNavigation() {
-               // Intercept the default action of the links in the thumbnail navigation
-               $( '.multipageimagenavbox' ).one( 'click', 'a', function ( e ) {
-                       loadPage( this.href );
-                       e.preventDefault();
-               } );
-
-               // Prevent the submission of the page select form and instead call loadPage
-               $( 'form[name="pageselector"]' ).one( 'change submit', function ( e ) {
-                       loadPage( this.action + '?' + $( this ).serialize() );
-                       e.preventDefault();
-               } );
-       }
-
-       $( document ).ready( function () {
-               // The presence of table.multipageimage signifies that this file is a multi-page image
-               if ( mw.config.get( 'wgNamespaceNumber' ) === 6 && $( 'table.multipageimage' ).length !== 0 ) {
-                       ajaxifyPageNavigation();
-
-                       // Set up history.pushState (if available), so that when the user browses to a new page of
-                       // the same file, the browser's history is updated. If the user clicks the back/forward button
-                       // in the midst of navigating a file's pages, load the page inline.
-                       if ( window.history && history.pushState && history.replaceState ) {
-                               history.replaceState( { url: window.location.href }, '' );
-                               $( window ).on( 'popstate', function ( e ) {
-                                       var state = e.originalEvent.state;
-                                       if ( state ) {
-                                               loadPage( state.url, true );
-                                       }
-                               } );
-                       }
-               }
-       } );
-}( mediaWiki, jQuery ) );
diff --git a/resources/mediawiki.page/mediawiki.page.patrol.ajax.js b/resources/mediawiki.page/mediawiki.page.patrol.ajax.js
deleted file mode 100644 (file)
index 5fb14dd..0000000
+++ /dev/null
@@ -1,66 +0,0 @@
-/**
- * Animate patrol links to use asynchronous API requests to
- * patrol pages, rather than navigating to a different URI.
- *
- * @since 1.21
- * @author Marius Hoch <hoo@online.de>
- */
-( function ( mw, $ ) {
-       if ( !mw.user.tokens.exists( 'patrolToken' ) ) {
-               // Current user has no patrol right, or an old cached version of user.tokens
-               // that didn't have patrolToken yet.
-               return;
-       }
-       $( function () {
-               var $patrolLinks = $( '.patrollink a' );
-               $patrolLinks.on( 'click', function ( e ) {
-                       var $spinner, href, rcid, apiRequest;
-
-                       // Start preloading the notification module (normally loaded by mw.notify())
-                       mw.loader.load( ['mediawiki.notification'], null, true );
-
-                       // Hide the link and create a spinner to show it inside the brackets.
-                       $spinner = $.createSpinner( {
-                               size: 'small',
-                               type: 'inline'
-                       } );
-                       $( this ).hide().after( $spinner );
-
-                       href = $( this ).attr( 'href' );
-                       rcid = mw.util.getParamValue( 'rcid', href );
-                       apiRequest = new mw.Api();
-
-                       apiRequest.post( {
-                               action: 'patrol',
-                               token: mw.user.tokens.get( 'patrolToken' ),
-                               rcid: rcid
-                       } )
-                       .done( function ( data ) {
-                               // Remove all patrollinks from the page (including any spinners inside).
-                               $patrolLinks.closest( '.patrollink' ).remove();
-                               if ( data.patrol !== undefined ) {
-                                       // Success
-                                       var title = new mw.Title( data.patrol.title );
-                                       mw.notify( mw.msg( 'markedaspatrollednotify', title.toText() ) );
-                               } else {
-                                       // This should never happen as errors should trigger fail
-                                       mw.notify( mw.msg( 'markedaspatrollederrornotify' ) );
-                               }
-                       } )
-                       .fail( function ( error ) {
-                               $spinner.remove();
-                               // Restore the patrol link. This allows the user to try again
-                               // (or open it in a new window, bypassing this ajax module).
-                               $patrolLinks.show();
-                               if ( error === 'noautopatrol' ) {
-                                       // Can't patrol own
-                                       mw.notify( mw.msg( 'markedaspatrollederror-noautopatrol' ) );
-                               } else {
-                                       mw.notify( mw.msg( 'markedaspatrollederrornotify' ) );
-                               }
-                       } );
-
-                       e.preventDefault();
-               } );
-       } );
-}( mediaWiki, jQuery ) );
diff --git a/resources/mediawiki.page/mediawiki.page.ready.js b/resources/mediawiki.page/mediawiki.page.ready.js
deleted file mode 100644 (file)
index ccddb3e..0000000
+++ /dev/null
@@ -1,40 +0,0 @@
-( function ( mw, $ ) {
-       var supportsPlaceholder = 'placeholder' in document.createElement( 'input' );
-
-       mw.hook( 'wikipage.content' ).add( function ( $content ) {
-               var $sortableTables;
-
-               // Run jquery.placeholder polyfill if placeholder is not supported
-               if ( !supportsPlaceholder ) {
-                       $content.find( 'input[placeholder]' ).placeholder();
-               }
-
-               // Run jquery.makeCollapsible
-               $content.find( '.mw-collapsible' ).makeCollapsible();
-
-               // Lazy load jquery.tablesorter
-               $sortableTables = $content.find( 'table.sortable' );
-               if ( $sortableTables.length ) {
-                       mw.loader.using( 'jquery.tablesorter', function () {
-                               $sortableTables.tablesorter();
-                       } );
-               }
-
-               // Run jquery.checkboxShiftClick
-               $content.find( 'input[type="checkbox"]:not(.noshiftselect)' ).checkboxShiftClick();
-       } );
-
-       // Things outside the wikipage content
-       $( function () {
-
-               if ( !supportsPlaceholder ) {
-                       // Exclude content to avoid hitting it twice for the (first) wikipage content
-                       $( 'input[placeholder]' ).not( '#mw-content-text input' ).placeholder();
-               }
-
-               // Add accesskey hints to the tooltips
-               mw.util.updateTooltipAccessKeys();
-
-       } );
-
-}( mediaWiki, jQuery ) );
diff --git a/resources/mediawiki.page/mediawiki.page.startup.js b/resources/mediawiki.page/mediawiki.page.startup.js
deleted file mode 100644 (file)
index e354106..0000000
+++ /dev/null
@@ -1,38 +0,0 @@
-( function ( mw, $ ) {
-
-       mw.page = {};
-
-       // Client profile classes for <html>
-       // Allows for easy hiding/showing of JS or no-JS-specific UI elements
-       $( 'html' )
-               .addClass( 'client-js' )
-               .removeClass( 'client-nojs' );
-
-       $( function () {
-               // Initialize utilities as soon as the document is ready (mw.util.$content,
-               // messageBoxNew, profile, tooltip access keys, Table of contents toggle, ..).
-               // In the domready here instead of in mediawiki.page.ready to ensure that it gets enqueued
-               // before other modules hook into domready, so that mw.util.$content (defined by
-               // mw.util.init), is defined for them.
-               mw.util.init();
-
-               /**
-                * Fired when wiki content is being added to the DOM
-                *
-                * It is encouraged to fire it before the main DOM is changed (when $content
-                * is still detatched).  However, this order is not defined either way, so you
-                * should only rely on $content itself.
-                *
-                * This includes the ready event on a page load (including post-edit loads)
-                * and when content has been previewed with LivePreview.
-                *
-                * @event wikipage_content
-                * @member mw.hook
-                * @param {jQuery} $content The most appropriate element containing the content,
-                *   such as #mw-content-text (regular content root) or #wikiPreview (live preview
-                *   root)
-                */
-               mw.hook( 'wikipage.content' ).fire( $( '#mw-content-text' ) );
-       } );
-
-}( mediaWiki, jQuery ) );
diff --git a/resources/mediawiki.page/mediawiki.page.watch.ajax.js b/resources/mediawiki.page/mediawiki.page.watch.ajax.js
deleted file mode 100644 (file)
index 850177f..0000000
+++ /dev/null
@@ -1,179 +0,0 @@
-/**
- * Animate watch/unwatch links to use asynchronous API requests to
- * watch pages, rather than navigating to a different URI.
- *
- * @class mw.page.watch.ajax
- */
-( function ( mw, $ ) {
-       // The name of the page to watch or unwatch
-       var title = mw.config.get( 'wgRelevantPageName', mw.config.get( 'wgPageName' ) );
-
-       /**
-        * Update the link text, link href attribute and (if applicable)
-        * "loading" class.
-        *
-        * @param {jQuery} $link Anchor tag of (un)watch link
-        * @param {string} action One of 'watch', 'unwatch'
-        * @param {string} [state="idle"] 'idle' or 'loading'. Default is 'idle'
-        */
-       function updateWatchLink( $link, action, state ) {
-               var accesskeyTip, msgKey, $li, otherAction;
-
-               // A valid but empty jQuery object shouldn't throw a TypeError
-               if ( !$link.length ) {
-                       return;
-               }
-
-               // Invalid actions shouldn't silently turn the page in an unrecoverable state
-               if ( action !== 'watch' && action !== 'unwatch' ) {
-                       throw new Error( 'Invalid action' );
-               }
-
-               // message keys 'watch', 'watching', 'unwatch' or 'unwatching'.
-               msgKey = state === 'loading' ? action + 'ing' : action;
-               otherAction = action === 'watch' ? 'unwatch' : 'watch';
-               accesskeyTip = $link.attr( 'title' ).match( mw.util.tooltipAccessKeyRegexp );
-               $li = $link.closest( 'li' );
-
-               // Trigger a 'watchpage' event for this List item.
-               // Announce the otherAction value as the first param.
-               // Used to monitor the state of watch link.
-               // TODO: Revise when system wide hooks are implemented
-               if ( state === undefined ) {
-                       $li.trigger( 'watchpage.mw', otherAction );
-               }
-
-               $link
-                       .text( mw.msg( msgKey ) )
-                       .attr( 'title', mw.msg( 'tooltip-ca-' + action ) +
-                               ( accesskeyTip ? ' ' + accesskeyTip[0] : '' )
-                       )
-                       .attr( 'href', mw.util.wikiScript() + '?' + $.param( {
-                                       title: title,
-                                       action: action
-                               } )
-                       );
-
-               // Most common ID style
-               if ( $li.prop( 'id' ) === 'ca-' + otherAction ) {
-                       $li.prop( 'id', 'ca-' + action );
-               }
-
-               // Special case for vector icon
-               if ( $li.hasClass( 'icon' ) ) {
-                       if ( state === 'loading' ) {
-                               $link.addClass( 'loading' );
-                       } else {
-                               $link.removeClass( 'loading' );
-                       }
-               }
-       }
-
-       /**
-        * TODO: This should be moved somewhere more accessible.
-        *
-        * @private
-        * @param {string} url
-        * @return {string} The extracted action, defaults to 'view'
-        */
-       function mwUriGetAction( url ) {
-               var action, actionPaths, key, i, m, parts;
-
-               // TODO: Does MediaWiki give action path or query param
-               // precedence? If the former, move this to the bottom
-               action = mw.util.getParamValue( 'action', url );
-               if ( action !== null ) {
-                       return action;
-               }
-
-               actionPaths = mw.config.get( 'wgActionPaths' );
-               for ( key in actionPaths ) {
-                       if ( actionPaths.hasOwnProperty( key ) ) {
-                               parts = actionPaths[key].split( '$1' );
-                               for ( i = 0; i < parts.length; i++ ) {
-                                       parts[i] = $.escapeRE( parts[i] );
-                               }
-                               m = new RegExp( parts.join( '(.+)' ) ).exec( url );
-                               if ( m && m[1] ) {
-                                       return key;
-                               }
-
-                       }
-               }
-
-               return 'view';
-       }
-
-       // Expose public methods
-       mw.page.watch = {
-               updateWatchLink: updateWatchLink
-       };
-
-       $( function () {
-               var $links = $( '.mw-watchlink a, a.mw-watchlink, ' +
-                       '#ca-watch a, #ca-unwatch a, #mw-unwatch-link1, ' +
-                       '#mw-unwatch-link2, #mw-watch-link2, #mw-watch-link1' );
-
-               // Allowing people to add inline animated links is a little scary
-               $links = $links.filter( ':not( #bodyContent *, #content * )' );
-
-               $links.click( function ( e ) {
-                       var action, api, $link;
-
-                       // Start preloading the notification module (normally loaded by mw.notify())
-                       mw.loader.load( ['mediawiki.notification'], null, true );
-
-                       action = mwUriGetAction( this.href );
-
-                       if ( action !== 'watch' && action !== 'unwatch' ) {
-                               // Could not extract target action from link url,
-                               // let native browsing handle it further
-                               return true;
-                       }
-                       e.preventDefault();
-                       e.stopPropagation();
-
-                       $link = $( this );
-
-                       updateWatchLink( $link, action, 'loading' );
-
-                       api = new mw.Api();
-
-                       api[action]( title )
-                               .done( function ( watchResponse ) {
-                                       var otherAction = action === 'watch' ? 'unwatch' : 'watch';
-
-                                       mw.notify( $.parseHTML( watchResponse.message ), {
-                                               tag: 'watch-self'
-                                       } );
-
-                                       // Set link to opposite
-                                       updateWatchLink( $link, otherAction );
-
-                                       // Update the "Watch this page" checkbox on action=edit when the
-                                       // page is watched or unwatched via the tab (bug 12395).
-                                       $( '#wpWatchthis' ).prop( 'checked', watchResponse.watched !== undefined );
-                               } )
-                               .fail( function () {
-                                       var cleanTitle, msg, link;
-
-                                       // Reset link to non-loading mode
-                                       updateWatchLink( $link, action );
-
-                                       // Format error message
-                                       cleanTitle = title.replace( /_/g, ' ' );
-                                       link = mw.html.element(
-                                               'a', {
-                                                       href: mw.util.getUrl( title ),
-                                                       title: cleanTitle
-                                               }, cleanTitle
-                                       );
-                                       msg = mw.message( 'watcherrortext', link );
-
-                                       // Report to user about the error
-                                       mw.notify( msg, { tag: 'watch-self' } );
-                               } );
-               } );
-       } );
-
-}( mediaWiki, jQuery ) );
diff --git a/resources/mediawiki.special/images/glyph-people-large.png b/resources/mediawiki.special/images/glyph-people-large.png
deleted file mode 100644 (file)
index 0578be0..0000000
Binary files a/resources/mediawiki.special/images/glyph-people-large.png and /dev/null differ
diff --git a/resources/mediawiki.special/images/icon-contributors.png b/resources/mediawiki.special/images/icon-contributors.png
deleted file mode 100644 (file)
index f933aa6..0000000
Binary files a/resources/mediawiki.special/images/icon-contributors.png and /dev/null differ
diff --git a/resources/mediawiki.special/images/icon-edits.png b/resources/mediawiki.special/images/icon-edits.png
deleted file mode 100644 (file)
index 39f4f2d..0000000
Binary files a/resources/mediawiki.special/images/icon-edits.png and /dev/null differ
diff --git a/resources/mediawiki.special/images/icon-lock.png b/resources/mediawiki.special/images/icon-lock.png
deleted file mode 100644 (file)
index 03f0eec..0000000
Binary files a/resources/mediawiki.special/images/icon-lock.png and /dev/null differ
diff --git a/resources/mediawiki.special/images/icon-pages.png b/resources/mediawiki.special/images/icon-pages.png
deleted file mode 100644 (file)
index 59513db..0000000
Binary files a/resources/mediawiki.special/images/icon-pages.png and /dev/null differ
diff --git a/resources/mediawiki.special/mediawiki.special.block.css b/resources/mediawiki.special/mediawiki.special.block.css
deleted file mode 100644 (file)
index 899a9f3..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-/**
- * Styling for Special:Block
- */
-
-label[for="mw-input-wpConfirm"] {
-       font-weight: bold;
-}
diff --git a/resources/mediawiki.special/mediawiki.special.block.js b/resources/mediawiki.special/mediawiki.special.block.js
deleted file mode 100644 (file)
index 8dedb9b..0000000
+++ /dev/null
@@ -1,45 +0,0 @@
-/**
- * JavaScript for Special:Block
- */
-( function ( mw, $ ) {
-       $( function () {
-               var $blockTarget = $( '#mw-bi-target' ),
-                       $anonOnlyRow = $( '#mw-input-wpHardBlock' ).closest( 'tr' ),
-                       $enableAutoblockRow = $( '#mw-input-wpAutoBlock' ).closest( 'tr' ),
-                       $hideUser = $( '#mw-input-wpHideUser' ).closest( 'tr' ),
-                       $watchUser = $( '#mw-input-wpWatch' ).closest( 'tr' );
-
-               function updateBlockOptions( instant ) {
-                       var blocktarget = $.trim( $blockTarget.val() ),
-                               isEmpty = blocktarget === '',
-                               isIp = mw.util.isIPv4Address( blocktarget, true ) || mw.util.isIPv6Address( blocktarget, true ),
-                               isIpRange = isIp && blocktarget.match( /\/\d+$/ );
-
-                       if ( isIp && !isEmpty ) {
-                               $enableAutoblockRow.goOut( instant );
-                               $hideUser.goOut( instant );
-                       } else {
-                               $enableAutoblockRow.goIn( instant );
-                               $hideUser.goIn( instant );
-                       }
-                       if ( !isIp && !isEmpty ) {
-                               $anonOnlyRow.goOut( instant );
-                       } else {
-                               $anonOnlyRow.goIn( instant );
-                       }
-                       if ( isIpRange && !isEmpty ) {
-                               $watchUser.goOut( instant );
-                       } else {
-                               $watchUser.goIn( instant );
-                       }
-               }
-
-               if ( $blockTarget.length ) {
-                       // Bind functions so they're checked whenever stuff changes
-                       $blockTarget.keyup( updateBlockOptions );
-
-                       // Call them now to set initial state (ie. Special:Block/Foobar?wpBlockExpiry=2+hours)
-                       updateBlockOptions( /* instant= */ true );
-               }
-       } );
-}( mediaWiki, jQuery ) );
diff --git a/resources/mediawiki.special/mediawiki.special.changeemail.css b/resources/mediawiki.special/mediawiki.special.changeemail.css
deleted file mode 100644 (file)
index 9461fbd..0000000
+++ /dev/null
@@ -1,19 +0,0 @@
-#mw-emailaddress-validity {
-       padding: 2px 1em;
-}
-#mw-emailaddress-validity {
-       border-bottom-right-radius: 0.8em;
-       border-top-right-radius: 0.8em;
-}
-
-/** colors also used in mediawiki.special.preferences.css */
-#mw-emailaddress-validity.valid {
-       border: 1px solid #80FF80;
-       background-color: #C0FFC0;
-       color: black;
-}
-#mw-emailaddress-validity.invalid {
-       border: 1px solid #FF8080;
-       background-color: #FFC0C0;
-       color: black;
-}
diff --git a/resources/mediawiki.special/mediawiki.special.changeemail.js b/resources/mediawiki.special/mediawiki.special.changeemail.js
deleted file mode 100644 (file)
index bc2a0a2..0000000
+++ /dev/null
@@ -1,51 +0,0 @@
-/**
- * JavaScript for Special:ChangeEmail
- */
-( function ( mw, $ ) {
-       /**
-        * Given an email validity status (true, false, null) update the label CSS class
-        */
-       function updateMailValidityLabel( mail ) {
-               var isValid = mw.util.validateEmail( mail ),
-                       $label = $( '#mw-emailaddress-validity' );
-
-               // Set up the validity notice if it doesn't already exist
-               if ( $label.length === 0 ) {
-                       $label = $( '<label for="wpNewEmail" id="mw-emailaddress-validity"></label>' )
-                               .insertAfter( '#wpNewEmail' );
-               }
-
-               // We allow empty address
-               if ( isValid === null ) {
-                       $label.text( '' ).removeClass( 'valid invalid' );
-
-               // Valid
-               } else if ( isValid ) {
-                       $label.text( mw.msg( 'email-address-validity-valid' ) ).addClass( 'valid' ).removeClass( 'invalid' );
-
-               // Not valid
-               } else {
-                       $label.text( mw.msg( 'email-address-validity-invalid' ) ).addClass( 'invalid' ).removeClass( 'valid' );
-               }
-       }
-
-       $( function () {
-               $( '#wpNewEmail' )
-                       // Lame tip to let user know if its email is valid. See bug 22449.
-                       // Only bind once for 'blur' so that the user can fill it in without errors;
-                       // after that, look at every keypress for immediate feedback.
-                       .one( 'blur', function () {
-                               var $this = $( this );
-                               updateMailValidityLabel( $this.val() );
-                               $this.keyup( function () {
-                                       updateMailValidityLabel( $this.val() );
-                               } );
-                       } )
-                       // Supress built-in validation notice and just call updateMailValidityLabel(),
-                       // to avoid double notice. See bug 40909.
-                       .on( 'invalid', function ( e ) {
-                               e.preventDefault();
-                               updateMailValidityLabel( $( this ).val() );
-                       } );
-       } );
-}( mediaWiki, jQuery ) );
diff --git a/resources/mediawiki.special/mediawiki.special.changeslist.css b/resources/mediawiki.special/mediawiki.special.changeslist.css
deleted file mode 100644 (file)
index 5e4af7b..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-/**
- * Styling for Special:Watchlist and Special:RecentChanges
- */
-
-.mw-changeslist-line-watched .mw-title {
-       font-weight: bold;
-}
diff --git a/resources/mediawiki.special/mediawiki.special.changeslist.enhanced.css b/resources/mediawiki.special/mediawiki.special.changeslist.enhanced.css
deleted file mode 100644 (file)
index bed580d..0000000
+++ /dev/null
@@ -1,66 +0,0 @@
-/**
- * Styling for Special:Watchlist and Special:RecentChanges when preference 'usenewrc'
- * a.k.a. Enhanced Recent Changes is enabled.
- */
-
-table.mw-enhanced-rc {
-       border: 0;
-       border-spacing: 0;
-}
-
-table.mw-enhanced-rc th,
-table.mw-enhanced-rc td {
-       padding: 0;
-       vertical-align: top;
-}
-
-td.mw-enhanced-rc {
-       white-space: nowrap;
-       font-family: monospace;
-}
-
-.mw-enhanced-rc-time {
-       font-family: monospace;
-}
-
-table.mw-enhanced-rc td.mw-enhanced-rc-nested {
-       padding-left: 1em;
-}
-
-/* Show/hide arrows in enhanced changeslist */
-.mw-enhanced-rc .collapsible-expander {
-       float: none;
-}
-
-/* If JS is disabled, the arrows or the placeholder space shouldn't be shown */
-.client-nojs .mw-enhancedchanges-arrow-space {
-       display: none;
-}
-
-/*
- * And if it's enabled, let's optimize the collapsing a little: hide the rows
- * that would be hidden by jquery.makeCollapsible with CSS to save us some
- * reflows and repaints. This doesn't work on browsers that don't fully support
- * CSS2 (IE6), but it's okay, this will be done in JavaScript with old degraded
- * performance instead.
- */
-.client-js table.mw-enhanced-rc.mw-collapsed tr + tr {
-       display: none;
-}
-
-.mw-enhancedchanges-arrow-space {
-       display: inline-block;
-       *display: inline; /* IE7 and below */
-       zoom: 1;
-       width: 15px;
-       height: 15px;
-}
-
-/* let it look like it is clickable */
-.mw-enhancedchanges-arrow.mw-collapsible-toggle {
-       cursor: pointer;
-}
-
-.mw-enhanced-watched .mw-enhanced-rc-time {
-       font-weight: bold;
-}
diff --git a/resources/mediawiki.special/mediawiki.special.changeslist.legend.css b/resources/mediawiki.special/mediawiki.special.changeslist.legend.css
deleted file mode 100644 (file)
index 54d09b4..0000000
+++ /dev/null
@@ -1,29 +0,0 @@
-/**
- * Styling for changes list legend
- */
-
-.mw-changeslist-legend {
-       float: right;
-       margin-left: 1em;
-       margin-bottom: 0.5em;
-       clear: right;
-       font-size: 85%;
-       line-height: 1.2em;
-       padding: 0.5em;
-       border: 1px solid #ddd;
-}
-
-.mw-changeslist-legend dl {
-       /* Parent element defines sufficient padding */
-       margin-bottom: 0;
-}
-
-.mw-changeslist-legend dt {
-       float: left;
-       margin-right: 0.5em;
-}
-
-.mw-changeslist-legend dd {
-       margin-left: 1.5em;
-       line-height: 1.3em;
-}
diff --git a/resources/mediawiki.special/mediawiki.special.changeslist.legend.js b/resources/mediawiki.special/mediawiki.special.changeslist.legend.js
deleted file mode 100644 (file)
index 0259155..0000000
+++ /dev/null
@@ -1,25 +0,0 @@
-/**
- * Script for changes list legend
- */
-
-/* Remember the collapse state of the legend on recent changes and watchlist pages. */
-jQuery( document ).ready( function ( $ ) {
-       var
-               cookieName = 'changeslist-state',
-               cookieOptions = {
-                       expires: 30,
-                       path: '/'
-               },
-               isCollapsed = $.cookie( cookieName ) === 'collapsed';
-
-       $( '.mw-changeslist-legend' )
-               .makeCollapsible( {
-                       collapsed: isCollapsed
-               } )
-               .on( 'beforeExpand.mw-collapsible', function () {
-                       $.cookie( cookieName, 'expanded', cookieOptions );
-               } )
-               .on( 'beforeCollapse.mw-collapsible', function () {
-                       $.cookie( cookieName, 'collapsed', cookieOptions );
-               } );
-} );
diff --git a/resources/mediawiki.special/mediawiki.special.css b/resources/mediawiki.special/mediawiki.special.css
deleted file mode 100644 (file)
index a877b74..0000000
+++ /dev/null
@@ -1,287 +0,0 @@
-
-/**** Special:AllMessages ****/
-#mw-allmessagestable .allmessages-customised td.am_default {
-       background-color: #fcffc4;
-}
-
-#mw-allmessagestable tr.allmessages-customised:hover td.am_default {
-       background-color: #faff90;
-}
-
-#mw-allmessagestable td.am_actual {
-       background-color: #e2ffe2;
-}
-
-#mw-allmessagestable tr.allmessages-customised:hover + tr.allmessages-customised td.am_actual {
-       background-color: #b1ffb1;
-}
-
-/**** Special:Allpages ****/
-table.mw-allpages-table-form, table.mw-allpages-table-chunk {
-       width: 100%;
-}
-td.mw-allpages-alphaindexline {
-       text-align: right;
-}
-.mw-allpages-nav {
-       text-align: right;
-       margin-bottom: 1em;
-}
-table.mw-allpages-table-form tr {
-       vertical-align: top;
-}
-
-/**** Special:Block ****/
-tr.mw-block-hideuser {
-       font-weight: bold;
-}
-
-/**** Special:BlockList ****/
-table.mw-blocklist span.mw-usertoollinks,
-span.mw-blocklist-actions {
-       white-space: nowrap;
-       font-size: 90%;
-}
-
-/**** Special:Contributions ****/
-.mw-uctop {
-       font-weight: bold;
-}
-
-/**** Special:EmailUser ****/
-table.mw-emailuser-table {
-       width: 98%;
-}
-td#mw-emailuser-sender,
-td#mw-emailuser-recipient {
-       font-weight: bold;
-}
-
-/**** Special:ListGroupRights ****/
-table.mw-listgrouprights-table tr {
-       vertical-align: top;
-}
-.listgrouprights-revoked {
-       text-decoration: line-through;
-}
-
-/**** Special:Prefixindex ****/
-table#mw-prefixindex-list-table, /* HTML backwards-compatibility, to be removed before 1.23 */
-table.mw-prefixindex-list-table,
-table#mw-prefixindex-nav-table {
-       width: 98%;
-}
-td#mw-prefixindex-nav-form {
-       margin-bottom: 1em;
-       vertical-align: top;
-}
-.mw-prefixindex-nav {
-       text-align: right;
-}
-
-
-/**** Special:Search ****/
-.searchresults {
-}
-
-.searchresults p {
-       margin-left: 0.4em;
-       margin-top: 1em;
-       margin-bottom: 1.2em;
-}
-div.searchresult {
-       font-size: 95%;
-       width: 38em;
-}
-.mw-search-results {
-       margin-left: 0.4em;
-}
-.mw-search-results li {
-       padding-bottom: 1.2em;
-       list-style: none;
-       list-style-image: none;
-}
-.mw-search-results li a {
-       font-size: 108%;
-}
-.mw-search-result-data {
-       color: green;
-       font-size: 97%;
-}
-.mw-search-formheader {
-       background-color: #f3f3f3;
-       margin-top: 1em;
-       border: 1px solid silver;
-}
-.mw-search-formheader div.search-types {
-       float: left;
-       padding-left: 0.25em;
-}
-.mw-search-formheader div.search-types ul {
-       margin: 0 !important;
-       padding: 0 !important;
-       list-style: none !important;
-}
-.mw-search-formheader div.search-types ul li {
-       float: left;
-       margin: 0;
-       padding: 0;
-}
-.mw-search-formheader div.search-types ul li a {
-       display: block;
-       padding: 0.5em;
-}
-.mw-search-formheader div.search-types ul li.current a {
-       color: #333333;
-       cursor: default;
-}
-.mw-search-formheader div.search-types ul li.current a:hover {
-       text-decoration: none;
-}
-.mw-search-formheader div.results-info {
-       float: right;
-       padding: 0.5em;
-       padding-right: 0.75em;
-}
-.mw-search-formheader div.results-info ul {
-       margin: 0 !important;
-       padding: 0 !important;
-       list-style: none !important;
-}
-.mw-search-formheader div.results-info ul li {
-       float: right;
-       margin: 0;
-       padding: 0;
-}
-fieldset#mw-searchoptions {
-       margin: 0;
-       padding: 0.5em 0.75em 0.75em 0.75em !important;
-       border: none;
-       background-color: #f9f9f9;
-       border: 1px solid silver !important;
-       border-top-width: 0 !important;
-}
-fieldset#mw-searchoptions legend {
-       display: none;
-}
-fieldset#mw-searchoptions h4 {
-       padding: 0;
-       margin: 0;
-       float: left;
-}
-fieldset#mw-searchoptions div#mw-search-togglebox {
-       float: right;
-}
-fieldset#mw-searchoptions div#mw-search-togglebox label {
-       margin-right: 0.25em;
-}
-fieldset#mw-searchoptions div#mw-search-togglebox input {
-       margin-left: 0.25em;
-}
-fieldset#mw-searchoptions table {
-       float: left;
-       margin-right: 3em;
-}
-fieldset#mw-searchoptions table td {
-       padding-right: 1em;
-}
-fieldset#mw-searchoptions div.divider {
-       clear: both;
-       border-bottom: 1px solid #DDDDDD;
-       padding-top: 0.5em;
-       margin-bottom: 0.5em;
-}
-td#mw-search-menu {
-       padding-left:6em;
-       font-size:85%;
-}
-div#mw-search-interwiki {
-       float: right;
-       width: 18em;
-       border: 1px solid #AAAAAA;
-       margin-top: 2ex;
-}
-div#mw-search-interwiki li {
-       font-size: 95%;
-}
-.mw-search-interwiki-more {
-       float: right;
-       font-size: 90%;
-}
-div#mw-search-interwiki-caption {
-       text-align: center;
-       font-weight: bold;
-       font-size: 95%;
-}
-.mw-search-interwiki-project {
-       font-size: 97%;
-       text-align: left;
-       padding: 0.15em 0.15em 0.2em 0.2em;
-       background-color: #ececec;
-       border-top: 1px solid #BBBBBB;
-}
-span.searchalttitle {
-       font-size: 95%;
-}
-div.searchdidyoumean {
-       font-size: 127%;
-       margin-top: 0.8em;
-       /* Note that this color won't affect the link, as desired. */
-       color: #c00;
-}
-div.searchdidyoumean em {
-       font-weight: bold;
-}
-.searchmatch {
-       font-weight: bold;
-}
-/* Advanced PowerSearch box */
-td#mw-search-togglebox {
-       text-align: right;
-}
-table#mw-search-powertable {
-       width: 100%;
-}
-form#powersearch {
-       clear: both;
-}
-
-/**** Special:Specialpages ****/
-.mw-specialpagerestricted {
-       font-weight: bold;
-}
-
-.mw-specialpages-table {
-       margin-top: -1em;
-       margin-bottom: 1em;
-}
-
-.mw-specialpages-table td {
-       vertical-align: top;
-}
-
-/**** Special:Statistics ****/
-td.mw-statistics-numbers {
-       text-align: right;
-}
-
-/**** Special:ProtectedPages ****/
-table.mw-protectedpages span.mw-usertoollinks,
-span.mw-protectedpages-length,
-span.mw-protectedpages-actions {
-       white-space: nowrap;
-       font-size: 90%;
-}
-span.mw-protectedpages-unknown {
-       color: grey;
-       font-size: 90%;
-}
-
-/**** Special:UserRights ****/
-.mw-userrights-disabled {
-       color: #888;
-}
-table.mw-userrights-groups * td,
-table.mw-userrights-groups * th {
-       padding-right: 1.5em;
-}
diff --git a/resources/mediawiki.special/mediawiki.special.javaScriptTest.js b/resources/mediawiki.special/mediawiki.special.javaScriptTest.js
deleted file mode 100644 (file)
index 38f256c..0000000
+++ /dev/null
@@ -1,36 +0,0 @@
-/**
- * JavaScript for Special:JavaScriptTest
- */
-( function ( mw, $ ) {
-       $( function () {
-
-               // Create useskin dropdown menu and reload onchange to the selected skin
-               // (only if a framework was found, not on error pages).
-               $( '#mw-javascripttest-summary.mw-javascripttest-frameworkfound' ).append( function () {
-
-                       var $html = $( '<p><label for="useskin">'
-                                       + mw.message( 'javascripttest-pagetext-skins' ).escaped()
-                                       + ' '
-                                       + '</label></p>' ),
-                               select = '<select name="useskin" id="useskin">';
-
-                       // Build <select> further
-                       $.each( mw.config.get( 'wgAvailableSkins' ), function ( id ) {
-                               select += '<option value="' + id + '"'
-                                       + ( mw.config.get( 'skin' ) === id ? ' selected="selected"' : '' )
-                                       + '>' + mw.message( 'skinname-' + id ).escaped() + '</option>';
-                       } );
-                       select += '</select>';
-
-                       // Bind onchange event handler and append to form
-                       $html.append(
-                               $( select ).change( function () {
-                                       window.location = QUnit.url( { useskin: $( this ).val() } );
-                               } )
-                       );
-
-                       return $html;
-               } );
-       } );
-
-}( mediaWiki, jQuery ) );
diff --git a/resources/mediawiki.special/mediawiki.special.js b/resources/mediawiki.special/mediawiki.special.js
deleted file mode 100644 (file)
index 8edb1cb..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-/*
- * Namespace for mediawiki.special.* modules
- */
-
-mediaWiki.special = {};
diff --git a/resources/mediawiki.special/mediawiki.special.movePage.js b/resources/mediawiki.special/mediawiki.special.movePage.js
deleted file mode 100644 (file)
index 922eba5..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-/**
- * JavaScript for Special:MovePage
- */
-jQuery( function ( $ ) {
-       $( '#wpReason, #wpNewTitleMain' ).byteLimit();
-} );
diff --git a/resources/mediawiki.special/mediawiki.special.pagesWithProp.css b/resources/mediawiki.special/mediawiki.special.pagesWithProp.css
deleted file mode 100644 (file)
index 7ef75d0..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-/* Distinguish actual data from information about it being hidden visually */
-.prop-value-hidden {
-       font-style: italic;
-}
diff --git a/resources/mediawiki.special/mediawiki.special.preferences.css b/resources/mediawiki.special/mediawiki.special.preferences.css
deleted file mode 100644 (file)
index 75ae5ca..0000000
+++ /dev/null
@@ -1,21 +0,0 @@
-/** Reuses colors from mediawiki.special.changeemail.css */
-.mw-email-not-authenticated .mw-input,
-.mw-email-none .mw-input{
-       border: 1px solid #FF8080;
-       background-color: #FFC0C0;
-       color: black;
-}
-/** Authenticated email field has its own class too. Unstyled by default */
-/*
-.mw-email-authenticated .mw-input { }
-*/
-
-/**
- * Hide, but keep accessible for screen-readers.
- * Like .mw-jump, #jump-to-nav from skins/common/shared.css
- */
-.mw-navigation-hint {
-       overflow: hidden;
-       height: 0;
-       zoom: 1;
-}
diff --git a/resources/mediawiki.special/mediawiki.special.preferences.js b/resources/mediawiki.special/mediawiki.special.preferences.js
deleted file mode 100644 (file)
index 2cd27af..0000000
+++ /dev/null
@@ -1,267 +0,0 @@
-/**
- * JavaScript for Special:Preferences
- */
-jQuery( function ( $ ) {
-       var $preftoc, $preferences, $fieldsets, $legends,
-               hash, labelFunc,
-               $tzSelect, $tzTextbox, $localtimeHolder, servertime,
-               $checkBoxes;
-
-       labelFunc = function () {
-               return this.id.replace( /^mw-prefsection/g, 'preftab' );
-       };
-
-       $( '#prefsubmit' ).attr( 'id', 'prefcontrol' );
-       $preftoc = $( '<ul id="preftoc"></ul>' )
-               .attr( 'role', 'tablist' );
-       $preferences = $( '#preferences' )
-               .addClass( 'jsprefs' )
-               .before( $preftoc );
-       $fieldsets = $preferences.children( 'fieldset' )
-               .hide()
-               .attr( {
-                       role: 'tabpanel',
-                       'aria-hidden': 'true',
-                       'aria-labelledby': labelFunc
-               } )
-               .addClass( 'prefsection' );
-       $legends = $fieldsets
-               .children( 'legend' )
-               .addClass( 'mainLegend' );
-
-       // Make sure the accessibility tip is selectable so that screen reader users take notice,
-       // but hide it per default to reduce interface clutter. Also make sure it becomes visible
-       // when selected. Similar to jquery.mw-jump
-       $( '<div>' ).addClass( 'mw-navigation-hint' )
-               .text( mediaWiki.msg( 'prefs-tabs-navigation-hint' ) )
-               .attr( 'tabIndex', 0 )
-               .on( 'focus blur', function ( e ) {
-                       if ( e.type === 'blur' || e.type === 'focusout' ) {
-                               $( this ).css( 'height', '0' );
-                       } else {
-                               $( this ).css( 'height', 'auto' );
-                       }
-       } ).insertBefore( $preftoc );
-
-       /**
-        * It uses document.getElementById for security reasons (HTML injections in $()).
-        *
-        * @param String name: the name of a tab without the prefix ("mw-prefsection-")
-        * @param String mode: [optional] A hash will be set according to the current
-        * open section. Set mode 'noHash' to surpress this.
-        */
-       function switchPrefTab( name, mode ) {
-               var $tab, scrollTop;
-               // Handle hash manually to prevent jumping,
-               // therefore save and restore scrollTop to prevent jumping.
-               scrollTop = $( window ).scrollTop();
-               if ( mode !== 'noHash' ) {
-                       window.location.hash = '#mw-prefsection-' + name;
-               }
-               $( window ).scrollTop( scrollTop );
-
-               $preftoc.find( 'li' ).removeClass( 'selected' )
-                       .find( 'a' ).attr( {
-                               tabIndex: -1,
-                               'aria-selected': 'false'
-                       } );
-
-               $tab = $( document.getElementById( 'preftab-' + name ) );
-               if ( $tab.length ) {
-                       $tab.attr( {
-                               tabIndex: 0,
-                               'aria-selected': 'true'
-                       } )
-                       .focus()
-                               .parent().addClass( 'selected' );
-
-                       $preferences.children( 'fieldset' ).hide().attr( 'aria-hidden', 'true' );
-                       $( document.getElementById( 'mw-prefsection-' + name ) ).show().attr( 'aria-hidden', 'false' );
-               }
-       }
-
-       // Populate the prefToc
-       $legends.each( function ( i, legend ) {
-               var $legend = $( legend ),
-                       ident, $li, $a;
-               if ( i === 0 ) {
-                       $legend.parent().show();
-               }
-               ident = $legend.parent().attr( 'id' );
-
-               $li = $( '<li>' )
-                       .attr( 'role', 'presentation' )
-                       .addClass( i === 0 ? 'selected' : '' );
-               $a = $( '<a>' )
-                       .attr( {
-                               id: ident.replace( 'mw-prefsection', 'preftab' ),
-                               href: '#' + ident,
-                               role: 'tab',
-                               tabIndex: i === 0 ? 0 : -1,
-                               'aria-selected': i === 0 ? 'true' : 'false',
-                               'aria-controls': ident
-                       } )
-                       .text( $legend.text() );
-               $li.append( $a );
-               $preftoc.append( $li );
-       } );
-
-       // Enable keyboard users to use left and right keys to switch tabs
-       $preftoc.on( 'keydown', function ( event ) {
-               var keyLeft = 37,
-                       keyRight = 39,
-                       $el;
-
-               if ( event.keyCode === keyLeft ) {
-                       $el = $( '#preftoc li.selected' ).prev().find( 'a' );
-               } else if ( event.keyCode === keyRight ) {
-                       $el = $( '#preftoc li.selected' ).next().find( 'a' );
-               } else {
-                       return;
-               }
-               if ( $el.length > 0 ) {
-                       switchPrefTab( $el.attr( 'href' ).replace( '#mw-prefsection-', '' ) );
-               }
-       } );
-
-       // If we've reloaded the page or followed an open-in-new-window,
-       // make the selected tab visible.
-       hash = window.location.hash;
-       if ( hash.match( /^#mw-prefsection-[\w\-]+/ ) ) {
-               switchPrefTab( hash.replace( '#mw-prefsection-', '' ) );
-       }
-
-       // In browsers that support the onhashchange event we will not bind click
-       // handlers and instead let the browser do the default behavior (clicking the
-       // <a href="#.."> will naturally set the hash, handled by onhashchange.
-       // But other things that change the hash will also be catched (e.g. using
-       // the Back and Forward browser navigation).
-       // Note the special check for IE "compatibility" mode.
-       if ( 'onhashchange' in window &&
-               ( document.documentMode === undefined || document.documentMode >= 8 )
-       ) {
-               $( window ).on( 'hashchange', function () {
-                       var hash = window.location.hash;
-                       if ( hash.match( /^#mw-prefsection-[\w\-]+/ ) ) {
-                               switchPrefTab( hash.replace( '#mw-prefsection-', '' ) );
-                       } else if ( hash === '' ) {
-                               switchPrefTab( 'personal', 'noHash' );
-                       }
-               } );
-       // In older browsers we'll bind a click handler as fallback.
-       // We must not have onhashchange *and* the click handlers, other wise
-       // the click handler calls switchPrefTab() which sets the hash value,
-       // which triggers onhashcange and calls switchPrefTab() again.
-       } else {
-               $preftoc.on( 'click', 'li a', function ( e ) {
-                       switchPrefTab( $( this ).attr( 'href' ).replace( '#mw-prefsection-', '' ) );
-                       e.preventDefault();
-               } );
-       }
-
-       /**
-       * Timezone functions.
-       * Guesses Timezone from browser and updates fields onchange
-       */
-
-       $tzSelect = $( '#mw-input-wptimecorrection' );
-       $tzTextbox = $( '#mw-input-wptimecorrection-other' );
-       $localtimeHolder = $( '#wpLocalTime' );
-       servertime = parseInt( $( 'input[name="wpServerTime"]' ).val(), 10 );
-
-       function minutesToHours( min ) {
-               var tzHour = Math.floor( Math.abs( min ) / 60 ),
-                       tzMin = Math.abs( min ) % 60,
-                       tzString = ( ( min >= 0 ) ? '' : '-' ) + ( ( tzHour < 10 ) ? '0' : '' ) + tzHour +
-                               ':' + ( ( tzMin < 10 ) ? '0' : '' ) + tzMin;
-               return tzString;
-       }
-
-       function hoursToMinutes( hour ) {
-               var minutes,
-                       arr = hour.split( ':' );
-
-               arr[0] = parseInt( arr[0], 10 );
-
-               if ( arr.length === 1 ) {
-                       // Specification is of the form [-]XX
-                       minutes = arr[0] * 60;
-               } else {
-                       // Specification is of the form [-]XX:XX
-                       minutes = Math.abs( arr[0] ) * 60 + parseInt( arr[1], 10 );
-                       if ( arr[0] < 0 ) {
-                               minutes *= -1;
-                       }
-               }
-               // Gracefully handle non-numbers.
-               if ( isNaN( minutes ) ) {
-                       return 0;
-               } else {
-                       return minutes;
-               }
-       }
-
-       function updateTimezoneSelection () {
-               var minuteDiff, localTime,
-                       type = $tzSelect.val();
-
-               if ( type === 'guess' ) {
-                       // Get browser timezone & fill it in
-                       minuteDiff = -( new Date().getTimezoneOffset() );
-                       $tzTextbox.val( minutesToHours( minuteDiff ) );
-                       $tzSelect.val( 'other' );
-                       $tzTextbox.prop( 'disabled', false );
-               } else if ( type === 'other' ) {
-                       // Grab data from the textbox, parse it.
-                       minuteDiff = hoursToMinutes( $tzTextbox.val() );
-               } else {
-                       // Grab data from the $tzSelect value
-                       minuteDiff = parseInt( type.split( '|' )[1], 10 ) || 0;
-                       $tzTextbox.val( minutesToHours( minuteDiff ) );
-               }
-
-               // Determine local time from server time and minutes difference, for display.
-               localTime = servertime + minuteDiff;
-
-               // Bring time within the [0,1440) range.
-               while ( localTime < 0 ) {
-                       localTime += 1440;
-               }
-               while ( localTime >= 1440 ) {
-                       localTime -= 1440;
-               }
-               $localtimeHolder.text( mediaWiki.language.convertNumber( minutesToHours( localTime ) ) );
-       }
-
-       if ( $tzSelect.length && $tzTextbox.length ) {
-               $tzSelect.change( updateTimezoneSelection );
-               $tzTextbox.blur( updateTimezoneSelection );
-               updateTimezoneSelection();
-       }
-
-       // Preserve the tab after saving the preferences
-       // Not using cookies, because their deletion results are inconsistent.
-       // Not using jStorage due to its enormous size (for this feature)
-       if ( window.sessionStorage ) {
-               if ( sessionStorage.getItem( 'mediawikiPreferencesTab' ) !== null ) {
-                       switchPrefTab( sessionStorage.getItem( 'mediawikiPreferencesTab' ), 'noHash' );
-               }
-               // Deleting the key, the tab states should be reset until we press Save
-               sessionStorage.removeItem( 'mediawikiPreferencesTab' );
-
-               $( '#mw-prefs-form' ).submit( function () {
-                       var storageData = $( $preftoc ).find( 'li.selected a' ).attr( 'id' ).replace( 'preftab-', '' );
-                       sessionStorage.setItem( 'mediawikiPreferencesTab', storageData );
-               } );
-       }
-
-       // To disable all 'namespace' checkboxes in Search preferences
-       // when 'Search in all namespaces' checkbox is ticked.
-       $checkBoxes = $( '#mw-htmlform-advancedsearchoptions input[id^=mw-input-wpsearchnamespaces]' );
-       if ( $( '#mw-input-wpsearcheverything' ).prop( 'checked' ) ) {
-               $checkBoxes.prop( 'disabled', true );
-       }
-       $( '#mw-input-wpsearcheverything' ).change( function () {
-               $checkBoxes.prop( 'disabled', $( this ).prop( 'checked' ) );
-       } );
-} );
diff --git a/resources/mediawiki.special/mediawiki.special.recentchanges.js b/resources/mediawiki.special/mediawiki.special.recentchanges.js
deleted file mode 100644 (file)
index 79d793a..0000000
+++ /dev/null
@@ -1,34 +0,0 @@
-/**
- * JavaScript for Special:RecentChanges
- */
-( function ( mw, $ ) {
-       var rc, $checkboxes, $select;
-
-       rc = {
-               /**
-                * Handler to disable/enable the namespace selector checkboxes when the
-                * special 'all' namespace is selected/unselected respectively.
-                */
-               updateCheckboxes: function () {
-                       // The option element for the 'all' namespace has an empty value
-                       var isAllNS = $select.val() === '';
-
-                       // Iterates over checkboxes and propagate the selected option
-                       $checkboxes.prop( 'disabled', isAllNS );
-               },
-
-               init: function () {
-                       $select = $( '#namespace' );
-                       $checkboxes = $( '#nsassociated, #nsinvert' );
-
-                       // Bind to change event, and trigger once to set the initial state of the checkboxes.
-                       rc.updateCheckboxes();
-                       $select.change( rc.updateCheckboxes );
-               }
-       };
-
-       $( rc.init );
-
-       mw.special.recentchanges = rc;
-
-}( mediaWiki, jQuery ) );
diff --git a/resources/mediawiki.special/mediawiki.special.search.css b/resources/mediawiki.special/mediawiki.special.search.css
deleted file mode 100644 (file)
index 914e47e..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-/**
- * Fixes sister projects box moving down the extract
- * of the first result (bug #16886).
- * It only happens when the window is small and
- * This changes slightly the layout for big screens
- * where there was space for the extracts and the
- * sister projects and thus it showed like in any
- * other browser.
- *
- * This will only affect IE 7 and lower
- */
-.searchresult {
-       display: inline !ie;
-}
diff --git a/resources/mediawiki.special/mediawiki.special.search.js b/resources/mediawiki.special/mediawiki.special.search.js
deleted file mode 100644 (file)
index b847f7d..0000000
+++ /dev/null
@@ -1,53 +0,0 @@
-/**
- * JavaScript for Special:Search
- */
-( function ( mw, $ ) {
-       $( function () {
-               var $checkboxes, $headerLinks;
-
-               // Emulate HTML5 autofocus behavior in non HTML5 compliant browsers
-               if ( !( 'autofocus' in document.createElement( 'input' ) ) ) {
-                       $( 'input[autofocus]' ).eq( 0 ).focus();
-               }
-
-               // Create check all/none button
-               $checkboxes = $( '#powersearch input[id^=mw-search-ns]' );
-               $( '#mw-search-togglebox' ).append(
-                       $( '<label>' )
-                               .text( mw.msg( 'powersearch-togglelabel' ) )
-               ).append(
-                       $( '<input type="button" />' )
-                               .attr( 'id', 'mw-search-toggleall' )
-                               .prop( 'value', mw.msg( 'powersearch-toggleall' ) )
-                               .click( function () {
-                                       $checkboxes.prop( 'checked', true );
-                               } )
-               ).append(
-                       $( '<input type="button" />' )
-                               .attr( 'id', 'mw-search-togglenone' )
-                               .prop( 'value', mw.msg( 'powersearch-togglenone' ) )
-                               .click( function () {
-                                       $checkboxes.prop( 'checked', false );
-                               } )
-               );
-
-               // Change the header search links to what user entered
-               $headerLinks = $( '.search-types a' );
-               $( '#searchText, #powerSearchText' ).change( function () {
-                       var searchterm = $( this ).val();
-                       $headerLinks.each( function () {
-                               var parts = $( this ).attr( 'href' ).split( 'search=' ),
-                                       lastpart = '',
-                                       prefix = 'search=';
-                               if ( parts.length > 1 && parts[1].indexOf( '&' ) >= 0 ) {
-                                       lastpart = parts[1].substring( parts[1].indexOf( '&' ) );
-                               } else {
-                                       prefix = '&search=';
-                               }
-                               this.href = parts[0] + prefix + encodeURIComponent( searchterm ) + lastpart;
-                       } );
-               } ).trigger( 'change' );
-
-       } );
-
-}( mediaWiki, jQuery ) );
diff --git a/resources/mediawiki.special/mediawiki.special.undelete.js b/resources/mediawiki.special/mediawiki.special.undelete.js
deleted file mode 100644 (file)
index 0dea3ef..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-/**
- * JavaScript for Special:Undelete
- */
-jQuery( function ( $ ) {
-       $( '#mw-undelete-invert' ).click( function ( e ) {
-               $( '#undelete input[type="checkbox"]' ).prop( 'checked', function ( i, val ) {
-                       return !val;
-               } );
-               e.preventDefault();
-       } );
-} );
diff --git a/resources/mediawiki.special/mediawiki.special.upload.js b/resources/mediawiki.special/mediawiki.special.upload.js
deleted file mode 100644 (file)
index 8a5ff59..0000000
+++ /dev/null
@@ -1,319 +0,0 @@
-/**
- * JavaScript for Special:Upload
- * Note that additional code still lives in skins/common/upload.js
- */
-( function ( mw, $ ) {
-       /**
-        * Add a preview to the upload form
-        */
-       $( function () {
-               /**
-                * Is the FileAPI available with sufficient functionality?
-                */
-               function hasFileAPI() {
-                       return window.FileReader !== undefined;
-               }
-
-               /**
-                * Check if this is a recognizable image type...
-                * Also excludes files over 10M to avoid going insane on memory usage.
-                *
-                * @todo is there a way we can ask the browser what's supported in <img>s?
-                * @todo put SVG back after working around Firefox 7 bug <https://bugzilla.wikimedia.org/show_bug.cgi?id=31643>
-                *
-                * @param {File} file
-                * @return boolean
-                */
-               function fileIsPreviewable( file ) {
-                       var known = ['image/png', 'image/gif', 'image/jpeg', 'image/svg+xml'],
-                               tooHuge = 10 * 1024 * 1024;
-                       return ( $.inArray( file.type, known ) !== -1 ) && file.size > 0 && file.size < tooHuge;
-               }
-
-               /**
-                * Show a thumbnail preview of PNG, JPEG, GIF, and SVG files prior to upload
-                * in browsers supporting HTML5 FileAPI.
-                *
-                * As of this writing, known good:
-                * - Firefox 3.6+
-                * - Chrome 7.something
-                *
-                * @todo check file size limits and warn of likely failures
-                *
-                * @param {File} file
-                */
-               function showPreview( file ) {
-                       var $canvas,
-                               ctx,
-                               meta,
-                               previewSize = 180,
-                               thumb = $( '<div id="mw-upload-thumbnail" class="thumb tright">' +
-                                                       '<div class="thumbinner">' +
-                                                               '<div class="mw-small-spinner" style="width: 180px; height: 180px"></div>' +
-                                                               '<div class="thumbcaption"><div class="filename"></div><div class="fileinfo"></div></div>' +
-                                                       '</div>' +
-                                               '</div>' );
-
-                       thumb.find( '.filename' ).text( file.name ).end()
-                               .find( '.fileinfo' ).text( prettySize( file.size ) ).end();
-
-                       $canvas = $( '<canvas width="' + previewSize + '" height="' + previewSize + '" ></canvas>' );
-                       ctx = $canvas[0].getContext( '2d' );
-                       $( '#mw-htmlform-source' ).parent().prepend( thumb );
-
-                       fetchPreview( file, function ( dataURL ) {
-                               var img = new Image(),
-                                       rotation = 0;
-
-                               if ( meta && meta.tiff && meta.tiff.Orientation ) {
-                                       rotation = ( 360 - ( function () {
-                                               // See includes/media/Bitmap.php
-                                               switch ( meta.tiff.Orientation.value ) {
-                                                       case 8:
-                                                               return 90;
-                                                       case 3:
-                                                               return 180;
-                                                       case 6:
-                                                               return 270;
-                                                       default:
-                                                               return 0;
-                                               }
-                                       }() ) ) % 360;
-                               }
-
-                               img.onload = function () {
-                                       var info, width, height, x, y, dx, dy, logicalWidth, logicalHeight;
-
-                                       // Fit the image within the previewSizexpreviewSize box
-                                       if ( img.width > img.height ) {
-                                               width = previewSize;
-                                               height = img.height / img.width * previewSize;
-                                       } else {
-                                               height = previewSize;
-                                               width = img.width / img.height * previewSize;
-                                       }
-                                       // Determine the offset required to center the image
-                                       dx = ( 180 - width ) / 2;
-                                       dy = ( 180 - height ) / 2;
-                                       switch ( rotation ) {
-                                               // If a rotation is applied, the direction of the axis
-                                               // changes as well. You can derive the values below by
-                                               // drawing on paper an axis system, rotate it and see
-                                               // where the positive axis direction is
-                                               case 0:
-                                                       x = dx;
-                                                       y = dy;
-                                                       logicalWidth = img.width;
-                                                       logicalHeight = img.height;
-                                                       break;
-                                               case 90:
-
-                                                       x = dx;
-                                                       y = dy - previewSize;
-                                                       logicalWidth = img.height;
-                                                       logicalHeight = img.width;
-                                                       break;
-                                               case 180:
-                                                       x = dx - previewSize;
-                                                       y = dy - previewSize;
-                                                       logicalWidth = img.width;
-                                                       logicalHeight = img.height;
-                                                       break;
-                                               case 270:
-                                                       x = dx - previewSize;
-                                                       y = dy;
-                                                       logicalWidth = img.height;
-                                                       logicalHeight = img.width;
-                                                       break;
-                                       }
-
-                                       ctx.clearRect( 0, 0, 180, 180 );
-                                       ctx.rotate( rotation / 180 * Math.PI );
-                                       ctx.drawImage( img, x, y, width, height );
-                                       thumb.find( '.mw-small-spinner' ).replaceWith( $canvas );
-
-                                       // Image size
-                                       info = mw.msg( 'widthheight', logicalWidth, logicalHeight ) +
-                                               ', ' + prettySize( file.size );
-
-                                       $( '#mw-upload-thumbnail .fileinfo' ).text( info );
-                               };
-                               img.src = dataURL;
-                       }, mw.config.get( 'wgFileCanRotate' ) ? function ( data ) {
-                               /*jshint camelcase:false, nomen:false */
-                               try {
-                                       meta = mw.libs.jpegmeta( data, file.fileName );
-                                       meta._binary_data = null;
-                               } catch ( e ) {
-                                       meta = null;
-                               }
-                       } : null );
-               }
-
-               /**
-                * Start loading a file into memory; when complete, pass it as a
-                * data URL to the callback function. If the callbackBinary is set it will
-                * first be read as binary and afterwards as data URL. Useful if you want
-                * to do preprocessing on the binary data first.
-                *
-                * @param {File} file
-                * @param {function} callback
-                * @param {function} callbackBinary
-                */
-               function fetchPreview( file, callback, callbackBinary ) {
-                       var reader = new FileReader();
-                       if ( callbackBinary && 'readAsBinaryString' in reader ) {
-                               // To fetch JPEG metadata we need a binary string; start there.
-                               // todo:
-                               reader.onload = function () {
-                                       callbackBinary( reader.result );
-
-                                       // Now run back through the regular code path.
-                                       fetchPreview( file, callback );
-                               };
-                               reader.readAsBinaryString( file );
-                       } else if ( callbackBinary && 'readAsArrayBuffer' in reader ) {
-                               // readAsArrayBuffer replaces readAsBinaryString
-                               // However, our JPEG metadata library wants a string.
-                               // So, this is going to be an ugly conversion.
-                               reader.onload = function () {
-                                       var i,
-                                               buffer = new Uint8Array( reader.result ),
-                                               string = '';
-                                       for ( i = 0; i < buffer.byteLength; i++ ) {
-                                               string += String.fromCharCode( buffer[i] );
-                                       }
-                                       callbackBinary( string );
-
-                                       // Now run back through the regular code path.
-                                       fetchPreview( file, callback );
-                               };
-                               reader.readAsArrayBuffer( file );
-                       } else if ( 'URL' in window && 'createObjectURL' in window.URL ) {
-                               // Supported in Firefox 4.0 and above <https://developer.mozilla.org/en/DOM/window.URL.createObjectURL>
-                               // WebKit has it in a namespace for now but that's ok. ;)
-                               //
-                               // Lifetime of this URL is until document close, which is fine
-                               // for Special:Upload -- if this code gets used on longer-running
-                               // pages, add a revokeObjectURL() when it's no longer needed.
-                               //
-                               // Prefer this over readAsDataURL for Firefox 7 due to bug reading
-                               // some SVG files from data URIs <https://bugzilla.mozilla.org/show_bug.cgi?id=694165>
-                               callback( window.URL.createObjectURL( file ) );
-                       } else {
-                               // This ends up decoding the file to base-64 and back again, which
-                               // feels horribly inefficient.
-                               reader.onload = function () {
-                                       callback( reader.result );
-                               };
-                               reader.readAsDataURL( file );
-                       }
-               }
-
-               /**
-                * Format a file size attractively.
-                * @todo match numeric formatting
-                *
-                * @param {number} s
-                * @return string
-                */
-               function prettySize( s ) {
-                       var sizeMsgs = ['size-bytes', 'size-kilobytes', 'size-megabytes', 'size-gigabytes'];
-                       while ( s >= 1024 && sizeMsgs.length > 1 ) {
-                               s /= 1024;
-                               sizeMsgs = sizeMsgs.slice( 1 );
-                       }
-                       return mw.msg( sizeMsgs[0], Math.round( s ) );
-               }
-
-               /**
-                * Clear the file upload preview area.
-                */
-               function clearPreview() {
-                       $( '#mw-upload-thumbnail' ).remove();
-               }
-
-               /**
-                * Check if the file does not exceed the maximum size
-                */
-               function checkMaxUploadSize( file ) {
-                       var maxSize, $error;
-
-                       function getMaxUploadSize( type ) {
-                               var sizes = mw.config.get( 'wgMaxUploadSize' );
-
-                               if ( sizes[type] !== undefined ) {
-                                       return sizes[type];
-                               }
-                               return sizes['*'];
-                       }
-
-                       $( '.mw-upload-source-error' ).remove();
-
-                       maxSize = getMaxUploadSize( 'file' );
-                       if ( file.size > maxSize ) {
-                               $error = $( '<p class="error mw-upload-source-error" id="wpSourceTypeFile-error">' +
-                                       mw.message( 'largefileserver', file.size, maxSize ).escaped() + '</p>' );
-
-                               $( '#wpUploadFile' ).after( $error );
-
-                               return false;
-                       }
-
-                       return true;
-               }
-
-               /**
-                * Initialization
-                */
-               if ( hasFileAPI() ) {
-                       // Update thumbnail when the file selection control is updated.
-                       $( '#wpUploadFile' ).change( function () {
-                               clearPreview();
-                               if ( this.files && this.files.length ) {
-                                       // Note: would need to be updated to handle multiple files.
-                                       var file = this.files[0];
-
-                                       if ( !checkMaxUploadSize( file ) ) {
-                                               return;
-                                       }
-
-                                       if ( fileIsPreviewable( file ) ) {
-                                               showPreview( file );
-                                       }
-                               }
-                       } );
-               }
-       } );
-
-       /**
-        * Disable all upload source fields except the selected one
-        */
-       $( function () {
-               var i, $row,
-                       $rows = $( '.mw-htmlform-field-UploadSourceField' );
-
-               function createHandler( $currentRow ) {
-                       /**
-                        * @param {jQuery.Event}
-                        */
-                       return function () {
-                               $( '.mw-upload-source-error' ).remove();
-                               if ( this.checked ) {
-                                       // Disable all inputs
-                                       $rows.find( 'input[name!="wpSourceType"]' ).prop( 'disabled', true );
-                                       // Re-enable the current one
-                                       $currentRow.find( 'input' ).prop( 'disabled', false );
-                               }
-                       };
-               }
-
-               for ( i = $rows.length; i; i-- ) {
-                       $row = $rows.eq( i - 1 );
-                       $row
-                               .find( 'input[name="wpSourceType"]' )
-                               .change( createHandler( $row ) );
-               }
-       } );
-
-}( mediaWiki, jQuery ) );
diff --git a/resources/mediawiki.special/mediawiki.special.userlogin.common.css b/resources/mediawiki.special/mediawiki.special.userlogin.common.css
deleted file mode 100644 (file)
index d5fd2b8..0000000
+++ /dev/null
@@ -1,65 +0,0 @@
-/* Styles for user login and signup forms */
-#mw-userlogin-help {
-       text-align: center;
-}
-
-.mw-ui-vform .mw-secure {
-       /* @embed */
-       background: url(images/icon-lock.png) no-repeat scroll left center transparent;
-       margin: 0 0 0 1px;
-       padding: 0 0 0 11px;
-}
-
-/*
- * When inside the VForm style, disable the border that Vector and other skins
- * put on the div surrounding the login/create account form.
- * Also disable the margin and padding that Vector puts around the form.
- */
-.mw-ui-container #userloginForm,
-.mw-ui-container #userlogin {
-       border: 0;
-       margin: 0;
-       padding: 0;
-}
-
-/* Reposition and resize language links, which appear on a per-wiki basis */
-.mw-ui-container #languagelinks {
-       margin-bottom: 2em;
-       font-size: 0.8em;
-}
-
-/* Put some space under template's header, which may contain CAPTCHA HTML.*/
-section.mw-form-header {
-       margin-bottom: 10px;
-}
-
-/**** shuffled CAPTCHA ****/
-#wpCaptchaWord {
-       margin-top: 6px;
-}
-
-.mw-createacct-captcha-container {
-       background-color: #f8f8f8;
-       border: 1px solid #c9c9c9;
-       padding: 10px;
-       text-align: center;
-}
-
-.mw-createacct-captcha-assisted {
-       display: block;
-       margin-top: 0.5em;
-}
-
-/* Put a border around the fancycaptcha-image-container. */
-.mw-createacct-captcha-and-reload {
-       border: 1px solid #c9c9c9;
-       /* Other display formats end up too wide */
-       display: table-cell;
-       width: 270px;
-       background-color: #FFF;
-}
-
-/* Make the fancycaptcha-image-container full-width within its parent. */
-.fancycaptcha-image-container {
-       width: 100%;
-}
diff --git a/resources/mediawiki.special/mediawiki.special.userlogin.common.js b/resources/mediawiki.special/mediawiki.special.userlogin.common.js
deleted file mode 100644 (file)
index a899ae7..0000000
+++ /dev/null
@@ -1,72 +0,0 @@
-/**
- * JavaScript for login and signup forms.
- */
-( function ( mw, $ ) {
-       // Move the FancyCaptcha image into a more attractive container.
-       // The CAPTCHA is in a <div class="captcha"> at the top of the form. If it's a FancyCaptcha,
-       // then we remove it and insert it lower down, in a customized div with just what we need (e.g.
-       // no 'fancycaptcha-createaccount' message).
-       function adjustFancyCaptcha( $content, buttonSubmit ) {
-               var $submit = $content.find( buttonSubmit ),
-                       tabIndex,
-                       $captchaStuff,
-                       $captchaImageContainer,
-                       // JavaScript can't yet parse the message 'createacct-imgcaptcha-help' when it
-                       // contains a MediaWiki transclusion, so PHP parses it and sends the HTML.
-                       // This is only set for the signup form (and undefined for login).
-                       helpMsg = mw.config.get( 'wgCreateacctImgcaptchaHelp' ),
-                       helpHtml = '';
-
-               if ( !$submit.length ) {
-                       return;
-               }
-               tabIndex = $submit.prop( 'tabindex' ) - 1;
-               $captchaStuff = $content.find( '.captcha' );
-
-               if ( $captchaStuff.length ) {
-                       // The FancyCaptcha has this class in the ConfirmEdit extension since 2013-04-18.
-                       $captchaImageContainer = $captchaStuff.find( '.fancycaptcha-image-container' );
-                       if ( $captchaImageContainer.length !== 1 ) {
-                               return;
-                       }
-
-                       $captchaStuff.remove();
-
-                       if ( helpMsg ) {
-                               helpHtml = '<small class="mw-createacct-captcha-assisted">' + helpMsg + '</small>';
-                       }
-
-                       // Insert another div before the submit button that will include the
-                       // repositioned FancyCaptcha div, an input field, and possible help.
-                       $submit.closest( 'div' ).before( [
-                               '<div>',
-                                       '<label for="wpCaptchaWord">' + mw.message( 'createacct-captcha' ).escaped() + '</label>',
-                                       '<div class="mw-createacct-captcha-container">',
-                                               '<div class="mw-createacct-captcha-and-reload" />',
-                                               '<input id="wpCaptchaWord" name="wpCaptchaWord" type="text" placeholder="' +
-                                                       mw.message( 'createacct-imgcaptcha-ph' ).escaped() +
-                                                       '" tabindex="' + tabIndex + '" autocapitalize="off" autocorrect="off">',
-                                                       helpHtml,
-                                       '</div>',
-                               '</div>'
-                       ].join( '' ) );
-
-                       // Stick the FancyCaptcha container inside our bordered and framed parents.
-                       $captchaImageContainer
-                               .prependTo( $content.find( '.mw-createacct-captcha-and-reload' ) );
-
-                       // Find the input field, add the text (if any) of the existing CAPTCHA
-                       // field (although usually it's blanked out on every redisplay),
-                       // and after it move over the hidden field that tells the CAPTCHA
-                       // what to do.
-                       $content.find( '#wpCaptchaWord' )
-                               .val( $captchaStuff.find( '#wpCaptchaWord' ).val() )
-                               .after( $captchaStuff.find( '#wpCaptchaId' ) );
-               }
-       }
-
-       $( function () {
-               // Work with both login and signup form
-               adjustFancyCaptcha( $( '#mw-content-text' ), '#wpCreateaccount, #wpLoginAttempt' );
-       } );
-}( mediaWiki, jQuery ) );
diff --git a/resources/mediawiki.special/mediawiki.special.userlogin.login.css b/resources/mediawiki.special/mediawiki.special.userlogin.login.css
deleted file mode 100644 (file)
index dc44c84..0000000
+++ /dev/null
@@ -1,24 +0,0 @@
-/* The login form invites users to create an account */
-#mw-createaccount-cta {
-       width: 20em;
-       height: 10em;
-       /* @embed */
-       background: url(images/glyph-people-large.png) no-repeat 50%;
-       margin: 0 auto;
-       padding-top: 4em;
-}
-
-#mw-createaccount-cta,
-#mw-createaccount-another {
-       font-size: 0.9em;
-       font-weight: normal;
-       text-align: center;
-}
-
-#mw-createaccount-join {
-       margin-left: 0.75em;
-       /* Separate from background image */
-       box-shadow: 4px 4px 4px 4px rgba(255, 255, 255, 1);
-       width: auto;
-       display: inline-block;
-}
diff --git a/resources/mediawiki.special/mediawiki.special.userlogin.signup.css b/resources/mediawiki.special/mediawiki.special.userlogin.signup.css
deleted file mode 100644 (file)
index 1564712..0000000
+++ /dev/null
@@ -1,63 +0,0 @@
-/* Disable the underline that Vector puts on h2 headings, and bold them. */
-.mw-ui-container h2 {
-       border: 0;
-       font-weight: bold;
-}
-
-/* Benefits column CSS to the right (if it fits) of the form. */
-.mw-ui-container #userloginForm {
-       float: left;
-       /* Override the right margin of the form to give space in case a benefits
-        * column appears to the side. */
-       margin-right: 100px;
-}
-
-div.mw-createacct-benefits-container {
-       /* Keeps this column compact and close to the form, but tends to squish contents. */
-       float: left;
-}
-
-div.mw-createacct-benefits-container h2 {
-       margin-bottom: 30px;
-}
-
-.mw-number-text.icon-edits {
-       /* @embed */
-       background: url(images/icon-edits.png) no-repeat left center;
-}
-
-.mw-number-text.icon-pages {
-       /* @embed */
-       background: url(images/icon-pages.png) no-repeat left center;
-}
-
-.mw-number-text.icon-contributors {
-       /* @embed */
-       background: url(images/icon-contributors.png) no-repeat left center;
-}
-
-/* Special font for numbers in benefits*/
-div.mw-number-text h3 {
-       top: 0;
-       margin: 0;
-       padding: 0;
-       color: #252525;
-       font-family: 'Georgia', serif;
-       font-weight: normal;
-       font-size: 2.2em;
-       line-height: 1.2;
-       text-align: center;
-}
-
-/* Contains a number and explanatory text, with space for an icon */
-div.mw-number-text {
-       display: block;
-       font-size: 1.2em;
-       color: #444;
-       margin-top: 1em;
-       /* 80px wide icon plus "margin" */
-       padding: 0 0 0 95px;
-       /* Matches max icon height, ensures icon emblem is visible */
-       min-height: 75px;
-       text-align: center;
-}
diff --git a/resources/mediawiki.special/mediawiki.special.userlogin.signup.js b/resources/mediawiki.special/mediawiki.special.userlogin.signup.js
deleted file mode 100644 (file)
index 0615932..0000000
+++ /dev/null
@@ -1,140 +0,0 @@
-/**
- * JavaScript for signup form.
- */
-( function ( mw, $ ) {
-       // When sending password by email, hide the password input fields.
-       $( function () {
-               // Always required if checked, otherwise it depends, so we use the original
-               var $emailLabel = $( 'label[for="wpEmail"]' ),
-                       originalText = $emailLabel.text(),
-                       requiredText = mw.message( 'createacct-emailrequired' ).text(),
-                       $createByMailCheckbox = $( '#wpCreateaccountMail' ),
-                       $beforePwds = $( '.mw-row-password:first' ).prev(),
-                       $pwds;
-
-               function updateForCheckbox() {
-                       var checked = $createByMailCheckbox.prop( 'checked' );
-                       if ( checked ) {
-                               $pwds = $( '.mw-row-password' ).detach();
-                               $emailLabel.text( requiredText );
-                       } else {
-                               if ( $pwds ) {
-                                       $beforePwds.after( $pwds );
-                                       $pwds = null;
-                               }
-                               $emailLabel.text( originalText );
-                       }
-               }
-
-               $createByMailCheckbox.on( 'change', updateForCheckbox );
-               updateForCheckbox();
-       } );
-
-       // Check if the username is invalid or already taken
-       $( function () {
-               var
-                       // We need to hook to all of these events to be sure we are notified of all changes to the
-                       // value of an <input type=text> field.
-                       events = 'keyup keydown change mouseup cut paste focus blur',
-                       $input = $( '#wpName2' ),
-                       $statusContainer = $( '#mw-createacct-status-area' ),
-                       api = new mw.Api(),
-                       currentRequest;
-
-               // Hide any present status messages.
-               function clearStatus() {
-                       $statusContainer.slideUp( function () {
-                               $statusContainer
-                                       .removeAttr( 'class' )
-                                       .empty();
-                       } );
-               }
-
-               // Returns a promise receiving a { state:, username: } object, where:
-               // * 'state' is one of 'invalid', 'taken', 'ok'
-               // * 'username' is the validated username if 'state' is 'ok', null otherwise (if it's not
-               //   possible to register such an account)
-               function checkUsername( username ) {
-                       // We could just use .then() if we didn't have to pass on .abort()…
-                       var d, apiPromise;
-
-                       d = $.Deferred();
-                       apiPromise = api.get( {
-                               action: 'query',
-                               list: 'users',
-                               ususers: username // '|' in usernames is handled below
-                       } )
-                               .done( function ( resp ) {
-                                       var userinfo = resp.query.users[0];
-
-                                       if ( resp.query.users.length !== 1 ) {
-                                               // Happens if the user types '|' into the field
-                                               d.resolve( { state: 'invalid', username: null } );
-                                       } else if ( userinfo.invalid !== undefined ) {
-                                               d.resolve( { state: 'invalid', username: null } );
-                                       } else if ( userinfo.userid !== undefined ) {
-                                               d.resolve( { state: 'taken', username: null } );
-                                       } else {
-                                               d.resolve( { state: 'ok', username: username } );
-                                       }
-                               } )
-                               .fail( d.reject );
-
-                       return d.promise( { abort: apiPromise.abort } );
-               }
-
-               function updateUsernameStatus() {
-                       var
-                               username = $.trim( $input.val() ),
-                               currentRequestInternal;
-
-                       // Abort any pending requests.
-                       if ( currentRequest ) {
-                               currentRequest.abort();
-                       }
-
-                       if ( username === '' ) {
-                               clearStatus();
-                               return;
-                       }
-
-                       currentRequest = currentRequestInternal = checkUsername( username ).done( function ( info ) {
-                               var message;
-
-                               // Another request was fired in the meantime, the result we got here is no longer current.
-                               // This shouldn't happen as we abort pending requests, but you never know.
-                               if ( currentRequest !== currentRequestInternal ) {
-                                       return;
-                               }
-                               // If we're here, then the current request has finished, avoid calling .abort() needlessly.
-                               currentRequest = undefined;
-
-                               if ( info.state === 'ok' ) {
-                                       clearStatus();
-                               } else {
-                                       if ( info.state === 'invalid' ) {
-                                               message = mw.message( 'noname' ).text();
-                                       } else if ( info.state === 'taken' ) {
-                                               message = mw.message( 'userexists' ).text();
-                                       }
-
-                                       $statusContainer
-                                               .attr( 'class', 'errorbox' )
-                                               .empty()
-                                               .append(
-                                                       // Ugh…
-                                                       // @todo Change the HTML structure in includes/templates/Usercreate.php
-                                                       $( '<strong>' ).text( mw.message( 'createacct-error' ).text() ),
-                                                       $( '<br>' ),
-                                                       document.createTextNode( message )
-                                               )
-                                               .slideDown();
-                               }
-                       } ).fail( function () {
-                               clearStatus();
-                       } );
-               }
-
-               $input.on( events, $.debounce( 250, updateUsernameStatus ) );
-       } );
-}( mediaWiki, jQuery ) );
diff --git a/resources/mediawiki.special/mediawiki.special.version.css b/resources/mediawiki.special/mediawiki.special.version.css
deleted file mode 100644 (file)
index 917426a..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-/**
- * Adds additional styling to the extension title/version list
-**/
-.mw-version-ext-name {
-       font-weight: bold;
-}
-
-.mw-version-ext-vcs-timestamp {
-       white-space: nowrap;
-}
-
-th.mw-version-ext-col-label {
-       font-size: 0.9em;
-}
\ No newline at end of file
diff --git a/resources/mediawiki.ui/components/default/buttons.less b/resources/mediawiki.ui/components/default/buttons.less
deleted file mode 100644 (file)
index 54d1608..0000000
+++ /dev/null
@@ -1,224 +0,0 @@
-@import "mediawiki.mixins";
-@import "../../settings/typography";
-@import "../../mixins/effects";
-
-// Buttons
-//
-// All buttons start with mw-ui-button class, modified by other classes.
-// It can be any element.  Due to a lack of a CSS reset, the exact styling of
-// the button depends on what type of element is used.
-// There are two kinds of buttons, the default is a "Call to Action" with an obvious border
-// and there is a quiet kind without a border.
-//
-// Styleguide 2.
-
-@buttonBorderRadius: 3px;
-@transitionDuration: .1s;
-@transitionFunction: ease-in-out;
-
-// Neutral button styling
-//
-// Markup:
-// <button class="mw-ui-button">.mw-ui-button</button>
-// <button class="mw-ui-button" disabled>.mw-ui-button</button>
-//
-// Styleguide 2.1.
-.mw-ui-button {
-       // Container layout
-       display: inline-block;
-       padding: .5em 1em;
-       margin: 0;
-
-       // IE6/IE7 hack
-       // http://stackoverflow.com/a/5838575/365238
-       *display: inline;
-       zoom: 1;
-
-       // Container styling
-       .button-colors(@colorWhite);
-       border-radius: @buttonBorderRadius;
-
-       // Ensure that buttons and inputs are nicely aligned when they have differing heights
-       vertical-align: middle;
-
-       // Content styling
-       text-align: center;
-       font-weight: bold;
-       text-shadow: 0 1px rgba(0, 0, 0, .1);
-
-       // Interaction styling
-       cursor: pointer;
-
-       &:disabled {
-               text-shadow: none;
-               cursor: default;
-       }
-
-       .transition(background @transitionDuration @transitionFunction, color @transitionDuration @transitionFunction, box-shadow @transitionDuration @transitionFunction;);
-
-       // Styling for specific button types
-       // -----------------------------------------
-
-       // Big buttons
-       //
-       // Not all buttons are equal. You can emphasise certain actions over others
-       // using the mw-ui-big class.
-       //
-       // Markup:
-       // <button class="mw-ui-button mw-ui-big">.mw-ui-button</button>
-       // <button class="mw-ui-button mw-ui-progressive mw-ui-big">.mw-ui-progressive</button>
-       // <button class="mw-ui-button mw-ui-constructive mw-ui-big">.mw-ui-constructive</button>
-       // <button class="mw-ui-button mw-ui-destructive mw-ui-big">.mw-ui-destructive</button>
-       //
-       // Styleguide 2.1.6.
-       &.mw-ui-big {
-               font-size: @baseFontSize * 1.3;
-       }
-
-       // Block buttons
-       //
-       // Some buttons might need to be stacked.
-       //
-       // Markup:
-       // <button class="mw-ui-button mw-ui-block">.mw-ui-button</button>
-       // <button class="mw-ui-button mw-ui-progressive mw-ui-block">.mw-ui-progressive</button>
-       // <button class="mw-ui-button mw-ui-constructive mw-ui-block">.mw-ui-constructive</button>
-       // <button class="mw-ui-button mw-ui-destructive mw-ui-block">.mw-ui-destructive</button>
-       //
-       // Styleguide 2.1.5.
-       &.mw-ui-block {
-               display: block;
-               width: 100%;
-       }
-
-       // Progressive buttons
-       //
-       // Use progressive buttons for actions which lead to a next step in the process.
-       // .mw-ui-primary is deprecated, kept for compatibility.
-       //
-       // Markup:
-       // <button class="mw-ui-button mw-ui-progressive">.mw-ui-progressive</button>
-       // <button class="mw-ui-button mw-ui-progressive" disabled>.mw-ui-progressive</button>
-       //
-       // Styleguide 2.1.1.
-       &.mw-ui-progressive,
-       &.mw-ui-primary {
-               .button-colors(@colorProgressive);
-
-               &.mw-ui-quiet {
-                       .button-colors-quiet(@colorProgressive);
-               }
-       }
-
-       // Constructive buttons
-       //
-       // Use constructive buttons for actions which result in a final action in the process that results
-       // in a change of state.
-       // e.g. save changes button
-       //
-       // Markup:
-       // <button class="mw-ui-button mw-ui-constructive">.mw-ui-constructive</button>
-       // <button class="mw-ui-button mw-ui-constructive" disabled>.mw-ui-constructive</button>
-       //
-       // Styleguide 2.1.2.
-       &.mw-ui-constructive {
-               .button-colors(@colorConstructive);
-
-               &.mw-ui-quiet {
-                       .button-colors-quiet(@colorConstructive);
-               }
-       }
-
-       // Destructive buttons
-       //
-       // Use destructive buttons for actions which result in the destruction of data.
-       // e.g. deleting a page.
-       // This should not be used for cancel buttons.
-       //
-       // Markup:
-       // <button class="mw-ui-button mw-ui-destructive">.mw-ui-destructive</button>
-       // <button class="mw-ui-button mw-ui-destructive" disabled>.mw-ui-destructive</button>
-       //
-       // Styleguide 2.1.3.
-       &.mw-ui-destructive {
-               .button-colors(@colorDestructive);
-
-               &.mw-ui-quiet {
-                       .button-colors-quiet(@colorDestructive);
-               }
-       }
-
-       // Quiet buttons
-       //
-       // Use quiet buttons when they are less important and alongisde other progressive/destructive/progressive buttons.
-       //
-       // Markup:
-       // <button class="mw-ui-button mw-ui-quiet">.mw-ui-button</button>
-       // <button class="mw-ui-button mw-ui-constructive mw-ui-quiet">.mw-ui-constructive</button>
-       // <button class="mw-ui-button mw-ui-constructive mw-ui-quiet" disabled>.mw-ui-constructive</button>
-       // <button class="mw-ui-button mw-ui-destructive mw-ui-quiet">.mw-ui-destructive</button>
-       // <button class="mw-ui-button mw-ui-destructive mw-ui-quiet" disabled>.mw-ui-destructive</button>
-       // <button class="mw-ui-button mw-ui-progressive mw-ui-quiet">.mw-ui-progressive</button>
-       // <button class="mw-ui-button mw-ui-progressive mw-ui-quiet" disabled>.mw-ui-progressive</button>
-       //
-       // Styleguide 2.1.4.
-       &.mw-ui-quiet {
-               background: transparent;
-               border: none;
-               text-shadow: none;
-               .button-colors-quiet(@colorGrayDark);
-
-               &:hover,
-               &:focus {
-                       box-shadow: none;
-               }
-
-               &:active,
-               &:disabled {
-                       background: transparent;
-               }
-       }
-}
-
-a.mw-ui-button {
-       text-decoration: none;
-
-       // This overrides an underline declaration on a:hover and a:focus in
-       // commonElements.css, which the class alone isn't specific enough to do.
-       &:hover,
-       &:focus {
-               text-decoration: none;
-       }
-}
-
-// Button groups
-//
-// Group of buttons. Make sure you clear the floating after using a mw-ui-button-group.
-//
-// Markup:
-// <div class="mw-ui-button-group">
-//   <div class="mw-ui-button">A</div>
-//   <div class="mw-ui-button">B</div>
-//   <div class="mw-ui-button">C</div>
-//   <div class="mw-ui-button">D</div>
-// </div><div style="clear:both"></div>
-//
-// Styleguide 2.2.
-.mw-ui-button-group > * {
-       border-radius: 0;
-       float: left;
-
-       &:first-child {
-               border-top-left-radius: @buttonBorderRadius;
-               border-bottom-left-radius: @buttonBorderRadius;
-       }
-
-       &:not(:first-child) {
-               border-left: none;
-       }
-
-       &:last-child{
-               border-top-right-radius: @buttonBorderRadius;
-               border-bottom-right-radius: @buttonBorderRadius;
-       }
-}
diff --git a/resources/mediawiki.ui/components/default/forms.less b/resources/mediawiki.ui/components/default/forms.less
deleted file mode 100644 (file)
index 6157fa2..0000000
+++ /dev/null
@@ -1,165 +0,0 @@
-// Form elements and layouts
-
-@import "../../mixins/utilities";
-@import "../../mixins/forms";
-
-// --------------------------------------------------------------------------
-// Layouts
-// --------------------------------------------------------------------------
-
-// The FancyCaptcha image CAPTCHA used on WMF wikis drives the width of the
-// 'VForm' design, the form can't be narrower than this.
-@captchaContainerWidth: 290px;
-@defaultFormWidth: @captchaContainerWidth;
-
-// Forms
-//
-// Styleguide 3.
-
-// VForm
-//
-// Style a compact vertical stacked form ("VForm") and the elements in divs
-// within it. See button section on guidance of how and when to use mw-ui-constructive.
-//
-// Markup:
-// <form class="mw-ui-vform">
-//   <div class="mw-ui-vform-div">This is a form example.</div>
-//   <div>
-//     <label>Username </label>
-//     <input value="input">
-//   </div>
-//   <div>
-//     <button class="mw-ui-button mw-ui-constructive">Button in vform</button>
-//   </div>
-// </form>
-//
-// Styleguide 3.1.
-.mw-ui-vform {
-       .box-sizing(border-box);
-
-       width: @defaultFormWidth;
-
-       // Immediate divs in a vform are block and spaced-out.
-       // XXX: We shouldn't depend on the tag name here...
-       & > div {
-               display: block;
-               margin: 0 0 15px 0;
-               padding: 0;
-               width: 100%;
-       }
-
-       // MW currently doesn't use the type attribute everywhere on inputs.
-       input,
-       .mw-ui-button {
-               display: block;
-               .box-sizing(border-box);
-               margin: 0;
-               width: 100%;
-       }
-
-       // We exclude these because they'll generally use mw-ui-button.
-       // Otherwise, we'll unintentionally override that.
-       input:not([type=button]):not([type=submit]):not([type=file]), {
-               .agora-field-styling(); // mixins/forms.less
-       }
-
-       label {
-               display: block;
-               .box-sizing(border-box);
-               .agora-label-styling();
-               width: auto;
-               margin: 0 0 0.2em;
-               padding: 0;
-       }
-
-       // Override input styling just for checkboxes and radio inputs.
-       input[type="checkbox"],
-       input[type="radio"] {
-               display: inline;
-               .box-sizing(content-box);
-               width: auto;
-       }
-
-
-       // Styles for information boxes
-       //
-       // Regular HTMLForm uses .error class, some special pages like
-       // SpecialUserlogin (login and create account) use .errorbox.
-       //
-       // Markup:
-       // <form class="mw-ui-vform">
-       //   <div class="errorbox">An error occurred</div>
-       //   <div class="warningbox">A warning to be noted</div>
-       //   <div class="successbox">Action successful!</div>
-       //   <div class="error">A different kind of error</div>
-       //   <div>
-       //     <input type="text" value="input" class="mw-ui-input">
-       //   <div>
-       //   </div>
-       //     <button class="mw-ui-button">Button in vform</button>
-       //   </div>
-       // </form>
-       //
-       // Styleguide 3.1.
-       .error {
-               .box-sizing(border-box);
-               font-size: 0.9em;
-               margin: 0 0 1em;
-               padding: 0.5em;
-               color: #cc0000;
-               border: 1px solid #fac5c5;
-               background-color: #fae3e3;
-               text-shadow: 0 1px #fae3e3;
-               word-wrap: break-word;
-       }
-
-       .errorbox,
-       .warningbox,
-       .successbox {
-               .box-sizing(border-box);
-               font-size: 0.9em;
-               margin: 0 0 1em 0;
-               padding: 0.5em;
-               word-wrap: break-word;
-       }
-
-}
-
-// --------------------------------------------------------------------------
-// Elements
-// --------------------------------------------------------------------------
-
-// Apply this to individual elements to style them.
-// You generally don't need to use this class on divs within an Agora
-// form container such as mw-ui-vform
-// XXX DRY: This repeats earlier styling, use an @include agora-div-styling ?
-// XXX: What is this even for?
-.mw-ui-vform-div {
-       display: block;
-       margin: 0 0 15px;
-       padding: 0;
-       width: 100%;
-}
-
-// Apply mw-ui-input to individual input fields to style them.
-// You generally don't need to use this class if <input> is within an Agora
-// form container such as mw-ui-vform
-.mw-ui-input {
-       .agora-field-styling(); // mixins/forms.less
-}
-
-// Apply mw-ui-label to individual elements to style them.
-// You generally don't need to use this class if <label> is within an Agora
-// form container such as mw-ui-vform
-.mw-ui-label {
-       .agora-label-styling(); // mixins/forms.less
-}
-
-// Nesting an input checkbox or radio button inside a label with this class
-// improves alignment, e.g.
-//     <label class="mw-ui-checkbox-label">
-//             <input type="checkbox">The label text
-//     </label>
-.mw-ui-checkbox-label, .mw-ui-radio-label {
-       .agora-inline-label-styling();
-}
diff --git a/resources/mediawiki.ui/components/utilities.less b/resources/mediawiki.ui/components/utilities.less
deleted file mode 100644 (file)
index 9aea429..0000000
+++ /dev/null
@@ -1,19 +0,0 @@
-// Generic helper classes that could be used in many elements/layouts
-
-// --------------------------------------------------------------------------
-// Positioning
-// --------------------------------------------------------------------------
-
-@import "../mixins/utilities";
-
-.mw-ui-flush-left {
-       .agora-flush-left();
-}
-
-.mw-ui-flush-right {
-       .agora-flush-right();
-}
-
-.mw-ui-center-block {
-       .agora-center-block();
-}
diff --git a/resources/mediawiki.ui/components/vector/buttons.less b/resources/mediawiki.ui/components/vector/buttons.less
deleted file mode 100644 (file)
index 1536338..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-@import "../default/buttons"; // Layer Vector on top of the default settings.
-@import "../../mixins/type";
-
-.mw-ui-button {
-       .vector-type();
-}
diff --git a/resources/mediawiki.ui/components/vector/containers.less b/resources/mediawiki.ui/components/vector/containers.less
deleted file mode 100644 (file)
index 1e9ec05..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-// No default settings for containers yet.
-@import "../../mixins/type";
-
-.mw-ui-container {
-       .vector-type();
-}
diff --git a/resources/mediawiki.ui/components/vector/forms.less b/resources/mediawiki.ui/components/vector/forms.less
deleted file mode 100644 (file)
index 2bbd8f0..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-@import "../default/forms"; // Layer Vector on top of the default settings.
-@import "../../mixins/type";
-
-.mw-ui-vform,
-.mw-ui-vform input,
-.mw-ui-input {
-       .vector-type();
-}
diff --git a/resources/mediawiki.ui/default.less b/resources/mediawiki.ui/default.less
deleted file mode 100644 (file)
index e576937..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-/**
- * Provide Agora appearance for mw-ui-* classes when using a skin other than
- * Vector.
- */
-
-@import "components/utilities";
-@import "components/default/forms";
diff --git a/resources/mediawiki.ui/mixins/effects.less b/resources/mediawiki.ui/mixins/effects.less
deleted file mode 100644 (file)
index 9daad74..0000000
+++ /dev/null
@@ -1,84 +0,0 @@
-@import "../settings/colors";
-// ----------------------------------------------------------------------------
-// Button styling
-// ----------------------------------------------------------------------------
-
-.button-colors(@bgColor) {
-       background: @bgColor;
-
-       &:hover,
-       &:focus {
-               // The inner bottom bevel should match the active background color.
-               box-shadow: 0 1px rgba(0, 0, 0, 10%), inset 0 -3px rgba(0, 0, 0, 20%);
-               outline: none;
-               // remove outline in Firefox
-               &::-moz-focus-inner {
-                       border-color: transparent;
-               }
-       }
-
-       &:active,
-       &.mw-ui-checked {
-               // lessphp doesn't implement shade (https://github.com/leafo/lessphp/issues/528);
-               // it passes it through, then ResourceLoader drops it.
-               // background: shade(@bgColor, 20%);
-               background: mix(#000, @bgColor, 20%);
-               box-shadow: none;
-       }
-}
-
-.button-colors(@bgColor) when (lightness(@bgColor) >= 70%) {
-       color: @colorGrayDark;
-       border: 1px solid @colorGrayLight;
-
-       &:disabled {
-               color: @colorGrayLight;
-
-               // make sure disabled buttons don't have hover and active states
-               &:hover,
-               &:active {
-                       background: @bgColor;
-                       box-shadow: none;
-               }
-       }
-}
-
-.button-colors(@bgColor) when (lightness(@bgColor) < 70%) {
-       color: @colorWhite;
-       border: none;
-
-       &:disabled {
-               background: @colorGrayLight;
-
-               // make sure disabled buttons don't have hover and active states
-               &:hover,
-               &:active,
-               &.mw-ui-checked {
-                       box-shadow: none;
-               }
-       }
-}
-
-.button-colors-quiet(@textColor) {
-       // Quiet buttons all start gray, and reveal
-       // constructive/progressive/destructive color on hover and active.
-       color: @colorGrayDark;
-
-       &:hover,
-       &:focus {
-               // lessphp doesn't implement tint, see above
-               // color: tint(@textColor, 20%);
-               color: mix(#fff, @textColor, 20%);
-       }
-
-       &:active,
-       &.mw-ui-checked {
-               // lessphp doesn't implement shade, see above
-               // color: shade(@textColor, 20%);
-               color: mix(#000, @textColor, 20%);
-       }
-
-       &:disabled {
-               color: @colorGrayLight;
-       }
-}
diff --git a/resources/mediawiki.ui/mixins/forms.less b/resources/mediawiki.ui/mixins/forms.less
deleted file mode 100644 (file)
index 20f42a0..0000000
+++ /dev/null
@@ -1,54 +0,0 @@
-@import "../settings/colors";
-
-// Font is not included.
-// For Vector, that should be layered on top with vector-type
-.agora-field-styling() {
-
-       border: 1px solid @colorGrayLight;
-
-       &:focus {
-               // Styling focus of native checkboxes etc on Mac is almost impossible.
-               &:not([type=checkbox]):not([type=radio]) {
-                       outline: 0; // Removes OS field focus
-               }
-
-               box-shadow: @colorProgressiveShadow 0 0 5px;
-
-               border-color: @colorProgressiveShadow;
-       }
-
-       color: @colorText;
-       padding: 0.35em 0.5em 0.35em 0.5em;
-
-       // Ensure that buttons and inputs are nicely aligned when they have differing heights
-       vertical-align: middle;
-}
-
-.agora-label-styling() {
-       //font-weight: bold;
-       font-size: 0.9em;
-       color: darken(@colorGrayLight, 50%);
-
-       * {
-               font-weight: normal;
-       }
-}
-
-.agora-inline-label-styling() {
-       margin-bottom: 0.5em;
-       cursor: pointer;
-       vertical-align: bottom;
-       line-height: normal;
-
-       font-weight: normal;
-
-       & > input[type="checkbox"],
-       & > input[type="radio"] {
-               width: auto;
-               height: auto;
-               margin: 0 0.1em 0 0;
-               padding: 0;
-               border: 1px solid @colorGrayLight;
-               cursor: pointer;
-       }
-}
diff --git a/resources/mediawiki.ui/mixins/type.less b/resources/mediawiki.ui/mixins/type.less
deleted file mode 100644 (file)
index 4a01168..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-@import "../settings/typography";
-
-.vector-type() {
-       font-size: @baseFontSize;
-       line-height: @baseLineHeight;
-}
diff --git a/resources/mediawiki.ui/mixins/utilities.less b/resources/mediawiki.ui/mixins/utilities.less
deleted file mode 100644 (file)
index a201a4e..0000000
+++ /dev/null
@@ -1,23 +0,0 @@
-.box-sizing(@value) {
-       -moz-box-sizing: @value;
-       -webkit-box-sizing: @value;
-       box-sizing: @value;
-}
-
-.agora-flush-left() {
-       float: left;
-       margin-left: 0;
-       padding-left: 0;
-}
-
-.agora-flush-right() {
-       float: right;
-       margin-right: 0;
-       padding-right: 0;
-}
-
-.agora-center-block() {
-       display: block;
-       margin-left: auto;
-       margin-right: auto;
-}
diff --git a/resources/mediawiki.ui/settings/colors.less b/resources/mediawiki.ui/settings/colors.less
deleted file mode 100644 (file)
index 18661de..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-@colorWhite: #fff;
-@colorGrayLight: #ccc;
-@colorGrayDark: #898989;
-@colorText: #252525;
-@colorProgressive: #347bff;
-// FIXME: remove @colorProgressiveShadow (shadows should be generated
-// in LESS by dimming the original colors)
-@colorProgressiveShadow: #4091ed;
-@colorConstructive: #00af89;
-@colorDestructive: #d11d13;
diff --git a/resources/mediawiki.ui/settings/typography.less b/resources/mediawiki.ui/settings/typography.less
deleted file mode 100644 (file)
index 83651ed..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-@baseFontSize: 1em;
-@baseLineHeight: 1.4 * @baseFontSize;
-@baseFontColor: @colorText;
-
-@smallFontSize: 0.75em;
diff --git a/resources/mediawiki.ui/styleguide.md b/resources/mediawiki.ui/styleguide.md
deleted file mode 100644 (file)
index b7eea54..0000000
+++ /dev/null
@@ -1,26 +0,0 @@
-#Wikimedia projects
-
-This is the living style guide for MediaWiki UI used in Wikimedia Projects. It is generated from existing CSS programmatically. Please use it as a reference when developing code for MediaWiki to ensure your design is consistent with others across the site. Note this document is a work in progress and subject to change.
-
-##Brand
-
-Imagine a world in which every single human being can freely share in the sum of all knowledge.
-
-Sharing knowledge is the heart of our movement. Specifically, we care about sharing the “… highest possible quality to every single person on the planet in their own language” (Jimmy Wales). The focus of our identity is being credible and is moving toward being more inviting. We want our contributors to keep contributing while our assuring our readers that the information on any of the Wikimedia projects is reliable and accurate. Our personality should embody both of those traits with a slight sense of rebellion. We are unlike traditional projects (for instance, Encyclopedias that are only created by a few select individuals). We are a global movement, and as Jimmy Wales puts it: “Wikipedia is like rock’n’roll; it’s a cultural shift."
-
-##Design Philosophy
-
-The Wikimedia movement is a global volunteer community that aims to collect and develop the world's knowledge and to make it available to everyone for free, for any purpose. “Imagine a world in which every single human being can freely share in the sum of all knowledge.” 
-
-###Credible
-We strive for the most accurate, high quality and neutral information on all Wikimedia projects. We are fact-based and honest. We do not take sides. We are fair and impartial. 
-
-###Inviting
-We are geeky about collecting and developing knowledge. We invite and welcome every single human being to share their knowledge with us and the rest of the world. We are open-minded and have a strong sense of community. Our aesthetics should be clean and encourage interaction. 
-
-###Worldly
-We are thoughtful and are aware of cultural differences. We are careful about words, color usage, and images that might offend. We are also aware of limited connectivity in some areas of the world and are thoughtful of image sizes and loading speed. 
-
-###Humble
-We are respectful of contributors’ effort and knowledge. We have a wealth of knowledge on all projects and many people to thank for that. We are humble. We are helpful and welcome help to expand the sum of all knowledge. 
-
diff --git a/resources/mediawiki.ui/vector.less b/resources/mediawiki.ui/vector.less
deleted file mode 100644 (file)
index 08690a3..0000000
+++ /dev/null
@@ -1,25 +0,0 @@
-/**
- * Provide Agora appearance for mw-ui-* classes when using the Vector skin.
- */
-
-// Typography
-//
-// We prefer the usage of Georgia Bold for all headings. Georgia Regular is used to place emphasis on pull-out or short quotations. This latter usage should be used sparingly. 
-//
-// We prefer the use of Helvetica Neue Regular for body copy. Helvetiva Neue Bold for sub-headers. Pull-out quotes within the body copy should use Helvetica Neue Bold. Helvetica Neue is an not open-source font. Hence, below is a list of preferred alternate choices.
-//
-// Second choice: Helvetica
-//
-// Third choice: Arial
-//
-// Our content is predominantly text, hence visual hierarchy must be clear. Use these recommended type sizes to inform and establish information hierarchy and organization. 
-//
-// Unless if you plan to put extra attention and manually adjust spacing, avoid justifying texts and paragraphs as they are harder to read and create unnecessary visual distractions. Along with centered text, they convey a formal and less friendly environment. 
-//
-// It will be important to talk about other languages, scripts and writing direction - with the same level as importance, not as an afterthought.
-//
-// Styleguide 1.
-
-@import "components/utilities";
-@import "components/vector/forms";
-@import "components/vector/containers";
diff --git a/resources/mediawiki/images/arrow-collapsed-ltr.png b/resources/mediawiki/images/arrow-collapsed-ltr.png
deleted file mode 100644 (file)
index b17e578..0000000
Binary files a/resources/mediawiki/images/arrow-collapsed-ltr.png and /dev/null differ
diff --git a/resources/mediawiki/images/arrow-collapsed-ltr.svg b/resources/mediawiki/images/arrow-collapsed-ltr.svg
deleted file mode 100644 (file)
index 15992f8..0000000
+++ /dev/null
@@ -1,61 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-
-<svg
-   xmlns:dc="http://purl.org/dc/elements/1.1/"
-   xmlns:cc="http://creativecommons.org/ns#"
-   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-   xmlns:svg="http://www.w3.org/2000/svg"
-   xmlns="http://www.w3.org/2000/svg"
-   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
-   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
-   version="1.1"
-   width="12"
-   height="12"
-   id="svg2"
-   inkscape:version="0.48.4 r9939"
-   sodipodi:docname="arrow-collapsed-ltr.svg">
-  <sodipodi:namedview
-     pagecolor="#ffffff"
-     bordercolor="#666666"
-     borderopacity="1"
-     objecttolerance="10"
-     gridtolerance="10"
-     guidetolerance="10"
-     inkscape:pageopacity="0"
-     inkscape:pageshadow="2"
-     inkscape:window-width="1920"
-     inkscape:window-height="1041"
-     id="namedview7"
-     showgrid="false"
-     inkscape:zoom="27.812867"
-     inkscape:cx="7.833847"
-     inkscape:cy="7.3054094"
-     inkscape:window-x="0"
-     inkscape:window-y="0"
-     inkscape:window-maximized="1"
-     inkscape:current-layer="svg2" />
-  <defs
-     id="defs4" />
-  <metadata
-     id="metadata7">
-    <rdf:RDF>
-      <cc:Work
-         rdf:about="">
-        <dc:format>image/svg+xml</dc:format>
-        <dc:type
-           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
-        <dc:title />
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <g
-     transform="matrix(1.0559311,0,0,1.0825058,-404.86649,-609.71107)"
-     id="layer1">
-    <path
-       d="m 387.20944,564.65683 0,8.93354 4.49986,-4.49987 z"
-       id="arrow"
-       style="fill:#797979;fill-opacity:1;stroke:none"
-       inkscape:connector-curvature="0" />
-  </g>
-</svg>
diff --git a/resources/mediawiki/images/arrow-collapsed-rtl.png b/resources/mediawiki/images/arrow-collapsed-rtl.png
deleted file mode 100644 (file)
index a834548..0000000
Binary files a/resources/mediawiki/images/arrow-collapsed-rtl.png and /dev/null differ
diff --git a/resources/mediawiki/images/arrow-collapsed-rtl.svg b/resources/mediawiki/images/arrow-collapsed-rtl.svg
deleted file mode 100644 (file)
index a643689..0000000
+++ /dev/null
@@ -1,61 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-
-<svg
-   xmlns:dc="http://purl.org/dc/elements/1.1/"
-   xmlns:cc="http://creativecommons.org/ns#"
-   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-   xmlns:svg="http://www.w3.org/2000/svg"
-   xmlns="http://www.w3.org/2000/svg"
-   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
-   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
-   version="1.1"
-   width="12"
-   height="12"
-   id="svg2"
-   inkscape:version="0.48.4 r9939"
-   sodipodi:docname="arrow-collapsed-ltr.svg">
-  <sodipodi:namedview
-     pagecolor="#ffffff"
-     bordercolor="#666666"
-     borderopacity="1"
-     objecttolerance="10"
-     gridtolerance="10"
-     guidetolerance="10"
-     inkscape:pageopacity="0"
-     inkscape:pageshadow="2"
-     inkscape:window-width="1920"
-     inkscape:window-height="1041"
-     id="namedview7"
-     showgrid="false"
-     inkscape:zoom="27.812867"
-     inkscape:cx="14.764482"
-     inkscape:cy="6.45175"
-     inkscape:window-x="0"
-     inkscape:window-y="0"
-     inkscape:window-maximized="1"
-     inkscape:current-layer="svg2" />
-  <defs
-     id="defs4" />
-  <metadata
-     id="metadata7">
-    <rdf:RDF>
-      <cc:Work
-         rdf:about="">
-        <dc:format>image/svg+xml</dc:format>
-        <dc:type
-           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
-        <dc:title></dc:title>
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <g
-     transform="matrix(-1.0559311,0,0,1.0825058,416.86649,-609.71107)"
-     id="layer1">
-    <path
-       d="m 387.20944,564.65683 0,8.93354 4.49986,-4.49987 z"
-       id="arrow"
-       style="fill:#797979;fill-opacity:1;stroke:none"
-       inkscape:connector-curvature="0" />
-  </g>
-</svg>
diff --git a/resources/mediawiki/images/arrow-expanded.png b/resources/mediawiki/images/arrow-expanded.png
deleted file mode 100644 (file)
index 2bec798..0000000
Binary files a/resources/mediawiki/images/arrow-expanded.png and /dev/null differ
diff --git a/resources/mediawiki/images/arrow-expanded.svg b/resources/mediawiki/images/arrow-expanded.svg
deleted file mode 100644 (file)
index 4012bb5..0000000
+++ /dev/null
@@ -1,61 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-
-<svg
-   xmlns:dc="http://purl.org/dc/elements/1.1/"
-   xmlns:cc="http://creativecommons.org/ns#"
-   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-   xmlns:svg="http://www.w3.org/2000/svg"
-   xmlns="http://www.w3.org/2000/svg"
-   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
-   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
-   version="1.1"
-   width="12"
-   height="12"
-   id="svg2"
-   inkscape:version="0.48.4 r9939"
-   sodipodi:docname="arrow-collapsed-rtl.svg">
-  <sodipodi:namedview
-     pagecolor="#ffffff"
-     bordercolor="#666666"
-     borderopacity="1"
-     objecttolerance="10"
-     gridtolerance="10"
-     guidetolerance="10"
-     inkscape:pageopacity="0"
-     inkscape:pageshadow="2"
-     inkscape:window-width="1920"
-     inkscape:window-height="1041"
-     id="namedview7"
-     showgrid="false"
-     inkscape:zoom="27.812867"
-     inkscape:cx="9.7488178"
-     inkscape:cy="6.45175"
-     inkscape:window-x="0"
-     inkscape:window-y="0"
-     inkscape:window-maximized="1"
-     inkscape:current-layer="svg2" />
-  <defs
-     id="defs4" />
-  <metadata
-     id="metadata7">
-    <rdf:RDF>
-      <cc:Work
-         rdf:about="">
-        <dc:format>image/svg+xml</dc:format>
-        <dc:type
-           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
-        <dc:title></dc:title>
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <g
-     transform="matrix(0,1.0559311,1.0825058,0,-610.0796,-405.24226)"
-     id="layer1">
-    <path
-       d="m 387.20944,564.65683 0,8.93354 4.49986,-4.49987 z"
-       id="arrow"
-       style="fill:#797979;fill-opacity:1;stroke:none"
-       inkscape:connector-curvature="0" />
-  </g>
-</svg>
diff --git a/resources/mediawiki/mediawiki.Title.js b/resources/mediawiki/mediawiki.Title.js
deleted file mode 100644 (file)
index b7b818f..0000000
+++ /dev/null
@@ -1,588 +0,0 @@
-/*!
- * @author Neil Kandalgaonkar, 2010
- * @author Timo Tijhof, 2011-2013
- * @since 1.18
- */
-( function ( mw, $ ) {
-
-       /**
-        * @class mw.Title
-        *
-        * Parse titles into an object struture. Note that when using the constructor
-        * directly, passing invalid titles will result in an exception. Use #newFromText to use the
-        * logic directly and get null for invalid titles which is easier to work with.
-        *
-        * @constructor
-        * @param {string} title Title of the page. If no second argument given,
-        *  this will be searched for a namespace
-        * @param {number} [namespace=NS_MAIN] If given, will used as default namespace for the given title
-        * @throws {Error} When the title is invalid
-        */
-       function Title( title, namespace ) {
-               var parsed = parse( title, namespace );
-               if ( !parsed ) {
-                       throw new Error( 'Unable to parse title' );
-               }
-
-               this.namespace = parsed.namespace;
-               this.title = parsed.title;
-               this.ext = parsed.ext;
-               this.fragment = parsed.fragment;
-
-               return this;
-       }
-
-       /* Private members */
-
-       var
-
-       /**
-        * @private
-        * @static
-        * @property NS_MAIN
-        */
-       NS_MAIN = 0,
-
-       /**
-        * @private
-        * @static
-        * @property NS_TALK
-        */
-       NS_TALK = 1,
-
-       /**
-        * @private
-        * @static
-        * @property NS_SPECIAL
-        */
-       NS_SPECIAL = -1,
-
-       /**
-        * Get the namespace id from a namespace name (either from the localized, canonical or alias
-        * name).
-        *
-        * Example: On a German wiki this would return 6 for any of 'File', 'Datei', 'Image' or
-        * even 'Bild'.
-        *
-        * @private
-        * @static
-        * @method getNsIdByName
-        * @param {string} ns Namespace name (case insensitive, leading/trailing space ignored)
-        * @return {number|boolean} Namespace id or boolean false
-        */
-       getNsIdByName = function ( ns ) {
-               var id;
-
-               // Don't cast non-strings to strings, because null or undefined should not result in
-               // returning the id of a potential namespace called "Null:" (e.g. on null.example.org/wiki)
-               // Also, toLowerCase throws exception on null/undefined, because it is a String method.
-               if ( typeof ns !== 'string' ) {
-                       return false;
-               }
-               ns = ns.toLowerCase();
-               id = mw.config.get( 'wgNamespaceIds' )[ns];
-               if ( id === undefined ) {
-                       return false;
-               }
-               return id;
-       },
-
-       rUnderscoreTrim = /^_+|_+$/g,
-
-       rSplit = /^(.+?)_*:_*(.*)$/,
-
-       // See Title.php#getTitleInvalidRegex
-       rInvalid = new RegExp(
-               '[^' + mw.config.get( 'wgLegalTitleChars' ) + ']' +
-               // URL percent encoding sequences interfere with the ability
-               // to round-trip titles -- you can't link to them consistently.
-               '|%[0-9A-Fa-f]{2}' +
-               // XML/HTML character references produce similar issues.
-               '|&[A-Za-z0-9\u0080-\uFFFF]+;' +
-               '|&#[0-9]+;' +
-               '|&#x[0-9A-Fa-f]+;'
-       ),
-
-       /**
-        * Internal helper for #constructor and #newFromtext.
-        *
-        * Based on Title.php#secureAndSplit
-        *
-        * @private
-        * @static
-        * @method parse
-        * @param {string} title
-        * @param {number} [defaultNamespace=NS_MAIN]
-        * @return {Object|boolean}
-        */
-       parse = function ( title, defaultNamespace ) {
-               var namespace, m, id, i, fragment, ext;
-
-               namespace = defaultNamespace === undefined ? NS_MAIN : defaultNamespace;
-
-               title = title
-                       // Normalise whitespace to underscores and remove duplicates
-                       .replace( /[ _\s]+/g, '_' )
-                       // Trim underscores
-                       .replace( rUnderscoreTrim, '' );
-
-               // Process initial colon
-               if ( title !== '' && title.charAt( 0 ) === ':' ) {
-                       // Initial colon means main namespace instead of specified default
-                       namespace = NS_MAIN;
-                       title = title
-                               // Strip colon
-                               .substr( 1 )
-                               // Trim underscores
-                               .replace( rUnderscoreTrim, '' );
-               }
-
-               if ( title === '' ) {
-                       return false;
-               }
-
-               // Process namespace prefix (if any)
-               m = title.match( rSplit );
-               if ( m ) {
-                       id = getNsIdByName( m[1] );
-                       if ( id !== false ) {
-                               // Ordinary namespace
-                               namespace = id;
-                               title = m[2];
-
-                               // For Talk:X pages, make sure X has no "namespace" prefix
-                               if ( namespace === NS_TALK && ( m = title.match( rSplit ) ) ) {
-                                       // Disallow titles like Talk:File:x (subject should roundtrip: talk:file:x -> file:x -> file_talk:x)
-                                       if ( getNsIdByName( m[1] ) !== false ) {
-                                               return false;
-                                       }
-                               }
-                       }
-               }
-
-               // Process fragment
-               i = title.indexOf( '#' );
-               if ( i === -1 ) {
-                       fragment = null;
-               } else {
-                       fragment = title
-                               // Get segment starting after the hash
-                               .substr( i + 1 )
-                               // Convert to text
-                               // NB: Must not be trimmed ("Example#_foo" is not the same as "Example#foo")
-                               .replace( /_/g, ' ' );
-
-                       title = title
-                               // Strip hash
-                               .substr( 0, i )
-                               // Trim underscores, again (strips "_" from "bar" in "Foo_bar_#quux")
-                               .replace( rUnderscoreTrim, '' );
-               }
-
-               // Reject illegal characters
-               if ( title.match( rInvalid ) ) {
-                       return false;
-               }
-
-               // Disallow titles that browsers or servers might resolve as directory navigation
-               if (
-                       title.indexOf( '.' ) !== -1 && (
-                               title === '.' || title === '..' ||
-                               title.indexOf( './' ) === 0 ||
-                               title.indexOf( '../' ) === 0 ||
-                               title.indexOf( '/./' ) !== -1 ||
-                               title.indexOf( '/../' ) !== -1 ||
-                               title.substr( title.length - 2 ) === '/.' ||
-                               title.substr( title.length - 3 ) === '/..'
-                       )
-               ) {
-                       return false;
-               }
-
-               // Disallow magic tilde sequence
-               if ( title.indexOf( '~~~' ) !== -1 ) {
-                       return false;
-               }
-
-               // Disallow titles exceeding the 255 byte size limit (size of underlying database field)
-               // Except for special pages, e.g. [[Special:Block/Long name]]
-               // Note: The PHP implementation also asserts that even in NS_SPECIAL, the title should
-               // be less than 512 bytes.
-               if ( namespace !== NS_SPECIAL && $.byteLength( title ) > 255 ) {
-                       return false;
-               }
-
-               // Can't make a link to a namespace alone.
-               if ( title === '' && namespace !== NS_MAIN ) {
-                       return false;
-               }
-
-               // Any remaining initial :s are illegal.
-               if ( title.charAt( 0 ) === ':' ) {
-                       return false;
-               }
-
-               // For backwards-compatibility with old mw.Title, we separate the extension from the
-               // rest of the title.
-               i = title.lastIndexOf( '.' );
-               if ( i === -1 || title.length <= i + 1 ) {
-                       // Extensions are the non-empty segment after the last dot
-                       ext = null;
-               } else {
-                       ext = title.substr( i + 1 );
-                       title = title.substr( 0, i );
-               }
-
-               return {
-                       namespace: namespace,
-                       title: title,
-                       ext: ext,
-                       fragment: fragment
-               };
-       },
-
-       /**
-        * Convert db-key to readable text.
-        *
-        * @private
-        * @static
-        * @method text
-        * @param {string} s
-        * @return {string}
-        */
-       text = function ( s ) {
-               if ( s !== null && s !== undefined ) {
-                       return s.replace( /_/g, ' ' );
-               } else {
-                       return '';
-               }
-       },
-
-       // Polyfill for ES5 Object.create
-       createObject = Object.create || ( function () {
-               return function ( o ) {
-                       function Title() {}
-                       if ( o !== Object( o ) ) {
-                               throw new Error( 'Cannot inherit from a non-object' );
-                       }
-                       Title.prototype = o;
-                       return new Title();
-               };
-       }() );
-
-       /* Static members */
-
-       /**
-        * Constructor for Title objects with a null return instead of an exception for invalid titles.
-        *
-        * @static
-        * @method
-        * @param {string} title
-        * @param {number} [namespace=NS_MAIN] Default namespace
-        * @return {mw.Title|null} A valid Title object or null if the title is invalid
-        */
-       Title.newFromText = function ( title, namespace ) {
-               var t, parsed = parse( title, namespace );
-               if ( !parsed ) {
-                       return null;
-               }
-
-               t = createObject( Title.prototype );
-               t.namespace = parsed.namespace;
-               t.title = parsed.title;
-               t.ext = parsed.ext;
-               t.fragment = parsed.fragment;
-
-               return t;
-       };
-
-       /**
-        * Get the file title from an image element
-        *
-        *     var title = mw.Title.newFromImg( $( 'img:first' ) );
-        *
-        * @static
-        * @param {HTMLElement|jQuery} img The image to use as a base
-        * @return {mw.Title|null} The file title or null if unsuccessful
-        */
-       Title.newFromImg = function ( img ) {
-               var matches, i, regex, src, decodedSrc,
-
-                       // thumb.php-generated thumbnails
-                       thumbPhpRegex = /thumb\.php/,
-                       regexes = [
-                               // Thumbnails
-                               /\/[a-f0-9]\/[a-f0-9]{2}\/([^\s\/]+)\/[^\s\/]+-(?:\1|thumbnail)[^\s\/]*$/,
-
-                               // Thumbnails in non-hashed upload directories
-                               /\/([^\s\/]+)\/[^\s\/]+-(?:\1|thumbnail)[^\s\/]*$/,
-
-                               // Full size images
-                               /\/[a-f0-9]\/[a-f0-9]{2}\/([^\s\/]+)$/,
-
-                               // Full-size images in non-hashed upload directories
-                               /\/([^\s\/]+)$/
-                       ],
-
-                       recount = regexes.length;
-
-               src = img.jquery ? img[0].src : img.src;
-
-               matches = src.match( thumbPhpRegex );
-
-               if ( matches ) {
-                       return mw.Title.newFromText( 'File:' + mw.util.getParamValue( 'f', src ) );
-               }
-
-               decodedSrc = decodeURIComponent( src );
-
-               for ( i = 0; i < recount; i++ ) {
-                       regex = regexes[i];
-                       matches = decodedSrc.match( regex );
-
-                       if ( matches && matches[1] ) {
-                               return mw.Title.newFromText( 'File:' + matches[1] );
-                       }
-               }
-
-               return null;
-       };
-
-       /**
-        * Whether this title exists on the wiki.
-        *
-        * @static
-        * @param {string|mw.Title} title prefixed db-key name (string) or instance of Title
-        * @return {boolean|null} Boolean if the information is available, otherwise null
-        */
-       Title.exists = function ( title ) {
-               var match,
-                       type = $.type( title ),
-                       obj = Title.exist.pages;
-
-               if ( type === 'string' ) {
-                       match = obj[title];
-               } else if ( type === 'object' && title instanceof Title ) {
-                       match = obj[title.toString()];
-               } else {
-                       throw new Error( 'mw.Title.exists: title must be a string or an instance of Title' );
-               }
-
-               if ( typeof match === 'boolean' ) {
-                       return match;
-               }
-
-               return null;
-       };
-
-       Title.exist = {
-               /**
-                * Boolean true value indicates page does exist.
-                *
-                * @static
-                * @property {Object} exist.pages Keyed by PrefixedDb title.
-                */
-               pages: {},
-
-               /**
-                * Example to declare existing titles:
-                *
-                *     Title.exist.set( ['User:John_Doe', ...] );
-                *
-                * Example to declare titles nonexistent:
-                *
-                *     Title.exist.set( ['File:Foo_bar.jpg', ...], false );
-                *
-                * @static
-                * @property exist.set
-                * @param {string|Array} titles Title(s) in strict prefixedDb title form
-                * @param {boolean} [state=true] State of the given titles
-                * @return {boolean}
-                */
-               set: function ( titles, state ) {
-                       titles = $.isArray( titles ) ? titles : [titles];
-                       state = state === undefined ? true : !!state;
-                       var pages = this.pages, i, len = titles.length;
-                       for ( i = 0; i < len; i++ ) {
-                               pages[ titles[i] ] = state;
-                       }
-                       return true;
-               }
-       };
-
-       /* Public members */
-
-       Title.prototype = {
-               constructor: Title,
-
-               /**
-                * Get the namespace number
-                *
-                * Example: 6 for "File:Example_image.svg".
-                *
-                * @return {number}
-                */
-               getNamespaceId: function () {
-                       return this.namespace;
-               },
-
-               /**
-                * Get the namespace prefix (in the content language)
-                *
-                * Example: "File:" for "File:Example_image.svg".
-                * In #NS_MAIN this is '', otherwise namespace name plus ':'
-                *
-                * @return {string}
-                */
-               getNamespacePrefix: function () {
-                       return this.namespace === NS_MAIN ?
-                               '' :
-                               ( mw.config.get( 'wgFormattedNamespaces' )[ this.namespace ].replace( / /g, '_' ) + ':' );
-               },
-
-               /**
-                * Get the page name without extension or namespace prefix
-                *
-                * Example: "Example_image" for "File:Example_image.svg".
-                *
-                * For the page title (full page name without namespace prefix), see #getMain.
-                *
-                * @return {string}
-                */
-               getName: function () {
-                       if ( $.inArray( this.namespace, mw.config.get( 'wgCaseSensitiveNamespaces' ) ) !== -1 ) {
-                               return this.title;
-                       } else {
-                               return $.ucFirst( this.title );
-                       }
-               },
-
-               /**
-                * Get the page name (transformed by #text)
-                *
-                * Example: "Example image" for "File:Example_image.svg".
-                *
-                * For the page title (full page name without namespace prefix), see #getMainText.
-                *
-                * @return {string}
-                */
-               getNameText: function () {
-                       return text( this.getName() );
-               },
-
-               /**
-                * Get the extension of the page name (if any)
-                *
-                * @return {string|null} Name extension or null if there is none
-                */
-               getExtension: function () {
-                       return this.ext;
-               },
-
-               /**
-                * Shortcut for appendable string to form the main page name.
-                *
-                * Returns a string like ".json", or "" if no extension.
-                *
-                * @return {string}
-                */
-               getDotExtension: function () {
-                       return this.ext === null ? '' : '.' + this.ext;
-               },
-
-               /**
-                * Get the main page name (transformed by #text)
-                *
-                * Example: "Example_image.svg" for "File:Example_image.svg".
-                *
-                * @return {string}
-                */
-               getMain: function () {
-                       return this.getName() + this.getDotExtension();
-               },
-
-               /**
-                * Get the main page name (transformed by #text)
-                *
-                * Example: "Example image.svg" for "File:Example_image.svg".
-                *
-                * @return {string}
-                */
-               getMainText: function () {
-                       return text( this.getMain() );
-               },
-
-               /**
-                * Get the full page name
-                *
-                * Eaxample: "File:Example_image.svg".
-                * Most useful for API calls, anything that must identify the "title".
-                *
-                * @return {string}
-                */
-               getPrefixedDb: function () {
-                       return this.getNamespacePrefix() + this.getMain();
-               },
-
-               /**
-                * Get the full page name (transformed by #text)
-                *
-                * Example: "File:Example image.svg" for "File:Example_image.svg".
-                *
-                * @return {string}
-                */
-               getPrefixedText: function () {
-                       return text( this.getPrefixedDb() );
-               },
-
-               /**
-                * Get the fragment (if any).
-                *
-                * Note that this method (by design) does not include the hash character and
-                * the value is not url encoded.
-                *
-                * @return {string|null}
-                */
-               getFragment: function () {
-                       return this.fragment;
-               },
-
-               /**
-                * Get the URL to this title
-                *
-                * @see mw.util#getUrl
-                * @param {Object} [params] A mapping of query parameter names to values,
-                *     e.g. `{ action: 'edit' }`.
-                * @return {string}
-                */
-               getUrl: function ( params ) {
-                       return mw.util.getUrl( this.toString(), params );
-               },
-
-               /**
-                * Whether this title exists on the wiki.
-                *
-                * @see #static-method-exists
-                * @return {boolean|null} Boolean if the information is available, otherwise null
-                */
-               exists: function () {
-                       return Title.exists( this );
-               }
-       };
-
-       /**
-        * @alias #getPrefixedDb
-        * @method
-        */
-       Title.prototype.toString = Title.prototype.getPrefixedDb;
-
-       /**
-        * @alias #getPrefixedText
-        * @method
-        */
-       Title.prototype.toText = Title.prototype.getPrefixedText;
-
-       // Expose
-       mw.Title = Title;
-
-}( mediaWiki, jQuery ) );
diff --git a/resources/mediawiki/mediawiki.Uri.js b/resources/mediawiki/mediawiki.Uri.js
deleted file mode 100644 (file)
index 5566312..0000000
+++ /dev/null
@@ -1,403 +0,0 @@
-/**
- * Library for simple URI parsing and manipulation.
- *
- * Intended to be minimal, but featureful; do not expect full RFC 3986 compliance. The use cases we
- * have in mind are constructing 'next page' or 'previous page' URLs, detecting whether we need to
- * use cross-domain proxies for an API, constructing simple URL-based API calls, etc. Parsing here
- * is regex-based, so may not work on all URIs, but is good enough for most.
- *
- * You can modify the properties directly, then use the #toString method to extract the full URI
- * string again. Example:
- *
- *     var uri = new mw.Uri( 'http://example.com/mysite/mypage.php?quux=2' );
- *
- *     if ( uri.host == 'example.com' ) {
- *         uri.host = 'foo.example.com';
- *         uri.extend( { bar: 1 } );
- *
- *         $( 'a#id1' ).attr( 'href', uri );
- *         // anchor with id 'id1' now links to http://foo.example.com/mysite/mypage.php?bar=1&quux=2
- *
- *         $( 'a#id2' ).attr( 'href', uri.clone().extend( { bar: 3, pif: 'paf' } ) );
- *         // anchor with id 'id2' now links to http://foo.example.com/mysite/mypage.php?bar=3&quux=2&pif=paf
- *     }
- *
- * Given a URI like
- * `http://usr:pwd@www.example.com:81/dir/dir.2/index.htm?q1=0&&test1&test2=&test3=value+%28escaped%29&r=1&r=2#top`
- * the returned object will have the following properties:
- *
- *     protocol  'http'
- *     user      'usr'
- *     password  'pwd'
- *     host      'www.example.com'
- *     port      '81'
- *     path      '/dir/dir.2/index.htm'
- *     query     {
- *                   q1: '0',
- *                   test1: null,
- *                   test2: '',
- *                   test3: 'value (escaped)'
- *                   r: ['1', '2']
- *               }
- *     fragment  'top'
- *
- * (N.b., 'password' is technically not allowed for HTTP URIs, but it is possible with other kinds
- * of URIs.)
- *
- * Parsing based on parseUri 1.2.2 (c) Steven Levithan <http://stevenlevithan.com>, MIT License.
- * <http://stevenlevithan.com/demo/parseuri/js/>
- *
- * @class mw.Uri
- */
-
-( function ( mw, $ ) {
-       /**
-        * Function that's useful when constructing the URI string -- we frequently encounter the pattern
-        * of having to add something to the URI as we go, but only if it's present, and to include a
-        * character before or after if so.
-        *
-        * @private
-        * @static
-        * @param {string|undefined} pre To prepend
-        * @param {string} val To include
-        * @param {string} post To append
-        * @param {boolean} raw If true, val will not be encoded
-        * @return {string} Result
-        */
-       function cat( pre, val, post, raw ) {
-               if ( val === undefined || val === null || val === '' ) {
-                       return '';
-               }
-               return pre + ( raw ? val : mw.Uri.encode( val ) ) + post;
-       }
-
-       /**
-        * Regular expressions to parse many common URIs.
-        *
-        * @private
-        * @static
-        * @property {Object} parser
-        */
-       var parser = {
-               strict: /^(?:([^:\/?#]+):)?(?:\/\/(?:(?:([^:@\/?#]*)(?::([^:@\/?#]*))?)?@)?([^:\/?#]*)(?::(\d*))?)?((?:[^?#\/]*\/)*[^?#]*)(?:\?([^#]*))?(?:#(.*))?/,
-               loose:  /^(?:(?![^:@]+:[^:@\/]*@)([^:\/?#.]+):)?(?:\/\/)?(?:(?:([^:@\/?#]*)(?::([^:@\/?#]*))?)?@)?([^:\/?#]*)(?::(\d*))?((?:\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?[^?#\/]*)(?:\?([^#]*))?(?:#(.*))?/
-       },
-
-       /**
-        * The order here matches the order of captured matches in the `parser` property regexes.
-        *
-        * @private
-        * @static
-        * @property {Array} properties
-        */
-       properties = [
-               'protocol',
-               'user',
-               'password',
-               'host',
-               'port',
-               'path',
-               'query',
-               'fragment'
-       ];
-
-       /**
-        * @property {string} protocol For example `http` (always present)
-        */
-       /**
-        * @property {string|undefined} user For example `usr`
-        */
-       /**
-        * @property {string|undefined} password For example `pwd`
-        */
-       /**
-        * @property {string} host For example `www.example.com` (always present)
-        */
-       /**
-        * @property {string|undefined} port For example `81`
-        */
-       /**
-        * @property {string} path For example `/dir/dir.2/index.htm` (always present)
-        */
-       /**
-        * @property {Object} query For example `{ a: '0', b: '', c: 'value' }` (always present)
-        */
-       /**
-        * @property {string|undefined} fragment For example `top`
-        */
-
-       /**
-        * A factory method to create a variation of mw.Uri with a different default location (for
-        * relative URLs, including protocol-relative URLs). Used so the library is still testable &
-        * purely functional.
-        *
-        * @method
-        * @member mw
-        */
-       mw.UriRelative = function ( documentLocation ) {
-               var defaultUri;
-
-               /**
-                * @class mw.Uri
-                * @constructor
-                *
-                * Construct a new URI object. Throws error if arguments are illegal/impossible, or
-                * otherwise don't parse.
-                *
-                * @param {Object|string} [uri] URI string, or an Object with appropriate properties (especially
-                *  another URI object to clone). Object must have non-blank `protocol`, `host`, and `path`
-                *  properties. If omitted (or set to `undefined`, `null` or empty string), then an object
-                *  will be created for the default `uri` of this constructor (`document.location` for
-                *  mw.Uri, other values for other instances -- see mw.UriRelative for details).
-                * @param {Object|boolean} [options] Object with options, or (backwards compatibility) a boolean
-                *  for strictMode
-                * @param {boolean} [options.strictMode=false] Trigger strict mode parsing of the url.
-                * @param {boolean} [options.overrideKeys=false] Whether to let duplicate query parameters
-                *  override each other (`true`) or automagically convert them to an array (`false`).
-                */
-               function Uri( uri, options ) {
-                       options = typeof options === 'object' ? options : { strictMode: !!options };
-                       options = $.extend( {
-                               strictMode: false,
-                               overrideKeys: false
-                       }, options );
-
-                       if ( uri !== undefined && uri !== null && uri !== '' ) {
-                               if ( typeof uri === 'string' ) {
-                                       this.parse( uri, options );
-                               } else if ( typeof uri === 'object' ) {
-                                       // Copy data over from existing URI object
-                                       for ( var prop in uri ) {
-                                               // Only copy direct properties, not inherited ones
-                                               if ( uri.hasOwnProperty( prop ) ) {
-                                                       // Deep copy object properties
-                                                       if ( $.isArray( uri[prop] ) || $.isPlainObject( uri[prop] ) ) {
-                                                               this[prop] = $.extend( true, {}, uri[prop] );
-                                                       } else {
-                                                               this[prop] = uri[prop];
-                                                       }
-                                               }
-                                       }
-                                       if ( !this.query ) {
-                                               this.query = {};
-                                       }
-                               }
-                       } else {
-                               // If we didn't get a URI in the constructor, use the default one.
-                               return defaultUri.clone();
-                       }
-
-                       // protocol-relative URLs
-                       if ( !this.protocol ) {
-                               this.protocol = defaultUri.protocol;
-                       }
-                       // No host given:
-                       if ( !this.host ) {
-                               this.host = defaultUri.host;
-                               // port ?
-                               if ( !this.port ) {
-                                       this.port = defaultUri.port;
-                               }
-                       }
-                       if ( this.path && this.path.charAt( 0 ) !== '/' ) {
-                               // A real relative URL, relative to defaultUri.path. We can't really handle that since we cannot
-                               // figure out whether the last path component of defaultUri.path is a directory or a file.
-                               throw new Error( 'Bad constructor arguments' );
-                       }
-                       if ( !( this.protocol && this.host && this.path ) ) {
-                               throw new Error( 'Bad constructor arguments' );
-                       }
-               }
-
-               /**
-                * Encode a value for inclusion in a url.
-                *
-                * Standard encodeURIComponent, with extra stuff to make all browsers work similarly and more
-                * compliant with RFC 3986. Similar to rawurlencode from PHP and our JS library
-                * mw.util.rawurlencode, except this also replaces spaces with `+`.
-                *
-                * @static
-                * @param {string} s String to encode
-                * @return {string} Encoded string for URI
-                */
-               Uri.encode = function ( s ) {
-                       return encodeURIComponent( s )
-                               .replace( /!/g, '%21' ).replace( /'/g, '%27' ).replace( /\(/g, '%28' )
-                               .replace( /\)/g, '%29' ).replace( /\*/g, '%2A' )
-                               .replace( /%20/g, '+' );
-               };
-
-               /**
-                * Decode a url encoded value.
-                *
-                * Reversed #encode. Standard decodeURIComponent, with addition of replacing
-                * `+` with a space.
-                *
-                * @static
-                * @param {string} s String to decode
-                * @return {string} Decoded string
-                */
-               Uri.decode = function ( s ) {
-                       return decodeURIComponent( s.replace( /\+/g, '%20' ) );
-               };
-
-               Uri.prototype = {
-
-                       /**
-                        * Parse a string and set our properties accordingly.
-                        *
-                        * @private
-                        * @param {string} str URI, see constructor.
-                        * @param {Object} options See constructor.
-                        */
-                       parse: function ( str, options ) {
-                               var q, matches,
-                                       uri = this;
-
-                               // Apply parser regex and set all properties based on the result
-                               matches = parser[ options.strictMode ? 'strict' : 'loose' ].exec( str );
-                               $.each( properties, function ( i, property ) {
-                                       uri[ property ] = matches[ i + 1 ];
-                               } );
-
-                               // uri.query starts out as the query string; we will parse it into key-val pairs then make
-                               // that object the "query" property.
-                               // we overwrite query in uri way to make cloning easier, it can use the same list of properties.
-                               q = {};
-                               // using replace to iterate over a string
-                               if ( uri.query ) {
-                                       uri.query.replace( /(?:^|&)([^&=]*)(?:(=)([^&]*))?/g, function ( $0, $1, $2, $3 ) {
-                                               var k, v;
-                                               if ( $1 ) {
-                                                       k = Uri.decode( $1 );
-                                                       v = ( $2 === '' || $2 === undefined ) ? null : Uri.decode( $3 );
-
-                                                       // If overrideKeys, always (re)set top level value.
-                                                       // If not overrideKeys but this key wasn't set before, then we set it as well.
-                                                       if ( options.overrideKeys || q[ k ] === undefined ) {
-                                                               q[ k ] = v;
-
-                                                       // Use arrays if overrideKeys is false and key was already seen before
-                                                       } else {
-                                                               // Once before, still a string, turn into an array
-                                                               if ( typeof q[ k ] === 'string' ) {
-                                                                       q[ k ] = [ q[ k ] ];
-                                                               }
-                                                               // Add to the array
-                                                               if ( $.isArray( q[ k ] ) ) {
-                                                                       q[ k ].push( v );
-                                                               }
-                                                       }
-                                               }
-                                       } );
-                               }
-                               uri.query = q;
-                       },
-
-                       /**
-                        * Get user and password section of a URI.
-                        *
-                        * @return {string}
-                        */
-                       getUserInfo: function () {
-                               return cat( '', this.user, cat( ':', this.password, '' ) );
-                       },
-
-                       /**
-                        * Get host and port section of a URI.
-                        *
-                        * @return {string}
-                        */
-                       getHostPort: function () {
-                               return this.host + cat( ':', this.port, '' );
-                       },
-
-                       /**
-                        * Get the userInfo, host and port section of the URI.
-                        *
-                        * In most real-world URLs this is simply the hostname, but the definition of 'authority' section is more general.
-                        *
-                        * @return {string}
-                        */
-                       getAuthority: function () {
-                               return cat( '', this.getUserInfo(), '@' ) + this.getHostPort();
-                       },
-
-                       /**
-                        * Get the query arguments of the URL, encoded into a string.
-                        *
-                        * Does not preserve the original order of arguments passed in the URI. Does handle escaping.
-                        *
-                        * @return {string}
-                        */
-                       getQueryString: function () {
-                               var args = [];
-                               $.each( this.query, function ( key, val ) {
-                                       var k = Uri.encode( key ),
-                                               vals = $.isArray( val ) ? val : [ val ];
-                                       $.each( vals, function ( i, v ) {
-                                               if ( v === null ) {
-                                                       args.push( k );
-                                               } else if ( k === 'title' ) {
-                                                       args.push( k + '=' + mw.util.wikiUrlencode( v ) );
-                                               } else {
-                                                       args.push( k + '=' + Uri.encode( v ) );
-                                               }
-                                       } );
-                               } );
-                               return args.join( '&' );
-                       },
-
-                       /**
-                        * Get everything after the authority section of the URI.
-                        *
-                        * @return {string}
-                        */
-                       getRelativePath: function () {
-                               return this.path + cat( '?', this.getQueryString(), '', true ) + cat( '#', this.fragment, '' );
-                       },
-
-                       /**
-                        * Get the entire URI string.
-                        *
-                        * May not be precisely the same as input due to order of query arguments.
-                        *
-                        * @return {string} The URI string
-                        */
-                       toString: function () {
-                               return this.protocol + '://' + this.getAuthority() + this.getRelativePath();
-                       },
-
-                       /**
-                        * Clone this URI
-                        *
-                        * @return {Object} New URI object with same properties
-                        */
-                       clone: function () {
-                               return new Uri( this );
-                       },
-
-                       /**
-                        * Extend the query section of the URI with new parameters.
-                        *
-                        * @param {Object} parameters Query parameters to add to ours (or to override ours with) as an
-                        *  object
-                        * @return {Object} This URI object
-                        */
-                       extend: function ( parameters ) {
-                               $.extend( this.query, parameters );
-                               return this;
-                       }
-               };
-
-               defaultUri = new Uri( documentLocation );
-
-               return Uri;
-       };
-
-       // If we are running in a browser, inject the current document location (for relative URLs).
-       if ( document && document.location && document.location.href ) {
-               mw.Uri = mw.UriRelative( document.location.href );
-       }
-
-}( mediaWiki, jQuery ) );
diff --git a/resources/mediawiki/mediawiki.debug.init.js b/resources/mediawiki/mediawiki.debug.init.js
deleted file mode 100644 (file)
index 0f85e80..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-jQuery( function () {
-       mediaWiki.Debug.init();
-} );
diff --git a/resources/mediawiki/mediawiki.debug.js b/resources/mediawiki/mediawiki.debug.js
deleted file mode 100644 (file)
index f56f0d9..0000000
+++ /dev/null
@@ -1,388 +0,0 @@
-( function ( mw, $ ) {
-       'use strict';
-
-       var debug,
-               hovzer = $.getFootHovzer();
-
-       /**
-        * Debug toolbar.
-        *
-        * Enabled server-side through `$wgDebugToolbar`.
-        *
-        * @class mw.Debug
-        * @singleton
-        * @author John Du Hart
-        * @since 1.19
-        */
-       debug = mw.Debug = {
-               /**
-                * Toolbar container element
-                *
-                * @property {jQuery}
-                */
-               $container: null,
-
-               /**
-                * Object containing data for the debug toolbar
-                *
-                * @property {Object}
-                */
-               data: {},
-
-               /**
-                * Initialize the debugging pane
-                *
-                * Shouldn't be called before the document is ready
-                * (since it binds to elements on the page).
-                *
-                * @param {Object} [data] Defaults to 'debugInfo' from mw.config
-                */
-               init: function ( data ) {
-
-                       this.data = data || mw.config.get( 'debugInfo' );
-                       this.buildHtml();
-
-                       // Insert the container into the DOM
-                       hovzer.$.append( this.$container );
-                       hovzer.update();
-
-                       $( '.mw-debug-panelink' ).click( this.switchPane );
-               },
-
-               /**
-                * Switch between panes
-                *
-                * Should be called with an HTMLElement as its thisArg,
-                * because it's meant to be an event handler.
-                *
-                * TODO: Store cookie for last pane open.
-                *
-                * @param {jQuery.Event} e
-                */
-               switchPane: function ( e ) {
-                       var currentPaneId = debug.$container.data( 'currentPane' ),
-                               requestedPaneId = $( this ).prop( 'id' ).substr( 9 ),
-                               $currentPane = $( '#mw-debug-pane-' + currentPaneId ),
-                               $requestedPane = $( '#mw-debug-pane-' + requestedPaneId ),
-                               hovDone = false;
-
-                       function updateHov() {
-                               if ( !hovDone ) {
-                                       hovzer.update();
-                                       hovDone = true;
-                               }
-                       }
-
-                       // Skip hash fragment handling. Prevents screen from jumping.
-                       e.preventDefault();
-
-                       $( this ).addClass( 'current ' );
-                       $( '.mw-debug-panelink' ).not( this ).removeClass( 'current ' );
-
-                       // Hide the current pane
-                       if ( requestedPaneId === currentPaneId ) {
-                               $currentPane.slideUp( updateHov );
-                               debug.$container.data( 'currentPane', null );
-                               return;
-                       }
-
-                       debug.$container.data( 'currentPane', requestedPaneId );
-
-                       if ( currentPaneId === undefined || currentPaneId === null ) {
-                               $requestedPane.slideDown( updateHov );
-                       } else {
-                               $currentPane.hide();
-                               $requestedPane.show();
-                               updateHov();
-                       }
-               },
-
-               /**
-                * Construct the HTML for the debugging toolbar
-                */
-               buildHtml: function () {
-                       var $container, $bits, panes, id, gitInfo;
-
-                       $container = $( '<div id="mw-debug-toolbar" class="mw-debug" lang="en" dir="ltr"></div>' );
-
-                       $bits = $( '<div class="mw-debug-bits"></div>' );
-
-                       /**
-                        * Returns a jQuery element for a debug-bit div
-                        *
-                        * @ignore
-                        * @param {string} id
-                        * @return {jQuery}
-                        */
-                       function bitDiv( id ) {
-                               return $( '<div>' ).prop( {
-                                       id: 'mw-debug-' + id,
-                                       className: 'mw-debug-bit'
-                               } )
-                               .appendTo( $bits );
-                       }
-
-                       /**
-                        * Returns a jQuery element for a pane link
-                        *
-                        * @ignore
-                        * @param {string} id
-                        * @param {string} text
-                        * @return {jQuery}
-                        */
-                       function paneLabel( id, text ) {
-                               return $( '<a>' )
-                                       .prop( {
-                                               className: 'mw-debug-panelabel',
-                                               href: '#mw-debug-pane-' + id
-                                       } )
-                                       .text( text );
-                       }
-
-                       /**
-                        * Returns a jQuery element for a debug-bit div with a for a pane link
-                        *
-                        * @ignore
-                        * @param {string} id CSS id snippet. Will be prefixed with 'mw-debug-'
-                        * @param {string} text Text to show
-                        * @param {string} count Optional count to show
-                        * @return {jQuery}
-                        */
-                       function paneTriggerBitDiv( id, text, count ) {
-                               if ( count ) {
-                                       text = text + ' (' + count + ')';
-                               }
-                               return $( '<div>' ).prop( {
-                                       id: 'mw-debug-' + id,
-                                       className: 'mw-debug-bit mw-debug-panelink'
-                               } )
-                               .append( paneLabel( id, text ) )
-                               .appendTo( $bits );
-                       }
-
-                       paneTriggerBitDiv( 'console', 'Console', this.data.log.length );
-
-                       paneTriggerBitDiv( 'querylist', 'Queries', this.data.queries.length );
-
-                       paneTriggerBitDiv( 'debuglog', 'Debug log', this.data.debugLog.length );
-
-                       paneTriggerBitDiv( 'request', 'Request' );
-
-                       paneTriggerBitDiv( 'includes', 'PHP includes', this.data.includes.length );
-
-                       paneTriggerBitDiv( 'profile', 'Profile', this.data.profile.length );
-
-                       gitInfo = '';
-                       if ( this.data.gitRevision !== false ) {
-                               gitInfo = '(' + this.data.gitRevision.substring( 0, 7 ) + ')';
-                               if ( this.data.gitViewUrl !== false ) {
-                                       gitInfo = $( '<a>' )
-                                               .attr( 'href', this.data.gitViewUrl )
-                                               .text( gitInfo );
-                               }
-                       }
-
-                       bitDiv( 'mwversion' )
-                               .append( $( '<a href="//www.mediawiki.org/">MediaWiki</a>' ) )
-                               .append( document.createTextNode( ': ' + this.data.mwVersion + ' ' ) )
-                               .append( gitInfo );
-
-                       if ( this.data.gitBranch !== false ) {
-                               bitDiv( 'gitbranch' ).text( 'Git branch: ' + this.data.gitBranch );
-                       }
-
-                       bitDiv( 'phpversion' )
-                               .append( $( '<a href="//www.php.net/"></a>' ).text( 'PHP' ) )
-                               .append( ': ' + this.data.phpVersion );
-
-                       bitDiv( 'time' )
-                               .text( 'Time: ' + this.data.time.toFixed( 5 ) );
-
-                       bitDiv( 'memory' )
-                               .text( 'Memory: ' + this.data.memory + ' (Peak: ' + this.data.memoryPeak + ')' );
-
-                       $bits.appendTo( $container );
-
-                       panes = {
-                               console: this.buildConsoleTable(),
-                               querylist: this.buildQueryTable(),
-                               debuglog: this.buildDebugLogTable(),
-                               request: this.buildRequestPane(),
-                               includes: this.buildIncludesPane(),
-                               profile: this.buildProfilePane()
-                       };
-
-                       for ( id in panes ) {
-                               if ( !panes.hasOwnProperty( id ) ) {
-                                       continue;
-                               }
-
-                               $( '<div>' )
-                                       .prop( {
-                                               className: 'mw-debug-pane',
-                                               id: 'mw-debug-pane-' + id
-                                       } )
-                                       .append( panes[id] )
-                                       .appendTo( $container );
-                       }
-
-                       this.$container = $container;
-               },
-
-               /**
-                * Build the console panel
-                */
-               buildConsoleTable: function () {
-                       var $table, entryTypeText, i, length, entry;
-
-                       $table = $( '<table id="mw-debug-console">' );
-
-                       $( '<colgroup>' ).css( 'width', /* padding = */ 20 + ( 10 * /* fontSize = */ 11 ) ).appendTo( $table );
-                       $( '<colgroup>' ).appendTo( $table );
-                       $( '<colgroup>' ).css( 'width', 350 ).appendTo( $table );
-
-                       entryTypeText = function ( entryType ) {
-                               switch ( entryType ) {
-                                       case 'log':
-                                               return 'Log';
-                                       case 'warn':
-                                               return 'Warning';
-                                       case 'deprecated':
-                                               return 'Deprecated';
-                                       default:
-                                               return 'Unknown';
-                               }
-                       };
-
-                       for ( i = 0, length = this.data.log.length; i < length; i += 1 ) {
-                               entry = this.data.log[i];
-                               entry.typeText = entryTypeText( entry.type );
-
-                               $( '<tr>' )
-                                       .append( $( '<td>' )
-                                               .text( entry.typeText )
-                                               .addClass( 'mw-debug-console-' + entry.type )
-                                       )
-                                       .append( $( '<td>' ).html( entry.msg ) )
-                                       .append( $( '<td>' ).text( entry.caller ) )
-                                       .appendTo( $table );
-                       }
-
-                       return $table;
-               },
-
-               /**
-                * Build query list pane
-                *
-                * @return {jQuery}
-                */
-               buildQueryTable: function () {
-                       var $table, i, length, query;
-
-                       $table = $( '<table id="mw-debug-querylist"></table>' );
-
-                       $( '<tr>' )
-                               .append( $( '<th>#</th>' ).css( 'width', '4em' )    )
-                               .append( $( '<th>SQL</th>' ) )
-                               .append( $( '<th>Time</th>' ).css( 'width', '8em'  ) )
-                               .append( $( '<th>Call</th>' ).css( 'width', '18em' ) )
-                       .appendTo( $table );
-
-                       for ( i = 0, length = this.data.queries.length; i < length; i += 1 ) {
-                               query = this.data.queries[i];
-
-                               $( '<tr>' )
-                                       .append( $( '<td>' ).text( i + 1 ) )
-                                       .append( $( '<td>' ).text( query.sql ) )
-                                       .append( $( '<td class="stats">' ).text( ( query.time * 1000 ).toFixed( 4 ) + 'ms' ) )
-                                       .append( $( '<td>' ).text( query['function'] ) )
-                               .appendTo( $table );
-                       }
-
-                       return $table;
-               },
-
-               /**
-                * Build legacy debug log pane
-                *
-                * @return {jQuery}
-                */
-               buildDebugLogTable: function () {
-                       var $list, i, length, line;
-                       $list = $( '<ul>' );
-
-                       for ( i = 0, length = this.data.debugLog.length; i < length; i += 1 ) {
-                               line = this.data.debugLog[i];
-                               $( '<li>' )
-                                       .html( mw.html.escape( line ).replace( /\n/g, '<br />\n' ) )
-                                       .appendTo( $list );
-                       }
-
-                       return $list;
-               },
-
-               /**
-                * Build request information pane
-                *
-                * @return {jQuery}
-                */
-               buildRequestPane: function () {
-
-                       function buildTable( title, data ) {
-                               var $unit, $table, key;
-
-                               $unit = $( '<div>' ).append( $( '<h2>' ).text( title ) );
-
-                               $table = $( '<table>' ).appendTo( $unit );
-
-                               $( '<tr>' )
-                                       .html( '<th>Key</th><th>Value</th>' )
-                                       .appendTo( $table );
-
-                               for ( key in data ) {
-                                       if ( !data.hasOwnProperty( key ) ) {
-                                               continue;
-                                       }
-
-                                       $( '<tr>' )
-                                               .append( $( '<th>' ).text( key ) )
-                                               .append( $( '<td>' ).text( data[key] ) )
-                                               .appendTo( $table );
-                               }
-
-                               return $unit;
-                       }
-
-                       return $( '<div>' )
-                               .text( this.data.request.method + ' ' + this.data.request.url )
-                               .append( buildTable( 'Headers', this.data.request.headers ) )
-                               .append( buildTable( 'Parameters', this.data.request.params ) );
-               },
-
-               /**
-                * Build included files pane
-                *
-                * @return {jQuery}
-                */
-               buildIncludesPane: function () {
-                       var $table, i, length, file;
-
-                       $table = $( '<table>' );
-
-                       for ( i = 0, length = this.data.includes.length; i < length; i += 1 ) {
-                               file = this.data.includes[i];
-                               $( '<tr>' )
-                                       .append( $( '<td>' ).text( file.name ) )
-                                       .append( $( '<td class="nr">' ).text( file.size ) )
-                                       .appendTo( $table );
-                       }
-
-                       return $table;
-               },
-
-               buildProfilePane: function () {
-                       return mw.Debug.profile.init();
-               }
-       };
-
-}( mediaWiki, jQuery ) );
diff --git a/resources/mediawiki/mediawiki.debug.less b/resources/mediawiki/mediawiki.debug.less
deleted file mode 100644 (file)
index 949c558..0000000
+++ /dev/null
@@ -1,189 +0,0 @@
-.mw-debug {
-       width: 100%;
-       background-color: #eee;
-       border-top: 1px solid #aaa;
-
-       pre {
-               font-size: 11px;
-               padding: 0;
-               margin: 0;
-               background: none;
-               border: none;
-       }
-
-       table {
-               border-spacing: 0;
-               width: 100%;
-               table-layout: fixed;
-
-               td,
-               th {
-                       padding: 4px 10px;
-               }
-
-               td {
-                       border-bottom: 1px solid #eee;
-                       word-wrap: break-word;
-
-                       &.nr {
-                               text-align: right;
-                       }
-
-                       span.stats {
-                               color: #808080;
-                       }
-               }
-
-               tr {
-                       background-color: #fff;
-
-                       &:nth-child(even) {
-                               background-color: #f9f9f9;
-                       }
-               }
-       }
-
-       ul {
-               margin: 0;
-               list-style: none;
-       }
-
-       li {
-               padding: 4px 0;
-               width: 100%;
-       }
-}
-
-.mw-debug-bits {
-       text-align: center;
-       border-bottom: 1px solid #aaa;
-}
-
-.mw-debug-bit {
-       display: inline-block;
-       padding: 10px 5px;
-       font-size: 13px;
-       /* IE-hack for display: inline-block */
-       zoom: 1;
-       *display:inline;
-}
-
-.mw-debug-panelink {
-       background-color: #eee;
-       border-right: 1px solid #ccc;
-
-       &:first-child {
-               border-left: 1px solid #ccc;
-       }
-
-       &:hover {
-               background-color: #fefefe;
-               cursor: pointer;
-       }
-
-       &.current {
-               background-color: #dedede;
-       }
-}
-
-a.mw-debug-panelabel,
-a.mw-debug-panelabel:visited {
-       color: #000;
-}
-
-.mw-debug-pane {
-       height: 300px;
-       overflow: scroll;
-       display: none;
-       font-size: 11px;
-       background-color: #e1eff2;
-       box-sizing: border-box;
-}
-
-#mw-debug-pane-debuglog,
-#mw-debug-pane-request {
-       padding: 20px;
-}
-
-#mw-debug-pane-request {
-       table {
-               width: 100%;
-               margin: 10px 0 30px;
-       }
-
-       tr,
-       th,
-       td,
-       table {
-               border: 1px solid #D0DBB3;
-               border-collapse: collapse;
-               margin: 0;
-       }
-
-       th,
-       td {
-               font-size: 12px;
-               padding: 8px 10px;
-       }
-
-       th {
-               background-color: #F1F7E2;
-               font-weight: bold;
-       }
-
-       td {
-               background-color: white;
-       }
-}
-
-#mw-debug-console tr td {
-       &:first-child {
-               font-weight: bold;
-               vertical-align: top;
-       }
-
-       &:last-child {
-               vertical-align: top;
-       }
-}
-
-.mw-debug-backtrace {
-       padding: 5px 10px;
-       margin: 5px;
-       background-color: #dedede;
-
-       span {
-               font-weight: bold;
-               color: #111;
-       }
-
-       ul {
-               padding-left: 10px;
-       }
-
-       li {
-               width: auto;
-               padding: 0;
-               color: #333;
-               font-size: 10px;
-               margin-bottom: 0;
-               line-height: 1em;
-       }
-}
-
-.mw-debug-console-log {
-       background-color: #add8e6;
-}
-
-.mw-debug-console-warn {
-       background-color: #ffa07a;
-}
-
-.mw-debug-console-deprecated {
-       background-color: #ffb6c1;
-}
-
-/* Cheapo hack to hide the first 3 lines of the backtrace */
-.mw-debug-backtrace li:nth-child(-n+3) {
-       display: none;
-}
diff --git a/resources/mediawiki/mediawiki.debug.profile.css b/resources/mediawiki/mediawiki.debug.profile.css
deleted file mode 100644 (file)
index bf49d1a..0000000
+++ /dev/null
@@ -1,46 +0,0 @@
-
-.mw-debug-profile-tipsy .tipsy-inner {
-       /* undo max-width from vector on .tipsy-inner */
-       max-width: none;
-       /* needed for some browsers to provide space for the scrollbar without wrapping text */
-       min-width: 100%;
-       max-height: 150px;
-       overflow-y: auto;
-}
-
-.mw-debug-profile-underline {
-       stroke-width: 1;
-       stroke: #dfdfdf;
-}
-
-.mw-debug-profile-period {
-       fill: red;
-}
-
-/* connecting line between endpoints on long events */
-.mw-debug-profile-period line {
-       stroke: red;
-       stroke-width: 2;
-}
-
-.mw-debug-profile-tipsy,
-.mw-debug-profile-timeline text {
-       color: #444;
-       fill: #444;
-       /* using em's causes the two locations to have different sizes */
-       font-size: 12px;
-       font-family: sans-serif;
-}
-
-.mw-debug-profile-meta,
-.mw-debug-profile-timeline tspan {
-       /* using em's causes the two locations to have different sizes */
-       font-size: 10px;
-}
-
-.mw-debug-profile-no-data {
-       text-align: center;
-       padding-top: 5em;
-       font-weight: bold;
-       font-size: 1.2em;
-}
diff --git a/resources/mediawiki/mediawiki.debug.profile.js b/resources/mediawiki/mediawiki.debug.profile.js
deleted file mode 100644 (file)
index f6bc81d..0000000
+++ /dev/null
@@ -1,546 +0,0 @@
-/*!
- * JavaScript for the debug toolbar profiler, enabled through $wgDebugToolbar
- * and StartProfiler.php.
- *
- * @author Erik Bernhardson
- * @since 1.23
- */
-
-( function ( mw, $ ) {
-       'use strict';
-
-       /**
-        * @singleton
-        * @class mw.Debug.profile
-        */
-       var profile = mw.Debug.profile = {
-               /**
-                * Object containing data for the debug toolbar
-                *
-                * @property ProfileData
-                */
-               data: null,
-
-               /**
-                * @property DOMElement
-                */
-               container: null,
-
-               /**
-                * Initializes the profiling pane.
-                */
-               init: function ( data, width, mergeThresholdPx, dropThresholdPx ) {
-                       data = data || mw.config.get( 'debugInfo' ).profile;
-                       profile.width = width || $(window).width() - 20;
-                       // merge events from same pixel(some events are very granular)
-                       mergeThresholdPx = mergeThresholdPx || 2;
-                       // only drop events if requested
-                       dropThresholdPx = dropThresholdPx || 0;
-
-                       if ( !Array.prototype.map || !Array.prototype.reduce || !Array.prototype.filter ) {
-                               profile.container = profile.buildRequiresES5();
-                       } else if ( data.length === 0 ) {
-                               profile.container = profile.buildNoData();
-                       } else {
-                               // generate a flyout
-                               profile.data = new ProfileData( data, profile.width, mergeThresholdPx, dropThresholdPx );
-                               // draw it
-                               profile.container = profile.buildSvg( profile.container );
-                               profile.attachFlyout();
-                       }
-
-                       return profile.container;
-               },
-
-               buildRequiresES5: function () {
-                       return $( '<div>' )
-                               .text( 'An ES5 compatible javascript engine is required for the profile visualization.' )
-                               .get( 0 );
-               },
-
-               buildNoData: function () {
-                       return $( '<div>' ).addClass( 'mw-debug-profile-no-data' )
-                               .text( 'No events recorded, ensure profiling is enabled in StartProfiler.php.' )
-                               .get( 0 );
-               },
-
-               /**
-                * Creates DOM nodes appropriately namespaced for SVG.
-                *
-                * @param string tag to create
-                * @return DOMElement
-                */
-               createSvgElement: document.createElementNS.bind( document, 'http://www.w3.org/2000/svg' ),
-
-               /**
-                * @param DOMElement|undefined
-                */
-               buildSvg: function ( node ) {
-                       var container, group, i, g,
-                               timespan = profile.data.timespan,
-                               gapPerEvent = 38,
-                               space = 10.5,
-                               currentHeight = space,
-                               totalHeight = 0;
-
-                       profile.ratio = ( profile.width - space * 2 ) / ( timespan.end - timespan.start );
-                       totalHeight += gapPerEvent * profile.data.groups.length;
-
-                       if ( node ) {
-                               $( node ).empty();
-                       } else {
-                               node = profile.createSvgElement( 'svg' );
-                               node.setAttribute( 'version', '1.2' );
-                               node.setAttribute( 'baseProfile', 'tiny' );
-                       }
-                       node.style.height = totalHeight;
-                       node.style.width = profile.width;
-
-                       // use a container that can be transformed
-                       container = profile.createSvgElement( 'g' );
-                       node.appendChild( container );
-
-                       for ( i = 0; i < profile.data.groups.length; i++ ) {
-                               group = profile.data.groups[i];
-                               g = profile.buildTimeline( group );
-
-                               g.setAttribute( 'transform', 'translate( 0 ' + currentHeight + ' )' );
-                               container.appendChild( g );
-
-                               currentHeight += gapPerEvent;
-                       }
-
-                       return node;
-               },
-
-               /**
-                * @param Object group of periods to transform into graphics
-                */
-               buildTimeline: function ( group ) {
-                       var text, tspan, line, i,
-                               sum = group.timespan.sum,
-                               ms = ' ~ ' + ( sum < 1 ? sum.toFixed( 2 ) : sum.toFixed( 0 ) ) + ' ms',
-                               timeline = profile.createSvgElement( 'g' );
-
-                       timeline.setAttribute( 'class', 'mw-debug-profile-timeline' );
-
-                       // draw label
-                       text = profile.createSvgElement( 'text' );
-                       text.setAttribute( 'x', profile.xCoord( group.timespan.start ) );
-                       text.setAttribute( 'y', 0 );
-                       text.textContent = group.name;
-                       timeline.appendChild( text );
-
-                       // draw metadata
-                       tspan = profile.createSvgElement( 'tspan' );
-                       tspan.textContent = ms;
-                       text.appendChild( tspan );
-
-                       // draw timeline periods
-                       for ( i = 0; i < group.periods.length; i++ ) {
-                               timeline.appendChild( profile.buildPeriod( group.periods[i] ) );
-                       }
-
-                       // full-width line under each timeline
-                       line = profile.createSvgElement( 'line' );
-                       line.setAttribute( 'class', 'mw-debug-profile-underline' );
-                       line.setAttribute( 'x1', 0 );
-                       line.setAttribute( 'y1', 28 );
-                       line.setAttribute( 'x2', profile.width );
-                       line.setAttribute( 'y2', 28 );
-                       timeline.appendChild( line );
-
-                       return timeline;
-               },
-
-               /**
-                * @param Object period to transform into graphics
-                */
-               buildPeriod: function ( period ) {
-                       var node,
-                               head = profile.xCoord( period.start ),
-                               tail = profile.xCoord( period.end ),
-                               g = profile.createSvgElement( 'g' );
-
-                       g.setAttribute( 'class', 'mw-debug-profile-period' );
-                       $( g ).data( 'period', period );
-
-                       if ( head + 16 > tail ) {
-                               node = profile.createSvgElement( 'rect' );
-                               node.setAttribute( 'x', head );
-                               node.setAttribute( 'y', 8 );
-                               node.setAttribute( 'width', 2 );
-                               node.setAttribute( 'height', 9 );
-                               g.appendChild( node );
-
-                               node = profile.createSvgElement( 'rect' );
-                               node.setAttribute( 'x', head );
-                               node.setAttribute( 'y', 8 );
-                               node.setAttribute( 'width', ( period.end - period.start ) * profile.ratio || 2 );
-                               node.setAttribute( 'height', 6 );
-                               g.appendChild( node );
-                       } else {
-                               node = profile.createSvgElement( 'polygon' );
-                               node.setAttribute( 'points', pointList( [
-                                       [ head, 8 ],
-                                       [ head, 19 ],
-                                       [ head + 8, 8 ],
-                                       [ head, 8]
-                               ] ) );
-                               g.appendChild( node );
-
-                               node = profile.createSvgElement( 'polygon' );
-                               node.setAttribute( 'points', pointList( [
-                                       [ tail, 8 ],
-                                       [ tail, 19 ],
-                                       [ tail - 8, 8 ],
-                                       [ tail, 8 ],
-                               ] ) );
-                               g.appendChild( node );
-
-                               node = profile.createSvgElement( 'line' );
-                               node.setAttribute( 'x1', head );
-                               node.setAttribute( 'y1', 9 );
-                               node.setAttribute( 'x2', tail );
-                               node.setAttribute( 'y2', 9 );
-                               g.appendChild( node );
-                       }
-
-                       return g;
-               },
-
-               /**
-                * @param Object
-                */
-               buildFlyout: function ( period ) {
-                       var contained, sum, ms, mem, i,
-                               node = $( '<div>' );
-
-                       for ( i = 0; i < period.contained.length; i++ ) {
-                               contained = period.contained[i];
-                               sum = contained.end - contained.start;
-                               ms = '' + ( sum < 1 ? sum.toFixed( 2 ) : sum.toFixed( 0 ) ) + ' ms';
-                               mem = formatBytes( contained.memory );
-
-                               $( '<div>' ).text( contained.source.name )
-                                       .append( $( '<span>' ).text( ' ~ ' + ms + ' / ' + mem ).addClass( 'mw-debug-profile-meta' ) )
-                                       .appendTo( node );
-                       }
-
-                       return node;
-               },
-
-               /**
-                * Attach a hover flyout to all .mw-debug-profile-period groups.
-                */
-               attachFlyout: function () {
-                       // for some reason addClass and removeClass from jQuery
-                       // arn't working on svg elements in chrome <= 33.0 (possibly more)
-                       var $container = $( profile.container ),
-                               addClass = function ( node, value ) {
-                                       var current = node.getAttribute( 'class' ),
-                                               list = current ? current.split( ' ' ) : false,
-                                               idx = list ? list.indexOf( value ) : -1;
-
-                                       if ( idx === -1 ) {
-                                               node.setAttribute( 'class', current ? ( current + ' ' + value ) : value );
-                                       }
-                               },
-                               removeClass = function ( node, value ) {
-                                       var current = node.getAttribute( 'class' ),
-                                               list = current ? current.split( ' ' ) : false,
-                                               idx = list ? list.indexOf( value ) : -1;
-
-                                       if ( idx !== -1 ) {
-                                               list.splice( idx, 1 );
-                                               node.setAttribute( 'class', list.join( ' ' ) );
-                                       }
-                               },
-                               // hide all tipsy flyouts
-                               hide = function () {
-                                       $container.find( '.mw-debug-profile-period.tipsy-visible' )
-                                               .each( function () {
-                                                       removeClass( this, 'tipsy-visible' );
-                                                       $( this ).tipsy( 'hide' );
-                                               } );
-                               };
-
-                       $container.find( '.mw-debug-profile-period' ).tipsy( {
-                               fade: true,
-                               gravity: function () {
-                                       return $.fn.tipsy.autoNS.call( this )
-                                               + $.fn.tipsy.autoWE.call( this );
-                               },
-                               className: 'mw-debug-profile-tipsy',
-                               center: false,
-                               html: true,
-                               trigger: 'manual',
-                               title: function () {
-                                       return profile.buildFlyout( $( this ).data( 'period' ) ).html();
-                               },
-                       } ).on( 'mouseenter', function () {
-                               hide();
-                               addClass( this, 'tipsy-visible' );
-                               $( this ).tipsy( 'show' );
-                       } );
-
-                       $container.on( 'mouseleave', function ( event ) {
-                               var $from = $( event.relatedTarget ),
-                                       $to = $( event.target );
-                               // only close the tipsy if we are not
-                               if ( $from.closest( '.tipsy' ).length === 0 &&
-                                       $to.closest( '.tipsy' ).length === 0 &&
-                                       $to.get( 0 ).namespaceURI !== 'http://www.w4.org/2000/svg'
-                               ) {
-                                       hide();
-                               }
-                       } ).on( 'click', function () {
-                               // convenience method for closing
-                               hide();
-                       } );
-               },
-
-               /**
-                * @return number the x co-ordinate for the specified timestamp
-                */
-               xCoord: function ( msTimestamp ) {
-                       return ( msTimestamp - profile.data.timespan.start ) * profile.ratio;
-               },
-       };
-
-       function ProfileData( data, width, mergeThresholdPx, dropThresholdPx ) {
-               // validate input data
-               this.data = data.map( function ( event ) {
-                       event.periods = event.periods.filter( function ( period ) {
-                               return period.start && period.end
-                                       && period.start < period.end
-                                       // period start must be a reasonable ms timestamp
-                                       && period.start > 1000000;
-                       } );
-                       return event;
-               } ).filter( function ( event ) {
-                       return event.name && event.periods.length > 0;
-               } );
-
-               // start and end time of the data
-               this.timespan = this.data.reduce( function ( result, event ) {
-                       return event.periods.reduce( periodMinMax, result );
-               }, periodMinMax.initial() );
-
-               // transform input data
-               this.groups = this.collate( width, mergeThresholdPx, dropThresholdPx );
-
-               return this;
-       }
-
-       /**
-        * There are too many unique events to display a line for each,
-        * so this does a basic grouping.
-        */
-       ProfileData.groupOf = function ( label ) {
-               var pos, prefix = 'Profile section ended by close(): ';
-               if ( label.indexOf( prefix ) === 0 ) {
-                       label = label.substring( prefix.length );
-               }
-
-               pos = [ '::', ':', '-' ].reduce( function ( result, separator ) {
-                       var pos = label.indexOf( separator );
-                       if ( pos === -1 ) {
-                               return result;
-                       } else if ( result === -1 ) {
-                               return pos;
-                       } else {
-                               return Math.min( result, pos );
-                       }
-               }, -1 );
-
-               if ( pos === -1 ) {
-                       return label;
-               } else {
-                       return label.substring( 0, pos );
-               }
-       };
-
-       /**
-        * @return Array list of objects with `name` and `events` keys
-        */
-       ProfileData.groupEvents = function ( events ) {
-               var group, i,
-                       groups = {};
-
-               // Group events together
-               for ( i = events.length - 1; i >= 0; i-- ) {
-                       group = ProfileData.groupOf( events[i].name );
-                       if ( groups[group] ) {
-                               groups[group].push( events[i] );
-                       } else {
-                               groups[group] = [events[i]];
-                       }
-               }
-
-               // Return an array of groups
-               return Object.keys( groups ).map( function ( group ) {
-                       return {
-                               name: group,
-                               events: groups[group],
-                       };
-               } );
-       };
-
-       ProfileData.periodSorter = function ( a, b ) {
-               if ( a.start === b.start ) {
-                       return a.end - b.end;
-               }
-               return a.start - b.start;
-       };
-
-       ProfileData.genMergePeriodReducer = function ( mergeThresholdMs ) {
-               return function ( result, period ) {
-                       if ( result.length === 0 ) {
-                               // period is first result
-                               return [{
-                                       start: period.start,
-                                       end: period.end,
-                                       contained: [period],
-                               }];
-                       }
-                       var last = result[result.length - 1];
-                       if ( period.end < last.end ) {
-                               // end is contained within previous
-                               result[result.length - 1].contained.push( period );
-                       } else if ( period.start - mergeThresholdMs < last.end ) {
-                               // neighbors within merging distance
-                               result[result.length - 1].end = period.end;
-                               result[result.length - 1].contained.push( period );
-                       } else {
-                               // period is next result
-                               result.push({
-                                       start: period.start,
-                                       end: period.end,
-                                       contained: [period],
-                               });
-                       }
-                       return result;
-               };
-       };
-
-       /**
-        * Collect all periods from the grouped events and apply merge and
-        * drop transformations
-        */
-       ProfileData.extractPeriods = function ( events, mergeThresholdMs, dropThresholdMs ) {
-               // collect the periods from all events
-               return events.reduce( function ( result, event ) {
-                               if ( !event.periods.length ) {
-                                       return result;
-                               }
-                               result.push.apply( result, event.periods.map( function ( period ) {
-                                       // maintain link from period to event
-                                       period.source = event;
-                                       return period;
-                               } ) );
-                               return result;
-                       }, [] )
-                       // sort combined periods
-                       .sort( ProfileData.periodSorter )
-                       // Apply merge threshold. Original periods
-                       // are maintained in the `contained` property
-                       .reduce( ProfileData.genMergePeriodReducer( mergeThresholdMs ), [] )
-                       // Apply drop threshold
-                       .filter( function ( period ) {
-                               return period.end - period.start > dropThresholdMs;
-                       } );
-       };
-
-       /**
-        * runs a callback on all periods in the group.  Only valid after
-        * groups.periods[0..n].contained are populated. This runs against
-        * un-transformed data and is better suited to summing or other
-        * stat collection
-        */
-       ProfileData.reducePeriods = function ( group, callback, result ) {
-               return group.periods.reduce( function ( result, period ) {
-                       return period.contained.reduce( callback, result );
-               }, result );
-       };
-
-       /**
-        * Transforms this.data grouping by labels, merging neighboring
-        * events in the groups, and drops events and groups below the
-        * display threshold. Groups are returned sorted by starting time.
-        */
-       ProfileData.prototype.collate = function ( width, mergeThresholdPx, dropThresholdPx ) {
-               // ms to pixel ratio
-               var ratio = ( this.timespan.end - this.timespan.start ) / width,
-                       // transform thresholds to ms
-                       mergeThresholdMs = mergeThresholdPx * ratio,
-                       dropThresholdMs = dropThresholdPx * ratio;
-
-               return ProfileData.groupEvents( this.data )
-                       // generate data about the grouped events
-                       .map( function ( group ) {
-                               // Cleaned periods from all events
-                               group.periods = ProfileData.extractPeriods( group.events, mergeThresholdMs, dropThresholdMs );
-                               // min and max timestamp per group
-                               group.timespan = ProfileData.reducePeriods( group, periodMinMax, periodMinMax.initial() );
-                               // ms from first call to end of last call
-                               group.timespan.length = group.timespan.end - group.timespan.start;
-                               // collect the un-transformed periods
-                               group.timespan.sum = ProfileData.reducePeriods( group, function ( result, period ) {
-                                               result.push( period );
-                                               return result;
-                                       }, [] )
-                                       // sort by start time
-                                       .sort( ProfileData.periodSorter )
-                                       // merge overlapping
-                                       .reduce( ProfileData.genMergePeriodReducer( 0 ), [] )
-                                       // sum
-                                       .reduce( function ( result, period ) {
-                                               return result + period.end - period.start;
-                                       }, 0 );
-
-                               return group;
-                       }, this )
-                       // remove groups that have had all their periods filtered
-                       .filter( function ( group ) {
-                               return group.periods.length > 0;
-                       } )
-                       // sort events by first start
-                       .sort( function ( a, b ) {
-                               return ProfileData.periodSorter( a.timespan, b.timespan );
-                       } );
-       };
-
-       // reducer to find edges of period array
-       function periodMinMax( result, period ) {
-               if ( period.start < result.start ) {
-                       result.start = period.start;
-               }
-               if ( period.end > result.end ) {
-                       result.end = period.end;
-               }
-               return result;
-       }
-
-       periodMinMax.initial = function () {
-               return { start: Number.POSITIVE_INFINITY, end: Number.NEGATIVE_INFINITY };
-       };
-
-       function formatBytes( bytes ) {
-               var i, sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB'];
-               if ( bytes === 0 ) {
-                       return '0 Bytes';
-               }
-               i = parseInt( Math.floor( Math.log( bytes ) / Math.log( 1024 ) ), 10 );
-               return Math.round( bytes / Math.pow( 1024, i ), 2 ) + ' ' + sizes[i];
-       }
-
-       // turns a 2d array into a point list for svg
-       // polygon points attribute
-       // ex: [[1,2],[3,4],[4,2]] = '1,2 3,4 4,2'
-       function pointList( pairs ) {
-               return pairs.map( function ( pair ) {
-                       return pair.join( ',' );
-               } ).join( ' ' );
-       }
-}( mediaWiki, jQuery ) );
diff --git a/resources/mediawiki/mediawiki.feedback.css b/resources/mediawiki/mediawiki.feedback.css
deleted file mode 100644 (file)
index 6bd47bb..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-.feedback-spinner {
-       display: inline-block;
-       zoom: 1;
-       *display: inline; /* IE7 and below */
-       /* @embed */
-       background: url(mediawiki.feedback.spinner.gif);
-       width: 18px;
-       height: 18px;
-}
diff --git a/resources/mediawiki/mediawiki.feedback.js b/resources/mediawiki/mediawiki.feedback.js
deleted file mode 100644 (file)
index 90a6425..0000000
+++ /dev/null
@@ -1,316 +0,0 @@
-/*!
- * mediawiki.feedback
- *
- * @author Ryan Kaldari, 2010
- * @author Neil Kandalgaonkar, 2010-11
- * @since 1.19
- */
-( function ( mw, $ ) {
-       /**
-        * This is a way of getting simple feedback from users. It's useful
-        * for testing new features -- users can give you feedback without
-        * the difficulty of opening a whole new talk page. For this reason,
-        * it also tends to collect a wider range of both positive and negative
-        * comments. However you do need to tend to the feedback page. It will
-        * get long relatively quickly, and you often get multiple messages
-        * reporting the same issue.
-        *
-        * It takes the form of thing on your page which, when clicked, opens a small
-        * dialog box. Submitting that dialog box appends its contents to a
-        * wiki page that you specify, as a new section.
-        *
-        * Not compatible with LiquidThreads.
-        *
-        * Minimal example in how to use it:
-        *
-        *     var feedback = new mw.Feedback();
-        *     $( '#myButton' ).click( function () { feedback.launch(); } );
-        *
-        * You can also launch the feedback form with a prefilled subject and body.
-        * See the docs for the #launch() method.
-        *
-        * @class
-        * @constructor
-        * @param {Object} [options]
-        * @param {mw.Api} [options.api] if omitted, will just create a standard API
-        * @param {mw.Title} [options.title="Feedback"] The title of the page where you collect
-        * feedback.
-        * @param {string} [options.dialogTitleMessageKey="feedback-submit"] Message key for the
-        * title of the dialog box
-        * @param {string} [options.bugsLink="//bugzilla.wikimedia.org/enter_bug.cgi"] URL where
-        * bugs can be posted
-        * @param {mw.Uri|string} [options.bugsListLink="//bugzilla.wikimedia.org/query.cgi"]
-        * URL where bugs can be listed
-        */
-       mw.Feedback = function ( options ) {
-               if ( options === undefined ) {
-                       options = {};
-               }
-
-               if ( options.api === undefined ) {
-                       options.api = new mw.Api();
-               }
-
-               if ( options.title === undefined ) {
-                       options.title = new mw.Title( 'Feedback' );
-               }
-
-               if ( options.dialogTitleMessageKey === undefined ) {
-                       options.dialogTitleMessageKey = 'feedback-submit';
-               }
-
-               if ( options.bugsLink === undefined ) {
-                       options.bugsLink = '//bugzilla.wikimedia.org/enter_bug.cgi';
-               }
-
-               if ( options.bugsListLink === undefined ) {
-                       options.bugsListLink = '//bugzilla.wikimedia.org/query.cgi';
-               }
-
-               $.extend( this, options );
-               this.setup();
-       };
-
-       mw.Feedback.prototype = {
-               /**
-                * Sets up interface
-                */
-               setup: function () {
-                       var $feedbackPageLink,
-                               $bugNoteLink,
-                               $bugsListLink,
-                               fb = this;
-
-                       $feedbackPageLink = $( '<a>' )
-                               .attr( {
-                                       href: fb.title.getUrl(),
-                                       target: '_blank'
-                               } )
-                               .css( {
-                                       whiteSpace: 'nowrap'
-                               } );
-
-                       $bugNoteLink = $( '<a>' ).attr( { href: '#' } ).click( function () {
-                               fb.displayBugs();
-                       } );
-
-                       $bugsListLink = $( '<a>' ).attr( {
-                               href: fb.bugsListLink,
-                               target: '_blank'
-                       } );
-
-                       // TODO: Use a stylesheet instead of these inline styles
-                       this.$dialog =
-                               $( '<div style="position: relative;"></div>' ).append(
-                                       $( '<div class="feedback-mode feedback-form"></div>' ).append(
-                                               $( '<small>' ).append(
-                                                       $( '<p>' ).msg(
-                                                               'feedback-bugornote',
-                                                               $bugNoteLink,
-                                                               fb.title.getNameText(),
-                                                               $feedbackPageLink.clone()
-                                                       )
-                                               ),
-                                               $( '<div style="margin-top: 1em;"></div>' ).append(
-                                                       mw.msg( 'feedback-subject' ),
-                                                       $( '<br>' ),
-                                                       $( '<input type="text" class="feedback-subject" name="subject" maxlength="60" style="width: 100%; -moz-box-sizing: border-box; -webkit-box-sizing: border-box; box-sizing: border-box;"/>' )
-                                               ),
-                                               $( '<div style="margin-top: 0.4em;"></div>' ).append(
-                                                       mw.msg( 'feedback-message' ),
-                                                       $( '<br>' ),
-                                                       $( '<textarea name="message" class="feedback-message" rows="5" cols="60"></textarea>' )
-                                               )
-                                       ),
-                                       $( '<div class="feedback-mode feedback-bugs"></div>' ).append(
-                                               $( '<p>' ).msg( 'feedback-bugcheck', $bugsListLink )
-                                       ),
-                                       $( '<div class="feedback-mode feedback-submitting" style="text-align: center; margin: 3em 0;"></div>' ).append(
-                                               mw.msg( 'feedback-adding' ),
-                                               $( '<br>' ),
-                                               $( '<span class="feedback-spinner"></span>' )
-                                       ),
-                                       $( '<div class="feedback-mode feedback-thanks" style="text-align: center; margin:1em"></div>' ).msg(
-                                               'feedback-thanks', fb.title.getNameText(), $feedbackPageLink.clone()
-                                       ),
-                                       $( '<div class="feedback-mode feedback-error" style="position: relative;"></div>' ).append(
-                                               $( '<div class="feedback-error-msg style="color: #990000; margin-top: 0.4em;"></div>' )
-                                       )
-                               );
-
-                               // undo some damage from dialog css
-                               this.$dialog.find( 'a' ).css( {
-                                       color: '#0645ad'
-                               } );
-
-                               this.$dialog.dialog({
-                                       width: 500,
-                                       autoOpen: false,
-                                       title: mw.msg( this.dialogTitleMessageKey ),
-                                       modal: true,
-                                       buttons: fb.buttons
-                               });
-
-                       this.subjectInput = this.$dialog.find( 'input.feedback-subject' ).get(0);
-                       this.messageInput = this.$dialog.find( 'textarea.feedback-message' ).get(0);
-
-               },
-
-               /**
-                * Displays a section of the dialog.
-                *
-                * @param {"form"|"bugs"|"submitting"|"thanks"|"error"} s
-                * The section of the dialog to show.
-                */
-               display: function ( s ) {
-                       // Hide the buttons
-                       this.$dialog.dialog( { buttons: {} } );
-                       // Hide everything
-                       this.$dialog.find( '.feedback-mode' ).hide();
-                       // Show the desired div
-                       this.$dialog.find( '.feedback-' + s ).show();
-               },
-
-               /**
-                * Display the submitting section.
-                */
-               displaySubmitting: function () {
-                       this.display( 'submitting' );
-               },
-
-               /**
-                * Display the bugs section.
-                */
-               displayBugs: function () {
-                       var fb = this,
-                               bugsButtons = {};
-                       this.display( 'bugs' );
-                       bugsButtons[ mw.msg( 'feedback-bugnew' ) ] = function () {
-                               window.open( fb.bugsLink, '_blank' );
-                       };
-                       bugsButtons[ mw.msg( 'feedback-cancel' ) ] = function () {
-                               fb.cancel();
-                       };
-                       this.$dialog.dialog( {
-                               buttons: bugsButtons
-                       } );
-               },
-
-               /**
-                * Display the thanks section.
-                */
-               displayThanks: function () {
-                       var fb = this,
-                               closeButton = {};
-                       this.display( 'thanks' );
-                       closeButton[ mw.msg( 'feedback-close' ) ] = function () {
-                               fb.$dialog.dialog( 'close' );
-                       };
-                       this.$dialog.dialog( {
-                               buttons: closeButton
-                       } );
-               },
-
-               /**
-                * Display the feedback form
-                * @param {Object} [contents] Prefilled contents for the feedback form.
-                * @param {string} [contents.subject] The subject of the feedback
-                * @param {string} [contents.message] The content of the feedback
-                */
-               displayForm: function ( contents ) {
-                       var fb = this,
-                               formButtons = {};
-                       this.subjectInput.value = ( contents && contents.subject ) ? contents.subject : '';
-                       this.messageInput.value = ( contents && contents.message ) ? contents.message : '';
-
-                       this.display( 'form' );
-
-                       // Set up buttons for dialog box. We have to do it the hard way since the json keys are localized
-                       formButtons[ mw.msg( 'feedback-submit' ) ] = function () {
-                               fb.submit();
-                       };
-                       formButtons[ mw.msg( 'feedback-cancel' ) ] = function () {
-                               fb.cancel();
-                       };
-                       this.$dialog.dialog( { buttons: formButtons } ); // put the buttons back
-               },
-
-               /**
-                * Display an error on the form.
-                *
-                * @param {string} message Should be a valid message key.
-                */
-               displayError: function ( message ) {
-                       var fb = this,
-                               closeButton = {};
-                       this.display( 'error' );
-                       this.$dialog.find( '.feedback-error-msg' ).msg( message );
-                       closeButton[ mw.msg( 'feedback-close' ) ] = function () {
-                               fb.$dialog.dialog( 'close' );
-                       };
-                       this.$dialog.dialog( { buttons: closeButton } );
-               },
-
-               /**
-                * Close the feedback form.
-                */
-               cancel: function () {
-                       this.$dialog.dialog( 'close' );
-               },
-
-               /**
-                * Submit the feedback form.
-                */
-               submit: function () {
-                       var subject, message,
-                               fb = this;
-
-                       function ok( result ) {
-                               if ( result.edit !== undefined ) {
-                                       if ( result.edit.result === 'Success' ) {
-                                               fb.displayThanks();
-                                       } else {
-                                               // unknown API result
-                                               fb.displayError( 'feedback-error1' );
-                                       }
-                               } else {
-                                       // edit failed
-                                       fb.displayError( 'feedback-error2' );
-                               }
-                       }
-
-                       function err() {
-                               // ajax request failed
-                               fb.displayError( 'feedback-error3' );
-                       }
-
-                       // Get the values to submit.
-                       subject = this.subjectInput.value;
-
-                       // We used to include "mw.html.escape( navigator.userAgent )" but there are legal issues
-                       // with posting this without their explicit consent
-                       message = this.messageInput.value;
-                       if ( message.indexOf( '~~~' ) === -1 ) {
-                               message += ' ~~~~';
-                       }
-
-                       this.displaySubmitting();
-
-                       this.api.newSection( this.title, subject, message, ok, err );
-               },
-
-               /**
-                * Modify the display form, and then open it, focusing interface on the subject.
-                * @param {Object} [contents] Prefilled contents for the feedback form.
-                * @param {string} [contents.subject] The subject of the feedback
-                * @param {string} [contents.message] The content of the feedback
-                */
-               launch: function ( contents ) {
-                       this.displayForm( contents );
-                       this.$dialog.dialog( 'open' );
-                       this.subjectInput.focus();
-               }
-
-       };
-
-}( mediaWiki, jQuery ) );
diff --git a/resources/mediawiki/mediawiki.feedback.spinner.gif b/resources/mediawiki/mediawiki.feedback.spinner.gif
deleted file mode 100644 (file)
index aed0ea4..0000000
Binary files a/resources/mediawiki/mediawiki.feedback.spinner.gif and /dev/null differ
diff --git a/resources/mediawiki/mediawiki.hidpi.js b/resources/mediawiki/mediawiki.hidpi.js
deleted file mode 100644 (file)
index ecee450..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-jQuery( function ( $ ) {
-       // Apply hidpi images on DOM-ready
-       // Some may have already partly preloaded at low resolution.
-       $( 'body' ).hidpi();
-} );
diff --git a/resources/mediawiki/mediawiki.hlist.css b/resources/mediawiki/mediawiki.hlist.css
deleted file mode 100644 (file)
index adcb810..0000000
+++ /dev/null
@@ -1,78 +0,0 @@
-/*!
- * Stylesheet for mediawiki.hlist module
- * @author [[User:Edokter]]
- */
-.hlist dl,
-.hlist ol,
-.hlist ul {
-       margin: 0;
-       padding: 0;
-}
-/* Display list items inline */
-.hlist dd,
-.hlist dt,
-.hlist li {
-       margin: 0;
-       display: inline;
-}
-/* Display nested lists inline */
-.hlist dl dl, .hlist dl ol, .hlist dl ul,
-.hlist ol dl, .hlist ol ol, .hlist ol ul,
-.hlist ul dl, .hlist ul ol, .hlist ul ul {
-       display: inline;
-}
-/* Generate interpuncts */
-.hlist dt:after {
-       content: ":";
-}
-.hlist dd:after,
-.hlist li:after {
-       content: " ·";
-       font-weight: bold;
-}
-.hlist dd:last-child:after,
-.hlist dt:last-child:after,
-.hlist li:last-child:after {
-       content: none;
-}
-/* For IE8 */
-.hlist dd.hlist-last-child:after,
-.hlist dt.hlist-last-child:after,
-.hlist li.hlist-last-child:after {
-       content: none;
-}
-/* Add parentheses around nested lists */
-.hlist dd dd:first-child:before, .hlist dd dt:first-child:before, .hlist dd li:first-child:before,
-.hlist dt dd:first-child:before, .hlist dt dt:first-child:before, .hlist dt li:first-child:before,
-.hlist li dd:first-child:before, .hlist li dt:first-child:before, .hlist li li:first-child:before {
-       content: "(";
-       font-weight: normal;
-}
-.hlist dd dd:last-child:after, .hlist dd dt:last-child:after, .hlist dd li:last-child:after,
-.hlist dt dd:last-child:after, .hlist dt dt:last-child:after, .hlist dt li:last-child:after,
-.hlist li dd:last-child:after, .hlist li dt:last-child:after, .hlist li li:last-child:after {
-       content: ")";
-       font-weight: normal;
-}
-/* For IE8 */
-.hlist dd dd.hlist-last-child:after, .hlist dd dt.hlist-last-child:after, .hlist dd li.hlist-last-child:after,
-.hlist dt dd.hlist-last-child:after, .hlist dt dt.hlist-last-child:after, .hlist dt li.hlist-last-child:after,
-.hlist li dd.hlist-last-child:after, .hlist li dt.hlist-last-child:after, .hlist li li.hlist-last-child:after {
-       content: ")";
-       font-weight: normal;
-}
-/* Put ordinals in front of ordered list items */
-.hlist ol {
-       counter-reset: list-item;
-}
-.hlist ol > li {
-       counter-increment: list-item;
-}
-.hlist ol > li:before {
-       content: counter(list-item) " ";
-}
-.hlist dd ol > li:first-child:before,
-.hlist dt ol > li:first-child:before,
-.hlist li ol > li:first-child:before {
-       content: "(" counter(list-item) " ";
-}
diff --git a/resources/mediawiki/mediawiki.hlist.js b/resources/mediawiki/mediawiki.hlist.js
deleted file mode 100644 (file)
index 0bbf8fa..0000000
+++ /dev/null
@@ -1,31 +0,0 @@
-/*!
- * .hlist fallbacks for IE 6, 7 and 8.
- * @author [[User:Edokter]]
- */
-( function ( mw, $ ) {
-       var profile = $.client.profile();
-
-       if ( profile.name === 'msie' ) {
-               if ( profile.versionNumber === 8 ) {
-                       /* IE 8: Add pseudo-selector class to last-child list items */
-                       mw.hook( 'wikipage.content' ).add( function ( $content ) {
-                               $content.find( '.hlist' ).find( 'dd:last-child, dt:last-child, li:last-child' )
-                                       .addClass( 'hlist-last-child' );
-                       } );
-               }
-               else if ( profile.versionNumber <= 7 ) {
-                       /* IE 7 and below: Generate interpuncts and parentheses */
-                       mw.hook( 'wikipage.content' ).add( function ( $content ) {
-                               var $hlists = $content.find( '.hlist' );
-                               $hlists.find( 'dt:not(:last-child)' )
-                                       .append( ': ' );
-                               $hlists.find( 'dd:not(:last-child)' )
-                                       .append( '<b>·</b> ' );
-                               $hlists.find( 'li:not(:last-child)' )
-                                       .append( '<b>·</b> ' );
-                               $hlists.find( 'dl dl, dl ol, dl ul, ol dl, ol ol, ol ul, ul dl, ul ol, ul ul' )
-                                       .prepend( '( ' ).append( ') ' );
-                       } );
-               }
-       }
-}( mediaWiki, jQuery ) );
diff --git a/resources/mediawiki/mediawiki.htmlform.js b/resources/mediawiki/mediawiki.htmlform.js
deleted file mode 100644 (file)
index 5ba1a54..0000000
+++ /dev/null
@@ -1,138 +0,0 @@
-/**
- * Utility functions for jazzing up HTMLForm elements.
- *
- * @class jQuery.plugin.htmlform
- */
-( function ( mw, $ ) {
-
-       /**
-        * jQuery plugin to fade or snap to visible state.
-        *
-        * @param {boolean} [instantToggle=false]
-        * @return {jQuery}
-        * @chainable
-        */
-       $.fn.goIn = function ( instantToggle ) {
-               if ( instantToggle === true ) {
-                       return $( this ).show();
-               }
-               return $( this ).stop( true, true ).fadeIn();
-       };
-
-       /**
-        * jQuery plugin to fade or snap to hiding state.
-        *
-        * @param {boolean} [instantToggle=false]
-        * @return jQuery
-        * @chainable
-        */
-       $.fn.goOut = function ( instantToggle ) {
-               if ( instantToggle === true ) {
-                       return $( this ).hide();
-               }
-               return $( this ).stop( true, true ).fadeOut();
-       };
-
-       /**
-        * Bind a function to the jQuery object via live(), and also immediately trigger
-        * the function on the objects with an 'instant' parameter set to true.
-        * @param {Function} callback
-        * @param {boolean|jQuery.Event} callback.immediate True when the event is called immediately,
-        *  an event object when triggered from an event.
-        */
-       $.fn.liveAndTestAtStart = function ( callback ) {
-               $( this )
-                       .live( 'change', callback )
-                       .each( function () {
-                               callback.call( this, true );
-                       } );
-       };
-
-       $( function () {
-
-               // Animate the SelectOrOther fields, to only show the text field when
-               // 'other' is selected.
-               $( '.mw-htmlform-select-or-other' ).liveAndTestAtStart( function ( instant ) {
-                       var $other = $( '#' + $( this ).attr( 'id' ) + '-other' );
-                       $other = $other.add( $other.siblings( 'br' ) );
-                       if ( $( this ).val() === 'other' ) {
-                               $other.goIn( instant );
-                       } else {
-                               $other.goOut( instant );
-                       }
-               } );
-
-       } );
-
-       function addMulti( $oldContainer, $container ) {
-               var name = $oldContainer.find( 'input:first-child' ).attr( 'name' ),
-                       oldClass = ( ' ' + $oldContainer.attr( 'class' ) + ' ' ).replace( /(mw-htmlform-field-HTMLMultiSelectField|mw-chosen)/g, '' ),
-                       $select = $( '<select>' ),
-                       dataPlaceholder = mw.message( 'htmlform-chosen-placeholder' );
-               oldClass = $.trim( oldClass );
-               $select.attr( {
-                       name: name,
-                       multiple: 'multiple',
-                       'data-placeholder': dataPlaceholder.plain(),
-                       'class': 'htmlform-chzn-select mw-input ' + oldClass
-               } );
-               $oldContainer.find( 'input' ).each( function () {
-                       var $oldInput = $( this ),
-                       checked = $oldInput.prop( 'checked' ),
-                       $option = $( '<option>' );
-                       $option.prop( 'value', $oldInput.prop( 'value' ) );
-                       if ( checked ) {
-                               $option.prop( 'selected', true );
-                       }
-                       $option.text( $oldInput.prop( 'value' ) );
-                       $select.append( $option );
-               } );
-               $container.append( $select );
-       }
-
-       function convertCheckboxesToMulti( $oldContainer, type ) {
-               var $fieldLabel = $( '<td>' ),
-               $td = $( '<td>' ),
-               $fieldLabelText = $( '<label>' ),
-               $container;
-               if ( type === 'tr' ) {
-                       addMulti( $oldContainer, $td );
-                       $container = $( '<tr>' );
-                       $container.append( $td );
-               } else if ( type === 'div' ) {
-                       $fieldLabel = $( '<div>' );
-                       $container = $( '<div>' );
-                       addMulti( $oldContainer, $container );
-               }
-               $fieldLabel.attr( 'class', 'mw-label' );
-               $fieldLabelText.text( $oldContainer.find( '.mw-label label' ).text() );
-               $fieldLabel.append( $fieldLabelText );
-               $container.prepend( $fieldLabel );
-               $oldContainer.replaceWith( $container );
-               return $container;
-       }
-
-       if ( $( '.mw-chosen' ).length ) {
-               mw.loader.using( 'jquery.chosen', function () {
-                       $( '.mw-chosen' ).each( function () {
-                               var type = this.nodeName.toLowerCase(),
-                                       $converted = convertCheckboxesToMulti( $( this ), type );
-                               $converted.find( '.htmlform-chzn-select' ).chosen( { width: 'auto' } );
-                       } );
-               } );
-       }
-
-       $( function () {
-               var $matrixTooltips = $( '.mw-htmlform-matrix .mw-htmlform-tooltip' );
-               if ( $matrixTooltips.length ) {
-                       mw.loader.using( 'jquery.tipsy', function () {
-                               $matrixTooltips.tipsy( { gravity: 's' } );
-                       } );
-               }
-       } );
-
-       /**
-        * @class jQuery
-        * @mixins jQuery.plugin.htmlform
-        */
-}( mediaWiki, jQuery ) );
diff --git a/resources/mediawiki/mediawiki.icon.less b/resources/mediawiki/mediawiki.icon.less
deleted file mode 100644 (file)
index 49f0f70..0000000
+++ /dev/null
@@ -1,19 +0,0 @@
-/* General-purpose icons via CSS. Classes here should be named "mw-icon-*". */
-
-@import "mediawiki.mixins";
-
-/* For the collapsed and expanded arrows, we also provide selectors to make it
- * easy to use them with jquery.makeCollapsible. */
-.mw-icon-arrow-collapsed,
-.mw-collapsible-arrow.mw-collapsible-toggle-collapsed {
-       .background-image-svg('images/arrow-collapsed-ltr.svg', 'images/arrow-collapsed-ltr.png');
-       background-repeat: no-repeat;
-       background-position: left bottom;
-}
-
-.mw-icon-arrow-expanded,
-.mw-collapsible-arrow.mw-collapsible-toggle-expanded {
-       .background-image-svg('images/arrow-expanded.svg', 'images/arrow-expanded.png');
-       background-repeat: no-repeat;
-       background-position: left bottom;
-}
diff --git a/resources/mediawiki/mediawiki.inspect.js b/resources/mediawiki/mediawiki.inspect.js
deleted file mode 100644 (file)
index 62fa410..0000000
+++ /dev/null
@@ -1,284 +0,0 @@
-/*!
- * Tools for inspecting page composition and performance.
- *
- * @author Ori Livneh
- * @since 1.22
- */
-/*jshint devel:true */
-( function ( mw, $ ) {
-
-       function sortByProperty( array, prop, descending ) {
-               var order = descending ? -1 : 1;
-               return array.sort( function ( a, b ) {
-                       return a[prop] > b[prop] ? order : a[prop] < b[prop] ? -order : 0;
-               } );
-       }
-
-       function humanSize( bytes ) {
-               if ( !$.isNumeric( bytes ) || bytes === 0 ) { return bytes; }
-               var i = 0, units = [ '', ' kB', ' MB', ' GB', ' TB', ' PB' ];
-               for ( ; bytes >= 1024; bytes /= 1024 ) { i++; }
-               return bytes.toFixed( 1 ) + units[i];
-       }
-
-       /**
-        * @class mw.inspect
-        * @singleton
-        */
-       var inspect = {
-
-               /**
-                * Return a map of all dependency relationships between loaded modules.
-                *
-                * @return {Object} Maps module names to objects. Each sub-object has
-                *  two properties, 'requires' and 'requiredBy'.
-                */
-               getDependencyGraph: function () {
-                       var modules = inspect.getLoadedModules(), graph = {};
-
-                       $.each( modules, function ( moduleIndex, moduleName ) {
-                               var dependencies = mw.loader.moduleRegistry[moduleName].dependencies || [];
-
-                               graph[moduleName] = graph[moduleName] || { requiredBy: [] };
-                               graph[moduleName].requires = dependencies;
-
-                               $.each( dependencies, function ( depIndex, depName ) {
-                                       graph[depName] = graph[depName] || { requiredBy: [] };
-                                       graph[depName].requiredBy.push( moduleName );
-                               } );
-                       } );
-                       return graph;
-               },
-
-               /**
-                * Calculate the byte size of a ResourceLoader module.
-                *
-                * @param {string} moduleName The name of the module
-                * @return {number|null} Module size in bytes or null
-                */
-               getModuleSize: function ( moduleName ) {
-                       var module = mw.loader.moduleRegistry[ moduleName ],
-                               payload = 0;
-
-                       if ( mw.loader.getState( moduleName ) !== 'ready' ) {
-                               return null;
-                       }
-
-                       if ( !module.style && !module.script ) {
-                               return null;
-                       }
-
-                       // Tally CSS
-                       if ( module.style && $.isArray( module.style.css ) ) {
-                               $.each( module.style.css, function ( i, stylesheet ) {
-                                       payload += $.byteLength( stylesheet );
-                               } );
-                       }
-
-                       // Tally JavaScript
-                       if ( $.isFunction( module.script ) ) {
-                               payload += $.byteLength( module.script.toString() );
-                       }
-
-                       return payload;
-               },
-
-               /**
-                * Given CSS source, count both the total number of selectors it
-                * contains and the number which match some element in the current
-                * document.
-                *
-                * @param {string} css CSS source
-                * @return Selector counts
-                * @return {number} return.selectors Total number of selectors
-                * @return {number} return.matched Number of matched selectors
-                */
-               auditSelectors: function ( css ) {
-                       var selectors = { total: 0, matched: 0 },
-                               style = document.createElement( 'style' ),
-                               sheet, rules;
-
-                       style.textContent = css;
-                       document.body.appendChild( style );
-                       // Standards-compliant browsers use .sheet.cssRules, IE8 uses .styleSheet.rules…
-                       sheet = style.sheet || style.styleSheet;
-                       rules = sheet.cssRules || sheet.rules;
-                       $.each( rules, function ( index, rule ) {
-                               selectors.total++;
-                               if ( document.querySelector( rule.selectorText ) !== null ) {
-                                       selectors.matched++;
-                               }
-                       } );
-                       document.body.removeChild( style );
-                       return selectors;
-               },
-
-               /**
-                * Get a list of all loaded ResourceLoader modules.
-                *
-                * @return {Array} List of module names
-                */
-               getLoadedModules: function () {
-                       return $.grep( mw.loader.getModuleNames(), function ( module ) {
-                               return mw.loader.getState( module ) === 'ready';
-                       } );
-               },
-
-               /**
-                * Print tabular data to the console, using console.table, console.log,
-                * or mw.log (in declining order of preference).
-                *
-                * @param {Array} data Tabular data represented as an array of objects
-                *  with common properties.
-                */
-               dumpTable: function ( data ) {
-                       try {
-                               // Bartosz made me put this here.
-                               if ( window.opera ) { throw window.opera; }
-                               // Use Function.prototype#call to force an exception on Firefox,
-                               // which doesn't define console#table but doesn't complain if you
-                               // try to invoke it.
-                               console.table.call( console, data );
-                               return;
-                       } catch ( e ) {}
-                       try {
-                               console.log( $.toJSON( data, null, 2 ) );
-                               return;
-                       } catch ( e ) {}
-                       mw.log( data );
-               },
-
-               /**
-                * Generate and print one more reports. When invoked with no arguments,
-                * print all reports.
-                *
-                * @param {string...} [reports] Report names to run, or unset to print
-                *  all available reports.
-                */
-               runReports: function () {
-                       var reports = arguments.length > 0 ?
-                               Array.prototype.slice.call( arguments ) :
-                               $.map( inspect.reports, function ( v, k ) { return k; } );
-
-                       $.each( reports, function ( index, name ) {
-                               inspect.dumpTable( inspect.reports[name]() );
-                       } );
-               },
-
-               /**
-                * @class mw.inspect.reports
-                * @singleton
-                */
-               reports: {
-                       /**
-                        * Generate a breakdown of all loaded modules and their size in
-                        * kilobytes. Modules are ordered from largest to smallest.
-                        */
-                       size: function () {
-                               // Map each module to a descriptor object.
-                               var modules = $.map( inspect.getLoadedModules(), function ( module ) {
-                                       return {
-                                               name: module,
-                                               size: inspect.getModuleSize( module )
-                                       };
-                               } );
-
-                               // Sort module descriptors by size, largest first.
-                               sortByProperty( modules, 'size', true );
-
-                               // Convert size to human-readable string.
-                               $.each( modules, function ( i, module ) {
-                                       module.size = humanSize( module.size );
-                               } );
-
-                               return modules;
-                       },
-
-                       /**
-                        * For each module with styles, count the number of selectors, and
-                        * count how many match against some element currently in the DOM.
-                        */
-                       css: function () {
-                               var modules = [];
-
-                               $.each( inspect.getLoadedModules(), function ( index, name ) {
-                                       var css, stats, module = mw.loader.moduleRegistry[name];
-
-                                       try {
-                                               css = module.style.css.join();
-                                       } catch ( e ) { return; } // skip
-
-                                       stats = inspect.auditSelectors( css );
-                                       modules.push( {
-                                               module: name,
-                                               allSelectors: stats.total,
-                                               matchedSelectors: stats.matched,
-                                               percentMatched: stats.total !== 0 ?
-                                                       ( stats.matched / stats.total * 100 ).toFixed( 2 )  + '%' : null
-                                       } );
-                               } );
-                               sortByProperty( modules, 'allSelectors', true );
-                               return modules;
-                       },
-
-                       /**
-                        * Report stats on mw.loader.store: the number of localStorage
-                        * cache hits and misses, the number of items purged from the
-                        * cache, and the total size of the module blob in localStorage.
-                        */
-                       store: function () {
-                               var raw, stats = { enabled: mw.loader.store.enabled };
-                               if ( stats.enabled ) {
-                                       $.extend( stats, mw.loader.store.stats );
-                                       try {
-                                               raw = localStorage.getItem( mw.loader.store.getStoreKey() );
-                                               stats.totalSize = humanSize( $.byteLength( raw ) );
-                                       } catch ( e ) {}
-                               }
-                               return [stats];
-                       }
-               },
-
-               /**
-                * Perform a substring search across the JavaScript and CSS source code
-                * of all loaded modules and return an array of the names of the
-                * modules that matched.
-                *
-                * @param {string|RegExp} pattern String or regexp to match.
-                * @return {Array} Array of the names of modules that matched.
-                */
-               grep: function ( pattern ) {
-                       if ( typeof pattern.test !== 'function' ) {
-                               // Based on Y.Escape.regex from YUI v3.15.0
-                               pattern = new RegExp( pattern.replace( /[\-$\^*()+\[\]{}|\\,.?\s]/g, '\\$&' ), 'g' );
-                       }
-
-                       return $.grep( inspect.getLoadedModules(), function ( moduleName ) {
-                               var module = mw.loader.moduleRegistry[moduleName];
-
-                               // Grep module's JavaScript
-                               if ( $.isFunction( module.script ) && pattern.test( module.script.toString() ) ) {
-                                       return true;
-                               }
-
-                               // Grep module's CSS
-                               if (
-                                       $.isPlainObject( module.style ) && $.isArray( module.style.css )
-                                       && pattern.test( module.style.css.join( '' ) )
-                               ) {
-                                       // Module's CSS source matches
-                                       return true;
-                               }
-
-                               return false;
-                       } );
-               }
-       };
-
-       if ( mw.config.get( 'debug' ) ) {
-               mw.log( 'mw.inspect: reports are not available in debug mode.' );
-       }
-
-       mw.inspect = inspect;
-
-}( mediaWiki, jQuery ) );
diff --git a/resources/mediawiki/mediawiki.jqueryMsg.js b/resources/mediawiki/mediawiki.jqueryMsg.js
deleted file mode 100644 (file)
index 3a6869e..0000000
+++ /dev/null
@@ -1,1237 +0,0 @@
-/*!
-* Experimental advanced wikitext parser-emitter.
-* See: https://www.mediawiki.org/wiki/Extension:UploadWizard/MessageParser for docs
-*
-* @author neilk@wikimedia.org
-* @author mflaschen@wikimedia.org
-*/
-( function ( mw, $ ) {
-       /**
-        * @class mw.jqueryMsg
-        * @singleton
-        */
-
-       var oldParser,
-               slice = Array.prototype.slice,
-               parserDefaults = {
-                       magic: {
-                               'SITENAME': mw.config.get( 'wgSiteName' )
-                       },
-                       // This is a whitelist based on, but simpler than, Sanitizer.php.
-                       // Self-closing tags are not currently supported.
-                       allowedHtmlElements: [
-                               'b',
-                               'i'
-                       ],
-                       // Key tag name, value allowed attributes for that tag.
-                       // See Sanitizer::setupAttributeWhitelist
-                       allowedHtmlCommonAttributes: [
-                               // HTML
-                               'id',
-                               'class',
-                               'style',
-                               'lang',
-                               'dir',
-                               'title',
-
-                               // WAI-ARIA
-                               'role'
-                       ],
-
-                       // Attributes allowed for specific elements.
-                       // Key is element name in lower case
-                       // Value is array of allowed attributes for that element
-                       allowedHtmlAttributesByElement: {},
-                       messages: mw.messages,
-                       language: mw.language,
-
-                       // Same meaning as in mediawiki.js.
-                       //
-                       // Only 'text', 'parse', and 'escaped' are supported, and the
-                       // actual escaping for 'escaped' is done by other code (generally
-                       // through mediawiki.js).
-                       //
-                       // However, note that this default only
-                       // applies to direct calls to jqueryMsg. The default for mediawiki.js itself
-                       // is 'text', including when it uses jqueryMsg.
-                       format: 'parse'
-
-               };
-
-       /**
-        * Wrapper around jQuery append that converts all non-objects to TextNode so append will not
-        * convert what it detects as an htmlString to an element.
-        *
-        * Object elements of children (jQuery, HTMLElement, TextNode, etc.) will be left as is.
-        *
-        * @private
-        * @param {jQuery} $parent Parent node wrapped by jQuery
-        * @param {Object|string|Array} children What to append, with the same possible types as jQuery
-        * @return {jQuery} $parent
-        */
-       function appendWithoutParsing( $parent, children ) {
-               var i, len;
-
-               if ( !$.isArray( children ) ) {
-                       children = [children];
-               }
-
-               for ( i = 0, len = children.length; i < len; i++ ) {
-                       if ( typeof children[i] !== 'object' ) {
-                               children[i] = document.createTextNode( children[i] );
-                       }
-               }
-
-               return $parent.append( children );
-       }
-
-       /**
-        * Decodes the main HTML entities, those encoded by mw.html.escape.
-        *
-        * @private
-        * @param {string} encoded Encoded string
-        * @return {string} String with those entities decoded
-        */
-       function decodePrimaryHtmlEntities( encoded ) {
-               return encoded
-                       .replace( /&#039;/g, '\'' )
-                       .replace( /&quot;/g, '"' )
-                       .replace( /&lt;/g, '<' )
-                       .replace( /&gt;/g, '>' )
-                       .replace( /&amp;/g, '&' );
-       }
-
-       /**
-        * Given parser options, return a function that parses a key and replacements, returning jQuery object
-        *
-        * Try to parse a key and optional replacements, returning a jQuery object that may be a tree of jQuery nodes.
-        * If there was an error parsing, return the key and the error message (wrapped in jQuery). This should put the error right into
-        * the interface, without causing the page to halt script execution, and it hopefully should be clearer how to fix it.
-        * @private
-        * @param {Object} options Parser options
-        * @return {Function}
-        * @return {Array} return.args First element is the key, replacements may be in array in 2nd element, or remaining elements.
-        * @return {jQuery} return.return
-        */
-       function getFailableParserFn( options ) {
-               var parser = new mw.jqueryMsg.parser( options );
-
-               return function ( args ) {
-                       var key = args[0],
-                               argsArray = $.isArray( args[1] ) ? args[1] : slice.call( args, 1 );
-                       try {
-                               return parser.parse( key, argsArray );
-                       } catch ( e ) {
-                               return $( '<span>' ).text( key + ': ' + e.message );
-                       }
-               };
-       }
-
-       mw.jqueryMsg = {};
-
-       /**
-        * Returns a function suitable for use as a global, to construct strings from the message key (and optional replacements).
-        * e.g.
-        *
-        *       window.gM = mediaWiki.parser.getMessageFunction( options );
-        *       $( 'p#headline' ).html( gM( 'hello-user', username ) );
-        *
-        * Like the old gM() function this returns only strings, so it destroys any bindings. If you want to preserve bindings use the
-        * jQuery plugin version instead. This is only included for backwards compatibility with gM().
-        *
-        * N.B. replacements are variadic arguments or an array in second parameter. In other words:
-        *    somefunction( a, b, c, d )
-        * is equivalent to
-        *    somefunction( a, [b, c, d] )
-        *
-        * @param {Object} options parser options
-        * @return {Function} Function suitable for assigning to window.gM
-        * @return {string} return.key Message key.
-        * @return {Array|Mixed} return.replacements Optional variable replacements (variadically or an array).
-        * @return {string} return.return Rendered HTML.
-        */
-       mw.jqueryMsg.getMessageFunction = function ( options ) {
-               var failableParserFn = getFailableParserFn( options ),
-                       format;
-
-               if ( options && options.format !== undefined ) {
-                       format = options.format;
-               } else {
-                       format = parserDefaults.format;
-               }
-
-               return function () {
-                       var failableResult = failableParserFn( arguments );
-                       if ( format === 'text' || format === 'escaped' ) {
-                               return failableResult.text();
-                       } else {
-                               return failableResult.html();
-                       }
-               };
-       };
-
-       /**
-        * Returns a jQuery plugin which parses the message in the message key, doing replacements optionally, and appends the nodes to
-        * the current selector. Bindings to passed-in jquery elements are preserved. Functions become click handlers for [$1 linktext] links.
-        * e.g.
-        *
-        *        $.fn.msg = mediaWiki.parser.getJqueryPlugin( options );
-        *        var userlink = $( '<a>' ).click( function () { alert( "hello!!" ) } );
-        *        $( 'p#headline' ).msg( 'hello-user', userlink );
-        *
-        * N.B. replacements are variadic arguments or an array in second parameter. In other words:
-        *    somefunction( a, b, c, d )
-        * is equivalent to
-        *    somefunction( a, [b, c, d] )
-        *
-        * We append to 'this', which in a jQuery plugin context will be the selected elements.
-        *
-        * @param {Object} options Parser options
-        * @return {Function} Function suitable for assigning to jQuery plugin, such as jQuery#msg
-        * @return {string} return.key Message key.
-        * @return {Array|Mixed} return.replacements Optional variable replacements (variadically or an array).
-        * @return {jQuery} return.return
-        */
-       mw.jqueryMsg.getPlugin = function ( options ) {
-               var failableParserFn = getFailableParserFn( options );
-
-               return function () {
-                       var $target = this.empty();
-                       // TODO: Simply appendWithoutParsing( $target, failableParserFn( arguments ).contents() )
-                       // or Simply appendWithoutParsing( $target, failableParserFn( arguments ) )
-                       $.each( failableParserFn( arguments ).contents(), function ( i, node ) {
-                               appendWithoutParsing( $target, node );
-                       } );
-                       return $target;
-               };
-       };
-
-       /**
-        * The parser itself.
-        * Describes an object, whose primary duty is to .parse() message keys.
-        *
-        * @class
-        * @private
-        * @param {Object} options
-        */
-       mw.jqueryMsg.parser = function ( options ) {
-               this.settings = $.extend( {}, parserDefaults, options );
-               this.settings.onlyCurlyBraceTransform = ( this.settings.format === 'text' || this.settings.format === 'escaped' );
-
-               this.emitter = new mw.jqueryMsg.htmlEmitter( this.settings.language, this.settings.magic );
-       };
-
-       mw.jqueryMsg.parser.prototype = {
-               /**
-                * Cache mapping MediaWiki message keys and the value onlyCurlyBraceTransform, to the AST of the message.
-                *
-                * In most cases, the message is a string so this is identical.
-                * (This is why we would like to move this functionality server-side).
-                *
-                * The two parts of the key are separated by colon.  For example:
-                *
-                *     "message-key:true": ast
-                *
-                * if they key is "message-key" and onlyCurlyBraceTransform is true.
-                *
-                * This cache is shared by all instances of mw.jqueryMsg.parser.
-                *
-                * NOTE: We promise, it's static - when you create this empty object
-                * in the prototype, each new instance of the class gets a reference
-                * to the same object.
-                *
-                * @static
-                * @property {Object}
-                */
-               astCache: {},
-
-               /**
-                * Where the magic happens.
-                * Parses a message from the key, and swaps in replacements as necessary, wraps in jQuery
-                * If an error is thrown, returns original key, and logs the error
-                * @param {string} key Message key.
-                * @param {Array} replacements Variable replacements for $1, $2... $n
-                * @return {jQuery}
-                */
-               parse: function ( key, replacements ) {
-                       return this.emitter.emit( this.getAst( key ), replacements );
-               },
-
-               /**
-                * Fetch the message string associated with a key, return parsed structure. Memoized.
-                * Note that we pass '[' + key + ']' back for a missing message here.
-                * @param {string} key
-                * @return {string|Array} string of '[key]' if message missing, simple string if possible, array of arrays if needs parsing
-                */
-               getAst: function ( key ) {
-                       var cacheKey = [key, this.settings.onlyCurlyBraceTransform].join( ':' ), wikiText;
-
-                       if ( this.astCache[ cacheKey ] === undefined ) {
-                               wikiText = this.settings.messages.get( key );
-                               if ( typeof wikiText !== 'string' ) {
-                                       wikiText = '\\[' + key + '\\]';
-                               }
-                               this.astCache[ cacheKey ] = this.wikiTextToAst( wikiText );
-                       }
-                       return this.astCache[ cacheKey ];
-               },
-
-               /**
-                * Parses the input wikiText into an abstract syntax tree, essentially an s-expression.
-                *
-                * CAVEAT: This does not parse all wikitext. It could be more efficient, but it's pretty good already.
-                * n.b. We want to move this functionality to the server. Nothing here is required to be on the client.
-                *
-                * @param {string} input Message string wikitext
-                * @throws Error
-                * @return {Mixed} abstract syntax tree
-                */
-               wikiTextToAst: function ( input ) {
-                       var pos, settings = this.settings, concat = Array.prototype.concat,
-                               regularLiteral, regularLiteralWithoutBar, regularLiteralWithoutSpace, regularLiteralWithSquareBrackets,
-                               doubleQuote, singleQuote, backslash, anyCharacter, asciiAlphabetLiteral,
-                               escapedOrLiteralWithoutSpace, escapedOrLiteralWithoutBar, escapedOrRegularLiteral,
-                               whitespace, dollar, digits, htmlDoubleQuoteAttributeValue, htmlSingleQuoteAttributeValue,
-                               htmlAttributeEquals, openHtmlStartTag, optionalForwardSlash, openHtmlEndTag, closeHtmlTag,
-                               openExtlink, closeExtlink, wikilinkPage, wikilinkContents, openWikilink, closeWikilink, templateName, pipe, colon,
-                               templateContents, openTemplate, closeTemplate,
-                               nonWhitespaceExpression, paramExpression, expression, curlyBraceTransformExpression, result;
-
-                       // Indicates current position in input as we parse through it.
-                       // Shared among all parsing functions below.
-                       pos = 0;
-
-                       // =========================================================
-                       // parsing combinators - could be a library on its own
-                       // =========================================================
-
-                       /**
-                        * Try parsers until one works, if none work return null
-                        * @private
-                        * @param {Function[]} ps
-                        * @return {string|null}
-                        */
-                       function choice( ps ) {
-                               return function () {
-                                       var i, result;
-                                       for ( i = 0; i < ps.length; i++ ) {
-                                               result = ps[i]();
-                                               if ( result !== null ) {
-                                                        return result;
-                                               }
-                                       }
-                                       return null;
-                               };
-                       }
-
-                       /**
-                        * Try several ps in a row, all must succeed or return null.
-                        * This is the only eager one.
-                        * @private
-                        * @param {Function[]} ps
-                        * @return {string|null}
-                        */
-                       function sequence( ps ) {
-                               var i, res,
-                                       originalPos = pos,
-                                       result = [];
-                               for ( i = 0; i < ps.length; i++ ) {
-                                       res = ps[i]();
-                                       if ( res === null ) {
-                                               pos = originalPos;
-                                               return null;
-                                       }
-                                       result.push( res );
-                               }
-                               return result;
-                       }
-
-                       /**
-                        * Run the same parser over and over until it fails.
-                        * Must succeed a minimum of n times or return null.
-                        * @private
-                        * @param {number} n
-                        * @param {Function} p
-                        * @return {string|null}
-                        */
-                       function nOrMore( n, p ) {
-                               return function () {
-                                       var originalPos = pos,
-                                               result = [],
-                                               parsed = p();
-                                       while ( parsed !== null ) {
-                                               result.push( parsed );
-                                               parsed = p();
-                                       }
-                                       if ( result.length < n ) {
-                                               pos = originalPos;
-                                               return null;
-                                       }
-                                       return result;
-                               };
-                       }
-
-                       /**
-                        * There is a general pattern -- parse a thing, if that worked, apply transform, otherwise return null.
-                        *
-                        * TODO: But using this as a combinator seems to cause problems when combined with #nOrMore().
-                        * May be some scoping issue
-                        *
-                        * @private
-                        * @param {Function} p
-                        * @param {Function} fn
-                        * @return {string|null}
-                        */
-                       function transform( p, fn ) {
-                               return function () {
-                                       var result = p();
-                                       return result === null ? null : fn( result );
-                               };
-                       }
-
-                       /**
-                        * Just make parsers out of simpler JS builtin types
-                        * @private
-                        * @param {string} s
-                        * @return {Function}
-                        * @return {string} return.return
-                        */
-                       function makeStringParser( s ) {
-                               var len = s.length;
-                               return function () {
-                                       var result = null;
-                                       if ( input.substr( pos, len ) === s ) {
-                                                result = s;
-                                                pos += len;
-                                       }
-                                       return result;
-                               };
-                       }
-
-                       /**
-                        * Makes a regex parser, given a RegExp object.
-                        * The regex being passed in should start with a ^ to anchor it to the start
-                        * of the string.
-                        *
-                        * @private
-                        * @param {RegExp} regex anchored regex
-                        * @return {Function} function to parse input based on the regex
-                        */
-                       function makeRegexParser( regex ) {
-                               return function () {
-                                       var matches = input.substr( pos ).match( regex );
-                                       if ( matches === null ) {
-                                               return null;
-                                       }
-                                       pos += matches[0].length;
-                                       return matches[0];
-                               };
-                       }
-
-                       // ===================================================================
-                       // General patterns above this line -- wikitext specific parsers below
-                       // ===================================================================
-
-                       // Parsing functions follow. All parsing functions work like this:
-                       // They don't accept any arguments.
-                       // Instead, they just operate non destructively on the string 'input'
-                       // As they can consume parts of the string, they advance the shared variable pos,
-                       // and return tokens (or whatever else they want to return).
-                       // some things are defined as closures and other things as ordinary functions
-                       // converting everything to a closure makes it a lot harder to debug... errors pop up
-                       // but some debuggers can't tell you exactly where they come from. Also the mutually
-                       // recursive functions seem not to work in all browsers then. (Tested IE6-7, Opera, Safari, FF)
-                       // This may be because, to save code, memoization was removed
-
-                       regularLiteral = makeRegexParser( /^[^{}\[\]$<\\]/ );
-                       regularLiteralWithoutBar = makeRegexParser( /^[^{}\[\]$\\|]/ );
-                       regularLiteralWithoutSpace = makeRegexParser( /^[^{}\[\]$\s]/ );
-                       regularLiteralWithSquareBrackets = makeRegexParser( /^[^{}$\\]/ );
-
-                       backslash = makeStringParser( '\\' );
-                       doubleQuote = makeStringParser( '"' );
-                       singleQuote = makeStringParser( '\'' );
-                       anyCharacter = makeRegexParser( /^./ );
-
-                       openHtmlStartTag = makeStringParser( '<' );
-                       optionalForwardSlash = makeRegexParser( /^\/?/ );
-                       openHtmlEndTag = makeStringParser( '</' );
-                       htmlAttributeEquals = makeRegexParser( /^\s*=\s*/ );
-                       closeHtmlTag = makeRegexParser( /^\s*>/ );
-
-                       function escapedLiteral() {
-                               var result = sequence( [
-                                       backslash,
-                                       anyCharacter
-                               ] );
-                               return result === null ? null : result[1];
-                       }
-                       escapedOrLiteralWithoutSpace = choice( [
-                               escapedLiteral,
-                               regularLiteralWithoutSpace
-                       ] );
-                       escapedOrLiteralWithoutBar = choice( [
-                               escapedLiteral,
-                               regularLiteralWithoutBar
-                       ] );
-                       escapedOrRegularLiteral = choice( [
-                               escapedLiteral,
-                               regularLiteral
-                       ] );
-                       // Used to define "literals" without spaces, in space-delimited situations
-                       function literalWithoutSpace() {
-                               var result = nOrMore( 1, escapedOrLiteralWithoutSpace )();
-                               return result === null ? null : result.join( '' );
-                       }
-                       // Used to define "literals" within template parameters. The pipe character is the parameter delimeter, so by default
-                       // it is not a literal in the parameter
-                       function literalWithoutBar() {
-                               var result = nOrMore( 1, escapedOrLiteralWithoutBar )();
-                               return result === null ? null : result.join( '' );
-                       }
-
-                       // Used for wikilink page names.  Like literalWithoutBar, but
-                       // without allowing escapes.
-                       function unescapedLiteralWithoutBar() {
-                               var result = nOrMore( 1, regularLiteralWithoutBar )();
-                               return result === null ? null : result.join( '' );
-                       }
-
-                       function literal() {
-                               var result = nOrMore( 1, escapedOrRegularLiteral )();
-                               return result === null ? null : result.join( '' );
-                       }
-
-                       function curlyBraceTransformExpressionLiteral() {
-                               var result = nOrMore( 1, regularLiteralWithSquareBrackets )();
-                               return result === null ? null : result.join( '' );
-                       }
-
-                       asciiAlphabetLiteral = makeRegexParser( /[A-Za-z]+/ );
-                       htmlDoubleQuoteAttributeValue = makeRegexParser( /^[^"]*/ );
-                       htmlSingleQuoteAttributeValue = makeRegexParser( /^[^']*/ );
-
-                       whitespace = makeRegexParser( /^\s+/ );
-                       dollar = makeStringParser( '$' );
-                       digits = makeRegexParser( /^\d+/ );
-
-                       function replacement() {
-                               var result = sequence( [
-                                       dollar,
-                                       digits
-                               ] );
-                               if ( result === null ) {
-                                       return null;
-                               }
-                               return [ 'REPLACE', parseInt( result[1], 10 ) - 1 ];
-                       }
-                       openExtlink = makeStringParser( '[' );
-                       closeExtlink = makeStringParser( ']' );
-                       // this extlink MUST have inner contents, e.g. [foo] not allowed; [foo bar] [foo <i>bar</i>], etc. are allowed
-                       function extlink() {
-                               var result, parsedResult;
-                               result = null;
-                               parsedResult = sequence( [
-                                       openExtlink,
-                                       nonWhitespaceExpression,
-                                       whitespace,
-                                       nOrMore( 1, expression ),
-                                       closeExtlink
-                               ] );
-                               if ( parsedResult !== null ) {
-                                       result = [ 'EXTLINK', parsedResult[1] ];
-                                       // TODO (mattflaschen, 2013-03-22): Clean this up if possible.
-                                       // It's avoiding CONCAT for single nodes, so they at least doesn't get the htmlEmitter span.
-                                       if ( parsedResult[3].length === 1 ) {
-                                               result.push( parsedResult[3][0] );
-                                       } else {
-                                               result.push( ['CONCAT'].concat( parsedResult[3] ) );
-                                       }
-                               }
-                               return result;
-                       }
-                       // this is the same as the above extlink, except that the url is being passed on as a parameter
-                       function extLinkParam() {
-                               var result = sequence( [
-                                       openExtlink,
-                                       dollar,
-                                       digits,
-                                       whitespace,
-                                       expression,
-                                       closeExtlink
-                               ] );
-                               if ( result === null ) {
-                                       return null;
-                               }
-                               return [ 'EXTLINKPARAM', parseInt( result[2], 10 ) - 1, result[4] ];
-                       }
-                       openWikilink = makeStringParser( '[[' );
-                       closeWikilink = makeStringParser( ']]' );
-                       pipe = makeStringParser( '|' );
-
-                       function template() {
-                               var result = sequence( [
-                                       openTemplate,
-                                       templateContents,
-                                       closeTemplate
-                               ] );
-                               return result === null ? null : result[1];
-                       }
-
-                       wikilinkPage = choice( [
-                               unescapedLiteralWithoutBar,
-                               template
-                       ] );
-
-                       function pipedWikilink() {
-                               var result = sequence( [
-                                       wikilinkPage,
-                                       pipe,
-                                       expression
-                               ] );
-                               return result === null ? null : [ result[0], result[2] ];
-                       }
-
-                       wikilinkContents = choice( [
-                               pipedWikilink,
-                               wikilinkPage // unpiped link
-                       ] );
-
-                       function wikilink() {
-                               var result, parsedResult, parsedLinkContents;
-                               result = null;
-
-                               parsedResult = sequence( [
-                                       openWikilink,
-                                       wikilinkContents,
-                                       closeWikilink
-                               ] );
-                               if ( parsedResult !== null ) {
-                                       parsedLinkContents = parsedResult[1];
-                                       result = [ 'WIKILINK' ].concat( parsedLinkContents );
-                               }
-                               return result;
-                       }
-
-                       // TODO: Support data- if appropriate
-                       function doubleQuotedHtmlAttributeValue() {
-                               var parsedResult = sequence( [
-                                       doubleQuote,
-                                       htmlDoubleQuoteAttributeValue,
-                                       doubleQuote
-                               ] );
-                               return parsedResult === null ? null : parsedResult[1];
-                       }
-
-                       function singleQuotedHtmlAttributeValue() {
-                               var parsedResult = sequence( [
-                                       singleQuote,
-                                       htmlSingleQuoteAttributeValue,
-                                       singleQuote
-                               ] );
-                               return parsedResult === null ? null : parsedResult[1];
-                       }
-
-                       function htmlAttribute() {
-                               var parsedResult = sequence( [
-                                       whitespace,
-                                       asciiAlphabetLiteral,
-                                       htmlAttributeEquals,
-                                       choice( [
-                                               doubleQuotedHtmlAttributeValue,
-                                               singleQuotedHtmlAttributeValue
-                                       ] )
-                               ] );
-                               return parsedResult === null ? null : [parsedResult[1], parsedResult[3]];
-                       }
-
-                       /**
-                        * Checks if HTML is allowed
-                        *
-                        * @param {string} startTagName HTML start tag name
-                        * @param {string} endTagName HTML start tag name
-                        * @param {Object} attributes array of consecutive key value pairs,
-                        *  with index 2 * n being a name and 2 * n + 1 the associated value
-                        * @return {boolean} true if this is HTML is allowed, false otherwise
-                        */
-                       function isAllowedHtml( startTagName, endTagName, attributes ) {
-                               var i, len, attributeName;
-
-                               startTagName = startTagName.toLowerCase();
-                               endTagName = endTagName.toLowerCase();
-                               if ( startTagName !== endTagName || $.inArray( startTagName, settings.allowedHtmlElements ) === -1 ) {
-                                       return false;
-                               }
-
-                               for ( i = 0, len = attributes.length; i < len; i += 2 ) {
-                                       attributeName = attributes[i];
-                                       if ( $.inArray( attributeName, settings.allowedHtmlCommonAttributes ) === -1 &&
-                                            $.inArray( attributeName, settings.allowedHtmlAttributesByElement[startTagName] || [] ) === -1 ) {
-                                               return false;
-                                       }
-                               }
-
-                               return true;
-                       }
-
-                       function htmlAttributes() {
-                               var parsedResult = nOrMore( 0, htmlAttribute )();
-                               // Un-nest attributes array due to structure of jQueryMsg operations (see emit).
-                               return concat.apply( ['HTMLATTRIBUTES'], parsedResult );
-                       }
-
-                       // Subset of allowed HTML markup.
-                       // Most elements and many attributes allowed on the server are not supported yet.
-                       function html() {
-                               var result = null, parsedOpenTagResult, parsedHtmlContents,
-                                       parsedCloseTagResult, wrappedAttributes, attributes,
-                                       startTagName, endTagName, startOpenTagPos, startCloseTagPos,
-                                       endOpenTagPos, endCloseTagPos;
-
-                               // Break into three sequence calls.  That should allow accurate reconstruction of the original HTML, and requiring an exact tag name match.
-                               // 1. open through closeHtmlTag
-                               // 2. expression
-                               // 3. openHtmlEnd through close
-                               // This will allow recording the positions to reconstruct if HTML is to be treated as text.
-
-                               startOpenTagPos = pos;
-                               parsedOpenTagResult = sequence( [
-                                       openHtmlStartTag,
-                                       asciiAlphabetLiteral,
-                                       htmlAttributes,
-                                       optionalForwardSlash,
-                                       closeHtmlTag
-                               ] );
-
-                               if ( parsedOpenTagResult === null ) {
-                                       return null;
-                               }
-
-                               endOpenTagPos = pos;
-                               startTagName = parsedOpenTagResult[1];
-
-                               parsedHtmlContents = nOrMore( 0, expression )();
-
-                               startCloseTagPos = pos;
-                               parsedCloseTagResult = sequence( [
-                                       openHtmlEndTag,
-                                       asciiAlphabetLiteral,
-                                       closeHtmlTag
-                               ] );
-
-                               if ( parsedCloseTagResult === null ) {
-                                       // Closing tag failed.  Return the start tag and contents.
-                                       return [ 'CONCAT', input.substring( startOpenTagPos, endOpenTagPos ) ]
-                                               .concat( parsedHtmlContents );
-                               }
-
-                               endCloseTagPos = pos;
-                               endTagName = parsedCloseTagResult[1];
-                               wrappedAttributes = parsedOpenTagResult[2];
-                               attributes = wrappedAttributes.slice( 1 );
-                               if ( isAllowedHtml( startTagName, endTagName, attributes ) ) {
-                                       result = [ 'HTMLELEMENT', startTagName, wrappedAttributes ]
-                                               .concat( parsedHtmlContents );
-                               } else {
-                                       // HTML is not allowed, so contents will remain how
-                                       // it was, while HTML markup at this level will be
-                                       // treated as text
-                                       // E.g. assuming script tags are not allowed:
-                                       //
-                                       // <script>[[Foo|bar]]</script>
-                                       //
-                                       // results in '&lt;script&gt;' and '&lt;/script&gt;'
-                                       // (not treated as an HTML tag), surrounding a fully
-                                       // parsed HTML link.
-                                       //
-                                       // Concatenate everything from the tag, flattening the contents.
-                                       result = [ 'CONCAT', input.substring( startOpenTagPos, endOpenTagPos ) ]
-                                               .concat( parsedHtmlContents, input.substring( startCloseTagPos, endCloseTagPos ) );
-                               }
-
-                               return result;
-                       }
-
-                       templateName = transform(
-                               // see $wgLegalTitleChars
-                               // not allowing : due to the need to catch "PLURAL:$1"
-                               makeRegexParser( /^[ !"$&'()*,.\/0-9;=?@A-Z\^_`a-z~\x80-\xFF+\-]+/ ),
-                               function ( result ) { return result.toString(); }
-                       );
-                       function templateParam() {
-                               var expr, result;
-                               result = sequence( [
-                                       pipe,
-                                       nOrMore( 0, paramExpression )
-                               ] );
-                               if ( result === null ) {
-                                       return null;
-                               }
-                               expr = result[1];
-                               // use a CONCAT operator if there are multiple nodes, otherwise return the first node, raw.
-                               return expr.length > 1 ? [ 'CONCAT' ].concat( expr ) : expr[0];
-                       }
-
-                       function templateWithReplacement() {
-                               var result = sequence( [
-                                       templateName,
-                                       colon,
-                                       replacement
-                               ] );
-                               return result === null ? null : [ result[0], result[2] ];
-                       }
-                       function templateWithOutReplacement() {
-                               var result = sequence( [
-                                       templateName,
-                                       colon,
-                                       paramExpression
-                               ] );
-                               return result === null ? null : [ result[0], result[2] ];
-                       }
-                       function templateWithOutFirstParameter() {
-                               var result = sequence( [
-                                       templateName,
-                                       colon
-                               ] );
-                               return result === null ? null : [ result[0], '' ];
-                       }
-                       colon = makeStringParser( ':' );
-                       templateContents = choice( [
-                               function () {
-                                       var res = sequence( [
-                                               // templates can have placeholders for dynamic replacement eg: {{PLURAL:$1|one car|$1 cars}}
-                                               // or no placeholders eg: {{GRAMMAR:genitive|{{SITENAME}}}
-                                               choice( [ templateWithReplacement, templateWithOutReplacement, templateWithOutFirstParameter ] ),
-                                               nOrMore( 0, templateParam )
-                                       ] );
-                                       return res === null ? null : res[0].concat( res[1] );
-                               },
-                               function () {
-                                       var res = sequence( [
-                                               templateName,
-                                               nOrMore( 0, templateParam )
-                                       ] );
-                                       if ( res === null ) {
-                                               return null;
-                                       }
-                                       return [ res[0] ].concat( res[1] );
-                               }
-                       ] );
-                       openTemplate = makeStringParser( '{{' );
-                       closeTemplate = makeStringParser( '}}' );
-                       nonWhitespaceExpression = choice( [
-                               template,
-                               wikilink,
-                               extLinkParam,
-                               extlink,
-                               replacement,
-                               literalWithoutSpace
-                       ] );
-                       paramExpression = choice( [
-                               template,
-                               wikilink,
-                               extLinkParam,
-                               extlink,
-                               replacement,
-                               literalWithoutBar
-                       ] );
-
-                       expression = choice( [
-                               template,
-                               wikilink,
-                               extLinkParam,
-                               extlink,
-                               replacement,
-                               html,
-                               literal
-                       ] );
-
-                       // Used when only {{-transformation is wanted, for 'text'
-                       // or 'escaped' formats
-                       curlyBraceTransformExpression = choice( [
-                               template,
-                               replacement,
-                               curlyBraceTransformExpressionLiteral
-                       ] );
-
-                       /**
-                        * Starts the parse
-                        *
-                        * @param {Function} rootExpression root parse function
-                        */
-                       function start( rootExpression ) {
-                               var result = nOrMore( 0, rootExpression )();
-                               if ( result === null ) {
-                                       return null;
-                               }
-                               return [ 'CONCAT' ].concat( result );
-                       }
-                       // everything above this point is supposed to be stateless/static, but
-                       // I am deferring the work of turning it into prototypes & objects. It's quite fast enough
-                       // finally let's do some actual work...
-
-                       // If you add another possible rootExpression, you must update the astCache key scheme.
-                       result = start( this.settings.onlyCurlyBraceTransform ? curlyBraceTransformExpression : expression );
-
-                       /*
-                        * For success, the p must have gotten to the end of the input
-                        * and returned a non-null.
-                        * n.b. This is part of language infrastructure, so we do not throw an internationalizable message.
-                        */
-                       if ( result === null || pos !== input.length ) {
-                               throw new Error( 'Parse error at position ' + pos.toString() + ' in input: ' + input );
-                       }
-                       return result;
-               }
-
-       };
-
-       /**
-        * htmlEmitter - object which primarily exists to emit HTML from parser ASTs
-        */
-       mw.jqueryMsg.htmlEmitter = function ( language, magic ) {
-               this.language = language;
-               var jmsg = this;
-               $.each( magic, function ( key, val ) {
-                       jmsg[ key.toLowerCase() ] = function () {
-                               return val;
-                       };
-               } );
-
-               /**
-                * (We put this method definition here, and not in prototype, to make sure it's not overwritten by any magic.)
-                * Walk entire node structure, applying replacements and template functions when appropriate
-                * @param {Mixed} node Abstract syntax tree (top node or subnode)
-                * @param {Array} replacements for $1, $2, ... $n
-                * @return {Mixed} single-string node or array of nodes suitable for jQuery appending
-                */
-               this.emit = function ( node, replacements ) {
-                       var ret, subnodes, operation,
-                               jmsg = this;
-                       switch ( typeof node ) {
-                               case 'string':
-                               case 'number':
-                                       ret = node;
-                                       break;
-                               // typeof returns object for arrays
-                               case 'object':
-                                       // node is an array of nodes
-                                       subnodes = $.map( node.slice( 1 ), function ( n ) {
-                                               return jmsg.emit( n, replacements );
-                                       } );
-                                       operation = node[0].toLowerCase();
-                                       if ( typeof jmsg[operation] === 'function' ) {
-                                               ret = jmsg[ operation ]( subnodes, replacements );
-                                       } else {
-                                               throw new Error( 'Unknown operation "' + operation + '"' );
-                                       }
-                                       break;
-                               case 'undefined':
-                                       // Parsing the empty string (as an entire expression, or as a paramExpression in a template) results in undefined
-                                       // Perhaps a more clever parser can detect this, and return the empty string? Or is that useful information?
-                                       // The logical thing is probably to return the empty string here when we encounter undefined.
-                                       ret = '';
-                                       break;
-                               default:
-                                       throw new Error( 'Unexpected type in AST: ' + typeof node );
-                       }
-                       return ret;
-               };
-       };
-
-       // For everything in input that follows double-open-curly braces, there should be an equivalent parser
-       // function. For instance {{PLURAL ... }} will be processed by 'plural'.
-       // If you have 'magic words' then configure the parser to have them upon creation.
-       //
-       // An emitter method takes the parent node, the array of subnodes and the array of replacements (the values that $1, $2... should translate to).
-       // Note: all such functions must be pure, with the exception of referring to other pure functions via this.language (convertPlural and so on)
-       mw.jqueryMsg.htmlEmitter.prototype = {
-               /**
-                * Parsing has been applied depth-first we can assume that all nodes here are single nodes
-                * Must return a single node to parents -- a jQuery with synthetic span
-                * However, unwrap any other synthetic spans in our children and pass them upwards
-                * @param {Mixed[]} nodes Some single nodes, some arrays of nodes
-                * @return {jQuery}
-                */
-               concat: function ( nodes ) {
-                       var $span = $( '<span>' ).addClass( 'mediaWiki_htmlEmitter' );
-                       $.each( nodes, function ( i, node ) {
-                               if ( node instanceof jQuery && node.hasClass( 'mediaWiki_htmlEmitter' ) ) {
-                                       $.each( node.contents(), function ( j, childNode ) {
-                                               appendWithoutParsing( $span, childNode );
-                                       } );
-                               } else {
-                                       // Let jQuery append nodes, arrays of nodes and jQuery objects
-                                       // other things (strings, numbers, ..) are appended as text nodes (not as HTML strings)
-                                       appendWithoutParsing( $span, node );
-                               }
-                       } );
-                       return $span;
-               },
-
-               /**
-                * Return escaped replacement of correct index, or string if unavailable.
-                * Note that we expect the parsed parameter to be zero-based. i.e. $1 should have become [ 0 ].
-                * if the specified parameter is not found return the same string
-                * (e.g. "$99" -> parameter 98 -> not found -> return "$99" )
-                *
-                * TODO: Throw error if nodes.length > 1 ?
-                *
-                * @param {Array} nodes List of one element, integer, n >= 0
-                * @param {Array} replacements List of at least n strings
-                * @return {String} replacement
-                */
-               replace: function ( nodes, replacements ) {
-                       var index = parseInt( nodes[0], 10 );
-
-                       if ( index < replacements.length ) {
-                               return replacements[index];
-                       } else {
-                               // index not found, fallback to displaying variable
-                               return '$' + ( index + 1 );
-                       }
-               },
-
-               /**
-                * Transform wiki-link
-                *
-                * TODO:
-                * It only handles basic cases, either no pipe, or a pipe with an explicit
-                * anchor.
-                *
-                * It does not attempt to handle features like the pipe trick.
-                * However, the pipe trick should usually not be present in wikitext retrieved
-                * from the server, since the replacement is done at save time.
-                * It may, though, if the wikitext appears in extension-controlled content.
-                *
-                * @param nodes
-                */
-               wikilink: function ( nodes ) {
-                       var page, anchor, url;
-
-                       page = nodes[0];
-                       url = mw.util.getUrl( page );
-
-                       // [[Some Page]] or [[Namespace:Some Page]]
-                       if ( nodes.length === 1 ) {
-                               anchor = page;
-                       }
-
-                       /*
-                        * [[Some Page|anchor text]] or
-                        * [[Namespace:Some Page|anchor]
-                        */
-                       else {
-                               anchor = nodes[1];
-                       }
-
-                       return $( '<a>' ).attr( {
-                               title: page,
-                               href: url
-                       } ).text( anchor );
-               },
-
-               /**
-                * Converts array of HTML element key value pairs to object
-                *
-                * @param {Array} nodes Array of consecutive key value pairs, with index 2 * n being a
-                *  name and 2 * n + 1 the associated value
-                * @return {Object} Object mapping attribute name to attribute value
-                */
-               htmlattributes: function ( nodes ) {
-                       var i, len, mapping = {};
-                       for ( i = 0, len = nodes.length; i < len; i += 2 ) {
-                               mapping[nodes[i]] = decodePrimaryHtmlEntities( nodes[i + 1] );
-                       }
-                       return mapping;
-               },
-
-               /**
-                * Handles an (already-validated) HTML element.
-                *
-                * @param {Array} nodes Nodes to process when creating element
-                * @return {jQuery|Array} jQuery node for valid HTML or array for disallowed element
-                */
-               htmlelement: function ( nodes ) {
-                       var tagName, attributes, contents, $element;
-
-                       tagName = nodes.shift();
-                       attributes = nodes.shift();
-                       contents = nodes;
-                       $element = $( document.createElement( tagName ) ).attr( attributes );
-                       return appendWithoutParsing( $element, contents );
-               },
-
-               /**
-                * Transform parsed structure into external link
-                * If the href is a jQuery object, treat it as "enclosing" the link text.
-                *
-                * - ... function, treat it as the click handler.
-                * - ... string, treat it as a URI.
-                *
-                * TODO: throw an error if nodes.length > 2 ?
-                *
-                * @param {Array} nodes List of two elements, {jQuery|Function|String} and {String}
-                * @return {jQuery}
-                */
-               extlink: function ( nodes ) {
-                       var $el,
-                               arg = nodes[0],
-                               contents = nodes[1];
-                       if ( arg instanceof jQuery ) {
-                               $el = arg;
-                       } else {
-                               $el = $( '<a>' );
-                               if ( typeof arg === 'function' ) {
-                                       $el.click( arg ).attr( 'href', '#' );
-                               } else {
-                                       $el.attr( 'href', arg.toString() );
-                               }
-                       }
-                       return appendWithoutParsing( $el, contents );
-               },
-
-               /**
-                * This is basically use a combination of replace + external link (link with parameter
-                * as url), but we don't want to run the regular replace here-on: inserting a
-                * url as href-attribute of a link will automatically escape it already, so
-                * we don't want replace to (manually) escape it as well.
-                *
-                * TODO: throw error if nodes.length > 1 ?
-                *
-                * @param {Array} nodes List of one element, integer, n >= 0
-                * @param {Array} replacements List of at least n strings
-                * @return {string} replacement
-                */
-               extlinkparam: function ( nodes, replacements ) {
-                       var replacement,
-                               index = parseInt( nodes[0], 10 );
-                       if ( index < replacements.length ) {
-                               replacement = replacements[index];
-                       } else {
-                               replacement = '$' + ( index + 1 );
-                       }
-                       return this.extlink( [ replacement, nodes[1] ] );
-               },
-
-               /**
-                * Transform parsed structure into pluralization
-                * n.b. The first node may be a non-integer (for instance, a string representing an Arabic number).
-                * So convert it back with the current language's convertNumber.
-                * @param {Array} nodes List of nodes, [ {string|number}, {string}, {string} ... ]
-                * @return {string} selected pluralized form according to current language
-                */
-               plural: function ( nodes ) {
-                       var forms, count;
-                       count = parseFloat( this.language.convertNumber( nodes[0], true ) );
-                       forms = nodes.slice( 1 );
-                       return forms.length ? this.language.convertPlural( count, forms ) : '';
-               },
-
-               /**
-                * Transform parsed structure according to gender.
-                *
-                * Usage: {{gender:[ mw.user object | '' | 'male' | 'female' | 'unknown' ] | masculine form | feminine form | neutral form}}.
-                *
-                * The first node must be one of:
-                * - the mw.user object (or a compatible one)
-                * - an empty string - indicating the current user, same effect as passing the mw.user object
-                * - a gender string ('male', 'female' or 'unknown')
-                *
-                * @param {Array} nodes List of nodes, [ {string|mw.user}, {string}, {string}, {string} ]
-                * @return {string} Selected gender form according to current language
-                */
-               gender: function ( nodes ) {
-                       var gender,
-                               maybeUser = nodes[0],
-                               forms = nodes.slice( 1 );
-
-                       if ( maybeUser === '' ) {
-                               maybeUser = mw.user;
-                       }
-
-                       // If we are passed a mw.user-like object, check their gender.
-                       // Otherwise, assume the gender string itself was passed .
-                       if ( maybeUser && maybeUser.options instanceof mw.Map ) {
-                               gender = maybeUser.options.get( 'gender' );
-                       } else {
-                               gender = maybeUser;
-                       }
-
-                       return this.language.gender( gender, forms );
-               },
-
-               /**
-                * Transform parsed structure into grammar conversion.
-                * Invoked by putting `{{grammar:form|word}}` in a message
-                * @param {Array} nodes List of nodes [{Grammar case eg: genitive}, {string word}]
-                * @return {string} selected grammatical form according to current language
-                */
-               grammar: function ( nodes ) {
-                       var form = nodes[0],
-                               word = nodes[1];
-                       return word && form && this.language.convertGrammar( word, form );
-               },
-
-               /**
-                * Tranform parsed structure into a int: (interface language) message include
-                * Invoked by putting `{{int:othermessage}}` into a message
-                * @param {Array} nodes List of nodes
-                * @return {string} Other message
-                */
-               int: function ( nodes ) {
-                       return mw.jqueryMsg.getMessageFunction()( nodes[0].toLowerCase() );
-               },
-
-               /**
-                * Takes an unformatted number (arab, no group separators and . as decimal separator)
-                * and outputs it in the localized digit script and formatted with decimal
-                * separator, according to the current language.
-                * @param {Array} nodes List of nodes
-                * @return {number|string} Formatted number
-                */
-               formatnum: function ( nodes ) {
-                       var isInteger = ( nodes[1] && nodes[1] === 'R' ) ? true : false,
-                               number = nodes[0];
-
-                       return this.language.convertNumber( number, isInteger );
-               }
-       };
-
-       // Deprecated! don't rely on gM existing.
-       // The window.gM ought not to be required - or if required, not required here.
-       // But moving it to extensions breaks it (?!)
-       // Need to fix plugin so it could do attributes as well, then will be okay to remove this.
-       // @deprecated since 1.23
-       mw.log.deprecate( window, 'gM', mw.jqueryMsg.getMessageFunction(), 'Use mw.message( ... ).parse() instead' );
-
-       /**
-        * @method
-        * @member jQuery
-        * @see mw.jqueryMsg#getPlugin
-        */
-       $.fn.msg = mw.jqueryMsg.getPlugin();
-
-       // Replace the default message parser with jqueryMsg
-       oldParser = mw.Message.prototype.parser;
-       mw.Message.prototype.parser = function () {
-               var messageFunction;
-
-               // TODO: should we cache the message function so we don't create a new one every time? Benchmark this maybe?
-               // Caching is somewhat problematic, because we do need different message functions for different maps, so
-               // we'd have to cache the parser as a member of this.map, which sounds a bit ugly.
-               // Do not use mw.jqueryMsg unless required
-               if ( this.format === 'plain' || !/\{\{|[\[<>]/.test( this.map.get( this.key ) ) ) {
-                       // Fall back to mw.msg's simple parser
-                       return oldParser.apply( this );
-               }
-
-               messageFunction = mw.jqueryMsg.getMessageFunction( {
-                       'messages': this.map,
-                       // For format 'escaped', escaping part is handled by mediawiki.js
-                       'format': this.format
-               } );
-               return messageFunction( this.key, this.parameters );
-       };
-
-}( mediaWiki, jQuery ) );
diff --git a/resources/mediawiki/mediawiki.jqueryMsg.peg b/resources/mediawiki/mediawiki.jqueryMsg.peg
deleted file mode 100644 (file)
index 716c326..0000000
+++ /dev/null
@@ -1,85 +0,0 @@
-/* PEG grammar for a subset of wikitext, useful in the MediaWiki frontend */
-
-start
-  = e:expression* { return e.length > 1 ? [ "CONCAT" ].concat(e) : e[0]; }
-
-expression
-  = template
-  / link
-  / extlink
-  / replacement
-  / literal
-
-paramExpression
-  = template
-  / link
-  / extlink
-  / replacement
-  / literalWithoutBar
-
-template
-  = "{{" t:templateContents "}}" { return t; }
-
-templateContents
-  = twr:templateWithReplacement p:templateParam* { return twr.concat(p) }
-  / twr:templateWithOutReplacement p:templateParam* { return twr.concat(p) }
-  / twr:templateWithOutFirstParameter p:templateParam* { return twr.concat(p) }
-  / t:templateName p:templateParam* { return p.length ? [ t, p ] : [ t ] }
-
-templateWithReplacement
-  = t:templateName ":" r:replacement { return [ t, r ] }
-
-templateWithOutReplacement
-  = t:templateName ":" p:paramExpression { return [ t, p ] }
-
-templateWithOutFirstParameter
-  = t:templateName ":" { return [ t, "" ] }
-
-templateParam
-  = "|" e:paramExpression* { return e.length > 1 ? [ "CONCAT" ].concat(e) : e[0]; }
-
-templateName
-  = tn:[A-Za-z_]+ { return tn.join('').toUpperCase() }
-
-/* TODO: Update to reflect separate piped and unpiped handling */
-link
-  = "[[" w:expression "]]" { return [ 'WLINK', w ]; }
-
-extlink
-  = "[" url:url whitespace text:expression "]" { return [ 'LINK', url, text ] }
-
-url
-  = url:[^ ]+ { return url.join(''); }
-
-whitespace
-  = [ ]+
-
-replacement
-  = '$' digits:digits { return [ 'REPLACE', parseInt( digits, 10 ) - 1 ] }
-
-digits
-  = [0-9]+
-
-literal
-  = lit:escapedOrRegularLiteral+ { return lit.join(''); }
-
-literalWithoutBar
-  = lit:escapedOrLiteralWithoutBar+ { return lit.join(''); }
-
-escapedOrRegularLiteral
-  = escapedLiteral
-  / regularLiteral
-
-escapedOrLiteralWithoutBar
-  = escapedLiteral
-  / regularLiteralWithoutBar
-
-escapedLiteral
-  = "\\" escaped:. { return escaped; }
-
-regularLiteral
-  = [^{}\[\]$\\]
-
-regularLiteralWithoutBar
-  = [^{}\[\]$\\|]
-
diff --git a/resources/mediawiki/mediawiki.js b/resources/mediawiki/mediawiki.js
deleted file mode 100644 (file)
index d8a17f6..0000000
+++ /dev/null
@@ -1,2413 +0,0 @@
-/**
- * Base library for MediaWiki.
- *
- * Exposed as globally as `mediaWiki` with `mw` as shortcut.
- *
- * @class mw
- * @alternateClassName mediaWiki
- * @singleton
- */
-
-var mw = ( function ( $, undefined ) {
-       'use strict';
-
-       /* Private Members */
-
-       var hasOwn = Object.prototype.hasOwnProperty,
-               slice = Array.prototype.slice,
-               trackCallbacks = $.Callbacks( 'memory' ),
-               trackQueue = [];
-
-       /**
-        * Log a message to window.console, if possible. Useful to force logging of some
-        * errors that are otherwise hard to detect (I.e., this logs also in production mode).
-        * Gets console references in each invocation, so that delayed debugging tools work
-        * fine. No need for optimization here, which would only result in losing logs.
-        *
-        * @private
-        * @method log_
-        * @param {string} msg text for the log entry.
-        * @param {Error} [e]
-        */
-       function log( msg, e ) {
-               var console = window.console;
-               if ( console && console.log ) {
-                       console.log( msg );
-                       // If we have an exception object, log it through .error() to trigger
-                       // proper stacktraces in browsers that support it. There are no (known)
-                       // browsers that don't support .error(), that do support .log() and
-                       // have useful exception handling through .log().
-                       if ( e && console.error ) {
-                               console.error( String( e ), e );
-                       }
-               }
-       }
-
-       /* Object constructors */
-
-       /**
-        * Creates an object that can be read from or written to from prototype functions
-        * that allow both single and multiple variables at once.
-        *
-        *     @example
-        *
-        *     var addies, wanted, results;
-        *
-        *     // Create your address book
-        *     addies = new mw.Map();
-        *
-        *     // This data could be coming from an external source (eg. API/AJAX)
-        *     addies.set( {
-        *         'John Doe' : '10 Wall Street, New York, USA',
-        *         'Jane Jackson' : '21 Oxford St, London, UK',
-        *         'Dominique van Halen' : 'Kalverstraat 7, Amsterdam, NL'
-        *     } );
-        *
-        *     wanted = ['Dominique van Halen', 'George Johnson', 'Jane Jackson'];
-        *
-        *     // You can detect missing keys first
-        *     if ( !addies.exists( wanted ) ) {
-        *         // One or more are missing (in this case: "George Johnson")
-        *         mw.log( 'One or more names were not found in your address book' );
-        *     }
-        *
-        *     // Or just let it give you what it can
-        *     results = addies.get( wanted, 'Middle of Nowhere, Alaska, US' );
-        *     mw.log( results['Jane Jackson'] ); // "21 Oxford St, London, UK"
-        *     mw.log( results['George Johnson'] ); // "Middle of Nowhere, Alaska, US"
-        *
-        * @class mw.Map
-        *
-        * @constructor
-        * @param {Object|boolean} [values] Value-bearing object to map, or boolean
-        *  true to map over the global object. Defaults to an empty object.
-        */
-       function Map( values ) {
-               this.values = values === true ? window : ( values || {} );
-               return this;
-       }
-
-       Map.prototype = {
-               /**
-                * Get the value of one or multiple a keys.
-                *
-                * If called with no arguments, all values will be returned.
-                *
-                * @param {string|Array} selection String key or array of keys to get values for.
-                * @param {Mixed} [fallback] Value to use in case key(s) do not exist.
-                * @return mixed If selection was a string returns the value or null,
-                *  If selection was an array, returns an object of key/values (value is null if not found),
-                *  If selection was not passed or invalid, will return the 'values' object member (be careful as
-                *  objects are always passed by reference in JavaScript!).
-                * @return {string|Object|null} Values as a string or object, null if invalid/inexistant.
-                */
-               get: function ( selection, fallback ) {
-                       var results, i;
-                       // If we only do this in the `return` block, it'll fail for the
-                       // call to get() from the mutli-selection block.
-                       fallback = arguments.length > 1 ? fallback : null;
-
-                       if ( $.isArray( selection ) ) {
-                               selection = slice.call( selection );
-                               results = {};
-                               for ( i = 0; i < selection.length; i++ ) {
-                                       results[selection[i]] = this.get( selection[i], fallback );
-                               }
-                               return results;
-                       }
-
-                       if ( typeof selection === 'string' ) {
-                               if ( !hasOwn.call( this.values, selection ) ) {
-                                       return fallback;
-                               }
-                               return this.values[selection];
-                       }
-
-                       if ( selection === undefined ) {
-                               return this.values;
-                       }
-
-                       // invalid selection key
-                       return null;
-               },
-
-               /**
-                * Sets one or multiple key/value pairs.
-                *
-                * @param {string|Object} selection String key to set value for, or object mapping keys to values.
-                * @param {Mixed} [value] Value to set (optional, only in use when key is a string)
-                * @return {Boolean} This returns true on success, false on failure.
-                */
-               set: function ( selection, value ) {
-                       var s;
-
-                       if ( $.isPlainObject( selection ) ) {
-                               for ( s in selection ) {
-                                       this.values[s] = selection[s];
-                               }
-                               return true;
-                       }
-                       if ( typeof selection === 'string' && arguments.length > 1 ) {
-                               this.values[selection] = value;
-                               return true;
-                       }
-                       return false;
-               },
-
-               /**
-                * Checks if one or multiple keys exist.
-                *
-                * @param {Mixed} selection String key or array of keys to check
-                * @return {boolean} Existence of key(s)
-                */
-               exists: function ( selection ) {
-                       var s;
-
-                       if ( $.isArray( selection ) ) {
-                               for ( s = 0; s < selection.length; s++ ) {
-                                       if ( typeof selection[s] !== 'string' || !hasOwn.call( this.values, selection[s] ) ) {
-                                               return false;
-                                       }
-                               }
-                               return true;
-                       }
-                       return typeof selection === 'string' && hasOwn.call( this.values, selection );
-               }
-       };
-
-       /**
-        * Object constructor for messages.
-        *
-        * Similar to the Message class in MediaWiki PHP.
-        *
-        * Format defaults to 'text'.
-        *
-        *     @example
-        *
-        *     var obj, str;
-        *     mw.messages.set( {
-        *         'hello': 'Hello world',
-        *         'hello-user': 'Hello, $1!',
-        *         'welcome-user': 'Welcome back to $2, $1! Last visit by $1: $3'
-        *     } );
-        *
-        *     obj = new mw.Message( mw.messages, 'hello' );
-        *     mw.log( obj.text() );
-        *     // Hello world
-        *
-        *     obj = new mw.Message( mw.messages, 'hello-user', [ 'John Doe' ] );
-        *     mw.log( obj.text() );
-        *     // Hello, John Doe!
-        *
-        *     obj = new mw.Message( mw.messages, 'welcome-user', [ 'John Doe', 'Wikipedia', '2 hours ago' ] );
-        *     mw.log( obj.text() );
-        *     // Welcome back to Wikipedia, John Doe! Last visit by John Doe: 2 hours ago
-        *
-        *     // Using mw.message shortcut
-        *     obj = mw.message( 'hello-user', 'John Doe' );
-        *     mw.log( obj.text() );
-        *     // Hello, John Doe!
-        *
-        *     // Using mw.msg shortcut
-        *     str = mw.msg( 'hello-user', 'John Doe' );
-        *     mw.log( str );
-        *     // Hello, John Doe!
-        *
-        *     // Different formats
-        *     obj = new mw.Message( mw.messages, 'hello-user', [ 'John "Wiki" <3 Doe' ] );
-        *
-        *     obj.format = 'text';
-        *     str = obj.toString();
-        *     // Same as:
-        *     str = obj.text();
-        *
-        *     mw.log( str );
-        *     // Hello, John "Wiki" <3 Doe!
-        *
-        *     mw.log( obj.escaped() );
-        *     // Hello, John &quot;Wiki&quot; &lt;3 Doe!
-        *
-        * @class mw.Message
-        *
-        * @constructor
-        * @param {mw.Map} map Message storage
-        * @param {string} key
-        * @param {Array} [parameters]
-        */
-       function Message( map, key, parameters ) {
-               this.format = 'text';
-               this.map = map;
-               this.key = key;
-               this.parameters = parameters === undefined ? [] : slice.call( parameters );
-               return this;
-       }
-
-       Message.prototype = {
-               /**
-                * Simple message parser, does $N replacement and nothing else.
-                *
-                * This may be overridden to provide a more complex message parser.
-                *
-                * The primary override is in mediawiki.jqueryMsg.
-                *
-                * This function will not be called for nonexistent messages.
-                */
-               parser: function () {
-                       var parameters = this.parameters;
-                       return this.map.get( this.key ).replace( /\$(\d+)/g, function ( str, match ) {
-                               var index = parseInt( match, 10 ) - 1;
-                               return parameters[index] !== undefined ? parameters[index] : '$' + match;
-                       } );
-               },
-
-               /**
-                * Appends (does not replace) parameters for replacement to the .parameters property.
-                *
-                * @param {Array} parameters
-                * @chainable
-                */
-               params: function ( parameters ) {
-                       var i;
-                       for ( i = 0; i < parameters.length; i += 1 ) {
-                               this.parameters.push( parameters[i] );
-                       }
-                       return this;
-               },
-
-               /**
-                * Converts message object to its string form based on the state of format.
-                *
-                * @return {string} Message as a string in the current form or `<key>` if key does not exist.
-                */
-               toString: function () {
-                       var text;
-
-                       if ( !this.exists() ) {
-                               // Use <key> as text if key does not exist
-                               if ( this.format === 'escaped' || this.format === 'parse' ) {
-                                       // format 'escaped' and 'parse' need to have the brackets and key html escaped
-                                       return mw.html.escape( '<' + this.key + '>' );
-                               }
-                               return '<' + this.key + '>';
-                       }
-
-                       if ( this.format === 'plain' || this.format === 'text' || this.format === 'parse' ) {
-                               text = this.parser();
-                       }
-
-                       if ( this.format === 'escaped' ) {
-                               text = this.parser();
-                               text = mw.html.escape( text );
-                       }
-
-                       return text;
-               },
-
-               /**
-                * Changes format to 'parse' and converts message to string
-                *
-                * If jqueryMsg is loaded, this parses the message text from wikitext
-                * (where supported) to HTML
-                *
-                * Otherwise, it is equivalent to plain.
-                *
-                * @return {string} String form of parsed message
-                */
-               parse: function () {
-                       this.format = 'parse';
-                       return this.toString();
-               },
-
-               /**
-                * Changes format to 'plain' and converts message to string
-                *
-                * This substitutes parameters, but otherwise does not change the
-                * message text.
-                *
-                * @return {string} String form of plain message
-                */
-               plain: function () {
-                       this.format = 'plain';
-                       return this.toString();
-               },
-
-               /**
-                * Changes format to 'text' and converts message to string
-                *
-                * If jqueryMsg is loaded, {{-transformation is done where supported
-                * (such as {{plural:}}, {{gender:}}, {{int:}}).
-                *
-                * Otherwise, it is equivalent to plain.
-                */
-               text: function () {
-                       this.format = 'text';
-                       return this.toString();
-               },
-
-               /**
-                * Changes the format to 'escaped' and converts message to string
-                *
-                * This is equivalent to using the 'text' format (see text method), then
-                * HTML-escaping the output.
-                *
-                * @return {string} String form of html escaped message
-                */
-               escaped: function () {
-                       this.format = 'escaped';
-                       return this.toString();
-               },
-
-               /**
-                * Checks if message exists
-                *
-                * @see mw.Map#exists
-                * @return {boolean}
-                */
-               exists: function () {
-                       return this.map.exists( this.key );
-               }
-       };
-
-       /**
-        * @class mw
-        */
-       return {
-               /* Public Members */
-
-               /**
-                * Get the current time, measured in milliseconds since January 1, 1970 (UTC).
-                *
-                * On browsers that implement the Navigation Timing API, this function will produce floating-point
-                * values with microsecond precision that are guaranteed to be monotonic. On all other browsers,
-                * it will fall back to using `Date`.
-                *
-                * @return {number} Current time
-                */
-               now: ( function () {
-                       var perf = window.performance,
-                               navStart = perf && perf.timing && perf.timing.navigationStart;
-                       return navStart && typeof perf.now === 'function' ?
-                               function () { return navStart + perf.now(); } :
-                               function () { return +new Date(); };
-               }() ),
-
-               /**
-                * Track an analytic event.
-                *
-                * This method provides a generic means for MediaWiki JavaScript code to capture state
-                * information for analysis. Each logged event specifies a string topic name that describes
-                * the kind of event that it is. Topic names consist of dot-separated path components,
-                * arranged from most general to most specific. Each path component should have a clear and
-                * well-defined purpose.
-                *
-                * Data handlers are registered via `mw.trackSubscribe`, and receive the full set of
-                * events that match their subcription, including those that fired before the handler was
-                * bound.
-                *
-                * @param {string} topic Topic name
-                * @param {Object} [data] Data describing the event, encoded as an object
-                */
-               track: function ( topic, data ) {
-                       trackQueue.push( { topic: topic, timeStamp: mw.now(), data: data } );
-                       trackCallbacks.fire( trackQueue );
-               },
-
-               /**
-                * Register a handler for subset of analytic events, specified by topic
-                *
-                * Handlers will be called once for each tracked event, including any events that fired before the
-                * handler was registered; 'this' is set to a plain object with a 'timeStamp' property indicating
-                * the exact time at which the event fired, a string 'topic' property naming the event, and a
-                * 'data' property which is an object of event-specific data. The event topic and event data are
-                * also passed to the callback as the first and second arguments, respectively.
-                *
-                * @param {string} topic Handle events whose name starts with this string prefix
-                * @param {Function} callback Handler to call for each matching tracked event
-                */
-               trackSubscribe: function ( topic, callback ) {
-                       var seen = 0;
-
-                       trackCallbacks.add( function ( trackQueue ) {
-                               var event;
-                               for ( ; seen < trackQueue.length; seen++ ) {
-                                       event = trackQueue[ seen ];
-                                       if ( event.topic.indexOf( topic ) === 0 ) {
-                                               callback.call( event, event.topic, event.data );
-                                       }
-                               }
-                       } );
-               },
-
-               // Make the Map constructor publicly available.
-               Map: Map,
-
-               // Make the Message constructor publicly available.
-               Message: Message,
-
-               /**
-                * Map of configuration values
-                *
-                * Check out [the complete list of configuration values](https://www.mediawiki.org/wiki/Manual:Interface/JavaScript#mw.config)
-                * on mediawiki.org.
-                *
-                * If `$wgLegacyJavaScriptGlobals` is true, this Map will add its values to the
-                * global `window` object.
-                *
-                * @property {mw.Map} config
-                */
-               // Dummy placeholder. Re-assigned in ResourceLoaderStartupModule to an instance of `mw.Map`.
-               config: null,
-
-               /**
-                * Empty object that plugins can be installed in.
-                * @property
-                */
-               libs: {},
-
-               /**
-                * Access container for deprecated functionality that can be moved from
-                * from their legacy location and attached to this object (e.g. a global
-                * function that is deprecated and as stop-gap can be exposed through here).
-                *
-                * This was reserved for future use but never ended up being used.
-                *
-                * @deprecated since 1.22: Let deprecated identifiers keep their original name
-                *  and use mw.log#deprecate to create an access container for tracking.
-                * @property
-                */
-               legacy: {},
-
-               /**
-                * Localization system
-                * @property {mw.Map}
-                */
-               messages: new Map(),
-
-               /* Public Methods */
-
-               /**
-                * Get a message object.
-                *
-                * Shorcut for `new mw.Message( mw.messages, key, parameters )`.
-                *
-                * @see mw.Message
-                * @param {string} key Key of message to get
-                * @param {Mixed...} parameters Parameters for the $N replacements in messages.
-                * @return {mw.Message}
-                */
-               message: function ( key ) {
-                       // Variadic arguments
-                       var parameters = slice.call( arguments, 1 );
-                       return new Message( mw.messages, key, parameters );
-               },
-
-               /**
-                * Get a message string using the (default) 'text' format.
-                *
-                * Shortcut for `mw.message( key, parameters... ).text()`.
-                *
-                * @see mw.Message
-                * @param {string} key Key of message to get
-                * @param {Mixed...} parameters Parameters for the $N replacements in messages.
-                * @return {string}
-                */
-               msg: function () {
-                       return mw.message.apply( mw.message, arguments ).toString();
-               },
-
-               /**
-                * Dummy placeholder for {@link mw.log}
-                * @method
-                */
-               log: ( function () {
-                       // Also update the restoration of methods in mediawiki.log.js
-                       // when adding or removing methods here.
-                       var log = function () {};
-
-                       /**
-                        * @class mw.log
-                        * @singleton
-                        */
-
-                       /**
-                        * Write a message the console's warning channel.
-                        * Also logs a stacktrace for easier debugging.
-                        * Each action is silently ignored if the browser doesn't support it.
-                        *
-                        * @param {string...} msg Messages to output to console
-                        */
-                       log.warn = function () {
-                               var console = window.console;
-                               if ( console && console.warn ) {
-                                       console.warn.apply( console, arguments );
-                                       if ( console.trace ) {
-                                               console.trace();
-                                       }
-                               }
-                       };
-
-                       /**
-                        * Create a property in a host object that, when accessed, will produce
-                        * a deprecation warning in the console with backtrace.
-                        *
-                        * @param {Object} obj Host object of deprecated property
-                        * @param {string} key Name of property to create in `obj`
-                        * @param {Mixed} val The value this property should return when accessed
-                        * @param {string} [msg] Optional text to include in the deprecation message.
-                        */
-                       log.deprecate = !Object.defineProperty ? function ( obj, key, val ) {
-                               obj[key] = val;
-                       } : function ( obj, key, val, msg ) {
-                               msg = 'Use of "' + key + '" is deprecated.' + ( msg ? ( ' ' + msg ) : '' );
-                               try {
-                                       Object.defineProperty( obj, key, {
-                                               configurable: true,
-                                               enumerable: true,
-                                               get: function () {
-                                                       mw.track( 'mw.deprecate', key );
-                                                       mw.log.warn( msg );
-                                                       return val;
-                                               },
-                                               set: function ( newVal ) {
-                                                       mw.track( 'mw.deprecate', key );
-                                                       mw.log.warn( msg );
-                                                       val = newVal;
-                                               }
-                                       } );
-                               } catch ( err ) {
-                                       // IE8 can throw on Object.defineProperty
-                                       obj[key] = val;
-                               }
-                       };
-
-                       return log;
-               }() ),
-
-               /**
-                * Client-side module loader which integrates with the MediaWiki ResourceLoader
-                * @class mw.loader
-                * @singleton
-                */
-               loader: ( function () {
-
-                       /* Private Members */
-
-                       /**
-                        * Mapping of registered modules
-                        *
-                        * The jquery module is pre-registered, because it must have already
-                        * been provided for this object to have been built, and in debug mode
-                        * jquery would have been provided through a unique loader request,
-                        * making it impossible to hold back registration of jquery until after
-                        * mediawiki.
-                        *
-                        * For exact details on support for script, style and messages, look at
-                        * mw.loader.implement.
-                        *
-                        * Format:
-                        *     {
-                        *         'moduleName': {
-                        *             'version': ############## (unix timestamp),
-                        *             'dependencies': ['required.foo', 'bar.also', ...], (or) function () {}
-                        *             'group': 'somegroup', (or) null,
-                        *             'source': 'local', 'someforeignwiki', (or) null
-                        *             'state': 'registered', 'loaded', 'loading', 'ready', 'error' or 'missing'
-                        *             'script': ...,
-                        *             'style': ...,
-                        *             'messages': { 'key': 'value' },
-                        *         }
-                        *     }
-                        *
-                        * @property
-                        * @private
-                        */
-                       var registry = {},
-                               //
-                               // Mapping of sources, keyed by source-id, values are objects.
-                               // Format:
-                               //      {
-                               //              'sourceId': {
-                               //                      'loadScript': 'http://foo.bar/w/load.php'
-                               //              }
-                               //      }
-                               //
-                               sources = {},
-                               // List of modules which will be loaded as when ready
-                               batch = [],
-                               // List of modules to be loaded
-                               queue = [],
-                               // List of callback functions waiting for modules to be ready to be called
-                               jobs = [],
-                               // Selector cache for the marker element. Use getMarker() to get/use the marker!
-                               $marker = null,
-                               // Buffer for addEmbeddedCSS.
-                               cssBuffer = '',
-                               // Callbacks for addEmbeddedCSS.
-                               cssCallbacks = $.Callbacks();
-
-                       /* Private methods */
-
-                       function getMarker() {
-                               // Cached ?
-                               if ( $marker ) {
-                                       return $marker;
-                               }
-
-                               $marker = $( 'meta[name="ResourceLoaderDynamicStyles"]' );
-                               if ( $marker.length ) {
-                                       return $marker;
-                               }
-                               mw.log( 'getMarker> No <meta name="ResourceLoaderDynamicStyles"> found, inserting dynamically.' );
-                               $marker = $( '<meta>' ).attr( 'name', 'ResourceLoaderDynamicStyles' ).appendTo( 'head' );
-
-                               return $marker;
-                       }
-
-                       /**
-                        * Create a new style tag and add it to the DOM.
-                        *
-                        * @private
-                        * @param {string} text CSS text
-                        * @param {HTMLElement|jQuery} [nextnode=document.head] The element where the style tag should be
-                        *  inserted before. Otherwise it will be appended to `<head>`.
-                        * @return {HTMLElement} Reference to the created `<style>` element.
-                        */
-                       function newStyleTag( text, nextnode ) {
-                               var s = document.createElement( 'style' );
-                               // Insert into document before setting cssText (bug 33305)
-                               if ( nextnode ) {
-                                       // Must be inserted with native insertBefore, not $.fn.before.
-                                       // When using jQuery to insert it, like $nextnode.before( s ),
-                                       // then IE6 will throw "Access is denied" when trying to append
-                                       // to .cssText later. Some kind of weird security measure.
-                                       // http://stackoverflow.com/q/12586482/319266
-                                       // Works: jsfiddle.net/zJzMy/1
-                                       // Fails: jsfiddle.net/uJTQz
-                                       // Works again: http://jsfiddle.net/Azr4w/ (diff: the next 3 lines)
-                                       if ( nextnode.jquery ) {
-                                               nextnode = nextnode.get( 0 );
-                                       }
-                                       nextnode.parentNode.insertBefore( s, nextnode );
-                               } else {
-                                       document.getElementsByTagName( 'head' )[0].appendChild( s );
-                               }
-                               if ( s.styleSheet ) {
-                                       // IE
-                                       s.styleSheet.cssText = text;
-                               } else {
-                                       // Other browsers.
-                                       // (Safari sometimes borks on non-string values,
-                                       // play safe by casting to a string, just in case.)
-                                       s.appendChild( document.createTextNode( String( text ) ) );
-                               }
-                               return s;
-                       }
-
-                       /**
-                        * Checks whether it is safe to add this css to a stylesheet.
-                        *
-                        * @private
-                        * @param {string} cssText
-                        * @return {boolean} False if a new one must be created.
-                        */
-                       function canExpandStylesheetWith( cssText ) {
-                               // Makes sure that cssText containing `@import`
-                               // rules will end up in a new stylesheet (as those only work when
-                               // placed at the start of a stylesheet; bug 35562).
-                               return cssText.indexOf( '@import' ) === -1;
-                       }
-
-                       /**
-                        * Add a bit of CSS text to the current browser page.
-                        *
-                        * The CSS will be appended to an existing ResourceLoader-created `<style>` tag
-                        * or create a new one based on whether the given `cssText` is safe for extension.
-                        *
-                        * @param {string} [cssText=cssBuffer] If called without cssText,
-                        *  the internal buffer will be inserted instead.
-                        * @param {Function} [callback]
-                        */
-                       function addEmbeddedCSS( cssText, callback ) {
-                               var $style, styleEl;
-
-                               if ( callback ) {
-                                       cssCallbacks.add( callback );
-                               }
-
-                               // Yield once before inserting the <style> tag. There are likely
-                               // more calls coming up which we can combine this way.
-                               // Appending a stylesheet and waiting for the browser to repaint
-                               // is fairly expensive, this reduces it (bug 45810)
-                               if ( cssText ) {
-                                       // Be careful not to extend the buffer with css that needs a new stylesheet
-                                       if ( !cssBuffer || canExpandStylesheetWith( cssText ) ) {
-                                               // Linebreak for somewhat distinguishable sections
-                                               // (the rl-cachekey comment separating each)
-                                               cssBuffer += '\n' + cssText;
-                                               // TODO: Use requestAnimationFrame in the future which will
-                                               // perform even better by not injecting styles while the browser
-                                               // is paiting.
-                                               setTimeout( function () {
-                                                       // Can't pass addEmbeddedCSS to setTimeout directly because Firefox
-                                                       // (below version 13) has the non-standard behaviour of passing a
-                                                       // numerical "lateness" value as first argument to this callback
-                                                       // http://benalman.com/news/2009/07/the-mysterious-firefox-settime/
-                                                       addEmbeddedCSS();
-                                               } );
-                                               return;
-                                       }
-
-                               // This is a delayed call and we got a buffer still
-                               } else if ( cssBuffer ) {
-                                       cssText = cssBuffer;
-                                       cssBuffer = '';
-                               } else {
-                                       // This is a delayed call, but buffer is already cleared by
-                                       // another delayed call.
-                                       return;
-                               }
-
-                               // By default, always create a new <style>. Appending text to a <style>
-                               // tag is bad as it means the contents have to be re-parsed (bug 45810).
-                               //
-                               // Except, of course, in IE 9 and below. In there we default to re-using and
-                               // appending to a <style> tag due to the IE stylesheet limit (bug 31676).
-                               if ( 'documentMode' in document && document.documentMode <= 9 ) {
-
-                                       $style = getMarker().prev();
-                                       // Verify that the the element before Marker actually is a
-                                       // <style> tag and one that came from ResourceLoader
-                                       // (not some other style tag or even a `<meta>` or `<script>`).
-                                       if ( $style.data( 'ResourceLoaderDynamicStyleTag' ) === true ) {
-                                               // There's already a dynamic <style> tag present and
-                                               // canExpandStylesheetWith() gave a green light to append more to it.
-                                               styleEl = $style.get( 0 );
-                                               if ( styleEl.styleSheet ) {
-                                                       try {
-                                                               styleEl.styleSheet.cssText += cssText; // IE
-                                                       } catch ( e ) {
-                                                               log( 'addEmbeddedCSS fail', e );
-                                                       }
-                                               } else {
-                                                       styleEl.appendChild( document.createTextNode( String( cssText ) ) );
-                                               }
-                                               cssCallbacks.fire().empty();
-                                               return;
-                                       }
-                               }
-
-                               $( newStyleTag( cssText, getMarker() ) ).data( 'ResourceLoaderDynamicStyleTag', true );
-
-                               cssCallbacks.fire().empty();
-                       }
-
-                       /**
-                        * Generates an ISO8601 "basic" string from a UNIX timestamp
-                        * @private
-                        */
-                       function formatVersionNumber( timestamp ) {
-                               var     d = new Date();
-                               function pad( a, b, c ) {
-                                       return [a < 10 ? '0' + a : a, b < 10 ? '0' + b : b, c < 10 ? '0' + c : c].join( '' );
-                               }
-                               d.setTime( timestamp * 1000 );
-                               return [
-                                       pad( d.getUTCFullYear(), d.getUTCMonth() + 1, d.getUTCDate() ), 'T',
-                                       pad( d.getUTCHours(), d.getUTCMinutes(), d.getUTCSeconds() ), 'Z'
-                               ].join( '' );
-                       }
-
-                       /**
-                        * Resolves dependencies and detects circular references.
-                        *
-                        * @private
-                        * @param {string} module Name of the top-level module whose dependencies shall be
-                        *   resolved and sorted.
-                        * @param {Array} resolved Returns a topological sort of the given module and its
-                        *   dependencies, such that later modules depend on earlier modules. The array
-                        *   contains the module names. If the array contains already some module names,
-                        *   this function appends its result to the pre-existing array.
-                        * @param {Object} [unresolved] Hash used to track the current dependency
-                        *   chain; used to report loops in the dependency graph.
-                        * @throws {Error} If any unregistered module or a dependency loop is encountered
-                        */
-                       function sortDependencies( module, resolved, unresolved ) {
-                               var n, deps, len;
-
-                               if ( registry[module] === undefined ) {
-                                       throw new Error( 'Unknown dependency: ' + module );
-                               }
-                               // Resolves dynamic loader function and replaces it with its own results
-                               if ( $.isFunction( registry[module].dependencies ) ) {
-                                       registry[module].dependencies = registry[module].dependencies();
-                                       // Ensures the module's dependencies are always in an array
-                                       if ( typeof registry[module].dependencies !== 'object' ) {
-                                               registry[module].dependencies = [registry[module].dependencies];
-                                       }
-                               }
-                               if ( $.inArray( module, resolved ) !== -1 ) {
-                                       // Module already resolved; nothing to do.
-                                       return;
-                               }
-                               // unresolved is optional, supply it if not passed in
-                               if ( !unresolved ) {
-                                       unresolved = {};
-                               }
-                               // Tracks down dependencies
-                               deps = registry[module].dependencies;
-                               len = deps.length;
-                               for ( n = 0; n < len; n += 1 ) {
-                                       if ( $.inArray( deps[n], resolved ) === -1 ) {
-                                               if ( unresolved[deps[n]] ) {
-                                                       throw new Error(
-                                                               'Circular reference detected: ' + module +
-                                                               ' -> ' + deps[n]
-                                                       );
-                                               }
-
-                                               // Add to unresolved
-                                               unresolved[module] = true;
-                                               sortDependencies( deps[n], resolved, unresolved );
-                                               delete unresolved[module];
-                                       }
-                               }
-                               resolved[resolved.length] = module;
-                       }
-
-                       /**
-                        * Gets a list of module names that a module depends on in their proper dependency
-                        * order.
-                        *
-                        * @private
-                        * @param {string} module Module name or array of string module names
-                        * @return {Array} list of dependencies, including 'module'.
-                        * @throws {Error} If circular reference is detected
-                        */
-                       function resolve( module ) {
-                               var m, resolved;
-
-                               // Allow calling with an array of module names
-                               if ( $.isArray( module ) ) {
-                                       resolved = [];
-                                       for ( m = 0; m < module.length; m += 1 ) {
-                                               sortDependencies( module[m], resolved );
-                                       }
-                                       return resolved;
-                               }
-
-                               if ( typeof module === 'string' ) {
-                                       resolved = [];
-                                       sortDependencies( module, resolved );
-                                       return resolved;
-                               }
-
-                               throw new Error( 'Invalid module argument: ' + module );
-                       }
-
-                       /**
-                        * Narrows a list of module names down to those matching a specific
-                        * state (see comment on top of this scope for a list of valid states).
-                        * One can also filter for 'unregistered', which will return the
-                        * modules names that don't have a registry entry.
-                        *
-                        * @private
-                        * @param {string|string[]} states Module states to filter by
-                        * @param {Array} [modules] List of module names to filter (optional, by default the entire
-                        * registry is used)
-                        * @return {Array} List of filtered module names
-                        */
-                       function filter( states, modules ) {
-                               var list, module, s, m;
-
-                               // Allow states to be given as a string
-                               if ( typeof states === 'string' ) {
-                                       states = [states];
-                               }
-                               // If called without a list of modules, build and use a list of all modules
-                               list = [];
-                               if ( modules === undefined ) {
-                                       modules = [];
-                                       for ( module in registry ) {
-                                               modules[modules.length] = module;
-                                       }
-                               }
-                               // Build a list of modules which are in one of the specified states
-                               for ( s = 0; s < states.length; s += 1 ) {
-                                       for ( m = 0; m < modules.length; m += 1 ) {
-                                               if ( registry[modules[m]] === undefined ) {
-                                                       // Module does not exist
-                                                       if ( states[s] === 'unregistered' ) {
-                                                               // OK, undefined
-                                                               list[list.length] = modules[m];
-                                                       }
-                                               } else {
-                                                       // Module exists, check state
-                                                       if ( registry[modules[m]].state === states[s] ) {
-                                                               // OK, correct state
-                                                               list[list.length] = modules[m];
-                                                       }
-                                               }
-                                       }
-                               }
-                               return list;
-                       }
-
-                       /**
-                        * Determine whether all dependencies are in state 'ready', which means we may
-                        * execute the module or job now.
-                        *
-                        * @private
-                        * @param {Array} dependencies Dependencies (module names) to be checked.
-                        * @return {boolean} True if all dependencies are in state 'ready', false otherwise
-                        */
-                       function allReady( dependencies ) {
-                               return filter( 'ready', dependencies ).length === dependencies.length;
-                       }
-
-                       /**
-                        * A module has entered state 'ready', 'error', or 'missing'. Automatically update pending jobs
-                        * and modules that depend upon this module. if the given module failed, propagate the 'error'
-                        * state up the dependency tree; otherwise, execute all jobs/modules that now have all their
-                        * dependencies satisfied. On jobs depending on a failed module, run the error callback, if any.
-                        *
-                        * @private
-                        * @param {string} module Name of module that entered one of the states 'ready', 'error', or 'missing'.
-                        */
-                       function handlePending( module ) {
-                               var j, job, hasErrors, m, stateChange;
-
-                               // Modules.
-                               if ( $.inArray( registry[module].state, ['error', 'missing'] ) !== -1 ) {
-                                       // If the current module failed, mark all dependent modules also as failed.
-                                       // Iterate until steady-state to propagate the error state upwards in the
-                                       // dependency tree.
-                                       do {
-                                               stateChange = false;
-                                               for ( m in registry ) {
-                                                       if ( $.inArray( registry[m].state, ['error', 'missing'] ) === -1 ) {
-                                                               if ( filter( ['error', 'missing'], registry[m].dependencies ).length > 0 ) {
-                                                                       registry[m].state = 'error';
-                                                                       stateChange = true;
-                                                               }
-                                                       }
-                                               }
-                                       } while ( stateChange );
-                               }
-
-                               // Execute all jobs whose dependencies are either all satisfied or contain at least one failed module.
-                               for ( j = 0; j < jobs.length; j += 1 ) {
-                                       hasErrors = filter( ['error', 'missing'], jobs[j].dependencies ).length > 0;
-                                       if ( hasErrors || allReady( jobs[j].dependencies ) ) {
-                                               // All dependencies satisfied, or some have errors
-                                               job = jobs[j];
-                                               jobs.splice( j, 1 );
-                                               j -= 1;
-                                               try {
-                                                       if ( hasErrors ) {
-                                                               if ( $.isFunction( job.error ) ) {
-                                                                       job.error( new Error( 'Module ' + module + ' has failed dependencies' ), [module] );
-                                                               }
-                                                       } else {
-                                                               if ( $.isFunction( job.ready ) ) {
-                                                                       job.ready();
-                                                               }
-                                                       }
-                                               } catch ( e ) {
-                                                       // A user-defined callback raised an exception.
-                                                       // Swallow it to protect our state machine!
-                                                       log( 'Exception thrown by job.error', e );
-                                               }
-                                       }
-                               }
-
-                               if ( registry[module].state === 'ready' ) {
-                                       // The current module became 'ready'. Set it in the module store, and recursively execute all
-                                       // dependent modules that are loaded and now have all dependencies satisfied.
-                                       mw.loader.store.set( module, registry[module] );
-                                       for ( m in registry ) {
-                                               if ( registry[m].state === 'loaded' && allReady( registry[m].dependencies ) ) {
-                                                       execute( m );
-                                               }
-                                       }
-                               }
-                       }
-
-                       /**
-                        * Adds a script tag to the DOM, either using document.write or low-level DOM manipulation,
-                        * depending on whether document-ready has occurred yet and whether we are in async mode.
-                        *
-                        * @private
-                        * @param {string} src URL to script, will be used as the src attribute in the script tag
-                        * @param {Function} [callback] Callback which will be run when the script is done
-                        * @param {boolean} [async=false] Whether to load modules asynchronously.
-                        *  Ignored (and defaulted to `true`) if the document-ready event has already occurred.
-                        */
-                       function addScript( src, callback, async ) {
-                               /*jshint evil:true */
-                               var script, head, done;
-
-                               // Using isReady directly instead of storing it locally from
-                               // a $.fn.ready callback (bug 31895).
-                               if ( $.isReady || async ) {
-                                       // Can't use jQuery.getScript because that only uses <script> for cross-domain,
-                                       // it uses XHR and eval for same-domain scripts, which we don't want because it
-                                       // messes up line numbers.
-                                       // The below is based on jQuery ([jquery@1.9.1]/src/ajax/script.js)
-
-                                       // IE-safe way of getting an append target. In old IE document.head isn't supported
-                                       // and its getElementsByTagName can't find <head> until </head> is parsed.
-                                       done = false;
-                                       head = document.head || document.getElementsByTagName( 'head' )[0] || document.documentElement;
-
-                                       script = document.createElement( 'script' );
-                                       script.async = true;
-                                       script.src = src;
-                                       if ( $.isFunction( callback ) ) {
-                                               script.onload = script.onreadystatechange = function () {
-                                                       if (
-                                                               !done
-                                                               && (
-                                                                       !script.readyState
-                                                                       || /loaded|complete/.test( script.readyState )
-                                                               )
-                                                       ) {
-                                                               done = true;
-
-                                                               // Handle memory leak in IE
-                                                               script.onload = script.onreadystatechange = null;
-
-                                                               // Detach the element from the document
-                                                               if ( script.parentNode ) {
-                                                                       script.parentNode.removeChild( script );
-                                                               }
-
-                                                               // Dereference the element from javascript
-                                                               script = undefined;
-
-                                                               callback();
-                                                       }
-                                               };
-                                       }
-
-                                       if ( window.opera ) {
-                                               // Appending to the <head> blocks rendering completely in Opera,
-                                               // so append to the <body> after document ready. This means the
-                                               // scripts only start loading after the document has been rendered,
-                                               // but so be it. Opera users don't deserve faster web pages if their
-                                               // browser makes it impossible.
-                                               $( function () {
-                                                       document.body.appendChild( script );
-                                               } );
-                                       } else {
-                                               // Circumvent IE6 bugs with base elements (jqbug.com/2709, jqbug.com/4378)
-                                               // by prepending instead of appending.
-                                               head.insertBefore( script, head.firstChild );
-                                       }
-                               } else {
-                                       document.write( mw.html.element( 'script', { 'src': src }, '' ) );
-                                       if ( $.isFunction( callback ) ) {
-                                               // Document.write is synchronous, so this is called when it's done
-                                               // FIXME: that's a lie. doc.write isn't actually synchronous
-                                               callback();
-                                       }
-                               }
-                       }
-
-                       /**
-                        * Executes a loaded module, making it ready to use
-                        *
-                        * @private
-                        * @param {string} module Module name to execute
-                        */
-                       function execute( module ) {
-                               var key, value, media, i, urls, cssHandle, checkCssHandles,
-                                       cssHandlesRegistered = false;
-
-                               if ( registry[module] === undefined ) {
-                                       throw new Error( 'Module has not been registered yet: ' + module );
-                               } else if ( registry[module].state === 'registered' ) {
-                                       throw new Error( 'Module has not been requested from the server yet: ' + module );
-                               } else if ( registry[module].state === 'loading' ) {
-                                       throw new Error( 'Module has not completed loading yet: ' + module );
-                               } else if ( registry[module].state === 'ready' ) {
-                                       throw new Error( 'Module has already been executed: ' + module );
-                               }
-
-                               /**
-                                * Define loop-function here for efficiency
-                                * and to avoid re-using badly scoped variables.
-                                * @ignore
-                                */
-                               function addLink( media, url ) {
-                                       var el = document.createElement( 'link' );
-                                       // For IE: Insert in document *before* setting href
-                                       getMarker().before( el );
-                                       el.rel = 'stylesheet';
-                                       if ( media && media !== 'all' ) {
-                                               el.media = media;
-                                       }
-                                       // If you end up here from an IE exception "SCRIPT: Invalid property value.",
-                                       // see #addEmbeddedCSS, bug 31676, and bug 47277 for details.
-                                       el.href = url;
-                               }
-
-                               function runScript() {
-                                       var script, markModuleReady, nestedAddScript;
-                                       try {
-                                               script = registry[module].script;
-                                               markModuleReady = function () {
-                                                       registry[module].state = 'ready';
-                                                       handlePending( module );
-                                               };
-                                               nestedAddScript = function ( arr, callback, async, i ) {
-                                                       // Recursively call addScript() in its own callback
-                                                       // for each element of arr.
-                                                       if ( i >= arr.length ) {
-                                                               // We're at the end of the array
-                                                               callback();
-                                                               return;
-                                                       }
-
-                                                       addScript( arr[i], function () {
-                                                               nestedAddScript( arr, callback, async, i + 1 );
-                                                       }, async );
-                                               };
-
-                                               if ( $.isArray( script ) ) {
-                                                       nestedAddScript( script, markModuleReady, registry[module].async, 0 );
-                                               } else if ( $.isFunction( script ) ) {
-                                                       registry[module].state = 'ready';
-                                                       // Pass jQuery twice so that the signature of the closure which wraps
-                                                       // the script can bind both '$' and 'jQuery'.
-                                                       script( $, $ );
-                                                       handlePending( module );
-                                               }
-                                       } catch ( e ) {
-                                               // This needs to NOT use mw.log because these errors are common in production mode
-                                               // and not in debug mode, such as when a symbol that should be global isn't exported
-                                               log( 'Exception thrown by ' + module, e );
-                                               registry[module].state = 'error';
-                                               handlePending( module );
-                                       }
-                               }
-
-                               // This used to be inside runScript, but since that is now fired asychronously
-                               // (after CSS is loaded) we need to set it here right away. It is crucial that
-                               // when execute() is called this is set synchronously, otherwise modules will get
-                               // executed multiple times as the registry will state that it isn't loading yet.
-                               registry[module].state = 'loading';
-
-                               // Add localizations to message system
-                               if ( $.isPlainObject( registry[module].messages ) ) {
-                                       mw.messages.set( registry[module].messages );
-                               }
-
-                               if ( $.isReady || registry[module].async ) {
-                                       // Make sure we don't run the scripts until all (potentially asynchronous)
-                                       // stylesheet insertions have completed.
-                                       ( function () {
-                                               var pending = 0;
-                                               checkCssHandles = function () {
-                                                       // cssHandlesRegistered ensures we don't take off too soon, e.g. when
-                                                       // one of the cssHandles is fired while we're still creating more handles.
-                                                       if ( cssHandlesRegistered && pending === 0 && runScript ) {
-                                                               runScript();
-                                                               runScript = undefined; // Revoke
-                                                       }
-                                               };
-                                               cssHandle = function () {
-                                                       var check = checkCssHandles;
-                                                       pending++;
-                                                       return function () {
-                                                               if (check) {
-                                                                       pending--;
-                                                                       check();
-                                                                       check = undefined; // Revoke
-                                                               }
-                                                       };
-                                               };
-                                       }() );
-                               } else {
-                                       // We are in blocking mode, and so we can't afford to wait for CSS
-                                       cssHandle = function () {};
-                                       // Run immediately
-                                       checkCssHandles = runScript;
-                               }
-
-                               // Process styles (see also mw.loader.implement)
-                               // * back-compat: { <media>: css }
-                               // * back-compat: { <media>: [url, ..] }
-                               // * { "css": [css, ..] }
-                               // * { "url": { <media>: [url, ..] } }
-                               if ( $.isPlainObject( registry[module].style ) ) {
-                                       for ( key in registry[module].style ) {
-                                               value = registry[module].style[key];
-                                               media = undefined;
-
-                                               if ( key !== 'url' && key !== 'css' ) {
-                                                       // Backwards compatibility, key is a media-type
-                                                       if ( typeof value === 'string' ) {
-                                                               // back-compat: { <media>: css }
-                                                               // Ignore 'media' because it isn't supported (nor was it used).
-                                                               // Strings are pre-wrapped in "@media". The media-type was just ""
-                                                               // (because it had to be set to something).
-                                                               // This is one of the reasons why this format is no longer used.
-                                                               addEmbeddedCSS( value, cssHandle() );
-                                                       } else {
-                                                               // back-compat: { <media>: [url, ..] }
-                                                               media = key;
-                                                               key = 'bc-url';
-                                                       }
-                                               }
-
-                                               // Array of css strings in key 'css',
-                                               // or back-compat array of urls from media-type
-                                               if ( $.isArray( value ) ) {
-                                                       for ( i = 0; i < value.length; i += 1 ) {
-                                                               if ( key === 'bc-url' ) {
-                                                                       // back-compat: { <media>: [url, ..] }
-                                                                       addLink( media, value[i] );
-                                                               } else if ( key === 'css' ) {
-                                                                       // { "css": [css, ..] }
-                                                                       addEmbeddedCSS( value[i], cssHandle() );
-                                                               }
-                                                       }
-                                               // Not an array, but a regular object
-                                               // Array of urls inside media-type key
-                                               } else if ( typeof value === 'object' ) {
-                                                       // { "url": { <media>: [url, ..] } }
-                                                       for ( media in value ) {
-                                                               urls = value[media];
-                                                               for ( i = 0; i < urls.length; i += 1 ) {
-                                                                       addLink( media, urls[i] );
-                                                               }
-                                                       }
-                                               }
-                                       }
-                               }
-
-                               // Kick off.
-                               cssHandlesRegistered = true;
-                               checkCssHandles();
-                       }
-
-                       /**
-                        * Adds a dependencies to the queue with optional callbacks to be run
-                        * when the dependencies are ready or fail
-                        *
-                        * @private
-                        * @param {string|string[]} dependencies Module name or array of string module names
-                        * @param {Function} [ready] Callback to execute when all dependencies are ready
-                        * @param {Function} [error] Callback to execute when any dependency fails
-                        * @param {boolean} [async=false] Whether to load modules asynchronously.
-                        *  Ignored (and defaulted to `true`) if the document-ready event has already occurred.
-                        */
-                       function request( dependencies, ready, error, async ) {
-                               var n;
-
-                               // Allow calling by single module name
-                               if ( typeof dependencies === 'string' ) {
-                                       dependencies = [dependencies];
-                               }
-
-                               // Add ready and error callbacks if they were given
-                               if ( ready !== undefined || error !== undefined ) {
-                                       jobs[jobs.length] = {
-                                               'dependencies': filter(
-                                                       ['registered', 'loading', 'loaded'],
-                                                       dependencies
-                                               ),
-                                               'ready': ready,
-                                               'error': error
-                                       };
-                               }
-
-                               // Queue up any dependencies that are registered
-                               dependencies = filter( ['registered'], dependencies );
-                               for ( n = 0; n < dependencies.length; n += 1 ) {
-                                       if ( $.inArray( dependencies[n], queue ) === -1 ) {
-                                               queue[queue.length] = dependencies[n];
-                                               if ( async ) {
-                                                       // Mark this module as async in the registry
-                                                       registry[dependencies[n]].async = true;
-                                               }
-                                       }
-                               }
-
-                               // Work the queue
-                               mw.loader.work();
-                       }
-
-                       function sortQuery( o ) {
-                               var sorted = {}, key, a = [];
-                               for ( key in o ) {
-                                       if ( hasOwn.call( o, key ) ) {
-                                               a.push( key );
-                                       }
-                               }
-                               a.sort();
-                               for ( key = 0; key < a.length; key += 1 ) {
-                                       sorted[a[key]] = o[a[key]];
-                               }
-                               return sorted;
-                       }
-
-                       /**
-                        * Converts a module map of the form { foo: [ 'bar', 'baz' ], bar: [ 'baz, 'quux' ] }
-                        * to a query string of the form foo.bar,baz|bar.baz,quux
-                        * @private
-                        */
-                       function buildModulesString( moduleMap ) {
-                               var arr = [], p, prefix;
-                               for ( prefix in moduleMap ) {
-                                       p = prefix === '' ? '' : prefix + '.';
-                                       arr.push( p + moduleMap[prefix].join( ',' ) );
-                               }
-                               return arr.join( '|' );
-                       }
-
-                       /**
-                        * Asynchronously append a script tag to the end of the body
-                        * that invokes load.php
-                        * @private
-                        * @param {Object} moduleMap Module map, see #buildModulesString
-                        * @param {Object} currReqBase Object with other parameters (other than 'modules') to use in the request
-                        * @param {string} sourceLoadScript URL of load.php
-                        * @param {boolean} async Whether to load modules asynchronously.
-                        *  Ignored (and defaulted to `true`) if the document-ready event has already occurred.
-                        */
-                       function doRequest( moduleMap, currReqBase, sourceLoadScript, async ) {
-                               var request = $.extend(
-                                       { modules: buildModulesString( moduleMap ) },
-                                       currReqBase
-                               );
-                               request = sortQuery( request );
-                               // Append &* to avoid triggering the IE6 extension check
-                               addScript( sourceLoadScript + '?' + $.param( request ) + '&*', null, async );
-                       }
-
-                       /* Public Members */
-                       return {
-                               /**
-                                * The module registry is exposed as an aid for debugging and inspecting page
-                                * state; it is not a public interface for modifying the registry.
-                                *
-                                * @see #registry
-                                * @property
-                                * @private
-                                */
-                               moduleRegistry: registry,
-
-                               /**
-                                * @inheritdoc #newStyleTag
-                                * @method
-                                */
-                               addStyleTag: newStyleTag,
-
-                               /**
-                                * Batch-request queued dependencies from the server.
-                                */
-                               work: function () {
-                                       var     reqBase, splits, maxQueryLength, q, b, bSource, bGroup, bSourceGroup,
-                                               source, concatSource, origBatch, group, g, i, modules, maxVersion, sourceLoadScript,
-                                               currReqBase, currReqBaseLength, moduleMap, l,
-                                               lastDotIndex, prefix, suffix, bytesAdded, async;
-
-                                       // Build a list of request parameters common to all requests.
-                                       reqBase = {
-                                               skin: mw.config.get( 'skin' ),
-                                               lang: mw.config.get( 'wgUserLanguage' ),
-                                               debug: mw.config.get( 'debug' )
-                                       };
-                                       // Split module batch by source and by group.
-                                       splits = {};
-                                       maxQueryLength = mw.config.get( 'wgResourceLoaderMaxQueryLength', -1 );
-
-                                       // Appends a list of modules from the queue to the batch
-                                       for ( q = 0; q < queue.length; q += 1 ) {
-                                               // Only request modules which are registered
-                                               if ( registry[queue[q]] !== undefined && registry[queue[q]].state === 'registered' ) {
-                                                       // Prevent duplicate entries
-                                                       if ( $.inArray( queue[q], batch ) === -1 ) {
-                                                               batch[batch.length] = queue[q];
-                                                               // Mark registered modules as loading
-                                                               registry[queue[q]].state = 'loading';
-                                                       }
-                                               }
-                                       }
-
-                                       mw.loader.store.init();
-                                       if ( mw.loader.store.enabled ) {
-                                               concatSource = [];
-                                               origBatch = batch;
-                                               batch = $.grep( batch, function ( module ) {
-                                                       var source = mw.loader.store.get( module );
-                                                       if ( source ) {
-                                                               concatSource.push( source );
-                                                               return false;
-                                                       }
-                                                       return true;
-                                               } );
-                                               try {
-                                                       $.globalEval( concatSource.join( ';' ) );
-                                               } catch ( err ) {
-                                                       // Not good, the cached mw.loader.implement calls failed! This should
-                                                       // never happen, barring ResourceLoader bugs, browser bugs and PEBKACs.
-                                                       // Depending on how corrupt the string is, it is likely that some
-                                                       // modules' implement() succeeded while the ones after the error will
-                                                       // never run and leave their modules in the 'loading' state forever.
-
-                                                       // Since this is an error not caused by an individual module but by
-                                                       // something that infected the implement call itself, don't take any
-                                                       // risks and clear everything in this cache.
-                                                       mw.loader.store.clear();
-                                                       // Re-add the ones still pending back to the batch and let the server
-                                                       // repopulate these modules to the cache.
-                                                       // This means that at most one module will be useless (the one that had
-                                                       // the error) instead of all of them.
-                                                       log( 'Error while evaluating data from mw.loader.store', err );
-                                                       origBatch = $.grep( origBatch, function ( module ) {
-                                                               return registry[module].state === 'loading';
-                                                       } );
-                                                       batch = batch.concat( origBatch );
-                                               }
-                                       }
-
-                                       // Early exit if there's nothing to load...
-                                       if ( !batch.length ) {
-                                               return;
-                                       }
-
-                                       // The queue has been processed into the batch, clear up the queue.
-                                       queue = [];
-
-                                       // Always order modules alphabetically to help reduce cache
-                                       // misses for otherwise identical content.
-                                       batch.sort();
-
-                                       // Split batch by source and by group.
-                                       for ( b = 0; b < batch.length; b += 1 ) {
-                                               bSource = registry[batch[b]].source;
-                                               bGroup = registry[batch[b]].group;
-                                               if ( splits[bSource] === undefined ) {
-                                                       splits[bSource] = {};
-                                               }
-                                               if ( splits[bSource][bGroup] === undefined ) {
-                                                       splits[bSource][bGroup] = [];
-                                               }
-                                               bSourceGroup = splits[bSource][bGroup];
-                                               bSourceGroup[bSourceGroup.length] = batch[b];
-                                       }
-
-                                       // Clear the batch - this MUST happen before we append any
-                                       // script elements to the body or it's possible that a script
-                                       // will be locally cached, instantly load, and work the batch
-                                       // again, all before we've cleared it causing each request to
-                                       // include modules which are already loaded.
-                                       batch = [];
-
-                                       for ( source in splits ) {
-
-                                               sourceLoadScript = sources[source].loadScript;
-
-                                               for ( group in splits[source] ) {
-
-                                                       // Cache access to currently selected list of
-                                                       // modules for this group from this source.
-                                                       modules = splits[source][group];
-
-                                                       // Calculate the highest timestamp
-                                                       maxVersion = 0;
-                                                       for ( g = 0; g < modules.length; g += 1 ) {
-                                                               if ( registry[modules[g]].version > maxVersion ) {
-                                                                       maxVersion = registry[modules[g]].version;
-                                                               }
-                                                       }
-
-                                                       currReqBase = $.extend( { version: formatVersionNumber( maxVersion ) }, reqBase );
-                                                       // For user modules append a user name to the request.
-                                                       if ( group === 'user' && mw.config.get( 'wgUserName' ) !== null ) {
-                                                               currReqBase.user = mw.config.get( 'wgUserName' );
-                                                       }
-                                                       currReqBaseLength = $.param( currReqBase ).length;
-                                                       async = true;
-                                                       // We may need to split up the request to honor the query string length limit,
-                                                       // so build it piece by piece.
-                                                       l = currReqBaseLength + 9; // '&modules='.length == 9
-
-                                                       moduleMap = {}; // { prefix: [ suffixes ] }
-
-                                                       for ( i = 0; i < modules.length; i += 1 ) {
-                                                               // Determine how many bytes this module would add to the query string
-                                                               lastDotIndex = modules[i].lastIndexOf( '.' );
-                                                               // Note that these substr() calls work even if lastDotIndex == -1
-                                                               prefix = modules[i].substr( 0, lastDotIndex );
-                                                               suffix = modules[i].substr( lastDotIndex + 1 );
-                                                               bytesAdded = moduleMap[prefix] !== undefined
-                                                                       ? suffix.length + 3 // '%2C'.length == 3
-                                                                       : modules[i].length + 3; // '%7C'.length == 3
-
-                                                               // If the request would become too long, create a new one,
-                                                               // but don't create empty requests
-                                                               if ( maxQueryLength > 0 && !$.isEmptyObject( moduleMap ) && l + bytesAdded > maxQueryLength ) {
-                                                                       // This request would become too long, create a new one
-                                                                       // and fire off the old one
-                                                                       doRequest( moduleMap, currReqBase, sourceLoadScript, async );
-                                                                       moduleMap = {};
-                                                                       async = true;
-                                                                       l = currReqBaseLength + 9;
-                                                               }
-                                                               if ( moduleMap[prefix] === undefined ) {
-                                                                       moduleMap[prefix] = [];
-                                                               }
-                                                               moduleMap[prefix].push( suffix );
-                                                               if ( !registry[modules[i]].async ) {
-                                                                       // If this module is blocking, make the entire request blocking
-                                                                       // This is slightly suboptimal, but in practice mixing of blocking
-                                                                       // and async modules will only occur in debug mode.
-                                                                       async = false;
-                                                               }
-                                                               l += bytesAdded;
-                                                       }
-                                                       // If there's anything left in moduleMap, request that too
-                                                       if ( !$.isEmptyObject( moduleMap ) ) {
-                                                               doRequest( moduleMap, currReqBase, sourceLoadScript, async );
-                                                       }
-                                               }
-                                       }
-                               },
-
-                               /**
-                                * Register a source.
-                                *
-                                * The #work method will use this information to split up requests by source.
-                                *
-                                *     mw.loader.addSource( 'mediawikiwiki', { loadScript: '//www.mediawiki.org/w/load.php' } );
-                                *
-                                * @param {string} id Short string representing a source wiki, used internally for
-                                *  registered modules to indicate where they should be loaded from (usually lowercase a-z).
-                                * @param {Object} props
-                                * @param {string} props.loadScript Url to the load.php entry point of the source wiki.
-                                * @return {boolean}
-                                */
-                               addSource: function ( id, props ) {
-                                       var source;
-                                       // Allow multiple additions
-                                       if ( typeof id === 'object' ) {
-                                               for ( source in id ) {
-                                                       mw.loader.addSource( source, id[source] );
-                                               }
-                                               return true;
-                                       }
-
-                                       if ( sources[id] !== undefined ) {
-                                               throw new Error( 'source already registered: ' + id );
-                                       }
-
-                                       sources[id] = props;
-
-                                       return true;
-                               },
-
-                               /**
-                                * Register a module, letting the system know about it and its
-                                * properties. Startup modules contain calls to this function.
-                                *
-                                * @param {string} module Module name
-                                * @param {number} version Module version number as a timestamp (falls backs to 0)
-                                * @param {string|Array|Function} dependencies One string or array of strings of module
-                                *  names on which this module depends, or a function that returns that array.
-                                * @param {string} [group=null] Group which the module is in
-                                * @param {string} [source='local'] Name of the source
-                                */
-                               register: function ( module, version, dependencies, group, source ) {
-                                       var m;
-                                       // Allow multiple registration
-                                       if ( typeof module === 'object' ) {
-                                               for ( m = 0; m < module.length; m += 1 ) {
-                                                       // module is an array of module names
-                                                       if ( typeof module[m] === 'string' ) {
-                                                               mw.loader.register( module[m] );
-                                                       // module is an array of arrays
-                                                       } else if ( typeof module[m] === 'object' ) {
-                                                               mw.loader.register.apply( mw.loader, module[m] );
-                                                       }
-                                               }
-                                               return;
-                                       }
-                                       // Validate input
-                                       if ( typeof module !== 'string' ) {
-                                               throw new Error( 'module must be a string, not a ' + typeof module );
-                                       }
-                                       if ( registry[module] !== undefined ) {
-                                               throw new Error( 'module already registered: ' + module );
-                                       }
-                                       // List the module as registered
-                                       registry[module] = {
-                                               version: version !== undefined ? parseInt( version, 10 ) : 0,
-                                               dependencies: [],
-                                               group: typeof group === 'string' ? group : null,
-                                               source: typeof source === 'string' ? source: 'local',
-                                               state: 'registered'
-                                       };
-                                       if ( typeof dependencies === 'string' ) {
-                                               // Allow dependencies to be given as a single module name
-                                               registry[module].dependencies = [ dependencies ];
-                                       } else if ( typeof dependencies === 'object' || $.isFunction( dependencies ) ) {
-                                               // Allow dependencies to be given as an array of module names
-                                               // or a function which returns an array
-                                               registry[module].dependencies = dependencies;
-                                       }
-                               },
-
-                               /**
-                                * Implement a module given the components that make up the module.
-                                *
-                                * When #load or #using requests one or more modules, the server
-                                * response contain calls to this function.
-                                *
-                                * All arguments are required.
-                                *
-                                * @param {string} module Name of module
-                                * @param {Function|Array} script Function with module code or Array of URLs to
-                                *  be used as the src attribute of a new `<script>` tag.
-                                * @param {Object} style Should follow one of the following patterns:
-                                *
-                                *     { "css": [css, ..] }
-                                *     { "url": { <media>: [url, ..] } }
-                                *
-                                * And for backwards compatibility (needs to be supported forever due to caching):
-                                *
-                                *     { <media>: css }
-                                *     { <media>: [url, ..] }
-                                *
-                                * The reason css strings are not concatenated anymore is bug 31676. We now check
-                                * whether it's safe to extend the stylesheet (see #canExpandStylesheetWith).
-                                *
-                                * @param {Object} msgs List of key/value pairs to be added to mw#messages.
-                                */
-                               implement: function ( module, script, style, msgs ) {
-                                       // Validate input
-                                       if ( typeof module !== 'string' ) {
-                                               throw new Error( 'module must be a string, not a ' + typeof module );
-                                       }
-                                       if ( !$.isFunction( script ) && !$.isArray( script ) ) {
-                                               throw new Error( 'script must be a function or an array, not a ' + typeof script );
-                                       }
-                                       if ( !$.isPlainObject( style ) ) {
-                                               throw new Error( 'style must be an object, not a ' + typeof style );
-                                       }
-                                       if ( !$.isPlainObject( msgs ) ) {
-                                               throw new Error( 'msgs must be an object, not a ' + typeof msgs );
-                                       }
-                                       // Automatically register module
-                                       if ( registry[module] === undefined ) {
-                                               mw.loader.register( module );
-                                       }
-                                       // Check for duplicate implementation
-                                       if ( registry[module] !== undefined && registry[module].script !== undefined ) {
-                                               throw new Error( 'module already implemented: ' + module );
-                                       }
-                                       // Attach components
-                                       registry[module].script = script;
-                                       registry[module].style = style;
-                                       registry[module].messages = msgs;
-                                       // The module may already have been marked as erroneous
-                                       if ( $.inArray( registry[module].state, ['error', 'missing'] ) === -1 ) {
-                                               registry[module].state = 'loaded';
-                                               if ( allReady( registry[module].dependencies ) ) {
-                                                       execute( module );
-                                               }
-                                       }
-                               },
-
-                               /**
-                                * Execute a function as soon as one or more required modules are ready.
-                                *
-                                * Example of inline dependency on OOjs:
-                                *
-                                *     mw.loader.using( 'oojs', function () {
-                                *         OO.compare( [ 1 ], [ 1 ] );
-                                *     } );
-                                *
-                                * @param {string|Array} dependencies Module name or array of modules names the callback
-                                *  dependends on to be ready before executing
-                                * @param {Function} [ready] Callback to execute when all dependencies are ready
-                                * @param {Function} [error] Callback to execute if one or more dependencies failed
-                                * @return {jQuery.Promise}
-                                */
-                               using: function ( dependencies, ready, error ) {
-                                       var deferred = $.Deferred();
-
-                                       // Allow calling with a single dependency as a string
-                                       if ( typeof dependencies === 'string' ) {
-                                               dependencies = [ dependencies ];
-                                       } else if ( !$.isArray( dependencies ) ) {
-                                               // Invalid input
-                                               throw new Error( 'Dependencies must be a string or an array' );
-                                       }
-
-                                       if ( ready ) {
-                                               deferred.done( ready );
-                                       }
-                                       if ( error ) {
-                                               deferred.fail( error );
-                                       }
-
-                                       // Resolve entire dependency map
-                                       dependencies = resolve( dependencies );
-                                       if ( allReady( dependencies ) ) {
-                                               // Run ready immediately
-                                               deferred.resolve();
-                                       } else if ( filter( ['error', 'missing'], dependencies ).length ) {
-                                               // Execute error immediately if any dependencies have errors
-                                               deferred.reject(
-                                                       new Error( 'One or more dependencies failed to load' ),
-                                                       dependencies
-                                               );
-                                       } else {
-                                               // Not all dependencies are ready: queue up a request
-                                               request( dependencies, deferred.resolve, deferred.reject );
-                                       }
-
-                                       return deferred.promise();
-                               },
-
-                               /**
-                                * Load an external script or one or more modules.
-                                *
-                                * @param {string|Array} modules Either the name of a module, array of modules,
-                                *  or a URL of an external script or style
-                                * @param {string} [type='text/javascript'] mime-type to use if calling with a URL of an
-                                *  external script or style; acceptable values are "text/css" and
-                                *  "text/javascript"; if no type is provided, text/javascript is assumed.
-                                * @param {boolean} [async] Whether to load modules asynchronously.
-                                *  Ignored (and defaulted to `true`) if the document-ready event has already occurred.
-                                *  Defaults to `true` if loading a URL, `false` otherwise.
-                                */
-                               load: function ( modules, type, async ) {
-                                       var filtered, m, module, l;
-
-                                       // Validate input
-                                       if ( typeof modules !== 'object' && typeof modules !== 'string' ) {
-                                               throw new Error( 'modules must be a string or an array, not a ' + typeof modules );
-                                       }
-                                       // Allow calling with an external url or single dependency as a string
-                                       if ( typeof modules === 'string' ) {
-                                               // Support adding arbitrary external scripts
-                                               if ( /^(https?:)?\/\//.test( modules ) ) {
-                                                       if ( async === undefined ) {
-                                                               // Assume async for bug 34542
-                                                               async = true;
-                                                       }
-                                                       if ( type === 'text/css' ) {
-                                                               // IE7-8 throws security warnings when inserting a <link> tag
-                                                               // with a protocol-relative URL set though attributes (instead of
-                                                               // properties) - when on HTTPS. See also bug 41331.
-                                                               l = document.createElement( 'link' );
-                                                               l.rel = 'stylesheet';
-                                                               l.href = modules;
-                                                               $( 'head' ).append( l );
-                                                               return;
-                                                       }
-                                                       if ( type === 'text/javascript' || type === undefined ) {
-                                                               addScript( modules, null, async );
-                                                               return;
-                                                       }
-                                                       // Unknown type
-                                                       throw new Error( 'invalid type for external url, must be text/css or text/javascript. not ' + type );
-                                               }
-                                               // Called with single module
-                                               modules = [ modules ];
-                                       }
-
-                                       // Filter out undefined modules, otherwise resolve() will throw
-                                       // an exception for trying to load an undefined module.
-                                       // Undefined modules are acceptable here in load(), because load() takes
-                                       // an array of unrelated modules, whereas the modules passed to
-                                       // using() are related and must all be loaded.
-                                       for ( filtered = [], m = 0; m < modules.length; m += 1 ) {
-                                               module = registry[modules[m]];
-                                               if ( module !== undefined ) {
-                                                       if ( $.inArray( module.state, ['error', 'missing'] ) === -1 ) {
-                                                               filtered[filtered.length] = modules[m];
-                                                       }
-                                               }
-                                       }
-
-                                       if ( filtered.length === 0 ) {
-                                               return;
-                                       }
-                                       // Resolve entire dependency map
-                                       filtered = resolve( filtered );
-                                       // If all modules are ready, nothing to be done
-                                       if ( allReady( filtered ) ) {
-                                               return;
-                                       }
-                                       // If any modules have errors: also quit.
-                                       if ( filter( ['error', 'missing'], filtered ).length ) {
-                                               return;
-                                       }
-                                       // Since some modules are not yet ready, queue up a request.
-                                       request( filtered, undefined, undefined, async );
-                               },
-
-                               /**
-                                * Change the state of one or more modules.
-                                *
-                                * @param {string|Object} module Module name or object of module name/state pairs
-                                * @param {string} state State name
-                                */
-                               state: function ( module, state ) {
-                                       var m;
-
-                                       if ( typeof module === 'object' ) {
-                                               for ( m in module ) {
-                                                       mw.loader.state( m, module[m] );
-                                               }
-                                               return;
-                                       }
-                                       if ( registry[module] === undefined ) {
-                                               mw.loader.register( module );
-                                       }
-                                       if ( $.inArray( state, ['ready', 'error', 'missing'] ) !== -1
-                                               && registry[module].state !== state ) {
-                                               // Make sure pending modules depending on this one get executed if their
-                                               // dependencies are now fulfilled!
-                                               registry[module].state = state;
-                                               handlePending( module );
-                                       } else {
-                                               registry[module].state = state;
-                                       }
-                               },
-
-                               /**
-                                * Get the version of a module.
-                                *
-                                * @param {string} module Name of module to get version for
-                                * @return {string|null} The version, or null if the module (or its version) is not
-                                *  in the registry.
-                                */
-                               getVersion: function ( module ) {
-                                       if ( registry[module] !== undefined && registry[module].version !== undefined ) {
-                                               return formatVersionNumber( registry[module].version );
-                                       }
-                                       return null;
-                               },
-
-                               /**
-                                * Get the state of a module.
-                                *
-                                * @param {string} module Name of module to get state for
-                                */
-                               getState: function ( module ) {
-                                       if ( registry[module] !== undefined && registry[module].state !== undefined ) {
-                                               return registry[module].state;
-                                       }
-                                       return null;
-                               },
-
-                               /**
-                                * Get the names of all registered modules.
-                                *
-                                * @return {Array}
-                                */
-                               getModuleNames: function () {
-                                       return $.map( registry, function ( i, key ) {
-                                               return key;
-                                       } );
-                               },
-
-                               /**
-                                * @inheritdoc mw.inspect#runReports
-                                * @method
-                                */
-                               inspect: function () {
-                                       var args = slice.call( arguments );
-                                       mw.loader.using( 'mediawiki.inspect', function () {
-                                               mw.inspect.runReports.apply( mw.inspect, args );
-                                       } );
-                               },
-
-                               /**
-                                * On browsers that implement the localStorage API, the module store serves as a
-                                * smart complement to the browser cache. Unlike the browser cache, the module store
-                                * can slice a concatenated response from ResourceLoader into its constituent
-                                * modules and cache each of them separately, using each module's versioning scheme
-                                * to determine when the cache should be invalidated.
-                                *
-                                * @singleton
-                                * @class mw.loader.store
-                                */
-                               store: {
-                                       // Whether the store is in use on this page.
-                                       enabled: null,
-
-                                       // The contents of the store, mapping '[module name]@[version]' keys
-                                       // to module implementations.
-                                       items: {},
-
-                                       // Cache hit stats
-                                       stats: { hits: 0, misses: 0, expired: 0 },
-
-                                       /**
-                                        * Construct a JSON-serializable object representing the content of the store.
-                                        * @return {Object} Module store contents.
-                                        */
-                                       toJSON: function () {
-                                               return { items: mw.loader.store.items, vary: mw.loader.store.getVary() };
-                                       },
-
-                                       /**
-                                        * Get the localStorage key for the entire module store. The key references
-                                        * $wgDBname to prevent clashes between wikis which share a common host.
-                                        *
-                                        * @return {string} localStorage item key
-                                        */
-                                       getStoreKey: function () {
-                                               return 'MediaWikiModuleStore:' + mw.config.get( 'wgDBname' );
-                                       },
-
-                                       /**
-                                        * Get a string key on which to vary the module cache.
-                                        * @return {string} String of concatenated vary conditions.
-                                        */
-                                       getVary: function () {
-                                               return [
-                                                       mw.config.get( 'skin' ),
-                                                       mw.config.get( 'wgResourceLoaderStorageVersion' ),
-                                                       mw.config.get( 'wgUserLanguage' )
-                                               ].join( ':' );
-                                       },
-
-                                       /**
-                                        * Get a string key for a specific module. The key format is '[name]@[version]'.
-                                        *
-                                        * @param {string} module Module name
-                                        * @return {string|null} Module key or null if module does not exist
-                                        */
-                                       getModuleKey: function ( module ) {
-                                               return typeof registry[module] === 'object' ?
-                                                       ( module + '@' + registry[module].version ) : null;
-                                       },
-
-                                       /**
-                                        * Initialize the store.
-                                        *
-                                        * Retrieves store from localStorage and (if successfully retrieved) decoding
-                                        * the stored JSON value to a plain object.
-                                        *
-                                        * The try / catch block is used for JSON & localStorage feature detection.
-                                        * See the in-line documentation for Modernizr's localStorage feature detection
-                                        * code for a full account of why we need a try / catch:
-                                        * <https://github.com/Modernizr/Modernizr/blob/v2.7.1/modernizr.js#L771-L796>.
-                                        */
-                                       init: function () {
-                                               var raw, data;
-
-                                               if ( mw.loader.store.enabled !== null ) {
-                                                       // Init already ran
-                                                       return;
-                                               }
-
-                                               if ( !mw.config.get( 'wgResourceLoaderStorageEnabled' ) || mw.config.get( 'debug' ) ) {
-                                                       // Disabled by configuration, or because debug mode is set
-                                                       mw.loader.store.enabled = false;
-                                                       return;
-                                               }
-
-                                               try {
-                                                       raw = localStorage.getItem( mw.loader.store.getStoreKey() );
-                                                       // If we get here, localStorage is available; mark enabled
-                                                       mw.loader.store.enabled = true;
-                                                       data = JSON.parse( raw );
-                                                       if ( data && typeof data.items === 'object' && data.vary === mw.loader.store.getVary() ) {
-                                                               mw.loader.store.items = data.items;
-                                                               return;
-                                                       }
-                                               } catch ( e ) {}
-
-                                               if ( raw === undefined ) {
-                                                       // localStorage failed; disable store
-                                                       mw.loader.store.enabled = false;
-                                               } else {
-                                                       mw.loader.store.update();
-                                               }
-                                       },
-
-                                       /**
-                                        * Retrieve a module from the store and update cache hit stats.
-                                        *
-                                        * @param {string} module Module name
-                                        * @return {string|boolean} Module implementation or false if unavailable
-                                        */
-                                       get: function ( module ) {
-                                               var key;
-
-                                               if ( !mw.loader.store.enabled ) {
-                                                       return false;
-                                               }
-
-                                               key = mw.loader.store.getModuleKey( module );
-                                               if ( key in mw.loader.store.items ) {
-                                                       mw.loader.store.stats.hits++;
-                                                       return mw.loader.store.items[key];
-                                               }
-                                               mw.loader.store.stats.misses++;
-                                               return false;
-                                       },
-
-                                       /**
-                                        * Stringify a module and queue it for storage.
-                                        *
-                                        * @param {string} module Module name
-                                        * @param {Object} descriptor The module's descriptor as set in the registry
-                                        */
-                                       set: function ( module, descriptor ) {
-                                               var args, key;
-
-                                               if ( !mw.loader.store.enabled ) {
-                                                       return false;
-                                               }
-
-                                               key = mw.loader.store.getModuleKey( module );
-
-                                               if (
-                                                       // Already stored a copy of this exact version
-                                                       key in mw.loader.store.items ||
-                                                       // Module failed to load
-                                                       descriptor.state !== 'ready' ||
-                                                       // Unversioned, private, or site-/user-specific
-                                                       ( !descriptor.version || $.inArray( descriptor.group, [ 'private', 'user', 'site' ] ) !== -1 ) ||
-                                                       // Partial descriptor
-                                                       $.inArray( undefined, [ descriptor.script, descriptor.style, descriptor.messages ] ) !== -1
-                                               ) {
-                                                       // Decline to store
-                                                       return false;
-                                               }
-
-                                               try {
-                                                       args = [
-                                                               JSON.stringify( module ),
-                                                               typeof descriptor.script === 'function' ?
-                                                                       String( descriptor.script ) :
-                                                                       JSON.stringify( descriptor.script ),
-                                                               JSON.stringify( descriptor.style ),
-                                                               JSON.stringify( descriptor.messages )
-                                                       ];
-                                                       // Attempted workaround for a possible Opera bug (bug 57567).
-                                                       // This regex should never match under sane conditions.
-                                                       if ( /^\s*\(/.test( args[1] ) ) {
-                                                               args[1] = 'function' + args[1];
-                                                               log( 'Detected malformed function stringification (bug 57567)' );
-                                                       }
-                                               } catch ( e ) {
-                                                       return;
-                                               }
-
-                                               mw.loader.store.items[key] = 'mw.loader.implement(' + args.join( ',' ) + ');';
-                                               mw.loader.store.update();
-                                       },
-
-                                       /**
-                                        * Iterate through the module store, removing any item that does not correspond
-                                        * (in name and version) to an item in the module registry.
-                                        */
-                                       prune: function () {
-                                               var key, module;
-
-                                               if ( !mw.loader.store.enabled ) {
-                                                       return false;
-                                               }
-
-                                               for ( key in mw.loader.store.items ) {
-                                                       module = key.substring( 0, key.indexOf( '@' ) );
-                                                       if ( mw.loader.store.getModuleKey( module ) !== key ) {
-                                                               mw.loader.store.stats.expired++;
-                                                               delete mw.loader.store.items[key];
-                                                       }
-                                               }
-                                       },
-
-                                       /**
-                                        * Clear the entire module store right now.
-                                        */
-                                       clear: function () {
-                                               mw.loader.store.items = {};
-                                               localStorage.removeItem( mw.loader.store.getStoreKey() );
-                                       },
-
-                                       /**
-                                        * Sync modules to localStorage.
-                                        *
-                                        * This function debounces localStorage updates. When called multiple times in
-                                        * quick succession, the calls are coalesced into a single update operation.
-                                        * This allows us to call #update without having to consider the module load
-                                        * queue; the call to localStorage.setItem will be naturally deferred until the
-                                        * page is quiescent.
-                                        *
-                                        * Because localStorage is shared by all pages with the same origin, if multiple
-                                        * pages are loaded with different module sets, the possibility exists that
-                                        * modules saved by one page will be clobbered by another. But the impact would
-                                        * be minor and the problem would be corrected by subsequent page views.
-                                        *
-                                        * @method
-                                        */
-                                       update: ( function () {
-                                               var timer;
-
-                                               function flush() {
-                                                       var data,
-                                                               key = mw.loader.store.getStoreKey();
-
-                                                       if ( !mw.loader.store.enabled ) {
-                                                               return false;
-                                                       }
-                                                       mw.loader.store.prune();
-                                                       try {
-                                                               // Replacing the content of the module store might fail if the new
-                                                               // contents would exceed the browser's localStorage size limit. To
-                                                               // avoid clogging the browser with stale data, always remove the old
-                                                               // value before attempting to set the new one.
-                                                               localStorage.removeItem( key );
-                                                               data = JSON.stringify( mw.loader.store );
-                                                               localStorage.setItem( key, data );
-                                                       } catch ( e ) {}
-                                               }
-
-                                               return function () {
-                                                       clearTimeout( timer );
-                                                       timer = setTimeout( flush, 2000 );
-                                               };
-                                       }() )
-                               }
-                       };
-               }() ),
-
-               /**
-                * HTML construction helper functions
-                *
-                *     @example
-                *
-                *     var Html, output;
-                *
-                *     Html = mw.html;
-                *     output = Html.element( 'div', {}, new Html.Raw(
-                *         Html.element( 'img', { src: '<' } )
-                *     ) );
-                *     mw.log( output ); // <div><img src="&lt;"/></div>
-                *
-                * @class mw.html
-                * @singleton
-                */
-               html: ( function () {
-                       function escapeCallback( s ) {
-                               switch ( s ) {
-                                       case '\'':
-                                               return '&#039;';
-                                       case '"':
-                                               return '&quot;';
-                                       case '<':
-                                               return '&lt;';
-                                       case '>':
-                                               return '&gt;';
-                                       case '&':
-                                               return '&amp;';
-                               }
-                       }
-
-                       return {
-                               /**
-                                * Escape a string for HTML. Converts special characters to HTML entities.
-                                *
-                                *     mw.html.escape( '< > \' & "' );
-                                *     // Returns &lt; &gt; &#039; &amp; &quot;
-                                *
-                                * @param {string} s The string to escape
-                                */
-                               escape: function ( s ) {
-                                       return s.replace( /['"<>&]/g, escapeCallback );
-                               },
-
-                               /**
-                                * Create an HTML element string, with safe escaping.
-                                *
-                                * @param {string} name The tag name.
-                                * @param {Object} attrs An object with members mapping element names to values
-                                * @param {Mixed} contents The contents of the element. May be either:
-                                *
-                                *  - string: The string is escaped.
-                                *  - null or undefined: The short closing form is used, e.g. `<br/>`.
-                                *  - this.Raw: The value attribute is included without escaping.
-                                *  - this.Cdata: The value attribute is included, and an exception is
-                                *   thrown if it contains an illegal ETAGO delimiter.
-                                *   See <http://www.w3.org/TR/1999/REC-html401-19991224/appendix/notes.html#h-B.3.2>.
-                                */
-                               element: function ( name, attrs, contents ) {
-                                       var v, attrName, s = '<' + name;
-
-                                       for ( attrName in attrs ) {
-                                               v = attrs[attrName];
-                                               // Convert name=true, to name=name
-                                               if ( v === true ) {
-                                                       v = attrName;
-                                               // Skip name=false
-                                               } else if ( v === false ) {
-                                                       continue;
-                                               }
-                                               s += ' ' + attrName + '="' + this.escape( String( v ) ) + '"';
-                                       }
-                                       if ( contents === undefined || contents === null ) {
-                                               // Self close tag
-                                               s += '/>';
-                                               return s;
-                                       }
-                                       // Regular open tag
-                                       s += '>';
-                                       switch ( typeof contents ) {
-                                               case 'string':
-                                                       // Escaped
-                                                       s += this.escape( contents );
-                                                       break;
-                                               case 'number':
-                                               case 'boolean':
-                                                       // Convert to string
-                                                       s += String( contents );
-                                                       break;
-                                               default:
-                                                       if ( contents instanceof this.Raw ) {
-                                                               // Raw HTML inclusion
-                                                               s += contents.value;
-                                                       } else if ( contents instanceof this.Cdata ) {
-                                                               // CDATA
-                                                               if ( /<\/[a-zA-z]/.test( contents.value ) ) {
-                                                                       throw new Error( 'mw.html.element: Illegal end tag found in CDATA' );
-                                                               }
-                                                               s += contents.value;
-                                                       } else {
-                                                               throw new Error( 'mw.html.element: Invalid type of contents' );
-                                                       }
-                                       }
-                                       s += '</' + name + '>';
-                                       return s;
-                               },
-
-                               /**
-                                * Wrapper object for raw HTML passed to mw.html.element().
-                                * @class mw.html.Raw
-                                */
-                               Raw: function ( value ) {
-                                       this.value = value;
-                               },
-
-                               /**
-                                * Wrapper object for CDATA element contents passed to mw.html.element()
-                                * @class mw.html.Cdata
-                                */
-                               Cdata: function ( value ) {
-                                       this.value = value;
-                               }
-                       };
-               }() ),
-
-               // Skeleton user object. mediawiki.user.js extends this
-               user: {
-                       options: new Map(),
-                       tokens: new Map()
-               },
-
-               /**
-                * Registry and firing of events.
-                *
-                * MediaWiki has various interface components that are extended, enhanced
-                * or manipulated in some other way by extensions, gadgets and even
-                * in core itself.
-                *
-                * This framework helps streamlining the timing of when these other
-                * code paths fire their plugins (instead of using document-ready,
-                * which can and should be limited to firing only once).
-                *
-                * Features like navigating to other wiki pages, previewing an edit
-                * and editing itself – without a refresh – can then retrigger these
-                * hooks accordingly to ensure everything still works as expected.
-                *
-                * Example usage:
-                *
-                *     mw.hook( 'wikipage.content' ).add( fn ).remove( fn );
-                *     mw.hook( 'wikipage.content' ).fire( $content );
-                *
-                * Handlers can be added and fired for arbitrary event names at any time. The same
-                * event can be fired multiple times. The last run of an event is memorized
-                * (similar to `$(document).ready` and `$.Deferred().done`).
-                * This means if an event is fired, and a handler added afterwards, the added
-                * function will be fired right away with the last given event data.
-                *
-                * Like Deferreds and Promises, the mw.hook object is both detachable and chainable.
-                * Thus allowing flexible use and optimal maintainability and authority control.
-                * You can pass around the `add` and/or `fire` method to another piece of code
-                * without it having to know the event name (or `mw.hook` for that matter).
-                *
-                *     var h = mw.hook( 'bar.ready' );
-                *     new mw.Foo( .. ).fetch( { callback: h.fire } );
-                *
-                * Note: Events are documented with an underscore instead of a dot in the event
-                * name due to jsduck not supporting dots in that position.
-                *
-                * @class mw.hook
-                */
-               hook: ( function () {
-                       var lists = {};
-
-                       /**
-                        * Create an instance of mw.hook.
-                        *
-                        * @method hook
-                        * @member mw
-                        * @param {string} name Name of hook.
-                        * @return {mw.hook}
-                        */
-                       return function ( name ) {
-                               var list = lists[name] || ( lists[name] = $.Callbacks( 'memory' ) );
-
-                               return {
-                                       /**
-                                        * Register a hook handler
-                                        * @param {Function...} handler Function to bind.
-                                        * @chainable
-                                        */
-                                       add: list.add,
-
-                                       /**
-                                        * Unregister a hook handler
-                                        * @param {Function...} handler Function to unbind.
-                                        * @chainable
-                                        */
-                                       remove: list.remove,
-
-                                       /**
-                                        * Run a hook.
-                                        * @param {Mixed...} data
-                                        * @chainable
-                                        */
-                                       fire: function () {
-                                               return list.fireWith( null, slice.call( arguments ) );
-                                       }
-                               };
-                       };
-               }() )
-       };
-
-}( jQuery ) );
-
-// Alias $j to jQuery for backwards compatibility
-// @deprecated since 1.23 Use $ or jQuery instead
-mw.log.deprecate( window, '$j', jQuery, 'Use $ or jQuery instead.' );
-
-// Attach to window and globally alias
-window.mw = window.mediaWiki = mw;
-
-// Auto-register from pre-loaded startup scripts
-if ( jQuery.isFunction( window.startUp ) ) {
-       window.startUp();
-       window.startUp = undefined;
-}
diff --git a/resources/mediawiki/mediawiki.log.js b/resources/mediawiki/mediawiki.log.js
deleted file mode 100644 (file)
index 2ca0bbd..0000000
+++ /dev/null
@@ -1,84 +0,0 @@
-/*!
- * Logger for MediaWiki javascript.
- * Implements the stub left by the main 'mediawiki' module.
- *
- * @author Michael Dale <mdale@wikimedia.org>
- * @author Trevor Parscal <tparscal@wikimedia.org>
- */
-
-( function ( mw, $ ) {
-
-       // Reference to dummy
-       // We don't need the dummy, but it has other methods on it
-       // that we need to restore afterwards.
-       var original = mw.log,
-               slice = Array.prototype.slice;
-
-       /**
-        * Logs a message to the console in debug mode.
-        *
-        * In the case the browser does not have a console API, a console is created on-the-fly by appending
-        * a `<div id="mw-log-console">` element to the bottom of the body and then appending this and future
-        * messages to that, instead of the console.
-        *
-        * @member mw.log
-        * @param {string...} msg Messages to output to console.
-        */
-       mw.log = function () {
-               // Turn arguments into an array
-               var args = slice.call( arguments ),
-                       // Allow log messages to use a configured prefix to identify the source window (ie. frame)
-                       prefix = mw.config.exists( 'mw.log.prefix' ) ? mw.config.get( 'mw.log.prefix' ) + '> ' : '';
-
-               // Try to use an existing console
-               // Generally we can cache this, but in this case we want to re-evaluate this as a
-               // global property live so that things like Firebug Lite can take precedence.
-               if ( window.console && window.console.log && window.console.log.apply ) {
-                       args.unshift( prefix );
-                       window.console.log.apply( window.console, args );
-                       return;
-               }
-
-               // If there is no console, use our own log box
-               mw.loader.using( 'jquery.footHovzer', function () {
-
-                       var     hovzer,
-                               d = new Date(),
-                               // Create HH:MM:SS.MIL timestamp
-                               time = ( d.getHours() < 10 ? '0' + d.getHours() : d.getHours() ) +
-                                ':' + ( d.getMinutes() < 10 ? '0' + d.getMinutes() : d.getMinutes() ) +
-                                ':' + ( d.getSeconds() < 10 ? '0' + d.getSeconds() : d.getSeconds() ) +
-                                '.' + ( d.getMilliseconds() < 10 ? '00' + d.getMilliseconds() : ( d.getMilliseconds() < 100 ? '0' + d.getMilliseconds() : d.getMilliseconds() ) ),
-                                $log = $( '#mw-log-console' );
-
-                       if ( !$log.length ) {
-                               $log = $( '<div id="mw-log-console"></div>' ).css( {
-                                               overflow: 'auto',
-                                               height: '150px',
-                                               backgroundColor: 'white',
-                                               borderTop: 'solid 2px #ADADAD'
-                                       } );
-                               hovzer = $.getFootHovzer();
-                               hovzer.$.append( $log );
-                               hovzer.update();
-                       }
-                       $log.append(
-                               $( '<div>' )
-                                       .css( {
-                                               borderBottom: 'solid 1px #DDDDDD',
-                                               fontSize: 'small',
-                                               fontFamily: 'monospace',
-                                               whiteSpace: 'pre-wrap',
-                                               padding: '0.125em 0.25em'
-                                       } )
-                                       .text( prefix + args.join( ', ' ) )
-                                       .prepend( '<span style="float: right;">[' + time + ']</span>' )
-                       );
-               } );
-       };
-
-       // Restore original methods
-       mw.log.warn = original.warn;
-       mw.log.deprecate = original.deprecate;
-
-}( mediaWiki, jQuery ) );
diff --git a/resources/mediawiki/mediawiki.notification.css b/resources/mediawiki/mediawiki.notification.css
deleted file mode 100644 (file)
index 0c8152e..0000000
+++ /dev/null
@@ -1,32 +0,0 @@
-.mw-notification-area {
-       position: absolute;
-       top: 0;
-       right: 0;
-       padding: 1em 1em 0 0;
-       width: 20em;
-       line-height: 1.35;
-       z-index: 10000;
-}
-
-.mw-notification-area-floating {
-       position: fixed;
-}
-
-* html .mw-notification-area-floating {
-       /* Make it at least 'absolute' in IE6 since 'fixed' is not supported */
-       position: absolute;
-}
-
-.mw-notification {
-       padding: 0.25em 1em;
-       margin-bottom: 0.5em;
-       border: solid 1px #ddd;
-       background-color: #fcfcfc;
-       /* Message hides on-click */
-       /* See also mediawiki.notification.js */
-       cursor: pointer;
-}
-
-.mw-notification-title {
-       font-weight: bold;
-}
diff --git a/resources/mediawiki/mediawiki.notification.hideForPrint.css b/resources/mediawiki/mediawiki.notification.hideForPrint.css
deleted file mode 100644 (file)
index 4f9162e..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-.mw-notification-area {
-       display: none;
-}
diff --git a/resources/mediawiki/mediawiki.notification.js b/resources/mediawiki/mediawiki.notification.js
deleted file mode 100644 (file)
index b5fd69c..0000000
+++ /dev/null
@@ -1,522 +0,0 @@
-( function ( mw, $ ) {
-       'use strict';
-
-       var notification,
-               // The #mw-notification-area div that all notifications are contained inside.
-               $area,
-               // Number of open notification boxes at any time
-               openNotificationCount = 0,
-               isPageReady = false,
-               preReadyNotifQueue = [];
-
-       /**
-        * A Notification object for 1 message.
-        *
-        * The "_" in the name is to avoid a bug (http://github.com/senchalabs/jsduck/issues/304).
-        * It is not part of the actual class name.
-        *
-        * @class mw.Notification_
-        * @alternateClassName mw.Notification
-        *
-        * @constructor The constructor is not publicly accessible; use mw.notification#notify instead.
-        *  This does not insert anything into the document (see #start).
-        * @private
-        */
-       function Notification( message, options ) {
-               var $notification, $notificationTitle, $notificationContent;
-
-               $notification = $( '<div class="mw-notification"></div>' )
-                       .data( 'mw.notification', this )
-                       .addClass( options.autoHide ? 'mw-notification-autohide' : 'mw-notification-noautohide' );
-
-               if ( options.tag ) {
-                       // Sanitize options.tag before it is used by any code. (Including Notification class methods)
-                       options.tag = options.tag.replace( /[ _\-]+/g, '-' ).replace( /[^\-a-z0-9]+/ig, '' );
-                       if ( options.tag ) {
-                               $notification.addClass( 'mw-notification-tag-' + options.tag );
-                       } else {
-                               delete options.tag;
-                       }
-               }
-
-               if ( options.title ) {
-                       $notificationTitle = $( '<div class="mw-notification-title"></div>' )
-                               .text( options.title )
-                               .appendTo( $notification );
-               }
-
-               $notificationContent = $( '<div class="mw-notification-content"></div>' );
-
-               if ( typeof message === 'object' ) {
-                       // Handle mw.Message objects separately from DOM nodes and jQuery objects
-                       if ( message instanceof mw.Message ) {
-                               $notificationContent.html( message.parse() );
-                       } else {
-                               $notificationContent.append( message );
-                       }
-               } else {
-                       $notificationContent.text( message );
-               }
-
-               $notificationContent.appendTo( $notification );
-
-               // Private state parameters, meant for internal use only
-               // isOpen: Set to true after .start() is called to avoid double calls.
-               //         Set back to false after .close() to avoid duplicating the close animation.
-               // isPaused: false after .resume(), true after .pause(). Avoids duplicating or breaking the hide timeouts.
-               //           Set to true initially so .start() can call .resume().
-               // message: The message passed to the notification. Unused now but may be used in the future
-               //          to stop replacement of a tagged notification with another notification using the same message.
-               // options: The options passed to the notification with a little sanitization. Used by various methods.
-               // $notification: jQuery object containing the notification DOM node.
-               this.isOpen = false;
-               this.isPaused = true;
-               this.message = message;
-               this.options = options;
-               this.$notification = $notification;
-       }
-
-       /**
-        * Start the notification. Called automatically by mw.notification#notify
-        * (possibly asynchronously on document-ready).
-        *
-        * This inserts the notification into the page, closes any matching tagged notifications,
-        * handles the fadeIn animations and replacement transitions, and starts autoHide timers.
-        *
-        * @private
-        */
-       Notification.prototype.start = function () {
-               var
-                       // Local references
-                       $notification, options,
-                       // Original opacity so that we can animate back to it later
-                       opacity,
-                       // Other notification elements matching the same tag
-                       $tagMatches,
-                       outerHeight,
-                       placeholderHeight,
-                       autohideCount,
-                       notif;
-
-               $area.show();
-
-               if ( this.isOpen ) {
-                       return;
-               }
-
-               this.isOpen = true;
-               openNotificationCount++;
-
-               options = this.options;
-               $notification = this.$notification;
-
-               opacity = this.$notification.css( 'opacity' );
-
-               // Set the opacity to 0 so we can fade in later.
-               $notification.css( 'opacity', 0 );
-
-               if ( options.tag ) {
-                       // Check to see if there are any tagged notifications with the same tag as the new one
-                       $tagMatches = $area.find( '.mw-notification-tag-' + options.tag );
-               }
-
-               // If we found a tagged notification use the replacement pattern instead of the new
-               // notification fade-in pattern.
-               if ( options.tag && $tagMatches.length ) {
-
-                       // Iterate over the tag matches to find the outerHeight we should use
-                       // for the placeholder.
-                       outerHeight = 0;
-                       $tagMatches.each( function () {
-                               var notif = $( this ).data( 'mw.notification' );
-                               if ( notif ) {
-                                       // Use the notification's height + padding + border + margins
-                                       // as the placeholder height.
-                                       outerHeight = notif.$notification.outerHeight( true );
-                                       if ( notif.$replacementPlaceholder ) {
-                                               // Grab the height of a placeholder that has not finished animating.
-                                               placeholderHeight = notif.$replacementPlaceholder.height();
-                                               // Remove any placeholders added by a previous tagged
-                                               // notification that was in the middle of replacing another.
-                                               // This also makes sure that we only grab the placeholderHeight
-                                               // for the most recent notification.
-                                               notif.$replacementPlaceholder.remove();
-                                               delete notif.$replacementPlaceholder;
-                                       }
-                                       // Close the previous tagged notification
-                                       // Since we're replacing it do this with a fast speed and don't output a placeholder
-                                       // since we're taking care of that transition ourselves.
-                                       notif.close( { speed: 'fast', placeholder: false } );
-                               }
-                       } );
-                       if ( placeholderHeight !== undefined ) {
-                               // If the other tagged notification was in the middle of replacing another
-                               // tagged notification, continue from the placeholder's height instead of
-                               // using the outerHeight of the notification.
-                               outerHeight = placeholderHeight;
-                       }
-
-                       $notification
-                               // Insert the new notification before the tagged notification(s)
-                               .insertBefore( $tagMatches.first() )
-                               .css( {
-                                       // Use an absolute position so that we can use a placeholder to gracefully push other notifications
-                                       // into the right spot.
-                                       position: 'absolute',
-                                       width: $notification.width()
-                               } )
-                               // Fade-in the notification
-                               .animate( { opacity: opacity },
-                                       {
-                                               duration: 'slow',
-                                               complete: function () {
-                                                       // After we've faded in clear the opacity and let css take over
-                                                       $( this ).css( { opacity: '' } );
-                                               }
-                                       } );
-
-                       notif = this;
-
-                       // Create a clear placeholder we can use to make the notifications around the notification that is being
-                       // replaced expand or contract gracefully to fit the height of the new notification.
-                       notif.$replacementPlaceholder = $( '<div>' )
-                               // Set the height to the space the previous notification or placeholder took
-                               .css( 'height', outerHeight )
-                               // Make sure that this placeholder is at the very end of this tagged notification group
-                               .insertAfter( $tagMatches.eq( -1 ) )
-                               // Animate the placeholder height to the space that this new notification will take up
-                               .animate( { height: $notification.outerHeight( true ) },
-                                       {
-                                               // Do space animations fast
-                                               speed: 'fast',
-                                               complete: function () {
-                                                       // Reset the notification position after we've finished the space animation
-                                                       // However do not do it if the placeholder was removed because another tagged
-                                                       // notification went and closed this one.
-                                                       if ( notif.$replacementPlaceholder ) {
-                                                               $notification.css( 'position', '' );
-                                                       }
-                                                       // Finally, remove the placeholder from the DOM
-                                                       $( this ).remove();
-                                               }
-                                       } );
-               } else {
-                       // Append to the notification area and fade in to the original opacity.
-                       $notification
-                               .appendTo( $area )
-                               .animate( { opacity: opacity },
-                                       {
-                                               duration: 'fast',
-                                               complete: function () {
-                                                       // After we've faded in clear the opacity and let css take over
-                                                       $( this ).css( 'opacity', '' );
-                                               }
-                                       }
-                               );
-               }
-
-               // By default a notification is paused.
-               // If this notification is within the first {autoHideLimit} notifications then
-               // start the auto-hide timer as soon as it's created.
-               autohideCount = $area.find( '.mw-notification-autohide' ).length;
-               if ( autohideCount <= notification.autoHideLimit ) {
-                       this.resume();
-               }
-       };
-
-       /**
-        * Pause any running auto-hide timer for this notification
-        */
-       Notification.prototype.pause = function () {
-               if ( this.isPaused ) {
-                       return;
-               }
-               this.isPaused = true;
-
-               if ( this.timeout ) {
-                       clearTimeout( this.timeout );
-                       delete this.timeout;
-               }
-       };
-
-       /**
-        * Start autoHide timer if not already started.
-        * Does nothing if autoHide is disabled.
-        * Either to resume from pause or to make the first start.
-        */
-       Notification.prototype.resume = function () {
-               var notif = this;
-               if ( !notif.isPaused ) {
-                       return;
-               }
-               // Start any autoHide timeouts
-               if ( notif.options.autoHide ) {
-                       notif.isPaused = false;
-                       notif.timeout = setTimeout( function () {
-                               // Already finished, so don't try to re-clear it
-                               delete notif.timeout;
-                               notif.close();
-                       }, notification.autoHideSeconds * 1000 );
-               }
-       };
-
-       /**
-        * Close/hide the notification.
-        *
-        * @param {Object} options An object containing options for the closing of the notification.
-        *
-        *  - speed: Use a close speed different than the default 'slow'.
-        *  - placeholder: Set to false to disable the placeholder transition.
-        */
-       Notification.prototype.close = function ( options ) {
-               if ( !this.isOpen ) {
-                       return;
-               }
-               this.isOpen = false;
-               openNotificationCount--;
-               // Clear any remaining timeout on close
-               this.pause();
-
-               options = $.extend( {
-                       speed: 'slow',
-                       placeholder: true
-               }, options );
-
-               // Remove the mw-notification-autohide class from the notification to avoid
-               // having a half-closed notification counted as a notification to resume
-               // when handling {autoHideLimit}.
-               this.$notification.removeClass( 'mw-notification-autohide' );
-
-               // Now that a notification is being closed. Start auto-hide timers for any
-               // notification that has now become one of the first {autoHideLimit} notifications.
-               notification.resume();
-
-               this.$notification
-                       .css( {
-                               // Don't trigger any mouse events while fading out, just in case the cursor
-                               // happens to be right above us when we transition upwards.
-                               pointerEvents: 'none',
-                               // Set an absolute position so we can move upwards in the animation.
-                               // Notification replacement doesn't look right unless we use an animation like this.
-                               position: 'absolute',
-                               // We must fix the width to avoid it shrinking horizontally.
-                               width: this.$notification.width()
-                       } )
-                       // Fix the top/left position to the current computed position from which we
-                       // can animate upwards.
-                       .css( this.$notification.position() );
-
-               // This needs to be done *after* notification's position has been made absolute.
-               if ( options.placeholder ) {
-                       // Insert a placeholder with a height equal to the height of the
-                       // notification plus it's vertical margins in place of the notification
-                       var $placeholder = $( '<div>' )
-                               .css( 'height', this.$notification.outerHeight( true ) )
-                               .insertBefore( this.$notification );
-               }
-
-               // Animate opacity and top to create fade upwards animation for notification closing
-               this.$notification
-                       .animate( {
-                               opacity: 0,
-                               top: '-=35'
-                       }, {
-                               duration: options.speed,
-                               complete: function () {
-                                       // Remove the notification
-                                       $( this ).remove();
-                                       // Hide the area manually after closing the last notification, since it has padding,
-                                       // causing it to obscure whatever is behind it in spite of being invisible (bug 52659).
-                                       // It's okay to do this before getting rid of the placeholder, as it's invisible as well.
-                                       if ( openNotificationCount === 0 ) {
-                                               $area.hide();
-                                       }
-                                       if ( options.placeholder ) {
-                                               // Use a fast slide up animation after closing to make it look like the notifications
-                                               // below slide up into place when the notification disappears
-                                               $placeholder.slideUp( 'fast', function () {
-                                                       // Remove the placeholder
-                                                       $( this ).remove();
-                                               } );
-                                       }
-                               }
-                       } );
-       };
-
-       /**
-        * Helper function, take a list of notification divs and call
-        * a function on the Notification instance attached to them.
-        *
-        * @private
-        * @static
-        * @param {jQuery} $notifications A jQuery object containing notification divs
-        * @param {string} fn The name of the function to call on the Notification instance
-        */
-       function callEachNotification( $notifications, fn ) {
-               $notifications.each( function () {
-                       var notif = $( this ).data( 'mw.notification' );
-                       if ( notif ) {
-                               notif[fn]();
-                       }
-               } );
-       }
-
-       /**
-        * Initialisation.
-        * Must only be called once, and not before the document is ready.
-        * @ignore
-        */
-       function init() {
-               var offset, $window = $( window );
-
-               $area = $( '<div id="mw-notification-area" class="mw-notification-area mw-notification-area-layout"></div>' )
-                       // Pause auto-hide timers when the mouse is in the notification area.
-                       .on( {
-                               mouseenter: notification.pause,
-                               mouseleave: notification.resume
-                       } )
-                       // When clicking on a notification close it.
-                       .on( 'click', '.mw-notification', function () {
-                               var notif = $( this ).data( 'mw.notification' );
-                               if ( notif ) {
-                                       notif.close();
-                               }
-                       } )
-                       // Stop click events from <a> tags from propogating to prevent clicking.
-                       // on links from hiding a notification.
-                       .on( 'click', 'a', function ( e ) {
-                               e.stopPropagation();
-                       } );
-
-               // Prepend the notification area to the content area and save it's object.
-               mw.util.$content.prepend( $area );
-               offset = $area.offset();
-
-               function updateAreaMode() {
-                       var isFloating = $window.scrollTop() > offset.top;
-                       $area
-                               .toggleClass( 'mw-notification-area-floating', isFloating )
-                               .toggleClass( 'mw-notification-area-layout', !isFloating );
-               }
-
-               $window.on( 'scroll', updateAreaMode );
-
-               // Initial mode
-               updateAreaMode();
-       }
-
-       /**
-        * @class mw.notification
-        * @singleton
-        */
-       notification = {
-               /**
-                * Pause auto-hide timers for all notifications.
-                * Notifications will not auto-hide until resume is called.
-                * @see mw.Notification#pause
-                */
-               pause: function () {
-                       callEachNotification(
-                               $area.children( '.mw-notification' ),
-                               'pause'
-                       );
-               },
-
-               /**
-                * Resume any paused auto-hide timers from the beginning.
-                * Only the first #autoHideLimit timers will be resumed.
-                */
-               resume: function () {
-                       callEachNotification(
-                               // Only call resume on the first #autoHideLimit notifications.
-                               // Exclude noautohide notifications to avoid bugs where #autoHideLimit
-                               // `{ autoHide: false }` notifications are at the start preventing any
-                               // auto-hide notifications from being autohidden.
-                               $area.children( '.mw-notification-autohide' ).slice( 0, notification.autoHideLimit ),
-                               'resume'
-                       );
-               },
-
-               /**
-                * Display a notification message to the user.
-                *
-                * @param {HTMLElement|jQuery|mw.Message|string} message
-                * @param {Object} options The options to use for the notification.
-                *  See #defaults for details.
-                * @return {mw.Notification} Notification object
-                */
-               notify: function ( message, options ) {
-                       var notif;
-                       options = $.extend( {}, notification.defaults, options );
-
-                       notif = new Notification( message, options );
-
-                       if ( isPageReady ) {
-                               notif.start();
-                       } else {
-                               preReadyNotifQueue.push( notif );
-                       }
-
-                       return notif;
-               },
-
-               /**
-                * @property {Object}
-                * The defaults for #notify options parameter.
-                *
-                * - autoHide:
-                *   A boolean indicating whether the notifification should automatically
-                *   be hidden after shown. Or if it should persist.
-                *
-                * - tag:
-                *   An optional string. When a notification is tagged only one message
-                *   with that tag will be displayed. Trying to display a new notification
-                *   with the same tag as one already being displayed will cause the other
-                *   notification to be closed and this new notification to open up inside
-                *   the same place as the previous notification.
-                *
-                * - title:
-                *   An optional title for the notification. Will be displayed above the
-                *   content. Usually in bold.
-                */
-               defaults: {
-                       autoHide: true,
-                       tag: false,
-                       title: undefined
-               },
-
-               /**
-                * @property {number}
-                * Number of seconds to wait before auto-hiding notifications.
-                */
-               autoHideSeconds: 5,
-
-               /**
-                * @property {number}
-                * Maximum number of notifications to count down auto-hide timers for.
-                * Only the first #autoHideLimit notifications being displayed will
-                * auto-hide. Any notifications further down in the list will only start
-                * counting down to auto-hide after the first few messages have closed.
-                *
-                * This basically represents the number of notifications the user should
-                * be able to process in #autoHideSeconds time.
-                */
-               autoHideLimit: 3
-       };
-
-       $( function () {
-               var notif;
-
-               init();
-
-               // Handle pre-ready queue.
-               isPageReady = true;
-               while ( preReadyNotifQueue.length ) {
-                       notif = preReadyNotifQueue.shift();
-                       notif.start();
-               }
-       } );
-
-       mw.notification = notification;
-
-}( mediaWiki, jQuery ) );
diff --git a/resources/mediawiki/mediawiki.notify.js b/resources/mediawiki/mediawiki.notify.js
deleted file mode 100644 (file)
index 743d651..0000000
+++ /dev/null
@@ -1,28 +0,0 @@
-/**
- * @class mw.plugin.notify
- */
-( function ( mw, $ ) {
-       'use strict';
-
-       /**
-        * @see mw.notification#notify
-        * @param message
-        * @param options
-        * @return {jQuery.Promise}
-        */
-       mw.notify = function ( message, options ) {
-               var d = $.Deferred();
-               // Don't bother loading the whole notification system if we never use it.
-               mw.loader.using( 'mediawiki.notification', function () {
-                       // Call notify with the notification the user requested of us.
-                       d.resolve( mw.notification.notify( message, options ) );
-               }, d.reject );
-               return d.promise();
-       };
-
-       /**
-        * @class mw
-        * @mixins mw.plugin.notify
-        */
-
-}( mediaWiki, jQuery ) );
diff --git a/resources/mediawiki/mediawiki.searchSuggest.css b/resources/mediawiki/mediawiki.searchSuggest.css
deleted file mode 100644 (file)
index 0fb862b..0000000
+++ /dev/null
@@ -1,16 +0,0 @@
-/* Make sure the links are not underlined or colored, ever. */
-/* There is already a :focus / :hover indication on the <div>. */
-.suggestions a.mw-searchSuggest-link,
-.suggestions a.mw-searchSuggest-link:hover,
-.suggestions a.mw-searchSuggest-link:active,
-.suggestions a.mw-searchSuggest-link:focus {
-       text-decoration: none;
-       color: black;
-}
-
-.suggestions-result-current a.mw-searchSuggest-link,
-.suggestions-result-current a.mw-searchSuggest-link:hover,
-.suggestions-result-current a.mw-searchSuggest-link:active,
-.suggestions-result-current a.mw-searchSuggest-link:focus {
-       color: white;
-}
diff --git a/resources/mediawiki/mediawiki.searchSuggest.js b/resources/mediawiki/mediawiki.searchSuggest.js
deleted file mode 100644 (file)
index 6999610..0000000
+++ /dev/null
@@ -1,209 +0,0 @@
-/*!
- * Add search suggestions to the search form.
- */
-( function ( mw, $ ) {
-       $( function () {
-               var map, resultRenderCache, searchboxesSelectors,
-                       // Region where the suggestions box will appear directly below
-                       // (using the same width). Can be a container element or the input
-                       // itself, depending on what suits best in the environment.
-                       // For Vector the suggestion box should align with the simpleSearch
-                       // container's borders, in other skins it should align with the input
-                       // element (not the search form, as that would leave the buttons
-                       // vertically between the input and the suggestions).
-                       $searchRegion = $( '#simpleSearch, #searchInput' ).first(),
-                       $searchInput = $( '#searchInput' );
-
-               // Compatibility map
-               map = {
-                       // SimpleSearch is broken in Opera < 9.6
-                       opera: [['>=', 9.6]],
-                       // Older Konquerors are unable to position the suggestions correctly (bug 50805)
-                       konqueror: [['>=', '4.11']],
-                       docomo: false,
-                       blackberry: false,
-                       ipod: false,
-                       iphone: false
-               };
-
-               if ( !$.client.test( map ) ) {
-                       return;
-               }
-
-               // Compute form data for search suggestions functionality.
-               function computeResultRenderCache( context ) {
-                       var $form, baseHref, linkParams;
-
-                       // Compute common parameters for links' hrefs
-                       $form = context.config.$region.closest( 'form' );
-
-                       baseHref = $form.attr( 'action' );
-                       baseHref += baseHref.indexOf( '?' ) > -1 ? '&' : '?';
-
-                       linkParams = {};
-                       $.each( $form.serializeArray(), function ( idx, obj ) {
-                               linkParams[ obj.name ] = obj.value;
-                       } );
-
-                       return {
-                               textParam: context.data.$textbox.attr( 'name' ),
-                               linkParams: linkParams,
-                               baseHref: baseHref
-                       };
-               }
-
-               // The function used to render the suggestions.
-               function renderFunction( text, context ) {
-                       if ( !resultRenderCache ) {
-                               resultRenderCache = computeResultRenderCache( context );
-                       }
-
-                       // linkParams object is modified and reused
-                       resultRenderCache.linkParams[ resultRenderCache.textParam ] = text;
-
-                       // this is the container <div>, jQueryfied
-                       this
-                               .append(
-                                       // the <span> is needed for $.autoEllipsis to work
-                                       $( '<span>' )
-                                               .css( 'whiteSpace', 'nowrap' )
-                                               .text( text )
-                               )
-                               .wrap(
-                                       $( '<a>' )
-                                               .attr( 'href', resultRenderCache.baseHref + $.param( resultRenderCache.linkParams ) )
-                                               .addClass( 'mw-searchSuggest-link' )
-                               );
-               }
-
-               function specialRenderFunction( query, context ) {
-                       var $el = this;
-
-                       if ( !resultRenderCache ) {
-                               resultRenderCache = computeResultRenderCache( context );
-                       }
-
-                       // linkParams object is modified and reused
-                       resultRenderCache.linkParams[ resultRenderCache.textParam ] = query;
-
-                       if ( $el.children().length === 0 ) {
-                               $el
-                                       .append(
-                                               $( '<div>' )
-                                                       .addClass( 'special-label' )
-                                                       .text( mw.msg( 'searchsuggest-containing' ) ),
-                                               $( '<div>' )
-                                                       .addClass( 'special-query' )
-                                                       .text( query )
-                                                       .autoEllipsis()
-                                       )
-                                       .show();
-                       } else {
-                               $el.find( '.special-query' )
-                                       .text( query )
-                                       .autoEllipsis();
-                       }
-
-                       if ( $el.parent().hasClass( 'mw-searchSuggest-link' ) ) {
-                               $el.parent().attr( 'href', resultRenderCache.baseHref + $.param( resultRenderCache.linkParams ) + '&fulltext=1' );
-                       } else {
-                               $el.wrap(
-                                       $( '<a>' )
-                                               .attr( 'href', resultRenderCache.baseHref + $.param( resultRenderCache.linkParams ) + '&fulltext=1' )
-                                               .addClass( 'mw-searchSuggest-link' )
-                               );
-                       }
-               }
-
-               // General suggestions functionality for all search boxes
-               searchboxesSelectors = [
-                       // Primary searchbox on every page in standard skins
-                       '#searchInput',
-                       // Special:Search
-                       '#powerSearchText',
-                       '#searchText',
-                       // Generic selector for skins with multiple searchboxes (used by CologneBlue)
-                       '.mw-searchInput'
-               ];
-               $( searchboxesSelectors.join( ', ' ) )
-                       .suggestions( {
-                               fetch: function ( query ) {
-                                       var $el;
-
-                                       if ( query.length !== 0 ) {
-                                               $el = $( this );
-                                               $el.data( 'request', ( new mw.Api() ).get( {
-                                                       action: 'opensearch',
-                                                       search: query,
-                                                       namespace: 0,
-                                                       suggest: ''
-                                               } ).done( function ( data ) {
-                                                       $el.suggestions( 'suggestions', data[1] );
-                                               } ) );
-                                       }
-                               },
-                               cancel: function () {
-                                       var apiPromise = $( this ).data( 'request' );
-                                       // If the delay setting has caused the fetch to have not even happened
-                                       // yet, the apiPromise object will have never been set.
-                                       if ( apiPromise && $.isFunction( apiPromise.abort ) ) {
-                                               apiPromise.abort();
-                                               $( this ).removeData( 'request' );
-                                       }
-                               },
-                               result: {
-                                       render: renderFunction,
-                                       select: function () {
-                                               return true; // allow the form to be submitted
-                                       }
-                               },
-                               delay: 120,
-                               highlightInput: true
-                       } )
-                       .bind( 'paste cut drop', function () {
-                               // make sure paste and cut events from the mouse and drag&drop events
-                               // trigger the keypress handler and cause the suggestions to update
-                               $( this ).trigger( 'keypress' );
-                       } );
-
-               // Ensure that the thing is actually present!
-               if ( $searchRegion.length === 0 ) {
-                       // Don't try to set anything up if simpleSearch is disabled sitewide.
-                       // The loader code loads us if the option is present, even if we're
-                       // not actually enabled (anymore).
-                       return;
-               }
-
-               // Special suggestions functionality for skin-provided search box
-               $searchInput.suggestions( {
-                       result: {
-                               render: renderFunction,
-                               select: function () {
-                                       return true; // allow the form to be submitted
-                               }
-                       },
-                       special: {
-                               render: specialRenderFunction,
-                               select: function ( $input ) {
-                                       $input.closest( 'form' )
-                                               .append( $( '<input type="hidden" name="fulltext" value="1"/>' ) );
-                                       return true; // allow the form to be submitted
-                               }
-                       },
-                       $region: $searchRegion
-               } );
-
-               // If the form includes any fallback fulltext search buttons, remove them
-               $searchInput.closest( 'form' ).find( '.mw-fallbackSearchButton' ).remove();
-
-               // In most skins (at least Monobook and Vector), the font-size is messed up in <body>.
-               // (they use 2 elements to get a sane font-height). So, instead of making exceptions for
-               // each skin or adding more stylesheets, just copy it from the active element so auto-fit.
-               $searchInput
-                       .data( 'suggestions-context' )
-                       .data.$container
-                               .css( 'fontSize', $searchInput.css( 'fontSize' ) );
-
-       } );
-
-}( mediaWiki, jQuery ) );
diff --git a/resources/mediawiki/mediawiki.toc.js b/resources/mediawiki/mediawiki.toc.js
deleted file mode 100644 (file)
index 6eb8552..0000000
+++ /dev/null
@@ -1,69 +0,0 @@
-/**
- * @private
- * @singleton
- * @class mw.toc
- */
-( function ( mw, $ ) {
-       'use strict';
-
-       // Table of contents toggle
-       mw.hook( 'wikipage.content' ).add( function ( $content ) {
-
-               /**
-                * Hide/show the table of contents element
-                *
-                * @param {jQuery} $toggleLink A jQuery object of the toggle link.
-                */
-               function toggleToc( $toggleLink ) {
-                       var $tocList = $content.find( '#toc ul:first' );
-
-                       // This function shouldn't be called if there's no TOC,
-                       // but just in case...
-                       if ( $tocList.length ) {
-                               if ( $tocList.is( ':hidden' ) ) {
-                                       $tocList.slideDown( 'fast' );
-                                       $toggleLink.text( mw.msg( 'hidetoc' ) );
-                                       $content.find( '#toc' ).removeClass( 'tochidden' );
-                                       $.cookie( 'mw_hidetoc', null, {
-                                               expires: 30,
-                                               path: '/'
-                                       } );
-                               } else {
-                                       $tocList.slideUp( 'fast' );
-                                       $toggleLink.text( mw.msg( 'showtoc' ) );
-                                       $content.find( '#toc' ).addClass( 'tochidden' );
-                                       $.cookie( 'mw_hidetoc', '1', {
-                                               expires: 30,
-                                               path: '/'
-                                       } );
-                               }
-                       }
-               }
-
-               var $tocTitle, $tocToggleLink, hideTocCookie;
-               $tocTitle = $content.find( '#toctitle' );
-               $tocToggleLink = $content.find( '#togglelink' );
-               // Only add it if there is a TOC and there is no toggle added already
-               if ( $content.find( '#toc' ).length && $tocTitle.length && !$tocToggleLink.length ) {
-                       hideTocCookie = $.cookie( 'mw_hidetoc' );
-                       $tocToggleLink = $( '<a href="#" class="internal" id="togglelink"></a>' )
-                               .text( mw.msg( 'hidetoc' ) )
-                               .click( function ( e ) {
-                                       e.preventDefault();
-                                       toggleToc( $( this ) );
-                               } );
-                       $tocTitle.append(
-                               $tocToggleLink
-                                       .wrap( '<span class="toctoggle"></span>' )
-                                       .parent()
-                                               .prepend( '&nbsp;[' )
-                                               .append( ']&nbsp;' )
-                       );
-
-                       if ( hideTocCookie === '1' ) {
-                               toggleToc( $tocToggleLink );
-                       }
-               }
-       } );
-
-}( mediaWiki, jQuery ) );
diff --git a/resources/mediawiki/mediawiki.user.js b/resources/mediawiki/mediawiki.user.js
deleted file mode 100644 (file)
index 8344111..0000000
+++ /dev/null
@@ -1,261 +0,0 @@
-/**
- * @class mw.user
- * @singleton
- */
-( function ( mw, $ ) {
-       var user,
-               deferreds = {},
-               // Extend the skeleton mw.user from mediawiki.js
-               // This is kind of ugly but we're stuck with this for b/c reasons
-               options = mw.user.options || new mw.Map(),
-               tokens = mw.user.tokens || new mw.Map();
-
-       /**
-        * Get the current user's groups or rights
-        *
-        * @private
-        * @param {string} info One of 'groups' or 'rights'
-        * @param {Function} [callback]
-        * @return {jQuery.Promise}
-        */
-       function getUserInfo( info, callback ) {
-               var api;
-               if ( !deferreds[info] ) {
-
-                       deferreds.rights = $.Deferred();
-                       deferreds.groups = $.Deferred();
-
-                       api = new mw.Api();
-                       api.get( {
-                               action: 'query',
-                               meta: 'userinfo',
-                               uiprop: 'rights|groups'
-                       } ).always( function ( data ) {
-                               var rights, groups;
-                               if ( data.query && data.query.userinfo ) {
-                                       rights = data.query.userinfo.rights;
-                                       groups = data.query.userinfo.groups;
-                               }
-                               deferreds.rights.resolve( rights || [] );
-                               deferreds.groups.resolve( groups || [] );
-                       } );
-
-               }
-
-               return deferreds[info].done( callback ).promise();
-       }
-
-       mw.user = user = {
-               options: options,
-               tokens: tokens,
-
-               /**
-                * Generate a random user session ID (32 alpha-numeric characters)
-                *
-                * This information would potentially be stored in a cookie to identify a user during a
-                * session or series of sessions. Its uniqueness should not be depended on.
-                *
-                * @return {string} Random set of 32 alpha-numeric characters
-                */
-               generateRandomSessionId: function () {
-                       var i, r,
-                               id = '',
-                               seed = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';
-                       for ( i = 0; i < 32; i++ ) {
-                               r = Math.floor( Math.random() * seed.length );
-                               id += seed.substring( r, r + 1 );
-                       }
-                       return id;
-               },
-
-               /**
-                * Get the current user's database id
-                *
-                * Not to be confused with #id.
-                *
-                * @return {number} Current user's id, or 0 if user is anonymous
-                */
-               getId: function () {
-                       return mw.config.get( 'wgUserId', 0 );
-               },
-
-               /**
-                * Get the current user's name
-                *
-                * @return {string|null} User name string or null if user is anonymous
-                */
-               getName: function () {
-                       return mw.config.get( 'wgUserName' );
-               },
-
-               /**
-                * @inheritdoc #getName
-                * @deprecated since 1.20 use #getName instead
-                */
-               name: function () {
-                       return user.getName();
-               },
-
-               /**
-                * Get date user registered, if available
-                *
-                * @return {Date|boolean|null} Date user registered, or false for anonymous users, or
-                *  null when data is not available
-                */
-               getRegistration: function () {
-                       var registration = mw.config.get( 'wgUserRegistration' );
-                       if ( user.isAnon() ) {
-                               return false;
-                       } else if ( registration === null ) {
-                               // Information may not be available if they signed up before
-                               // MW began storing this.
-                               return null;
-                       } else {
-                               return new Date( registration );
-                       }
-               },
-
-               /**
-                * Whether the current user is anonymous
-                *
-                * @return {boolean}
-                */
-               isAnon: function () {
-                       return user.getName() === null;
-               },
-
-               /**
-                * @inheritdoc #isAnon
-                * @deprecated since 1.20 use #isAnon instead
-                */
-               anonymous: function () {
-                       return user.isAnon();
-               },
-
-               /**
-                * Get an automatically generated random ID (stored in a session cookie)
-                *
-                * This ID is ephemeral for everyone, staying in their browser only until they close
-                * their browser.
-                *
-                * @return {string} Random session ID
-                */
-               sessionId: function () {
-                       var sessionId = $.cookie( 'mediaWiki.user.sessionId' );
-                       if ( sessionId === undefined || sessionId === null ) {
-                               sessionId = user.generateRandomSessionId();
-                               $.cookie( 'mediaWiki.user.sessionId', sessionId, { expires: null, path: '/' } );
-                       }
-                       return sessionId;
-               },
-
-               /**
-                * Get the current user's name or the session ID
-                *
-                * Not to be confused with #getId.
-                *
-                * @return {string} User name or random session ID
-                */
-               id: function () {
-                       return user.getName() || user.sessionId();
-               },
-
-               /**
-                * Get the user's bucket (place them in one if not done already)
-                *
-                *     mw.user.bucket( 'test', {
-                *         buckets: { ignored: 50, control: 25, test: 25 },
-                *         version: 1,
-                *         expires: 7
-                *     } );
-                *
-                * @deprecated since 1.23
-                * @param {string} key Name of bucket
-                * @param {Object} options Bucket configuration options
-                * @param {Object} options.buckets List of bucket-name/relative-probability pairs (required,
-                *  must have at least one pair)
-                * @param {number} [options.version=0] Version of bucket test, changing this forces
-                *  rebucketing
-                * @param {number} [options.expires=30] Length of time (in days) until the user gets
-                *  rebucketed
-                * @return {string} Bucket name - the randomly chosen key of the `options.buckets` object
-                */
-               bucket: function ( key, options ) {
-                       var cookie, parts, version, bucket,
-                               range, k, rand, total;
-
-                       options = $.extend( {
-                               buckets: {},
-                               version: 0,
-                               expires: 30
-                       }, options || {} );
-
-                       cookie = $.cookie( 'mediaWiki.user.bucket:' + key );
-
-                       // Bucket information is stored as 2 integers, together as version:bucket like: "1:2"
-                       if ( typeof cookie === 'string' && cookie.length > 2 && cookie.indexOf( ':' ) !== -1 ) {
-                               parts = cookie.split( ':' );
-                               if ( parts.length > 1 && Number( parts[0] ) === options.version ) {
-                                       version = Number( parts[0] );
-                                       bucket = String( parts[1] );
-                               }
-                       }
-
-                       if ( bucket === undefined ) {
-                               if ( !$.isPlainObject( options.buckets ) ) {
-                                       throw new Error( 'Invalid bucket. Object expected for options.buckets.' );
-                               }
-
-                               version = Number( options.version );
-
-                               // Find range
-                               range = 0;
-                               for ( k in options.buckets ) {
-                                       range += options.buckets[k];
-                               }
-
-                               // Select random value within range
-                               rand = Math.random() * range;
-
-                               // Determine which bucket the value landed in
-                               total = 0;
-                               for ( k in options.buckets ) {
-                                       bucket = k;
-                                       total += options.buckets[k];
-                                       if ( total >= rand ) {
-                                               break;
-                                       }
-                               }
-
-                               $.cookie(
-                                       'mediaWiki.user.bucket:' + key,
-                                       version + ':' + bucket,
-                                       { path: '/', expires: Number( options.expires ) }
-                               );
-                       }
-
-                       return bucket;
-               },
-
-               /**
-                * Get the current user's groups
-                *
-                * @param {Function} [callback]
-                * @return {jQuery.Promise}
-                */
-               getGroups: function ( callback ) {
-                       return getUserInfo( 'groups', callback );
-               },
-
-               /**
-                * Get the current user's rights
-                *
-                * @param {Function} [callback]
-                * @return {jQuery.Promise}
-                */
-               getRights: function ( callback ) {
-                       return getUserInfo( 'rights', callback );
-               }
-       };
-
-}( mediaWiki, jQuery ) );
diff --git a/resources/mediawiki/mediawiki.util.js b/resources/mediawiki/mediawiki.util.js
deleted file mode 100644 (file)
index ffafd33..0000000
+++ /dev/null
@@ -1,595 +0,0 @@
-( function ( mw, $ ) {
-       'use strict';
-
-       /**
-        * Utility library
-        * @class mw.util
-        * @singleton
-        */
-       var util = {
-
-               /**
-                * Initialisation
-                * (don't call before document ready)
-                */
-               init: function () {
-                       var profile;
-
-                       /* Set tooltipAccessKeyPrefix */
-                       profile = $.client.profile();
-
-                       // Opera on any platform
-                       if ( profile.name === 'opera' ) {
-                               util.tooltipAccessKeyPrefix = 'shift-esc-';
-
-                       // Chrome on any platform
-                       } else if ( profile.name === 'chrome' ) {
-
-                               util.tooltipAccessKeyPrefix = (
-                                       profile.platform === 'mac'
-                                               // Chrome on Mac
-                                               ? 'ctrl-option-'
-                                               // Chrome on Windows or Linux
-                                               // (both alt- and alt-shift work, but alt with E, D, F etc does not
-                                               // work since they are browser shortcuts)
-                                               : 'alt-shift-'
-                               );
-
-                       // Non-Windows Safari with webkit_version > 526
-                       } else if ( profile.platform !== 'win'
-                               && profile.name === 'safari'
-                               && profile.layoutVersion > 526 ) {
-                               util.tooltipAccessKeyPrefix = 'ctrl-alt-';
-                       // Firefox 14+ on Mac
-                       } else if ( profile.platform === 'mac'
-                               && profile.name === 'firefox'
-                               && profile.versionNumber >= 14 ) {
-                               util.tooltipAccessKeyPrefix = 'ctrl-option-';
-                       // Safari/Konqueror on any platform, or any browser on Mac
-                       // (but not Safari on Windows)
-                       } else if ( !( profile.platform === 'win' && profile.name === 'safari' )
-                                                       && ( profile.name === 'safari'
-                                                       || profile.platform === 'mac'
-                                                       || profile.name === 'konqueror' ) ) {
-                               util.tooltipAccessKeyPrefix = 'ctrl-';
-
-                       // Firefox/Iceweasel 2.x and later
-                       } else if ( ( profile.name === 'firefox' || profile.name === 'iceweasel' )
-                               && profile.versionBase > '1' ) {
-                               util.tooltipAccessKeyPrefix = 'alt-shift-';
-                       }
-
-                       /* Fill $content var */
-                       util.$content = ( function () {
-                               var i, l, $content, selectors;
-                               selectors = [
-                                       // The preferred standard for setting $content (class="mw-body")
-                                       // You may also use (class="mw-body mw-body-primary") if you use
-                                       // mw-body in multiple locations.
-                                       // Or class="mw-body-primary" if you want $content to be deeper
-                                       // in the dom than mw-body
-                                       '.mw-body-primary',
-                                       '.mw-body',
-
-                                       /* Legacy fallbacks for setting the content */
-                                       // Vector, Monobook, Chick, etc... based skins
-                                       '#bodyContent',
-
-                                       // Modern based skins
-                                       '#mw_contentholder',
-
-                                       // Standard, CologneBlue
-                                       '#article',
-
-                                       // #content is present on almost all if not all skins. Most skins (the above cases)
-                                       // have #content too, but as an outer wrapper instead of the article text container.
-                                       // The skins that don't have an outer wrapper do have #content for everything
-                                       // so it's a good fallback
-                                       '#content',
-
-                                       // If nothing better is found fall back to our bodytext div that is guaranteed to be here
-                                       '#mw-content-text',
-
-                                       // Should never happen... well, it could if someone is not finished writing a skin and has
-                                       // not inserted bodytext yet. But in any case <body> should always exist
-                                       'body'
-                               ];
-                               for ( i = 0, l = selectors.length; i < l; i++ ) {
-                                       $content = $( selectors[i] ).first();
-                                       if ( $content.length ) {
-                                               return $content;
-                                       }
-                               }
-
-                               // Make sure we don't unset util.$content if it was preset and we don't find anything
-                               return util.$content;
-                       } )();
-               },
-
-               /* Main body */
-
-               /**
-                * Encode the string like PHP's rawurlencode
-                *
-                * @param {string} str String to be encoded.
-                */
-               rawurlencode: function ( str ) {
-                       str = String( str );
-                       return encodeURIComponent( str )
-                               .replace( /!/g, '%21' ).replace( /'/g, '%27' ).replace( /\(/g, '%28' )
-                               .replace( /\)/g, '%29' ).replace( /\*/g, '%2A' ).replace( /~/g, '%7E' );
-               },
-
-               /**
-                * Encode page titles 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 util.rawurlencode( str )
-                               .replace( /%20/g, '_' ).replace( /%3A/g, ':' ).replace( /%2F/g, '/' );
-               },
-
-               /**
-                * Get the link to a page name (relative to `wgServer`),
-                *
-                * @param {string} str Page name
-                * @param {Object} [params] A mapping of query parameter names to values,
-                *  e.g. `{ action: 'edit' }`
-                * @return {string} Url of the page with name of `str`
-                */
-               getUrl: function ( str, params ) {
-                       var url = mw.config.get( 'wgArticlePath' ).replace(
-                               '$1',
-                               util.wikiUrlencode( typeof str === 'string' ? str : mw.config.get( 'wgPageName' ) )
-                       );
-
-                       if ( params && !$.isEmptyObject( params ) ) {
-                               url += ( url.indexOf( '?' ) !== -1 ? '&' : '?' ) + $.param( params );
-                       }
-
-                       return url;
-               },
-
-               /**
-                * Get address to a script in the wiki root.
-                * For index.php use `mw.config.get( 'wgScript' )`.
-                *
-                * @since 1.18
-                * @param str string Name of script (eg. 'api'), defaults to 'index'
-                * @return string Address to script (eg. '/w/api.php' )
-                */
-               wikiScript: function ( str ) {
-                       str = str || 'index';
-                       if ( str === 'index' ) {
-                               return mw.config.get( 'wgScript' );
-                       } else if ( str === 'load' ) {
-                               return mw.config.get( 'wgLoadScript' );
-                       } else {
-                               return mw.config.get( 'wgScriptPath' ) + '/' + str +
-                                       mw.config.get( 'wgScriptExtension' );
-                       }
-               },
-
-               /**
-                * Append a new style block to the head and return the CSSStyleSheet object.
-                * Use .ownerNode to access the `<style>` element, or use mw.loader#addStyleTag.
-                * This function returns the styleSheet object for convience (due to cross-browsers
-                * difference as to where it is located).
-                *
-                *     var sheet = mw.util.addCSS( '.foobar { display: none; }' );
-                *     $( foo ).click( function () {
-                *         // Toggle the sheet on and off
-                *         sheet.disabled = !sheet.disabled;
-                *     } );
-                *
-                * @param {string} text CSS to be appended
-                * @return {CSSStyleSheet} Use .ownerNode to get to the `<style>` element.
-                */
-               addCSS: function ( text ) {
-                       var s = mw.loader.addStyleTag( text );
-                       return s.sheet || s.styleSheet || s;
-               },
-
-               /**
-                * Hide/show the table of contents element
-                *
-                * @param {jQuery} $toggleLink A jQuery object of the toggle link.
-                * @param {Function} [callback] Function to be called after the toggle is
-                *  completed (including the animation).
-                * @return {Mixed} Boolean visibility of the toc (true if it's visible)
-                * or Null if there was no table of contents.
-                * @deprecated since 1.23 Use jQuery
-                */
-               toggleToc: function ( $toggleLink, callback ) {
-                       var ret, $tocList = $( '#toc ul:first' );
-
-                       // This function shouldn't be called if there's no TOC,
-                       // but just in case...
-                       if ( !$tocList.length ) {
-                               return null;
-                       }
-                       ret = $tocList.is( ':hidden' );
-                       $toggleLink.click();
-                       $tocList.promise().done( callback );
-                       return ret;
-               },
-
-               /**
-                * Grab the URL parameter value for the given parameter.
-                * Returns null if not found.
-                *
-                * @param {string} param The parameter name.
-                * @param {string} [url=document.location.href] URL to search through, defaulting to the current document's URL.
-                * @return {Mixed} Parameter value or null.
-                */
-               getParamValue: function ( param, url ) {
-                       if ( url === undefined ) {
-                               url = document.location.href;
-                       }
-                       // Get last match, stop at hash
-                       var     re = new RegExp( '^[^#]*[&?]' + $.escapeRE( param ) + '=([^&#]*)' ),
-                               m = re.exec( url );
-                       if ( m ) {
-                               // Beware that decodeURIComponent is not required to understand '+'
-                               // by spec, as encodeURIComponent does not produce it.
-                               return decodeURIComponent( m[1].replace( /\+/g, '%20' ) );
-                       }
-                       return null;
-               },
-
-               /**
-                * @property {string}
-                * Access key prefix. Will be re-defined based on browser/operating system
-                * detection in mw.util#init.
-                */
-               tooltipAccessKeyPrefix: 'alt-',
-
-               /**
-                * @property {RegExp}
-                * Regex to match accesskey tooltips.
-                *
-                * Should match:
-                *
-                * - "ctrl-option-"
-                * - "alt-shift-"
-                * - "ctrl-alt-"
-                * - "ctrl-"
-                *
-                * The accesskey is matched in group $6.
-                */
-               tooltipAccessKeyRegexp: /\[(ctrl-)?(option-)?(alt-)?(shift-)?(esc-)?(.)\]$/,
-
-               /**
-                * Add the appropriate prefix to the accesskey shown in the tooltip.
-                *
-                * If the `$nodes` parameter is given, only those nodes are updated;
-                * otherwise, depending on browser support, we update either all elements
-                * with accesskeys on the page or a bunch of elements which are likely to
-                * have them on core skins.
-                *
-                * @param {Array|jQuery} [$nodes] A jQuery object, or array of nodes to update.
-                */
-               updateTooltipAccessKeys: function ( $nodes ) {
-                       if ( !$nodes ) {
-                               if ( document.querySelectorAll ) {
-                                       // If we're running on a browser where we can do this efficiently,
-                                       // just find all elements that have accesskeys. We can't use jQuery's
-                                       // polyfill for the selector since looping over all elements on page
-                                       // load might be too slow.
-                                       $nodes = $( document.querySelectorAll( '[accesskey]' ) );
-                               } else {
-                                       // Otherwise go through some elements likely to have accesskeys rather
-                                       // than looping over all of them. Unfortunately this will not fully
-                                       // work for custom skins with different HTML structures. Input, label
-                                       // and button should be rare enough that no optimizations are needed.
-                                       $nodes = $( '#column-one a, #mw-head a, #mw-panel a, #p-logo a, input, label, button' );
-                               }
-                       } else if ( !( $nodes instanceof $ ) ) {
-                               $nodes = $( $nodes );
-                       }
-
-                       $nodes.attr( 'title', function ( i, val ) {
-                               if ( val && util.tooltipAccessKeyRegexp.test( val ) ) {
-                                       return val.replace( util.tooltipAccessKeyRegexp,
-                                               '[' + util.tooltipAccessKeyPrefix + '$6]' );
-                               }
-                               return val;
-                       } );
-               },
-
-               /*
-                * @property {jQuery}
-                * A jQuery object that refers to the content area 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, the others are optional and
-                * may be null. 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
-                * (e.g. `document.getElementById( 'foobar' )`) or a jQuery-selector
-                * (e.g. `'#foobar'`) for that item.
-                *
-                *     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
-                * @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] Access key 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 {HTMLElement|jQuery|string} [nextnode] Element or jQuery-selector string to the item that
-                *  the new item should be added before, should be another item in the same
-                *  list, it will be ignored otherwise
-                *
-                * @return {HTMLElement|null} The added element (a ListItem or Anchor element,
-                * depending on the skin) or null if no element was added to the document.
-                */
-               addPortletLink: function ( portlet, href, text, id, tooltip, accesskey, nextnode ) {
-                       var $item, $link, $portlet, $ul;
-
-                       // Check if there's atleast 3 arguments to prevent a TypeError
-                       if ( arguments.length < 3 ) {
-                               return null;
-                       }
-                       // Setup the anchor tag
-                       $link = $( '<a>' ).attr( 'href', href ).text( text );
-                       if ( tooltip ) {
-                               $link.attr( 'title', tooltip );
-                       }
-
-                       // Select the specified portlet
-                       $portlet = $( '#' + portlet );
-                       if ( $portlet.length === 0 ) {
-                               return null;
-                       }
-                       // Select the first (most likely only) unordered list inside the portlet
-                       $ul = $portlet.find( 'ul' ).eq( 0 );
-
-                       // If it didn't have an unordered list yet, create it
-                       if ( $ul.length === 0 ) {
-
-                               $ul = $( '<ul>' );
-
-                               // If there's no <div> inside, append it to the portlet directly
-                               if ( $portlet.find( 'div:first' ).length === 0 ) {
-                                       $portlet.append( $ul );
-                               } else {
-                                       // otherwise if there's a div (such as div.body or div.pBody)
-                                       // append the <ul> to last (most likely only) div
-                                       $portlet.find( 'div' ).eq( -1 ).append( $ul );
-                               }
-                       }
-                       // Just in case..
-                       if ( $ul.length === 0 ) {
-                               return null;
-                       }
-
-                       // Unhide portlet if it was hidden before
-                       $portlet.removeClass( 'emptyPortlet' );
-
-                       // Wrap the anchor tag in a list item (and a span if $portlet is a Vector tab)
-                       // and back up the selector to the list item
-                       if ( $portlet.hasClass( 'vectorTabs' ) ) {
-                               $item = $link.wrap( '<li><span></span></li>' ).parent().parent();
-                       } else {
-                               $item = $link.wrap( '<li></li>' ).parent();
-                       }
-
-                       // Implement the properties passed to the function
-                       if ( id ) {
-                               $item.attr( 'id', id );
-                       }
-
-                       if ( tooltip ) {
-                               // Trim any existing accesskey hint and the trailing space
-                               tooltip = $.trim( tooltip.replace( util.tooltipAccessKeyRegexp, '' ) );
-                               if ( accesskey ) {
-                                       tooltip += ' [' + accesskey + ']';
-                               }
-                               $link.attr( 'title', tooltip );
-                               if ( accesskey ) {
-                                       util.updateTooltipAccessKeys( $link );
-                               }
-                       }
-
-                       if ( accesskey ) {
-                               $link.attr( 'accesskey', accesskey );
-                       }
-
-                       if ( nextnode ) {
-                               if ( nextnode.nodeType || typeof nextnode === 'string' ) {
-                                       // nextnode is a DOM element (was the only option before MW 1.17, in wikibits.js)
-                                       // or nextnode is a CSS selector for jQuery
-                                       nextnode = $ul.find( nextnode );
-                               } else if ( !nextnode.jquery || ( nextnode.length && nextnode[0].parentNode !== $ul[0] ) ) {
-                                       // Fallback
-                                       $ul.append( $item );
-                                       return $item[0];
-                               }
-                               if ( nextnode.length === 1 ) {
-                                       // nextnode is a jQuery object that represents exactly one element
-                                       nextnode.before( $item );
-                                       return $item[0];
-                               }
-                       }
-
-                       // Fallback (this is the default behavior)
-                       $ul.append( $item );
-                       return $item[0];
-
-               },
-
-               /**
-                * Add a little box at the top of the screen to inform the user of
-                * something, replacing any previous message.
-                * Calling with no arguments, with an empty string or null will hide the message
-                *
-                * @param {Mixed} message The DOM-element, jQuery object or HTML-string to be put inside the message box.
-                * to allow CSS/JS to hide different boxes. null = no class used.
-                * @deprecated since 1.20 Use mw#notify
-                */
-               jsMessage: function ( message ) {
-                       if ( !arguments.length || message === '' || message === null ) {
-                               return true;
-                       }
-                       if ( typeof message !== 'object' ) {
-                               message = $.parseHTML( message );
-                       }
-                       mw.notify( message, { autoHide: true, tag: 'legacy' } );
-                       return true;
-               },
-
-               /**
-                * Validate a string as representing a valid e-mail address
-                * according to HTML5 specification. Please note the specification
-                * does not validate a domain with one character.
-                *
-                * FIXME: should be moved to or replaced by a validation module.
-                *
-                * @param {string} mailtxt E-mail address to be validated.
-                * @return {boolean|null} Null if `mailtxt` was an empty string, otherwise true/false
-                * as determined by validation.
-                */
-               validateEmail: function ( mailtxt ) {
-                       var rfc5322Atext, rfc1034LdhStr, html5EmailRegexp;
-
-                       if ( mailtxt === '' ) {
-                               return null;
-                       }
-
-                       // HTML5 defines a string as valid e-mail address if it matches
-                       // the ABNF:
-                       //      1 * ( atext / "." ) "@" ldh-str 1*( "." ldh-str )
-                       // With:
-                       // - atext   : defined in RFC 5322 section 3.2.3
-                       // - ldh-str : defined in RFC 1034 section 3.5
-                       //
-                       // (see STD 68 / RFC 5234 http://tools.ietf.org/html/std68)
-                       // First, define the RFC 5322 'atext' which is pretty easy:
-                       // atext = ALPHA / DIGIT / ; Printable US-ASCII
-                       //     "!" / "#" /    ; characters not including
-                       //     "$" / "%" /    ; specials. Used for atoms.
-                       //     "&" / "'" /
-                       //     "*" / "+" /
-                       //     "-" / "/" /
-                       //     "=" / "?" /
-                       //     "^" / "_" /
-                       //     "`" / "{" /
-                       //     "|" / "}" /
-                       //     "~"
-                       rfc5322Atext = 'a-z0-9!#$%&\'*+\\-/=?^_`{|}~';
-
-                       // Next define the RFC 1034 'ldh-str'
-                       //      <domain> ::= <subdomain> | " "
-                       //      <subdomain> ::= <label> | <subdomain> "." <label>
-                       //      <label> ::= <letter> [ [ <ldh-str> ] <let-dig> ]
-                       //      <ldh-str> ::= <let-dig-hyp> | <let-dig-hyp> <ldh-str>
-                       //      <let-dig-hyp> ::= <let-dig> | "-"
-                       //      <let-dig> ::= <letter> | <digit>
-                       rfc1034LdhStr = 'a-z0-9\\-';
-
-                       html5EmailRegexp = new RegExp(
-                               // start of string
-                               '^'
-                               +
-                               // User part which is liberal :p
-                               '[' + rfc5322Atext + '\\.]+'
-                               +
-                               // 'at'
-                               '@'
-                               +
-                               // Domain first part
-                               '[' + rfc1034LdhStr + ']+'
-                               +
-                               // Optional second part and following are separated by a dot
-                               '(?:\\.[' + rfc1034LdhStr + ']+)*'
-                               +
-                               // End of string
-                               '$',
-                               // RegExp is case insensitive
-                               'i'
-                       );
-                       return ( null !== mailtxt.match( html5EmailRegexp ) );
-               },
-
-               /**
-                * Note: borrows from IP::isIPv4
-                *
-                * @param {string} address
-                * @param {boolean} allowBlock
-                * @return {boolean}
-                */
-               isIPv4Address: function ( address, allowBlock ) {
-                       if ( typeof address !== 'string' ) {
-                               return false;
-                       }
-
-                       var     block = allowBlock ? '(?:\\/(?:3[0-2]|[12]?\\d))?' : '',
-                               RE_IP_BYTE = '(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|0?[0-9]?[0-9])',
-                               RE_IP_ADD = '(?:' + RE_IP_BYTE + '\\.){3}' + RE_IP_BYTE;
-
-                       return address.search( new RegExp( '^' + RE_IP_ADD + block + '$' ) ) !== -1;
-               },
-
-               /**
-                * Note: borrows from IP::isIPv6
-                *
-                * @param {string} address
-                * @param {boolean} allowBlock
-                * @return {boolean}
-                */
-               isIPv6Address: function ( address, allowBlock ) {
-                       if ( typeof address !== 'string' ) {
-                               return false;
-                       }
-
-                       var     block = allowBlock ? '(?:\\/(?:12[0-8]|1[01][0-9]|[1-9]?\\d))?' : '',
-                               RE_IPV6_ADD =
-                       '(?:' + // starts with "::" (including "::")
-                       ':(?::|(?::' + '[0-9A-Fa-f]{1,4}' + '){1,7})' +
-                       '|' + // ends with "::" (except "::")
-                       '[0-9A-Fa-f]{1,4}' + '(?::' + '[0-9A-Fa-f]{1,4}' + '){0,6}::' +
-                       '|' + // contains no "::"
-                       '[0-9A-Fa-f]{1,4}' + '(?::' + '[0-9A-Fa-f]{1,4}' + '){7}' +
-                       ')';
-
-                       if ( address.search( new RegExp( '^' + RE_IPV6_ADD + block + '$' ) ) !== -1 ) {
-                               return true;
-                       }
-
-                       RE_IPV6_ADD = // contains one "::" in the middle (single '::' check below)
-                               '[0-9A-Fa-f]{1,4}' + '(?:::?' + '[0-9A-Fa-f]{1,4}' + '){1,6}';
-
-                       return address.search( new RegExp( '^' + RE_IPV6_ADD + block + '$' ) ) !== -1
-                               && address.search( /::/ ) !== -1 && address.search( /::.*::/ ) === -1;
-               }
-       };
-
-       /**
-        * @method wikiGetlink
-        * @inheritdoc #getUrl
-        * @deprecated since 1.23 Use #getUrl instead.
-        */
-       mw.log.deprecate( util, 'wikiGetlink', util.getUrl, 'Use mw.util.getUrl instead.' );
-
-       mw.util = util;
-
-}( mediaWiki, jQuery ) );
diff --git a/resources/moment/LICENSE b/resources/moment/LICENSE
deleted file mode 100644 (file)
index b44e3a6..0000000
+++ /dev/null
@@ -1,22 +0,0 @@
-Copyright (c) 2011-2013 Tim Wood, Iskren Chernev, Moment.js contributors
-
-Permission is hereby granted, free of charge, to any person
-obtaining a copy of this software and associated documentation
-files (the "Software"), to deal in the Software without
-restriction, including without limitation the rights to use,
-copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the
-Software is furnished to do so, subject to the following
-conditions:
-
-The above copyright notice and this permission notice shall be
-included in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
-OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
-OTHER DEALINGS IN THE SOFTWARE.
diff --git a/resources/moment/lang/ar-ma.js b/resources/moment/lang/ar-ma.js
deleted file mode 100644 (file)
index 1c159f1..0000000
+++ /dev/null
@@ -1,56 +0,0 @@
-// moment.js language configuration
-// language : Moroccan Arabic (ar-ma)
-// author : ElFadili Yassine : https://github.com/ElFadiliY
-// author : Abdel Said : https://github.com/abdelsaid
-
-(function (factory) {
-    if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory(window.moment); // Browser global
-    }
-}(function (moment) {
-    return moment.lang('ar-ma', {
-        months : "يناير_فبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر".split("_"),
-        monthsShort : "يناير_فبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر".split("_"),
-        weekdays : "الأحد_الإتنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت".split("_"),
-        weekdaysShort : "احد_اتنين_ثلاثاء_اربعاء_خميس_جمعة_سبت".split("_"),
-        weekdaysMin : "ح_ن_ث_ر_خ_ج_س".split("_"),
-        longDateFormat : {
-            LT : "HH:mm",
-            L : "DD/MM/YYYY",
-            LL : "D MMMM YYYY",
-            LLL : "D MMMM YYYY LT",
-            LLLL : "dddd D MMMM YYYY LT"
-        },
-        calendar : {
-            sameDay: "[اليوم على الساعة] LT",
-            nextDay: '[غدا على الساعة] LT',
-            nextWeek: 'dddd [على الساعة] LT',
-            lastDay: '[أمس على الساعة] LT',
-            lastWeek: 'dddd [على الساعة] LT',
-            sameElse: 'L'
-        },
-        relativeTime : {
-            future : "في %s",
-            past : "منذ %s",
-            s : "ثوان",
-            m : "دقيقة",
-            mm : "%d دقائق",
-            h : "ساعة",
-            hh : "%d ساعات",
-            d : "يوم",
-            dd : "%d أيام",
-            M : "شهر",
-            MM : "%d أشهر",
-            y : "سنة",
-            yy : "%d سنوات"
-        },
-        week : {
-            dow : 6, // Saturday is the first day of the week.
-            doy : 12  // The week that contains Jan 1st is the first week of the year.
-        }
-    });
-}));
diff --git a/resources/moment/lang/ar.js b/resources/moment/lang/ar.js
deleted file mode 100644 (file)
index 6e27d29..0000000
+++ /dev/null
@@ -1,56 +0,0 @@
-// moment.js language configuration
-// language : Arabic (ar)
-// author : Abdel Said : https://github.com/abdelsaid
-// changes in months, weekdays : Ahmed Elkhatib
-
-(function (factory) {
-    if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory(window.moment); // Browser global
-    }
-}(function (moment) {
-    return moment.lang('ar', {
-        months : "يناير/ كانون الثاني_فبراير/ شباط_مارس/ آذار_أبريل/ نيسان_مايو/ أيار_يونيو/ حزيران_يوليو/ تموز_أغسطس/ آب_سبتمبر/ أيلول_أكتوبر/ تشرين الأول_نوفمبر/ تشرين الثاني_ديسمبر/ كانون الأول".split("_"),
-        monthsShort : "يناير/ كانون الثاني_فبراير/ شباط_مارس/ آذار_أبريل/ نيسان_مايو/ أيار_يونيو/ حزيران_يوليو/ تموز_أغسطس/ آب_سبتمبر/ أيلول_أكتوبر/ تشرين الأول_نوفمبر/ تشرين الثاني_ديسمبر/ كانون الأول".split("_"),
-        weekdays : "الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت".split("_"),
-        weekdaysShort : "الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت".split("_"),
-        weekdaysMin : "ح_ن_ث_ر_خ_ج_س".split("_"),
-        longDateFormat : {
-            LT : "HH:mm",
-            L : "DD/MM/YYYY",
-            LL : "D MMMM YYYY",
-            LLL : "D MMMM YYYY LT",
-            LLLL : "dddd D MMMM YYYY LT"
-        },
-        calendar : {
-            sameDay: "[اليوم على الساعة] LT",
-            nextDay: '[غدا على الساعة] LT',
-            nextWeek: 'dddd [على الساعة] LT',
-            lastDay: '[أمس على الساعة] LT',
-            lastWeek: 'dddd [على الساعة] LT',
-            sameElse: 'L'
-        },
-        relativeTime : {
-            future : "في %s",
-            past : "منذ %s",
-            s : "ثوان",
-            m : "دقيقة",
-            mm : "%d دقائق",
-            h : "ساعة",
-            hh : "%d ساعات",
-            d : "يوم",
-            dd : "%d أيام",
-            M : "شهر",
-            MM : "%d أشهر",
-            y : "سنة",
-            yy : "%d سنوات"
-        },
-        week : {
-            dow : 6, // Saturday is the first day of the week.
-            doy : 12  // The week that contains Jan 1st is the first week of the year.
-        }
-    });
-}));
diff --git a/resources/moment/lang/bg.js b/resources/moment/lang/bg.js
deleted file mode 100644 (file)
index f47ed65..0000000
+++ /dev/null
@@ -1,86 +0,0 @@
-// moment.js language configuration
-// language : bulgarian (bg)
-// author : Krasen Borisov : https://github.com/kraz
-
-(function (factory) {
-    if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory(window.moment); // Browser global
-    }
-}(function (moment) {
-    return moment.lang('bg', {
-        months : "януари_февруари_март_април_май_юни_юли_август_септември_октомври_ноември_декември".split("_"),
-        monthsShort : "янр_фев_мар_апр_май_юни_юли_авг_сеп_окт_ное_дек".split("_"),
-        weekdays : "неделя_понеделник_вторник_сряда_четвъртък_петък_събота".split("_"),
-        weekdaysShort : "нед_пон_вто_сря_чет_пет_съб".split("_"),
-        weekdaysMin : "нд_пн_вт_ср_чт_пт_сб".split("_"),
-        longDateFormat : {
-            LT : "H:mm",
-            L : "D.MM.YYYY",
-            LL : "D MMMM YYYY",
-            LLL : "D MMMM YYYY LT",
-            LLLL : "dddd, D MMMM YYYY LT"
-        },
-        calendar : {
-            sameDay : '[Днес в] LT',
-            nextDay : '[Утре в] LT',
-            nextWeek : 'dddd [в] LT',
-            lastDay : '[Вчера в] LT',
-            lastWeek : function () {
-                switch (this.day()) {
-                case 0:
-                case 3:
-                case 6:
-                    return '[В изминалата] dddd [в] LT';
-                case 1:
-                case 2:
-                case 4:
-                case 5:
-                    return '[В изминалия] dddd [в] LT';
-                }
-            },
-            sameElse : 'L'
-        },
-        relativeTime : {
-            future : "след %s",
-            past : "преди %s",
-            s : "няколко секунди",
-            m : "минута",
-            mm : "%d минути",
-            h : "час",
-            hh : "%d часа",
-            d : "ден",
-            dd : "%d дни",
-            M : "месец",
-            MM : "%d месеца",
-            y : "година",
-            yy : "%d години"
-        },
-        ordinal : function (number) {
-            var lastDigit = number % 10,
-                last2Digits = number % 100;
-            if (number === 0) {
-                return number + '-ев';
-            } else if (last2Digits === 0) {
-                return number + '-ен';
-            } else if (last2Digits > 10 && last2Digits < 20) {
-                return number + '-ти';
-            } else if (lastDigit === 1) {
-                return number + '-ви';
-            } else if (lastDigit === 2) {
-                return number + '-ри';
-            } else if (lastDigit === 7 || lastDigit === 8) {
-                return number + '-ми';
-            } else {
-                return number + '-ти';
-            }
-        },
-        week : {
-            dow : 1, // Monday is the first day of the week.
-            doy : 7  // The week that contains Jan 1st is the first week of the year.
-        }
-    });
-}));
diff --git a/resources/moment/lang/br.js b/resources/moment/lang/br.js
deleted file mode 100644 (file)
index 39c60df..0000000
+++ /dev/null
@@ -1,107 +0,0 @@
-// moment.js language configuration
-// language : breton (br)
-// author : Jean-Baptiste Le Duigou : https://github.com/jbleduigou
-
-(function (factory) {
-    if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory(window.moment); // Browser global
-    }
-}(function (moment) {
-    function relativeTimeWithMutation(number, withoutSuffix, key) {
-        var format = {
-            'mm': "munutenn",
-            'MM': "miz",
-            'dd': "devezh"
-        };
-        return number + ' ' + mutation(format[key], number);
-    }
-
-    function specialMutationForYears(number) {
-        switch (lastNumber(number)) {
-        case 1:
-        case 3:
-        case 4:
-        case 5:
-        case 9:
-            return number + ' bloaz';
-        default:
-            return number + ' vloaz';
-        }
-    }
-
-    function lastNumber(number) {
-        if (number > 9) {
-            return lastNumber(number % 10);
-        }
-        return number;
-    }
-
-    function mutation(text, number) {
-        if (number === 2) {
-            return softMutation(text);
-        }
-        return text;
-    }
-
-    function softMutation(text) {
-        var mutationTable = {
-            'm': 'v',
-            'b': 'v',
-            'd': 'z'
-        };
-        if (mutationTable[text.charAt(0)] === undefined) {
-            return text;
-        }
-        return mutationTable[text.charAt(0)] + text.substring(1);
-    }
-
-    return moment.lang('br', {
-        months : "Genver_C'hwevrer_Meurzh_Ebrel_Mae_Mezheven_Gouere_Eost_Gwengolo_Here_Du_Kerzu".split("_"),
-        monthsShort : "Gen_C'hwe_Meu_Ebr_Mae_Eve_Gou_Eos_Gwe_Her_Du_Ker".split("_"),
-        weekdays : "Sul_Lun_Meurzh_Merc'her_Yaou_Gwener_Sadorn".split("_"),
-        weekdaysShort : "Sul_Lun_Meu_Mer_Yao_Gwe_Sad".split("_"),
-        weekdaysMin : "Su_Lu_Me_Mer_Ya_Gw_Sa".split("_"),
-        longDateFormat : {
-            LT : "h[e]mm A",
-            L : "DD/MM/YYYY",
-            LL : "D [a viz] MMMM YYYY",
-            LLL : "D [a viz] MMMM YYYY LT",
-            LLLL : "dddd, D [a viz] MMMM YYYY LT"
-        },
-        calendar : {
-            sameDay : '[Hiziv da] LT',
-            nextDay : '[Warc\'hoazh da] LT',
-            nextWeek : 'dddd [da] LT',
-            lastDay : '[Dec\'h da] LT',
-            lastWeek : 'dddd [paset da] LT',
-            sameElse : 'L'
-        },
-        relativeTime : {
-            future : "a-benn %s",
-            past : "%s 'zo",
-            s : "un nebeud segondennoù",
-            m : "ur vunutenn",
-            mm : relativeTimeWithMutation,
-            h : "un eur",
-            hh : "%d eur",
-            d : "un devezh",
-            dd : relativeTimeWithMutation,
-            M : "ur miz",
-            MM : relativeTimeWithMutation,
-            y : "ur bloaz",
-            yy : specialMutationForYears
-        },
-        ordinal : function (number) {
-            var output = (number === 1) ? 'añ' : 'vet';
-            return number + output;
-        },
-        week : {
-            dow : 1, // Monday is the first day of the week.
-            doy : 4  // The week that contains Jan 4th is the first week of the year.
-        }
-    });
-}));
diff --git a/resources/moment/lang/bs.js b/resources/moment/lang/bs.js
deleted file mode 100644 (file)
index 83a9b4c..0000000
+++ /dev/null
@@ -1,139 +0,0 @@
-// moment.js language configuration
-// language : bosnian (bs)
-// author : Nedim Cholich : https://github.com/frontyard
-// based on (hr) translation by Bojan Marković
-
-(function (factory) {
-    if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory(window.moment); // Browser global
-    }
-}(function (moment) {
-
-    function translate(number, withoutSuffix, key) {
-        var result = number + " ";
-        switch (key) {
-        case 'm':
-            return withoutSuffix ? 'jedna minuta' : 'jedne minute';
-        case 'mm':
-            if (number === 1) {
-                result += 'minuta';
-            } else if (number === 2 || number === 3 || number === 4) {
-                result += 'minute';
-            } else {
-                result += 'minuta';
-            }
-            return result;
-        case 'h':
-            return withoutSuffix ? 'jedan sat' : 'jednog sata';
-        case 'hh':
-            if (number === 1) {
-                result += 'sat';
-            } else if (number === 2 || number === 3 || number === 4) {
-                result += 'sata';
-            } else {
-                result += 'sati';
-            }
-            return result;
-        case 'dd':
-            if (number === 1) {
-                result += 'dan';
-            } else {
-                result += 'dana';
-            }
-            return result;
-        case 'MM':
-            if (number === 1) {
-                result += 'mjesec';
-            } else if (number === 2 || number === 3 || number === 4) {
-                result += 'mjeseca';
-            } else {
-                result += 'mjeseci';
-            }
-            return result;
-        case 'yy':
-            if (number === 1) {
-                result += 'godina';
-            } else if (number === 2 || number === 3 || number === 4) {
-                result += 'godine';
-            } else {
-                result += 'godina';
-            }
-            return result;
-        }
-    }
-
-    return moment.lang('bs', {
-               months : "januar_februar_mart_april_maj_juni_juli_avgust_septembar_oktobar_novembar_decembar".split("_"),
-               monthsShort : "jan._feb._mar._apr._maj._jun._jul._avg._sep._okt._nov._dec.".split("_"),
-        weekdays : "nedjelja_ponedjeljak_utorak_srijeda_četvrtak_petak_subota".split("_"),
-        weekdaysShort : "ned._pon._uto._sri._čet._pet._sub.".split("_"),
-        weekdaysMin : "ne_po_ut_sr_če_pe_su".split("_"),
-        longDateFormat : {
-            LT : "H:mm",
-            L : "DD. MM. YYYY",
-            LL : "D. MMMM YYYY",
-            LLL : "D. MMMM YYYY LT",
-            LLLL : "dddd, D. MMMM YYYY LT"
-        },
-        calendar : {
-            sameDay  : '[danas u] LT',
-            nextDay  : '[sutra u] LT',
-
-            nextWeek : function () {
-                switch (this.day()) {
-                case 0:
-                    return '[u] [nedjelju] [u] LT';
-                case 3:
-                    return '[u] [srijedu] [u] LT';
-                case 6:
-                    return '[u] [subotu] [u] LT';
-                case 1:
-                case 2:
-                case 4:
-                case 5:
-                    return '[u] dddd [u] LT';
-                }
-            },
-            lastDay  : '[jučer u] LT',
-            lastWeek : function () {
-                switch (this.day()) {
-                case 0:
-                case 3:
-                    return '[prošlu] dddd [u] LT';
-                case 6:
-                    return '[prošle] [subote] [u] LT';
-                case 1:
-                case 2:
-                case 4:
-                case 5:
-                    return '[prošli] dddd [u] LT';
-                }
-            },
-            sameElse : 'L'
-        },
-        relativeTime : {
-            future : "za %s",
-            past   : "prije %s",
-            s      : "par sekundi",
-            m      : translate,
-            mm     : translate,
-            h      : translate,
-            hh     : translate,
-            d      : "dan",
-            dd     : translate,
-            M      : "mjesec",
-            MM     : translate,
-            y      : "godinu",
-            yy     : translate
-        },
-        ordinal : '%d.',
-        week : {
-            dow : 1, // Monday is the first day of the week.
-            doy : 7  // The week that contains Jan 1st is the first week of the year.
-        }
-    });
-}));
diff --git a/resources/moment/lang/ca.js b/resources/moment/lang/ca.js
deleted file mode 100644 (file)
index cf47113..0000000
+++ /dev/null
@@ -1,66 +0,0 @@
-// moment.js language configuration
-// language : catalan (ca)
-// author : Juan G. Hurtado : https://github.com/juanghurtado
-
-(function (factory) {
-    if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory(window.moment); // Browser global
-    }
-}(function (moment) {
-    return moment.lang('ca', {
-        months : "gener_febrer_març_abril_maig_juny_juliol_agost_setembre_octubre_novembre_desembre".split("_"),
-        monthsShort : "gen._febr._mar._abr._mai._jun._jul._ag._set._oct._nov._des.".split("_"),
-        weekdays : "diumenge_dilluns_dimarts_dimecres_dijous_divendres_dissabte".split("_"),
-        weekdaysShort : "dg._dl._dt._dc._dj._dv._ds.".split("_"),
-        weekdaysMin : "Dg_Dl_Dt_Dc_Dj_Dv_Ds".split("_"),
-        longDateFormat : {
-            LT : "H:mm",
-            L : "DD/MM/YYYY",
-            LL : "D MMMM YYYY",
-            LLL : "D MMMM YYYY LT",
-            LLLL : "dddd D MMMM YYYY LT"
-        },
-        calendar : {
-            sameDay : function () {
-                return '[avui a ' + ((this.hours() !== 1) ? 'les' : 'la') + '] LT';
-            },
-            nextDay : function () {
-                return '[demà a ' + ((this.hours() !== 1) ? 'les' : 'la') + '] LT';
-            },
-            nextWeek : function () {
-                return 'dddd [a ' + ((this.hours() !== 1) ? 'les' : 'la') + '] LT';
-            },
-            lastDay : function () {
-                return '[ahir a ' + ((this.hours() !== 1) ? 'les' : 'la') + '] LT';
-            },
-            lastWeek : function () {
-                return '[el] dddd [passat a ' + ((this.hours() !== 1) ? 'les' : 'la') + '] LT';
-            },
-            sameElse : 'L'
-        },
-        relativeTime : {
-            future : "en %s",
-            past : "fa %s",
-            s : "uns segons",
-            m : "un minut",
-            mm : "%d minuts",
-            h : "una hora",
-            hh : "%d hores",
-            d : "un dia",
-            dd : "%d dies",
-            M : "un mes",
-            MM : "%d mesos",
-            y : "un any",
-            yy : "%d anys"
-        },
-        ordinal : '%dº',
-        week : {
-            dow : 1, // Monday is the first day of the week.
-            doy : 4  // The week that contains Jan 4th is the first week of the year.
-        }
-    });
-}));
diff --git a/resources/moment/lang/cs.js b/resources/moment/lang/cs.js
deleted file mode 100644 (file)
index c1396cf..0000000
+++ /dev/null
@@ -1,155 +0,0 @@
-// moment.js language configuration
-// language : czech (cs)
-// author : petrbela : https://github.com/petrbela
-
-(function (factory) {
-    if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory(window.moment); // Browser global
-    }
-}(function (moment) {
-    var months = "leden_únor_březen_duben_květen_červen_červenec_srpen_září_říjen_listopad_prosinec".split("_"),
-        monthsShort = "led_úno_bře_dub_kvě_čvn_čvc_srp_zář_říj_lis_pro".split("_");
-
-    function plural(n) {
-        return (n > 1) && (n < 5) && (~~(n / 10) !== 1);
-    }
-
-    function translate(number, withoutSuffix, key, isFuture) {
-        var result = number + " ";
-        switch (key) {
-        case 's':  // a few seconds / in a few seconds / a few seconds ago
-            return (withoutSuffix || isFuture) ? 'pár vteřin' : 'pár vteřinami';
-        case 'm':  // a minute / in a minute / a minute ago
-            return withoutSuffix ? 'minuta' : (isFuture ? 'minutu' : 'minutou');
-        case 'mm': // 9 minutes / in 9 minutes / 9 minutes ago
-            if (withoutSuffix || isFuture) {
-                return result + (plural(number) ? 'minuty' : 'minut');
-            } else {
-                return result + 'minutami';
-            }
-            break;
-        case 'h':  // an hour / in an hour / an hour ago
-            return withoutSuffix ? 'hodina' : (isFuture ? 'hodinu' : 'hodinou');
-        case 'hh': // 9 hours / in 9 hours / 9 hours ago
-            if (withoutSuffix || isFuture) {
-                return result + (plural(number) ? 'hodiny' : 'hodin');
-            } else {
-                return result + 'hodinami';
-            }
-            break;
-        case 'd':  // a day / in a day / a day ago
-            return (withoutSuffix || isFuture) ? 'den' : 'dnem';
-        case 'dd': // 9 days / in 9 days / 9 days ago
-            if (withoutSuffix || isFuture) {
-                return result + (plural(number) ? 'dny' : 'dní');
-            } else {
-                return result + 'dny';
-            }
-            break;
-        case 'M':  // a month / in a month / a month ago
-            return (withoutSuffix || isFuture) ? 'měsíc' : 'měsícem';
-        case 'MM': // 9 months / in 9 months / 9 months ago
-            if (withoutSuffix || isFuture) {
-                return result + (plural(number) ? 'měsíce' : 'měsíců');
-            } else {
-                return result + 'měsíci';
-            }
-            break;
-        case 'y':  // a year / in a year / a year ago
-            return (withoutSuffix || isFuture) ? 'rok' : 'rokem';
-        case 'yy': // 9 years / in 9 years / 9 years ago
-            if (withoutSuffix || isFuture) {
-                return result + (plural(number) ? 'roky' : 'let');
-            } else {
-                return result + 'lety';
-            }
-            break;
-        }
-    }
-
-    return moment.lang('cs', {
-        months : months,
-        monthsShort : monthsShort,
-        monthsParse : (function (months, monthsShort) {
-            var i, _monthsParse = [];
-            for (i = 0; i < 12; i++) {
-                // use custom parser to solve problem with July (červenec)
-                _monthsParse[i] = new RegExp('^' + months[i] + '$|^' + monthsShort[i] + '$', 'i');
-            }
-            return _monthsParse;
-        }(months, monthsShort)),
-        weekdays : "neděle_pondělí_úterý_středa_čtvrtek_pátek_sobota".split("_"),
-        weekdaysShort : "ne_po_út_st_čt_pá_so".split("_"),
-        weekdaysMin : "ne_po_út_st_čt_pá_so".split("_"),
-        longDateFormat : {
-            LT: "H:mm",
-            L : "DD.MM.YYYY",
-            LL : "D. MMMM YYYY",
-            LLL : "D. MMMM YYYY LT",
-            LLLL : "dddd D. MMMM YYYY LT"
-        },
-        calendar : {
-            sameDay: "[dnes v] LT",
-            nextDay: '[zítra v] LT',
-            nextWeek: function () {
-                switch (this.day()) {
-                case 0:
-                    return '[v neděli v] LT';
-                case 1:
-                case 2:
-                    return '[v] dddd [v] LT';
-                case 3:
-                    return '[ve středu v] LT';
-                case 4:
-                    return '[ve čtvrtek v] LT';
-                case 5:
-                    return '[v pátek v] LT';
-                case 6:
-                    return '[v sobotu v] LT';
-                }
-            },
-            lastDay: '[včera v] LT',
-            lastWeek: function () {
-                switch (this.day()) {
-                case 0:
-                    return '[minulou neděli v] LT';
-                case 1:
-                case 2:
-                    return '[minulé] dddd [v] LT';
-                case 3:
-                    return '[minulou středu v] LT';
-                case 4:
-                case 5:
-                    return '[minulý] dddd [v] LT';
-                case 6:
-                    return '[minulou sobotu v] LT';
-                }
-            },
-            sameElse: "L"
-        },
-        relativeTime : {
-            future : "za %s",
-            past : "před %s",
-            s : translate,
-            m : translate,
-            mm : translate,
-            h : translate,
-            hh : translate,
-            d : translate,
-            dd : translate,
-            M : translate,
-            MM : translate,
-            y : translate,
-            yy : translate
-        },
-        ordinal : '%d.',
-        week : {
-            dow : 1, // Monday is the first day of the week.
-            doy : 4  // The week that contains Jan 4th is the first week of the year.
-        }
-    });
-}));
diff --git a/resources/moment/lang/cv.js b/resources/moment/lang/cv.js
deleted file mode 100644 (file)
index a5812de..0000000
+++ /dev/null
@@ -1,59 +0,0 @@
-// moment.js language configuration
-// language : chuvash (cv)
-// author : Anatoly Mironov : https://github.com/mirontoli
-
-(function (factory) {
-    if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory(window.moment); // Browser global
-    }
-}(function (moment) {
-    return moment.lang('cv', {
-        months : "кăрлач_нарăс_пуш_ака_май_çĕртме_утă_çурла_авăн_юпа_чӳк_раштав".split("_"),
-        monthsShort : "кăр_нар_пуш_ака_май_çĕр_утă_çур_ав_юпа_чӳк_раш".split("_"),
-        weekdays : "вырсарникун_тунтикун_ытларикун_юнкун_кĕçнерникун_эрнекун_шăматкун".split("_"),
-        weekdaysShort : "выр_тун_ытл_юн_кĕç_эрн_шăм".split("_"),
-        weekdaysMin : "вр_тн_ыт_юн_кç_эр_шм".split("_"),
-        longDateFormat : {
-            LT : "HH:mm",
-            L : "DD-MM-YYYY",
-            LL : "YYYY [çулхи] MMMM [уйăхĕн] D[-мĕшĕ]",
-            LLL : "YYYY [çулхи] MMMM [уйăхĕн] D[-мĕшĕ], LT",
-            LLLL : "dddd, YYYY [çулхи] MMMM [уйăхĕн] D[-мĕшĕ], LT"
-        },
-        calendar : {
-            sameDay: '[Паян] LT [сехетре]',
-            nextDay: '[Ыран] LT [сехетре]',
-            lastDay: '[Ĕнер] LT [сехетре]',
-            nextWeek: '[Çитес] dddd LT [сехетре]',
-            lastWeek: '[Иртнĕ] dddd LT [сехетре]',
-            sameElse: 'L'
-        },
-        relativeTime : {
-            future : function (output) {
-                var affix = /сехет$/i.exec(output) ? "рен" : /çул$/i.exec(output) ? "тан" : "ран";
-                return output + affix;
-            },
-            past : "%s каялла",
-            s : "пĕр-ик çеккунт",
-            m : "пĕр минут",
-            mm : "%d минут",
-            h : "пĕр сехет",
-            hh : "%d сехет",
-            d : "пĕр кун",
-            dd : "%d кун",
-            M : "пĕр уйăх",
-            MM : "%d уйăх",
-            y : "пĕр çул",
-            yy : "%d çул"
-        },
-        ordinal : '%d-мĕш',
-        week : {
-            dow : 1, // Monday is the first day of the week.
-            doy : 7  // The week that contains Jan 1st is the first week of the year.
-        }
-    });
-}));
diff --git a/resources/moment/lang/cy.js b/resources/moment/lang/cy.js
deleted file mode 100644 (file)
index b47d7c2..0000000
+++ /dev/null
@@ -1,77 +0,0 @@
-// moment.js language configuration
-// language : Welsh (cy)
-// author : Robert Allen
-
-(function (factory) {
-    if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory(window.moment); // Browser global
-    }
-}(function (moment) {
-    return moment.lang("cy", {
-        months: "Ionawr_Chwefror_Mawrth_Ebrill_Mai_Mehefin_Gorffennaf_Awst_Medi_Hydref_Tachwedd_Rhagfyr".split("_"),
-        monthsShort: "Ion_Chwe_Maw_Ebr_Mai_Meh_Gor_Aws_Med_Hyd_Tach_Rhag".split("_"),
-        weekdays: "Dydd Sul_Dydd Llun_Dydd Mawrth_Dydd Mercher_Dydd Iau_Dydd Gwener_Dydd Sadwrn".split("_"),
-        weekdaysShort: "Sul_Llun_Maw_Mer_Iau_Gwe_Sad".split("_"),
-        weekdaysMin: "Su_Ll_Ma_Me_Ia_Gw_Sa".split("_"),
-        // time formats are the same as en-gb
-        longDateFormat: {
-            LT: "HH:mm",
-            L: "DD/MM/YYYY",
-            LL: "D MMMM YYYY",
-            LLL: "D MMMM YYYY LT",
-            LLLL: "dddd, D MMMM YYYY LT"
-        },
-        calendar: {
-            sameDay: '[Heddiw am] LT',
-            nextDay: '[Yfory am] LT',
-            nextWeek: 'dddd [am] LT',
-            lastDay: '[Ddoe am] LT',
-            lastWeek: 'dddd [diwethaf am] LT',
-            sameElse: 'L'
-        },
-        relativeTime: {
-            future: "mewn %s",
-            past: "%s yn àl",
-            s: "ychydig eiliadau",
-            m: "munud",
-            mm: "%d munud",
-            h: "awr",
-            hh: "%d awr",
-            d: "diwrnod",
-            dd: "%d diwrnod",
-            M: "mis",
-            MM: "%d mis",
-            y: "blwyddyn",
-            yy: "%d flynedd"
-        },
-        // traditional ordinal numbers above 31 are not commonly used in colloquial Welsh
-        ordinal: function (number) {
-            var b = number,
-                output = '',
-                lookup = [
-                    '', 'af', 'il', 'ydd', 'ydd', 'ed', 'ed', 'ed', 'fed', 'fed', 'fed', // 1af to 10fed
-                    'eg', 'fed', 'eg', 'eg', 'fed', 'eg', 'eg', 'fed', 'eg', 'fed' // 11eg to 20fed
-                ];
-
-            if (b > 20) {
-                if (b === 40 || b === 50 || b === 60 || b === 80 || b === 100) {
-                    output = 'fed'; // not 30ain, 70ain or 90ain
-                } else {
-                    output = 'ain';
-                }
-            } else if (b > 0) {
-                output = lookup[b];
-            }
-
-            return number + output;
-        },
-        week : {
-            dow : 1, // Monday is the first day of the week.
-            doy : 4  // The week that contains Jan 4th is the first week of the year.
-        }
-    });
-}));
diff --git a/resources/moment/lang/da.js b/resources/moment/lang/da.js
deleted file mode 100644 (file)
index 2fa8244..0000000
+++ /dev/null
@@ -1,56 +0,0 @@
-// moment.js language configuration
-// language : danish (da)
-// author : Ulrik Nielsen : https://github.com/mrbase
-
-(function (factory) {
-    if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory(window.moment); // Browser global
-    }
-}(function (moment) {
-    return moment.lang('da', {
-        months : "januar_februar_marts_april_maj_juni_juli_august_september_oktober_november_december".split("_"),
-        monthsShort : "jan_feb_mar_apr_maj_jun_jul_aug_sep_okt_nov_dec".split("_"),
-        weekdays : "søndag_mandag_tirsdag_onsdag_torsdag_fredag_lørdag".split("_"),
-        weekdaysShort : "søn_man_tir_ons_tor_fre_lør".split("_"),
-        weekdaysMin : "sø_ma_ti_on_to_fr_lø".split("_"),
-        longDateFormat : {
-            LT : "HH:mm",
-            L : "DD/MM/YYYY",
-            LL : "D MMMM YYYY",
-            LLL : "D MMMM YYYY LT",
-            LLLL : "dddd D. MMMM, YYYY LT"
-        },
-        calendar : {
-            sameDay : '[I dag kl.] LT',
-            nextDay : '[I morgen kl.] LT',
-            nextWeek : 'dddd [kl.] LT',
-            lastDay : '[I går kl.] LT',
-            lastWeek : '[sidste] dddd [kl] LT',
-            sameElse : 'L'
-        },
-        relativeTime : {
-            future : "om %s",
-            past : "%s siden",
-            s : "få sekunder",
-            m : "et minut",
-            mm : "%d minutter",
-            h : "en time",
-            hh : "%d timer",
-            d : "en dag",
-            dd : "%d dage",
-            M : "en måned",
-            MM : "%d måneder",
-            y : "et år",
-            yy : "%d år"
-        },
-        ordinal : '%d.',
-        week : {
-            dow : 1, // Monday is the first day of the week.
-            doy : 4  // The week that contains Jan 4th is the first week of the year.
-        }
-    });
-}));
diff --git a/resources/moment/lang/de.js b/resources/moment/lang/de.js
deleted file mode 100644 (file)
index 988f328..0000000
+++ /dev/null
@@ -1,71 +0,0 @@
-// moment.js language configuration
-// language : german (de)
-// author : lluchs : https://github.com/lluchs
-// author: Menelion Elensúle: https://github.com/Oire
-
-(function (factory) {
-    if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory(window.moment); // Browser global
-    }
-}(function (moment) {
-    function processRelativeTime(number, withoutSuffix, key, isFuture) {
-        var format = {
-            'm': ['eine Minute', 'einer Minute'],
-            'h': ['eine Stunde', 'einer Stunde'],
-            'd': ['ein Tag', 'einem Tag'],
-            'dd': [number + ' Tage', number + ' Tagen'],
-            'M': ['ein Monat', 'einem Monat'],
-            'MM': [number + ' Monate', number + ' Monaten'],
-            'y': ['ein Jahr', 'einem Jahr'],
-            'yy': [number + ' Jahre', number + ' Jahren']
-        };
-        return withoutSuffix ? format[key][0] : format[key][1];
-    }
-
-    return moment.lang('de', {
-        months : "Januar_Februar_März_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember".split("_"),
-        monthsShort : "Jan._Febr._Mrz._Apr._Mai_Jun._Jul._Aug._Sept._Okt._Nov._Dez.".split("_"),
-        weekdays : "Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag".split("_"),
-        weekdaysShort : "So._Mo._Di._Mi._Do._Fr._Sa.".split("_"),
-        weekdaysMin : "So_Mo_Di_Mi_Do_Fr_Sa".split("_"),
-        longDateFormat : {
-            LT: "H:mm [Uhr]",
-            L : "DD.MM.YYYY",
-            LL : "D. MMMM YYYY",
-            LLL : "D. MMMM YYYY LT",
-            LLLL : "dddd, D. MMMM YYYY LT"
-        },
-        calendar : {
-            sameDay: "[Heute um] LT",
-            sameElse: "L",
-            nextDay: '[Morgen um] LT',
-            nextWeek: 'dddd [um] LT',
-            lastDay: '[Gestern um] LT',
-            lastWeek: '[letzten] dddd [um] LT'
-        },
-        relativeTime : {
-            future : "in %s",
-            past : "vor %s",
-            s : "ein paar Sekunden",
-            m : processRelativeTime,
-            mm : "%d Minuten",
-            h : processRelativeTime,
-            hh : "%d Stunden",
-            d : processRelativeTime,
-            dd : processRelativeTime,
-            M : processRelativeTime,
-            MM : processRelativeTime,
-            y : processRelativeTime,
-            yy : processRelativeTime
-        },
-        ordinal : '%d.',
-        week : {
-            dow : 1, // Monday is the first day of the week.
-            doy : 4  // The week that contains Jan 4th is the first week of the year.
-        }
-    });
-}));
diff --git a/resources/moment/lang/el.js b/resources/moment/lang/el.js
deleted file mode 100644 (file)
index 9dfea23..0000000
+++ /dev/null
@@ -1,79 +0,0 @@
-// moment.js language configuration
-// language : modern greek (el)
-// author : Aggelos Karalias : https://github.com/mehiel
-
-(function (factory) {
-    if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory(window.moment); // Browser global
-    }
-}(function (moment) {
-    return moment.lang('el', {
-        monthsNominativeEl : "Ιανουάριος_Φεβρουάριος_Μάρτιος_Απρίλιος_Μάιος_Ιούνιος_Ιούλιος_Αύγουστος_Σεπτέμβριος_Οκτώβριος_Νοέμβριος_Δεκέμβριος".split("_"),
-        monthsGenitiveEl : "Ιανουαρίου_Φεβρουαρίου_Μαρτίου_Απριλίου_Μαΐου_Ιουνίου_Ιουλίου_Αυγούστου_Σεπτεμβρίου_Οκτωβρίου_Νοεμβρίου_Δεκεμβρίου".split("_"),
-        months : function (momentToFormat, format) {
-            if (/D/.test(format.substring(0, format.indexOf("MMMM")))) { // if there is a day number before 'MMMM'
-                return this._monthsGenitiveEl[momentToFormat.month()];
-            } else {
-                return this._monthsNominativeEl[momentToFormat.month()];
-            }
-        },
-        monthsShort : "Ιαν_Φεβ_Μαρ_Απρ_Μαϊ_Ιουν_Ιουλ_Αυγ_Σεπ_Οκτ_Νοε_Δεκ".split("_"),
-        weekdays : "Κυριακή_Δευτέρα_Τρίτη_Τετάρτη_Πέμπτη_Παρασκευή_Σάββατο".split("_"),
-        weekdaysShort : "Κυρ_Δευ_Τρι_Τετ_Πεμ_Παρ_Σαβ".split("_"),
-        weekdaysMin : "Κυ_Δε_Τρ_Τε_Πε_Πα_Σα".split("_"),
-        meridiem : function (hours, minutes, isLower) {
-            if (hours > 11) {
-                return isLower ? 'μμ' : 'ΜΜ';
-            } else {
-                return isLower ? 'πμ' : 'ΠΜ';
-            }
-        },
-        longDateFormat : {
-            LT : "h:mm A",
-            L : "DD/MM/YYYY",
-            LL : "D MMMM YYYY",
-            LLL : "D MMMM YYYY LT",
-            LLLL : "dddd, D MMMM YYYY LT"
-        },
-        calendarEl : {
-            sameDay : '[Σήμερα {}] LT',
-            nextDay : '[Αύριο {}] LT',
-            nextWeek : 'dddd [{}] LT',
-            lastDay : '[Χθες {}] LT',
-            lastWeek : '[την προηγούμενη] dddd [{}] LT',
-            sameElse : 'L'
-        },
-        calendar : function (key, mom) {
-            var output = this._calendarEl[key],
-                hours = mom && mom.hours();
-
-            return output.replace("{}", (hours % 12 === 1 ? "στη" : "στις"));
-        },
-        relativeTime : {
-            future : "σε %s",
-            past : "%s πριν",
-            s : "δευτερόλεπτα",
-            m : "ένα λεπτό",
-            mm : "%d λεπτά",
-            h : "μία ώρα",
-            hh : "%d ώρες",
-            d : "μία μέρα",
-            dd : "%d μέρες",
-            M : "ένας μήνας",
-            MM : "%d μήνες",
-            y : "ένας χρόνος",
-            yy : "%d χρόνια"
-        },
-        ordinal : function (number) {
-            return number + 'η';
-        },
-        week : {
-            dow : 1, // Monday is the first day of the week.
-            doy : 4  // The week that contains Jan 4st is the first week of the year.
-        }
-    });
-}));
diff --git a/resources/moment/lang/en-au.js b/resources/moment/lang/en-au.js
deleted file mode 100644 (file)
index 4d91e25..0000000
+++ /dev/null
@@ -1,62 +0,0 @@
-// moment.js language configuration
-// language : australian english (en-au)
-
-(function (factory) {
-    if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory(window.moment); // Browser global
-    }
-}(function (moment) {
-    return moment.lang('en-au', {
-        months : "January_February_March_April_May_June_July_August_September_October_November_December".split("_"),
-        monthsShort : "Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),
-        weekdays : "Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),
-        weekdaysShort : "Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),
-        weekdaysMin : "Su_Mo_Tu_We_Th_Fr_Sa".split("_"),
-        longDateFormat : {
-            LT : "h:mm A",
-            L : "DD/MM/YYYY",
-            LL : "D MMMM YYYY",
-            LLL : "D MMMM YYYY LT",
-            LLLL : "dddd, D MMMM YYYY LT"
-        },
-        calendar : {
-            sameDay : '[Today at] LT',
-            nextDay : '[Tomorrow at] LT',
-            nextWeek : 'dddd [at] LT',
-            lastDay : '[Yesterday at] LT',
-            lastWeek : '[Last] dddd [at] LT',
-            sameElse : 'L'
-        },
-        relativeTime : {
-            future : "in %s",
-            past : "%s ago",
-            s : "a few seconds",
-            m : "a minute",
-            mm : "%d minutes",
-            h : "an hour",
-            hh : "%d hours",
-            d : "a day",
-            dd : "%d days",
-            M : "a month",
-            MM : "%d months",
-            y : "a year",
-            yy : "%d years"
-        },
-        ordinal : function (number) {
-            var b = number % 10,
-                output = (~~ (number % 100 / 10) === 1) ? 'th' :
-                (b === 1) ? 'st' :
-                (b === 2) ? 'nd' :
-                (b === 3) ? 'rd' : 'th';
-            return number + output;
-        },
-        week : {
-            dow : 1, // Monday is the first day of the week.
-            doy : 4  // The week that contains Jan 4th is the first week of the year.
-        }
-    });
-}));
diff --git a/resources/moment/lang/en-ca.js b/resources/moment/lang/en-ca.js
deleted file mode 100644 (file)
index a97e9f3..0000000
+++ /dev/null
@@ -1,59 +0,0 @@
-// moment.js language configuration
-// language : canadian english (en-ca)
-// author : Jonathan Abourbih : https://github.com/jonbca
-
-(function (factory) {
-    if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory(window.moment); // Browser global
-    }
-}(function (moment) {
-    return moment.lang('en-ca', {
-        months : "January_February_March_April_May_June_July_August_September_October_November_December".split("_"),
-        monthsShort : "Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),
-        weekdays : "Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),
-        weekdaysShort : "Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),
-        weekdaysMin : "Su_Mo_Tu_We_Th_Fr_Sa".split("_"),
-        longDateFormat : {
-            LT : "h:mm A",
-            L : "YYYY-MM-DD",
-            LL : "D MMMM, YYYY",
-            LLL : "D MMMM, YYYY LT",
-            LLLL : "dddd, D MMMM, YYYY LT"
-        },
-        calendar : {
-            sameDay : '[Today at] LT',
-            nextDay : '[Tomorrow at] LT',
-            nextWeek : 'dddd [at] LT',
-            lastDay : '[Yesterday at] LT',
-            lastWeek : '[Last] dddd [at] LT',
-            sameElse : 'L'
-        },
-        relativeTime : {
-            future : "in %s",
-            past : "%s ago",
-            s : "a few seconds",
-            m : "a minute",
-            mm : "%d minutes",
-            h : "an hour",
-            hh : "%d hours",
-            d : "a day",
-            dd : "%d days",
-            M : "a month",
-            MM : "%d months",
-            y : "a year",
-            yy : "%d years"
-        },
-        ordinal : function (number) {
-            var b = number % 10,
-                output = (~~ (number % 100 / 10) === 1) ? 'th' :
-                (b === 1) ? 'st' :
-                (b === 2) ? 'nd' :
-                (b === 3) ? 'rd' : 'th';
-            return number + output;
-        }
-    });
-}));
diff --git a/resources/moment/lang/en-gb.js b/resources/moment/lang/en-gb.js
deleted file mode 100644 (file)
index 3a7907b..0000000
+++ /dev/null
@@ -1,63 +0,0 @@
-// moment.js language configuration
-// language : great britain english (en-gb)
-// author : Chris Gedrim : https://github.com/chrisgedrim
-
-(function (factory) {
-    if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory(window.moment); // Browser global
-    }
-}(function (moment) {
-    return moment.lang('en-gb', {
-        months : "January_February_March_April_May_June_July_August_September_October_November_December".split("_"),
-        monthsShort : "Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),
-        weekdays : "Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),
-        weekdaysShort : "Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),
-        weekdaysMin : "Su_Mo_Tu_We_Th_Fr_Sa".split("_"),
-        longDateFormat : {
-            LT : "HH:mm",
-            L : "DD/MM/YYYY",
-            LL : "D MMMM YYYY",
-            LLL : "D MMMM YYYY LT",
-            LLLL : "dddd, D MMMM YYYY LT"
-        },
-        calendar : {
-            sameDay : '[Today at] LT',
-            nextDay : '[Tomorrow at] LT',
-            nextWeek : 'dddd [at] LT',
-            lastDay : '[Yesterday at] LT',
-            lastWeek : '[Last] dddd [at] LT',
-            sameElse : 'L'
-        },
-        relativeTime : {
-            future : "in %s",
-            past : "%s ago",
-            s : "a few seconds",
-            m : "a minute",
-            mm : "%d minutes",
-            h : "an hour",
-            hh : "%d hours",
-            d : "a day",
-            dd : "%d days",
-            M : "a month",
-            MM : "%d months",
-            y : "a year",
-            yy : "%d years"
-        },
-        ordinal : function (number) {
-            var b = number % 10,
-                output = (~~ (number % 100 / 10) === 1) ? 'th' :
-                (b === 1) ? 'st' :
-                (b === 2) ? 'nd' :
-                (b === 3) ? 'rd' : 'th';
-            return number + output;
-        },
-        week : {
-            dow : 1, // Monday is the first day of the week.
-            doy : 4  // The week that contains Jan 4th is the first week of the year.
-        }
-    });
-}));
diff --git a/resources/moment/lang/eo.js b/resources/moment/lang/eo.js
deleted file mode 100644 (file)
index 03b1abf..0000000
+++ /dev/null
@@ -1,65 +0,0 @@
-// moment.js language configuration
-// language : esperanto (eo)
-// author : Colin Dean : https://github.com/colindean
-// komento: Mi estas malcerta se mi korekte traktis akuzativojn en tiu traduko.
-//          Se ne, bonvolu korekti kaj avizi min por ke mi povas lerni!
-
-(function (factory) {
-    if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory(window.moment); // Browser global
-    }
-}(function (moment) {
-    return moment.lang('eo', {
-        months : "januaro_februaro_marto_aprilo_majo_junio_julio_aŭgusto_septembro_oktobro_novembro_decembro".split("_"),
-        monthsShort : "jan_feb_mar_apr_maj_jun_jul_aŭg_sep_okt_nov_dec".split("_"),
-        weekdays : "Dimanĉo_Lundo_Mardo_Merkredo_Ĵaŭdo_Vendredo_Sabato".split("_"),
-        weekdaysShort : "Dim_Lun_Mard_Merk_Ĵaŭ_Ven_Sab".split("_"),
-        weekdaysMin : "Di_Lu_Ma_Me_Ĵa_Ve_Sa".split("_"),
-        longDateFormat : {
-            LT : "HH:mm",
-            L : "YYYY-MM-DD",
-            LL : "D[-an de] MMMM, YYYY",
-            LLL : "D[-an de] MMMM, YYYY LT",
-            LLLL : "dddd, [la] D[-an de] MMMM, YYYY LT"
-        },
-        meridiem : function (hours, minutes, isLower) {
-            if (hours > 11) {
-                return isLower ? 'p.t.m.' : 'P.T.M.';
-            } else {
-                return isLower ? 'a.t.m.' : 'A.T.M.';
-            }
-        },
-        calendar : {
-            sameDay : '[Hodiaŭ je] LT',
-            nextDay : '[Morgaŭ je] LT',
-            nextWeek : 'dddd [je] LT',
-            lastDay : '[Hieraŭ je] LT',
-            lastWeek : '[pasinta] dddd [je] LT',
-            sameElse : 'L'
-        },
-        relativeTime : {
-            future : "je %s",
-            past : "antaŭ %s",
-            s : "sekundoj",
-            m : "minuto",
-            mm : "%d minutoj",
-            h : "horo",
-            hh : "%d horoj",
-            d : "tago",//ne 'diurno', ĉar estas uzita por proksimumo
-            dd : "%d tagoj",
-            M : "monato",
-            MM : "%d monatoj",
-            y : "jaro",
-            yy : "%d jaroj"
-        },
-        ordinal : "%da",
-        week : {
-            dow : 1, // Monday is the first day of the week.
-            doy : 7  // The week that contains Jan 1st is the first week of the year.
-        }
-    });
-}));
diff --git a/resources/moment/lang/es.js b/resources/moment/lang/es.js
deleted file mode 100644 (file)
index 0a38396..0000000
+++ /dev/null
@@ -1,66 +0,0 @@
-// moment.js language configuration
-// language : spanish (es)
-// author : Julio Napurí : https://github.com/julionc
-
-(function (factory) {
-    if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory(window.moment); // Browser global
-    }
-}(function (moment) {
-    return moment.lang('es', {
-        months : "enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre".split("_"),
-        monthsShort : "ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.".split("_"),
-        weekdays : "domingo_lunes_martes_miércoles_jueves_viernes_sábado".split("_"),
-        weekdaysShort : "dom._lun._mar._mié._jue._vie._sáb.".split("_"),
-        weekdaysMin : "Do_Lu_Ma_Mi_Ju_Vi_Sá".split("_"),
-        longDateFormat : {
-            LT : "H:mm",
-            L : "DD/MM/YYYY",
-            LL : "D [de] MMMM [de] YYYY",
-            LLL : "D [de] MMMM [de] YYYY LT",
-            LLLL : "dddd, D [de] MMMM [de] YYYY LT"
-        },
-        calendar : {
-            sameDay : function () {
-                return '[hoy a la' + ((this.hours() !== 1) ? 's' : '') + '] LT';
-            },
-            nextDay : function () {
-                return '[mañana a la' + ((this.hours() !== 1) ? 's' : '') + '] LT';
-            },
-            nextWeek : function () {
-                return 'dddd [a la' + ((this.hours() !== 1) ? 's' : '') + '] LT';
-            },
-            lastDay : function () {
-                return '[ayer a la' + ((this.hours() !== 1) ? 's' : '') + '] LT';
-            },
-            lastWeek : function () {
-                return '[el] dddd [pasado a la' + ((this.hours() !== 1) ? 's' : '') + '] LT';
-            },
-            sameElse : 'L'
-        },
-        relativeTime : {
-            future : "en %s",
-            past : "hace %s",
-            s : "unos segundos",
-            m : "un minuto",
-            mm : "%d minutos",
-            h : "una hora",
-            hh : "%d horas",
-            d : "un día",
-            dd : "%d días",
-            M : "un mes",
-            MM : "%d meses",
-            y : "un año",
-            yy : "%d años"
-        },
-        ordinal : '%dº',
-        week : {
-            dow : 1, // Monday is the first day of the week.
-            doy : 4  // The week that contains Jan 4th is the first week of the year.
-        }
-    });
-}));
diff --git a/resources/moment/lang/et.js b/resources/moment/lang/et.js
deleted file mode 100644 (file)
index fb410ef..0000000
+++ /dev/null
@@ -1,76 +0,0 @@
-// moment.js language configuration
-// language : estonian (et)
-// author : Henry Kehlmann : https://github.com/madhenry
-// improvements : Illimar Tambek : https://github.com/ragulka
-
-(function (factory) {
-    if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory(window.moment); // Browser global
-    }
-}(function (moment) {
-    function processRelativeTime(number, withoutSuffix, key, isFuture) {
-        var format = {
-            's' : ['mõne sekundi', 'mõni sekund', 'paar sekundit'],
-            'm' : ['ühe minuti', 'üks minut'],
-            'mm': [number + ' minuti', number + ' minutit'],
-            'h' : ['ühe tunni', 'tund aega', 'üks tund'],
-            'hh': [number + ' tunni', number + ' tundi'],
-            'd' : ['ühe päeva', 'üks päev'],
-            'M' : ['kuu aja', 'kuu aega', 'üks kuu'],
-            'MM': [number + ' kuu', number + ' kuud'],
-            'y' : ['ühe aasta', 'aasta', 'üks aasta'],
-            'yy': [number + ' aasta', number + ' aastat']
-        };
-        if (withoutSuffix) {
-            return format[key][2] ? format[key][2] : format[key][1];
-        }
-        return isFuture ? format[key][0] : format[key][1];
-    }
-
-    return moment.lang('et', {
-        months        : "jaanuar_veebruar_märts_aprill_mai_juuni_juuli_august_september_oktoober_november_detsember".split("_"),
-        monthsShort   : "jaan_veebr_märts_apr_mai_juuni_juuli_aug_sept_okt_nov_dets".split("_"),
-        weekdays      : "pühapäev_esmaspäev_teisipäev_kolmapäev_neljapäev_reede_laupäev".split("_"),
-        weekdaysShort : "P_E_T_K_N_R_L".split("_"),
-        weekdaysMin   : "P_E_T_K_N_R_L".split("_"),
-        longDateFormat : {
-            LT   : "H:mm",
-            L    : "DD.MM.YYYY",
-            LL   : "D. MMMM YYYY",
-            LLL  : "D. MMMM YYYY LT",
-            LLLL : "dddd, D. MMMM YYYY LT"
-        },
-        calendar : {
-            sameDay  : '[Täna,] LT',
-            nextDay  : '[Homme,] LT',
-            nextWeek : '[Järgmine] dddd LT',
-            lastDay  : '[Eile,] LT',
-            lastWeek : '[Eelmine] dddd LT',
-            sameElse : 'L'
-        },
-        relativeTime : {
-            future : "%s pärast",
-            past   : "%s tagasi",
-            s      : processRelativeTime,
-            m      : processRelativeTime,
-            mm     : processRelativeTime,
-            h      : processRelativeTime,
-            hh     : processRelativeTime,
-            d      : processRelativeTime,
-            dd     : '%d päeva',
-            M      : processRelativeTime,
-            MM     : processRelativeTime,
-            y      : processRelativeTime,
-            yy     : processRelativeTime
-        },
-        ordinal : '%d.',
-        week : {
-            dow : 1, // Monday is the first day of the week.
-            doy : 4  // The week that contains Jan 4th is the first week of the year.
-        }
-    });
-}));
diff --git a/resources/moment/lang/eu.js b/resources/moment/lang/eu.js
deleted file mode 100644 (file)
index 659b739..0000000
+++ /dev/null
@@ -1,60 +0,0 @@
-// moment.js language configuration
-// language : euskara (eu)
-// author : Eneko Illarramendi : https://github.com/eillarra
-
-(function (factory) {
-    if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory(window.moment); // Browser global
-    }
-}(function (moment) {
-    return moment.lang('eu', {
-        months : "urtarrila_otsaila_martxoa_apirila_maiatza_ekaina_uztaila_abuztua_iraila_urria_azaroa_abendua".split("_"),
-        monthsShort : "urt._ots._mar._api._mai._eka._uzt._abu._ira._urr._aza._abe.".split("_"),
-        weekdays : "igandea_astelehena_asteartea_asteazkena_osteguna_ostirala_larunbata".split("_"),
-        weekdaysShort : "ig._al._ar._az._og._ol._lr.".split("_"),
-        weekdaysMin : "ig_al_ar_az_og_ol_lr".split("_"),
-        longDateFormat : {
-            LT : "HH:mm",
-            L : "YYYY-MM-DD",
-            LL : "YYYY[ko] MMMM[ren] D[a]",
-            LLL : "YYYY[ko] MMMM[ren] D[a] LT",
-            LLLL : "dddd, YYYY[ko] MMMM[ren] D[a] LT",
-            l : "YYYY-M-D",
-            ll : "YYYY[ko] MMM D[a]",
-            lll : "YYYY[ko] MMM D[a] LT",
-            llll : "ddd, YYYY[ko] MMM D[a] LT"
-        },
-        calendar : {
-            sameDay : '[gaur] LT[etan]',
-            nextDay : '[bihar] LT[etan]',
-            nextWeek : 'dddd LT[etan]',
-            lastDay : '[atzo] LT[etan]',
-            lastWeek : '[aurreko] dddd LT[etan]',
-            sameElse : 'L'
-        },
-        relativeTime : {
-            future : "%s barru",
-            past : "duela %s",
-            s : "segundo batzuk",
-            m : "minutu bat",
-            mm : "%d minutu",
-            h : "ordu bat",
-            hh : "%d ordu",
-            d : "egun bat",
-            dd : "%d egun",
-            M : "hilabete bat",
-            MM : "%d hilabete",
-            y : "urte bat",
-            yy : "%d urte"
-        },
-        ordinal : '%d.',
-        week : {
-            dow : 1, // Monday is the first day of the week.
-            doy : 7  // The week that contains Jan 1st is the first week of the year.
-        }
-    });
-}));
diff --git a/resources/moment/lang/fa.js b/resources/moment/lang/fa.js
deleted file mode 100644 (file)
index 4a690c4..0000000
+++ /dev/null
@@ -1,97 +0,0 @@
-// moment.js language configuration
-// language : Persian Language
-// author : Ebrahim Byagowi : https://github.com/ebraminio
-
-(function (factory) {
-    if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory(window.moment); // Browser global
-    }
-}(function (moment) {
-    var symbolMap = {
-        '1': '۱',
-        '2': '۲',
-        '3': '۳',
-        '4': '۴',
-        '5': '۵',
-        '6': '۶',
-        '7': '۷',
-        '8': '۸',
-        '9': '۹',
-        '0': '۰'
-    }, numberMap = {
-        '۱': '1',
-        '۲': '2',
-        '۳': '3',
-        '۴': '4',
-        '۵': '5',
-        '۶': '6',
-        '۷': '7',
-        '۸': '8',
-        '۹': '9',
-        '۰': '0'
-    };
-
-    return moment.lang('fa', {
-        months : 'ژانویه_فوریه_مارس_آوریل_مه_ژوئن_ژوئیه_اوت_سپتامبر_اکتبر_نوامبر_دسامبر'.split('_'),
-        monthsShort : 'ژانویه_فوریه_مارس_آوریل_مه_ژوئن_ژوئیه_اوت_سپتامبر_اکتبر_نوامبر_دسامبر'.split('_'),
-        weekdays : 'یک\u200cشنبه_دوشنبه_سه\u200cشنبه_چهارشنبه_پنج\u200cشنبه_جمعه_شنبه'.split('_'),
-        weekdaysShort : 'یک\u200cشنبه_دوشنبه_سه\u200cشنبه_چهارشنبه_پنج\u200cشنبه_جمعه_شنبه'.split('_'),
-        weekdaysMin : 'ی_د_س_چ_پ_ج_ش'.split('_'),
-        longDateFormat : {
-            LT : 'HH:mm',
-            L : 'DD/MM/YYYY',
-            LL : 'D MMMM YYYY',
-            LLL : 'D MMMM YYYY LT',
-            LLLL : 'dddd, D MMMM YYYY LT'
-        },
-        meridiem : function (hour, minute, isLower) {
-            if (hour < 12) {
-                return "قبل از ظهر";
-            } else {
-                return "بعد از ظهر";
-            }
-        },
-        calendar : {
-            sameDay : '[امروز ساعت] LT',
-            nextDay : '[فردا ساعت] LT',
-            nextWeek : 'dddd [ساعت] LT',
-            lastDay : '[دیروز ساعت] LT',
-            lastWeek : 'dddd [پیش] [ساعت] LT',
-            sameElse : 'L'
-        },
-        relativeTime : {
-            future : 'در %s',
-            past : '%s پیش',
-            s : 'چندین ثانیه',
-            m : 'یک دقیقه',
-            mm : '%d دقیقه',
-            h : 'یک ساعت',
-            hh : '%d ساعت',
-            d : 'یک روز',
-            dd : '%d روز',
-            M : 'یک ماه',
-            MM : '%d ماه',
-            y : 'یک سال',
-            yy : '%d سال'
-        },
-        preparse: function (string) {
-            return string.replace(/[۰-۹]/g, function (match) {
-                return numberMap[match];
-            }).replace(/،/g, ',');
-        },
-        postformat: function (string) {
-            return string.replace(/\d/g, function (match) {
-                return symbolMap[match];
-            }).replace(/,/g, '،');
-        },
-        ordinal : '%dم',
-        week : {
-            dow : 6, // Saturday is the first day of the week.
-            doy : 12 // The week that contains Jan 1st is the first week of the year.
-        }
-    });
-}));
diff --git a/resources/moment/lang/fi.js b/resources/moment/lang/fi.js
deleted file mode 100644 (file)
index 18529c1..0000000
+++ /dev/null
@@ -1,103 +0,0 @@
-// moment.js language configuration
-// language : finnish (fi)
-// author : Tarmo Aidantausta : https://github.com/bleadof
-
-(function (factory) {
-    if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory(window.moment); // Browser global
-    }
-}(function (moment) {
-    var numbers_past = 'nolla yksi kaksi kolme neljä viisi kuusi seitsemän kahdeksan yhdeksän'.split(' '),
-        numbers_future = ['nolla', 'yhden', 'kahden', 'kolmen', 'neljän', 'viiden', 'kuuden',
-                          numbers_past[7], numbers_past[8], numbers_past[9]];
-
-    function translate(number, withoutSuffix, key, isFuture) {
-        var result = "";
-        switch (key) {
-        case 's':
-            return isFuture ? 'muutaman sekunnin' : 'muutama sekunti';
-        case 'm':
-            return isFuture ? 'minuutin' : 'minuutti';
-        case 'mm':
-            result = isFuture ? 'minuutin' : 'minuuttia';
-            break;
-        case 'h':
-            return isFuture ? 'tunnin' : 'tunti';
-        case 'hh':
-            result = isFuture ? 'tunnin' : 'tuntia';
-            break;
-        case 'd':
-            return isFuture ? 'päivän' : 'päivä';
-        case 'dd':
-            result = isFuture ? 'päivän' : 'päivää';
-            break;
-        case 'M':
-            return isFuture ? 'kuukauden' : 'kuukausi';
-        case 'MM':
-            result = isFuture ? 'kuukauden' : 'kuukautta';
-            break;
-        case 'y':
-            return isFuture ? 'vuoden' : 'vuosi';
-        case 'yy':
-            result = isFuture ? 'vuoden' : 'vuotta';
-            break;
-        }
-        result = verbal_number(number, isFuture) + " " + result;
-        return result;
-    }
-
-    function verbal_number(number, isFuture) {
-        return number < 10 ? (isFuture ? numbers_future[number] : numbers_past[number]) : number;
-    }
-
-    return moment.lang('fi', {
-        months : "tammikuu_helmikuu_maaliskuu_huhtikuu_toukokuu_kesäkuu_heinäkuu_elokuu_syyskuu_lokakuu_marraskuu_joulukuu".split("_"),
-        monthsShort : "tammi_helmi_maalis_huhti_touko_kesä_heinä_elo_syys_loka_marras_joulu".split("_"),
-        weekdays : "sunnuntai_maanantai_tiistai_keskiviikko_torstai_perjantai_lauantai".split("_"),
-        weekdaysShort : "su_ma_ti_ke_to_pe_la".split("_"),
-        weekdaysMin : "su_ma_ti_ke_to_pe_la".split("_"),
-        longDateFormat : {
-            LT : "HH.mm",
-            L : "DD.MM.YYYY",
-            LL : "Do MMMM[ta] YYYY",
-            LLL : "Do MMMM[ta] YYYY, [klo] LT",
-            LLLL : "dddd, Do MMMM[ta] YYYY, [klo] LT",
-            l : "D.M.YYYY",
-            ll : "Do MMM YYYY",
-            lll : "Do MMM YYYY, [klo] LT",
-            llll : "ddd, Do MMM YYYY, [klo] LT"
-        },
-        calendar : {
-            sameDay : '[tänään] [klo] LT',
-            nextDay : '[huomenna] [klo] LT',
-            nextWeek : 'dddd [klo] LT',
-            lastDay : '[eilen] [klo] LT',
-            lastWeek : '[viime] dddd[na] [klo] LT',
-            sameElse : 'L'
-        },
-        relativeTime : {
-            future : "%s päästä",
-            past : "%s sitten",
-            s : translate,
-            m : translate,
-            mm : translate,
-            h : translate,
-            hh : translate,
-            d : translate,
-            dd : translate,
-            M : translate,
-            MM : translate,
-            y : translate,
-            yy : translate
-        },
-        ordinal : "%d.",
-        week : {
-            dow : 1, // Monday is the first day of the week.
-            doy : 4  // The week that contains Jan 4th is the first week of the year.
-        }
-    });
-}));
diff --git a/resources/moment/lang/fo.js b/resources/moment/lang/fo.js
deleted file mode 100644 (file)
index 2f1cbb8..0000000
+++ /dev/null
@@ -1,56 +0,0 @@
-// moment.js language configuration
-// language : faroese (fo)
-// author : Ragnar Johannesen : https://github.com/ragnar123
-
-(function (factory) {
-    if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory(window.moment); // Browser global
-    }
-}(function (moment) {
-    return moment.lang('fo', {
-        months : "januar_februar_mars_apríl_mai_juni_juli_august_september_oktober_november_desember".split("_"),
-        monthsShort : "jan_feb_mar_apr_mai_jun_jul_aug_sep_okt_nov_des".split("_"),
-        weekdays : "sunnudagur_mánadagur_týsdagur_mikudagur_hósdagur_fríggjadagur_leygardagur".split("_"),
-        weekdaysShort : "sun_mán_týs_mik_hós_frí_ley".split("_"),
-        weekdaysMin : "su_má_tý_mi_hó_fr_le".split("_"),
-        longDateFormat : {
-            LT : "HH:mm",
-            L : "DD/MM/YYYY",
-            LL : "D MMMM YYYY",
-            LLL : "D MMMM YYYY LT",
-            LLLL : "dddd D. MMMM, YYYY LT"
-        },
-        calendar : {
-            sameDay : '[Í dag kl.] LT',
-            nextDay : '[Í morgin kl.] LT',
-            nextWeek : 'dddd [kl.] LT',
-            lastDay : '[Í gjár kl.] LT',
-            lastWeek : '[síðstu] dddd [kl] LT',
-            sameElse : 'L'
-        },
-        relativeTime : {
-            future : "um %s",
-            past : "%s síðani",
-            s : "fá sekund",
-            m : "ein minutt",
-            mm : "%d minuttir",
-            h : "ein tími",
-            hh : "%d tímar",
-            d : "ein dagur",
-            dd : "%d dagar",
-            M : "ein mánaði",
-            MM : "%d mánaðir",
-            y : "eitt ár",
-            yy : "%d ár"
-        },
-        ordinal : '%d.',
-        week : {
-            dow : 1, // Monday is the first day of the week.
-            doy : 4  // The week that contains Jan 4th is the first week of the year.
-        }
-    });
-}));
diff --git a/resources/moment/lang/fr-ca.js b/resources/moment/lang/fr-ca.js
deleted file mode 100644 (file)
index 3280d79..0000000
+++ /dev/null
@@ -1,54 +0,0 @@
-// moment.js language configuration
-// language : canadian french (fr-ca)
-// author : Jonathan Abourbih : https://github.com/jonbca
-
-(function (factory) {
-    if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory(window.moment); // Browser global
-    }
-}(function (moment) {
-    return moment.lang('fr-ca', {
-        months : "janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre".split("_"),
-        monthsShort : "janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.".split("_"),
-        weekdays : "dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi".split("_"),
-        weekdaysShort : "dim._lun._mar._mer._jeu._ven._sam.".split("_"),
-        weekdaysMin : "Di_Lu_Ma_Me_Je_Ve_Sa".split("_"),
-        longDateFormat : {
-            LT : "HH:mm",
-            L : "YYYY-MM-DD",
-            LL : "D MMMM YYYY",
-            LLL : "D MMMM YYYY LT",
-            LLLL : "dddd D MMMM YYYY LT"
-        },
-        calendar : {
-            sameDay: "[Aujourd'hui à] LT",
-            nextDay: '[Demain à] LT',
-            nextWeek: 'dddd [à] LT',
-            lastDay: '[Hier à] LT',
-            lastWeek: 'dddd [dernier à] LT',
-            sameElse: 'L'
-        },
-        relativeTime : {
-            future : "dans %s",
-            past : "il y a %s",
-            s : "quelques secondes",
-            m : "une minute",
-            mm : "%d minutes",
-            h : "une heure",
-            hh : "%d heures",
-            d : "un jour",
-            dd : "%d jours",
-            M : "un mois",
-            MM : "%d mois",
-            y : "un an",
-            yy : "%d ans"
-        },
-        ordinal : function (number) {
-            return number + (number === 1 ? 'er' : '');
-        }
-    });
-}));
diff --git a/resources/moment/lang/fr.js b/resources/moment/lang/fr.js
deleted file mode 100644 (file)
index 6b3dc52..0000000
+++ /dev/null
@@ -1,58 +0,0 @@
-// moment.js language configuration
-// language : french (fr)
-// author : John Fischer : https://github.com/jfroffice
-
-(function (factory) {
-    if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory(window.moment); // Browser global
-    }
-}(function (moment) {
-    return moment.lang('fr', {
-        months : "janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre".split("_"),
-        monthsShort : "janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.".split("_"),
-        weekdays : "dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi".split("_"),
-        weekdaysShort : "dim._lun._mar._mer._jeu._ven._sam.".split("_"),
-        weekdaysMin : "Di_Lu_Ma_Me_Je_Ve_Sa".split("_"),
-        longDateFormat : {
-            LT : "HH:mm",
-            L : "DD/MM/YYYY",
-            LL : "D MMMM YYYY",
-            LLL : "D MMMM YYYY LT",
-            LLLL : "dddd D MMMM YYYY LT"
-        },
-        calendar : {
-            sameDay: "[Aujourd'hui à] LT",
-            nextDay: '[Demain à] LT',
-            nextWeek: 'dddd [à] LT',
-            lastDay: '[Hier à] LT',
-            lastWeek: 'dddd [dernier à] LT',
-            sameElse: 'L'
-        },
-        relativeTime : {
-            future : "dans %s",
-            past : "il y a %s",
-            s : "quelques secondes",
-            m : "une minute",
-            mm : "%d minutes",
-            h : "une heure",
-            hh : "%d heures",
-            d : "un jour",
-            dd : "%d jours",
-            M : "un mois",
-            MM : "%d mois",
-            y : "un an",
-            yy : "%d ans"
-        },
-        ordinal : function (number) {
-            return number + (number === 1 ? 'er' : '');
-        },
-        week : {
-            dow : 1, // Monday is the first day of the week.
-            doy : 4  // The week that contains Jan 4th is the first week of the year.
-        }
-    });
-}));
diff --git a/resources/moment/lang/gl.js b/resources/moment/lang/gl.js
deleted file mode 100644 (file)
index 8b14127..0000000
+++ /dev/null
@@ -1,71 +0,0 @@
-// moment.js language configuration
-// language : galician (gl)
-// author : Juan G. Hurtado : https://github.com/juanghurtado
-
-(function (factory) {
-    if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory(window.moment); // Browser global
-    }
-}(function (moment) {
-    return moment.lang('gl', {
-        months : "Xaneiro_Febreiro_Marzo_Abril_Maio_Xuño_Xullo_Agosto_Setembro_Outubro_Novembro_Decembro".split("_"),
-        monthsShort : "Xan._Feb._Mar._Abr._Mai._Xuñ._Xul._Ago._Set._Out._Nov._Dec.".split("_"),
-        weekdays : "Domingo_Luns_Martes_Mércores_Xoves_Venres_Sábado".split("_"),
-        weekdaysShort : "Dom._Lun._Mar._Mér._Xov._Ven._Sáb.".split("_"),
-        weekdaysMin : "Do_Lu_Ma_Mé_Xo_Ve_Sá".split("_"),
-        longDateFormat : {
-            LT : "H:mm",
-            L : "DD/MM/YYYY",
-            LL : "D MMMM YYYY",
-            LLL : "D MMMM YYYY LT",
-            LLLL : "dddd D MMMM YYYY LT"
-        },
-        calendar : {
-            sameDay : function () {
-                return '[hoxe ' + ((this.hours() !== 1) ? 'ás' : 'á') + '] LT';
-            },
-            nextDay : function () {
-                return '[mañá ' + ((this.hours() !== 1) ? 'ás' : 'á') + '] LT';
-            },
-            nextWeek : function () {
-                return 'dddd [' + ((this.hours() !== 1) ? 'ás' : 'a') + '] LT';
-            },
-            lastDay : function () {
-                return '[onte ' + ((this.hours() !== 1) ? 'á' : 'a') + '] LT';
-            },
-            lastWeek : function () {
-                return '[o] dddd [pasado ' + ((this.hours() !== 1) ? 'ás' : 'a') + '] LT';
-            },
-            sameElse : 'L'
-        },
-        relativeTime : {
-            future : function (str) {
-                if (str === "uns segundos") {
-                    return "nuns segundos";
-                }
-                return "en " + str;
-            },
-            past : "hai %s",
-            s : "uns segundos",
-            m : "un minuto",
-            mm : "%d minutos",
-            h : "unha hora",
-            hh : "%d horas",
-            d : "un día",
-            dd : "%d días",
-            M : "un mes",
-            MM : "%d meses",
-            y : "un ano",
-            yy : "%d anos"
-        },
-        ordinal : '%dº',
-        week : {
-            dow : 1, // Monday is the first day of the week.
-            doy : 7  // The week that contains Jan 1st is the first week of the year.
-        }
-    });
-}));
diff --git a/resources/moment/lang/he.js b/resources/moment/lang/he.js
deleted file mode 100644 (file)
index b85dbe8..0000000
+++ /dev/null
@@ -1,77 +0,0 @@
-// moment.js language configuration
-// language : Hebrew (he)
-// author : Tomer Cohen : https://github.com/tomer
-// author : Moshe Simantov : https://github.com/DevelopmentIL
-// author : Tal Ater : https://github.com/TalAter
-
-(function (factory) {
-    if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory(window.moment); // Browser global
-    }
-}(function (moment) {
-    return moment.lang('he', {
-        months : "ינואר_פברואר_מרץ_אפריל_מאי_יוני_יולי_אוגוסט_ספטמבר_אוקטובר_נובמבר_דצמבר".split("_"),
-        monthsShort : "ינו׳_פבר׳_מרץ_אפר׳_מאי_יוני_יולי_אוג׳_ספט׳_אוק׳_נוב׳_דצמ׳".split("_"),
-        weekdays : "ראשון_שני_שלישי_רביעי_חמישי_שישי_שבת".split("_"),
-        weekdaysShort : "א׳_ב׳_ג׳_ד׳_ה׳_ו׳_ש׳".split("_"),
-        weekdaysMin : "א_ב_ג_ד_ה_ו_ש".split("_"),
-        longDateFormat : {
-            LT : "HH:mm",
-            L : "DD/MM/YYYY",
-            LL : "D [ב]MMMM YYYY",
-            LLL : "D [ב]MMMM YYYY LT",
-            LLLL : "dddd, D [ב]MMMM YYYY LT",
-            l : "D/M/YYYY",
-            ll : "D MMM YYYY",
-            lll : "D MMM YYYY LT",
-            llll : "ddd, D MMM YYYY LT"
-        },
-        calendar : {
-            sameDay : '[היום ב־]LT',
-            nextDay : '[מחר ב־]LT',
-            nextWeek : 'dddd [בשעה] LT',
-            lastDay : '[אתמול ב־]LT',
-            lastWeek : '[ביום] dddd [האחרון בשעה] LT',
-            sameElse : 'L'
-        },
-        relativeTime : {
-            future : "בעוד %s",
-            past : "לפני %s",
-            s : "מספר שניות",
-            m : "דקה",
-            mm : "%d דקות",
-            h : "שעה",
-            hh : function (number) {
-                if (number === 2) {
-                    return "שעתיים";
-                }
-                return number + " שעות";
-            },
-            d : "יום",
-            dd : function (number) {
-                if (number === 2) {
-                    return "יומיים";
-                }
-                return number + " ימים";
-            },
-            M : "חודש",
-            MM : function (number) {
-                if (number === 2) {
-                    return "חודשיים";
-                }
-                return number + " חודשים";
-            },
-            y : "שנה",
-            yy : function (number) {
-                if (number === 2) {
-                    return "שנתיים";
-                }
-                return number + " שנים";
-            }
-        }
-    });
-}));
diff --git a/resources/moment/lang/hi.js b/resources/moment/lang/hi.js
deleted file mode 100644 (file)
index 8e6e99c..0000000
+++ /dev/null
@@ -1,105 +0,0 @@
-// moment.js language configuration
-// language : hindi (hi)
-// author : Mayank Singhal : https://github.com/mayanksinghal
-
-(function (factory) {
-    if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory(window.moment); // Browser global
-    }
-}(function (moment) {
-    var symbolMap = {
-        '1': '१',
-        '2': '२',
-        '3': '३',
-        '4': '४',
-        '5': '५',
-        '6': '६',
-        '7': '७',
-        '8': '८',
-        '9': '९',
-        '0': '०'
-    },
-    numberMap = {
-        '१': '1',
-        '२': '2',
-        '३': '3',
-        '४': '4',
-        '५': '5',
-        '६': '6',
-        '७': '7',
-        '८': '8',
-        '९': '9',
-        '०': '0'
-    };
-
-    return moment.lang('hi', {
-        months : 'जनवरी_फ़रवरी_मार्च_अप्रैल_मई_जून_जुलाई_अगस्त_सितम्बर_अक्टूबर_नवम्बर_दिसम्बर'.split("_"),
-        monthsShort : 'जन._फ़र._मार्च_अप्रै._मई_जून_जुल._अग._सित._अक्टू._नव._दिस.'.split("_"),
-        weekdays : 'रविवार_सोमवार_मंगलवार_बुधवार_गुरूवार_शुक्रवार_शनिवार'.split("_"),
-        weekdaysShort : 'रवि_सोम_मंगल_बुध_गुरू_शुक्र_शनि'.split("_"),
-        weekdaysMin : 'र_सो_मं_बु_गु_शु_श'.split("_"),
-        longDateFormat : {
-            LT : "A h:mm बजे",
-            L : "DD/MM/YYYY",
-            LL : "D MMMM YYYY",
-            LLL : "D MMMM YYYY, LT",
-            LLLL : "dddd, D MMMM YYYY, LT"
-        },
-        calendar : {
-            sameDay : '[आज] LT',
-            nextDay : '[कल] LT',
-            nextWeek : 'dddd, LT',
-            lastDay : '[कल] LT',
-            lastWeek : '[पिछले] dddd, LT',
-            sameElse : 'L'
-        },
-        relativeTime : {
-            future : "%s में",
-            past : "%s पहले",
-            s : "कुछ ही क्षण",
-            m : "एक मिनट",
-            mm : "%d मिनट",
-            h : "एक घंटा",
-            hh : "%d घंटे",
-            d : "एक दिन",
-            dd : "%d दिन",
-            M : "एक महीने",
-            MM : "%d महीने",
-            y : "एक वर्ष",
-            yy : "%d वर्ष"
-        },
-        preparse: function (string) {
-            return string.replace(/[१२३४५६७८९०]/g, function (match) {
-                return numberMap[match];
-            });
-        },
-        postformat: function (string) {
-            return string.replace(/\d/g, function (match) {
-                return symbolMap[match];
-            });
-        },
-        // Hindi notation for meridiems are quite fuzzy in practice. While there exists
-        // a rigid notion of a 'Pahar' it is not used as rigidly in modern Hindi.
-        meridiem : function (hour, minute, isLower) {
-            if (hour < 4) {
-                return "रात";
-            } else if (hour < 10) {
-                return "सुबह";
-            } else if (hour < 17) {
-                return "दोपहर";
-            } else if (hour < 20) {
-                return "शाम";
-            } else {
-                return "रात";
-            }
-        },
-        week : {
-            dow : 0, // Sunday is the first day of the week.
-            doy : 6  // The week that contains Jan 1st is the first week of the year.
-        }
-    });
-}));
diff --git a/resources/moment/lang/hr.js b/resources/moment/lang/hr.js
deleted file mode 100644 (file)
index 2e3bf11..0000000
+++ /dev/null
@@ -1,140 +0,0 @@
-// moment.js language configuration
-// language : hrvatski (hr)
-// author : Bojan Marković : https://github.com/bmarkovic
-
-// based on (sl) translation by Robert Sedovšek
-
-(function (factory) {
-    if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory(window.moment); // Browser global
-    }
-}(function (moment) {
-
-    function translate(number, withoutSuffix, key) {
-        var result = number + " ";
-        switch (key) {
-        case 'm':
-            return withoutSuffix ? 'jedna minuta' : 'jedne minute';
-        case 'mm':
-            if (number === 1) {
-                result += 'minuta';
-            } else if (number === 2 || number === 3 || number === 4) {
-                result += 'minute';
-            } else {
-                result += 'minuta';
-            }
-            return result;
-        case 'h':
-            return withoutSuffix ? 'jedan sat' : 'jednog sata';
-        case 'hh':
-            if (number === 1) {
-                result += 'sat';
-            } else if (number === 2 || number === 3 || number === 4) {
-                result += 'sata';
-            } else {
-                result += 'sati';
-            }
-            return result;
-        case 'dd':
-            if (number === 1) {
-                result += 'dan';
-            } else {
-                result += 'dana';
-            }
-            return result;
-        case 'MM':
-            if (number === 1) {
-                result += 'mjesec';
-            } else if (number === 2 || number === 3 || number === 4) {
-                result += 'mjeseca';
-            } else {
-                result += 'mjeseci';
-            }
-            return result;
-        case 'yy':
-            if (number === 1) {
-                result += 'godina';
-            } else if (number === 2 || number === 3 || number === 4) {
-                result += 'godine';
-            } else {
-                result += 'godina';
-            }
-            return result;
-        }
-    }
-
-    return moment.lang('hr', {
-        months : "sječanj_veljača_ožujak_travanj_svibanj_lipanj_srpanj_kolovoz_rujan_listopad_studeni_prosinac".split("_"),
-        monthsShort : "sje._vel._ožu._tra._svi._lip._srp._kol._ruj._lis._stu._pro.".split("_"),
-        weekdays : "nedjelja_ponedjeljak_utorak_srijeda_četvrtak_petak_subota".split("_"),
-        weekdaysShort : "ned._pon._uto._sri._čet._pet._sub.".split("_"),
-        weekdaysMin : "ne_po_ut_sr_če_pe_su".split("_"),
-        longDateFormat : {
-            LT : "H:mm",
-            L : "DD. MM. YYYY",
-            LL : "D. MMMM YYYY",
-            LLL : "D. MMMM YYYY LT",
-            LLLL : "dddd, D. MMMM YYYY LT"
-        },
-        calendar : {
-            sameDay  : '[danas u] LT',
-            nextDay  : '[sutra u] LT',
-
-            nextWeek : function () {
-                switch (this.day()) {
-                case 0:
-                    return '[u] [nedjelju] [u] LT';
-                case 3:
-                    return '[u] [srijedu] [u] LT';
-                case 6:
-                    return '[u] [subotu] [u] LT';
-                case 1:
-                case 2:
-                case 4:
-                case 5:
-                    return '[u] dddd [u] LT';
-                }
-            },
-            lastDay  : '[jučer u] LT',
-            lastWeek : function () {
-                switch (this.day()) {
-                case 0:
-                case 3:
-                    return '[prošlu] dddd [u] LT';
-                case 6:
-                    return '[prošle] [subote] [u] LT';
-                case 1:
-                case 2:
-                case 4:
-                case 5:
-                    return '[prošli] dddd [u] LT';
-                }
-            },
-            sameElse : 'L'
-        },
-        relativeTime : {
-            future : "za %s",
-            past   : "prije %s",
-            s      : "par sekundi",
-            m      : translate,
-            mm     : translate,
-            h      : translate,
-            hh     : translate,
-            d      : "dan",
-            dd     : translate,
-            M      : "mjesec",
-            MM     : translate,
-            y      : "godinu",
-            yy     : translate
-        },
-        ordinal : '%d.',
-        week : {
-            dow : 1, // Monday is the first day of the week.
-            doy : 7  // The week that contains Jan 1st is the first week of the year.
-        }
-    });
-}));
diff --git a/resources/moment/lang/hu.js b/resources/moment/lang/hu.js
deleted file mode 100644 (file)
index 4d84ebd..0000000
+++ /dev/null
@@ -1,98 +0,0 @@
-// moment.js language configuration
-// language : hungarian (hu)
-// author : Adam Brunner : https://github.com/adambrunner
-
-(function (factory) {
-    if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory(window.moment); // Browser global
-    }
-}(function (moment) {
-    var weekEndings = 'vasárnap hétfőn kedden szerdán csütörtökön pénteken szombaton'.split(' ');
-
-    function translate(number, withoutSuffix, key, isFuture) {
-        var num = number,
-            suffix;
-
-        switch (key) {
-        case 's':
-            return (isFuture || withoutSuffix) ? 'néhány másodperc' : 'néhány másodperce';
-        case 'm':
-            return 'egy' + (isFuture || withoutSuffix ? ' perc' : ' perce');
-        case 'mm':
-            return num + (isFuture || withoutSuffix ? ' perc' : ' perce');
-        case 'h':
-            return 'egy' + (isFuture || withoutSuffix ? ' óra' : ' órája');
-        case 'hh':
-            return num + (isFuture || withoutSuffix ? ' óra' : ' órája');
-        case 'd':
-            return 'egy' + (isFuture || withoutSuffix ? ' nap' : ' napja');
-        case 'dd':
-            return num + (isFuture || withoutSuffix ? ' nap' : ' napja');
-        case 'M':
-            return 'egy' + (isFuture || withoutSuffix ? ' hónap' : ' hónapja');
-        case 'MM':
-            return num + (isFuture || withoutSuffix ? ' hónap' : ' hónapja');
-        case 'y':
-            return 'egy' + (isFuture || withoutSuffix ? ' év' : ' éve');
-        case 'yy':
-            return num + (isFuture || withoutSuffix ? ' év' : ' éve');
-        }
-
-        return '';
-    }
-
-    function week(isFuture) {
-        return (isFuture ? '' : '[múlt] ') + '[' + weekEndings[this.day()] + '] LT[-kor]';
-    }
-
-    return moment.lang('hu', {
-        months : "január_február_március_április_május_június_július_augusztus_szeptember_október_november_december".split("_"),
-        monthsShort : "jan_feb_márc_ápr_máj_jún_júl_aug_szept_okt_nov_dec".split("_"),
-        weekdays : "vasárnap_hétfő_kedd_szerda_csütörtök_péntek_szombat".split("_"),
-        weekdaysShort : "vas_hét_kedd_sze_csüt_pén_szo".split("_"),
-        weekdaysMin : "v_h_k_sze_cs_p_szo".split("_"),
-        longDateFormat : {
-            LT : "H:mm",
-            L : "YYYY.MM.DD.",
-            LL : "YYYY. MMMM D.",
-            LLL : "YYYY. MMMM D., LT",
-            LLLL : "YYYY. MMMM D., dddd LT"
-        },
-        calendar : {
-            sameDay : '[ma] LT[-kor]',
-            nextDay : '[holnap] LT[-kor]',
-            nextWeek : function () {
-                return week.call(this, true);
-            },
-            lastDay : '[tegnap] LT[-kor]',
-            lastWeek : function () {
-                return week.call(this, false);
-            },
-            sameElse : 'L'
-        },
-        relativeTime : {
-            future : "%s múlva",
-            past : "%s",
-            s : translate,
-            m : translate,
-            mm : translate,
-            h : translate,
-            hh : translate,
-            d : translate,
-            dd : translate,
-            M : translate,
-            MM : translate,
-            y : translate,
-            yy : translate
-        },
-        ordinal : '%d.',
-        week : {
-            dow : 1, // Monday is the first day of the week.
-            doy : 7  // The week that contains Jan 1st is the first week of the year.
-        }
-    });
-}));
diff --git a/resources/moment/lang/hy-am.js b/resources/moment/lang/hy-am.js
deleted file mode 100644 (file)
index 951655b..0000000
+++ /dev/null
@@ -1,113 +0,0 @@
-// moment.js language configuration
-// language : Armenian (hy-am)
-// author : Armendarabyan : https://github.com/armendarabyan
-
-(function (factory) {
-    if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory(window.moment); // Browser global
-    }
-}(function (moment) {
-
-    function monthsCaseReplace(m, format) {
-        var months = {
-            'nominative': 'հունվար_փետրվար_մարտ_ապրիլ_մայիս_հունիս_հուլիս_օգոստոս_սեպտեմբեր_հոկտեմբեր_նոյեմբեր_դեկտեմբեր'.split('_'),
-            'accusative': 'հունվարի_փետրվարի_մարտի_ապրիլի_մայիսի_հունիսի_հուլիսի_օգոստոսի_սեպտեմբերի_հոկտեմբերի_նոյեմբերի_դեկտեմբերի'.split('_')
-        },
-
-        nounCase = (/D[oD]?(\[[^\[\]]*\]|\s+)+MMMM?/).test(format) ?
-            'accusative' :
-            'nominative';
-
-        return months[nounCase][m.month()];
-    }
-
-    function monthsShortCaseReplace(m, format) {
-        var monthsShort = 'հնվ_փտր_մրտ_ապր_մյս_հնս_հլս_օգս_սպտ_հկտ_նմբ_դկտ'.split('_');
-
-        return monthsShort[m.month()];
-    }
-
-    function weekdaysCaseReplace(m, format) {
-        var weekdays = 'կիրակի_երկուշաբթի_երեքշաբթի_չորեքշաբթի_հինգշաբթի_ուրբաթ_շաբաթ'.split('_');
-
-        return weekdays[m.day()];
-    }
-
-    return moment.lang('hy-am', {
-        months : monthsCaseReplace,
-        monthsShort : monthsShortCaseReplace,
-        weekdays : weekdaysCaseReplace,
-        weekdaysShort : "կրկ_երկ_երք_չրք_հնգ_ուրբ_շբթ".split("_"),
-        weekdaysMin : "կրկ_երկ_երք_չրք_հնգ_ուրբ_շբթ".split("_"),
-        longDateFormat : {
-            LT : "HH:mm",
-            L : "DD.MM.YYYY",
-            LL : "D MMMM YYYY թ.",
-            LLL : "D MMMM YYYY թ., LT",
-            LLLL : "dddd, D MMMM YYYY թ., LT"
-        },
-        calendar : {
-            sameDay: '[այսօր] LT',
-            nextDay: '[վաղը] LT',
-            lastDay: '[երեկ] LT',
-            nextWeek: function () {
-                return 'dddd [օրը ժամը] LT';
-            },
-            lastWeek: function () {
-                return '[անցած] dddd [օրը ժամը] LT';
-            },
-            sameElse: 'L'
-        },
-        relativeTime : {
-            future : "%s հետո",
-            past : "%s առաջ",
-            s : "մի քանի վայրկյան",
-            m : "րոպե",
-            mm : "%d րոպե",
-            h : "ժամ",
-            hh : "%d ժամ",
-            d : "օր",
-            dd : "%d օր",
-            M : "ամիս",
-            MM : "%d ամիս",
-            y : "տարի",
-            yy : "%d տարի"
-        },
-
-        meridiem : function (hour) {
-            if (hour < 4) {
-                return "գիշերվա";
-            } else if (hour < 12) {
-                return "առավոտվա";
-            } else if (hour < 17) {
-                return "ցերեկվա";
-            } else {
-                return "երեկոյան";
-            }
-        },
-
-        ordinal: function (number, period) {
-            switch (period) {
-            case 'DDD':
-            case 'w':
-            case 'W':
-            case 'DDDo':
-                if (number === 1) {
-                    return number + '-ին';
-                }
-                return number + '-րդ';
-            default:
-                return number;
-            }
-        },
-
-        week : {
-            dow : 1, // Monday is the first day of the week.
-            doy : 7  // The week that contains Jan 1st is the first week of the year.
-        }
-    });
-}));
diff --git a/resources/moment/lang/id.js b/resources/moment/lang/id.js
deleted file mode 100644 (file)
index f186280..0000000
+++ /dev/null
@@ -1,67 +0,0 @@
-// moment.js language configuration
-// language : Bahasa Indonesia (id)
-// author : Mohammad Satrio Utomo : https://github.com/tyok
-// reference: http://id.wikisource.org/wiki/Pedoman_Umum_Ejaan_Bahasa_Indonesia_yang_Disempurnakan
-
-(function (factory) {
-    if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory(window.moment); // Browser global
-    }
-}(function (moment) {
-    return moment.lang('id', {
-        months : "Januari_Februari_Maret_April_Mei_Juni_Juli_Agustus_September_Oktober_November_Desember".split("_"),
-        monthsShort : "Jan_Feb_Mar_Apr_Mei_Jun_Jul_Ags_Sep_Okt_Nov_Des".split("_"),
-        weekdays : "Minggu_Senin_Selasa_Rabu_Kamis_Jumat_Sabtu".split("_"),
-        weekdaysShort : "Min_Sen_Sel_Rab_Kam_Jum_Sab".split("_"),
-        weekdaysMin : "Mg_Sn_Sl_Rb_Km_Jm_Sb".split("_"),
-        longDateFormat : {
-            LT : "HH.mm",
-            L : "DD/MM/YYYY",
-            LL : "D MMMM YYYY",
-            LLL : "D MMMM YYYY [pukul] LT",
-            LLLL : "dddd, D MMMM YYYY [pukul] LT"
-        },
-        meridiem : function (hours, minutes, isLower) {
-            if (hours < 11) {
-                return 'pagi';
-            } else if (hours < 15) {
-                return 'siang';
-            } else if (hours < 19) {
-                return 'sore';
-            } else {
-                return 'malam';
-            }
-        },
-        calendar : {
-            sameDay : '[Hari ini pukul] LT',
-            nextDay : '[Besok pukul] LT',
-            nextWeek : 'dddd [pukul] LT',
-            lastDay : '[Kemarin pukul] LT',
-            lastWeek : 'dddd [lalu pukul] LT',
-            sameElse : 'L'
-        },
-        relativeTime : {
-            future : "dalam %s",
-            past : "%s yang lalu",
-            s : "beberapa detik",
-            m : "semenit",
-            mm : "%d menit",
-            h : "sejam",
-            hh : "%d jam",
-            d : "sehari",
-            dd : "%d hari",
-            M : "sebulan",
-            MM : "%d bulan",
-            y : "setahun",
-            yy : "%d tahun"
-        },
-        week : {
-            dow : 1, // Monday is the first day of the week.
-            doy : 7  // The week that contains Jan 1st is the first week of the year.
-        }
-    });
-}));
diff --git a/resources/moment/lang/is.js b/resources/moment/lang/is.js
deleted file mode 100644 (file)
index 5b6b2a8..0000000
+++ /dev/null
@@ -1,124 +0,0 @@
-// moment.js language configuration
-// language : icelandic (is)
-// author : Hinrik Örn Sigurðsson : https://github.com/hinrik
-
-(function (factory) {
-    if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory(window.moment); // Browser global
-    }
-}(function (moment) {
-    function plural(n) {
-        if (n % 100 === 11) {
-            return true;
-        } else if (n % 10 === 1) {
-            return false;
-        }
-        return true;
-    }
-
-    function translate(number, withoutSuffix, key, isFuture) {
-        var result = number + " ";
-        switch (key) {
-        case 's':
-            return withoutSuffix || isFuture ? 'nokkrar sekúndur' : 'nokkrum sekúndum';
-        case 'm':
-            return withoutSuffix ? 'mínúta' : 'mínútu';
-        case 'mm':
-            if (plural(number)) {
-                return result + (withoutSuffix || isFuture ? 'mínútur' : 'mínútum');
-            } else if (withoutSuffix) {
-                return result + 'mínúta';
-            }
-            return result + 'mínútu';
-        case 'hh':
-            if (plural(number)) {
-                return result + (withoutSuffix || isFuture ? 'klukkustundir' : 'klukkustundum');
-            }
-            return result + 'klukkustund';
-        case 'd':
-            if (withoutSuffix) {
-                return 'dagur';
-            }
-            return isFuture ? 'dag' : 'degi';
-        case 'dd':
-            if (plural(number)) {
-                if (withoutSuffix) {
-                    return result + 'dagar';
-                }
-                return result + (isFuture ? 'daga' : 'dögum');
-            } else if (withoutSuffix) {
-                return result + 'dagur';
-            }
-            return result + (isFuture ? 'dag' : 'degi');
-        case 'M':
-            if (withoutSuffix) {
-                return 'mánuður';
-            }
-            return isFuture ? 'mánuð' : 'mánuði';
-        case 'MM':
-            if (plural(number)) {
-                if (withoutSuffix) {
-                    return result + 'mánuðir';
-                }
-                return result + (isFuture ? 'mánuði' : 'mánuðum');
-            } else if (withoutSuffix) {
-                return result + 'mánuður';
-            }
-            return result + (isFuture ? 'mánuð' : 'mánuði');
-        case 'y':
-            return withoutSuffix || isFuture ? 'ár' : 'ári';
-        case 'yy':
-            if (plural(number)) {
-                return result + (withoutSuffix || isFuture ? 'ár' : 'árum');
-            }
-            return result + (withoutSuffix || isFuture ? 'ár' : 'ári');
-        }
-    }
-
-    return moment.lang('is', {
-        months : "janúar_febrúar_mars_apríl_maí_júní_júlí_ágúst_september_október_nóvember_desember".split("_"),
-        monthsShort : "jan_feb_mar_apr_maí_jún_júl_ágú_sep_okt_nóv_des".split("_"),
-        weekdays : "sunnudagur_mánudagur_þriðjudagur_miðvikudagur_fimmtudagur_föstudagur_laugardagur".split("_"),
-        weekdaysShort : "sun_mán_þri_mið_fim_fös_lau".split("_"),
-        weekdaysMin : "Su_Má_Þr_Mi_Fi_Fö_La".split("_"),
-        longDateFormat : {
-            LT : "H:mm",
-            L : "DD/MM/YYYY",
-            LL : "D. MMMM YYYY",
-            LLL : "D. MMMM YYYY [kl.] LT",
-            LLLL : "dddd, D. MMMM YYYY [kl.] LT"
-        },
-        calendar : {
-            sameDay : '[í dag kl.] LT',
-            nextDay : '[á morgun kl.] LT',
-            nextWeek : 'dddd [kl.] LT',
-            lastDay : '[í gær kl.] LT',
-            lastWeek : '[síðasta] dddd [kl.] LT',
-            sameElse : 'L'
-        },
-        relativeTime : {
-            future : "eftir %s",
-            past : "fyrir %s síðan",
-            s : translate,
-            m : translate,
-            mm : translate,
-            h : "klukkustund",
-            hh : translate,
-            d : translate,
-            dd : translate,
-            M : translate,
-            MM : translate,
-            y : translate,
-            yy : translate
-        },
-        ordinal : '%d.',
-        week : {
-            dow : 1, // Monday is the first day of the week.
-            doy : 4  // The week that contains Jan 4th is the first week of the year.
-        }
-    });
-}));
diff --git a/resources/moment/lang/it.js b/resources/moment/lang/it.js
deleted file mode 100644 (file)
index 84b7698..0000000
+++ /dev/null
@@ -1,59 +0,0 @@
-// moment.js language configuration
-// language : italian (it)
-// author : Lorenzo : https://github.com/aliem
-// author: Mattia Larentis: https://github.com/nostalgiaz
-
-(function (factory) {
-    if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory(window.moment); // Browser global
-    }
-}(function (moment) {
-    return moment.lang('it', {
-        months : "Gennaio_Febbraio_Marzo_Aprile_Maggio_Giugno_Luglio_Agosto_Settembre_Ottobre_Novembre_Dicembre".split("_"),
-        monthsShort : "Gen_Feb_Mar_Apr_Mag_Giu_Lug_Ago_Set_Ott_Nov_Dic".split("_"),
-        weekdays : "Domenica_Lunedì_Martedì_Mercoledì_Giovedì_Venerdì_Sabato".split("_"),
-        weekdaysShort : "Dom_Lun_Mar_Mer_Gio_Ven_Sab".split("_"),
-        weekdaysMin : "D_L_Ma_Me_G_V_S".split("_"),
-        longDateFormat : {
-            LT : "HH:mm",
-            L : "DD/MM/YYYY",
-            LL : "D MMMM YYYY",
-            LLL : "D MMMM YYYY LT",
-            LLLL : "dddd, D MMMM YYYY LT"
-        },
-        calendar : {
-            sameDay: '[Oggi alle] LT',
-            nextDay: '[Domani alle] LT',
-            nextWeek: 'dddd [alle] LT',
-            lastDay: '[Ieri alle] LT',
-            lastWeek: '[lo scorso] dddd [alle] LT',
-            sameElse: 'L'
-        },
-        relativeTime : {
-            future : function (s) {
-                return ((/^[0-9].+$/).test(s) ? "tra" : "in") + " " + s;
-            },
-            past : "%s fa",
-            s : "alcuni secondi",
-            m : "un minuto",
-            mm : "%d minuti",
-            h : "un'ora",
-            hh : "%d ore",
-            d : "un giorno",
-            dd : "%d giorni",
-            M : "un mese",
-            MM : "%d mesi",
-            y : "un anno",
-            yy : "%d anni"
-        },
-        ordinal: '%dº',
-        week : {
-            dow : 1, // Monday is the first day of the week.
-            doy : 4  // The week that contains Jan 4th is the first week of the year.
-        }
-    });
-}));
diff --git a/resources/moment/lang/ja.js b/resources/moment/lang/ja.js
deleted file mode 100644 (file)
index 9cd7e9e..0000000
+++ /dev/null
@@ -1,58 +0,0 @@
-// moment.js language configuration
-// language : japanese (ja)
-// author : LI Long : https://github.com/baryon
-
-(function (factory) {
-    if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory(window.moment); // Browser global
-    }
-}(function (moment) {
-    return moment.lang('ja', {
-        months : "1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月".split("_"),
-        monthsShort : "1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月".split("_"),
-        weekdays : "日曜日_月曜日_火曜日_水曜日_木曜日_金曜日_土曜日".split("_"),
-        weekdaysShort : "日_月_火_水_木_金_土".split("_"),
-        weekdaysMin : "日_月_火_水_木_金_土".split("_"),
-        longDateFormat : {
-            LT : "Ah時m分",
-            L : "YYYY/MM/DD",
-            LL : "YYYY年M月D日",
-            LLL : "YYYY年M月D日LT",
-            LLLL : "YYYY年M月D日LT dddd"
-        },
-        meridiem : function (hour, minute, isLower) {
-            if (hour < 12) {
-                return "午前";
-            } else {
-                return "午後";
-            }
-        },
-        calendar : {
-            sameDay : '[今日] LT',
-            nextDay : '[明日] LT',
-            nextWeek : '[来週]dddd LT',
-            lastDay : '[昨日] LT',
-            lastWeek : '[前週]dddd LT',
-            sameElse : 'L'
-        },
-        relativeTime : {
-            future : "%s後",
-            past : "%s前",
-            s : "数秒",
-            m : "1分",
-            mm : "%d分",
-            h : "1時間",
-            hh : "%d時間",
-            d : "1日",
-            dd : "%d日",
-            M : "1ヶ月",
-            MM : "%dヶ月",
-            y : "1年",
-            yy : "%d年"
-        }
-    });
-}));
diff --git a/resources/moment/lang/ka.js b/resources/moment/lang/ka.js
deleted file mode 100644 (file)
index 0cebdaa..0000000
+++ /dev/null
@@ -1,108 +0,0 @@
-// moment.js language configuration
-// language : Georgian (ka)
-// author : Irakli Janiashvili : https://github.com/irakli-janiashvili
-
-(function (factory) {
-    if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory(window.moment); // Browser global
-    }
-}(function (moment) {
-
-    function monthsCaseReplace(m, format) {
-        var months = {
-            'nominative': 'იანვარი_თებერვალი_მარტი_აპრილი_მაისი_ივნისი_ივლისი_აგვისტო_სექტემბერი_ოქტომბერი_ნოემბერი_დეკემბერი'.split('_'),
-            'accusative': 'იანვარს_თებერვალს_მარტს_აპრილის_მაისს_ივნისს_ივლისს_აგვისტს_სექტემბერს_ოქტომბერს_ნოემბერს_დეკემბერს'.split('_')
-        },
-
-        nounCase = (/D[oD] *MMMM?/).test(format) ?
-            'accusative' :
-            'nominative';
-
-        return months[nounCase][m.month()];
-    }
-
-    function weekdaysCaseReplace(m, format) {
-        var weekdays = {
-            'nominative': 'კვირა_ორშაბათი_სამშაბათი_ოთხშაბათი_ხუთშაბათი_პარასკევი_შაბათი'.split('_'),
-            'accusative': 'კვირას_ორშაბათს_სამშაბათს_ოთხშაბათს_ხუთშაბათს_პარასკევს_შაბათს'.split('_')
-        },
-
-        nounCase = (/(წინა|შემდეგ)/).test(format) ?
-            'accusative' :
-            'nominative';
-
-        return weekdays[nounCase][m.day()];
-    }
-
-    return moment.lang('ka', {
-        months : monthsCaseReplace,
-        monthsShort : "იან_თებ_მარ_აპრ_მაი_ივნ_ივლ_აგვ_სექ_ოქტ_ნოე_დეკ".split("_"),
-        weekdays : weekdaysCaseReplace,
-        weekdaysShort : "კვი_ორშ_სამ_ოთხ_ხუთ_პარ_შაბ".split("_"),
-        weekdaysMin : "კვ_ორ_სა_ოთ_ხუ_პა_შა".split("_"),
-        longDateFormat : {
-            LT : "h:mm A",
-            L : "DD/MM/YYYY",
-            LL : "D MMMM YYYY",
-            LLL : "D MMMM YYYY LT",
-            LLLL : "dddd, D MMMM YYYY LT"
-        },
-        calendar : {
-            sameDay : '[დღეს] LT[-ზე]',
-            nextDay : '[ხვალ] LT[-ზე]',
-            lastDay : '[გუშინ] LT[-ზე]',
-            nextWeek : '[შემდეგ] dddd LT[-ზე]',
-            lastWeek : '[წინა] dddd LT-ზე',
-            sameElse : 'L'
-        },
-        relativeTime : {
-            future : function (s) {
-                return (/(წამი|წუთი|საათი|წელი)/).test(s) ?
-                    s.replace(/ი$/, "ში") :
-                    s + "ში";
-            },
-            past : function (s) {
-                if ((/(წამი|წუთი|საათი|დღე|თვე)/).test(s)) {
-                    return s.replace(/(ი|ე)$/, "ის წინ");
-                }
-                if ((/წელი/).test(s)) {
-                    return s.replace(/წელი$/, "წლის წინ");
-                }
-            },
-            s : "რამდენიმე წამი",
-            m : "წუთი",
-            mm : "%d წუთი",
-            h : "საათი",
-            hh : "%d საათი",
-            d : "დღე",
-            dd : "%d დღე",
-            M : "თვე",
-            MM : "%d თვე",
-            y : "წელი",
-            yy : "%d წელი"
-        },
-        ordinal : function (number) {
-            if (number === 0) {
-                return number;
-            }
-
-            if (number === 1) {
-                return number + "-ლი";
-            }
-
-            if ((number < 20) || (number <= 100 && (number % 20 === 0)) || (number % 100 === 0)) {
-                return "მე-" + number;
-            }
-
-            return number + "-ე";
-        },
-        week : {
-            dow : 1,
-            doy : 7
-        }
-    });
-}));
diff --git a/resources/moment/lang/ko.js b/resources/moment/lang/ko.js
deleted file mode 100644 (file)
index 3b469df..0000000
+++ /dev/null
@@ -1,63 +0,0 @@
-// moment.js language configuration
-// language : korean (ko)
-//
-// authors 
-//
-// - Kyungwook, Park : https://github.com/kyungw00k
-// - Jeeeyul Lee <jeeeyul@gmail.com>
-(function (factory) {
-    if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory(window.moment); // Browser global
-    }
-}(function (moment) {
-    return moment.lang('ko', {
-        months : "1월_2월_3월_4월_5월_6월_7월_8월_9월_10월_11월_12월".split("_"),
-        monthsShort : "1월_2월_3월_4월_5월_6월_7월_8월_9월_10월_11월_12월".split("_"),
-        weekdays : "일요일_월요일_화요일_수요일_목요일_금요일_토요일".split("_"),
-        weekdaysShort : "일_월_화_수_목_금_토".split("_"),
-        weekdaysMin : "일_월_화_수_목_금_토".split("_"),
-        longDateFormat : {
-            LT : "A h시 mm분",
-            L : "YYYY.MM.DD",
-            LL : "YYYY년 MMMM D일",
-            LLL : "YYYY년 MMMM D일 LT",
-            LLLL : "YYYY년 MMMM D일 dddd LT"
-        },
-        meridiem : function (hour, minute, isUpper) {
-            return hour < 12 ? '오전' : '오후';
-        },
-        calendar : {
-            sameDay : '오늘 LT',
-            nextDay : '내일 LT',
-            nextWeek : 'dddd LT',
-            lastDay : '어제 LT',
-            lastWeek : '지난주 dddd LT',
-            sameElse : 'L'
-        },
-        relativeTime : {
-            future : "%s 후",
-            past : "%s 전",
-            s : "몇초",
-            ss : "%d초",
-            m : "일분",
-            mm : "%d분",
-            h : "한시간",
-            hh : "%d시간",
-            d : "하루",
-            dd : "%d일",
-            M : "한달",
-            MM : "%d달",
-            y : "일년",
-            yy : "%d년"
-        },
-        ordinal : '%d일',
-        meridiemParse : /(오전|오후)/,
-        isPM : function (token) {
-            return token === "오후";
-        }
-    });
-}));
diff --git a/resources/moment/lang/lb.js b/resources/moment/lang/lb.js
deleted file mode 100644 (file)
index 946ba13..0000000
+++ /dev/null
@@ -1,160 +0,0 @@
-// moment.js language configuration
-// language : Luxembourgish (lb)
-// author : mweimerskirch : https://github.com/mweimerskirch
-
-// Note: Luxembourgish has a very particular phonological rule ("Eifeler Regel") that causes the
-// deletion of the final "n" in certain contexts. That's what the "eifelerRegelAppliesToWeekday"
-// and "eifelerRegelAppliesToNumber" methods are meant for
-
-(function (factory) {
-    if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory(window.moment); // Browser global
-    }
-}(function (moment) {
-    function processRelativeTime(number, withoutSuffix, key, isFuture) {
-        var format = {
-            'm': ['eng Minutt', 'enger Minutt'],
-            'h': ['eng Stonn', 'enger Stonn'],
-            'd': ['een Dag', 'engem Dag'],
-            'dd': [number + ' Deeg', number + ' Deeg'],
-            'M': ['ee Mount', 'engem Mount'],
-            'MM': [number + ' Méint', number + ' Méint'],
-            'y': ['ee Joer', 'engem Joer'],
-            'yy': [number + ' Joer', number + ' Joer']
-        };
-        return withoutSuffix ? format[key][0] : format[key][1];
-    }
-
-    function processFutureTime(string) {
-        var number = string.substr(0, string.indexOf(' '));
-        if (eifelerRegelAppliesToNumber(number)) {
-            return "a " + string;
-        }
-        return "an " + string;
-    }
-
-    function processPastTime(string) {
-        var number = string.substr(0, string.indexOf(' '));
-        if (eifelerRegelAppliesToNumber(number)) {
-            return "viru " + string;
-        }
-        return "virun " + string;
-    }
-
-    function processLastWeek(string1) {
-        var weekday = this.format('d');
-        if (eifelerRegelAppliesToWeekday(weekday)) {
-            return '[Leschte] dddd [um] LT';
-        }
-        return '[Leschten] dddd [um] LT';
-    }
-
-    /**
-     * Returns true if the word before the given week day loses the "-n" ending.
-     * e.g. "Leschten Dënschdeg" but "Leschte Méindeg"
-     *
-     * @param weekday {integer}
-     * @returns {boolean}
-     */
-    function eifelerRegelAppliesToWeekday(weekday) {
-        weekday = parseInt(weekday, 10);
-        switch (weekday) {
-        case 0: // Sonndeg
-        case 1: // Méindeg
-        case 3: // Mëttwoch
-        case 5: // Freideg
-        case 6: // Samschdeg
-            return true;
-        default: // 2 Dënschdeg, 4 Donneschdeg
-            return false;
-        }
-    }
-
-    /**
-     * Returns true if the word before the given number loses the "-n" ending.
-     * e.g. "an 10 Deeg" but "a 5 Deeg"
-     *
-     * @param number {integer}
-     * @returns {boolean}
-     */
-    function eifelerRegelAppliesToNumber(number) {
-        number = parseInt(number, 10);
-        if (isNaN(number)) {
-            return false;
-        }
-        if (number < 0) {
-            // Negative Number --> always true
-            return true;
-        } else if (number < 10) {
-            // Only 1 digit
-            if (4 <= number && number <= 7) {
-                return true;
-            }
-            return false;
-        } else if (number < 100) {
-            // 2 digits
-            var lastDigit = number % 10, firstDigit = number / 10;
-            if (lastDigit === 0) {
-                return eifelerRegelAppliesToNumber(firstDigit);
-            }
-            return eifelerRegelAppliesToNumber(lastDigit);
-        } else if (number < 10000) {
-            // 3 or 4 digits --> recursively check first digit
-            while (number >= 10) {
-                number = number / 10;
-            }
-            return eifelerRegelAppliesToNumber(number);
-        } else {
-            // Anything larger than 4 digits: recursively check first n-3 digits
-            number = number / 1000;
-            return eifelerRegelAppliesToNumber(number);
-        }
-    }
-
-    return moment.lang('lb', {
-        months: "Januar_Februar_Mäerz_Abrëll_Mee_Juni_Juli_August_September_Oktober_November_Dezember".split("_"),
-        monthsShort: "Jan._Febr._Mrz._Abr._Mee_Jun._Jul._Aug._Sept._Okt._Nov._Dez.".split("_"),
-        weekdays: "Sonndeg_Méindeg_Dënschdeg_Mëttwoch_Donneschdeg_Freideg_Samschdeg".split("_"),
-        weekdaysShort: "So._Mé._Dë._Më._Do._Fr._Sa.".split("_"),
-        weekdaysMin: "So_Mé_Dë_Më_Do_Fr_Sa".split("_"),
-        longDateFormat: {
-            LT: "H:mm [Auer]",
-            L: "DD.MM.YYYY",
-            LL: "D. MMMM YYYY",
-            LLL: "D. MMMM YYYY LT",
-            LLLL: "dddd, D. MMMM YYYY LT"
-        },
-        calendar: {
-            sameDay: "[Haut um] LT",
-            sameElse: "L",
-            nextDay: '[Muer um] LT',
-            nextWeek: 'dddd [um] LT',
-            lastDay: '[Gëschter um] LT',
-            lastWeek: processLastWeek
-        },
-        relativeTime: {
-            future: processFutureTime,
-            past: processPastTime,
-            s: "e puer Sekonnen",
-            m: processRelativeTime,
-            mm: "%d Minutten",
-            h: processRelativeTime,
-            hh: "%d Stonnen",
-            d: processRelativeTime,
-            dd: processRelativeTime,
-            M: processRelativeTime,
-            MM: processRelativeTime,
-            y: processRelativeTime,
-            yy: processRelativeTime
-        },
-        ordinal: '%d.',
-        week: {
-            dow: 1, // Monday is the first day of the week.
-            doy: 4  // The week that contains Jan 4th is the first week of the year.
-        }
-    });
-}));
diff --git a/resources/moment/lang/lt.js b/resources/moment/lang/lt.js
deleted file mode 100644 (file)
index 1cf6457..0000000
+++ /dev/null
@@ -1,118 +0,0 @@
-// moment.js language configuration
-// language : Lithuanian (lt)
-// author : Mindaugas Mozūras : https://github.com/mmozuras
-
-(function (factory) {
-    if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory(window.moment); // Browser global
-    }
-}(function (moment) {
-    var units = {
-        "m" : "minutė_minutės_minutę",
-        "mm": "minutės_minučių_minutes",
-        "h" : "valanda_valandos_valandą",
-        "hh": "valandos_valandų_valandas",
-        "d" : "diena_dienos_dieną",
-        "dd": "dienos_dienų_dienas",
-        "M" : "mėnuo_mėnesio_mėnesį",
-        "MM": "mėnesiai_mėnesių_mėnesius",
-        "y" : "metai_metų_metus",
-        "yy": "metai_metų_metus"
-    },
-    weekDays = "pirmadienis_antradienis_trečiadienis_ketvirtadienis_penktadienis_šeštadienis_sekmadienis".split("_");
-
-    function translateSeconds(number, withoutSuffix, key, isFuture) {
-        if (withoutSuffix) {
-            return "kelios sekundės";
-        } else {
-            return isFuture ? "kelių sekundžių" : "kelias sekundes";
-        }
-    }
-
-    function translateSingular(number, withoutSuffix, key, isFuture) {
-        return withoutSuffix ? forms(key)[0] : (isFuture ? forms(key)[1] : forms(key)[2]);
-    }
-
-    function special(number) {
-        return number % 10 === 0 || (number > 10 && number < 20);
-    }
-
-    function forms(key) {
-        return units[key].split("_");
-    }
-
-    function translate(number, withoutSuffix, key, isFuture) {
-        var result = number + " ";
-        if (number === 1) {
-            return result + translateSingular(number, withoutSuffix, key[0], isFuture);
-        } else if (withoutSuffix) {
-            return result + (special(number) ? forms(key)[1] : forms(key)[0]);
-        } else {
-            if (isFuture) {
-                return result + forms(key)[1];
-            } else {
-                return result + (special(number) ? forms(key)[1] : forms(key)[2]);
-            }
-        }
-    }
-
-    function relativeWeekDay(moment, format) {
-        var nominative = format.indexOf('dddd LT') === -1,
-            weekDay = weekDays[moment.weekday()];
-
-        return nominative ? weekDay : weekDay.substring(0, weekDay.length - 2) + "į";
-    }
-
-    return moment.lang("lt", {
-        months : "sausio_vasario_kovo_balandžio_gegužės_biržėlio_liepos_rugpjūčio_rugsėjo_spalio_lapkričio_gruodžio".split("_"),
-        monthsShort : "sau_vas_kov_bal_geg_bir_lie_rgp_rgs_spa_lap_grd".split("_"),
-        weekdays : relativeWeekDay,
-        weekdaysShort : "Sek_Pir_Ant_Tre_Ket_Pen_Šeš".split("_"),
-        weekdaysMin : "S_P_A_T_K_Pn_Š".split("_"),
-        longDateFormat : {
-            LT : "HH:mm",
-            L : "YYYY-MM-DD",
-            LL : "YYYY [m.] MMMM D [d.]",
-            LLL : "YYYY [m.] MMMM D [d.], LT [val.]",
-            LLLL : "YYYY [m.] MMMM D [d.], dddd, LT [val.]",
-            l : "YYYY-MM-DD",
-            ll : "YYYY [m.] MMMM D [d.]",
-            lll : "YYYY [m.] MMMM D [d.], LT [val.]",
-            llll : "YYYY [m.] MMMM D [d.], ddd, LT [val.]"
-        },
-        calendar : {
-            sameDay : "[Šiandien] LT",
-            nextDay : "[Rytoj] LT",
-            nextWeek : "dddd LT",
-            lastDay : "[Vakar] LT",
-            lastWeek : "[Praėjusį] dddd LT",
-            sameElse : "L"
-        },
-        relativeTime : {
-            future : "po %s",
-            past : "prieš %s",
-            s : translateSeconds,
-            m : translateSingular,
-            mm : translate,
-            h : translateSingular,
-            hh : translate,
-            d : translateSingular,
-            dd : translate,
-            M : translateSingular,
-            MM : translate,
-            y : translateSingular,
-            yy : translate
-        },
-        ordinal : function (number) {
-            return number + '-oji';
-        },
-        week : {
-            dow : 1, // Monday is the first day of the week.
-            doy : 4  // The week that contains Jan 4th is the first week of the year.
-        }
-    });
-}));
diff --git a/resources/moment/lang/lv.js b/resources/moment/lang/lv.js
deleted file mode 100644 (file)
index ffe25cf..0000000
+++ /dev/null
@@ -1,77 +0,0 @@
-// moment.js language configuration
-// language : latvian (lv)
-// author : Kristaps Karlsons : https://github.com/skakri
-
-(function (factory) {
-    if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory(window.moment); // Browser global
-    }
-}(function (moment) {
-    var units = {
-        'mm': 'minūti_minūtes_minūte_minūtes',
-        'hh': 'stundu_stundas_stunda_stundas',
-        'dd': 'dienu_dienas_diena_dienas',
-        'MM': 'mēnesi_mēnešus_mēnesis_mēneši',
-        'yy': 'gadu_gadus_gads_gadi'
-    };
-
-    function format(word, number, withoutSuffix) {
-        var forms = word.split('_');
-        if (withoutSuffix) {
-            return number % 10 === 1 && number !== 11 ? forms[2] : forms[3];
-        } else {
-            return number % 10 === 1 && number !== 11 ? forms[0] : forms[1];
-        }
-    }
-
-    function relativeTimeWithPlural(number, withoutSuffix, key) {
-        return number + ' ' + format(units[key], number, withoutSuffix);
-    }
-
-    return moment.lang('lv', {
-        months : "janvāris_februāris_marts_aprīlis_maijs_jūnijs_jūlijs_augusts_septembris_oktobris_novembris_decembris".split("_"),
-        monthsShort : "jan_feb_mar_apr_mai_jūn_jūl_aug_sep_okt_nov_dec".split("_"),
-        weekdays : "svētdiena_pirmdiena_otrdiena_trešdiena_ceturtdiena_piektdiena_sestdiena".split("_"),
-        weekdaysShort : "Sv_P_O_T_C_Pk_S".split("_"),
-        weekdaysMin : "Sv_P_O_T_C_Pk_S".split("_"),
-        longDateFormat : {
-            LT : "HH:mm",
-            L : "DD.MM.YYYY",
-            LL : "YYYY. [gada] D. MMMM",
-            LLL : "YYYY. [gada] D. MMMM, LT",
-            LLLL : "YYYY. [gada] D. MMMM, dddd, LT"
-        },
-        calendar : {
-            sameDay : '[Šodien pulksten] LT',
-            nextDay : '[Rīt pulksten] LT',
-            nextWeek : 'dddd [pulksten] LT',
-            lastDay : '[Vakar pulksten] LT',
-            lastWeek : '[Pagājušā] dddd [pulksten] LT',
-            sameElse : 'L'
-        },
-        relativeTime : {
-            future : "%s vēlāk",
-            past : "%s agrāk",
-            s : "dažas sekundes",
-            m : "minūti",
-            mm : relativeTimeWithPlural,
-            h : "stundu",
-            hh : relativeTimeWithPlural,
-            d : "dienu",
-            dd : relativeTimeWithPlural,
-            M : "mēnesi",
-            MM : relativeTimeWithPlural,
-            y : "gadu",
-            yy : relativeTimeWithPlural
-        },
-        ordinal : '%d.',
-        week : {
-            dow : 1, // Monday is the first day of the week.
-            doy : 4  // The week that contains Jan 4th is the first week of the year.
-        }
-    });
-}));
diff --git a/resources/moment/lang/mk.js b/resources/moment/lang/mk.js
deleted file mode 100644 (file)
index 5f272fa..0000000
+++ /dev/null
@@ -1,86 +0,0 @@
-// moment.js language configuration
-// language : macedonian (mk)
-// author : Borislav Mickov : https://github.com/B0k0
-
-(function (factory) {
-    if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory(window.moment); // Browser global
-    }
-}(function (moment) {
-    return moment.lang('mk', {
-        months : "јануари_февруари_март_април_мај_јуни_јули_август_септември_октомври_ноември_декември".split("_"),
-        monthsShort : "јан_фев_мар_апр_мај_јун_јул_авг_сеп_окт_ное_дек".split("_"),
-        weekdays : "недела_понеделник_вторник_среда_четврток_петок_сабота".split("_"),
-        weekdaysShort : "нед_пон_вто_сре_чет_пет_саб".split("_"),
-        weekdaysMin : "нe_пo_вт_ср_че_пе_сa".split("_"),
-        longDateFormat : {
-            LT : "H:mm",
-            L : "D.MM.YYYY",
-            LL : "D MMMM YYYY",
-            LLL : "D MMMM YYYY LT",
-            LLLL : "dddd, D MMMM YYYY LT"
-        },
-        calendar : {
-            sameDay : '[Денес во] LT',
-            nextDay : '[Утре во] LT',
-            nextWeek : 'dddd [во] LT',
-            lastDay : '[Вчера во] LT',
-            lastWeek : function () {
-                switch (this.day()) {
-                case 0:
-                case 3:
-                case 6:
-                    return '[Во изминатата] dddd [во] LT';
-                case 1:
-                case 2:
-                case 4:
-                case 5:
-                    return '[Во изминатиот] dddd [во] LT';
-                }
-            },
-            sameElse : 'L'
-        },
-        relativeTime : {
-            future : "после %s",
-            past : "пред %s",
-            s : "неколку секунди",
-            m : "минута",
-            mm : "%d минути",
-            h : "час",
-            hh : "%d часа",
-            d : "ден",
-            dd : "%d дена",
-            M : "месец",
-            MM : "%d месеци",
-            y : "година",
-            yy : "%d години"
-        },
-        ordinal : function (number) {
-            var lastDigit = number % 10,
-                last2Digits = number % 100;
-            if (number === 0) {
-                return number + '-ев';
-            } else if (last2Digits === 0) {
-                return number + '-ен';
-            } else if (last2Digits > 10 && last2Digits < 20) {
-                return number + '-ти';
-            } else if (lastDigit === 1) {
-                return number + '-ви';
-            } else if (lastDigit === 2) {
-                return number + '-ри';
-            } else if (lastDigit === 7 || lastDigit === 8) {
-                return number + '-ми';
-            } else {
-                return number + '-ти';
-            }
-        },
-        week : {
-            dow : 1, // Monday is the first day of the week.
-            doy : 7  // The week that contains Jan 1st is the first week of the year.
-        }
-    });
-}));
diff --git a/resources/moment/lang/ml.js b/resources/moment/lang/ml.js
deleted file mode 100644 (file)
index cc7db9a..0000000
+++ /dev/null
@@ -1,64 +0,0 @@
-// moment.js language configuration
-// language : malayalam (ml)
-// author : Floyd Pink : https://github.com/floydpink
-
-(function (factory) {
-    if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory(window.moment); // Browser global
-    }
-}(function (moment) {
-    return moment.lang('ml', {
-        months : 'ജനുവരി_ഫെബ്രുവരി_മാർച്ച്_ഏപ്രിൽ_മേയ്_ജൂൺ_ജൂലൈ_ഓഗസ്റ്റ്_സെപ്റ്റംബർ_ഒക്ടോബർ_നവംബർ_ഡിസംബർ'.split("_"),
-        monthsShort : 'ജനു._ഫെബ്രു._മാർ._ഏപ്രി._മേയ്_ജൂൺ_ജൂലൈ._ഓഗ._സെപ്റ്റ._ഒക്ടോ._നവം._ഡിസം.'.split("_"),
-        weekdays : 'ഞായറാഴ്ച_തിങ്കളാഴ്ച_ചൊവ്വാഴ്ച_ബുധനാഴ്ച_വ്യാഴാഴ്ച_വെള്ളിയാഴ്ച_ശനിയാഴ്ച'.split("_"),
-        weekdaysShort : 'ഞായർ_തിങ്കൾ_ചൊവ്വ_ബുധൻ_വ്യാഴം_വെള്ളി_ശനി'.split("_"),
-        weekdaysMin : 'ഞാ_തി_ചൊ_ബു_വ്യാ_വെ_ശ'.split("_"),
-        longDateFormat : {
-            LT : "A h:mm -നു",
-            L : "DD/MM/YYYY",
-            LL : "D MMMM YYYY",
-            LLL : "D MMMM YYYY, LT",
-            LLLL : "dddd, D MMMM YYYY, LT"
-        },
-        calendar : {
-            sameDay : '[ഇന്ന്] LT',
-            nextDay : '[നാളെ] LT',
-            nextWeek : 'dddd, LT',
-            lastDay : '[ഇന്നലെ] LT',
-            lastWeek : '[കഴിഞ്ഞ] dddd, LT',
-            sameElse : 'L'
-        },
-        relativeTime : {
-            future : "%s കഴിഞ്ഞ്",
-            past : "%s മുൻപ്",
-            s : "അൽപ നിമിഷങ്ങൾ",
-            m : "ഒരു മിനിറ്റ്",
-            mm : "%d മിനിറ്റ്",
-            h : "ഒരു മണിക്കൂർ",
-            hh : "%d മണിക്കൂർ",
-            d : "ഒരു ദിവസം",
-            dd : "%d ദിവസം",
-            M : "ഒരു മാസം",
-            MM : "%d മാസം",
-            y : "ഒരു വർഷം",
-            yy : "%d വർഷം"
-        },
-        meridiem : function (hour, minute, isLower) {
-            if (hour < 4) {
-                return "രാത്രി";
-            } else if (hour < 12) {
-                return "രാവിലെ";
-            } else if (hour < 17) {
-                return "ഉച്ച കഴിഞ്ഞ്";
-            } else if (hour < 20) {
-                return "വൈകുന്നേരം";
-            } else {
-                return "രാത്രി";
-            }
-        }
-    });
-}));
diff --git a/resources/moment/lang/mr.js b/resources/moment/lang/mr.js
deleted file mode 100644 (file)
index 0d1adfd..0000000
+++ /dev/null
@@ -1,104 +0,0 @@
-// moment.js language configuration
-// language : Marathi (mr)
-// author : Harshad Kale : https://github.com/kalehv
-
-(function (factory) {
-    if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory(window.moment); // Browser global
-    }
-}(function (moment) {
-    var symbolMap = {
-        '1': '१',
-        '2': '२',
-        '3': '३',
-        '4': '४',
-        '5': '५',
-        '6': '६',
-        '7': '७',
-        '8': '८',
-        '9': '९',
-        '0': '०'
-    },
-    numberMap = {
-        '१': '1',
-        '२': '2',
-        '३': '3',
-        '४': '4',
-        '५': '5',
-        '६': '6',
-        '७': '7',
-        '८': '8',
-        '९': '9',
-        '०': '0'
-    };
-
-    return moment.lang('mr', {
-        months : 'जानेवारी_फेब्रुवारी_मार्च_एप्रिल_मे_जून_जुलै_ऑगस्ट_सप्टेंबर_ऑक्टोबर_नोव्हेंबर_डिसेंबर'.split("_"),
-        monthsShort: 'जाने._फेब्रु._मार्च._एप्रि._मे._जून._जुलै._ऑग._सप्टें._ऑक्टो._नोव्हें._डिसें.'.split("_"),
-        weekdays : 'रविवार_सोमवार_मंगळवार_बुधवार_गुरूवार_शुक्रवार_शनिवार'.split("_"),
-        weekdaysShort : 'रवि_सोम_मंगळ_बुध_गुरू_शुक्र_शनि'.split("_"),
-        weekdaysMin : 'र_सो_मं_बु_गु_शु_श'.split("_"),
-        longDateFormat : {
-            LT : "A h:mm वाजता",
-            L : "DD/MM/YYYY",
-            LL : "D MMMM YYYY",
-            LLL : "D MMMM YYYY, LT",
-            LLLL : "dddd, D MMMM YYYY, LT"
-        },
-        calendar : {
-            sameDay : '[आज] LT',
-            nextDay : '[उद्या] LT',
-            nextWeek : 'dddd, LT',
-            lastDay : '[काल] LT',
-            lastWeek: '[मागील] dddd, LT',
-            sameElse : 'L'
-        },
-        relativeTime : {
-            future : "%s नंतर",
-            past : "%s पूर्वी",
-            s : "सेकंद",
-            m: "एक मिनिट",
-            mm: "%d मिनिटे",
-            h : "एक तास",
-            hh : "%d तास",
-            d : "एक दिवस",
-            dd : "%d दिवस",
-            M : "एक महिना",
-            MM : "%d महिने",
-            y : "एक वर्ष",
-            yy : "%d वर्षे"
-        },
-        preparse: function (string) {
-            return string.replace(/[१२३४५६७८९०]/g, function (match) {
-                return numberMap[match];
-            });
-        },
-        postformat: function (string) {
-            return string.replace(/\d/g, function (match) {
-                return symbolMap[match];
-            });
-        },
-        meridiem: function (hour, minute, isLower)
-        {
-            if (hour < 4) {
-                return "रात्री";
-            } else if (hour < 10) {
-                return "सकाळी";
-            } else if (hour < 17) {
-                return "दुपारी";
-            } else if (hour < 20) {
-                return "सायंकाळी";
-            } else {
-                return "रात्री";
-            }
-        },
-        week : {
-            dow : 0, // Sunday is the first day of the week.
-            doy : 6  // The week that contains Jan 1st is the first week of the year.
-        }
-    });
-}));
diff --git a/resources/moment/lang/ms-my.js b/resources/moment/lang/ms-my.js
deleted file mode 100644 (file)
index 501d5aa..0000000
+++ /dev/null
@@ -1,66 +0,0 @@
-// moment.js language configuration
-// language : Bahasa Malaysia (ms-MY)
-// author : Weldan Jamili : https://github.com/weldan
-
-(function (factory) {
-    if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory(window.moment); // Browser global
-    }
-}(function (moment) {
-    return moment.lang('ms-my', {
-        months : "Januari_Februari_Mac_April_Mei_Jun_Julai_Ogos_September_Oktober_November_Disember".split("_"),
-        monthsShort : "Jan_Feb_Mac_Apr_Mei_Jun_Jul_Ogs_Sep_Okt_Nov_Dis".split("_"),
-        weekdays : "Ahad_Isnin_Selasa_Rabu_Khamis_Jumaat_Sabtu".split("_"),
-        weekdaysShort : "Ahd_Isn_Sel_Rab_Kha_Jum_Sab".split("_"),
-        weekdaysMin : "Ah_Is_Sl_Rb_Km_Jm_Sb".split("_"),
-        longDateFormat : {
-            LT : "HH.mm",
-            L : "DD/MM/YYYY",
-            LL : "D MMMM YYYY",
-            LLL : "D MMMM YYYY [pukul] LT",
-            LLLL : "dddd, D MMMM YYYY [pukul] LT"
-        },
-        meridiem : function (hours, minutes, isLower) {
-            if (hours < 11) {
-                return 'pagi';
-            } else if (hours < 15) {
-                return 'tengahari';
-            } else if (hours < 19) {
-                return 'petang';
-            } else {
-                return 'malam';
-            }
-        },
-        calendar : {
-            sameDay : '[Hari ini pukul] LT',
-            nextDay : '[Esok pukul] LT',
-            nextWeek : 'dddd [pukul] LT',
-            lastDay : '[Kelmarin pukul] LT',
-            lastWeek : 'dddd [lepas pukul] LT',
-            sameElse : 'L'
-        },
-        relativeTime : {
-            future : "dalam %s",
-            past : "%s yang lepas",
-            s : "beberapa saat",
-            m : "seminit",
-            mm : "%d minit",
-            h : "sejam",
-            hh : "%d jam",
-            d : "sehari",
-            dd : "%d hari",
-            M : "sebulan",
-            MM : "%d bulan",
-            y : "setahun",
-            yy : "%d tahun"
-        },
-        week : {
-            dow : 1, // Monday is the first day of the week.
-            doy : 7  // The week that contains Jan 1st is the first week of the year.
-        }
-    });
-}));
diff --git a/resources/moment/lang/nb.js b/resources/moment/lang/nb.js
deleted file mode 100644 (file)
index 2f652ef..0000000
+++ /dev/null
@@ -1,57 +0,0 @@
-// moment.js language configuration
-// language : norwegian bokmål (nb)
-// authors : Espen Hovlandsdal : https://github.com/rexxars
-//           Sigurd Gartmann : https://github.com/sigurdga
-
-(function (factory) {
-    if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory(window.moment); // Browser global
-    }
-}(function (moment) {
-    return moment.lang('nb', {
-        months : "januar_februar_mars_april_mai_juni_juli_august_september_oktober_november_desember".split("_"),
-        monthsShort : "jan._feb._mars_april_mai_juni_juli_aug._sep._okt._nov._des.".split("_"),
-        weekdays : "søndag_mandag_tirsdag_onsdag_torsdag_fredag_lørdag".split("_"),
-        weekdaysShort : "sø._ma._ti._on._to._fr._lø.".split("_"),
-        weekdaysMin : "sø_ma_ti_on_to_fr_lø".split("_"),
-        longDateFormat : {
-            LT : "H.mm",
-            L : "DD.MM.YYYY",
-            LL : "D. MMMM YYYY",
-            LLL : "D. MMMM YYYY [kl.] LT",
-            LLLL : "dddd D. MMMM YYYY [kl.] LT"
-        },
-        calendar : {
-            sameDay: '[i dag kl.] LT',
-            nextDay: '[i morgen kl.] LT',
-            nextWeek: 'dddd [kl.] LT',
-            lastDay: '[i går kl.] LT',
-            lastWeek: '[forrige] dddd [kl.] LT',
-            sameElse: 'L'
-        },
-        relativeTime : {
-            future : "om %s",
-            past : "for %s siden",
-            s : "noen sekunder",
-            m : "ett minutt",
-            mm : "%d minutter",
-            h : "en time",
-            hh : "%d timer",
-            d : "en dag",
-            dd : "%d dager",
-            M : "en måned",
-            MM : "%d måneder",
-            y : "ett år",
-            yy : "%d år"
-        },
-        ordinal : '%d.',
-        week : {
-            dow : 1, // Monday is the first day of the week.
-            doy : 4  // The week that contains Jan 4th is the first week of the year.
-        }
-    });
-}));
diff --git a/resources/moment/lang/ne.js b/resources/moment/lang/ne.js
deleted file mode 100644 (file)
index 1d57b8c..0000000
+++ /dev/null
@@ -1,105 +0,0 @@
-// moment.js language configuration
-// language : nepali/nepalese
-// author : suvash : https://github.com/suvash
-
-(function (factory) {
-    if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory(window.moment); // Browser global
-    }
-}(function (moment) {
-    var symbolMap = {
-        '1': '१',
-        '2': '२',
-        '3': '३',
-        '4': '४',
-        '5': '५',
-        '6': '६',
-        '7': '७',
-        '8': '८',
-        '9': '९',
-        '0': '०'
-    },
-    numberMap = {
-        '१': '1',
-        '२': '2',
-        '३': '3',
-        '४': '4',
-        '५': '5',
-        '६': '6',
-        '७': '7',
-        '८': '8',
-        '९': '9',
-        '०': '0'
-    };
-
-    return moment.lang('ne', {
-        months : 'जनवरी_फेब्रुवरी_मार्च_अप्रिल_मई_जुन_जुलाई_अगष्ट_सेप्टेम्बर_अक्टोबर_नोभेम्बर_डिसेम्बर'.split("_"),
-        monthsShort : 'जन._फेब्रु._मार्च_अप्रि._मई_जुन_जुलाई._अग._सेप्ट._अक्टो._नोभे._डिसे.'.split("_"),
-        weekdays : 'आइतबार_सोमबार_मङ्गलबार_बुधबार_बिहिबार_शुक्रबार_शनिबार'.split("_"),
-        weekdaysShort : 'आइत._सोम._मङ्गल._बुध._बिहि._शुक्र._शनि.'.split("_"),
-        weekdaysMin : 'आइ._सो._मङ्_बु._बि._शु._श.'.split("_"),
-        longDateFormat : {
-            LT : "Aको h:mm बजे",
-            L : "DD/MM/YYYY",
-            LL : "D MMMM YYYY",
-            LLL : "D MMMM YYYY, LT",
-            LLLL : "dddd, D MMMM YYYY, LT"
-        },
-        preparse: function (string) {
-            return string.replace(/[१२३४५६७८९०]/g, function (match) {
-                return numberMap[match];
-            });
-        },
-        postformat: function (string) {
-            return string.replace(/\d/g, function (match) {
-                return symbolMap[match];
-            });
-        },
-        meridiem : function (hour, minute, isLower) {
-            if (hour < 3) {
-                return "राती";
-            } else if (hour < 10) {
-                return "बिहान";
-            } else if (hour < 15) {
-                return "दिउँसो";
-            } else if (hour < 18) {
-                return "बेलुका";
-            } else if (hour < 20) {
-                return "साँझ";
-            } else {
-                return "राती";
-            }
-        },
-        calendar : {
-            sameDay : '[आज] LT',
-            nextDay : '[भोली] LT',
-            nextWeek : '[आउँदो] dddd[,] LT',
-            lastDay : '[हिजो] LT',
-            lastWeek : '[गएको] dddd[,] LT',
-            sameElse : 'L'
-        },
-        relativeTime : {
-            future : "%sमा",
-            past : "%s अगाडी",
-            s : "केही समय",
-            m : "एक मिनेट",
-            mm : "%d मिनेट",
-            h : "एक घण्टा",
-            hh : "%d घण्टा",
-            d : "एक दिन",
-            dd : "%d दिन",
-            M : "एक महिना",
-            MM : "%d महिना",
-            y : "एक बर्ष",
-            yy : "%d बर्ष"
-        },
-        week : {
-            dow : 1, // Monday is the first day of the week.
-            doy : 7  // The week that contains Jan 1st is the first week of the year.
-        }
-    });
-}));
diff --git a/resources/moment/lang/nl.js b/resources/moment/lang/nl.js
deleted file mode 100644 (file)
index ffd454f..0000000
+++ /dev/null
@@ -1,67 +0,0 @@
-// moment.js language configuration
-// language : dutch (nl)
-// author : Joris Röling : https://github.com/jjupiter
-
-(function (factory) {
-    if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory(window.moment); // Browser global
-    }
-}(function (moment) {
-    var monthsShortWithDots = "jan._feb._mrt._apr._mei_jun._jul._aug._sep._okt._nov._dec.".split("_"),
-        monthsShortWithoutDots = "jan_feb_mrt_apr_mei_jun_jul_aug_sep_okt_nov_dec".split("_");
-
-    return moment.lang('nl', {
-        months : "januari_februari_maart_april_mei_juni_juli_augustus_september_oktober_november_december".split("_"),
-        monthsShort : function (m, format) {
-            if (/-MMM-/.test(format)) {
-                return monthsShortWithoutDots[m.month()];
-            } else {
-                return monthsShortWithDots[m.month()];
-            }
-        },
-        weekdays : "zondag_maandag_dinsdag_woensdag_donderdag_vrijdag_zaterdag".split("_"),
-        weekdaysShort : "zo._ma._di._wo._do._vr._za.".split("_"),
-        weekdaysMin : "Zo_Ma_Di_Wo_Do_Vr_Za".split("_"),
-        longDateFormat : {
-            LT : "HH:mm",
-            L : "DD-MM-YYYY",
-            LL : "D MMMM YYYY",
-            LLL : "D MMMM YYYY LT",
-            LLLL : "dddd D MMMM YYYY LT"
-        },
-        calendar : {
-            sameDay: '[vandaag om] LT',
-            nextDay: '[morgen om] LT',
-            nextWeek: 'dddd [om] LT',
-            lastDay: '[gisteren om] LT',
-            lastWeek: '[afgelopen] dddd [om] LT',
-            sameElse: 'L'
-        },
-        relativeTime : {
-            future : "over %s",
-            past : "%s geleden",
-            s : "een paar seconden",
-            m : "één minuut",
-            mm : "%d minuten",
-            h : "één uur",
-            hh : "%d uur",
-            d : "één dag",
-            dd : "%d dagen",
-            M : "één maand",
-            MM : "%d maanden",
-            y : "één jaar",
-            yy : "%d jaar"
-        },
-        ordinal : function (number) {
-            return number + ((number === 1 || number === 8 || number >= 20) ? 'ste' : 'de');
-        },
-        week : {
-            dow : 1, // Monday is the first day of the week.
-            doy : 4  // The week that contains Jan 4th is the first week of the year.
-        }
-    });
-}));
diff --git a/resources/moment/lang/nn.js b/resources/moment/lang/nn.js
deleted file mode 100644 (file)
index f59c415..0000000
+++ /dev/null
@@ -1,56 +0,0 @@
-// moment.js language configuration
-// language : norwegian nynorsk (nn)
-// author : https://github.com/mechuwind
-
-(function (factory) {
-    if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory(window.moment); // Browser global
-    }
-}(function (moment) {
-    return moment.lang('nn', {
-        months : "januar_februar_mars_april_mai_juni_juli_august_september_oktober_november_desember".split("_"),
-        monthsShort : "jan_feb_mar_apr_mai_jun_jul_aug_sep_okt_nov_des".split("_"),
-        weekdays : "sundag_måndag_tysdag_onsdag_torsdag_fredag_laurdag".split("_"),
-        weekdaysShort : "sun_mån_tys_ons_tor_fre_lau".split("_"),
-        weekdaysMin : "su_må_ty_on_to_fr_lø".split("_"),
-        longDateFormat : {
-            LT : "HH:mm",
-            L : "DD.MM.YYYY",
-            LL : "D MMMM YYYY",
-            LLL : "D MMMM YYYY LT",
-            LLLL : "dddd D MMMM YYYY LT"
-        },
-        calendar : {
-            sameDay: '[I dag klokka] LT',
-            nextDay: '[I morgon klokka] LT',
-            nextWeek: 'dddd [klokka] LT',
-            lastDay: '[I går klokka] LT',
-            lastWeek: '[Føregående] dddd [klokka] LT',
-            sameElse: 'L'
-        },
-        relativeTime : {
-            future : "om %s",
-            past : "for %s siden",
-            s : "noen sekund",
-            m : "ett minutt",
-            mm : "%d minutt",
-            h : "en time",
-            hh : "%d timar",
-            d : "en dag",
-            dd : "%d dagar",
-            M : "en månad",
-            MM : "%d månader",
-            y : "ett år",
-            yy : "%d år"
-        },
-        ordinal : '%d.',
-        week : {
-            dow : 1, // Monday is the first day of the week.
-            doy : 4  // The week that contains Jan 4th is the first week of the year.
-        }
-    });
-}));
diff --git a/resources/moment/lang/pl.js b/resources/moment/lang/pl.js
deleted file mode 100644 (file)
index 97770d2..0000000
+++ /dev/null
@@ -1,98 +0,0 @@
-// moment.js language configuration
-// language : polish (pl)
-// author : Rafal Hirsz : https://github.com/evoL
-
-(function (factory) {
-    if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory(window.moment); // Browser global
-    }
-}(function (moment) {
-    var monthsNominative = "styczeń_luty_marzec_kwiecień_maj_czerwiec_lipiec_sierpień_wrzesień_październik_listopad_grudzień".split("_"),
-        monthsSubjective = "stycznia_lutego_marca_kwietnia_maja_czerwca_lipca_sierpnia_września_października_listopada_grudnia".split("_");
-
-    function plural(n) {
-        return (n % 10 < 5) && (n % 10 > 1) && ((~~(n / 10) % 10) !== 1);
-    }
-
-    function translate(number, withoutSuffix, key) {
-        var result = number + " ";
-        switch (key) {
-        case 'm':
-            return withoutSuffix ? 'minuta' : 'minutę';
-        case 'mm':
-            return result + (plural(number) ? 'minuty' : 'minut');
-        case 'h':
-            return withoutSuffix  ? 'godzina'  : 'godzinę';
-        case 'hh':
-            return result + (plural(number) ? 'godziny' : 'godzin');
-        case 'MM':
-            return result + (plural(number) ? 'miesiące' : 'miesięcy');
-        case 'yy':
-            return result + (plural(number) ? 'lata' : 'lat');
-        }
-    }
-
-    return moment.lang('pl', {
-        months : function (momentToFormat, format) {
-            if (/D MMMM/.test(format)) {
-                return monthsSubjective[momentToFormat.month()];
-            } else {
-                return monthsNominative[momentToFormat.month()];
-            }
-        },
-        monthsShort : "sty_lut_mar_kwi_maj_cze_lip_sie_wrz_paź_lis_gru".split("_"),
-        weekdays : "niedziela_poniedziałek_wtorek_środa_czwartek_piątek_sobota".split("_"),
-        weekdaysShort : "nie_pon_wt_śr_czw_pt_sb".split("_"),
-        weekdaysMin : "N_Pn_Wt_Śr_Cz_Pt_So".split("_"),
-        longDateFormat : {
-            LT : "HH:mm",
-            L : "DD.MM.YYYY",
-            LL : "D MMMM YYYY",
-            LLL : "D MMMM YYYY LT",
-            LLLL : "dddd, D MMMM YYYY LT"
-        },
-        calendar : {
-            sameDay: '[Dziś o] LT',
-            nextDay: '[Jutro o] LT',
-            nextWeek: '[W] dddd [o] LT',
-            lastDay: '[Wczoraj o] LT',
-            lastWeek: function () {
-                switch (this.day()) {
-                case 0:
-                    return '[W zeszłą niedzielę o] LT';
-                case 3:
-                    return '[W zeszłą środę o] LT';
-                case 6:
-                    return '[W zeszłą sobotę o] LT';
-                default:
-                    return '[W zeszły] dddd [o] LT';
-                }
-            },
-            sameElse: 'L'
-        },
-        relativeTime : {
-            future : "za %s",
-            past : "%s temu",
-            s : "kilka sekund",
-            m : translate,
-            mm : translate,
-            h : translate,
-            hh : translate,
-            d : "1 dzień",
-            dd : '%d dni',
-            M : "miesiąc",
-            MM : translate,
-            y : "rok",
-            yy : translate
-        },
-        ordinal : '%d.',
-        week : {
-            dow : 1, // Monday is the first day of the week.
-            doy : 4  // The week that contains Jan 4th is the first week of the year.
-        }
-    });
-}));
diff --git a/resources/moment/lang/pt-br.js b/resources/moment/lang/pt-br.js
deleted file mode 100644 (file)
index 5cac19b..0000000
+++ /dev/null
@@ -1,56 +0,0 @@
-// moment.js language configuration
-// language : brazilian portuguese (pt-br)
-// author : Caio Ribeiro Pereira : https://github.com/caio-ribeiro-pereira
-
-(function (factory) {
-    if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory(window.moment); // Browser global
-    }
-}(function (moment) {
-    return moment.lang('pt-br', {
-        months : "Janeiro_Fevereiro_Março_Abril_Maio_Junho_Julho_Agosto_Setembro_Outubro_Novembro_Dezembro".split("_"),
-        monthsShort : "Jan_Fev_Mar_Abr_Mai_Jun_Jul_Ago_Set_Out_Nov_Dez".split("_"),
-        weekdays : "Domingo_Segunda-feira_Terça-feira_Quarta-feira_Quinta-feira_Sexta-feira_Sábado".split("_"),
-        weekdaysShort : "Dom_Seg_Ter_Qua_Qui_Sex_Sáb".split("_"),
-        weekdaysMin : "Dom_2ª_3ª_4ª_5ª_6ª_Sáb".split("_"),
-        longDateFormat : {
-            LT : "HH:mm",
-            L : "DD/MM/YYYY",
-            LL : "D [de] MMMM [de] YYYY",
-            LLL : "D [de] MMMM [de] YYYY LT",
-            LLLL : "dddd, D [de] MMMM [de] YYYY LT"
-        },
-        calendar : {
-            sameDay: '[Hoje às] LT',
-            nextDay: '[Amanhã às] LT',
-            nextWeek: 'dddd [às] LT',
-            lastDay: '[Ontem às] LT',
-            lastWeek: function () {
-                return (this.day() === 0 || this.day() === 6) ?
-                    '[Último] dddd [às] LT' : // Saturday + Sunday
-                    '[Última] dddd [às] LT'; // Monday - Friday
-            },
-            sameElse: 'L'
-        },
-        relativeTime : {
-            future : "em %s",
-            past : "%s atrás",
-            s : "segundos",
-            m : "um minuto",
-            mm : "%d minutos",
-            h : "uma hora",
-            hh : "%d horas",
-            d : "um dia",
-            dd : "%d dias",
-            M : "um mês",
-            MM : "%d meses",
-            y : "um ano",
-            yy : "%d anos"
-        },
-        ordinal : '%dº'
-    });
-}));
diff --git a/resources/moment/lang/pt.js b/resources/moment/lang/pt.js
deleted file mode 100644 (file)
index 7c1f2b5..0000000
+++ /dev/null
@@ -1,60 +0,0 @@
-// moment.js language configuration
-// language : portuguese (pt)
-// author : Jefferson : https://github.com/jalex79
-
-(function (factory) {
-    if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory(window.moment); // Browser global
-    }
-}(function (moment) {
-    return moment.lang('pt', {
-        months : "Janeiro_Fevereiro_Março_Abril_Maio_Junho_Julho_Agosto_Setembro_Outubro_Novembro_Dezembro".split("_"),
-        monthsShort : "Jan_Fev_Mar_Abr_Mai_Jun_Jul_Ago_Set_Out_Nov_Dez".split("_"),
-        weekdays : "Domingo_Segunda-feira_Terça-feira_Quarta-feira_Quinta-feira_Sexta-feira_Sábado".split("_"),
-        weekdaysShort : "Dom_Seg_Ter_Qua_Qui_Sex_Sáb".split("_"),
-        weekdaysMin : "Dom_2ª_3ª_4ª_5ª_6ª_Sáb".split("_"),
-        longDateFormat : {
-            LT : "HH:mm",
-            L : "DD/MM/YYYY",
-            LL : "D [de] MMMM [de] YYYY",
-            LLL : "D [de] MMMM [de] YYYY LT",
-            LLLL : "dddd, D [de] MMMM [de] YYYY LT"
-        },
-        calendar : {
-            sameDay: '[Hoje às] LT',
-            nextDay: '[Amanhã às] LT',
-            nextWeek: 'dddd [às] LT',
-            lastDay: '[Ontem às] LT',
-            lastWeek: function () {
-                return (this.day() === 0 || this.day() === 6) ?
-                    '[Último] dddd [às] LT' : // Saturday + Sunday
-                    '[Última] dddd [às] LT'; // Monday - Friday
-            },
-            sameElse: 'L'
-        },
-        relativeTime : {
-            future : "em %s",
-            past : "%s atrás",
-            s : "segundos",
-            m : "um minuto",
-            mm : "%d minutos",
-            h : "uma hora",
-            hh : "%d horas",
-            d : "um dia",
-            dd : "%d dias",
-            M : "um mês",
-            MM : "%d meses",
-            y : "um ano",
-            yy : "%d anos"
-        },
-        ordinal : '%dº',
-        week : {
-            dow : 1, // Monday is the first day of the week.
-            doy : 4  // The week that contains Jan 4th is the first week of the year.
-        }
-    });
-}));
diff --git a/resources/moment/lang/ro.js b/resources/moment/lang/ro.js
deleted file mode 100644 (file)
index 77d7355..0000000
+++ /dev/null
@@ -1,72 +0,0 @@
-// moment.js language configuration
-// language : romanian (ro)
-// author : Vlad Gurdiga : https://github.com/gurdiga
-// author : Valentin Agachi : https://github.com/avaly
-
-(function (factory) {
-    if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory(window.moment); // Browser global
-    }
-}(function (moment) {
-    function relativeTimeWithPlural(number, withoutSuffix, key) {
-        var format = {
-            'mm': 'minute',
-            'hh': 'ore',
-            'dd': 'zile',
-            'MM': 'luni',
-            'yy': 'ani'
-        },
-            separator = ' ';
-        if (number % 100 >= 20 || (number >= 100 && number % 100 === 0)) {
-            separator = ' de ';
-        }
-
-        return number + separator + format[key];
-    }
-
-    return moment.lang('ro', {
-        months : "ianuarie_februarie_martie_aprilie_mai_iunie_iulie_august_septembrie_octombrie_noiembrie_decembrie".split("_"),
-        monthsShort : "ian_feb_mar_apr_mai_iun_iul_aug_sep_oct_noi_dec".split("_"),
-        weekdays : "duminică_luni_marți_miercuri_joi_vineri_sâmbătă".split("_"),
-        weekdaysShort : "Dum_Lun_Mar_Mie_Joi_Vin_Sâm".split("_"),
-        weekdaysMin : "Du_Lu_Ma_Mi_Jo_Vi_Sâ".split("_"),
-        longDateFormat : {
-            LT : "H:mm",
-            L : "DD.MM.YYYY",
-            LL : "D MMMM YYYY",
-            LLL : "D MMMM YYYY H:mm",
-            LLLL : "dddd, D MMMM YYYY H:mm"
-        },
-        calendar : {
-            sameDay: "[azi la] LT",
-            nextDay: '[mâine la] LT',
-            nextWeek: 'dddd [la] LT',
-            lastDay: '[ieri la] LT',
-            lastWeek: '[fosta] dddd [la] LT',
-            sameElse: 'L'
-        },
-        relativeTime : {
-            future : "peste %s",
-            past : "%s în urmă",
-            s : "câteva secunde",
-            m : "un minut",
-            mm : relativeTimeWithPlural,
-            h : "o oră",
-            hh : relativeTimeWithPlural,
-            d : "o zi",
-            dd : relativeTimeWithPlural,
-            M : "o lună",
-            MM : relativeTimeWithPlural,
-            y : "un an",
-            yy : relativeTimeWithPlural
-        },
-        week : {
-            dow : 1, // Monday is the first day of the week.
-            doy : 7  // The week that contains Jan 1st is the first week of the year.
-        }
-    });
-}));
diff --git a/resources/moment/lang/rs.js b/resources/moment/lang/rs.js
deleted file mode 100644 (file)
index 8627553..0000000
+++ /dev/null
@@ -1,139 +0,0 @@
-// moment.js language configuration
-// language : serbian (rs)
-// author : Limon Monte : https://github.com/limonte
-// based on (bs) translation by Nedim Cholich
-
-(function (factory) {
-    if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory(window.moment); // Browser global
-    }
-}(function (moment) {
-
-    function translate(number, withoutSuffix, key) {
-        var result = number + " ";
-        switch (key) {
-        case 'm':
-            return withoutSuffix ? 'jedna minuta' : 'jedne minute';
-        case 'mm':
-            if (number === 1) {
-                result += 'minuta';
-            } else if (number === 2 || number === 3 || number === 4) {
-                result += 'minute';
-            } else {
-                result += 'minuta';
-            }
-            return result;
-        case 'h':
-            return withoutSuffix ? 'jedan sat' : 'jednog sata';
-        case 'hh':
-            if (number === 1) {
-                result += 'sat';
-            } else if (number === 2 || number === 3 || number === 4) {
-                result += 'sata';
-            } else {
-                result += 'sati';
-            }
-            return result;
-        case 'dd':
-            if (number === 1) {
-                result += 'dan';
-            } else {
-                result += 'dana';
-            }
-            return result;
-        case 'MM':
-            if (number === 1) {
-                result += 'mesec';
-            } else if (number === 2 || number === 3 || number === 4) {
-                result += 'meseca';
-            } else {
-                result += 'meseci';
-            }
-            return result;
-        case 'yy':
-            if (number === 1) {
-                result += 'godina';
-            } else if (number === 2 || number === 3 || number === 4) {
-                result += 'godine';
-            } else {
-                result += 'godina';
-            }
-            return result;
-        }
-    }
-
-    return moment.lang('rs', {
-        months : "januar_februar_mart_april_maj_jun_jul_avgust_septembar_oktobar_novembar_decembar".split("_"),
-        monthsShort : "jan._feb._mar._apr._maj._jun._jul._avg._sep._okt._nov._dec.".split("_"),
-        weekdays : "nedelja_ponedeljak_utorak_sreda_četvrtak_petak_subota".split("_"),
-        weekdaysShort : "ned._pon._uto._sre._čet._pet._sub.".split("_"),
-        weekdaysMin : "ne_po_ut_sr_če_pe_su".split("_"),
-        longDateFormat : {
-            LT : "H:mm",
-            L : "DD. MM. YYYY",
-            LL : "D. MMMM YYYY",
-            LLL : "D. MMMM YYYY LT",
-            LLLL : "dddd, D. MMMM YYYY LT"
-        },
-        calendar : {
-            sameDay  : '[danas u] LT',
-            nextDay  : '[sutra u] LT',
-
-            nextWeek : function () {
-                switch (this.day()) {
-                case 0:
-                    return '[u] [nedelju] [u] LT';
-                case 3:
-                    return '[u] [sredu] [u] LT';
-                case 6:
-                    return '[u] [subotu] [u] LT';
-                case 1:
-                case 2:
-                case 4:
-                case 5:
-                    return '[u] dddd [u] LT';
-                }
-            },
-            lastDay  : '[juče u] LT',
-            lastWeek : function () {
-                switch (this.day()) {
-                case 0:
-                case 3:
-                    return '[prošlu] dddd [u] LT';
-                case 6:
-                    return '[prošle] [subote] [u] LT';
-                case 1:
-                case 2:
-                case 4:
-                case 5:
-                    return '[prošli] dddd [u] LT';
-                }
-            },
-            sameElse : 'L'
-        },
-        relativeTime : {
-            future : "za %s",
-            past   : "pre %s",
-            s      : "par sekundi",
-            m      : translate,
-            mm     : translate,
-            h      : translate,
-            hh     : translate,
-            d      : "dan",
-            dd     : translate,
-            M      : "mesec",
-            MM     : translate,
-            y      : "godinu",
-            yy     : translate
-        },
-        ordinal : '%d.',
-        week : {
-            dow : 1, // Monday is the first day of the week.
-            doy : 7  // The week that contains Jan 1st is the first week of the year.
-        }
-    });
-}));
diff --git a/resources/moment/lang/ru.js b/resources/moment/lang/ru.js
deleted file mode 100644 (file)
index 1d1816c..0000000
+++ /dev/null
@@ -1,163 +0,0 @@
-// moment.js language configuration
-// language : russian (ru)
-// author : Viktorminator : https://github.com/Viktorminator
-// Author : Menelion Elensúle : https://github.com/Oire
-
-(function (factory) {
-    if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory(window.moment); // Browser global
-    }
-}(function (moment) {
-    function plural(word, num) {
-        var forms = word.split('_');
-        return num % 10 === 1 && num % 100 !== 11 ? forms[0] : (num % 10 >= 2 && num % 10 <= 4 && (num % 100 < 10 || num % 100 >= 20) ? forms[1] : forms[2]);
-    }
-
-    function relativeTimeWithPlural(number, withoutSuffix, key) {
-        var format = {
-            'mm': 'минута_минуты_минут',
-            'hh': 'час_часа_часов',
-            'dd': 'день_дня_дней',
-            'MM': 'месяц_месяца_месяцев',
-            'yy': 'год_года_лет'
-        };
-        if (key === 'm') {
-            return withoutSuffix ? 'минута' : 'минуту';
-        }
-        else {
-            return number + ' ' + plural(format[key], +number);
-        }
-    }
-
-    function monthsCaseReplace(m, format) {
-        var months = {
-            'nominative': 'январь_февраль_март_апрель_май_июнь_июль_август_сентябрь_октябрь_ноябрь_декабрь'.split('_'),
-            'accusative': 'января_февраля_марта_апреля_мая_июня_июля_августа_сентября_октября_ноября_декабря'.split('_')
-        },
-
-        nounCase = (/D[oD]?(\[[^\[\]]*\]|\s+)+MMMM?/).test(format) ?
-            'accusative' :
-            'nominative';
-
-        return months[nounCase][m.month()];
-    }
-
-    function monthsShortCaseReplace(m, format) {
-        var monthsShort = {
-            'nominative': 'янв_фев_мар_апр_май_июнь_июль_авг_сен_окт_ноя_дек'.split('_'),
-            'accusative': 'янв_фев_мар_апр_мая_июня_июля_авг_сен_окт_ноя_дек'.split('_')
-        },
-
-        nounCase = (/D[oD]?(\[[^\[\]]*\]|\s+)+MMMM?/).test(format) ?
-            'accusative' :
-            'nominative';
-
-        return monthsShort[nounCase][m.month()];
-    }
-
-    function weekdaysCaseReplace(m, format) {
-        var weekdays = {
-            'nominative': 'воскресенье_понедельник_вторник_среда_четверг_пятница_суббота'.split('_'),
-            'accusative': 'воскресенье_понедельник_вторник_среду_четверг_пятницу_субботу'.split('_')
-        },
-
-        nounCase = (/\[ ?[Вв] ?(?:прошлую|следующую)? ?\] ?dddd/).test(format) ?
-            'accusative' :
-            'nominative';
-
-        return weekdays[nounCase][m.day()];
-    }
-
-    return moment.lang('ru', {
-        months : monthsCaseReplace,
-        monthsShort : monthsShortCaseReplace,
-        weekdays : weekdaysCaseReplace,
-        weekdaysShort : "вс_пн_вт_ср_чт_пт_сб".split("_"),
-        weekdaysMin : "вс_пн_вт_ср_чт_пт_сб".split("_"),
-        monthsParse : [/^янв/i, /^фев/i, /^мар/i, /^апр/i, /^ма[й|я]/i, /^июн/i, /^июл/i, /^авг/i, /^сен/i, /^окт/i, /^ноя/i, /^дек/i],
-        longDateFormat : {
-            LT : "HH:mm",
-            L : "DD.MM.YYYY",
-            LL : "D MMMM YYYY г.",
-            LLL : "D MMMM YYYY г., LT",
-            LLLL : "dddd, D MMMM YYYY г., LT"
-        },
-        calendar : {
-            sameDay: '[Сегодня в] LT',
-            nextDay: '[Завтра в] LT',
-            lastDay: '[Вчера в] LT',
-            nextWeek: function () {
-                return this.day() === 2 ? '[Во] dddd [в] LT' : '[В] dddd [в] LT';
-            },
-            lastWeek: function () {
-                switch (this.day()) {
-                case 0:
-                    return '[В прошлое] dddd [в] LT';
-                case 1:
-                case 2:
-                case 4:
-                    return '[В прошлый] dddd [в] LT';
-                case 3:
-                case 5:
-                case 6:
-                    return '[В прошлую] dddd [в] LT';
-                }
-            },
-            sameElse: 'L'
-        },
-        relativeTime : {
-            future : "через %s",
-            past : "%s назад",
-            s : "несколько секунд",
-            m : relativeTimeWithPlural,
-            mm : relativeTimeWithPlural,
-            h : "час",
-            hh : relativeTimeWithPlural,
-            d : "день",
-            dd : relativeTimeWithPlural,
-            M : "месяц",
-            MM : relativeTimeWithPlural,
-            y : "год",
-            yy : relativeTimeWithPlural
-        },
-
-        // M. E.: those two are virtually unused but a user might want to implement them for his/her website for some reason
-
-        meridiem : function (hour, minute, isLower) {
-            if (hour < 4) {
-                return "ночи";
-            } else if (hour < 12) {
-                return "утра";
-            } else if (hour < 17) {
-                return "дня";
-            } else {
-                return "вечера";
-            }
-        },
-
-        ordinal: function (number, period) {
-            switch (period) {
-            case 'M':
-            case 'd':
-            case 'DDD':
-                return number + '-й';
-            case 'D':
-                return number + '-го';
-            case 'w':
-            case 'W':
-                return number + '-я';
-            default:
-                return number;
-            }
-        },
-
-        week : {
-            dow : 1, // Monday is the first day of the week.
-            doy : 7  // The week that contains Jan 1st is the first week of the year.
-        }
-    });
-}));
diff --git a/resources/moment/lang/sk.js b/resources/moment/lang/sk.js
deleted file mode 100644 (file)
index ed8a41d..0000000
+++ /dev/null
@@ -1,156 +0,0 @@
-// moment.js language configuration
-// language : slovak (sk)
-// author : Martin Minka : https://github.com/k2s
-// based on work of petrbela : https://github.com/petrbela
-
-(function (factory) {
-    if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory(window.moment); // Browser global
-    }
-}(function (moment) {
-    var months = "január_február_marec_apríl_máj_jún_júl_august_september_október_november_december".split("_"),
-        monthsShort = "jan_feb_mar_apr_máj_jún_júl_aug_sep_okt_nov_dec".split("_");
-
-    function plural(n) {
-        return (n > 1) && (n < 5);
-    }
-
-    function translate(number, withoutSuffix, key, isFuture) {
-        var result = number + " ";
-        switch (key) {
-        case 's':  // a few seconds / in a few seconds / a few seconds ago
-            return (withoutSuffix || isFuture) ? 'pár sekúnd' : 'pár sekundami';
-        case 'm':  // a minute / in a minute / a minute ago
-            return withoutSuffix ? 'minúta' : (isFuture ? 'minútu' : 'minútou');
-        case 'mm': // 9 minutes / in 9 minutes / 9 minutes ago
-            if (withoutSuffix || isFuture) {
-                return result + (plural(number) ? 'minúty' : 'minút');
-            } else {
-                return result + 'minútami';
-            }
-            break;
-        case 'h':  // an hour / in an hour / an hour ago
-            return withoutSuffix ? 'hodina' : (isFuture ? 'hodinu' : 'hodinou');
-        case 'hh': // 9 hours / in 9 hours / 9 hours ago
-            if (withoutSuffix || isFuture) {
-                return result + (plural(number) ? 'hodiny' : 'hodín');
-            } else {
-                return result + 'hodinami';
-            }
-            break;
-        case 'd':  // a day / in a day / a day ago
-            return (withoutSuffix || isFuture) ? 'deň' : 'dňom';
-        case 'dd': // 9 days / in 9 days / 9 days ago
-            if (withoutSuffix || isFuture) {
-                return result + (plural(number) ? 'dni' : 'dní');
-            } else {
-                return result + 'dňami';
-            }
-            break;
-        case 'M':  // a month / in a month / a month ago
-            return (withoutSuffix || isFuture) ? 'mesiac' : 'mesiacom';
-        case 'MM': // 9 months / in 9 months / 9 months ago
-            if (withoutSuffix || isFuture) {
-                return result + (plural(number) ? 'mesiace' : 'mesiacov');
-            } else {
-                return result + 'mesiacmi';
-            }
-            break;
-        case 'y':  // a year / in a year / a year ago
-            return (withoutSuffix || isFuture) ? 'rok' : 'rokom';
-        case 'yy': // 9 years / in 9 years / 9 years ago
-            if (withoutSuffix || isFuture) {
-                return result + (plural(number) ? 'roky' : 'rokov');
-            } else {
-                return result + 'rokmi';
-            }
-            break;
-        }
-    }
-
-    return moment.lang('sk', {
-        months : months,
-        monthsShort : monthsShort,
-        monthsParse : (function (months, monthsShort) {
-            var i, _monthsParse = [];
-            for (i = 0; i < 12; i++) {
-                // use custom parser to solve problem with July (červenec)
-                _monthsParse[i] = new RegExp('^' + months[i] + '$|^' + monthsShort[i] + '$', 'i');
-            }
-            return _monthsParse;
-        }(months, monthsShort)),
-        weekdays : "nedeľa_pondelok_utorok_streda_štvrtok_piatok_sobota".split("_"),
-        weekdaysShort : "ne_po_ut_st_št_pi_so".split("_"),
-        weekdaysMin : "ne_po_ut_st_št_pi_so".split("_"),
-        longDateFormat : {
-            LT: "H:mm",
-            L : "DD.MM.YYYY",
-            LL : "D. MMMM YYYY",
-            LLL : "D. MMMM YYYY LT",
-            LLLL : "dddd D. MMMM YYYY LT"
-        },
-        calendar : {
-            sameDay: "[dnes o] LT",
-            nextDay: '[zajtra o] LT',
-            nextWeek: function () {
-                switch (this.day()) {
-                case 0:
-                    return '[v nedeľu o] LT';
-                case 1:
-                case 2:
-                    return '[v] dddd [o] LT';
-                case 3:
-                    return '[v stredu o] LT';
-                case 4:
-                    return '[vo štvrtok o] LT';
-                case 5:
-                    return '[v piatok o] LT';
-                case 6:
-                    return '[v sobotu o] LT';
-                }
-            },
-            lastDay: '[včera o] LT',
-            lastWeek: function () {
-                switch (this.day()) {
-                case 0:
-                    return '[minulú nedeľu o] LT';
-                case 1:
-                case 2:
-                    return '[minulý] dddd [o] LT';
-                case 3:
-                    return '[minulú stredu o] LT';
-                case 4:
-                case 5:
-                    return '[minulý] dddd [o] LT';
-                case 6:
-                    return '[minulú sobotu o] LT';
-                }
-            },
-            sameElse: "L"
-        },
-        relativeTime : {
-            future : "za %s",
-            past : "pred %s",
-            s : translate,
-            m : translate,
-            mm : translate,
-            h : translate,
-            hh : translate,
-            d : translate,
-            dd : translate,
-            M : translate,
-            MM : translate,
-            y : translate,
-            yy : translate
-        },
-        ordinal : '%d.',
-        week : {
-            dow : 1, // Monday is the first day of the week.
-            doy : 4  // The week that contains Jan 4th is the first week of the year.
-        }
-    });
-}));
diff --git a/resources/moment/lang/sl.js b/resources/moment/lang/sl.js
deleted file mode 100644 (file)
index d260f80..0000000
+++ /dev/null
@@ -1,144 +0,0 @@
-// moment.js language configuration
-// language : slovenian (sl)
-// author : Robert Sedovšek : https://github.com/sedovsek
-
-(function (factory) {
-    if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory(window.moment); // Browser global
-    }
-}(function (moment) {
-    function translate(number, withoutSuffix, key) {
-        var result = number + " ";
-        switch (key) {
-        case 'm':
-            return withoutSuffix ? 'ena minuta' : 'eno minuto';
-        case 'mm':
-            if (number === 1) {
-                result += 'minuta';
-            } else if (number === 2) {
-                result += 'minuti';
-            } else if (number === 3 || number === 4) {
-                result += 'minute';
-            } else {
-                result += 'minut';
-            }
-            return result;
-        case 'h':
-            return withoutSuffix ? 'ena ura' : 'eno uro';
-        case 'hh':
-            if (number === 1) {
-                result += 'ura';
-            } else if (number === 2) {
-                result += 'uri';
-            } else if (number === 3 || number === 4) {
-                result += 'ure';
-            } else {
-                result += 'ur';
-            }
-            return result;
-        case 'dd':
-            if (number === 1) {
-                result += 'dan';
-            } else {
-                result += 'dni';
-            }
-            return result;
-        case 'MM':
-            if (number === 1) {
-                result += 'mesec';
-            } else if (number === 2) {
-                result += 'meseca';
-            } else if (number === 3 || number === 4) {
-                result += 'mesece';
-            } else {
-                result += 'mesecev';
-            }
-            return result;
-        case 'yy':
-            if (number === 1) {
-                result += 'leto';
-            } else if (number === 2) {
-                result += 'leti';
-            } else if (number === 3 || number === 4) {
-                result += 'leta';
-            } else {
-                result += 'let';
-            }
-            return result;
-        }
-    }
-
-    return moment.lang('sl', {
-        months : "januar_februar_marec_april_maj_junij_julij_avgust_september_oktober_november_december".split("_"),
-        monthsShort : "jan._feb._mar._apr._maj._jun._jul._avg._sep._okt._nov._dec.".split("_"),
-        weekdays : "nedelja_ponedeljek_torek_sreda_četrtek_petek_sobota".split("_"),
-        weekdaysShort : "ned._pon._tor._sre._čet._pet._sob.".split("_"),
-        weekdaysMin : "ne_po_to_sr_če_pe_so".split("_"),
-        longDateFormat : {
-            LT : "H:mm",
-            L : "DD. MM. YYYY",
-            LL : "D. MMMM YYYY",
-            LLL : "D. MMMM YYYY LT",
-            LLLL : "dddd, D. MMMM YYYY LT"
-        },
-        calendar : {
-            sameDay  : '[danes ob] LT',
-            nextDay  : '[jutri ob] LT',
-
-            nextWeek : function () {
-                switch (this.day()) {
-                case 0:
-                    return '[v] [nedeljo] [ob] LT';
-                case 3:
-                    return '[v] [sredo] [ob] LT';
-                case 6:
-                    return '[v] [soboto] [ob] LT';
-                case 1:
-                case 2:
-                case 4:
-                case 5:
-                    return '[v] dddd [ob] LT';
-                }
-            },
-            lastDay  : '[včeraj ob] LT',
-            lastWeek : function () {
-                switch (this.day()) {
-                case 0:
-                case 3:
-                case 6:
-                    return '[prejšnja] dddd [ob] LT';
-                case 1:
-                case 2:
-                case 4:
-                case 5:
-                    return '[prejšnji] dddd [ob] LT';
-                }
-            },
-            sameElse : 'L'
-        },
-        relativeTime : {
-            future : "čez %s",
-            past   : "%s nazaj",
-            s      : "nekaj sekund",
-            m      : translate,
-            mm     : translate,
-            h      : translate,
-            hh     : translate,
-            d      : "en dan",
-            dd     : translate,
-            M      : "en mesec",
-            MM     : translate,
-            y      : "eno leto",
-            yy     : translate
-        },
-        ordinal : '%d.',
-        week : {
-            dow : 1, // Monday is the first day of the week.
-            doy : 7  // The week that contains Jan 1st is the first week of the year.
-        }
-    });
-}));
diff --git a/resources/moment/lang/sq.js b/resources/moment/lang/sq.js
deleted file mode 100644 (file)
index a5e44b5..0000000
+++ /dev/null
@@ -1,57 +0,0 @@
-// moment.js language configuration
-// language : Albanian (sq)
-// author : Flakërim Ismani : https://github.com/flakerimi
-// author: Menelion Elensúle: https://github.com/Oire (tests)
-
-(function (factory) {
-    if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory(window.moment); // Browser global
-    }
-}(function (moment) {
-    return moment.lang('sq', {
-        months : "Janar_Shkurt_Mars_Prill_Maj_Qershor_Korrik_Gusht_Shtator_Tetor_Nëntor_Dhjetor".split("_"),
-        monthsShort : "Jan_Shk_Mar_Pri_Maj_Qer_Kor_Gus_Sht_Tet_Nën_Dhj".split("_"),
-        weekdays : "E Diel_E Hënë_E Marte_E Mërkure_E Enjte_E Premte_E Shtunë".split("_"),
-        weekdaysShort : "Die_Hën_Mar_Mër_Enj_Pre_Sht".split("_"),
-        weekdaysMin : "D_H_Ma_Më_E_P_Sh".split("_"),
-        longDateFormat : {
-            LT : "HH:mm",
-            L : "DD/MM/YYYY",
-            LL : "D MMMM YYYY",
-            LLL : "D MMMM YYYY LT",
-            LLLL : "dddd, D MMMM YYYY LT"
-        },
-        calendar : {
-            sameDay : '[Sot në] LT',
-            nextDay : '[Neser në] LT',
-            nextWeek : 'dddd [në] LT',
-            lastDay : '[Dje në] LT',
-            lastWeek : 'dddd [e kaluar në] LT',
-            sameElse : 'L'
-        },
-        relativeTime : {
-            future : "në %s",
-            past : "%s me parë",
-            s : "disa sekonda",
-            m : "një minut",
-            mm : "%d minuta",
-            h : "një orë",
-            hh : "%d orë",
-            d : "një ditë",
-            dd : "%d ditë",
-            M : "një muaj",
-            MM : "%d muaj",
-            y : "një vit",
-            yy : "%d vite"
-        },
-        ordinal : '%d.',
-        week : {
-            dow : 1, // Monday is the first day of the week.
-            doy : 4  // The week that contains Jan 4th is the first week of the year.
-        }
-    });
-}));
diff --git a/resources/moment/lang/sv.js b/resources/moment/lang/sv.js
deleted file mode 100644 (file)
index 0de8c40..0000000
+++ /dev/null
@@ -1,63 +0,0 @@
-// moment.js language configuration
-// language : swedish (sv)
-// author : Jens Alm : https://github.com/ulmus
-
-(function (factory) {
-    if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory(window.moment); // Browser global
-    }
-}(function (moment) {
-    return moment.lang('sv', {
-        months : "januari_februari_mars_april_maj_juni_juli_augusti_september_oktober_november_december".split("_"),
-        monthsShort : "jan_feb_mar_apr_maj_jun_jul_aug_sep_okt_nov_dec".split("_"),
-        weekdays : "söndag_måndag_tisdag_onsdag_torsdag_fredag_lördag".split("_"),
-        weekdaysShort : "sön_mån_tis_ons_tor_fre_lör".split("_"),
-        weekdaysMin : "sö_må_ti_on_to_fr_lö".split("_"),
-        longDateFormat : {
-            LT : "HH:mm",
-            L : "YYYY-MM-DD",
-            LL : "D MMMM YYYY",
-            LLL : "D MMMM YYYY LT",
-            LLLL : "dddd D MMMM YYYY LT"
-        },
-        calendar : {
-            sameDay: '[Idag] LT',
-            nextDay: '[Imorgon] LT',
-            lastDay: '[Igår] LT',
-            nextWeek: 'dddd LT',
-            lastWeek: '[Förra] dddd[en] LT',
-            sameElse: 'L'
-        },
-        relativeTime : {
-            future : "om %s",
-            past : "för %s sedan",
-            s : "några sekunder",
-            m : "en minut",
-            mm : "%d minuter",
-            h : "en timme",
-            hh : "%d timmar",
-            d : "en dag",
-            dd : "%d dagar",
-            M : "en månad",
-            MM : "%d månader",
-            y : "ett år",
-            yy : "%d år"
-        },
-        ordinal : function (number) {
-            var b = number % 10,
-                output = (~~ (number % 100 / 10) === 1) ? 'e' :
-                (b === 1) ? 'a' :
-                (b === 2) ? 'a' :
-                (b === 3) ? 'e' : 'e';
-            return number + output;
-        },
-        week : {
-            dow : 1, // Monday is the first day of the week.
-            doy : 4  // The week that contains Jan 4th is the first week of the year.
-        }
-    });
-}));
diff --git a/resources/moment/lang/ta.js b/resources/moment/lang/ta.js
deleted file mode 100644 (file)
index cc742c9..0000000
+++ /dev/null
@@ -1,112 +0,0 @@
-// moment.js language configuration
-// language : tamil (ta)
-// author : Arjunkumar Krishnamoorthy : https://github.com/tk120404
-
-(function (factory) {
-    if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory(window.moment); // Browser global
-    }
-}(function (moment) {
-    /*var symbolMap = {
-            '1': '௧',
-            '2': '௨',
-            '3': '௩',
-            '4': '௪',
-            '5': '௫',
-            '6': '௬',
-            '7': '௭',
-            '8': '௮',
-            '9': '௯',
-            '0': '௦'
-        },
-        numberMap = {
-            '௧': '1',
-            '௨': '2',
-            '௩': '3',
-            '௪': '4',
-            '௫': '5',
-            '௬': '6',
-            '௭': '7',
-            '௮': '8',
-            '௯': '9',
-            '௦': '0'
-        }; */
-
-    return moment.lang('ta', {
-        months : 'ஜனவரி_பிப்ரவரி_மார்ச்_ஏப்ரல்_மே_ஜூன்_ஜூலை_ஆகஸ்ட்_செப்டெம்பர்_அக்டோபர்_நவம்பர்_டிசம்பர்'.split("_"),
-        monthsShort : 'ஜனவரி_பிப்ரவரி_மார்ச்_ஏப்ரல்_மே_ஜூன்_ஜூலை_ஆகஸ்ட்_செப்டெம்பர்_அக்டோபர்_நவம்பர்_டிசம்பர்'.split("_"),
-        weekdays : 'ஞாயிற்றுக்கிழமை_திங்கட்கிழமை_செவ்வாய்கிழமை_புதன்கிழமை_வியாழக்கிழமை_வெள்ளிக்கிழமை_சனிக்கிழமை'.split("_"),
-        weekdaysShort : 'ஞாயிறு_திங்கள்_செவ்வாய்_புதன்_வியாழன்_வெள்ளி_சனி'.split("_"),
-        weekdaysMin : 'ஞா_தி_செ_பு_வி_வெ_ச'.split("_"),
-        longDateFormat : {
-            LT : "HH:mm",
-            L : "DD/MM/YYYY",
-            LL : "D MMMM YYYY",
-            LLL : "D MMMM YYYY, LT",
-            LLLL : "dddd, D MMMM YYYY, LT"
-        },
-        calendar : {
-            sameDay : '[இன்று] LT',
-            nextDay : '[நாளை] LT',
-            nextWeek : 'dddd, LT',
-            lastDay : '[நேற்று] LT',
-            lastWeek : '[கடந்த வாரம்] dddd, LT',
-            sameElse : 'L'
-        },
-        relativeTime : {
-            future : "%s இல்",
-            past : "%s முன்",
-            s : "ஒரு சில விநாடிகள்",
-            m : "ஒரு நிமிடம்",
-            mm : "%d நிமிடங்கள்",
-            h : "ஒரு மணி நேரம்",
-            hh : "%d மணி நேரம்",
-            d : "ஒரு நாள்",
-            dd : "%d நாட்கள்",
-            M : "ஒரு மாதம்",
-            MM : "%d மாதங்கள்",
-            y : "ஒரு வருடம்",
-            yy : "%d ஆண்டுகள்"
-        },
-/*        preparse: function (string) {
-            return string.replace(/[௧௨௩௪௫௬௭௮௯௦]/g, function (match) {
-                return numberMap[match];
-            });
-        },
-        postformat: function (string) {
-            return string.replace(/\d/g, function (match) {
-                return symbolMap[match];
-            });
-        },*/
-        ordinal : function (number) {
-            return number + 'வது';
-        },
-
-
-// refer http://ta.wikipedia.org/s/1er1      
-
-        meridiem : function (hour, minute, isLower) {
-            if (hour >= 6 && hour <= 10) {
-                return " காலை";
-            } else   if (hour >= 10 && hour <= 14) {
-                return " நண்பகல்";
-            } else    if (hour >= 14 && hour <= 18) {
-                return " எற்பாடு";
-            } else   if (hour >= 18 && hour <= 20) {
-                return " மாலை";
-            } else  if (hour >= 20 && hour <= 24) {
-                return " இரவு";
-            } else  if (hour >= 0 && hour <= 6) {
-                return " வைகறை";
-            }
-        },
-        week : {
-            dow : 0, // Sunday is the first day of the week.
-            doy : 6  // The week that contains Jan 1st is the first week of the year.
-        }
-    });
-}));
diff --git a/resources/moment/lang/th.js b/resources/moment/lang/th.js
deleted file mode 100644 (file)
index 70336c8..0000000
+++ /dev/null
@@ -1,58 +0,0 @@
-// moment.js language configuration
-// language : thai (th)
-// author : Kridsada Thanabulpong : https://github.com/sirn
-
-(function (factory) {
-    if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory(window.moment); // Browser global
-    }
-}(function (moment) {
-    return moment.lang('th', {
-        months : "มกราคม_กุมภาพันธ์_มีนาคม_เมษายน_พฤษภาคม_มิถุนายน_กรกฎาคม_สิงหาคม_กันยายน_ตุลาคม_พฤศจิกายน_ธันวาคม".split("_"),
-        monthsShort : "มกรา_กุมภา_มีนา_เมษา_พฤษภา_มิถุนา_กรกฎา_สิงหา_กันยา_ตุลา_พฤศจิกา_ธันวา".split("_"),
-        weekdays : "อาทิตย์_จันทร์_อังคาร_พุธ_พฤหัสบดี_ศุกร์_เสาร์".split("_"),
-        weekdaysShort : "อาทิตย์_จันทร์_อังคาร_พุธ_พฤหัส_ศุกร์_เสาร์".split("_"), // yes, three characters difference
-        weekdaysMin : "อา._จ._อ._พ._พฤ._ศ._ส.".split("_"),
-        longDateFormat : {
-            LT : "H นาฬิกา m นาที",
-            L : "YYYY/MM/DD",
-            LL : "D MMMM YYYY",
-            LLL : "D MMMM YYYY เวลา LT",
-            LLLL : "วันddddที่ D MMMM YYYY เวลา LT"
-        },
-        meridiem : function (hour, minute, isLower) {
-            if (hour < 12) {
-                return "ก่อนเที่ยง";
-            } else {
-                return "หลังเที่ยง";
-            }
-        },
-        calendar : {
-            sameDay : '[วันนี้ เวลา] LT',
-            nextDay : '[พรุ่งนี้ เวลา] LT',
-            nextWeek : 'dddd[หน้า เวลา] LT',
-            lastDay : '[เมื่อวานนี้ เวลา] LT',
-            lastWeek : '[วัน]dddd[ที่แล้ว เวลา] LT',
-            sameElse : 'L'
-        },
-        relativeTime : {
-            future : "อีก %s",
-            past : "%sที่แล้ว",
-            s : "ไม่กี่วินาที",
-            m : "1 นาที",
-            mm : "%d นาที",
-            h : "1 ชั่วโมง",
-            hh : "%d ชั่วโมง",
-            d : "1 วัน",
-            dd : "%d วัน",
-            M : "1 เดือน",
-            MM : "%d เดือน",
-            y : "1 ปี",
-            yy : "%d ปี"
-        }
-    });
-}));
diff --git a/resources/moment/lang/tl-ph.js b/resources/moment/lang/tl-ph.js
deleted file mode 100644 (file)
index 8044483..0000000
+++ /dev/null
@@ -1,58 +0,0 @@
-// moment.js language configuration
-// language : Tagalog/Filipino (tl-ph)
-// author : Dan Hagman
-
-(function (factory) {
-    if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory(window.moment); // Browser global
-    }
-}(function (moment) {
-    return moment.lang('tl-ph', {
-        months : "Enero_Pebrero_Marso_Abril_Mayo_Hunyo_Hulyo_Agosto_Setyembre_Oktubre_Nobyembre_Disyembre".split("_"),
-        monthsShort : "Ene_Peb_Mar_Abr_May_Hun_Hul_Ago_Set_Okt_Nob_Dis".split("_"),
-        weekdays : "Linggo_Lunes_Martes_Miyerkules_Huwebes_Biyernes_Sabado".split("_"),
-        weekdaysShort : "Lin_Lun_Mar_Miy_Huw_Biy_Sab".split("_"),
-        weekdaysMin : "Li_Lu_Ma_Mi_Hu_Bi_Sab".split("_"),
-        longDateFormat : {
-            LT : "HH:mm",
-            L : "MM/D/YYYY",
-            LL : "MMMM D, YYYY",
-            LLL : "MMMM D, YYYY LT",
-            LLLL : "dddd, MMMM DD, YYYY LT"
-        },
-        calendar : {
-            sameDay: "[Ngayon sa] LT",
-            nextDay: '[Bukas sa] LT',
-            nextWeek: 'dddd [sa] LT',
-            lastDay: '[Kahapon sa] LT',
-            lastWeek: 'dddd [huling linggo] LT',
-            sameElse: 'L'
-        },
-        relativeTime : {
-            future : "sa loob ng %s",
-            past : "%s ang nakalipas",
-            s : "ilang segundo",
-            m : "isang minuto",
-            mm : "%d minuto",
-            h : "isang oras",
-            hh : "%d oras",
-            d : "isang araw",
-            dd : "%d araw",
-            M : "isang buwan",
-            MM : "%d buwan",
-            y : "isang taon",
-            yy : "%d taon"
-        },
-        ordinal : function (number) {
-            return number;
-        },
-        week : {
-            dow : 1, // Monday is the first day of the week.
-            doy : 4  // The week that contains Jan 4th is the first week of the year.
-        }
-    });
-}));
diff --git a/resources/moment/lang/tr.js b/resources/moment/lang/tr.js
deleted file mode 100644 (file)
index e90f250..0000000
+++ /dev/null
@@ -1,93 +0,0 @@
-// moment.js language configuration
-// language : turkish (tr)
-// authors : Erhan Gundogan : https://github.com/erhangundogan,
-//           Burak Yiğit Kaya: https://github.com/BYK
-
-(function (factory) {
-    if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory(window.moment); // Browser global
-    }
-}(function (moment) {
-
-    var suffixes = {
-        1: "'inci",
-        5: "'inci",
-        8: "'inci",
-        70: "'inci",
-        80: "'inci",
-
-        2: "'nci",
-        7: "'nci",
-        20: "'nci",
-        50: "'nci",
-
-        3: "'üncü",
-        4: "'üncü",
-        100: "'üncü",
-
-        6: "'ncı",
-
-        9: "'uncu",
-        10: "'uncu",
-        30: "'uncu",
-
-        60: "'ıncı",
-        90: "'ıncı"
-    };
-
-    return moment.lang('tr', {
-        months : "Ocak_Şubat_Mart_Nisan_Mayıs_Haziran_Temmuz_Ağustos_Eylül_Ekim_Kasım_Aralık".split("_"),
-        monthsShort : "Oca_Şub_Mar_Nis_May_Haz_Tem_Ağu_Eyl_Eki_Kas_Ara".split("_"),
-        weekdays : "Pazar_Pazartesi_Salı_Çarşamba_Perşembe_Cuma_Cumartesi".split("_"),
-        weekdaysShort : "Paz_Pts_Sal_Çar_Per_Cum_Cts".split("_"),
-        weekdaysMin : "Pz_Pt_Sa_Ça_Pe_Cu_Ct".split("_"),
-        longDateFormat : {
-            LT : "HH:mm",
-            L : "DD.MM.YYYY",
-            LL : "D MMMM YYYY",
-            LLL : "D MMMM YYYY LT",
-            LLLL : "dddd, D MMMM YYYY LT"
-        },
-        calendar : {
-            sameDay : '[bugün saat] LT',
-            nextDay : '[yarın saat] LT',
-            nextWeek : '[haftaya] dddd [saat] LT',
-            lastDay : '[dün] LT',
-            lastWeek : '[geçen hafta] dddd [saat] LT',
-            sameElse : 'L'
-        },
-        relativeTime : {
-            future : "%s sonra",
-            past : "%s önce",
-            s : "birkaç saniye",
-            m : "bir dakika",
-            mm : "%d dakika",
-            h : "bir saat",
-            hh : "%d saat",
-            d : "bir gün",
-            dd : "%d gün",
-            M : "bir ay",
-            MM : "%d ay",
-            y : "bir yıl",
-            yy : "%d yıl"
-        },
-        ordinal : function (number) {
-            if (number === 0) {  // special case for zero
-                return number + "'ıncı";
-            }
-            var a = number % 10,
-                b = number % 100 - a,
-                c = number >= 100 ? 100 : null;
-
-            return number + (suffixes[a] || suffixes[b] || suffixes[c]);
-        },
-        week : {
-            dow : 1, // Monday is the first day of the week.
-            doy : 7  // The week that contains Jan 1st is the first week of the year.
-        }
-    });
-}));
diff --git a/resources/moment/lang/tzm-la.js b/resources/moment/lang/tzm-la.js
deleted file mode 100644 (file)
index be1d878..0000000
+++ /dev/null
@@ -1,55 +0,0 @@
-// moment.js language configuration
-// language : Morocco Central Atlas Tamaziɣt in Latin (tzm-la)
-// author : Abdel Said : https://github.com/abdelsaid
-
-(function (factory) {
-    if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory(window.moment); // Browser global
-    }
-}(function (moment) {
-    return moment.lang('tzm-la', {
-        months : "innayr_brˤayrˤ_marˤsˤ_ibrir_mayyw_ywnyw_ywlywz_ɣwšt_šwtanbir_ktˤwbrˤ_nwwanbir_dwjnbir".split("_"),
-        monthsShort : "innayr_brˤayrˤ_marˤsˤ_ibrir_mayyw_ywnyw_ywlywz_ɣwšt_šwtanbir_ktˤwbrˤ_nwwanbir_dwjnbir".split("_"),
-        weekdays : "asamas_aynas_asinas_akras_akwas_asimwas_asiḍyas".split("_"),
-        weekdaysShort : "asamas_aynas_asinas_akras_akwas_asimwas_asiḍyas".split("_"),
-        weekdaysMin : "asamas_aynas_asinas_akras_akwas_asimwas_asiḍyas".split("_"),
-        longDateFormat : {
-            LT : "HH:mm",
-            L : "DD/MM/YYYY",
-            LL : "D MMMM YYYY",
-            LLL : "D MMMM YYYY LT",
-            LLLL : "dddd D MMMM YYYY LT"
-        },
-        calendar : {
-            sameDay: "[asdkh g] LT",
-            nextDay: '[aska g] LT',
-            nextWeek: 'dddd [g] LT',
-            lastDay: '[assant g] LT',
-            lastWeek: 'dddd [g] LT',
-            sameElse: 'L'
-        },
-        relativeTime : {
-            future : "dadkh s yan %s",
-            past : "yan %s",
-            s : "imik",
-            m : "minuḍ",
-            mm : "%d minuḍ",
-            h : "saɛa",
-            hh : "%d tassaɛin",
-            d : "ass",
-            dd : "%d ossan",
-            M : "ayowr",
-            MM : "%d iyyirn",
-            y : "asgas",
-            yy : "%d isgasn"
-        },
-        week : {
-            dow : 6, // Saturday is the first day of the week.
-            doy : 12  // The week that contains Jan 1st is the first week of the year.
-        }
-    });
-}));
diff --git a/resources/moment/lang/tzm.js b/resources/moment/lang/tzm.js
deleted file mode 100644 (file)
index c7c76bd..0000000
+++ /dev/null
@@ -1,55 +0,0 @@
-// moment.js language configuration
-// language : Morocco Central Atlas Tamaziɣt (tzm)
-// author : Abdel Said : https://github.com/abdelsaid
-
-(function (factory) {
-    if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory(window.moment); // Browser global
-    }
-}(function (moment) {
-    return moment.lang('tzm', {
-        months : "ⵉⵏⵏⴰⵢⵔ_ⴱⵕⴰⵢⵕ_ⵎⴰⵕⵚ_ⵉⴱⵔⵉⵔ_ⵎⴰⵢⵢⵓ_ⵢⵓⵏⵢⵓ_ⵢⵓⵍⵢⵓⵣ_ⵖⵓⵛⵜ_ⵛⵓⵜⴰⵏⴱⵉⵔ_ⴽⵟⵓⴱⵕ_ⵏⵓⵡⴰⵏⴱⵉⵔ_ⴷⵓⵊⵏⴱⵉⵔ".split("_"),
-        monthsShort : "ⵉⵏⵏⴰⵢⵔ_ⴱⵕⴰⵢⵕ_ⵎⴰⵕⵚ_ⵉⴱⵔⵉⵔ_ⵎⴰⵢⵢⵓ_ⵢⵓⵏⵢⵓ_ⵢⵓⵍⵢⵓⵣ_ⵖⵓⵛⵜ_ⵛⵓⵜⴰⵏⴱⵉⵔ_ⴽⵟⵓⴱⵕ_ⵏⵓⵡⴰⵏⴱⵉⵔ_ⴷⵓⵊⵏⴱⵉⵔ".split("_"),
-        weekdays : "ⴰⵙⴰⵎⴰⵙ_ⴰⵢⵏⴰⵙ_ⴰⵙⵉⵏⴰⵙ_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ".split("_"),
-        weekdaysShort : "ⴰⵙⴰⵎⴰⵙ_ⴰⵢⵏⴰⵙ_ⴰⵙⵉⵏⴰⵙ_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ".split("_"),
-        weekdaysMin : "ⴰⵙⴰⵎⴰⵙ_ⴰⵢⵏⴰⵙ_ⴰⵙⵉⵏⴰⵙ_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ".split("_"),
-        longDateFormat : {
-            LT : "HH:mm",
-            L : "DD/MM/YYYY",
-            LL : "D MMMM YYYY",
-            LLL : "D MMMM YYYY LT",
-            LLLL : "dddd D MMMM YYYY LT"
-        },
-        calendar : {
-            sameDay: "[ⴰⵙⴷⵅ ⴴ] LT",
-            nextDay: '[ⴰⵙⴽⴰ ⴴ] LT',
-            nextWeek: 'dddd [ⴴ] LT',
-            lastDay: '[ⴰⵚⴰⵏⵜ ⴴ] LT',
-            lastWeek: 'dddd [ⴴ] LT',
-            sameElse: 'L'
-        },
-        relativeTime : {
-            future : "ⴷⴰⴷⵅ ⵙ ⵢⴰⵏ %s",
-            past : "ⵢⴰⵏ %s",
-            s : "ⵉⵎⵉⴽ",
-            m : "ⵎⵉⵏⵓⴺ",
-            mm : "%d ⵎⵉⵏⵓⴺ",
-            h : "ⵙⴰⵄⴰ",
-            hh : "%d ⵜⴰⵙⵙⴰⵄⵉⵏ",
-            d : "ⴰⵙⵙ",
-            dd : "%d oⵙⵙⴰⵏ",
-            M : "ⴰⵢoⵓⵔ",
-            MM : "%d ⵉⵢⵢⵉⵔⵏ",
-            y : "ⴰⵙⴳⴰⵙ",
-            yy : "%d ⵉⵙⴳⴰⵙⵏ"
-        },
-        week : {
-            dow : 6, // Saturday is the first day of the week.
-            doy : 12  // The week that contains Jan 1st is the first week of the year.
-        }
-    });
-}));
diff --git a/resources/moment/lang/uk.js b/resources/moment/lang/uk.js
deleted file mode 100644 (file)
index 47056cb..0000000
+++ /dev/null
@@ -1,157 +0,0 @@
-// moment.js language configuration
-// language : ukrainian (uk)
-// author : zemlanin : https://github.com/zemlanin
-// Author : Menelion Elensúle : https://github.com/Oire
-
-(function (factory) {
-    if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory(window.moment); // Browser global
-    }
-}(function (moment) {
-    function plural(word, num) {
-        var forms = word.split('_');
-        return num % 10 === 1 && num % 100 !== 11 ? forms[0] : (num % 10 >= 2 && num % 10 <= 4 && (num % 100 < 10 || num % 100 >= 20) ? forms[1] : forms[2]);
-    }
-
-    function relativeTimeWithPlural(number, withoutSuffix, key) {
-        var format = {
-            'mm': 'хвилина_хвилини_хвилин',
-            'hh': 'година_години_годин',
-            'dd': 'день_дні_днів',
-            'MM': 'місяць_місяці_місяців',
-            'yy': 'рік_роки_років'
-        };
-        if (key === 'm') {
-            return withoutSuffix ? 'хвилина' : 'хвилину';
-        }
-        else if (key === 'h') {
-            return withoutSuffix ? 'година' : 'годину';
-        }
-        else {
-            return number + ' ' + plural(format[key], +number);
-        }
-    }
-
-    function monthsCaseReplace(m, format) {
-        var months = {
-            'nominative': 'січень_лютий_березень_квітень_травень_червень_липень_серпень_вересень_жовтень_листопад_грудень'.split('_'),
-            'accusative': 'січня_лютого_березня_квітня_травня_червня_липня_серпня_вересня_жовтня_листопада_грудня'.split('_')
-        },
-
-        nounCase = (/D[oD]? *MMMM?/).test(format) ?
-            'accusative' :
-            'nominative';
-
-        return months[nounCase][m.month()];
-    }
-
-    function weekdaysCaseReplace(m, format) {
-        var weekdays = {
-            'nominative': 'неділя_понеділок_вівторок_середа_четвер_п’ятниця_субота'.split('_'),
-            'accusative': 'неділю_понеділок_вівторок_середу_четвер_п’ятницю_суботу'.split('_'),
-            'genitive': 'неділі_понеділка_вівторка_середи_четверга_п’ятниці_суботи'.split('_')
-        },
-
-        nounCase = (/(\[[ВвУу]\]) ?dddd/).test(format) ?
-            'accusative' :
-            ((/\[?(?:минулої|наступної)? ?\] ?dddd/).test(format) ?
-                'genitive' :
-                'nominative');
-
-        return weekdays[nounCase][m.day()];
-    }
-
-    function processHoursFunction(str) {
-        return function () {
-            return str + 'о' + (this.hours() === 11 ? 'б' : '') + '] LT';
-        };
-    }
-
-    return moment.lang('uk', {
-        months : monthsCaseReplace,
-        monthsShort : "січ_лют_бер_квіт_трав_черв_лип_серп_вер_жовт_лист_груд".split("_"),
-        weekdays : weekdaysCaseReplace,
-        weekdaysShort : "нд_пн_вт_ср_чт_пт_сб".split("_"),
-        weekdaysMin : "нд_пн_вт_ср_чт_пт_сб".split("_"),
-        longDateFormat : {
-            LT : "HH:mm",
-            L : "DD.MM.YYYY",
-            LL : "D MMMM YYYY р.",
-            LLL : "D MMMM YYYY р., LT",
-            LLLL : "dddd, D MMMM YYYY р., LT"
-        },
-        calendar : {
-            sameDay: processHoursFunction('[Сьогодні '),
-            nextDay: processHoursFunction('[Завтра '),
-            lastDay: processHoursFunction('[Вчора '),
-            nextWeek: processHoursFunction('[У] dddd ['),
-            lastWeek: function () {
-                switch (this.day()) {
-                case 0:
-                case 3:
-                case 5:
-                case 6:
-                    return processHoursFunction('[Минулої] dddd [').call(this);
-                case 1:
-                case 2:
-                case 4:
-                    return processHoursFunction('[Минулого] dddd [').call(this);
-                }
-            },
-            sameElse: 'L'
-        },
-        relativeTime : {
-            future : "за %s",
-            past : "%s тому",
-            s : "декілька секунд",
-            m : relativeTimeWithPlural,
-            mm : relativeTimeWithPlural,
-            h : "годину",
-            hh : relativeTimeWithPlural,
-            d : "день",
-            dd : relativeTimeWithPlural,
-            M : "місяць",
-            MM : relativeTimeWithPlural,
-            y : "рік",
-            yy : relativeTimeWithPlural
-        },
-
-        // M. E.: those two are virtually unused but a user might want to implement them for his/her website for some reason
-
-        meridiem : function (hour, minute, isLower) {
-            if (hour < 4) {
-                return "ночі";
-            } else if (hour < 12) {
-                return "ранку";
-            } else if (hour < 17) {
-                return "дня";
-            } else {
-                return "вечора";
-            }
-        },
-
-        ordinal: function (number, period) {
-            switch (period) {
-            case 'M':
-            case 'd':
-            case 'DDD':
-            case 'w':
-            case 'W':
-                return number + '-й';
-            case 'D':
-                return number + '-го';
-            default:
-                return number;
-            }
-        },
-
-        week : {
-            dow : 1, // Monday is the first day of the week.
-            doy : 7  // The week that contains Jan 1st is the first week of the year.
-        }
-    });
-}));
diff --git a/resources/moment/lang/uz.js b/resources/moment/lang/uz.js
deleted file mode 100644 (file)
index a5b06fa..0000000
+++ /dev/null
@@ -1,55 +0,0 @@
-// moment.js language configuration
-// language : uzbek
-// author : Sardor Muminov : https://github.com/muminoff
-
-(function (factory) {
-    if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory(window.moment); // Browser global
-    }
-}(function (moment) {
-    return moment.lang('uz', {
-        months : "январь_февраль_март_апрель_май_июнь_июль_август_сентябрь_октябрь_ноябрь_декабрь".split("_"),
-        monthsShort : "янв_фев_мар_апр_май_июн_июл_авг_сен_окт_ноя_дек".split("_"),
-        weekdays : "Якшанба_Душанба_Сешанба_Чоршанба_Пайшанба_Жума_Шанба".split("_"),
-        weekdaysShort : "Якш_Душ_Сеш_Чор_Пай_Жум_Шан".split("_"),
-        weekdaysMin : "Як_Ду_Се_Чо_Па_Жу_Ша".split("_"),
-        longDateFormat : {
-            LT : "HH:mm",
-            L : "DD/MM/YYYY",
-            LL : "D MMMM YYYY",
-            LLL : "D MMMM YYYY LT",
-            LLLL : "D MMMM YYYY, dddd LT"
-        },
-        calendar : {
-            sameDay : '[Бугун соат] LT [да]',
-            nextDay : '[Эртага] LT [да]',
-            nextWeek : 'dddd [куни соат] LT [да]',
-            lastDay : '[Кеча соат] LT [да]',
-            lastWeek : '[Утган] dddd [куни соат] LT [да]',
-            sameElse : 'L'
-        },
-        relativeTime : {
-            future : "Якин %s ичида",
-            past : "Бир неча %s олдин",
-            s : "фурсат",
-            m : "бир дакика",
-            mm : "%d дакика",
-            h : "бир соат",
-            hh : "%d соат",
-            d : "бир кун",
-            dd : "%d кун",
-            M : "бир ой",
-            MM : "%d ой",
-            y : "бир йил",
-            yy : "%d йил"
-        },
-        week : {
-            dow : 1, // Monday is the first day of the week.
-            doy : 7  // The week that contains Jan 4th is the first week of the year.
-        }
-    });
-}));
diff --git a/resources/moment/lang/vn.js b/resources/moment/lang/vn.js
deleted file mode 100644 (file)
index f28e7c3..0000000
+++ /dev/null
@@ -1,62 +0,0 @@
-// moment.js language configuration
-// language : vietnamese (vn)
-// author : Bang Nguyen : https://github.com/bangnk
-
-(function (factory) {
-    if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory(window.moment); // Browser global
-    }
-}(function (moment) {
-    return moment.lang('vn', {
-        months : "tháng 1_tháng 2_tháng 3_tháng 4_tháng 5_tháng 6_tháng 7_tháng 8_tháng 9_tháng 10_tháng 11_tháng 12".split("_"),
-        monthsShort : "Th01_Th02_Th03_Th04_Th05_Th06_Th07_Th08_Th09_Th10_Th11_Th12".split("_"),
-        weekdays : "chủ nhật_thứ hai_thứ ba_thứ tư_thứ năm_thứ sáu_thứ bảy".split("_"),
-        weekdaysShort : "CN_T2_T3_T4_T5_T6_T7".split("_"),
-        weekdaysMin : "CN_T2_T3_T4_T5_T6_T7".split("_"),
-        longDateFormat : {
-            LT : "HH:mm",
-            L : "DD/MM/YYYY",
-            LL : "D MMMM [năm] YYYY",
-            LLL : "D MMMM [năm] YYYY LT",
-            LLLL : "dddd, D MMMM [năm] YYYY LT",
-            l : "DD/M/YYYY",
-            ll : "D MMM YYYY",
-            lll : "D MMM YYYY LT",
-            llll : "ddd, D MMM YYYY LT"
-        },
-        calendar : {
-            sameDay: "[Hôm nay lúc] LT",
-            nextDay: '[Ngày mai lúc] LT',
-            nextWeek: 'dddd [tuần tới lúc] LT',
-            lastDay: '[Hôm qua lúc] LT',
-            lastWeek: 'dddd [tuần rồi lúc] LT',
-            sameElse: 'L'
-        },
-        relativeTime : {
-            future : "%s tới",
-            past : "%s trước",
-            s : "vài giây",
-            m : "một phút",
-            mm : "%d phút",
-            h : "một giờ",
-            hh : "%d giờ",
-            d : "một ngày",
-            dd : "%d ngày",
-            M : "một tháng",
-            MM : "%d tháng",
-            y : "một năm",
-            yy : "%d năm"
-        },
-        ordinal : function (number) {
-            return number;
-        },
-        week : {
-            dow : 1, // Monday is the first day of the week.
-            doy : 4  // The week that contains Jan 4th is the first week of the year.
-        }
-    });
-}));
diff --git a/resources/moment/lang/zh-cn.js b/resources/moment/lang/zh-cn.js
deleted file mode 100644 (file)
index 50a3ed9..0000000
+++ /dev/null
@@ -1,108 +0,0 @@
-// moment.js language configuration
-// language : chinese
-// author : suupic : https://github.com/suupic
-// author : Zeno Zeng : https://github.com/zenozeng
-
-(function (factory) {
-    if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory(window.moment); // Browser global
-    }
-}(function (moment) {
-    return moment.lang('zh-cn', {
-        months : "一月_二月_三月_四月_五月_六月_七月_八月_九月_十月_十一月_十二月".split("_"),
-        monthsShort : "1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月".split("_"),
-        weekdays : "星期日_星期一_星期二_星期三_星期四_星期五_星期六".split("_"),
-        weekdaysShort : "周日_周一_周二_周三_周四_周五_周六".split("_"),
-        weekdaysMin : "日_一_二_三_四_五_六".split("_"),
-        longDateFormat : {
-            LT : "Ah点mm",
-            L : "YYYY-MM-DD",
-            LL : "YYYY年MMMD日",
-            LLL : "YYYY年MMMD日LT",
-            LLLL : "YYYY年MMMD日ddddLT",
-            l : "YYYY-MM-DD",
-            ll : "YYYY年MMMD日",
-            lll : "YYYY年MMMD日LT",
-            llll : "YYYY年MMMD日ddddLT"
-        },
-        meridiem : function (hour, minute, isLower) {
-            var hm = hour * 100 + minute;
-            if (hm < 600) {
-                return "凌晨";
-            } else if (hm < 900) {
-                return "早上";
-            } else if (hm < 1130) {
-                return "上午";
-            } else if (hm < 1230) {
-                return "中午";
-            } else if (hm < 1800) {
-                return "下午";
-            } else {
-                return "晚上";
-            }
-        },
-        calendar : {
-            sameDay : function () {
-                return this.minutes() === 0 ? "[今天]Ah[点整]" : "[今天]LT";
-            },
-            nextDay : function () {
-                return this.minutes() === 0 ? "[明天]Ah[点整]" : "[明天]LT";
-            },
-            lastDay : function () {
-                return this.minutes() === 0 ? "[昨天]Ah[点整]" : "[昨天]LT";
-            },
-            nextWeek : function () {
-                var startOfWeek, prefix;
-                startOfWeek = moment().startOf('week');
-                prefix = this.unix() - startOfWeek.unix() >= 7 * 24 * 3600 ? '[下]' : '[本]';
-                return this.minutes() === 0 ? prefix + "dddAh点整" : prefix + "dddAh点mm";
-            },
-            lastWeek : function () {
-                var startOfWeek, prefix;
-                startOfWeek = moment().startOf('week');
-                prefix = this.unix() < startOfWeek.unix()  ? '[上]' : '[本]';
-                return this.minutes() === 0 ? prefix + "dddAh点整" : prefix + "dddAh点mm";
-            },
-            sameElse : 'LL'
-        },
-        ordinal : function (number, period) {
-            switch (period) {
-            case "d":
-            case "D":
-            case "DDD":
-                return number + "日";
-            case "M":
-                return number + "月";
-            case "w":
-            case "W":
-                return number + "周";
-            default:
-                return number;
-            }
-        },
-        relativeTime : {
-            future : "%s内",
-            past : "%s前",
-            s : "几秒",
-            m : "1分钟",
-            mm : "%d分钟",
-            h : "1小时",
-            hh : "%d小时",
-            d : "1天",
-            dd : "%d天",
-            M : "1个月",
-            MM : "%d个月",
-            y : "1年",
-            yy : "%d年"
-        },
-        week : {
-            // GB/T 7408-1994《数据元和交换格式·信息交换·日期和时间表示法》与ISO 8601:1988等效
-            dow : 1, // Monday is the first day of the week.
-            doy : 4  // The week that contains Jan 4th is the first week of the year.
-        }
-    });
-}));
diff --git a/resources/moment/lang/zh-tw.js b/resources/moment/lang/zh-tw.js
deleted file mode 100644 (file)
index bbb0737..0000000
+++ /dev/null
@@ -1,84 +0,0 @@
-// moment.js language configuration
-// language : traditional chinese (zh-tw)
-// author : Ben : https://github.com/ben-lin
-
-(function (factory) {
-    if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory(window.moment); // Browser global
-    }
-}(function (moment) {
-    return moment.lang('zh-tw', {
-        months : "一月_二月_三月_四月_五月_六月_七月_八月_九月_十月_十一月_十二月".split("_"),
-        monthsShort : "1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月".split("_"),
-        weekdays : "星期日_星期一_星期二_星期三_星期四_星期五_星期六".split("_"),
-        weekdaysShort : "週日_週一_週二_週三_週四_週五_週六".split("_"),
-        weekdaysMin : "日_一_二_三_四_五_六".split("_"),
-        longDateFormat : {
-            LT : "Ah點mm",
-            L : "YYYY年MMMD日",
-            LL : "YYYY年MMMD日",
-            LLL : "YYYY年MMMD日LT",
-            LLLL : "YYYY年MMMD日ddddLT",
-            l : "YYYY年MMMD日",
-            ll : "YYYY年MMMD日",
-            lll : "YYYY年MMMD日LT",
-            llll : "YYYY年MMMD日ddddLT"
-        },
-        meridiem : function (hour, minute, isLower) {
-            var hm = hour * 100 + minute;
-            if (hm < 900) {
-                return "早上";
-            } else if (hm < 1130) {
-                return "上午";
-            } else if (hm < 1230) {
-                return "中午";
-            } else if (hm < 1800) {
-                return "下午";
-            } else {
-                return "晚上";
-            }
-        },
-        calendar : {
-            sameDay : '[今天]LT',
-            nextDay : '[明天]LT',
-            nextWeek : '[下]ddddLT',
-            lastDay : '[昨天]LT',
-            lastWeek : '[上]ddddLT',
-            sameElse : 'L'
-        },
-        ordinal : function (number, period) {
-            switch (period) {
-            case "d" :
-            case "D" :
-            case "DDD" :
-                return number + "日";
-            case "M" :
-                return number + "月";
-            case "w" :
-            case "W" :
-                return number + "週";
-            default :
-                return number;
-            }
-        },
-        relativeTime : {
-            future : "%s內",
-            past : "%s前",
-            s : "幾秒",
-            m : "一分鐘",
-            mm : "%d分鐘",
-            h : "一小時",
-            hh : "%d小時",
-            d : "一天",
-            dd : "%d天",
-            M : "一個月",
-            MM : "%d個月",
-            y : "一年",
-            yy : "%d年"
-        }
-    });
-}));
diff --git a/resources/moment/moment.js b/resources/moment/moment.js
deleted file mode 100644 (file)
index b79da7f..0000000
+++ /dev/null
@@ -1,2400 +0,0 @@
-//! moment.js
-//! version : 2.5.1
-//! authors : Tim Wood, Iskren Chernev, Moment.js contributors
-//! license : MIT
-//! momentjs.com
-
-(function (undefined) {
-
-    /************************************
-        Constants
-    ************************************/
-
-    var moment,
-        VERSION = "2.5.1",
-        global = this,
-        round = Math.round,
-        i,
-
-        YEAR = 0,
-        MONTH = 1,
-        DATE = 2,
-        HOUR = 3,
-        MINUTE = 4,
-        SECOND = 5,
-        MILLISECOND = 6,
-
-        // internal storage for language config files
-        languages = {},
-
-        // moment internal properties
-        momentProperties = {
-            _isAMomentObject: null,
-            _i : null,
-            _f : null,
-            _l : null,
-            _strict : null,
-            _isUTC : null,
-            _offset : null,  // optional. Combine with _isUTC
-            _pf : null,
-            _lang : null  // optional
-        },
-
-        // check for nodeJS
-        hasModule = (typeof module !== 'undefined' && module.exports && typeof require !== 'undefined'),
-
-        // ASP.NET json date format regex
-        aspNetJsonRegex = /^\/?Date\((\-?\d+)/i,
-        aspNetTimeSpanJsonRegex = /(\-)?(?:(\d*)\.)?(\d+)\:(\d+)(?:\:(\d+)\.?(\d{3})?)?/,
-
-        // from http://docs.closure-library.googlecode.com/git/closure_goog_date_date.js.source.html
-        // somewhat more in line with 4.4.3.2 2004 spec, but allows decimal anywhere
-        isoDurationRegex = /^(-)?P(?:(?:([0-9,.]*)Y)?(?:([0-9,.]*)M)?(?:([0-9,.]*)D)?(?:T(?:([0-9,.]*)H)?(?:([0-9,.]*)M)?(?:([0-9,.]*)S)?)?|([0-9,.]*)W)$/,
-
-        // format tokens
-        formattingTokens = /(\[[^\[]*\])|(\\)?(Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|YYYYYY|YYYYY|YYYY|YY|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|mm?|ss?|S{1,4}|X|zz?|ZZ?|.)/g,
-        localFormattingTokens = /(\[[^\[]*\])|(\\)?(LT|LL?L?L?|l{1,4})/g,
-
-        // parsing token regexes
-        parseTokenOneOrTwoDigits = /\d\d?/, // 0 - 99
-        parseTokenOneToThreeDigits = /\d{1,3}/, // 0 - 999
-        parseTokenOneToFourDigits = /\d{1,4}/, // 0 - 9999
-        parseTokenOneToSixDigits = /[+\-]?\d{1,6}/, // -999,999 - 999,999
-        parseTokenDigits = /\d+/, // nonzero number of digits
-        parseTokenWord = /[0-9]*['a-z\u00A0-\u05FF\u0700-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]+|[\u0600-\u06FF\/]+(\s*?[\u0600-\u06FF]+){1,2}/i, // any word (or two) characters or numbers including two/three word month in arabic.
-        parseTokenTimezone = /Z|[\+\-]\d\d:?\d\d/gi, // +00:00 -00:00 +0000 -0000 or Z
-        parseTokenT = /T/i, // T (ISO separator)
-        parseTokenTimestampMs = /[\+\-]?\d+(\.\d{1,3})?/, // 123456789 123456789.123
-
-        //strict parsing regexes
-        parseTokenOneDigit = /\d/, // 0 - 9
-        parseTokenTwoDigits = /\d\d/, // 00 - 99
-        parseTokenThreeDigits = /\d{3}/, // 000 - 999
-        parseTokenFourDigits = /\d{4}/, // 0000 - 9999
-        parseTokenSixDigits = /[+-]?\d{6}/, // -999,999 - 999,999
-        parseTokenSignedNumber = /[+-]?\d+/, // -inf - inf
-
-        // iso 8601 regex
-        // 0000-00-00 0000-W00 or 0000-W00-0 + T + 00 or 00:00 or 00:00:00 or 00:00:00.000 + +00:00 or +0000 or +00)
-        isoRegex = /^\s*(?:[+-]\d{6}|\d{4})-(?:(\d\d-\d\d)|(W\d\d$)|(W\d\d-\d)|(\d\d\d))((T| )(\d\d(:\d\d(:\d\d(\.\d+)?)?)?)?([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/,
-
-        isoFormat = 'YYYY-MM-DDTHH:mm:ssZ',
-
-        isoDates = [
-            ['YYYYYY-MM-DD', /[+-]\d{6}-\d{2}-\d{2}/],
-            ['YYYY-MM-DD', /\d{4}-\d{2}-\d{2}/],
-            ['GGGG-[W]WW-E', /\d{4}-W\d{2}-\d/],
-            ['GGGG-[W]WW', /\d{4}-W\d{2}/],
-            ['YYYY-DDD', /\d{4}-\d{3}/]
-        ],
-
-        // iso time formats and regexes
-        isoTimes = [
-            ['HH:mm:ss.SSSS', /(T| )\d\d:\d\d:\d\d\.\d{1,3}/],
-            ['HH:mm:ss', /(T| )\d\d:\d\d:\d\d/],
-            ['HH:mm', /(T| )\d\d:\d\d/],
-            ['HH', /(T| )\d\d/]
-        ],
-
-        // timezone chunker "+10:00" > ["10", "00"] or "-1530" > ["-15", "30"]
-        parseTimezoneChunker = /([\+\-]|\d\d)/gi,
-
-        // getter and setter names
-        proxyGettersAndSetters = 'Date|Hours|Minutes|Seconds|Milliseconds'.split('|'),
-        unitMillisecondFactors = {
-            'Milliseconds' : 1,
-            'Seconds' : 1e3,
-            'Minutes' : 6e4,
-            'Hours' : 36e5,
-            'Days' : 864e5,
-            'Months' : 2592e6,
-            'Years' : 31536e6
-        },
-
-        unitAliases = {
-            ms : 'millisecond',
-            s : 'second',
-            m : 'minute',
-            h : 'hour',
-            d : 'day',
-            D : 'date',
-            w : 'week',
-            W : 'isoWeek',
-            M : 'month',
-            y : 'year',
-            DDD : 'dayOfYear',
-            e : 'weekday',
-            E : 'isoWeekday',
-            gg: 'weekYear',
-            GG: 'isoWeekYear'
-        },
-
-        camelFunctions = {
-            dayofyear : 'dayOfYear',
-            isoweekday : 'isoWeekday',
-            isoweek : 'isoWeek',
-            weekyear : 'weekYear',
-            isoweekyear : 'isoWeekYear'
-        },
-
-        // format function strings
-        formatFunctions = {},
-
-        // tokens to ordinalize and pad
-        ordinalizeTokens = 'DDD w W M D d'.split(' '),
-        paddedTokens = 'M D H h m s w W'.split(' '),
-
-        formatTokenFunctions = {
-            M    : function () {
-                return this.month() + 1;
-            },
-            MMM  : function (format) {
-                return this.lang().monthsShort(this, format);
-            },
-            MMMM : function (format) {
-                return this.lang().months(this, format);
-            },
-            D    : function () {
-                return this.date();
-            },
-            DDD  : function () {
-                return this.dayOfYear();
-            },
-            d    : function () {
-                return this.day();
-            },
-            dd   : function (format) {
-                return this.lang().weekdaysMin(this, format);
-            },
-            ddd  : function (format) {
-                return this.lang().weekdaysShort(this, format);
-            },
-            dddd : function (format) {
-                return this.lang().weekdays(this, format);
-            },
-            w    : function () {
-                return this.week();
-            },
-            W    : function () {
-                return this.isoWeek();
-            },
-            YY   : function () {
-                return leftZeroFill(this.year() % 100, 2);
-            },
-            YYYY : function () {
-                return leftZeroFill(this.year(), 4);
-            },
-            YYYYY : function () {
-                return leftZeroFill(this.year(), 5);
-            },
-            YYYYYY : function () {
-                var y = this.year(), sign = y >= 0 ? '+' : '-';
-                return sign + leftZeroFill(Math.abs(y), 6);
-            },
-            gg   : function () {
-                return leftZeroFill(this.weekYear() % 100, 2);
-            },
-            gggg : function () {
-                return leftZeroFill(this.weekYear(), 4);
-            },
-            ggggg : function () {
-                return leftZeroFill(this.weekYear(), 5);
-            },
-            GG   : function () {
-                return leftZeroFill(this.isoWeekYear() % 100, 2);
-            },
-            GGGG : function () {
-                return leftZeroFill(this.isoWeekYear(), 4);
-            },
-            GGGGG : function () {
-                return leftZeroFill(this.isoWeekYear(), 5);
-            },
-            e : function () {
-                return this.weekday();
-            },
-            E : function () {
-                return this.isoWeekday();
-            },
-            a    : function () {
-                return this.lang().meridiem(this.hours(), this.minutes(), true);
-            },
-            A    : function () {
-                return this.lang().meridiem(this.hours(), this.minutes(), false);
-            },
-            H    : function () {
-                return this.hours();
-            },
-            h    : function () {
-                return this.hours() % 12 || 12;
-            },
-            m    : function () {
-                return this.minutes();
-            },
-            s    : function () {
-                return this.seconds();
-            },
-            S    : function () {
-                return toInt(this.milliseconds() / 100);
-            },
-            SS   : function () {
-                return leftZeroFill(toInt(this.milliseconds() / 10), 2);
-            },
-            SSS  : function () {
-                return leftZeroFill(this.milliseconds(), 3);
-            },
-            SSSS : function () {
-                return leftZeroFill(this.milliseconds(), 3);
-            },
-            Z    : function () {
-                var a = -this.zone(),
-                    b = "+";
-                if (a < 0) {
-                    a = -a;
-                    b = "-";
-                }
-                return b + leftZeroFill(toInt(a / 60), 2) + ":" + leftZeroFill(toInt(a) % 60, 2);
-            },
-            ZZ   : function () {
-                var a = -this.zone(),
-                    b = "+";
-                if (a < 0) {
-                    a = -a;
-                    b = "-";
-                }
-                return b + leftZeroFill(toInt(a / 60), 2) + leftZeroFill(toInt(a) % 60, 2);
-            },
-            z : function () {
-                return this.zoneAbbr();
-            },
-            zz : function () {
-                return this.zoneName();
-            },
-            X    : function () {
-                return this.unix();
-            },
-            Q : function () {
-                return this.quarter();
-            }
-        },
-
-        lists = ['months', 'monthsShort', 'weekdays', 'weekdaysShort', 'weekdaysMin'];
-
-    function defaultParsingFlags() {
-        // We need to deep clone this object, and es5 standard is not very
-        // helpful.
-        return {
-            empty : false,
-            unusedTokens : [],
-            unusedInput : [],
-            overflow : -2,
-            charsLeftOver : 0,
-            nullInput : false,
-            invalidMonth : null,
-            invalidFormat : false,
-            userInvalidated : false,
-            iso: false
-        };
-    }
-
-    function padToken(func, count) {
-        return function (a) {
-            return leftZeroFill(func.call(this, a), count);
-        };
-    }
-    function ordinalizeToken(func, period) {
-        return function (a) {
-            return this.lang().ordinal(func.call(this, a), period);
-        };
-    }
-
-    while (ordinalizeTokens.length) {
-        i = ordinalizeTokens.pop();
-        formatTokenFunctions[i + 'o'] = ordinalizeToken(formatTokenFunctions[i], i);
-    }
-    while (paddedTokens.length) {
-        i = paddedTokens.pop();
-        formatTokenFunctions[i + i] = padToken(formatTokenFunctions[i], 2);
-    }
-    formatTokenFunctions.DDDD = padToken(formatTokenFunctions.DDD, 3);
-
-
-    /************************************
-        Constructors
-    ************************************/
-
-    function Language() {
-
-    }
-
-    // Moment prototype object
-    function Moment(config) {
-        checkOverflow(config);
-        extend(this, config);
-    }
-
-    // Duration Constructor
-    function Duration(duration) {
-        var normalizedInput = normalizeObjectUnits(duration),
-            years = normalizedInput.year || 0,
-            months = normalizedInput.month || 0,
-            weeks = normalizedInput.week || 0,
-            days = normalizedInput.day || 0,
-            hours = normalizedInput.hour || 0,
-            minutes = normalizedInput.minute || 0,
-            seconds = normalizedInput.second || 0,
-            milliseconds = normalizedInput.millisecond || 0;
-
-        // representation for dateAddRemove
-        this._milliseconds = +milliseconds +
-            seconds * 1e3 + // 1000
-            minutes * 6e4 + // 1000 * 60
-            hours * 36e5; // 1000 * 60 * 60
-        // Because of dateAddRemove treats 24 hours as different from a
-        // day when working around DST, we need to store them separately
-        this._days = +days +
-            weeks * 7;
-        // It is impossible translate months into days without knowing
-        // which months you are are talking about, so we have to store
-        // it separately.
-        this._months = +months +
-            years * 12;
-
-        this._data = {};
-
-        this._bubble();
-    }
-
-    /************************************
-        Helpers
-    ************************************/
-
-
-    function extend(a, b) {
-        for (var i in b) {
-            if (b.hasOwnProperty(i)) {
-                a[i] = b[i];
-            }
-        }
-
-        if (b.hasOwnProperty("toString")) {
-            a.toString = b.toString;
-        }
-
-        if (b.hasOwnProperty("valueOf")) {
-            a.valueOf = b.valueOf;
-        }
-
-        return a;
-    }
-
-    function cloneMoment(m) {
-        var result = {}, i;
-        for (i in m) {
-            if (m.hasOwnProperty(i) && momentProperties.hasOwnProperty(i)) {
-                result[i] = m[i];
-            }
-        }
-
-        return result;
-    }
-
-    function absRound(number) {
-        if (number < 0) {
-            return Math.ceil(number);
-        } else {
-            return Math.floor(number);
-        }
-    }
-
-    // left zero fill a number
-    // see http://jsperf.com/left-zero-filling for performance comparison
-    function leftZeroFill(number, targetLength, forceSign) {
-        var output = '' + Math.abs(number),
-            sign = number >= 0;
-
-        while (output.length < targetLength) {
-            output = '0' + output;
-        }
-        return (sign ? (forceSign ? '+' : '') : '-') + output;
-    }
-
-    // helper function for _.addTime and _.subtractTime
-    function addOrSubtractDurationFromMoment(mom, duration, isAdding, ignoreUpdateOffset) {
-        var milliseconds = duration._milliseconds,
-            days = duration._days,
-            months = duration._months,
-            minutes,
-            hours;
-
-        if (milliseconds) {
-            mom._d.setTime(+mom._d + milliseconds * isAdding);
-        }
-        // store the minutes and hours so we can restore them
-        if (days || months) {
-            minutes = mom.minute();
-            hours = mom.hour();
-        }
-        if (days) {
-            mom.date(mom.date() + days * isAdding);
-        }
-        if (months) {
-            mom.month(mom.month() + months * isAdding);
-        }
-        if (milliseconds && !ignoreUpdateOffset) {
-            moment.updateOffset(mom);
-        }
-        // restore the minutes and hours after possibly changing dst
-        if (days || months) {
-            mom.minute(minutes);
-            mom.hour(hours);
-        }
-    }
-
-    // check if is an array
-    function isArray(input) {
-        return Object.prototype.toString.call(input) === '[object Array]';
-    }
-
-    function isDate(input) {
-        return  Object.prototype.toString.call(input) === '[object Date]' ||
-                input instanceof Date;
-    }
-
-    // compare two arrays, return the number of differences
-    function compareArrays(array1, array2, dontConvert) {
-        var len = Math.min(array1.length, array2.length),
-            lengthDiff = Math.abs(array1.length - array2.length),
-            diffs = 0,
-            i;
-        for (i = 0; i < len; i++) {
-            if ((dontConvert && array1[i] !== array2[i]) ||
-                (!dontConvert && toInt(array1[i]) !== toInt(array2[i]))) {
-                diffs++;
-            }
-        }
-        return diffs + lengthDiff;
-    }
-
-    function normalizeUnits(units) {
-        if (units) {
-            var lowered = units.toLowerCase().replace(/(.)s$/, '$1');
-            units = unitAliases[units] || camelFunctions[lowered] || lowered;
-        }
-        return units;
-    }
-
-    function normalizeObjectUnits(inputObject) {
-        var normalizedInput = {},
-            normalizedProp,
-            prop;
-
-        for (prop in inputObject) {
-            if (inputObject.hasOwnProperty(prop)) {
-                normalizedProp = normalizeUnits(prop);
-                if (normalizedProp) {
-                    normalizedInput[normalizedProp] = inputObject[prop];
-                }
-            }
-        }
-
-        return normalizedInput;
-    }
-
-    function makeList(field) {
-        var count, setter;
-
-        if (field.indexOf('week') === 0) {
-            count = 7;
-            setter = 'day';
-        }
-        else if (field.indexOf('month') === 0) {
-            count = 12;
-            setter = 'month';
-        }
-        else {
-            return;
-        }
-
-        moment[field] = function (format, index) {
-            var i, getter,
-                method = moment.fn._lang[field],
-                results = [];
-
-            if (typeof format === 'number') {
-                index = format;
-                format = undefined;
-            }
-
-            getter = function (i) {
-                var m = moment().utc().set(setter, i);
-                return method.call(moment.fn._lang, m, format || '');
-            };
-
-            if (index != null) {
-                return getter(index);
-            }
-            else {
-                for (i = 0; i < count; i++) {
-                    results.push(getter(i));
-                }
-                return results;
-            }
-        };
-    }
-
-    function toInt(argumentForCoercion) {
-        var coercedNumber = +argumentForCoercion,
-            value = 0;
-
-        if (coercedNumber !== 0 && isFinite(coercedNumber)) {
-            if (coercedNumber >= 0) {
-                value = Math.floor(coercedNumber);
-            } else {
-                value = Math.ceil(coercedNumber);
-            }
-        }
-
-        return value;
-    }
-
-    function daysInMonth(year, month) {
-        return new Date(Date.UTC(year, month + 1, 0)).getUTCDate();
-    }
-
-    function daysInYear(year) {
-        return isLeapYear(year) ? 366 : 365;
-    }
-
-    function isLeapYear(year) {
-        return (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0;
-    }
-
-    function checkOverflow(m) {
-        var overflow;
-        if (m._a && m._pf.overflow === -2) {
-            overflow =
-                m._a[MONTH] < 0 || m._a[MONTH] > 11 ? MONTH :
-                m._a[DATE] < 1 || m._a[DATE] > daysInMonth(m._a[YEAR], m._a[MONTH]) ? DATE :
-                m._a[HOUR] < 0 || m._a[HOUR] > 23 ? HOUR :
-                m._a[MINUTE] < 0 || m._a[MINUTE] > 59 ? MINUTE :
-                m._a[SECOND] < 0 || m._a[SECOND] > 59 ? SECOND :
-                m._a[MILLISECOND] < 0 || m._a[MILLISECOND] > 999 ? MILLISECOND :
-                -1;
-
-            if (m._pf._overflowDayOfYear && (overflow < YEAR || overflow > DATE)) {
-                overflow = DATE;
-            }
-
-            m._pf.overflow = overflow;
-        }
-    }
-
-    function isValid(m) {
-        if (m._isValid == null) {
-            m._isValid = !isNaN(m._d.getTime()) &&
-                m._pf.overflow < 0 &&
-                !m._pf.empty &&
-                !m._pf.invalidMonth &&
-                !m._pf.nullInput &&
-                !m._pf.invalidFormat &&
-                !m._pf.userInvalidated;
-
-            if (m._strict) {
-                m._isValid = m._isValid &&
-                    m._pf.charsLeftOver === 0 &&
-                    m._pf.unusedTokens.length === 0;
-            }
-        }
-        return m._isValid;
-    }
-
-    function normalizeLanguage(key) {
-        return key ? key.toLowerCase().replace('_', '-') : key;
-    }
-
-    // Return a moment from input, that is local/utc/zone equivalent to model.
-    function makeAs(input, model) {
-        return model._isUTC ? moment(input).zone(model._offset || 0) :
-            moment(input).local();
-    }
-
-    /************************************
-        Languages
-    ************************************/
-
-
-    extend(Language.prototype, {
-
-        set : function (config) {
-            var prop, i;
-            for (i in config) {
-                prop = config[i];
-                if (typeof prop === 'function') {
-                    this[i] = prop;
-                } else {
-                    this['_' + i] = prop;
-                }
-            }
-        },
-
-        _months : "January_February_March_April_May_June_July_August_September_October_November_December".split("_"),
-        months : function (m) {
-            return this._months[m.month()];
-        },
-
-        _monthsShort : "Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),
-        monthsShort : function (m) {
-            return this._monthsShort[m.month()];
-        },
-
-        monthsParse : function (monthName) {
-            var i, mom, regex;
-
-            if (!this._monthsParse) {
-                this._monthsParse = [];
-            }
-
-            for (i = 0; i < 12; i++) {
-                // make the regex if we don't have it already
-                if (!this._monthsParse[i]) {
-                    mom = moment.utc([2000, i]);
-                    regex = '^' + this.months(mom, '') + '|^' + this.monthsShort(mom, '');
-                    this._monthsParse[i] = new RegExp(regex.replace('.', ''), 'i');
-                }
-                // test the regex
-                if (this._monthsParse[i].test(monthName)) {
-                    return i;
-                }
-            }
-        },
-
-        _weekdays : "Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),
-        weekdays : function (m) {
-            return this._weekdays[m.day()];
-        },
-
-        _weekdaysShort : "Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),
-        weekdaysShort : function (m) {
-            return this._weekdaysShort[m.day()];
-        },
-
-        _weekdaysMin : "Su_Mo_Tu_We_Th_Fr_Sa".split("_"),
-        weekdaysMin : function (m) {
-            return this._weekdaysMin[m.day()];
-        },
-
-        weekdaysParse : function (weekdayName) {
-            var i, mom, regex;
-
-            if (!this._weekdaysParse) {
-                this._weekdaysParse = [];
-            }
-
-            for (i = 0; i < 7; i++) {
-                // make the regex if we don't have it already
-                if (!this._weekdaysParse[i]) {
-                    mom = moment([2000, 1]).day(i);
-                    regex = '^' + this.weekdays(mom, '') + '|^' + this.weekdaysShort(mom, '') + '|^' + this.weekdaysMin(mom, '');
-                    this._weekdaysParse[i] = new RegExp(regex.replace('.', ''), 'i');
-                }
-                // test the regex
-                if (this._weekdaysParse[i].test(weekdayName)) {
-                    return i;
-                }
-            }
-        },
-
-        _longDateFormat : {
-            LT : "h:mm A",
-            L : "MM/DD/YYYY",
-            LL : "MMMM D YYYY",
-            LLL : "MMMM D YYYY LT",
-            LLLL : "dddd, MMMM D YYYY LT"
-        },
-        longDateFormat : function (key) {
-            var output = this._longDateFormat[key];
-            if (!output && this._longDateFormat[key.toUpperCase()]) {
-                output = this._longDateFormat[key.toUpperCase()].replace(/MMMM|MM|DD|dddd/g, function (val) {
-                    return val.slice(1);
-                });
-                this._longDateFormat[key] = output;
-            }
-            return output;
-        },
-
-        isPM : function (input) {
-            // IE8 Quirks Mode & IE7 Standards Mode do not allow accessing strings like arrays
-            // Using charAt should be more compatible.
-            return ((input + '').toLowerCase().charAt(0) === 'p');
-        },
-
-        _meridiemParse : /[ap]\.?m?\.?/i,
-        meridiem : function (hours, minutes, isLower) {
-            if (hours > 11) {
-                return isLower ? 'pm' : 'PM';
-            } else {
-                return isLower ? 'am' : 'AM';
-            }
-        },
-
-        _calendar : {
-            sameDay : '[Today at] LT',
-            nextDay : '[Tomorrow at] LT',
-            nextWeek : 'dddd [at] LT',
-            lastDay : '[Yesterday at] LT',
-            lastWeek : '[Last] dddd [at] LT',
-            sameElse : 'L'
-        },
-        calendar : function (key, mom) {
-            var output = this._calendar[key];
-            return typeof output === 'function' ? output.apply(mom) : output;
-        },
-
-        _relativeTime : {
-            future : "in %s",
-            past : "%s ago",
-            s : "a few seconds",
-            m : "a minute",
-            mm : "%d minutes",
-            h : "an hour",
-            hh : "%d hours",
-            d : "a day",
-            dd : "%d days",
-            M : "a month",
-            MM : "%d months",
-            y : "a year",
-            yy : "%d years"
-        },
-        relativeTime : function (number, withoutSuffix, string, isFuture) {
-            var output = this._relativeTime[string];
-            return (typeof output === 'function') ?
-                output(number, withoutSuffix, string, isFuture) :
-                output.replace(/%d/i, number);
-        },
-        pastFuture : function (diff, output) {
-            var format = this._relativeTime[diff > 0 ? 'future' : 'past'];
-            return typeof format === 'function' ? format(output) : format.replace(/%s/i, output);
-        },
-
-        ordinal : function (number) {
-            return this._ordinal.replace("%d", number);
-        },
-        _ordinal : "%d",
-
-        preparse : function (string) {
-            return string;
-        },
-
-        postformat : function (string) {
-            return string;
-        },
-
-        week : function (mom) {
-            return weekOfYear(mom, this._week.dow, this._week.doy).week;
-        },
-
-        _week : {
-            dow : 0, // Sunday is the first day of the week.
-            doy : 6  // The week that contains Jan 1st is the first week of the year.
-        },
-
-        _invalidDate: 'Invalid date',
-        invalidDate: function () {
-            return this._invalidDate;
-        }
-    });
-
-    // Loads a language definition into the `languages` cache.  The function
-    // takes a key and optionally values.  If not in the browser and no values
-    // are provided, it will load the language file module.  As a convenience,
-    // this function also returns the language values.
-    function loadLang(key, values) {
-        values.abbr = key;
-        if (!languages[key]) {
-            languages[key] = new Language();
-        }
-        languages[key].set(values);
-        return languages[key];
-    }
-
-    // Remove a language from the `languages` cache. Mostly useful in tests.
-    function unloadLang(key) {
-        delete languages[key];
-    }
-
-    // Determines which language definition to use and returns it.
-    //
-    // With no parameters, it will return the global language.  If you
-    // pass in a language key, such as 'en', it will return the
-    // definition for 'en', so long as 'en' has already been loaded using
-    // moment.lang.
-    function getLangDefinition(key) {
-        var i = 0, j, lang, next, split,
-            get = function (k) {
-                if (!languages[k] && hasModule) {
-                    try {
-                        require('./lang/' + k);
-                    } catch (e) { }
-                }
-                return languages[k];
-            };
-
-        if (!key) {
-            return moment.fn._lang;
-        }
-
-        if (!isArray(key)) {
-            //short-circuit everything else
-            lang = get(key);
-            if (lang) {
-                return lang;
-            }
-            key = [key];
-        }
-
-        //pick the language from the array
-        //try ['en-au', 'en-gb'] as 'en-au', 'en-gb', 'en', as in move through the list trying each
-        //substring from most specific to least, but move to the next array item if it's a more specific variant than the current root
-        while (i < key.length) {
-            split = normalizeLanguage(key[i]).split('-');
-            j = split.length;
-            next = normalizeLanguage(key[i + 1]);
-            next = next ? next.split('-') : null;
-            while (j > 0) {
-                lang = get(split.slice(0, j).join('-'));
-                if (lang) {
-                    return lang;
-                }
-                if (next && next.length >= j && compareArrays(split, next, true) >= j - 1) {
-                    //the next array item is better than a shallower substring of this one
-                    break;
-                }
-                j--;
-            }
-            i++;
-        }
-        return moment.fn._lang;
-    }
-
-    /************************************
-        Formatting
-    ************************************/
-
-
-    function removeFormattingTokens(input) {
-        if (input.match(/\[[\s\S]/)) {
-            return input.replace(/^\[|\]$/g, "");
-        }
-        return input.replace(/\\/g, "");
-    }
-
-    function makeFormatFunction(format) {
-        var array = format.match(formattingTokens), i, length;
-
-        for (i = 0, length = array.length; i < length; i++) {
-            if (formatTokenFunctions[array[i]]) {
-                array[i] = formatTokenFunctions[array[i]];
-            } else {
-                array[i] = removeFormattingTokens(array[i]);
-            }
-        }
-
-        return function (mom) {
-            var output = "";
-            for (i = 0; i < length; i++) {
-                output += array[i] instanceof Function ? array[i].call(mom, format) : array[i];
-            }
-            return output;
-        };
-    }
-
-    // format date using native date object
-    function formatMoment(m, format) {
-
-        if (!m.isValid()) {
-            return m.lang().invalidDate();
-        }
-
-        format = expandFormat(format, m.lang());
-
-        if (!formatFunctions[format]) {
-            formatFunctions[format] = makeFormatFunction(format);
-        }
-
-        return formatFunctions[format](m);
-    }
-
-    function expandFormat(format, lang) {
-        var i = 5;
-
-        function replaceLongDateFormatTokens(input) {
-            return lang.longDateFormat(input) || input;
-        }
-
-        localFormattingTokens.lastIndex = 0;
-        while (i >= 0 && localFormattingTokens.test(format)) {
-            format = format.replace(localFormattingTokens, replaceLongDateFormatTokens);
-            localFormattingTokens.lastIndex = 0;
-            i -= 1;
-        }
-
-        return format;
-    }
-
-
-    /************************************
-        Parsing
-    ************************************/
-
-
-    // get the regex to find the next token
-    function getParseRegexForToken(token, config) {
-        var a, strict = config._strict;
-        switch (token) {
-        case 'DDDD':
-            return parseTokenThreeDigits;
-        case 'YYYY':
-        case 'GGGG':
-        case 'gggg':
-            return strict ? parseTokenFourDigits : parseTokenOneToFourDigits;
-        case 'Y':
-        case 'G':
-        case 'g':
-            return parseTokenSignedNumber;
-        case 'YYYYYY':
-        case 'YYYYY':
-        case 'GGGGG':
-        case 'ggggg':
-            return strict ? parseTokenSixDigits : parseTokenOneToSixDigits;
-        case 'S':
-            if (strict) { return parseTokenOneDigit; }
-            /* falls through */
-        case 'SS':
-            if (strict) { return parseTokenTwoDigits; }
-            /* falls through */
-        case 'SSS':
-            if (strict) { return parseTokenThreeDigits; }
-            /* falls through */
-        case 'DDD':
-            return parseTokenOneToThreeDigits;
-        case 'MMM':
-        case 'MMMM':
-        case 'dd':
-        case 'ddd':
-        case 'dddd':
-            return parseTokenWord;
-        case 'a':
-        case 'A':
-            return getLangDefinition(config._l)._meridiemParse;
-        case 'X':
-            return parseTokenTimestampMs;
-        case 'Z':
-        case 'ZZ':
-            return parseTokenTimezone;
-        case 'T':
-            return parseTokenT;
-        case 'SSSS':
-            return parseTokenDigits;
-        case 'MM':
-        case 'DD':
-        case 'YY':
-        case 'GG':
-        case 'gg':
-        case 'HH':
-        case 'hh':
-        case 'mm':
-        case 'ss':
-        case 'ww':
-        case 'WW':
-            return strict ? parseTokenTwoDigits : parseTokenOneOrTwoDigits;
-        case 'M':
-        case 'D':
-        case 'd':
-        case 'H':
-        case 'h':
-        case 'm':
-        case 's':
-        case 'w':
-        case 'W':
-        case 'e':
-        case 'E':
-            return parseTokenOneOrTwoDigits;
-        default :
-            a = new RegExp(regexpEscape(unescapeFormat(token.replace('\\', '')), "i"));
-            return a;
-        }
-    }
-
-    function timezoneMinutesFromString(string) {
-        string = string || "";
-        var possibleTzMatches = (string.match(parseTokenTimezone) || []),
-            tzChunk = possibleTzMatches[possibleTzMatches.length - 1] || [],
-            parts = (tzChunk + '').match(parseTimezoneChunker) || ['-', 0, 0],
-            minutes = +(parts[1] * 60) + toInt(parts[2]);
-
-        return parts[0] === '+' ? -minutes : minutes;
-    }
-
-    // function to convert string input to date
-    function addTimeToArrayFromToken(token, input, config) {
-        var a, datePartArray = config._a;
-
-        switch (token) {
-        // MONTH
-        case 'M' : // fall through to MM
-        case 'MM' :
-            if (input != null) {
-                datePartArray[MONTH] = toInt(input) - 1;
-            }
-            break;
-        case 'MMM' : // fall through to MMMM
-        case 'MMMM' :
-            a = getLangDefinition(config._l).monthsParse(input);
-            // if we didn't find a month name, mark the date as invalid.
-            if (a != null) {
-                datePartArray[MONTH] = a;
-            } else {
-                config._pf.invalidMonth = input;
-            }
-            break;
-        // DAY OF MONTH
-        case 'D' : // fall through to DD
-        case 'DD' :
-            if (input != null) {
-                datePartArray[DATE] = toInt(input);
-            }
-            break;
-        // DAY OF YEAR
-        case 'DDD' : // fall through to DDDD
-        case 'DDDD' :
-            if (input != null) {
-                config._dayOfYear = toInt(input);
-            }
-
-            break;
-        // YEAR
-        case 'YY' :
-            datePartArray[YEAR] = toInt(input) + (toInt(input) > 68 ? 1900 : 2000);
-            break;
-        case 'YYYY' :
-        case 'YYYYY' :
-        case 'YYYYYY' :
-            datePartArray[YEAR] = toInt(input);
-            break;
-        // AM / PM
-        case 'a' : // fall through to A
-        case 'A' :
-            config._isPm = getLangDefinition(config._l).isPM(input);
-            break;
-        // 24 HOUR
-        case 'H' : // fall through to hh
-        case 'HH' : // fall through to hh
-        case 'h' : // fall through to hh
-        case 'hh' :
-            datePartArray[HOUR] = toInt(input);
-            break;
-        // MINUTE
-        case 'm' : // fall through to mm
-        case 'mm' :
-            datePartArray[MINUTE] = toInt(input);
-            break;
-        // SECOND
-        case 's' : // fall through to ss
-        case 'ss' :
-            datePartArray[SECOND] = toInt(input);
-            break;
-        // MILLISECOND
-        case 'S' :
-        case 'SS' :
-        case 'SSS' :
-        case 'SSSS' :
-            datePartArray[MILLISECOND] = toInt(('0.' + input) * 1000);
-            break;
-        // UNIX TIMESTAMP WITH MS
-        case 'X':
-            config._d = new Date(parseFloat(input) * 1000);
-            break;
-        // TIMEZONE
-        case 'Z' : // fall through to ZZ
-        case 'ZZ' :
-            config._useUTC = true;
-            config._tzm = timezoneMinutesFromString(input);
-            break;
-        case 'w':
-        case 'ww':
-        case 'W':
-        case 'WW':
-        case 'd':
-        case 'dd':
-        case 'ddd':
-        case 'dddd':
-        case 'e':
-        case 'E':
-            token = token.substr(0, 1);
-            /* falls through */
-        case 'gg':
-        case 'gggg':
-        case 'GG':
-        case 'GGGG':
-        case 'GGGGG':
-            token = token.substr(0, 2);
-            if (input) {
-                config._w = config._w || {};
-                config._w[token] = input;
-            }
-            break;
-        }
-    }
-
-    // convert an array to a date.
-    // the array should mirror the parameters below
-    // note: all values past the year are optional and will default to the lowest possible value.
-    // [year, month, day , hour, minute, second, millisecond]
-    function dateFromConfig(config) {
-        var i, date, input = [], currentDate,
-            yearToUse, fixYear, w, temp, lang, weekday, week;
-
-        if (config._d) {
-            return;
-        }
-
-        currentDate = currentDateArray(config);
-
-        //compute day of the year from weeks and weekdays
-        if (config._w && config._a[DATE] == null && config._a[MONTH] == null) {
-            fixYear = function (val) {
-                var int_val = parseInt(val, 10);
-                return val ?
-                  (val.length < 3 ? (int_val > 68 ? 1900 + int_val : 2000 + int_val) : int_val) :
-                  (config._a[YEAR] == null ? moment().weekYear() : config._a[YEAR]);
-            };
-
-            w = config._w;
-            if (w.GG != null || w.W != null || w.E != null) {
-                temp = dayOfYearFromWeeks(fixYear(w.GG), w.W || 1, w.E, 4, 1);
-            }
-            else {
-                lang = getLangDefinition(config._l);
-                weekday = w.d != null ?  parseWeekday(w.d, lang) :
-                  (w.e != null ?  parseInt(w.e, 10) + lang._week.dow : 0);
-
-                week = parseInt(w.w, 10) || 1;
-
-                //if we're parsing 'd', then the low day numbers may be next week
-                if (w.d != null && weekday < lang._week.dow) {
-                    week++;
-                }
-
-                temp = dayOfYearFromWeeks(fixYear(w.gg), week, weekday, lang._week.doy, lang._week.dow);
-            }
-
-            config._a[YEAR] = temp.year;
-            config._dayOfYear = temp.dayOfYear;
-        }
-
-        //if the day of the year is set, figure out what it is
-        if (config._dayOfYear) {
-            yearToUse = config._a[YEAR] == null ? currentDate[YEAR] : config._a[YEAR];
-
-            if (config._dayOfYear > daysInYear(yearToUse)) {
-                config._pf._overflowDayOfYear = true;
-            }
-
-            date = makeUTCDate(yearToUse, 0, config._dayOfYear);
-            config._a[MONTH] = date.getUTCMonth();
-            config._a[DATE] = date.getUTCDate();
-        }
-
-        // Default to current date.
-        // * if no year, month, day of month are given, default to today
-        // * if day of month is given, default month and year
-        // * if month is given, default only year
-        // * if year is given, don't default anything
-        for (i = 0; i < 3 && config._a[i] == null; ++i) {
-            config._a[i] = input[i] = currentDate[i];
-        }
-
-        // Zero out whatever was not defaulted, including time
-        for (; i < 7; i++) {
-            config._a[i] = input[i] = (config._a[i] == null) ? (i === 2 ? 1 : 0) : config._a[i];
-        }
-
-        // add the offsets to the time to be parsed so that we can have a clean array for checking isValid
-        input[HOUR] += toInt((config._tzm || 0) / 60);
-        input[MINUTE] += toInt((config._tzm || 0) % 60);
-
-        config._d = (config._useUTC ? makeUTCDate : makeDate).apply(null, input);
-    }
-
-    function dateFromObject(config) {
-        var normalizedInput;
-
-        if (config._d) {
-            return;
-        }
-
-        normalizedInput = normalizeObjectUnits(config._i);
-        config._a = [
-            normalizedInput.year,
-            normalizedInput.month,
-            normalizedInput.day,
-            normalizedInput.hour,
-            normalizedInput.minute,
-            normalizedInput.second,
-            normalizedInput.millisecond
-        ];
-
-        dateFromConfig(config);
-    }
-
-    function currentDateArray(config) {
-        var now = new Date();
-        if (config._useUTC) {
-            return [
-                now.getUTCFullYear(),
-                now.getUTCMonth(),
-                now.getUTCDate()
-            ];
-        } else {
-            return [now.getFullYear(), now.getMonth(), now.getDate()];
-        }
-    }
-
-    // date from string and format string
-    function makeDateFromStringAndFormat(config) {
-
-        config._a = [];
-        config._pf.empty = true;
-
-        // This array is used to make a Date, either with `new Date` or `Date.UTC`
-        var lang = getLangDefinition(config._l),
-            string = '' + config._i,
-            i, parsedInput, tokens, token, skipped,
-            stringLength = string.length,
-            totalParsedInputLength = 0;
-
-        tokens = expandFormat(config._f, lang).match(formattingTokens) || [];
-
-        for (i = 0; i < tokens.length; i++) {
-            token = tokens[i];
-            parsedInput = (string.match(getParseRegexForToken(token, config)) || [])[0];
-            if (parsedInput) {
-                skipped = string.substr(0, string.indexOf(parsedInput));
-                if (skipped.length > 0) {
-                    config._pf.unusedInput.push(skipped);
-                }
-                string = string.slice(string.indexOf(parsedInput) + parsedInput.length);
-                totalParsedInputLength += parsedInput.length;
-            }
-            // don't parse if it's not a known token
-            if (formatTokenFunctions[token]) {
-                if (parsedInput) {
-                    config._pf.empty = false;
-                }
-                else {
-                    config._pf.unusedTokens.push(token);
-                }
-                addTimeToArrayFromToken(token, parsedInput, config);
-            }
-            else if (config._strict && !parsedInput) {
-                config._pf.unusedTokens.push(token);
-            }
-        }
-
-        // add remaining unparsed input length to the string
-        config._pf.charsLeftOver = stringLength - totalParsedInputLength;
-        if (string.length > 0) {
-            config._pf.unusedInput.push(string);
-        }
-
-        // handle am pm
-        if (config._isPm && config._a[HOUR] < 12) {
-            config._a[HOUR] += 12;
-        }
-        // if is 12 am, change hours to 0
-        if (config._isPm === false && config._a[HOUR] === 12) {
-            config._a[HOUR] = 0;
-        }
-
-        dateFromConfig(config);
-        checkOverflow(config);
-    }
-
-    function unescapeFormat(s) {
-        return s.replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g, function (matched, p1, p2, p3, p4) {
-            return p1 || p2 || p3 || p4;
-        });
-    }
-
-    // Code from http://stackoverflow.com/questions/3561493/is-there-a-regexp-escape-function-in-javascript
-    function regexpEscape(s) {
-        return s.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&');
-    }
-
-    // date from string and array of format strings
-    function makeDateFromStringAndArray(config) {
-        var tempConfig,
-            bestMoment,
-
-            scoreToBeat,
-            i,
-            currentScore;
-
-        if (config._f.length === 0) {
-            config._pf.invalidFormat = true;
-            config._d = new Date(NaN);
-            return;
-        }
-
-        for (i = 0; i < config._f.length; i++) {
-            currentScore = 0;
-            tempConfig = extend({}, config);
-            tempConfig._pf = defaultParsingFlags();
-            tempConfig._f = config._f[i];
-            makeDateFromStringAndFormat(tempConfig);
-
-            if (!isValid(tempConfig)) {
-                continue;
-            }
-
-            // if there is any input that was not parsed add a penalty for that format
-            currentScore += tempConfig._pf.charsLeftOver;
-
-            //or tokens
-            currentScore += tempConfig._pf.unusedTokens.length * 10;
-
-            tempConfig._pf.score = currentScore;
-
-            if (scoreToBeat == null || currentScore < scoreToBeat) {
-                scoreToBeat = currentScore;
-                bestMoment = tempConfig;
-            }
-        }
-
-        extend(config, bestMoment || tempConfig);
-    }
-
-    // date from iso format
-    function makeDateFromString(config) {
-        var i, l,
-            string = config._i,
-            match = isoRegex.exec(string);
-
-        if (match) {
-            config._pf.iso = true;
-            for (i = 0, l = isoDates.length; i < l; i++) {
-                if (isoDates[i][1].exec(string)) {
-                    // match[5] should be "T" or undefined
-                    config._f = isoDates[i][0] + (match[6] || " ");
-                    break;
-                }
-            }
-            for (i = 0, l = isoTimes.length; i < l; i++) {
-                if (isoTimes[i][1].exec(string)) {
-                    config._f += isoTimes[i][0];
-                    break;
-                }
-            }
-            if (string.match(parseTokenTimezone)) {
-                config._f += "Z";
-            }
-            makeDateFromStringAndFormat(config);
-        }
-        else {
-            config._d = new Date(string);
-        }
-    }
-
-    function makeDateFromInput(config) {
-        var input = config._i,
-            matched = aspNetJsonRegex.exec(input);
-
-        if (input === undefined) {
-            config._d = new Date();
-        } else if (matched) {
-            config._d = new Date(+matched[1]);
-        } else if (typeof input === 'string') {
-            makeDateFromString(config);
-        } else if (isArray(input)) {
-            config._a = input.slice(0);
-            dateFromConfig(config);
-        } else if (isDate(input)) {
-            config._d = new Date(+input);
-        } else if (typeof(input) === 'object') {
-            dateFromObject(config);
-        } else {
-            config._d = new Date(input);
-        }
-    }
-
-    function makeDate(y, m, d, h, M, s, ms) {
-        //can't just apply() to create a date:
-        //http://stackoverflow.com/questions/181348/instantiating-a-javascript-object-by-calling-prototype-constructor-apply
-        var date = new Date(y, m, d, h, M, s, ms);
-
-        //the date constructor doesn't accept years < 1970
-        if (y < 1970) {
-            date.setFullYear(y);
-        }
-        return date;
-    }
-
-    function makeUTCDate(y) {
-        var date = new Date(Date.UTC.apply(null, arguments));
-        if (y < 1970) {
-            date.setUTCFullYear(y);
-        }
-        return date;
-    }
-
-    function parseWeekday(input, language) {
-        if (typeof input === 'string') {
-            if (!isNaN(input)) {
-                input = parseInt(input, 10);
-            }
-            else {
-                input = language.weekdaysParse(input);
-                if (typeof input !== 'number') {
-                    return null;
-                }
-            }
-        }
-        return input;
-    }
-
-    /************************************
-        Relative Time
-    ************************************/
-
-
-    // helper function for moment.fn.from, moment.fn.fromNow, and moment.duration.fn.humanize
-    function substituteTimeAgo(string, number, withoutSuffix, isFuture, lang) {
-        return lang.relativeTime(number || 1, !!withoutSuffix, string, isFuture);
-    }
-
-    function relativeTime(milliseconds, withoutSuffix, lang) {
-        var seconds = round(Math.abs(milliseconds) / 1000),
-            minutes = round(seconds / 60),
-            hours = round(minutes / 60),
-            days = round(hours / 24),
-            years = round(days / 365),
-            args = seconds < 45 && ['s', seconds] ||
-                minutes === 1 && ['m'] ||
-                minutes < 45 && ['mm', minutes] ||
-                hours === 1 && ['h'] ||
-                hours < 22 && ['hh', hours] ||
-                days === 1 && ['d'] ||
-                days <= 25 && ['dd', days] ||
-                days <= 45 && ['M'] ||
-                days < 345 && ['MM', round(days / 30)] ||
-                years === 1 && ['y'] || ['yy', years];
-        args[2] = withoutSuffix;
-        args[3] = milliseconds > 0;
-        args[4] = lang;
-        return substituteTimeAgo.apply({}, args);
-    }
-
-
-    /************************************
-        Week of Year
-    ************************************/
-
-
-    // firstDayOfWeek       0 = sun, 6 = sat
-    //                      the day of the week that starts the week
-    //                      (usually sunday or monday)
-    // firstDayOfWeekOfYear 0 = sun, 6 = sat
-    //                      the first week is the week that contains the first
-    //                      of this day of the week
-    //                      (eg. ISO weeks use thursday (4))
-    function weekOfYear(mom, firstDayOfWeek, firstDayOfWeekOfYear) {
-        var end = firstDayOfWeekOfYear - firstDayOfWeek,
-            daysToDayOfWeek = firstDayOfWeekOfYear - mom.day(),
-            adjustedMoment;
-
-
-        if (daysToDayOfWeek > end) {
-            daysToDayOfWeek -= 7;
-        }
-
-        if (daysToDayOfWeek < end - 7) {
-            daysToDayOfWeek += 7;
-        }
-
-        adjustedMoment = moment(mom).add('d', daysToDayOfWeek);
-        return {
-            week: Math.ceil(adjustedMoment.dayOfYear() / 7),
-            year: adjustedMoment.year()
-        };
-    }
-
-    //http://en.wikipedia.org/wiki/ISO_week_date#Calculating_a_date_given_the_year.2C_week_number_and_weekday
-    function dayOfYearFromWeeks(year, week, weekday, firstDayOfWeekOfYear, firstDayOfWeek) {
-        var d = makeUTCDate(year, 0, 1).getUTCDay(), daysToAdd, dayOfYear;
-
-        weekday = weekday != null ? weekday : firstDayOfWeek;
-        daysToAdd = firstDayOfWeek - d + (d > firstDayOfWeekOfYear ? 7 : 0) - (d < firstDayOfWeek ? 7 : 0);
-        dayOfYear = 7 * (week - 1) + (weekday - firstDayOfWeek) + daysToAdd + 1;
-
-        return {
-            year: dayOfYear > 0 ? year : year - 1,
-            dayOfYear: dayOfYear > 0 ?  dayOfYear : daysInYear(year - 1) + dayOfYear
-        };
-    }
-
-    /************************************
-        Top Level Functions
-    ************************************/
-
-    function makeMoment(config) {
-        var input = config._i,
-            format = config._f;
-
-        if (input === null) {
-            return moment.invalid({nullInput: true});
-        }
-
-        if (typeof input === 'string') {
-            config._i = input = getLangDefinition().preparse(input);
-        }
-
-        if (moment.isMoment(input)) {
-            config = cloneMoment(input);
-
-            config._d = new Date(+input._d);
-        } else if (format) {
-            if (isArray(format)) {
-                makeDateFromStringAndArray(config);
-            } else {
-                makeDateFromStringAndFormat(config);
-            }
-        } else {
-            makeDateFromInput(config);
-        }
-
-        return new Moment(config);
-    }
-
-    moment = function (input, format, lang, strict) {
-        var c;
-
-        if (typeof(lang) === "boolean") {
-            strict = lang;
-            lang = undefined;
-        }
-        // object construction must be done this way.
-        // https://github.com/moment/moment/issues/1423
-        c = {};
-        c._isAMomentObject = true;
-        c._i = input;
-        c._f = format;
-        c._l = lang;
-        c._strict = strict;
-        c._isUTC = false;
-        c._pf = defaultParsingFlags();
-
-        return makeMoment(c);
-    };
-
-    // creating with utc
-    moment.utc = function (input, format, lang, strict) {
-        var c;
-
-        if (typeof(lang) === "boolean") {
-            strict = lang;
-            lang = undefined;
-        }
-        // object construction must be done this way.
-        // https://github.com/moment/moment/issues/1423
-        c = {};
-        c._isAMomentObject = true;
-        c._useUTC = true;
-        c._isUTC = true;
-        c._l = lang;
-        c._i = input;
-        c._f = format;
-        c._strict = strict;
-        c._pf = defaultParsingFlags();
-
-        return makeMoment(c).utc();
-    };
-
-    // creating with unix timestamp (in seconds)
-    moment.unix = function (input) {
-        return moment(input * 1000);
-    };
-
-    // duration
-    moment.duration = function (input, key) {
-        var duration = input,
-            // matching against regexp is expensive, do it on demand
-            match = null,
-            sign,
-            ret,
-            parseIso;
-
-        if (moment.isDuration(input)) {
-            duration = {
-                ms: input._milliseconds,
-                d: input._days,
-                M: input._months
-            };
-        } else if (typeof input === 'number') {
-            duration = {};
-            if (key) {
-                duration[key] = input;
-            } else {
-                duration.milliseconds = input;
-            }
-        } else if (!!(match = aspNetTimeSpanJsonRegex.exec(input))) {
-            sign = (match[1] === "-") ? -1 : 1;
-            duration = {
-                y: 0,
-                d: toInt(match[DATE]) * sign,
-                h: toInt(match[HOUR]) * sign,
-                m: toInt(match[MINUTE]) * sign,
-                s: toInt(match[SECOND]) * sign,
-                ms: toInt(match[MILLISECOND]) * sign
-            };
-        } else if (!!(match = isoDurationRegex.exec(input))) {
-            sign = (match[1] === "-") ? -1 : 1;
-            parseIso = function (inp) {
-                // We'd normally use ~~inp for this, but unfortunately it also
-                // converts floats to ints.
-                // inp may be undefined, so careful calling replace on it.
-                var res = inp && parseFloat(inp.replace(',', '.'));
-                // apply sign while we're at it
-                return (isNaN(res) ? 0 : res) * sign;
-            };
-            duration = {
-                y: parseIso(match[2]),
-                M: parseIso(match[3]),
-                d: parseIso(match[4]),
-                h: parseIso(match[5]),
-                m: parseIso(match[6]),
-                s: parseIso(match[7]),
-                w: parseIso(match[8])
-            };
-        }
-
-        ret = new Duration(duration);
-
-        if (moment.isDuration(input) && input.hasOwnProperty('_lang')) {
-            ret._lang = input._lang;
-        }
-
-        return ret;
-    };
-
-    // version number
-    moment.version = VERSION;
-
-    // default format
-    moment.defaultFormat = isoFormat;
-
-    // This function will be called whenever a moment is mutated.
-    // It is intended to keep the offset in sync with the timezone.
-    moment.updateOffset = function () {};
-
-    // This function will load languages and then set the global language.  If
-    // no arguments are passed in, it will simply return the current global
-    // language key.
-    moment.lang = function (key, values) {
-        var r;
-        if (!key) {
-            return moment.fn._lang._abbr;
-        }
-        if (values) {
-            loadLang(normalizeLanguage(key), values);
-        } else if (values === null) {
-            unloadLang(key);
-            key = 'en';
-        } else if (!languages[key]) {
-            getLangDefinition(key);
-        }
-        r = moment.duration.fn._lang = moment.fn._lang = getLangDefinition(key);
-        return r._abbr;
-    };
-
-    // returns language data
-    moment.langData = function (key) {
-        if (key && key._lang && key._lang._abbr) {
-            key = key._lang._abbr;
-        }
-        return getLangDefinition(key);
-    };
-
-    // compare moment object
-    moment.isMoment = function (obj) {
-        return obj instanceof Moment ||
-            (obj != null &&  obj.hasOwnProperty('_isAMomentObject'));
-    };
-
-    // for typechecking Duration objects
-    moment.isDuration = function (obj) {
-        return obj instanceof Duration;
-    };
-
-    for (i = lists.length - 1; i >= 0; --i) {
-        makeList(lists[i]);
-    }
-
-    moment.normalizeUnits = function (units) {
-        return normalizeUnits(units);
-    };
-
-    moment.invalid = function (flags) {
-        var m = moment.utc(NaN);
-        if (flags != null) {
-            extend(m._pf, flags);
-        }
-        else {
-            m._pf.userInvalidated = true;
-        }
-
-        return m;
-    };
-
-    moment.parseZone = function (input) {
-        return moment(input).parseZone();
-    };
-
-    /************************************
-        Moment Prototype
-    ************************************/
-
-
-    extend(moment.fn = Moment.prototype, {
-
-        clone : function () {
-            return moment(this);
-        },
-
-        valueOf : function () {
-            return +this._d + ((this._offset || 0) * 60000);
-        },
-
-        unix : function () {
-            return Math.floor(+this / 1000);
-        },
-
-        toString : function () {
-            return this.clone().lang('en').format("ddd MMM DD YYYY HH:mm:ss [GMT]ZZ");
-        },
-
-        toDate : function () {
-            return this._offset ? new Date(+this) : this._d;
-        },
-
-        toISOString : function () {
-            var m = moment(this).utc();
-            if (0 < m.year() && m.year() <= 9999) {
-                return formatMoment(m, 'YYYY-MM-DD[T]HH:mm:ss.SSS[Z]');
-            } else {
-                return formatMoment(m, 'YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]');
-            }
-        },
-
-        toArray : function () {
-            var m = this;
-            return [
-                m.year(),
-                m.month(),
-                m.date(),
-                m.hours(),
-                m.minutes(),
-                m.seconds(),
-                m.milliseconds()
-            ];
-        },
-
-        isValid : function () {
-            return isValid(this);
-        },
-
-        isDSTShifted : function () {
-
-            if (this._a) {
-                return this.isValid() && compareArrays(this._a, (this._isUTC ? moment.utc(this._a) : moment(this._a)).toArray()) > 0;
-            }
-
-            return false;
-        },
-
-        parsingFlags : function () {
-            return extend({}, this._pf);
-        },
-
-        invalidAt: function () {
-            return this._pf.overflow;
-        },
-
-        utc : function () {
-            return this.zone(0);
-        },
-
-        local : function () {
-            this.zone(0);
-            this._isUTC = false;
-            return this;
-        },
-
-        format : function (inputString) {
-            var output = formatMoment(this, inputString || moment.defaultFormat);
-            return this.lang().postformat(output);
-        },
-
-        add : function (input, val) {
-            var dur;
-            // switch args to support add('s', 1) and add(1, 's')
-            if (typeof input === 'string') {
-                dur = moment.duration(+val, input);
-            } else {
-                dur = moment.duration(input, val);
-            }
-            addOrSubtractDurationFromMoment(this, dur, 1);
-            return this;
-        },
-
-        subtract : function (input, val) {
-            var dur;
-            // switch args to support subtract('s', 1) and subtract(1, 's')
-            if (typeof input === 'string') {
-                dur = moment.duration(+val, input);
-            } else {
-                dur = moment.duration(input, val);
-            }
-            addOrSubtractDurationFromMoment(this, dur, -1);
-            return this;
-        },
-
-        diff : function (input, units, asFloat) {
-            var that = makeAs(input, this),
-                zoneDiff = (this.zone() - that.zone()) * 6e4,
-                diff, output;
-
-            units = normalizeUnits(units);
-
-            if (units === 'year' || units === 'month') {
-                // average number of days in the months in the given dates
-                diff = (this.daysInMonth() + that.daysInMonth()) * 432e5; // 24 * 60 * 60 * 1000 / 2
-                // difference in months
-                output = ((this.year() - that.year()) * 12) + (this.month() - that.month());
-                // adjust by taking difference in days, average number of days
-                // and dst in the given months.
-                output += ((this - moment(this).startOf('month')) -
-                        (that - moment(that).startOf('month'))) / diff;
-                // same as above but with zones, to negate all dst
-                output -= ((this.zone() - moment(this).startOf('month').zone()) -
-                        (that.zone() - moment(that).startOf('month').zone())) * 6e4 / diff;
-                if (units === 'year') {
-                    output = output / 12;
-                }
-            } else {
-                diff = (this - that);
-                output = units === 'second' ? diff / 1e3 : // 1000
-                    units === 'minute' ? diff / 6e4 : // 1000 * 60
-                    units === 'hour' ? diff / 36e5 : // 1000 * 60 * 60
-                    units === 'day' ? (diff - zoneDiff) / 864e5 : // 1000 * 60 * 60 * 24, negate dst
-                    units === 'week' ? (diff - zoneDiff) / 6048e5 : // 1000 * 60 * 60 * 24 * 7, negate dst
-                    diff;
-            }
-            return asFloat ? output : absRound(output);
-        },
-
-        from : function (time, withoutSuffix) {
-            return moment.duration(this.diff(time)).lang(this.lang()._abbr).humanize(!withoutSuffix);
-        },
-
-        fromNow : function (withoutSuffix) {
-            return this.from(moment(), withoutSuffix);
-        },
-
-        calendar : function () {
-            // We want to compare the start of today, vs this.
-            // Getting start-of-today depends on whether we're zone'd or not.
-            var sod = makeAs(moment(), this).startOf('day'),
-                diff = this.diff(sod, 'days', true),
-                format = diff < -6 ? 'sameElse' :
-                    diff < -1 ? 'lastWeek' :
-                    diff < 0 ? 'lastDay' :
-                    diff < 1 ? 'sameDay' :
-                    diff < 2 ? 'nextDay' :
-                    diff < 7 ? 'nextWeek' : 'sameElse';
-            return this.format(this.lang().calendar(format, this));
-        },
-
-        isLeapYear : function () {
-            return isLeapYear(this.year());
-        },
-
-        isDST : function () {
-            return (this.zone() < this.clone().month(0).zone() ||
-                this.zone() < this.clone().month(5).zone());
-        },
-
-        day : function (input) {
-            var day = this._isUTC ? this._d.getUTCDay() : this._d.getDay();
-            if (input != null) {
-                input = parseWeekday(input, this.lang());
-                return this.add({ d : input - day });
-            } else {
-                return day;
-            }
-        },
-
-        month : function (input) {
-            var utc = this._isUTC ? 'UTC' : '',
-                dayOfMonth;
-
-            if (input != null) {
-                if (typeof input === 'string') {
-                    input = this.lang().monthsParse(input);
-                    if (typeof input !== 'number') {
-                        return this;
-                    }
-                }
-
-                dayOfMonth = this.date();
-                this.date(1);
-                this._d['set' + utc + 'Month'](input);
-                this.date(Math.min(dayOfMonth, this.daysInMonth()));
-
-                moment.updateOffset(this);
-                return this;
-            } else {
-                return this._d['get' + utc + 'Month']();
-            }
-        },
-
-        startOf: function (units) {
-            units = normalizeUnits(units);
-            // the following switch intentionally omits break keywords
-            // to utilize falling through the cases.
-            switch (units) {
-            case 'year':
-                this.month(0);
-                /* falls through */
-            case 'month':
-                this.date(1);
-                /* falls through */
-            case 'week':
-            case 'isoWeek':
-            case 'day':
-                this.hours(0);
-                /* falls through */
-            case 'hour':
-                this.minutes(0);
-                /* falls through */
-            case 'minute':
-                this.seconds(0);
-                /* falls through */
-            case 'second':
-                this.milliseconds(0);
-                /* falls through */
-            }
-
-            // weeks are a special case
-            if (units === 'week') {
-                this.weekday(0);
-            } else if (units === 'isoWeek') {
-                this.isoWeekday(1);
-            }
-
-            return this;
-        },
-
-        endOf: function (units) {
-            units = normalizeUnits(units);
-            return this.startOf(units).add((units === 'isoWeek' ? 'week' : units), 1).subtract('ms', 1);
-        },
-
-        isAfter: function (input, units) {
-            units = typeof units !== 'undefined' ? units : 'millisecond';
-            return +this.clone().startOf(units) > +moment(input).startOf(units);
-        },
-
-        isBefore: function (input, units) {
-            units = typeof units !== 'undefined' ? units : 'millisecond';
-            return +this.clone().startOf(units) < +moment(input).startOf(units);
-        },
-
-        isSame: function (input, units) {
-            units = units || 'ms';
-            return +this.clone().startOf(units) === +makeAs(input, this).startOf(units);
-        },
-
-        min: function (other) {
-            other = moment.apply(null, arguments);
-            return other < this ? this : other;
-        },
-
-        max: function (other) {
-            other = moment.apply(null, arguments);
-            return other > this ? this : other;
-        },
-
-        zone : function (input) {
-            var offset = this._offset || 0;
-            if (input != null) {
-                if (typeof input === "string") {
-                    input = timezoneMinutesFromString(input);
-                }
-                if (Math.abs(input) < 16) {
-                    input = input * 60;
-                }
-                this._offset = input;
-                this._isUTC = true;
-                if (offset !== input) {
-                    addOrSubtractDurationFromMoment(this, moment.duration(offset - input, 'm'), 1, true);
-                }
-            } else {
-                return this._isUTC ? offset : this._d.getTimezoneOffset();
-            }
-            return this;
-        },
-
-        zoneAbbr : function () {
-            return this._isUTC ? "UTC" : "";
-        },
-
-        zoneName : function () {
-            return this._isUTC ? "Coordinated Universal Time" : "";
-        },
-
-        parseZone : function () {
-            if (this._tzm) {
-                this.zone(this._tzm);
-            } else if (typeof this._i === 'string') {
-                this.zone(this._i);
-            }
-            return this;
-        },
-
-        hasAlignedHourOffset : function (input) {
-            if (!input) {
-                input = 0;
-            }
-            else {
-                input = moment(input).zone();
-            }
-
-            return (this.zone() - input) % 60 === 0;
-        },
-
-        daysInMonth : function () {
-            return daysInMonth(this.year(), this.month());
-        },
-
-        dayOfYear : function (input) {
-            var dayOfYear = round((moment(this).startOf('day') - moment(this).startOf('year')) / 864e5) + 1;
-            return input == null ? dayOfYear : this.add("d", (input - dayOfYear));
-        },
-
-        quarter : function () {
-            return Math.ceil((this.month() + 1.0) / 3.0);
-        },
-
-        weekYear : function (input) {
-            var year = weekOfYear(this, this.lang()._week.dow, this.lang()._week.doy).year;
-            return input == null ? year : this.add("y", (input - year));
-        },
-
-        isoWeekYear : function (input) {
-            var year = weekOfYear(this, 1, 4).year;
-            return input == null ? year : this.add("y", (input - year));
-        },
-
-        week : function (input) {
-            var week = this.lang().week(this);
-            return input == null ? week : this.add("d", (input - week) * 7);
-        },
-
-        isoWeek : function (input) {
-            var week = weekOfYear(this, 1, 4).week;
-            return input == null ? week : this.add("d", (input - week) * 7);
-        },
-
-        weekday : function (input) {
-            var weekday = (this.day() + 7 - this.lang()._week.dow) % 7;
-            return input == null ? weekday : this.add("d", input - weekday);
-        },
-
-        isoWeekday : function (input) {
-            // behaves the same as moment#day except
-            // as a getter, returns 7 instead of 0 (1-7 range instead of 0-6)
-            // as a setter, sunday should belong to the previous week.
-            return input == null ? this.day() || 7 : this.day(this.day() % 7 ? input : input - 7);
-        },
-
-        get : function (units) {
-            units = normalizeUnits(units);
-            return this[units]();
-        },
-
-        set : function (units, value) {
-            units = normalizeUnits(units);
-            if (typeof this[units] === 'function') {
-                this[units](value);
-            }
-            return this;
-        },
-
-        // If passed a language key, it will set the language for this
-        // instance.  Otherwise, it will return the language configuration
-        // variables for this instance.
-        lang : function (key) {
-            if (key === undefined) {
-                return this._lang;
-            } else {
-                this._lang = getLangDefinition(key);
-                return this;
-            }
-        }
-    });
-
-    // helper for adding shortcuts
-    function makeGetterAndSetter(name, key) {
-        moment.fn[name] = moment.fn[name + 's'] = function (input) {
-            var utc = this._isUTC ? 'UTC' : '';
-            if (input != null) {
-                this._d['set' + utc + key](input);
-                moment.updateOffset(this);
-                return this;
-            } else {
-                return this._d['get' + utc + key]();
-            }
-        };
-    }
-
-    // loop through and add shortcuts (Month, Date, Hours, Minutes, Seconds, Milliseconds)
-    for (i = 0; i < proxyGettersAndSetters.length; i ++) {
-        makeGetterAndSetter(proxyGettersAndSetters[i].toLowerCase().replace(/s$/, ''), proxyGettersAndSetters[i]);
-    }
-
-    // add shortcut for year (uses different syntax than the getter/setter 'year' == 'FullYear')
-    makeGetterAndSetter('year', 'FullYear');
-
-    // add plural methods
-    moment.fn.days = moment.fn.day;
-    moment.fn.months = moment.fn.month;
-    moment.fn.weeks = moment.fn.week;
-    moment.fn.isoWeeks = moment.fn.isoWeek;
-
-    // add aliased format methods
-    moment.fn.toJSON = moment.fn.toISOString;
-
-    /************************************
-        Duration Prototype
-    ************************************/
-
-
-    extend(moment.duration.fn = Duration.prototype, {
-
-        _bubble : function () {
-            var milliseconds = this._milliseconds,
-                days = this._days,
-                months = this._months,
-                data = this._data,
-                seconds, minutes, hours, years;
-
-            // The following code bubbles up values, see the tests for
-            // examples of what that means.
-            data.milliseconds = milliseconds % 1000;
-
-            seconds = absRound(milliseconds / 1000);
-            data.seconds = seconds % 60;
-
-            minutes = absRound(seconds / 60);
-            data.minutes = minutes % 60;
-
-            hours = absRound(minutes / 60);
-            data.hours = hours % 24;
-
-            days += absRound(hours / 24);
-            data.days = days % 30;
-
-            months += absRound(days / 30);
-            data.months = months % 12;
-
-            years = absRound(months / 12);
-            data.years = years;
-        },
-
-        weeks : function () {
-            return absRound(this.days() / 7);
-        },
-
-        valueOf : function () {
-            return this._milliseconds +
-              this._days * 864e5 +
-              (this._months % 12) * 2592e6 +
-              toInt(this._months / 12) * 31536e6;
-        },
-
-        humanize : function (withSuffix) {
-            var difference = +this,
-                output = relativeTime(difference, !withSuffix, this.lang());
-
-            if (withSuffix) {
-                output = this.lang().pastFuture(difference, output);
-            }
-
-            return this.lang().postformat(output);
-        },
-
-        add : function (input, val) {
-            // supports only 2.0-style add(1, 's') or add(moment)
-            var dur = moment.duration(input, val);
-
-            this._milliseconds += dur._milliseconds;
-            this._days += dur._days;
-            this._months += dur._months;
-
-            this._bubble();
-
-            return this;
-        },
-
-        subtract : function (input, val) {
-            var dur = moment.duration(input, val);
-
-            this._milliseconds -= dur._milliseconds;
-            this._days -= dur._days;
-            this._months -= dur._months;
-
-            this._bubble();
-
-            return this;
-        },
-
-        get : function (units) {
-            units = normalizeUnits(units);
-            return this[units.toLowerCase() + 's']();
-        },
-
-        as : function (units) {
-            units = normalizeUnits(units);
-            return this['as' + units.charAt(0).toUpperCase() + units.slice(1) + 's']();
-        },
-
-        lang : moment.fn.lang,
-
-        toIsoString : function () {
-            // inspired by https://github.com/dordille/moment-isoduration/blob/master/moment.isoduration.js
-            var years = Math.abs(this.years()),
-                months = Math.abs(this.months()),
-                days = Math.abs(this.days()),
-                hours = Math.abs(this.hours()),
-                minutes = Math.abs(this.minutes()),
-                seconds = Math.abs(this.seconds() + this.milliseconds() / 1000);
-
-            if (!this.asSeconds()) {
-                // this is the same as C#'s (Noda) and python (isodate)...
-                // but not other JS (goog.date)
-                return 'P0D';
-            }
-
-            return (this.asSeconds() < 0 ? '-' : '') +
-                'P' +
-                (years ? years + 'Y' : '') +
-                (months ? months + 'M' : '') +
-                (days ? days + 'D' : '') +
-                ((hours || minutes || seconds) ? 'T' : '') +
-                (hours ? hours + 'H' : '') +
-                (minutes ? minutes + 'M' : '') +
-                (seconds ? seconds + 'S' : '');
-        }
-    });
-
-    function makeDurationGetter(name) {
-        moment.duration.fn[name] = function () {
-            return this._data[name];
-        };
-    }
-
-    function makeDurationAsGetter(name, factor) {
-        moment.duration.fn['as' + name] = function () {
-            return +this / factor;
-        };
-    }
-
-    for (i in unitMillisecondFactors) {
-        if (unitMillisecondFactors.hasOwnProperty(i)) {
-            makeDurationAsGetter(i, unitMillisecondFactors[i]);
-            makeDurationGetter(i.toLowerCase());
-        }
-    }
-
-    makeDurationAsGetter('Weeks', 6048e5);
-    moment.duration.fn.asMonths = function () {
-        return (+this - this.years() * 31536e6) / 2592e6 + this.years() * 12;
-    };
-
-
-    /************************************
-        Default Lang
-    ************************************/
-
-
-    // Set default language, other languages will inherit from English.
-    moment.lang('en', {
-        ordinal : function (number) {
-            var b = number % 10,
-                output = (toInt(number % 100 / 10) === 1) ? 'th' :
-                (b === 1) ? 'st' :
-                (b === 2) ? 'nd' :
-                (b === 3) ? 'rd' : 'th';
-            return number + output;
-        }
-    });
-
-    /* EMBED_LANGUAGES */
-
-    /************************************
-        Exposing Moment
-    ************************************/
-
-    function makeGlobal(deprecate) {
-        var warned = false, local_moment = moment;
-        /*global ender:false */
-        if (typeof ender !== 'undefined') {
-            return;
-        }
-        // here, `this` means `window` in the browser, or `global` on the server
-        // add `moment` as a global object via a string identifier,
-        // for Closure Compiler "advanced" mode
-        if (deprecate) {
-            global.moment = function () {
-                if (!warned && console && console.warn) {
-                    warned = true;
-                    console.warn(
-                            "Accessing Moment through the global scope is " +
-                            "deprecated, and will be removed in an upcoming " +
-                            "release.");
-                }
-                return local_moment.apply(null, arguments);
-            };
-            extend(global.moment, local_moment);
-        } else {
-            global['moment'] = moment;
-        }
-    }
-
-    // CommonJS module is defined
-    if (hasModule) {
-        module.exports = moment;
-        makeGlobal(true);
-    } else if (typeof define === "function" && define.amd) {
-        define("moment", function (require, exports, module) {
-            if (module.config && module.config() && module.config().noGlobal !== true) {
-                // If user provided noGlobal, he is aware of global
-                makeGlobal(module.config().noGlobal === undefined);
-            }
-
-            return moment;
-        });
-    } else {
-        makeGlobal();
-    }
-}).call(this);
diff --git a/resources/oojs-ui/i18n/ace.json b/resources/oojs-ui/i18n/ace.json
deleted file mode 100644 (file)
index 554ae57..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-{
-    "@metadata": {
-        "authors": [
-            "Si Gam Acèh"
-        ]
-    },
-    "ooui-dialog-action-close": "Tôp",
-    "ooui-outline-control-move-down": "Pinah item u yup",
-    "ooui-outline-control-move-up": "Pinah item u ateuëh",
-    "ooui-toolbar-more": "Lom"
-}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/af.json b/resources/oojs-ui/i18n/af.json
deleted file mode 100644 (file)
index a622f89..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-{
-    "@metadata": {
-        "authors": [
-            "Naudefj"
-        ]
-    },
-    "ooui-dialog-action-close": "Sluit",
-    "ooui-outline-control-move-down": "Skuif item af",
-    "ooui-outline-control-move-up": "Skuif item op"
-}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/am.json b/resources/oojs-ui/i18n/am.json
deleted file mode 100644 (file)
index 61e4ff6..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-{
-    "@metadata": {
-        "authors": [
-            "Elfalem"
-        ]
-    },
-    "ooui-dialog-action-close": "ለመዝጋት"
-}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/ar.json b/resources/oojs-ui/i18n/ar.json
deleted file mode 100644 (file)
index 65e1364..0000000
+++ /dev/null
@@ -1,18 +0,0 @@
-{
-    "@metadata": {
-        "authors": [
-            "Ciphers",
-            "Claw eg",
-            "Elfalem",
-            "Jdforrester",
-            "Mido",
-            "OsamaK",
-            "زكريا",
-            "مشعل الحربي"
-        ]
-    },
-    "ooui-dialog-action-close": "أغلق",
-    "ooui-outline-control-move-down": "انقل العنصر للأسفل",
-    "ooui-outline-control-move-up": "انقل العنصر للأعلى",
-    "ooui-toolbar-more": "مزيد"
-}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/arc.json b/resources/oojs-ui/i18n/arc.json
deleted file mode 100644 (file)
index 0f9e75d..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-{
-    "@metadata": {
-        "authors": [
-            "Basharh"
-        ]
-    },
-    "ooui-dialog-action-close": "ܣܟܘܪ"
-}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/ast.json b/resources/oojs-ui/i18n/ast.json
deleted file mode 100644 (file)
index fe6ea0a..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-{
-    "@metadata": {
-        "authors": [
-            "Basharh",
-            "Bishnu Saikia",
-            "Xuacu"
-        ]
-    },
-    "ooui-dialog-action-close": "Zarrar",
-    "ooui-outline-control-move-down": "Mover abaxo l'elementu",
-    "ooui-outline-control-move-up": "Mover arriba l'elementu",
-    "ooui-outline-control-remove": "Desaniciar elementu",
-    "ooui-toolbar-more": "Más"
-}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/az.json b/resources/oojs-ui/i18n/az.json
deleted file mode 100644 (file)
index 257680b..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-{
-    "@metadata": {
-        "authors": [
-            "Cekli829",
-            "Interfase",
-            "Jduranboger"
-        ]
-    },
-    "ooui-dialog-action-close": "Bağla",
-    "ooui-outline-control-move-down": "Bəndi aşağı apar",
-    "ooui-outline-control-move-up": "Bəndi yuxarı apar",
-    "ooui-outline-control-remove": "Bəndi sil",
-    "ooui-toolbar-more": "Daha artıq"
-}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/ba.json b/resources/oojs-ui/i18n/ba.json
deleted file mode 100644 (file)
index 4af0114..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-{
-    "@metadata": {
-        "authors": [
-            "AiseluRB",
-            "Amire80",
-            "Assele",
-            "Haqmar",
-            "Sagan",
-            "Рустам Нурыев"
-        ]
-    },
-    "ooui-dialog-action-close": "Ябырға",
-    "ooui-outline-control-move-down": "Аҫҡа күсерергә",
-    "ooui-outline-control-move-up": "Өҫкә күсерергә"
-}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/bcl.json b/resources/oojs-ui/i18n/bcl.json
deleted file mode 100644 (file)
index aff451e..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-    "@metadata": {
-        "authors": [
-            "Geopoet",
-            "Sky Harbor"
-        ]
-    },
-    "ooui-dialog-action-close": "Seraduhon",
-    "ooui-outline-control-move-down": "Balyuhon an aytem paibaba",
-    "ooui-outline-control-move-up": "Balyuhon an aytem paitaas",
-    "ooui-toolbar-more": "Kadugangan"
-}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/be-tarask.json b/resources/oojs-ui/i18n/be-tarask.json
deleted file mode 100644 (file)
index 5922f61..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-{
-    "@metadata": {
-        "authors": [
-            "EugeneZelenko",
-            "Wizardist",
-            "Чаховіч Уладзіслаў",
-            "Zedlik"
-        ]
-    },
-    "ooui-dialog-action-close": "Закрыць",
-    "ooui-outline-control-move-down": "Перасунуць ніжэй",
-    "ooui-outline-control-move-up": "Перасунуць вышэй",
-    "ooui-toolbar-more": "Болей"
-}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/be.json b/resources/oojs-ui/i18n/be.json
deleted file mode 100644 (file)
index 3058ab8..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-{
-    "@metadata": {
-        "authors": [
-            "Чаховіч Уладзіслаў"
-        ]
-    },
-    "ooui-dialog-action-close": "Закрыць"
-}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/bg.json b/resources/oojs-ui/i18n/bg.json
deleted file mode 100644 (file)
index 939719b..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-{
-    "@metadata": {
-        "authors": [
-            "DCLXVI",
-            "Hristofor.mirchev",
-            "පසිඳු කාවින්ද",
-            "Mitzev"
-        ]
-    },
-    "ooui-dialog-action-close": "Затваряне",
-    "ooui-outline-control-remove": "Премахване на обекти",
-    "ooui-toolbar-more": "Още"
-}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/bn.json b/resources/oojs-ui/i18n/bn.json
deleted file mode 100644 (file)
index c321ab1..0000000
+++ /dev/null
@@ -1,16 +0,0 @@
-{
-    "@metadata": {
-        "authors": [
-            "Aftab1995",
-            "Bellayet",
-            "Jayantanth",
-            "Nasir8891",
-            "Runab",
-            "Sayak Sarkar"
-        ]
-    },
-    "ooui-dialog-action-close": "বন্ধ",
-    "ooui-outline-control-move-down": "আইটেম নিচে স্থানান্তর",
-    "ooui-outline-control-move-up": "আইটেম উপরে স্থানান্তর",
-    "ooui-toolbar-more": "আরও"
-}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/br.json b/resources/oojs-ui/i18n/br.json
deleted file mode 100644 (file)
index 38eb9e8..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-    "@metadata": {
-        "authors": [
-            "Fohanno",
-            "Fulup",
-            "Y-M D"
-        ]
-    },
-    "ooui-dialog-action-close": "Serriñ",
-    "ooui-outline-control-move-down": "Lakaat an elfenn da ziskenn",
-    "ooui-outline-control-move-up": "Lakaat an elfenn da bignat"
-}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/bs.json b/resources/oojs-ui/i18n/bs.json
deleted file mode 100644 (file)
index 95ba48d..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-    "@metadata": {
-        "authors": [
-            "DzWiki"
-        ]
-    },
-    "ooui-dialog-action-close": "Zatvori",
-    "ooui-outline-control-move-down": "Premjesti stavku dole",
-    "ooui-outline-control-move-up": "Premjesti stavku gore",
-    "ooui-outline-control-remove": "Ukloni stavku",
-    "ooui-toolbar-more": "Više"
-}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/ca.json b/resources/oojs-ui/i18n/ca.json
deleted file mode 100644 (file)
index 61bb1f6..0000000
+++ /dev/null
@@ -1,17 +0,0 @@
-{
-    "@metadata": {
-        "authors": [
-            "Alvaro Vidal-Abarca",
-            "Amire80",
-            "Arnaugir",
-            "Pginer",
-            "QuimGil",
-            "SMP",
-            "Vriullop"
-        ]
-    },
-    "ooui-dialog-action-close": "Tanca",
-    "ooui-outline-control-move-down": "Baixa element",
-    "ooui-outline-control-move-up": "Puja element",
-    "ooui-toolbar-more": "Més"
-}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/ce.json b/resources/oojs-ui/i18n/ce.json
deleted file mode 100644 (file)
index ff14ff3..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-{
-    "@metadata": {
-        "authors": [
-            "Amire80",
-            "Умар"
-        ]
-    },
-    "ooui-dialog-action-close": "ДӀачӀагӀа",
-    "ooui-outline-control-move-down": "Лаха яккха элемент",
-    "ooui-outline-control-move-up": "Лаккха яккха элемент",
-    "ooui-outline-control-remove": "ДӀадаха меттиг",
-    "ooui-toolbar-more": "Кхин тӀе"
-}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/ckb.json b/resources/oojs-ui/i18n/ckb.json
deleted file mode 100644 (file)
index 839f4a8..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-{
-    "@metadata": {
-        "authors": [
-            "Calak",
-            "Muhammed taha"
-        ]
-    },
-    "ooui-dialog-action-close": "دایخە"
-}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/co.json b/resources/oojs-ui/i18n/co.json
deleted file mode 100644 (file)
index e5edb21..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-{
-    "@metadata": {
-        "authors": [
-            "Paulu"
-        ]
-    },
-    "ooui-dialog-action-close": "Chjude",
-    "ooui-outline-control-move-down": "Fà falà l'ogettu",
-    "ooui-outline-control-move-up": "Fà cullà l'ogettu"
-}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/cs.json b/resources/oojs-ui/i18n/cs.json
deleted file mode 100644 (file)
index 670073f..0000000
+++ /dev/null
@@ -1,21 +0,0 @@
-{
-    "@metadata": {
-        "authors": [
-            "Chmee2",
-            "Jkjk",
-            "Juandev",
-            "Koo6",
-            "Littledogboy",
-            "Michaelbrabec",
-            "Mormegil",
-            "Polda18",
-            "Tchoř",
-            "ශ්වෙත"
-        ]
-    },
-    "ooui-dialog-action-close": "Zavřít",
-    "ooui-outline-control-move-down": "Přesunout položku dolů",
-    "ooui-outline-control-move-up": "Přesunout položku nahoru",
-    "ooui-outline-control-remove": "Odstranit položku",
-    "ooui-toolbar-more": "Další"
-}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/cu.json b/resources/oojs-ui/i18n/cu.json
deleted file mode 100644 (file)
index 55594c1..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-{
-    "@metadata": {
-        "authors": [
-            "ОйЛ"
-        ]
-    },
-    "ooui-dialog-action-close": "ꙁакрꙑи",
-    "ooui-toolbar-more": "вѧщє"
-}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/cy.json b/resources/oojs-ui/i18n/cy.json
deleted file mode 100644 (file)
index d37912d..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-{
-    "@metadata": {
-        "authors": [
-            "Lloffiwr",
-            "Robin Owain",
-            "ОйЛ"
-        ]
-    },
-    "ooui-dialog-action-close": "Caeer",
-    "ooui-outline-control-move-down": "Symud yr eitem lawr",
-    "ooui-outline-control-move-up": "Symud yr eitem lan",
-    "ooui-toolbar-more": "Rhagor"
-}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/da.json b/resources/oojs-ui/i18n/da.json
deleted file mode 100644 (file)
index bf47bcb..0000000
+++ /dev/null
@@ -1,17 +0,0 @@
-{
-    "@metadata": {
-        "authors": [
-            "Cgtdk",
-            "Christian List",
-            "EileenSanda",
-            "Laketown",
-            "Palnatoke",
-            "Simeondahl",
-            "Tehnix"
-        ]
-    },
-    "ooui-dialog-action-close": "Luk",
-    "ooui-outline-control-move-down": "Flyt ned",
-    "ooui-outline-control-move-up": "Flyt op",
-    "ooui-toolbar-more": "Mere"
-}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/de.json b/resources/oojs-ui/i18n/de.json
deleted file mode 100644 (file)
index bed2b2c..0000000
+++ /dev/null
@@ -1,21 +0,0 @@
-{
-    "@metadata": {
-        "authors": [
-            "APPER",
-            "G.Hagedorn",
-            "Inkowik",
-            "Jcornelius",
-            "Jdforrester",
-            "Kghbln",
-            "Metalhead64",
-            "Murma174",
-            "Se4598",
-            "Tomabrafix"
-        ]
-    },
-    "ooui-dialog-action-close": "Schließen",
-    "ooui-outline-control-move-down": "Element nach unten verschieben",
-    "ooui-outline-control-move-up": "Element nach oben verschieben",
-    "ooui-outline-control-remove": "Element entfernen",
-    "ooui-toolbar-more": "Mehr"
-}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/diq.json b/resources/oojs-ui/i18n/diq.json
deleted file mode 100644 (file)
index bb0ac35..0000000
+++ /dev/null
@@ -1,16 +0,0 @@
-{
-    "@metadata": {
-        "authors": [
-            "Erdemaslancan",
-            "Gorizon",
-            "Kghbln",
-            "Marmase",
-            "Mirzali",
-            "Se4598"
-        ]
-    },
-    "ooui-dialog-action-close": "Racnê",
-    "ooui-outline-control-move-down": "Bendi bere cêr",
-    "ooui-outline-control-move-up": "Bendi bere cor",
-    "ooui-toolbar-more": "Zewbi"
-}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/dsb.json b/resources/oojs-ui/i18n/dsb.json
deleted file mode 100644 (file)
index 0f47587..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-{
-    "@metadata": {
-        "authors": [
-            "Michawiki"
-        ]
-    },
-    "ooui-dialog-action-close": "Zacyniś",
-    "ooui-outline-control-move-down": "Element dołoj pśesunuś",
-    "ooui-outline-control-move-up": "Element górjej pśesunuś",
-    "ooui-toolbar-more": "Wěcej"
-}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/el.json b/resources/oojs-ui/i18n/el.json
deleted file mode 100644 (file)
index 66051f1..0000000
+++ /dev/null
@@ -1,18 +0,0 @@
-{
-    "@metadata": {
-        "authors": [
-            "Astralnet",
-            "Dipa1965",
-            "Evropi",
-            "FocalPoint",
-            "Geraki",
-            "Glavkos",
-            "Nikosguard",
-            "Tifa93"
-        ]
-    },
-    "ooui-dialog-action-close": "Κλείσιμο",
-    "ooui-outline-control-move-down": "Μετακίνηση προς τα κάτω",
-    "ooui-outline-control-move-up": "Μετακίνηση προς τα πάνω",
-    "ooui-toolbar-more": "Περισσότερα"
-}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/eml.json b/resources/oojs-ui/i18n/eml.json
deleted file mode 100644 (file)
index 5dd09f5..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-    "@metadata": {
-        "authors": [
-            "Gloria sah",
-            "Lévi"
-        ]
-    },
-    "ooui-dialog-action-close": "Sèra",
-    "ooui-outline-control-move-down": "Spôsta in bâs",
-    "ooui-outline-control-move-up": "Spôsta in êlt",
-    "ooui-toolbar-more": "Êter"
-}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/en.json b/resources/oojs-ui/i18n/en.json
deleted file mode 100644 (file)
index 5ff9915..0000000
+++ /dev/null
@@ -1,24 +0,0 @@
-{
-    "@metadata": {
-        "authors": [
-            "Trevor Parscal",
-            "Ed Sanders",
-            "James D. Forrester",
-            "Raimond Spekking",
-            "Erik Moeller",
-            "Moriel Schottlender",
-            "Yuki Shira",
-            "Siebrand Mazeland",
-            "Rob Moen",
-            "Timo Tijhof",
-            "Roan Kattouw",
-            "Christian Williams",
-            "Amir E. Aharoni"
-        ]
-    },
-    "ooui-dialog-action-close": "Close",
-    "ooui-outline-control-move-down": "Move item down",
-    "ooui-outline-control-move-up": "Move item up",
-    "ooui-outline-control-remove": "Remove item",
-    "ooui-toolbar-more": "More"
-}
diff --git a/resources/oojs-ui/i18n/eo.json b/resources/oojs-ui/i18n/eo.json
deleted file mode 100644 (file)
index 51f3261..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-{
-    "@metadata": {
-        "authors": [
-            "Happy5214",
-            "KuboF",
-            "Shirayuki",
-            "Yekrats"
-        ]
-    },
-    "ooui-dialog-action-close": "Fermi",
-    "ooui-outline-control-move-down": "Movi eron suben",
-    "ooui-outline-control-move-up": "Movi eron supren",
-    "ooui-toolbar-more": "Pli"
-}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/es.json b/resources/oojs-ui/i18n/es.json
deleted file mode 100644 (file)
index eb53138..0000000
+++ /dev/null
@@ -1,24 +0,0 @@
-{
-    "@metadata": {
-        "authors": [
-            "Armando-Martin",
-            "Aruizdr",
-            "Benfutbol10",
-            "DJ Nietzsche",
-            "Erdemaslancan",
-            "Fitoschido",
-            "Imre",
-            "Invadinado",
-            "Jdforrester",
-            "Jduranboger",
-            "PoLuX124",
-            "Ralgis",
-            "Thehelpfulone"
-        ]
-    },
-    "ooui-dialog-action-close": "Cerrar",
-    "ooui-outline-control-move-down": "Mover abajo",
-    "ooui-outline-control-move-up": "Mover arriba",
-    "ooui-outline-control-remove": "Eliminar elemento",
-    "ooui-toolbar-more": "Más"
-}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/et.json b/resources/oojs-ui/i18n/et.json
deleted file mode 100644 (file)
index aa780e4..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-{
-    "@metadata": {
-        "authors": [
-            "Avjoska",
-            "Pikne"
-        ]
-    },
-    "ooui-dialog-action-close": "Sule",
-    "ooui-outline-control-move-down": "Liiguta üksust allapoole",
-    "ooui-outline-control-move-up": "Liiguta üksust ülespoole",
-    "ooui-outline-control-remove": "Eemalda üksus",
-    "ooui-toolbar-more": "Veel"
-}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/eu.json b/resources/oojs-ui/i18n/eu.json
deleted file mode 100644 (file)
index 5d3f08b..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-{
-    "@metadata": {
-        "authors": [
-            "An13sa",
-            "Unai Fdz. de Betoño",
-            "Xabier Armendaritz"
-        ]
-    },
-    "ooui-dialog-action-close": "Itxi",
-    "ooui-outline-control-move-down": "Mugitu itema beherantz",
-    "ooui-outline-control-move-up": "Mugitu itema gorantz",
-    "ooui-toolbar-more": "Gehiago"
-}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/fa.json b/resources/oojs-ui/i18n/fa.json
deleted file mode 100644 (file)
index 3f1ad0c..0000000
+++ /dev/null
@@ -1,21 +0,0 @@
-{
-    "@metadata": {
-        "authors": [
-            "Dalba",
-            "Ebraminio",
-            "Jdforrester",
-            "Ladsgroup",
-            "Mjbmr",
-            "Nojan Madinehi",
-            "Reza1615",
-            "Taha",
-            "درفش کاویانی",
-            "Armin1392"
-        ]
-    },
-    "ooui-dialog-action-close": "بستن",
-    "ooui-outline-control-move-down": "انتقال مورد به پایین",
-    "ooui-outline-control-move-up": "انتقال مورد به بالا",
-    "ooui-outline-control-remove": "حذف مورد",
-    "ooui-toolbar-more": "بیشتر"
-}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/fi.json b/resources/oojs-ui/i18n/fi.json
deleted file mode 100644 (file)
index ce2f6d0..0000000
+++ /dev/null
@@ -1,24 +0,0 @@
-{
-    "@metadata": {
-        "authors": [
-            "Beluga",
-            "Crt",
-            "Harriv",
-            "Linnea",
-            "Nedergard",
-            "Nike",
-            "Olli",
-            "Pxos",
-            "Samoasambia",
-            "Silvonen",
-            "Skalman",
-            "Stryn",
-            "VezonThunder"
-        ]
-    },
-    "ooui-dialog-action-close": "Sulje",
-    "ooui-outline-control-move-down": "Siirrä kohdetta alaspäin",
-    "ooui-outline-control-move-up": "Siirrä kohdetta ylöspäin",
-    "ooui-outline-control-remove": "Poista kohde",
-    "ooui-toolbar-more": "Lisää"
-}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/fo.json b/resources/oojs-ui/i18n/fo.json
deleted file mode 100644 (file)
index 00a48ff..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-{
-    "@metadata": {
-        "authors": [
-            "EileenSanda"
-        ]
-    },
-    "ooui-dialog-action-close": "Lat aftur",
-    "ooui-outline-control-move-down": "Flyt lutin niður",
-    "ooui-outline-control-move-up": "Flyt lutin upp",
-    "ooui-toolbar-more": "Meira"
-}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/fr.json b/resources/oojs-ui/i18n/fr.json
deleted file mode 100644 (file)
index 7674d2f..0000000
+++ /dev/null
@@ -1,36 +0,0 @@
-{
-    "@metadata": {
-        "authors": [
-            "Automatik",
-            "Benoit Rochon",
-            "Boniface",
-            "Brunoperel",
-            "Crochet.david",
-            "DavidL",
-            "Dereckson",
-            "Gomoko",
-            "Guillom",
-            "Hello71",
-            "Jean-Frédéric",
-            "Linedwell",
-            "Ltrlg",
-            "Metroitendo",
-            "NemesisIII",
-            "Nicolas NALLET",
-            "Npettiaux",
-            "Rastus Vernon",
-            "Seb35",
-            "Sherbrooke",
-            "Tpt",
-            "Trizek",
-            "Urhixidur",
-            "Verdy p",
-            "Wyz"
-        ]
-    },
-    "ooui-dialog-action-close": "Fermer",
-    "ooui-outline-control-move-down": "Faire descendre l’élément",
-    "ooui-outline-control-move-up": "Faire monter l’élément",
-    "ooui-outline-control-remove": "Supprimer l’élément",
-    "ooui-toolbar-more": "Plus"
-}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/frr.json b/resources/oojs-ui/i18n/frr.json
deleted file mode 100644 (file)
index adf8ce8..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-{
-    "@metadata": {
-        "authors": [
-            "ChrisPtDe",
-            "Murma174"
-        ]
-    },
-    "ooui-dialog-action-close": "Slütj",
-    "ooui-outline-control-move-down": "Element efter onern sküüw",
-    "ooui-outline-control-move-up": "Element efter boowen sküüw",
-    "ooui-outline-control-remove": "Element wechnem",
-    "ooui-toolbar-more": "Muar"
-}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/fur.json b/resources/oojs-ui/i18n/fur.json
deleted file mode 100644 (file)
index 18ea383..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-    "@metadata": {
-        "authors": [
-            "Klenje",
-            "Tocaibon"
-        ]
-    },
-    "ooui-dialog-action-close": "Siere",
-    "ooui-outline-control-move-down": "sposte sot",
-    "ooui-outline-control-move-up": "sposte in su",
-    "ooui-toolbar-more": "Altri"
-}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/gl.json b/resources/oojs-ui/i18n/gl.json
deleted file mode 100644 (file)
index a029456..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-{
-    "@metadata": {
-        "authors": [
-            "Alison",
-            "Kscanne",
-            "Toliño"
-        ]
-    },
-    "ooui-dialog-action-close": "Pechar",
-    "ooui-outline-control-move-down": "Mover o elemento abaixo",
-    "ooui-outline-control-move-up": "Mover o elemento arriba",
-    "ooui-outline-control-remove": "Eliminar o elemento",
-    "ooui-toolbar-more": "Máis"
-}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/gu.json b/resources/oojs-ui/i18n/gu.json
deleted file mode 100644 (file)
index ccabf8d..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-{
-    "@metadata": {
-        "authors": [
-            "Ashok modhvadia",
-            "KartikMistry",
-            "The Discoverer"
-        ]
-    },
-    "ooui-dialog-action-close": "બંધ કરો",
-    "ooui-outline-control-move-down": "વસ્તુ નીચે ખસેડો",
-    "ooui-outline-control-move-up": "વસ્તુ ઉપર ખસેડો",
-    "ooui-outline-control-remove": "વસ્તુ હટાવો",
-    "ooui-toolbar-more": "વધુ"
-}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/he.json b/resources/oojs-ui/i18n/he.json
deleted file mode 100644 (file)
index 404dc82..0000000
+++ /dev/null
@@ -1,23 +0,0 @@
-{
-    "@metadata": {
-        "authors": [
-            "Amire80",
-            "ExampleTomer",
-            "Guycn2",
-            "Matanya",
-            "Mooeypoo",
-            "Orsa",
-            "Shimmin Beg",
-            "אור שפירא",
-            "חיים",
-            "ערן",
-            "פוילישער",
-            "קיפודנחש"
-        ]
-    },
-    "ooui-dialog-action-close": "סגירה",
-    "ooui-outline-control-move-down": "להזיז את הפריט מטה",
-    "ooui-outline-control-move-up": "להזיז את הפריט מעלה",
-    "ooui-outline-control-remove": "הסרת פריט",
-    "ooui-toolbar-more": "עוד"
-}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/hi.json b/resources/oojs-ui/i18n/hi.json
deleted file mode 100644 (file)
index 3c41b3e..0000000
+++ /dev/null
@@ -1,16 +0,0 @@
-{
-    "@metadata": {
-        "authors": [
-            "Ansumang",
-            "Devayon",
-            "Rajesh",
-            "Siddhartha Ghai",
-            "Goelujjwal"
-        ]
-    },
-    "ooui-dialog-action-close": "बंद करें",
-    "ooui-outline-control-move-down": "प्रविष्टि नीचे ले जाएँ",
-    "ooui-outline-control-move-up": "प्रविष्टि ऊपर ले जाएँ",
-    "ooui-outline-control-remove": "आइटम हटाएँ",
-    "ooui-toolbar-more": "अधिक"
-}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/hr.json b/resources/oojs-ui/i18n/hr.json
deleted file mode 100644 (file)
index 1c3f925..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-{
-    "@metadata": {
-        "authors": [
-            "MaGa",
-            "Roberta F.",
-            "SpeedyGonsales"
-        ]
-    },
-    "ooui-dialog-action-close": "zatvori",
-    "ooui-outline-control-move-down": "Premjesti stavku dolje",
-    "ooui-outline-control-move-up": "Premjesti stavku gore",
-    "ooui-toolbar-more": "Više mogućnosti"
-}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/hsb.json b/resources/oojs-ui/i18n/hsb.json
deleted file mode 100644 (file)
index f674cd2..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-{
-    "@metadata": {
-        "authors": [
-            "J budissin",
-            "Michawiki"
-        ]
-    },
-    "ooui-dialog-action-close": "Začinić",
-    "ooui-outline-control-move-down": "Zapisk dele přesunyć",
-    "ooui-outline-control-move-up": "Zapisk horje přesunyć",
-    "ooui-outline-control-remove": "Zapisk wotstronić",
-    "ooui-toolbar-more": "Wjace"
-}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/hu.json b/resources/oojs-ui/i18n/hu.json
deleted file mode 100644 (file)
index b2cf2c0..0000000
+++ /dev/null
@@ -1,16 +0,0 @@
-{
-    "@metadata": {
-        "authors": [
-            "Dj",
-            "Einstein2",
-            "Misibacsi",
-            "ViDam",
-            "Tacsipacsi"
-        ]
-    },
-    "ooui-dialog-action-close": "Bezár",
-    "ooui-outline-control-move-down": "Elem mozgatása lefelé",
-    "ooui-outline-control-move-up": "Elem mozgatása felfelé",
-    "ooui-outline-control-remove": "Elem eltávolítása",
-    "ooui-toolbar-more": "Tovább..."
-}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/hy.json b/resources/oojs-ui/i18n/hy.json
deleted file mode 100644 (file)
index 4cb8821..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-{
-    "@metadata": {
-        "authors": [
-            "Vacio",
-            "Xelgen"
-        ]
-    },
-    "ooui-dialog-action-close": "Փակել",
-    "ooui-outline-control-move-down": "Իջեցնել կետը",
-    "ooui-outline-control-move-up": "Բարձրացնել կետը",
-    "ooui-outline-control-remove": "Հեռացնել տարրը",
-    "ooui-toolbar-more": "Ավելին"
-}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/ia.json b/resources/oojs-ui/i18n/ia.json
deleted file mode 100644 (file)
index e335553..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-{
-    "@metadata": {
-        "authors": [
-            "McDutchie"
-        ]
-    },
-    "ooui-dialog-action-close": "Clauder"
-}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/id.json b/resources/oojs-ui/i18n/id.json
deleted file mode 100644 (file)
index 6d3ba4d..0000000
+++ /dev/null
@@ -1,18 +0,0 @@
-{
-    "@metadata": {
-        "authors": [
-            "Farras",
-            "Ilham151096",
-            "Iwan Novirion",
-            "Iyan",
-            "Kenrick95",
-            "McDutchie",
-            "Rv77ax",
-            "William Surya Permana"
-        ]
-    },
-    "ooui-dialog-action-close": "Tutup",
-    "ooui-outline-control-move-down": "Pindahkan butir ke bawah",
-    "ooui-outline-control-move-up": "Pindahkan butir ke atas",
-    "ooui-toolbar-more": "Lainnya"
-}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/ie.json b/resources/oojs-ui/i18n/ie.json
deleted file mode 100644 (file)
index 84d002d..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-{
-    "@metadata": {
-        "authors": [
-            "Makuba"
-        ]
-    },
-    "ooui-dialog-action-close": "Terminar",
-    "ooui-outline-control-move-down": "Mover element a infra",
-    "ooui-outline-control-move-up": "Mover element a supra",
-    "ooui-toolbar-more": "Plu"
-}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/ilo.json b/resources/oojs-ui/i18n/ilo.json
deleted file mode 100644 (file)
index 838face..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-    "@metadata": {
-        "authors": [
-            "Lam-ang"
-        ]
-    },
-    "ooui-dialog-action-close": "Irekep",
-    "ooui-outline-control-move-down": "Ipababa ti banag",
-    "ooui-outline-control-move-up": "Ipangato ti banag",
-    "ooui-outline-control-remove": "Ikkaten ti banag",
-    "ooui-toolbar-more": "Adu pay"
-}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/is.json b/resources/oojs-ui/i18n/is.json
deleted file mode 100644 (file)
index fbdb5d1..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-    "@metadata": {
-        "authors": [
-            "Maxí",
-            "Snævar"
-        ]
-    },
-    "ooui-dialog-action-close": "Loka",
-    "ooui-outline-control-move-down": "Færa atriði niður",
-    "ooui-outline-control-move-up": "Færa atriði upp",
-    "ooui-toolbar-more": "Fleira"
-}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/it.json b/resources/oojs-ui/i18n/it.json
deleted file mode 100644 (file)
index 747ec79..0000000
+++ /dev/null
@@ -1,22 +0,0 @@
-{
-    "@metadata": {
-        "authors": [
-            "Beta16",
-            "Darth Kule",
-            "Doc.mari",
-            "Eleonora negri",
-            "Elitre",
-            "F. Cosoleto",
-            "FRacco",
-            "Gianfranco",
-            "Minerva Titani",
-            "Raoli",
-            "Una giornata uggiosa '94"
-        ]
-    },
-    "ooui-dialog-action-close": "Chiudi",
-    "ooui-outline-control-move-down": "Sposta in basso",
-    "ooui-outline-control-move-up": "Sposta in alto",
-    "ooui-outline-control-remove": "Rimuovi elemento",
-    "ooui-toolbar-more": "Altro"
-}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/ja.json b/resources/oojs-ui/i18n/ja.json
deleted file mode 100644 (file)
index c7c0851..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-{
-    "@metadata": {
-        "authors": [
-            "Fryed-peach",
-            "Miya",
-            "Penn Station",
-            "Shirayuki"
-        ]
-    },
-    "ooui-dialog-action-close": "閉じる",
-    "ooui-outline-control-move-down": "項目を下に移動させる",
-    "ooui-outline-control-move-up": "項目を上に移動させる",
-    "ooui-outline-control-remove": "項目を除去",
-    "ooui-toolbar-more": "その他"
-}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/jv.json b/resources/oojs-ui/i18n/jv.json
deleted file mode 100644 (file)
index a362079..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-{
-    "@metadata": {
-        "authors": [
-            "Gleki",
-            "NoiX180",
-            "Pras"
-        ]
-    },
-    "ooui-dialog-action-close": "Tutup",
-    "ooui-outline-control-move-down": "Pindhahaken butir mangandhap"
-}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/ka.json b/resources/oojs-ui/i18n/ka.json
deleted file mode 100644 (file)
index c9d2774..0000000
+++ /dev/null
@@ -1,18 +0,0 @@
-{
-    "@metadata": {
-        "authors": [
-            "BRUTE",
-            "David1010",
-            "Gleki",
-            "ITshnik",
-            "MIKHEIL",
-            "NoiX180",
-            "Pras",
-            "Tokoko"
-        ]
-    },
-    "ooui-dialog-action-close": "დახურვა",
-    "ooui-outline-control-move-down": "ელემენტის ქვემოთ გადატანა",
-    "ooui-outline-control-move-up": "ელემენტის ზემოთ გადატანა",
-    "ooui-toolbar-more": "მეტი"
-}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/kk-cyrl.json b/resources/oojs-ui/i18n/kk-cyrl.json
deleted file mode 100644 (file)
index df37fe3..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-    "@metadata": {
-        "authors": [
-            "Arystanbek"
-        ]
-    },
-    "ooui-dialog-action-close": "Жабу",
-    "ooui-outline-control-move-down": "Элементті төмен жылжыту",
-    "ooui-outline-control-move-up": "Элементті жоғары жылжыту",
-    "ooui-outline-control-remove": "Элементті алып тастау",
-    "ooui-toolbar-more": "толығырақ"
-}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/km.json b/resources/oojs-ui/i18n/km.json
deleted file mode 100644 (file)
index 2013ee3..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-{
-    "@metadata": {
-        "authors": [
-            "Sovichet"
-        ]
-    },
-    "ooui-dialog-action-close": "បិទ",
-    "ooui-outline-control-move-down": "រុញ​ទៅ​ក្រោម",
-    "ooui-outline-control-move-up": "រុញ​ទៅ​លើ",
-    "ooui-toolbar-more": "បន្ថែម"
-}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/kn.json b/resources/oojs-ui/i18n/kn.json
deleted file mode 100644 (file)
index 4932f6d..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-{
-    "@metadata": {
-        "authors": [
-            "Vikassy"
-        ]
-    },
-    "ooui-dialog-action-close": "ಮುಚ್ಚಿ",
-    "ooui-outline-control-remove": "ವಸ್ತು ತೆಗೆ",
-    "ooui-toolbar-more": "ಹೆಚ್ಚು"
-}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/ko.json b/resources/oojs-ui/i18n/ko.json
deleted file mode 100644 (file)
index 25749ce..0000000
+++ /dev/null
@@ -1,16 +0,0 @@
-{
-    "@metadata": {
-        "authors": [
-            "Freebiekr",
-            "Hym411",
-            "Kwj2772",
-            "LFM",
-            "아라"
-        ]
-    },
-    "ooui-dialog-action-close": "닫기",
-    "ooui-outline-control-move-down": "항목을 아래로 옮기기",
-    "ooui-outline-control-move-up": "항목을 위로 옮기기",
-    "ooui-outline-control-remove": "항목 지우기",
-    "ooui-toolbar-more": "더 보기"
-}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/krc.json b/resources/oojs-ui/i18n/krc.json
deleted file mode 100644 (file)
index f629139..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-{
-    "@metadata": {
-        "authors": [
-            "Iltever"
-        ]
-    },
-    "ooui-dialog-action-close": "Джаб",
-    "ooui-outline-control-move-down": "Элементни тюбюне кёчюр",
-    "ooui-outline-control-move-up": "Элементни башына кёчюр"
-}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/kw.json b/resources/oojs-ui/i18n/kw.json
deleted file mode 100644 (file)
index 95a9b91..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-{
-    "@metadata": {
-        "authors": [
-            "George Animal",
-            "Nrowe",
-            "Purodha"
-        ]
-    },
-    "ooui-dialog-action-close": "Degea"
-}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/ky.json b/resources/oojs-ui/i18n/ky.json
deleted file mode 100644 (file)
index 2d62bda..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-    "@metadata": {
-        "authors": [
-            "Chorobek",
-            "George Animal",
-            "Nrowe",
-            "Tynchtyk Chorotegin",
-            "Викиней"
-        ]
-    },
-    "ooui-dialog-action-close": "Жабуу"
-}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/lb.json b/resources/oojs-ui/i18n/lb.json
deleted file mode 100644 (file)
index 6359026..0000000
+++ /dev/null
@@ -1,18 +0,0 @@
-{
-    "@metadata": {
-        "authors": [
-            "Autokrator",
-            "Chorobek",
-            "Robby",
-            "Soued031",
-            "Tynchtyk Chorotegin",
-            "UV",
-            "Викиней"
-        ]
-    },
-    "ooui-dialog-action-close": "Zoumaachen",
-    "ooui-outline-control-move-down": "Element erof réckelen",
-    "ooui-outline-control-move-up": "Element erop réckelen",
-    "ooui-outline-control-remove": "Element ewechhuelen",
-    "ooui-toolbar-more": "Méi"
-}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/lmo.json b/resources/oojs-ui/i18n/lmo.json
deleted file mode 100644 (file)
index e506b7a..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-{
-    "@metadata": {
-        "authors": [
-            "Ninonino"
-        ]
-    },
-    "ooui-dialog-action-close": "Sèra",
-    "ooui-outline-control-move-down": "Spòsta 'n zó",
-    "ooui-outline-control-move-up": "Spòsta 'n sö",
-    "ooui-toolbar-more": "Amò"
-}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/lt.json b/resources/oojs-ui/i18n/lt.json
deleted file mode 100644 (file)
index db679bc..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-{
-    "@metadata": {
-        "authors": [
-            "Audriusa",
-            "Eitvys200",
-            "Mantak111"
-        ]
-    },
-    "ooui-dialog-action-close": "Uždaryti",
-    "ooui-outline-control-remove": "Šalinti elementus"
-}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/lv.json b/resources/oojs-ui/i18n/lv.json
deleted file mode 100644 (file)
index c633339..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-{
-    "@metadata": {
-        "authors": [
-            "Admresdeserv.",
-            "Audriusa",
-            "Eitvys200",
-            "Papuass",
-            "PeterisP"
-        ]
-    },
-    "ooui-dialog-action-close": "Aizvērt",
-    "ooui-outline-control-move-down": "Pārvietot vienumu uz leju",
-    "ooui-outline-control-move-up": "Pārvietot vienumu uz augšu",
-    "ooui-toolbar-more": "Vairāk"
-}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/mg.json b/resources/oojs-ui/i18n/mg.json
deleted file mode 100644 (file)
index dcb5fd5..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-{
-    "@metadata": {
-        "authors": [
-            "Jagwar"
-        ]
-    },
-    "ooui-dialog-action-close": "Hidiana"
-}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/min.json b/resources/oojs-ui/i18n/min.json
deleted file mode 100644 (file)
index 55174c0..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-{
-    "@metadata": {
-        "authors": [
-            "Iwan Novirion",
-            "Jagwar"
-        ]
-    },
-    "ooui-dialog-action-close": "Tutuik"
-}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/mk.json b/resources/oojs-ui/i18n/mk.json
deleted file mode 100644 (file)
index 22fd037..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-{
-    "@metadata": {
-        "authors": [
-            "Bjankuloski06",
-            "Brest",
-            "Iwan Novirion"
-        ]
-    },
-    "ooui-dialog-action-close": "Затвори",
-    "ooui-outline-control-move-down": "Помести надолу",
-    "ooui-outline-control-move-up": "Помести нагоре",
-    "ooui-outline-control-remove": "Отстрани ставка",
-    "ooui-toolbar-more": "Повеќе"
-}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/ml.json b/resources/oojs-ui/i18n/ml.json
deleted file mode 100644 (file)
index 355e337..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-{
-    "@metadata": {
-        "authors": [
-            "Kavya Manohar",
-            "Praveenp",
-            "Santhosh.thottingal",
-            "Vssun"
-        ]
-    },
-    "ooui-dialog-action-close": "അടയ്ക്കുക",
-    "ooui-outline-control-move-down": "ഇനം താഴേയ്ക്ക് മാറ്റുക",
-    "ooui-outline-control-move-up": "ഇനം മുകളിലേയ്ക്ക് മാറ്റുക",
-    "ooui-toolbar-more": "കൂടുതൽ"
-}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/mr.json b/resources/oojs-ui/i18n/mr.json
deleted file mode 100644 (file)
index d4db84f..0000000
+++ /dev/null
@@ -1,16 +0,0 @@
-{
-    "@metadata": {
-        "authors": [
-            "Kaajawa",
-            "Mahitgar",
-            "Praju23",
-            "V.narsikar",
-            "Ydyashad",
-            "संतोष दहिवळ"
-        ]
-    },
-    "ooui-dialog-action-close": "बंद करा",
-    "ooui-outline-control-move-down": "घटक (आयटम) खाली सरकवा",
-    "ooui-outline-control-move-up": "घटक (आयटम) वर सरकवा",
-    "ooui-toolbar-more": "अधिक"
-}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/ms.json b/resources/oojs-ui/i18n/ms.json
deleted file mode 100644 (file)
index 21aef50..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-    "@metadata": {
-        "authors": [
-            "Anakmalaysia",
-            "Aurora"
-        ]
-    },
-    "ooui-dialog-action-close": "Tutup",
-    "ooui-outline-control-move-down": "Alihkan perkara ke bawah",
-    "ooui-outline-control-move-up": "Alihkan perkara ke atas",
-    "ooui-toolbar-more": "Lagi"
-}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/nap.json b/resources/oojs-ui/i18n/nap.json
deleted file mode 100644 (file)
index 6b0b3ec..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-{
-    "@metadata": {
-        "authors": [
-            "Chelin",
-            "Chrisportelli",
-            "PiRSquared17"
-        ]
-    },
-    "ooui-dialog-action-close": "Chiure",
-    "ooui-toolbar-more": "Atro"
-}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/nb.json b/resources/oojs-ui/i18n/nb.json
deleted file mode 100644 (file)
index 7cdecaa..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-{
-    "@metadata": {
-        "authors": [
-            "Danmichaelo",
-            "Event",
-            "Jeblad",
-            "Laaknor",
-            "Njardarlogar"
-        ]
-    },
-    "ooui-dialog-action-close": "Lukk",
-    "ooui-outline-control-move-down": "Flytt ned",
-    "ooui-outline-control-move-up": "Flytt opp",
-    "ooui-toolbar-more": "Mer"
-}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/nds-nl.json b/resources/oojs-ui/i18n/nds-nl.json
deleted file mode 100644 (file)
index 81f8a43..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-{
-    "@metadata": {
-        "authors": [
-            "Servien"
-        ]
-    },
-    "ooui-dialog-action-close": "Sluten",
-    "ooui-outline-control-move-down": "Onderwarp ummeneer zetten",
-    "ooui-outline-control-move-up": "Onderwarp umhoge zetten"
-}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/nds.json b/resources/oojs-ui/i18n/nds.json
deleted file mode 100644 (file)
index d0806d0..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-{
-    "@metadata": {
-        "authors": [
-            "Zylbath"
-        ]
-    },
-    "ooui-dialog-action-close": "Dichtmaken",
-    "ooui-outline-control-move-down": "Element na ünnen schuven",
-    "ooui-outline-control-move-up": "Element na baven schuven",
-    "ooui-toolbar-more": "Mehr"
-}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/ne.json b/resources/oojs-ui/i18n/ne.json
deleted file mode 100644 (file)
index ae948c6..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-{
-    "@metadata": {
-        "authors": [
-            "RajeshPandey",
-            "सरोज कुमार ढकाल"
-        ]
-    }
-}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/nl.json b/resources/oojs-ui/i18n/nl.json
deleted file mode 100644 (file)
index 549fad2..0000000
+++ /dev/null
@@ -1,27 +0,0 @@
-{
-    "@metadata": {
-        "authors": [
-            "Bluyten",
-            "Breghtje",
-            "Catrope",
-            "Flightmare",
-            "Hansmuller",
-            "Jdforrester",
-            "Keegan",
-            "Konovalov",
-            "RajeshPandey",
-            "Romaine",
-            "SPQRobin",
-            "Saruman",
-            "Siebrand",
-            "Southparkfan",
-            "सरोज कुमार ढकाल",
-            "Sjoerddebruin"
-        ]
-    },
-    "ooui-dialog-action-close": "Sluiten",
-    "ooui-outline-control-move-down": "Item omlaag verplaatsen",
-    "ooui-outline-control-move-up": "Item omhoog verplaatsen",
-    "ooui-outline-control-remove": "Item verwijderen",
-    "ooui-toolbar-more": "Meer"
-}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/nn.json b/resources/oojs-ui/i18n/nn.json
deleted file mode 100644 (file)
index dd86f5e..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-    "@metadata": {
-        "authors": [
-            "Jeblad",
-            "Njardarlogar"
-        ]
-    },
-    "ooui-dialog-action-close": "Lat att",
-    "ooui-outline-control-move-down": "Flytt element ned",
-    "ooui-outline-control-move-up": "Flytt element opp",
-    "ooui-toolbar-more": "Fleire"
-}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/om.json b/resources/oojs-ui/i18n/om.json
deleted file mode 100644 (file)
index cd22c40..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-{
-    "@metadata": {
-        "authors": [
-            "Cedric31",
-            "Tumsaa"
-        ]
-    },
-    "ooui-dialog-action-close": "Cufi",
-    "ooui-outline-control-move-down": "Gad buusi",
-    "ooui-outline-control-move-up": "Ol baasi",
-    "ooui-outline-control-remove": "Balleessi",
-    "ooui-toolbar-more": "Dabalata"
-}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/or.json b/resources/oojs-ui/i18n/or.json
deleted file mode 100644 (file)
index 35721a1..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-{
-    "@metadata": {
-        "authors": [
-            "Odisha1",
-            "Psubhashish",
-            "ଶିତିକଣ୍ଠ ଦାଶ"
-        ]
-    },
-    "ooui-dialog-action-close": "ବନ୍ଦ କରିବେ"
-}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/pa.json b/resources/oojs-ui/i18n/pa.json
deleted file mode 100644 (file)
index 6c76d7f..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-{
-    "@metadata": {
-        "authors": [
-            "Amikeco",
-            "Babanwalia",
-            "Bouron",
-            "Nasir8891"
-        ]
-    },
-    "ooui-dialog-action-close": "বন্ধ"
-}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/pfl.json b/resources/oojs-ui/i18n/pfl.json
deleted file mode 100644 (file)
index 40cc15d..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-    "@metadata": {
-        "authors": [
-            "Manuae"
-        ]
-    },
-    "ooui-dialog-action-close": "Schließe",
-    "ooui-outline-control-move-down": "Bweeschs nunna",
-    "ooui-outline-control-move-up": "Bweeschs nuff",
-    "ooui-outline-control-remove": "Leschs",
-    "ooui-toolbar-more": "Mea"
-}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/pl.json b/resources/oojs-ui/i18n/pl.json
deleted file mode 100644 (file)
index 33ff886..0000000
+++ /dev/null
@@ -1,24 +0,0 @@
-{
-    "@metadata": {
-        "authors": [
-            "Babanwalia",
-            "Chrumps",
-            "Matma Rex",
-            "Mikołka",
-            "Nasir8891",
-            "Odie2",
-            "Rzuwig",
-            "Tar Lócesilion",
-            "Ty221",
-            "WTM",
-            "Woytecr",
-            "Wpedzich",
-            "Jacenty359"
-        ]
-    },
-    "ooui-dialog-action-close": "Zamknij",
-    "ooui-outline-control-move-down": "Przenieś niżej",
-    "ooui-outline-control-move-up": "Przenieś wyżej",
-    "ooui-outline-control-remove": "Usuń element",
-    "ooui-toolbar-more": "Więcej"
-}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/pms.json b/resources/oojs-ui/i18n/pms.json
deleted file mode 100644 (file)
index bb8f113..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-{
-    "@metadata": {
-        "authors": [
-            "Borichèt",
-            "Dragonòt",
-            "පසිඳු කාවින්ද"
-        ]
-    },
-    "ooui-dialog-action-close": "Saré",
-    "ooui-outline-control-move-down": "Fé calé giù l'element",
-    "ooui-outline-control-move-up": "Fé monté l'element",
-    "ooui-toolbar-more": "Ëd pi"
-}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/ps.json b/resources/oojs-ui/i18n/ps.json
deleted file mode 100644 (file)
index 4f21707..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-{
-    "@metadata": {
-        "authors": [
-            "Ahmed-Najib-Biabani-Ibrahimkhel"
-        ]
-    },
-    "ooui-dialog-action-close": "تړل",
-    "ooui-outline-control-move-down": "توکی ښکته راوړل",
-    "ooui-outline-control-move-up": "توکی پورته راوړل",
-    "ooui-toolbar-more": "نور"
-}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/pt-br.json b/resources/oojs-ui/i18n/pt-br.json
deleted file mode 100644 (file)
index f758660..0000000
+++ /dev/null
@@ -1,19 +0,0 @@
-{
-    "@metadata": {
-        "authors": [
-            "Cainamarques",
-            "Dianakc",
-            "Fúlvio",
-            "Helder.wiki",
-            "HenriqueCrang",
-            "Jaideraf",
-            "Luckas",
-            "OTAVIO1981",
-            555
-        ]
-    },
-    "ooui-dialog-action-close": "Fechar",
-    "ooui-outline-control-move-down": "Mover item para baixo",
-    "ooui-outline-control-move-up": "Mover item para cima",
-    "ooui-toolbar-more": "Mais"
-}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/pt.json b/resources/oojs-ui/i18n/pt.json
deleted file mode 100644 (file)
index 53b5280..0000000
+++ /dev/null
@@ -1,21 +0,0 @@
-{
-    "@metadata": {
-        "authors": [
-            "Cainamarques",
-            "Fúlvio",
-            "GoEThe",
-            "Hamilton Abreu",
-            "Helder.wiki",
-            "Jaideraf",
-            "Jdforrester",
-            "Luckas",
-            "Vitorvicentevalente",
-            "SandroHc"
-        ]
-    },
-    "ooui-dialog-action-close": "Fechar",
-    "ooui-outline-control-move-down": "Mover item para baixo",
-    "ooui-outline-control-move-up": "Mover item para cima",
-    "ooui-outline-control-remove": "Remover elemento",
-    "ooui-toolbar-more": "Mais"
-}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/qqq.json b/resources/oojs-ui/i18n/qqq.json
deleted file mode 100644 (file)
index 75bbec4..0000000
+++ /dev/null
@@ -1,27 +0,0 @@
-{
-    "@metadata": {
-        "authors": [
-            "Amire80",
-            "Beta16",
-            "Erik Moeller",
-            "Jdforrester",
-            "Lloffiwr",
-            "Mooeypoo",
-            "Mormegil",
-            "Nike",
-            "PoLuX124",
-            "Purodha",
-            "Raymond",
-            "Sagan",
-            "Sayak Sarkar",
-            "Shirayuki",
-            "Siebrand",
-            "Trevor Parscal"
-        ]
-    },
-    "ooui-dialog-action-close": "Label text for button to exit from dialog.\n\n{{Identical|Close}}",
-    "ooui-outline-control-move-down": "Tool tip for a button that moves items in a list down one place",
-    "ooui-outline-control-move-up": "Tool tip for a button that moves items in a list up one place",
-    "ooui-outline-control-remove": "Tool tip for a button that removes items from a list.\n{{Identical|Remove item}}",
-    "ooui-toolbar-more": "Label for the toolbar group that contains a list of all other available tools.\n{{Identical|More}}"
-}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/qu.json b/resources/oojs-ui/i18n/qu.json
deleted file mode 100644 (file)
index d98b0e4..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-{
-    "@metadata": {
-        "authors": [
-            "AlimanRuna",
-            "Jduranboger"
-        ]
-    },
-    "ooui-dialog-action-close": "Wichq'ay",
-    "ooui-outline-control-move-down": "Qallawata uraykuchiy",
-    "ooui-outline-control-move-up": "Qallawata huqariy",
-    "ooui-outline-control-remove": "P'anqa sutikunata qichuy",
-    "ooui-toolbar-more": "Aswan"
-}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/ro.json b/resources/oojs-ui/i18n/ro.json
deleted file mode 100644 (file)
index 4892975..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-{
-    "@metadata": {
-        "authors": [
-            "AlimanRuna",
-            "Firilacroco",
-            "Minisarm",
-            "Stelistcristi"
-        ]
-    },
-    "ooui-dialog-action-close": "Închide",
-    "ooui-outline-control-move-down": "Mută elementul mai jos",
-    "ooui-outline-control-move-up": "Mută elementul mai sus",
-    "ooui-outline-control-remove": "Elimină elementul",
-    "ooui-toolbar-more": "Mai mult"
-}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/roa-tara.json b/resources/oojs-ui/i18n/roa-tara.json
deleted file mode 100644 (file)
index c7699d6..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-{
-    "@metadata": {
-        "authors": [
-            "Joetaras"
-        ]
-    },
-    "ooui-dialog-action-close": "Achiude",
-    "ooui-outline-control-move-down": "Spuèste 'a vôsce sotte",
-    "ooui-outline-control-move-up": "Spuèste 'a vôsce sus",
-    "ooui-toolbar-more": "De cchiù"
-}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/ru.json b/resources/oojs-ui/i18n/ru.json
deleted file mode 100644 (file)
index f6e76a6..0000000
+++ /dev/null
@@ -1,26 +0,0 @@
-{
-    "@metadata": {
-        "authors": [
-            "Amire80",
-            "DR",
-            "Eugrus",
-            "Iluvatar",
-            "KPu3uC B Poccuu",
-            "Kalan",
-            "MaxBioHazard",
-            "NBS",
-            "Niklem",
-            "Okras",
-            "Ole Yves",
-            "Putnik",
-            "Sunpriat",
-            "Yury Katkov",
-            "Умар"
-        ]
-    },
-    "ooui-dialog-action-close": "Закрыть",
-    "ooui-outline-control-move-down": "Переместить элемент вниз",
-    "ooui-outline-control-move-up": "Переместить элемент вверх",
-    "ooui-outline-control-remove": "Удалить пункт",
-    "ooui-toolbar-more": "Ещё"
-}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/sah.json b/resources/oojs-ui/i18n/sah.json
deleted file mode 100644 (file)
index 9b3fcc8..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-{
-    "@metadata": {
-        "authors": [
-            "Gazeb",
-            "HalanTul"
-        ]
-    },
-    "ooui-dialog-action-close": "Сап"
-}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/scn.json b/resources/oojs-ui/i18n/scn.json
deleted file mode 100644 (file)
index a699911..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-{
-    "@metadata": {
-        "authors": [
-            "Gazeb",
-            "Gmelfi",
-            "HalanTul"
-        ]
-    },
-    "ooui-dialog-action-close": "Chiùi",
-    "ooui-outline-control-move-down": "Sposta di sutta",
-    "ooui-outline-control-move-up": "Sposta di supra",
-    "ooui-toolbar-more": "Àutri cosi"
-}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/sco.json b/resources/oojs-ui/i18n/sco.json
deleted file mode 100644 (file)
index f8dc77c..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-    "@metadata": {
-        "authors": [
-            "John Reid"
-        ]
-    },
-    "ooui-dialog-action-close": "Claise",
-    "ooui-outline-control-move-down": "Muiv eetem doon",
-    "ooui-outline-control-move-up": "Muiv eetem up",
-    "ooui-outline-control-remove": "Remuiv eitem",
-    "ooui-toolbar-more": "Mair"
-}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/sh.json b/resources/oojs-ui/i18n/sh.json
deleted file mode 100644 (file)
index 5e29980..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-{
-    "@metadata": {
-        "authors": [
-            "OC Ripper"
-        ]
-    },
-    "ooui-dialog-action-close": "Zatvori",
-    "ooui-outline-control-move-down": "Pomakni stavku dolje",
-    "ooui-outline-control-move-up": "Pomakni stavku gore"
-}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/si.json b/resources/oojs-ui/i18n/si.json
deleted file mode 100644 (file)
index cf7a9fd..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-    "@metadata": {
-        "authors": [
-            "Singhalawap",
-            "පසිඳු කාවින්ද",
-            "ශ්වෙත"
-        ]
-    },
-    "ooui-dialog-action-close": "නිමවන්න",
-    "ooui-outline-control-move-down": "අයිතමය පහලටදමන්න",
-    "ooui-outline-control-move-up": "අයිතමය ඉහලටදමන්න"
-}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/sk.json b/resources/oojs-ui/i18n/sk.json
deleted file mode 100644 (file)
index 60b6f43..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-    "@metadata": {
-        "authors": [
-            "Mimarik",
-            "Teslaton"
-        ]
-    },
-    "ooui-dialog-action-close": "Zatvoriť",
-    "ooui-outline-control-move-down": "Posunúť položku nadol",
-    "ooui-outline-control-move-up": "Posunúť položku nahor",
-    "ooui-toolbar-more": "Viac"
-}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/sl.json b/resources/oojs-ui/i18n/sl.json
deleted file mode 100644 (file)
index b14d47b..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-{
-    "@metadata": {
-        "authors": [
-            "Dbc334",
-            "Eleassar",
-            "Pinky sl",
-            "Yerpo"
-        ]
-    },
-    "ooui-dialog-action-close": "Zapri",
-    "ooui-outline-control-move-down": "Prestavi predmet nižje",
-    "ooui-outline-control-move-up": "Prestavi predmet višje",
-    "ooui-outline-control-remove": "Odstrani vnos",
-    "ooui-toolbar-more": "Več"
-}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/sq.json b/resources/oojs-ui/i18n/sq.json
deleted file mode 100644 (file)
index 24a5af2..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-{
-    "@metadata": {
-        "authors": [
-            "Euriditi",
-            "Kushtrim",
-            "Elioqoshi"
-        ]
-    },
-    "ooui-dialog-action-close": "Mbylle",
-    "ooui-outline-control-move-down": "Zhvendose artikullin më poshtë",
-    "ooui-outline-control-move-up": "Zhvendose artikullin më lart",
-    "ooui-outline-control-remove": "Hiq artikullin",
-    "ooui-toolbar-more": "Më tepër..."
-}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/sr-ec.json b/resources/oojs-ui/i18n/sr-ec.json
deleted file mode 100644 (file)
index 7eaaacd..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-{
-    "@metadata": {
-        "authors": [
-            "Milicevic01",
-            "Nikola Smolenski",
-            "Милан Јелисавчић"
-        ]
-    },
-    "ooui-dialog-action-close": "Затвори",
-    "ooui-outline-control-move-down": "Премести ставку на доле",
-    "ooui-outline-control-move-up": "Премести ставку на горе",
-    "ooui-outline-control-remove": "Уклони ставку",
-    "ooui-toolbar-more": "Више"
-}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/sv.json b/resources/oojs-ui/i18n/sv.json
deleted file mode 100644 (file)
index f7d6f04..0000000
+++ /dev/null
@@ -1,22 +0,0 @@
-{
-    "@metadata": {
-        "authors": [
-            "Ainali",
-            "Haxpett",
-            "Jopparn",
-            "Knuckles",
-            "Magol",
-            "Milicevic01",
-            "Per",
-            "Sendelbach",
-            "Skalman",
-            "WikiPhoenix",
-            "Lokal Profil"
-        ]
-    },
-    "ooui-dialog-action-close": "Stäng",
-    "ooui-outline-control-move-down": "Flytta ned objekt",
-    "ooui-outline-control-move-up": "Flytta upp objekt",
-    "ooui-outline-control-remove": "Ta bort objekt",
-    "ooui-toolbar-more": "Mer"
-}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/sw.json b/resources/oojs-ui/i18n/sw.json
deleted file mode 100644 (file)
index 1c61b06..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-    "@metadata": {
-        "authors": [
-            "Lloffiwr",
-            "Muddyb Blast Producer"
-        ]
-    },
-    "ooui-dialog-action-close": "Funga",
-    "ooui-outline-control-move-down": "Sogeza kipengee chini",
-    "ooui-outline-control-move-up": "Sogeza kipengee juu",
-    "ooui-toolbar-more": "Zaidi"
-}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/ta.json b/resources/oojs-ui/i18n/ta.json
deleted file mode 100644 (file)
index a9795fd..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-{
-    "@metadata": {
-        "authors": [
-            "Jayarathina",
-            "Sank",
-            "Shanmugamp7",
-            "மதனாஹரன்"
-        ]
-    },
-    "ooui-dialog-action-close": "மூடுக"
-}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/te.json b/resources/oojs-ui/i18n/te.json
deleted file mode 100644 (file)
index a1f1285..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-{
-    "@metadata": {
-        "authors": [
-            "Arjunaraoc",
-            "Jayarathina",
-            "Sank",
-            "Shanmugamp7",
-            "Veeven",
-            "Visdaviva",
-            "மதனாஹரன்"
-        ]
-    },
-    "ooui-dialog-action-close": "మూయి"
-}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/th.json b/resources/oojs-ui/i18n/th.json
deleted file mode 100644 (file)
index b7ee05a..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-{
-    "@metadata": {
-        "authors": [
-            "Supasate",
-            "Taweetham"
-        ]
-    },
-    "ooui-dialog-action-close": "ปิด",
-    "ooui-outline-control-move-down": "เลื่อนรายการลง",
-    "ooui-outline-control-move-up": "ย้ายรายการขึ้น"
-}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/tl.json b/resources/oojs-ui/i18n/tl.json
deleted file mode 100644 (file)
index a073882..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-    "@metadata": {
-        "authors": [
-            "AnakngAraw",
-            "Sky Harbor"
-        ]
-    },
-    "ooui-dialog-action-close": "Isara",
-    "ooui-outline-control-move-down": "Ilipat ang aytem pababa",
-    "ooui-outline-control-move-up": "Ilipat ang aytem pataas",
-    "ooui-toolbar-more": "Marami pa"
-}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/tr.json b/resources/oojs-ui/i18n/tr.json
deleted file mode 100644 (file)
index 94d34a2..0000000
+++ /dev/null
@@ -1,17 +0,0 @@
-{
-    "@metadata": {
-        "authors": [
-            "Emperyan",
-            "Incelemeelemani",
-            "LuCKY",
-            "Maidis",
-            "Rapsar",
-            "Talha Samil Cakir",
-            "TurkishStyles"
-        ]
-    },
-    "ooui-dialog-action-close": "Kapat",
-    "ooui-outline-control-move-down": "Ögeyi aşağı taşı",
-    "ooui-outline-control-move-up": "Ögeyi yukarı taşı",
-    "ooui-toolbar-more": "Daha fazla"
-}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/tt-cyrl.json b/resources/oojs-ui/i18n/tt-cyrl.json
deleted file mode 100644 (file)
index 1c0bd90..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-{
-    "@metadata": {
-        "authors": [
-            "Ajdar"
-        ]
-    },
-    "ooui-dialog-action-close": "Ябу",
-    "ooui-outline-control-move-down": "Элементны аска күчерү",
-    "ooui-outline-control-move-up": "Элементны өскә күчерү"
-}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/ug-arab.json b/resources/oojs-ui/i18n/ug-arab.json
deleted file mode 100644 (file)
index efba086..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-{
-    "@metadata": {
-        "authors": [
-            "Sahran",
-            "Tel'et",
-            "Tifinaghes"
-        ]
-    }
-}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/uk.json b/resources/oojs-ui/i18n/uk.json
deleted file mode 100644 (file)
index 42487c9..0000000
+++ /dev/null
@@ -1,25 +0,0 @@
-{
-    "@metadata": {
-        "authors": [
-            "AS",
-            "Aced",
-            "Ahonc",
-            "Andriykopanytsia",
-            "Base",
-            "Perohanych",
-            "RLuts",
-            "Sahran",
-            "Sergento",
-            "Steve.rusyn",
-            "SteveR",
-            "Tel'et",
-            "Tifinaghes",
-            "Ата"
-        ]
-    },
-    "ooui-dialog-action-close": "Закрити",
-    "ooui-outline-control-move-down": "Перемістити елемент униз",
-    "ooui-outline-control-move-up": "Перемістити елемент вгору",
-    "ooui-outline-control-remove": "Видалити елемент",
-    "ooui-toolbar-more": "Більше"
-}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/uz.json b/resources/oojs-ui/i18n/uz.json
deleted file mode 100644 (file)
index 473fc75..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-{
-    "@metadata": {
-        "authors": [
-            "CoderSI",
-            "Noor2020",
-            "Sociologist",
-            "පසිඳු කාවින්ද"
-        ]
-    },
-    "ooui-dialog-action-close": "Yopish",
-    "ooui-outline-control-move-down": "Elementni pastga koʻchirish",
-    "ooui-outline-control-move-up": "Elementni yuqoriga koʻchirish",
-    "ooui-toolbar-more": "Yana"
-}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/vec.json b/resources/oojs-ui/i18n/vec.json
deleted file mode 100644 (file)
index 01833f7..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-    "@metadata": {
-        "authors": [
-            "Candalua",
-            "GatoSelvadego"
-        ]
-    },
-    "ooui-dialog-action-close": "Sara",
-    "ooui-outline-control-move-down": "Sposta in baso",
-    "ooui-outline-control-move-up": "Sposta in sima",
-    "ooui-toolbar-more": "Altro"
-}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/vi.json b/resources/oojs-ui/i18n/vi.json
deleted file mode 100644 (file)
index 342ad6f..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-{
-    "@metadata": {
-        "authors": [
-            "Cheers!",
-            "Jdforrester",
-            "Minh Nguyen"
-        ]
-    },
-    "ooui-dialog-action-close": "Đóng",
-    "ooui-outline-control-move-down": "Chuyển mục xuống",
-    "ooui-outline-control-move-up": "Chuyển mục lên",
-    "ooui-outline-control-remove": "Xóa khoản",
-    "ooui-toolbar-more": "Thêm"
-}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/vo.json b/resources/oojs-ui/i18n/vo.json
deleted file mode 100644 (file)
index 2ed7e2f..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-{
-    "@metadata": {
-        "authors": [
-            "Malafaya"
-        ]
-    },
-    "ooui-dialog-action-close": "Färmükön",
-    "ooui-toolbar-more": "Pluikos"
-}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/wuu.json b/resources/oojs-ui/i18n/wuu.json
deleted file mode 100644 (file)
index 72aa48b..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-{
-    "@metadata": {
-        "authors": [
-            "Malafaya",
-            "十弌"
-        ]
-    },
-    "ooui-toolbar-more": "還多"
-}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/yi.json b/resources/oojs-ui/i18n/yi.json
deleted file mode 100644 (file)
index ab5c510..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-{
-    "@metadata": {
-        "authors": [
-            "Malafaya",
-            "פוילישער",
-            "十弌"
-        ]
-    },
-    "ooui-dialog-action-close": "שליסן",
-    "ooui-outline-control-move-down": "רוקן עלעמענט אראפ",
-    "ooui-outline-control-move-up": "רוקן עלעמענט ארויף",
-    "ooui-toolbar-more": "נאך"
-}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/yo.json b/resources/oojs-ui/i18n/yo.json
deleted file mode 100644 (file)
index f71d3dd..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-{
-    "@metadata": {
-        "authors": [
-            "Demmy"
-        ]
-    },
-    "ooui-dialog-action-close": "Ìpadé",
-    "ooui-outline-control-move-down": "Sún onítòún sí sàlẹ̀",
-    "ooui-outline-control-move-up": "Sún onítòún s'ókè",
-    "ooui-toolbar-more": "Míràn"
-}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/zh-hans.json b/resources/oojs-ui/i18n/zh-hans.json
deleted file mode 100644 (file)
index 58e8ebe..0000000
+++ /dev/null
@@ -1,26 +0,0 @@
-{
-    "@metadata": {
-        "authors": [
-            "Anakmalaysia",
-            "Bencmq",
-            "Demmy",
-            "Hydra",
-            "Hzy980512",
-            "Liangent",
-            "Liuxinyu970226",
-            "Qiyue2001",
-            "Shirayuki",
-            "Shizhao",
-            "TianyinLee",
-            "Xiaomingyan",
-            "Yfdyh000",
-            "Zhangjintao",
-            "乌拉跨氪"
-        ]
-    },
-    "ooui-dialog-action-close": "关闭",
-    "ooui-outline-control-move-down": "下移项",
-    "ooui-outline-control-move-up": "上移项",
-    "ooui-outline-control-remove": "移除项",
-    "ooui-toolbar-more": "更多"
-}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/zh-hant.json b/resources/oojs-ui/i18n/zh-hant.json
deleted file mode 100644 (file)
index 6e7b12e..0000000
+++ /dev/null
@@ -1,23 +0,0 @@
-{
-    "@metadata": {
-        "authors": [
-            "Anakmalaysia",
-            "Ch.Andrew",
-            "Hydra",
-            "Justincheng12345",
-            "Liflon",
-            "Liuxinyu970226",
-            "Qiyue2001",
-            "Radish10cm",
-            "Shirayuki",
-            "Simon Shek",
-            "Spring Roll Conan",
-            "Waihorace"
-        ]
-    },
-    "ooui-dialog-action-close": "關閉",
-    "ooui-outline-control-move-down": "向下移項",
-    "ooui-outline-control-move-up": "向上移項",
-    "ooui-outline-control-remove": "移除項",
-    "ooui-toolbar-more": "更多"
-}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/zh-hk.json b/resources/oojs-ui/i18n/zh-hk.json
deleted file mode 100644 (file)
index 60e8fbd..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-{
-    "@metadata": [],
-    "ooui-dialog-action-close": "關閉"
-}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/zh-tw.json b/resources/oojs-ui/i18n/zh-tw.json
deleted file mode 100644 (file)
index f7987e5..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-{
-    "@metadata": [],
-    "ooui-dialog-action-close": "關閉",
-    "ooui-outline-control-move-down": "向下移",
-    "ooui-outline-control-move-up": "向上移",
-    "ooui-toolbar-more": "更多"
-}
\ No newline at end of file
diff --git a/resources/oojs-ui/images/fade-down.png b/resources/oojs-ui/images/fade-down.png
deleted file mode 100644 (file)
index 50c7931..0000000
Binary files a/resources/oojs-ui/images/fade-down.png and /dev/null differ
diff --git a/resources/oojs-ui/images/fade-up.png b/resources/oojs-ui/images/fade-up.png
deleted file mode 100644 (file)
index 7a0cb87..0000000
Binary files a/resources/oojs-ui/images/fade-up.png and /dev/null differ
diff --git a/resources/oojs-ui/images/icons/accept.png b/resources/oojs-ui/images/icons/accept.png
deleted file mode 100644 (file)
index 1075110..0000000
Binary files a/resources/oojs-ui/images/icons/accept.png and /dev/null differ
diff --git a/resources/oojs-ui/images/icons/accept.svg b/resources/oojs-ui/images/icons/accept.svg
deleted file mode 100644 (file)
index df78186..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="24px"
-        height="24px" viewBox="0 0 24 24" style="enable-background:new 0 0 24 24;" xml:space="preserve">
-<g id="apply" style="opacity:0.75;">
-       <polygon id="check" style="fill-rule:evenodd;clip-rule:evenodd;" points="19.062,5.139 17.418,4 8.867,16.357 5.413,12.903 4,14.316 9.021,19.338"/>
-</g>
-</svg>
diff --git a/resources/oojs-ui/images/icons/add-item.png b/resources/oojs-ui/images/icons/add-item.png
deleted file mode 100644 (file)
index 5cf353f..0000000
Binary files a/resources/oojs-ui/images/icons/add-item.png and /dev/null differ
diff --git a/resources/oojs-ui/images/icons/add-item.svg b/resources/oojs-ui/images/icons/add-item.svg
deleted file mode 100644 (file)
index 2620e76..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="24px"
-        height="24px" viewBox="0 0 24 24" style="enable-background:new 0 0 24 24;" xml:space="preserve">
-<g id="apply" style="opacity:0.75;">
-       <path d="M13,8 L11,8 L11,11 L8,11 L8,13 L11,13 L11,16 L13,16 L13,13 L16,13 L16,11 L13,11 z"/>
-</g>
-</svg>
diff --git a/resources/oojs-ui/images/icons/advanced.png b/resources/oojs-ui/images/icons/advanced.png
deleted file mode 100644 (file)
index 7f5ada5..0000000
Binary files a/resources/oojs-ui/images/icons/advanced.png and /dev/null differ
diff --git a/resources/oojs-ui/images/icons/advanced.svg b/resources/oojs-ui/images/icons/advanced.svg
deleted file mode 100644 (file)
index 3e87cab..0000000
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="24px"
-        height="24px" viewBox="0 0 24 24" style="enable-background:new 0 0 24 24;" xml:space="preserve">
-<g id="settings" style="opacity:0.75;">
-       <path id="gear" style="fill-rule:evenodd;clip-rule:evenodd;" d="M20.869,13.476C20.948,12.994,21,12.504,21,12
-               s-0.052-0.994-0.131-1.476l-2.463-0.259c-0.149-0.556-0.367-1.082-0.648-1.57l1.558-1.924c-0.576-0.806-1.281-1.511-2.087-2.087
-               l-1.924,1.558c-0.488-0.281-1.015-0.499-1.57-0.648l-0.259-2.463C12.994,3.052,12.504,3,12,3s-0.994,0.052-1.476,0.131
-               l-0.259,2.463C9.71,5.743,9.184,5.961,8.695,6.242L6.771,4.685C5.966,5.261,5.261,5.966,4.685,6.771l1.558,1.924
-               c-0.281,0.488-0.499,1.015-0.648,1.57l-2.463,0.259C3.052,11.006,3,11.496,3,12s0.052,0.994,0.131,1.476l2.463,0.259
-               c0.149,0.556,0.367,1.082,0.648,1.57l-1.558,1.924c0.576,0.806,1.281,1.511,2.087,2.087l1.924-1.558
-               c0.488,0.281,1.015,0.499,1.57,0.648l0.259,2.463C11.006,20.948,11.496,21,12,21s0.994-0.052,1.476-0.131l0.259-2.463
-               c0.556-0.149,1.082-0.367,1.57-0.648l1.924,1.558c0.806-0.576,1.511-1.281,2.087-2.087l-1.558-1.924
-               c0.281-0.488,0.499-1.015,0.648-1.57L20.869,13.476z M12,15.998c-2.209,0-3.998-1.789-3.998-3.998S9.791,8.002,12,8.002
-               S15.998,9.791,15.998,12S14.209,15.998,12,15.998z"/>
-</g>
-</svg>
diff --git a/resources/oojs-ui/images/icons/alert.png b/resources/oojs-ui/images/icons/alert.png
deleted file mode 100644 (file)
index 992ea2a..0000000
Binary files a/resources/oojs-ui/images/icons/alert.png and /dev/null differ
diff --git a/resources/oojs-ui/images/icons/alert.svg b/resources/oojs-ui/images/icons/alert.svg
deleted file mode 100644 (file)
index 886a7c0..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="24px"
-        height="24px" viewBox="0 0 24 24" style="enable-background:new 0 0 24 24;" xml:space="preserve">
-<g id="alert" style="opacity:0.75;">
-       <rect id="point" x="11" y="16" style="fill-rule:evenodd;clip-rule:evenodd;" width="2" height="2"/>
-       <polygon id="stroke" style="fill-rule:evenodd;clip-rule:evenodd;" points="13.516,10 10.516,10 11,15 13,15"/>
-       <path id="triangle" d="M12.017,5.974L19.536,19H4.496L12.017,5.974 M12.017,3.5c-0.544,0-1.088,0.357-1.5,1.071L2.532,18.402 C1.707,19.831,2.382,21,4.032,21H20c1.65,0,2.325-1.169,1.5-2.599L13.517,4.572C13.104,3.857,12.561,3.5,12.017,3.5L12.017,3.5z"/>
-</g>
-</svg>
diff --git a/resources/oojs-ui/images/icons/arched-arrow-ltr.png b/resources/oojs-ui/images/icons/arched-arrow-ltr.png
deleted file mode 100644 (file)
index 5db1c4d..0000000
Binary files a/resources/oojs-ui/images/icons/arched-arrow-ltr.png and /dev/null differ
diff --git a/resources/oojs-ui/images/icons/arched-arrow-ltr.svg b/resources/oojs-ui/images/icons/arched-arrow-ltr.svg
deleted file mode 100644 (file)
index 5b343a5..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="24px"
-        height="24px" viewBox="0 0 24 24" style="enable-background:new 0 0 24 24;" xml:space="preserve">
-<g id="arched-arrow-ltr" style="opacity:0.75;">
-       <path id="arrow" style="fill-rule:evenodd;clip-rule:evenodd;" d="M19.925,14.937l-2.391-6.901l-1.48,2.329 c-0.964-0.845-2.699-1.85-5.513-1.823c-4.887,0.046-6.524,4.244-6.524,4.244s2.753-2.639,6.925-1.949 c1.729,0.286,3.007,1.206,3.675,1.791l-1.474,2.319L19.925,14.937z"/>
-</g>
-</svg>
diff --git a/resources/oojs-ui/images/icons/arched-arrow-rtl.png b/resources/oojs-ui/images/icons/arched-arrow-rtl.png
deleted file mode 100644 (file)
index 7931971..0000000
Binary files a/resources/oojs-ui/images/icons/arched-arrow-rtl.png and /dev/null differ
diff --git a/resources/oojs-ui/images/icons/arched-arrow-rtl.svg b/resources/oojs-ui/images/icons/arched-arrow-rtl.svg
deleted file mode 100644 (file)
index bb5f10e..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="24px"
-        height="24px" viewBox="0 0 24 24" style="enable-background:new 0 0 24 24;" xml:space="preserve">
-<g id="arched-arrow-rtl" style="opacity:0.75;">
-       <path id="arrow" style="fill-rule:evenodd;clip-rule:evenodd;" d="M13.401,8.542c-2.814-0.027-4.549,0.978-5.513,1.823 l-1.48-2.329l-2.391,6.901l6.782,0.009l-1.474-2.319c0.668-0.584,1.945-1.504,3.675-1.791c4.172-0.69,6.925,1.949,6.925,1.949 S18.288,8.588,13.401,8.542z"/>
-</g>
-</svg>
diff --git a/resources/oojs-ui/images/icons/check.png b/resources/oojs-ui/images/icons/check.png
deleted file mode 100644 (file)
index 82c3cb4..0000000
Binary files a/resources/oojs-ui/images/icons/check.png and /dev/null differ
diff --git a/resources/oojs-ui/images/icons/check.svg b/resources/oojs-ui/images/icons/check.svg
deleted file mode 100644 (file)
index e67cd6c..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="24" height="24" viewBox="0, 0, 24, 24">
-  <g id="check">
-    <path d="M7.105,13.473 L8.527,12.05 L10.428,13.952 L15.238,7 L16.895,8.148 L10.635,17 z" fill="#000000"/>
-  </g>
-  <defs/>
-</svg>
diff --git a/resources/oojs-ui/images/icons/clear.png b/resources/oojs-ui/images/icons/clear.png
deleted file mode 100644 (file)
index 697dd62..0000000
Binary files a/resources/oojs-ui/images/icons/clear.png and /dev/null differ
diff --git a/resources/oojs-ui/images/icons/clear.svg b/resources/oojs-ui/images/icons/clear.svg
deleted file mode 100644 (file)
index d83eb02..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="24px"
-        height="24px" viewBox="0 0 24 24" style="enable-background:new 0 0 24 24;" xml:space="preserve">
-<g id="clear" style="opacity:0.75;">
-       <path id="circle_with_strike" style="fill-rule:evenodd;clip-rule:evenodd;" d="M11.999,5.022c-3.853,0-6.977,3.124-6.977,6.978 c0,3.853,3.124,6.978,6.977,6.978c3.854,0,6.979-3.125,6.979-6.978C18.978,8.146,15.853,5.022,11.999,5.022z M6.886,12 c0-1.092,0.572-3.25,0.93-2.929l7.113,7.113c0.488,0.525-1.837,0.931-2.93,0.931C9.174,17.114,6.886,14.824,6.886,12z M16.184,14.929L9.07,7.816c-0.445-0.483,1.837-0.931,2.929-0.931c2.827,0,5.115,2.289,5.115,5.114 C17.114,13.092,16.75,15.542,16.184,14.929z"/>
-</g>
-</svg>
diff --git a/resources/oojs-ui/images/icons/close.png b/resources/oojs-ui/images/icons/close.png
deleted file mode 100644 (file)
index f7eed9f..0000000
Binary files a/resources/oojs-ui/images/icons/close.png and /dev/null differ
diff --git a/resources/oojs-ui/images/icons/close.svg b/resources/oojs-ui/images/icons/close.svg
deleted file mode 100644 (file)
index a0118c2..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="24px"
-        height="24px" viewBox="0 0 24 24" style="enable-background:new 0 0 24 24;" xml:space="preserve">
-<g id="close" style="opacity:0.75;">
-       <polygon id="x" style="fill-rule:evenodd;clip-rule:evenodd;" points="18.717,6.697 17.303,5.283 12,10.586 6.697,5.283 5.283,6.697 10.586,12 5.283,17.303 6.697,18.717 12,13.414 17.303,18.717 18.717,17.303 13.414,12            "/>
-</g>
-</svg>
diff --git a/resources/oojs-ui/images/icons/code.png b/resources/oojs-ui/images/icons/code.png
deleted file mode 100644 (file)
index a5ebdbf..0000000
Binary files a/resources/oojs-ui/images/icons/code.png and /dev/null differ
diff --git a/resources/oojs-ui/images/icons/code.svg b/resources/oojs-ui/images/icons/code.svg
deleted file mode 100644 (file)
index 6f1ed53..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-        width="24px" height="24px" viewBox="0 0 24 24" enable-background="new 0 0 24 24" xml:space="preserve">
-<g id="code" opacity="0.75">
-       <path id="left-bracket" d="M4,12v-1h1c1,0,1,0,1-1V7.614C6,7.1,6.024,6.718,6.073,6.472C6.127,6.22,6.212,6.009,6.33,5.839
-               C6.534,5.56,6.803,5.364,7.138,5.255C7.473,5.14,8.01,5,8.973,5H10v1H9.248c-0.457,0-0.77,0.191-0.936,0.408
-               C8.145,6.623,8,6.853,8,7.476v1.857c0,0.729-0.041,1.18-0.244,1.493c-0.2,0.307-0.562,0.529-1.09,0.667
-               c0.535,0.155,0.9,0.385,1.096,0.688C7.961,12.484,8,12.938,8,13.665v1.862c0,0.619,0.145,0.848,0.312,1.062
-               c0.166,0.22,0.479,0.407,0.936,0.407L10,17l0,0v1H8.973c-0.963,0-1.5-0.133-1.835-0.248c-0.335-0.109-0.604-0.307-0.808-0.591
-               c-0.118-0.165-0.203-0.374-0.257-0.625C6.024,16.283,6,15.9,6,15.387V13c0-1,0-1-1-1H4z"/>
-       <use transform="matrix(-1,0,0,1,24,0)" id="right-bracket" x="0" y="0" width="24" height="24" xlink:href="#left-bracket" />
-</g>
-</svg>
diff --git a/resources/oojs-ui/images/icons/collapse.png b/resources/oojs-ui/images/icons/collapse.png
deleted file mode 100644 (file)
index 38b796f..0000000
Binary files a/resources/oojs-ui/images/icons/collapse.png and /dev/null differ
diff --git a/resources/oojs-ui/images/icons/collapse.svg b/resources/oojs-ui/images/icons/collapse.svg
deleted file mode 100644 (file)
index a89cebf..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="24px"
-        height="24px" viewBox="0 0 24 24" style="enable-background:new 0 0 24 24;" xml:space="preserve">
-<g id="collapse" style="opacity:0.75;">
-       <polygon id="arrow" style="fill-rule:evenodd;clip-rule:evenodd;" points="6.697,15.714 12,10.412 17.303,15.714 18.717,14.3 12,7.583 5.283,14.3"/>
-</g>
-</svg>
diff --git a/resources/oojs-ui/images/icons/comment.png b/resources/oojs-ui/images/icons/comment.png
deleted file mode 100644 (file)
index 9546455..0000000
Binary files a/resources/oojs-ui/images/icons/comment.png and /dev/null differ
diff --git a/resources/oojs-ui/images/icons/comment.svg b/resources/oojs-ui/images/icons/comment.svg
deleted file mode 100644 (file)
index e052935..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="24px"
-        height="24px" viewBox="0 0 24 24" style="enable-background:new 0 0 24 24;" xml:space="preserve">
-<g id="comment" style="opacity:0.75;">
-       <path id="speech_bubble" style="fill-rule:evenodd;clip-rule:evenodd;" d="M15,6H9C7.343,6,6,7.344,6,9v4c0,1.656,1.343,3,3,3v3 l3-3h3c1.657,0,3-1.344,3-3V9C18,7.344,16.657,6,15,6z"/>
-</g>
-</svg>
diff --git a/resources/oojs-ui/images/icons/expand.png b/resources/oojs-ui/images/icons/expand.png
deleted file mode 100644 (file)
index e90aca1..0000000
Binary files a/resources/oojs-ui/images/icons/expand.png and /dev/null differ
diff --git a/resources/oojs-ui/images/icons/expand.svg b/resources/oojs-ui/images/icons/expand.svg
deleted file mode 100644 (file)
index b542f5f..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="24px"
-        height="24px" viewBox="0 0 24 24" style="enable-background:new 0 0 24 24;" xml:space="preserve">
-<g id="expand" style="opacity:0.75;">
-       <polygon id="arrow" style="fill-rule:evenodd;clip-rule:evenodd;" points="17.303,8.283 12,13.586 6.697,8.283 5.283,9.697 12,16.414 18.717,9.697"/>
-</g>
-</svg>
diff --git a/resources/oojs-ui/images/icons/help.png b/resources/oojs-ui/images/icons/help.png
deleted file mode 100644 (file)
index dca745b..0000000
Binary files a/resources/oojs-ui/images/icons/help.png and /dev/null differ
diff --git a/resources/oojs-ui/images/icons/help.svg b/resources/oojs-ui/images/icons/help.svg
deleted file mode 100644 (file)
index c68bdda..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="24px"
-        height="24px" viewBox="0 0 24 24" style="enable-background:new 0 0 24 24;" xml:space="preserve">
-<g id="help" style="opacity:0.75;">
-       <path id="circle" style="fill-rule:evenodd;clip-rule:evenodd;" d="M12.001,2.085c-5.478,0-9.916,4.438-9.916,9.916 c0,5.476,4.438,9.914,9.916,9.914c5.476,0,9.914-4.438,9.914-9.914C21.915,6.523,17.477,2.085,12.001,2.085z M12.002,20.085 c-4.465,0-8.084-3.619-8.084-8.083c0-4.465,3.619-8.084,8.084-8.084c4.464,0,8.083,3.619,8.083,8.084 C20.085,16.466,16.466,20.085,12.002,20.085z"/>
-       <g id="question_mark">
-               <path id="top" style="fill-rule:evenodd;clip-rule:evenodd;" d="M11.766,6.688c-2.5,0-3.219,2.188-3.219,2.188l1.411,0.854 c0,0,0.298-0.791,0.901-1.229c0.516-0.375,1.625-0.625,2.219,0.125c0.701,0.885-0.17,1.587-1.078,2.719 C11.047,12.531,11,15,11,15h1.969c0,0,0.135-2.318,1.041-3.381c0.603-0.707,1.443-1.338,1.443-2.494S14.266,6.688,11.766,6.688z"/>
-               <rect id="bottom" x="11" y="16" style="fill-rule:evenodd;clip-rule:evenodd;" width="2" height="2"/>
-       </g>
-</g>
-</svg>
diff --git a/resources/oojs-ui/images/icons/history.png b/resources/oojs-ui/images/icons/history.png
deleted file mode 100644 (file)
index c049931..0000000
Binary files a/resources/oojs-ui/images/icons/history.png and /dev/null differ
diff --git a/resources/oojs-ui/images/icons/history.svg b/resources/oojs-ui/images/icons/history.svg
deleted file mode 100644 (file)
index 40c0ae3..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="24px"
-        height="24px" viewBox="0 0 24 24" style="enable-background:new 0 0 24 24;" xml:space="preserve">
-<g id="history" style="opacity:0.75;">
-       <path id="clock_hands" style="fill-rule:evenodd;clip-rule:evenodd;" d="M17.26,15.076c0,0-2.385-1.935-4.005-3.062 c0.72-2.397,1.702-6.559,1.702-6.559s-4.35,5.363-4.877,6.699c-0.463,1.168,1.459,2.209,2.346,1.678 C14.326,14.383,17.26,15.076,17.26,15.076z"/>
-       <path id="arrow" style="fill-rule:evenodd;clip-rule:evenodd;" d="M12.086,2.085c-5.478,0-9.916,4.438-9.916,9.916 c0,1.783,0.476,3.454,1.301,4.898l-2.223,2.04h5.688v-5.219l-2.066,1.896c-0.55-1.088-0.866-2.312-0.866-3.615 c0-4.465,3.619-8.084,8.084-8.084c4.464,0,8.083,3.619,8.083,8.084c0,4.464-3.619,8.083-8.083,8.083 c-1.145,0-2.228-0.247-3.213-0.678l-0.833,1.634c1.235,0.557,2.602,0.874,4.045,0.874c5.476,0,9.914-4.438,9.914-9.914 C22,6.523,17.562,2.085,12.086,2.085z"/>
-</g>
-</svg>
diff --git a/resources/oojs-ui/images/icons/link.png b/resources/oojs-ui/images/icons/link.png
deleted file mode 100644 (file)
index 7dfa268..0000000
Binary files a/resources/oojs-ui/images/icons/link.png and /dev/null differ
diff --git a/resources/oojs-ui/images/icons/link.svg b/resources/oojs-ui/images/icons/link.svg
deleted file mode 100644 (file)
index dadf69c..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="24px"
-        height="24px" viewBox="0 0 24 24" style="enable-background:new 0 0 24 24;" xml:space="preserve">
-<g id="link" style="opacity:0.75;">
-       <path id="right" d="M19.188,12.001c0,1.1-0.891,2.015-1.988,2.015l-4.195-0.015C13.543,15.089,13.968,16,15.002,16h3
-               C19.658,16,21,13.657,21,12s-1.342-4-2.998-4h-3c-1.034,0-1.459,0.911-1.998,1.999l4.195-0.015
-               C18.297,9.984,19.188,10.901,19.188,12.001z"/>
-       <path id="center" d="M8,12c0,0.535,0.42,1,0.938,1h6.109c0.518,0,0.938-0.465,0.938-1c0-0.534-0.42-1-0.938-1H8.938
-               C8.42,11,8,11.466,8,12z"/>
-       <path id="left" d="M4.816,11.999c0-1.1,0.891-2.015,1.988-2.015L11,9.999C10.461,8.911,10.036,8,9.002,8h-3
-               c-1.656,0-2.998,2.343-2.998,4s1.342,4,2.998,4h3c1.034,0,1.459-0.911,1.998-1.999l-4.195,0.015
-               C5.707,14.016,4.816,13.099,4.816,11.999z"/>
-</g>
-</svg>
diff --git a/resources/oojs-ui/images/icons/menu.png b/resources/oojs-ui/images/icons/menu.png
deleted file mode 100644 (file)
index b5ac60f..0000000
Binary files a/resources/oojs-ui/images/icons/menu.png and /dev/null differ
diff --git a/resources/oojs-ui/images/icons/menu.svg b/resources/oojs-ui/images/icons/menu.svg
deleted file mode 100644 (file)
index 657fab2..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="24px"
-        height="24px" viewBox="0 0 24 24" style="enable-background:new 0 0 24 24;" xml:space="preserve">
-<g id="menu" style="opacity:0.75;">
-       <path id="lines" d="M6,15h12c0.553,0,1,0.447,1,1v1c0,0.553-0.447,1-1,1H6c-0.553,0-1-0.447-1-1v-1C5,15.447,5.447,15,6,15z M5,11v1
-               c0,0.553,0.447,1,1,1h12c0.553,0,1-0.447,1-1v-1c0-0.553-0.447-1-1-1H6C5.447,10,5,10.447,5,11z M5,6v1c0,0.553,0.447,1,1,1h12
-               c0.553,0,1-0.447,1-1V6c0-0.553-0.447-1-1-1H6C5.447,5,5,5.447,5,6z"/>
-</g>
-</svg>
diff --git a/resources/oojs-ui/images/icons/move-ltr.png b/resources/oojs-ui/images/icons/move-ltr.png
deleted file mode 100644 (file)
index ded5f05..0000000
Binary files a/resources/oojs-ui/images/icons/move-ltr.png and /dev/null differ
diff --git a/resources/oojs-ui/images/icons/move-ltr.svg b/resources/oojs-ui/images/icons/move-ltr.svg
deleted file mode 100644 (file)
index a378a5d..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="24px"
-        height="24px" viewBox="0 0 24 24" style="enable-background:new 0 0 24 24;" xml:space="preserve">
-<g id="move-ltr" style="opacity:0.75;">
-       <polygon id="arrow" style="fill-rule:evenodd;clip-rule:evenodd;" points="8.935,7.181 14.237,12.483 8.935,17.786
-               10.349,19.2 17.065,12.483 10.349,5.767"/>
-</g>
-</svg>
diff --git a/resources/oojs-ui/images/icons/move-rtl.png b/resources/oojs-ui/images/icons/move-rtl.png
deleted file mode 100644 (file)
index fc6e62d..0000000
Binary files a/resources/oojs-ui/images/icons/move-rtl.png and /dev/null differ
diff --git a/resources/oojs-ui/images/icons/move-rtl.svg b/resources/oojs-ui/images/icons/move-rtl.svg
deleted file mode 100644 (file)
index c0b334b..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="24px"
-        height="24px" viewBox="0 0 24 24" style="enable-background:new 0 0 24 24;" xml:space="preserve">
-<g id="move-rtl" style="opacity:0.75;">
-       <polygon id="arrow_9_" style="fill-rule:evenodd;clip-rule:evenodd;" points="15.065,17.786 9.763,12.483 15.065,7.181
-               13.651,5.767 6.935,12.483 13.651,19.2"/>
-</g>
-</svg>
diff --git a/resources/oojs-ui/images/icons/picture.png b/resources/oojs-ui/images/icons/picture.png
deleted file mode 100644 (file)
index faf8af9..0000000
Binary files a/resources/oojs-ui/images/icons/picture.png and /dev/null differ
diff --git a/resources/oojs-ui/images/icons/picture.svg b/resources/oojs-ui/images/icons/picture.svg
deleted file mode 100644 (file)
index 078ce10..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="24px"
-        height="24px" viewBox="0 0 24 24" style="enable-background:new 0 0 24 24;" xml:space="preserve">
-<g id="picture" style="opacity:0.75;">
-       <path id="frame" style="fill-rule:evenodd;clip-rule:evenodd;" d="M18,4H6C4,3.993,3,4.993,3,6.993L3.014,16C3,18,4,18.988,6,19h12
-               c2-0.012,2.994-1,3-3.006V6.993C20.994,4.993,20,3.993,18,4z M19,17H5V6h14V17z"/>
-       <polygon id="mountains" style="fill-rule:evenodd;clip-rule:evenodd;" points="6,13.5 9.5,10 11.828,12.312 10.516,13.406
-               11.391,14.438 15.5,11 18,13 18,16 6,16"/>
-       <polygon id="sky" style="fill-rule:evenodd;clip-rule:evenodd;" points="6,12 9.516,7.844 12.562,11.016 15.5,9 18,11 18,7 6,7"/>
-</g>
-</svg>
diff --git a/resources/oojs-ui/images/icons/remove-item.png b/resources/oojs-ui/images/icons/remove-item.png
deleted file mode 100644 (file)
index 2f11db3..0000000
Binary files a/resources/oojs-ui/images/icons/remove-item.png and /dev/null differ
diff --git a/resources/oojs-ui/images/icons/remove-item.svg b/resources/oojs-ui/images/icons/remove-item.svg
deleted file mode 100644 (file)
index b95e7d3..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="24" height="24" viewBox="0, 0, 24, 24">
-  <g id="remove-item">
-    <path d="M8,11 L16,11 L16,13 L8,13 z" fill="#000000"/>
-  </g>
-  <defs/>
-</svg>
diff --git a/resources/oojs-ui/images/icons/remove.png b/resources/oojs-ui/images/icons/remove.png
deleted file mode 100644 (file)
index d7e116c..0000000
Binary files a/resources/oojs-ui/images/icons/remove.png and /dev/null differ
diff --git a/resources/oojs-ui/images/icons/remove.svg b/resources/oojs-ui/images/icons/remove.svg
deleted file mode 100644 (file)
index 17c8d39..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="24px"
-        height="24px" viewBox="0 0 24 24" style="enable-background:new 0 0 24 24;" xml:space="preserve">
-<g id="remove" style="opacity:0.75;">
-       <path id="trash_can" style="fill-rule:evenodd;clip-rule:evenodd;" d="M12,10h-1v6h1V10z M10,10H9v6h1V10z M14,10h-1v6h1V10z
-                M14,6V5H9v1H6v3h1v7.966l1,1.031v-0.074V18h6.984L15,17.982v0.015l1-1.031V9h1V6H14z M15,17H8V9h7V17z M16,8H7V7h9V8z"/>
-</g>
-</svg>
diff --git a/resources/oojs-ui/images/icons/search.png b/resources/oojs-ui/images/icons/search.png
deleted file mode 100644 (file)
index df29792..0000000
Binary files a/resources/oojs-ui/images/icons/search.png and /dev/null differ
diff --git a/resources/oojs-ui/images/icons/search.svg b/resources/oojs-ui/images/icons/search.svg
deleted file mode 100644 (file)
index 37feda4..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="24px"
-        height="24px" viewBox="0 0 24 24" style="enable-background:new 0 0 24 24;" xml:space="preserve">
-<g id="search" style="opacity:0.75;">
-       <path id="magnifying_glass" d="M16.021,15.96l-2.374-2.375c-0.048-0.047-0.105-0.079-0.169-0.099c0.403-0.566,0.643-1.26,0.643-2.009
-               C14.12,9.557,12.563,8,10.644,8c-1.921,0-3.478,1.557-3.478,3.478c0,1.92,1.557,3.477,3.478,3.477c0.749,0,1.442-0.239,2.01-0.643
-               c0.019,0.063,0.051,0.121,0.098,0.169l2.375,2.374c0.19,0.189,0.543,0.143,0.79-0.104S16.21,16.15,16.021,15.96z M10.644,13.69
-               c-1.221,0-2.213-0.991-2.213-2.213c0-1.221,0.992-2.213,2.213-2.213c1.222,0,2.213,0.992,2.213,2.213
-               C12.856,12.699,11.865,13.69,10.644,13.69z"/>
-</g>
-</svg>
diff --git a/resources/oojs-ui/images/icons/settings.png b/resources/oojs-ui/images/icons/settings.png
deleted file mode 100644 (file)
index b1b35e9..0000000
Binary files a/resources/oojs-ui/images/icons/settings.png and /dev/null differ
diff --git a/resources/oojs-ui/images/icons/settings.svg b/resources/oojs-ui/images/icons/settings.svg
deleted file mode 100644 (file)
index 1464a79..0000000
+++ /dev/null
@@ -1,16 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="24" height="24" viewBox="0, 0, 24, 24">
-  <g id="settings" opacity="0.75">
-    <path d="M3,4 L6,4 L6,6 L3,6 z" fill="#000000"/>
-    <path d="M12,4 L21,4 L21,6 L12,6 z" fill="#000000"/>
-    <path d="M8,3 L10,3 C10.552,3 11,3.448 11,4 L11,6 C11,6.552 10.552,7 10,7 L8,7 C7.448,7 7,6.552 7,6 L7,4 C7,3.448 7.448,3 8,3 z" fill="#000000"/>
-    <path d="M3,11 L12,11 L12,13 L3,13 z" fill="#000000"/>
-    <path d="M18,11 L21,11 L21,13 L18,13 z" fill="#000000"/>
-    <path d="M14,10 L16,10 C16.552,10 17,10.448 17,11 L17,13 C17,13.552 16.552,14 16,14 L14,14 C13.448,14 13,13.552 13,13 L13,11 C13,10.448 13.448,10 14,10 z" fill="#000000"/>
-    <path d="M3,18 L9,18 L9,20 L3,20 z" fill="#000000"/>
-    <path d="M15,18 L21,18 L21,20 L15,20 z" fill="#000000"/>
-    <path d="M11,17 L13,17 C13.552,17 14,17.448 14,18 L14,20 C14,20.552 13.552,21 13,21 L11,21 C10.448,21 10,20.552 10,20 L10,18 C10,17.448 10.448,17 11,17 z" fill="#000000"/>
-  </g>
-  <defs/>
-</svg>
diff --git a/resources/oojs-ui/images/icons/tag.png b/resources/oojs-ui/images/icons/tag.png
deleted file mode 100644 (file)
index 722f4d7..0000000
Binary files a/resources/oojs-ui/images/icons/tag.png and /dev/null differ
diff --git a/resources/oojs-ui/images/icons/tag.svg b/resources/oojs-ui/images/icons/tag.svg
deleted file mode 100644 (file)
index d21e5e3..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="24px"
-        height="24px" viewBox="0 0 24 24" style="enable-background:new 0 0 24 24;" xml:space="preserve">
-<g id="tag" style="opacity:0.75;">
-       <path d="M18.748,11.717c0.389,0.389,0.389,1.025,0,1.414l-4.949,4.95c-0.389,0.389-1.025,0.389-1.414,0l-6.01-6.01
-               c-0.389-0.389-0.707-1.157-0.707-1.707L5.667,6c0-0.55,0.45-1,1-1h4.364c0.55,0,1.318,0.318,1.707,0.707L18.748,11.717z
-                M8.104,7.456C7.525,8.032,7.526,8.97,8.103,9.549c0.578,0.577,1.516,0.577,2.095,0.001c0.576-0.578,0.576-1.517,0-2.095
-               C9.617,6.879,8.68,6.878,8.104,7.456z"/>
-</g>
-</svg>
diff --git a/resources/oojs-ui/images/icons/window.png b/resources/oojs-ui/images/icons/window.png
deleted file mode 100644 (file)
index 3d48a3c..0000000
Binary files a/resources/oojs-ui/images/icons/window.png and /dev/null differ
diff --git a/resources/oojs-ui/images/icons/window.svg b/resources/oojs-ui/images/icons/window.svg
deleted file mode 100644 (file)
index 621cf2c..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="24px"
-        height="24px" viewBox="0 0 24 24" style="enable-background:new 0 0 24 24;" xml:space="preserve">
-<g id="window" style="opacity:0.75;">
-       <rect id="title" x="7" y="10" width="10" height="1"/>
-       <path id="window" d="M16,19H8c-2.206,0-4-1.794-4-4V9c0-2.206,1.794-4,4-4h8c2.206,0,4,1.794,4,4v6C20,17.206,18.206,19,16,19z
-                M8,7C6.897,7,6,7.897,6,9v6c0,1.103,0.897,2,2,2h8c1.103,0,2-0.897,2-2V9c0-1.103-0.897-2-2-2H8z"/>
-</g>
-</svg>
diff --git a/resources/oojs-ui/images/indicators/down.png b/resources/oojs-ui/images/indicators/down.png
deleted file mode 100644 (file)
index 47ff54c..0000000
Binary files a/resources/oojs-ui/images/indicators/down.png and /dev/null differ
diff --git a/resources/oojs-ui/images/indicators/down.svg b/resources/oojs-ui/images/indicators/down.svg
deleted file mode 100644 (file)
index c871f60..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="12px"
-        height="12px" viewBox="0 0 12 12" style="enable-background:new 0 0 12 12;" xml:space="preserve">
-<g id="down" style="opacity:0.75;">
-       <polygon id="arrow" style="fill-rule:evenodd;clip-rule:evenodd;" points="2.023,3 5.512,8.953 9,3"/>
-</g>
-</svg>
diff --git a/resources/oojs-ui/images/indicators/required.png b/resources/oojs-ui/images/indicators/required.png
deleted file mode 100644 (file)
index aeb35a3..0000000
Binary files a/resources/oojs-ui/images/indicators/required.png and /dev/null differ
diff --git a/resources/oojs-ui/images/indicators/required.svg b/resources/oojs-ui/images/indicators/required.svg
deleted file mode 100644 (file)
index 7c60ec0..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="12" height="12" viewBox="0, 0, 12, 12">
-  <g id="required" opacity="0.75">
-    <path d="M7,0 L7,4.268 L10.696,2.134 L11.696,3.866 L8,6 L11.696,8.134 L10.696,9.866 L7,7.732 L7,12 L5,12 L5,7.732 L1.304,9.866 L0.304,8.134 L4,6 L0.304,3.866 L1.304,2.134 L5,4.268 L5,0 z" fill="#000000"/>
-  </g>
-  <defs/>
-</svg>
diff --git a/resources/oojs-ui/images/indicators/up.png b/resources/oojs-ui/images/indicators/up.png
deleted file mode 100644 (file)
index b827f6d..0000000
Binary files a/resources/oojs-ui/images/indicators/up.png and /dev/null differ
diff --git a/resources/oojs-ui/images/indicators/up.svg b/resources/oojs-ui/images/indicators/up.svg
deleted file mode 100644 (file)
index a5d7f38..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="12px"
-        height="12px" viewBox="0 0 12 12" style="enable-background:new 0 0 12 12;" xml:space="preserve">
-<g id="up" style="opacity:0.75;">
-       <polygon id="arrow" style="fill-rule:evenodd;clip-rule:evenodd;" points="5.512,2.006 2,8 9.024,8                "/>
-</g>
-</svg>
diff --git a/resources/oojs-ui/images/tail.svg b/resources/oojs-ui/images/tail.svg
deleted file mode 100644 (file)
index 4df8bb2..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-        width="15px" height="8px" viewBox="0 0 15 8" style="enable-background:new 0 0 15 8;" xml:space="preserve">
-<g id="tail">
-       <polygon id="outline" style="fill-rule:evenodd;clip-rule:evenodd;fill:#808080;" points="7.609,2.499 2.096,8 13.125,8"/>
-       <polygon id="fill" style="fill-rule:evenodd;clip-rule:evenodd;fill:#FFFFFF;" points="7.609,3 2.598,8 12.622,8"/>
-</g>
-</svg>
diff --git a/resources/oojs-ui/images/textures/pending.gif b/resources/oojs-ui/images/textures/pending.gif
deleted file mode 100644 (file)
index 1194eed..0000000
Binary files a/resources/oojs-ui/images/textures/pending.gif and /dev/null differ
diff --git a/resources/oojs-ui/images/textures/transparency.png b/resources/oojs-ui/images/textures/transparency.png
deleted file mode 100644 (file)
index b8e36d3..0000000
Binary files a/resources/oojs-ui/images/textures/transparency.png and /dev/null differ
diff --git a/resources/oojs-ui/images/toolbar-shadow.png b/resources/oojs-ui/images/toolbar-shadow.png
deleted file mode 100644 (file)
index 97e8d13..0000000
Binary files a/resources/oojs-ui/images/toolbar-shadow.png and /dev/null differ
diff --git a/resources/oojs-ui/oojs-ui-agora.css b/resources/oojs-ui/oojs-ui-agora.css
deleted file mode 100644 (file)
index 8aedde5..0000000
+++ /dev/null
@@ -1,80 +0,0 @@
-.oo-ui-window-head {
-  height: 3.35em;
-  border-bottom: 1px solid #dddddd;
-}
-
-.oo-ui-window-body {
-  padding: 2em 3.35em;
-}
-
-.oo-ui-window-icon {
-  width: 3.35em;
-  height: 3.35em;
-  background-size: 2em auto;
-  border-left: 1px solid #dddddd;
-}
-
-.oo-ui-window-title {
-  line-height: 3.35em;
-}
-
-.oo-ui-buttonedElement.oo-ui-indicatedElement .oo-ui-buttonedElement-button > .oo-ui-indicatedElement-indicator,
-.oo-ui-buttonedElement.oo-ui-iconedElement .oo-ui-buttonedElement-button > .oo-ui-iconedElement-icon {
-  width: 3.35em;
-  height: 3.35em;
-  background-size: 2em auto;
-}
-
-.oo-ui-optionWidget {
-  padding: 0.8em 1em 0.8em 3.35em;
-  font-weight: bold;
-  border-bottom: 1px solid #dddddd;
-}
-
-.oo-ui-optionWidget.oo-ui-indicatedElement .oo-ui-labeledElement-label {
-  padding-right: 1.5em;
-}
-
-.oo-ui-optionWidget-level-0 {
-  padding-left: 3.5em;
-}
-
-.oo-ui-optionWidget-level-0 .oo-ui-iconedElement-icon {
-  left: 1em;
-}
-
-.oo-ui-optionWidget-level-1 {
-  padding-left: 5em;
-}
-
-.oo-ui-optionWidget-level-1 .oo-ui-iconedElement-icon {
-  left: 2.5em;
-}
-
-.oo-ui-optionWidget-level-2 {
-  padding-left: 6.5em;
-}
-
-.oo-ui-optionWidget-level-2 .oo-ui-iconedElement-icon {
-  left: 4em;
-}
-
-.oo-ui-buttonOptionWidget {
-  padding: 0;
-}
-
-.oo-ui-menuItemWidget.oo-ui-optionWidget-selected {
-  color: #ffffff;
-  background: #347bff;
-}
-
-.oo-ui-menuSectionItemWidget {
-  font-weight: normal;
-  color: #777777;
-  border: none;
-}
-
-.oo-ui-textInputWidget input,
-.oo-ui-textInputWidget textarea {
-  padding: .8em 1em;
-}
\ No newline at end of file
diff --git a/resources/oojs-ui/oojs-ui-apex.css b/resources/oojs-ui/oojs-ui-apex.css
deleted file mode 100644 (file)
index 091f4fc..0000000
+++ /dev/null
@@ -1,776 +0,0 @@
-.oo-ui-dialog {
-  background-color: #fff;
-  background-color: rgba(255, 255, 255, 0.5);
-  opacity: 0;
-  -webkit-transition: all 250ms ease-in-out;
-     -moz-transition: all 250ms ease-in-out;
-      -ms-transition: all 250ms ease-in-out;
-       -o-transition: all 250ms ease-in-out;
-          transition: all 250ms ease-in-out;
-}
-
-.oo-ui-dialog .oo-ui-window-frame {
-  background-color: #fff;
-  border: solid 1px #ccc;
-  border-radius: 0.5em;
-  -webkit-transform: scale(0.5);
-     -moz-transform: scale(0.5);
-      -ms-transform: scale(0.5);
-       -o-transform: scale(0.5);
-          transform: scale(0.5);
-  box-shadow: 0 0.2em 1em rgba(0, 0, 0, 0.3);
-  -webkit-transition: all 250ms ease-in-out;
-     -moz-transition: all 250ms ease-in-out;
-      -ms-transition: all 250ms ease-in-out;
-       -o-transition: all 250ms ease-in-out;
-          transition: all 250ms ease-in-out;
-}
-
-.oo-ui-dialog-open {
-  opacity: 1;
-}
-
-.oo-ui-dialog-open .oo-ui-window-frame {
-  -webkit-transform: scale(1);
-     -moz-transform: scale(1);
-      -ms-transform: scale(1);
-       -o-transform: scale(1);
-          transform: scale(1);
-}
-
-.oo-ui-dialog-content .oo-ui-window-body {
-  box-shadow: 0 0 0.66em rgba(0, 0, 0, 0.25);
-}
-
-.oo-ui-frame-content {
-  font-family: sans-serif;
-  font-size: 0.8em;
-}
-
-.oo-ui-toolbar-bar {
-  background: #f8fbfd;
-  background-image: -webkit-gradient(linear, right top, right bottom, color-stop(0%, #ffffff), color-stop(100%, #f1f7fb));
-  background-image: -webkit-linear-gradient(top, #ffffff 0%, #f1f7fb 100%);
-  background-image: -moz-linear-gradient(top, #ffffff 0%, #f1f7fb 100%);
-  background-image: -ms-linear-gradient(top, #ffffff 0%, #f1f7fb 100%);
-  background-image: -o-linear-gradient(top, #ffffff 0%, #f1f7fb 100%);
-  background-image: linear-gradient(top, #ffffff 0%, #f1f7fb 100%);
-  border-bottom: solid 1px #ccc;
-  filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#ffffff', endColorstr='#f1f7fb');
-}
-
-.oo-ui-toolbar-bar .oo-ui-toolbar-bar {
-  background: none;
-  border: none;
-}
-
-.oo-ui-toolbar-shadow {
-  bottom: -9px;
-  height: 9px;
-  background-image: /* @embed */ url(images/toolbar-shadow.png);
-  opacity: 0.125;
-  -webkit-transition: opacity 500ms ease-in-out;
-     -moz-transition: opacity 500ms ease-in-out;
-      -ms-transition: opacity 500ms ease-in-out;
-       -o-transition: opacity 500ms ease-in-out;
-          transition: opacity 500ms ease-in-out;
-}
-
-.oo-ui-toolGroup {
-  border: solid 1px transparent;
-  border-radius: 0.25em;
-  -webkit-transition: border-color 300ms ease-in-out;
-     -moz-transition: border-color 300ms ease-in-out;
-      -ms-transition: border-color 300ms ease-in-out;
-       -o-transition: border-color 300ms ease-in-out;
-          transition: border-color 300ms ease-in-out;
-}
-
-.oo-ui-toolGroup.oo-ui-widget-enabled:hover {
-  border-color: rgba(0, 0, 0, 0.1);
-}
-
-.oo-ui-toolGroup.oo-ui-widget-enabled .oo-ui-tool-link .oo-ui-tool-title {
-  color: #000;
-}
-
-.oo-ui-window-body {
-  padding: 0 0.75em;
-}
-
-.oo-ui-window-icon {
-  width: 2em;
-  height: 2em;
-  margin-right: 0.5em;
-  line-height: 2em;
-}
-
-.oo-ui-window-title {
-  line-height: 2em;
-  color: #333;
-}
-
-.oo-ui-window-overlay {
-  font-family: sans-serif;
-  font-size: 1em;
-  line-height: 1.5em;
-}
-
-.oo-ui-buttonedElement .oo-ui-buttonedElement-button {
-  color: #333;
-}
-
-.oo-ui-buttonedElement.oo-ui-indicatedElement .oo-ui-buttonedElement-button > .oo-ui-indicatedElement-indicator,
-.oo-ui-buttonedElement.oo-ui-iconedElement .oo-ui-buttonedElement-button > .oo-ui-iconedElement-icon {
-  width: 1.9em;
-  height: 1.9em;
-  opacity: 0.8;
-}
-
-.oo-ui-buttonedElement-frameless .oo-ui-buttonedElement-button > .oo-ui-iconedElement-icon {
-  /* Don't animate opacities for now, causes wiggling in Chrome (bug 63020) */
-
-  /*.oo-ui-transition(opacity 200ms);*/
-
-}
-
-.oo-ui-buttonedElement-frameless .oo-ui-buttonedElement-button:hover > .oo-ui-iconedElement-icon,
-.oo-ui-buttonedElement-frameless .oo-ui-buttonedElement-button:focus > .oo-ui-iconedElement-icon {
-  opacity: 1;
-}
-
-.oo-ui-buttonedElement-frameless .oo-ui-buttonedElement-button:hover > .oo-ui-labeledElement-label,
-.oo-ui-buttonedElement-frameless .oo-ui-buttonedElement-button:focus > .oo-ui-labeledElement-label {
-  color: #000;
-}
-
-.oo-ui-buttonedElement-frameless .oo-ui-buttonedElement-button > .oo-ui-labeledElement-label {
-  color: #333;
-}
-
-.oo-ui-buttonedElement-frameless.oo-ui-widget-disabled .oo-ui-buttonedElement-button > .oo-ui-iconedElement-icon {
-  opacity: 0.2;
-}
-
-.oo-ui-buttonedElement-frameless.oo-ui-widget-disabled .oo-ui-buttonedElement-button > .oo-ui-labeledElement-label {
-  color: #ccc;
-}
-
-.oo-ui-buttonedElement-framed .oo-ui-buttonedElement-button {
-  text-shadow: 0 1px 1px rgba(255, 255, 255, 0.5);
-  background: #eeeeee;
-  background-image: -webkit-gradient(linear, right top, right bottom, color-stop(0%, #ffffff), color-stop(100%, #dddddd));
-  background-image: -webkit-linear-gradient(top, #ffffff 0%, #dddddd 100%);
-  background-image: -moz-linear-gradient(top, #ffffff 0%, #dddddd 100%);
-  background-image: -ms-linear-gradient(top, #ffffff 0%, #dddddd 100%);
-  background-image: -o-linear-gradient(top, #ffffff 0%, #dddddd 100%);
-  background-image: linear-gradient(top, #ffffff 0%, #dddddd 100%);
-  border: 1px #c9c9c9 solid;
-  border-radius: 0.3em;
-  filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#ffffff', endColorstr='#dddddd');
-  -webkit-transition: border-color 100ms ease-in-out;
-     -moz-transition: border-color 100ms ease-in-out;
-      -ms-transition: border-color 100ms ease-in-out;
-       -o-transition: border-color 100ms ease-in-out;
-          transition: border-color 100ms ease-in-out;
-}
-
-.oo-ui-buttonedElement-framed .oo-ui-buttonedElement-button:hover,
-.oo-ui-buttonedElement-framed .oo-ui-buttonedElement-button:focus {
-  border-color: #aaa;
-}
-
-.oo-ui-buttonedElement-framed .oo-ui-buttonedElement-button.oo-ui-buttonedElement-active,
-.oo-ui-buttonedElement-framed .oo-ui-buttonedElement-button.oo-ui-buttonedElement-pressed {
-  color: black;
-  background: #eeeeee;
-  background-image: -webkit-gradient(linear, right top, right bottom, color-stop(0%, #dddddd), color-stop(100%, #ffffff));
-  background-image: -webkit-linear-gradient(top, #dddddd 0%, #ffffff 100%);
-  background-image: -moz-linear-gradient(top, #dddddd 0%, #ffffff 100%);
-  background-image: -ms-linear-gradient(top, #dddddd 0%, #ffffff 100%);
-  background-image: -o-linear-gradient(top, #dddddd 0%, #ffffff 100%);
-  background-image: linear-gradient(top, #dddddd 0%, #ffffff 100%);
-  border-color: #c9c9c9;
-  filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#dddddd', endColorstr='#ffffff');
-  box-shadow: inset 0 1px 4px 0 rgba(0, 0, 0, 0.07);
-}
-
-.oo-ui-buttonedElement-framed.oo-ui-flaggableElement-primary .oo-ui-buttonedElement-button {
-  background: #cde7f4;
-  background-image: -webkit-gradient(linear, right top, right bottom, color-stop(0%, #eaf4fa), color-stop(100%, #b0d9ee));
-  background-image: -webkit-linear-gradient(top, #eaf4fa 0%, #b0d9ee 100%);
-  background-image: -moz-linear-gradient(top, #eaf4fa 0%, #b0d9ee 100%);
-  background-image: -ms-linear-gradient(top, #eaf4fa 0%, #b0d9ee 100%);
-  background-image: -o-linear-gradient(top, #eaf4fa 0%, #b0d9ee 100%);
-  background-image: linear-gradient(top, #eaf4fa 0%, #b0d9ee 100%);
-  border: solid 1px #a6cee1;
-  filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#eaf4fa', endColorstr='#b0d9ee');
-}
-
-.oo-ui-buttonedElement-framed.oo-ui-flaggableElement-primary .oo-ui-buttonedElement-button:hover,
-.oo-ui-buttonedElement-framed.oo-ui-flaggableElement-primary .oo-ui-buttonedElement-button:focus {
-  border-color: #9dc2d4;
-}
-
-.oo-ui-buttonedElement-framed.oo-ui-flaggableElement-primary .oo-ui-buttonedElement-button.oo-ui-buttonedElement-active,
-.oo-ui-buttonedElement-framed.oo-ui-flaggableElement-primary .oo-ui-buttonedElement-button.oo-ui-buttonedElement-pressed {
-  background: #cde7f4;
-  background-image: -webkit-gradient(linear, right top, right bottom, color-stop(0%, #b0d9ee), color-stop(100%, #eaf4fa));
-  background-image: -webkit-linear-gradient(top, #b0d9ee 0%, #eaf4fa 100%);
-  background-image: -moz-linear-gradient(top, #b0d9ee 0%, #eaf4fa 100%);
-  background-image: -ms-linear-gradient(top, #b0d9ee 0%, #eaf4fa 100%);
-  background-image: -o-linear-gradient(top, #b0d9ee 0%, #eaf4fa 100%);
-  background-image: linear-gradient(top, #b0d9ee 0%, #eaf4fa 100%);
-  border: solid 1px #a6cee1;
-  filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#b0d9ee', endColorstr='#eaf4fa');
-}
-
-.oo-ui-buttonedElement-framed.oo-ui-flaggableElement-constructive .oo-ui-buttonedElement-button {
-  background: #daf0be;
-  background-image: -webkit-gradient(linear, right top, right bottom, color-stop(0%, #f0fbe1), color-stop(100%, #c3e59a));
-  background-image: -webkit-linear-gradient(top, #f0fbe1 0%, #c3e59a 100%);
-  background-image: -moz-linear-gradient(top, #f0fbe1 0%, #c3e59a 100%);
-  background-image: -ms-linear-gradient(top, #f0fbe1 0%, #c3e59a 100%);
-  background-image: -o-linear-gradient(top, #f0fbe1 0%, #c3e59a 100%);
-  background-image: linear-gradient(top, #f0fbe1 0%, #c3e59a 100%);
-  border: solid 1px #b8d892;
-  filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#f0fbe1', endColorstr='#c3e59a');
-}
-
-.oo-ui-buttonedElement-framed.oo-ui-flaggableElement-constructive .oo-ui-buttonedElement-button:hover,
-.oo-ui-buttonedElement-framed.oo-ui-flaggableElement-constructive .oo-ui-buttonedElement-button:focus {
-  border-color: #adcb89;
-}
-
-.oo-ui-buttonedElement-framed.oo-ui-flaggableElement-constructive .oo-ui-buttonedElement-button.oo-ui-buttonedElement-active,
-.oo-ui-buttonedElement-framed.oo-ui-flaggableElement-constructive .oo-ui-buttonedElement-button.oo-ui-buttonedElement-pressed {
-  background: #daf0be;
-  background-image: -webkit-gradient(linear, right top, right bottom, color-stop(0%, #c3e59a), color-stop(100%, #f0fbe1));
-  background-image: -webkit-linear-gradient(top, #c3e59a 0%, #f0fbe1 100%);
-  background-image: -moz-linear-gradient(top, #c3e59a 0%, #f0fbe1 100%);
-  background-image: -ms-linear-gradient(top, #c3e59a 0%, #f0fbe1 100%);
-  background-image: -o-linear-gradient(top, #c3e59a 0%, #f0fbe1 100%);
-  background-image: linear-gradient(top, #c3e59a 0%, #f0fbe1 100%);
-  border: solid 1px #b8d892;
-  filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#c3e59a', endColorstr='#f0fbe1');
-}
-
-.oo-ui-buttonedElement-framed.oo-ui-flaggableElement-destructive .oo-ui-buttonedElement-button {
-  color: #d45353;
-}
-
-.oo-ui-buttonedElement-framed.oo-ui-widget-disabled .oo-ui-buttonedElement-button,
-.oo-ui-buttonedElement-framed.oo-ui-widget-disabled .oo-ui-buttonedElement-button.oo-ui-buttonedElement-active,
-.oo-ui-buttonedElement-framed.oo-ui-widget-disabled .oo-ui-buttonedElement-button.oo-ui-buttonedElement-pressed {
-  color: #333;
-  background: #eee;
-  opacity: 0.5;
-  box-shadow: none;
-}
-
-.oo-ui-buttonedElement-framed.oo-ui-widget-disabled .oo-ui-buttonedElement-button:hover,
-.oo-ui-buttonedElement-framed.oo-ui-widget-disabled .oo-ui-buttonedElement-button.oo-ui-buttonedElement-active:hover,
-.oo-ui-buttonedElement-framed.oo-ui-widget-disabled .oo-ui-buttonedElement-button.oo-ui-buttonedElement-pressed:hover,
-.oo-ui-buttonedElement-framed.oo-ui-widget-disabled .oo-ui-buttonedElement-button:focus,
-.oo-ui-buttonedElement-framed.oo-ui-widget-disabled .oo-ui-buttonedElement-button.oo-ui-buttonedElement-active:focus,
-.oo-ui-buttonedElement-framed.oo-ui-widget-disabled .oo-ui-buttonedElement-button.oo-ui-buttonedElement-pressed:focus {
-  border-color: #ccc;
-  box-shadow: none;
-}
-
-.oo-ui-bookletLayout > .oo-ui-gridLayout > .oo-ui-panelLayout {
-  -webkit-transition: width 250ms ease-in-out, height 250ms ease-in-out, top 250ms ease-in-out, left 250ms ease-in-out;
-     -moz-transition: width 250ms ease-in-out, height 250ms ease-in-out, top 250ms ease-in-out, left 250ms ease-in-out;
-      -ms-transition: width 250ms ease-in-out, height 250ms ease-in-out, top 250ms ease-in-out, left 250ms ease-in-out;
-       -o-transition: width 250ms ease-in-out, height 250ms ease-in-out, top 250ms ease-in-out, left 250ms ease-in-out;
-          transition: width 250ms ease-in-out, height 250ms ease-in-out, top 250ms ease-in-out, left 250ms ease-in-out;
-}
-
-.oo-ui-bookletLayout-outlinePanel {
-  border-right: solid 1px #ddd;
-}
-
-.oo-ui-bookletLayout-outlinePanel .oo-ui-outlineControlsWidget {
-  box-shadow: 0 0 0.25em rgba(0, 0, 0, 0.25);
-}
-
-.oo-ui-fieldsetLayout {
-  border: none;
-}
-
-.oo-ui-fieldsetLayout > legend.oo-ui-labeledElement-label {
-  font-size: 1.5em;
-}
-
-.oo-ui-barToolGroup .oo-ui-tool {
-  margin: -1px 0 -1px -1px;
-  border: solid 1px transparent;
-}
-
-.oo-ui-barToolGroup .oo-ui-tool:first-child {
-  border-bottom-left-radius: 0.25em;
-  border-top-left-radius: 0.25em;
-}
-
-.oo-ui-barToolGroup .oo-ui-tool:last-child {
-  margin-right: -1px;
-  border-top-right-radius: 0.25em;
-  border-bottom-right-radius: 0.25em;
-}
-
-.oo-ui-barToolGroup .oo-ui-tool-link .oo-ui-iconedElement-icon {
-  opacity: 0.8;
-}
-
-.oo-ui-barToolGroup.oo-ui-widget-enabled .oo-ui-tool.oo-ui-widget-enabled:hover {
-  border-color: rgba(0, 0, 0, 0.2);
-}
-
-.oo-ui-barToolGroup.oo-ui-widget-enabled .oo-ui-tool-active.oo-ui-widget-enabled {
-  background: #f8fbfd;
-  background-image: -webkit-gradient(linear, right top, right bottom, color-stop(0%, #f1f7fb), color-stop(100%, #ffffff));
-  background-image: -webkit-linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
-  background-image: -moz-linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
-  background-image: -ms-linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
-  background-image: -o-linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
-  background-image: linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
-  border-color: rgba(0, 0, 0, 0.2);
-  filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#f1f7fb', endColorstr='#ffffff');
-  box-shadow: inset 0 0.07em 0.07em 0 rgba(0, 0, 0, 0.07);
-}
-
-.oo-ui-barToolGroup.oo-ui-widget-enabled .oo-ui-tool-active.oo-ui-widget-enabled + .oo-ui-tool-active.oo-ui-widget-enabled {
-  border-left-color: rgba(0, 0, 0, 0.1);
-}
-
-.oo-ui-barToolGroup.oo-ui-widget-enabled .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link .oo-ui-iconedElement-icon {
-  opacity: 0.2;
-}
-
-.oo-ui-barToolGroup.oo-ui-widget-enabled .oo-ui-tool.oo-ui-widget-enabled .oo-ui-tool-link .oo-ui-iconedElement-icon {
-  opacity: 0.8;
-}
-
-.oo-ui-barToolGroup.oo-ui-widget-enabled .oo-ui-tool.oo-ui-widget-enabled:hover .oo-ui-tool-link .oo-ui-iconedElement-icon {
-  opacity: 1;
-}
-
-.oo-ui-barToolGroup.oo-ui-widget-disabled .oo-ui-tool-link .oo-ui-iconedElement-icon {
-  opacity: 0.2;
-}
-
-.oo-ui-listToolGroup.oo-ui-popupToolGroup-active {
-  border-color: rgba(0, 0, 0, 0.2);
-}
-
-.oo-ui-listToolGroup .oo-ui-tool {
-  margin: -1px 0;
-  border: solid 1px transparent;
-}
-
-.oo-ui-listToolGroup .oo-ui-tool-active.oo-ui-widget-enabled {
-  background: #f8fbfd;
-  background-image: -webkit-gradient(linear, right top, right bottom, color-stop(0%, #f1f7fb), color-stop(100%, #ffffff));
-  background-image: -webkit-linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
-  background-image: -moz-linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
-  background-image: -ms-linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
-  background-image: -o-linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
-  background-image: linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
-  border-color: rgba(0, 0, 0, 0.1);
-  filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#f1f7fb', endColorstr='#ffffff');
-  box-shadow: inset 0 0.07em 0.07em 0 rgba(0, 0, 0, 0.07);
-}
-
-.oo-ui-listToolGroup .oo-ui-tool-active.oo-ui-widget-enabled + .oo-ui-tool-active.oo-ui-widget-enabled {
-  border-top-color: rgba(0, 0, 0, 0.1);
-}
-
-.oo-ui-listToolGroup .oo-ui-tool-active.oo-ui-widget-enabled:hover {
-  border-color: rgba(0, 0, 0, 0.2);
-}
-
-.oo-ui-listToolGroup .oo-ui-tool.oo-ui-widget-enabled:hover {
-  border-color: rgba(0, 0, 0, 0.2);
-}
-
-.oo-ui-listToolGroup .oo-ui-tool.oo-ui-widget-enabled .oo-ui-tool-link .oo-ui-iconedElement-icon {
-  opacity: 0.8;
-}
-
-.oo-ui-listToolGroup .oo-ui-tool.oo-ui-widget-enabled:hover .oo-ui-tool-link .oo-ui-iconedElement-icon {
-  opacity: 1;
-}
-
-.oo-ui-listToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link .oo-ui-tool-title {
-  color: #ccc;
-}
-
-.oo-ui-listToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link .oo-ui-iconedElement-icon {
-  opacity: 0.2;
-}
-
-.oo-ui-listToolGroup.oo-ui-widget-disabled .oo-ui-indicatedElement-indicator,
-.oo-ui-listToolGroup.oo-ui-widget-disabled .oo-ui-iconedElement-icon {
-  opacity: 0.2;
-}
-
-.oo-ui-menuToolGroup {
-  border-color: rgba(0, 0, 0, 0.1);
-}
-
-.oo-ui-menuToolGroup.oo-ui-widget-enabled:hover {
-  border-color: rgba(0, 0, 0, 0.2);
-}
-
-.oo-ui-menuToolGroup.oo-ui-popupToolGroup-active {
-  border-color: rgba(0, 0, 0, 0.25);
-}
-
-.oo-ui-menuToolGroup .oo-ui-tool.oo-ui-widget-enabled:hover {
-  background-color: #e1f3ff;
-}
-
-.oo-ui-menuToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link .oo-ui-tool-title {
-  color: #ccc;
-}
-
-.oo-ui-menuToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link .oo-ui-iconedElement-icon {
-  opacity: 0.2;
-}
-
-.oo-ui-menuToolGroup.oo-ui-widget-disabled {
-  color: #ccc;
-  text-shadow: 0 1px 1px #fff;
-  background-color: #f3f3f3;
-  border-color: #ddd;
-}
-
-.oo-ui-menuToolGroup.oo-ui-widget-disabled .oo-ui-indicatedElement-indicator,
-.oo-ui-menuToolGroup.oo-ui-widget-disabled .oo-ui-iconedElement-icon {
-  opacity: 0.2;
-}
-
-.oo-ui-popupToolGroup-handle .oo-ui-indicatedElement-indicator,
-.oo-ui-popupToolGroup-handle .oo-ui-iconedElement-icon {
-  opacity: 0.8;
-}
-
-.oo-ui-popupToolGroup .oo-ui-toolGroup-tools {
-  background-color: white;
-  border: solid 1px #ccc;
-  box-shadow: 0 0.25em 1em rgba(0, 0, 0, 0.25);
-}
-
-.oo-ui-popupToolGroup-active.oo-ui-widget-enabled {
-  background: #f8fbfd;
-  background-image: -webkit-gradient(linear, right top, right bottom, color-stop(0%, #f1f7fb), color-stop(100%, #ffffff));
-  background-image: -webkit-linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
-  background-image: -moz-linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
-  background-image: -ms-linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
-  background-image: -o-linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
-  background-image: linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
-  border-bottom-right-radius: 0;
-  border-bottom-left-radius: 0;
-  filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#f1f7fb', endColorstr='#ffffff');
-  box-shadow: inset 0 0.07em 0.07em 0 rgba(0, 0, 0, 0.07);
-}
-
-.oo-ui-optionWidget {
-  padding: 0.5em 2em 0.5em 3em;
-}
-
-.oo-ui-optionWidget-highlighted {
-  background-color: #e1f3ff;
-}
-
-.oo-ui-optionWidget-selected {
-  background-color: #a7dcff;
-}
-
-.oo-ui-optionWidget.oo-ui-widget-disabled {
-  color: #ccc;
-}
-
-.oo-ui-menuWidget {
-  margin-top: -1px;
-  background: #fff;
-  border: solid 1px #ccc;
-  border-radius: 0 0 0.25em 0.25em;
-  box-shadow: 0 0.15em 1em 0 rgba(0, 0, 0, 0.2);
-}
-
-.oo-ui-popupWidget-popup {
-  background-color: #fff;
-  border: solid 1px #ccc;
-  border-radius: 0.25em;
-  box-shadow: 0 0.15em 0.5em 0 rgba(0, 0, 0, 0.2);
-}
-
-.oo-ui-popupWidget-tailed .oo-ui-popupWidget-tail {
-  width: 15px;
-  height: 8px;
-  margin-left: -7px;
-  background-image: /* @embed */ url(images/tail.svg);
-}
-
-.oo-ui-popupWidget-transitioning .oo-ui-popupWidget-popup {
-  -webkit-transition: width 100ms ease-in-out, height 100ms ease-in-out, left 100ms ease-in-out;
-     -moz-transition: width 100ms ease-in-out, height 100ms ease-in-out, left 100ms ease-in-out;
-      -ms-transition: width 100ms ease-in-out, height 100ms ease-in-out, left 100ms ease-in-out;
-       -o-transition: width 100ms ease-in-out, height 100ms ease-in-out, left 100ms ease-in-out;
-          transition: width 100ms ease-in-out, height 100ms ease-in-out, left 100ms ease-in-out;
-}
-
-.oo-ui-popupWidget-body {
-  box-shadow: 0 0 0.66em rgba(0, 0, 0, 0.25);
-}
-
-.oo-ui-buttonGroupWidget {
-  display: inline-block;
-  white-space: nowrap;
-}
-
-.oo-ui-buttonOptionWidget {
-  padding: 0;
-}
-
-.oo-ui-buttonOptionWidget.oo-ui-optionWidget-selected,
-.oo-ui-buttonOptionWidget.oo-ui-optionWidget-highlighted {
-  background-color: transparent;
-}
-
-.oo-ui-buttonSelectWidget {
-  border-radius: 0.3em;
-}
-
-.oo-ui-buttonSelectWidget .oo-ui-buttonOptionWidget .oo-ui-buttonedElement-button {
-  margin-left: -1px;
-  border-radius: 0;
-}
-
-.oo-ui-buttonSelectWidget .oo-ui-buttonOptionWidget:first-child .oo-ui-buttonedElement-button {
-  margin-left: 0;
-  border-bottom-left-radius: 0.3em;
-  border-top-left-radius: 0.3em;
-}
-
-.oo-ui-buttonSelectWidget .oo-ui-buttonOptionWidget:last-child .oo-ui-buttonedElement-button {
-  border-top-right-radius: 0.3em;
-  border-bottom-right-radius: 0.3em;
-}
-
-.oo-ui-inlineMenuWidget-handle {
-  border: solid 1px rgba(0, 0, 0, 0.1);
-  border-radius: 0.25em;
-}
-
-.oo-ui-inlineMenuWidget-handle:hover {
-  border-color: rgba(0, 0, 0, 0.2);
-}
-
-.oo-ui-inlineMenuWidget-handle .oo-ui-indicatedElement-indicator,
-.oo-ui-inlineMenuWidget-handle .oo-ui-iconedElement-icon {
-  opacity: 0.8;
-}
-
-.oo-ui-inlineMenuWidget.oo-ui-widget-disabled .oo-ui-inlineMenuWidget-handle {
-  color: #ccc;
-  text-shadow: 0 1px 1px #fff;
-  background-color: #f3f3f3;
-  border-color: #ddd;
-}
-
-.oo-ui-inlineMenuWidget.oo-ui-widget-disabled .oo-ui-indicatedElement-indicator {
-  opacity: 0.2;
-}
-
-.oo-ui-menuItemWidget.oo-ui-optionWidget-highlighted {
-  background-color: #e1f3ff;
-}
-
-.oo-ui-menuSectionItemWidget {
-  padding: 0.33em 0.75em;
-  color: #888;
-}
-
-.oo-ui-outlineControlsWidget {
-  background-color: #fff;
-}
-
-.oo-ui-outlineControlsWidget > .oo-ui-iconedElement-icon {
-  opacity: 0.2;
-}
-
-.oo-ui-outlineItemWidget {
-  font-size: 1.1em;
-}
-
-.oo-ui-outlineItemWidget.oo-ui-indicatedElement .oo-ui-labeledElement-label {
-  padding-right: 1.5em;
-}
-
-.oo-ui-outlineItemWidget-level-0 {
-  padding-left: 3.5em;
-}
-
-.oo-ui-outlineItemWidget-level-0 .oo-ui-iconedElement-icon {
-  left: 1em;
-}
-
-.oo-ui-outlineItemWidget-level-1 {
-  padding-left: 5em;
-}
-
-.oo-ui-outlineItemWidget-level-1 .oo-ui-iconedElement-icon {
-  left: 2.5em;
-}
-
-.oo-ui-outlineItemWidget-level-2 {
-  padding-left: 6.5em;
-}
-
-.oo-ui-outlineItemWidget-level-2 .oo-ui-iconedElement-icon {
-  left: 4em;
-}
-
-.oo-ui-outlineItemWidget.oo-ui-optionWidget-selected {
-  text-shadow: 0 1px 1px rgba(255, 255, 255, 0.5);
-  background-color: #a7dcff;
-}
-
-.oo-ui-outlineItemWidget.oo-ui-flaggableElement-important {
-  font-weight: bold;
-}
-
-.oo-ui-outlineItemWidget.oo-ui-flaggableElement-placeholder {
-  font-style: italic;
-}
-
-.oo-ui-outlineItemWidget.oo-ui-flaggableElement-empty .oo-ui-iconedElement-icon,
-.oo-ui-outlineItemWidget.oo-ui-flaggableElement-empty .oo-ui-indicatedElement-indicator {
-  opacity: 0.5;
-}
-
-.oo-ui-outlineItemWidget.oo-ui-flaggableElement-empty .oo-ui-labeledElement-label {
-  color: #777;
-}
-
-.oo-ui-searchWidget-query {
-  box-shadow: 0 0 0.5em rgba(0, 0, 0, 0.2);
-}
-
-.oo-ui-textInputWidget {
-  width: 20em;
-}
-
-.oo-ui-textInputWidget input,
-.oo-ui-textInputWidget textarea {
-  padding: 0.5em;
-  font-family: sans-serif;
-  font-size: 1em;
-  background-color: #fff;
-  border: solid 1px #ccc;
-  border-radius: 0.25em;
-  box-shadow: 0 0 0 white, inset 0 0.1em 0.2em #ddd;
-  -webkit-transition: border-color 200ms, box-shadow 200ms;
-     -moz-transition: border-color 200ms, box-shadow 200ms;
-      -ms-transition: border-color 200ms, box-shadow 200ms;
-       -o-transition: border-color 200ms, box-shadow 200ms;
-          transition: border-color 200ms, box-shadow 200ms;
-}
-
-.oo-ui-textInputWidget-decorated input,
-.oo-ui-textInputWidget-decorated textarea {
-  padding-left: 2em;
-}
-
-.oo-ui-textInputWidget-icon {
-  width: 2em;
-}
-
-.oo-ui-textInputWidget.oo-ui-widget-enabled input:focus,
-.oo-ui-textInputWidget.oo-ui-widget-enabled textarea:focus {
-  border-color: #a7dcff;
-  outline: none;
-  box-shadow: 0 0 0.3em #a7dcff, 0 0 0 white;
-}
-
-.oo-ui-textInputWidget input[readonly],
-.oo-ui-textInputWidget textarea[readonly] {
-  color: #777;
-  text-shadow: 0 1px 1px #fff;
-}
-
-.oo-ui-textInputWidget-pending input,
-.oo-ui-textInputWidget-pending textarea {
-  background-color: transparent;
-}
-
-.oo-ui-textInputWidget.oo-ui-widget-disabled input,
-.oo-ui-textInputWidget.oo-ui-widget-disabled input:focus,
-.oo-ui-textInputWidget.oo-ui-widget-disabled textarea,
-.oo-ui-textInputWidget.oo-ui-widget-disabled textarea:focus {
-  color: #ccc;
-  text-shadow: 0 1px 1px #fff;
-  background-color: #f3f3f3;
-  border-color: #ddd;
-}
-
-.oo-ui-toggleSwitchWidget {
-  background: #eeeeee;
-  background-image: -webkit-gradient(linear, right top, right bottom, color-stop(0%, #dddddd), color-stop(100%, #ffffff));
-  background-image: -webkit-linear-gradient(top, #dddddd 0%, #ffffff 100%);
-  background-image: -moz-linear-gradient(top, #dddddd 0%, #ffffff 100%);
-  background-image: -ms-linear-gradient(top, #dddddd 0%, #ffffff 100%);
-  background-image: -o-linear-gradient(top, #dddddd 0%, #ffffff 100%);
-  background-image: linear-gradient(top, #dddddd 0%, #ffffff 100%);
-  border: solid 1px #ccc;
-  border-radius: 1em;
-  filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#dddddd', endColorstr='#ffffff');
-  box-shadow: 0 0 0 white, inset 0 0.1em 0.2em #ddd;
-}
-
-.oo-ui-toggleSwitchWidget.oo-ui-widget-disabled {
-  opacity: 0.5;
-}
-
-.oo-ui-toggleSwitchWidget-grip {
-  background: #eeeeee;
-  background-image: -webkit-gradient(linear, right top, right bottom, color-stop(0%, #ffffff), color-stop(100%, #dddddd));
-  background-image: -webkit-linear-gradient(top, #ffffff 0%, #dddddd 100%);
-  background-image: -moz-linear-gradient(top, #ffffff 0%, #dddddd 100%);
-  background-image: -ms-linear-gradient(top, #ffffff 0%, #dddddd 100%);
-  background-image: -o-linear-gradient(top, #ffffff 0%, #dddddd 100%);
-  background-image: linear-gradient(top, #ffffff 0%, #dddddd 100%);
-  border: 1px #c9c9c9 solid;
-  border-radius: 1em;
-  filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#ffffff', endColorstr='#dddddd');
-  box-shadow: 0 0.1em 0.25em rgba(0, 0, 0, 0.1);
-}
-
-.oo-ui-toggleSwitchWidget.oo-ui-widget-enabled:hover,
-.oo-ui-toggleSwitchWidget.oo-ui-widget-enabled:hover .oo-ui-toggleSwitchWidget-grip {
-  border-color: #aaa;
-}
-
-.oo-ui-toggleSwitchWidget .oo-ui-toggleSwitchWidget-glow {
-  background: #cde7f4;
-  background-image: -webkit-gradient(linear, right top, right bottom, color-stop(0%, #b0d9ee), color-stop(100%, #eaf4fa));
-  background-image: -webkit-linear-gradient(top, #b0d9ee 0%, #eaf4fa 100%);
-  background-image: -moz-linear-gradient(top, #b0d9ee 0%, #eaf4fa 100%);
-  background-image: -ms-linear-gradient(top, #b0d9ee 0%, #eaf4fa 100%);
-  background-image: -o-linear-gradient(top, #b0d9ee 0%, #eaf4fa 100%);
-  background-image: linear-gradient(top, #b0d9ee 0%, #eaf4fa 100%);
-  border-radius: 1em;
-  filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#b0d9ee', endColorstr='#eaf4fa');
-  box-shadow: inset 0 1px 4px 0 rgba(0, 0, 0, 0.07);
-}
-
-.oo-ui-toggleWidget-on .oo-ui-toggleSwitchWidget-glow {
-  opacity: 1;
-}
-
-.oo-ui-toggleWidget-off .oo-ui-toggleSwitchWidget-glow {
-  display: block;
-  opacity: 0;
-}
\ No newline at end of file
diff --git a/resources/oojs-ui/oojs-ui.js b/resources/oojs-ui/oojs-ui.js
deleted file mode 100644 (file)
index 937ff33..0000000
+++ /dev/null
@@ -1,8038 +0,0 @@
-/*!
- * OOjs UI v0.1.0-pre (23fb1b6144)
- * https://www.mediawiki.org/wiki/OOjs_UI
- *
- * Copyright 2011–2014 OOjs Team and other contributors.
- * Released under the MIT license
- * http://oojs.mit-license.org
- *
- * Date: Thu Mar 27 2014 14:49:30 GMT-0700 (PDT)
- */
-( function ( OO ) {
-
-'use strict';
-/**
- * Namespace for all classes, static methods and static properties.
- *
- * @class
- * @singleton
- */
-OO.ui = {};
-
-OO.ui.bind = $.proxy;
-
-/**
- * @property {Object}
- */
-OO.ui.Keys = {
-       'UNDEFINED': 0,
-       'BACKSPACE': 8,
-       'DELETE': 46,
-       'LEFT': 37,
-       'RIGHT': 39,
-       'UP': 38,
-       'DOWN': 40,
-       'ENTER': 13,
-       'END': 35,
-       'HOME': 36,
-       'TAB': 9,
-       'PAGEUP': 33,
-       'PAGEDOWN': 34,
-       'ESCAPE': 27,
-       'SHIFT': 16,
-       'SPACE': 32
-};
-
-/**
- * Get the user's language and any fallback languages.
- *
- * These language codes are used to localize user interface elements in the user's language.
- *
- * In environments that provide a localization system, this function should be overridden to
- * return the user's language(s). The default implementation returns English (en) only.
- *
- * @return {string[]} Language codes, in descending order of priority
- */
-OO.ui.getUserLanguages = function () {
-       return [ 'en' ];
-};
-
-/**
- * Get a value in an object keyed by language code.
- *
- * @param {Object.<string,Mixed>} obj Object keyed by language code
- * @param {string|null} [lang] Language code, if omitted or null defaults to any user language
- * @param {string} [fallback] Fallback code, used if no matching language can be found
- * @return {Mixed} Local value
- */
-OO.ui.getLocalValue = function ( obj, lang, fallback ) {
-       var i, len, langs;
-
-       // Requested language
-       if ( obj[lang] ) {
-               return obj[lang];
-       }
-       // Known user language
-       langs = OO.ui.getUserLanguages();
-       for ( i = 0, len = langs.length; i < len; i++ ) {
-               lang = langs[i];
-               if ( obj[lang] ) {
-                       return obj[lang];
-               }
-       }
-       // Fallback language
-       if ( obj[fallback] ) {
-               return obj[fallback];
-       }
-       // First existing language
-       for ( lang in obj ) {
-               return obj[lang];
-       }
-
-       return undefined;
-};
-
-( function () {
-
-/**
- * Message store for the default implementation of OO.ui.msg
- *
- * Environments that provide a localization system should not use this, but should override
- * OO.ui.msg altogether.
- *
- * @private
- */
-var messages = {
-       // Label text for button to exit from dialog
-       'ooui-dialog-action-close': 'Close',
-       // Tool tip for a button that moves items in a list down one place
-       'ooui-outline-control-move-down': 'Move item down',
-       // Tool tip for a button that moves items in a list up one place
-       'ooui-outline-control-move-up': 'Move item up',
-       // Tool tip for a button that removes items from a list
-       'ooui-outline-control-remove': 'Remove item',
-       // Label for the toolbar group that contains a list of all other available tools
-       'ooui-toolbar-more': 'More'
-};
-
-/**
- * Get a localized message.
- *
- * In environments that provide a localization system, this function should be overridden to
- * return the message translated in the user's language. The default implementation always returns
- * English messages.
- *
- * After the message key, message parameters may optionally be passed. In the default implementation,
- * any occurrences of $1 are replaced with the first parameter, $2 with the second parameter, etc.
- * Alternative implementations of OO.ui.msg may use any substitution system they like, as long as
- * they support unnamed, ordered message parameters.
- *
- * @abstract
- * @param {string} key Message key
- * @param {Mixed...} [params] Message parameters
- * @return {string} Translated message with parameters substituted
- */
-OO.ui.msg = function ( key ) {
-       var message = messages[key], params = Array.prototype.slice.call( arguments, 1 );
-       if ( typeof message === 'string' ) {
-               // Perform $1 substitution
-               message = message.replace( /\$(\d+)/g, function ( unused, n ) {
-                       var i = parseInt( n, 10 );
-                       return params[i - 1] !== undefined ? params[i - 1] : '$' + n;
-               } );
-       } else {
-               // Return placeholder if message not found
-               message = '[' + key + ']';
-       }
-       return message;
-};
-
-/** */
-OO.ui.deferMsg = function ( key ) {
-       return function () {
-               return OO.ui.msg( key );
-       };
-};
-
-/** */
-OO.ui.resolveMsg = function ( msg ) {
-       if ( $.isFunction( msg ) ) {
-               return msg();
-       }
-       return msg;
-};
-
-} )();
-/**
- * DOM element abstraction.
- *
- * @abstract
- * @class
- *
- * @constructor
- * @param {Object} [config] Configuration options
- * @cfg {Function} [$] jQuery for the frame the widget is in
- * @cfg {string[]} [classes] CSS class names
- * @cfg {jQuery} [$content] Content elements to append
- */
-OO.ui.Element = function OoUiElement( config ) {
-       // Configuration initialization
-       config = config || {};
-
-       // Properties
-       this.$ = config.$ || OO.ui.Element.getJQuery( document );
-       this.$element = this.$( this.$.context.createElement( this.getTagName() ) );
-       this.elementGroup = null;
-
-       // Initialization
-       if ( $.isArray( config.classes ) ) {
-               this.$element.addClass( config.classes.join( ' ' ) );
-       }
-       if ( config.$content ) {
-               this.$element.append( config.$content );
-       }
-};
-
-/* Static Properties */
-
-OO.ui.Element.static = {};
-
-/**
- * HTML tag name.
- *
- * This may be ignored if getTagName is overridden.
- *
- * @static
- * @property {string}
- * @inheritable
- */
-OO.ui.Element.static.tagName = 'div';
-
-/* Static Methods */
-
-/**
- * Get a jQuery function within a specific document.
- *
- * @static
- * @param {jQuery|HTMLElement|HTMLDocument|Window} context Context to bind the function to
- * @param {OO.ui.Frame} [frame] Frame of the document context
- * @return {Function} Bound jQuery function
- */
-OO.ui.Element.getJQuery = function ( context, frame ) {
-       function wrapper( selector ) {
-               return $( selector, wrapper.context );
-       }
-
-       wrapper.context = this.getDocument( context );
-
-       if ( frame ) {
-               wrapper.frame = frame;
-       }
-
-       return wrapper;
-};
-
-/**
- * Get the document of an element.
- *
- * @static
- * @param {jQuery|HTMLElement|HTMLDocument|Window} obj Object to get the document for
- * @return {HTMLDocument} Document object
- * @throws {Error} If context is invalid
- */
-OO.ui.Element.getDocument = function ( obj ) {
-       var doc =
-               // jQuery - selections created "offscreen" won't have a context, so .context isn't reliable
-               ( obj[0] && obj[0].ownerDocument ) ||
-               // Empty jQuery selections might have a context
-               obj.context ||
-               // HTMLElement
-               obj.ownerDocument ||
-               // Window
-               obj.document ||
-               // HTMLDocument
-               ( obj.nodeType === 9 && obj );
-
-       if ( doc ) {
-               return doc;
-       }
-
-       throw new Error( 'Invalid context' );
-};
-
-/**
- * Get the window of an element or document.
- *
- * @static
- * @param {jQuery|HTMLElement|HTMLDocument|Window} obj Context to get the window for
- * @return {Window} Window object
- */
-OO.ui.Element.getWindow = function ( obj ) {
-       var doc = this.getDocument( obj );
-       return doc.parentWindow || doc.defaultView;
-};
-
-/**
- * Get the direction of an element or document.
- *
- * @static
- * @param {jQuery|HTMLElement|HTMLDocument|Window} obj Context to get the direction for
- * @return {string} Text direction, either `ltr` or `rtl`
- */
-OO.ui.Element.getDir = function ( obj ) {
-       var isDoc, isWin;
-
-       if ( obj instanceof jQuery ) {
-               obj = obj[0];
-       }
-       isDoc = obj.nodeType === 9;
-       isWin = obj.document !== undefined;
-       if ( isDoc || isWin ) {
-               if ( isWin ) {
-                       obj = obj.document;
-               }
-               obj = obj.body;
-       }
-       return $( obj ).css( 'direction' );
-};
-
-/**
- * Get the offset between two frames.
- *
- * TODO: Make this function not use recursion.
- *
- * @static
- * @param {Window} from Window of the child frame
- * @param {Window} [to=window] Window of the parent frame
- * @param {Object} [offset] Offset to start with, used internally
- * @return {Object} Offset object, containing left and top properties
- */
-OO.ui.Element.getFrameOffset = function ( from, to, offset ) {
-       var i, len, frames, frame, rect;
-
-       if ( !to ) {
-               to = window;
-       }
-       if ( !offset ) {
-               offset = { 'top': 0, 'left': 0 };
-       }
-       if ( from.parent === from ) {
-               return offset;
-       }
-
-       // Get iframe element
-       frames = from.parent.document.getElementsByTagName( 'iframe' );
-       for ( i = 0, len = frames.length; i < len; i++ ) {
-               if ( frames[i].contentWindow === from ) {
-                       frame = frames[i];
-                       break;
-               }
-       }
-
-       // Recursively accumulate offset values
-       if ( frame ) {
-               rect = frame.getBoundingClientRect();
-               offset.left += rect.left;
-               offset.top += rect.top;
-               if ( from !== to ) {
-                       this.getFrameOffset( from.parent, offset );
-               }
-       }
-       return offset;
-};
-
-/**
- * Get the offset between two elements.
- *
- * @static
- * @param {jQuery} $from
- * @param {jQuery} $to
- * @return {Object} Translated position coordinates, containing top and left properties
- */
-OO.ui.Element.getRelativePosition = function ( $from, $to ) {
-       var from = $from.offset(),
-               to = $to.offset();
-       return { 'top': Math.round( from.top - to.top ), 'left': Math.round( from.left - to.left ) };
-};
-
-/**
- * Get element border sizes.
- *
- * @static
- * @param {HTMLElement} el Element to measure
- * @return {Object} Dimensions object with `top`, `left`, `bottom` and `right` properties
- */
-OO.ui.Element.getBorders = function ( el ) {
-       var doc = el.ownerDocument,
-               win = doc.parentWindow || doc.defaultView,
-               style = win && win.getComputedStyle ?
-                       win.getComputedStyle( el, null ) :
-                       el.currentStyle,
-               $el = $( el ),
-               top = parseFloat( style ? style.borderTopWidth : $el.css( 'borderTopWidth' ) ) || 0,
-               left = parseFloat( style ? style.borderLeftWidth : $el.css( 'borderLeftWidth' ) ) || 0,
-               bottom = parseFloat( style ? style.borderBottomWidth : $el.css( 'borderBottomWidth' ) ) || 0,
-               right = parseFloat( style ? style.borderRightWidth : $el.css( 'borderRightWidth' ) ) || 0;
-
-       return {
-               'top': Math.round( top ),
-               'left': Math.round( left ),
-               'bottom': Math.round( bottom ),
-               'right': Math.round( right )
-       };
-};
-
-/**
- * Get dimensions of an element or window.
- *
- * @static
- * @param {HTMLElement|Window} el Element to measure
- * @return {Object} Dimensions object with `borders`, `scroll`, `scrollbar` and `rect` properties
- */
-OO.ui.Element.getDimensions = function ( el ) {
-       var $el, $win,
-               doc = el.ownerDocument || el.document,
-               win = doc.parentWindow || doc.defaultView;
-
-       if ( win === el || el === doc.documentElement ) {
-               $win = $( win );
-               return {
-                       'borders': { 'top': 0, 'left': 0, 'bottom': 0, 'right': 0 },
-                       'scroll': {
-                               'top': $win.scrollTop(),
-                               'left': $win.scrollLeft()
-                       },
-                       'scrollbar': { 'right': 0, 'bottom': 0 },
-                       'rect': {
-                               'top': 0,
-                               'left': 0,
-                               'bottom': $win.innerHeight(),
-                               'right': $win.innerWidth()
-                       }
-               };
-       } else {
-               $el = $( el );
-               return {
-                       'borders': this.getBorders( el ),
-                       'scroll': {
-                               'top': $el.scrollTop(),
-                               'left': $el.scrollLeft()
-                       },
-                       'scrollbar': {
-                               'right': $el.innerWidth() - el.clientWidth,
-                               'bottom': $el.innerHeight() - el.clientHeight
-                       },
-                       'rect': el.getBoundingClientRect()
-               };
-       }
-};
-
-/**
- * Get closest scrollable container.
- *
- * Traverses up until either a scrollable element or the root is reached, in which case the window
- * will be returned.
- *
- * @static
- * @param {HTMLElement} el Element to find scrollable container for
- * @param {string} [dimension] Dimension of scrolling to look for; `x`, `y` or omit for either
- * @return {HTMLElement|Window} Closest scrollable container
- */
-OO.ui.Element.getClosestScrollableContainer = function ( el, dimension ) {
-       var i, val,
-               props = [ 'overflow' ],
-               $parent = $( el ).parent();
-
-       if ( dimension === 'x' || dimension === 'y' ) {
-               props.push( 'overflow-' + dimension );
-       }
-
-       while ( $parent.length ) {
-               if ( $parent[0] === el.ownerDocument.body ) {
-                       return $parent[0];
-               }
-               i = props.length;
-               while ( i-- ) {
-                       val = $parent.css( props[i] );
-                       if ( val === 'auto' || val === 'scroll' ) {
-                               return $parent[0];
-                       }
-               }
-               $parent = $parent.parent();
-       }
-       return this.getDocument( el ).body;
-};
-
-/**
- * Scroll element into view.
- *
- * @static
- * @param {HTMLElement} el Element to scroll into view
- * @param {Object} [config={}] Configuration config
- * @param {string} [config.duration] jQuery animation duration value
- * @param {string} [config.direction] Scroll in only one direction, e.g. 'x' or 'y', omit
- *  to scroll in both directions
- * @param {Function} [config.complete] Function to call when scrolling completes
- */
-OO.ui.Element.scrollIntoView = function ( el, config ) {
-       // Configuration initialization
-       config = config || {};
-
-       var anim = {},
-               callback = typeof config.complete === 'function' && config.complete,
-               sc = this.getClosestScrollableContainer( el, config.direction ),
-               $sc = $( sc ),
-               eld = this.getDimensions( el ),
-               scd = this.getDimensions( sc ),
-               rel = {
-                       'top': eld.rect.top - ( scd.rect.top + scd.borders.top ),
-                       'bottom': scd.rect.bottom - scd.borders.bottom - scd.scrollbar.bottom - eld.rect.bottom,
-                       'left': eld.rect.left - ( scd.rect.left + scd.borders.left ),
-                       'right': scd.rect.right - scd.borders.right - scd.scrollbar.right - eld.rect.right
-               };
-
-       if ( !config.direction || config.direction === 'y' ) {
-               if ( rel.top < 0 ) {
-                       anim.scrollTop = scd.scroll.top + rel.top;
-               } else if ( rel.top > 0 && rel.bottom < 0 ) {
-                       anim.scrollTop = scd.scroll.top + Math.min( rel.top, -rel.bottom );
-               }
-       }
-       if ( !config.direction || config.direction === 'x' ) {
-               if ( rel.left < 0 ) {
-                       anim.scrollLeft = scd.scroll.left + rel.left;
-               } else if ( rel.left > 0 && rel.right < 0 ) {
-                       anim.scrollLeft = scd.scroll.left + Math.min( rel.left, -rel.right );
-               }
-       }
-       if ( !$.isEmptyObject( anim ) ) {
-               $sc.stop( true ).animate( anim, config.duration || 'fast' );
-               if ( callback ) {
-                       $sc.queue( function ( next ) {
-                               callback();
-                               next();
-                       } );
-               }
-       } else {
-               if ( callback ) {
-                       callback();
-               }
-       }
-};
-
-/* Methods */
-
-/**
- * Get the HTML tag name.
- *
- * Override this method to base the result on instance information.
- *
- * @return {string} HTML tag name
- */
-OO.ui.Element.prototype.getTagName = function () {
-       return this.constructor.static.tagName;
-};
-
-/**
- * Get the DOM document.
- *
- * @return {HTMLDocument} Document object
- */
-OO.ui.Element.prototype.getElementDocument = function () {
-       return OO.ui.Element.getDocument( this.$element );
-};
-
-/**
- * Get the DOM window.
- *
- * @return {Window} Window object
- */
-OO.ui.Element.prototype.getElementWindow = function () {
-       return OO.ui.Element.getWindow( this.$element );
-};
-
-/**
- * Get closest scrollable container.
- *
- * @see #static-method-getClosestScrollableContainer
- */
-OO.ui.Element.prototype.getClosestScrollableElementContainer = function () {
-       return OO.ui.Element.getClosestScrollableContainer( this.$element[0] );
-};
-
-/**
- * Get group element is in.
- *
- * @return {OO.ui.GroupElement|null} Group element, null if none
- */
-OO.ui.Element.prototype.getElementGroup = function () {
-       return this.elementGroup;
-};
-
-/**
- * Set group element is in.
- *
- * @param {OO.ui.GroupElement|null} group Group element, null if none
- * @chainable
- */
-OO.ui.Element.prototype.setElementGroup = function ( group ) {
-       this.elementGroup = group;
-       return this;
-};
-
-/**
- * Scroll element into view.
- *
- * @see #static-method-scrollIntoView
- * @param {Object} [config={}]
- */
-OO.ui.Element.prototype.scrollElementIntoView = function ( config ) {
-       return OO.ui.Element.scrollIntoView( this.$element[0], config );
-};
-
-( function () {
-       // Static
-       var specialFocusin;
-
-       function handler( e ) {
-               jQuery.event.simulate( 'focusin', e.target, jQuery.event.fix( e ), /* bubble = */ true );
-       }
-
-       specialFocusin = {
-               setup: function () {
-                       var doc = this.ownerDocument || this,
-                               attaches = $.data( doc, 'ooui-focusin-attaches' );
-                       if ( !attaches ) {
-                               doc.addEventListener( 'focus', handler, true );
-                       }
-                       $.data( doc, 'ooui-focusin-attaches', ( attaches || 0 ) + 1 );
-               },
-               teardown: function () {
-                       var doc = this.ownerDocument || this,
-                               attaches = $.data( doc, 'ooui-focusin-attaches' ) - 1;
-                       if ( !attaches ) {
-                               doc.removeEventListener( 'focus', handler, true );
-                               $.removeData( doc, 'ooui-focusin-attaches' );
-                       } else {
-                               $.data( doc, 'ooui-focusin-attaches', attaches );
-                       }
-               }
-       };
-
-       /**
-        * Bind a handler for an event on the DOM element.
-        *
-        * Uses jQuery internally for everything except for events which are
-        * known to have issues in the browser or in jQuery. This method
-        * should become obsolete eventually.
-        *
-        * @param {string} event
-        * @param {Function} callback
-        */
-       OO.ui.Element.prototype.onDOMEvent = function ( event, callback ) {
-               var orig;
-
-               if ( event === 'focusin' ) {
-                       // jQuery 1.8.3 has a bug with handling focusin events inside iframes.
-                       // Firefox doesn't support focusin at all, so we listen for 'focus' on the
-                       // document, and simulate a 'focusin' event on the target element and make
-                       // it bubble from there.
-                       //
-                       // - http://jsfiddle.net/sw3hr/
-                       // - http://bugs.jquery.com/ticket/14180
-                       // - https://github.com/jquery/jquery/commit/1cecf64e5aa4153
-
-                       // Replace jQuery's override with our own
-                       orig = $.event.special.focusin;
-                       $.event.special.focusin = specialFocusin;
-
-                       this.$element.on( event, callback );
-
-                       // Restore
-                       $.event.special.focusin = orig;
-
-               } else {
-                       this.$element.on( event, callback );
-               }
-       };
-
-       /**
-        * @param {string} event
-        * @param {Function} callback
-        */
-       OO.ui.Element.prototype.offDOMEvent = function ( event, callback ) {
-               var orig;
-               if ( event === 'focusin' ) {
-                       orig = $.event.special.focusin;
-                       $.event.special.focusin = specialFocusin;
-                       this.$element.off( event, callback );
-                       $.event.special.focusin = orig;
-               } else {
-                       this.$element.off( event, callback );
-               }
-       };
-}() );
-/**
- * Embedded iframe with the same styles as its parent.
- *
- * @class
- * @extends OO.ui.Element
- * @mixins OO.EventEmitter
- *
- * @constructor
- * @param {Object} [config] Configuration options
- */
-OO.ui.Frame = function OoUiFrame( config ) {
-       // Parent constructor
-       OO.ui.Frame.super.call( this, config );
-
-       // Mixin constructors
-       OO.EventEmitter.call( this );
-
-       // Properties
-       this.loading = false;
-       this.loaded = false;
-       this.config = config;
-
-       // Initialize
-       this.$element
-               .addClass( 'oo-ui-frame' )
-               .attr( { 'frameborder': 0, 'scrolling': 'no' } );
-
-};
-
-/* Inheritance */
-
-OO.inheritClass( OO.ui.Frame, OO.ui.Element );
-
-OO.mixinClass( OO.ui.Frame, OO.EventEmitter );
-
-/* Static Properties */
-
-/**
- * @static
- * @inheritdoc
- */
-OO.ui.Frame.static.tagName = 'iframe';
-
-/* Events */
-
-/**
- * @event load
- */
-
-/* Static Methods */
-
-/**
- * Transplant the CSS styles from as parent document to a frame's document.
- *
- * This loops over the style sheets in the parent document, and copies their nodes to the
- * frame's document. It then polls the document to see when all styles have loaded, and once they
- * have, invokes the callback.
- *
- * If the styles still haven't loaded after a long time (5 seconds by default), we give up waiting
- * and invoke the callback anyway. This protects against cases like a display: none; iframe in
- * Firefox, where the styles won't load until the iframe becomes visible.
- *
- * For details of how we arrived at the strategy used in this function, see #load.
- *
- * @static
- * @inheritable
- * @param {HTMLDocument} parentDoc Document to transplant styles from
- * @param {HTMLDocument} frameDoc Document to transplant styles to
- * @param {Function} [callback] Callback to execute once styles have loaded
- * @param {number} [timeout=5000] How long to wait before giving up (in ms). If 0, never give up.
- */
-OO.ui.Frame.static.transplantStyles = function ( parentDoc, frameDoc, callback, timeout ) {
-       var i, numSheets, styleNode, newNode, timeoutID, pollNodeId, $pendingPollNodes,
-               $pollNodes = $( [] ),
-               // Fake font-family value
-               fontFamily = 'oo-ui-frame-transplantStyles-loaded';
-
-       for ( i = 0, numSheets = parentDoc.styleSheets.length; i < numSheets; i++ ) {
-               styleNode = parentDoc.styleSheets[i].ownerNode;
-               if ( callback && styleNode.nodeName.toLowerCase() === 'link' ) {
-                       // External stylesheet
-                       // Create a node with a unique ID that we're going to monitor to see when the CSS
-                       // has loaded
-                       pollNodeId = 'oo-ui-frame-transplantStyles-loaded-' + i;
-                       $pollNodes = $pollNodes.add( $( '<div>', frameDoc )
-                               .attr( 'id', pollNodeId )
-                               .appendTo( frameDoc.body )
-                       );
-
-                       // Add <style>@import url(...); #pollNodeId { font-family: ... }</style>
-                       // The font-family rule will only take effect once the @import finishes
-                       newNode = frameDoc.createElement( 'style' );
-                       newNode.textContent = '@import url(' + styleNode.href + ');\n' +
-                               '#' + pollNodeId + ' { font-family: ' + fontFamily + '; }';
-               } else {
-                       // Not an external stylesheet, or no polling required; just copy the node over
-                       newNode = frameDoc.importNode( styleNode, true );
-               }
-               frameDoc.head.appendChild( newNode );
-       }
-
-       if ( callback ) {
-               // Poll every 100ms until all external stylesheets have loaded
-               $pendingPollNodes = $pollNodes;
-               timeoutID = setTimeout( function pollExternalStylesheets() {
-                       while (
-                               $pendingPollNodes.length > 0 &&
-                               $pendingPollNodes.eq( 0 ).css( 'font-family' ) === fontFamily
-                       ) {
-                               $pendingPollNodes = $pendingPollNodes.slice( 1 );
-                       }
-
-                       if ( $pendingPollNodes.length === 0 ) {
-                               // We're done!
-                               if ( timeoutID !== null ) {
-                                       timeoutID = null;
-                                       $pollNodes.remove();
-                                       callback();
-                               }
-                       } else {
-                               timeoutID = setTimeout( pollExternalStylesheets, 100 );
-                       }
-               }, 100 );
-               // ...but give up after a while
-               if ( timeout !== 0 ) {
-                       setTimeout( function () {
-                               if ( timeoutID ) {
-                                       clearTimeout( timeoutID );
-                                       timeoutID = null;
-                                       $pollNodes.remove();
-                                       callback();
-                               }
-                       }, timeout || 5000 );
-               }
-       }
-};
-
-/* Methods */
-
-/**
- * Load the frame contents.
- *
- * Once the iframe's stylesheets are loaded, the `initialize` event will be emitted.
- *
- * Sounds simple right? Read on...
- *
- * When you create a dynamic iframe using open/write/close, the window.load event for the
- * iframe is triggered when you call close, and there's no further load event to indicate that
- * everything is actually loaded.
- *
- * In Chrome, stylesheets don't show up in document.styleSheets until they have loaded, so we could
- * just poll that array and wait for it to have the right length. However, in Firefox, stylesheets
- * are added to document.styleSheets immediately, and the only way you can determine whether they've
- * loaded is to attempt to access .cssRules and wait for that to stop throwing an exception. But
- * cross-domain stylesheets never allow .cssRules to be accessed even after they have loaded.
- *
- * The workaround is to change all `<link href="...">` tags to `<style>@import url(...)</style>` tags.
- * Because `@import` is blocking, Chrome won't add the stylesheet to document.styleSheets until
- * the `@import` has finished, and Firefox won't allow .cssRules to be accessed until the `@import`
- * has finished. And because the contents of the `<style>` tag are from the same origin, accessing
- * .cssRules is allowed.
- *
- * However, now that we control the styles we're injecting, we might as well do away with
- * browser-specific polling hacks like document.styleSheets and .cssRules, and instead inject
- * `<style>@import url(...); #foo { font-family: someValue; }</style>`, then create `<div id="foo">`
- * and wait for its font-family to change to someValue. Because `@import` is blocking, the font-family
- * rule is not applied until after the `@import` finishes.
- *
- * All this stylesheet injection and polling magic is in #transplantStyles.
- *
- * @private
- * @fires load
- */
-OO.ui.Frame.prototype.load = function () {
-       var win = this.$element.prop( 'contentWindow' ),
-               doc = win.document,
-               frame = this;
-
-       this.loading = true;
-
-       // Figure out directionality:
-       this.dir = this.$element.closest( '[dir]' ).prop( 'dir' ) || 'ltr';
-
-       // Initialize contents
-       doc.open();
-       doc.write(
-               '<!doctype html>' +
-               '<html>' +
-                       '<body class="oo-ui-frame-body oo-ui-' + this.dir + '" style="direction:' + this.dir + ';" dir="' + this.dir + '">' +
-                               '<div class="oo-ui-frame-content"></div>' +
-                       '</body>' +
-               '</html>'
-       );
-       doc.close();
-
-       // Properties
-       this.$ = OO.ui.Element.getJQuery( doc, this );
-       this.$content = this.$( '.oo-ui-frame-content' );
-       this.$document = this.$( doc );
-
-       this.constructor.static.transplantStyles(
-               this.getElementDocument(),
-               this.$document[0],
-               function () {
-                       frame.loading = false;
-                       frame.loaded = true;
-                       frame.emit( 'load' );
-               }
-       );
-};
-
-/**
- * Run a callback as soon as the frame has been loaded.
- *
- *
- * This will start loading if it hasn't already, and runs
- * immediately if the frame is already loaded.
- *
- * Don't call this until the element is attached.
- *
- * @param {Function} callback
- */
-OO.ui.Frame.prototype.run = function ( callback ) {
-       if ( this.loaded ) {
-               callback();
-       } else {
-               if ( !this.loading ) {
-                       this.load();
-               }
-               this.once( 'load', callback );
-       }
-};
-
-/**
- * Sets the size of the frame.
- *
- * @param {number} width Frame width in pixels
- * @param {number} height Frame height in pixels
- * @chainable
- */
-OO.ui.Frame.prototype.setSize = function ( width, height ) {
-       this.$element.css( { 'width': width, 'height': height } );
-       return this;
-};
-/**
- * Container for elements in a child frame.
- *
- * There are two ways to specify a title: set the static `title` property or provide a `title`
- * property in the configuration options. The latter will override the former.
- *
- * @abstract
- * @class
- * @extends OO.ui.Element
- * @mixins OO.EventEmitter
- *
- * @constructor
- * @param {Object} [config] Configuration options
- * @cfg {string|Function} [title] Title string or function that returns a string
- * @cfg {string} [icon] Symbolic name of icon
- * @fires initialize
- */
-OO.ui.Window = function OoUiWindow( config ) {
-       // Parent constructor
-       OO.ui.Window.super.call( this, config );
-
-       // Mixin constructors
-       OO.EventEmitter.call( this );
-
-       // Properties
-       this.visible = false;
-       this.opening = false;
-       this.closing = false;
-       this.title = OO.ui.resolveMsg( config.title || this.constructor.static.title );
-       this.icon = config.icon || this.constructor.static.icon;
-       this.frame = new OO.ui.Frame( { '$': this.$ } );
-       this.$frame = this.$( '<div>' );
-       this.$ = function () {
-               throw new Error( 'this.$() cannot be used until the frame has been initialized.' );
-       };
-
-       // Initialization
-       this.$element
-               .addClass( 'oo-ui-window' )
-               // Hide the window using visibility: hidden; while the iframe is still loading
-               // Can't use display: none; because that prevents the iframe from loading in Firefox
-               .css( 'visibility', 'hidden' )
-               .append( this.$frame );
-       this.$frame
-               .addClass( 'oo-ui-window-frame' )
-               .append( this.frame.$element );
-
-       // Events
-       this.frame.connect( this, { 'load': 'initialize' } );
-};
-
-/* Inheritance */
-
-OO.inheritClass( OO.ui.Window, OO.ui.Element );
-
-OO.mixinClass( OO.ui.Window, OO.EventEmitter );
-
-/* Events */
-
-/**
- * Initialize contents.
- *
- * Fired asynchronously after construction when iframe is ready.
- *
- * @event initialize
- */
-
-/**
- * Open window.
- *
- * Fired after window has been opened.
- *
- * @event open
- * @param {Object} data Window opening data
- */
-
-/**
- * Close window.
- *
- * Fired after window has been closed.
- *
- * @event close
- * @param {Object} data Window closing data
- */
-
-/* Static Properties */
-
-/**
- * Symbolic name of icon.
- *
- * @static
- * @inheritable
- * @property {string}
- */
-OO.ui.Window.static.icon = 'window';
-
-/**
- * Window title.
- *
- * Subclasses must implement this property before instantiating the window.
- * Alternatively, override #getTitle with an alternative implementation.
- *
- * @static
- * @abstract
- * @inheritable
- * @property {string|Function} Title string or function that returns a string
- */
-OO.ui.Window.static.title = null;
-
-/* Methods */
-
-/**
- * Check if window is visible.
- *
- * @return {boolean} Window is visible
- */
-OO.ui.Window.prototype.isVisible = function () {
-       return this.visible;
-};
-
-/**
- * Check if window is opening.
- *
- * @return {boolean} Window is opening
- */
-OO.ui.Window.prototype.isOpening = function () {
-       return this.opening;
-};
-
-/**
- * Check if window is closing.
- *
- * @return {boolean} Window is closing
- */
-OO.ui.Window.prototype.isClosing = function () {
-       return this.closing;
-};
-
-/**
- * Get the window frame.
- *
- * @return {OO.ui.Frame} Frame of window
- */
-OO.ui.Window.prototype.getFrame = function () {
-       return this.frame;
-};
-
-/**
- * Get the title of the window.
- *
- * @return {string} Title text
- */
-OO.ui.Window.prototype.getTitle = function () {
-       return this.title;
-};
-
-/**
- * Get the window icon.
- *
- * @return {string} Symbolic name of icon
- */
-OO.ui.Window.prototype.getIcon = function () {
-       return this.icon;
-};
-
-/**
- * Set the size of window frame.
- *
- * @param {number} [width=auto] Custom width
- * @param {number} [height=auto] Custom height
- * @chainable
- */
-OO.ui.Window.prototype.setSize = function ( width, height ) {
-       if ( !this.frame.$content ) {
-               return;
-       }
-
-       this.frame.$element.css( {
-               'width': width === undefined ? 'auto' : width,
-               'height': height === undefined ? 'auto' : height
-       } );
-
-       return this;
-};
-
-/**
- * Set the title of the window.
- *
- * @param {string|Function} title Title text or a function that returns text
- * @chainable
- */
-OO.ui.Window.prototype.setTitle = function ( title ) {
-       this.title = OO.ui.resolveMsg( title );
-       if ( this.$title ) {
-               this.$title.text( title );
-       }
-       return this;
-};
-
-/**
- * Set the icon of the window.
- *
- * @param {string} icon Symbolic name of icon
- * @chainable
- */
-OO.ui.Window.prototype.setIcon = function ( icon ) {
-       if ( this.$icon ) {
-               this.$icon.removeClass( 'oo-ui-icon-' + this.icon );
-       }
-       this.icon = icon;
-       if ( this.$icon ) {
-               this.$icon.addClass( 'oo-ui-icon-' + this.icon );
-       }
-
-       return this;
-};
-
-/**
- * Set the position of window to fit with contents.
- *
- * @param {string} left Left offset
- * @param {string} top Top offset
- * @chainable
- */
-OO.ui.Window.prototype.setPosition = function ( left, top ) {
-       this.$element.css( { 'left': left, 'top': top } );
-       return this;
-};
-
-/**
- * Set the height of window to fit with contents.
- *
- * @param {number} [min=0] Min height
- * @param {number} [max] Max height (defaults to content's outer height)
- * @chainable
- */
-OO.ui.Window.prototype.fitHeightToContents = function ( min, max ) {
-       var height = this.frame.$content.outerHeight();
-
-       this.frame.$element.css(
-               'height', Math.max( min || 0, max === undefined ? height : Math.min( max, height ) )
-       );
-
-       return this;
-};
-
-/**
- * Set the width of window to fit with contents.
- *
- * @param {number} [min=0] Min height
- * @param {number} [max] Max height (defaults to content's outer width)
- * @chainable
- */
-OO.ui.Window.prototype.fitWidthToContents = function ( min, max ) {
-       var width = this.frame.$content.outerWidth();
-
-       this.frame.$element.css(
-               'width', Math.max( min || 0, max === undefined ? width : Math.min( max, width ) )
-       );
-
-       return this;
-};
-
-/**
- * Initialize window contents.
- *
- * The first time the window is opened, #initialize is called when it's safe to begin populating
- * its contents. See #setup for a way to make changes each time the window opens.
- *
- * Once this method is called, this.$$ can be used to create elements within the frame.
- *
- * @fires initialize
- * @chainable
- */
-OO.ui.Window.prototype.initialize = function () {
-       // Properties
-       this.$ = this.frame.$;
-       this.$title = this.$( '<div class="oo-ui-window-title"></div>' )
-               .text( this.title );
-       this.$icon = this.$( '<div class="oo-ui-window-icon"></div>' )
-               .addClass( 'oo-ui-icon-' + this.icon );
-       this.$head = this.$( '<div class="oo-ui-window-head"></div>' );
-       this.$body = this.$( '<div class="oo-ui-window-body"></div>' );
-       this.$foot = this.$( '<div class="oo-ui-window-foot"></div>' );
-       this.$overlay = this.$( '<div class="oo-ui-window-overlay"></div>' );
-
-       // Initialization
-       this.frame.$content.append(
-               this.$head.append( this.$icon, this.$title ),
-               this.$body,
-               this.$foot,
-               this.$overlay
-       );
-
-       // Undo the visibility: hidden; hack from the constructor and apply display: none;
-       // We can do this safely now that the iframe has initialized
-       this.$element.hide().css( 'visibility', '' );
-
-       this.emit( 'initialize' );
-
-       return this;
-};
-
-/**
- * Setup window for use.
- *
- * Each time the window is opened, once it's ready to be interacted with, this will set it up for
- * use in a particular context, based on the `data` argument.
- *
- * When you override this method, you must call the parent method at the very beginning.
- *
- * @abstract
- * @param {Object} [data] Window opening data
- */
-OO.ui.Window.prototype.setup = function () {
-       // Override to do something
-};
-
-/**
- * Tear down window after use.
- *
- * Each time the window is closed, and it's done being interacted with, this will tear it down and
- * do something with the user's interactions within the window, based on the `data` argument.
- *
- * When you override this method, you must call the parent method at the very end.
- *
- * @abstract
- * @param {Object} [data] Window closing data
- */
-OO.ui.Window.prototype.teardown = function () {
-       // Override to do something
-};
-
-/**
- * Open window.
- *
- * Do not override this method. See #setup for a way to make changes each time the window opens.
- *
- * @param {Object} [data] Window opening data
- * @fires open
- * @chainable
- */
-OO.ui.Window.prototype.open = function ( data ) {
-       if ( !this.opening && !this.closing && !this.visible ) {
-               this.opening = true;
-               this.frame.run( OO.ui.bind( function () {
-                       this.$element.show();
-                       this.visible = true;
-                       this.frame.$element.focus();
-                       this.emit( 'opening', data );
-                       this.setup( data );
-                       this.emit( 'open', data );
-                       this.opening = false;
-               }, this ) );
-       }
-
-       return this;
-};
-
-/**
- * Close window.
- *
- * See #teardown for a way to do something each time the window closes.
- *
- * @param {Object} [data] Window closing data
- * @fires close
- * @chainable
- */
-OO.ui.Window.prototype.close = function ( data ) {
-       if ( !this.opening && !this.closing && this.visible ) {
-               this.frame.$content.find( ':focus' ).blur();
-               this.closing = true;
-               this.$element.hide();
-               this.visible = false;
-               this.emit( 'closing', data );
-               this.teardown( data );
-               this.emit( 'close', data );
-               this.closing = false;
-       }
-
-       return this;
-};
-/**
- * Set of mutually exclusive windows.
- *
- * @class
- * @extends OO.ui.Element
- * @mixins OO.EventEmitter
- *
- * @constructor
- * @param {OO.Factory} factory Window factory
- * @param {Object} [config] Configuration options
- */
-OO.ui.WindowSet = function OoUiWindowSet( factory, config ) {
-       // Parent constructor
-       OO.ui.WindowSet.super.call( this, config );
-
-       // Mixin constructors
-       OO.EventEmitter.call( this );
-
-       // Properties
-       this.factory = factory;
-
-       /**
-        * List of all windows associated with this window set.
-        *
-        * @property {OO.ui.Window[]}
-        */
-       this.windowList = [];
-
-       /**
-        * Mapping of OO.ui.Window objects created by name from the #factory.
-        *
-        * @property {Object}
-        */
-       this.windows = {};
-       this.currentWindow = null;
-
-       // Initialization
-       this.$element.addClass( 'oo-ui-windowSet' );
-};
-
-/* Inheritance */
-
-OO.inheritClass( OO.ui.WindowSet, OO.ui.Element );
-
-OO.mixinClass( OO.ui.WindowSet, OO.EventEmitter );
-
-/* Events */
-
-/**
- * @event opening
- * @param {OO.ui.Window} win Window that's being opened
- * @param {Object} config Window opening information
- */
-
-/**
- * @event open
- * @param {OO.ui.Window} win Window that's been opened
- * @param {Object} config Window opening information
- */
-
-/**
- * @event closing
- * @param {OO.ui.Window} win Window that's being closed
- * @param {Object} config Window closing information
- */
-
-/**
- * @event close
- * @param {OO.ui.Window} win Window that's been closed
- * @param {Object} config Window closing information
- */
-
-/* Methods */
-
-/**
- * Handle a window that's being opened.
- *
- * @param {OO.ui.Window} win Window that's being opened
- * @param {Object} [config] Window opening information
- * @fires opening
- */
-OO.ui.WindowSet.prototype.onWindowOpening = function ( win, config ) {
-       if ( this.currentWindow && this.currentWindow !== win ) {
-               this.currentWindow.close();
-       }
-       this.currentWindow = win;
-       this.emit( 'opening', win, config );
-};
-
-/**
- * Handle a window that's been opened.
- *
- * @param {OO.ui.Window} win Window that's been opened
- * @param {Object} [config] Window opening information
- * @fires open
- */
-OO.ui.WindowSet.prototype.onWindowOpen = function ( win, config ) {
-       this.emit( 'open', win, config );
-};
-
-/**
- * Handle a window that's being closed.
- *
- * @param {OO.ui.Window} win Window that's being closed
- * @param {Object} [config] Window closing information
- * @fires closing
- */
-OO.ui.WindowSet.prototype.onWindowClosing = function ( win, config ) {
-       this.currentWindow = null;
-       this.emit( 'closing', win, config );
-};
-
-/**
- * Handle a window that's been closed.
- *
- * @param {OO.ui.Window} win Window that's been closed
- * @param {Object} [config] Window closing information
- * @fires close
- */
-OO.ui.WindowSet.prototype.onWindowClose = function ( win, config ) {
-       this.emit( 'close', win, config );
-};
-
-/**
- * Get the current window.
- *
- * @return {OO.ui.Window} Current window
- */
-OO.ui.WindowSet.prototype.getCurrentWindow = function () {
-       return this.currentWindow;
-};
-
-/**
- * Return a given window.
- *
- * @param {string} name Symbolic name of window
- * @return {OO.ui.Window} Window with specified name
- */
-OO.ui.WindowSet.prototype.getWindow = function ( name ) {
-       var win;
-
-       if ( !this.factory.lookup( name ) ) {
-               throw new Error( 'Unknown window: ' + name );
-       }
-       if ( !( name in this.windows ) ) {
-               win = this.windows[name] = this.createWindow( name );
-               this.addWindow( win );
-       }
-       return this.windows[name];
-};
-
-/**
- * Create a window for use in this window set.
- *
- * @param {string} name Symbolic name of window
- * @return {OO.ui.Window} Window with specified name
- */
-OO.ui.WindowSet.prototype.createWindow = function ( name ) {
-       return this.factory.create( name, { '$': this.$ } );
-};
-
-/**
- * Add a given window to this window set.
- *
- * Connects event handlers and attaches it to the DOM. Calling
- * OO.ui.Window#open will not work until the window is added to the set.
- *
- * @param {OO.ui.Window} win
- */
-OO.ui.WindowSet.prototype.addWindow = function ( win ) {
-       if ( this.windowList.indexOf( win ) !== -1 ) {
-               // Already set up
-               return;
-       }
-       this.windowList.push( win );
-
-       win.connect( this, {
-               'opening': [ 'onWindowOpening', win ],
-               'open': [ 'onWindowOpen', win ],
-               'closing': [ 'onWindowClosing', win ],
-               'close': [ 'onWindowClose', win ]
-       } );
-       this.$element.append( win.$element );
-};
-/**
- * @abstract
- * @class
- * @extends OO.ui.Window
- *
- * @constructor
- * @param {Object} [config] Configuration options
- * @cfg {boolean} [footless] Hide foot
- * @cfg {string} [size='large'] Symbolic name of dialog size, `small`, `medium` or `large`
- */
-OO.ui.Dialog = function OoUiDialog( config ) {
-       // Configuration initialization
-       config = $.extend( { 'size': 'large' }, config );
-
-       // Parent constructor
-       OO.ui.Dialog.super.call( this, config );
-
-       // Properties
-       this.visible = false;
-       this.footless = !!config.footless;
-       this.size = null;
-       this.onWindowMouseWheelHandler = OO.ui.bind( this.onWindowMouseWheel, this );
-       this.onDocumentKeyDownHandler = OO.ui.bind( this.onDocumentKeyDown, this );
-
-       // Events
-       this.$element.on( 'mousedown', false );
-       this.connect( this, { 'opening': 'onOpening' } );
-
-       // Initialization
-       this.$element.addClass( 'oo-ui-dialog' );
-       this.setSize( config.size );
-};
-
-/* Inheritance */
-
-OO.inheritClass( OO.ui.Dialog, OO.ui.Window );
-
-/* Static Properties */
-
-/**
- * Symbolic name of dialog.
- *
- * @abstract
- * @static
- * @property {string}
- * @inheritable
- */
-OO.ui.Dialog.static.name = '';
-
-/**
- * Map of symbolic size names and CSS classes.
- *
- * @static
- * @property {Object}
- * @inheritable
- */
-OO.ui.Dialog.static.sizeCssClasses = {
-       'small': 'oo-ui-dialog-small',
-       'medium': 'oo-ui-dialog-medium',
-       'large': 'oo-ui-dialog-large'
-};
-
-/* Methods */
-
-/**
- * Handle close button click events.
- */
-OO.ui.Dialog.prototype.onCloseButtonClick = function () {
-       this.close( { 'action': 'cancel' } );
-};
-
-/**
- * Handle window mouse wheel events.
- *
- * @param {jQuery.Event} e Mouse wheel event
- */
-OO.ui.Dialog.prototype.onWindowMouseWheel = function () {
-       return false;
-};
-
-/**
- * Handle document key down events.
- *
- * @param {jQuery.Event} e Key down event
- */
-OO.ui.Dialog.prototype.onDocumentKeyDown = function ( e ) {
-       switch ( e.which ) {
-               case OO.ui.Keys.PAGEUP:
-               case OO.ui.Keys.PAGEDOWN:
-               case OO.ui.Keys.END:
-               case OO.ui.Keys.HOME:
-               case OO.ui.Keys.LEFT:
-               case OO.ui.Keys.UP:
-               case OO.ui.Keys.RIGHT:
-               case OO.ui.Keys.DOWN:
-                       // Prevent any key events that might cause scrolling
-                       return false;
-       }
-};
-
-/**
- * Handle frame document key down events.
- *
- * @param {jQuery.Event} e Key down event
- */
-OO.ui.Dialog.prototype.onFrameDocumentKeyDown = function ( e ) {
-       if ( e.which === OO.ui.Keys.ESCAPE ) {
-               this.close( { 'action': 'cancel' } );
-               return false;
-       }
-};
-
-/** */
-OO.ui.Dialog.prototype.onOpening = function () {
-       this.$element.addClass( 'oo-ui-dialog-open' );
-};
-
-/**
- * Set dialog size.
- *
- * @param {string} [size='large'] Symbolic name of dialog size, `small`, `medium` or `large`
- */
-OO.ui.Dialog.prototype.setSize = function ( size ) {
-       var name, state, cssClass,
-               sizeCssClasses = OO.ui.Dialog.static.sizeCssClasses;
-
-       if ( !sizeCssClasses[size] ) {
-               size = 'large';
-       }
-       this.size = size;
-       for ( name in sizeCssClasses ) {
-               state = name === size;
-               cssClass = sizeCssClasses[name];
-               this.$element.toggleClass( cssClass, state );
-               if ( this.frame.$content ) {
-                       this.frame.$content.toggleClass( cssClass, state );
-               }
-       }
-};
-
-/**
- * @inheritdoc
- */
-OO.ui.Dialog.prototype.initialize = function () {
-       // Parent method
-       OO.ui.Window.prototype.initialize.call( this );
-
-       // Properties
-       this.closeButton = new OO.ui.ButtonWidget( {
-               '$': this.$,
-               'frameless': true,
-               'icon': 'close',
-               'title': OO.ui.msg( 'ooui-dialog-action-close' )
-       } );
-
-       // Events
-       this.closeButton.connect( this, { 'click': 'onCloseButtonClick' } );
-       this.frame.$document.on( 'keydown', OO.ui.bind( this.onFrameDocumentKeyDown, this ) );
-
-       // Initialization
-       this.frame.$content.addClass( 'oo-ui-dialog-content' );
-       if ( this.footless ) {
-               this.frame.$content.addClass( 'oo-ui-dialog-content-footless' );
-       }
-       this.closeButton.$element.addClass( 'oo-ui-window-closeButton' );
-       this.$head.append( this.closeButton.$element );
-};
-
-/**
- * @inheritdoc
- */
-OO.ui.Dialog.prototype.setup = function ( data ) {
-       // Parent method
-       OO.ui.Window.prototype.setup.call( this, data );
-
-       // Prevent scrolling in top-level window
-       this.$( window ).on( 'mousewheel', this.onWindowMouseWheelHandler );
-       this.$( document ).on( 'keydown', this.onDocumentKeyDownHandler );
-};
-
-/**
- * @inheritdoc
- */
-OO.ui.Dialog.prototype.teardown = function ( data ) {
-       // Parent method
-       OO.ui.Window.prototype.teardown.call( this, data );
-
-       // Allow scrolling in top-level window
-       this.$( window ).off( 'mousewheel', this.onWindowMouseWheelHandler );
-       this.$( document ).off( 'keydown', this.onDocumentKeyDownHandler );
-};
-
-/**
- * @inheritdoc
- */
-OO.ui.Dialog.prototype.close = function ( data ) {
-       var dialog = this;
-       if ( !dialog.opening && !dialog.closing && dialog.visible ) {
-               // Trigger transition
-               dialog.$element.removeClass( 'oo-ui-dialog-open' );
-               // Allow transition to complete before actually closing
-               setTimeout( function () {
-                       // Parent method
-                       OO.ui.Window.prototype.close.call( dialog, data );
-               }, 250 );
-       }
-};
-/**
- * Container for elements.
- *
- * @abstract
- * @class
- * @extends OO.ui.Element
- * @mixins OO.EventEmitter
- *
- * @constructor
- * @param {Object} [config] Configuration options
- */
-OO.ui.Layout = function OoUiLayout( config ) {
-       // Initialize config
-       config = config || {};
-
-       // Parent constructor
-       OO.ui.Layout.super.call( this, config );
-
-       // Mixin constructors
-       OO.EventEmitter.call( this );
-
-       // Initialization
-       this.$element.addClass( 'oo-ui-layout' );
-};
-
-/* Inheritance */
-
-OO.inheritClass( OO.ui.Layout, OO.ui.Element );
-
-OO.mixinClass( OO.ui.Layout, OO.EventEmitter );
-/**
- * User interface control.
- *
- * @abstract
- * @class
- * @extends OO.ui.Element
- * @mixins OO.EventEmitter
- *
- * @constructor
- * @param {Object} [config] Configuration options
- * @cfg {boolean} [disabled=false] Disable
- */
-OO.ui.Widget = function OoUiWidget( config ) {
-       // Initialize config
-       config = $.extend( { 'disabled': false }, config );
-
-       // Parent constructor
-       OO.ui.Widget.super.call( this, config );
-
-       // Mixin constructors
-       OO.EventEmitter.call( this );
-
-       // Properties
-       this.disabled = null;
-       this.wasDisabled = null;
-
-       // Initialization
-       this.$element.addClass( 'oo-ui-widget' );
-       this.setDisabled( !!config.disabled );
-};
-
-/* Inheritance */
-
-OO.inheritClass( OO.ui.Widget, OO.ui.Element );
-
-OO.mixinClass( OO.ui.Widget, OO.EventEmitter );
-
-/* Events */
-
-/**
- * @event disable
- * @param {boolean} disabled Widget is disabled
- */
-
-/* Methods */
-
-/**
- * Check if the widget is disabled.
- *
- * @param {boolean} Button is disabled
- */
-OO.ui.Widget.prototype.isDisabled = function () {
-       return this.disabled;
-};
-
-/**
- * Update the disabled state, in case of changes in parent widget.
- *
- * @chainable
- */
-OO.ui.Widget.prototype.updateDisabled = function () {
-       this.setDisabled( this.disabled );
-       return this;
-};
-
-/**
- * Set the disabled state of the widget.
- *
- * This should probably change the widgets's appearance and prevent it from being used.
- *
- * @param {boolean} disabled Disable widget
- * @chainable
- */
-OO.ui.Widget.prototype.setDisabled = function ( disabled ) {
-       var isDisabled;
-
-       this.disabled = !!disabled;
-       isDisabled = this.isDisabled();
-       if ( isDisabled !== this.wasDisabled ) {
-               this.$element.toggleClass( 'oo-ui-widget-disabled', isDisabled );
-               this.$element.toggleClass( 'oo-ui-widget-enabled', !isDisabled );
-               this.emit( 'disable', isDisabled );
-       }
-       this.wasDisabled = isDisabled;
-       return this;
-};
-/**
- * Element with a button.
- *
- * @class
- * @abstract
- *
- * @constructor
- * @param {jQuery} $button Button node, assigned to #$button
- * @param {Object} [config] Configuration options
- * @cfg {boolean} [frameless] Render button without a frame
- * @cfg {number} [tabIndex=0] Button's tab index, use -1 to prevent tab focusing
- */
-OO.ui.ButtonedElement = function OoUiButtonedElement( $button, config ) {
-       // Configuration initialization
-       config = config || {};
-
-       // Properties
-       this.$button = $button;
-       this.tabIndex = null;
-       this.active = false;
-       this.onMouseUpHandler = OO.ui.bind( this.onMouseUp, this );
-
-       // Events
-       this.$button.on( 'mousedown', OO.ui.bind( this.onMouseDown, this ) );
-
-       // Initialization
-       this.$element.addClass( 'oo-ui-buttonedElement' );
-       this.$button
-               .addClass( 'oo-ui-buttonedElement-button' )
-               .attr( 'role', 'button' )
-               .prop( 'tabIndex', config.tabIndex || 0 );
-       if ( config.frameless ) {
-               this.$element.addClass( 'oo-ui-buttonedElement-frameless' );
-       } else {
-               this.$element.addClass( 'oo-ui-buttonedElement-framed' );
-       }
-};
-
-/* Methods */
-
-/**
- * Handles mouse down events.
- *
- * @method
- * @param {jQuery.Event} e Mouse down event
- */
-OO.ui.ButtonedElement.prototype.onMouseDown = function () {
-       this.tabIndex = this.$button.attr( 'tabIndex' );
-       // Remove the tab-index while the button is down to prevent the button from stealing focus
-       this.$button
-               .removeAttr( 'tabIndex' )
-               .addClass( 'oo-ui-buttonedElement-pressed' );
-       this.getElementDocument().addEventListener( 'mouseup', this.onMouseUpHandler, true );
-};
-
-/**
- * Handles mouse up events.
- *
- * @method
- * @param {jQuery.Event} e Mouse up event
- */
-OO.ui.ButtonedElement.prototype.onMouseUp = function () {
-       // Restore the tab-index after the button is up to restore the button's accesssibility
-       this.$button
-               .attr( 'tabIndex', this.tabIndex )
-               .removeClass( 'oo-ui-buttonedElement-pressed' );
-       this.getElementDocument().removeEventListener( 'mouseup', this.onMouseUpHandler, true );
-};
-
-/**
- * Set active state.
- *
- * @method
- * @param {boolean} [value] Make button active
- * @chainable
- */
-OO.ui.ButtonedElement.prototype.setActive = function ( value ) {
-       this.$button.toggleClass( 'oo-ui-buttonedElement-active', !!value );
-       return this;
-};
-/**
- * Element that can be automatically clipped to visible boundaies.
- *
- * @class
- * @abstract
- *
- * @constructor
- * @param {jQuery} $clippable Nodes to clip, assigned to #$clippable
- * @param {Object} [config] Configuration options
- */
-OO.ui.ClippableElement = function OoUiClippableElement( $clippable, config ) {
-       // Configuration initialization
-       config = config || {};
-
-       // Properties
-       this.$clippable = $clippable;
-       this.clipping = false;
-       this.clipped = false;
-       this.$clippableContainer = null;
-       this.$clippableScroller = null;
-       this.$clippableWindow = null;
-       this.idealWidth = null;
-       this.idealHeight = null;
-       this.onClippableContainerScrollHandler = OO.ui.bind( this.clip, this );
-       this.onClippableWindowResizeHandler = OO.ui.bind( this.clip, this );
-
-       // Initialization
-       this.$clippable.addClass( 'oo-ui-clippableElement-clippable' );
-};
-
-/* Methods */
-
-/**
- * Set clipping.
- *
- * @method
- * @param {boolean} value Enable clipping
- * @chainable
- */
-OO.ui.ClippableElement.prototype.setClipping = function ( value ) {
-       value = !!value;
-
-       if ( this.clipping !== value ) {
-               this.clipping = value;
-               if ( this.clipping ) {
-                       this.$clippableContainer = this.$( this.getClosestScrollableElementContainer() );
-                       // If the clippable container is the body, we have to listen to scroll events and check
-                       // jQuery.scrollTop on the window because of browser inconsistencies
-                       this.$clippableScroller = this.$clippableContainer.is( 'body' ) ?
-                               this.$( OO.ui.Element.getWindow( this.$clippableContainer ) ) :
-                               this.$clippableContainer;
-                       this.$clippableScroller.on( 'scroll', this.onClippableContainerScrollHandler );
-                       this.$clippableWindow = this.$( this.getElementWindow() )
-                               .on( 'resize', this.onClippableWindowResizeHandler );
-                       // Initial clip after visible
-                       setTimeout( OO.ui.bind( this.clip, this ) );
-               } else {
-                       this.$clippableContainer = null;
-                       this.$clippableScroller.off( 'scroll', this.onClippableContainerScrollHandler );
-                       this.$clippableScroller = null;
-                       this.$clippableWindow.off( 'resize', this.onClippableWindowResizeHandler );
-                       this.$clippableWindow = null;
-               }
-       }
-
-       return this;
-};
-
-/**
- * Check if the element will be clipped to fit the visible area of the nearest scrollable container.
- *
- * @method
- * @return {boolean} Element will be clipped to the visible area
- */
-OO.ui.ClippableElement.prototype.isClipping = function () {
-       return this.clipping;
-};
-
-/**
- * Check if the bottom or right of the element is being clipped by the nearest scrollable container.
- *
- * @method
- * @return {boolean} Part of the element is being clipped
- */
-OO.ui.ClippableElement.prototype.isClipped = function () {
-       return this.clipped;
-};
-
-/**
- * Set the ideal size.
- *
- * @method
- * @param {number|string} [width] Width as a number of pixels or CSS string with unit suffix
- * @param {number|string} [height] Height as a number of pixels or CSS string with unit suffix
- */
-OO.ui.ClippableElement.prototype.setIdealSize = function ( width, height ) {
-       this.idealWidth = width;
-       this.idealHeight = height;
-};
-
-/**
- * Clip element to visible boundaries and allow scrolling when needed.
- *
- * Element will be clipped the bottom or right of the element is within 10px of the edge of, or
- * overlapped by, the visible area of the nearest scrollable container.
- *
- * @method
- * @chainable
- */
-OO.ui.ClippableElement.prototype.clip = function () {
-       if ( !this.clipping ) {
-               // this.$clippableContainer and this.$clippableWindow are null, so the below will fail
-               return this;
-       }
-
-       var buffer = 10,
-               cOffset = this.$clippable.offset(),
-               ccOffset = this.$clippableContainer.offset() || { 'top': 0, 'left': 0 },
-               ccHeight = this.$clippableContainer.innerHeight() - buffer,
-               ccWidth = this.$clippableContainer.innerWidth() - buffer,
-               scrollTop = this.$clippableScroller.scrollTop(),
-               scrollLeft = this.$clippableScroller.scrollLeft(),
-               desiredWidth = ( ccOffset.left + scrollLeft + ccWidth ) - cOffset.left,
-               desiredHeight = ( ccOffset.top + scrollTop + ccHeight ) - cOffset.top,
-               naturalWidth = this.$clippable.prop( 'scrollWidth' ),
-               naturalHeight = this.$clippable.prop( 'scrollHeight' ),
-               clipWidth = desiredWidth < naturalWidth,
-               clipHeight = desiredHeight < naturalHeight;
-
-       if ( clipWidth ) {
-               this.$clippable.css( { 'overflow-x': 'auto', 'width': desiredWidth } );
-       } else {
-               this.$clippable.css( { 'overflow-x': '', 'width': this.idealWidth || '' } );
-       }
-       if ( clipHeight ) {
-               this.$clippable.css( { 'overflow-y': 'auto', 'height': desiredHeight } );
-       } else {
-               this.$clippable.css( { 'overflow-y': '', 'height': this.idealHeight || '' } );
-       }
-
-       this.clipped = clipWidth || clipHeight;
-
-       return this;
-};
-/**
- * Element with named flags, used for styling, that can be added, removed and listed and checked.
- *
- * @class
- * @abstract
- *
- * @constructor
- * @param {Object} [config] Configuration options
- * @cfg {string[]} [flags=[]] Styling flags, e.g. 'primary', 'destructive' or 'constructive'
- */
-OO.ui.FlaggableElement = function OoUiFlaggableElement( config ) {
-       // Config initialization
-       config = config || {};
-
-       // Properties
-       this.flags = {};
-
-       // Initialization
-       this.setFlags( config.flags );
-};
-
-/* Methods */
-
-/**
- * Check if a flag is set.
- *
- * @method
- * @param {string} flag Flag name to check
- * @returns {boolean} Has flag
- */
-OO.ui.FlaggableElement.prototype.hasFlag = function ( flag ) {
-       return flag in this.flags;
-};
-
-/**
- * Get the names of all flags.
- *
- * @method
- * @returns {string[]} flags Flag names
- */
-OO.ui.FlaggableElement.prototype.getFlags = function () {
-       return Object.keys( this.flags );
-};
-
-/**
- * Add one or more flags.
- *
- * @method
- * @param {string[]|Object.<string, boolean>} flags List of flags to add, or list of set/remove
- *  values, keyed by flag name
- * @chainable
- */
-OO.ui.FlaggableElement.prototype.setFlags = function ( flags ) {
-       var i, len, flag,
-               classPrefix = 'oo-ui-flaggableElement-';
-
-       if ( $.isArray( flags ) ) {
-               for ( i = 0, len = flags.length; i < len; i++ ) {
-                       flag = flags[i];
-                       // Set
-                       this.flags[flag] = true;
-                       this.$element.addClass( classPrefix + flag );
-               }
-       } else if ( OO.isPlainObject( flags ) ) {
-               for ( flag in flags ) {
-                       if ( flags[flag] ) {
-                               // Set
-                               this.flags[flag] = true;
-                               this.$element.addClass( classPrefix + flag );
-                       } else {
-                               // Remove
-                               delete this.flags[flag];
-                               this.$element.removeClass( classPrefix + flag );
-                       }
-               }
-       }
-       return this;
-};
-/**
- * Element containing a sequence of child elements.
- *
- * @class
- * @abstract
- *
- * @constructor
- * @param {jQuery} $group Container node, assigned to #$group
- * @param {Object} [config] Configuration options
- * @cfg {Object.<string,string>} [aggregations] Events to aggregate, keyed by item event name
- */
-OO.ui.GroupElement = function OoUiGroupElement( $group, config ) {
-       // Configuration
-       config = config || {};
-
-       // Properties
-       this.$group = $group;
-       this.items = [];
-       this.$items = this.$( [] );
-       this.aggregate = !$.isEmptyObject( config.aggregations );
-       this.aggregations = config.aggregations || {};
-};
-
-/* Methods */
-
-/**
- * Get items.
- *
- * @method
- * @returns {OO.ui.Element[]} Items
- */
-OO.ui.GroupElement.prototype.getItems = function () {
-       return this.items.slice( 0 );
-};
-
-/**
- * Add items.
- *
- * @method
- * @param {OO.ui.Element[]} items Item
- * @param {number} [index] Index to insert items at
- * @chainable
- */
-OO.ui.GroupElement.prototype.addItems = function ( items, index ) {
-       var i, len, item, event, events, currentIndex,
-               $items = this.$( [] );
-
-       for ( i = 0, len = items.length; i < len; i++ ) {
-               item = items[i];
-
-               // Check if item exists then remove it first, effectively "moving" it
-               currentIndex = $.inArray( item, this.items );
-               if ( currentIndex >= 0 ) {
-                       this.removeItems( [ item ] );
-                       // Adjust index to compensate for removal
-                       if ( currentIndex < index ) {
-                               index--;
-                       }
-               }
-               // Add the item
-               if ( this.aggregate ) {
-                       events = {};
-                       for ( event in this.aggregations ) {
-                               events[event] = [ 'emit', this.aggregations[event], item ];
-                       }
-                       item.connect( this, events );
-               }
-               item.setElementGroup( this );
-               $items = $items.add( item.$element );
-       }
-
-       if ( index === undefined || index < 0 || index >= this.items.length ) {
-               this.$group.append( $items );
-               this.items.push.apply( this.items, items );
-       } else if ( index === 0 ) {
-               this.$group.prepend( $items );
-               this.items.unshift.apply( this.items, items );
-       } else {
-               this.$items.eq( index ).before( $items );
-               this.items.splice.apply( this.items, [ index, 0 ].concat( items ) );
-       }
-
-       this.$items = this.$items.add( $items );
-
-       return this;
-};
-
-/**
- * Remove items.
- *
- * Items will be detached, not removed, so they can be used later.
- *
- * @method
- * @param {OO.ui.Element[]} items Items to remove
- * @chainable
- */
-OO.ui.GroupElement.prototype.removeItems = function ( items ) {
-       var i, len, item, index;
-
-       // Remove specific items
-       for ( i = 0, len = items.length; i < len; i++ ) {
-               item = items[i];
-               index = $.inArray( item, this.items );
-               if ( index !== -1 ) {
-                       if ( this.aggregate ) {
-                               item.disconnect( this );
-                       }
-                       item.setElementGroup( null );
-                       this.items.splice( index, 1 );
-                       item.$element.detach();
-                       this.$items = this.$items.not( item.$element );
-               }
-       }
-
-       return this;
-};
-
-/**
- * Clear all items.
- *
- * Items will be detached, not removed, so they can be used later.
- *
- * @method
- * @chainable
- */
-OO.ui.GroupElement.prototype.clearItems = function () {
-       var i, len, item;
-
-       // Remove all items
-       for ( i = 0, len = this.items.length; i < len; i++ ) {
-               item = this.items[i];
-               if ( this.aggregate ) {
-                       item.disconnect( this );
-               }
-               item.setElementGroup( null );
-       }
-       this.items = [];
-       this.$items.detach();
-       this.$items = this.$( [] );
-};
-/**
- * Element containing an icon.
- *
- * @class
- * @abstract
- *
- * @constructor
- * @param {jQuery} $icon Icon node, assigned to #$icon
- * @param {Object} [config] Configuration options
- * @cfg {Object|string} [icon=''] Symbolic icon name, or map of icon names keyed by language ID;
- *  use the 'default' key to specify the icon to be used when there is no icon in the user's
- *  language
- */
-OO.ui.IconedElement = function OoUiIconedElement( $icon, config ) {
-       // Config intialization
-       config = config || {};
-
-       // Properties
-       this.$icon = $icon;
-       this.icon = null;
-
-       // Initialization
-       this.$icon.addClass( 'oo-ui-iconedElement-icon' );
-       this.setIcon( config.icon || this.constructor.static.icon );
-};
-
-/* Static Properties */
-
-OO.ui.IconedElement.static = {};
-
-/**
- * Icon.
- *
- * Value should be the unique portion of an icon CSS class name, such as 'up' for 'oo-ui-icon-up'.
- *
- * For i18n purposes, this property can be an object containing a `default` icon name property and
- * additional icon names keyed by language code.
- *
- * Example of i18n icon definition:
- *     { 'default': 'bold-a', 'en': 'bold-b', 'de': 'bold-f' }
- *
- * @static
- * @inheritable
- * @property {Object|string} Symbolic icon name, or map of icon names keyed by language ID;
- *  use the 'default' key to specify the icon to be used when there is no icon in the user's
- *  language
- */
-OO.ui.IconedElement.static.icon = null;
-
-/* Methods */
-
-/**
- * Set icon.
- *
- * @method
- * @param {Object|string} icon Symbolic icon name, or map of icon names keyed by language ID;
- *  use the 'default' key to specify the icon to be used when there is no icon in the user's
- *  language
- * @chainable
- */
-OO.ui.IconedElement.prototype.setIcon = function ( icon ) {
-       icon = OO.isPlainObject( icon ) ? OO.ui.getLocalValue( icon, null, 'default' ) : icon;
-
-       if ( this.icon ) {
-               this.$icon.removeClass( 'oo-ui-icon-' + this.icon );
-       }
-       if ( typeof icon === 'string' ) {
-               icon = icon.trim();
-               if ( icon.length ) {
-                       this.$icon.addClass( 'oo-ui-icon-' + icon );
-                       this.icon = icon;
-               }
-       }
-       this.$element.toggleClass( 'oo-ui-iconedElement', !!this.icon );
-
-       return this;
-};
-
-/**
- * Get icon.
- *
- * @method
- * @returns {string} Icon
- */
-OO.ui.IconedElement.prototype.getIcon = function () {
-       return this.icon;
-};
-/**
- * Element containing an indicator.
- *
- * @class
- * @abstract
- *
- * @constructor
- * @param {jQuery} $indicator Indicator node, assigned to #$indicator
- * @param {Object} [config] Configuration options
- * @cfg {string} [indicator] Symbolic indicator name
- * @cfg {string} [indicatorTitle] Indicator title text or a function that return text
- */
-OO.ui.IndicatedElement = function OoUiIndicatedElement( $indicator, config ) {
-       // Config intialization
-       config = config || {};
-
-       // Properties
-       this.$indicator = $indicator;
-       this.indicator = null;
-       this.indicatorLabel = null;
-
-       // Initialization
-       this.$indicator.addClass( 'oo-ui-indicatedElement-indicator' );
-       this.setIndicator( config.indicator || this.constructor.static.indicator );
-       this.setIndicatorTitle( config.indicatorTitle  || this.constructor.static.indicatorTitle );
-};
-
-/* Static Properties */
-
-OO.ui.IndicatedElement.static = {};
-
-/**
- * indicator.
- *
- * @static
- * @inheritable
- * @property {string|null} Symbolic indicator name or null for no indicator
- */
-OO.ui.IndicatedElement.static.indicator = null;
-
-/**
- * Indicator title.
- *
- * @static
- * @inheritable
- * @property {string|Function|null} Indicator title text, a function that return text or null for no
- *  indicator title
- */
-OO.ui.IndicatedElement.static.indicatorTitle = null;
-
-/* Methods */
-
-/**
- * Set indicator.
- *
- * @method
- * @param {string|null} indicator Symbolic name of indicator to use or null for no indicator
- * @chainable
- */
-OO.ui.IndicatedElement.prototype.setIndicator = function ( indicator ) {
-       if ( this.indicator ) {
-               this.$indicator.removeClass( 'oo-ui-indicator-' + this.indicator );
-               this.indicator = null;
-       }
-       if ( typeof indicator === 'string' ) {
-               indicator = indicator.trim();
-               if ( indicator.length ) {
-                       this.$indicator.addClass( 'oo-ui-indicator-' + indicator );
-                       this.indicator = indicator;
-               }
-       }
-       this.$element.toggleClass( 'oo-ui-indicatedElement', !!this.indicator );
-
-       return this;
-};
-
-/**
- * Set indicator label.
- *
- * @method
- * @param {string|Function|null} indicator Indicator title text, a function that return text or null
- *  for no indicator title
- * @chainable
- */
-OO.ui.IndicatedElement.prototype.setIndicatorTitle = function ( indicatorTitle ) {
-       this.indicatorTitle = indicatorTitle = OO.ui.resolveMsg( indicatorTitle );
-
-       if ( typeof indicatorTitle === 'string' && indicatorTitle.length ) {
-               this.$indicator.attr( 'title', indicatorTitle );
-       } else {
-               this.$indicator.removeAttr( 'title' );
-       }
-
-       return this;
-};
-
-/**
- * Get indicator.
- *
- * @method
- * @returns {string} title Symbolic name of indicator
- */
-OO.ui.IndicatedElement.prototype.getIndicator = function () {
-       return this.indicator;
-};
-
-/**
- * Get indicator title.
- *
- * @method
- * @returns {string} Indicator title text
- */
-OO.ui.IndicatedElement.prototype.getIndicatorTitle = function () {
-       return this.indicatorTitle;
-};
-/**
- * Element containing a label.
- *
- * @class
- * @abstract
- *
- * @constructor
- * @param {jQuery} $label Label node, assigned to #$label
- * @param {Object} [config] Configuration options
- * @cfg {jQuery|string|Function} [label] Label nodes, text or a function that returns nodes or text
- * @cfg {boolean} [autoFitLabel=true] Whether to fit the label or not.
- */
-OO.ui.LabeledElement = function OoUiLabeledElement( $label, config ) {
-       // Config intialization
-       config = config || {};
-
-       // Properties
-       this.$label = $label;
-       this.label = null;
-
-       // Initialization
-       this.$label.addClass( 'oo-ui-labeledElement-label' );
-       this.setLabel( config.label || this.constructor.static.label );
-       this.autoFitLabel = config.autoFitLabel === undefined || !!config.autoFitLabel;
-};
-
-/* Static Properties */
-
-OO.ui.LabeledElement.static = {};
-
-/**
- * Label.
- *
- * @static
- * @inheritable
- * @property {string|Function|null} Label text; a function that returns a nodes or text; or null for
- *  no label
- */
-OO.ui.LabeledElement.static.label = null;
-
-/* Methods */
-
-/**
- * Set the label.
- *
- * An empty string will result in the label being hidden. A string containing only whitespace will
- * be converted to a single &nbsp;
- *
- * @method
- * @param {jQuery|string|Function|null} label Label nodes; text; a function that retuns nodes or
- *  text; or null for no label
- * @chainable
- */
-OO.ui.LabeledElement.prototype.setLabel = function ( label ) {
-       var empty = false;
-
-       this.label = label = OO.ui.resolveMsg( label ) || null;
-       if ( typeof label === 'string' && label.length ) {
-               if ( label.match( /^\s*$/ ) ) {
-                       // Convert whitespace only string to a single non-breaking space
-                       this.$label.html( '&nbsp;' );
-               } else {
-                       this.$label.text( label );
-               }
-       } else if ( label instanceof jQuery ) {
-               this.$label.empty().append( label );
-       } else {
-               this.$label.empty();
-               empty = true;
-       }
-       this.$element.toggleClass( 'oo-ui-labeledElement', !empty );
-       this.$label.css( 'display', empty ? 'none' : '' );
-
-       return this;
-};
-
-/**
- * Get the label.
- *
- * @method
- * @returns {jQuery|string|Function|null} label Label nodes; text; a function that returns nodes or
- *  text; or null for no label
- */
-OO.ui.LabeledElement.prototype.getLabel = function () {
-       return this.label;
-};
-
-/**
- * Fit the label.
- *
- * @method
- * @chainable
- */
-OO.ui.LabeledElement.prototype.fitLabel = function () {
-       if ( this.$label.autoEllipsis && this.autoFitLabel ) {
-               this.$label.autoEllipsis( { 'hasSpan': false, 'tooltip': true } );
-       }
-       return this;
-};
-/**
- * Popuppable element.
- *
- * @class
- * @abstract
- *
- * @constructor
- * @param {Object} [config] Configuration options
- * @cfg {number} [popupWidth=320] Width of popup
- * @cfg {number} [popupHeight] Height of popup
- * @cfg {Object} [popup] Configuration to pass to popup
- */
-OO.ui.PopuppableElement = function OoUiPopuppableElement( config ) {
-       // Configuration initialization
-       config = $.extend( { 'popupWidth': 320 }, config );
-
-       // Properties
-       this.popup = new OO.ui.PopupWidget( $.extend(
-               { 'align': 'center', 'autoClose': true },
-               config.popup,
-               { '$': this.$, '$autoCloseIgnore': this.$element }
-       ) );
-       this.popupWidth = config.popupWidth;
-       this.popupHeight = config.popupHeight;
-};
-
-/* Methods */
-
-/**
- * Get popup.
- *
- * @method
- * @returns {OO.ui.PopupWidget} Popup widget
- */
-OO.ui.PopuppableElement.prototype.getPopup = function () {
-       return this.popup;
-};
-
-/**
- * Show popup.
- *
- * @method
- */
-OO.ui.PopuppableElement.prototype.showPopup = function () {
-       this.popup.show().display( this.popupWidth, this.popupHeight );
-};
-
-/**
- * Hide popup.
- *
- * @method
- */
-OO.ui.PopuppableElement.prototype.hidePopup = function () {
-       this.popup.hide();
-};
-/**
- * Element with a title.
- *
- * @class
- * @abstract
- *
- * @constructor
- * @param {jQuery} $label Titled node, assigned to #$titled
- * @param {Object} [config] Configuration options
- * @cfg {string|Function} [title] Title text or a function that returns text
- */
-OO.ui.TitledElement = function OoUiTitledElement( $titled, config ) {
-       // Config intialization
-       config = config || {};
-
-       // Properties
-       this.$titled = $titled;
-       this.title = null;
-
-       // Initialization
-       this.setTitle( config.title || this.constructor.static.title );
-};
-
-/* Static Properties */
-
-OO.ui.TitledElement.static = {};
-
-/**
- * Title.
- *
- * @static
- * @inheritable
- * @property {string|Function} Title text or a function that returns text
- */
-OO.ui.TitledElement.static.title = null;
-
-/* Methods */
-
-/**
- * Set title.
- *
- * @method
- * @param {string|Function|null} title Title text, a function that returns text or null for no title
- * @chainable
- */
-OO.ui.TitledElement.prototype.setTitle = function ( title ) {
-       this.title = title = OO.ui.resolveMsg( title ) || null;
-
-       if ( typeof title === 'string' && title.length ) {
-               this.$titled.attr( 'title', title );
-       } else {
-               this.$titled.removeAttr( 'title' );
-       }
-
-       return this;
-};
-
-/**
- * Get title.
- *
- * @method
- * @returns {string} Title string
- */
-OO.ui.TitledElement.prototype.getTitle = function () {
-       return this.title;
-};
-/**
- * Generic toolbar tool.
- *
- * @abstract
- * @class
- * @extends OO.ui.Widget
- * @mixins OO.ui.IconedElement
- *
- * @constructor
- * @param {OO.ui.ToolGroup} toolGroup
- * @param {Object} [config] Configuration options
- * @cfg {string|Function} [title] Title text or a function that returns text
- */
-OO.ui.Tool = function OoUiTool( toolGroup, config ) {
-       // Config intialization
-       config = config || {};
-
-       // Parent constructor
-       OO.ui.Tool.super.call( this, config );
-
-       // Mixin constructors
-       OO.ui.IconedElement.call( this, this.$( '<span>' ), config );
-
-       // Properties
-       this.toolGroup = toolGroup;
-       this.toolbar = this.toolGroup.getToolbar();
-       this.active = false;
-       this.$title = this.$( '<span>' );
-       this.$link = this.$( '<a>' );
-       this.title = null;
-
-       // Events
-       this.toolbar.connect( this, { 'updateState': 'onUpdateState' } );
-
-       // Initialization
-       this.$title.addClass( 'oo-ui-tool-title' );
-       this.$link
-               .addClass( 'oo-ui-tool-link' )
-               .append( this.$icon, this.$title );
-       this.$element
-               .data( 'oo-ui-tool', this )
-               .addClass(
-                       'oo-ui-tool ' + 'oo-ui-tool-name-' +
-                       this.constructor.static.name.replace( /^([^\/]+)\/([^\/]+).*$/, '$1-$2' )
-               )
-               .append( this.$link );
-       this.setTitle( config.title || this.constructor.static.title );
-};
-
-/* Inheritance */
-
-OO.inheritClass( OO.ui.Tool, OO.ui.Widget );
-
-OO.mixinClass( OO.ui.Tool, OO.ui.IconedElement );
-
-/* Events */
-
-/**
- * @event select
- */
-
-/* Static Properties */
-
-/**
- * @static
- * @inheritdoc
- */
-OO.ui.Tool.static.tagName = 'span';
-
-/**
- * Symbolic name of tool.
- *
- * @abstract
- * @static
- * @property {string}
- * @inheritable
- */
-OO.ui.Tool.static.name = '';
-
-/**
- * Tool group.
- *
- * @abstract
- * @static
- * @property {string}
- * @inheritable
- */
-OO.ui.Tool.static.group = '';
-
-/**
- * Tool title.
- *
- * Title is used as a tooltip when the tool is part of a bar tool group, or a label when the tool
- * is part of a list or menu tool group. If a trigger is associated with an action by the same name
- * as the tool, a description of its keyboard shortcut for the appropriate platform will be
- * appended to the title if the tool is part of a bar tool group.
- *
- * @abstract
- * @static
- * @property {string|Function} Title text or a function that returns text
- * @inheritable
- */
-OO.ui.Tool.static.title = '';
-
-/**
- * Tool can be automatically added to catch-all groups.
- *
- * @static
- * @property {boolean}
- * @inheritable
- */
-OO.ui.Tool.static.autoAddToCatchall = true;
-
-/**
- * Tool can be automatically added to named groups.
- *
- * @static
- * @property {boolean}
- * @inheritable
- */
-OO.ui.Tool.static.autoAddToGroup = true;
-
-/**
- * Check if this tool is compatible with given data.
- *
- * @static
- * @method
- * @inheritable
- * @param {Mixed} data Data to check
- * @return {boolean} Tool can be used with data
- */
-OO.ui.Tool.static.isCompatibleWith = function () {
-       return false;
-};
-
-/* Methods */
-
-/**
- * Handle the toolbar state being updated.
- *
- * This is an abstract method that must be overridden in a concrete subclass.
- *
- * @abstract
- */
-OO.ui.Tool.prototype.onUpdateState = function () {
-       throw new Error(
-               'OO.ui.Tool.onUpdateState not implemented in this subclass:' + this.constructor
-       );
-};
-
-/**
- * Handle the tool being selected.
- *
- * This is an abstract method that must be overridden in a concrete subclass.
- *
- * @abstract
- */
-OO.ui.Tool.prototype.onSelect = function () {
-       throw new Error(
-               'OO.ui.Tool.onSelect not implemented in this subclass:' + this.constructor
-       );
-};
-
-/**
- * Check if the button is active.
- *
- * @param {boolean} Button is active
- */
-OO.ui.Tool.prototype.isActive = function () {
-       return this.active;
-};
-
-/**
- * Make the button appear active or inactive.
- *
- * @param {boolean} state Make button appear active
- */
-OO.ui.Tool.prototype.setActive = function ( state ) {
-       this.active = !!state;
-       if ( this.active ) {
-               this.$element.addClass( 'oo-ui-tool-active' );
-       } else {
-               this.$element.removeClass( 'oo-ui-tool-active' );
-       }
-};
-
-/**
- * Get the tool title.
- *
- * @param {string|Function} title Title text or a function that returns text
- * @chainable
- */
-OO.ui.Tool.prototype.setTitle = function ( title ) {
-       this.title = OO.ui.resolveMsg( title );
-       this.updateTitle();
-       return this;
-};
-
-/**
- * Get the tool title.
- *
- * @return {string} Title text
- */
-OO.ui.Tool.prototype.getTitle = function () {
-       return this.title;
-};
-
-/**
- * Get the tool's symbolic name.
- *
- * @return {string} Symbolic name of tool
- */
-OO.ui.Tool.prototype.getName = function () {
-       return this.constructor.static.name;
-};
-
-/**
- * Update the title.
- */
-OO.ui.Tool.prototype.updateTitle = function () {
-       var titleTooltips = this.toolGroup.constructor.static.titleTooltips,
-               accelTooltips = this.toolGroup.constructor.static.accelTooltips,
-               accel = this.toolbar.getToolAccelerator( this.constructor.static.name ),
-               tooltipParts = [];
-
-       this.$title.empty()
-               .text( this.title )
-               .append(
-                       this.$( '<span>' )
-                               .addClass( 'oo-ui-tool-accel' )
-                               .text( accel )
-               );
-
-       if ( titleTooltips && typeof this.title === 'string' && this.title.length ) {
-               tooltipParts.push( this.title );
-       }
-       if ( accelTooltips && typeof accel === 'string' && accel.length ) {
-               tooltipParts.push( accel );
-       }
-       if ( tooltipParts.length ) {
-               this.$link.attr( 'title', tooltipParts.join( ' ' ) );
-       } else {
-               this.$link.removeAttr( 'title' );
-       }
-};
-
-/**
- * Destroy tool.
- */
-OO.ui.Tool.prototype.destroy = function () {
-       this.toolbar.disconnect( this );
-       this.$element.remove();
-};
-/**
- * Collection of tool groups.
- *
- * @class
- * @extends OO.ui.Element
- * @mixins OO.EventEmitter
- * @mixins OO.ui.GroupElement
- *
- * @constructor
- * @param {OO.ui.ToolFactory} toolFactory Factory for creating tools
- * @param {OO.ui.ToolGroupFactory} toolGroupFactory Factory for creating tool groups
- * @param {Object} [config] Configuration options
- * @cfg {boolean} [actions] Add an actions section opposite to the tools
- * @cfg {boolean} [shadow] Add a shadow below the toolbar
- */
-OO.ui.Toolbar = function OoUiToolbar( toolFactory, toolGroupFactory, config ) {
-       // Configuration initialization
-       config = config || {};
-
-       // Parent constructor
-       OO.ui.Toolbar.super.call( this, config );
-
-       // Mixin constructors
-       OO.EventEmitter.call( this );
-       OO.ui.GroupElement.call( this, this.$( '<div>' ), config );
-
-       // Properties
-       this.toolFactory = toolFactory;
-       this.toolGroupFactory = toolGroupFactory;
-       this.groups = [];
-       this.tools = {};
-       this.$bar = this.$( '<div>' );
-       this.$actions = this.$( '<div>' );
-       this.initialized = false;
-
-       // Events
-       this.$element
-               .add( this.$bar ).add( this.$group ).add( this.$actions )
-               .on( 'mousedown', OO.ui.bind( this.onMouseDown, this ) );
-
-       // Initialization
-       this.$group.addClass( 'oo-ui-toolbar-tools' );
-       this.$bar.addClass( 'oo-ui-toolbar-bar' ).append( this.$group );
-       if ( config.actions ) {
-               this.$actions.addClass( 'oo-ui-toolbar-actions' );
-               this.$bar.append( this.$actions );
-       }
-       this.$bar.append( '<div style="clear:both"></div>' );
-       if ( config.shadow ) {
-               this.$bar.append( '<div class="oo-ui-toolbar-shadow"></div>' );
-       }
-       this.$element.addClass( 'oo-ui-toolbar' ).append( this.$bar );
-};
-
-/* Inheritance */
-
-OO.inheritClass( OO.ui.Toolbar, OO.ui.Element );
-
-OO.mixinClass( OO.ui.Toolbar, OO.EventEmitter );
-OO.mixinClass( OO.ui.Toolbar, OO.ui.GroupElement );
-
-/* Methods */
-
-/**
- * Get the tool factory.
- *
- * @return {OO.ui.ToolFactory} Tool factory
- */
-OO.ui.Toolbar.prototype.getToolFactory = function () {
-       return this.toolFactory;
-};
-
-/**
- * Get the tool group factory.
- *
- * @return {OO.Factory} Tool group factory
- */
-OO.ui.Toolbar.prototype.getToolGroupFactory = function () {
-       return this.toolGroupFactory;
-};
-
-/**
- * Handles mouse down events.
- *
- * @param {jQuery.Event} e Mouse down event
- */
-OO.ui.Toolbar.prototype.onMouseDown = function ( e ) {
-       var $closestWidgetToEvent = this.$( e.target ).closest( '.oo-ui-widget' ),
-               $closestWidgetToToolbar = this.$element.closest( '.oo-ui-widget' );
-       if ( !$closestWidgetToEvent.length || $closestWidgetToEvent[0] === $closestWidgetToToolbar[0] ) {
-               return false;
-       }
-};
-
-/**
- * Sets up handles and preloads required information for the toolbar to work.
- * This must be called immediately after it is attached to a visible document.
- */
-OO.ui.Toolbar.prototype.initialize = function () {
-       this.initialized = true;
-};
-
-/**
- * Setup toolbar.
- *
- * Tools can be specified in the following ways:
- *
- * - A specific tool: `{ 'name': 'tool-name' }` or `'tool-name'`
- * - All tools in a group: `{ 'group': 'group-name' }`
- * - All tools: `'*'` - Using this will make the group a list with a "More" label by default
- *
- * @param {Object.<string,Array>} groups List of tool group configurations
- * @param {Array|string} [groups.include] Tools to include
- * @param {Array|string} [groups.exclude] Tools to exclude
- * @param {Array|string} [groups.promote] Tools to promote to the beginning
- * @param {Array|string} [groups.demote] Tools to demote to the end
- */
-OO.ui.Toolbar.prototype.setup = function ( groups ) {
-       var i, len, type, group,
-               items = [],
-               defaultType = 'bar';
-
-       // Cleanup previous groups
-       this.reset();
-
-       // Build out new groups
-       for ( i = 0, len = groups.length; i < len; i++ ) {
-               group = groups[i];
-               if ( group.include === '*' ) {
-                       // Apply defaults to catch-all groups
-                       if ( group.type === undefined ) {
-                               group.type = 'list';
-                       }
-                       if ( group.label === undefined ) {
-                               group.label = 'ooui-toolbar-more';
-                       }
-               }
-               // Check type has been registered
-               type = this.getToolGroupFactory().lookup( group.type ) ? group.type : defaultType;
-               items.push(
-                       this.getToolGroupFactory().create( type, this, $.extend( { '$': this.$ }, group ) )
-               );
-       }
-       this.addItems( items );
-};
-
-/**
- * Remove all tools and groups from the toolbar.
- */
-OO.ui.Toolbar.prototype.reset = function () {
-       var i, len;
-
-       this.groups = [];
-       this.tools = {};
-       for ( i = 0, len = this.items.length; i < len; i++ ) {
-               this.items[i].destroy();
-       }
-       this.clearItems();
-};
-
-/**
- * Destroys toolbar, removing event handlers and DOM elements.
- *
- * Call this whenever you are done using a toolbar.
- */
-OO.ui.Toolbar.prototype.destroy = function () {
-       this.reset();
-       this.$element.remove();
-};
-
-/**
- * Check if tool has not been used yet.
- *
- * @param {string} name Symbolic name of tool
- * @return {boolean} Tool is available
- */
-OO.ui.Toolbar.prototype.isToolAvailable = function ( name ) {
-       return !this.tools[name];
-};
-
-/**
- * Prevent tool from being used again.
- *
- * @param {OO.ui.Tool} tool Tool to reserve
- */
-OO.ui.Toolbar.prototype.reserveTool = function ( tool ) {
-       this.tools[tool.getName()] = tool;
-};
-
-/**
- * Allow tool to be used again.
- *
- * @param {OO.ui.Tool} tool Tool to release
- */
-OO.ui.Toolbar.prototype.releaseTool = function ( tool ) {
-       delete this.tools[tool.getName()];
-};
-
-/**
- * Get accelerator label for tool.
- *
- * This is a stub that should be overridden to provide access to accelerator information.
- *
- * @param {string} name Symbolic name of tool
- * @return {string|undefined} Tool accelerator label if available
- */
-OO.ui.Toolbar.prototype.getToolAccelerator = function () {
-       return undefined;
-};
-/**
- * Factory for tools.
- *
- * @class
- * @extends OO.Factory
- * @constructor
- */
-OO.ui.ToolFactory = function OoUiToolFactory() {
-       // Parent constructor
-       OO.ui.ToolFactory.super.call( this );
-};
-
-/* Inheritance */
-
-OO.inheritClass( OO.ui.ToolFactory, OO.Factory );
-
-/* Methods */
-
-/** */
-OO.ui.ToolFactory.prototype.getTools = function ( include, exclude, promote, demote ) {
-       var i, len, included, promoted, demoted,
-               auto = [],
-               used = {};
-
-       // Collect included and not excluded tools
-       included = OO.simpleArrayDifference( this.extract( include ), this.extract( exclude ) );
-
-       // Promotion
-       promoted = this.extract( promote, used );
-       demoted = this.extract( demote, used );
-
-       // Auto
-       for ( i = 0, len = included.length; i < len; i++ ) {
-               if ( !used[included[i]] ) {
-                       auto.push( included[i] );
-               }
-       }
-
-       return promoted.concat( auto ).concat( demoted );
-};
-
-/**
- * Get a flat list of names from a list of names or groups.
- *
- * Tools can be specified in the following ways:
- *
- * - A specific tool: `{ 'name': 'tool-name' }` or `'tool-name'`
- * - All tools in a group: `{ 'group': 'group-name' }`
- * - All tools: `'*'`
- *
- * @private
- * @param {Array|string} collection List of tools
- * @param {Object} [used] Object with names that should be skipped as properties; extracted
- *  names will be added as properties
- * @return {string[]} List of extracted names
- */
-OO.ui.ToolFactory.prototype.extract = function ( collection, used ) {
-       var i, len, item, name, tool,
-               names = [];
-
-       if ( collection === '*' ) {
-               for ( name in this.registry ) {
-                       tool = this.registry[name];
-                       if (
-                               // Only add tools by group name when auto-add is enabled
-                               tool.static.autoAddToCatchall &&
-                               // Exclude already used tools
-                               ( !used || !used[name] )
-                       ) {
-                               names.push( name );
-                               if ( used ) {
-                                       used[name] = true;
-                               }
-                       }
-               }
-       } else if ( $.isArray( collection ) ) {
-               for ( i = 0, len = collection.length; i < len; i++ ) {
-                       item = collection[i];
-                       // Allow plain strings as shorthand for named tools
-                       if ( typeof item === 'string' ) {
-                               item = { 'name': item };
-                       }
-                       if ( OO.isPlainObject( item ) ) {
-                               if ( item.group ) {
-                                       for ( name in this.registry ) {
-                                               tool = this.registry[name];
-                                               if (
-                                                       // Include tools with matching group
-                                                       tool.static.group === item.group &&
-                                                       // Only add tools by group name when auto-add is enabled
-                                                       tool.static.autoAddToGroup &&
-                                                       // Exclude already used tools
-                                                       ( !used || !used[name] )
-                                               ) {
-                                                       names.push( name );
-                                                       if ( used ) {
-                                                               used[name] = true;
-                                                       }
-                                               }
-                                       }
-                               }
-                               // Include tools with matching name and exclude already used tools
-                               else if ( item.name && ( !used || !used[item.name] ) ) {
-                                       names.push( item.name );
-                                       if ( used ) {
-                                               used[item.name] = true;
-                                       }
-                               }
-                       }
-               }
-       }
-       return names;
-};
-/**
- * Collection of tools.
- *
- * Tools can be specified in the following ways:
- *
- * - A specific tool: `{ 'name': 'tool-name' }` or `'tool-name'`
- * - All tools in a group: `{ 'group': 'group-name' }`
- * - All tools: `'*'`
- *
- * @abstract
- * @class
- * @extends OO.ui.Widget
- * @mixins OO.ui.GroupElement
- *
- * @constructor
- * @param {OO.ui.Toolbar} toolbar
- * @param {Object} [config] Configuration options
- * @cfg {Array|string} [include=[]] List of tools to include
- * @cfg {Array|string} [exclude=[]] List of tools to exclude
- * @cfg {Array|string} [promote=[]] List of tools to promote to the beginning
- * @cfg {Array|string} [demote=[]] List of tools to demote to the end
- */
-OO.ui.ToolGroup = function OoUiToolGroup( toolbar, config ) {
-       // Configuration initialization
-       config = config || {};
-
-       // Parent constructor
-       OO.ui.ToolGroup.super.call( this, config );
-
-       // Mixin constructors
-       OO.ui.GroupElement.call( this, this.$( '<div>' ), config );
-
-       // Properties
-       this.toolbar = toolbar;
-       this.tools = {};
-       this.pressed = null;
-       this.include = config.include || [];
-       this.exclude = config.exclude || [];
-       this.promote = config.promote || [];
-       this.demote = config.demote || [];
-       this.onCapturedMouseUpHandler = OO.ui.bind( this.onCapturedMouseUp, this );
-
-       // Events
-       this.$element.on( {
-               'mousedown': OO.ui.bind( this.onMouseDown, this ),
-               'mouseup': OO.ui.bind( this.onMouseUp, this ),
-               'mouseover': OO.ui.bind( this.onMouseOver, this ),
-               'mouseout': OO.ui.bind( this.onMouseOut, this )
-       } );
-       this.toolbar.getToolFactory().connect( this, { 'register': 'onToolFactoryRegister' } );
-
-       // Initialization
-       this.$group.addClass( 'oo-ui-toolGroup-tools' );
-       this.$element
-               .addClass( 'oo-ui-toolGroup' )
-               .append( this.$group );
-       this.populate();
-};
-
-/* Inheritance */
-
-OO.inheritClass( OO.ui.ToolGroup, OO.ui.Widget );
-
-OO.mixinClass( OO.ui.ToolGroup, OO.ui.GroupElement );
-
-/* Events */
-
-/**
- * @event update
- */
-
-/* Static Properties */
-
-/**
- * Show labels in tooltips.
- *
- * @static
- * @property {boolean}
- * @inheritable
- */
-OO.ui.ToolGroup.static.titleTooltips = false;
-
-/**
- * Show acceleration labels in tooltips.
- *
- * @static
- * @property {boolean}
- * @inheritable
- */
-OO.ui.ToolGroup.static.accelTooltips = false;
-
-/* Methods */
-
-/**
- * Handle mouse down events.
- *
- * @param {jQuery.Event} e Mouse down event
- */
-OO.ui.ToolGroup.prototype.onMouseDown = function ( e ) {
-       if ( !this.disabled && e.which === 1 ) {
-               this.pressed = this.getTargetTool( e );
-               if ( this.pressed ) {
-                       this.pressed.setActive( true );
-                       this.getElementDocument().addEventListener(
-                               'mouseup', this.onCapturedMouseUpHandler, true
-                       );
-                       return false;
-               }
-       }
-};
-
-/**
- * Handle captured mouse up events.
- *
- * @param {Event} e Mouse up event
- */
-OO.ui.ToolGroup.prototype.onCapturedMouseUp = function ( e ) {
-       this.getElementDocument().removeEventListener( 'mouseup', this.onCapturedMouseUpHandler, true );
-       // onMouseUp may be called a second time, depending on where the mouse is when the button is
-       // released, but since `this.pressed` will no longer be true, the second call will be ignored.
-       this.onMouseUp( e );
-};
-
-/**
- * Handle mouse up events.
- *
- * @param {jQuery.Event} e Mouse up event
- */
-OO.ui.ToolGroup.prototype.onMouseUp = function ( e ) {
-       var tool = this.getTargetTool( e );
-
-       if ( !this.disabled && e.which === 1 && this.pressed && this.pressed === tool ) {
-               this.pressed.onSelect();
-       }
-
-       this.pressed = null;
-       return false;
-};
-
-/**
- * Handle mouse over events.
- *
- * @param {jQuery.Event} e Mouse over event
- */
-OO.ui.ToolGroup.prototype.onMouseOver = function ( e ) {
-       var tool = this.getTargetTool( e );
-
-       if ( this.pressed && this.pressed === tool ) {
-               this.pressed.setActive( true );
-       }
-};
-
-/**
- * Handle mouse out events.
- *
- * @param {jQuery.Event} e Mouse out event
- */
-OO.ui.ToolGroup.prototype.onMouseOut = function ( e ) {
-       var tool = this.getTargetTool( e );
-
-       if ( this.pressed && this.pressed === tool ) {
-               this.pressed.setActive( false );
-       }
-};
-
-/**
- * Get the closest tool to a jQuery.Event.
- *
- * Only tool links are considered, which prevents other elements in the tool such as popups from
- * triggering tool group interactions.
- *
- * @private
- * @param {jQuery.Event} e
- * @return {OO.ui.Tool|null} Tool, `null` if none was found
- */
-OO.ui.ToolGroup.prototype.getTargetTool = function ( e ) {
-       var tool,
-               $item = this.$( e.target ).closest( '.oo-ui-tool-link' );
-
-       if ( $item.length ) {
-               tool = $item.parent().data( 'oo-ui-tool' );
-       }
-
-       return tool && !tool.isDisabled() ? tool : null;
-};
-
-/**
- * Handle tool registry register events.
- *
- * If a tool is registered after the group is created, we must repopulate the list to account for:
- *
- * - a tool being added that may be included
- * - a tool already included being overridden
- *
- * @param {string} name Symbolic name of tool
- */
-OO.ui.ToolGroup.prototype.onToolFactoryRegister = function () {
-       this.populate();
-};
-
-/**
- * Get the toolbar this group is in.
- *
- * @return {OO.ui.Toolbar} Toolbar of group
- */
-OO.ui.ToolGroup.prototype.getToolbar = function () {
-       return this.toolbar;
-};
-
-/**
- * Add and remove tools based on configuration.
- */
-OO.ui.ToolGroup.prototype.populate = function () {
-       var i, len, name, tool,
-               toolFactory = this.toolbar.getToolFactory(),
-               names = {},
-               add = [],
-               remove = [],
-               list = this.toolbar.getToolFactory().getTools(
-                       this.include, this.exclude, this.promote, this.demote
-               );
-
-       // Build a list of needed tools
-       for ( i = 0, len = list.length; i < len; i++ ) {
-               name = list[i];
-               if (
-                       // Tool exists
-                       toolFactory.lookup( name ) &&
-                       // Tool is available or is already in this group
-                       ( this.toolbar.isToolAvailable( name ) || this.tools[name] )
-               ) {
-                       tool = this.tools[name];
-                       if ( !tool ) {
-                               // Auto-initialize tools on first use
-                               this.tools[name] = tool = toolFactory.create( name, this );
-                               tool.updateTitle();
-                       }
-                       this.toolbar.reserveTool( tool );
-                       add.push( tool );
-                       names[name] = true;
-               }
-       }
-       // Remove tools that are no longer needed
-       for ( name in this.tools ) {
-               if ( !names[name] ) {
-                       this.tools[name].destroy();
-                       this.toolbar.releaseTool( this.tools[name] );
-                       remove.push( this.tools[name] );
-                       delete this.tools[name];
-               }
-       }
-       if ( remove.length ) {
-               this.removeItems( remove );
-       }
-       // Update emptiness state
-       if ( add.length ) {
-               this.$element.removeClass( 'oo-ui-toolGroup-empty' );
-       } else {
-               this.$element.addClass( 'oo-ui-toolGroup-empty' );
-       }
-       // Re-add tools (moving existing ones to new locations)
-       this.addItems( add );
-};
-
-/**
- * Destroy tool group.
- */
-OO.ui.ToolGroup.prototype.destroy = function () {
-       var name;
-
-       this.clearItems();
-       this.toolbar.getToolFactory().disconnect( this );
-       for ( name in this.tools ) {
-               this.toolbar.releaseTool( this.tools[name] );
-               this.tools[name].disconnect( this ).destroy();
-               delete this.tools[name];
-       }
-       this.$element.remove();
-};
-/**
- * Factory for tools.
- *
- * @class
- * @extends OO.Factory
- * @constructor
- */
-OO.ui.ToolGroupFactory = function OoUiToolGroupFactory() {
-       // Parent constructor
-       OO.Factory.call( this );
-
-       var i, l,
-               defaultClasses = this.constructor.static.getDefaultClasses();
-
-       // Register default toolgroups
-       for ( i = 0, l = defaultClasses.length; i < l; i++ ) {
-               this.register( defaultClasses[i] );
-       }
-};
-
-/* Inheritance */
-
-OO.inheritClass( OO.ui.ToolGroupFactory, OO.Factory );
-
-/* Static Methods */
-
-/**
- * Get a default set of classes to be registered on construction
- * @return {Function[]} Default classes
- */
-OO.ui.ToolGroupFactory.static.getDefaultClasses = function () {
-       return [
-               OO.ui.BarToolGroup,
-               OO.ui.ListToolGroup,
-               OO.ui.MenuToolGroup
-       ];
-};
-/**
- * Layout made of a fieldset and optional legend.
- *
- * Just add OO.ui.FieldLayout items.
- *
- * @class
- * @extends OO.ui.Layout
- * @mixins OO.ui.LabeledElement
- * @mixins OO.ui.IconedElement
- * @mixins OO.ui.GroupElement
- *
- * @constructor
- * @param {Object} [config] Configuration options
- * @cfg {string} [icon] Symbolic icon name
- * @cfg {OO.ui.FieldLayout[]} [items] Items to add
- */
-OO.ui.FieldsetLayout = function OoUiFieldsetLayout( config ) {
-       // Config initialization
-       config = config || {};
-
-       // Parent constructor
-       OO.ui.FieldsetLayout.super.call( this, config );
-
-       // Mixin constructors
-       OO.ui.IconedElement.call( this, this.$( '<div>' ), config );
-       OO.ui.LabeledElement.call( this, this.$( '<legend>' ), config );
-       OO.ui.GroupElement.call( this, this.$( '<div>' ), config );
-
-       // Initialization
-       this.$element
-               .addClass( 'oo-ui-fieldsetLayout' )
-               .append( this.$icon, this.$label, this.$group );
-       if ( $.isArray( config.items ) ) {
-               this.addItems( config.items );
-       }
-};
-
-/* Inheritance */
-
-OO.inheritClass( OO.ui.FieldsetLayout, OO.ui.Layout );
-
-OO.mixinClass( OO.ui.FieldsetLayout, OO.ui.IconedElement );
-OO.mixinClass( OO.ui.FieldsetLayout, OO.ui.LabeledElement );
-OO.mixinClass( OO.ui.FieldsetLayout, OO.ui.GroupElement );
-
-/* Static Properties */
-
-OO.ui.FieldsetLayout.static.tagName = 'fieldset';
-/**
- * Layout made of a field and optional label.
- *
- * @class
- * @extends OO.ui.Layout
- * @mixins OO.ui.LabeledElement
- *
- * Available label alignment modes include:
- *  - 'left': Label is before the field and aligned away from it, best for when the user will be
- *    scanning for a specific label in a form with many fields
- *  - 'right': Label is before the field and aligned toward it, best for forms the user is very
- *    familiar with and will tab through field checking quickly to verify which field they are in
- *  - 'top': Label is before the field and above it, best for when the use will need to fill out all
- *    fields from top to bottom in a form with few fields
- *  - 'inline': Label is after the field and aligned toward it, best for small boolean fields like
- *    checkboxes or radio buttons
- *
- * @constructor
- * @param {OO.ui.Widget} field Field widget
- * @param {Object} [config] Configuration options
- * @cfg {string} [align='left'] Alignment mode, either 'left', 'right', 'top' or 'inline'
- */
-OO.ui.FieldLayout = function OoUiFieldLayout( field, config ) {
-       // Config initialization
-       config = $.extend( { 'align': 'left' }, config );
-
-       // Parent constructor
-       OO.ui.FieldLayout.super.call( this, config );
-
-       // Mixin constructors
-       OO.ui.LabeledElement.call( this, this.$( '<label>' ), config );
-
-       // Properties
-       this.$field = this.$( '<div>' );
-       this.field = field;
-       this.align = null;
-
-       // Events
-       if ( this.field instanceof OO.ui.InputWidget ) {
-               this.$label.on( 'click', OO.ui.bind( this.onLabelClick, this ) );
-       }
-
-       // Initialization
-       this.$element.addClass( 'oo-ui-fieldLayout' );
-       this.$field
-               .addClass( 'oo-ui-fieldLayout-field' )
-               .append( this.field.$element );
-       this.setAlignment( config.align );
-};
-
-/* Inheritance */
-
-OO.inheritClass( OO.ui.FieldLayout, OO.ui.Layout );
-
-OO.mixinClass( OO.ui.FieldLayout, OO.ui.LabeledElement );
-
-/* Methods */
-
-/**
- * Handles label mouse click events.
- *
- * @method
- * @param {jQuery.Event} e Mouse click event
- */
-OO.ui.FieldLayout.prototype.onLabelClick = function () {
-       this.field.simulateLabelClick();
-       return false;
-};
-
-/**
- * Get the field.
- *
- * @returns {OO.ui.Widget} Field widget
- */
-OO.ui.FieldLayout.prototype.getField = function () {
-       return this.field;
-};
-
-/**
- * Set the field alignment mode.
- *
- * @param {string} value Alignment mode, either 'left', 'right', 'top' or 'inline'
- * @chainable
- */
-OO.ui.FieldLayout.prototype.setAlignment = function ( value ) {
-       if ( value !== this.align ) {
-               // Default to 'left'
-               if ( [ 'left', 'right', 'top', 'inline' ].indexOf( value ) === -1 ) {
-                       value = 'left';
-               }
-               // Reorder elements
-               if ( value === 'inline' ) {
-                       this.$element.append( this.$field, this.$label );
-               } else {
-                       this.$element.append( this.$label, this.$field );
-               }
-               // Set classes
-               if ( this.align ) {
-                       this.$element.removeClass( 'oo-ui-fieldLayout-align-' + this.align );
-               }
-               this.align = value;
-               this.$element.addClass( 'oo-ui-fieldLayout-align-' + this.align );
-       }
-
-       return this;
-};
-/**
- * Layout made of proportionally sized columns and rows.
- *
- * @class
- * @extends OO.ui.Layout
- *
- * @constructor
- * @param {OO.ui.PanelLayout[]} panels Panels in the grid
- * @param {Object} [config] Configuration options
- * @cfg {number[]} [widths] Widths of columns as ratios
- * @cfg {number[]} [heights] Heights of columns as ratios
- */
-OO.ui.GridLayout = function OoUiGridLayout( panels, config ) {
-       var i, len, widths;
-
-       // Config initialization
-       config = config || {};
-
-       // Parent constructor
-       OO.ui.GridLayout.super.call( this, config );
-
-       // Properties
-       this.panels = [];
-       this.widths = [];
-       this.heights = [];
-
-       // Initialization
-       this.$element.addClass( 'oo-ui-gridLayout' );
-       for ( i = 0, len = panels.length; i < len; i++ ) {
-               this.panels.push( panels[i] );
-               this.$element.append( panels[i].$element );
-       }
-       if ( config.widths || config.heights ) {
-               this.layout( config.widths || [1], config.heights || [1] );
-       } else {
-               // Arrange in columns by default
-               widths = [];
-               for ( i = 0, len = this.panels.length; i < len; i++ ) {
-                       widths[i] = 1;
-               }
-               this.layout( widths, [1] );
-       }
-};
-
-/* Inheritance */
-
-OO.inheritClass( OO.ui.GridLayout, OO.ui.Layout );
-
-/* Events */
-
-/**
- * @event layout
- */
-
-/**
- * @event update
- */
-
-/* Static Properties */
-
-OO.ui.GridLayout.static.tagName = 'div';
-
-/* Methods */
-
-/**
- * Set grid dimensions.
- *
- * @method
- * @param {number[]} widths Widths of columns as ratios
- * @param {number[]} heights Heights of rows as ratios
- * @fires layout
- * @throws {Error} If grid is not large enough to fit all panels
- */
-OO.ui.GridLayout.prototype.layout = function ( widths, heights ) {
-       var x, y,
-               xd = 0,
-               yd = 0,
-               cols = widths.length,
-               rows = heights.length;
-
-       // Verify grid is big enough to fit panels
-       if ( cols * rows < this.panels.length ) {
-               throw new Error( 'Grid is not large enough to fit ' + this.panels.length + 'panels' );
-       }
-
-       // Sum up denominators
-       for ( x = 0; x < cols; x++ ) {
-               xd += widths[x];
-       }
-       for ( y = 0; y < rows; y++ ) {
-               yd += heights[y];
-       }
-       // Store factors
-       this.widths = [];
-       this.heights = [];
-       for ( x = 0; x < cols; x++ ) {
-               this.widths[x] = widths[x] / xd;
-       }
-       for ( y = 0; y < rows; y++ ) {
-               this.heights[y] = heights[y] / yd;
-       }
-       // Synchronize view
-       this.update();
-       this.emit( 'layout' );
-};
-
-/**
- * Update panel positions and sizes.
- *
- * @method
- * @fires update
- */
-OO.ui.GridLayout.prototype.update = function () {
-       var x, y, panel,
-               i = 0,
-               left = 0,
-               top = 0,
-               dimensions,
-               width = 0,
-               height = 0,
-               cols = this.widths.length,
-               rows = this.heights.length;
-
-       for ( y = 0; y < rows; y++ ) {
-               for ( x = 0; x < cols; x++ ) {
-                       panel = this.panels[i];
-                       width = this.widths[x];
-                       height = this.heights[y];
-                       dimensions = {
-                               'width': Math.round( width * 100 ) + '%',
-                               'height': Math.round( height * 100 ) + '%',
-                               'top': Math.round( top * 100 ) + '%'
-                       };
-                       // If RTL, reverse:
-                       if ( OO.ui.Element.getDir( this.$.context ) === 'rtl' ) {
-                               dimensions.right = Math.round( left * 100 ) + '%';
-                       } else {
-                               dimensions.left = Math.round( left * 100 ) + '%';
-                       }
-                       panel.$element.css( dimensions );
-                       i++;
-                       left += width;
-               }
-               top += height;
-               left = 0;
-       }
-
-       this.emit( 'update' );
-};
-
-/**
- * Get a panel at a given position.
- *
- * The x and y position is affected by the current grid layout.
- *
- * @method
- * @param {number} x Horizontal position
- * @param {number} y Vertical position
- * @returns {OO.ui.PanelLayout} The panel at the given postion
- */
-OO.ui.GridLayout.prototype.getPanel = function ( x, y ) {
-       return this.panels[( x * this.widths.length ) + y];
-};
-/**
- * Layout containing a series of pages.
- *
- * @class
- * @extends OO.ui.Layout
- *
- * @constructor
- * @param {Object} [config] Configuration options
- * @cfg {boolean} [continuous=false] Show all pages, one after another
- * @cfg {boolean} [autoFocus=false] Focus on the first focusable element when changing to a page
- * @cfg {boolean} [outlined=false] Show an outline
- * @cfg {boolean} [editable=false] Show controls for adding, removing and reordering pages
- * @cfg {Object[]} [adders] List of adders for controls, each with name, icon and title properties
- */
-OO.ui.BookletLayout = function OoUiBookletLayout( config ) {
-       // Initialize configuration
-       config = config || {};
-
-       // Parent constructor
-       OO.ui.BookletLayout.super.call( this, config );
-
-       // Properties
-       this.currentPageName = null;
-       this.pages = {};
-       this.ignoreFocus = false;
-       this.stackLayout = new OO.ui.StackLayout( { '$': this.$, 'continuous': !!config.continuous } );
-       this.autoFocus = !!config.autoFocus;
-       this.outlineVisible = false;
-       this.outlined = !!config.outlined;
-       if ( this.outlined ) {
-               this.editable = !!config.editable;
-               this.adders = config.adders || null;
-               this.outlineControlsWidget = null;
-               this.outlineWidget = new OO.ui.OutlineWidget( { '$': this.$ } );
-               this.outlinePanel = new OO.ui.PanelLayout( { '$': this.$, 'scrollable': true } );
-               this.gridLayout = new OO.ui.GridLayout(
-                       [this.outlinePanel, this.stackLayout], { '$': this.$, 'widths': [1, 2] }
-               );
-               this.outlineVisible = true;
-               if ( this.editable ) {
-                       this.outlineControlsWidget = new OO.ui.OutlineControlsWidget(
-                               this.outlineWidget,
-                               { '$': this.$, 'adders': this.adders }
-                       );
-               }
-       }
-
-       // Events
-       this.stackLayout.connect( this, { 'set': 'onStackLayoutSet' } );
-       if ( this.outlined ) {
-               this.outlineWidget.connect( this, { 'select': 'onOutlineWidgetSelect' } );
-       }
-       if ( this.autoFocus ) {
-               // Event 'focus' does not bubble, but 'focusin' does
-               this.stackLayout.onDOMEvent( 'focusin', OO.ui.bind( this.onStackLayoutFocus, this ) );
-       }
-
-       // Initialization
-       this.$element.addClass( 'oo-ui-bookletLayout' );
-       this.stackLayout.$element.addClass( 'oo-ui-bookletLayout-stackLayout' );
-       if ( this.outlined ) {
-               this.outlinePanel.$element
-                       .addClass( 'oo-ui-bookletLayout-outlinePanel' )
-                       .append( this.outlineWidget.$element );
-               if ( this.editable ) {
-                       this.outlinePanel.$element
-                               .addClass( 'oo-ui-bookletLayout-outlinePanel-editable' )
-                               .append( this.outlineControlsWidget.$element );
-               }
-               this.$element.append( this.gridLayout.$element );
-       } else {
-               this.$element.append( this.stackLayout.$element );
-       }
-};
-
-/* Inheritance */
-
-OO.inheritClass( OO.ui.BookletLayout, OO.ui.Layout );
-
-/* Events */
-
-/**
- * @event set
- * @param {OO.ui.PageLayout} page Current page
- */
-
-/**
- * @event add
- * @param {OO.ui.PageLayout[]} page Added pages
- * @param {number} index Index pages were added at
- */
-
-/**
- * @event remove
- * @param {OO.ui.PageLayout[]} pages Removed pages
- */
-
-/* Methods */
-
-/**
- * Handle stack layout focus.
- *
- * @method
- * @param {jQuery.Event} e Focusin event
- */
-OO.ui.BookletLayout.prototype.onStackLayoutFocus = function ( e ) {
-       var name, $target;
-
-       if ( this.ignoreFocus ) {
-               // Avoid recursion from programmatic focus trigger in #onStackLayoutSet
-               return;
-       }
-
-       $target = $( e.target ).closest( '.oo-ui-pageLayout' );
-       for ( name in this.pages ) {
-               if ( this.pages[ name ].$element[0] === $target[0] ) {
-                       this.setPage( name );
-                       break;
-               }
-       }
-};
-
-/**
- * Handle stack layout set events.
- *
- * @method
- * @param {OO.ui.PanelLayout|null} page The page panel that is now the current panel
- */
-OO.ui.BookletLayout.prototype.onStackLayoutSet = function ( page ) {
-       if ( page ) {
-               this.stackLayout.$element.find( ':focus' ).blur();
-               page.scrollElementIntoView( { 'complete': OO.ui.bind( function () {
-                       this.ignoreFocus = true;
-                       if ( this.autoFocus ) {
-                               page.$element.find( ':input:first' ).focus();
-                       }
-                       this.ignoreFocus = false;
-               }, this ) } );
-       }
-};
-
-/**
- * Handle outline widget select events.
- *
- * @method
- * @param {OO.ui.OptionWidget|null} item Selected item
- */
-OO.ui.BookletLayout.prototype.onOutlineWidgetSelect = function ( item ) {
-       if ( item ) {
-               this.setPage( item.getData() );
-       }
-};
-
-/**
- * Check if booklet has an outline.
- *
- * @method
- * @returns {boolean} Booklet is outlined
- */
-OO.ui.BookletLayout.prototype.isOutlined = function () {
-       return this.outlined;
-};
-
-/**
- * Check if booklet has editing controls.
- *
- * @method
- * @returns {boolean} Booklet is outlined
- */
-OO.ui.BookletLayout.prototype.isEditable = function () {
-       return this.editable;
-};
-
-/**
- * Check if booklet has editing controls.
- *
- * @method
- * @returns {boolean} Booklet is outlined
- */
-OO.ui.BookletLayout.prototype.isOutlineVisible = function () {
-       return this.outlined && this.outlineVisible;
-};
-
-/**
- * Hide or show the outline.
- *
- * @param {boolean} [show] Show outline, omit to invert current state
- * @chainable
- */
-OO.ui.BookletLayout.prototype.toggleOutline = function ( show ) {
-       if ( this.outlined ) {
-               show = show === undefined ? !this.outlineVisible : !!show;
-               this.outlineVisible = show;
-               this.gridLayout.layout( show ? [ 1, 2 ] : [ 0, 1 ], [ 1 ] );
-       }
-
-       return this;
-};
-
-/**
- * Get the outline widget.
- *
- * @method
- * @param {OO.ui.PageLayout} page Page to be selected
- * @returns {OO.ui.PageLayout|null} Closest page to another
- */
-OO.ui.BookletLayout.prototype.getClosestPage = function ( page ) {
-       var next, prev, level,
-               pages = this.stackLayout.getItems(),
-               index = $.inArray( page, pages );
-
-       if ( index !== -1 ) {
-               next = pages[index + 1];
-               prev = pages[index - 1];
-               // Prefer adjacent pages at the same level
-               if ( this.outlined ) {
-                       level = this.outlineWidget.getItemFromData( page.getName() ).getLevel();
-                       if (
-                               prev &&
-                               level === this.outlineWidget.getItemFromData( prev.getName() ).getLevel()
-                       ) {
-                               return prev;
-                       }
-                       if (
-                               next &&
-                               level === this.outlineWidget.getItemFromData( next.getName() ).getLevel()
-                       ) {
-                               return next;
-                       }
-               }
-       }
-       return prev || next || null;
-};
-
-/**
- * Get the outline widget.
- *
- * @method
- * @returns {OO.ui.OutlineWidget|null} Outline widget, or null if boolet has no outline
- */
-OO.ui.BookletLayout.prototype.getOutline = function () {
-       return this.outlineWidget;
-};
-
-/**
- * Get the outline controls widget. If the outline is not editable, null is returned.
- *
- * @method
- * @returns {OO.ui.OutlineControlsWidget|null} The outline controls widget.
- */
-OO.ui.BookletLayout.prototype.getOutlineControls = function () {
-       return this.outlineControlsWidget;
-};
-
-/**
- * Get a page by name.
- *
- * @method
- * @param {string} name Symbolic name of page
- * @returns {OO.ui.PageLayout|undefined} Page, if found
- */
-OO.ui.BookletLayout.prototype.getPage = function ( name ) {
-       return this.pages[name];
-};
-
-/**
- * Get the current page name.
- *
- * @method
- * @returns {string|null} Current page name
- */
-OO.ui.BookletLayout.prototype.getPageName = function () {
-       return this.currentPageName;
-};
-
-/**
- * Add a page to the layout.
- *
- * When pages are added with the same names as existing pages, the existing pages will be
- * automatically removed before the new pages are added.
- *
- * @method
- * @param {OO.ui.PageLayout[]} pages Pages to add
- * @param {number} index Index to insert pages after
- * @fires add
- * @chainable
- */
-OO.ui.BookletLayout.prototype.addPages = function ( pages, index ) {
-       var i, len, name, page, item, currentIndex,
-               stackLayoutPages = this.stackLayout.getItems(),
-               remove = [],
-               items = [];
-
-       // Remove pages with same names
-       for ( i = 0, len = pages.length; i < len; i++ ) {
-               page = pages[i];
-               name = page.getName();
-
-               if ( Object.prototype.hasOwnProperty.call( this.pages, name ) ) {
-                       // Correct the insertion index
-                       currentIndex = $.inArray( this.pages[name], stackLayoutPages );
-                       if ( currentIndex !== -1 && currentIndex + 1 < index ) {
-                               index--;
-                       }
-                       remove.push( this.pages[name] );
-               }
-       }
-       if ( remove.length ) {
-               this.removePages( remove );
-       }
-
-       // Add new pages
-       for ( i = 0, len = pages.length; i < len; i++ ) {
-               page = pages[i];
-               name = page.getName();
-               this.pages[page.getName()] = page;
-               if ( this.outlined ) {
-                       item = new OO.ui.OutlineItemWidget( name, page, { '$': this.$ } );
-                       page.setOutlineItem( item );
-                       items.push( item );
-               }
-       }
-
-       if ( this.outlined && items.length ) {
-               this.outlineWidget.addItems( items, index );
-               this.updateOutlineWidget();
-       }
-       this.stackLayout.addItems( pages, index );
-       this.emit( 'add', pages, index );
-
-       return this;
-};
-
-/**
- * Remove a page from the layout.
- *
- * @method
- * @fires remove
- * @chainable
- */
-OO.ui.BookletLayout.prototype.removePages = function ( pages ) {
-       var i, len, name, page,
-               items = [];
-
-       for ( i = 0, len = pages.length; i < len; i++ ) {
-               page = pages[i];
-               name = page.getName();
-               delete this.pages[name];
-               if ( this.outlined ) {
-                       items.push( this.outlineWidget.getItemFromData( name ) );
-                       page.setOutlineItem( null );
-               }
-       }
-       if ( this.outlined && items.length ) {
-               this.outlineWidget.removeItems( items );
-               this.updateOutlineWidget();
-       }
-       this.stackLayout.removeItems( pages );
-       this.emit( 'remove', pages );
-
-       return this;
-};
-
-/**
- * Clear all pages from the layout.
- *
- * @method
- * @fires remove
- * @chainable
- */
-OO.ui.BookletLayout.prototype.clearPages = function () {
-       var i, len,
-               pages = this.stackLayout.getItems();
-
-       this.pages = {};
-       this.currentPageName = null;
-       if ( this.outlined ) {
-               this.outlineWidget.clearItems();
-               for ( i = 0, len = pages.length; i < len; i++ ) {
-                       pages[i].setOutlineItem( null );
-               }
-       }
-       this.stackLayout.clearItems();
-
-       this.emit( 'remove', pages );
-
-       return this;
-};
-
-/**
- * Set the current page by name.
- *
- * @method
- * @fires set
- * @param {string} name Symbolic name of page
- */
-OO.ui.BookletLayout.prototype.setPage = function ( name ) {
-       var selectedItem,
-               page = this.pages[name];
-
-       if ( name !== this.currentPageName ) {
-               if ( this.outlined ) {
-                       selectedItem = this.outlineWidget.getSelectedItem();
-                       if ( selectedItem && selectedItem.getData() !== name ) {
-                               this.outlineWidget.selectItem( this.outlineWidget.getItemFromData( name ) );
-                       }
-               }
-               if ( page ) {
-                       if ( this.currentPageName && this.pages[this.currentPageName] ) {
-                               this.pages[this.currentPageName].setActive( false );
-                       }
-                       this.currentPageName = name;
-                       this.stackLayout.setItem( page );
-                       page.setActive( true );
-                       this.emit( 'set', page );
-               }
-       }
-};
-
-/**
- * Call this after adding or removing items from the OutlineWidget.
- *
- * @method
- * @chainable
- */
-OO.ui.BookletLayout.prototype.updateOutlineWidget = function () {
-       // Auto-select first item when nothing is selected anymore
-       if ( !this.outlineWidget.getSelectedItem() ) {
-               this.outlineWidget.selectItem( this.outlineWidget.getFirstSelectableItem() );
-       }
-
-       return this;
-};
-/**
- * Layout that expands to cover the entire area of its parent, with optional scrolling and padding.
- *
- * @class
- * @extends OO.ui.Layout
- *
- * @constructor
- * @param {Object} [config] Configuration options
- * @cfg {boolean} [scrollable] Allow vertical scrolling
- * @cfg {boolean} [padded] Pad the content from the edges
- */
-OO.ui.PanelLayout = function OoUiPanelLayout( config ) {
-       // Config initialization
-       config = config || {};
-
-       // Parent constructor
-       OO.ui.PanelLayout.super.call( this, config );
-
-       // Initialization
-       this.$element.addClass( 'oo-ui-panelLayout' );
-       if ( config.scrollable ) {
-               this.$element.addClass( 'oo-ui-panelLayout-scrollable' );
-       }
-
-       if ( config.padded ) {
-               this.$element.addClass( 'oo-ui-panelLayout-padded' );
-       }
-
-       // Add directionality class:
-       this.$element.addClass( 'oo-ui-' + OO.ui.Element.getDir( this.$.context ) );
-};
-
-/* Inheritance */
-
-OO.inheritClass( OO.ui.PanelLayout, OO.ui.Layout );
-/**
- * Page within an OO.ui.BookletLayout.
- *
- * @class
- * @extends OO.ui.PanelLayout
- *
- * @constructor
- * @param {string} name Unique symbolic name of page
- * @param {Object} [config] Configuration options
- * @param {string} [outlineItem] Outline item widget
- */
-OO.ui.PageLayout = function OoUiPageLayout( name, config ) {
-       // Configuration initialization
-       config = $.extend( { 'scrollable': true }, config );
-
-       // Parent constructor
-       OO.ui.PageLayout.super.call( this, config );
-
-       // Properties
-       this.name = name;
-       this.outlineItem = config.outlineItem || null;
-       this.active = false;
-
-       // Initialization
-       this.$element.addClass( 'oo-ui-pageLayout' );
-};
-
-/* Inheritance */
-
-OO.inheritClass( OO.ui.PageLayout, OO.ui.PanelLayout );
-
-/* Events */
-
-/**
- * @event active
- * @param {boolean} active Page is active
- */
-
-/* Methods */
-
-/**
- * Get page name.
- *
- * @returns {string} Symbolic name of page
- */
-OO.ui.PageLayout.prototype.getName = function () {
-       return this.name;
-};
-
-/**
- * Check if page is active.
- *
- * @returns {boolean} Page is active
- */
-OO.ui.PageLayout.prototype.isActive = function () {
-       return this.active;
-};
-
-/**
- * Get outline item.
- *
- * @returns {OO.ui.OutlineItemWidget|null} Outline item widget
- */
-OO.ui.PageLayout.prototype.getOutlineItem = function () {
-       return this.outlineItem;
-};
-
-/**
- * Get outline item.
- *
- * @param {OO.ui.OutlineItemWidget|null} outlineItem Outline item widget, null to clear
- * @chainable
- */
-OO.ui.PageLayout.prototype.setOutlineItem = function ( outlineItem ) {
-       this.outlineItem = outlineItem;
-       return this;
-};
-
-/**
- * Set page active state.
- *
- * @param {boolean} Page is active
- * @fires active
- */
-OO.ui.PageLayout.prototype.setActive = function ( active ) {
-       active = !!active;
-
-       if ( active !== this.active ) {
-               this.active = active;
-               this.$element.toggleClass( 'oo-ui-pageLayout-active', active );
-               this.emit( 'active', this.active );
-       }
-};
-/**
- * Layout containing a series of mutually exclusive pages.
- *
- * @class
- * @extends OO.ui.PanelLayout
- * @mixins OO.ui.GroupElement
- *
- * @constructor
- * @param {Object} [config] Configuration options
- * @cfg {boolean} [continuous=false] Show all pages, one after another
- * @cfg {string} [icon=''] Symbolic icon name
- * @cfg {OO.ui.Layout[]} [items] Layouts to add
- */
-OO.ui.StackLayout = function OoUiStackLayout( config ) {
-       // Config initialization
-       config = $.extend( { 'scrollable': true }, config );
-
-       // Parent constructor
-       OO.ui.StackLayout.super.call( this, config );
-
-       // Mixin constructors
-       OO.ui.GroupElement.call( this, this.$element, config );
-
-       // Properties
-       this.currentItem = null;
-       this.continuous = !!config.continuous;
-
-       // Initialization
-       this.$element.addClass( 'oo-ui-stackLayout' );
-       if ( this.continuous ) {
-               this.$element.addClass( 'oo-ui-stackLayout-continuous' );
-       }
-       if ( $.isArray( config.items ) ) {
-               this.addItems( config.items );
-       }
-};
-
-/* Inheritance */
-
-OO.inheritClass( OO.ui.StackLayout, OO.ui.PanelLayout );
-
-OO.mixinClass( OO.ui.StackLayout, OO.ui.GroupElement );
-
-/* Events */
-
-/**
- * @event set
- * @param {OO.ui.PanelLayout|null} [item] Current item
- */
-
-/* Methods */
-
-/**
- * Add items.
- *
- * Adding an existing item (by value) will move it.
- *
- * @method
- * @param {OO.ui.PanelLayout[]} items Items to add
- * @param {number} [index] Index to insert items after
- * @chainable
- */
-OO.ui.StackLayout.prototype.addItems = function ( items, index ) {
-       OO.ui.GroupElement.prototype.addItems.call( this, items, index );
-
-       if ( !this.currentItem && items.length ) {
-               this.setItem( items[0] );
-       }
-
-       return this;
-};
-
-/**
- * Remove items.
- *
- * Items will be detached, not removed, so they can be used later.
- *
- * @method
- * @param {OO.ui.PanelLayout[]} items Items to remove
- * @chainable
- */
-OO.ui.StackLayout.prototype.removeItems = function ( items ) {
-       OO.ui.GroupElement.prototype.removeItems.call( this, items );
-       if ( $.inArray( this.currentItem, items  ) !== -1 ) {
-               this.currentItem = null;
-               if ( !this.currentItem && this.items.length ) {
-                       this.setItem( this.items[0] );
-               }
-       }
-
-       return this;
-};
-
-/**
- * Clear all items.
- *
- * Items will be detached, not removed, so they can be used later.
- *
- * @method
- * @chainable
- */
-OO.ui.StackLayout.prototype.clearItems = function () {
-       this.currentItem = null;
-       OO.ui.GroupElement.prototype.clearItems.call( this );
-
-       return this;
-};
-
-/**
- * Show item.
- *
- * Any currently shown item will be hidden.
- *
- * @method
- * @param {OO.ui.PanelLayout} item Item to show
- * @chainable
- */
-OO.ui.StackLayout.prototype.setItem = function ( item ) {
-       if ( item !== this.currentItem ) {
-               if ( !this.continuous ) {
-                       this.$items.css( 'display', '' );
-               }
-               if ( $.inArray( item, this.items ) !== -1 ) {
-                       if ( !this.continuous ) {
-                               item.$element.css( 'display', 'block' );
-                       }
-               } else {
-                       item = null;
-               }
-               this.currentItem = item;
-               this.emit( 'set', item );
-       }
-
-       return this;
-};
-/**
- * Horizontal bar layout of tools as icon buttons.
- *
- * @class
- * @abstract
- * @extends OO.ui.ToolGroup
- *
- * @constructor
- * @param {OO.ui.Toolbar} toolbar
- * @param {Object} [config] Configuration options
- */
-OO.ui.BarToolGroup = function OoUiBarToolGroup( toolbar, config ) {
-       // Parent constructor
-       OO.ui.BarToolGroup.super.call( this, toolbar, config );
-
-       // Initialization
-       this.$element.addClass( 'oo-ui-barToolGroup' );
-};
-
-/* Inheritance */
-
-OO.inheritClass( OO.ui.BarToolGroup, OO.ui.ToolGroup );
-
-/* Static Properties */
-
-OO.ui.BarToolGroup.static.titleTooltips = true;
-
-OO.ui.BarToolGroup.static.accelTooltips = true;
-
-OO.ui.BarToolGroup.static.name = 'bar';
-/**
- * Popup list of tools with an icon and optional label.
- *
- * @class
- * @abstract
- * @extends OO.ui.ToolGroup
- * @mixins OO.ui.IconedElement
- * @mixins OO.ui.IndicatedElement
- * @mixins OO.ui.LabeledElement
- * @mixins OO.ui.TitledElement
- * @mixins OO.ui.ClippableElement
- *
- * @constructor
- * @param {OO.ui.Toolbar} toolbar
- * @param {Object} [config] Configuration options
- */
-OO.ui.PopupToolGroup = function OoUiPopupToolGroup( toolbar, config ) {
-       // Configuration initialization
-       config = config || {};
-
-       // Parent constructor
-       OO.ui.PopupToolGroup.super.call( this, toolbar, config );
-
-       // Mixin constructors
-       OO.ui.IconedElement.call( this, this.$( '<span>' ), config );
-       OO.ui.IndicatedElement.call( this, this.$( '<span>' ), config );
-       OO.ui.LabeledElement.call( this, this.$( '<span>' ), config );
-       OO.ui.TitledElement.call( this, this.$element, config );
-       OO.ui.ClippableElement.call( this, this.$group, config );
-
-       // Properties
-       this.active = false;
-       this.dragging = false;
-       this.onBlurHandler = OO.ui.bind( this.onBlur, this );
-       this.$handle = this.$( '<span>' );
-
-       // Events
-       this.$handle.on( {
-               'mousedown': OO.ui.bind( this.onHandleMouseDown, this ),
-               'mouseup': OO.ui.bind( this.onHandleMouseUp, this )
-       } );
-
-       // Initialization
-       this.$handle
-               .addClass( 'oo-ui-popupToolGroup-handle' )
-               .append( this.$icon, this.$label, this.$indicator );
-       this.$element
-               .addClass( 'oo-ui-popupToolGroup' )
-               .prepend( this.$handle );
-};
-
-/* Inheritance */
-
-OO.inheritClass( OO.ui.PopupToolGroup, OO.ui.ToolGroup );
-
-OO.mixinClass( OO.ui.PopupToolGroup, OO.ui.IconedElement );
-OO.mixinClass( OO.ui.PopupToolGroup, OO.ui.IndicatedElement );
-OO.mixinClass( OO.ui.PopupToolGroup, OO.ui.LabeledElement );
-OO.mixinClass( OO.ui.PopupToolGroup, OO.ui.TitledElement );
-OO.mixinClass( OO.ui.PopupToolGroup, OO.ui.ClippableElement );
-
-/* Static Properties */
-
-/* Methods */
-
-/**
- * Handle focus being lost.
- *
- * The event is actually generated from a mouseup, so it is not a normal blur event object.
- *
- * @method
- * @param {jQuery.Event} e Mouse up event
- */
-OO.ui.PopupToolGroup.prototype.onBlur = function ( e ) {
-       // Only deactivate when clicking outside the dropdown element
-       if ( this.$( e.target ).closest( '.oo-ui-popupToolGroup' )[0] !== this.$element[0] ) {
-               this.setActive( false );
-       }
-};
-
-/**
- * @inheritdoc
- */
-OO.ui.PopupToolGroup.prototype.onMouseUp = function ( e ) {
-       if ( !this.disabled && e.which === 1 ) {
-               this.setActive( false );
-       }
-       return OO.ui.ToolGroup.prototype.onMouseUp.call( this, e );
-};
-
-/**
- * Handle mouse up events.
- *
- * @method
- * @param {jQuery.Event} e Mouse up event
- */
-OO.ui.PopupToolGroup.prototype.onHandleMouseUp = function () {
-       return false;
-};
-
-/**
- * Handle mouse down events.
- *
- * @method
- * @param {jQuery.Event} e Mouse down event
- */
-OO.ui.PopupToolGroup.prototype.onHandleMouseDown = function ( e ) {
-       if ( !this.disabled && e.which === 1 ) {
-               this.setActive( !this.active );
-       }
-       return false;
-};
-
-/**
- * Switch into active mode.
- *
- * When active, mouseup events anywhere in the document will trigger deactivation.
- *
- * @method
- */
-OO.ui.PopupToolGroup.prototype.setActive = function ( value ) {
-       value = !!value;
-       if ( this.active !== value ) {
-               this.active = value;
-               if ( value ) {
-                       this.setClipping( true );
-                       this.$element.addClass( 'oo-ui-popupToolGroup-active' );
-                       this.getElementDocument().addEventListener( 'mouseup', this.onBlurHandler, true );
-               } else {
-                       this.setClipping( false );
-                       this.$element.removeClass( 'oo-ui-popupToolGroup-active' );
-                       this.getElementDocument().removeEventListener( 'mouseup', this.onBlurHandler, true );
-               }
-       }
-};
-/**
- * Drop down list layout of tools as labeled icon buttons.
- *
- * @class
- * @abstract
- * @extends OO.ui.PopupToolGroup
- *
- * @constructor
- * @param {OO.ui.Toolbar} toolbar
- * @param {Object} [config] Configuration options
- */
-OO.ui.ListToolGroup = function OoUiListToolGroup( toolbar, config ) {
-       // Parent constructor
-       OO.ui.ListToolGroup.super.call( this, toolbar, config );
-
-       // Initialization
-       this.$element.addClass( 'oo-ui-listToolGroup' );
-};
-
-/* Inheritance */
-
-OO.inheritClass( OO.ui.ListToolGroup, OO.ui.PopupToolGroup );
-
-/* Static Properties */
-
-OO.ui.ListToolGroup.static.accelTooltips = true;
-
-OO.ui.ListToolGroup.static.name = 'list';
-/**
- * Drop down menu layout of tools as selectable menu items.
- *
- * @class
- * @abstract
- * @extends OO.ui.PopupToolGroup
- *
- * @constructor
- * @param {OO.ui.Toolbar} toolbar
- * @param {Object} [config] Configuration options
- */
-OO.ui.MenuToolGroup = function OoUiMenuToolGroup( toolbar, config ) {
-       // Configuration initialization
-       config = config || {};
-
-       // Parent constructor
-       OO.ui.MenuToolGroup.super.call( this, toolbar, config );
-
-       // Events
-       this.toolbar.connect( this, { 'updateState': 'onUpdateState' } );
-
-       // Initialization
-       this.$element.addClass( 'oo-ui-menuToolGroup' );
-};
-
-/* Inheritance */
-
-OO.inheritClass( OO.ui.MenuToolGroup, OO.ui.PopupToolGroup );
-
-/* Static Properties */
-
-OO.ui.MenuToolGroup.static.accelTooltips = true;
-
-OO.ui.MenuToolGroup.static.name = 'menu';
-
-/* Methods */
-
-/**
- * Handle the toolbar state being updated.
- *
- * When the state changes, the title of each active item in the menu will be joined together and
- * used as a label for the group. The label will be empty if none of the items are active.
- *
- * @method
- */
-OO.ui.MenuToolGroup.prototype.onUpdateState = function () {
-       var name,
-               labelTexts = [];
-
-       for ( name in this.tools ) {
-               if ( this.tools[name].isActive() ) {
-                       labelTexts.push( this.tools[name].getTitle() );
-               }
-       }
-
-       this.setLabel( labelTexts.join( ', ' ) || ' ' );
-};
-/**
- * UserInterface popup tool.
- *
- * @abstract
- * @class
- * @extends OO.ui.Tool
- * @mixins OO.ui.PopuppableElement
- *
- * @constructor
- * @param {OO.ui.Toolbar} toolbar
- * @param {Object} [config] Configuration options
- */
-OO.ui.PopupTool = function OoUiPopupTool( toolbar, config ) {
-       // Parent constructor
-       OO.ui.PopupTool.super.call( this, toolbar, config );
-
-       // Mixin constructors
-       OO.ui.PopuppableElement.call( this, config );
-
-       // Initialization
-       this.$element
-               .addClass( 'oo-ui-popupTool' )
-               .append( this.popup.$element );
-};
-
-/* Inheritance */
-
-OO.inheritClass( OO.ui.PopupTool, OO.ui.Tool );
-
-OO.mixinClass( OO.ui.PopupTool, OO.ui.PopuppableElement );
-
-/* Methods */
-
-/**
- * Handle the tool being selected.
- *
- * @inheritdoc
- */
-OO.ui.PopupTool.prototype.onSelect = function () {
-       if ( !this.disabled ) {
-               if ( this.popup.isVisible() ) {
-                       this.hidePopup();
-               } else {
-                       this.showPopup();
-               }
-       }
-       this.setActive( false );
-       return false;
-};
-
-/**
- * Handle the toolbar state being updated.
- *
- * @inheritdoc
- */
-OO.ui.PopupTool.prototype.onUpdateState = function () {
-       this.setActive( false );
-};
-/**
- * Group widget.
- *
- * Mixin for OO.ui.Widget subclasses.
- *
- * Use together with OO.ui.ItemWidget to make disabled state inheritable.
- *
- * @class
- * @abstract
- * @extends OO.ui.GroupElement
- *
- * @constructor
- * @param {jQuery} $group Container node, assigned to #$group
- * @param {Object} [config] Configuration options
- */
-OO.ui.GroupWidget = function OoUiGroupWidget( $element, config ) {
-       // Parent constructor
-       OO.ui.GroupWidget.super.call( this, $element, config );
-};
-
-/* Inheritance */
-
-OO.inheritClass( OO.ui.GroupWidget, OO.ui.GroupElement );
-
-/* Methods */
-
-/**
- * Set the disabled state of the widget.
- *
- * This will also update the disabled state of child widgets.
- *
- * @method
- * @param {boolean} disabled Disable widget
- * @chainable
- */
-OO.ui.GroupWidget.prototype.setDisabled = function ( disabled ) {
-       var i, len;
-
-       // Parent method
-       // Note this is calling OO.ui.Widget; we're assuming the class this is mixed into
-       // is a subclass of OO.ui.Widget.
-       OO.ui.Widget.prototype.setDisabled.call( this, disabled );
-
-       // During construction, #setDisabled is called before the OO.ui.GroupElement constructor
-       if ( this.items ) {
-               for ( i = 0, len = this.items.length; i < len; i++ ) {
-                       this.items[i].updateDisabled();
-               }
-       }
-
-       return this;
-};
-/**
- * Item widget.
- *
- * Use together with OO.ui.GroupWidget to make disabled state inheritable.
- *
- * @class
- * @abstract
- *
- * @constructor
- */
-OO.ui.ItemWidget = function OoUiItemWidget() {
-       //
-};
-
-/* Methods */
-
-/**
- * Check if widget is disabled.
- *
- * Checks parent if present, making disabled state inheritable.
- *
- * @returns {boolean} Widget is disabled
- */
-OO.ui.ItemWidget.prototype.isDisabled = function () {
-       return this.disabled ||
-               ( this.elementGroup instanceof OO.ui.Widget && this.elementGroup.isDisabled() );
-};
-
-/**
- * Set group element is in.
- *
- * @param {OO.ui.GroupElement|null} group Group element, null if none
- * @chainable
- */
-OO.ui.ItemWidget.prototype.setElementGroup = function ( group ) {
-       // Parent method
-       OO.ui.Element.prototype.setElementGroup.call( this, group );
-
-       // Initialize item disabled states
-       this.updateDisabled();
-
-       return this;
-};
-/**
- * Creates an OO.ui.IconWidget object.
- *
- * @class
- * @extends OO.ui.Widget
- * @mixins OO.ui.IconedElement
- * @mixins OO.ui.TitledElement
- *
- * @constructor
- * @param {Object} [config] Configuration options
- */
-OO.ui.IconWidget = function OoUiIconWidget( config ) {
-       // Config intialization
-       config = config || {};
-
-       // Parent constructor
-       OO.ui.IconWidget.super.call( this, config );
-
-       // Mixin constructors
-       OO.ui.IconedElement.call( this, this.$element, config );
-       OO.ui.TitledElement.call( this, this.$element, config );
-
-       // Initialization
-       this.$element.addClass( 'oo-ui-iconWidget' );
-};
-
-/* Inheritance */
-
-OO.inheritClass( OO.ui.IconWidget, OO.ui.Widget );
-
-OO.mixinClass( OO.ui.IconWidget, OO.ui.IconedElement );
-OO.mixinClass( OO.ui.IconWidget, OO.ui.TitledElement );
-
-/* Static Properties */
-
-OO.ui.IconWidget.static.tagName = 'span';
-/**
- * Creates an OO.ui.IndicatorWidget object.
- *
- * @class
- * @extends OO.ui.Widget
- * @mixins OO.ui.IndicatedElement
- * @mixins OO.ui.TitledElement
- *
- * @constructor
- * @param {Object} [config] Configuration options
- */
-OO.ui.IndicatorWidget = function OoUiIndicatorWidget( config ) {
-       // Config intialization
-       config = config || {};
-
-       // Parent constructor
-       OO.ui.IndicatorWidget.super.call( this, config );
-
-       // Mixin constructors
-       OO.ui.IndicatedElement.call( this, this.$element, config );
-       OO.ui.TitledElement.call( this, this.$element, config );
-
-       // Initialization
-       this.$element.addClass( 'oo-ui-indicatorWidget' );
-};
-
-/* Inheritance */
-
-OO.inheritClass( OO.ui.IndicatorWidget, OO.ui.Widget );
-
-OO.mixinClass( OO.ui.IndicatorWidget, OO.ui.IndicatedElement );
-OO.mixinClass( OO.ui.IndicatorWidget, OO.ui.TitledElement );
-
-/* Static Properties */
-
-OO.ui.IndicatorWidget.static.tagName = 'span';
-/**
- * Container for multiple related buttons.
- *
- * @class
- * @extends OO.ui.Widget
- * @mixins OO.ui.GroupElement
- *
- * @constructor
- * @param {Object} [config] Configuration options
- * @cfg {OO.ui.ButtonWidget} [items] Buttons to add
- */
-OO.ui.ButtonGroupWidget = function OoUiButtonGroupWidget( config ) {
-       // Parent constructor
-       OO.ui.ButtonGroupWidget.super.call( this, config );
-
-       // Mixin constructors
-       OO.ui.GroupElement.call( this, this.$element, config );
-
-       // Initialization
-       this.$element.addClass( 'oo-ui-buttonGroupWidget' );
-       if ( $.isArray( config.items ) ) {
-               this.addItems( config.items );
-       }
-};
-
-/* Inheritance */
-
-OO.inheritClass( OO.ui.ButtonGroupWidget, OO.ui.Widget );
-
-OO.mixinClass( OO.ui.ButtonGroupWidget, OO.ui.GroupElement );
-/**
- * Creates an OO.ui.ButtonWidget object.
- *
- * @class
- * @abstract
- * @extends OO.ui.Widget
- * @mixins OO.ui.ButtonedElement
- * @mixins OO.ui.IconedElement
- * @mixins OO.ui.IndicatedElement
- * @mixins OO.ui.LabeledElement
- * @mixins OO.ui.TitledElement
- * @mixins OO.ui.FlaggableElement
- *
- * @constructor
- * @param {Object} [config] Configuration options
- * @cfg {string} [title=''] Title text
- * @cfg {string} [href] Hyperlink to visit when clicked
- * @cfg {string} [target] Target to open hyperlink in
- */
-OO.ui.ButtonWidget = function OoUiButtonWidget( config ) {
-       // Configuration initialization
-       config = $.extend( { 'target': '_blank' }, config );
-
-       // Parent constructor
-       OO.ui.ButtonWidget.super.call( this, config );
-
-       // Mixin constructors
-       OO.ui.ButtonedElement.call( this, this.$( '<a>' ), config );
-       OO.ui.IconedElement.call( this, this.$( '<span>' ), config );
-       OO.ui.IndicatedElement.call( this, this.$( '<span>' ), config );
-       OO.ui.LabeledElement.call( this, this.$( '<span>' ), config );
-       OO.ui.TitledElement.call( this, this.$button, config );
-       OO.ui.FlaggableElement.call( this, config );
-
-       // Properties
-       this.isHyperlink = typeof config.href === 'string';
-
-       // Events
-       this.$button.on( {
-               'click': OO.ui.bind( this.onClick, this ),
-               'keypress': OO.ui.bind( this.onKeyPress, this )
-       } );
-
-       // Initialization
-       this.$button
-               .append( this.$icon, this.$label, this.$indicator )
-               .attr( { 'href': config.href, 'target': config.target } );
-       this.$element
-               .addClass( 'oo-ui-buttonWidget' )
-               .append( this.$button );
-};
-
-/* Inheritance */
-
-OO.inheritClass( OO.ui.ButtonWidget, OO.ui.Widget );
-
-OO.mixinClass( OO.ui.ButtonWidget, OO.ui.ButtonedElement );
-OO.mixinClass( OO.ui.ButtonWidget, OO.ui.IconedElement );
-OO.mixinClass( OO.ui.ButtonWidget, OO.ui.IndicatedElement );
-OO.mixinClass( OO.ui.ButtonWidget, OO.ui.LabeledElement );
-OO.mixinClass( OO.ui.ButtonWidget, OO.ui.TitledElement );
-OO.mixinClass( OO.ui.ButtonWidget, OO.ui.FlaggableElement );
-
-/* Events */
-
-/**
- * @event click
- */
-
-/* Methods */
-
-/**
- * Handles mouse click events.
- *
- * @method
- * @param {jQuery.Event} e Mouse click event
- * @fires click
- */
-OO.ui.ButtonWidget.prototype.onClick = function () {
-       if ( !this.disabled ) {
-               this.emit( 'click' );
-               if ( this.isHyperlink ) {
-                       return true;
-               }
-       }
-       return false;
-};
-
-/**
- * Handles keypress events.
- *
- * @method
- * @param {jQuery.Event} e Keypress event
- * @fires click
- */
-OO.ui.ButtonWidget.prototype.onKeyPress = function ( e ) {
-       if ( !this.disabled && e.which === OO.ui.Keys.SPACE ) {
-               if ( this.isHyperlink ) {
-                       this.onClick();
-                       return true;
-               }
-       }
-       return false;
-};
-/**
- * Creates an OO.ui.InputWidget object.
- *
- * @class
- * @abstract
- * @extends OO.ui.Widget
- *
- * @constructor
- * @param {Object} [config] Configuration options
- * @cfg {string} [name=''] HTML input name
- * @cfg {string} [value=''] Input value
- * @cfg {boolean} [readOnly=false] Prevent changes
- * @cfg {Function} [inputFilter] Filter function to apply to the input. Takes a string argument and returns a string.
- */
-OO.ui.InputWidget = function OoUiInputWidget( config ) {
-       // Config intialization
-       config = $.extend( { 'readOnly': false }, config );
-
-       // Parent constructor
-       OO.ui.InputWidget.super.call( this, config );
-
-       // Properties
-       this.$input = this.getInputElement( config );
-       this.value = '';
-       this.readOnly = false;
-       this.inputFilter = config.inputFilter;
-
-       // Events
-       this.$input.on( 'keydown mouseup cut paste change input select', OO.ui.bind( this.onEdit, this ) );
-
-       // Initialization
-       this.$input
-               .attr( 'name', config.name )
-               .prop( 'disabled', this.disabled );
-       this.setReadOnly( config.readOnly );
-       this.$element.addClass( 'oo-ui-inputWidget' ).append( this.$input );
-       this.setValue( config.value );
-};
-
-/* Inheritance */
-
-OO.inheritClass( OO.ui.InputWidget, OO.ui.Widget );
-
-/* Events */
-
-/**
- * @event change
- * @param value
- */
-
-/* Methods */
-
-/**
- * Get input element.
- *
- * @method
- * @param {Object} [config] Configuration options
- * @returns {jQuery} Input element
- */
-OO.ui.InputWidget.prototype.getInputElement = function () {
-       return this.$( '<input>' );
-};
-
-/**
- * Handle potentially value-changing events.
- *
- * @method
- * @param {jQuery.Event} e Key down, mouse up, cut, paste, change, input, or select event
- */
-OO.ui.InputWidget.prototype.onEdit = function () {
-       if ( !this.disabled ) {
-               // Allow the stack to clear so the value will be updated
-               setTimeout( OO.ui.bind( function () {
-                       this.setValue( this.$input.val() );
-               }, this ) );
-       }
-};
-
-/**
- * Get the value of the input.
- *
- * @method
- * @returns {string} Input value
- */
-OO.ui.InputWidget.prototype.getValue = function () {
-       return this.value;
-};
-
-/**
- * Sets the direction of the current input, either RTL or LTR
- *
- * @method
- * @param {boolean} isRTL
- */
-OO.ui.InputWidget.prototype.setRTL = function ( isRTL ) {
-       if ( isRTL ) {
-               this.$input.removeClass( 'oo-ui-ltr' );
-               this.$input.addClass( 'oo-ui-rtl' );
-       } else {
-               this.$input.removeClass( 'oo-ui-rtl' );
-               this.$input.addClass( 'oo-ui-ltr' );
-       }
-};
-
-/**
- * Set the value of the input.
- *
- * @method
- * @param {string} value New value
- * @fires change
- * @chainable
- */
-OO.ui.InputWidget.prototype.setValue = function ( value ) {
-       value = this.sanitizeValue( value );
-       if ( this.value !== value ) {
-               this.value = value;
-               this.emit( 'change', this.value );
-       }
-       // Update the DOM if it has changed. Note that with sanitizeValue, it
-       // is possible for the DOM value to change without this.value changing.
-       if ( this.$input.val() !== this.value ) {
-               this.$input.val( this.value );
-       }
-       return this;
-};
-
-/**
- * Sanitize incoming value.
- *
- * Ensures value is a string, and converts undefined and null to empty strings.
- *
- * @method
- * @param {string} value Original value
- * @returns {string} Sanitized value
- */
-OO.ui.InputWidget.prototype.sanitizeValue = function ( value ) {
-       if ( value === undefined || value === null ) {
-               return '';
-       } else if ( this.inputFilter ) {
-               return this.inputFilter( String( value ) );
-       } else {
-               return String( value );
-       }
-};
-
-/**
- * Simulate the behavior of clicking on a label bound to this input.
- *
- * @method
- */
-OO.ui.InputWidget.prototype.simulateLabelClick = function () {
-       if ( !this.isDisabled() ) {
-               if ( this.$input.is( ':checkbox,:radio' ) ) {
-                       this.$input.click();
-               } else if ( this.$input.is( ':input' ) ) {
-                       this.$input.focus();
-               }
-       }
-};
-
-/**
- * Check if the widget is read-only.
- *
- * @method
- * @param {boolean} Input is read-only
- */
-OO.ui.InputWidget.prototype.isReadOnly = function () {
-       return this.readOnly;
-};
-
-/**
- * Set the read-only state of the widget.
- *
- * This should probably change the widgets's appearance and prevent it from being used.
- *
- * @method
- * @param {boolean} state Make input read-only
- * @chainable
- */
-OO.ui.InputWidget.prototype.setReadOnly = function ( state ) {
-       this.readOnly = !!state;
-       this.$input.prop( 'readonly', this.readOnly );
-       return this;
-};
-
-/**
- * @inheritdoc
- */
-OO.ui.InputWidget.prototype.setDisabled = function ( state ) {
-       OO.ui.Widget.prototype.setDisabled.call( this, state );
-       if ( this.$input ) {
-               this.$input.prop( 'disabled', this.disabled );
-       }
-       return this;
-};
-/**
- * Creates an OO.ui.CheckboxInputWidget object.
- *
- * @class
- * @extends OO.ui.InputWidget
- *
- * @constructor
- * @param {Object} [config] Configuration options
- */
-OO.ui.CheckboxInputWidget = function OoUiCheckboxInputWidget( config ) {
-       // Parent constructor
-       OO.ui.CheckboxInputWidget.super.call( this, config );
-
-       // Initialization
-       this.$element.addClass( 'oo-ui-checkboxInputWidget' );
-};
-
-/* Inheritance */
-
-OO.inheritClass( OO.ui.CheckboxInputWidget, OO.ui.InputWidget );
-
-/* Events */
-
-/* Methods */
-
-/**
- * Get input element.
- *
- * @returns {jQuery} Input element
- */
-OO.ui.CheckboxInputWidget.prototype.getInputElement = function () {
-       return this.$( '<input type="checkbox" />' );
-};
-
-/**
- * Get checked state of the checkbox
- *
- * @returns {boolean} If the checkbox is checked
- */
-OO.ui.CheckboxInputWidget.prototype.getValue = function () {
-       return this.value;
-};
-
-/**
- * Set value
- */
-OO.ui.CheckboxInputWidget.prototype.setValue = function ( value ) {
-       value = !!value;
-       if ( this.value !== value ) {
-               this.value = value;
-               this.$input.prop( 'checked', this.value );
-               this.emit( 'change', this.value );
-       }
-};
-
-/**
- * @inheritdoc
- */
-OO.ui.CheckboxInputWidget.prototype.onEdit = function () {
-       if ( !this.disabled ) {
-               // Allow the stack to clear so the value will be updated
-               setTimeout( OO.ui.bind( function () {
-                       this.setValue( this.$input.prop( 'checked' ) );
-               }, this ) );
-       }
-};
-/**
- * Creates an OO.ui.LabelWidget object.
- *
- * @class
- * @extends OO.ui.Widget
- * @mixins OO.ui.LabeledElement
- *
- * @constructor
- * @param {Object} [config] Configuration options
- */
-OO.ui.LabelWidget = function OoUiLabelWidget( config ) {
-       // Config intialization
-       config = config || {};
-
-       // Parent constructor
-       OO.ui.LabelWidget.super.call( this, config );
-
-       // Mixin constructors
-       OO.ui.LabeledElement.call( this, this.$element, config );
-
-       // Properties
-       this.input = config.input;
-
-       // Events
-       if ( this.input instanceof OO.ui.InputWidget ) {
-               this.$element.on( 'click', OO.ui.bind( this.onClick, this ) );
-       }
-
-       // Initialization
-       this.$element.addClass( 'oo-ui-labelWidget' );
-};
-
-/* Inheritance */
-
-OO.inheritClass( OO.ui.LabelWidget, OO.ui.Widget );
-
-OO.mixinClass( OO.ui.LabelWidget, OO.ui.LabeledElement );
-
-/* Static Properties */
-
-OO.ui.LabelWidget.static.tagName = 'label';
-
-/* Methods */
-
-/**
- * Handles label mouse click events.
- *
- * @method
- * @param {jQuery.Event} e Mouse click event
- */
-OO.ui.LabelWidget.prototype.onClick = function () {
-       this.input.simulateLabelClick();
-       return false;
-};
-/**
- * Lookup input widget.
- *
- * Mixin that adds a menu showing suggested values to a text input. Subclasses must handle `select`
- * events on #lookupMenu to make use of selections.
- *
- * @class
- * @abstract
- *
- * @constructor
- * @param {OO.ui.TextInputWidget} input Input widget
- * @param {Object} [config] Configuration options
- * @cfg {jQuery} [$overlay=this.$( 'body' )] Overlay layer
- */
-OO.ui.LookupInputWidget = function OoUiLookupInputWidget( input, config ) {
-       // Config intialization
-       config = config || {};
-
-       // Properties
-       this.lookupInput = input;
-       this.$overlay = config.$overlay || this.$( 'body,.oo-ui-window-overlay' ).last();
-       this.lookupMenu = new OO.ui.TextInputMenuWidget( this, {
-               '$': OO.ui.Element.getJQuery( this.$overlay ),
-               'input': this.lookupInput,
-               '$container': config.$container
-       } );
-       this.lookupCache = {};
-       this.lookupQuery = null;
-       this.lookupRequest = null;
-       this.populating = false;
-
-       // Events
-       this.$overlay.append( this.lookupMenu.$element );
-
-       this.lookupInput.$input.on( {
-               'focus': OO.ui.bind( this.onLookupInputFocus, this ),
-               'blur': OO.ui.bind( this.onLookupInputBlur, this ),
-               'mousedown': OO.ui.bind( this.onLookupInputMouseDown, this )
-       } );
-       this.lookupInput.connect( this, { 'change': 'onLookupInputChange' } );
-
-       // Initialization
-       this.$element.addClass( 'oo-ui-lookupWidget' );
-       this.lookupMenu.$element.addClass( 'oo-ui-lookupWidget-menu' );
-};
-
-/* Methods */
-
-/**
- * Handle input focus event.
- *
- * @method
- * @param {jQuery.Event} e Input focus event
- */
-OO.ui.LookupInputWidget.prototype.onLookupInputFocus = function () {
-       this.openLookupMenu();
-};
-
-/**
- * Handle input blur event.
- *
- * @method
- * @param {jQuery.Event} e Input blur event
- */
-OO.ui.LookupInputWidget.prototype.onLookupInputBlur = function () {
-       this.lookupMenu.hide();
-};
-
-/**
- * Handle input mouse down event.
- *
- * @method
- * @param {jQuery.Event} e Input mouse down event
- */
-OO.ui.LookupInputWidget.prototype.onLookupInputMouseDown = function () {
-       this.openLookupMenu();
-};
-
-/**
- * Handle input change event.
- *
- * @method
- * @param {string} value New input value
- */
-OO.ui.LookupInputWidget.prototype.onLookupInputChange = function () {
-       this.openLookupMenu();
-};
-
-/**
- * Open the menu.
- *
- * @method
- * @chainable
- */
-OO.ui.LookupInputWidget.prototype.openLookupMenu = function () {
-       var value = this.lookupInput.getValue();
-
-       if ( this.lookupMenu.$input.is( ':focus' ) && $.trim( value ) !== '' ) {
-               this.populateLookupMenu();
-               if ( !this.lookupMenu.isVisible() ) {
-                       this.lookupMenu.show();
-               }
-       } else {
-               this.lookupMenu.clearItems();
-               this.lookupMenu.hide();
-       }
-
-       return this;
-};
-
-/**
- * Populate lookup menu with current information.
- *
- * @method
- * @chainable
- */
-OO.ui.LookupInputWidget.prototype.populateLookupMenu = function () {
-       if ( !this.populating ) {
-               this.populating = true;
-               this.getLookupMenuItems()
-                       .done( OO.ui.bind( function ( items ) {
-                               this.lookupMenu.clearItems();
-                               if ( items.length ) {
-                                       this.lookupMenu.show();
-                                       this.lookupMenu.addItems( items );
-                                       this.initializeLookupMenuSelection();
-                                       this.openLookupMenu();
-                               } else {
-                                       this.lookupMenu.hide();
-                               }
-                               this.populating = false;
-                       }, this ) )
-                       .fail( OO.ui.bind( function () {
-                               this.lookupMenu.clearItems();
-                               this.populating = false;
-                       }, this ) );
-       }
-
-       return this;
-};
-
-/**
- * Set selection in the lookup menu with current information.
- *
- * @method
- * @chainable
- */
-OO.ui.LookupInputWidget.prototype.initializeLookupMenuSelection = function () {
-       if ( !this.lookupMenu.getSelectedItem() ) {
-               this.lookupMenu.intializeSelection( this.lookupMenu.getFirstSelectableItem() );
-       }
-       this.lookupMenu.highlightItem( this.lookupMenu.getSelectedItem() );
-};
-
-/**
- * Get lookup menu items for the current query.
- *
- * @method
- * @returns {jQuery.Promise} Promise object which will be passed menu items as the first argument
- * of the done event
- */
-OO.ui.LookupInputWidget.prototype.getLookupMenuItems = function () {
-       var value = this.lookupInput.getValue(),
-               deferred = $.Deferred();
-
-       if ( value && value !== this.lookupQuery ) {
-               // Abort current request if query has changed
-               if ( this.lookupRequest ) {
-                       this.lookupRequest.abort();
-                       this.lookupQuery = null;
-                       this.lookupRequest = null;
-               }
-               if ( value in this.lookupCache ) {
-                       deferred.resolve( this.getLookupMenuItemsFromData( this.lookupCache[value] ) );
-               } else {
-                       this.lookupQuery = value;
-                       this.lookupRequest = this.getLookupRequest()
-                               .always( OO.ui.bind( function () {
-                                       this.lookupQuery = null;
-                                       this.lookupRequest = null;
-                               }, this ) )
-                               .done( OO.ui.bind( function ( data ) {
-                                       this.lookupCache[value] = this.getLookupCacheItemFromData( data );
-                                       deferred.resolve( this.getLookupMenuItemsFromData( this.lookupCache[value] ) );
-                               }, this ) )
-                               .fail( function () {
-                                       deferred.reject();
-                               } );
-                       this.pushPending();
-                       this.lookupRequest.always( OO.ui.bind( function () {
-                               this.popPending();
-                       }, this ) );
-               }
-       }
-       return deferred.promise();
-};
-
-/**
- * Get a new request object of the current lookup query value.
- *
- * @method
- * @abstract
- * @returns {jqXHR} jQuery AJAX object, or promise object with an .abort() method
- */
-OO.ui.LookupInputWidget.prototype.getLookupRequest = function () {
-       // Stub, implemented in subclass
-       return null;
-};
-
-/**
- * Handle successful lookup request.
- *
- * Overriding methods should call #populateLookupMenu when results are available and cache results
- * for future lookups in #lookupCache as an array of #OO.ui.MenuItemWidget objects.
- *
- * @method
- * @abstract
- * @param {Mixed} data Response from server
- */
-OO.ui.LookupInputWidget.prototype.onLookupRequestDone = function () {
-       // Stub, implemented in subclass
-};
-
-/**
- * Get a list of menu item widgets from the data stored by the lookup request's done handler.
- *
- * @method
- * @abstract
- * @param {Mixed} data Cached result data, usually an array
- * @returns {OO.ui.MenuItemWidget[]} Menu items
- */
-OO.ui.LookupInputWidget.prototype.getLookupMenuItemsFromData = function () {
-       // Stub, implemented in subclass
-       return [];
-};
-/**
- * Creates an OO.ui.OptionWidget object.
- *
- * @class
- * @abstract
- * @extends OO.ui.Widget
- * @mixins OO.ui.IconedElement
- * @mixins OO.ui.LabeledElement
- * @mixins OO.ui.IndicatedElement
- * @mixins OO.ui.FlaggableElement
- *
- * @constructor
- * @param {Mixed} data Option data
- * @param {Object} [config] Configuration options
- * @cfg {string} [rel] Value for `rel` attribute in DOM, allowing per-option styling
- */
-OO.ui.OptionWidget = function OoUiOptionWidget( data, config ) {
-       // Config intialization
-       config = config || {};
-
-       // Parent constructor
-       OO.ui.OptionWidget.super.call( this, config );
-
-       // Mixin constructors
-       OO.ui.ItemWidget.call( this );
-       OO.ui.IconedElement.call( this, this.$( '<span>' ), config );
-       OO.ui.LabeledElement.call( this, this.$( '<span>' ), config );
-       OO.ui.IndicatedElement.call( this, this.$( '<span>' ), config );
-       OO.ui.FlaggableElement.call( this, config );
-
-       // Properties
-       this.data = data;
-       this.selected = false;
-       this.highlighted = false;
-
-       // Initialization
-       this.$element
-               .data( 'oo-ui-optionWidget', this )
-               .attr( 'rel', config.rel )
-               .addClass( 'oo-ui-optionWidget' )
-               .append( this.$label );
-       this.$element
-               .prepend( this.$icon )
-               .append( this.$indicator );
-};
-
-/* Inheritance */
-
-OO.inheritClass( OO.ui.OptionWidget, OO.ui.Widget );
-
-OO.mixinClass( OO.ui.OptionWidget, OO.ui.ItemWidget );
-OO.mixinClass( OO.ui.OptionWidget, OO.ui.IconedElement );
-OO.mixinClass( OO.ui.OptionWidget, OO.ui.LabeledElement );
-OO.mixinClass( OO.ui.OptionWidget, OO.ui.IndicatedElement );
-OO.mixinClass( OO.ui.OptionWidget, OO.ui.FlaggableElement );
-
-/* Static Properties */
-
-OO.ui.OptionWidget.static.tagName = 'li';
-
-OO.ui.OptionWidget.static.selectable = true;
-
-OO.ui.OptionWidget.static.highlightable = true;
-
-OO.ui.OptionWidget.static.scrollIntoViewOnSelect = false;
-
-/* Methods */
-
-/**
- * Check if option can be selected.
- *
- * @method
- * @returns {boolean} Item is selectable
- */
-OO.ui.OptionWidget.prototype.isSelectable = function () {
-       return this.constructor.static.selectable && !this.disabled;
-};
-
-/**
- * Check if option can be highlighted.
- *
- * @method
- * @returns {boolean} Item is highlightable
- */
-OO.ui.OptionWidget.prototype.isHighlightable = function () {
-       return this.constructor.static.highlightable && !this.disabled;
-};
-
-/**
- * Check if option is selected.
- *
- * @method
- * @returns {boolean} Item is selected
- */
-OO.ui.OptionWidget.prototype.isSelected = function () {
-       return this.selected;
-};
-
-/**
- * Check if option is highlighted.
- *
- * @method
- * @returns {boolean} Item is highlighted
- */
-OO.ui.OptionWidget.prototype.isHighlighted = function () {
-       return this.highlighted;
-};
-
-/**
- * Set selected state.
- *
- * @method
- * @param {boolean} [state=false] Select option
- * @chainable
- */
-OO.ui.OptionWidget.prototype.setSelected = function ( state ) {
-       if ( !this.disabled && this.constructor.static.selectable ) {
-               this.selected = !!state;
-               if ( this.selected ) {
-                       this.$element.addClass( 'oo-ui-optionWidget-selected' );
-                       if ( this.constructor.static.scrollIntoViewOnSelect ) {
-                               this.scrollElementIntoView();
-                       }
-               } else {
-                       this.$element.removeClass( 'oo-ui-optionWidget-selected' );
-               }
-       }
-       return this;
-};
-
-/**
- * Set highlighted state.
- *
- * @method
- * @param {boolean} [state=false] Highlight option
- * @chainable
- */
-OO.ui.OptionWidget.prototype.setHighlighted = function ( state ) {
-       if ( !this.disabled && this.constructor.static.highlightable ) {
-               this.highlighted = !!state;
-               if ( this.highlighted ) {
-                       this.$element.addClass( 'oo-ui-optionWidget-highlighted' );
-               } else {
-                       this.$element.removeClass( 'oo-ui-optionWidget-highlighted' );
-               }
-       }
-       return this;
-};
-
-/**
- * Make the option's highlight flash.
- *
- * @method
- * @param {Function} [done] Callback to execute when flash effect is complete.
- */
-OO.ui.OptionWidget.prototype.flash = function ( done ) {
-       var $this = this.$element;
-
-       if ( !this.disabled && this.constructor.static.highlightable ) {
-               $this.removeClass( 'oo-ui-optionWidget-highlighted' );
-               setTimeout( OO.ui.bind( function () {
-                       $this.addClass( 'oo-ui-optionWidget-highlighted' );
-                       if ( done ) {
-                               setTimeout( done, 100 );
-                       }
-               }, this ), 100 );
-       }
-};
-
-/**
- * Get option data.
- *
- * @method
- * @returns {Mixed} Option data
- */
-OO.ui.OptionWidget.prototype.getData = function () {
-       return this.data;
-};
-/**
- * Create an OO.ui.SelectWidget object.
- *
- * @class
- * @abstract
- * @extends OO.ui.Widget
- * @mixins OO.ui.GroupElement
- *
- * @constructor
- * @param {Object} [config] Configuration options
- * @cfg {OO.ui.OptionWidget[]} [items] Options to add
- */
-OO.ui.SelectWidget = function OoUiSelectWidget( config ) {
-       // Config intialization
-       config = config || {};
-
-       // Parent constructor
-       OO.ui.SelectWidget.super.call( this, config );
-
-       // Mixin constructors
-       OO.ui.GroupWidget.call( this, this.$element, config );
-
-       // Properties
-       this.pressed = false;
-       this.selecting = null;
-       this.hashes = {};
-
-       // Events
-       this.$element.on( {
-               'mousedown': OO.ui.bind( this.onMouseDown, this ),
-               'mouseup': OO.ui.bind( this.onMouseUp, this ),
-               'mousemove': OO.ui.bind( this.onMouseMove, this ),
-               'mouseover': OO.ui.bind( this.onMouseOver, this ),
-               'mouseleave': OO.ui.bind( this.onMouseLeave, this )
-       } );
-
-       // Initialization
-       this.$element.addClass( 'oo-ui-selectWidget' );
-       if ( $.isArray( config.items ) ) {
-               this.addItems( config.items );
-       }
-};
-
-/* Inheritance */
-
-OO.inheritClass( OO.ui.SelectWidget, OO.ui.Widget );
-
-// Need to mixin base class as well
-OO.mixinClass( OO.ui.SelectWidget, OO.ui.GroupElement );
-
-OO.mixinClass( OO.ui.SelectWidget, OO.ui.GroupWidget );
-
-/* Events */
-
-/**
- * @event highlight
- * @param {OO.ui.OptionWidget|null} item Highlighted item
- */
-
-/**
- * @event select
- * @param {OO.ui.OptionWidget|null} item Selected item
- */
-
-/**
- * @event add
- * @param {OO.ui.OptionWidget[]} items Added items
- * @param {number} index Index items were added at
- */
-
-/**
- * @event remove
- * @param {OO.ui.OptionWidget[]} items Removed items
- */
-
-/* Static Properties */
-
-OO.ui.SelectWidget.static.tagName = 'ul';
-
-/* Methods */
-
-/**
- * Handle mouse down events.
- *
- * @method
- * @private
- * @param {jQuery.Event} e Mouse down event
- */
-OO.ui.SelectWidget.prototype.onMouseDown = function ( e ) {
-       var item;
-
-       if ( !this.disabled && e.which === 1 ) {
-               this.pressed = true;
-               item = this.getTargetItem( e );
-               if ( item && item.isSelectable() ) {
-                       this.intializeSelection( item );
-                       this.selecting = item;
-                       this.$( this.$.context ).one( 'mouseup', OO.ui.bind( this.onMouseUp, this ) );
-               }
-       }
-       return false;
-};
-
-/**
- * Handle mouse up events.
- *
- * @method
- * @private
- * @param {jQuery.Event} e Mouse up event
- */
-OO.ui.SelectWidget.prototype.onMouseUp = function ( e ) {
-       var item;
-       this.pressed = false;
-       if ( !this.selecting ) {
-               item = this.getTargetItem( e );
-               if ( item && item.isSelectable() ) {
-                       this.selecting = item;
-               }
-       }
-       if ( !this.disabled && e.which === 1 && this.selecting ) {
-               this.selectItem( this.selecting );
-               this.selecting = null;
-       }
-       return false;
-};
-
-/**
- * Handle mouse move events.
- *
- * @method
- * @private
- * @param {jQuery.Event} e Mouse move event
- */
-OO.ui.SelectWidget.prototype.onMouseMove = function ( e ) {
-       var item;
-
-       if ( !this.disabled && this.pressed ) {
-               item = this.getTargetItem( e );
-               if ( item && item !== this.selecting && item.isSelectable() ) {
-                       this.intializeSelection( item );
-                       this.selecting = item;
-               }
-       }
-       return false;
-};
-
-/**
- * Handle mouse over events.
- *
- * @method
- * @private
- * @param {jQuery.Event} e Mouse over event
- */
-OO.ui.SelectWidget.prototype.onMouseOver = function ( e ) {
-       var item;
-
-       if ( !this.disabled ) {
-               item = this.getTargetItem( e );
-               if ( item && item.isHighlightable() ) {
-                       this.highlightItem( item );
-               }
-       }
-       return false;
-};
-
-/**
- * Handle mouse leave events.
- *
- * @method
- * @private
- * @param {jQuery.Event} e Mouse over event
- */
-OO.ui.SelectWidget.prototype.onMouseLeave = function () {
-       if ( !this.disabled ) {
-               this.highlightItem();
-       }
-       return false;
-};
-
-/**
- * Get the closest item to a jQuery.Event.
- *
- * @method
- * @private
- * @param {jQuery.Event} e
- * @returns {OO.ui.OptionWidget|null} Outline item widget, `null` if none was found
- */
-OO.ui.SelectWidget.prototype.getTargetItem = function ( e ) {
-       var $item = this.$( e.target ).closest( '.oo-ui-optionWidget' );
-       if ( $item.length ) {
-               return $item.data( 'oo-ui-optionWidget' );
-       }
-       return null;
-};
-
-/**
- * Get selected item.
- *
- * @method
- * @returns {OO.ui.OptionWidget|null} Selected item, `null` if no item is selected
- */
-OO.ui.SelectWidget.prototype.getSelectedItem = function () {
-       var i, len;
-
-       for ( i = 0, len = this.items.length; i < len; i++ ) {
-               if ( this.items[i].isSelected() ) {
-                       return this.items[i];
-               }
-       }
-       return null;
-};
-
-/**
- * Get highlighted item.
- *
- * @method
- * @returns {OO.ui.OptionWidget|null} Highlighted item, `null` if no item is highlighted
- */
-OO.ui.SelectWidget.prototype.getHighlightedItem = function () {
-       var i, len;
-
-       for ( i = 0, len = this.items.length; i < len; i++ ) {
-               if ( this.items[i].isHighlighted() ) {
-                       return this.items[i];
-               }
-       }
-       return null;
-};
-
-/**
- * Get an existing item with equivilant data.
- *
- * @method
- * @param {Object} data Item data to search for
- * @returns {OO.ui.OptionWidget|null} Item with equivilent value, `null` if none exists
- */
-OO.ui.SelectWidget.prototype.getItemFromData = function ( data ) {
-       var hash = OO.getHash( data );
-
-       if ( hash in this.hashes ) {
-               return this.hashes[hash];
-       }
-
-       return null;
-};
-
-/**
- * Highlight an item.
- *
- * Highlighting is mutually exclusive.
- *
- * @method
- * @param {OO.ui.OptionWidget} [item] Item to highlight, omit to deselect all
- * @fires highlight
- * @chainable
- */
-OO.ui.SelectWidget.prototype.highlightItem = function ( item ) {
-       var i, len;
-
-       for ( i = 0, len = this.items.length; i < len; i++ ) {
-               this.items[i].setHighlighted( this.items[i] === item );
-       }
-       this.emit( 'highlight', item );
-
-       return this;
-};
-
-/**
- * Select an item.
- *
- * @method
- * @param {OO.ui.OptionWidget} [item] Item to select, omit to deselect all
- * @fires select
- * @chainable
- */
-OO.ui.SelectWidget.prototype.selectItem = function ( item ) {
-       var i, len;
-
-       for ( i = 0, len = this.items.length; i < len; i++ ) {
-               this.items[i].setSelected( this.items[i] === item );
-       }
-       this.emit( 'select', item );
-
-       return this;
-};
-
-/**
- * Setup selection and highlighting.
- *
- * This should be used to synchronize the UI with the model without emitting events that would in
- * turn update the model.
- *
- * @param {OO.ui.OptionWidget} [item] Item to select
- * @chainable
- */
-OO.ui.SelectWidget.prototype.intializeSelection = function( item ) {
-       var i, len, selected;
-
-       for ( i = 0, len = this.items.length; i < len; i++ ) {
-               selected = this.items[i] === item;
-               this.items[i].setSelected( selected );
-               this.items[i].setHighlighted( selected );
-       }
-
-       return this;
-};
-
-/**
- * Get an item relative to another one.
- *
- * @method
- * @param {OO.ui.OptionWidget} item Item to start at
- * @param {number} direction Direction to move in
- * @returns {OO.ui.OptionWidget|null} Item at position, `null` if there are no items in the menu
- */
-OO.ui.SelectWidget.prototype.getRelativeSelectableItem = function ( item, direction ) {
-       var inc = direction > 0 ? 1 : -1,
-               len = this.items.length,
-               index = item instanceof OO.ui.OptionWidget ?
-                       $.inArray( item, this.items ) : ( inc > 0 ? -1 : 0 ),
-               stopAt = Math.max( Math.min( index, len - 1 ), 0 ),
-               i = inc > 0 ?
-                       // Default to 0 instead of -1, if nothing is selected let's start at the beginning
-                       Math.max( index, -1 ) :
-                       // Default to n-1 instead of -1, if nothing is selected let's start at the end
-                       Math.min( index, len );
-
-       while ( true ) {
-               i = ( i + inc + len ) % len;
-               item = this.items[i];
-               if ( item instanceof OO.ui.OptionWidget && item.isSelectable() ) {
-                       return item;
-               }
-               // Stop iterating when we've looped all the way around
-               if ( i === stopAt ) {
-                       break;
-               }
-       }
-       return null;
-};
-
-/**
- * Get the next selectable item.
- *
- * @method
- * @returns {OO.ui.OptionWidget|null} Item, `null` if ther aren't any selectable items
- */
-OO.ui.SelectWidget.prototype.getFirstSelectableItem = function () {
-       var i, len, item;
-
-       for ( i = 0, len = this.items.length; i < len; i++ ) {
-               item = this.items[i];
-               if ( item instanceof OO.ui.OptionWidget && item.isSelectable() ) {
-                       return item;
-               }
-       }
-
-       return null;
-};
-
-/**
- * Add items.
- *
- * When items are added with the same values as existing items, the existing items will be
- * automatically removed before the new items are added.
- *
- * @method
- * @param {OO.ui.OptionWidget[]} items Items to add
- * @param {number} [index] Index to insert items after
- * @fires add
- * @chainable
- */
-OO.ui.SelectWidget.prototype.addItems = function ( items, index ) {
-       var i, len, item, hash,
-               remove = [];
-
-       for ( i = 0, len = items.length; i < len; i++ ) {
-               item = items[i];
-               hash = OO.getHash( item.getData() );
-               if ( hash in this.hashes ) {
-                       // Remove item with same value
-                       remove.push( this.hashes[hash] );
-               }
-               this.hashes[hash] = item;
-       }
-       if ( remove.length ) {
-               this.removeItems( remove );
-       }
-
-       OO.ui.GroupElement.prototype.addItems.call( this, items, index );
-
-       // Always provide an index, even if it was omitted
-       this.emit( 'add', items, index === undefined ? this.items.length - items.length - 1 : index );
-
-       return this;
-};
-
-/**
- * Remove items.
- *
- * Items will be detached, not removed, so they can be used later.
- *
- * @method
- * @param {OO.ui.OptionWidget[]} items Items to remove
- * @fires remove
- * @chainable
- */
-OO.ui.SelectWidget.prototype.removeItems = function ( items ) {
-       var i, len, item, hash;
-
-       for ( i = 0, len = items.length; i < len; i++ ) {
-               item = items[i];
-               hash = OO.getHash( item.getData() );
-               if ( hash in this.hashes ) {
-                       // Remove existing item
-                       delete this.hashes[hash];
-               }
-               if ( item.isSelected() ) {
-                       this.selectItem( null );
-               }
-       }
-       OO.ui.GroupElement.prototype.removeItems.call( this, items );
-
-       this.emit( 'remove', items );
-
-       return this;
-};
-
-/**
- * Clear all items.
- *
- * Items will be detached, not removed, so they can be used later.
- *
- * @method
- * @fires remove
- * @chainable
- */
-OO.ui.SelectWidget.prototype.clearItems = function () {
-       var items = this.items.slice();
-
-       // Clear all items
-       this.hashes = {};
-       OO.ui.GroupElement.prototype.clearItems.call( this );
-       this.selectItem( null );
-
-       this.emit( 'remove', items );
-
-       return this;
-};
-/**
- * Creates an OO.ui.MenuItemWidget object.
- *
- * @class
- * @extends OO.ui.OptionWidget
- *
- * @constructor
- * @param {Mixed} data Item data
- * @param {Object} [config] Configuration options
- */
-OO.ui.MenuItemWidget = function OoUiMenuItemWidget( data, config ) {
-       // Configuration initialization
-       config = $.extend( { 'icon': 'check' }, config );
-
-       // Parent constructor
-       OO.ui.MenuItemWidget.super.call( this, data, config );
-
-       // Initialization
-       this.$element.addClass( 'oo-ui-menuItemWidget' );
-};
-
-/* Inheritance */
-
-OO.inheritClass( OO.ui.MenuItemWidget, OO.ui.OptionWidget );
-/**
- * Create an OO.ui.MenuWidget object.
- *
- * @class
- * @extends OO.ui.SelectWidget
- * @mixins OO.ui.ClippableElement
- *
- * @constructor
- * @param {Object} [config] Configuration options
- * @cfg {OO.ui.InputWidget} [input] Input to bind keyboard handlers to
- */
-OO.ui.MenuWidget = function OoUiMenuWidget( config ) {
-       // Config intialization
-       config = config || {};
-
-       // Parent constructor
-       OO.ui.MenuWidget.super.call( this, config );
-
-       // Mixin constructors
-       OO.ui.ClippableElement.call( this, this.$group, config );
-
-       // Properties
-       this.newItems = null;
-       this.$input = config.input ? config.input.$input : null;
-       this.$previousFocus = null;
-       this.isolated = !config.input;
-       this.visible = false;
-       this.onKeyDownHandler = OO.ui.bind( this.onKeyDown, this );
-
-       // Initialization
-       this.$element.hide().addClass( 'oo-ui-menuWidget' );
-};
-
-/* Inheritance */
-
-OO.inheritClass( OO.ui.MenuWidget, OO.ui.SelectWidget );
-
-OO.mixinClass( OO.ui.MenuWidget, OO.ui.ClippableElement );
-
-/* Methods */
-
-/**
- * Handles key down events.
- *
- * @method
- * @param {jQuery.Event} e Key down event
- */
-OO.ui.MenuWidget.prototype.onKeyDown = function ( e ) {
-       var nextItem,
-               handled = false,
-               highlightItem = this.getHighlightedItem();
-
-       if ( !this.disabled && this.visible ) {
-               if ( !highlightItem ) {
-                       highlightItem = this.getSelectedItem();
-               }
-               switch ( e.keyCode ) {
-                       case OO.ui.Keys.ENTER:
-                               this.selectItem( highlightItem );
-                               handled = true;
-                               break;
-                       case OO.ui.Keys.UP:
-                               nextItem = this.getRelativeSelectableItem( highlightItem, -1 );
-                               handled = true;
-                               break;
-                       case OO.ui.Keys.DOWN:
-                               nextItem = this.getRelativeSelectableItem( highlightItem, 1 );
-                               handled = true;
-                               break;
-                       case OO.ui.Keys.ESCAPE:
-                               if ( highlightItem ) {
-                                       highlightItem.setHighlighted( false );
-                               }
-                               this.hide();
-                               handled = true;
-                               break;
-               }
-
-               if ( nextItem ) {
-                       this.highlightItem( nextItem );
-                       nextItem.scrollElementIntoView();
-               }
-
-               if ( handled ) {
-                       e.preventDefault();
-                       e.stopPropagation();
-                       return false;
-               }
-       }
-};
-
-/**
- * Check if the menu is visible.
- *
- * @method
- * @returns {boolean} Menu is visible
- */
-OO.ui.MenuWidget.prototype.isVisible = function () {
-       return this.visible;
-};
-
-/**
- * Bind key down listener
- *
- * @method
- */
-OO.ui.MenuWidget.prototype.bindKeyDownListener = function () {
-       if ( this.$input ) {
-               this.$input.on( 'keydown', this.onKeyDownHandler );
-       } else {
-               // Capture menu navigation keys
-               this.getElementWindow().addEventListener( 'keydown', this.onKeyDownHandler, true );
-       }
-};
-
-/**
- * Unbind key down listener
- *
- * @method
- */
-OO.ui.MenuWidget.prototype.unbindKeyDownListener = function () {
-       if ( this.$input ) {
-               this.$input.off( 'keydown' );
-       } else {
-               this.getElementWindow().removeEventListener( 'keydown', this.onKeyDownHandler, true );
-       }
-};
-
-/**
- * Select an item.
- *
- * The menu will stay open if an item is silently selected.
- *
- * @method
- * @param {OO.ui.OptionWidget} [item] Item to select, omit to deselect all
- * @chainable
- */
-OO.ui.MenuWidget.prototype.selectItem = function ( item ) {
-       // Parent method
-       OO.ui.SelectWidget.prototype.selectItem.call( this, item );
-
-       if ( !this.disabled ) {
-               if ( item ) {
-                       this.disabled = true;
-                       item.flash( OO.ui.bind( function () {
-                               this.hide();
-                               this.disabled = false;
-                       }, this ) );
-               } else {
-                       this.hide();
-               }
-       }
-
-       return this;
-};
-
-/**
- * Add items.
- *
- * Adding an existing item (by value) will move it.
- *
- * @method
- * @param {OO.ui.MenuItemWidget[]} items Items to add
- * @param {number} [index] Index to insert items after
- * @chainable
- */
-OO.ui.MenuWidget.prototype.addItems = function ( items, index ) {
-       var i, len, item;
-
-       // Parent method
-       OO.ui.SelectWidget.prototype.addItems.call( this, items, index );
-
-       // Auto-initialize
-       if ( !this.newItems ) {
-               this.newItems = [];
-       }
-
-       for ( i = 0, len = items.length; i < len; i++ ) {
-               item = items[i];
-               if ( this.visible ) {
-                       // Defer fitting label until
-                       item.fitLabel();
-               } else {
-                       this.newItems.push( item );
-               }
-       }
-
-       return this;
-};
-
-/**
- * Show the menu.
- *
- * @method
- * @chainable
- */
-OO.ui.MenuWidget.prototype.show = function () {
-       var i, len;
-
-       if ( this.items.length ) {
-               this.$element.show();
-               this.visible = true;
-               this.bindKeyDownListener();
-
-               // Change focus to enable keyboard navigation
-               if ( this.isolated && this.$input && !this.$input.is( ':focus' ) ) {
-                       this.$previousFocus = this.$( ':focus' );
-                       this.$input.focus();
-               }
-               if ( this.newItems && this.newItems.length ) {
-                       for ( i = 0, len = this.newItems.length; i < len; i++ ) {
-                               this.newItems[i].fitLabel();
-                       }
-                       this.newItems = null;
-               }
-
-               this.setClipping( true );
-       }
-
-       return this;
-};
-
-/**
- * Hide the menu.
- *
- * @method
- * @chainable
- */
-OO.ui.MenuWidget.prototype.hide = function () {
-       this.$element.hide();
-       this.visible = false;
-       this.unbindKeyDownListener();
-
-       if ( this.isolated && this.$previousFocus ) {
-               this.$previousFocus.focus();
-               this.$previousFocus = null;
-       }
-
-       this.setClipping( false );
-
-       return this;
-};
-/**
- * Inline menu of options.
- *
- * @class
- * @extends OO.ui.Widget
- * @mixins OO.ui.IconedElement
- * @mixins OO.ui.IndicatedElement
- * @mixins OO.ui.LabeledElement
- * @mixins OO.ui.TitledElement
- *
- * @constructor
- * @param {Object} [config] Configuration options
- * @cfg {Object} [menu] Configuration options to pass to menu widget
- */
-OO.ui.InlineMenuWidget = function OoUiInlineMenuWidget( config ) {
-       // Configuration initialization
-       config = $.extend( { 'indicator': 'down' }, config );
-
-       // Parent constructor
-       OO.ui.InlineMenuWidget.super.call( this, config );
-
-       // Mixin constructors
-       OO.ui.IconedElement.call( this, this.$( '<span>' ), config );
-       OO.ui.IndicatedElement.call( this, this.$( '<span>' ), config );
-       OO.ui.LabeledElement.call( this, this.$( '<span>' ), config );
-       OO.ui.TitledElement.call( this, this.$label, config );
-
-       // Properties
-       this.menu = new OO.ui.MenuWidget( $.extend( { '$': this.$ }, config.menu ) );
-       this.$handle = this.$( '<span>' );
-
-       // Events
-       this.$element.on( { 'click': OO.ui.bind( this.onClick, this ) } );
-       this.menu.connect( this, { 'select': 'onMenuSelect' } );
-
-       // Initialization
-       this.$handle
-               .addClass( 'oo-ui-inlineMenuWidget-handle' )
-               .append( this.$icon, this.$label, this.$indicator );
-       this.$element
-               .addClass( 'oo-ui-inlineMenuWidget' )
-               .append( this.$handle, this.menu.$element );
-};
-
-/* Inheritance */
-
-OO.inheritClass( OO.ui.InlineMenuWidget, OO.ui.Widget );
-
-OO.mixinClass( OO.ui.InlineMenuWidget, OO.ui.IconedElement );
-OO.mixinClass( OO.ui.InlineMenuWidget, OO.ui.IndicatedElement );
-OO.mixinClass( OO.ui.InlineMenuWidget, OO.ui.LabeledElement );
-OO.mixinClass( OO.ui.InlineMenuWidget, OO.ui.TitledElement );
-
-/* Methods */
-
-/**
- * Get the menu.
- *
- * @return {OO.ui.MenuWidget} Menu of widget
- */
-OO.ui.InlineMenuWidget.prototype.getMenu = function () {
-       return this.menu;
-};
-
-/**
- * Handles menu select events.
- *
- * @method
- * @param {OO.ui.MenuItemWidget} item Selected menu item
- */
-OO.ui.InlineMenuWidget.prototype.onMenuSelect = function ( item ) {
-       var selectedLabel = item.getLabel();
-
-       // If the label is a DOM element, clone it, because setLabel will append() it
-       if ( selectedLabel instanceof jQuery ) {
-               selectedLabel = selectedLabel.clone();
-       }
-
-       this.setLabel( selectedLabel );
-};
-
-/**
- * Handles mouse click events.
- *
- * @method
- * @param {jQuery.Event} e Mouse click event
- */
-OO.ui.InlineMenuWidget.prototype.onClick = function ( e ) {
-       // Skip clicks within the menu
-       if ( $.contains( this.menu.$element[0], e.target ) ) {
-               return;
-       }
-
-       if ( !this.disabled ) {
-               if ( this.menu.isVisible() ) {
-                       this.menu.hide();
-               } else {
-                       this.menu.show();
-               }
-       }
-       return false;
-};
-/**
- * Creates an OO.ui.MenuSectionItemWidget object.
- *
- * @class
- * @extends OO.ui.OptionWidget
- *
- * @constructor
- * @param {Mixed} data Item data
- * @param {Object} [config] Configuration options
- */
-OO.ui.MenuSectionItemWidget = function OoUiMenuSectionItemWidget( data, config ) {
-       // Parent constructor
-       OO.ui.MenuSectionItemWidget.super.call( this, data, config );
-
-       // Initialization
-       this.$element.addClass( 'oo-ui-menuSectionItemWidget' );
-};
-
-/* Inheritance */
-
-OO.inheritClass( OO.ui.MenuSectionItemWidget, OO.ui.OptionWidget );
-
-OO.ui.MenuSectionItemWidget.static.selectable = false;
-
-OO.ui.MenuSectionItemWidget.static.highlightable = false;
-/**
- * Create an OO.ui.OutlineWidget object.
- *
- * @class
- * @extends OO.ui.SelectWidget
- *
- * @constructor
- * @param {Object} [config] Configuration options
- */
-OO.ui.OutlineWidget = function OoUiOutlineWidget( config ) {
-       // Config intialization
-       config = config || {};
-
-       // Parent constructor
-       OO.ui.OutlineWidget.super.call( this, config );
-
-       // Initialization
-       this.$element.addClass( 'oo-ui-outlineWidget' );
-};
-
-/* Inheritance */
-
-OO.inheritClass( OO.ui.OutlineWidget, OO.ui.SelectWidget );
-/**
- * Creates an OO.ui.OutlineControlsWidget object.
- *
- * @class
- *
- * @constructor
- * @param {OO.ui.OutlineWidget} outline Outline to control
- * @param {Object} [config] Configuration options
- */
-OO.ui.OutlineControlsWidget = function OoUiOutlineControlsWidget( outline, config ) {
-       // Configuration initialization
-       config = $.extend( { 'icon': 'add-item' }, config );
-
-       // Parent constructor
-       OO.ui.OutlineControlsWidget.super.call( this, config );
-
-       // Mixin constructors
-       OO.ui.GroupElement.call( this, this.$( '<div>' ), config );
-       OO.ui.IconedElement.call( this, this.$( '<div>' ), config );
-
-       // Properties
-       this.outline = outline;
-       this.$movers = this.$( '<div>' );
-       this.upButton = new OO.ui.ButtonWidget( {
-               '$': this.$,
-               'frameless': true,
-               'icon': 'collapse',
-               'title': OO.ui.msg( 'ooui-outline-control-move-up' )
-       } );
-       this.downButton = new OO.ui.ButtonWidget( {
-               '$': this.$,
-               'frameless': true,
-               'icon': 'expand',
-               'title': OO.ui.msg( 'ooui-outline-control-move-down' )
-       } );
-       this.removeButton = new OO.ui.ButtonWidget( {
-               '$': this.$,
-               'frameless': true,
-               'icon': 'remove',
-               'title': OO.ui.msg( 'ooui-outline-control-remove' )
-       } );
-
-       // Events
-       outline.connect( this, {
-               'select': 'onOutlineChange',
-               'add': 'onOutlineChange',
-               'remove': 'onOutlineChange'
-       } );
-       this.upButton.connect( this, { 'click': ['emit', 'move', -1] } );
-       this.downButton.connect( this, { 'click': ['emit', 'move', 1] } );
-       this.removeButton.connect( this, { 'click': ['emit', 'remove'] } );
-
-       // Initialization
-       this.$element.addClass( 'oo-ui-outlineControlsWidget' );
-       this.$group.addClass( 'oo-ui-outlineControlsWidget-adders' );
-       this.$movers
-               .addClass( 'oo-ui-outlineControlsWidget-movers' )
-               .append( this.removeButton.$element, this.upButton.$element, this.downButton.$element );
-       this.$element.append( this.$icon, this.$group, this.$movers );
-};
-
-/* Inheritance */
-
-OO.inheritClass( OO.ui.OutlineControlsWidget, OO.ui.Widget );
-
-OO.mixinClass( OO.ui.OutlineControlsWidget, OO.ui.GroupElement );
-OO.mixinClass( OO.ui.OutlineControlsWidget, OO.ui.IconedElement );
-
-/* Events */
-
-/**
- * @event move
- * @param {number} places Number of places to move
- */
-
-/**
- * @event remove
- */
-
-/* Methods */
-
-/**
- * Handle outline change events.
- *
- * @method
- */
-OO.ui.OutlineControlsWidget.prototype.onOutlineChange = function () {
-       var i, len, firstMovable, lastMovable,
-               items = this.outline.getItems(),
-               selectedItem = this.outline.getSelectedItem(),
-               movable = selectedItem && selectedItem.isMovable(),
-               removable = selectedItem && selectedItem.isRemovable();
-
-       if ( movable ) {
-               i = -1;
-               len = items.length;
-               while ( ++i < len ) {
-                       if ( items[i].isMovable() ) {
-                               firstMovable = items[i];
-                               break;
-                       }
-               }
-               i = len;
-               while ( i-- ) {
-                       if ( items[i].isMovable() ) {
-                               lastMovable = items[i];
-                               break;
-                       }
-               }
-       }
-       this.upButton.setDisabled( !movable || selectedItem === firstMovable );
-       this.downButton.setDisabled( !movable || selectedItem === lastMovable );
-       this.removeButton.setDisabled( !removable );
-};
-/**
- * Creates an OO.ui.OutlineItemWidget object.
- *
- * @class
- * @extends OO.ui.OptionWidget
- *
- * @constructor
- * @param {Mixed} data Item data
- * @param {Object} [config] Configuration options
- * @cfg {number} [level] Indentation level
- * @cfg {boolean} [movable] Allow modification from outline controls
- */
-OO.ui.OutlineItemWidget = function OoUiOutlineItemWidget( data, config ) {
-       // Config intialization
-       config = config || {};
-
-       // Parent constructor
-       OO.ui.OutlineItemWidget.super.call( this, data, config );
-
-       // Properties
-       this.level = 0;
-       this.movable = !!config.movable;
-       this.removable = !!config.removable;
-
-       // Initialization
-       this.$element.addClass( 'oo-ui-outlineItemWidget' );
-       this.setLevel( config.level );
-};
-
-/* Inheritance */
-
-OO.inheritClass( OO.ui.OutlineItemWidget, OO.ui.OptionWidget );
-
-/* Static Properties */
-
-OO.ui.OutlineItemWidget.static.highlightable = false;
-
-OO.ui.OutlineItemWidget.static.scrollIntoViewOnSelect = true;
-
-OO.ui.OutlineItemWidget.static.levelClass = 'oo-ui-outlineItemWidget-level-';
-
-OO.ui.OutlineItemWidget.static.levels = 3;
-
-/* Methods */
-
-/**
- * Check if item is movable.
- *
- * Movablilty is used by outline controls.
- *
- * @returns {boolean} Item is movable
- */
-OO.ui.OutlineItemWidget.prototype.isMovable = function () {
-       return this.movable;
-};
-
-/**
- * Check if item is removable.
- *
- * Removablilty is used by outline controls.
- *
- * @returns {boolean} Item is removable
- */
-OO.ui.OutlineItemWidget.prototype.isRemovable = function () {
-       return this.removable;
-};
-
-/**
- * Get indentation level.
- *
- * @returns {number} Indentation level
- */
-OO.ui.OutlineItemWidget.prototype.getLevel = function () {
-       return this.level;
-};
-
-/**
- * Set movability.
- *
- * Movablilty is used by outline controls.
- *
- * @param {boolean} movable Item is movable
- * @chainable
- */
-OO.ui.OutlineItemWidget.prototype.setMovable = function ( movable ) {
-       this.movable = !!movable;
-       return this;
-};
-
-/**
- * Set removability.
- *
- * Removablilty is used by outline controls.
- *
- * @param {boolean} movable Item is removable
- * @chainable
- */
-OO.ui.OutlineItemWidget.prototype.setRemovable = function ( removable ) {
-       this.removable = !!removable;
-       return this;
-};
-
-/**
- * Set indentation level.
- *
- * @method
- * @param {number} [level=0] Indentation level, in the range of [0,#maxLevel]
- * @chainable
- */
-OO.ui.OutlineItemWidget.prototype.setLevel = function ( level ) {
-       var levels = this.constructor.static.levels,
-               levelClass = this.constructor.static.levelClass,
-               i = levels;
-
-       this.level = level ? Math.max( 0, Math.min( levels - 1, level ) ) : 0;
-       while ( i-- ) {
-               if ( this.level === i ) {
-                       this.$element.addClass( levelClass + i );
-               } else {
-                       this.$element.removeClass( levelClass + i );
-               }
-       }
-
-       return this;
-};
-/**
- * Create an OO.ui.ButtonOptionWidget object.
- *
- * @class
- * @extends OO.ui.OptionWidget
- * @mixins OO.ui.ButtonedElement
- * @mixins OO.ui.FlaggableElement
- *
- * @constructor
- * @param {Mixed} data Option data
- * @param {Object} [config] Configuration options
- */
-OO.ui.ButtonOptionWidget = function OoUiButtonOptionWidget( data, config ) {
-       // Parent constructor
-       OO.ui.ButtonOptionWidget.super.call( this, data, config );
-
-       // Mixin constructors
-       OO.ui.ButtonedElement.call( this, this.$( '<a>' ), config );
-       OO.ui.FlaggableElement.call( this, config );
-
-       // Initialization
-       this.$element.addClass( 'oo-ui-buttonOptionWidget' );
-       this.$button.append( this.$element.contents() );
-       this.$element.append( this.$button );
-};
-
-/* Inheritance */
-
-OO.inheritClass( OO.ui.ButtonOptionWidget, OO.ui.OptionWidget );
-
-OO.mixinClass( OO.ui.ButtonOptionWidget, OO.ui.ButtonedElement );
-OO.mixinClass( OO.ui.ButtonOptionWidget, OO.ui.FlaggableElement );
-
-/* Methods */
-
-/**
- * @inheritdoc
- */
-OO.ui.ButtonOptionWidget.prototype.setSelected = function ( state ) {
-       OO.ui.OptionWidget.prototype.setSelected.call( this, state );
-
-       this.setActive( state );
-
-       return this;
-};
-/**
- * Create an OO.ui.ButtonSelect object.
- *
- * @class
- * @extends OO.ui.SelectWidget
- *
- * @constructor
- * @param {Object} [config] Configuration options
- */
-OO.ui.ButtonSelectWidget = function OoUiButtonSelectWidget( config ) {
-       // Parent constructor
-       OO.ui.ButtonSelectWidget.super.call( this, config );
-
-       // Initialization
-       this.$element.addClass( 'oo-ui-buttonSelectWidget' );
-};
-
-/* Inheritance */
-
-OO.inheritClass( OO.ui.ButtonSelectWidget, OO.ui.SelectWidget );
-/**
- * Creates an OO.ui.PopupWidget object.
- *
- * @class
- * @extends OO.ui.Widget
- * @mixins OO.ui.LabeledElement
- *
- * @constructor
- * @param {Object} [config] Configuration options
- * @cfg {boolean} [tail=true] Show tail pointing to origin of popup
- * @cfg {string} [align='center'] Alignment of popup to origin
- * @cfg {jQuery} [$container] Container to prevent popup from rendering outside of
- * @cfg {boolean} [autoClose=false] Popup auto-closes when it loses focus
- * @cfg {jQuery} [$autoCloseIgnore] Elements to not auto close when clicked
- * @cfg {boolean} [head] Show label and close button at the top
- */
-OO.ui.PopupWidget = function OoUiPopupWidget( config ) {
-       // Config intialization
-       config = config || {};
-
-       // Parent constructor
-       OO.ui.PopupWidget.super.call( this, config );
-
-       // Mixin constructors
-       OO.ui.LabeledElement.call( this, this.$( '<div>' ), config );
-       OO.ui.ClippableElement.call( this, this.$( '<div>' ), config );
-
-       // Properties
-       this.visible = false;
-       this.$popup = this.$( '<div>' );
-       this.$head = this.$( '<div>' );
-       this.$body = this.$clippable;
-       this.$tail = this.$( '<div>' );
-       this.$container = config.$container || this.$( 'body' );
-       this.autoClose = !!config.autoClose;
-       this.$autoCloseIgnore = config.$autoCloseIgnore;
-       this.transitionTimeout = null;
-       this.tail = false;
-       this.align = config.align || 'center';
-       this.closeButton = new OO.ui.ButtonWidget( { '$': this.$, 'frameless': true, 'icon': 'close' } );
-       this.onMouseDownHandler = OO.ui.bind( this.onMouseDown, this );
-
-       // Events
-       this.closeButton.connect( this, { 'click': 'onCloseButtonClick' } );
-
-       // Initialization
-       this.useTail( config.tail !== undefined ? !!config.tail : true );
-       this.$body.addClass( 'oo-ui-popupWidget-body' );
-       this.$tail.addClass( 'oo-ui-popupWidget-tail' );
-       this.$head
-               .addClass( 'oo-ui-popupWidget-head' )
-               .append( this.$label, this.closeButton.$element );
-       if ( !config.head ) {
-               this.$head.hide();
-       }
-       this.$popup
-               .addClass( 'oo-ui-popupWidget-popup' )
-               .append( this.$head, this.$body );
-       this.$element.hide()
-               .addClass( 'oo-ui-popupWidget' )
-               .append( this.$popup, this.$tail );
-};
-
-/* Inheritance */
-
-OO.inheritClass( OO.ui.PopupWidget, OO.ui.Widget );
-
-OO.mixinClass( OO.ui.PopupWidget, OO.ui.LabeledElement );
-
-OO.mixinClass( OO.ui.PopupWidget, OO.ui.ClippableElement );
-
-/* Events */
-
-/**
- * @event hide
- */
-
-/**
- * @event show
- */
-
-/* Methods */
-
-/**
- * Handles mouse down events.
- *
- * @method
- * @param {jQuery.Event} e Mouse down event
- */
-OO.ui.PopupWidget.prototype.onMouseDown = function ( e ) {
-       if (
-               this.visible &&
-               !$.contains( this.$element[0], e.target ) &&
-               ( !this.$autoCloseIgnore || !this.$autoCloseIgnore.has( e.target ).length )
-       ) {
-               this.hide();
-       }
-};
-
-/**
- * Bind mouse down listener
- *
- * @method
- */
-OO.ui.PopupWidget.prototype.bindMouseDownListener = function () {
-       // Capture clicks outside popup
-       this.getElementWindow().addEventListener( 'mousedown', this.onMouseDownHandler, true );
-};
-
-/**
- * Handles close button click events.
- *
- * @method
- */
-OO.ui.PopupWidget.prototype.onCloseButtonClick = function () {
-       if ( this.visible ) {
-               this.hide();
-       }
-};
-
-/**
- * Unbind mouse down listener
- *
- * @method
- */
-OO.ui.PopupWidget.prototype.unbindMouseDownListener = function () {
-       this.getElementWindow().removeEventListener( 'mousedown', this.onMouseDownHandler, true );
-};
-
-/**
- * Check if the popup is visible.
- *
- * @method
- * @returns {boolean} Popup is visible
- */
-OO.ui.PopupWidget.prototype.isVisible = function () {
-       return this.visible;
-};
-
-/**
- * Set whether to show a tail.
- *
- * @method
- * @returns {boolean} Make tail visible
- */
-OO.ui.PopupWidget.prototype.useTail = function ( value ) {
-       value = !!value;
-       if ( this.tail !== value ) {
-               this.tail = value;
-               if ( value ) {
-                       this.$element.addClass( 'oo-ui-popupWidget-tailed' );
-               } else {
-                       this.$element.removeClass( 'oo-ui-popupWidget-tailed' );
-               }
-       }
-};
-
-/**
- * Check if showing a tail.
- *
- * @method
- * @returns {boolean} tail is visible
- */
-OO.ui.PopupWidget.prototype.hasTail = function () {
-       return this.tail;
-};
-
-/**
- * Show the context.
- *
- * @method
- * @fires show
- * @chainable
- */
-OO.ui.PopupWidget.prototype.show = function () {
-       if ( !this.visible ) {
-               this.setClipping( true );
-               this.$element.show();
-               this.visible = true;
-               this.emit( 'show' );
-               if ( this.autoClose ) {
-                       this.bindMouseDownListener();
-               }
-       }
-       return this;
-};
-
-/**
- * Hide the context.
- *
- * @method
- * @fires hide
- * @chainable
- */
-OO.ui.PopupWidget.prototype.hide = function () {
-       if ( this.visible ) {
-               this.setClipping( false );
-               this.$element.hide();
-               this.visible = false;
-               this.emit( 'hide' );
-               if ( this.autoClose ) {
-                       this.unbindMouseDownListener();
-               }
-       }
-       return this;
-};
-
-/**
- * Updates the position and size.
- *
- * @method
- * @param {number} width Width
- * @param {number} height Height
- * @param {boolean} [transition=false] Use a smooth transition
- * @chainable
- */
-OO.ui.PopupWidget.prototype.display = function ( width, height, transition ) {
-       var padding = 10,
-               originOffset = Math.round( this.$element.offset().left ),
-               containerLeft = Math.round( this.$container.offset().left ),
-               containerWidth = this.$container.innerWidth(),
-               containerRight = containerLeft + containerWidth,
-               popupOffset = width * ( { 'left': 0, 'center': -0.5, 'right': -1 } )[this.align],
-               popupLeft = popupOffset - padding,
-               popupRight = popupOffset + padding + width + padding,
-               overlapLeft = ( originOffset + popupLeft ) - containerLeft,
-               overlapRight = containerRight - ( originOffset + popupRight );
-
-       // Prevent transition from being interrupted
-       clearTimeout( this.transitionTimeout );
-       if ( transition ) {
-               // Enable transition
-               this.$element.addClass( 'oo-ui-popupWidget-transitioning' );
-       }
-
-       if ( overlapRight < 0 ) {
-               popupOffset += overlapRight;
-       } else if ( overlapLeft < 0 ) {
-               popupOffset -= overlapLeft;
-       }
-
-       // Position body relative to anchor and resize
-       this.$popup.css( {
-               'left': popupOffset,
-               'width': width,
-               'height': height === undefined ? 'auto' : height
-       } );
-
-       if ( transition ) {
-               // Prevent transitioning after transition is complete
-               this.transitionTimeout = setTimeout( OO.ui.bind( function () {
-                       this.$element.removeClass( 'oo-ui-popupWidget-transitioning' );
-               }, this ), 200 );
-       } else {
-               // Prevent transitioning immediately
-               this.$element.removeClass( 'oo-ui-popupWidget-transitioning' );
-       }
-
-       return this;
-};
-/**
- * Button that shows and hides a popup.
- *
- * @class
- * @extends OO.ui.ButtonWidget
- * @mixins OO.ui.PopuppableElement
- *
- * @constructor
- * @param {Object} [config] Configuration options
- */
-OO.ui.PopupButtonWidget = function OoUiPopupButtonWidget( config ) {
-       // Parent constructor
-       OO.ui.PopupButtonWidget.super.call( this, config );
-
-       // Mixin constructors
-       OO.ui.PopuppableElement.call( this, config );
-
-       // Initialization
-       this.$element
-               .addClass( 'oo-ui-popupButtonWidget' )
-               .append( this.popup.$element );
-};
-
-/* Inheritance */
-
-OO.inheritClass( OO.ui.PopupButtonWidget, OO.ui.ButtonWidget );
-
-OO.mixinClass( OO.ui.PopupButtonWidget, OO.ui.PopuppableElement );
-
-/* Methods */
-
-/**
- * Handles mouse click events.
- *
- * @method
- * @param {jQuery.Event} e Mouse click event
- */
-OO.ui.PopupButtonWidget.prototype.onClick = function ( e ) {
-       // Skip clicks within the popup
-       if ( $.contains( this.popup.$element[0], e.target ) ) {
-               return;
-       }
-
-       if ( !this.disabled ) {
-               if ( this.popup.isVisible() ) {
-                       this.hidePopup();
-               } else {
-                       this.showPopup();
-               }
-               OO.ui.ButtonWidget.prototype.onClick.call( this );
-       }
-       return false;
-};
-/**
- * Creates an OO.ui.SearchWidget object.
- *
- * @class
- * @extends OO.ui.Widget
- *
- * @constructor
- * @param {Object} [config] Configuration options
- * @cfg {string|jQuery} [placeholder] Placeholder text for query input
- * @cfg {string} [value] Initial query value
- */
-OO.ui.SearchWidget = function OoUiSearchWidget( config ) {
-       // Configuration intialization
-       config = config || {};
-
-       // Parent constructor
-       OO.ui.SearchWidget.super.call( this, config );
-
-       // Properties
-       this.query = new OO.ui.TextInputWidget( {
-               '$': this.$,
-               'icon': 'search',
-               'placeholder': config.placeholder,
-               'value': config.value
-       } );
-       this.results = new OO.ui.SelectWidget( { '$': this.$ } );
-       this.$query = this.$( '<div>' );
-       this.$results = this.$( '<div>' );
-
-       // Events
-       this.query.connect( this, {
-               'change': 'onQueryChange',
-               'enter': 'onQueryEnter'
-       } );
-       this.results.connect( this, {
-               'highlight': 'onResultsHighlight',
-               'select': 'onResultsSelect'
-       } );
-       this.query.$input.on( 'keydown', OO.ui.bind( this.onQueryKeydown, this ) );
-
-       // Initialization
-       this.$query
-               .addClass( 'oo-ui-searchWidget-query' )
-               .append( this.query.$element );
-       this.$results
-               .addClass( 'oo-ui-searchWidget-results' )
-               .append( this.results.$element );
-       this.$element
-               .addClass( 'oo-ui-searchWidget' )
-               .append( this.$results, this.$query );
-};
-
-/* Inheritance */
-
-OO.inheritClass( OO.ui.SearchWidget, OO.ui.Widget );
-
-/* Events */
-
-/**
- * @event highlight
- * @param {Object|null} item Item data or null if no item is highlighted
- */
-
-/**
- * @event select
- * @param {Object|null} item Item data or null if no item is selected
- */
-
-/* Methods */
-
-/**
- * Handle query key down events.
- *
- * @method
- * @param {jQuery.Event} e Key down event
- */
-OO.ui.SearchWidget.prototype.onQueryKeydown = function ( e ) {
-       var highlightedItem, nextItem,
-               dir = e.which === OO.ui.Keys.DOWN ? 1 : ( e.which === OO.ui.Keys.UP ? -1 : 0 );
-
-       if ( dir ) {
-               highlightedItem = this.results.getHighlightedItem();
-               if ( !highlightedItem ) {
-                       highlightedItem = this.results.getSelectedItem();
-               }
-               nextItem = this.results.getRelativeSelectableItem( highlightedItem, dir );
-               this.results.highlightItem( nextItem );
-               nextItem.scrollElementIntoView();
-       }
-};
-
-/**
- * Handle select widget select events.
- *
- * Clears existing results. Subclasses should repopulate items according to new query.
- *
- * @method
- * @param {string} value New value
- */
-OO.ui.SearchWidget.prototype.onQueryChange = function () {
-       // Reset
-       this.results.clearItems();
-};
-
-/**
- * Handle select widget enter key events.
- *
- * Selects highlighted item.
- *
- * @method
- * @param {string} value New value
- */
-OO.ui.SearchWidget.prototype.onQueryEnter = function () {
-       // Reset
-       this.results.selectItem( this.results.getHighlightedItem() );
-};
-
-/**
- * Handle select widget highlight events.
- *
- * @method
- * @param {OO.ui.OptionWidget} item Highlighted item
- * @fires highlight
- */
-OO.ui.SearchWidget.prototype.onResultsHighlight = function ( item ) {
-       this.emit( 'highlight', item ? item.getData() : null );
-};
-
-/**
- * Handle select widget select events.
- *
- * @method
- * @param {OO.ui.OptionWidget} item Selected item
- * @fires select
- */
-OO.ui.SearchWidget.prototype.onResultsSelect = function ( item ) {
-       this.emit( 'select', item ? item.getData() : null );
-};
-
-/**
- * Get the query input.
- *
- * @method
- * @returns {OO.ui.TextInputWidget} Query input
- */
-OO.ui.SearchWidget.prototype.getQuery = function () {
-       return this.query;
-};
-
-/**
- * Reset the widget to initial value.
- */
-OO.ui.SearchWidget.prototype.clear = function () {
-       this.query.setValue( '' );
-};
-
-/**
- * Get the results list.
- *
- * @method
- * @returns {OO.ui.SelectWidget} Select list
- */
-OO.ui.SearchWidget.prototype.getResults = function () {
-       return this.results;
-};
-/**
- * Creates an OO.ui.TextInputWidget object.
- *
- * @class
- * @extends OO.ui.InputWidget
- *
- * @constructor
- * @param {Object} [config] Configuration options
- * @cfg {string} [placeholder] Placeholder text
- * @cfg {string} [icon] Symbolic name of icon
- * @cfg {boolean} [multiline=false] Allow multiple lines of text
- * @cfg {boolean} [autosize=false] Automatically resize to fit content
- * @cfg {boolean} [maxRows=10] Maximum number of rows to make visible when autosizing
- */
-OO.ui.TextInputWidget = function OoUiTextInputWidget( config ) {
-       config = $.extend( { 'maxRows': 10 }, config );
-
-       // Parent constructor
-       OO.ui.TextInputWidget.super.call( this, config );
-
-       // Properties
-       this.pending = 0;
-       this.multiline = !!config.multiline;
-       this.autosize = !!config.autosize;
-       this.maxRows = config.maxRows;
-
-       // Events
-       this.$input.on( 'keypress', OO.ui.bind( this.onKeyPress, this ) );
-       this.$element.on( 'DOMNodeInsertedIntoDocument', OO.ui.bind( this.onElementAttach, this ) );
-
-       // Initialization
-       this.$element.addClass( 'oo-ui-textInputWidget' );
-       if ( config.icon ) {
-               this.$element.addClass( 'oo-ui-textInputWidget-decorated' );
-               this.$element.append(
-                       this.$( '<span>' )
-                               .addClass( 'oo-ui-textInputWidget-icon oo-ui-icon-' + config.icon )
-                               .mousedown( OO.ui.bind( function () {
-                                       this.$input.focus();
-                                       return false;
-                               }, this ) )
-               );
-       }
-       if ( config.placeholder ) {
-               this.$input.attr( 'placeholder', config.placeholder );
-       }
-};
-
-/* Inheritance */
-
-OO.inheritClass( OO.ui.TextInputWidget, OO.ui.InputWidget );
-
-/* Events */
-
-/**
- * User presses enter inside the text box.
- *
- * Not called if input is multiline.
- *
- * @event enter
- */
-
-/* Methods */
-
-/**
- * Handles key press events.
- *
- * @param {jQuery.Event} e Key press event
- * @fires enter If enter key is pressed and input is not multiline
- */
-OO.ui.TextInputWidget.prototype.onKeyPress = function ( e ) {
-       if ( e.which === OO.ui.Keys.ENTER && !this.multiline ) {
-               this.emit( 'enter' );
-       }
-};
-
-/**
- * Handles element attach events.
- *
- * @param {jQuery.Event} e Element attach event
- */
-OO.ui.TextInputWidget.prototype.onElementAttach = function () {
-       this.adjustSize();
-};
-
-/**
- * @inheritdoc
- */
-OO.ui.TextInputWidget.prototype.onEdit = function () {
-       this.adjustSize();
-
-       // Parent method
-       return OO.ui.InputWidget.prototype.onEdit.call( this );
-};
-
-/**
- * Automatically adjust the size of the text input.
- *
- * This only affects multi-line inputs that are auto-sized.
- *
- * @chainable
- */
-OO.ui.TextInputWidget.prototype.adjustSize = function() {
-       var $clone, scrollHeight, innerHeight, outerHeight, maxInnerHeight, idealHeight;
-
-       if ( this.multiline && this.autosize ) {
-               $clone = this.$input.clone()
-                       .val( this.$input.val() )
-                       .css( { 'height': 0 } )
-                       .insertAfter( this.$input );
-               // Set inline height property to 0 to measure scroll height
-               scrollHeight = $clone[0].scrollHeight;
-               // Remove inline height property to measure natural heights
-               $clone.css( 'height', '' );
-               innerHeight = $clone.innerHeight();
-               outerHeight = $clone.outerHeight();
-               // Measure max rows height
-               $clone.attr( 'rows', this.maxRows ).css( 'height', 'auto' );
-               maxInnerHeight = $clone.innerHeight();
-               $clone.removeAttr( 'rows' ).css( 'height', '' );
-               $clone.remove();
-               idealHeight = Math.min( maxInnerHeight, scrollHeight );
-               // Only apply inline height when expansion beyond natural height is needed
-               this.$input.css(
-                       'height',
-                       // Use the difference between the inner and outer height as a buffer
-                       idealHeight > outerHeight ? idealHeight + ( outerHeight - innerHeight ) : ''
-               );
-       }
-       return this;
-};
-
-/**
- * Get input element.
- *
- * @method
- * @param {Object} [config] Configuration options
- * @returns {jQuery} Input element
- */
-OO.ui.TextInputWidget.prototype.getInputElement = function ( config ) {
-       return config.multiline ? this.$( '<textarea>' ) : this.$( '<input type="text" />' );
-};
-
-/* Methods */
-
-/**
- * Checks if input supports multiple lines.
- *
- * @method
- * @returns {boolean} Input supports multiple lines
- */
-OO.ui.TextInputWidget.prototype.isMultiline = function () {
-       return !!this.multiline;
-};
-
-/**
- * Checks if input automatically adjusts its size.
- *
- * @method
- * @returns {boolean} Input automatically adjusts its size
- */
-OO.ui.TextInputWidget.prototype.isAutosizing = function () {
-       return !!this.autosize;
-};
-
-/**
- * Checks if input is pending.
- *
- * @method
- * @returns {boolean} Input is pending
- */
-OO.ui.TextInputWidget.prototype.isPending = function () {
-       return !!this.pending;
-};
-
-/**
- * Increases the pending stack.
- *
- * @method
- * @chainable
- */
-OO.ui.TextInputWidget.prototype.pushPending = function () {
-       this.pending++;
-       this.$element.addClass( 'oo-ui-textInputWidget-pending' );
-       this.$input.addClass( 'oo-ui-texture-pending' );
-       return this;
-};
-
-/**
- * Reduces the pending stack.
- *
- * Clamped at zero.
- *
- * @method
- * @chainable
- */
-OO.ui.TextInputWidget.prototype.popPending = function () {
-       this.pending = Math.max( 0, this.pending - 1 );
-       if ( !this.pending ) {
-               this.$element.removeClass( 'oo-ui-textInputWidget-pending' );
-               this.$input.removeClass( 'oo-ui-texture-pending' );
-       }
-       return this;
-};
-/**
- * Creates an OO.ui.TextInputMenuWidget object.
- *
- * @class
- * @extends OO.ui.MenuWidget
- *
- * @constructor
- * @param {OO.ui.TextInputWidget} input Text input widget to provide menu for
- * @param {Object} [config] Configuration options
- * @cfg {jQuery} [$container=input.$element] Element to render menu under
- */
-OO.ui.TextInputMenuWidget = function OoUiTextInputMenuWidget( input, config ) {
-       // Parent constructor
-       OO.ui.TextInputMenuWidget.super.call( this, config );
-
-       // Properties
-       this.input = input;
-       this.$container = config.$container || this.input.$element;
-       this.onWindowResizeHandler = OO.ui.bind( this.onWindowResize, this );
-
-       // Initialization
-       this.$element.addClass( 'oo-ui-textInputMenuWidget' );
-};
-
-/* Inheritance */
-
-OO.inheritClass( OO.ui.TextInputMenuWidget, OO.ui.MenuWidget );
-
-/* Methods */
-
-/**
- * Handle window resize event.
- *
- * @method
- * @param {jQuery.Event} e Window resize event
- */
-OO.ui.TextInputMenuWidget.prototype.onWindowResize = function () {
-       this.position();
-};
-
-/**
- * Shows the menu.
- *
- * @method
- * @chainable
- */
-OO.ui.TextInputMenuWidget.prototype.show = function () {
-       // Parent method
-       OO.ui.MenuWidget.prototype.show.call( this );
-
-       this.position();
-       this.$( this.getElementWindow() ).on( 'resize', this.onWindowResizeHandler );
-       return this;
-};
-
-/**
- * Hides the menu.
- *
- * @method
- * @chainable
- */
-OO.ui.TextInputMenuWidget.prototype.hide = function () {
-       // Parent method
-       OO.ui.MenuWidget.prototype.hide.call( this );
-
-       this.$( this.getElementWindow() ).off( 'resize', this.onWindowResizeHandler );
-       return this;
-};
-
-/**
- * Positions the menu.
- *
- * @method
- * @chainable
- */
-OO.ui.TextInputMenuWidget.prototype.position = function () {
-       var frameOffset,
-               $container = this.$container,
-               dimensions = $container.offset();
-
-       // Position under input
-       dimensions.top += $container.height();
-
-       // Compensate for frame position if in a differnt frame
-       if ( this.input.$.frame && this.input.$.context !== this.$element[0].ownerDocument ) {
-               frameOffset = OO.ui.Element.getRelativePosition(
-                       this.input.$.frame.$element, this.$element.offsetParent()
-               );
-               dimensions.left += frameOffset.left;
-               dimensions.top += frameOffset.top;
-       } else {
-               // Fix for RTL (for some reason, no need to fix if the frameoffset is set)
-               if ( this.$element.css( 'direction' ) === 'rtl' ) {
-                       dimensions.right = this.$element.parent().position().left -
-                               dimensions.width - dimensions.left;
-                       // Erase the value for 'left':
-                       delete dimensions.left;
-               }
-       }
-
-       this.$element.css( dimensions );
-       this.setIdealSize( $container.width() );
-       return this;
-};
-/**
- * Mixin for widgets with a boolean state.
- *
- * @class
- * @abstract
- *
- * @constructor
- * @param {Object} [config] Configuration options
- * @cfg {boolean} [value=false] Initial value
- */
-OO.ui.ToggleWidget = function OoUiToggleWidget( config ) {
-       // Configuration initialization
-       config = config || {};
-
-       // Properties
-       this.value = null;
-
-       // Initialization
-       this.$element.addClass( 'oo-ui-toggleWidget' );
-       this.setValue( !!config.value );
-};
-
-/* Events */
-
-/**
- * @event change
- * @param {boolean} value Changed value
- */
-
-/* Methods */
-
-/**
- * Get the value of the toggle.
- *
- * @method
- * @returns {boolean} Toggle value
- */
-OO.ui.ToggleWidget.prototype.getValue = function () {
-       return this.value;
-};
-
-/**
- * Set the value of the toggle.
- *
- * @method
- * @param {boolean} value New value
- * @fires change
- * @chainable
- */
-OO.ui.ToggleWidget.prototype.setValue = function ( value ) {
-       value = !!value;
-       if ( this.value !== value ) {
-               this.value = value;
-               this.emit( 'change', value );
-               this.$element.toggleClass( 'oo-ui-toggleWidget-on', value );
-               this.$element.toggleClass( 'oo-ui-toggleWidget-off', !value );
-       }
-       return this;
-};
-/**
- * @class
- * @extends OO.ui.ButtonWidget
- * @mixins OO.ui.ToggleWidget
- *
- * @constructor
- * @param {Object} [config] Configuration options
- * @cfg {boolean} [value=false] Initial value
- */
-OO.ui.ToggleButtonWidget = function OoUiToggleButtonWidget( config ) {
-       // Configuration initialization
-       config = config || {};
-
-       // Parent constructor
-       OO.ui.ToggleButtonWidget.super.call( this, config );
-
-       // Mixin constructors
-       OO.ui.ToggleWidget.call( this, config );
-
-       // Initialization
-       this.$element.addClass( 'oo-ui-toggleButtonWidget' );
-};
-
-/* Inheritance */
-
-OO.inheritClass( OO.ui.ToggleButtonWidget, OO.ui.ButtonWidget );
-
-OO.mixinClass( OO.ui.ToggleButtonWidget, OO.ui.ToggleWidget );
-
-/* Methods */
-
-/**
- * @inheritdoc
- */
-OO.ui.ToggleButtonWidget.prototype.onClick = function () {
-       if ( !this.disabled ) {
-               this.setValue( !this.value );
-       }
-
-       // Parent method
-       return OO.ui.ButtonWidget.prototype.onClick.call( this );
-};
-
-/**
- * @inheritdoc
- */
-OO.ui.ToggleButtonWidget.prototype.setValue = function ( value ) {
-       value = !!value;
-       if ( value !== this.value ) {
-               this.setActive( value );
-       }
-
-       // Parent method
-       OO.ui.ToggleWidget.prototype.setValue.call( this, value );
-
-       return this;
-};
-/**
- * @class
- * @abstract
- * @extends OO.ui.Widget
- * @mixins OO.ui.ToggleWidget
- *
- * @constructor
- * @param {Object} [config] Configuration options
- * @cfg {boolean} [value=false] Initial value
- */
-OO.ui.ToggleSwitchWidget = function OoUiToggleSwitchWidget( config ) {
-       // Parent constructor
-       OO.ui.ToggleSwitchWidget.super.call( this, config );
-
-       // Mixin constructors
-       OO.ui.ToggleWidget.call( this, config );
-
-       // Properties
-       this.dragging = false;
-       this.dragStart = null;
-       this.sliding = false;
-       this.$glow = this.$( '<span>' );
-       this.$grip = this.$( '<span>' );
-
-       // Events
-       this.$element.on( 'click', OO.ui.bind( this.onClick, this ) );
-
-       // Initialization
-       this.$glow.addClass( 'oo-ui-toggleSwitchWidget-glow' );
-       this.$grip.addClass( 'oo-ui-toggleSwitchWidget-grip' );
-       this.$element
-               .addClass( 'oo-ui-toggleSwitchWidget' )
-               .append( this.$glow, this.$grip );
-};
-
-/* Inheritance */
-
-OO.inheritClass( OO.ui.ToggleSwitchWidget, OO.ui.Widget );
-
-OO.mixinClass( OO.ui.ToggleSwitchWidget, OO.ui.ToggleWidget );
-
-/* Methods */
-
-/**
- * Handles mouse down events.
- *
- * @method
- * @param {jQuery.Event} e Mouse down event
- */
-OO.ui.ToggleSwitchWidget.prototype.onClick = function ( e ) {
-       if ( !this.disabled && e.which === 1 ) {
-               this.setValue( !this.value );
-       }
-};
-}( OO ) );
diff --git a/resources/oojs-ui/oojs-ui.svg.css b/resources/oojs-ui/oojs-ui.svg.css
deleted file mode 100644 (file)
index 887da4d..0000000
+++ /dev/null
@@ -1,1230 +0,0 @@
-/*!
- * OOjs UI v0.1.0-pre (23fb1b6144)
- * https://www.mediawiki.org/wiki/OOjs_UI
- *
- * Copyright 2011–2014 OOjs Team and other contributors.
- * Released under the MIT license
- * http://oojs.mit-license.org
- *
- * Date: Thu Mar 27 2014 14:49:30 GMT-0700 (PDT)
- */
-
-/* Textures */
-
-.oo-ui-texture-pending {
-  background-image: /* @embed */ url(images/textures/pending.gif);
-}
-
-.oo-ui-texture-transparency {
-  background-image: /* @embed */ url(images/textures/transparency.png);
-}
-
-/* RTL Definitions */
-
-/* @noflip */
-
-.oo-ui-rtl {
-  direction: rtl;
-}
-
-/* @noflip */
-
-.oo-ui-ltr {
-  direction: ltr;
-}
-
-.oo-ui-dialog {
-  position: fixed;
-  top: 0;
-  right: 0;
-  bottom: 0;
-  left: 0;
-  padding: 1em;
-  line-height: 1em;
-  /* Fix for strange opacity-related rendering issues.
-          CAUTION: -webkit-backface-visibility: hidden; is EXTREMELY DANGEROUS.
-          If applied to a VE surface directly, it will break selection of
-          FocusableNodes, and in the past it's caused transparent PNGs to
-          render as opaque black images. For some reason applying it to the dialog
-          wrapper in the main document fixes opacity-related behavior in the iframe
-          document, but doesn't break the surface inside the iframe. */
-
-  -webkit-backface-visibility: hidden;
-          backface-visibility: hidden;
-}
-
-.oo-ui-dialog .oo-ui-window-frame {
-  position: fixed;
-  top: 1em;
-  right: 0;
-  bottom: 1em;
-  left: 0;
-  min-height: 12em;
-  margin: auto;
-  overflow: hidden;
-}
-
-.oo-ui-dialog-small .oo-ui-window-frame {
-  width: 400px;
-  max-height: 230px;
-}
-
-.oo-ui-dialog-medium .oo-ui-window-frame {
-  width: 600px;
-  max-height: 460px;
-}
-
-.oo-ui-dialog-large .oo-ui-window-frame {
-  width: 800px;
-  max-height: 690px;
-}
-
-.oo-ui-dialog .oo-ui-frame {
-  width: 100%;
-  height: 100%;
-}
-
-.oo-ui-dialog-content .oo-ui-window-head,
-.oo-ui-dialog-content .oo-ui-window-body,
-.oo-ui-dialog-content .oo-ui-window-foot {
-  position: absolute;
-  right: 0;
-  left: 0;
-  overflow: hidden;
-  -webkit-box-sizing: border-box;
-     -moz-box-sizing: border-box;
-          box-sizing: border-box;
-}
-
-.oo-ui-dialog-content .oo-ui-window-head {
-  top: 0;
-  height: 3.8em;
-  padding: 0.5em;
-}
-
-.oo-ui-dialog-content .oo-ui-window-title {
-  line-height: 2.8em;
-}
-
-.oo-ui-dialog-content .oo-ui-window-icon {
-  width: 2.4em;
-  height: 2.8em;
-  line-height: 2.8em;
-}
-
-.oo-ui-dialog-content .oo-ui-window-closeButton {
-  float: right;
-  margin: 0.25em 0.25em;
-}
-
-.oo-ui-dialog-content .oo-ui-window-body {
-  top: 3.8em;
-  bottom: 4.8em;
-}
-
-.oo-ui-dialog-content .oo-ui-window-foot {
-  bottom: 0;
-  height: 4.8em;
-  padding: 1em;
-}
-
-.oo-ui-dialog-content .oo-ui-window-foot .oo-ui-buttonedElement-framed {
-  float: left;
-  margin: 0.125em 0.25em;
-}
-
-.oo-ui-dialog-content .oo-ui-window-foot .oo-ui-flaggableElement-primary,
-.oo-ui-dialog-content .oo-ui-window-foot .oo-ui-flaggableElement-constructive,
-.oo-ui-dialog-content .oo-ui-window-foot .oo-ui-flaggableElement-destructive {
-  float: right;
-}
-
-.oo-ui-dialog-content-footless .oo-ui-window-body {
-  bottom: 0;
-}
-
-.oo-ui-dialog-content-footless .oo-ui-window-foot {
-  display: none;
-}
-
-.oo-ui-frame {
-  padding: 0;
-  margin: 0;
-}
-
-.oo-ui-frame-body {
-  padding: 0;
-  margin: 0;
-  background: none;
-}
-
-.oo-ui-toolbar {
-  clear: both;
-}
-
-.oo-ui-toolbar-bar {
-  line-height: 1em;
-}
-
-.oo-ui-toolbar-bottom .oo-ui-toolbar-bar {
-  position: absolute;
-}
-
-.oo-ui-toolbar-actions {
-  float: right;
-}
-
-.oo-ui-toolbar-tools {
-  float: left;
-}
-
-.oo-ui-toolbar-tools,
-.oo-ui-toolbar-actions,
-.oo-ui-toolbar-shadow {
-  -webkit-user-select: none;
-     -moz-user-select: none;
-      -ms-user-select: none;
-          user-select: none;
-  -webkit-touch-callout: none;
-}
-
-.oo-ui-toolbar-actions .oo-ui-popupWidget {
-  -webkit-user-select: all;
-     -moz-user-select: all;
-      -ms-user-select: all;
-          user-select: all;
-  -webkit-touch-callout: default;
-}
-
-.oo-ui-toolbar-shadow {
-  position: absolute;
-  width: 100%;
-  pointer-events: none;
-  background-position: left top;
-  background-repeat: repeat-x;
-}
-
-.oo-ui-toolGroup {
-  display: inline-block;
-  margin: 0.3em;
-  vertical-align: middle;
-}
-
-.oo-ui-toolGroup-empty {
-  display: none;
-}
-
-.oo-ui-toolGroup .oo-ui-tool-link .oo-ui-iconedElement-icon {
-  background-position: center center;
-  background-repeat: no-repeat;
-}
-
-.oo-ui-window-head {
-  -webkit-user-select: none;
-     -moz-user-select: none;
-      -ms-user-select: none;
-          user-select: none;
-  -webkit-touch-callout: none;
-}
-
-.oo-ui-window-icon {
-  float: left;
-  background-position: center center;
-  background-repeat: no-repeat;
-}
-
-.oo-ui-window-title {
-  float: left;
-  white-space: nowrap;
-  cursor: default;
-}
-
-.oo-ui-window-overlay {
-  position: absolute;
-  top: 0;
-  left: 0;
-}
-
-.oo-ui-buttonedElement .oo-ui-buttonedElement-button {
-  display: inline-block;
-  vertical-align: middle;
-  cursor: pointer;
-  -webkit-user-select: none;
-     -moz-user-select: none;
-      -ms-user-select: none;
-          user-select: none;
-  -webkit-touch-callout: none;
-}
-
-.oo-ui-buttonedElement .oo-ui-buttonedElement-button > .oo-ui-iconedElement-icon {
-  display: none;
-  margin-left: 0;
-}
-
-.oo-ui-buttonedElement .oo-ui-buttonedElement-button > .oo-ui-indicatedElement-indicator {
-  display: none;
-  margin-right: -0.75em;
-}
-
-.oo-ui-buttonedElement.oo-ui-widget-disabled .oo-ui-buttonedElement-button {
-  cursor: default;
-}
-
-.oo-ui-buttonedElement.oo-ui-indicatedElement .oo-ui-buttonedElement-button > .oo-ui-indicatedElement-indicator,
-.oo-ui-buttonedElement.oo-ui-iconedElement .oo-ui-buttonedElement-button > .oo-ui-iconedElement-icon {
-  display: inline-block;
-  vertical-align: middle;
-  background-position: center center;
-  background-repeat: no-repeat;
-}
-
-.oo-ui-buttonedElement-frameless {
-  position: relative;
-  display: inline-block;
-}
-
-.oo-ui-buttonedElement-frameless .oo-ui-buttonedElement-button > .oo-ui-labeledElement-label {
-  display: inline-block;
-  margin-left: 0.25em;
-  vertical-align: middle;
-}
-
-.oo-ui-buttonedElement-framed .oo-ui-buttonedElement-button {
-  display: inline-block;
-  padding: 0.2em 0.8em;
-  margin: 0.1em 0;
-  text-align: center;
-  vertical-align: top;
-}
-
-.oo-ui-buttonedElement-framed .oo-ui-buttonedElement-button > .oo-ui-labeledElement-label {
-  display: inline-block;
-  line-height: 1.9em;
-  vertical-align: middle;
-}
-
-.oo-ui-buttonedElement-framed.oo-ui-iconedElement .oo-ui-buttonedElement-button > .oo-ui-iconedElement-icon {
-  margin-right: -0.5em;
-  margin-left: -0.5em;
-}
-
-.oo-ui-buttonedElement-framed.oo-ui-iconedElement.oo-ui-labeledElement .oo-ui-buttonedElement-button > .oo-ui-iconedElement-icon {
-  margin-right: 0.3em;
-  margin-left: -0.5em;
-}
-
-.oo-ui-buttonedElement-framed.oo-ui-widget-disabled .oo-ui-buttonedElement-button,
-.oo-ui-buttonedElement-framed.oo-ui-widget-disabled .oo-ui-buttonedElement-button.oo-ui-buttonedElement-active,
-.oo-ui-buttonedElement-framed.oo-ui-widget-disabled .oo-ui-buttonedElement-button.oo-ui-buttonedElement-pressed {
-  cursor: default;
-}
-
-.oo-ui-clippableElement-clippable {
-  -webkit-box-sizing: border-box;
-     -moz-box-sizing: border-box;
-          box-sizing: border-box;
-}
-
-.oo-ui-bookletLayout-stackLayout.oo-ui-stackLayout-continuous .oo-ui-panelLayout-scrollable {
-  overflow-y: hidden;
-}
-
-.oo-ui-bookletLayout-stackLayout .oo-ui-panelLayout {
-  width: 100%;
-  padding: 1.5em;
-  -webkit-box-sizing: border-box;
-     -moz-box-sizing: border-box;
-          box-sizing: border-box;
-}
-
-.oo-ui-bookletLayout-stackLayout .oo-ui-panelLayout-scrollable {
-  overflow-y: auto;
-}
-
-.oo-ui-bookletLayout-stackLayout .oo-ui-panelLayout-padded {
-  padding: 2em;
-}
-
-.oo-ui-bookletLayout-outlinePanel-editable .oo-ui-outlineWidget {
-  position: absolute;
-  top: 0;
-  right: 0;
-  bottom: 3em;
-  left: 0;
-  overflow-y: auto;
-}
-
-.oo-ui-bookletLayout-outlinePanel .oo-ui-outlineControlsWidget {
-  position: absolute;
-  right: 0;
-  bottom: 0;
-  left: 0;
-}
-
-.oo-ui-fieldLayout {
-  margin-bottom: 1em;
-}
-
-.oo-ui-fieldLayout:last-child {
-  margin-bottom: 0;
-}
-
-.oo-ui-fieldLayout:before,
-.oo-ui-fieldLayout:after {
-  display: table;
-  content: " ";
-}
-
-.oo-ui-fieldLayout:after {
-  clear: both;
-}
-
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-left > .oo-ui-labeledElement-label,
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right > .oo-ui-labeledElement-label {
-  display: block;
-  float: left;
-  width: 35%;
-  padding-top: 0.5em;
-  margin-right: 5%;
-}
-
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-left > .oo-ui-fieldLayout-field,
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right > .oo-ui-fieldLayout-field {
-  display: block;
-  float: left;
-  width: 60%;
-}
-
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right > .oo-ui-labeledElement-label {
-  text-align: right;
-}
-
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline > .oo-ui-labeledElement-label {
-  display: inline-block;
-  padding: 0.75em 0.5em 0.5em 0.5em;
-  vertical-align: middle;
-}
-
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline > .oo-ui-fieldLayout-field {
-  display: inline-block;
-  padding: 0.5em 0;
-  vertical-align: middle;
-}
-
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-top > .oo-ui-labeledElement-label {
-  padding: 0.5em 0;
-}
-
-.oo-ui-fieldsetLayout {
-  position: relative;
-  padding: 0;
-  margin: 0;
-}
-
-.oo-ui-fieldsetLayout + .oo-ui-fieldsetLayout {
-  margin-top: 2em;
-}
-
-.oo-ui-fieldsetLayout-labeled {
-  margin-top: -0.75em;
-}
-
-.oo-ui-fieldsetLayout > legend.oo-ui-labeledElement-label {
-  padding: 0.25em 0;
-  margin-bottom: 0.5em;
-}
-
-.oo-ui-fieldsetLayout.oo-ui-iconedElement > legend.oo-ui-labeledElement-label {
-  padding-left: 1.75em;
-}
-
-.oo-ui-fieldsetLayout.oo-ui-iconedElement > .oo-ui-iconedElement-icon {
-  position: absolute;
-  top: 0;
-  left: 0;
-  display: block;
-  width: 2em;
-  height: 2em;
-  background-position: center center;
-  background-repeat: no-repeat;
-}
-
-.oo-ui-gridLayout {
-  position: absolute;
-  top: 0;
-  right: 0;
-  bottom: 0;
-  left: 0;
-}
-
-.oo-ui-labelWidget {
-  padding: 0.5em 0;
-}
-
-.oo-ui-panelLayout {
-  position: absolute;
-  top: 0;
-  right: 0;
-  bottom: 0;
-  left: 0;
-}
-
-.oo-ui-panelLayout-scrollable {
-  overflow-y: auto;
-}
-
-.oo-ui-panelLayout-padded {
-  padding: 2em;
-}
-
-.oo-ui-stackLayout > .oo-ui-panelLayout {
-  display: none;
-}
-
-.oo-ui-stackLayout-continuous > .oo-ui-panelLayout {
-  position: relative;
-  display: block;
-}
-
-.oo-ui-barToolGroup > .oo-ui-iconedElement-icon,
-.oo-ui-barToolGroup > .oo-ui-labeledElement-label {
-  display: none;
-}
-
-.oo-ui-barToolGroup .oo-ui-tool {
-  position: relative;
-  display: inline-block;
-  vertical-align: top;
-}
-
-.oo-ui-barToolGroup .oo-ui-tool-link {
-  display: block;
-  height: 1.5em;
-  padding: 0.25em;
-}
-
-.oo-ui-barToolGroup .oo-ui-tool-link .oo-ui-iconedElement-icon {
-  display: block;
-  width: 1.5em;
-  height: 1.5em;
-}
-
-.oo-ui-barToolGroup .oo-ui-tool-link .oo-ui-tool-title {
-  display: none;
-}
-
-.oo-ui-barToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link {
-  cursor: default;
-}
-
-.oo-ui-barToolGroup .oo-ui-tool-title,
-.oo-ui-barToolGroup .oo-ui-tool-accel {
-  display: none;
-}
-
-.oo-ui-barToolGroup.oo-ui-widget-enabled .oo-ui-tool-link {
-  cursor: pointer;
-}
-
-.oo-ui-listToolGroup .oo-ui-toolGroup-tools {
-  padding: 0.25em;
-}
-
-.oo-ui-listToolGroup .oo-ui-tool {
-  display: inline-block;
-  width: 100%;
-  -webkit-box-sizing: border-box;
-     -moz-box-sizing: border-box;
-          box-sizing: border-box;
-}
-
-.oo-ui-listToolGroup .oo-ui-tool-link {
-  display: block;
-  padding-right: 0.5em;
-  white-space: nowrap;
-  cursor: pointer;
-}
-
-.oo-ui-listToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link {
-  cursor: default;
-}
-
-.oo-ui-menuToolGroup .oo-ui-popupToolGroup-handle {
-  min-width: 8em;
-}
-
-.oo-ui-menuToolGroup .oo-ui-tool {
-  display: block;
-}
-
-.oo-ui-menuToolGroup .oo-ui-tool-link {
-  display: block;
-  padding: 0.25em 1em 0.25em 0.25em;
-  white-space: nowrap;
-  cursor: pointer;
-}
-
-.oo-ui-menuToolGroup .oo-ui-tool-link .oo-ui-iconedElement-icon {
-  background-image: none;
-}
-
-.oo-ui-menuToolGroup .oo-ui-tool-active .oo-ui-tool-link .oo-ui-iconedElement-icon {
-  background-image: /* @embed */ url(images/icons/check.png);
-}
-
-.oo-ui-menuToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link {
-  cursor: default;
-}
-
-.oo-ui-popupToolGroup {
-  position: relative;
-  height: 2em;
-  min-width: 2.5em;
-}
-
-.oo-ui-popupToolGroup.oo-ui-indicatedElement.oo-ui-iconedElement {
-  min-width: 3.5em;
-}
-
-.oo-ui-popupToolGroup-handle {
-  display: block;
-  cursor: pointer;
-}
-
-.oo-ui-popupToolGroup-handle .oo-ui-indicatedElement-indicator,
-.oo-ui-popupToolGroup-handle .oo-ui-iconedElement-icon {
-  position: absolute;
-  top: 0;
-  width: 2em;
-  height: 2em;
-  background-position: center center;
-  background-repeat: no-repeat;
-}
-
-.oo-ui-popupToolGroup-handle .oo-ui-indicatedElement-indicator {
-  right: 0;
-}
-
-.oo-ui-popupToolGroup-handle .oo-ui-iconedElement-icon {
-  left: 0.25em;
-}
-
-.oo-ui-popupToolGroup-handle .oo-ui-labeledElement-label {
-  margin: 0 1em;
-  font-size: 0.8em;
-  line-height: 2.6em;
-}
-
-.oo-ui-popupToolGroup.oo-ui-widget-disabled .oo-ui-popupToolGroup-handle {
-  cursor: default;
-}
-
-.oo-ui-popupToolGroup.oo-ui-iconedElement .oo-ui-popupToolGroup-handle .oo-ui-labeledElement-label {
-  margin-left: 3em;
-}
-
-.oo-ui-popupToolGroup.oo-ui-indicatedElement .oo-ui-popupToolGroup-handle .oo-ui-labeledElement-label {
-  margin-right: 2.25em;
-}
-
-.oo-ui-popupToolGroup .oo-ui-toolGroup-tools {
-  position: absolute;
-  top: 2em;
-  left: -1px;
-  z-index: 4;
-  display: none;
-}
-
-.oo-ui-popupToolGroup .oo-ui-toolGroup-tools .oo-ui-iconedElement-icon {
-  background-position: center center;
-  background-repeat: no-repeat;
-}
-
-.oo-ui-popupToolGroup-active.oo-ui-widget-enabled > .oo-ui-toolGroup-tools {
-  display: block;
-}
-
-.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-iconedElement-icon {
-  display: inline-block;
-  width: 2em;
-  height: 2em;
-  margin-right: 0.25em;
-  vertical-align: middle;
-}
-
-.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-tool-title {
-  display: inline-block;
-  font-size: 0.8em;
-  line-height: 2em;
-  vertical-align: middle;
-}
-
-.oo-ui-popupToolGroup .oo-ui-tool-accel {
-  display: none;
-}
-
-.oo-ui-popupTool .oo-ui-popupWidget {
-  margin-left: 1.25em;
-  font-size: 0.8em;
-}
-
-.oo-ui-popupTool .oo-ui-popupWidget-popup,
-.oo-ui-popupTool .oo-ui-popupWidget-tail {
-  z-index: 4;
-}
-
-.oo-ui-iconWidget {
-  display: inline-block;
-  width: 1.9em;
-  height: 1.9em;
-  line-height: 2.5em;
-  vertical-align: middle;
-  background-position: center center;
-  background-repeat: no-repeat;
-  opacity: 0.8;
-}
-
-.oo-ui-iconWidget.oo-ui-widget-disabled {
-  opacity: 0.2;
-}
-
-.oo-ui-indicatorWidget {
-  display: inline-block;
-  width: 1.9em;
-  height: 1.9em;
-  line-height: 2.5em;
-  vertical-align: middle;
-  background-position: center center;
-  background-repeat: no-repeat;
-  opacity: 0.8;
-}
-
-.oo-ui-indicatorWidget.oo-ui-widget-disabled {
-  opacity: 0.2;
-}
-
-.oo-ui-selectWidget {
-  padding: 0;
-  margin: 0;
-  list-style: none;
-}
-
-.oo-ui-optionWidget {
-  position: relative;
-  display: block;
-  margin: 0;
-  list-style: none;
-  cursor: pointer;
-  border: none;
-}
-
-.oo-ui-optionWidget.oo-ui-widget-disabled {
-  cursor: default;
-}
-
-.oo-ui-optionWidget .oo-ui-labeledElement-label {
-  display: block;
-  overflow: hidden;
-  line-height: 1.5em;
-  text-overflow: ellipsis;
-  white-space: nowrap;
-}
-
-.oo-ui-optionWidget .oo-ui-iconedElement-icon,
-.oo-ui-optionWidget .oo-ui-indicatedElement-indicator {
-  position: absolute;
-  top: 50%;
-  width: 2em;
-  height: 2em;
-  margin-top: -1em;
-  background-position: center center;
-  background-repeat: no-repeat;
-}
-
-.oo-ui-optionWidget .oo-ui-iconedElement-icon {
-  left: 0.5em;
-}
-
-.oo-ui-optionWidget .oo-ui-indicatedElement-indicator {
-  right: 0.5em;
-}
-
-.oo-ui-menuWidget {
-  position: absolute;
-}
-
-.oo-ui-menuWidget input {
-  position: absolute;
-  width: 0;
-  height: 0;
-  overflow: hidden;
-  opacity: 0;
-}
-
-.oo-ui-popupWidget-popup {
-  position: absolute;
-  overflow: hidden;
-}
-
-.oo-ui-popupWidget-tail {
-  display: none;
-}
-
-.oo-ui-popupWidget-tailed .oo-ui-popupWidget-popup {
-  margin-top: 7px;
-}
-
-.oo-ui-popupWidget-tailed .oo-ui-popupWidget-tail {
-  position: absolute;
-  display: block;
-  background-repeat: no-repeat;
-}
-
-.oo-ui-popupWidget-head {
-  height: 2.5em;
-  -webkit-user-select: none;
-     -moz-user-select: none;
-      -ms-user-select: none;
-          user-select: none;
-  -webkit-touch-callout: none;
-}
-
-.oo-ui-popupWidget-head .oo-ui-buttonWidget {
-  float: right;
-  margin: 0.25em;
-}
-
-.oo-ui-popupWidget-head .oo-ui-labeledElement-label {
-  float: left;
-  margin: 0.75em 1em;
-  cursor: default;
-}
-
-.oo-ui-popupWidget-body {
-  clear: both;
-}
-
-.oo-ui-buttonGroupWidget {
-  border-radius: 0.3em;
-}
-
-.oo-ui-buttonGroupWidget .oo-ui-buttonedElement-framed .oo-ui-buttonedElement-button {
-  margin-bottom: -1px;
-  margin-left: -1px;
-  border-radius: 0;
-}
-
-.oo-ui-buttonGroupWidget .oo-ui-buttonedElement-framed:first-child .oo-ui-buttonedElement-button {
-  margin-left: 0;
-  border-bottom-left-radius: 0.3em;
-  border-top-left-radius: 0.3em;
-}
-
-.oo-ui-buttonGroupWidget .oo-ui-buttonedElement-framed:last-child .oo-ui-buttonedElement-button {
-  border-top-right-radius: 0.3em;
-  border-bottom-right-radius: 0.3em;
-}
-
-.oo-ui-buttonOptionWidget {
-  display: inline-block;
-  background-color: transparent;
-}
-
-.oo-ui-buttonOptionWidget .oo-ui-buttonedElement-button {
-  position: relative;
-  height: 1.9em;
-}
-
-.oo-ui-buttonOptionWidget.oo-ui-iconedElement .oo-ui-iconedElement-icon,
-.oo-ui-buttonOptionWidget.oo-ui-indicatedElement .oo-ui-indicatedElement-indicator {
-  position: static;
-  display: inline-block;
-  height: 1.9em;
-  margin-top: 0;
-  vertical-align: middle;
-}
-
-.oo-ui-buttonSelectWidget {
-  display: inline-block;
-  white-space: nowrap;
-}
-
-.oo-ui-buttonWidget {
-  display: inline-block;
-  vertical-align: middle;
-}
-
-.oo-ui-inlineMenuWidget {
-  position: relative;
-  display: inline-block;
-  min-width: 20em;
-  margin: 0.25em 0;
-}
-
-.oo-ui-inlineMenuWidget-handle {
-  display: inline-block;
-  width: 100%;
-  height: 2.5em;
-  cursor: pointer;
-  -webkit-box-sizing: border-box;
-     -moz-box-sizing: border-box;
-          box-sizing: border-box;
-  -webkit-user-select: none;
-     -moz-user-select: none;
-      -ms-user-select: none;
-          user-select: none;
-  -webkit-touch-callout: none;
-}
-
-.oo-ui-inlineMenuWidget-handle .oo-ui-indicatedElement-indicator,
-.oo-ui-inlineMenuWidget-handle .oo-ui-iconedElement-icon {
-  position: absolute;
-  top: 0;
-  width: 2.5em;
-  height: 2.5em;
-  background-position: center center;
-  background-repeat: no-repeat;
-}
-
-.oo-ui-inlineMenuWidget-handle .oo-ui-indicatedElement-indicator {
-  right: 0;
-}
-
-.oo-ui-inlineMenuWidget-handle .oo-ui-iconedElement-icon {
-  left: 0.25em;
-}
-
-.oo-ui-inlineMenuWidget-handle .oo-ui-labeledElement-label {
-  margin: 0 0.5em;
-  line-height: 2.5em;
-}
-
-.oo-ui-inlineMenuWidget.oo-ui-iconedElement .oo-ui-inlineMenuWidget-handle .oo-ui-labeledElement-label {
-  margin-left: 3em;
-}
-
-.oo-ui-inlineMenuWidget.oo-ui-indicatedElement .oo-ui-inlineMenuWidget-handle .oo-ui-labeledElement-label {
-  margin-right: 2em;
-}
-
-.oo-ui-inlineMenuWidget .oo-ui-menuWidget {
-  z-index: 1;
-  width: 100%;
-}
-
-.oo-ui-inlineMenuWidget.oo-ui-widget-disabled .oo-ui-inlineMenuWidget-handle {
-  cursor: default;
-}
-
-.oo-ui-menuItemWidget {
-  position: relative;
-}
-
-.oo-ui-menuItemWidget .oo-ui-iconedElement-icon {
-  display: none;
-}
-
-.oo-ui-menuItemWidget.oo-ui-optionWidget-selected {
-  background-color: transparent;
-}
-
-.oo-ui-menuItemWidget.oo-ui-optionWidget-selected .oo-ui-iconedElement-icon {
-  display: block;
-}
-
-.oo-ui-menuSectionItemWidget {
-  cursor: default;
-}
-
-.oo-ui-outlineControlsWidget {
-  height: 3em;
-}
-
-.oo-ui-outlineControlsWidget-adders,
-.oo-ui-outlineControlsWidget-movers {
-  float: left;
-  height: 2em;
-  padding: 0;
-  margin: 0.5em;
-  -webkit-box-sizing: border-box;
-     -moz-box-sizing: border-box;
-          box-sizing: border-box;
-}
-
-.oo-ui-outlineControlsWidget > .oo-ui-iconedElement-icon {
-  float: left;
-  width: 1.5em;
-  height: 2em;
-  margin: 0.5em 0 0.5em 0.5em;
-  background-position: right center;
-  background-repeat: no-repeat;
-}
-
-.oo-ui-outlineControlsWidget-adders {
-  float: left;
-  margin-left: 0;
-}
-
-.oo-ui-outlineControlsWidget-adders .oo-ui-buttonWidget {
-  float: left;
-}
-
-.oo-ui-outlineControlsWidget-movers {
-  float: right;
-}
-
-.oo-ui-outlineControlsWidget-movers .oo-ui-buttonWidget {
-  float: right;
-}
-
-.oo-ui-outlineItemWidget {
-  position: relative;
-  padding: 0.75em;
-  cursor: pointer;
-  -webkit-user-select: none;
-     -moz-user-select: none;
-      -ms-user-select: none;
-          user-select: none;
-  -webkit-touch-callout: none;
-}
-
-.oo-ui-popupButtonWidget {
-  position: relative;
-}
-
-.oo-ui-popupButtonWidget .oo-ui-popupWidget {
-  position: absolute;
-  left: 1em;
-  cursor: auto;
-}
-
-.oo-ui-searchWidget-query {
-  position: absolute;
-  top: 0;
-  right: 0;
-  left: 0;
-  height: 4em;
-  padding: 0 1em;
-}
-
-.oo-ui-searchWidget-query .oo-ui-textInputWidget {
-  width: 100%;
-  margin: 0.75em 0;
-}
-
-.oo-ui-searchWidget-results {
-  position: absolute;
-  top: 4em;
-  right: 0;
-  bottom: 0;
-  left: 0;
-  padding: 1em;
-  overflow-x: hidden;
-  overflow-y: auto;
-  line-height: 0;
-}
-
-.oo-ui-textInputWidget {
-  position: relative;
-  -webkit-box-sizing: border-box;
-     -moz-box-sizing: border-box;
-          box-sizing: border-box;
-}
-
-.oo-ui-textInputWidget input,
-.oo-ui-textInputWidget textarea {
-  display: inline-block;
-  width: 100%;
-  -webkit-box-sizing: border-box;
-     -moz-box-sizing: border-box;
-          box-sizing: border-box;
-  resize: none;
-}
-
-.oo-ui-textInputWidget-icon {
-  position: absolute;
-  top: 0;
-  left: 0;
-  height: 100%;
-  background-position: right center;
-  background-repeat: no-repeat;
-}
-
-.oo-ui-toggleSwitchWidget {
-  position: relative;
-  display: inline-block;
-  width: 4em;
-  height: 2em;
-  overflow: hidden;
-  vertical-align: middle;
-  cursor: pointer;
-  -webkit-transform: translateZ(0);
-     -moz-transform: translateZ(0);
-      -ms-transform: translateZ(0);
-       -o-transform: translateZ(0);
-          transform: translateZ(0);
-  -webkit-box-sizing: border-box;
-     -moz-box-sizing: border-box;
-          box-sizing: border-box;
-}
-
-.oo-ui-toggleSwitchWidget.oo-ui-widget-disabled {
-  cursor: default;
-}
-
-.oo-ui-toggleSwitchWidget-grip {
-  position: absolute;
-  top: 0.25em;
-  left: 0.25em;
-  display: block;
-  width: 1.5em;
-  height: 1.5em;
-  -webkit-box-sizing: border-box;
-     -moz-box-sizing: border-box;
-          box-sizing: border-box;
-  -webkit-transition: left 200ms ease-in-out, margin-left 200ms ease-in-out;
-     -moz-transition: left 200ms ease-in-out, margin-left 200ms ease-in-out;
-      -ms-transition: left 200ms ease-in-out, margin-left 200ms ease-in-out;
-       -o-transition: left 200ms ease-in-out, margin-left 200ms ease-in-out;
-          transition: left 200ms ease-in-out, margin-left 200ms ease-in-out;
-}
-
-.oo-ui-toggleSwitchWidget .oo-ui-toggleSwitchWidget-glow {
-  position: absolute;
-  top: 0;
-  right: 0;
-  bottom: 0;
-  left: 0;
-  -webkit-transition: opacity 200ms ease-in-out;
-     -moz-transition: opacity 200ms ease-in-out;
-      -ms-transition: opacity 200ms ease-in-out;
-       -o-transition: opacity 200ms ease-in-out;
-          transition: opacity 200ms ease-in-out;
-  -webkit-user-select: none;
-     -moz-user-select: none;
-      -ms-user-select: none;
-          user-select: none;
-  -webkit-touch-callout: none;
-}
-
-.oo-ui-toggleWidget-on .oo-ui-toggleSwitchWidget-grip {
-  left: 2.25em;
-  margin-left: -2px;
-}
-
-.oo-ui-toggleWidget-off .oo-ui-toggleSwitchWidget-grip {
-  left: 0.25em;
-  margin-left: 0;
-}
-
-.oo-ui-toggleWidget-off .oo-ui-toggleSwitchWidget-glow {
-  display: none;
-}
-
-/* Icons */
-
-.oo-ui-icon-add-item {
-  background-image: /* @embed */ url(images/icons/add-item.svg);
-}
-
-.oo-ui-icon-advanced {
-  background-image: /* @embed */ url(images/icons/advanced.svg);
-}
-
-.oo-ui-icon-alert {
-  background-image: /* @embed */ url(images/icons/alert.svg);
-}
-
-.oo-ui-icon-check {
-  background-image: /* @embed */ url(images/icons/check.svg);
-}
-
-.oo-ui-icon-clear {
-  background-image: /* @embed */ url(images/icons/clear.svg);
-}
-
-.oo-ui-icon-close {
-  background-image: /* @embed */ url(images/icons/close.svg);
-}
-
-.oo-ui-icon-code {
-  background-image: /* @embed */ url(images/icons/code.svg);
-}
-
-.oo-ui-icon-collapse {
-  background-image: /* @embed */ url(images/icons/collapse.svg);
-}
-
-.oo-ui-icon-comment {
-  background-image: /* @embed */ url(images/icons/comment.svg);
-}
-
-.oo-ui-icon-expand {
-  background-image: /* @embed */ url(images/icons/expand.svg);
-}
-
-.oo-ui-icon-help {
-  background-image: /* @embed */ url(images/icons/help.svg);
-}
-
-.oo-ui-icon-link {
-  background-image: /* @embed */ url(images/icons/link.svg);
-}
-
-.oo-ui-icon-menu {
-  background-image: /* @embed */ url(images/icons/menu.svg);
-}
-
-.oo-ui-icon-next {
-  background-image: /* @embed */ url(images/icons/move-ltr.svg);
-}
-
-.oo-ui-icon-picture {
-  background-image: /* @embed */ url(images/icons/picture.svg);
-}
-
-.oo-ui-icon-previous {
-  background-image: /* @embed */ url(images/icons/move-rtl.svg);
-}
-
-.oo-ui-icon-redo {
-  background-image: /* @embed */ url(images/icons/arched-arrow-ltr.svg);
-}
-
-.oo-ui-icon-remove {
-  background-image: /* @embed */ url(images/icons/remove.svg);
-}
-
-.oo-ui-icon-search {
-  background-image: /* @embed */ url(images/icons/search.svg);
-}
-
-.oo-ui-icon-settings {
-  background-image: /* @embed */ url(images/icons/settings.svg);
-}
-
-.oo-ui-icon-tag {
-  background-image: /* @embed */ url(images/icons/tag.svg);
-}
-
-.oo-ui-icon-undo {
-  background-image: /* @embed */ url(images/icons/arched-arrow-rtl.svg);
-}
-
-.oo-ui-icon-window {
-  background-image: /* @embed */ url(images/icons/window.svg);
-}
-
-/* Indicators */
-
-.oo-ui-indicator-down {
-  background-image: /* @embed */ url(images/indicators/down.svg);
-}
-
-.oo-ui-indicator-required {
-  background-image: /* @embed */ url(images/indicators/required.svg);
-}
-
-.oo-ui-indicator-up {
-  background-image: /* @embed */ url(images/indicators/up.svg);
-}
\ No newline at end of file
diff --git a/resources/oojs-ui/update-oojs-ui.sh b/resources/oojs-ui/update-oojs-ui.sh
deleted file mode 100755 (executable)
index edc7425..0000000
+++ /dev/null
@@ -1,99 +0,0 @@
-#!/usr/bin/env bash
-
-# FIXME this script is duplicated from update-oojs.sh - factor this out
-
-# This script generates a commit that updates the oojs-ui distribution
-# ./bin/update-oojs-ui.sh path/to/repo/for/oojs-ui
-
-function oojsuihash() {
-       grep "OOjs UI v" resources/oojs-ui/oojs-ui.js \
-               | head -n 1 \
-               | grep -Eo '\([a-z0-9]+\)' \
-               | sed 's/^(//' \
-               | sed 's/)$//'
-}
-
-function oojsuitag() {
-       grep "OOjs UI v" resources/oojs-ui/oojs-ui.js \
-               | head -n 1 \
-               | grep -Eo '\bv[0-9a-z.-]+\b'
-}
-
-function oojsuiversion() {
-       grep "OOjs UI v" resources/oojs-ui/oojs-ui.js \
-               | head -n 1 \
-               | grep -Eo '\bv[0-9a-z.-]+\b.*$'
-}
-
-# cd to the VisualEditor directory
-cd $(cd $(dirname $0)/../..; pwd)
-
-if [ "x$1" == "x" ]
-then
-       echo >&2 "Usage: update-oojs-ui.sh path/to/repo/for/oojs-ui"
-       exit 1
-fi
-
-# Undo any changes in the oojs-ui directory
-git reset resources/oojs-ui/
-git checkout resources/oojs-ui/
-
-git fetch origin
-# Create a branch of MW if needed, and reset it to master
-git checkout -B update-oojsui origin/master
-
-# Get the old oojs-ui version
-OLDVERSION=$(oojsuihash)
-if [ "x$OLDVERSION" == "x" ]
-then
-       TAG=$(oojsuitag)
-fi
-
-# cd to the oojs-ui directory
-cd $1 || exit 1
-if [ "x$OLDVERSION" == "x" ]
-then
-       # Try the tag
-       OLDVERSION=$(git rev-parse $TAG)
-       if [ $? != 0 ]
-       then
-               echo Could not find OOjs UI version
-               cd -
-               exit 1
-       fi
-fi
-if [ "$(git rev-parse $OLDVERSION)" == "$(git rev-parse HEAD)" ]
-then
-       echo "No changes (already at $OLDVERSION)"
-       cd -
-       exit 0
-fi
-# Build the distribution
-npm install || exit 1
-grunt || exit 1
-# Get the list of changes
-NEWCHANGES=$(git log $OLDVERSION.. --oneline --no-merges --reverse --color=never)
-NEWCHANGESDISPLAY=$(git log $OLDVERSION.. --oneline --no-merges --reverse --color=always)
-# cd back to the VisualEditor directory
-cd -
-
-# Copy files from dist/ to resources/oojs-ui
-cp -a $1/dist/{oojs-ui.js,oojs-ui.svg.css,oojs-ui-apex.css,oojs-ui-agora.css,images,i18n} resources/oojs-ui/
-# Figure out what the new version is
-NEWVERSION=$(oojsuiversion)
-# Generate commit summary
-COMMITMSG=$(cat <<END
-Update OOjs UI to $NEWVERSION
-
-New changes:
-$NEWCHANGES
-END
-)
-# Commit
-git commit resources/oojs-ui/ -m "$COMMITMSG"
-cat >&2 <<END
-
-
-Created commit with changes:
-$NEWCHANGESDISPLAY
-END
diff --git a/resources/oojs/oojs.js b/resources/oojs/oojs.js
deleted file mode 100644 (file)
index f953878..0000000
+++ /dev/null
@@ -1,844 +0,0 @@
-/*!
- * OOjs v1.0.9
- * https://www.mediawiki.org/wiki/OOjs
- *
- * Copyright 2011-2014 OOjs Team and other contributors.
- * Released under the MIT license
- * http://oojs.mit-license.org
- *
- * Date: Wed Apr 02 2014 14:29:36 GMT-0700 (PDT)
- */
-( function ( global ) {
-
-'use strict';
-var
-       /**
-        * Namespace for all classes, static methods and static properties.
-        * @class OO
-        * @singleton
-        */
-       oo = {},
-       hasOwn = oo.hasOwnProperty,
-       toString = oo.toString;
-
-/* Class Methods */
-
-/**
- * Assert whether a value is a plain object or not.
- *
- * @param {Mixed} obj
- * @return {boolean}
- */
-oo.isPlainObject = function ( obj ) {
-       // Any object or value whose internal [[Class]] property is not "[object Object]"
-       if ( toString.call( obj ) !== '[object Object]' ) {
-               return false;
-       }
-
-       // The try/catch suppresses exceptions thrown when attempting to access
-       // the "constructor" property of certain host objects suich as window.location
-       // in Firefox < 20 (https://bugzilla.mozilla.org/814622)
-       try {
-               if ( obj.constructor &&
-                               !hasOwn.call( obj.constructor.prototype, 'isPrototypeOf' ) ) {
-                       return false;
-               }
-       } catch ( e ) {
-               return false;
-       }
-
-       return true;
-};
-
-/**
- * Utility to initialize a class for OO inheritance.
- *
- * Currently this just initializes an empty static object.
- *
- * @param {Function} fn
- */
-oo.initClass = function ( fn ) {
-       fn.static = fn.static || {};
-};
-
-/**
- * Utility for common usage of Object#create for inheriting from one
- * prototype to another.
- *
- * Beware: This redefines the prototype, call before setting your prototypes.
- * Beware: This redefines the prototype, can only be called once on a function.
- *  If called multiple times on the same function, the previous prototype is lost.
- *  This is how prototypal inheritance works, it can only be one straight chain
- *  (just like classical inheritance in PHP for example). If you need to work with
- *  multiple constructors consider storing an instance of the other constructor in a
- *  property instead, or perhaps use a mixin (see OO.mixinClass).
- *
- *     function Thing() {}
- *     Thing.prototype.exists = function () {};
- *
- *     function Person() {
- *         Person.super.apply( this, arguments );
- *     }
- *     OO.inheritClass( Person, Thing );
- *     Person.static.defaultEyeCount = 2;
- *     Person.prototype.walk = function () {};
- *
- *     function Jumper() {
- *         Jumper.super.apply( this, arguments );
- *     }
- *     OO.inheritClass( Jumper, Person );
- *     Jumper.prototype.jump = function () {};
- *
- *     Jumper.static.defaultEyeCount === 2;
- *     var x = new Jumper();
- *     x.jump();
- *     x.walk();
- *     x instanceof Thing && x instanceof Person && x instanceof Jumper;
- *
- * @param {Function} targetFn
- * @param {Function} originFn
- * @throws {Error} If target already inherits from origin
- */
-oo.inheritClass = function ( targetFn, originFn ) {
-       if ( targetFn.prototype instanceof originFn ) {
-               throw new Error( 'Target already inherits from origin' );
-       }
-
-       var targetConstructor = targetFn.prototype.constructor;
-
-       targetFn.super = originFn;
-       targetFn.prototype = Object.create( originFn.prototype, {
-               // Restore constructor property of targetFn
-               constructor: {
-                       value: targetConstructor,
-                       enumerable: false,
-                       writable: true,
-                       configurable: true
-               }
-       } );
-
-       // Extend static properties - always initialize both sides
-       oo.initClass( originFn );
-       targetFn.static = Object.create( originFn.static );
-};
-
-/**
- * Utility to copy over *own* prototype properties of a mixin.
- * The 'constructor' (whether implicit or explicit) is not copied over.
- *
- * This does not create inheritance to the origin. If inheritance is needed
- * use oo.inheritClass instead.
- *
- * Beware: This can redefine a prototype property, call before setting your prototypes.
- * Beware: Don't call before oo.inheritClass.
- *
- *     function Foo() {}
- *     function Context() {}
- *
- *     // Avoid repeating this code
- *     function ContextLazyLoad() {}
- *     ContextLazyLoad.prototype.getContext = function () {
- *         if ( !this.context ) {
- *             this.context = new Context();
- *         }
- *         return this.context;
- *     };
- *
- *     function FooBar() {}
- *     OO.inheritClass( FooBar, Foo );
- *     OO.mixinClass( FooBar, ContextLazyLoad );
- *
- * @param {Function} targetFn
- * @param {Function} originFn
- */
-oo.mixinClass = function ( targetFn, originFn ) {
-       var key;
-
-       // Copy prototype properties
-       for ( key in originFn.prototype ) {
-               if ( key !== 'constructor' && hasOwn.call( originFn.prototype, key ) ) {
-                       targetFn.prototype[key] = originFn.prototype[key];
-               }
-       }
-
-       // Copy static properties - always initialize both sides
-       oo.initClass( targetFn );
-       if ( originFn.static ) {
-               for ( key in originFn.static ) {
-                       if ( hasOwn.call( originFn.static, key ) ) {
-                               targetFn.static[key] = originFn.static[key];
-                       }
-               }
-       } else {
-               oo.initClass( originFn );
-       }
-};
-
-/* Object Methods */
-
-/**
- * Create a new object that is an instance of the same
- * constructor as the input, inherits from the same object
- * and contains the same own properties.
- *
- * This makes a shallow non-recursive copy of own properties.
- * To create a recursive copy of plain objects, use #copy.
- *
- *     var foo = new Person( mom, dad );
- *     foo.setAge( 21 );
- *     var foo2 = OO.cloneObject( foo );
- *     foo.setAge( 22 );
- *
- *     // Then
- *     foo2 !== foo; // true
- *     foo2 instanceof Person; // true
- *     foo2.getAge(); // 21
- *     foo.getAge(); // 22
- *
- * @param {Object} origin
- * @return {Object} Clone of origin
- */
-oo.cloneObject = function ( origin ) {
-       var key, r;
-
-       r = Object.create( origin.constructor.prototype );
-
-       for ( key in origin ) {
-               if ( hasOwn.call( origin, key ) ) {
-                       r[key] = origin[key];
-               }
-       }
-
-       return r;
-};
-
-/**
- * Get an array of all property values in an object.
- *
- * @param {Object} Object to get values from
- * @return {Array} List of object values
- */
-oo.getObjectValues = function ( obj ) {
-       var key, values;
-
-       if ( obj !== Object( obj ) ) {
-               throw new TypeError( 'Called on non-object' );
-       }
-
-       values = [];
-       for ( key in obj ) {
-               if ( hasOwn.call( obj, key ) ) {
-                       values[values.length] = obj[key];
-               }
-       }
-
-       return values;
-};
-
-/**
- * Recursively compares properties between two objects.
- *
- * A false result may be caused by property inequality or by properties in one object missing from
- * the other. An asymmetrical test may also be performed, which checks only that properties in the
- * first object are present in the second object, but not the inverse.
- *
- * @param {Object} a First object to compare
- * @param {Object} b Second object to compare
- * @param {boolean} [asymmetrical] Whether to check only that b contains values from a
- * @return {boolean} If the objects contain the same values as each other
- */
-oo.compare = function ( a, b, asymmetrical ) {
-       var aValue, bValue, aType, bType, k;
-
-       if ( a === b ) {
-               return true;
-       }
-
-       for ( k in a ) {
-               aValue = a[k];
-               bValue = b[k];
-               aType = typeof aValue;
-               bType = typeof bValue;
-               if ( aType !== bType ||
-                       ( ( aType === 'string' || aType === 'number' ) && aValue !== bValue ) ||
-                       ( aValue === Object( aValue ) && !oo.compare( aValue, bValue, asymmetrical ) ) ) {
-                       return false;
-               }
-       }
-       // If the check is not asymmetrical, recursing with the arguments swapped will verify our result
-       return asymmetrical ? true : oo.compare( b, a, true );
-};
-
-/**
- * Create a plain deep copy of any kind of object.
- *
- * Copies are deep, and will either be an object or an array depending on `source`.
- *
- * @param {Object} source Object to copy
- * @param {Function} [callback] Applied to leaf values before they added to the clone
- * @return {Object} Copy of source object
- */
-oo.copy = function ( source, callback ) {
-       var key, sourceValue, sourceType, destination;
-
-       if ( typeof source.clone === 'function' ) {
-               return source.clone();
-       }
-
-       destination = Array.isArray( source ) ? new Array( source.length ) : {};
-
-       for ( key in source ) {
-               sourceValue = source[key];
-               sourceType = typeof sourceValue;
-               if ( Array.isArray( sourceValue ) ) {
-                       // Array
-                       destination[key] = oo.copy( sourceValue, callback );
-               } else if ( sourceValue && typeof sourceValue.clone === 'function' ) {
-                       // Duck type object with custom clone method
-                       destination[key] = callback ?
-                               callback( sourceValue.clone() ) : sourceValue.clone();
-               } else if ( sourceValue && typeof sourceValue.cloneNode === 'function' ) {
-                       // DOM Node
-                       destination[key] = callback ?
-                               callback( sourceValue.cloneNode( true ) ) : sourceValue.cloneNode( true );
-               } else if ( oo.isPlainObject( sourceValue ) ) {
-                       // Plain objects
-                       destination[key] = oo.copy( sourceValue, callback );
-               } else {
-                       // Non-plain objects (incl. functions) and primitive values
-                       destination[key] = callback ? callback( sourceValue ) : sourceValue;
-               }
-       }
-
-       return destination;
-};
-
-/**
- * Generate a hash of an object based on its name and data.
- *
- * Performance optimization: <http://jsperf.com/ve-gethash-201208#/toJson_fnReplacerIfAoForElse>
- *
- * To avoid two objects with the same values generating different hashes, we utilize the replacer
- * argument of JSON.stringify and sort the object by key as it's being serialized. This may or may
- * not be the fastest way to do this; we should investigate this further.
- *
- * Objects and arrays are hashed recursively. When hashing an object that has a .getHash()
- * function, we call that function and use its return value rather than hashing the object
- * ourselves. This allows classes to define custom hashing.
- *
- * @param {Object} val Object to generate hash for
- * @return {string} Hash of object
- */
-oo.getHash = function ( val ) {
-       return JSON.stringify( val, oo.getHash.keySortReplacer );
-};
-
-/**
- * Helper function for OO.getHash which sorts objects by key.
- *
- * This is a callback passed into JSON.stringify.
- *
- * @method getHash_keySortReplacer
- * @param {string} key Property name of value being replaced
- * @param {Mixed} val Property value to replace
- * @return {Mixed} Replacement value
- */
-oo.getHash.keySortReplacer = function ( key, val ) {
-       var normalized, keys, i, len;
-       if ( val && typeof val.getHashObject === 'function' ) {
-               // This object has its own custom hash function, use it
-               val = val.getHashObject();
-       }
-       if ( !Array.isArray( val ) && Object( val ) === val ) {
-               // Only normalize objects when the key-order is ambiguous
-               // (e.g. any object not an array).
-               normalized = {};
-               keys = Object.keys( val ).sort();
-               i = 0;
-               len = keys.length;
-               for ( ; i < len; i += 1 ) {
-                       normalized[keys[i]] = val[keys[i]];
-               }
-               return normalized;
-
-       // Primitive values and arrays get stable hashes
-       // by default. Lets those be stringified as-is.
-       } else {
-               return val;
-       }
-};
-
-/**
- * Compute the union (duplicate-free merge) of a set of arrays.
- *
- * Arrays values must be convertable to object keys (strings).
- *
- * By building an object (with the values for keys) in parallel with
- * the array, a new item's existence in the union can be computed faster.
- *
- * @param {Array...} arrays Arrays to union
- * @return {Array} Union of the arrays
- */
-oo.simpleArrayUnion = function () {
-       var i, ilen, arr, j, jlen,
-               obj = {},
-               result = [];
-
-       for ( i = 0, ilen = arguments.length; i < ilen; i++ ) {
-               arr = arguments[i];
-               for ( j = 0, jlen = arr.length; j < jlen; j++ ) {
-                       if ( !obj[ arr[j] ] ) {
-                               obj[ arr[j] ] = true;
-                               result.push( arr[j] );
-                       }
-               }
-       }
-
-       return result;
-};
-
-/**
- * Combine arrays (intersection or difference).
- *
- * An intersection checks the item exists in 'b' while difference checks it doesn't.
- *
- * Arrays values must be convertable to object keys (strings).
- *
- * By building an object (with the values for keys) of 'b' we can
- * compute the result faster.
- *
- * @private
- * @param {Array} a First array
- * @param {Array} b Second array
- * @param {boolean} includeB Whether to items in 'b'
- * @return {Array} Combination (intersection or difference) of arrays
- */
-function simpleArrayCombine( a, b, includeB ) {
-       var i, ilen, isInB,
-               bObj = {},
-               result = [];
-
-       for ( i = 0, ilen = b.length; i < ilen; i++ ) {
-               bObj[ b[i] ] = true;
-       }
-
-       for ( i = 0, ilen = a.length; i < ilen; i++ ) {
-               isInB = !!bObj[ a[i] ];
-               if ( isInB === includeB ) {
-                       result.push( a[i] );
-               }
-       }
-
-       return result;
-}
-
-/**
- * Compute the intersection of two arrays (items in both arrays).
- *
- * Arrays values must be convertable to object keys (strings).
- *
- * @param {Array} a First array
- * @param {Array} b Second array
- * @return {Array} Intersection of arrays
- */
-oo.simpleArrayIntersection = function ( a, b ) {
-       return simpleArrayCombine( a, b, true );
-};
-
-/**
- * Compute the difference of two arrays (items in 'a' but not 'b').
- *
- * Arrays values must be convertable to object keys (strings).
- *
- * @param {Array} a First array
- * @param {Array} b Second array
- * @return {Array} Intersection of arrays
- */
-oo.simpleArrayDifference = function ( a, b ) {
-       return simpleArrayCombine( a, b, false );
-};
-/**
- * @class OO.EventEmitter
- *
- * @constructor
- */
-oo.EventEmitter = function OoEventEmitter() {
-       // Properties
-
-       /**
-        * Storage of bound event handlers by event name.
-        *
-        * @property
-        */
-       this.bindings = {};
-};
-
-/* Methods */
-
-/**
- * Add a listener to events of a specific event.
- *
- * If the callback/context are already bound to the event, they will not be bound again.
- *
- * @param {string} event Type of event to listen to
- * @param {Function} callback Function to call when event occurs
- * @param {Array} [args] Arguments to pass to listener, will be prepended to emitted arguments
- * @param {Object} [context=null] Object to use as context for callback function or call method on
- * @throws {Error} Listener argument is not a function or method name
- * @chainable
- */
-oo.EventEmitter.prototype.on = function ( event, callback, args, context ) {
-       var i, bindings, binding;
-
-       // Validate callback
-       if ( typeof callback !== 'function' ) {
-               throw new Error( 'Invalid callback. Function or method name expected.' );
-       }
-       // Fallback to null context
-       if ( arguments.length < 4 ) {
-               context = null;
-       }
-       if ( this.bindings.hasOwnProperty( event ) ) {
-               // Check for duplicate callback and context for this event
-               bindings = this.bindings[event];
-               i = bindings.length;
-               while ( i-- ) {
-                       binding = bindings[i];
-                       if ( bindings.callback === callback && bindings.context === context ) {
-                               return this;
-                       }
-               }
-       } else {
-               // Auto-initialize bindings list
-               bindings = this.bindings[event] = [];
-       }
-       // Add binding
-       bindings.push( {
-               callback: callback,
-               args: args,
-               context: context
-       } );
-       return this;
-};
-
-/**
- * Adds a one-time listener to a specific event.
- *
- * @param {string} event Type of event to listen to
- * @param {Function} listener Listener to call when event occurs
- * @chainable
- */
-oo.EventEmitter.prototype.once = function ( event, listener ) {
-       var eventEmitter = this;
-       return this.on( event, function listenerWrapper() {
-               eventEmitter.off( event, listenerWrapper );
-               listener.apply( eventEmitter, Array.prototype.slice.call( arguments, 0 ) );
-       } );
-};
-
-/**
- * Remove a specific listener from a specific event.
- *
- * @param {string} event Type of event to remove listener from
- * @param {Function} [callback] Listener to remove, omit to remove all
- * @param {Object} [context=null] Object used context for callback function or method
- * @chainable
- * @throws {Error} Listener argument is not a function
- */
-oo.EventEmitter.prototype.off = function ( event, callback, context ) {
-       var i, bindings;
-
-       if ( arguments.length === 1 ) {
-               // Remove all bindings for event
-               if ( event in this.bindings ) {
-                       delete this.bindings[event];
-               }
-       } else {
-               if ( typeof callback !== 'function' ) {
-                       throw new Error( 'Invalid callback. Function expected.' );
-               }
-               if ( !( event in this.bindings ) || !this.bindings[event].length ) {
-                       // No matching bindings
-                       return this;
-               }
-               // Fallback to null context
-               if ( arguments.length < 3 ) {
-                       context = null;
-               }
-               // Remove matching handlers
-               bindings = this.bindings[event];
-               i = bindings.length;
-               while ( i-- ) {
-                       if ( bindings[i].callback === callback && bindings[i].context === context ) {
-                               bindings.splice( i, 1 );
-                       }
-               }
-               // Cleanup if now empty
-               if ( bindings.length === 0 ) {
-                       delete this.bindings[event];
-               }
-       }
-       return this;
-};
-
-/**
- * Emit an event.
- *
- * TODO: Should this be chainable? What is the usefulness of the boolean
- * return value here?
- *
- * @param {string} event Type of event
- * @param {Mixed} args First in a list of variadic arguments passed to event handler (optional)
- * @return {boolean} If event was handled by at least one listener
- */
-oo.EventEmitter.prototype.emit = function ( event ) {
-       var i, len, binding, bindings, args;
-
-       if ( event in this.bindings ) {
-               // Slicing ensures that we don't get tripped up by event handlers that add/remove bindings
-               bindings = this.bindings[event].slice();
-               args = Array.prototype.slice.call( arguments, 1 );
-               for ( i = 0, len = bindings.length; i < len; i++ ) {
-                       binding = bindings[i];
-                       binding.callback.apply(
-                               binding.context,
-                               binding.args ? binding.args.concat( args ) : args
-                       );
-               }
-               return true;
-       }
-       return false;
-};
-
-/**
- * Connect event handlers to an object.
- *
- * @param {Object} context Object to call methods on when events occur
- * @param {Object.<string,string>|Object.<string,Function>|Object.<string,Array>} methods List of
- *  event bindings keyed by event name containing either method names, functions or arrays containing
- *  method name or function followed by a list of arguments to be passed to callback before emitted
- *  arguments
- * @chainable
- */
-oo.EventEmitter.prototype.connect = function ( context, methods ) {
-       var method, callback, args, event;
-
-       for ( event in methods ) {
-               method = methods[event];
-               // Allow providing additional args
-               if ( Array.isArray( method ) ) {
-                       args = method.slice( 1 );
-                       method = method[0];
-               } else {
-                       args = [];
-               }
-               // Allow callback to be a method name
-               if ( typeof method === 'string' ) {
-                       // Validate method
-                       if ( !context[method] || typeof context[method] !== 'function' ) {
-                               throw new Error( 'Method not found: ' + method );
-                       }
-                       // Resolve to function
-                       callback = context[method];
-               } else {
-                       callback = method;
-               }
-               // Add binding
-               this.on.apply( this, [ event, callback, args, context ] );
-       }
-       return this;
-};
-
-/**
- * Disconnect event handlers from an object.
- *
- * @param {Object} context Object to disconnect methods from
- * @param {Object.<string,string>|Object.<string,Function>|Object.<string,Array>} [methods] List of
- * event bindings keyed by event name containing either method names or functions
- * @chainable
- */
-oo.EventEmitter.prototype.disconnect = function ( context, methods ) {
-       var i, method, callback, event, bindings;
-
-       if ( methods ) {
-               // Remove specific connections to the context
-               for ( event in methods ) {
-                       method = methods[event];
-                       if ( typeof method === 'string' ) {
-                               // Validate method
-                               if ( !context[method] || typeof context[method] !== 'function' ) {
-                                       throw new Error( 'Method not found: ' + method );
-                               }
-                               // Resolve to function
-                               callback = context[method];
-                       } else {
-                               callback = method;
-                       }
-                       this.off( event, callback, context );
-               }
-       } else {
-               // Remove all connections to the context
-               for ( event in this.bindings ) {
-                       bindings = this.bindings[event];
-                       i = bindings.length;
-                       while ( i-- ) {
-                               if ( bindings[i].context === context ) {
-                                       this.off( event, bindings[i].callback, context );
-                               }
-                       }
-               }
-       }
-
-       return this;
-};
-/**
- * @class OO.Registry
- * @mixins OO.EventEmitter
- *
- * @constructor
- */
-oo.Registry = function OoRegistry() {
-       // Mixin constructors
-       oo.EventEmitter.call( this );
-
-       // Properties
-       this.registry = {};
-};
-
-/* Inheritance */
-
-oo.mixinClass( oo.Registry, oo.EventEmitter );
-
-/* Events */
-
-/**
- * @event register
- * @param {string} name
- * @param {Mixed} data
- */
-
-/* Methods */
-
-/**
- * Associate one or more symbolic names with some data.
- *
- * Only the base name will be registered, overriding any existing entry with the same base name.
- *
- * @param {string|string[]} name Symbolic name or list of symbolic names
- * @param {Mixed} data Data to associate with symbolic name
- * @fires register
- * @throws {Error} Name argument must be a string or array
- */
-oo.Registry.prototype.register = function ( name, data ) {
-       var i, len;
-       if ( typeof name === 'string' ) {
-               this.registry[name] = data;
-               this.emit( 'register', name, data );
-       } else if ( Array.isArray( name ) ) {
-               for ( i = 0, len = name.length; i < len; i++ ) {
-                       this.register( name[i], data );
-               }
-       } else {
-               throw new Error( 'Name must be a string or array, cannot be a ' + typeof name );
-       }
-};
-
-/**
- * Get data for a given symbolic name.
- *
- * Lookups are done using the base name.
- *
- * @param {string} name Symbolic name
- * @return {Mixed|undefined} Data associated with symbolic name
- */
-oo.Registry.prototype.lookup = function ( name ) {
-       return this.registry[name];
-};
-/**
- * @class OO.Factory
- * @extends OO.Registry
- *
- * @constructor
- */
-oo.Factory = function OoFactory() {
-       oo.Factory.super.call( this );
-
-       // Properties
-       this.entries = [];
-};
-
-/* Inheritance */
-
-oo.inheritClass( oo.Factory, oo.Registry );
-
-/* Methods */
-
-/**
- * Register a constructor with the factory.
- *
- * Classes must have a static `name` property to be registered.
- *
- *     function MyClass() {};
- *     OO.initClass( MyClass );
- *     // Adds a static property to the class defining a symbolic name
- *     MyClass.static.name = 'mine';
- *     // Registers class with factory, available via symbolic name 'mine'
- *     factory.register( MyClass );
- *
- * @param {Function} constructor Constructor to use when creating object
- * @throws {Error} Name must be a string and must not be empty
- * @throws {Error} Constructor must be a function
- */
-oo.Factory.prototype.register = function ( constructor ) {
-       var name;
-
-       if ( typeof constructor !== 'function' ) {
-               throw new Error( 'constructor must be a function, cannot be a ' + typeof constructor );
-       }
-       name = constructor.static && constructor.static.name;
-       if ( typeof name !== 'string' || name === '' ) {
-               throw new Error( 'Name must be a string and must not be empty' );
-       }
-       this.entries.push( name );
-
-       oo.Factory.super.prototype.register.call( this, name, constructor );
-};
-
-/**
- * Create an object based on a name.
- *
- * Name is used to look up the constructor to use, while all additional arguments are passed to the
- * constructor directly, so leaving one out will pass an undefined to the constructor.
- *
- * @param {string} name Object name
- * @param {Mixed...} [args] Arguments to pass to the constructor
- * @return {Object} The new object
- * @throws {Error} Unknown object name
- */
-oo.Factory.prototype.create = function ( name ) {
-       var args, obj, constructor;
-
-       if ( !this.registry.hasOwnProperty( name ) ) {
-               throw new Error( 'No class registered by that name: ' + name );
-       }
-       constructor = this.registry[name];
-
-       // Convert arguments to array and shift the first argument (name) off
-       args = Array.prototype.slice.call( arguments, 1 );
-
-       // We can't use the "new" operator with .apply directly because apply needs a
-       // context. So instead just do what "new" does: create an object that inherits from
-       // the constructor's prototype (which also makes it an "instanceof" the constructor),
-       // then invoke the constructor with the object as context, and return it (ignoring
-       // the constructor's return value).
-       obj = Object.create( constructor.prototype );
-       constructor.apply( obj, args );
-       return obj;
-};
-/*jshint node:true */
-if ( typeof module !== 'undefined' && module.exports ) {
-       module.exports = oo;
-} else {
-       global.OO = oo;
-}
-}( this ) );
diff --git a/resources/oojs/update-oojs.sh b/resources/oojs/update-oojs.sh
deleted file mode 100755 (executable)
index 57c7625..0000000
+++ /dev/null
@@ -1,99 +0,0 @@
-#!/usr/bin/env bash
-
-# FIXME this script is duplicated from update-oojs-ui.sh - factor this out
-
-# This script generates a commit that updates the oojs distribution
-# ./bin/update-oojs.sh path/to/repo/for/oojs
-
-function oojshash() {
-       grep "OOjs v" resources/oojs/oojs.js \
-               | head -n 1 \
-               | grep -Eo '\([a-z0-9]+\)' \
-               | sed 's/^(//' \
-               | sed 's/)$//'
-}
-
-function oojstag() {
-       grep "OOjs v" resources/oojs/oojs.js \
-               | head -n 1 \
-               | grep -Eo '\bv[0-9a-z.-]+\b'
-}
-
-function oojsversion() {
-       grep "OOjs v" resources/oojs/oojs.js \
-               | head -n 1 \
-               | grep -Eo '\bv[0-9a-z.-]+\b.*$'
-}
-
-# cd to the MW directory
-cd $(cd $(dirname $0)/../..; pwd)
-
-if [ "x$1" == "x" ]
-then
-       echo >&2 "Usage: update-oojs.sh path/to/repo/for/oojs"
-       exit 1
-fi
-
-# Undo any changes in the oojs directory
-git reset resources/oojs/
-git checkout resources/oojs/
-
-git fetch origin
-# Create a branch of MW if needed, and reset it to master
-git checkout -B update-oojs origin/master
-
-# Get the old oojs version
-OLDVERSION=$(oojshash)
-if [ "x$OLDVERSION" == "x" ]
-then
-       TAG=$(oojstag)
-fi
-
-# cd to the oojs directory
-cd $1 || exit 1
-if [ "x$OLDVERSION" == "x" ]
-then
-       # Try the tag
-       OLDVERSION=$(git rev-parse $TAG)
-       if [ $? != 0 ]
-       then
-               echo Could not find OOjs version
-               cd -
-               exit 1
-       fi
-fi
-if [ "$(git rev-parse $OLDVERSION)" == "$(git rev-parse HEAD)" ]
-then
-       echo "No changes (already at $OLDVERSION)"
-       cd -
-       exit 0
-fi
-# Build the distribution
-npm install || exit 1
-grunt || exit 1
-# Get the list of changes
-NEWCHANGES=$(git log $OLDVERSION.. --oneline --no-merges --reverse --color=never)
-NEWCHANGESDISPLAY=$(git log $OLDVERSION.. --oneline --no-merges --reverse --color=always)
-# cd back to the VisualEditor directory
-cd -
-
-# Copy files from dist/ to resources/oojs/
-cp -a $1/dist/* resources/oojs/
-# Figure out what the new version is
-NEWVERSION=$(oojsversion)
-# Generate commit summary
-COMMITMSG=$(cat <<END
-Update OOjs to $NEWVERSION
-
-New changes:
-$NEWCHANGES
-END
-)
-# Commit
-git commit resources/oojs/ -m "$COMMITMSG"
-cat >&2 <<END
-
-
-Created commit with changes:
-$NEWCHANGESDISPLAY
-END
diff --git a/resources/package.json b/resources/package.json
deleted file mode 100644 (file)
index a1722b5..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-{
-       "name": "mediawiki-ui-dependencies",
-       "description": "Node.js dependencies used for KSS generation",
-       "version": "0.0.1",
-       "dependencies": {
-               "kss": ">=0.3.6"
-       },
-       "repository" : {
-               "type" : "git",
-               "url" : "https://gerrit.wikimedia.org/r/p/mediawiki/core.git"
-       }
-
-}
diff --git a/resources/scripts/nodecheck.sh b/resources/scripts/nodecheck.sh
deleted file mode 100755 (executable)
index 3ee0f83..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-#!/usr/bin/env bash
-if command -v npm > /dev/null ; then
-  npm install
-else
-  echo "You need to install Node.JS!"
-  echo "See http://nodejs.org/"
-  exit 1
-fi
diff --git a/resources/sinonjs/sinon-1.9.0.js b/resources/sinonjs/sinon-1.9.0.js
deleted file mode 100644 (file)
index 428b729..0000000
+++ /dev/null
@@ -1,4794 +0,0 @@
-/**
- * Sinon.JS 1.9.0, 2014/03/05
- *
- * @author Christian Johansen (christian@cjohansen.no)
- * @author Contributors: https://github.com/cjohansen/Sinon.JS/blob/master/AUTHORS
- *
- * (The BSD License)
- * 
- * Copyright (c) 2010-2014, Christian Johansen, christian@cjohansen.no
- * All rights reserved.
- * 
- * Redistribution and use in source and binary forms, with or without modification,
- * are permitted provided that the following conditions are met:
- * 
- *     * Redistributions of source code must retain the above copyright notice,
- *       this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above copyright notice,
- *       this list of conditions and the following disclaimer in the documentation
- *       and/or other materials provided with the distribution.
- *     * Neither the name of Christian Johansen nor the names of his contributors
- *       may be used to endorse or promote products derived from this software
- *       without specific prior written permission.
- * 
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
- * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-this.sinon = (function () {
-var samsam, formatio;
-function define(mod, deps, fn) { if (mod == "samsam") { samsam = deps(); } else { formatio = fn(samsam); } }
-define.amd = true;
-((typeof define === "function" && define.amd && function (m) { define("samsam", m); }) ||
- (typeof module === "object" &&
-      function (m) { module.exports = m(); }) || // Node
- function (m) { this.samsam = m(); } // Browser globals
-)(function () {
-    var o = Object.prototype;
-    var div = typeof document !== "undefined" && document.createElement("div");
-
-    function isNaN(value) {
-        // Unlike global isNaN, this avoids type coercion
-        // typeof check avoids IE host object issues, hat tip to
-        // lodash
-        var val = value; // JsLint thinks value !== value is "weird"
-        return typeof value === "number" && value !== val;
-    }
-
-    function getClass(value) {
-        // Returns the internal [[Class]] by calling Object.prototype.toString
-        // with the provided value as this. Return value is a string, naming the
-        // internal class, e.g. "Array"
-        return o.toString.call(value).split(/[ \]]/)[1];
-    }
-
-    /**
-     * @name samsam.isArguments
-     * @param Object object
-     *
-     * Returns ``true`` if ``object`` is an ``arguments`` object,
-     * ``false`` otherwise.
-     */
-    function isArguments(object) {
-        if (typeof object !== "object" || typeof object.length !== "number" ||
-                getClass(object) === "Array") {
-            return false;
-        }
-        if (typeof object.callee == "function") { return true; }
-        try {
-            object[object.length] = 6;
-            delete object[object.length];
-        } catch (e) {
-            return true;
-        }
-        return false;
-    }
-
-    /**
-     * @name samsam.isElement
-     * @param Object object
-     *
-     * Returns ``true`` if ``object`` is a DOM element node. Unlike
-     * Underscore.js/lodash, this function will return ``false`` if ``object``
-     * is an *element-like* object, i.e. a regular object with a ``nodeType``
-     * property that holds the value ``1``.
-     */
-    function isElement(object) {
-        if (!object || object.nodeType !== 1 || !div) { return false; }
-        try {
-            object.appendChild(div);
-            object.removeChild(div);
-        } catch (e) {
-            return false;
-        }
-        return true;
-    }
-
-    /**
-     * @name samsam.keys
-     * @param Object object
-     *
-     * Return an array of own property names.
-     */
-    function keys(object) {
-        var ks = [], prop;
-        for (prop in object) {
-            if (o.hasOwnProperty.call(object, prop)) { ks.push(prop); }
-        }
-        return ks;
-    }
-
-    /**
-     * @name samsam.isDate
-     * @param Object value
-     *
-     * Returns true if the object is a ``Date``, or *date-like*. Duck typing
-     * of date objects work by checking that the object has a ``getTime``
-     * function whose return value equals the return value from the object's
-     * ``valueOf``.
-     */
-    function isDate(value) {
-        return typeof value.getTime == "function" &&
-            value.getTime() == value.valueOf();
-    }
-
-    /**
-     * @name samsam.isNegZero
-     * @param Object value
-     *
-     * Returns ``true`` if ``value`` is ``-0``.
-     */
-    function isNegZero(value) {
-        return value === 0 && 1 / value === -Infinity;
-    }
-
-    /**
-     * @name samsam.equal
-     * @param Object obj1
-     * @param Object obj2
-     *
-     * Returns ``true`` if two objects are strictly equal. Compared to
-     * ``===`` there are two exceptions:
-     *
-     *   - NaN is considered equal to NaN
-     *   - -0 and +0 are not considered equal
-     */
-    function identical(obj1, obj2) {
-        if (obj1 === obj2 || (isNaN(obj1) && isNaN(obj2))) {
-            return obj1 !== 0 || isNegZero(obj1) === isNegZero(obj2);
-        }
-    }
-
-
-    /**
-     * @name samsam.deepEqual
-     * @param Object obj1
-     * @param Object obj2
-     *
-     * Deep equal comparison. Two values are "deep equal" if:
-     *
-     *   - They are equal, according to samsam.identical
-     *   - They are both date objects representing the same time
-     *   - They are both arrays containing elements that are all deepEqual
-     *   - They are objects with the same set of properties, and each property
-     *     in ``obj1`` is deepEqual to the corresponding property in ``obj2``
-     *
-     * Supports cyclic objects.
-     */
-    function deepEqualCyclic(obj1, obj2) {
-
-        // used for cyclic comparison
-        // contain already visited objects
-        var objects1 = [],
-            objects2 = [],
-        // contain pathes (position in the object structure)
-        // of the already visited objects
-        // indexes same as in objects arrays
-            paths1 = [],
-            paths2 = [],
-        // contains combinations of already compared objects
-        // in the manner: { "$1['ref']$2['ref']": true }
-            compared = {};
-
-        /**
-         * used to check, if the value of a property is an object
-         * (cyclic logic is only needed for objects)
-         * only needed for cyclic logic
-         */
-        function isObject(value) {
-
-            if (typeof value === 'object' && value !== null &&
-                    !(value instanceof Boolean) &&
-                    !(value instanceof Date)    &&
-                    !(value instanceof Number)  &&
-                    !(value instanceof RegExp)  &&
-                    !(value instanceof String)) {
-
-                return true;
-            }
-
-            return false;
-        }
-
-        /**
-         * returns the index of the given object in the
-         * given objects array, -1 if not contained
-         * only needed for cyclic logic
-         */
-        function getIndex(objects, obj) {
-
-            var i;
-            for (i = 0; i < objects.length; i++) {
-                if (objects[i] === obj) {
-                    return i;
-                }
-            }
-
-            return -1;
-        }
-
-        // does the recursion for the deep equal check
-        return (function deepEqual(obj1, obj2, path1, path2) {
-            var type1 = typeof obj1;
-            var type2 = typeof obj2;
-
-            // == null also matches undefined
-            if (obj1 === obj2 ||
-                    isNaN(obj1) || isNaN(obj2) ||
-                    obj1 == null || obj2 == null ||
-                    type1 !== "object" || type2 !== "object") {
-
-                return identical(obj1, obj2);
-            }
-
-            // Elements are only equal if identical(expected, actual)
-            if (isElement(obj1) || isElement(obj2)) { return false; }
-
-            var isDate1 = isDate(obj1), isDate2 = isDate(obj2);
-            if (isDate1 || isDate2) {
-                if (!isDate1 || !isDate2 || obj1.getTime() !== obj2.getTime()) {
-                    return false;
-                }
-            }
-
-            if (obj1 instanceof RegExp && obj2 instanceof RegExp) {
-                if (obj1.toString() !== obj2.toString()) { return false; }
-            }
-
-            var class1 = getClass(obj1);
-            var class2 = getClass(obj2);
-            var keys1 = keys(obj1);
-            var keys2 = keys(obj2);
-
-            if (isArguments(obj1) || isArguments(obj2)) {
-                if (obj1.length !== obj2.length) { return false; }
-            } else {
-                if (type1 !== type2 || class1 !== class2 ||
-                        keys1.length !== keys2.length) {
-                    return false;
-                }
-            }
-
-            var key, i, l,
-                // following vars are used for the cyclic logic
-                value1, value2,
-                isObject1, isObject2,
-                index1, index2,
-                newPath1, newPath2;
-
-            for (i = 0, l = keys1.length; i < l; i++) {
-                key = keys1[i];
-                if (!o.hasOwnProperty.call(obj2, key)) {
-                    return false;
-                }
-
-                // Start of the cyclic logic
-
-                value1 = obj1[key];
-                value2 = obj2[key];
-
-                isObject1 = isObject(value1);
-                isObject2 = isObject(value2);
-
-                // determine, if the objects were already visited
-                // (it's faster to check for isObject first, than to
-                // get -1 from getIndex for non objects)
-                index1 = isObject1 ? getIndex(objects1, value1) : -1;
-                index2 = isObject2 ? getIndex(objects2, value2) : -1;
-
-                // determine the new pathes of the objects
-                // - for non cyclic objects the current path will be extended
-                //   by current property name
-                // - for cyclic objects the stored path is taken
-                newPath1 = index1 !== -1
-                    ? paths1[index1]
-                    : path1 + '[' + JSON.stringify(key) + ']';
-                newPath2 = index2 !== -1
-                    ? paths2[index2]
-                    : path2 + '[' + JSON.stringify(key) + ']';
-
-                // stop recursion if current objects are already compared
-                if (compared[newPath1 + newPath2]) {
-                    return true;
-                }
-
-                // remember the current objects and their pathes
-                if (index1 === -1 && isObject1) {
-                    objects1.push(value1);
-                    paths1.push(newPath1);
-                }
-                if (index2 === -1 && isObject2) {
-                    objects2.push(value2);
-                    paths2.push(newPath2);
-                }
-
-                // remember that the current objects are already compared
-                if (isObject1 && isObject2) {
-                    compared[newPath1 + newPath2] = true;
-                }
-
-                // End of cyclic logic
-
-                // neither value1 nor value2 is a cycle
-                // continue with next level
-                if (!deepEqual(value1, value2, newPath1, newPath2)) {
-                    return false;
-                }
-            }
-
-            return true;
-
-        }(obj1, obj2, '$1', '$2'));
-    }
-
-    var match;
-
-    function arrayContains(array, subset) {
-        if (subset.length === 0) { return true; }
-        var i, l, j, k;
-        for (i = 0, l = array.length; i < l; ++i) {
-            if (match(array[i], subset[0])) {
-                for (j = 0, k = subset.length; j < k; ++j) {
-                    if (!match(array[i + j], subset[j])) { return false; }
-                }
-                return true;
-            }
-        }
-        return false;
-    }
-
-    /**
-     * @name samsam.match
-     * @param Object object
-     * @param Object matcher
-     *
-     * Compare arbitrary value ``object`` with matcher.
-     */
-    match = function match(object, matcher) {
-        if (matcher && typeof matcher.test === "function") {
-            return matcher.test(object);
-        }
-
-        if (typeof matcher === "function") {
-            return matcher(object) === true;
-        }
-
-        if (typeof matcher === "string") {
-            matcher = matcher.toLowerCase();
-            var notNull = typeof object === "string" || !!object;
-            return notNull &&
-                (String(object)).toLowerCase().indexOf(matcher) >= 0;
-        }
-
-        if (typeof matcher === "number") {
-            return matcher === object;
-        }
-
-        if (typeof matcher === "boolean") {
-            return matcher === object;
-        }
-
-        if (getClass(object) === "Array" && getClass(matcher) === "Array") {
-            return arrayContains(object, matcher);
-        }
-
-        if (matcher && typeof matcher === "object") {
-            var prop;
-            for (prop in matcher) {
-                if (!match(object[prop], matcher[prop])) {
-                    return false;
-                }
-            }
-            return true;
-        }
-
-        throw new Error("Matcher was not a string, a number, a " +
-                        "function, a boolean or an object");
-    };
-
-    return {
-        isArguments: isArguments,
-        isElement: isElement,
-        isDate: isDate,
-        isNegZero: isNegZero,
-        identical: identical,
-        deepEqual: deepEqualCyclic,
-        match: match,
-        keys: keys
-    };
-});
-((typeof define === "function" && define.amd && function (m) {
-    define("formatio", ["samsam"], m);
-}) || (typeof module === "object" && function (m) {
-    module.exports = m(require("samsam"));
-}) || function (m) { this.formatio = m(this.samsam); }
-)(function (samsam) {
-    
-    var formatio = {
-        excludeConstructors: ["Object", /^.$/],
-        quoteStrings: true
-    };
-
-    var hasOwn = Object.prototype.hasOwnProperty;
-
-    var specialObjects = [];
-    if (typeof global !== "undefined") {
-        specialObjects.push({ object: global, value: "[object global]" });
-    }
-    if (typeof document !== "undefined") {
-        specialObjects.push({
-            object: document,
-            value: "[object HTMLDocument]"
-        });
-    }
-    if (typeof window !== "undefined") {
-        specialObjects.push({ object: window, value: "[object Window]" });
-    }
-
-    function functionName(func) {
-        if (!func) { return ""; }
-        if (func.displayName) { return func.displayName; }
-        if (func.name) { return func.name; }
-        var matches = func.toString().match(/function\s+([^\(]+)/m);
-        return (matches && matches[1]) || "";
-    }
-
-    function constructorName(f, object) {
-        var name = functionName(object && object.constructor);
-        var excludes = f.excludeConstructors ||
-                formatio.excludeConstructors || [];
-
-        var i, l;
-        for (i = 0, l = excludes.length; i < l; ++i) {
-            if (typeof excludes[i] === "string" && excludes[i] === name) {
-                return "";
-            } else if (excludes[i].test && excludes[i].test(name)) {
-                return "";
-            }
-        }
-
-        return name;
-    }
-
-    function isCircular(object, objects) {
-        if (typeof object !== "object") { return false; }
-        var i, l;
-        for (i = 0, l = objects.length; i < l; ++i) {
-            if (objects[i] === object) { return true; }
-        }
-        return false;
-    }
-
-    function ascii(f, object, processed, indent) {
-        if (typeof object === "string") {
-            var qs = f.quoteStrings;
-            var quote = typeof qs !== "boolean" || qs;
-            return processed || quote ? '"' + object + '"' : object;
-        }
-
-        if (typeof object === "function" && !(object instanceof RegExp)) {
-            return ascii.func(object);
-        }
-
-        processed = processed || [];
-
-        if (isCircular(object, processed)) { return "[Circular]"; }
-
-        if (Object.prototype.toString.call(object) === "[object Array]") {
-            return ascii.array.call(f, object, processed);
-        }
-
-        if (!object) { return String((1/object) === -Infinity ? "-0" : object); }
-        if (samsam.isElement(object)) { return ascii.element(object); }
-
-        if (typeof object.toString === "function" &&
-                object.toString !== Object.prototype.toString) {
-            return object.toString();
-        }
-
-        var i, l;
-        for (i = 0, l = specialObjects.length; i < l; i++) {
-            if (object === specialObjects[i].object) {
-                return specialObjects[i].value;
-            }
-        }
-
-        return ascii.object.call(f, object, processed, indent);
-    }
-
-    ascii.func = function (func) {
-        return "function " + functionName(func) + "() {}";
-    };
-
-    ascii.array = function (array, processed) {
-        processed = processed || [];
-        processed.push(array);
-        var i, l, pieces = [];
-        for (i = 0, l = array.length; i < l; ++i) {
-            pieces.push(ascii(this, array[i], processed));
-        }
-        return "[" + pieces.join(", ") + "]";
-    };
-
-    ascii.object = function (object, processed, indent) {
-        processed = processed || [];
-        processed.push(object);
-        indent = indent || 0;
-        var pieces = [], properties = samsam.keys(object).sort();
-        var length = 3;
-        var prop, str, obj, i, l;
-
-        for (i = 0, l = properties.length; i < l; ++i) {
-            prop = properties[i];
-            obj = object[prop];
-
-            if (isCircular(obj, processed)) {
-                str = "[Circular]";
-            } else {
-                str = ascii(this, obj, processed, indent + 2);
-            }
-
-            str = (/\s/.test(prop) ? '"' + prop + '"' : prop) + ": " + str;
-            length += str.length;
-            pieces.push(str);
-        }
-
-        var cons = constructorName(this, object);
-        var prefix = cons ? "[" + cons + "] " : "";
-        var is = "";
-        for (i = 0, l = indent; i < l; ++i) { is += " "; }
-
-        if (length + indent > 80) {
-            return prefix + "{\n  " + is + pieces.join(",\n  " + is) + "\n" +
-                is + "}";
-        }
-        return prefix + "{ " + pieces.join(", ") + " }";
-    };
-
-    ascii.element = function (element) {
-        var tagName = element.tagName.toLowerCase();
-        var attrs = element.attributes, attr, pairs = [], attrName, i, l, val;
-
-        for (i = 0, l = attrs.length; i < l; ++i) {
-            attr = attrs.item(i);
-            attrName = attr.nodeName.toLowerCase().replace("html:", "");
-            val = attr.nodeValue;
-            if (attrName !== "contenteditable" || val !== "inherit") {
-                if (!!val) { pairs.push(attrName + "=\"" + val + "\""); }
-            }
-        }
-
-        var formatted = "<" + tagName + (pairs.length > 0 ? " " : "");
-        var content = element.innerHTML;
-
-        if (content.length > 20) {
-            content = content.substr(0, 20) + "[...]";
-        }
-
-        var res = formatted + pairs.join(" ") + ">" + content +
-                "</" + tagName + ">";
-
-        return res.replace(/ contentEditable="inherit"/, "");
-    };
-
-    function Formatio(options) {
-        for (var opt in options) {
-            this[opt] = options[opt];
-        }
-    }
-
-    Formatio.prototype = {
-        functionName: functionName,
-
-        configure: function (options) {
-            return new Formatio(options);
-        },
-
-        constructorName: function (object) {
-            return constructorName(this, object);
-        },
-
-        ascii: function (object, processed, indent) {
-            return ascii(this, object, processed, indent);
-        }
-    };
-
-    return Formatio.prototype;
-});
-/*jslint eqeqeq: false, onevar: false, forin: true, nomen: false, regexp: false, plusplus: false*/
-/*global module, require, __dirname, document*/
-/**
- * Sinon core utilities. For internal use only.
- *
- * @author Christian Johansen (christian@cjohansen.no)
- * @license BSD
- *
- * Copyright (c) 2010-2013 Christian Johansen
- */
-
-var sinon = (function (formatio) {
-    var div = typeof document != "undefined" && document.createElement("div");
-    var hasOwn = Object.prototype.hasOwnProperty;
-
-    function isDOMNode(obj) {
-        var success = false;
-
-        try {
-            obj.appendChild(div);
-            success = div.parentNode == obj;
-        } catch (e) {
-            return false;
-        } finally {
-            try {
-                obj.removeChild(div);
-            } catch (e) {
-                // Remove failed, not much we can do about that
-            }
-        }
-
-        return success;
-    }
-
-    function isElement(obj) {
-        return div && obj && obj.nodeType === 1 && isDOMNode(obj);
-    }
-
-    function isFunction(obj) {
-        return typeof obj === "function" || !!(obj && obj.constructor && obj.call && obj.apply);
-    }
-
-    function mirrorProperties(target, source) {
-        for (var prop in source) {
-            if (!hasOwn.call(target, prop)) {
-                target[prop] = source[prop];
-            }
-        }
-    }
-
-    function isRestorable (obj) {
-        return typeof obj === "function" && typeof obj.restore === "function" && obj.restore.sinon;
-    }
-
-    var sinon = {
-        wrapMethod: function wrapMethod(object, property, method) {
-            if (!object) {
-                throw new TypeError("Should wrap property of object");
-            }
-
-            if (typeof method != "function") {
-                throw new TypeError("Method wrapper should be function");
-            }
-
-            var wrappedMethod = object[property],
-                error;
-
-            if (!isFunction(wrappedMethod)) {
-                error = new TypeError("Attempted to wrap " + (typeof wrappedMethod) + " property " +
-                                    property + " as function");
-            }
-
-            if (wrappedMethod.restore && wrappedMethod.restore.sinon) {
-                error = new TypeError("Attempted to wrap " + property + " which is already wrapped");
-            }
-
-            if (wrappedMethod.calledBefore) {
-                var verb = !!wrappedMethod.returns ? "stubbed" : "spied on";
-                error = new TypeError("Attempted to wrap " + property + " which is already " + verb);
-            }
-
-            if (error) {
-                if (wrappedMethod._stack) {
-                    error.stack += '\n--------------\n' + wrappedMethod._stack;
-                }
-                throw error;
-            }
-
-            // IE 8 does not support hasOwnProperty on the window object and Firefox has a problem
-            // when using hasOwn.call on objects from other frames.
-            var owned = object.hasOwnProperty ? object.hasOwnProperty(property) : hasOwn.call(object, property);
-            object[property] = method;
-            method.displayName = property;
-            // Set up a stack trace which can be used later to find what line of
-            // code the original method was created on.
-            method._stack = (new Error('Stack Trace for original')).stack;
-
-            method.restore = function () {
-                // For prototype properties try to reset by delete first.
-                // If this fails (ex: localStorage on mobile safari) then force a reset
-                // via direct assignment.
-                if (!owned) {
-                    delete object[property];
-                }
-                if (object[property] === method) {
-                    object[property] = wrappedMethod;
-                }
-            };
-
-            method.restore.sinon = true;
-            mirrorProperties(method, wrappedMethod);
-
-            return method;
-        },
-
-        extend: function extend(target) {
-            for (var i = 1, l = arguments.length; i < l; i += 1) {
-                for (var prop in arguments[i]) {
-                    if (arguments[i].hasOwnProperty(prop)) {
-                        target[prop] = arguments[i][prop];
-                    }
-
-                    // DONT ENUM bug, only care about toString
-                    if (arguments[i].hasOwnProperty("toString") &&
-                        arguments[i].toString != target.toString) {
-                        target.toString = arguments[i].toString;
-                    }
-                }
-            }
-
-            return target;
-        },
-
-        create: function create(proto) {
-            var F = function () {};
-            F.prototype = proto;
-            return new F();
-        },
-
-        deepEqual: function deepEqual(a, b) {
-            if (sinon.match && sinon.match.isMatcher(a)) {
-                return a.test(b);
-            }
-            if (typeof a != "object" || typeof b != "object") {
-                return a === b;
-            }
-
-            if (isElement(a) || isElement(b)) {
-                return a === b;
-            }
-
-            if (a === b) {
-                return true;
-            }
-
-            if ((a === null && b !== null) || (a !== null && b === null)) {
-                return false;
-            }
-
-            if (a instanceof RegExp && b instanceof RegExp) {
-              return (a.source === b.source) && (a.global === b.global) && 
-                (a.ignoreCase === b.ignoreCase) && (a.multiline === b.multiline);
-            }
-
-            var aString = Object.prototype.toString.call(a);
-            if (aString != Object.prototype.toString.call(b)) {
-                return false;
-            }
-
-            if (aString == "[object Date]") {
-                return a.valueOf() === b.valueOf();
-            }
-
-            var prop, aLength = 0, bLength = 0;
-
-            if (aString == "[object Array]" && a.length !== b.length) {
-                return false;
-            }
-
-            for (prop in a) {
-                aLength += 1;
-
-                if (!deepEqual(a[prop], b[prop])) {
-                    return false;
-                }
-            }
-
-            for (prop in b) {
-                bLength += 1;
-            }
-
-            return aLength == bLength;
-        },
-
-        functionName: function functionName(func) {
-            var name = func.displayName || func.name;
-
-            // Use function decomposition as a last resort to get function
-            // name. Does not rely on function decomposition to work - if it
-            // doesn't debugging will be slightly less informative
-            // (i.e. toString will say 'spy' rather than 'myFunc').
-            if (!name) {
-                var matches = func.toString().match(/function ([^\s\(]+)/);
-                name = matches && matches[1];
-            }
-
-            return name;
-        },
-
-        functionToString: function toString() {
-            if (this.getCall && this.callCount) {
-                var thisValue, prop, i = this.callCount;
-
-                while (i--) {
-                    thisValue = this.getCall(i).thisValue;
-
-                    for (prop in thisValue) {
-                        if (thisValue[prop] === this) {
-                            return prop;
-                        }
-                    }
-                }
-            }
-
-            return this.displayName || "sinon fake";
-        },
-
-        getConfig: function (custom) {
-            var config = {};
-            custom = custom || {};
-            var defaults = sinon.defaultConfig;
-
-            for (var prop in defaults) {
-                if (defaults.hasOwnProperty(prop)) {
-                    config[prop] = custom.hasOwnProperty(prop) ? custom[prop] : defaults[prop];
-                }
-            }
-
-            return config;
-        },
-
-        format: function (val) {
-            return "" + val;
-        },
-
-        defaultConfig: {
-            injectIntoThis: true,
-            injectInto: null,
-            properties: ["spy", "stub", "mock", "clock", "server", "requests"],
-            useFakeTimers: true,
-            useFakeServer: true
-        },
-
-        timesInWords: function timesInWords(count) {
-            return count == 1 && "once" ||
-                count == 2 && "twice" ||
-                count == 3 && "thrice" ||
-                (count || 0) + " times";
-        },
-
-        calledInOrder: function (spies) {
-            for (var i = 1, l = spies.length; i < l; i++) {
-                if (!spies[i - 1].calledBefore(spies[i]) || !spies[i].called) {
-                    return false;
-                }
-            }
-
-            return true;
-        },
-
-        orderByFirstCall: function (spies) {
-            return spies.sort(function (a, b) {
-                // uuid, won't ever be equal
-                var aCall = a.getCall(0);
-                var bCall = b.getCall(0);
-                var aId = aCall && aCall.callId || -1;
-                var bId = bCall && bCall.callId || -1;
-
-                return aId < bId ? -1 : 1;
-            });
-        },
-
-        log: function () {},
-
-        logError: function (label, err) {
-            var msg = label + " threw exception: ";
-            sinon.log(msg + "[" + err.name + "] " + err.message);
-            if (err.stack) { sinon.log(err.stack); }
-
-            setTimeout(function () {
-                err.message = msg + err.message;
-                throw err;
-            }, 0);
-        },
-
-        typeOf: function (value) {
-            if (value === null) {
-                return "null";
-            }
-            else if (value === undefined) {
-                return "undefined";
-            }
-            var string = Object.prototype.toString.call(value);
-            return string.substring(8, string.length - 1).toLowerCase();
-        },
-
-        createStubInstance: function (constructor) {
-            if (typeof constructor !== "function") {
-                throw new TypeError("The constructor should be a function.");
-            }
-            return sinon.stub(sinon.create(constructor.prototype));
-        },
-
-        restore: function (object) {
-            if (object !== null && typeof object === "object") {
-                for (var prop in object) {
-                    if (isRestorable(object[prop])) {
-                        object[prop].restore();
-                    }
-                }
-            }
-            else if (isRestorable(object)) {
-                object.restore();
-            }
-        }
-    };
-
-    var isNode = typeof module !== "undefined" && module.exports;
-    var isAMD = typeof define === 'function' && typeof define.amd === 'object' && define.amd;
-
-    if (isAMD) {
-        define(function(){
-            return sinon;
-        });
-    } else if (isNode) {
-        try {
-            formatio = require("formatio");
-        } catch (e) {}
-        module.exports = sinon;
-        module.exports.spy = require("./sinon/spy");
-        module.exports.spyCall = require("./sinon/call");
-        module.exports.behavior = require("./sinon/behavior");
-        module.exports.stub = require("./sinon/stub");
-        module.exports.mock = require("./sinon/mock");
-        module.exports.collection = require("./sinon/collection");
-        module.exports.assert = require("./sinon/assert");
-        module.exports.sandbox = require("./sinon/sandbox");
-        module.exports.test = require("./sinon/test");
-        module.exports.testCase = require("./sinon/test_case");
-        module.exports.assert = require("./sinon/assert");
-        module.exports.match = require("./sinon/match");
-    }
-
-    if (formatio) {
-        var formatter = formatio.configure({ quoteStrings: false });
-        sinon.format = function () {
-            return formatter.ascii.apply(formatter, arguments);
-        };
-    } else if (isNode) {
-        try {
-            var util = require("util");
-            sinon.format = function (value) {
-                return typeof value == "object" && value.toString === Object.prototype.toString ? util.inspect(value) : value;
-            };
-        } catch (e) {
-            /* Node, but no util module - would be very old, but better safe than
-             sorry */
-        }
-    }
-
-    return sinon;
-}(typeof formatio == "object" && formatio));
-
-/* @depend ../sinon.js */
-/*jslint eqeqeq: false, onevar: false, plusplus: false*/
-/*global module, require, sinon*/
-/**
- * Match functions
- *
- * @author Maximilian Antoni (mail@maxantoni.de)
- * @license BSD
- *
- * Copyright (c) 2012 Maximilian Antoni
- */
-
-(function (sinon) {
-    var commonJSModule = typeof module !== 'undefined' && module.exports;
-
-    if (!sinon && commonJSModule) {
-        sinon = require("../sinon");
-    }
-
-    if (!sinon) {
-        return;
-    }
-
-    function assertType(value, type, name) {
-        var actual = sinon.typeOf(value);
-        if (actual !== type) {
-            throw new TypeError("Expected type of " + name + " to be " +
-                type + ", but was " + actual);
-        }
-    }
-
-    var matcher = {
-        toString: function () {
-            return this.message;
-        }
-    };
-
-    function isMatcher(object) {
-        return matcher.isPrototypeOf(object);
-    }
-
-    function matchObject(expectation, actual) {
-        if (actual === null || actual === undefined) {
-            return false;
-        }
-        for (var key in expectation) {
-            if (expectation.hasOwnProperty(key)) {
-                var exp = expectation[key];
-                var act = actual[key];
-                if (match.isMatcher(exp)) {
-                    if (!exp.test(act)) {
-                        return false;
-                    }
-                } else if (sinon.typeOf(exp) === "object") {
-                    if (!matchObject(exp, act)) {
-                        return false;
-                    }
-                } else if (!sinon.deepEqual(exp, act)) {
-                    return false;
-                }
-            }
-        }
-        return true;
-    }
-
-    matcher.or = function (m2) {
-        if (!arguments.length) {
-            throw new TypeError("Matcher expected");
-        } else if (!isMatcher(m2)) {
-            m2 = match(m2);
-        }
-        var m1 = this;
-        var or = sinon.create(matcher);
-        or.test = function (actual) {
-            return m1.test(actual) || m2.test(actual);
-        };
-        or.message = m1.message + ".or(" + m2.message + ")";
-        return or;
-    };
-
-    matcher.and = function (m2) {
-        if (!arguments.length) {
-            throw new TypeError("Matcher expected");
-        } else if (!isMatcher(m2)) {
-            m2 = match(m2);
-        }
-        var m1 = this;
-        var and = sinon.create(matcher);
-        and.test = function (actual) {
-            return m1.test(actual) && m2.test(actual);
-        };
-        and.message = m1.message + ".and(" + m2.message + ")";
-        return and;
-    };
-
-    var match = function (expectation, message) {
-        var m = sinon.create(matcher);
-        var type = sinon.typeOf(expectation);
-        switch (type) {
-        case "object":
-            if (typeof expectation.test === "function") {
-                m.test = function (actual) {
-                    return expectation.test(actual) === true;
-                };
-                m.message = "match(" + sinon.functionName(expectation.test) + ")";
-                return m;
-            }
-            var str = [];
-            for (var key in expectation) {
-                if (expectation.hasOwnProperty(key)) {
-                    str.push(key + ": " + expectation[key]);
-                }
-            }
-            m.test = function (actual) {
-                return matchObject(expectation, actual);
-            };
-            m.message = "match(" + str.join(", ") + ")";
-            break;
-        case "number":
-            m.test = function (actual) {
-                return expectation == actual;
-            };
-            break;
-        case "string":
-            m.test = function (actual) {
-                if (typeof actual !== "string") {
-                    return false;
-                }
-                return actual.indexOf(expectation) !== -1;
-            };
-            m.message = "match(\"" + expectation + "\")";
-            break;
-        case "regexp":
-            m.test = function (actual) {
-                if (typeof actual !== "string") {
-                    return false;
-                }
-                return expectation.test(actual);
-            };
-            break;
-        case "function":
-            m.test = expectation;
-            if (message) {
-                m.message = message;
-            } else {
-                m.message = "match(" + sinon.functionName(expectation) + ")";
-            }
-            break;
-        default:
-            m.test = function (actual) {
-              return sinon.deepEqual(expectation, actual);
-            };
-        }
-        if (!m.message) {
-            m.message = "match(" + expectation + ")";
-        }
-        return m;
-    };
-
-    match.isMatcher = isMatcher;
-
-    match.any = match(function () {
-        return true;
-    }, "any");
-
-    match.defined = match(function (actual) {
-        return actual !== null && actual !== undefined;
-    }, "defined");
-
-    match.truthy = match(function (actual) {
-        return !!actual;
-    }, "truthy");
-
-    match.falsy = match(function (actual) {
-        return !actual;
-    }, "falsy");
-
-    match.same = function (expectation) {
-        return match(function (actual) {
-            return expectation === actual;
-        }, "same(" + expectation + ")");
-    };
-
-    match.typeOf = function (type) {
-        assertType(type, "string", "type");
-        return match(function (actual) {
-            return sinon.typeOf(actual) === type;
-        }, "typeOf(\"" + type + "\")");
-    };
-
-    match.instanceOf = function (type) {
-        assertType(type, "function", "type");
-        return match(function (actual) {
-            return actual instanceof type;
-        }, "instanceOf(" + sinon.functionName(type) + ")");
-    };
-
-    function createPropertyMatcher(propertyTest, messagePrefix) {
-        return function (property, value) {
-            assertType(property, "string", "property");
-            var onlyProperty = arguments.length === 1;
-            var message = messagePrefix + "(\"" + property + "\"";
-            if (!onlyProperty) {
-                message += ", " + value;
-            }
-            message += ")";
-            return match(function (actual) {
-                if (actual === undefined || actual === null ||
-                        !propertyTest(actual, property)) {
-                    return false;
-                }
-                return onlyProperty || sinon.deepEqual(value, actual[property]);
-            }, message);
-        };
-    }
-
-    match.has = createPropertyMatcher(function (actual, property) {
-        if (typeof actual === "object") {
-            return property in actual;
-        }
-        return actual[property] !== undefined;
-    }, "has");
-
-    match.hasOwn = createPropertyMatcher(function (actual, property) {
-        return actual.hasOwnProperty(property);
-    }, "hasOwn");
-
-    match.bool = match.typeOf("boolean");
-    match.number = match.typeOf("number");
-    match.string = match.typeOf("string");
-    match.object = match.typeOf("object");
-    match.func = match.typeOf("function");
-    match.array = match.typeOf("array");
-    match.regexp = match.typeOf("regexp");
-    match.date = match.typeOf("date");
-
-    if (commonJSModule) {
-        module.exports = match;
-    } else {
-        sinon.match = match;
-    }
-}(typeof sinon == "object" && sinon || null));
-
-/**
-  * @depend ../sinon.js
-  * @depend match.js
-  */
-/*jslint eqeqeq: false, onevar: false, plusplus: false*/
-/*global module, require, sinon*/
-/**
-  * Spy calls
-  *
-  * @author Christian Johansen (christian@cjohansen.no)
-  * @author Maximilian Antoni (mail@maxantoni.de)
-  * @license BSD
-  *
-  * Copyright (c) 2010-2013 Christian Johansen
-  * Copyright (c) 2013 Maximilian Antoni
-  */
-
-(function (sinon) {
-    var commonJSModule = typeof module !== 'undefined' && module.exports;
-    if (!sinon && commonJSModule) {
-        sinon = require("../sinon");
-    }
-
-    if (!sinon) {
-        return;
-    }
-
-    function throwYieldError(proxy, text, args) {
-        var msg = sinon.functionName(proxy) + text;
-        if (args.length) {
-            msg += " Received [" + slice.call(args).join(", ") + "]";
-        }
-        throw new Error(msg);
-    }
-
-    var slice = Array.prototype.slice;
-
-    var callProto = {
-        calledOn: function calledOn(thisValue) {
-            if (sinon.match && sinon.match.isMatcher(thisValue)) {
-                return thisValue.test(this.thisValue);
-            }
-            return this.thisValue === thisValue;
-        },
-
-        calledWith: function calledWith() {
-            for (var i = 0, l = arguments.length; i < l; i += 1) {
-                if (!sinon.deepEqual(arguments[i], this.args[i])) {
-                    return false;
-                }
-            }
-
-            return true;
-        },
-
-        calledWithMatch: function calledWithMatch() {
-            for (var i = 0, l = arguments.length; i < l; i += 1) {
-                var actual = this.args[i];
-                var expectation = arguments[i];
-                if (!sinon.match || !sinon.match(expectation).test(actual)) {
-                    return false;
-                }
-            }
-            return true;
-        },
-
-        calledWithExactly: function calledWithExactly() {
-            return arguments.length == this.args.length &&
-                this.calledWith.apply(this, arguments);
-        },
-
-        notCalledWith: function notCalledWith() {
-            return !this.calledWith.apply(this, arguments);
-        },
-
-        notCalledWithMatch: function notCalledWithMatch() {
-            return !this.calledWithMatch.apply(this, arguments);
-        },
-
-        returned: function returned(value) {
-            return sinon.deepEqual(value, this.returnValue);
-        },
-
-        threw: function threw(error) {
-            if (typeof error === "undefined" || !this.exception) {
-                return !!this.exception;
-            }
-
-            return this.exception === error || this.exception.name === error;
-        },
-
-        calledWithNew: function calledWithNew() {
-            return this.proxy.prototype && this.thisValue instanceof this.proxy;
-        },
-
-        calledBefore: function (other) {
-            return this.callId < other.callId;
-        },
-
-        calledAfter: function (other) {
-            return this.callId > other.callId;
-        },
-
-        callArg: function (pos) {
-            this.args[pos]();
-        },
-
-        callArgOn: function (pos, thisValue) {
-            this.args[pos].apply(thisValue);
-        },
-
-        callArgWith: function (pos) {
-            this.callArgOnWith.apply(this, [pos, null].concat(slice.call(arguments, 1)));
-        },
-
-        callArgOnWith: function (pos, thisValue) {
-            var args = slice.call(arguments, 2);
-            this.args[pos].apply(thisValue, args);
-        },
-
-        "yield": function () {
-            this.yieldOn.apply(this, [null].concat(slice.call(arguments, 0)));
-        },
-
-        yieldOn: function (thisValue) {
-            var args = this.args;
-            for (var i = 0, l = args.length; i < l; ++i) {
-                if (typeof args[i] === "function") {
-                    args[i].apply(thisValue, slice.call(arguments, 1));
-                    return;
-                }
-            }
-            throwYieldError(this.proxy, " cannot yield since no callback was passed.", args);
-        },
-
-        yieldTo: function (prop) {
-            this.yieldToOn.apply(this, [prop, null].concat(slice.call(arguments, 1)));
-        },
-
-        yieldToOn: function (prop, thisValue) {
-            var args = this.args;
-            for (var i = 0, l = args.length; i < l; ++i) {
-                if (args[i] && typeof args[i][prop] === "function") {
-                    args[i][prop].apply(thisValue, slice.call(arguments, 2));
-                    return;
-                }
-            }
-            throwYieldError(this.proxy, " cannot yield to '" + prop +
-                "' since no callback was passed.", args);
-        },
-
-        toString: function () {
-            var callStr = this.proxy.toString() + "(";
-            var args = [];
-
-            for (var i = 0, l = this.args.length; i < l; ++i) {
-                args.push(sinon.format(this.args[i]));
-            }
-
-            callStr = callStr + args.join(", ") + ")";
-
-            if (typeof this.returnValue != "undefined") {
-                callStr += " => " + sinon.format(this.returnValue);
-            }
-
-            if (this.exception) {
-                callStr += " !" + this.exception.name;
-
-                if (this.exception.message) {
-                    callStr += "(" + this.exception.message + ")";
-                }
-            }
-
-            return callStr;
-        }
-    };
-
-    callProto.invokeCallback = callProto.yield;
-
-    function createSpyCall(spy, thisValue, args, returnValue, exception, id) {
-        if (typeof id !== "number") {
-            throw new TypeError("Call id is not a number");
-        }
-        var proxyCall = sinon.create(callProto);
-        proxyCall.proxy = spy;
-        proxyCall.thisValue = thisValue;
-        proxyCall.args = args;
-        proxyCall.returnValue = returnValue;
-        proxyCall.exception = exception;
-        proxyCall.callId = id;
-
-        return proxyCall;
-    }
-    createSpyCall.toString = callProto.toString; // used by mocks
-
-    if (commonJSModule) {
-        module.exports = createSpyCall;
-    } else {
-        sinon.spyCall = createSpyCall;
-    }
-}(typeof sinon == "object" && sinon || null));
-
-
-/**
-  * @depend ../sinon.js
-  * @depend call.js
-  */
-/*jslint eqeqeq: false, onevar: false, plusplus: false*/
-/*global module, require, sinon*/
-/**
-  * Spy functions
-  *
-  * @author Christian Johansen (christian@cjohansen.no)
-  * @license BSD
-  *
-  * Copyright (c) 2010-2013 Christian Johansen
-  */
-
-(function (sinon) {
-    var commonJSModule = typeof module !== 'undefined' && module.exports;
-    var push = Array.prototype.push;
-    var slice = Array.prototype.slice;
-    var callId = 0;
-
-    if (!sinon && commonJSModule) {
-        sinon = require("../sinon");
-    }
-
-    if (!sinon) {
-        return;
-    }
-
-    function spy(object, property) {
-        if (!property && typeof object == "function") {
-            return spy.create(object);
-        }
-
-        if (!object && !property) {
-            return spy.create(function () { });
-        }
-
-        var method = object[property];
-        return sinon.wrapMethod(object, property, spy.create(method));
-    }
-
-    function matchingFake(fakes, args, strict) {
-        if (!fakes) {
-            return;
-        }
-
-        for (var i = 0, l = fakes.length; i < l; i++) {
-            if (fakes[i].matches(args, strict)) {
-                return fakes[i];
-            }
-        }
-    }
-
-    function incrementCallCount() {
-        this.called = true;
-        this.callCount += 1;
-        this.notCalled = false;
-        this.calledOnce = this.callCount == 1;
-        this.calledTwice = this.callCount == 2;
-        this.calledThrice = this.callCount == 3;
-    }
-
-    function createCallProperties() {
-        this.firstCall = this.getCall(0);
-        this.secondCall = this.getCall(1);
-        this.thirdCall = this.getCall(2);
-        this.lastCall = this.getCall(this.callCount - 1);
-    }
-
-    var vars = "a,b,c,d,e,f,g,h,i,j,k,l";
-    function createProxy(func) {
-        // Retain the function length:
-        var p;
-        if (func.length) {
-            eval("p = (function proxy(" + vars.substring(0, func.length * 2 - 1) +
-                ") { return p.invoke(func, this, slice.call(arguments)); });");
-        }
-        else {
-            p = function proxy() {
-                return p.invoke(func, this, slice.call(arguments));
-            };
-        }
-        return p;
-    }
-
-    var uuid = 0;
-
-    // Public API
-    var spyApi = {
-        reset: function () {
-            this.called = false;
-            this.notCalled = true;
-            this.calledOnce = false;
-            this.calledTwice = false;
-            this.calledThrice = false;
-            this.callCount = 0;
-            this.firstCall = null;
-            this.secondCall = null;
-            this.thirdCall = null;
-            this.lastCall = null;
-            this.args = [];
-            this.returnValues = [];
-            this.thisValues = [];
-            this.exceptions = [];
-            this.callIds = [];
-            if (this.fakes) {
-                for (var i = 0; i < this.fakes.length; i++) {
-                    this.fakes[i].reset();
-                }
-            }
-        },
-
-        create: function create(func) {
-            var name;
-
-            if (typeof func != "function") {
-                func = function () { };
-            } else {
-                name = sinon.functionName(func);
-            }
-
-            var proxy = createProxy(func);
-
-            sinon.extend(proxy, spy);
-            delete proxy.create;
-            sinon.extend(proxy, func);
-
-            proxy.reset();
-            proxy.prototype = func.prototype;
-            proxy.displayName = name || "spy";
-            proxy.toString = sinon.functionToString;
-            proxy._create = sinon.spy.create;
-            proxy.id = "spy#" + uuid++;
-
-            return proxy;
-        },
-
-        invoke: function invoke(func, thisValue, args) {
-            var matching = matchingFake(this.fakes, args);
-            var exception, returnValue;
-
-            incrementCallCount.call(this);
-            push.call(this.thisValues, thisValue);
-            push.call(this.args, args);
-            push.call(this.callIds, callId++);
-
-            try {
-                if (matching) {
-                    returnValue = matching.invoke(func, thisValue, args);
-                } else {
-                    returnValue = (this.func || func).apply(thisValue, args);
-                }
-
-                var thisCall = this.getCall(this.callCount - 1);
-                if (thisCall.calledWithNew() && typeof returnValue !== 'object') {
-                    returnValue = thisValue;
-                }
-            } catch (e) {
-                exception = e;
-            }
-
-            push.call(this.exceptions, exception);
-            push.call(this.returnValues, returnValue);
-
-            createCallProperties.call(this);
-
-            if (exception !== undefined) {
-                throw exception;
-            }
-
-            return returnValue;
-        },
-
-        getCall: function getCall(i) {
-            if (i < 0 || i >= this.callCount) {
-                return null;
-            }
-
-            return sinon.spyCall(this, this.thisValues[i], this.args[i],
-                                    this.returnValues[i], this.exceptions[i],
-                                    this.callIds[i]);
-        },
-
-        getCalls: function () {
-            var calls = [];
-            var i;
-
-            for (i = 0; i < this.callCount; i++) {
-                calls.push(this.getCall(i));
-            }
-
-            return calls;
-        },
-
-        calledBefore: function calledBefore(spyFn) {
-            if (!this.called) {
-                return false;
-            }
-
-            if (!spyFn.called) {
-                return true;
-            }
-
-            return this.callIds[0] < spyFn.callIds[spyFn.callIds.length - 1];
-        },
-
-        calledAfter: function calledAfter(spyFn) {
-            if (!this.called || !spyFn.called) {
-                return false;
-            }
-
-            return this.callIds[this.callCount - 1] > spyFn.callIds[spyFn.callCount - 1];
-        },
-
-        withArgs: function () {
-            var args = slice.call(arguments);
-
-            if (this.fakes) {
-                var match = matchingFake(this.fakes, args, true);
-
-                if (match) {
-                    return match;
-                }
-            } else {
-                this.fakes = [];
-            }
-
-            var original = this;
-            var fake = this._create();
-            fake.matchingAguments = args;
-            fake.parent = this;
-            push.call(this.fakes, fake);
-
-            fake.withArgs = function () {
-                return original.withArgs.apply(original, arguments);
-            };
-
-            for (var i = 0; i < this.args.length; i++) {
-                if (fake.matches(this.args[i])) {
-                    incrementCallCount.call(fake);
-                    push.call(fake.thisValues, this.thisValues[i]);
-                    push.call(fake.args, this.args[i]);
-                    push.call(fake.returnValues, this.returnValues[i]);
-                    push.call(fake.exceptions, this.exceptions[i]);
-                    push.call(fake.callIds, this.callIds[i]);
-                }
-            }
-            createCallProperties.call(fake);
-
-            return fake;
-        },
-
-        matches: function (args, strict) {
-            var margs = this.matchingAguments;
-
-            if (margs.length <= args.length &&
-                sinon.deepEqual(margs, args.slice(0, margs.length))) {
-                return !strict || margs.length == args.length;
-            }
-        },
-
-        printf: function (format) {
-            var spy = this;
-            var args = slice.call(arguments, 1);
-            var formatter;
-
-            return (format || "").replace(/%(.)/g, function (match, specifyer) {
-                formatter = spyApi.formatters[specifyer];
-
-                if (typeof formatter == "function") {
-                    return formatter.call(null, spy, args);
-                } else if (!isNaN(parseInt(specifyer, 10))) {
-                    return sinon.format(args[specifyer - 1]);
-                }
-
-                return "%" + specifyer;
-            });
-        }
-    };
-
-    function delegateToCalls(method, matchAny, actual, notCalled) {
-        spyApi[method] = function () {
-            if (!this.called) {
-                if (notCalled) {
-                    return notCalled.apply(this, arguments);
-                }
-                return false;
-            }
-
-            var currentCall;
-            var matches = 0;
-
-            for (var i = 0, l = this.callCount; i < l; i += 1) {
-                currentCall = this.getCall(i);
-
-                if (currentCall[actual || method].apply(currentCall, arguments)) {
-                    matches += 1;
-
-                    if (matchAny) {
-                        return true;
-                    }
-                }
-            }
-
-            return matches === this.callCount;
-        };
-    }
-
-    delegateToCalls("calledOn", true);
-    delegateToCalls("alwaysCalledOn", false, "calledOn");
-    delegateToCalls("calledWith", true);
-    delegateToCalls("calledWithMatch", true);
-    delegateToCalls("alwaysCalledWith", false, "calledWith");
-    delegateToCalls("alwaysCalledWithMatch", false, "calledWithMatch");
-    delegateToCalls("calledWithExactly", true);
-    delegateToCalls("alwaysCalledWithExactly", false, "calledWithExactly");
-    delegateToCalls("neverCalledWith", false, "notCalledWith",
-        function () { return true; });
-    delegateToCalls("neverCalledWithMatch", false, "notCalledWithMatch",
-        function () { return true; });
-    delegateToCalls("threw", true);
-    delegateToCalls("alwaysThrew", false, "threw");
-    delegateToCalls("returned", true);
-    delegateToCalls("alwaysReturned", false, "returned");
-    delegateToCalls("calledWithNew", true);
-    delegateToCalls("alwaysCalledWithNew", false, "calledWithNew");
-    delegateToCalls("callArg", false, "callArgWith", function () {
-        throw new Error(this.toString() + " cannot call arg since it was not yet invoked.");
-    });
-    spyApi.callArgWith = spyApi.callArg;
-    delegateToCalls("callArgOn", false, "callArgOnWith", function () {
-        throw new Error(this.toString() + " cannot call arg since it was not yet invoked.");
-    });
-    spyApi.callArgOnWith = spyApi.callArgOn;
-    delegateToCalls("yield", false, "yield", function () {
-        throw new Error(this.toString() + " cannot yield since it was not yet invoked.");
-    });
-    // "invokeCallback" is an alias for "yield" since "yield" is invalid in strict mode.
-    spyApi.invokeCallback = spyApi.yield;
-    delegateToCalls("yieldOn", false, "yieldOn", function () {
-        throw new Error(this.toString() + " cannot yield since it was not yet invoked.");
-    });
-    delegateToCalls("yieldTo", false, "yieldTo", function (property) {
-        throw new Error(this.toString() + " cannot yield to '" + property +
-            "' since it was not yet invoked.");
-    });
-    delegateToCalls("yieldToOn", false, "yieldToOn", function (property) {
-        throw new Error(this.toString() + " cannot yield to '" + property +
-            "' since it was not yet invoked.");
-    });
-
-    spyApi.formatters = {
-        "c": function (spy) {
-            return sinon.timesInWords(spy.callCount);
-        },
-
-        "n": function (spy) {
-            return spy.toString();
-        },
-
-        "C": function (spy) {
-            var calls = [];
-
-            for (var i = 0, l = spy.callCount; i < l; ++i) {
-                var stringifiedCall = "    " + spy.getCall(i).toString();
-                if (/\n/.test(calls[i - 1])) {
-                    stringifiedCall = "\n" + stringifiedCall;
-                }
-                push.call(calls, stringifiedCall);
-            }
-
-            return calls.length > 0 ? "\n" + calls.join("\n") : "";
-        },
-
-        "t": function (spy) {
-            var objects = [];
-
-            for (var i = 0, l = spy.callCount; i < l; ++i) {
-                push.call(objects, sinon.format(spy.thisValues[i]));
-            }
-
-            return objects.join(", ");
-        },
-
-        "*": function (spy, args) {
-            var formatted = [];
-
-            for (var i = 0, l = args.length; i < l; ++i) {
-                push.call(formatted, sinon.format(args[i]));
-            }
-
-            return formatted.join(", ");
-        }
-    };
-
-    sinon.extend(spy, spyApi);
-
-    spy.spyCall = sinon.spyCall;
-
-    if (commonJSModule) {
-        module.exports = spy;
-    } else {
-        sinon.spy = spy;
-    }
-}(typeof sinon == "object" && sinon || null));
-
-/**
- * @depend ../sinon.js
- */
-/*jslint eqeqeq: false, onevar: false*/
-/*global module, require, sinon, process, setImmediate, setTimeout*/
-/**
- * Stub behavior
- *
- * @author Christian Johansen (christian@cjohansen.no)
- * @author Tim Fischbach (mail@timfischbach.de)
- * @license BSD
- *
- * Copyright (c) 2010-2013 Christian Johansen
- */
-
-(function (sinon) {
-    var commonJSModule = typeof module !== 'undefined' && module.exports;
-
-    if (!sinon && commonJSModule) {
-        sinon = require("../sinon");
-    }
-
-    if (!sinon) {
-        return;
-    }
-
-    var slice = Array.prototype.slice;
-    var join = Array.prototype.join;
-    var proto;
-
-    var nextTick = (function () {
-        if (typeof process === "object" && typeof process.nextTick === "function") {
-            return process.nextTick;
-        } else if (typeof setImmediate === "function") {
-            return setImmediate;
-        } else {
-            return function (callback) {
-                setTimeout(callback, 0);
-            };
-        }
-    })();
-
-    function throwsException(error, message) {
-        if (typeof error == "string") {
-            this.exception = new Error(message || "");
-            this.exception.name = error;
-        } else if (!error) {
-            this.exception = new Error("Error");
-        } else {
-            this.exception = error;
-        }
-
-        return this;
-    }
-
-    function getCallback(behavior, args) {
-        var callArgAt = behavior.callArgAt;
-
-        if (callArgAt < 0) {
-            var callArgProp = behavior.callArgProp;
-
-            for (var i = 0, l = args.length; i < l; ++i) {
-                if (!callArgProp && typeof args[i] == "function") {
-                    return args[i];
-                }
-
-                if (callArgProp && args[i] &&
-                    typeof args[i][callArgProp] == "function") {
-                    return args[i][callArgProp];
-                }
-            }
-
-            return null;
-        }
-
-        return args[callArgAt];
-    }
-
-    function getCallbackError(behavior, func, args) {
-        if (behavior.callArgAt < 0) {
-            var msg;
-
-            if (behavior.callArgProp) {
-                msg = sinon.functionName(behavior.stub) +
-                    " expected to yield to '" + behavior.callArgProp +
-                    "', but no object with such a property was passed.";
-            } else {
-                msg = sinon.functionName(behavior.stub) +
-                    " expected to yield, but no callback was passed.";
-            }
-
-            if (args.length > 0) {
-                msg += " Received [" + join.call(args, ", ") + "]";
-            }
-
-            return msg;
-        }
-
-        return "argument at index " + behavior.callArgAt + " is not a function: " + func;
-    }
-
-    function callCallback(behavior, args) {
-        if (typeof behavior.callArgAt == "number") {
-            var func = getCallback(behavior, args);
-
-            if (typeof func != "function") {
-                throw new TypeError(getCallbackError(behavior, func, args));
-            }
-
-            if (behavior.callbackAsync) {
-                nextTick(function() {
-                    func.apply(behavior.callbackContext, behavior.callbackArguments);
-                });
-            } else {
-                func.apply(behavior.callbackContext, behavior.callbackArguments);
-            }
-        }
-    }
-
-    proto = {
-        create: function(stub) {
-            var behavior = sinon.extend({}, sinon.behavior);
-            delete behavior.create;
-            behavior.stub = stub;
-
-            return behavior;
-        },
-
-        isPresent: function() {
-            return (typeof this.callArgAt == 'number' ||
-                    this.exception ||
-                    typeof this.returnArgAt == 'number' ||
-                    this.returnThis ||
-                    this.returnValueDefined);
-        },
-
-        invoke: function(context, args) {
-            callCallback(this, args);
-
-            if (this.exception) {
-                throw this.exception;
-            } else if (typeof this.returnArgAt == 'number') {
-                return args[this.returnArgAt];
-            } else if (this.returnThis) {
-                return context;
-            }
-
-            return this.returnValue;
-        },
-
-        onCall: function(index) {
-            return this.stub.onCall(index);
-        },
-
-        onFirstCall: function() {
-            return this.stub.onFirstCall();
-        },
-
-        onSecondCall: function() {
-            return this.stub.onSecondCall();
-        },
-
-        onThirdCall: function() {
-            return this.stub.onThirdCall();
-        },
-
-        withArgs: function(/* arguments */) {
-            throw new Error('Defining a stub by invoking "stub.onCall(...).withArgs(...)" is not supported. ' +
-                            'Use "stub.withArgs(...).onCall(...)" to define sequential behavior for calls with certain arguments.');
-        },
-
-        callsArg: function callsArg(pos) {
-            if (typeof pos != "number") {
-                throw new TypeError("argument index is not number");
-            }
-
-            this.callArgAt = pos;
-            this.callbackArguments = [];
-            this.callbackContext = undefined;
-            this.callArgProp = undefined;
-            this.callbackAsync = false;
-
-            return this;
-        },
-
-        callsArgOn: function callsArgOn(pos, context) {
-            if (typeof pos != "number") {
-                throw new TypeError("argument index is not number");
-            }
-            if (typeof context != "object") {
-                throw new TypeError("argument context is not an object");
-            }
-
-            this.callArgAt = pos;
-            this.callbackArguments = [];
-            this.callbackContext = context;
-            this.callArgProp = undefined;
-            this.callbackAsync = false;
-
-            return this;
-        },
-
-        callsArgWith: function callsArgWith(pos) {
-            if (typeof pos != "number") {
-                throw new TypeError("argument index is not number");
-            }
-
-            this.callArgAt = pos;
-            this.callbackArguments = slice.call(arguments, 1);
-            this.callbackContext = undefined;
-            this.callArgProp = undefined;
-            this.callbackAsync = false;
-
-            return this;
-        },
-
-        callsArgOnWith: function callsArgWith(pos, context) {
-            if (typeof pos != "number") {
-                throw new TypeError("argument index is not number");
-            }
-            if (typeof context != "object") {
-                throw new TypeError("argument context is not an object");
-            }
-
-            this.callArgAt = pos;
-            this.callbackArguments = slice.call(arguments, 2);
-            this.callbackContext = context;
-            this.callArgProp = undefined;
-            this.callbackAsync = false;
-
-            return this;
-        },
-
-        yields: function () {
-            this.callArgAt = -1;
-            this.callbackArguments = slice.call(arguments, 0);
-            this.callbackContext = undefined;
-            this.callArgProp = undefined;
-            this.callbackAsync = false;
-
-            return this;
-        },
-
-        yieldsOn: function (context) {
-            if (typeof context != "object") {
-                throw new TypeError("argument context is not an object");
-            }
-
-            this.callArgAt = -1;
-            this.callbackArguments = slice.call(arguments, 1);
-            this.callbackContext = context;
-            this.callArgProp = undefined;
-            this.callbackAsync = false;
-
-            return this;
-        },
-
-        yieldsTo: function (prop) {
-            this.callArgAt = -1;
-            this.callbackArguments = slice.call(arguments, 1);
-            this.callbackContext = undefined;
-            this.callArgProp = prop;
-            this.callbackAsync = false;
-
-            return this;
-        },
-
-        yieldsToOn: function (prop, context) {
-            if (typeof context != "object") {
-                throw new TypeError("argument context is not an object");
-            }
-
-            this.callArgAt = -1;
-            this.callbackArguments = slice.call(arguments, 2);
-            this.callbackContext = context;
-            this.callArgProp = prop;
-            this.callbackAsync = false;
-
-            return this;
-        },
-
-
-        "throws": throwsException,
-        throwsException: throwsException,
-
-        returns: function returns(value) {
-            this.returnValue = value;
-            this.returnValueDefined = true;
-
-            return this;
-        },
-
-        returnsArg: function returnsArg(pos) {
-            if (typeof pos != "number") {
-                throw new TypeError("argument index is not number");
-            }
-
-            this.returnArgAt = pos;
-
-            return this;
-        },
-
-        returnsThis: function returnsThis() {
-            this.returnThis = true;
-
-            return this;
-        }
-    };
-
-    // create asynchronous versions of callsArg* and yields* methods
-    for (var method in proto) {
-        // need to avoid creating anotherasync versions of the newly added async methods
-        if (proto.hasOwnProperty(method) &&
-            method.match(/^(callsArg|yields)/) &&
-            !method.match(/Async/)) {
-            proto[method + 'Async'] = (function (syncFnName) {
-                return function () {
-                    var result = this[syncFnName].apply(this, arguments);
-                    this.callbackAsync = true;
-                    return result;
-                };
-            })(method);
-        }
-    }
-
-    if (commonJSModule) {
-        module.exports = proto;
-    } else {
-        sinon.behavior = proto;
-    }
-}(typeof sinon == "object" && sinon || null));
-/**
- * @depend ../sinon.js
- * @depend spy.js
- * @depend behavior.js
- */
-/*jslint eqeqeq: false, onevar: false*/
-/*global module, require, sinon*/
-/**
- * Stub functions
- *
- * @author Christian Johansen (christian@cjohansen.no)
- * @license BSD
- *
- * Copyright (c) 2010-2013 Christian Johansen
- */
-
-(function (sinon) {
-    var commonJSModule = typeof module !== 'undefined' && module.exports;
-
-    if (!sinon && commonJSModule) {
-        sinon = require("../sinon");
-    }
-
-    if (!sinon) {
-        return;
-    }
-
-    function stub(object, property, func) {
-        if (!!func && typeof func != "function") {
-            throw new TypeError("Custom stub should be function");
-        }
-
-        var wrapper;
-
-        if (func) {
-            wrapper = sinon.spy && sinon.spy.create ? sinon.spy.create(func) : func;
-        } else {
-            wrapper = stub.create();
-        }
-
-        if (!object && typeof property === "undefined") {
-            return sinon.stub.create();
-        }
-
-        if (typeof property === "undefined" && typeof object == "object") {
-            for (var prop in object) {
-                if (typeof object[prop] === "function") {
-                    stub(object, prop);
-                }
-            }
-
-            return object;
-        }
-
-        return sinon.wrapMethod(object, property, wrapper);
-    }
-
-    function getDefaultBehavior(stub) {
-        return stub.defaultBehavior || getParentBehaviour(stub) || sinon.behavior.create(stub);
-    }
-
-    function getParentBehaviour(stub) {
-        return (stub.parent && getCurrentBehavior(stub.parent));
-    }
-
-    function getCurrentBehavior(stub) {
-        var behavior = stub.behaviors[stub.callCount - 1];
-        return behavior && behavior.isPresent() ? behavior : getDefaultBehavior(stub);
-    }
-
-    var uuid = 0;
-
-    sinon.extend(stub, (function () {
-        var proto = {
-            create: function create() {
-                var functionStub = function () {
-                    return getCurrentBehavior(functionStub).invoke(this, arguments);
-                };
-
-                functionStub.id = "stub#" + uuid++;
-                var orig = functionStub;
-                functionStub = sinon.spy.create(functionStub);
-                functionStub.func = orig;
-
-                sinon.extend(functionStub, stub);
-                functionStub._create = sinon.stub.create;
-                functionStub.displayName = "stub";
-                functionStub.toString = sinon.functionToString;
-
-                functionStub.defaultBehavior = null;
-                functionStub.behaviors = [];
-
-                return functionStub;
-            },
-
-            resetBehavior: function () {
-                var i;
-
-                this.defaultBehavior = null;
-                this.behaviors = [];
-
-                delete this.returnValue;
-                delete this.returnArgAt;
-                this.returnThis = false;
-
-                if (this.fakes) {
-                    for (i = 0; i < this.fakes.length; i++) {
-                        this.fakes[i].resetBehavior();
-                    }
-                }
-            },
-
-            onCall: function(index) {
-                if (!this.behaviors[index]) {
-                    this.behaviors[index] = sinon.behavior.create(this);
-                }
-
-                return this.behaviors[index];
-            },
-
-            onFirstCall: function() {
-                return this.onCall(0);
-            },
-
-            onSecondCall: function() {
-                return this.onCall(1);
-            },
-
-            onThirdCall: function() {
-                return this.onCall(2);
-            }
-        };
-
-        for (var method in sinon.behavior) {
-            if (sinon.behavior.hasOwnProperty(method) &&
-                !proto.hasOwnProperty(method) &&
-                method != 'create' &&
-                method != 'withArgs' &&
-                method != 'invoke') {
-                proto[method] = (function(behaviorMethod) {
-                    return function() {
-                        this.defaultBehavior = this.defaultBehavior || sinon.behavior.create(this);
-                        this.defaultBehavior[behaviorMethod].apply(this.defaultBehavior, arguments);
-                        return this;
-                    };
-                }(method));
-            }
-        }
-
-        return proto;
-    }()));
-
-    if (commonJSModule) {
-        module.exports = stub;
-    } else {
-        sinon.stub = stub;
-    }
-}(typeof sinon == "object" && sinon || null));
-
-/**
- * @depend ../sinon.js
- * @depend stub.js
- */
-/*jslint eqeqeq: false, onevar: false, nomen: false*/
-/*global module, require, sinon*/
-/**
- * Mock functions.
- *
- * @author Christian Johansen (christian@cjohansen.no)
- * @license BSD
- *
- * Copyright (c) 2010-2013 Christian Johansen
- */
-
-(function (sinon) {
-    var commonJSModule = typeof module !== 'undefined' && module.exports;
-    var push = [].push;
-    var match;
-
-    if (!sinon && commonJSModule) {
-        sinon = require("../sinon");
-    }
-
-    if (!sinon) {
-        return;
-    }
-
-    match = sinon.match;
-
-    if (!match && commonJSModule) {
-        match = require("./match");
-    }
-
-    function mock(object) {
-        if (!object) {
-            return sinon.expectation.create("Anonymous mock");
-        }
-
-        return mock.create(object);
-    }
-
-    sinon.mock = mock;
-
-    sinon.extend(mock, (function () {
-        function each(collection, callback) {
-            if (!collection) {
-                return;
-            }
-
-            for (var i = 0, l = collection.length; i < l; i += 1) {
-                callback(collection[i]);
-            }
-        }
-
-        return {
-            create: function create(object) {
-                if (!object) {
-                    throw new TypeError("object is null");
-                }
-
-                var mockObject = sinon.extend({}, mock);
-                mockObject.object = object;
-                delete mockObject.create;
-
-                return mockObject;
-            },
-
-            expects: function expects(method) {
-                if (!method) {
-                    throw new TypeError("method is falsy");
-                }
-
-                if (!this.expectations) {
-                    this.expectations = {};
-                    this.proxies = [];
-                }
-
-                if (!this.expectations[method]) {
-                    this.expectations[method] = [];
-                    var mockObject = this;
-
-                    sinon.wrapMethod(this.object, method, function () {
-                        return mockObject.invokeMethod(method, this, arguments);
-                    });
-
-                    push.call(this.proxies, method);
-                }
-
-                var expectation = sinon.expectation.create(method);
-                push.call(this.expectations[method], expectation);
-
-                return expectation;
-            },
-
-            restore: function restore() {
-                var object = this.object;
-
-                each(this.proxies, function (proxy) {
-                    if (typeof object[proxy].restore == "function") {
-                        object[proxy].restore();
-                    }
-                });
-            },
-
-            verify: function verify() {
-                var expectations = this.expectations || {};
-                var messages = [], met = [];
-
-                each(this.proxies, function (proxy) {
-                    each(expectations[proxy], function (expectation) {
-                        if (!expectation.met()) {
-                            push.call(messages, expectation.toString());
-                        } else {
-                            push.call(met, expectation.toString());
-                        }
-                    });
-                });
-
-                this.restore();
-
-                if (messages.length > 0) {
-                    sinon.expectation.fail(messages.concat(met).join("\n"));
-                } else {
-                    sinon.expectation.pass(messages.concat(met).join("\n"));
-                }
-
-                return true;
-            },
-
-            invokeMethod: function invokeMethod(method, thisValue, args) {
-                var expectations = this.expectations && this.expectations[method];
-                var length = expectations && expectations.length || 0, i;
-
-                for (i = 0; i < length; i += 1) {
-                    if (!expectations[i].met() &&
-                        expectations[i].allowsCall(thisValue, args)) {
-                        return expectations[i].apply(thisValue, args);
-                    }
-                }
-
-                var messages = [], available, exhausted = 0;
-
-                for (i = 0; i < length; i += 1) {
-                    if (expectations[i].allowsCall(thisValue, args)) {
-                        available = available || expectations[i];
-                    } else {
-                        exhausted += 1;
-                    }
-                    push.call(messages, "    " + expectations[i].toString());
-                }
-
-                if (exhausted === 0) {
-                    return available.apply(thisValue, args);
-                }
-
-                messages.unshift("Unexpected call: " + sinon.spyCall.toString.call({
-                    proxy: method,
-                    args: args
-                }));
-
-                sinon.expectation.fail(messages.join("\n"));
-            }
-        };
-    }()));
-
-    var times = sinon.timesInWords;
-
-    sinon.expectation = (function () {
-        var slice = Array.prototype.slice;
-        var _invoke = sinon.spy.invoke;
-
-        function callCountInWords(callCount) {
-            if (callCount == 0) {
-                return "never called";
-            } else {
-                return "called " + times(callCount);
-            }
-        }
-
-        function expectedCallCountInWords(expectation) {
-            var min = expectation.minCalls;
-            var max = expectation.maxCalls;
-
-            if (typeof min == "number" && typeof max == "number") {
-                var str = times(min);
-
-                if (min != max) {
-                    str = "at least " + str + " and at most " + times(max);
-                }
-
-                return str;
-            }
-
-            if (typeof min == "number") {
-                return "at least " + times(min);
-            }
-
-            return "at most " + times(max);
-        }
-
-        function receivedMinCalls(expectation) {
-            var hasMinLimit = typeof expectation.minCalls == "number";
-            return !hasMinLimit || expectation.callCount >= expectation.minCalls;
-        }
-
-        function receivedMaxCalls(expectation) {
-            if (typeof expectation.maxCalls != "number") {
-                return false;
-            }
-
-            return expectation.callCount == expectation.maxCalls;
-        }
-
-        function verifyMatcher(possibleMatcher, arg){
-            if (match && match.isMatcher(possibleMatcher)) {
-                return possibleMatcher.test(arg);
-            } else {
-                return true;
-            }
-        }
-
-        return {
-            minCalls: 1,
-            maxCalls: 1,
-
-            create: function create(methodName) {
-                var expectation = sinon.extend(sinon.stub.create(), sinon.expectation);
-                delete expectation.create;
-                expectation.method = methodName;
-
-                return expectation;
-            },
-
-            invoke: function invoke(func, thisValue, args) {
-                this.verifyCallAllowed(thisValue, args);
-
-                return _invoke.apply(this, arguments);
-            },
-
-            atLeast: function atLeast(num) {
-                if (typeof num != "number") {
-                    throw new TypeError("'" + num + "' is not number");
-                }
-
-                if (!this.limitsSet) {
-                    this.maxCalls = null;
-                    this.limitsSet = true;
-                }
-
-                this.minCalls = num;
-
-                return this;
-            },
-
-            atMost: function atMost(num) {
-                if (typeof num != "number") {
-                    throw new TypeError("'" + num + "' is not number");
-                }
-
-                if (!this.limitsSet) {
-                    this.minCalls = null;
-                    this.limitsSet = true;
-                }
-
-                this.maxCalls = num;
-
-                return this;
-            },
-
-            never: function never() {
-                return this.exactly(0);
-            },
-
-            once: function once() {
-                return this.exactly(1);
-            },
-
-            twice: function twice() {
-                return this.exactly(2);
-            },
-
-            thrice: function thrice() {
-                return this.exactly(3);
-            },
-
-            exactly: function exactly(num) {
-                if (typeof num != "number") {
-                    throw new TypeError("'" + num + "' is not a number");
-                }
-
-                this.atLeast(num);
-                return this.atMost(num);
-            },
-
-            met: function met() {
-                return !this.failed && receivedMinCalls(this);
-            },
-
-            verifyCallAllowed: function verifyCallAllowed(thisValue, args) {
-                if (receivedMaxCalls(this)) {
-                    this.failed = true;
-                    sinon.expectation.fail(this.method + " already called " + times(this.maxCalls));
-                }
-
-                if ("expectedThis" in this && this.expectedThis !== thisValue) {
-                    sinon.expectation.fail(this.method + " called with " + thisValue + " as thisValue, expected " +
-                        this.expectedThis);
-                }
-
-                if (!("expectedArguments" in this)) {
-                    return;
-                }
-
-                if (!args) {
-                    sinon.expectation.fail(this.method + " received no arguments, expected " +
-                        sinon.format(this.expectedArguments));
-                }
-
-                if (args.length < this.expectedArguments.length) {
-                    sinon.expectation.fail(this.method + " received too few arguments (" + sinon.format(args) +
-                        "), expected " + sinon.format(this.expectedArguments));
-                }
-
-                if (this.expectsExactArgCount &&
-                    args.length != this.expectedArguments.length) {
-                    sinon.expectation.fail(this.method + " received too many arguments (" + sinon.format(args) +
-                        "), expected " + sinon.format(this.expectedArguments));
-                }
-
-                for (var i = 0, l = this.expectedArguments.length; i < l; i += 1) {
-
-                    if (!verifyMatcher(this.expectedArguments[i],args[i])) {
-                        sinon.expectation.fail(this.method + " received wrong arguments " + sinon.format(args) +
-                            ", didn't match " + this.expectedArguments.toString());
-                    }
-
-                    if (!sinon.deepEqual(this.expectedArguments[i], args[i])) {
-                        sinon.expectation.fail(this.method + " received wrong arguments " + sinon.format(args) +
-                            ", expected " + sinon.format(this.expectedArguments));
-                    }
-                }
-            },
-
-            allowsCall: function allowsCall(thisValue, args) {
-                if (this.met() && receivedMaxCalls(this)) {
-                    return false;
-                }
-
-                if ("expectedThis" in this && this.expectedThis !== thisValue) {
-                    return false;
-                }
-
-                if (!("expectedArguments" in this)) {
-                    return true;
-                }
-
-                args = args || [];
-
-                if (args.length < this.expectedArguments.length) {
-                    return false;
-                }
-
-                if (this.expectsExactArgCount &&
-                    args.length != this.expectedArguments.length) {
-                    return false;
-                }
-
-                for (var i = 0, l = this.expectedArguments.length; i < l; i += 1) {
-                    if (!verifyMatcher(this.expectedArguments[i],args[i])) {
-                        return false;
-                    }
-
-                    if (!sinon.deepEqual(this.expectedArguments[i], args[i])) {
-                        return false;
-                    }
-                }
-
-                return true;
-            },
-
-            withArgs: function withArgs() {
-                this.expectedArguments = slice.call(arguments);
-                return this;
-            },
-
-            withExactArgs: function withExactArgs() {
-                this.withArgs.apply(this, arguments);
-                this.expectsExactArgCount = true;
-                return this;
-            },
-
-            on: function on(thisValue) {
-                this.expectedThis = thisValue;
-                return this;
-            },
-
-            toString: function () {
-                var args = (this.expectedArguments || []).slice();
-
-                if (!this.expectsExactArgCount) {
-                    push.call(args, "[...]");
-                }
-
-                var callStr = sinon.spyCall.toString.call({
-                    proxy: this.method || "anonymous mock expectation",
-                    args: args
-                });
-
-                var message = callStr.replace(", [...", "[, ...") + " " +
-                    expectedCallCountInWords(this);
-
-                if (this.met()) {
-                    return "Expectation met: " + message;
-                }
-
-                return "Expected " + message + " (" +
-                    callCountInWords(this.callCount) + ")";
-            },
-
-            verify: function verify() {
-                if (!this.met()) {
-                    sinon.expectation.fail(this.toString());
-                } else {
-                    sinon.expectation.pass(this.toString());
-                }
-
-                return true;
-            },
-
-            pass: function(message) {
-              sinon.assert.pass(message);
-            },
-            fail: function (message) {
-                var exception = new Error(message);
-                exception.name = "ExpectationError";
-
-                throw exception;
-            }
-        };
-    }());
-
-    if (commonJSModule) {
-        module.exports = mock;
-    } else {
-        sinon.mock = mock;
-    }
-}(typeof sinon == "object" && sinon || null));
-
-/**
- * @depend ../sinon.js
- * @depend stub.js
- * @depend mock.js
- */
-/*jslint eqeqeq: false, onevar: false, forin: true*/
-/*global module, require, sinon*/
-/**
- * Collections of stubs, spies and mocks.
- *
- * @author Christian Johansen (christian@cjohansen.no)
- * @license BSD
- *
- * Copyright (c) 2010-2013 Christian Johansen
- */
-
-(function (sinon) {
-    var commonJSModule = typeof module !== 'undefined' && module.exports;
-    var push = [].push;
-    var hasOwnProperty = Object.prototype.hasOwnProperty;
-
-    if (!sinon && commonJSModule) {
-        sinon = require("../sinon");
-    }
-
-    if (!sinon) {
-        return;
-    }
-
-    function getFakes(fakeCollection) {
-        if (!fakeCollection.fakes) {
-            fakeCollection.fakes = [];
-        }
-
-        return fakeCollection.fakes;
-    }
-
-    function each(fakeCollection, method) {
-        var fakes = getFakes(fakeCollection);
-
-        for (var i = 0, l = fakes.length; i < l; i += 1) {
-            if (typeof fakes[i][method] == "function") {
-                fakes[i][method]();
-            }
-        }
-    }
-
-    function compact(fakeCollection) {
-        var fakes = getFakes(fakeCollection);
-        var i = 0;
-        while (i < fakes.length) {
-          fakes.splice(i, 1);
-        }
-    }
-
-    var collection = {
-        verify: function resolve() {
-            each(this, "verify");
-        },
-
-        restore: function restore() {
-            each(this, "restore");
-            compact(this);
-        },
-
-        verifyAndRestore: function verifyAndRestore() {
-            var exception;
-
-            try {
-                this.verify();
-            } catch (e) {
-                exception = e;
-            }
-
-            this.restore();
-
-            if (exception) {
-                throw exception;
-            }
-        },
-
-        add: function add(fake) {
-            push.call(getFakes(this), fake);
-            return fake;
-        },
-
-        spy: function spy() {
-            return this.add(sinon.spy.apply(sinon, arguments));
-        },
-
-        stub: function stub(object, property, value) {
-            if (property) {
-                var original = object[property];
-
-                if (typeof original != "function") {
-                    if (!hasOwnProperty.call(object, property)) {
-                        throw new TypeError("Cannot stub non-existent own property " + property);
-                    }
-
-                    object[property] = value;
-
-                    return this.add({
-                        restore: function () {
-                            object[property] = original;
-                        }
-                    });
-                }
-            }
-            if (!property && !!object && typeof object == "object") {
-                var stubbedObj = sinon.stub.apply(sinon, arguments);
-
-                for (var prop in stubbedObj) {
-                    if (typeof stubbedObj[prop] === "function") {
-                        this.add(stubbedObj[prop]);
-                    }
-                }
-
-                return stubbedObj;
-            }
-
-            return this.add(sinon.stub.apply(sinon, arguments));
-        },
-
-        mock: function mock() {
-            return this.add(sinon.mock.apply(sinon, arguments));
-        },
-
-        inject: function inject(obj) {
-            var col = this;
-
-            obj.spy = function () {
-                return col.spy.apply(col, arguments);
-            };
-
-            obj.stub = function () {
-                return col.stub.apply(col, arguments);
-            };
-
-            obj.mock = function () {
-                return col.mock.apply(col, arguments);
-            };
-
-            return obj;
-        }
-    };
-
-    if (commonJSModule) {
-        module.exports = collection;
-    } else {
-        sinon.collection = collection;
-    }
-}(typeof sinon == "object" && sinon || null));
-
-/*jslint eqeqeq: false, plusplus: false, evil: true, onevar: false, browser: true, forin: false*/
-/*global module, require, window*/
-/**
- * Fake timer API
- * setTimeout
- * setInterval
- * clearTimeout
- * clearInterval
- * tick
- * reset
- * Date
- *
- * Inspired by jsUnitMockTimeOut from JsUnit
- *
- * @author Christian Johansen (christian@cjohansen.no)
- * @license BSD
- *
- * Copyright (c) 2010-2013 Christian Johansen
- */
-
-if (typeof sinon == "undefined") {
-    var sinon = {};
-}
-
-(function (global) {
-    var id = 1;
-
-    function addTimer(args, recurring) {
-        if (args.length === 0) {
-            throw new Error("Function requires at least 1 parameter");
-        }
-
-        if (typeof args[0] === "undefined") {
-            throw new Error("Callback must be provided to timer calls");
-        }
-
-        var toId = id++;
-        var delay = args[1] || 0;
-
-        if (!this.timeouts) {
-            this.timeouts = {};
-        }
-
-        this.timeouts[toId] = {
-            id: toId,
-            func: args[0],
-            callAt: this.now + delay,
-            invokeArgs: Array.prototype.slice.call(args, 2)
-        };
-
-        if (recurring === true) {
-            this.timeouts[toId].interval = delay;
-        }
-
-        return toId;
-    }
-
-    function parseTime(str) {
-        if (!str) {
-            return 0;
-        }
-
-        var strings = str.split(":");
-        var l = strings.length, i = l;
-        var ms = 0, parsed;
-
-        if (l > 3 || !/^(\d\d:){0,2}\d\d?$/.test(str)) {
-            throw new Error("tick only understands numbers and 'h:m:s'");
-        }
-
-        while (i--) {
-            parsed = parseInt(strings[i], 10);
-
-            if (parsed >= 60) {
-                throw new Error("Invalid time " + str);
-            }
-
-            ms += parsed * Math.pow(60, (l - i - 1));
-        }
-
-        return ms * 1000;
-    }
-
-    function createObject(object) {
-        var newObject;
-
-        if (Object.create) {
-            newObject = Object.create(object);
-        } else {
-            var F = function () {};
-            F.prototype = object;
-            newObject = new F();
-        }
-
-        newObject.Date.clock = newObject;
-        return newObject;
-    }
-
-    sinon.clock = {
-        now: 0,
-
-        create: function create(now) {
-            var clock = createObject(this);
-
-            if (typeof now == "number") {
-                clock.now = now;
-            }
-
-            if (!!now && typeof now == "object") {
-                throw new TypeError("now should be milliseconds since UNIX epoch");
-            }
-
-            return clock;
-        },
-
-        setTimeout: function setTimeout(callback, timeout) {
-            return addTimer.call(this, arguments, false);
-        },
-
-        clearTimeout: function clearTimeout(timerId) {
-            if (!this.timeouts) {
-                this.timeouts = [];
-            }
-
-            if (timerId in this.timeouts) {
-                delete this.timeouts[timerId];
-            }
-        },
-
-        setInterval: function setInterval(callback, timeout) {
-            return addTimer.call(this, arguments, true);
-        },
-
-        clearInterval: function clearInterval(timerId) {
-            this.clearTimeout(timerId);
-        },
-
-        setImmediate: function setImmediate(callback) {
-            var passThruArgs = Array.prototype.slice.call(arguments, 1);
-
-            return addTimer.call(this, [callback, 0].concat(passThruArgs), false);
-        },
-
-        clearImmediate: function clearImmediate(timerId) {
-            this.clearTimeout(timerId);
-        },
-
-        tick: function tick(ms) {
-            ms = typeof ms == "number" ? ms : parseTime(ms);
-            var tickFrom = this.now, tickTo = this.now + ms, previous = this.now;
-            var timer = this.firstTimerInRange(tickFrom, tickTo);
-
-            var firstException;
-            while (timer && tickFrom <= tickTo) {
-                if (this.timeouts[timer.id]) {
-                    tickFrom = this.now = timer.callAt;
-                    try {
-                      this.callTimer(timer);
-                    } catch (e) {
-                      firstException = firstException || e;
-                    }
-                }
-
-                timer = this.firstTimerInRange(previous, tickTo);
-                previous = tickFrom;
-            }
-
-            this.now = tickTo;
-
-            if (firstException) {
-              throw firstException;
-            }
-
-            return this.now;
-        },
-
-        firstTimerInRange: function (from, to) {
-            var timer, smallest = null, originalTimer;
-
-            for (var id in this.timeouts) {
-                if (this.timeouts.hasOwnProperty(id)) {
-                    if (this.timeouts[id].callAt < from || this.timeouts[id].callAt > to) {
-                        continue;
-                    }
-
-                    if (smallest === null || this.timeouts[id].callAt < smallest) {
-                        originalTimer = this.timeouts[id];
-                        smallest = this.timeouts[id].callAt;
-
-                        timer = {
-                            func: this.timeouts[id].func,
-                            callAt: this.timeouts[id].callAt,
-                            interval: this.timeouts[id].interval,
-                            id: this.timeouts[id].id,
-                            invokeArgs: this.timeouts[id].invokeArgs
-                        };
-                    }
-                }
-            }
-
-            return timer || null;
-        },
-
-        callTimer: function (timer) {
-            if (typeof timer.interval == "number") {
-                this.timeouts[timer.id].callAt += timer.interval;
-            } else {
-                delete this.timeouts[timer.id];
-            }
-
-            try {
-                if (typeof timer.func == "function") {
-                    timer.func.apply(null, timer.invokeArgs);
-                } else {
-                    eval(timer.func);
-                }
-            } catch (e) {
-              var exception = e;
-            }
-
-            if (!this.timeouts[timer.id]) {
-                if (exception) {
-                  throw exception;
-                }
-                return;
-            }
-
-            if (exception) {
-              throw exception;
-            }
-        },
-
-        reset: function reset() {
-            this.timeouts = {};
-        },
-
-        Date: (function () {
-            var NativeDate = Date;
-
-            function ClockDate(year, month, date, hour, minute, second, ms) {
-                // Defensive and verbose to avoid potential harm in passing
-                // explicit undefined when user does not pass argument
-                switch (arguments.length) {
-                case 0:
-                    return new NativeDate(ClockDate.clock.now);
-                case 1:
-                    return new NativeDate(year);
-                case 2:
-                    return new NativeDate(year, month);
-                case 3:
-                    return new NativeDate(year, month, date);
-                case 4:
-                    return new NativeDate(year, month, date, hour);
-                case 5:
-                    return new NativeDate(year, month, date, hour, minute);
-                case 6:
-                    return new NativeDate(year, month, date, hour, minute, second);
-                default:
-                    return new NativeDate(year, month, date, hour, minute, second, ms);
-                }
-            }
-
-            return mirrorDateProperties(ClockDate, NativeDate);
-        }())
-    };
-
-    function mirrorDateProperties(target, source) {
-        if (source.now) {
-            target.now = function now() {
-                return target.clock.now;
-            };
-        } else {
-            delete target.now;
-        }
-
-        if (source.toSource) {
-            target.toSource = function toSource() {
-                return source.toSource();
-            };
-        } else {
-            delete target.toSource;
-        }
-
-        target.toString = function toString() {
-            return source.toString();
-        };
-
-        target.prototype = source.prototype;
-        target.parse = source.parse;
-        target.UTC = source.UTC;
-        target.prototype.toUTCString = source.prototype.toUTCString;
-
-        for (var prop in source) {
-            if (source.hasOwnProperty(prop)) {
-                target[prop] = source[prop];
-            }
-        }
-
-        return target;
-    }
-
-    var methods = ["Date", "setTimeout", "setInterval",
-                   "clearTimeout", "clearInterval"];
-
-    if (typeof global.setImmediate !== "undefined") {
-        methods.push("setImmediate");
-    }
-
-    if (typeof global.clearImmediate !== "undefined") {
-        methods.push("clearImmediate");
-    }
-
-    function restore() {
-        var method;
-
-        for (var i = 0, l = this.methods.length; i < l; i++) {
-            method = this.methods[i];
-
-            if (global[method].hadOwnProperty) {
-                global[method] = this["_" + method];
-            } else {
-                try {
-                    delete global[method];
-                } catch (e) {}
-            }
-        }
-
-        // Prevent multiple executions which will completely remove these props
-        this.methods = [];
-    }
-
-    function stubGlobal(method, clock) {
-        clock[method].hadOwnProperty = Object.prototype.hasOwnProperty.call(global, method);
-        clock["_" + method] = global[method];
-
-        if (method == "Date") {
-            var date = mirrorDateProperties(clock[method], global[method]);
-            global[method] = date;
-        } else {
-            global[method] = function () {
-                return clock[method].apply(clock, arguments);
-            };
-
-            for (var prop in clock[method]) {
-                if (clock[method].hasOwnProperty(prop)) {
-                    global[method][prop] = clock[method][prop];
-                }
-            }
-        }
-
-        global[method].clock = clock;
-    }
-
-    sinon.useFakeTimers = function useFakeTimers(now) {
-        var clock = sinon.clock.create(now);
-        clock.restore = restore;
-        clock.methods = Array.prototype.slice.call(arguments,
-                                                   typeof now == "number" ? 1 : 0);
-
-        if (clock.methods.length === 0) {
-            clock.methods = methods;
-        }
-
-        for (var i = 0, l = clock.methods.length; i < l; i++) {
-            stubGlobal(clock.methods[i], clock);
-        }
-
-        return clock;
-    };
-}(typeof global != "undefined" && typeof global !== "function" ? global : this));
-
-sinon.timers = {
-    setTimeout: setTimeout,
-    clearTimeout: clearTimeout,
-    setImmediate: (typeof setImmediate !== "undefined" ? setImmediate : undefined),
-    clearImmediate: (typeof clearImmediate !== "undefined" ? clearImmediate: undefined),
-    setInterval: setInterval,
-    clearInterval: clearInterval,
-    Date: Date
-};
-
-if (typeof module !== 'undefined' && module.exports) {
-    module.exports = sinon;
-}
-
-/*jslint eqeqeq: false, onevar: false*/
-/*global sinon, module, require, ActiveXObject, XMLHttpRequest, DOMParser*/
-/**
- * Minimal Event interface implementation
- *
- * Original implementation by Sven Fuchs: https://gist.github.com/995028
- * Modifications and tests by Christian Johansen.
- *
- * @author Sven Fuchs (svenfuchs@artweb-design.de)
- * @author Christian Johansen (christian@cjohansen.no)
- * @license BSD
- *
- * Copyright (c) 2011 Sven Fuchs, Christian Johansen
- */
-
-if (typeof sinon == "undefined") {
-    this.sinon = {};
-}
-
-(function () {
-    var push = [].push;
-
-    sinon.Event = function Event(type, bubbles, cancelable, target) {
-        this.initEvent(type, bubbles, cancelable, target);
-    };
-
-    sinon.Event.prototype = {
-        initEvent: function(type, bubbles, cancelable, target) {
-            this.type = type;
-            this.bubbles = bubbles;
-            this.cancelable = cancelable;
-            this.target = target;
-        },
-
-        stopPropagation: function () {},
-
-        preventDefault: function () {
-            this.defaultPrevented = true;
-        }
-    };
-
-    sinon.ProgressEvent = function ProgressEvent(type, progressEventRaw, target) {
-        this.initEvent(type, false, false, target);
-        this.loaded = progressEventRaw.loaded || null;
-        this.total = progressEventRaw.total || null;
-    };
-
-    sinon.ProgressEvent.prototype = new sinon.Event();
-
-    sinon.ProgressEvent.prototype.constructor =  sinon.ProgressEvent;
-
-    sinon.CustomEvent = function CustomEvent(type, customData, target) {
-        this.initEvent(type, false, false, target);
-        this.detail = customData.detail || null;
-    };
-
-    sinon.CustomEvent.prototype = new sinon.Event();
-
-    sinon.CustomEvent.prototype.constructor =  sinon.CustomEvent;
-
-    sinon.EventTarget = {
-        addEventListener: function addEventListener(event, listener) {
-            this.eventListeners = this.eventListeners || {};
-            this.eventListeners[event] = this.eventListeners[event] || [];
-            push.call(this.eventListeners[event], listener);
-        },
-
-        removeEventListener: function removeEventListener(event, listener) {
-            var listeners = this.eventListeners && this.eventListeners[event] || [];
-
-            for (var i = 0, l = listeners.length; i < l; ++i) {
-                if (listeners[i] == listener) {
-                    return listeners.splice(i, 1);
-                }
-            }
-        },
-
-        dispatchEvent: function dispatchEvent(event) {
-            var type = event.type;
-            var listeners = this.eventListeners && this.eventListeners[type] || [];
-
-            for (var i = 0; i < listeners.length; i++) {
-                if (typeof listeners[i] == "function") {
-                    listeners[i].call(this, event);
-                } else {
-                    listeners[i].handleEvent(event);
-                }
-            }
-
-            return !!event.defaultPrevented;
-        }
-    };
-}());
-
-/**
- * @depend ../../sinon.js
- * @depend event.js
- */
-/*jslint eqeqeq: false, onevar: false*/
-/*global sinon, module, require, ActiveXObject, XMLHttpRequest, DOMParser*/
-/**
- * Fake XMLHttpRequest object
- *
- * @author Christian Johansen (christian@cjohansen.no)
- * @license BSD
- *
- * Copyright (c) 2010-2013 Christian Johansen
- */
-
-// wrapper for global
-(function(global) {
-    if (typeof sinon === "undefined") {
-        global.sinon = {};
-    }
-
-    var supportsProgress = typeof ProgressEvent !== "undefined";
-    var supportsCustomEvent = typeof CustomEvent !== "undefined";
-    sinon.xhr = { XMLHttpRequest: global.XMLHttpRequest };
-    var xhr = sinon.xhr;
-    xhr.GlobalXMLHttpRequest = global.XMLHttpRequest;
-    xhr.GlobalActiveXObject = global.ActiveXObject;
-    xhr.supportsActiveX = typeof xhr.GlobalActiveXObject != "undefined";
-    xhr.supportsXHR = typeof xhr.GlobalXMLHttpRequest != "undefined";
-    xhr.workingXHR = xhr.supportsXHR ? xhr.GlobalXMLHttpRequest : xhr.supportsActiveX
-                                     ? function() { return new xhr.GlobalActiveXObject("MSXML2.XMLHTTP.3.0") } : false;
-    xhr.supportsCORS = 'withCredentials' in (new sinon.xhr.GlobalXMLHttpRequest());
-
-    /*jsl:ignore*/
-    var unsafeHeaders = {
-        "Accept-Charset": true,
-        "Accept-Encoding": true,
-        "Connection": true,
-        "Content-Length": true,
-        "Cookie": true,
-        "Cookie2": true,
-        "Content-Transfer-Encoding": true,
-        "Date": true,
-        "Expect": true,
-        "Host": true,
-        "Keep-Alive": true,
-        "Referer": true,
-        "TE": true,
-        "Trailer": true,
-        "Transfer-Encoding": true,
-        "Upgrade": true,
-        "User-Agent": true,
-        "Via": true
-    };
-    /*jsl:end*/
-
-    function FakeXMLHttpRequest() {
-        this.readyState = FakeXMLHttpRequest.UNSENT;
-        this.requestHeaders = {};
-        this.requestBody = null;
-        this.status = 0;
-        this.statusText = "";
-        this.upload = new UploadProgress();
-        if (sinon.xhr.supportsCORS) {
-            this.withCredentials = false;
-        }
-
-
-        var xhr = this;
-        var events = ["loadstart", "load", "abort", "loadend"];
-
-        function addEventListener(eventName) {
-            xhr.addEventListener(eventName, function (event) {
-                var listener = xhr["on" + eventName];
-
-                if (listener && typeof listener == "function") {
-                    listener.call(this, event);
-                }
-            });
-        }
-
-        for (var i = events.length - 1; i >= 0; i--) {
-            addEventListener(events[i]);
-        }
-
-        if (typeof FakeXMLHttpRequest.onCreate == "function") {
-            FakeXMLHttpRequest.onCreate(this);
-        }
-    }
-
-    // An upload object is created for each
-    // FakeXMLHttpRequest and allows upload
-    // events to be simulated using uploadProgress
-    // and uploadError.
-    function UploadProgress() {
-        this.eventListeners = {
-            "progress": [],
-            "load": [],
-            "abort": [],
-            "error": []
-        }
-    }
-
-    UploadProgress.prototype.addEventListener = function(event, listener) {
-        this.eventListeners[event].push(listener);
-    };
-
-    UploadProgress.prototype.removeEventListener = function(event, listener) {
-        var listeners = this.eventListeners[event] || [];
-
-        for (var i = 0, l = listeners.length; i < l; ++i) {
-            if (listeners[i] == listener) {
-                return listeners.splice(i, 1);
-            }
-        }
-    };
-
-    UploadProgress.prototype.dispatchEvent = function(event) {
-        var listeners = this.eventListeners[event.type] || [];
-
-        for (var i = 0, listener; (listener = listeners[i]) != null; i++) {
-            listener(event);
-        }
-    };
-
-    function verifyState(xhr) {
-        if (xhr.readyState !== FakeXMLHttpRequest.OPENED) {
-            throw new Error("INVALID_STATE_ERR");
-        }
-
-        if (xhr.sendFlag) {
-            throw new Error("INVALID_STATE_ERR");
-        }
-    }
-
-    // filtering to enable a white-list version of Sinon FakeXhr,
-    // where whitelisted requests are passed through to real XHR
-    function each(collection, callback) {
-        if (!collection) return;
-        for (var i = 0, l = collection.length; i < l; i += 1) {
-            callback(collection[i]);
-        }
-    }
-    function some(collection, callback) {
-        for (var index = 0; index < collection.length; index++) {
-            if(callback(collection[index]) === true) return true;
-        }
-        return false;
-    }
-    // largest arity in XHR is 5 - XHR#open
-    var apply = function(obj,method,args) {
-        switch(args.length) {
-        case 0: return obj[method]();
-        case 1: return obj[method](args[0]);
-        case 2: return obj[method](args[0],args[1]);
-        case 3: return obj[method](args[0],args[1],args[2]);
-        case 4: return obj[method](args[0],args[1],args[2],args[3]);
-        case 5: return obj[method](args[0],args[1],args[2],args[3],args[4]);
-        }
-    };
-
-    FakeXMLHttpRequest.filters = [];
-    FakeXMLHttpRequest.addFilter = function(fn) {
-        this.filters.push(fn)
-    };
-    var IE6Re = /MSIE 6/;
-    FakeXMLHttpRequest.defake = function(fakeXhr,xhrArgs) {
-        var xhr = new sinon.xhr.workingXHR();
-        each(["open","setRequestHeader","send","abort","getResponseHeader",
-              "getAllResponseHeaders","addEventListener","overrideMimeType","removeEventListener"],
-             function(method) {
-                 fakeXhr[method] = function() {
-                   return apply(xhr,method,arguments);
-                 };
-             });
-
-        var copyAttrs = function(args) {
-            each(args, function(attr) {
-              try {
-                fakeXhr[attr] = xhr[attr]
-              } catch(e) {
-                if(!IE6Re.test(navigator.userAgent)) throw e;
-              }
-            });
-        };
-
-        var stateChange = function() {
-            fakeXhr.readyState = xhr.readyState;
-            if(xhr.readyState >= FakeXMLHttpRequest.HEADERS_RECEIVED) {
-                copyAttrs(["status","statusText"]);
-            }
-            if(xhr.readyState >= FakeXMLHttpRequest.LOADING) {
-                copyAttrs(["responseText"]);
-            }
-            if(xhr.readyState === FakeXMLHttpRequest.DONE) {
-                copyAttrs(["responseXML"]);
-            }
-            if(fakeXhr.onreadystatechange) fakeXhr.onreadystatechange.call(fakeXhr, { target: fakeXhr });
-        };
-        if(xhr.addEventListener) {
-          for(var event in fakeXhr.eventListeners) {
-              if(fakeXhr.eventListeners.hasOwnProperty(event)) {
-                  each(fakeXhr.eventListeners[event],function(handler) {
-                      xhr.addEventListener(event, handler);
-                  });
-              }
-          }
-          xhr.addEventListener("readystatechange",stateChange);
-        } else {
-          xhr.onreadystatechange = stateChange;
-        }
-        apply(xhr,"open",xhrArgs);
-    };
-    FakeXMLHttpRequest.useFilters = false;
-
-    function verifyRequestOpened(xhr) {
-        if (xhr.readyState != FakeXMLHttpRequest.OPENED) {
-            throw new Error("INVALID_STATE_ERR - " + xhr.readyState);
-        }
-    }
-
-    function verifyRequestSent(xhr) {
-        if (xhr.readyState == FakeXMLHttpRequest.DONE) {
-            throw new Error("Request done");
-        }
-    }
-
-    function verifyHeadersReceived(xhr) {
-        if (xhr.async && xhr.readyState != FakeXMLHttpRequest.HEADERS_RECEIVED) {
-            throw new Error("No headers received");
-        }
-    }
-
-    function verifyResponseBodyType(body) {
-        if (typeof body != "string") {
-            var error = new Error("Attempted to respond to fake XMLHttpRequest with " +
-                                 body + ", which is not a string.");
-            error.name = "InvalidBodyException";
-            throw error;
-        }
-    }
-
-    sinon.extend(FakeXMLHttpRequest.prototype, sinon.EventTarget, {
-        async: true,
-
-        open: function open(method, url, async, username, password) {
-            this.method = method;
-            this.url = url;
-            this.async = typeof async == "boolean" ? async : true;
-            this.username = username;
-            this.password = password;
-            this.responseText = null;
-            this.responseXML = null;
-            this.requestHeaders = {};
-            this.sendFlag = false;
-            if(sinon.FakeXMLHttpRequest.useFilters === true) {
-                var xhrArgs = arguments;
-                var defake = some(FakeXMLHttpRequest.filters,function(filter) {
-                    return filter.apply(this,xhrArgs)
-                });
-                if (defake) {
-                  return sinon.FakeXMLHttpRequest.defake(this,arguments);
-                }
-            }
-            this.readyStateChange(FakeXMLHttpRequest.OPENED);
-        },
-
-        readyStateChange: function readyStateChange(state) {
-            this.readyState = state;
-
-            if (typeof this.onreadystatechange == "function") {
-                try {
-                    this.onreadystatechange();
-                } catch (e) {
-                    sinon.logError("Fake XHR onreadystatechange handler", e);
-                }
-            }
-
-            this.dispatchEvent(new sinon.Event("readystatechange"));
-
-            switch (this.readyState) {
-                case FakeXMLHttpRequest.DONE:
-                    this.dispatchEvent(new sinon.Event("load", false, false, this));
-                    this.dispatchEvent(new sinon.Event("loadend", false, false, this));
-                    this.upload.dispatchEvent(new sinon.Event("load", false, false, this));
-                    if (supportsProgress) {
-                        this.upload.dispatchEvent(new sinon.ProgressEvent('progress', {loaded: 100, total: 100}));
-                    }
-                    break;
-            }
-        },
-
-        setRequestHeader: function setRequestHeader(header, value) {
-            verifyState(this);
-
-            if (unsafeHeaders[header] || /^(Sec-|Proxy-)/.test(header)) {
-                throw new Error("Refused to set unsafe header \"" + header + "\"");
-            }
-
-            if (this.requestHeaders[header]) {
-                this.requestHeaders[header] += "," + value;
-            } else {
-                this.requestHeaders[header] = value;
-            }
-        },
-
-        // Helps testing
-        setResponseHeaders: function setResponseHeaders(headers) {
-            verifyRequestOpened(this);
-            this.responseHeaders = {};
-
-            for (var header in headers) {
-                if (headers.hasOwnProperty(header)) {
-                    this.responseHeaders[header] = headers[header];
-                }
-            }
-
-            if (this.async) {
-                this.readyStateChange(FakeXMLHttpRequest.HEADERS_RECEIVED);
-            } else {
-                this.readyState = FakeXMLHttpRequest.HEADERS_RECEIVED;
-            }
-        },
-
-        // Currently treats ALL data as a DOMString (i.e. no Document)
-        send: function send(data) {
-            verifyState(this);
-
-            if (!/^(get|head)$/i.test(this.method)) {
-                if (this.requestHeaders["Content-Type"]) {
-                    var value = this.requestHeaders["Content-Type"].split(";");
-                    this.requestHeaders["Content-Type"] = value[0] + ";charset=utf-8";
-                } else {
-                    this.requestHeaders["Content-Type"] = "text/plain;charset=utf-8";
-                }
-
-                this.requestBody = data;
-            }
-
-            this.errorFlag = false;
-            this.sendFlag = this.async;
-            this.readyStateChange(FakeXMLHttpRequest.OPENED);
-
-            if (typeof this.onSend == "function") {
-                this.onSend(this);
-            }
-
-            this.dispatchEvent(new sinon.Event("loadstart", false, false, this));
-        },
-
-        abort: function abort() {
-            this.aborted = true;
-            this.responseText = null;
-            this.errorFlag = true;
-            this.requestHeaders = {};
-
-            if (this.readyState > sinon.FakeXMLHttpRequest.UNSENT && this.sendFlag) {
-                this.readyStateChange(sinon.FakeXMLHttpRequest.DONE);
-                this.sendFlag = false;
-            }
-
-            this.readyState = sinon.FakeXMLHttpRequest.UNSENT;
-
-            this.dispatchEvent(new sinon.Event("abort", false, false, this));
-
-            this.upload.dispatchEvent(new sinon.Event("abort", false, false, this));
-
-            if (typeof this.onerror === "function") {
-                this.onerror();
-            }
-        },
-
-        getResponseHeader: function getResponseHeader(header) {
-            if (this.readyState < FakeXMLHttpRequest.HEADERS_RECEIVED) {
-                return null;
-            }
-
-            if (/^Set-Cookie2?$/i.test(header)) {
-                return null;
-            }
-
-            header = header.toLowerCase();
-
-            for (var h in this.responseHeaders) {
-                if (h.toLowerCase() == header) {
-                    return this.responseHeaders[h];
-                }
-            }
-
-            return null;
-        },
-
-        getAllResponseHeaders: function getAllResponseHeaders() {
-            if (this.readyState < FakeXMLHttpRequest.HEADERS_RECEIVED) {
-                return "";
-            }
-
-            var headers = "";
-
-            for (var header in this.responseHeaders) {
-                if (this.responseHeaders.hasOwnProperty(header) &&
-                    !/^Set-Cookie2?$/i.test(header)) {
-                    headers += header + ": " + this.responseHeaders[header] + "\r\n";
-                }
-            }
-
-            return headers;
-        },
-
-        setResponseBody: function setResponseBody(body) {
-            verifyRequestSent(this);
-            verifyHeadersReceived(this);
-            verifyResponseBodyType(body);
-
-            var chunkSize = this.chunkSize || 10;
-            var index = 0;
-            this.responseText = "";
-
-            do {
-                if (this.async) {
-                    this.readyStateChange(FakeXMLHttpRequest.LOADING);
-                }
-
-                this.responseText += body.substring(index, index + chunkSize);
-                index += chunkSize;
-            } while (index < body.length);
-
-            var type = this.getResponseHeader("Content-Type");
-
-            if (this.responseText &&
-                (!type || /(text\/xml)|(application\/xml)|(\+xml)/.test(type))) {
-                try {
-                    this.responseXML = FakeXMLHttpRequest.parseXML(this.responseText);
-                } catch (e) {
-                    // Unable to parse XML - no biggie
-                }
-            }
-
-            if (this.async) {
-                this.readyStateChange(FakeXMLHttpRequest.DONE);
-            } else {
-                this.readyState = FakeXMLHttpRequest.DONE;
-            }
-        },
-
-        respond: function respond(status, headers, body) {
-            this.status = typeof status == "number" ? status : 200;
-            this.statusText = FakeXMLHttpRequest.statusCodes[this.status];
-            this.setResponseHeaders(headers || {});
-            this.setResponseBody(body || "");
-        },
-
-        uploadProgress: function uploadProgress(progressEventRaw) {
-            if (supportsProgress) {
-                this.upload.dispatchEvent(new sinon.ProgressEvent("progress", progressEventRaw));
-            }
-        },
-
-        uploadError: function uploadError(error) {
-            if (supportsCustomEvent) {
-                this.upload.dispatchEvent(new sinon.CustomEvent("error", {"detail": error}));
-            }
-        }
-    });
-
-    sinon.extend(FakeXMLHttpRequest, {
-        UNSENT: 0,
-        OPENED: 1,
-        HEADERS_RECEIVED: 2,
-        LOADING: 3,
-        DONE: 4
-    });
-
-    // Borrowed from JSpec
-    FakeXMLHttpRequest.parseXML = function parseXML(text) {
-        var xmlDoc;
-
-        if (typeof DOMParser != "undefined") {
-            var parser = new DOMParser();
-            xmlDoc = parser.parseFromString(text, "text/xml");
-        } else {
-            xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
-            xmlDoc.async = "false";
-            xmlDoc.loadXML(text);
-        }
-
-        return xmlDoc;
-    };
-
-    FakeXMLHttpRequest.statusCodes = {
-        100: "Continue",
-        101: "Switching Protocols",
-        200: "OK",
-        201: "Created",
-        202: "Accepted",
-        203: "Non-Authoritative Information",
-        204: "No Content",
-        205: "Reset Content",
-        206: "Partial Content",
-        300: "Multiple Choice",
-        301: "Moved Permanently",
-        302: "Found",
-        303: "See Other",
-        304: "Not Modified",
-        305: "Use Proxy",
-        307: "Temporary Redirect",
-        400: "Bad Request",
-        401: "Unauthorized",
-        402: "Payment Required",
-        403: "Forbidden",
-        404: "Not Found",
-        405: "Method Not Allowed",
-        406: "Not Acceptable",
-        407: "Proxy Authentication Required",
-        408: "Request Timeout",
-        409: "Conflict",
-        410: "Gone",
-        411: "Length Required",
-        412: "Precondition Failed",
-        413: "Request Entity Too Large",
-        414: "Request-URI Too Long",
-        415: "Unsupported Media Type",
-        416: "Requested Range Not Satisfiable",
-        417: "Expectation Failed",
-        422: "Unprocessable Entity",
-        500: "Internal Server Error",
-        501: "Not Implemented",
-        502: "Bad Gateway",
-        503: "Service Unavailable",
-        504: "Gateway Timeout",
-        505: "HTTP Version Not Supported"
-    };
-
-    sinon.useFakeXMLHttpRequest = function () {
-        sinon.FakeXMLHttpRequest.restore = function restore(keepOnCreate) {
-            if (xhr.supportsXHR) {
-                global.XMLHttpRequest = xhr.GlobalXMLHttpRequest;
-            }
-
-            if (xhr.supportsActiveX) {
-                global.ActiveXObject = xhr.GlobalActiveXObject;
-            }
-
-            delete sinon.FakeXMLHttpRequest.restore;
-
-            if (keepOnCreate !== true) {
-                delete sinon.FakeXMLHttpRequest.onCreate;
-            }
-        };
-        if (xhr.supportsXHR) {
-            global.XMLHttpRequest = sinon.FakeXMLHttpRequest;
-        }
-
-        if (xhr.supportsActiveX) {
-            global.ActiveXObject = function ActiveXObject(objId) {
-                if (objId == "Microsoft.XMLHTTP" || /^Msxml2\.XMLHTTP/i.test(objId)) {
-
-                    return new sinon.FakeXMLHttpRequest();
-                }
-
-                return new xhr.GlobalActiveXObject(objId);
-            };
-        }
-
-        return sinon.FakeXMLHttpRequest;
-    };
-
-    sinon.FakeXMLHttpRequest = FakeXMLHttpRequest;
-
-})(typeof global === "object" ? global : this);
-
-if (typeof module !== 'undefined' && module.exports) {
-    module.exports = sinon;
-}
-
-/**
- * @depend fake_xml_http_request.js
- */
-/*jslint eqeqeq: false, onevar: false, regexp: false, plusplus: false*/
-/*global module, require, window*/
-/**
- * The Sinon "server" mimics a web server that receives requests from
- * sinon.FakeXMLHttpRequest and provides an API to respond to those requests,
- * both synchronously and asynchronously. To respond synchronuously, canned
- * answers have to be provided upfront.
- *
- * @author Christian Johansen (christian@cjohansen.no)
- * @license BSD
- *
- * Copyright (c) 2010-2013 Christian Johansen
- */
-
-if (typeof sinon == "undefined") {
-    var sinon = {};
-}
-
-sinon.fakeServer = (function () {
-    var push = [].push;
-    function F() {}
-
-    function create(proto) {
-        F.prototype = proto;
-        return new F();
-    }
-
-    function responseArray(handler) {
-        var response = handler;
-
-        if (Object.prototype.toString.call(handler) != "[object Array]") {
-            response = [200, {}, handler];
-        }
-
-        if (typeof response[2] != "string") {
-            throw new TypeError("Fake server response body should be string, but was " +
-                                typeof response[2]);
-        }
-
-        return response;
-    }
-
-    var wloc = typeof window !== "undefined" ? window.location : {};
-    var rCurrLoc = new RegExp("^" + wloc.protocol + "//" + wloc.host);
-
-    function matchOne(response, reqMethod, reqUrl) {
-        var rmeth = response.method;
-        var matchMethod = !rmeth || rmeth.toLowerCase() == reqMethod.toLowerCase();
-        var url = response.url;
-        var matchUrl = !url || url == reqUrl || (typeof url.test == "function" && url.test(reqUrl));
-
-        return matchMethod && matchUrl;
-    }
-
-    function match(response, request) {
-        var requestUrl = request.url;
-
-        if (!/^https?:\/\//.test(requestUrl) || rCurrLoc.test(requestUrl)) {
-            requestUrl = requestUrl.replace(rCurrLoc, "");
-        }
-
-        if (matchOne(response, this.getHTTPMethod(request), requestUrl)) {
-            if (typeof response.response == "function") {
-                var ru = response.url;
-                var args = [request].concat(ru && typeof ru.exec == "function" ? ru.exec(requestUrl).slice(1) : []);
-                return response.response.apply(response, args);
-            }
-
-            return true;
-        }
-
-        return false;
-    }
-
-    function log(response, request) {
-        var str;
-
-        str =  "Request:\n"  + sinon.format(request)  + "\n\n";
-        str += "Response:\n" + sinon.format(response) + "\n\n";
-
-        sinon.log(str);
-    }
-
-    return {
-        create: function () {
-            var server = create(this);
-            this.xhr = sinon.useFakeXMLHttpRequest();
-            server.requests = [];
-
-            this.xhr.onCreate = function (xhrObj) {
-                server.addRequest(xhrObj);
-            };
-
-            return server;
-        },
-
-        addRequest: function addRequest(xhrObj) {
-            var server = this;
-            push.call(this.requests, xhrObj);
-
-            xhrObj.onSend = function () {
-                server.handleRequest(this);
-
-                if (server.autoRespond && !server.responding) {
-                    setTimeout(function () {
-                        server.responding = false;
-                        server.respond();
-                    }, server.autoRespondAfter || 10);
-
-                    server.responding = true;
-                }
-            };
-        },
-
-        getHTTPMethod: function getHTTPMethod(request) {
-            if (this.fakeHTTPMethods && /post/i.test(request.method)) {
-                var matches = (request.requestBody || "").match(/_method=([^\b;]+)/);
-                return !!matches ? matches[1] : request.method;
-            }
-
-            return request.method;
-        },
-
-        handleRequest: function handleRequest(xhr) {
-            if (xhr.async) {
-                if (!this.queue) {
-                    this.queue = [];
-                }
-
-                push.call(this.queue, xhr);
-            } else {
-                this.processRequest(xhr);
-            }
-        },
-
-        respondWith: function respondWith(method, url, body) {
-            if (arguments.length == 1 && typeof method != "function") {
-                this.response = responseArray(method);
-                return;
-            }
-
-            if (!this.responses) { this.responses = []; }
-
-            if (arguments.length == 1) {
-                body = method;
-                url = method = null;
-            }
-
-            if (arguments.length == 2) {
-                body = url;
-                url = method;
-                method = null;
-            }
-
-            push.call(this.responses, {
-                method: method,
-                url: url,
-                response: typeof body == "function" ? body : responseArray(body)
-            });
-        },
-
-        respond: function respond() {
-            if (arguments.length > 0) this.respondWith.apply(this, arguments);
-            var queue = this.queue || [];
-            var requests = queue.splice(0);
-            var request;
-
-            while(request = requests.shift()) {
-                this.processRequest(request);
-            }
-        },
-
-        processRequest: function processRequest(request) {
-            try {
-                if (request.aborted) {
-                    return;
-                }
-
-                var response = this.response || [404, {}, ""];
-
-                if (this.responses) {
-                    for (var l = this.responses.length, i = l - 1; i >= 0; i--) {
-                        if (match.call(this, this.responses[i], request)) {
-                            response = this.responses[i].response;
-                            break;
-                        }
-                    }
-                }
-
-                if (request.readyState != 4) {
-                    log(response, request);
-
-                    request.respond(response[0], response[1], response[2]);
-                }
-            } catch (e) {
-                sinon.logError("Fake server request processing", e);
-            }
-        },
-
-        restore: function restore() {
-            return this.xhr.restore && this.xhr.restore.apply(this.xhr, arguments);
-        }
-    };
-}());
-
-if (typeof module !== 'undefined' && module.exports) {
-    module.exports = sinon;
-}
-
-/**
- * @depend fake_server.js
- * @depend fake_timers.js
- */
-/*jslint browser: true, eqeqeq: false, onevar: false*/
-/*global sinon*/
-/**
- * Add-on for sinon.fakeServer that automatically handles a fake timer along with
- * the FakeXMLHttpRequest. The direct inspiration for this add-on is jQuery
- * 1.3.x, which does not use xhr object's onreadystatehandler at all - instead,
- * it polls the object for completion with setInterval. Dispite the direct
- * motivation, there is nothing jQuery-specific in this file, so it can be used
- * in any environment where the ajax implementation depends on setInterval or
- * setTimeout.
- *
- * @author Christian Johansen (christian@cjohansen.no)
- * @license BSD
- *
- * Copyright (c) 2010-2013 Christian Johansen
- */
-
-(function () {
-    function Server() {}
-    Server.prototype = sinon.fakeServer;
-
-    sinon.fakeServerWithClock = new Server();
-
-    sinon.fakeServerWithClock.addRequest = function addRequest(xhr) {
-        if (xhr.async) {
-            if (typeof setTimeout.clock == "object") {
-                this.clock = setTimeout.clock;
-            } else {
-                this.clock = sinon.useFakeTimers();
-                this.resetClock = true;
-            }
-
-            if (!this.longestTimeout) {
-                var clockSetTimeout = this.clock.setTimeout;
-                var clockSetInterval = this.clock.setInterval;
-                var server = this;
-
-                this.clock.setTimeout = function (fn, timeout) {
-                    server.longestTimeout = Math.max(timeout, server.longestTimeout || 0);
-
-                    return clockSetTimeout.apply(this, arguments);
-                };
-
-                this.clock.setInterval = function (fn, timeout) {
-                    server.longestTimeout = Math.max(timeout, server.longestTimeout || 0);
-
-                    return clockSetInterval.apply(this, arguments);
-                };
-            }
-        }
-
-        return sinon.fakeServer.addRequest.call(this, xhr);
-    };
-
-    sinon.fakeServerWithClock.respond = function respond() {
-        var returnVal = sinon.fakeServer.respond.apply(this, arguments);
-
-        if (this.clock) {
-            this.clock.tick(this.longestTimeout || 0);
-            this.longestTimeout = 0;
-
-            if (this.resetClock) {
-                this.clock.restore();
-                this.resetClock = false;
-            }
-        }
-
-        return returnVal;
-    };
-
-    sinon.fakeServerWithClock.restore = function restore() {
-        if (this.clock) {
-            this.clock.restore();
-        }
-
-        return sinon.fakeServer.restore.apply(this, arguments);
-    };
-}());
-
-/**
- * @depend ../sinon.js
- * @depend collection.js
- * @depend util/fake_timers.js
- * @depend util/fake_server_with_clock.js
- */
-/*jslint eqeqeq: false, onevar: false, plusplus: false*/
-/*global require, module*/
-/**
- * Manages fake collections as well as fake utilities such as Sinon's
- * timers and fake XHR implementation in one convenient object.
- *
- * @author Christian Johansen (christian@cjohansen.no)
- * @license BSD
- *
- * Copyright (c) 2010-2013 Christian Johansen
- */
-
-if (typeof module !== 'undefined' && module.exports) {
-    var sinon = require("../sinon");
-    sinon.extend(sinon, require("./util/fake_timers"));
-}
-
-(function () {
-    var push = [].push;
-
-    function exposeValue(sandbox, config, key, value) {
-        if (!value) {
-            return;
-        }
-
-        if (config.injectInto && !(key in config.injectInto)) {
-            config.injectInto[key] = value;
-            sandbox.injectedKeys.push(key);
-        } else {
-            push.call(sandbox.args, value);
-        }
-    }
-
-    function prepareSandboxFromConfig(config) {
-        var sandbox = sinon.create(sinon.sandbox);
-
-        if (config.useFakeServer) {
-            if (typeof config.useFakeServer == "object") {
-                sandbox.serverPrototype = config.useFakeServer;
-            }
-
-            sandbox.useFakeServer();
-        }
-
-        if (config.useFakeTimers) {
-            if (typeof config.useFakeTimers == "object") {
-                sandbox.useFakeTimers.apply(sandbox, config.useFakeTimers);
-            } else {
-                sandbox.useFakeTimers();
-            }
-        }
-
-        return sandbox;
-    }
-
-    sinon.sandbox = sinon.extend(sinon.create(sinon.collection), {
-        useFakeTimers: function useFakeTimers() {
-            this.clock = sinon.useFakeTimers.apply(sinon, arguments);
-
-            return this.add(this.clock);
-        },
-
-        serverPrototype: sinon.fakeServer,
-
-        useFakeServer: function useFakeServer() {
-            var proto = this.serverPrototype || sinon.fakeServer;
-
-            if (!proto || !proto.create) {
-                return null;
-            }
-
-            this.server = proto.create();
-            return this.add(this.server);
-        },
-
-        inject: function (obj) {
-            sinon.collection.inject.call(this, obj);
-
-            if (this.clock) {
-                obj.clock = this.clock;
-            }
-
-            if (this.server) {
-                obj.server = this.server;
-                obj.requests = this.server.requests;
-            }
-
-            return obj;
-        },
-
-        restore: function () {
-            sinon.collection.restore.apply(this, arguments);
-            this.restoreContext();
-        },
-
-        restoreContext: function () {
-            if (this.injectedKeys) {
-                for (var i = 0, j = this.injectedKeys.length; i < j; i++) {
-                    delete this.injectInto[this.injectedKeys[i]];
-                }
-                this.injectedKeys = [];
-            }
-        },
-
-        create: function (config) {
-            if (!config) {
-                return sinon.create(sinon.sandbox);
-            }
-
-            var sandbox = prepareSandboxFromConfig(config);
-            sandbox.args = sandbox.args || [];
-            sandbox.injectedKeys = [];
-            sandbox.injectInto = config.injectInto;
-            var prop, value, exposed = sandbox.inject({});
-
-            if (config.properties) {
-                for (var i = 0, l = config.properties.length; i < l; i++) {
-                    prop = config.properties[i];
-                    value = exposed[prop] || prop == "sandbox" && sandbox;
-                    exposeValue(sandbox, config, prop, value);
-                }
-            } else {
-                exposeValue(sandbox, config, "sandbox", value);
-            }
-
-            return sandbox;
-        }
-    });
-
-    sinon.sandbox.useFakeXMLHttpRequest = sinon.sandbox.useFakeServer;
-
-    if (typeof module !== 'undefined' && module.exports) {
-        module.exports = sinon.sandbox;
-    }
-}());
-
-/**
- * @depend ../sinon.js
- * @depend stub.js
- * @depend mock.js
- * @depend sandbox.js
- */
-/*jslint eqeqeq: false, onevar: false, forin: true, plusplus: false*/
-/*global module, require, sinon*/
-/**
- * Test function, sandboxes fakes
- *
- * @author Christian Johansen (christian@cjohansen.no)
- * @license BSD
- *
- * Copyright (c) 2010-2013 Christian Johansen
- */
-
-(function (sinon) {
-    var commonJSModule = typeof module !== 'undefined' && module.exports;
-
-    if (!sinon && commonJSModule) {
-        sinon = require("../sinon");
-    }
-
-    if (!sinon) {
-        return;
-    }
-
-    function test(callback) {
-        var type = typeof callback;
-
-        if (type != "function") {
-            throw new TypeError("sinon.test needs to wrap a test function, got " + type);
-        }
-
-        return function () {
-            var config = sinon.getConfig(sinon.config);
-            config.injectInto = config.injectIntoThis && this || config.injectInto;
-            var sandbox = sinon.sandbox.create(config);
-            var exception, result;
-            var args = Array.prototype.slice.call(arguments).concat(sandbox.args);
-
-            try {
-                result = callback.apply(this, args);
-            } catch (e) {
-                exception = e;
-            }
-
-            if (typeof exception !== "undefined") {
-                sandbox.restore();
-                throw exception;
-            }
-            else {
-                sandbox.verifyAndRestore();
-            }
-
-            return result;
-        };
-    }
-
-    test.config = {
-        injectIntoThis: true,
-        injectInto: null,
-        properties: ["spy", "stub", "mock", "clock", "server", "requests"],
-        useFakeTimers: true,
-        useFakeServer: true
-    };
-
-    if (commonJSModule) {
-        module.exports = test;
-    } else {
-        sinon.test = test;
-    }
-}(typeof sinon == "object" && sinon || null));
-
-/**
- * @depend ../sinon.js
- * @depend test.js
- */
-/*jslint eqeqeq: false, onevar: false, eqeqeq: false*/
-/*global module, require, sinon*/
-/**
- * Test case, sandboxes all test functions
- *
- * @author Christian Johansen (christian@cjohansen.no)
- * @license BSD
- *
- * Copyright (c) 2010-2013 Christian Johansen
- */
-
-(function (sinon) {
-    var commonJSModule = typeof module !== 'undefined' && module.exports;
-
-    if (!sinon && commonJSModule) {
-        sinon = require("../sinon");
-    }
-
-    if (!sinon || !Object.prototype.hasOwnProperty) {
-        return;
-    }
-
-    function createTest(property, setUp, tearDown) {
-        return function () {
-            if (setUp) {
-                setUp.apply(this, arguments);
-            }
-
-            var exception, result;
-
-            try {
-                result = property.apply(this, arguments);
-            } catch (e) {
-                exception = e;
-            }
-
-            if (tearDown) {
-                tearDown.apply(this, arguments);
-            }
-
-            if (exception) {
-                throw exception;
-            }
-
-            return result;
-        };
-    }
-
-    function testCase(tests, prefix) {
-        /*jsl:ignore*/
-        if (!tests || typeof tests != "object") {
-            throw new TypeError("sinon.testCase needs an object with test functions");
-        }
-        /*jsl:end*/
-
-        prefix = prefix || "test";
-        var rPrefix = new RegExp("^" + prefix);
-        var methods = {}, testName, property, method;
-        var setUp = tests.setUp;
-        var tearDown = tests.tearDown;
-
-        for (testName in tests) {
-            if (tests.hasOwnProperty(testName)) {
-                property = tests[testName];
-
-                if (/^(setUp|tearDown)$/.test(testName)) {
-                    continue;
-                }
-
-                if (typeof property == "function" && rPrefix.test(testName)) {
-                    method = property;
-
-                    if (setUp || tearDown) {
-                        method = createTest(property, setUp, tearDown);
-                    }
-
-                    methods[testName] = sinon.test(method);
-                } else {
-                    methods[testName] = tests[testName];
-                }
-            }
-        }
-
-        return methods;
-    }
-
-    if (commonJSModule) {
-        module.exports = testCase;
-    } else {
-        sinon.testCase = testCase;
-    }
-}(typeof sinon == "object" && sinon || null));
-
-/**
- * @depend ../sinon.js
- * @depend stub.js
- */
-/*jslint eqeqeq: false, onevar: false, nomen: false, plusplus: false*/
-/*global module, require, sinon*/
-/**
- * Assertions matching the test spy retrieval interface.
- *
- * @author Christian Johansen (christian@cjohansen.no)
- * @license BSD
- *
- * Copyright (c) 2010-2013 Christian Johansen
- */
-
-(function (sinon, global) {
-    var commonJSModule = typeof module !== "undefined" && module.exports;
-    var slice = Array.prototype.slice;
-    var assert;
-
-    if (!sinon && commonJSModule) {
-        sinon = require("../sinon");
-    }
-
-    if (!sinon) {
-        return;
-    }
-
-    function verifyIsStub() {
-        var method;
-
-        for (var i = 0, l = arguments.length; i < l; ++i) {
-            method = arguments[i];
-
-            if (!method) {
-                assert.fail("fake is not a spy");
-            }
-
-            if (typeof method != "function") {
-                assert.fail(method + " is not a function");
-            }
-
-            if (typeof method.getCall != "function") {
-                assert.fail(method + " is not stubbed");
-            }
-        }
-    }
-
-    function failAssertion(object, msg) {
-        object = object || global;
-        var failMethod = object.fail || assert.fail;
-        failMethod.call(object, msg);
-    }
-
-    function mirrorPropAsAssertion(name, method, message) {
-        if (arguments.length == 2) {
-            message = method;
-            method = name;
-        }
-
-        assert[name] = function (fake) {
-            verifyIsStub(fake);
-
-            var args = slice.call(arguments, 1);
-            var failed = false;
-
-            if (typeof method == "function") {
-                failed = !method(fake);
-            } else {
-                failed = typeof fake[method] == "function" ?
-                    !fake[method].apply(fake, args) : !fake[method];
-            }
-
-            if (failed) {
-                failAssertion(this, fake.printf.apply(fake, [message].concat(args)));
-            } else {
-                assert.pass(name);
-            }
-        };
-    }
-
-    function exposedName(prefix, prop) {
-        return !prefix || /^fail/.test(prop) ? prop :
-            prefix + prop.slice(0, 1).toUpperCase() + prop.slice(1);
-    }
-
-    assert = {
-        failException: "AssertError",
-
-        fail: function fail(message) {
-            var error = new Error(message);
-            error.name = this.failException || assert.failException;
-
-            throw error;
-        },
-
-        pass: function pass(assertion) {},
-
-        callOrder: function assertCallOrder() {
-            verifyIsStub.apply(null, arguments);
-            var expected = "", actual = "";
-
-            if (!sinon.calledInOrder(arguments)) {
-                try {
-                    expected = [].join.call(arguments, ", ");
-                    var calls = slice.call(arguments);
-                    var i = calls.length;
-                    while (i) {
-                        if (!calls[--i].called) {
-                            calls.splice(i, 1);
-                        }
-                    }
-                    actual = sinon.orderByFirstCall(calls).join(", ");
-                } catch (e) {
-                    // If this fails, we'll just fall back to the blank string
-                }
-
-                failAssertion(this, "expected " + expected + " to be " +
-                              "called in order but were called as " + actual);
-            } else {
-                assert.pass("callOrder");
-            }
-        },
-
-        callCount: function assertCallCount(method, count) {
-            verifyIsStub(method);
-
-            if (method.callCount != count) {
-                var msg = "expected %n to be called " + sinon.timesInWords(count) +
-                    " but was called %c%C";
-                failAssertion(this, method.printf(msg));
-            } else {
-                assert.pass("callCount");
-            }
-        },
-
-        expose: function expose(target, options) {
-            if (!target) {
-                throw new TypeError("target is null or undefined");
-            }
-
-            var o = options || {};
-            var prefix = typeof o.prefix == "undefined" && "assert" || o.prefix;
-            var includeFail = typeof o.includeFail == "undefined" || !!o.includeFail;
-
-            for (var method in this) {
-                if (method != "export" && (includeFail || !/^(fail)/.test(method))) {
-                    target[exposedName(prefix, method)] = this[method];
-                }
-            }
-
-            return target;
-        },
-
-        match: function match(actual, expectation) {
-            var matcher = sinon.match(expectation);
-            if (matcher.test(actual)) {
-                assert.pass("match");
-            } else {
-                var formatted = [
-                    "expected value to match",
-                    "    expected = " + sinon.format(expectation),
-                    "    actual = " + sinon.format(actual)
-                ]
-                failAssertion(this, formatted.join("\n"));
-            }
-        }
-    };
-
-    mirrorPropAsAssertion("called", "expected %n to have been called at least once but was never called");
-    mirrorPropAsAssertion("notCalled", function (spy) { return !spy.called; },
-                          "expected %n to not have been called but was called %c%C");
-    mirrorPropAsAssertion("calledOnce", "expected %n to be called once but was called %c%C");
-    mirrorPropAsAssertion("calledTwice", "expected %n to be called twice but was called %c%C");
-    mirrorPropAsAssertion("calledThrice", "expected %n to be called thrice but was called %c%C");
-    mirrorPropAsAssertion("calledOn", "expected %n to be called with %1 as this but was called with %t");
-    mirrorPropAsAssertion("alwaysCalledOn", "expected %n to always be called with %1 as this but was called with %t");
-    mirrorPropAsAssertion("calledWithNew", "expected %n to be called with new");
-    mirrorPropAsAssertion("alwaysCalledWithNew", "expected %n to always be called with new");
-    mirrorPropAsAssertion("calledWith", "expected %n to be called with arguments %*%C");
-    mirrorPropAsAssertion("calledWithMatch", "expected %n to be called with match %*%C");
-    mirrorPropAsAssertion("alwaysCalledWith", "expected %n to always be called with arguments %*%C");
-    mirrorPropAsAssertion("alwaysCalledWithMatch", "expected %n to always be called with match %*%C");
-    mirrorPropAsAssertion("calledWithExactly", "expected %n to be called with exact arguments %*%C");
-    mirrorPropAsAssertion("alwaysCalledWithExactly", "expected %n to always be called with exact arguments %*%C");
-    mirrorPropAsAssertion("neverCalledWith", "expected %n to never be called with arguments %*%C");
-    mirrorPropAsAssertion("neverCalledWithMatch", "expected %n to never be called with match %*%C");
-    mirrorPropAsAssertion("threw", "%n did not throw exception%C");
-    mirrorPropAsAssertion("alwaysThrew", "%n did not always throw exception%C");
-
-    if (commonJSModule) {
-        module.exports = assert;
-    } else {
-        sinon.assert = assert;
-    }
-}(typeof sinon == "object" && sinon || null, typeof window != "undefined" ? window : (typeof self != "undefined") ? self : global));
-
-return sinon;}.call(typeof window != 'undefined' && window || {}));
diff --git a/resources/sinonjs/sinon-ie-1.9.0.js b/resources/sinonjs/sinon-ie-1.9.0.js
deleted file mode 100644 (file)
index c9fbd9d..0000000
+++ /dev/null
@@ -1,86 +0,0 @@
-/**
- * Sinon.JS 1.9.0, 2014/03/05
- *
- * @author Christian Johansen (christian@cjohansen.no)
- * @author Contributors: https://github.com/cjohansen/Sinon.JS/blob/master/AUTHORS
- *
- * (The BSD License)
- * 
- * Copyright (c) 2010-2014, Christian Johansen, christian@cjohansen.no
- * All rights reserved.
- * 
- * Redistribution and use in source and binary forms, with or without modification,
- * are permitted provided that the following conditions are met:
- * 
- *     * Redistributions of source code must retain the above copyright notice,
- *       this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above copyright notice,
- *       this list of conditions and the following disclaimer in the documentation
- *       and/or other materials provided with the distribution.
- *     * Neither the name of Christian Johansen nor the names of his contributors
- *       may be used to endorse or promote products derived from this software
- *       without specific prior written permission.
- * 
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
- * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-/*global sinon, setTimeout, setInterval, clearTimeout, clearInterval, Date*/
-/**
- * Helps IE run the fake timers. By defining global functions, IE allows
- * them to be overwritten at a later point. If these are not defined like
- * this, overwriting them will result in anything from an exception to browser
- * crash.
- *
- * If you don't require fake timers to work in IE, don't include this file.
- *
- * @author Christian Johansen (christian@cjohansen.no)
- * @license BSD
- *
- * Copyright (c) 2010-2013 Christian Johansen
- */
-function setTimeout() {}
-function clearTimeout() {}
-function setImmediate() {}
-function clearImmediate() {}
-function setInterval() {}
-function clearInterval() {}
-function Date() {}
-
-// Reassign the original functions. Now their writable attribute
-// should be true. Hackish, I know, but it works.
-setTimeout = sinon.timers.setTimeout;
-clearTimeout = sinon.timers.clearTimeout;
-setImmediate = sinon.timers.setImmediate;
-clearImmediate = sinon.timers.clearImmediate;
-setInterval = sinon.timers.setInterval;
-clearInterval = sinon.timers.clearInterval;
-Date = sinon.timers.Date;
-
-/*global sinon*/
-/**
- * Helps IE run the fake XMLHttpRequest. By defining global functions, IE allows
- * them to be overwritten at a later point. If these are not defined like
- * this, overwriting them will result in anything from an exception to browser
- * crash.
- *
- * If you don't require fake XHR to work in IE, don't include this file.
- *
- * @author Christian Johansen (christian@cjohansen.no)
- * @license BSD
- *
- * Copyright (c) 2010-2013 Christian Johansen
- */
-function XMLHttpRequest() {}
-
-// Reassign the original function. Now its writable attribute
-// should be true. Hackish, I know, but it works.
-XMLHttpRequest = sinon.xhr.XMLHttpRequest || undefined;
diff --git a/resources/src/jquery.tipsy/images/tipsy.png b/resources/src/jquery.tipsy/images/tipsy.png
new file mode 100644 (file)
index 0000000..ef17cc3
Binary files /dev/null and b/resources/src/jquery.tipsy/images/tipsy.png differ
diff --git a/resources/src/jquery.tipsy/jquery.tipsy.css b/resources/src/jquery.tipsy/jquery.tipsy.css
new file mode 100644 (file)
index 0000000..3680fbe
--- /dev/null
@@ -0,0 +1,75 @@
+.tipsy {
+       padding: 5px;
+       position: absolute;
+       z-index: 100000;
+       cursor: default;
+}
+.tipsy-inner {
+       padding: 5px 8px 4px 8px;
+       /*background-color: #e8f2f8;*/
+       background-color: #ffffff;
+       border: solid 1px #a7d7f9;
+       color: black;
+       max-width: 15em;
+       border-radius: 4px;
+       -moz-border-radius: 4px;
+       -webkit-border-radius: 4px;
+       /*
+       -moz-box-shadow: 0px 2px 8px #cccccc;
+       -webkit-box-shadow: 0px 2px 8px #cccccc;
+       box-shadow: 0px 2px 8px #cccccc;
+       -ms-filter: "progid:DXImageTransform.Microsoft.DropShadow(OffX=0, OffY=2, Strength=6, Direction=90, Color='#cccccc')";
+       filter: progid:DXImageTransform.Microsoft.DropShadow(OffX=0, OffY=2, Strength=6, Direction=90, Color='#cccccc');
+       */
+}
+.tipsy-arrow {
+       position: absolute;
+       /* @embed */
+       background: url('images/tipsy.png') no-repeat top left;
+       width: 11px;
+       height: 6px;
+}
+/* @noflip */ .tipsy-n .tipsy-arrow {
+       top: 0px;
+       left: 50%;
+       margin-left: -5px;
+}
+/* @noflip */ .tipsy-nw .tipsy-arrow {
+       top: 1px;
+       left: 10px;
+}
+/* @noflip */ .tipsy-ne .tipsy-arrow {
+       top: 1px;
+       right: 10px;
+}
+/* @noflip */ .tipsy-s .tipsy-arrow {
+       bottom: 0px;
+       left: 50%;
+       margin-left: -5px;
+       background-position: bottom left;
+}
+/* @noflip */ .tipsy-sw .tipsy-arrow {
+       bottom: 0px;
+       left: 10px;
+       background-position: bottom left;
+}
+/* @noflip */ .tipsy-se .tipsy-arrow {
+       bottom: 0px;
+       right: 10px;
+       background-position: bottom left;
+}
+/* @noflip */ .tipsy-e .tipsy-arrow {
+       top: 50%;
+       margin-top: -5px;
+       right: 1px;
+       width: 5px;
+       height: 11px;
+       background-position: top right;
+}
+/* @noflip */ .tipsy-w .tipsy-arrow {
+       top: 50%;
+       margin-top: -5px;
+       left: 0px;
+       width: 6px;
+       height: 11px;
+}
\ No newline at end of file
diff --git a/resources/src/jquery.tipsy/jquery.tipsy.js b/resources/src/jquery.tipsy/jquery.tipsy.js
new file mode 100644 (file)
index 0000000..f920e8b
--- /dev/null
@@ -0,0 +1,223 @@
+// tipsy, facebook style tooltips for jquery
+// version 1.0.0a*
+// (c) 2008-2010 jason frame [jason@onehackoranother.com]
+// released under the MIT license
+
+// * This installation of tipsy includes several local modifications to both Javascript and CSS.
+//   Please be careful when upgrading.
+
+(function($) {
+
+    function maybeCall(thing, ctx) {
+        return (typeof thing == 'function') ? (thing.call(ctx)) : thing;
+    }
+
+    function fixTitle($ele) {
+        if ($ele.attr('title') || typeof($ele.attr('original-title')) != 'string') {
+            $ele.attr('original-title', $ele.attr('title') || '').removeAttr('title');
+        }
+    }
+
+    function Tipsy(element, options) {
+        this.$element = $(element);
+        this.options = options;
+        this.enabled = true;
+        fixTitle(this.$element);
+    }
+
+    Tipsy.prototype = {
+        show: function() {
+            var title = this.getTitle();
+            if (title && this.enabled) {
+                var $tip = this.tip();
+
+                $tip.find('.tipsy-inner')[this.options.html ? 'html' : 'text'](title);
+                $tip[0].className = 'tipsy'; // reset classname in case of dynamic gravity
+                if (this.options.className) {
+                    $tip.addClass(maybeCall(this.options.className, this.$element[0]));
+                }
+                $tip.remove().css({top: 0, left: 0, visibility: 'hidden', display: 'block'}).appendTo(document.body);
+
+                var pos = $.extend({}, this.$element.offset(), {
+                    width: this.$element[0].offsetWidth,
+                    height: this.$element[0].offsetHeight
+                });
+
+                var gravity = (typeof this.options.gravity == 'function')
+                                ? this.options.gravity.call(this.$element[0])
+                                : this.options.gravity;
+
+                // Attach css classes before checking height/width so they
+                // can be applied.
+                $tip.addClass('tipsy-' + gravity);
+                if (this.options.className) {
+                    $tip.addClass(maybeCall(this.options.className, this.$element[0]));
+                }
+
+                var actualWidth = $tip[0].offsetWidth, actualHeight = $tip[0].offsetHeight;
+                var tp;
+                switch (gravity.charAt(0)) {
+                    case 'n':
+                        tp = {top: pos.top + pos.height + this.options.offset, left: pos.left + pos.width / 2 - actualWidth / 2};
+                        break;
+                    case 's':
+                        tp = {top: pos.top - actualHeight - this.options.offset, left: pos.left + pos.width / 2 - actualWidth / 2};
+                        break;
+                    case 'e':
+                        tp = {top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth - this.options.offset};
+                        break;
+                    case 'w':
+                        tp = {top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width + this.options.offset};
+                        break;
+                }
+
+                if (gravity.length == 2) {
+                    if (gravity.charAt(1) == 'w') {
+                        if (this.options.center) {
+                            tp.left = pos.left + pos.width / 2 - 15;
+                        } else {
+                            tp.left = pos.left;
+                        }
+                    } else {
+                        if (this.options.center) {
+                            tp.left = pos.left + pos.width / 2 - actualWidth + 15;
+                        } else {
+                            tp.left = pos.left + pos.width;
+                        }
+                    }
+                }
+                $tip.css(tp);
+
+                if (this.options.fade) {
+                    $tip.stop().css({opacity: 0, display: 'block', visibility: 'visible'}).animate({opacity: this.options.opacity}, 100);
+                } else {
+                    $tip.css({visibility: 'visible', opacity: this.options.opacity});
+                }
+            }
+        },
+
+        hide: function() {
+            if (this.options.fade) {
+                this.tip().stop().fadeOut(100, function() { $(this).remove(); });
+            } else {
+                this.tip().remove();
+            }
+        },
+
+        getTitle: function() {
+            var title, $e = this.$element, o = this.options;
+            fixTitle($e);
+            if (typeof o.title == 'string') {
+                title = $e.attr(o.title == 'title' ? 'original-title' : o.title);
+            } else if (typeof o.title == 'function') {
+                title = o.title.call($e[0]);
+            }
+            title = ('' + title).replace(/(^\s*|\s*$)/, "");
+            return title || o.fallback;
+        },
+
+        tip: function() {
+            if (!this.$tip) {
+                this.$tip = $('<div class="tipsy"></div>').html('<div class="tipsy-arrow"></div><div class="tipsy-inner"/></div>');
+            }
+            return this.$tip;
+        },
+
+        validate: function() {
+            if (!this.$element[0].parentNode) {
+                this.hide();
+                this.$element = null;
+                this.options = null;
+            }
+        },
+
+        enable: function() { this.enabled = true; },
+        disable: function() { this.enabled = false; },
+        toggleEnabled: function() { this.enabled = !this.enabled; }
+    };
+
+    $.fn.tipsy = function(options) {
+
+        if (options === true) {
+            return this.data('tipsy');
+        } else if (typeof options == 'string') {
+            return this.data('tipsy')[options]();
+        }
+
+        options = $.extend({}, $.fn.tipsy.defaults, options);
+
+        function get(ele) {
+            var tipsy = $.data(ele, 'tipsy');
+            if (!tipsy) {
+                tipsy = new Tipsy(ele, $.fn.tipsy.elementOptions(ele, options));
+                $.data(ele, 'tipsy', tipsy);
+            }
+            return tipsy;
+        }
+
+        function enter() {
+            var tipsy = get(this);
+            tipsy.hoverState = 'in';
+            if (options.delayIn == 0) {
+                tipsy.show();
+            } else {
+                setTimeout(function() { if (tipsy.hoverState == 'in') tipsy.show(); }, options.delayIn);
+            }
+        };
+
+        function leave() {
+            var tipsy = get(this);
+            tipsy.hoverState = 'out';
+            if (options.delayOut == 0) {
+                tipsy.hide();
+            } else {
+                setTimeout(function() { if (tipsy.hoverState == 'out') tipsy.hide(); }, options.delayOut);
+            }
+        };
+
+        if (!options.live) this.each(function() { get(this); });
+
+        if (options.trigger != 'manual') {
+            var binder   = options.live ? 'live' : 'bind',
+                eventIn  = options.trigger == 'hover' ? 'mouseenter' : 'focus',
+                eventOut = options.trigger == 'hover' ? 'mouseleave' : 'blur';
+            this[binder](eventIn, enter)[binder](eventOut, leave);
+        }
+
+        return this;
+
+    };
+
+    $.fn.tipsy.defaults = {
+        className: null,
+        delayIn: 0,
+        delayOut: 0,
+        fade: true,
+        fallback: '',
+        gravity: 'n',
+        center: true,
+        html: false,
+        live: false,
+        offset: 0,
+        opacity: 1.0,
+        title: 'title',
+        trigger: 'hover'
+    };
+
+    // Overwrite this method to provide options on a per-element basis.
+    // For example, you could store the gravity in a 'tipsy-gravity' attribute:
+    // return $.extend({}, options, {gravity: $(ele).attr('tipsy-gravity') || 'n' });
+    // (remember - do not modify 'options' in place!)
+    $.fn.tipsy.elementOptions = function(ele, options) {
+        return $.metadata ? $.extend({}, options, $(ele).metadata()) : options;
+    };
+
+    $.fn.tipsy.autoNS = function() {
+        return $(this).offset().top > ($(document).scrollTop() + $(window).height() / 2) ? 's' : 'n';
+    };
+
+    $.fn.tipsy.autoWE = function() {
+        return $(this).offset().left > ($(document).scrollLeft() + $(window).width() / 2) ? 'e' : 'w';
+    };
+
+})(jQuery);
diff --git a/resources/src/jquery.ui-themes/vector/images/close.png b/resources/src/jquery.ui-themes/vector/images/close.png
new file mode 100644 (file)
index 0000000..ef0dd9e
Binary files /dev/null and b/resources/src/jquery.ui-themes/vector/images/close.png differ
diff --git a/resources/src/jquery.ui-themes/vector/images/titlebar-fade.png b/resources/src/jquery.ui-themes/vector/images/titlebar-fade.png
new file mode 100644 (file)
index 0000000..12a80c8
Binary files /dev/null and b/resources/src/jquery.ui-themes/vector/images/titlebar-fade.png differ
diff --git a/resources/src/jquery.ui-themes/vector/images/ui-anim_basic_16x16.gif b/resources/src/jquery.ui-themes/vector/images/ui-anim_basic_16x16.gif
new file mode 100644 (file)
index 0000000..085ccae
Binary files /dev/null and b/resources/src/jquery.ui-themes/vector/images/ui-anim_basic_16x16.gif differ
diff --git a/resources/src/jquery.ui-themes/vector/images/ui-bg_flat_15_cd0a0a_40x100.png b/resources/src/jquery.ui-themes/vector/images/ui-bg_flat_15_cd0a0a_40x100.png
new file mode 100644 (file)
index 0000000..09de537
Binary files /dev/null and b/resources/src/jquery.ui-themes/vector/images/ui-bg_flat_15_cd0a0a_40x100.png differ
diff --git a/resources/src/jquery.ui-themes/vector/images/ui-bg_flat_70_000000_40x100.png b/resources/src/jquery.ui-themes/vector/images/ui-bg_flat_70_000000_40x100.png
new file mode 100644 (file)
index 0000000..c06dd56
Binary files /dev/null and b/resources/src/jquery.ui-themes/vector/images/ui-bg_flat_70_000000_40x100.png differ
diff --git a/resources/src/jquery.ui-themes/vector/images/ui-bg_highlight-hard_100_f2f5f7_1x100.png b/resources/src/jquery.ui-themes/vector/images/ui-bg_highlight-hard_100_f2f5f7_1x100.png
new file mode 100644 (file)
index 0000000..5308b46
Binary files /dev/null and b/resources/src/jquery.ui-themes/vector/images/ui-bg_highlight-hard_100_f2f5f7_1x100.png differ
diff --git a/resources/src/jquery.ui-themes/vector/images/ui-bg_highlight-hard_80_d7ebf9_1x100.png b/resources/src/jquery.ui-themes/vector/images/ui-bg_highlight-hard_80_d7ebf9_1x100.png
new file mode 100644 (file)
index 0000000..0c8997f
Binary files /dev/null and b/resources/src/jquery.ui-themes/vector/images/ui-bg_highlight-hard_80_d7ebf9_1x100.png differ
diff --git a/resources/src/jquery.ui-themes/vector/images/ui-bg_highlight-soft_100_e4f1fb_1x100.png b/resources/src/jquery.ui-themes/vector/images/ui-bg_highlight-soft_100_e4f1fb_1x100.png
new file mode 100644 (file)
index 0000000..3149255
Binary files /dev/null and b/resources/src/jquery.ui-themes/vector/images/ui-bg_highlight-soft_100_e4f1fb_1x100.png differ
diff --git a/resources/src/jquery.ui-themes/vector/images/ui-bg_highlight-soft_100_ffffff_1x100.png b/resources/src/jquery.ui-themes/vector/images/ui-bg_highlight-soft_100_ffffff_1x100.png
new file mode 100644 (file)
index 0000000..09b2376
Binary files /dev/null and b/resources/src/jquery.ui-themes/vector/images/ui-bg_highlight-soft_100_ffffff_1x100.png differ
diff --git a/resources/src/jquery.ui-themes/vector/images/ui-bg_highlight-soft_25_ffef8f_1x100.png b/resources/src/jquery.ui-themes/vector/images/ui-bg_highlight-soft_25_ffef8f_1x100.png
new file mode 100644 (file)
index 0000000..66627c1
Binary files /dev/null and b/resources/src/jquery.ui-themes/vector/images/ui-bg_highlight-soft_25_ffef8f_1x100.png differ
diff --git a/resources/src/jquery.ui-themes/vector/images/ui-bg_inset-hard_100_f0f0f0_1x100.png b/resources/src/jquery.ui-themes/vector/images/ui-bg_inset-hard_100_f0f0f0_1x100.png
new file mode 100644 (file)
index 0000000..ccb6dc0
Binary files /dev/null and b/resources/src/jquery.ui-themes/vector/images/ui-bg_inset-hard_100_f0f0f0_1x100.png differ
diff --git a/resources/src/jquery.ui-themes/vector/images/ui-icons_2694e8_256x240.png b/resources/src/jquery.ui-themes/vector/images/ui-icons_2694e8_256x240.png
new file mode 100644 (file)
index 0000000..998ac3b
Binary files /dev/null and b/resources/src/jquery.ui-themes/vector/images/ui-icons_2694e8_256x240.png differ
diff --git a/resources/src/jquery.ui-themes/vector/images/ui-icons_2e83ff_256x240.png b/resources/src/jquery.ui-themes/vector/images/ui-icons_2e83ff_256x240.png
new file mode 100644 (file)
index 0000000..34e38d1
Binary files /dev/null and b/resources/src/jquery.ui-themes/vector/images/ui-icons_2e83ff_256x240.png differ
diff --git a/resources/src/jquery.ui-themes/vector/images/ui-icons_3d80b3_256x240.png b/resources/src/jquery.ui-themes/vector/images/ui-icons_3d80b3_256x240.png
new file mode 100644 (file)
index 0000000..ec129a8
Binary files /dev/null and b/resources/src/jquery.ui-themes/vector/images/ui-icons_3d80b3_256x240.png differ
diff --git a/resources/src/jquery.ui-themes/vector/images/ui-icons_666666_256x240.png b/resources/src/jquery.ui-themes/vector/images/ui-icons_666666_256x240.png
new file mode 100644 (file)
index 0000000..a32c57d
Binary files /dev/null and b/resources/src/jquery.ui-themes/vector/images/ui-icons_666666_256x240.png differ
diff --git a/resources/src/jquery.ui-themes/vector/images/ui-icons_72a7cf_256x240.png b/resources/src/jquery.ui-themes/vector/images/ui-icons_72a7cf_256x240.png
new file mode 100644 (file)
index 0000000..88fad1a
Binary files /dev/null and b/resources/src/jquery.ui-themes/vector/images/ui-icons_72a7cf_256x240.png differ
diff --git a/resources/src/jquery.ui-themes/vector/images/ui-icons_ffffff_256x240.png b/resources/src/jquery.ui-themes/vector/images/ui-icons_ffffff_256x240.png
new file mode 100644 (file)
index 0000000..29ba7d2
Binary files /dev/null and b/resources/src/jquery.ui-themes/vector/images/ui-icons_ffffff_256x240.png differ
diff --git a/resources/src/jquery.ui-themes/vector/jquery.ui.accordion.css b/resources/src/jquery.ui-themes/vector/jquery.ui.accordion.css
new file mode 100644 (file)
index 0000000..8d8a1a6
--- /dev/null
@@ -0,0 +1,12 @@
+/* Accordion
+----------------------------------*/
+.ui-accordion .ui-accordion-header { cursor: pointer; position: relative; margin-top: 1px; zoom: 1; }
+.ui-accordion .ui-accordion-li-fix { display: inline; }
+.ui-accordion .ui-accordion-header-active { border-bottom: 0 !important; }
+.ui-accordion .ui-accordion-header a { display: block; font-size: 1em; padding: .5em .5em .5em .7em; }
+/* IE7-/Win - Fix extra vertical space in lists */
+.ui-accordion a { zoom: 1; }
+.ui-accordion-icons .ui-accordion-header a { padding-left: 2.2em; }
+.ui-accordion .ui-accordion-header .ui-icon { position: absolute; left: .5em; top: 50%; margin-top: -8px; }
+.ui-accordion .ui-accordion-content { padding: 1em 2.2em; border-top: 0; margin-top: -2px; position: relative; top: 1px; margin-bottom: 2px; overflow: auto; display: none; zoom: 1; }
+.ui-accordion .ui-accordion-content-active { display: block; }
\ No newline at end of file
diff --git a/resources/src/jquery.ui-themes/vector/jquery.ui.autocomplete.css b/resources/src/jquery.ui-themes/vector/jquery.ui.autocomplete.css
new file mode 100644 (file)
index 0000000..c06fd18
--- /dev/null
@@ -0,0 +1,40 @@
+/* Autocomplete
+----------------------------------*/
+.ui-autocomplete { position: absolute; cursor: default; }      
+.ui-autocomplete-loading { /* @embed */ background: white url('images/ui-anim_basic_16x16.gif') right center no-repeat; }
+
+/* workarounds */
+* html .ui-autocomplete { width:1px; } /* without this, the menu expands to 100% in IE6 */
+
+/* Menu
+----------------------------------*/
+.ui-menu {
+       list-style:none;
+       padding: 2px;
+       margin: 0;
+       display:block;
+       float: left;
+}
+.ui-menu .ui-menu {
+       margin-top: -3px;
+}
+.ui-menu .ui-menu-item {
+       margin:0;
+       padding: 0;
+       zoom: 1;
+       float: left;
+       clear: left;
+       width: 100%;
+}
+.ui-menu .ui-menu-item a {
+       text-decoration:none;
+       display:block;
+       padding:.2em .4em;
+       line-height:1.5;
+       zoom:1;
+}
+.ui-menu .ui-menu-item a.ui-state-hover,
+.ui-menu .ui-menu-item a.ui-state-active {
+       font-weight: normal;
+       margin: -1px;
+}
diff --git a/resources/src/jquery.ui-themes/vector/jquery.ui.button.css b/resources/src/jquery.ui-themes/vector/jquery.ui.button.css
new file mode 100644 (file)
index 0000000..ea14723
--- /dev/null
@@ -0,0 +1,379 @@
+/* Button
+----------------------------------*/
+
+.ui-button {
+       display: inline-block;
+       position: relative;
+       padding: 0;
+       margin-right: .1em;
+       text-decoration: none !important;
+       cursor: pointer;
+       text-align: center;
+       zoom: 1;
+       overflow: visible; /* the overflow property removes extra width in IE */
+}
+
+/*button text element */
+.ui-button .ui-button-text {
+       display: block;
+       line-height: 1.4;
+       text-shadow: 0 1px 1px #fff;
+}
+.ui-button-text-only .ui-button-text {
+       padding: 0.3em 1em 0.25em 1em;
+}
+.ui-button-icon-only .ui-button-text,
+.ui-button-icons-only .ui-button-text {
+       padding: 0.3em;
+       text-indent: -9999999px;
+}
+.ui-button-text-icon-primary .ui-button-text,
+.ui-button-text-icons .ui-button-text {
+       padding: 0.3em 1em 0.25em 2.1em;
+}
+.ui-button-text-icon-secondary .ui-button-text,
+.ui-button-text-icons .ui-button-text {
+       padding: 0.3em 2.1em 0.25em 1em;
+}
+.ui-button-text-icons .ui-button-text {
+       padding-left: 2.1em;
+       padding-right: 2.1em;
+}
+
+/* no icon support for input elements, provide padding by default */
+input.ui-button {
+       padding: 0.3em 1em;
+}
+
+/*button icon element(s) */
+.ui-button-icon-only .ui-icon,
+.ui-button-text-icon-primary .ui-icon,
+.ui-button-text-icon-secondary .ui-icon,
+.ui-button-text-icons .ui-icon,
+.ui-button-text-icon .ui-icon,
+.ui-button-icons-only .ui-icon {
+       position: absolute;
+       top: 50%;
+       margin-top: -9px;
+}
+.ui-button-icon-only .ui-icon {
+       left: 50%;
+       margin-left: -8px;
+}
+.ui-button-text-icon-primary .ui-button-icon-primary,
+.ui-button-text-icon .ui-button-icon-primary,
+.ui-button-text-icons .ui-button-icon-primary,
+.ui-button-icons-only .ui-button-icon-primary {
+       left: 0.5em;
+}
+.ui-button-text-icon-secondary .ui-button-icon-secondary,
+.ui-button-text-icon .ui-button-icon-secondary,
+.ui-button-text-icons .ui-button-icon-secondary,
+.ui-button-icons-only .ui-button-icon-secondary {
+       right: 0.5em;
+}
+
+/*button sets*/
+.ui-buttonset {
+       margin-right: 7px;
+}
+.ui-buttonset .ui-button {
+       margin-left: 0;
+       margin-right: -.4em;
+}
+
+/* workarounds */
+button.ui-button::-moz-focus-inner {
+       border: 0;
+       padding: 0; /* reset extra padding in Firefox */
+}
+/* Disables the annoying dashed border Firefox puts on active buttons */
+body button.ui-button::-moz-focus-inner {
+       border: 0;
+}
+/* Give large buttons some extra padding */
+body .ui-button-large {
+       padding: 5px;
+}
+/* Use white icons for colored buttons */
+.ui-button-green .ui-icon,
+.ui-button-blue .ui-icon,
+.ui-button-red .ui-icon,
+.ui-button-orange .ui-icon {
+       /* @embed */
+       background-image: url(images/ui-icons_ffffff_256x240.png) !important;
+}
+
+/* Corner radius */
+/* This is normally handled in jquery.ui.theme.css, but in our case, the corner
+   styling of our buttons doesn't match our default widget corner styling */
+.ui-button.ui-corner-all,
+.ui-button.ui-corner-top,
+.ui-button.ui-corner-left,
+.ui-button.ui-corner-tl {
+       -moz-border-radius-topleft: 4px;
+       -webkit-border-top-left-radius: 4px;
+       border-top-left-radius: 4px;
+}
+.ui-button.ui-corner-all,
+.ui-button.ui-corner-top,
+
+.ui-button.ui-corner-right,
+.ui-button.ui-corner-tr {
+       -moz-border-radius-topright: 4px;
+       -webkit-border-top-right-radius: 4px;
+       border-top-right-radius: 4px;
+}
+.ui-button.ui-corner-all,
+.ui-button.ui-corner-bottom,
+.ui-button.ui-corner-left,
+.ui-button.ui-corner-bl {
+       -moz-border-radius-bottomleft: 4px;
+       -webkit-border-bottom-left-radius: 4px;
+       border-bottom-left-radius: 4px;
+}
+.ui-button.ui-corner-all,
+.ui-button.ui-corner-bottom,
+.ui-button.ui-corner-right,
+.ui-button.ui-corner-br {
+       -moz-border-radius-bottomright: 4px;
+       -webkit-border-bottom-right-radius: 4px;
+       border-bottom-right-radius: 4px;
+}
+
+body .ui-button {
+       color: #2779aa;
+       margin: 0.5em 0 0.5em 0.4em;
+       border: 1px solid #aaa !important;
+       background: #f0f0f0 !important;
+       background: -moz-linear-gradient(top, #fff 0%, #ddd 90%) !important; /* FF3.6+ */
+       background: -webkit-linear-gradient(top, #fff 0%, #ddd 90%) !important; /* Chrome10+, Safari5.1+ */
+       background: -o-linear-gradient(top, #fff 0%, #ddd 90%) !important; /* Opera 11.10+ */
+       background: -ms-linear-gradient(top, #fff 0%, #ddd 90%) !important; /* IE10+ */
+       background: linear-gradient(to bottom, #fff 0%, #ddd 90%) !important;
+       filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#dddddd', GradientType=0); /* IE6-8 */
+       cursor: pointer;
+       font-size: 1em;
+       line-height: 1.4em;
+       width: auto;
+       overflow: visible;
+       -webkit-box-shadow: 0 1px 3px rgba(0,0,0,.2);
+       -moz-box-shadow: 0 1px 3px rgba(0,0,0,.2);
+       box-shadow: 0 1px 3px rgba(0,0,0,.2);
+}
+
+body .ui-button-icon-only {
+       width: 2.2em;
+}
+
+body .ui-button-icons-only {
+       width: 3.4em;
+}
+
+body .ui-button:hover {
+       color: #2779aa;
+       border-color: #bbb !important;
+       background: #fff !important;
+       background: -moz-linear-gradient(top, #fff 0%, #eee 90%) !important; /* FF3.6+ */
+       background: -webkit-linear-gradient(top, #fff 0%, #eee 90%) !important; /* Chrome10+, Safari5.1+ */
+       background: -o-linear-gradient(top, #fff 0%, #eee 90%) !important; /* Opera 11.10+ */
+       background: -ms-linear-gradient(top, #fff 0%, #eee 90%) !important; /* IE10+ */
+       background: linear-gradient(to bottom, #fff 0%, #eee 90%) !important;
+       filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#eeeeee', GradientType=0); /* IE6-8 */
+       -webkit-box-shadow: 0 1px 3px rgba(0,0,0,.1);
+       -moz-box-shadow: 0 1px 3px rgba(0,0,0,.1);
+       box-shadow: 0 1px 3px rgba(0,0,0,.1);
+}
+body .ui-button:active,
+body .ui-button:focus {
+       border-color: #8ad !important;
+       -webkit-box-shadow: 0 0 1px 1px rgba(167,215,249,.5);
+       -moz-box-shadow: 0 0 1px 1px rgba(167,215,249,.5);
+       box-shadow: 0 0 1px 1px rgba(167,215,249,.5);
+}
+body .ui-button:active {
+       background: #e0e0e0 !important;
+       background: -moz-linear-gradient(top, #f0f0f0 0%, #d0d0d0 90%) !important; /* FF3.6+ */
+       background: -webkit-linear-gradient(top, #f0f0f0 0%, #d0d0d0 90%) !important; /* Chrome10+, Safari5.1+ */
+       background: -o-linear-gradient(top, #f0f0f0 0%, #d0d0d0 90%) !important; /* Opera 11.10+ */
+       background: -ms-linear-gradient(top, #f0f0f0 0%, #d0d0d0 90%) !important; /* IE10+ */
+       background: linear-gradient(to bottom, #f0f0f0 0%, #d0d0d0 90%) !important;
+       filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#f0f0f0', endColorstr='#d0d0d0', GradientType=0); /* IE6-8 */
+}
+
+/* Green buttons */
+body .ui-button-green,
+body .ui-button-green .ui-button-text {
+       color: white;
+       text-shadow: 0 -1px 1px #072;
+}
+body .ui-button.ui-button-green {
+       border-color: #294 !important;
+       background: #295 !important;
+       background: -moz-linear-gradient(top, #3c8 0%, #295 90%) !important; /* FF3.6+ */
+       background: -webkit-linear-gradient(top, #3c8 0%, #295 90%) !important; /* Chrome10+, Safari5.1+ */
+       background: -o-linear-gradient(top, #3c8 0%, #295 90%) !important; /* Opera 11.10+ */
+       background: -ms-linear-gradient(top, #3c8 0%, #295 90%) !important; /* IE10+ */
+       background: linear-gradient(to bottom, #3c8 0%, #295 90%) !important;
+       filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#33cc88', endColorstr='#229955', GradientType=0); /* IE6-8 */
+       -webkit-box-shadow: 0 1px 3px rgba(0,0,0,.3);
+       -moz-box-shadow: 0 1px 3px rgba(0,0,0,.3);
+       box-shadow: 0 1px 3px rgba(0,0,0,.3);
+}
+body .ui-button.ui-button-green:hover {
+       background: #33a055 !important;
+       background: -moz-linear-gradient(top, #44d388 0%, #33a055 90%) !important; /* FF3.6+ */
+       background: -webkit-linear-gradient(top, #44d388 0%, #33a055 90%) !important; /* Chrome10+, Safari5.1+ */
+       background: -o-linear-gradient(top, #44d388 0%, #33a055 90%) !important; /* Opera 11.10+ */
+       background: -ms-linear-gradient(top, #44d388 0%, #33a055 90%) !important; /* IE10+ */
+       background: linear-gradient(to bottom, #44d388 0%, #33a055 90%) !important;
+       filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#44d388', endColorstr='#33a055', GradientType=0); /* IE6-8 */
+       -webkit-box-shadow: 0 1px 3px rgba(0,0,0,.25);
+       -moz-box-shadow: 0 1px 3px rgba(0,0,0,.25);
+       box-shadow: 0 1px 3px rgba(0,0,0,.25);
+}
+body .ui-button.ui-button-green:active,
+body .ui-button.ui-button-green:focus {
+       border-color: #172 !important;
+       -webkit-box-shadow: 0 0 2px 2px rgba(167,215,249,.75);
+       -moz-box-shadow: 0 0 2px 2px rgba(167,215,249,.75);
+       box-shadow: 0 0 2px 2px rgba(167,215,249,.75);
+}
+body .ui-button.ui-button-green:active {
+       background: #338855 !important;
+       background: -moz-linear-gradient(top, #30c080 0%, #338855 90%) !important; /* FF3.6+ */
+       background: -webkit-linear-gradient(top, #30c080 0%, #338855 90%) !important; /* Chrome10+, Safari5.1+ */
+       background: -o-linear-gradient(top, #30c080 0%, #338855 90%) !important; /* Opera 11.10+ */
+       background: -ms-linear-gradient(top, #30c080 0%, #338855 90%) !important; /* IE10+ */
+       background: linear-gradient(to bottom, #30c080 0%, #338855 90%) !important;
+       filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#30c080', endColorstr='#338855', GradientType=0); /* IE6-8 */
+}
+
+/* Blue buttons */
+body .ui-button-blue,
+body .ui-button-blue .ui-button-text {
+       color: white;
+       text-shadow: 0 -1px 1px #037;
+}
+body .ui-button.ui-button-blue {
+       border-color: #468 !important;
+       background: #36b !important;
+       background: -moz-linear-gradient(top, #48e 0%, #36b 90%) !important; /* FF3.6+ */
+       background: -webkit-linear-gradient(top, #48e 0%, #36b 90%) !important; /* Chrome10+, Safari5.1+ */
+       background: -o-linear-gradient(top, #48e 0%, #36b 90%) !important; /* Opera 11.10+ */
+       background: -ms-linear-gradient(top, #48e 0%, #36b 90%) !important; /* IE10+ */
+       background: linear-gradient(to bottom, #48e 0%, #36b 90%) !important;
+       filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#4488ee', endColorstr='#3366bb', GradientType=0); /* IE6-8 */
+       -webkit-box-shadow: 0 1px 3px rgba(0,0,0,.35);
+       -moz-box-shadow: 0 1px 3px rgba(0,0,0,.35);
+       box-shadow: 0 1px 3px rgba(0,0,0,.35);
+}
+body .ui-button.ui-button-blue:hover {
+       background: #36c !important;
+       background: -moz-linear-gradient(top, #59e 0%, #36c 90%) !important; /* FF3.6+ */
+       background: -webkit-linear-gradient(top, #59e 0%, #36c 90%) !important; /* Chrome10+, Safari5.1+ */
+       background: -o-linear-gradient(top, #59e 0%, #36c 90%) !important; /* Opera 11.10+ */
+       background: -ms-linear-gradient(top, #59e 0%, #36c 90%) !important; /* IE10+ */
+       background: linear-gradient(to bottom, #59e 0%, #36c 90%) !important;
+       filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#5599ee', endColorstr='#3366cc', GradientType=0); /* IE6-8 */
+}
+body .ui-button.ui-button-blue:active,
+body .ui-button.ui-button-blue:focus {
+       border-color: #357 !important;
+       -webkit-box-shadow: 0 0 2px 2px rgba(167,215,249,.75);
+       -moz-box-shadow: 0 0 2px 2px rgba(167,215,249,.75);
+       box-shadow: 0 0 2px 2px rgba(167,215,249,.75);
+}
+body .ui-button.ui-button-blue:active {
+       background: #3060a0 !important;
+       background: -moz-linear-gradient(top, #4080e0 0%, #3060a0 90%) !important; /* FF3.6+ */
+       background: -webkit-linear-gradient(top, #4080e0 0%, #3060a0 90%) !important; /* Chrome10+, Safari5.1+ */
+       background: -o-linear-gradient(top, #4080e0 0%, #3060a0 90%) !important; /* Opera 11.10+ */
+       background: -ms-linear-gradient(top, #4080e0 0%, #3060a0 90%) !important; /* IE10+ */
+       background: linear-gradient(to bottom, #4080e0 0%, #3060a0 90%) !important;
+       filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#4080e0', endColorstr='#3060a0', GradientType=0); /* IE6-8 */
+}
+
+/* Red buttons */
+body .ui-button-red,
+body .ui-button-red .ui-button-text {
+       color: white;
+       text-shadow: 0 -1px 1px #700;
+}
+body .ui-button.ui-button-red {
+       border-color: #944 !important;
+       background: #a22 !important;
+       background: -moz-linear-gradient(top, #d44 0%, #a22 90%) !important; /* FF3.6+ */
+       background: -webkit-linear-gradient(top, #d44 0%, #a22 90%) !important; /* Chrome10+, Safari5.1+ */
+       background: -o-linear-gradient(top, #d44 0%, #a22 90%) !important; /* Opera 11.10+ */
+       background: -ms-linear-gradient(top, #d44 0%, #a22 90%) !important; /* IE10+ */
+       background: linear-gradient(to bottom, #d44 0%, #a22 90%) !important;
+       filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#dd4444', endColorstr='#aa2222', GradientType=0); /* IE6-8 */
+       -webkit-box-shadow: 0 1px 3px rgba(0,0,0,.35);
+       -moz-box-shadow: 0 1px 3px rgba(0,0,0,.35);
+       box-shadow: 0 1px 3px rgba(0,0,0,.35);
+}
+body .ui-button.ui-button-red:hover {
+       border-color: #a44 !important;
+       background: #b03333 !important;
+       background: -moz-linear-gradient(top, #ee4646 0%, #b03333 90%) !important; /* FF3.6+ */
+       background: -webkit-linear-gradient(top, #ee4646 0%, #b03333 90%) !important; /* Chrome10+, Safari5.1+ */
+       background: -o-linear-gradient(top, #ee4646 0%, #b03333 90%) !important; /* Opera 11.10+ */
+       background: -ms-linear-gradient(top, #ee4646 0%, #b03333 90%) !important; /* IE10+ */
+       background: linear-gradient(to bottom, #ee4646 0%, #b03333 90%) !important;
+       filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ee4646', endColorstr='#b03333', GradientType=0); /* IE6-8 */
+       -webkit-box-shadow: 0 1px 3px rgba(0,0,0,.3);
+       -moz-box-shadow: 0 1px 3px rgba(0,0,0,.3);
+       box-shadow: 0 1px 3px rgba(0,0,0,.3);
+}
+body .ui-button.ui-button-red:active,
+body .ui-button.ui-button-red:focus {
+       border-color: #747 !important;
+       -webkit-box-shadow: 0 0 2px 2px rgba(167,215,249,.7);
+       -moz-box-shadow: 0 0 2px 2px rgba(167,215,249,.7);
+       box-shadow: 0 0 2px 2px rgba(167,215,249,.7);
+}
+body .ui-button.ui-button-red:active {
+       background: #952020 !important;
+       background: -moz-linear-gradient(top, #d04545 0%, #952020 90%) !important; /* FF3.6+ */
+       background: -webkit-linear-gradient(top, #d04545 0%, #952020 90%) !important; /* Chrome10+, Safari5.1+ */
+       background: -o-linear-gradient(top, #d04545 0%, #952020 90%) !important; /* Opera 11.10+ */
+       background: -ms-linear-gradient(top, #d04545 0%, #952020 90%) !important; /* IE10+ */
+       background: linear-gradient(to bottom, #d04545 0%, #952020 90%) !important;
+       filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#d04545', endColorstr='#952020', GradientType=0); /* IE6-8 */
+}
+
+/* Disabled buttons */
+body .ui-button-green.disabled,
+body .ui-button-green.disabled:hover,
+body .ui-button-green.disabled:active,
+body .ui-button-green.disabled:focus,
+body .ui-button-blue.disabled,
+body .ui-button-blue.disabled:hover,
+body .ui-button-blue.disabled:active,
+body .ui-button-blue.disabled:focus,
+body .ui-button-red.disabled,
+body .ui-button-red.disabled:hover,
+body .ui-button-red.disabled:active,
+body .ui-button-red.disabled:focus,
+body .ui-button.disabled,
+body .ui-button.disabled:hover {
+       color: #aaa;
+       border-color: #ccc !important;
+       background: #eee !important;
+       background: -moz-linear-gradient(top, #f6f6f6 0%, #eee 90%) !important; /* FF3.6+ */
+       background: -webkit-linear-gradient(top, #f6f6f6 0%, #eee 90%) !important; /* Chrome10+, Safari5.1+ */
+       background: -o-linear-gradient(top, #f6f6f6 0%, #eee 90%) !important; /* Opera 11.10+ */
+       background: -ms-linear-gradient(top, #f6f6f6 0%, #eee 90%) !important; /* IE10+ */
+       background: linear-gradient(to bottom, #f6f6f6 0%, #eee 90%) !important;
+       filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#f6f6f6', endColorstr='#eeeeee', GradientType=0); /* IE6-8 */
+       -webkit-box-shadow: 0 1px 3px rgba(0,0,0,0);
+       -moz-box-shadow: 0 1px 3px rgba(0,0,0,0);
+       box-shadow: 0 1px 3px rgba(0,0,0,0);
+}
+body .ui-button-green.disabled .ui-button-text,
+body .ui-button-blue.disabled .ui-button-text,
+body .ui-button-red.disabled .ui-button-text {
+       color: #aaa;
+       text-shadow: 0 1px 1px #fff;
+}
diff --git a/resources/src/jquery.ui-themes/vector/jquery.ui.core.css b/resources/src/jquery.ui-themes/vector/jquery.ui.core.css
new file mode 100644 (file)
index 0000000..b3e8193
--- /dev/null
@@ -0,0 +1,37 @@
+/*
+* jQuery UI CSS Framework
+* Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about)
+* Dual licensed under the MIT (MIT-LICENSE.txt) and GPL (GPL-LICENSE.txt) licenses.
+*/
+
+/* Layout helpers
+----------------------------------*/
+.ui-helper-hidden { display: none; }
+.ui-helper-hidden-accessible { position: absolute; left: -99999999px; }
+.ui-helper-reset { margin: 0; padding: 0; border: 0; outline: 0; line-height: 1.3; text-decoration: none; font-size: 100%; list-style: none; }
+.ui-helper-clearfix:after { content: "."; display: block; height: 0; clear: both; visibility: hidden; }
+.ui-helper-clearfix { display: inline-block; }
+/* required comment for clearfix to work in Opera \*/
+* html .ui-helper-clearfix { height:1%; }
+.ui-helper-clearfix { display:block; }
+/* end clearfix */
+.ui-helper-zfix { width: 100%; height: 100%; top: 0; left: 0; position: absolute; opacity: 0; filter:Alpha(Opacity=0); }
+
+
+/* Interaction Cues
+----------------------------------*/
+.ui-state-disabled { cursor: default !important; }
+
+
+/* Icons
+----------------------------------*/
+
+/* states and images */
+.ui-icon { display: block; text-indent: -99999px; overflow: hidden; background-repeat: no-repeat; }
+
+
+/* Misc visuals
+----------------------------------*/
+
+/* Overlays */
+.ui-widget-overlay { position: absolute; top: 0; left: 0; width: 100%; height: 100%; }
diff --git a/resources/src/jquery.ui-themes/vector/jquery.ui.datepicker.css b/resources/src/jquery.ui-themes/vector/jquery.ui.datepicker.css
new file mode 100644 (file)
index 0000000..871bf69
--- /dev/null
@@ -0,0 +1,61 @@
+/* Datepicker
+----------------------------------*/
+.ui-datepicker { width: 17em; padding: .2em .2em 0; display: none; }
+.ui-datepicker .ui-datepicker-header { position:relative; padding:.2em 0; }
+.ui-datepicker .ui-datepicker-prev, .ui-datepicker .ui-datepicker-next { position:absolute; top: 2px; width: 1.8em; height: 1.8em; }
+.ui-datepicker .ui-datepicker-prev-hover, .ui-datepicker .ui-datepicker-next-hover { top: 1px; }
+.ui-datepicker .ui-datepicker-prev { left:2px; }
+.ui-datepicker .ui-datepicker-next { right:2px; }
+.ui-datepicker .ui-datepicker-prev-hover { left:1px; }
+.ui-datepicker .ui-datepicker-next-hover { right:1px; }
+.ui-datepicker .ui-datepicker-prev span, .ui-datepicker .ui-datepicker-next span { display: block; position: absolute; left: 50%; margin-left: -8px; top: 50%; margin-top: -8px;  }
+.ui-datepicker .ui-datepicker-title { margin: 0 2.3em; line-height: 1.8em; text-align: center; }
+.ui-datepicker .ui-datepicker-title select { font-size:1em; margin:1px 0; padding:1px 0; }
+.ui-datepicker select.ui-datepicker-month-year {width: 100%;}
+.ui-datepicker select.ui-datepicker-month, 
+.ui-datepicker select.ui-datepicker-year { width: 49%;}
+.ui-datepicker table {width: 100%; font-size: .9em; border-collapse: collapse; margin:0 0 .4em; }
+.ui-datepicker th { padding: .7em .3em; text-align: center; font-weight: bold; border: 0;  }
+.ui-datepicker td { border: 0; padding: 1px; }
+.ui-datepicker td span, .ui-datepicker td a { display: block; padding: .2em; text-align: right; text-decoration: none; }
+.ui-datepicker .ui-datepicker-buttonpane { background-image: none; margin: .2em 0 0 0; padding: 0 .2em; border-top: 1px solid #DDDDDD; border-left: 0; border-right: 0; border-bottom: 0; }
+.ui-datepicker .ui-datepicker-buttonpane button { float: right; margin: .5em .2em .4em; cursor: pointer; padding: .2em .6em .3em .6em; width:auto; overflow:visible; }
+.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current { float:left; }
+
+/* with multiple calendars */
+.ui-datepicker.ui-datepicker-multi { width:auto; }
+.ui-datepicker-multi .ui-datepicker-group { float:left; }
+.ui-datepicker-multi .ui-datepicker-group table { width:95%; margin:0 auto .4em; }
+.ui-datepicker-multi-2 .ui-datepicker-group { width:50%; }
+.ui-datepicker-multi-3 .ui-datepicker-group { width:33.3%; }
+.ui-datepicker-multi-4 .ui-datepicker-group { width:25%; }
+.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header { border-left-width:0; }
+.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header { border-left-width:0; }
+.ui-datepicker-multi .ui-datepicker-buttonpane { clear:left; }
+.ui-datepicker-row-break { clear:both; width:100%; }
+
+/* RTL support */
+/* @noflip */ .ui-datepicker-rtl { direction: rtl; }
+/* @noflip */ .ui-datepicker-rtl .ui-datepicker-prev { right: 2px; left: auto; }
+/* @noflip */ .ui-datepicker-rtl .ui-datepicker-next { left: 2px; right: auto; }
+/* @noflip */ .ui-datepicker-rtl .ui-datepicker-prev:hover { right: 1px; left: auto; }
+/* @noflip */ .ui-datepicker-rtl .ui-datepicker-next:hover { left: 1px; right: auto; }
+/* @noflip */ .ui-datepicker-rtl .ui-datepicker-buttonpane { clear:right; }
+/* @noflip */ .ui-datepicker-rtl .ui-datepicker-buttonpane button { float: left; }
+/* @noflip */ .ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current { float:right; }
+/* @noflip */ .ui-datepicker-rtl .ui-datepicker-group { float:right; }
+/* @noflip */ .ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header { border-right-width:0; border-left-width:1px; }
+/* @noflip */ .ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header { border-right-width:0; border-left-width:1px; }
+
+/* IE6 IFRAME FIX (taken from datepicker 1.5.3 */
+.ui-datepicker-cover {
+    display: none; /*sorry for IE5*/
+    display/**/: block; /*sorry for IE5*/
+    position: absolute; /*must have*/
+    z-index: -1; /*must have*/
+    filter: mask(); /*must have*/
+    top: -4px; /*must have*/
+    left: -4px; /*must have*/
+    width: 200px; /*must have*/
+    height: 200px; /*must have*/
+}
\ No newline at end of file
diff --git a/resources/src/jquery.ui-themes/vector/jquery.ui.dialog.css b/resources/src/jquery.ui-themes/vector/jquery.ui.dialog.css
new file mode 100644 (file)
index 0000000..cd85f14
--- /dev/null
@@ -0,0 +1,37 @@
+/* Dialog
+----------------------------------*/
+.ui-dialog { position: absolute; padding: 0; width: 300px; }
+.ui-dialog .ui-dialog-titlebar { padding: .75em; position: relative;  }
+.ui-dialog .ui-dialog-title { float: left; margin: 0; } 
+.ui-dialog .ui-dialog-titlebar-close { position: absolute; right: .75em; top: 50%; width: 19px; margin: -10px 0 0 0; padding: 1px; height: 18px; }
+.ui-dialog .ui-dialog-titlebar-close span { display: block; margin: 1px; }
+.ui-dialog .ui-dialog-titlebar-close:hover, .ui-dialog .ui-dialog-titlebar-close:focus { padding: 0; }
+.ui-dialog .ui-dialog-content { border: 0; padding: .5em 1em; background: none; overflow: auto; zoom: 1; }
+.ui-dialog .ui-dialog-buttonpane { text-align: left; border-width: 1px 0 0 0; background-image: none; margin: .5em 0 0 0; padding: .3em 1em .5em .4em; }
+.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset { float: right; }
+.ui-dialog .ui-resizable-se { width: 14px; height: 14px; right: 3px; bottom: 3px; }
+.ui-draggable .ui-dialog-titlebar { cursor: move; }
+/* Customizations */
+body .ui-dialog .ui-dialog-titlebar-close:hover {
+       text-decoration: none;
+}
+body .ui-dialog .ui-dialog-content .status-invalid input {
+       border: 2px solid red;
+       padding: 2px 1px;
+}
+body .ui-dialog .ui-dialog-titlebar {
+       padding: 0.9em 1.4em 0.6em !important;
+}
+body .ui-dialog .ui-widget-header {
+       /* @embed */
+       background: #f0f0f0 url(images/titlebar-fade.png) repeat-x scroll 50% 100% !important;
+}
+/* FIXME: Should just update the icon sprite if we're keeping this X */
+body .ui-dialog .ui-icon-closethick {
+       /* @embed */
+       background: url(images/close.png) no-repeat 50% 50% !important;
+}
+body .ui-dialog .ui-dialog-buttonpane {
+       margin-top: 0 !important;
+       padding:0.3em 1.4em 0.5em 1.4em !important;
+}
diff --git a/resources/src/jquery.ui-themes/vector/jquery.ui.progressbar.css b/resources/src/jquery.ui-themes/vector/jquery.ui.progressbar.css
new file mode 100644 (file)
index 0000000..bc0939e
--- /dev/null
@@ -0,0 +1,4 @@
+/* Progressbar
+----------------------------------*/
+.ui-progressbar { height:2em; text-align: left; }
+.ui-progressbar .ui-progressbar-value {margin: -1px; height:100%; }
\ No newline at end of file
diff --git a/resources/src/jquery.ui-themes/vector/jquery.ui.resizable.css b/resources/src/jquery.ui-themes/vector/jquery.ui.resizable.css
new file mode 100644 (file)
index 0000000..f1bd7c5
--- /dev/null
@@ -0,0 +1,19 @@
+/* Resizable
+----------------------------------*/
+.ui-resizable { position: relative;}
+.ui-resizable-handle { position: absolute;font-size: 0.1px;z-index: 99999; display: block;}
+.ui-resizable-disabled .ui-resizable-handle, .ui-resizable-autohide .ui-resizable-handle { display: none; }
+.ui-resizable-n { cursor: n-resize; height: 7px; width: 100%; top: -5px; left: 0; }
+.ui-resizable-s { cursor: s-resize; height: 7px; width: 100%; bottom: -5px; left: 0; }
+/* @noflip */
+.ui-resizable-e { cursor: e-resize; width: 7px; right: -5px; top: 0; height: 100%; }
+/* @noflip */
+.ui-resizable-w { cursor: w-resize; width: 7px; left: -5px; top: 0; height: 100%; }
+/* @noflip */
+.ui-resizable-se { cursor: se-resize; width: 12px; height: 12px; right: 1px; bottom: 1px; }
+/* @noflip */
+.ui-resizable-sw { cursor: sw-resize; width: 9px; height: 9px; left: -5px; bottom: -5px; }
+/* @noflip */
+.ui-resizable-nw { cursor: nw-resize; width: 9px; height: 9px; left: -5px; top: -5px; }
+/* @noflip */
+.ui-resizable-ne { cursor: ne-resize; width: 9px; height: 9px; right: -5px; top: -5px;}
\ No newline at end of file
diff --git a/resources/src/jquery.ui-themes/vector/jquery.ui.selectable.css b/resources/src/jquery.ui-themes/vector/jquery.ui.selectable.css
new file mode 100644 (file)
index 0000000..c5d46ce
--- /dev/null
@@ -0,0 +1,3 @@
+/* Selectable
+----------------------------------*/
+.ui-selectable-helper { border:1px dotted black }
diff --git a/resources/src/jquery.ui-themes/vector/jquery.ui.slider.css b/resources/src/jquery.ui-themes/vector/jquery.ui.slider.css
new file mode 100644 (file)
index 0000000..07c6f4e
--- /dev/null
@@ -0,0 +1,17 @@
+/* Slider
+----------------------------------*/
+.ui-slider { position: relative; text-align: left; }
+.ui-slider .ui-slider-handle { position: absolute; z-index: 2; width: 1.2em; height: 1.2em; cursor: default; }
+.ui-slider .ui-slider-range { position: absolute; z-index: 1; font-size: .7em; display: block; border: 0; background-position: 0 0; }
+
+.ui-slider-horizontal { height: .8em; }
+.ui-slider-horizontal .ui-slider-handle { top: -.3em; margin-left: -.6em; }
+.ui-slider-horizontal .ui-slider-range { top: 0; height: 100%; }
+.ui-slider-horizontal .ui-slider-range-min { left: 0; }
+.ui-slider-horizontal .ui-slider-range-max { right: 0; }
+
+.ui-slider-vertical { width: .8em; height: 100px; }
+.ui-slider-vertical .ui-slider-handle { left: -.3em; margin-left: 0; margin-bottom: -.6em; }
+.ui-slider-vertical .ui-slider-range { left: 0; width: 100%; }
+.ui-slider-vertical .ui-slider-range-min { bottom: 0; }
+.ui-slider-vertical .ui-slider-range-max { top: 0; }
\ No newline at end of file
diff --git a/resources/src/jquery.ui-themes/vector/jquery.ui.tabs.css b/resources/src/jquery.ui-themes/vector/jquery.ui.tabs.css
new file mode 100644 (file)
index 0000000..99e16db
--- /dev/null
@@ -0,0 +1,11 @@
+/* Tabs
+----------------------------------*/
+.ui-tabs { position: relative; padding: .2em; zoom: 1; } /* position: relative prevents IE scroll bug (element with position: relative inside container with overflow: auto appear as "fixed") */
+.ui-tabs .ui-tabs-nav { margin: 0; padding: .2em .2em 0; }
+.ui-tabs .ui-tabs-nav li { list-style: none; float: left; position: relative; top: 1px; margin: 0 .2em 1px 0; border-bottom: 0 !important; padding: 0; white-space: nowrap; }
+.ui-tabs .ui-tabs-nav li a { float: left; padding: .5em 1em; text-decoration: none; }
+.ui-tabs .ui-tabs-nav li.ui-tabs-selected { margin-bottom: 0; padding-bottom: 1px; }
+.ui-tabs .ui-tabs-nav li.ui-tabs-selected a, .ui-tabs .ui-tabs-nav li.ui-state-disabled a, .ui-tabs .ui-tabs-nav li.ui-state-processing a { cursor: text; }
+.ui-tabs .ui-tabs-nav li a, .ui-tabs.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-selected a { cursor: pointer; } /* first selector in group seems obsolete, but required to overcome bug in Opera applying cursor: text overall if defined elsewhere... */
+.ui-tabs .ui-tabs-panel { display: block; border-width: 0; padding: 1em 1.4em; background: none; }
+.ui-tabs .ui-tabs-hide { display: none !important; }
diff --git a/resources/src/jquery.ui-themes/vector/jquery.ui.theme.css b/resources/src/jquery.ui-themes/vector/jquery.ui.theme.css
new file mode 100644 (file)
index 0000000..e39371d
--- /dev/null
@@ -0,0 +1,248 @@
+
+
+/*
+* jQuery UI CSS Framework
+* Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about)
+* Dual licensed under the MIT (MIT-LICENSE.txt) and GPL (GPL-LICENSE.txt) licenses.
+* To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=sans-serif&fwDefault=normal&fsDefault=1.0em&cornerRadius=3px&bgColorHeader=ffffff&bgTextureHeader=03_highlight_soft.png&bgImgOpacityHeader=100&borderColorHeader=aed0ea&fcHeader=222222&iconColorHeader=72a7cf&bgColorContent=f2f5f7&bgTextureContent=04_highlight_hard.png&bgImgOpacityContent=100&borderColorContent=cccccc&fcContent=362b36&iconColorContent=72a7cf&bgColorDefault=d7ebf9&bgTextureDefault=04_highlight_hard.png&bgImgOpacityDefault=80&borderColorDefault=aed0ea&fcDefault=2779aa&iconColorDefault=3d80b3&bgColorHover=e4f1fb&bgTextureHover=03_highlight_soft.png&bgImgOpacityHover=100&borderColorHover=74b2e2&fcHover=0070a3&iconColorHover=2694e8&bgColorActive=f0f0f0&bgTextureActive=06_inset_hard.png&bgImgOpacityActive=100&borderColorActive=cccccc&fcActive=000000&iconColorActive=666666&bgColorHighlight=ffef8f&bgTextureHighlight=03_highlight_soft.png&bgImgOpacityHighlight=25&borderColorHighlight=f9dd34&fcHighlight=363636&iconColorHighlight=2e83ff&bgColorError=cd0a0a&bgTextureError=01_flat.png&bgImgOpacityError=15&borderColorError=cd0a0a&fcError=ffffff&iconColorError=ffffff&bgColorOverlay=000000&bgTextureOverlay=21_glow_ball.png&bgImgOpacityOverlay=100&opacityOverlay=50&bgColorShadow=000000&bgTextureShadow=01_flat.png&bgImgOpacityShadow=70&opacityShadow=20&thicknessShadow=7px&offsetTopShadow=-7px&offsetLeftShadow=-7px&cornerRadiusShadow=8px
+*/
+
+
+/* Component containers
+----------------------------------*/
+.ui-widget { font-family: sans-serif; font-size: 0.8em; }
+.ui-widget .ui-widget { font-size: 1em; }
+.ui-widget input, .ui-widget select, .ui-widget textarea, .ui-widget button { font-family: sans-serif; font-size: 1em; }
+.ui-widget-content { border: 1px solid #cccccc; /* @embed */ background: #f2f5f7 url(images/ui-bg_highlight-hard_100_f2f5f7_1x100.png) 50% top repeat-x; color: #362b36; }
+.ui-widget-content a { color: #362b36; }
+.ui-widget-header { border-bottom: 1px solid #bbbbbb; line-height: 1em; /* @embed */ background: #ffffff url(images/ui-bg_highlight-soft_100_ffffff_1x100.png) 50% 50% repeat-x; color: #222222; font-weight: bold; }
+.ui-widget-header a { color: #222222; }
+
+/* Interaction states
+----------------------------------*/
+.ui-state-default, .ui-widget-content .ui-state-default, .ui-widget-header .ui-state-default { border: 1px solid #aed0ea; /* @embed */ background: #d7ebf9 url(images/ui-bg_highlight-hard_80_d7ebf9_1x100.png) 50% 50% repeat-x; font-weight: normal; color: #2779aa; }
+.ui-state-default a, .ui-state-default a:link, .ui-state-default a:visited { color: #2779aa; text-decoration: none; }
+.ui-state-hover, .ui-widget-content .ui-state-hover, .ui-widget-header .ui-state-hover, .ui-state-focus, .ui-widget-content .ui-state-focus, .ui-widget-header .ui-state-focus { border: 1px solid #74b2e2; /* @embed */ background: #e4f1fb url(images/ui-bg_highlight-soft_100_e4f1fb_1x100.png) 50% 50% repeat-x; font-weight: normal; color: #0070a3; }
+.ui-state-hover a, .ui-state-hover a:hover { color: #0070a3; text-decoration: none; }
+.ui-state-active, .ui-widget-content .ui-state-active, .ui-widget-header .ui-state-active { border: 1px solid #cccccc; background: #f0f0f0 /* @embed */ url(images/ui-bg_inset-hard_100_f0f0f0_1x100.png) 50% 50% repeat-x; font-weight: normal; color: #000000; }
+.ui-state-active a, .ui-state-active a:link, .ui-state-active a:visited { color: #000000; text-decoration: none; }
+.ui-widget :active { outline: none; }
+
+/* Interaction Cues
+----------------------------------*/
+.ui-state-highlight, .ui-widget-content .ui-state-highlight, .ui-widget-header .ui-state-highlight  {border: 1px solid #f9dd34; background: #ffef8f /* @embed */ url(images/ui-bg_highlight-soft_25_ffef8f_1x100.png) 50% top repeat-x; color: #363636; }
+.ui-state-highlight a, .ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a { color: #363636; }
+.ui-state-error, .ui-widget-content .ui-state-error, .ui-widget-header .ui-state-error {border: 1px solid #cd0a0a; background: #cd0a0a /* @embed */ url(images/ui-bg_flat_15_cd0a0a_40x100.png) 50% 50% repeat-x; color: #ffffff; }
+.ui-state-error a, .ui-widget-content .ui-state-error a, .ui-widget-header .ui-state-error a { color: #ffffff; }
+.ui-state-error-text, .ui-widget-content .ui-state-error-text, .ui-widget-header .ui-state-error-text { color: #ffffff; }
+.ui-priority-primary, .ui-widget-content .ui-priority-primary, .ui-widget-header .ui-priority-primary { font-weight: bold; }
+.ui-priority-secondary, .ui-widget-content .ui-priority-secondary,  .ui-widget-header .ui-priority-secondary { opacity: .7; filter:Alpha(Opacity=70); font-weight: normal; }
+.ui-state-disabled, .ui-widget-content .ui-state-disabled, .ui-widget-header .ui-state-disabled { opacity: .35; filter:Alpha(Opacity=35); background-image: none; }
+
+/* Icons
+----------------------------------*/
+
+/* states and images */
+.ui-icon { width: 16px; height: 16px; }
+.ui-icon, .ui-widget-content .ui-icon, .ui-widget-header .ui-icon { /* @embed */ background-image: url(images/ui-icons_72a7cf_256x240.png); }
+.ui-state-default .ui-icon { /* @embed */ background-image: url(images/ui-icons_3d80b3_256x240.png); }
+.ui-state-hover .ui-icon, .ui-state-focus .ui-icon { /* @embed */ background-image: url(images/ui-icons_2694e8_256x240.png); }
+.ui-state-active .ui-icon { /* @embed */ background-image: url(images/ui-icons_666666_256x240.png); }
+.ui-state-highlight .ui-icon { /* @embed */ background-image: url(images/ui-icons_2e83ff_256x240.png); }
+.ui-state-error .ui-icon, .ui-state-error-text .ui-icon { /* @embed */ background-image: url(images/ui-icons_ffffff_256x240.png); }
+
+/* positioning */
+.ui-icon-carat-1-n { background-position: 0 0; }
+.ui-icon-carat-1-ne { background-position: -16px 0; }
+.ui-icon-carat-1-e { background-position: -32px 0; }
+.ui-icon-carat-1-se { background-position: -48px 0; }
+.ui-icon-carat-1-s { background-position: -64px 0; }
+.ui-icon-carat-1-sw { background-position: -80px 0; }
+.ui-icon-carat-1-w { background-position: -96px 0; }
+.ui-icon-carat-1-nw { background-position: -112px 0; }
+.ui-icon-carat-2-n-s { background-position: -128px 0; }
+.ui-icon-carat-2-e-w { background-position: -144px 0; }
+.ui-icon-triangle-1-n { background-position: 0 -16px; }
+.ui-icon-triangle-1-ne { background-position: -16px -16px; }
+.ui-icon-triangle-1-e { background-position: -32px -16px; }
+.ui-icon-triangle-1-se { background-position: -48px -16px; }
+.ui-icon-triangle-1-s { background-position: -64px -16px; }
+.ui-icon-triangle-1-sw { background-position: -80px -16px; }
+.ui-icon-triangle-1-w { background-position: -96px -16px; }
+.ui-icon-triangle-1-nw { background-position: -112px -16px; }
+.ui-icon-triangle-2-n-s { background-position: -128px -16px; }
+.ui-icon-triangle-2-e-w { background-position: -144px -16px; }
+.ui-icon-arrow-1-n { background-position: 0 -32px; }
+.ui-icon-arrow-1-ne { background-position: -16px -32px; }
+.ui-icon-arrow-1-e { background-position: -32px -32px; }
+.ui-icon-arrow-1-se { background-position: -48px -32px; }
+.ui-icon-arrow-1-s { background-position: -64px -32px; }
+.ui-icon-arrow-1-sw { background-position: -80px -32px; }
+.ui-icon-arrow-1-w { background-position: -96px -32px; }
+.ui-icon-arrow-1-nw { background-position: -112px -32px; }
+.ui-icon-arrow-2-n-s { background-position: -128px -32px; }
+.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; }
+.ui-icon-arrow-2-e-w { background-position: -160px -32px; }
+.ui-icon-arrow-2-se-nw { background-position: -176px -32px; }
+.ui-icon-arrowstop-1-n { background-position: -192px -32px; }
+.ui-icon-arrowstop-1-e { background-position: -208px -32px; }
+.ui-icon-arrowstop-1-s { background-position: -224px -32px; }
+.ui-icon-arrowstop-1-w { background-position: -240px -32px; }
+.ui-icon-arrowthick-1-n { background-position: 0 -48px; }
+.ui-icon-arrowthick-1-ne { background-position: -16px -48px; }
+.ui-icon-arrowthick-1-e { background-position: -32px -48px; }
+.ui-icon-arrowthick-1-se { background-position: -48px -48px; }
+.ui-icon-arrowthick-1-s { background-position: -64px -48px; }
+.ui-icon-arrowthick-1-sw { background-position: -80px -48px; }
+.ui-icon-arrowthick-1-w { background-position: -96px -48px; }
+.ui-icon-arrowthick-1-nw { background-position: -112px -48px; }
+.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; }
+.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; }
+.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; }
+.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; }
+.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; }
+.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; }
+.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; }
+.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; }
+.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; }
+.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; }
+.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; }
+.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; }
+.ui-icon-arrowreturn-1-w { background-position: -64px -64px; }
+.ui-icon-arrowreturn-1-n { background-position: -80px -64px; }
+.ui-icon-arrowreturn-1-e { background-position: -96px -64px; }
+.ui-icon-arrowreturn-1-s { background-position: -112px -64px; }
+.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; }
+.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; }
+.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; }
+.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; }
+.ui-icon-arrow-4 { background-position: 0 -80px; }
+.ui-icon-arrow-4-diag { background-position: -16px -80px; }
+.ui-icon-extlink { background-position: -32px -80px; }
+.ui-icon-newwin { background-position: -48px -80px; }
+.ui-icon-refresh { background-position: -64px -80px; }
+.ui-icon-shuffle { background-position: -80px -80px; }
+.ui-icon-transfer-e-w { background-position: -96px -80px; }
+.ui-icon-transferthick-e-w { background-position: -112px -80px; }
+.ui-icon-folder-collapsed { background-position: 0 -96px; }
+.ui-icon-folder-open { background-position: -16px -96px; }
+.ui-icon-document { background-position: -32px -96px; }
+.ui-icon-document-b { background-position: -48px -96px; }
+.ui-icon-note { background-position: -64px -96px; }
+.ui-icon-mail-closed { background-position: -80px -96px; }
+.ui-icon-mail-open { background-position: -96px -96px; }
+.ui-icon-suitcase { background-position: -112px -96px; }
+.ui-icon-comment { background-position: -128px -96px; }
+.ui-icon-person { background-position: -144px -96px; }
+.ui-icon-print { background-position: -160px -96px; }
+.ui-icon-trash { background-position: -176px -96px; }
+.ui-icon-locked { background-position: -192px -96px; }
+.ui-icon-unlocked { background-position: -208px -96px; }
+.ui-icon-bookmark { background-position: -224px -96px; }
+.ui-icon-tag { background-position: -240px -96px; }
+.ui-icon-home { background-position: 0 -112px; }
+.ui-icon-flag { background-position: -16px -112px; }
+.ui-icon-calendar { background-position: -32px -112px; }
+.ui-icon-cart { background-position: -48px -112px; }
+.ui-icon-pencil { background-position: -64px -112px; }
+.ui-icon-clock { background-position: -80px -112px; }
+.ui-icon-disk { background-position: -96px -112px; }
+.ui-icon-calculator { background-position: -112px -112px; }
+.ui-icon-zoomin { background-position: -128px -112px; }
+.ui-icon-zoomout { background-position: -144px -112px; }
+.ui-icon-search { background-position: -160px -112px; }
+.ui-icon-wrench { background-position: -176px -112px; }
+.ui-icon-gear { background-position: -192px -112px; }
+.ui-icon-heart { background-position: -208px -112px; }
+.ui-icon-star { background-position: -224px -112px; }
+.ui-icon-link { background-position: -240px -112px; }
+.ui-icon-cancel { background-position: 0 -128px; }
+.ui-icon-plus { background-position: -16px -128px; }
+.ui-icon-plusthick { background-position: -32px -128px; }
+.ui-icon-minus { background-position: -48px -128px; }
+.ui-icon-minusthick { background-position: -64px -128px; }
+.ui-icon-close { background-position: -80px -128px; }
+.ui-icon-closethick { background-position: -96px -128px; }
+.ui-icon-key { background-position: -112px -128px; }
+.ui-icon-lightbulb { background-position: -128px -128px; }
+.ui-icon-scissors { background-position: -144px -128px; }
+.ui-icon-clipboard { background-position: -160px -128px; }
+.ui-icon-copy { background-position: -176px -128px; }
+.ui-icon-contact { background-position: -192px -128px; }
+.ui-icon-image { background-position: -208px -128px; }
+.ui-icon-video { background-position: -224px -128px; }
+.ui-icon-script { background-position: -240px -128px; }
+.ui-icon-alert { background-position: 0 -144px; }
+.ui-icon-info { background-position: -16px -144px; }
+.ui-icon-notice { background-position: -32px -144px; }
+.ui-icon-help { background-position: -48px -144px; }
+.ui-icon-check { background-position: -64px -144px; }
+.ui-icon-bullet { background-position: -80px -144px; }
+.ui-icon-radio-off { background-position: -96px -144px; }
+.ui-icon-radio-on { background-position: -112px -144px; }
+.ui-icon-pin-w { background-position: -128px -144px; }
+.ui-icon-pin-s { background-position: -144px -144px; }
+.ui-icon-play { background-position: 0 -160px; }
+.ui-icon-pause { background-position: -16px -160px; }
+.ui-icon-seek-next { background-position: -32px -160px; }
+.ui-icon-seek-prev { background-position: -48px -160px; }
+.ui-icon-seek-end { background-position: -64px -160px; }
+.ui-icon-seek-start { background-position: -80px -160px; }
+/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */
+.ui-icon-seek-first { background-position: -80px -160px; }
+.ui-icon-stop { background-position: -96px -160px; }
+.ui-icon-eject { background-position: -112px -160px; }
+.ui-icon-volume-off { background-position: -128px -160px; }
+.ui-icon-volume-on { background-position: -144px -160px; }
+.ui-icon-power { background-position: 0 -176px; }
+.ui-icon-signal-diag { background-position: -16px -176px; }
+.ui-icon-signal { background-position: -32px -176px; }
+.ui-icon-battery-0 { background-position: -48px -176px; }
+.ui-icon-battery-1 { background-position: -64px -176px; }
+.ui-icon-battery-2 { background-position: -80px -176px; }
+.ui-icon-battery-3 { background-position: -96px -176px; }
+.ui-icon-circle-plus { background-position: 0 -192px; }
+.ui-icon-circle-minus { background-position: -16px -192px; }
+.ui-icon-circle-close { background-position: -32px -192px; }
+.ui-icon-circle-triangle-e { background-position: -48px -192px; }
+.ui-icon-circle-triangle-s { background-position: -64px -192px; }
+.ui-icon-circle-triangle-w { background-position: -80px -192px; }
+.ui-icon-circle-triangle-n { background-position: -96px -192px; }
+.ui-icon-circle-arrow-e { background-position: -112px -192px; }
+.ui-icon-circle-arrow-s { background-position: -128px -192px; }
+.ui-icon-circle-arrow-w { background-position: -144px -192px; }
+.ui-icon-circle-arrow-n { background-position: -160px -192px; }
+.ui-icon-circle-zoomin { background-position: -176px -192px; }
+.ui-icon-circle-zoomout { background-position: -192px -192px; }
+.ui-icon-circle-check { background-position: -208px -192px; }
+.ui-icon-circlesmall-plus { background-position: 0 -208px; }
+.ui-icon-circlesmall-minus { background-position: -16px -208px; }
+.ui-icon-circlesmall-close { background-position: -32px -208px; }
+.ui-icon-squaresmall-plus { background-position: -48px -208px; }
+.ui-icon-squaresmall-minus { background-position: -64px -208px; }
+.ui-icon-squaresmall-close { background-position: -80px -208px; }
+.ui-icon-grip-dotted-vertical { background-position: 0 -224px; }
+.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; }
+.ui-icon-grip-solid-vertical { background-position: -32px -224px; }
+.ui-icon-grip-solid-horizontal { background-position: -48px -224px; }
+.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; }
+.ui-icon-grip-diagonal-se { background-position: -80px -224px; }
+
+
+/* Misc visuals
+----------------------------------*/
+
+/* Corner radius */
+.ui-corner-tl { -moz-border-radius-topleft: 0; -webkit-border-top-left-radius: 0; }
+.ui-corner-tr { -moz-border-radius-topright: 0; -webkit-border-top-right-radius: 0; }
+.ui-corner-bl { -moz-border-radius-bottomleft: 0; -webkit-border-bottom-left-radius: 0; }
+.ui-corner-br { -moz-border-radius-bottomright: 0; -webkit-border-bottom-right-radius: 0; }
+.ui-corner-top { -moz-border-radius-topleft: 0; -webkit-border-top-left-radius: 0; -moz-border-radius-topright: 0; -webkit-border-top-right-radius: 0; }
+.ui-corner-bottom { -moz-border-radius-bottomleft: 0; -webkit-border-bottom-left-radius: 0; -moz-border-radius-bottomright: 0; -webkit-border-bottom-right-radius: 0; }
+.ui-corner-right {  -moz-border-radius-topright: 0; -webkit-border-top-right-radius: 0; -moz-border-radius-bottomright: 0; -webkit-border-bottom-right-radius: 0; }
+.ui-corner-left { -moz-border-radius-topleft: 0; -webkit-border-top-left-radius: 0; -moz-border-radius-bottomleft: 0; -webkit-border-bottom-left-radius: 0; }
+.ui-corner-all { -moz-border-radius: 0; -webkit-border-radius: 0; }
+
+/* Overlays */
+.ui-widget-overlay { background: #000000; opacity: .75;filter:Alpha(Opacity=75); }
+.ui-widget-shadow { margin: -7px 0 0 -7px; padding: 7px; /* @embed */ background: #000000 url(images/ui-bg_flat_70_000000_40x100.png) 50% 50% repeat-x; opacity: .20;filter:Alpha(Opacity=20); -moz-border-radius: 8px; -webkit-border-radius: 8px; border-radius: 8px; }
\ No newline at end of file
diff --git a/resources/src/jquery/images/jquery.arrowSteps.divider-ltr.png b/resources/src/jquery/images/jquery.arrowSteps.divider-ltr.png
new file mode 100644 (file)
index 0000000..84ed2a2
Binary files /dev/null and b/resources/src/jquery/images/jquery.arrowSteps.divider-ltr.png differ
diff --git a/resources/src/jquery/images/jquery.arrowSteps.divider-rtl.png b/resources/src/jquery/images/jquery.arrowSteps.divider-rtl.png
new file mode 100644 (file)
index 0000000..7cfbfeb
Binary files /dev/null and b/resources/src/jquery/images/jquery.arrowSteps.divider-rtl.png differ
diff --git a/resources/src/jquery/images/jquery.arrowSteps.head-ltr.png b/resources/src/jquery/images/jquery.arrowSteps.head-ltr.png
new file mode 100644 (file)
index 0000000..eb07028
Binary files /dev/null and b/resources/src/jquery/images/jquery.arrowSteps.head-ltr.png differ
diff --git a/resources/src/jquery/images/jquery.arrowSteps.head-rtl.png b/resources/src/jquery/images/jquery.arrowSteps.head-rtl.png
new file mode 100644 (file)
index 0000000..7ea2fdb
Binary files /dev/null and b/resources/src/jquery/images/jquery.arrowSteps.head-rtl.png differ
diff --git a/resources/src/jquery/images/jquery.arrowSteps.tail-ltr.png b/resources/src/jquery/images/jquery.arrowSteps.tail-ltr.png
new file mode 100644 (file)
index 0000000..3ad990b
Binary files /dev/null and b/resources/src/jquery/images/jquery.arrowSteps.tail-ltr.png differ
diff --git a/resources/src/jquery/images/jquery.arrowSteps.tail-rtl.png b/resources/src/jquery/images/jquery.arrowSteps.tail-rtl.png
new file mode 100644 (file)
index 0000000..1d3048e
Binary files /dev/null and b/resources/src/jquery/images/jquery.arrowSteps.tail-rtl.png differ
diff --git a/resources/src/jquery/images/marker.png b/resources/src/jquery/images/marker.png
new file mode 100644 (file)
index 0000000..19efb6c
Binary files /dev/null and b/resources/src/jquery/images/marker.png differ
diff --git a/resources/src/jquery/images/mask.png b/resources/src/jquery/images/mask.png
new file mode 100644 (file)
index 0000000..fe08de0
Binary files /dev/null and b/resources/src/jquery/images/mask.png differ
diff --git a/resources/src/jquery/images/sort_both.gif b/resources/src/jquery/images/sort_both.gif
new file mode 100644 (file)
index 0000000..50ad15a
Binary files /dev/null and b/resources/src/jquery/images/sort_both.gif differ
diff --git a/resources/src/jquery/images/sort_down.gif b/resources/src/jquery/images/sort_down.gif
new file mode 100644 (file)
index 0000000..ec4f41b
Binary files /dev/null and b/resources/src/jquery/images/sort_down.gif differ
diff --git a/resources/src/jquery/images/sort_none.gif b/resources/src/jquery/images/sort_none.gif
new file mode 100644 (file)
index 0000000..edd07e5
Binary files /dev/null and b/resources/src/jquery/images/sort_none.gif differ
diff --git a/resources/src/jquery/images/sort_up.gif b/resources/src/jquery/images/sort_up.gif
new file mode 100644 (file)
index 0000000..8018918
Binary files /dev/null and b/resources/src/jquery/images/sort_up.gif differ
diff --git a/resources/src/jquery/images/spinner-large.gif b/resources/src/jquery/images/spinner-large.gif
new file mode 100644 (file)
index 0000000..72203fd
Binary files /dev/null and b/resources/src/jquery/images/spinner-large.gif differ
diff --git a/resources/src/jquery/images/spinner.gif b/resources/src/jquery/images/spinner.gif
new file mode 100644 (file)
index 0000000..6146be4
Binary files /dev/null and b/resources/src/jquery/images/spinner.gif differ
diff --git a/resources/src/jquery/images/wheel.png b/resources/src/jquery/images/wheel.png
new file mode 100644 (file)
index 0000000..7e53103
Binary files /dev/null and b/resources/src/jquery/images/wheel.png differ
diff --git a/resources/src/jquery/jquery.arrowSteps.css b/resources/src/jquery/jquery.arrowSteps.css
new file mode 100644 (file)
index 0000000..f8f6e95
--- /dev/null
@@ -0,0 +1,45 @@
+.arrowSteps {
+       list-style-type: none;
+       list-style-image: none;
+       border: 1px solid #666666;
+       position: relative;
+}
+
+.arrowSteps li {
+       float: left;
+       padding: 0px;
+       margin: 0px;
+       border: 0 none;
+}
+
+.arrowSteps li div {
+       padding: 0.5em;
+       text-align: center;
+       white-space: nowrap;
+       overflow: hidden;
+}
+
+.arrowSteps li.arrow div {
+       /* @embed */
+       background: url(images/jquery.arrowSteps.divider-ltr.png) no-repeat right center;
+}
+
+/* applied to the element preceding the highlighted step */
+.arrowSteps li.arrow.tail div {
+       /* @embed */
+       background: url(images/jquery.arrowSteps.tail-ltr.png) no-repeat right center;
+}
+
+/* this applies to all highlighted, including the last */
+.arrowSteps li.head div {
+       /* @embed */
+       background: url(images/jquery.arrowSteps.head-ltr.png) no-repeat left center;
+       font-weight: bold;
+}
+
+/* this applies to all highlighted arrows except the last */
+.arrowSteps li.arrow.head div {
+       /* TODO: eliminate duplication of jquery.arrowSteps.head.png embedding */
+       /* @embed */
+       background: url(images/jquery.arrowSteps.head-ltr.png) no-repeat right center;
+}
diff --git a/resources/src/jquery/jquery.arrowSteps.js b/resources/src/jquery/jquery.arrowSteps.js
new file mode 100644 (file)
index 0000000..c44e7c5
--- /dev/null
@@ -0,0 +1,92 @@
+/*!
+ * jQuery arrowSteps plugin
+ * Copyright Neil Kandalgaonkar, 2010
+ *
+ * This work is licensed under the terms of the GNU General Public License,
+ * version 2 or later.
+ * (see http://www.fsf.org/licensing/licenses/gpl.html).
+ * Derivative works and later versions of the code must be free software
+ * licensed under the same or a compatible license.
+ */
+
+/**
+ * @class jQuery.plugin.arrowSteps
+ */
+( function ( $ ) {
+       /**
+        * Show users their progress through a series of steps, via a row of items that fit
+        * together like arrows. One item can be highlighted at a time.
+        *
+        *     <ul id="robin-hood-daffy">
+        *       <li id="guard"><div>Guard!</div></li>
+        *       <li id="turn"><div>Turn!</div></li>
+        *       <li id="parry"><div>Parry!</div></li>
+        *       <li id="dodge"><div>Dodge!</div></li>
+        *       <li id="spin"><div>Spin!</div></li>
+        *       <li id="ha"><div>Ha!</div></li>
+        *       <li id="thrust"><div>Thrust!</div></li>
+        *     </ul>
+        *
+        *     <script>
+        *       $( '#robin-hood-daffy' ).arrowSteps();
+        *     </script>
+        *
+        * @return {jQuery}
+        * @chainable
+        */
+       $.fn.arrowSteps = function () {
+               var $steps, width, arrowWidth,
+                       paddingSide = $( 'body' ).hasClass( 'rtl' ) ? 'padding-left' : 'padding-right';
+
+               this.addClass( 'arrowSteps' );
+               $steps = this.find( 'li' );
+
+               width = parseInt( 100 / $steps.length, 10 );
+               $steps.css( 'width', width + '%' );
+
+               // Every step except the last one has an arrow pointing forward:
+               // at the right hand side in LTR languages, and at the left hand side in RTL.
+               // Also add in the padding for the calculated arrow width.
+               arrowWidth = parseInt( this.outerHeight(), 10 );
+               $steps.filter( ':not(:last-child)' ).addClass( 'arrow' )
+                     .find( 'div' ).css( paddingSide, arrowWidth.toString() + 'px' );
+
+               this.data( 'arrowSteps', $steps );
+               return this;
+       };
+
+       /**
+        * Highlights the element selected by the selector.
+        *
+        *       $( '#robin-hood-daffy' ).arrowStepsHighlight( '#guard' );
+        *       // 'Guard!' is highlighted.
+        *
+        *       // ... user completes the 'guard' step ...
+        *
+        *       $( '#robin-hood-daffy' ).arrowStepsHighlight( '#turn' );
+        *       // 'Turn!' is highlighted.
+        *
+        * @param {string} selector
+        */
+       $.fn.arrowStepsHighlight = function ( selector ) {
+               var $previous,
+                       $steps = this.data( 'arrowSteps' );
+               $.each( $steps, function ( i, step ) {
+                       var $step = $( step );
+                       if ( $step.is( selector ) ) {
+                               if ($previous) {
+                                       $previous.addClass( 'tail' );
+                               }
+                               $step.addClass( 'head' );
+                       } else {
+                               $step.removeClass( 'head tail lasthead' );
+                       }
+                       $previous = $step;
+               } );
+       };
+
+       /**
+        * @class jQuery
+        * @mixins jQuery.plugin.arrowSteps
+        */
+}( jQuery ) );
diff --git a/resources/src/jquery/jquery.autoEllipsis.js b/resources/src/jquery/jquery.autoEllipsis.js
new file mode 100644 (file)
index 0000000..57d8f94
--- /dev/null
@@ -0,0 +1,168 @@
+/**
+ * @class jQuery.plugin.autoEllipsis
+ */
+( function ( $ ) {
+
+var
+       // Cache ellipsed substrings for every string-width-position combination
+       cache = {},
+
+       // Use a separate cache when match highlighting is enabled
+       matchTextCache = {};
+
+/**
+ * Automatically truncate the plain text contents of an element and add an ellipsis
+ *
+ * @param {Object} options
+ * @param {'center'|'left'|'right'} [options.position='center'] Where to remove text.
+ * @param {boolean} [options.tooltip=false] Whether to show a tooltip with the remainder
+ * of the text.
+ * @param {boolean} [options.restoreText=false] Whether to save the text for restoring
+ * later.
+ * @param {boolean} [options.hasSpan=false] Whether the element is already a container,
+ * or if the library should create a new container for it.
+ * @param {string|null} [options.matchText=null] Text to highlight, e.g. search terms.
+ * @return {jQuery}
+ * @chainable
+ */
+$.fn.autoEllipsis = function ( options ) {
+       options = $.extend( {
+               position: 'center',
+               tooltip: false,
+               restoreText: false,
+               hasSpan: false,
+               matchText: null
+       }, options );
+
+       return this.each( function () {
+               var $trimmableText,
+                       text, trimmableText, w, pw,
+                       l, r, i, side, m,
+                       // container element - used for measuring against
+                       $container = $(this);
+
+               if ( options.restoreText ) {
+                       if ( !$container.data( 'autoEllipsis.originalText' ) ) {
+                               $container.data( 'autoEllipsis.originalText', $container.text() );
+                       } else {
+                               $container.text( $container.data( 'autoEllipsis.originalText' ) );
+                       }
+               }
+
+               // trimmable text element - only the text within this element will be trimmed
+               if ( options.hasSpan ) {
+                       $trimmableText = $container.children( options.selector );
+               } else {
+                       $trimmableText = $( '<span>' )
+                               .css( 'whiteSpace', 'nowrap' )
+                               .text( $container.text() );
+                       $container
+                               .empty()
+                               .append( $trimmableText );
+               }
+
+               text = $container.text();
+               trimmableText = $trimmableText.text();
+               w = $container.width();
+               pw = 0;
+
+               // Try cache
+               if ( options.matchText ) {
+                       if ( !( text in matchTextCache ) ) {
+                               matchTextCache[text] = {};
+                       }
+                       if ( !( options.matchText in matchTextCache[text] ) ) {
+                               matchTextCache[text][options.matchText] = {};
+                       }
+                       if ( !( w in matchTextCache[text][options.matchText] ) ) {
+                               matchTextCache[text][options.matchText][w] = {};
+                       }
+                       if ( options.position in matchTextCache[text][options.matchText][w] ) {
+                               $container.html( matchTextCache[text][options.matchText][w][options.position] );
+                               if ( options.tooltip ) {
+                                       $container.attr( 'title', text );
+                               }
+                               return;
+                       }
+               } else {
+                       if ( !( text in cache ) ) {
+                               cache[text] = {};
+                       }
+                       if ( !( w in cache[text] ) ) {
+                               cache[text][w] = {};
+                       }
+                       if ( options.position in cache[text][w] ) {
+                               $container.html( cache[text][w][options.position] );
+                               if ( options.tooltip ) {
+                                       $container.attr( 'title', text );
+                               }
+                               return;
+                       }
+               }
+
+               if ( $trimmableText.width() + pw > w ) {
+                       switch ( options.position ) {
+                               case 'right':
+                                       // Use binary search-like technique for efficiency
+                                       l = 0;
+                                       r = trimmableText.length;
+                                       do {
+                                               m = Math.ceil( ( l + r ) / 2 );
+                                               $trimmableText.text( trimmableText.substr( 0, m ) + '...' );
+                                               if ( $trimmableText.width() + pw > w ) {
+                                                       // Text is too long
+                                                       r = m - 1;
+                                               } else {
+                                                       l = m;
+                                               }
+                                       } while ( l < r );
+                                       $trimmableText.text( trimmableText.substr( 0, l ) + '...' );
+                                       break;
+                               case 'center':
+                                       // TODO: Use binary search like for 'right'
+                                       i = [Math.round( trimmableText.length / 2 ), Math.round( trimmableText.length / 2 )];
+                                       // Begin with making the end shorter
+                                       side = 1;
+                                       while ( $trimmableText.outerWidth() + pw > w && i[0] > 0 ) {
+                                               $trimmableText.text( trimmableText.substr( 0, i[0] ) + '...' + trimmableText.substr( i[1] ) );
+                                               // Alternate between trimming the end and begining
+                                               if ( side === 0 ) {
+                                                       // Make the begining shorter
+                                                       i[0]--;
+                                                       side = 1;
+                                               } else {
+                                                       // Make the end shorter
+                                                       i[1]++;
+                                                       side = 0;
+                                               }
+                                       }
+                                       break;
+                               case 'left':
+                                       // TODO: Use binary search like for 'right'
+                                       r = 0;
+                                       while ( $trimmableText.outerWidth() + pw > w && r < trimmableText.length ) {
+                                               $trimmableText.text( '...' + trimmableText.substr( r ) );
+                                               r++;
+                                       }
+                                       break;
+                       }
+               }
+               if ( options.tooltip ) {
+                       $container.attr( 'title', text );
+               }
+               if ( options.matchText ) {
+                       $container.highlightText( options.matchText );
+                       matchTextCache[text][options.matchText][w][options.position] = $container.html();
+               } else {
+                       cache[text][w][options.position] = $container.html();
+               }
+
+       } );
+};
+
+/**
+ * @class jQuery
+ * @mixins jQuery.plugin.autoEllipsis
+ */
+
+}( jQuery ) );
diff --git a/resources/src/jquery/jquery.badge.css b/resources/src/jquery/jquery.badge.css
new file mode 100644 (file)
index 0000000..f313663
--- /dev/null
@@ -0,0 +1,37 @@
+.mw-badge {
+       min-width: 7px;
+       border-radius: 2px;
+       padding: 1px 4px;
+       text-align: center;
+       font-size: 12px;
+       line-height: 12px;
+       background-color: #d2d2d2;
+       cursor: pointer;
+}
+
+.mw-badge-content {
+       font-weight: bold;
+       color: white;
+       vertical-align: baseline;
+       text-shadow: 0 1px rgba(0, 0, 0, 0.4);
+}
+
+.mw-badge-inline {
+       margin-left: 3px;
+       display: inline-block;
+       /* Hack for IE6 and IE7 (bug 47926) */
+       zoom: 1;
+       *display: inline;
+
+}
+.mw-badge-overlay {
+       position: absolute;
+       bottom: -1px;
+       right: -3px;
+       z-index: 50;
+}
+
+.mw-badge-important {
+       background-color: #cc0000;
+}
+
diff --git a/resources/src/jquery/jquery.badge.js b/resources/src/jquery/jquery.badge.js
new file mode 100644 (file)
index 0000000..023b6e2
--- /dev/null
@@ -0,0 +1,88 @@
+/*!
+ * jQuery Badge plugin
+ *
+ * @license MIT
+ *
+ * @author Ryan Kaldari <rkaldari@wikimedia.org>, 2012
+ * @author Andrew Garrett <agarrett@wikimedia.org>, 2012
+ * @author Marius Hoch <hoo@online.de>, 2012
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * This program is distributed WITHOUT ANY WARRANTY.
+ */
+
+/**
+ * @class jQuery.plugin.badge
+ */
+( function ( $, mw ) {
+       /**
+        * Put a badge on an item on the page. The badge container will be appended to the selected element(s).
+        *
+        *     $element.badge( text );
+        *     $element.badge( 5 );
+        *     $element.badge( '100+' );
+        *     $element.badge( text, inline );
+        *     $element.badge( 'New', true );
+        *
+        * @param {number|string} text The value to display in the badge. If the value is falsey (0,
+        *  null, false, '', etc.), any existing badge will be removed.
+        * @param {boolean} [inline=true] True if the badge should be displayed inline, false
+        *  if the badge should overlay the parent element.
+        * @param {boolean} [displayZero=false] True if the number zero should be displayed,
+        *  false if the number zero should result in the badge being hidden
+        * @return {jQuery}
+        * @chainable
+        */
+       $.fn.badge = function ( text, inline, displayZero ) {
+               var $badge = this.find( '.mw-badge' ),
+                       badgeStyleClass = 'mw-badge-' + ( inline ? 'inline' : 'overlay' ),
+                       isImportant = true, displayBadge = true;
+
+               // If we're displaying zero, ensure style to be non-important
+               if ( mw.language.convertNumber( text, true ) === 0 ) {
+                       isImportant = false;
+                       if ( !displayZero ) {
+                               displayBadge = false;
+                       }
+               // If text is falsey (besides 0), hide the badge
+               } else if ( !text ) {
+                       displayBadge = false;
+               }
+
+               if ( displayBadge ) {
+                       // If a badge already exists, reuse it
+                       if ( $badge.length ) {
+                               $badge
+                                       .toggleClass( 'mw-badge-important', isImportant )
+                                       .find( '.mw-badge-content' )
+                                               .text( text );
+                       } else {
+                               // Otherwise, create a new badge with the specified text and style
+                               $badge = $( '<div class="mw-badge"></div>' )
+                                       .addClass( badgeStyleClass )
+                                       .toggleClass( 'mw-badge-important', isImportant )
+                                       .append(
+                                               $( '<span class="mw-badge-content"></span>' ).text( text )
+                                       )
+                                       .appendTo( this );
+                       }
+               } else {
+                       $badge.remove();
+               }
+               return this;
+       };
+
+       /**
+        * @class jQuery
+        * @mixins jQuery.plugin.badge
+        */
+}( jQuery, mediaWiki ) );
diff --git a/resources/src/jquery/jquery.byteLength.js b/resources/src/jquery/jquery.byteLength.js
new file mode 100644 (file)
index 0000000..398937e
--- /dev/null
@@ -0,0 +1,31 @@
+/**
+ * jQuery.byteLength
+ *
+ * Calculate the byte length of a string (accounting for UTF-8).
+ *
+ * @author Jan Paul Posma, 2011
+ * @author Timo Tijhof, 2012
+ * @author David Chan, 2013
+ */
+jQuery.byteLength = function ( str ) {
+
+       // This basically figures out how many bytes a UTF-16 string (which is what js sees)
+       // will take in UTF-8 by replacing a 2 byte character with 2 *'s, etc, and counting that.
+       // Note, surrogate (\uD800-\uDFFF) characters are counted as 2 bytes, since there's two of them
+       // and the actual character takes 4 bytes in UTF-8 (2*2=4). Might not work perfectly in
+       // edge cases such as illegal sequences, but that should never happen.
+
+       // https://en.wikipedia.org/wiki/UTF-8#Description
+       // The mapping from UTF-16 code units to UTF-8 bytes is as follows:
+       // > Range 0000-007F: codepoints that become 1 byte of UTF-8
+       // > Range 0080-07FF: codepoints that become 2 bytes of UTF-8
+       // > Range 0800-D7FF: codepoints that become 3 bytes of UTF-8
+       // > Range D800-DFFF: Surrogates (each pair becomes 4 bytes of UTF-8)
+       // > Range E000-FFFF: codepoints that become 3 bytes of UTF-8 (continued)
+
+       return str
+               .replace( /[\u0080-\u07FF\uD800-\uDFFF]/g, '**' )
+               .replace( /[\u0800-\uD7FF\uE000-\uFFFF]/g, '***' )
+               .length;
+
+};
diff --git a/resources/src/jquery/jquery.byteLimit.js b/resources/src/jquery/jquery.byteLimit.js
new file mode 100644 (file)
index 0000000..de05fdf
--- /dev/null
@@ -0,0 +1,235 @@
+/**
+ * @class jQuery.plugin.byteLimit
+ */
+( function ( $ ) {
+
+       /**
+        * Utility function to trim down a string, based on byteLimit
+        * and given a safe start position. It supports insertion anywhere
+        * in the string, so "foo" to "fobaro" if limit is 4 will result in
+        * "fobo", not "foba". Basically emulating the native maxlength by
+        * reconstructing where the insertion occurred.
+        *
+        * @private
+        * @param {string} safeVal Known value that was previously returned by this
+        * function, if none, pass empty string.
+        * @param {string} newVal New value that may have to be trimmed down.
+        * @param {number} byteLimit Number of bytes the value may be in size.
+        * @param {Function} [fn] See jQuery.byteLimit.
+        * @return {Object}
+        * @return {string} return.newVal
+        * @return {boolean} return.trimmed
+        */
+       function trimValForByteLength( safeVal, newVal, byteLimit, fn ) {
+               var startMatches, endMatches, matchesLen, inpParts,
+                       oldVal = safeVal;
+
+               // Run the hook if one was provided, but only on the length
+               // assessment. The value itself is not to be affected by the hook.
+               if ( $.byteLength( fn ? fn( newVal ) : newVal ) <= byteLimit ) {
+                       // Limit was not reached, just remember the new value
+                       // and let the user continue.
+                       return {
+                               newVal: newVal,
+                               trimmed: false
+                       };
+               }
+
+               // Current input is longer than the active limit.
+               // Figure out what was added and limit the addition.
+               startMatches = 0;
+               endMatches = 0;
+
+               // It is important that we keep the search within the range of
+               // the shortest string's length.
+               // Imagine a user adds text that matches the end of the old value
+               // (e.g. "foo" -> "foofoo"). startMatches would be 3, but without
+               // limiting both searches to the shortest length, endMatches would
+               // also be 3.
+               matchesLen = Math.min( newVal.length, oldVal.length );
+
+               // Count same characters from the left, first.
+               // (if "foo" -> "foofoo", assume addition was at the end).
+               while (
+                       startMatches < matchesLen &&
+                       oldVal.charAt( startMatches ) === newVal.charAt( startMatches )
+               ) {
+                       startMatches += 1;
+               }
+
+               while (
+                       endMatches < ( matchesLen - startMatches ) &&
+                       oldVal.charAt( oldVal.length - 1 - endMatches ) === newVal.charAt( newVal.length - 1 - endMatches )
+               ) {
+                       endMatches += 1;
+               }
+
+               inpParts = [
+                       // Same start
+                       newVal.substring( 0, startMatches ),
+                       // Inserted content
+                       newVal.substring( startMatches, newVal.length - endMatches ),
+                       // Same end
+                       newVal.substring( newVal.length - endMatches )
+               ];
+
+               // Chop off characters from the end of the "inserted content" string
+               // until the limit is statisfied.
+               if ( fn ) {
+                       // stop, when there is nothing to slice - bug 41450
+                       while ( $.byteLength( fn( inpParts.join( '' ) ) ) > byteLimit && inpParts[1].length > 0 ) {
+                               inpParts[1] = inpParts[1].slice( 0, -1 );
+                       }
+               } else {
+                       while ( $.byteLength( inpParts.join( '' ) ) > byteLimit ) {
+                               inpParts[1] = inpParts[1].slice( 0, -1 );
+                       }
+               }
+
+               newVal = inpParts.join( '' );
+
+               return {
+                       newVal: newVal,
+                       trimmed: true
+               };
+       }
+
+       var eventKeys = [
+               'keyup.byteLimit',
+               'keydown.byteLimit',
+               'change.byteLimit',
+               'mouseup.byteLimit',
+               'cut.byteLimit',
+               'paste.byteLimit',
+               'focus.byteLimit',
+               'blur.byteLimit'
+       ].join( ' ' );
+
+       /**
+        * Enforces a byte limit on an input field, so that UTF-8 entries are counted as well,
+        * when, for example, a database field has a byte limit rather than a character limit.
+        * Plugin rationale: Browser has native maxlength for number of characters, this plugin
+        * exists to limit number of bytes instead.
+        *
+        * Can be called with a custom limit (to use that limit instead of the maxlength attribute
+        * value), a filter function (in case the limit should apply to something other than the
+        * exact input value), or both. Order of parameters is important!
+        *
+        * @param {number} [limit] Limit to enforce, fallsback to maxLength-attribute,
+        *  called with fetched value as argument.
+        * @param {Function} [fn] Function to call on the string before assessing the length.
+        * @return {jQuery}
+        * @chainable
+        */
+       $.fn.byteLimit = function ( limit, fn ) {
+               // If the first argument is the function,
+               // set fn to the first argument's value and ignore the second argument.
+               if ( $.isFunction( limit ) ) {
+                       fn = limit;
+                       limit = undefined;
+               // Either way, verify it is a function so we don't have to call
+               // isFunction again after this.
+               } else if ( !fn || !$.isFunction( fn ) ) {
+                       fn = undefined;
+               }
+
+               // The following is specific to each element in the collection.
+               return this.each( function ( i, el ) {
+                       var $el, elLimit, prevSafeVal;
+
+                       $el = $( el );
+
+                       // If no limit was passed to byteLimit(), use the maxlength value.
+                       // Can't re-use 'limit' variable because it's in the higher scope
+                       // that would affect the next each() iteration as well.
+                       // Note that we use attribute to read the value instead of property,
+                       // because in Chrome the maxLength property by default returns the
+                       // highest supported value (no indication that it is being enforced
+                       // by choice). We don't want to bind all of this for some ridiculously
+                       // high default number, unless it was explicitly set in the HTML.
+                       // Also cast to a (primitive) number (most commonly because the maxlength
+                       // attribute contains a string, but theoretically the limit parameter
+                       // could be something else as well).
+                       elLimit = Number( limit === undefined ? $el.attr( 'maxlength' ) : limit );
+
+                       // If there is no (valid) limit passed or found in the property,
+                       // skip this. The < 0 check is required for Firefox, which returns
+                       // -1  (instead of undefined) for maxLength if it is not set.
+                       if ( !elLimit || elLimit < 0 ) {
+                               return;
+                       }
+
+                       if ( fn ) {
+                               // Save function for reference
+                               $el.data( 'byteLimit.callback', fn );
+                       }
+
+                       // Remove old event handlers (if there are any)
+                       $el.off( '.byteLimit' );
+
+                       if ( fn ) {
+                               // Disable the native maxLength (if there is any), because it interferes
+                               // with the (differently calculated) byte limit.
+                               // Aside from being differently calculated (average chars with byteLimit
+                               // is lower), we also support a callback which can make it to allow longer
+                               // values (e.g. count "Foo" from "User:Foo").
+                               // maxLength is a strange property. Removing or setting the property to
+                               // undefined directly doesn't work. Instead, it can only be unset internally
+                               // by the browser when removing the associated attribute (Firefox/Chrome).
+                               // http://code.google.com/p/chromium/issues/detail?id=136004
+                               $el.removeAttr( 'maxlength' );
+
+                       } else {
+                               // If we don't have a callback the bytelimit can only be lower than the charlimit
+                               // (that is, there are no characters less than 1 byte in size). So lets (re-)enforce
+                               // the native limit for efficiency when possible (it will make the while-loop below
+                               // faster by there being less left to interate over).
+                               $el.attr( 'maxlength', elLimit );
+                       }
+
+                       // Safe base value, used to determine the path between the previous state
+                       // and the state that triggered the event handler below - and enforce the
+                       // limit approppiately (e.g. don't chop from the end if text was inserted
+                       // at the beginning of the string).
+                       prevSafeVal = '';
+
+                       // We need to listen to after the change has already happened because we've
+                       // learned that trying to guess the new value and canceling the event
+                       // accordingly doesn't work because the new value is not always as simple as:
+                       // oldValue + String.fromCharCode( e.which ); because of cut, paste, select-drag
+                       // replacements, and custom input methods and what not.
+                       // Even though we only trim input after it was changed (never prevent it), we do
+                       // listen on events that input text, because there are cases where the text has
+                       // changed while text is being entered and keyup/change will not be fired yet
+                       // (such as holding down a single key, fires keydown, and after each keydown,
+                       // we can trim the previous one).
+                       // See http://www.w3.org/TR/DOM-Level-3-Events/#events-keyboard-event-order for
+                       // the order and characteristics of the key events.
+                       $el.on( eventKeys, function () {
+                               var res = trimValForByteLength(
+                                       prevSafeVal,
+                                       this.value,
+                                       elLimit,
+                                       fn
+                               );
+
+                               // Only set value property if it was trimmed, because whenever the
+                               // value property is set, the browser needs to re-initiate the text context,
+                               // which moves the cursor at the end the input, moving it away from wherever it was.
+                               // This is a side-effect of limiting after the fact.
+                               if ( res.trimmed === true ) {
+                                       this.value = res.newVal;
+                               }
+                               // Always adjust prevSafeVal to reflect the input value. Not doing this could cause
+                               // trimValForByteLength to compare the new value to an empty string instead of the
+                               // old value, resulting in trimming always from the end (bug 40850).
+                               prevSafeVal = res.newVal;
+                       } );
+               } );
+       };
+
+       /**
+        * @class jQuery
+        * @mixins jQuery.plugin.byteLimit
+        */
+}( jQuery ) );
diff --git a/resources/src/jquery/jquery.checkboxShiftClick.js b/resources/src/jquery/jquery.checkboxShiftClick.js
new file mode 100644 (file)
index 0000000..b206566
--- /dev/null
@@ -0,0 +1,35 @@
+/**
+ * jQuery checkboxShiftClick
+ *
+ * This will enable checkboxes to be checked or unchecked in a row by clicking one,
+ * holding shift and clicking another one.
+ *
+ * @author Timo Tijhof, 2011 - 2012
+ * @license GPL v2
+ */
+( function ( $ ) {
+       $.fn.checkboxShiftClick = function () {
+               var prevCheckbox = null,
+                       $box = this;
+               // When our boxes are clicked..
+               $box.click( function ( e ) {
+                       // And one has been clicked before...
+                       if ( prevCheckbox !== null && e.shiftKey ) {
+                               // Check or uncheck this one and all in-between checkboxes,
+                               // except for disabled ones
+                               $box
+                                       .slice(
+                                               Math.min( $box.index( prevCheckbox ), $box.index( e.target ) ),
+                                               Math.max( $box.index( prevCheckbox ), $box.index( e.target ) ) + 1
+                                       )
+                                       .filter( function () {
+                                               return !this.disabled;
+                                       } )
+                                       .prop( 'checked', !!e.target.checked );
+                       }
+                       // Either way, update the prevCheckbox variable to the one clicked now
+                       prevCheckbox = e.target;
+               } );
+               return $box;
+       };
+}( jQuery ) );
diff --git a/resources/src/jquery/jquery.client.js b/resources/src/jquery/jquery.client.js
new file mode 100644 (file)
index 0000000..6689b7c
--- /dev/null
@@ -0,0 +1,299 @@
+/**
+ * User-agent detection
+ */
+( function ( $ ) {
+
+       /* Private Members */
+
+       /**
+        * @var {Object} profileCache Keyed by userAgent string,
+        * value is the parsed $.client.profile object for that user agent.
+        */
+       var profileCache = {};
+
+       /* Public Methods */
+
+       $.client = {
+
+               /**
+                * Get an object containing information about the client.
+                *
+                * @param {Object} nav An object with atleast a 'userAgent' and 'platform' key.
+                * Defaults to the global Navigator object.
+                * @return {Object} The resulting client object will be in the following format:
+                *  {
+                *   'name': 'firefox',
+                *   'layout': 'gecko',
+                *   'layoutVersion': 20101026,
+                *   'platform': 'linux'
+                *   'version': '3.5.1',
+                *   'versionBase': '3',
+                *   'versionNumber': 3.5,
+                *  }
+                */
+               profile: function ( nav ) {
+                       /*jshint boss: true */
+
+                       if ( nav === undefined ) {
+                               nav = window.navigator;
+                       }
+
+                       // Use the cached version if possible
+                       if ( profileCache[ nav.userAgent + '|' + nav.platform ] !== undefined ) {
+                               return profileCache[ nav.userAgent + '|' + nav.platform ];
+                       }
+
+                       var
+                               versionNumber,
+                               key = nav.userAgent + '|' + nav.platform,
+
+                               /* Configuration */
+
+                               // Name of browsers or layout engines we don't recognize
+                               uk = 'unknown',
+                               // Generic version digit
+                               x = 'x',
+                               // Strings found in user agent strings that need to be conformed
+                               wildUserAgents = ['Opera', 'Navigator', 'Minefield', 'KHTML', 'Chrome', 'PLAYSTATION 3', 'Iceweasel'],
+                               // Translations for conforming user agent strings
+                               userAgentTranslations = [
+                                       // Tons of browsers lie about being something they are not
+                                       [/(Firefox|MSIE|KHTML,?\slike\sGecko|Konqueror)/, ''],
+                                       // Chrome lives in the shadow of Safari still
+                                       ['Chrome Safari', 'Chrome'],
+                                       // KHTML is the layout engine not the browser - LIES!
+                                       ['KHTML', 'Konqueror'],
+                                       // Firefox nightly builds
+                                       ['Minefield', 'Firefox'],
+                                       // This helps keep different versions consistent
+                                       ['Navigator', 'Netscape'],
+                                       // This prevents version extraction issues, otherwise translation would happen later
+                                       ['PLAYSTATION 3', 'PS3']
+                               ],
+                               // Strings which precede a version number in a user agent string - combined and used as
+                               // match 1 in version detection
+                               versionPrefixes = [
+                                       'camino', 'chrome', 'firefox', 'iceweasel', 'netscape', 'netscape6', 'opera', 'version', 'konqueror',
+                                       'lynx', 'msie', 'safari', 'ps3', 'android'
+                               ],
+                               // Used as matches 2, 3 and 4 in version extraction - 3 is used as actual version number
+                               versionSuffix = '(\\/|\\;?\\s|)([a-z0-9\\.\\+]*?)(\\;|dev|rel|\\)|\\s|$)',
+                               // Names of known browsers
+                               names = [
+                                       'camino', 'chrome', 'firefox', 'iceweasel', 'netscape', 'konqueror', 'lynx', 'msie', 'opera',
+                                       'safari', 'ipod', 'iphone', 'blackberry', 'ps3', 'rekonq', 'android'
+                               ],
+                               // Tanslations for conforming browser names
+                               nameTranslations = [],
+                               // Names of known layout engines
+                               layouts = ['gecko', 'konqueror', 'msie', 'trident', 'opera', 'webkit'],
+                               // Translations for conforming layout names
+                               layoutTranslations = [ ['konqueror', 'khtml'], ['msie', 'trident'], ['opera', 'presto'] ],
+                               // Names of supported layout engines for version number
+                               layoutVersions = ['applewebkit', 'gecko', 'trident'],
+                               // Names of known operating systems
+                               platforms = ['win', 'wow64', 'mac', 'linux', 'sunos', 'solaris', 'iphone'],
+                               // Translations for conforming operating system names
+                               platformTranslations = [ ['sunos', 'solaris'], ['wow64', 'win'] ],
+
+                               /* Methods */
+
+                               /**
+                                * Performs multiple replacements on a string
+                                */
+                               translate = function ( source, translations ) {
+                                       var i;
+                                       for ( i = 0; i < translations.length; i++ ) {
+                                               source = source.replace( translations[i][0], translations[i][1] );
+                                       }
+                                       return source;
+                               },
+
+                               /* Pre-processing */
+
+                               ua = nav.userAgent,
+                               match,
+                               name = uk,
+                               layout = uk,
+                               layoutversion = uk,
+                               platform = uk,
+                               version = x;
+
+                       if ( match = new RegExp( '(' + wildUserAgents.join( '|' ) + ')' ).exec( ua ) ) {
+                               // Takes a userAgent string and translates given text into something we can more easily work with
+                               ua = translate( ua, userAgentTranslations );
+                       }
+                       // Everything will be in lowercase from now on
+                       ua = ua.toLowerCase();
+
+                       /* Extraction */
+
+                       if ( match = new RegExp( '(' + names.join( '|' ) + ')' ).exec( ua ) ) {
+                               name = translate( match[1], nameTranslations );
+                       }
+                       if ( match = new RegExp( '(' + layouts.join( '|' ) + ')' ).exec( ua ) ) {
+                               layout = translate( match[1], layoutTranslations );
+                       }
+                       if ( match = new RegExp( '(' + layoutVersions.join( '|' ) + ')\\\/(\\d+)').exec( ua ) ) {
+                               layoutversion = parseInt( match[2], 10 );
+                       }
+                       if ( match = new RegExp( '(' + platforms.join( '|' ) + ')' ).exec( nav.platform.toLowerCase() ) ) {
+                               platform = translate( match[1], platformTranslations );
+                       }
+                       if ( match = new RegExp( '(' + versionPrefixes.join( '|' ) + ')' + versionSuffix ).exec( ua ) ) {
+                               version = match[3];
+                       }
+
+                       /* Edge Cases -- did I mention about how user agent string lie? */
+
+                       // Decode Safari's crazy 400+ version numbers
+                       if ( name === 'safari' && version > 400 ) {
+                               version = '2.0';
+                       }
+                       // Expose Opera 10's lies about being Opera 9.8
+                       if ( name === 'opera' && version >= 9.8 ) {
+                               match = ua.match( /\bversion\/([0-9\.]*)/ );
+                               if ( match && match[1] ) {
+                                       version = match[1];
+                               } else {
+                                       version = '10';
+                               }
+                       }
+                       // And Opera 15's lies about being Chrome
+                       if ( name === 'chrome' && ( match = ua.match( /\bopr\/([0-9\.]*)/ ) ) ) {
+                               if ( match[1] ) {
+                                       name = 'opera';
+                                       version = match[1];
+                               }
+                       }
+                       // And IE 11's lies about being not being IE
+                       if ( layout === 'trident' && layoutversion >= 7 && ( match = ua.match( /\brv[ :\/]([0-9\.]*)/ ) ) ) {
+                               if ( match[1] ) {
+                                       name = 'msie';
+                                       version = match[1];
+                               }
+                       }
+                       // And Amazon Silk's lies about being Android on mobile or Safari on desktop
+                       if ( match = ua.match( /\bsilk\/([0-9.\-_]*)/ ) ) {
+                               if ( match[1] ) {
+                                       name = 'silk';
+                                       version = match[1];
+                               }
+                       }
+
+                       versionNumber = parseFloat( version, 10 ) || 0.0;
+
+                       /* Caching */
+
+                       return profileCache[ key  ] = {
+                               name: name,
+                               layout: layout,
+                               layoutVersion: layoutversion,
+                               platform: platform,
+                               version: version,
+                               versionBase: ( version !== x ? Math.floor( versionNumber ).toString() : x ),
+                               versionNumber: versionNumber
+                       };
+               },
+
+               /**
+                * Checks the current browser against a support map object.
+                *
+                * Version numbers passed as numeric values will be compared like numbers (1.2 > 1.11).
+                * Version numbers passed as string values will be compared using a simple component-wise
+                * algorithm, similar to PHP's version_compare ('1.2' < '1.11').
+                *
+                * A browser map is in the following format:
+                * {
+                *   // Multiple rules with configurable operators
+                *   'msie': [['>=', 7], ['!=', 9]],
+                *    // Match no versions
+                *   'iphone': false,
+                *    // Match any version
+                *   'android': null
+                * }
+                *
+                * It can optionally be split into ltr/rtl sections:
+                * {
+                *   'ltr': {
+                *     'android': null,
+                *     'iphone': false
+                *   },
+                *   'rtl': {
+                *     'android': false,
+                *     // rules are not inherited from ltr
+                *     'iphone': false
+                *   }
+                * }
+                *
+                * @param {Object} map Browser support map
+                * @param {Object} [profile] A client-profile object
+                * @param {boolean} [exactMatchOnly=false] Only return true if the browser is matched, otherwise
+                * returns true if the browser is not found.
+                *
+                * @return {boolean} The current browser is in the support map
+                */
+               test: function ( map, profile, exactMatchOnly ) {
+                       /*jshint evil: true */
+
+                       var conditions, dir, i, op, val, j, pieceVersion, pieceVal, compare;
+                       profile = $.isPlainObject( profile ) ? profile : $.client.profile();
+                       if ( map.ltr && map.rtl ) {
+                               dir = $( 'body' ).is( '.rtl' ) ? 'rtl' : 'ltr';
+                               map = map[dir];
+                       }
+                       // Check over each browser condition to determine if we are running in a compatible client
+                       if ( typeof map !== 'object' || map[profile.name] === undefined ) {
+                               // Not found, return true if exactMatchOnly not set, false otherwise
+                               return !exactMatchOnly;
+                       }
+                       conditions = map[profile.name];
+                       if ( conditions === false ) {
+                               // Match no versions
+                               return false;
+                       }
+                       if ( conditions === null ) {
+                               // Match all versions
+                               return true;
+                       }
+                       for ( i = 0; i < conditions.length; i++ ) {
+                               op = conditions[i][0];
+                               val = conditions[i][1];
+                               if ( typeof val === 'string' ) {
+                                       // Perform a component-wise comparison of versions, similar to PHP's version_compare
+                                       // but simpler. '1.11' is larger than '1.2'.
+                                       pieceVersion = profile.version.toString().split( '.' );
+                                       pieceVal = val.split( '.' );
+                                       // Extend with zeroes to equal length
+                                       while ( pieceVersion.length < pieceVal.length ) {
+                                               pieceVersion.push( '0' );
+                                       }
+                                       while ( pieceVal.length < pieceVersion.length ) {
+                                               pieceVal.push( '0' );
+                                       }
+                                       // Compare components
+                                       compare = 0;
+                                       for ( j = 0; j < pieceVersion.length; j++ ) {
+                                               if ( Number( pieceVersion[j] ) < Number( pieceVal[j] ) ) {
+                                                       compare = -1;
+                                                       break;
+                                               } else if ( Number( pieceVersion[j] ) > Number( pieceVal[j] ) ) {
+                                                       compare = 1;
+                                                       break;
+                                               }
+                                       }
+                                       // compare will be -1, 0 or 1, depending on comparison result
+                                       if ( !( eval( '' + compare + op + '0' ) ) ) {
+                                               return false;
+                                       }
+                               } else if ( typeof val === 'number' ) {
+                                       if ( !( eval( 'profile.versionNumber' + op + val ) ) ) {
+                                               return false;
+                                       }
+                               }
+                       }
+
+                       return true;
+               }
+       };
+}( jQuery ) );
diff --git a/resources/src/jquery/jquery.color.js b/resources/src/jquery/jquery.color.js
new file mode 100644 (file)
index 0000000..04f8047
--- /dev/null
@@ -0,0 +1,55 @@
+/**
+ * jQuery Color Animations
+ *
+ * @author John Resig, 2007
+ * @author Krinkle, 2011
+ * Released under the MIT and GPL licenses.
+ *
+ * - 2011-01-05: Forked for MediaWiki. See also jQuery.colorUtil plugin
+ */
+( function ( $ ) {
+
+       function getColor( elem, attr ) {
+               /*jshint boss:true */
+               var color;
+
+               do {
+                       color = $.css( elem, attr );
+
+                       // Keep going until we find an element that has color, or we hit the body
+                       if ( color !== '' && color !== 'transparent' || $.nodeName( elem, 'body' ) ) {
+                               break;
+                       }
+
+                       attr = 'backgroundColor';
+               } while ( elem = elem.parentNode );
+
+               return $.colorUtil.getRGB( color );
+       }
+
+       // We override the animation for all of these color styles
+       $.each([
+               'backgroundColor',
+               'borderBottomColor',
+               'borderLeftColor',
+               'borderRightColor',
+               'borderTopColor',
+               'color',
+               'outlineColor'
+       ], function ( i, attr ) {
+               $.fx.step[attr] = function ( fx ) {
+                       if ( !fx.colorInit ) {
+                               fx.start = getColor( fx.elem, attr );
+                               fx.end = $.colorUtil.getRGB( fx.end );
+                               fx.colorInit = true;
+                       }
+
+                       fx.elem.style[attr] = 'rgb(' + [
+                               Math.max( Math.min( parseInt( (fx.pos * (fx.end[0] - fx.start[0])) + fx.start[0], 10 ), 255 ), 0 ),
+                               Math.max( Math.min( parseInt( (fx.pos * (fx.end[1] - fx.start[1])) + fx.start[1], 10 ), 255 ), 0 ),
+                               Math.max( Math.min( parseInt( (fx.pos * (fx.end[2] - fx.start[2])) + fx.start[2], 10 ), 255 ), 0 )
+                       ].join( ',' ) + ')';
+               };
+       } );
+
+}( jQuery ) );
diff --git a/resources/src/jquery/jquery.colorUtil.js b/resources/src/jquery/jquery.colorUtil.js
new file mode 100644 (file)
index 0000000..37bf176
--- /dev/null
@@ -0,0 +1,219 @@
+/**
+ * jQuery Color Utilities
+ * Written by Krinkle in 2011
+ * Released under the MIT and GPL licenses.
+ * Mostly based on other plugins and functions (linted and optimized a little).
+ * Sources cited inline.
+ */
+( function ( $ ) {
+       $.colorUtil = {
+
+               // Color Conversion function from highlightFade
+               // By Blair Mitchelmore
+               // http://jquery.offput.ca/highlightFade/
+               // Parse strings looking for color tuples [255,255,255]
+               getRGB: function ( color ) {
+                       /*jshint boss:true */
+                       var result;
+
+                       // Check if we're already dealing with an array of colors
+                       if ( color && $.isArray( color ) && color.length === 3 ) {
+                               return color;
+                       }
+
+                       // Look for rgb(num,num,num)
+                       if (result = /rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(color)) {
+                               return [parseInt(result[1],10), parseInt(result[2],10), parseInt(result[3],10)];
+                       }
+
+                       // Look for rgb(num%,num%,num%)
+                       if (result = /rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/.exec(color)) {
+                               return [parseFloat(result[1],10) * 2.55, parseFloat(result[2],10) * 2.55, parseFloat(result[3]) * 2.55];
+                       }
+
+                       // Look for #a0b1c2
+                       if (result = /#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(color)) {
+                               return [parseInt(result[1],16), parseInt(result[2],16), parseInt(result[3],16)];
+                       }
+
+                       // Look for #fff
+                       if (result = /#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(color)) {
+                               return [parseInt(result[1] + result[1],16), parseInt(result[2] + result[2],16), parseInt(result[3] + result[3],16)];
+                       }
+
+                       // Look for rgba(0, 0, 0, 0) == transparent in Safari 3
+                       if (result = /rgba\(0, 0, 0, 0\)/.exec(color)) {
+                               return $.colorUtil.colors.transparent;
+                       }
+
+                       // Otherwise, we're most likely dealing with a named color
+                       return $.colorUtil.colors[$.trim(color).toLowerCase()];
+               },
+
+               // Some named colors to work with
+               // From Interface by Stefan Petre
+               // http://interface.eyecon.ro/
+               colors: {
+                       aqua: [0,255,255],
+                       azure: [240,255,255],
+                       beige: [245,245,220],
+                       black: [0,0,0],
+                       blue: [0,0,255],
+                       brown: [165,42,42],
+                       cyan: [0,255,255],
+                       darkblue: [0,0,139],
+                       darkcyan: [0,139,139],
+                       darkgrey: [169,169,169],
+                       darkgreen: [0,100,0],
+                       darkkhaki: [189,183,107],
+                       darkmagenta: [139,0,139],
+                       darkolivegreen: [85,107,47],
+                       darkorange: [255,140,0],
+                       darkorchid: [153,50,204],
+                       darkred: [139,0,0],
+                       darksalmon: [233,150,122],
+                       darkviolet: [148,0,211],
+                       fuchsia: [255,0,255],
+                       gold: [255,215,0],
+                       green: [0,128,0],
+                       indigo: [75,0,130],
+                       khaki: [240,230,140],
+                       lightblue: [173,216,230],
+                       lightcyan: [224,255,255],
+                       lightgreen: [144,238,144],
+                       lightgrey: [211,211,211],
+                       lightpink: [255,182,193],
+                       lightyellow: [255,255,224],
+                       lime: [0,255,0],
+                       magenta: [255,0,255],
+                       maroon: [128,0,0],
+                       navy: [0,0,128],
+                       olive: [128,128,0],
+                       orange: [255,165,0],
+                       pink: [255,192,203],
+                       purple: [128,0,128],
+                       violet: [128,0,128],
+                       red: [255,0,0],
+                       silver: [192,192,192],
+                       white: [255,255,255],
+                       yellow: [255,255,0],
+                       transparent: [255,255,255]
+               },
+
+               /**
+                * http://mjijackson.com/2008/02/rgb-to-hsl-and-rgb-to-hsv-color-model-conversion-algorithms-in-javascript
+                * Converts an RGB color value to HSL. Conversion formula
+                * adapted from http://en.wikipedia.org/wiki/HSL_color_space.
+                * Assumes r, g, and b are contained in the set [0, 255] and
+                * returns h, s, and l in the set [0, 1].
+                *
+                * @param       Number  R               The red color value
+                * @param       Number  G               The green color value
+                * @param       Number  B               The blue color value
+                * @return      Array                   The HSL representation
+                */
+               rgbToHsl: function ( R, G, B ) {
+                       var d,
+                               r = R / 255,
+                               g = G / 255,
+                               b = B / 255,
+                               max = Math.max( r, g, b ), min = Math.min( r, g, b ),
+                               h,
+                               s,
+                               l = (max + min) / 2;
+
+                       if ( max === min ) {
+                               // achromatic
+                               h = s = 0;
+                       } else {
+                               d = max - min;
+                               s = l > 0.5 ? d / (2 - max - min) : d / (max + min);
+                               switch ( max ) {
+                                       case r:
+                                               h = (g - b) / d + (g < b ? 6 : 0);
+                                               break;
+                                       case g:
+                                               h = (b - r) / d + 2;
+                                               break;
+                                       case b:
+                                               h = (r - g) / d + 4;
+                                               break;
+                               }
+                               h /= 6;
+                       }
+
+                       return [h, s, l];
+               },
+
+               /**
+                * http://mjijackson.com/2008/02/rgb-to-hsl-and-rgb-to-hsv-color-model-conversion-algorithms-in-javascript
+                * Converts an HSL color value to RGB. Conversion formula
+                * adapted from http://en.wikipedia.org/wiki/HSL_color_space.
+                * Assumes h, s, and l are contained in the set [0, 1] and
+                * returns r, g, and b in the set [0, 255].
+                *
+                * @param       Number  h               The hue
+                * @param       Number  s               The saturation
+                * @param       Number  l               The lightness
+                * @return      Array                   The RGB representation
+                */
+               hslToRgb: function ( h, s, l ) {
+                       var r, g, b, hue2rgb, q, p;
+
+                       if ( s === 0 ) {
+                               r = g = b = l; // achromatic
+                       } else {
+                               hue2rgb = function ( p, q, t ) {
+                                       if ( t < 0 ) {
+                                               t += 1;
+                                       }
+                                       if ( t > 1 ) {
+                                               t -= 1;
+                                       }
+                                       if ( t < 1 / 6 ) {
+                                               return p + (q - p) * 6 * t;
+                                       }
+                                       if ( t < 1 / 2 ) {
+                                               return q;
+                                       }
+                                       if ( t < 2 / 3 ) {
+                                               return p + (q - p) * (2 / 3 - t) * 6;
+                                       }
+                                       return p;
+                               };
+
+                               q = l < 0.5 ? l * (1 + s) : l + s - l * s;
+                               p = 2 * l - q;
+                               r = hue2rgb( p, q, h + 1 / 3 );
+                               g = hue2rgb( p, q, h );
+                               b = hue2rgb( p, q, h - 1 / 3 );
+                       }
+
+                       return [r * 255, g * 255, b * 255];
+               },
+
+               /**
+                * Get's a brighter or darker rgb() value string.
+                *
+                * @author Krinkle
+                *
+                * @example     getCSSColorMod( 'red', +0.1 )
+                * @example     getCSSColorMod( 'rgb(200,50,50)', -0.2 )
+                *
+                * @param       Mixed   currentColor current value in css
+                * @param       Number  mod wanted brightness modification between -1 and 1
+                * @return      String 'rgb(r,g,b)'
+                */
+               getColorBrightness: function ( currentColor, mod ) {
+                       var rgbArr = $.colorUtil.getRGB( currentColor ),
+                               hslArr = $.colorUtil.rgbToHsl(rgbArr[0], rgbArr[1], rgbArr[2] );
+                       rgbArr = $.colorUtil.hslToRgb(hslArr[0], hslArr[1], hslArr[2] + mod);
+
+                       return 'rgb(' +
+                               [parseInt( rgbArr[0], 10), parseInt( rgbArr[1], 10 ), parseInt( rgbArr[2], 10 )].join( ',' ) +
+                               ')';
+               }
+
+       };
+
+}( jQuery ) );
diff --git a/resources/src/jquery/jquery.expandableField.js b/resources/src/jquery/jquery.expandableField.js
new file mode 100644 (file)
index 0000000..732cc6e
--- /dev/null
@@ -0,0 +1,140 @@
+/**
+ * This plugin provides functionality to expand a text box on focus to double it's current width
+ *
+ * Usage:
+ *
+ * Set options:
+ *             $('#textbox').expandableField( { option1: value1, option2: value2 } );
+ *             $('#textbox').expandableField( option, value );
+ * Get option:
+ *             value = $('#textbox').expandableField( option );
+ * Initialize:
+ *             $('#textbox').expandableField();
+ *
+ * Options:
+ *
+ */
+( function ( $ ) {
+
+       $.expandableField = {
+               /**
+                * Expand the field, make the callback
+                */
+               expandField: function ( e, context ) {
+                       context.config.beforeExpand.call( context.data.$field, context );
+                       context.data.$field
+                               .animate( { 'width': context.data.expandedWidth }, 'fast', function () {
+                                       context.config.afterExpand.call( this, context );
+                               } );
+               },
+               /**
+                * Condense the field, make the callback
+                */
+               condenseField: function ( e, context ) {
+                       context.config.beforeCondense.call( context.data.$field, context );
+                       context.data.$field
+                               .animate( { 'width': context.data.condensedWidth }, 'fast', function () {
+                                       context.config.afterCondense.call( this, context );
+                               } );
+               },
+               /**
+                * Sets the value of a property, and updates the widget accordingly
+                * @param property String Name of property
+                * @param value Mixed Value to set property with
+                */
+               configure: function ( context, property, value ) {
+                       // TODO: Validate creation using fallback values
+                       context.config[property] = value;
+               }
+
+       };
+
+       $.fn.expandableField = function () {
+
+               // Multi-context fields
+               var returnValue,
+                       args = arguments;
+
+               $( this ).each( function () {
+                       var key, context, timeout;
+
+                       /* Construction / Loading */
+
+                       context = $( this ).data( 'expandableField-context' );
+
+                       // TODO: Do we need to check both null and undefined?
+                       if ( context === undefined || context === null ) {
+                               context = {
+                                       config: {
+                                               // callback function for before collapse
+                                               beforeCondense: function () {},
+
+                                               // callback function for before expand
+                                               beforeExpand: function () {},
+
+                                               // callback function for after collapse
+                                               afterCondense: function () {},
+
+                                               // callback function for after expand
+                                               afterExpand: function () {},
+
+                                               // Whether the field should expand to the left or the right -- defaults to left
+                                               expandToLeft: true
+                                       }
+                               };
+                       }
+
+                       /* API */
+                       // Handle various calling styles
+                       if ( args.length > 0 ) {
+                               if ( typeof args[0] === 'object' ) {
+                                       // Apply set of properties
+                                       for ( key in args[0] ) {
+                                               $.expandableField.configure( context, key, args[0][key] );
+                                       }
+                               } else if ( typeof args[0] === 'string' ) {
+                                       if ( args.length > 1 ) {
+                                               // Set property values
+                                               $.expandableField.configure( context, args[0], args[1] );
+
+                                       // TODO: Do we need to check both null and undefined?
+                                       } else if ( returnValue === null || returnValue === undefined ) {
+                                               // Get property values, but don't give access to internal data - returns only the first
+                                               returnValue = ( args[0] in context.config ? undefined : context.config[args[0]] );
+                                       }
+                               }
+                       }
+
+                       /* Initialization */
+
+                       if ( context.data === undefined ) {
+                               context.data = {
+                                       // The width of the field in it's condensed state
+                                       condensedWidth: $( this ).width(),
+
+                                       // The width of the field in it's expanded state
+                                       expandedWidth: $( this ).width() * 2,
+
+                                       // Reference to the field
+                                       $field: $( this )
+                               };
+
+                               $( this )
+                                       .addClass( 'expandableField' )
+                                       .focus( function ( e ) {
+                                               clearTimeout( timeout );
+                                               $.expandableField.expandField( e, context );
+                                       } )
+                                       .blur( function ( e ) {
+                                               timeout = setTimeout( function () {
+                                                       $.expandableField.condenseField( e, context );
+                                               }, 250 );
+                                       } );
+                       }
+                       // Store the context for next time
+                       $( this ).data( 'expandableField-context', context );
+               } );
+               return returnValue !== undefined ? returnValue : $(this);
+       };
+
+}( jQuery ) );
diff --git a/resources/src/jquery/jquery.farbtastic.css b/resources/src/jquery/jquery.farbtastic.css
new file mode 100644 (file)
index 0000000..1c6428f
--- /dev/null
@@ -0,0 +1,54 @@
+/**
+ * Farbtastic Color Picker 1.2
+ * © 2008 Steven Wittens
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ */
+.farbtastic {
+       position: relative;
+}
+.farbtastic * {
+       position: absolute;
+       cursor: crosshair;
+}
+.farbtastic, .farbtastic .wheel {
+       width: 195px;
+       height: 195px;
+}
+.farbtastic .color, .farbtastic .overlay {
+       top: 47px;
+       left: 47px;
+       width: 101px;
+       height: 101px;
+}
+.farbtastic .wheel {
+       /* @embed */
+       background: url(images/wheel.png) no-repeat;
+       width: 195px;
+       height: 195px;
+}
+.farbtastic .overlay {
+       /* @embed */
+       background: url(images/mask.png) no-repeat;
+}
+.farbtastic .marker {
+       width: 17px;
+       height: 17px;
+       margin: -8px 0 0 -8px;
+       overflow: hidden;
+       /* @embed */
+       background: url(images/marker.png) no-repeat;
+}
+
diff --git a/resources/src/jquery/jquery.farbtastic.js b/resources/src/jquery/jquery.farbtastic.js
new file mode 100644 (file)
index 0000000..1881085
--- /dev/null
@@ -0,0 +1,286 @@
+/**
+ * Farbtastic Color Picker 1.2
+ * © 2008 Steven Wittens
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ */
+
+//Adapted to uniform style with jQuery UI widgets and slightly change behavior
+//TODO:
+// - remove duplicated code by replacing it with jquery.colorUtils and modern jQuery
+// - uniform code style
+
+jQuery.fn.farbtastic = function (callback) {
+       $.farbtastic(this, callback);
+       return this;
+};
+
+jQuery.farbtastic = function (container, callback) {
+       var container = $(container).get(0);
+       return container.farbtastic || (container.farbtastic = new jQuery._farbtastic(container, callback));
+}
+
+jQuery._farbtastic = function (container, callback) {
+       // Store farbtastic object
+       var fb = this;
+
+       // Insert markup
+       $(container).html('<div class="farbtastic ui-widget-content"><div class="color"></div><div class="wheel"></div><div class="overlay"></div><div class="h-marker marker"></div><div class="sl-marker marker"></div></div>');
+       $(container).addClass('ui-widget');
+       var e = $('.farbtastic', container);
+       fb.wheel = $('.wheel', container).get(0);
+       // Dimensions
+       fb.radius = 84;
+       fb.square = 100;
+       fb.width = 194;
+
+       // Fix background PNGs in IE6
+       if (navigator.appVersion.match(/MSIE [0-6]\./)) {
+               $('*', e).each(function () {
+                       if (this.currentStyle.backgroundImage != 'none') {
+                               var image = this.currentStyle.backgroundImage;
+                               image = this.currentStyle.backgroundImage.substring(5, image.length - 2);
+                               $(this).css({
+                                       'backgroundImage': 'none',
+                                       'filter': "progid:DXImageTransform.Microsoft.AlphaImageLoader(enabled=true, sizingMethod=crop, src='" + image + "')"
+                               });
+                       }
+               });
+       }
+
+       /**
+        * Link to the given element(s) or callback.
+        */
+       fb.linkTo = function (callback) {
+               // Unbind previous nodes
+               if (typeof fb.callback == 'object') {
+                       $(fb.callback).unbind('keyup', fb.updateValue);
+               }
+
+               // Reset color
+               fb.color = null;
+
+               // Bind callback or elements
+               if (typeof callback == 'function') {
+                       fb.callback = callback;
+               }
+               else if (typeof callback == 'object' || typeof callback == 'string') {
+                       fb.callback = $(callback);
+                       fb.callback.bind('keyup', fb.updateValue);
+                       if (fb.callback.get(0).value) {
+                               fb.setColor(fb.callback.get(0).value);
+                       }
+               }
+               return this;
+       }
+       fb.updateValue = function (event) {
+               if (this.value != fb.color) {
+                       fb.setColor(this.value);
+               }
+       }
+
+       /**
+        * Change color with HTML syntax #123456
+        */
+       fb.setColor = function (color) {
+               var rgb = $.colorUtil.getRGB( color );
+               if (fb.color != color && rgb) {
+                       rgb = rgb.slice( 0 ); //make a clone
+                       //TODO: rewrite code so that this is not needed
+                       rgb[0] /= 255;
+                       rgb[1] /= 255;
+                       rgb[2] /= 255;
+                       fb.color = color;
+                       fb.rgb = rgb;
+                       fb.hsl = fb.RGBToHSL(fb.rgb);
+                       fb.updateDisplay();
+               }
+               return this;
+       }
+
+       /**
+        * Change color with HSL triplet [0..1, 0..1, 0..1]
+        */
+       fb.setHSL = function (hsl) {
+               fb.hsl = hsl;
+               fb.rgb = fb.HSLToRGB(hsl);
+               fb.color = fb.pack(fb.rgb);
+               fb.updateDisplay();
+               return this;
+       }
+
+       /////////////////////////////////////////////////////
+
+       /**
+        * Retrieve the coordinates of the given event relative to the center
+        * of the widget.
+        */
+       fb.widgetCoords = function (event) {
+               var ref = $( fb.wheel ).offset();
+               return {
+                       x: event.pageX - ref.left - fb.width / 2,
+                       y: event.pageY - ref.top - fb.width / 2
+               };
+       }
+
+       /**
+        * Mousedown handler
+        */
+       fb.mousedown = function (event) {
+               // Capture mouse
+               if (!document.dragging) {
+                       $(document).bind('mousemove', fb.mousemove).bind('mouseup', fb.mouseup);
+                       document.dragging = true;
+               }
+
+               // Check which area is being dragged
+               var pos = fb.widgetCoords(event);
+               fb.circleDrag = Math.max(Math.abs(pos.x), Math.abs(pos.y)) * 2 > fb.square;
+
+               // Process
+               fb.mousemove(event);
+               return false;
+       }
+
+       /**
+        * Mousemove handler
+        */
+       fb.mousemove = function (event) {
+               // Get coordinates relative to color picker center
+               var pos = fb.widgetCoords(event);
+
+               // Set new HSL parameters
+               if (fb.circleDrag) {
+                       var hue = Math.atan2(pos.x, -pos.y) / 6.28;
+                       if (hue < 0) hue += 1;
+                       fb.setHSL([hue, fb.hsl[1], fb.hsl[2]]);
+               }
+               else {
+                       var sat = Math.max(0, Math.min(1, -(pos.x / fb.square) + .5));
+                       var lum = Math.max(0, Math.min(1, -(pos.y / fb.square) + .5));
+                       fb.setHSL([fb.hsl[0], sat, lum]);
+               }
+               return false;
+       }
+
+       /**
+        * Mouseup handler
+        */
+       fb.mouseup = function () {
+               // Uncapture mouse
+               $(document).unbind('mousemove', fb.mousemove);
+               $(document).unbind('mouseup', fb.mouseup);
+               document.dragging = false;
+       }
+
+       /**
+        * Update the markers and styles
+        */
+       fb.updateDisplay = function () {
+               // Markers
+               var angle = fb.hsl[0] * 6.28;
+               $('.h-marker', e).css({
+                       left: Math.round(Math.sin(angle) * fb.radius + fb.width / 2) + 'px',
+                       top: Math.round(-Math.cos(angle) * fb.radius + fb.width / 2) + 'px'
+               });
+
+               $('.sl-marker', e).css({
+                       left: Math.round(fb.square * (.5 - fb.hsl[1]) + fb.width / 2) + 'px',
+                       top: Math.round(fb.square * (.5 - fb.hsl[2]) + fb.width / 2) + 'px'
+               });
+
+               // Saturation/Luminance gradient
+               $('.color', e).css('backgroundColor', fb.pack(fb.HSLToRGB([fb.hsl[0], 1, 0.5])));
+
+               // Linked elements or callback
+               if (typeof fb.callback == 'object') {
+                       // Set background/foreground color
+                       $(fb.callback).css({
+                               backgroundColor: fb.color,
+                               color: fb.hsl[2] > 0.5 ? '#000' : '#fff'
+                       });
+
+                       // Change linked value
+                       $(fb.callback).each(function() {
+                               if ( $( this ).val() != fb.color) {
+                                       $( this ).val( fb.color ).change();
+                               }
+                       });
+               }
+               else if (typeof fb.callback == 'function') {
+                       fb.callback.call(fb, fb.color);
+               }
+       }
+
+       /* Various color utility functions */
+       fb.pack = function (rgb) {
+               var r = Math.round(rgb[0] * 255);
+               var g = Math.round(rgb[1] * 255);
+               var b = Math.round(rgb[2] * 255);
+               return '#' + (r < 16 ? '0' : '') + r.toString(16) +
+                                        (g < 16 ? '0' : '') + g.toString(16) +
+                                        (b < 16 ? '0' : '') + b.toString(16);
+       }
+
+       fb.HSLToRGB = function (hsl) {
+               var m1, m2, r, g, b;
+               var h = hsl[0], s = hsl[1], l = hsl[2];
+               m2 = (l <= 0.5) ? l * (s + 1) : l + s - l*s;
+               m1 = l * 2 - m2;
+               return [this.hueToRGB(m1, m2, h+0.33333),
+                               this.hueToRGB(m1, m2, h),
+                               this.hueToRGB(m1, m2, h-0.33333)];
+       }
+
+       fb.hueToRGB = function (m1, m2, h) {
+               h = (h < 0) ? h + 1 : ((h > 1) ? h - 1 : h);
+               if (h * 6 < 1) return m1 + (m2 - m1) * h * 6;
+               if (h * 2 < 1) return m2;
+               if (h * 3 < 2) return m1 + (m2 - m1) * (0.66666 - h) * 6;
+               return m1;
+       }
+
+       fb.RGBToHSL = function (rgb) {
+               var min, max, delta, h, s, l;
+               var r = rgb[0], g = rgb[1], b = rgb[2];
+               min = Math.min(r, Math.min(g, b));
+               max = Math.max(r, Math.max(g, b));
+               delta = max - min;
+               l = (min + max) / 2;
+               s = 0;
+               if (l > 0 && l < 1) {
+                       s = delta / (l < 0.5 ? (2 * l) : (2 - 2 * l));
+               }
+               h = 0;
+               if (delta > 0) {
+                       if (max == r && max != g) h += (g - b) / delta;
+                       if (max == g && max != b) h += (2 + (b - r) / delta);
+                       if (max == b && max != r) h += (4 + (r - g) / delta);
+                       h /= 6;
+               }
+               return [h, s, l];
+       }
+
+       // Install mousedown handler (the others are set on the document on-demand)
+       $('*', e).mousedown(fb.mousedown);
+
+               // Init color
+       fb.setColor('#000000');
+
+       // Set linked elements/callback
+       if (callback) {
+               fb.linkTo(callback);
+       }
+}
diff --git a/resources/src/jquery/jquery.footHovzer.css b/resources/src/jquery/jquery.footHovzer.css
new file mode 100644 (file)
index 0000000..77d9514
--- /dev/null
@@ -0,0 +1,6 @@
+#jquery-foot-hovzer {
+       position: fixed;
+       bottom: 0;
+       width: 100%;
+       z-index: 1000;
+}
diff --git a/resources/src/jquery/jquery.footHovzer.js b/resources/src/jquery/jquery.footHovzer.js
new file mode 100644 (file)
index 0000000..56fc32d
--- /dev/null
@@ -0,0 +1,45 @@
+/**
+ * Utility to stack stuff in an overlay fixed on the bottom of the page.
+ *
+ * Usage:
+ * <code>
+ *     var hovzer = $.getFootHovzer();
+ *     hovzer.$.append( $myCollection );
+ *     hovzer.update();
+ * </code>
+ *
+ * @author Timo Tijhof, 2012
+ */
+( function ( $ ) {
+       var $hovzer, footHovzer, prevHeight, newHeight;
+
+       function getHovzer() {
+               if ( $hovzer === undefined ) {
+                       $hovzer = $( '<div id="jquery-foot-hovzer"></div>' ).appendTo( 'body' );
+               }
+               return $hovzer;
+       }
+
+       footHovzer = {
+               update: function () {
+                       var $body;
+
+                       $body = $( 'body' );
+                       if ( prevHeight === undefined ) {
+                               prevHeight = getHovzer().outerHeight( /*includeMargin=*/true );
+                               $body.css( 'paddingBottom', '+=' + prevHeight + 'px' );
+                       } else {
+                               newHeight = getHovzer().outerHeight( true );
+                               $body.css( 'paddingBottom', ( parseFloat( $body.css( 'paddingBottom' ) ) - prevHeight ) + newHeight );
+
+                               prevHeight = newHeight;
+                       }
+               }
+       };
+
+       $.getFootHovzer = function () {
+               footHovzer.$ = getHovzer();
+               return footHovzer;
+       };
+
+}( jQuery ) );
diff --git a/resources/src/jquery/jquery.getAttrs.js b/resources/src/jquery/jquery.getAttrs.js
new file mode 100644 (file)
index 0000000..25b806b
--- /dev/null
@@ -0,0 +1,24 @@
+/**
+ * Utility to get all attributes of an element directy as an object.
+ *
+ * @author Timo Tijhof, 2011
+ */
+jQuery.fn.getAttrs = function ( all ) {
+       var map = this[0].attributes,
+               attrs = {},
+               len = map.length,
+               i, v;
+
+       for ( i = 0; i < len; i++ ) {
+               // IE6 includes *all* allowed attributes for thew element (including those
+               // not set). Those have values like undefined, null, 0, false, "" or "inherit".
+               // However there may be genuine attributes set to that. If you need them,
+               // set all to true. They are excluded by default.
+               v = map[i].nodeValue;
+               if ( all || ( v && v !== 'inherit' ) ) {
+                       attrs[ map[i].nodeName ] = v;
+               }
+       }
+
+       return attrs;
+};
diff --git a/resources/src/jquery/jquery.hidpi.js b/resources/src/jquery/jquery.hidpi.js
new file mode 100644 (file)
index 0000000..eb29db9
--- /dev/null
@@ -0,0 +1,115 @@
+/**
+ * Responsive images based on 'srcset' and 'window.devicePixelRatio' emulation where needed.
+ *
+ * Call $().hidpi() on a document or part of a document to replace image srcs in that section.
+ *
+ * $.devicePixelRatio() can be used to supplement window.devicePixelRatio with support on
+ * some additional browsers.
+ */
+( function ( $ ) {
+
+/**
+ * Detect reported or approximate device pixel ratio.
+ * 1.0 means 1 CSS pixel is 1 hardware pixel
+ * 2.0 means 1 CSS pixel is 2 hardware pixels
+ * etc
+ *
+ * Uses window.devicePixelRatio if available, or CSS media queries on IE.
+ *
+ * @return {number} Device pixel ratio
+ */
+$.devicePixelRatio = function () {
+       if ( window.devicePixelRatio !== undefined ) {
+               // Most web browsers:
+               // * WebKit (Safari, Chrome, Android browser, etc)
+               // * Opera
+               // * Firefox 18+
+               return window.devicePixelRatio;
+       } else if ( window.msMatchMedia !== undefined ) {
+               // Windows 8 desktops / tablets, probably Windows Phone 8
+               //
+               // IE 10 doesn't report pixel ratio directly, but we can get the
+               // screen DPI and divide by 96. We'll bracket to [1, 1.5, 2.0] for
+               // simplicity, but you may get different values depending on zoom
+               // factor, size of screen and orientation in Metro IE.
+               if ( window.msMatchMedia( '(min-resolution: 192dpi)' ).matches ) {
+                       return 2;
+               } else if ( window.msMatchMedia( '(min-resolution: 144dpi)' ).matches ) {
+                       return 1.5;
+               } else {
+                       return 1;
+               }
+       } else {
+               // Legacy browsers...
+               // Assume 1 if unknown.
+               return 1;
+       }
+};
+
+/**
+ * Implement responsive images based on srcset attributes, if browser has no
+ * native srcset support.
+ *
+ * @return {jQuery} This selection
+ */
+$.fn.hidpi = function () {
+       var $target = this,
+               // @todo add support for dpi media query checks on Firefox, IE
+               devicePixelRatio = $.devicePixelRatio(),
+               testImage = new Image();
+
+       if ( devicePixelRatio > 1 && testImage.srcset === undefined ) {
+               // No native srcset support.
+               $target.find( 'img' ).each( function () {
+                       var $img = $( this ),
+                               srcset = $img.attr( 'srcset' ),
+                               match;
+                       if ( typeof srcset === 'string' && srcset !== '' ) {
+                               match = $.matchSrcSet( devicePixelRatio, srcset );
+                               if (match !== null ) {
+                                       $img.attr( 'src', match );
+                               }
+                       }
+               });
+       }
+
+       return $target;
+};
+
+/**
+ * Match a srcset entry for the given device pixel ratio
+ *
+ * Exposed for testing.
+ *
+ * @param {number} devicePixelRatio
+ * @param {string} srcset
+ * @return {mixed} null or the matching src string
+ */
+$.matchSrcSet = function ( devicePixelRatio, srcset ) {
+       var candidates,
+               candidate,
+               bits,
+               src,
+               i,
+               ratioStr,
+               ratio,
+               selectedRatio = 1,
+               selectedSrc = null;
+       candidates = srcset.split( / *, */ );
+       for ( i = 0; i < candidates.length; i++ ) {
+               candidate = candidates[i];
+               bits = candidate.split( / +/ );
+               src = bits[0];
+               if ( bits.length > 1 && bits[1].charAt( bits[1].length - 1 ) === 'x' ) {
+                       ratioStr = bits[1].substr( 0, bits[1].length - 1 );
+                       ratio = parseFloat( ratioStr );
+                       if ( ratio <= devicePixelRatio && ratio > selectedRatio ) {
+                               selectedRatio = ratio;
+                               selectedSrc = src;
+                       }
+               }
+       }
+       return selectedSrc;
+};
+
+}( jQuery ) );
diff --git a/resources/src/jquery/jquery.highlightText.js b/resources/src/jquery/jquery.highlightText.js
new file mode 100644 (file)
index 0000000..0408151
--- /dev/null
@@ -0,0 +1,68 @@
+/**
+ * Plugin that highlights matched word partials in a given element.
+ * TODO: Add a function for restoring the previous text.
+ * TODO: Accept mappings for converting shortcuts like WP: to Wikipedia:.
+ */
+( function ( $ ) {
+
+       $.highlightText = {
+
+               // Split our pattern string at spaces and run our highlight function on the results
+               splitAndHighlight: function ( node, pat ) {
+                       var i,
+                               patArray = pat.split( ' ' );
+                       for ( i = 0; i < patArray.length; i++ ) {
+                               if ( patArray[i].length === 0 ) {
+                                       continue;
+                               }
+                               $.highlightText.innerHighlight( node, patArray[i] );
+                       }
+                       return node;
+               },
+
+               // scans a node looking for the pattern and wraps a span around each match
+               innerHighlight: function ( node, pat ) {
+                       var i, match, pos, spannode, middlebit, middleclone;
+                       // if this is a text node
+                       if ( node.nodeType === 3 ) {
+                               // TODO - need to be smarter about the character matching here.
+                               // non latin characters can make regex think a new word has begun: do not use \b
+                               // http://stackoverflow.com/questions/3787072/regex-wordwrap-with-utf8-characters-in-js
+                               // look for an occurrence of our pattern and store the starting position
+                               match = node.data.match( new RegExp( '(^|\\s)' + $.escapeRE( pat ), 'i' ) );
+                               if ( match ) {
+                                       pos = match.index + match[1].length; // include length of any matched spaces
+                                       // create the span wrapper for the matched text
+                                       spannode = document.createElement( 'span' );
+                                       spannode.className = 'highlight';
+                                       // shave off the characters preceding the matched text
+                                       middlebit = node.splitText( pos );
+                                       // shave off any unmatched text off the end
+                                       middlebit.splitText( pat.length );
+                                       // clone for appending to our span
+                                       middleclone = middlebit.cloneNode( true );
+                                       // append the matched text node to the span
+                                       spannode.appendChild( middleclone );
+                                       // replace the matched node, with our span-wrapped clone of the matched node
+                                       middlebit.parentNode.replaceChild( spannode, middlebit );
+                               }
+                       // if this is an element with childnodes, and not a script, style or an element we created
+                       } else if ( node.nodeType === 1 && node.childNodes && !/(script|style)/i.test( node.tagName )
+                                       && !( node.tagName.toLowerCase() === 'span' && node.className.match( /\bhighlight/ ) ) ) {
+                               for ( i = 0; i < node.childNodes.length; ++i ) {
+                                       // call the highlight function for each child node
+                                       $.highlightText.innerHighlight( node.childNodes[i], pat );
+                               }
+                       }
+               }
+       };
+
+       $.fn.highlightText = function ( matchString ) {
+               return this.each( function () {
+                       var $el = $( this );
+                       $el.data( 'highlightText', { originalText: $el.text() } );
+                       $.highlightText.splitAndHighlight( this, matchString );
+               } );
+       };
+
+}( jQuery ) );
diff --git a/resources/src/jquery/jquery.localize.js b/resources/src/jquery/jquery.localize.js
new file mode 100644 (file)
index 0000000..f499e10
--- /dev/null
@@ -0,0 +1,170 @@
+/**
+ * @class jQuery.plugin.localize
+ */
+( function ( $, mw ) {
+
+/**
+ * Gets a localized message, using parameters from options if present.
+ * @ignore
+ *
+ * @param {Object} options
+ * @param {string} key
+ * @return {string} Localized message
+ */
+function msg( options, key ) {
+       var args = options.params[key] || [];
+       // Format: mw.msg( key [, p1, p2, ...] )
+       args.unshift( options.prefix + ( options.keys[key] || key ) );
+       return mw.msg.apply( mw, args );
+}
+
+/**
+ * Localizes a DOM selection by replacing <html:msg /> elements with localized text and adding
+ * localized title and alt attributes to elements with title-msg and alt-msg attributes
+ * respectively.
+ *
+ * Call on a selection of HTML which contains `<html:msg key="message-key" />` elements or elements
+ * with title-msg="message-key", alt-msg="message-key" or placeholder-msg="message-key" attributes.
+ * `<html:msg />` elements will be replaced with localized text, *-msg attributes will be replaced
+ * with attributes that do not have the "-msg" suffix and contain a localized message.
+ *
+ * Example:
+ *     // Messages: { 'title': 'Awesome', 'desc': 'Cat doing backflip' 'search' contains 'Search' }
+ *     var html = '\
+ *         <p>\
+ *             <html:msg key="title" />\
+ *             <img src="something.jpg" title-msg="title" alt-msg="desc" />\
+ *             <input type="text" placeholder-msg="search" />\
+ *         </p>';
+ *     $( 'body' ).append( $( html ).localize() );
+ *
+ * Appends something like this to the body...
+ *     <p>
+ *         Awesome
+ *         <img src="something.jpg" title="Awesome" alt="Cat doing backflip" />
+ *         <input type="text" placeholder="Search" />
+ *     </p>
+ *
+ * Arguments can be passed into uses of a message using the params property of the options object
+ * given to .localize(). Multiple messages can be given parameters, because the params property is
+ * an object keyed by the message key to apply the parameters to, each containing an array of
+ * parameters to use. The limitation is that you can not use different parameters to individual uses
+ * of a message in the same selection being localized - they will all recieve the same parameters.
+ *
+ * Example:
+ *     // Messages: { 'easy-as': 'Easy as $1 $2 $3.' }
+ *     var html = '<p><html:msg key="easy-as" /></p>';
+ *     $( 'body' ).append( $( html ).localize( { 'params': { 'easy-as': ['a', 'b', 'c'] } } ) );
+ *
+ * Appends something like this to the body...
+ *     <p>Easy as a, b, c</p>
+ *
+ * Raw HTML content can be used, instead of it being escaped as text. To do this, just use the raw
+ * attribute on a msg element.
+ *
+ * Example:
+ *     // Messages: { 'hello': '<b><i>Hello</i> $1!</b>' }
+ *     var html = '\
+ *         <p>\
+ *             <!-- escaped: --><html:msg key="hello" />\
+ *             <!-- raw: --><html:msg key="hello" raw />\
+ *         </p>';
+ *     $( 'body' ).append( $( html ).localize( { 'params': { 'hello': ['world'] } } ) );
+ *
+ * Appends something like this to the body...
+ *     <p>
+ *         <!-- escaped: -->&lt;b&gt;&lt;i&gt;Hello&lt;/i&gt; world!&lt;/b&gt;
+ *         <!-- raw: --><b><i>Hello</i> world!</b>
+ *     </p>
+ *
+ * Message keys can also be remapped, allowing the same generic template to be used with a variety
+ * of messages. This is important for improving re-usability of templates.
+ *
+ * Example:
+ *     // Messages: { 'good-afternoon': 'Good afternoon' }
+ *     var html = '<p><html:msg key="greeting" /></p>';
+ *     $( 'body' ).append( $( html ).localize( { 'keys': { 'greeting': 'good-afternoon' } } ) );
+ *
+ * Appends something like this to the body...
+ *     <p>Good afternoon</p>
+ *
+ * Message keys can also be prefixed globally, which is handy when writing extensions, where by
+ * convention all messages are prefixed with the extension's name.
+ *
+ * Example:
+ *     // Messages: { 'teleportation-warning': 'You may not get there all in one piece.' }
+ *     var html = '<p><html:msg key="warning" /></p>';
+ *     $( 'body' ).append( $( html ).localize( { 'prefix': 'teleportation-' } ) );
+ *
+ * Appends something like this to the body...
+ *     <p>You may not get there all in one piece.</p>
+ *
+ * @param {Object} options Map of options to be used while localizing
+ * @param {string} options.prefix String to prepend to all message keys
+ * @param {Object} options.keys Message key aliases, used for remapping keys to a template
+ * @param {Object} options.params Lists of parameters to use with certain message keys
+ * @return {jQuery}
+ * @chainable
+ */
+$.fn.localize = function ( options ) {
+       var $target = this,
+               attributes = ['title', 'alt', 'placeholder'];
+
+       // Extend options
+       options = $.extend( {
+               prefix: '',
+               keys: {},
+               params: {}
+       }, options );
+
+       // Elements
+       // Ok, so here's the story on this selector. In IE 6/7, searching for 'msg' turns up the
+       // 'html:msg', but searching for 'html:msg' doesn't. In later IE and other browsers, searching
+       // for 'html:msg' turns up the 'html:msg', but searching for 'msg' doesn't. So searching for
+       // both 'msg' and 'html:msg' seems to get the job done. This feels pretty icky, though.
+       $target.find( 'msg,html\\:msg' ).each( function () {
+               var $el = $(this);
+               // Escape by default
+               if ( $el.attr( 'raw' ) ) {
+                       $el.html( msg( options, $el.attr( 'key' ) ) );
+               } else {
+                       $el.text( msg( options, $el.attr( 'key' ) ) );
+               }
+               // Remove wrapper
+               $el.replaceWith( $el.html() );
+       } );
+
+       // Attributes
+       // Note: there's no way to prevent escaping of values being injected into attributes, this is
+       // on purpose, not a design flaw.
+       $.each( attributes, function ( i, attr ) {
+               var msgAttr = attr + '-msg';
+               $target.find( '[' + msgAttr + ']' ).each( function () {
+                       var $el = $(this);
+                       $el.attr( attr, msg( options, $el.attr( msgAttr ) ) ).removeAttr( msgAttr );
+               } );
+       } );
+
+       // HTML, Text for elements which cannot have children e.g. OPTION
+       $target.find( '[data-msg-text]' ).each( function () {
+               var $el = $( this );
+               $el.text( msg( options, $el.attr( 'data-msg-text' ) ) );
+       } );
+
+       $target.find( '[data-msg-html]' ).each( function () {
+               var $el = $( this );
+               $el.html( msg( options, $el.attr( 'data-msg-html' ) ) );
+       } );
+
+       return $target;
+};
+
+// Let IE know about the msg tag before it's used...
+document.createElement( 'msg' );
+
+/**
+ * @class jQuery
+ * @mixins jQuery.plugin.localize
+ */
+
+}( jQuery, mediaWiki ) );
diff --git a/resources/src/jquery/jquery.makeCollapsible.css b/resources/src/jquery/jquery.makeCollapsible.css
new file mode 100644 (file)
index 0000000..55ea7c9
--- /dev/null
@@ -0,0 +1,23 @@
+/* See also jquery.makeCollapsible.js */
+.mw-collapsible-toggle {
+       float: right;
+       -moz-user-select: none;
+       -webkit-user-select: none;
+       -ms-user-select: none;
+       user-select: none;
+}
+
+/* collapse links in captions should be inline */
+caption .mw-collapsible-toggle {
+       float: none;
+}
+
+/* list-items go as wide as their parent element, don't float them inside list items */
+li .mw-collapsible-toggle {
+       float: none;
+}
+
+/* the added list item should have no list-style */
+.mw-collapsible-toggle-li {
+       list-style: none;
+}
diff --git a/resources/src/jquery/jquery.makeCollapsible.js b/resources/src/jquery/jquery.makeCollapsible.js
new file mode 100644 (file)
index 0000000..01fde4c
--- /dev/null
@@ -0,0 +1,394 @@
+/**
+ * jQuery makeCollapsible
+ *
+ * This will enable collapsible-functionality on all passed elements.
+ * - Will prevent binding twice to the same element.
+ * - Initial state is expanded by default, this can be overriden by adding class
+ *   "mw-collapsed" to the "mw-collapsible" element.
+ * - Elements made collapsible have jQuery data "mw-made-collapsible" set to true.
+ * - The inner content is wrapped in a "div.mw-collapsible-content" (except for tables and lists).
+ *
+ * @author Krinkle, 2011-2012
+ *
+ * Dual license:
+ * @license CC BY 3.0 <http://creativecommons.org/licenses/by/3.0>
+ * @license GPL2 <http://www.gnu.org/licenses/old-licenses/gpl-2.0.html>
+ */
+( function ( $, mw ) {
+       /**
+        * Handler for a click on a collapsible toggler.
+        *
+        * @param {jQuery} $collapsible
+        * @param {string} action The action this function will take ('expand' or 'collapse').
+        * @param {jQuery|null} [optional] $defaultToggle
+        * @param {Object|undefined} options
+        */
+       function toggleElement( $collapsible, action, $defaultToggle, options ) {
+               var $collapsibleContent, $containers, hookCallback;
+               options = options || {};
+
+               // Validate parameters
+
+               // $collapsible must be an instance of jQuery
+               if ( !$collapsible.jquery ) {
+                       return;
+               }
+               if ( action !== 'expand' && action !== 'collapse' ) {
+                       // action must be string with 'expand' or 'collapse'
+                       return;
+               }
+               if ( $defaultToggle === undefined ) {
+                       $defaultToggle = null;
+               }
+               if ( $defaultToggle !== null && !$defaultToggle.jquery ) {
+                       // is optional (may be undefined), but if defined it must be an instance of jQuery.
+                       // If it's not, abort right away.
+                       // After this $defaultToggle is either null or a valid jQuery instance.
+                       return;
+               }
+
+               // Trigger a custom event to allow callers to hook to the collapsing/expanding,
+               // allowing the module to be testable, and making it possible to
+               // e.g. implement persistence via cookies
+               $collapsible.trigger( action === 'expand' ? 'beforeExpand.mw-collapsible' : 'beforeCollapse.mw-collapsible' );
+               hookCallback = function () {
+                       $collapsible.trigger( action === 'expand' ? 'afterExpand.mw-collapsible' : 'afterCollapse.mw-collapsible' );
+               };
+
+               // Handle different kinds of elements
+
+               if ( !options.plainMode && $collapsible.is( 'table' ) ) {
+                       // Tables
+                       // If there is a caption, hide all rows; otherwise, only hide body rows
+                       if ( $collapsible.find( '> caption' ).length ) {
+                               $containers = $collapsible.find( '> * > tr' );
+                       } else {
+                               $containers = $collapsible.find( '> tbody > tr' );
+                       }
+                       if ( $defaultToggle ) {
+                               // Exclude table row containing togglelink
+                               $containers = $containers.not( $defaultToggle.closest( 'tr' ) );
+                       }
+
+                       if ( action === 'collapse' ) {
+                               // Hide all table rows of this table
+                               // Slide doesn't work with tables, but fade does as of jQuery 1.1.3
+                               // http://stackoverflow.com/questions/467336#920480
+                               if ( options.instantHide ) {
+                                       $containers.hide();
+                                       hookCallback();
+                               } else {
+                                       $containers.stop( true, true ).fadeOut().promise().done( hookCallback );
+                               }
+                       } else {
+                               $containers.stop( true, true ).fadeIn().promise().done( hookCallback );
+                       }
+
+               } else if ( !options.plainMode && ( $collapsible.is( 'ul' ) || $collapsible.is( 'ol' ) ) ) {
+                       // Lists
+                       $containers = $collapsible.find( '> li' );
+                       if ( $defaultToggle ) {
+                               // Exclude list-item containing togglelink
+                               $containers = $containers.not( $defaultToggle.parent() );
+                       }
+
+                       if ( action === 'collapse' ) {
+                               if ( options.instantHide ) {
+                                       $containers.hide();
+                                       hookCallback();
+                               } else {
+                                       $containers.stop( true, true ).slideUp().promise().done( hookCallback );
+                               }
+                       } else {
+                               $containers.stop( true, true ).slideDown().promise().done( hookCallback );
+                       }
+
+               } else {
+                       // Everything else: <div>, <p> etc.
+                       $collapsibleContent = $collapsible.find( '> .mw-collapsible-content' );
+
+                       // If a collapsible-content is defined, act on it
+                       if ( !options.plainMode && $collapsibleContent.length ) {
+                               if ( action === 'collapse' ) {
+                                       if ( options.instantHide ) {
+                                               $collapsibleContent.hide();
+                                               hookCallback();
+                                       } else {
+                                               $collapsibleContent.slideUp().promise().done( hookCallback );
+                                       }
+                               } else {
+                                       $collapsibleContent.slideDown().promise().done( hookCallback );
+                               }
+
+                       // Otherwise assume this is a customcollapse with a remote toggle
+                       // .. and there is no collapsible-content because the entire element should be toggled
+                       } else {
+                               if ( action === 'collapse' ) {
+                                       if ( options.instantHide ) {
+                                               $collapsible.hide();
+                                               hookCallback();
+                                       } else {
+                                               if ( $collapsible.is( 'tr' ) || $collapsible.is( 'td' ) || $collapsible.is( 'th' ) ) {
+                                                       $collapsible.fadeOut().promise().done( hookCallback );
+                                               } else {
+                                                       $collapsible.slideUp().promise().done( hookCallback );
+                                               }
+                                       }
+                               } else {
+                                       if ( $collapsible.is( 'tr' ) || $collapsible.is( 'td' ) || $collapsible.is( 'th' ) ) {
+                                               $collapsible.fadeIn().promise().done( hookCallback );
+                                       } else {
+                                               $collapsible.slideDown().promise().done( hookCallback );
+                                       }
+                               }
+                       }
+               }
+       }
+
+       /**
+        * Handles clicking/keypressing on the collapsible element toggle and other
+        * situations where a collapsible element is toggled (e.g. the initial
+        * toggle for collapsed ones).
+        *
+        * @param {jQuery} $toggle the clickable toggle itself
+        * @param {jQuery} $collapsible the collapsible element
+        * @param {jQuery.Event|null} e either the event or null if unavailable
+        * @param {Object|undefined} options
+        */
+       function togglingHandler( $toggle, $collapsible, e, options ) {
+               var wasCollapsed, $textContainer, collapseText, expandText;
+
+               if ( options === undefined ) {
+                       options = {};
+               }
+
+               if ( e ) {
+                       if ( e.type === 'click' && options.linksPassthru && $.nodeName( e.target, 'a' ) ) {
+                               // Don't fire if a link was clicked, if requested  (for premade togglers by default)
+                               return;
+                       } else if ( e.type === 'keypress' && e.which !== 13 && e.which !== 32 ) {
+                               // Only handle keypresses on the "Enter" or "Space" keys
+                               return;
+                       } else {
+                               e.preventDefault();
+                               e.stopPropagation();
+                       }
+               }
+
+               // This allows the element to be hidden on initial toggle without fiddling with the class
+               if ( options.wasCollapsed !== undefined ) {
+                       wasCollapsed = options.wasCollapsed;
+               } else {
+                       wasCollapsed = $collapsible.hasClass( 'mw-collapsed' );
+               }
+
+               // Toggle the state of the collapsible element (that is, expand or collapse)
+               $collapsible.toggleClass( 'mw-collapsed', !wasCollapsed );
+
+               // Toggle the mw-collapsible-toggle classes, if requested (for default and premade togglers by default)
+               if ( options.toggleClasses ) {
+                       $toggle
+                               .toggleClass( 'mw-collapsible-toggle-collapsed', !wasCollapsed )
+                               .toggleClass( 'mw-collapsible-toggle-expanded', wasCollapsed );
+               }
+
+               // Toggle the text ("Show"/"Hide"), if requested (for default togglers by default)
+               if ( options.toggleText ) {
+                       collapseText = options.toggleText.collapseText;
+                       expandText = options.toggleText.expandText;
+
+                       $textContainer = $toggle.find( '> a' );
+                       if ( !$textContainer.length ) {
+                               $textContainer = $toggle;
+                       }
+                       $textContainer.text( wasCollapsed ? collapseText : expandText );
+               }
+
+               // And finally toggle the element state itself
+               toggleElement( $collapsible, wasCollapsed ? 'expand' : 'collapse', $toggle, options );
+       }
+
+       /**
+        * Make any element collapsible.
+        *
+        * Supported options:
+        * - collapseText: text to be used for the toggler when clicking it would
+        *   collapse the element. Default: the 'data-collapsetext' attribute of
+        *   the collapsible element or the content of 'collapsible-collapse'
+        *   message.
+        * - expandText: text to be used for the toggler when clicking it would
+        *   expand the element. Default: the 'data-expandtext' attribute of
+        *   the collapsible element or the content of 'collapsible-expand'
+        *   message.
+        * - collapsed: boolean, whether to collapse immediately. By default
+        *   collapse only if the elements has the 'mw-collapsible' class.
+        * - $customTogglers: jQuerified list of elements to be used as togglers
+        *   for this collapsible element. By default, if the collapsible element
+        *   has an id attribute like 'mw-customcollapsible-XXX', elements with a
+        *   *class* of 'mw-customtoggle-XXX' are made togglers for it.
+        * - plainMode: boolean, whether to use a "plain mode" when making the
+        *   element collapsible - that is, hide entire tables and lists (instead
+        *   of hiding only all rows but first of tables, and hiding each list
+        *   item separately for lists) and don't wrap other elements in
+        *   div.mw-collapsible-content. May only be used with custom togglers.
+        */
+       $.fn.makeCollapsible = function ( options ) {
+               if ( options === undefined ) {
+                       options = {};
+               }
+
+               return this.each( function () {
+                       var $collapsible, collapseText, expandText, $caption, $toggle, actionHandler, buildDefaultToggleLink,
+                               premadeToggleHandler, $toggleLink, $firstItem, collapsibleId, $customTogglers, firstval;
+
+                       // Ensure class "mw-collapsible" is present in case .makeCollapsible()
+                       // is called on element(s) that don't have it yet.
+                       $collapsible = $( this ).addClass( 'mw-collapsible' );
+
+                       // Return if it has been enabled already.
+                       if ( $collapsible.data( 'mw-made-collapsible' ) ) {
+                               return;
+                       } else {
+                               $collapsible.data( 'mw-made-collapsible', true );
+                       }
+
+                       // Use custom text or default?
+                       collapseText = options.collapseText || $collapsible.attr( 'data-collapsetext' ) || mw.msg( 'collapsible-collapse' );
+                       expandText = options.expandText || $collapsible.attr( 'data-expandtext' ) || mw.msg( 'collapsible-expand' );
+
+                       // Default click/keypress handler and toggle link to use when none is present
+                       actionHandler = function ( e, opts ) {
+                               var defaultOpts = {
+                                       toggleClasses: true,
+                                       toggleText: { collapseText: collapseText, expandText: expandText }
+                               };
+                               opts = $.extend( defaultOpts, options, opts );
+                               togglingHandler( $( this ), $collapsible, e, opts );
+                       };
+                       // Default toggle link. Only build it when needed to avoid jQuery memory leaks (event data).
+                       buildDefaultToggleLink = function () {
+                               return $( '<a href="#"></a>' )
+                                       .text( collapseText )
+                                       .wrap( '<span class="mw-collapsible-toggle"></span>' )
+                                               .parent()
+                                               .prepend( '&nbsp;[' )
+                                               .append( ']&nbsp;' )
+                                               .on( 'click.mw-collapsible keypress.mw-collapsible', actionHandler );
+                       };
+
+                       // Default handler for clicking on premade toggles
+                       premadeToggleHandler = function ( e, opts ) {
+                               var defaultOpts = { toggleClasses: true, linksPassthru: true };
+                               opts = $.extend( defaultOpts, options, opts );
+                               togglingHandler( $( this ), $collapsible, e, opts );
+                       };
+
+                       // Check if this element has a custom position for the toggle link
+                       // (ie. outside the container or deeper inside the tree)
+                       if ( options.$customTogglers ) {
+                               $customTogglers = $( options.$customTogglers );
+                       } else {
+                               collapsibleId = $collapsible.attr( 'id' ) || '';
+                               if ( collapsibleId.indexOf( 'mw-customcollapsible-' ) === 0 ) {
+                                       $customTogglers = $( '.' + collapsibleId.replace( 'mw-customcollapsible', 'mw-customtoggle' ) );
+                               }
+                       }
+
+                       // Add event handlers to custom togglers or create our own ones
+                       if ( $customTogglers && $customTogglers.length ) {
+                               actionHandler = function ( e, opts ) {
+                                       var defaultOpts = {};
+                                       opts = $.extend( defaultOpts, options, opts );
+                                       togglingHandler( $( this ), $collapsible, e, opts );
+                               };
+
+                               $toggleLink = $customTogglers;
+                               $toggleLink.on( 'click.mw-collapsible keypress.mw-collapsible', actionHandler );
+
+                       } else {
+                               // If this is not a custom case, do the default: wrap the
+                               // contents and add the toggle link. Different elements are
+                               // treated differently.
+                               if ( $collapsible.is( 'table' ) ) {
+
+                                       // If the table has a caption, collapse to the caption
+                                       // as opposed to the first row
+                                       $caption = $collapsible.find( '> caption' );
+                                       if ( $caption.length ) {
+                                               $toggle = $caption.find( '> .mw-collapsible-toggle' );
+
+                                               // If there is no toggle link, add it to the end of the caption
+                                               if ( !$toggle.length ) {
+                                                       $toggleLink = buildDefaultToggleLink().appendTo( $caption );
+                                               } else {
+                                                       actionHandler = premadeToggleHandler;
+                                                       $toggleLink = $toggle.on( 'click.mw-collapsible keypress.mw-collapsible', actionHandler );
+                                               }
+                                       } else {
+                                               // The toggle-link will be in one the the cells (td or th) of the first row
+                                               $firstItem = $collapsible.find( 'tr:first th, tr:first td' );
+                                               $toggle = $firstItem.find( '> .mw-collapsible-toggle' );
+
+                                               // If theres no toggle link, add it to the last cell
+                                               if ( !$toggle.length ) {
+                                                       $toggleLink = buildDefaultToggleLink().prependTo( $firstItem.eq( -1 ) );
+                                               } else {
+                                                       actionHandler = premadeToggleHandler;
+                                                       $toggleLink = $toggle.on( 'click.mw-collapsible keypress.mw-collapsible', actionHandler );
+                                               }
+                                       }
+
+                               } else if ( $collapsible.is( 'ul' ) || $collapsible.is( 'ol' ) ) {
+                                       // The toggle-link will be in the first list-item
+                                       $firstItem = $collapsible.find( 'li:first' );
+                                       $toggle = $firstItem.find( '> .mw-collapsible-toggle' );
+
+                                       // If theres no toggle link, add it
+                                       if ( !$toggle.length ) {
+                                               // Make sure the numeral order doesn't get messed up, force the first (soon to be second) item
+                                               // to be "1". Except if the value-attribute is already used.
+                                               // If no value was set WebKit returns "", Mozilla returns '-1', others return 0, null or undefined.
+                                               firstval = $firstItem.attr( 'value' );
+                                               if ( firstval === undefined || !firstval || firstval === '-1' || firstval === -1 ) {
+                                                       $firstItem.attr( 'value', '1' );
+                                               }
+                                               $toggleLink = buildDefaultToggleLink();
+                                               $toggleLink.wrap( '<li class="mw-collapsible-toggle-li"></li>' ).parent().prependTo( $collapsible );
+                                       } else {
+                                               actionHandler = premadeToggleHandler;
+                                               $toggleLink = $toggle.on( 'click.mw-collapsible keypress.mw-collapsible', actionHandler );
+                                       }
+
+                               } else { // <div>, <p> etc.
+
+                                       // The toggle-link will be the first child of the element
+                                       $toggle = $collapsible.find( '> .mw-collapsible-toggle' );
+
+                                       // If a direct child .content-wrapper does not exists, create it
+                                       if ( !$collapsible.find( '> .mw-collapsible-content' ).length ) {
+                                               $collapsible.wrapInner( '<div class="mw-collapsible-content"></div>' );
+                                       }
+
+                                       // If theres no toggle link, add it
+                                       if ( !$toggle.length ) {
+                                               $toggleLink = buildDefaultToggleLink().prependTo( $collapsible );
+                                       } else {
+                                               actionHandler = premadeToggleHandler;
+                                               $toggleLink = $toggle.on( 'click.mw-collapsible keypress.mw-collapsible', actionHandler );
+                                       }
+                               }
+                       }
+
+                       // Attributes for accessibility. This isn't necessary when the toggler is already
+                       // an <a> or a <button> etc., but it doesn't hurt either, and it's consistent.
+                       $toggleLink.prop( 'tabIndex', 0 );
+
+                       // Initial state
+                       if ( options.collapsed || $collapsible.hasClass( 'mw-collapsed' ) ) {
+                               // One toggler can hook to multiple elements, and one element can have
+                               // multiple togglers. This is the sanest way to handle that.
+                               actionHandler.call( $toggleLink.get( 0 ), null, { instantHide: true, wasCollapsed: false } );
+                       }
+               } );
+       };
+}( jQuery, mediaWiki ) );
diff --git a/resources/src/jquery/jquery.mw-jump.js b/resources/src/jquery/jquery.mw-jump.js
new file mode 100644 (file)
index 0000000..e286834
--- /dev/null
@@ -0,0 +1,15 @@
+/**
+ * JavaScript to show jump links to motor-impaired users when they are focused.
+ */
+jQuery( function ( $ ) {
+
+       $( '.mw-jump' ).on( 'focus blur', 'a', function ( e ) {
+               // Confusingly jQuery leaves e.type as focusout for delegated blur events
+               if ( e.type === 'blur' || e.type === 'focusout' ) {
+                       $( this ).closest( '.mw-jump' ).css({ height: 0 });
+               } else {
+                       $( this ).closest( '.mw-jump' ).css({ height: 'auto' });
+               }
+       } );
+
+} );
diff --git a/resources/src/jquery/jquery.mwExtension.js b/resources/src/jquery/jquery.mwExtension.js
new file mode 100644 (file)
index 0000000..03c1c85
--- /dev/null
@@ -0,0 +1,122 @@
+/*
+ * JavaScript backwards-compatibility alternatives and other convenience functions
+ */
+( function ( $ ) {
+
+       $.extend({
+               trimLeft: function ( str ) {
+                       return str === null ? '' : str.toString().replace( /^\s+/, '' );
+               },
+               trimRight: function ( str ) {
+                       return str === null ?
+                                       '' : str.toString().replace( /\s+$/, '' );
+               },
+               ucFirst: function ( str ) {
+                       return str.charAt( 0 ).toUpperCase() + str.substr( 1 );
+               },
+               escapeRE: function ( str ) {
+                       return str.replace ( /([\\{}()|.?*+\-\^$\[\]])/g, '\\$1' );
+               },
+               isDomElement: function ( el ) {
+                       return !!el && !!el.nodeType;
+               },
+               isEmpty: function ( v ) {
+                       var key;
+                       if ( v === '' || v === 0 || v === '0' || v === null
+                               || v === false || v === undefined )
+                       {
+                               return true;
+                       }
+                       // the for-loop could potentially contain prototypes
+                       // to avoid that we check it's length first
+                       if ( v.length === 0 ) {
+                               return true;
+                       }
+                       if ( typeof v === 'object' ) {
+                               for ( key in v ) {
+                                       return false;
+                               }
+                               return true;
+                       }
+                       return false;
+               },
+               compareArray: function ( arrThis, arrAgainst ) {
+                       if ( arrThis.length !== arrAgainst.length ) {
+                               return false;
+                       }
+                       for ( var i = 0; i < arrThis.length; i++ ) {
+                               if ( $.isArray( arrThis[i] ) ) {
+                                       if ( !$.compareArray( arrThis[i], arrAgainst[i] ) ) {
+                                               return false;
+                                       }
+                               } else if ( arrThis[i] !== arrAgainst[i] ) {
+                                       return false;
+                               }
+                       }
+                       return true;
+               },
+               compareObject: function ( objectA, objectB ) {
+                       var prop, type;
+
+                       // Do a simple check if the types match
+                       if ( typeof objectA === typeof objectB ) {
+
+                               // Only loop over the contents if it really is an object
+                               if ( typeof objectA === 'object' ) {
+                                       // If they are aliases of the same object (ie. mw and mediaWiki) return now
+                                       if ( objectA === objectB ) {
+                                               return true;
+                                       } else {
+                                               // Iterate over each property
+                                               for ( prop in objectA ) {
+                                                       // Check if this property is also present in the other object
+                                                       if ( prop in objectB ) {
+                                                               // Compare the types of the properties
+                                                               type = typeof objectA[prop];
+                                                               if ( type === typeof objectB[prop] ) {
+                                                                       // Recursively check objects inside this one
+                                                                       switch ( type ) {
+                                                                               case 'object' :
+                                                                                       if ( !$.compareObject( objectA[prop], objectB[prop] ) ) {
+                                                                                               return false;
+                                                                                       }
+                                                                                       break;
+                                                                               case 'function' :
+                                                                                       // Functions need to be strings to compare them properly
+                                                                                       if ( objectA[prop].toString() !== objectB[prop].toString() ) {
+                                                                                               return false;
+                                                                                       }
+                                                                                       break;
+                                                                               default:
+                                                                                       // Strings, numbers
+                                                                                       if ( objectA[prop] !== objectB[prop] ) {
+                                                                                               return false;
+                                                                                       }
+                                                                                       break;
+                                                                       }
+                                                               } else {
+                                                                       return false;
+                                                               }
+                                                       } else {
+                                                               return false;
+                                                       }
+                                               }
+                                               // Check for properties in B but not in A
+                                               // This is about 15% faster (tested in Safari 5 and Firefox 3.6)
+                                               // ...than incrementing a count variable in the above and below loops
+                                               // See also: https://www.mediawiki.org/wiki/ResourceLoader/Default_modules/compareObject_test#Results
+                                               for ( prop in objectB ) {
+                                                       if ( !( prop in objectA ) ) {
+                                                               return false;
+                                                       }
+                                               }
+                                       }
+                               }
+                       } else {
+                               return false;
+                       }
+                       return true;
+               }
+       });
+
+}( jQuery ) );
diff --git a/resources/src/jquery/jquery.placeholder.js b/resources/src/jquery/jquery.placeholder.js
new file mode 100644 (file)
index 0000000..6f7ada3
--- /dev/null
@@ -0,0 +1,229 @@
+/**
+ * HTML5 placeholder emulation for jQuery plugin
+ *
+ * This will automatically use the HTML5 placeholder attribute if supported, or emulate this behavior if not.
+ *
+ * This is a fork from Mathias Bynens' jquery.placeholder as of this commit
+ * https://github.com/mathiasbynens/jquery-placeholder/blob/47f05d400e2dd16b59d144141a2cf54a9a77c502/jquery.placeholder.js
+ *
+ * @author Mathias Bynens <http://mathiasbynens.be/>
+ * @author Trevor Parscal <tparscal@wikimedia.org>, 2012
+ * @author Krinkle <krinklemail@gmail.com>, 2012
+ * @author Alex Ivanov <alexivanov97@gmail.com>, 2013
+ * @version 2.1.0
+ * @license MIT
+ */
+(function ($) {
+
+       var isInputSupported = 'placeholder' in document.createElement('input'),
+               isTextareaSupported = 'placeholder' in document.createElement('textarea'),
+               prototype = $.fn,
+               valHooks = $.valHooks,
+               propHooks = $.propHooks,
+               hooks,
+               placeholder;
+
+       if (isInputSupported && isTextareaSupported) {
+
+               placeholder = prototype.placeholder = function (text) {
+                       var hasArgs = arguments.length;
+
+                       if (hasArgs) {
+                               changePlaceholder.call(this, text);
+                       }
+
+                       return this;
+               };
+
+               placeholder.input = placeholder.textarea = true;
+
+       } else {
+
+               placeholder = prototype.placeholder = function (text) {
+                       var $this = this,
+                               hasArgs = arguments.length;
+
+                       if (hasArgs) {
+                               changePlaceholder.call(this, text);
+                       }
+
+                       $this
+                               .filter((isInputSupported ? 'textarea' : ':input') + '[placeholder]')
+                               .filter(function () {
+                                       return !$(this).data('placeholder-enabled');
+                               })
+                               .bind({
+                                       'focus.placeholder drop.placeholder': clearPlaceholder,
+                                       'blur.placeholder': setPlaceholder
+                               })
+                               .data('placeholder-enabled', true)
+                               .trigger('blur.placeholder');
+                       return $this;
+               };
+
+               placeholder.input = isInputSupported;
+               placeholder.textarea = isTextareaSupported;
+
+               hooks = {
+                       'get': function (element) {
+                               var $element = $(element),
+                                       $passwordInput = $element.data('placeholder-password');
+                               if ($passwordInput) {
+                                       return $passwordInput[0].value;
+                               }
+
+                               return $element.data('placeholder-enabled') && $element.hasClass('placeholder') ? '' : element.value;
+                       },
+                       'set': function (element, value) {
+                               var $element = $(element),
+                                       $passwordInput = $element.data('placeholder-password');
+                               if ($passwordInput) {
+                                       $passwordInput[0].value = value;
+                                       return value;
+                               }
+
+                               if (!$element.data('placeholder-enabled')) {
+                                       element.value = value;
+                                       return value;
+                               }
+                               if (!value) {
+                                       element.value = value;
+                                       // Issue #56: Setting the placeholder causes problems if the element continues to have focus.
+                                       if (element !== safeActiveElement()) {
+                                               // We can't use `triggerHandler` here because of dummy text/password inputs :(
+                                               setPlaceholder.call(element);
+                                       }
+                               } else if ($element.hasClass('placeholder')) {
+                                       if (!clearPlaceholder.call(element, true, value)) {
+                                               element.value = value;
+                                       }
+                               } else {
+                                       element.value = value;
+                               }
+                               // `set` can not return `undefined`; see http://jsapi.info/jquery/1.7.1/val#L2363
+                               return $element;
+                       }
+               };
+
+               if (!isInputSupported) {
+                       valHooks.input = hooks;
+                       propHooks.value = hooks;
+               }
+               if (!isTextareaSupported) {
+                       valHooks.textarea = hooks;
+                       propHooks.value = hooks;
+               }
+
+               $(function () {
+                       // Look for forms
+                       $(document).delegate('form', 'submit.placeholder', function () {
+                               // Clear the placeholder values so they don't get submitted
+                               var $inputs = $('.placeholder', this).each(clearPlaceholder);
+                               setTimeout(function () {
+                                       $inputs.each(setPlaceholder);
+                               }, 10);
+                       });
+               });
+
+               // Clear placeholder values upon page reload
+               $(window).bind('beforeunload.placeholder', function () {
+                       $('.placeholder').each(function () {
+                               this.value = '';
+                       });
+               });
+
+       }
+
+       function args(elem) {
+               // Return an object of element attributes
+               var newAttrs = {},
+                       rinlinejQuery = /^jQuery\d+$/;
+               $.each(elem.attributes, function (i, attr) {
+                       if (attr.specified && !rinlinejQuery.test(attr.name)) {
+                               newAttrs[attr.name] = attr.value;
+                       }
+               });
+               return newAttrs;
+       }
+
+       function clearPlaceholder(event, value) {
+               var input = this,
+                       $input = $(input);
+               if (input.value === $input.attr('placeholder') && $input.hasClass('placeholder')) {
+                       if ($input.data('placeholder-password')) {
+                               $input = $input.hide().next().show().attr('id', $input.removeAttr('id').data('placeholder-id'));
+                               // If `clearPlaceholder` was called from `$.valHooks.input.set`
+                               if (event === true) {
+                                       $input[0].value = value;
+                                       return value;
+                               }
+                               $input.focus();
+                       } else {
+                               input.value = '';
+                               $input.removeClass('placeholder');
+                               if (input === safeActiveElement()) {
+                                       input.select();
+                               }
+                       }
+               }
+       }
+
+       function setPlaceholder() {
+               var $replacement,
+                       input = this,
+                       $input = $(input),
+                       id = this.id;
+               if (!input.value) {
+                       if (input.type === 'password') {
+                               if (!$input.data('placeholder-textinput')) {
+                                       try {
+                                               $replacement = $input.clone().attr({ 'type': 'text' });
+                                       } catch(e) {
+                                               $replacement = $('<input>').attr($.extend(args(this), { 'type': 'text' }));
+                                       }
+                                       $replacement
+                                               .removeAttr('name')
+                                               .data({
+                                                       'placeholder-password': $input,
+                                                       'placeholder-id': id
+                                               })
+                                               .bind('focus.placeholder drop.placeholder', clearPlaceholder);
+                                       $input
+                                               .data({
+                                                       'placeholder-textinput': $replacement,
+                                                       'placeholder-id': id
+                                               })
+                                               .before($replacement);
+                               }
+                               $input = $input.removeAttr('id').hide().prev().attr('id', id).show();
+                               // Note: `$input[0] != input` now!
+                       }
+                       $input.addClass('placeholder');
+                       $input[0].value = $input.attr('placeholder');
+               } else {
+                       $input.removeClass('placeholder');
+               }
+       }
+
+       function safeActiveElement() {
+               // Avoid IE9 `document.activeElement` of death
+               // https://github.com/mathiasbynens/jquery-placeholder/pull/99
+               try {
+                       return document.activeElement;
+               } catch (err) {}
+       }
+
+       function changePlaceholder(text) {
+               var hasArgs = arguments.length,
+                       $input = this;
+               if (hasArgs) {
+                       if ($input.attr('placeholder') !== text) {
+                               $input.prop('placeholder', text);
+                               if ($input.hasClass('placeholder')) {
+                                       $input[0].value = text;
+                               }
+                       }
+               }
+       }
+
+}(jQuery));
diff --git a/resources/src/jquery/jquery.qunit.completenessTest.js b/resources/src/jquery/jquery.qunit.completenessTest.js
new file mode 100644 (file)
index 0000000..86fcaea
--- /dev/null
@@ -0,0 +1,359 @@
+/**
+ * jQuery QUnit CompletenessTest 0.4
+ *
+ * Tests the completeness of test suites for object oriented javascript
+ * libraries. Written to be used in environments with jQuery and QUnit.
+ * Requires jQuery 1.7.2 or higher.
+ *
+ * Built for and tested with:
+ * - Chrome 19
+ * - Firefox 4
+ * - Safari 5
+ *
+ * @author Timo Tijhof, 2011-2012
+ */
+( function ( $ ) {
+       'use strict';
+
+       var util,
+               hasOwn = Object.prototype.hasOwnProperty,
+               log = (window.console && window.console.log)
+                       ? function () { return window.console.log.apply(window.console, arguments); }
+                       : function () {};
+
+       // Simplified version of a few jQuery methods, except that they don't
+       // call other jQuery methods. Required to be able to run the CompletenessTest
+       // on jQuery itself as well.
+       util = {
+               keys: Object.keys || function ( object ) {
+                       var key, keys = [];
+                       for ( key in object ) {
+                               if ( hasOwn.call( object, key ) ) {
+                                       keys.push( key );
+                               }
+                       }
+                       return keys;
+               },
+               extend: function () {
+                       var options, name, src, copy,
+                               target = arguments[0] || {},
+                               i = 1,
+                               length = arguments.length;
+
+                       for ( ; i < length; i++ ) {
+                               options = arguments[ i ];
+                               // Only deal with non-null/undefined values
+                               if ( options !== null && options !== undefined ) {
+                                       // Extend the base object
+                                       for ( name in options ) {
+                                               src = target[ name ];
+                                               copy = options[ name ];
+
+                                               // Prevent never-ending loop
+                                               if ( target === copy ) {
+                                                       continue;
+                                               }
+
+                                               if ( copy !== undefined ) {
+                                                       target[ name ] = copy;
+                                               }
+                                       }
+                               }
+                       }
+
+                       // Return the modified object
+                       return target;
+               },
+               each: function ( object, callback ) {
+                       var name;
+                       for ( name in object ) {
+                               if ( callback.call( object[ name ], name, object[ name ] ) === false ) {
+                                       break;
+                               }
+                       }
+               },
+               // $.type and $.isEmptyObject are safe as is, they don't call
+               // other $.* methods. Still need to be derefenced into `util`
+               // since the CompletenessTest will overload them with spies.
+               type: $.type,
+               isEmptyObject: $.isEmptyObject
+       };
+
+       /**
+        * CompletenessTest
+        * @constructor
+        *
+        * @example
+        *  var myTester = new CompletenessTest( myLib );
+        * @param masterVariable {Object} The root variable that contains all object
+        *  members. CompletenessTest will recursively traverse objects and keep track
+        *  of all methods.
+        * @param ignoreFn {Function} Optionally pass a function to filter out certain
+        *  methods. Example: You may want to filter out instances of jQuery or some
+        *  other constructor. Otherwise "missingTests" will include all methods that
+        *  were not called from that instance.
+        */
+       function CompletenessTest( masterVariable, ignoreFn ) {
+
+               // Keep track in these objects. Keyed by strings with the
+               // method names (ie. 'my.foo', 'my.bar', etc.) values are boolean true.
+               this.injectionTracker = {};
+               this.methodCallTracker = {};
+               this.missingTests = {};
+
+               this.ignoreFn = undefined === ignoreFn ? function () { return false; } : ignoreFn;
+
+               // Lazy limit in case something weird happends (like recurse (part of) ourself).
+               this.lazyLimit = 2000;
+               this.lazyCounter = 0;
+
+               var that = this;
+
+               // Bind begin and end to QUnit.
+               QUnit.begin( function () {
+                       that.walkTheObject( null, masterVariable, masterVariable, [], CompletenessTest.ACTION_INJECT );
+                       log( 'CompletenessTest/walkTheObject/ACTION_INJECT', that );
+               });
+
+               QUnit.done( function () {
+                       that.populateMissingTests();
+                       log( 'CompletenessTest/populateMissingTests', that );
+
+                       var toolbar, testResults, cntTotal, cntCalled, cntMissing;
+
+                       cntTotal = util.keys( that.injectionTracker ).length;
+                       cntCalled = util.keys( that.methodCallTracker ).length;
+                       cntMissing = util.keys( that.missingTests ).length;
+
+                       function makeTestResults( blob, title, style ) {
+                               var elOutputWrapper, elTitle, elContainer, elList, elFoot;
+
+                               elTitle = document.createElement( 'strong' );
+                               elTitle.textContent = title || 'Values';
+
+                               elList = document.createElement( 'ul' );
+                               util.each( blob, function ( key ) {
+                                       var elItem = document.createElement( 'li' );
+                                       elItem.textContent = key;
+                                       elList.appendChild( elItem );
+                               });
+
+                               elFoot = document.createElement( 'p' );
+                               elFoot.innerHTML = '<em>&mdash; CompletenessTest</em>';
+
+                               elContainer = document.createElement( 'div' );
+                               elContainer.appendChild( elTitle );
+                               elContainer.appendChild( elList );
+                               elContainer.appendChild( elFoot );
+
+                               elOutputWrapper = document.getElementById( 'qunit-completenesstest' );
+                               if ( !elOutputWrapper ) {
+                                       elOutputWrapper = document.createElement( 'div' );
+                                       elOutputWrapper.id = 'qunit-completenesstest';
+                               }
+                               elOutputWrapper.appendChild( elContainer );
+
+                               util.each( style, function ( key, value ) {
+                                       elOutputWrapper.style[key] = value;
+                               });
+                               return elOutputWrapper;
+                       }
+
+                       if ( cntMissing === 0 ) {
+                               // Good
+                               testResults = makeTestResults(
+                                       {},
+                                       'Detected calls to ' + cntCalled + '/' + cntTotal + ' methods. No missing tests!',
+                                       {
+                                               backgroundColor: '#D2E0E6',
+                                               color: '#366097',
+                                               paddingTop: '1em',
+                                               paddingRight: '1em',
+                                               paddingBottom: '1em',
+                                               paddingLeft: '1em'
+                                       }
+                               );
+                       } else {
+                               // Bad
+                               testResults = makeTestResults(
+                                       that.missingTests,
+                                       'Detected calls to ' + cntCalled + '/' + cntTotal + ' methods. ' + cntMissing + ' methods not covered:',
+                                       {
+                                               backgroundColor: '#EE5757',
+                                               color: 'black',
+                                               paddingTop: '1em',
+                                               paddingRight: '1em',
+                                               paddingBottom: '1em',
+                                               paddingLeft: '1em'
+                                       }
+                               );
+                       }
+
+                       toolbar = document.getElementById( 'qunit-testrunner-toolbar' );
+                       if ( toolbar ) {
+                               toolbar.insertBefore( testResults, toolbar.firstChild );
+                       }
+               });
+
+               return this;
+       }
+
+       /* Static members */
+       CompletenessTest.ACTION_INJECT = 500;
+       CompletenessTest.ACTION_CHECK = 501;
+
+       /* Public methods */
+       CompletenessTest.fn = CompletenessTest.prototype = {
+
+               /**
+                * CompletenessTest.fn.walkTheObject
+                *
+                * This function recursively walks through the given object, calling itself as it goes.
+                * Depending on the action it either injects our listener into the methods, or
+                * reads from our tracker and records which methods have not been called by the test suite.
+                *
+                * @param currName {String|Null} Name of the given object member (Initially this is null).
+                * @param currVar {mixed} The variable to check (initially an object,
+                *  further down it could be anything).
+                * @param masterVariable {Object} Throughout our interation, always keep track of the master/root.
+                *  Initially this is the same as currVar.
+                * @param parentPathArray {Array} Array of names that indicate our breadcrumb path starting at
+                *  masterVariable. Not including currName.
+                * @param action {Number} What is this function supposed to do (ACTION_INJECT or ACTION_CHECK)
+                */
+               walkTheObject: function ( currName, currVar, masterVariable, parentPathArray, action ) {
+
+                       var key, value, tmpPathArray,
+                               type = util.type( currVar ),
+                               that = this;
+
+                       // Hard ignores
+                       if ( this.ignoreFn( currVar, that, parentPathArray ) ) {
+                               return null;
+                       }
+
+                       // Handle the lazy limit
+                       this.lazyCounter++;
+                       if ( this.lazyCounter > this.lazyLimit ) {
+                               log( 'CompletenessTest.fn.walkTheObject> Limit reached: ' + this.lazyCounter, parentPathArray );
+                               return null;
+                       }
+
+                       // Functions
+                       if ( type === 'function' ) {
+
+                               if ( !currVar.prototype || util.isEmptyObject( currVar.prototype ) ) {
+
+                                       if ( action === CompletenessTest.ACTION_INJECT ) {
+
+                                               that.injectionTracker[ parentPathArray.join( '.' ) ] = true;
+                                               that.injectCheck( masterVariable, parentPathArray, function () {
+                                                       that.methodCallTracker[ parentPathArray.join( '.' ) ] = true;
+                                               } );
+                                       }
+
+                               // We don't support checking object constructors yet...
+                               // ...we can check the prototypes fine, though.
+                               } else {
+                                       if ( action === CompletenessTest.ACTION_INJECT ) {
+
+                                               for ( key in currVar.prototype ) {
+                                                       if ( hasOwn.call( currVar.prototype, key ) ) {
+                                                               value = currVar.prototype[key];
+                                                               if ( key === 'constructor' ) {
+                                                                       continue;
+                                                               }
+
+                                                               // Clone and break reference to parentPathArray
+                                                               tmpPathArray = util.extend( [], parentPathArray );
+                                                               tmpPathArray.push( 'prototype' );
+                                                               tmpPathArray.push( key );
+
+                                                               that.walkTheObject( key, value, masterVariable, tmpPathArray, action );
+                                                       }
+                                               }
+
+                                       }
+                               }
+
+                       }
+
+                       // Recursively. After all, this is the *completeness* test
+                       if ( type === 'function' || type === 'object' ) {
+                               for ( key in currVar ) {
+                                       if ( hasOwn.call( currVar, key ) ) {
+                                               value = currVar[key];
+
+                                               // Clone and break reference to parentPathArray
+                                               tmpPathArray = util.extend( [], parentPathArray );
+                                               tmpPathArray.push( key );
+
+                                               that.walkTheObject( key, value, masterVariable, tmpPathArray, action );
+                                       }
+                               }
+                       }
+               },
+
+               populateMissingTests: function () {
+                       var ct = this;
+                       util.each( ct.injectionTracker, function ( key ) {
+                               ct.hasTest( key );
+                       });
+               },
+
+               /**
+                * CompletenessTest.fn.hasTest
+                *
+                * Checks if the given method name (ie. 'my.foo.bar')
+                * was called during the test suite (as far as the tracker knows).
+                * If not it adds it to missingTests.
+                *
+                * @param fnName {String}
+                * @return {Boolean}
+                */
+               hasTest: function ( fnName ) {
+                       if ( !( fnName in this.methodCallTracker ) ) {
+                               this.missingTests[fnName] = true;
+                               return false;
+                       }
+                       return true;
+               },
+
+               /**
+                * CompletenessTest.fn.injectCheck
+                *
+                * Injects a function (such as a spy that updates methodCallTracker when
+                * it's called) inside another function.
+                *
+                * @param masterVariable {Object}
+                * @param objectPathArray {Array}
+                * @param injectFn {Function}
+                */
+               injectCheck: function ( masterVariable, objectPathArray, injectFn ) {
+                       var i, len, prev, memberName, lastMember,
+                               curr = masterVariable;
+
+                       // Get the object in question through the path from the master variable,
+                       // We can't pass the value directly because we need to re-define the object
+                       // member and keep references to the parent object, member name and member
+                       // value at all times.
+                       for ( i = 0, len = objectPathArray.length; i < len; i++ ) {
+                               memberName = objectPathArray[i];
+
+                               prev = curr;
+                               curr = prev[memberName];
+                               lastMember = memberName;
+                       }
+
+                       // Objects are by reference, members (unless objects) are not.
+                       prev[lastMember] = function () {
+                               injectFn();
+                               return curr.apply( this, arguments );
+                       };
+               }
+       };
+
+       /* Expose */
+       window.CompletenessTest = CompletenessTest;
+
+}( jQuery ) );
diff --git a/resources/src/jquery/jquery.spinner.css b/resources/src/jquery/jquery.spinner.css
new file mode 100644 (file)
index 0000000..a9e06db
--- /dev/null
@@ -0,0 +1,40 @@
+.mw-spinner {
+       background-color: transparent;
+       background-position: center center;
+       background-repeat: no-repeat;
+}
+
+.mw-spinner-small {
+       /* @embed */
+       background-image: url(images/spinner.gif);
+       height: 20px;
+       width: 20px;
+       /* Avoid issues with .mw-spinner-block when floated without width. */
+       min-width: 20px;
+}
+
+.mw-spinner-large {
+       /* @embed */
+       background-image: url(images/spinner-large.gif);
+       height: 32px;
+       width: 32px;
+       /* Avoid issues with .mw-spinner-block when floated without width. */
+       min-width: 32px;
+}
+
+.mw-spinner-block {
+       display: block;
+       /* This overrides width from .mw-spinner-large / .mw-spinner-small,
+        * This is where the min-width kicks in.
+        */
+       width: 100%;
+}
+
+.mw-spinner-inline {
+       display: inline-block;
+       vertical-align: middle;
+
+       /* IE < 8 */
+       zoom: 1;
+       *display: inline;
+}
diff --git a/resources/src/jquery/jquery.spinner.js b/resources/src/jquery/jquery.spinner.js
new file mode 100644 (file)
index 0000000..073fb3d
--- /dev/null
@@ -0,0 +1,112 @@
+/**
+ * jQuery Spinner
+ *
+ * Simple jQuery plugin to create, inject and remove spinners.
+ *
+ * @class jQuery.plugin.spinner
+ */
+( function ( $ ) {
+
+       // Default options for new spinners,
+       // stored outside the function to share between calls.
+       var defaults = {
+               id: undefined,
+               size: 'small',
+               type: 'inline'
+       };
+
+       $.extend({
+               /**
+                * Create a spinner element
+                *
+                * The argument is an object with options used to construct the spinner (see below).
+                *
+                * It is a good practice to keep a reference to the created spinner to be able to remove it
+                * later. Alternatively, one can use the 'id' option and #removeSpinner (but make sure to choose
+                * an id that's unlikely to cause conflicts, e.g. with extensions, gadgets or user scripts).
+                *
+                * CSS classes used:
+                *
+                * - .mw-spinner for every spinner
+                * - .mw-spinner-small / .mw-spinner-large for size
+                * - .mw-spinner-block / .mw-spinner-inline for display types
+                *
+                * Example:
+                *
+                *     // Create a large spinner reserving all available horizontal space.
+                *     var $spinner = $.createSpinner({ size: 'large', type: 'block' });
+                *     // Insert above page content.
+                *     $( '#mw-content-text' ).prepend( $spinner );
+                *
+                *     // Place a small inline spinner next to the "Save" button
+                *     var $spinner = $.createSpinner({ size: 'small', type: 'inline' });
+                *     // Alternatively, just `$.createSpinner();` as these are the default options.
+                *     $( '#wpSave' ).after( $spinner );
+                *
+                *     // The following two are equivalent:
+                *     $.createSpinner( 'magic' );
+                *     $.createSpinner({ id: 'magic' });
+                *
+                * @static
+                * @inheritable
+                * @param {Object|string} [opts] Options. If a string is given, it will be treated as the value
+                *   of the `id` option. If an object is given, the possible option keys are:
+                * @param {string} [opts.id] If given, spinner will be given an id of "mw-spinner-{id}".
+                * @param {string} [opts.size='small'] 'small' or 'large' for a 20-pixel or 32-pixel spinner.
+                * @param {string} [opts.type='inline'] 'inline' or 'block'. Inline creates an inline-block with
+                *   width and height equal to spinner size. Block is a block-level element with width 100%,
+                *   height equal to spinner size.
+                * @return {jQuery}
+                */
+               createSpinner: function ( opts ) {
+                       if ( opts !== undefined && $.type( opts ) !== 'object' ) {
+                               opts = {
+                                       id: opts
+                               };
+                       }
+
+                       opts = $.extend( {}, defaults, opts );
+
+                       var $spinner = $( '<div>', { 'class': 'mw-spinner', 'title': '...' } );
+                       if ( opts.id !== undefined ) {
+                               $spinner.attr( 'id', 'mw-spinner-' + opts.id );
+                       }
+
+                       $spinner.addClass( opts.size === 'large' ? 'mw-spinner-large' : 'mw-spinner-small' );
+                       $spinner.addClass( opts.type === 'block' ? 'mw-spinner-block' : 'mw-spinner-inline' );
+
+                       return $spinner;
+               },
+
+               /**
+                * Remove a spinner element
+                *
+                * @static
+                * @inheritable
+                * @param {string} id Id of the spinner, as passed to #createSpinner
+                * @return {jQuery} The (now detached) spinner element
+                */
+               removeSpinner: function ( id ) {
+                       return $( '#mw-spinner-' + id ).remove();
+               }
+       });
+
+       /**
+        * Inject a spinner after each element in the collection
+        *
+        * Inserts spinner as siblings (not children) of the target elements.
+        * Collection contents remain unchanged.
+        *
+        * @param {Object|string} [opts] See #createSpinner
+        * @return {jQuery}
+        */
+       $.fn.injectSpinner = function ( opts ) {
+               return this.after( $.createSpinner( opts ) );
+       };
+
+       /**
+        * @class jQuery
+        * @mixins jQuery.plugin.spinner
+        */
+
+}( jQuery ) );
diff --git a/resources/src/jquery/jquery.suggestions.css b/resources/src/jquery/jquery.suggestions.css
new file mode 100644 (file)
index 0000000..ea65946
--- /dev/null
@@ -0,0 +1,81 @@
+/* suggestions plugin */
+
+.suggestions {
+       overflow: hidden;
+       position: absolute;
+       top: 0;
+       left: 0;
+       width: 0;
+       border: none;
+       z-index: 1099;
+       padding: 0;
+       margin: -1px -1px 0 0;
+}
+
+/* IGNORED BY IE6 */
+html > body .suggestions {
+       margin: -1px 0 0 0;
+}
+
+.suggestions-special {
+       position: relative;
+       background-color: white;
+       cursor: pointer;
+       border: solid 1px #aaaaaa;
+       padding: 0;
+       margin: 0;
+       margin-top: -2px;
+       display: none;
+       padding: 0.25em 0.25em;
+       line-height: 1.25em;
+}
+
+.suggestions-results {
+       background-color: white;
+       cursor: pointer;
+       border: solid 1px #aaaaaa;
+       padding: 0;
+       margin: 0;
+}
+
+.suggestions-result {
+       color: black;
+       margin: 0;
+       line-height: 1.5em;
+       padding: 0.01em 0.25em;
+       text-align: left;
+       /* Apply ellipsis to suggestions */
+       overflow: hidden;
+       -o-text-overflow: ellipsis; /* Opera 9 to 10 */
+       text-overflow: ellipsis;
+       white-space: nowrap;
+}
+
+.suggestions-result-current {
+       background-color: #4C59A6;
+       color: white;
+}
+
+.suggestions-special .special-label {
+       color: gray;
+       text-align: left;
+}
+
+.suggestions-special .special-query {
+       color: black;
+       font-style: italic;
+       text-align: left;
+}
+
+.suggestions-special .special-hover {
+       background-color: silver;
+}
+
+.suggestions-result-current .special-label,
+.suggestions-result-current .special-query {
+       color: white;
+}
+
+.highlight {
+       font-weight: bold;
+}
diff --git a/resources/src/jquery/jquery.suggestions.js b/resources/src/jquery/jquery.suggestions.js
new file mode 100644 (file)
index 0000000..28c4731
--- /dev/null
@@ -0,0 +1,619 @@
+/**
+ * This plugin provides a generic way to add suggestions to a text box.
+ *
+ * Usage:
+ *
+ * Set options:
+ *             $( '#textbox' ).suggestions( { option1: value1, option2: value2 } );
+ *             $( '#textbox' ).suggestions( option, value );
+ * Get option:
+ *             value = $( '#textbox' ).suggestions( option );
+ * Initialize:
+ *             $( '#textbox' ).suggestions();
+ *
+ * Options:
+ *
+ * fetch(query): Callback that should fetch suggestions and set the suggestions property.
+ *      Executed in the context of the textbox
+ *             Type: Function
+ * cancel: Callback function to call when any pending asynchronous suggestions fetches
+ *      should be canceled. Executed in the context of the textbox
+ *             Type: Function
+ * special: Set of callbacks for rendering and selecting
+ *             Type: Object of Functions 'render' and 'select'
+ * result: Set of callbacks for rendering and selecting
+ *             Type: Object of Functions 'render' and 'select'
+ * $region: jQuery selection of element to place the suggestions below and match width of
+ *             Type: jQuery Object, Default: $(this)
+ * suggestions: Suggestions to display
+ *             Type: Array of strings
+ * maxRows: Maximum number of suggestions to display at one time
+ *             Type: Number, Range: 1 - 100, Default: 7
+ * delay: Number of ms to wait for the user to stop typing
+ *             Type: Number, Range: 0 - 1200, Default: 120
+ * submitOnClick: Whether to submit the form containing the textbox when a suggestion is clicked
+ *             Type: Boolean, Default: false
+ * maxExpandFactor: Maximum suggestions box width relative to the textbox width. If set
+ *      to e.g. 2, the suggestions box will never be grown beyond 2 times the width of the textbox.
+ *             Type: Number, Range: 1 - infinity, Default: 3
+ * expandFrom: Which direction to offset the suggestion box from.
+ *      Values 'start' and 'end' translate to left and right respectively depending on the
+ *      directionality of the current document, according to $( 'html' ).css( 'direction' ).
+ *      Type: String, default: 'auto', options: 'left', 'right', 'start', 'end', 'auto'.
+ * positionFromLeft: Sets expandFrom=left, for backwards compatibility
+ *             Type: Boolean, Default: true
+ * highlightInput: Whether to hightlight matched portions of the input or not
+ *             Type: Boolean, Default: false
+ */
+( function ( $ ) {
+
+$.suggestions = {
+       /**
+        * Cancel any delayed maybeFetch() call and callback the context so
+        * they can cancel any async fetching if they use AJAX or something.
+        */
+       cancel: function ( context ) {
+               if ( context.data.timerID !== null ) {
+                       clearTimeout( context.data.timerID );
+               }
+               if ( $.isFunction( context.config.cancel ) ) {
+                       context.config.cancel.call( context.data.$textbox );
+               }
+       },
+
+       /**
+        * Hide the element with suggestions and clean up some state.
+        */
+       hide: function ( context ) {
+               // Remove any highlights, including on "special" items
+               context.data.$container.find( '.suggestions-result-current' ).removeClass( 'suggestions-result-current' );
+               // Hide the container
+               context.data.$container.hide();
+       },
+
+       /**
+        * Restore the text the user originally typed in the textbox, before it
+        * was overwritten by highlight(). This restores the value the currently
+        * displayed suggestions are based on, rather than the value just before
+        * highlight() overwrote it; the former is arguably slightly more sensible.
+        */
+       restore: function ( context ) {
+               context.data.$textbox.val( context.data.prevText );
+       },
+
+       /**
+        * Ask the user-specified callback for new suggestions. Any previous delayed
+        * call to this function still pending will be canceled. If the value in the
+        * textbox is empty or hasn't changed since the last time suggestions were fetched,
+        * this function does nothing.
+        * @param {Boolean} delayed Whether or not to delay this by the currently configured amount of time
+        */
+       update: function ( context, delayed ) {
+               function maybeFetch() {
+                       // Only fetch if the value in the textbox changed and is not empty, or if the results were hidden
+                       // if the textbox is empty then clear the result div, but leave other settings intouched
+                       if ( context.data.$textbox.val().length === 0 ) {
+                               $.suggestions.hide( context );
+                               context.data.prevText = '';
+                       } else if (
+                               context.data.$textbox.val() !== context.data.prevText ||
+                               !context.data.$container.is( ':visible' )
+                       ) {
+                               if ( typeof context.config.fetch === 'function' ) {
+                                       context.data.prevText = context.data.$textbox.val();
+                                       context.config.fetch.call( context.data.$textbox, context.data.$textbox.val() );
+                               }
+                       }
+
+                       // Always update special rendering
+                       $.suggestions.special( context );
+               }
+
+               // Cancels any delayed maybeFetch call, and invokes context.config.cancel.
+               $.suggestions.cancel( context );
+
+               if ( delayed ) {
+                       // To avoid many started/aborted requests while typing, we're gonna take a short
+                       // break before trying to fetch data.
+                       context.data.timerID = setTimeout( maybeFetch, context.config.delay );
+               } else {
+                       maybeFetch();
+               }
+       },
+
+       special: function ( context ) {
+               // Allow custom rendering - but otherwise don't do any rendering
+               if ( typeof context.config.special.render === 'function' ) {
+                       // Wait for the browser to update the value
+                       setTimeout( function () {
+                               // Render special
+                               var $special = context.data.$container.find( '.suggestions-special' );
+                               context.config.special.render.call( $special, context.data.$textbox.val(), context );
+                       }, 1 );
+               }
+       },
+
+       /**
+        * Sets the value of a property, and updates the widget accordingly
+        * @param property String Name of property
+        * @param value Mixed Value to set property with
+        */
+       configure: function ( context, property, value ) {
+               var newCSS,
+                       $result, $results, childrenWidth,
+                       i, expWidth, maxWidth, text;
+
+               // Validate creation using fallback values
+               switch ( property ) {
+                       case 'fetch':
+                       case 'cancel':
+                       case 'special':
+                       case 'result':
+                       case '$region':
+                       case 'expandFrom':
+                               context.config[property] = value;
+                               break;
+                       case 'suggestions':
+                               context.config[property] = value;
+                               // Update suggestions
+                               if ( context.data !== undefined ) {
+                                       if ( context.data.$textbox.val().length === 0 ) {
+                                               // Hide the div when no suggestion exist
+                                               $.suggestions.hide( context );
+                                       } else {
+                                               // Rebuild the suggestions list
+                                               context.data.$container.show();
+                                               // Update the size and position of the list
+                                               newCSS = {
+                                                       top: context.config.$region.offset().top + context.config.$region.outerHeight(),
+                                                       bottom: 'auto',
+                                                       width: context.config.$region.outerWidth(),
+                                                       height: 'auto'
+                                               };
+
+                                               // Process expandFrom, after this it is set to left or right.
+                                               context.config.expandFrom = ( function ( expandFrom ) {
+                                                       var regionWidth, docWidth, regionCenter, docCenter,
+                                                               docDir = $( document.documentElement ).css( 'direction' ),
+                                                               $region = context.config.$region;
+
+                                                       // Backwards compatible
+                                                       if ( context.config.positionFromLeft ) {
+                                                               expandFrom = 'left';
+
+                                                       // Catch invalid values, default to 'auto'
+                                                       } else if ( $.inArray( expandFrom, ['left', 'right', 'start', 'end', 'auto'] ) === -1 ) {
+                                                               expandFrom = 'auto';
+                                                       }
+
+                                                       if ( expandFrom === 'auto' ) {
+                                                               if ( $region.data( 'searchsuggest-expand-dir' ) ) {
+                                                                       // If the markup explicitly contains a direction, use it.
+                                                                       expandFrom = $region.data( 'searchsuggest-expand-dir' );
+                                                               } else {
+                                                                       regionWidth = $region.outerWidth();
+                                                                       docWidth = $( document ).width();
+                                                                       if ( ( regionWidth / docWidth  ) > 0.85 ) {
+                                                                               // If the input size takes up more than 85% of the document horizontally
+                                                                               // expand the suggestions to the writing direction's native end.
+                                                                               expandFrom = 'start';
+                                                                       } else {
+                                                                               // Calculate the center points of the input and document
+                                                                               regionCenter = $region.offset().left + regionWidth / 2;
+                                                                               docCenter = docWidth / 2;
+                                                                               if ( Math.abs( regionCenter - docCenter ) / docCenter < 0.10 ) {
+                                                                                       // If the input's center is within 10% of the document center
+                                                                                       // use the writing direction's native end.
+                                                                                       expandFrom = 'start';
+                                                                               } else {
+                                                                                       // Otherwise expand the input from the closest side of the page,
+                                                                                       // towards the side of the page with the most free open space
+                                                                                       expandFrom = regionCenter > docCenter ? 'right' : 'left';
+                                                                               }
+                                                                       }
+                                                               }
+                                                       }
+
+                                                       if ( expandFrom === 'start' ) {
+                                                               expandFrom = docDir === 'rtl' ? 'right': 'left';
+
+                                                       } else if ( expandFrom === 'end' ) {
+                                                               expandFrom = docDir === 'rtl' ? 'left': 'right';
+                                                       }
+
+                                                       return expandFrom;
+
+                                               }( context.config.expandFrom ) );
+
+                                               if ( context.config.expandFrom === 'left' ) {
+                                                       // Expand from left
+                                                       newCSS.left = context.config.$region.offset().left;
+                                                       newCSS.right = 'auto';
+                                               } else {
+                                                       // Expand from right
+                                                       newCSS.left = 'auto';
+                                                       newCSS.right = $( document ).width() - ( context.config.$region.offset().left + context.config.$region.outerWidth() );
+                                               }
+
+                                               context.data.$container.css( newCSS );
+                                               $results = context.data.$container.children( '.suggestions-results' );
+                                               $results.empty();
+                                               expWidth = -1;
+                                               for ( i = 0; i < context.config.suggestions.length; i++ ) {
+                                                       /*jshint loopfunc:true */
+                                                       text = context.config.suggestions[i];
+                                                       $result = $( '<div>' )
+                                                               .addClass( 'suggestions-result' )
+                                                               .attr( 'rel', i )
+                                                               .data( 'text', context.config.suggestions[i] )
+                                                               .mousemove( function () {
+                                                                       context.data.selectedWithMouse = true;
+                                                                       $.suggestions.highlight(
+                                                                               context,
+                                                                               $(this).closest( '.suggestions-results .suggestions-result' ),
+                                                                               false
+                                                                       );
+                                                               } )
+                                                               .appendTo( $results );
+                                                       // Allow custom rendering
+                                                       if ( typeof context.config.result.render === 'function' ) {
+                                                               context.config.result.render.call( $result, context.config.suggestions[i], context );
+                                                       } else {
+                                                               $result.text( text );
+                                                       }
+
+                                                       if ( context.config.highlightInput ) {
+                                                               $result.highlightText( context.data.prevText );
+                                                       }
+
+                                                       // Widen results box if needed
+                                                       // New width is only calculated here, applied later
+                                                       childrenWidth = $result.children().outerWidth();
+                                                       if ( childrenWidth > $result.width() && childrenWidth > expWidth ) {
+                                                               // factor in any padding, margin, or border space on the parent
+                                                               expWidth = childrenWidth + ( context.data.$container.width() - $result.width() );
+                                                       }
+                                               }
+
+                                               // Apply new width for results box, if any
+                                               if ( expWidth > context.data.$container.width() ) {
+                                                       maxWidth = context.config.maxExpandFactor * context.data.$textbox.width();
+                                                       context.data.$container.width( Math.min( expWidth, maxWidth ) );
+                                               }
+                                       }
+                               }
+                               break;
+                       case 'maxRows':
+                               context.config[property] = Math.max( 1, Math.min( 100, value ) );
+                               break;
+                       case 'delay':
+                               context.config[property] = Math.max( 0, Math.min( 1200, value ) );
+                               break;
+                       case 'maxExpandFactor':
+                               context.config[property] = Math.max( 1, value );
+                               break;
+                       case 'submitOnClick':
+                       case 'positionFromLeft':
+                       case 'highlightInput':
+                               context.config[property] = value ? true : false;
+                               break;
+               }
+       },
+
+       /**
+        * Highlight a result in the results table
+        * @param result <tr> to highlight: jQuery object, or 'prev' or 'next'
+        * @param updateTextbox If true, put the suggestion in the textbox
+        */
+       highlight: function ( context, result, updateTextbox ) {
+               var selected = context.data.$container.find( '.suggestions-result-current' );
+               if ( !result.get || selected.get( 0 ) !== result.get( 0 ) ) {
+                       if ( result === 'prev' ) {
+                               if( selected.hasClass( 'suggestions-special' ) ) {
+                                       result = context.data.$container.find( '.suggestions-result:last' );
+                               } else {
+                                       result = selected.prev();
+                                       if ( !( result.length && result.hasClass( 'suggestions-result' ) ) ) {
+                                               // there is something in the DOM between selected element and the wrapper, bypass it
+                                               result = selected.parents( '.suggestions-results > *' ).prev().find( '.suggestions-result' ).eq(0);
+                                       }
+
+                                       if ( selected.length === 0 ) {
+                                               // we are at the beginning, so lets jump to the last item
+                                               if ( context.data.$container.find( '.suggestions-special' ).html() !== '' ) {
+                                                       result = context.data.$container.find( '.suggestions-special' );
+                                               } else {
+                                                       result = context.data.$container.find( '.suggestions-results .suggestions-result:last' );
+                                               }
+                                       }
+                               }
+                       } else if ( result === 'next' ) {
+                               if ( selected.length === 0 ) {
+                                       // No item selected, go to the first one
+                                       result = context.data.$container.find( '.suggestions-results .suggestions-result:first' );
+                                       if ( result.length === 0 && context.data.$container.find( '.suggestions-special' ).html() !== '' ) {
+                                               // No suggestion exists, go to the special one directly
+                                               result = context.data.$container.find( '.suggestions-special' );
+                                       }
+                               } else {
+                                       result = selected.next();
+                                       if ( !( result.length && result.hasClass( 'suggestions-result' ) ) ) {
+                                               // there is something in the DOM between selected element and the wrapper, bypass it
+                                               result = selected.parents( '.suggestions-results > *' ).next().find( '.suggestions-result' ).eq(0);
+                                       }
+
+                                       if ( selected.hasClass( 'suggestions-special' ) ) {
+                                               result = $( [] );
+                                       } else if (
+                                               result.length === 0 &&
+                                               context.data.$container.find( '.suggestions-special' ).html() !== ''
+                                       ) {
+                                               // We were at the last item, jump to the specials!
+                                               result = context.data.$container.find( '.suggestions-special' );
+                                       }
+                               }
+                       }
+                       selected.removeClass( 'suggestions-result-current' );
+                       result.addClass( 'suggestions-result-current' );
+               }
+               if ( updateTextbox ) {
+                       if ( result.length === 0 || result.is( '.suggestions-special' ) ) {
+                               $.suggestions.restore( context );
+                       } else {
+                               context.data.$textbox.val( result.data( 'text' ) );
+                               // .val() doesn't call any event handlers, so
+                               // let the world know what happened
+                               context.data.$textbox.change();
+                       }
+                       context.data.$textbox.trigger( 'change' );
+               }
+       },
+
+       /**
+        * Respond to keypress event
+        * @param key Integer Code of key pressed
+        */
+       keypress: function ( e, context, key ) {
+               var selected,
+                       wasVisible = context.data.$container.is( ':visible' ),
+                       preventDefault = false;
+
+               switch ( key ) {
+                       // Arrow down
+                       case 40:
+                               if ( wasVisible ) {
+                                       $.suggestions.highlight( context, 'next', true );
+                                       context.data.selectedWithMouse = false;
+                               } else {
+                                       $.suggestions.update( context, false );
+                               }
+                               preventDefault = true;
+                               break;
+                       // Arrow up
+                       case 38:
+                               if ( wasVisible ) {
+                                       $.suggestions.highlight( context, 'prev', true );
+                                       context.data.selectedWithMouse = false;
+                               }
+                               preventDefault = wasVisible;
+                               break;
+                       // Escape
+                       case 27:
+                               $.suggestions.hide( context );
+                               $.suggestions.restore( context );
+                               $.suggestions.cancel( context );
+                               context.data.$textbox.trigger( 'change' );
+                               preventDefault = wasVisible;
+                               break;
+                       // Enter
+                       case 13:
+                               preventDefault = wasVisible;
+                               selected = context.data.$container.find( '.suggestions-result-current' );
+                               $.suggestions.hide( context );
+                               if ( selected.length === 0 || context.data.selectedWithMouse ) {
+                                       // If nothing is selected or if something was selected with the mouse
+                                       // cancel any current requests and allow the form to be submitted
+                                       // (simply don't prevent default behavior).
+                                       $.suggestions.cancel( context );
+                                       preventDefault = false;
+                               } else if ( selected.is( '.suggestions-special' ) ) {
+                                       if ( typeof context.config.special.select === 'function' ) {
+                                               // Allow the callback to decide whether to prevent default or not
+                                               if ( context.config.special.select.call( selected, context.data.$textbox ) === true ) {
+                                                       preventDefault = false;
+                                               }
+                                       }
+                               } else {
+                                       $.suggestions.highlight( context, selected, true );
+
+                                       if ( typeof context.config.result.select === 'function' ) {
+                                               // Allow the callback to decide whether to prevent default or not
+                                               if ( context.config.result.select.call( selected, context.data.$textbox ) === true ) {
+                                                       preventDefault = false;
+                                               }
+                                       }
+                               }
+                               break;
+                       default:
+                               $.suggestions.update( context, true );
+                               break;
+               }
+               if ( preventDefault ) {
+                       e.preventDefault();
+                       e.stopPropagation();
+               }
+       }
+};
+$.fn.suggestions = function () {
+
+       // Multi-context fields
+       var returnValue,
+               args = arguments;
+
+       $(this).each( function () {
+               var context, key;
+
+               /* Construction / Loading */
+
+               context = $(this).data( 'suggestions-context' );
+               if ( context === undefined || context === null ) {
+                       context = {
+                               config: {
+                                       fetch: function () {},
+                                       cancel: function () {},
+                                       special: {},
+                                       result: {},
+                                       $region: $(this),
+                                       suggestions: [],
+                                       maxRows: 7,
+                                       delay: 120,
+                                       submitOnClick: false,
+                                       maxExpandFactor: 3,
+                                       expandFrom: 'auto',
+                                       highlightInput: false
+                               }
+                       };
+               }
+
+               /* API */
+
+               // Handle various calling styles
+               if ( args.length > 0 ) {
+                       if ( typeof args[0] === 'object' ) {
+                               // Apply set of properties
+                               for ( key in args[0] ) {
+                                       $.suggestions.configure( context, key, args[0][key] );
+                               }
+                       } else if ( typeof args[0] === 'string' ) {
+                               if ( args.length > 1 ) {
+                                       // Set property values
+                                       $.suggestions.configure( context, args[0], args[1] );
+                               } else if ( returnValue === null || returnValue === undefined ) {
+                                       // Get property values, but don't give access to internal data - returns only the first
+                                       returnValue = ( args[0] in context.config ? undefined : context.config[args[0]] );
+                               }
+                       }
+               }
+
+               /* Initialization */
+
+               if ( context.data === undefined ) {
+                       context.data = {
+                               // ID of running timer
+                               timerID: null,
+
+                               // Text in textbox when suggestions were last fetched
+                               prevText: null,
+
+                               // Number of results visible without scrolling
+                               visibleResults: 0,
+
+                               // Suggestion the last mousedown event occurred on
+                               mouseDownOn: $( [] ),
+                               $textbox: $(this),
+                               selectedWithMouse: false
+                       };
+
+                       context.data.$container = $( '<div>' )
+                               .css( 'display', 'none' )
+                               .addClass( 'suggestions' )
+                               .append(
+                                       $( '<div>' ).addClass( 'suggestions-results' )
+                                               // Can't use click() because the container div is hidden when the
+                                               // textbox loses focus. Instead, listen for a mousedown followed
+                                               // by a mouseup on the same div.
+                                               .mousedown( function ( e ) {
+                                                       context.data.mouseDownOn = $( e.target ).closest( '.suggestions-results .suggestions-result' );
+                                               } )
+                                               .mouseup( function ( e ) {
+                                                       var $result = $( e.target ).closest( '.suggestions-results .suggestions-result' ),
+                                                               $other = context.data.mouseDownOn;
+
+                                                       context.data.mouseDownOn = $( [] );
+                                                       if ( $result.get( 0 ) !== $other.get( 0 ) ) {
+                                                               return;
+                                                       }
+                                                       // do not interfere with non-left clicks or if modifier keys are pressed (e.g. ctrl-click)
+                                                       if ( !( e.which !== 1 || e.altKey || e.ctrlKey || e.shiftKey || e.metaKey ) ) {
+                                                               $.suggestions.highlight( context, $result, true );
+                                                               $.suggestions.hide( context );
+                                                               if ( typeof context.config.result.select === 'function' ) {
+                                                                       context.config.result.select.call( $result, context.data.$textbox );
+                                                               }
+                                                       }
+                                                       // but still restore focus to the textbox, so that the suggestions will be hidden properly
+                                                       context.data.$textbox.focus();
+                                               } )
+                               )
+                               .append(
+                                       $( '<div>' ).addClass( 'suggestions-special' )
+                                               // Can't use click() because the container div is hidden when the
+                                               // textbox loses focus. Instead, listen for a mousedown followed
+                                               // by a mouseup on the same div.
+                                               .mousedown( function ( e ) {
+                                                       context.data.mouseDownOn = $( e.target ).closest( '.suggestions-special' );
+                                               } )
+                                               .mouseup( function ( e ) {
+                                                       var $special = $( e.target ).closest( '.suggestions-special' ),
+                                                               $other = context.data.mouseDownOn;
+
+                                                       context.data.mouseDownOn = $( [] );
+                                                       if ( $special.get( 0 ) !== $other.get( 0 ) ) {
+                                                               return;
+                                                       }
+                                                       // do not interfere with non-left clicks or if modifier keys are pressed (e.g. ctrl-click)
+                                                       if ( !( e.which !== 1 || e.altKey || e.ctrlKey || e.shiftKey || e.metaKey ) ) {
+                                                               $.suggestions.hide( context );
+                                                               if ( typeof context.config.special.select === 'function' ) {
+                                                                       context.config.special.select.call( $special, context.data.$textbox );
+                                                               }
+                                                       }
+                                                       // but still restore focus to the textbox, so that the suggestions will be hidden properly
+                                                       context.data.$textbox.focus();
+                                               } )
+                                               .mousemove( function ( e ) {
+                                                       context.data.selectedWithMouse = true;
+                                                       $.suggestions.highlight(
+                                                               context, $( e.target ).closest( '.suggestions-special' ), false
+                                                       );
+                                               } )
+                               )
+                               .appendTo( $( 'body' ) );
+
+                       $(this)
+                               // Stop browser autocomplete from interfering
+                               .attr( 'autocomplete', 'off')
+                               .keydown( function ( e ) {
+                                       // Store key pressed to handle later
+                                       context.data.keypressed = e.which;
+                                       context.data.keypressedCount = 0;
+                               } )
+                               .keypress( function ( e ) {
+                                       context.data.keypressedCount++;
+                                       $.suggestions.keypress( e, context, context.data.keypressed );
+                               } )
+                               .keyup( function ( e ) {
+                                       // Some browsers won't throw keypress() for arrow keys. If we got a keydown and a keyup without a
+                                       // keypress in between, solve it
+                                       if ( context.data.keypressedCount === 0 ) {
+                                               $.suggestions.keypress( e, context, context.data.keypressed );
+                                       }
+                               } )
+                               .blur( function () {
+                                       // When losing focus because of a mousedown
+                                       // on a suggestion, don't hide the suggestions
+                                       if ( context.data.mouseDownOn.length > 0 ) {
+                                               return;
+                                       }
+                                       $.suggestions.hide( context );
+                                       $.suggestions.cancel( context );
+                               } );
+               }
+
+               // Store the context for next time
+               $(this).data( 'suggestions-context', context );
+       } );
+       return returnValue !== undefined ? returnValue : $(this);
+};
+
+}( jQuery ) );
diff --git a/resources/src/jquery/jquery.tabIndex.js b/resources/src/jquery/jquery.tabIndex.js
new file mode 100644 (file)
index 0000000..cdae0ba
--- /dev/null
@@ -0,0 +1,52 @@
+/**
+ * jQuery tabIndex
+ */
+( function ( $ ) {
+
+       /**
+        * Finds the lowerst tabindex in use within a selection
+        *
+        * @return number Lowest tabindex on the page
+        */
+       $.fn.firstTabIndex = function () {
+               var minTabIndex = null;
+               $(this).find( '[tabindex]' ).each( function () {
+                       var tabIndex = parseInt( $(this).prop( 'tabindex' ), 10 );
+                       // In IE6/IE7 the above jQuery selector returns all elements,
+                       // becuase it has a default value for tabIndex in IE6/IE7 of 0
+                       // (rather than null/undefined). Therefore check "> 0" as well.
+                       // Under IE7 under Windows NT 5.2 is also capable of returning NaN.
+                       if ( tabIndex > 0 && !isNaN( tabIndex ) ) {
+                               // Initial value
+                               if ( minTabIndex === null ) {
+                                       minTabIndex = tabIndex;
+                               } else if ( tabIndex < minTabIndex ) {
+                                       minTabIndex = tabIndex;
+                               }
+                       }
+               } );
+               return minTabIndex;
+       };
+
+       /**
+        * Finds the highest tabindex in use within a selection
+        *
+        * @return number Highest tabindex on the page
+        */
+       $.fn.lastTabIndex = function () {
+               var maxTabIndex = null;
+               $(this).find( '[tabindex]' ).each( function () {
+                       var tabIndex = parseInt( $(this).prop( 'tabindex' ), 10 );
+                       if ( tabIndex > 0 && !isNaN( tabIndex ) ) {
+                               // Initial value
+                               if ( maxTabIndex === null ) {
+                                       maxTabIndex = tabIndex;
+                               } else if ( tabIndex > maxTabIndex ) {
+                                       maxTabIndex = tabIndex;
+                               }
+                       }
+               } );
+               return maxTabIndex;
+       };
+
+}( jQuery ) );
diff --git a/resources/src/jquery/jquery.tablesorter.css b/resources/src/jquery/jquery.tablesorter.css
new file mode 100644 (file)
index 0000000..a88acc0
--- /dev/null
@@ -0,0 +1,17 @@
+/* Table Sorting */
+table.jquery-tablesorter th.headerSort {
+       /* @embed */
+       background-image: url(images/sort_both.gif);
+       cursor: pointer;
+       background-repeat: no-repeat;
+       background-position: center right;
+       padding-right: 21px;
+}
+table.jquery-tablesorter th.headerSortUp {
+       /* @embed */
+       background-image: url(images/sort_up.gif);
+}
+table.jquery-tablesorter th.headerSortDown {
+       /* @embed */
+       background-image: url(images/sort_down.gif);
+}
diff --git a/resources/src/jquery/jquery.tablesorter.js b/resources/src/jquery/jquery.tablesorter.js
new file mode 100644 (file)
index 0000000..af0d897
--- /dev/null
@@ -0,0 +1,1154 @@
+/**
+ * TableSorter for MediaWiki
+ *
+ * Written 2011 Leo Koppelkamm
+ * Based on tablesorter.com plugin, written (c) 2007 Christian Bach.
+ *
+ * Dual licensed under the MIT and GPL licenses:
+ * http://www.opensource.org/licenses/mit-license.php
+ * http://www.gnu.org/licenses/gpl.html
+ *
+ * Depends on mw.config (wgDigitTransformTable, wgDefaultDateFormat, wgContentLanguage)
+ * and mw.language.months.
+ *
+ * Uses 'tableSorterCollation' in mw.config (if available)
+ */
+/**
+ *
+ * @description Create a sortable table with multi-column sorting capabilitys
+ *
+ * @example $( 'table' ).tablesorter();
+ * @desc Create a simple tablesorter interface.
+ *
+ * @example $( 'table' ).tablesorter( { sortList: [ { 0: 'desc' }, { 1: 'asc' } ] } );
+ * @desc Create a tablesorter interface initially sorting on the first and second column.
+ *
+ * @option String cssHeader ( optional ) A string of the class name to be appended
+ *         to sortable tr elements in the thead of the table. Default value:
+ *         "header"
+ *
+ * @option String cssAsc ( optional ) A string of the class name to be appended to
+ *         sortable tr elements in the thead on a ascending sort. Default value:
+ *         "headerSortUp"
+ *
+ * @option String cssDesc ( optional ) A string of the class name to be appended
+ *         to sortable tr elements in the thead on a descending sort. Default
+ *         value: "headerSortDown"
+ *
+ * @option String sortInitialOrder ( optional ) A string of the inital sorting
+ *         order can be asc or desc. Default value: "asc"
+ *
+ * @option String sortMultisortKey ( optional ) A string of the multi-column sort
+ *         key. Default value: "shiftKey"
+ *
+ * @option Boolean sortLocaleCompare ( optional ) Boolean flag indicating whatever
+ *         to use String.localeCampare method or not. Set to false.
+ *
+ * @option Boolean cancelSelection ( optional ) Boolean flag indicating if
+ *         tablesorter should cancel selection of the table headers text.
+ *         Default value: true
+ *
+ * @option Array sortList ( optional ) An array containing objects specifying sorting.
+ *         By passing more than one object, multi-sorting will be applied. Object structure:
+ *         { <Integer column index>: <String 'asc' or 'desc'> }
+ *         Default value: []
+ *
+ * @option Boolean debug ( optional ) Boolean flag indicating if tablesorter
+ *         should display debuging information usefull for development.
+ *
+ * @event sortEnd.tablesorter: Triggered as soon as any sorting has been applied.
+ *
+ * @type jQuery
+ *
+ * @name tablesorter
+ *
+ * @cat Plugins/Tablesorter
+ *
+ * @author Christian Bach/christian.bach@polyester.se
+ */
+
+( function ( $, mw ) {
+       /* Local scope */
+
+       var ts,
+               parsers = [];
+
+       /* Parser utility functions */
+
+       function getParserById( name ) {
+               var i,
+                       len = parsers.length;
+               for ( i = 0; i < len; i++ ) {
+                       if ( parsers[i].id.toLowerCase() === name.toLowerCase() ) {
+                               return parsers[i];
+                       }
+               }
+               return false;
+       }
+
+       function getElementSortKey( node ) {
+               var $node = $( node ),
+                       // Use data-sort-value attribute.
+                       // Use data() instead of attr() so that live value changes
+                       // are processed as well (bug 38152).
+                       data = $node.data( 'sortValue' );
+
+               if ( data !== null && data !== undefined ) {
+                       // Cast any numbers or other stuff to a string, methods
+                       // like charAt, toLowerCase and split are expected.
+                       return String( data );
+               } else {
+                       if ( !node ) {
+                               return $node.text();
+                       } else if ( node.tagName.toLowerCase() === 'img' ) {
+                               return $node.attr( 'alt' ) || ''; // handle undefined alt
+                       } else {
+                               return $.map( $.makeArray( node.childNodes ), function( elem ) {
+                                       // 1 is for document.ELEMENT_NODE (the constant is undefined on old browsers)
+                                       if ( elem.nodeType === 1 ) {
+                                               return getElementSortKey( elem );
+                                       } else {
+                                               return $.text( elem );
+                                       }
+                               } ).join( '' );
+                       }
+               }
+       }
+
+       function detectParserForColumn( table, rows, cellIndex ) {
+               var l = parsers.length,
+                       nodeValue,
+                       // Start with 1 because 0 is the fallback parser
+                       i = 1,
+                       rowIndex = 0,
+                       concurrent = 0,
+                       needed = ( rows.length > 4 ) ? 5 : rows.length;
+
+               while ( i < l ) {
+                       if ( rows[rowIndex] && rows[rowIndex].cells[cellIndex] ) {
+                               nodeValue = $.trim( getElementSortKey( rows[rowIndex].cells[cellIndex] ) );
+                       } else {
+                               nodeValue = '';
+                       }
+
+                       if ( nodeValue !== '') {
+                               if ( parsers[i].is( nodeValue, table ) ) {
+                                       concurrent++;
+                                       rowIndex++;
+                                       if ( concurrent >= needed ) {
+                                               // Confirmed the parser for multiple cells, let's return it
+                                               return parsers[i];
+                                       }
+                               } else {
+                                       // Check next parser, reset rows
+                                       i++;
+                                       rowIndex = 0;
+                                       concurrent = 0;
+                               }
+                       } else {
+                               // Empty cell
+                               rowIndex++;
+                               if ( rowIndex > rows.length ) {
+                                       rowIndex = 0;
+                                       i++;
+                               }
+                       }
+               }
+
+               // 0 is always the generic parser (text)
+               return parsers[0];
+       }
+
+       function buildParserCache( table, $headers ) {
+               var rows = table.tBodies[0].rows,
+                       sortType,
+                       parsers = [];
+
+               if ( rows[0] ) {
+
+                       var cells = rows[0].cells,
+                               len = cells.length,
+                               i, parser;
+
+                       for ( i = 0; i < len; i++ ) {
+                               parser = false;
+                               sortType = $headers.eq( i ).data( 'sortType' );
+                               if ( sortType !== undefined ) {
+                                       parser = getParserById( sortType );
+                               }
+
+                               if ( parser === false ) {
+                                       parser = detectParserForColumn( table, rows, i );
+                               }
+
+                               parsers.push( parser );
+                       }
+               }
+               return parsers;
+       }
+
+       /* Other utility functions */
+
+       function buildCache( table ) {
+               var totalRows = ( table.tBodies[0] && table.tBodies[0].rows.length ) || 0,
+                       totalCells = ( table.tBodies[0].rows[0] && table.tBodies[0].rows[0].cells.length ) || 0,
+                       parsers = table.config.parsers,
+                       cache = {
+                               row: [],
+                               normalized: []
+                       };
+
+               for ( var i = 0; i < totalRows; ++i ) {
+
+                       // Add the table data to main data array
+                       var $row = $( table.tBodies[0].rows[i] ),
+                               cols = [];
+
+                       // if this is a child row, add it to the last row's children and
+                       // continue to the next row
+                       if ( $row.hasClass( table.config.cssChildRow ) ) {
+                               cache.row[cache.row.length - 1] = cache.row[cache.row.length - 1].add( $row );
+                               // go to the next for loop
+                               continue;
+                       }
+
+                       cache.row.push( $row );
+
+                       for ( var j = 0; j < totalCells; ++j ) {
+                               cols.push( parsers[j].format( getElementSortKey( $row[0].cells[j] ), table, $row[0].cells[j] ) );
+                       }
+
+                       cols.push( cache.normalized.length ); // add position for rowCache
+                       cache.normalized.push( cols );
+                       cols = null;
+               }
+
+               return cache;
+       }
+
+       function appendToTable( table, cache ) {
+               var i, pos, l, j,
+                       row = cache.row,
+                       normalized = cache.normalized,
+                       totalRows = normalized.length,
+                       checkCell = ( normalized[0].length - 1 ),
+                       fragment = document.createDocumentFragment();
+
+               for ( i = 0; i < totalRows; i++ ) {
+                       pos = normalized[i][checkCell];
+
+                       l = row[pos].length;
+
+                       for ( j = 0; j < l; j++ ) {
+                               fragment.appendChild( row[pos][j] );
+                       }
+
+               }
+               table.tBodies[0].appendChild( fragment );
+
+               $( table ).trigger( 'sortEnd.tablesorter' );
+       }
+
+       /**
+        * Find all header rows in a thead-less table and put them in a <thead> tag.
+        * This only treats a row as a header row if it contains only <th>s (no <td>s)
+        * and if it is preceded entirely by header rows. The algorithm stops when
+        * it encounters the first non-header row.
+        *
+        * After this, it will look at all rows at the bottom for footer rows
+        * And place these in a tfoot using similar rules.
+        * @param $table jQuery object for a <table>
+        */
+       function emulateTHeadAndFoot( $table ) {
+               var $thead, $tfoot, i, len,
+                       $rows = $table.find( '> tbody > tr' );
+               if ( !$table.get(0).tHead ) {
+                       $thead = $( '<thead>' );
+                       $rows.each( function () {
+                               if ( $(this).children( 'td' ).length ) {
+                                       // This row contains a <td>, so it's not a header row
+                                       // Stop here
+                                       return false;
+                               }
+                               $thead.append( this );
+                       } );
+                       $table.find(' > tbody:first').before( $thead );
+               }
+               if ( !$table.get(0).tFoot ) {
+                       $tfoot = $( '<tfoot>' );
+                       len = $rows.length;
+                       for ( i = len - 1; i >= 0; i-- ) {
+                               if ( $( $rows[i] ).children( 'td' ).length ){
+                                       break;
+                               }
+                               $tfoot.prepend( $( $rows[i] ));
+                       }
+                       $table.append( $tfoot );
+               }
+       }
+
+       function buildHeaders( table, msg ) {
+               var maxSeen = 0,
+                       colspanOffset = 0,
+                       columns,
+                       i,
+                       $tableHeaders = $( [] ),
+                       $tableRows = $( 'thead:eq(0) > tr', table );
+               if ( $tableRows.length <= 1 ) {
+                       $tableHeaders = $tableRows.children( 'th' );
+               } else {
+                       var rowspan,
+                               colspan,
+                               headerCount,
+                               longestTR,
+                               matrixRowIndex,
+                               matrixColumnIndex,
+                               exploded = [];
+
+                       // Loop through all the dom cells of the thead
+                       $tableRows.each( function ( rowIndex, row ) {
+                               $.each( row.cells, function( columnIndex, cell ) {
+                                       rowspan = Number( cell.rowSpan );
+                                       colspan = Number( cell.colSpan );
+
+                                       // Skip the spots in the exploded matrix that are already filled
+                                       while ( exploded[rowIndex] && exploded[rowIndex][columnIndex] !== undefined ) {
+                                               ++columnIndex;
+                                       }
+
+                                       // Find the actual dimensions of the thead, by placing each cell
+                                       // in the exploded matrix rowspan times colspan times, with the proper offsets
+                                       for ( matrixColumnIndex = columnIndex; matrixColumnIndex < columnIndex + colspan; ++matrixColumnIndex ) {
+                                               for ( matrixRowIndex = rowIndex; matrixRowIndex < rowIndex + rowspan; ++matrixRowIndex ) {
+                                                       if ( !exploded[matrixRowIndex] ) {
+                                                               exploded[matrixRowIndex] = [];
+                                                       }
+                                                       exploded[matrixRowIndex][matrixColumnIndex] = cell;
+                                               }
+                                       }
+                               } );
+                       } );
+                       // We want to find the row that has the most columns (ignoring colspan)
+                       $.each( exploded, function ( index, cellArray ) {
+                               headerCount = $.unique( $(cellArray) ).length;
+                               if ( headerCount >= maxSeen ) {
+                                       maxSeen = headerCount;
+                                       longestTR = index;
+                               }
+                       } );
+                       // We cannot use $.unique() here because it sorts into dom order, which is undesirable
+                       $tableHeaders = $( uniqueElements( exploded[longestTR] ) );
+               }
+
+               // as each header can span over multiple columns (using colspan=N),
+               // we have to bidirectionally map headers to their columns and columns to their headers
+               table.headerToColumns = [];
+               table.columnToHeader = [];
+
+               $tableHeaders.each( function ( headerIndex ) {
+                       columns = [];
+                       for ( i = 0; i < this.colSpan; i++ ) {
+                               table.columnToHeader[ colspanOffset + i ] = headerIndex;
+                               columns.push( colspanOffset + i );
+                       }
+
+                       table.headerToColumns[ headerIndex ] = columns;
+                       colspanOffset += this.colSpan;
+
+                       this.headerIndex = headerIndex;
+                       this.order = 0;
+                       this.count = 0;
+
+                       if ( $( this ).hasClass( table.config.unsortableClass ) ) {
+                               this.sortDisabled = true;
+                       }
+
+                       if ( !this.sortDisabled ) {
+                               $( this )
+                                       .addClass( table.config.cssHeader )
+                                       .prop( 'tabIndex', 0 )
+                                       .attr( {
+                                               role: 'columnheader button',
+                                               title: msg[1]
+                                       } );
+                       }
+
+                       // add cell to headerList
+                       table.config.headerList[headerIndex] = this;
+               } );
+
+               return $tableHeaders;
+
+       }
+
+       /**
+        * Sets the sort count of the columns that are not affected by the sorting to have them sorted
+        * in default (ascending) order when their header cell is clicked the next time.
+        *
+        * @param {jQuery} $headers
+        * @param {Number[][]} sortList
+        * @param {Number[][]} headerToColumns
+        */
+       function setHeadersOrder( $headers, sortList, headerToColumns ) {
+               // Loop through all headers to retrieve the indices of the columns the header spans across:
+               $.each( headerToColumns, function( headerIndex, columns ) {
+
+                       $.each( columns, function( i, columnIndex ) {
+                               var header = $headers[headerIndex];
+
+                               if ( !isValueInArray( columnIndex, sortList ) ) {
+                                       // Column shall not be sorted: Reset header count and order.
+                                       header.order = 0;
+                                       header.count = 0;
+                               } else {
+                                       // Column shall be sorted: Apply designated count and order.
+                                       $.each( sortList, function( j, sortColumn ) {
+                                               if ( sortColumn[0] === i ) {
+                                                       header.order = sortColumn[1];
+                                                       header.count = sortColumn[1] + 1;
+                                                       return false;
+                                               }
+                                       } );
+                               }
+                       } );
+
+               } );
+       }
+
+       function isValueInArray( v, a ) {
+               var l = a.length;
+               for ( var i = 0; i < l; i++ ) {
+                       if ( a[i][0] === v ) {
+                               return true;
+                       }
+               }
+               return false;
+       }
+
+       function uniqueElements( array ) {
+               var uniques = [];
+               $.each( array, function( index, elem ) {
+                       if ( elem !== undefined && $.inArray( elem, uniques ) === -1 ) {
+                               uniques.push( elem );
+                       }
+               } );
+               return uniques;
+       }
+
+       function setHeadersCss( table, $headers, list, css, msg, columnToHeader ) {
+               // Remove all header information and reset titles to default message
+               $headers.removeClass( css[0] ).removeClass( css[1] ).attr( 'title', msg[1] );
+
+               for ( var i = 0; i < list.length; i++ ) {
+                       $headers.eq( columnToHeader[ list[i][0] ] )
+                               .addClass( css[ list[i][1] ] )
+                               .attr( 'title', msg[ list[i][1] ] );
+               }
+       }
+
+       function sortText( a, b ) {
+               return ( (a < b) ? -1 : ((a > b) ? 1 : 0) );
+       }
+
+       function sortTextDesc( a, b ) {
+               return ( (b < a) ? -1 : ((b > a) ? 1 : 0) );
+       }
+
+       function multisort( table, sortList, cache ) {
+               var i,
+                       sortFn = [],
+                       len = sortList.length;
+               for ( i = 0; i < len; i++ ) {
+                       sortFn[i] = ( sortList[i][1] ) ? sortTextDesc : sortText;
+               }
+               cache.normalized.sort( function ( array1, array2 ) {
+                       var i, col, ret;
+                       for ( i = 0; i < len; i++ ) {
+                               col = sortList[i][0];
+                               ret = sortFn[i].call( this, array1[col], array2[col] );
+                               if ( ret !== 0 ) {
+                                       return ret;
+                               }
+                       }
+                       // Fall back to index number column to ensure stable sort
+                       return sortText.call( this, array1[array1.length - 1], array2[array2.length - 1] );
+               } );
+               return cache;
+       }
+
+       function buildTransformTable() {
+               var ascii, localised, i, digitClass,
+                       digits = '0123456789,.'.split( '' ),
+                       separatorTransformTable = mw.config.get( 'wgSeparatorTransformTable' ),
+                       digitTransformTable = mw.config.get( 'wgDigitTransformTable' );
+
+               if ( separatorTransformTable === null || ( separatorTransformTable[0] === '' && digitTransformTable[2] === '' ) ) {
+                       ts.transformTable = false;
+               } else {
+                       ts.transformTable = {};
+
+                       // Unpack the transform table
+                       ascii = separatorTransformTable[0].split( '\t' ).concat( digitTransformTable[0].split( '\t' ) );
+                       localised = separatorTransformTable[1].split( '\t' ).concat( digitTransformTable[1].split( '\t' ) );
+
+                       // Construct regex for number identification
+                       for ( i = 0; i < ascii.length; i++ ) {
+                               ts.transformTable[localised[i]] = ascii[i];
+                               digits.push( $.escapeRE( localised[i] ) );
+                       }
+               }
+               digitClass = '[' + digits.join( '', digits ) + ']';
+
+               // We allow a trailing percent sign, which we just strip. This works fine
+               // if percents and regular numbers aren't being mixed.
+               ts.numberRegex = new RegExp('^(' + '[-+\u2212]?[0-9][0-9,]*(\\.[0-9,]*)?(E[-+\u2212]?[0-9][0-9,]*)?' + // Fortran-style scientific
+               '|' + '[-+\u2212]?' + digitClass + '+[\\s\\xa0]*%?' + // Generic localised
+               ')$', 'i');
+       }
+
+       function buildDateTable() {
+               var i, name,
+                       regex = [];
+
+               ts.monthNames = {};
+
+               for ( i = 0; i < 12; i++ ) {
+                       name = mw.language.months.names[i].toLowerCase();
+                       ts.monthNames[name] = i + 1;
+                       regex.push( $.escapeRE( name ) );
+                       name = mw.language.months.genitive[i].toLowerCase();
+                       ts.monthNames[name] = i + 1;
+                       regex.push( $.escapeRE( name ) );
+                       name = mw.language.months.abbrev[i].toLowerCase().replace( '.', '' );
+                       ts.monthNames[name] = i + 1;
+                       regex.push( $.escapeRE( name ) );
+               }
+
+               // Build piped string
+               regex = regex.join( '|' );
+
+               // Build RegEx
+               // Any date formated with . , ' - or /
+               ts.dateRegex[0] = new RegExp( /^\s*(\d{1,2})[\,\.\-\/'\s]{1,2}(\d{1,2})[\,\.\-\/'\s]{1,2}(\d{2,4})\s*?/i);
+
+               // Written Month name, dmy
+               ts.dateRegex[1] = new RegExp( '^\\s*(\\d{1,2})[\\,\\.\\-\\/\'\\s]+(' + regex + ')' + '[\\,\\.\\-\\/\'\\s]+(\\d{2,4})\\s*$', 'i' );
+
+               // Written Month name, mdy
+               ts.dateRegex[2] = new RegExp( '^\\s*(' + regex + ')' + '[\\,\\.\\-\\/\'\\s]+(\\d{1,2})[\\,\\.\\-\\/\'\\s]+(\\d{2,4})\\s*$', 'i' );
+
+       }
+
+       /**
+        * Replace all rowspanned cells in the body with clones in each row, so sorting
+        * need not worry about them.
+        *
+        * @param $table jQuery object for a <table>
+        */
+       function explodeRowspans( $table ) {
+               var spanningRealCellIndex, rowSpan, colSpan,
+                       cell, i, $tds, $clone, $nextRows,
+                       rowspanCells = $table.find( '> tbody > tr > [rowspan]' ).get();
+
+               // Short circuit
+               if ( !rowspanCells.length ) {
+                       return;
+               }
+
+               // First, we need to make a property like cellIndex but taking into
+               // account colspans. We also cache the rowIndex to avoid having to take
+               // cell.parentNode.rowIndex in the sorting function below.
+               $table.find( '> tbody > tr' ).each( function () {
+                       var i,
+                               col = 0,
+                               l = this.cells.length;
+                       for ( i = 0; i < l; i++ ) {
+                               this.cells[i].realCellIndex = col;
+                               this.cells[i].realRowIndex = this.rowIndex;
+                               col += this.cells[i].colSpan;
+                       }
+               } );
+
+               // Split multi row cells into multiple cells with the same content.
+               // Sort by column then row index to avoid problems with odd table structures.
+               // Re-sort whenever a rowspanned cell's realCellIndex is changed, because it
+               // might change the sort order.
+               function resortCells() {
+                       rowspanCells = rowspanCells.sort( function ( a, b ) {
+                               var ret = a.realCellIndex - b.realCellIndex;
+                               if ( !ret ) {
+                                       ret = a.realRowIndex - b.realRowIndex;
+                               }
+                               return ret;
+                       } );
+                       $.each( rowspanCells, function () {
+                               this.needResort = false;
+                       } );
+               }
+               resortCells();
+
+               function filterfunc() {
+                       return this.realCellIndex >= spanningRealCellIndex;
+               }
+
+               function fixTdCellIndex() {
+                       this.realCellIndex += colSpan;
+                       if ( this.rowSpan > 1 ) {
+                               this.needResort = true;
+                       }
+               }
+
+               while ( rowspanCells.length ) {
+                       if ( rowspanCells[0].needResort ) {
+                               resortCells();
+                       }
+
+                       cell = rowspanCells.shift();
+                       rowSpan = cell.rowSpan;
+                       colSpan = cell.colSpan;
+                       spanningRealCellIndex = cell.realCellIndex;
+                       cell.rowSpan = 1;
+                       $nextRows = $( cell ).parent().nextAll();
+                       for ( i = 0; i < rowSpan - 1; i++ ) {
+                               $tds = $( $nextRows[i].cells ).filter( filterfunc );
+                               $clone = $( cell ).clone();
+                               $clone[0].realCellIndex = spanningRealCellIndex;
+                               if ( $tds.length ) {
+                                       $tds.each( fixTdCellIndex );
+                                       $tds.first().before( $clone );
+                               } else {
+                                       $nextRows.eq( i ).append( $clone );
+                               }
+                       }
+               }
+       }
+
+       function buildCollationTable() {
+               ts.collationTable = mw.config.get( 'tableSorterCollation' );
+               ts.collationRegex = null;
+               if ( ts.collationTable ) {
+                       var key,
+                               keys = [];
+
+                       // Build array of key names
+                       for ( key in ts.collationTable ) {
+                               // Check hasOwn to be safe
+                               if ( ts.collationTable.hasOwnProperty(key) ) {
+                                       keys.push(key);
+                               }
+                       }
+                       if ( keys.length ) {
+                               ts.collationRegex = new RegExp( '[' + keys.join( '' ) + ']', 'ig' );
+                       }
+               }
+       }
+
+       function cacheRegexs() {
+               if ( ts.rgx ) {
+                       return;
+               }
+               ts.rgx = {
+                       IPAddress: [
+                               new RegExp( /^\d{1,3}[\.]\d{1,3}[\.]\d{1,3}[\.]\d{1,3}$/)
+                       ],
+                       currency: [
+                               new RegExp( /(^[£$€¥]|[£$€¥]$)/),
+                               new RegExp( /[£$€¥]/g)
+                       ],
+                       url: [
+                               new RegExp( /^(https?|ftp|file):\/\/$/),
+                               new RegExp( /(https?|ftp|file):\/\//)
+                       ],
+                       isoDate: [
+                               new RegExp( /^\d{4}[\/\-]\d{1,2}[\/\-]\d{1,2}$/)
+                       ],
+                       usLongDate: [
+                               new RegExp( /^[A-Za-z]{3,10}\.? [0-9]{1,2}, ([0-9]{4}|'?[0-9]{2}) (([0-2]?[0-9]:[0-5][0-9])|([0-1]?[0-9]:[0-5][0-9]\s(AM|PM)))$/)
+                       ],
+                       time: [
+                               new RegExp( /^(([0-2]?[0-9]:[0-5][0-9])|([0-1]?[0-9]:[0-5][0-9]\s(am|pm)))$/)
+                       ]
+               };
+       }
+
+       /**
+        * Converts sort objects [ { Integer: String }, ... ] to the internally used nested array
+        * structure [ [ Integer , Integer ], ... ]
+        *
+        * @param sortObjects {Array} List of sort objects.
+        * @return {Array} List of internal sort definitions.
+        */
+
+       function convertSortList( sortObjects ) {
+               var sortList = [];
+               $.each( sortObjects, function( i, sortObject ) {
+                       $.each ( sortObject, function( columnIndex, order ) {
+                               var orderIndex = ( order === 'desc' ) ? 1 : 0;
+                               sortList.push( [parseInt( columnIndex, 10 ), orderIndex] );
+                       } );
+               } );
+               return sortList;
+       }
+
+       /* Public scope */
+
+       $.tablesorter = {
+
+                       defaultOptions: {
+                               cssHeader: 'headerSort',
+                               cssAsc: 'headerSortUp',
+                               cssDesc: 'headerSortDown',
+                               cssChildRow: 'expand-child',
+                               sortInitialOrder: 'asc',
+                               sortMultiSortKey: 'shiftKey',
+                               sortLocaleCompare: false,
+                               unsortableClass: 'unsortable',
+                               parsers: {},
+                               widgets: [],
+                               headers: {},
+                               cancelSelection: true,
+                               sortList: [],
+                               headerList: [],
+                               selectorHeaders: 'thead tr:eq(0) th',
+                               debug: false
+                       },
+
+                       dateRegex: [],
+                       monthNames: {},
+
+                       /**
+                        * @param $tables {jQuery}
+                        * @param settings {Object} (optional)
+                        */
+                       construct: function ( $tables, settings ) {
+                               return $tables.each( function ( i, table ) {
+                                       // Declare and cache.
+                                       var $headers, cache, config, sortCSS, sortMsg,
+                                               $table = $( table ),
+                                               firstTime = true;
+
+                                       // Quit if no tbody
+                                       if ( !table.tBodies ) {
+                                               return;
+                                       }
+                                       if ( !table.tHead ) {
+                                               // No thead found. Look for rows with <th>s and
+                                               // move them into a <thead> tag or a <tfoot> tag
+                                               emulateTHeadAndFoot( $table );
+
+                                               // Still no thead? Then quit
+                                               if ( !table.tHead ) {
+                                                       return;
+                                               }
+                                       }
+                                       $table.addClass( 'jquery-tablesorter' );
+
+                                       // FIXME config should probably not be stored in the plain table node
+                                       // New config object.
+                                       table.config = {};
+
+                                       // Merge and extend.
+                                       config = $.extend( table.config, $.tablesorter.defaultOptions, settings );
+
+                                       // Save the settings where they read
+                                       $.data( table, 'tablesorter', { config: config } );
+
+                                       // Get the CSS class names, could be done else where.
+                                       sortCSS = [ config.cssDesc, config.cssAsc ];
+                                       sortMsg = [ mw.msg( 'sort-descending' ), mw.msg( 'sort-ascending' ) ];
+
+                                       // Build headers
+                                       $headers = buildHeaders( table, sortMsg );
+
+                                       // Grab and process locale settings.
+                                       buildTransformTable();
+                                       buildDateTable();
+
+                                       // Precaching regexps can bring 10 fold
+                                       // performance improvements in some browsers.
+                                       cacheRegexs();
+
+                                       function setupForFirstSort() {
+                                               firstTime = false;
+
+                                               // Defer buildCollationTable to first sort. As user and site scripts
+                                               // may customize tableSorterCollation but load after $.ready(), other
+                                               // scripts may call .tablesorter() before they have done the
+                                               // tableSorterCollation customizations.
+                                               buildCollationTable();
+
+                                               // Legacy fix of .sortbottoms
+                                               // Wrap them inside inside a tfoot (because that's what they actually want to be) &
+                                               // and put the <tfoot> at the end of the <table>
+                                               var $sortbottoms = $table.find( '> tbody > tr.sortbottom' );
+                                               if ( $sortbottoms.length ) {
+                                                       var $tfoot = $table.children( 'tfoot' );
+                                                       if ( $tfoot.length ) {
+                                                               $tfoot.eq(0).prepend( $sortbottoms );
+                                                       } else {
+                                                               $table.append( $( '<tfoot>' ).append( $sortbottoms ) );
+                                                       }
+                                               }
+
+                                               explodeRowspans( $table );
+
+                                               // try to auto detect column type, and store in tables config
+                                               table.config.parsers = buildParserCache( table, $headers );
+                                       }
+
+                                       // Apply event handling to headers
+                                       // this is too big, perhaps break it out?
+                                       $headers.not( '.' + table.config.unsortableClass ).on( 'keypress click', function ( e ) {
+                                               if ( e.type === 'click' && e.target.nodeName.toLowerCase() === 'a' ) {
+                                                       // The user clicked on a link inside a table header.
+                                                       // Do nothing and let the default link click action continue.
+                                                       return true;
+                                               }
+
+                                               if ( e.type === 'keypress' && e.which !== 13 ) {
+                                                       // Only handle keypresses on the "Enter" key.
+                                                       return true;
+                                               }
+
+                                               if ( firstTime ) {
+                                                       setupForFirstSort();
+                                               }
+
+                                               // Build the cache for the tbody cells
+                                               // to share between calculations for this sort action.
+                                               // Re-calculated each time a sort action is performed due to possiblity
+                                               // that sort values change. Shouldn't be too expensive, but if it becomes
+                                               // too slow an event based system should be implemented somehow where
+                                               // cells get event .change() and bubbles up to the <table> here
+                                               cache = buildCache( table );
+
+                                               var totalRows = ( $table[0].tBodies[0] && $table[0].tBodies[0].rows.length ) || 0;
+                                               if ( !table.sortDisabled && totalRows > 0 ) {
+                                                       // Get current column sort order
+                                                       this.order = this.count % 2;
+                                                       this.count++;
+
+                                                       var cell, columns, newSortList, i;
+
+                                                       cell = this;
+                                                       // Get current column index
+                                                       columns = table.headerToColumns[ this.headerIndex ];
+                                                       newSortList = $.map( columns, function ( c ) {
+                                                               // jQuery "helpfully" flattens the arrays...
+                                                               return [[c, cell.order]];
+                                                       });
+                                                       // Index of first column belonging to this header
+                                                       i = columns[0];
+
+                                                       if ( !e[config.sortMultiSortKey] ) {
+                                                               // User only wants to sort on one column set
+                                                               // Flush the sort list and add new columns
+                                                               config.sortList = newSortList;
+                                                       } else {
+                                                               // Multi column sorting
+                                                               // It is not possible for one column to belong to multiple headers,
+                                                               // so this is okay - we don't need to check for every value in the columns array
+                                                               if ( isValueInArray( i, config.sortList ) ) {
+                                                                       // The user has clicked on an already sorted column.
+                                                                       // Reverse the sorting direction for all tables.
+                                                                       for ( var j = 0; j < config.sortList.length; j++ ) {
+                                                                               var s = config.sortList[j],
+                                                                                       o = config.headerList[s[0]];
+                                                                               if ( isValueInArray( s[0], newSortList ) ) {
+                                                                                       o.count = s[1];
+                                                                                       o.count++;
+                                                                                       s[1] = o.count % 2;
+                                                                               }
+                                                                       }
+                                                               } else {
+                                                                       // Add columns to sort list array
+                                                                       config.sortList = config.sortList.concat( newSortList );
+                                                               }
+                                                       }
+
+                                                       // Reset order/counts of cells not affected by sorting
+                                                       setHeadersOrder( $headers, config.sortList, table.headerToColumns );
+
+                                                       // Set CSS for headers
+                                                       setHeadersCss( $table[0], $headers, config.sortList, sortCSS, sortMsg, table.columnToHeader );
+                                                       appendToTable(
+                                                               $table[0], multisort( $table[0], config.sortList, cache )
+                                                       );
+
+                                                       // Stop normal event by returning false
+                                                       return false;
+                                               }
+
+                                       // Cancel selection
+                                       } ).mousedown( function () {
+                                               if ( config.cancelSelection ) {
+                                                       this.onselectstart = function () {
+                                                               return false;
+                                                       };
+                                                       return false;
+                                               }
+                                       } );
+
+                                       /**
+                                        * Sorts the table. If no sorting is specified by passing a list of sort
+                                        * objects, the table is sorted according to the initial sorting order.
+                                        * Passing an empty array will reset sorting (basically just reset the headers
+                                        * making the table appear unsorted).
+                                        *
+                                        * @param sortList {Array} (optional) List of sort objects.
+                                        */
+                                       $table.data( 'tablesorter' ).sort = function ( sortList ) {
+
+                                               if ( firstTime ) {
+                                                       setupForFirstSort();
+                                               }
+
+                                               if ( sortList === undefined ) {
+                                                       sortList = config.sortList;
+                                               } else if ( sortList.length > 0 ) {
+                                                       sortList = convertSortList( sortList );
+                                               }
+
+                                               // Set each column's sort count to be able to determine the correct sort
+                                               // order when clicking on a header cell the next time
+                                               setHeadersOrder( $headers, sortList, table.headerToColumns );
+
+                                               // re-build the cache for the tbody cells
+                                               cache = buildCache( table );
+
+                                               // set css for headers
+                                               setHeadersCss( table, $headers, sortList, sortCSS, sortMsg, table.columnToHeader );
+
+                                               // sort the table and append it to the dom
+                                               appendToTable( table, multisort( table, sortList, cache ) );
+                                       };
+
+                                       // sort initially
+                                       if ( config.sortList.length > 0 ) {
+                                               setupForFirstSort();
+                                               config.sortList = convertSortList( config.sortList );
+                                               $table.data( 'tablesorter' ).sort();
+                                       }
+
+                               } );
+                       },
+
+                       addParser: function ( parser ) {
+                               var l = parsers.length,
+                                       a = true;
+                               for ( var i = 0; i < l; i++ ) {
+                                       if ( parsers[i].id.toLowerCase() === parser.id.toLowerCase() ) {
+                                               a = false;
+                                       }
+                               }
+                               if ( a ) {
+                                       parsers.push( parser );
+                               }
+                       },
+
+                       formatDigit: function ( s ) {
+                               var out, c, p, i;
+                               if ( ts.transformTable !== false ) {
+                                       out = '';
+                                       for ( p = 0; p < s.length; p++ ) {
+                                               c = s.charAt(p);
+                                               if ( c in ts.transformTable ) {
+                                                       out += ts.transformTable[c];
+                                               } else {
+                                                       out += c;
+                                               }
+                                       }
+                                       s = out;
+                               }
+                               i = parseFloat( s.replace( /[, ]/g, '' ).replace( '\u2212', '-' ) );
+                               return isNaN( i ) ? 0 : i;
+                       },
+
+                       formatFloat: function ( s ) {
+                               var i = parseFloat(s);
+                               return isNaN( i ) ? 0 : i;
+                       },
+
+                       formatInt: function ( s ) {
+                               var i = parseInt( s, 10 );
+                               return isNaN( i ) ? 0 : i;
+                       },
+
+                       clearTableBody: function ( table ) {
+                               $( table.tBodies[0] ).empty();
+                       }
+               };
+
+       // Shortcut
+       ts = $.tablesorter;
+
+       // Register as jQuery prototype method
+       $.fn.tablesorter = function ( settings ) {
+               return ts.construct( this, settings );
+       };
+
+       // Add default parsers
+       ts.addParser( {
+               id: 'text',
+               is: function () {
+                       return true;
+               },
+               format: function ( s ) {
+                       s = $.trim( s.toLowerCase() );
+                       if ( ts.collationRegex ) {
+                               var tsc = ts.collationTable;
+                               s = s.replace( ts.collationRegex, function ( match ) {
+                                       var r = tsc[match] ? tsc[match] : tsc[match.toUpperCase()];
+                                       return r.toLowerCase();
+                               } );
+                       }
+                       return s;
+               },
+               type: 'text'
+       } );
+
+       ts.addParser( {
+               id: 'IPAddress',
+               is: function ( s ) {
+                       return ts.rgx.IPAddress[0].test(s);
+               },
+               format: function ( s ) {
+                       var a = s.split( '.' ),
+                               r = '',
+                               l = a.length;
+                       for ( var i = 0; i < l; i++ ) {
+                               var item = a[i];
+                               if ( item.length === 1 ) {
+                                       r += '00' + item;
+                               } else if ( item.length === 2 ) {
+                                       r += '0' + item;
+                               } else {
+                                       r += item;
+                               }
+                       }
+                       return $.tablesorter.formatFloat(r);
+               },
+               type: 'numeric'
+       } );
+
+       ts.addParser( {
+               id: 'currency',
+               is: function ( s ) {
+                       return ts.rgx.currency[0].test(s);
+               },
+               format: function ( s ) {
+                       return $.tablesorter.formatDigit( s.replace( ts.rgx.currency[1], '' ) );
+               },
+               type: 'numeric'
+       } );
+
+       ts.addParser( {
+               id: 'url',
+               is: function ( s ) {
+                       return ts.rgx.url[0].test(s);
+               },
+               format: function ( s ) {
+                       return $.trim( s.replace( ts.rgx.url[1], '' ) );
+               },
+               type: 'text'
+       } );
+
+       ts.addParser( {
+               id: 'isoDate',
+               is: function ( s ) {
+                       return ts.rgx.isoDate[0].test(s);
+               },
+               format: function ( s ) {
+                       return $.tablesorter.formatFloat((s !== '') ? new Date(s.replace(
+                       new RegExp( /-/g), '/')).getTime() : '0' );
+               },
+               type: 'numeric'
+       } );
+
+       ts.addParser( {
+               id: 'usLongDate',
+               is: function ( s ) {
+                       return ts.rgx.usLongDate[0].test(s);
+               },
+               format: function ( s ) {
+                       return $.tablesorter.formatFloat( new Date(s).getTime() );
+               },
+               type: 'numeric'
+       } );
+
+       ts.addParser( {
+               id: 'date',
+               is: function ( s ) {
+                       return ( ts.dateRegex[0].test(s) || ts.dateRegex[1].test(s) || ts.dateRegex[2].test(s ));
+               },
+               format: function ( s ) {
+                       var match;
+                       s = $.trim( s.toLowerCase() );
+
+                       if ( ( match = s.match( ts.dateRegex[0] ) ) !== null ) {
+                               if ( mw.config.get( 'wgDefaultDateFormat' ) === 'mdy' || mw.config.get( 'wgContentLanguage' ) === 'en' ) {
+                                       s = [ match[3], match[1], match[2] ];
+                               } else if ( mw.config.get( 'wgDefaultDateFormat' ) === 'dmy' ) {
+                                       s = [ match[3], match[2], match[1] ];
+                               } else {
+                                       // If we get here, we don't know which order the dd-dd-dddd
+                                       // date is in. So return something not entirely invalid.
+                                       return '99999999';
+                               }
+                       } else if ( ( match = s.match( ts.dateRegex[1] ) ) !== null ) {
+                               s = [ match[3], '' + ts.monthNames[match[2]], match[1] ];
+                       } else if ( ( match = s.match( ts.dateRegex[2] ) ) !== null ) {
+                               s = [ match[3], '' + ts.monthNames[match[1]], match[2] ];
+                       } else {
+                               // Should never get here
+                               return '99999999';
+                       }
+
+                       // Pad Month and Day
+                       if ( s[1].length === 1 ) {
+                               s[1] = '0' + s[1];
+                       }
+                       if ( s[2].length === 1 ) {
+                               s[2] = '0' + s[2];
+                       }
+
+                       var y;
+                       if ( ( y = parseInt( s[0], 10) ) < 100 ) {
+                               // Guestimate years without centuries
+                               if ( y < 30 ) {
+                                       s[0] = 2000 + y;
+                               } else {
+                                       s[0] = 1900 + y;
+                               }
+                       }
+                       while ( s[0].length < 4 ) {
+                               s[0] = '0' + s[0];
+                       }
+                       return parseInt( s.join( '' ), 10 );
+               },
+               type: 'numeric'
+       } );
+
+       ts.addParser( {
+               id: 'time',
+               is: function ( s ) {
+                       return ts.rgx.time[0].test(s);
+               },
+               format: function ( s ) {
+                       return $.tablesorter.formatFloat( new Date( '2000/01/01 ' + s ).getTime() );
+               },
+               type: 'numeric'
+       } );
+
+       ts.addParser( {
+               id: 'number',
+               is: function ( s ) {
+                       return $.tablesorter.numberRegex.test( $.trim( s ));
+               },
+               format: function ( s ) {
+                       return $.tablesorter.formatDigit(s);
+               },
+               type: 'numeric'
+       } );
+
+}( jQuery, mediaWiki ) );
diff --git a/resources/src/jquery/jquery.textSelection.js b/resources/src/jquery/jquery.textSelection.js
new file mode 100644 (file)
index 0000000..7262fe6
--- /dev/null
@@ -0,0 +1,573 @@
+/**
+ * These plugins provide extra functionality for interaction with textareas.
+ */
+( function ( $ ) {
+       if ( document.selection && document.selection.createRange ) {
+               // On IE, patch the focus() method to restore the windows' scroll position
+               // (bug 32241)
+               $.fn.extend({
+                       focus: ( function ( jqFocus ) {
+                               return function () {
+                                       var $w, state, result;
+                                       if ( arguments.length === 0 ) {
+                                               $w = $( window );
+                                               state = { top: $w.scrollTop(), left: $w.scrollLeft() };
+                                               result = jqFocus.apply( this, arguments );
+                                               window.scrollTo( state.top, state.left );
+                                               return result;
+                                       }
+                                       return jqFocus.apply( this, arguments );
+                               };
+                       }( $.fn.focus ) )
+               });
+       }
+
+       $.fn.textSelection = function ( command, options ) {
+               var fn,
+                       context,
+                       hasIframe,
+                       needSave,
+                       retval;
+
+               /**
+                * Helper function to get an IE TextRange object for an element
+                */
+               function rangeForElementIE( e ) {
+                       if ( e.nodeName.toLowerCase() === 'input' ) {
+                               return e.createTextRange();
+                       } else {
+                               var sel = document.body.createTextRange();
+                               sel.moveToElementText( e );
+                               return sel;
+                       }
+               }
+
+               /**
+                * Helper function for IE for activating the textarea. Called only in the
+                * IE-specific code paths below; makes use of IE-specific non-standard
+                * function setActive() if possible to avoid screen flicker.
+                */
+               function activateElementOnIE( element ) {
+                       if ( element.setActive ) {
+                               element.setActive(); // bug 32241: doesn't scroll
+                       } else {
+                               $( element ).focus(); // may scroll (but we patched it above)
+                       }
+               }
+
+               fn = {
+                       /**
+                        * Get the contents of the textarea
+                        */
+                       getContents: function () {
+                               return this.val();
+                       },
+                       /**
+                        * Get the currently selected text in this textarea. Will focus the textarea
+                        * in some browsers (IE/Opera)
+                        */
+                       getSelection: function () {
+                               var retval, range,
+                                       el = this.get( 0 );
+
+                               if ( $(el).is( ':hidden' ) ) {
+                                       retval = '';
+                               } else if ( document.selection && document.selection.createRange ) {
+                                       activateElementOnIE( el );
+                                       range = document.selection.createRange();
+                                       retval = range.text;
+                               } else if ( el.selectionStart || el.selectionStart === 0 ) {
+                                       retval = el.value.substring( el.selectionStart, el.selectionEnd );
+                               }
+
+                               return retval;
+                       },
+                       /**
+                        * Ported from skins/common/edit.js by Trevor Parscal
+                        * (c) 2009 Wikimedia Foundation (GPLv2) - http://www.wikimedia.org
+                        *
+                        * Inserts text at the beginning and end of a text selection, optionally
+                        * inserting text at the caret when selection is empty.
+                        *
+                        * @fixme document the options parameters
+                        */
+                       encapsulateSelection: function ( options ) {
+                               return this.each( function () {
+                                       var selText, scrollTop, insertText,
+                                               isSample, range, range2, range3, startPos, endPos,
+                                               pre = options.pre,
+                                               post = options.post;
+
+                                       /**
+                                        * Check if the selected text is the same as the insert text
+                                        */
+                                       function checkSelectedText() {
+                                               if ( !selText ) {
+                                                       selText = options.peri;
+                                                       isSample = true;
+                                               } else if ( options.replace ) {
+                                                       selText = options.peri;
+                                               } else {
+                                                       while ( selText.charAt( selText.length - 1 ) === ' ' ) {
+                                                               // Exclude ending space char
+                                                               selText = selText.substring( 0, selText.length - 1 );
+                                                               post += ' ';
+                                                       }
+                                                       while ( selText.charAt( 0 ) === ' ' ) {
+                                                               // Exclude prepending space char
+                                                               selText = selText.substring( 1, selText.length );
+                                                               pre = ' ' + pre;
+                                                       }
+                                               }
+                                       }
+
+                                       /**
+                                        * Do the splitlines stuff.
+                                        *
+                                        * Wrap each line of the selected text with pre and post
+                                        */
+                                       function doSplitLines( selText, pre, post ) {
+                                               var i,
+                                                       insertText = '',
+                                                       selTextArr = selText.split( '\n' );
+                                               for ( i = 0; i < selTextArr.length; i++ ) {
+                                                       insertText += pre + selTextArr[i] + post;
+                                                       if ( i !== selTextArr.length - 1 ) {
+                                                               insertText += '\n';
+                                                       }
+                                               }
+                                               return insertText;
+                                       }
+
+                                       isSample = false;
+                                       // Do nothing if display none
+                                       if ( this.style.display !== 'none' ) {
+                                               if ( document.selection && document.selection.createRange ) {
+                                                       // IE
+
+                                                       // Note that IE9 will trigger the next section unless we check this first.
+                                                       // See bug 35201.
+
+                                                       activateElementOnIE( this );
+                                                       if ( context ) {
+                                                               context.fn.restoreCursorAndScrollTop();
+                                                       }
+                                                       if ( options.selectionStart !== undefined ) {
+                                                               $(this).textSelection( 'setSelection', { 'start': options.selectionStart, 'end': options.selectionEnd } );
+                                                       }
+
+                                                       selText = $(this).textSelection( 'getSelection' );
+                                                       scrollTop = this.scrollTop;
+                                                       range = document.selection.createRange();
+
+                                                       checkSelectedText();
+                                                       insertText = pre + selText + post;
+                                                       if ( options.splitlines ) {
+                                                               insertText = doSplitLines( selText, pre, post );
+                                                       }
+                                                       if ( options.ownline && range.moveStart ) {
+                                                               range2 = document.selection.createRange();
+                                                               range2.collapse();
+                                                               range2.moveStart( 'character', -1 );
+                                                               // FIXME: Which check is correct?
+                                                               if ( range2.text !== '\r' && range2.text !== '\n' && range2.text !== '' ) {
+                                                                       insertText = '\n' + insertText;
+                                                                       pre += '\n';
+                                                               }
+                                                               range3 = document.selection.createRange();
+                                                               range3.collapse( false );
+                                                               range3.moveEnd( 'character', 1 );
+                                                               if ( range3.text !== '\r' && range3.text !== '\n' && range3.text !== '' ) {
+                                                                       insertText += '\n';
+                                                                       post += '\n';
+                                                               }
+                                                       }
+
+                                                       range.text = insertText;
+                                                       if ( isSample && options.selectPeri && range.moveStart ) {
+                                                               range.moveStart( 'character', -post.length - selText.length );
+                                                               range.moveEnd( 'character', -post.length );
+                                                       }
+                                                       range.select();
+                                                       // Restore the scroll position
+                                                       this.scrollTop = scrollTop;
+                                               } else if ( this.selectionStart || this.selectionStart === 0 ) {
+                                                       // Mozilla/Opera
+
+                                                       $(this).focus();
+                                                       if ( options.selectionStart !== undefined ) {
+                                                               $(this).textSelection( 'setSelection', { 'start': options.selectionStart, 'end': options.selectionEnd } );
+                                                       }
+
+                                                       selText = $(this).textSelection( 'getSelection' );
+                                                       startPos = this.selectionStart;
+                                                       endPos = this.selectionEnd;
+                                                       scrollTop = this.scrollTop;
+                                                       checkSelectedText();
+                                                       if ( options.selectionStart !== undefined
+                                                                       && endPos - startPos !== options.selectionEnd - options.selectionStart )
+                                                       {
+                                                               // This means there is a difference in the selection range returned by browser and what we passed.
+                                                               // This happens for Chrome in the case of composite characters. Ref bug #30130
+                                                               // Set the startPos to the correct position.
+                                                               startPos = options.selectionStart;
+                                                       }
+
+                                                       insertText = pre + selText + post;
+                                                       if ( options.splitlines ) {
+                                                               insertText = doSplitLines( selText, pre, post );
+                                                       }
+                                                       if ( options.ownline ) {
+                                                               if ( startPos !== 0 && this.value.charAt( startPos - 1 ) !== '\n' && this.value.charAt( startPos - 1 ) !== '\r' ) {
+                                                                       insertText = '\n' + insertText;
+                                                                       pre += '\n';
+                                                               }
+                                                               if ( this.value.charAt( endPos ) !== '\n' && this.value.charAt( endPos ) !== '\r' ) {
+                                                                       insertText += '\n';
+                                                                       post += '\n';
+                                                               }
+                                                       }
+                                                       this.value = this.value.substring( 0, startPos ) + insertText +
+                                                               this.value.substring( endPos, this.value.length );
+                                                       // Setting this.value scrolls the textarea to the top, restore the scroll position
+                                                       this.scrollTop = scrollTop;
+                                                       if ( window.opera ) {
+                                                               pre = pre.replace( /\r?\n/g, '\r\n' );
+                                                               selText = selText.replace( /\r?\n/g, '\r\n' );
+                                                               post = post.replace( /\r?\n/g, '\r\n' );
+                                                       }
+                                                       if ( isSample && options.selectPeri && !options.splitlines ) {
+                                                               this.selectionStart = startPos + pre.length;
+                                                               this.selectionEnd = startPos + pre.length + selText.length;
+                                                       } else {
+                                                               this.selectionStart = startPos + insertText.length;
+                                                               this.selectionEnd = this.selectionStart;
+                                                       }
+                                               }
+                                       }
+                                       $(this).trigger( 'encapsulateSelection', [ options.pre, options.peri, options.post, options.ownline,
+                                               options.replace, options.spitlines ] );
+                               });
+                       },
+                       /**
+                        * Ported from Wikia's LinkSuggest extension
+                        * https://svn.wikia-code.com/wikia/trunk/extensions/wikia/LinkSuggest
+                        * Some code copied from
+                        * http://www.dedestruct.com/2008/03/22/howto-cross-browser-cursor-position-in-textareas/
+                        *
+                        * Get the position (in resolution of bytes not necessarily characters)
+                        * in a textarea
+                        *
+                        * Will focus the textarea in some browsers (IE/Opera)
+                        *
+                        * @fixme document the options parameters
+                        */
+                        getCaretPosition: function ( options ) {
+                               function getCaret( e ) {
+                                       var caretPos = 0,
+                                               endPos = 0,
+                                               preText, rawPreText, periText,
+                                               rawPeriText, postText, rawPostText,
+                                               // IE Support
+                                               preFinished,
+                                               periFinished,
+                                               postFinished,
+                                               // Range containing text in the selection
+                                               periRange,
+                                               // Range containing text before the selection
+                                               preRange,
+                                               // Range containing text after the selection
+                                               postRange;
+
+                                       if ( document.selection && document.selection.createRange ) {
+                                               // IE doesn't properly report non-selected caret position through
+                                               // the selection ranges when textarea isn't focused. This can
+                                               // lead to saving a bogus empty selection, which then screws up
+                                               // whatever we do later (bug 31847).
+                                               activateElementOnIE( e );
+
+                                               preFinished = false;
+                                               periFinished = false;
+                                               postFinished = false;
+                                               periRange = document.selection.createRange().duplicate();
+
+                                               preRange = rangeForElementIE( e );
+                                               // Move the end where we need it
+                                               preRange.setEndPoint( 'EndToStart', periRange );
+
+                                               postRange = rangeForElementIE( e );
+                                               // Move the start where we need it
+                                               postRange.setEndPoint( 'StartToEnd', periRange );
+
+                                               // Load the text values we need to compare
+                                               preText = rawPreText = preRange.text;
+                                               periText = rawPeriText = periRange.text;
+                                               postText = rawPostText = postRange.text;
+
+                                               /*
+                                                * Check each range for trimmed newlines by shrinking the range by 1
+                                                * character and seeing if the text property has changed. If it has
+                                                * not changed then we know that IE has trimmed a \r\n from the end.
+                                                */
+                                               do {
+                                                       if ( !preFinished ) {
+                                                               if ( preRange.compareEndPoints( 'StartToEnd', preRange ) === 0 ) {
+                                                                       preFinished = true;
+                                                               } else {
+                                                                       preRange.moveEnd( 'character', -1 );
+                                                                       if ( preRange.text === preText ) {
+                                                                               rawPreText += '\r\n';
+                                                                       } else {
+                                                                               preFinished = true;
+                                                                       }
+                                                               }
+                                                       }
+                                                       if ( !periFinished ) {
+                                                               if ( periRange.compareEndPoints( 'StartToEnd', periRange ) === 0 ) {
+                                                                       periFinished = true;
+                                                               } else {
+                                                                       periRange.moveEnd( 'character', -1 );
+                                                                       if ( periRange.text === periText ) {
+                                                                               rawPeriText += '\r\n';
+                                                                       } else {
+                                                                               periFinished = true;
+                                                                       }
+                                                               }
+                                                       }
+                                                       if ( !postFinished ) {
+                                                               if ( postRange.compareEndPoints( 'StartToEnd', postRange ) === 0 ) {
+                                                                       postFinished = true;
+                                                               } else {
+                                                                       postRange.moveEnd( 'character', -1 );
+                                                                       if ( postRange.text === postText ) {
+                                                                               rawPostText += '\r\n';
+                                                                       } else {
+                                                                               postFinished = true;
+                                                                       }
+                                                               }
+                                                       }
+                                               } while ( ( !preFinished || !periFinished || !postFinished ) );
+                                               caretPos = rawPreText.replace( /\r\n/g, '\n' ).length;
+                                               endPos = caretPos + rawPeriText.replace( /\r\n/g, '\n' ).length;
+                                       } else if ( e.selectionStart || e.selectionStart === 0 ) {
+                                               // Firefox support
+                                               caretPos = e.selectionStart;
+                                               endPos = e.selectionEnd;
+                                       }
+                                       return options.startAndEnd ? [ caretPos, endPos ] : caretPos;
+                               }
+                               return getCaret( this.get( 0 ) );
+                       },
+                       /**
+                        * @fixme document the options parameters
+                        */
+                       setSelection: function ( options ) {
+                               return this.each( function () {
+                                       var selection, length, newLines;
+                                       // Do nothing if hidden
+                                       if ( !$(this).is( ':hidden' ) ) {
+                                               if ( this.selectionStart || this.selectionStart === 0 ) {
+                                                       // Opera 9.0 doesn't allow setting selectionStart past
+                                                       // selectionEnd; any attempts to do that will be ignored
+                                                       // Make sure to set them in the right order
+                                                       if ( options.start > this.selectionEnd ) {
+                                                               this.selectionEnd = options.end;
+                                                               this.selectionStart = options.start;
+                                                       } else {
+                                                               this.selectionStart = options.start;
+                                                               this.selectionEnd = options.end;
+                                                       }
+                                               } else if ( document.body.createTextRange ) {
+                                                       selection = rangeForElementIE( this );
+                                                       length = this.value.length;
+                                                       // IE doesn't count \n when computing the offset, so we won't either
+                                                       newLines = this.value.match( /\n/g );
+                                                       if ( newLines ) {
+                                                               length = length - newLines.length;
+                                                       }
+                                                       selection.moveStart( 'character', options.start );
+                                                       selection.moveEnd( 'character', -length + options.end );
+
+                                                       // This line can cause an error under certain circumstances (textarea empty, no selection)
+                                                       // Silence that error
+                                                       try {
+                                                               selection.select();
+                                                       } catch ( e ) { }
+                                               }
+                                       }
+                               });
+                       },
+                       /**
+                        * Ported from Wikia's LinkSuggest extension
+                        * https://svn.wikia-code.com/wikia/trunk/extensions/wikia/LinkSuggest
+                        *
+                        * Scroll a textarea to the current cursor position. You can set the cursor
+                        * position with setSelection()
+                        * @param options boolean Whether to force a scroll even if the caret position
+                        *  is already visible. Defaults to false
+                        *
+                        * @fixme document the options parameters (function body suggests options.force is a boolean, not options itself)
+                        */
+                       scrollToCaretPosition: function ( options ) {
+                               function getLineLength( e ) {
+                                       return Math.floor( e.scrollWidth / ( $.client.profile().platform === 'linux' ? 7 : 8 ) );
+                               }
+                               function getCaretScrollPosition( e ) {
+                                       // FIXME: This functions sucks and is off by a few lines most
+                                       // of the time. It should be replaced by something decent.
+                                       var i, j,
+                                               nextSpace,
+                                               text = e.value.replace( /\r/g, '' ),
+                                               caret = $( e ).textSelection( 'getCaretPosition' ),
+                                               lineLength = getLineLength( e ),
+                                               row = 0,
+                                               charInLine = 0,
+                                               lastSpaceInLine = 0;
+
+                                       for ( i = 0; i < caret; i++ ) {
+                                               charInLine++;
+                                               if ( text.charAt( i ) === ' ' ) {
+                                                       lastSpaceInLine = charInLine;
+                                               } else if ( text.charAt( i ) === '\n' ) {
+                                                       lastSpaceInLine = 0;
+                                                       charInLine = 0;
+                                                       row++;
+                                               }
+                                               if ( charInLine > lineLength ) {
+                                                       if ( lastSpaceInLine > 0 ) {
+                                                               charInLine = charInLine - lastSpaceInLine;
+                                                               lastSpaceInLine = 0;
+                                                               row++;
+                                                       }
+                                               }
+                                       }
+                                       nextSpace = 0;
+                                       for ( j = caret; j < caret + lineLength; j++ ) {
+                                               if (
+                                                       text.charAt( j ) === ' ' ||
+                                                       text.charAt( j ) === '\n' ||
+                                                       caret === text.length
+                                               ) {
+                                                       nextSpace = j;
+                                                       break;
+                                               }
+                                       }
+                                       if ( nextSpace > lineLength && caret <= lineLength ) {
+                                               charInLine = caret - lastSpaceInLine;
+                                               row++;
+                                       }
+                                       return ( $.client.profile().platform === 'mac' ? 13 : ( $.client.profile().platform === 'linux' ? 15 : 16 ) ) * row;
+                               }
+                               return this.each(function () {
+                                       var scroll, range, savedRange, pos, oldScrollTop;
+                                       // Do nothing if hidden
+                                       if ( !$(this).is( ':hidden' ) ) {
+                                               if ( this.selectionStart || this.selectionStart === 0 ) {
+                                                       // Mozilla
+                                                       scroll = getCaretScrollPosition( this );
+                                                       if ( options.force || scroll < $(this).scrollTop() ||
+                                                                       scroll > $(this).scrollTop() + $(this).height() ) {
+                                                               $(this).scrollTop( scroll );
+                                                       }
+                                               } else if ( document.selection && document.selection.createRange ) {
+                                                       // IE / Opera
+                                                       /*
+                                                        * IE automatically scrolls the selected text to the
+                                                        * bottom of the textarea at range.select() time, except
+                                                        * if it was already in view and the cursor position
+                                                        * wasn't changed, in which case it does nothing. To
+                                                        * cover that case, we'll force it to act by moving one
+                                                        * character back and forth.
+                                                        */
+                                                       range = document.body.createTextRange();
+                                                       savedRange = document.selection.createRange();
+                                                       pos = $(this).textSelection( 'getCaretPosition' );
+                                                       oldScrollTop = this.scrollTop;
+                                                       range.moveToElementText( this );
+                                                       range.collapse();
+                                                       range.move( 'character', pos + 1);
+                                                       range.select();
+                                                       if ( this.scrollTop !== oldScrollTop ) {
+                                                               this.scrollTop += range.offsetTop;
+                                                       } else if ( options.force ) {
+                                                               range.move( 'character', -1 );
+                                                               range.select();
+                                                       }
+                                                       savedRange.select();
+                                               }
+                                       }
+                                       $(this).trigger( 'scrollToPosition' );
+                               } );
+                       }
+               };
+
+               // Apply defaults
+               switch ( command ) {
+                       //case 'getContents': // no params
+                       //case 'setContents': // no params with defaults
+                       //case 'getSelection': // no params
+                       case 'encapsulateSelection':
+                               options = $.extend( {
+                                       pre: '', // Text to insert before the cursor/selection
+                                       peri: '', // Text to insert between pre and post and select afterwards
+                                       post: '', // Text to insert after the cursor/selection
+                                       ownline: false, // Put the inserted text on a line of its own
+                                       replace: false, // If there is a selection, replace it with peri instead of leaving it alone
+                                       selectPeri: true, // Select the peri text if it was inserted (but not if there was a selection and replace==false, or if splitlines==true)
+                                       splitlines: false, // If multiple lines are selected, encapsulate each line individually
+                                       selectionStart: undefined, // Position to start selection at
+                                       selectionEnd: undefined // Position to end selection at. Defaults to start
+                               }, options );
+                               break;
+                       case 'getCaretPosition':
+                               options = $.extend( {
+                                       // Return [start, end] instead of just start
+                                       startAndEnd: false
+                               }, options );
+                               // FIXME: We may not need character position-based functions if we insert markers in the right places
+                               break;
+                       case 'setSelection':
+                               options = $.extend( {
+                                       // Position to start selection at
+                                       start: undefined,
+                                       // Position to end selection at. Defaults to start
+                                       end: undefined,
+                                       // Element to start selection in (iframe only)
+                                       startContainer: undefined,
+                                       // Element to end selection in (iframe only). Defaults to startContainer
+                                       endContainer: undefined
+                               }, options );
+
+                               if ( options.end === undefined ) {
+                                       options.end = options.start;
+                               }
+                               if ( options.endContainer === undefined ) {
+                                       options.endContainer = options.startContainer;
+                               }
+                               // FIXME: We may not need character position-based functions if we insert markers in the right places
+                               break;
+                       case 'scrollToCaretPosition':
+                               options = $.extend( {
+                                       force: false // Force a scroll even if the caret position is already visible
+                               }, options );
+                               break;
+               }
+
+               context = $(this).data( 'wikiEditor-context' );
+               hasIframe = context !== undefined && context && context.$iframe !== undefined;
+
+               // IE selection restore voodoo
+               needSave = false;
+               if ( hasIframe && context.savedSelection !== null ) {
+                       context.fn.restoreSelection();
+                       needSave = true;
+               }
+               retval = ( hasIframe ? context.fn : fn )[command].call( this, options );
+               if ( hasIframe && needSave ) {
+                       context.fn.saveSelection();
+               }
+
+               return retval;
+       };
+
+}( jQuery ) );
diff --git a/resources/src/mediawiki.action/images/green-checkmark.png b/resources/src/mediawiki.action/images/green-checkmark.png
new file mode 100644 (file)
index 0000000..8ec604e
Binary files /dev/null and b/resources/src/mediawiki.action/images/green-checkmark.png differ
diff --git a/resources/src/mediawiki.action/mediawiki.action.edit.collapsibleFooter.css b/resources/src/mediawiki.action/mediawiki.action.edit.collapsibleFooter.css
new file mode 100644 (file)
index 0000000..1af4a7a
--- /dev/null
@@ -0,0 +1,17 @@
+/* Styles for collapsible lists of templates used and hidden categories */
+.mw-editfooter-toggler {
+       cursor: pointer;
+       background-position: left center;
+       padding-left: 16px;
+}
+
+.mw-editfooter-list {
+       margin-bottom: 1em;
+       margin-left: 2.5em;
+}
+
+/* Show/hide animation is incorrect if the table has a margin set. Extra
+ * "table.wikitable" is needed in the selector for CSS specificity. */
+table.wikitable.preview-limit-report {
+       margin: 0;
+}
diff --git a/resources/src/mediawiki.action/mediawiki.action.edit.collapsibleFooter.js b/resources/src/mediawiki.action/mediawiki.action.edit.collapsibleFooter.js
new file mode 100644 (file)
index 0000000..7ae51ab
--- /dev/null
@@ -0,0 +1,54 @@
+jQuery( document ).ready( function ( $ ) {
+       var collapsibleLists, i, handleOne;
+
+       // Collapsible lists of categories and templates
+       collapsibleLists = [
+               {
+                       $list: $( '.templatesUsed ul' ),
+                       $toggler: $( '.mw-templatesUsedExplanation' ),
+                       cookieName: 'templates-used-list'
+               },
+               {
+                       $list: $( '.hiddencats ul' ),
+                       $toggler: $( '.mw-hiddenCategoriesExplanation' ),
+                       cookieName: 'hidden-categories-list'
+               },
+               {
+                       $list: $( '.preview-limit-report-wrapper' ),
+                       $toggler: $( '.mw-limitReportExplanation' ),
+                       cookieName: 'preview-limit-report'
+               }
+       ];
+
+       handleOne = function ( $list, $toggler, cookieName ) {
+               var isCollapsed = $.cookie( cookieName ) !== 'expanded';
+
+               // Style the toggler with an arrow icon and add a tabIndex and a role for accessibility
+               $toggler.addClass( 'mw-editfooter-toggler' ).prop( 'tabIndex', 0 ).attr( 'role', 'button' );
+               $list.addClass( 'mw-editfooter-list' );
+
+               $list.makeCollapsible( {
+                       $customTogglers: $toggler,
+                       linksPassthru: true,
+                       plainMode: true,
+                       collapsed: isCollapsed
+               } );
+
+               $toggler.addClass( isCollapsed ? 'mw-icon-arrow-collapsed' : 'mw-icon-arrow-expanded' );
+
+               $list.on( 'beforeExpand.mw-collapsible', function () {
+                       $toggler.removeClass( 'mw-icon-arrow-collapsed' ).addClass( 'mw-icon-arrow-expanded' );
+                       $.cookie( cookieName, 'expanded' );
+               } );
+
+               $list.on( 'beforeCollapse.mw-collapsible', function () {
+                       $toggler.removeClass( 'mw-icon-arrow-expanded' ).addClass( 'mw-icon-arrow-collapsed' );
+                       $.cookie( cookieName, 'collapsed' );
+               } );
+       };
+
+       for ( i = 0; i < collapsibleLists.length; i++ ) {
+               // Pass to a function for iteration-local variables
+               handleOne( collapsibleLists[i].$list, collapsibleLists[i].$toggler, collapsibleLists[i].cookieName );
+       }
+} );
diff --git a/resources/src/mediawiki.action/mediawiki.action.edit.editWarning.js b/resources/src/mediawiki.action/mediawiki.action.edit.editWarning.js
new file mode 100644 (file)
index 0000000..f8448e6
--- /dev/null
@@ -0,0 +1,55 @@
+/*
+ * Javascript for module editWarning
+ */
+( function ( mw, $ ) {
+       $( function () {
+               // Check if EditWarning is enabled and if we need it
+               if ( $( '#wpTextbox1' ).length === 0 ) {
+                       return true;
+               }
+               // Get the original values of some form elements
+               $( '#wpTextbox1, #wpSummary' ).each( function () {
+                       $( this ).data( 'origtext', $( this ).val() );
+               } );
+               var savedWindowOnBeforeUnload;
+               $( window )
+                       .on( 'beforeunload.editwarning', function () {
+                               var retval;
+
+                               // Check if the current values of some form elements are the same as
+                               // the original values
+                               if (
+                                       mw.config.get( 'wgAction' ) === 'submit' ||
+                                               $( '#wpTextbox1' ).data( 'origtext' ) !== $( '#wpTextbox1' ).val() ||
+                                               $( '#wpSummary' ).data( 'origtext' ) !== $( '#wpSummary' ).val()
+                               ) {
+                                       // Return our message
+                                       retval = mw.msg( 'editwarning-warning' );
+                               }
+
+                               // Unset the onbeforeunload handler so we don't break page caching in Firefox
+                               savedWindowOnBeforeUnload = window.onbeforeunload;
+                               window.onbeforeunload = null;
+                               if ( retval !== undefined ) {
+                                       // ...but if the user chooses not to leave the page, we need to rebind it
+                                       setTimeout( function () {
+                                               window.onbeforeunload = savedWindowOnBeforeUnload;
+                                       }, 1 );
+                                       return retval;
+                               }
+                       } )
+                       .on( 'pageshow.editwarning', function () {
+                               // Re-add onbeforeunload handler
+                               if ( !window.onbeforeunload ) {
+                                       window.onbeforeunload = savedWindowOnBeforeUnload;
+                               }
+                       } );
+
+               // Add form submission handler
+               $( '#editform' ).submit( function () {
+                       // Unbind our handlers
+                       $( window ).off( '.editwarning' );
+               } );
+       } );
+
+}( mediaWiki, jQuery ) );
diff --git a/resources/src/mediawiki.action/mediawiki.action.edit.js b/resources/src/mediawiki.action/mediawiki.action.edit.js
new file mode 100644 (file)
index 0000000..a575844
--- /dev/null
@@ -0,0 +1,191 @@
+/**
+ * Interface for the classic edit toolbar.
+ *
+ * @class mw.toolbar
+ * @singleton
+ */
+( function ( mw, $ ) {
+       var toolbar, isReady, $toolbar, queue, slice, $currentFocused;
+
+       /**
+        * Internal helper that does the actual insertion of the button into the toolbar.
+        *
+        * See #addButton for parameter documentation.
+        *
+        * @private
+        */
+       function insertButton( b, speedTip, tagOpen, tagClose, sampleText, imageId ) {
+               // Backwards compatibility
+               if ( typeof b !== 'object' ) {
+                       b = {
+                               imageFile: b,
+                               speedTip: speedTip,
+                               tagOpen: tagOpen,
+                               tagClose: tagClose,
+                               sampleText: sampleText,
+                               imageId: imageId
+                       };
+               }
+               var $image = $( '<img>' ).attr( {
+                       width: 23,
+                       height: 22,
+                       src: b.imageFile,
+                       alt: b.speedTip,
+                       title: b.speedTip,
+                       id: b.imageId || undefined,
+                       'class': 'mw-toolbar-editbutton'
+               } ).click( function () {
+                       toolbar.insertTags( b.tagOpen, b.tagClose, b.sampleText );
+                       return false;
+               } );
+
+               $toolbar.append( $image );
+       }
+
+       isReady = false;
+       $toolbar = false;
+       /**
+        * @private
+        * @property {Array}
+        * Contains button objects (and for backwards compatibilty, it can
+        * also contains an arguments array for insertButton).
+        */
+       queue = [];
+       slice = queue.slice;
+
+       toolbar = {
+
+               /**
+                * Add buttons to the toolbar.
+                *
+                * Takes care of race conditions and time-based dependencies
+                * by placing buttons in a queue if this method is called before
+                * the toolbar is created.
+                *
+                * For compatiblity, passing the properties listed below as separate arguments
+                * (in the listed order) is also supported.
+                *
+                * @param {Object} button Object with the following properties:
+                * @param {string} button.imageFile
+                * @param {string} button.speedTip
+                * @param {string} button.tagOpen
+                * @param {string} button.tagClose
+                * @param {string} button.sampleText
+                * @param {string} [button.imageId]
+                */
+               addButton: function () {
+                       if ( isReady ) {
+                               insertButton.apply( toolbar, arguments );
+                       } else {
+                               // Convert arguments list to array
+                               queue.push( slice.call( arguments ) );
+                       }
+               },
+               /**
+                * Example usage:
+                *     addButtons( [ { .. }, { .. }, { .. } ] );
+                *     addButtons( { .. }, { .. } );
+                *
+                * @param {Object|Array...} [buttons] An array of button objects or the first
+                *  button object in a list of variadic arguments.
+                */
+               addButtons: function ( buttons ) {
+                       if ( !$.isArray( buttons ) ) {
+                               buttons = slice.call( arguments );
+                       }
+                       if ( isReady ) {
+                               $.each( buttons, function () {
+                                       insertButton( this );
+                               } );
+                       } else {
+                               // Push each button into the queue
+                               queue.push.apply( queue, buttons );
+                       }
+               },
+
+               /**
+                * Apply tagOpen/tagClose to selection in currently focused textarea.
+                *
+                * Uses `sampleText` if selection is empty.
+                *
+                * @param {string} tagOpen
+                * @param {string} tagClose
+                * @param {string} sampleText
+                */
+               insertTags: function ( tagOpen, tagClose, sampleText ) {
+                       if ( $currentFocused && $currentFocused.length ) {
+                               $currentFocused.textSelection(
+                                       'encapsulateSelection', {
+                                               pre: tagOpen,
+                                               peri: sampleText,
+                                               post: tagClose
+                                       }
+                               );
+                       }
+               },
+
+               // For backwards compatibility,
+               // Called from EditPage.php, maybe in other places as well.
+               init: function () {}
+       };
+
+       // Legacy (for compatibility with the code previously in skins/common.edit.js)
+       mw.log.deprecate( window, 'addButton', toolbar.addButton, 'Use mw.toolbar.addButton instead.' );
+       mw.log.deprecate( window, 'insertTags', toolbar.insertTags, 'Use mw.toolbar.insertTags instead.' );
+
+       // Expose API publicly
+       mw.toolbar = toolbar;
+
+       $( function () {
+               var i, b, editBox, scrollTop, $editForm;
+
+               // Used to determine where to insert tags
+               $currentFocused = $( '#wpTextbox1' );
+
+               // Populate the selector cache for $toolbar
+               $toolbar = $( '#toolbar' );
+
+               for ( i = 0; i < queue.length; i++ ) {
+                       b = queue[i];
+                       if ( $.isArray( b ) ) {
+                               // Forwarded arguments array from mw.toolbar.addButton
+                               insertButton.apply( toolbar, b );
+                       } else {
+                               // Raw object from mw.toolbar.addButtons
+                               insertButton( b );
+                       }
+               }
+
+               // Clear queue
+               queue.length = 0;
+
+               // This causes further calls to addButton to go to insertion directly
+               // instead of to the queue.
+               // It is important that this is after the one and only loop through
+               // the the queue
+               isReady = true;
+
+               // Make sure edit summary does not exceed byte limit
+               $( '#wpSummary' ).byteLimit( 255 );
+
+               // Restore the edit box scroll state following a preview operation,
+               // and set up a form submission handler to remember this state.
+               editBox = document.getElementById( 'wpTextbox1' );
+               scrollTop = document.getElementById( 'wpScrolltop' );
+               $editForm = $( '#editform' );
+               if ( $editForm.length && editBox && scrollTop ) {
+                       if ( scrollTop.value ) {
+                               editBox.scrollTop = scrollTop.value;
+                       }
+                       $editForm.submit( function () {
+                               scrollTop.value = editBox.scrollTop;
+                       });
+               }
+
+               // Apply to dynamically created textboxes as well as normal ones
+               $( document ).on( 'focus', 'textarea, input:text', function () {
+                       $currentFocused = $( this );
+               } );
+       });
+
+}( mediaWiki, jQuery ) );
diff --git a/resources/src/mediawiki.action/mediawiki.action.edit.preview.js b/resources/src/mediawiki.action/mediawiki.action.edit.preview.js
new file mode 100644 (file)
index 0000000..4c2fc3a
--- /dev/null
@@ -0,0 +1,164 @@
+/**
+ * Live edit preview.
+ */
+( function ( mw, $ ) {
+
+       /**
+        * @param {jQuery.Event} e
+        */
+       function doLivePreview( e ) {
+               var $wikiPreview, $editform, copySelectors, $copyElements, $spinner,
+                       targetUrl, postData, $previewDataHolder;
+
+               e.preventDefault();
+
+               // Deprecated: Use mw.hook instead
+               $( mw ).trigger( 'LivePreviewPrepare' );
+
+               $wikiPreview = $( '#wikiPreview' );
+               $editform = $( '#editform' );
+
+               // Show #wikiPreview if it's hidden to be able to scroll to it
+               // (if it is hidden, it's also empty, so nothing changes in the rendering)
+               $wikiPreview.show();
+
+               // Jump to where the preview will appear
+               $wikiPreview[0].scrollIntoView();
+
+               // List of selectors matching elements that we will
+               // update from from the ajax-loaded preview page.
+               copySelectors = [
+                       // Main
+                       '#firstHeading',
+                       '#wikiPreview',
+                       '#wikiDiff',
+                       '#catlinks',
+                       '.hiddencats',
+                       '#p-lang',
+                       // Editing-related
+                       '.templatesUsed',
+                       '.limitreport',
+                       '.mw-summary-preview'
+               ];
+               $copyElements = $( copySelectors.join( ',' ) );
+
+               // Not shown during normal preview, to be removed if present
+               $( '.mw-newarticletext' ).remove();
+
+               $spinner = $.createSpinner( {
+                       size: 'large',
+                       type: 'block'
+               } );
+               $wikiPreview.before( $spinner );
+               $spinner.css( {
+                       marginTop: $spinner.height()
+               } );
+
+               // Can't use fadeTo because it calls show(), and we might want to keep some elements hidden
+               // (e.g. empty #catlinks)
+               $copyElements.animate( { opacity: 0.4 }, 'fast' );
+
+               $previewDataHolder = $( '<div>' );
+               targetUrl = $editform.attr( 'action' );
+               targetUrl += targetUrl.indexOf( '?' ) !== -1 ? '&' : '?';
+               targetUrl += $.param( {
+                       debug: mw.config.get( 'debug' ),
+                       uselang: mw.config.get( 'wgUserLanguage' ),
+                       useskin: mw.config.get( 'skin' )
+               } );
+
+               // Gather all the data from the form
+               postData = $editform.formToArray();
+               postData.push( {
+                       name: e.target.name,
+                       value: ''
+               } );
+
+               // Load new preview data.
+               // TODO: This should use the action=parse API instead of loading the entire page,
+               // although that requires figuring out how to convert that raw data into proper HTML.
+               $previewDataHolder.load( targetUrl + ' ' + copySelectors.join( ',' ), postData, function () {
+                       var i, $from, $next, $parent;
+
+                       // Copy the contents of the specified elements from the loaded page to the real page.
+                       // Also copy their class attributes.
+                       for ( i = 0; i < copySelectors.length; i++ ) {
+                               $from = $previewDataHolder.find( copySelectors[i] );
+
+                               if ( copySelectors[i] === '#wikiPreview' ) {
+                                       $next = $wikiPreview.next();
+                                       // If there is no next node, use parent instead.
+                                       // Only query parent if needed, false otherwise.
+                                       $parent = !$next.length && $wikiPreview.parent();
+
+                                       $wikiPreview
+                                               .detach()
+                                               .empty()
+                                               .append( $from.contents() )
+                                               .attr( 'class', $from.attr( 'class' ) );
+
+                                       mw.hook( 'wikipage.content' ).fire( $wikiPreview );
+
+                                       // Reattach
+                                       if ( $parent ) {
+                                               $parent.append( $wikiPreview );
+                                       } else {
+                                               $next.before( $wikiPreview );
+                                       }
+
+                               } else {
+                                       $( copySelectors[i] )
+                                               .empty()
+                                               .append( $from.contents() )
+                                               .attr( 'class', $from.attr( 'class' ) );
+                               }
+                       }
+
+                       // Deprecated: Use mw.hook instead
+                       $( mw ).trigger( 'LivePreviewDone', [copySelectors] );
+
+                       $spinner.remove();
+                       $copyElements.animate( {
+                               opacity: 1
+                       }, 'fast' );
+               } );
+       }
+
+       $( function () {
+               // Do not enable on user .js/.css pages, as there's no sane way of "previewing"
+               // the scripts or styles without reloading the page.
+               if ( $( '#mw-userjsyoucanpreview' ).length || $( '#mw-usercssyoucanpreview' ).length ) {
+                       return;
+               }
+
+               // The following elements can change in a preview but are not output
+               // by the server when they're empty until the preview response.
+               // TODO: Make the server output these always (in a hidden state), so we don't
+               // have to fish and (hopefully) put them in the right place (since skins
+               // can change where they are output).
+
+               if ( !document.getElementById( 'p-lang' ) && document.getElementById( 'p-tb' ) ) {
+                       $( '#p-tb' ).after(
+                               $( '<div>' ).attr( 'id', 'p-lang' )
+                       );
+               }
+
+               if ( !$( '.mw-summary-preview' ).length ) {
+                       $( '.editCheckboxes' ).before(
+                               $( '<div>' ).addClass( 'mw-summary-preview' )
+                       );
+               }
+
+               if ( !document.getElementById( 'wikiDiff' ) && document.getElementById( 'wikiPreview' ) ) {
+                       $( '#wikiPreview' ).after(
+                               $( '<div>' ).attr( 'id', 'wikiDiff' )
+                       );
+               }
+
+               // This should be moved down to '#editform', but is kept on the body for now
+               // because the LiquidThreads extension is re-using this module with only half
+               // the EditPage (doesn't include #editform presumably, bug 55463).
+               $( document.body ).on( 'click', '#wpPreview, #wpDiff', doLivePreview );
+       } );
+
+}( mediaWiki, jQuery ) );
diff --git a/resources/src/mediawiki.action/mediawiki.action.edit.styles.css b/resources/src/mediawiki.action/mediawiki.action.edit.styles.css
new file mode 100644 (file)
index 0000000..4a2bab3
--- /dev/null
@@ -0,0 +1,44 @@
+/**
+ * Styles for elements of the editing form.
+ */
+
+/* General layout */
+#wpTextbox1 {
+       margin: 0;
+       display: block;
+}
+
+.editOptions {
+       background-color: #F0F0F0;
+       border: 1px solid silver;
+       border-top: none;
+       padding: 1em 1em 1.5em 1em;
+       margin-bottom: 2em;
+}
+
+/* Adjustments to edit form elements */
+.editCheckboxes {
+       margin-bottom: 1em;
+}
+
+.editCheckboxes input:first-child {
+       margin-left: 0;
+}
+
+.cancelLink {
+       margin-left: 0.5em;
+}
+
+#editpage-copywarn {
+       font-size: 0.9em;
+}
+
+#wpSummary {
+       display: block;
+       margin-top: 0;
+       margin-bottom: 0.5em;
+}
+
+.editButtons input:first-child {
+       margin-left: .1em;
+}
diff --git a/resources/src/mediawiki.action/mediawiki.action.history.diff.css b/resources/src/mediawiki.action/mediawiki.action.history.diff.css
new file mode 100644 (file)
index 0000000..31ca107
--- /dev/null
@@ -0,0 +1,94 @@
+/*
+** Diff rendering
+*/
+table.diff {
+       background-color: white;
+       border: none;
+       border-spacing: 4px;
+       margin: 0;
+       width: 100%;
+       /* Ensure that colums are of equal width */
+       table-layout: fixed;
+}
+
+table.diff td {
+       padding: 0.33em 0.5em;
+}
+
+table.diff td.diff-marker {
+       /* Compensate padding for increased font-size */
+       padding: 0.25em;
+}
+
+table.diff col.diff-marker {
+       width: 2%;
+}
+
+table.diff col.diff-content {
+       width: 48%;
+}
+
+table.diff td div {
+       /* Force-wrap very long lines such as URLs or page-widening char strings */
+       word-wrap: break-word;
+}
+
+td.diff-otitle,
+td.diff-ntitle {
+       text-align: center;
+}
+
+td.diff-lineno {
+       font-weight: bold;
+}
+
+td.diff-marker {
+       text-align: right;
+       font-weight: bold;
+       font-size: 1.25em;
+}
+
+td.diff-addedline,
+td.diff-deletedline,
+td.diff-context {
+       font-size: 88%;
+       vertical-align: top;
+       white-space: -moz-pre-wrap;
+       white-space: pre-wrap;
+       border-style: solid;
+       border-width: 1px 1px 1px 4px;
+       border-radius: 0.33em;
+}
+
+td.diff-addedline {
+       border-color: #a3d3ff;
+}
+
+td.diff-deletedline {
+       border-color: #ffe49c;
+}
+
+td.diff-context {
+       background: #f9f9f9;
+       border-color: #e6e6e6;
+       color: #333333;
+}
+
+.diffchange {
+       font-weight: bold;
+       text-decoration: none;
+}
+
+td.diff-addedline .diffchange,
+td.diff-deletedline .diffchange {
+       border-radius: 0.33em;
+       padding: 0.25em 0;
+}
+
+td.diff-addedline .diffchange {
+       background: #d8ecff;
+}
+
+td.diff-deletedline .diffchange {
+       background: #feeec8;
+}
diff --git a/resources/src/mediawiki.action/mediawiki.action.history.js b/resources/src/mediawiki.action/mediawiki.action.history.js
new file mode 100644 (file)
index 0000000..2a02d87
--- /dev/null
@@ -0,0 +1,125 @@
+/**
+ * JavaScript for History action
+ */
+jQuery( function ( $ ) {
+       var     $historyCompareForm = $( '#mw-history-compare' ),
+               $historySubmitter,
+               $lis = $( '#pagehistory > li' );
+
+       /**
+        * @context {Element} input
+        * @param e {jQuery.Event}
+        */
+       function updateDiffRadios() {
+               var diffLi = false, // the li where the diff radio is checked
+                       oldLi = false; // the li where the oldid radio is checked
+
+               if ( !$lis.length ) {
+                       return true;
+               }
+
+               $lis
+               .removeClass( 'selected' )
+               .each( function () {
+                       var     $li = $( this ),
+                               $inputs = $li.find( 'input[type="radio"]' ),
+                               $oldidRadio = $inputs.filter( '[name="oldid"]' ).eq( 0 ),
+                               $diffRadio = $inputs.filter( '[name="diff"]' ).eq( 0 );
+
+                       if ( !$oldidRadio.length || !$diffRadio.length ) {
+                               return true;
+                       }
+
+                       if ( $oldidRadio.prop( 'checked' ) ) {
+                               oldLi = true;
+                               $li.addClass( 'selected' );
+                               $oldidRadio.css( 'visibility', 'visible' );
+                               $diffRadio.css( 'visibility', 'hidden' );
+
+                       } else if ( $diffRadio.prop( 'checked' ) ) {
+                               diffLi = true;
+                               $li.addClass( 'selected' );
+                               $oldidRadio.css( 'visibility', 'hidden' );
+                               $diffRadio.css( 'visibility', 'visible' );
+
+                       // This list item has neither checked
+                       } else {
+                               // We're below the selected radios
+                               if ( diffLi && oldLi ) {
+                                       $oldidRadio.css( 'visibility', 'visible' );
+                                       $diffRadio.css( 'visibility', 'hidden' );
+
+                               // We're between the selected radios
+                               } else if ( diffLi ) {
+                                       $diffRadio.css( 'visibility', 'visible' );
+                                       $oldidRadio.css( 'visibility', 'visible' );
+
+                               // We're above the selected radios
+                               } else {
+                                       $diffRadio.css( 'visibility', 'visible' );
+                                       $oldidRadio.css( 'visibility', 'hidden' );
+                               }
+                       }
+               } );
+
+               return true;
+       }
+
+       $lis.find( 'input[name="diff"], input[name="oldid"]' ).click( updateDiffRadios );
+
+       // Set initial state
+       updateDiffRadios();
+
+       // Prettify url output for HistoryAction submissions,
+       // to cover up action=historysubmit construction.
+
+       // Ideally we'd use e.target instead of $historySubmitter, but e.target points
+       // to the form element for submit actions, so.
+       $historyCompareForm.find( '.historysubmit' ).click( function () {
+               $historySubmitter = $( this );
+       } );
+
+       // On submit we clone the form element, remove unneeded fields in the clone
+       // that pollute the query parameter with stuff from the other "use case",
+       // and then submit the clone.
+       // Without the cloning we'd be changing the real form, which is slower, could make
+       // the page look broken for a second in slow browsers and might show the form broken
+       // again when coming back from a "next" page.
+       $historyCompareForm.submit( function ( e ) {
+               var     $copyForm, $copyRadios, $copyAction;
+
+               if ( $historySubmitter ) {
+                       $copyForm = $historyCompareForm.clone();
+                       $copyRadios = $copyForm.find( '#pagehistory > li' ).find( 'input[name="diff"], input[name="oldid"]' );
+                       $copyAction = $copyForm.find( '> [name="action"]' );
+
+                       // Remove action=historysubmit and ids[..]=..
+                       if ( $historySubmitter.hasClass( 'mw-history-compareselectedversions-button' ) ) {
+                               $copyAction.remove();
+                               $copyForm.find( 'input[name^="ids["]:checked' ).prop( 'checked', false );
+
+                       // Remove diff=&oldid=, change action=historysubmit to revisiondelete, remove revisiondelete
+                       } else if ( $historySubmitter.hasClass( 'mw-history-revisiondelete-button' ) ) {
+                               $copyRadios.remove();
+                               $copyAction.val( $historySubmitter.attr( 'name' ) );
+                               $copyForm.find( ':submit' ).remove();
+                       }
+
+                       // IE7 doesn't do submission from an off-DOM clone, so insert hidden into document first
+                       // Also remove potentially conflicting id attributes that we don't need anyway
+                       $copyForm
+                               .css( 'display', 'none' )
+                               .find( '[id]' )
+                                       .removeAttr( 'id' )
+                               .end()
+                               .insertAfter( $historyCompareForm )
+                               .submit();
+
+                       e.preventDefault();
+                       return false; // Because the submit is special, return false as well.
+               }
+
+               // Continue natural browser handling other wise
+               return true;
+       } );
+} );
diff --git a/resources/src/mediawiki.action/mediawiki.action.view.dblClickEdit.js b/resources/src/mediawiki.action/mediawiki.action.view.dblClickEdit.js
new file mode 100644 (file)
index 0000000..727a525
--- /dev/null
@@ -0,0 +1,12 @@
+/**
+ * This module enables double-click-to-edit functionality.
+ */
+( function ( mw, $ ) {
+       $( function () {
+               mw.util.$content.dblclick( function ( e ) {
+                       e.preventDefault();
+                       // Trigger native HTMLElement click instead of opening URL (bug 43052)
+                       $( '#ca-edit a' ).get( 0 ).click();
+               } );
+       } );
+}( mediaWiki, jQuery ) );
diff --git a/resources/src/mediawiki.action/mediawiki.action.view.metadata.js b/resources/src/mediawiki.action/mediawiki.action.view.metadata.js
new file mode 100644 (file)
index 0000000..21f40c5
--- /dev/null
@@ -0,0 +1,47 @@
+/**
+ * Exif metadata display for MediaWiki file uploads
+ *
+ * Add an expand/collapse link and collapse by default if set to
+ * (with JS disabled, user will see all items)
+ *
+ * See also:
+ * - ImagePage.php#makeMetadataTable (creates the HTML)
+ * - skins/common/shared.css (hides tr.collapsable inside table.collapsed)
+ */
+( function ( mw, $ ) {
+       $( function () {
+               var $row, $col, $link,
+                       showText = mw.msg( 'metadata-expand' ),
+                       hideText = mw.msg( 'metadata-collapse' ),
+                       $table = $( '#mw_metadata' ),
+                       $tbody = $table.find( 'tbody' );
+
+               if ( !$tbody.length || !$tbody.find( '.collapsable' ).length ) {
+                       return;
+               }
+
+               $row = $( '<tr class="mw-metadata-show-hide-extended"></tr>' );
+               $col = $( '<td colspan="2"></td>' );
+
+               $link = $( '<a>', {
+                       text: showText,
+                       href: '#'
+               } ).click( function () {
+                       if ( $table.hasClass( 'collapsed' ) ) {
+                               $( this ).text( hideText );
+                       } else {
+                               $( this ).text( showText );
+                       }
+                       $table.toggleClass( 'expanded collapsed' );
+                       return false;
+               } );
+
+               $col.append( $link );
+               $row.append( $col );
+               $tbody.append( $row );
+
+               // And collapse!
+               $table.addClass( 'collapsed' );
+       } );
+
+}( mediaWiki, jQuery ) );
diff --git a/resources/src/mediawiki.action/mediawiki.action.view.postEdit.css b/resources/src/mediawiki.action/mediawiki.action.view.postEdit.css
new file mode 100644 (file)
index 0000000..be88337
--- /dev/null
@@ -0,0 +1,77 @@
+.postedit-container {
+       margin: 0 auto;
+       position: fixed;
+       top: 0;
+       height: 0;
+       left: 50%;
+       z-index: 1000;
+       font-size: 13px;
+}
+
+.postedit-container:hover {
+       cursor: pointer;
+}
+
+.postedit {
+       position: relative;
+       top: 0.6em;
+       left: -50%;
+       padding: .6em 3.6em .6em 1.1em;
+       line-height: 1.5625em;
+       color: #626465;
+       background-color: #f4f4f4;
+       border: 1px solid #dcd9d9;
+       text-shadow: 0 0.0625em 0 rgba(255, 255, 255, 0.5);
+       border-radius: 5px;
+       -webkit-box-shadow: 0 2px 5px 0 #ccc;
+       box-shadow: 0 2px 5px 0 #ccc;
+       -webkit-transition: all 0.25s ease-in-out;
+       -moz-transition: all 0.25s ease-in-out;
+       -ms-transition: all 0.25s ease-in-out;
+       -o-transition: all 0.25s ease-in-out;
+       transition: all 0.25s ease-in-out;
+}
+
+.skin-monobook .postedit {
+       top: 6em !important;
+}
+
+.postedit-faded {
+       opacity: 0;
+}
+
+.postedit-icon {
+       padding-left: 41px; /* 25 + 8 + 8 */
+       /* like min-height, but old IE compatible and keeps text vertically aligned, too */
+       line-height: 25px;
+       background-repeat: no-repeat;
+       background-position: 8px 50%;
+}
+
+.postedit-icon-checkmark {
+       /* @embed */
+       background-image: url(images/green-checkmark.png);
+       background-position: left;
+}
+
+.postedit-close {
+       position: absolute;
+       padding: 0 .8em;
+       right: 0;
+       top: 0;
+       font-size: 1.25em;
+       font-weight: bold;
+       line-height: 2.3em;
+       color: black;
+       text-shadow: 0 0.0625em 0 white;
+       text-decoration: none;
+       opacity: 0.2;
+       filter: alpha(opacity=20);
+}
+
+.postedit-close:hover {
+       color: black;
+       text-decoration: none;
+       opacity: 0.4;
+       filter: alpha(opacity=40);
+}
diff --git a/resources/src/mediawiki.action/mediawiki.action.view.postEdit.js b/resources/src/mediawiki.action/mediawiki.action.view.postEdit.js
new file mode 100644 (file)
index 0000000..6e4df9f
--- /dev/null
@@ -0,0 +1,76 @@
+( function ( mw, $ ) {
+       'use strict';
+
+       /**
+        * @event postEdit
+        * @member mw.hook
+        * @param {Object} [data] Optional data
+        * @param {string|jQuery|Array} [data.message] Message that listeners
+        *  should use when displaying notifications. String for plain text,
+        *  use array or jQuery object to pass actual nodes.
+        * @param {string|mw.user} [data.user=mw.user] User that made the edit.
+        */
+
+       /**
+        * After the listener for #postEdit removes the notification.
+        *
+        * @event postEdit_afterRemoval
+        * @member mw.hook
+        */
+
+       var config = mw.config.get( [ 'wgAction', 'wgCookiePrefix', 'wgCurRevisionId' ] ),
+               // This should match EditPage::POST_EDIT_COOKIE_KEY_PREFIX:
+               cookieKey = config.wgCookiePrefix + 'PostEditRevision' + config.wgCurRevisionId,
+               $div, id;
+
+       function showConfirmation( data ) {
+               data = data || {};
+               if ( data.message === undefined ) {
+                       data.message = $.parseHTML( mw.message( 'postedit-confirmation', data.user || mw.user ).escaped() );
+               }
+
+               $div = $(
+                       '<div class="postedit-container">' +
+                               '<div class="postedit">' +
+                                       '<div class="postedit-icon postedit-icon-checkmark postedit-content"></div>' +
+                                       '<a href="#" class="postedit-close">&times;</a>' +
+                               '</div>' +
+                       '</div>'
+               );
+
+               if ( typeof data.message === 'string' ) {
+                       $div.find( '.postedit-content' ).text( data.message );
+               } else if ( typeof data.message === 'object' ) {
+                       $div.find( '.postedit-content' ).append( data.message );
+               }
+
+               $div
+                       .click( fadeOutConfirmation )
+                       .prependTo( 'body' );
+
+               id = setTimeout( fadeOutConfirmation, 3000 );
+       }
+
+       function fadeOutConfirmation() {
+               clearTimeout( id );
+               $div.find( '.postedit' ).addClass( 'postedit postedit-faded' );
+               setTimeout( removeConfirmation, 500 );
+
+               return false;
+       }
+
+       function removeConfirmation() {
+               $div.remove();
+               mw.hook( 'postEdit.afterRemoval' ).fire();
+       }
+
+       mw.hook( 'postEdit' ).add( showConfirmation );
+
+       if ( config.wgAction === 'view' && $.cookie( cookieKey ) === '1' ) {
+               $.cookie( cookieKey, null, { path: '/' } );
+               mw.config.set( 'wgPostEdit', true );
+
+               mw.hook( 'postEdit' ).fire();
+       }
+
+} ( mediaWiki, jQuery ) );
diff --git a/resources/src/mediawiki.action/mediawiki.action.view.redirectToFragment.js b/resources/src/mediawiki.action/mediawiki.action.view.redirectToFragment.js
new file mode 100644 (file)
index 0000000..1e2d624
--- /dev/null
@@ -0,0 +1,35 @@
+/**
+ * JavaScript to scroll the page to an id, when a redirect with fragment is viewed.
+ */
+( function ( mw, $ ) {
+       var profile = $.client.profile(),
+               fragment = mw.config.get( 'wgRedirectToFragment' );
+
+       if ( fragment === null ) {
+               // nothing to do
+               return;
+       }
+
+       if ( profile.layout === 'webkit' && profile.layoutVersion < 420 ) {
+               // Released Safari w/ WebKit 418.9.1 messes up horribly
+               // Nightlies of 420+ are ok
+               return;
+       }
+       if ( !window.location.hash ) {
+               window.location.hash = fragment;
+
+               // Mozilla needs to wait until after load, otherwise the window doesn't
+               // scroll.  See <https://bugzilla.mozilla.org/show_bug.cgi?id=516293>.
+               // There's no obvious way to detect this programmatically, so we use
+               // version-testing.  If Firefox fixes the bug, they'll jump twice, but
+               // better twice than not at all, so make the fix hit future versions as
+               // well.
+               if ( profile.layout === 'gecko' ) {
+                       $( function () {
+                               if ( window.location.hash === fragment ) {
+                                       window.location.hash = fragment;
+                               }
+                       } );
+               }
+       }
+}( mediaWiki, jQuery ) );
diff --git a/resources/src/mediawiki.action/mediawiki.action.view.rightClickEdit.js b/resources/src/mediawiki.action/mediawiki.action.view.rightClickEdit.js
new file mode 100644 (file)
index 0000000..93befe3
--- /dev/null
@@ -0,0 +1,26 @@
+/**
+ * JavaScript to enable right click edit functionality.
+ * When the user right-clicks in a heading, it will open the
+ * edit screen.
+ */
+jQuery( function ( $ ) {
+       // Select all h1-h6 elements that contain editsection links
+       // Don't use the ":has:(.mw-editsection a)" selector because it performs very bad.
+       // http://jsperf.com/jq-1-7-2-vs-jq-1-8-1-performance-of-mw-has/2
+       $( document ).on( 'contextmenu', 'h1, h2, h3, h4, h5, h6', function ( e ) {
+               var $edit = $( this ).find( '.mw-editsection a' );
+               if ( !$edit.length ) {
+                       return;
+               }
+
+               // Headings can contain rich text.
+               // Make sure to not block contextmenu events on (other) anchor tags
+               // inside the heading (e.g. to do things like copy URL, open in new tab, ..).
+               // e.target can be the heading, but it can also be anything inside the heading.
+               if ( e.target.nodeName.toLowerCase() !== 'a' ) {
+                       // Trigger native HTMLElement click instead of opening URL (bug 43052)
+                       e.preventDefault();
+                       $edit.get( 0 ).click();
+               }
+       } );
+} );
diff --git a/resources/src/mediawiki.api/mediawiki.api.category.js b/resources/src/mediawiki.api/mediawiki.api.category.js
new file mode 100644 (file)
index 0000000..a90617d
--- /dev/null
@@ -0,0 +1,146 @@
+/**
+ * @class mw.Api.plugin.category
+ */
+( function ( mw, $ ) {
+
+       var msg = 'Use of mediawiki.api callback params is deprecated. Use the Promise instead.';
+       $.extend( mw.Api.prototype, {
+               /**
+                * Determine if a category exists.
+                *
+                * @param {mw.Title|string} title
+                * @param {Function} [ok] Success callback (deprecated)
+                * @param {Function} [err] Error callback (deprecated)
+                * @return {jQuery.Promise}
+                * @return {Function} return.done
+                * @return {boolean} return.done.isCategory Whether the category exists.
+                */
+               isCategory: function ( title, ok, err ) {
+                       var apiPromise = this.get( {
+                               prop: 'categoryinfo',
+                               titles: String( title )
+                       } );
+
+                       if ( ok || err ) {
+                               mw.track( 'mw.deprecate', 'api.cbParam' );
+                               mw.log.warn( msg );
+                       }
+
+                       return apiPromise
+                               .then( function ( data ) {
+                                       var exists = false;
+                                       if ( data.query && data.query.pages ) {
+                                               $.each( data.query.pages, function ( id, page ) {
+                                                       if ( page.categoryinfo ) {
+                                                               exists = true;
+                                                       }
+                                               } );
+                                       }
+                                       return exists;
+                               } )
+                               .done( ok )
+                               .fail( err )
+                               .promise( { abort: apiPromise.abort } );
+               },
+
+               /**
+                * Get a list of categories that match a certain prefix.
+                *
+                * E.g. given "Foo", return "Food", "Foolish people", "Foosball tables"...
+                *
+                * @param {string} prefix Prefix to match.
+                * @param {Function} [ok] Success callback (deprecated)
+                * @param {Function} [err] Error callback (deprecated)
+                * @return {jQuery.Promise}
+                * @return {Function} return.done
+                * @return {string[]} return.done.categories Matched categories
+                */
+               getCategoriesByPrefix: function ( prefix, ok, err ) {
+                       // Fetch with allpages to only get categories that have a corresponding description page.
+                       var apiPromise = this.get( {
+                               list: 'allpages',
+                               apprefix: prefix,
+                               apnamespace: mw.config.get( 'wgNamespaceIds' ).category
+                       } );
+
+                       if ( ok || err ) {
+                               mw.track( 'mw.deprecate', 'api.cbParam' );
+                               mw.log.warn( msg );
+                       }
+
+                       return apiPromise
+                               .then( function ( data ) {
+                                       var texts = [];
+                                       if ( data.query && data.query.allpages ) {
+                                               $.each( data.query.allpages, function ( i, category ) {
+                                                       texts.push( new mw.Title( category.title ).getNameText() );
+                                               } );
+                                       }
+                                       return texts;
+                               } )
+                               .done( ok )
+                               .fail( err )
+                               .promise( { abort: apiPromise.abort } );
+               },
+
+               /**
+                * Get the categories that a particular page on the wiki belongs to.
+                *
+                * @param {mw.Title|string} title
+                * @param {Function} [ok] Success callback (deprecated)
+                * @param {Function} [err] Error callback (deprecated)
+                * @param {boolean} [async=true] Asynchronousness (deprecated)
+                * @return {jQuery.Promise}
+                * @return {Function} return.done
+                * @return {boolean|mw.Title[]} return.done.categories List of category titles or false
+                *  if title was not found.
+                */
+               getCategories: function ( title, ok, err, async ) {
+                       var apiPromise = this.get( {
+                               prop: 'categories',
+                               titles: String( title )
+                       }, {
+                               async: async === undefined ? true : async
+                       } );
+
+                       if ( ok || err ) {
+                               mw.track( 'mw.deprecate', 'api.cbParam' );
+                               mw.log.warn( msg );
+                       }
+                       if ( async !== undefined ) {
+                               mw.track( 'mw.deprecate', 'api.async' );
+                               mw.log.warn(
+                                       'Use of mediawiki.api async=false param is deprecated. ' +
+                                       'The sychronous mode will be removed in the future.'
+                               );
+                       }
+
+                       return apiPromise
+                               .then( function ( data ) {
+                                       var titles = false;
+                                       if ( data.query && data.query.pages ) {
+                                               $.each( data.query.pages, function ( id, page ) {
+                                                       if ( page.categories ) {
+                                                               if ( titles === false ) {
+                                                                       titles = [];
+                                                               }
+                                                               $.each( page.categories, function ( i, cat ) {
+                                                                       titles.push( new mw.Title( cat.title ) );
+                                                               } );
+                                                       }
+                                               } );
+                                       }
+                                       return titles;
+                               } )
+                               .done( ok )
+                               .fail( err )
+                               .promise( { abort: apiPromise.abort } );
+               }
+       } );
+
+       /**
+        * @class mw.Api
+        * @mixins mw.Api.plugin.category
+        */
+
+}( mediaWiki, jQuery ) );
diff --git a/resources/src/mediawiki.api/mediawiki.api.edit.js b/resources/src/mediawiki.api/mediawiki.api.edit.js
new file mode 100644 (file)
index 0000000..edfb34a
--- /dev/null
@@ -0,0 +1,75 @@
+/**
+ * @class mw.Api.plugin.edit
+ */
+( function ( mw, $ ) {
+
+       var msg = 'Use of mediawiki.api callback params is deprecated. Use the Promise instead.';
+       $.extend( mw.Api.prototype, {
+
+               /**
+                * Post to API with edit token. If we have no token, get one and try to post.
+                * If we have a cached token try using that, and if it fails, blank out the
+                * cached token and start over.
+                *
+                * @param {Object} params API parameters
+                * @param {Function} [ok] Success callback (deprecated)
+                * @param {Function} [err] Error callback (deprecated)
+                * @return {jQuery.Promise} See #post
+                */
+               postWithEditToken: function ( params, ok, err ) {
+                       if ( ok || err ) {
+                               mw.track( 'mw.deprecate', 'api.cbParam' );
+                               mw.log.warn( msg );
+                       }
+                       return this.postWithToken( 'edit', params ).done( ok ).fail( err );
+               },
+
+               /**
+                * Api helper to grab an edit token.
+                *
+                * @param {Function} [ok] Success callback (deprecated)
+                * @param {Function} [err] Error callback (deprecated)
+                * @return {jQuery.Promise}
+                * @return {Function} return.done
+                * @return {string} return.done.token Received token.
+                */
+               getEditToken: function ( ok, err ) {
+                       if ( ok || err ) {
+                               mw.track( 'mw.deprecate', 'api.cbParam' );
+                               mw.log.warn( msg );
+                       }
+                       return this.getToken( 'edit' ).done( ok ).fail( err );
+               },
+
+               /**
+                * Create a new section of the page.
+                * @see #postWithEditToken
+                * @param {mw.Title|String} title Target page
+                * @param {string} header
+                * @param {string} message wikitext message
+                * @param {Function} [ok] Success handler (deprecated)
+                * @param {Function} [err] Error handler (deprecated)
+                * @return {jQuery.Promise}
+                */
+               newSection: function ( title, header, message, ok, err ) {
+                       if ( ok || err ) {
+                               mw.track( 'mw.deprecate', 'api.cbParam' );
+                               mw.log.warn( msg );
+                       }
+                       return this.postWithEditToken( {
+                               action: 'edit',
+                               section: 'new',
+                               format: 'json',
+                               title: String( title ),
+                               summary: header,
+                               text: message
+                       } ).done( ok ).fail( err );
+               }
+       } );
+
+       /**
+        * @class mw.Api
+        * @mixins mw.Api.plugin.edit
+        */
+
+}( mediaWiki, jQuery ) );
diff --git a/resources/src/mediawiki.api/mediawiki.api.js b/resources/src/mediawiki.api/mediawiki.api.js
new file mode 100644 (file)
index 0000000..b37e2a6
--- /dev/null
@@ -0,0 +1,384 @@
+( function ( mw, $ ) {
+
+       // We allow people to omit these default parameters from API requests
+       // there is very customizable error handling here, on a per-call basis
+       // wondering, would it be simpler to make it easy to clone the api object,
+       // change error handling, and use that instead?
+       var defaultOptions = {
+
+                       // Query parameters for API requests
+                       parameters: {
+                               action: 'query',
+                               format: 'json'
+                       },
+
+                       // Ajax options for jQuery.ajax()
+                       ajax: {
+                               url: mw.util.wikiScript( 'api' ),
+
+                               timeout: 30 * 1000, // 30 seconds
+
+                               dataType: 'json'
+                       }
+               },
+               // Keyed by ajax url and symbolic name for the individual request
+               deferreds = {};
+
+       // Pre-populate with fake ajax deferreds to save http requests for tokens
+       // we already have on the page via the user.tokens module (bug 34733).
+       deferreds[ defaultOptions.ajax.url ] = {};
+       $.each( mw.user.tokens.get(), function ( key, value ) {
+               // This requires #getToken to use the same key as user.tokens.
+               // Format: token-type + "Token" (eg. editToken, patrolToken, watchToken).
+               deferreds[ defaultOptions.ajax.url ][ key ] = $.Deferred()
+                       .resolve( value )
+                       .promise( { abort: function () {} } );
+       } );
+
+       /**
+        * Constructor to create an object to interact with the API of a particular MediaWiki server.
+        * mw.Api objects represent the API of a particular MediaWiki server.
+        *
+        * TODO: Share API objects with exact same config.
+        *
+        *     var api = new mw.Api();
+        *     api.get( {
+        *         action: 'query',
+        *         meta: 'userinfo'
+        *     } ).done ( function ( data ) {
+        *         console.log( data );
+        *     } );
+        *
+        * @class
+        *
+        * @constructor
+        * @param {Object} options See defaultOptions documentation above. Ajax options can also be
+        *  overridden for each individual request to {@link jQuery#ajax} later on.
+        */
+       mw.Api = function ( options ) {
+
+               if ( options === undefined ) {
+                       options = {};
+               }
+
+               // Force a string if we got a mw.Uri object
+               if ( options.ajax && options.ajax.url !== undefined ) {
+                       options.ajax.url = String( options.ajax.url );
+               }
+
+               options.parameters = $.extend( {}, defaultOptions.parameters, options.parameters );
+               options.ajax = $.extend( {}, defaultOptions.ajax, options.ajax );
+
+               this.defaults = options;
+       };
+
+       mw.Api.prototype = {
+
+               /**
+                * Normalize the ajax options for compatibility and/or convenience methods.
+                *
+                * @param {Object} [arg] An object contaning one or more of options.ajax.
+                * @return {Object} Normalized ajax options.
+                */
+               normalizeAjaxOptions: function ( arg ) {
+                       // Arg argument is usually empty
+                       // (before MW 1.20 it was used to pass ok callbacks)
+                       var opts = arg || {};
+                       // Options can also be a success callback handler
+                       if ( typeof arg === 'function' ) {
+                               opts = { ok: arg };
+                       }
+                       return opts;
+               },
+
+               /**
+                * Perform API get request
+                *
+                * @param {Object} parameters
+                * @param {Object|Function} [ajaxOptions]
+                * @return {jQuery.Promise}
+                */
+               get: function ( parameters, ajaxOptions ) {
+                       ajaxOptions = this.normalizeAjaxOptions( ajaxOptions );
+                       ajaxOptions.type = 'GET';
+                       return this.ajax( parameters, ajaxOptions );
+               },
+
+               /**
+                * Perform API post request
+                *
+                * TODO: Post actions for non-local hostnames will need proxy.
+                *
+                * @param {Object} parameters
+                * @param {Object|Function} [ajaxOptions]
+                * @return {jQuery.Promise}
+                */
+               post: function ( parameters, ajaxOptions ) {
+                       ajaxOptions = this.normalizeAjaxOptions( ajaxOptions );
+                       ajaxOptions.type = 'POST';
+                       return this.ajax( parameters, ajaxOptions );
+               },
+
+               /**
+                * Perform the API call.
+                *
+                * @param {Object} parameters
+                * @param {Object} [ajaxOptions]
+                * @return {jQuery.Promise} Done: API response data and the jqXHR object.
+                *  Fail: Error code
+                */
+               ajax: function ( parameters, ajaxOptions ) {
+                       var token,
+                               apiDeferred = $.Deferred(),
+                               msg = 'Use of mediawiki.api callback params is deprecated. Use the Promise instead.',
+                               xhr, key, formData;
+
+                       parameters = $.extend( {}, this.defaults.parameters, parameters );
+                       ajaxOptions = $.extend( {}, this.defaults.ajax, ajaxOptions );
+
+                       // Ensure that token parameter is last (per [[mw:API:Edit#Token]]).
+                       if ( parameters.token ) {
+                               token = parameters.token;
+                               delete parameters.token;
+                       }
+
+                       // If multipart/form-data has been requested and emulation is possible, emulate it
+                       if (
+                               ajaxOptions.type === 'POST' &&
+                               window.FormData &&
+                               ajaxOptions.contentType === 'multipart/form-data'
+                       ) {
+
+                               formData = new FormData();
+
+                               for ( key in parameters ) {
+                                       formData.append( key, parameters[key] );
+                               }
+                               // If we extracted a token parameter, add it back in.
+                               if ( token ) {
+                                       formData.append( 'token', token );
+                               }
+
+                               ajaxOptions.data = formData;
+
+                               // Prevent jQuery from mangling our FormData object
+                               ajaxOptions.processData = false;
+                               // Prevent jQuery from overriding the Content-Type header
+                               ajaxOptions.contentType = false;
+                       } else {
+                               // Some deployed MediaWiki >= 1.17 forbid periods in URLs, due to an IE XSS bug
+                               // So let's escape them here. See bug #28235
+                               // This works because jQuery accepts data as a query string or as an Object
+                               ajaxOptions.data = $.param( parameters ).replace( /\./g, '%2E' );
+
+                               // If we extracted a token parameter, add it back in.
+                               if ( token ) {
+                                       ajaxOptions.data += '&token=' + encodeURIComponent( token );
+                               }
+
+                               if ( ajaxOptions.contentType === 'multipart/form-data' ) {
+                                       // We were asked to emulate but can't, so drop the Content-Type header, otherwise
+                                       // it'll be wrong and the server will fail to decode the POST body
+                                       delete ajaxOptions.contentType;
+                               }
+                       }
+
+                       // Backwards compatibility: Before MediaWiki 1.20,
+                       // callbacks were done with the 'ok' and 'err' property in ajaxOptions.
+                       if ( ajaxOptions.ok ) {
+                               mw.track( 'mw.deprecate', 'api.cbParam' );
+                               mw.log.warn( msg );
+                               apiDeferred.done( ajaxOptions.ok );
+                               delete ajaxOptions.ok;
+                       }
+                       if ( ajaxOptions.err ) {
+                               mw.track( 'mw.deprecate', 'api.cbParam' );
+                               mw.log.warn( msg );
+                               apiDeferred.fail( ajaxOptions.err );
+                               delete ajaxOptions.err;
+                       }
+
+                       // Make the AJAX request
+                       xhr = $.ajax( ajaxOptions )
+                               // If AJAX fails, reject API call with error code 'http'
+                               // and details in second argument.
+                               .fail( function ( xhr, textStatus, exception ) {
+                                       apiDeferred.reject( 'http', {
+                                               xhr: xhr,
+                                               textStatus: textStatus,
+                                               exception: exception
+                                       } );
+                               } )
+                               // AJAX success just means "200 OK" response, also check API error codes
+                               .done( function ( result, textStatus, jqXHR ) {
+                                       if ( result === undefined || result === null || result === '' ) {
+                                               apiDeferred.reject( 'ok-but-empty',
+                                                       'OK response but empty result (check HTTP headers?)'
+                                               );
+                                       } else if ( result.error ) {
+                                               var code = result.error.code === undefined ? 'unknown' : result.error.code;
+                                               apiDeferred.reject( code, result );
+                                       } else {
+                                               apiDeferred.resolve( result, jqXHR );
+                                       }
+                               } );
+
+                       // Return the Promise
+                       return apiDeferred.promise( { abort: xhr.abort } ).fail( function ( code, details ) {
+                               mw.log( 'mw.Api error: ', code, details );
+                       } );
+               },
+
+               /**
+                * Post to API with specified type of token. If we have no token, get one and try to post.
+                * If we have a cached token try using that, and if it fails, blank out the
+                * cached token and start over. For example to change an user option you could do:
+                *
+                *     new mw.Api().postWithToken( 'options', {
+                *         action: 'options',
+                *         optionname: 'gender',
+                *         optionvalue: 'female'
+                *     } );
+                *
+                * @param {string} tokenType The name of the token, like options or edit.
+                * @param {Object} params API parameters
+                * @return {jQuery.Promise} See #post
+                * @since 1.22
+                */
+               postWithToken: function ( tokenType, params ) {
+                       var api = this;
+
+                       return api.getToken( tokenType ).then( function ( token ) {
+                               params.token = token;
+                               return api.post( params ).then(
+                                       // If no error, return to caller as-is
+                                       null,
+                                       // Error handler
+                                       function ( code ) {
+                                               if ( code === 'badtoken' ) {
+                                                       // Clear from cache
+                                                       deferreds[ this.defaults.ajax.url ][ tokenType + 'Token' ] =
+                                                               params.token = undefined;
+
+                                                       // Try again, once
+                                                       return api.getToken( tokenType ).then( function ( token ) {
+                                                               params.token = token;
+                                                               return api.post( params );
+                                                       } );
+                                               }
+
+                                               // Different error, pass on to let caller handle the error code
+                                               return this;
+                                       }
+                               );
+                       } );
+               },
+
+               /**
+                * Get a token for a certain action from the API.
+                *
+                * @param {string} type Token type
+                * @return {jQuery.Promise}
+                * @return {Function} return.done
+                * @return {string} return.done.token Received token.
+                * @since 1.22
+                */
+               getToken: function ( type ) {
+                       var apiPromise,
+                               deferredGroup = deferreds[ this.defaults.ajax.url ],
+                               d = deferredGroup && deferredGroup[ type + 'Token' ];
+
+                       if ( !d ) {
+                               d = $.Deferred();
+
+                               apiPromise = this.get( { action: 'tokens', type: type } )
+                                       .done( function ( data ) {
+                                               // If token type is not available for this user,
+                                               // key '...token' is missing or can contain Boolean false
+                                               if ( data.tokens && data.tokens[type + 'token'] ) {
+                                                       d.resolve( data.tokens[type + 'token'] );
+                                               } else {
+                                                       d.reject( 'token-missing', data );
+                                               }
+                                       } )
+                                       .fail( d.reject );
+
+                               // Attach abort handler
+                               d.abort = apiPromise.abort;
+
+                               // Store deferred now so that we can use this again even if it isn't ready yet
+                               if ( !deferredGroup ) {
+                                       deferredGroup = deferreds[ this.defaults.ajax.url ] = {};
+                               }
+                               deferredGroup[ type + 'Token' ] = d;
+                       }
+
+                       return d.promise( { abort: d.abort } );
+               }
+       };
+
+       /**
+        * @static
+        * @property {Array}
+        * List of errors we might receive from the API.
+        * For now, this just documents our expectation that there should be similar messages
+        * available.
+        */
+       mw.Api.errors = [
+               // occurs when POST aborted
+               // jQuery 1.4 can't distinguish abort or lost connection from 200 OK + empty result
+               'ok-but-empty',
+
+               // timeout
+               'timeout',
+
+               // really a warning, but we treat it like an error
+               'duplicate',
+               'duplicate-archive',
+
+               // upload succeeded, but no image info.
+               // this is probably impossible, but might as well check for it
+               'noimageinfo',
+               // remote errors, defined in API
+               'uploaddisabled',
+               'nomodule',
+               'mustbeposted',
+               'badaccess-groups',
+               'stashfailed',
+               'missingresult',
+               'missingparam',
+               'invalid-file-key',
+               'copyuploaddisabled',
+               'mustbeloggedin',
+               'empty-file',
+               'file-too-large',
+               'filetype-missing',
+               'filetype-banned',
+               'filetype-banned-type',
+               'filename-tooshort',
+               'illegal-filename',
+               'verification-error',
+               'hookaborted',
+               'unknown-error',
+               'internal-error',
+               'overwrite',
+               'badtoken',
+               'fetchfileerror',
+               'fileexists-shared-forbidden',
+               'invalidtitle',
+               'notloggedin'
+       ];
+
+       /**
+        * @static
+        * @property {Array}
+        * List of warnings we might receive from the API.
+        * For now, this just documents our expectation that there should be similar messages
+        * available.
+        */
+       mw.Api.warnings = [
+               'duplicate',
+               'exists'
+       ];
+
+}( mediaWiki, jQuery ) );
diff --git a/resources/src/mediawiki.api/mediawiki.api.login.js b/resources/src/mediawiki.api/mediawiki.api.login.js
new file mode 100644 (file)
index 0000000..ccbae06
--- /dev/null
@@ -0,0 +1,54 @@
+/**
+ * Make the two-step login easier.
+ * @author Niklas Laxström
+ * @class mw.Api.plugin.login
+ * @since 1.22
+ */
+( function ( mw, $ ) {
+       'use strict';
+
+       $.extend( mw.Api.prototype, {
+               /**
+                * @param {string} username
+                * @param {string} password
+                * @return {jQuery.Promise} See mw.Api#post
+                */
+               login: function ( username, password ) {
+                       var params, request,
+                               deferred = $.Deferred(),
+                               api = this;
+
+                       params = {
+                               action: 'login',
+                               lgname: username,
+                               lgpassword: password
+                       };
+
+                       request = api.post( params );
+                       request.fail( deferred.reject );
+                       request.done( function ( data ) {
+                               params.lgtoken = data.login.token;
+                               api.post( params )
+                                       .fail( deferred.reject )
+                                       .done( function ( data ) {
+                                               var code;
+                                               if ( data.login && data.login.result === 'Success' ) {
+                                                       deferred.resolve( data );
+                                               } else {
+                                                       // Set proper error code whenever possible
+                                                       code = data.error && data.error.code || 'unknown';
+                                                       deferred.reject( code, data );
+                                               }
+                                       } );
+                       } );
+
+                       return deferred.promise( { abort: request.abort } );
+               }
+       } );
+
+       /**
+        * @class mw.Api
+        * @mixins mw.Api.plugin.login
+        */
+
+}( mediaWiki, jQuery ) );
diff --git a/resources/src/mediawiki.api/mediawiki.api.parse.js b/resources/src/mediawiki.api/mediawiki.api.parse.js
new file mode 100644 (file)
index 0000000..b1f1d2b
--- /dev/null
@@ -0,0 +1,45 @@
+/**
+ * @class mw.Api.plugin.parse
+ */
+( function ( mw, $ ) {
+
+       $.extend( mw.Api.prototype, {
+               /**
+                * Convenience method for 'action=parse'.
+                *
+                * @param {string} wikitext
+                * @param {Function} [ok] Success callback (deprecated)
+                * @param {Function} [err] Error callback (deprecated)
+                * @return {jQuery.Promise}
+                * @return {Function} return.done
+                * @return {string} return.done.data Parsed HTML of `wikitext`.
+                */
+               parse: function ( wikitext, ok, err ) {
+                       var apiPromise = this.get( {
+                               action: 'parse',
+                               contentmodel: 'wikitext',
+                               text: wikitext
+                       } );
+
+                       // Backwards compatibility (< MW 1.20)
+                       if ( ok || err ) {
+                               mw.track( 'mw.deprecate', 'api.cbParam' );
+                               mw.log.warn( 'Use of mediawiki.api callback params is deprecated. Use the Promise instead.' );
+                       }
+
+                       return apiPromise
+                               .then( function ( data ) {
+                                       return data.parse.text['*'];
+                               } )
+                               .done( ok )
+                               .fail( err )
+                               .promise( { abort: apiPromise.abort } );
+               }
+       } );
+
+       /**
+        * @class mw.Api
+        * @mixins mw.Api.plugin.parse
+        */
+
+}( mediaWiki, jQuery ) );
diff --git a/resources/src/mediawiki.api/mediawiki.api.watch.js b/resources/src/mediawiki.api/mediawiki.api.watch.js
new file mode 100644 (file)
index 0000000..aa33d86
--- /dev/null
@@ -0,0 +1,80 @@
+/**
+ * @class mw.Api.plugin.watch
+ * @since 1.19
+ */
+( function ( mw, $ ) {
+
+       /**
+        * @private
+        * @static
+        * @context mw.Api
+        *
+        * @param {string|mw.Title|string[]|mw.Title[]} pages Full page name or instance of mw.Title, or an
+        *  array thereof. If an array is passed, the return value passed to the promise will also be an
+        *  array of appropriate objects.
+        * @param {Function} [ok] Success callback (deprecated)
+        * @param {Function} [err] Error callback (deprecated)
+        * @return {jQuery.Promise}
+        * @return {Function} return.done
+        * @return {Object|Object[]} return.done.watch Object or list of objects (depends on the `pages`
+        *  parameter)
+        * @return {string} return.done.watch.title Full pagename
+        * @return {boolean} return.done.watch.watched Whether the page is now watched or unwatched
+        * @return {string} return.done.watch.message Parsed HTML of the confirmational interface message
+        */
+       function doWatchInternal( pages, ok, err, addParams ) {
+               // XXX: Parameter addParams is undocumented because we inherit this
+               // documentation in the public method...
+               var apiPromise = this.post(
+                       $.extend(
+                               {
+                                       action: 'watch',
+                                       titles: $.isArray( pages ) ? pages.join( '|' ) : String( pages ),
+                                       token: mw.user.tokens.get( 'watchToken' ),
+                                       uselang: mw.config.get( 'wgUserLanguage' )
+                               },
+                               addParams
+                       )
+               );
+
+               // Backwards compatibility (< MW 1.20)
+               if ( ok || err ) {
+                       mw.track( 'mw.deprecate', 'api.cbParam' );
+                       mw.log.warn( 'Use of mediawiki.api callback params is deprecated. Use the Promise instead.' );
+               }
+
+               return apiPromise
+                       .then( function ( data ) {
+                               // If a single page was given (not an array) respond with a single item as well.
+                               return $.isArray( pages ) ? data.watch : data.watch[0];
+                       } )
+                       .done( ok )
+                       .fail( err )
+                       .promise( { abort: apiPromise.abort } );
+       }
+
+       $.extend( mw.Api.prototype, {
+               /**
+                * Convenience method for `action=watch`.
+                *
+                * @inheritdoc #doWatchInternal
+                */
+               watch: function ( pages, ok, err ) {
+                       return doWatchInternal.call( this, pages, ok, err );
+               },
+               /**
+                * Convenience method for `action=watch&unwatch=1`.
+                *
+                * @inheritdoc #doWatchInternal
+                */
+               unwatch: function ( pages, ok, err ) {
+                       return doWatchInternal.call( this, pages, ok, err, { unwatch: 1 } );
+               }
+       } );
+
+       /**
+        * @class mw.Api
+        * @mixins mw.Api.plugin.watch
+        */
+
+}( mediaWiki, jQuery ) );
diff --git a/resources/src/mediawiki.language/languages/bs.js b/resources/src/mediawiki.language/languages/bs.js
new file mode 100644 (file)
index 0000000..b56e4b2
--- /dev/null
@@ -0,0 +1,19 @@
+/*!
+ * Bosnian (bosanski) language functions
+ */
+
+mediaWiki.language.convertGrammar = function ( word, form ) {
+       var grammarForms = mediaWiki.language.getData( 'bs', 'grammarForms' );
+       if ( grammarForms && grammarForms[form] ) {
+               return grammarForms[form][word];
+       }
+       switch ( form ) {
+               case 'instrumental': // instrumental
+                       word = 's ' + word;
+                       break;
+               case 'lokativ': // locative
+                       word = 'o ' + word;
+                       break;
+       }
+       return word;
+};
diff --git a/resources/src/mediawiki.language/languages/dsb.js b/resources/src/mediawiki.language/languages/dsb.js
new file mode 100644 (file)
index 0000000..69c36cc
--- /dev/null
@@ -0,0 +1,19 @@
+/*!
+ * Lower Sorbian (Dolnoserbski) language functions
+ */
+
+mediaWiki.language.convertGrammar = function ( word, form ) {
+       var grammarForms = mediaWiki.language.getData( 'dsb', 'grammarForms' );
+       if ( grammarForms && grammarForms[form] ) {
+               return grammarForms[form][word];
+       }
+       switch ( form ) {
+               case 'instrumental': // instrumental
+                       word = 'z ' + word;
+                       break;
+               case 'lokatiw': // lokatiw
+                       word = 'wo ' + word;
+                       break;
+       }
+       return word;
+};
diff --git a/resources/src/mediawiki.language/languages/fi.js b/resources/src/mediawiki.language/languages/fi.js
new file mode 100644 (file)
index 0000000..2382aae
--- /dev/null
@@ -0,0 +1,47 @@
+/*!
+ * Finnish (Suomi) language functions
+ * @author Santhosh Thottingal
+ */
+
+mediaWiki.language.convertGrammar = function ( word, form ) {
+       var grammarForms, aou, origWord;
+
+       grammarForms = mediaWiki.language.getData( 'fi', 'grammarForms' );
+       if ( grammarForms && grammarForms[form] ) {
+               return grammarForms[form][word];
+       }
+
+       // vowel harmony flag
+       aou = word.match( /[aou][^äöy]*$/i );
+       origWord = word;
+       if ( word.match( /wiki$/i ) ) {
+               aou = false;
+       }
+       //append i after final consonant
+       if ( word.match( /[bcdfghjklmnpqrstvwxz]$/i ) ) {
+               word += 'i';
+       }
+
+       switch ( form ) {
+               case 'genitive':
+                       word += 'n';
+                       break;
+               case 'elative':
+                       word += ( aou ? 'sta' : 'stä' );
+                       break;
+               case 'partitive':
+                       word += ( aou ? 'a' : 'ä' );
+                       break;
+               case 'illative':
+                       // Double the last letter and add 'n'
+                       word += word.substr(  word.length - 1 ) + 'n';
+                       break;
+               case 'inessive':
+                       word += ( aou ? 'ssa' : 'ssä' );
+                       break;
+               default:
+                       word = origWord;
+                       break;
+       }
+       return word;
+};
diff --git a/resources/src/mediawiki.language/languages/ga.js b/resources/src/mediawiki.language/languages/ga.js
new file mode 100644 (file)
index 0000000..fb4e939
--- /dev/null
@@ -0,0 +1,38 @@
+/*!
+ * Irish (Gaeilge) language functions
+ */
+
+mediaWiki.language.convertGrammar = function ( word, form ) {
+       /*jshint onecase:true */
+       var grammarForms = mediaWiki.language.getData( 'ga', 'grammarForms' );
+       if ( grammarForms && grammarForms[form] ) {
+               return grammarForms[form][word];
+       }
+       switch ( form ) {
+               case 'ainmlae':
+                       switch ( word ) {
+                               case 'an Domhnach':
+                                       word = 'Dé Domhnaigh';
+                                       break;
+                               case 'an Luan':
+                                       word = 'Dé Luain';
+                                       break;
+                               case 'an Mháirt':
+                                       word = 'Dé Mháirt';
+                                       break;
+                               case 'an Chéadaoin':
+                                       word = 'Dé Chéadaoin';
+                                       break;
+                               case 'an Déardaoin':
+                                       word = 'Déardaoin';
+                                       break;
+                               case 'an Aoine':
+                                       word = 'Dé hAoine';
+                                       break;
+                               case 'an Satharn':
+                                       word = 'Dé Sathairn';
+                                       break;
+                       }
+       }
+       return word;
+};
diff --git a/resources/src/mediawiki.language/languages/he.js b/resources/src/mediawiki.language/languages/he.js
new file mode 100644 (file)
index 0000000..486e993
--- /dev/null
@@ -0,0 +1,29 @@
+/*!
+ * Hebrew (עברית) language functions
+ */
+
+mediaWiki.language.convertGrammar = function ( word, form ) {
+       var grammarForms = mediaWiki.language.getData( 'he', 'grammarForms' );
+       if ( grammarForms && grammarForms[form] ) {
+               return grammarForms[form][word];
+       }
+       switch ( form ) {
+               case 'prefixed':
+               case 'תחילית': // the same word in Hebrew
+                       // Duplicate prefixed "Waw", but only if it's not already double
+                       if ( word.substr( 0, 1 ) === 'ו' && word.substr( 0, 2 ) !== 'וו' ) {
+                               word = 'ו' + word;
+                       }
+
+                       // Remove the "He" if prefixed
+                       if ( word.substr( 0, 1 ) === 'ה' ) {
+                               word = word.substr( 1, word.length );
+                       }
+
+                       // Add a hyphen (maqaf) before numbers and non-Hebrew letters
+                       if (  word.substr( 0, 1 ) < 'א' ||  word.substr( 0, 1 ) > 'ת' ) {
+                               word = '־' + word;
+                       }
+       }
+       return word;
+};
diff --git a/resources/src/mediawiki.language/languages/hsb.js b/resources/src/mediawiki.language/languages/hsb.js
new file mode 100644 (file)
index 0000000..2d6b733
--- /dev/null
@@ -0,0 +1,19 @@
+/*!
+ * Upper Sorbian (Hornjoserbsce) language functions
+ */
+
+mediaWiki.language.convertGrammar = function ( word, form ) {
+       var grammarForms = mediaWiki.language.getData( 'hsb', 'grammarForms' );
+       if ( grammarForms && grammarForms[form] ) {
+               return grammarForms[form][word];
+       }
+       switch ( form ) {
+               case 'instrumental': // instrumental
+                       word = 'z ' + word;
+                       break;
+               case 'lokatiw': // lokatiw
+                       word = 'wo ' + word;
+                       break;
+               }
+       return word;
+};
diff --git a/resources/src/mediawiki.language/languages/hu.js b/resources/src/mediawiki.language/languages/hu.js
new file mode 100644 (file)
index 0000000..d72a1c0
--- /dev/null
@@ -0,0 +1,23 @@
+/*!
+ * Hungarian language functions
+ * @author Santhosh Thottingal
+ */
+
+mediaWiki.language.convertGrammar = function ( word, form ) {
+       var grammarForms = mediaWiki.language.getData( 'hu', 'grammarForms' );
+       if ( grammarForms && grammarForms[form] ) {
+               return grammarForms[form][word];
+       }
+       switch ( form ) {
+               case 'rol':
+                       word += 'ról';
+                       break;
+               case 'ba':
+                       word += 'ba';
+                       break;
+               case 'k':
+                       word += 'k';
+                       break;
+       }
+       return word;
+};
diff --git a/resources/src/mediawiki.language/languages/hy.js b/resources/src/mediawiki.language/languages/hy.js
new file mode 100644 (file)
index 0000000..ae16f24
--- /dev/null
@@ -0,0 +1,29 @@
+/*!
+ * Armenian (Հայերեն) language functions
+ */
+
+mediaWiki.language.convertGrammar = function ( word, form ) {
+       /*jshint onecase:true */
+       var grammarForms = mediaWiki.language.getData( 'hy', 'grammarForms' );
+       if ( grammarForms && grammarForms[form] ) {
+               return grammarForms[form][word];
+       }
+
+       // These rules are not perfect, but they are currently only used for site names so it doesn't
+       // matter if they are wrong sometimes. Just add a special case for your site name if necessary.
+
+       switch ( form ) {
+               case 'genitive': // սեռական հոլով
+                       if ( word.substr( -1 ) === 'ա' ) {
+                               word = word.substr( 0, word.length - 1 ) + 'այի';
+                       } else if ( word.substr( -1 ) === 'ո' ) {
+                               word = word.substr( 0, word.length - 1 ) + 'ոյի';
+                       } else if ( word.substr( -4 ) === 'գիրք' ) {
+                               word = word.substr( 0, word.length - 4 ) + 'գրքի';
+                       } else {
+                               word = word + 'ի';
+                       }
+                       break;
+               }
+       return word;
+};
diff --git a/resources/src/mediawiki.language/languages/la.js b/resources/src/mediawiki.language/languages/la.js
new file mode 100644 (file)
index 0000000..04b7d0a
--- /dev/null
@@ -0,0 +1,50 @@
+/*!
+ * Latin (lingua Latina) language functions
+ * @author Santhosh Thottingal
+ */
+
+mediaWiki.language.convertGrammar = function ( word, form ) {
+       var grammarForms = mediaWiki.language.getData( 'la', 'grammarForms' );
+       if ( grammarForms && grammarForms[form] ) {
+               return grammarForms[form][word];
+       }
+       switch ( form ) {
+               case 'genitive':
+                       // only a few declensions, and even for those mostly the singular only
+                       word = word.replace( /u[ms]$/i, 'i' ); // 2nd declension singular
+                       word = word.replace( /ommunia$/i, 'ommunium' ); // 3rd declension neuter plural (partly)
+                       word = word.replace( /a$/i, 'ae' ); // 1st declension singular
+                       word = word.replace( /libri$/i,'librorum' ); // 2nd declension plural (partly)
+                       word = word.replace( /nuntii$/i, 'nuntiorum' ); // 2nd declension plural (partly)
+                       word = word.replace( /tio$/i,'tionis' ); // 3rd declension singular (partly)
+                       word = word.replace( /ns$/i, 'ntis' );
+                       word = word.replace( /as$/i, 'atis' );
+                       word = word.replace( /es$/i, 'ei' ); // 5th declension singular
+                       break;
+               case 'accusative':
+                       // only a few declensions, and even for those mostly the singular only
+                       word = word.replace( /u[ms]$/i, 'um' ); // 2nd declension singular
+                       word = word.replace( /ommunia$/i, 'am' ); // 3rd declension neuter plural (partly)
+                       word = word.replace( /a$/i, 'ommunia' ); // 1st declension singular
+                       word = word.replace( /libri$/i,'libros' ); // 2nd declension plural (partly)
+                       word = word.replace( /nuntii$/i, 'nuntios' );// 2nd declension plural (partly)
+                       word = word.replace( /tio$/i,'tionem' ); // 3rd declension singular (partly)
+                       word = word.replace( /ns$/i, 'ntem' );
+                       word = word.replace( /as$/i, 'atem');
+                       word = word.replace( /es$/i, 'em' ); // 5th declension singular
+                       break;
+               case 'ablative':
+                       // only a few declensions, and even for those mostly the singular only
+                       word = word.replace( /u[ms]$/i, 'o' ); // 2nd declension singular
+                       word = word.replace( /ommunia$/i, 'ommunibus' ); // 3rd declension neuter plural (partly)
+                       word = word.replace( /a$/i, 'a' ); // 1st declension singular
+                       word = word.replace( /libri$/i,'libris' ); // 2nd declension plural (partly)
+                       word = word.replace( /nuntii$/i, 'nuntiis' ); // 2nd declension plural (partly)
+                       word = word.replace( /tio$/i,'tione' ); // 3rd declension singular (partly)
+                       word = word.replace( /ns$/i, 'nte' );
+                       word = word.replace( /as$/i, 'ate');
+                       word = word.replace( /es$/i, 'e' ); // 5th declension singular
+                       break;
+       }
+       return word;
+};
diff --git a/resources/src/mediawiki.language/languages/os.js b/resources/src/mediawiki.language/languages/os.js
new file mode 100644 (file)
index 0000000..bdf59be
--- /dev/null
@@ -0,0 +1,69 @@
+/*!
+ * Ossetian (Ирон) language functions
+ * @author Santhosh Thottingal
+ */
+
+mediaWiki.language.convertGrammar = function ( word, form ) {
+       var grammarForms = mediaWiki.language.getData( 'os', 'grammarForms' ),
+               // Ending for allative case
+               endAllative = 'мæ',
+               // Variable for 'j' beetwen vowels
+               jot = '',
+               // Variable for "-" for not Ossetic words
+               hyphen = '',
+               // Variable for ending
+               ending = '';
+
+       if ( grammarForms && grammarForms[form] ) {
+               return grammarForms[form][word];
+       }
+       // Checking if the $word is in plural form
+       if ( word.match( /тæ$/i ) ) {
+               word = word.substring( 0, word.length - 1 );
+               endAllative = 'æм';
+       }
+       // Works if word is in singular form.
+       // Checking if word ends on one of the vowels: е, ё, и, о, ы, э, ю, я.
+       else if ( word.match( /[аæеёиоыэюя]$/i ) ) {
+               jot = 'й';
+       }
+       // Checking if word ends on 'у'. 'У' can be either consonant 'W' or vowel 'U' in cyrillic Ossetic.
+       // Examples: {{grammar:genitive|аунеу}} = аунеуы, {{grammar:genitive|лæппу}} = лæппуйы.
+       else if ( word.match( /у$/i ) ) {
+               if ( !word.substring( word.length - 2, word.length - 1 ).match( /[аæеёиоыэюя]$/i ) ) {
+                       jot = 'й';
+               }
+       } else if ( !word.match( /[бвгджзйклмнопрстфхцчшщьъ]$/i ) ) {
+               hyphen = '-';
+       }
+
+       switch ( form ) {
+               case 'genitive':
+                       ending = hyphen + jot + 'ы';
+                       break;
+               case 'dative':
+                       ending = hyphen + jot + 'æн';
+                       break;
+               case 'allative':
+                       ending = hyphen + endAllative;
+                       break;
+               case 'ablative':
+                       if ( jot === 'й' ) {
+                               ending = hyphen + jot + 'æ';
+                       }
+                       else {
+                               ending = hyphen + jot + 'æй';
+                       }
+                       break;
+               case 'superessive':
+                       ending = hyphen + jot + 'ыл';
+                       break;
+               case 'equative':
+                       ending = hyphen + jot + 'ау';
+                       break;
+               case 'comitative':
+                       ending = hyphen + 'имæ';
+                       break;
+       }
+       return word + ending;
+};
diff --git a/resources/src/mediawiki.language/languages/ru.js b/resources/src/mediawiki.language/languages/ru.js
new file mode 100644 (file)
index 0000000..e66b9cd
--- /dev/null
@@ -0,0 +1,53 @@
+/*!
+ * Russian (Русский) language functions
+ */
+
+// These tests were originally made for names of Wikimedia
+// websites, so they don't currently cover all the possible
+// cases.
+
+mediaWiki.language.convertGrammar = function ( word, form ) {
+       'use strict';
+
+       var grammarForms = mediaWiki.language.getData( 'ru', 'grammarForms' );
+       if ( grammarForms && grammarForms[form] ) {
+               return grammarForms[form][word];
+       }
+       switch ( form ) {
+               case 'genitive': // родительный падеж
+                       if ( word.substr( word.length - 1 ) === 'ь' ) {
+                               word = word.substr(0, word.length - 1 ) + 'я';
+                       } else if ( word.substr( word.length - 2 ) === 'ия' ) {
+                               word = word.substr(0, word.length - 2 ) + 'ии';
+                       } else if ( word.substr( word.length - 2 ) === 'ка' ) {
+                               word = word.substr(0, word.length - 2 ) + 'ки';
+                       } else if ( word.substr( word.length - 2 )  === 'ти' ) {
+                               word = word.substr(0, word.length - 2 ) + 'тей';
+                       } else if ( word.substr( word.length - 2 ) === 'ды' ) {
+                               word = word.substr(0, word.length - 2 ) + 'дов';
+                       } else if ( word.substr( word.length - 3 ) === 'ные' ) {
+                               word = word.substr(0, word.length - 3 ) + 'ных';
+                       } else if ( word.substr( word.length - 3 ) === 'ник' ) {
+                               word = word.substr(0, word.length - 3 ) + 'ника';
+                       }
+                       break;
+               case 'prepositional': // предложный падеж
+                       if ( word.substr( word.length - 1 ) === 'ь' ) {
+                               word = word.substr(0, word.length - 1 ) + 'е';
+                       } else if ( word.substr( word.length - 2 ) === 'ия' ) {
+                               word = word.substr(0, word.length - 2 ) + 'ии';
+                       } else if ( word.substr( word.length - 2 ) === 'ка' ) {
+                               word = word.substr(0, word.length - 2 ) + 'ке';
+                       } else if ( word.substr( word.length - 2 )  === 'ти' ) {
+                               word = word.substr(0, word.length - 2 ) + 'тях';
+                       } else if ( word.substr( word.length - 2 ) === 'ды' ) {
+                               word = word.substr(0, word.length - 2 ) + 'дах';
+                       } else if ( word.substr( word.length - 3 ) === 'ные' ) {
+                               word = word.substr(0, word.length - 3 ) + 'ных';
+                       } else if ( word.substr( word.length - 3 ) === 'ник' ) {
+                               word = word.substr(0, word.length - 3 ) + 'нике';
+                       }
+                       break;
+       }
+       return word;
+};
diff --git a/resources/src/mediawiki.language/languages/sl.js b/resources/src/mediawiki.language/languages/sl.js
new file mode 100644 (file)
index 0000000..d20d0b3
--- /dev/null
@@ -0,0 +1,19 @@
+/*!
+ * Slovenian (Slovenščina) language functions
+ */
+
+mediaWiki.language.convertGrammar = function ( word, form ) {
+       var grammarForms = mediaWiki.language.getData( 'sl', 'grammarForms' );
+       if ( grammarForms && grammarForms[form] ) {
+               return grammarForms[form][word];
+       }
+       switch ( form ) {
+               case 'mestnik': // locative
+                       word = 'o ' + word;
+                       break;
+               case 'orodnik': // instrumental
+                       word = 'z ' + word;
+                       break;
+       }
+       return word;
+};
diff --git a/resources/src/mediawiki.language/languages/uk.js b/resources/src/mediawiki.language/languages/uk.js
new file mode 100644 (file)
index 0000000..69f7ec5
--- /dev/null
@@ -0,0 +1,37 @@
+/*!
+ * Ukrainian (Українська) language functions
+ */
+
+mediaWiki.language.convertGrammar = function ( word, form ) {
+       var grammarForms = mediaWiki.language.getData( 'uk', 'grammarForms' );
+       if ( grammarForms && grammarForms[form] ) {
+               return grammarForms[form][word];
+       }
+       switch ( form ) {
+               case 'genitive': // родовий відмінок
+                       if ( word.substr( word.length - 4 ) !== 'вікі' && word.substr( word.length - 4 ) !== 'Вікі' ) {
+                               if ( word.substr( word.length - 1 ) === 'ь' ) {
+                                       word = word.substr(0, word.length - 1 ) + 'я';
+                               } else if ( word.substr( word.length - 2 ) === 'ія' ) {
+                                       word = word.substr(0, word.length - 2 ) + 'ії';
+                               } else if ( word.substr( word.length - 2 ) === 'ка' ) {
+                                       word = word.substr(0, word.length - 2 ) + 'ки';
+                               } else if ( word.substr( word.length - 2 ) === 'ти' ) {
+                                       word = word.substr(0, word.length - 2 ) + 'тей';
+                               } else if ( word.substr( word.length - 2 ) === 'ды' ) {
+                                       word = word.substr(0, word.length - 2 ) + 'дов';
+                               } else if ( word.substr( word.length - 3 ) === 'ник' ) {
+                                       word = word.substr(0, word.length - 3 ) + 'ника';
+                               }
+                       }
+                       break;
+               case 'accusative': // знахідний відмінок
+                       if ( word.substr( word.length - 4 ) !== 'вікі' && word.substr( word.length - 4 ) !== 'Вікі' ) {
+                               if ( word.substr( word.length - 2 ) === 'ія' ) {
+                                       word = word.substr(0, word.length - 2 ) + 'ію';
+                               }
+                       }
+                       break;
+       }
+       return word;
+};
diff --git a/resources/src/mediawiki.language/mediawiki.cldr.js b/resources/src/mediawiki.language/mediawiki.cldr.js
new file mode 100644 (file)
index 0000000..f6fb8f1
--- /dev/null
@@ -0,0 +1,32 @@
+( function ( mw ) {
+       'use strict';
+
+       /**
+        * Namespace for CLDR-related utility methods.
+        *
+        * @class
+        * @singleton
+        */
+       mw.cldr = {
+               /**
+                * Get the plural form index for the number.
+                *
+                * In case none of the rules passed, we return `pluralRules.length` -
+                * that means it is the "other" form.
+                *
+                * @param {number} number
+                * @param {Array} pluralRules
+                * @return {number} plural form index
+                */
+               getPluralForm: function ( number, pluralRules ) {
+                       var i;
+                       for ( i = 0; i < pluralRules.length; i++ ) {
+                               if ( mw.libs.pluralRuleParser( pluralRules[i], number ) ) {
+                                       break;
+                               }
+                       }
+                       return i;
+               }
+       };
+
+}( mediaWiki ) );
diff --git a/resources/src/mediawiki.language/mediawiki.language.init.js b/resources/src/mediawiki.language/mediawiki.language.init.js
new file mode 100644 (file)
index 0000000..fd77025
--- /dev/null
@@ -0,0 +1,79 @@
+( function ( mw ) {
+       /**
+        * Base language object with methods related to language support, attempting to mirror some of the
+        * functionality of the Language class in MediaWiki:
+        *
+        *   - storing and retrieving language data
+        *   - transforming message syntax (`{{PLURAL:}}`, `{{GRAMMAR:}}`, `{{GENDER:}}`)
+        *   - formatting numbers
+        *
+        * @class
+        * @singleton
+        */
+       mw.language = {
+               /**
+                * Language-related data (keyed by language, contains instances of mw.Map). Loaded dynamically
+                * (see ResourceLoaderLanguageDataModule in PHP docs, aka mediawiki.language.data module).
+                *
+                * To set data:
+                *
+                *     // Override, extend or create the language data object of 'nl'
+                *     mw.language.setData( 'nl', 'myKey', 'My value' );
+                *
+                *     // Set multiple values at once
+                *     mw.language.setData( 'nl', { foo: 'X', bar: 'Y' } );
+                *
+                * To get GrammarForms data for language 'nl':
+                *
+                *     var grammarForms = mw.language.getData( 'nl', 'grammarForms' );
+                *
+                * Possible data keys:
+                *
+                *  - `digitTransformTable`
+                *  - `separatorTransformTable`
+                *  - `grammarForms`
+                *  - `pluralRules`
+                *  - `digitGroupingPattern`
+                *
+                * @property
+                */
+               data: {},
+
+               /**
+                * Convenience method for retrieving language data.
+                *
+                * Structured by language code and data key, covering for the potential inexistence of a
+                * data object for this language.
+                *
+                * @param {string} langCode
+                * @param {string} dataKey
+                * @return {Mixed} Value stored in the mw.Map (or `undefined` if there is no map for the specified
+                *  langCode).
+                */
+               getData: function ( langCode, dataKey ) {
+                       var langData = mw.language.data;
+                       if ( langData && langData[langCode] instanceof mw.Map ) {
+                               return langData[langCode].get( dataKey );
+                       }
+                       return undefined;
+               },
+
+               /**
+                * Convenience method for setting language data.
+                *
+                * Creates the data mw.Map if there isn't one for the specified language already.
+                *
+                * @param {string} langCode
+                * @param {string|Object} dataKey Key or object of key/values.
+                * @param {Mixed} value Value for dataKey, ignored if dataKey is an object.
+                */
+               setData: function ( langCode, dataKey, value ) {
+                       var langData = mw.language.data;
+                       if ( !( langData[langCode] instanceof mw.Map ) ) {
+                               langData[langCode] = new mw.Map();
+                       }
+                       langData[langCode].set( dataKey, value );
+               }
+       };
+
+}( mediaWiki ) );
diff --git a/resources/src/mediawiki.language/mediawiki.language.js b/resources/src/mediawiki.language/mediawiki.language.js
new file mode 100644 (file)
index 0000000..a0b5569
--- /dev/null
@@ -0,0 +1,151 @@
+/*
+ * Methods for transforming message syntax.
+ */
+( function ( mw, $ ) {
+
+/**
+ * @class mw.language
+ */
+$.extend( mw.language, {
+
+       /**
+        * Process the PLURAL template substitution
+        *
+        * @private
+        * @param {Object} template Template object
+        * @param {string} template.title
+        * @param {Array} template.parameters
+        * @return {string}
+        */
+       procPLURAL: function ( template ) {
+               if ( template.title && template.parameters && mw.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 = mw.language.convertNumber( template.title, true );
+                       // Do convertPlural call
+                       return mw.language.convertPlural( parseInt( count, 10 ), 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 {number} count Non-localized quantifier
+        * @param {Array} forms List of plural forms
+        * @return {string} Correct form for quantifier in this language
+        */
+       convertPlural: function ( count, forms ) {
+               var pluralRules,
+                       formCount,
+                       form,
+                       index,
+                       equalsPosition,
+                       pluralFormIndex = 0;
+
+               if ( !forms || forms.length === 0 ) {
+                       return '';
+               }
+
+               // Handle for explicit n= forms
+               for ( index = 0; index < forms.length; index++ ) {
+                       form = forms[index];
+                       if ( /^\d+=/.test( form ) ) {
+                               equalsPosition = form.indexOf( '=' );
+                               formCount = parseInt( form.substring( 0, equalsPosition ), 10 );
+                               if ( formCount === count ) {
+                                       return form.substr( equalsPosition + 1 );
+                               }
+                               forms[index] = undefined;
+                       }
+               }
+
+               // Remove explicit plural forms from the forms.
+               forms = $.map( forms, function ( form ) {
+                       return form;
+               } );
+
+               if ( forms.length === 0 ) {
+                       return '';
+               }
+
+               pluralRules = mw.language.getData( mw.config.get( 'wgUserLanguage' ), 'pluralRules' );
+               if ( !pluralRules ) {
+                       // default fallback.
+                       return ( count === 1 ) ? forms[0] : forms[1];
+               }
+               pluralFormIndex = mw.cldr.getPluralForm( count, pluralRules );
+               pluralFormIndex = Math.min( pluralFormIndex, forms.length - 1 );
+               return forms[pluralFormIndex];
+       },
+
+       /**
+        * Pads an array to a specific length by copying the last one element.
+        *
+        * @private
+        * @param {Array} forms Number of forms given to convertPlural
+        * @param {number} 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;
+       },
+
+       /**
+        * Provides an alternative text depending on specified gender.
+        *
+        * Usage in message text: `{{gender:[gender|user object]|masculine|feminine|neutral}}`.
+        * If second or third parameter are not specified, masculine is used.
+        *
+        * These details may be overriden per language.
+        *
+        * @param {string} gender 'male', 'female', or anything else for neutral.
+        * @param {Array} forms List of gender forms
+        * @return string
+        */
+       gender: function ( gender, forms ) {
+               if ( !forms || forms.length === 0 ) {
+                       return '';
+               }
+               forms = mw.language.preConvertPlural( forms, 2 );
+               if ( gender === 'male' ) {
+                       return forms[0];
+               }
+               if ( gender === 'female' ) {
+                       return forms[1];
+               }
+               return ( forms.length === 3 ) ? forms[2] : forms[0];
+       },
+
+       /**
+        * Grammatical transformations, needed for inflected languages.
+        * Invoked by putting `{{grammar:form|word}}` in a message.
+        *
+        * The rules can be defined in $wgGrammarForms global or computed
+        * dynamically by overriding this method per language.
+        *
+        * @param {string} word
+        * @param {string} form
+        * @return {string}
+        */
+       convertGrammar: function ( word, form ) {
+               var grammarForms = mw.language.getData( mw.config.get( 'wgUserLanguage' ), 'grammarForms' );
+               if ( grammarForms && grammarForms[form] ) {
+                       return grammarForms[form][word] || word;
+               }
+               return word;
+       }
+
+} );
+
+}( mediaWiki, jQuery ) );
diff --git a/resources/src/mediawiki.language/mediawiki.language.months.js b/resources/src/mediawiki.language/mediawiki.language.months.js
new file mode 100644 (file)
index 0000000..5a1a5cb
--- /dev/null
@@ -0,0 +1,56 @@
+/*
+ * Transfer of month names from messages into mw.language.
+ *
+ * Loading this module also ensures the availability of appropriate messages via mw.msg.
+ */
+( function ( mw, $ ) {
+       var
+               monthMessages = [
+                       'january', 'february', 'march', 'april',
+                       'may_long', 'june', 'july', 'august',
+                       'september', 'october', 'november', 'december'
+               ],
+               monthGenMessages = [
+                       'january-gen', 'february-gen', 'march-gen', 'april-gen',
+                       'may-gen', 'june-gen', 'july-gen', 'august-gen',
+                       'september-gen', 'october-gen', 'november-gen', 'december-gen'
+               ],
+               monthAbbrevMessages = [
+                       'jan', 'feb', 'mar', 'apr',
+                       'may', 'jun', 'jul', 'aug',
+                       'sep', 'oct', 'nov', 'dec'
+               ];
+
+       // Function suitable for passing to jQuery.map
+       // Can't use mw.msg directly because jQuery.map passes element index as second argument
+       function mwMsgMapper( key ) {
+               return mw.msg( key );
+       }
+
+       /**
+        * Information about month names in current UI language.
+        *
+        * Object keys:
+        *
+        * - `names`: array of month names (in nominative case in languages which have the distinction),
+        *   zero-indexed
+        * - `genitive`: array of month names in genitive case, zero-indexed
+        * - `abbrev`: array of three-letter-long abbreviated month names, zero-indexed
+        * - `keys`: object with three keys like the above, containing zero-indexed arrays of message keys
+        *   for appropriate messages which can be passed to mw.msg.
+        *
+        * @property
+        * @member mw.language
+        */
+       mw.language.months = {
+               keys: {
+                       names: monthMessages,
+                       genitive: monthGenMessages,
+                       abbrev: monthAbbrevMessages
+               },
+               names: $.map( monthMessages, mwMsgMapper ),
+               genitive: $.map( monthGenMessages, mwMsgMapper ),
+               abbrev: $.map( monthAbbrevMessages, mwMsgMapper )
+       };
+
+}( mediaWiki, jQuery ) );
diff --git a/resources/src/mediawiki.language/mediawiki.language.numbers.js b/resources/src/mediawiki.language/mediawiki.language.numbers.js
new file mode 100644 (file)
index 0000000..56fa0da
--- /dev/null
@@ -0,0 +1,259 @@
+/*
+ * Number-related utilities for mediawiki.language.
+ */
+( function ( mw, $ ) {
+       /**
+        * @class mw.language
+        */
+
+       /**
+        * Pad a string to guarantee that it is at least `size` length by
+        * filling with the character `ch` at either the start or end of the
+        * string. Pads at the start, by default.
+        *
+        * Example: Fill the string to length 10 with '+' characters on the right.
+        *
+        *     pad( 'blah', 10, '+', true ); // => 'blah++++++'
+        *
+        * @private
+        * @param {string} text The string to pad
+        * @param {number} size The length to pad to
+        * @param {string} [ch='0'] Character to pad with
+        * @param {boolean} [end=false] Adds padding at the end if true, otherwise pads at start
+        * @return {string}
+        */
+       function pad( text, size, ch, end ) {
+               if ( !ch ) {
+                       ch = '0';
+               }
+
+               var out = String( text ),
+                       padStr = replicate( ch, Math.ceil( ( size - out.length ) / ch.length ) );
+
+               return end ? out + padStr : padStr + out;
+       }
+
+       /**
+        * Efficiently replicate a string `n` times.
+        *
+        * @private
+        * @param {string} str The string to replicate
+        * @param {number} num Number of times to replicate the string
+        * @return {string}
+        */
+       function replicate( str, num ) {
+               if ( num <= 0 || !str ) {
+                       return '';
+               }
+
+               var buf = [];
+               while (num) {
+                       buf.push( str );
+                       str += str;
+               }
+               return buf.join( '' );
+       }
+
+       /**
+        * Apply numeric pattern to absolute value using options. Gives no
+        * consideration to local customs.
+        *
+        * Adapted from dojo/number library with thanks
+        * <http://dojotoolkit.org/reference-guide/1.8/dojo/number.html>
+        *
+        * @private
+        * @param {number} value the number to be formatted, ignores sign
+        * @param {string} pattern the number portion of a pattern (e.g. `#,##0.00`)
+        * @param {Object} [options] If provided, both option keys must be present:
+        * @param {string} options.decimal The decimal separator. Defaults to: `'.'`.
+        * @param {string} options.group The group separator. Defaults to: `','`.
+        * @return {string}
+        */
+       function commafyNumber( value, pattern, options ) {
+               options = options || {
+                       group: ',',
+                       decimal: '.'
+               };
+
+               if ( isNaN( value) ) {
+                       return value;
+               }
+
+               var padLength,
+                       patternDigits,
+                       index,
+                       whole,
+                       off,
+                       remainder,
+                       patternParts = pattern.split( '.' ),
+                       maxPlaces = ( patternParts[1] || [] ).length,
+                       valueParts = String( Math.abs( value ) ).split( '.' ),
+                       fractional = valueParts[1] || '',
+                       groupSize = 0,
+                       groupSize2 = 0,
+                       pieces = [];
+
+               if ( patternParts[1] ) {
+                       // Pad fractional with trailing zeros
+                       padLength = ( patternParts[1] && patternParts[1].lastIndexOf( '0' ) + 1 );
+
+                       if ( padLength > fractional.length ) {
+                               valueParts[1] = pad( fractional, padLength, '0', true );
+                       }
+
+                       // Truncate fractional
+                       if ( maxPlaces < fractional.length ) {
+                               valueParts[1] = fractional.substr( 0, maxPlaces );
+                       }
+               } else {
+                       if ( valueParts[1] ) {
+                               valueParts.pop();
+                       }
+               }
+
+               // Pad whole with leading zeros
+               patternDigits = patternParts[0].replace( ',', '' );
+
+               padLength = patternDigits.indexOf( '0' );
+
+               if ( padLength !== -1 ) {
+                       padLength = patternDigits.length - padLength;
+
+                       if ( padLength > valueParts[0].length ) {
+                               valueParts[0] = pad( valueParts[0], padLength );
+                       }
+
+                       // Truncate whole
+                       if ( patternDigits.indexOf( '#' ) === -1 ) {
+                               valueParts[0] = valueParts[0].substr( valueParts[0].length - padLength );
+                       }
+               }
+
+               // Add group separators
+               index = patternParts[0].lastIndexOf( ',' );
+
+               if ( index !== -1 ) {
+                       groupSize = patternParts[0].length - index - 1;
+                       remainder = patternParts[0].substr( 0, index );
+                       index = remainder.lastIndexOf( ',' );
+                       if ( index !== -1 ) {
+                               groupSize2 = remainder.length - index - 1;
+                       }
+               }
+
+               for ( whole = valueParts[0]; whole; ) {
+                       off = whole.length - groupSize;
+
+                       pieces.push( ( off > 0 ) ? whole.substr( off ) : whole );
+                       whole = ( off > 0 ) ? whole.slice( 0, off ) : '';
+
+                       if ( groupSize2 ) {
+                               groupSize = groupSize2;
+                       }
+               }
+               valueParts[0] = pieces.reverse().join( options.group );
+
+               return valueParts.join( options.decimal );
+       }
+
+       $.extend( mw.language, {
+
+               /**
+                * Converts a number using #getDigitTransformTable.
+                *
+                * @param {number} num Value to be converted
+                * @param {boolean} [integer=false] Whether to convert the return value to an integer
+                * @return {number|string} Formatted number
+                */
+               convertNumber: function ( num, integer ) {
+                       var i, tmp, transformTable, numberString, convertedNumber, pattern;
+
+                       pattern = mw.language.getData( mw.config.get( 'wgUserLanguage' ),
+                               'digitGroupingPattern' ) || '#,##0.###';
+
+                       // Set the target transform table:
+                       transformTable = mw.language.getDigitTransformTable();
+
+                       if ( !transformTable ) {
+                               return num;
+                       }
+
+                       // Check if the 'restore' to Latin number flag is set:
+                       if ( integer ) {
+                               if ( parseInt( num, 10 ) === num ) {
+                                       return num;
+                               }
+                               tmp = [];
+                               for ( i in transformTable ) {
+                                       tmp[ transformTable[ i ] ] = i;
+                               }
+                               transformTable = tmp;
+                               numberString = num + '';
+                       } else {
+                               numberString = mw.language.commafy( num, pattern );
+                       }
+
+                       convertedNumber = '';
+                       for ( i = 0; i < numberString.length; i++ ) {
+                               if ( transformTable[ numberString[i] ] ) {
+                                       convertedNumber += transformTable[numberString[i]];
+                               } else {
+                                       convertedNumber += numberString[i];
+                               }
+                       }
+                       return integer ? parseInt( convertedNumber, 10 ) : convertedNumber;
+               },
+
+               /**
+                * Get the  digit transform table for current UI language.
+                * @return {Object|Array}
+                */
+               getDigitTransformTable: function () {
+                       return mw.language.getData( mw.config.get( 'wgUserLanguage' ),
+                               'digitTransformTable' ) || [];
+               },
+
+               /**
+                * Get the  separator transform table for current UI language.
+                * @return {Object|Array}
+                */
+               getSeparatorTransformTable: function () {
+                       return mw.language.getData( mw.config.get( 'wgUserLanguage' ),
+                               'separatorTransformTable' ) || [];
+               },
+
+               /**
+                * Apply pattern to format value as a string.
+                *
+                * Using patterns from [Unicode TR35](http://www.unicode.org/reports/tr35/#Number_Format_Patterns).
+                *
+                * @param {number} value
+                * @param {string} pattern Pattern string as described by Unicode TR35
+                * @throws {Error} If unable to find a number expression in `pattern`.
+                * @return {string}
+                */
+               commafy: function ( value, pattern ) {
+                       var numberPattern,
+                               transformTable = mw.language.getSeparatorTransformTable(),
+                               group = transformTable[','] || ',',
+                               numberPatternRE = /[#0,]*[#0](?:\.0*#*)?/, // not precise, but good enough
+                               decimal = transformTable['.'] || '.',
+                               patternList = pattern.split( ';' ),
+                               positivePattern = patternList[0];
+
+                       pattern = patternList[ ( value < 0 ) ? 1 : 0] || ( '-' + positivePattern );
+                       numberPattern = positivePattern.match( numberPatternRE );
+
+                       if ( !numberPattern ) {
+                               throw new Error( 'unable to find a number expression in pattern: ' + pattern );
+                       }
+
+                       return pattern.replace( numberPatternRE, commafyNumber( value, numberPattern[0], {
+                               decimal: decimal,
+                               group: group
+                       } ) );
+               }
+
+       } );
+
+}( mediaWiki, jQuery ) );
diff --git a/resources/src/mediawiki.less/mediawiki.mixins.animation.less b/resources/src/mediawiki.less/mediawiki.mixins.animation.less
new file mode 100644 (file)
index 0000000..ec3cddc
--- /dev/null
@@ -0,0 +1,12 @@
+.animation (...) {
+       -webkit-animation: @arguments;
+       -moz-animation: @arguments;
+       -o-animation: @arguments;
+       animation: @arguments;
+}
+
+.transform-rotate (@deg) {
+       -webkit-transform: rotate(@deg);
+       -moz-transform: rotate(@deg);
+       transform: rotate(@deg);
+}
\ No newline at end of file
diff --git a/resources/src/mediawiki.less/mediawiki.mixins.less b/resources/src/mediawiki.less/mediawiki.mixins.less
new file mode 100644 (file)
index 0000000..80b68cc
--- /dev/null
@@ -0,0 +1,53 @@
+/**
+ * Common LESS mixin library for MediaWiki
+ *
+ * By default the folder containing this file is included in $wgResourceLoaderLESSImportPaths,
+ * which makes this file importable by all less files via '@import "mediawiki.mixins";'.
+ *
+ * The mixins included below are considered a public interface for MediaWiki extensions.
+ * The signatures of parametrized mixins should be kept as stable as possible.
+ *
+ * See <http://lesscss.org/#-mixins> for more information about how to write mixins.
+ */
+
+.background-image(@url) when (embeddable(@url)) {
+       background-image: embed(@url);
+       background-image: url(@url)!ie;
+}
+
+.background-image(@url) when not (embeddable(@url)) {
+       background-image: url(@url);
+}
+
+.vertical-gradient ( @startColor: gray, @endColor: white, @startPos: 0, @endPos: 100% ) {
+       background-color: @endColor;
+       background-image: -moz-linear-gradient( top, @startColor @startPos, @endColor @endPos ); // Firefox 3.6+
+       background-image: -webkit-gradient( linear, left top, left bottom, color-stop( @startPos, @startColor ), color-stop( @endPos, @endColor ) ); // Safari 4+, Chrome 2+
+       background-image: -webkit-linear-gradient( top, @startColor @startPos, @endColor @endPos ); // Safari 5.1+, Chrome 10+
+       background-image: linear-gradient( @startColor @startPos, @endColor @endPos ); // Standard
+}
+
+/* Note gzip compression means that it is okay to embed twice */
+/* http://pauginer.tumblr.com/post/36614680636/invisible-gradient-technique */
+.background-image-svg(@svg, @fallback) {
+       background-image: url(@fallback);
+       /* SVG support using a transparent gradient to guarantee cross-browser
+        * compatibility (browsers able to understand gradient syntax support also SVG) */
+       /* @embed */ background-image: -webkit-linear-gradient(transparent, transparent), url(@svg);
+       /* @embed */ background-image: linear-gradient(transparent, transparent), url(@svg);
+}
+
+/* Caution: Does not support localisable images */
+.list-style-image(@url) when (embeddable(@url)) {
+       list-style-image: embed(@url);
+       list-style-image: url(@url)!ie;
+}
+
+.list-style-image(@url) when not (embeddable(@url)) {
+       list-style-image: url(@url);
+}
+
+.transition(@string) {
+       -webkit-transition: @string;
+       transition: @string;
+}
diff --git a/resources/src/mediawiki.less/mediawiki.mixins.rotation.less b/resources/src/mediawiki.less/mediawiki.mixins.rotation.less
new file mode 100644 (file)
index 0000000..e28b333
--- /dev/null
@@ -0,0 +1,33 @@
+// This is a separate file because importing the mixin causes
+// the keyframes blocks to be included in the output, regardless
+// of whether .rotation is used.
+@import "mediawiki.mixins.animation";
+
+.rotate-frames () {
+       from {
+               .transform-rotate(0deg);
+       }
+       to {
+               .transform-rotate(360deg);
+       }
+}
+
+@-webkit-keyframes rotate {
+       .rotate-frames;
+}
+
+@-moz-keyframes rotate {
+       .rotate-frames;
+}
+
+@-o-keyframes rotate {
+       .rotate-frames;
+}
+
+@keyframes rotate {
+       .rotate-frames;
+}
+
+.rotation( @time ) {
+       .animation(rotate, @time, infinite, linear);
+}
diff --git a/resources/src/mediawiki.libs/CLDRPluralRuleParser.js b/resources/src/mediawiki.libs/CLDRPluralRuleParser.js
new file mode 100644 (file)
index 0000000..83c2524
--- /dev/null
@@ -0,0 +1,475 @@
+/* This is CLDRPluralRuleParser v1.1, ported to MediaWiki ResourceLoader */
+
+/**
+* CLDRPluralRuleParser.js
+* A parser engine for CLDR plural rules.
+*
+* Copyright 2012 GPLV3+, Santhosh Thottingal
+*
+* @version 0.1.0-alpha
+* @source https://github.com/santhoshtr/CLDRPluralRuleParser
+* @author Santhosh Thottingal <santhosh.thottingal@gmail.com>
+* @author Timo Tijhof
+* @author Amir Aharoni
+*/
+
+( function ( mw ) {
+/**
+ * Evaluates a plural rule in CLDR syntax for a number
+ * @param {string} rule
+ * @param {integer} number
+ * @return {boolean} true if evaluation passed, false if evaluation failed.
+ */
+
+function pluralRuleParser(rule, number) {
+       /*
+       Syntax: see http://unicode.org/reports/tr35/#Language_Plural_Rules
+       -----------------------------------------------------------------
+       condition     = and_condition ('or' and_condition)*
+               ('@integer' samples)?
+               ('@decimal' samples)?
+       and_condition = relation ('and' relation)*
+       relation      = is_relation | in_relation | within_relation
+       is_relation   = expr 'is' ('not')? value
+       in_relation   = expr (('not')? 'in' | '=' | '!=') range_list
+       within_relation = expr ('not')? 'within' range_list
+       expr          = operand (('mod' | '%') value)?
+       operand       = 'n' | 'i' | 'f' | 't' | 'v' | 'w'
+       range_list    = (range | value) (',' range_list)*
+       value         = digit+
+       digit         = 0|1|2|3|4|5|6|7|8|9
+       range         = value'..'value
+       samples       = sampleRange (',' sampleRange)* (',' ('…'|'...'))?
+       sampleRange   = decimalValue '~' decimalValue
+       decimalValue  = value ('.' value)?
+       */
+
+       // we don't evaluate the samples section of the rule. Ignore it.
+       rule = rule.split('@')[0].replace(/^\s*/, '').replace(/\s*$/, '');
+
+       if (!rule.length) {
+               // empty rule or 'other' rule.
+               return true;
+       }
+       // Indicates current position in the rule as we parse through it.
+       // Shared among all parsing functions below.
+       var pos = 0,
+               operand,
+               expression,
+               relation,
+               result,
+               whitespace = makeRegexParser(/^\s+/),
+               value = makeRegexParser(/^\d+/),
+               _n_ = makeStringParser('n'),
+               _i_ = makeStringParser('i'),
+               _f_ = makeStringParser('f'),
+               _t_ = makeStringParser('t'),
+               _v_ = makeStringParser('v'),
+               _w_ = makeStringParser('w'),
+               _is_ = makeStringParser('is'),
+               _isnot_ = makeStringParser('is not'),
+               _isnot_sign_ = makeStringParser('!='),
+               _equal_ = makeStringParser('='),
+               _mod_ = makeStringParser('mod'),
+               _percent_ = makeStringParser('%'),
+               _not_ = makeStringParser('not'),
+               _in_ = makeStringParser('in'),
+               _within_ = makeStringParser('within'),
+               _range_ = makeStringParser('..'),
+               _comma_ = makeStringParser(','),
+               _or_ = makeStringParser('or'),
+               _and_ = makeStringParser('and');
+
+       function debug() {
+               // console.log.apply(console, arguments);
+       }
+
+       debug('pluralRuleParser', rule, number);
+
+       // Try parsers until one works, if none work return null
+
+       function choice(parserSyntax) {
+               return function() {
+                       for (var i = 0; i < parserSyntax.length; i++) {
+                               var result = parserSyntax[i]();
+                               if (result !== null) {
+                                       return result;
+                               }
+                       }
+                       return null;
+               };
+       }
+
+       // Try several parserSyntax-es in a row.
+       // All must succeed; otherwise, return null.
+       // This is the only eager one.
+
+       function sequence(parserSyntax) {
+               var originalPos = pos;
+               var result = [];
+               for (var i = 0; i < parserSyntax.length; i++) {
+                       var res = parserSyntax[i]();
+                       if (res === null) {
+                               pos = originalPos;
+                               return null;
+                       }
+                       result.push(res);
+               }
+               return result;
+       }
+
+       // Run the same parser over and over until it fails.
+       // Must succeed a minimum of n times; otherwise, return null.
+
+       function nOrMore(n, p) {
+               return function() {
+                       var originalPos = pos;
+                       var result = [];
+                       var parsed = p();
+                       while (parsed !== null) {
+                               result.push(parsed);
+                               parsed = p();
+                       }
+                       if (result.length < n) {
+                               pos = originalPos;
+                               return null;
+                       }
+                       return result;
+               };
+       }
+
+       // Helpers -- just make parserSyntax out of simpler JS builtin types
+       function makeStringParser(s) {
+               var len = s.length;
+               return function() {
+                       var result = null;
+                       if (rule.substr(pos, len) === s) {
+                               result = s;
+                               pos += len;
+                       }
+
+                       return result;
+               };
+       }
+
+       function makeRegexParser(regex) {
+               return function() {
+                       var matches = rule.substr(pos).match(regex);
+                       if (matches === null) {
+                               return null;
+                       }
+                       pos += matches[0].length;
+                       return matches[0];
+               };
+       }
+
+       /*
+        * integer digits of n.
+        */
+       function i() {
+               var result = _i_();
+               if (result === null) {
+                       debug(' -- failed i', parseInt(number, 10));
+                       return result;
+               }
+               result = parseInt(number, 10);
+               debug(' -- passed i ', result);
+               return result;
+       }
+
+       /*
+        * absolute value of the source number (integer and decimals).
+        */
+       function n() {
+               var result = _n_();
+               if (result === null) {
+                       debug(' -- failed n ', number);
+                       return result;
+               }
+               result = parseFloat(number, 10);
+               debug(' -- passed n ', result);
+               return result;
+       }
+
+       /*
+        * visible fractional digits in n, with trailing zeros.
+        */
+       function f() {
+               var result = _f_();
+               if (result === null) {
+                       debug(' -- failed f ', number);
+                       return result;
+               }
+               result = (number + '.').split('.')[1] || 0;
+               debug(' -- passed f ', result);
+               return result;
+       }
+
+       /*
+        * visible fractional digits in n, without trailing zeros.
+        */
+       function t() {
+               var result = _t_();
+               if (result === null) {
+                       debug(' -- failed t ', number);
+                       return result;
+               }
+               result = (number + '.').split('.')[1].replace(/0$/, '') || 0;
+               debug(' -- passed t ', result);
+               return result;
+       }
+
+       /*
+        * number of visible fraction digits in n, with trailing zeros.
+        */
+       function v() {
+               var result = _v_();
+               if (result === null) {
+                       debug(' -- failed v ', number);
+                       return result;
+               }
+               result = (number + '.').split('.')[1].length || 0;
+               debug(' -- passed v ', result);
+               return result;
+       }
+
+       /*
+        * number of visible fraction digits in n, without trailing zeros.
+        */
+       function w() {
+               var result = _w_();
+               if (result === null) {
+                       debug(' -- failed w ', number);
+                       return result;
+               }
+               result = (number + '.').split('.')[1].replace(/0$/, '').length || 0;
+               debug(' -- passed w ', result);
+               return result;
+       }
+
+       // operand       = 'n' | 'i' | 'f' | 't' | 'v' | 'w'
+       operand = choice([n, i, f, t, v, w]);
+
+       // expr          = operand (('mod' | '%') value)?
+       expression = choice([mod, operand]);
+
+       function mod() {
+               var result = sequence([operand, whitespace, choice([_mod_, _percent_]), whitespace, value]);
+               if (result === null) {
+                       debug(' -- failed mod');
+                       return null;
+               }
+               debug(' -- passed ' + parseInt(result[0], 10) + ' ' + result[2] + ' ' + parseInt(result[4], 10));
+               return parseInt(result[0], 10) % parseInt(result[4], 10);
+       }
+
+       function not() {
+               var result = sequence([whitespace, _not_]);
+               if (result === null) {
+                       debug(' -- failed not');
+                       return null;
+               }
+
+               return result[1];
+       }
+
+       // is_relation   = expr 'is' ('not')? value
+       function is() {
+               var result = sequence([expression, whitespace, choice([_is_]), whitespace, value]);
+               if (result !== null) {
+                       debug(' -- passed is : ' + result[0] + ' == ' + parseInt(result[4], 10));
+                       return result[0] === parseInt(result[4], 10);
+               }
+               debug(' -- failed is');
+               return null;
+       }
+
+       // is_relation   = expr 'is' ('not')? value
+       function isnot() {
+               var result = sequence([expression, whitespace, choice([_isnot_, _isnot_sign_]), whitespace, value]);
+               if (result !== null) {
+                       debug(' -- passed isnot: ' + result[0] + ' != ' + parseInt(result[4], 10));
+                       return result[0] !== parseInt(result[4], 10);
+               }
+               debug(' -- failed isnot');
+               return null;
+       }
+
+       function not_in() {
+               var result = sequence([expression, whitespace, _isnot_sign_, whitespace, rangeList]);
+               if (result !== null) {
+                       debug(' -- passed not_in: ' + result[0] + ' != ' + result[4]);
+                       var range_list = result[4];
+                       for (var i = 0; i < range_list.length; i++) {
+                               if (parseInt(range_list[i], 10) === parseInt(result[0], 10)) {
+                                       return false;
+                               }
+                       }
+                       return true;
+               }
+               debug(' -- failed not_in');
+               return null;
+       }
+
+       // range_list    = (range | value) (',' range_list)*
+       function rangeList() {
+               var result = sequence([choice([range, value]), nOrMore(0, rangeTail)]);
+               var resultList = [];
+               if (result !== null) {
+                       resultList = resultList.concat(result[0]);
+                       if (result[1][0]) {
+                               resultList = resultList.concat(result[1][0]);
+                       }
+                       return resultList;
+               }
+               debug(' -- failed rangeList');
+               return null;
+       }
+
+       function rangeTail() {
+               // ',' range_list
+               var result = sequence([_comma_, rangeList]);
+               if (result !== null) {
+                       return result[1];
+               }
+               debug(' -- failed rangeTail');
+               return null;
+       }
+
+       // range         = value'..'value
+
+       function range() {
+               var i;
+               var result = sequence([value, _range_, value]);
+               if (result !== null) {
+                       debug(' -- passed range');
+                       var array = [];
+                       var left = parseInt(result[0], 10);
+                       var right = parseInt(result[2], 10);
+                       for (i = left; i <= right; i++) {
+                               array.push(i);
+                       }
+                       return array;
+               }
+               debug(' -- failed range');
+               return null;
+       }
+
+       function _in() {
+               // in_relation   = expr ('not')? 'in' range_list
+               var result = sequence([expression, nOrMore(0, not), whitespace, choice([_in_, _equal_]), whitespace, rangeList]);
+               if (result !== null) {
+                       debug(' -- passed _in:' + result);
+                       var range_list = result[5];
+                       for (var i = 0; i < range_list.length; i++) {
+                               if (parseInt(range_list[i], 10) === parseInt(result[0], 10)) {
+                                       return (result[1][0] !== 'not');
+                               }
+                       }
+                       return (result[1][0] === 'not');
+               }
+               debug(' -- failed _in ');
+               return null;
+       }
+
+       /*
+        * The difference between in and within is that in only includes integers in the specified range,
+        * while within includes all values.
+        */
+
+       function within() {
+               // within_relation = expr ('not')? 'within' range_list
+               var result = sequence([expression, nOrMore(0, not), whitespace, _within_, whitespace, rangeList]);
+               if (result !== null) {
+                       debug(' -- passed within');
+                       var range_list = result[5];
+                       if ((result[0] >= parseInt(range_list[0], 10)) &&
+                               (result[0] < parseInt(range_list[range_list.length - 1], 10))) {
+                               return (result[1][0] !== 'not');
+                       }
+                       return (result[1][0] === 'not');
+               }
+               debug(' -- failed within ');
+               return null;
+       }
+
+       // relation      = is_relation | in_relation | within_relation
+       relation = choice([is, not_in, isnot, _in, within]);
+
+       // and_condition = relation ('and' relation)*
+       function and() {
+               var result = sequence([relation, nOrMore(0, andTail)]);
+               if (result) {
+                       if (!result[0]) {
+                               return false;
+                       }
+                       for (var i = 0; i < result[1].length; i++) {
+                               if (!result[1][i]) {
+                                       return false;
+                               }
+                       }
+                       return true;
+               }
+               debug(' -- failed and');
+               return null;
+       }
+
+       // ('and' relation)*
+       function andTail() {
+               var result = sequence([whitespace, _and_, whitespace, relation]);
+               if (result !== null) {
+                       debug(' -- passed andTail' + result);
+                       return result[3];
+               }
+               debug(' -- failed andTail');
+               return null;
+
+       }
+       //  ('or' and_condition)*
+       function orTail() {
+               var result = sequence([whitespace, _or_, whitespace, and]);
+               if (result !== null) {
+                       debug(' -- passed orTail: ' + result[3]);
+                       return result[3];
+               }
+               debug(' -- failed orTail');
+               return null;
+
+       }
+
+       // condition     = and_condition ('or' and_condition)*
+       function condition() {
+               var result = sequence([and, nOrMore(0, orTail)]);
+               if (result) {
+                       for (var i = 0; i < result[1].length; i++) {
+                               if (result[1][i]) {
+                                       return true;
+                               }
+                       }
+                       return result[0];
+
+               }
+               return false;
+       }
+
+       result = condition();
+       /*
+        * For success, the pos must have gotten to the end of the rule
+        * and returned a non-null.
+        * n.b. This is part of language infrastructure, so we do not throw an internationalizable message.
+        */
+       if (result === null) {
+               throw new Error('Parse error at position ' + pos.toString() + ' for rule: ' + rule);
+       }
+
+       if (pos !== rule.length) {
+               debug('Warning: Rule not parsed completely. Parser stopped at ' + rule.substr(0, pos) + ' for rule: ' + rule);
+       }
+
+       return result;
+}
+
+/* pluralRuleParser ends here */
+mw.libs.pluralRuleParser = pluralRuleParser;
+
+} )( mediaWiki );
diff --git a/resources/src/mediawiki.libs/mediawiki.libs.jpegmeta.js b/resources/src/mediawiki.libs/mediawiki.libs.jpegmeta.js
new file mode 100644 (file)
index 0000000..b3ed88c
--- /dev/null
@@ -0,0 +1,737 @@
+/**
+ * This is JsJpegMeta v1.0
+ * From: https://code.google.com/p/jsjpegmeta/downloads/list
+ * From: https://github.com/bennoleslie/jsjpegmeta/blob/v1.0.0/jpegmeta.js
+ *
+ * Ported to MediaWiki ResourceLoader by Bryan Tong Minh
+ * Changes:
+ * - Add closure.
+ * - Add this.JpegMeta assignment to expose it as global.
+ * - Add mw.libs.jpegmeta wrapper.
+ */
+
+( function () {
+       /*
+       Copyright (c) 2009 Ben Leslie
+       
+       Permission is hereby granted, free of charge, to any person obtaining a copy
+       of this software and associated documentation files (the "Software"), to deal
+       in the Software without restriction, including without limitation the rights
+       to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+       copies of the Software, and to permit persons to whom the Software is
+       furnished to do so, subject to the following conditions:
+       
+       The above copyright notice and this permission notice shall be included in
+       all copies or substantial portions of the Software.
+       
+       THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+       IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+       FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+       AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+       LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+       OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+       THE SOFTWARE.
+       */
+       
+       /*
+        This JavaScript library is used to parse meta-data from files 
+        with mime-type image/jpeg.
+       
+        Include it with something like:
+       
+          <script type="text/javascript" src="jpegmeta.js"></script>
+       
+        This adds a single 'module' object called 'JpegMeta' to the global
+        namespace.
+       
+        Public Functions
+        ----------------
+        JpegMeta.parseNum - parse unsigned integers from binary data
+        JpegMeta.parseSnum - parse signed integers from binary data
+       
+        Public Classes
+        --------------
+        JpegMeta.Rational - A rational number class
+        JpegMeta.JfifSegment
+        JpegMeta.ExifSegment
+        JpegMeta.JpegFile - Primary class for Javascript parsing
+       */
+
+       var JpegMeta = {};
+       // MediaWiki: Expose as global
+       this.JpegMeta = JpegMeta;
+       
+       /* 
+          parse an unsigned number of size bytes at offset in some binary string data.
+          If endian
+          is "<" parse the data as little endian, if endian
+          is ">" parse as big-endian.
+       */
+       JpegMeta.parseNum = function parseNum(endian, data, offset, size) {
+           var i;
+           var ret;
+           var big_endian = (endian === ">");
+           if (offset === undefined) offset = 0;
+           if (size === undefined) size = data.length - offset;
+           for (big_endian ? i = offset : i = offset + size - 1; 
+                big_endian ? i < offset + size : i >= offset; 
+                big_endian ? i++ : i--) {
+               ret <<= 8;
+               ret += data.charCodeAt(i);
+           }
+           return ret;
+       };
+       
+       /* 
+          parse an signed number of size bytes at offset in some binary string data.
+          If endian
+          is "<" parse the data as little endian, if endian
+          is ">" parse as big-endian.
+       */
+       JpegMeta.parseSnum = function parseSnum(endian, data, offset, size) {
+           var i;
+           var ret;
+           var neg;
+           var big_endian = (endian === ">");
+           if (offset === undefined) offset = 0;
+           if (size === undefined) size = data.length - offset;
+           for (big_endian ? i = offset : i = offset + size - 1; 
+                big_endian ? i < offset + size : i >= offset; 
+                big_endian ? i++ : i--) {
+               if (neg === undefined) {
+                   /* Negative if top bit is set */
+                   neg = (data.charCodeAt(i) & 0x80) === 0x80;
+               }
+               ret <<= 8;
+               /* If it is negative we invert the bits */
+               ret += neg ? ~data.charCodeAt(i) & 0xff: data.charCodeAt(i);
+           }
+           if (neg) {
+               /* If it is negative we do two's complement */
+               ret += 1;
+               ret *= -1;
+           }
+           return ret;
+       };
+       
+       /* Rational number class */
+       JpegMeta.Rational = function Rational(num, den)
+       {
+           this.num = num;
+           this.den = den || 1;
+           return this;
+       };
+       
+       /* Rational number methods */
+       JpegMeta.Rational.prototype.toString = function toString() {
+           if (this.num === 0) {
+               return "" + this.num;
+           }
+           if (this.den === 1) {
+               return "" + this.num;
+           }
+           if (this.num === 1) {
+               return this.num + " / " + this.den;
+           }
+           return this.num / this.den; // + "/" + this.den;
+       };
+       
+       JpegMeta.Rational.prototype.asFloat = function asFloat() {
+           return this.num / this.den;
+       };
+       
+       /* MetaGroup class */
+       JpegMeta.MetaGroup = function MetaGroup(fieldName, description) {
+           this.fieldName = fieldName;
+           this.description = description;
+           this.metaProps = {};
+           return this;
+       };
+       
+       JpegMeta.MetaGroup.prototype._addProperty = function _addProperty(fieldName, description, value) {
+           var property = new JpegMeta.MetaProp(fieldName, description, value);
+           this[property.fieldName] = property;
+           this.metaProps[property.fieldName] = property;
+       };
+       
+       JpegMeta.MetaGroup.prototype.toString = function toString() {
+           return "[MetaGroup " + this.description + "]";
+       };
+
+       /* MetaProp class */
+       JpegMeta.MetaProp = function MetaProp(fieldName, description, value) {
+           this.fieldName = fieldName;
+           this.description = description;
+           this.value = value;
+           return this;
+       };
+       
+       JpegMeta.MetaProp.prototype.toString = function toString() {
+           return "" + this.value;
+       };
+
+       /* JpegFile class */
+       JpegMeta.JpegFile = function JpegFile(binary_data, filename) {
+           /* Change this to EOI if we want to parse. */
+           var break_segment = this._SOS;
+           
+           this.metaGroups = {};
+           this._binary_data = binary_data;
+           this.filename = filename;
+           
+           /* Go through and parse. */
+           var pos = 0;
+           var pos_start_of_segment = 0;
+           var delim;
+           var mark;
+           var _mark;
+           var segsize;
+           var headersize;
+           var mark_code;
+           var mark_fn;
+       
+           /* Check to see if this looks like a JPEG file */
+           if (this._binary_data.slice(0, 2) !== this._SOI_MARKER) {
+               throw new Error("Doesn't look like a JPEG file. First two bytes are " + 
+                               this._binary_data.charCodeAt(0) + "," + 
+                               this._binary_data.charCodeAt(1) + ".");
+           }
+           
+           pos += 2;
+           
+           while (pos < this._binary_data.length) {
+               delim = this._binary_data.charCodeAt(pos++);
+               mark = this._binary_data.charCodeAt(pos++);
+               
+               pos_start_of_segment = pos;
+               
+               if (delim != this._DELIM) {
+                   break;
+               }
+               
+               if (mark === break_segment) {
+                   break;
+               }
+               
+               headersize = JpegMeta.parseNum(">", this._binary_data, pos, 2);
+               
+               /* Find the end */
+               pos += headersize;
+               while (pos < this._binary_data.length) {
+                   delim = this._binary_data.charCodeAt(pos++);
+                   if (delim == this._DELIM) {
+                       _mark = this._binary_data.charCodeAt(pos++);
+                       if (_mark != 0x0) {
+                           pos -= 2;
+                           break;
+                       }
+                   }
+               }
+               
+               segsize = pos - pos_start_of_segment;
+               
+               if (this._markers[mark]) {
+                   mark_code = this._markers[mark][0];
+                   mark_fn = this._markers[mark][1];
+               } else {
+                   mark_code = "UNKN";
+                   mark_fn = undefined;
+               }
+               
+               if (mark_fn) {
+                   this[mark_fn](mark, pos_start_of_segment + 2);
+               }
+               
+           }
+           
+           if (this.general === undefined) {
+               throw Error("Invalid JPEG file.");
+           }
+           
+           return this;
+       };
+       
+       this.JpegMeta.JpegFile.prototype.toString = function () {
+           return "[JpegFile " + this.filename + " " + 
+               this.general.type + " " + 
+               this.general.pixelWidth + "x" + 
+               this.general.pixelHeight +
+               " Depth: " + this.general.depth + "]";
+       };
+       
+       /* Some useful constants */
+       this.JpegMeta.JpegFile.prototype._SOI_MARKER = '\xff\xd8';
+       this.JpegMeta.JpegFile.prototype._DELIM = 0xff;
+       this.JpegMeta.JpegFile.prototype._EOI = 0xd9;
+       this.JpegMeta.JpegFile.prototype._SOS = 0xda;
+       
+       this.JpegMeta.JpegFile.prototype._sofHandler = function _sofHandler (mark, pos) {
+           if (this.general !== undefined) {
+               throw Error("Unexpected multiple-frame image");
+           }
+       
+           this._addMetaGroup("general", "General");
+           this.general._addProperty("depth", "Depth", JpegMeta.parseNum(">", this._binary_data, pos, 1));
+           this.general._addProperty("pixelHeight", "Pixel Height", JpegMeta.parseNum(">", this._binary_data, pos + 1, 2));
+           this.general._addProperty("pixelWidth", "Pixel Width",JpegMeta.parseNum(">", this._binary_data, pos + 3, 2));
+           this.general._addProperty("type", "Type", this._markers[mark][2]);
+       };
+       
+       /* JFIF idents */
+       this.JpegMeta.JpegFile.prototype._JFIF_IDENT = "JFIF\x00";
+       this.JpegMeta.JpegFile.prototype._JFXX_IDENT = "JFXX\x00";
+       
+       /* Exif idents */
+       this.JpegMeta.JpegFile.prototype._EXIF_IDENT = "Exif\x00";
+       
+       /* TIFF types */
+       this.JpegMeta.JpegFile.prototype._types = {
+           /* The format is identifier : ["type name", type_size_in_bytes ] */
+           1 : ["BYTE", 1],
+           2 : ["ASCII", 1],
+           3 : ["SHORT", 2],
+           4 : ["LONG", 4],
+           5 : ["RATIONAL", 8],
+           6 : ["SBYTE", 1],
+           7 : ["UNDEFINED", 1],
+           8 : ["SSHORT", 2],
+           9 : ["SLONG", 4],
+           10 : ["SRATIONAL", 8],
+           11 : ["FLOAT", 4],
+           12 : ["DOUBLE", 8]
+       };
+       
+       this.JpegMeta.JpegFile.prototype._tifftags = {
+           /* A. Tags relating to image data structure */
+           256 : ["Image width", "ImageWidth"],
+           257 : ["Image height", "ImageLength"],
+           258 : ["Number of bits per component", "BitsPerSample"],
+           259 : ["Compression scheme", "Compression", 
+                  {1 : "uncompressed", 6 : "JPEG compression" }],
+           262 : ["Pixel composition", "PhotmetricInerpretation",
+                  {2 : "RGB", 6 : "YCbCr"}],
+           274 : ["Orientation of image", "Orientation",
+                  /* FIXME: Check the mirror-image / reverse encoding and rotation */
+                  {1 : "Normal", 2 : "Reverse?", 
+                   3 : "Upside-down", 4 : "Upside-down Reverse",
+                   5 : "90 degree CW", 6 : "90 degree CW reverse",
+                   7 : "90 degree CCW", 8 : "90 degree CCW reverse"}],
+           277 : ["Number of components", "SamplesPerPixel"],
+           284 : ["Image data arrangement", "PlanarConfiguration",
+                  {1 : "chunky format", 2 : "planar format"}],
+           530 : ["Subsampling ratio of Y to C", "YCbCrSubSampling"],
+           531 : ["Y and C positioning", "YCbCrPositioning",
+                  {1 : "centered", 2 : "co-sited"}],
+           282 : ["X Resolution", "XResolution"],
+           283 : ["Y Resolution", "YResolution"],
+           296 : ["Resolution Unit", "ResolutionUnit",
+                  {2 : "inches", 3 : "centimeters"}],
+           /* B. Tags realting to recording offset */
+           273 : ["Image data location", "StripOffsets"],
+           278 : ["Number of rows per strip", "RowsPerStrip"],
+           279 : ["Bytes per compressed strip", "StripByteCounts"],
+           513 : ["Offset to JPEG SOI", "JPEGInterchangeFormat"],
+           514 : ["Bytes of JPEG Data", "JPEGInterchangeFormatLength"],
+           /* C. Tags relating to image data characteristics */
+           301 : ["Transfer function", "TransferFunction"],
+           318 : ["White point chromaticity", "WhitePoint"],
+           319 : ["Chromaticities of primaries", "PrimaryChromaticities"],
+           529 : ["Color space transformation matrix coefficients", "YCbCrCoefficients"],
+           532 : ["Pair of black and white reference values", "ReferenceBlackWhite"],
+           /* D. Other tags */
+           306 : ["Date and time", "DateTime"],
+           270 : ["Image title", "ImageDescription"],
+           271 : ["Make", "Make"],
+           272 : ["Model", "Model"],
+           305 : ["Software", "Software"],
+           315 : ["Person who created the image", "Artist"],
+           316 : ["Host Computer", "HostComputer"],
+           33432 : ["Copyright holder", "Copyright"],
+           
+           34665 : ["Exif tag", "ExifIfdPointer"],
+           34853 : ["GPS tag", "GPSInfoIfdPointer"]
+       };
+       
+       this.JpegMeta.JpegFile.prototype._exiftags = {
+           /* Tag Support Levels (2) - 0th IFX Exif Private Tags */
+           /* A. Tags Relating to Version */
+           36864 : ["Exif Version", "ExifVersion"],
+           40960 : ["FlashPix Version", "FlashpixVersion"],
+           
+           /* B. Tag Relating to Image Data Characteristics */
+           40961 : ["Color Space", "ColorSpace"],
+           
+           /* C. Tags Relating to Image Configuration */
+           37121 : ["Meaning of each component", "ComponentsConfiguration"],
+           37122 : ["Compressed Bits Per Pixel", "CompressedBitsPerPixel"],
+           40962 : ["Pixel X Dimension", "PixelXDimension"],
+           40963 : ["Pixel Y Dimension", "PixelYDimension"],
+           
+           /* D. Tags Relating to User Information */
+           37500 : ["Manufacturer notes", "MakerNote"],
+           37510 : ["User comments", "UserComment"],
+           
+           /* E. Tag Relating to Related File Information */
+           40964 : ["Related audio file", "RelatedSoundFile"],
+           
+           /* F. Tags Relating to Date and Time */
+           36867 : ["Date Time Original", "DateTimeOriginal"],
+           36868 : ["Date Time Digitized", "DateTimeDigitized"],
+           37520 : ["DateTime subseconds", "SubSecTime"],
+           37521 : ["DateTimeOriginal subseconds", "SubSecTimeOriginal"],
+           37522 : ["DateTimeDigitized subseconds", "SubSecTimeDigitized"],
+           
+           /* G. Tags Relating to Picture-Taking Conditions */
+           33434 : ["Exposure time", "ExposureTime"],
+           33437 : ["FNumber", "FNumber"],
+           34850 : ["Exposure program", "ExposureProgram"],
+           34852 : ["Spectral sensitivity", "SpectralSensitivity"],
+           34855 : ["ISO Speed Ratings", "ISOSpeedRatings"],
+           34856 : ["Optoelectric coefficient", "OECF"],
+           37377 : ["Shutter Speed",  "ShutterSpeedValue"],
+           37378 : ["Aperture Value", "ApertureValue"],
+           37379 : ["Brightness", "BrightnessValue"],
+           37380 : ["Exposure Bias Value", "ExposureBiasValue"],
+           37381 : ["Max Aperture Value", "MaxApertureValue"],
+           37382 : ["Subject Distance", "SubjectDistance"],
+           37383 : ["Metering Mode", "MeteringMode"],
+           37384 : ["Light Source", "LightSource"],
+           37385 : ["Flash", "Flash"],
+           37386 : ["Focal Length", "FocalLength"],
+           37396 : ["Subject Area", "SubjectArea"],
+           41483 : ["Flash Energy", "FlashEnergy"],
+           41484 : ["Spatial Frequency Response", "SpatialFrequencyResponse"],
+           41486 : ["Focal Plane X Resolution", "FocalPlaneXResolution"],
+           41487 : ["Focal Plane Y Resolution", "FocalPlaneYResolution"],
+           41488 : ["Focal Plane Resolution Unit", "FocalPlaneResolutionUnit"],
+           41492 : ["Subject Location", "SubjectLocation"],
+           41493 : ["Exposure Index", "ExposureIndex"],
+           41495 : ["Sensing Method", "SensingMethod"],
+           41728 : ["File Source", "FileSource"],
+           41729 : ["Scene Type", "SceneType"],
+           41730 : ["CFA Pattern", "CFAPattern"],
+           41985 : ["Custom Rendered", "CustomRendered"],
+           41986 : ["Exposure Mode", "Exposure Mode"],
+           41987 : ["White Balance", "WhiteBalance"],
+           41988 : ["Digital Zoom Ratio", "DigitalZoomRatio"],
+           41990 : ["Scene Capture Type", "SceneCaptureType"],
+           41991 : ["Gain Control", "GainControl"],
+           41992 : ["Contrast", "Contrast"],
+           41993 : ["Saturation", "Saturation"],
+           41994 : ["Sharpness", "Sharpness"],
+           41995 : ["Device settings description", "DeviceSettingDescription"],
+           41996 : ["Subject distance range", "SubjectDistanceRange"],
+           
+           /* H. Other Tags */
+           42016 : ["Unique image ID", "ImageUniqueID"],
+           
+           40965 : ["Interoperability tag", "InteroperabilityIFDPointer"]
+       };
+       
+       this.JpegMeta.JpegFile.prototype._gpstags = {
+           /* A. Tags Relating to GPS */
+           0 : ["GPS tag version", "GPSVersionID"],
+           1 : ["North or South Latitude", "GPSLatitudeRef"],
+           2 : ["Latitude", "GPSLatitude"],
+           3 : ["East or West Longitude", "GPSLongitudeRef"],
+           4 : ["Longitude", "GPSLongitude"],
+           5 : ["Altitude reference", "GPSAltitudeRef"],
+           6 : ["Altitude", "GPSAltitude"],
+           7 : ["GPS time (atomic clock)", "GPSTimeStamp"],
+           8 : ["GPS satellites usedd for measurement", "GPSSatellites"],
+           9 : ["GPS receiver status", "GPSStatus"],
+           10 : ["GPS mesaurement mode", "GPSMeasureMode"],
+           11 : ["Measurement precision", "GPSDOP"],
+           12 : ["Speed unit", "GPSSpeedRef"],
+           13 : ["Speed of GPS receiver", "GPSSpeed"],
+           14 : ["Reference for direction of movement", "GPSTrackRef"],
+           15 : ["Direction of movement", "GPSTrack"],
+           16 : ["Reference for direction of image", "GPSImgDirectionRef"],
+           17 : ["Direction of image", "GPSImgDirection"],
+           18 : ["Geodetic survey data used", "GPSMapDatum"],
+           19 : ["Reference for latitude of destination", "GPSDestLatitudeRef"],
+           20 : ["Latitude of destination", "GPSDestLatitude"],
+           21 : ["Reference for longitude of destination", "GPSDestLongitudeRef"],
+           22 : ["Longitude of destination", "GPSDestLongitude"],
+           23 : ["Reference for bearing of destination", "GPSDestBearingRef"],
+           24 : ["Bearing of destination", "GPSDestBearing"],
+           25 : ["Reference for distance to destination", "GPSDestDistanceRef"],
+           26 : ["Distance to destination", "GPSDestDistance"],
+           27 : ["Name of GPS processing method", "GPSProcessingMethod"],
+           28 : ["Name of GPS area", "GPSAreaInformation"],
+           29 : ["GPS Date", "GPSDateStamp"],
+           30 : ["GPS differential correction", "GPSDifferential"]
+       };
+
+       this.JpegMeta.JpegFile.prototype._markers = {
+           /* Start Of Frame markers, non-differential, Huffman coding */
+           0xc0: ["SOF0", "_sofHandler", "Baseline DCT"],
+           0xc1: ["SOF1", "_sofHandler", "Extended sequential DCT"],
+           0xc2: ["SOF2", "_sofHandler", "Progressive DCT"],
+           0xc3: ["SOF3", "_sofHandler", "Lossless (sequential)"],
+           
+           /* Start Of Frame markers, differential, Huffman coding */
+           0xc5: ["SOF5", "_sofHandler", "Differential sequential DCT"],
+           0xc6: ["SOF6", "_sofHandler", "Differential progressive DCT"],
+           0xc7: ["SOF7", "_sofHandler", "Differential lossless (sequential)"],
+           
+           /* Start Of Frame markers, non-differential, arithmetic coding */
+           0xc8: ["JPG", null, "Reserved for JPEG extensions"],
+           0xc9: ["SOF9", "_sofHandler", "Extended sequential DCT"],
+           0xca: ["SOF10", "_sofHandler", "Progressive DCT"],
+           0xcb: ["SOF11", "_sofHandler", "Lossless (sequential)"],
+           
+           /* Start Of Frame markers, differential, arithmetic coding */
+           0xcd: ["SOF13", "_sofHandler", "Differential sequential DCT"],
+           0xce: ["SOF14", "_sofHandler", "Differential progressive DCT"],
+           0xcf: ["SOF15", "_sofHandler", "Differential lossless (sequential)"],
+           
+           /* Huffman table specification */
+           0xc4: ["DHT", null, "Define Huffman table(s)"],
+           0xcc: ["DAC", null, "Define arithmetic coding conditioning(s)"],
+           
+           /* Restart interval termination" */
+           0xd0: ["RST0", null, "Restart with modulo 8 count “0”"],
+           0xd1: ["RST1", null, "Restart with modulo 8 count “1”"],
+           0xd2: ["RST2", null, "Restart with modulo 8 count “2”"],
+           0xd3: ["RST3", null, "Restart with modulo 8 count “3”"],
+           0xd4: ["RST4", null, "Restart with modulo 8 count “4”"],
+           0xd5: ["RST5", null, "Restart with modulo 8 count “5”"],
+           0xd6: ["RST6", null, "Restart with modulo 8 count “6”"],
+           0xd7: ["RST7", null, "Restart with modulo 8 count “7”"],
+           
+           /* Other markers */
+           0xd8: ["SOI", null, "Start of image"],
+           0xd9: ["EOI", null, "End of image"],
+           0xda: ["SOS", null, "Start of scan"],
+           0xdb: ["DQT", null, "Define quantization table(s)"],
+           0xdc: ["DNL", null, "Define number of lines"],
+           0xdd: ["DRI", null, "Define restart interval"],
+           0xde: ["DHP", null, "Define hierarchical progression"],
+           0xdf: ["EXP", null, "Expand reference component(s)"],
+           0xe0: ["APP0", "_app0Handler", "Reserved for application segments"],
+           0xe1: ["APP1", "_app1Handler"],
+           0xe2: ["APP2", null],
+           0xe3: ["APP3", null],
+           0xe4: ["APP4", null],
+           0xe5: ["APP5", null],
+           0xe6: ["APP6", null],
+           0xe7: ["APP7", null],
+           0xe8: ["APP8", null],
+           0xe9: ["APP9", null],
+           0xea: ["APP10", null],
+           0xeb: ["APP11", null],
+           0xec: ["APP12", null],
+           0xed: ["APP13", null],
+           0xee: ["APP14", null],
+           0xef: ["APP15", null],
+           0xf0: ["JPG0", null], /* Reserved for JPEG extensions */
+           0xf1: ["JPG1", null],
+           0xf2: ["JPG2", null],
+           0xf3: ["JPG3", null],
+           0xf4: ["JPG4", null],
+           0xf5: ["JPG5", null],
+           0xf6: ["JPG6", null],
+           0xf7: ["JPG7", null],
+           0xf8: ["JPG8", null],
+           0xf9: ["JPG9", null],
+           0xfa: ["JPG10", null],
+           0xfb: ["JPG11", null],
+           0xfc: ["JPG12", null],
+           0xfd: ["JPG13", null],
+           0xfe: ["COM", null], /* Comment */
+           
+           /* Reserved markers */
+           0x01: ["JPG13", null] /* For temporary private use in arithmetic coding */
+           /* 02 -> bf are reserverd */
+       };
+
+       /* Private methods */
+       this.JpegMeta.JpegFile.prototype._addMetaGroup = function _addMetaGroup(name, description) {
+           var group = new JpegMeta.MetaGroup(name, description);
+           this[group.fieldName] = group;
+           this.metaGroups[group.fieldName] = group;
+           return group;
+       };
+
+       this.JpegMeta.JpegFile.prototype._parseIfd = function _parseIfd(endian, _binary_data, base, ifd_offset, tags, name, description) {
+           var num_fields = JpegMeta.parseNum(endian, _binary_data, base + ifd_offset, 2);
+           /* Per tag variables */
+           var i, j;
+           var tag_base;
+           var tag_field;
+           var type, type_field, type_size;
+           var num_values;
+           var value_offset;
+           var value;
+           var _val;
+           var num;
+           var den;
+           
+           var group;
+           
+           group = this._addMetaGroup(name, description);
+       
+           for (var i = 0; i < num_fields; i++) {
+               /* parse the field */
+               tag_base = base + ifd_offset + 2 + (i * 12);
+               tag_field = JpegMeta.parseNum(endian, _binary_data, tag_base, 2);
+               type_field = JpegMeta.parseNum(endian, _binary_data, tag_base + 2, 2);
+               num_values = JpegMeta.parseNum(endian, _binary_data, tag_base + 4, 4);
+               value_offset = JpegMeta.parseNum(endian, _binary_data, tag_base + 8, 4);
+               if (this._types[type_field] === undefined) {
+                   continue;
+               }
+               type = this._types[type_field][0];
+               type_size = this._types[type_field][1];
+               
+               if (type_size * num_values <= 4) {
+                   /* Data is in-line */
+                   value_offset = tag_base + 8;
+               } else {
+                   value_offset = base + value_offset;
+               }
+               
+               /* Read the value */
+               if (type == "UNDEFINED") {
+                   value = _binary_data.slice(value_offset, value_offset + num_values);
+               } else if (type == "ASCII") {
+                   value = _binary_data.slice(value_offset, value_offset + num_values);
+                   value = value.split('\x00')[0];
+                   /* strip trail nul */
+               } else {
+                   value = new Array();
+                   for (j = 0; j < num_values; j++, value_offset += type_size) {
+                       if (type == "BYTE" || type == "SHORT" || type == "LONG") {
+                           value.push(JpegMeta.parseNum(endian, _binary_data, value_offset, type_size));
+                       }
+                       if (type == "SBYTE" || type == "SSHORT" || type == "SLONG") {
+                           value.push(JpegMeta.parseSnum(endian, _binary_data, value_offset, type_size));
+                       }
+                       if (type == "RATIONAL") {
+                           num = JpegMeta.parseNum(endian, _binary_data, value_offset, 4);
+                           den = JpegMeta.parseNum(endian, _binary_data, value_offset + 4, 4);
+                           value.push(new JpegMeta.Rational(num, den));
+                       }
+                       if (type == "SRATIONAL") {
+                           num = JpegMeta.parseSnum(endian, _binary_data, value_offset, 4);
+                           den = JpegMeta.parseSnum(endian, _binary_data, value_offset + 4, 4);
+                           value.push(new JpegMeta.Rational(num, den));
+                       }
+                       value.push();
+                   }
+                   if (num_values === 1) {
+                       value = value[0];
+                   }
+               }
+               if (tags[tag_field] !== undefined) {
+                       group._addProperty(tags[tag_field][1], tags[tag_field][0], value);
+               }
+           }
+       };
+
+       this.JpegMeta.JpegFile.prototype._jfifHandler = function _jfifHandler(mark, pos) {
+           if (this.jfif !== undefined) {
+               throw Error("Multiple JFIF segments found");
+           }
+           this._addMetaGroup("jfif", "JFIF");
+           this.jfif._addProperty("version_major", "Version Major", this._binary_data.charCodeAt(pos + 5));
+           this.jfif._addProperty("version_minor", "Version Minor", this._binary_data.charCodeAt(pos + 6));
+           this.jfif._addProperty("version", "JFIF Version", this.jfif.version_major.value + "." + this.jfif.version_minor.value);
+           this.jfif._addProperty("units", "Density Unit", this._binary_data.charCodeAt(pos + 7));
+           this.jfif._addProperty("Xdensity", "X density", JpegMeta.parseNum(">", this._binary_data, pos + 8, 2));
+           this.jfif._addProperty("Ydensity", "Y Density", JpegMeta.parseNum(">", this._binary_data, pos + 10, 2));
+           this.jfif._addProperty("Xthumbnail", "X Thumbnail", JpegMeta.parseNum(">", this._binary_data, pos + 12, 1));
+           this.jfif._addProperty("Ythumbnail", "Y Thumbnail", JpegMeta.parseNum(">", this._binary_data, pos + 13, 1));
+       };
+
+       /* Handle app0 segments */
+       this.JpegMeta.JpegFile.prototype._app0Handler = function app0Handler(mark, pos) {
+           var ident = this._binary_data.slice(pos, pos + 5);
+           if (ident == this._JFIF_IDENT) {
+               this._jfifHandler(mark, pos);
+           } else if (ident == this._JFXX_IDENT) {
+               /* Don't handle JFXX Ident yet */
+           } else {
+               /* Don't know about other idents */
+           }
+       };
+
+       /* Handle app1 segments */
+       this.JpegMeta.JpegFile.prototype._app1Handler = function _app1Handler(mark, pos) {
+           var ident = this._binary_data.slice(pos, pos + 5);
+           if (ident == this._EXIF_IDENT) {
+               this._exifHandler(mark, pos + 6);
+           } else {
+               /* Don't know about other idents */
+           }
+       };
+
+       /* Handle exif segments */
+       JpegMeta.JpegFile.prototype._exifHandler = function _exifHandler(mark, pos) {
+           if (this.exif !== undefined) {
+               throw new Error("Multiple JFIF segments found");
+           }
+           
+           /* Parse this TIFF header */
+           var endian;
+           var magic_field;
+           var ifd_offset;
+           var primary_ifd, exif_ifd, gps_ifd;
+           var endian_field = this._binary_data.slice(pos, pos + 2);
+           
+           /* Trivia: This 'I' is for Intel, the 'M' is for Motorola */
+           if (endian_field === "II") {
+               endian = "<";
+           } else if (endian_field === "MM") {
+               endian = ">";
+           } else {
+               throw new Error("Malformed TIFF meta-data. Unknown endianess: " + endian_field);
+           }
+           
+           magic_field = JpegMeta.parseNum(endian, this._binary_data, pos + 2, 2);
+           
+           if (magic_field !== 42) {
+               throw new Error("Malformed TIFF meta-data. Bad magic: " + magic_field);
+           }
+           
+           ifd_offset = JpegMeta.parseNum(endian, this._binary_data, pos + 4, 4);
+           
+           /* Parse 0th IFD */
+           this._parseIfd(endian, this._binary_data, pos, ifd_offset, this._tifftags, "tiff", "TIFF");
+           
+           if (this.tiff.ExifIfdPointer) {
+               this._parseIfd(endian, this._binary_data, pos, this.tiff.ExifIfdPointer.value, this._exiftags, "exif", "Exif");
+           }
+           
+           if (this.tiff.GPSInfoIfdPointer) {
+               this._parseIfd(endian, this._binary_data, pos, this.tiff.GPSInfoIfdPointer.value, this._gpstags, "gps", "GPS");
+               if (this.gps.GPSLatitude) {
+                   var latitude;
+                   latitude = this.gps.GPSLatitude.value[0].asFloat() + 
+                       (1 / 60) * this.gps.GPSLatitude.value[1].asFloat() + 
+                       (1 / 3600) * this.gps.GPSLatitude.value[2].asFloat();
+                   if (this.gps.GPSLatitudeRef.value === "S") {
+                       latitude = -latitude;
+                   }
+                   this.gps._addProperty("latitude", "Dec. Latitude", latitude);
+               }
+               if (this.gps.GPSLongitude) {
+                   var longitude;
+                   longitude = this.gps.GPSLongitude.value[0].asFloat() + 
+                       (1 / 60) * this.gps.GPSLongitude.value[1].asFloat() + 
+                       (1 / 3600) * this.gps.GPSLongitude.value[2].asFloat();
+                   if (this.gps.GPSLongitudeRef.value === "W") {
+                       longitude = -longitude;
+                   }
+                   this.gps._addProperty("longitude", "Dec. Longitude", longitude);
+               }
+           }
+       };
+
+       // MediaWiki: Add mw.libs wrapper
+       mw.libs.jpegmeta = function( fileReaderResult, fileName ) {
+               return new JpegMeta.JpegFile( fileReaderResult, fileName );
+       };
+
+}() );
diff --git a/resources/src/mediawiki.page/mediawiki.page.gallery.js b/resources/src/mediawiki.page/mediawiki.page.gallery.js
new file mode 100644 (file)
index 0000000..f92d372
--- /dev/null
@@ -0,0 +1,253 @@
+/**
+ * Show gallery captions when focused. Copied directly from jquery.mw-jump.js.
+ * Also Dynamically resize images to justify them.
+ */
+( function ( $, mw ) {
+       $( function () {
+               var isTouchScreen,
+                       gettingFocus,
+                       galleries = 'ul.mw-gallery-packed-overlay, ul.mw-gallery-packed-hover, ul.mw-gallery-packed';
+
+               // Is there a better way to detect a touchscreen? Current check taken from stack overflow.
+               isTouchScreen = !!( window.ontouchstart !== undefined || window.DocumentTouch !== undefined && document instanceof window.DocumentTouch );
+
+               if ( isTouchScreen ) {
+                       // Always show the caption for a touch screen.
+                       $( 'ul.mw-gallery-packed-hover' )
+                               .addClass( 'mw-gallery-packed-overlay' )
+                               .removeClass( 'mw-gallery-packed-hover' );
+               } else {
+                       // Note use of just "a", not a.image, since we want this to trigger if a link in
+                       // the caption receives focus
+                       $( 'ul.mw-gallery-packed-hover li.gallerybox' ).on( 'focus blur', 'a', function ( e ) {
+                               // Confusingly jQuery leaves e.type as focusout for delegated blur events
+                               gettingFocus = e.type !== 'blur' && e.type !== 'focusout';
+                               $( this ).closest( 'li.gallerybox' ).toggleClass( 'mw-gallery-focused', gettingFocus );
+                       } );
+               }
+
+               // Now on to justification.
+               // We may still get ragged edges if someone resizes their window. Could bind to
+               // that event, otoh do we really want to constantly be resizing galleries?
+               $( galleries ).each( function () {
+                       var lastTop,
+                               $img,
+                               imgWidth,
+                               imgHeight,
+                               rows = [],
+                               $gallery = $( this );
+
+                       $gallery.children( 'li' ).each( function () {
+                               // Math.floor to be paranoid if things are off by 0.00000000001
+                               var top = Math.floor( $( this ).position().top ),
+                                       $this = $( this );
+
+                               if ( top !== lastTop ) {
+                                       rows[rows.length] = [];
+                                       lastTop = top;
+                               }
+
+                               $img = $this.find( 'div.thumb a.image img' );
+                               if ( $img.length && $img[0].height ) {
+                                       imgHeight = $img[0].height;
+                                       imgWidth = $img[0].width;
+                               } else {
+                                       // If we don't have a real image, get the containing divs width/height.
+                                       // Note that if we do have a real image, using this method will generally
+                                       // give the same answer, but can be different in the case of a very
+                                       // narrow image where extra padding is added.
+                                       imgHeight = $this.children().children( 'div:first' ).height();
+                                       imgWidth = $this.children().children( 'div:first' ).width();
+                               }
+
+                               // Hack to make an edge case work ok
+                               if ( imgHeight < 30 ) {
+                                       // Don't try and resize this item.
+                                       imgHeight = 0;
+                               }
+
+                               rows[rows.length - 1][rows[rows.length - 1].length] = {
+                                       $elm: $this,
+                                       width: $this.outerWidth(),
+                                       imgWidth: imgWidth,
+                                       // XXX: can divide by 0 ever happen?
+                                       aspect: imgWidth / imgHeight,
+                                       captionWidth: $this.children().children( 'div.gallerytextwrapper' ).width(),
+                                       height: imgHeight
+                               };
+                       } );
+
+                       ( function () {
+                               var maxWidth,
+                                       combinedAspect,
+                                       combinedPadding,
+                                       curRow,
+                                       curRowHeight,
+                                       wantedWidth,
+                                       preferredHeight,
+                                       newWidth,
+                                       padding,
+                                       $outerDiv,
+                                       $innerDiv,
+                                       $imageDiv,
+                                       $imageElm,
+                                       imageElm,
+                                       $caption,
+                                       hookInfo,
+                                       i,
+                                       j,
+                                       avgZoom,
+                                       totalZoom = 0;
+
+                               for ( i = 0; i < rows.length; i++ ) {
+                                       maxWidth = $gallery.width();
+                                       combinedAspect = 0;
+                                       combinedPadding = 0;
+                                       curRow = rows[i];
+                                       curRowHeight = 0;
+
+                                       for ( j = 0; j < curRow.length; j++ ) {
+                                               if ( curRowHeight === 0 ) {
+                                                       if ( isFinite( curRow[j].height ) ) {
+                                                               // Get the height of this row, by taking the first
+                                                               // non-out of bounds height
+                                                               curRowHeight = curRow[j].height;
+                                                       }
+                                               }
+
+                                               if ( curRow[j].aspect === 0 || !isFinite( curRow[j].aspect ) ) {
+                                                       mw.log( 'Skipping item ' + j + ' due to aspect: ' + curRow[j].aspect );
+                                                       // One of the dimensions are 0. Probably should
+                                                       // not try to resize.
+                                                       combinedPadding += curRow[j].width;
+                                               } else {
+                                                       combinedAspect += curRow[j].aspect;
+                                                       combinedPadding += curRow[j].width - curRow[j].imgWidth;
+                                               }
+                                       }
+
+                                       // Add some padding for inter-element spacing.
+                                       combinedPadding += 5 * curRow.length;
+                                       wantedWidth = maxWidth - combinedPadding;
+                                       preferredHeight = wantedWidth / combinedAspect;
+
+                                       if ( preferredHeight > curRowHeight * 1.5 ) {
+                                               // Only expand at most 1.5 times current size
+                                               // As that's as high a resolution as we have.
+                                               // Also on the off chance there is a bug in this
+                                               // code, would prevent accidentally expanding to
+                                               // be 10 billion pixels wide.
+                                               mw.log( 'mw.page.gallery: Cannot fit row, aspect is ' + preferredHeight / curRowHeight );
+                                               if ( i === rows.length - 1 ) {
+                                                       // If its the last row, and we can't fit it,
+                                                       // don't make the entire row huge.
+                                                       avgZoom = ( totalZoom / ( rows.length - 1 ) ) * curRowHeight;
+                                                       if ( isFinite( avgZoom ) && avgZoom >= 1 && avgZoom <= 1.5 ) {
+                                                               preferredHeight = avgZoom;
+                                                       } else {
+                                                               // Probably a single row gallery
+                                                               preferredHeight = curRowHeight;
+                                                       }
+                                               } else {
+                                                       preferredHeight = 1.5 * curRowHeight;
+                                               }
+                                       }
+                                       if ( !isFinite( preferredHeight ) ) {
+                                               // This *definitely* should not happen.
+                                               mw.log( 'mw.page.gallery: Trying to resize row ' + i + ' to ' + preferredHeight + '?!' );
+                                               // Skip this row.
+                                               continue;
+                                       }
+                                       if ( preferredHeight < 5 ) {
+                                               // Well something clearly went wrong...
+                                               mw.log( {
+                                                       maxWidth: maxWidth,
+                                                       combinedPadding: combinedPadding,
+                                                       combinedAspect: combinedAspect,
+                                                       wantedWidth: wantedWidth
+                                               } );
+                                               mw.log( 'mw.page.gallery: [BUG!] Fitting row ' + i + ' to too small a size: ' + preferredHeight );
+                                               // Skip this row.
+                                               continue;
+                                       }
+
+                                       if ( preferredHeight / curRowHeight > 1 ) {
+                                               totalZoom += preferredHeight / curRowHeight;
+                                       } else {
+                                               // If we shrink, still consider that a zoom of 1
+                                               totalZoom += 1;
+                                       }
+
+                                       for ( j = 0; j < curRow.length; j++ ) {
+                                               newWidth = preferredHeight * curRow[j].aspect;
+                                               padding = curRow[j].width - curRow[j].imgWidth;
+                                               $outerDiv = curRow[j].$elm;
+                                               $innerDiv = $outerDiv.children( 'div' ).first();
+                                               $imageDiv = $innerDiv.children( 'div.thumb' );
+                                               $imageElm = $imageDiv.find( 'img' ).first();
+                                               imageElm = $imageElm.length ? $imageElm[0] : null;
+                                               $caption = $outerDiv.find( 'div.gallerytextwrapper' );
+
+                                               // Since we are going to re-adjust the height, the vertical
+                                               // centering margins need to be reset.
+                                               $imageDiv.children( 'div' ).css( 'margin', '0px auto' );
+
+                                               if ( newWidth < 60 || !isFinite( newWidth ) ) {
+                                                       // Making something skinnier than this will mess up captions,
+                                                       mw.log( 'mw.page.gallery: Tried to make image ' + newWidth + 'px wide but too narrow.' );
+                                                       if ( newWidth < 1 || !isFinite( newWidth ) ) {
+                                                               $innerDiv.height( preferredHeight );
+                                                               // Don't even try and touch the image size if it could mean
+                                                               // making it disappear.
+                                                               continue;
+                                                       }
+                                               } else {
+                                                       $outerDiv.width( newWidth + padding );
+                                                       $innerDiv.width( newWidth + padding );
+                                                       $imageDiv.width( newWidth );
+                                                       $caption.width( curRow[j].captionWidth + ( newWidth - curRow[j].imgWidth ) );
+                                               }
+
+                                               hookInfo = {
+                                                       fullWidth: newWidth + padding,
+                                                       imgWidth: newWidth,
+                                                       imgHeight: preferredHeight,
+                                                       $innerDiv: $innerDiv,
+                                                       $imageDiv: $imageDiv,
+                                                       $outerDiv: $outerDiv,
+                                                       // Whether the hook took action
+                                                       resolved: false
+                                               };
+
+                                               /**
+                                                * Gallery resize.
+                                                *
+                                                * If your handler resizes an image, it should also set the resolved
+                                                * property to true. Additionally, because this module only exposes this
+                                                * logic temporarily, you should load your module in position top to
+                                                * ensure it is registered before this runs (FIXME: Don't use mw.hook)
+                                                *
+                                                * See TimedMediaHandler for an example.
+                                                *
+                                                * @event mediawiki_page_gallery_resize
+                                                * @member mw.hook
+                                                * @param {Object} hookInfo
+                                                */
+                                               mw.hook( 'mediawiki.page.gallery.resize' ).fire( hookInfo );
+
+                                               if ( !hookInfo.resolved ) {
+                                                       if ( imageElm ) {
+                                                               // We don't always have an img, e.g. in the case of an invalid file.
+                                                               imageElm.width = newWidth;
+                                                               imageElm.height = preferredHeight;
+                                                       } else {
+                                                               // Not a file box.
+                                                               $imageDiv.height( preferredHeight );
+                                                       }
+                                               }
+                                       }
+                               }
+                       } )();
+               } );
+       } );
+} )( jQuery, mediaWiki );
diff --git a/resources/src/mediawiki.page/mediawiki.page.image.pagination.js b/resources/src/mediawiki.page/mediawiki.page.image.pagination.js
new file mode 100644 (file)
index 0000000..50301bd
--- /dev/null
@@ -0,0 +1,93 @@
+/**
+ * Change multi-page image navigation so that the current page display can be changed
+ * without a page reload. Currently, the only image formats that can be multi-page images are
+ * PDF and DjVu files
+ */
+( function ( mw, $ ) {
+
+       // Initialize ajax request variable
+       var xhr;
+
+       // Use jQuery's load function to specifically select and replace table.multipageimage's child
+       // tr with the new page's table.multipageimage's tr element.
+       // table.multipageimage always has only one row.
+       function loadPage( page, hist ) {
+               if ( xhr ) {
+                       // Abort previous requests to prevent backlog created by
+                       // repeatedly pressing back/forwards buttons
+                       xhr.abort();
+               }
+
+               var $multipageimage = $( 'table.multipageimage' ),
+                       $spinner;
+
+               // Add a new spinner if one doesn't already exist
+               if ( !$multipageimage.find( '.mw-spinner' ).length ) {
+
+                       $spinner = $.createSpinner( {
+                               size: 'large',
+                               type: 'block'
+                       } )
+                               // Set the spinner's dimensions equal to the table's dimensions so that
+                               // the current scroll position is not lost after the table is emptied prior to
+                               // its contents being updated
+                               .css( {
+                                       height: $multipageimage.find( 'tr' ).height(),
+                                       width: $multipageimage.find( 'tr' ).width()
+                               } );
+
+                       $multipageimage.empty().append( $spinner );
+               }
+
+               xhr = $.ajax( {
+                       url: page,
+                       success: function ( data ) {
+                               // Load the page
+                               $multipageimage.empty().append( $( data ).find( 'table.multipageimage tr' ) );
+                               // Fire hook because the page's content has changed
+                               mw.hook( 'wikipage.content' ).fire( $multipageimage );
+                               // Set up the new page for pagination
+                               ajaxifyPageNavigation();
+                               // Add new page of image to history.  To preserve the back-forwards chain in the browser,
+                               // if the user gets here via the back/forward button, don't update the history.
+                               if ( window.history && history.pushState && !hist ) {
+                                       history.pushState( { url: page }, document.title, page );
+                               }
+                       }
+               } );
+       }
+
+       function ajaxifyPageNavigation() {
+               // Intercept the default action of the links in the thumbnail navigation
+               $( '.multipageimagenavbox' ).one( 'click', 'a', function ( e ) {
+                       loadPage( this.href );
+                       e.preventDefault();
+               } );
+
+               // Prevent the submission of the page select form and instead call loadPage
+               $( 'form[name="pageselector"]' ).one( 'change submit', function ( e ) {
+                       loadPage( this.action + '?' + $( this ).serialize() );
+                       e.preventDefault();
+               } );
+       }
+
+       $( document ).ready( function () {
+               // The presence of table.multipageimage signifies that this file is a multi-page image
+               if ( mw.config.get( 'wgNamespaceNumber' ) === 6 && $( 'table.multipageimage' ).length !== 0 ) {
+                       ajaxifyPageNavigation();
+
+                       // Set up history.pushState (if available), so that when the user browses to a new page of
+                       // the same file, the browser's history is updated. If the user clicks the back/forward button
+                       // in the midst of navigating a file's pages, load the page inline.
+                       if ( window.history && history.pushState && history.replaceState ) {
+                               history.replaceState( { url: window.location.href }, '' );
+                               $( window ).on( 'popstate', function ( e ) {
+                                       var state = e.originalEvent.state;
+                                       if ( state ) {
+                                               loadPage( state.url, true );
+                                       }
+                               } );
+                       }
+               }
+       } );
+}( mediaWiki, jQuery ) );
diff --git a/resources/src/mediawiki.page/mediawiki.page.patrol.ajax.js b/resources/src/mediawiki.page/mediawiki.page.patrol.ajax.js
new file mode 100644 (file)
index 0000000..5fb14dd
--- /dev/null
@@ -0,0 +1,66 @@
+/**
+ * Animate patrol links to use asynchronous API requests to
+ * patrol pages, rather than navigating to a different URI.
+ *
+ * @since 1.21
+ * @author Marius Hoch <hoo@online.de>
+ */
+( function ( mw, $ ) {
+       if ( !mw.user.tokens.exists( 'patrolToken' ) ) {
+               // Current user has no patrol right, or an old cached version of user.tokens
+               // that didn't have patrolToken yet.
+               return;
+       }
+       $( function () {
+               var $patrolLinks = $( '.patrollink a' );
+               $patrolLinks.on( 'click', function ( e ) {
+                       var $spinner, href, rcid, apiRequest;
+
+                       // Start preloading the notification module (normally loaded by mw.notify())
+                       mw.loader.load( ['mediawiki.notification'], null, true );
+
+                       // Hide the link and create a spinner to show it inside the brackets.
+                       $spinner = $.createSpinner( {
+                               size: 'small',
+                               type: 'inline'
+                       } );
+                       $( this ).hide().after( $spinner );
+
+                       href = $( this ).attr( 'href' );
+                       rcid = mw.util.getParamValue( 'rcid', href );
+                       apiRequest = new mw.Api();
+
+                       apiRequest.post( {
+                               action: 'patrol',
+                               token: mw.user.tokens.get( 'patrolToken' ),
+                               rcid: rcid
+                       } )
+                       .done( function ( data ) {
+                               // Remove all patrollinks from the page (including any spinners inside).
+                               $patrolLinks.closest( '.patrollink' ).remove();
+                               if ( data.patrol !== undefined ) {
+                                       // Success
+                                       var title = new mw.Title( data.patrol.title );
+                                       mw.notify( mw.msg( 'markedaspatrollednotify', title.toText() ) );
+                               } else {
+                                       // This should never happen as errors should trigger fail
+                                       mw.notify( mw.msg( 'markedaspatrollederrornotify' ) );
+                               }
+                       } )
+                       .fail( function ( error ) {
+                               $spinner.remove();
+                               // Restore the patrol link. This allows the user to try again
+                               // (or open it in a new window, bypassing this ajax module).
+                               $patrolLinks.show();
+                               if ( error === 'noautopatrol' ) {
+                                       // Can't patrol own
+                                       mw.notify( mw.msg( 'markedaspatrollederror-noautopatrol' ) );
+                               } else {
+                                       mw.notify( mw.msg( 'markedaspatrollederrornotify' ) );
+                               }
+                       } );
+
+                       e.preventDefault();
+               } );
+       } );
+}( mediaWiki, jQuery ) );
diff --git a/resources/src/mediawiki.page/mediawiki.page.ready.js b/resources/src/mediawiki.page/mediawiki.page.ready.js
new file mode 100644 (file)
index 0000000..ccddb3e
--- /dev/null
@@ -0,0 +1,40 @@
+( function ( mw, $ ) {
+       var supportsPlaceholder = 'placeholder' in document.createElement( 'input' );
+
+       mw.hook( 'wikipage.content' ).add( function ( $content ) {
+               var $sortableTables;
+
+               // Run jquery.placeholder polyfill if placeholder is not supported
+               if ( !supportsPlaceholder ) {
+                       $content.find( 'input[placeholder]' ).placeholder();
+               }
+
+               // Run jquery.makeCollapsible
+               $content.find( '.mw-collapsible' ).makeCollapsible();
+
+               // Lazy load jquery.tablesorter
+               $sortableTables = $content.find( 'table.sortable' );
+               if ( $sortableTables.length ) {
+                       mw.loader.using( 'jquery.tablesorter', function () {
+                               $sortableTables.tablesorter();
+                       } );
+               }
+
+               // Run jquery.checkboxShiftClick
+               $content.find( 'input[type="checkbox"]:not(.noshiftselect)' ).checkboxShiftClick();
+       } );
+
+       // Things outside the wikipage content
+       $( function () {
+
+               if ( !supportsPlaceholder ) {
+                       // Exclude content to avoid hitting it twice for the (first) wikipage content
+                       $( 'input[placeholder]' ).not( '#mw-content-text input' ).placeholder();
+               }
+
+               // Add accesskey hints to the tooltips
+               mw.util.updateTooltipAccessKeys();
+
+       } );
+
+}( mediaWiki, jQuery ) );
diff --git a/resources/src/mediawiki.page/mediawiki.page.startup.js b/resources/src/mediawiki.page/mediawiki.page.startup.js
new file mode 100644 (file)
index 0000000..c75e59f
--- /dev/null
@@ -0,0 +1,37 @@
+( function ( mw, $ ) {
+
+       mw.page = {};
+
+       // Client profile classes for <html>
+       // Allows for easy hiding/showing of JS or no-JS-specific UI elements
+       $( 'html' )
+               .addClass( 'client-js' )
+               .removeClass( 'client-nojs' );
+
+       $( function () {
+               // Initialize utilities as soon as the document is ready (mw.util.$content).
+               // In the domready here instead of in mediawiki.page.ready to ensure that it gets enqueued
+               // before other modules hook into domready, so that mw.util.$content (defined by
+               // mw.util.init), is defined for them.
+               mw.util.init();
+
+               /**
+                * Fired when wiki content is being added to the DOM
+                *
+                * It is encouraged to fire it before the main DOM is changed (when $content
+                * is still detatched).  However, this order is not defined either way, so you
+                * should only rely on $content itself.
+                *
+                * This includes the ready event on a page load (including post-edit loads)
+                * and when content has been previewed with LivePreview.
+                *
+                * @event wikipage_content
+                * @member mw.hook
+                * @param {jQuery} $content The most appropriate element containing the content,
+                *   such as #mw-content-text (regular content root) or #wikiPreview (live preview
+                *   root)
+                */
+               mw.hook( 'wikipage.content' ).fire( $( '#mw-content-text' ) );
+       } );
+
+}( mediaWiki, jQuery ) );
diff --git a/resources/src/mediawiki.page/mediawiki.page.watch.ajax.js b/resources/src/mediawiki.page/mediawiki.page.watch.ajax.js
new file mode 100644 (file)
index 0000000..850177f
--- /dev/null
@@ -0,0 +1,179 @@
+/**
+ * Animate watch/unwatch links to use asynchronous API requests to
+ * watch pages, rather than navigating to a different URI.
+ *
+ * @class mw.page.watch.ajax
+ */
+( function ( mw, $ ) {
+       // The name of the page to watch or unwatch
+       var title = mw.config.get( 'wgRelevantPageName', mw.config.get( 'wgPageName' ) );
+
+       /**
+        * Update the link text, link href attribute and (if applicable)
+        * "loading" class.
+        *
+        * @param {jQuery} $link Anchor tag of (un)watch link
+        * @param {string} action One of 'watch', 'unwatch'
+        * @param {string} [state="idle"] 'idle' or 'loading'. Default is 'idle'
+        */
+       function updateWatchLink( $link, action, state ) {
+               var accesskeyTip, msgKey, $li, otherAction;
+
+               // A valid but empty jQuery object shouldn't throw a TypeError
+               if ( !$link.length ) {
+                       return;
+               }
+
+               // Invalid actions shouldn't silently turn the page in an unrecoverable state
+               if ( action !== 'watch' && action !== 'unwatch' ) {
+                       throw new Error( 'Invalid action' );
+               }
+
+               // message keys 'watch', 'watching', 'unwatch' or 'unwatching'.
+               msgKey = state === 'loading' ? action + 'ing' : action;
+               otherAction = action === 'watch' ? 'unwatch' : 'watch';
+               accesskeyTip = $link.attr( 'title' ).match( mw.util.tooltipAccessKeyRegexp );
+               $li = $link.closest( 'li' );
+
+               // Trigger a 'watchpage' event for this List item.
+               // Announce the otherAction value as the first param.
+               // Used to monitor the state of watch link.
+               // TODO: Revise when system wide hooks are implemented
+               if ( state === undefined ) {
+                       $li.trigger( 'watchpage.mw', otherAction );
+               }
+
+               $link
+                       .text( mw.msg( msgKey ) )
+                       .attr( 'title', mw.msg( 'tooltip-ca-' + action ) +
+                               ( accesskeyTip ? ' ' + accesskeyTip[0] : '' )
+                       )
+                       .attr( 'href', mw.util.wikiScript() + '?' + $.param( {
+                                       title: title,
+                                       action: action
+                               } )
+                       );
+
+               // Most common ID style
+               if ( $li.prop( 'id' ) === 'ca-' + otherAction ) {
+                       $li.prop( 'id', 'ca-' + action );
+               }
+
+               // Special case for vector icon
+               if ( $li.hasClass( 'icon' ) ) {
+                       if ( state === 'loading' ) {
+                               $link.addClass( 'loading' );
+                       } else {
+                               $link.removeClass( 'loading' );
+                       }
+               }
+       }
+
+       /**
+        * TODO: This should be moved somewhere more accessible.
+        *
+        * @private
+        * @param {string} url
+        * @return {string} The extracted action, defaults to 'view'
+        */
+       function mwUriGetAction( url ) {
+               var action, actionPaths, key, i, m, parts;
+
+               // TODO: Does MediaWiki give action path or query param
+               // precedence? If the former, move this to the bottom
+               action = mw.util.getParamValue( 'action', url );
+               if ( action !== null ) {
+                       return action;
+               }
+
+               actionPaths = mw.config.get( 'wgActionPaths' );
+               for ( key in actionPaths ) {
+                       if ( actionPaths.hasOwnProperty( key ) ) {
+                               parts = actionPaths[key].split( '$1' );
+                               for ( i = 0; i < parts.length; i++ ) {
+                                       parts[i] = $.escapeRE( parts[i] );
+                               }
+                               m = new RegExp( parts.join( '(.+)' ) ).exec( url );
+                               if ( m && m[1] ) {
+                                       return key;
+                               }
+
+                       }
+               }
+
+               return 'view';
+       }
+
+       // Expose public methods
+       mw.page.watch = {
+               updateWatchLink: updateWatchLink
+       };
+
+       $( function () {
+               var $links = $( '.mw-watchlink a, a.mw-watchlink, ' +
+                       '#ca-watch a, #ca-unwatch a, #mw-unwatch-link1, ' +
+                       '#mw-unwatch-link2, #mw-watch-link2, #mw-watch-link1' );
+
+               // Allowing people to add inline animated links is a little scary
+               $links = $links.filter( ':not( #bodyContent *, #content * )' );
+
+               $links.click( function ( e ) {
+                       var action, api, $link;
+
+                       // Start preloading the notification module (normally loaded by mw.notify())
+                       mw.loader.load( ['mediawiki.notification'], null, true );
+
+                       action = mwUriGetAction( this.href );
+
+                       if ( action !== 'watch' && action !== 'unwatch' ) {
+                               // Could not extract target action from link url,
+                               // let native browsing handle it further
+                               return true;
+                       }
+                       e.preventDefault();
+                       e.stopPropagation();
+
+                       $link = $( this );
+
+                       updateWatchLink( $link, action, 'loading' );
+
+                       api = new mw.Api();
+
+                       api[action]( title )
+                               .done( function ( watchResponse ) {
+                                       var otherAction = action === 'watch' ? 'unwatch' : 'watch';
+
+                                       mw.notify( $.parseHTML( watchResponse.message ), {
+                                               tag: 'watch-self'
+                                       } );
+
+                                       // Set link to opposite
+                                       updateWatchLink( $link, otherAction );
+
+                                       // Update the "Watch this page" checkbox on action=edit when the
+                                       // page is watched or unwatched via the tab (bug 12395).
+                                       $( '#wpWatchthis' ).prop( 'checked', watchResponse.watched !== undefined );
+                               } )
+                               .fail( function () {
+                                       var cleanTitle, msg, link;
+
+                                       // Reset link to non-loading mode
+                                       updateWatchLink( $link, action );
+
+                                       // Format error message
+                                       cleanTitle = title.replace( /_/g, ' ' );
+                                       link = mw.html.element(
+                                               'a', {
+                                                       href: mw.util.getUrl( title ),
+                                                       title: cleanTitle
+                                               }, cleanTitle
+                                       );
+                                       msg = mw.message( 'watcherrortext', link );
+
+                                       // Report to user about the error
+                                       mw.notify( msg, { tag: 'watch-self' } );
+                               } );
+               } );
+       } );
+
+}( mediaWiki, jQuery ) );
diff --git a/resources/src/mediawiki.special/images/glyph-people-large.png b/resources/src/mediawiki.special/images/glyph-people-large.png
new file mode 100644 (file)
index 0000000..0578be0
Binary files /dev/null and b/resources/src/mediawiki.special/images/glyph-people-large.png differ
diff --git a/resources/src/mediawiki.special/images/icon-contributors.png b/resources/src/mediawiki.special/images/icon-contributors.png
new file mode 100644 (file)
index 0000000..f933aa6
Binary files /dev/null and b/resources/src/mediawiki.special/images/icon-contributors.png differ
diff --git a/resources/src/mediawiki.special/images/icon-edits.png b/resources/src/mediawiki.special/images/icon-edits.png
new file mode 100644 (file)
index 0000000..39f4f2d
Binary files /dev/null and b/resources/src/mediawiki.special/images/icon-edits.png differ
diff --git a/resources/src/mediawiki.special/images/icon-lock.png b/resources/src/mediawiki.special/images/icon-lock.png
new file mode 100644 (file)
index 0000000..03f0eec
Binary files /dev/null and b/resources/src/mediawiki.special/images/icon-lock.png differ
diff --git a/resources/src/mediawiki.special/images/icon-pages.png b/resources/src/mediawiki.special/images/icon-pages.png
new file mode 100644 (file)
index 0000000..59513db
Binary files /dev/null and b/resources/src/mediawiki.special/images/icon-pages.png differ
diff --git a/resources/src/mediawiki.special/mediawiki.special.block.css b/resources/src/mediawiki.special/mediawiki.special.block.css
new file mode 100644 (file)
index 0000000..899a9f3
--- /dev/null
@@ -0,0 +1,7 @@
+/**
+ * Styling for Special:Block
+ */
+
+label[for="mw-input-wpConfirm"] {
+       font-weight: bold;
+}
diff --git a/resources/src/mediawiki.special/mediawiki.special.block.js b/resources/src/mediawiki.special/mediawiki.special.block.js
new file mode 100644 (file)
index 0000000..8dedb9b
--- /dev/null
@@ -0,0 +1,45 @@
+/**
+ * JavaScript for Special:Block
+ */
+( function ( mw, $ ) {
+       $( function () {
+               var $blockTarget = $( '#mw-bi-target' ),
+                       $anonOnlyRow = $( '#mw-input-wpHardBlock' ).closest( 'tr' ),
+                       $enableAutoblockRow = $( '#mw-input-wpAutoBlock' ).closest( 'tr' ),
+                       $hideUser = $( '#mw-input-wpHideUser' ).closest( 'tr' ),
+                       $watchUser = $( '#mw-input-wpWatch' ).closest( 'tr' );
+
+               function updateBlockOptions( instant ) {
+                       var blocktarget = $.trim( $blockTarget.val() ),
+                               isEmpty = blocktarget === '',
+                               isIp = mw.util.isIPv4Address( blocktarget, true ) || mw.util.isIPv6Address( blocktarget, true ),
+                               isIpRange = isIp && blocktarget.match( /\/\d+$/ );
+
+                       if ( isIp && !isEmpty ) {
+                               $enableAutoblockRow.goOut( instant );
+                               $hideUser.goOut( instant );
+                       } else {
+                               $enableAutoblockRow.goIn( instant );
+                               $hideUser.goIn( instant );
+                       }
+                       if ( !isIp && !isEmpty ) {
+                               $anonOnlyRow.goOut( instant );
+                       } else {
+                               $anonOnlyRow.goIn( instant );
+                       }
+                       if ( isIpRange && !isEmpty ) {
+                               $watchUser.goOut( instant );
+                       } else {
+                               $watchUser.goIn( instant );
+                       }
+               }
+
+               if ( $blockTarget.length ) {
+                       // Bind functions so they're checked whenever stuff changes
+                       $blockTarget.keyup( updateBlockOptions );
+
+                       // Call them now to set initial state (ie. Special:Block/Foobar?wpBlockExpiry=2+hours)
+                       updateBlockOptions( /* instant= */ true );
+               }
+       } );
+}( mediaWiki, jQuery ) );
diff --git a/resources/src/mediawiki.special/mediawiki.special.changeemail.css b/resources/src/mediawiki.special/mediawiki.special.changeemail.css
new file mode 100644 (file)
index 0000000..9461fbd
--- /dev/null
@@ -0,0 +1,19 @@
+#mw-emailaddress-validity {
+       padding: 2px 1em;
+}
+#mw-emailaddress-validity {
+       border-bottom-right-radius: 0.8em;
+       border-top-right-radius: 0.8em;
+}
+
+/** colors also used in mediawiki.special.preferences.css */
+#mw-emailaddress-validity.valid {
+       border: 1px solid #80FF80;
+       background-color: #C0FFC0;
+       color: black;
+}
+#mw-emailaddress-validity.invalid {
+       border: 1px solid #FF8080;
+       background-color: #FFC0C0;
+       color: black;
+}
diff --git a/resources/src/mediawiki.special/mediawiki.special.changeemail.js b/resources/src/mediawiki.special/mediawiki.special.changeemail.js
new file mode 100644 (file)
index 0000000..bc2a0a2
--- /dev/null
@@ -0,0 +1,51 @@
+/**
+ * JavaScript for Special:ChangeEmail
+ */
+( function ( mw, $ ) {
+       /**
+        * Given an email validity status (true, false, null) update the label CSS class
+        */
+       function updateMailValidityLabel( mail ) {
+               var isValid = mw.util.validateEmail( mail ),
+                       $label = $( '#mw-emailaddress-validity' );
+
+               // Set up the validity notice if it doesn't already exist
+               if ( $label.length === 0 ) {
+                       $label = $( '<label for="wpNewEmail" id="mw-emailaddress-validity"></label>' )
+                               .insertAfter( '#wpNewEmail' );
+               }
+
+               // We allow empty address
+               if ( isValid === null ) {
+                       $label.text( '' ).removeClass( 'valid invalid' );
+
+               // Valid
+               } else if ( isValid ) {
+                       $label.text( mw.msg( 'email-address-validity-valid' ) ).addClass( 'valid' ).removeClass( 'invalid' );
+
+               // Not valid
+               } else {
+                       $label.text( mw.msg( 'email-address-validity-invalid' ) ).addClass( 'invalid' ).removeClass( 'valid' );
+               }
+       }
+
+       $( function () {
+               $( '#wpNewEmail' )
+                       // Lame tip to let user know if its email is valid. See bug 22449.
+                       // Only bind once for 'blur' so that the user can fill it in without errors;
+                       // after that, look at every keypress for immediate feedback.
+                       .one( 'blur', function () {
+                               var $this = $( this );
+                               updateMailValidityLabel( $this.val() );
+                               $this.keyup( function () {
+                                       updateMailValidityLabel( $this.val() );
+                               } );
+                       } )
+                       // Supress built-in validation notice and just call updateMailValidityLabel(),
+                       // to avoid double notice. See bug 40909.
+                       .on( 'invalid', function ( e ) {
+                               e.preventDefault();
+                               updateMailValidityLabel( $( this ).val() );
+                       } );
+       } );
+}( mediaWiki, jQuery ) );
diff --git a/resources/src/mediawiki.special/mediawiki.special.changeslist.css b/resources/src/mediawiki.special/mediawiki.special.changeslist.css
new file mode 100644 (file)
index 0000000..5e4af7b
--- /dev/null
@@ -0,0 +1,7 @@
+/**
+ * Styling for Special:Watchlist and Special:RecentChanges
+ */
+
+.mw-changeslist-line-watched .mw-title {
+       font-weight: bold;
+}
diff --git a/resources/src/mediawiki.special/mediawiki.special.changeslist.enhanced.css b/resources/src/mediawiki.special/mediawiki.special.changeslist.enhanced.css
new file mode 100644 (file)
index 0000000..bed580d
--- /dev/null
@@ -0,0 +1,66 @@
+/**
+ * Styling for Special:Watchlist and Special:RecentChanges when preference 'usenewrc'
+ * a.k.a. Enhanced Recent Changes is enabled.
+ */
+
+table.mw-enhanced-rc {
+       border: 0;
+       border-spacing: 0;
+}
+
+table.mw-enhanced-rc th,
+table.mw-enhanced-rc td {
+       padding: 0;
+       vertical-align: top;
+}
+
+td.mw-enhanced-rc {
+       white-space: nowrap;
+       font-family: monospace;
+}
+
+.mw-enhanced-rc-time {
+       font-family: monospace;
+}
+
+table.mw-enhanced-rc td.mw-enhanced-rc-nested {
+       padding-left: 1em;
+}
+
+/* Show/hide arrows in enhanced changeslist */
+.mw-enhanced-rc .collapsible-expander {
+       float: none;
+}
+
+/* If JS is disabled, the arrows or the placeholder space shouldn't be shown */
+.client-nojs .mw-enhancedchanges-arrow-space {
+       display: none;
+}
+
+/*
+ * And if it's enabled, let's optimize the collapsing a little: hide the rows
+ * that would be hidden by jquery.makeCollapsible with CSS to save us some
+ * reflows and repaints. This doesn't work on browsers that don't fully support
+ * CSS2 (IE6), but it's okay, this will be done in JavaScript with old degraded
+ * performance instead.
+ */
+.client-js table.mw-enhanced-rc.mw-collapsed tr + tr {
+       display: none;
+}
+
+.mw-enhancedchanges-arrow-space {
+       display: inline-block;
+       *display: inline; /* IE7 and below */
+       zoom: 1;
+       width: 15px;
+       height: 15px;
+}
+
+/* let it look like it is clickable */
+.mw-enhancedchanges-arrow.mw-collapsible-toggle {
+       cursor: pointer;
+}
+
+.mw-enhanced-watched .mw-enhanced-rc-time {
+       font-weight: bold;
+}
diff --git a/resources/src/mediawiki.special/mediawiki.special.changeslist.legend.css b/resources/src/mediawiki.special/mediawiki.special.changeslist.legend.css
new file mode 100644 (file)
index 0000000..54d09b4
--- /dev/null
@@ -0,0 +1,29 @@
+/**
+ * Styling for changes list legend
+ */
+
+.mw-changeslist-legend {
+       float: right;
+       margin-left: 1em;
+       margin-bottom: 0.5em;
+       clear: right;
+       font-size: 85%;
+       line-height: 1.2em;
+       padding: 0.5em;
+       border: 1px solid #ddd;
+}
+
+.mw-changeslist-legend dl {
+       /* Parent element defines sufficient padding */
+       margin-bottom: 0;
+}
+
+.mw-changeslist-legend dt {
+       float: left;
+       margin-right: 0.5em;
+}
+
+.mw-changeslist-legend dd {
+       margin-left: 1.5em;
+       line-height: 1.3em;
+}
diff --git a/resources/src/mediawiki.special/mediawiki.special.changeslist.legend.js b/resources/src/mediawiki.special/mediawiki.special.changeslist.legend.js
new file mode 100644 (file)
index 0000000..0259155
--- /dev/null
@@ -0,0 +1,25 @@
+/**
+ * Script for changes list legend
+ */
+
+/* Remember the collapse state of the legend on recent changes and watchlist pages. */
+jQuery( document ).ready( function ( $ ) {
+       var
+               cookieName = 'changeslist-state',
+               cookieOptions = {
+                       expires: 30,
+                       path: '/'
+               },
+               isCollapsed = $.cookie( cookieName ) === 'collapsed';
+
+       $( '.mw-changeslist-legend' )
+               .makeCollapsible( {
+                       collapsed: isCollapsed
+               } )
+               .on( 'beforeExpand.mw-collapsible', function () {
+                       $.cookie( cookieName, 'expanded', cookieOptions );
+               } )
+               .on( 'beforeCollapse.mw-collapsible', function () {
+                       $.cookie( cookieName, 'collapsed', cookieOptions );
+               } );
+} );
diff --git a/resources/src/mediawiki.special/mediawiki.special.css b/resources/src/mediawiki.special/mediawiki.special.css
new file mode 100644 (file)
index 0000000..50349c3
--- /dev/null
@@ -0,0 +1,283 @@
+
+/**** Special:AllMessages ****/
+#mw-allmessagestable .allmessages-customised td.am_default {
+       background-color: #fcffc4;
+}
+
+#mw-allmessagestable tr.allmessages-customised:hover td.am_default {
+       background-color: #faff90;
+}
+
+#mw-allmessagestable td.am_actual {
+       background-color: #e2ffe2;
+}
+
+#mw-allmessagestable tr.allmessages-customised:hover + tr.allmessages-customised td.am_actual {
+       background-color: #b1ffb1;
+}
+
+/**** Special:Allpages ****/
+table.mw-allpages-table-form, table.mw-allpages-table-chunk {
+       width: 100%;
+}
+td.mw-allpages-alphaindexline {
+       text-align: right;
+}
+.mw-allpages-nav {
+       text-align: right;
+       margin-bottom: 1em;
+}
+table.mw-allpages-table-form tr {
+       vertical-align: top;
+}
+
+/**** Special:Block ****/
+tr.mw-block-hideuser {
+       font-weight: bold;
+}
+
+/**** Special:BlockList ****/
+table.mw-blocklist span.mw-usertoollinks,
+span.mw-blocklist-actions {
+       white-space: nowrap;
+       font-size: 90%;
+}
+
+/**** Special:Contributions ****/
+.mw-uctop {
+       font-weight: bold;
+}
+
+/**** Special:EmailUser ****/
+td#mw-emailuser-sender,
+td#mw-emailuser-recipient {
+       font-weight: bold;
+}
+
+/**** Special:ListGroupRights ****/
+table.mw-listgrouprights-table tr {
+       vertical-align: top;
+}
+.listgrouprights-revoked {
+       text-decoration: line-through;
+}
+
+/**** Special:Prefixindex ****/
+table.mw-prefixindex-list-table,
+table#mw-prefixindex-nav-table {
+       width: 100%;
+}
+td#mw-prefixindex-nav-form {
+       margin-bottom: 1em;
+       vertical-align: top;
+}
+.mw-prefixindex-nav {
+       text-align: right;
+}
+
+
+/**** Special:Search ****/
+.searchresults {
+}
+
+.searchresults p {
+       margin-left: 0.4em;
+       margin-top: 1em;
+       margin-bottom: 1.2em;
+}
+div.searchresult {
+       font-size: 95%;
+       width: 38em;
+}
+.mw-search-results {
+       margin-left: 0.4em;
+}
+.mw-search-results li {
+       padding-bottom: 1.2em;
+       list-style: none;
+       list-style-image: none;
+}
+.mw-search-results li a {
+       font-size: 108%;
+}
+.mw-search-result-data {
+       color: green;
+       font-size: 97%;
+}
+.mw-search-formheader {
+       background-color: #f3f3f3;
+       margin-top: 1em;
+       border: 1px solid silver;
+}
+.mw-search-formheader div.search-types {
+       float: left;
+       padding-left: 0.25em;
+}
+.mw-search-formheader div.search-types ul {
+       margin: 0 !important;
+       padding: 0 !important;
+       list-style: none !important;
+}
+.mw-search-formheader div.search-types ul li {
+       float: left;
+       margin: 0;
+       padding: 0;
+}
+.mw-search-formheader div.search-types ul li a {
+       display: block;
+       padding: 0.5em;
+}
+.mw-search-formheader div.search-types ul li.current a {
+       color: #333333;
+       cursor: default;
+}
+.mw-search-formheader div.search-types ul li.current a:hover {
+       text-decoration: none;
+}
+.mw-search-formheader div.results-info {
+       float: right;
+       padding: 0.5em;
+       padding-right: 0.75em;
+}
+.mw-search-formheader div.results-info ul {
+       margin: 0 !important;
+       padding: 0 !important;
+       list-style: none !important;
+}
+.mw-search-formheader div.results-info ul li {
+       float: right;
+       margin: 0;
+       padding: 0;
+}
+fieldset#mw-searchoptions {
+       margin: 0;
+       padding: 0.5em 0.75em 0.75em 0.75em !important;
+       border: none;
+       background-color: #f9f9f9;
+       border: 1px solid silver !important;
+       border-top-width: 0 !important;
+}
+fieldset#mw-searchoptions legend {
+       display: none;
+}
+fieldset#mw-searchoptions h4 {
+       padding: 0;
+       margin: 0;
+       float: left;
+}
+fieldset#mw-searchoptions div#mw-search-togglebox {
+       float: right;
+}
+fieldset#mw-searchoptions div#mw-search-togglebox label {
+       margin-right: 0.25em;
+}
+fieldset#mw-searchoptions div#mw-search-togglebox input {
+       margin-left: 0.25em;
+}
+fieldset#mw-searchoptions table {
+       float: left;
+       margin-right: 3em;
+}
+fieldset#mw-searchoptions table td {
+       padding-right: 1em;
+}
+fieldset#mw-searchoptions div.divider {
+       clear: both;
+       border-bottom: 1px solid #DDDDDD;
+       padding-top: 0.5em;
+       margin-bottom: 0.5em;
+}
+td#mw-search-menu {
+       padding-left:6em;
+       font-size:85%;
+}
+div#mw-search-interwiki {
+       float: right;
+       width: 18em;
+       border: 1px solid #AAAAAA;
+       margin-top: 2ex;
+}
+div#mw-search-interwiki li {
+       font-size: 95%;
+}
+.mw-search-interwiki-more {
+       float: right;
+       font-size: 90%;
+}
+div#mw-search-interwiki-caption {
+       text-align: center;
+       font-weight: bold;
+       font-size: 95%;
+}
+.mw-search-interwiki-project {
+       font-size: 97%;
+       text-align: left;
+       padding: 0.15em 0.15em 0.2em 0.2em;
+       background-color: #ececec;
+       border-top: 1px solid #BBBBBB;
+}
+span.searchalttitle {
+       font-size: 95%;
+}
+div.searchdidyoumean {
+       font-size: 127%;
+       margin-top: 0.8em;
+       /* Note that this color won't affect the link, as desired. */
+       color: #c00;
+}
+div.searchdidyoumean em {
+       font-weight: bold;
+}
+.searchmatch {
+       font-weight: bold;
+}
+/* Advanced PowerSearch box */
+td#mw-search-togglebox {
+       text-align: right;
+}
+table#mw-search-powertable {
+       width: 100%;
+}
+form#powersearch {
+       clear: both;
+}
+
+/**** Special:Specialpages ****/
+.mw-specialpagerestricted {
+       font-weight: bold;
+}
+
+.mw-specialpages-table {
+       margin-top: -1em;
+       margin-bottom: 1em;
+}
+
+.mw-specialpages-table td {
+       vertical-align: top;
+}
+
+/**** Special:Statistics ****/
+td.mw-statistics-numbers {
+       text-align: right;
+}
+
+/**** Special:ProtectedPages ****/
+table.mw-protectedpages span.mw-usertoollinks,
+span.mw-protectedpages-length,
+span.mw-protectedpages-actions {
+       white-space: nowrap;
+       font-size: 90%;
+}
+span.mw-protectedpages-unknown {
+       color: grey;
+       font-size: 90%;
+}
+
+/**** Special:UserRights ****/
+.mw-userrights-disabled {
+       color: #888;
+}
+table.mw-userrights-groups * td,
+table.mw-userrights-groups * th {
+       padding-right: 1.5em;
+}
diff --git a/resources/src/mediawiki.special/mediawiki.special.javaScriptTest.js b/resources/src/mediawiki.special/mediawiki.special.javaScriptTest.js
new file mode 100644 (file)
index 0000000..38f256c
--- /dev/null
@@ -0,0 +1,36 @@
+/**
+ * JavaScript for Special:JavaScriptTest
+ */
+( function ( mw, $ ) {
+       $( function () {
+
+               // Create useskin dropdown menu and reload onchange to the selected skin
+               // (only if a framework was found, not on error pages).
+               $( '#mw-javascripttest-summary.mw-javascripttest-frameworkfound' ).append( function () {
+
+                       var $html = $( '<p><label for="useskin">'
+                                       + mw.message( 'javascripttest-pagetext-skins' ).escaped()
+                                       + ' '
+                                       + '</label></p>' ),
+                               select = '<select name="useskin" id="useskin">';
+
+                       // Build <select> further
+                       $.each( mw.config.get( 'wgAvailableSkins' ), function ( id ) {
+                               select += '<option value="' + id + '"'
+                                       + ( mw.config.get( 'skin' ) === id ? ' selected="selected"' : '' )
+                                       + '>' + mw.message( 'skinname-' + id ).escaped() + '</option>';
+                       } );
+                       select += '</select>';
+
+                       // Bind onchange event handler and append to form
+                       $html.append(
+                               $( select ).change( function () {
+                                       window.location = QUnit.url( { useskin: $( this ).val() } );
+                               } )
+                       );
+
+                       return $html;
+               } );
+       } );
+
+}( mediaWiki, jQuery ) );
diff --git a/resources/src/mediawiki.special/mediawiki.special.js b/resources/src/mediawiki.special/mediawiki.special.js
new file mode 100644 (file)
index 0000000..8edb1cb
--- /dev/null
@@ -0,0 +1,5 @@
+/*
+ * Namespace for mediawiki.special.* modules
+ */
+
+mediaWiki.special = {};
diff --git a/resources/src/mediawiki.special/mediawiki.special.movePage.js b/resources/src/mediawiki.special/mediawiki.special.movePage.js
new file mode 100644 (file)
index 0000000..922eba5
--- /dev/null
@@ -0,0 +1,6 @@
+/**
+ * JavaScript for Special:MovePage
+ */
+jQuery( function ( $ ) {
+       $( '#wpReason, #wpNewTitleMain' ).byteLimit();
+} );
diff --git a/resources/src/mediawiki.special/mediawiki.special.pagesWithProp.css b/resources/src/mediawiki.special/mediawiki.special.pagesWithProp.css
new file mode 100644 (file)
index 0000000..7ef75d0
--- /dev/null
@@ -0,0 +1,4 @@
+/* Distinguish actual data from information about it being hidden visually */
+.prop-value-hidden {
+       font-style: italic;
+}
diff --git a/resources/src/mediawiki.special/mediawiki.special.preferences.css b/resources/src/mediawiki.special/mediawiki.special.preferences.css
new file mode 100644 (file)
index 0000000..75ae5ca
--- /dev/null
@@ -0,0 +1,21 @@
+/** Reuses colors from mediawiki.special.changeemail.css */
+.mw-email-not-authenticated .mw-input,
+.mw-email-none .mw-input{
+       border: 1px solid #FF8080;
+       background-color: #FFC0C0;
+       color: black;
+}
+/** Authenticated email field has its own class too. Unstyled by default */
+/*
+.mw-email-authenticated .mw-input { }
+*/
+
+/**
+ * Hide, but keep accessible for screen-readers.
+ * Like .mw-jump, #jump-to-nav from skins/common/shared.css
+ */
+.mw-navigation-hint {
+       overflow: hidden;
+       height: 0;
+       zoom: 1;
+}
diff --git a/resources/src/mediawiki.special/mediawiki.special.preferences.js b/resources/src/mediawiki.special/mediawiki.special.preferences.js
new file mode 100644 (file)
index 0000000..2cd27af
--- /dev/null
@@ -0,0 +1,267 @@
+/**
+ * JavaScript for Special:Preferences
+ */
+jQuery( function ( $ ) {
+       var $preftoc, $preferences, $fieldsets, $legends,
+               hash, labelFunc,
+               $tzSelect, $tzTextbox, $localtimeHolder, servertime,
+               $checkBoxes;
+
+       labelFunc = function () {
+               return this.id.replace( /^mw-prefsection/g, 'preftab' );
+       };
+
+       $( '#prefsubmit' ).attr( 'id', 'prefcontrol' );
+       $preftoc = $( '<ul id="preftoc"></ul>' )
+               .attr( 'role', 'tablist' );
+       $preferences = $( '#preferences' )
+               .addClass( 'jsprefs' )
+               .before( $preftoc );
+       $fieldsets = $preferences.children( 'fieldset' )
+               .hide()
+               .attr( {
+                       role: 'tabpanel',
+                       'aria-hidden': 'true',
+                       'aria-labelledby': labelFunc
+               } )
+               .addClass( 'prefsection' );
+       $legends = $fieldsets
+               .children( 'legend' )
+               .addClass( 'mainLegend' );
+
+       // Make sure the accessibility tip is selectable so that screen reader users take notice,
+       // but hide it per default to reduce interface clutter. Also make sure it becomes visible
+       // when selected. Similar to jquery.mw-jump
+       $( '<div>' ).addClass( 'mw-navigation-hint' )
+               .text( mediaWiki.msg( 'prefs-tabs-navigation-hint' ) )
+               .attr( 'tabIndex', 0 )
+               .on( 'focus blur', function ( e ) {
+                       if ( e.type === 'blur' || e.type === 'focusout' ) {
+                               $( this ).css( 'height', '0' );
+                       } else {
+                               $( this ).css( 'height', 'auto' );
+                       }
+       } ).insertBefore( $preftoc );
+
+       /**
+        * It uses document.getElementById for security reasons (HTML injections in $()).
+        *
+        * @param String name: the name of a tab without the prefix ("mw-prefsection-")
+        * @param String mode: [optional] A hash will be set according to the current
+        * open section. Set mode 'noHash' to surpress this.
+        */
+       function switchPrefTab( name, mode ) {
+               var $tab, scrollTop;
+               // Handle hash manually to prevent jumping,
+               // therefore save and restore scrollTop to prevent jumping.
+               scrollTop = $( window ).scrollTop();
+               if ( mode !== 'noHash' ) {
+                       window.location.hash = '#mw-prefsection-' + name;
+               }
+               $( window ).scrollTop( scrollTop );
+
+               $preftoc.find( 'li' ).removeClass( 'selected' )
+                       .find( 'a' ).attr( {
+                               tabIndex: -1,
+                               'aria-selected': 'false'
+                       } );
+
+               $tab = $( document.getElementById( 'preftab-' + name ) );
+               if ( $tab.length ) {
+                       $tab.attr( {
+                               tabIndex: 0,
+                               'aria-selected': 'true'
+                       } )
+                       .focus()
+                               .parent().addClass( 'selected' );
+
+                       $preferences.children( 'fieldset' ).hide().attr( 'aria-hidden', 'true' );
+                       $( document.getElementById( 'mw-prefsection-' + name ) ).show().attr( 'aria-hidden', 'false' );
+               }
+       }
+
+       // Populate the prefToc
+       $legends.each( function ( i, legend ) {
+               var $legend = $( legend ),
+                       ident, $li, $a;
+               if ( i === 0 ) {
+                       $legend.parent().show();
+               }
+               ident = $legend.parent().attr( 'id' );
+
+               $li = $( '<li>' )
+                       .attr( 'role', 'presentation' )
+                       .addClass( i === 0 ? 'selected' : '' );
+               $a = $( '<a>' )
+                       .attr( {
+                               id: ident.replace( 'mw-prefsection', 'preftab' ),
+                               href: '#' + ident,
+                               role: 'tab',
+                               tabIndex: i === 0 ? 0 : -1,
+                               'aria-selected': i === 0 ? 'true' : 'false',
+                               'aria-controls': ident
+                       } )
+                       .text( $legend.text() );
+               $li.append( $a );
+               $preftoc.append( $li );
+       } );
+
+       // Enable keyboard users to use left and right keys to switch tabs
+       $preftoc.on( 'keydown', function ( event ) {
+               var keyLeft = 37,
+                       keyRight = 39,
+                       $el;
+
+               if ( event.keyCode === keyLeft ) {
+                       $el = $( '#preftoc li.selected' ).prev().find( 'a' );
+               } else if ( event.keyCode === keyRight ) {
+                       $el = $( '#preftoc li.selected' ).next().find( 'a' );
+               } else {
+                       return;
+               }
+               if ( $el.length > 0 ) {
+                       switchPrefTab( $el.attr( 'href' ).replace( '#mw-prefsection-', '' ) );
+               }
+       } );
+
+       // If we've reloaded the page or followed an open-in-new-window,
+       // make the selected tab visible.
+       hash = window.location.hash;
+       if ( hash.match( /^#mw-prefsection-[\w\-]+/ ) ) {
+               switchPrefTab( hash.replace( '#mw-prefsection-', '' ) );
+       }
+
+       // In browsers that support the onhashchange event we will not bind click
+       // handlers and instead let the browser do the default behavior (clicking the
+       // <a href="#.."> will naturally set the hash, handled by onhashchange.
+       // But other things that change the hash will also be catched (e.g. using
+       // the Back and Forward browser navigation).
+       // Note the special check for IE "compatibility" mode.
+       if ( 'onhashchange' in window &&
+               ( document.documentMode === undefined || document.documentMode >= 8 )
+       ) {
+               $( window ).on( 'hashchange', function () {
+                       var hash = window.location.hash;
+                       if ( hash.match( /^#mw-prefsection-[\w\-]+/ ) ) {
+                               switchPrefTab( hash.replace( '#mw-prefsection-', '' ) );
+                       } else if ( hash === '' ) {
+                               switchPrefTab( 'personal', 'noHash' );
+                       }
+               } );
+       // In older browsers we'll bind a click handler as fallback.
+       // We must not have onhashchange *and* the click handlers, other wise
+       // the click handler calls switchPrefTab() which sets the hash value,
+       // which triggers onhashcange and calls switchPrefTab() again.
+       } else {
+               $preftoc.on( 'click', 'li a', function ( e ) {
+                       switchPrefTab( $( this ).attr( 'href' ).replace( '#mw-prefsection-', '' ) );
+                       e.preventDefault();
+               } );
+       }
+
+       /**
+       * Timezone functions.
+       * Guesses Timezone from browser and updates fields onchange
+       */
+
+       $tzSelect = $( '#mw-input-wptimecorrection' );
+       $tzTextbox = $( '#mw-input-wptimecorrection-other' );
+       $localtimeHolder = $( '#wpLocalTime' );
+       servertime = parseInt( $( 'input[name="wpServerTime"]' ).val(), 10 );
+
+       function minutesToHours( min ) {
+               var tzHour = Math.floor( Math.abs( min ) / 60 ),
+                       tzMin = Math.abs( min ) % 60,
+                       tzString = ( ( min >= 0 ) ? '' : '-' ) + ( ( tzHour < 10 ) ? '0' : '' ) + tzHour +
+                               ':' + ( ( tzMin < 10 ) ? '0' : '' ) + tzMin;
+               return tzString;
+       }
+
+       function hoursToMinutes( hour ) {
+               var minutes,
+                       arr = hour.split( ':' );
+
+               arr[0] = parseInt( arr[0], 10 );
+
+               if ( arr.length === 1 ) {
+                       // Specification is of the form [-]XX
+                       minutes = arr[0] * 60;
+               } else {
+                       // Specification is of the form [-]XX:XX
+                       minutes = Math.abs( arr[0] ) * 60 + parseInt( arr[1], 10 );
+                       if ( arr[0] < 0 ) {
+                               minutes *= -1;
+                       }
+               }
+               // Gracefully handle non-numbers.
+               if ( isNaN( minutes ) ) {
+                       return 0;
+               } else {
+                       return minutes;
+               }
+       }
+
+       function updateTimezoneSelection () {
+               var minuteDiff, localTime,
+                       type = $tzSelect.val();
+
+               if ( type === 'guess' ) {
+                       // Get browser timezone & fill it in
+                       minuteDiff = -( new Date().getTimezoneOffset() );
+                       $tzTextbox.val( minutesToHours( minuteDiff ) );
+                       $tzSelect.val( 'other' );
+                       $tzTextbox.prop( 'disabled', false );
+               } else if ( type === 'other' ) {
+                       // Grab data from the textbox, parse it.
+                       minuteDiff = hoursToMinutes( $tzTextbox.val() );
+               } else {
+                       // Grab data from the $tzSelect value
+                       minuteDiff = parseInt( type.split( '|' )[1], 10 ) || 0;
+                       $tzTextbox.val( minutesToHours( minuteDiff ) );
+               }
+
+               // Determine local time from server time and minutes difference, for display.
+               localTime = servertime + minuteDiff;
+
+               // Bring time within the [0,1440) range.
+               while ( localTime < 0 ) {
+                       localTime += 1440;
+               }
+               while ( localTime >= 1440 ) {
+                       localTime -= 1440;
+               }
+               $localtimeHolder.text( mediaWiki.language.convertNumber( minutesToHours( localTime ) ) );
+       }
+
+       if ( $tzSelect.length && $tzTextbox.length ) {
+               $tzSelect.change( updateTimezoneSelection );
+               $tzTextbox.blur( updateTimezoneSelection );
+               updateTimezoneSelection();
+       }
+
+       // Preserve the tab after saving the preferences
+       // Not using cookies, because their deletion results are inconsistent.
+       // Not using jStorage due to its enormous size (for this feature)
+       if ( window.sessionStorage ) {
+               if ( sessionStorage.getItem( 'mediawikiPreferencesTab' ) !== null ) {
+                       switchPrefTab( sessionStorage.getItem( 'mediawikiPreferencesTab' ), 'noHash' );
+               }
+               // Deleting the key, the tab states should be reset until we press Save
+               sessionStorage.removeItem( 'mediawikiPreferencesTab' );
+
+               $( '#mw-prefs-form' ).submit( function () {
+                       var storageData = $( $preftoc ).find( 'li.selected a' ).attr( 'id' ).replace( 'preftab-', '' );
+                       sessionStorage.setItem( 'mediawikiPreferencesTab', storageData );
+               } );
+       }
+
+       // To disable all 'namespace' checkboxes in Search preferences
+       // when 'Search in all namespaces' checkbox is ticked.
+       $checkBoxes = $( '#mw-htmlform-advancedsearchoptions input[id^=mw-input-wpsearchnamespaces]' );
+       if ( $( '#mw-input-wpsearcheverything' ).prop( 'checked' ) ) {
+               $checkBoxes.prop( 'disabled', true );
+       }
+       $( '#mw-input-wpsearcheverything' ).change( function () {
+               $checkBoxes.prop( 'disabled', $( this ).prop( 'checked' ) );
+       } );
+} );
diff --git a/resources/src/mediawiki.special/mediawiki.special.recentchanges.js b/resources/src/mediawiki.special/mediawiki.special.recentchanges.js
new file mode 100644 (file)
index 0000000..79d793a
--- /dev/null
@@ -0,0 +1,34 @@
+/**
+ * JavaScript for Special:RecentChanges
+ */
+( function ( mw, $ ) {
+       var rc, $checkboxes, $select;
+
+       rc = {
+               /**
+                * Handler to disable/enable the namespace selector checkboxes when the
+                * special 'all' namespace is selected/unselected respectively.
+                */
+               updateCheckboxes: function () {
+                       // The option element for the 'all' namespace has an empty value
+                       var isAllNS = $select.val() === '';
+
+                       // Iterates over checkboxes and propagate the selected option
+                       $checkboxes.prop( 'disabled', isAllNS );
+               },
+
+               init: function () {
+                       $select = $( '#namespace' );
+                       $checkboxes = $( '#nsassociated, #nsinvert' );
+
+                       // Bind to change event, and trigger once to set the initial state of the checkboxes.
+                       rc.updateCheckboxes();
+                       $select.change( rc.updateCheckboxes );
+               }
+       };
+
+       $( rc.init );
+
+       mw.special.recentchanges = rc;
+
+}( mediaWiki, jQuery ) );
diff --git a/resources/src/mediawiki.special/mediawiki.special.search.css b/resources/src/mediawiki.special/mediawiki.special.search.css
new file mode 100644 (file)
index 0000000..914e47e
--- /dev/null
@@ -0,0 +1,14 @@
+/**
+ * Fixes sister projects box moving down the extract
+ * of the first result (bug #16886).
+ * It only happens when the window is small and
+ * This changes slightly the layout for big screens
+ * where there was space for the extracts and the
+ * sister projects and thus it showed like in any
+ * other browser.
+ *
+ * This will only affect IE 7 and lower
+ */
+.searchresult {
+       display: inline !ie;
+}
diff --git a/resources/src/mediawiki.special/mediawiki.special.search.js b/resources/src/mediawiki.special/mediawiki.special.search.js
new file mode 100644 (file)
index 0000000..b847f7d
--- /dev/null
@@ -0,0 +1,53 @@
+/**
+ * JavaScript for Special:Search
+ */
+( function ( mw, $ ) {
+       $( function () {
+               var $checkboxes, $headerLinks;
+
+               // Emulate HTML5 autofocus behavior in non HTML5 compliant browsers
+               if ( !( 'autofocus' in document.createElement( 'input' ) ) ) {
+                       $( 'input[autofocus]' ).eq( 0 ).focus();
+               }
+
+               // Create check all/none button
+               $checkboxes = $( '#powersearch input[id^=mw-search-ns]' );
+               $( '#mw-search-togglebox' ).append(
+                       $( '<label>' )
+                               .text( mw.msg( 'powersearch-togglelabel' ) )
+               ).append(
+                       $( '<input type="button" />' )
+                               .attr( 'id', 'mw-search-toggleall' )
+                               .prop( 'value', mw.msg( 'powersearch-toggleall' ) )
+                               .click( function () {
+                                       $checkboxes.prop( 'checked', true );
+                               } )
+               ).append(
+                       $( '<input type="button" />' )
+                               .attr( 'id', 'mw-search-togglenone' )
+                               .prop( 'value', mw.msg( 'powersearch-togglenone' ) )
+                               .click( function () {
+                                       $checkboxes.prop( 'checked', false );
+                               } )
+               );
+
+               // Change the header search links to what user entered
+               $headerLinks = $( '.search-types a' );
+               $( '#searchText, #powerSearchText' ).change( function () {
+                       var searchterm = $( this ).val();
+                       $headerLinks.each( function () {
+                               var parts = $( this ).attr( 'href' ).split( 'search=' ),
+                                       lastpart = '',
+                                       prefix = 'search=';
+                               if ( parts.length > 1 && parts[1].indexOf( '&' ) >= 0 ) {
+                                       lastpart = parts[1].substring( parts[1].indexOf( '&' ) );
+                               } else {
+                                       prefix = '&search=';
+                               }
+                               this.href = parts[0] + prefix + encodeURIComponent( searchterm ) + lastpart;
+                       } );
+               } ).trigger( 'change' );
+
+       } );
+
+}( mediaWiki, jQuery ) );
diff --git a/resources/src/mediawiki.special/mediawiki.special.undelete.js b/resources/src/mediawiki.special/mediawiki.special.undelete.js
new file mode 100644 (file)
index 0000000..0dea3ef
--- /dev/null
@@ -0,0 +1,11 @@
+/**
+ * JavaScript for Special:Undelete
+ */
+jQuery( function ( $ ) {
+       $( '#mw-undelete-invert' ).click( function ( e ) {
+               $( '#undelete input[type="checkbox"]' ).prop( 'checked', function ( i, val ) {
+                       return !val;
+               } );
+               e.preventDefault();
+       } );
+} );
diff --git a/resources/src/mediawiki.special/mediawiki.special.upload.js b/resources/src/mediawiki.special/mediawiki.special.upload.js
new file mode 100644 (file)
index 0000000..8a5ff59
--- /dev/null
@@ -0,0 +1,319 @@
+/**
+ * JavaScript for Special:Upload
+ * Note that additional code still lives in skins/common/upload.js
+ */
+( function ( mw, $ ) {
+       /**
+        * Add a preview to the upload form
+        */
+       $( function () {
+               /**
+                * Is the FileAPI available with sufficient functionality?
+                */
+               function hasFileAPI() {
+                       return window.FileReader !== undefined;
+               }
+
+               /**
+                * Check if this is a recognizable image type...
+                * Also excludes files over 10M to avoid going insane on memory usage.
+                *
+                * @todo is there a way we can ask the browser what's supported in <img>s?
+                * @todo put SVG back after working around Firefox 7 bug <https://bugzilla.wikimedia.org/show_bug.cgi?id=31643>
+                *
+                * @param {File} file
+                * @return boolean
+                */
+               function fileIsPreviewable( file ) {
+                       var known = ['image/png', 'image/gif', 'image/jpeg', 'image/svg+xml'],
+                               tooHuge = 10 * 1024 * 1024;
+                       return ( $.inArray( file.type, known ) !== -1 ) && file.size > 0 && file.size < tooHuge;
+               }
+
+               /**
+                * Show a thumbnail preview of PNG, JPEG, GIF, and SVG files prior to upload
+                * in browsers supporting HTML5 FileAPI.
+                *
+                * As of this writing, known good:
+                * - Firefox 3.6+
+                * - Chrome 7.something
+                *
+                * @todo check file size limits and warn of likely failures
+                *
+                * @param {File} file
+                */
+               function showPreview( file ) {
+                       var $canvas,
+                               ctx,
+                               meta,
+                               previewSize = 180,
+                               thumb = $( '<div id="mw-upload-thumbnail" class="thumb tright">' +
+                                                       '<div class="thumbinner">' +
+                                                               '<div class="mw-small-spinner" style="width: 180px; height: 180px"></div>' +
+                                                               '<div class="thumbcaption"><div class="filename"></div><div class="fileinfo"></div></div>' +
+                                                       '</div>' +
+                                               '</div>' );
+
+                       thumb.find( '.filename' ).text( file.name ).end()
+                               .find( '.fileinfo' ).text( prettySize( file.size ) ).end();
+
+                       $canvas = $( '<canvas width="' + previewSize + '" height="' + previewSize + '" ></canvas>' );
+                       ctx = $canvas[0].getContext( '2d' );
+                       $( '#mw-htmlform-source' ).parent().prepend( thumb );
+
+                       fetchPreview( file, function ( dataURL ) {
+                               var img = new Image(),
+                                       rotation = 0;
+
+                               if ( meta && meta.tiff && meta.tiff.Orientation ) {
+                                       rotation = ( 360 - ( function () {
+                                               // See includes/media/Bitmap.php
+                                               switch ( meta.tiff.Orientation.value ) {
+                                                       case 8:
+                                                               return 90;
+                                                       case 3:
+                                                               return 180;
+                                                       case 6:
+                                                               return 270;
+                                                       default:
+                                                               return 0;
+                                               }
+                                       }() ) ) % 360;
+                               }
+
+                               img.onload = function () {
+                                       var info, width, height, x, y, dx, dy, logicalWidth, logicalHeight;
+
+                                       // Fit the image within the previewSizexpreviewSize box
+                                       if ( img.width > img.height ) {
+                                               width = previewSize;
+                                               height = img.height / img.width * previewSize;
+                                       } else {
+                                               height = previewSize;
+                                               width = img.width / img.height * previewSize;
+                                       }
+                                       // Determine the offset required to center the image
+                                       dx = ( 180 - width ) / 2;
+                                       dy = ( 180 - height ) / 2;
+                                       switch ( rotation ) {
+                                               // If a rotation is applied, the direction of the axis
+                                               // changes as well. You can derive the values below by
+                                               // drawing on paper an axis system, rotate it and see
+                                               // where the positive axis direction is
+                                               case 0:
+                                                       x = dx;
+                                                       y = dy;
+                                                       logicalWidth = img.width;
+                                                       logicalHeight = img.height;
+                                                       break;
+                                               case 90:
+
+                                                       x = dx;
+                                                       y = dy - previewSize;
+                                                       logicalWidth = img.height;
+                                                       logicalHeight = img.width;
+                                                       break;
+                                               case 180:
+                                                       x = dx - previewSize;
+                                                       y = dy - previewSize;
+                                                       logicalWidth = img.width;
+                                                       logicalHeight = img.height;
+                                                       break;
+                                               case 270:
+                                                       x = dx - previewSize;
+                                                       y = dy;
+                                                       logicalWidth = img.height;
+                                                       logicalHeight = img.width;
+                                                       break;
+                                       }
+
+                                       ctx.clearRect( 0, 0, 180, 180 );
+                                       ctx.rotate( rotation / 180 * Math.PI );
+                                       ctx.drawImage( img, x, y, width, height );
+                                       thumb.find( '.mw-small-spinner' ).replaceWith( $canvas );
+
+                                       // Image size
+                                       info = mw.msg( 'widthheight', logicalWidth, logicalHeight ) +
+                                               ', ' + prettySize( file.size );
+
+                                       $( '#mw-upload-thumbnail .fileinfo' ).text( info );
+                               };
+                               img.src = dataURL;
+                       }, mw.config.get( 'wgFileCanRotate' ) ? function ( data ) {
+                               /*jshint camelcase:false, nomen:false */
+                               try {
+                                       meta = mw.libs.jpegmeta( data, file.fileName );
+                                       meta._binary_data = null;
+                               } catch ( e ) {
+                                       meta = null;
+                               }
+                       } : null );
+               }
+
+               /**
+                * Start loading a file into memory; when complete, pass it as a
+                * data URL to the callback function. If the callbackBinary is set it will
+                * first be read as binary and afterwards as data URL. Useful if you want
+                * to do preprocessing on the binary data first.
+                *
+                * @param {File} file
+                * @param {function} callback
+                * @param {function} callbackBinary
+                */
+               function fetchPreview( file, callback, callbackBinary ) {
+                       var reader = new FileReader();
+                       if ( callbackBinary && 'readAsBinaryString' in reader ) {
+                               // To fetch JPEG metadata we need a binary string; start there.
+                               // todo:
+                               reader.onload = function () {
+                                       callbackBinary( reader.result );
+
+                                       // Now run back through the regular code path.
+                                       fetchPreview( file, callback );
+                               };
+                               reader.readAsBinaryString( file );
+                       } else if ( callbackBinary && 'readAsArrayBuffer' in reader ) {
+                               // readAsArrayBuffer replaces readAsBinaryString
+                               // However, our JPEG metadata library wants a string.
+                               // So, this is going to be an ugly conversion.
+                               reader.onload = function () {
+                                       var i,
+                                               buffer = new Uint8Array( reader.result ),
+                                               string = '';
+                                       for ( i = 0; i < buffer.byteLength; i++ ) {
+                                               string += String.fromCharCode( buffer[i] );
+                                       }
+                                       callbackBinary( string );
+
+                                       // Now run back through the regular code path.
+                                       fetchPreview( file, callback );
+                               };
+                               reader.readAsArrayBuffer( file );
+                       } else if ( 'URL' in window && 'createObjectURL' in window.URL ) {
+                               // Supported in Firefox 4.0 and above <https://developer.mozilla.org/en/DOM/window.URL.createObjectURL>
+                               // WebKit has it in a namespace for now but that's ok. ;)
+                               //
+                               // Lifetime of this URL is until document close, which is fine
+                               // for Special:Upload -- if this code gets used on longer-running
+                               // pages, add a revokeObjectURL() when it's no longer needed.
+                               //
+                               // Prefer this over readAsDataURL for Firefox 7 due to bug reading
+                               // some SVG files from data URIs <https://bugzilla.mozilla.org/show_bug.cgi?id=694165>
+                               callback( window.URL.createObjectURL( file ) );
+                       } else {
+                               // This ends up decoding the file to base-64 and back again, which
+                               // feels horribly inefficient.
+                               reader.onload = function () {
+                                       callback( reader.result );
+                               };
+                               reader.readAsDataURL( file );
+                       }
+               }
+
+               /**
+                * Format a file size attractively.
+                * @todo match numeric formatting
+                *
+                * @param {number} s
+                * @return string
+                */
+               function prettySize( s ) {
+                       var sizeMsgs = ['size-bytes', 'size-kilobytes', 'size-megabytes', 'size-gigabytes'];
+                       while ( s >= 1024 && sizeMsgs.length > 1 ) {
+                               s /= 1024;
+                               sizeMsgs = sizeMsgs.slice( 1 );
+                       }
+                       return mw.msg( sizeMsgs[0], Math.round( s ) );
+               }
+
+               /**
+                * Clear the file upload preview area.
+                */
+               function clearPreview() {
+                       $( '#mw-upload-thumbnail' ).remove();
+               }
+
+               /**
+                * Check if the file does not exceed the maximum size
+                */
+               function checkMaxUploadSize( file ) {
+                       var maxSize, $error;
+
+                       function getMaxUploadSize( type ) {
+                               var sizes = mw.config.get( 'wgMaxUploadSize' );
+
+                               if ( sizes[type] !== undefined ) {
+                                       return sizes[type];
+                               }
+                               return sizes['*'];
+                       }
+
+                       $( '.mw-upload-source-error' ).remove();
+
+                       maxSize = getMaxUploadSize( 'file' );
+                       if ( file.size > maxSize ) {
+                               $error = $( '<p class="error mw-upload-source-error" id="wpSourceTypeFile-error">' +
+                                       mw.message( 'largefileserver', file.size, maxSize ).escaped() + '</p>' );
+
+                               $( '#wpUploadFile' ).after( $error );
+
+                               return false;
+                       }
+
+                       return true;
+               }
+
+               /**
+                * Initialization
+                */
+               if ( hasFileAPI() ) {
+                       // Update thumbnail when the file selection control is updated.
+                       $( '#wpUploadFile' ).change( function () {
+                               clearPreview();
+                               if ( this.files && this.files.length ) {
+                                       // Note: would need to be updated to handle multiple files.
+                                       var file = this.files[0];
+
+                                       if ( !checkMaxUploadSize( file ) ) {
+                                               return;
+                                       }
+
+                                       if ( fileIsPreviewable( file ) ) {
+                                               showPreview( file );
+                                       }
+                               }
+                       } );
+               }
+       } );
+
+       /**
+        * Disable all upload source fields except the selected one
+        */
+       $( function () {
+               var i, $row,
+                       $rows = $( '.mw-htmlform-field-UploadSourceField' );
+
+               function createHandler( $currentRow ) {
+                       /**
+                        * @param {jQuery.Event}
+                        */
+                       return function () {
+                               $( '.mw-upload-source-error' ).remove();
+                               if ( this.checked ) {
+                                       // Disable all inputs
+                                       $rows.find( 'input[name!="wpSourceType"]' ).prop( 'disabled', true );
+                                       // Re-enable the current one
+                                       $currentRow.find( 'input' ).prop( 'disabled', false );
+                               }
+                       };
+               }
+
+               for ( i = $rows.length; i; i-- ) {
+                       $row = $rows.eq( i - 1 );
+                       $row
+                               .find( 'input[name="wpSourceType"]' )
+                               .change( createHandler( $row ) );
+               }
+       } );
+
+}( mediaWiki, jQuery ) );
diff --git a/resources/src/mediawiki.special/mediawiki.special.userlogin.common.css b/resources/src/mediawiki.special/mediawiki.special.userlogin.common.css
new file mode 100644 (file)
index 0000000..d5fd2b8
--- /dev/null
@@ -0,0 +1,65 @@
+/* Styles for user login and signup forms */
+#mw-userlogin-help {
+       text-align: center;
+}
+
+.mw-ui-vform .mw-secure {
+       /* @embed */
+       background: url(images/icon-lock.png) no-repeat scroll left center transparent;
+       margin: 0 0 0 1px;
+       padding: 0 0 0 11px;
+}
+
+/*
+ * When inside the VForm style, disable the border that Vector and other skins
+ * put on the div surrounding the login/create account form.
+ * Also disable the margin and padding that Vector puts around the form.
+ */
+.mw-ui-container #userloginForm,
+.mw-ui-container #userlogin {
+       border: 0;
+       margin: 0;
+       padding: 0;
+}
+
+/* Reposition and resize language links, which appear on a per-wiki basis */
+.mw-ui-container #languagelinks {
+       margin-bottom: 2em;
+       font-size: 0.8em;
+}
+
+/* Put some space under template's header, which may contain CAPTCHA HTML.*/
+section.mw-form-header {
+       margin-bottom: 10px;
+}
+
+/**** shuffled CAPTCHA ****/
+#wpCaptchaWord {
+       margin-top: 6px;
+}
+
+.mw-createacct-captcha-container {
+       background-color: #f8f8f8;
+       border: 1px solid #c9c9c9;
+       padding: 10px;
+       text-align: center;
+}
+
+.mw-createacct-captcha-assisted {
+       display: block;
+       margin-top: 0.5em;
+}
+
+/* Put a border around the fancycaptcha-image-container. */
+.mw-createacct-captcha-and-reload {
+       border: 1px solid #c9c9c9;
+       /* Other display formats end up too wide */
+       display: table-cell;
+       width: 270px;
+       background-color: #FFF;
+}
+
+/* Make the fancycaptcha-image-container full-width within its parent. */
+.fancycaptcha-image-container {
+       width: 100%;
+}
diff --git a/resources/src/mediawiki.special/mediawiki.special.userlogin.common.js b/resources/src/mediawiki.special/mediawiki.special.userlogin.common.js
new file mode 100644 (file)
index 0000000..a899ae7
--- /dev/null
@@ -0,0 +1,72 @@
+/**
+ * JavaScript for login and signup forms.
+ */
+( function ( mw, $ ) {
+       // Move the FancyCaptcha image into a more attractive container.
+       // The CAPTCHA is in a <div class="captcha"> at the top of the form. If it's a FancyCaptcha,
+       // then we remove it and insert it lower down, in a customized div with just what we need (e.g.
+       // no 'fancycaptcha-createaccount' message).
+       function adjustFancyCaptcha( $content, buttonSubmit ) {
+               var $submit = $content.find( buttonSubmit ),
+                       tabIndex,
+                       $captchaStuff,
+                       $captchaImageContainer,
+                       // JavaScript can't yet parse the message 'createacct-imgcaptcha-help' when it
+                       // contains a MediaWiki transclusion, so PHP parses it and sends the HTML.
+                       // This is only set for the signup form (and undefined for login).
+                       helpMsg = mw.config.get( 'wgCreateacctImgcaptchaHelp' ),
+                       helpHtml = '';
+
+               if ( !$submit.length ) {
+                       return;
+               }
+               tabIndex = $submit.prop( 'tabindex' ) - 1;
+               $captchaStuff = $content.find( '.captcha' );
+
+               if ( $captchaStuff.length ) {
+                       // The FancyCaptcha has this class in the ConfirmEdit extension since 2013-04-18.
+                       $captchaImageContainer = $captchaStuff.find( '.fancycaptcha-image-container' );
+                       if ( $captchaImageContainer.length !== 1 ) {
+                               return;
+                       }
+
+                       $captchaStuff.remove();
+
+                       if ( helpMsg ) {
+                               helpHtml = '<small class="mw-createacct-captcha-assisted">' + helpMsg + '</small>';
+                       }
+
+                       // Insert another div before the submit button that will include the
+                       // repositioned FancyCaptcha div, an input field, and possible help.
+                       $submit.closest( 'div' ).before( [
+                               '<div>',
+                                       '<label for="wpCaptchaWord">' + mw.message( 'createacct-captcha' ).escaped() + '</label>',
+                                       '<div class="mw-createacct-captcha-container">',
+                                               '<div class="mw-createacct-captcha-and-reload" />',
+                                               '<input id="wpCaptchaWord" name="wpCaptchaWord" type="text" placeholder="' +
+                                                       mw.message( 'createacct-imgcaptcha-ph' ).escaped() +
+                                                       '" tabindex="' + tabIndex + '" autocapitalize="off" autocorrect="off">',
+                                                       helpHtml,
+                                       '</div>',
+                               '</div>'
+                       ].join( '' ) );
+
+                       // Stick the FancyCaptcha container inside our bordered and framed parents.
+                       $captchaImageContainer
+                               .prependTo( $content.find( '.mw-createacct-captcha-and-reload' ) );
+
+                       // Find the input field, add the text (if any) of the existing CAPTCHA
+                       // field (although usually it's blanked out on every redisplay),
+                       // and after it move over the hidden field that tells the CAPTCHA
+                       // what to do.
+                       $content.find( '#wpCaptchaWord' )
+                               .val( $captchaStuff.find( '#wpCaptchaWord' ).val() )
+                               .after( $captchaStuff.find( '#wpCaptchaId' ) );
+               }
+       }
+
+       $( function () {
+               // Work with both login and signup form
+               adjustFancyCaptcha( $( '#mw-content-text' ), '#wpCreateaccount, #wpLoginAttempt' );
+       } );
+}( mediaWiki, jQuery ) );
diff --git a/resources/src/mediawiki.special/mediawiki.special.userlogin.login.css b/resources/src/mediawiki.special/mediawiki.special.userlogin.login.css
new file mode 100644 (file)
index 0000000..dc44c84
--- /dev/null
@@ -0,0 +1,24 @@
+/* The login form invites users to create an account */
+#mw-createaccount-cta {
+       width: 20em;
+       height: 10em;
+       /* @embed */
+       background: url(images/glyph-people-large.png) no-repeat 50%;
+       margin: 0 auto;
+       padding-top: 4em;
+}
+
+#mw-createaccount-cta,
+#mw-createaccount-another {
+       font-size: 0.9em;
+       font-weight: normal;
+       text-align: center;
+}
+
+#mw-createaccount-join {
+       margin-left: 0.75em;
+       /* Separate from background image */
+       box-shadow: 4px 4px 4px 4px rgba(255, 255, 255, 1);
+       width: auto;
+       display: inline-block;
+}
diff --git a/resources/src/mediawiki.special/mediawiki.special.userlogin.signup.css b/resources/src/mediawiki.special/mediawiki.special.userlogin.signup.css
new file mode 100644 (file)
index 0000000..0998d4c
--- /dev/null
@@ -0,0 +1,66 @@
+/* Disable the underline that Vector puts on h2 headings, and bold them. */
+.mw-ui-container h2 {
+       border: 0;
+       font-weight: bold;
+}
+
+/* Benefits column CSS to the right (if it fits) of the form. */
+.mw-ui-container #userloginForm {
+       float: left;
+       /* Override the right margin of the form to give space in case a benefits
+        * column appears to the side. */
+       margin-right: 100px;
+}
+
+div.mw-createacct-benefits-container {
+       /* Keeps this column compact and close to the form, but tends to squish contents. */
+       float: left;
+}
+
+div.mw-createacct-benefits-container h2 {
+       margin-bottom: 30px;
+}
+
+.mw-number-text.icon-edits {
+       /* @embed */
+       background: url(images/icon-edits.png) no-repeat left center;
+}
+
+.mw-number-text.icon-pages {
+       /* @embed */
+       background: url(images/icon-pages.png) no-repeat left center;
+}
+
+.mw-number-text.icon-contributors {
+       /* @embed */
+       background: url(images/icon-contributors.png) no-repeat left center;
+}
+
+/*
+ * Special font for numbers in benefits, same as Vector's @content-heading-font-family.
+ * Needs an ID so that it's more specific than Vector's div#content h3.
+ */
+#bodyContent div.mw-number-text h3 {
+       top: 0;
+       margin: 0;
+       padding: 0;
+       color: #252525;
+       font-family: "Linux Libertine", Georgia, Times, serif;
+       font-weight: normal;
+       font-size: 2.2em;
+       line-height: 1.2;
+       text-align: center;
+}
+
+/* Contains a number and explanatory text, with space for an icon */
+div.mw-number-text {
+       display: block;
+       font-size: 1.2em;
+       color: #444;
+       margin-top: 1em;
+       /* 80px wide icon plus "margin" */
+       padding: 0 0 0 95px;
+       /* Matches max icon height, ensures icon emblem is visible */
+       min-height: 75px;
+       text-align: center;
+}
diff --git a/resources/src/mediawiki.special/mediawiki.special.userlogin.signup.js b/resources/src/mediawiki.special/mediawiki.special.userlogin.signup.js
new file mode 100644 (file)
index 0000000..0615932
--- /dev/null
@@ -0,0 +1,140 @@
+/**
+ * JavaScript for signup form.
+ */
+( function ( mw, $ ) {
+       // When sending password by email, hide the password input fields.
+       $( function () {
+               // Always required if checked, otherwise it depends, so we use the original
+               var $emailLabel = $( 'label[for="wpEmail"]' ),
+                       originalText = $emailLabel.text(),
+                       requiredText = mw.message( 'createacct-emailrequired' ).text(),
+                       $createByMailCheckbox = $( '#wpCreateaccountMail' ),
+                       $beforePwds = $( '.mw-row-password:first' ).prev(),
+                       $pwds;
+
+               function updateForCheckbox() {
+                       var checked = $createByMailCheckbox.prop( 'checked' );
+                       if ( checked ) {
+                               $pwds = $( '.mw-row-password' ).detach();
+                               $emailLabel.text( requiredText );
+                       } else {
+                               if ( $pwds ) {
+                                       $beforePwds.after( $pwds );
+                                       $pwds = null;
+                               }
+                               $emailLabel.text( originalText );
+                       }
+               }
+
+               $createByMailCheckbox.on( 'change', updateForCheckbox );
+               updateForCheckbox();
+       } );
+
+       // Check if the username is invalid or already taken
+       $( function () {
+               var
+                       // We need to hook to all of these events to be sure we are notified of all changes to the
+                       // value of an <input type=text> field.
+                       events = 'keyup keydown change mouseup cut paste focus blur',
+                       $input = $( '#wpName2' ),
+                       $statusContainer = $( '#mw-createacct-status-area' ),
+                       api = new mw.Api(),
+                       currentRequest;
+
+               // Hide any present status messages.
+               function clearStatus() {
+                       $statusContainer.slideUp( function () {
+                               $statusContainer
+                                       .removeAttr( 'class' )
+                                       .empty();
+                       } );
+               }
+
+               // Returns a promise receiving a { state:, username: } object, where:
+               // * 'state' is one of 'invalid', 'taken', 'ok'
+               // * 'username' is the validated username if 'state' is 'ok', null otherwise (if it's not
+               //   possible to register such an account)
+               function checkUsername( username ) {
+                       // We could just use .then() if we didn't have to pass on .abort()…
+                       var d, apiPromise;
+
+                       d = $.Deferred();
+                       apiPromise = api.get( {
+                               action: 'query',
+                               list: 'users',
+                               ususers: username // '|' in usernames is handled below
+                       } )
+                               .done( function ( resp ) {
+                                       var userinfo = resp.query.users[0];
+
+                                       if ( resp.query.users.length !== 1 ) {
+                                               // Happens if the user types '|' into the field
+                                               d.resolve( { state: 'invalid', username: null } );
+                                       } else if ( userinfo.invalid !== undefined ) {
+                                               d.resolve( { state: 'invalid', username: null } );
+                                       } else if ( userinfo.userid !== undefined ) {
+                                               d.resolve( { state: 'taken', username: null } );
+                                       } else {
+                                               d.resolve( { state: 'ok', username: username } );
+                                       }
+                               } )
+                               .fail( d.reject );
+
+                       return d.promise( { abort: apiPromise.abort } );
+               }
+
+               function updateUsernameStatus() {
+                       var
+                               username = $.trim( $input.val() ),
+                               currentRequestInternal;
+
+                       // Abort any pending requests.
+                       if ( currentRequest ) {
+                               currentRequest.abort();
+                       }
+
+                       if ( username === '' ) {
+                               clearStatus();
+                               return;
+                       }
+
+                       currentRequest = currentRequestInternal = checkUsername( username ).done( function ( info ) {
+                               var message;
+
+                               // Another request was fired in the meantime, the result we got here is no longer current.
+                               // This shouldn't happen as we abort pending requests, but you never know.
+                               if ( currentRequest !== currentRequestInternal ) {
+                                       return;
+                               }
+                               // If we're here, then the current request has finished, avoid calling .abort() needlessly.
+                               currentRequest = undefined;
+
+                               if ( info.state === 'ok' ) {
+                                       clearStatus();
+                               } else {
+                                       if ( info.state === 'invalid' ) {
+                                               message = mw.message( 'noname' ).text();
+                                       } else if ( info.state === 'taken' ) {
+                                               message = mw.message( 'userexists' ).text();
+                                       }
+
+                                       $statusContainer
+                                               .attr( 'class', 'errorbox' )
+                                               .empty()
+                                               .append(
+                                                       // Ugh…
+                                                       // @todo Change the HTML structure in includes/templates/Usercreate.php
+                                                       $( '<strong>' ).text( mw.message( 'createacct-error' ).text() ),
+                                                       $( '<br>' ),
+                                                       document.createTextNode( message )
+                                               )
+                                               .slideDown();
+                               }
+                       } ).fail( function () {
+                               clearStatus();
+                       } );
+               }
+
+               $input.on( events, $.debounce( 250, updateUsernameStatus ) );
+       } );
+}( mediaWiki, jQuery ) );
diff --git a/resources/src/mediawiki.special/mediawiki.special.version.css b/resources/src/mediawiki.special/mediawiki.special.version.css
new file mode 100644 (file)
index 0000000..917426a
--- /dev/null
@@ -0,0 +1,14 @@
+/**
+ * Adds additional styling to the extension title/version list
+**/
+.mw-version-ext-name {
+       font-weight: bold;
+}
+
+.mw-version-ext-vcs-timestamp {
+       white-space: nowrap;
+}
+
+th.mw-version-ext-col-label {
+       font-size: 0.9em;
+}
\ No newline at end of file
diff --git a/resources/src/mediawiki.ui/components/default/buttons.less b/resources/src/mediawiki.ui/components/default/buttons.less
new file mode 100644 (file)
index 0000000..f7a7eae
--- /dev/null
@@ -0,0 +1,226 @@
+@import "mediawiki.mixins";
+@import "../../settings/typography";
+@import "../../mixins/effects";
+@import "../../mixins/utilities";
+
+// Buttons
+//
+// All buttons start with mw-ui-button class, modified by other classes.
+// It can be any element.  Due to a lack of a CSS reset, the exact styling of
+// the button depends on what type of element is used.
+// There are two kinds of buttons, the default is a "Call to Action" with an obvious border
+// and there is a quiet kind without a border.
+//
+// Styleguide 2.
+
+@buttonBorderRadius: 3px;
+@transitionDuration: .1s;
+@transitionFunction: ease-in-out;
+
+// Neutral button styling
+//
+// Markup:
+// <button class="mw-ui-button">.mw-ui-button</button>
+// <button class="mw-ui-button" disabled>.mw-ui-button</button>
+//
+// Styleguide 2.1.
+.mw-ui-button {
+       // Container layout
+       display: inline-block;
+       padding: .5em 1em;
+       margin: 0;
+       .box-sizing(border-box);
+
+       // IE6/IE7 hack
+       // http://stackoverflow.com/a/5838575/365238
+       *display: inline;
+       zoom: 1;
+
+       // Container styling
+       .button-colors(@colorWhite);
+       border-radius: @buttonBorderRadius;
+
+       // Ensure that buttons and inputs are nicely aligned when they have differing heights
+       vertical-align: middle;
+
+       // Content styling
+       text-align: center;
+       font-weight: bold;
+       text-shadow: 0 1px rgba(0, 0, 0, .1);
+
+       // Interaction styling
+       cursor: pointer;
+
+       &:disabled {
+               text-shadow: none;
+               cursor: default;
+       }
+
+       .transition(background @transitionDuration @transitionFunction, color @transitionDuration @transitionFunction, box-shadow @transitionDuration @transitionFunction;);
+
+       // Styling for specific button types
+       // -----------------------------------------
+
+       // Big buttons
+       //
+       // Not all buttons are equal. You can emphasise certain actions over others
+       // using the mw-ui-big class.
+       //
+       // Markup:
+       // <button class="mw-ui-button mw-ui-big">.mw-ui-button</button>
+       // <button class="mw-ui-button mw-ui-progressive mw-ui-big">.mw-ui-progressive</button>
+       // <button class="mw-ui-button mw-ui-constructive mw-ui-big">.mw-ui-constructive</button>
+       // <button class="mw-ui-button mw-ui-destructive mw-ui-big">.mw-ui-destructive</button>
+       //
+       // Styleguide 2.1.6.
+       &.mw-ui-big {
+               font-size: @baseFontSize * 1.3;
+       }
+
+       // Block buttons
+       //
+       // Some buttons might need to be stacked.
+       //
+       // Markup:
+       // <button class="mw-ui-button mw-ui-block">.mw-ui-button</button>
+       // <button class="mw-ui-button mw-ui-progressive mw-ui-block">.mw-ui-progressive</button>
+       // <button class="mw-ui-button mw-ui-constructive mw-ui-block">.mw-ui-constructive</button>
+       // <button class="mw-ui-button mw-ui-destructive mw-ui-block">.mw-ui-destructive</button>
+       //
+       // Styleguide 2.1.5.
+       &.mw-ui-block {
+               display: block;
+               width: 100%;
+       }
+
+       // Progressive buttons
+       //
+       // Use progressive buttons for actions which lead to a next step in the process.
+       // .mw-ui-primary is deprecated, kept for compatibility.
+       //
+       // Markup:
+       // <button class="mw-ui-button mw-ui-progressive">.mw-ui-progressive</button>
+       // <button class="mw-ui-button mw-ui-progressive" disabled>.mw-ui-progressive</button>
+       //
+       // Styleguide 2.1.1.
+       &.mw-ui-progressive,
+       &.mw-ui-primary {
+               .button-colors(@colorProgressive);
+
+               &.mw-ui-quiet {
+                       .button-colors-quiet(@colorProgressive);
+               }
+       }
+
+       // Constructive buttons
+       //
+       // Use constructive buttons for actions which result in a final action in the process that results
+       // in a change of state.
+       // e.g. save changes button
+       //
+       // Markup:
+       // <button class="mw-ui-button mw-ui-constructive">.mw-ui-constructive</button>
+       // <button class="mw-ui-button mw-ui-constructive" disabled>.mw-ui-constructive</button>
+       //
+       // Styleguide 2.1.2.
+       &.mw-ui-constructive {
+               .button-colors(@colorConstructive);
+
+               &.mw-ui-quiet {
+                       .button-colors-quiet(@colorConstructive);
+               }
+       }
+
+       // Destructive buttons
+       //
+       // Use destructive buttons for actions which result in the destruction of data.
+       // e.g. deleting a page.
+       // This should not be used for cancel buttons.
+       //
+       // Markup:
+       // <button class="mw-ui-button mw-ui-destructive">.mw-ui-destructive</button>
+       // <button class="mw-ui-button mw-ui-destructive" disabled>.mw-ui-destructive</button>
+       //
+       // Styleguide 2.1.3.
+       &.mw-ui-destructive {
+               .button-colors(@colorDestructive);
+
+               &.mw-ui-quiet {
+                       .button-colors-quiet(@colorDestructive);
+               }
+       }
+
+       // Quiet buttons
+       //
+       // Use quiet buttons when they are less important and alongisde other progressive/destructive/progressive buttons.
+       //
+       // Markup:
+       // <button class="mw-ui-button mw-ui-quiet">.mw-ui-button</button>
+       // <button class="mw-ui-button mw-ui-constructive mw-ui-quiet">.mw-ui-constructive</button>
+       // <button class="mw-ui-button mw-ui-constructive mw-ui-quiet" disabled>.mw-ui-constructive</button>
+       // <button class="mw-ui-button mw-ui-destructive mw-ui-quiet">.mw-ui-destructive</button>
+       // <button class="mw-ui-button mw-ui-destructive mw-ui-quiet" disabled>.mw-ui-destructive</button>
+       // <button class="mw-ui-button mw-ui-progressive mw-ui-quiet">.mw-ui-progressive</button>
+       // <button class="mw-ui-button mw-ui-progressive mw-ui-quiet" disabled>.mw-ui-progressive</button>
+       //
+       // Styleguide 2.1.4.
+       &.mw-ui-quiet {
+               background: transparent;
+               border: none;
+               text-shadow: none;
+               .button-colors-quiet(@colorGrayDark);
+
+               &:hover,
+               &:focus {
+                       box-shadow: none;
+               }
+
+               &:active,
+               &:disabled {
+                       background: transparent;
+               }
+       }
+}
+
+a.mw-ui-button {
+       text-decoration: none;
+
+       // This overrides an underline declaration on a:hover and a:focus in
+       // commonElements.css, which the class alone isn't specific enough to do.
+       &:hover,
+       &:focus {
+               text-decoration: none;
+       }
+}
+
+// Button groups
+//
+// Group of buttons. Make sure you clear the floating after using a mw-ui-button-group.
+//
+// Markup:
+// <div class="mw-ui-button-group">
+//   <div class="mw-ui-button">A</div>
+//   <div class="mw-ui-button">B</div>
+//   <div class="mw-ui-button">C</div>
+//   <div class="mw-ui-button">D</div>
+// </div><div style="clear:both"></div>
+//
+// Styleguide 2.2.
+.mw-ui-button-group > * {
+       border-radius: 0;
+       float: left;
+
+       &:first-child {
+               border-top-left-radius: @buttonBorderRadius;
+               border-bottom-left-radius: @buttonBorderRadius;
+       }
+
+       &:not(:first-child) {
+               border-left: none;
+       }
+
+       &:last-child{
+               border-top-right-radius: @buttonBorderRadius;
+               border-bottom-right-radius: @buttonBorderRadius;
+       }
+}
diff --git a/resources/src/mediawiki.ui/components/default/forms.less b/resources/src/mediawiki.ui/components/default/forms.less
new file mode 100644 (file)
index 0000000..6157fa2
--- /dev/null
@@ -0,0 +1,165 @@
+// Form elements and layouts
+
+@import "../../mixins/utilities";
+@import "../../mixins/forms";
+
+// --------------------------------------------------------------------------
+// Layouts
+// --------------------------------------------------------------------------
+
+// The FancyCaptcha image CAPTCHA used on WMF wikis drives the width of the
+// 'VForm' design, the form can't be narrower than this.
+@captchaContainerWidth: 290px;
+@defaultFormWidth: @captchaContainerWidth;
+
+// Forms
+//
+// Styleguide 3.
+
+// VForm
+//
+// Style a compact vertical stacked form ("VForm") and the elements in divs
+// within it. See button section on guidance of how and when to use mw-ui-constructive.
+//
+// Markup:
+// <form class="mw-ui-vform">
+//   <div class="mw-ui-vform-div">This is a form example.</div>
+//   <div>
+//     <label>Username </label>
+//     <input value="input">
+//   </div>
+//   <div>
+//     <button class="mw-ui-button mw-ui-constructive">Button in vform</button>
+//   </div>
+// </form>
+//
+// Styleguide 3.1.
+.mw-ui-vform {
+       .box-sizing(border-box);
+
+       width: @defaultFormWidth;
+
+       // Immediate divs in a vform are block and spaced-out.
+       // XXX: We shouldn't depend on the tag name here...
+       & > div {
+               display: block;
+               margin: 0 0 15px 0;
+               padding: 0;
+               width: 100%;
+       }
+
+       // MW currently doesn't use the type attribute everywhere on inputs.
+       input,
+       .mw-ui-button {
+               display: block;
+               .box-sizing(border-box);
+               margin: 0;
+               width: 100%;
+       }
+
+       // We exclude these because they'll generally use mw-ui-button.
+       // Otherwise, we'll unintentionally override that.
+       input:not([type=button]):not([type=submit]):not([type=file]), {
+               .agora-field-styling(); // mixins/forms.less
+       }
+
+       label {
+               display: block;
+               .box-sizing(border-box);
+               .agora-label-styling();
+               width: auto;
+               margin: 0 0 0.2em;
+               padding: 0;
+       }
+
+       // Override input styling just for checkboxes and radio inputs.
+       input[type="checkbox"],
+       input[type="radio"] {
+               display: inline;
+               .box-sizing(content-box);
+               width: auto;
+       }
+
+
+       // Styles for information boxes
+       //
+       // Regular HTMLForm uses .error class, some special pages like
+       // SpecialUserlogin (login and create account) use .errorbox.
+       //
+       // Markup:
+       // <form class="mw-ui-vform">
+       //   <div class="errorbox">An error occurred</div>
+       //   <div class="warningbox">A warning to be noted</div>
+       //   <div class="successbox">Action successful!</div>
+       //   <div class="error">A different kind of error</div>
+       //   <div>
+       //     <input type="text" value="input" class="mw-ui-input">
+       //   <div>
+       //   </div>
+       //     <button class="mw-ui-button">Button in vform</button>
+       //   </div>
+       // </form>
+       //
+       // Styleguide 3.1.
+       .error {
+               .box-sizing(border-box);
+               font-size: 0.9em;
+               margin: 0 0 1em;
+               padding: 0.5em;
+               color: #cc0000;
+               border: 1px solid #fac5c5;
+               background-color: #fae3e3;
+               text-shadow: 0 1px #fae3e3;
+               word-wrap: break-word;
+       }
+
+       .errorbox,
+       .warningbox,
+       .successbox {
+               .box-sizing(border-box);
+               font-size: 0.9em;
+               margin: 0 0 1em 0;
+               padding: 0.5em;
+               word-wrap: break-word;
+       }
+
+}
+
+// --------------------------------------------------------------------------
+// Elements
+// --------------------------------------------------------------------------
+
+// Apply this to individual elements to style them.
+// You generally don't need to use this class on divs within an Agora
+// form container such as mw-ui-vform
+// XXX DRY: This repeats earlier styling, use an @include agora-div-styling ?
+// XXX: What is this even for?
+.mw-ui-vform-div {
+       display: block;
+       margin: 0 0 15px;
+       padding: 0;
+       width: 100%;
+}
+
+// Apply mw-ui-input to individual input fields to style them.
+// You generally don't need to use this class if <input> is within an Agora
+// form container such as mw-ui-vform
+.mw-ui-input {
+       .agora-field-styling(); // mixins/forms.less
+}
+
+// Apply mw-ui-label to individual elements to style them.
+// You generally don't need to use this class if <label> is within an Agora
+// form container such as mw-ui-vform
+.mw-ui-label {
+       .agora-label-styling(); // mixins/forms.less
+}
+
+// Nesting an input checkbox or radio button inside a label with this class
+// improves alignment, e.g.
+//     <label class="mw-ui-checkbox-label">
+//             <input type="checkbox">The label text
+//     </label>
+.mw-ui-checkbox-label, .mw-ui-radio-label {
+       .agora-inline-label-styling();
+}
diff --git a/resources/src/mediawiki.ui/components/utilities.less b/resources/src/mediawiki.ui/components/utilities.less
new file mode 100644 (file)
index 0000000..9aea429
--- /dev/null
@@ -0,0 +1,19 @@
+// Generic helper classes that could be used in many elements/layouts
+
+// --------------------------------------------------------------------------
+// Positioning
+// --------------------------------------------------------------------------
+
+@import "../mixins/utilities";
+
+.mw-ui-flush-left {
+       .agora-flush-left();
+}
+
+.mw-ui-flush-right {
+       .agora-flush-right();
+}
+
+.mw-ui-center-block {
+       .agora-center-block();
+}
diff --git a/resources/src/mediawiki.ui/components/vector/buttons.less b/resources/src/mediawiki.ui/components/vector/buttons.less
new file mode 100644 (file)
index 0000000..1536338
--- /dev/null
@@ -0,0 +1,6 @@
+@import "../default/buttons"; // Layer Vector on top of the default settings.
+@import "../../mixins/type";
+
+.mw-ui-button {
+       .vector-type();
+}
diff --git a/resources/src/mediawiki.ui/components/vector/containers.less b/resources/src/mediawiki.ui/components/vector/containers.less
new file mode 100644 (file)
index 0000000..1e9ec05
--- /dev/null
@@ -0,0 +1,6 @@
+// No default settings for containers yet.
+@import "../../mixins/type";
+
+.mw-ui-container {
+       .vector-type();
+}
diff --git a/resources/src/mediawiki.ui/components/vector/forms.less b/resources/src/mediawiki.ui/components/vector/forms.less
new file mode 100644 (file)
index 0000000..2bbd8f0
--- /dev/null
@@ -0,0 +1,8 @@
+@import "../default/forms"; // Layer Vector on top of the default settings.
+@import "../../mixins/type";
+
+.mw-ui-vform,
+.mw-ui-vform input,
+.mw-ui-input {
+       .vector-type();
+}
diff --git a/resources/src/mediawiki.ui/default.less b/resources/src/mediawiki.ui/default.less
new file mode 100644 (file)
index 0000000..e576937
--- /dev/null
@@ -0,0 +1,7 @@
+/**
+ * Provide Agora appearance for mw-ui-* classes when using a skin other than
+ * Vector.
+ */
+
+@import "components/utilities";
+@import "components/default/forms";
diff --git a/resources/src/mediawiki.ui/mixins/effects.less b/resources/src/mediawiki.ui/mixins/effects.less
new file mode 100644 (file)
index 0000000..52dbb05
--- /dev/null
@@ -0,0 +1,91 @@
+@import "../settings/colors";
+// ----------------------------------------------------------------------------
+// Button styling
+// ----------------------------------------------------------------------------
+
+.button-colors(@bgColor) {
+       background: @bgColor;
+
+       &:hover,
+       &:focus {
+               // The inner bottom bevel should match the active background color.
+               box-shadow: 0 1px rgba(0, 0, 0, 10%), inset 0 -3px rgba(0, 0, 0, 20%);
+               border-bottom-color: mix(#000, @bgColor, 20%);
+               outline: none;
+               // remove outline in Firefox
+               &::-moz-focus-inner {
+                       border-color: transparent;
+               }
+       }
+
+       &:active,
+       &.mw-ui-checked {
+               // lessphp doesn't implement shade (https://github.com/leafo/lessphp/issues/528);
+               // it passes it through, then ResourceLoader drops it.
+               // background: shade(@bgColor, 20%);
+               background: mix(#000, @bgColor, 20%);
+               box-shadow: none;
+       }
+}
+
+.button-colors(@bgColor) when (lightness(@bgColor) >= 70%) {
+       color: @colorGrayDark;
+       border: 1px solid @colorGrayLight;
+
+       &:disabled {
+               color: @colorGrayLight;
+
+               // make sure disabled buttons don't have hover and active states
+               &:hover,
+               &:active {
+                       background: @bgColor;
+                       box-shadow: none;
+               }
+       }
+}
+
+.button-colors(@bgColor) when (lightness(@bgColor) < 70%) {
+       color: @colorWhite;
+       // border of the same color as background so that light background and
+       // dark background buttons are the same height (only top and bottom to
+       // make box shadow on hover cover the corners too)
+       border: 1px solid @bgColor;
+       border-left: none;
+       border-right: none;
+
+       &:disabled {
+               background: @colorGrayLight;
+               border-color: @colorGrayLight;
+
+               // make sure disabled buttons don't have hover and active states
+               &:hover,
+               &:active,
+               &.mw-ui-checked {
+                       box-shadow: none;
+               }
+       }
+}
+
+.button-colors-quiet(@textColor) {
+       // Quiet buttons all start gray, and reveal
+       // constructive/progressive/destructive color on hover and active.
+       color: @colorGrayDark;
+
+       &:hover,
+       &:focus {
+               // lessphp doesn't implement tint, see above
+               // color: tint(@textColor, 20%);
+               color: mix(#fff, @textColor, 20%);
+       }
+
+       &:active,
+       &.mw-ui-checked {
+               // lessphp doesn't implement shade, see above
+               // color: shade(@textColor, 20%);
+               color: mix(#000, @textColor, 20%);
+       }
+
+       &:disabled {
+               color: @colorGrayLight;
+       }
+}
diff --git a/resources/src/mediawiki.ui/mixins/forms.less b/resources/src/mediawiki.ui/mixins/forms.less
new file mode 100644 (file)
index 0000000..20f42a0
--- /dev/null
@@ -0,0 +1,54 @@
+@import "../settings/colors";
+
+// Font is not included.
+// For Vector, that should be layered on top with vector-type
+.agora-field-styling() {
+
+       border: 1px solid @colorGrayLight;
+
+       &:focus {
+               // Styling focus of native checkboxes etc on Mac is almost impossible.
+               &:not([type=checkbox]):not([type=radio]) {
+                       outline: 0; // Removes OS field focus
+               }
+
+               box-shadow: @colorProgressiveShadow 0 0 5px;
+
+               border-color: @colorProgressiveShadow;
+       }
+
+       color: @colorText;
+       padding: 0.35em 0.5em 0.35em 0.5em;
+
+       // Ensure that buttons and inputs are nicely aligned when they have differing heights
+       vertical-align: middle;
+}
+
+.agora-label-styling() {
+       //font-weight: bold;
+       font-size: 0.9em;
+       color: darken(@colorGrayLight, 50%);
+
+       * {
+               font-weight: normal;
+       }
+}
+
+.agora-inline-label-styling() {
+       margin-bottom: 0.5em;
+       cursor: pointer;
+       vertical-align: bottom;
+       line-height: normal;
+
+       font-weight: normal;
+
+       & > input[type="checkbox"],
+       & > input[type="radio"] {
+               width: auto;
+               height: auto;
+               margin: 0 0.1em 0 0;
+               padding: 0;
+               border: 1px solid @colorGrayLight;
+               cursor: pointer;
+       }
+}
diff --git a/resources/src/mediawiki.ui/mixins/type.less b/resources/src/mediawiki.ui/mixins/type.less
new file mode 100644 (file)
index 0000000..4a01168
--- /dev/null
@@ -0,0 +1,6 @@
+@import "../settings/typography";
+
+.vector-type() {
+       font-size: @baseFontSize;
+       line-height: @baseLineHeight;
+}
diff --git a/resources/src/mediawiki.ui/mixins/utilities.less b/resources/src/mediawiki.ui/mixins/utilities.less
new file mode 100644 (file)
index 0000000..a201a4e
--- /dev/null
@@ -0,0 +1,23 @@
+.box-sizing(@value) {
+       -moz-box-sizing: @value;
+       -webkit-box-sizing: @value;
+       box-sizing: @value;
+}
+
+.agora-flush-left() {
+       float: left;
+       margin-left: 0;
+       padding-left: 0;
+}
+
+.agora-flush-right() {
+       float: right;
+       margin-right: 0;
+       padding-right: 0;
+}
+
+.agora-center-block() {
+       display: block;
+       margin-left: auto;
+       margin-right: auto;
+}
diff --git a/resources/src/mediawiki.ui/settings/colors.less b/resources/src/mediawiki.ui/settings/colors.less
new file mode 100644 (file)
index 0000000..18661de
--- /dev/null
@@ -0,0 +1,10 @@
+@colorWhite: #fff;
+@colorGrayLight: #ccc;
+@colorGrayDark: #898989;
+@colorText: #252525;
+@colorProgressive: #347bff;
+// FIXME: remove @colorProgressiveShadow (shadows should be generated
+// in LESS by dimming the original colors)
+@colorProgressiveShadow: #4091ed;
+@colorConstructive: #00af89;
+@colorDestructive: #d11d13;
diff --git a/resources/src/mediawiki.ui/settings/typography.less b/resources/src/mediawiki.ui/settings/typography.less
new file mode 100644 (file)
index 0000000..83651ed
--- /dev/null
@@ -0,0 +1,5 @@
+@baseFontSize: 1em;
+@baseLineHeight: 1.4 * @baseFontSize;
+@baseFontColor: @colorText;
+
+@smallFontSize: 0.75em;
diff --git a/resources/src/mediawiki.ui/styleguide.md b/resources/src/mediawiki.ui/styleguide.md
new file mode 100644 (file)
index 0000000..b7eea54
--- /dev/null
@@ -0,0 +1,26 @@
+#Wikimedia projects
+
+This is the living style guide for MediaWiki UI used in Wikimedia Projects. It is generated from existing CSS programmatically. Please use it as a reference when developing code for MediaWiki to ensure your design is consistent with others across the site. Note this document is a work in progress and subject to change.
+
+##Brand
+
+Imagine a world in which every single human being can freely share in the sum of all knowledge.
+
+Sharing knowledge is the heart of our movement. Specifically, we care about sharing the “… highest possible quality to every single person on the planet in their own language” (Jimmy Wales). The focus of our identity is being credible and is moving toward being more inviting. We want our contributors to keep contributing while our assuring our readers that the information on any of the Wikimedia projects is reliable and accurate. Our personality should embody both of those traits with a slight sense of rebellion. We are unlike traditional projects (for instance, Encyclopedias that are only created by a few select individuals). We are a global movement, and as Jimmy Wales puts it: “Wikipedia is like rock’n’roll; it’s a cultural shift."
+
+##Design Philosophy
+
+The Wikimedia movement is a global volunteer community that aims to collect and develop the world's knowledge and to make it available to everyone for free, for any purpose. “Imagine a world in which every single human being can freely share in the sum of all knowledge.” 
+
+###Credible
+We strive for the most accurate, high quality and neutral information on all Wikimedia projects. We are fact-based and honest. We do not take sides. We are fair and impartial. 
+
+###Inviting
+We are geeky about collecting and developing knowledge. We invite and welcome every single human being to share their knowledge with us and the rest of the world. We are open-minded and have a strong sense of community. Our aesthetics should be clean and encourage interaction. 
+
+###Worldly
+We are thoughtful and are aware of cultural differences. We are careful about words, color usage, and images that might offend. We are also aware of limited connectivity in some areas of the world and are thoughtful of image sizes and loading speed. 
+
+###Humble
+We are respectful of contributors’ effort and knowledge. We have a wealth of knowledge on all projects and many people to thank for that. We are humble. We are helpful and welcome help to expand the sum of all knowledge. 
+
diff --git a/resources/src/mediawiki.ui/vector.less b/resources/src/mediawiki.ui/vector.less
new file mode 100644 (file)
index 0000000..08690a3
--- /dev/null
@@ -0,0 +1,25 @@
+/**
+ * Provide Agora appearance for mw-ui-* classes when using the Vector skin.
+ */
+
+// Typography
+//
+// We prefer the usage of Georgia Bold for all headings. Georgia Regular is used to place emphasis on pull-out or short quotations. This latter usage should be used sparingly. 
+//
+// We prefer the use of Helvetica Neue Regular for body copy. Helvetiva Neue Bold for sub-headers. Pull-out quotes within the body copy should use Helvetica Neue Bold. Helvetica Neue is an not open-source font. Hence, below is a list of preferred alternate choices.
+//
+// Second choice: Helvetica
+//
+// Third choice: Arial
+//
+// Our content is predominantly text, hence visual hierarchy must be clear. Use these recommended type sizes to inform and establish information hierarchy and organization. 
+//
+// Unless if you plan to put extra attention and manually adjust spacing, avoid justifying texts and paragraphs as they are harder to read and create unnecessary visual distractions. Along with centered text, they convey a formal and less friendly environment. 
+//
+// It will be important to talk about other languages, scripts and writing direction - with the same level as importance, not as an afterthought.
+//
+// Styleguide 1.
+
+@import "components/utilities";
+@import "components/vector/forms";
+@import "components/vector/containers";
diff --git a/resources/src/mediawiki/images/arrow-collapsed-ltr.png b/resources/src/mediawiki/images/arrow-collapsed-ltr.png
new file mode 100644 (file)
index 0000000..b17e578
Binary files /dev/null and b/resources/src/mediawiki/images/arrow-collapsed-ltr.png differ
diff --git a/resources/src/mediawiki/images/arrow-collapsed-ltr.svg b/resources/src/mediawiki/images/arrow-collapsed-ltr.svg
new file mode 100644 (file)
index 0000000..6233fd5
--- /dev/null
@@ -0,0 +1 @@
+<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12"><path d="M4 1.533v9.671l4.752-4.871z" fill="#797979"/></svg>
\ No newline at end of file
diff --git a/resources/src/mediawiki/images/arrow-collapsed-rtl.png b/resources/src/mediawiki/images/arrow-collapsed-rtl.png
new file mode 100644 (file)
index 0000000..a834548
Binary files /dev/null and b/resources/src/mediawiki/images/arrow-collapsed-rtl.png differ
diff --git a/resources/src/mediawiki/images/arrow-collapsed-rtl.svg b/resources/src/mediawiki/images/arrow-collapsed-rtl.svg
new file mode 100644 (file)
index 0000000..44d5587
--- /dev/null
@@ -0,0 +1 @@
+<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12"><path d="M8 1.533v9.671l-4.752-4.871z" fill="#797979"/></svg>
\ No newline at end of file
diff --git a/resources/src/mediawiki/images/arrow-expanded.png b/resources/src/mediawiki/images/arrow-expanded.png
new file mode 100644 (file)
index 0000000..2bec798
Binary files /dev/null and b/resources/src/mediawiki/images/arrow-expanded.png differ
diff --git a/resources/src/mediawiki/images/arrow-expanded.svg b/resources/src/mediawiki/images/arrow-expanded.svg
new file mode 100644 (file)
index 0000000..a0d217d
--- /dev/null
@@ -0,0 +1 @@
+<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12"><path d="M1.165 3.624h9.671l-4.871 4.752z" fill="#797979"/></svg>
\ No newline at end of file
diff --git a/resources/src/mediawiki/mediawiki.Title.js b/resources/src/mediawiki/mediawiki.Title.js
new file mode 100644 (file)
index 0000000..8ce9b58
--- /dev/null
@@ -0,0 +1,588 @@
+/*!
+ * @author Neil Kandalgaonkar, 2010
+ * @author Timo Tijhof, 2011-2013
+ * @since 1.18
+ */
+( function ( mw, $ ) {
+
+       /**
+        * @class mw.Title
+        *
+        * Parse titles into an object struture. Note that when using the constructor
+        * directly, passing invalid titles will result in an exception. Use #newFromText to use the
+        * logic directly and get null for invalid titles which is easier to work with.
+        *
+        * @constructor
+        * @param {string} title Title of the page. If no second argument given,
+        *  this will be searched for a namespace
+        * @param {number} [namespace=NS_MAIN] If given, will used as default namespace for the given title
+        * @throws {Error} When the title is invalid
+        */
+       function Title( title, namespace ) {
+               var parsed = parse( title, namespace );
+               if ( !parsed ) {
+                       throw new Error( 'Unable to parse title' );
+               }
+
+               this.namespace = parsed.namespace;
+               this.title = parsed.title;
+               this.ext = parsed.ext;
+               this.fragment = parsed.fragment;
+
+               return this;
+       }
+
+       /* Private members */
+
+       var
+
+       /**
+        * @private
+        * @static
+        * @property NS_MAIN
+        */
+       NS_MAIN = 0,
+
+       /**
+        * @private
+        * @static
+        * @property NS_TALK
+        */
+       NS_TALK = 1,
+
+       /**
+        * @private
+        * @static
+        * @property NS_SPECIAL
+        */
+       NS_SPECIAL = -1,
+
+       /**
+        * Get the namespace id from a namespace name (either from the localized, canonical or alias
+        * name).
+        *
+        * Example: On a German wiki this would return 6 for any of 'File', 'Datei', 'Image' or
+        * even 'Bild'.
+        *
+        * @private
+        * @static
+        * @method getNsIdByName
+        * @param {string} ns Namespace name (case insensitive, leading/trailing space ignored)
+        * @return {number|boolean} Namespace id or boolean false
+        */
+       getNsIdByName = function ( ns ) {
+               var id;
+
+               // Don't cast non-strings to strings, because null or undefined should not result in
+               // returning the id of a potential namespace called "Null:" (e.g. on null.example.org/wiki)
+               // Also, toLowerCase throws exception on null/undefined, because it is a String method.
+               if ( typeof ns !== 'string' ) {
+                       return false;
+               }
+               ns = ns.toLowerCase();
+               id = mw.config.get( 'wgNamespaceIds' )[ns];
+               if ( id === undefined ) {
+                       return false;
+               }
+               return id;
+       },
+
+       rUnderscoreTrim = /^_+|_+$/g,
+
+       rSplit = /^(.+?)_*:_*(.*)$/,
+
+       // See Title.php#getTitleInvalidRegex
+       rInvalid = new RegExp(
+               '[^' + mw.config.get( 'wgLegalTitleChars' ) + ']' +
+               // URL percent encoding sequences interfere with the ability
+               // to round-trip titles -- you can't link to them consistently.
+               '|%[0-9A-Fa-f]{2}' +
+               // XML/HTML character references produce similar issues.
+               '|&[A-Za-z0-9\u0080-\uFFFF]+;' +
+               '|&#[0-9]+;' +
+               '|&#x[0-9A-Fa-f]+;'
+       ),
+
+       /**
+        * Internal helper for #constructor and #newFromtext.
+        *
+        * Based on Title.php#secureAndSplit
+        *
+        * @private
+        * @static
+        * @method parse
+        * @param {string} title
+        * @param {number} [defaultNamespace=NS_MAIN]
+        * @return {Object|boolean}
+        */
+       parse = function ( title, defaultNamespace ) {
+               var namespace, m, id, i, fragment, ext;
+
+               namespace = defaultNamespace === undefined ? NS_MAIN : defaultNamespace;
+
+               title = title
+                       // Normalise whitespace to underscores and remove duplicates
+                       .replace( /[ _\s]+/g, '_' )
+                       // Trim underscores
+                       .replace( rUnderscoreTrim, '' );
+
+               // Process initial colon
+               if ( title !== '' && title.charAt( 0 ) === ':' ) {
+                       // Initial colon means main namespace instead of specified default
+                       namespace = NS_MAIN;
+                       title = title
+                               // Strip colon
+                               .substr( 1 )
+                               // Trim underscores
+                               .replace( rUnderscoreTrim, '' );
+               }
+
+               if ( title === '' ) {
+                       return false;
+               }
+
+               // Process namespace prefix (if any)
+               m = title.match( rSplit );
+               if ( m ) {
+                       id = getNsIdByName( m[1] );
+                       if ( id !== false ) {
+                               // Ordinary namespace
+                               namespace = id;
+                               title = m[2];
+
+                               // For Talk:X pages, make sure X has no "namespace" prefix
+                               if ( namespace === NS_TALK && ( m = title.match( rSplit ) ) ) {
+                                       // Disallow titles like Talk:File:x (subject should roundtrip: talk:file:x -> file:x -> file_talk:x)
+                                       if ( getNsIdByName( m[1] ) !== false ) {
+                                               return false;
+                                       }
+                               }
+                       }
+               }
+
+               // Process fragment
+               i = title.indexOf( '#' );
+               if ( i === -1 ) {
+                       fragment = null;
+               } else {
+                       fragment = title
+                               // Get segment starting after the hash
+                               .substr( i + 1 )
+                               // Convert to text
+                               // NB: Must not be trimmed ("Example#_foo" is not the same as "Example#foo")
+                               .replace( /_/g, ' ' );
+
+                       title = title
+                               // Strip hash
+                               .substr( 0, i )
+                               // Trim underscores, again (strips "_" from "bar" in "Foo_bar_#quux")
+                               .replace( rUnderscoreTrim, '' );
+               }
+
+               // Reject illegal characters
+               if ( title.match( rInvalid ) ) {
+                       return false;
+               }
+
+               // Disallow titles that browsers or servers might resolve as directory navigation
+               if (
+                       title.indexOf( '.' ) !== -1 && (
+                               title === '.' || title === '..' ||
+                               title.indexOf( './' ) === 0 ||
+                               title.indexOf( '../' ) === 0 ||
+                               title.indexOf( '/./' ) !== -1 ||
+                               title.indexOf( '/../' ) !== -1 ||
+                               title.substr( title.length - 2 ) === '/.' ||
+                               title.substr( title.length - 3 ) === '/..'
+                       )
+               ) {
+                       return false;
+               }
+
+               // Disallow magic tilde sequence
+               if ( title.indexOf( '~~~' ) !== -1 ) {
+                       return false;
+               }
+
+               // Disallow titles exceeding the 255 byte size limit (size of underlying database field)
+               // Except for special pages, e.g. [[Special:Block/Long name]]
+               // Note: The PHP implementation also asserts that even in NS_SPECIAL, the title should
+               // be less than 512 bytes.
+               if ( namespace !== NS_SPECIAL && $.byteLength( title ) > 255 ) {
+                       return false;
+               }
+
+               // Can't make a link to a namespace alone.
+               if ( title === '' && namespace !== NS_MAIN ) {
+                       return false;
+               }
+
+               // Any remaining initial :s are illegal.
+               if ( title.charAt( 0 ) === ':' ) {
+                       return false;
+               }
+
+               // For backwards-compatibility with old mw.Title, we separate the extension from the
+               // rest of the title.
+               i = title.lastIndexOf( '.' );
+               if ( i === -1 || title.length <= i + 1 ) {
+                       // Extensions are the non-empty segment after the last dot
+                       ext = null;
+               } else {
+                       ext = title.substr( i + 1 );
+                       title = title.substr( 0, i );
+               }
+
+               return {
+                       namespace: namespace,
+                       title: title,
+                       ext: ext,
+                       fragment: fragment
+               };
+       },
+
+       /**
+        * Convert db-key to readable text.
+        *
+        * @private
+        * @static
+        * @method text
+        * @param {string} s
+        * @return {string}
+        */
+       text = function ( s ) {
+               if ( s !== null && s !== undefined ) {
+                       return s.replace( /_/g, ' ' );
+               } else {
+                       return '';
+               }
+       },
+
+       // Polyfill for ES5 Object.create
+       createObject = Object.create || ( function () {
+               return function ( o ) {
+                       function Title() {}
+                       if ( o !== Object( o ) ) {
+                               throw new Error( 'Cannot inherit from a non-object' );
+                       }
+                       Title.prototype = o;
+                       return new Title();
+               };
+       }() );
+
+       /* Static members */
+
+       /**
+        * Constructor for Title objects with a null return instead of an exception for invalid titles.
+        *
+        * @static
+        * @method
+        * @param {string} title
+        * @param {number} [namespace=NS_MAIN] Default namespace
+        * @return {mw.Title|null} A valid Title object or null if the title is invalid
+        */
+       Title.newFromText = function ( title, namespace ) {
+               var t, parsed = parse( title, namespace );
+               if ( !parsed ) {
+                       return null;
+               }
+
+               t = createObject( Title.prototype );
+               t.namespace = parsed.namespace;
+               t.title = parsed.title;
+               t.ext = parsed.ext;
+               t.fragment = parsed.fragment;
+
+               return t;
+       };
+
+       /**
+        * Get the file title from an image element
+        *
+        *     var title = mw.Title.newFromImg( $( 'img:first' ) );
+        *
+        * @static
+        * @param {HTMLElement|jQuery} img The image to use as a base
+        * @return {mw.Title|null} The file title or null if unsuccessful
+        */
+       Title.newFromImg = function ( img ) {
+               var matches, i, regex, src, decodedSrc,
+
+                       // thumb.php-generated thumbnails
+                       thumbPhpRegex = /thumb\.php/,
+                       regexes = [
+                               // Thumbnails
+                               /\/[a-f0-9]\/[a-f0-9]{2}\/([^\s\/]+)\/[^\s\/]+-(?:\1|thumbnail)[^\s\/]*$/,
+
+                               // Thumbnails in non-hashed upload directories
+                               /\/([^\s\/]+)\/[^\s\/]+-(?:\1|thumbnail)[^\s\/]*$/,
+
+                               // Full size images
+                               /\/[a-f0-9]\/[a-f0-9]{2}\/([^\s\/]+)$/,
+
+                               // Full-size images in non-hashed upload directories
+                               /\/([^\s\/]+)$/
+                       ],
+
+                       recount = regexes.length;
+
+               src = img.jquery ? img[0].src : img.src;
+
+               matches = src.match( thumbPhpRegex );
+
+               if ( matches ) {
+                       return mw.Title.newFromText( 'File:' + mw.util.getParamValue( 'f', src ) );
+               }
+
+               decodedSrc = decodeURIComponent( src );
+
+               for ( i = 0; i < recount; i++ ) {
+                       regex = regexes[i];
+                       matches = decodedSrc.match( regex );
+
+                       if ( matches && matches[1] ) {
+                               return mw.Title.newFromText( 'File:' + matches[1] );
+                       }
+               }
+
+               return null;
+       };
+
+       /**
+        * Whether this title exists on the wiki.
+        *
+        * @static
+        * @param {string|mw.Title} title prefixed db-key name (string) or instance of Title
+        * @return {boolean|null} Boolean if the information is available, otherwise null
+        */
+       Title.exists = function ( title ) {
+               var match,
+                       type = $.type( title ),
+                       obj = Title.exist.pages;
+
+               if ( type === 'string' ) {
+                       match = obj[title];
+               } else if ( type === 'object' && title instanceof Title ) {
+                       match = obj[title.toString()];
+               } else {
+                       throw new Error( 'mw.Title.exists: title must be a string or an instance of Title' );
+               }
+
+               if ( typeof match === 'boolean' ) {
+                       return match;
+               }
+
+               return null;
+       };
+
+       Title.exist = {
+               /**
+                * Boolean true value indicates page does exist.
+                *
+                * @static
+                * @property {Object} exist.pages Keyed by PrefixedDb title.
+                */
+               pages: {},
+
+               /**
+                * Example to declare existing titles:
+                *
+                *     Title.exist.set( ['User:John_Doe', ...] );
+                *
+                * Example to declare titles nonexistent:
+                *
+                *     Title.exist.set( ['File:Foo_bar.jpg', ...], false );
+                *
+                * @static
+                * @property exist.set
+                * @param {string|Array} titles Title(s) in strict prefixedDb title form
+                * @param {boolean} [state=true] State of the given titles
+                * @return {boolean}
+                */
+               set: function ( titles, state ) {
+                       titles = $.isArray( titles ) ? titles : [titles];
+                       state = state === undefined ? true : !!state;
+                       var pages = this.pages, i, len = titles.length;
+                       for ( i = 0; i < len; i++ ) {
+                               pages[ titles[i] ] = state;
+                       }
+                       return true;
+               }
+       };
+
+       /* Public members */
+
+       Title.prototype = {
+               constructor: Title,
+
+               /**
+                * Get the namespace number
+                *
+                * Example: 6 for "File:Example_image.svg".
+                *
+                * @return {number}
+                */
+               getNamespaceId: function () {
+                       return this.namespace;
+               },
+
+               /**
+                * Get the namespace prefix (in the content language)
+                *
+                * Example: "File:" for "File:Example_image.svg".
+                * In #NS_MAIN this is '', otherwise namespace name plus ':'
+                *
+                * @return {string}
+                */
+               getNamespacePrefix: function () {
+                       return this.namespace === NS_MAIN ?
+                               '' :
+                               ( mw.config.get( 'wgFormattedNamespaces' )[ this.namespace ].replace( / /g, '_' ) + ':' );
+               },
+
+               /**
+                * Get the page name without extension or namespace prefix
+                *
+                * Example: "Example_image" for "File:Example_image.svg".
+                *
+                * For the page title (full page name without namespace prefix), see #getMain.
+                *
+                * @return {string}
+                */
+               getName: function () {
+                       if ( $.inArray( this.namespace, mw.config.get( 'wgCaseSensitiveNamespaces' ) ) !== -1 ) {
+                               return this.title;
+                       } else {
+                               return $.ucFirst( this.title );
+                       }
+               },
+
+               /**
+                * Get the page name (transformed by #text)
+                *
+                * Example: "Example image" for "File:Example_image.svg".
+                *
+                * For the page title (full page name without namespace prefix), see #getMainText.
+                *
+                * @return {string}
+                */
+               getNameText: function () {
+                       return text( this.getName() );
+               },
+
+               /**
+                * Get the extension of the page name (if any)
+                *
+                * @return {string|null} Name extension or null if there is none
+                */
+               getExtension: function () {
+                       return this.ext;
+               },
+
+               /**
+                * Shortcut for appendable string to form the main page name.
+                *
+                * Returns a string like ".json", or "" if no extension.
+                *
+                * @return {string}
+                */
+               getDotExtension: function () {
+                       return this.ext === null ? '' : '.' + this.ext;
+               },
+
+               /**
+                * Get the main page name
+                *
+                * Example: "Example_image.svg" for "File:Example_image.svg".
+                *
+                * @return {string}
+                */
+               getMain: function () {
+                       return this.getName() + this.getDotExtension();
+               },
+
+               /**
+                * Get the main page name (transformed by #text)
+                *
+                * Example: "Example image.svg" for "File:Example_image.svg".
+                *
+                * @return {string}
+                */
+               getMainText: function () {
+                       return text( this.getMain() );
+               },
+
+               /**
+                * Get the full page name
+                *
+                * Example: "File:Example_image.svg".
+                * Most useful for API calls, anything that must identify the "title".
+                *
+                * @return {string}
+                */
+               getPrefixedDb: function () {
+                       return this.getNamespacePrefix() + this.getMain();
+               },
+
+               /**
+                * Get the full page name (transformed by #text)
+                *
+                * Example: "File:Example image.svg" for "File:Example_image.svg".
+                *
+                * @return {string}
+                */
+               getPrefixedText: function () {
+                       return text( this.getPrefixedDb() );
+               },
+
+               /**
+                * Get the fragment (if any).
+                *
+                * Note that this method (by design) does not include the hash character and
+                * the value is not url encoded.
+                *
+                * @return {string|null}
+                */
+               getFragment: function () {
+                       return this.fragment;
+               },
+
+               /**
+                * Get the URL to this title
+                *
+                * @see mw.util#getUrl
+                * @param {Object} [params] A mapping of query parameter names to values,
+                *     e.g. `{ action: 'edit' }`.
+                * @return {string}
+                */
+               getUrl: function ( params ) {
+                       return mw.util.getUrl( this.toString(), params );
+               },
+
+               /**
+                * Whether this title exists on the wiki.
+                *
+                * @see #static-method-exists
+                * @return {boolean|null} Boolean if the information is available, otherwise null
+                */
+               exists: function () {
+                       return Title.exists( this );
+               }
+       };
+
+       /**
+        * @alias #getPrefixedDb
+        * @method
+        */
+       Title.prototype.toString = Title.prototype.getPrefixedDb;
+
+       /**
+        * @alias #getPrefixedText
+        * @method
+        */
+       Title.prototype.toText = Title.prototype.getPrefixedText;
+
+       // Expose
+       mw.Title = Title;
+
+}( mediaWiki, jQuery ) );
diff --git a/resources/src/mediawiki/mediawiki.Uri.js b/resources/src/mediawiki/mediawiki.Uri.js
new file mode 100644 (file)
index 0000000..5566312
--- /dev/null
@@ -0,0 +1,403 @@
+/**
+ * Library for simple URI parsing and manipulation.
+ *
+ * Intended to be minimal, but featureful; do not expect full RFC 3986 compliance. The use cases we
+ * have in mind are constructing 'next page' or 'previous page' URLs, detecting whether we need to
+ * use cross-domain proxies for an API, constructing simple URL-based API calls, etc. Parsing here
+ * is regex-based, so may not work on all URIs, but is good enough for most.
+ *
+ * You can modify the properties directly, then use the #toString method to extract the full URI
+ * string again. Example:
+ *
+ *     var uri = new mw.Uri( 'http://example.com/mysite/mypage.php?quux=2' );
+ *
+ *     if ( uri.host == 'example.com' ) {
+ *         uri.host = 'foo.example.com';
+ *         uri.extend( { bar: 1 } );
+ *
+ *         $( 'a#id1' ).attr( 'href', uri );
+ *         // anchor with id 'id1' now links to http://foo.example.com/mysite/mypage.php?bar=1&quux=2
+ *
+ *         $( 'a#id2' ).attr( 'href', uri.clone().extend( { bar: 3, pif: 'paf' } ) );
+ *         // anchor with id 'id2' now links to http://foo.example.com/mysite/mypage.php?bar=3&quux=2&pif=paf
+ *     }
+ *
+ * Given a URI like
+ * `http://usr:pwd@www.example.com:81/dir/dir.2/index.htm?q1=0&&test1&test2=&test3=value+%28escaped%29&r=1&r=2#top`
+ * the returned object will have the following properties:
+ *
+ *     protocol  'http'
+ *     user      'usr'
+ *     password  'pwd'
+ *     host      'www.example.com'
+ *     port      '81'
+ *     path      '/dir/dir.2/index.htm'
+ *     query     {
+ *                   q1: '0',
+ *                   test1: null,
+ *                   test2: '',
+ *                   test3: 'value (escaped)'
+ *                   r: ['1', '2']
+ *               }
+ *     fragment  'top'
+ *
+ * (N.b., 'password' is technically not allowed for HTTP URIs, but it is possible with other kinds
+ * of URIs.)
+ *
+ * Parsing based on parseUri 1.2.2 (c) Steven Levithan <http://stevenlevithan.com>, MIT License.
+ * <http://stevenlevithan.com/demo/parseuri/js/>
+ *
+ * @class mw.Uri
+ */
+
+( function ( mw, $ ) {
+       /**
+        * Function that's useful when constructing the URI string -- we frequently encounter the pattern
+        * of having to add something to the URI as we go, but only if it's present, and to include a
+        * character before or after if so.
+        *
+        * @private
+        * @static
+        * @param {string|undefined} pre To prepend
+        * @param {string} val To include
+        * @param {string} post To append
+        * @param {boolean} raw If true, val will not be encoded
+        * @return {string} Result
+        */
+       function cat( pre, val, post, raw ) {
+               if ( val === undefined || val === null || val === '' ) {
+                       return '';
+               }
+               return pre + ( raw ? val : mw.Uri.encode( val ) ) + post;
+       }
+
+       /**
+        * Regular expressions to parse many common URIs.
+        *
+        * @private
+        * @static
+        * @property {Object} parser
+        */
+       var parser = {
+               strict: /^(?:([^:\/?#]+):)?(?:\/\/(?:(?:([^:@\/?#]*)(?::([^:@\/?#]*))?)?@)?([^:\/?#]*)(?::(\d*))?)?((?:[^?#\/]*\/)*[^?#]*)(?:\?([^#]*))?(?:#(.*))?/,
+               loose:  /^(?:(?![^:@]+:[^:@\/]*@)([^:\/?#.]+):)?(?:\/\/)?(?:(?:([^:@\/?#]*)(?::([^:@\/?#]*))?)?@)?([^:\/?#]*)(?::(\d*))?((?:\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?[^?#\/]*)(?:\?([^#]*))?(?:#(.*))?/
+       },
+
+       /**
+        * The order here matches the order of captured matches in the `parser` property regexes.
+        *
+        * @private
+        * @static
+        * @property {Array} properties
+        */
+       properties = [
+               'protocol',
+               'user',
+               'password',
+               'host',
+               'port',
+               'path',
+               'query',
+               'fragment'
+       ];
+
+       /**
+        * @property {string} protocol For example `http` (always present)
+        */
+       /**
+        * @property {string|undefined} user For example `usr`
+        */
+       /**
+        * @property {string|undefined} password For example `pwd`
+        */
+       /**
+        * @property {string} host For example `www.example.com` (always present)
+        */
+       /**
+        * @property {string|undefined} port For example `81`
+        */
+       /**
+        * @property {string} path For example `/dir/dir.2/index.htm` (always present)
+        */
+       /**
+        * @property {Object} query For example `{ a: '0', b: '', c: 'value' }` (always present)
+        */
+       /**
+        * @property {string|undefined} fragment For example `top`
+        */
+
+       /**
+        * A factory method to create a variation of mw.Uri with a different default location (for
+        * relative URLs, including protocol-relative URLs). Used so the library is still testable &
+        * purely functional.
+        *
+        * @method
+        * @member mw
+        */
+       mw.UriRelative = function ( documentLocation ) {
+               var defaultUri;
+
+               /**
+                * @class mw.Uri
+                * @constructor
+                *
+                * Construct a new URI object. Throws error if arguments are illegal/impossible, or
+                * otherwise don't parse.
+                *
+                * @param {Object|string} [uri] URI string, or an Object with appropriate properties (especially
+                *  another URI object to clone). Object must have non-blank `protocol`, `host`, and `path`
+                *  properties. If omitted (or set to `undefined`, `null` or empty string), then an object
+                *  will be created for the default `uri` of this constructor (`document.location` for
+                *  mw.Uri, other values for other instances -- see mw.UriRelative for details).
+                * @param {Object|boolean} [options] Object with options, or (backwards compatibility) a boolean
+                *  for strictMode
+                * @param {boolean} [options.strictMode=false] Trigger strict mode parsing of the url.
+                * @param {boolean} [options.overrideKeys=false] Whether to let duplicate query parameters
+                *  override each other (`true`) or automagically convert them to an array (`false`).
+                */
+               function Uri( uri, options ) {
+                       options = typeof options === 'object' ? options : { strictMode: !!options };
+                       options = $.extend( {
+                               strictMode: false,
+                               overrideKeys: false
+                       }, options );
+
+                       if ( uri !== undefined && uri !== null && uri !== '' ) {
+                               if ( typeof uri === 'string' ) {
+                                       this.parse( uri, options );
+                               } else if ( typeof uri === 'object' ) {
+                                       // Copy data over from existing URI object
+                                       for ( var prop in uri ) {
+                                               // Only copy direct properties, not inherited ones
+                                               if ( uri.hasOwnProperty( prop ) ) {
+                                                       // Deep copy object properties
+                                                       if ( $.isArray( uri[prop] ) || $.isPlainObject( uri[prop] ) ) {
+                                                               this[prop] = $.extend( true, {}, uri[prop] );
+                                                       } else {
+                                                               this[prop] = uri[prop];
+                                                       }
+                                               }
+                                       }
+                                       if ( !this.query ) {
+                                               this.query = {};
+                                       }
+                               }
+                       } else {
+                               // If we didn't get a URI in the constructor, use the default one.
+                               return defaultUri.clone();
+                       }
+
+                       // protocol-relative URLs
+                       if ( !this.protocol ) {
+                               this.protocol = defaultUri.protocol;
+                       }
+                       // No host given:
+                       if ( !this.host ) {
+                               this.host = defaultUri.host;
+                               // port ?
+                               if ( !this.port ) {
+                                       this.port = defaultUri.port;
+                               }
+                       }
+                       if ( this.path && this.path.charAt( 0 ) !== '/' ) {
+                               // A real relative URL, relative to defaultUri.path. We can't really handle that since we cannot
+                               // figure out whether the last path component of defaultUri.path is a directory or a file.
+                               throw new Error( 'Bad constructor arguments' );
+                       }
+                       if ( !( this.protocol && this.host && this.path ) ) {
+                               throw new Error( 'Bad constructor arguments' );
+                       }
+               }
+
+               /**
+                * Encode a value for inclusion in a url.
+                *
+                * Standard encodeURIComponent, with extra stuff to make all browsers work similarly and more
+                * compliant with RFC 3986. Similar to rawurlencode from PHP and our JS library
+                * mw.util.rawurlencode, except this also replaces spaces with `+`.
+                *
+                * @static
+                * @param {string} s String to encode
+                * @return {string} Encoded string for URI
+                */
+               Uri.encode = function ( s ) {
+                       return encodeURIComponent( s )
+                               .replace( /!/g, '%21' ).replace( /'/g, '%27' ).replace( /\(/g, '%28' )
+                               .replace( /\)/g, '%29' ).replace( /\*/g, '%2A' )
+                               .replace( /%20/g, '+' );
+               };
+
+               /**
+                * Decode a url encoded value.
+                *
+                * Reversed #encode. Standard decodeURIComponent, with addition of replacing
+                * `+` with a space.
+                *
+                * @static
+                * @param {string} s String to decode
+                * @return {string} Decoded string
+                */
+               Uri.decode = function ( s ) {
+                       return decodeURIComponent( s.replace( /\+/g, '%20' ) );
+               };
+
+               Uri.prototype = {
+
+                       /**
+                        * Parse a string and set our properties accordingly.
+                        *
+                        * @private
+                        * @param {string} str URI, see constructor.
+                        * @param {Object} options See constructor.
+                        */
+                       parse: function ( str, options ) {
+                               var q, matches,
+                                       uri = this;
+
+                               // Apply parser regex and set all properties based on the result
+                               matches = parser[ options.strictMode ? 'strict' : 'loose' ].exec( str );
+                               $.each( properties, function ( i, property ) {
+                                       uri[ property ] = matches[ i + 1 ];
+                               } );
+
+                               // uri.query starts out as the query string; we will parse it into key-val pairs then make
+                               // that object the "query" property.
+                               // we overwrite query in uri way to make cloning easier, it can use the same list of properties.
+                               q = {};
+                               // using replace to iterate over a string
+                               if ( uri.query ) {
+                                       uri.query.replace( /(?:^|&)([^&=]*)(?:(=)([^&]*))?/g, function ( $0, $1, $2, $3 ) {
+                                               var k, v;
+                                               if ( $1 ) {
+                                                       k = Uri.decode( $1 );
+                                                       v = ( $2 === '' || $2 === undefined ) ? null : Uri.decode( $3 );
+
+                                                       // If overrideKeys, always (re)set top level value.
+                                                       // If not overrideKeys but this key wasn't set before, then we set it as well.
+                                                       if ( options.overrideKeys || q[ k ] === undefined ) {
+                                                               q[ k ] = v;
+
+                                                       // Use arrays if overrideKeys is false and key was already seen before
+                                                       } else {
+                                                               // Once before, still a string, turn into an array
+                                                               if ( typeof q[ k ] === 'string' ) {
+                                                                       q[ k ] = [ q[ k ] ];
+                                                               }
+                                                               // Add to the array
+                                                               if ( $.isArray( q[ k ] ) ) {
+                                                                       q[ k ].push( v );
+                                                               }
+                                                       }
+                                               }
+                                       } );
+                               }
+                               uri.query = q;
+                       },
+
+                       /**
+                        * Get user and password section of a URI.
+                        *
+                        * @return {string}
+                        */
+                       getUserInfo: function () {
+                               return cat( '', this.user, cat( ':', this.password, '' ) );
+                       },
+
+                       /**
+                        * Get host and port section of a URI.
+                        *
+                        * @return {string}
+                        */
+                       getHostPort: function () {
+                               return this.host + cat( ':', this.port, '' );
+                       },
+
+                       /**
+                        * Get the userInfo, host and port section of the URI.
+                        *
+                        * In most real-world URLs this is simply the hostname, but the definition of 'authority' section is more general.
+                        *
+                        * @return {string}
+                        */
+                       getAuthority: function () {
+                               return cat( '', this.getUserInfo(), '@' ) + this.getHostPort();
+                       },
+
+                       /**
+                        * Get the query arguments of the URL, encoded into a string.
+                        *
+                        * Does not preserve the original order of arguments passed in the URI. Does handle escaping.
+                        *
+                        * @return {string}
+                        */
+                       getQueryString: function () {
+                               var args = [];
+                               $.each( this.query, function ( key, val ) {
+                                       var k = Uri.encode( key ),
+                                               vals = $.isArray( val ) ? val : [ val ];
+                                       $.each( vals, function ( i, v ) {
+                                               if ( v === null ) {
+                                                       args.push( k );
+                                               } else if ( k === 'title' ) {
+                                                       args.push( k + '=' + mw.util.wikiUrlencode( v ) );
+                                               } else {
+                                                       args.push( k + '=' + Uri.encode( v ) );
+                                               }
+                                       } );
+                               } );
+                               return args.join( '&' );
+                       },
+
+                       /**
+                        * Get everything after the authority section of the URI.
+                        *
+                        * @return {string}
+                        */
+                       getRelativePath: function () {
+                               return this.path + cat( '?', this.getQueryString(), '', true ) + cat( '#', this.fragment, '' );
+                       },
+
+                       /**
+                        * Get the entire URI string.
+                        *
+                        * May not be precisely the same as input due to order of query arguments.
+                        *
+                        * @return {string} The URI string
+                        */
+                       toString: function () {
+                               return this.protocol + '://' + this.getAuthority() + this.getRelativePath();
+                       },
+
+                       /**
+                        * Clone this URI
+                        *
+                        * @return {Object} New URI object with same properties
+                        */
+                       clone: function () {
+                               return new Uri( this );
+                       },
+
+                       /**
+                        * Extend the query section of the URI with new parameters.
+                        *
+                        * @param {Object} parameters Query parameters to add to ours (or to override ours with) as an
+                        *  object
+                        * @return {Object} This URI object
+                        */
+                       extend: function ( parameters ) {
+                               $.extend( this.query, parameters );
+                               return this;
+                       }
+               };
+
+               defaultUri = new Uri( documentLocation );
+
+               return Uri;
+       };
+
+       // If we are running in a browser, inject the current document location (for relative URLs).
+       if ( document && document.location && document.location.href ) {
+               mw.Uri = mw.UriRelative( document.location.href );
+       }
+
+}( mediaWiki, jQuery ) );
diff --git a/resources/src/mediawiki/mediawiki.debug.init.js b/resources/src/mediawiki/mediawiki.debug.init.js
new file mode 100644 (file)
index 0000000..0f85e80
--- /dev/null
@@ -0,0 +1,3 @@
+jQuery( function () {
+       mediaWiki.Debug.init();
+} );
diff --git a/resources/src/mediawiki/mediawiki.debug.js b/resources/src/mediawiki/mediawiki.debug.js
new file mode 100644 (file)
index 0000000..f56f0d9
--- /dev/null
@@ -0,0 +1,388 @@
+( function ( mw, $ ) {
+       'use strict';
+
+       var debug,
+               hovzer = $.getFootHovzer();
+
+       /**
+        * Debug toolbar.
+        *
+        * Enabled server-side through `$wgDebugToolbar`.
+        *
+        * @class mw.Debug
+        * @singleton
+        * @author John Du Hart
+        * @since 1.19
+        */
+       debug = mw.Debug = {
+               /**
+                * Toolbar container element
+                *
+                * @property {jQuery}
+                */
+               $container: null,
+
+               /**
+                * Object containing data for the debug toolbar
+                *
+                * @property {Object}
+                */
+               data: {},
+
+               /**
+                * Initialize the debugging pane
+                *
+                * Shouldn't be called before the document is ready
+                * (since it binds to elements on the page).
+                *
+                * @param {Object} [data] Defaults to 'debugInfo' from mw.config
+                */
+               init: function ( data ) {
+
+                       this.data = data || mw.config.get( 'debugInfo' );
+                       this.buildHtml();
+
+                       // Insert the container into the DOM
+                       hovzer.$.append( this.$container );
+                       hovzer.update();
+
+                       $( '.mw-debug-panelink' ).click( this.switchPane );
+               },
+
+               /**
+                * Switch between panes
+                *
+                * Should be called with an HTMLElement as its thisArg,
+                * because it's meant to be an event handler.
+                *
+                * TODO: Store cookie for last pane open.
+                *
+                * @param {jQuery.Event} e
+                */
+               switchPane: function ( e ) {
+                       var currentPaneId = debug.$container.data( 'currentPane' ),
+                               requestedPaneId = $( this ).prop( 'id' ).substr( 9 ),
+                               $currentPane = $( '#mw-debug-pane-' + currentPaneId ),
+                               $requestedPane = $( '#mw-debug-pane-' + requestedPaneId ),
+                               hovDone = false;
+
+                       function updateHov() {
+                               if ( !hovDone ) {
+                                       hovzer.update();
+                                       hovDone = true;
+                               }
+                       }
+
+                       // Skip hash fragment handling. Prevents screen from jumping.
+                       e.preventDefault();
+
+                       $( this ).addClass( 'current ' );
+                       $( '.mw-debug-panelink' ).not( this ).removeClass( 'current ' );
+
+                       // Hide the current pane
+                       if ( requestedPaneId === currentPaneId ) {
+                               $currentPane.slideUp( updateHov );
+                               debug.$container.data( 'currentPane', null );
+                               return;
+                       }
+
+                       debug.$container.data( 'currentPane', requestedPaneId );
+
+                       if ( currentPaneId === undefined || currentPaneId === null ) {
+                               $requestedPane.slideDown( updateHov );
+                       } else {
+                               $currentPane.hide();
+                               $requestedPane.show();
+                               updateHov();
+                       }
+               },
+
+               /**
+                * Construct the HTML for the debugging toolbar
+                */
+               buildHtml: function () {
+                       var $container, $bits, panes, id, gitInfo;
+
+                       $container = $( '<div id="mw-debug-toolbar" class="mw-debug" lang="en" dir="ltr"></div>' );
+
+                       $bits = $( '<div class="mw-debug-bits"></div>' );
+
+                       /**
+                        * Returns a jQuery element for a debug-bit div
+                        *
+                        * @ignore
+                        * @param {string} id
+                        * @return {jQuery}
+                        */
+                       function bitDiv( id ) {
+                               return $( '<div>' ).prop( {
+                                       id: 'mw-debug-' + id,
+                                       className: 'mw-debug-bit'
+                               } )
+                               .appendTo( $bits );
+                       }
+
+                       /**
+                        * Returns a jQuery element for a pane link
+                        *
+                        * @ignore
+                        * @param {string} id
+                        * @param {string} text
+                        * @return {jQuery}
+                        */
+                       function paneLabel( id, text ) {
+                               return $( '<a>' )
+                                       .prop( {
+                                               className: 'mw-debug-panelabel',
+                                               href: '#mw-debug-pane-' + id
+                                       } )
+                                       .text( text );
+                       }
+
+                       /**
+                        * Returns a jQuery element for a debug-bit div with a for a pane link
+                        *
+                        * @ignore
+                        * @param {string} id CSS id snippet. Will be prefixed with 'mw-debug-'
+                        * @param {string} text Text to show
+                        * @param {string} count Optional count to show
+                        * @return {jQuery}
+                        */
+                       function paneTriggerBitDiv( id, text, count ) {
+                               if ( count ) {
+                                       text = text + ' (' + count + ')';
+                               }
+                               return $( '<div>' ).prop( {
+                                       id: 'mw-debug-' + id,
+                                       className: 'mw-debug-bit mw-debug-panelink'
+                               } )
+                               .append( paneLabel( id, text ) )
+                               .appendTo( $bits );
+                       }
+
+                       paneTriggerBitDiv( 'console', 'Console', this.data.log.length );
+
+                       paneTriggerBitDiv( 'querylist', 'Queries', this.data.queries.length );
+
+                       paneTriggerBitDiv( 'debuglog', 'Debug log', this.data.debugLog.length );
+
+                       paneTriggerBitDiv( 'request', 'Request' );
+
+                       paneTriggerBitDiv( 'includes', 'PHP includes', this.data.includes.length );
+
+                       paneTriggerBitDiv( 'profile', 'Profile', this.data.profile.length );
+
+                       gitInfo = '';
+                       if ( this.data.gitRevision !== false ) {
+                               gitInfo = '(' + this.data.gitRevision.substring( 0, 7 ) + ')';
+                               if ( this.data.gitViewUrl !== false ) {
+                                       gitInfo = $( '<a>' )
+                                               .attr( 'href', this.data.gitViewUrl )
+                                               .text( gitInfo );
+                               }
+                       }
+
+                       bitDiv( 'mwversion' )
+                               .append( $( '<a href="//www.mediawiki.org/">MediaWiki</a>' ) )
+                               .append( document.createTextNode( ': ' + this.data.mwVersion + ' ' ) )
+                               .append( gitInfo );
+
+                       if ( this.data.gitBranch !== false ) {
+                               bitDiv( 'gitbranch' ).text( 'Git branch: ' + this.data.gitBranch );
+                       }
+
+                       bitDiv( 'phpversion' )
+                               .append( $( '<a href="//www.php.net/"></a>' ).text( 'PHP' ) )
+                               .append( ': ' + this.data.phpVersion );
+
+                       bitDiv( 'time' )
+                               .text( 'Time: ' + this.data.time.toFixed( 5 ) );
+
+                       bitDiv( 'memory' )
+                               .text( 'Memory: ' + this.data.memory + ' (Peak: ' + this.data.memoryPeak + ')' );
+
+                       $bits.appendTo( $container );
+
+                       panes = {
+                               console: this.buildConsoleTable(),
+                               querylist: this.buildQueryTable(),
+                               debuglog: this.buildDebugLogTable(),
+                               request: this.buildRequestPane(),
+                               includes: this.buildIncludesPane(),
+                               profile: this.buildProfilePane()
+                       };
+
+                       for ( id in panes ) {
+                               if ( !panes.hasOwnProperty( id ) ) {
+                                       continue;
+                               }
+
+                               $( '<div>' )
+                                       .prop( {
+                                               className: 'mw-debug-pane',
+                                               id: 'mw-debug-pane-' + id
+                                       } )
+                                       .append( panes[id] )
+                                       .appendTo( $container );
+                       }
+
+                       this.$container = $container;
+               },
+
+               /**
+                * Build the console panel
+                */
+               buildConsoleTable: function () {
+                       var $table, entryTypeText, i, length, entry;
+
+                       $table = $( '<table id="mw-debug-console">' );
+
+                       $( '<colgroup>' ).css( 'width', /* padding = */ 20 + ( 10 * /* fontSize = */ 11 ) ).appendTo( $table );
+                       $( '<colgroup>' ).appendTo( $table );
+                       $( '<colgroup>' ).css( 'width', 350 ).appendTo( $table );
+
+                       entryTypeText = function ( entryType ) {
+                               switch ( entryType ) {
+                                       case 'log':
+                                               return 'Log';
+                                       case 'warn':
+                                               return 'Warning';
+                                       case 'deprecated':
+                                               return 'Deprecated';
+                                       default:
+                                               return 'Unknown';
+                               }
+                       };
+
+                       for ( i = 0, length = this.data.log.length; i < length; i += 1 ) {
+                               entry = this.data.log[i];
+                               entry.typeText = entryTypeText( entry.type );
+
+                               $( '<tr>' )
+                                       .append( $( '<td>' )
+                                               .text( entry.typeText )
+                                               .addClass( 'mw-debug-console-' + entry.type )
+                                       )
+                                       .append( $( '<td>' ).html( entry.msg ) )
+                                       .append( $( '<td>' ).text( entry.caller ) )
+                                       .appendTo( $table );
+                       }
+
+                       return $table;
+               },
+
+               /**
+                * Build query list pane
+                *
+                * @return {jQuery}
+                */
+               buildQueryTable: function () {
+                       var $table, i, length, query;
+
+                       $table = $( '<table id="mw-debug-querylist"></table>' );
+
+                       $( '<tr>' )
+                               .append( $( '<th>#</th>' ).css( 'width', '4em' )    )
+                               .append( $( '<th>SQL</th>' ) )
+                               .append( $( '<th>Time</th>' ).css( 'width', '8em'  ) )
+                               .append( $( '<th>Call</th>' ).css( 'width', '18em' ) )
+                       .appendTo( $table );
+
+                       for ( i = 0, length = this.data.queries.length; i < length; i += 1 ) {
+                               query = this.data.queries[i];
+
+                               $( '<tr>' )
+                                       .append( $( '<td>' ).text( i + 1 ) )
+                                       .append( $( '<td>' ).text( query.sql ) )
+                                       .append( $( '<td class="stats">' ).text( ( query.time * 1000 ).toFixed( 4 ) + 'ms' ) )
+                                       .append( $( '<td>' ).text( query['function'] ) )
+                               .appendTo( $table );
+                       }
+
+                       return $table;
+               },
+
+               /**
+                * Build legacy debug log pane
+                *
+                * @return {jQuery}
+                */
+               buildDebugLogTable: function () {
+                       var $list, i, length, line;
+                       $list = $( '<ul>' );
+
+                       for ( i = 0, length = this.data.debugLog.length; i < length; i += 1 ) {
+                               line = this.data.debugLog[i];
+                               $( '<li>' )
+                                       .html( mw.html.escape( line ).replace( /\n/g, '<br />\n' ) )
+                                       .appendTo( $list );
+                       }
+
+                       return $list;
+               },
+
+               /**
+                * Build request information pane
+                *
+                * @return {jQuery}
+                */
+               buildRequestPane: function () {
+
+                       function buildTable( title, data ) {
+                               var $unit, $table, key;
+
+                               $unit = $( '<div>' ).append( $( '<h2>' ).text( title ) );
+
+                               $table = $( '<table>' ).appendTo( $unit );
+
+                               $( '<tr>' )
+                                       .html( '<th>Key</th><th>Value</th>' )
+                                       .appendTo( $table );
+
+                               for ( key in data ) {
+                                       if ( !data.hasOwnProperty( key ) ) {
+                                               continue;
+                                       }
+
+                                       $( '<tr>' )
+                                               .append( $( '<th>' ).text( key ) )
+                                               .append( $( '<td>' ).text( data[key] ) )
+                                               .appendTo( $table );
+                               }
+
+                               return $unit;
+                       }
+
+                       return $( '<div>' )
+                               .text( this.data.request.method + ' ' + this.data.request.url )
+                               .append( buildTable( 'Headers', this.data.request.headers ) )
+                               .append( buildTable( 'Parameters', this.data.request.params ) );
+               },
+
+               /**
+                * Build included files pane
+                *
+                * @return {jQuery}
+                */
+               buildIncludesPane: function () {
+                       var $table, i, length, file;
+
+                       $table = $( '<table>' );
+
+                       for ( i = 0, length = this.data.includes.length; i < length; i += 1 ) {
+                               file = this.data.includes[i];
+                               $( '<tr>' )
+                                       .append( $( '<td>' ).text( file.name ) )
+                                       .append( $( '<td class="nr">' ).text( file.size ) )
+                                       .appendTo( $table );
+                       }
+
+                       return $table;
+               },
+
+               buildProfilePane: function () {
+                       return mw.Debug.profile.init();
+               }
+       };
+
+}( mediaWiki, jQuery ) );
diff --git a/resources/src/mediawiki/mediawiki.debug.less b/resources/src/mediawiki/mediawiki.debug.less
new file mode 100644 (file)
index 0000000..949c558
--- /dev/null
@@ -0,0 +1,189 @@
+.mw-debug {
+       width: 100%;
+       background-color: #eee;
+       border-top: 1px solid #aaa;
+
+       pre {
+               font-size: 11px;
+               padding: 0;
+               margin: 0;
+               background: none;
+               border: none;
+       }
+
+       table {
+               border-spacing: 0;
+               width: 100%;
+               table-layout: fixed;
+
+               td,
+               th {
+                       padding: 4px 10px;
+               }
+
+               td {
+                       border-bottom: 1px solid #eee;
+                       word-wrap: break-word;
+
+                       &.nr {
+                               text-align: right;
+                       }
+
+                       span.stats {
+                               color: #808080;
+                       }
+               }
+
+               tr {
+                       background-color: #fff;
+
+                       &:nth-child(even) {
+                               background-color: #f9f9f9;
+                       }
+               }
+       }
+
+       ul {
+               margin: 0;
+               list-style: none;
+       }
+
+       li {
+               padding: 4px 0;
+               width: 100%;
+       }
+}
+
+.mw-debug-bits {
+       text-align: center;
+       border-bottom: 1px solid #aaa;
+}
+
+.mw-debug-bit {
+       display: inline-block;
+       padding: 10px 5px;
+       font-size: 13px;
+       /* IE-hack for display: inline-block */
+       zoom: 1;
+       *display:inline;
+}
+
+.mw-debug-panelink {
+       background-color: #eee;
+       border-right: 1px solid #ccc;
+
+       &:first-child {
+               border-left: 1px solid #ccc;
+       }
+
+       &:hover {
+               background-color: #fefefe;
+               cursor: pointer;
+       }
+
+       &.current {
+               background-color: #dedede;
+       }
+}
+
+a.mw-debug-panelabel,
+a.mw-debug-panelabel:visited {
+       color: #000;
+}
+
+.mw-debug-pane {
+       height: 300px;
+       overflow: scroll;
+       display: none;
+       font-size: 11px;
+       background-color: #e1eff2;
+       box-sizing: border-box;
+}
+
+#mw-debug-pane-debuglog,
+#mw-debug-pane-request {
+       padding: 20px;
+}
+
+#mw-debug-pane-request {
+       table {
+               width: 100%;
+               margin: 10px 0 30px;
+       }
+
+       tr,
+       th,
+       td,
+       table {
+               border: 1px solid #D0DBB3;
+               border-collapse: collapse;
+               margin: 0;
+       }
+
+       th,
+       td {
+               font-size: 12px;
+               padding: 8px 10px;
+       }
+
+       th {
+               background-color: #F1F7E2;
+               font-weight: bold;
+       }
+
+       td {
+               background-color: white;
+       }
+}
+
+#mw-debug-console tr td {
+       &:first-child {
+               font-weight: bold;
+               vertical-align: top;
+       }
+
+       &:last-child {
+               vertical-align: top;
+       }
+}
+
+.mw-debug-backtrace {
+       padding: 5px 10px;
+       margin: 5px;
+       background-color: #dedede;
+
+       span {
+               font-weight: bold;
+               color: #111;
+       }
+
+       ul {
+               padding-left: 10px;
+       }
+
+       li {
+               width: auto;
+               padding: 0;
+               color: #333;
+               font-size: 10px;
+               margin-bottom: 0;
+               line-height: 1em;
+       }
+}
+
+.mw-debug-console-log {
+       background-color: #add8e6;
+}
+
+.mw-debug-console-warn {
+       background-color: #ffa07a;
+}
+
+.mw-debug-console-deprecated {
+       background-color: #ffb6c1;
+}
+
+/* Cheapo hack to hide the first 3 lines of the backtrace */
+.mw-debug-backtrace li:nth-child(-n+3) {
+       display: none;
+}
diff --git a/resources/src/mediawiki/mediawiki.debug.profile.css b/resources/src/mediawiki/mediawiki.debug.profile.css
new file mode 100644 (file)
index 0000000..bf49d1a
--- /dev/null
@@ -0,0 +1,46 @@
+
+.mw-debug-profile-tipsy .tipsy-inner {
+       /* undo max-width from vector on .tipsy-inner */
+       max-width: none;
+       /* needed for some browsers to provide space for the scrollbar without wrapping text */
+       min-width: 100%;
+       max-height: 150px;
+       overflow-y: auto;
+}
+
+.mw-debug-profile-underline {
+       stroke-width: 1;
+       stroke: #dfdfdf;
+}
+
+.mw-debug-profile-period {
+       fill: red;
+}
+
+/* connecting line between endpoints on long events */
+.mw-debug-profile-period line {
+       stroke: red;
+       stroke-width: 2;
+}
+
+.mw-debug-profile-tipsy,
+.mw-debug-profile-timeline text {
+       color: #444;
+       fill: #444;
+       /* using em's causes the two locations to have different sizes */
+       font-size: 12px;
+       font-family: sans-serif;
+}
+
+.mw-debug-profile-meta,
+.mw-debug-profile-timeline tspan {
+       /* using em's causes the two locations to have different sizes */
+       font-size: 10px;
+}
+
+.mw-debug-profile-no-data {
+       text-align: center;
+       padding-top: 5em;
+       font-weight: bold;
+       font-size: 1.2em;
+}
diff --git a/resources/src/mediawiki/mediawiki.debug.profile.js b/resources/src/mediawiki/mediawiki.debug.profile.js
new file mode 100644 (file)
index 0000000..2b8f881
--- /dev/null
@@ -0,0 +1,549 @@
+/*!
+ * JavaScript for the debug toolbar profiler, enabled through $wgDebugToolbar
+ * and StartProfiler.php.
+ *
+ * @author Erik Bernhardson
+ * @since 1.23
+ */
+
+( function ( mw, $ ) {
+       'use strict';
+
+       /**
+        * @singleton
+        * @class mw.Debug.profile
+        */
+       var profile = mw.Debug.profile = {
+               /**
+                * Object containing data for the debug toolbar
+                *
+                * @property ProfileData
+                */
+               data: null,
+
+               /**
+                * @property DOMElement
+                */
+               container: null,
+
+               /**
+                * Initializes the profiling pane.
+                */
+               init: function ( data, width, mergeThresholdPx, dropThresholdPx ) {
+                       data = data || mw.config.get( 'debugInfo' ).profile;
+                       profile.width = width || $(window).width() - 20;
+                       // merge events from same pixel(some events are very granular)
+                       mergeThresholdPx = mergeThresholdPx || 2;
+                       // only drop events if requested
+                       dropThresholdPx = dropThresholdPx || 0;
+
+                       if ( !Array.prototype.map || !Array.prototype.reduce || !Array.prototype.filter ) {
+                               profile.container = profile.buildRequiresES5();
+                       } else if ( data.length === 0 ) {
+                               profile.container = profile.buildNoData();
+                       } else {
+                               // generate a flyout
+                               profile.data = new ProfileData( data, profile.width, mergeThresholdPx, dropThresholdPx );
+                               // draw it
+                               profile.container = profile.buildSvg( profile.container );
+                               profile.attachFlyout();
+                       }
+
+                       return profile.container;
+               },
+
+               buildRequiresES5: function () {
+                       return $( '<div>' )
+                               .text( 'An ES5 compatible javascript engine is required for the profile visualization.' )
+                               .get( 0 );
+               },
+
+               buildNoData: function () {
+                       return $( '<div>' ).addClass( 'mw-debug-profile-no-data' )
+                               .text( 'No events recorded, ensure profiling is enabled in StartProfiler.php.' )
+                               .get( 0 );
+               },
+
+               /**
+                * Creates DOM nodes appropriately namespaced for SVG.
+                *
+                * @param string tag to create
+                * @return DOMElement
+                */
+               createSvgElement: document.createElementNS
+                       ? document.createElementNS.bind( document, 'http://www.w3.org/2000/svg' )
+                       // throw a error for browsers which does not support document.createElementNS (IE<8)
+                       : function () { throw new Error( 'document.createElementNS not supported' ); },
+
+               /**
+                * @param DOMElement|undefined
+                */
+               buildSvg: function ( node ) {
+                       var container, group, i, g,
+                               timespan = profile.data.timespan,
+                               gapPerEvent = 38,
+                               space = 10.5,
+                               currentHeight = space,
+                               totalHeight = 0;
+
+                       profile.ratio = ( profile.width - space * 2 ) / ( timespan.end - timespan.start );
+                       totalHeight += gapPerEvent * profile.data.groups.length;
+
+                       if ( node ) {
+                               $( node ).empty();
+                       } else {
+                               node = profile.createSvgElement( 'svg' );
+                               node.setAttribute( 'version', '1.2' );
+                               node.setAttribute( 'baseProfile', 'tiny' );
+                       }
+                       node.style.height = totalHeight;
+                       node.style.width = profile.width;
+
+                       // use a container that can be transformed
+                       container = profile.createSvgElement( 'g' );
+                       node.appendChild( container );
+
+                       for ( i = 0; i < profile.data.groups.length; i++ ) {
+                               group = profile.data.groups[i];
+                               g = profile.buildTimeline( group );
+
+                               g.setAttribute( 'transform', 'translate( 0 ' + currentHeight + ' )' );
+                               container.appendChild( g );
+
+                               currentHeight += gapPerEvent;
+                       }
+
+                       return node;
+               },
+
+               /**
+                * @param Object group of periods to transform into graphics
+                */
+               buildTimeline: function ( group ) {
+                       var text, tspan, line, i,
+                               sum = group.timespan.sum,
+                               ms = ' ~ ' + ( sum < 1 ? sum.toFixed( 2 ) : sum.toFixed( 0 ) ) + ' ms',
+                               timeline = profile.createSvgElement( 'g' );
+
+                       timeline.setAttribute( 'class', 'mw-debug-profile-timeline' );
+
+                       // draw label
+                       text = profile.createSvgElement( 'text' );
+                       text.setAttribute( 'x', profile.xCoord( group.timespan.start ) );
+                       text.setAttribute( 'y', 0 );
+                       text.textContent = group.name;
+                       timeline.appendChild( text );
+
+                       // draw metadata
+                       tspan = profile.createSvgElement( 'tspan' );
+                       tspan.textContent = ms;
+                       text.appendChild( tspan );
+
+                       // draw timeline periods
+                       for ( i = 0; i < group.periods.length; i++ ) {
+                               timeline.appendChild( profile.buildPeriod( group.periods[i] ) );
+                       }
+
+                       // full-width line under each timeline
+                       line = profile.createSvgElement( 'line' );
+                       line.setAttribute( 'class', 'mw-debug-profile-underline' );
+                       line.setAttribute( 'x1', 0 );
+                       line.setAttribute( 'y1', 28 );
+                       line.setAttribute( 'x2', profile.width );
+                       line.setAttribute( 'y2', 28 );
+                       timeline.appendChild( line );
+
+                       return timeline;
+               },
+
+               /**
+                * @param Object period to transform into graphics
+                */
+               buildPeriod: function ( period ) {
+                       var node,
+                               head = profile.xCoord( period.start ),
+                               tail = profile.xCoord( period.end ),
+                               g = profile.createSvgElement( 'g' );
+
+                       g.setAttribute( 'class', 'mw-debug-profile-period' );
+                       $( g ).data( 'period', period );
+
+                       if ( head + 16 > tail ) {
+                               node = profile.createSvgElement( 'rect' );
+                               node.setAttribute( 'x', head );
+                               node.setAttribute( 'y', 8 );
+                               node.setAttribute( 'width', 2 );
+                               node.setAttribute( 'height', 9 );
+                               g.appendChild( node );
+
+                               node = profile.createSvgElement( 'rect' );
+                               node.setAttribute( 'x', head );
+                               node.setAttribute( 'y', 8 );
+                               node.setAttribute( 'width', ( period.end - period.start ) * profile.ratio || 2 );
+                               node.setAttribute( 'height', 6 );
+                               g.appendChild( node );
+                       } else {
+                               node = profile.createSvgElement( 'polygon' );
+                               node.setAttribute( 'points', pointList( [
+                                       [ head, 8 ],
+                                       [ head, 19 ],
+                                       [ head + 8, 8 ],
+                                       [ head, 8]
+                               ] ) );
+                               g.appendChild( node );
+
+                               node = profile.createSvgElement( 'polygon' );
+                               node.setAttribute( 'points', pointList( [
+                                       [ tail, 8 ],
+                                       [ tail, 19 ],
+                                       [ tail - 8, 8 ],
+                                       [ tail, 8 ]
+                               ] ) );
+                               g.appendChild( node );
+
+                               node = profile.createSvgElement( 'line' );
+                               node.setAttribute( 'x1', head );
+                               node.setAttribute( 'y1', 9 );
+                               node.setAttribute( 'x2', tail );
+                               node.setAttribute( 'y2', 9 );
+                               g.appendChild( node );
+                       }
+
+                       return g;
+               },
+
+               /**
+                * @param Object
+                */
+               buildFlyout: function ( period ) {
+                       var contained, sum, ms, mem, i,
+                               node = $( '<div>' );
+
+                       for ( i = 0; i < period.contained.length; i++ ) {
+                               contained = period.contained[i];
+                               sum = contained.end - contained.start;
+                               ms = '' + ( sum < 1 ? sum.toFixed( 2 ) : sum.toFixed( 0 ) ) + ' ms';
+                               mem = formatBytes( contained.memory );
+
+                               $( '<div>' ).text( contained.source.name )
+                                       .append( $( '<span>' ).text( ' ~ ' + ms + ' / ' + mem ).addClass( 'mw-debug-profile-meta' ) )
+                                       .appendTo( node );
+                       }
+
+                       return node;
+               },
+
+               /**
+                * Attach a hover flyout to all .mw-debug-profile-period groups.
+                */
+               attachFlyout: function () {
+                       // for some reason addClass and removeClass from jQuery
+                       // arn't working on svg elements in chrome <= 33.0 (possibly more)
+                       var $container = $( profile.container ),
+                               addClass = function ( node, value ) {
+                                       var current = node.getAttribute( 'class' ),
+                                               list = current ? current.split( ' ' ) : false,
+                                               idx = list ? list.indexOf( value ) : -1;
+
+                                       if ( idx === -1 ) {
+                                               node.setAttribute( 'class', current ? ( current + ' ' + value ) : value );
+                                       }
+                               },
+                               removeClass = function ( node, value ) {
+                                       var current = node.getAttribute( 'class' ),
+                                               list = current ? current.split( ' ' ) : false,
+                                               idx = list ? list.indexOf( value ) : -1;
+
+                                       if ( idx !== -1 ) {
+                                               list.splice( idx, 1 );
+                                               node.setAttribute( 'class', list.join( ' ' ) );
+                                       }
+                               },
+                               // hide all tipsy flyouts
+                               hide = function () {
+                                       $container.find( '.mw-debug-profile-period.tipsy-visible' )
+                                               .each( function () {
+                                                       removeClass( this, 'tipsy-visible' );
+                                                       $( this ).tipsy( 'hide' );
+                                               } );
+                               };
+
+                       $container.find( '.mw-debug-profile-period' ).tipsy( {
+                               fade: true,
+                               gravity: function () {
+                                       return $.fn.tipsy.autoNS.call( this )
+                                               + $.fn.tipsy.autoWE.call( this );
+                               },
+                               className: 'mw-debug-profile-tipsy',
+                               center: false,
+                               html: true,
+                               trigger: 'manual',
+                               title: function () {
+                                       return profile.buildFlyout( $( this ).data( 'period' ) ).html();
+                               }
+                       } ).on( 'mouseenter', function () {
+                               hide();
+                               addClass( this, 'tipsy-visible' );
+                               $( this ).tipsy( 'show' );
+                       } );
+
+                       $container.on( 'mouseleave', function ( event ) {
+                               var $from = $( event.relatedTarget ),
+                                       $to = $( event.target );
+                               // only close the tipsy if we are not
+                               if ( $from.closest( '.tipsy' ).length === 0 &&
+                                       $to.closest( '.tipsy' ).length === 0 &&
+                                       $to.get( 0 ).namespaceURI !== 'http://www.w4.org/2000/svg'
+                               ) {
+                                       hide();
+                               }
+                       } ).on( 'click', function () {
+                               // convenience method for closing
+                               hide();
+                       } );
+               },
+
+               /**
+                * @return number the x co-ordinate for the specified timestamp
+                */
+               xCoord: function ( msTimestamp ) {
+                       return ( msTimestamp - profile.data.timespan.start ) * profile.ratio;
+               }
+       };
+
+       function ProfileData( data, width, mergeThresholdPx, dropThresholdPx ) {
+               // validate input data
+               this.data = data.map( function ( event ) {
+                       event.periods = event.periods.filter( function ( period ) {
+                               return period.start && period.end
+                                       && period.start < period.end
+                                       // period start must be a reasonable ms timestamp
+                                       && period.start > 1000000;
+                       } );
+                       return event;
+               } ).filter( function ( event ) {
+                       return event.name && event.periods.length > 0;
+               } );
+
+               // start and end time of the data
+               this.timespan = this.data.reduce( function ( result, event ) {
+                       return event.periods.reduce( periodMinMax, result );
+               }, periodMinMax.initial() );
+
+               // transform input data
+               this.groups = this.collate( width, mergeThresholdPx, dropThresholdPx );
+
+               return this;
+       }
+
+       /**
+        * There are too many unique events to display a line for each,
+        * so this does a basic grouping.
+        */
+       ProfileData.groupOf = function ( label ) {
+               var pos, prefix = 'Profile section ended by close(): ';
+               if ( label.indexOf( prefix ) === 0 ) {
+                       label = label.substring( prefix.length );
+               }
+
+               pos = [ '::', ':', '-' ].reduce( function ( result, separator ) {
+                       var pos = label.indexOf( separator );
+                       if ( pos === -1 ) {
+                               return result;
+                       } else if ( result === -1 ) {
+                               return pos;
+                       } else {
+                               return Math.min( result, pos );
+                       }
+               }, -1 );
+
+               if ( pos === -1 ) {
+                       return label;
+               } else {
+                       return label.substring( 0, pos );
+               }
+       };
+
+       /**
+        * @return Array list of objects with `name` and `events` keys
+        */
+       ProfileData.groupEvents = function ( events ) {
+               var group, i,
+                       groups = {};
+
+               // Group events together
+               for ( i = events.length - 1; i >= 0; i-- ) {
+                       group = ProfileData.groupOf( events[i].name );
+                       if ( groups[group] ) {
+                               groups[group].push( events[i] );
+                       } else {
+                               groups[group] = [events[i]];
+                       }
+               }
+
+               // Return an array of groups
+               return Object.keys( groups ).map( function ( group ) {
+                       return {
+                               name: group,
+                               events: groups[group]
+                       };
+               } );
+       };
+
+       ProfileData.periodSorter = function ( a, b ) {
+               if ( a.start === b.start ) {
+                       return a.end - b.end;
+               }
+               return a.start - b.start;
+       };
+
+       ProfileData.genMergePeriodReducer = function ( mergeThresholdMs ) {
+               return function ( result, period ) {
+                       if ( result.length === 0 ) {
+                               // period is first result
+                               return [{
+                                       start: period.start,
+                                       end: period.end,
+                                       contained: [period]
+                               }];
+                       }
+                       var last = result[result.length - 1];
+                       if ( period.end < last.end ) {
+                               // end is contained within previous
+                               result[result.length - 1].contained.push( period );
+                       } else if ( period.start - mergeThresholdMs < last.end ) {
+                               // neighbors within merging distance
+                               result[result.length - 1].end = period.end;
+                               result[result.length - 1].contained.push( period );
+                       } else {
+                               // period is next result
+                               result.push({
+                                       start: period.start,
+                                       end: period.end,
+                                       contained: [period]
+                               });
+                       }
+                       return result;
+               };
+       };
+
+       /**
+        * Collect all periods from the grouped events and apply merge and
+        * drop transformations
+        */
+       ProfileData.extractPeriods = function ( events, mergeThresholdMs, dropThresholdMs ) {
+               // collect the periods from all events
+               return events.reduce( function ( result, event ) {
+                               if ( !event.periods.length ) {
+                                       return result;
+                               }
+                               result.push.apply( result, event.periods.map( function ( period ) {
+                                       // maintain link from period to event
+                                       period.source = event;
+                                       return period;
+                               } ) );
+                               return result;
+                       }, [] )
+                       // sort combined periods
+                       .sort( ProfileData.periodSorter )
+                       // Apply merge threshold. Original periods
+                       // are maintained in the `contained` property
+                       .reduce( ProfileData.genMergePeriodReducer( mergeThresholdMs ), [] )
+                       // Apply drop threshold
+                       .filter( function ( period ) {
+                               return period.end - period.start > dropThresholdMs;
+                       } );
+       };
+
+       /**
+        * runs a callback on all periods in the group.  Only valid after
+        * groups.periods[0..n].contained are populated. This runs against
+        * un-transformed data and is better suited to summing or other
+        * stat collection
+        */
+       ProfileData.reducePeriods = function ( group, callback, result ) {
+               return group.periods.reduce( function ( result, period ) {
+                       return period.contained.reduce( callback, result );
+               }, result );
+       };
+
+       /**
+        * Transforms this.data grouping by labels, merging neighboring
+        * events in the groups, and drops events and groups below the
+        * display threshold. Groups are returned sorted by starting time.
+        */
+       ProfileData.prototype.collate = function ( width, mergeThresholdPx, dropThresholdPx ) {
+               // ms to pixel ratio
+               var ratio = ( this.timespan.end - this.timespan.start ) / width,
+                       // transform thresholds to ms
+                       mergeThresholdMs = mergeThresholdPx * ratio,
+                       dropThresholdMs = dropThresholdPx * ratio;
+
+               return ProfileData.groupEvents( this.data )
+                       // generate data about the grouped events
+                       .map( function ( group ) {
+                               // Cleaned periods from all events
+                               group.periods = ProfileData.extractPeriods( group.events, mergeThresholdMs, dropThresholdMs );
+                               // min and max timestamp per group
+                               group.timespan = ProfileData.reducePeriods( group, periodMinMax, periodMinMax.initial() );
+                               // ms from first call to end of last call
+                               group.timespan.length = group.timespan.end - group.timespan.start;
+                               // collect the un-transformed periods
+                               group.timespan.sum = ProfileData.reducePeriods( group, function ( result, period ) {
+                                               result.push( period );
+                                               return result;
+                                       }, [] )
+                                       // sort by start time
+                                       .sort( ProfileData.periodSorter )
+                                       // merge overlapping
+                                       .reduce( ProfileData.genMergePeriodReducer( 0 ), [] )
+                                       // sum
+                                       .reduce( function ( result, period ) {
+                                               return result + period.end - period.start;
+                                       }, 0 );
+
+                               return group;
+                       }, this )
+                       // remove groups that have had all their periods filtered
+                       .filter( function ( group ) {
+                               return group.periods.length > 0;
+                       } )
+                       // sort events by first start
+                       .sort( function ( a, b ) {
+                               return ProfileData.periodSorter( a.timespan, b.timespan );
+                       } );
+       };
+
+       // reducer to find edges of period array
+       function periodMinMax( result, period ) {
+               if ( period.start < result.start ) {
+                       result.start = period.start;
+               }
+               if ( period.end > result.end ) {
+                       result.end = period.end;
+               }
+               return result;
+       }
+
+       periodMinMax.initial = function () {
+               return { start: Number.POSITIVE_INFINITY, end: Number.NEGATIVE_INFINITY };
+       };
+
+       function formatBytes( bytes ) {
+               var i, sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB'];
+               if ( bytes === 0 ) {
+                       return '0 Bytes';
+               }
+               i = parseInt( Math.floor( Math.log( bytes ) / Math.log( 1024 ) ), 10 );
+               return Math.round( bytes / Math.pow( 1024, i ), 2 ) + ' ' + sizes[i];
+       }
+
+       // turns a 2d array into a point list for svg
+       // polygon points attribute
+       // ex: [[1,2],[3,4],[4,2]] = '1,2 3,4 4,2'
+       function pointList( pairs ) {
+               return pairs.map( function ( pair ) {
+                       return pair.join( ',' );
+               } ).join( ' ' );
+       }
+}( mediaWiki, jQuery ) );
diff --git a/resources/src/mediawiki/mediawiki.feedback.css b/resources/src/mediawiki/mediawiki.feedback.css
new file mode 100644 (file)
index 0000000..6bd47bb
--- /dev/null
@@ -0,0 +1,9 @@
+.feedback-spinner {
+       display: inline-block;
+       zoom: 1;
+       *display: inline; /* IE7 and below */
+       /* @embed */
+       background: url(mediawiki.feedback.spinner.gif);
+       width: 18px;
+       height: 18px;
+}
diff --git a/resources/src/mediawiki/mediawiki.feedback.js b/resources/src/mediawiki/mediawiki.feedback.js
new file mode 100644 (file)
index 0000000..90a6425
--- /dev/null
@@ -0,0 +1,316 @@
+/*!
+ * mediawiki.feedback
+ *
+ * @author Ryan Kaldari, 2010
+ * @author Neil Kandalgaonkar, 2010-11
+ * @since 1.19
+ */
+( function ( mw, $ ) {
+       /**
+        * This is a way of getting simple feedback from users. It's useful
+        * for testing new features -- users can give you feedback without
+        * the difficulty of opening a whole new talk page. For this reason,
+        * it also tends to collect a wider range of both positive and negative
+        * comments. However you do need to tend to the feedback page. It will
+        * get long relatively quickly, and you often get multiple messages
+        * reporting the same issue.
+        *
+        * It takes the form of thing on your page which, when clicked, opens a small
+        * dialog box. Submitting that dialog box appends its contents to a
+        * wiki page that you specify, as a new section.
+        *
+        * Not compatible with LiquidThreads.
+        *
+        * Minimal example in how to use it:
+        *
+        *     var feedback = new mw.Feedback();
+        *     $( '#myButton' ).click( function () { feedback.launch(); } );
+        *
+        * You can also launch the feedback form with a prefilled subject and body.
+        * See the docs for the #launch() method.
+        *
+        * @class
+        * @constructor
+        * @param {Object} [options]
+        * @param {mw.Api} [options.api] if omitted, will just create a standard API
+        * @param {mw.Title} [options.title="Feedback"] The title of the page where you collect
+        * feedback.
+        * @param {string} [options.dialogTitleMessageKey="feedback-submit"] Message key for the
+        * title of the dialog box
+        * @param {string} [options.bugsLink="//bugzilla.wikimedia.org/enter_bug.cgi"] URL where
+        * bugs can be posted
+        * @param {mw.Uri|string} [options.bugsListLink="//bugzilla.wikimedia.org/query.cgi"]
+        * URL where bugs can be listed
+        */
+       mw.Feedback = function ( options ) {
+               if ( options === undefined ) {
+                       options = {};
+               }
+
+               if ( options.api === undefined ) {
+                       options.api = new mw.Api();
+               }
+
+               if ( options.title === undefined ) {
+                       options.title = new mw.Title( 'Feedback' );
+               }
+
+               if ( options.dialogTitleMessageKey === undefined ) {
+                       options.dialogTitleMessageKey = 'feedback-submit';
+               }
+
+               if ( options.bugsLink === undefined ) {
+                       options.bugsLink = '//bugzilla.wikimedia.org/enter_bug.cgi';
+               }
+
+               if ( options.bugsListLink === undefined ) {
+                       options.bugsListLink = '//bugzilla.wikimedia.org/query.cgi';
+               }
+
+               $.extend( this, options );
+               this.setup();
+       };
+
+       mw.Feedback.prototype = {
+               /**
+                * Sets up interface
+                */
+               setup: function () {
+                       var $feedbackPageLink,
+                               $bugNoteLink,
+                               $bugsListLink,
+                               fb = this;
+
+                       $feedbackPageLink = $( '<a>' )
+                               .attr( {
+                                       href: fb.title.getUrl(),
+                                       target: '_blank'
+                               } )
+                               .css( {
+                                       whiteSpace: 'nowrap'
+                               } );
+
+                       $bugNoteLink = $( '<a>' ).attr( { href: '#' } ).click( function () {
+                               fb.displayBugs();
+                       } );
+
+                       $bugsListLink = $( '<a>' ).attr( {
+                               href: fb.bugsListLink,
+                               target: '_blank'
+                       } );
+
+                       // TODO: Use a stylesheet instead of these inline styles
+                       this.$dialog =
+                               $( '<div style="position: relative;"></div>' ).append(
+                                       $( '<div class="feedback-mode feedback-form"></div>' ).append(
+                                               $( '<small>' ).append(
+                                                       $( '<p>' ).msg(
+                                                               'feedback-bugornote',
+                                                               $bugNoteLink,
+                                                               fb.title.getNameText(),
+                                                               $feedbackPageLink.clone()
+                                                       )
+                                               ),
+                                               $( '<div style="margin-top: 1em;"></div>' ).append(
+                                                       mw.msg( 'feedback-subject' ),
+                                                       $( '<br>' ),
+                                                       $( '<input type="text" class="feedback-subject" name="subject" maxlength="60" style="width: 100%; -moz-box-sizing: border-box; -webkit-box-sizing: border-box; box-sizing: border-box;"/>' )
+                                               ),
+                                               $( '<div style="margin-top: 0.4em;"></div>' ).append(
+                                                       mw.msg( 'feedback-message' ),
+                                                       $( '<br>' ),
+                                                       $( '<textarea name="message" class="feedback-message" rows="5" cols="60"></textarea>' )
+                                               )
+                                       ),
+                                       $( '<div class="feedback-mode feedback-bugs"></div>' ).append(
+                                               $( '<p>' ).msg( 'feedback-bugcheck', $bugsListLink )
+                                       ),
+                                       $( '<div class="feedback-mode feedback-submitting" style="text-align: center; margin: 3em 0;"></div>' ).append(
+                                               mw.msg( 'feedback-adding' ),
+                                               $( '<br>' ),
+                                               $( '<span class="feedback-spinner"></span>' )
+                                       ),
+                                       $( '<div class="feedback-mode feedback-thanks" style="text-align: center; margin:1em"></div>' ).msg(
+                                               'feedback-thanks', fb.title.getNameText(), $feedbackPageLink.clone()
+                                       ),
+                                       $( '<div class="feedback-mode feedback-error" style="position: relative;"></div>' ).append(
+                                               $( '<div class="feedback-error-msg style="color: #990000; margin-top: 0.4em;"></div>' )
+                                       )
+                               );
+
+                               // undo some damage from dialog css
+                               this.$dialog.find( 'a' ).css( {
+                                       color: '#0645ad'
+                               } );
+
+                               this.$dialog.dialog({
+                                       width: 500,
+                                       autoOpen: false,
+                                       title: mw.msg( this.dialogTitleMessageKey ),
+                                       modal: true,
+                                       buttons: fb.buttons
+                               });
+
+                       this.subjectInput = this.$dialog.find( 'input.feedback-subject' ).get(0);
+                       this.messageInput = this.$dialog.find( 'textarea.feedback-message' ).get(0);
+
+               },
+
+               /**
+                * Displays a section of the dialog.
+                *
+                * @param {"form"|"bugs"|"submitting"|"thanks"|"error"} s
+                * The section of the dialog to show.
+                */
+               display: function ( s ) {
+                       // Hide the buttons
+                       this.$dialog.dialog( { buttons: {} } );
+                       // Hide everything
+                       this.$dialog.find( '.feedback-mode' ).hide();
+                       // Show the desired div
+                       this.$dialog.find( '.feedback-' + s ).show();
+               },
+
+               /**
+                * Display the submitting section.
+                */
+               displaySubmitting: function () {
+                       this.display( 'submitting' );
+               },
+
+               /**
+                * Display the bugs section.
+                */
+               displayBugs: function () {
+                       var fb = this,
+                               bugsButtons = {};
+                       this.display( 'bugs' );
+                       bugsButtons[ mw.msg( 'feedback-bugnew' ) ] = function () {
+                               window.open( fb.bugsLink, '_blank' );
+                       };
+                       bugsButtons[ mw.msg( 'feedback-cancel' ) ] = function () {
+                               fb.cancel();
+                       };
+                       this.$dialog.dialog( {
+                               buttons: bugsButtons
+                       } );
+               },
+
+               /**
+                * Display the thanks section.
+                */
+               displayThanks: function () {
+                       var fb = this,
+                               closeButton = {};
+                       this.display( 'thanks' );
+                       closeButton[ mw.msg( 'feedback-close' ) ] = function () {
+                               fb.$dialog.dialog( 'close' );
+                       };
+                       this.$dialog.dialog( {
+                               buttons: closeButton
+                       } );
+               },
+
+               /**
+                * Display the feedback form
+                * @param {Object} [contents] Prefilled contents for the feedback form.
+                * @param {string} [contents.subject] The subject of the feedback
+                * @param {string} [contents.message] The content of the feedback
+                */
+               displayForm: function ( contents ) {
+                       var fb = this,
+                               formButtons = {};
+                       this.subjectInput.value = ( contents && contents.subject ) ? contents.subject : '';
+                       this.messageInput.value = ( contents && contents.message ) ? contents.message : '';
+
+                       this.display( 'form' );
+
+                       // Set up buttons for dialog box. We have to do it the hard way since the json keys are localized
+                       formButtons[ mw.msg( 'feedback-submit' ) ] = function () {
+                               fb.submit();
+                       };
+                       formButtons[ mw.msg( 'feedback-cancel' ) ] = function () {
+                               fb.cancel();
+                       };
+                       this.$dialog.dialog( { buttons: formButtons } ); // put the buttons back
+               },
+
+               /**
+                * Display an error on the form.
+                *
+                * @param {string} message Should be a valid message key.
+                */
+               displayError: function ( message ) {
+                       var fb = this,
+                               closeButton = {};
+                       this.display( 'error' );
+                       this.$dialog.find( '.feedback-error-msg' ).msg( message );
+                       closeButton[ mw.msg( 'feedback-close' ) ] = function () {
+                               fb.$dialog.dialog( 'close' );
+                       };
+                       this.$dialog.dialog( { buttons: closeButton } );
+               },
+
+               /**
+                * Close the feedback form.
+                */
+               cancel: function () {
+                       this.$dialog.dialog( 'close' );
+               },
+
+               /**
+                * Submit the feedback form.
+                */
+               submit: function () {
+                       var subject, message,
+                               fb = this;
+
+                       function ok( result ) {
+                               if ( result.edit !== undefined ) {
+                                       if ( result.edit.result === 'Success' ) {
+                                               fb.displayThanks();
+                                       } else {
+                                               // unknown API result
+                                               fb.displayError( 'feedback-error1' );
+                                       }
+                               } else {
+                                       // edit failed
+                                       fb.displayError( 'feedback-error2' );
+                               }
+                       }
+
+                       function err() {
+                               // ajax request failed
+                               fb.displayError( 'feedback-error3' );
+                       }
+
+                       // Get the values to submit.
+                       subject = this.subjectInput.value;
+
+                       // We used to include "mw.html.escape( navigator.userAgent )" but there are legal issues
+                       // with posting this without their explicit consent
+                       message = this.messageInput.value;
+                       if ( message.indexOf( '~~~' ) === -1 ) {
+                               message += ' ~~~~';
+                       }
+
+                       this.displaySubmitting();
+
+                       this.api.newSection( this.title, subject, message, ok, err );
+               },
+
+               /**
+                * Modify the display form, and then open it, focusing interface on the subject.
+                * @param {Object} [contents] Prefilled contents for the feedback form.
+                * @param {string} [contents.subject] The subject of the feedback
+                * @param {string} [contents.message] The content of the feedback
+                */
+               launch: function ( contents ) {
+                       this.displayForm( contents );
+                       this.$dialog.dialog( 'open' );
+                       this.subjectInput.focus();
+               }
+
+       };
+
+}( mediaWiki, jQuery ) );
diff --git a/resources/src/mediawiki/mediawiki.feedback.spinner.gif b/resources/src/mediawiki/mediawiki.feedback.spinner.gif
new file mode 100644 (file)
index 0000000..aed0ea4
Binary files /dev/null and b/resources/src/mediawiki/mediawiki.feedback.spinner.gif differ
diff --git a/resources/src/mediawiki/mediawiki.hidpi.js b/resources/src/mediawiki/mediawiki.hidpi.js
new file mode 100644 (file)
index 0000000..ecee450
--- /dev/null
@@ -0,0 +1,5 @@
+jQuery( function ( $ ) {
+       // Apply hidpi images on DOM-ready
+       // Some may have already partly preloaded at low resolution.
+       $( 'body' ).hidpi();
+} );
diff --git a/resources/src/mediawiki/mediawiki.hlist.css b/resources/src/mediawiki/mediawiki.hlist.css
new file mode 100644 (file)
index 0000000..adcb810
--- /dev/null
@@ -0,0 +1,78 @@
+/*!
+ * Stylesheet for mediawiki.hlist module
+ * @author [[User:Edokter]]
+ */
+.hlist dl,
+.hlist ol,
+.hlist ul {
+       margin: 0;
+       padding: 0;
+}
+/* Display list items inline */
+.hlist dd,
+.hlist dt,
+.hlist li {
+       margin: 0;
+       display: inline;
+}
+/* Display nested lists inline */
+.hlist dl dl, .hlist dl ol, .hlist dl ul,
+.hlist ol dl, .hlist ol ol, .hlist ol ul,
+.hlist ul dl, .hlist ul ol, .hlist ul ul {
+       display: inline;
+}
+/* Generate interpuncts */
+.hlist dt:after {
+       content: ":";
+}
+.hlist dd:after,
+.hlist li:after {
+       content: " ·";
+       font-weight: bold;
+}
+.hlist dd:last-child:after,
+.hlist dt:last-child:after,
+.hlist li:last-child:after {
+       content: none;
+}
+/* For IE8 */
+.hlist dd.hlist-last-child:after,
+.hlist dt.hlist-last-child:after,
+.hlist li.hlist-last-child:after {
+       content: none;
+}
+/* Add parentheses around nested lists */
+.hlist dd dd:first-child:before, .hlist dd dt:first-child:before, .hlist dd li:first-child:before,
+.hlist dt dd:first-child:before, .hlist dt dt:first-child:before, .hlist dt li:first-child:before,
+.hlist li dd:first-child:before, .hlist li dt:first-child:before, .hlist li li:first-child:before {
+       content: "(";
+       font-weight: normal;
+}
+.hlist dd dd:last-child:after, .hlist dd dt:last-child:after, .hlist dd li:last-child:after,
+.hlist dt dd:last-child:after, .hlist dt dt:last-child:after, .hlist dt li:last-child:after,
+.hlist li dd:last-child:after, .hlist li dt:last-child:after, .hlist li li:last-child:after {
+       content: ")";
+       font-weight: normal;
+}
+/* For IE8 */
+.hlist dd dd.hlist-last-child:after, .hlist dd dt.hlist-last-child:after, .hlist dd li.hlist-last-child:after,
+.hlist dt dd.hlist-last-child:after, .hlist dt dt.hlist-last-child:after, .hlist dt li.hlist-last-child:after,
+.hlist li dd.hlist-last-child:after, .hlist li dt.hlist-last-child:after, .hlist li li.hlist-last-child:after {
+       content: ")";
+       font-weight: normal;
+}
+/* Put ordinals in front of ordered list items */
+.hlist ol {
+       counter-reset: list-item;
+}
+.hlist ol > li {
+       counter-increment: list-item;
+}
+.hlist ol > li:before {
+       content: counter(list-item) " ";
+}
+.hlist dd ol > li:first-child:before,
+.hlist dt ol > li:first-child:before,
+.hlist li ol > li:first-child:before {
+       content: "(" counter(list-item) " ";
+}
diff --git a/resources/src/mediawiki/mediawiki.hlist.js b/resources/src/mediawiki/mediawiki.hlist.js
new file mode 100644 (file)
index 0000000..0bbf8fa
--- /dev/null
@@ -0,0 +1,31 @@
+/*!
+ * .hlist fallbacks for IE 6, 7 and 8.
+ * @author [[User:Edokter]]
+ */
+( function ( mw, $ ) {
+       var profile = $.client.profile();
+
+       if ( profile.name === 'msie' ) {
+               if ( profile.versionNumber === 8 ) {
+                       /* IE 8: Add pseudo-selector class to last-child list items */
+                       mw.hook( 'wikipage.content' ).add( function ( $content ) {
+                               $content.find( '.hlist' ).find( 'dd:last-child, dt:last-child, li:last-child' )
+                                       .addClass( 'hlist-last-child' );
+                       } );
+               }
+               else if ( profile.versionNumber <= 7 ) {
+                       /* IE 7 and below: Generate interpuncts and parentheses */
+                       mw.hook( 'wikipage.content' ).add( function ( $content ) {
+                               var $hlists = $content.find( '.hlist' );
+                               $hlists.find( 'dt:not(:last-child)' )
+                                       .append( ': ' );
+                               $hlists.find( 'dd:not(:last-child)' )
+                                       .append( '<b>·</b> ' );
+                               $hlists.find( 'li:not(:last-child)' )
+                                       .append( '<b>·</b> ' );
+                               $hlists.find( 'dl dl, dl ol, dl ul, ol dl, ol ol, ol ul, ul dl, ul ol, ul ul' )
+                                       .prepend( '( ' ).append( ') ' );
+                       } );
+               }
+       }
+}( mediaWiki, jQuery ) );
diff --git a/resources/src/mediawiki/mediawiki.htmlform.js b/resources/src/mediawiki/mediawiki.htmlform.js
new file mode 100644 (file)
index 0000000..5ba1a54
--- /dev/null
@@ -0,0 +1,138 @@
+/**
+ * Utility functions for jazzing up HTMLForm elements.
+ *
+ * @class jQuery.plugin.htmlform
+ */
+( function ( mw, $ ) {
+
+       /**
+        * jQuery plugin to fade or snap to visible state.
+        *
+        * @param {boolean} [instantToggle=false]
+        * @return {jQuery}
+        * @chainable
+        */
+       $.fn.goIn = function ( instantToggle ) {
+               if ( instantToggle === true ) {
+                       return $( this ).show();
+               }
+               return $( this ).stop( true, true ).fadeIn();
+       };
+
+       /**
+        * jQuery plugin to fade or snap to hiding state.
+        *
+        * @param {boolean} [instantToggle=false]
+        * @return jQuery
+        * @chainable
+        */
+       $.fn.goOut = function ( instantToggle ) {
+               if ( instantToggle === true ) {
+                       return $( this ).hide();
+               }
+               return $( this ).stop( true, true ).fadeOut();
+       };
+
+       /**
+        * Bind a function to the jQuery object via live(), and also immediately trigger
+        * the function on the objects with an 'instant' parameter set to true.
+        * @param {Function} callback
+        * @param {boolean|jQuery.Event} callback.immediate True when the event is called immediately,
+        *  an event object when triggered from an event.
+        */
+       $.fn.liveAndTestAtStart = function ( callback ) {
+               $( this )
+                       .live( 'change', callback )
+                       .each( function () {
+                               callback.call( this, true );
+                       } );
+       };
+
+       $( function () {
+
+               // Animate the SelectOrOther fields, to only show the text field when
+               // 'other' is selected.
+               $( '.mw-htmlform-select-or-other' ).liveAndTestAtStart( function ( instant ) {
+                       var $other = $( '#' + $( this ).attr( 'id' ) + '-other' );
+                       $other = $other.add( $other.siblings( 'br' ) );
+                       if ( $( this ).val() === 'other' ) {
+                               $other.goIn( instant );
+                       } else {
+                               $other.goOut( instant );
+                       }
+               } );
+
+       } );
+
+       function addMulti( $oldContainer, $container ) {
+               var name = $oldContainer.find( 'input:first-child' ).attr( 'name' ),
+                       oldClass = ( ' ' + $oldContainer.attr( 'class' ) + ' ' ).replace( /(mw-htmlform-field-HTMLMultiSelectField|mw-chosen)/g, '' ),
+                       $select = $( '<select>' ),
+                       dataPlaceholder = mw.message( 'htmlform-chosen-placeholder' );
+               oldClass = $.trim( oldClass );
+               $select.attr( {
+                       name: name,
+                       multiple: 'multiple',
+                       'data-placeholder': dataPlaceholder.plain(),
+                       'class': 'htmlform-chzn-select mw-input ' + oldClass
+               } );
+               $oldContainer.find( 'input' ).each( function () {
+                       var $oldInput = $( this ),
+                       checked = $oldInput.prop( 'checked' ),
+                       $option = $( '<option>' );
+                       $option.prop( 'value', $oldInput.prop( 'value' ) );
+                       if ( checked ) {
+                               $option.prop( 'selected', true );
+                       }
+                       $option.text( $oldInput.prop( 'value' ) );
+                       $select.append( $option );
+               } );
+               $container.append( $select );
+       }
+
+       function convertCheckboxesToMulti( $oldContainer, type ) {
+               var $fieldLabel = $( '<td>' ),
+               $td = $( '<td>' ),
+               $fieldLabelText = $( '<label>' ),
+               $container;
+               if ( type === 'tr' ) {
+                       addMulti( $oldContainer, $td );
+                       $container = $( '<tr>' );
+                       $container.append( $td );
+               } else if ( type === 'div' ) {
+                       $fieldLabel = $( '<div>' );
+                       $container = $( '<div>' );
+                       addMulti( $oldContainer, $container );
+               }
+               $fieldLabel.attr( 'class', 'mw-label' );
+               $fieldLabelText.text( $oldContainer.find( '.mw-label label' ).text() );
+               $fieldLabel.append( $fieldLabelText );
+               $container.prepend( $fieldLabel );
+               $oldContainer.replaceWith( $container );
+               return $container;
+       }
+
+       if ( $( '.mw-chosen' ).length ) {
+               mw.loader.using( 'jquery.chosen', function () {
+                       $( '.mw-chosen' ).each( function () {
+                               var type = this.nodeName.toLowerCase(),
+                                       $converted = convertCheckboxesToMulti( $( this ), type );
+                               $converted.find( '.htmlform-chzn-select' ).chosen( { width: 'auto' } );
+                       } );
+               } );
+       }
+
+       $( function () {
+               var $matrixTooltips = $( '.mw-htmlform-matrix .mw-htmlform-tooltip' );
+               if ( $matrixTooltips.length ) {
+                       mw.loader.using( 'jquery.tipsy', function () {
+                               $matrixTooltips.tipsy( { gravity: 's' } );
+                       } );
+               }
+       } );
+
+       /**
+        * @class jQuery
+        * @mixins jQuery.plugin.htmlform
+        */
+}( mediaWiki, jQuery ) );
diff --git a/resources/src/mediawiki/mediawiki.icon.less b/resources/src/mediawiki/mediawiki.icon.less
new file mode 100644 (file)
index 0000000..49f0f70
--- /dev/null
@@ -0,0 +1,19 @@
+/* General-purpose icons via CSS. Classes here should be named "mw-icon-*". */
+
+@import "mediawiki.mixins";
+
+/* For the collapsed and expanded arrows, we also provide selectors to make it
+ * easy to use them with jquery.makeCollapsible. */
+.mw-icon-arrow-collapsed,
+.mw-collapsible-arrow.mw-collapsible-toggle-collapsed {
+       .background-image-svg('images/arrow-collapsed-ltr.svg', 'images/arrow-collapsed-ltr.png');
+       background-repeat: no-repeat;
+       background-position: left bottom;
+}
+
+.mw-icon-arrow-expanded,
+.mw-collapsible-arrow.mw-collapsible-toggle-expanded {
+       .background-image-svg('images/arrow-expanded.svg', 'images/arrow-expanded.png');
+       background-repeat: no-repeat;
+       background-position: left bottom;
+}
diff --git a/resources/src/mediawiki/mediawiki.inspect.js b/resources/src/mediawiki/mediawiki.inspect.js
new file mode 100644 (file)
index 0000000..62fa410
--- /dev/null
@@ -0,0 +1,284 @@
+/*!
+ * Tools for inspecting page composition and performance.
+ *
+ * @author Ori Livneh
+ * @since 1.22
+ */
+/*jshint devel:true */
+( function ( mw, $ ) {
+
+       function sortByProperty( array, prop, descending ) {
+               var order = descending ? -1 : 1;
+               return array.sort( function ( a, b ) {
+                       return a[prop] > b[prop] ? order : a[prop] < b[prop] ? -order : 0;
+               } );
+       }
+
+       function humanSize( bytes ) {
+               if ( !$.isNumeric( bytes ) || bytes === 0 ) { return bytes; }
+               var i = 0, units = [ '', ' kB', ' MB', ' GB', ' TB', ' PB' ];
+               for ( ; bytes >= 1024; bytes /= 1024 ) { i++; }
+               return bytes.toFixed( 1 ) + units[i];
+       }
+
+       /**
+        * @class mw.inspect
+        * @singleton
+        */
+       var inspect = {
+
+               /**
+                * Return a map of all dependency relationships between loaded modules.
+                *
+                * @return {Object} Maps module names to objects. Each sub-object has
+                *  two properties, 'requires' and 'requiredBy'.
+                */
+               getDependencyGraph: function () {
+                       var modules = inspect.getLoadedModules(), graph = {};
+
+                       $.each( modules, function ( moduleIndex, moduleName ) {
+                               var dependencies = mw.loader.moduleRegistry[moduleName].dependencies || [];
+
+                               graph[moduleName] = graph[moduleName] || { requiredBy: [] };
+                               graph[moduleName].requires = dependencies;
+
+                               $.each( dependencies, function ( depIndex, depName ) {
+                                       graph[depName] = graph[depName] || { requiredBy: [] };
+                                       graph[depName].requiredBy.push( moduleName );
+                               } );
+                       } );
+                       return graph;
+               },
+
+               /**
+                * Calculate the byte size of a ResourceLoader module.
+                *
+                * @param {string} moduleName The name of the module
+                * @return {number|null} Module size in bytes or null
+                */
+               getModuleSize: function ( moduleName ) {
+                       var module = mw.loader.moduleRegistry[ moduleName ],
+                               payload = 0;
+
+                       if ( mw.loader.getState( moduleName ) !== 'ready' ) {
+                               return null;
+                       }
+
+                       if ( !module.style && !module.script ) {
+                               return null;
+                       }
+
+                       // Tally CSS
+                       if ( module.style && $.isArray( module.style.css ) ) {
+                               $.each( module.style.css, function ( i, stylesheet ) {
+                                       payload += $.byteLength( stylesheet );
+                               } );
+                       }
+
+                       // Tally JavaScript
+                       if ( $.isFunction( module.script ) ) {
+                               payload += $.byteLength( module.script.toString() );
+                       }
+
+                       return payload;
+               },
+
+               /**
+                * Given CSS source, count both the total number of selectors it
+                * contains and the number which match some element in the current
+                * document.
+                *
+                * @param {string} css CSS source
+                * @return Selector counts
+                * @return {number} return.selectors Total number of selectors
+                * @return {number} return.matched Number of matched selectors
+                */
+               auditSelectors: function ( css ) {
+                       var selectors = { total: 0, matched: 0 },
+                               style = document.createElement( 'style' ),
+                               sheet, rules;
+
+                       style.textContent = css;
+                       document.body.appendChild( style );
+                       // Standards-compliant browsers use .sheet.cssRules, IE8 uses .styleSheet.rules…
+                       sheet = style.sheet || style.styleSheet;
+                       rules = sheet.cssRules || sheet.rules;
+                       $.each( rules, function ( index, rule ) {
+                               selectors.total++;
+                               if ( document.querySelector( rule.selectorText ) !== null ) {
+                                       selectors.matched++;
+                               }
+                       } );
+                       document.body.removeChild( style );
+                       return selectors;
+               },
+
+               /**
+                * Get a list of all loaded ResourceLoader modules.
+                *
+                * @return {Array} List of module names
+                */
+               getLoadedModules: function () {
+                       return $.grep( mw.loader.getModuleNames(), function ( module ) {
+                               return mw.loader.getState( module ) === 'ready';
+                       } );
+               },
+
+               /**
+                * Print tabular data to the console, using console.table, console.log,
+                * or mw.log (in declining order of preference).
+                *
+                * @param {Array} data Tabular data represented as an array of objects
+                *  with common properties.
+                */
+               dumpTable: function ( data ) {
+                       try {
+                               // Bartosz made me put this here.
+                               if ( window.opera ) { throw window.opera; }
+                               // Use Function.prototype#call to force an exception on Firefox,
+                               // which doesn't define console#table but doesn't complain if you
+                               // try to invoke it.
+                               console.table.call( console, data );
+                               return;
+                       } catch ( e ) {}
+                       try {
+                               console.log( $.toJSON( data, null, 2 ) );
+                               return;
+                       } catch ( e ) {}
+                       mw.log( data );
+               },
+
+               /**
+                * Generate and print one more reports. When invoked with no arguments,
+                * print all reports.
+                *
+                * @param {string...} [reports] Report names to run, or unset to print
+                *  all available reports.
+                */
+               runReports: function () {
+                       var reports = arguments.length > 0 ?
+                               Array.prototype.slice.call( arguments ) :
+                               $.map( inspect.reports, function ( v, k ) { return k; } );
+
+                       $.each( reports, function ( index, name ) {
+                               inspect.dumpTable( inspect.reports[name]() );
+                       } );
+               },
+
+               /**
+                * @class mw.inspect.reports
+                * @singleton
+                */
+               reports: {
+                       /**
+                        * Generate a breakdown of all loaded modules and their size in
+                        * kilobytes. Modules are ordered from largest to smallest.
+                        */
+                       size: function () {
+                               // Map each module to a descriptor object.
+                               var modules = $.map( inspect.getLoadedModules(), function ( module ) {
+                                       return {
+                                               name: module,
+                                               size: inspect.getModuleSize( module )
+                                       };
+                               } );
+
+                               // Sort module descriptors by size, largest first.
+                               sortByProperty( modules, 'size', true );
+
+                               // Convert size to human-readable string.
+                               $.each( modules, function ( i, module ) {
+                                       module.size = humanSize( module.size );
+                               } );
+
+                               return modules;
+                       },
+
+                       /**
+                        * For each module with styles, count the number of selectors, and
+                        * count how many match against some element currently in the DOM.
+                        */
+                       css: function () {
+                               var modules = [];
+
+                               $.each( inspect.getLoadedModules(), function ( index, name ) {
+                                       var css, stats, module = mw.loader.moduleRegistry[name];
+
+                                       try {
+                                               css = module.style.css.join();
+                                       } catch ( e ) { return; } // skip
+
+                                       stats = inspect.auditSelectors( css );
+                                       modules.push( {
+                                               module: name,
+                                               allSelectors: stats.total,
+                                               matchedSelectors: stats.matched,
+                                               percentMatched: stats.total !== 0 ?
+                                                       ( stats.matched / stats.total * 100 ).toFixed( 2 )  + '%' : null
+                                       } );
+                               } );
+                               sortByProperty( modules, 'allSelectors', true );
+                               return modules;
+                       },
+
+                       /**
+                        * Report stats on mw.loader.store: the number of localStorage
+                        * cache hits and misses, the number of items purged from the
+                        * cache, and the total size of the module blob in localStorage.
+                        */
+                       store: function () {
+                               var raw, stats = { enabled: mw.loader.store.enabled };
+                               if ( stats.enabled ) {
+                                       $.extend( stats, mw.loader.store.stats );
+                                       try {
+                                               raw = localStorage.getItem( mw.loader.store.getStoreKey() );
+                                               stats.totalSize = humanSize( $.byteLength( raw ) );
+                                       } catch ( e ) {}
+                               }
+                               return [stats];
+                       }
+               },
+
+               /**
+                * Perform a substring search across the JavaScript and CSS source code
+                * of all loaded modules and return an array of the names of the
+                * modules that matched.
+                *
+                * @param {string|RegExp} pattern String or regexp to match.
+                * @return {Array} Array of the names of modules that matched.
+                */
+               grep: function ( pattern ) {
+                       if ( typeof pattern.test !== 'function' ) {
+                               // Based on Y.Escape.regex from YUI v3.15.0
+                               pattern = new RegExp( pattern.replace( /[\-$\^*()+\[\]{}|\\,.?\s]/g, '\\$&' ), 'g' );
+                       }
+
+                       return $.grep( inspect.getLoadedModules(), function ( moduleName ) {
+                               var module = mw.loader.moduleRegistry[moduleName];
+
+                               // Grep module's JavaScript
+                               if ( $.isFunction( module.script ) && pattern.test( module.script.toString() ) ) {
+                                       return true;
+                               }
+
+                               // Grep module's CSS
+                               if (
+                                       $.isPlainObject( module.style ) && $.isArray( module.style.css )
+                                       && pattern.test( module.style.css.join( '' ) )
+                               ) {
+                                       // Module's CSS source matches
+                                       return true;
+                               }
+
+                               return false;
+                       } );
+               }
+       };
+
+       if ( mw.config.get( 'debug' ) ) {
+               mw.log( 'mw.inspect: reports are not available in debug mode.' );
+       }
+
+       mw.inspect = inspect;
+
+}( mediaWiki, jQuery ) );
diff --git a/resources/src/mediawiki/mediawiki.jqueryMsg.js b/resources/src/mediawiki/mediawiki.jqueryMsg.js
new file mode 100644 (file)
index 0000000..32a9927
--- /dev/null
@@ -0,0 +1,1239 @@
+/*!
+* Experimental advanced wikitext parser-emitter.
+* See: https://www.mediawiki.org/wiki/Extension:UploadWizard/MessageParser for docs
+*
+* @author neilk@wikimedia.org
+* @author mflaschen@wikimedia.org
+*/
+( function ( mw, $ ) {
+       /**
+        * @class mw.jqueryMsg
+        * @singleton
+        */
+
+       var oldParser,
+               slice = Array.prototype.slice,
+               parserDefaults = {
+                       magic: {
+                               'SITENAME': mw.config.get( 'wgSiteName' )
+                       },
+                       // This is a whitelist based on, but simpler than, Sanitizer.php.
+                       // Self-closing tags are not currently supported.
+                       allowedHtmlElements: [
+                               'b',
+                               'i'
+                       ],
+                       // Key tag name, value allowed attributes for that tag.
+                       // See Sanitizer::setupAttributeWhitelist
+                       allowedHtmlCommonAttributes: [
+                               // HTML
+                               'id',
+                               'class',
+                               'style',
+                               'lang',
+                               'dir',
+                               'title',
+
+                               // WAI-ARIA
+                               'role'
+                       ],
+
+                       // Attributes allowed for specific elements.
+                       // Key is element name in lower case
+                       // Value is array of allowed attributes for that element
+                       allowedHtmlAttributesByElement: {},
+                       messages: mw.messages,
+                       language: mw.language,
+
+                       // Same meaning as in mediawiki.js.
+                       //
+                       // Only 'text', 'parse', and 'escaped' are supported, and the
+                       // actual escaping for 'escaped' is done by other code (generally
+                       // through mediawiki.js).
+                       //
+                       // However, note that this default only
+                       // applies to direct calls to jqueryMsg. The default for mediawiki.js itself
+                       // is 'text', including when it uses jqueryMsg.
+                       format: 'parse'
+
+               };
+
+       /**
+        * Wrapper around jQuery append that converts all non-objects to TextNode so append will not
+        * convert what it detects as an htmlString to an element.
+        *
+        * Object elements of children (jQuery, HTMLElement, TextNode, etc.) will be left as is.
+        *
+        * @private
+        * @param {jQuery} $parent Parent node wrapped by jQuery
+        * @param {Object|string|Array} children What to append, with the same possible types as jQuery
+        * @return {jQuery} $parent
+        */
+       function appendWithoutParsing( $parent, children ) {
+               var i, len;
+
+               if ( !$.isArray( children ) ) {
+                       children = [children];
+               }
+
+               for ( i = 0, len = children.length; i < len; i++ ) {
+                       if ( typeof children[i] !== 'object' ) {
+                               children[i] = document.createTextNode( children[i] );
+                       }
+               }
+
+               return $parent.append( children );
+       }
+
+       /**
+        * Decodes the main HTML entities, those encoded by mw.html.escape.
+        *
+        * @private
+        * @param {string} encoded Encoded string
+        * @return {string} String with those entities decoded
+        */
+       function decodePrimaryHtmlEntities( encoded ) {
+               return encoded
+                       .replace( /&#039;/g, '\'' )
+                       .replace( /&quot;/g, '"' )
+                       .replace( /&lt;/g, '<' )
+                       .replace( /&gt;/g, '>' )
+                       .replace( /&amp;/g, '&' );
+       }
+
+       /**
+        * Given parser options, return a function that parses a key and replacements, returning jQuery object
+        *
+        * Try to parse a key and optional replacements, returning a jQuery object that may be a tree of jQuery nodes.
+        * If there was an error parsing, return the key and the error message (wrapped in jQuery). This should put the error right into
+        * the interface, without causing the page to halt script execution, and it hopefully should be clearer how to fix it.
+        * @private
+        * @param {Object} options Parser options
+        * @return {Function}
+        * @return {Array} return.args First element is the key, replacements may be in array in 2nd element, or remaining elements.
+        * @return {jQuery} return.return
+        */
+       function getFailableParserFn( options ) {
+               var parser = new mw.jqueryMsg.parser( options );
+
+               return function ( args ) {
+                       var key = args[0],
+                               argsArray = $.isArray( args[1] ) ? args[1] : slice.call( args, 1 );
+                       try {
+                               return parser.parse( key, argsArray );
+                       } catch ( e ) {
+                               var fallback = parser.settings.messages.get( key );
+                               mw.log.warn( 'mediawiki.jqueryMsg: ' + key + ': ' + e.message );
+                               return $( '<span>' ).text( fallback );
+                       }
+               };
+       }
+
+       mw.jqueryMsg = {};
+
+       /**
+        * Returns a function suitable for use as a global, to construct strings from the message key (and optional replacements).
+        * e.g.
+        *
+        *       window.gM = mediaWiki.parser.getMessageFunction( options );
+        *       $( 'p#headline' ).html( gM( 'hello-user', username ) );
+        *
+        * Like the old gM() function this returns only strings, so it destroys any bindings. If you want to preserve bindings use the
+        * jQuery plugin version instead. This is only included for backwards compatibility with gM().
+        *
+        * N.B. replacements are variadic arguments or an array in second parameter. In other words:
+        *    somefunction( a, b, c, d )
+        * is equivalent to
+        *    somefunction( a, [b, c, d] )
+        *
+        * @param {Object} options parser options
+        * @return {Function} Function suitable for assigning to window.gM
+        * @return {string} return.key Message key.
+        * @return {Array|Mixed} return.replacements Optional variable replacements (variadically or an array).
+        * @return {string} return.return Rendered HTML.
+        */
+       mw.jqueryMsg.getMessageFunction = function ( options ) {
+               var failableParserFn = getFailableParserFn( options ),
+                       format;
+
+               if ( options && options.format !== undefined ) {
+                       format = options.format;
+               } else {
+                       format = parserDefaults.format;
+               }
+
+               return function () {
+                       var failableResult = failableParserFn( arguments );
+                       if ( format === 'text' || format === 'escaped' ) {
+                               return failableResult.text();
+                       } else {
+                               return failableResult.html();
+                       }
+               };
+       };
+
+       /**
+        * Returns a jQuery plugin which parses the message in the message key, doing replacements optionally, and appends the nodes to
+        * the current selector. Bindings to passed-in jquery elements are preserved. Functions become click handlers for [$1 linktext] links.
+        * e.g.
+        *
+        *        $.fn.msg = mediaWiki.parser.getJqueryPlugin( options );
+        *        var userlink = $( '<a>' ).click( function () { alert( "hello!!" ) } );
+        *        $( 'p#headline' ).msg( 'hello-user', userlink );
+        *
+        * N.B. replacements are variadic arguments or an array in second parameter. In other words:
+        *    somefunction( a, b, c, d )
+        * is equivalent to
+        *    somefunction( a, [b, c, d] )
+        *
+        * We append to 'this', which in a jQuery plugin context will be the selected elements.
+        *
+        * @param {Object} options Parser options
+        * @return {Function} Function suitable for assigning to jQuery plugin, such as jQuery#msg
+        * @return {string} return.key Message key.
+        * @return {Array|Mixed} return.replacements Optional variable replacements (variadically or an array).
+        * @return {jQuery} return.return
+        */
+       mw.jqueryMsg.getPlugin = function ( options ) {
+               var failableParserFn = getFailableParserFn( options );
+
+               return function () {
+                       var $target = this.empty();
+                       // TODO: Simply appendWithoutParsing( $target, failableParserFn( arguments ).contents() )
+                       // or Simply appendWithoutParsing( $target, failableParserFn( arguments ) )
+                       $.each( failableParserFn( arguments ).contents(), function ( i, node ) {
+                               appendWithoutParsing( $target, node );
+                       } );
+                       return $target;
+               };
+       };
+
+       /**
+        * The parser itself.
+        * Describes an object, whose primary duty is to .parse() message keys.
+        *
+        * @class
+        * @private
+        * @param {Object} options
+        */
+       mw.jqueryMsg.parser = function ( options ) {
+               this.settings = $.extend( {}, parserDefaults, options );
+               this.settings.onlyCurlyBraceTransform = ( this.settings.format === 'text' || this.settings.format === 'escaped' );
+
+               this.emitter = new mw.jqueryMsg.htmlEmitter( this.settings.language, this.settings.magic );
+       };
+
+       mw.jqueryMsg.parser.prototype = {
+               /**
+                * Cache mapping MediaWiki message keys and the value onlyCurlyBraceTransform, to the AST of the message.
+                *
+                * In most cases, the message is a string so this is identical.
+                * (This is why we would like to move this functionality server-side).
+                *
+                * The two parts of the key are separated by colon.  For example:
+                *
+                *     "message-key:true": ast
+                *
+                * if they key is "message-key" and onlyCurlyBraceTransform is true.
+                *
+                * This cache is shared by all instances of mw.jqueryMsg.parser.
+                *
+                * NOTE: We promise, it's static - when you create this empty object
+                * in the prototype, each new instance of the class gets a reference
+                * to the same object.
+                *
+                * @static
+                * @property {Object}
+                */
+               astCache: {},
+
+               /**
+                * Where the magic happens.
+                * Parses a message from the key, and swaps in replacements as necessary, wraps in jQuery
+                * If an error is thrown, returns original key, and logs the error
+                * @param {string} key Message key.
+                * @param {Array} replacements Variable replacements for $1, $2... $n
+                * @return {jQuery}
+                */
+               parse: function ( key, replacements ) {
+                       return this.emitter.emit( this.getAst( key ), replacements );
+               },
+
+               /**
+                * Fetch the message string associated with a key, return parsed structure. Memoized.
+                * Note that we pass '[' + key + ']' back for a missing message here.
+                * @param {string} key
+                * @return {string|Array} string of '[key]' if message missing, simple string if possible, array of arrays if needs parsing
+                */
+               getAst: function ( key ) {
+                       var cacheKey = [key, this.settings.onlyCurlyBraceTransform].join( ':' ), wikiText;
+
+                       if ( this.astCache[ cacheKey ] === undefined ) {
+                               wikiText = this.settings.messages.get( key );
+                               if ( typeof wikiText !== 'string' ) {
+                                       wikiText = '\\[' + key + '\\]';
+                               }
+                               this.astCache[ cacheKey ] = this.wikiTextToAst( wikiText );
+                       }
+                       return this.astCache[ cacheKey ];
+               },
+
+               /**
+                * Parses the input wikiText into an abstract syntax tree, essentially an s-expression.
+                *
+                * CAVEAT: This does not parse all wikitext. It could be more efficient, but it's pretty good already.
+                * n.b. We want to move this functionality to the server. Nothing here is required to be on the client.
+                *
+                * @param {string} input Message string wikitext
+                * @throws Error
+                * @return {Mixed} abstract syntax tree
+                */
+               wikiTextToAst: function ( input ) {
+                       var pos, settings = this.settings, concat = Array.prototype.concat,
+                               regularLiteral, regularLiteralWithoutBar, regularLiteralWithoutSpace, regularLiteralWithSquareBrackets,
+                               doubleQuote, singleQuote, backslash, anyCharacter, asciiAlphabetLiteral,
+                               escapedOrLiteralWithoutSpace, escapedOrLiteralWithoutBar, escapedOrRegularLiteral,
+                               whitespace, dollar, digits, htmlDoubleQuoteAttributeValue, htmlSingleQuoteAttributeValue,
+                               htmlAttributeEquals, openHtmlStartTag, optionalForwardSlash, openHtmlEndTag, closeHtmlTag,
+                               openExtlink, closeExtlink, wikilinkPage, wikilinkContents, openWikilink, closeWikilink, templateName, pipe, colon,
+                               templateContents, openTemplate, closeTemplate,
+                               nonWhitespaceExpression, paramExpression, expression, curlyBraceTransformExpression, result;
+
+                       // Indicates current position in input as we parse through it.
+                       // Shared among all parsing functions below.
+                       pos = 0;
+
+                       // =========================================================
+                       // parsing combinators - could be a library on its own
+                       // =========================================================
+
+                       /**
+                        * Try parsers until one works, if none work return null
+                        * @private
+                        * @param {Function[]} ps
+                        * @return {string|null}
+                        */
+                       function choice( ps ) {
+                               return function () {
+                                       var i, result;
+                                       for ( i = 0; i < ps.length; i++ ) {
+                                               result = ps[i]();
+                                               if ( result !== null ) {
+                                                        return result;
+                                               }
+                                       }
+                                       return null;
+                               };
+                       }
+
+                       /**
+                        * Try several ps in a row, all must succeed or return null.
+                        * This is the only eager one.
+                        * @private
+                        * @param {Function[]} ps
+                        * @return {string|null}
+                        */
+                       function sequence( ps ) {
+                               var i, res,
+                                       originalPos = pos,
+                                       result = [];
+                               for ( i = 0; i < ps.length; i++ ) {
+                                       res = ps[i]();
+                                       if ( res === null ) {
+                                               pos = originalPos;
+                                               return null;
+                                       }
+                                       result.push( res );
+                               }
+                               return result;
+                       }
+
+                       /**
+                        * Run the same parser over and over until it fails.
+                        * Must succeed a minimum of n times or return null.
+                        * @private
+                        * @param {number} n
+                        * @param {Function} p
+                        * @return {string|null}
+                        */
+                       function nOrMore( n, p ) {
+                               return function () {
+                                       var originalPos = pos,
+                                               result = [],
+                                               parsed = p();
+                                       while ( parsed !== null ) {
+                                               result.push( parsed );
+                                               parsed = p();
+                                       }
+                                       if ( result.length < n ) {
+                                               pos = originalPos;
+                                               return null;
+                                       }
+                                       return result;
+                               };
+                       }
+
+                       /**
+                        * There is a general pattern -- parse a thing, if that worked, apply transform, otherwise return null.
+                        *
+                        * TODO: But using this as a combinator seems to cause problems when combined with #nOrMore().
+                        * May be some scoping issue
+                        *
+                        * @private
+                        * @param {Function} p
+                        * @param {Function} fn
+                        * @return {string|null}
+                        */
+                       function transform( p, fn ) {
+                               return function () {
+                                       var result = p();
+                                       return result === null ? null : fn( result );
+                               };
+                       }
+
+                       /**
+                        * Just make parsers out of simpler JS builtin types
+                        * @private
+                        * @param {string} s
+                        * @return {Function}
+                        * @return {string} return.return
+                        */
+                       function makeStringParser( s ) {
+                               var len = s.length;
+                               return function () {
+                                       var result = null;
+                                       if ( input.substr( pos, len ) === s ) {
+                                                result = s;
+                                                pos += len;
+                                       }
+                                       return result;
+                               };
+                       }
+
+                       /**
+                        * Makes a regex parser, given a RegExp object.
+                        * The regex being passed in should start with a ^ to anchor it to the start
+                        * of the string.
+                        *
+                        * @private
+                        * @param {RegExp} regex anchored regex
+                        * @return {Function} function to parse input based on the regex
+                        */
+                       function makeRegexParser( regex ) {
+                               return function () {
+                                       var matches = input.substr( pos ).match( regex );
+                                       if ( matches === null ) {
+                                               return null;
+                                       }
+                                       pos += matches[0].length;
+                                       return matches[0];
+                               };
+                       }
+
+                       // ===================================================================
+                       // General patterns above this line -- wikitext specific parsers below
+                       // ===================================================================
+
+                       // Parsing functions follow. All parsing functions work like this:
+                       // They don't accept any arguments.
+                       // Instead, they just operate non destructively on the string 'input'
+                       // As they can consume parts of the string, they advance the shared variable pos,
+                       // and return tokens (or whatever else they want to return).
+                       // some things are defined as closures and other things as ordinary functions
+                       // converting everything to a closure makes it a lot harder to debug... errors pop up
+                       // but some debuggers can't tell you exactly where they come from. Also the mutually
+                       // recursive functions seem not to work in all browsers then. (Tested IE6-7, Opera, Safari, FF)
+                       // This may be because, to save code, memoization was removed
+
+                       regularLiteral = makeRegexParser( /^[^{}\[\]$<\\]/ );
+                       regularLiteralWithoutBar = makeRegexParser( /^[^{}\[\]$\\|]/ );
+                       regularLiteralWithoutSpace = makeRegexParser( /^[^{}\[\]$\s]/ );
+                       regularLiteralWithSquareBrackets = makeRegexParser( /^[^{}$\\]/ );
+
+                       backslash = makeStringParser( '\\' );
+                       doubleQuote = makeStringParser( '"' );
+                       singleQuote = makeStringParser( '\'' );
+                       anyCharacter = makeRegexParser( /^./ );
+
+                       openHtmlStartTag = makeStringParser( '<' );
+                       optionalForwardSlash = makeRegexParser( /^\/?/ );
+                       openHtmlEndTag = makeStringParser( '</' );
+                       htmlAttributeEquals = makeRegexParser( /^\s*=\s*/ );
+                       closeHtmlTag = makeRegexParser( /^\s*>/ );
+
+                       function escapedLiteral() {
+                               var result = sequence( [
+                                       backslash,
+                                       anyCharacter
+                               ] );
+                               return result === null ? null : result[1];
+                       }
+                       escapedOrLiteralWithoutSpace = choice( [
+                               escapedLiteral,
+                               regularLiteralWithoutSpace
+                       ] );
+                       escapedOrLiteralWithoutBar = choice( [
+                               escapedLiteral,
+                               regularLiteralWithoutBar
+                       ] );
+                       escapedOrRegularLiteral = choice( [
+                               escapedLiteral,
+                               regularLiteral
+                       ] );
+                       // Used to define "literals" without spaces, in space-delimited situations
+                       function literalWithoutSpace() {
+                               var result = nOrMore( 1, escapedOrLiteralWithoutSpace )();
+                               return result === null ? null : result.join( '' );
+                       }
+                       // Used to define "literals" within template parameters. The pipe character is the parameter delimeter, so by default
+                       // it is not a literal in the parameter
+                       function literalWithoutBar() {
+                               var result = nOrMore( 1, escapedOrLiteralWithoutBar )();
+                               return result === null ? null : result.join( '' );
+                       }
+
+                       // Used for wikilink page names.  Like literalWithoutBar, but
+                       // without allowing escapes.
+                       function unescapedLiteralWithoutBar() {
+                               var result = nOrMore( 1, regularLiteralWithoutBar )();
+                               return result === null ? null : result.join( '' );
+                       }
+
+                       function literal() {
+                               var result = nOrMore( 1, escapedOrRegularLiteral )();
+                               return result === null ? null : result.join( '' );
+                       }
+
+                       function curlyBraceTransformExpressionLiteral() {
+                               var result = nOrMore( 1, regularLiteralWithSquareBrackets )();
+                               return result === null ? null : result.join( '' );
+                       }
+
+                       asciiAlphabetLiteral = makeRegexParser( /[A-Za-z]+/ );
+                       htmlDoubleQuoteAttributeValue = makeRegexParser( /^[^"]*/ );
+                       htmlSingleQuoteAttributeValue = makeRegexParser( /^[^']*/ );
+
+                       whitespace = makeRegexParser( /^\s+/ );
+                       dollar = makeStringParser( '$' );
+                       digits = makeRegexParser( /^\d+/ );
+
+                       function replacement() {
+                               var result = sequence( [
+                                       dollar,
+                                       digits
+                               ] );
+                               if ( result === null ) {
+                                       return null;
+                               }
+                               return [ 'REPLACE', parseInt( result[1], 10 ) - 1 ];
+                       }
+                       openExtlink = makeStringParser( '[' );
+                       closeExtlink = makeStringParser( ']' );
+                       // this extlink MUST have inner contents, e.g. [foo] not allowed; [foo bar] [foo <i>bar</i>], etc. are allowed
+                       function extlink() {
+                               var result, parsedResult;
+                               result = null;
+                               parsedResult = sequence( [
+                                       openExtlink,
+                                       nonWhitespaceExpression,
+                                       whitespace,
+                                       nOrMore( 1, expression ),
+                                       closeExtlink
+                               ] );
+                               if ( parsedResult !== null ) {
+                                       result = [ 'EXTLINK', parsedResult[1] ];
+                                       // TODO (mattflaschen, 2013-03-22): Clean this up if possible.
+                                       // It's avoiding CONCAT for single nodes, so they at least doesn't get the htmlEmitter span.
+                                       if ( parsedResult[3].length === 1 ) {
+                                               result.push( parsedResult[3][0] );
+                                       } else {
+                                               result.push( ['CONCAT'].concat( parsedResult[3] ) );
+                                       }
+                               }
+                               return result;
+                       }
+                       // this is the same as the above extlink, except that the url is being passed on as a parameter
+                       function extLinkParam() {
+                               var result = sequence( [
+                                       openExtlink,
+                                       dollar,
+                                       digits,
+                                       whitespace,
+                                       expression,
+                                       closeExtlink
+                               ] );
+                               if ( result === null ) {
+                                       return null;
+                               }
+                               return [ 'EXTLINKPARAM', parseInt( result[2], 10 ) - 1, result[4] ];
+                       }
+                       openWikilink = makeStringParser( '[[' );
+                       closeWikilink = makeStringParser( ']]' );
+                       pipe = makeStringParser( '|' );
+
+                       function template() {
+                               var result = sequence( [
+                                       openTemplate,
+                                       templateContents,
+                                       closeTemplate
+                               ] );
+                               return result === null ? null : result[1];
+                       }
+
+                       wikilinkPage = choice( [
+                               unescapedLiteralWithoutBar,
+                               template
+                       ] );
+
+                       function pipedWikilink() {
+                               var result = sequence( [
+                                       wikilinkPage,
+                                       pipe,
+                                       expression
+                               ] );
+                               return result === null ? null : [ result[0], result[2] ];
+                       }
+
+                       wikilinkContents = choice( [
+                               pipedWikilink,
+                               wikilinkPage // unpiped link
+                       ] );
+
+                       function wikilink() {
+                               var result, parsedResult, parsedLinkContents;
+                               result = null;
+
+                               parsedResult = sequence( [
+                                       openWikilink,
+                                       wikilinkContents,
+                                       closeWikilink
+                               ] );
+                               if ( parsedResult !== null ) {
+                                       parsedLinkContents = parsedResult[1];
+                                       result = [ 'WIKILINK' ].concat( parsedLinkContents );
+                               }
+                               return result;
+                       }
+
+                       // TODO: Support data- if appropriate
+                       function doubleQuotedHtmlAttributeValue() {
+                               var parsedResult = sequence( [
+                                       doubleQuote,
+                                       htmlDoubleQuoteAttributeValue,
+                                       doubleQuote
+                               ] );
+                               return parsedResult === null ? null : parsedResult[1];
+                       }
+
+                       function singleQuotedHtmlAttributeValue() {
+                               var parsedResult = sequence( [
+                                       singleQuote,
+                                       htmlSingleQuoteAttributeValue,
+                                       singleQuote
+                               ] );
+                               return parsedResult === null ? null : parsedResult[1];
+                       }
+
+                       function htmlAttribute() {
+                               var parsedResult = sequence( [
+                                       whitespace,
+                                       asciiAlphabetLiteral,
+                                       htmlAttributeEquals,
+                                       choice( [
+                                               doubleQuotedHtmlAttributeValue,
+                                               singleQuotedHtmlAttributeValue
+                                       ] )
+                               ] );
+                               return parsedResult === null ? null : [parsedResult[1], parsedResult[3]];
+                       }
+
+                       /**
+                        * Checks if HTML is allowed
+                        *
+                        * @param {string} startTagName HTML start tag name
+                        * @param {string} endTagName HTML start tag name
+                        * @param {Object} attributes array of consecutive key value pairs,
+                        *  with index 2 * n being a name and 2 * n + 1 the associated value
+                        * @return {boolean} true if this is HTML is allowed, false otherwise
+                        */
+                       function isAllowedHtml( startTagName, endTagName, attributes ) {
+                               var i, len, attributeName;
+
+                               startTagName = startTagName.toLowerCase();
+                               endTagName = endTagName.toLowerCase();
+                               if ( startTagName !== endTagName || $.inArray( startTagName, settings.allowedHtmlElements ) === -1 ) {
+                                       return false;
+                               }
+
+                               for ( i = 0, len = attributes.length; i < len; i += 2 ) {
+                                       attributeName = attributes[i];
+                                       if ( $.inArray( attributeName, settings.allowedHtmlCommonAttributes ) === -1 &&
+                                            $.inArray( attributeName, settings.allowedHtmlAttributesByElement[startTagName] || [] ) === -1 ) {
+                                               return false;
+                                       }
+                               }
+
+                               return true;
+                       }
+
+                       function htmlAttributes() {
+                               var parsedResult = nOrMore( 0, htmlAttribute )();
+                               // Un-nest attributes array due to structure of jQueryMsg operations (see emit).
+                               return concat.apply( ['HTMLATTRIBUTES'], parsedResult );
+                       }
+
+                       // Subset of allowed HTML markup.
+                       // Most elements and many attributes allowed on the server are not supported yet.
+                       function html() {
+                               var result = null, parsedOpenTagResult, parsedHtmlContents,
+                                       parsedCloseTagResult, wrappedAttributes, attributes,
+                                       startTagName, endTagName, startOpenTagPos, startCloseTagPos,
+                                       endOpenTagPos, endCloseTagPos;
+
+                               // Break into three sequence calls.  That should allow accurate reconstruction of the original HTML, and requiring an exact tag name match.
+                               // 1. open through closeHtmlTag
+                               // 2. expression
+                               // 3. openHtmlEnd through close
+                               // This will allow recording the positions to reconstruct if HTML is to be treated as text.
+
+                               startOpenTagPos = pos;
+                               parsedOpenTagResult = sequence( [
+                                       openHtmlStartTag,
+                                       asciiAlphabetLiteral,
+                                       htmlAttributes,
+                                       optionalForwardSlash,
+                                       closeHtmlTag
+                               ] );
+
+                               if ( parsedOpenTagResult === null ) {
+                                       return null;
+                               }
+
+                               endOpenTagPos = pos;
+                               startTagName = parsedOpenTagResult[1];
+
+                               parsedHtmlContents = nOrMore( 0, expression )();
+
+                               startCloseTagPos = pos;
+                               parsedCloseTagResult = sequence( [
+                                       openHtmlEndTag,
+                                       asciiAlphabetLiteral,
+                                       closeHtmlTag
+                               ] );
+
+                               if ( parsedCloseTagResult === null ) {
+                                       // Closing tag failed.  Return the start tag and contents.
+                                       return [ 'CONCAT', input.substring( startOpenTagPos, endOpenTagPos ) ]
+                                               .concat( parsedHtmlContents );
+                               }
+
+                               endCloseTagPos = pos;
+                               endTagName = parsedCloseTagResult[1];
+                               wrappedAttributes = parsedOpenTagResult[2];
+                               attributes = wrappedAttributes.slice( 1 );
+                               if ( isAllowedHtml( startTagName, endTagName, attributes ) ) {
+                                       result = [ 'HTMLELEMENT', startTagName, wrappedAttributes ]
+                                               .concat( parsedHtmlContents );
+                               } else {
+                                       // HTML is not allowed, so contents will remain how
+                                       // it was, while HTML markup at this level will be
+                                       // treated as text
+                                       // E.g. assuming script tags are not allowed:
+                                       //
+                                       // <script>[[Foo|bar]]</script>
+                                       //
+                                       // results in '&lt;script&gt;' and '&lt;/script&gt;'
+                                       // (not treated as an HTML tag), surrounding a fully
+                                       // parsed HTML link.
+                                       //
+                                       // Concatenate everything from the tag, flattening the contents.
+                                       result = [ 'CONCAT', input.substring( startOpenTagPos, endOpenTagPos ) ]
+                                               .concat( parsedHtmlContents, input.substring( startCloseTagPos, endCloseTagPos ) );
+                               }
+
+                               return result;
+                       }
+
+                       templateName = transform(
+                               // see $wgLegalTitleChars
+                               // not allowing : due to the need to catch "PLURAL:$1"
+                               makeRegexParser( /^[ !"$&'()*,.\/0-9;=?@A-Z\^_`a-z~\x80-\xFF+\-]+/ ),
+                               function ( result ) { return result.toString(); }
+                       );
+                       function templateParam() {
+                               var expr, result;
+                               result = sequence( [
+                                       pipe,
+                                       nOrMore( 0, paramExpression )
+                               ] );
+                               if ( result === null ) {
+                                       return null;
+                               }
+                               expr = result[1];
+                               // use a CONCAT operator if there are multiple nodes, otherwise return the first node, raw.
+                               return expr.length > 1 ? [ 'CONCAT' ].concat( expr ) : expr[0];
+                       }
+
+                       function templateWithReplacement() {
+                               var result = sequence( [
+                                       templateName,
+                                       colon,
+                                       replacement
+                               ] );
+                               return result === null ? null : [ result[0], result[2] ];
+                       }
+                       function templateWithOutReplacement() {
+                               var result = sequence( [
+                                       templateName,
+                                       colon,
+                                       paramExpression
+                               ] );
+                               return result === null ? null : [ result[0], result[2] ];
+                       }
+                       function templateWithOutFirstParameter() {
+                               var result = sequence( [
+                                       templateName,
+                                       colon
+                               ] );
+                               return result === null ? null : [ result[0], '' ];
+                       }
+                       colon = makeStringParser( ':' );
+                       templateContents = choice( [
+                               function () {
+                                       var res = sequence( [
+                                               // templates can have placeholders for dynamic replacement eg: {{PLURAL:$1|one car|$1 cars}}
+                                               // or no placeholders eg: {{GRAMMAR:genitive|{{SITENAME}}}
+                                               choice( [ templateWithReplacement, templateWithOutReplacement, templateWithOutFirstParameter ] ),
+                                               nOrMore( 0, templateParam )
+                                       ] );
+                                       return res === null ? null : res[0].concat( res[1] );
+                               },
+                               function () {
+                                       var res = sequence( [
+                                               templateName,
+                                               nOrMore( 0, templateParam )
+                                       ] );
+                                       if ( res === null ) {
+                                               return null;
+                                       }
+                                       return [ res[0] ].concat( res[1] );
+                               }
+                       ] );
+                       openTemplate = makeStringParser( '{{' );
+                       closeTemplate = makeStringParser( '}}' );
+                       nonWhitespaceExpression = choice( [
+                               template,
+                               wikilink,
+                               extLinkParam,
+                               extlink,
+                               replacement,
+                               literalWithoutSpace
+                       ] );
+                       paramExpression = choice( [
+                               template,
+                               wikilink,
+                               extLinkParam,
+                               extlink,
+                               replacement,
+                               literalWithoutBar
+                       ] );
+
+                       expression = choice( [
+                               template,
+                               wikilink,
+                               extLinkParam,
+                               extlink,
+                               replacement,
+                               html,
+                               literal
+                       ] );
+
+                       // Used when only {{-transformation is wanted, for 'text'
+                       // or 'escaped' formats
+                       curlyBraceTransformExpression = choice( [
+                               template,
+                               replacement,
+                               curlyBraceTransformExpressionLiteral
+                       ] );
+
+                       /**
+                        * Starts the parse
+                        *
+                        * @param {Function} rootExpression root parse function
+                        */
+                       function start( rootExpression ) {
+                               var result = nOrMore( 0, rootExpression )();
+                               if ( result === null ) {
+                                       return null;
+                               }
+                               return [ 'CONCAT' ].concat( result );
+                       }
+                       // everything above this point is supposed to be stateless/static, but
+                       // I am deferring the work of turning it into prototypes & objects. It's quite fast enough
+                       // finally let's do some actual work...
+
+                       // If you add another possible rootExpression, you must update the astCache key scheme.
+                       result = start( this.settings.onlyCurlyBraceTransform ? curlyBraceTransformExpression : expression );
+
+                       /*
+                        * For success, the p must have gotten to the end of the input
+                        * and returned a non-null.
+                        * n.b. This is part of language infrastructure, so we do not throw an internationalizable message.
+                        */
+                       if ( result === null || pos !== input.length ) {
+                               throw new Error( 'Parse error at position ' + pos.toString() + ' in input: ' + input );
+                       }
+                       return result;
+               }
+
+       };
+
+       /**
+        * htmlEmitter - object which primarily exists to emit HTML from parser ASTs
+        */
+       mw.jqueryMsg.htmlEmitter = function ( language, magic ) {
+               this.language = language;
+               var jmsg = this;
+               $.each( magic, function ( key, val ) {
+                       jmsg[ key.toLowerCase() ] = function () {
+                               return val;
+                       };
+               } );
+
+               /**
+                * (We put this method definition here, and not in prototype, to make sure it's not overwritten by any magic.)
+                * Walk entire node structure, applying replacements and template functions when appropriate
+                * @param {Mixed} node Abstract syntax tree (top node or subnode)
+                * @param {Array} replacements for $1, $2, ... $n
+                * @return {Mixed} single-string node or array of nodes suitable for jQuery appending
+                */
+               this.emit = function ( node, replacements ) {
+                       var ret, subnodes, operation,
+                               jmsg = this;
+                       switch ( typeof node ) {
+                               case 'string':
+                               case 'number':
+                                       ret = node;
+                                       break;
+                               // typeof returns object for arrays
+                               case 'object':
+                                       // node is an array of nodes
+                                       subnodes = $.map( node.slice( 1 ), function ( n ) {
+                                               return jmsg.emit( n, replacements );
+                                       } );
+                                       operation = node[0].toLowerCase();
+                                       if ( typeof jmsg[operation] === 'function' ) {
+                                               ret = jmsg[ operation ]( subnodes, replacements );
+                                       } else {
+                                               throw new Error( 'Unknown operation "' + operation + '"' );
+                                       }
+                                       break;
+                               case 'undefined':
+                                       // Parsing the empty string (as an entire expression, or as a paramExpression in a template) results in undefined
+                                       // Perhaps a more clever parser can detect this, and return the empty string? Or is that useful information?
+                                       // The logical thing is probably to return the empty string here when we encounter undefined.
+                                       ret = '';
+                                       break;
+                               default:
+                                       throw new Error( 'Unexpected type in AST: ' + typeof node );
+                       }
+                       return ret;
+               };
+       };
+
+       // For everything in input that follows double-open-curly braces, there should be an equivalent parser
+       // function. For instance {{PLURAL ... }} will be processed by 'plural'.
+       // If you have 'magic words' then configure the parser to have them upon creation.
+       //
+       // An emitter method takes the parent node, the array of subnodes and the array of replacements (the values that $1, $2... should translate to).
+       // Note: all such functions must be pure, with the exception of referring to other pure functions via this.language (convertPlural and so on)
+       mw.jqueryMsg.htmlEmitter.prototype = {
+               /**
+                * Parsing has been applied depth-first we can assume that all nodes here are single nodes
+                * Must return a single node to parents -- a jQuery with synthetic span
+                * However, unwrap any other synthetic spans in our children and pass them upwards
+                * @param {Mixed[]} nodes Some single nodes, some arrays of nodes
+                * @return {jQuery}
+                */
+               concat: function ( nodes ) {
+                       var $span = $( '<span>' ).addClass( 'mediaWiki_htmlEmitter' );
+                       $.each( nodes, function ( i, node ) {
+                               if ( node instanceof jQuery && node.hasClass( 'mediaWiki_htmlEmitter' ) ) {
+                                       $.each( node.contents(), function ( j, childNode ) {
+                                               appendWithoutParsing( $span, childNode );
+                                       } );
+                               } else {
+                                       // Let jQuery append nodes, arrays of nodes and jQuery objects
+                                       // other things (strings, numbers, ..) are appended as text nodes (not as HTML strings)
+                                       appendWithoutParsing( $span, node );
+                               }
+                       } );
+                       return $span;
+               },
+
+               /**
+                * Return escaped replacement of correct index, or string if unavailable.
+                * Note that we expect the parsed parameter to be zero-based. i.e. $1 should have become [ 0 ].
+                * if the specified parameter is not found return the same string
+                * (e.g. "$99" -> parameter 98 -> not found -> return "$99" )
+                *
+                * TODO: Throw error if nodes.length > 1 ?
+                *
+                * @param {Array} nodes List of one element, integer, n >= 0
+                * @param {Array} replacements List of at least n strings
+                * @return {String} replacement
+                */
+               replace: function ( nodes, replacements ) {
+                       var index = parseInt( nodes[0], 10 );
+
+                       if ( index < replacements.length ) {
+                               return replacements[index];
+                       } else {
+                               // index not found, fallback to displaying variable
+                               return '$' + ( index + 1 );
+                       }
+               },
+
+               /**
+                * Transform wiki-link
+                *
+                * TODO:
+                * It only handles basic cases, either no pipe, or a pipe with an explicit
+                * anchor.
+                *
+                * It does not attempt to handle features like the pipe trick.
+                * However, the pipe trick should usually not be present in wikitext retrieved
+                * from the server, since the replacement is done at save time.
+                * It may, though, if the wikitext appears in extension-controlled content.
+                *
+                * @param nodes
+                */
+               wikilink: function ( nodes ) {
+                       var page, anchor, url;
+
+                       page = nodes[0];
+                       url = mw.util.getUrl( page );
+
+                       // [[Some Page]] or [[Namespace:Some Page]]
+                       if ( nodes.length === 1 ) {
+                               anchor = page;
+                       }
+
+                       /*
+                        * [[Some Page|anchor text]] or
+                        * [[Namespace:Some Page|anchor]
+                        */
+                       else {
+                               anchor = nodes[1];
+                       }
+
+                       return $( '<a>' ).attr( {
+                               title: page,
+                               href: url
+                       } ).text( anchor );
+               },
+
+               /**
+                * Converts array of HTML element key value pairs to object
+                *
+                * @param {Array} nodes Array of consecutive key value pairs, with index 2 * n being a
+                *  name and 2 * n + 1 the associated value
+                * @return {Object} Object mapping attribute name to attribute value
+                */
+               htmlattributes: function ( nodes ) {
+                       var i, len, mapping = {};
+                       for ( i = 0, len = nodes.length; i < len; i += 2 ) {
+                               mapping[nodes[i]] = decodePrimaryHtmlEntities( nodes[i + 1] );
+                       }
+                       return mapping;
+               },
+
+               /**
+                * Handles an (already-validated) HTML element.
+                *
+                * @param {Array} nodes Nodes to process when creating element
+                * @return {jQuery|Array} jQuery node for valid HTML or array for disallowed element
+                */
+               htmlelement: function ( nodes ) {
+                       var tagName, attributes, contents, $element;
+
+                       tagName = nodes.shift();
+                       attributes = nodes.shift();
+                       contents = nodes;
+                       $element = $( document.createElement( tagName ) ).attr( attributes );
+                       return appendWithoutParsing( $element, contents );
+               },
+
+               /**
+                * Transform parsed structure into external link
+                * If the href is a jQuery object, treat it as "enclosing" the link text.
+                *
+                * - ... function, treat it as the click handler.
+                * - ... string, treat it as a URI.
+                *
+                * TODO: throw an error if nodes.length > 2 ?
+                *
+                * @param {Array} nodes List of two elements, {jQuery|Function|String} and {String}
+                * @return {jQuery}
+                */
+               extlink: function ( nodes ) {
+                       var $el,
+                               arg = nodes[0],
+                               contents = nodes[1];
+                       if ( arg instanceof jQuery ) {
+                               $el = arg;
+                       } else {
+                               $el = $( '<a>' );
+                               if ( typeof arg === 'function' ) {
+                                       $el.click( arg ).attr( 'href', '#' );
+                               } else {
+                                       $el.attr( 'href', arg.toString() );
+                               }
+                       }
+                       return appendWithoutParsing( $el, contents );
+               },
+
+               /**
+                * This is basically use a combination of replace + external link (link with parameter
+                * as url), but we don't want to run the regular replace here-on: inserting a
+                * url as href-attribute of a link will automatically escape it already, so
+                * we don't want replace to (manually) escape it as well.
+                *
+                * TODO: throw error if nodes.length > 1 ?
+                *
+                * @param {Array} nodes List of one element, integer, n >= 0
+                * @param {Array} replacements List of at least n strings
+                * @return {string} replacement
+                */
+               extlinkparam: function ( nodes, replacements ) {
+                       var replacement,
+                               index = parseInt( nodes[0], 10 );
+                       if ( index < replacements.length ) {
+                               replacement = replacements[index];
+                       } else {
+                               replacement = '$' + ( index + 1 );
+                       }
+                       return this.extlink( [ replacement, nodes[1] ] );
+               },
+
+               /**
+                * Transform parsed structure into pluralization
+                * n.b. The first node may be a non-integer (for instance, a string representing an Arabic number).
+                * So convert it back with the current language's convertNumber.
+                * @param {Array} nodes List of nodes, [ {string|number}, {string}, {string} ... ]
+                * @return {string} selected pluralized form according to current language
+                */
+               plural: function ( nodes ) {
+                       var forms, count;
+                       count = parseFloat( this.language.convertNumber( nodes[0], true ) );
+                       forms = nodes.slice( 1 );
+                       return forms.length ? this.language.convertPlural( count, forms ) : '';
+               },
+
+               /**
+                * Transform parsed structure according to gender.
+                *
+                * Usage: {{gender:[ mw.user object | '' | 'male' | 'female' | 'unknown' ] | masculine form | feminine form | neutral form}}.
+                *
+                * The first node must be one of:
+                * - the mw.user object (or a compatible one)
+                * - an empty string - indicating the current user, same effect as passing the mw.user object
+                * - a gender string ('male', 'female' or 'unknown')
+                *
+                * @param {Array} nodes List of nodes, [ {string|mw.user}, {string}, {string}, {string} ]
+                * @return {string} Selected gender form according to current language
+                */
+               gender: function ( nodes ) {
+                       var gender,
+                               maybeUser = nodes[0],
+                               forms = nodes.slice( 1 );
+
+                       if ( maybeUser === '' ) {
+                               maybeUser = mw.user;
+                       }
+
+                       // If we are passed a mw.user-like object, check their gender.
+                       // Otherwise, assume the gender string itself was passed .
+                       if ( maybeUser && maybeUser.options instanceof mw.Map ) {
+                               gender = maybeUser.options.get( 'gender' );
+                       } else {
+                               gender = maybeUser;
+                       }
+
+                       return this.language.gender( gender, forms );
+               },
+
+               /**
+                * Transform parsed structure into grammar conversion.
+                * Invoked by putting `{{grammar:form|word}}` in a message
+                * @param {Array} nodes List of nodes [{Grammar case eg: genitive}, {string word}]
+                * @return {string} selected grammatical form according to current language
+                */
+               grammar: function ( nodes ) {
+                       var form = nodes[0],
+                               word = nodes[1];
+                       return word && form && this.language.convertGrammar( word, form );
+               },
+
+               /**
+                * Tranform parsed structure into a int: (interface language) message include
+                * Invoked by putting `{{int:othermessage}}` into a message
+                * @param {Array} nodes List of nodes
+                * @return {string} Other message
+                */
+               'int': function ( nodes ) {
+                       return mw.jqueryMsg.getMessageFunction()( nodes[0].toLowerCase() );
+               },
+
+               /**
+                * Takes an unformatted number (arab, no group separators and . as decimal separator)
+                * and outputs it in the localized digit script and formatted with decimal
+                * separator, according to the current language.
+                * @param {Array} nodes List of nodes
+                * @return {number|string} Formatted number
+                */
+               formatnum: function ( nodes ) {
+                       var isInteger = ( nodes[1] && nodes[1] === 'R' ) ? true : false,
+                               number = nodes[0];
+
+                       return this.language.convertNumber( number, isInteger );
+               }
+       };
+
+       // Deprecated! don't rely on gM existing.
+       // The window.gM ought not to be required - or if required, not required here.
+       // But moving it to extensions breaks it (?!)
+       // Need to fix plugin so it could do attributes as well, then will be okay to remove this.
+       // @deprecated since 1.23
+       mw.log.deprecate( window, 'gM', mw.jqueryMsg.getMessageFunction(), 'Use mw.message( ... ).parse() instead.' );
+
+       /**
+        * @method
+        * @member jQuery
+        * @see mw.jqueryMsg#getPlugin
+        */
+       $.fn.msg = mw.jqueryMsg.getPlugin();
+
+       // Replace the default message parser with jqueryMsg
+       oldParser = mw.Message.prototype.parser;
+       mw.Message.prototype.parser = function () {
+               var messageFunction;
+
+               // TODO: should we cache the message function so we don't create a new one every time? Benchmark this maybe?
+               // Caching is somewhat problematic, because we do need different message functions for different maps, so
+               // we'd have to cache the parser as a member of this.map, which sounds a bit ugly.
+               // Do not use mw.jqueryMsg unless required
+               if ( this.format === 'plain' || !/\{\{|[\[<>]/.test( this.map.get( this.key ) ) ) {
+                       // Fall back to mw.msg's simple parser
+                       return oldParser.apply( this );
+               }
+
+               messageFunction = mw.jqueryMsg.getMessageFunction( {
+                       'messages': this.map,
+                       // For format 'escaped', escaping part is handled by mediawiki.js
+                       'format': this.format
+               } );
+               return messageFunction( this.key, this.parameters );
+       };
+
+}( mediaWiki, jQuery ) );
diff --git a/resources/src/mediawiki/mediawiki.jqueryMsg.peg b/resources/src/mediawiki/mediawiki.jqueryMsg.peg
new file mode 100644 (file)
index 0000000..716c326
--- /dev/null
@@ -0,0 +1,85 @@
+/* PEG grammar for a subset of wikitext, useful in the MediaWiki frontend */
+
+start
+  = e:expression* { return e.length > 1 ? [ "CONCAT" ].concat(e) : e[0]; }
+
+expression
+  = template
+  / link
+  / extlink
+  / replacement
+  / literal
+
+paramExpression
+  = template
+  / link
+  / extlink
+  / replacement
+  / literalWithoutBar
+
+template
+  = "{{" t:templateContents "}}" { return t; }
+
+templateContents
+  = twr:templateWithReplacement p:templateParam* { return twr.concat(p) }
+  / twr:templateWithOutReplacement p:templateParam* { return twr.concat(p) }
+  / twr:templateWithOutFirstParameter p:templateParam* { return twr.concat(p) }
+  / t:templateName p:templateParam* { return p.length ? [ t, p ] : [ t ] }
+
+templateWithReplacement
+  = t:templateName ":" r:replacement { return [ t, r ] }
+
+templateWithOutReplacement
+  = t:templateName ":" p:paramExpression { return [ t, p ] }
+
+templateWithOutFirstParameter
+  = t:templateName ":" { return [ t, "" ] }
+
+templateParam
+  = "|" e:paramExpression* { return e.length > 1 ? [ "CONCAT" ].concat(e) : e[0]; }
+
+templateName
+  = tn:[A-Za-z_]+ { return tn.join('').toUpperCase() }
+
+/* TODO: Update to reflect separate piped and unpiped handling */
+link
+  = "[[" w:expression "]]" { return [ 'WLINK', w ]; }
+
+extlink
+  = "[" url:url whitespace text:expression "]" { return [ 'LINK', url, text ] }
+
+url
+  = url:[^ ]+ { return url.join(''); }
+
+whitespace
+  = [ ]+
+
+replacement
+  = '$' digits:digits { return [ 'REPLACE', parseInt( digits, 10 ) - 1 ] }
+
+digits
+  = [0-9]+
+
+literal
+  = lit:escapedOrRegularLiteral+ { return lit.join(''); }
+
+literalWithoutBar
+  = lit:escapedOrLiteralWithoutBar+ { return lit.join(''); }
+
+escapedOrRegularLiteral
+  = escapedLiteral
+  / regularLiteral
+
+escapedOrLiteralWithoutBar
+  = escapedLiteral
+  / regularLiteralWithoutBar
+
+escapedLiteral
+  = "\\" escaped:. { return escaped; }
+
+regularLiteral
+  = [^{}\[\]$\\]
+
+regularLiteralWithoutBar
+  = [^{}\[\]$\\|]
+
diff --git a/resources/src/mediawiki/mediawiki.js b/resources/src/mediawiki/mediawiki.js
new file mode 100644 (file)
index 0000000..f6154ee
--- /dev/null
@@ -0,0 +1,2419 @@
+/**
+ * Base library for MediaWiki.
+ *
+ * Exposed as globally as `mediaWiki` with `mw` as shortcut.
+ *
+ * @class mw
+ * @alternateClassName mediaWiki
+ * @singleton
+ */
+
+var mw = ( function ( $, undefined ) {
+       'use strict';
+
+       /* Private Members */
+
+       var hasOwn = Object.prototype.hasOwnProperty,
+               slice = Array.prototype.slice,
+               trackCallbacks = $.Callbacks( 'memory' ),
+               trackQueue = [];
+
+       /**
+        * Log a message to window.console, if possible. Useful to force logging of some
+        * errors that are otherwise hard to detect (I.e., this logs also in production mode).
+        * Gets console references in each invocation, so that delayed debugging tools work
+        * fine. No need for optimization here, which would only result in losing logs.
+        *
+        * @private
+        * @method log_
+        * @param {string} msg text for the log entry.
+        * @param {Error} [e]
+        */
+       function log( msg, e ) {
+               var console = window.console;
+               if ( console && console.log ) {
+                       console.log( msg );
+                       // If we have an exception object, log it through .error() to trigger
+                       // proper stacktraces in browsers that support it. There are no (known)
+                       // browsers that don't support .error(), that do support .log() and
+                       // have useful exception handling through .log().
+                       if ( e && console.error ) {
+                               console.error( String( e ), e );
+                       }
+               }
+       }
+
+       /* Object constructors */
+
+       /**
+        * Creates an object that can be read from or written to from prototype functions
+        * that allow both single and multiple variables at once.
+        *
+        *     @example
+        *
+        *     var addies, wanted, results;
+        *
+        *     // Create your address book
+        *     addies = new mw.Map();
+        *
+        *     // This data could be coming from an external source (eg. API/AJAX)
+        *     addies.set( {
+        *         'John Doe' : '10 Wall Street, New York, USA',
+        *         'Jane Jackson' : '21 Oxford St, London, UK',
+        *         'Dominique van Halen' : 'Kalverstraat 7, Amsterdam, NL'
+        *     } );
+        *
+        *     wanted = ['Dominique van Halen', 'George Johnson', 'Jane Jackson'];
+        *
+        *     // You can detect missing keys first
+        *     if ( !addies.exists( wanted ) ) {
+        *         // One or more are missing (in this case: "George Johnson")
+        *         mw.log( 'One or more names were not found in your address book' );
+        *     }
+        *
+        *     // Or just let it give you what it can
+        *     results = addies.get( wanted, 'Middle of Nowhere, Alaska, US' );
+        *     mw.log( results['Jane Jackson'] ); // "21 Oxford St, London, UK"
+        *     mw.log( results['George Johnson'] ); // "Middle of Nowhere, Alaska, US"
+        *
+        * @class mw.Map
+        *
+        * @constructor
+        * @param {Object|boolean} [values] Value-bearing object to map, or boolean
+        *  true to map over the global object. Defaults to an empty object.
+        */
+       function Map( values ) {
+               this.values = values === true ? window : ( values || {} );
+               return this;
+       }
+
+       Map.prototype = {
+               /**
+                * Get the value of one or multiple a keys.
+                *
+                * If called with no arguments, all values will be returned.
+                *
+                * @param {string|Array} selection String key or array of keys to get values for.
+                * @param {Mixed} [fallback] Value to use in case key(s) do not exist.
+                * @return mixed If selection was a string returns the value or null,
+                *  If selection was an array, returns an object of key/values (value is null if not found),
+                *  If selection was not passed or invalid, will return the 'values' object member (be careful as
+                *  objects are always passed by reference in JavaScript!).
+                * @return {string|Object|null} Values as a string or object, null if invalid/inexistant.
+                */
+               get: function ( selection, fallback ) {
+                       var results, i;
+                       // If we only do this in the `return` block, it'll fail for the
+                       // call to get() from the mutli-selection block.
+                       fallback = arguments.length > 1 ? fallback : null;
+
+                       if ( $.isArray( selection ) ) {
+                               selection = slice.call( selection );
+                               results = {};
+                               for ( i = 0; i < selection.length; i++ ) {
+                                       results[selection[i]] = this.get( selection[i], fallback );
+                               }
+                               return results;
+                       }
+
+                       if ( typeof selection === 'string' ) {
+                               if ( !hasOwn.call( this.values, selection ) ) {
+                                       return fallback;
+                               }
+                               return this.values[selection];
+                       }
+
+                       if ( selection === undefined ) {
+                               return this.values;
+                       }
+
+                       // invalid selection key
+                       return null;
+               },
+
+               /**
+                * Sets one or multiple key/value pairs.
+                *
+                * @param {string|Object} selection String key to set value for, or object mapping keys to values.
+                * @param {Mixed} [value] Value to set (optional, only in use when key is a string)
+                * @return {Boolean} This returns true on success, false on failure.
+                */
+               set: function ( selection, value ) {
+                       var s;
+
+                       if ( $.isPlainObject( selection ) ) {
+                               for ( s in selection ) {
+                                       this.values[s] = selection[s];
+                               }
+                               return true;
+                       }
+                       if ( typeof selection === 'string' && arguments.length > 1 ) {
+                               this.values[selection] = value;
+                               return true;
+                       }
+                       return false;
+               },
+
+               /**
+                * Checks if one or multiple keys exist.
+                *
+                * @param {Mixed} selection String key or array of keys to check
+                * @return {boolean} Existence of key(s)
+                */
+               exists: function ( selection ) {
+                       var s;
+
+                       if ( $.isArray( selection ) ) {
+                               for ( s = 0; s < selection.length; s++ ) {
+                                       if ( typeof selection[s] !== 'string' || !hasOwn.call( this.values, selection[s] ) ) {
+                                               return false;
+                                       }
+                               }
+                               return true;
+                       }
+                       return typeof selection === 'string' && hasOwn.call( this.values, selection );
+               }
+       };
+
+       /**
+        * Object constructor for messages.
+        *
+        * Similar to the Message class in MediaWiki PHP.
+        *
+        * Format defaults to 'text'.
+        *
+        *     @example
+        *
+        *     var obj, str;
+        *     mw.messages.set( {
+        *         'hello': 'Hello world',
+        *         'hello-user': 'Hello, $1!',
+        *         'welcome-user': 'Welcome back to $2, $1! Last visit by $1: $3'
+        *     } );
+        *
+        *     obj = new mw.Message( mw.messages, 'hello' );
+        *     mw.log( obj.text() );
+        *     // Hello world
+        *
+        *     obj = new mw.Message( mw.messages, 'hello-user', [ 'John Doe' ] );
+        *     mw.log( obj.text() );
+        *     // Hello, John Doe!
+        *
+        *     obj = new mw.Message( mw.messages, 'welcome-user', [ 'John Doe', 'Wikipedia', '2 hours ago' ] );
+        *     mw.log( obj.text() );
+        *     // Welcome back to Wikipedia, John Doe! Last visit by John Doe: 2 hours ago
+        *
+        *     // Using mw.message shortcut
+        *     obj = mw.message( 'hello-user', 'John Doe' );
+        *     mw.log( obj.text() );
+        *     // Hello, John Doe!
+        *
+        *     // Using mw.msg shortcut
+        *     str = mw.msg( 'hello-user', 'John Doe' );
+        *     mw.log( str );
+        *     // Hello, John Doe!
+        *
+        *     // Different formats
+        *     obj = new mw.Message( mw.messages, 'hello-user', [ 'John "Wiki" <3 Doe' ] );
+        *
+        *     obj.format = 'text';
+        *     str = obj.toString();
+        *     // Same as:
+        *     str = obj.text();
+        *
+        *     mw.log( str );
+        *     // Hello, John "Wiki" <3 Doe!
+        *
+        *     mw.log( obj.escaped() );
+        *     // Hello, John &quot;Wiki&quot; &lt;3 Doe!
+        *
+        * @class mw.Message
+        *
+        * @constructor
+        * @param {mw.Map} map Message storage
+        * @param {string} key
+        * @param {Array} [parameters]
+        */
+       function Message( map, key, parameters ) {
+               this.format = 'text';
+               this.map = map;
+               this.key = key;
+               this.parameters = parameters === undefined ? [] : slice.call( parameters );
+               return this;
+       }
+
+       Message.prototype = {
+               /**
+                * Simple message parser, does $N replacement and nothing else.
+                *
+                * This may be overridden to provide a more complex message parser.
+                *
+                * The primary override is in mediawiki.jqueryMsg.
+                *
+                * This function will not be called for nonexistent messages.
+                */
+               parser: function () {
+                       var parameters = this.parameters;
+                       return this.map.get( this.key ).replace( /\$(\d+)/g, function ( str, match ) {
+                               var index = parseInt( match, 10 ) - 1;
+                               return parameters[index] !== undefined ? parameters[index] : '$' + match;
+                       } );
+               },
+
+               /**
+                * Appends (does not replace) parameters for replacement to the .parameters property.
+                *
+                * @param {Array} parameters
+                * @chainable
+                */
+               params: function ( parameters ) {
+                       var i;
+                       for ( i = 0; i < parameters.length; i += 1 ) {
+                               this.parameters.push( parameters[i] );
+                       }
+                       return this;
+               },
+
+               /**
+                * Converts message object to its string form based on the state of format.
+                *
+                * @return {string} Message as a string in the current form or `<key>` if key does not exist.
+                */
+               toString: function () {
+                       var text;
+
+                       if ( !this.exists() ) {
+                               // Use <key> as text if key does not exist
+                               if ( this.format === 'escaped' || this.format === 'parse' ) {
+                                       // format 'escaped' and 'parse' need to have the brackets and key html escaped
+                                       return mw.html.escape( '<' + this.key + '>' );
+                               }
+                               return '<' + this.key + '>';
+                       }
+
+                       if ( this.format === 'plain' || this.format === 'text' || this.format === 'parse' ) {
+                               text = this.parser();
+                       }
+
+                       if ( this.format === 'escaped' ) {
+                               text = this.parser();
+                               text = mw.html.escape( text );
+                       }
+
+                       return text;
+               },
+
+               /**
+                * Changes format to 'parse' and converts message to string
+                *
+                * If jqueryMsg is loaded, this parses the message text from wikitext
+                * (where supported) to HTML
+                *
+                * Otherwise, it is equivalent to plain.
+                *
+                * @return {string} String form of parsed message
+                */
+               parse: function () {
+                       this.format = 'parse';
+                       return this.toString();
+               },
+
+               /**
+                * Changes format to 'plain' and converts message to string
+                *
+                * This substitutes parameters, but otherwise does not change the
+                * message text.
+                *
+                * @return {string} String form of plain message
+                */
+               plain: function () {
+                       this.format = 'plain';
+                       return this.toString();
+               },
+
+               /**
+                * Changes format to 'text' and converts message to string
+                *
+                * If jqueryMsg is loaded, {{-transformation is done where supported
+                * (such as {{plural:}}, {{gender:}}, {{int:}}).
+                *
+                * Otherwise, it is equivalent to plain.
+                */
+               text: function () {
+                       this.format = 'text';
+                       return this.toString();
+               },
+
+               /**
+                * Changes the format to 'escaped' and converts message to string
+                *
+                * This is equivalent to using the 'text' format (see text method), then
+                * HTML-escaping the output.
+                *
+                * @return {string} String form of html escaped message
+                */
+               escaped: function () {
+                       this.format = 'escaped';
+                       return this.toString();
+               },
+
+               /**
+                * Checks if message exists
+                *
+                * @see mw.Map#exists
+                * @return {boolean}
+                */
+               exists: function () {
+                       return this.map.exists( this.key );
+               }
+       };
+
+       /**
+        * @class mw
+        */
+       return {
+               /* Public Members */
+
+               /**
+                * Get the current time, measured in milliseconds since January 1, 1970 (UTC).
+                *
+                * On browsers that implement the Navigation Timing API, this function will produce floating-point
+                * values with microsecond precision that are guaranteed to be monotonic. On all other browsers,
+                * it will fall back to using `Date`.
+                *
+                * @return {number} Current time
+                */
+               now: ( function () {
+                       var perf = window.performance,
+                               navStart = perf && perf.timing && perf.timing.navigationStart;
+                       return navStart && typeof perf.now === 'function' ?
+                               function () { return navStart + perf.now(); } :
+                               function () { return +new Date(); };
+               }() ),
+
+               /**
+                * Track an analytic event.
+                *
+                * This method provides a generic means for MediaWiki JavaScript code to capture state
+                * information for analysis. Each logged event specifies a string topic name that describes
+                * the kind of event that it is. Topic names consist of dot-separated path components,
+                * arranged from most general to most specific. Each path component should have a clear and
+                * well-defined purpose.
+                *
+                * Data handlers are registered via `mw.trackSubscribe`, and receive the full set of
+                * events that match their subcription, including those that fired before the handler was
+                * bound.
+                *
+                * @param {string} topic Topic name
+                * @param {Object} [data] Data describing the event, encoded as an object
+                */
+               track: function ( topic, data ) {
+                       trackQueue.push( { topic: topic, timeStamp: mw.now(), data: data } );
+                       trackCallbacks.fire( trackQueue );
+               },
+
+               /**
+                * Register a handler for subset of analytic events, specified by topic
+                *
+                * Handlers will be called once for each tracked event, including any events that fired before the
+                * handler was registered; 'this' is set to a plain object with a 'timeStamp' property indicating
+                * the exact time at which the event fired, a string 'topic' property naming the event, and a
+                * 'data' property which is an object of event-specific data. The event topic and event data are
+                * also passed to the callback as the first and second arguments, respectively.
+                *
+                * @param {string} topic Handle events whose name starts with this string prefix
+                * @param {Function} callback Handler to call for each matching tracked event
+                */
+               trackSubscribe: function ( topic, callback ) {
+                       var seen = 0;
+
+                       trackCallbacks.add( function ( trackQueue ) {
+                               var event;
+                               for ( ; seen < trackQueue.length; seen++ ) {
+                                       event = trackQueue[ seen ];
+                                       if ( event.topic.indexOf( topic ) === 0 ) {
+                                               callback.call( event, event.topic, event.data );
+                                       }
+                               }
+                       } );
+               },
+
+               // Make the Map constructor publicly available.
+               Map: Map,
+
+               // Make the Message constructor publicly available.
+               Message: Message,
+
+               /**
+                * Map of configuration values
+                *
+                * Check out [the complete list of configuration values](https://www.mediawiki.org/wiki/Manual:Interface/JavaScript#mw.config)
+                * on mediawiki.org.
+                *
+                * If `$wgLegacyJavaScriptGlobals` is true, this Map will add its values to the
+                * global `window` object.
+                *
+                * @property {mw.Map} config
+                */
+               // Dummy placeholder. Re-assigned in ResourceLoaderStartupModule to an instance of `mw.Map`.
+               config: null,
+
+               /**
+                * Empty object that plugins can be installed in.
+                * @property
+                */
+               libs: {},
+
+               /**
+                * Access container for deprecated functionality that can be moved from
+                * from their legacy location and attached to this object (e.g. a global
+                * function that is deprecated and as stop-gap can be exposed through here).
+                *
+                * This was reserved for future use but never ended up being used.
+                *
+                * @deprecated since 1.22: Let deprecated identifiers keep their original name
+                *  and use mw.log#deprecate to create an access container for tracking.
+                * @property
+                */
+               legacy: {},
+
+               /**
+                * Localization system
+                * @property {mw.Map}
+                */
+               messages: new Map(),
+
+               /* Public Methods */
+
+               /**
+                * Get a message object.
+                *
+                * Shorcut for `new mw.Message( mw.messages, key, parameters )`.
+                *
+                * @see mw.Message
+                * @param {string} key Key of message to get
+                * @param {Mixed...} parameters Parameters for the $N replacements in messages.
+                * @return {mw.Message}
+                */
+               message: function ( key ) {
+                       // Variadic arguments
+                       var parameters = slice.call( arguments, 1 );
+                       return new Message( mw.messages, key, parameters );
+               },
+
+               /**
+                * Get a message string using the (default) 'text' format.
+                *
+                * Shortcut for `mw.message( key, parameters... ).text()`.
+                *
+                * @see mw.Message
+                * @param {string} key Key of message to get
+                * @param {Mixed...} parameters Parameters for the $N replacements in messages.
+                * @return {string}
+                */
+               msg: function () {
+                       return mw.message.apply( mw.message, arguments ).toString();
+               },
+
+               /**
+                * Dummy placeholder for {@link mw.log}
+                * @method
+                */
+               log: ( function () {
+                       // Also update the restoration of methods in mediawiki.log.js
+                       // when adding or removing methods here.
+                       var log = function () {};
+
+                       /**
+                        * @class mw.log
+                        * @singleton
+                        */
+
+                       /**
+                        * Write a message the console's warning channel.
+                        * Also logs a stacktrace for easier debugging.
+                        * Each action is silently ignored if the browser doesn't support it.
+                        *
+                        * @param {string...} msg Messages to output to console
+                        */
+                       log.warn = function () {
+                               var console = window.console;
+                               if ( console && console.warn ) {
+                                       console.warn.apply( console, arguments );
+                                       if ( console.trace ) {
+                                               console.trace();
+                                       }
+                               }
+                       };
+
+                       /**
+                        * Create a property in a host object that, when accessed, will produce
+                        * a deprecation warning in the console with backtrace.
+                        *
+                        * @param {Object} obj Host object of deprecated property
+                        * @param {string} key Name of property to create in `obj`
+                        * @param {Mixed} val The value this property should return when accessed
+                        * @param {string} [msg] Optional text to include in the deprecation message.
+                        */
+                       log.deprecate = !Object.defineProperty ? function ( obj, key, val ) {
+                               obj[key] = val;
+                       } : function ( obj, key, val, msg ) {
+                               msg = 'Use of "' + key + '" is deprecated.' + ( msg ? ( ' ' + msg ) : '' );
+                               try {
+                                       Object.defineProperty( obj, key, {
+                                               configurable: true,
+                                               enumerable: true,
+                                               get: function () {
+                                                       mw.track( 'mw.deprecate', key );
+                                                       mw.log.warn( msg );
+                                                       return val;
+                                               },
+                                               set: function ( newVal ) {
+                                                       mw.track( 'mw.deprecate', key );
+                                                       mw.log.warn( msg );
+                                                       val = newVal;
+                                               }
+                                       } );
+                               } catch ( err ) {
+                                       // IE8 can throw on Object.defineProperty
+                                       obj[key] = val;
+                               }
+                       };
+
+                       return log;
+               }() ),
+
+               /**
+                * Client-side module loader which integrates with the MediaWiki ResourceLoader
+                * @class mw.loader
+                * @singleton
+                */
+               loader: ( function () {
+
+                       /* Private Members */
+
+                       /**
+                        * Mapping of registered modules
+                        *
+                        * The jquery module is pre-registered, because it must have already
+                        * been provided for this object to have been built, and in debug mode
+                        * jquery would have been provided through a unique loader request,
+                        * making it impossible to hold back registration of jquery until after
+                        * mediawiki.
+                        *
+                        * For exact details on support for script, style and messages, look at
+                        * mw.loader.implement.
+                        *
+                        * Format:
+                        *     {
+                        *         'moduleName': {
+                        *             'version': ############## (unix timestamp),
+                        *             'dependencies': ['required.foo', 'bar.also', ...], (or) function () {}
+                        *             'group': 'somegroup', (or) null,
+                        *             'source': 'local', 'someforeignwiki', (or) null
+                        *             'state': 'registered', 'loaded', 'loading', 'ready', 'error' or 'missing'
+                        *             'script': ...,
+                        *             'style': ...,
+                        *             'messages': { 'key': 'value' },
+                        *         }
+                        *     }
+                        *
+                        * @property
+                        * @private
+                        */
+                       var registry = {},
+                               //
+                               // Mapping of sources, keyed by source-id, values are objects.
+                               // Format:
+                               //      {
+                               //              'sourceId': {
+                               //                      'loadScript': 'http://foo.bar/w/load.php'
+                               //              }
+                               //      }
+                               //
+                               sources = {},
+                               // List of modules which will be loaded as when ready
+                               batch = [],
+                               // List of modules to be loaded
+                               queue = [],
+                               // List of callback functions waiting for modules to be ready to be called
+                               jobs = [],
+                               // Selector cache for the marker element. Use getMarker() to get/use the marker!
+                               $marker = null,
+                               // Buffer for addEmbeddedCSS.
+                               cssBuffer = '',
+                               // Callbacks for addEmbeddedCSS.
+                               cssCallbacks = $.Callbacks();
+
+                       /* Private methods */
+
+                       function getMarker() {
+                               // Cached ?
+                               if ( $marker ) {
+                                       return $marker;
+                               }
+
+                               $marker = $( 'meta[name="ResourceLoaderDynamicStyles"]' );
+                               if ( $marker.length ) {
+                                       return $marker;
+                               }
+                               mw.log( 'getMarker> No <meta name="ResourceLoaderDynamicStyles"> found, inserting dynamically.' );
+                               $marker = $( '<meta>' ).attr( 'name', 'ResourceLoaderDynamicStyles' ).appendTo( 'head' );
+
+                               return $marker;
+                       }
+
+                       /**
+                        * Create a new style tag and add it to the DOM.
+                        *
+                        * @private
+                        * @param {string} text CSS text
+                        * @param {HTMLElement|jQuery} [nextnode=document.head] The element where the style tag should be
+                        *  inserted before. Otherwise it will be appended to `<head>`.
+                        * @return {HTMLElement} Reference to the created `<style>` element.
+                        */
+                       function newStyleTag( text, nextnode ) {
+                               var s = document.createElement( 'style' );
+                               // Insert into document before setting cssText (bug 33305)
+                               if ( nextnode ) {
+                                       // Must be inserted with native insertBefore, not $.fn.before.
+                                       // When using jQuery to insert it, like $nextnode.before( s ),
+                                       // then IE6 will throw "Access is denied" when trying to append
+                                       // to .cssText later. Some kind of weird security measure.
+                                       // http://stackoverflow.com/q/12586482/319266
+                                       // Works: jsfiddle.net/zJzMy/1
+                                       // Fails: jsfiddle.net/uJTQz
+                                       // Works again: http://jsfiddle.net/Azr4w/ (diff: the next 3 lines)
+                                       if ( nextnode.jquery ) {
+                                               nextnode = nextnode.get( 0 );
+                                       }
+                                       nextnode.parentNode.insertBefore( s, nextnode );
+                               } else {
+                                       document.getElementsByTagName( 'head' )[0].appendChild( s );
+                               }
+                               if ( s.styleSheet ) {
+                                       // IE
+                                       s.styleSheet.cssText = text;
+                               } else {
+                                       // Other browsers.
+                                       // (Safari sometimes borks on non-string values,
+                                       // play safe by casting to a string, just in case.)
+                                       s.appendChild( document.createTextNode( String( text ) ) );
+                               }
+                               return s;
+                       }
+
+                       /**
+                        * Checks whether it is safe to add this css to a stylesheet.
+                        *
+                        * @private
+                        * @param {string} cssText
+                        * @return {boolean} False if a new one must be created.
+                        */
+                       function canExpandStylesheetWith( cssText ) {
+                               // Makes sure that cssText containing `@import`
+                               // rules will end up in a new stylesheet (as those only work when
+                               // placed at the start of a stylesheet; bug 35562).
+                               return cssText.indexOf( '@import' ) === -1;
+                       }
+
+                       /**
+                        * Add a bit of CSS text to the current browser page.
+                        *
+                        * The CSS will be appended to an existing ResourceLoader-created `<style>` tag
+                        * or create a new one based on whether the given `cssText` is safe for extension.
+                        *
+                        * @param {string} [cssText=cssBuffer] If called without cssText,
+                        *  the internal buffer will be inserted instead.
+                        * @param {Function} [callback]
+                        */
+                       function addEmbeddedCSS( cssText, callback ) {
+                               var $style, styleEl;
+
+                               if ( callback ) {
+                                       cssCallbacks.add( callback );
+                               }
+
+                               // Yield once before inserting the <style> tag. There are likely
+                               // more calls coming up which we can combine this way.
+                               // Appending a stylesheet and waiting for the browser to repaint
+                               // is fairly expensive, this reduces it (bug 45810)
+                               if ( cssText ) {
+                                       // Be careful not to extend the buffer with css that needs a new stylesheet
+                                       if ( !cssBuffer || canExpandStylesheetWith( cssText ) ) {
+                                               // Linebreak for somewhat distinguishable sections
+                                               // (the rl-cachekey comment separating each)
+                                               cssBuffer += '\n' + cssText;
+                                               // TODO: Use requestAnimationFrame in the future which will
+                                               // perform even better by not injecting styles while the browser
+                                               // is paiting.
+                                               setTimeout( function () {
+                                                       // Can't pass addEmbeddedCSS to setTimeout directly because Firefox
+                                                       // (below version 13) has the non-standard behaviour of passing a
+                                                       // numerical "lateness" value as first argument to this callback
+                                                       // http://benalman.com/news/2009/07/the-mysterious-firefox-settime/
+                                                       addEmbeddedCSS();
+                                               } );
+                                               return;
+                                       }
+
+                               // This is a delayed call and we got a buffer still
+                               } else if ( cssBuffer ) {
+                                       cssText = cssBuffer;
+                                       cssBuffer = '';
+                               } else {
+                                       // This is a delayed call, but buffer is already cleared by
+                                       // another delayed call.
+                                       return;
+                               }
+
+                               // By default, always create a new <style>. Appending text to a <style>
+                               // tag is bad as it means the contents have to be re-parsed (bug 45810).
+                               //
+                               // Except, of course, in IE 9 and below. In there we default to re-using and
+                               // appending to a <style> tag due to the IE stylesheet limit (bug 31676).
+                               if ( 'documentMode' in document && document.documentMode <= 9 ) {
+
+                                       $style = getMarker().prev();
+                                       // Verify that the the element before Marker actually is a
+                                       // <style> tag and one that came from ResourceLoader
+                                       // (not some other style tag or even a `<meta>` or `<script>`).
+                                       if ( $style.data( 'ResourceLoaderDynamicStyleTag' ) === true ) {
+                                               // There's already a dynamic <style> tag present and
+                                               // canExpandStylesheetWith() gave a green light to append more to it.
+                                               styleEl = $style.get( 0 );
+                                               if ( styleEl.styleSheet ) {
+                                                       try {
+                                                               styleEl.styleSheet.cssText += cssText; // IE
+                                                       } catch ( e ) {
+                                                               log( 'addEmbeddedCSS fail', e );
+                                                       }
+                                               } else {
+                                                       styleEl.appendChild( document.createTextNode( String( cssText ) ) );
+                                               }
+                                               cssCallbacks.fire().empty();
+                                               return;
+                                       }
+                               }
+
+                               $( newStyleTag( cssText, getMarker() ) ).data( 'ResourceLoaderDynamicStyleTag', true );
+
+                               cssCallbacks.fire().empty();
+                       }
+
+                       /**
+                        * Generates an ISO8601 "basic" string from a UNIX timestamp
+                        * @private
+                        */
+                       function formatVersionNumber( timestamp ) {
+                               var     d = new Date();
+                               function pad( a, b, c ) {
+                                       return [a < 10 ? '0' + a : a, b < 10 ? '0' + b : b, c < 10 ? '0' + c : c].join( '' );
+                               }
+                               d.setTime( timestamp * 1000 );
+                               return [
+                                       pad( d.getUTCFullYear(), d.getUTCMonth() + 1, d.getUTCDate() ), 'T',
+                                       pad( d.getUTCHours(), d.getUTCMinutes(), d.getUTCSeconds() ), 'Z'
+                               ].join( '' );
+                       }
+
+                       /**
+                        * Resolves dependencies and detects circular references.
+                        *
+                        * @private
+                        * @param {string} module Name of the top-level module whose dependencies shall be
+                        *   resolved and sorted.
+                        * @param {Array} resolved Returns a topological sort of the given module and its
+                        *   dependencies, such that later modules depend on earlier modules. The array
+                        *   contains the module names. If the array contains already some module names,
+                        *   this function appends its result to the pre-existing array.
+                        * @param {Object} [unresolved] Hash used to track the current dependency
+                        *   chain; used to report loops in the dependency graph.
+                        * @throws {Error} If any unregistered module or a dependency loop is encountered
+                        */
+                       function sortDependencies( module, resolved, unresolved ) {
+                               var n, deps, len;
+
+                               if ( registry[module] === undefined ) {
+                                       throw new Error( 'Unknown dependency: ' + module );
+                               }
+                               // Resolves dynamic loader function and replaces it with its own results
+                               if ( $.isFunction( registry[module].dependencies ) ) {
+                                       registry[module].dependencies = registry[module].dependencies();
+                                       // Ensures the module's dependencies are always in an array
+                                       if ( typeof registry[module].dependencies !== 'object' ) {
+                                               registry[module].dependencies = [registry[module].dependencies];
+                                       }
+                               }
+                               if ( $.inArray( module, resolved ) !== -1 ) {
+                                       // Module already resolved; nothing to do.
+                                       return;
+                               }
+                               // unresolved is optional, supply it if not passed in
+                               if ( !unresolved ) {
+                                       unresolved = {};
+                               }
+                               // Tracks down dependencies
+                               deps = registry[module].dependencies;
+                               len = deps.length;
+                               for ( n = 0; n < len; n += 1 ) {
+                                       if ( $.inArray( deps[n], resolved ) === -1 ) {
+                                               if ( unresolved[deps[n]] ) {
+                                                       throw new Error(
+                                                               'Circular reference detected: ' + module +
+                                                               ' -> ' + deps[n]
+                                                       );
+                                               }
+
+                                               // Add to unresolved
+                                               unresolved[module] = true;
+                                               sortDependencies( deps[n], resolved, unresolved );
+                                               delete unresolved[module];
+                                       }
+                               }
+                               resolved[resolved.length] = module;
+                       }
+
+                       /**
+                        * Gets a list of module names that a module depends on in their proper dependency
+                        * order.
+                        *
+                        * @private
+                        * @param {string} module Module name or array of string module names
+                        * @return {Array} list of dependencies, including 'module'.
+                        * @throws {Error} If circular reference is detected
+                        */
+                       function resolve( module ) {
+                               var m, resolved;
+
+                               // Allow calling with an array of module names
+                               if ( $.isArray( module ) ) {
+                                       resolved = [];
+                                       for ( m = 0; m < module.length; m += 1 ) {
+                                               sortDependencies( module[m], resolved );
+                                       }
+                                       return resolved;
+                               }
+
+                               if ( typeof module === 'string' ) {
+                                       resolved = [];
+                                       sortDependencies( module, resolved );
+                                       return resolved;
+                               }
+
+                               throw new Error( 'Invalid module argument: ' + module );
+                       }
+
+                       /**
+                        * Narrows a list of module names down to those matching a specific
+                        * state (see comment on top of this scope for a list of valid states).
+                        * One can also filter for 'unregistered', which will return the
+                        * modules names that don't have a registry entry.
+                        *
+                        * @private
+                        * @param {string|string[]} states Module states to filter by
+                        * @param {Array} [modules] List of module names to filter (optional, by default the entire
+                        * registry is used)
+                        * @return {Array} List of filtered module names
+                        */
+                       function filter( states, modules ) {
+                               var list, module, s, m;
+
+                               // Allow states to be given as a string
+                               if ( typeof states === 'string' ) {
+                                       states = [states];
+                               }
+                               // If called without a list of modules, build and use a list of all modules
+                               list = [];
+                               if ( modules === undefined ) {
+                                       modules = [];
+                                       for ( module in registry ) {
+                                               modules[modules.length] = module;
+                                       }
+                               }
+                               // Build a list of modules which are in one of the specified states
+                               for ( s = 0; s < states.length; s += 1 ) {
+                                       for ( m = 0; m < modules.length; m += 1 ) {
+                                               if ( registry[modules[m]] === undefined ) {
+                                                       // Module does not exist
+                                                       if ( states[s] === 'unregistered' ) {
+                                                               // OK, undefined
+                                                               list[list.length] = modules[m];
+                                                       }
+                                               } else {
+                                                       // Module exists, check state
+                                                       if ( registry[modules[m]].state === states[s] ) {
+                                                               // OK, correct state
+                                                               list[list.length] = modules[m];
+                                                       }
+                                               }
+                                       }
+                               }
+                               return list;
+                       }
+
+                       /**
+                        * Determine whether all dependencies are in state 'ready', which means we may
+                        * execute the module or job now.
+                        *
+                        * @private
+                        * @param {Array} dependencies Dependencies (module names) to be checked.
+                        * @return {boolean} True if all dependencies are in state 'ready', false otherwise
+                        */
+                       function allReady( dependencies ) {
+                               return filter( 'ready', dependencies ).length === dependencies.length;
+                       }
+
+                       /**
+                        * A module has entered state 'ready', 'error', or 'missing'. Automatically update pending jobs
+                        * and modules that depend upon this module. if the given module failed, propagate the 'error'
+                        * state up the dependency tree; otherwise, execute all jobs/modules that now have all their
+                        * dependencies satisfied. On jobs depending on a failed module, run the error callback, if any.
+                        *
+                        * @private
+                        * @param {string} module Name of module that entered one of the states 'ready', 'error', or 'missing'.
+                        */
+                       function handlePending( module ) {
+                               var j, job, hasErrors, m, stateChange;
+
+                               // Modules.
+                               if ( $.inArray( registry[module].state, ['error', 'missing'] ) !== -1 ) {
+                                       // If the current module failed, mark all dependent modules also as failed.
+                                       // Iterate until steady-state to propagate the error state upwards in the
+                                       // dependency tree.
+                                       do {
+                                               stateChange = false;
+                                               for ( m in registry ) {
+                                                       if ( $.inArray( registry[m].state, ['error', 'missing'] ) === -1 ) {
+                                                               if ( filter( ['error', 'missing'], registry[m].dependencies ).length > 0 ) {
+                                                                       registry[m].state = 'error';
+                                                                       stateChange = true;
+                                                               }
+                                                       }
+                                               }
+                                       } while ( stateChange );
+                               }
+
+                               // Execute all jobs whose dependencies are either all satisfied or contain at least one failed module.
+                               for ( j = 0; j < jobs.length; j += 1 ) {
+                                       hasErrors = filter( ['error', 'missing'], jobs[j].dependencies ).length > 0;
+                                       if ( hasErrors || allReady( jobs[j].dependencies ) ) {
+                                               // All dependencies satisfied, or some have errors
+                                               job = jobs[j];
+                                               jobs.splice( j, 1 );
+                                               j -= 1;
+                                               try {
+                                                       if ( hasErrors ) {
+                                                               if ( $.isFunction( job.error ) ) {
+                                                                       job.error( new Error( 'Module ' + module + ' has failed dependencies' ), [module] );
+                                                               }
+                                                       } else {
+                                                               if ( $.isFunction( job.ready ) ) {
+                                                                       job.ready();
+                                                               }
+                                                       }
+                                               } catch ( e ) {
+                                                       // A user-defined callback raised an exception.
+                                                       // Swallow it to protect our state machine!
+                                                       log( 'Exception thrown by job.error', e );
+                                               }
+                                       }
+                               }
+
+                               if ( registry[module].state === 'ready' ) {
+                                       // The current module became 'ready'. Set it in the module store, and recursively execute all
+                                       // dependent modules that are loaded and now have all dependencies satisfied.
+                                       mw.loader.store.set( module, registry[module] );
+                                       for ( m in registry ) {
+                                               if ( registry[m].state === 'loaded' && allReady( registry[m].dependencies ) ) {
+                                                       execute( m );
+                                               }
+                                       }
+                               }
+                       }
+
+                       /**
+                        * Adds a script tag to the DOM, either using document.write or low-level DOM manipulation,
+                        * depending on whether document-ready has occurred yet and whether we are in async mode.
+                        *
+                        * @private
+                        * @param {string} src URL to script, will be used as the src attribute in the script tag
+                        * @param {Function} [callback] Callback which will be run when the script is done
+                        * @param {boolean} [async=false] Whether to load modules asynchronously.
+                        *  Ignored (and defaulted to `true`) if the document-ready event has already occurred.
+                        */
+                       function addScript( src, callback, async ) {
+                               /*jshint evil:true */
+                               var script, head, done;
+
+                               // Using isReady directly instead of storing it locally from
+                               // a $.fn.ready callback (bug 31895).
+                               if ( $.isReady || async ) {
+                                       // Can't use jQuery.getScript because that only uses <script> for cross-domain,
+                                       // it uses XHR and eval for same-domain scripts, which we don't want because it
+                                       // messes up line numbers.
+                                       // The below is based on jQuery ([jquery@1.9.1]/src/ajax/script.js)
+
+                                       // IE-safe way of getting an append target. In old IE document.head isn't supported
+                                       // and its getElementsByTagName can't find <head> until </head> is parsed.
+                                       done = false;
+                                       head = document.head || document.getElementsByTagName( 'head' )[0] || document.documentElement;
+
+                                       script = document.createElement( 'script' );
+                                       script.async = true;
+                                       script.src = src;
+                                       if ( $.isFunction( callback ) ) {
+                                               script.onload = script.onreadystatechange = function () {
+                                                       if (
+                                                               !done
+                                                               && (
+                                                                       !script.readyState
+                                                                       || /loaded|complete/.test( script.readyState )
+                                                               )
+                                                       ) {
+                                                               done = true;
+
+                                                               // Handle memory leak in IE
+                                                               script.onload = script.onreadystatechange = null;
+
+                                                               // Detach the element from the document
+                                                               if ( script.parentNode ) {
+                                                                       script.parentNode.removeChild( script );
+                                                               }
+
+                                                               // Dereference the element from javascript
+                                                               script = undefined;
+
+                                                               callback();
+                                                       }
+                                               };
+                                       }
+
+                                       if ( window.opera ) {
+                                               // Appending to the <head> blocks rendering completely in Opera,
+                                               // so append to the <body> after document ready. This means the
+                                               // scripts only start loading after the document has been rendered,
+                                               // but so be it. Opera users don't deserve faster web pages if their
+                                               // browser makes it impossible.
+                                               $( function () {
+                                                       document.body.appendChild( script );
+                                               } );
+                                       } else {
+                                               // Circumvent IE6 bugs with base elements (jqbug.com/2709, jqbug.com/4378)
+                                               // by prepending instead of appending.
+                                               head.insertBefore( script, head.firstChild );
+                                       }
+                               } else {
+                                       document.write( mw.html.element( 'script', { 'src': src }, '' ) );
+                                       if ( $.isFunction( callback ) ) {
+                                               // Document.write is synchronous, so this is called when it's done
+                                               // FIXME: that's a lie. doc.write isn't actually synchronous
+                                               callback();
+                                       }
+                               }
+                       }
+
+                       /**
+                        * Executes a loaded module, making it ready to use
+                        *
+                        * @private
+                        * @param {string} module Module name to execute
+                        */
+                       function execute( module ) {
+                               var key, value, media, i, urls, cssHandle, checkCssHandles,
+                                       cssHandlesRegistered = false;
+
+                               if ( registry[module] === undefined ) {
+                                       throw new Error( 'Module has not been registered yet: ' + module );
+                               } else if ( registry[module].state === 'registered' ) {
+                                       throw new Error( 'Module has not been requested from the server yet: ' + module );
+                               } else if ( registry[module].state === 'loading' ) {
+                                       throw new Error( 'Module has not completed loading yet: ' + module );
+                               } else if ( registry[module].state === 'ready' ) {
+                                       throw new Error( 'Module has already been executed: ' + module );
+                               }
+
+                               /**
+                                * Define loop-function here for efficiency
+                                * and to avoid re-using badly scoped variables.
+                                * @ignore
+                                */
+                               function addLink( media, url ) {
+                                       var el = document.createElement( 'link' );
+                                       // For IE: Insert in document *before* setting href
+                                       getMarker().before( el );
+                                       el.rel = 'stylesheet';
+                                       if ( media && media !== 'all' ) {
+                                               el.media = media;
+                                       }
+                                       // If you end up here from an IE exception "SCRIPT: Invalid property value.",
+                                       // see #addEmbeddedCSS, bug 31676, and bug 47277 for details.
+                                       el.href = url;
+                               }
+
+                               function runScript() {
+                                       var script, markModuleReady, nestedAddScript;
+                                       try {
+                                               script = registry[module].script;
+                                               markModuleReady = function () {
+                                                       registry[module].state = 'ready';
+                                                       handlePending( module );
+                                               };
+                                               nestedAddScript = function ( arr, callback, async, i ) {
+                                                       // Recursively call addScript() in its own callback
+                                                       // for each element of arr.
+                                                       if ( i >= arr.length ) {
+                                                               // We're at the end of the array
+                                                               callback();
+                                                               return;
+                                                       }
+
+                                                       addScript( arr[i], function () {
+                                                               nestedAddScript( arr, callback, async, i + 1 );
+                                                       }, async );
+                                               };
+
+                                               if ( $.isArray( script ) ) {
+                                                       nestedAddScript( script, markModuleReady, registry[module].async, 0 );
+                                               } else if ( $.isFunction( script ) ) {
+                                                       registry[module].state = 'ready';
+                                                       // Pass jQuery twice so that the signature of the closure which wraps
+                                                       // the script can bind both '$' and 'jQuery'.
+                                                       script( $, $ );
+                                                       handlePending( module );
+                                               }
+                                       } catch ( e ) {
+                                               // This needs to NOT use mw.log because these errors are common in production mode
+                                               // and not in debug mode, such as when a symbol that should be global isn't exported
+                                               log( 'Exception thrown by ' + module, e );
+                                               registry[module].state = 'error';
+                                               handlePending( module );
+                                       }
+                               }
+
+                               // This used to be inside runScript, but since that is now fired asychronously
+                               // (after CSS is loaded) we need to set it here right away. It is crucial that
+                               // when execute() is called this is set synchronously, otherwise modules will get
+                               // executed multiple times as the registry will state that it isn't loading yet.
+                               registry[module].state = 'loading';
+
+                               // Add localizations to message system
+                               if ( $.isPlainObject( registry[module].messages ) ) {
+                                       mw.messages.set( registry[module].messages );
+                               }
+
+                               if ( $.isReady || registry[module].async ) {
+                                       // Make sure we don't run the scripts until all (potentially asynchronous)
+                                       // stylesheet insertions have completed.
+                                       ( function () {
+                                               var pending = 0;
+                                               checkCssHandles = function () {
+                                                       // cssHandlesRegistered ensures we don't take off too soon, e.g. when
+                                                       // one of the cssHandles is fired while we're still creating more handles.
+                                                       if ( cssHandlesRegistered && pending === 0 && runScript ) {
+                                                               runScript();
+                                                               runScript = undefined; // Revoke
+                                                       }
+                                               };
+                                               cssHandle = function () {
+                                                       var check = checkCssHandles;
+                                                       pending++;
+                                                       return function () {
+                                                               if (check) {
+                                                                       pending--;
+                                                                       check();
+                                                                       check = undefined; // Revoke
+                                                               }
+                                                       };
+                                               };
+                                       }() );
+                               } else {
+                                       // We are in blocking mode, and so we can't afford to wait for CSS
+                                       cssHandle = function () {};
+                                       // Run immediately
+                                       checkCssHandles = runScript;
+                               }
+
+                               // Process styles (see also mw.loader.implement)
+                               // * back-compat: { <media>: css }
+                               // * back-compat: { <media>: [url, ..] }
+                               // * { "css": [css, ..] }
+                               // * { "url": { <media>: [url, ..] } }
+                               if ( $.isPlainObject( registry[module].style ) ) {
+                                       for ( key in registry[module].style ) {
+                                               value = registry[module].style[key];
+                                               media = undefined;
+
+                                               if ( key !== 'url' && key !== 'css' ) {
+                                                       // Backwards compatibility, key is a media-type
+                                                       if ( typeof value === 'string' ) {
+                                                               // back-compat: { <media>: css }
+                                                               // Ignore 'media' because it isn't supported (nor was it used).
+                                                               // Strings are pre-wrapped in "@media". The media-type was just ""
+                                                               // (because it had to be set to something).
+                                                               // This is one of the reasons why this format is no longer used.
+                                                               addEmbeddedCSS( value, cssHandle() );
+                                                       } else {
+                                                               // back-compat: { <media>: [url, ..] }
+                                                               media = key;
+                                                               key = 'bc-url';
+                                                       }
+                                               }
+
+                                               // Array of css strings in key 'css',
+                                               // or back-compat array of urls from media-type
+                                               if ( $.isArray( value ) ) {
+                                                       for ( i = 0; i < value.length; i += 1 ) {
+                                                               if ( key === 'bc-url' ) {
+                                                                       // back-compat: { <media>: [url, ..] }
+                                                                       addLink( media, value[i] );
+                                                               } else if ( key === 'css' ) {
+                                                                       // { "css": [css, ..] }
+                                                                       addEmbeddedCSS( value[i], cssHandle() );
+                                                               }
+                                                       }
+                                               // Not an array, but a regular object
+                                               // Array of urls inside media-type key
+                                               } else if ( typeof value === 'object' ) {
+                                                       // { "url": { <media>: [url, ..] } }
+                                                       for ( media in value ) {
+                                                               urls = value[media];
+                                                               for ( i = 0; i < urls.length; i += 1 ) {
+                                                                       addLink( media, urls[i] );
+                                                               }
+                                                       }
+                                               }
+                                       }
+                               }
+
+                               // Kick off.
+                               cssHandlesRegistered = true;
+                               checkCssHandles();
+                       }
+
+                       /**
+                        * Adds a dependencies to the queue with optional callbacks to be run
+                        * when the dependencies are ready or fail
+                        *
+                        * @private
+                        * @param {string|string[]} dependencies Module name or array of string module names
+                        * @param {Function} [ready] Callback to execute when all dependencies are ready
+                        * @param {Function} [error] Callback to execute when any dependency fails
+                        * @param {boolean} [async=false] Whether to load modules asynchronously.
+                        *  Ignored (and defaulted to `true`) if the document-ready event has already occurred.
+                        */
+                       function request( dependencies, ready, error, async ) {
+                               var n;
+
+                               // Allow calling by single module name
+                               if ( typeof dependencies === 'string' ) {
+                                       dependencies = [dependencies];
+                               }
+
+                               // Add ready and error callbacks if they were given
+                               if ( ready !== undefined || error !== undefined ) {
+                                       jobs[jobs.length] = {
+                                               'dependencies': filter(
+                                                       ['registered', 'loading', 'loaded'],
+                                                       dependencies
+                                               ),
+                                               'ready': ready,
+                                               'error': error
+                                       };
+                               }
+
+                               // Queue up any dependencies that are registered
+                               dependencies = filter( ['registered'], dependencies );
+                               for ( n = 0; n < dependencies.length; n += 1 ) {
+                                       if ( $.inArray( dependencies[n], queue ) === -1 ) {
+                                               queue[queue.length] = dependencies[n];
+                                               if ( async ) {
+                                                       // Mark this module as async in the registry
+                                                       registry[dependencies[n]].async = true;
+                                               }
+                                       }
+                               }
+
+                               // Work the queue
+                               mw.loader.work();
+                       }
+
+                       function sortQuery( o ) {
+                               var sorted = {}, key, a = [];
+                               for ( key in o ) {
+                                       if ( hasOwn.call( o, key ) ) {
+                                               a.push( key );
+                                       }
+                               }
+                               a.sort();
+                               for ( key = 0; key < a.length; key += 1 ) {
+                                       sorted[a[key]] = o[a[key]];
+                               }
+                               return sorted;
+                       }
+
+                       /**
+                        * Converts a module map of the form { foo: [ 'bar', 'baz' ], bar: [ 'baz, 'quux' ] }
+                        * to a query string of the form foo.bar,baz|bar.baz,quux
+                        * @private
+                        */
+                       function buildModulesString( moduleMap ) {
+                               var arr = [], p, prefix;
+                               for ( prefix in moduleMap ) {
+                                       p = prefix === '' ? '' : prefix + '.';
+                                       arr.push( p + moduleMap[prefix].join( ',' ) );
+                               }
+                               return arr.join( '|' );
+                       }
+
+                       /**
+                        * Asynchronously append a script tag to the end of the body
+                        * that invokes load.php
+                        * @private
+                        * @param {Object} moduleMap Module map, see #buildModulesString
+                        * @param {Object} currReqBase Object with other parameters (other than 'modules') to use in the request
+                        * @param {string} sourceLoadScript URL of load.php
+                        * @param {boolean} async Whether to load modules asynchronously.
+                        *  Ignored (and defaulted to `true`) if the document-ready event has already occurred.
+                        */
+                       function doRequest( moduleMap, currReqBase, sourceLoadScript, async ) {
+                               var request = $.extend(
+                                       { modules: buildModulesString( moduleMap ) },
+                                       currReqBase
+                               );
+                               request = sortQuery( request );
+                               // Append &* to avoid triggering the IE6 extension check
+                               addScript( sourceLoadScript + '?' + $.param( request ) + '&*', null, async );
+                       }
+
+                       /* Public Members */
+                       return {
+                               /**
+                                * The module registry is exposed as an aid for debugging and inspecting page
+                                * state; it is not a public interface for modifying the registry.
+                                *
+                                * @see #registry
+                                * @property
+                                * @private
+                                */
+                               moduleRegistry: registry,
+
+                               /**
+                                * @inheritdoc #newStyleTag
+                                * @method
+                                */
+                               addStyleTag: newStyleTag,
+
+                               /**
+                                * Batch-request queued dependencies from the server.
+                                */
+                               work: function () {
+                                       var     reqBase, splits, maxQueryLength, q, b, bSource, bGroup, bSourceGroup,
+                                               source, concatSource, origBatch, group, g, i, modules, maxVersion, sourceLoadScript,
+                                               currReqBase, currReqBaseLength, moduleMap, l,
+                                               lastDotIndex, prefix, suffix, bytesAdded, async;
+
+                                       // Build a list of request parameters common to all requests.
+                                       reqBase = {
+                                               skin: mw.config.get( 'skin' ),
+                                               lang: mw.config.get( 'wgUserLanguage' ),
+                                               debug: mw.config.get( 'debug' )
+                                       };
+                                       // Split module batch by source and by group.
+                                       splits = {};
+                                       maxQueryLength = mw.config.get( 'wgResourceLoaderMaxQueryLength', -1 );
+
+                                       // Appends a list of modules from the queue to the batch
+                                       for ( q = 0; q < queue.length; q += 1 ) {
+                                               // Only request modules which are registered
+                                               if ( registry[queue[q]] !== undefined && registry[queue[q]].state === 'registered' ) {
+                                                       // Prevent duplicate entries
+                                                       if ( $.inArray( queue[q], batch ) === -1 ) {
+                                                               batch[batch.length] = queue[q];
+                                                               // Mark registered modules as loading
+                                                               registry[queue[q]].state = 'loading';
+                                                       }
+                                               }
+                                       }
+
+                                       mw.loader.store.init();
+                                       if ( mw.loader.store.enabled ) {
+                                               concatSource = [];
+                                               origBatch = batch;
+                                               batch = $.grep( batch, function ( module ) {
+                                                       var source = mw.loader.store.get( module );
+                                                       if ( source ) {
+                                                               concatSource.push( source );
+                                                               return false;
+                                                       }
+                                                       return true;
+                                               } );
+                                               try {
+                                                       $.globalEval( concatSource.join( ';' ) );
+                                               } catch ( err ) {
+                                                       // Not good, the cached mw.loader.implement calls failed! This should
+                                                       // never happen, barring ResourceLoader bugs, browser bugs and PEBKACs.
+                                                       // Depending on how corrupt the string is, it is likely that some
+                                                       // modules' implement() succeeded while the ones after the error will
+                                                       // never run and leave their modules in the 'loading' state forever.
+
+                                                       // Since this is an error not caused by an individual module but by
+                                                       // something that infected the implement call itself, don't take any
+                                                       // risks and clear everything in this cache.
+                                                       mw.loader.store.clear();
+                                                       // Re-add the ones still pending back to the batch and let the server
+                                                       // repopulate these modules to the cache.
+                                                       // This means that at most one module will be useless (the one that had
+                                                       // the error) instead of all of them.
+                                                       log( 'Error while evaluating data from mw.loader.store', err );
+                                                       origBatch = $.grep( origBatch, function ( module ) {
+                                                               return registry[module].state === 'loading';
+                                                       } );
+                                                       batch = batch.concat( origBatch );
+                                               }
+                                       }
+
+                                       // Early exit if there's nothing to load...
+                                       if ( !batch.length ) {
+                                               return;
+                                       }
+
+                                       // The queue has been processed into the batch, clear up the queue.
+                                       queue = [];
+
+                                       // Always order modules alphabetically to help reduce cache
+                                       // misses for otherwise identical content.
+                                       batch.sort();
+
+                                       // Split batch by source and by group.
+                                       for ( b = 0; b < batch.length; b += 1 ) {
+                                               bSource = registry[batch[b]].source;
+                                               bGroup = registry[batch[b]].group;
+                                               if ( splits[bSource] === undefined ) {
+                                                       splits[bSource] = {};
+                                               }
+                                               if ( splits[bSource][bGroup] === undefined ) {
+                                                       splits[bSource][bGroup] = [];
+                                               }
+                                               bSourceGroup = splits[bSource][bGroup];
+                                               bSourceGroup[bSourceGroup.length] = batch[b];
+                                       }
+
+                                       // Clear the batch - this MUST happen before we append any
+                                       // script elements to the body or it's possible that a script
+                                       // will be locally cached, instantly load, and work the batch
+                                       // again, all before we've cleared it causing each request to
+                                       // include modules which are already loaded.
+                                       batch = [];
+
+                                       for ( source in splits ) {
+
+                                               sourceLoadScript = sources[source].loadScript;
+
+                                               for ( group in splits[source] ) {
+
+                                                       // Cache access to currently selected list of
+                                                       // modules for this group from this source.
+                                                       modules = splits[source][group];
+
+                                                       // Calculate the highest timestamp
+                                                       maxVersion = 0;
+                                                       for ( g = 0; g < modules.length; g += 1 ) {
+                                                               if ( registry[modules[g]].version > maxVersion ) {
+                                                                       maxVersion = registry[modules[g]].version;
+                                                               }
+                                                       }
+
+                                                       currReqBase = $.extend( { version: formatVersionNumber( maxVersion ) }, reqBase );
+                                                       // For user modules append a user name to the request.
+                                                       if ( group === 'user' && mw.config.get( 'wgUserName' ) !== null ) {
+                                                               currReqBase.user = mw.config.get( 'wgUserName' );
+                                                       }
+                                                       currReqBaseLength = $.param( currReqBase ).length;
+                                                       async = true;
+                                                       // We may need to split up the request to honor the query string length limit,
+                                                       // so build it piece by piece.
+                                                       l = currReqBaseLength + 9; // '&modules='.length == 9
+
+                                                       moduleMap = {}; // { prefix: [ suffixes ] }
+
+                                                       for ( i = 0; i < modules.length; i += 1 ) {
+                                                               // Determine how many bytes this module would add to the query string
+                                                               lastDotIndex = modules[i].lastIndexOf( '.' );
+                                                               // Note that these substr() calls work even if lastDotIndex == -1
+                                                               prefix = modules[i].substr( 0, lastDotIndex );
+                                                               suffix = modules[i].substr( lastDotIndex + 1 );
+                                                               bytesAdded = moduleMap[prefix] !== undefined
+                                                                       ? suffix.length + 3 // '%2C'.length == 3
+                                                                       : modules[i].length + 3; // '%7C'.length == 3
+
+                                                               // If the request would become too long, create a new one,
+                                                               // but don't create empty requests
+                                                               if ( maxQueryLength > 0 && !$.isEmptyObject( moduleMap ) && l + bytesAdded > maxQueryLength ) {
+                                                                       // This request would become too long, create a new one
+                                                                       // and fire off the old one
+                                                                       doRequest( moduleMap, currReqBase, sourceLoadScript, async );
+                                                                       moduleMap = {};
+                                                                       async = true;
+                                                                       l = currReqBaseLength + 9;
+                                                               }
+                                                               if ( moduleMap[prefix] === undefined ) {
+                                                                       moduleMap[prefix] = [];
+                                                               }
+                                                               moduleMap[prefix].push( suffix );
+                                                               if ( !registry[modules[i]].async ) {
+                                                                       // If this module is blocking, make the entire request blocking
+                                                                       // This is slightly suboptimal, but in practice mixing of blocking
+                                                                       // and async modules will only occur in debug mode.
+                                                                       async = false;
+                                                               }
+                                                               l += bytesAdded;
+                                                       }
+                                                       // If there's anything left in moduleMap, request that too
+                                                       if ( !$.isEmptyObject( moduleMap ) ) {
+                                                               doRequest( moduleMap, currReqBase, sourceLoadScript, async );
+                                                       }
+                                               }
+                                       }
+                               },
+
+                               /**
+                                * Register a source.
+                                *
+                                * The #work method will use this information to split up requests by source.
+                                *
+                                *     mw.loader.addSource( 'mediawikiwiki', { loadScript: '//www.mediawiki.org/w/load.php' } );
+                                *
+                                * @param {string} id Short string representing a source wiki, used internally for
+                                *  registered modules to indicate where they should be loaded from (usually lowercase a-z).
+                                * @param {Object} props
+                                * @param {string} props.loadScript Url to the load.php entry point of the source wiki.
+                                * @return {boolean}
+                                */
+                               addSource: function ( id, props ) {
+                                       var source;
+                                       // Allow multiple additions
+                                       if ( typeof id === 'object' ) {
+                                               for ( source in id ) {
+                                                       mw.loader.addSource( source, id[source] );
+                                               }
+                                               return true;
+                                       }
+
+                                       if ( sources[id] !== undefined ) {
+                                               throw new Error( 'source already registered: ' + id );
+                                       }
+
+                                       sources[id] = props;
+
+                                       return true;
+                               },
+
+                               /**
+                                * Register a module, letting the system know about it and its
+                                * properties. Startup modules contain calls to this function.
+                                *
+                                * @param {string} module Module name
+                                * @param {number} version Module version number as a timestamp (falls backs to 0)
+                                * @param {string|Array|Function} dependencies One string or array of strings of module
+                                *  names on which this module depends, or a function that returns that array.
+                                * @param {string} [group=null] Group which the module is in
+                                * @param {string} [source='local'] Name of the source
+                                */
+                               register: function ( module, version, dependencies, group, source ) {
+                                       var m;
+                                       // Allow multiple registration
+                                       if ( typeof module === 'object' ) {
+                                               for ( m = 0; m < module.length; m += 1 ) {
+                                                       // module is an array of module names
+                                                       if ( typeof module[m] === 'string' ) {
+                                                               mw.loader.register( module[m] );
+                                                       // module is an array of arrays
+                                                       } else if ( typeof module[m] === 'object' ) {
+                                                               mw.loader.register.apply( mw.loader, module[m] );
+                                                       }
+                                               }
+                                               return;
+                                       }
+                                       // Validate input
+                                       if ( typeof module !== 'string' ) {
+                                               throw new Error( 'module must be a string, not a ' + typeof module );
+                                       }
+                                       if ( registry[module] !== undefined ) {
+                                               throw new Error( 'module already registered: ' + module );
+                                       }
+                                       // List the module as registered
+                                       registry[module] = {
+                                               version: version !== undefined ? parseInt( version, 10 ) : 0,
+                                               dependencies: [],
+                                               group: typeof group === 'string' ? group : null,
+                                               source: typeof source === 'string' ? source: 'local',
+                                               state: 'registered'
+                                       };
+                                       if ( typeof dependencies === 'string' ) {
+                                               // Allow dependencies to be given as a single module name
+                                               registry[module].dependencies = [ dependencies ];
+                                       } else if ( typeof dependencies === 'object' || $.isFunction( dependencies ) ) {
+                                               // Allow dependencies to be given as an array of module names
+                                               // or a function which returns an array
+                                               registry[module].dependencies = dependencies;
+                                       }
+                               },
+
+                               /**
+                                * Implement a module given the components that make up the module.
+                                *
+                                * When #load or #using requests one or more modules, the server
+                                * response contain calls to this function.
+                                *
+                                * All arguments are required.
+                                *
+                                * @param {string} module Name of module
+                                * @param {Function|Array} script Function with module code or Array of URLs to
+                                *  be used as the src attribute of a new `<script>` tag.
+                                * @param {Object} style Should follow one of the following patterns:
+                                *
+                                *     { "css": [css, ..] }
+                                *     { "url": { <media>: [url, ..] } }
+                                *
+                                * And for backwards compatibility (needs to be supported forever due to caching):
+                                *
+                                *     { <media>: css }
+                                *     { <media>: [url, ..] }
+                                *
+                                * The reason css strings are not concatenated anymore is bug 31676. We now check
+                                * whether it's safe to extend the stylesheet (see #canExpandStylesheetWith).
+                                *
+                                * @param {Object} msgs List of key/value pairs to be added to mw#messages.
+                                */
+                               implement: function ( module, script, style, msgs ) {
+                                       // Validate input
+                                       if ( typeof module !== 'string' ) {
+                                               throw new Error( 'module must be a string, not a ' + typeof module );
+                                       }
+                                       if ( !$.isFunction( script ) && !$.isArray( script ) ) {
+                                               throw new Error( 'script must be a function or an array, not a ' + typeof script );
+                                       }
+                                       if ( !$.isPlainObject( style ) ) {
+                                               throw new Error( 'style must be an object, not a ' + typeof style );
+                                       }
+                                       if ( !$.isPlainObject( msgs ) ) {
+                                               throw new Error( 'msgs must be an object, not a ' + typeof msgs );
+                                       }
+                                       // Automatically register module
+                                       if ( registry[module] === undefined ) {
+                                               mw.loader.register( module );
+                                       }
+                                       // Check for duplicate implementation
+                                       if ( registry[module] !== undefined && registry[module].script !== undefined ) {
+                                               throw new Error( 'module already implemented: ' + module );
+                                       }
+                                       // Attach components
+                                       registry[module].script = script;
+                                       registry[module].style = style;
+                                       registry[module].messages = msgs;
+                                       // The module may already have been marked as erroneous
+                                       if ( $.inArray( registry[module].state, ['error', 'missing'] ) === -1 ) {
+                                               registry[module].state = 'loaded';
+                                               if ( allReady( registry[module].dependencies ) ) {
+                                                       execute( module );
+                                               }
+                                       }
+                               },
+
+                               /**
+                                * Execute a function as soon as one or more required modules are ready.
+                                *
+                                * Example of inline dependency on OOjs:
+                                *
+                                *     mw.loader.using( 'oojs', function () {
+                                *         OO.compare( [ 1 ], [ 1 ] );
+                                *     } );
+                                *
+                                * @param {string|Array} dependencies Module name or array of modules names the callback
+                                *  dependends on to be ready before executing
+                                * @param {Function} [ready] Callback to execute when all dependencies are ready
+                                * @param {Function} [error] Callback to execute if one or more dependencies failed
+                                * @return {jQuery.Promise}
+                                */
+                               using: function ( dependencies, ready, error ) {
+                                       var deferred = $.Deferred();
+
+                                       // Allow calling with a single dependency as a string
+                                       if ( typeof dependencies === 'string' ) {
+                                               dependencies = [ dependencies ];
+                                       } else if ( !$.isArray( dependencies ) ) {
+                                               // Invalid input
+                                               throw new Error( 'Dependencies must be a string or an array' );
+                                       }
+
+                                       if ( ready ) {
+                                               deferred.done( ready );
+                                       }
+                                       if ( error ) {
+                                               deferred.fail( error );
+                                       }
+
+                                       // Resolve entire dependency map
+                                       dependencies = resolve( dependencies );
+                                       if ( allReady( dependencies ) ) {
+                                               // Run ready immediately
+                                               deferred.resolve();
+                                       } else if ( filter( ['error', 'missing'], dependencies ).length ) {
+                                               // Execute error immediately if any dependencies have errors
+                                               deferred.reject(
+                                                       new Error( 'One or more dependencies failed to load' ),
+                                                       dependencies
+                                               );
+                                       } else {
+                                               // Not all dependencies are ready: queue up a request
+                                               request( dependencies, deferred.resolve, deferred.reject );
+                                       }
+
+                                       return deferred.promise();
+                               },
+
+                               /**
+                                * Load an external script or one or more modules.
+                                *
+                                * @param {string|Array} modules Either the name of a module, array of modules,
+                                *  or a URL of an external script or style
+                                * @param {string} [type='text/javascript'] mime-type to use if calling with a URL of an
+                                *  external script or style; acceptable values are "text/css" and
+                                *  "text/javascript"; if no type is provided, text/javascript is assumed.
+                                * @param {boolean} [async] Whether to load modules asynchronously.
+                                *  Ignored (and defaulted to `true`) if the document-ready event has already occurred.
+                                *  Defaults to `true` if loading a URL, `false` otherwise.
+                                */
+                               load: function ( modules, type, async ) {
+                                       var filtered, m, module, l;
+
+                                       // Validate input
+                                       if ( typeof modules !== 'object' && typeof modules !== 'string' ) {
+                                               throw new Error( 'modules must be a string or an array, not a ' + typeof modules );
+                                       }
+                                       // Allow calling with an external url or single dependency as a string
+                                       if ( typeof modules === 'string' ) {
+                                               // Support adding arbitrary external scripts
+                                               if ( /^(https?:)?\/\//.test( modules ) ) {
+                                                       if ( async === undefined ) {
+                                                               // Assume async for bug 34542
+                                                               async = true;
+                                                       }
+                                                       if ( type === 'text/css' ) {
+                                                               // IE7-8 throws security warnings when inserting a <link> tag
+                                                               // with a protocol-relative URL set though attributes (instead of
+                                                               // properties) - when on HTTPS. See also bug 41331.
+                                                               l = document.createElement( 'link' );
+                                                               l.rel = 'stylesheet';
+                                                               l.href = modules;
+                                                               $( 'head' ).append( l );
+                                                               return;
+                                                       }
+                                                       if ( type === 'text/javascript' || type === undefined ) {
+                                                               addScript( modules, null, async );
+                                                               return;
+                                                       }
+                                                       // Unknown type
+                                                       throw new Error( 'invalid type for external url, must be text/css or text/javascript. not ' + type );
+                                               }
+                                               // Called with single module
+                                               modules = [ modules ];
+                                       }
+
+                                       // Filter out undefined modules, otherwise resolve() will throw
+                                       // an exception for trying to load an undefined module.
+                                       // Undefined modules are acceptable here in load(), because load() takes
+                                       // an array of unrelated modules, whereas the modules passed to
+                                       // using() are related and must all be loaded.
+                                       for ( filtered = [], m = 0; m < modules.length; m += 1 ) {
+                                               module = registry[modules[m]];
+                                               if ( module !== undefined ) {
+                                                       if ( $.inArray( module.state, ['error', 'missing'] ) === -1 ) {
+                                                               filtered[filtered.length] = modules[m];
+                                                       }
+                                               }
+                                       }
+
+                                       if ( filtered.length === 0 ) {
+                                               return;
+                                       }
+                                       // Resolve entire dependency map
+                                       filtered = resolve( filtered );
+                                       // If all modules are ready, nothing to be done
+                                       if ( allReady( filtered ) ) {
+                                               return;
+                                       }
+                                       // If any modules have errors: also quit.
+                                       if ( filter( ['error', 'missing'], filtered ).length ) {
+                                               return;
+                                       }
+                                       // Since some modules are not yet ready, queue up a request.
+                                       request( filtered, undefined, undefined, async );
+                               },
+
+                               /**
+                                * Change the state of one or more modules.
+                                *
+                                * @param {string|Object} module Module name or object of module name/state pairs
+                                * @param {string} state State name
+                                */
+                               state: function ( module, state ) {
+                                       var m;
+
+                                       if ( typeof module === 'object' ) {
+                                               for ( m in module ) {
+                                                       mw.loader.state( m, module[m] );
+                                               }
+                                               return;
+                                       }
+                                       if ( registry[module] === undefined ) {
+                                               mw.loader.register( module );
+                                       }
+                                       if ( $.inArray( state, ['ready', 'error', 'missing'] ) !== -1
+                                               && registry[module].state !== state ) {
+                                               // Make sure pending modules depending on this one get executed if their
+                                               // dependencies are now fulfilled!
+                                               registry[module].state = state;
+                                               handlePending( module );
+                                       } else {
+                                               registry[module].state = state;
+                                       }
+                               },
+
+                               /**
+                                * Get the version of a module.
+                                *
+                                * @param {string} module Name of module to get version for
+                                * @return {string|null} The version, or null if the module (or its version) is not
+                                *  in the registry.
+                                */
+                               getVersion: function ( module ) {
+                                       if ( registry[module] !== undefined && registry[module].version !== undefined ) {
+                                               return formatVersionNumber( registry[module].version );
+                                       }
+                                       return null;
+                               },
+
+                               /**
+                                * Get the state of a module.
+                                *
+                                * @param {string} module Name of module to get state for
+                                */
+                               getState: function ( module ) {
+                                       if ( registry[module] !== undefined && registry[module].state !== undefined ) {
+                                               return registry[module].state;
+                                       }
+                                       return null;
+                               },
+
+                               /**
+                                * Get the names of all registered modules.
+                                *
+                                * @return {Array}
+                                */
+                               getModuleNames: function () {
+                                       return $.map( registry, function ( i, key ) {
+                                               return key;
+                                       } );
+                               },
+
+                               /**
+                                * @inheritdoc mw.inspect#runReports
+                                * @method
+                                */
+                               inspect: function () {
+                                       var args = slice.call( arguments );
+                                       mw.loader.using( 'mediawiki.inspect', function () {
+                                               mw.inspect.runReports.apply( mw.inspect, args );
+                                       } );
+                               },
+
+                               /**
+                                * On browsers that implement the localStorage API, the module store serves as a
+                                * smart complement to the browser cache. Unlike the browser cache, the module store
+                                * can slice a concatenated response from ResourceLoader into its constituent
+                                * modules and cache each of them separately, using each module's versioning scheme
+                                * to determine when the cache should be invalidated.
+                                *
+                                * @singleton
+                                * @class mw.loader.store
+                                */
+                               store: {
+                                       // Whether the store is in use on this page.
+                                       enabled: null,
+
+                                       // The contents of the store, mapping '[module name]@[version]' keys
+                                       // to module implementations.
+                                       items: {},
+
+                                       // Cache hit stats
+                                       stats: { hits: 0, misses: 0, expired: 0 },
+
+                                       /**
+                                        * Construct a JSON-serializable object representing the content of the store.
+                                        * @return {Object} Module store contents.
+                                        */
+                                       toJSON: function () {
+                                               return { items: mw.loader.store.items, vary: mw.loader.store.getVary() };
+                                       },
+
+                                       /**
+                                        * Get the localStorage key for the entire module store. The key references
+                                        * $wgDBname to prevent clashes between wikis which share a common host.
+                                        *
+                                        * @return {string} localStorage item key
+                                        */
+                                       getStoreKey: function () {
+                                               return 'MediaWikiModuleStore:' + mw.config.get( 'wgDBname' );
+                                       },
+
+                                       /**
+                                        * Get a string key on which to vary the module cache.
+                                        * @return {string} String of concatenated vary conditions.
+                                        */
+                                       getVary: function () {
+                                               return [
+                                                       mw.config.get( 'skin' ),
+                                                       mw.config.get( 'wgResourceLoaderStorageVersion' ),
+                                                       mw.config.get( 'wgUserLanguage' )
+                                               ].join( ':' );
+                                       },
+
+                                       /**
+                                        * Get a string key for a specific module. The key format is '[name]@[version]'.
+                                        *
+                                        * @param {string} module Module name
+                                        * @return {string|null} Module key or null if module does not exist
+                                        */
+                                       getModuleKey: function ( module ) {
+                                               return typeof registry[module] === 'object' ?
+                                                       ( module + '@' + registry[module].version ) : null;
+                                       },
+
+                                       /**
+                                        * Initialize the store.
+                                        *
+                                        * Retrieves store from localStorage and (if successfully retrieved) decoding
+                                        * the stored JSON value to a plain object.
+                                        *
+                                        * The try / catch block is used for JSON & localStorage feature detection.
+                                        * See the in-line documentation for Modernizr's localStorage feature detection
+                                        * code for a full account of why we need a try / catch:
+                                        * <https://github.com/Modernizr/Modernizr/blob/v2.7.1/modernizr.js#L771-L796>.
+                                        */
+                                       init: function () {
+                                               var raw, data;
+
+                                               if ( mw.loader.store.enabled !== null ) {
+                                                       // Init already ran
+                                                       return;
+                                               }
+
+                                               if ( !mw.config.get( 'wgResourceLoaderStorageEnabled' ) || mw.config.get( 'debug' ) ) {
+                                                       // Disabled by configuration, or because debug mode is set
+                                                       mw.loader.store.enabled = false;
+                                                       return;
+                                               }
+
+                                               try {
+                                                       raw = localStorage.getItem( mw.loader.store.getStoreKey() );
+                                                       // If we get here, localStorage is available; mark enabled
+                                                       mw.loader.store.enabled = true;
+                                                       data = JSON.parse( raw );
+                                                       if ( data && typeof data.items === 'object' && data.vary === mw.loader.store.getVary() ) {
+                                                               mw.loader.store.items = data.items;
+                                                               return;
+                                                       }
+                                               } catch ( e ) {}
+
+                                               if ( raw === undefined ) {
+                                                       // localStorage failed; disable store
+                                                       mw.loader.store.enabled = false;
+                                               } else {
+                                                       mw.loader.store.update();
+                                               }
+                                       },
+
+                                       /**
+                                        * Retrieve a module from the store and update cache hit stats.
+                                        *
+                                        * @param {string} module Module name
+                                        * @return {string|boolean} Module implementation or false if unavailable
+                                        */
+                                       get: function ( module ) {
+                                               var key;
+
+                                               if ( !mw.loader.store.enabled ) {
+                                                       return false;
+                                               }
+
+                                               key = mw.loader.store.getModuleKey( module );
+                                               if ( key in mw.loader.store.items ) {
+                                                       mw.loader.store.stats.hits++;
+                                                       return mw.loader.store.items[key];
+                                               }
+                                               mw.loader.store.stats.misses++;
+                                               return false;
+                                       },
+
+                                       /**
+                                        * Stringify a module and queue it for storage.
+                                        *
+                                        * @param {string} module Module name
+                                        * @param {Object} descriptor The module's descriptor as set in the registry
+                                        */
+                                       set: function ( module, descriptor ) {
+                                               var args, key;
+
+                                               if ( !mw.loader.store.enabled ) {
+                                                       return false;
+                                               }
+
+                                               key = mw.loader.store.getModuleKey( module );
+
+                                               if (
+                                                       // Already stored a copy of this exact version
+                                                       key in mw.loader.store.items ||
+                                                       // Module failed to load
+                                                       descriptor.state !== 'ready' ||
+                                                       // Unversioned, private, or site-/user-specific
+                                                       ( !descriptor.version || $.inArray( descriptor.group, [ 'private', 'user', 'site' ] ) !== -1 ) ||
+                                                       // Partial descriptor
+                                                       $.inArray( undefined, [ descriptor.script, descriptor.style, descriptor.messages ] ) !== -1
+                                               ) {
+                                                       // Decline to store
+                                                       return false;
+                                               }
+
+                                               try {
+                                                       args = [
+                                                               JSON.stringify( module ),
+                                                               typeof descriptor.script === 'function' ?
+                                                                       String( descriptor.script ) :
+                                                                       JSON.stringify( descriptor.script ),
+                                                               JSON.stringify( descriptor.style ),
+                                                               JSON.stringify( descriptor.messages )
+                                                       ];
+                                                       // Attempted workaround for a possible Opera bug (bug 57567).
+                                                       // This regex should never match under sane conditions.
+                                                       if ( /^\s*\(/.test( args[1] ) ) {
+                                                               args[1] = 'function' + args[1];
+                                                               log( 'Detected malformed function stringification (bug 57567)' );
+                                                       }
+                                               } catch ( e ) {
+                                                       return;
+                                               }
+
+                                               mw.loader.store.items[key] = 'mw.loader.implement(' + args.join( ',' ) + ');';
+                                               mw.loader.store.update();
+                                       },
+
+                                       /**
+                                        * Iterate through the module store, removing any item that does not correspond
+                                        * (in name and version) to an item in the module registry.
+                                        */
+                                       prune: function () {
+                                               var key, module;
+
+                                               if ( !mw.loader.store.enabled ) {
+                                                       return false;
+                                               }
+
+                                               for ( key in mw.loader.store.items ) {
+                                                       module = key.substring( 0, key.indexOf( '@' ) );
+                                                       if ( mw.loader.store.getModuleKey( module ) !== key ) {
+                                                               mw.loader.store.stats.expired++;
+                                                               delete mw.loader.store.items[key];
+                                                       }
+                                               }
+                                       },
+
+                                       /**
+                                        * Clear the entire module store right now.
+                                        */
+                                       clear: function () {
+                                               mw.loader.store.items = {};
+                                               localStorage.removeItem( mw.loader.store.getStoreKey() );
+                                       },
+
+                                       /**
+                                        * Sync modules to localStorage.
+                                        *
+                                        * This function debounces localStorage updates. When called multiple times in
+                                        * quick succession, the calls are coalesced into a single update operation.
+                                        * This allows us to call #update without having to consider the module load
+                                        * queue; the call to localStorage.setItem will be naturally deferred until the
+                                        * page is quiescent.
+                                        *
+                                        * Because localStorage is shared by all pages with the same origin, if multiple
+                                        * pages are loaded with different module sets, the possibility exists that
+                                        * modules saved by one page will be clobbered by another. But the impact would
+                                        * be minor and the problem would be corrected by subsequent page views.
+                                        *
+                                        * @method
+                                        */
+                                       update: ( function () {
+                                               var timer;
+
+                                               function flush() {
+                                                       var data,
+                                                               key = mw.loader.store.getStoreKey();
+
+                                                       if ( !mw.loader.store.enabled ) {
+                                                               return false;
+                                                       }
+                                                       mw.loader.store.prune();
+                                                       try {
+                                                               // Replacing the content of the module store might fail if the new
+                                                               // contents would exceed the browser's localStorage size limit. To
+                                                               // avoid clogging the browser with stale data, always remove the old
+                                                               // value before attempting to set the new one.
+                                                               localStorage.removeItem( key );
+                                                               data = JSON.stringify( mw.loader.store );
+                                                               localStorage.setItem( key, data );
+                                                       } catch ( e ) {}
+                                               }
+
+                                               return function () {
+                                                       clearTimeout( timer );
+                                                       timer = setTimeout( flush, 2000 );
+                                               };
+                                       }() )
+                               }
+                       };
+               }() ),
+
+               /**
+                * HTML construction helper functions
+                *
+                *     @example
+                *
+                *     var Html, output;
+                *
+                *     Html = mw.html;
+                *     output = Html.element( 'div', {}, new Html.Raw(
+                *         Html.element( 'img', { src: '<' } )
+                *     ) );
+                *     mw.log( output ); // <div><img src="&lt;"/></div>
+                *
+                * @class mw.html
+                * @singleton
+                */
+               html: ( function () {
+                       function escapeCallback( s ) {
+                               switch ( s ) {
+                                       case '\'':
+                                               return '&#039;';
+                                       case '"':
+                                               return '&quot;';
+                                       case '<':
+                                               return '&lt;';
+                                       case '>':
+                                               return '&gt;';
+                                       case '&':
+                                               return '&amp;';
+                               }
+                       }
+
+                       return {
+                               /**
+                                * Escape a string for HTML.
+                                *
+                                * Converts special characters to HTML entities.
+                                *
+                                *     mw.html.escape( '< > \' & "' );
+                                *     // Returns &lt; &gt; &#039; &amp; &quot;
+                                *
+                                * @param {string} s The string to escape
+                                * @return {string} HTML
+                                */
+                               escape: function ( s ) {
+                                       return s.replace( /['"<>&]/g, escapeCallback );
+                               },
+
+                               /**
+                                * Create an HTML element string, with safe escaping.
+                                *
+                                * @param {string} name The tag name.
+                                * @param {Object} attrs An object with members mapping element names to values
+                                * @param {Mixed} contents The contents of the element. May be either:
+                                *
+                                *  - string: The string is escaped.
+                                *  - null or undefined: The short closing form is used, e.g. `<br/>`.
+                                *  - this.Raw: The value attribute is included without escaping.
+                                *  - this.Cdata: The value attribute is included, and an exception is
+                                *   thrown if it contains an illegal ETAGO delimiter.
+                                *   See <http://www.w3.org/TR/1999/REC-html401-19991224/appendix/notes.html#h-B.3.2>.
+                                * @return {string} HTML
+                                */
+                               element: function ( name, attrs, contents ) {
+                                       var v, attrName, s = '<' + name;
+
+                                       for ( attrName in attrs ) {
+                                               v = attrs[attrName];
+                                               // Convert name=true, to name=name
+                                               if ( v === true ) {
+                                                       v = attrName;
+                                               // Skip name=false
+                                               } else if ( v === false ) {
+                                                       continue;
+                                               }
+                                               s += ' ' + attrName + '="' + this.escape( String( v ) ) + '"';
+                                       }
+                                       if ( contents === undefined || contents === null ) {
+                                               // Self close tag
+                                               s += '/>';
+                                               return s;
+                                       }
+                                       // Regular open tag
+                                       s += '>';
+                                       switch ( typeof contents ) {
+                                               case 'string':
+                                                       // Escaped
+                                                       s += this.escape( contents );
+                                                       break;
+                                               case 'number':
+                                               case 'boolean':
+                                                       // Convert to string
+                                                       s += String( contents );
+                                                       break;
+                                               default:
+                                                       if ( contents instanceof this.Raw ) {
+                                                               // Raw HTML inclusion
+                                                               s += contents.value;
+                                                       } else if ( contents instanceof this.Cdata ) {
+                                                               // CDATA
+                                                               if ( /<\/[a-zA-z]/.test( contents.value ) ) {
+                                                                       throw new Error( 'mw.html.element: Illegal end tag found in CDATA' );
+                                                               }
+                                                               s += contents.value;
+                                                       } else {
+                                                               throw new Error( 'mw.html.element: Invalid type of contents' );
+                                                       }
+                                       }
+                                       s += '</' + name + '>';
+                                       return s;
+                               },
+
+                               /**
+                                * Wrapper object for raw HTML passed to mw.html.element().
+                                * @class mw.html.Raw
+                                */
+                               Raw: function ( value ) {
+                                       this.value = value;
+                               },
+
+                               /**
+                                * Wrapper object for CDATA element contents passed to mw.html.element()
+                                * @class mw.html.Cdata
+                                */
+                               Cdata: function ( value ) {
+                                       this.value = value;
+                               }
+                       };
+               }() ),
+
+               // Skeleton user object. mediawiki.user.js extends this
+               user: {
+                       options: new Map(),
+                       tokens: new Map()
+               },
+
+               /**
+                * Registry and firing of events.
+                *
+                * MediaWiki has various interface components that are extended, enhanced
+                * or manipulated in some other way by extensions, gadgets and even
+                * in core itself.
+                *
+                * This framework helps streamlining the timing of when these other
+                * code paths fire their plugins (instead of using document-ready,
+                * which can and should be limited to firing only once).
+                *
+                * Features like navigating to other wiki pages, previewing an edit
+                * and editing itself – without a refresh – can then retrigger these
+                * hooks accordingly to ensure everything still works as expected.
+                *
+                * Example usage:
+                *
+                *     mw.hook( 'wikipage.content' ).add( fn ).remove( fn );
+                *     mw.hook( 'wikipage.content' ).fire( $content );
+                *
+                * Handlers can be added and fired for arbitrary event names at any time. The same
+                * event can be fired multiple times. The last run of an event is memorized
+                * (similar to `$(document).ready` and `$.Deferred().done`).
+                * This means if an event is fired, and a handler added afterwards, the added
+                * function will be fired right away with the last given event data.
+                *
+                * Like Deferreds and Promises, the mw.hook object is both detachable and chainable.
+                * Thus allowing flexible use and optimal maintainability and authority control.
+                * You can pass around the `add` and/or `fire` method to another piece of code
+                * without it having to know the event name (or `mw.hook` for that matter).
+                *
+                *     var h = mw.hook( 'bar.ready' );
+                *     new mw.Foo( .. ).fetch( { callback: h.fire } );
+                *
+                * Note: Events are documented with an underscore instead of a dot in the event
+                * name due to jsduck not supporting dots in that position.
+                *
+                * @class mw.hook
+                */
+               hook: ( function () {
+                       var lists = {};
+
+                       /**
+                        * Create an instance of mw.hook.
+                        *
+                        * @method hook
+                        * @member mw
+                        * @param {string} name Name of hook.
+                        * @return {mw.hook}
+                        */
+                       return function ( name ) {
+                               var list = hasOwn.call( lists, name ) ?
+                                       lists[name] :
+                                       lists[name] = $.Callbacks( 'memory' );
+
+                               return {
+                                       /**
+                                        * Register a hook handler
+                                        * @param {Function...} handler Function to bind.
+                                        * @chainable
+                                        */
+                                       add: list.add,
+
+                                       /**
+                                        * Unregister a hook handler
+                                        * @param {Function...} handler Function to unbind.
+                                        * @chainable
+                                        */
+                                       remove: list.remove,
+
+                                       /**
+                                        * Run a hook.
+                                        * @param {Mixed...} data
+                                        * @chainable
+                                        */
+                                       fire: function () {
+                                               return list.fireWith.call( this, null, slice.call( arguments ) );
+                                       }
+                               };
+                       };
+               }() )
+       };
+
+}( jQuery ) );
+
+// Alias $j to jQuery for backwards compatibility
+// @deprecated since 1.23 Use $ or jQuery instead
+mw.log.deprecate( window, '$j', jQuery, 'Use $ or jQuery instead.' );
+
+// Attach to window and globally alias
+window.mw = window.mediaWiki = mw;
+
+// Auto-register from pre-loaded startup scripts
+if ( jQuery.isFunction( window.startUp ) ) {
+       window.startUp();
+       window.startUp = undefined;
+}
diff --git a/resources/src/mediawiki/mediawiki.log.js b/resources/src/mediawiki/mediawiki.log.js
new file mode 100644 (file)
index 0000000..2ca0bbd
--- /dev/null
@@ -0,0 +1,84 @@
+/*!
+ * Logger for MediaWiki javascript.
+ * Implements the stub left by the main 'mediawiki' module.
+ *
+ * @author Michael Dale <mdale@wikimedia.org>
+ * @author Trevor Parscal <tparscal@wikimedia.org>
+ */
+
+( function ( mw, $ ) {
+
+       // Reference to dummy
+       // We don't need the dummy, but it has other methods on it
+       // that we need to restore afterwards.
+       var original = mw.log,
+               slice = Array.prototype.slice;
+
+       /**
+        * Logs a message to the console in debug mode.
+        *
+        * In the case the browser does not have a console API, a console is created on-the-fly by appending
+        * a `<div id="mw-log-console">` element to the bottom of the body and then appending this and future
+        * messages to that, instead of the console.
+        *
+        * @member mw.log
+        * @param {string...} msg Messages to output to console.
+        */
+       mw.log = function () {
+               // Turn arguments into an array
+               var args = slice.call( arguments ),
+                       // Allow log messages to use a configured prefix to identify the source window (ie. frame)
+                       prefix = mw.config.exists( 'mw.log.prefix' ) ? mw.config.get( 'mw.log.prefix' ) + '> ' : '';
+
+               // Try to use an existing console
+               // Generally we can cache this, but in this case we want to re-evaluate this as a
+               // global property live so that things like Firebug Lite can take precedence.
+               if ( window.console && window.console.log && window.console.log.apply ) {
+                       args.unshift( prefix );
+                       window.console.log.apply( window.console, args );
+                       return;
+               }
+
+               // If there is no console, use our own log box
+               mw.loader.using( 'jquery.footHovzer', function () {
+
+                       var     hovzer,
+                               d = new Date(),
+                               // Create HH:MM:SS.MIL timestamp
+                               time = ( d.getHours() < 10 ? '0' + d.getHours() : d.getHours() ) +
+                                ':' + ( d.getMinutes() < 10 ? '0' + d.getMinutes() : d.getMinutes() ) +
+                                ':' + ( d.getSeconds() < 10 ? '0' + d.getSeconds() : d.getSeconds() ) +
+                                '.' + ( d.getMilliseconds() < 10 ? '00' + d.getMilliseconds() : ( d.getMilliseconds() < 100 ? '0' + d.getMilliseconds() : d.getMilliseconds() ) ),
+                                $log = $( '#mw-log-console' );
+
+                       if ( !$log.length ) {
+                               $log = $( '<div id="mw-log-console"></div>' ).css( {
+                                               overflow: 'auto',
+                                               height: '150px',
+                                               backgroundColor: 'white',
+                                               borderTop: 'solid 2px #ADADAD'
+                                       } );
+                               hovzer = $.getFootHovzer();
+                               hovzer.$.append( $log );
+                               hovzer.update();
+                       }
+                       $log.append(
+                               $( '<div>' )
+                                       .css( {
+                                               borderBottom: 'solid 1px #DDDDDD',
+                                               fontSize: 'small',
+                                               fontFamily: 'monospace',
+                                               whiteSpace: 'pre-wrap',
+                                               padding: '0.125em 0.25em'
+                                       } )
+                                       .text( prefix + args.join( ', ' ) )
+                                       .prepend( '<span style="float: right;">[' + time + ']</span>' )
+                       );
+               } );
+       };
+
+       // Restore original methods
+       mw.log.warn = original.warn;
+       mw.log.deprecate = original.deprecate;
+
+}( mediaWiki, jQuery ) );
diff --git a/resources/src/mediawiki/mediawiki.notification.css b/resources/src/mediawiki/mediawiki.notification.css
new file mode 100644 (file)
index 0000000..0c8152e
--- /dev/null
@@ -0,0 +1,32 @@
+.mw-notification-area {
+       position: absolute;
+       top: 0;
+       right: 0;
+       padding: 1em 1em 0 0;
+       width: 20em;
+       line-height: 1.35;
+       z-index: 10000;
+}
+
+.mw-notification-area-floating {
+       position: fixed;
+}
+
+* html .mw-notification-area-floating {
+       /* Make it at least 'absolute' in IE6 since 'fixed' is not supported */
+       position: absolute;
+}
+
+.mw-notification {
+       padding: 0.25em 1em;
+       margin-bottom: 0.5em;
+       border: solid 1px #ddd;
+       background-color: #fcfcfc;
+       /* Message hides on-click */
+       /* See also mediawiki.notification.js */
+       cursor: pointer;
+}
+
+.mw-notification-title {
+       font-weight: bold;
+}
diff --git a/resources/src/mediawiki/mediawiki.notification.hideForPrint.css b/resources/src/mediawiki/mediawiki.notification.hideForPrint.css
new file mode 100644 (file)
index 0000000..4f9162e
--- /dev/null
@@ -0,0 +1,3 @@
+.mw-notification-area {
+       display: none;
+}
diff --git a/resources/src/mediawiki/mediawiki.notification.js b/resources/src/mediawiki/mediawiki.notification.js
new file mode 100644 (file)
index 0000000..b5fd69c
--- /dev/null
@@ -0,0 +1,522 @@
+( function ( mw, $ ) {
+       'use strict';
+
+       var notification,
+               // The #mw-notification-area div that all notifications are contained inside.
+               $area,
+               // Number of open notification boxes at any time
+               openNotificationCount = 0,
+               isPageReady = false,
+               preReadyNotifQueue = [];
+
+       /**
+        * A Notification object for 1 message.
+        *
+        * The "_" in the name is to avoid a bug (http://github.com/senchalabs/jsduck/issues/304).
+        * It is not part of the actual class name.
+        *
+        * @class mw.Notification_
+        * @alternateClassName mw.Notification
+        *
+        * @constructor The constructor is not publicly accessible; use mw.notification#notify instead.
+        *  This does not insert anything into the document (see #start).
+        * @private
+        */
+       function Notification( message, options ) {
+               var $notification, $notificationTitle, $notificationContent;
+
+               $notification = $( '<div class="mw-notification"></div>' )
+                       .data( 'mw.notification', this )
+                       .addClass( options.autoHide ? 'mw-notification-autohide' : 'mw-notification-noautohide' );
+
+               if ( options.tag ) {
+                       // Sanitize options.tag before it is used by any code. (Including Notification class methods)
+                       options.tag = options.tag.replace( /[ _\-]+/g, '-' ).replace( /[^\-a-z0-9]+/ig, '' );
+                       if ( options.tag ) {
+                               $notification.addClass( 'mw-notification-tag-' + options.tag );
+                       } else {
+                               delete options.tag;
+                       }
+               }
+
+               if ( options.title ) {
+                       $notificationTitle = $( '<div class="mw-notification-title"></div>' )
+                               .text( options.title )
+                               .appendTo( $notification );
+               }
+
+               $notificationContent = $( '<div class="mw-notification-content"></div>' );
+
+               if ( typeof message === 'object' ) {
+                       // Handle mw.Message objects separately from DOM nodes and jQuery objects
+                       if ( message instanceof mw.Message ) {
+                               $notificationContent.html( message.parse() );
+                       } else {
+                               $notificationContent.append( message );
+                       }
+               } else {
+                       $notificationContent.text( message );
+               }
+
+               $notificationContent.appendTo( $notification );
+
+               // Private state parameters, meant for internal use only
+               // isOpen: Set to true after .start() is called to avoid double calls.
+               //         Set back to false after .close() to avoid duplicating the close animation.
+               // isPaused: false after .resume(), true after .pause(). Avoids duplicating or breaking the hide timeouts.
+               //           Set to true initially so .start() can call .resume().
+               // message: The message passed to the notification. Unused now but may be used in the future
+               //          to stop replacement of a tagged notification with another notification using the same message.
+               // options: The options passed to the notification with a little sanitization. Used by various methods.
+               // $notification: jQuery object containing the notification DOM node.
+               this.isOpen = false;
+               this.isPaused = true;
+               this.message = message;
+               this.options = options;
+               this.$notification = $notification;
+       }
+
+       /**
+        * Start the notification. Called automatically by mw.notification#notify
+        * (possibly asynchronously on document-ready).
+        *
+        * This inserts the notification into the page, closes any matching tagged notifications,
+        * handles the fadeIn animations and replacement transitions, and starts autoHide timers.
+        *
+        * @private
+        */
+       Notification.prototype.start = function () {
+               var
+                       // Local references
+                       $notification, options,
+                       // Original opacity so that we can animate back to it later
+                       opacity,
+                       // Other notification elements matching the same tag
+                       $tagMatches,
+                       outerHeight,
+                       placeholderHeight,
+                       autohideCount,
+                       notif;
+
+               $area.show();
+
+               if ( this.isOpen ) {
+                       return;
+               }
+
+               this.isOpen = true;
+               openNotificationCount++;
+
+               options = this.options;
+               $notification = this.$notification;
+
+               opacity = this.$notification.css( 'opacity' );
+
+               // Set the opacity to 0 so we can fade in later.
+               $notification.css( 'opacity', 0 );
+
+               if ( options.tag ) {
+                       // Check to see if there are any tagged notifications with the same tag as the new one
+                       $tagMatches = $area.find( '.mw-notification-tag-' + options.tag );
+               }
+
+               // If we found a tagged notification use the replacement pattern instead of the new
+               // notification fade-in pattern.
+               if ( options.tag && $tagMatches.length ) {
+
+                       // Iterate over the tag matches to find the outerHeight we should use
+                       // for the placeholder.
+                       outerHeight = 0;
+                       $tagMatches.each( function () {
+                               var notif = $( this ).data( 'mw.notification' );
+                               if ( notif ) {
+                                       // Use the notification's height + padding + border + margins
+                                       // as the placeholder height.
+                                       outerHeight = notif.$notification.outerHeight( true );
+                                       if ( notif.$replacementPlaceholder ) {
+                                               // Grab the height of a placeholder that has not finished animating.
+                                               placeholderHeight = notif.$replacementPlaceholder.height();
+                                               // Remove any placeholders added by a previous tagged
+                                               // notification that was in the middle of replacing another.
+                                               // This also makes sure that we only grab the placeholderHeight
+                                               // for the most recent notification.
+                                               notif.$replacementPlaceholder.remove();
+                                               delete notif.$replacementPlaceholder;
+                                       }
+                                       // Close the previous tagged notification
+                                       // Since we're replacing it do this with a fast speed and don't output a placeholder
+                                       // since we're taking care of that transition ourselves.
+                                       notif.close( { speed: 'fast', placeholder: false } );
+                               }
+                       } );
+                       if ( placeholderHeight !== undefined ) {
+                               // If the other tagged notification was in the middle of replacing another
+                               // tagged notification, continue from the placeholder's height instead of
+                               // using the outerHeight of the notification.
+                               outerHeight = placeholderHeight;
+                       }
+
+                       $notification
+                               // Insert the new notification before the tagged notification(s)
+                               .insertBefore( $tagMatches.first() )
+                               .css( {
+                                       // Use an absolute position so that we can use a placeholder to gracefully push other notifications
+                                       // into the right spot.
+                                       position: 'absolute',
+                                       width: $notification.width()
+                               } )
+                               // Fade-in the notification
+                               .animate( { opacity: opacity },
+                                       {
+                                               duration: 'slow',
+                                               complete: function () {
+                                                       // After we've faded in clear the opacity and let css take over
+                                                       $( this ).css( { opacity: '' } );
+                                               }
+                                       } );
+
+                       notif = this;
+
+                       // Create a clear placeholder we can use to make the notifications around the notification that is being
+                       // replaced expand or contract gracefully to fit the height of the new notification.
+                       notif.$replacementPlaceholder = $( '<div>' )
+                               // Set the height to the space the previous notification or placeholder took
+                               .css( 'height', outerHeight )
+                               // Make sure that this placeholder is at the very end of this tagged notification group
+                               .insertAfter( $tagMatches.eq( -1 ) )
+                               // Animate the placeholder height to the space that this new notification will take up
+                               .animate( { height: $notification.outerHeight( true ) },
+                                       {
+                                               // Do space animations fast
+                                               speed: 'fast',
+                                               complete: function () {
+                                                       // Reset the notification position after we've finished the space animation
+                                                       // However do not do it if the placeholder was removed because another tagged
+                                                       // notification went and closed this one.
+                                                       if ( notif.$replacementPlaceholder ) {
+                                                               $notification.css( 'position', '' );
+                                                       }
+                                                       // Finally, remove the placeholder from the DOM
+                                                       $( this ).remove();
+                                               }
+                                       } );
+               } else {
+                       // Append to the notification area and fade in to the original opacity.
+                       $notification
+                               .appendTo( $area )
+                               .animate( { opacity: opacity },
+                                       {
+                                               duration: 'fast',
+                                               complete: function () {
+                                                       // After we've faded in clear the opacity and let css take over
+                                                       $( this ).css( 'opacity', '' );
+                                               }
+                                       }
+                               );
+               }
+
+               // By default a notification is paused.
+               // If this notification is within the first {autoHideLimit} notifications then
+               // start the auto-hide timer as soon as it's created.
+               autohideCount = $area.find( '.mw-notification-autohide' ).length;
+               if ( autohideCount <= notification.autoHideLimit ) {
+                       this.resume();
+               }
+       };
+
+       /**
+        * Pause any running auto-hide timer for this notification
+        */
+       Notification.prototype.pause = function () {
+               if ( this.isPaused ) {
+                       return;
+               }
+               this.isPaused = true;
+
+               if ( this.timeout ) {
+                       clearTimeout( this.timeout );
+                       delete this.timeout;
+               }
+       };
+
+       /**
+        * Start autoHide timer if not already started.
+        * Does nothing if autoHide is disabled.
+        * Either to resume from pause or to make the first start.
+        */
+       Notification.prototype.resume = function () {
+               var notif = this;
+               if ( !notif.isPaused ) {
+                       return;
+               }
+               // Start any autoHide timeouts
+               if ( notif.options.autoHide ) {
+                       notif.isPaused = false;
+                       notif.timeout = setTimeout( function () {
+                               // Already finished, so don't try to re-clear it
+                               delete notif.timeout;
+                               notif.close();
+                       }, notification.autoHideSeconds * 1000 );
+               }
+       };
+
+       /**
+        * Close/hide the notification.
+        *
+        * @param {Object} options An object containing options for the closing of the notification.
+        *
+        *  - speed: Use a close speed different than the default 'slow'.
+        *  - placeholder: Set to false to disable the placeholder transition.
+        */
+       Notification.prototype.close = function ( options ) {
+               if ( !this.isOpen ) {
+                       return;
+               }
+               this.isOpen = false;
+               openNotificationCount--;
+               // Clear any remaining timeout on close
+               this.pause();
+
+               options = $.extend( {
+                       speed: 'slow',
+                       placeholder: true
+               }, options );
+
+               // Remove the mw-notification-autohide class from the notification to avoid
+               // having a half-closed notification counted as a notification to resume
+               // when handling {autoHideLimit}.
+               this.$notification.removeClass( 'mw-notification-autohide' );
+
+               // Now that a notification is being closed. Start auto-hide timers for any
+               // notification that has now become one of the first {autoHideLimit} notifications.
+               notification.resume();
+
+               this.$notification
+                       .css( {
+                               // Don't trigger any mouse events while fading out, just in case the cursor
+                               // happens to be right above us when we transition upwards.
+                               pointerEvents: 'none',
+                               // Set an absolute position so we can move upwards in the animation.
+                               // Notification replacement doesn't look right unless we use an animation like this.
+                               position: 'absolute',
+                               // We must fix the width to avoid it shrinking horizontally.
+                               width: this.$notification.width()
+                       } )
+                       // Fix the top/left position to the current computed position from which we
+                       // can animate upwards.
+                       .css( this.$notification.position() );
+
+               // This needs to be done *after* notification's position has been made absolute.
+               if ( options.placeholder ) {
+                       // Insert a placeholder with a height equal to the height of the
+                       // notification plus it's vertical margins in place of the notification
+                       var $placeholder = $( '<div>' )
+                               .css( 'height', this.$notification.outerHeight( true ) )
+                               .insertBefore( this.$notification );
+               }
+
+               // Animate opacity and top to create fade upwards animation for notification closing
+               this.$notification
+                       .animate( {
+                               opacity: 0,
+                               top: '-=35'
+                       }, {
+                               duration: options.speed,
+                               complete: function () {
+                                       // Remove the notification
+                                       $( this ).remove();
+                                       // Hide the area manually after closing the last notification, since it has padding,
+                                       // causing it to obscure whatever is behind it in spite of being invisible (bug 52659).
+                                       // It's okay to do this before getting rid of the placeholder, as it's invisible as well.
+                                       if ( openNotificationCount === 0 ) {
+                                               $area.hide();
+                                       }
+                                       if ( options.placeholder ) {
+                                               // Use a fast slide up animation after closing to make it look like the notifications
+                                               // below slide up into place when the notification disappears
+                                               $placeholder.slideUp( 'fast', function () {
+                                                       // Remove the placeholder
+                                                       $( this ).remove();
+                                               } );
+                                       }
+                               }
+                       } );
+       };
+
+       /**
+        * Helper function, take a list of notification divs and call
+        * a function on the Notification instance attached to them.
+        *
+        * @private
+        * @static
+        * @param {jQuery} $notifications A jQuery object containing notification divs
+        * @param {string} fn The name of the function to call on the Notification instance
+        */
+       function callEachNotification( $notifications, fn ) {
+               $notifications.each( function () {
+                       var notif = $( this ).data( 'mw.notification' );
+                       if ( notif ) {
+                               notif[fn]();
+                       }
+               } );
+       }
+
+       /**
+        * Initialisation.
+        * Must only be called once, and not before the document is ready.
+        * @ignore
+        */
+       function init() {
+               var offset, $window = $( window );
+
+               $area = $( '<div id="mw-notification-area" class="mw-notification-area mw-notification-area-layout"></div>' )
+                       // Pause auto-hide timers when the mouse is in the notification area.
+                       .on( {
+                               mouseenter: notification.pause,
+                               mouseleave: notification.resume
+                       } )
+                       // When clicking on a notification close it.
+                       .on( 'click', '.mw-notification', function () {
+                               var notif = $( this ).data( 'mw.notification' );
+                               if ( notif ) {
+                                       notif.close();
+                               }
+                       } )
+                       // Stop click events from <a> tags from propogating to prevent clicking.
+                       // on links from hiding a notification.
+                       .on( 'click', 'a', function ( e ) {
+                               e.stopPropagation();
+                       } );
+
+               // Prepend the notification area to the content area and save it's object.
+               mw.util.$content.prepend( $area );
+               offset = $area.offset();
+
+               function updateAreaMode() {
+                       var isFloating = $window.scrollTop() > offset.top;
+                       $area
+                               .toggleClass( 'mw-notification-area-floating', isFloating )
+                               .toggleClass( 'mw-notification-area-layout', !isFloating );
+               }
+
+               $window.on( 'scroll', updateAreaMode );
+
+               // Initial mode
+               updateAreaMode();
+       }
+
+       /**
+        * @class mw.notification
+        * @singleton
+        */
+       notification = {
+               /**
+                * Pause auto-hide timers for all notifications.
+                * Notifications will not auto-hide until resume is called.
+                * @see mw.Notification#pause
+                */
+               pause: function () {
+                       callEachNotification(
+                               $area.children( '.mw-notification' ),
+                               'pause'
+                       );
+               },
+
+               /**
+                * Resume any paused auto-hide timers from the beginning.
+                * Only the first #autoHideLimit timers will be resumed.
+                */
+               resume: function () {
+                       callEachNotification(
+                               // Only call resume on the first #autoHideLimit notifications.
+                               // Exclude noautohide notifications to avoid bugs where #autoHideLimit
+                               // `{ autoHide: false }` notifications are at the start preventing any
+                               // auto-hide notifications from being autohidden.
+                               $area.children( '.mw-notification-autohide' ).slice( 0, notification.autoHideLimit ),
+                               'resume'
+                       );
+               },
+
+               /**
+                * Display a notification message to the user.
+                *
+                * @param {HTMLElement|jQuery|mw.Message|string} message
+                * @param {Object} options The options to use for the notification.
+                *  See #defaults for details.
+                * @return {mw.Notification} Notification object
+                */
+               notify: function ( message, options ) {
+                       var notif;
+                       options = $.extend( {}, notification.defaults, options );
+
+                       notif = new Notification( message, options );
+
+                       if ( isPageReady ) {
+                               notif.start();
+                       } else {
+                               preReadyNotifQueue.push( notif );
+                       }
+
+                       return notif;
+               },
+
+               /**
+                * @property {Object}
+                * The defaults for #notify options parameter.
+                *
+                * - autoHide:
+                *   A boolean indicating whether the notifification should automatically
+                *   be hidden after shown. Or if it should persist.
+                *
+                * - tag:
+                *   An optional string. When a notification is tagged only one message
+                *   with that tag will be displayed. Trying to display a new notification
+                *   with the same tag as one already being displayed will cause the other
+                *   notification to be closed and this new notification to open up inside
+                *   the same place as the previous notification.
+                *
+                * - title:
+                *   An optional title for the notification. Will be displayed above the
+                *   content. Usually in bold.
+                */
+               defaults: {
+                       autoHide: true,
+                       tag: false,
+                       title: undefined
+               },
+
+               /**
+                * @property {number}
+                * Number of seconds to wait before auto-hiding notifications.
+                */
+               autoHideSeconds: 5,
+
+               /**
+                * @property {number}
+                * Maximum number of notifications to count down auto-hide timers for.
+                * Only the first #autoHideLimit notifications being displayed will
+                * auto-hide. Any notifications further down in the list will only start
+                * counting down to auto-hide after the first few messages have closed.
+                *
+                * This basically represents the number of notifications the user should
+                * be able to process in #autoHideSeconds time.
+                */
+               autoHideLimit: 3
+       };
+
+       $( function () {
+               var notif;
+
+               init();
+
+               // Handle pre-ready queue.
+               isPageReady = true;
+               while ( preReadyNotifQueue.length ) {
+                       notif = preReadyNotifQueue.shift();
+                       notif.start();
+               }
+       } );
+
+       mw.notification = notification;
+
+}( mediaWiki, jQuery ) );
diff --git a/resources/src/mediawiki/mediawiki.notify.js b/resources/src/mediawiki/mediawiki.notify.js
new file mode 100644 (file)
index 0000000..743d651
--- /dev/null
@@ -0,0 +1,28 @@
+/**
+ * @class mw.plugin.notify
+ */
+( function ( mw, $ ) {
+       'use strict';
+
+       /**
+        * @see mw.notification#notify
+        * @param message
+        * @param options
+        * @return {jQuery.Promise}
+        */
+       mw.notify = function ( message, options ) {
+               var d = $.Deferred();
+               // Don't bother loading the whole notification system if we never use it.
+               mw.loader.using( 'mediawiki.notification', function () {
+                       // Call notify with the notification the user requested of us.
+                       d.resolve( mw.notification.notify( message, options ) );
+               }, d.reject );
+               return d.promise();
+       };
+
+       /**
+        * @class mw
+        * @mixins mw.plugin.notify
+        */
+
+}( mediaWiki, jQuery ) );
diff --git a/resources/src/mediawiki/mediawiki.searchSuggest.css b/resources/src/mediawiki/mediawiki.searchSuggest.css
new file mode 100644 (file)
index 0000000..df144ce
--- /dev/null
@@ -0,0 +1,24 @@
+/* Make sure the links are not underlined or colored, ever. */
+/* There is already a :focus / :hover indication on the <div>. */
+.suggestions a.mw-searchSuggest-link,
+.suggestions a.mw-searchSuggest-link:hover,
+.suggestions a.mw-searchSuggest-link:active,
+.suggestions a.mw-searchSuggest-link:focus {
+       color: black;
+       text-decoration: none;
+}
+
+.suggestions-result-current a.mw-searchSuggest-link,
+.suggestions-result-current a.mw-searchSuggest-link:hover,
+.suggestions-result-current a.mw-searchSuggest-link:active,
+.suggestions-result-current a.mw-searchSuggest-link:focus {
+       color: white;
+}
+
+.suggestions a.mw-searchSuggest-link .special-query {
+       /* Apply ellipsis to suggestions */
+       overflow: hidden;
+       -o-text-overflow: ellipsis; /* Opera 9 to 10 */
+       text-overflow: ellipsis;
+       white-space: nowrap;
+}
diff --git a/resources/src/mediawiki/mediawiki.searchSuggest.js b/resources/src/mediawiki/mediawiki.searchSuggest.js
new file mode 100644 (file)
index 0000000..8a8871d
--- /dev/null
@@ -0,0 +1,201 @@
+/*!
+ * Add search suggestions to the search form.
+ */
+( function ( mw, $ ) {
+       $( function () {
+               var map, resultRenderCache, searchboxesSelectors,
+                       // Region where the suggestions box will appear directly below
+                       // (using the same width). Can be a container element or the input
+                       // itself, depending on what suits best in the environment.
+                       // For Vector the suggestion box should align with the simpleSearch
+                       // container's borders, in other skins it should align with the input
+                       // element (not the search form, as that would leave the buttons
+                       // vertically between the input and the suggestions).
+                       $searchRegion = $( '#simpleSearch, #searchInput' ).first(),
+                       $searchInput = $( '#searchInput' );
+
+               // Compatibility map
+               map = {
+                       // SimpleSearch is broken in Opera < 9.6
+                       opera: [['>=', 9.6]],
+                       // Older Konquerors are unable to position the suggestions correctly (bug 50805)
+                       konqueror: [['>=', '4.11']],
+                       docomo: false,
+                       blackberry: false,
+                       ipod: false,
+                       iphone: false
+               };
+
+               if ( !$.client.test( map ) ) {
+                       return;
+               }
+
+               // Compute form data for search suggestions functionality.
+               function computeResultRenderCache( context ) {
+                       var $form, baseHref, linkParams;
+
+                       // Compute common parameters for links' hrefs
+                       $form = context.config.$region.closest( 'form' );
+
+                       baseHref = $form.attr( 'action' );
+                       baseHref += baseHref.indexOf( '?' ) > -1 ? '&' : '?';
+
+                       linkParams = {};
+                       $.each( $form.serializeArray(), function ( idx, obj ) {
+                               linkParams[ obj.name ] = obj.value;
+                       } );
+
+                       return {
+                               textParam: context.data.$textbox.attr( 'name' ),
+                               linkParams: linkParams,
+                               baseHref: baseHref
+                       };
+               }
+
+               // The function used to render the suggestions.
+               function renderFunction( text, context ) {
+                       if ( !resultRenderCache ) {
+                               resultRenderCache = computeResultRenderCache( context );
+                       }
+
+                       // linkParams object is modified and reused
+                       resultRenderCache.linkParams[ resultRenderCache.textParam ] = text;
+
+                       // this is the container <div>, jQueryfied
+                       this.text( text )
+                               .wrap(
+                                       $( '<a>' )
+                                               .attr( 'href', resultRenderCache.baseHref + $.param( resultRenderCache.linkParams ) )
+                                               .addClass( 'mw-searchSuggest-link' )
+                               );
+               }
+
+               function specialRenderFunction( query, context ) {
+                       var $el = this;
+
+                       if ( !resultRenderCache ) {
+                               resultRenderCache = computeResultRenderCache( context );
+                       }
+
+                       // linkParams object is modified and reused
+                       resultRenderCache.linkParams[ resultRenderCache.textParam ] = query;
+
+                       if ( $el.children().length === 0 ) {
+                               $el
+                                       .append(
+                                               $( '<div>' )
+                                                       .addClass( 'special-label' )
+                                                       .text( mw.msg( 'searchsuggest-containing' ) ),
+                                               $( '<div>' )
+                                                       .addClass( 'special-query' )
+                                                       .text( query )
+                                       )
+                                       .show();
+                       } else {
+                               $el.find( '.special-query' )
+                                       .text( query );
+                       }
+
+                       if ( $el.parent().hasClass( 'mw-searchSuggest-link' ) ) {
+                               $el.parent().attr( 'href', resultRenderCache.baseHref + $.param( resultRenderCache.linkParams ) + '&fulltext=1' );
+                       } else {
+                               $el.wrap(
+                                       $( '<a>' )
+                                               .attr( 'href', resultRenderCache.baseHref + $.param( resultRenderCache.linkParams ) + '&fulltext=1' )
+                                               .addClass( 'mw-searchSuggest-link' )
+                               );
+                       }
+               }
+
+               // General suggestions functionality for all search boxes
+               searchboxesSelectors = [
+                       // Primary searchbox on every page in standard skins
+                       '#searchInput',
+                       // Special:Search
+                       '#powerSearchText',
+                       '#searchText',
+                       // Generic selector for skins with multiple searchboxes (used by CologneBlue)
+                       '.mw-searchInput'
+               ];
+               $( searchboxesSelectors.join( ', ' ) )
+                       .suggestions( {
+                               fetch: function ( query ) {
+                                       var $el;
+
+                                       if ( query.length !== 0 ) {
+                                               $el = $( this );
+                                               $el.data( 'request', ( new mw.Api() ).get( {
+                                                       action: 'opensearch',
+                                                       search: query,
+                                                       namespace: 0,
+                                                       suggest: ''
+                                               } ).done( function ( data ) {
+                                                       $el.suggestions( 'suggestions', data[1] );
+                                               } ) );
+                                       }
+                               },
+                               cancel: function () {
+                                       var apiPromise = $( this ).data( 'request' );
+                                       // If the delay setting has caused the fetch to have not even happened
+                                       // yet, the apiPromise object will have never been set.
+                                       if ( apiPromise && $.isFunction( apiPromise.abort ) ) {
+                                               apiPromise.abort();
+                                               $( this ).removeData( 'request' );
+                                       }
+                               },
+                               result: {
+                                       render: renderFunction,
+                                       select: function () {
+                                               return true; // allow the form to be submitted
+                                       }
+                               },
+                               delay: 120,
+                               highlightInput: true
+                       } )
+                       .bind( 'paste cut drop', function () {
+                               // make sure paste and cut events from the mouse and drag&drop events
+                               // trigger the keypress handler and cause the suggestions to update
+                               $( this ).trigger( 'keypress' );
+                       } );
+
+               // Ensure that the thing is actually present!
+               if ( $searchRegion.length === 0 ) {
+                       // Don't try to set anything up if simpleSearch is disabled sitewide.
+                       // The loader code loads us if the option is present, even if we're
+                       // not actually enabled (anymore).
+                       return;
+               }
+
+               // Special suggestions functionality for skin-provided search box
+               $searchInput.suggestions( {
+                       result: {
+                               render: renderFunction,
+                               select: function () {
+                                       return true; // allow the form to be submitted
+                               }
+                       },
+                       special: {
+                               render: specialRenderFunction,
+                               select: function ( $input ) {
+                                       $input.closest( 'form' )
+                                               .append( $( '<input type="hidden" name="fulltext" value="1"/>' ) );
+                                       return true; // allow the form to be submitted
+                               }
+                       },
+                       $region: $searchRegion
+               } );
+
+               // If the form includes any fallback fulltext search buttons, remove them
+               $searchInput.closest( 'form' ).find( '.mw-fallbackSearchButton' ).remove();
+
+               // In most skins (at least Monobook and Vector), the font-size is messed up in <body>.
+               // (they use 2 elements to get a sane font-height). So, instead of making exceptions for
+               // each skin or adding more stylesheets, just copy it from the active element so auto-fit.
+               $searchInput
+                       .data( 'suggestions-context' )
+                       .data.$container
+                               .css( 'fontSize', $searchInput.css( 'fontSize' ) );
+
+       } );
+
+}( mediaWiki, jQuery ) );
diff --git a/resources/src/mediawiki/mediawiki.toc.js b/resources/src/mediawiki/mediawiki.toc.js
new file mode 100644 (file)
index 0000000..6eb8552
--- /dev/null
@@ -0,0 +1,69 @@
+/**
+ * @private
+ * @singleton
+ * @class mw.toc
+ */
+( function ( mw, $ ) {
+       'use strict';
+
+       // Table of contents toggle
+       mw.hook( 'wikipage.content' ).add( function ( $content ) {
+
+               /**
+                * Hide/show the table of contents element
+                *
+                * @param {jQuery} $toggleLink A jQuery object of the toggle link.
+                */
+               function toggleToc( $toggleLink ) {
+                       var $tocList = $content.find( '#toc ul:first' );
+
+                       // This function shouldn't be called if there's no TOC,
+                       // but just in case...
+                       if ( $tocList.length ) {
+                               if ( $tocList.is( ':hidden' ) ) {
+                                       $tocList.slideDown( 'fast' );
+                                       $toggleLink.text( mw.msg( 'hidetoc' ) );
+                                       $content.find( '#toc' ).removeClass( 'tochidden' );
+                                       $.cookie( 'mw_hidetoc', null, {
+                                               expires: 30,
+                                               path: '/'
+                                       } );
+                               } else {
+                                       $tocList.slideUp( 'fast' );
+                                       $toggleLink.text( mw.msg( 'showtoc' ) );
+                                       $content.find( '#toc' ).addClass( 'tochidden' );
+                                       $.cookie( 'mw_hidetoc', '1', {
+                                               expires: 30,
+                                               path: '/'
+                                       } );
+                               }
+                       }
+               }
+
+               var $tocTitle, $tocToggleLink, hideTocCookie;
+               $tocTitle = $content.find( '#toctitle' );
+               $tocToggleLink = $content.find( '#togglelink' );
+               // Only add it if there is a TOC and there is no toggle added already
+               if ( $content.find( '#toc' ).length && $tocTitle.length && !$tocToggleLink.length ) {
+                       hideTocCookie = $.cookie( 'mw_hidetoc' );
+                       $tocToggleLink = $( '<a href="#" class="internal" id="togglelink"></a>' )
+                               .text( mw.msg( 'hidetoc' ) )
+                               .click( function ( e ) {
+                                       e.preventDefault();
+                                       toggleToc( $( this ) );
+                               } );
+                       $tocTitle.append(
+                               $tocToggleLink
+                                       .wrap( '<span class="toctoggle"></span>' )
+                                       .parent()
+                                               .prepend( '&nbsp;[' )
+                                               .append( ']&nbsp;' )
+                       );
+
+                       if ( hideTocCookie === '1' ) {
+                               toggleToc( $tocToggleLink );
+                       }
+               }
+       } );
+
+}( mediaWiki, jQuery ) );
diff --git a/resources/src/mediawiki/mediawiki.user.js b/resources/src/mediawiki/mediawiki.user.js
new file mode 100644 (file)
index 0000000..8344111
--- /dev/null
@@ -0,0 +1,261 @@
+/**
+ * @class mw.user
+ * @singleton
+ */
+( function ( mw, $ ) {
+       var user,
+               deferreds = {},
+               // Extend the skeleton mw.user from mediawiki.js
+               // This is kind of ugly but we're stuck with this for b/c reasons
+               options = mw.user.options || new mw.Map(),
+               tokens = mw.user.tokens || new mw.Map();
+
+       /**
+        * Get the current user's groups or rights
+        *
+        * @private
+        * @param {string} info One of 'groups' or 'rights'
+        * @param {Function} [callback]
+        * @return {jQuery.Promise}
+        */
+       function getUserInfo( info, callback ) {
+               var api;
+               if ( !deferreds[info] ) {
+
+                       deferreds.rights = $.Deferred();
+                       deferreds.groups = $.Deferred();
+
+                       api = new mw.Api();
+                       api.get( {
+                               action: 'query',
+                               meta: 'userinfo',
+                               uiprop: 'rights|groups'
+                       } ).always( function ( data ) {
+                               var rights, groups;
+                               if ( data.query && data.query.userinfo ) {
+                                       rights = data.query.userinfo.rights;
+                                       groups = data.query.userinfo.groups;
+                               }
+                               deferreds.rights.resolve( rights || [] );
+                               deferreds.groups.resolve( groups || [] );
+                       } );
+
+               }
+
+               return deferreds[info].done( callback ).promise();
+       }
+
+       mw.user = user = {
+               options: options,
+               tokens: tokens,
+
+               /**
+                * Generate a random user session ID (32 alpha-numeric characters)
+                *
+                * This information would potentially be stored in a cookie to identify a user during a
+                * session or series of sessions. Its uniqueness should not be depended on.
+                *
+                * @return {string} Random set of 32 alpha-numeric characters
+                */
+               generateRandomSessionId: function () {
+                       var i, r,
+                               id = '',
+                               seed = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';
+                       for ( i = 0; i < 32; i++ ) {
+                               r = Math.floor( Math.random() * seed.length );
+                               id += seed.substring( r, r + 1 );
+                       }
+                       return id;
+               },
+
+               /**
+                * Get the current user's database id
+                *
+                * Not to be confused with #id.
+                *
+                * @return {number} Current user's id, or 0 if user is anonymous
+                */
+               getId: function () {
+                       return mw.config.get( 'wgUserId', 0 );
+               },
+
+               /**
+                * Get the current user's name
+                *
+                * @return {string|null} User name string or null if user is anonymous
+                */
+               getName: function () {
+                       return mw.config.get( 'wgUserName' );
+               },
+
+               /**
+                * @inheritdoc #getName
+                * @deprecated since 1.20 use #getName instead
+                */
+               name: function () {
+                       return user.getName();
+               },
+
+               /**
+                * Get date user registered, if available
+                *
+                * @return {Date|boolean|null} Date user registered, or false for anonymous users, or
+                *  null when data is not available
+                */
+               getRegistration: function () {
+                       var registration = mw.config.get( 'wgUserRegistration' );
+                       if ( user.isAnon() ) {
+                               return false;
+                       } else if ( registration === null ) {
+                               // Information may not be available if they signed up before
+                               // MW began storing this.
+                               return null;
+                       } else {
+                               return new Date( registration );
+                       }
+               },
+
+               /**
+                * Whether the current user is anonymous
+                *
+                * @return {boolean}
+                */
+               isAnon: function () {
+                       return user.getName() === null;
+               },
+
+               /**
+                * @inheritdoc #isAnon
+                * @deprecated since 1.20 use #isAnon instead
+                */
+               anonymous: function () {
+                       return user.isAnon();
+               },
+
+               /**
+                * Get an automatically generated random ID (stored in a session cookie)
+                *
+                * This ID is ephemeral for everyone, staying in their browser only until they close
+                * their browser.
+                *
+                * @return {string} Random session ID
+                */
+               sessionId: function () {
+                       var sessionId = $.cookie( 'mediaWiki.user.sessionId' );
+                       if ( sessionId === undefined || sessionId === null ) {
+                               sessionId = user.generateRandomSessionId();
+                               $.cookie( 'mediaWiki.user.sessionId', sessionId, { expires: null, path: '/' } );
+                       }
+                       return sessionId;
+               },
+
+               /**
+                * Get the current user's name or the session ID
+                *
+                * Not to be confused with #getId.
+                *
+                * @return {string} User name or random session ID
+                */
+               id: function () {
+                       return user.getName() || user.sessionId();
+               },
+
+               /**
+                * Get the user's bucket (place them in one if not done already)
+                *
+                *     mw.user.bucket( 'test', {
+                *         buckets: { ignored: 50, control: 25, test: 25 },
+                *         version: 1,
+                *         expires: 7
+                *     } );
+                *
+                * @deprecated since 1.23
+                * @param {string} key Name of bucket
+                * @param {Object} options Bucket configuration options
+                * @param {Object} options.buckets List of bucket-name/relative-probability pairs (required,
+                *  must have at least one pair)
+                * @param {number} [options.version=0] Version of bucket test, changing this forces
+                *  rebucketing
+                * @param {number} [options.expires=30] Length of time (in days) until the user gets
+                *  rebucketed
+                * @return {string} Bucket name - the randomly chosen key of the `options.buckets` object
+                */
+               bucket: function ( key, options ) {
+                       var cookie, parts, version, bucket,
+                               range, k, rand, total;
+
+                       options = $.extend( {
+                               buckets: {},
+                               version: 0,
+                               expires: 30
+                       }, options || {} );
+
+                       cookie = $.cookie( 'mediaWiki.user.bucket:' + key );
+
+                       // Bucket information is stored as 2 integers, together as version:bucket like: "1:2"
+                       if ( typeof cookie === 'string' && cookie.length > 2 && cookie.indexOf( ':' ) !== -1 ) {
+                               parts = cookie.split( ':' );
+                               if ( parts.length > 1 && Number( parts[0] ) === options.version ) {
+                                       version = Number( parts[0] );
+                                       bucket = String( parts[1] );
+                               }
+                       }
+
+                       if ( bucket === undefined ) {
+                               if ( !$.isPlainObject( options.buckets ) ) {
+                                       throw new Error( 'Invalid bucket. Object expected for options.buckets.' );
+                               }
+
+                               version = Number( options.version );
+
+                               // Find range
+                               range = 0;
+                               for ( k in options.buckets ) {
+                                       range += options.buckets[k];
+                               }
+
+                               // Select random value within range
+                               rand = Math.random() * range;
+
+                               // Determine which bucket the value landed in
+                               total = 0;
+                               for ( k in options.buckets ) {
+                                       bucket = k;
+                                       total += options.buckets[k];
+                                       if ( total >= rand ) {
+                                               break;
+                                       }
+                               }
+
+                               $.cookie(
+                                       'mediaWiki.user.bucket:' + key,
+                                       version + ':' + bucket,
+                                       { path: '/', expires: Number( options.expires ) }
+                               );
+                       }
+
+                       return bucket;
+               },
+
+               /**
+                * Get the current user's groups
+                *
+                * @param {Function} [callback]
+                * @return {jQuery.Promise}
+                */
+               getGroups: function ( callback ) {
+                       return getUserInfo( 'groups', callback );
+               },
+
+               /**
+                * Get the current user's rights
+                *
+                * @param {Function} [callback]
+                * @return {jQuery.Promise}
+                */
+               getRights: function ( callback ) {
+                       return getUserInfo( 'rights', callback );
+               }
+       };
+
+}( mediaWiki, jQuery ) );
diff --git a/resources/src/mediawiki/mediawiki.util.js b/resources/src/mediawiki/mediawiki.util.js
new file mode 100644 (file)
index 0000000..2234238
--- /dev/null
@@ -0,0 +1,601 @@
+( function ( mw, $ ) {
+       'use strict';
+
+       /**
+        * Utility library
+        * @class mw.util
+        * @singleton
+        */
+       var util = {
+
+               /**
+                * Initialisation
+                * (don't call before document ready)
+                */
+               init: function () {
+                       /* Fill $content var */
+                       util.$content = ( function () {
+                               var i, l, $content, selectors;
+                               selectors = [
+                                       // The preferred standard for setting $content (class="mw-body")
+                                       // You may also use (class="mw-body mw-body-primary") if you use
+                                       // mw-body in multiple locations.
+                                       // Or class="mw-body-primary" if you want $content to be deeper
+                                       // in the dom than mw-body
+                                       '.mw-body-primary',
+                                       '.mw-body',
+
+                                       /* Legacy fallbacks for setting the content */
+                                       // Vector, Monobook, Chick, etc... based skins
+                                       '#bodyContent',
+
+                                       // Modern based skins
+                                       '#mw_contentholder',
+
+                                       // Standard, CologneBlue
+                                       '#article',
+
+                                       // #content is present on almost all if not all skins. Most skins (the above cases)
+                                       // have #content too, but as an outer wrapper instead of the article text container.
+                                       // The skins that don't have an outer wrapper do have #content for everything
+                                       // so it's a good fallback
+                                       '#content',
+
+                                       // If nothing better is found fall back to our bodytext div that is guaranteed to be here
+                                       '#mw-content-text',
+
+                                       // Should never happen... well, it could if someone is not finished writing a skin and has
+                                       // not inserted bodytext yet. But in any case <body> should always exist
+                                       'body'
+                               ];
+                               for ( i = 0, l = selectors.length; i < l; i++ ) {
+                                       $content = $( selectors[i] ).first();
+                                       if ( $content.length ) {
+                                               return $content;
+                                       }
+                               }
+
+                               // Make sure we don't unset util.$content if it was preset and we don't find anything
+                               return util.$content;
+                       } )();
+               },
+
+               /* Main body */
+
+               /**
+                * Encode the string like PHP's rawurlencode
+                *
+                * @param {string} str String to be encoded.
+                */
+               rawurlencode: function ( str ) {
+                       str = String( str );
+                       return encodeURIComponent( str )
+                               .replace( /!/g, '%21' ).replace( /'/g, '%27' ).replace( /\(/g, '%28' )
+                               .replace( /\)/g, '%29' ).replace( /\*/g, '%2A' ).replace( /~/g, '%7E' );
+               },
+
+               /**
+                * Encode page titles 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 util.rawurlencode( str )
+                               .replace( /%20/g, '_' ).replace( /%3A/g, ':' ).replace( /%2F/g, '/' );
+               },
+
+               /**
+                * Get the link to a page name (relative to `wgServer`),
+                *
+                * @param {string} str Page name
+                * @param {Object} [params] A mapping of query parameter names to values,
+                *  e.g. `{ action: 'edit' }`
+                * @return {string} Url of the page with name of `str`
+                */
+               getUrl: function ( str, params ) {
+                       var url = mw.config.get( 'wgArticlePath' ).replace(
+                               '$1',
+                               util.wikiUrlencode( typeof str === 'string' ? str : mw.config.get( 'wgPageName' ) )
+                       );
+
+                       if ( params && !$.isEmptyObject( params ) ) {
+                               url += ( url.indexOf( '?' ) !== -1 ? '&' : '?' ) + $.param( params );
+                       }
+
+                       return url;
+               },
+
+               /**
+                * Get address to a script in the wiki root.
+                * For index.php use `mw.config.get( 'wgScript' )`.
+                *
+                * @since 1.18
+                * @param str string Name of script (eg. 'api'), defaults to 'index'
+                * @return string Address to script (eg. '/w/api.php' )
+                */
+               wikiScript: function ( str ) {
+                       str = str || 'index';
+                       if ( str === 'index' ) {
+                               return mw.config.get( 'wgScript' );
+                       } else if ( str === 'load' ) {
+                               return mw.config.get( 'wgLoadScript' );
+                       } else {
+                               return mw.config.get( 'wgScriptPath' ) + '/' + str +
+                                       mw.config.get( 'wgScriptExtension' );
+                       }
+               },
+
+               /**
+                * Append a new style block to the head and return the CSSStyleSheet object.
+                * Use .ownerNode to access the `<style>` element, or use mw.loader#addStyleTag.
+                * This function returns the styleSheet object for convience (due to cross-browsers
+                * difference as to where it is located).
+                *
+                *     var sheet = mw.util.addCSS( '.foobar { display: none; }' );
+                *     $( foo ).click( function () {
+                *         // Toggle the sheet on and off
+                *         sheet.disabled = !sheet.disabled;
+                *     } );
+                *
+                * @param {string} text CSS to be appended
+                * @return {CSSStyleSheet} Use .ownerNode to get to the `<style>` element.
+                */
+               addCSS: function ( text ) {
+                       var s = mw.loader.addStyleTag( text );
+                       return s.sheet || s.styleSheet || s;
+               },
+
+               /**
+                * Hide/show the table of contents element
+                *
+                * @param {jQuery} $toggleLink A jQuery object of the toggle link.
+                * @param {Function} [callback] Function to be called after the toggle is
+                *  completed (including the animation).
+                * @return {Mixed} Boolean visibility of the toc (true if it's visible)
+                * or Null if there was no table of contents.
+                * @deprecated since 1.23 Use jQuery
+                */
+               toggleToc: function ( $toggleLink, callback ) {
+                       var ret, $tocList = $( '#toc ul:first' );
+
+                       // This function shouldn't be called if there's no TOC,
+                       // but just in case...
+                       if ( !$tocList.length ) {
+                               return null;
+                       }
+                       ret = $tocList.is( ':hidden' );
+                       $toggleLink.click();
+                       $tocList.promise().done( callback );
+                       return ret;
+               },
+
+               /**
+                * Grab the URL parameter value for the given parameter.
+                * Returns null if not found.
+                *
+                * @param {string} param The parameter name.
+                * @param {string} [url=document.location.href] URL to search through, defaulting to the current document's URL.
+                * @return {Mixed} Parameter value or null.
+                */
+               getParamValue: function ( param, url ) {
+                       if ( url === undefined ) {
+                               url = document.location.href;
+                       }
+                       // Get last match, stop at hash
+                       var     re = new RegExp( '^[^#]*[&?]' + $.escapeRE( param ) + '=([^&#]*)' ),
+                               m = re.exec( url );
+                       if ( m ) {
+                               // Beware that decodeURIComponent is not required to understand '+'
+                               // by spec, as encodeURIComponent does not produce it.
+                               return decodeURIComponent( m[1].replace( /\+/g, '%20' ) );
+                       }
+                       return null;
+               },
+
+               /**
+                * @property {string}
+                * Access key prefix.
+                */
+               tooltipAccessKeyPrefix: ( function () {
+                       var profile = $.client.profile();
+
+                       // Opera on any platform
+                       if ( profile.name === 'opera' ) {
+                               return 'shift-esc-';
+                       }
+
+                       // Chrome on any platform
+                       if ( profile.name === 'chrome' ) {
+                               if ( profile.platform === 'mac' ) {
+                                       // Chrome on Mac
+                                       return 'ctrl-option-';
+                               }
+                               // Chrome on Windows or Linux
+                               // (both alt- and alt-shift work, but alt with E, D, F etc does not
+                               // work since they are browser shortcuts)
+                               return 'alt-shift-';
+                       }
+
+                       // Non-Windows Safari with webkit_version > 526
+                       if ( profile.platform !== 'win'
+                               && profile.name === 'safari'
+                               && profile.layoutVersion > 526
+                       ) {
+                               return 'ctrl-alt-';
+                       }
+
+                       // Firefox 14+ on Mac
+                       if ( profile.platform === 'mac'
+                               && profile.name === 'firefox'
+                               && profile.versionNumber >= 14
+                       ) {
+                               return 'ctrl-option-';
+                       }
+
+                       // Safari/Konqueror on any platform, or any browser on Mac
+                       // (but not Safari on Windows)
+                       if ( !( profile.platform === 'win' && profile.name === 'safari' )
+                               && ( profile.name === 'safari'
+                               || profile.platform === 'mac'
+                               || profile.name === 'konqueror' )
+                       ) {
+                               return 'ctrl-';
+                       }
+
+                       // Firefox/Iceweasel 2.x and later
+                       if ( ( profile.name === 'firefox' || profile.name === 'iceweasel' )
+                               && profile.versionBase > '1' ) {
+                               return 'alt-shift-';
+                       }
+
+                       return 'alt-';
+               } )(),
+
+               /**
+                * @property {RegExp}
+                * Regex to match accesskey tooltips.
+                *
+                * Should match:
+                *
+                * - "ctrl-option-"
+                * - "alt-shift-"
+                * - "ctrl-alt-"
+                * - "ctrl-"
+                *
+                * The accesskey is matched in group $6.
+                */
+               tooltipAccessKeyRegexp: /\[(ctrl-)?(option-)?(alt-)?(shift-)?(esc-)?(.)\]$/,
+
+               /**
+                * Add the appropriate prefix to the accesskey shown in the tooltip.
+                *
+                * If the `$nodes` parameter is given, only those nodes are updated;
+                * otherwise, depending on browser support, we update either all elements
+                * with accesskeys on the page or a bunch of elements which are likely to
+                * have them on core skins.
+                *
+                * @param {Array|jQuery} [$nodes] A jQuery object, or array of nodes to update.
+                */
+               updateTooltipAccessKeys: function ( $nodes ) {
+                       if ( !$nodes ) {
+                               if ( document.querySelectorAll ) {
+                                       // If we're running on a browser where we can do this efficiently,
+                                       // just find all elements that have accesskeys. We can't use jQuery's
+                                       // polyfill for the selector since looping over all elements on page
+                                       // load might be too slow.
+                                       $nodes = $( document.querySelectorAll( '[accesskey]' ) );
+                               } else {
+                                       // Otherwise go through some elements likely to have accesskeys rather
+                                       // than looping over all of them. Unfortunately this will not fully
+                                       // work for custom skins with different HTML structures. Input, label
+                                       // and button should be rare enough that no optimizations are needed.
+                                       $nodes = $( '#column-one a, #mw-head a, #mw-panel a, #p-logo a, input, label, button' );
+                               }
+                       } else if ( !( $nodes instanceof $ ) ) {
+                               $nodes = $( $nodes );
+                       }
+
+                       $nodes.attr( 'title', function ( i, val ) {
+                               if ( val && util.tooltipAccessKeyRegexp.test( val ) ) {
+                                       return val.replace( util.tooltipAccessKeyRegexp,
+                                               '[' + util.tooltipAccessKeyPrefix + '$6]' );
+                               }
+                               return val;
+                       } );
+               },
+
+               /*
+                * @property {jQuery}
+                * A jQuery object that refers to the content area 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, the others are optional and
+                * may be null. 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
+                * (e.g. `document.getElementById( 'foobar' )`) or a jQuery-selector
+                * (e.g. `'#foobar'`) for that item.
+                *
+                *     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
+                * @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] Access key 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 {HTMLElement|jQuery|string} [nextnode] Element or jQuery-selector string to the item that
+                *  the new item should be added before, should be another item in the same
+                *  list, it will be ignored otherwise
+                *
+                * @return {HTMLElement|null} The added element (a ListItem or Anchor element,
+                * depending on the skin) or null if no element was added to the document.
+                */
+               addPortletLink: function ( portlet, href, text, id, tooltip, accesskey, nextnode ) {
+                       var $item, $link, $portlet, $ul;
+
+                       // Check if there's atleast 3 arguments to prevent a TypeError
+                       if ( arguments.length < 3 ) {
+                               return null;
+                       }
+                       // Setup the anchor tag
+                       $link = $( '<a>' ).attr( 'href', href ).text( text );
+                       if ( tooltip ) {
+                               $link.attr( 'title', tooltip );
+                       }
+
+                       // Select the specified portlet
+                       $portlet = $( '#' + portlet );
+                       if ( $portlet.length === 0 ) {
+                               return null;
+                       }
+                       // Select the first (most likely only) unordered list inside the portlet
+                       $ul = $portlet.find( 'ul' ).eq( 0 );
+
+                       // If it didn't have an unordered list yet, create it
+                       if ( $ul.length === 0 ) {
+
+                               $ul = $( '<ul>' );
+
+                               // If there's no <div> inside, append it to the portlet directly
+                               if ( $portlet.find( 'div:first' ).length === 0 ) {
+                                       $portlet.append( $ul );
+                               } else {
+                                       // otherwise if there's a div (such as div.body or div.pBody)
+                                       // append the <ul> to last (most likely only) div
+                                       $portlet.find( 'div' ).eq( -1 ).append( $ul );
+                               }
+                       }
+                       // Just in case..
+                       if ( $ul.length === 0 ) {
+                               return null;
+                       }
+
+                       // Unhide portlet if it was hidden before
+                       $portlet.removeClass( 'emptyPortlet' );
+
+                       // Wrap the anchor tag in a list item (and a span if $portlet is a Vector tab)
+                       // and back up the selector to the list item
+                       if ( $portlet.hasClass( 'vectorTabs' ) ) {
+                               $item = $link.wrap( '<li><span></span></li>' ).parent().parent();
+                       } else {
+                               $item = $link.wrap( '<li></li>' ).parent();
+                       }
+
+                       // Implement the properties passed to the function
+                       if ( id ) {
+                               $item.attr( 'id', id );
+                       }
+
+                       if ( tooltip ) {
+                               // Trim any existing accesskey hint and the trailing space
+                               tooltip = $.trim( tooltip.replace( util.tooltipAccessKeyRegexp, '' ) );
+                               if ( accesskey ) {
+                                       tooltip += ' [' + accesskey + ']';
+                               }
+                               $link.attr( 'title', tooltip );
+                               if ( accesskey ) {
+                                       util.updateTooltipAccessKeys( $link );
+                               }
+                       }
+
+                       if ( accesskey ) {
+                               $link.attr( 'accesskey', accesskey );
+                       }
+
+                       if ( nextnode ) {
+                               if ( nextnode.nodeType || typeof nextnode === 'string' ) {
+                                       // nextnode is a DOM element (was the only option before MW 1.17, in wikibits.js)
+                                       // or nextnode is a CSS selector for jQuery
+                                       nextnode = $ul.find( nextnode );
+                               } else if ( !nextnode.jquery || ( nextnode.length && nextnode[0].parentNode !== $ul[0] ) ) {
+                                       // Fallback
+                                       $ul.append( $item );
+                                       return $item[0];
+                               }
+                               if ( nextnode.length === 1 ) {
+                                       // nextnode is a jQuery object that represents exactly one element
+                                       nextnode.before( $item );
+                                       return $item[0];
+                               }
+                       }
+
+                       // Fallback (this is the default behavior)
+                       $ul.append( $item );
+                       return $item[0];
+
+               },
+
+               /**
+                * Add a little box at the top of the screen to inform the user of
+                * something, replacing any previous message.
+                * Calling with no arguments, with an empty string or null will hide the message
+                *
+                * @param {Mixed} message The DOM-element, jQuery object or HTML-string to be put inside the message box.
+                * to allow CSS/JS to hide different boxes. null = no class used.
+                * @deprecated since 1.20 Use mw#notify
+                */
+               jsMessage: function ( message ) {
+                       if ( !arguments.length || message === '' || message === null ) {
+                               return true;
+                       }
+                       if ( typeof message !== 'object' ) {
+                               message = $.parseHTML( message );
+                       }
+                       mw.notify( message, { autoHide: true, tag: 'legacy' } );
+                       return true;
+               },
+
+               /**
+                * Validate a string as representing a valid e-mail address
+                * according to HTML5 specification. Please note the specification
+                * does not validate a domain with one character.
+                *
+                * FIXME: should be moved to or replaced by a validation module.
+                *
+                * @param {string} mailtxt E-mail address to be validated.
+                * @return {boolean|null} Null if `mailtxt` was an empty string, otherwise true/false
+                * as determined by validation.
+                */
+               validateEmail: function ( mailtxt ) {
+                       var rfc5322Atext, rfc1034LdhStr, html5EmailRegexp;
+
+                       if ( mailtxt === '' ) {
+                               return null;
+                       }
+
+                       // HTML5 defines a string as valid e-mail address if it matches
+                       // the ABNF:
+                       //      1 * ( atext / "." ) "@" ldh-str 1*( "." ldh-str )
+                       // With:
+                       // - atext   : defined in RFC 5322 section 3.2.3
+                       // - ldh-str : defined in RFC 1034 section 3.5
+                       //
+                       // (see STD 68 / RFC 5234 http://tools.ietf.org/html/std68)
+                       // First, define the RFC 5322 'atext' which is pretty easy:
+                       // atext = ALPHA / DIGIT / ; Printable US-ASCII
+                       //     "!" / "#" /    ; characters not including
+                       //     "$" / "%" /    ; specials. Used for atoms.
+                       //     "&" / "'" /
+                       //     "*" / "+" /
+                       //     "-" / "/" /
+                       //     "=" / "?" /
+                       //     "^" / "_" /
+                       //     "`" / "{" /
+                       //     "|" / "}" /
+                       //     "~"
+                       rfc5322Atext = 'a-z0-9!#$%&\'*+\\-/=?^_`{|}~';
+
+                       // Next define the RFC 1034 'ldh-str'
+                       //      <domain> ::= <subdomain> | " "
+                       //      <subdomain> ::= <label> | <subdomain> "." <label>
+                       //      <label> ::= <letter> [ [ <ldh-str> ] <let-dig> ]
+                       //      <ldh-str> ::= <let-dig-hyp> | <let-dig-hyp> <ldh-str>
+                       //      <let-dig-hyp> ::= <let-dig> | "-"
+                       //      <let-dig> ::= <letter> | <digit>
+                       rfc1034LdhStr = 'a-z0-9\\-';
+
+                       html5EmailRegexp = new RegExp(
+                               // start of string
+                               '^'
+                               +
+                               // User part which is liberal :p
+                               '[' + rfc5322Atext + '\\.]+'
+                               +
+                               // 'at'
+                               '@'
+                               +
+                               // Domain first part
+                               '[' + rfc1034LdhStr + ']+'
+                               +
+                               // Optional second part and following are separated by a dot
+                               '(?:\\.[' + rfc1034LdhStr + ']+)*'
+                               +
+                               // End of string
+                               '$',
+                               // RegExp is case insensitive
+                               'i'
+                       );
+                       return ( null !== mailtxt.match( html5EmailRegexp ) );
+               },
+
+               /**
+                * Note: borrows from IP::isIPv4
+                *
+                * @param {string} address
+                * @param {boolean} allowBlock
+                * @return {boolean}
+                */
+               isIPv4Address: function ( address, allowBlock ) {
+                       if ( typeof address !== 'string' ) {
+                               return false;
+                       }
+
+                       var     block = allowBlock ? '(?:\\/(?:3[0-2]|[12]?\\d))?' : '',
+                               RE_IP_BYTE = '(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|0?[0-9]?[0-9])',
+                               RE_IP_ADD = '(?:' + RE_IP_BYTE + '\\.){3}' + RE_IP_BYTE;
+
+                       return address.search( new RegExp( '^' + RE_IP_ADD + block + '$' ) ) !== -1;
+               },
+
+               /**
+                * Note: borrows from IP::isIPv6
+                *
+                * @param {string} address
+                * @param {boolean} allowBlock
+                * @return {boolean}
+                */
+               isIPv6Address: function ( address, allowBlock ) {
+                       if ( typeof address !== 'string' ) {
+                               return false;
+                       }
+
+                       var     block = allowBlock ? '(?:\\/(?:12[0-8]|1[01][0-9]|[1-9]?\\d))?' : '',
+                               RE_IPV6_ADD =
+                       '(?:' + // starts with "::" (including "::")
+                       ':(?::|(?::' + '[0-9A-Fa-f]{1,4}' + '){1,7})' +
+                       '|' + // ends with "::" (except "::")
+                       '[0-9A-Fa-f]{1,4}' + '(?::' + '[0-9A-Fa-f]{1,4}' + '){0,6}::' +
+                       '|' + // contains no "::"
+                       '[0-9A-Fa-f]{1,4}' + '(?::' + '[0-9A-Fa-f]{1,4}' + '){7}' +
+                       ')';
+
+                       if ( address.search( new RegExp( '^' + RE_IPV6_ADD + block + '$' ) ) !== -1 ) {
+                               return true;
+                       }
+
+                       RE_IPV6_ADD = // contains one "::" in the middle (single '::' check below)
+                               '[0-9A-Fa-f]{1,4}' + '(?:::?' + '[0-9A-Fa-f]{1,4}' + '){1,6}';
+
+                       return address.search( new RegExp( '^' + RE_IPV6_ADD + block + '$' ) ) !== -1
+                               && address.search( /::/ ) !== -1 && address.search( /::.*::/ ) === -1;
+               }
+       };
+
+       /**
+        * @method wikiGetlink
+        * @inheritdoc #getUrl
+        * @deprecated since 1.23 Use #getUrl instead.
+        */
+       mw.log.deprecate( util, 'wikiGetlink', util.getUrl, 'Use mw.util.getUrl instead.' );
+
+       mw.util = util;
+
+}( mediaWiki, jQuery ) );
diff --git a/resources/src/startup.js b/resources/src/startup.js
new file mode 100644 (file)
index 0000000..cd21ecc
--- /dev/null
@@ -0,0 +1,54 @@
+/**
+ * This script provides a function which is run to evaluate whether or not to
+ * continue loading jQuery and the MediaWiki modules. This code should work on
+ * even the most ancient of browsers, so be very careful when editing.
+ */
+
+var mediaWikiLoadStart = ( new Date() ).getTime();
+
+/**
+ * Returns false when run in a black-listed browser
+ *
+ * This function will be deleted after it's used, so do not expand it to be
+ * generally useful beyond startup.
+ *
+ * See also:
+ * - https://www.mediawiki.org/wiki/Compatibility#Browser
+ * - http://jquerymobile.com/gbs/
+ * - http://jquery.com/browser-support/
+ */
+
+/*jshint unused: false */
+function isCompatible( ua ) {
+       if ( ua === undefined ) {
+               ua = navigator.userAgent;
+       }
+
+       // MediaWiki JS or jQuery is known to have issues with:
+       return !(
+               // Internet Explorer < 6
+               ( ua.indexOf( 'MSIE' ) !== -1 && parseFloat( ua.split( 'MSIE' )[1] ) < 6 ) ||
+               // Firefox < 3
+               ( ua.indexOf( 'Firefox/' ) !== -1 && parseFloat( ua.split( 'Firefox/' )[1] ) < 3 ) ||
+               // BlackBerry < 6
+               ua.match( /BlackBerry[^\/]*\/[1-5]\./ ) ||
+               // Open WebOS < 1.5
+               ua.match( /webOS\/1\.[0-4]/ ) ||
+               // Anything PlayStation based.
+               ua.match( /PlayStation/i ) ||
+               // Any Symbian based browsers
+               ua.match( /SymbianOS|Series60/ ) ||
+               // Any NetFront based browser
+               ua.match( /NetFront/ ) ||
+               // Opera Mini, all versions
+               ua.match( /Opera Mini/ ) ||
+               // Nokia's Ovi Browser
+               ua.match( /S40OviBrowser/ ) ||
+               // Google Glass browser groks JS but UI is too limited
+               ( ua.match( /Glass/ ) && ua.match( /Android/ ) )
+       );
+}
+
+/**
+ * The startUp() function will be auto-generated and added below.
+ */
diff --git a/resources/startup.js b/resources/startup.js
deleted file mode 100644 (file)
index cd21ecc..0000000
+++ /dev/null
@@ -1,54 +0,0 @@
-/**
- * This script provides a function which is run to evaluate whether or not to
- * continue loading jQuery and the MediaWiki modules. This code should work on
- * even the most ancient of browsers, so be very careful when editing.
- */
-
-var mediaWikiLoadStart = ( new Date() ).getTime();
-
-/**
- * Returns false when run in a black-listed browser
- *
- * This function will be deleted after it's used, so do not expand it to be
- * generally useful beyond startup.
- *
- * See also:
- * - https://www.mediawiki.org/wiki/Compatibility#Browser
- * - http://jquerymobile.com/gbs/
- * - http://jquery.com/browser-support/
- */
-
-/*jshint unused: false */
-function isCompatible( ua ) {
-       if ( ua === undefined ) {
-               ua = navigator.userAgent;
-       }
-
-       // MediaWiki JS or jQuery is known to have issues with:
-       return !(
-               // Internet Explorer < 6
-               ( ua.indexOf( 'MSIE' ) !== -1 && parseFloat( ua.split( 'MSIE' )[1] ) < 6 ) ||
-               // Firefox < 3
-               ( ua.indexOf( 'Firefox/' ) !== -1 && parseFloat( ua.split( 'Firefox/' )[1] ) < 3 ) ||
-               // BlackBerry < 6
-               ua.match( /BlackBerry[^\/]*\/[1-5]\./ ) ||
-               // Open WebOS < 1.5
-               ua.match( /webOS\/1\.[0-4]/ ) ||
-               // Anything PlayStation based.
-               ua.match( /PlayStation/i ) ||
-               // Any Symbian based browsers
-               ua.match( /SymbianOS|Series60/ ) ||
-               // Any NetFront based browser
-               ua.match( /NetFront/ ) ||
-               // Opera Mini, all versions
-               ua.match( /Opera Mini/ ) ||
-               // Nokia's Ovi Browser
-               ua.match( /S40OviBrowser/ ) ||
-               // Google Glass browser groks JS but UI is too limited
-               ( ua.match( /Glass/ ) && ua.match( /Android/ ) )
-       );
-}
-
-/**
- * The startUp() function will be auto-generated and added below.
- */
diff --git a/resources/styleguide-template/index.html b/resources/styleguide-template/index.html
deleted file mode 100644 (file)
index 99f3e4f..0000000
+++ /dev/null
@@ -1,60 +0,0 @@
-<!DOCTYPE html>
-<html class="no-js" lang="en">
-<head>
-       <meta charset="utf-8">
-       <title>MediaWiki Living Styleguide</title>
-       <meta name="description" content="">
-       <meta name="generator" content="kss-node" />
-       <meta name="viewport" content="width=device-width">
-       <link rel="stylesheet" href="public/kss.css">
-       <link rel="stylesheet" href="public/style.css">
-</head>
-<body><div id="kss-wrapper">
-       <header id="kss-header">
-               <hgroup><h1>MediaWiki Living Styleguide</h1></hgroup>
-       </header>
-       <nav class="content">
-               <ul>
-               <li><a href="index.html">0.0: Overview</a></li>
-               {{#eachRoot}}
-               <li>
-                       <a href="section-{{reference}}.html">{{reference}}.0: {{header}}</a>
-               </li>
-               {{/eachRoot}}
-               </ul>
-       </nav>
-       <article>
-               {{#if overview}}
-                       {{html overview}}
-               {{else}}
-                       {{#eachSection rootNumber}}
-                               {{#whenDepth 1}}
-                                       <h1>{{ reference }}.0 - {{ header }}</h1>
-                               {{else}}
-                                       {{#whenDepth 2}}
-                                       <h2>{{ reference }} - {{ header }}</h2>
-                                       {{/whenDepth}}
-                                       {{#whenDepth 3}}
-                                       <h3>{{ reference }} - {{ header }}</h3>
-                                       {{/whenDepth}}
-                               {{/whenDepth}}
-                               {{#ifAny markup modifiers}}
-                                               <div>{{html description}}</div>
-                                               <strong>Default styling</strong><br>
-                                               {{modifierMarkup}}
-                                               {{#eachModifier}}
-                                               {{html description}}<br>
-                                               <p>{{name}}</p>
-                                               {{modifierMarkup}}
-                                               {{/eachModifier}}
-                                               <pre class="prettyprint lang-html">{{markup}}</pre>
-                               {{else}}
-                                               {{#if description}}
-                                                       {{html description}}
-                                               {{/if}}
-                               {{/ifAny}}
-                       {{/eachSection}}
-               {{/if}}
-       </article>
-</div></body>
-</html>
diff --git a/resources/styleguide-template/public/kss.less b/resources/styleguide-template/public/kss.less
deleted file mode 100644 (file)
index 431303d..0000000
+++ /dev/null
@@ -1,24 +0,0 @@
-header {
-       padding: .8em 16px 0;
-}
-
-nav {
-       float: left;
-       width: 200px;
-}
-
-article {
-       margin-left: 250px;
-}
-
-.content.kss-no-margin {
-       margin: 0;
-}
-
-// FIXME: Remove when typography module in mediawiki-ui
-body {
-       font-family: "Nimbus Sans L", "Liberation Sans", "Helvetica Neue", "Helvetica", "Arial", sans-serif;
-}
-h1,h2,h3,h4,h5 {
-       font-family: "DejaVu Serif", Georgia, serif;
-}
diff --git a/resources/styleguide-template/public/less.js b/resources/styleguide-template/public/less.js
deleted file mode 100644 (file)
index 89b7637..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-//
-// LESS - Leaner CSS v1.2.1
-// http://lesscss.org
-// 
-// Copyright (c) 2009-2011, Alexis Sellier
-// Licensed under the Apache 2.0 License.
-//
-(function(a,b){function c(b){return a.less[b.split("/")[1]]}function m(){var a=document.getElementsByTagName("style");for(var b=0;b<a.length;b++)a[b].type.match(k)&&(new d.Parser).parse(a[b].innerHTML||"",function(c,d){var e=d.toCSS(),f=a[b];f.type="text/css",f.styleSheet?f.styleSheet.cssText=e:f.innerHTML=e})}function n(a,b){for(var c=0;c<d.sheets.length;c++)o(d.sheets[c],a,b,d.sheets.length-(c+1))}function o(b,c,e,f){var g=a.location.href.replace(/[#?].*$/,""),i=b.href.replace(/\?.*$/,""),j=h&&h.getItem(i),k=h&&h.getItem(i+":timestamp"),l={css:j,timestamp:k};/^(https?|file):/.test(i)||(i.charAt(0)=="/"?i=a.location.protocol+"//"+a.location.host+i:i=g.slice(0,g.lastIndexOf("/")+1)+i);var m=i.match(/([^\/]+)$/)[1];s(b.href,b.type,function(a,g){if(!e&&l&&g&&(new Date(g)).valueOf()===(new Date(l.timestamp)).valueOf())r(l.css,b),c(null,b,{local:!0,remaining:f});else try{(new d.Parser({optimization:d.optimization,paths:[i.replace(/[\w\.-]+$/,"")],mime:b.type,filename:m})).parse(a,function(d,e){if(d)return w(d,i);try{c(d,e,a,b,{local:!1,lastModified:g,remaining:f}),u(document.getElementById("less-error-message:"+q(i)))}catch(d){w(d,i)}})}catch(h){w(h,i)}},function(a,b){throw new Error("Couldn't load "+b+" ("+a+")")})}function q(a){return a.replace(/^[a-z]+:\/\/?[^\/]+/,"").replace(/^\//,"").replace(/\?.*$/,"").replace(/\.[^\.\/]+$/,"").replace(/[^\.\w-]+/g,"-").replace(/\./g,":")}function r(a,b,c){var d,e=b.href?b.href.replace(/\?.*$/,""):"",f="less:"+(b.title||q(e));(d=document.getElementById(f))===null&&(d=document.createElement("style"),d.type="text/css",d.media=b.media||"screen",d.id=f,document.getElementsByTagName("head")[0].appendChild(d));if(d.styleSheet)try{d.styleSheet.cssText=a}catch(g){throw new Error("Couldn't reassign styleSheet.cssText.")}else(function(a){d.childNodes.length>0?d.firstChild.nodeValue!==a.nodeValue&&d.replaceChild(a,d.firstChild):d.appendChild(a)})(document.createTextNode(a));c&&h&&(v("saving "+e+" to cache."),h.setItem(e,a),h.setItem(e+":timestamp",c))}function s(a,b,c,e){function i(b,c,d){b.status>=200&&b.status<300?c(b.responseText,b.getResponseHeader("Last-Modified")):typeof d=="function"&&d(b.status,a)}var f=t(),h=g?!1:d.async;typeof f.overrideMimeType=="function"&&f.overrideMimeType("text/css"),f.open("GET",a,h),f.setRequestHeader("Accept",b||"text/x-less, text/css; q=0.9, */*; q=0.5"),f.send(null),g?f.status===0||f.status>=200&&f.status<300?c(f.responseText):e(f.status,a):h?f.onreadystatechange=function(){f.readyState==4&&i(f,c,e)}:i(f,c,e)}function t(){if(a.XMLHttpRequest)return new XMLHttpRequest;try{return new ActiveXObject("MSXML2.XMLHTTP.3.0")}catch(b){return v("browser doesn't support AJAX."),null}}function u(a){return a&&a.parentNode.removeChild(a)}function v(a){d.env=="development"&&typeof console!="undefined"&&console.log("less: "+a)}function w(a,b){var c="less-error-message:"+q(b),e='<li><label>{line}</label><pre class="{class}">{content}</pre></li>',f=document.createElement("div"),g,h,i=[],j=a.filename||b;f.id=c,f.className="less-error-message",h="<h3>"+(a.message||"There is an error in your .less file")+"</h3>"+'<p>in <a href="'+j+'">'+j+"</a> ";var k=function(a,b,c){a.extract[b]&&i.push(e.replace(/\{line\}/,parseInt(a.line)+(b-1)).replace(/\{class\}/,c).replace(/\{content\}/,a.extract[b]))};a.stack?h+="<br/>"+a.stack.split("\n").slice(1).join("<br/>"):a.extract&&(k(a,0,""),k(a,1,"line"),k(a,2,""),h+="on line "+a.line+", column "+(a.column+1)+":</p>"+"<ul>"+i.join("")+"</ul>"),f.innerHTML=h,r([".less-error-message ul, .less-error-message li {","list-style-type: none;","margin-right: 15px;","padding: 4px 0;","margin: 0;","}",".less-error-message label {","font-size: 12px;","margin-right: 15px;","padding: 4px 0;","color: #cc7777;","}",".less-error-message pre {","color: #dd6666;","padding: 4px 0;","margin: 0;","display: inline-block;","}",".less-error-message pre.line {","color: #ff0000;","}",".less-error-message h3 {","font-size: 20px;","font-weight: bold;","padding: 15px 0 5px 0;","margin: 0;","}",".less-error-message a {","color: #10a","}",".less-error-message .error {","color: red;","font-weight: bold;","padding-bottom: 2px;","border-bottom: 1px dashed red;","}"].join("\n"),{title:"error-message"}),f.style.cssText=["font-family: Arial, sans-serif","border: 1px solid #e00","background-color: #eee","border-radius: 5px","-webkit-border-radius: 5px","-moz-border-radius: 5px","color: #e00","padding: 15px","margin-bottom: 15px"].join(";"),d.env=="development"&&(g=setInterval(function(){document.body&&(document.getElementById(c)?document.body.replaceChild(f,document.getElementById(c)):document.body.insertBefore(f,document.body.firstChild),clearInterval(g))},10))}Array.isArray||(Array.isArray=function(a){return Object.prototype.toString.call(a)==="[object Array]"||a instanceof Array}),Array.prototype.forEach||(Array.prototype.forEach=function(a,b){var c=this.length>>>0;for(var d=0;d<c;d++)d in this&&a.call(b,this[d],d,this)}),Array.prototype.map||(Array.prototype.map=function(a){var b=this.length>>>0,c=new Array(b),d=arguments[1];for(var e=0;e<b;e++)e in this&&(c[e]=a.call(d,this[e],e,this));return c}),Array.prototype.filter||(Array.prototype.filter=function(a){var b=[],c=arguments[1];for(var d=0;d<this.length;d++)a.call(c,this[d])&&b.push(this[d]);return b}),Array.prototype.reduce||(Array.prototype.reduce=function(a){var b=this.length>>>0,c=0;if(b===0&&arguments.length===1)throw new TypeError;if(arguments.length>=2)var d=arguments[1];else do{if(c in this){d=this[c++];break}if(++c>=b)throw new TypeError}while(!0);for(;c<b;c++)c in this&&(d=a.call(null,d,this[c],c,this));return d}),Array.prototype.indexOf||(Array.prototype.indexOf=function(a){var b=this.length,c=arguments[1]||0;if(!b)return-1;if(c>=b)return-1;c<0&&(c+=b);for(;c<b;c++){if(!Object.prototype.hasOwnProperty.call(this,c))continue;if(a===this[c])return c}return-1}),Object.keys||(Object.keys=function(a){var b=[];for(var c in a)Object.prototype.hasOwnProperty.call(a,c)&&b.push(c);return b}),String.prototype.trim||(String.prototype.trim=function(){return String(this).replace(/^\s\s*/,"").replace(/\s\s*$/,"")});var d,f;typeof environment=="object"&&{}.toString.call(environment)==="[object Environment]"?(typeof a=="undefined"?d={}:d=a.less={},f=d.tree={},d.mode="rhino"):typeof a=="undefined"?(d=exports,f=c("./tree"),d.mode="node"):(typeof a.less=="undefined"&&(a.less={}),d=a.less,f=a.less.tree={},d.mode="browser"),d.Parser=function(b){function t(){j=m[i],k=h,n=h}function u(){m[i]=j,h=k,n=h}function v(){h>n&&(m[i]=m[i].slice(h-n),n=h)}function w(a){var b,c,d,e,f,j,k,l;if(a instanceof Function)return a.call(o.parsers);if(typeof a=="string")b=g.charAt(h)===a?a:null,d=1,v();else{v();if(!(b=a.exec(m[i])))return null;d=b[0].length}if(b){l=h+=d,j=h+m[i].length-d;while(h<j){e=g.charCodeAt(h);if(e!==32&&e!==10&&e!==9)break;h++}return m[i]=m[i].slice(d+(h-l)),n=h,m[i].length===0&&i<m.length-1&&i++,typeof b=="string"?b:b.length===1?b[0]:b}}function x(a,b){var c=w(a);if(!!c)return c;y(b||(typeof a=="string"?"expected '"+a+"' got '"+g.charAt(h)+"'":"unexpected token"))}function y(a,b){throw{index:h,type:b||"Syntax",message:a}}function z(a){return typeof a=="string"?g.charAt(h)===a:a.test(m[i])?!0:!1}function A(a,b){return a.filename&&b.filename&&a.filename!==b.filename?o.imports.contents[a.filename]:g}function B(a,b){for(var c=a,d=-1;c>=0&&b.charAt(c)!=="\n";c--)d++;return{line:typeof a=="number"?(b.slice(0,a).match(/\n/g)||"").length:null,column:d}}function C(a,b){var c=A(a,b),d=B(a.index,c),e=d.line,f=d.column,g=c.split("\n");this.type=a.type||"Syntax",this.message=a.message,this.filename=a.filename||b.filename,this.index=a.index,this.line=typeof e=="number"?e+1:null,this.callLine=a.call&&B(a.call,c)+1,this.callExtract=g[B(a.call,c)],this.stack=a.stack,this.column=f,this.extract=[g[e-1],g[e],g[e+1]]}var g,h,i,j,k,l,m,n,o,q=this,r=function(){},s=this.imports={paths:b&&b.paths||[],queue:[],files:{},contents:{},mime:b&&b.mime,error:null,push:function(a,c){var e=this;this.queue.push(a),d.Parser.importer(a,this.paths,function(b,d,f){e.queue.splice(e.queue.indexOf(a),1),e.files[a]=d,e.contents[a]=f,b&&!e.error&&(e.error=b),c(b,d),e.queue.length===0&&r()},b)}};return this.env=b=b||{},this.optimization="optimization"in this.env?this.env.optimization:1,this.env.filename=this.env.filename||null,o={imports:s,parse:function(a,e){var j,k,p,q,s,t,u=[],v,x=null;h=i=n=l=0,m=[],g=a.replace(/\r\n/g,"\n"),m=function(a){var c=0,d=/[^"'`\{\}\/\(\)]+/g,e=/\/\*(?:[^*]|\*+[^\/*])*\*+\/|\/\/.*/g,f=0,h,i=a[0],j,k;for(var l=0,m,n;l<g.length;l++){d.lastIndex=l,(h=d.exec(g))&&h.index===l&&(l+=h[0].length,i.push(h[0])),m=g.charAt(l),e.lastIndex=l,!k&&!j&&m==="/"&&(n=g.charAt(l+1),(n==="/"||n==="*")&&(h=e.exec(g))&&h.index===l&&(l+=h[0].length,i.push(h[0]),m=g.charAt(l)));if(m==="{"&&!k&&!j)f++,i.push(m);else if(m==="}"&&!k&&!j)f--,i.push(m),a[++c]=i=[];else if(m==="("&&!k&&!j)i.push(m),j=!0;else if(m===")"&&!k&&j)i.push(m),j=!1;else{if(m==='"'||m==="'"||m==="`")k?k=k===m?!1:k:k=m;i.push(m)}}if(f>0)throw{type:"Syntax",message:"Missing closing `}`",filename:b.filename};return a.map(function(a){return a.join("")})}([[]]);try{j=new f.Ruleset([],w(this.parsers.primary)),j.root=!0}catch(y){return e(new C(y,b))}j.toCSS=function(a){var e,g,h;return function(e,g){var h=[],i;e=e||{},typeof g=="object"&&!Array.isArray(g)&&(g=Object.keys(g).map(function(a){var b=g[a];return b instanceof f.Value||(b instanceof f.Expression||(b=new f.Expression([b])),b=new f.Value([b])),new f.Rule("@"+a,b,!1,0)}),h=[new f.Ruleset(null,g)]);try{var j=a.call(this,{frames:h}).toCSS([],{compress:e.compress||!1})}catch(k){throw new C(k,b)}if(i=o.imports.error)throw i instanceof C?i:new C(i,b);return e.yuicompress&&d.mode==="node"?c("./cssmin").compressor.cssmin(j):e.compress?j.replace(/(\s)+/g,"$1"):j}}(j.eval);if(h<g.length-1){h=l,t=g.split("\n"),s=(g.slice(0,h).match(/\n/g)||"").length+1;for(var z=h,A=-1;z>=0&&g.charAt(z)!=="\n";z--)A++;x={type:"Parse",message:"Syntax Error on line "+s,index:h,filename:b.filename,line:s,column:A,extract:[t[s-2],t[s-1],t[s]]}}this.imports.queue.length>0?r=function(){e(x,j)}:e(x,j)},parsers:{primary:function(){var a,b=[];while((a=w(this.mixin.definition)||w(this.rule)||w(this.ruleset)||w(this.mixin.call)||w(this.comment)||w(this.directive))||w(/^[\s\n]+/))a&&b.push(a);return b},comment:function(){var a;if(g.charAt(h)!=="/")return;if(g.charAt(h+1)==="/")return new f.Comment(w(/^\/\/.*/),!0);if(a=w(/^\/\*(?:[^*]|\*+[^\/*])*\*+\/\n?/))return new f.Comment(a)},entities:{quoted:function(){var a,b=h,c;g.charAt(b)==="~"&&(b++,c=!0);if(g.charAt(b)!=='"'&&g.charAt(b)!=="'")return;c&&w("~");if(a=w(/^"((?:[^"\\\r\n]|\\.)*)"|'((?:[^'\\\r\n]|\\.)*)'/))return new f.Quoted(a[0],a[1]||a[2],c)},keyword:function(){var a;if(a=w(/^[_A-Za-z-][_A-Za-z0-9-]*/))return f.colors.hasOwnProperty(a)?new f.Color(f.colors[a].slice(1)):new f.Keyword(a)},call:function(){var a,c,d=h;if(!(a=/^([\w-]+|%|progid:[\w\.]+)\(/.exec(m[i])))return;a=a[1].toLowerCase();if(a==="url")return null;h+=a.length;if(a==="alpha")return w(this.alpha);w("("),c=w(this.entities.arguments);if(!w(")"))return;if(a)return new f.Call(a,c,d,b.filename)},arguments:function(){var a=[],b;while(b=w(this.entities.assignment)||w(this.expression)){a.push(b);if(!w(","))break}return a},literal:function(){return w(this.entities.dimension)||w(this.entities.color)||w(this.entities.quoted)},assignment:function(){var a,b;if((a=w(/^\w+(?=\s?=)/i))&&w("=")&&(b=w(this.entity)))return new f.Assignment(a,b)},url:function(){var a;if(g.charAt(h)!=="u"||!w(/^url\(/))return;return a=w(this.entities.quoted)||w(this.entities.variable)||w(this.entities.dataURI)||w(/^[-\w%@$\/.&=:;#+?~]+/)||"",x(")"),new f.URL(a.value||a.data||a instanceof f.Variable?a:new f.Anonymous(a),s.paths)},dataURI:function(){var a;if(w(/^data:/)){a={},a.mime=w(/^[^\/]+\/[^,;)]+/)||"",a.charset=w(/^;\s*charset=[^,;)]+/)||"",a.base64=w(/^;\s*base64/)||"",a.data=w(/^,\s*[^)]+/);if(a.data)return a}},variable:function(){var a,c=h;if(g.charAt(h)==="@"&&(a=w(/^@@?[\w-]+/)))return new f.Variable(a,c,b.filename)},color:function(){var a;if(g.charAt(h)==="#"&&(a=w(/^#([a-fA-F0-9]{6}|[a-fA-F0-9]{3})/)))return new f.Color(a[1])},dimension:function(){var a,b=g.charCodeAt(h);if(b>57||b<45||b===47)return;if(a=w(/^(-?\d*\.?\d+)(px|%|em|rem|pc|ex|in|deg|s|ms|pt|cm|mm|rad|grad|turn)?/))return new f.Dimension(a[1],a[2])},javascript:function(){var a,b=h,c;g.charAt(b)==="~"&&(b++,c=!0);if(g.charAt(b)!=="`")return;c&&w("~");if(a=w(/^`([^`]*)`/))return new f.JavaScript(a[1],h,c)}},variable:function(){var a;if(g.charAt(h)==="@"&&(a=w(/^(@[\w-]+)\s*:/)))return a[1]},shorthand:function(){var a,b;if(!z(/^[@\w.%-]+\/[@\w.-]+/))return;if((a=w(this.entity))&&w("/")&&(b=w(this.entity)))return new f.Shorthand(a,b)},mixin:{call:function(){var a=[],c,d,e,i=h,j=g.charAt(h),k=!1;if(j!=="."&&j!=="#")return;while(c=w(/^[#.](?:[\w-]|\\(?:[a-fA-F0-9]{1,6} ?|[^a-fA-F0-9]))+/))a.push(new f.Element(d,c,h)),d=w(">");w("(")&&(e=w(this.entities.arguments))&&w(")"),w(this.important)&&(k=!0);if(a.length>0&&(w(";")||z("}")))return new f.mixin.Call(a,e,i,b.filename,k)},definition:function(){var a,b=[],c,d,e,i,j;if(g.charAt(h)!=="."&&g.charAt(h)!=="#"||z(/^[^{]*(;|})/))return;t();if(c=w(/^([#.](?:[\w-]|\\(?:[a-fA-F0-9]{1,6} ?|[^a-fA-F0-9]))+)\s*\(/)){a=c[1];while(e=w(this.entities.variable)||w(this.entities.literal)||w(this.entities.keyword)){e instanceof f.Variable?w(":")?(i=x(this.expression,"expected expression"),b.push({name:e.name,value:i})):b.push({name:e.name}):b.push({value:e});if(!w(","))break}x(")"),w(/^when/)&&(j=x(this.conditions,"expected condition")),d=w(this.block);if(d)return new f.mixin.Definition(a,b,d,j);u()}}},entity:function(){return w(this.entities.literal)||w(this.entities.variable)||w(this.entities.url)||w(this.entities.call)||w(this.entities.keyword)||w(this.entities.javascript)||w(this.comment)},end:function(){return w(";")||z("}")},alpha:function(){var a;if(!w(/^\(opacity=/i))return;if(a=w(/^\d+/)||w(this.entities.variable))return x(")"),new f.Alpha(a)},element:function(){var a,b,c,d;c=w(this.combinator),a=w(/^(?:\d+\.\d+|\d+)%/)||w(/^(?:[.#]?|:*)(?:[\w-]|\\(?:[a-fA-F0-9]{1,6} ?|[^a-fA-F0-9]))+/)||w("*")||w(this.attribute)||w(/^\([^)@]+\)/),a||w("(")&&(d=w(this.entities.variable))&&w(")")&&(a=new f.Paren(d));if(a)return new f.Element(c,a,h);if(c.value&&c.value.charAt(0)==="&")return new f.Element(c,null,h)},combinator:function(){var a,b=g.charAt(h);if(b===">"||b==="+"||b==="~"){h++;while(g.charAt(h)===" ")h++;return new f.Combinator(b)}if(b==="&"){a="&",h++,g.charAt(h)===" "&&(a="& ");while(g.charAt(h)===" ")h++;return new f.Combinator(a)}if(b===":"&&g.charAt(h+1)===":"){h+=2;while(g.charAt(h)===" ")h++;return new f.Combinator("::")}return g.charAt(h-1)===" "?new f.Combinator(" "):new f.Combinator(null)},selector:function(){var a,b,c=[],d,e;while(b=w(this.element)){d=g.charAt(h),c.push(b);if(d==="{"||d==="}"||d===";"||d===",")break}if(c.length>0)return new f.Selector(c)},tag:function(){return w(/^[a-zA-Z][a-zA-Z-]*[0-9]?/)||w("*")},attribute:function(){var a="",b,c,d;if(!w("["))return;if(b=w(/^[a-zA-Z-]+/)||w(this.entities.quoted))(d=w(/^[|~*$^]?=/))&&(c=w(this.entities.quoted)||w(/^[\w-]+/))?a=[b,d,c.toCSS?c.toCSS():c].join(""):a=b;if(!w("]"))return;if(a)return"["+a+"]"},block:function(){var a;if(w("{")&&(a=w(this.primary))&&w("}"))return a},ruleset:function(){var a=[],b,c,d;t();while(b=w(this.selector)){a.push(b),w(this.comment);if(!w(","))break;w(this.comment)}if(a.length>0&&(c=w(this.block)))return new f.Ruleset(a,c);l=h,u()},rule:function(){var a,b,c=g.charAt(h),d,e;t();if(c==="."||c==="#"||c==="&")return;if(a=w(this.variable)||w(this.property)){a.charAt(0)!="@"&&(e=/^([^@+\/'"*`(;{}-]*);/.exec(m[i]))?(h+=e[0].length-1,b=new f.Anonymous(e[1])):a==="font"?b=w(this.font):b=w(this.value),d=w(this.important);if(b&&w(this.end))return new f.Rule(a,b,d,k);l=h,u()}},"import":function(){var a,b,c=h;if(w(/^@import\s+/)&&(a=w(this.entities.quoted)||w(this.entities.url))){b=w(this.mediaFeatures);if(w(";"))return new f.Import(a,s,b,c)}},mediaFeature:function(){var a=[];do if(e=w(this.entities.keyword))a.push(e);else if(w("(")){p=w(this.property),e=w(this.entity);if(!w(")"))return null;if(p&&e)a.push(new f.Paren(new f.Rule(p,e,null,h,!0)));else{if(!e)return null;a.push(new f.Paren(e))}}while(e);if(a.length>0)return new f.Expression(a)},mediaFeatures:function(){var a,b=[];while(a=w(this.mediaFeature)){b.push(a);if(!w(","))break}return b.length>0?b:null},media:function(){var a;if(w(/^@media/)){a=w(this.mediaFeatures);if(rules=w(this.block))return new f.Directive("@media",rules,a)}},directive:function(){var a,b,c,d,e,i;if(g.charAt(h)!=="@")return;if(b=w(this["import"])||w(this.media))return b;if(a=w(/^@page|@keyframes/)||w(/^@(?:-webkit-|-moz-|-o-|-ms-)[a-z0-9-]+/)){d=(w(/^[^{]+/)||"").trim();if(c=w(this.block))return new f.Directive(a+" "+d,c)}else if(a=w(/^@[-a-z]+/))if(a==="@font-face"){if(c=w(this.block))return new f.Directive(a,c)}else if((b=w(this.entity))&&w(";"))return new f.Directive(a,b)},font:function(){var a=[],b=[],c,d,e,g;while(g=w(this.shorthand)||w(this.entity))b.push(g);a.push(new f.Expression(b));if(w(","))while(g=w(this.expression)){a.push(g);if(!w(","))break}return new f.Value(a)},value:function(){var a,b=[],c;while(a=w(this.expression)){b.push(a);if(!w(","))break}if(b.length>0)return new f.Value(b)},important:function(){if(g.charAt(h)==="!")return w(/^! *important/)},sub:function(){var a;if(w("(")&&(a=w(this.expression))&&w(")"))return a},multiplication:function(){var a,b,c,d;if(a=w(this.operand)){while(!z(/^\/\*/)&&(c=w("/")||w("*"))&&(b=w(this.operand)))d=new f.Operation(c,[d||a,b]);return d||a}},addition:function(){var a,b,c,d;if(a=w(this.multiplication)){while((c=w(/^[-+]\s+/)||g.charAt(h-1)!=" "&&(w("+")||w("-")))&&(b=w(this.multiplication)))d=new f.Operation(c,[d||a,b]);return d||a}},conditions:function(){var a,b,c=h,d;if(a=w(this.condition)){while(w(",")&&(b=w(this.condition)))d=new f.Condition("or",d||a,b,c);return d||a}},condition:function(){var a,b,c,d,e=h,g=!1;w(/^not/)&&(g=!0),x("(");if(a=w(this.addition)||w(this.entities.keyword)||w(this.entities.quoted))return(d=w(/^(?:>=|=<|[<=>])/))?(b=w(this.addition)||w(this.entities.keyword)||w(this.entities.quoted))?c=new f.Condition(d,a,b,e,g):y("expected expression"):c=new f.Condition("=",a,new f.Keyword("true"),e,g),x(")"),w(/^and/)?new f.Condition("and",c,w(this.condition)):c},operand:function(){var a,b=g.charAt(h+1);g.charAt(h)==="-"&&(b==="@"||b==="(")&&(a=w("-"));var c=w(this.sub)||w(this.entities.dimension)||w(this.entities.color)||w(this.entities.variable)||w(this.entities.call);return a?new f.Operation("*",[new f.Dimension(-1),c]):c},expression:function(){var a,b,c=[],d;while(a=w(this.addition)||w(this.entity))c.push(a);if(c.length>0)return new f.Expression(c)},property:function(){var a;if(a=w(/^(\*?-?[-a-z_0-9]+)\s*:/))return a[1]}}}};if(d.mode==="browser"||d.mode==="rhino")d.Parser.importer=function(a,b,c,d){a.charAt(0)!=="/"&&b.length>0&&(a=b[0]+a),o({href:a,title:a,type:d.mime},c,!0)};(function(a){function b(b){return a.functions.hsla(b.h,b.s,b.l,b.a)}function c(b){if(b instanceof a.Dimension)return parseFloat(b.unit=="%"?b.value/100:b.value);if(typeof b=="number")return b;throw{error:"RuntimeError",message:"color functions take numbers as parameters"}}function d(a){return Math.min(1,Math.max(0,a))}a.functions={rgb:function(a,b,c){return this.rgba(a,b,c,1)},rgba:function(b,d,e,f){var g=[b,d,e].map(function(a){return c(a)}),f=c(f);return new a.Color(g,f)},hsl:function(a,b,c){return this.hsla(a,b,c,1)},hsla:function(a,b,d,e){function h(a){return a=a<0?a+1:a>1?a-1:a,a*6<1?g+(f-g)*a*6:a*2<1?f:a*3<2?g+(f-g)*(2/3-a)*6:g}a=c(a)%360/360,b=c(b),d=c(d),e=c(e);var f=d<=.5?d*(b+1):d+b-d*b,g=d*2-f;return this.rgba(h(a+1/3)*255,h(a)*255,h(a-1/3)*255,e)},hue:function(b){return new a.Dimension(Math.round(b.toHSL().h))},saturation:function(b){return new a.Dimension(Math.round(b.toHSL().s*100),"%")},lightness:function(b){return new a.Dimension(Math.round(b.toHSL().l*100),"%")},alpha:function(b){return new a.Dimension(b.toHSL().a)},saturate:function(a,c){var e=a.toHSL();return e.s+=c.value/100,e.s=d(e.s),b(e)},desaturate:function(a,c){var e=a.toHSL();return e.s-=c.value/100,e.s=d(e.s),b(e)},lighten:function(a,c){var e=a.toHSL();return e.l+=c.value/100,e.l=d(e.l),b(e)},darken:function(a,c){var e=a.toHSL();return e.l-=c.value/100,e.l=d(e.l),b(e)},fadein:function(a,c){var e=a.toHSL();return e.a+=c.value/100,e.a=d(e.a),b(e)},fadeout:function(a,c){var e=a.toHSL();return e.a-=c.value/100,e.a=d(e.a),b(e)},fade:function(a,c){var e=a.toHSL();return e.a=c.value/100,e.a=d(e.a),b(e)},spin:function(a,c){var d=a.toHSL(),e=(d.h+c.value)%360;return d.h=e<0?360+e:e,b(d)},mix:function(b,c,d){var e=d.value/100,f=e*2-1,g=b.toHSL().a-c.toHSL().a,h=((f*g==-1?f:(f+g)/(1+f*g))+1)/2,i=1-h,j=[b.rgb[0]*h+c.rgb[0]*i,b.rgb[1]*h+c.rgb[1]*i,b.rgb[2]*h+c.rgb[2]*i],k=b.alpha*e+c.alpha*(1-e);return new a.Color(j,k)},greyscale:function(b){return this.desaturate(b,new a.Dimension(100))},e:function(b){return new a.Anonymous(b instanceof a.JavaScript?b.evaluated:b)},escape:function(b){return new a.Anonymous(encodeURI(b.value).replace(/=/g,"%3D").replace(/:/g,"%3A").replace(/#/g,"%23").replace(/;/g,"%3B").replace(/\(/g,"%28").replace(/\)/g,"%29"))},"%":function(b){var c=Array.prototype.slice.call(arguments,1),d=b.value;for(var e=0;e<c.length;e++)d=d.replace(/%[sda]/i,function(a){var b=a.match(/s/i)?c[e].value:c[e].toCSS();return a.match(/[A-Z]$/)?encodeURIComponent(b):b});return d=d.replace(/%%/g,"%"),new a.Quoted('"'+d+'"',d)},round:function(a){return this._math("round",a)},ceil:function(a){return this._math("ceil",a)},floor:function(a){return this._math("floor",a)},_math:function(b,d){if(d instanceof a.Dimension)return new a.Dimension(Math[b](c(d)),d.unit);if(typeof d=="number")return Math[b](d);throw{type:"Argument",message:"argument must be a number"}},argb:function(b){return new a.Anonymous(b.toARGB())},percentage:function(b){return new a.Dimension(b.value*100,"%")},color:function(b){if(b instanceof a.Quoted)return new a.Color(b.value.slice(1));throw{type:"Argument",message:"argument must be a string"}},iscolor:function(b){return this._isa(b,a.Color)},isnumber:function(b){return this._isa(b,a.Dimension)},isstring:function(b){return this._isa(b,a.Quoted)},iskeyword:function(b){return this._isa(b,a.Keyword)},isurl:function(b){return this._isa(b,a.URL)},ispixel:function(b){return b instanceof a.Dimension&&b.unit==="px"?a.True:a.False},ispercentage:function(b){return b instanceof a.Dimension&&b.unit==="%"?a.True:a.False},isem:function(b){return b instanceof a.Dimension&&b.unit==="em"?a.True:a.False},_isa:function(b,c){return b instanceof c?a.True:a.False}}})(c("./tree")),function(a){a.colors={aliceblue:"#f0f8ff",antiquewhite:"#faebd7",aqua:"#00ffff",aquamarine:"#7fffd4",azure:"#f0ffff",beige:"#f5f5dc",bisque:"#ffe4c4",black:"#000000",blanchedalmond:"#ffebcd",blue:"#0000ff",blueviolet:"#8a2be2",brown:"#a52a2a",burlywood:"#deb887",cadetblue:"#5f9ea0",chartreuse:"#7fff00",chocolate:"#d2691e",coral:"#ff7f50",cornflowerblue:"#6495ed",cornsilk:"#fff8dc",crimson:"#dc143c",cyan:"#00ffff",darkblue:"#00008b",darkcyan:"#008b8b",darkgoldenrod:"#b8860b",darkgray:"#a9a9a9",darkgrey:"#a9a9a9",darkgreen:"#006400",darkkhaki:"#bdb76b",darkmagenta:"#8b008b",darkolivegreen:"#556b2f",darkorange:"#ff8c00",darkorchid:"#9932cc",darkred:"#8b0000",darksalmon:"#e9967a",darkseagreen:"#8fbc8f",darkslateblue:"#483d8b",darkslategray:"#2f4f4f",darkslategrey:"#2f4f4f",darkturquoise:"#00ced1",darkviolet:"#9400d3",deeppink:"#ff1493",deepskyblue:"#00bfff",dimgray:"#696969",dimgrey:"#696969",dodgerblue:"#1e90ff",firebrick:"#b22222",floralwhite:"#fffaf0",forestgreen:"#228b22",fuchsia:"#ff00ff",gainsboro:"#dcdcdc",ghostwhite:"#f8f8ff",gold:"#ffd700",goldenrod:"#daa520",gray:"#808080",grey:"#808080",green:"#008000",greenyellow:"#adff2f",honeydew:"#f0fff0",hotpink:"#ff69b4",indianred:"#cd5c5c",indigo:"#4b0082",ivory:"#fffff0",khaki:"#f0e68c",lavender:"#e6e6fa",lavenderblush:"#fff0f5",lawngreen:"#7cfc00",lemonchiffon:"#fffacd",lightblue:"#add8e6",lightcoral:"#f08080",lightcyan:"#e0ffff",lightgoldenrodyellow:"#fafad2",lightgray:"#d3d3d3",lightgrey:"#d3d3d3",lightgreen:"#90ee90",lightpink:"#ffb6c1",lightsalmon:"#ffa07a",lightseagreen:"#20b2aa",lightskyblue:"#87cefa",lightslategray:"#778899",lightslategrey:"#778899",lightsteelblue:"#b0c4de",lightyellow:"#ffffe0",lime:"#00ff00",limegreen:"#32cd32",linen:"#faf0e6",magenta:"#ff00ff",maroon:"#800000",mediumaquamarine:"#66cdaa",mediumblue:"#0000cd",mediumorchid:"#ba55d3",mediumpurple:"#9370d8",mediumseagreen:"#3cb371",mediumslateblue:"#7b68ee",mediumspringgreen:"#00fa9a",mediumturquoise:"#48d1cc",mediumvioletred:"#c71585",midnightblue:"#191970",mintcream:"#f5fffa",mistyrose:"#ffe4e1",moccasin:"#ffe4b5",navajowhite:"#ffdead",navy:"#000080",oldlace:"#fdf5e6",olive:"#808000",olivedrab:"#6b8e23",orange:"#ffa500",orangered:"#ff4500",orchid:"#da70d6",palegoldenrod:"#eee8aa",palegreen:"#98fb98",paleturquoise:"#afeeee",palevioletred:"#d87093",papayawhip:"#ffefd5",peachpuff:"#ffdab9",peru:"#cd853f",pink:"#ffc0cb",plum:"#dda0dd",powderblue:"#b0e0e6",purple:"#800080",red:"#ff0000",rosybrown:"#bc8f8f",royalblue:"#4169e1",saddlebrown:"#8b4513",salmon:"#fa8072",sandybrown:"#f4a460",seagreen:"#2e8b57",seashell:"#fff5ee",sienna:"#a0522d",silver:"#c0c0c0",skyblue:"#87ceeb",slateblue:"#6a5acd",slategray:"#708090",slategrey:"#708090",snow:"#fffafa",springgreen:"#00ff7f",steelblue:"#4682b4",tan:"#d2b48c",teal:"#008080",thistle:"#d8bfd8",tomato:"#ff6347",turquoise:"#40e0d0",violet:"#ee82ee",wheat:"#f5deb3",white:"#ffffff",whitesmoke:"#f5f5f5",yellow:"#ffff00",yellowgreen:"#9acd32"}}(c("./tree")),function(a){a.Alpha=function(a){this.value=a},a.Alpha.prototype={toCSS:function(){return"alpha(opacity="+(this.value.toCSS?this.value.toCSS():this.value)+")"},eval:function(a){return this.value.eval&&(this.value=this.value.eval(a)),this}}}(c("../tree")),function(a){a.Anonymous=function(a){this.value=a.value||a},a.Anonymous.prototype={toCSS:function(){return this.value},eval:function(){return this}}}(c("../tree")),function(a){a.Assignment=function(a,b){this.key=a,this.value=b},a.Assignment.prototype={toCSS:function(){return this.key+"="+(this.value.toCSS?this.value.toCSS():this.value)},eval:function(a){return this.value.eval&&(this.value=this.value.eval(a)),this}}}(c("../tree")),function(a){a.Call=function(a,b,c,d){this.name=a,this.args=b,this.index=c,this.filename=d},a.Call.prototype={eval:function(b){var c=this.args.map(function(a){return a.eval(b)});if(!(this.name in a.functions))return new a.Anonymous(this.name+"("+c.map(function(a){return a.toCSS()}).join(", ")+")");try{return a.functions[this.name].apply(a.functions,c)}catch(d){throw{type:d.type||"Runtime",message:"error evaluating function `"+this.name+"`"+(d.message?": "+d.message:""),index:this.index,filename:this.filename}}},toCSS:function(a){return this.eval(a).toCSS()}}}(c("../tree")),function(a){a.Color=function(a,b){Array.isArray(a)?this.rgb=a:a.length==6?this.rgb=a.match(/.{2}/g).map(function(a){return parseInt(a,16)}):this.rgb=a.split("").map(function(a){return parseInt(a+a,16)}),this.alpha=typeof b=="number"?b:1},a.Color.prototype={eval:function(){return this},toCSS:function(){return this.alpha<1?"rgba("+this.rgb.map(function(a){return Math.round(a)}).concat(this.alpha).join(", ")+")":"#"+this.rgb.map(function(a){return a=Math.round(a),a=(a>255?255:a<0?0:a).toString(16),a.length===1?"0"+a:a}).join("")},operate:function(b,c){var d=[];c instanceof a.Color||(c=c.toColor());for(var e=0;e<3;e++)d[e]=a.operate(b,this.rgb[e],c.rgb[e]);return new a.Color(d,this.alpha+c.alpha)},toHSL:function(){var a=this.rgb[0]/255,b=this.rgb[1]/255,c=this.rgb[2]/255,d=this.alpha,e=Math.max(a,b,c),f=Math.min(a,b,c),g,h,i=(e+f)/2,j=e-f;if(e===f)g=h=0;else{h=i>.5?j/(2-e-f):j/(e+f);switch(e){case a:g=(b-c)/j+(b<c?6:0);break;case b:g=(c-a)/j+2;break;case c:g=(a-b)/j+4}g/=6}return{h:g*360,s:h,l:i,a:d}},toARGB:function(){var a=[Math.round(this.alpha*255)].concat(this.rgb);return"#"+a.map(function(a){return a=Math.round(a),a=(a>255?255:a<0?0:a).toString(16),a.length===1?"0"+a:a}).join("")}}}(c("../tree")),function(a){a.Comment=function(a,b){this.value=a,this.silent=!!b},a.Comment.prototype={toCSS:function(a){return a.compress?"":this.value},eval:function(){return this}}}(c("../tree")),function(a){a.Condition=function(a,b,c,d,e){this.op=a.trim(),this.lvalue=b,this.rvalue=c,this.index=d,this.negate=e},a.Condition.prototype.eval=function(a){var b=this.lvalue.eval(a),c=this.rvalue.eval(a),d=this.index,e,e=function(a){switch(a){case"and":return b&&c;case"or":return b||c;default:if(b.compare)e=b.compare(c);else{if(!c.compare)throw{type:"Type",message:"Unable to perform comparison",index:d};e=c.compare(b)}switch(e){case-1:return a==="<"||a==="=<";case 0:return a==="="||a===">="||a==="=<";case 1:return a===">"||a===">="}}}(this.op);return this.negate?!e:e}}(c("../tree")),function(a){a.Dimension=function(a,b){this.value=parseFloat(a),this.unit=b||null},a.Dimension.prototype={eval:function(){return this},toColor:function(){return new a.Color([this.value,this.value,this.value])},toCSS:function(){var a=this.value+this.unit;return a},operate:function(b,c){return new a.Dimension(a.operate(b,this.value,c.value),this.unit||c.unit)},compare:function(b){return b instanceof a.Dimension?b.value>this.value?-1:b.value<this.value?1:0:-1}}}(c("../tree")),function(a){a.Directive=function(b,c,d){this.name=b,this.features=d&&new a.Value(d),Array.isArray(c)?(this.ruleset=new a.Ruleset([],c),this.ruleset.allowImports=!0):this.value=c},a.Directive.prototype={toCSS:function(a,b){var c=this.features?" "+this.features.toCSS(b):"";return this.ruleset?(this.ruleset.root=!0,this.name+c+(b.compress?"{":" {\n  ")+this.ruleset.toCSS(a,b).trim().replace(/\n/g,"\n  ")+(b.compress?"}":"\n}\n")):this.name+" "+this.value.toCSS()+";\n"},eval:function(a){return this.features=this.features&&this.features.eval(a),a.frames.unshift(this),this.ruleset=this.ruleset&&this.ruleset.eval(a),a.frames.shift(),this},variable:function(b){return a.Ruleset.prototype.variable.call(this.ruleset,b)},find:function(){return a.Ruleset.prototype.find.apply(this.ruleset,arguments)},rulesets:function(){return a.Ruleset.prototype.rulesets.apply(this.ruleset)}}}(c("../tree")),function(a){a.Element=function(b,c,d){this.combinator=b instanceof a.Combinator?b:new a.Combinator(b),typeof c=="string"?this.value=c.trim():c?this.value=c:this.value="",this.index=d},a.Element.prototype.eval=function(b){return new a.Element(this.combinator,this.value.eval?this.value.eval(b):this.value,this.index)},a.Element.prototype.toCSS=function(a){return this.combinator.toCSS(a||{})+(this.value.toCSS?this.value.toCSS(a):this.value)},a.Combinator=function(a){a===" "?this.value=" ":a==="& "?this.value="& ":this.value=a?a.trim():""},a.Combinator.prototype.toCSS=function(a){return{"":""," ":" ","&":"","& ":" ",":":" :","::":"::","+":a.compress?"+":" + ","~":a.compress?"~":" ~ ",">":a.compress?">":" > "}[this.value]}}(c("../tree")),function(a){a.Expression=function(a){this.value=a},a.Expression.prototype={eval:function(b){return this.value.length>1?new a.Expression(this.value.map(function(a){return a.eval(b)})):this.value.length===1?this.value[0].eval(b):this},toCSS:function(a){return this.value.map(function(b){return b.toCSS?b.toCSS(a):""}).join(" ")}}}(c("../tree")),function(a){a.Import=function(b,c,d,e){var f=this;this.index=e,this._path=b,this.features=d&&new a.Value(d),b instanceof a.Quoted?this.path=/\.(le?|c)ss(\?.*)?$/.test(b.value)?b.value:b.value+".less":this.path=b.value.value||b.value,this.css=/css(\?.*)?$/.test(this.path),this.css||c.push(this.path,function(b,c){b&&(b.index=e),f.root=c||new a.Ruleset([],[])})},a.Import.prototype={toCSS:function(a){var b=this.features?" "+this.features.toCSS(a):"";return this.css?"@import "+this._path.toCSS()+b+";\n":""},eval:function(b){var c,d=this.features&&this.features.eval(b);if(this.css)return this;c=new a.Ruleset([],this.root.rules.slice(0));for(var e=0;e<c.rules.length;e++)c.rules[e]instanceof a.Import&&Array.prototype.splice.apply(c.rules,[e,1].concat(c.rules[e].eval(b)));return this.features?new a.Directive("@media",c.rules,this.features.value):c.rules}}}(c("../tree")),function(a){a.JavaScript=function(a,b,c){this.escaped=c,this.expression=a,this.index=b},a.JavaScript.prototype={eval:function(b){var c,d=this,e={},f=this.expression.replace(/@\{([\w-]+)\}/g,function(c,e){return a.jsify((new a.Variable("@"+e,d.index)).eval(b))});try{f=new Function("return ("+f+")")}catch(g){throw{message:"JavaScript evaluation error: `"+
-f+"`",index:this.index}}for(var h in b.frames[0].variables())e[h.slice(1)]={value:b.frames[0].variables()[h].value,toJS:function(){return this.value.eval(b).toCSS()}};try{c=f.call(e)}catch(g){throw{message:"JavaScript evaluation error: '"+g.name+": "+g.message+"'",index:this.index}}return typeof c=="string"?new a.Quoted('"'+c+'"',c,this.escaped,this.index):Array.isArray(c)?new a.Anonymous(c.join(", ")):new a.Anonymous(c)}}}(c("../tree")),function(a){a.Keyword=function(a){this.value=a},a.Keyword.prototype={eval:function(){return this},toCSS:function(){return this.value},compare:function(b){return b instanceof a.Keyword?b.value===this.value?0:1:-1}},a.True=new a.Keyword("true"),a.False=new a.Keyword("false")}(c("../tree")),function(a){a.mixin={},a.mixin.Call=function(b,c,d,e,f){this.selector=new a.Selector(b),this.arguments=c,this.index=d,this.filename=e,this.important=f},a.mixin.Call.prototype={eval:function(a){var b,c,d=[],e=!1;for(var f=0;f<a.frames.length;f++)if((b=a.frames[f].find(this.selector)).length>0){c=this.arguments&&this.arguments.map(function(b){return b.eval(a)});for(var g=0;g<b.length;g++)if(b[g].match(c,a))try{Array.prototype.push.apply(d,b[g].eval(a,this.arguments,this.important).rules),e=!0}catch(h){throw{message:h.message,index:h.index,filename:this.filename,stack:h.stack,call:this.index}}if(e)return d;throw{type:"Runtime",message:"No matching definition was found for `"+this.selector.toCSS().trim()+"("+this.arguments.map(function(a){return a.toCSS()}).join(", ")+")`",index:this.index,filename:this.filename}}throw{type:"Name",message:this.selector.toCSS().trim()+" is undefined",index:this.index,filename:this.filename}}},a.mixin.Definition=function(b,c,d,e){this.name=b,this.selectors=[new a.Selector([new a.Element(null,b)])],this.params=c,this.condition=e,this.arity=c.length,this.rules=d,this._lookups={},this.required=c.reduce(function(a,b){return!b.name||b.name&&!b.value?a+1:a},0),this.parent=a.Ruleset.prototype,this.frames=[]},a.mixin.Definition.prototype={toCSS:function(){return""},variable:function(a){return this.parent.variable.call(this,a)},variables:function(){return this.parent.variables.call(this)},find:function(){return this.parent.find.apply(this,arguments)},rulesets:function(){return this.parent.rulesets.apply(this)},evalParams:function(b,c){var d=new a.Ruleset(null,[]);for(var e=0,f;e<this.params.length;e++)if(this.params[e].name){if(!(f=c&&c[e]||this.params[e].value))throw{type:"Runtime",message:"wrong number of arguments for "+this.name+" ("+c.length+" for "+this.arity+")"};d.rules.unshift(new a.Rule(this.params[e].name,f.eval(b)))}return d},eval:function(b,c,d){var e=this.evalParams(b,c),f,g=[],h;for(var i=0;i<Math.max(this.params.length,c&&c.length);i++)g.push(c[i]||this.params[i].value);return e.rules.unshift(new a.Rule("@arguments",(new a.Expression(g)).eval(b))),h=d?this.rules.map(function(b){return new a.Rule(b.name,b.value,"!important",b.index)}):this.rules.slice(0),(new a.Ruleset(null,h)).eval({frames:[this,e].concat(this.frames,b.frames)})},match:function(a,b){var c=a&&a.length||0,d,e;if(c<this.required)return!1;if(this.required>0&&c>this.params.length)return!1;if(this.condition&&!this.condition.eval({frames:[this.evalParams(b,a)].concat(b.frames)}))return!1;d=Math.min(c,this.arity);for(var f=0;f<d;f++)if(!this.params[f].name&&a[f].eval(b).toCSS()!=this.params[f].value.eval(b).toCSS())return!1;return!0}}}(c("../tree")),function(a){a.Operation=function(a,b){this.op=a.trim(),this.operands=b},a.Operation.prototype.eval=function(b){var c=this.operands[0].eval(b),d=this.operands[1].eval(b),e;if(c instanceof a.Dimension&&d instanceof a.Color){if(this.op!=="*"&&this.op!=="+")throw{name:"OperationError",message:"Can't substract or divide a color from a number"};e=d,d=c,c=e}return c.operate(this.op,d)},a.operate=function(a,b,c){switch(a){case"+":return b+c;case"-":return b-c;case"*":return b*c;case"/":return b/c}}}(c("../tree")),function(a){a.Paren=function(a){this.value=a},a.Paren.prototype={toCSS:function(a){return"("+this.value.toCSS(a)+")"},eval:function(b){return new a.Paren(this.value.eval(b))}}}(c("../tree")),function(a){a.Quoted=function(a,b,c,d){this.escaped=c,this.value=b||"",this.quote=a.charAt(0),this.index=d},a.Quoted.prototype={toCSS:function(){return this.escaped?this.value:this.quote+this.value+this.quote},eval:function(b){var c=this,d=this.value.replace(/`([^`]+)`/g,function(d,e){return(new a.JavaScript(e,c.index,!0)).eval(b).value}).replace(/@\{([\w-]+)\}/g,function(d,e){var f=(new a.Variable("@"+e,c.index)).eval(b);return"value"in f?f.value:f.toCSS()});return new a.Quoted(this.quote+d+this.quote,d,this.escaped,this.index)}}}(c("../tree")),function(a){a.Rule=function(b,c,d,e,f){this.name=b,this.value=c instanceof a.Value?c:new a.Value([c]),this.important=d?" "+d.trim():"",this.index=e,this.inline=f||!1,b.charAt(0)==="@"?this.variable=!0:this.variable=!1},a.Rule.prototype.toCSS=function(a){return this.variable?"":this.name+(a.compress?":":": ")+this.value.toCSS(a)+this.important+(this.inline?"":";")},a.Rule.prototype.eval=function(b){return new a.Rule(this.name,this.value.eval(b),this.important,this.index,this.inline)},a.Shorthand=function(a,b){this.a=a,this.b=b},a.Shorthand.prototype={toCSS:function(a){return this.a.toCSS(a)+"/"+this.b.toCSS(a)},eval:function(){return this}}}(c("../tree")),function(a){a.Ruleset=function(a,b){this.selectors=a,this.rules=b,this._lookups={}},a.Ruleset.prototype={eval:function(b){var c=this.selectors&&this.selectors.map(function(a){return a.eval(b)}),d=new a.Ruleset(c,this.rules.slice(0));d.root=this.root,d.allowImports=this.allowImports,b.frames.unshift(d);if(d.root||d.allowImports)for(var e=0;e<d.rules.length;e++)d.rules[e]instanceof a.Import&&Array.prototype.splice.apply(d.rules,[e,1].concat(d.rules[e].eval(b)));for(var e=0;e<d.rules.length;e++)d.rules[e]instanceof a.mixin.Definition&&(d.rules[e].frames=b.frames.slice(0));for(var e=0;e<d.rules.length;e++)d.rules[e]instanceof a.mixin.Call&&Array.prototype.splice.apply(d.rules,[e,1].concat(d.rules[e].eval(b)));for(var e=0,f;e<d.rules.length;e++)f=d.rules[e],f instanceof a.mixin.Definition||(d.rules[e]=f.eval?f.eval(b):f);return b.frames.shift(),d},match:function(a){return!a||a.length===0},variables:function(){return this._variables?this._variables:this._variables=this.rules.reduce(function(b,c){return c instanceof a.Rule&&c.variable===!0&&(b[c.name]=c),b},{})},variable:function(a){return this.variables()[a]},rulesets:function(){return this._rulesets?this._rulesets:this._rulesets=this.rules.filter(function(b){return b instanceof a.Ruleset||b instanceof a.mixin.Definition})},find:function(b,c){c=c||this;var d=[],e,f,g=b.toCSS();return g in this._lookups?this._lookups[g]:(this.rulesets().forEach(function(e){if(e!==c)for(var g=0;g<e.selectors.length;g++)if(f=b.match(e.selectors[g])){b.elements.length>e.selectors[g].elements.length?Array.prototype.push.apply(d,e.find(new a.Selector(b.elements.slice(1)),c)):d.push(e);break}}),this._lookups[g]=d)},toCSS:function(b,c){var d=[],e=[],f=[],g=[],h,i;this.root||(b.length===0?g=this.selectors.map(function(a){return[a]}):this.joinSelectors(g,b,this.selectors));for(var j=0;j<this.rules.length;j++)i=this.rules[j],i.rules||i instanceof a.Directive?f.push(i.toCSS(g,c)):i instanceof a.Comment?i.silent||(this.root?f.push(i.toCSS(c)):e.push(i.toCSS(c))):i.toCSS&&!i.variable?e.push(i.toCSS(c)):i.value&&!i.variable&&e.push(i.value.toString());return f=f.join(""),this.root?d.push(e.join(c.compress?"":"\n")):e.length>0&&(h=g.map(function(a){return a.map(function(a){return a.toCSS(c)}).join("").trim()}).join(c.compress?",":g.length>3?",\n":", "),d.push(h,(c.compress?"{":" {\n  ")+e.join(c.compress?"":"\n  ")+(c.compress?"}":"\n}\n"))),d.push(f),d.join("")+(c.compress?"\n":"")},joinSelectors:function(a,b,c){for(var d=0;d<c.length;d++)this.joinSelector(a,b,c[d])},joinSelector:function(b,c,d){var e=[],f=[],g=[],h=[],i=!1,j;for(var k=0;k<d.elements.length;k++)j=d.elements[k],j.combinator.value.charAt(0)==="&"&&(i=!0),i?h.push(j):g.push(j);i||(h=g,g=[]),g.length>0&&e.push(new a.Selector(g)),h.length>0&&f.push(new a.Selector(h));for(var l=0;l<c.length;l++)b.push(e.concat(c[l]).concat(f))}}}(c("../tree")),function(a){a.Selector=function(a){this.elements=a,this.elements[0].combinator.value===""&&(this.elements[0].combinator.value=" ")},a.Selector.prototype.match=function(a){var b=this.elements.length,c=a.elements.length,d=Math.min(b,c);if(b<c)return!1;for(var e=0;e<d;e++)if(this.elements[e].value!==a.elements[e].value)return!1;return!0},a.Selector.prototype.eval=function(b){return new a.Selector(this.elements.map(function(a){return a.eval(b)}))},a.Selector.prototype.toCSS=function(a){return this._css?this._css:this._css=this.elements.map(function(b){return typeof b=="string"?" "+b.trim():b.toCSS(a)}).join("")}}(c("../tree")),function(b){b.URL=function(b,c){b.data?this.attrs=b:(typeof a!="undefined"&&!/^(?:https?:\/\/|file:\/\/|data:|\/)/.test(b.value)&&c.length>0&&(b.value=c[0]+(b.value.charAt(0)==="/"?b.value.slice(1):b.value)),this.value=b,this.paths=c)},b.URL.prototype={toCSS:function(){return"url("+(this.attrs?"data:"+this.attrs.mime+this.attrs.charset+this.attrs.base64+this.attrs.data:this.value.toCSS())+")"},eval:function(a){return this.attrs?this:new b.URL(this.value.eval(a),this.paths)}}}(c("../tree")),function(a){a.Value=function(a){this.value=a,this.is="value"},a.Value.prototype={eval:function(b){return this.value.length===1?this.value[0].eval(b):new a.Value(this.value.map(function(a){return a.eval(b)}))},toCSS:function(a){return this.value.map(function(b){return b.toCSS(a)}).join(a.compress?",":", ")}}}(c("../tree")),function(a){a.Variable=function(a,b,c){this.name=a,this.index=b,this.file=c},a.Variable.prototype={eval:function(b){var c,d,e=this.name;e.indexOf("@@")==0&&(e="@"+(new a.Variable(e.slice(1))).eval(b).value);if(c=a.find(b.frames,function(a){if(d=a.variable(e))return d.value.eval(b)}))return c;throw{type:"Name",message:"variable "+e+" is undefined",filename:this.file,index:this.index}}}}(c("../tree")),function(a){a.find=function(a,b){for(var c=0,d;c<a.length;c++)if(d=b.call(a,a[c]))return d;return null},a.jsify=function(a){return Array.isArray(a.value)&&a.value.length>1?"["+a.value.map(function(a){return a.toCSS(!1)}).join(", ")+"]":a.toCSS(!1)}}(c("./tree"));var g=location.protocol==="file:"||location.protocol==="chrome:"||location.protocol==="chrome-extension:"||location.protocol==="resource:";d.env=d.env||(location.hostname=="127.0.0.1"||location.hostname=="0.0.0.0"||location.hostname=="localhost"||location.port.length>0||g?"development":"production"),d.async=!1,d.poll=d.poll||(g?1e3:1500),d.watch=function(){return this.watchMode=!0},d.unwatch=function(){return this.watchMode=!1},d.env==="development"?(d.optimization=0,/!watch/.test(location.hash)&&d.watch(),d.watchTimer=setInterval(function(){d.watchMode&&n(function(a,b,c,d,e){b&&r(b.toCSS(),d,e.lastModified)})},d.poll)):d.optimization=3;var h;try{h=typeof a.localStorage=="undefined"?null:a.localStorage}catch(i){h=null}var j=document.getElementsByTagName("link"),k=/^text\/(x-)?less$/;d.sheets=[];for(var l=0;l<j.length;l++)(j[l].rel==="stylesheet/less"||j[l].rel.match(/stylesheet/)&&j[l].type.match(k))&&d.sheets.push(j[l]);d.refresh=function(a){var b,c;b=c=new Date,n(function(a,d,e,f,g){g.local?v("loading "+f.href+" from cache."):(v("parsed "+f.href+" successfully."),r(d.toCSS(),f,g.lastModified)),v("css for "+f.href+" generated in "+(new Date-c)+"ms"),g.remaining===0&&v("css generated in "+(new Date-b)+"ms"),c=new Date},a),m()},d.refreshStyles=m,d.refresh(d.env==="development")})(window);
\ No newline at end of file
index 03f133e..545acad 100644 (file)
@@ -1,30 +1,32 @@
-// IE fixes javascript loaded by wikibits.js for IE <= 6.0
+/**
+ * IE fixes javascript loaded by wikibits.js for IE <= 6.0
+ */
+/*global isMSIE55:true, doneIETransform:true, doneIEAlphaFix:true */
+/*global hookit:true, fixalpha:true */
 ( function ( mw, $ ) {
 
-var doneIEAlphaFix, doneIETransform, expandedURLs, fixalpha, isMSIE55,
-       relativeforfloats, setrelative, hasClass;
+var expandedURLs, hasClass;
 
 // Also returns true for IE6, 7, 8, 9 and 10. createPopup is removed in IE11.
 // Good thing this is only loaded for IE <= 6 by wikibits.
 // Might as well set it to true.
-isMSIE55 = window.isMSIE55 = ( window.showModalDialog && window.clipboardData && window.createPopup );
-doneIETransform = window.doneIETransform = undefined;
-doneIEAlphaFix = window.doneIEAlphaFix = undefined;
+isMSIE55 = ( window.showModalDialog && window.clipboardData && window.createPopup );
+doneIETransform = false;
+doneIEAlphaFix = false;
 
-window.hookit = function () {
+hookit = function () {
        if ( !doneIETransform && document.getElementById && document.getElementById( 'bodyContent' ) ) {
                doneIETransform = true;
-               relativeforfloats();
                fixalpha();
        }
 };
 
 if ( document.attachEvent ) {
-       document.attachEvent( 'onreadystatechange', window.hookit );
+       document.attachEvent( 'onreadystatechange', hookit );
 }
 
 // png alpha transparency fixes
-fixalpha = window.fixalpha = function ( logoId ) {
+fixalpha = function ( logoId ) {
        // bg
        if ( isMSIE55 && !doneIEAlphaFix ) {
                var bg, imageUrl, linkFix, logoa, logospan, plogo;
@@ -76,31 +78,6 @@ if ( isMSIE55 ) {
        $( fixalpha );
 }
 
-// fix ie6 disappering float bug
-relativeforfloats = window.relativeforfloats = function () {
-       var bc, tables, divs;
-       bc = document.getElementById( 'bodyContent' );
-       if ( bc ) {
-               tables = bc.getElementsByTagName( 'table' );
-               divs = bc.getElementsByTagName( 'div' );
-               setrelative( tables );
-               setrelative( divs );
-       }
-};
-
-setrelative = window.setrelative = function ( nodes ) {
-       var i = 0;
-       while ( i < nodes.length ) {
-               if ( ( ( nodes[i].style.float && nodes[i].style.float !== ( 'none' ) ||
-                       ( nodes[i].align && nodes[i].align !== ( 'none' ) ) ) &&
-                       ( !nodes[i].style.position || nodes[i].style.position !== 'relative' ) ) )
-               {
-                       nodes[i].style.position = 'relative';
-               }
-               i++;
-       }
-};
-
 // Expand links for printing
 hasClass = function ( classText, classWanted ) {
        var i = 0, classArr = classText.split(/\s/);
@@ -112,8 +89,6 @@ hasClass = function ( classText, classWanted ) {
        return false;
 };
 
-expandedURLs = window.expandedURLs = undefined;
-
 window.onbeforeprint = function () {
        var allLinks, contentEl, expandedLink, expandedText, i;
 
index 06f5eba..ad7942a 100644 (file)
@@ -185,12 +185,6 @@ table {
        font-size: 100%;
 }
 
-/* Prevent citations and subscripts from interfering with the line-height */
-sup,
-sub {
-       line-height: 1;
-}
-
 /* Forms */
 fieldset {
        border: 1px solid #2f6fab;
diff --git a/skins/common/images/button_math.png b/skins/common/images/button_math.png
deleted file mode 100644 (file)
index 507e4b5..0000000
Binary files a/skins/common/images/button_math.png and /dev/null differ
index 0aa76f5..6e5f570 100644 (file)
@@ -1,18 +1 @@
-<?xml version="1.0"?>\r
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">\r
-<svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="128px" height="128px" id="RSSicon" viewBox="0 0 256 256">\r
-<defs>\r
-<linearGradient x1="0.085" y1="0.085" x2="0.915" y2="0.915" id="RSSg">\r
-<stop  offset="0.0" stop-color="#E3702D"/><stop  offset="0.1071" stop-color="#EA7D31"/>\r
-<stop  offset="0.3503" stop-color="#F69537"/><stop  offset="0.5" stop-color="#FB9E3A"/>\r
-<stop  offset="0.7016" stop-color="#EA7C31"/><stop  offset="0.8866" stop-color="#DE642B"/>\r
-<stop  offset="1.0" stop-color="#D95B29"/>\r
-</linearGradient>\r
-</defs>\r
-<rect width="256" height="256" rx="55" ry="55" x="0"  y="0"  fill="#CC5D15"/>\r
-<rect width="246" height="246" rx="50" ry="50" x="5"  y="5"  fill="#F49C52"/>\r
-<rect width="236" height="236" rx="47" ry="47" x="10" y="10" fill="url(#RSSg)"/>\r
-<circle cx="68" cy="189" r="24" fill="#FFF"/>\r
-<path d="M160 213h-34a82 82 0 0 0 -82 -82v-34a116 116 0 0 1 116 116z" fill="#FFF"/>\r
-<path d="M184 213A140 140 0 0 0 44 73 V 38a175 175 0 0 1 175 175z" fill="#FFF"/>\r
-</svg>\r
+<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 256 256"><defs><linearGradient x1=".085" y1=".085" x2=".915" y2=".915" id="a"><stop offset="0" stop-color="#E3702D"/><stop offset=".107" stop-color="#EA7D31"/><stop offset=".35" stop-color="#F69537"/><stop offset=".5" stop-color="#FB9E3A"/><stop offset=".702" stop-color="#EA7C31"/><stop offset=".887" stop-color="#DE642B"/><stop offset="1" stop-color="#D95B29"/></linearGradient></defs><rect width="256" height="256" rx="55" ry="55" fill="#CC5D15"/><rect width="246" height="246" rx="50" ry="50" x="5" y="5" fill="#F49C52"/><rect width="236" height="236" rx="47" ry="47" x="10" y="10" fill="url(#a)"/><circle cx="68" cy="189" r="24" fill="#FFF"/><path d="M160 213h-34a82 82 0 0 0-82-82v-34a116 116 0 0 1 116 116zM184 213a140 140 0 0 0-140-140v-35a175 175 0 0 1 175 175z" fill="#FFF"/></svg>
\ No newline at end of file
index 2797305..98fbe8d 100644 (file)
@@ -1,12 +1 @@
-<?xml version="1.0" encoding="utf-8"?>\r
-<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->\r
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">\r
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"\r
-        width="21.059px" height="21.06px" viewBox="0 0 21.059 21.06" enable-background="new 0 0 21.059 21.06" xml:space="preserve">\r
-<path fill="#575757" d="M10.529,0C4.715,0,0,4.714,0,10.529s4.715,10.53,10.529,10.53c5.816,0,10.529-4.715,10.529-10.53\r
-       S16.346,0,10.529,0z M10.527,16.767c-0.861,0-1.498-0.688-1.498-1.516c0-0.862,0.637-1.534,1.498-1.534c0.828,0,1.5,0.672,1.5,1.534\r
-       C12.027,16.078,11.355,16.767,10.527,16.767z M12.664,10.255c-0.723,0.568-1,0.931-1,1.739v0.5H9.459v-0.603\r
-       c0-1.517,0.449-2.136,1.154-2.688c0.707-0.552,1.139-0.845,1.139-1.637c0-0.672-0.414-1.051-1.24-1.051\r
-       c-0.707,0-1.328,0.189-1.982,0.638L7.479,5.346c0.861-0.604,1.93-1.034,3.342-1.034c1.912,0,3.516,1.051,3.516,3.066\r
-       C14.336,8.808,13.543,9.566,12.664,10.255z"/>\r
-</svg>\r
+<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="21.059" height="21.06"><path fill="#575757" d="M10.529 0c-5.814 0-10.529 4.714-10.529 10.529s4.715 10.53 10.529 10.53c5.816 0 10.529-4.715 10.529-10.53s-4.712-10.529-10.529-10.529zm-.002 16.767c-.861 0-1.498-.688-1.498-1.516 0-.862.637-1.534 1.498-1.534.828 0 1.5.672 1.5 1.534 0 .827-.672 1.516-1.5 1.516zm2.137-6.512c-.723.568-1 .931-1 1.739v.5h-2.205v-.603c0-1.517.449-2.136 1.154-2.688.707-.552 1.139-.845 1.139-1.637 0-.672-.414-1.051-1.24-1.051-.707 0-1.328.189-1.982.638l-1.051-1.807c.861-.604 1.93-1.034 3.342-1.034 1.912 0 3.516 1.051 3.516 3.066-.001 1.43-.794 2.188-1.673 2.877z"/></svg>
\ No newline at end of file
index 942cbac..6b052b3 100644 (file)
@@ -881,10 +881,8 @@ ul.mw-gallery-packed-hover li.gallerybox:hover div.gallerytextwrapper,
 ul.mw-gallery-packed-overlay li.gallerybox div.gallerytextwrapper,
 ul.mw-gallery-packed-hover li.gallerybox.mw-gallery-focused div.gallerytextwrapper {
        position:absolute;
-       opacity:.8;
-       filter:alpha(opacity=80);
-       zoom: 1;
-       background-color:white;
+       background: white;
+       background: rgba(255, 255, 255, 0.8);
        padding: 5px 10px;
        bottom: 0;
        left: 0; /* Needed for IE */
@@ -899,13 +897,6 @@ ul.mw-gallery-packed {
        text-align: center;
 }
 
-ul.mw-gallery-packed-hover div.gallerytext,
-ul.mw-gallery-packed-overlay div.gallerytext {
-       opacity: 1;
-       position: relative; /* Resets opacity in old IE */
-}
-
-
 .mw-ajax-loader {
        /* @embed */
        background-image: url(images/ajax-loader.gif);
@@ -1217,3 +1208,9 @@ table.floatleft {
 .mw-content-ltr .mw-content-rtl .mw-editsection {
        margin-right: 1em;
 }
+
+/* Prevent citations and subscripts from interfering with the line-height */
+sup,
+sub {
+       line-height: 1;
+}
index df5682e..a7ff2da 100644 (file)
@@ -6,7 +6,6 @@
                win = window,
                ua = navigator.userAgent.toLowerCase(),
                isIE6 = ( /msie ([0-9]{1,}[\.0-9]{0,})/.exec( ua ) && parseFloat( RegExp.$1 ) <= 6.0 ),
-               isGecko = /gecko/.test( ua ) && !/khtml|spoofer|netscape\/7\.0/.test( ua ),
                onloadFuncts = [];
 
 if ( mw.config.get( 'wgBreakFrames' ) ) {
@@ -18,43 +17,6 @@ if ( mw.config.get( 'wgBreakFrames' ) ) {
        }
 }
 
-/**
- * Legacy function to scroll to an id while viewing the page over a redirect.
- * Superseeded by module 'mediawiki.action.view.redirectToFragment' in version 1.23.
- * Kepted because cache can contain still inline script calls to this function.
- * Should be removed in version 1.24.
- * @deprecated since 1.23 Use mediawiki.action.view.redirectToFragment instead
- */
-mw.log.deprecate( win, 'redirectToFragment', function ( fragment ) {
-       var webKitVersion,
-               match = navigator.userAgent.match( /AppleWebKit\/(\d+)/ );
-       if ( match ) {
-               webKitVersion = parseInt( match[1], 10 );
-               if ( webKitVersion < 420 ) {
-                       // Released Safari w/ WebKit 418.9.1 messes up horribly
-                       // Nightlies of 420+ are ok
-                       return;
-               }
-       }
-       if ( !win.location.hash ) {
-               win.location.hash = fragment;
-
-               // Mozilla needs to wait until after load, otherwise the window doesn't
-               // scroll.  See <https://bugzilla.mozilla.org/show_bug.cgi?id=516293>.
-               // There's no obvious way to detect this programmatically, so we use
-               // version-testing.  If Firefox fixes the bug, they'll jump twice, but
-               // better twice than not at all, so make the fix hit future versions as
-               // well.
-               if ( isGecko ) {
-                       $( function () {
-                               if ( win.location.hash === fragment ) {
-                                       win.location.hash = fragment;
-                               }
-                       } );
-               }
-       }
-}, 'Use the module mediawiki.action.view.redirectToFragment instead.' );
-
 /**
  * User-agent sniffing.
  * To be removed in MediaWiki 1.23.
@@ -62,7 +24,7 @@ mw.log.deprecate( win, 'redirectToFragment', function ( fragment ) {
  * @deprecated since 1.17 Use jquery.client instead
  */
 
-msg = 'Use feature detection or module jquery.client instead';
+msg = 'Use feature detection or module jquery.client instead.';
 
 mw.log.deprecate( win, 'clientPC', ua, msg );
 
@@ -93,7 +55,7 @@ mw.log.deprecate( win, 'ie6_bugs', false, msg );
  *
  * @deprecated since 1.17 Use jQuery instead
  */
-msg = 'Use jQuery instead';
+msg = 'Use jQuery instead.';
 
 // Ignored dummy values
 mw.log.deprecate( win, 'doneOnloadHook', undefined, msg );
@@ -146,7 +108,7 @@ $( win ).on( 'load', function () {
  *
  * @deprecated since 1.17 Use jquery.checkboxShiftClick instead
  */
-msg = 'Use jquery.checkboxShiftClick instead';
+msg = 'Use jquery.checkboxShiftClick instead.';
 mw.log.deprecate( win, 'checkboxes', [], msg );
 mw.log.deprecate( win, 'lastCheckbox', null, msg );
 mw.log.deprecate( win, 'setupCheckboxShiftClick', $.noop, msg );
@@ -160,8 +122,8 @@ mw.log.deprecate( win, 'checkboxClickHandler', $.noop, msg );
  *
  * @deprecated since 1.17 Use mw.toolbar instead
  */
-mw.log.deprecate( win, 'mwEditButtons', [], 'Use mw.toolbar instead' );
-mw.log.deprecate( win, 'mwCustomEditButtons', [], 'Use mw.toolbar instead' );
+mw.log.deprecate( win, 'mwEditButtons', [], 'Use mw.toolbar instead.' );
+mw.log.deprecate( win, 'mwCustomEditButtons', [], 'Use mw.toolbar instead.' );
 
 /**
  * Spinner creation, injection and removal
@@ -170,8 +132,8 @@ mw.log.deprecate( win, 'mwCustomEditButtons', [], 'Use mw.toolbar instead' );
  *
  * @deprecated since 1.18 Use jquery.spinner instead
  */
-mw.log.deprecate( win, 'injectSpinner', $.noop, 'Use jquery.spinner instead' );
-mw.log.deprecate( win, 'removeSpinner', $.noop, 'Use jquery.spinner instead' );
+mw.log.deprecate( win, 'injectSpinner', $.noop, 'Use jquery.spinner instead.' );
+mw.log.deprecate( win, 'removeSpinner', $.noop, 'Use jquery.spinner instead.' );
 
 /**
  * Escape utilities
@@ -180,8 +142,8 @@ mw.log.deprecate( win, 'removeSpinner', $.noop, 'Use jquery.spinner instead' );
  *
  * @deprecated since 1.18 Use mw.html instead
  */
-mw.log.deprecate( win, 'escapeQuotes', $.noop,'Use mw.html instead' );
-mw.log.deprecate( win, 'escapeQuotesHTML', $.noop,'Use mw.html instead' );
+mw.log.deprecate( win, 'escapeQuotes', $.noop, 'Use mw.html instead.' );
+mw.log.deprecate( win, 'escapeQuotesHTML', $.noop, 'Use mw.html instead.' );
 
 /**
  * Display a message to the user
@@ -191,7 +153,7 @@ mw.log.deprecate( win, 'escapeQuotesHTML', $.noop,'Use mw.html instead' );
  * @deprecated since 1.17 Use mediawiki.notify instead
  * @param {string|HTMLElement} message To be put inside the message box
  */
-mw.log.deprecate( win, 'jsMsg', mw.util.jsMessage, 'Use mediawiki.notify instead' );
+mw.log.deprecate( win, 'jsMsg', mw.util.jsMessage, 'Use mediawiki.notify instead.' );
 
 /**
  * Misc. utilities
@@ -200,7 +162,7 @@ mw.log.deprecate( win, 'jsMsg', mw.util.jsMessage, 'Use mediawiki.notify instead
  *
  * @deprecated since 1.17 Use mediawiki.util instead
  */
-msg = 'Use mediawiki.util instead';
+msg = 'Use mediawiki.util instead.';
 mw.log.deprecate( win, 'tooltipAccessKeyPrefix', 'alt-', msg );
 mw.log.deprecate( win, 'tooltipAccessKeyRegexp', /\[(alt-)?(.)\]$/, msg );
 mw.log.deprecate( win, 'updateTooltipAccessKeys', mw.util.updateTooltipAccessKeys, msg );
index 9b8c41a..25ba301 100644 (file)
@@ -28,7 +28,6 @@ body {
 
 /* Content */
 div#content {
-       line-height: @content-line-height;
        margin-left: 10em;
        padding: @content-padding;
        /* Border on top, left, and bottom side */
@@ -131,7 +130,7 @@ pre, .mw-code {
 #bodyContent {
        position: relative;
        width: 100%;
-       line-height: 1.5em;
+       line-height: @content-line-height;
        font-size: @content-font-size;
 }
 
index 3e26a22..91388c6 100644 (file)
@@ -1,75 +1,10 @@
-// FIXME: This size of this CSS is ridiculous. Please refactor (see bug 54604)
 @import "mediawiki.mixins.less";
-
-div#content a.external {
-       background-position: center right;
-       background-repeat: no-repeat;
-       .background-image-svg('images/external-link-ltr-icon.svg', 'images/external-link-ltr-icon.png');
-       padding-right: 13px;
-}
-div#content a.external[href ^="https://"],
-.link-https {
-       background-position: center right;
-       background-repeat: no-repeat;
-       .background-image-svg('images/lock-icon.svg', 'images/lock-icon.png');
-       padding-right: 13px;
-}
-div#content a.external[href ^="mailto:"],
-.link-mailto {
-       background-position: center right;
-       background-repeat: no-repeat;
-       .background-image-svg('images/mail-icon.svg', 'images/mail-icon.png');
-       padding-right: 13px;
-}
-div#content a.external[href ^="news:"] {
-       background-position: center right;
-       background-repeat: no-repeat;
-       .background-image-svg('images/news-icon.svg', 'images/news-icon.png');
-       padding-right: 13px;
-}
-div#content a.external[href ^="ftp://"],
-.link-ftp {
-       background-position: center right;
-       background-repeat: no-repeat;
-       .background-image-svg('images/file-icon.svg', 'images/file-icon.png');
-       padding-right: 13px;
-}
-div#content a.external[href ^="irc://"],
-div#content a.external[href ^="ircs://"],
-.link-irc {
-       background-position: center right;
-       background-repeat: no-repeat;
-       .background-image-svg('images/talk-icon.svg', 'images/talk-icon.png');
-       padding-right: 13px;
-}
-div#content a.external[href $=".ogg"], div#content a.external[href $=".OGG"],
-div#content a.external[href $=".mid"], div#content a.external[href $=".MID"],
-div#content a.external[href $=".midi"], div#content a.external[href $=".MIDI"],
-div#content a.external[href $=".mp3"], div#content a.external[href $=".MP3"],
-div#content a.external[href $=".wav"], div#content a.external[href $=".WAV"],
-div#content a.external[href $=".wma"], div#content a.external[href $=".WMA"],
-.link-audio {
-       background-position: center right;
-       background-repeat: no-repeat;
-       .background-image-svg('images/audio-icon.svg', 'images/audio-icon.png');
-       padding-right: 13px;
-}
-div#content a.external[href $=".ogm"], div#content a.external[href $=".OGM"],
-div#content a.external[href $=".avi"], div#content a.external[href $=".AVI"],
-div#content a.external[href $=".mpeg"], div#content a.external[href $=".MPEG"],
-div#content a.external[href $=".mpg"], div#content a.external[href $=".MPG"],
-.link-video {
-       background-position: center right;
-       background-repeat: no-repeat;
-       .background-image-svg('images/video-icon.svg', 'images/video-icon.png');
-       padding-right: 13px;
-}
-div#content a.external[href $=".pdf"], div#content a.external[href $=".PDF"],
-div#content a.external[href *=".pdf#"], div#content a.external[href *=".PDF#"],
-div#content a.external[href *=".pdf?"], div#content a.external[href *=".PDF?"],
-.link-document {
-       background-position: center right;
-       background-repeat: no-repeat;
-       .background-image-svg('images/document-icon.svg', 'images/document-icon.png');
-       padding-right: 13px;
+// External links
+#content {
+       .external {
+               background-position: center right;
+               background-repeat: no-repeat;
+               .background-image-svg('images/external-link-ltr-icon.svg', 'images/external-link-ltr-icon.png');
+               padding-right: 13px;
+       }
 }
index 64a449f..b943caa 100644 (file)
@@ -1,33 +1 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<svg
-   xmlns:dc="http://purl.org/dc/elements/1.1/"
-   xmlns:cc="http://creativecommons.org/ns#"
-   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-   xmlns:svg="http://www.w3.org/2000/svg"
-   xmlns="http://www.w3.org/2000/svg"
-   version="1.1"
-   width="16"
-   height="16"
-   id="svg2">
-  <metadata
-     id="metadata7">
-    <rdf:RDF>
-      <cc:Work
-         rdf:about="">
-        <dc:format>image/svg+xml</dc:format>
-        <dc:type
-           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
-        <dc:title></dc:title>
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <g
-     transform="translate(0,-1036.0288)"
-     id="layer1">
-    <path
-       d="M 10.028624,3.7729932 8.1976442,6.9443424 6.3666649,3.7729932 z"
-       transform="matrix(0,-2.7307791,1.576616,0,0.05143855,1066.4148)"
-       id="path2985"
-       style="fill:#797979;fill-opacity:1;stroke:none" />
-  </g>
-</svg>
+<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="16" height="16"><path d="M6.001 2.998l5.001 5-5.001 5z" fill="#797979"/></svg>
\ No newline at end of file
index 938494b..5faf356 100644 (file)
@@ -1,33 +1 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<svg
-   xmlns:dc="http://purl.org/dc/elements/1.1/"
-   xmlns:cc="http://creativecommons.org/ns#"
-   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-   xmlns:svg="http://www.w3.org/2000/svg"
-   xmlns="http://www.w3.org/2000/svg"
-   version="1.1"
-   width="16"
-   height="16"
-   id="svg2">
-  <metadata
-     id="metadata7">
-    <rdf:RDF>
-      <cc:Work
-         rdf:about="">
-        <dc:format>image/svg+xml</dc:format>
-        <dc:type
-           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
-        <dc:title></dc:title>
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <g
-     transform="translate(0,-1036.0288)"
-     id="layer1">
-    <path
-       d="M 10.028624,3.7729932 8.1976442,6.9443424 6.3666649,3.7729932 z"
-       transform="matrix(0,2.7307791,-1.576616,0,15.948561,1021.6428)"
-       id="path2985"
-       style="fill:#797979;fill-opacity:1;stroke:none" />
-  </g>
-</svg>
+<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="16" height="16"><path d="M9.999 13.002l-5.001-5 5.001-5z" fill="#797979"/></svg>
\ No newline at end of file
index be1ad89..826c280 100644 (file)
@@ -1,33 +1 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<svg
-   xmlns:dc="http://purl.org/dc/elements/1.1/"
-   xmlns:cc="http://creativecommons.org/ns#"
-   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-   xmlns:svg="http://www.w3.org/2000/svg"
-   xmlns="http://www.w3.org/2000/svg"
-   version="1.1"
-   width="22"
-   height="16"
-   id="svg2">
-  <metadata
-     id="metadata7">
-    <rdf:RDF>
-      <cc:Work
-         rdf:about="">
-        <dc:format>image/svg+xml</dc:format>
-        <dc:type
-           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
-        <dc:title></dc:title>
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <g
-     transform="translate(0,-1036.3622)"
-     id="layer1">
-    <path
-       d="M 10.028624,3.7729932 8.1976442,6.9443424 6.3666649,3.7729932 z"
-       transform="matrix(2.7307791,0,0,1.576616,-11.885956,1036.4136)"
-       id="path2985"
-       style="fill:#929292;fill-opacity:1;stroke:none" />
-  </g>
-</svg>
+<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="22" height="16"><path d="M15.502 6.001l-5 5.001-5-5.001z" fill="#929292"/></svg>
\ No newline at end of file
index a991501..8e31b2f 100644 (file)
@@ -1,33 +1 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<svg
-   xmlns:dc="http://purl.org/dc/elements/1.1/"
-   xmlns:cc="http://creativecommons.org/ns#"
-   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-   xmlns:svg="http://www.w3.org/2000/svg"
-   xmlns="http://www.w3.org/2000/svg"
-   version="1.1"
-   width="22"
-   height="16"
-   id="svg2">
-  <metadata
-     id="metadata7">
-    <rdf:RDF>
-      <cc:Work
-         rdf:about="">
-        <dc:format>image/svg+xml</dc:format>
-        <dc:type
-           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
-        <dc:title></dc:title>
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <g
-     transform="translate(0,-1036.3622)"
-     id="layer1">
-    <path
-       d="M 10.028624,3.7729932 8.1976442,6.9443424 6.3666649,3.7729932 z"
-       transform="matrix(2.7307791,0,0,1.576616,-11.885956,1036.4136)"
-       id="path2985"
-       style="fill:#797979;fill-opacity:1;stroke:none" />
-  </g>
-</svg>
+<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="22" height="16"><path d="M15.502 6.001l-5 5.001-5-5.001z" fill="#797979"/></svg>
\ No newline at end of file
index a1b58e5..e744ec3 100644 (file)
@@ -1,33 +1 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<svg
-   xmlns:dc="http://purl.org/dc/elements/1.1/"
-   xmlns:cc="http://creativecommons.org/ns#"
-   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-   xmlns:svg="http://www.w3.org/2000/svg"
-   xmlns="http://www.w3.org/2000/svg"
-   version="1.1"
-   width="16"
-   height="16"
-   id="svg2">
-  <metadata
-     id="metadata7">
-    <rdf:RDF>
-      <cc:Work
-         rdf:about="">
-        <dc:format>image/svg+xml</dc:format>
-        <dc:type
-           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
-        <dc:title></dc:title>
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <g
-     transform="translate(0,-1036.3622)"
-     id="layer1">
-    <path
-       d="M 10.028624,3.7729932 8.1976442,6.9443424 6.3666649,3.7729932 z"
-       transform="matrix(2.7307791,0,0,1.576616,-14.385956,1036.4136)"
-       id="path2985"
-       style="fill:#797979;fill-opacity:1;stroke:none" />
-  </g>
-</svg>
+<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="16" height="16"><path d="M13.002 6.001l-5 5.001-5-5.001z" fill="#797979"/></svg>
\ No newline at end of file
diff --git a/skins/vector/images/audio-icon.png b/skins/vector/images/audio-icon.png
deleted file mode 100644 (file)
index 5a1d2f4..0000000
Binary files a/skins/vector/images/audio-icon.png and /dev/null differ
diff --git a/skins/vector/images/audio-icon.svg b/skins/vector/images/audio-icon.svg
deleted file mode 100644 (file)
index 91ca5c4..0000000
+++ /dev/null
@@ -1,56 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<svg
-   xmlns:dc="http://purl.org/dc/elements/1.1/"
-   xmlns:cc="http://creativecommons.org/ns#"
-   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-   xmlns:svg="http://www.w3.org/2000/svg"
-   xmlns="http://www.w3.org/2000/svg"
-   xmlns:xlink="http://www.w3.org/1999/xlink"
-   version="1.1"
-   width="10"
-   height="10"
-   id="svg6167">
-  <defs
-     id="defs6169">
-    <linearGradient
-       id="linearGradient6707">
-      <stop
-         id="stop6709"
-         style="stop-color:#b2bf46;stop-opacity:1"
-         offset="0" />
-      <stop
-         id="stop6711"
-         style="stop-color:#c8d17b;stop-opacity:1"
-         offset="1" />
-    </linearGradient>
-    <linearGradient
-       x1="22.262903"
-       y1="9.1418257"
-       x2="22.262903"
-       y2="5.3889236"
-       id="linearGradient6713"
-       xlink:href="#linearGradient6707"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(0.96979296,0,0,0.96979296,858.75554,710.2631)" />
-  </defs>
-  <metadata
-     id="metadata6172">
-    <rdf:RDF>
-      <cc:Work
-         rdf:about="">
-        <dc:format>image/svg+xml</dc:format>
-        <dc:type
-           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
-        <dc:title></dc:title>
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <g
-     transform="translate(-877.85712,-710.2193)"
-     id="layer1">
-    <path
-       d="m 880.63649,710.74799 0,5.78845 c -0.30291,0.0337 -0.60613,0.10534 -0.90918,0.24245 -1.08747,0.49204 -1.62536,1.48002 -1.21224,2.21234 0.41311,0.73233 1.60977,0.91632 2.69723,0.42429 0.87694,-0.39677 1.37959,-1.10894 1.33347,-1.75775 l 0,-0.15153 0,-3.81856 2.93968,0 0,2.84876 c -0.30894,0.0309 -0.62965,0.10227 -0.93948,0.24245 -1.07493,0.48636 -1.6206,1.48846 -1.21225,2.21234 0.40836,0.72389 1.59201,0.91065 2.66694,0.42429 0.87404,-0.39547 1.38893,-1.11233 1.33346,-1.75775 l 0,-0.15153 0,-6.75825 -6.69763,0 z"
-       id="path6186"
-       style="fill:url(#linearGradient6713);fill-opacity:1;stroke:#757f2a;stroke-width:0.96979296px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
-  </g>
-</svg>
diff --git a/skins/vector/images/document-icon.png b/skins/vector/images/document-icon.png
deleted file mode 100644 (file)
index 4d56572..0000000
Binary files a/skins/vector/images/document-icon.png and /dev/null differ
diff --git a/skins/vector/images/document-icon.svg b/skins/vector/images/document-icon.svg
deleted file mode 100644 (file)
index fd05df8..0000000
+++ /dev/null
@@ -1,69 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<svg
-   xmlns:dc="http://purl.org/dc/elements/1.1/"
-   xmlns:cc="http://creativecommons.org/ns#"
-   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-   xmlns:svg="http://www.w3.org/2000/svg"
-   xmlns="http://www.w3.org/2000/svg"
-   xmlns:xlink="http://www.w3.org/1999/xlink"
-   version="1.1"
-   width="10"
-   height="10"
-   id="svg7339">
-  <defs
-     id="defs7341">
-    <linearGradient
-       id="linearGradient7918">
-      <stop
-         id="stop7920"
-         style="stop-color:#e2e2e2;stop-opacity:1"
-         offset="0" />
-      <stop
-         id="stop7922"
-         style="stop-color:#f8f8f8;stop-opacity:1"
-         offset="1" />
-    </linearGradient>
-    <radialGradient
-       cx="-16.71875"
-       cy="3.344311"
-       r="2"
-       fx="-16.71875"
-       fy="3.344311"
-       id="radialGradient7968"
-       xlink:href="#linearGradient7918"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(1.4065972,0,0,2.1428629,810.35359,682.73485)" />
-  </defs>
-  <metadata
-     id="metadata7344">
-    <rdf:RDF>
-      <cc:Work
-         rdf:about="">
-        <dc:format>image/svg+xml</dc:format>
-        <dc:type
-           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
-        <dc:title></dc:title>
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <g
-     transform="translate(-783.57141,-687.36218)"
-     id="layer1">
-    <path
-       d="m 785.05579,687.85437 0,9.09375 7.03125,0 0,-6.84375 -2.25,-2.25 -4.78125,0 z"
-       id="rect7358"
-       style="fill:#ffffff;fill-opacity:1;stroke:#878787;stroke-width:0.89999998;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
-    <path
-       d="m 786.52454,689.44812 0,6.09375 4,0 0,-5.28125 -0.84375,0 0,-0.8125 -3.15625,0 z"
-       id="rect7896"
-       style="fill:url(#radialGradient7968);fill-opacity:1;stroke:none" />
-    <path
-       d="m 790.33911,693.22626 c -0.0498,0.19786 0.33032,0.17787 0.003,0.27815 -0.16998,0.24799 0.39939,0.51157 -0.0311,0.38026 -0.0547,-0.17272 -0.19121,-0.57992 0.0276,-0.65857 m -0.23638,0.40635 c -0.1524,0.0463 -0.6328,0.0553 -0.24172,0.21827 0.48594,0.05 -0.34395,0.2177 -0.26091,-0.17076 -0.08,-0.37141 0.5251,-0.43406 0.50275,-0.0476 m -0.0898,-0.0264 c 0.0121,-0.34938 -0.523,0.0801 -0.0661,1.6e-4 0.022,-3e-5 0.0441,-7e-5 0.0661,-1e-4 M 789.086,693.4864 c 0.29829,-0.46808 0.54605,0.50739 0.27992,0.36129 0.16156,-0.25017 -0.25661,-0.58879 -0.25488,-0.19318 0.0618,0.20786 -0.16306,0.36284 -0.0814,0.0576 0.0107,-0.40895 -0.3951,-0.2098 -0.28228,0.0968 -0.10398,0.30793 -0.19195,-0.59656 0.0363,-0.38389 0.11037,-0.0424 0.2633,-0.11931 0.3025,0.062 m -0.79072,0.16676 c -0.35692,-0.0559 0.0391,0.45637 0.0912,0.0607 0.0111,-0.0474 -0.0478,-0.0975 -0.0913,-0.0606 m 0.1792,-0.0371 c 0.0389,0.27609 4.8e-4,0.31202 -0.23096,0.30993 -0.40958,0.0339 -0.12848,-0.45975 0.12931,-0.3933 -0.0182,-0.14721 -0.50917,-0.032 -0.16875,-0.16893 0.13714,-0.0119 0.30604,0.0969 0.27048,0.25186 m -1.04972,-0.38964 c -0.0498,0.19787 0.33033,0.17786 0.003,0.27815 -0.16997,0.24801 0.39941,0.51157 -0.0312,0.38026 -0.0548,-0.17265 -0.1912,-0.5799 0.0275,-0.65857 m -0.36616,0.15537 c 0.24316,0.0804 0.005,0.86043 -0.008,0.29992 0.004,-0.10008 0.0106,-0.19944 0.008,-0.29992 z m 0,-0.21289 c 0.22907,-0.0248 -0.0564,0.25715 0,0 z m -0.17285,0.229 c -0.0882,0.10339 -0.47525,0.0905 -0.12796,0.20033 0.32998,0.11579 -0.0901,0.56917 -0.25377,0.26243 0.35714,0.0875 0.26894,-0.20613 0.0291,-0.26075 -0.0991,-0.20406 0.219,-0.31306 0.35275,-0.20238 m 2.10283,-1.18179 c -0.31133,-0.19291 -0.2311,0.78642 -0.32232,0.2231 -0.003,-0.21834 -0.0409,-0.33207 0.20367,-0.28984 0.0532,-0.0761 0.16542,-0.007 0.1188,0.0663 m -0.71625,-0.0206 c -0.45977,0.0927 0.20216,0.73875 0.1549,0.16183 -0.008,-0.0784 -0.0689,-0.16424 -0.1549,-0.16175 m 0,-0.0762 c 0.53548,0.0229 0.0809,0.95772 -0.22515,0.4264 -0.0799,-0.16794 0.006,-0.44314 0.22515,-0.4264 z m -0.48925,-0.19976 c 0.18272,0.15398 0.0847,0.54861 0.0579,0.75376 -0.12668,-0.16038 -0.0274,-0.52657 -0.0579,-0.75376 z m -0.39942,0.27588 c -0.45976,0.0927 0.20217,0.73874 0.15491,0.16183 -0.008,-0.0784 -0.0689,-0.16425 -0.15491,-0.16175 m 0,-0.0762 c 0.53548,0.0229 0.0809,0.95772 -0.22514,0.4264 -0.0799,-0.16793 0.006,-0.44314 0.22514,-0.4264 z m -0.4868,0.0961 c -0.0625,-0.16476 0.0794,-0.45885 0.09,-0.12059 -0.0239,0.26428 0.11747,0.64725 -0.22523,0.59616 -0.43366,0.0367 -0.28113,-0.79293 0.1054,-0.51731 l 0.0299,0.0419 m -0.30616,0.19092 c 0.047,0.51755 0.63135,-0.23866 0.10766,-0.19898 -0.0793,0.0264 -0.13034,0.11753 -0.10766,0.19898 z m 2.44043,-1.41901 c 0.29826,-0.46803 0.54607,0.50725 0.27992,0.36136 0.16147,-0.25014 -0.25659,-0.58875 -0.25486,-0.19318 0.0619,0.20787 -0.16304,0.36286 -0.0814,0.0576 0.0107,-0.40895 -0.3951,-0.2098 -0.28228,0.0968 -0.10398,0.30793 -0.19195,-0.59655 0.0362,-0.3839 0.11037,-0.0424 0.26328,-0.11929 0.30249,0.062 m -1.07,0.22585 c -0.0292,-0.18312 0.0291,-0.522 0.10111,-0.12385 -0.10501,0.40792 0.38701,0.2743 0.27403,-0.0627 0.0564,-0.3908 0.20452,0.56128 -0.0268,0.36504 -0.17034,0.0747 -0.37234,0.0484 -0.34922,-0.17885 m -0.16355,-0.31494 c -0.0882,0.10339 -0.47525,0.0905 -0.12796,0.20033 0.32998,0.11579 -0.0901,0.56917 -0.25377,0.26243 0.35714,0.0875 0.26894,-0.20613 0.0291,-0.26075 -0.0991,-0.20406 0.219,-0.31306 0.35275,-0.20238 m -0.89668,0.44906 c 0.0709,0.22245 -0.11848,0.41831 -0.0905,0.067 -0.0102,-0.29611 -0.0793,-0.68343 0.34185,-0.49802 0.37303,0.11125 0.0193,0.78296 -0.25134,0.43095 m 0.30567,-0.19091 c -0.0477,-0.51709 -0.63035,0.23885 -0.1077,0.199 0.0793,-0.0265 0.1303,-0.11753 0.1077,-0.199 z m -0.66993,-0.2739 c 0.24336,0.0802 0.006,0.86052 -0.008,0.29994 0.004,-0.10009 0.0107,-0.19945 0.008,-0.29994 z m 0,-0.21289 c 0.22926,-0.0249 -0.0564,0.25727 0,0 z m 2.58203,-0.93213 c 0.29827,-0.46803 0.54607,0.50727 0.27992,0.36136 0.16146,-0.25013 -0.25657,-0.58874 -0.25484,-0.19316 0.0618,0.20786 -0.16306,0.36284 -0.0814,0.0576 0.0107,-0.40895 -0.3951,-0.2098 -0.28228,0.0968 -0.10398,0.30793 -0.19195,-0.59655 0.0363,-0.38389 0.11037,-0.0424 0.26329,-0.11932 0.30249,0.062 m -0.57342,0.14577 c -0.15244,0.0463 -0.6328,0.0553 -0.24172,0.21831 0.48594,0.0499 -0.34396,0.21764 -0.26091,-0.1708 -0.08,-0.37142 0.52507,-0.43399 0.50275,-0.0476 m -0.0898,-0.0264 c 0.0121,-0.34938 -0.52298,0.0801 -0.066,1.6e-4 0.022,-3e-5 0.0441,-7e-5 0.0661,-10e-5 m -0.4519,-0.14058 c -0.31132,-0.1929 -0.23109,0.78642 -0.32231,0.2231 -0.003,-0.21839 -0.0409,-0.33204 0.20369,-0.28978 0.0533,-0.0761 0.16541,-0.007 0.11871,0.0664 m -0.71627,-0.0206 c -0.45977,0.0927 0.20216,0.73875 0.1549,0.16183 -0.008,-0.0784 -0.0689,-0.16424 -0.1549,-0.16175 m 0,-0.0762 c 0.53548,0.0229 0.0809,0.95772 -0.22514,0.4264 -0.0799,-0.16794 0.006,-0.44314 0.22514,-0.4264 z m -0.74706,-0.169 c 0.25031,0.19128 -0.10354,0.79515 0.43395,0.67146 -0.24652,0.23651 -0.54896,-0.0523 -0.43399,-0.36033 0,-0.10371 0,-0.20743 0,-0.31114"
-       id="path3041"
-       style="fill:#000000;fill-opacity:1;stroke:none" />
-    <path
-       d="m 789.74329,687.77624 0,2.35938 2.34375,0"
-       id="path7894"
-       style="fill:none;stroke:#878787;stroke-width:0.89999998;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
-  </g>
-</svg>
index 3918bef..5969d03 100644 (file)
@@ -1,47 +1 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<svg
-   xmlns:dc="http://purl.org/dc/elements/1.1/"
-   xmlns:cc="http://creativecommons.org/ns#"
-   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-   xmlns:svg="http://www.w3.org/2000/svg"
-   xmlns="http://www.w3.org/2000/svg"
-   version="1.1"
-   width="10"
-   height="10"
-   id="svg2">
-  <metadata
-     id="metadata7">
-    <rdf:RDF>
-      <cc:Work
-         rdf:about="">
-        <dc:format>image/svg+xml</dc:format>
-        <dc:type
-           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
-        <dc:title></dc:title>
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <g
-     transform="translate(-826.42859,-698.79077)"
-     id="layer1">
-    <rect
-       width="5.9821429"
-       height="5.9821429"
-       x="826.92859"
-       y="702.30865"
-       id="rect2996"
-       style="fill:#ffffff;fill-opacity:1;stroke:#0066cc;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
-    <g
-       transform="matrix(0.70710678,0.70710678,-0.70710678,0.70710678,762.87,-359.88339)"
-       id="g4815">
-      <path
-         d="m 796.90819,700.28317 3.70127,-3.70126 3.81174,3.81175 -0.0189,2.20336 -1.85234,0 0,3.8543 -3.80233,0 0,-3.97108 -1.8536,0 z"
-         id="path4777"
-         style="fill:#0066ff;fill-opacity:1;stroke:none" />
-      <path
-         d="m 800.60946,698.00244 3.46986,3.43865 -2.5702,0 0,4.07436 -1.7362,0 0,-4.07436 -2.61754,-3.6e-4 z"
-         id="path4779"
-         style="fill:#ffffff;fill-opacity:1;stroke:none" />
-    </g>
-  </g>
-</svg>
+<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="10" height="10"><g transform="translate(-826.429 -698.791)"><rect width="5.982" height="5.982" x="826.929" y="702.309" fill="#fff" stroke="#06c"/><g><path d="M831.194 698.791h5.234v5.391l-1.571 1.545-1.31-1.31-2.725 2.725-2.689-2.689 2.808-2.808-1.311-1.311z" fill="#06f"/><path d="M835.424 699.795l.022 4.885-1.817-1.817-2.881 2.881-1.228-1.228 2.881-2.881-1.851-1.851z" fill="#fff"/></g></g></svg>
\ No newline at end of file
index 326a425..75a7025 100644 (file)
@@ -1,50 +1 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-
-<svg
-   xmlns:dc="http://purl.org/dc/elements/1.1/"
-   xmlns:cc="http://creativecommons.org/ns#"
-   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-   xmlns:svg="http://www.w3.org/2000/svg"
-   xmlns="http://www.w3.org/2000/svg"
-   version="1.1"
-   width="10"
-   height="10"
-   id="svg2">
-  <metadata
-     id="metadata7">
-    <rdf:RDF>
-      <cc:Work
-         rdf:about="">
-        <dc:format>image/svg+xml</dc:format>
-        <dc:type
-           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
-        <dc:title></dc:title>
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <g
-     transform="translate(-826.42859,-698.79077)"
-     id="layer1">
-    <rect
-       width="5.9821429"
-       height="5.9821429"
-       x="-835.92859"
-       y="702.30865"
-       transform="scale(-1,1)"
-       id="rect2996"
-       style="fill:#ffffff;fill-opacity:1;stroke:#0066cc;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
-    <g
-       transform="matrix(-0.70710678,0.70710678,0.70710678,0.70710678,899.98717,-359.88339)"
-       id="g4815">
-      <path
-         d="m 796.90819,700.28317 3.70127,-3.70126 3.81174,3.81175 -0.0189,2.20336 -1.85234,0 0,3.8543 -3.80233,0 0,-3.97108 -1.8536,0 z"
-         id="path4777"
-         style="fill:#0066ff;fill-opacity:1;stroke:none" />
-      <path
-         d="m 800.60946,698.00244 3.46986,3.43865 -2.5702,0 0,4.07436 -1.7362,0 0,-4.07436 -2.61754,-3.6e-4 z"
-         id="path4779"
-         style="fill:#ffffff;fill-opacity:1;stroke:none" />
-    </g>
-  </g>
-</svg>
+<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="10" height="10"><g transform="translate(-826.429 -698.791)"><rect width="5.982" height="5.982" x="-835.929" y="702.309" transform="scale(-1 1)" fill="#fff" stroke="#06c"/><g><path d="M831.663 698.791h-5.234v5.391l1.571 1.545 1.31-1.31 2.725 2.725 2.689-2.689-2.808-2.808 1.311-1.311z" fill="#06f"/><path d="M827.433 699.795l-.022 4.885 1.817-1.817 2.881 2.881 1.228-1.228-2.881-2.881 1.851-1.851z" fill="#fff"/></g></g></svg>
\ No newline at end of file
diff --git a/skins/vector/images/file-icon.png b/skins/vector/images/file-icon.png
deleted file mode 100644 (file)
index ed24669..0000000
Binary files a/skins/vector/images/file-icon.png and /dev/null differ
diff --git a/skins/vector/images/file-icon.svg b/skins/vector/images/file-icon.svg
deleted file mode 100644 (file)
index 98d9041..0000000
+++ /dev/null
@@ -1,72 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<svg
-   xmlns:dc="http://purl.org/dc/elements/1.1/"
-   xmlns:cc="http://creativecommons.org/ns#"
-   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-   xmlns:svg="http://www.w3.org/2000/svg"
-   xmlns="http://www.w3.org/2000/svg"
-   xmlns:xlink="http://www.w3.org/1999/xlink"
-   version="1.1"
-   width="10"
-   height="10"
-   id="svg7339">
-  <defs
-     id="defs7341">
-    <linearGradient
-       id="linearGradient7918">
-      <stop
-         id="stop7920"
-         style="stop-color:#e2e2e2;stop-opacity:1"
-         offset="0" />
-      <stop
-         id="stop7922"
-         style="stop-color:#f8f8f8;stop-opacity:1"
-         offset="1" />
-    </linearGradient>
-    <radialGradient
-       cx="-16.71875"
-       cy="3.344311"
-       r="2"
-       fx="-16.71875"
-       fy="3.344311"
-       id="radialGradient7931"
-       xlink:href="#linearGradient7918"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(1.4065972,0,0,2.1428629,6.7977966,-4.7132748)" />
-  </defs>
-  <metadata
-     id="metadata7344">
-    <rdf:RDF>
-      <cc:Work
-         rdf:about="">
-        <dc:format>image/svg+xml</dc:format>
-        <dc:type
-           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
-        <dc:title></dc:title>
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <g
-     transform="translate(-783.57141,-687.36218)"
-     id="layer1">
-    <g
-       transform="translate(19.984375,0.08593751)"
-       id="g7926">
-      <path
-         d="m -18.5,0.40625 0,9.09375 7.03125,0 0,-6.84375 -2.25,-2.25 -4.78125,0 z"
-         transform="translate(783.57141,687.36218)"
-         id="rect7358"
-         style="fill:#ffffff;fill-opacity:1;stroke:#878787;stroke-width:0.89999998;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
-      <path
-         d="m -17.03125,2 0,6.09375 4,0 0,-5.28125 -0.84375,0 0,-0.8125 -3.15625,0 z"
-         transform="translate(783.57141,687.36218)"
-         id="rect7896"
-         style="fill:url(#radialGradient7931);fill-opacity:1;stroke:none" />
-      <path
-         d="m -13.8125,0.32812497 0,2.35937503 2.34375,0"
-         transform="translate(783.57141,687.36218)"
-         id="path7894"
-         style="fill:none;stroke:#878787;stroke-width:0.89999998;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
-    </g>
-  </g>
-</svg>
diff --git a/skins/vector/images/lock-icon.png b/skins/vector/images/lock-icon.png
deleted file mode 100644 (file)
index a9ba8a7..0000000
Binary files a/skins/vector/images/lock-icon.png and /dev/null differ
diff --git a/skins/vector/images/lock-icon.svg b/skins/vector/images/lock-icon.svg
deleted file mode 100644 (file)
index bad5daf..0000000
+++ /dev/null
@@ -1,73 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<svg
-   xmlns:dc="http://purl.org/dc/elements/1.1/"
-   xmlns:cc="http://creativecommons.org/ns#"
-   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-   xmlns:svg="http://www.w3.org/2000/svg"
-   xmlns="http://www.w3.org/2000/svg"
-   xmlns:xlink="http://www.w3.org/1999/xlink"
-   version="1.1"
-   width="10"
-   height="10"
-   id="svg3813">
-  <defs
-     id="defs3815">
-    <linearGradient
-       id="linearGradient4348">
-      <stop
-         id="stop4350"
-         style="stop-color:#fff8bb;stop-opacity:1"
-         offset="0" />
-      <stop
-         id="stop4352"
-         style="stop-color:#e9d84d;stop-opacity:1"
-         offset="1" />
-    </linearGradient>
-    <radialGradient
-       cx="806.97711"
-       cy="720.04266"
-       r="4.5721774"
-       fx="806.97711"
-       fy="720.04266"
-       id="radialGradient4394"
-       xlink:href="#linearGradient4348"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(0.66177697,-3.2424834e-7,5.5632116e-7,1.1354276,273.09596,-96.976308)" />
-  </defs>
-  <metadata
-     id="metadata3818">
-    <rdf:RDF>
-      <cc:Work
-         rdf:about="">
-        <dc:format>image/svg+xml</dc:format>
-        <dc:type
-           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
-        <dc:title></dc:title>
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <g
-     transform="translate(-817.85712,-715.93359)"
-     id="layer1">
-    <g
-       transform="translate(14.984745,-0.12063576)"
-       id="g4389">
-      <rect
-         width="8.1443548"
-         height="6.0609155"
-         x="803.37238"
-         y="719.4939"
-         id="rect3832"
-         style="fill:url(#radialGradient4394);fill-opacity:1;stroke:#888a85;stroke-width:1;stroke-linejoin:round;stroke-miterlimit:2;stroke-opacity:1;stroke-dasharray:none" />
-      <path
-         d="m 2.4622467,2.0134813 a 2.9673231,1.420527 0 0 1 5.9346461,10e-8 l -2.9673231,0 z"
-         transform="matrix(0.98668274,0,0,2.0515802,802.05109,715.32099)"
-         id="path4346"
-         style="fill:none;stroke:#888a85;stroke-width:0.68014622;stroke-linejoin:miter;stroke-miterlimit:2;stroke-opacity:1;stroke-dasharray:none" />
-      <path
-         d="m 807.32587,723.57494 0,-1.12645"
-         id="path4368"
-         style="fill:none;stroke:#ac5f08;stroke-width:1.04513526px;stroke-linecap:square;stroke-linejoin:miter;stroke-opacity:0.69072164" />
-    </g>
-  </g>
-</svg>
diff --git a/skins/vector/images/mail-icon.png b/skins/vector/images/mail-icon.png
deleted file mode 100644 (file)
index 0d93a2f..0000000
Binary files a/skins/vector/images/mail-icon.png and /dev/null differ
diff --git a/skins/vector/images/mail-icon.svg b/skins/vector/images/mail-icon.svg
deleted file mode 100644 (file)
index cab6304..0000000
+++ /dev/null
@@ -1,69 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<svg
-   xmlns:dc="http://purl.org/dc/elements/1.1/"
-   xmlns:cc="http://creativecommons.org/ns#"
-   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-   xmlns:svg="http://www.w3.org/2000/svg"
-   xmlns="http://www.w3.org/2000/svg"
-   xmlns:xlink="http://www.w3.org/1999/xlink"
-   version="1.1"
-   width="10"
-   height="10"
-   id="svg4396">
-  <defs
-     id="defs4398">
-    <linearGradient
-       id="linearGradient4947">
-      <stop
-         id="stop4949"
-         style="stop-color:#d2d2d2;stop-opacity:1"
-         offset="0" />
-      <stop
-         id="stop4951"
-         style="stop-color:#f6f6f6;stop-opacity:0"
-         offset="1" />
-    </linearGradient>
-    <radialGradient
-       cx="861.14233"
-       cy="699.01233"
-       r="4.9871311"
-       fx="861.14233"
-       fy="699.01233"
-       id="radialGradient4962"
-       xlink:href="#linearGradient4947"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(1.1817158,0,0,1.1856764,-156.48316,-109.77743)" />
-  </defs>
-  <metadata
-     id="metadata4401">
-    <rdf:RDF>
-      <cc:Work
-         rdf:about="">
-        <dc:format>image/svg+xml</dc:format>
-        <dc:type
-           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
-        <dc:title></dc:title>
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <g
-     transform="translate(-832.14288,-690.2193)"
-     id="layer1">
-    <g
-       transform="translate(-23.99948,-20.005085)"
-       id="g4957">
-      <path
-         d="m 856.64003,714.98211 4.51344,-4.27677 4.49122,4.2557 0,4.78239 -8.96019,0 z"
-         id="path4415"
-         style="fill:url(#radialGradient4962);fill-opacity:1;stroke:#888a85;stroke-width:0.96960205px;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" />
-      <path
-         d="m 858.18557,715.14414 2.96409,-2.80866 2.94949,2.79482"
-         id="path4937"
-         style="fill:#a8a7a3;fill-opacity:1;stroke:none" />
-      <path
-         d="m 857.89337,719.26617 3.26025,-3.14859 3.23877,3.11734 -3.24112,-1.90625 z"
-         id="path4955"
-         style="fill:#888a85;fill-opacity:1;stroke:none" />
-    </g>
-  </g>
-</svg>
diff --git a/skins/vector/images/news-icon.png b/skins/vector/images/news-icon.png
deleted file mode 100644 (file)
index 6f27054..0000000
Binary files a/skins/vector/images/news-icon.png and /dev/null differ
diff --git a/skins/vector/images/news-icon.svg b/skins/vector/images/news-icon.svg
deleted file mode 100644 (file)
index e5514a7..0000000
+++ /dev/null
@@ -1,67 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<svg
-   xmlns:dc="http://purl.org/dc/elements/1.1/"
-   xmlns:cc="http://creativecommons.org/ns#"
-   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-   xmlns:svg="http://www.w3.org/2000/svg"
-   xmlns="http://www.w3.org/2000/svg"
-   xmlns:xlink="http://www.w3.org/1999/xlink"
-   version="1.1"
-   width="10"
-   height="10"
-   id="svg4983">
-  <defs
-     id="defs4985">
-    <linearGradient
-       id="linearGradient5528">
-      <stop
-         id="stop5530"
-         style="stop-color:#cccccc;stop-opacity:1"
-         offset="0" />
-      <stop
-         id="stop5532"
-         style="stop-color:#cccccc;stop-opacity:0"
-         offset="1" />
-    </linearGradient>
-    <linearGradient
-       x1="902.61218"
-       y1="696.32751"
-       x2="902.61218"
-       y2="694.04303"
-       id="linearGradient3824"
-       xlink:href="#linearGradient5528"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="translate(-19.98763,0.00341)" />
-  </defs>
-  <metadata
-     id="metadata4988">
-    <rdf:RDF>
-      <cc:Work
-         rdf:about="">
-        <dc:format>image/svg+xml</dc:format>
-        <dc:type
-           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
-        <dc:title></dc:title>
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <g
-     transform="translate(-877.85712,-687.36218)"
-     id="layer1">
-    <path
-       d="m 885.19659,693.70929 c 0.18733,0.11152 0.2171,0.58028 0.28483,0.0765 0.21963,-0.21 0.25265,0.61085 0.31801,0.0641 0.27697,-0.42352 -0.0831,0.827 -0.17686,0.17405 -0.11702,-0.43251 -0.13186,0.58055 -0.33199,0.093 -0.0467,-0.13235 -0.0352,-0.27894 -0.0941,-0.40765 m -0.0951,0.25098 c -0.24545,-0.026 -0.58057,0.20963 -0.14983,0.20815 0.2341,0.24227 -0.5966,0.0435 -0.31586,-0.29597 0.073,-0.29368 0.48945,-0.19996 0.46582,0.0878 m -0.0898,-0.0264 c -0.008,-0.37273 -0.57907,0.10308 -3e-5,6e-5 m -1.12221,-0.4067 c 0.31303,-0.0182 0.47686,0.98363 0.45605,0.28209 0.0542,-0.83126 0.27546,1.00617 -0.15278,0.25362 -0.0894,-0.27779 -0.27195,-0.54907 -0.20757,-0.0888 -0.0326,0.82392 -0.13826,-0.33361 -0.0957,-0.44691 z m 1.30713,-1.84131 c 0.18733,0.11152 0.2171,0.58028 0.28483,0.0765 0.21963,-0.21 0.25265,0.61085 0.31801,0.0641 0.27697,-0.42352 -0.0831,0.827 -0.17686,0.17405 -0.11703,-0.43249 -0.13186,0.58055 -0.33199,0.093 -0.0467,-0.13235 -0.0352,-0.27894 -0.0941,-0.40765 m -0.0951,0.25098 c -0.24545,-0.026 -0.58058,0.20964 -0.14984,0.20816 0.23409,0.24222 -0.5966,0.0434 -0.31584,-0.29607 0.0729,-0.29368 0.48945,-0.19997 0.46581,0.0877 m -0.0898,-0.0264 c -0.008,-0.37272 -0.57905,0.1031 -3e-5,7e-5 m -1.12221,-0.40661 c 0.31303,-0.0182 0.47685,0.98364 0.45605,0.2821 0.0542,-0.83128 0.27546,1.00616 -0.15278,0.25361 -0.0894,-0.27779 -0.27195,-0.54907 -0.20757,-0.0888 -0.0326,0.82392 -0.13826,-0.33361 -0.0957,-0.44691 z m 1.40695,-2.02159 c -0.0925,0.22919 -0.31156,0.57023 0.14418,0.41318 -0.005,-0.13405 -0.10264,-0.27877 -0.14418,-0.41318 z m -0.0704,-0.11269 c 0.29905,0.0855 0.42028,0.62166 0.42088,0.84191 -0.13411,-0.4802 -0.68425,-0.0265 -0.73057,-0.076 0.0832,-0.2616 0.21061,-0.50913 0.3096,-0.76593 m -1.74281,0.31056 c 0.34612,-0.47913 0.56926,0.70098 0.21372,0.36363 0.0724,-0.32969 -0.28365,-0.36875 -0.1668,-0.0222 -0.26673,0.45246 -0.17742,-0.6565 -0.3994,-0.10395 -0.0864,0.678 -0.43164,-0.63601 0.14263,-0.31419 0.0903,0.008 0.17045,-0.0312 0.20982,0.0769 m -1.26048,0.25 c -0.10571,-0.34023 0.21201,-0.48784 0.17971,-0.0655 0.20532,0.47932 0.16846,-0.59018 0.40143,-0.15309 0.19369,0.48548 -0.51086,0.6449 -0.5806,0.21899 m -0.16777,-0.32628 c 0.003,0.21747 -0.51383,0.059 -0.0685,0.22157 0.38953,0.3392 -0.58676,0.41358 -0.309,0.22699 0.52432,-0.0372 -0.45958,-0.30319 0.0896,-0.4819 0.0946,-0.0287 0.2045,-0.0235 0.28796,0.0344 m -0.99688,0.46241 c 0.0892,0.4554 -0.3135,0.24019 -0.17953,-0.10036 -0.28045,-0.78623 1.07442,-0.23273 0.43248,0.1872 -0.0909,0.0271 -0.20018,-0.005 -0.25295,-0.0867 m 0.11952,-0.36409 c -0.39427,0.13009 0.34651,0.51437 0.0773,0.0311 l -0.034,-0.025 -0.0433,-0.006 z m -0.65285,-0.11717 c 0.42856,-0.041 0.0577,0.97963 -0.005,0.32973 0.003,-0.10996 0.007,-0.21971 0.005,-0.32973 z m 0,-0.21896 c 0.43196,-0.11169 -0.0481,0.43831 0,0 z m -0.64683,0.0316 c 0.44435,-0.0237 -0.0875,0.85036 0.53283,0.60364 -0.23411,0.42107 -0.67995,0.0409 -0.53283,-0.33773 0,-0.0886 0,-0.17727 0,-0.26591 z"
-       id="path3078"
-       style="fill:#000000;fill-opacity:1;stroke:none" />
-    <rect
-       width="2.8749001"
-       height="2.8749392"
-       x="879.96875"
-       y="691.46332"
-       id="rect5552"
-       style="fill:#c0c1be;fill-opacity:1;stroke:#000000;stroke-width:0.10008001;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:2;stroke-opacity:1;stroke-dasharray:none" />
-    <path
-       d="m 878.38837,687.89343 0,7.40625 c -2.1e-4,0.0102 0,0.021 0,0.0312 0,0.8311 0.6689,1.5 1.5,1.5 l 5.90625,0 c 0.0102,2.1e-4 0.021,0 0.0312,0 0.8311,0 1.5,-0.6689 1.5,-1.5 0,-0.0206 8.2e-4,-0.0421 0,-0.0625 l 0,-7.375 -8.9375,0 z"
-       id="path3797"
-       style="fill:url(#linearGradient3824);fill-opacity:1;stroke:#888a85;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
-  </g>
-</svg>
index c001b47..0720f20 100644 (file)
@@ -1,7 +1 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="12" height="13">
-       <g stroke-width="2" stroke="#6c6c6c" fill="none">
-               <path d="m11.29 11.71-4-4"/>
-               <circle cx="5" cy="5" r="4"/>
-       </g>
-</svg>
+<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="12" height="13"><g stroke-width="2" stroke="#6c6c6c" fill="none"><path d="M11.29 11.71l-4-4"/><circle cx="5" cy="5" r="4"/></g></svg>
\ No newline at end of file
index 20d945d..622d5f9 100644 (file)
@@ -1,7 +1 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="12" height="13">
-       <g stroke-width="2" stroke="#6c6c6c" fill="none">
-               <path d="m.71 11.71 4-4"/>
-               <circle cx="7" cy="5" r="4"/>
-       </g>
-</svg>
+<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="12" height="13"><g stroke-width="2" stroke="#6c6c6c" fill="none"><path d="M.71 11.71l4-4"/><circle cx="7" cy="5" r="4"/></g></svg>
\ No newline at end of file
diff --git a/skins/vector/images/talk-icon.png b/skins/vector/images/talk-icon.png
deleted file mode 100644 (file)
index 0332054..0000000
Binary files a/skins/vector/images/talk-icon.png and /dev/null differ
diff --git a/skins/vector/images/talk-icon.svg b/skins/vector/images/talk-icon.svg
deleted file mode 100644 (file)
index d65d57a..0000000
+++ /dev/null
@@ -1,66 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<svg
-   xmlns:dc="http://purl.org/dc/elements/1.1/"
-   xmlns:cc="http://creativecommons.org/ns#"
-   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-   xmlns:svg="http://www.w3.org/2000/svg"
-   xmlns="http://www.w3.org/2000/svg"
-   xmlns:xlink="http://www.w3.org/1999/xlink"
-   version="1.1"
-   width="10"
-   height="10"
-   id="svg5587">
-  <defs
-     id="defs5589">
-    <linearGradient
-       id="linearGradient6134">
-      <stop
-         id="stop6136"
-         style="stop-color:#e9e9e9;stop-opacity:1"
-         offset="0" />
-      <stop
-         id="stop6138"
-         style="stop-color:#e9e9e9;stop-opacity:0"
-         offset="1" />
-    </linearGradient>
-    <radialGradient
-       cx="755.80591"
-       cy="683.84875"
-       r="2.6564851"
-       fx="755.80591"
-       fy="683.84875"
-       id="radialGradient6146"
-       xlink:href="#linearGradient6134"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(2.4898047,0,0,2.5230165,-1126.0032,-1041.5417)" />
-  </defs>
-  <metadata
-     id="metadata5592">
-    <rdf:RDF>
-      <cc:Work
-         rdf:about="">
-        <dc:format>image/svg+xml</dc:format>
-        <dc:type
-           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
-        <dc:title></dc:title>
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <g
-     transform="translate(-763.57141,-681.64789)"
-     id="layer1">
-    <g
-       transform="matrix(1.0212411,0,0,0.97119998,-5.0201418,19.699049)"
-       id="g6142">
-      <path
-         d="m -8.625,0.4375 c -0.4851513,0 -0.875,0.38984873 -0.875,0.875 l 0,4.375 c 0,0.4851513 0.3898487,0.875 0.875,0.875 l 0.125,0 0,2.6739053 3.4513641,-2.6739053 2.5173859,0 c 0.4851513,0 0.875,-0.3898487 0.875,-0.875 l 0,-4.375 c 0,-0.48515127 -0.3898487,-0.875 -0.875,-0.875 z"
-         transform="translate(763.57141,681.64789)"
-         id="rect5606"
-         style="fill:#ffffff;fill-opacity:1;stroke:#888a85;stroke-width:0.98900002;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:9.80000019;stroke-opacity:1;stroke-dasharray:none" />
-      <path
-         d="m 755.96029,683.3154 c -0.32861,0 -0.59267,0.23853 -0.59267,0.53539 l 0,2.67695 c 0,0.29685 0.26406,0.53539 0.59267,0.53539 l 0.0847,0 0,1.63611 2.33776,-1.63611 1.70516,0 c 0.32862,0 0.59268,-0.23854 0.59268,-0.53539 l 0,-2.67695 c 0,-0.29686 -0.26406,-0.53539 -0.59268,-0.53539 z"
-         id="path6124"
-         style="fill:url(#radialGradient6146);fill-opacity:1;stroke:none" />
-    </g>
-  </g>
-</svg>
index b41fd97..d52d547 100644 (file)
@@ -1,65 +1 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<svg
-   xmlns:dc="http://purl.org/dc/elements/1.1/"
-   xmlns:cc="http://creativecommons.org/ns#"
-   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-   xmlns:svg="http://www.w3.org/2000/svg"
-   xmlns="http://www.w3.org/2000/svg"
-   xmlns:xlink="http://www.w3.org/1999/xlink"
-   version="1.1"
-   width="16"
-   height="16"
-   id="svg2">
-  <defs
-     id="defs4">
-    <linearGradient
-       id="linearGradient3788">
-      <stop
-         id="stop3790"
-         style="stop-color:#c2edff;stop-opacity:1"
-         offset="0" />
-      <stop
-         id="stop3796"
-         style="stop-color:#68bdff;stop-opacity:1"
-         offset="0.5" />
-      <stop
-         id="stop3792"
-         style="stop-color:#ffffff;stop-opacity:1"
-         offset="1" />
-    </linearGradient>
-    <linearGradient
-       x1="13.470111"
-       y1="14.363379"
-       x2="4.596477"
-       y2="3.3969929"
-       id="linearGradient3804"
-       xlink:href="#linearGradient3788"
-       gradientUnits="userSpaceOnUse" />
-  </defs>
-  <metadata
-     id="metadata7">
-    <rdf:RDF>
-      <cc:Work
-         rdf:about="">
-        <dc:format>image/svg+xml</dc:format>
-        <dc:type
-           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
-        <dc:title></dc:title>
-        <dc:creator>
-          <cc:Agent>
-            <dc:title>Mateusz &quot;m4tx&quot; Maćkowski</dc:title>
-          </cc:Agent>
-        </dc:creator>
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <g
-     transform="translate(-693.14288,-698.64789)"
-     id="layer1">
-    <path
-       d="M 8.3337586,-0.92098331 10.85748,4.1926362 16.500695,5.0126434 12.417226,8.9930409 13.381202,14.613453 8.3337584,11.959854 3.286314,14.613452 4.2502902,8.9930409 0.16682217,5.012643 5.8100362,4.1926362 z"
-       transform="matrix(0.86225302,0,0,0.86225302,694.06156,700.58832)"
-       id="path3768"
-       style="fill:url(#linearGradient3804);fill-opacity:1;stroke:#c8b250;stroke-width:1.15975237;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
-  </g>
-</svg>
+<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="16" height="16"><defs><linearGradient id="a"><stop offset="0" stop-color="#c2edff"/><stop offset=".5" stop-color="#68bdff"/><stop offset="1" stop-color="#fff"/></linearGradient><linearGradient x1="13.47" y1="14.363" x2="4.596" y2="3.397" id="b" xlink:href="#a" gradientUnits="userSpaceOnUse"/></defs><path d="M8.103 1.146l2.175 4.408 4.864.707-3.52 3.431.831 4.845-4.351-2.287-4.351 2.287.831-4.845-3.52-3.431 4.864-.707z" fill="url(#b)" stroke="#c8b250" stroke-width="0.9999199999999999"/></svg>
\ No newline at end of file
index 80fb36e..cde7bc5 100644 (file)
@@ -1,65 +1 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<svg
-   xmlns:dc="http://purl.org/dc/elements/1.1/"
-   xmlns:cc="http://creativecommons.org/ns#"
-   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-   xmlns:svg="http://www.w3.org/2000/svg"
-   xmlns="http://www.w3.org/2000/svg"
-   xmlns:xlink="http://www.w3.org/1999/xlink"
-   version="1.1"
-   width="16"
-   height="16"
-   id="svg2">
-  <defs
-     id="defs4">
-    <linearGradient
-       id="linearGradient3788">
-      <stop
-         id="stop3790"
-         style="stop-color:#c2edff;stop-opacity:1"
-         offset="0" />
-      <stop
-         id="stop3796"
-         style="stop-color:#68bdff;stop-opacity:1"
-         offset="0.5" />
-      <stop
-         id="stop3792"
-         style="stop-color:#ffffff;stop-opacity:1"
-         offset="1" />
-    </linearGradient>
-    <linearGradient
-       x1="13.470111"
-       y1="14.363379"
-       x2="4.596477"
-       y2="3.3969929"
-       id="linearGradient3804"
-       xlink:href="#linearGradient3788"
-       gradientUnits="userSpaceOnUse" />
-  </defs>
-  <metadata
-     id="metadata7">
-    <rdf:RDF>
-      <cc:Work
-         rdf:about="">
-        <dc:format>image/svg+xml</dc:format>
-        <dc:type
-           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
-        <dc:title></dc:title>
-        <dc:creator>
-          <cc:Agent>
-            <dc:title>Mateusz &quot;m4tx&quot; Maćkowski</dc:title>
-          </cc:Agent>
-        </dc:creator>
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <g
-     transform="translate(-693.14288,-698.64789)"
-     id="layer1">
-    <path
-       d="M 8.3337586,-0.92098331 10.85748,4.1926362 16.500695,5.0126434 12.417226,8.9930409 13.381202,14.613453 8.3337584,11.959854 3.286314,14.613452 4.2502902,8.9930409 0.16682217,5.012643 5.8100362,4.1926362 z"
-       transform="matrix(0.86225302,0,0,0.86225302,694.06156,700.58832)"
-       id="path3768"
-       style="fill:url(#linearGradient3804);fill-opacity:1;stroke:#7cb5d1;stroke-width:1.15975237;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
-  </g>
-</svg>
+<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="16" height="16"><defs><linearGradient id="a"><stop offset="0" stop-color="#c2edff"/><stop offset=".5" stop-color="#68bdff"/><stop offset="1" stop-color="#fff"/></linearGradient><linearGradient x1="13.47" y1="14.363" x2="4.596" y2="3.397" id="b" xlink:href="#a" gradientUnits="userSpaceOnUse"/></defs><path d="M8.103 1.146l2.175 4.408 4.864.707-3.52 3.431.831 4.845-4.351-2.287-4.351 2.287.831-4.845-3.52-3.431 4.864-.707z" fill="url(#b)" stroke="#7cb5d1" stroke-width="0.9999199999999999"/></svg>
\ No newline at end of file
index 9b6f822..4335bcf 100644 (file)
@@ -1,207 +1 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<svg
-   xmlns:dc="http://purl.org/dc/elements/1.1/"
-   xmlns:cc="http://creativecommons.org/ns#"
-   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-   xmlns:svg="http://www.w3.org/2000/svg"
-   xmlns="http://www.w3.org/2000/svg"
-   xmlns:xlink="http://www.w3.org/1999/xlink"
-   version="1.1"
-   width="12"
-   height="13.837458"
-   id="svg2108">
-  <metadata
-     id="metadata68">
-    <rdf:RDF>
-      <cc:Work
-         rdf:about="">
-        <dc:format>image/svg+xml</dc:format>
-        <dc:type
-           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
-        <dc:title></dc:title>
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <defs
-     id="defs3">
-    <linearGradient
-       id="linearGradient4356">
-      <stop
-         id="stop4358"
-         style="stop-color:#000000;stop-opacity:1"
-         offset="0" />
-      <stop
-         id="stop4360"
-         style="stop-color:#000000;stop-opacity:0"
-         offset="1" />
-    </linearGradient>
-    <linearGradient
-       id="linearGradient4163">
-      <stop
-         id="stop4165"
-         style="stop-color:#3b74bc;stop-opacity:1"
-         offset="0" />
-      <stop
-         id="stop4167"
-         style="stop-color:#2d5990;stop-opacity:1"
-         offset="1" />
-    </linearGradient>
-    <linearGradient
-       id="linearGradient3824">
-      <stop
-         id="stop3826"
-         style="stop-color:#ffffff;stop-opacity:1"
-         offset="0" />
-      <stop
-         id="stop3828"
-         style="stop-color:#c9c9c9;stop-opacity:1"
-         offset="1" />
-    </linearGradient>
-    <linearGradient
-       id="linearGradient3816">
-      <stop
-         id="stop3818"
-         style="stop-color:#000000;stop-opacity:1"
-         offset="0" />
-      <stop
-         id="stop3820"
-         style="stop-color:#000000;stop-opacity:0"
-         offset="1" />
-    </linearGradient>
-    <linearGradient
-       id="linearGradient3800">
-      <stop
-         id="stop3802"
-         style="stop-color:#f4d9b1;stop-opacity:1"
-         offset="0" />
-      <stop
-         id="stop3804"
-         style="stop-color:#df9725;stop-opacity:1"
-         offset="1" />
-    </linearGradient>
-    <radialGradient
-       cx="31.112698"
-       cy="19.008621"
-       r="8.6620579"
-       fx="31.112698"
-       fy="19.008621"
-       id="radialGradient2243"
-       xlink:href="#linearGradient3816"
-       gradientUnits="userSpaceOnUse" />
-    <radialGradient
-       cx="28.089741"
-       cy="27.203083"
-       r="13.56536"
-       fx="28.089741"
-       fy="27.203083"
-       id="radialGradient2245"
-       xlink:href="#linearGradient4163"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(1.297564,0,0,0.884831,-8.358505,4.940469)" />
-    <linearGradient
-       x1="30.935921"
-       y1="29.553486"
-       x2="30.935921"
-       y2="35.803486"
-       id="linearGradient2247"
-       xlink:href="#linearGradient3824"
-       gradientUnits="userSpaceOnUse" />
-    <radialGradient
-       cx="31.112698"
-       cy="19.008621"
-       r="8.6620579"
-       fx="31.112698"
-       fy="19.008621"
-       id="radialGradient2249"
-       xlink:href="#linearGradient3816"
-       gradientUnits="userSpaceOnUse" />
-    <radialGradient
-       cx="29.344931"
-       cy="17.064077"
-       r="9.1620579"
-       fx="29.344931"
-       fy="17.064077"
-       id="radialGradient2251"
-       xlink:href="#linearGradient3800"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(0.787998,0,0,0.787998,6.221198,3.617627)" />
-    <linearGradient
-       x1="20.661695"
-       y1="35.817974"
-       x2="22.626925"
-       y2="36.217758"
-       id="linearGradient2253"
-       xlink:href="#linearGradient4356"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(0.983375,0.181588,-0.181588,0.983375,6.231716,-2.651466)" />
-    <linearGradient
-       x1="22.686766"
-       y1="36.3904"
-       x2="21.408455"
-       y2="35.739632"
-       id="linearGradient2255"
-       xlink:href="#linearGradient4356"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(-0.977685,0.210075,0.210075,0.977685,55.1096,-3.945209)" />
-  </defs>
-  <g
-     transform="translate(-5.0000039,-32.070112)"
-     id="layer1"
-     style="display:inline" />
-  <g
-     transform="translate(-5.0000039,-32.070112)"
-     id="layer2"
-     style="display:inline">
-    <g
-       transform="matrix(0.39012793,0,0,0.39012793,-1.0891578,28.22979)"
-       id="g2230">
-      <path
-         d="m 39.774755,19.008621 a 8.6620579,8.6620579 0 1 1 -17.324115,0 8.6620579,8.6620579 0 1 1 17.324115,0 z"
-         transform="matrix(1.77551,0,0,0.959183,-24.25322,18.77153)"
-         id="path4306"
-         style="color:#000000;fill:url(#radialGradient2243);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;marker:none;visibility:visible;display:inline;overflow:visible" />
-      <path
-         d="m 25.986174,41.636039 10.606602,0 c 3.005204,0 5.980484,-1.101932 7.071067,-4.242641 1.035639,-2.982476 0.176777,-8.662058 -6.540737,-13.258252 l -12.551146,0 c -6.717514,4.24264 -7.556991,10.044831 -6.010407,13.435028 1.575595,3.45379 4.24264,4.065865 7.424621,4.065865 z"
-         id="path4308"
-         style="color:#000000;fill:url(#radialGradient2245);fill-opacity:1;fill-rule:evenodd;stroke:#204a87;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible" />
-      <path
-         d="m 26.693281,25.726136 c 3.18198,2.828427 4.596194,13.081476 4.596194,13.081476 0,0 1.414213,-10.253048 3.889087,-13.258252 l -8.485281,0.176776 z"
-         id="path4310"
-         style="color:#000000;fill:url(#linearGradient2247);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;marker:none;visibility:visible;display:inline;overflow:visible" />
-      <path
-         d="m 28.972721,26.786797 c 0,0 -2.151323,1.660335 -1.965991,3.660533 -2.041226,-1.800794 -2.099873,-5.251524 -2.099873,-5.251524 l 4.065864,1.590991 z"
-         id="path4312"
-         style="color:#000000;fill:#729fcf;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;marker:none;visibility:visible;display:inline;overflow:visible" />
-      <path
-         d="m 25.914862,40.593933 10.493447,-0.0221 c 2.639723,0 5.253161,-0.967919 6.211112,-3.726667 0.909689,-2.61976 -0.09472,-7.608614 -5.995279,-11.645837 L 25.099417,24.956264 c -5.900557,3.726667 -7.04262,8.823219 -5.662029,12.044182 1.380592,3.220963 3.395211,3.57139 6.477474,3.593487 z"
-         id="path4314"
-         style="opacity:0.21518986;color:#000000;fill:none;stroke:#ffffff;stroke-width:0.99999976px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible" />
-      <path
-         d="m 33.410795,26.786797 c 0,0 2.151323,1.660335 1.965991,3.660533 2.041226,-1.800794 2.099873,-5.251524 2.099873,-5.251524 l -4.065864,1.590991 z"
-         id="path4316"
-         style="color:#000000;fill:#729fcf;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;marker:none;visibility:visible;display:inline;overflow:visible" />
-      <path
-         d="m 39.774755,19.008621 a 8.6620579,8.6620579 0 1 1 -17.324115,0 8.6620579,8.6620579 0 1 1 17.324115,0 z"
-         transform="translate(-0.125,3.5)"
-         id="path4318"
-         style="color:#000000;fill:url(#radialGradient2249);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;marker:none;visibility:visible;display:inline;overflow:visible" />
-      <path
-         d="m 39.774755,19.008621 a 8.6620579,8.6620579 0 1 1 -17.324115,0 8.6620579,8.6620579 0 1 1 17.324115,0 z"
-         id="path4320"
-         style="color:#000000;fill:url(#radialGradient2251);fill-opacity:1;fill-rule:evenodd;stroke:#c17d11;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible" />
-      <path
-         d="m 39.774755,19.008621 a 8.6620579,8.6620579 0 1 1 -17.324115,0 8.6620579,8.6620579 0 1 1 17.324115,0 z"
-         transform="matrix(0.877095,0,0,0.877095,3.823927,2.336267)"
-         id="path4322"
-         style="opacity:0.19620254;color:#000000;fill:none;stroke:#ffffff;stroke-width:1.14012825px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible" />
-      <path
-         d="m 21.85179,40.775197 c -1.247607,-0.544969 -1.805994,-1.858277 -1.805994,-1.858277 0.841281,-4.069136 3.719925,-7.046216 3.719925,-7.046216 0,0 -2.279321,6.411514 -1.913931,8.904493 z"
-         id="path4354"
-         style="opacity:0.22784807;color:#000000;fill:url(#linearGradient2253);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;marker:none;visibility:visible;display:inline;overflow:visible" />
-      <path
-         d="m 40.757497,39.916846 c 1.231251,-0.580978 1.80438,-2.002321 1.80438,-2.002321 -0.95912,-4.042983 -3.976149,-6.842821 -3.976149,-6.842821 0,0 2.464593,6.342602 2.171769,8.845142 z"
-         id="path4364"
-         style="opacity:0.22784807;color:#000000;fill:url(#linearGradient2255);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;marker:none;visibility:visible;display:inline;overflow:visible" />
-    </g>
-  </g>
-</svg>
+<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="12" height="13.837"><defs><linearGradient id="e"><stop offset="0"/><stop offset="1" stop-opacity="0"/></linearGradient><linearGradient id="b"><stop offset="0" stop-color="#3b74bc"/><stop offset="1" stop-color="#2d5990"/></linearGradient><linearGradient id="c"><stop offset="0" stop-color="#fff"/><stop offset="1" stop-color="#c9c9c9"/></linearGradient><linearGradient id="a"><stop offset="0"/><stop offset="1" stop-opacity="0"/></linearGradient><linearGradient id="d"><stop offset="0" stop-color="#f4d9b1"/><stop offset="1" stop-color="#df9725"/></linearGradient><radialGradient cx="31.113" cy="19.009" r="8.662" fx="31.113" fy="19.009" id="f" xlink:href="#a" gradientUnits="userSpaceOnUse"/><radialGradient cx="28.09" cy="27.203" r="13.565" fx="28.09" fy="27.203" id="g" xlink:href="#b" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1.298 0 0 .885 -8.359 4.94)"/><linearGradient x1="30.936" y1="29.553" x2="30.936" y2="35.803" id="h" xlink:href="#c" gradientUnits="userSpaceOnUse"/><radialGradient cx="31.113" cy="19.009" r="8.662" fx="31.113" fy="19.009" id="i" xlink:href="#a" gradientUnits="userSpaceOnUse"/><radialGradient cx="29.345" cy="17.064" r="9.162" fx="29.345" fy="17.064" id="j" xlink:href="#d" gradientUnits="userSpaceOnUse" gradientTransform="matrix(.788 0 0 .788 6.221 3.618)"/><linearGradient x1="20.662" y1="35.818" x2="22.627" y2="36.218" id="k" xlink:href="#e" gradientUnits="userSpaceOnUse" gradientTransform="matrix(.983 .182 -.182 .983 6.232 -2.651)"/><linearGradient x1="22.687" y1="36.39" x2="21.408" y2="35.74" id="l" xlink:href="#e" gradientUnits="userSpaceOnUse" gradientTransform="matrix(-.978 .21 .21 .978 55.11 -3.945)"/></defs><g color="#000"><path d="M39.775 19.009a8.662 8.662 0 1 1-17.324 0 8.662 8.662 0 1 1 17.324 0z" transform="matrix(.693 0 0 .374 -15.548 3.481)" fill="url(#f)" fill-rule="evenodd" overflow="visible"/><path d="M4.046 12.398h4.137c1.172 0 2.332-.43 2.758-1.655.404-1.163.069-3.378-2.551-5.171h-4.895c-2.62 1.655-2.947 3.917-2.344 5.24.614 1.347 1.655 1.586 2.896 1.586z" fill="url(#g)" fill-rule="evenodd" stroke="#204a87" stroke-linecap="round" stroke-linejoin="round" overflow="visible" stroke-width="0.39"/><path d="M4.321 6.193c1.241 1.103 1.793 5.102 1.793 5.102s.552-3.999 1.517-5.171l-3.309.069z" fill="url(#h)" fill-rule="evenodd" overflow="visible"/><path d="M5.21 6.607s-.839.648-.767 1.428c-.796-.702-.819-2.048-.819-2.048l1.586.62z" fill="#729fcf" fill-rule="evenodd" overflow="visible"/><path d="M4.018 11.992l4.092-.009c1.029 0 2.049-.377 2.422-1.453.355-1.022-.037-2.967-2.338-4.542l-4.495-.095c-2.301 1.453-2.747 3.441-2.208 4.697.538 1.256 1.324 1.393 2.526 1.401z" opacity=".215" stroke="#fff" stroke-linecap="round" stroke-linejoin="round" overflow="visible" fill="none" stroke-width="0.39"/><path d="M6.941 6.607s.839.648.767 1.428c.796-.702.819-2.048.819-2.048l-1.586.62z" fill="#729fcf" fill-rule="evenodd" overflow="visible"/><path d="M39.775 19.009a8.662 8.662 0 1 1-17.324 0 8.662 8.662 0 1 1 17.324 0z" transform="matrix(.39 0 0 .39 -6.138 -2.475)" fill="url(#i)" fill-rule="evenodd" overflow="visible"/><path d="M39.775 19.009a8.662 8.662 0 1 1-17.324 0 8.662 8.662 0 1 1 17.324 0z" fill="url(#j)" fill-rule="evenodd" stroke="#c17d11" stroke-linecap="round" stroke-linejoin="round" overflow="visible" transform="matrix(.39 0 0 .39 -6.089 -3.84)"/><path d="M39.775 19.009a8.662 8.662 0 1 1-17.324 0 8.662 8.662 0 1 1 17.324 0z" transform="matrix(.342 0 0 .342 -4.598 -2.929)" opacity=".196" stroke="#fff" stroke-width="1.14" stroke-linecap="round" stroke-linejoin="round" overflow="visible" fill="none"/><path d="M2.433 12.062c-.487-.213-.704-.725-.704-.725.328-1.587 1.451-2.748 1.451-2.748s-.889 2.5-.746 3.473z" opacity=".228" fill="url(#k)" fill-rule="evenodd" overflow="visible"/><path d="M9.806 11.728c.48-.227.704-.781.704-.781-.374-1.577-1.551-2.669-1.551-2.669s.961 2.474.847 3.45z" opacity=".228" fill="url(#l)" fill-rule="evenodd" overflow="visible"/></g></svg>
\ No newline at end of file
diff --git a/skins/vector/images/video-icon.png b/skins/vector/images/video-icon.png
deleted file mode 100644 (file)
index ed85232..0000000
Binary files a/skins/vector/images/video-icon.png and /dev/null differ
diff --git a/skins/vector/images/video-icon.svg b/skins/vector/images/video-icon.svg
deleted file mode 100644 (file)
index 0b3d302..0000000
+++ /dev/null
@@ -1,90 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<svg
-   xmlns:dc="http://purl.org/dc/elements/1.1/"
-   xmlns:cc="http://creativecommons.org/ns#"
-   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-   xmlns:svg="http://www.w3.org/2000/svg"
-   xmlns="http://www.w3.org/2000/svg"
-   xmlns:xlink="http://www.w3.org/1999/xlink"
-   version="1.1"
-   width="10"
-   height="10"
-   id="svg6734">
-  <defs
-     id="defs6736">
-    <linearGradient
-       id="linearGradient7265">
-      <stop
-         id="stop7267"
-         style="stop-color:#cccccc;stop-opacity:1"
-         offset="0" />
-      <stop
-         id="stop7269"
-         style="stop-color:#dfdfdf;stop-opacity:1"
-         offset="1" />
-    </linearGradient>
-    <radialGradient
-       cx="5.0034118"
-       cy="4.9650207"
-       r="4.999619"
-       fx="5.0034118"
-       fy="4.9650207"
-       id="radialGradient7327"
-       xlink:href="#linearGradient7265"
-       gradientUnits="userSpaceOnUse" />
-  </defs>
-  <metadata
-     id="metadata6739">
-    <rdf:RDF>
-      <cc:Work
-         rdf:about="">
-        <dc:format>image/svg+xml</dc:format>
-        <dc:type
-           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
-        <dc:title></dc:title>
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <g
-     transform="translate(-903.57141,-715.93359)"
-     id="layer1">
-    <path
-       d="m 911.68723,725.33709 -0.61872,-0.92808 c 0,0 0.17677,0.92808 0.92808,1.01647 0.7513,0.0884 1.19324,0.0884 1.19324,0.0884"
-       id="path7292"
-       style="fill:none;stroke:#5f6060;stroke-width:0.89999998;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
-    <path
-       d="m 9.5175309,4.9650207 a 4.5141191,4.5141191 0 1 1 -9.02823828,0 4.5141191,4.5141191 0 1 1 9.02823828,0 z"
-       transform="translate(903.4637,715.9024)"
-       id="path6755"
-       style="fill:url(#radialGradient7327);fill-opacity:1;stroke:#848484;stroke-width:0.89999998;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:9.80000019;stroke-opacity:1;stroke-dasharray:none" />
-    <g
-       transform="matrix(0.897287,0,0,0.897287,111.13225,74.055304)"
-       id="g7310">
-      <path
-         d="m 5.03125,2.59375 a 0.59375,0.59375 0 1 1 -1.1875,0 0.59375,0.59375 0 1 1 1.1875,0 z"
-         transform="matrix(1.4672484,-0.2948259,0.2948259,1.4672484,880.61345,716.13137)"
-         id="path7300"
-         style="fill:#818181;fill-opacity:1;stroke:none" />
-      <path
-         d="m 5.03125,2.59375 a 0.59375,0.59375 0 1 1 -1.1875,0 0.59375,0.59375 0 1 1 1.1875,0 z"
-         transform="matrix(1.4672484,-0.2948259,0.2948259,1.4672484,878.85062,718.47146)"
-         id="path7302"
-         style="fill:#818181;fill-opacity:1;stroke:none" />
-      <path
-         d="m 5.03125,2.59375 a 0.59375,0.59375 0 1 1 -1.1875,0 0.59375,0.59375 0 1 1 1.1875,0 z"
-         transform="matrix(1.4672484,-0.2948259,0.2948259,1.4672484,883.48161,716.7296)"
-         id="path7304"
-         style="fill:#818181;fill-opacity:1;stroke:none" />
-      <path
-         d="m 5.03125,2.59375 a 0.59375,0.59375 0 1 1 -1.1875,0 0.59375,0.59375 0 1 1 1.1875,0 z"
-         transform="matrix(1.4672484,-0.2948259,0.2948259,1.4672484,880.77974,720.67629)"
-         id="path7306"
-         style="fill:#818181;fill-opacity:1;stroke:none" />
-      <path
-         d="m 5.03125,2.59375 a 0.59375,0.59375 0 1 1 -1.1875,0 0.59375,0.59375 0 1 1 1.1875,0 z"
-         transform="matrix(1.4672484,-0.2948259,0.2948259,1.4672484,883.52712,719.65906)"
-         id="path7308"
-         style="fill:#818181;fill-opacity:1;stroke:none" />
-    </g>
-  </g>
-</svg>
index b78c978..664c671 100644 (file)
@@ -1,39 +1 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<svg
-   xmlns:dc="http://purl.org/dc/elements/1.1/"
-   xmlns:cc="http://creativecommons.org/ns#"
-   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-   xmlns:svg="http://www.w3.org/2000/svg"
-   xmlns="http://www.w3.org/2000/svg"
-   xmlns:xlink="http://www.w3.org/1999/xlink"
-   version="1.1"
-   width="16"
-   height="16"
-   id="svg2">
-  <metadata
-     id="metadata7">
-    <rdf:RDF>
-      <cc:Work
-         rdf:about="">
-        <dc:format>image/svg+xml</dc:format>
-        <dc:type
-           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
-        <dc:title></dc:title>
-        <dc:creator>
-          <cc:Agent>
-            <dc:title>Mateusz &quot;m4tx&quot; Maćkowski</dc:title>
-          </cc:Agent>
-        </dc:creator>
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <g
-     transform="translate(-693.14288,-698.64789)"
-     id="layer1">
-    <path
-       d="M 8.3337586,-0.92098331 10.85748,4.1926362 16.500695,5.0126434 12.417226,8.9930409 13.381202,14.613453 8.3337584,11.959854 3.286314,14.613452 4.2502902,8.9930409 0.16682217,5.012643 5.8100362,4.1926362 z"
-       transform="matrix(0.86225302,0,0,0.86225302,694.06156,700.58832)"
-       id="path3770"
-       style="fill:#ffffff;fill-opacity:1;stroke:#c8b250;stroke-width:1.15975237;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
-  </g>
-</svg>
+<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="16" height="16"><path d="M8.103 1.146l2.175 4.408 4.864.707-3.52 3.431.831 4.845-4.351-2.287-4.351 2.287.831-4.845-3.52-3.431 4.864-.707z" fill="#fff" stroke="#c8b250" stroke-width="0.9999199999999999"/></svg>
\ No newline at end of file
index 6b25f94..751eb14 100644 (file)
@@ -1,39 +1 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<svg
-   xmlns:dc="http://purl.org/dc/elements/1.1/"
-   xmlns:cc="http://creativecommons.org/ns#"
-   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-   xmlns:svg="http://www.w3.org/2000/svg"
-   xmlns="http://www.w3.org/2000/svg"
-   xmlns:xlink="http://www.w3.org/1999/xlink"
-   version="1.1"
-   width="16"
-   height="16"
-   id="svg2">
-  <metadata
-     id="metadata7">
-    <rdf:RDF>
-      <cc:Work
-         rdf:about="">
-        <dc:format>image/svg+xml</dc:format>
-        <dc:type
-           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
-        <dc:title></dc:title>
-        <dc:creator>
-          <cc:Agent>
-            <dc:title>Mateusz &quot;m4tx&quot; Maćkowski</dc:title>
-          </cc:Agent>
-        </dc:creator>
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <g
-     transform="translate(-693.14288,-698.64789)"
-     id="layer1">
-    <path
-       d="M 8.3337586,-0.92098331 10.85748,4.1926362 16.500695,5.0126434 12.417226,8.9930409 13.381202,14.613453 8.3337584,11.959854 3.286314,14.613452 4.2502902,8.9930409 0.16682217,5.012643 5.8100362,4.1926362 z"
-       transform="matrix(0.86225302,0,0,0.86225302,694.06156,700.58832)"
-       id="path2998"
-       style="fill:#ffffff;fill-opacity:1;stroke:#d1d1d1;stroke-width:1.15975237;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
-  </g>
-</svg>
+<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="16" height="16"><path d="M8.103 1.146l2.175 4.408 4.864.707-3.52 3.431.831 4.845-4.351-2.287-4.351 2.287.831-4.845-3.52-3.431 4.864-.707z" fill="#fff" stroke="#d1d1d1" stroke-width="0.9999199999999999"/></svg>
\ No newline at end of file
index 2654c8d..907b05b 100644 (file)
@@ -1,39 +1 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<svg
-   xmlns:dc="http://purl.org/dc/elements/1.1/"
-   xmlns:cc="http://creativecommons.org/ns#"
-   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-   xmlns:svg="http://www.w3.org/2000/svg"
-   xmlns="http://www.w3.org/2000/svg"
-   xmlns:xlink="http://www.w3.org/1999/xlink"
-   version="1.1"
-   width="16"
-   height="16"
-   id="svg2">
-  <metadata
-     id="metadata7">
-    <rdf:RDF>
-      <cc:Work
-         rdf:about="">
-        <dc:format>image/svg+xml</dc:format>
-        <dc:type
-           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
-        <dc:title></dc:title>
-        <dc:creator>
-          <cc:Agent>
-            <dc:title>Mateusz &quot;m4tx&quot; Maćkowski</dc:title>
-          </cc:Agent>
-        </dc:creator>
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <g
-     transform="translate(-693.14288,-698.64789)"
-     id="layer1">
-    <path
-       d="M 8.3337586,-0.92098331 10.85748,4.1926362 16.500695,5.0126434 12.417226,8.9930409 13.381202,14.613453 8.3337584,11.959854 3.286314,14.613452 4.2502902,8.9930409 0.16682217,5.012643 5.8100362,4.1926362 z"
-       transform="matrix(0.86225302,0,0,0.86225302,694.06156,700.58832)"
-       id="path2998"
-       style="fill:#ffffff;fill-opacity:1;stroke:#7cb5d1;stroke-width:1.15975237;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
-  </g>
-</svg>
+<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="16" height="16"><path d="M8.103 1.146l2.175 4.408 4.864.707-3.52 3.431.831 4.845-4.351-2.287-4.351 2.287.831-4.845-3.52-3.431 4.864-.707z" fill="#fff" stroke="#7cb5d1" stroke-width="0.9999199999999999"/></svg>
\ No newline at end of file
index ebfab42..438fbcf 100644 (file)
@@ -3,7 +3,8 @@
 // Page content
 // FIXME: Use global variable since Echo and CentralNotice use this variable
 @content-border-color: #a7d7f9;
-@content-font-family: Arimo, "Liberation Sans", "Helvetica Neue", Helvetica, Arial, sans-serif;
+// FIXME: Find an open font that works with this stack and is readable by Windows users
+@content-font-family: sans-serif;
 @content-font-color: #252525;
 @content-font-size: 0.875em;
 @content-line-height: 1.6;
index 5eb5c0a..7694d4a 100644 (file)
@@ -6,8 +6,8 @@
   },
   "devDependencies": {
     "grunt": "0.4.2",
-    "grunt-contrib-jshint": "0.8.0",
-    "grunt-contrib-watch": "0.5.3",
-    "grunt-jscs-checker": "0.4.0"
+    "grunt-contrib-jshint": "0.9.2",
+    "grunt-contrib-watch": "0.6.1",
+    "grunt-jscs-checker": "0.4.1"
   }
 }
index e8e71b8..e2bf9f6 100644 (file)
@@ -522,27 +522,55 @@ Italics and bold: 2-quote opening sequence: (2,2)
 
 !! test
 Italics and bold: 2-quote opening sequence: (2,3)
+!! options
+parsoid=wt2html
 !! wikitext
 ''foo'''
-!! html
+!! html/*
 <p><i>foo'</i>
 </p>
 !!end
 
 
+# same html as previous, but wikitext adjusted to match parsoid html2wt
+!! test
+Italics and bold: 2-quote opening sequence: (2,3) w/ nowiki
+!! wikitext
+''<nowiki>foo'</nowiki>''
+!! html
+<p><i>foo'</i>
+</p>
+!! end
+
+
 !! test
 Italics and bold: 2-quote opening sequence: (2,4)
+!! options
+parsoid=wt2html
 !! wikitext
 ''foo''''
-!! html
+!! html/*
 <p><i>foo''</i>
 </p>
 !!end
 
 
+# same html as previous, but wikitext adjusted to match parsoid html2wt
+!! test
+Italics and bold: 2-quote opening sequence: (2,4) w/ nowiki
+!! wikitext
+''<nowiki>foo''</nowiki>''
+!! html
+<p><i>foo''</i>
+</p>
+!! end
+
+
 # The PHP parser strips the empty tags out for giggles; parsoid doesn't.
 !! test
 Italics and bold: 2-quote opening sequence: (2,5)
+!! options
+parsoid=wt2html
 !! wikitext
 ''foo'''''
 !! html/php
@@ -553,6 +581,19 @@ Italics and bold: 2-quote opening sequence: (2,5)
 </p>
 !!end
 
+# same html as previous, but wikitext adjusted to match parsoid html2wt
+!! test
+Italics and bold: 2-quote opening sequence: (2,5+3) w/ nowiki
+!! wikitext
+''foo'''''<nowiki/>'''
+!! html/php
+<p><i>foo</i>
+</p>
+!! html/parsoid
+<p><i>foo</i><b></b>
+</p>
+!! end
+
 
 ###
 ### 3-quote opening sequence tests
@@ -580,17 +621,32 @@ Italics and bold: 3-quote opening sequence: (3,3)
 
 !! test
 Italics and bold: 3-quote opening sequence: (3,4)
+!! options
+parsoid=wt2html
 !! wikitext
 '''foo''''
-!! html
+!! html/*
 <p><b>foo'</b>
 </p>
 !!end
 
 
+# same html as previous, but wikitext adjusted to match parsoid html2wt
+!! test
+Italics and bold: 3-quote opening sequence: (3,4) w/ nowiki
+!! wikitext
+'''<nowiki>foo'</nowiki>'''
+!! html
+<p><b>foo'</b>
+</p>
+!! end
+
+
 # The PHP parser strips the empty tags out for giggles; parsoid doesn't.
 !! test
 Italics and bold: 3-quote opening sequence: (3,5)
+!! options
+parsoid=wt2html
 !! wikitext
 '''foo'''''
 !! html/php
@@ -601,6 +657,19 @@ Italics and bold: 3-quote opening sequence: (3,5)
 </p>
 !!end
 
+# same html as previous, but wikitext adjusted to match parsoid html2wt
+!! test
+Italics and bold: 3-quote opening sequence: (3,5+2) w/ nowiki
+!! wikitext
+'''foo'''''<nowiki/>''
+!! html/php
+<p><b>foo</b>
+</p>
+!! html/parsoid
+<p><b>foo</b><i></i>
+</p>
+!! end
+
 
 ###
 ### 4-quote opening sequence tests
@@ -608,14 +677,27 @@ Italics and bold: 3-quote opening sequence: (3,5)
 
 !! test
 Italics and bold: 4-quote opening sequence: (4,2)
+!! options
+parsoid=wt2html
 !! wikitext
 ''''foo''
-!! html
+!! html/*
 <p>''<i>foo</i>
 </p>
 !!end
 
 
+# same html as previous, but wikitext adjusted to match parsoid html2wt
+!! test
+Italics and bold: 4-quote opening sequence: (4,2) w/ nowiki
+!! wikitext
+<nowiki>''</nowiki>''foo''
+!! html
+<p>''<i>foo</i>
+</p>
+!! end
+
+
 !! test
 Italics and bold: 4-quote opening sequence: (4,3)
 !! wikitext
@@ -628,17 +710,32 @@ Italics and bold: 4-quote opening sequence: (4,3)
 
 !! test
 Italics and bold: 4-quote opening sequence: (4,4)
+!! options
+parsoid=wt2html
 !! wikitext
 ''''foo''''
-!! html
+!! html/*
 <p>'<b>foo'</b>
 </p>
 !!end
 
 
+# same html as previous, but wikitext adjusted to match parsoid html2wt
+!! test
+Italics and bold: 4-quote opening sequence: (4,4) w/ nowiki
+!! wikitext
+''''<nowiki>foo'</nowiki>'''
+!! html
+<p>'<b>foo'</b>
+</p>
+!! end
+
+
 # The PHP parser strips the empty tags out for giggles; parsoid doesn't.
 !! test
 Italics and bold: 4-quote opening sequence: (4,5)
+!! options
+parsoid=wt2html
 !! wikitext
 ''''foo'''''
 !! html/php
@@ -649,6 +746,19 @@ Italics and bold: 4-quote opening sequence: (4,5)
 </p>
 !!end
 
+# same html as previous, but wikitext adjusted to match parsoid html2wt
+!! test
+Italics and bold: 4-quote opening sequence: (4,5+2) w/ nowiki
+!! wikitext
+''''foo'''''<nowiki/>''
+!! html/php
+<p>'<b>foo</b>
+</p>
+!! html/parsoid
+<p>'<b>foo</b><i></i>
+</p>
+!! end
+
 
 ###
 ### 5-quote opening sequence tests
@@ -657,34 +767,74 @@ Italics and bold: 4-quote opening sequence: (4,5)
 !! test
 Italics and bold: 5-quote opening sequence: (5,2)
 !! options
+parsoid=wt2html
 !! wikitext
 '''''foo''
-!! html
+!! html/*
 <p><b><i>foo</i></b>
 </p>
 !!end
 
 
+# same html as previous, but wikitext adjusted to match parsoid html2wt
+# skipping wt2html and html2html because it wants to put <i> before <b>
+!! test
+Italics and bold: 5-quote opening sequence: (5,2+3)
+!! options
+parsoid=wt2wt,html2wt
+!! wikitext
+'''''foo'''''
+!! html/*
+<p><b><i>foo</i></b>
+</p>
+!! end
+
 !! test
 Italics and bold: 5-quote opening sequence: (5,3)
+!! options
+parsoid=wt2html
 !! wikitext
 '''''foo'''
-!! html
+!! html/*
 <p><i><b>foo</b></i>
 </p>
 !!end
 
 
+# same html as previous, but wikitext adjusted to match parsoid html2wt
+!! test
+Italics and bold: 5-quote opening sequence: (5,3+2)
+!! wikitext
+'''''foo'''''
+!! html
+<p><i><b>foo</b></i>
+</p>
+!! end
+
+
 !! test
 Italics and bold: 5-quote opening sequence: (5,4)
+!! options
+parsoid=wt2html
 !! wikitext
 '''''foo''''
-!! html
+!! html/*
 <p><i><b>foo'</b></i>
 </p>
 !!end
 
 
+# same html as previous, but wikitext adjusted to match parsoid html2wt
+!! test
+Italics and bold: 5-quote opening sequence: (5,4+2) w/ nowiki
+!! wikitext
+'''''<nowiki>foo'</nowiki>'''''
+!! html
+<p><i><b>foo'</b></i>
+</p>
+!! end
+
+
 !! test
 Italics and bold: 5-quote opening sequence: (5,5)
 !! wikitext
@@ -699,37 +849,78 @@ Italics and bold: 5-quote opening sequence: (5,5)
 ###
 !! test
 Italics and bold: multiple quote sequences: (2,4,2)
+!! options
+parsoid=wt2html
 !! wikitext
 ''foo''''bar''
-!! html
+!! html/*
 <p><i>foo'<b>bar</b></i>
 </p>
 !!end
 
 
+# same html as previous, but wikitext adjusted to match parsoid html2wt
+!! test
+Italics and bold: multiple quote sequences: (2,4,2+3) w/ nowiki
+!! wikitext
+''<nowiki>foo'</nowiki>'''bar'''''
+!! html
+<p><i>foo'<b>bar</b></i>
+</p>
+!! end
+
+
 !! test
 Italics and bold: multiple quote sequences: (2,4,3)
+!! options
+parsoid=wt2html
 !! wikitext
 ''foo''''bar'''
-!! html
+!! html/*
 <p><i>foo'<b>bar</b></i>
 </p>
 !!end
 
 
+# same html as previous, but wikitext adjusted to match parsoid html2wt
+!! test
+Italics and bold: multiple quote sequences: (2,4,3+2) w/ nowiki
+!! wikitext
+''<nowiki>foo'</nowiki>'''bar'''''
+!! html
+<p><i>foo'<b>bar</b></i>
+</p>
+!! end
+
+
 !! test
 Italics and bold: multiple quote sequences: (2,4,4)
+!! options
+parsoid=wt2html
 !! wikitext
 ''foo''''bar''''
-!! html
+!! html/*
 <p><i>foo'<b>bar'</b></i>
 </p>
 !!end
 
 
+# same html as previous, but wikitext adjusted to match parsoid html2wt
+!! test
+Italics and bold: multiple quote sequences: (2,4,4+2) w/ nowiki
+!! wikitext
+''<nowiki>foo'</nowiki>'''<nowiki>bar'</nowiki>'''''
+!! html
+<p><i>foo'<b>bar'</b></i>
+</p>
+!! end
+
+
 # The PHP parser strips the empty tags out for giggles; parsoid doesn't.
 !! test
 Italics and bold: multiple quote sequences: (3,4,2)
+!! options
+parsoid=wt2html
 !! wikitext
 '''foo''''bar''
 !! html/php
@@ -740,10 +931,27 @@ Italics and bold: multiple quote sequences: (3,4,2)
 </p>
 !!end
 
+# same html as previous, but wikitext adjusted to match parsoid html2wt
+!! test
+Italics and bold: multiple quote sequences: (3,4,2+2) w/ nowiki
+!! options
+parsoid
+!! wikitext
+'''<nowiki>foo'</nowiki>'''bar''<nowiki/>''
+!! html/php
+<p><b>foo'</b>bar
+</p>
+!! html/parsoid
+<p><b><span typeof="mw:Nowiki">foo'</span></b>bar<i></i>
+</p>
+!! end
+
 
 # The PHP parser strips the empty tags out for giggles; parsoid doesn't.
 !! test
 Italics and bold: multiple quote sequences: (3,4,3)
+!! options
+parsoid=wt2html
 !! wikitext
 '''foo''''bar'''
 !! html/php
@@ -754,6 +962,19 @@ Italics and bold: multiple quote sequences: (3,4,3)
 </p>
 !!end
 
+# same html as previous, but wikitext adjusted to match parsoid html2wt
+!! test
+Italics and bold: multiple quote sequences: (3,4,3+3) w/ nowiki
+!! wikitext
+'''<nowiki>foo'</nowiki>'''bar'''<nowiki/>'''
+!! html/php
+<p><b>foo'</b>bar
+</p>
+!! html/parsoid
+<p><b><span typeof="mw:Nowiki">foo'</span></b>bar<b></b>
+</p>
+!! end
+
 ###
 ### other quote tests
 ###
@@ -779,14 +1000,30 @@ Italics and bold: other quote tests: (2,(3,3),2)
 
 !! test
 Italics and bold: other quote tests: (3,2,3,2)
+!! options
+parsoid=wt2html
 !! wikitext
 '''this is about ''foo'''s family''
-!! html
+!! html/*
 <p><b>this is about <i>foo</i></b><i>s family</i>
 </p>
 !!end
 
 
+# same html as previous, but wikitext adjusted to match parsoid html2wt
+# add 'parsoid' option to use 'parsoid' normalization of the placeholder
+!! test
+Italics and bold: other quote tests: (3,2,3+2+2,2)
+!! options
+parsoid
+!! wikitext
+'''this is about ''foo'''''<nowiki/>''s family''
+!! html/*
+<p><b>this is about <i>foo</i></b><i>s family</i>
+</p>
+!! end
+
+
 !! test
 Italics and bold: other quote tests: (3,2,3,3)
 !! options
@@ -1198,6 +1435,22 @@ b
 </p>
 !! end
 
+!! test
+Multiple comments should still parse as SOL-transparent
+!! options
+parsoid=wt2html,wt2wt
+!! wikitext
+<!--c1-->*a
+<!--c2--><!--c3--><!--c4-->*b
+!! html
+<ul>
+<li>a
+</li>
+<li>b
+</li>
+</ul>
+!! end
+
 ###
 ### paragraph wrapping tests
 ###
@@ -1899,6 +2152,29 @@ bar
 </p>
 !! end
 
+!! test
+Templates: Handle comments in the target
+!! wikitext
+{{echo
+<!-- should be ignored -->
+|foo}}
+
+{{echo<!-- should be ignored -->
+|foo}}
+
+{{echo<!-- should be ignored -->|foo}}
+
+{{<!-- should be ignored -->echo|foo}}
+!!html/parsoid
+<p typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo\n&lt;!-- should be ignored -->\n","href":"./Template:Echo"},"params":{"1":{"wt":"foo"}},"i":0}}]}'>foo</p>
+
+<p typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo&lt;!-- should be ignored -->\n","href":"./Template:Echo"},"params":{"1":{"wt":"foo"}},"i":0}}]}'>foo</p>
+
+<p typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo&lt;!-- should be ignored -->","href":"./Template:Echo"},"params":{"1":{"wt":"foo"}},"i":0}}]}'>foo</p>
+
+<p typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"foo"}},"i":0}}]}'>foo</p>
+!!end
+
 #--------------------------------------------------------------------
 # Transclusion parameter escaping tests
 #--------------------------------------------------------------------
@@ -5512,6 +5788,17 @@ language=kaa
 </p>
 !! end
 
+!! test
+Link with multiple ":" in a subpage-supporting namespace (bug 63636)
+!! wikitext
+[[User:Foo/Test/63636:Bar|Test]]
+!! html/php
+<p><a href="/index.php?title=User:Foo/Test/63636:Bar&amp;action=edit&amp;redlink=1" class="new" title="User:Foo/Test/63636:Bar (page does not exist)">Test</a>
+</p>
+!! html/parsoid
+<p><a rel="mw:WikiLink" href="./User:Foo/Test/63636:Bar">Test</a></p>
+!! end
+
 !! test
 1. Interaction of linktrail and template encapsulation
 !! options
@@ -5682,16 +5969,30 @@ Interwiki link with fragment (bug 2130)
 # Ideally the wikipedia: prefix here should be proto-relative too
 !! test
 Different interwiki prefixes mapping to the same URL
-!! options
-parsoid
 !! wikitext
+[[:en:Foo]]
+
+[[:en:Foo|Foo]]
+
 [[wikipedia:Foo]]
 
-[[:en:Foo]]
-!! html
-<p><a rel="mw:ExtLink" href="http://en.wikipedia.org/wiki/Foo" data-parsoid='{"stx":"simple","a":{"href":"http://en.wikipedia.org/wiki/Foo"},"sa":{"href":"wikipedia:Foo"},"isIW":true}'>wikipedia:Foo</a></p>
+[[:wikipedia:Foo|Foo]]
 
+[[wikipedia:en:Foo]]
+
+[[:wikipedia:en:Foo]]
+!! html/parsoid
 <p><a rel="mw:ExtLink" href="//en.wikipedia.org/wiki/Foo" data-parsoid='{"stx":"simple","a":{"href":"//en.wikipedia.org/wiki/Foo"},"sa":{"href":":en:Foo"},"isIW":true}'>en:Foo</a></p>
+
+<p><a rel="mw:ExtLink" href="//en.wikipedia.org/wiki/Foo" data-parsoid='{"stx":"piped","a":{"href":"//en.wikipedia.org/wiki/Foo"},"sa":{"href":":en:Foo"},"isIW":true}'>Foo</a></p>
+
+<p><a rel="mw:ExtLink" href="http://en.wikipedia.org/wiki/Foo" data-parsoid='{"stx":"simple","a":{"href":"http://en.wikipedia.org/wiki/Foo"},"sa":{"href":"wikipedia:Foo"},"isIW":true}'>wikipedia:Foo</a></p>
+
+<p><a rel="mw:ExtLink" href="http://en.wikipedia.org/wiki/Foo" data-parsoid='{"stx":"piped","a":{"href":"http://en.wikipedia.org/wiki/Foo"},"sa":{"href":":wikipedia:Foo"},"isIW":true}'>Foo</a></p>
+
+<p><a rel="mw:ExtLink" href="http://en.wikipedia.org/wiki/en:Foo" data-parsoid='{"stx":"simple","a":{"href":"http://en.wikipedia.org/wiki/en:Foo"},"sa":{"href":"wikipedia:en:Foo"},"isIW":true}'>wikipedia:en:Foo</a></p>
+
+<p><a rel="mw:ExtLink" href="http://en.wikipedia.org/wiki/en:Foo" data-parsoid='{"stx":"simple","a":{"href":"http://en.wikipedia.org/wiki/en:Foo"},"sa":{"href":":wikipedia:en:Foo"},"isIW":true}'>wikipedia:en:Foo</a></p>
 !! end
 
 !! test
@@ -10165,6 +10466,52 @@ parsoid=wt2html,wt2wt,html2html
 <p><span class="mw-default-size" typeof="mw:Image"><a href="File:Foobar.jpg"><img alt="testing bold in alt" resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="220" width="1941"/></a></span></p>
 !! end
 
+###################
+# Conflicting image format options.
+# First option specified should 'win'.
+# All three cases in each test should be identical.
+
+!! test
+Image with 'frameless' first.
+!! wikitext
+[[File:Foobar.jpg|frameless|caption]]
+
+[[File:Foobar.jpg|frameless|frame|caption]]
+
+[[File:Foobar.jpg|frameless|thumb|caption]]
+!! html/php
+<p><a href="/wiki/File:Foobar.jpg" class="image" title="caption"><img alt="caption" src="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg" width="180" height="20" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/270px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/360px-Foobar.jpg 2x" /></a>
+</p><p><a href="/wiki/File:Foobar.jpg" class="image" title="caption"><img alt="caption" src="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg" width="180" height="20" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/270px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/360px-Foobar.jpg 2x" /></a>
+</p><p><a href="/wiki/File:Foobar.jpg" class="image" title="caption"><img alt="caption" src="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg" width="180" height="20" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/270px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/360px-Foobar.jpg 2x" /></a>
+</p>
+!! end
+
+!! test
+Image with 'frame' first.
+!! wikitext
+[[File:Foobar.jpg|frame|caption]]
+[[File:Foobar.jpg|frame|frameless|caption]]
+[[File:Foobar.jpg|frame|thumb|caption]]
+!! html/php
+<div class="thumb tright"><div class="thumbinner" style="width:1943px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" class="thumbimage" /></a>  <div class="thumbcaption">caption</div></div></div>
+<div class="thumb tright"><div class="thumbinner" style="width:1943px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" class="thumbimage" /></a>  <div class="thumbcaption">caption</div></div></div>
+<div class="thumb tright"><div class="thumbinner" style="width:1943px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" class="thumbimage" /></a>  <div class="thumbcaption">caption</div></div></div>
+
+!! end
+
+!! test
+Image with 'thumb' first.
+!! wikitext
+[[File:Foobar.jpg|thumb|caption]]
+[[File:Foobar.jpg|thumb|frameless|caption]]
+[[File:Foobar.jpg|thumb|frame|caption]]
+!! html/php
+<div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg" width="180" height="20" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/270px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/360px-Foobar.jpg 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div>caption</div></div></div>
+<div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg" width="180" height="20" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/270px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/360px-Foobar.jpg 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div>caption</div></div></div>
+<div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg" width="180" height="20" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/270px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/360px-Foobar.jpg 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div>caption</div></div></div>
+
+!! end
+
 ###################
 # Image sizing.
 # See https://www.mediawiki.org/wiki/Help:Images#Size_and_frame
@@ -10172,8 +10519,7 @@ parsoid=wt2html,wt2wt,html2html
 # Foobar has actual size of 1941x220
 # 1. Thumbs & frameless always reduce, can't be enlarged unless it's
 #    a scalable format.
-# 2. Framed images ignore width; always render at default size.
-#    If given a height, they respect height but continue to ignore width.
+# 2. Framed images always ignore size options; always render at default size.
 # 3. "Unspecified format" and border are the only types which can be
 #    enlarged.
 
@@ -10272,7 +10618,7 @@ parsoid=wt2html,wt2wt,html2html
 !! end
 
 !! test
-Image: framed images ignore size if only width is given
+Image: framed images are always unscaled.
 !! options
 parsoid=wt2html,wt2wt,html2html
 !! wikitext
@@ -10280,25 +10626,17 @@ parsoid=wt2html,wt2wt,html2html
 
 [[File:Foobar.jpg|frame|50px]]
 
+[[File:Foobar.jpg|frame|50x50px]]
+
 [[File:Foobar.jpg|frame|2000px]]
 !! html/php
 <div class="thumb tright"><div class="thumbinner" style="width:1943px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" class="thumbimage" /></a>  <div class="thumbcaption"></div></div></div>
 <div class="thumb tright"><div class="thumbinner" style="width:1943px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" class="thumbimage" /></a>  <div class="thumbcaption"></div></div></div>
 <div class="thumb tright"><div class="thumbinner" style="width:1943px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" class="thumbimage" /></a>  <div class="thumbcaption"></div></div></div>
+<div class="thumb tright"><div class="thumbinner" style="width:1943px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" class="thumbimage" /></a>  <div class="thumbcaption"></div></div></div>
 
 !! html/parsoid
-<figure class="mw-default-size" typeof="mw:Image/Frame"><a href="File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="220" width="1941"/></a></figure><figure typeof="mw:Image/Frame"><a href="File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="220" width="1941"/></a></figure><figure typeof="mw:Image/Frame"><a href="File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="220" width="1941"/></a></figure>
-!! end
-
-!! test
-Image: framed images respect size if given a height, but ignore width.
-!! wikitext
-[[File:Foobar.jpg|frame|50x50px]]
-!! html/php
-<div class="thumb tright"><div class="thumbinner" style="width:444px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/thumb/3/3a/Foobar.jpg/442px-Foobar.jpg" width="442" height="50" class="thumbimage" /></a>  <div class="thumbcaption"></div></div></div>
-
-!! html/parsoid
-<figure typeof="mw:Image/Frame"><a href="File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="50" width="442"/></a></figure>
+<figure class="mw-default-size" typeof="mw:Image/Frame"><a href="File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="220" width="1941"/></a></figure><figure typeof="mw:Image/Frame"><a href="File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="220" width="1941"/></a></figure><figure typeof="mw:Image/Frame"><a href="File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="220" width="1941"/></a></figure><figure typeof="mw:Image/Frame"><a href="File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="220" width="1941"/></a></figure>
 !! end
 
 ###################
@@ -10809,48 +11147,36 @@ valign, and caption (existing content)
 
 !! test
 Parsoid-specific image handling - framed image with specific size and caption
+(size is ignored)
+!! options
+parsoid=wt2html,wt2wt,html2html
 !! wikitext
-[[Image:Foobar.jpg|frame|500x50px|caption]]
+[[File:Foobar.jpg|frame|500x50px|caption]]
 !! html/parsoid
 <figure typeof="mw:Image/Frame">
 <a href="File:Foobar.jpg">
-<img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/442px-Foobar.jpg" height="50" width="442" />
+<img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="220" width="1941" />
 </a>
 <figcaption>caption</figcaption>
 </figure>
 !! end
 
-!! test
-Parsoid-specific image handling - framed image with specific size and caption
-(existing content)
-!! wikitext
-[[File:Foobar.jpg|442x50px|frame|caption]]
-!! html/parsoid
-<figure typeof="mw:Image/Frame" data-parsoid='{"optList":[{"ck":"width","ak":"442x50px"},{"ck":"framed","ak":"frame"},{"ck":"caption","ak":"caption"}],"size":"442x50"}'><a href="./File:Foobar.jpg" data-parsoid='{"a":{"href":"./File:Foobar.jpg"}}'><img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/442px-Foobar.jpg" height="50" width="442" data-parsoid='{"a":{"resource":"./File:Foobar.jpg","height":"50","width":"442"},"sa":{"resource":"File:Foobar.jpg"}}'/></a><figcaption>caption</figcaption></figure>
-!! end
-
 !! test
 Parsoid-specific image handling - framed image with specific size, halign, valign, and caption
+(size is ignored)
+!! options
+parsoid=wt2html,wt2wt,html2html
 !! wikitext
-[[Image:Foobar.jpg|left|baseline|frame|500x50px|caption]]
+[[File:Foobar.jpg|left|baseline|frame|500x50px|caption]]
 !! html/parsoid
 <figure class="mw-halign-left mw-valign-baseline" typeof="mw:Image/Frame">
 <a href="File:Foobar.jpg">
-<img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/442px-Foobar.jpg" height="50" width="442" />
+<img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="220" width="1941" />
 </a>
 <figcaption>caption</figcaption>
 </figure>
 !! end
 
-!! test
-Parsoid-specific image handling - framed image with specific size, halign,
-valign, and caption (existing content)
-!! wikitext
-[[File:Foobar.jpg|442x50px|frame|left|baseline|caption]]
-!! html/parsoid
-<figure class="mw-halign-left mw-valign-baseline" typeof="mw:Image/Frame" data-parsoid='{"optList":[{"ck":"width","ak":"442x50px"},{"ck":"framed","ak":"frame"},{"ck":"left","ak":"left"},{"ck":"baseline","ak":"baseline"},{"ck":"caption","ak":"caption"}],"size":"442x50"}'><a href="./File:Foobar.jpg" data-parsoid='{"a":{"href":"./File:Foobar.jpg"}}'><img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/442px-Foobar.jpg" height="50" width="442" data-parsoid='{"a":{"resource":"./File:Foobar.jpg","height":"50","width":"442"},"sa":{"resource":"File:Foobar.jpg"}}'/></a><figcaption>caption</figcaption></figure>
-!! end
-
 !! test
 Parsoid-specific image handling - frameless image with specific size, border, and caption
 !! wikitext
@@ -10893,13 +11219,33 @@ bar
 !! end
 
 !! test
-Parsoid-specific image handling - empty caption
+Parsoid-specific image handling - empty caption (1)
+!! options
+parsoid=wt2html,wt2wt
 !! wikitext
 [[File:Foobar.jpg|thumb|]]
 !! html/parsoid
 <figure class="mw-default-size" typeof="mw:Image/Thumb"><a href="File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="25" width="220"/></a><figcaption></figcaption></figure>
 !! end
 
+# empty captions don't get serialized unless we're in the "round trip" case
+!! test
+Parsoid-specific image handling - empty caption (2)
+!! options
+parsoid=html2wt
+!! html/parsoid
+<figure class="mw-default-size" typeof="mw:Image/Thumb">
+  <a href="File:Foobar.jpg">
+    <img resource="./File:Foobar.jpg"
+         src="//example.com/images/3/3a/Foobar.jpg"
+         height="25" width="220"/>
+  </a>
+  <figcaption></figcaption>
+</figure>
+!! wikitext
+[[File:Foobar.jpg|thumb]]
+!! end
+
 !! test
 Parsoid-specific image handling - whitespace caption
 !! wikitext
@@ -10967,22 +11313,78 @@ subpage title=[[Subpage test/1/2/3/4]]
 <p><a rel="mw:WikiLink" href="Subpage_test/1/2/subpage">Subpage_test/1/2/subpage</a></p>
 !! end
 
-# TODO: make this PHP-parser compatible!
 !! test
 Parsoid: dot-slash prefixed wikilinks
-!! options
-parsoid=wt2wt,wt2html,html2html
 !! wikitext
 [[./foo]]
 
 [[././bar]]
 
 [[././baz/]]
-!! html
-<p><a rel="mw:WikiLink" href="./Foo">foo</a></p>
-<p><a rel="mw:WikiLink" href="./Bar">bar</a></p>
-<p><a rel="mw:WikiLink" href="./Baz/">baz/</a></p>
-!! end
+!! html/php
+<p>[[./foo]]
+</p><p>[[././bar]]
+</p><p>[[././baz/]]
+</p>
+!! html/parsoid
+<p>[[./foo]]
+</p><p>[[././bar]]
+</p><p>[[././baz/]]
+</p>
+!! end
+
+!! test
+Render invalid page names as plain text (bug 51090)
+!! wikitext
+[[./../foo|bar]]
+[[foo�|bar]]
+[[foo/.|bar]]
+[[foo/..|bar]]
+[[foo~~~bar]]
+[[foo>bar]]
+[[foo[bar]]
+[[.]]
+[[..]]
+[[foo././bar]]
+
+[[{{echo|./../foo}}|bar]]
+[[{{echo|foo/.}}|bar]]
+[[{{echo|foo/..}}|bar]]
+[[{{echo|foo~~~~bar}}]]
+[[{{echo|foo>bar}}]]
+[[{{echo|foo././bar}}]]
+[[{{echo|foo{bar}}]]
+[[{{echo|foo}bar}}]]
+[[{{echo|foo[bar}}]]
+[[{{echo|foo]bar}}]]
+[[{{echo|foo<bar}}]]
+!!html/php
+<p>[[./../foo|bar]]
+[[foo�|bar]]
+[[foo/.|bar]]
+[[foo/..|bar]]
+[[foo~~~bar]]
+[[foo&gt;bar]]
+[[foo[bar]]
+[[.]]
+[[..]]
+[[foo././bar]]
+</p><p>[[./../foo|bar]]
+[[foo/.|bar]]
+[[foo/..|bar]]
+[[foo~~~~bar]]
+[[foo&gt;bar]]
+[[foo././bar]]
+[[foo{bar]]
+[[foo}bar]]
+[[foo[bar]]
+[[foo]bar]]
+[[foo&lt;bar]]
+</p>
+!!html/parsoid
+<p>[[./../foo|bar]][[foo�|bar]][[foo/.|bar]][[foo/..|bar]][[foo~~~bar]][[foo>bar]][[foo[bar]][[.]][[..]][[foo././bar]]</p>
+<p>[[<span typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"./../foo"}},"i":0}}]}'>./../foo</span>|bar]][[<span typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"foo/."}},"i":0}}]}'>foo/.</span>|bar]][[<span typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"foo/.."}},"i":0}}]}'>foo/..</span>|bar]][[<span typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"foo~~~~bar"}},"i":0}}]}'>foo~~~~bar</span>]][[<span typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"foo>bar"}},"i":0}}]}'>foo>bar</span>]][[<span typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"foo././bar"}},"i":0}}]}'>foo././bar</span>]][[<span typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"foo{bar"}},"i":0}}]}'>foo{bar</span>]][[<span typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"foo}bar"}},"i":0}}]}'>foo}bar</span>]][[<span typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"foo[bar"}},"i":0}}]}'>foo[bar</span>]][[<span typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"foo]bar"}},"i":0}}]}'>foo]bar</span>]][[<span typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"foo&lt;bar"}},"i":0}}]}'>foo&lt;bar</span>]]</p>
+!!end
 
 !! test
 Disabled subpages
@@ -11724,6 +12126,23 @@ __NOEDITSECTION__
 
 !! end
 
+!! test
+Single-line or multiline-comments can follow headings
+!! options
+parsoid=wt2html,wt2wt
+!! wikitext
+==foo==<!---->
+==bar==<!--c1-->
+==baz==<!--
+c2
+c3-->
+!! html
+<h2><span class="mw-headline" id="foo">foo</span></h2>
+<h2><span class="mw-headline" id="bar">bar</span></h2>
+<h2><span class="mw-headline" id="baz">baz</span></h2>
+
+!! end
+
 !! test
 BUG 1219 URL next to image (broken)
 !! wikitext
@@ -14382,6 +14801,8 @@ Handling of &#x0A; in URLs
 # The PHP parser strips the empty tags out for giggles; parsoid doesn't.
 !! test
 5 quotes, code coverage +1 line
+!! options
+parsoid=wt2html
 !! wikitext
 '''''
 !! html/php
@@ -14389,6 +14810,33 @@ Handling of &#x0A; in URLs
 <p><b><i></i></b></p>
 !! end
 
+# same html as previous, but wikitext adjusted to match parsoid html2wt
+# note that wt2html and html2html will put the <i> before the <b>
+!! test
+5 quotes, code coverage +1 line w/ nowiki (1)
+!! options
+parsoid=wt2wt,html2wt
+!! wikitext
+'''''<nowiki/>'''''
+!! html/php
+<p><i></i>
+</p>
+!! html/parsoid
+<p><b><i></i></b></p>
+!! end
+
+# same as previous, just swapping the <i> and <b>
+!! test
+5 quotes, code coverage +1 line w/ nowiki (2)
+!! wikitext
+'''''<nowiki/>'''''
+!! html/php
+<p><i></i>
+</p>
+!! html/parsoid
+<p><i><b></b></i></p>
+!! end
+
 !! test
 Special:Search page linking.
 !! wikitext
@@ -19148,6 +19596,23 @@ parsoid
 
 !!end
 
+!! test
+New element inserted (without intervening newlines) after an old sol-transparent node should serialize correctly
+!! options
+parsoid=html2wt
+!! wikitext
+<includeonly>foo</includeonly>
+new para
+
+[[./Category:Foo]]
+
+= new heading =
+!! html
+<meta typeof="mw:Includes/IncludeOnly" data-parsoid='{"src":"&lt;includeonly>foo&lt;/includeonly>"}'/><meta typeof="mw:Includes/IncludeOnly/End" data-parsoid='{"src":""}'/><p>new para</p>
+
+<link rel="mw:PageProp/Category" href="./Category:Foo" data-parsoid=''/><h1>new heading</h1>
+!! end
+
 ## PHP emits broken html for this, and since this is primarily
 ## a Parsoid serializer test, marking this Parsoid only
 !!test
@@ -19174,7 +19639,7 @@ parsoid
 </body>
 !!end
 
-## Currently the p-wrapper is fragile in how adds / removes transformations.
+## Currently the p-wrapper is fragile in how it adds / removes transformations.
 ## Having nested or stray pre tags results in the attempt to add duplicates,
 ## causing an assertion fail. This test tries to prevent that situation.
 !!test
@@ -19388,6 +19853,17 @@ parsoid=wt2wt,wt2html
 <td>b</td></tr></tbody></table>
 !!end
 
+!!test
+9. Encapsulate foster-parented transclusion content
+!!options
+parsoid=wt2wt,wt2html
+!! wikitext
+<table>{{echo|hi</table>hello}}
+!! html
+<span about="#mwt2" typeof="mw:Transclusion" data-mw='{"parts":["&lt;table>",{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"hi&lt;/table>hello"}},"i":0}}]}' data-parsoid='{"fostered":true,"autoInsertedEnd":true,"autoInsertedStart":true,"pi":[[{"k":"1","spc":["","","",""]}]]}'>hi</span>
+<table about="#mwt2" data-parsoid='{"stx":"html"}'></table><span about="#mwt2" data-parsoid="{}">hello</span>
+!!end
+
 !!test
 Table in fosterable position
 !!options
index 7237ef3..c8ec411 100644 (file)
@@ -30,9 +30,9 @@ class MediaWikiPHPUnitTestListener implements PHPUnit_Framework_TestListener {
        /**
         * An error occurred.
         *
-        * @param  PHPUnit_Framework_Test $test
-        * @param  Exception              $e
-        * @param  float                  $time
+        * @param PHPUnit_Framework_Test $test
+        * @param Exception $e
+        * @param float $time
         */
        public function addError( PHPUnit_Framework_Test $test, Exception $e, $time ) {
                wfDebugLog( $this->logChannel, 'ERROR in ' . $this->getTestName( $test ) . ': ' . $this->getErrorName( $e ) );
@@ -41,9 +41,9 @@ class MediaWikiPHPUnitTestListener implements PHPUnit_Framework_TestListener {
        /**
         * A failure occurred.
         *
-        * @param  PHPUnit_Framework_Test                 $test
-        * @param  PHPUnit_Framework_AssertionFailedError $e
-        * @param  float                                  $time
+        * @param PHPUnit_Framework_Test $test
+        * @param PHPUnit_Framework_AssertionFailedError $e
+        * @param float $time
         */
        public function addFailure( PHPUnit_Framework_Test $test, PHPUnit_Framework_AssertionFailedError $e, $time ) {
                wfDebugLog( $this->logChannel, 'FAILURE in ' . $this->getTestName( $test ) . ': ' . $this->getErrorName( $e ) );
@@ -52,9 +52,9 @@ class MediaWikiPHPUnitTestListener implements PHPUnit_Framework_TestListener {
        /**
         * Incomplete test.
         *
-        * @param  PHPUnit_Framework_Test $test
-        * @param  Exception              $e
-        * @param  float                  $time
+        * @param PHPUnit_Framework_Test $test
+        * @param Exception $e
+        * @param float $time
         */
        public function addIncompleteTest( PHPUnit_Framework_Test $test, Exception $e, $time ) {
                wfDebugLog( $this->logChannel, 'Incomplete test ' . $this->getTestName( $test ) . ': ' . $this->getErrorName( $e ) );
@@ -63,11 +63,11 @@ class MediaWikiPHPUnitTestListener implements PHPUnit_Framework_TestListener {
        /**
         * Skipped test.
         *
-        * @param  PHPUnit_Framework_Test $test
-        * @param  Exception              $e
-        * @param  float                  $time
+        * @param PHPUnit_Framework_Test $test
+        * @param Exception $e
+        * @param float $time
         *
-        * @since  Method available since Release 3.0.0
+        * @since Method available since Release 3.0.0
         */
        public function addSkippedTest( PHPUnit_Framework_Test $test, Exception $e, $time ) {
                wfDebugLog( $this->logChannel, 'Skipped test ' . $this->getTestName( $test ) . ': ' . $this->getErrorName( $e ) );
@@ -76,8 +76,8 @@ class MediaWikiPHPUnitTestListener implements PHPUnit_Framework_TestListener {
        /**
         * A test suite started.
         *
-        * @param  PHPUnit_Framework_TestSuite $suite
-        * @since  Method available since Release 2.2.0
+        * @param PHPUnit_Framework_TestSuite $suite
+        * @since Method available since Release 2.2.0
         */
        public function startTestSuite( PHPUnit_Framework_TestSuite $suite ) {
                wfDebugLog( $this->logChannel, 'START suite ' . $suite->getName() );
@@ -86,8 +86,8 @@ class MediaWikiPHPUnitTestListener implements PHPUnit_Framework_TestListener {
        /**
         * A test suite ended.
         *
-        * @param  PHPUnit_Framework_TestSuite $suite
-        * @since  Method available since Release 2.2.0
+        * @param PHPUnit_Framework_TestSuite $suite
+        * @since Method available since Release 2.2.0
         */
        public function endTestSuite( PHPUnit_Framework_TestSuite $suite ) {
                wfDebugLog( $this->logChannel, 'END suite ' . $suite->getName() );
@@ -96,7 +96,7 @@ class MediaWikiPHPUnitTestListener implements PHPUnit_Framework_TestListener {
        /**
         * A test started.
         *
-        * @param  PHPUnit_Framework_Test $test
+        * @param PHPUnit_Framework_Test $test
         */
        public function startTest( PHPUnit_Framework_Test $test ) {
                wfDebugLog( $this->logChannel, 'Start test ' . $this->getTestName( $test ) );
@@ -105,8 +105,8 @@ class MediaWikiPHPUnitTestListener implements PHPUnit_Framework_TestListener {
        /**
         * A test ended.
         *
-        * @param  PHPUnit_Framework_Test $test
-        * @param  float                  $time
+        * @param PHPUnit_Framework_Test $test
+        * @param float $time
         */
        public function endTest( PHPUnit_Framework_Test $test, $time ) {
                wfDebugLog( $this->logChannel, 'End test ' . $this->getTestName( $test ) );
index f67f696..4e30bdd 100644 (file)
@@ -437,11 +437,11 @@ class GlobalTest extends MediaWikiTestCase {
        }
 
        /**
-        * @param String $old: Text as it was in the database
-        * @param String $mine: Text submitted while user was editing
-        * @param String $yours: Text submitted by the user
-        * @param Boolean $expectedMergeResult Whether the merge should be a success
-        * @param String $expectedText: Text after merge has been completed
+        * @param string $old Text as it was in the database
+        * @param string $mine Text submitted while user was editing
+        * @param string $yours Text submitted by the user
+        * @param bool $expectedMergeResult Whether the merge should be a success
+        * @param string $expectedText Text after merge has been completed
         *
         * @dataProvider provideMerge()
         * @group medium
index 44ca3d2..25b0805 100644 (file)
@@ -120,8 +120,11 @@ class MessageTest extends MediaWikiLangTestCase {
        public function testInLanguage() {
                $this->assertEquals( 'Main Page', wfMessage( 'mainpage' )->inLanguage( 'en' )->text() );
                $this->assertEquals( 'Заглавная страница', wfMessage( 'mainpage' )->inLanguage( 'ru' )->text() );
-               $this->assertEquals( 'Main Page', wfMessage( 'mainpage' )->inLanguage( Language::factory( 'en' ) )->text() );
-               $this->assertEquals( 'Заглавная страница', wfMessage( 'mainpage' )->inLanguage( Language::factory( 'ru' ) )->text() );
+
+               // NOTE: make sure internal caching of the message text is reset appropriately
+               $msg = wfMessage( 'mainpage' );
+               $this->assertEquals( 'Main Page', $msg->inLanguage( Language::factory( 'en' ) )->text() );
+               $this->assertEquals( 'Заглавная страница', $msg->inLanguage( Language::factory( 'ru' ) )->text() );
        }
 
        /**
@@ -245,22 +248,32 @@ class MessageTest extends MediaWikiLangTestCase {
        /**
         * @covers Message::inContentLanguage
         */
-       public function testInContentLanguageDisabled() {
+       public function testInContentLanguage() {
                $this->setMwGlobals( 'wgLang', Language::factory( 'fr' ) );
 
-               $this->assertEquals( 'Main Page', wfMessage( 'mainpage' )->inContentLanguage()->plain(), 'ForceUIMsg disabled' );
+               // NOTE: make sure internal caching of the message text is reset appropriately
+               $msg = wfMessage( 'mainpage' );
+               $this->assertEquals( 'Hauptseite', $msg->inLanguage( 'de' )->plain(), "inLanguage( 'de' )" );
+               $this->assertEquals( 'Main Page', $msg->inContentLanguage()->plain(), "inContentLanguage()" );
+               $this->assertEquals( 'Accueil', $msg->inLanguage( 'fr' )->plain(), "inLanguage( 'fr' )" );
        }
 
        /**
         * @covers Message::inContentLanguage
         */
-       public function testInContentLanguageEnabled() {
+       public function testInContentLanguageOverride() {
                $this->setMwGlobals( array(
                        'wgLang' => Language::factory( 'fr' ),
                        'wgForceUIMsgAsContentMsg' => array( 'mainpage' ),
                ) );
 
-               $this->assertEquals( 'Accueil', wfMessage( 'mainpage' )->inContentLanguage()->plain(), 'ForceUIMsg enabled' );
+               // NOTE: make sure internal caching of the message text is reset appropriately.
+               // NOTE: wgForceUIMsgAsContentMsg forces the messages *current* language to be used.
+               $msg = wfMessage( 'mainpage' );
+               $this->assertEquals( 'Accueil', $msg->inContentLanguage()->plain(), 'inContentLanguage() with ForceUIMsg override enabled' );
+               $this->assertEquals( 'Main Page', $msg->inLanguage( 'en' )->plain(), "inLanguage( 'en' )" );
+               $this->assertEquals( 'Main Page', $msg->inContentLanguage()->plain(), 'inContentLanguage() with ForceUIMsg override enabled' );
+               $this->assertEquals( 'Hauptseite', $msg->inLanguage( 'de' )->plain(), "inLanguage( 'de' )" );
        }
 
        /**
index fc23919..48a4017 100644 (file)
@@ -179,7 +179,7 @@ class RevisionTest extends MediaWikiTestCase {
         * @param string $text
         * @param string $title
         * @param string $model
-        * @param null $format
+        * @param string $format
         *
         * @return Revision
         */
index a332368..8093824 100644 (file)
@@ -517,4 +517,74 @@ class TitleTest extends MediaWikiTestCase {
                        array( 'User:John_Doe/subOne', 'subOne' ),
                );
        }
+
+       public function provideNewFromTitleValue() {
+               return array(
+                       array( new TitleValue( NS_MAIN, 'Foo' ) ),
+                       array( new TitleValue( NS_MAIN, 'Foo', 'bar' ) ),
+                       array( new TitleValue( NS_USER, 'Hansi_Maier' ) ),
+               );
+       }
+
+       /**
+        * @dataProvider provideNewFromTitleValue
+        */
+       public function testNewFromTitleValue( TitleValue $value ) {
+               $title = Title::newFromTitleValue( $value );
+
+               $dbkey = str_replace( ' ', '_', $value->getText() );
+               $this->assertEquals( $dbkey, $title->getDBkey() );
+               $this->assertEquals( $value->getNamespace(), $title->getNamespace() );
+               $this->assertEquals( $value->getFragment(), $title->getFragment() );
+       }
+
+       public function provideGetTitleValue() {
+               return array(
+                       array( 'Foo' ),
+                       array( 'Foo#bar' ),
+                       array( 'User:Hansi_Maier' ),
+               );
+       }
+
+       /**
+        * @dataProvider provideGetTitleValue
+        */
+       public function testGetTitleValue( $text ) {
+               $title = Title::newFromText( $text );
+               $value = $title->getTitleValue();
+
+               $dbkey = str_replace( ' ', '_', $value->getText() );
+               $this->assertEquals( $title->getDBkey(), $dbkey );
+               $this->assertEquals( $title->getNamespace(), $value->getNamespace() );
+               $this->assertEquals( $title->getFragment(), $value->getFragment() );
+       }
+
+       public function provideGetFragment() {
+               return array(
+                       array( 'Foo', '' ),
+                       array( 'Foo#bar', 'bar' ),
+                       array( 'Foo#bär', 'bär' ),
+
+                       // Inner whitespace is normalized
+                       array( 'Foo#bar_bar', 'bar bar' ),
+                       array( 'Foo#bar bar', 'bar bar' ),
+                       array( 'Foo#bar   bar', 'bar bar' ),
+
+                       // Leading whitespace is kept, trailing whitespace is trimmed.
+                       // XXX: Is this really want we want?
+                       array( 'Foo#_bar_bar_', ' bar bar' ),
+                       array( 'Foo# bar bar ', ' bar bar' ),
+               );
+       }
+
+       /**
+        * @dataProvider provideGetFragment
+        *
+        * @param $full
+        * @param $fragment
+        */
+       public function testGetFragment( $full, $fragment ) {
+               $title = Title::newFromText( $full );
+               $this->assertEquals( $fragment, $title->getFragment() );
+       }
 }
index 1d534ee..c0612d1 100644 (file)
@@ -96,10 +96,10 @@ class RandomImageGenerator {
        /**
         * Writes random images with random filenames to disk in the directory you specify, or current working directory
         *
-        * @param $number Integer: number of filenames to write
-        * @param $format String: optional, must be understood by ImageMagick, such as 'jpg' or 'gif'
-        * @param $dir String: directory, optional (will default to current working directory)
-        * @return Array: filenames we just wrote
+        * @param int $number number of filenames to write
+        * @param string $format optional, must be understood by ImageMagick, such as 'jpg' or 'gif'
+        * @param string $dir directory, optional (will default to current working directory)
+        * @return array filenames we just wrote
         */
        function writeImages( $number, $format = 'jpg', $dir = null ) {
                $filenames = $this->getRandomFilenames( $number, $format, $dir );
@@ -139,10 +139,10 @@ class RandomImageGenerator {
         * Return a number of randomly-generated filenames
         * Each filename uses two words randomly drawn from the dictionary, like elephantine_spatula.jpg
         *
-        * @param $number Integer: of filenames to generate
-        * @param $extension String: optional, defaults to 'jpg'
-        * @param $dir String: optional, defaults to current working directory
-        * @return Array: of filenames
+        * @param int $number Number of filenames to generate
+        * @param string $extension Optional, defaults to 'jpg'
+        * @param string $dir Optional, defaults to current working directory
+        * @return array Array of filenames
         */
        private function getRandomFilenames( $number, $extension = 'jpg', $dir = null ) {
                if ( is_null( $dir ) ) {
@@ -208,7 +208,7 @@ class RandomImageGenerator {
         * Given array( array('x' => 10, 'y' => 20), array( 'x' => 30, y=> 5 ) )
         * returns "10,20 30,5"
         * Useful for SVG and imagemagick command line arguments
-        * @param $shape: Array of arrays, each array containing x & y keys mapped to numeric values
+        * @param array $shape Array of arrays, each array containing x & y keys mapped to numeric values
         * @return string
         */
        static function shapePointsToString( $shape ) {
@@ -347,10 +347,10 @@ class RandomImageGenerator {
 
        /**
         * Given a matrix and a pair of images, return new position
-        * @param $matrix: 2x2 rotation matrix
-        * @param $x: x-coordinate number
-        * @param $y: y-coordinate number
-        * @return Array transformed with properties x, y
+        * @param array $matrix 2x2 rotation matrix
+        * @param int $x x-coordinate number
+        * @param int $y y-coordinate number
+        * @return array Transformed with properties x, y
         */
        private static function matrixMultiply2x2( $matrix, $x, $y ) {
                return array(
@@ -412,8 +412,8 @@ class RandomImageGenerator {
        /**
         * Get an array of random pairs of random words, like array( array( 'foo', 'bar' ), array( 'quux', 'baz' ) );
         *
-        * @param $number Integer: number of pairs
-        * @return Array: of two-element arrays
+        * @param int $number Number of pairs
+        * @return array two-element arrays
         */
        private function getRandomWordPairs( $number ) {
                $lines = $this->getRandomLines( $number * 2 );
index d1c214a..080ff54 100644 (file)
@@ -315,22 +315,24 @@ class DummyContentHandlerForTesting extends ContentHandler {
        }
 
        /**
-        * Serializes Content object of the type supported by this ContentHandler.
+        * @see ContentHandler::serializeContent
         *
-        * @param Content $content the Content object to serialize
-        * @param null $format the desired serialization format
-        * @return String serialized form of the content
+        * @param Content $content
+        * @param string $format
+        *
+        * @return string
         */
        public function serializeContent( Content $content, $format = null ) {
                return $content->serialize();
        }
 
        /**
-        * Unserializes a Content object of the type supported by this ContentHandler.
+        * @see ContentHandler::unserializeContent
+        *
+        * @param string $blob
+        * @param string $format Unused.
         *
-        * @param $blob String serialized form of the content
-        * @param null $format the format used for serialization
-        * @return Content the Content object created by deserializing $blob
+        * @return Content
         */
        public function unserializeContent( $blob, $format = null ) {
                $d = unserialize( $blob );
@@ -437,7 +439,7 @@ class DummyContentForTesting extends AbstractContent {
 
        /**
         * @param Title $title
-        * @param null $revId
+        * @param int $revId Unused.
         * @param null|ParserOptions $options
         * @param boolean $generateHtml whether to generate Html (default: true). If false,
         *  the result of calling getText() on the ParserOutput object returned by
index 8359f0d..307b355 100644 (file)
@@ -5,7 +5,22 @@
  */
 class FormatJsonTest extends MediaWikiTestCase {
 
-       public function testEncoderPrettyPrinting() {
+       public static function provideEncoderPrettyPrinting() {
+               return array(
+                       // Four spaces
+                       array( true, '    ' ),
+                       array( '    ', '    ' ),
+                       // Two spaces
+                       array( '  ', '  ' ),
+                       // One tab
+                       array( "\t", "\t" ),
+               );
+       }
+
+       /**
+        * @dataProvider provideEncoderPrettyPrinting
+        */
+       public function testEncoderPrettyPrinting( $pretty, $expectedIndent ) {
                $obj = array(
                        'emptyObject' => new stdClass,
                        'emptyArray' => array(),
@@ -22,23 +37,24 @@ class FormatJsonTest extends MediaWikiTestCase {
                        ),
                );
 
-               // 4 space indent, no trailing whitespace, no trailing linefeed
+               // No trailing whitespace, no trailing linefeed
                $json = '{
-    "emptyObject": {},
-    "emptyArray": [],
-    "string": "foobar\\\\",
-    "filledArray": [
-        [
-            123,
-            456
-        ],
-        "\"7\":[\"8\",{\"9\":\"10\"}]",
-        "{\n\t\"emptyObject\": {\n\t},\n\t\"emptyArray\": [ ]\n}"
-    ]
+       "emptyObject": {},
+       "emptyArray": [],
+       "string": "foobar\\\\",
+       "filledArray": [
+               [
+                       123,
+                       456
+               ],
+               "\"7\":[\"8\",{\"9\":\"10\"}]",
+               "{\n\t\"emptyObject\": {\n\t},\n\t\"emptyArray\": [ ]\n}"
+       ]
 }';
 
                $json = str_replace( "\r", '', $json ); // Windows compat
-               $this->assertSame( $json, FormatJson::encode( $obj, true ) );
+               $json = str_replace( "\t", $expectedIndent, $json );
+               $this->assertSame( $json, FormatJson::encode( $obj, $pretty ) );
        }
 
        public static function provideEncodeDefault() {
diff --git a/tests/phpunit/includes/title/MediaWikiPageLinkRendererTest.php b/tests/phpunit/includes/title/MediaWikiPageLinkRendererTest.php
new file mode 100644 (file)
index 0000000..73d7ff9
--- /dev/null
@@ -0,0 +1,160 @@
+<?php
+/**
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @license GPL 2+
+ * @author Daniel Kinzler
+ */
+
+/**
+ * @covers MediaWikiPageLinkRenderer
+ *
+ * @group Title
+ */
+class MediaWikiPageLinkRendererTest extends MediaWikiTestCase {
+
+       /**
+        * Returns a mock GenderCache that will return "female" always.
+        *
+        * @return GenderCache
+        */
+       private function getGenderCache() {
+               $genderCache = $this->getMockBuilder( 'GenderCache' )
+                       ->disableOriginalConstructor()
+                       ->getMock();
+
+               $genderCache->expects( $this->any() )
+                       ->method( 'getGenderOf' )
+                       ->will( $this->returnValue( 'female' ) );
+
+               return $genderCache;
+       }
+
+       public function provideGetPageUrl() {
+               return array(
+                       array(
+                               new TitleValue( NS_MAIN, 'Foo_Bar' ),
+                               array(),
+                               '/Foo_Bar'
+                       ),
+                       array(
+                               new TitleValue( NS_USER, 'Hansi_Maier', 'stuff' ),
+                               array( 'foo' => 'bar' ),
+                               '/User:Hansi_Maier?foo=bar#stuff'
+                       ),
+               );
+       }
+
+       /**
+        * @dataProvider provideGetPageUrl
+        */
+       public function testGetPageUrl( TitleValue $title, $params, $url ) {
+               // NOTE: was of Feb 2014, MediaWikiPageLinkRenderer *ignores* the
+               // WikitextTitleFormatter we pass here, and relies on the Linker
+               // class for generating the link! This may break the test e.g.
+               // of Linker uses a different language for the namespace names.
+
+               $lang = Language::factory( 'en' );
+
+               $formatter = new MediaWikiTitleCodec( $lang, $this->getGenderCache() );
+               $renderer = new MediaWikiPageLinkRenderer( $formatter, '/' );
+               $actual = $renderer->getPageUrl( $title, $params );
+
+               $this->assertEquals( $url, $actual );
+       }
+
+       public function provideRenderHtmlLink() {
+               return array(
+                       array(
+                               new TitleValue( NS_MAIN, 'Foo_Bar' ),
+                               'Foo Bar',
+                               '!<a .*href=".*?Foo_Bar.*?".*?>Foo Bar</a>!'
+                       ),
+                       array(
+                               //NOTE: Linker doesn't include fragments in "broken" links
+                               //NOTE: once this no longer uses Linker, we will get "2" instead of "User" for the namespace.
+                               new TitleValue( NS_USER, 'Hansi_Maier', 'stuff' ),
+                               'Hansi Maier\'s Stuff',
+                               '!<a .*href=".*?User:Hansi_Maier.*?>Hansi Maier\'s Stuff</a>!'
+                       ),
+                       array(
+                               //NOTE: Linker doesn't include fragments in "broken" links
+                               //NOTE: once this no longer uses Linker, we will get "2" instead of "User" for the namespace.
+                               new TitleValue( NS_USER, 'Hansi_Maier', 'stuff' ),
+                               null,
+                               '!<a .*href=".*?User:Hansi_Maier.*?>User:Hansi Maier#stuff</a>!'
+                       ),
+               );
+       }
+
+       /**
+        * @dataProvider provideRenderHtmlLink
+        */
+       public function testRenderHtmlLink( TitleValue $title, $text, $pattern ) {
+               // NOTE: was of Feb 2014, MediaWikiPageLinkRenderer *ignores* the
+               // WikitextTitleFormatter we pass here, and relies on the Linker
+               // class for generating the link! This may break the test e.g.
+               // of Linker uses a different language for the namespace names.
+
+               $lang = Language::factory( 'en' );
+
+               $formatter = new MediaWikiTitleCodec( $lang, $this->getGenderCache() );
+               $renderer = new MediaWikiPageLinkRenderer( $formatter );
+               $actual = $renderer->renderHtmlLink( $title, $text );
+
+               $this->assertRegExp( $pattern, $actual );
+       }
+
+       public function provideRenderWikitextLink() {
+               return array(
+                       array(
+                               new TitleValue( NS_MAIN, 'Foo_Bar' ),
+                               'Foo Bar',
+                               '[[:0:Foo Bar|Foo Bar]]'
+                       ),
+                       array(
+                               new TitleValue( NS_USER, 'Hansi_Maier', 'stuff' ),
+                               'Hansi Maier\'s Stuff',
+                               '[[:2:Hansi Maier#stuff|Hansi Maier&#39;s Stuff]]'
+                       ),
+                       array(
+                               new TitleValue( NS_USER, 'Hansi_Maier', 'stuff' ),
+                               null,
+                               '[[:2:Hansi Maier#stuff|2:Hansi Maier#stuff]]'
+                       ),
+               );
+       }
+
+       /**
+        * @dataProvider provideRenderWikitextLink
+        */
+       public function testRenderWikitextLink( TitleValue $title, $text, $expected ) {
+               $formatter = $this->getMock( 'TitleFormatter' );
+               $formatter->expects( $this->any() )
+                       ->method( 'getFullText' )
+                       ->will( $this->returnCallback(
+                               function( TitleValue $title ) {
+                                       return str_replace( '_', ' ', "$title" );
+                               }
+                       ));
+
+               $renderer = new MediaWikiPageLinkRenderer( $formatter, '/' );
+               $actual = $renderer->renderWikitextLink( $title, $text );
+
+               $this->assertEquals( $expected, $actual );
+       }
+}
diff --git a/tests/phpunit/includes/title/MediaWikiTitleCodecTest.php b/tests/phpunit/includes/title/MediaWikiTitleCodecTest.php
new file mode 100644 (file)
index 0000000..e4f9396
--- /dev/null
@@ -0,0 +1,372 @@
+<?php
+/**
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @license GPL 2+
+ * @author Daniel Kinzler
+ */
+
+/**
+ * @covers MediaWikiTitleCodec
+ *
+ * @group Title
+ * @group Database
+ *        ^--- needed because of global state in
+ */
+class MediaWikiTitleCodecTest extends MediaWikiTestCase {
+
+       public function setUp() {
+               parent::setUp();
+
+               $this->setMwGlobals( array(
+                       'wgLanguageCode' => 'en',
+                       'wgContLang' => Language::factory( 'en' ),
+                       // User language
+                       'wgLang' => Language::factory( 'en' ),
+                       'wgAllowUserJs' => false,
+                       'wgDefaultLanguageVariant' => false,
+                       'wgLocalInterwikis' => array( 'localtestiw' ),
+
+                       // NOTE: this is why global state is evil.
+                       // TODO: refactor access to the interwiki codes so it can be injected.
+                       'wgHooks' => array(
+                               'InterwikiLoadPrefix' => array(
+                                       function ( $prefix, &$data ) {
+                                               if ( $prefix === 'localtestiw' ) {
+                                                       $data = array( 'iw_url' => 'localtestiw' );
+                                               } elseif ( $prefix === 'remotetestiw' ) {
+                                                       $data = array( 'iw_url' => 'remotetestiw' );
+                                               }
+                                               return false;
+                                       }
+                               )
+                       )
+               ) );
+       }
+
+       /**
+        * Returns a mock GenderCache that will consider a user "female" if the
+        * first part of the user name ends with "a".
+        *
+        * @return GenderCache
+        */
+       private function getGenderCache() {
+               $genderCache = $this->getMockBuilder( 'GenderCache' )
+                       ->disableOriginalConstructor()
+                       ->getMock();
+
+               $genderCache->expects( $this->any() )
+                       ->method( 'getGenderOf' )
+                       ->will( $this->returnCallback( function( $userName ) {
+                               return preg_match( '/^[^- _]+a( |_|$)/u', $userName ) ? 'female' : 'male';
+                       } ) );
+
+               return $genderCache;
+       }
+
+       protected function makeCodec( $lang ) {
+               $gender = $this->getGenderCache();
+               $lang = Language::factory( $lang );
+               return new MediaWikiTitleCodec( $lang, $gender );
+       }
+
+       public function provideFormat() {
+               return array(
+                       array( NS_MAIN, 'Foo_Bar', '', 'en', 'Foo Bar' ),
+                       array( NS_USER, 'Hansi_Maier', 'stuff_and_so_on', 'en', 'User:Hansi Maier#stuff and so on' ),
+                       array( false, 'Hansi_Maier', '', 'en', 'Hansi Maier' ),
+                       array( NS_USER_TALK, 'hansi__maier', '', 'en', 'User talk:hansi  maier', 'User talk:Hansi maier' ),
+
+                       // getGenderCache() provides a mock that considers first
+                       // names ending in "a" to be female.
+                       array( NS_USER, 'Lisa_Müller', '', 'de', 'Benutzerin:Lisa Müller' ),
+               );
+       }
+
+       /**
+        * @dataProvider provideFormat
+        */
+       public function testFormat( $namespace, $text, $fragment, $lang, $expected, $normalized = null ) {
+               if ( $normalized === null ) {
+                       $normalized = $expected;
+               }
+
+               $codec = $this->makeCodec( $lang );
+               $actual = $codec->formatTitle( $namespace, $text, $fragment );
+
+               $this->assertEquals( $expected, $actual, 'formatted' );
+
+               // test round trip
+               $parsed = $codec->parseTitle( $actual, NS_MAIN );
+               $actual2 = $codec->formatTitle( $parsed->getNamespace(), $parsed->getText(), $parsed->getFragment() );
+
+               $this->assertEquals( $normalized, $actual2, 'normalized after round trip' );
+       }
+
+       public function provideGetText() {
+               return array(
+                       array( NS_MAIN, 'Foo_Bar', '', 'en', 'Foo Bar' ),
+                       array( NS_USER, 'Hansi_Maier', 'stuff_and_so_on', 'en', 'Hansi Maier' ),
+               );
+       }
+
+       /**
+        * @dataProvider provideGetText
+        */
+       public function testGetText( $namespace, $dbkey, $fragment, $lang, $expected ) {
+               $codec = $this->makeCodec( $lang );
+               $title = new TitleValue( $namespace, $dbkey, $fragment );
+
+               $actual = $codec->getText( $title );
+
+               $this->assertEquals( $expected, $actual );
+       }
+
+       public function provideGetPrefixedText() {
+               return array(
+                       array( NS_MAIN, 'Foo_Bar', '', 'en', 'Foo Bar' ),
+                       array( NS_USER, 'Hansi_Maier', 'stuff_and_so_on', 'en', 'User:Hansi Maier' ),
+
+                       // No capitalization or normalization is applied while formatting!
+                       array( NS_USER_TALK, 'hansi__maier', '', 'en', 'User talk:hansi  maier' ),
+
+                       // getGenderCache() provides a mock that considers first
+                       // names ending in "a" to be female.
+                       array( NS_USER, 'Lisa_Müller', '', 'de', 'Benutzerin:Lisa Müller' ),
+               );
+       }
+
+       /**
+        * @dataProvider provideGetPrefixedText
+        */
+       public function testGetPrefixedText( $namespace, $dbkey, $fragment, $lang, $expected ) {
+               $codec = $this->makeCodec( $lang );
+               $title = new TitleValue( $namespace, $dbkey, $fragment );
+
+               $actual = $codec->getPrefixedText( $title );
+
+               $this->assertEquals( $expected, $actual );
+       }
+
+       public function provideGetFullText() {
+               return array(
+                       array( NS_MAIN, 'Foo_Bar', '', 'en', 'Foo Bar' ),
+                       array( NS_USER, 'Hansi_Maier', 'stuff_and_so_on', 'en', 'User:Hansi Maier#stuff and so on' ),
+
+                       // No capitalization or normalization is applied while formatting!
+                       array( NS_USER_TALK, 'hansi__maier', '', 'en', 'User talk:hansi  maier' ),
+               );
+       }
+
+       /**
+        * @dataProvider provideGetFullText
+        */
+       public function testGetFullText( $namespace, $dbkey, $fragment, $lang, $expected ) {
+               $codec = $this->makeCodec( $lang );
+               $title = new TitleValue( $namespace, $dbkey, $fragment );
+
+               $actual = $codec->getFullText( $title );
+
+               $this->assertEquals( $expected, $actual );
+       }
+
+       public function provideParseTitle() {
+               //TODO: test capitalization and trimming
+               //TODO: test unicode normalization
+
+               return array(
+                       array( '  : Hansi_Maier _ ', NS_MAIN, 'en',
+                               new TitleValue( NS_MAIN, 'Hansi_Maier', '' ) ),
+                       array( 'User:::1', NS_MAIN, 'de',
+                               new TitleValue( NS_USER, '0:0:0:0:0:0:0:1', '' ) ),
+                       array( ' lisa Müller', NS_USER, 'de',
+                               new TitleValue( NS_USER, 'Lisa_Müller', '' ) ),
+                       array( 'benutzerin:lisa Müller#stuff', NS_MAIN, 'de',
+                               new TitleValue( NS_USER, 'Lisa_Müller', 'stuff' ) ),
+
+                       array( ':Category:Quux', NS_MAIN, 'en',
+                               new TitleValue( NS_CATEGORY, 'Quux', '' ) ),
+                       array( 'Category:Quux', NS_MAIN, 'en',
+                               new TitleValue( NS_CATEGORY, 'Quux', '' ) ),
+                       array( 'Category:Quux', NS_CATEGORY, 'en',
+                               new TitleValue( NS_CATEGORY, 'Quux', '' ) ),
+                       array( 'Quux', NS_CATEGORY, 'en',
+                               new TitleValue( NS_CATEGORY, 'Quux', '' ) ),
+                       array( ':Quux', NS_CATEGORY, 'en',
+                               new TitleValue( NS_MAIN, 'Quux', '' ) ),
+
+                       // getGenderCache() provides a mock that considers first
+                       // names ending in "a" to be female.
+
+                       array( 'a b c', NS_MAIN, 'en',
+                               new TitleValue( NS_MAIN, 'A_b_c' ) ),
+                       array( ' a  b  c ', NS_MAIN, 'en',
+                               new TitleValue( NS_MAIN, 'A_b_c' ) ),
+                       array( ' _ Foo __ Bar_ _', NS_MAIN, 'en',
+                               new TitleValue( NS_MAIN, 'Foo_Bar' ) ),
+
+                       //NOTE: cases copied from TitleTest::testSecureAndSplit. Keep in sync.
+                       array( 'Sandbox', NS_MAIN, 'en', ),
+                       array( 'A "B"', NS_MAIN, 'en', ),
+                       array( 'A \'B\'', NS_MAIN, 'en', ),
+                       array( '.com', NS_MAIN, 'en', ),
+                       array( '~', NS_MAIN, 'en', ),
+                       array( '"', NS_MAIN, 'en', ),
+                       array( '\'', NS_MAIN, 'en', ),
+
+                       array( 'Talk:Sandbox', NS_MAIN, 'en',
+                               new TitleValue( NS_TALK, 'Sandbox' ) ),
+                       array( 'Talk:Foo:Sandbox', NS_MAIN, 'en',
+                               new TitleValue( NS_TALK, 'Foo:Sandbox' ) ),
+                       array( 'File:Example.svg', NS_MAIN, 'en',
+                               new TitleValue( NS_FILE, 'Example.svg' ) ),
+                       array( 'File_talk:Example.svg', NS_MAIN, 'en',
+                               new TitleValue( NS_FILE_TALK, 'Example.svg' ) ),
+                       array( 'Foo/.../Sandbox', NS_MAIN, 'en',
+                               'Foo/.../Sandbox' ),
+                       array( 'Sandbox/...', NS_MAIN, 'en',
+                               'Sandbox/...' ),
+                       array( 'A~~', NS_MAIN, 'en',
+                               'A~~' ),
+                       // Length is 256 total, but only title part matters
+                       array( 'Category:' . str_repeat( 'x', 248 ), NS_MAIN, 'en',
+                               new TitleValue( NS_CATEGORY,
+                                       'X' . str_repeat( 'x', 247 ) ) ),
+                       array( str_repeat( 'x', 252 ), NS_MAIN, 'en',
+                               'X' . str_repeat( 'x', 251 ) )
+               );
+       }
+
+       /**
+        * @dataProvider provideParseTitle
+        */
+       public function testParseTitle( $text, $ns, $lang, $title = null ) {
+               if ( $title === null ) {
+                       $title = str_replace( ' ', '_', trim( $text ) );
+               }
+
+               if ( is_string( $title ) ) {
+                       $title = new TitleValue( NS_MAIN, $title, '' );
+               }
+
+               $codec = $this->makeCodec( $lang );
+               $actual = $codec->parseTitle( $text, $ns );
+
+               $this->assertEquals( $title, $actual );
+       }
+
+       public function provideParseTitle_invalid() {
+               //TODO: test unicode errors
+
+               return array(
+                       array( '#' ),
+                       array( '::' ),
+                       array( '::xx' ),
+                       array( '::##' ),
+                       array( ' :: x' ),
+
+                       array( 'Talk:File:Foo.jpg' ),
+                       array( 'Talk:localtestiw:Foo' ),
+                       array( 'remotetestiw:Foo' ),
+                       array( '::1' ), // only valid in user namespace
+                       array( 'User::x' ), // leading ":" in a user name is only valid of IPv6 addresses
+
+                       //NOTE: cases copied from TitleTest::testSecureAndSplit. Keep in sync.
+                       array( '' ),
+                       array( ':' ),
+                       array( '__  __' ),
+                       array( '  __  ' ),
+                       // Bad characters forbidden regardless of wgLegalTitleChars
+                       array( 'A [ B' ),
+                       array( 'A ] B' ),
+                       array( 'A { B' ),
+                       array( 'A } B' ),
+                       array( 'A < B' ),
+                       array( 'A > B' ),
+                       array( 'A | B' ),
+                       // URL encoding
+                       array( 'A%20B' ),
+                       array( 'A%23B' ),
+                       array( 'A%2523B' ),
+                       // XML/HTML character entity references
+                       // Note: Commented out because they are not marked invalid by the PHP test as
+                       // Title::newFromText runs Sanitizer::decodeCharReferencesAndNormalize first.
+                       //array( 'A &eacute; B' ),
+                       //array( 'A &#233; B' ),
+                       //array( 'A &#x00E9; B' ),
+                       // Subject of NS_TALK does not roundtrip to NS_MAIN
+                       array( 'Talk:File:Example.svg' ),
+                       // Directory navigation
+                       array( '.' ),
+                       array( '..' ),
+                       array( './Sandbox' ),
+                       array( '../Sandbox' ),
+                       array( 'Foo/./Sandbox' ),
+                       array( 'Foo/../Sandbox' ),
+                       array( 'Sandbox/.' ),
+                       array( 'Sandbox/..' ),
+                       // Tilde
+                       array( 'A ~~~ Name' ),
+                       array( 'A ~~~~ Signature' ),
+                       array( 'A ~~~~~ Timestamp' ),
+                       array( str_repeat( 'x', 256 ) ),
+                       // Namespace prefix without actual title
+                       array( 'Talk:' ),
+                       array( 'Category: ' ),
+                       array( 'Category: #bar' )
+               );
+       }
+
+       /**
+        * @dataProvider provideParseTitle_invalid
+        */
+       public function testParseTitle_invalid( $text ) {
+               $this->setExpectedException( 'MalformedTitleException' );
+
+               $codec = $this->makeCodec( 'en' );
+               $codec->parseTitle( $text, NS_MAIN );
+       }
+
+       public function provideGetNamespaceName() {
+               return array(
+                       array( NS_MAIN, 'Foo', 'en', '' ),
+                       array( NS_USER, 'Foo', 'en', 'User' ),
+                       array( NS_USER, 'Hansi Maier', 'de', 'Benutzer' ),
+
+                       // getGenderCache() provides a mock that considers first
+                       // names ending in "a" to be female.
+                       array( NS_USER, 'Lisa Müller', 'de', 'Benutzerin' ),
+               );
+       }
+
+       /**
+        * @dataProvider provideGetNamespaceName
+        *
+        * @param $namespace
+        * @param $text
+        * @param $lang
+        * @param $expected
+        *
+        * @internal param \TitleValue $title
+        */
+       public function testGetNamespaceName( $namespace, $text, $lang, $expected ) {
+               $codec = $this->makeCodec( $lang );
+               $name = $codec->getNamespaceName( $namespace, $text );
+
+               $this->assertEquals( $expected, $name );
+       }
+}
diff --git a/tests/phpunit/includes/title/TitleValueTest.php b/tests/phpunit/includes/title/TitleValueTest.php
new file mode 100644 (file)
index 0000000..3ba008d
--- /dev/null
@@ -0,0 +1,100 @@
+<?php
+/**
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @license GPL 2+
+ * @author Daniel Kinzler
+ */
+
+/**
+ * @covers TitleValue
+ *
+ * @group Title
+ */
+class TitleValueTest extends MediaWikiTestCase {
+
+       public function testConstruction() {
+               $title = new TitleValue( NS_USER, 'TestThis', 'stuff' );
+
+               $this->assertEquals( NS_USER, $title->getNamespace() );
+               $this->assertEquals( 'TestThis', $title->getText() );
+               $this->assertEquals( 'stuff', $title->getFragment() );
+       }
+
+       public function badConstructorProvider() {
+               return array(
+                       array( 'foo', 'title', 'fragment' ),
+                       array( null, 'title', 'fragment' ),
+                       array( 2.3, 'title', 'fragment' ),
+
+                       array( NS_MAIN, 5, 'fragment' ),
+                       array( NS_MAIN, null, 'fragment' ),
+                       array( NS_MAIN, '', 'fragment' ),
+                       array( NS_MAIN, 'foo bar', '' ),
+                       array( NS_MAIN, 'bar_', '' ),
+                       array( NS_MAIN, '_foo', '' ),
+                       array( NS_MAIN, ' eek ', '' ),
+
+                       array( NS_MAIN, 'title', 5 ),
+                       array( NS_MAIN, 'title', null ),
+                       array( NS_MAIN, 'title', array() ),
+               );
+       }
+
+       /**
+        * @dataProvider badConstructorProvider
+        */
+       public function testConstructionErrors( $ns, $text, $fragment ) {
+               $this->setExpectedException( 'InvalidArgumentException' );
+               new TitleValue( $ns, $text, $fragment );
+       }
+
+       public function fragmentTitleProvider() {
+               return array(
+                       array( new TitleValue( NS_MAIN, 'Test' ), 'foo' ),
+                       array( new TitleValue( NS_TALK, 'Test', 'foo' ), '' ),
+                       array( new TitleValue( NS_CATEGORY, 'Test', 'foo' ), 'bar' ),
+               );
+       }
+
+       /**
+        * @dataProvider fragmentTitleProvider
+        */
+       public function testCreateFragmentTitle( TitleValue $title, $fragment ) {
+               $fragmentTitle = $title->createFragmentTitle( $fragment );
+
+               $this->assertEquals( $title->getNamespace(), $fragmentTitle->getNamespace() );
+               $this->assertEquals( $title->getText(), $fragmentTitle->getText() );
+               $this->assertEquals( $fragment, $fragmentTitle->getFragment() );
+       }
+
+       public function getTextProvider() {
+               return array(
+                       array( 'Foo', 'Foo' ),
+                       array( 'Foo_Bar', 'Foo Bar' ),
+               );
+       }
+
+       /**
+        * @dataProvider getTextProvider
+        */
+       public function testGetText( $dbkey, $text ) {
+               $title = new TitleValue( NS_MAIN, $dbkey );
+
+               $this->assertEquals( $text, $title->getText() );
+       }
+}
index 1eab5a3..50fa384 100644 (file)
@@ -2,6 +2,12 @@
 
 class UIDGeneratorTest extends MediaWikiTestCase {
 
+       protected function tearDown() {
+               // Bug: 44850
+               UIDGenerator::unitTestTearDown();
+               parent::tearDown();
+       }
+
        /**
         * @dataProvider provider_testTimestampedUID
         * @covers UIDGenerator::newTimestampedUID128
index 1aa2b4d..8e2bc03 100755 (executable)
@@ -114,4 +114,15 @@ if ( PHPUnit_Runner_Version::id() !== '@package_version@'
 if ( !class_exists( 'PHPUnit_TextUI_Command' ) ) {
        require_once 'PHPUnit/Autoload.php';
 }
+
+// Prevent segfault when we have lots of unit tests (bug 62623)
+if ( version_compare( PHP_VERSION, '5.4.0', '<' )
+       && version_compare( PHP_VERSION, '5.3.0', '>=' )
+) {
+       register_shutdown_function( function() {
+               gc_collect_cycles();
+               gc_disable();
+       } );
+}
+
 MediaWikiPHPUnitCommand::main();
index cce1b7e..cfcc771 100644 (file)
@@ -34,6 +34,21 @@ class ResourcesTest extends MediaWikiTestCase {
                $this->assertTrue( strpos( $cssText, '@media' ) === false, 'Stylesheets should not both specify "media" and contain @media' );
        }
 
+       public function testDependencies() {
+               $data = self::getAllModules();
+               $illegalDeps = array( 'jquery', 'mediawiki' );
+
+               foreach ( $data['modules'] as $moduleName => $module ) {
+                       foreach ( $illegalDeps as $illegalDep ) {
+                               $this->assertNotContains(
+                                       $illegalDep,
+                                       $module->getDependencies(),
+                                       "Module '$moduleName' must not depend on '$illegalDep'"
+                               );
+                       }
+               }
+       }
+
        /**
         * Get all registered modules from ResouceLoader.
         */
index 31470e8..a0fb918 100644 (file)
@@ -8,14 +8,14 @@ return array(
 
        'test.sinonjs' => array(
                'scripts' => array(
-                       'resources/sinonjs/sinon-1.9.0.js',
+                       'resources/lib/sinonjs/sinon-1.9.0.js',
                        // We want tests to work in IE, but can't include this as it
                        // will break the placeholders in Sinon because the hack it uses
                        // to hijack IE globals relies on running in the global scope
                        // and in ResourceLoader this won't be running in the global scope.
                        // Including it results (among other things) in sandboxed timers
                        // being broken due to Date inheritance being undefined.
-                       // 'resources/sinonjs/sinon-ie-1.9.0.js',
+                       // 'resources/lib/sinonjs/sinon-ie-1.9.0.js',
                ),
                'targets' => array( 'desktop', 'mobile' ),
        ),
@@ -83,7 +83,6 @@ return array(
                        'jquery.client',
                        'jquery.color',
                        'jquery.colorUtil',
-                       'jquery.delayedBind',
                        'jquery.getAttrs',
                        'jquery.hidpi',
                        'jquery.highlightText',
@@ -94,7 +93,6 @@ return array(
                        'jquery.tabIndex',
                        'jquery.tablesorter',
                        'jquery.textSelection',
-                       'mediawiki',
                        'mediawiki.api',
                        'mediawiki.api.parse',
                        'mediawiki.api.watch',
index 73ae0e6..ab9aab1 100644 (file)
@@ -5,7 +5,6 @@
 
        var mwTestIgnore, mwTester,
                addons,
-               envExecCount,
                ELEMENT_NODE = 1,
                TEXT_NODE = 3;
 
         * </code>
         */
        QUnit.newMwEnvironment = ( function () {
-               var log, liveConfig, liveMessages;
+               var warn, log, liveConfig, liveMessages;
 
                liveConfig = mw.config.values;
                liveMessages = mw.messages.values;
 
+               function suppressWarnings() {
+                       warn = mw.log.warn;
+                       mw.log.warn = $.noop;
+               }
+
+               function restoreWarnings() {
+                       if ( warn !== undefined ) {
+                               mw.log.warn = warn;
+                               warn = undefined;
+                       }
+               }
+
                function freshConfigCopy( custom ) {
-                       var copy, warn;
+                       var copy;
                        // Tests should mock all factors that directly influence the tested code.
                        // For backwards compatibility though we set mw.config to a fresh copy of the live
                        // config. This way any modifications made to mw.config during the test will not
                        // affect other tests, nor the global scope outside the test runner.
                        // This is a shallow copy, since overriding an array or object value via "custom"
                        // should replace it. Setting a config property means you override it, not extend it.
-                       // NOTE: It is important that we temporarily disable mw.log#warn as extend() will
-                       // trigger MWDeprecationWarning for each of the deprecated properties.
-                       warn = mw.log.warn;
-                       mw.log.warn = $.noop;
-
+                       // NOTE: It is important that we suppress warnings because extend() will also access
+                       // deprecated properties and trigger deprecation warnings from mw.log#deprecate.
+                       suppressWarnings();
                        copy = $.extend( {}, liveConfig, custom );
-
-                       mw.log.warn = warn;
+                       restoreWarnings();
 
                        return copy;
                }
                                        // Greetings, mock environment!
                                        mw.config.values = freshConfigCopy( localEnv.config );
                                        mw.messages.values = freshMessagesCopy( localEnv.messages );
+                                       this.suppressWarnings = suppressWarnings;
+                                       this.restoreWarnings = restoreWarnings;
 
                                        localEnv.setup.call( this );
                                },
                                        // Farewell, mock environment!
                                        mw.config.values = liveConfig;
                                        mw.messages.values = liveMessages;
+
+                                       // As a convenience feature, automatically restore warnings if they're
+                                       // still suppressed by the end of the test.
+                                       restoreWarnings();
                                }
                        };
                };
         * Small test suite to confirm proper functionality of the utilities and
         * initializations defined above in this file.
         */
-       envExecCount = 0;
        QUnit.module( 'test.mediawiki.qunit.testrunner', QUnit.newMwEnvironment( {
                setup: function () {
-                       envExecCount += 1;
                        this.mwHtmlLive = mw.html;
                        mw.html = {
                                escape: function () {
-                                       return 'mocked-' + envExecCount;
+                                       return 'mocked';
                                }
                        };
                },
        } ) );
 
        QUnit.test( 'Setup', 3, function ( assert ) {
-               assert.equal( mw.html.escape( 'foo' ), 'mocked-1', 'extra setup() callback was ran.' );
+               assert.equal( mw.html.escape( 'foo' ), 'mocked', 'setup() callback was ran.' );
                assert.equal( mw.config.get( 'testVar' ), 'foo', 'config object applied' );
                assert.equal( mw.messages.get( 'testMsg' ), 'Foo.', 'messages object applied' );
 
                mw.messages.set( 'testMsg', 'Bar.' );
        } );
 
-       QUnit.test( 'Teardown', 3, function ( assert ) {
-               assert.equal( mw.html.escape( 'foo' ), 'mocked-2', 'extra setup() callback was re-ran.' );
+       QUnit.test( 'Teardown', 2, function ( assert ) {
                assert.equal( mw.config.get( 'testVar' ), 'foo', 'config object restored and re-applied after test()' );
                assert.equal( mw.messages.get( 'testMsg' ), 'Foo.', 'messages object restored and re-applied after test()' );
        } );
        QUnit.module( 'test.mediawiki.qunit.testrunner-after', QUnit.newMwEnvironment() );
 
        QUnit.test( 'Teardown', 3, function ( assert ) {
-               assert.equal( mw.html.escape( '<' ), '&lt;', 'extra teardown() callback was ran.' );
+               assert.equal( mw.html.escape( '<' ), '&lt;', 'teardown() callback was ran.' );
                assert.equal( mw.config.get( 'testVar' ), null, 'config object restored to live in next module()' );
                assert.equal( mw.messages.get( 'testMsg' ), null, 'messages object restored to live in next module()' );
        } );
index 3be3642..4ee8afa 100644 (file)
                } );
        } );
 
+       QUnit.test( 'FormData support', function ( assert ) {
+               QUnit.expect( 2 );
+
+               var api = new mw.Api();
+
+               api.post( { action: 'test' }, { contentType: 'multipart/form-data' } );
+
+               this.server.respond( function ( request ) {
+                       if ( window.FormData ) {
+                               assert.ok( !request.url.match( /action=/), 'Request has no query string' );
+                               assert.ok( request.requestBody instanceof FormData, 'Request uses FormData body' );
+                       } else {
+                               assert.ok( !request.url.match( /action=test/), 'Request has no query string' );
+                               assert.equal( request.requestBody, 'action=test&format=json', 'Request uses query string body' );
+                       }
+                       request.respond( 200, { 'Content-Type': 'application/json' }, '[]' );
+               } );
+       } );
+
        QUnit.test( 'Deprecated callback methods', function ( assert ) {
                QUnit.expect( 3 );
 
                var api = new mw.Api();
 
+               this.suppressWarnings();
+
                api.get( {}, function () {
                        assert.ok( true, 'Function argument treated as success callback.' );
                } );
@@ -67,6 +88,8 @@
                        }
                } );
 
+               this.restoreWarnings();
+
                this.server.respondWith( /action=query/, function ( request ) {
                        request.respond( 200, { 'Content-Type': 'application/json' }, '[]' );
                } );
                this.server.respond();
        } );
 
+       QUnit.test( 'getToken( cached )', function ( assert ) {
+               QUnit.expect( 2 );
+
+               var api = new mw.Api();
+
+               // Get editToken for local wiki, this should not make
+               // a request as it should be retrieved from user.tokens.
+               api.getToken( 'edit' )
+                       .done( function ( token ) {
+                               assert.ok( token.length, 'Got a token' );
+                       } )
+                       .fail( function ( err ) {
+                               assert.equal( '', err, 'API error' );
+                       } );
+
+               assert.equal( this.server.requests.length, 0, 'Requests made' );
+       } );
+
+       QUnit.test( 'getToken( uncached )', function ( assert ) {
+               QUnit.expect( 2 );
+
+               var api = new mw.Api();
+
+               // Get a token of a type that isn't prepopulated by user.tokens.
+               // Could use "block" or "delete" here, but those could in theory
+               // be added to user.tokens, use a fake one instead.
+               api.getToken( 'testaction' )
+                       .done( function ( token ) {
+                               assert.ok( token.length, 'Got a token' );
+                       } )
+                       .fail( function ( err ) {
+                               assert.equal( '', err, 'API error' );
+                       } );
+
+               assert.equal( this.server.requests.length, 1, 'Requests made' );
+
+               this.server.respond( function ( request ) {
+                       request.respond( 200, { 'Content-Type': 'application/json' },
+                               '{ "tokens": { "testactiontoken": "0123abc" } }'
+                       );
+               } );
+       } );
+
 }( mediaWiki ) );
index f49be49..f5fd16d 100644 (file)
@@ -1,3 +1,4 @@
+/*jshint -W024 */
 ( function ( mw, $ ) {
        // mw.Title relies on these three config vars
        // Restore them after each test run
index b6a8a46..7a58d38 100644 (file)
@@ -1,3 +1,4 @@
+/*jshint -W024 */
 ( function ( mw, $ ) {
        QUnit.module( 'mediawiki.Uri', QUnit.newMwEnvironment( {
                setup: function () {
index a2ad50d..995c1ed 100644 (file)
 
                // Pipe trick is not supported currently, but should not parse as text either.
                mw.messages.set( 'pipe-trick', '[[Tampa, Florida|]]' );
+               this.suppressWarnings();
                assert.equal(
                        formatParse( 'pipe-trick' ),
-                       'pipe-trick: Parse error at position 0 in input: [[Tampa, Florida|]]',
-                       'Pipe trick should return error string.'
+                       '[[Tampa, Florida|]]',
+                       'Pipe trick should not be parsed.'
                );
+               this.restoreWarnings();
 
                expectedMultipleBars = '<a title="Main Page" href="/wiki/Main_Page">Main|Page</a>';
                mw.messages.set( 'multiple-bars', '[[Main Page|Main|Page]]' );
@@ -734,4 +736,25 @@ QUnit.test( 'HTML', 26, function ( assert ) {
        );
 } );
 
+       QUnit.test( 'Behavior in case of invalid wikitext', 3, function ( assert ) {
+               mw.messages.set( 'invalid-wikitext', '<b>{{FAIL}}</b>' );
+
+               this.suppressWarnings();
+               var logSpy = this.sandbox.spy( mw.log, 'warn' );
+
+               assert.equal(
+                       formatParse( 'invalid-wikitext' ),
+                       '&lt;b&gt;{{FAIL}}&lt;/b&gt;',
+                       'Invalid wikitext: \'parse\' format'
+               );
+
+               assert.equal(
+                       formatText( 'invalid-wikitext' ),
+                       '<b>{{FAIL}}</b>',
+                       'Invalid wikitext: \'text\' format'
+               );
+
+               assert.equal( logSpy.callCount, 2, 'mw.log.warn calls' );
+       } );
+
 }( mediaWiki, jQuery ) );
index f5091f9..a9b2f33 100644 (file)
@@ -1,3 +1,4 @@
+/*jshint -W024 */
 ( function ( mw, $ ) {
        var specialCharactersPageName;
 
 
        QUnit.test( 'Initial check', 8, function ( assert ) {
                assert.ok( window.jQuery, 'jQuery defined' );
-               assert.ok( window.$, '$j defined' );
-               assert.ok( window.$j, '$j defined' );
+               assert.ok( window.$, '$ defined' );
                assert.strictEqual( window.$, window.jQuery, '$ alias to jQuery' );
+
+               this.suppressWarnings();
+               assert.ok( window.$j, '$j defined' );
                assert.strictEqual( window.$j, window.jQuery, '$j alias to jQuery' );
+               this.restoreWarnings();
 
                assert.ok( window.mediaWiki, 'mediaWiki defined' );
                assert.ok( window.mw, 'mw defined' );
 
        } );
 
-       QUnit.test( 'mw.hook', 10, function ( assert ) {
+       QUnit.test( 'mw.hook', 13, function ( assert ) {
                var hook, add, fire, chars, callback;
 
                mw.hook( 'test.hook.unfired' ).add( function () {
                } );
                mw.hook( 'test.hook.basic' ).fire();
 
+               mw.hook( 'hasOwnProperty' ).add( function () {
+                       assert.ok( true, 'hook with name of predefined method' );
+               } );
+               mw.hook( 'hasOwnProperty' ).fire();
+
                mw.hook( 'test.hook.data' ).add( function ( data1, data2 ) {
                        assert.equal( data1, 'example', 'Fire with data (string param)' );
                        assert.deepEqual( data2, ['two'], 'Fire with data (array param)' );
                } );
                mw.hook( 'test.hook.data' ).fire( 'example', ['two'] );
 
-               mw.hook( 'test.hook.chainable' ).add( function () {
-                       assert.ok( true, 'Chainable' );
-               } ).fire();
+               hook = mw.hook( 'test.hook.chainable' );
+               assert.strictEqual( hook.add(), hook, 'hook.add is chainable' );
+               assert.strictEqual( hook.remove(), hook, 'hook.remove is chainable' );
+               assert.strictEqual( hook.fire(), hook, 'hook.fire is chainable' );
 
                hook = mw.hook( 'test.hook.detach' );
                add = hook.add;
index 8fd789a..4e26bdc 100644 (file)
@@ -73,7 +73,7 @@
                        'Mozilla/5.0 (Series40; NokiaX3-02/05.60; Profile/MIDP-2.1 Configuration/CLDC-1.1) Gecko/20100401 S40OviBrowser/3.2.0.0.6',
                        'Mozilla/5.0 (Series40; Nokia305/05.92; Profile/MIDP-2.1 Configuration/CLDC-1.1) Gecko/20100401 S40OviBrowser/3.7.0.0.11',
                        // Google Glass
-                       'Mozilla/5.0 (Linux; U; Android 4.0.4; en-us; Glass 1 Build/IMM76L; XE11) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30',
+                       'Mozilla/5.0 (Linux; U; Android 4.0.4; en-us; Glass 1 Build/IMM76L; XE11) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30'
                ],
                // No explicit support for or against these browsers, they're
                // given a shot at Grade A at their own risk.
index b0d9f10..3f8e0d3 100644 (file)
--- a/thumb.php
+++ b/thumb.php
@@ -88,7 +88,7 @@ function wfThumbHandle404() {
 /**
  * Stream a thumbnail specified by parameters
  *
- * @param $params Array List of thumbnailing parameters. In addition to parameters
+ * @param array $params List of thumbnailing parameters. In addition to parameters
  *  passed to the MediaHandler, this may also includes the keys:
  *   f (for filename), archived (if archived file), temp (if temp file),
  *   w (alias for width), p (alias for page), r (ignored; historical),
@@ -400,8 +400,8 @@ function wfThumbAttemptKey( File $img, $thumbName ) {
  *
  * Transform specific parameters are set later via wfExtractThumbParams().
  *
- * @param $thumbRel String Thumbnail path relative to the thumb zone
- * @return Array|null associative params array or null
+ * @param string $thumbRel Thumbnail path relative to the thumb zone
+ * @return array|null Associative params array or null
  */
 function wfExtractThumbRequestInfo( $thumbRel ) {
        $repo = RepoGroup::singleton()->getLocalRepo();
@@ -437,9 +437,9 @@ function wfExtractThumbRequestInfo( $thumbRel ) {
  * Convert a thumbnail name (122px-foo.png) to parameters, using
  * file handler.
  *
- * @param File $file File object for file in question.
- * @param $param Array Array of parameters so far.
- * @return Array parameters array with more parameters.
+ * @param File $file File object for file in question
+ * @param array $param Array of parameters so far
+ * @return array Parameters array with more parameters
  */
 function wfExtractThumbParams( $file, $params ) {
        if ( !isset( $params['thumbName'] ) ) {
@@ -495,8 +495,8 @@ function wfExtractThumbParams( $file, $params ) {
 /**
  * Output a thumbnail generation error message
  *
- * @param $status integer
- * @param $msg string
+ * @param int $status
+ * @param string $msg
  * @return void
  */
 function wfThumbError( $status, $msg ) {